@danielgindi/selectbox 1.0.38 → 1.0.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["lib/utils/escapeRegex.js","lib/DropList.js","lib/utils/throttle.js","lib/SelectBox.js"],"sourcesContent":["export default value => value.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\r\n","import escapeRegex from './utils/escapeRegex';\r\nimport {\r\n closestUntil,\r\n createElement,\r\n} from '@danielgindi/dom-utils/lib/Dom';\r\nimport {\r\n remove,\r\n toggleClass,\r\n} from '@danielgindi/dom-utils/lib/DomCompat';\r\nimport {\r\n setCssProps,\r\n getElementHeight,\r\n getElementWidth,\r\n setElementHeight,\r\n setElementWidth, getElementOffset, anchoredPosition,\r\n parseTransition,\r\n} from '@danielgindi/dom-utils/lib/Css';\r\nimport DomEventsSink from '@danielgindi/dom-utils/lib/DomEventsSink';\r\nimport VirtualListHelper from '@danielgindi/virtual-list-helper';\r\nimport {\r\n VALUE_DOWN,\r\n VALUE_END,\r\n VALUE_ENTER, VALUE_ESCAPE,\r\n VALUE_HOME,\r\n VALUE_PAGE_DOWN,\r\n VALUE_PAGE_UP,\r\n VALUE_SPACE,\r\n VALUE_UP,\r\n} from 'keycode-js';\r\nimport mitt from 'mitt';\r\n\r\nconst ItemSymbol = Symbol('item');\r\nconst DestroyedSymbol = Symbol('destroyed');\r\nconst GhostSymbol = Symbol('ghost');\r\n\r\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\r\n\r\n/**\r\n * @typedef {Object} DropList.Options\r\n * @property {Element} [el] An element to attach to, instead of creating a new one\r\n * @property {string} [baseClassName='droplist'] class name for the menu root element\r\n * @property {string|string[]} [additionalClasses]\r\n * @property {number} [itemBlurDelay=300] How long to wait before deciding to blur the focused item?\r\n * @property {boolean} [capturesFocus=true] Should this DropList be added to the TAB-key stack?\r\n * @property {boolean} [multi=false] Does this DropList show checkboxes for multiple item selection?\r\n * @property {function} [keyDownHandler=null] An alternative \"keydown\" event handler. Return true to prevent default behaviour.\r\n * @property {boolean} [autoCheckGroupChildren=true] When a group is checked/unchecked - all items beneath it will update accordingly\r\n * @property {boolean} [useExactTargetWidth=false] Use the exact target's width, do not allow growing\r\n * @property {boolean} [constrainToWindow=true] Should the position be constrained to the window, attaching to window's borders if needed?\r\n * @property {Boolean} [autoFlipDirection=true] Should the position/anchor be flipped automatically when there's no space in the required direction?\r\n * @property {number} [estimatedItemHeight=20] An estimated row height, for approximating scroll height.\r\n * @property {boolean} [estimateWidth=false] Use an estimation for the width instead of measuring. May be faster - needs testing and may depend on the CSS.\r\n * @property {number} [virtualMinItems=100] Turns into a virtual list - with items being created and showing up on viewport only. The value specified the minimum item count where a virtual list will be created.\r\n * @property {string} [labelProp='label']\r\n * @property {string} [valueProp='value']\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderItem] Function to call when rendering an item element\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderItem] Function to call when rendering an item element\r\n * @property {function(name: string, data: *)} [on]\r\n * */\r\n/** */\r\n\r\n/**\r\n * @typedef {Object} DropList.PositionAnchor\r\n * @property {'left'|'center'|'right'|'start'|'end'|string|number} x - horizontal anchor specification (could be either `'left'|'center'|'right'|'start'|'end'` or a percentage `'50%'` or a fixed decimal `Number`)\r\n * @property {'top'|'center'|'bottom'|string|number} y - vertical anchor specification (could be either `'top'|'center'|'bottom'` or a percentage `'50%'` or a fixed decimal `Number`)\r\n * */\r\n/** */\r\n\r\n/**\r\n * @typedef {Object} DropList.PositionOptions\r\n * @property {Element} [target] Target element to act as anchor\r\n * @property {{left: number, top: number}} [targetOffset=undefined] Override the offset of target. Automatically calculated if unspecified.\r\n * @property {number} [targetHeight=undefined] Override height of the target\r\n * @property {number} [targetWidth=undefined] Override width of the target\r\n * @property {DropList.PositionAnchor} [position=undefined]\r\n * @property {DropList.PositionAnchor} [anchor=undefined]\r\n * @property {boolean} [updateWidth=false] Should update the width of the menu according to target\r\n * @property {string} [targetRtl=undefined] Override for rtl mode of the target\r\n * @property {{x: number, y: number}} [offset=undefined] Extra rtl-aware offset to the target\r\n * */\r\n/** */\r\n\r\n/**\r\n * @typedef {Object} DropList.ItemBase\r\n * @property {string} [value]\r\n * @property {string} [label]\r\n * @property {boolean} [_group=false]\r\n * @property {boolean} [_child=false]\r\n * @property {boolean} [_nocheck=false]\r\n * @property {boolean} [_nointeraction=false]\r\n * */\r\n\r\n/**\r\n * @typedef {DropList.ItemBase} DropList.Item\r\n * @property {boolean} [_checked=false]\r\n * */\r\n/** */\r\n\r\n/** @type {DropList.Options} */\r\nlet defaultOptions = {\r\n baseClassName: 'droplist',\r\n\r\n itemBlurDelay: 300,\r\n capturesFocus: true,\r\n multi: false,\r\n keyDownHandler: null,\r\n autoCheckGroupChildren: true,\r\n useExactTargetWidth: false,\r\n\r\n constrainToWindow: true,\r\n autoFlipDirection: true,\r\n\r\n estimateWidth: false,\r\n virtualMinItems: 100,\r\n\r\n labelProp: 'label',\r\n valueProp: 'value',\r\n\r\n on: null,\r\n};\r\n\r\n/*\r\nEmits the following events:\r\n---------------------------\r\n\r\n'itemfocus' {value, item, event}: item gained focus.\r\n'itemblur' {value, item}: item lost focus.\r\n'select' {value, item}: item was selected (in single mode).\r\n'show:before': the drop list will show.\r\n'show': the drop list has been shown.\r\n'hide:before': the drop list will hide.\r\n'hide': the drop list was hidden.\r\n'hide:after': emitted after the hide css transition has ended, or immediately after 'hide'.\r\n'check' {value, item, isCheckingGroup}: item was selected (in multi mode).\r\n'groupcheck' {value, item, affectedItems}: item was selected (in multi mode).\r\n */\r\n\r\n// noinspection JSUnusedGlobalSymbols\r\nclass DropList {\r\n\r\n /**\r\n * @param {DropList.Options} options\r\n */\r\n constructor(options) {\r\n const o = { ...defaultOptions };\r\n\r\n for (let [key, value] of Object.entries(/**@type Object*/options))\r\n if (value !== undefined)\r\n o[key] = value;\r\n\r\n const p = this._p = {\r\n ownsEl: true,\r\n elOriginalDisplay: '',\r\n\r\n baseClassName: o.baseClassName,\r\n additionalClasses: o.additionalClasses,\r\n itemBlurDelay: o.itemBlurDelay,\r\n capturesFocus: o.capturesFocus,\r\n multi: o.multi,\r\n keyDownHandler: o.keyDownHandler,\r\n autoCheckGroupChildren: o.autoCheckGroupChildren,\r\n useExactTargetWidth: o.useExactTargetWidth,\r\n constrainToWindow: o.constrainToWindow,\r\n autoFlipDirection: o.autoFlipDirection,\r\n estimateWidth: o.estimateWidth,\r\n virtualMinItems: o.virtualMinItems,\r\n labelProp: o.labelProp,\r\n valueProp: o.valueProp,\r\n renderItem: o.renderItem,\r\n unrenderItem: o.unrenderItem,\r\n on: o.on || null,\r\n silenceEvents: true,\r\n mitt: mitt(),\r\n\r\n focusItemIndex: -1,\r\n focusItemEl: null,\r\n\r\n sink: new DomEventsSink(),\r\n };\r\n\r\n let classes = [p.baseClassName];\r\n\r\n if (p.additionalClasses) {\r\n classes = classes.concat(p.additionalClasses);\r\n }\r\n\r\n const initialCss = {\r\n // make initial position not interfere with layout so it can be correctly calculated\r\n top: '-9999px',\r\n };\r\n\r\n let el = o.el;\r\n if (el instanceof Element) {\r\n p.elOriginalDisplay = el.style.display || '';\r\n el.classList.add(...classes);\r\n el.role = 'menu';\r\n setCssProps(/**@type ElementCSSInlineStyle*/el, initialCss);\r\n p.ownsEl = false;\r\n } else {\r\n el = createElement('ul', {\r\n class: classes.join(' '),\r\n role: 'menu',\r\n css: initialCss,\r\n });\r\n }\r\n\r\n p.el = el;\r\n\r\n p.items = [];\r\n\r\n p.groupCount = 0; // This will keep state of how many `group` items we have\r\n\r\n p.mouseHandled = false;\r\n\r\n p.virtualListHelper = new VirtualListHelper({\r\n list: p.el,\r\n virtual: true,\r\n buffer: 5,\r\n estimatedItemHeight: o.estimatedItemHeight || 20,\r\n itemElementCreatorFn: () => {\r\n return createElement('li',\r\n {\r\n role: 'menuitem',\r\n tabIndex: p.capturesFocus ? -1 : null,\r\n },\r\n );\r\n },\r\n onItemRender: (itemEl, index) => {\r\n let item;\r\n\r\n if ((/**@type any*/index) === GhostSymbol) {\r\n item = {\r\n [p.labelProp]: p.lastMeasureLongestLabelText,\r\n [p.valueProp]: 'Measure',\r\n };\r\n itemEl.setAttribute('aria-hidden', 'true');\r\n } else {\r\n item = p.items[index];\r\n }\r\n\r\n if (!item) {\r\n // eslint-disable-next-line no-console\r\n console.warn('onItemRender called for (' + index + ') which has no item');\r\n }\r\n\r\n itemEl.className = `${p.baseClassName}__item`;\r\n\r\n const classList = itemEl.classList;\r\n\r\n if (p.multi) {\r\n if (item._nocheck) {\r\n classList.add(`${p.baseClassName}__item_multi_nocheck`);\r\n } else {\r\n classList.add(`${p.baseClassName}__item_multi`);\r\n\r\n if (item._checked) {\r\n classList.add(`${p.baseClassName}__item_checked`);\r\n }\r\n }\r\n } else {\r\n classList.add(`${p.baseClassName}__item_single`);\r\n }\r\n\r\n if (item._group)\r\n classList.add(`${p.baseClassName}__item_group`);\r\n\r\n if (item._child)\r\n classList.add(`${p.baseClassName}__item_child`);\r\n\r\n if (item._nointeraction)\r\n classList.add(`${p.baseClassName}__item_nointeraction`);\r\n\r\n if (p.focusItemIndex === index) {\r\n p.focusItemEl = itemEl;\r\n classList.add(`${p.baseClassName}__item_focus`);\r\n }\r\n\r\n this._renderItemContent(item, itemEl);\r\n\r\n itemEl[ItemSymbol] = item;\r\n },\r\n });\r\n\r\n if (typeof p.unrenderItem === 'function') {\r\n const fn = p.unrenderItem;\r\n p.virtualListHelper.setOnItemUnrender(el => {\r\n try {\r\n fn(el[ItemSymbol], el);\r\n } catch (err) { console.error(err); } // eslint-disable-line no-console\r\n delete el[ItemSymbol];\r\n\r\n if (p.focusItemEl === el)\r\n p.focusItemEl = null;\r\n });\r\n } else {\r\n p.virtualListHelper.setOnItemUnrender(el => {\r\n delete el[ItemSymbol];\r\n\r\n if (p.focusItemEl === el)\r\n p.focusItemEl = null;\r\n });\r\n }\r\n\r\n if (p.capturesFocus) {\r\n el.tabIndex = 0;\r\n }\r\n\r\n this._hookMouseEvents();\r\n this._hookTouchEvents();\r\n this._hookFocusEvents();\r\n this._hookKeyEvents();\r\n\r\n this.silenceEvents = false;\r\n }\r\n\r\n destroy() {\r\n if (this[DestroyedSymbol])\r\n return;\r\n this[DestroyedSymbol] = true;\r\n\r\n const p = this._p;\r\n\r\n clearTimeout(p.blurTimer);\r\n clearTimeout(p.filterTimer);\r\n\r\n p.sink.remove();\r\n p.virtualListHelper.destroy();\r\n\r\n if (p.el) {\r\n remove(p.el);\r\n }\r\n\r\n if (!p.ownsEl) {\r\n for (let name of Array.from(p.el.classList)) {\r\n if (name.startsWith(p.baseClassName)) {\r\n p.el.classList.remove(name);\r\n }\r\n }\r\n p.el.removeAttribute('role');\r\n for (let key of ['position', 'left', 'top', 'right', 'bottom', 'z-index']) {\r\n p.el.style[key] = '';\r\n }\r\n p.el.style.display = p.elOriginalDisplay;\r\n }\r\n\r\n if (p.lastPositionTarget) {\r\n p.lastPositionTarget.classList.remove(\r\n `has_${p.baseClassName}`,\r\n `has_${p.baseClassName}_above`,\r\n `has_${p.baseClassName}_below`);\r\n delete p.lastPositionTarget;\r\n }\r\n\r\n this._p = null;\r\n }\r\n\r\n get el() {\r\n return this._p.el;\r\n }\r\n\r\n /**\r\n * @param {string|string[]} classes\r\n * @returns {DropList}\r\n */\r\n setAdditionalClasses(classes) {\r\n const p = this._p;\r\n p.additionalClasses = classes;\r\n this._syncBaseClasses();\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {DropList}\r\n */\r\n setLabelProp(prop) {\r\n const p = this._p;\r\n p.labelProp = prop;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {DropList}\r\n */\r\n setValueProp(prop) {\r\n const p = this._p;\r\n p.valueProp = prop;\r\n return this;\r\n }\r\n\r\n _syncBaseClasses() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!el)\r\n return;\r\n\r\n let classes = [p.baseClassName];\r\n\r\n if (p.additionalClasses) {\r\n classes = classes.concat(p.additionalClasses);\r\n }\r\n\r\n el.className = classes.join(' ');\r\n }\r\n\r\n blurFocusedItem() {\r\n const p = this._p;\r\n\r\n clearTimeout(p.blurTimer);\r\n\r\n if (!this.hasFocusedItem()) {\r\n return;\r\n }\r\n\r\n let focusItemEl = p.focusItemEl;\r\n if (focusItemEl) {\r\n focusItemEl.classList.remove(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = null;\r\n }\r\n\r\n const item = p.items[p.focusItemIndex];\r\n p.focusItemIndex = -1;\r\n\r\n if (!item)\r\n return;\r\n\r\n this._trigger('itemblur', { value: item[p.valueProp], item: item });\r\n }\r\n\r\n nextPage(event) {\r\n this._move('next_page', event);\r\n }\r\n\r\n previousPage(event) {\r\n this._move('prev_page', event);\r\n }\r\n\r\n toggleFocusedItem() {\r\n const p = this._p;\r\n\r\n if (this.hasFocusedItem() && p.multi) {\r\n let item = p.items[p.focusItemIndex];\r\n if (item._nocheck || item._nointeraction) return this;\r\n\r\n item._checked = !item._checked;\r\n if (p.focusItemEl) {\r\n toggleClass(p.focusItemEl, `${p.baseClassName}__item_checked`, item._checked);\r\n }\r\n this._trigger('check', { value: item[p.valueProp], item: item });\r\n\r\n this._updateGroupStateForItem(item);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n triggerItemSelection(event) {\r\n const p = this._p;\r\n\r\n p.focusItemEl = p.focusItemEl || closestUntil(event.target, 'li', p.el);\r\n p.focusItemIndex = p.virtualListHelper.getItemIndexFromElement(p.focusItemEl);\r\n if (p.focusItemIndex === undefined)\r\n p.focusItemIndex = -1;\r\n\r\n let item = p.focusItemEl[ItemSymbol];\r\n if (item._nointeraction) {\r\n return false;\r\n }\r\n\r\n if (!p.multi) {\r\n this._setSingleSelectedItemEl(p.focusItemEl);\r\n }\r\n\r\n this._trigger('select', { value: item ? item[p.valueProp] : undefined, item: item });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.Item} item The item to add. It is copied.\r\n * @param {number} [atIndex=-1] The index to insert at (or -1)\r\n * @returns {DropList}\r\n */\r\n addItem(item, atIndex = -1) {\r\n return this.addItems([item], atIndex);\r\n }\r\n\r\n /**\r\n * Adds items to the menu and renders\r\n * @param {DropList.Item[]} itemsToAdd The items to add. These are copied.\r\n * @param {number} [atIndex=-1] The index to insert at (or -1)\r\n * @returns {DropList}\r\n */\r\n addItems(itemsToAdd, atIndex = -1) {\r\n const p = this._p, labelProp = p.labelProp, valueProp = p.valueProp;\r\n\r\n let isMulti = p.multi;\r\n let items = p.items;\r\n\r\n if (atIndex == null || atIndex < 0 || atIndex >= p.items.length) {\r\n atIndex = -1;\r\n }\r\n\r\n // Determine if the list is virtual or not\r\n this._determineVirtualMode(items.length + itemsToAdd.length);\r\n\r\n for (let i = 0, count = itemsToAdd.length; i < count; i++) {\r\n let oitem = itemsToAdd[i];\r\n //noinspection PointlessBooleanExpressionJS\r\n let item = {\r\n [ItemSymbol]: oitem,\r\n [labelProp]: oitem[labelProp],\r\n [valueProp]: oitem[valueProp],\r\n _nocheck: !!oitem._nocheck,\r\n _nointeraction: !!oitem._nointeraction,\r\n };\r\n\r\n if (isMulti) {\r\n item._checked = !!oitem._checked;\r\n }\r\n\r\n if (oitem._group) {\r\n item._group = true;\r\n p.groupCount++;\r\n }\r\n\r\n if (oitem._child) {\r\n // This is used for setting a child class,\r\n // But can be used to determine that current item is not part of above group,\r\n // mainly where the groups are oddly sorted.\r\n item._child = true;\r\n }\r\n\r\n // Add the item to the list of them\r\n if (atIndex !== -1) {\r\n items.splice(atIndex, 0, item);\r\n } else {\r\n items.push(item);\r\n }\r\n\r\n if (atIndex !== -1) {\r\n atIndex++;\r\n }\r\n }\r\n\r\n p.virtualListHelper\r\n .addItemsAt(itemsToAdd.length, atIndex === -1 ? atIndex : (atIndex - itemsToAdd.length))\r\n .render();\r\n\r\n return this;\r\n }\r\n\r\n updateItemByValue(value, newItem) {\r\n const p = this._p;\r\n\r\n // Look for the proper item\r\n let itemIndex = this.itemIndexByValue(value);\r\n if (itemIndex < -1) return this;\r\n\r\n let item = this.itemAtIndex(itemIndex);\r\n item[ItemSymbol] = newItem;\r\n\r\n if (hasOwnProperty.call(newItem, p.labelProp))\r\n item[p.labelProp] = newItem[p.labelProp];\r\n\r\n if (hasOwnProperty.call(newItem, p.valueProp))\r\n item[p.valueProp] = newItem[p.valueProp];\r\n\r\n if (hasOwnProperty.call(newItem, '_nocheck'))\r\n item._nocheck = !!newItem._nocheck;\r\n\r\n if (hasOwnProperty.call(newItem, '_nointeraction'))\r\n item._nointeraction = !!newItem._nointeraction;\r\n\r\n if (p.multi) {\r\n if (hasOwnProperty.call(newItem, '_checked'))\r\n item._checked = !!newItem._checked;\r\n }\r\n\r\n if (hasOwnProperty.call(newItem, '_group')) {\r\n if (!!newItem._group !== item._group) {\r\n if (item._group)\r\n p.groupCount--;\r\n else p.groupCount++;\r\n\r\n newItem._group = !!item._group;\r\n }\r\n }\r\n\r\n if (hasOwnProperty.call(newItem, '_child'))\r\n item._child = !!newItem._child;\r\n\r\n if (p.virtualListHelper.isItemRendered(itemIndex)) {\r\n p.virtualListHelper\r\n .refreshItemAt(itemIndex)\r\n .render();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n removeItem(value, label) {\r\n const p = this._p;\r\n\r\n // Look for the proper item\r\n let itemIndex = this.itemIndexByValueOrLabel(value, label);\r\n if (itemIndex < -1) return this;\r\n\r\n let spliced = p.items.splice(itemIndex, 1);\r\n if (spliced[0]._group) {\r\n p.groupCount--;\r\n }\r\n\r\n p.virtualListHelper\r\n .removeItemsAt(itemIndex, 1)\r\n .render();\r\n\r\n return this;\r\n }\r\n\r\n removeAllItems() {\r\n const p = this._p;\r\n\r\n p.items.length = 0;\r\n p.groupCount = 0;\r\n\r\n p.virtualListHelper\r\n .setCount(0)\r\n .render();\r\n\r\n return this;\r\n }\r\n\r\n itemDataByValue(value) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (item[valueProp] === value) {\r\n return item;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n itemIndexByValue(value) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (item[valueProp] === value) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n itemIndexByValueOrLabel(value, label) {\r\n const p = this._p, labelProp = p.labelProp, valueProp = p.valueProp;\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (item[valueProp] === value || item[labelProp] === label) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n items() {\r\n return this._p.items.slice(0);\r\n }\r\n\r\n itemsReference() {\r\n return this._p.items;\r\n }\r\n\r\n itemCount() {\r\n return this._p.items.length;\r\n }\r\n\r\n itemAtIndex(index) {\r\n return this._p.items[index];\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.PositionOptions} positionOptions\r\n * @returns {DropList}\r\n * @public\r\n */\r\n relayout(positionOptions) {\r\n const p = this._p, el = p.el;\r\n\r\n if (!this.isVisible()) return this;\r\n\r\n let w = window;\r\n\r\n let targetBox = {};\r\n\r\n let offset = positionOptions.targetOffset || getElementOffset(positionOptions.target);\r\n targetBox.left = offset.left;\r\n targetBox.top = offset.top;\r\n targetBox.height = positionOptions.targetHeight == null\r\n ? getElementHeight(positionOptions.target, true, true)\r\n : positionOptions.targetHeight;\r\n targetBox.width = positionOptions.targetWidth == null\r\n ? getElementWidth(positionOptions.target, true, true)\r\n : positionOptions.targetWidth;\r\n targetBox.bottom = targetBox.top + targetBox.height;\r\n\r\n let viewport = {};\r\n viewport.top = w.pageYOffset;\r\n viewport.left = w.pageXOffset;\r\n viewport.width = w.innerWidth;\r\n viewport.height = w.innerHeight;\r\n viewport.bottom = viewport.top + viewport.height;\r\n viewport.right = viewport.left + viewport.width;\r\n\r\n let defaultVerticalDirection = (positionOptions.position && positionOptions.position.y === 'bottom')\r\n ? 'above'\r\n : 'below';\r\n\r\n // Reset dropdown width\r\n el.style.width = '';\r\n\r\n // Make estimations\r\n if (p.estimateWidth ||\r\n p.virtualListHelper.isVirtual()) {\r\n this._measureItem();\r\n }\r\n\r\n // Calculate virtual viewport size\r\n if (p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.render();\r\n }\r\n\r\n // Now set the width of the dropdown\r\n if (positionOptions.updateWidth) {\r\n this._updateWidth(positionOptions);\r\n }\r\n\r\n // How much space is there above, and how much below?\r\n let roomAbove = targetBox.top - viewport.top;\r\n let roomBelow = viewport.bottom - targetBox.bottom;\r\n\r\n // Calculate height for dropdown\r\n\r\n let maxViewHeight;\r\n\r\n const elComputedStyle = getComputedStyle(el);\r\n\r\n let isBoxing = elComputedStyle.boxSizing === 'border-box';\r\n let verticalPadding = (parseFloat(elComputedStyle.paddingTop) || 0) +\r\n (parseFloat(elComputedStyle.paddingBottom) || 0);\r\n let verticalBorderWidth = (parseFloat(elComputedStyle.borderTopWidth) || 0) +\r\n (parseFloat(elComputedStyle.borderBottomWidth) || 0);\r\n\r\n if (p.virtualListHelper.isVirtual()) {\r\n maxViewHeight =\r\n p.virtualListHelper.estimateFullHeight() +\r\n verticalPadding +\r\n verticalBorderWidth;\r\n } else {\r\n // Another method to calculate height is measuring the whole thing at once.\r\n // This causes relayout of course.\r\n el.style.height = '';\r\n el.style.top = '-9999px';\r\n\r\n maxViewHeight = Math.max(getElementHeight(p.el), el.scrollHeight);\r\n maxViewHeight += verticalPadding + verticalBorderWidth;\r\n }\r\n\r\n // Consider css max-height\r\n\r\n let maxHeight = parseFloat(elComputedStyle.maxHeight);\r\n if (!isNaN(maxHeight)) {\r\n if (!isBoxing) {\r\n maxHeight += verticalPadding + verticalBorderWidth;\r\n }\r\n\r\n maxViewHeight = Math.min(maxViewHeight, maxHeight);\r\n }\r\n\r\n // Figure out the direction\r\n\r\n let enoughRoomAbove = roomAbove >= maxViewHeight;\r\n let enoughRoomBelow = roomBelow >= maxViewHeight;\r\n\r\n let newDirection = p.currentDirection || defaultVerticalDirection;\r\n if (newDirection === 'above' && !enoughRoomAbove && enoughRoomBelow) {\r\n newDirection = 'below';\r\n } else if (newDirection === 'below' && !enoughRoomBelow && enoughRoomAbove) {\r\n newDirection = 'above';\r\n } else if (enoughRoomAbove && enoughRoomBelow) {\r\n if (newDirection !== defaultVerticalDirection &&\r\n ((defaultVerticalDirection === 'above' && roomAbove >= roomBelow) ||\r\n (defaultVerticalDirection === 'below' && roomBelow >= roomAbove))) {\r\n newDirection = defaultVerticalDirection;\r\n }\r\n } else if (!enoughRoomAbove && !enoughRoomBelow) {\r\n if (roomAbove > roomBelow) {\r\n newDirection = 'above';\r\n } else if (roomBelow > roomAbove) {\r\n newDirection = 'below';\r\n }\r\n }\r\n p.currentDirection = newDirection;\r\n\r\n // Figure out that final view size\r\n let viewSize = {\r\n width: getElementWidth(el, true, true),\r\n height: Math.min(maxViewHeight, Math.max(roomAbove, roomBelow, 0)),\r\n };\r\n\r\n let isTargetRtl = positionOptions.targetRtl !== undefined ?\r\n positionOptions.targetRtl :\r\n (positionOptions.target == null ? false : getComputedStyle(positionOptions.target).direction === 'rtl');\r\n let isRtlDocument = getComputedStyle(document.documentElement).direction === 'rtl';\r\n\r\n let anchor = anchoredPosition(positionOptions.target,\r\n positionOptions.anchor ? positionOptions.anchor.x : 'start',\r\n positionOptions.anchor ? positionOptions.anchor.y : 'bottom',\r\n targetBox, isTargetRtl);\r\n let position = anchoredPosition(el,\r\n positionOptions.position ? positionOptions.position.x : 'start',\r\n positionOptions.position ? positionOptions.position.y : 'top',\r\n viewSize, isTargetRtl);\r\n\r\n // If it's not in the direction that the user expected, invert it\r\n let invertYPos =\r\n (position.specY === 'top' && newDirection === 'above') ||\r\n (position.specY === 'bottom' && newDirection === 'below') ||\r\n (position.specY !== 'bottom' && position.specY !== 'top' && newDirection === 'above');\r\n\r\n let scrollLeft =\r\n (w.pageXOffset !== undefined) ?\r\n w.pageXOffset :\r\n (document.documentElement || document.body.parentNode || document.body).scrollLeft;\r\n scrollLeft = Math.abs(scrollLeft);\r\n if (isRtlDocument) {\r\n scrollLeft = document.documentElement.scrollWidth - scrollLeft - document.documentElement.clientWidth;\r\n }\r\n\r\n let minX = scrollLeft,\r\n maxX = document.documentElement.clientWidth + scrollLeft - viewSize.width;\r\n\r\n let viewCss = {\r\n 'position': 'absolute',\r\n 'left': targetBox.left,\r\n 'top': targetBox.top + (invertYPos ? (anchor.bottom - position.bottom) : (anchor.top - position.top)),\r\n };\r\n\r\n if (isRtlDocument) {\r\n viewCss.left -= document.documentElement.clientWidth - document.documentElement.scrollWidth;\r\n }\r\n\r\n viewCss.left += anchor.left - position.left;\r\n\r\n if (positionOptions.offset) {\r\n if (positionOptions.offset.y) {\r\n if (invertYPos) {\r\n viewCss.top -= positionOptions.offset.y;\r\n } else {\r\n viewCss.top += positionOptions.offset.y;\r\n }\r\n }\r\n\r\n if (positionOptions.offset.x) {\r\n let rtl = elComputedStyle.direction === 'rtl';\r\n viewCss.left += rtl\r\n ? -positionOptions.offset.x\r\n : positionOptions.offset.x;\r\n }\r\n }\r\n\r\n if (p.autoFlipDirection) {\r\n if ((position.specX === 'right' &&\r\n viewCss.left < minX &&\r\n (Math.max(viewCss.left, minX) + viewSize.width - targetBox.left) / targetBox.width > 0.5) ||\r\n (position.specX === 'left' &&\r\n viewCss.left > maxX &&\r\n (Math.min(viewCss.left, maxX) - targetBox.left) / targetBox.width < 0.5)) {\r\n viewCss.left -= anchor.left - position.left;\r\n viewCss.left += anchor.right - position.right;\r\n }\r\n }\r\n\r\n // Constrain to the window if required\r\n if (p.constrainToWindow) {\r\n for (let which of (isRtlDocument ? ['min', 'max'] : ['max', 'min'])) {\r\n if (which === 'min' && viewCss.left < minX)\r\n viewCss.left = minX;\r\n else if (which === 'max' && viewCss.left > maxX)\r\n viewCss.left = maxX;\r\n }\r\n }\r\n\r\n // Set position CSS\r\n viewCss.left += 'px';\r\n viewCss.top += 'px';\r\n setCssProps(el, viewCss);\r\n setElementHeight(el, viewSize.height, true, true);\r\n\r\n // Update the scroll position for virtual lists\r\n p.virtualListHelper.render();\r\n\r\n // Update position classes\r\n if (positionOptions && positionOptions.target) {\r\n p.lastPositionTarget = positionOptions.target;\r\n\r\n toggleClass(positionOptions.target, `has_${p.baseClassName}`, true);\r\n toggleClass(positionOptions.target, `has_${p.baseClassName}_below`, newDirection === 'below');\r\n toggleClass(positionOptions.target, `has_${p.baseClassName}_above`, newDirection === 'above');\r\n\r\n toggleClass(el, `${p.baseClassName}__is_below`, newDirection === 'below');\r\n toggleClass(el, `${p.baseClassName}__is_above`, newDirection === 'above');\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the checked mode of a specific value.\r\n * @public\r\n * @param {*} value - array of values to check\r\n * @param {boolean} checked - will the value be checked?\r\n * @returns {DropList} self\r\n */\r\n setItemChecked(value, checked) {\r\n const p = this._p;\r\n\r\n checked = !!checked;\r\n\r\n let index = this.itemIndexByValue(value);\r\n if (index === -1) return this;\r\n\r\n let li = p.virtualListHelper.getItemElementAt(index);\r\n if (!li) return this;\r\n\r\n let item = li[ItemSymbol];\r\n\r\n checked = checked && !item._nocheck;\r\n\r\n if (item._checked !== checked) {\r\n item._checked = checked;\r\n\r\n toggleClass(li, `${p.baseClassName}__item_checked`, item._checked);\r\n\r\n this._updateGroupStateForItem(item);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the checked values. All the other values will be unchecked,\r\n * @public\r\n * @param {Array<*>} values - array of values to check\r\n * @returns {DropList} self\r\n */\r\n setCheckedValues(values) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n let groupIndexes = [];\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n let checked = !item._nocheck && values.indexOf(item[valueProp]) !== -1;\r\n\r\n if (item._group) {\r\n groupIndexes.push(i);\r\n }\r\n\r\n if (item._checked === checked) continue;\r\n\r\n item._checked = checked;\r\n\r\n let li = p.virtualListHelper.getItemElementAt(i);\r\n if (!li) continue;\r\n\r\n toggleClass(li, `${p.baseClassName}__item_checked`, item._checked);\r\n }\r\n\r\n if (p.autoCheckGroupChildren) {\r\n for (let i = 0, count = groupIndexes.length; i < count; i++) {\r\n this._updateGroupCheckedState(groupIndexes[i], false);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get all checked values. Returns array of item values.\r\n * @public\r\n * @param {boolean} excludeGroups=false Exclude group items\r\n * @returns {Array<*>} self\r\n */\r\n getCheckedValues(excludeGroups) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n excludeGroups = excludeGroups && p.groupCount > 0;\r\n\r\n let values = [];\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (!item._checked) continue;\r\n if (excludeGroups && item._group) continue;\r\n values.push(item[valueProp]);\r\n }\r\n\r\n return values;\r\n }\r\n\r\n /**\r\n * Get all checked items. Returns array of actual item data object.\r\n * @public\r\n * @param {boolean} excludeGroups=false Exclude group items\r\n * @returns {DropList.Item[]}\r\n */\r\n getCheckedItems(excludeGroups) {\r\n const p = this._p;\r\n\r\n excludeGroups = excludeGroups && p.groupCount > 0;\r\n\r\n let items = [];\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (!item._checked) continue;\r\n if (excludeGroups && item._group) continue;\r\n items.push(item);\r\n }\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.PositionOptions?} positionOptions\r\n * @returns {DropList}\r\n * @public\r\n */\r\n show(positionOptions) {\r\n const p = this._p;\r\n\r\n p.hiding = false;\r\n\r\n if (!this.isVisible()) {\r\n this._trigger('show:before');\r\n }\r\n\r\n p.mouseHandled = false;\r\n\r\n setTimeout(() => { // Skip the end of a 'click' event\r\n if (this[DestroyedSymbol]) return;\r\n\r\n if (!p.onDocumentMouseDown) {\r\n // Detect mouse tap outside of the droplist, to blur the focused item\r\n p.sink.add(document, 'mousedown', p.onDocumentMouseDown = (event) => {\r\n if (!p.el.contains(event.target))\r\n this._delayBlur();\r\n });\r\n }\r\n });\r\n\r\n const el = p.el;\r\n el.style.position = 'absolute';\r\n el.classList.remove(`${p.baseClassName}__is-hiding`);\r\n document.body.appendChild(el);\r\n\r\n p.visible = true;\r\n\r\n p.el.style.display = '';\r\n if (getComputedStyle(p.el).display === 'none')\r\n p.el.style.display = 'block';\r\n\r\n if (positionOptions) {\r\n const elComputedStyle = getComputedStyle(el);\r\n\r\n // Set max height to avoid adding scrollbars to page\r\n const originalMaxHeight = el.style.maxHeight;\r\n let maxHeight = document.body.clientHeight -\r\n (parseFloat(elComputedStyle.marginTop) || 0) -\r\n (parseFloat(elComputedStyle.marginBottom) || 0) -\r\n (elComputedStyle.boxSizing === 'border-box'\r\n ? 0\r\n : ((parseFloat(elComputedStyle.borderTopWidth) || 0) +\r\n (parseFloat(elComputedStyle.borderBottomWidth) || 0)));\r\n\r\n el.style.maxHeight = Math.min(maxHeight, parseFloat(elComputedStyle.maxHeight) || maxHeight) + 'px';\r\n\r\n this.relayout(positionOptions);\r\n\r\n // Restore original max-height\r\n el.style.maxHeight = originalMaxHeight;\r\n } else {\r\n // Calculate virtual viewport size\r\n if (p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.render();\r\n }\r\n }\r\n\r\n if (this.isVisible()) {\r\n this._trigger('show');\r\n }\r\n\r\n return this;\r\n }\r\n\r\n hide() {\r\n const p = this._p, el = p.el;\r\n\r\n if (p.onDocumentMouseDown) {\r\n p.sink.remove(document, 'mousedown', p.onDocumentMouseDown);\r\n p.onDocumentMouseDown = null;\r\n }\r\n\r\n if (this.isVisible()) {\r\n this._trigger('hide:before');\r\n\r\n p.hiding = true;\r\n\r\n if (el) {\r\n\r\n el.classList.add(`${p.baseClassName}__is-hiding`);\r\n\r\n // support for hide transition in css\r\n const maxTransitionDuration = parseTransition(getComputedStyle(p.el).transition)\r\n .reduce((p, v) => Math.max(p, v.delay + v.duration), 0);\r\n\r\n if (maxTransitionDuration > 0) {\r\n setTimeout(() => {\r\n if (this[DestroyedSymbol]) return;\r\n\r\n if (this._p && el.parentNode && p.hiding) {\r\n remove(el);\r\n el.classList.remove(`${p.baseClassName}__is-hiding`);\r\n p.visible = false;\r\n this._trigger('hide:after');\r\n }\r\n });\r\n } else {\r\n remove(el);\r\n el.classList.remove(`${p.baseClassName}__is-hiding`);\r\n }\r\n }\r\n\r\n p.visible = false;\r\n\r\n this.blurFocusedItem();\r\n this._trigger('hide');\r\n\r\n if (this[DestroyedSymbol]) return;\r\n this._trigger('hide:after');\r\n }\r\n\r\n if (p.lastPositionTarget) {\r\n p.lastPositionTarget.classList.remove(\r\n `has_${p.baseClassName}`,\r\n `has_${p.baseClassName}_above`,\r\n `has_${p.baseClassName}_below`);\r\n delete p.lastPositionTarget;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n isVisible() {\r\n const p = this._p;\r\n if (!p.visible)\r\n return false;\r\n return p.el.parentNode && getComputedStyle(p.el).display !== 'none';\r\n }\r\n\r\n hasFocusedItem() {\r\n return this._p.focusItemIndex > -1;\r\n }\r\n\r\n getFocusedItemIndex() {\r\n if (!this.hasFocusedItem())\r\n return -1;\r\n return this._p.focusItemIndex;\r\n }\r\n\r\n setFocusedItemAtIndex(itemIndex) {\r\n const p = this._p;\r\n\r\n p.focusItemIndex = itemIndex;\r\n\r\n let item = null;\r\n if (itemIndex > -1)\r\n item = p.items[itemIndex];\r\n if (item && item._nointeraction)\r\n item = null;\r\n if (itemIndex > -1) {\r\n this.scrollItemIndexIntoView(itemIndex);\r\n }\r\n let itemElement = item ? p.virtualListHelper.getItemElementAt(itemIndex) : null;\r\n\r\n if (p.focusItemEl !== itemElement) {\r\n if (p.focusItemEl) {\r\n p.focusItemEl.classList.remove(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = null;\r\n }\r\n\r\n if (itemElement) {\r\n itemElement.classList.add(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = itemElement;\r\n\r\n this._trigger('itemfocus', { value: itemElement[p.valueProp], item: itemElement[ItemSymbol], event: null });\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n setFocusedItem(item) {\r\n const p = this._p;\r\n\r\n let itemIndex = item._nointeraction ? -1 : this._getItemIndex(item);\r\n\r\n if (itemIndex > -1 && p.items[itemIndex]._nointeraction)\r\n itemIndex = -1;\r\n\r\n return this.setFocusedItemAtIndex(itemIndex);\r\n }\r\n\r\n setFocusedItemByValue(value) {\r\n return this.setFocusedItemAtIndex(this.itemIndexByValue(value));\r\n }\r\n\r\n setSingleSelectedItemAtIndex(itemIndex) {\r\n const p = this._p;\r\n\r\n let itemEl = null;\r\n\r\n if (itemIndex > -1 && !p.items[itemIndex]._nointeraction) {\r\n itemEl = p.virtualListHelper.getItemElementAt(itemIndex);\r\n }\r\n\r\n this._setSingleSelectedItemEl(itemEl);\r\n\r\n return this;\r\n }\r\n\r\n setSingleSelectedItem(item) {\r\n const p = this._p;\r\n\r\n let itemIndex = item._nointeraction ? -1 : this._getItemIndex(item);\r\n\r\n if (itemIndex > -1 && p.items[itemIndex]._nointeraction)\r\n itemIndex = -1;\r\n\r\n return this.setSingleSelectedItemAtIndex(itemIndex);\r\n }\r\n\r\n setSingleSelectedItemByValue(value) {\r\n return this.setSingleSelectedItemAtIndex(this.itemIndexByValue(value));\r\n }\r\n\r\n next(event) {\r\n this._move('next', event);\r\n }\r\n\r\n previous(event) {\r\n this._move('prev', event);\r\n }\r\n\r\n isFirstItem() {\r\n const p = this._p;\r\n return p.focusItemIndex === 0 && p.focusItemIndex < p.items.length;\r\n }\r\n\r\n isLastItem() {\r\n const p = this._p;\r\n return p.focusItemIndex > -1 && p.focusItemIndex === p.items.length - 1;\r\n }\r\n\r\n scrollItemIndexIntoView(itemIndex) {\r\n const p = this._p;\r\n\r\n if (this._hasScroll()) {\r\n const el = p.el, scrollTop = el.scrollTop;\r\n\r\n let itemPos, previousPos = -1;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n itemPos = p.virtualListHelper.getItemPosition(itemIndex);\r\n\r\n if (itemPos === previousPos)\r\n break;\r\n\r\n previousPos = itemPos;\r\n\r\n let itemSize = p.virtualListHelper.getItemSize(itemIndex);\r\n\r\n let listHeight = el.clientHeight;\r\n\r\n if (itemPos < scrollTop) {\r\n el.scrollTop = itemPos;\r\n } else if (itemPos + itemSize > scrollTop + listHeight) {\r\n el.scrollTop = itemPos + itemSize - listHeight;\r\n }\r\n\r\n // force update items, until the positions and sizes are final\r\n p.virtualListHelper.render();\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Register an event handler\r\n * @param {(string|'*')?} event\r\n * @param {function(any)} handler\r\n * @returns {DropList}\r\n */\r\n on(/**string|'*'*/event, /**Function?*/handler) {\r\n this._p.mitt.on(event, handler);\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a one time event handler\r\n * @param {(string|'*')?} event\r\n * @param {function(any)} handler\r\n * @returns {DropList}\r\n */\r\n once(/**string|'*'*/event, /**Function?*/handler) {\r\n let wrapped = (value) => {\r\n this._p.mitt.off(event, wrapped);\r\n handler(value);\r\n };\r\n this._p.mitt.on(event, wrapped);\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an `handler` for `event`, all events for `event`, or all events completely.\r\n * @param {(string|'*')?} event\r\n * @param {function(any)} handler\r\n * @returns {DropList}\r\n */\r\n off(/**(string|'*')?*/event, /**Function?*/handler) {\r\n if (!event && !event) {\r\n this._p.mitt.all.clear();\r\n } else {\r\n this._p.mitt.off(event, handler);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Emit an event\r\n * @param {string} event\r\n * @param {any} value\r\n * @returns {DropList}\r\n */\r\n emit(/**string|'*'*/event, /**any?*/value) {\r\n this._p.mitt.emit(event, value);\r\n return this;\r\n }\r\n\r\n _getItemIndex(item) {\r\n const p = this._p, labelProp = p.labelProp, valueProp = p.valueProp;\r\n\r\n let itemIndex = -1;\r\n\r\n if (item) {\r\n itemIndex = p.items.indexOf(item);\r\n if (itemIndex === -1) {\r\n let value = (item && item[valueProp] !== undefined) ? item[valueProp] : item;\r\n let label = (item && item[labelProp]) ? item[labelProp] : value;\r\n itemIndex = this.itemIndexByValueOrLabel(value, label);\r\n }\r\n }\r\n\r\n return itemIndex;\r\n }\r\n\r\n _setSingleSelectedItemEl(itemEl) {\r\n const p = this._p;\r\n\r\n if (p.singleSelectedItemEl) {\r\n p.singleSelectedItemEl.classList.remove(`${p.baseClassName}__item_checked`);\r\n p.singleSelectedItemEl = null;\r\n }\r\n\r\n if (itemEl) {\r\n itemEl.classList.add(`${p.baseClassName}__item_checked`);\r\n p.singleSelectedItemEl = itemEl;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} event\r\n * @param {*} [data]\r\n * @private\r\n */\r\n _trigger(event, data) {\r\n const p = this._p;\r\n if (p.on)\r\n p.on(event, ...(data === undefined ? [] : [data]));\r\n p.mitt.emit(event, data);\r\n }\r\n\r\n _itemUpAction(event, itemEl) {\r\n if (closestUntil(event.target, '.requires-pointer-events,button', itemEl)) return;\r\n\r\n let p = this._p;\r\n\r\n if (!this._mouseHandled) {\r\n\r\n this.triggerItemSelection(event);\r\n\r\n // If we are destroyed in response to a click/select, cease all actions\r\n if (this[DestroyedSymbol])\r\n return;\r\n\r\n this.toggleFocusedItem();\r\n\r\n if (document.activeElement !== this.el && p.focusItemEl) {\r\n clearTimeout(p.blurTimer);\r\n }\r\n\r\n setTimeout(() => {\r\n this._mouseHandled = false;\r\n }, 0);\r\n }\r\n }\r\n\r\n _hookMouseEvents() {\r\n const p = this._p;\r\n\r\n p.sink\r\n .add(p.el, 'mousedown', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n event.preventDefault();\r\n })\r\n .add(p.el, 'mouseup', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n if (event.button !== 0) return;\r\n\r\n this._itemUpAction(event, li);\r\n })\r\n .add(p.el, 'mouseover', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n this._handleMouseOver(event, li);\r\n });\r\n }\r\n\r\n _handleMouseOver(event, itemEl) {\r\n this._focus(event, itemEl);\r\n }\r\n\r\n _hookTouchEvents() {\r\n const p = this._p;\r\n\r\n let currentTouchId;\r\n\r\n p.sink.add(p.el, 'touchstart', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n if (currentTouchId) return;\r\n if (closestUntil(event.target, '.requires-pointer-events,button', li)) return;\r\n\r\n currentTouchId = event.changedTouches[0].identifier;\r\n\r\n // Simulate mouseover event\r\n this._handleMouseOver(event, li);\r\n\r\n // Track scrolling\r\n let didScroll = false;\r\n let onScroll = () => { didScroll = true; };\r\n let onTouchCancel = () => {\r\n currentTouchId = null;\r\n p.sink.remove(null, '.dropdown_touchextra');\r\n };\r\n\r\n let elToTrackScroll = li.parentNode;\r\n while (elToTrackScroll) {\r\n p.sink.add(elToTrackScroll, 'scroll.dropdown_touchextra', onScroll);\r\n elToTrackScroll = elToTrackScroll.parentNode;\r\n }\r\n p.sink.add(window, 'scroll.dropdown_touchextra', onScroll);\r\n\r\n p.sink.add(window, 'touchcancel.dropdown_touchextra', onTouchCancel);\r\n\r\n p.sink.add(p.el, 'touchend.dropdown_touchextra', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return onTouchCancel();\r\n\r\n let touch = Array.prototype.find.call(event.changedTouches, (touch) => {\r\n return touch.identifier === currentTouchId;\r\n });\r\n if (!touch) return onTouchCancel();\r\n\r\n onTouchCancel();\r\n\r\n if (!didScroll) {\r\n this._itemUpAction(event, li);\r\n event.preventDefault();\r\n }\r\n });\r\n });\r\n }\r\n\r\n _hookFocusEvents() {\r\n const p = this._p;\r\n\r\n p.sink\r\n .add(p.el, 'focus', event => {\r\n let itemEl = p.focusItemEl || // focused item\r\n p.el.firstChild; // or the first item\r\n\r\n this._focus(event, itemEl);\r\n })\r\n .add(p.el, 'blur', () => {\r\n setTimeout(() => {\r\n if (this[DestroyedSymbol]) return;\r\n\r\n if (!p.el.contains(document.activeElement)) {\r\n this._delayBlur();\r\n }\r\n });\r\n });\r\n }\r\n\r\n _hookKeyEvents() {\r\n const p = this._p;\r\n\r\n p.sink.add(p.el, 'keydown', evt => this._keydown(evt));\r\n p.sink.add(p.el, 'keypress', evt => this._keydown(evt));\r\n }\r\n\r\n _keydown(event) {\r\n const p = this._p;\r\n\r\n if (p.keyDownHandler && p.keyDownHandler.call(this, event)) {\r\n return;\r\n }\r\n\r\n let preventDefault = true;\r\n\r\n switch (event.key) {\r\n case VALUE_PAGE_UP:\r\n case VALUE_PAGE_DOWN:\r\n case VALUE_HOME:\r\n case VALUE_END:\r\n case VALUE_UP:\r\n case VALUE_DOWN:\r\n event.preventDefault();\r\n\r\n switch (event.key) {\r\n case VALUE_PAGE_UP:\r\n this.previousPage(event);\r\n break;\r\n case VALUE_PAGE_DOWN:\r\n this.nextPage(event);\r\n break;\r\n case VALUE_HOME:\r\n this._move('first', event);\r\n break;\r\n case VALUE_END:\r\n this._move('last', event);\r\n break;\r\n case VALUE_UP:\r\n this.previous(event);\r\n break;\r\n case VALUE_DOWN:\r\n this.next(event);\r\n break;\r\n }\r\n break;\r\n\r\n case VALUE_ENTER:\r\n this.triggerItemSelection(event);\r\n event.preventDefault();\r\n break;\r\n\r\n case VALUE_SPACE:\r\n this.toggleFocusedItem();\r\n event.preventDefault();\r\n break;\r\n\r\n case VALUE_ESCAPE:\r\n event.preventDefault();\r\n this.hide();\r\n break;\r\n\r\n default: {\r\n if (event.type === 'keydown') return;\r\n this._keydownFreeType(event);\r\n preventDefault = false;\r\n }\r\n }\r\n }\r\n\r\n _keydownFreeType(evt) {\r\n const p = this._p, labelProp = p.labelProp;\r\n\r\n // noinspection JSDeprecatedSymbols\r\n let character = evt.key || String.fromCharCode(evt.keyCode);\r\n if (character.length !== 1) return;\r\n\r\n clearTimeout(p.filterTimer);\r\n\r\n // Accumulate text to find from keystrokes\r\n let keyword = (p.previousFilter || '') + character;\r\n\r\n let regex = new RegExp(`^${escapeRegex(keyword)}`, 'i');\r\n\r\n let matchIndices = [];\r\n let item;\r\n\r\n // These are all the possible matches\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n item = p.items[i];\r\n if (regex.test(item[labelProp])) {\r\n matchIndices.push(i);\r\n }\r\n }\r\n\r\n // Did we find anything?\r\n if (!matchIndices.length) {\r\n // No... So start over with this character as the only one.\r\n keyword = character;\r\n regex = new RegExp(`^${escapeRegex(keyword)}`, 'i');\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n item = p.items[i];\r\n if (regex.test(item[labelProp])) {\r\n matchIndices.push(i);\r\n }\r\n }\r\n }\r\n\r\n let focusItemIndex = p.focusItemIndex;\r\n let matchIndex = -1;\r\n\r\n // Find a match *after* the focused item\r\n for (let i = 0, count = matchIndices.length; i < count; i++) {\r\n if (matchIndices[i] >= focusItemIndex) {\r\n matchIndex = matchIndices[i];\r\n break;\r\n }\r\n }\r\n\r\n // Find a match from the beginning.\r\n if (matchIndex === -1 && matchIndices.length) {\r\n matchIndex = matchIndices[0];\r\n }\r\n\r\n if (matchIndex > -1) {\r\n let next = p.virtualListHelper.getItemElementAt(matchIndex);\r\n this._focus(evt, next || null, matchIndex);\r\n\r\n if (!this.isVisible()) {\r\n this.triggerItemSelection(evt);\r\n }\r\n\r\n // Record the last filter used\r\n p.previousFilter = keyword;\r\n\r\n // Clear the last filter - a second from now.\r\n p.filterTimer = setTimeout(() => {\r\n delete p.previousFilter;\r\n }, 1000);\r\n\r\n } else {\r\n delete p.previousFilter;\r\n }\r\n }\r\n\r\n _focus(event, itemEl, itemIndex) {\r\n const p = this._p;\r\n\r\n if (!itemIndex && itemEl) {\r\n itemIndex = p.virtualListHelper.getItemIndexFromElement(itemEl);\r\n }\r\n\r\n if (itemIndex > -1) {\r\n this.scrollItemIndexIntoView(itemIndex);\r\n } else if (itemIndex === undefined) {\r\n itemEl = null;\r\n }\r\n\r\n let focusItemEl = itemEl || p.virtualListHelper.getItemElementAt(itemIndex);\r\n if (!focusItemEl || focusItemEl[ItemSymbol]._nointeraction) {\r\n this.blurFocusedItem();\r\n return;\r\n }\r\n\r\n if (focusItemEl === p.focusItemEl) {\r\n clearTimeout(p.blurTimer);\r\n return;\r\n }\r\n\r\n this.blurFocusedItem();\r\n\r\n focusItemEl.classList.add(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = focusItemEl;\r\n p.focusItemIndex = itemIndex;\r\n\r\n const item = p.items[itemIndex];\r\n this._trigger('itemfocus', { value: item[p.valueProp], item: item, event: event });\r\n }\r\n\r\n _delayBlur() {\r\n if (this[DestroyedSymbol])\r\n return;\r\n\r\n const p = this._p;\r\n\r\n clearTimeout(p.blurTimer);\r\n\r\n p.blurTimer = setTimeout(() => {\r\n if (this[DestroyedSymbol]) return;\r\n this.blurFocusedItem();\r\n }, p.itemBlurDelay);\r\n }\r\n\r\n _move(direction, event) {\r\n const p = this._p;\r\n\r\n let next, nextIndex, directionUp = false;\r\n\r\n if (direction === 'first') {\r\n nextIndex = 0;\r\n directionUp = false;\r\n } else if (direction === 'last') {\r\n nextIndex = p.items.length - 1;\r\n directionUp = true;\r\n } else if (direction === 'prev') {\r\n if (!this.hasFocusedItem())\r\n return this._move('last', event);\r\n\r\n nextIndex = p.focusItemIndex - 1;\r\n if (nextIndex === -1) {\r\n nextIndex = p.items.length - 1;\r\n }\r\n\r\n directionUp = true;\r\n } else if (direction === 'next') {\r\n if (!this.hasFocusedItem())\r\n return this._move('first', event);\r\n\r\n nextIndex = p.focusItemIndex + 1;\r\n if (nextIndex === p.items.length) {\r\n nextIndex = 0;\r\n }\r\n\r\n directionUp = false;\r\n } else if (direction === 'prev_page' || direction === 'next_page') {\r\n\r\n if (!this.hasFocusedItem()) {\r\n return this._move(direction === 'prev_page' ? 'prev' : 'next', event);\r\n }\r\n\r\n if ((direction === 'prev_page' && this.isFirstItem()) ||\r\n (direction === 'next_page' && this.isLastItem())) return;\r\n\r\n if (this._hasScroll()) {\r\n\r\n if (p.virtualListHelper.isVirtual()) {\r\n let visibleItemCount = p.virtualListHelper.getVisibleItemCount();\r\n\r\n nextIndex = p.focusItemIndex;\r\n\r\n if (direction === 'prev_page') {\r\n nextIndex -= visibleItemCount;\r\n } else {\r\n nextIndex += visibleItemCount;\r\n }\r\n\r\n if (nextIndex < 0) {\r\n nextIndex = 0;\r\n } else if (nextIndex >= p.items.length) {\r\n nextIndex = p.items.length;\r\n }\r\n } else if (p.focusItemEl) {\r\n let base = getElementOffset(p.focusItemEl).top;\r\n let height = getElementHeight(p.el, true);\r\n\r\n while (true) { // eslint-disable-line no-constant-condition\r\n next = p.focusItemEl.nextElementSibling;\r\n if (!next) return;\r\n if (next.tagName !== 'LI') continue;\r\n\r\n if (direction === 'prev_page') {\r\n if (getElementOffset(next).top - base + height <= 0)\r\n break;\r\n } else {\r\n if (getElementOffset(next).top - base - height >= 0)\r\n break;\r\n }\r\n }\r\n\r\n if (next) {\r\n nextIndex = p.virtualListHelper.getItemIndexFromElement(next);\r\n\r\n if (nextIndex === undefined)\r\n nextIndex = -1;\r\n }\r\n }\r\n\r\n } else {\r\n return this._move(direction === 'prev_page' ? 'first' : 'last', event);\r\n }\r\n\r\n directionUp = direction === 'prev_page';\r\n } else {\r\n return;\r\n }\r\n\r\n let itemCount = p.items.length;\r\n\r\n if (nextIndex >= itemCount) {\r\n return;\r\n }\r\n\r\n let item = p.items[nextIndex];\r\n // noinspection UnnecessaryLocalVariableJS\r\n let startedAtIndex = nextIndex;\r\n\r\n while (item && item._nointeraction) {\r\n if (directionUp) {\r\n nextIndex--;\r\n if (nextIndex === -1) {\r\n nextIndex = itemCount;\r\n }\r\n } else {\r\n nextIndex++;\r\n if (nextIndex === itemCount) {\r\n nextIndex = 0;\r\n }\r\n }\r\n\r\n item = p.items[nextIndex];\r\n\r\n if (nextIndex === startedAtIndex) {\r\n break;\r\n }\r\n }\r\n\r\n next = p.virtualListHelper.getItemElementAt(nextIndex);\r\n this._focus(event, next || null, nextIndex);\r\n\r\n if (!this.isVisible()) {\r\n this.triggerItemSelection(event);\r\n }\r\n }\r\n\r\n _hasScroll() {\r\n return this.el.clientHeight < this.el.scrollHeight;\r\n }\r\n\r\n _updateGroupStateForItem(item) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (p.multi && p.autoCheckGroupChildren) {\r\n\r\n let items, groupIndex, itemIndex;\r\n\r\n if (item._group) {\r\n // Now loop through children below the group\r\n\r\n items = p.items;\r\n groupIndex = items.indexOf(item);\r\n\r\n let affectedItems = 0;\r\n\r\n for (let i = groupIndex + 1, len = items.length; i < len; i++) {\r\n let next = items[i];\r\n\r\n // Hit the next group, break out\r\n if (next._group || (!next._child && items[i - 1]._child))\r\n break;\r\n\r\n // No change, skip\r\n if (!!next._checked === item._checked)\r\n continue;\r\n\r\n // Update state\r\n next._checked = item._checked;\r\n\r\n affectedItems++;\r\n\r\n // Update DOM\r\n let nextEl = p.virtualListHelper.getItemElementAt(i);\r\n if (nextEl) {\r\n toggleClass(nextEl, `${p.baseClassName}__item_checked`, item._checked);\r\n }\r\n\r\n // Fire event\r\n this._trigger('check', { value: next[valueProp], item: next, isCheckingGroup: true });\r\n }\r\n\r\n // Fire event\r\n this._trigger('groupcheck', { value: item[valueProp], item: item, affectedItems: affectedItems });\r\n } else if (p.groupCount > 0) {\r\n items = p.items;\r\n itemIndex = items.indexOf(item);\r\n groupIndex = -1;\r\n\r\n // Find the group index\r\n for (let i = itemIndex - 1; i >= 0; i--) {\r\n if (items[i]._group) {\r\n groupIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (groupIndex > -1) {\r\n this._updateGroupCheckedState(groupIndex, true);\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n _updateGroupCheckedState(groupIndex, fireEvents) {\r\n const p = this._p;\r\n\r\n if (p.multi && p.autoCheckGroupChildren && groupIndex > -1) {\r\n\r\n let items = p.items;\r\n let groupItem = items[groupIndex];\r\n if (!groupItem || !groupItem._group) return this;\r\n\r\n let item, hasChecked = false, hasUnchecked = false;\r\n\r\n for (let i = groupIndex + 1, len = items.length; i < len; i++) {\r\n item = items[i];\r\n\r\n // Hit the next group, break out\r\n if (item._group || (!item._child && items[i - 1]._child))\r\n break;\r\n\r\n if (item._checked) {\r\n hasChecked = true;\r\n } else if (!item._checked) {\r\n hasUnchecked = true;\r\n }\r\n }\r\n\r\n // See if we need to update the group\r\n let shouldCheckGroup = hasChecked && !hasUnchecked;\r\n if (!!groupItem._checked !== shouldCheckGroup) {\r\n // Update state\r\n groupItem._checked = shouldCheckGroup;\r\n\r\n // Update DOM\r\n let nextEl = p.virtualListHelper.getItemElementAt(groupIndex);\r\n if (nextEl) {\r\n toggleClass(nextEl, `${p.baseClassName}__item_checked`, groupItem._checked);\r\n }\r\n\r\n if (fireEvents) {\r\n // Fire event\r\n this._trigger('check', { value: groupItem[p.valueProp], item: groupItem });\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {DropList} self\r\n */\r\n _measureItem() {\r\n const p = this._p;\r\n\r\n if (p.lastMeasureItemCount !== p.items.length) {\r\n const labelProp = p.labelProp, valueProp = p.valueProp;\r\n let longestLabel = p.lastMeasureLongestLabel || 1,\r\n longestLabelText = p.lastMeasureLongestLabelText || '';\r\n\r\n for (let i = 0, items = p.items, count = items.length;\r\n i < count;\r\n i++) {\r\n\r\n const item = items[i];\r\n let text = item[labelProp];\r\n if (text == null)\r\n text = item[valueProp];\r\n if (text == null)\r\n text = '';\r\n\r\n let length = text.length;\r\n if (length > longestLabel) {\r\n longestLabel = length;\r\n longestLabelText = text;\r\n }\r\n }\r\n\r\n p.lastMeasureItemCount = p.items.length;\r\n p.lastMeasureLongestLabel = longestLabel;\r\n p.lastMeasureLongestLabelText = longestLabelText;\r\n }\r\n\r\n if (p.estimateWidth || p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.createGhostItemElement(GhostSymbol, true, itemEl => {\r\n p.lastMeasureItemWidth = getElementWidth(itemEl, true, true);\r\n });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Determines whether the list should be in virtual mode, depending on the item count.\r\n * @param {number?} targetItemCount - item count we are expecting. Defaults to current item count\r\n * @returns {DropList}\r\n * @private\r\n */\r\n _determineVirtualMode(targetItemCount) {\r\n const p = this._p;\r\n\r\n let items = p.items;\r\n if (targetItemCount === undefined) {\r\n targetItemCount = items.length;\r\n }\r\n\r\n let shouldBeVirtual = targetItemCount >= p.virtualMinItems;\r\n\r\n if (shouldBeVirtual !== p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.setVirtual(shouldBeVirtual).render();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n _renderItemContent(item, itemEl) {\r\n const p = this._p, labelProp = p.labelProp;\r\n\r\n // NOTE: a \"measure\" item will not have full data of original item.\r\n // so for a custom renderer - we try to send original item, and fallback to our private list item.\r\n\r\n if (!p.renderItem || p.renderItem(item[ItemSymbol] || item, itemEl) === false) {\r\n itemEl.appendChild(createElement('span', {\r\n class: `${p.baseClassName}__item_label`,\r\n textContent: item[labelProp],\r\n }));\r\n\r\n if (p.multi) {\r\n if (!item._nocheck) {\r\n itemEl.insertBefore(\r\n createElement('span', { class: 'checkbox' }),\r\n itemEl.firstChild,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.PositionOptions} [positionOptions=undefined]\r\n * @returns {number} new outer width\r\n * @private\r\n */\r\n _updateWidth(positionOptions) {\r\n const p = this._p, el = p.el;\r\n\r\n let targetWidth = 0;\r\n\r\n if (positionOptions) {\r\n // Measure target\r\n targetWidth = positionOptions.targetWidth;\r\n if (targetWidth == null) {\r\n targetWidth = getElementWidth(positionOptions.target, true, true);\r\n }\r\n }\r\n\r\n let autoWidth = 0;\r\n if (!p.useExactTargetWidth) {\r\n if (p.estimateWidth || p.virtualListHelper.isVirtual()) {\r\n autoWidth = p.lastMeasureItemWidth;\r\n } else {\r\n el.style.width = ''; // Reset width\r\n autoWidth = getElementWidth(el, true, true);\r\n }\r\n }\r\n\r\n let newOuterWidth = Math.max(autoWidth, targetWidth);\r\n\r\n setElementWidth(el, newOuterWidth, true, true);\r\n\r\n const elComputedStyle = getComputedStyle(el);\r\n let bordersWidth = (parseFloat(elComputedStyle.borderLeftWidth) || 0) + (parseFloat(elComputedStyle.borderRightWidth) || 0);\r\n let scrollWidth = el.scrollWidth + bordersWidth;\r\n if (scrollWidth > newOuterWidth) {\r\n // consider scrollWidth delta\r\n let delta = scrollWidth - newOuterWidth;\r\n el.style.width = `${parseFloat(el.style.width) + delta}px`;\r\n newOuterWidth = scrollWidth;\r\n }\r\n\r\n return newOuterWidth;\r\n }\r\n}\r\n\r\nexport default DropList;\r\n","const throttle = (func, wait, options) => {\r\n let timeout, context, args, result;\r\n let previous = 0;\r\n if (!options) options = {};\r\n\r\n const later = () => {\r\n previous = options.leading === false ? 0 : Date.now();\r\n timeout = null;\r\n result = func.apply(context, args);\r\n if (!timeout) context = args = null;\r\n };\r\n\r\n const throttled = function () {\r\n const now = Date.now();\r\n if (!previous && options.leading === false)\r\n previous = now;\r\n\r\n const remaining = wait - (now - previous);\r\n context = this;\r\n args = arguments;\r\n if (remaining <= 0 || remaining > wait) {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n timeout = null;\r\n }\r\n previous = now;\r\n result = func.apply(context, args);\r\n if (!timeout) context = args = null;\r\n } else if (!timeout && options.trailing !== false) {\r\n timeout = setTimeout(later, remaining);\r\n }\r\n return result;\r\n };\r\n\r\n throttled.cancel = () => {\r\n clearTimeout(timeout);\r\n previous = 0;\r\n timeout = context = args = null;\r\n };\r\n\r\n throttled.isScheduled = () => {\r\n return !!timeout;\r\n };\r\n\r\n return throttled;\r\n};\r\n\r\nexport default throttle;\r\n","import {\r\n getCssProps,\r\n getElementWidth,\r\n setElementWidth,\r\n getPseudoElementWidth,\r\n setCssProps,\r\n} from '@danielgindi/dom-utils/lib/Css';\r\nimport escapeRegex from './utils/escapeRegex';\r\nimport {\r\n closestUntil,\r\n createElement,\r\n next,\r\n prev,\r\n setElementAttrs,\r\n} from '@danielgindi/dom-utils/lib/Dom';\r\nimport {\r\n append,\r\n getRootNode,\r\n before,\r\n remove,\r\n toggleClass,\r\n} from '@danielgindi/dom-utils/lib/DomCompat';\r\n\r\nimport DomEventsSink from '@danielgindi/dom-utils/lib/DomEventsSink';\r\nimport DropList from './DropList';\r\nimport throttle from './utils/throttle';\r\nimport {\r\n VALUE_BACK_SPACE,\r\n VALUE_DELETE, VALUE_DOWN, VALUE_ENTER,\r\n VALUE_ESCAPE,\r\n VALUE_LEFT, VALUE_PAGE_DOWN,\r\n VALUE_PAGE_UP,\r\n VALUE_RIGHT, VALUE_SPACE,\r\n VALUE_TAB,\r\n VALUE_UP,\r\n} from 'keycode-js';\r\nimport mitt from 'mitt';\r\n\r\nconst ItemSymbol = Symbol('item');\r\nconst DestroyedSymbol = Symbol('destroyed');\r\nconst NoResultsItemSymbol = Symbol('no_results_items');\r\nconst RestMultiItemsSymbol = Symbol('rest_multi_items');\r\n\r\nconst hasTouchCapability = !!('ontouchstart' in window\r\n || (window.DocumentTouch && window.document instanceof window.DocumentTouch)\r\n || window.navigator.maxTouchPoints\r\n);\r\n\r\n/**\r\n * @param {Element|EventTarget} el\r\n * @param {string} className\r\n * @returns {boolean}\r\n */\r\nconst hasClass = function (el, className) {\r\n if (el instanceof Element) {\r\n return el.classList.contains(className);\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst inputBackbufferCssProps = [\r\n 'font-family',\r\n 'font-size',\r\n 'font-weight',\r\n 'font-size',\r\n 'letter-spacing',\r\n 'text-transform',\r\n 'word-spacing',\r\n 'text-indent',\r\n 'box-sizing',\r\n 'padding-left',\r\n 'padding-right',\r\n];\r\n\r\n/**\r\n * @typedef {Object} SelectBox.Options\r\n * @property {DropList.Options} [listOptions] options to pass to the `DropList`\r\n * @property {Element} [el] An element to attach to, instead of creating a new one\r\n * @property {string} [baseClassName='selectbox'] class name for the menu root element\r\n * @property {boolean} [disabled=false] Should start as disabled?\r\n * @property {boolean} [clearable=true] Has clear button?\r\n * @property {boolean} [hasOpenIndicator=true] has open/close indicator?\r\n * @property {string} [placeholder=''] Placeholder text\r\n * @property {boolean} [sortSelectedItems=true] Should the selected items be sorted?\r\n * @property {boolean} [sortListItems=true] Sort list items\r\n * @property {boolean} [sortListCheckedFirst=true] When sorting - put checked items first (applicable to `multi` mode only)\r\n * @property {*[]} [stickyValues]\r\n * @property {function(a: DropList.ItemBase, b: DropList.ItemBase):number} [sortItemComparator]\r\n * @property {boolean} [splitListCheckedGroups=true] Split groups to \"checked\" and \"unchecked\", works with `sortCheckedFirst` only\r\n * @property {boolean|'touch'} [blurOnSingleSelection='touch']\r\n * @property {boolean} [multi=false] can multiple values be selected?\r\n * @property {boolean} [showSelection=true] show selection? if false, the placeholder will take effect\r\n * @property {function(items: DropList.ItemBase[]):string} [multiPlaceholderFormatter] formatter for placeholder for multi items mode\r\n * @property {boolean} [searchable=false] is it searchable?\r\n * @property {string} [noResultsText='No matching results'] text for no results (empty for none)\r\n * @property {number} [filterThrottleWindow=300] throttle time (milliseconds) for filtering\r\n * @property {boolean} [filterOnEmptyTerm=false] call the filter function on empty search term too\r\n * @property {string} [labelProp='label']\r\n * @property {string} [valueProp='value']\r\n * @property {string} [multiItemLabelProp='short_label']\r\n * @property {number} [maxMultiItems] maximum number of multi items. The rest will get a single item to represent.\r\n * @property {function(count: number, items: DropList.ItemBase[]):string} [multiItemsRestLabelProvider] label for the item representing the rest of the items.\r\n * @property {DropList.ItemBase[]|null} [items] initial items\r\n * @property {*[]|null} [selectedValues] initial selected values\r\n * @property {*|*[]|null} [value] initial selected value\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderSingleItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderSingleItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderRestMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderRestMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderNoResultsItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderNoResultsItem]\r\n * @property {function(items: DropList.ItemBase[], term: string):(DropList.ItemBase[]|null)} [filterFn]\r\n * @property {function(name: string, ...args)} [on]\r\n * @property {string|string[]} [additionalClasses]\r\n * @property {boolean} [isLoadingMode]\r\n * */\r\nconst defaultOptions = {\r\n el: null,\r\n baseClassName: 'selectbox',\r\n disabled: false,\r\n clearable: true,\r\n hasOpenIndicator: true,\r\n placeholder: '',\r\n sortSelectedItems: true,\r\n sortListItems: true,\r\n sortListCheckedFirst: true,\r\n stickyValues: null,\r\n sortItemComparator: null,\r\n splitListCheckedGroups: true,\r\n blurOnSingleSelection: 'touch',\r\n multi: false,\r\n showSelection: true,\r\n multiPlaceholderFormatter: null,\r\n searchable: true,\r\n noResultsText: 'No matching results',\r\n filterThrottleWindow: 300,\r\n filterOnEmptyTerm: false,\r\n labelProp: 'label',\r\n valueProp: 'value',\r\n multiItemLabelProp: 'short_label',\r\n maxMultiItems: null,\r\n multiItemsRestLabelProvider: null,\r\n items: [],\r\n selectedValues: undefined,\r\n value: undefined,\r\n isLoadingMode: false,\r\n};\r\n\r\n/**\r\n *\r\n * @param {DropList.ItemBase[]} items\r\n * @param {string} labelProp\r\n * @returns {string}\r\n */\r\nconst defaultMultiPlaceholderFormatter = (items, labelProp) => {\r\n if (items.length === 0)\r\n return '';\r\n\r\n let title = items[0][labelProp] + '';\r\n\r\n if (items.length > 1) {\r\n title += ` (+${items.length - 1})`;\r\n }\r\n\r\n return title;\r\n};\r\n\r\n/*\r\nEmits the following events:\r\n---------------------------\r\n\r\n'clear:before' {cancel: false}: will clear the whole selection. return false to abort.\r\n'clear': clearead the whole selection.\r\n'open' { list: DropList }: the drop list is opening\r\n'open:before' { list: DropList }: the drop list will open\r\n'close': the drop list is closing\r\n'addsel:before' {value, item, cancel: false}: an item selection is about to be added (in multi mode). return false to abort.\r\n'removesel:before' {value, item, cancel: false}: an item selection is about to be removed (in multi mode). return false to abort.\r\n'select:before' {value, item, cancel: false}: an item is about to be selected (in single mode). return false to abort.\r\n'addsel' {value, item}: an item selection has been added (in multi mode)\r\n'removesel' {value, item}: an item selection has been removed (in multi mode)\r\n'select' {value, item}: an item has been selected (in single mode)\r\n'search' {value}: input box value has changed\r\n'search:focus': input box has gained focus\r\n'search:blur': input box has lost focus\r\n'input:resize': input box resized\r\n'itemschanged' {term, mutated, count}: the current set of items has changed\r\n */\r\n\r\n// noinspection JSUnusedGlobalSymbols\r\nclass SelectBox {\r\n /**\r\n * @param {SelectBox.Options} options\r\n */\r\n constructor(options) {\r\n const o = { ...defaultOptions };\r\n\r\n for (let [key, value] of Object.entries(/**@type Object*/options))\r\n if (value !== undefined)\r\n o[key] = value;\r\n\r\n const p = this._p = {\r\n ownsEl: true,\r\n\r\n baseClassName: o.baseClassName,\r\n\r\n listOptions: o.listOptions,\r\n\r\n disabled: !!o.disabled,\r\n clearable: !!o.clearable,\r\n hasOpenIndicator: !!o.hasOpenIndicator,\r\n placeholder: o.placeholder,\r\n sortSelectedItems: !!o.sortSelectedItems,\r\n sortListItems: !!o.sortListItems,\r\n sortListCheckedFirst: !!o.sortListCheckedFirst,\r\n stickyValues: Array.isArray(o.stickyValues) ? new Set(o.stickyValues) : null,\r\n sortItemComparator: o.sortItemComparator,\r\n splitListCheckedGroups: !!o.splitListCheckedGroups,\r\n blurOnSingleSelection: o.blurOnSingleSelection,\r\n multi: o.multi,\r\n showSelection: o.showSelection,\r\n multiPlaceholderFormatter: o.multiPlaceholderFormatter,\r\n searchable: o.searchable,\r\n noResultsText: o.noResultsText,\r\n filterThrottleWindow: o.filterThrottleWindow,\r\n filterOnEmptyTerm: o.filterOnEmptyTerm,\r\n\r\n labelProp: o.labelProp,\r\n valueProp: o.valueProp,\r\n multiItemLabelProp: o.multiItemLabelProp,\r\n\r\n maxMultiItems: o.maxMultiItems,\r\n multiItemsRestLabelProvider: o.multiItemsRestLabelProvider,\r\n\r\n renderSingleItem: o.renderSingleItem,\r\n unrenderSingleItem: o.unrenderSingleItem,\r\n renderMultiItem: o.renderMultiItem,\r\n unrenderMultiItem: o.unrenderMultiItem,\r\n renderRestMultiItem: o.renderRestMultiItem,\r\n unrenderRestMultiItem: o.unrenderRestMultiItem,\r\n renderNoResultsItem: o.renderNoResultsItem,\r\n unrenderNoResultsItem: o.unrenderNoResultsItem,\r\n filterFn: o.filterFn,\r\n on: o.on || null,\r\n silenceEvents: true,\r\n mitt: mitt(),\r\n additionalClasses: o.additionalClasses,\r\n\r\n isLoadingMode: !!o.isLoadingMode,\r\n\r\n items: [],\r\n filteredItems: null,\r\n itemsChanged: true,\r\n\r\n sink: new DomEventsSink(),\r\n\r\n /** @type ResizeObserver */\r\n resizeObserver: null,\r\n\r\n selectedItems: [],\r\n selectedValues: [],\r\n selectionChanged: true,\r\n resortBySelectionNeeded: false,\r\n\r\n throttledUpdateListItems: throttle(() => this._updateListItems(),\r\n o.filterThrottleWindow,\r\n { leading: true, trailing: true }),\r\n\r\n filterTerm: '',\r\n };\r\n\r\n let el = o.el;\r\n if (el instanceof Element) {\r\n p.ownsEl = false;\r\n } else {\r\n el = createElement('span');\r\n }\r\n\r\n setElementAttrs(el, {\r\n role: 'combobox',\r\n 'aria-haspopup': 'true',\r\n 'aria-expanded': 'false',\r\n });\r\n p.el = el;\r\n\r\n this._syncBaseClasses();\r\n this._renderBase();\r\n\r\n /** @type Element[] */\r\n p.multiItemEls = [];\r\n\r\n this.enable(!p.disabled);\r\n\r\n this._setupDropdownMenu();\r\n\r\n // --- Hook click\r\n p.sink\r\n .add(el, 'click', (evt) => {\r\n if (p.clearButtonWrapper && p.clearButtonWrapper.contains(evt.target)) {\r\n return;\r\n }\r\n\r\n if (!el.contains(document.activeElement)) {\r\n p.input.focus();\r\n // Go to end of input\r\n p.input.selectionStart = p.input.selectionEnd = p.input.value.length;\r\n }\r\n });\r\n\r\n // --- Handle default focus directly to search box\r\n p.sink.add(el, 'focus', evt => {\r\n const target = (/**Element*/evt.target);\r\n\r\n if (!el.contains(evt.relatedTarget) &&\r\n !hasClass(target, `${p.baseClassName}__search_field`) &&\r\n !hasClass(target, `${p.baseClassName}__item`)) {\r\n let field = el.querySelector(`.${p.baseClassName}__search_field`);\r\n field && field.focus();\r\n }\r\n }, true);\r\n\r\n p.sink\r\n .add(p.input, 'keydown', (/**KeyboardEvent*/event) => {\r\n this._handleInputKeydown(event);\r\n })\r\n .add(p.input, 'input', () => {\r\n this._resizeInput();\r\n });\r\n\r\n const focusInOutHandler = (() => {\r\n let t;\r\n return () => {\r\n if (t) {\r\n clearTimeout(t);\r\n }\r\n t = setTimeout(() => {\r\n toggleClass(el, `${p.baseClassName}__focus`, el.contains(document.activeElement));\r\n });\r\n };\r\n })();\r\n p.sink.add(el, 'focus', focusInOutHandler, true);\r\n p.sink.add(el, 'blur', focusInOutHandler, true);\r\n\r\n // --- Resize input on window change\r\n p.sink.add(window, 'resize', () => this._resizeInput());\r\n p.sink.add(window, 'orientationchange', () => this._resizeInput());\r\n\r\n if (window.ResizeObserver !== undefined) {\r\n p.resizeObserver = new ResizeObserver(() => {\r\n this._resizeInput();\r\n });\r\n p.resizeObserver.observe(p.el);\r\n }\r\n\r\n this.setItems(o.items);\r\n\r\n if (o.multi && Array.isArray(o.selectedValues)) {\r\n this.setSelectedValues(o.selectedValues);\r\n } else if (o.value != null) {\r\n this.setValue(o.value);\r\n }\r\n\r\n this._scheduleSync();\r\n\r\n this.silenceEvents = false;\r\n\r\n return this;\r\n }\r\n\r\n destroy() {\r\n if (this[DestroyedSymbol])\r\n return;\r\n this[DestroyedSymbol] = true;\r\n\r\n const p = this._p;\r\n\r\n if (p.syncTimeout) {\r\n clearTimeout(p.syncTimeout);\r\n delete p.syncTimeout;\r\n }\r\n\r\n this._stopTrackingPresence();\r\n\r\n p.sink.remove();\r\n p.dropList && p.dropList.destroy();\r\n\r\n if (p.throttledUpdateListItems)\r\n p.throttledUpdateListItems.cancel();\r\n\r\n this._cleanupSingleWrapper();\r\n\r\n if (p.unrenderMultiItem || p.unrenderRestMultiItem) {\r\n // Remove all item elements\r\n while (p.multiItemEls.length > 0) {\r\n // use fast path by removing in reverse\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n }\r\n }\r\n\r\n remove(p.list);\r\n remove(p.singleWrapper);\r\n remove(p.input);\r\n remove(p.inputBackBuffer);\r\n remove(p.clearButtonWrapper);\r\n remove(p.openIndicator);\r\n\r\n if (!p.ownsEl) {\r\n for (let name of Array.from(p.el.classList)) {\r\n if (name.startsWith(p.baseClassName)) {\r\n p.el.classList.remove(name);\r\n }\r\n }\r\n p.el.removeAttribute('role');\r\n p.el.removeAttribute('aria-haspopup');\r\n p.el.removeAttribute('aria-expanded');\r\n }\r\n\r\n p.resizeObserver?.disconnect();\r\n\r\n this._p = null;\r\n }\r\n\r\n get el() {\r\n return this._p.el;\r\n }\r\n\r\n /**\r\n * Enables the control\r\n * @param {boolean=true} enabled Should the control be enabled?\r\n * @returns {SelectBox}\r\n */\r\n enable(enabled) {\r\n const p = this._p;\r\n\r\n if (enabled === undefined) {\r\n enabled = true;\r\n }\r\n p.disabled = !enabled;\r\n p.el.setAttribute('aria-disabled', p.disabled.toString());\r\n p.input.disabled = !!p.disabled;\r\n\r\n const multiItemEls = p.multiItemEls;\r\n\r\n for (let itemEl of multiItemEls) {\r\n if (p.disabled) {\r\n itemEl.removeAttribute('tabindex');\r\n } else {\r\n itemEl.setAttribute('tabindex', '0');\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Is the control enabled?\r\n * @returns {boolean}\r\n */\r\n isEnabled() {\r\n return !this._p.disabled;\r\n }\r\n\r\n /**\r\n * Disables the control\r\n * @param {boolean=true} disabled Should the control be disabled?\r\n * @returns {SelectBox}\r\n */\r\n disable(disabled) {\r\n return this.enable(disabled === undefined ? false : !disabled);\r\n }\r\n\r\n /**\r\n * Is the control disabled?\r\n * @returns {boolean}\r\n */\r\n isDisabled() {\r\n return this._p.disabled;\r\n }\r\n\r\n /**\r\n * @param {string|string[]} classes\r\n * @returns {SelectBox}\r\n */\r\n setAdditionalClasses(classes) {\r\n const p = this._p;\r\n p.additionalClasses = classes;\r\n this._syncBaseClasses();\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.ItemBase[]} [items]\r\n * @param {boolean} [resetValues=true] should reset values to current values (essentially refresh the data based on items & values). If set to false, use setValue to set a fresh value\r\n * @returns {SelectBox}\r\n */\r\n setItems(items, resetValues = true) {\r\n const p = this._p;\r\n\r\n if (!items)\r\n items = [];\r\n\r\n p.items = items.slice(0);\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n\r\n if (resetValues) {\r\n this.setSelectedValues(this.getSelectedValues());\r\n }\r\n\r\n this._trigger('itemschanged', { term: null, mutated: true, count: this.getFilteredItemCount() });\r\n\r\n return this;\r\n }\r\n\r\n getFilteredItemCount() {\r\n const p = this._p;\r\n\r\n if (p.filteredItems)\r\n return p.filteredItems.length;\r\n\r\n if (p.items)\r\n return p.items.length;\r\n\r\n return 0;\r\n }\r\n\r\n isFilterPending() {\r\n const p = this._p;\r\n\r\n return !!(p.throttledUpdateListItems.isScheduled() ||\r\n (!p.filteredItems && (p.filterTerm || (p.filterOnEmptyTerm && p.filterFn))));\r\n }\r\n\r\n updateItemByValue(value, newItem) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n let existingItem = p.items.find(x => x[valueProp] === value);\r\n if (existingItem)\r\n Object.assign(existingItem, newItem);\r\n\r\n if (p.dropList) {\r\n p.dropList.updateItemByValue(value, newItem);\r\n }\r\n }\r\n\r\n /**\r\n * @returns {DropList.ItemBase[]|*}\r\n */\r\n getItems() {\r\n const p = this._p;\r\n return p.items;\r\n }\r\n\r\n /**\r\n * @param {boolean} clearable\r\n * @returns {SelectBox}\r\n */\r\n setClearable(clearable) {\r\n clearable = !!clearable;\r\n\r\n if (this._p.clearable === clearable)\r\n return this;\r\n\r\n this._p.clearable = !!clearable;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getClearable() {\r\n return this._p.clearable;\r\n }\r\n\r\n /**\r\n * @param {boolean} enabled\r\n * @returns {SelectBox}\r\n */\r\n setHasOpenIndicator(enabled) {\r\n enabled = !!enabled;\r\n\r\n if (this._p.hasOpenIndicator === enabled)\r\n return this;\r\n\r\n this._p.hasOpenIndicator = enabled;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getHasOpenIndicator() {\r\n return this._p.hasOpenIndicator;\r\n }\r\n\r\n /**\r\n * @param {string} placeholder\r\n * @returns {SelectBox}\r\n */\r\n setPlaceholder(placeholder) {\r\n this._p.placeholder = placeholder == null ? '' : String(placeholder);\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n getPlaceHolder() {\r\n return this._p.placeholder;\r\n }\r\n\r\n /**\r\n * @param {string} term\r\n * @param {boolean} [performSearch=false] should actually perform the search, or just set the input's text?\r\n * @returns {SelectBox}\r\n */\r\n setSearchTerm(term, performSearch = false) {\r\n const p = this._p;\r\n\r\n if (!p.input) return this;\r\n\r\n p.input.value = term;\r\n\r\n this._scheduleSync('resize_input');\r\n\r\n if (performSearch) {\r\n p.filterTerm = p.input.value.trim();\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n\r\n this._trigger('search', { value: p.input.value });\r\n p.throttledUpdateListItems();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n getSearchTerm() {\r\n const p = this._p;\r\n if (p.input)\r\n return p.input.value;\r\n return '';\r\n }\r\n\r\n /**\r\n * @param {boolean} sortSelectedItems\r\n * @returns {SelectBox}\r\n */\r\n setSortSelectedItems(sortSelectedItems) {\r\n const p = this._p;\r\n sortSelectedItems = !!sortSelectedItems;\r\n if (p.sortSelectedItems === sortSelectedItems)\r\n return this;\r\n\r\n p.sortSelectedItems = sortSelectedItems;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSortSelectedItemsEnabled() {\r\n return this._p.sortSelectedItems;\r\n }\r\n\r\n /**\r\n * @param {boolean} sortListItems\r\n * @returns {SelectBox}\r\n */\r\n setSortListItems(sortListItems) {\r\n const p = this._p;\r\n sortListItems = !!sortListItems;\r\n if (p.sortListItems === sortListItems)\r\n return this;\r\n\r\n p.sortListItems = sortListItems;\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSortListItemsEnabled() {\r\n return this._p.sortListItems;\r\n }\r\n\r\n /**\r\n * @param {boolean} sortListCheckedFirst\r\n * @returns {SelectBox}\r\n */\r\n setSortListCheckedFirst(sortListCheckedFirst) {\r\n const p = this._p;\r\n sortListCheckedFirst = !!sortListCheckedFirst;\r\n if (p.sortCheckedFirst === sortListCheckedFirst)\r\n return this;\r\n\r\n p.sortCheckedFirst = sortListCheckedFirst;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSortListCheckedFirstEnabled() {\r\n return this._p.sortListCheckedFirst;\r\n }\r\n\r\n /**\r\n * @param {*[]} values\r\n * @returns {SelectBox}\r\n */\r\n setStickyValues(values) {\r\n const p = this._p;\r\n\r\n p.stickyValues = Array.isArray(values) ? new Set(values) : null;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {*[]}\r\n */\r\n getStickyValues() {\r\n return this._p.stickyValues ? Array.from(this._p.stickyValues) : null;\r\n }\r\n\r\n /**\r\n * @param {function(a: DropList.ItemBase, b: DropList.ItemBase):number} comparator\r\n * @returns {SelectBox}\r\n */\r\n setSortItemComparator(comparator) {\r\n const p = this._p;\r\n if (p.sortItemComparator === comparator)\r\n return this;\r\n\r\n p.sortItemComparator = comparator;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {function(a: DropList.ItemBase, b: DropList.ItemBase):number}\r\n */\r\n getSortItemComparator() {\r\n return this._p.sortItemComparator;\r\n }\r\n\r\n /**\r\n * @param {boolean} splitListCheckedGroups\r\n * @returns {SelectBox}\r\n */\r\n setSplitListCheckedGroups(splitListCheckedGroups) {\r\n const p = this._p;\r\n splitListCheckedGroups = !!splitListCheckedGroups;\r\n if (p.splitListCheckedGroups === splitListCheckedGroups)\r\n return this;\r\n\r\n p.splitListCheckedGroups = splitListCheckedGroups;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSplitListCheckedGroupsEnabled() {\r\n return this._p.splitListCheckedGroups;\r\n }\r\n\r\n /**\r\n * @param {boolean} showSelection\r\n * @returns {SelectBox}\r\n */\r\n setShowSelection(showSelection) {\r\n const p = this._p;\r\n showSelection = !!showSelection;\r\n if (p.showSelection === showSelection)\r\n return this;\r\n\r\n this._p.showSelection = showSelection;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isShowSelectionEnabled() {\r\n return this._p.showSelection;\r\n }\r\n\r\n /**\r\n * @param {function(items: DropList.ItemBase[]):string} formatter\r\n * @returns {SelectBox}\r\n */\r\n setMultiPlaceholderFormatter(formatter) {\r\n const p = this._p;\r\n\r\n if (p.multiPlaceholderFormatter === formatter)\r\n return this;\r\n\r\n this._p.multiPlaceholderFormatter = formatter;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {boolean|'touch'} value\r\n * @returns {SelectBox}\r\n */\r\n setBlurOnSingleSelection(value) {\r\n const p = this._p;\r\n if (p.blurOnSingleSelection === value)\r\n return this;\r\n\r\n this._p.blurOnSingleSelection = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean|'touch'}\r\n */\r\n getBlurOnSingleSelection() {\r\n return this._p.blurOnSingleSelection;\r\n }\r\n\r\n /**\r\n * @param {boolean} multi\r\n * @returns {SelectBox}\r\n */\r\n setMulti(multi) {\r\n const p = this._p;\r\n multi = !!multi;\r\n if (p.multi === multi)\r\n return this;\r\n\r\n p.multi = multi;\r\n\r\n this._setupDropdownMenu();\r\n\r\n // move to correct parent\r\n remove(p.clearButtonWrapper);\r\n delete p.clearButtonWrapper;\r\n\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isMultiEnabled() {\r\n return this._p.multi;\r\n }\r\n\r\n /**\r\n * @param {boolean} searchable\r\n * @returns {SelectBox}\r\n */\r\n setSearchable(searchable) {\r\n const p = this._p;\r\n searchable = !!searchable;\r\n if (p.searchable === searchable)\r\n return this;\r\n\r\n p.searchable = searchable;\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSearchableEnabled() {\r\n return this._p.searchable;\r\n }\r\n\r\n /**\r\n * @param {string} noResultsText\r\n * @returns {SelectBox}\r\n */\r\n setNoResultsText(noResultsText) {\r\n this._p.noResultsText = noResultsText;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n getNoResultsText() {\r\n return this._p.noResultsText;\r\n }\r\n\r\n /**\r\n * @param {number} window\r\n * @returns {SelectBox}\r\n */\r\n setFilterThrottleWindow(window) {\r\n const p = this._p;\r\n p.filterThrottleWindow = window;\r\n\r\n let isScheduled = p.throttledUpdateListItems ? p.throttledUpdateListItems.isScheduled() : false;\r\n\r\n if (p.throttledUpdateListItems)\r\n p.throttledUpdateListItems.cancel();\r\n\r\n p.throttledUpdateListItems = throttle(() => this._updateListItems(), p.filterThrottleWindow, true);\r\n\r\n if (isScheduled)\r\n p.throttledUpdateListItems();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n getFilterThrottleWindow() {\r\n return this._p.filterThrottleWindow;\r\n }\r\n\r\n /**\r\n * @param {boolean} value\r\n * @returns {SelectBox}\r\n */\r\n setFilterOnEmptyTerm(value) {\r\n const p = this._p;\r\n p.filterOnEmptyTerm = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getFilterOnEmptyTerm() {\r\n return this._p.filterOnEmptyTerm;\r\n }\r\n\r\n /**\r\n * @param {DropList.Options} listOptions\r\n * @returns {SelectBox}\r\n */\r\n setListOptions(listOptions) {\r\n const p = this._p;\r\n p.listOptions = listOptions;\r\n this._setupDropdownMenu();\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox})|null\r\n */\r\n setRenderSingleItem(render, unrender) {\r\n const p = this._p;\r\n p.renderSingleItem = render;\r\n p.unrenderSingleItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox}\r\n */\r\n setRenderMultiItem(render, unrender) {\r\n const p = this._p;\r\n p.renderMultiItem = render;\r\n p.unrenderMultiItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox}\r\n */\r\n setRenderRestMultiItem(render, unrender) {\r\n const p = this._p;\r\n p.renderRestMultiItem = render;\r\n p.unrenderRestMultiItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox}\r\n */\r\n setRenderNoResultsItem(render, unrender) {\r\n const p = this._p;\r\n p.renderNoResultsItem = render;\r\n p.unrenderNoResultsItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {SelectBox}\r\n */\r\n setLabelProp(prop) {\r\n const p = this._p;\r\n p.labelProp = prop;\r\n\r\n\t\tif (p.dropList)\r\n\t\t\tp.dropList.setLabelProp(prop);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {SelectBox}\r\n */\r\n setValueProp(prop) {\r\n const p = this._p;\r\n p.valueProp = prop;\r\n\r\n\t\tif (p.dropList)\r\n\t\t\tp.dropList.setValueProp(prop);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {SelectBox}\r\n */\r\n setMultiItemLabelProp(prop) {\r\n const p = this._p;\r\n p.multiItemLabelProp = prop;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {number|null|undefined} value\r\n * @returns {SelectBox}\r\n */\r\n setMaxMultiItems(value) {\r\n const p = this._p;\r\n p.maxMultiItems = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {function(count: number, items: DropList.ItemBase[]):string|null|undefined} value\r\n * @returns {SelectBox}\r\n */\r\n setMultiItemsRestLabelProvider(value) {\r\n const p = this._p;\r\n p.multiItemsRestLabelProvider = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {function(items: DropList.ItemBase[], term: string):(DropList.ItemBase[]|null)} fn\r\n * @returns {SelectBox}\r\n */\r\n setFilterFn(fn) {\r\n const p = this._p;\r\n p.filterFn = fn;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {function(items: DropList.ItemBase[], term: string):(DropList.ItemBase[]|null)}\r\n */\r\n getFilterFn() {\r\n return this._p.filterFn;\r\n }\r\n\r\n /**\r\n * Focus on input element\r\n * @returns {SelectBox}\r\n */\r\n focusInput() {\r\n const p = this._p;\r\n\r\n if (p.input)\r\n p.input.focus();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remvoe focus from the input element\r\n * @returns {SelectBox}\r\n */\r\n blurInput() {\r\n const p = this._p;\r\n\r\n if (p.input)\r\n p.input.blur();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes all selected items\r\n * @returns {SelectBox}\r\n */\r\n clear() {\r\n const p = this._p;\r\n\r\n let clearEvt = { cancel: false };\r\n this._trigger('clear:before', clearEvt);\r\n if (clearEvt.cancel)\r\n return this;\r\n\r\n p.selectedItems = [];\r\n p.selectedValues = [];\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n\r\n this._trigger('clear');\r\n\r\n if (this[DestroyedSymbol]) return this; // destroyed by event handler\r\n\r\n this._updateListItems();\r\n\r\n this._setInputText('');\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a single value or an array of selected values - depending on `multi` prop\r\n * @public\r\n * @returns {*[]}\r\n */\r\n getValue() {\r\n const p = this._p;\r\n if (p.multi)\r\n return p.selectedValues.slice(0);\r\n else if (p.selectedValues.length > 0)\r\n return p.selectedValues[0];\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Selects the specified value or multiple values - depending on `multi` prop\r\n * @public\r\n * @param {*|*[]} value - if `multi`, then an array of values to select, otherwise - a single value to select\r\n * @returns {SelectBox}\r\n */\r\n setValue(value) {\r\n const p = this._p;\r\n if (p.multi)\r\n return this.setSelectedValues(Array.isArray(value) ? value : value !== undefined ? [value] : []);\r\n else\r\n return this.setSelectedValues(value !== undefined ? [value] : []);\r\n }\r\n\r\n /**\r\n * Returns an array of selected values\r\n * @public\r\n * @returns {*[]}\r\n */\r\n getSelectedValues() {\r\n const p = this._p;\r\n return p.selectedValues.slice(0);\r\n }\r\n\r\n /**\r\n * Selects the specified values\r\n * @public\r\n * @param {*[]} values - an array of *values* to select\r\n * @returns {SelectBox}\r\n */\r\n setSelectedValues(values) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (!p.multi) {\r\n values = values.slice(0, 1);\r\n }\r\n\r\n let set = new Set();\r\n let selectedValues = [];\r\n let selectedItems = [];\r\n\r\n for (let value of values) {\r\n if (set.has(value))\r\n continue;\r\n set.add(value);\r\n\r\n selectedValues.push(value);\r\n\r\n let item = p.items.find(x => x[valueProp] === value);\r\n if (item !== undefined) {\r\n selectedItems.push(item);\r\n } else {\r\n selectedItems.push({ [p.valueProp]: value });\r\n }\r\n }\r\n\r\n p.selectedValues = selectedValues;\r\n p.selectedItems = selectedItems;\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n\r\n this._updateListItems();\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the count of selected values\r\n * @public\r\n * @returns {number}\r\n */\r\n getSelectedValueCount() {\r\n const p = this._p;\r\n return p.selectedValues.length;\r\n }\r\n\r\n /**\r\n * Returns an array of selected items\r\n * @public\r\n * @returns {Array.<Object>}\r\n */\r\n getSelectedItems() {\r\n const p = this._p;\r\n return p.selectedItems.slice(0);\r\n }\r\n\r\n /**\r\n * Sets the specified items to \"checked\" mode.\r\n * An array of items is passed, not values, because we need to keep track if items,\r\n * and if we already have the array of items then this spares the process of searching for the items by values.\r\n * @public\r\n * @param {DropList.ItemBase[]} items - an array of *items* to select (not values)\r\n * @returns {SelectBox}\r\n */\r\n setSelectedItems(items) {\r\n this._setSelectedItems(items);\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {SelectBox}\r\n */\r\n openList() {\r\n const p = this._p;\r\n\r\n if (p.dropList.isVisible())\r\n return this;\r\n\r\n if (p.isLoadingMode && p.items.length === 0)\r\n return this;\r\n\r\n this._trigger('open:before', { list: p.dropList });\r\n\r\n p.dropList.show(this._getDropListPositionOptions());\r\n this._repositionDropList();\r\n\r\n // Another one in case the droplist position messed with screen layout.\r\n // If the out element's bounds stayed the same - nothing will be recalculated.\r\n // So this is *not* expensive.\r\n this._repositionDropList();\r\n\r\n if (p.dropList.hasFocusedItem()) {\r\n p.dropList.setFocusedItemAtIndex(p.dropList.getFocusedItemIndex());\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {SelectBox}\r\n */\r\n closeList() {\r\n const p = this._p;\r\n\r\n if (this[DestroyedSymbol])\r\n return this;\r\n\r\n if (!p.dropList.isVisible())\r\n return this;\r\n\r\n p.dropList.hide();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {boolean} [open]\r\n * @returns {SelectBox}\r\n */\r\n toggleList(open) {\r\n const p = this._p;\r\n\r\n let shouldOpen = open === undefined ? !p.dropList.isVisible() : !!open;\r\n\r\n if (shouldOpen)\r\n return this.openList();\r\n else return this.closeList();\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isListOpen() {\r\n return !!this._p.dropListVisible;\r\n }\r\n\r\n /**\r\n * @param {boolean} [on]\r\n * @returns {SelectBox}\r\n */\r\n toggleLoading(on) {\r\n return this.setIsLoadingMode(on === undefined ? !this.getIsLoadingMode() : !!on);\r\n }\r\n\r\n /**\r\n * @param {boolean} isLoadingMode\r\n * @returns {SelectBox}\r\n */\r\n setIsLoadingMode(isLoadingMode) {\r\n const p = this._p;\r\n\r\n isLoadingMode = isLoadingMode === undefined ? true : !!isLoadingMode;\r\n\r\n if (p.isLoadingMode === isLoadingMode)\r\n return this;\r\n\r\n p.isLoadingMode = isLoadingMode;\r\n\r\n if (p.isLoadingMode && p.items.length === 0 && this.isListOpen()) {\r\n this.closeList();\r\n } else if (!p.isLoadingMode && document.activeElement &&\r\n ((p.multi || p.searchable) && p.input.contains(document.activeElement) ||\r\n (!p.multi && !p.searchable) && p.el.contains(document.activeElement))) {\r\n this.openList();\r\n }\r\n\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getIsLoadingMode() {\r\n return this._p.isLoadingMode;\r\n }\r\n\r\n /**\r\n * Can be called in case that the selectbox was attached to the dom late and has a weird size.\r\n * @returns {SelectBox}\r\n */\r\n refreshSize() {\r\n this._resizeInput();\r\n return this;\r\n }\r\n\r\n /**\r\n * Register an event handler\r\n * @param {(string|'*')?} event\r\n * @param {function(any)} handler\r\n * @returns {SelectBox}\r\n */\r\n on(/**string|'*'*/event, /**Function?*/handler) {\r\n this._p.mitt.on(event, handler);\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a one time event handler\r\n * @param {(string|'*')?} event\r\n * @param {function(any)} handler\r\n * @returns {SelectBox}\r\n */\r\n once(/**string|'*'*/event, /**Function?*/handler) {\r\n let wrapped = (value) => {\r\n this._p.mitt.off(event, wrapped);\r\n handler(value);\r\n };\r\n this._p.mitt.on(event, wrapped);\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an `handler` for `event`, all events for `event`, or all events completely.\r\n * @param {(string|'*')?} event\r\n * @param {function(any)} handler\r\n * @returns {SelectBox}\r\n */\r\n off(/**(string|'*')?*/event, /**Function?*/handler) {\r\n if (!event && !event) {\r\n this._p.mitt.all.clear();\r\n } else {\r\n this._p.mitt.off(event, handler);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Emit an event\r\n * @param {string} event\r\n * @param {any} value\r\n * @returns {SelectBox}\r\n */\r\n emit(/**string|'*'*/event, /**any?*/value) {\r\n this._p.mitt.emit(event, value);\r\n return this;\r\n }\r\n\r\n /** @private */\r\n _renderBase() {\r\n const p = this._p;\r\n\r\n if (!p.inputBackBuffer) {\r\n p.inputBackBuffer = createElement('span', {\r\n css: {\r\n position: 'absolute',\r\n zIndex: -1,\r\n left: 0,\r\n top: '-9999px',\r\n whiteSpace: 'pre',\r\n },\r\n });\r\n }\r\n\r\n if (!p.input) {\r\n p.inputWrapper = createElement('span',\r\n {\r\n class: `${p.baseClassName}__search_wrapper`,\r\n },\r\n p.input = createElement('input', {\r\n class: `${p.baseClassName}__search_field`,\r\n type: 'search',\r\n autocomplete: 'off',\r\n autocorrect: 'off',\r\n autocapitalize: 'off',\r\n spellcheck: 'false',\r\n role: 'textbox',\r\n 'aria-autocomplete': 'list',\r\n readOnly: !(p.searchable || p.multi),\r\n }),\r\n );\r\n }\r\n\r\n if (p.multi) {\r\n if (p.singleWrapper) {\r\n this._cleanupSingleWrapper();\r\n remove(p.singleWrapper);\r\n delete p.singleWrapper;\r\n }\r\n\r\n if (!p.list) {\r\n // Moving `inputWrapper` to a new parent may cause a 'blur' event, and an unwanted chain reaction!\r\n // So we're unregistering those events here.\r\n this._unregisterDropdownEvents();\r\n\r\n // Restore focus to this one later if we affected it\r\n const lastActiveElement = document.activeElement;\r\n\r\n p.list = createElement('ul', {\r\n class: `${p.baseClassName}__list`,\r\n });\r\n p.el.appendChild(p.list);\r\n p.list.appendChild(p.inputWrapper);\r\n p.el.classList.remove(`${p.baseClassName}__single`);\r\n p.el.classList.add(`${p.baseClassName}__multi`);\r\n\r\n // Hook clear and remove\r\n p.sink\r\n .add(p.list, 'click', (evt) => {\r\n if (!closestUntil(evt.target, `.${p.baseClassName}__item_remove`, evt.currentTarget))\r\n return;\r\n\r\n if (p.disabled) return;\r\n\r\n this._removeMultiItemFromEvent(\r\n /**@type Element*/\r\n closestUntil(evt.target, `.${p.baseClassName}__item`, evt.currentTarget),\r\n evt);\r\n })\r\n .add(p.list, 'keydown', (/**KeyboardEvent*/evt) => {\r\n if (!closestUntil(evt.target, `.${p.baseClassName}__item`, evt.currentTarget))\r\n return;\r\n\r\n this._handleMultiKeydown(evt);\r\n });\r\n\r\n if (lastActiveElement === p.input)\r\n p.input.focus();\r\n\r\n this._registerDropdownEvents();\r\n }\r\n } else {\r\n if (p.list) {\r\n remove(p.list);\r\n p.sink.remove(p.list);\r\n delete p.list;\r\n }\r\n\r\n if (!p.singleWrapper) {\r\n // Moving `inputWrapper` to a new parent may cause a 'blur' event, and an unwanted chain reaction!\r\n // So we're unregistering those events here.\r\n this._unregisterDropdownEvents();\r\n\r\n // Restore focus to this one later if we affected it\r\n const lastActiveElement = document.activeElement;\r\n\r\n p.singleWrapper = createElement('div', {\r\n class: `${p.baseClassName}__single_wrapper`,\r\n });\r\n p.el.appendChild(p.singleWrapper);\r\n p.el.appendChild(p.inputWrapper);\r\n p.el.classList.remove(`${p.baseClassName}__multi`);\r\n p.el.classList.add(`${p.baseClassName}__single`);\r\n\r\n if (lastActiveElement === p.input)\r\n p.input.focus();\r\n\r\n this._registerDropdownEvents();\r\n }\r\n }\r\n\r\n if (p.hasOpenIndicator !== !!p.openIndicator) {\r\n if (p.hasOpenIndicator) {\r\n p.openIndicator = createElement('span', { class: `${p.baseClassName}__open_indicator` });\r\n p.el.appendChild(p.openIndicator);\r\n } else {\r\n remove(p.openIndicator);\r\n delete p.openIndicator;\r\n p.el.classList.remove(`${p.baseClassName}__has_open_indicator`);\r\n }\r\n }\r\n\r\n if (p.isLoadingMode !== !!p.spinner) {\r\n if (p.isLoadingMode) {\r\n p.spinner = createElement('span', { class: `${p.baseClassName}__spinner` });\r\n p.el.appendChild(p.spinner);\r\n p.el.classList.add(`${p.baseClassName}__has_spinner`);\r\n } else {\r\n remove(p.spinner);\r\n delete p.spinner;\r\n p.el.classList.remove(`${p.baseClassName}__has_spinner`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _syncBaseClasses() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!el)\r\n return;\r\n\r\n let classes = [p.baseClassName];\r\n\r\n if (p.multi)\r\n classes.push(`${p.baseClassName}__multi`);\r\n else classes.push(`${p.baseClassName}__single`);\r\n\r\n if (this.isListOpen())\r\n classes.push(`${p.baseClassName}__open_list`);\r\n else classes.push(`${p.baseClassName}__closed_list`);\r\n\r\n if (p.hasOpenIndicator)\r\n classes.push(`${p.baseClassName}__has_open_indicator`);\r\n\r\n if (p.clearButtonWrapper)\r\n classes.push(`${p.baseClassName}__has_clear`);\r\n\r\n if (p.isLoadingMode)\r\n classes.push(`${p.baseClassName}__has_spinner`);\r\n\r\n if (p.selectedValues.length === 0)\r\n classes.push(`${p.baseClassName}__empty_selection`);\r\n\r\n if (p.selectedValues.length > 0)\r\n classes.push(`${p.baseClassName}__has_selection`);\r\n\r\n if (p.searchable || p.multi)\r\n classes.push(`${p.baseClassName}__searchable`);\r\n\r\n if (p.additionalClasses) {\r\n classes = classes.concat(p.additionalClasses);\r\n }\r\n\r\n el.className = classes.join(' ');\r\n }\r\n\r\n /** @private */\r\n _setupDropdownMenu() {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (p.dropList) {\r\n p.dropList.destroy();\r\n delete p.dropList;\r\n p.itemsChanged = true;\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n }\r\n\r\n const renderNoResultsItem = p.renderNoResultsItem;\r\n const unrenderNoResultsItem = p.unrenderNoResultsItem;\r\n const customRenderItem = (p.listOptions || {}).renderItem;\r\n const customUnrenderItem = (p.listOptions || {}).unrenderItem;\r\n\r\n const renderItem = (renderNoResultsItem || customRenderItem) ? (item, itemEl) => {\r\n if (item && item[valueProp] === NoResultsItemSymbol) {\r\n if (renderNoResultsItem && renderNoResultsItem(item, itemEl) !== false) {\r\n return true;\r\n }\r\n\r\n itemEl.appendChild(createElement('div', {\r\n class: 'droplist-no-results-content',\r\n textContent: p.noResultsText,\r\n }));\r\n return true;\r\n } else {\r\n if (customRenderItem)\r\n return customRenderItem(item, itemEl);\r\n }\r\n return false;\r\n } : null;\r\n\r\n const unrenderItem = (unrenderNoResultsItem || customRenderItem) ? (item, itemEl) => {\r\n if (item && item[valueProp] === NoResultsItemSymbol) {\r\n if (unrenderNoResultsItem)\r\n return unrenderNoResultsItem(item, itemEl);\r\n } else {\r\n if (customUnrenderItem)\r\n return customUnrenderItem(item, itemEl);\r\n }\r\n return false;\r\n } : null;\r\n\r\n const dropList = p.dropList = new DropList({\r\n virtualMinItems: 10,\r\n\r\n ...p.listOptions,\r\n\r\n renderItem: renderItem,\r\n unrenderItem: unrenderItem,\r\n\r\n multi: p.multi,\r\n capturesFocus: false,\r\n\r\n labelProp: p.labelProp,\r\n valueProp: p.valueProp,\r\n\r\n on: (name, event) => {\r\n switch (name) {\r\n case 'show:before': {\r\n p.dropListVisible = true;\r\n p.el.setAttribute('aria-expanded', 'true');\r\n p.el.classList.add(`${p.baseClassName}__open_list`);\r\n p.el.classList.remove(`${p.baseClassName}__closed_list`);\r\n\r\n if (p.resortBySelectionNeeded && (p.sortListCheckedFirst && p.multi))\r\n p.itemsChanged = true;\r\n\r\n this._updateListItems();\r\n this._trigger('open', { list: dropList });\r\n\r\n this._startTrackingPresence();\r\n\r\n p.sink.add(window, 'resize.trackposition', () => this._repositionDropList());\r\n\r\n let parent = p.el.parentNode;\r\n while (parent) {\r\n if (parent.scrollHeight > parent.offsetHeight ||\r\n parent.scrollWidth > parent.offsetWidth) {\r\n if (parent === document.documentElement) {\r\n parent = window;\r\n }\r\n p.sink.add(parent, 'scroll.trackposition', () => this._repositionDropList());\r\n }\r\n parent = parent.parentNode;\r\n }\r\n }\r\n break;\r\n\r\n case 'hide': {\r\n p.dropListVisible = false;\r\n p.el.setAttribute('aria-expanded', 'false');\r\n p.el.classList.remove(`${p.baseClassName}__open_list`);\r\n p.el.classList.add(`${p.baseClassName}__closed_list`);\r\n\r\n if (!p.multi) {\r\n this._setInputText('');\r\n this._scheduleSync();\r\n }\r\n\r\n this._trigger('close');\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n this._stopTrackingPresence();\r\n p.sink.remove(null, '.trackposition');\r\n }\r\n break;\r\n\r\n case 'check': {\r\n if (!p.multi) return;\r\n\r\n const item = /**@type DropList.Item*/event.item;\r\n const value = event.value;\r\n\r\n let checked = item._checked;\r\n if (item._group) return; // Ignore groups\r\n\r\n let selEvt = { value: value, item: item, cancel: false };\r\n this._trigger((checked ? 'addsel' : 'removesel') + ':before', selEvt);\r\n\r\n if (selEvt.cancel) {\r\n // Rollback that check\r\n p.dropList.setItemChecked(value, !checked);\r\n return;\r\n }\r\n\r\n if (checked) {\r\n p.selectedItems.push(item);\r\n p.selectedValues.push(value);\r\n } else {\r\n const idx = p.selectedValues.indexOf(value);\r\n if (idx !== -1) {\r\n p.selectedItems.splice(idx, 1);\r\n p.selectedValues.splice(idx, 1);\r\n }\r\n }\r\n\r\n // If we are in context of group, then there are lots of syncs coming, so do not do it now\r\n const hasGroupSync = !!event.isCheckingGroup;\r\n\r\n if (p.showSelection) {\r\n if (checked) {\r\n if (dropList.itemCount() === 1) {\r\n this._setInputText('');\r\n }\r\n\r\n if (p.sortSelectedItems) {\r\n if (!hasGroupSync)\r\n this._scheduleSync('full');\r\n } else {\r\n if (p.maxMultiItems != null &&\r\n p.selectedItems.filter(x => !x._group).length > p.maxMultiItems) {\r\n this._scheduleSync('addOrUpdateMultiItemRestElement');\r\n } else {\r\n this._scheduleSync('addMultiItemElement', item);\r\n }\r\n\r\n if (!hasGroupSync)\r\n this._scheduleSync();\r\n }\r\n } else {\r\n if (p.maxMultiItems != null &&\r\n p.selectedItems.filter(x => !x._group).length === p.maxMultiItems) {\r\n this._scheduleSync('removeMultiItemRestElement');\r\n } else {\r\n this._scheduleSync('removeMultiItemElement', item);\r\n }\r\n\r\n if (!hasGroupSync)\r\n this._scheduleSync();\r\n }\r\n }\r\n\r\n this._trigger(checked ? 'addsel' : 'removesel', { value: value, item: item });\r\n }\r\n break;\r\n\r\n case 'groupcheck': {\r\n if (!p.multi) return;\r\n\r\n if (event.affectedItems) {\r\n this._scheduleSync(p.sortSelectedItems ? 'full' : null);\r\n }\r\n }\r\n break;\r\n\r\n case 'select': {\r\n if (p.multi) return;\r\n\r\n const item = event.item;\r\n const value = event.value;\r\n\r\n let selectEvt = { value: value, item: item, cancel: false };\r\n this._trigger('select:before', selectEvt);\r\n\r\n if (selectEvt.cancel)\r\n return;\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n this._setSelectedItems([item]);\r\n this._trigger('select', { value: value, item: item });\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n this.closeList();\r\n\r\n if (p.blurOnSingleSelection === 'touch' && hasTouchCapability ||\r\n p.blurOnSingleSelection !== 'touch' && p.blurOnSingleSelection) {\r\n p.input && p.input.blur();\r\n }\r\n }\r\n break;\r\n }\r\n },\r\n });\r\n\r\n this._registerDropdownEvents();\r\n }\r\n\r\n _unregisterDropdownEvents() {\r\n const p = this._p;\r\n\r\n p.sink.remove(null, '.dropdown');\r\n }\r\n\r\n _registerDropdownEvents() {\r\n const p = this._p;\r\n\r\n this._unregisterDropdownEvents();\r\n\r\n const dropList = p.dropList;\r\n if (!dropList) return;\r\n\r\n let avoidToggleFromClick = false,\r\n currentTouchId = null,\r\n suppressKeyPress = false,\r\n suppressKeyPressRepeat = false;\r\n\r\n const keyEventsTarget = p.multi || p.searchable ? p.input : p.el;\r\n\r\n p.sink\r\n .add(keyEventsTarget, 'keydown.dropdown', evt => {\r\n if ((/**@type HTMLInputElement*/evt.currentTarget).readOnly)\r\n return;\r\n\r\n suppressKeyPress = false;\r\n suppressKeyPressRepeat = false;\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n case VALUE_PAGE_DOWN:\r\n case VALUE_UP:\r\n case VALUE_DOWN:\r\n suppressKeyPress = true;\r\n evt.preventDefault();\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n if (dropList.isVisible())\r\n dropList.previousPage(evt);\r\n break;\r\n case VALUE_PAGE_DOWN:\r\n if (dropList.isVisible())\r\n dropList.nextPage(evt);\r\n break;\r\n case VALUE_UP:\r\n if (dropList.isVisible()) {\r\n dropList.previous(evt);\r\n } else {\r\n this._movePrev();\r\n }\r\n break;\r\n case VALUE_DOWN:\r\n if (dropList.isVisible()) {\r\n dropList.next(evt);\r\n } else {\r\n this._moveNext();\r\n }\r\n break;\r\n\r\n }\r\n break;\r\n\r\n case VALUE_SPACE:\r\n if (p.lastKeyAllowsSpaceToggle) {\r\n if (dropList.isVisible() && dropList.hasFocusedItem()) {\r\n suppressKeyPress = true;\r\n suppressKeyPressRepeat = true;\r\n if (p.multi)\r\n dropList.toggleFocusedItem(evt);\r\n else dropList.triggerItemSelection(evt);\r\n evt.preventDefault();\r\n }\r\n }\r\n break;\r\n\r\n case VALUE_ENTER:\r\n if (dropList.isVisible() && dropList.hasFocusedItem()) {\r\n suppressKeyPress = true;\r\n suppressKeyPressRepeat = true;\r\n evt.preventDefault();\r\n dropList.triggerItemSelection(evt);\r\n }\r\n\r\n break;\r\n\r\n case VALUE_TAB:\r\n if (dropList.isVisible() && dropList.hasFocusedItem()) {\r\n dropList.triggerItemSelection(evt);\r\n }\r\n break;\r\n\r\n case VALUE_ESCAPE:\r\n if (dropList.isVisible()) {\r\n dropList.hide(evt);\r\n evt.preventDefault();\r\n }\r\n break;\r\n\r\n default:\r\n suppressKeyPressRepeat = true;\r\n dropList._keydownFreeType(evt);\r\n break;\r\n }\r\n\r\n p.lastKeyAllowsSpaceToggle = evt.key === VALUE_UP ||\r\n evt.key === VALUE_DOWN ||\r\n evt.key === VALUE_PAGE_UP ||\r\n evt.key === VALUE_PAGE_DOWN ||\r\n (evt.key === VALUE_SPACE && !!p.lastKeyAllowsSpaceToggle);\r\n })\r\n .add(keyEventsTarget, 'keypress.dropdown', evt => {\r\n if (suppressKeyPress) {\r\n suppressKeyPress = false;\r\n evt.preventDefault();\r\n return;\r\n }\r\n\r\n if (suppressKeyPressRepeat)\r\n return;\r\n\r\n if (evt.key === VALUE_ENTER ||\r\n (\r\n evt.key === VALUE_SPACE &&\r\n p.lastKeyAllowsSpaceToggle &&\r\n !p.multi &&\r\n !dropList.hasFocusedItem()\r\n )\r\n ) {\r\n this.toggleList();\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n return;\r\n }\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n case VALUE_PAGE_DOWN:\r\n case VALUE_UP:\r\n case VALUE_DOWN:\r\n evt.preventDefault();\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n if (dropList.isVisible())\r\n dropList.previousPage(evt);\r\n break;\r\n case VALUE_PAGE_DOWN:\r\n if (dropList.isVisible())\r\n dropList.nextPage(evt);\r\n break;\r\n case VALUE_UP:\r\n if (dropList.isVisible()) {\r\n dropList.previous(evt);\r\n } else {\r\n this._movePrev();\r\n }\r\n break;\r\n case VALUE_DOWN:\r\n if (dropList.isVisible()) {\r\n dropList.next(evt);\r\n } else {\r\n this._moveNext();\r\n }\r\n break;\r\n }\r\n break;\r\n }\r\n });\r\n\r\n if (p.input) {\r\n p.sink\r\n .add(p.input, 'input.dropdown', () => {\r\n p.filterTerm = p.input.value.trim();\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n\r\n this._trigger('search', { value: p.input.value });\r\n\r\n p.throttledUpdateListItems();\r\n })\r\n .add(p.input, 'click.dropdown', () => {\r\n if (!p.multi && p.searchable) {\r\n this.openList();\r\n }\r\n })\r\n .add(p.input, 'focus.dropdown', () => {\r\n this._trigger('search:focus');\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n avoidToggleFromClick = false;\r\n this.openList();\r\n\r\n avoidToggleFromClick = true;\r\n setTimeout(() => { avoidToggleFromClick = false; }, 10);\r\n })\r\n .add(p.input, 'blur.dropdown', () => {\r\n this._trigger('search:blur');\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n if (p.throttledUpdateListItems)\r\n p.throttledUpdateListItems.cancel();\r\n\r\n this.closeList();\r\n });\r\n }\r\n\r\n p.sink\r\n .add(p.el, 'mousedown.dropdown', () => {\r\n if (!p.multi && !p.searchable && !avoidToggleFromClick) {\r\n this.toggleList();\r\n }\r\n avoidToggleFromClick = false;\r\n })\r\n .add(p.el, 'touchstart.dropdown', evt => {\r\n if (currentTouchId) return;\r\n currentTouchId = evt.changedTouches[0].identifier;\r\n\r\n if (this.isDisabled())\r\n return;\r\n\r\n if (closestUntil(evt.target, `.${p.baseClassName}__item,.${p.baseClassName}__clear`, p.el))\r\n return;\r\n\r\n let onTouchCancel = () => {\r\n currentTouchId = null;\r\n p.sink.remove(p.el, '.dropdown_touchextra');\r\n };\r\n\r\n (p.input || p.el).focus();\r\n\r\n p.sink\r\n .add(p.el, 'touchend.dropdown_touchextra', (tevt) => {\r\n let touch = Array.prototype.find.call(evt.changedTouches,\r\n touch => touch.identifier === currentTouchId);\r\n if (!touch) return onTouchCancel();\r\n\r\n tevt.preventDefault();\r\n onTouchCancel();\r\n })\r\n .add(p.el, 'touchmove.dropdown_touchextra', (tevt) => {\r\n tevt.preventDefault();\r\n })\r\n .add(p.el, 'touchcancel.dropdown_touchextra', onTouchCancel);\r\n });\r\n }\r\n\r\n _movePrev() {\r\n const p = this._p;\r\n\r\n if (this.isMultiEnabled()) return;\r\n\r\n let selectedItems = this.getSelectedItems();\r\n let items = p.filteredItems ?? p.items();\r\n if ((items.length + (p.clearable ? 1 : 0)) > 1) {\r\n let nextIndex = selectedItems.length > 0 ? items.indexOf(selectedItems[0]) - 1 : (selectedItems.length - 1);\r\n if (nextIndex === -1 && !p.clearable)\r\n nextIndex = items.length - 1;\r\n this.setSelectedItems(nextIndex === -1 ? [] : [items[nextIndex]]);\r\n }\r\n }\r\n\r\n _moveNext() {\r\n const p = this._p;\r\n\r\n if (this.isMultiEnabled()) return;\r\n\r\n let selectedItems = this.getSelectedItems();\r\n let items = p.filteredItems ?? p.items();\r\n if ((items.length + (p.clearable ? 1 : 0)) > 1) {\r\n let nextIndex = selectedItems.length > 0 ? items.indexOf(selectedItems[0]) + 1 : 0;\r\n if (nextIndex === selectedItems.length)\r\n nextIndex = p.clearable ? -1 : 0;\r\n this.setSelectedItems(nextIndex === -1 ? [] : [items[nextIndex]]);\r\n }\r\n }\r\n\r\n /** @private */\r\n _updateListItems() {\r\n const p = this._p;\r\n\r\n const dropList = p.dropList;\r\n if (!dropList || !p.dropListVisible)\r\n return;\r\n\r\n // For every search change, filteredItems is cleared.\r\n // If it's non-null here, then it means we have an extra call to _updateListItems, and not need to refilter.\r\n if (!p.filteredItems && (p.filterTerm || (p.filterOnEmptyTerm && p.filterFn))) {\r\n this._refilterItems();\r\n }\r\n\r\n if (p.itemsChanged || p.selectionChanged) {\r\n p.dropList._lastSerializedBox = null;\r\n }\r\n\r\n if (p.itemsChanged) {\r\n let items = p.filteredItems || p.items;\r\n if (p.sortListItems || (p.sortListCheckedFirst && p.multi)) {\r\n items = this._sortItems(items,\r\n p.sortListItems,\r\n p.sortListCheckedFirst && p.multi,\r\n p.splitListCheckedGroups);\r\n }\r\n dropList.removeAllItems();\r\n\r\n if (items.length === 0 && p.noResultsText) {\r\n items = [{\r\n [p.labelProp]: p.noResultsText,\r\n [p.valueProp]: NoResultsItemSymbol,\r\n _nointeraction: true,\r\n _nocheck: true,\r\n }];\r\n }\r\n\r\n dropList.addItems(items);\r\n p.itemsChanged = false;\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = false;\r\n }\r\n\r\n let hasRefocusedItem = false;\r\n\r\n if (p.selectionChanged) {\r\n if (p.multi) {\r\n p.dropList.setCheckedValues(p.selectedValues);\r\n } else {\r\n const singleItemIndex = p.dropList.itemIndexByValue(this.getValue());\r\n\r\n p.dropList\r\n .setFocusedItemAtIndex(singleItemIndex)\r\n .setSingleSelectedItemAtIndex(singleItemIndex);\r\n\r\n hasRefocusedItem = p.dropList.hasFocusedItem();\r\n }\r\n p.selectionChanged = false;\r\n }\r\n\r\n this._repositionDropList();\r\n\r\n if (hasRefocusedItem) {\r\n p.dropList.setFocusedItemAtIndex(p.dropList.getFocusedItemIndex());\r\n }\r\n }\r\n\r\n _refilterItems() {\r\n const p = this._p;\r\n\r\n const term = p.filterTerm;\r\n\r\n if (term || (p.filterOnEmptyTerm && p.filterFn)) {\r\n let fn = p.filterFn;\r\n\r\n let filteredItems;\r\n\r\n if (typeof fn === 'function') {\r\n filteredItems = p.filterFn(p.items, term);\r\n }\r\n\r\n // If there was no filter function, or it gave up on filtering.\r\n if (!Array.isArray(filteredItems)) {\r\n if (term) {\r\n const matcher = new RegExp(escapeRegex(term), 'i');\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n\r\n filteredItems = p.items.filter(x => {\r\n if (x._group) return true;\r\n return matcher.test(x[labelProp] || x[multiItemLabelProp]);\r\n });\r\n } else {\r\n filteredItems = null;\r\n }\r\n }\r\n\r\n p.filteredItems = filteredItems;\r\n\r\n if (filteredItems) {\r\n // Clean up groups without children\r\n\r\n let lastGroup = -1;\r\n let len = filteredItems.length;\r\n\r\n for (let i = 0; i < len; i++) {\r\n let item = filteredItems[i];\r\n\r\n if (item._group) {\r\n if (lastGroup !== -1 && lastGroup === i - 1) {\r\n // It was an empty group\r\n filteredItems.splice(lastGroup, 1);\r\n i--;\r\n len--;\r\n }\r\n\r\n lastGroup = i;\r\n }\r\n }\r\n\r\n if (lastGroup !== -1) {\r\n if (lastGroup === len - 1) {\r\n // It was an empty group\r\n filteredItems.splice(lastGroup, 1);\r\n }\r\n }\r\n }\r\n } else {\r\n p.filteredItems = null;\r\n }\r\n\r\n this._trigger('itemschanged', { term: term, mutated: false, count: this.getFilteredItemCount() });\r\n\r\n p.itemsChanged = true;\r\n }\r\n\r\n _setSelectedItems(items) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (p.multi) {\r\n p.selectedItems = items.filter(x => x[valueProp] !== undefined);\r\n p.selectedValues = p.selectedItems.map(x => x[valueProp]);\r\n } else {\r\n p.selectedItems = items.slice(0, 1);\r\n p.selectedValues = items.slice(0, 1).map(x => x[valueProp]);\r\n }\r\n\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n\r\n this._updateListItems();\r\n this._scheduleSync('full');\r\n }\r\n\r\n _scheduleSync(mode, data) {\r\n const p = this._p;\r\n\r\n if (!p.syncQueue)\r\n p.syncQueue = [];\r\n\r\n if (mode === 'full')\r\n p.syncQueue.length = 0;\r\n\r\n if (p.syncQueue.length === 0 || p.syncQueue[0].mode !== 'full')\r\n p.syncQueue.push({ mode: mode, data: data });\r\n\r\n if (p.syncTimeout)\r\n return;\r\n\r\n p.syncTimeout = setTimeout(() => {\r\n delete p.syncTimeout;\r\n let queue = p.syncQueue;\r\n delete p.syncQueue;\r\n this._performSync(queue);\r\n });\r\n }\r\n\r\n _performSync(queue) {\r\n const p = this._p;\r\n\r\n if (this[DestroyedSymbol])\r\n return;\r\n\r\n for (let op of queue) {\r\n switch (op.mode) {\r\n case 'full':\r\n this._syncFull(true);\r\n break;\r\n\r\n case 'singleItem':\r\n this._syncSingleItem();\r\n break;\r\n\r\n case 'removeMultiItemElement': {\r\n if (p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n const valueProp = p.valueProp;\r\n const item = op.data,\r\n value = item[valueProp];\r\n\r\n let idx = p.multiItemEls.findIndex(x => x[ItemSymbol][valueProp] === value);\r\n if (idx !== -1) {\r\n this._removeMultiItemElementByIndex(idx);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case 'addMultiItemElement': {\r\n if (!p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n this._addMultiItemElement(op.data);\r\n }\r\n }\r\n break;\r\n\r\n case 'addOrUpdateMultiItemRestElement': {\r\n if (!p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n this._addMultiItemRestElement();\r\n }\r\n }\r\n break;\r\n\r\n case 'removeMultiItemRestElement': {\r\n if (!p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n let itemEl = p.multiItemEls[p.multiItemEls.length - 1];\r\n if (itemEl?.[ItemSymbol]?.[p.valueProp] === RestMultiItemsSymbol) {\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case 'resize_input': {\r\n this._resizeInput();\r\n }\r\n break;\r\n\r\n default:\r\n this._syncFull(false);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n _cleanupSingleWrapper() {\r\n const p = this._p;\r\n\r\n if (!p.singleWrapper) return;\r\n\r\n if (p.unrenderSingleItem && p.singleWrapper.childNodes.length > 0) {\r\n try {\r\n p.unrenderSingleItem(p.singleWrapper[ItemSymbol], p.singleWrapper);\r\n } catch (err) { console.error(err); } // eslint-disable-line no-console\r\n }\r\n\r\n delete p.singleWrapper[ItemSymbol];\r\n p.singleWrapper.innerHTML = '';\r\n }\r\n\r\n /**\r\n * @param {number} index\r\n * @private\r\n */\r\n _removeMultiItemElementByIndex(index) {\r\n const p = this._p, multiItemEls = p.multiItemEls;\r\n\r\n if (multiItemEls.length > index) {\r\n const itemEl = multiItemEls[index];\r\n const item = itemEl[ItemSymbol];\r\n\r\n let unrender = item?.[p.valueProp] === RestMultiItemsSymbol\r\n ? p.unrenderRestMultiItem ?? p.unrenderMultiItem\r\n : p.unrenderMultiItem;\r\n\r\n if (unrender && itemEl.childNodes.length > 0) {\r\n try {\r\n unrender(item, itemEl);\r\n } catch (err) { console.error(err); } // eslint-disable-line no-console\r\n }\r\n remove(itemEl);\r\n\r\n // fastpath\r\n if (index === multiItemEls.length - 1) multiItemEls.pop();\r\n else multiItemEls.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @private\r\n */\r\n _renderSingleItemContent(item) {\r\n const p = this._p;\r\n\r\n if (!p.renderSingleItem || p.renderSingleItem(item, p.singleWrapper) === false) {\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n\r\n let label = item[multiItemLabelProp] || item[labelProp];\r\n if (label === null || label === undefined)\r\n label = '';\r\n\r\n p.singleWrapper.appendChild(document.createTextNode(label));\r\n }\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @param {Element} itemEl\r\n * @private\r\n */\r\n _renderMultiItemContent(item, itemEl) {\r\n const p = this._p;\r\n\r\n let render = item[p.valueProp] === RestMultiItemsSymbol\r\n ? p.renderRestMultiItem ?? p.renderMultiItem\r\n : p.renderMultiItem;\r\n\r\n if (!render || render(item, itemEl) === false) {\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n const label = item[multiItemLabelProp] || item[labelProp];\r\n itemEl.appendChild(createElement('span', {\r\n textContent: label,\r\n }));\r\n }\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @private\r\n */\r\n _addMultiItemElement(item) {\r\n const p = this._p;\r\n const itemEl = this._renderMultiItem(item);\r\n if (!itemEl) return;\r\n\r\n before(p.inputWrapper, itemEl);\r\n p.multiItemEls.push(itemEl);\r\n }\r\n\r\n /** @private */\r\n _addMultiItemRestElement() {\r\n const p = this._p;\r\n\r\n let items = p.selectedItems.slice(0);\r\n let count = items.filter(x => !x._group).length - p.maxMultiItems;\r\n let label = p.multiItemsRestLabelProvider\r\n ? p.multiItemsRestLabelProvider(count, items)\r\n : `+ ${count}`;\r\n\r\n this._addMultiItemElement({\r\n items: items,\r\n [p.valueProp]: RestMultiItemsSymbol,\r\n [p.labelProp]: label,\r\n });\r\n }\r\n\r\n /** @private */\r\n _syncClearButton() {\r\n const p = this._p;\r\n\r\n // Set clear button\r\n if (p.selectedItems.length > 0 && p.clearable && p.showSelection) {\r\n if (!p.clearButtonWrapper) {\r\n p.clearButtonWrapper = createElement(\r\n p.multi ? 'li' : 'span',\r\n { class: `${p.baseClassName}__clear` },\r\n p.clearButton = createElement('button'));\r\n if (p.multi)\r\n append(p.list, p.clearButtonWrapper);\r\n else append(p.el, p.clearButtonWrapper);\r\n p.el.classList.add(`${p.baseClassName}__has_clear`);\r\n\r\n p.sink.add(p.clearButton, 'click', () => {\r\n if (this.isDisabled()) return;\r\n this.clear();\r\n });\r\n }\r\n } else {\r\n if (p.clearButtonWrapper) {\r\n p.sink.remove(p.clearButton, 'click');\r\n\r\n remove(p.clearButtonWrapper);\r\n delete p.clearButtonWrapper;\r\n delete p.clearButton;\r\n p.el.classList.remove(`${p.baseClassName}__has_clear`);\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n _syncPlaceholder() {\r\n const p = this._p;\r\n\r\n let placeholder = '';\r\n\r\n if (p.multi && !p.showSelection) {\r\n if (typeof p.multiPlaceholderFormatter === 'function') {\r\n placeholder = p.multiPlaceholderFormatter(p.selectedItems);\r\n } else {\r\n placeholder = defaultMultiPlaceholderFormatter(p.selectedItems, p.labelProp);\r\n }\r\n } else if (p.selectedItems.length === 0 || !p.showSelection) {\r\n placeholder = p.placeholder == null ? '' : (p.placeholder + '');\r\n }\r\n\r\n // Set input placeholder\r\n p.input.setAttribute('placeholder', placeholder);\r\n }\r\n\r\n /** @private */\r\n _syncSingleItem() {\r\n const p = this._p;\r\n\r\n if (p.singleWrapper)\r\n this._cleanupSingleWrapper();\r\n\r\n const items = p.selectedItems;\r\n\r\n if (items.length > 0) {\r\n this._renderSingleItemContent(items[0]);\r\n p.singleWrapper[ItemSymbol] = items[0];\r\n }\r\n }\r\n\r\n /**\r\n * Syncs render state, selected items, and position\r\n * @param {boolean=false} fullItemsRender Should re-render all items?\r\n * @returns {SelectBox}\r\n */\r\n _syncFull(fullItemsRender) {\r\n const p = this._p;\r\n\r\n this._renderBase();\r\n this._syncClearButton();\r\n this._syncPlaceholder();\r\n\r\n fullItemsRender = p.multi && p.showSelection && (fullItemsRender || p.selectedItems.length !== p.multiItemEls.length);\r\n\r\n if (fullItemsRender || !p.showSelection || !p.multi) {\r\n // Remove all item elements\r\n while (p.multiItemEls.length > 0) {\r\n // use fast path by removing in reverse\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n }\r\n }\r\n\r\n if (p.multi) {\r\n if (fullItemsRender) {\r\n const items = p.selectedItems;\r\n\r\n // Sort these\r\n if (p.sortSelectedItems) {\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp,\r\n valueProp = p.valueProp,\r\n stickyValues = p.stickyValues;\r\n\r\n const comparator = p.sortItemComparator || ((a, b) => {\r\n if (stickyValues !== null) {\r\n let sa = stickyValues.has(a[valueProp]);\r\n let sb = stickyValues.has(b[valueProp]);\r\n if (sa && !sb) return -1;\r\n if (!sa && sb) return 1;\r\n }\r\n\r\n const aLabel = a[multiItemLabelProp] || a[labelProp];\r\n const bLabel = b[multiItemLabelProp] || b[labelProp];\r\n return aLabel < bLabel ? -1 : (aLabel > bLabel ? 1 : 0);\r\n });\r\n\r\n items.sort(comparator);\r\n\r\n p.selectedValues = items.map(x => x[valueProp]);\r\n }\r\n\r\n let actualItemCount = 0;\r\n let max = p.maxMultiItems;\r\n let addRestItem = false;\r\n\r\n // Add item elements\r\n for (let i = 0; i < items.length; i++) {\r\n if (items[i]._group) continue;\r\n\r\n if (max != null && actualItemCount === max) {\r\n addRestItem = true;\r\n break;\r\n }\r\n\r\n actualItemCount++;\r\n this._addMultiItemElement(items[i]);\r\n }\r\n\r\n if (addRestItem) {\r\n this._addMultiItemRestElement();\r\n }\r\n }\r\n } else if (!p.multi) {\r\n this._syncSingleItem();\r\n }\r\n\r\n if (getRootNode(p.el) !== document)\r\n return this;\r\n\r\n toggleClass(p.el, `${p.baseClassName}__empty_selection`, p.selectedValues.length === 0);\r\n toggleClass(p.el, `${p.baseClassName}__has_selection`, p.selectedValues.length > 0);\r\n\r\n if (p.searchable || p.multi) {\r\n if (p.input) p.input.readOnly = false;\r\n p.el.classList.add(`${p.baseClassName}__searchable`);\r\n } else {\r\n if (p.input) p.input.readOnly = true;\r\n p.el.classList.remove(`${p.baseClassName}__searchable`);\r\n }\r\n\r\n // Update input size\r\n this._resizeInput()._updateListItems();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} event\r\n * @param {*} [data]\r\n * @private\r\n */\r\n _trigger(event, data) {\r\n const p = this._p;\r\n if (p.on)\r\n p.on(event, ...(data === undefined ? [] : [data]));\r\n p.mitt.emit(event, data);\r\n }\r\n\r\n /**\r\n * Render a multi item\r\n * @param {Object} item\r\n * @returns {Element|null}\r\n * @private\r\n */\r\n _renderMultiItem(item) {\r\n const p = this._p;\r\n\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n const label = item[multiItemLabelProp] ?? item[labelProp];\r\n if (label === false)\r\n return null;\r\n\r\n const itemEl = createElement('li',\r\n {\r\n class: `${p.baseClassName}__item`,\r\n tabindex: '0',\r\n title: label,\r\n },\r\n [\r\n createElement('span', {\r\n class: `${p.baseClassName}__item_remove`,\r\n role: 'presentation',\r\n }),\r\n ],\r\n );\r\n\r\n this._renderMultiItemContent(item, itemEl);\r\n\r\n itemEl[ItemSymbol] = item;\r\n\r\n return itemEl;\r\n }\r\n\r\n /**\r\n * Removes a specific multi item by user event\r\n * @param {Element} itemEl\r\n * @param {Event} originatingEvent\r\n * @returns {SelectBox}\r\n * @private\r\n */\r\n _removeMultiItemFromEvent(itemEl, originatingEvent) {\r\n const p = this._p;\r\n\r\n let nextFocus;\r\n if (/key/.test(originatingEvent.type)) {\r\n const kEvent = /**@type KeyboardEvent*/originatingEvent;\r\n if (kEvent.key === VALUE_DELETE) { // Delete\r\n nextFocus = next(itemEl, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n } else if (kEvent.key === VALUE_BACK_SPACE) { // Backspace\r\n nextFocus = prev(itemEl, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n }\r\n } else if (/click|mouse|touch/.test(originatingEvent.type)) {\r\n nextFocus = next(itemEl, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n }\r\n\r\n const item = itemEl[ItemSymbol], value = item[p.valueProp];\r\n\r\n if (item !== undefined) {\r\n if (value === RestMultiItemsSymbol) {\r\n let items = p.selectedItems.filter(x => !x._group).slice(p.maxMultiItems);\r\n let itemsToRemove = [];\r\n\r\n for (let item of items) {\r\n let removeselEvt = { value: value, item: item, cancel: false };\r\n this._trigger('removesel:before', removeselEvt);\r\n if (!removeselEvt.cancel)\r\n itemsToRemove.push(item);\r\n }\r\n\r\n if (itemsToRemove.length > 0) {\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n\r\n for (let item of itemsToRemove) {\r\n // sync selection\r\n let idx = p.selectedItems.indexOf(item);\r\n if (idx === -1)\r\n idx = p.selectedValues.indexOf(value[p.valueProp]);\r\n if (idx !== -1) {\r\n p.selectedItems.splice(idx, 1);\r\n p.selectedValues.splice(idx, 1);\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n }\r\n }\r\n }\r\n\r\n if (items.length > itemsToRemove.length) {\r\n this._addMultiItemRestElement();\r\n }\r\n\r\n if (itemsToRemove.length > 0) {\r\n this._scheduleSync();\r\n }\r\n } else {\r\n let removeselEvt = { value: value, item: item, cancel: false };\r\n this._trigger('removesel:before', removeselEvt);\r\n if (removeselEvt.cancel)\r\n return this;\r\n\r\n this._removeMultiItem(item);\r\n\r\n // trigger event\r\n this._trigger('removesel', { value: value, item: item });\r\n }\r\n }\r\n\r\n if (!nextFocus) {\r\n nextFocus = p.el.querySelector(`.${p.baseClassName}__item, .${p.baseClassName}__search_field`);\r\n }\r\n\r\n if (hasClass(nextFocus, `${p.baseClassName}__search_wrapper`)) {\r\n nextFocus = nextFocus.querySelector('input');\r\n }\r\n\r\n nextFocus && nextFocus.focus();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @param {boolean} [populate]\r\n * @private\r\n */\r\n _removeMultiItem(item, populate = false) {\r\n const p = this._p;\r\n const valueProp = p.valueProp,\r\n labelProp = p.labelProp;\r\n const value = item[valueProp];\r\n\r\n // sync selection\r\n let idx = p.selectedItems.indexOf(item);\r\n if (idx === -1)\r\n idx = p.selectedValues.indexOf(value);\r\n if (idx !== -1) {\r\n p.selectedItems.splice(idx, 1);\r\n p.selectedValues.splice(idx, 1);\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n }\r\n\r\n // sync multi item element\r\n idx = p.multiItemEls.findIndex(x => x[ItemSymbol] === item);\r\n if (idx === -1)\r\n idx = p.multiItemEls.findIndex(x => x[ItemSymbol][valueProp] === value);\r\n if (idx !== -1) {\r\n this._removeMultiItemElementByIndex(idx);\r\n }\r\n\r\n if (populate) {\r\n this._setInputText(item[p.multiItemLabelProp] || item[labelProp]);\r\n\r\n p.input.focus();\r\n\r\n // Go to end of input\r\n p.input.selectionStart = p.input.selectionEnd = p.input.value.length;\r\n }\r\n\r\n // sync\r\n this._scheduleSync();\r\n }\r\n\r\n /**\r\n * @param {*} value\r\n * @private\r\n */\r\n _setInputText(value) {\r\n const p = this._p;\r\n\r\n p.input.value = value == null ? '' : String(value);\r\n\r\n p.filterTerm = '';\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n }\r\n\r\n /**\r\n * Update input size to current state\r\n * @returns {SelectBox}\r\n * @private\r\n */\r\n _resizeInput() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!el.parentNode || !document.body.contains(el))\r\n return this;\r\n\r\n const input = p.input, backBufferEl = p.inputBackBuffer;\r\n\r\n let inputValue = input.value || input.placeholder;\r\n toggleClass(el, `${p.baseClassName}__has_input`, !!inputValue);\r\n toggleClass(el, `${p.baseClassName}__empty_input`, !inputValue);\r\n\r\n let hasResize = false;\r\n\r\n if (p.multi && p.multiItemEls.length === 0 && p.showSelection) {\r\n // Full width of list wrapper\r\n input.style.width = ''; // reset first\r\n\r\n let beforeWidth = 0, afterWidth = 0;\r\n\r\n let beforeStyle = getComputedStyle(p.list || el, '::before');\r\n if (beforeStyle.content &&\r\n beforeStyle.content !== 'none' &&\r\n beforeStyle.position !== 'absolute' &&\r\n beforeStyle.float !== 'none') {\r\n beforeWidth = getPseudoElementWidth(p.list || el, '::before', true, true, true);\r\n }\r\n\r\n let afterStyle = getComputedStyle(p.list || el, '::after');\r\n if (afterStyle.content &&\r\n afterStyle.content !== 'none' &&\r\n afterStyle.position !== 'absolute' &&\r\n afterStyle.float !== 'none') {\r\n afterWidth = getPseudoElementWidth(p.list || el, '::after', true, true, true);\r\n }\r\n\r\n let contentWidth = getElementWidth(p.list || el); // calculate width\r\n contentWidth -= beforeWidth + afterWidth;\r\n\r\n input.style.width = `${contentWidth}px`;\r\n\r\n hasResize = true; // We may want to track the resize here better to avoid unnecessary event\r\n } else {\r\n // Introduce backbuffer to DOM\r\n setCssProps(backBufferEl, getCssProps(input, inputBackbufferCssProps));\r\n backBufferEl.textContent = inputValue;\r\n el.appendChild(backBufferEl);\r\n\r\n // Measure these\r\n const computedStyle = getComputedStyle(input);\r\n const paddingTotal = (parseFloat(computedStyle.paddingLeft) || 0) + (parseFloat(computedStyle.paddingRight) || 0);\r\n const minWidth = (parseFloat(computedStyle['font-size']) || 0) * 0.75 + paddingTotal;\r\n const backBufferWidth = getElementWidth(backBufferEl, true, true);\r\n const currentWidth = getElementWidth(input, true, true);\r\n let newWidth = Math.max(backBufferWidth, minWidth);\r\n\r\n // Compare\r\n if (newWidth !== currentWidth) {\r\n // Update if needed\r\n setElementWidth(input, newWidth, true, true);\r\n\r\n let bordersWidth = (parseFloat(computedStyle.borderLeftWidth) || 0) + (parseFloat(computedStyle.borderRightWidth) || 0);\r\n let scrollWidth = input.scrollWidth + bordersWidth;\r\n\r\n if (scrollWidth > newWidth) {\r\n // consider scrollWidth delta\r\n let delta = scrollWidth - newWidth;\r\n input.style.width = `${parseFloat(input.style.width) + delta}px`;\r\n\r\n newWidth += delta;\r\n }\r\n\r\n // sync the single value wrapper.\r\n // it is meant as a preview or spacer for single selection value, so its appropriate to sync it with this width\r\n if (p.singleWrapper) {\r\n p.singleWrapper.style.width = '';\r\n\r\n if (inputValue) {\r\n let width = newWidth - paddingTotal - bordersWidth;\r\n if (getElementWidth(p.singleWrapper, false, false) < width) {\r\n setElementWidth(p.singleWrapper, width, false, false);\r\n }\r\n }\r\n }\r\n\r\n hasResize = true;\r\n }\r\n\r\n // Remove backbuffer from DOM\r\n remove(backBufferEl);\r\n }\r\n\r\n if (hasResize)\r\n this._trigger('input:resize');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Update autocomplete position if needed\r\n * @returns {SelectBox}\r\n * @private\r\n */\r\n _repositionDropList() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!p.dropList || !p.dropListVisible || !p.dropList.isVisible())\r\n return this;\r\n\r\n const box = el.getBoundingClientRect();\r\n const serialized = box.left + ',' + box.top + ',' + box.right + ',' + box.bottom;\r\n\r\n if (p.dropList._lastSerializedBox !== serialized) {\r\n p.dropList.relayout(this._getDropListPositionOptions());\r\n p.dropList._lastSerializedBox = serialized;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} event\r\n * @private\r\n */\r\n _handleInputKeydown(event) {\r\n const p = this._p;\r\n\r\n const target = (/**@type HTMLInputElement*/event.target);\r\n\r\n if (event.key === VALUE_BACK_SPACE && event.ctrlKey && target.value.length === 0) {\r\n this.clear();\r\n\r\n event.preventDefault();\r\n } else if (event.key === VALUE_BACK_SPACE && target.value.length === 0) {\r\n const itemEl = p.multiItemEls[p.multiItemEls.length - 1];\r\n if (!itemEl || itemEl[ItemSymbol].value === undefined)\r\n return;\r\n\r\n const item = itemEl[ItemSymbol], value = item[p.valueProp];\r\n\r\n let removeselEvt = { value: value, item: item, cancel: false };\r\n this._trigger('removesel:before', removeselEvt);\r\n if (removeselEvt.cancel)\r\n return;\r\n\r\n this._removeMultiItem(item, true);\r\n\r\n // trigger event\r\n this._trigger('removesel', { value: value, item: item });\r\n\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} event\r\n * @private\r\n */\r\n _handleMultiKeydown(event) {\r\n const p = this._p;\r\n\r\n if (p.disabled) return;\r\n\r\n const isRtl = getComputedStyle(p.el).direction === 'rtl';\r\n\r\n let nextFocus;\r\n\r\n if (event.key === (isRtl ? VALUE_LEFT : VALUE_RIGHT)) { // Next arrow\r\n nextFocus = next(/**@type Element*/event.target, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n if (hasClass(nextFocus, `${p.baseClassName}__search_wrapper`)) {\r\n nextFocus = nextFocus.querySelector('input');\r\n }\r\n nextFocus && nextFocus.focus();\r\n\r\n event.preventDefault();\r\n } else if (event.key === (isRtl ? VALUE_RIGHT : VALUE_LEFT)) { // Prev arrow\r\n nextFocus = prev(/**@type Element*/event.target, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n if (hasClass(nextFocus, `${p.baseClassName}__search_wrapper`)) {\r\n nextFocus = nextFocus.querySelector('input');\r\n }\r\n nextFocus && nextFocus.focus();\r\n\r\n event.preventDefault();\r\n } else if (event.key === VALUE_BACK_SPACE && event.ctrlKey) { // Ctrl + Backspace\r\n const multiItemEls = [];\r\n let itemEl = event.target;\r\n while (itemEl) {\r\n multiItemEls.push(itemEl);\r\n itemEl = prev(/**@type Element*/itemEl, `.${p.baseClassName}__item`);\r\n }\r\n\r\n while (multiItemEls.length) {\r\n this._removeMultiItemFromEvent(multiItemEls.shift(), event);\r\n }\r\n\r\n event.preventDefault();\r\n } else if (event.key === VALUE_DELETE || event.key === VALUE_BACK_SPACE) { // Delete / Backspace\r\n this._removeMultiItemFromEvent(closestUntil(event.target, `.${p.baseClassName}__item`, p.el), event);\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @returns {DropList.PositionOptions}\r\n * @private\r\n */\r\n _getDropListPositionOptions() {\r\n const p = this._p;\r\n\r\n return {\r\n target: /**@type Element*/p.el,\r\n offset: { x: 0, y: 0 },\r\n anchor: { x: 'start', y: 'bottom' },\r\n position: { x: 'start', y: 'top' },\r\n updateWidth: true,\r\n };\r\n }\r\n\r\n /** @private */\r\n _startTrackingPresence() {\r\n const p = this._p;\r\n\r\n this._stopTrackingPresence();\r\n\r\n p.presenceInt = setInterval(function () {\r\n if (getRootNode(p.el) !== document)\r\n this.hide();\r\n }, 200);\r\n }\r\n\r\n /** @private */\r\n _stopTrackingPresence() {\r\n const p = this._p;\r\n\r\n if (p.presenceInt) {\r\n clearInterval(p.presenceInt);\r\n p.presenceInt = null;\r\n }\r\n }\r\n\r\n /**\r\n * Handles sorting, and putting checked items first (according to selectedValues, not item.checked)\r\n * @private\r\n * @param {DropList.ItemBase[]} items\r\n * @param {boolean=false} sort\r\n * @param {boolean=false} sortCheckedFirst\r\n * @param {boolean=false} splitCheckedGroups\r\n * @returns {DropList.ItemBase[]}\r\n */\r\n _sortItems(items, sort, sortCheckedFirst, splitCheckedGroups) {\r\n const p = this._p;\r\n\r\n if (!sort && !sortCheckedFirst)\r\n return items; // Nothing to do\r\n\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp,\r\n valueProp = p.valueProp,\r\n stickyValues = p.stickyValues,\r\n comparator = p.sortItemComparator || ((a, b) => {\r\n if (stickyValues !== null) {\r\n let sa = stickyValues.has(a[valueProp]);\r\n let sb = stickyValues.has(b[valueProp]);\r\n if (sa && !sb) return -1;\r\n if (!sa && sb) return 1;\r\n }\r\n\r\n const aLabel = a[labelProp] || a[multiItemLabelProp];\r\n const bLabel = b[labelProp] || b[multiItemLabelProp];\r\n\r\n if (aLabel < bLabel) return -1;\r\n if (aLabel > bLabel) return 1;\r\n\r\n return 0;\r\n });\r\n\r\n let group = [], stickyGroup = null;\r\n let groups = [group];\r\n const selectedValuesSet = new Set(p.selectedValues);\r\n let item, i, len;\r\n\r\n // Split to groups\r\n for (i = 0, len = items.length; i < len; i++) {\r\n item = items[i];\r\n if (item._group && group.length) {\r\n group = [];\r\n groups.push(group);\r\n }\r\n group.push(item);\r\n }\r\n\r\n // Leftover\r\n if (!group.length) {\r\n groups.length = 0;\r\n }\r\n\r\n // Non-grouped sticky should be first\r\n if (stickyValues && items.length > 0 && !items[0]._group) {\r\n stickyGroup = groups[0].filter(x => stickyValues.has(x[valueProp]));\r\n if (stickyGroup.length > 0) {\r\n groups[0] = groups[0].filter(x => !stickyValues.has(x[valueProp]));\r\n }\r\n }\r\n\r\n if (sort) {\r\n // Sort the groups\r\n groups.sort((a, b) => {\r\n a = a[0];\r\n b = b[0];\r\n\r\n if (stickyValues !== null) {\r\n let sa = stickyValues.has(a[valueProp]);\r\n let sb = stickyValues.has(b[valueProp]);\r\n if (sa && !sb) return -1;\r\n if (!sa && sb) return 1;\r\n }\r\n\r\n // A \"group\" without a group item will come first\r\n if (!a._group && b._group) return -1;\r\n if (a._group && !b._group) return 1;\r\n\r\n return comparator(a, b);\r\n });\r\n }\r\n\r\n if (stickyGroup && stickyGroup.length > 0) {\r\n groups.unshift(stickyGroup);\r\n }\r\n\r\n // Now we have an array of groups, possibly sorted.\r\n // Each group is an array that begins with the group item (group name/id).\r\n // A group could possible start with a normal item, if it's a \"default group\", which had no group item.\r\n\r\n const checkedGroups = [], uncheckedGroups = [];\r\n\r\n // Iterate groups\r\n for (let g = 0, glen = groups.length; g < glen; g++) {\r\n group = groups[g];\r\n\r\n // Sort each group\r\n group.sort((a, b) => {\r\n\r\n // Grouping items come first\r\n if (a._group && !b._group) return -1;\r\n if (!a._group && b._group) return 1;\r\n\r\n if (sortCheckedFirst) {\r\n const aChecked = selectedValuesSet.has(a[valueProp]);\r\n const bChecked = selectedValuesSet.has(b[valueProp]);\r\n\r\n if (aChecked && !bChecked) return -1;\r\n if (!aChecked && bChecked) return 1;\r\n }\r\n\r\n if (sort) {\r\n return comparator(a, b);\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n uncheckedGroups.push(group);\r\n }\r\n\r\n if (sortCheckedFirst && splitCheckedGroups) {\r\n\r\n let virtualGroup;\r\n\r\n // Iterate groups\r\n for (let g = 0, glen = groups.length; g < glen; g++) {\r\n group = groups[g];\r\n\r\n if (group === stickyGroup) {\r\n checkedGroups.push(stickyGroup);\r\n let sgi = uncheckedGroups.indexOf(stickyGroup);\r\n if (sgi !== -1) {\r\n uncheckedGroups.splice(sgi, 1);\r\n }\r\n continue;\r\n }\r\n\r\n virtualGroup = null;\r\n\r\n for (let gi = 0, gilen = group.length; gi < gilen; gi++) {\r\n item = group[gi];\r\n if (item._group) continue;\r\n if (!selectedValuesSet.has(item[p.valueProp])) break;\r\n\r\n if (!virtualGroup) {\r\n virtualGroup = [];\r\n if (group[0]._group) {\r\n virtualGroup.push(group[0]);\r\n }\r\n }\r\n\r\n virtualGroup.push(item);\r\n group.splice(gi--, 1);\r\n gilen--;\r\n }\r\n\r\n if (virtualGroup) {\r\n checkedGroups.push(virtualGroup);\r\n if (group.length === 0 || (group.length === 1 && group[0]._group)) {\r\n groups.splice(g--, 1);\r\n glen--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Prepare the target array\r\n const joined = [];\r\n joined.length = items.length;\r\n let itemIndex = 0;\r\n\r\n groups = checkedGroups.length ?\r\n checkedGroups.concat(uncheckedGroups) : // Concat both lists\r\n uncheckedGroups; // No need for concat\r\n\r\n for (let g = 0, glen = groups.length; g < glen; g++) {\r\n group = groups[g];\r\n\r\n for (i = 0, len = group.length; i < len; i++) {\r\n joined[itemIndex++] = group[i];\r\n }\r\n }\r\n\r\n return joined;\r\n }\r\n}\r\n\r\nexport default SelectBox;\r\n"],"names":["value","replace","ItemSymbol","Symbol","DestroyedSymbol","GhostSymbol","hasOwnProperty","Object","prototype","defaultOptions","baseClassName","itemBlurDelay","capturesFocus","multi","keyDownHandler","autoCheckGroupChildren","useExactTargetWidth","constrainToWindow","autoFlipDirection","estimateWidth","virtualMinItems","labelProp","valueProp","on","DropList","[object Object]","options","o","key","entries","undefined","p","this","_p","ownsEl","elOriginalDisplay","additionalClasses","renderItem","unrenderItem","silenceEvents","mitt","focusItemIndex","focusItemEl","sink","DomEventsSink","classes","concat","initialCss","top","el","Element","style","display","classList","add","role","setCssProps","createElement","class","join","css","items","groupCount","mouseHandled","virtualListHelper","VirtualListHelper","list","virtual","buffer","estimatedItemHeight","itemElementCreatorFn","tabIndex","onItemRender","itemEl","index","item","lastMeasureLongestLabelText","setAttribute","console","warn","className","_nocheck","_checked","_group","_child","_nointeraction","_renderItemContent","fn","setOnItemUnrender","err","error","_hookMouseEvents","_hookTouchEvents","_hookFocusEvents","_hookKeyEvents","clearTimeout","blurTimer","filterTimer","remove","destroy","name","Array","from","startsWith","removeAttribute","lastPositionTarget","_syncBaseClasses","prop","hasFocusedItem","_trigger","event","_move","toggleClass","_updateGroupStateForItem","closestUntil","target","getItemIndexFromElement","_setSingleSelectedItemEl","atIndex","addItems","itemsToAdd","isMulti","length","_determineVirtualMode","i","count","oitem","splice","push","addItemsAt","render","newItem","itemIndex","itemIndexByValue","itemAtIndex","call","isItemRendered","refreshItemAt","label","itemIndexByValueOrLabel","removeItemsAt","setCount","slice","positionOptions","isVisible","w","window","targetBox","offset","targetOffset","getElementOffset","left","height","targetHeight","getElementHeight","width","targetWidth","getElementWidth","bottom","viewport","pageYOffset","pageXOffset","innerWidth","innerHeight","right","defaultVerticalDirection","position","y","isVirtual","_measureItem","updateWidth","_updateWidth","maxViewHeight","roomAbove","roomBelow","elComputedStyle","getComputedStyle","isBoxing","boxSizing","verticalPadding","parseFloat","paddingTop","paddingBottom","verticalBorderWidth","borderTopWidth","borderBottomWidth","estimateFullHeight","Math","max","scrollHeight","maxHeight","isNaN","min","enoughRoomAbove","enoughRoomBelow","newDirection","currentDirection","viewSize","isTargetRtl","targetRtl","direction","isRtlDocument","document","documentElement","anchor","anchoredPosition","x","invertYPos","specY","scrollLeft","body","parentNode","abs","scrollWidth","clientWidth","minX","maxX","viewCss","rtl","specX","which","setElementHeight","checked","li","getItemElementAt","values","groupIndexes","indexOf","_updateGroupCheckedState","excludeGroups","hiding","setTimeout","onDocumentMouseDown","contains","_delayBlur","appendChild","visible","originalMaxHeight","clientHeight","marginTop","marginBottom","relayout","parseTransition","transition","reduce","v","delay","duration","blurFocusedItem","scrollItemIndexIntoView","itemElement","_getItemIndex","setFocusedItemAtIndex","setSingleSelectedItemAtIndex","_hasScroll","scrollTop","itemPos","previousPos","getItemPosition","itemSize","getItemSize","listHeight","handler","wrapped","off","all","clear","emit","singleSelectedItemEl","data","_mouseHandled","triggerItemSelection","toggleFocusedItem","activeElement","currentTarget","preventDefault","button","_itemUpAction","_handleMouseOver","_focus","currentTouchId","changedTouches","identifier","didScroll","onScroll","onTouchCancel","elToTrackScroll","find","touch","firstChild","evt","_keydown","VALUE_PAGE_UP","VALUE_PAGE_DOWN","VALUE_HOME","VALUE_END","VALUE_UP","VALUE_DOWN","previousPage","nextPage","previous","next","VALUE_ENTER","VALUE_SPACE","VALUE_ESCAPE","hide","type","_keydownFreeType","character","String","fromCharCode","keyCode","keyword","previousFilter","regex","RegExp","escapeRegex","matchIndices","test","matchIndex","nextIndex","directionUp","isFirstItem","isLastItem","visibleItemCount","getVisibleItemCount","base","nextElementSibling","tagName","itemCount","startedAtIndex","groupIndex","affectedItems","len","nextEl","isCheckingGroup","fireEvents","groupItem","hasChecked","hasUnchecked","shouldCheckGroup","lastMeasureItemCount","longestLabel","lastMeasureLongestLabel","longestLabelText","text","createGhostItemElement","lastMeasureItemWidth","targetItemCount","shouldBeVirtual","setVirtual","textContent","insertBefore","autoWidth","newOuterWidth","setElementWidth","bordersWidth","borderLeftWidth","borderRightWidth","delta","throttle","func","wait","timeout","context","args","result","later","leading","Date","now","apply","throttled","remaining","arguments","trailing","cancel","isScheduled","NoResultsItemSymbol","RestMultiItemsSymbol","hasTouchCapability","DocumentTouch","navigator","maxTouchPoints","hasClass","inputBackbufferCssProps","disabled","clearable","hasOpenIndicator","placeholder","sortSelectedItems","sortListItems","sortListCheckedFirst","stickyValues","sortItemComparator","splitListCheckedGroups","blurOnSingleSelection","showSelection","multiPlaceholderFormatter","searchable","noResultsText","filterThrottleWindow","filterOnEmptyTerm","multiItemLabelProp","maxMultiItems","multiItemsRestLabelProvider","selectedValues","isLoadingMode","SelectBox","listOptions","isArray","Set","renderSingleItem","unrenderSingleItem","renderMultiItem","unrenderMultiItem","renderRestMultiItem","unrenderRestMultiItem","renderNoResultsItem","unrenderNoResultsItem","filterFn","filteredItems","itemsChanged","resizeObserver","selectedItems","selectionChanged","resortBySelectionNeeded","throttledUpdateListItems","_updateListItems","filterTerm","setElementAttrs","aria-haspopup","aria-expanded","_renderBase","multiItemEls","enable","_setupDropdownMenu","clearButtonWrapper","input","focus","selectionStart","selectionEnd","relatedTarget","field","querySelector","_handleInputKeydown","_resizeInput","focusInOutHandler","t","ResizeObserver","observe","setItems","setSelectedValues","setValue","_scheduleSync","syncTimeout","_stopTrackingPresence","dropList","_cleanupSingleWrapper","_removeMultiItemElementByIndex","singleWrapper","inputBackBuffer","openIndicator","disconnect","enabled","toString","resetValues","getSelectedValues","term","mutated","getFilteredItemCount","existingItem","assign","updateItemByValue","performSearch","trim","sortCheckedFirst","comparator","formatter","unrender","setLabelProp","setValueProp","blur","clearEvt","_setInputText","set","has","_setSelectedItems","show","_getDropListPositionOptions","_repositionDropList","getFocusedItemIndex","open","openList","closeList","dropListVisible","setIsLoadingMode","getIsLoadingMode","isListOpen","zIndex","whiteSpace","inputWrapper","autocomplete","autocorrect","autocapitalize","spellcheck","aria-autocomplete","readOnly","_unregisterDropdownEvents","lastActiveElement","_removeMultiItemFromEvent","_handleMultiKeydown","_registerDropdownEvents","spinner","customRenderItem","customUnrenderItem","_startTrackingPresence","parent","offsetHeight","offsetWidth","selEvt","setItemChecked","idx","hasGroupSync","filter","selectEvt","avoidToggleFromClick","suppressKeyPress","suppressKeyPressRepeat","keyEventsTarget","_movePrev","_moveNext","lastKeyAllowsSpaceToggle","VALUE_TAB","toggleList","stopPropagation","isDisabled","tevt","isMultiEnabled","getSelectedItems","setSelectedItems","_refilterItems","_lastSerializedBox","_sortItems","removeAllItems","hasRefocusedItem","setCheckedValues","singleItemIndex","getValue","matcher","lastGroup","map","mode","syncQueue","queue","_performSync","op","_syncFull","_syncSingleItem","_syncPlaceholder","findIndex","_addMultiItemElement","_addMultiItemRestElement","childNodes","innerHTML","pop","createTextNode","_renderMultiItem","before","clearButton","append","title","defaultMultiPlaceholderFormatter","_renderSingleItemContent","fullItemsRender","_syncClearButton","a","b","sa","sb","aLabel","bLabel","sort","actualItemCount","addRestItem","getRootNode","tabindex","_renderMultiItemContent","originatingEvent","nextFocus","kEvent","VALUE_DELETE","VALUE_BACK_SPACE","prev","itemsToRemove","removeselEvt","_removeMultiItem","populate","backBufferEl","inputValue","hasResize","beforeWidth","afterWidth","beforeStyle","content","float","getPseudoElementWidth","afterStyle","contentWidth","getCssProps","computedStyle","paddingTotal","paddingLeft","paddingRight","minWidth","backBufferWidth","currentWidth","newWidth","box","getBoundingClientRect","serialized","ctrlKey","isRtl","VALUE_LEFT","VALUE_RIGHT","shift","presenceInt","setInterval","clearInterval","splitCheckedGroups","group","stickyGroup","groups","selectedValuesSet","unshift","checkedGroups","uncheckedGroups","g","glen","aChecked","bChecked","virtualGroup","gi","gilen","sgi","joined"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["lib/utils/escapeRegex.js","lib/DropList.js","lib/utils/throttle.js","lib/SelectBox.js"],"sourcesContent":["export default value => value.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\r\n","import escapeRegex from './utils/escapeRegex';\r\nimport {\r\n closestUntil,\r\n createElement,\r\n} from '@danielgindi/dom-utils/lib/Dom';\r\nimport {\r\n remove,\r\n toggleClass,\r\n} from '@danielgindi/dom-utils/lib/DomCompat';\r\nimport {\r\n setCssProps,\r\n getElementHeight,\r\n getElementWidth,\r\n setElementHeight,\r\n setElementWidth, getElementOffset, anchoredPosition,\r\n parseTransition,\r\n} from '@danielgindi/dom-utils/lib/Css';\r\nimport DomEventsSink from '@danielgindi/dom-utils/lib/DomEventsSink';\r\nimport VirtualListHelper from '@danielgindi/virtual-list-helper';\r\nimport {\r\n VALUE_DOWN,\r\n VALUE_END,\r\n VALUE_ENTER, VALUE_ESCAPE,\r\n VALUE_HOME,\r\n VALUE_PAGE_DOWN,\r\n VALUE_PAGE_UP,\r\n VALUE_SPACE,\r\n VALUE_UP,\r\n} from 'keycode-js';\r\nimport mitt from 'mitt';\r\n\r\nconst ItemSymbol = Symbol('item');\r\nconst DestroyedSymbol = Symbol('destroyed');\r\nconst GhostSymbol = Symbol('ghost');\r\n\r\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\r\n\r\n/**\r\n * @typedef {Object} DropList.Options\r\n * @property {Element} [el] An element to attach to, instead of creating a new one\r\n * @property {string} [baseClassName='droplist'] class name for the menu root element\r\n * @property {string|string[]} [additionalClasses]\r\n * @property {number} [itemBlurDelay=300] How long to wait before deciding to blur the focused item?\r\n * @property {boolean} [capturesFocus=true] Should this DropList be added to the TAB-key stack?\r\n * @property {boolean} [multi=false] Does this DropList show checkboxes for multiple item selection?\r\n * @property {function} [keyDownHandler=null] An alternative \"keydown\" event handler. Return true to prevent default behaviour.\r\n * @property {boolean} [autoCheckGroupChildren=true] When a group is checked/unchecked - all items beneath it will update accordingly\r\n * @property {boolean} [useExactTargetWidth=false] Use the exact target's width, do not allow growing\r\n * @property {boolean} [constrainToWindow=true] Should the position be constrained to the window, attaching to window's borders if needed?\r\n * @property {Boolean} [autoFlipDirection=true] Should the position/anchor be flipped automatically when there's no space in the required direction?\r\n * @property {number} [estimatedItemHeight=20] An estimated row height, for approximating scroll height.\r\n * @property {boolean} [estimateWidth=false] Use an estimation for the width instead of measuring. May be faster - needs testing and may depend on the CSS.\r\n * @property {number} [virtualMinItems=100] Turns into a virtual list - with items being created and showing up on viewport only. The value specified the minimum item count where a virtual list will be created.\r\n * @property {string} [labelProp='label']\r\n * @property {string} [valueProp='value']\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderItem] Function to call when rendering an item element\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderItem] Function to call when rendering an item element\r\n * @property {function(name: string, data: *)} [on]\r\n * */\r\n/** */\r\n\r\n/**\r\n * @typedef {Object} DropList.PositionAnchor\r\n * @property {'left'|'center'|'right'|'start'|'end'|string|number} x - horizontal anchor specification (could be either `'left'|'center'|'right'|'start'|'end'` or a percentage `'50%'` or a fixed decimal `Number`)\r\n * @property {'top'|'center'|'bottom'|string|number} y - vertical anchor specification (could be either `'top'|'center'|'bottom'` or a percentage `'50%'` or a fixed decimal `Number`)\r\n * */\r\n/** */\r\n\r\n/**\r\n * @typedef {Object} DropList.PositionOptions\r\n * @property {Element} [target] Target element to act as anchor\r\n * @property {{left: number, top: number}} [targetOffset=undefined] Override the offset of target. Automatically calculated if unspecified.\r\n * @property {number} [targetHeight=undefined] Override height of the target\r\n * @property {number} [targetWidth=undefined] Override width of the target\r\n * @property {DropList.PositionAnchor} [position=undefined]\r\n * @property {DropList.PositionAnchor} [anchor=undefined]\r\n * @property {boolean} [updateWidth=false] Should update the width of the menu according to target\r\n * @property {string} [targetRtl=undefined] Override for rtl mode of the target\r\n * @property {{x: number, y: number}} [offset=undefined] Extra rtl-aware offset to the target\r\n * */\r\n/** */\r\n\r\n/**\r\n * @typedef {Object} DropList.ItemBase\r\n * @property {string} [value]\r\n * @property {string} [label]\r\n * @property {boolean} [_group=false]\r\n * @property {boolean} [_child=false]\r\n * @property {boolean} [_nocheck=false]\r\n * @property {boolean} [_nointeraction=false]\r\n * */\r\n\r\n/**\r\n * @typedef {DropList.ItemBase} DropList.Item\r\n * @property {boolean} [_checked=false]\r\n * */\r\n/** */\r\n\r\n/** @type {DropList.Options} */\r\nlet defaultOptions = {\r\n baseClassName: 'droplist',\r\n\r\n itemBlurDelay: 300,\r\n capturesFocus: true,\r\n multi: false,\r\n keyDownHandler: null,\r\n autoCheckGroupChildren: true,\r\n useExactTargetWidth: false,\r\n\r\n constrainToWindow: true,\r\n autoFlipDirection: true,\r\n\r\n estimateWidth: false,\r\n virtualMinItems: 100,\r\n\r\n labelProp: 'label',\r\n valueProp: 'value',\r\n\r\n on: null,\r\n};\r\n\r\n/*\r\nEmits the following events:\r\n---------------------------\r\n\r\n'itemfocus' {value, item, event}: item gained focus.\r\n'itemblur' {value, item}: item lost focus.\r\n'select' {value, item}: item was selected (in single mode).\r\n'show:before': the drop list will show.\r\n'show': the drop list has been shown.\r\n'hide:before': the drop list will hide.\r\n'hide': the drop list was hidden.\r\n'hide:after': emitted after the hide css transition has ended, or immediately after 'hide'.\r\n'check' {value, item, checked: boolean, isGroup: boolean, isCheckingGroup: boolean}: item was selected (in multi mode).\r\n'groupcheck' {value, item, affectedItems}: item was selected (in multi mode).\r\n */\r\n\r\n// noinspection JSUnusedGlobalSymbols\r\nclass DropList {\r\n\r\n /**\r\n * @param {DropList.Options} options\r\n */\r\n constructor(options) {\r\n const o = { ...defaultOptions };\r\n\r\n for (let [key, value] of Object.entries(/**@type Object*/options))\r\n if (value !== undefined)\r\n o[key] = value;\r\n\r\n const p = this._p = {\r\n ownsEl: true,\r\n elOriginalDisplay: '',\r\n\r\n baseClassName: o.baseClassName,\r\n additionalClasses: o.additionalClasses,\r\n itemBlurDelay: o.itemBlurDelay,\r\n capturesFocus: o.capturesFocus,\r\n multi: o.multi,\r\n keyDownHandler: o.keyDownHandler,\r\n autoCheckGroupChildren: o.autoCheckGroupChildren,\r\n useExactTargetWidth: o.useExactTargetWidth,\r\n constrainToWindow: o.constrainToWindow,\r\n autoFlipDirection: o.autoFlipDirection,\r\n estimateWidth: o.estimateWidth,\r\n virtualMinItems: o.virtualMinItems,\r\n labelProp: o.labelProp,\r\n valueProp: o.valueProp,\r\n renderItem: o.renderItem,\r\n unrenderItem: o.unrenderItem,\r\n on: o.on || null,\r\n silenceEvents: true,\r\n mitt: mitt(),\r\n\r\n focusItemIndex: -1,\r\n focusItemEl: null,\r\n\r\n sink: new DomEventsSink(),\r\n };\r\n\r\n let classes = [p.baseClassName];\r\n\r\n if (p.additionalClasses) {\r\n classes = classes.concat(p.additionalClasses);\r\n }\r\n\r\n const initialCss = {\r\n // make initial position not interfere with layout so it can be correctly calculated\r\n top: '-9999px',\r\n };\r\n\r\n let el = o.el;\r\n if (el instanceof Element) {\r\n p.elOriginalDisplay = el.style.display || '';\r\n el.classList.add(...classes);\r\n el.role = 'menu';\r\n setCssProps(/**@type ElementCSSInlineStyle*/el, initialCss);\r\n p.ownsEl = false;\r\n } else {\r\n el = createElement('ul', {\r\n class: classes.join(' '),\r\n role: 'menu',\r\n css: initialCss,\r\n });\r\n }\r\n\r\n p.el = el;\r\n\r\n p.items = [];\r\n\r\n p.groupCount = 0; // This will keep state of how many `group` items we have\r\n\r\n p.mouseHandled = false;\r\n\r\n p.virtualListHelper = new VirtualListHelper({\r\n list: p.el,\r\n virtual: true,\r\n buffer: 5,\r\n estimatedItemHeight: o.estimatedItemHeight || 20,\r\n itemElementCreatorFn: () => {\r\n return createElement('li',\r\n {\r\n role: 'menuitem',\r\n tabIndex: p.capturesFocus ? -1 : null,\r\n },\r\n );\r\n },\r\n onItemRender: (itemEl, index) => {\r\n let item;\r\n\r\n if ((/**@type any*/index) === GhostSymbol) {\r\n item = {\r\n label: p.lastMeasureLongestLabelText,\r\n value: 'Measure',\r\n\r\n [ItemSymbol]: {\r\n [p.labelProp]: p.lastMeasureLongestLabelText,\r\n [p.valueProp]: 'Measure',\r\n },\r\n };\r\n itemEl.setAttribute('aria-hidden', 'true');\r\n } else {\r\n item = p.items[index];\r\n }\r\n\r\n if (!item) {\r\n // eslint-disable-next-line no-console\r\n console.warn('onItemRender called for (' + index + ') which has no item');\r\n }\r\n\r\n itemEl.className = `${p.baseClassName}__item`;\r\n\r\n const classList = itemEl.classList;\r\n\r\n if (p.multi) {\r\n if (item._nocheck) {\r\n classList.add(`${p.baseClassName}__item_multi_nocheck`);\r\n } else {\r\n classList.add(`${p.baseClassName}__item_multi`);\r\n\r\n if (item._checked) {\r\n classList.add(`${p.baseClassName}__item_checked`);\r\n }\r\n }\r\n } else {\r\n classList.add(`${p.baseClassName}__item_single`);\r\n }\r\n\r\n if (item._group)\r\n classList.add(`${p.baseClassName}__item_group`);\r\n\r\n if (item._child)\r\n classList.add(`${p.baseClassName}__item_child`);\r\n\r\n if (item._nointeraction)\r\n classList.add(`${p.baseClassName}__item_nointeraction`);\r\n\r\n if (p.focusItemIndex === index) {\r\n p.focusItemEl = itemEl;\r\n classList.add(`${p.baseClassName}__item_focus`);\r\n }\r\n\r\n this._renderItemContent(item, itemEl);\r\n\r\n itemEl[ItemSymbol] = item;\r\n },\r\n });\r\n\r\n if (typeof p.unrenderItem === 'function') {\r\n const fn = p.unrenderItem;\r\n p.virtualListHelper.setOnItemUnrender(el => {\r\n try {\r\n fn(el[ItemSymbol][ItemSymbol], el);\r\n } catch (err) { console.error(err); } // eslint-disable-line no-console\r\n delete el[ItemSymbol];\r\n\r\n if (p.focusItemEl === el)\r\n p.focusItemEl = null;\r\n });\r\n } else {\r\n p.virtualListHelper.setOnItemUnrender(el => {\r\n delete el[ItemSymbol];\r\n\r\n if (p.focusItemEl === el)\r\n p.focusItemEl = null;\r\n });\r\n }\r\n\r\n if (p.capturesFocus) {\r\n el.tabIndex = 0;\r\n }\r\n\r\n this._hookMouseEvents();\r\n this._hookTouchEvents();\r\n this._hookFocusEvents();\r\n this._hookKeyEvents();\r\n\r\n this.silenceEvents = false;\r\n }\r\n\r\n destroy() {\r\n if (this[DestroyedSymbol])\r\n return;\r\n this[DestroyedSymbol] = true;\r\n\r\n const p = this._p;\r\n\r\n clearTimeout(p.blurTimer);\r\n clearTimeout(p.filterTimer);\r\n\r\n p.sink.remove();\r\n p.virtualListHelper.destroy();\r\n\r\n if (p.el) {\r\n remove(p.el);\r\n }\r\n\r\n if (!p.ownsEl) {\r\n for (let name of Array.from(p.el.classList)) {\r\n if (name.startsWith(p.baseClassName)) {\r\n p.el.classList.remove(name);\r\n }\r\n }\r\n p.el.removeAttribute('role');\r\n for (let key of ['position', 'left', 'top', 'right', 'bottom', 'z-index']) {\r\n p.el.style[key] = '';\r\n }\r\n p.el.style.display = p.elOriginalDisplay;\r\n }\r\n\r\n if (p.lastPositionTarget) {\r\n p.lastPositionTarget.classList.remove(\r\n `has_${p.baseClassName}`,\r\n `has_${p.baseClassName}_above`,\r\n `has_${p.baseClassName}_below`);\r\n delete p.lastPositionTarget;\r\n }\r\n\r\n this._p = null;\r\n }\r\n\r\n get el() {\r\n return this._p.el;\r\n }\r\n\r\n /**\r\n * @param {string|string[]} classes\r\n * @returns {DropList}\r\n */\r\n setAdditionalClasses(classes) {\r\n const p = this._p;\r\n p.additionalClasses = classes;\r\n this._syncBaseClasses();\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {DropList}\r\n */\r\n setLabelProp(prop) {\r\n const p = this._p;\r\n p.labelProp = prop;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {DropList}\r\n */\r\n setValueProp(prop) {\r\n const p = this._p;\r\n p.valueProp = prop;\r\n return this;\r\n }\r\n\r\n _syncBaseClasses() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!el)\r\n return;\r\n\r\n let classes = [p.baseClassName];\r\n\r\n if (p.additionalClasses) {\r\n classes = classes.concat(p.additionalClasses);\r\n }\r\n\r\n el.className = classes.join(' ');\r\n }\r\n\r\n blurFocusedItem() {\r\n const p = this._p;\r\n\r\n clearTimeout(p.blurTimer);\r\n\r\n if (!this.hasFocusedItem()) {\r\n return;\r\n }\r\n\r\n let focusItemEl = p.focusItemEl;\r\n if (focusItemEl) {\r\n focusItemEl.classList.remove(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = null;\r\n }\r\n\r\n const item = p.items[p.focusItemIndex];\r\n p.focusItemIndex = -1;\r\n\r\n if (!item)\r\n return;\r\n\r\n this._trigger('itemblur', { value: item.value, item: item[ItemSymbol] ?? item });\r\n }\r\n\r\n nextPage(event) {\r\n this._move('next_page', event);\r\n }\r\n\r\n previousPage(event) {\r\n this._move('prev_page', event);\r\n }\r\n\r\n toggleFocusedItem() {\r\n const p = this._p;\r\n\r\n if (this.hasFocusedItem() && p.multi) {\r\n let item = p.items[p.focusItemIndex];\r\n if (item._nocheck || item._nointeraction) return this;\r\n\r\n item._checked = !item._checked;\r\n if (p.focusItemEl) {\r\n toggleClass(p.focusItemEl, `${p.baseClassName}__item_checked`, item._checked);\r\n }\r\n this._trigger('check', {\r\n value: item.value,\r\n item: item[ItemSymbol] ?? item,\r\n checked: item._checked,\r\n isGroup: item._group,\r\n isCheckingGroup: false,\r\n });\r\n\r\n this._updateGroupStateForItem(item);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n triggerItemSelection(event) {\r\n const p = this._p;\r\n\r\n p.focusItemEl = p.focusItemEl || closestUntil(event.target, 'li', p.el);\r\n p.focusItemIndex = p.virtualListHelper.getItemIndexFromElement(p.focusItemEl);\r\n if (p.focusItemIndex === undefined)\r\n p.focusItemIndex = -1;\r\n\r\n let item = p.focusItemEl[ItemSymbol];\r\n if (item._nointeraction) {\r\n return false;\r\n }\r\n\r\n if (!p.multi) {\r\n this._setSingleSelectedItemEl(p.focusItemEl);\r\n }\r\n\r\n this._trigger('select', { value: item ? item.value : undefined, item: item[ItemSymbol] ?? item });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.Item} item The item to add. It is copied.\r\n * @param {number} [atIndex=-1] The index to insert at (or -1)\r\n * @returns {DropList}\r\n */\r\n addItem(item, atIndex = -1) {\r\n return this.addItems([item], atIndex);\r\n }\r\n\r\n /**\r\n * Adds items to the menu and renders\r\n * @param {DropList.Item[]} itemsToAdd The items to add. These are copied.\r\n * @param {number} [atIndex=-1] The index to insert at (or -1)\r\n * @returns {DropList}\r\n */\r\n addItems(itemsToAdd, atIndex = -1) {\r\n const p = this._p, labelProp = p.labelProp, valueProp = p.valueProp;\r\n\r\n let isMulti = p.multi;\r\n let items = p.items;\r\n\r\n if (atIndex == null || atIndex < 0 || atIndex >= p.items.length) {\r\n atIndex = -1;\r\n }\r\n\r\n // Determine if the list is virtual or not\r\n this._determineVirtualMode(items.length + itemsToAdd.length);\r\n\r\n for (let i = 0, count = itemsToAdd.length; i < count; i++) {\r\n let oitem = itemsToAdd[i];\r\n //noinspection PointlessBooleanExpressionJS\r\n let item = {\r\n [ItemSymbol]: oitem,\r\n label: oitem[labelProp],\r\n value: oitem[valueProp],\r\n _nocheck: !!oitem._nocheck,\r\n _nointeraction: !!oitem._nointeraction,\r\n };\r\n\r\n if (isMulti) {\r\n item._checked = !!oitem._checked;\r\n }\r\n\r\n if (oitem._group) {\r\n item._group = true;\r\n p.groupCount++;\r\n }\r\n\r\n if (oitem._child) {\r\n // This is used for setting a child class,\r\n // But can be used to determine that current item is not part of above group,\r\n // mainly where the groups are oddly sorted.\r\n item._child = true;\r\n }\r\n\r\n // Add the item to the list of them\r\n if (atIndex !== -1) {\r\n items.splice(atIndex, 0, item);\r\n } else {\r\n items.push(item);\r\n }\r\n\r\n if (atIndex !== -1) {\r\n atIndex++;\r\n }\r\n }\r\n\r\n p.virtualListHelper\r\n .addItemsAt(itemsToAdd.length, atIndex === -1 ? atIndex : (atIndex - itemsToAdd.length))\r\n .render();\r\n\r\n return this;\r\n }\r\n\r\n updateItemByValue(value, newItem) {\r\n const p = this._p;\r\n\r\n // Look for the proper item\r\n let itemIndex = this.itemIndexByValue(value);\r\n if (itemIndex < -1) return this;\r\n\r\n let item = this.itemAtIndex(itemIndex);\r\n item[ItemSymbol] = newItem;\r\n\r\n if (hasOwnProperty.call(newItem, p.labelProp))\r\n item.label = newItem[p.labelProp];\r\n\r\n if (hasOwnProperty.call(newItem, p.valueProp))\r\n item.value = newItem[p.valueProp];\r\n\r\n if (hasOwnProperty.call(newItem, '_nocheck'))\r\n item._nocheck = !!newItem._nocheck;\r\n\r\n if (hasOwnProperty.call(newItem, '_nointeraction'))\r\n item._nointeraction = !!newItem._nointeraction;\r\n\r\n if (p.multi) {\r\n if (hasOwnProperty.call(newItem, '_checked'))\r\n item._checked = !!newItem._checked;\r\n }\r\n\r\n if (hasOwnProperty.call(newItem, '_group')) {\r\n if (!!newItem._group !== item._group) {\r\n if (item._group)\r\n p.groupCount--;\r\n else p.groupCount++;\r\n\r\n newItem._group = !!item._group;\r\n }\r\n }\r\n\r\n if (hasOwnProperty.call(newItem, '_child'))\r\n item._child = !!newItem._child;\r\n\r\n if (p.virtualListHelper.isItemRendered(itemIndex)) {\r\n p.virtualListHelper\r\n .refreshItemAt(itemIndex)\r\n .render();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n removeItem(value, label) {\r\n const p = this._p;\r\n\r\n // Look for the proper item\r\n let itemIndex = this.itemIndexByValueOrLabel(value, label);\r\n if (itemIndex < -1) return this;\r\n\r\n let spliced = p.items.splice(itemIndex, 1);\r\n if (spliced[0]._group) {\r\n p.groupCount--;\r\n }\r\n\r\n p.virtualListHelper\r\n .removeItemsAt(itemIndex, 1)\r\n .render();\r\n\r\n return this;\r\n }\r\n\r\n removeAllItems() {\r\n const p = this._p;\r\n\r\n p.items.length = 0;\r\n p.groupCount = 0;\r\n\r\n p.virtualListHelper\r\n .setCount(0)\r\n .render();\r\n\r\n return this;\r\n }\r\n\r\n itemDataByValue(value) {\r\n const p = this._p;\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (item.value === value) {\r\n return item[ItemSymbol];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n itemIndexByValue(value) {\r\n const p = this._p;\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (item.value === value) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n itemIndexByValueOrLabel(value, label) {\r\n const p = this._p;\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (item.value === value || item.label === label) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n items() {\r\n return this._p.items.map(x => x[ItemSymbol]);\r\n }\r\n\r\n itemsReference() {\r\n return this._p.items;\r\n }\r\n\r\n itemCount() {\r\n return this._p.items.length;\r\n }\r\n\r\n itemAtIndex(index) {\r\n return this._p.items[index]?.[ItemSymbol];\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.PositionOptions} positionOptions\r\n * @returns {DropList}\r\n * @public\r\n */\r\n relayout(positionOptions) {\r\n const p = this._p, el = p.el;\r\n\r\n if (!this.isVisible()) return this;\r\n\r\n let w = window;\r\n\r\n let targetBox = {};\r\n\r\n let offset = positionOptions.targetOffset || getElementOffset(positionOptions.target);\r\n targetBox.left = offset.left;\r\n targetBox.top = offset.top;\r\n targetBox.height = positionOptions.targetHeight == null\r\n ? getElementHeight(positionOptions.target, true, true)\r\n : positionOptions.targetHeight;\r\n targetBox.width = positionOptions.targetWidth == null\r\n ? getElementWidth(positionOptions.target, true, true)\r\n : positionOptions.targetWidth;\r\n targetBox.bottom = targetBox.top + targetBox.height;\r\n\r\n let viewport = {};\r\n viewport.top = w.pageYOffset;\r\n viewport.left = w.pageXOffset;\r\n viewport.width = w.innerWidth;\r\n viewport.height = w.innerHeight;\r\n viewport.bottom = viewport.top + viewport.height;\r\n viewport.right = viewport.left + viewport.width;\r\n\r\n let defaultVerticalDirection = (positionOptions.position && positionOptions.position.y === 'bottom')\r\n ? 'above'\r\n : 'below';\r\n\r\n // Reset dropdown width\r\n el.style.width = '';\r\n\r\n // Make estimations\r\n if (p.estimateWidth ||\r\n p.virtualListHelper.isVirtual()) {\r\n this._measureItem();\r\n }\r\n\r\n // Calculate virtual viewport size\r\n if (p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.render();\r\n }\r\n\r\n // Now set the width of the dropdown\r\n if (positionOptions.updateWidth) {\r\n this._updateWidth(positionOptions);\r\n }\r\n\r\n // How much space is there above, and how much below?\r\n let roomAbove = targetBox.top - viewport.top;\r\n let roomBelow = viewport.bottom - targetBox.bottom;\r\n\r\n // Calculate height for dropdown\r\n\r\n let maxViewHeight;\r\n\r\n const elComputedStyle = getComputedStyle(el);\r\n\r\n let isBoxing = elComputedStyle.boxSizing === 'border-box';\r\n let verticalPadding = (parseFloat(elComputedStyle.paddingTop) || 0) +\r\n (parseFloat(elComputedStyle.paddingBottom) || 0);\r\n let verticalBorderWidth = (parseFloat(elComputedStyle.borderTopWidth) || 0) +\r\n (parseFloat(elComputedStyle.borderBottomWidth) || 0);\r\n\r\n if (p.virtualListHelper.isVirtual()) {\r\n maxViewHeight =\r\n p.virtualListHelper.estimateFullHeight() +\r\n verticalPadding +\r\n verticalBorderWidth;\r\n } else {\r\n // Another method to calculate height is measuring the whole thing at once.\r\n // This causes relayout of course.\r\n el.style.height = '';\r\n el.style.top = '-9999px';\r\n\r\n maxViewHeight = Math.max(getElementHeight(p.el), el.scrollHeight);\r\n maxViewHeight += verticalPadding + verticalBorderWidth;\r\n }\r\n\r\n // Consider css max-height\r\n\r\n let maxHeight = parseFloat(elComputedStyle.maxHeight);\r\n if (!isNaN(maxHeight)) {\r\n if (!isBoxing) {\r\n maxHeight += verticalPadding + verticalBorderWidth;\r\n }\r\n\r\n maxViewHeight = Math.min(maxViewHeight, maxHeight);\r\n }\r\n\r\n // Figure out the direction\r\n\r\n let enoughRoomAbove = roomAbove >= maxViewHeight;\r\n let enoughRoomBelow = roomBelow >= maxViewHeight;\r\n\r\n let newDirection = p.currentDirection || defaultVerticalDirection;\r\n if (newDirection === 'above' && !enoughRoomAbove && enoughRoomBelow) {\r\n newDirection = 'below';\r\n } else if (newDirection === 'below' && !enoughRoomBelow && enoughRoomAbove) {\r\n newDirection = 'above';\r\n } else if (enoughRoomAbove && enoughRoomBelow) {\r\n if (newDirection !== defaultVerticalDirection &&\r\n ((defaultVerticalDirection === 'above' && roomAbove >= roomBelow) ||\r\n (defaultVerticalDirection === 'below' && roomBelow >= roomAbove))) {\r\n newDirection = defaultVerticalDirection;\r\n }\r\n } else if (!enoughRoomAbove && !enoughRoomBelow) {\r\n if (roomAbove > roomBelow) {\r\n newDirection = 'above';\r\n } else if (roomBelow > roomAbove) {\r\n newDirection = 'below';\r\n }\r\n }\r\n p.currentDirection = newDirection;\r\n\r\n // Figure out that final view size\r\n let viewSize = {\r\n width: getElementWidth(el, true, true),\r\n height: Math.min(maxViewHeight, Math.max(roomAbove, roomBelow, 0)),\r\n };\r\n\r\n let isTargetRtl = positionOptions.targetRtl !== undefined ?\r\n positionOptions.targetRtl :\r\n (positionOptions.target == null ? false : getComputedStyle(positionOptions.target).direction === 'rtl');\r\n let isRtlDocument = getComputedStyle(document.documentElement).direction === 'rtl';\r\n\r\n let anchor = anchoredPosition(positionOptions.target,\r\n positionOptions.anchor ? positionOptions.anchor.x : 'start',\r\n positionOptions.anchor ? positionOptions.anchor.y : 'bottom',\r\n targetBox, isTargetRtl);\r\n let position = anchoredPosition(el,\r\n positionOptions.position ? positionOptions.position.x : 'start',\r\n positionOptions.position ? positionOptions.position.y : 'top',\r\n viewSize, isTargetRtl);\r\n\r\n // If it's not in the direction that the user expected, invert it\r\n let invertYPos =\r\n (position.specY === 'top' && newDirection === 'above') ||\r\n (position.specY === 'bottom' && newDirection === 'below') ||\r\n (position.specY !== 'bottom' && position.specY !== 'top' && newDirection === 'above');\r\n\r\n let scrollLeft =\r\n (w.pageXOffset !== undefined) ?\r\n w.pageXOffset :\r\n (document.documentElement || document.body.parentNode || document.body).scrollLeft;\r\n scrollLeft = Math.abs(scrollLeft);\r\n if (isRtlDocument) {\r\n scrollLeft = document.documentElement.scrollWidth - scrollLeft - document.documentElement.clientWidth;\r\n }\r\n\r\n let minX = scrollLeft,\r\n maxX = document.documentElement.clientWidth + scrollLeft - viewSize.width;\r\n\r\n let viewCss = {\r\n 'position': 'absolute',\r\n 'left': targetBox.left,\r\n 'top': targetBox.top + (invertYPos ? (anchor.bottom - position.bottom) : (anchor.top - position.top)),\r\n };\r\n\r\n if (isRtlDocument) {\r\n viewCss.left -= document.documentElement.clientWidth - document.documentElement.scrollWidth;\r\n }\r\n\r\n viewCss.left += anchor.left - position.left;\r\n\r\n if (positionOptions.offset) {\r\n if (positionOptions.offset.y) {\r\n if (invertYPos) {\r\n viewCss.top -= positionOptions.offset.y;\r\n } else {\r\n viewCss.top += positionOptions.offset.y;\r\n }\r\n }\r\n\r\n if (positionOptions.offset.x) {\r\n let rtl = elComputedStyle.direction === 'rtl';\r\n viewCss.left += rtl\r\n ? -positionOptions.offset.x\r\n : positionOptions.offset.x;\r\n }\r\n }\r\n\r\n if (p.autoFlipDirection) {\r\n if ((position.specX === 'right' &&\r\n viewCss.left < minX &&\r\n (Math.max(viewCss.left, minX) + viewSize.width - targetBox.left) / targetBox.width > 0.5) ||\r\n (position.specX === 'left' &&\r\n viewCss.left > maxX &&\r\n (Math.min(viewCss.left, maxX) - targetBox.left) / targetBox.width < 0.5)) {\r\n viewCss.left -= anchor.left - position.left;\r\n viewCss.left += anchor.right - position.right;\r\n }\r\n }\r\n\r\n // Constrain to the window if required\r\n if (p.constrainToWindow) {\r\n for (let which of (isRtlDocument ? ['min', 'max'] : ['max', 'min'])) {\r\n if (which === 'min' && viewCss.left < minX)\r\n viewCss.left = minX;\r\n else if (which === 'max' && viewCss.left > maxX)\r\n viewCss.left = maxX;\r\n }\r\n }\r\n\r\n // Set position CSS\r\n viewCss.left += 'px';\r\n viewCss.top += 'px';\r\n setCssProps(el, viewCss);\r\n setElementHeight(el, viewSize.height, true, true);\r\n\r\n // Update the scroll position for virtual lists\r\n p.virtualListHelper.render();\r\n\r\n // Update position classes\r\n if (positionOptions && positionOptions.target) {\r\n p.lastPositionTarget = positionOptions.target;\r\n\r\n toggleClass(positionOptions.target, `has_${p.baseClassName}`, true);\r\n toggleClass(positionOptions.target, `has_${p.baseClassName}_below`, newDirection === 'below');\r\n toggleClass(positionOptions.target, `has_${p.baseClassName}_above`, newDirection === 'above');\r\n\r\n toggleClass(el, `${p.baseClassName}__is_below`, newDirection === 'below');\r\n toggleClass(el, `${p.baseClassName}__is_above`, newDirection === 'above');\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the checked mode of a specific value.\r\n * @public\r\n * @param {*} value - array of values to check\r\n * @param {boolean} checked - will the value be checked?\r\n * @returns {DropList} self\r\n */\r\n setItemChecked(value, checked) {\r\n const p = this._p;\r\n\r\n checked = !!checked;\r\n\r\n let index = this.itemIndexByValue(value);\r\n if (index === -1) return this;\r\n\r\n let li = p.virtualListHelper.getItemElementAt(index);\r\n if (!li) return this;\r\n\r\n let item = li[ItemSymbol];\r\n\r\n checked = checked && !item._nocheck;\r\n\r\n if (item._checked !== checked) {\r\n item._checked = checked;\r\n\r\n toggleClass(li, `${p.baseClassName}__item_checked`, item._checked);\r\n\r\n this._updateGroupStateForItem(item);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the checked values. All the other values will be unchecked,\r\n * @public\r\n * @param {Array<*>} values - array of values to check\r\n * @returns {DropList} self\r\n */\r\n setCheckedValues(values) {\r\n const p = this._p;\r\n\r\n let groupIndexes = [];\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n let checked = !item._nocheck && values.indexOf(item.value) !== -1;\r\n\r\n if (item._group) {\r\n groupIndexes.push(i);\r\n }\r\n\r\n if (item._checked === checked) continue;\r\n\r\n item._checked = checked;\r\n\r\n let li = p.virtualListHelper.getItemElementAt(i);\r\n if (!li) continue;\r\n\r\n toggleClass(li, `${p.baseClassName}__item_checked`, item._checked);\r\n }\r\n\r\n if (p.autoCheckGroupChildren) {\r\n for (let i = 0, count = groupIndexes.length; i < count; i++) {\r\n this._updateGroupCheckedState(groupIndexes[i], false);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get all checked values. Returns array of item values.\r\n * @public\r\n * @param {boolean} excludeGroups=false Exclude group items\r\n * @returns {Array<*>} self\r\n */\r\n getCheckedValues(excludeGroups) {\r\n const p = this._p;\r\n\r\n excludeGroups = excludeGroups && p.groupCount > 0;\r\n\r\n let values = [];\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (!item._checked) continue;\r\n if (excludeGroups && item._group) continue;\r\n values.push(item.value);\r\n }\r\n\r\n return values;\r\n }\r\n\r\n /**\r\n * Get all checked items. Returns array of actual item data object.\r\n * @public\r\n * @param {boolean} excludeGroups=false Exclude group items\r\n * @returns {DropList.Item[]}\r\n */\r\n getCheckedItems(excludeGroups) {\r\n const p = this._p;\r\n\r\n excludeGroups = excludeGroups && p.groupCount > 0;\r\n\r\n let items = [];\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (!item._checked) continue;\r\n if (excludeGroups && item._group) continue;\r\n items.push(item[ItemSymbol]);\r\n }\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.PositionOptions?} positionOptions\r\n * @returns {DropList}\r\n * @public\r\n */\r\n show(positionOptions) {\r\n const p = this._p;\r\n\r\n p.hiding = false;\r\n\r\n if (!this.isVisible()) {\r\n this._trigger('show:before');\r\n }\r\n\r\n p.mouseHandled = false;\r\n\r\n setTimeout(() => { // Skip the end of a 'click' event\r\n if (this[DestroyedSymbol]) return;\r\n\r\n if (!p.onDocumentMouseDown) {\r\n // Detect mouse tap outside of the droplist, to blur the focused item\r\n p.sink.add(document, 'mousedown', p.onDocumentMouseDown = (event) => {\r\n if (!p.el.contains(event.target))\r\n this._delayBlur();\r\n });\r\n }\r\n });\r\n\r\n const el = p.el;\r\n el.style.position = 'absolute';\r\n el.classList.remove(`${p.baseClassName}__is-hiding`);\r\n document.body.appendChild(el);\r\n\r\n p.visible = true;\r\n\r\n p.el.style.display = '';\r\n if (getComputedStyle(p.el).display === 'none')\r\n p.el.style.display = 'block';\r\n\r\n if (positionOptions) {\r\n const elComputedStyle = getComputedStyle(el);\r\n\r\n // Set max height to avoid adding scrollbars to page\r\n const originalMaxHeight = el.style.maxHeight;\r\n let maxHeight = document.body.clientHeight -\r\n (parseFloat(elComputedStyle.marginTop) || 0) -\r\n (parseFloat(elComputedStyle.marginBottom) || 0) -\r\n (elComputedStyle.boxSizing === 'border-box'\r\n ? 0\r\n : ((parseFloat(elComputedStyle.borderTopWidth) || 0) +\r\n (parseFloat(elComputedStyle.borderBottomWidth) || 0)));\r\n\r\n el.style.maxHeight = Math.min(maxHeight, parseFloat(elComputedStyle.maxHeight) || maxHeight) + 'px';\r\n\r\n this.relayout(positionOptions);\r\n\r\n // Restore original max-height\r\n el.style.maxHeight = originalMaxHeight;\r\n } else {\r\n // Calculate virtual viewport size\r\n if (p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.render();\r\n }\r\n }\r\n\r\n if (this.isVisible()) {\r\n this._trigger('show');\r\n }\r\n\r\n return this;\r\n }\r\n\r\n hide() {\r\n const p = this._p, el = p.el;\r\n\r\n if (p.onDocumentMouseDown) {\r\n p.sink.remove(document, 'mousedown', p.onDocumentMouseDown);\r\n p.onDocumentMouseDown = null;\r\n }\r\n\r\n if (this.isVisible()) {\r\n this._trigger('hide:before');\r\n\r\n p.hiding = true;\r\n\r\n if (el) {\r\n\r\n el.classList.add(`${p.baseClassName}__is-hiding`);\r\n\r\n // support for hide transition in css\r\n const maxTransitionDuration = parseTransition(getComputedStyle(p.el).transition)\r\n .reduce((p, v) => Math.max(p, v.delay + v.duration), 0);\r\n\r\n if (maxTransitionDuration > 0) {\r\n setTimeout(() => {\r\n if (this[DestroyedSymbol]) return;\r\n\r\n if (this._p && el.parentNode && p.hiding) {\r\n remove(el);\r\n el.classList.remove(`${p.baseClassName}__is-hiding`);\r\n p.visible = false;\r\n this._trigger('hide:after');\r\n }\r\n });\r\n } else {\r\n remove(el);\r\n el.classList.remove(`${p.baseClassName}__is-hiding`);\r\n }\r\n }\r\n\r\n p.visible = false;\r\n\r\n this.blurFocusedItem();\r\n this._trigger('hide');\r\n\r\n if (this[DestroyedSymbol]) return;\r\n this._trigger('hide:after');\r\n }\r\n\r\n if (p.lastPositionTarget) {\r\n p.lastPositionTarget.classList.remove(\r\n `has_${p.baseClassName}`,\r\n `has_${p.baseClassName}_above`,\r\n `has_${p.baseClassName}_below`);\r\n delete p.lastPositionTarget;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n isVisible() {\r\n const p = this._p;\r\n if (!p.visible)\r\n return false;\r\n return p.el.parentNode && getComputedStyle(p.el).display !== 'none';\r\n }\r\n\r\n hasFocusedItem() {\r\n return this._p.focusItemIndex > -1;\r\n }\r\n\r\n getFocusedItemIndex() {\r\n if (!this.hasFocusedItem())\r\n return -1;\r\n return this._p.focusItemIndex;\r\n }\r\n\r\n setFocusedItemAtIndex(itemIndex) {\r\n const p = this._p;\r\n\r\n p.focusItemIndex = itemIndex;\r\n\r\n let item = null;\r\n if (itemIndex > -1)\r\n item = p.items[itemIndex];\r\n if (item && item._nointeraction)\r\n item = null;\r\n if (itemIndex > -1) {\r\n this.scrollItemIndexIntoView(itemIndex);\r\n }\r\n let itemElement = item ? p.virtualListHelper.getItemElementAt(itemIndex) : null;\r\n\r\n if (p.focusItemEl !== itemElement) {\r\n if (p.focusItemEl) {\r\n p.focusItemEl.classList.remove(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = null;\r\n }\r\n\r\n if (itemElement) {\r\n itemElement.classList.add(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = itemElement;\r\n\r\n this._trigger('itemfocus', { value: itemElement.value, item: itemElement[ItemSymbol], event: null });\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n setFocusedItem(item) {\r\n const p = this._p;\r\n\r\n let itemIndex = item._nointeraction ? -1 : this._getItemIndex(item);\r\n\r\n if (itemIndex > -1 && p.items[itemIndex]._nointeraction)\r\n itemIndex = -1;\r\n\r\n return this.setFocusedItemAtIndex(itemIndex);\r\n }\r\n\r\n setFocusedItemByValue(value) {\r\n return this.setFocusedItemAtIndex(this.itemIndexByValue(value));\r\n }\r\n\r\n setSingleSelectedItemAtIndex(itemIndex) {\r\n const p = this._p;\r\n\r\n let itemEl = null;\r\n\r\n if (itemIndex > -1 && !p.items[itemIndex]._nointeraction) {\r\n itemEl = p.virtualListHelper.getItemElementAt(itemIndex);\r\n }\r\n\r\n this._setSingleSelectedItemEl(itemEl);\r\n\r\n return this;\r\n }\r\n\r\n setSingleSelectedItem(item) {\r\n const p = this._p;\r\n\r\n let itemIndex = item._nointeraction ? -1 : this._getItemIndex(item);\r\n\r\n if (itemIndex > -1 && p.items[itemIndex]._nointeraction)\r\n itemIndex = -1;\r\n\r\n return this.setSingleSelectedItemAtIndex(itemIndex);\r\n }\r\n\r\n setSingleSelectedItemByValue(value) {\r\n return this.setSingleSelectedItemAtIndex(this.itemIndexByValue(value));\r\n }\r\n\r\n next(event) {\r\n this._move('next', event);\r\n }\r\n\r\n previous(event) {\r\n this._move('prev', event);\r\n }\r\n\r\n isFirstItem() {\r\n const p = this._p;\r\n return p.focusItemIndex === 0 && p.focusItemIndex < p.items.length;\r\n }\r\n\r\n isLastItem() {\r\n const p = this._p;\r\n return p.focusItemIndex > -1 && p.focusItemIndex === p.items.length - 1;\r\n }\r\n\r\n scrollItemIndexIntoView(itemIndex) {\r\n const p = this._p;\r\n\r\n if (this._hasScroll()) {\r\n const el = p.el, scrollTop = el.scrollTop;\r\n\r\n let itemPos, previousPos = -1;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n itemPos = p.virtualListHelper.getItemPosition(itemIndex);\r\n\r\n if (itemPos === previousPos)\r\n break;\r\n\r\n previousPos = itemPos;\r\n\r\n let itemSize = p.virtualListHelper.getItemSize(itemIndex);\r\n\r\n let listHeight = el.clientHeight;\r\n\r\n if (itemPos < scrollTop) {\r\n el.scrollTop = itemPos;\r\n } else if (itemPos + itemSize > scrollTop + listHeight) {\r\n el.scrollTop = itemPos + itemSize - listHeight;\r\n }\r\n\r\n // force update items, until the positions and sizes are final\r\n p.virtualListHelper.render();\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Register an event handler\r\n * @param {(string|'*')?} event\r\n * @param {function(any)} handler\r\n * @returns {DropList}\r\n */\r\n on(/**string|'*'*/event, /**Function?*/handler) {\r\n this._p.mitt.on(event, handler);\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a one time event handler\r\n * @param {(string|'*')?} event\r\n * @param {function(any)} handler\r\n * @returns {DropList}\r\n */\r\n once(/**string|'*'*/event, /**Function?*/handler) {\r\n let wrapped = (value) => {\r\n this._p.mitt.off(event, wrapped);\r\n handler(value);\r\n };\r\n this._p.mitt.on(event, wrapped);\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an `handler` for `event`, all events for `event`, or all events completely.\r\n * @param {(string|'*')?} event\r\n * @param {function(any)} handler\r\n * @returns {DropList}\r\n */\r\n off(/**(string|'*')?*/event, /**Function?*/handler) {\r\n if (!event && !event) {\r\n this._p.mitt.all.clear();\r\n } else {\r\n this._p.mitt.off(event, handler);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Emit an event\r\n * @param {string} event\r\n * @param {any} value\r\n * @returns {DropList}\r\n */\r\n emit(/**string|'*'*/event, /**any?*/value) {\r\n this._p.mitt.emit(event, value);\r\n return this;\r\n }\r\n\r\n _getItemIndex(item) {\r\n const p = this._p;\r\n\r\n let itemIndex = -1;\r\n\r\n if (item) {\r\n itemIndex = p.items.indexOf(item);\r\n if (itemIndex === -1) {\r\n let value = (item && item.value !== undefined) ? item.value : item;\r\n let label = (item && item.label) ? item.label : value;\r\n itemIndex = this.itemIndexByValueOrLabel(value, label);\r\n }\r\n }\r\n\r\n return itemIndex;\r\n }\r\n\r\n _setSingleSelectedItemEl(itemEl) {\r\n const p = this._p;\r\n\r\n if (p.singleSelectedItemEl) {\r\n p.singleSelectedItemEl.classList.remove(`${p.baseClassName}__item_checked`);\r\n p.singleSelectedItemEl = null;\r\n }\r\n\r\n if (itemEl) {\r\n itemEl.classList.add(`${p.baseClassName}__item_checked`);\r\n p.singleSelectedItemEl = itemEl;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} event\r\n * @param {*} [data]\r\n * @private\r\n */\r\n _trigger(event, data) {\r\n const p = this._p;\r\n if (p.on)\r\n p.on(event, ...(data === undefined ? [] : [data]));\r\n p.mitt.emit(event, data);\r\n }\r\n\r\n _itemUpAction(event, itemEl) {\r\n if (closestUntil(event.target, '.requires-pointer-events,button', itemEl)) return;\r\n\r\n let p = this._p;\r\n\r\n if (!this._mouseHandled) {\r\n\r\n this.triggerItemSelection(event);\r\n\r\n // If we are destroyed in response to a click/select, cease all actions\r\n if (this[DestroyedSymbol])\r\n return;\r\n\r\n this.toggleFocusedItem();\r\n\r\n if (document.activeElement !== this.el && p.focusItemEl) {\r\n clearTimeout(p.blurTimer);\r\n }\r\n\r\n setTimeout(() => {\r\n this._mouseHandled = false;\r\n }, 0);\r\n }\r\n }\r\n\r\n _hookMouseEvents() {\r\n const p = this._p;\r\n\r\n p.sink\r\n .add(p.el, 'mousedown', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n event.preventDefault();\r\n })\r\n .add(p.el, 'mouseup', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n if (event.button !== 0) return;\r\n\r\n this._itemUpAction(event, li);\r\n })\r\n .add(p.el, 'mouseover', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n this._handleMouseOver(event, li);\r\n });\r\n }\r\n\r\n _handleMouseOver(event, itemEl) {\r\n this._focus(event, itemEl);\r\n }\r\n\r\n _hookTouchEvents() {\r\n const p = this._p;\r\n\r\n let currentTouchId;\r\n\r\n p.sink.add(p.el, 'touchstart', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n if (currentTouchId) return;\r\n if (closestUntil(event.target, '.requires-pointer-events,button', li)) return;\r\n\r\n currentTouchId = event.changedTouches[0].identifier;\r\n\r\n // Simulate mouseover event\r\n this._handleMouseOver(event, li);\r\n\r\n // Track scrolling\r\n let didScroll = false;\r\n let onScroll = () => { didScroll = true; };\r\n let onTouchCancel = () => {\r\n currentTouchId = null;\r\n p.sink.remove(null, '.dropdown_touchextra');\r\n };\r\n\r\n let elToTrackScroll = li.parentNode;\r\n while (elToTrackScroll) {\r\n p.sink.add(elToTrackScroll, 'scroll.dropdown_touchextra', onScroll);\r\n elToTrackScroll = elToTrackScroll.parentNode;\r\n }\r\n p.sink.add(window, 'scroll.dropdown_touchextra', onScroll);\r\n\r\n p.sink.add(window, 'touchcancel.dropdown_touchextra', onTouchCancel);\r\n\r\n p.sink.add(p.el, 'touchend.dropdown_touchextra', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return onTouchCancel();\r\n\r\n let touch = Array.prototype.find.call(event.changedTouches, (touch) => {\r\n return touch.identifier === currentTouchId;\r\n });\r\n if (!touch) return onTouchCancel();\r\n\r\n onTouchCancel();\r\n\r\n if (!didScroll) {\r\n this._itemUpAction(event, li);\r\n event.preventDefault();\r\n }\r\n });\r\n });\r\n }\r\n\r\n _hookFocusEvents() {\r\n const p = this._p;\r\n\r\n p.sink\r\n .add(p.el, 'focus', event => {\r\n let itemEl = p.focusItemEl || // focused item\r\n p.el.firstChild; // or the first item\r\n\r\n this._focus(event, itemEl);\r\n })\r\n .add(p.el, 'blur', () => {\r\n setTimeout(() => {\r\n if (this[DestroyedSymbol]) return;\r\n\r\n if (!p.el.contains(document.activeElement)) {\r\n this._delayBlur();\r\n }\r\n });\r\n });\r\n }\r\n\r\n _hookKeyEvents() {\r\n const p = this._p;\r\n\r\n p.sink.add(p.el, 'keydown', evt => this._keydown(evt));\r\n p.sink.add(p.el, 'keypress', evt => this._keydown(evt));\r\n }\r\n\r\n _keydown(event) {\r\n const p = this._p;\r\n\r\n if (p.keyDownHandler && p.keyDownHandler.call(this, event)) {\r\n return;\r\n }\r\n\r\n let preventDefault = true;\r\n\r\n switch (event.key) {\r\n case VALUE_PAGE_UP:\r\n case VALUE_PAGE_DOWN:\r\n case VALUE_HOME:\r\n case VALUE_END:\r\n case VALUE_UP:\r\n case VALUE_DOWN:\r\n event.preventDefault();\r\n\r\n switch (event.key) {\r\n case VALUE_PAGE_UP:\r\n this.previousPage(event);\r\n break;\r\n case VALUE_PAGE_DOWN:\r\n this.nextPage(event);\r\n break;\r\n case VALUE_HOME:\r\n this._move('first', event);\r\n break;\r\n case VALUE_END:\r\n this._move('last', event);\r\n break;\r\n case VALUE_UP:\r\n this.previous(event);\r\n break;\r\n case VALUE_DOWN:\r\n this.next(event);\r\n break;\r\n }\r\n break;\r\n\r\n case VALUE_ENTER:\r\n this.triggerItemSelection(event);\r\n event.preventDefault();\r\n break;\r\n\r\n case VALUE_SPACE:\r\n this.toggleFocusedItem();\r\n event.preventDefault();\r\n break;\r\n\r\n case VALUE_ESCAPE:\r\n event.preventDefault();\r\n this.hide();\r\n break;\r\n\r\n default: {\r\n if (event.type === 'keydown') return;\r\n this._keydownFreeType(event);\r\n preventDefault = false;\r\n }\r\n }\r\n }\r\n\r\n _keydownFreeType(evt) {\r\n const p = this._p;\r\n\r\n // noinspection JSDeprecatedSymbols\r\n let character = evt.key || String.fromCharCode(evt.keyCode);\r\n if (character.length !== 1) return;\r\n\r\n clearTimeout(p.filterTimer);\r\n\r\n // Accumulate text to find from keystrokes\r\n let keyword = (p.previousFilter || '') + character;\r\n\r\n let regex = new RegExp(`^${escapeRegex(keyword)}`, 'i');\r\n\r\n let matchIndices = [];\r\n let item;\r\n\r\n // These are all the possible matches\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n item = p.items[i];\r\n if (regex.test(item.label)) {\r\n matchIndices.push(i);\r\n }\r\n }\r\n\r\n // Did we find anything?\r\n if (!matchIndices.length) {\r\n // No... So start over with this character as the only one.\r\n keyword = character;\r\n regex = new RegExp(`^${escapeRegex(keyword)}`, 'i');\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n item = p.items[i];\r\n if (regex.test(item.label)) {\r\n matchIndices.push(i);\r\n }\r\n }\r\n }\r\n\r\n let focusItemIndex = p.focusItemIndex;\r\n let matchIndex = -1;\r\n\r\n // Find a match *after* the focused item\r\n for (let i = 0, count = matchIndices.length; i < count; i++) {\r\n if (matchIndices[i] >= focusItemIndex) {\r\n matchIndex = matchIndices[i];\r\n break;\r\n }\r\n }\r\n\r\n // Find a match from the beginning.\r\n if (matchIndex === -1 && matchIndices.length) {\r\n matchIndex = matchIndices[0];\r\n }\r\n\r\n if (matchIndex > -1) {\r\n let next = p.virtualListHelper.getItemElementAt(matchIndex);\r\n this._focus(evt, next || null, matchIndex);\r\n\r\n if (!this.isVisible()) {\r\n this.triggerItemSelection(evt);\r\n }\r\n\r\n // Record the last filter used\r\n p.previousFilter = keyword;\r\n\r\n // Clear the last filter - a second from now.\r\n p.filterTimer = setTimeout(() => {\r\n delete p.previousFilter;\r\n }, 1000);\r\n\r\n } else {\r\n delete p.previousFilter;\r\n }\r\n }\r\n\r\n _focus(event, itemEl, itemIndex) {\r\n const p = this._p;\r\n\r\n if (!itemIndex && itemEl) {\r\n itemIndex = p.virtualListHelper.getItemIndexFromElement(itemEl);\r\n }\r\n\r\n if (itemIndex > -1) {\r\n this.scrollItemIndexIntoView(itemIndex);\r\n } else if (itemIndex === undefined) {\r\n itemEl = null;\r\n }\r\n\r\n let focusItemEl = itemEl || p.virtualListHelper.getItemElementAt(itemIndex);\r\n if (!focusItemEl || focusItemEl[ItemSymbol]._nointeraction) {\r\n this.blurFocusedItem();\r\n return;\r\n }\r\n\r\n if (focusItemEl === p.focusItemEl) {\r\n clearTimeout(p.blurTimer);\r\n return;\r\n }\r\n\r\n this.blurFocusedItem();\r\n\r\n focusItemEl.classList.add(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = focusItemEl;\r\n p.focusItemIndex = itemIndex;\r\n\r\n const item = p.items[itemIndex];\r\n this._trigger('itemfocus', { value: item.value, item: item[ItemSymbol] ?? item, event: event });\r\n }\r\n\r\n _delayBlur() {\r\n if (this[DestroyedSymbol])\r\n return;\r\n\r\n const p = this._p;\r\n\r\n clearTimeout(p.blurTimer);\r\n\r\n p.blurTimer = setTimeout(() => {\r\n if (this[DestroyedSymbol]) return;\r\n this.blurFocusedItem();\r\n }, p.itemBlurDelay);\r\n }\r\n\r\n _move(direction, event) {\r\n const p = this._p;\r\n\r\n let next, nextIndex, directionUp = false;\r\n\r\n if (direction === 'first') {\r\n nextIndex = 0;\r\n directionUp = false;\r\n } else if (direction === 'last') {\r\n nextIndex = p.items.length - 1;\r\n directionUp = true;\r\n } else if (direction === 'prev') {\r\n if (!this.hasFocusedItem())\r\n return this._move('last', event);\r\n\r\n nextIndex = p.focusItemIndex - 1;\r\n if (nextIndex === -1) {\r\n nextIndex = p.items.length - 1;\r\n }\r\n\r\n directionUp = true;\r\n } else if (direction === 'next') {\r\n if (!this.hasFocusedItem())\r\n return this._move('first', event);\r\n\r\n nextIndex = p.focusItemIndex + 1;\r\n if (nextIndex === p.items.length) {\r\n nextIndex = 0;\r\n }\r\n\r\n directionUp = false;\r\n } else if (direction === 'prev_page' || direction === 'next_page') {\r\n\r\n if (!this.hasFocusedItem()) {\r\n return this._move(direction === 'prev_page' ? 'prev' : 'next', event);\r\n }\r\n\r\n if ((direction === 'prev_page' && this.isFirstItem()) ||\r\n (direction === 'next_page' && this.isLastItem())) return;\r\n\r\n if (this._hasScroll()) {\r\n\r\n if (p.virtualListHelper.isVirtual()) {\r\n let visibleItemCount = p.virtualListHelper.getVisibleItemCount();\r\n\r\n nextIndex = p.focusItemIndex;\r\n\r\n if (direction === 'prev_page') {\r\n nextIndex -= visibleItemCount;\r\n } else {\r\n nextIndex += visibleItemCount;\r\n }\r\n\r\n if (nextIndex < 0) {\r\n nextIndex = 0;\r\n } else if (nextIndex >= p.items.length) {\r\n nextIndex = p.items.length;\r\n }\r\n } else if (p.focusItemEl) {\r\n let base = getElementOffset(p.focusItemEl).top;\r\n let height = getElementHeight(p.el, true);\r\n\r\n while (true) { // eslint-disable-line no-constant-condition\r\n next = p.focusItemEl.nextElementSibling;\r\n if (!next) return;\r\n if (next.tagName !== 'LI') continue;\r\n\r\n if (direction === 'prev_page') {\r\n if (getElementOffset(next).top - base + height <= 0)\r\n break;\r\n } else {\r\n if (getElementOffset(next).top - base - height >= 0)\r\n break;\r\n }\r\n }\r\n\r\n if (next) {\r\n nextIndex = p.virtualListHelper.getItemIndexFromElement(next);\r\n\r\n if (nextIndex === undefined)\r\n nextIndex = -1;\r\n }\r\n }\r\n\r\n } else {\r\n return this._move(direction === 'prev_page' ? 'first' : 'last', event);\r\n }\r\n\r\n directionUp = direction === 'prev_page';\r\n } else {\r\n return;\r\n }\r\n\r\n let itemCount = p.items.length;\r\n\r\n if (nextIndex >= itemCount) {\r\n return;\r\n }\r\n\r\n let item = p.items[nextIndex];\r\n // noinspection UnnecessaryLocalVariableJS\r\n let startedAtIndex = nextIndex;\r\n\r\n while (item && item._nointeraction) {\r\n if (directionUp) {\r\n nextIndex--;\r\n if (nextIndex === -1) {\r\n nextIndex = itemCount;\r\n }\r\n } else {\r\n nextIndex++;\r\n if (nextIndex === itemCount) {\r\n nextIndex = 0;\r\n }\r\n }\r\n\r\n item = p.items[nextIndex];\r\n\r\n if (nextIndex === startedAtIndex) {\r\n break;\r\n }\r\n }\r\n\r\n next = p.virtualListHelper.getItemElementAt(nextIndex);\r\n this._focus(event, next || null, nextIndex);\r\n\r\n if (!this.isVisible()) {\r\n this.triggerItemSelection(event);\r\n }\r\n }\r\n\r\n _hasScroll() {\r\n return this.el.clientHeight < this.el.scrollHeight;\r\n }\r\n\r\n _updateGroupStateForItem(item) {\r\n const p = this._p;\r\n\r\n if (p.multi && p.autoCheckGroupChildren) {\r\n\r\n let items, groupIndex, itemIndex;\r\n\r\n if (item._group) {\r\n // Now loop through children below the group\r\n\r\n items = p.items;\r\n groupIndex = items.indexOf(item);\r\n\r\n let affectedItems = 0;\r\n\r\n for (let i = groupIndex + 1, len = items.length; i < len; i++) {\r\n let next = items[i];\r\n\r\n // Hit the next group, break out\r\n if (next._group || (!next._child && items[i - 1]._child))\r\n break;\r\n\r\n // No change, skip\r\n if (!!next._checked === item._checked)\r\n continue;\r\n\r\n // Update state\r\n next._checked = item._checked;\r\n\r\n affectedItems++;\r\n\r\n // Update DOM\r\n let nextEl = p.virtualListHelper.getItemElementAt(i);\r\n if (nextEl) {\r\n toggleClass(nextEl, `${p.baseClassName}__item_checked`, item._checked);\r\n }\r\n\r\n // Fire event\r\n this._trigger('check', {\r\n value: next.value,\r\n item: next[ItemSymbol] ?? next,\r\n checked: next._checked,\r\n isGroup: next._group,\r\n isCheckingGroup: true,\r\n });\r\n }\r\n\r\n // Fire event\r\n this._trigger('groupcheck', { value: item.value, item: item[ItemSymbol] ?? item, affectedItems: affectedItems });\r\n } else if (p.groupCount > 0) {\r\n items = p.items;\r\n itemIndex = items.indexOf(item);\r\n groupIndex = -1;\r\n\r\n // Find the group index\r\n for (let i = itemIndex - 1; i >= 0; i--) {\r\n if (items[i]._group) {\r\n groupIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (groupIndex > -1) {\r\n this._updateGroupCheckedState(groupIndex, true);\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n _updateGroupCheckedState(groupIndex, fireEvents) {\r\n const p = this._p;\r\n\r\n if (p.multi && p.autoCheckGroupChildren && groupIndex > -1) {\r\n\r\n let items = p.items;\r\n let groupItem = items[groupIndex];\r\n if (!groupItem || !groupItem._group) return this;\r\n\r\n let item, hasChecked = false, hasUnchecked = false;\r\n\r\n for (let i = groupIndex + 1, len = items.length; i < len; i++) {\r\n item = items[i];\r\n\r\n // Hit the next group, break out\r\n if (item._group || (!item._child && items[i - 1]._child))\r\n break;\r\n\r\n if (item._checked) {\r\n hasChecked = true;\r\n } else if (!item._checked) {\r\n hasUnchecked = true;\r\n }\r\n }\r\n\r\n // See if we need to update the group\r\n let shouldCheckGroup = hasChecked && !hasUnchecked;\r\n if (!!groupItem._checked !== shouldCheckGroup) {\r\n // Update state\r\n groupItem._checked = shouldCheckGroup;\r\n\r\n // Update DOM\r\n let nextEl = p.virtualListHelper.getItemElementAt(groupIndex);\r\n if (nextEl) {\r\n toggleClass(nextEl, `${p.baseClassName}__item_checked`, groupItem._checked);\r\n }\r\n\r\n if (fireEvents) {\r\n // Fire event\r\n this._trigger('check', {\r\n value: groupItem.value,\r\n item: groupItem[ItemSymbol] ?? groupItem,\r\n checked: groupItem._checked,\r\n isGroup: groupItem._group,\r\n isCheckingGroup: false,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {DropList} self\r\n */\r\n _measureItem() {\r\n const p = this._p;\r\n\r\n if (p.lastMeasureItemCount !== p.items.length) {\r\n let longestLabel = p.lastMeasureLongestLabel || 1,\r\n longestLabelText = p.lastMeasureLongestLabelText || '';\r\n\r\n for (let i = 0, items = p.items, count = items.length;\r\n i < count;\r\n i++) {\r\n\r\n const item = items[i];\r\n let text = item.label;\r\n if (text == null)\r\n text = item.value;\r\n if (text == null)\r\n text = '';\r\n\r\n let length = text.length;\r\n if (length > longestLabel) {\r\n longestLabel = length;\r\n longestLabelText = text;\r\n }\r\n }\r\n\r\n p.lastMeasureItemCount = p.items.length;\r\n p.lastMeasureLongestLabel = longestLabel;\r\n p.lastMeasureLongestLabelText = longestLabelText;\r\n }\r\n\r\n if (p.estimateWidth || p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.createGhostItemElement(GhostSymbol, true, itemEl => {\r\n p.lastMeasureItemWidth = getElementWidth(itemEl, true, true);\r\n });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Determines whether the list should be in virtual mode, depending on the item count.\r\n * @param {number?} targetItemCount - item count we are expecting. Defaults to current item count\r\n * @returns {DropList}\r\n * @private\r\n */\r\n _determineVirtualMode(targetItemCount) {\r\n const p = this._p;\r\n\r\n let items = p.items;\r\n if (targetItemCount === undefined) {\r\n targetItemCount = items.length;\r\n }\r\n\r\n let shouldBeVirtual = targetItemCount >= p.virtualMinItems;\r\n\r\n if (shouldBeVirtual !== p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.setVirtual(shouldBeVirtual).render();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n _renderItemContent(item, itemEl) {\r\n const p = this._p;\r\n\r\n // NOTE: a \"measure\" item will not have full data of original item.\r\n // so for a custom renderer - we try to send original item, and fallback to our private list item.\r\n\r\n if (!p.renderItem || p.renderItem(item[ItemSymbol] || item, itemEl) === false) {\r\n itemEl.appendChild(createElement('span', {\r\n class: `${p.baseClassName}__item_label`,\r\n textContent: item.label,\r\n }));\r\n\r\n if (p.multi) {\r\n if (!item._nocheck) {\r\n itemEl.insertBefore(\r\n createElement('span', { class: 'checkbox' }),\r\n itemEl.firstChild,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.PositionOptions} [positionOptions=undefined]\r\n * @returns {number} new outer width\r\n * @private\r\n */\r\n _updateWidth(positionOptions) {\r\n const p = this._p, el = p.el;\r\n\r\n let targetWidth = 0;\r\n\r\n if (positionOptions) {\r\n // Measure target\r\n targetWidth = positionOptions.targetWidth;\r\n if (targetWidth == null) {\r\n targetWidth = getElementWidth(positionOptions.target, true, true);\r\n }\r\n }\r\n\r\n let autoWidth = 0;\r\n if (!p.useExactTargetWidth) {\r\n if (p.estimateWidth || p.virtualListHelper.isVirtual()) {\r\n autoWidth = p.lastMeasureItemWidth;\r\n } else {\r\n el.style.width = ''; // Reset width\r\n autoWidth = getElementWidth(el, true, true);\r\n }\r\n }\r\n\r\n let newOuterWidth = Math.max(autoWidth, targetWidth);\r\n\r\n setElementWidth(el, newOuterWidth, true, true);\r\n\r\n const elComputedStyle = getComputedStyle(el);\r\n let bordersWidth = (parseFloat(elComputedStyle.borderLeftWidth) || 0) + (parseFloat(elComputedStyle.borderRightWidth) || 0);\r\n let scrollWidth = el.scrollWidth + bordersWidth;\r\n if (scrollWidth > newOuterWidth) {\r\n // consider scrollWidth delta\r\n let delta = scrollWidth - newOuterWidth;\r\n el.style.width = `${parseFloat(el.style.width) + delta}px`;\r\n newOuterWidth = scrollWidth;\r\n }\r\n\r\n return newOuterWidth;\r\n }\r\n}\r\n\r\nexport default DropList;\r\n","const throttle = (func, wait, options) => {\r\n let timeout, context, args, result;\r\n let previous = 0;\r\n if (!options) options = {};\r\n\r\n const later = () => {\r\n previous = options.leading === false ? 0 : Date.now();\r\n timeout = null;\r\n result = func.apply(context, args);\r\n if (!timeout) context = args = null;\r\n };\r\n\r\n const throttled = function () {\r\n const now = Date.now();\r\n if (!previous && options.leading === false)\r\n previous = now;\r\n\r\n const remaining = wait - (now - previous);\r\n context = this;\r\n args = arguments;\r\n if (remaining <= 0 || remaining > wait) {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n timeout = null;\r\n }\r\n previous = now;\r\n result = func.apply(context, args);\r\n if (!timeout) context = args = null;\r\n } else if (!timeout && options.trailing !== false) {\r\n timeout = setTimeout(later, remaining);\r\n }\r\n return result;\r\n };\r\n\r\n throttled.cancel = () => {\r\n clearTimeout(timeout);\r\n previous = 0;\r\n timeout = context = args = null;\r\n };\r\n\r\n throttled.isScheduled = () => {\r\n return !!timeout;\r\n };\r\n\r\n return throttled;\r\n};\r\n\r\nexport default throttle;\r\n","import {\r\n getCssProps,\r\n getElementWidth,\r\n setElementWidth,\r\n getPseudoElementWidth,\r\n setCssProps,\r\n} from '@danielgindi/dom-utils/lib/Css';\r\nimport escapeRegex from './utils/escapeRegex';\r\nimport {\r\n closestUntil,\r\n createElement,\r\n next,\r\n prev,\r\n setElementAttrs,\r\n} from '@danielgindi/dom-utils/lib/Dom';\r\nimport {\r\n append,\r\n getRootNode,\r\n before,\r\n remove,\r\n toggleClass,\r\n} from '@danielgindi/dom-utils/lib/DomCompat';\r\n\r\nimport DomEventsSink from '@danielgindi/dom-utils/lib/DomEventsSink';\r\nimport DropList from './DropList';\r\nimport throttle from './utils/throttle';\r\nimport {\r\n VALUE_BACK_SPACE,\r\n VALUE_DELETE, VALUE_DOWN, VALUE_ENTER,\r\n VALUE_ESCAPE,\r\n VALUE_LEFT, VALUE_PAGE_DOWN,\r\n VALUE_PAGE_UP,\r\n VALUE_RIGHT, VALUE_SPACE,\r\n VALUE_TAB,\r\n VALUE_UP,\r\n} from 'keycode-js';\r\nimport mitt from 'mitt';\r\n\r\nconst ItemSymbol = Symbol('item');\r\nconst DestroyedSymbol = Symbol('destroyed');\r\nconst NoResultsItemSymbol = Symbol('no_results_items');\r\nconst RestMultiItemsSymbol = Symbol('rest_multi_items');\r\n\r\nconst hasTouchCapability = !!('ontouchstart' in window\r\n || (window.DocumentTouch && window.document instanceof window.DocumentTouch)\r\n || window.navigator.maxTouchPoints\r\n);\r\n\r\n/**\r\n * @param {Element|EventTarget} el\r\n * @param {string} className\r\n * @returns {boolean}\r\n */\r\nconst hasClass = function (el, className) {\r\n if (el instanceof Element) {\r\n return el.classList.contains(className);\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst inputBackbufferCssProps = [\r\n 'font-family',\r\n 'font-size',\r\n 'font-weight',\r\n 'font-size',\r\n 'letter-spacing',\r\n 'text-transform',\r\n 'word-spacing',\r\n 'text-indent',\r\n 'box-sizing',\r\n 'padding-left',\r\n 'padding-right',\r\n];\r\n\r\n/**\r\n * @typedef {Object} SelectBox.Options\r\n * @property {DropList.Options} [listOptions] options to pass to the `DropList`\r\n * @property {Element} [el] An element to attach to, instead of creating a new one\r\n * @property {string} [baseClassName='selectbox'] class name for the menu root element\r\n * @property {boolean} [disabled=false] Should start as disabled?\r\n * @property {boolean} [clearable=true] Has clear button?\r\n * @property {boolean} [hasOpenIndicator=true] has open/close indicator?\r\n * @property {string} [placeholder=''] Placeholder text\r\n * @property {boolean} [sortSelectedItems=true] Should the selected items be sorted?\r\n * @property {boolean} [sortListItems=false] Sort list items\r\n * @property {boolean} [sortListCheckedFirst=true] When sorting - put checked items first (applicable to `multi` mode only)\r\n * @property {*[]} [stickyValues]\r\n * @property {function(a: DropList.ItemBase, b: DropList.ItemBase):number} [sortItemComparator]\r\n * @property {boolean} [splitListCheckedGroups=true] Split groups to \"checked\" and \"unchecked\", works with `sortCheckedFirst` only\r\n * @property {boolean|'touch'} [blurOnSingleSelection='touch']\r\n * @property {boolean} [multi=false] can multiple values be selected?\r\n * @property {boolean} [showSelection=true] show selection? if false, the placeholder will take effect\r\n * @property {function(items: DropList.ItemBase[]):string} [multiPlaceholderFormatter] formatter for placeholder for multi items mode\r\n * @property {boolean} [searchable=false] is it searchable?\r\n * @property {string} [noResultsText='No matching results'] text for no results (empty for none)\r\n * @property {number} [filterThrottleWindow=300] throttle time (milliseconds) for filtering\r\n * @property {boolean} [filterOnEmptyTerm=false] call the filter function on empty search term too\r\n * @property {string} [labelProp='label']\r\n * @property {string} [valueProp='value']\r\n * @property {string} [multiItemLabelProp='short_label']\r\n * @property {number} [maxMultiItems] maximum number of multi items. The rest will get a single item to represent.\r\n * @property {function(count: number, items: DropList.ItemBase[]):string} [multiItemsRestLabelProvider] label for the item representing the rest of the items.\r\n * @property {DropList.ItemBase[]|null} [items] initial items\r\n * @property {*[]|null} [selectedValues] initial selected values\r\n * @property {*|*[]|null} [value] initial selected value\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderSingleItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderSingleItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderRestMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderRestMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderNoResultsItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderNoResultsItem]\r\n * @property {function(items: DropList.ItemBase[], term: string):(DropList.ItemBase[]|null)} [filterFn]\r\n * @property {function(name: string, ...args)} [on]\r\n * @property {string|string[]} [additionalClasses]\r\n * @property {boolean} [isLoadingMode]\r\n * */\r\nconst defaultOptions = {\r\n el: null,\r\n baseClassName: 'selectbox',\r\n disabled: false,\r\n clearable: true,\r\n hasOpenIndicator: true,\r\n placeholder: '',\r\n sortSelectedItems: true,\r\n sortListItems: false,\r\n sortListCheckedFirst: true,\r\n stickyValues: null,\r\n sortItemComparator: null,\r\n splitListCheckedGroups: true,\r\n blurOnSingleSelection: 'touch',\r\n multi: false,\r\n showSelection: true,\r\n multiPlaceholderFormatter: null,\r\n searchable: true,\r\n noResultsText: 'No matching results',\r\n filterThrottleWindow: 300,\r\n filterOnEmptyTerm: false,\r\n labelProp: 'label',\r\n valueProp: 'value',\r\n multiItemLabelProp: 'short_label',\r\n maxMultiItems: null,\r\n multiItemsRestLabelProvider: null,\r\n items: [],\r\n selectedValues: undefined,\r\n value: undefined,\r\n isLoadingMode: false,\r\n};\r\n\r\n/**\r\n *\r\n * @param {DropList.ItemBase[]} items\r\n * @param {string} labelProp\r\n * @returns {string}\r\n */\r\nconst defaultMultiPlaceholderFormatter = (items, labelProp) => {\r\n if (items.length === 0)\r\n return '';\r\n\r\n let title = items[0][labelProp] + '';\r\n\r\n if (items.length > 1) {\r\n title += ` (+${items.length - 1})`;\r\n }\r\n\r\n return title;\r\n};\r\n\r\n/*\r\nEmits the following events:\r\n---------------------------\r\n\r\n'clear:before' {cancel: false}: will clear the whole selection. return false to abort.\r\n'clear': clearead the whole selection.\r\n'open' { list: DropList }: the drop list is opening\r\n'open:before' { list: DropList }: the drop list will open\r\n'close': the drop list is closing\r\n'addsel:before' {value, item, cancel: false}: an item selection is about to be added (in multi mode). return false to abort.\r\n'removesel:before' {value, item, cancel: false}: an item selection is about to be removed (in multi mode). return false to abort.\r\n'select:before' {value, item, cancel: false}: an item is about to be selected (in single mode). return false to abort.\r\n'addsel' {value, item}: an item selection has been added (in multi mode)\r\n'removesel' {value, item}: an item selection has been removed (in multi mode)\r\n'select' {value, item}: an item has been selected (in single mode)\r\n'search' {value}: input box value has changed\r\n'search:focus': input box has gained focus\r\n'search:blur': input box has lost focus\r\n'input:resize': input box resized\r\n'itemschanged' {term, mutated, count}: the current set of items has changed\r\n */\r\n\r\n// noinspection JSUnusedGlobalSymbols\r\nclass SelectBox {\r\n /**\r\n * @param {SelectBox.Options} options\r\n */\r\n constructor(options) {\r\n const o = { ...defaultOptions };\r\n\r\n for (let [key, value] of Object.entries(/**@type Object*/options))\r\n if (value !== undefined)\r\n o[key] = value;\r\n\r\n const p = this._p = {\r\n ownsEl: true,\r\n\r\n baseClassName: o.baseClassName,\r\n\r\n listOptions: o.listOptions,\r\n\r\n disabled: !!o.disabled,\r\n clearable: !!o.clearable,\r\n hasOpenIndicator: !!o.hasOpenIndicator,\r\n placeholder: o.placeholder,\r\n sortSelectedItems: !!o.sortSelectedItems,\r\n sortListItems: !!o.sortListItems,\r\n sortListCheckedFirst: !!o.sortListCheckedFirst,\r\n stickyValues: Array.isArray(o.stickyValues) ? new Set(o.stickyValues) : null,\r\n sortItemComparator: o.sortItemComparator,\r\n splitListCheckedGroups: !!o.splitListCheckedGroups,\r\n blurOnSingleSelection: o.blurOnSingleSelection,\r\n multi: o.multi,\r\n showSelection: o.showSelection,\r\n multiPlaceholderFormatter: o.multiPlaceholderFormatter,\r\n searchable: o.searchable,\r\n noResultsText: o.noResultsText,\r\n filterThrottleWindow: o.filterThrottleWindow,\r\n filterOnEmptyTerm: o.filterOnEmptyTerm,\r\n\r\n labelProp: o.labelProp,\r\n valueProp: o.valueProp,\r\n multiItemLabelProp: o.multiItemLabelProp,\r\n\r\n maxMultiItems: o.maxMultiItems,\r\n multiItemsRestLabelProvider: o.multiItemsRestLabelProvider,\r\n\r\n renderSingleItem: o.renderSingleItem,\r\n unrenderSingleItem: o.unrenderSingleItem,\r\n renderMultiItem: o.renderMultiItem,\r\n unrenderMultiItem: o.unrenderMultiItem,\r\n renderRestMultiItem: o.renderRestMultiItem,\r\n unrenderRestMultiItem: o.unrenderRestMultiItem,\r\n renderNoResultsItem: o.renderNoResultsItem,\r\n unrenderNoResultsItem: o.unrenderNoResultsItem,\r\n filterFn: o.filterFn,\r\n on: o.on || null,\r\n silenceEvents: true,\r\n mitt: mitt(),\r\n additionalClasses: o.additionalClasses,\r\n\r\n isLoadingMode: !!o.isLoadingMode,\r\n\r\n items: [],\r\n filteredItems: null,\r\n currentItemsView: [], // contains the final version of items sent to DropList\r\n itemsChanged: true,\r\n\r\n sink: new DomEventsSink(),\r\n\r\n /** @type ResizeObserver */\r\n resizeObserver: null,\r\n\r\n selectedItems: [],\r\n selectedValues: [],\r\n selectionChanged: true,\r\n resortBySelectionNeeded: false,\r\n\r\n throttledUpdateListItems: throttle(() => this._updateListItems(),\r\n o.filterThrottleWindow,\r\n { leading: true, trailing: true }),\r\n\r\n filterTerm: '',\r\n };\r\n\r\n let el = o.el;\r\n if (el instanceof Element) {\r\n p.ownsEl = false;\r\n } else {\r\n el = createElement('span');\r\n }\r\n\r\n setElementAttrs(el, {\r\n role: 'combobox',\r\n 'aria-haspopup': 'true',\r\n 'aria-expanded': 'false',\r\n });\r\n p.el = el;\r\n\r\n this._syncBaseClasses();\r\n this._renderBase();\r\n\r\n /** @type Element[] */\r\n p.multiItemEls = [];\r\n\r\n this.enable(!p.disabled);\r\n\r\n this._setupDropdownMenu();\r\n\r\n // --- Hook click\r\n p.sink\r\n .add(el, 'click', (evt) => {\r\n if (p.clearButtonWrapper && p.clearButtonWrapper.contains(evt.target)) {\r\n return;\r\n }\r\n\r\n if (!el.contains(document.activeElement)) {\r\n p.input.focus();\r\n // Go to end of input\r\n p.input.selectionStart = p.input.selectionEnd = p.input.value.length;\r\n }\r\n });\r\n\r\n // --- Handle default focus directly to search box\r\n p.sink.add(el, 'focus', evt => {\r\n const target = (/**Element*/evt.target);\r\n\r\n if (!el.contains(evt.relatedTarget) &&\r\n !hasClass(target, `${p.baseClassName}__search_field`) &&\r\n !hasClass(target, `${p.baseClassName}__item`)) {\r\n let field = el.querySelector(`.${p.baseClassName}__search_field`);\r\n field && field.focus();\r\n }\r\n }, true);\r\n\r\n p.sink\r\n .add(p.input, 'keydown', (/**KeyboardEvent*/event) => {\r\n this._handleInputKeydown(event);\r\n })\r\n .add(p.input, 'input', () => {\r\n this._resizeInput();\r\n });\r\n\r\n const focusInOutHandler = (() => {\r\n let t;\r\n return () => {\r\n if (t) {\r\n clearTimeout(t);\r\n }\r\n t = setTimeout(() => {\r\n toggleClass(el, `${p.baseClassName}__focus`, el.contains(document.activeElement));\r\n });\r\n };\r\n })();\r\n p.sink.add(el, 'focus', focusInOutHandler, true);\r\n p.sink.add(el, 'blur', focusInOutHandler, true);\r\n\r\n // --- Resize input on window change\r\n p.sink.add(window, 'resize', () => this._resizeInput());\r\n p.sink.add(window, 'orientationchange', () => this._resizeInput());\r\n\r\n if (window.ResizeObserver !== undefined) {\r\n p.resizeObserver = new ResizeObserver(() => {\r\n this._resizeInput();\r\n });\r\n p.resizeObserver.observe(p.el);\r\n }\r\n\r\n this.setItems(o.items);\r\n\r\n if (o.multi && Array.isArray(o.selectedValues)) {\r\n this.setSelectedValues(o.selectedValues);\r\n } else if (o.value != null) {\r\n this.setValue(o.value);\r\n }\r\n\r\n this._scheduleSync();\r\n\r\n this.silenceEvents = false;\r\n\r\n return this;\r\n }\r\n\r\n destroy() {\r\n if (this[DestroyedSymbol])\r\n return;\r\n this[DestroyedSymbol] = true;\r\n\r\n const p = this._p;\r\n\r\n if (p.syncTimeout) {\r\n clearTimeout(p.syncTimeout);\r\n delete p.syncTimeout;\r\n }\r\n\r\n this._stopTrackingPresence();\r\n\r\n p.sink.remove();\r\n p.dropList && p.dropList.destroy();\r\n\r\n if (p.throttledUpdateListItems)\r\n p.throttledUpdateListItems.cancel();\r\n\r\n this._cleanupSingleWrapper();\r\n\r\n if (p.unrenderMultiItem || p.unrenderRestMultiItem) {\r\n // Remove all item elements\r\n while (p.multiItemEls.length > 0) {\r\n // use fast path by removing in reverse\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n }\r\n }\r\n\r\n remove(p.list);\r\n remove(p.singleWrapper);\r\n remove(p.input);\r\n remove(p.inputBackBuffer);\r\n remove(p.clearButtonWrapper);\r\n remove(p.openIndicator);\r\n\r\n if (!p.ownsEl) {\r\n for (let name of Array.from(p.el.classList)) {\r\n if (name.startsWith(p.baseClassName)) {\r\n p.el.classList.remove(name);\r\n }\r\n }\r\n p.el.removeAttribute('role');\r\n p.el.removeAttribute('aria-haspopup');\r\n p.el.removeAttribute('aria-expanded');\r\n }\r\n\r\n p.resizeObserver?.disconnect();\r\n\r\n this._p = null;\r\n }\r\n\r\n get el() {\r\n return this._p.el;\r\n }\r\n\r\n /**\r\n * Enables the control\r\n * @param {boolean=true} enabled Should the control be enabled?\r\n * @returns {SelectBox}\r\n */\r\n enable(enabled) {\r\n const p = this._p;\r\n\r\n if (enabled === undefined) {\r\n enabled = true;\r\n }\r\n p.disabled = !enabled;\r\n p.el.setAttribute('aria-disabled', p.disabled.toString());\r\n p.input.disabled = !!p.disabled;\r\n\r\n const multiItemEls = p.multiItemEls;\r\n\r\n for (let itemEl of multiItemEls) {\r\n if (p.disabled) {\r\n itemEl.removeAttribute('tabindex');\r\n } else {\r\n itemEl.setAttribute('tabindex', '0');\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Is the control enabled?\r\n * @returns {boolean}\r\n */\r\n isEnabled() {\r\n return !this._p.disabled;\r\n }\r\n\r\n /**\r\n * Disables the control\r\n * @param {boolean=true} disabled Should the control be disabled?\r\n * @returns {SelectBox}\r\n */\r\n disable(disabled) {\r\n return this.enable(disabled === undefined ? false : !disabled);\r\n }\r\n\r\n /**\r\n * Is the control disabled?\r\n * @returns {boolean}\r\n */\r\n isDisabled() {\r\n return this._p.disabled;\r\n }\r\n\r\n /**\r\n * @param {string|string[]} classes\r\n * @returns {SelectBox}\r\n */\r\n setAdditionalClasses(classes) {\r\n const p = this._p;\r\n p.additionalClasses = classes;\r\n this._syncBaseClasses();\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.ItemBase[]} [items]\r\n * @param {boolean} [resetValues=true] should reset values to current values (essentially refresh the data based on items & values). If set to false, use setValue to set a fresh value\r\n * @returns {SelectBox}\r\n */\r\n setItems(items, resetValues = true) {\r\n const p = this._p;\r\n\r\n if (!items)\r\n items = [];\r\n\r\n p.items = items.slice(0);\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n\r\n if (resetValues) {\r\n this.setSelectedValues(this.getSelectedValues());\r\n }\r\n\r\n this._trigger('itemschanged', { term: null, mutated: true, count: this.getFilteredItemCount() });\r\n\r\n return this;\r\n }\r\n\r\n getFilteredItemCount() {\r\n const p = this._p;\r\n\r\n if (p.filteredItems)\r\n return p.filteredItems.length;\r\n\r\n if (p.items)\r\n return p.items.length;\r\n\r\n return 0;\r\n }\r\n\r\n isFilterPending() {\r\n const p = this._p;\r\n\r\n return !!(p.throttledUpdateListItems.isScheduled() ||\r\n (!p.filteredItems && (p.filterTerm || (p.filterOnEmptyTerm && p.filterFn))));\r\n }\r\n\r\n updateItemByValue(value, newItem) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n let existingItem = p.items.find(x => x[valueProp] === value);\r\n if (existingItem)\r\n Object.assign(existingItem, newItem);\r\n\r\n if (p.dropList) {\r\n p.dropList.updateItemByValue(value, newItem);\r\n }\r\n }\r\n\r\n /**\r\n * @returns {DropList.ItemBase[]|*}\r\n */\r\n getItems() {\r\n const p = this._p;\r\n return p.items;\r\n }\r\n\r\n /**\r\n * @param {boolean} clearable\r\n * @returns {SelectBox}\r\n */\r\n setClearable(clearable) {\r\n clearable = !!clearable;\r\n\r\n if (this._p.clearable === clearable)\r\n return this;\r\n\r\n this._p.clearable = !!clearable;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getClearable() {\r\n return this._p.clearable;\r\n }\r\n\r\n /**\r\n * @param {boolean} enabled\r\n * @returns {SelectBox}\r\n */\r\n setHasOpenIndicator(enabled) {\r\n enabled = !!enabled;\r\n\r\n if (this._p.hasOpenIndicator === enabled)\r\n return this;\r\n\r\n this._p.hasOpenIndicator = enabled;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getHasOpenIndicator() {\r\n return this._p.hasOpenIndicator;\r\n }\r\n\r\n /**\r\n * @param {string} placeholder\r\n * @returns {SelectBox}\r\n */\r\n setPlaceholder(placeholder) {\r\n this._p.placeholder = placeholder == null ? '' : String(placeholder);\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n getPlaceHolder() {\r\n return this._p.placeholder;\r\n }\r\n\r\n /**\r\n * @param {string} term\r\n * @param {boolean} [performSearch=false] should actually perform the search, or just set the input's text?\r\n * @returns {SelectBox}\r\n */\r\n setSearchTerm(term, performSearch = false) {\r\n const p = this._p;\r\n\r\n if (!p.input) return this;\r\n\r\n p.input.value = term;\r\n\r\n this._scheduleSync('resize_input');\r\n\r\n if (performSearch) {\r\n p.filterTerm = p.input.value.trim();\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n\r\n this._trigger('search', { value: p.input.value });\r\n p.throttledUpdateListItems();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n getSearchTerm() {\r\n const p = this._p;\r\n if (p.input)\r\n return p.input.value;\r\n return '';\r\n }\r\n\r\n /**\r\n * @param {boolean} sortSelectedItems\r\n * @returns {SelectBox}\r\n */\r\n setSortSelectedItems(sortSelectedItems) {\r\n const p = this._p;\r\n sortSelectedItems = !!sortSelectedItems;\r\n if (p.sortSelectedItems === sortSelectedItems)\r\n return this;\r\n\r\n p.sortSelectedItems = sortSelectedItems;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSortSelectedItemsEnabled() {\r\n return this._p.sortSelectedItems;\r\n }\r\n\r\n /**\r\n * @param {boolean} sortListItems\r\n * @returns {SelectBox}\r\n */\r\n setSortListItems(sortListItems) {\r\n const p = this._p;\r\n sortListItems = !!sortListItems;\r\n if (p.sortListItems === sortListItems)\r\n return this;\r\n\r\n p.sortListItems = sortListItems;\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSortListItemsEnabled() {\r\n return this._p.sortListItems;\r\n }\r\n\r\n /**\r\n * @param {boolean} sortListCheckedFirst\r\n * @returns {SelectBox}\r\n */\r\n setSortListCheckedFirst(sortListCheckedFirst) {\r\n const p = this._p;\r\n sortListCheckedFirst = !!sortListCheckedFirst;\r\n if (p.sortCheckedFirst === sortListCheckedFirst)\r\n return this;\r\n\r\n p.sortCheckedFirst = sortListCheckedFirst;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSortListCheckedFirstEnabled() {\r\n return this._p.sortListCheckedFirst;\r\n }\r\n\r\n /**\r\n * @param {*[]} values\r\n * @returns {SelectBox}\r\n */\r\n setStickyValues(values) {\r\n const p = this._p;\r\n\r\n p.stickyValues = Array.isArray(values) ? new Set(values) : null;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {*[]}\r\n */\r\n getStickyValues() {\r\n return this._p.stickyValues ? Array.from(this._p.stickyValues) : null;\r\n }\r\n\r\n /**\r\n * @param {function(a: DropList.ItemBase, b: DropList.ItemBase):number} comparator\r\n * @returns {SelectBox}\r\n */\r\n setSortItemComparator(comparator) {\r\n const p = this._p;\r\n if (p.sortItemComparator === comparator)\r\n return this;\r\n\r\n p.sortItemComparator = comparator;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {function(a: DropList.ItemBase, b: DropList.ItemBase):number}\r\n */\r\n getSortItemComparator() {\r\n return this._p.sortItemComparator;\r\n }\r\n\r\n /**\r\n * @param {boolean} splitListCheckedGroups\r\n * @returns {SelectBox}\r\n */\r\n setSplitListCheckedGroups(splitListCheckedGroups) {\r\n const p = this._p;\r\n splitListCheckedGroups = !!splitListCheckedGroups;\r\n if (p.splitListCheckedGroups === splitListCheckedGroups)\r\n return this;\r\n\r\n p.splitListCheckedGroups = splitListCheckedGroups;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSplitListCheckedGroupsEnabled() {\r\n return this._p.splitListCheckedGroups;\r\n }\r\n\r\n /**\r\n * @param {boolean} showSelection\r\n * @returns {SelectBox}\r\n */\r\n setShowSelection(showSelection) {\r\n const p = this._p;\r\n showSelection = !!showSelection;\r\n if (p.showSelection === showSelection)\r\n return this;\r\n\r\n this._p.showSelection = showSelection;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isShowSelectionEnabled() {\r\n return this._p.showSelection;\r\n }\r\n\r\n /**\r\n * @param {function(items: DropList.ItemBase[]):string} formatter\r\n * @returns {SelectBox}\r\n */\r\n setMultiPlaceholderFormatter(formatter) {\r\n const p = this._p;\r\n\r\n if (p.multiPlaceholderFormatter === formatter)\r\n return this;\r\n\r\n this._p.multiPlaceholderFormatter = formatter;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {boolean|'touch'} value\r\n * @returns {SelectBox}\r\n */\r\n setBlurOnSingleSelection(value) {\r\n const p = this._p;\r\n if (p.blurOnSingleSelection === value)\r\n return this;\r\n\r\n this._p.blurOnSingleSelection = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean|'touch'}\r\n */\r\n getBlurOnSingleSelection() {\r\n return this._p.blurOnSingleSelection;\r\n }\r\n\r\n /**\r\n * @param {boolean} multi\r\n * @returns {SelectBox}\r\n */\r\n setMulti(multi) {\r\n const p = this._p;\r\n multi = !!multi;\r\n if (p.multi === multi)\r\n return this;\r\n\r\n p.multi = multi;\r\n\r\n this._setupDropdownMenu();\r\n\r\n // move to correct parent\r\n remove(p.clearButtonWrapper);\r\n delete p.clearButtonWrapper;\r\n\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isMultiEnabled() {\r\n return this._p.multi;\r\n }\r\n\r\n /**\r\n * @param {boolean} searchable\r\n * @returns {SelectBox}\r\n */\r\n setSearchable(searchable) {\r\n const p = this._p;\r\n searchable = !!searchable;\r\n if (p.searchable === searchable)\r\n return this;\r\n\r\n p.searchable = searchable;\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSearchableEnabled() {\r\n return this._p.searchable;\r\n }\r\n\r\n /**\r\n * @param {string} noResultsText\r\n * @returns {SelectBox}\r\n */\r\n setNoResultsText(noResultsText) {\r\n this._p.noResultsText = noResultsText;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n getNoResultsText() {\r\n return this._p.noResultsText;\r\n }\r\n\r\n /**\r\n * @param {number} window\r\n * @returns {SelectBox}\r\n */\r\n setFilterThrottleWindow(window) {\r\n const p = this._p;\r\n p.filterThrottleWindow = window;\r\n\r\n let isScheduled = p.throttledUpdateListItems ? p.throttledUpdateListItems.isScheduled() : false;\r\n\r\n if (p.throttledUpdateListItems)\r\n p.throttledUpdateListItems.cancel();\r\n\r\n p.throttledUpdateListItems = throttle(() => this._updateListItems(), p.filterThrottleWindow, true);\r\n\r\n if (isScheduled)\r\n p.throttledUpdateListItems();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n getFilterThrottleWindow() {\r\n return this._p.filterThrottleWindow;\r\n }\r\n\r\n /**\r\n * @param {boolean} value\r\n * @returns {SelectBox}\r\n */\r\n setFilterOnEmptyTerm(value) {\r\n const p = this._p;\r\n p.filterOnEmptyTerm = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getFilterOnEmptyTerm() {\r\n return this._p.filterOnEmptyTerm;\r\n }\r\n\r\n /**\r\n * @param {DropList.Options} listOptions\r\n * @returns {SelectBox}\r\n */\r\n setListOptions(listOptions) {\r\n const p = this._p;\r\n p.listOptions = listOptions;\r\n this._setupDropdownMenu();\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox})|null\r\n */\r\n setRenderSingleItem(render, unrender) {\r\n const p = this._p;\r\n p.renderSingleItem = render;\r\n p.unrenderSingleItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox}\r\n */\r\n setRenderMultiItem(render, unrender) {\r\n const p = this._p;\r\n p.renderMultiItem = render;\r\n p.unrenderMultiItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox}\r\n */\r\n setRenderRestMultiItem(render, unrender) {\r\n const p = this._p;\r\n p.renderRestMultiItem = render;\r\n p.unrenderRestMultiItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox}\r\n */\r\n setRenderNoResultsItem(render, unrender) {\r\n const p = this._p;\r\n p.renderNoResultsItem = render;\r\n p.unrenderNoResultsItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {SelectBox}\r\n */\r\n setLabelProp(prop) {\r\n const p = this._p;\r\n p.labelProp = prop;\r\n\r\n\t\tif (p.dropList)\r\n\t\t\tp.dropList.setLabelProp(prop);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {SelectBox}\r\n */\r\n setValueProp(prop) {\r\n const p = this._p;\r\n p.valueProp = prop;\r\n\r\n\t\tif (p.dropList)\r\n\t\t\tp.dropList.setValueProp(prop);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {SelectBox}\r\n */\r\n setMultiItemLabelProp(prop) {\r\n const p = this._p;\r\n p.multiItemLabelProp = prop;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {number|null|undefined} value\r\n * @returns {SelectBox}\r\n */\r\n setMaxMultiItems(value) {\r\n const p = this._p;\r\n p.maxMultiItems = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {function(count: number, items: DropList.ItemBase[]):string|null|undefined} value\r\n * @returns {SelectBox}\r\n */\r\n setMultiItemsRestLabelProvider(value) {\r\n const p = this._p;\r\n p.multiItemsRestLabelProvider = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {function(items: DropList.ItemBase[], term: string):(DropList.ItemBase[]|null)} fn\r\n * @returns {SelectBox}\r\n */\r\n setFilterFn(fn) {\r\n const p = this._p;\r\n p.filterFn = fn;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {function(items: DropList.ItemBase[], term: string):(DropList.ItemBase[]|null)}\r\n */\r\n getFilterFn() {\r\n return this._p.filterFn;\r\n }\r\n\r\n /**\r\n * Focus on input element\r\n * @returns {SelectBox}\r\n */\r\n focusInput() {\r\n const p = this._p;\r\n\r\n if (p.input)\r\n p.input.focus();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remvoe focus from the input element\r\n * @returns {SelectBox}\r\n */\r\n blurInput() {\r\n const p = this._p;\r\n\r\n if (p.input)\r\n p.input.blur();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes all selected items\r\n * @returns {SelectBox}\r\n */\r\n clear() {\r\n const p = this._p;\r\n\r\n let clearEvt = { cancel: false };\r\n this._trigger('clear:before', clearEvt);\r\n if (clearEvt.cancel)\r\n return this;\r\n\r\n p.selectedItems = [];\r\n p.selectedValues = [];\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n\r\n this._trigger('clear');\r\n\r\n if (this[DestroyedSymbol]) return this; // destroyed by event handler\r\n\r\n this._updateListItems();\r\n\r\n this._setInputText('');\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a single value or an array of selected values - depending on `multi` prop\r\n * @public\r\n * @returns {*[]}\r\n */\r\n getValue() {\r\n const p = this._p;\r\n if (p.multi)\r\n return p.selectedValues.slice(0);\r\n else if (p.selectedValues.length > 0)\r\n return p.selectedValues[0];\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Selects the specified value or multiple values - depending on `multi` prop\r\n * @public\r\n * @param {*|*[]} value - if `multi`, then an array of values to select, otherwise - a single value to select\r\n * @returns {SelectBox}\r\n */\r\n setValue(value) {\r\n const p = this._p;\r\n if (p.multi)\r\n return this.setSelectedValues(Array.isArray(value) ? value : value !== undefined ? [value] : []);\r\n else\r\n return this.setSelectedValues(value !== undefined ? [value] : []);\r\n }\r\n\r\n /**\r\n * Returns an array of selected values\r\n * @public\r\n * @returns {*[]}\r\n */\r\n getSelectedValues() {\r\n const p = this._p;\r\n return p.selectedValues.slice(0);\r\n }\r\n\r\n /**\r\n * Selects the specified values\r\n * @public\r\n * @param {*[]} values - an array of *values* to select\r\n * @returns {SelectBox}\r\n */\r\n setSelectedValues(values) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (!p.multi) {\r\n values = values.slice(0, 1);\r\n }\r\n\r\n let set = new Set();\r\n let selectedValues = [];\r\n let selectedItems = [];\r\n\r\n for (let value of values) {\r\n if (set.has(value))\r\n continue;\r\n set.add(value);\r\n\r\n selectedValues.push(value);\r\n\r\n let item = p.items.find(x => x[valueProp] === value);\r\n if (item !== undefined) {\r\n selectedItems.push(item);\r\n } else {\r\n selectedItems.push({ [p.valueProp]: value });\r\n }\r\n }\r\n\r\n p.selectedValues = selectedValues;\r\n p.selectedItems = selectedItems;\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n\r\n this._updateListItems();\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the count of selected values\r\n * @public\r\n * @returns {number}\r\n */\r\n getSelectedValueCount() {\r\n const p = this._p;\r\n return p.selectedValues.length;\r\n }\r\n\r\n /**\r\n * Returns an array of selected items\r\n * @public\r\n * @returns {Array.<Object>}\r\n */\r\n getSelectedItems() {\r\n const p = this._p;\r\n return p.selectedItems.slice(0);\r\n }\r\n\r\n /**\r\n * Sets the specified items to \"checked\" mode.\r\n * An array of items is passed, not values, because we need to keep track if items,\r\n * and if we already have the array of items then this spares the process of searching for the items by values.\r\n * @public\r\n * @param {DropList.ItemBase[]} items - an array of *items* to select (not values)\r\n * @returns {SelectBox}\r\n */\r\n setSelectedItems(items) {\r\n this._setSelectedItems(items);\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {SelectBox}\r\n */\r\n openList() {\r\n const p = this._p;\r\n\r\n if (p.dropList.isVisible())\r\n return this;\r\n\r\n if (p.isLoadingMode && p.items.length === 0)\r\n return this;\r\n\r\n this._trigger('open:before', { list: p.dropList });\r\n\r\n p.dropList.show(this._getDropListPositionOptions());\r\n this._repositionDropList();\r\n\r\n // Another one in case the droplist position messed with screen layout.\r\n // If the out element's bounds stayed the same - nothing will be recalculated.\r\n // So this is *not* expensive.\r\n this._repositionDropList();\r\n\r\n if (p.dropList.hasFocusedItem()) {\r\n p.dropList.setFocusedItemAtIndex(p.dropList.getFocusedItemIndex());\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {SelectBox}\r\n */\r\n closeList() {\r\n const p = this._p;\r\n\r\n if (this[DestroyedSymbol])\r\n return this;\r\n\r\n if (!p.dropList.isVisible())\r\n return this;\r\n\r\n p.dropList.hide();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {boolean} [open]\r\n * @returns {SelectBox}\r\n */\r\n toggleList(open) {\r\n const p = this._p;\r\n\r\n let shouldOpen = open === undefined ? !p.dropList.isVisible() : !!open;\r\n\r\n if (shouldOpen)\r\n return this.openList();\r\n else return this.closeList();\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isListOpen() {\r\n return !!this._p.dropListVisible;\r\n }\r\n\r\n /**\r\n * @param {boolean} [on]\r\n * @returns {SelectBox}\r\n */\r\n toggleLoading(on) {\r\n return this.setIsLoadingMode(on === undefined ? !this.getIsLoadingMode() : !!on);\r\n }\r\n\r\n /**\r\n * @param {boolean} isLoadingMode\r\n * @returns {SelectBox}\r\n */\r\n setIsLoadingMode(isLoadingMode) {\r\n const p = this._p;\r\n\r\n isLoadingMode = isLoadingMode === undefined ? true : !!isLoadingMode;\r\n\r\n if (p.isLoadingMode === isLoadingMode)\r\n return this;\r\n\r\n p.isLoadingMode = isLoadingMode;\r\n\r\n if (p.isLoadingMode && p.items.length === 0 && this.isListOpen()) {\r\n this.closeList();\r\n } else if (!p.isLoadingMode && document.activeElement &&\r\n ((p.multi || p.searchable) && p.input.contains(document.activeElement) ||\r\n (!p.multi && !p.searchable) && p.el.contains(document.activeElement))) {\r\n this.openList();\r\n }\r\n\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getIsLoadingMode() {\r\n return this._p.isLoadingMode;\r\n }\r\n\r\n /**\r\n * Can be called in case that the selectbox was attached to the dom late and has a weird size.\r\n * @returns {SelectBox}\r\n */\r\n refreshSize() {\r\n this._resizeInput();\r\n return this;\r\n }\r\n\r\n /**\r\n * Register an event handler\r\n * @param {(string|'*')?} event\r\n * @param {function(any)} handler\r\n * @returns {SelectBox}\r\n */\r\n on(/**string|'*'*/event, /**Function?*/handler) {\r\n this._p.mitt.on(event, handler);\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a one time event handler\r\n * @param {(string|'*')?} event\r\n * @param {function(any)} handler\r\n * @returns {SelectBox}\r\n */\r\n once(/**string|'*'*/event, /**Function?*/handler) {\r\n let wrapped = (value) => {\r\n this._p.mitt.off(event, wrapped);\r\n handler(value);\r\n };\r\n this._p.mitt.on(event, wrapped);\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an `handler` for `event`, all events for `event`, or all events completely.\r\n * @param {(string|'*')?} event\r\n * @param {function(any)} handler\r\n * @returns {SelectBox}\r\n */\r\n off(/**(string|'*')?*/event, /**Function?*/handler) {\r\n if (!event && !event) {\r\n this._p.mitt.all.clear();\r\n } else {\r\n this._p.mitt.off(event, handler);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Emit an event\r\n * @param {string} event\r\n * @param {any} value\r\n * @returns {SelectBox}\r\n */\r\n emit(/**string|'*'*/event, /**any?*/value) {\r\n this._p.mitt.emit(event, value);\r\n return this;\r\n }\r\n\r\n /** @private */\r\n _renderBase() {\r\n const p = this._p;\r\n\r\n if (!p.inputBackBuffer) {\r\n p.inputBackBuffer = createElement('span', {\r\n css: {\r\n position: 'absolute',\r\n zIndex: -1,\r\n left: 0,\r\n top: '-9999px',\r\n whiteSpace: 'pre',\r\n },\r\n });\r\n }\r\n\r\n if (!p.input) {\r\n p.inputWrapper = createElement('span',\r\n {\r\n class: `${p.baseClassName}__search_wrapper`,\r\n },\r\n p.input = createElement('input', {\r\n class: `${p.baseClassName}__search_field`,\r\n type: 'search',\r\n autocomplete: 'off',\r\n autocorrect: 'off',\r\n autocapitalize: 'off',\r\n spellcheck: 'false',\r\n role: 'textbox',\r\n 'aria-autocomplete': 'list',\r\n readOnly: !(p.searchable || p.multi),\r\n }),\r\n );\r\n }\r\n\r\n if (p.multi) {\r\n if (p.singleWrapper) {\r\n this._cleanupSingleWrapper();\r\n remove(p.singleWrapper);\r\n delete p.singleWrapper;\r\n }\r\n\r\n if (!p.list) {\r\n // Moving `inputWrapper` to a new parent may cause a 'blur' event, and an unwanted chain reaction!\r\n // So we're unregistering those events here.\r\n this._unregisterDropdownEvents();\r\n\r\n // Restore focus to this one later if we affected it\r\n const lastActiveElement = document.activeElement;\r\n\r\n p.list = createElement('ul', {\r\n class: `${p.baseClassName}__list`,\r\n });\r\n p.el.appendChild(p.list);\r\n p.list.appendChild(p.inputWrapper);\r\n p.el.classList.remove(`${p.baseClassName}__single`);\r\n p.el.classList.add(`${p.baseClassName}__multi`);\r\n\r\n // Hook clear and remove\r\n p.sink\r\n .add(p.list, 'click', (evt) => {\r\n if (!closestUntil(evt.target, `.${p.baseClassName}__item_remove`, evt.currentTarget))\r\n return;\r\n\r\n if (p.disabled) return;\r\n\r\n this._removeMultiItemFromEvent(\r\n /**@type Element*/\r\n closestUntil(evt.target, `.${p.baseClassName}__item`, evt.currentTarget),\r\n evt);\r\n })\r\n .add(p.list, 'keydown', (/**KeyboardEvent*/evt) => {\r\n if (!closestUntil(evt.target, `.${p.baseClassName}__item`, evt.currentTarget))\r\n return;\r\n\r\n this._handleMultiKeydown(evt);\r\n });\r\n\r\n if (lastActiveElement === p.input)\r\n p.input.focus();\r\n\r\n this._registerDropdownEvents();\r\n }\r\n } else {\r\n if (p.list) {\r\n remove(p.list);\r\n p.sink.remove(p.list);\r\n delete p.list;\r\n }\r\n\r\n if (!p.singleWrapper) {\r\n // Moving `inputWrapper` to a new parent may cause a 'blur' event, and an unwanted chain reaction!\r\n // So we're unregistering those events here.\r\n this._unregisterDropdownEvents();\r\n\r\n // Restore focus to this one later if we affected it\r\n const lastActiveElement = document.activeElement;\r\n\r\n p.singleWrapper = createElement('div', {\r\n class: `${p.baseClassName}__single_wrapper`,\r\n });\r\n p.el.appendChild(p.singleWrapper);\r\n p.el.appendChild(p.inputWrapper);\r\n p.el.classList.remove(`${p.baseClassName}__multi`);\r\n p.el.classList.add(`${p.baseClassName}__single`);\r\n\r\n if (lastActiveElement === p.input)\r\n p.input.focus();\r\n\r\n this._registerDropdownEvents();\r\n }\r\n }\r\n\r\n if (p.hasOpenIndicator !== !!p.openIndicator) {\r\n if (p.hasOpenIndicator) {\r\n p.openIndicator = createElement('span', { class: `${p.baseClassName}__open_indicator` });\r\n p.el.appendChild(p.openIndicator);\r\n } else {\r\n remove(p.openIndicator);\r\n delete p.openIndicator;\r\n p.el.classList.remove(`${p.baseClassName}__has_open_indicator`);\r\n }\r\n }\r\n\r\n if (p.isLoadingMode !== !!p.spinner) {\r\n if (p.isLoadingMode) {\r\n p.spinner = createElement('span', { class: `${p.baseClassName}__spinner` });\r\n p.el.appendChild(p.spinner);\r\n p.el.classList.add(`${p.baseClassName}__has_spinner`);\r\n } else {\r\n remove(p.spinner);\r\n delete p.spinner;\r\n p.el.classList.remove(`${p.baseClassName}__has_spinner`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _syncBaseClasses() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!el)\r\n return;\r\n\r\n let classes = [p.baseClassName];\r\n\r\n if (p.multi)\r\n classes.push(`${p.baseClassName}__multi`);\r\n else classes.push(`${p.baseClassName}__single`);\r\n\r\n if (this.isListOpen())\r\n classes.push(`${p.baseClassName}__open_list`);\r\n else classes.push(`${p.baseClassName}__closed_list`);\r\n\r\n if (p.hasOpenIndicator)\r\n classes.push(`${p.baseClassName}__has_open_indicator`);\r\n\r\n if (p.clearButtonWrapper)\r\n classes.push(`${p.baseClassName}__has_clear`);\r\n\r\n if (p.isLoadingMode)\r\n classes.push(`${p.baseClassName}__has_spinner`);\r\n\r\n if (p.selectedValues.length === 0)\r\n classes.push(`${p.baseClassName}__empty_selection`);\r\n\r\n if (p.selectedValues.length > 0)\r\n classes.push(`${p.baseClassName}__has_selection`);\r\n\r\n if (p.searchable || p.multi)\r\n classes.push(`${p.baseClassName}__searchable`);\r\n\r\n if (p.additionalClasses) {\r\n classes = classes.concat(p.additionalClasses);\r\n }\r\n\r\n el.className = classes.join(' ');\r\n }\r\n\r\n /** @private */\r\n _setupDropdownMenu() {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (p.dropList) {\r\n p.dropList.destroy();\r\n delete p.dropList;\r\n p.itemsChanged = true;\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n }\r\n\r\n const renderNoResultsItem = p.renderNoResultsItem;\r\n const unrenderNoResultsItem = p.unrenderNoResultsItem;\r\n const customRenderItem = (p.listOptions || {}).renderItem;\r\n const customUnrenderItem = (p.listOptions || {}).unrenderItem;\r\n\r\n const renderItem = (renderNoResultsItem || customRenderItem) ? (item, itemEl) => {\r\n if (item && item[valueProp] === NoResultsItemSymbol) {\r\n if (renderNoResultsItem && renderNoResultsItem(item, itemEl) !== false) {\r\n return true;\r\n }\r\n\r\n itemEl.appendChild(createElement('div', {\r\n class: 'droplist-no-results-content',\r\n textContent: p.noResultsText,\r\n }));\r\n return true;\r\n } else {\r\n if (customRenderItem)\r\n return customRenderItem(item, itemEl);\r\n }\r\n return false;\r\n } : null;\r\n\r\n const unrenderItem = (unrenderNoResultsItem || customRenderItem) ? (item, itemEl) => {\r\n if (item && item[valueProp] === NoResultsItemSymbol) {\r\n if (unrenderNoResultsItem)\r\n return unrenderNoResultsItem(item, itemEl);\r\n } else {\r\n if (customUnrenderItem)\r\n return customUnrenderItem(item, itemEl);\r\n }\r\n return false;\r\n } : null;\r\n\r\n const dropList = p.dropList = new DropList({\r\n virtualMinItems: 10,\r\n\r\n ...p.listOptions,\r\n\r\n renderItem: renderItem,\r\n unrenderItem: unrenderItem,\r\n\r\n multi: p.multi,\r\n capturesFocus: false,\r\n\r\n labelProp: p.labelProp,\r\n valueProp: p.valueProp,\r\n\r\n on: (name, event) => {\r\n switch (name) {\r\n case 'show:before': {\r\n p.dropListVisible = true;\r\n p.el.setAttribute('aria-expanded', 'true');\r\n p.el.classList.add(`${p.baseClassName}__open_list`);\r\n p.el.classList.remove(`${p.baseClassName}__closed_list`);\r\n\r\n if (p.resortBySelectionNeeded && (p.sortListCheckedFirst && p.multi))\r\n p.itemsChanged = true;\r\n\r\n this._updateListItems();\r\n this._trigger('open', { list: dropList });\r\n\r\n this._startTrackingPresence();\r\n\r\n p.sink.add(window, 'resize.trackposition', () => this._repositionDropList());\r\n\r\n let parent = p.el.parentNode;\r\n while (parent) {\r\n if (parent.scrollHeight > parent.offsetHeight ||\r\n parent.scrollWidth > parent.offsetWidth) {\r\n if (parent === document.documentElement) {\r\n parent = window;\r\n }\r\n p.sink.add(parent, 'scroll.trackposition', () => this._repositionDropList());\r\n }\r\n parent = parent.parentNode;\r\n }\r\n }\r\n break;\r\n\r\n case 'hide': {\r\n p.dropListVisible = false;\r\n p.el.setAttribute('aria-expanded', 'false');\r\n p.el.classList.remove(`${p.baseClassName}__open_list`);\r\n p.el.classList.add(`${p.baseClassName}__closed_list`);\r\n\r\n if (!p.multi) {\r\n this._setInputText('');\r\n this._scheduleSync();\r\n }\r\n\r\n this._trigger('close');\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n this._stopTrackingPresence();\r\n p.sink.remove(null, '.trackposition');\r\n }\r\n break;\r\n\r\n case 'check': {\r\n if (!p.multi) return;\r\n\r\n const item = /**@type DropList.Item*/event.item;\r\n const value = event.value;\r\n\r\n let checked = event.checked;\r\n if (event.isGroup) return; // Ignore groups\r\n\r\n let selEvt = { value: value, item: item, cancel: false };\r\n this._trigger((checked ? 'addsel' : 'removesel') + ':before', selEvt);\r\n\r\n if (selEvt.cancel) {\r\n // Rollback that check\r\n p.dropList.setItemChecked(value, !checked);\r\n return;\r\n }\r\n\r\n if (checked) {\r\n p.selectedItems.push(item);\r\n p.selectedValues.push(value);\r\n } else {\r\n const idx = p.selectedValues.indexOf(value);\r\n if (idx !== -1) {\r\n p.selectedItems.splice(idx, 1);\r\n p.selectedValues.splice(idx, 1);\r\n }\r\n }\r\n\r\n // If we are in context of group, then there are lots of syncs coming, so do not do it now\r\n const hasGroupSync = !!event.isCheckingGroup;\r\n\r\n if (p.showSelection) {\r\n if (checked) {\r\n if (dropList.itemCount() === 1) {\r\n this._setInputText('');\r\n }\r\n\r\n if (p.sortSelectedItems) {\r\n if (!hasGroupSync)\r\n this._scheduleSync('full');\r\n } else {\r\n if (p.maxMultiItems != null &&\r\n p.selectedItems.filter(x => !x._group).length > p.maxMultiItems) {\r\n this._scheduleSync('addOrUpdateMultiItemRestElement');\r\n } else {\r\n this._scheduleSync('addMultiItemElement', item);\r\n }\r\n\r\n if (!hasGroupSync)\r\n this._scheduleSync();\r\n }\r\n } else {\r\n if (p.maxMultiItems != null &&\r\n p.selectedItems.filter(x => !x._group).length === p.maxMultiItems) {\r\n this._scheduleSync('removeMultiItemRestElement');\r\n } else {\r\n this._scheduleSync('removeMultiItemElement', item);\r\n }\r\n\r\n if (!hasGroupSync)\r\n this._scheduleSync();\r\n }\r\n }\r\n\r\n this._trigger(checked ? 'addsel' : 'removesel', { value: value, item: item });\r\n }\r\n break;\r\n\r\n case 'groupcheck': {\r\n if (!p.multi) return;\r\n\r\n if (event.affectedItems) {\r\n this._scheduleSync(p.sortSelectedItems ? 'full' : null);\r\n }\r\n }\r\n break;\r\n\r\n case 'select': {\r\n if (p.multi) return;\r\n\r\n const item = event.item;\r\n const value = event.value;\r\n\r\n let selectEvt = { value: value, item: item, cancel: false };\r\n this._trigger('select:before', selectEvt);\r\n\r\n if (selectEvt.cancel)\r\n return;\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n this._setSelectedItems([item]);\r\n this._trigger('select', { value: value, item: item });\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n this.closeList();\r\n\r\n if (p.blurOnSingleSelection === 'touch' && hasTouchCapability ||\r\n p.blurOnSingleSelection !== 'touch' && p.blurOnSingleSelection) {\r\n p.input && p.input.blur();\r\n }\r\n }\r\n break;\r\n }\r\n },\r\n });\r\n\r\n this._registerDropdownEvents();\r\n }\r\n\r\n _unregisterDropdownEvents() {\r\n const p = this._p;\r\n\r\n p.sink.remove(null, '.dropdown');\r\n }\r\n\r\n _registerDropdownEvents() {\r\n const p = this._p;\r\n\r\n this._unregisterDropdownEvents();\r\n\r\n const dropList = p.dropList;\r\n if (!dropList) return;\r\n\r\n let avoidToggleFromClick = false,\r\n currentTouchId = null,\r\n suppressKeyPress = false,\r\n suppressKeyPressRepeat = false;\r\n\r\n const keyEventsTarget = p.multi || p.searchable ? p.input : p.el;\r\n\r\n p.sink\r\n .add(keyEventsTarget, 'keydown.dropdown', evt => {\r\n if ((/**@type HTMLInputElement*/evt.currentTarget).readOnly)\r\n return;\r\n\r\n suppressKeyPress = false;\r\n suppressKeyPressRepeat = false;\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n case VALUE_PAGE_DOWN:\r\n case VALUE_UP:\r\n case VALUE_DOWN:\r\n suppressKeyPress = true;\r\n evt.preventDefault();\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n if (dropList.isVisible())\r\n dropList.previousPage(evt);\r\n break;\r\n case VALUE_PAGE_DOWN:\r\n if (dropList.isVisible())\r\n dropList.nextPage(evt);\r\n break;\r\n case VALUE_UP:\r\n if (dropList.isVisible()) {\r\n dropList.previous(evt);\r\n } else {\r\n this._movePrev();\r\n }\r\n break;\r\n case VALUE_DOWN:\r\n if (dropList.isVisible()) {\r\n dropList.next(evt);\r\n } else {\r\n this._moveNext();\r\n }\r\n break;\r\n\r\n }\r\n break;\r\n\r\n case VALUE_SPACE:\r\n if (p.lastKeyAllowsSpaceToggle) {\r\n if (dropList.isVisible() && dropList.hasFocusedItem()) {\r\n suppressKeyPress = true;\r\n suppressKeyPressRepeat = true;\r\n if (p.multi)\r\n dropList.toggleFocusedItem(evt);\r\n else dropList.triggerItemSelection(evt);\r\n evt.preventDefault();\r\n }\r\n }\r\n break;\r\n\r\n case VALUE_ENTER:\r\n if (dropList.isVisible() && dropList.hasFocusedItem()) {\r\n suppressKeyPress = true;\r\n suppressKeyPressRepeat = true;\r\n evt.preventDefault();\r\n dropList.triggerItemSelection(evt);\r\n }\r\n\r\n break;\r\n\r\n case VALUE_TAB:\r\n if (dropList.isVisible() && dropList.hasFocusedItem()) {\r\n dropList.triggerItemSelection(evt);\r\n }\r\n break;\r\n\r\n case VALUE_ESCAPE:\r\n if (dropList.isVisible()) {\r\n dropList.hide(evt);\r\n evt.preventDefault();\r\n }\r\n break;\r\n\r\n default:\r\n suppressKeyPressRepeat = true;\r\n dropList._keydownFreeType(evt);\r\n break;\r\n }\r\n\r\n p.lastKeyAllowsSpaceToggle = evt.key === VALUE_UP ||\r\n evt.key === VALUE_DOWN ||\r\n evt.key === VALUE_PAGE_UP ||\r\n evt.key === VALUE_PAGE_DOWN ||\r\n (evt.key === VALUE_SPACE && !!p.lastKeyAllowsSpaceToggle);\r\n })\r\n .add(keyEventsTarget, 'keypress.dropdown', evt => {\r\n if (suppressKeyPress) {\r\n suppressKeyPress = false;\r\n evt.preventDefault();\r\n return;\r\n }\r\n\r\n if (suppressKeyPressRepeat)\r\n return;\r\n\r\n if (evt.key === VALUE_ENTER ||\r\n (\r\n evt.key === VALUE_SPACE &&\r\n p.lastKeyAllowsSpaceToggle &&\r\n !p.multi &&\r\n !dropList.hasFocusedItem()\r\n )\r\n ) {\r\n this.toggleList();\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n return;\r\n }\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n case VALUE_PAGE_DOWN:\r\n case VALUE_UP:\r\n case VALUE_DOWN:\r\n evt.preventDefault();\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n if (dropList.isVisible())\r\n dropList.previousPage(evt);\r\n break;\r\n case VALUE_PAGE_DOWN:\r\n if (dropList.isVisible())\r\n dropList.nextPage(evt);\r\n break;\r\n case VALUE_UP:\r\n if (dropList.isVisible()) {\r\n dropList.previous(evt);\r\n } else {\r\n this._movePrev();\r\n }\r\n break;\r\n case VALUE_DOWN:\r\n if (dropList.isVisible()) {\r\n dropList.next(evt);\r\n } else {\r\n this._moveNext();\r\n }\r\n break;\r\n }\r\n break;\r\n }\r\n });\r\n\r\n if (p.input) {\r\n p.sink\r\n .add(p.input, 'input.dropdown', () => {\r\n p.filterTerm = p.input.value.trim();\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n\r\n this._trigger('search', { value: p.input.value });\r\n\r\n p.throttledUpdateListItems();\r\n })\r\n .add(p.input, 'click.dropdown', () => {\r\n if (!p.multi && p.searchable) {\r\n this.openList();\r\n }\r\n })\r\n .add(p.input, 'focus.dropdown', () => {\r\n this._trigger('search:focus');\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n avoidToggleFromClick = false;\r\n this.openList();\r\n\r\n avoidToggleFromClick = true;\r\n setTimeout(() => { avoidToggleFromClick = false; }, 10);\r\n })\r\n .add(p.input, 'blur.dropdown', () => {\r\n this._trigger('search:blur');\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n if (p.throttledUpdateListItems)\r\n p.throttledUpdateListItems.cancel();\r\n\r\n this.closeList();\r\n });\r\n }\r\n\r\n p.sink\r\n .add(p.el, 'mousedown.dropdown', () => {\r\n if (!p.multi && !p.searchable && !avoidToggleFromClick) {\r\n this.toggleList();\r\n }\r\n avoidToggleFromClick = false;\r\n })\r\n .add(p.el, 'touchstart.dropdown', evt => {\r\n if (currentTouchId) return;\r\n currentTouchId = evt.changedTouches[0].identifier;\r\n\r\n if (this.isDisabled())\r\n return;\r\n\r\n if (closestUntil(evt.target, `.${p.baseClassName}__item,.${p.baseClassName}__clear`, p.el))\r\n return;\r\n\r\n let onTouchCancel = () => {\r\n currentTouchId = null;\r\n p.sink.remove(p.el, '.dropdown_touchextra');\r\n };\r\n\r\n (p.input || p.el).focus();\r\n\r\n p.sink\r\n .add(p.el, 'touchend.dropdown_touchextra', (tevt) => {\r\n let touch = Array.prototype.find.call(evt.changedTouches,\r\n touch => touch.identifier === currentTouchId);\r\n if (!touch) return onTouchCancel();\r\n\r\n tevt.preventDefault();\r\n onTouchCancel();\r\n })\r\n .add(p.el, 'touchmove.dropdown_touchextra', (tevt) => {\r\n tevt.preventDefault();\r\n })\r\n .add(p.el, 'touchcancel.dropdown_touchextra', onTouchCancel);\r\n });\r\n }\r\n\r\n _movePrev() {\r\n const p = this._p;\r\n\r\n if (this.isMultiEnabled()) return;\r\n\r\n let selectedItems = this.getSelectedItems();\r\n let items = p.filteredItems ?? p.items;\r\n if (p.currentItemsView && p.currentItemsView.length === items.length)\r\n items = p.currentItemsView;\r\n if ((items.length + (p.clearable ? 1 : 0)) > 1) {\r\n let nextIndex = selectedItems.length > 0 ? items.indexOf(selectedItems[0]) - 1 : (items.length - 1);\r\n if (nextIndex === -1 && !p.clearable)\r\n nextIndex = items.length - 1;\r\n this.setSelectedItems(nextIndex === -1 ? [] : [items[nextIndex]]);\r\n }\r\n }\r\n\r\n _moveNext() {\r\n const p = this._p;\r\n\r\n if (this.isMultiEnabled()) return;\r\n\r\n let selectedItems = this.getSelectedItems();\r\n let items = p.filteredItems ?? p.items;\r\n if (p.currentItemsView && p.currentItemsView.length === items.length)\r\n items = p.currentItemsView;\r\n if ((items.length + (p.clearable ? 1 : 0)) > 1) {\r\n let nextIndex = selectedItems.length > 0 ? items.indexOf(selectedItems[0]) + 1 : 0;\r\n if (nextIndex === items.length)\r\n nextIndex = p.clearable ? -1 : 0;\r\n this.setSelectedItems(nextIndex === -1 ? [] : [items[nextIndex]]);\r\n }\r\n }\r\n\r\n /** @private */\r\n _updateListItems() {\r\n const p = this._p;\r\n\r\n const dropList = p.dropList;\r\n if (!dropList || !p.dropListVisible)\r\n return;\r\n\r\n // For every search change, filteredItems is cleared.\r\n // If it's non-null here, then it means we have an extra call to _updateListItems, and not need to refilter.\r\n if (!p.filteredItems && (p.filterTerm || (p.filterOnEmptyTerm && p.filterFn))) {\r\n this._refilterItems();\r\n }\r\n\r\n if (p.itemsChanged || p.selectionChanged) {\r\n p.dropList._lastSerializedBox = null;\r\n }\r\n\r\n if (p.itemsChanged) {\r\n let items = p.filteredItems || p.items;\r\n if (p.sortListItems || (p.sortListCheckedFirst && p.multi)) {\r\n items = this._sortItems(items,\r\n p.sortListItems,\r\n p.sortListCheckedFirst && p.multi,\r\n p.splitListCheckedGroups);\r\n }\r\n dropList.removeAllItems();\r\n\r\n if (items.length === 0 && p.noResultsText) {\r\n items = [{\r\n [p.labelProp]: p.noResultsText,\r\n [p.valueProp]: NoResultsItemSymbol,\r\n _nointeraction: true,\r\n _nocheck: true,\r\n }];\r\n }\r\n\r\n dropList.addItems(items);\r\n p.currentItemsView = items;\r\n p.itemsChanged = false;\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = false;\r\n }\r\n\r\n let hasRefocusedItem = false;\r\n\r\n if (p.selectionChanged) {\r\n if (p.multi) {\r\n p.dropList.setCheckedValues(p.selectedValues);\r\n } else {\r\n const singleItemIndex = p.dropList.itemIndexByValue(this.getValue());\r\n\r\n p.dropList\r\n .setFocusedItemAtIndex(singleItemIndex)\r\n .setSingleSelectedItemAtIndex(singleItemIndex);\r\n\r\n hasRefocusedItem = p.dropList.hasFocusedItem();\r\n }\r\n p.selectionChanged = false;\r\n }\r\n\r\n this._repositionDropList();\r\n\r\n if (hasRefocusedItem) {\r\n p.dropList.setFocusedItemAtIndex(p.dropList.getFocusedItemIndex());\r\n }\r\n }\r\n\r\n _refilterItems() {\r\n const p = this._p;\r\n\r\n const term = p.filterTerm;\r\n\r\n if (term || (p.filterOnEmptyTerm && p.filterFn)) {\r\n let fn = p.filterFn;\r\n\r\n let filteredItems;\r\n\r\n if (typeof fn === 'function') {\r\n filteredItems = p.filterFn(p.items, term);\r\n }\r\n\r\n // If there was no filter function, or it gave up on filtering.\r\n if (!Array.isArray(filteredItems)) {\r\n if (term) {\r\n const matcher = new RegExp(escapeRegex(term), 'i');\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n\r\n filteredItems = p.items.filter(x => {\r\n if (x._group) return true;\r\n return matcher.test(x[labelProp] || x[multiItemLabelProp]);\r\n });\r\n } else {\r\n filteredItems = null;\r\n }\r\n }\r\n\r\n p.filteredItems = filteredItems;\r\n\r\n if (filteredItems) {\r\n // Clean up groups without children\r\n\r\n let lastGroup = -1;\r\n let len = filteredItems.length;\r\n\r\n for (let i = 0; i < len; i++) {\r\n let item = filteredItems[i];\r\n\r\n if (item._group) {\r\n if (lastGroup !== -1 && lastGroup === i - 1) {\r\n // It was an empty group\r\n filteredItems.splice(lastGroup, 1);\r\n i--;\r\n len--;\r\n }\r\n\r\n lastGroup = i;\r\n }\r\n }\r\n\r\n if (lastGroup !== -1) {\r\n if (lastGroup === len - 1) {\r\n // It was an empty group\r\n filteredItems.splice(lastGroup, 1);\r\n }\r\n }\r\n }\r\n } else {\r\n p.filteredItems = null;\r\n }\r\n\r\n this._trigger('itemschanged', { term: term, mutated: false, count: this.getFilteredItemCount() });\r\n\r\n p.itemsChanged = true;\r\n }\r\n\r\n _setSelectedItems(items) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (p.multi) {\r\n p.selectedItems = items.filter(x => x[valueProp] !== undefined);\r\n p.selectedValues = p.selectedItems.map(x => x[valueProp]);\r\n } else {\r\n p.selectedItems = items.slice(0, 1);\r\n p.selectedValues = items.slice(0, 1).map(x => x[valueProp]);\r\n }\r\n\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n\r\n this._updateListItems();\r\n this._scheduleSync('full');\r\n }\r\n\r\n _scheduleSync(mode, data) {\r\n const p = this._p;\r\n\r\n if (!p.syncQueue)\r\n p.syncQueue = [];\r\n\r\n if (mode === 'full')\r\n p.syncQueue.length = 0;\r\n\r\n if (p.syncQueue.length === 0 || p.syncQueue[0].mode !== 'full')\r\n p.syncQueue.push({ mode: mode, data: data });\r\n\r\n if (p.syncTimeout)\r\n return;\r\n\r\n p.syncTimeout = setTimeout(() => {\r\n delete p.syncTimeout;\r\n let queue = p.syncQueue;\r\n delete p.syncQueue;\r\n this._performSync(queue);\r\n });\r\n }\r\n\r\n _performSync(queue) {\r\n const p = this._p;\r\n\r\n if (this[DestroyedSymbol])\r\n return;\r\n\r\n for (let op of queue) {\r\n switch (op.mode) {\r\n case 'full':\r\n this._syncFull(true);\r\n break;\r\n\r\n case 'singleItem':\r\n this._syncSingleItem();\r\n break;\r\n\r\n case 'removeMultiItemElement': {\r\n if (p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n const valueProp = p.valueProp;\r\n const item = op.data,\r\n value = item[valueProp];\r\n\r\n let idx = p.multiItemEls.findIndex(x => x[ItemSymbol][valueProp] === value);\r\n if (idx !== -1) {\r\n this._removeMultiItemElementByIndex(idx);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case 'addMultiItemElement': {\r\n if (!p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n this._addMultiItemElement(op.data);\r\n }\r\n }\r\n break;\r\n\r\n case 'addOrUpdateMultiItemRestElement': {\r\n if (!p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n this._addMultiItemRestElement();\r\n }\r\n }\r\n break;\r\n\r\n case 'removeMultiItemRestElement': {\r\n if (!p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n let itemEl = p.multiItemEls[p.multiItemEls.length - 1];\r\n if (itemEl?.[ItemSymbol]?.[p.valueProp] === RestMultiItemsSymbol) {\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case 'resize_input': {\r\n this._resizeInput();\r\n }\r\n break;\r\n\r\n default:\r\n this._syncFull(false);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n _cleanupSingleWrapper() {\r\n const p = this._p;\r\n\r\n if (!p.singleWrapper) return;\r\n\r\n if (p.unrenderSingleItem && p.singleWrapper.childNodes.length > 0) {\r\n try {\r\n p.unrenderSingleItem(p.singleWrapper[ItemSymbol], p.singleWrapper);\r\n } catch (err) { console.error(err); } // eslint-disable-line no-console\r\n }\r\n\r\n delete p.singleWrapper[ItemSymbol];\r\n p.singleWrapper.innerHTML = '';\r\n }\r\n\r\n /**\r\n * @param {number} index\r\n * @private\r\n */\r\n _removeMultiItemElementByIndex(index) {\r\n const p = this._p, multiItemEls = p.multiItemEls;\r\n\r\n if (multiItemEls.length > index) {\r\n const itemEl = multiItemEls[index];\r\n const item = itemEl[ItemSymbol];\r\n\r\n let unrender = item?.[p.valueProp] === RestMultiItemsSymbol\r\n ? p.unrenderRestMultiItem ?? p.unrenderMultiItem\r\n : p.unrenderMultiItem;\r\n\r\n if (unrender && itemEl.childNodes.length > 0) {\r\n try {\r\n unrender(item, itemEl);\r\n } catch (err) { console.error(err); } // eslint-disable-line no-console\r\n }\r\n remove(itemEl);\r\n\r\n // fastpath\r\n if (index === multiItemEls.length - 1) multiItemEls.pop();\r\n else multiItemEls.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @private\r\n */\r\n _renderSingleItemContent(item) {\r\n const p = this._p;\r\n\r\n if (!p.renderSingleItem || p.renderSingleItem(item, p.singleWrapper) === false) {\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n\r\n let label = item[multiItemLabelProp] || item[labelProp];\r\n if (label === null || label === undefined)\r\n label = '';\r\n\r\n p.singleWrapper.appendChild(document.createTextNode(label));\r\n }\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @param {Element} itemEl\r\n * @private\r\n */\r\n _renderMultiItemContent(item, itemEl) {\r\n const p = this._p;\r\n\r\n let render = item[p.valueProp] === RestMultiItemsSymbol\r\n ? p.renderRestMultiItem ?? p.renderMultiItem\r\n : p.renderMultiItem;\r\n\r\n if (!render || render(item, itemEl) === false) {\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n const label = item[multiItemLabelProp] || item[labelProp];\r\n itemEl.appendChild(createElement('span', {\r\n textContent: label,\r\n }));\r\n }\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @private\r\n */\r\n _addMultiItemElement(item) {\r\n const p = this._p;\r\n const itemEl = this._renderMultiItem(item);\r\n if (!itemEl) return;\r\n\r\n before(p.inputWrapper, itemEl);\r\n p.multiItemEls.push(itemEl);\r\n }\r\n\r\n /** @private */\r\n _addMultiItemRestElement() {\r\n const p = this._p;\r\n\r\n let items = p.selectedItems.slice(0);\r\n let count = items.filter(x => !x._group).length - p.maxMultiItems;\r\n let label = p.multiItemsRestLabelProvider\r\n ? p.multiItemsRestLabelProvider(count, items)\r\n : `+ ${count}`;\r\n\r\n this._addMultiItemElement({\r\n items: items,\r\n [p.valueProp]: RestMultiItemsSymbol,\r\n [p.labelProp]: label,\r\n });\r\n }\r\n\r\n /** @private */\r\n _syncClearButton() {\r\n const p = this._p;\r\n\r\n // Set clear button\r\n if (p.selectedItems.length > 0 && p.clearable && p.showSelection) {\r\n if (!p.clearButtonWrapper) {\r\n p.clearButtonWrapper = createElement(\r\n p.multi ? 'li' : 'span',\r\n { class: `${p.baseClassName}__clear` },\r\n p.clearButton = createElement('button'));\r\n if (p.multi)\r\n append(p.list, p.clearButtonWrapper);\r\n else append(p.el, p.clearButtonWrapper);\r\n p.el.classList.add(`${p.baseClassName}__has_clear`);\r\n\r\n p.sink.add(p.clearButton, 'click', () => {\r\n if (this.isDisabled()) return;\r\n this.clear();\r\n });\r\n }\r\n } else {\r\n if (p.clearButtonWrapper) {\r\n p.sink.remove(p.clearButton, 'click');\r\n\r\n remove(p.clearButtonWrapper);\r\n delete p.clearButtonWrapper;\r\n delete p.clearButton;\r\n p.el.classList.remove(`${p.baseClassName}__has_clear`);\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n _syncPlaceholder() {\r\n const p = this._p;\r\n\r\n let placeholder = '';\r\n\r\n if (p.multi && !p.showSelection) {\r\n if (typeof p.multiPlaceholderFormatter === 'function') {\r\n placeholder = p.multiPlaceholderFormatter(p.selectedItems);\r\n } else {\r\n placeholder = defaultMultiPlaceholderFormatter(p.selectedItems, p.labelProp);\r\n }\r\n } else if (p.selectedItems.length === 0 || !p.showSelection) {\r\n placeholder = p.placeholder == null ? '' : (p.placeholder + '');\r\n }\r\n\r\n // Set input placeholder\r\n p.input.setAttribute('placeholder', placeholder);\r\n }\r\n\r\n /** @private */\r\n _syncSingleItem() {\r\n const p = this._p;\r\n\r\n if (p.singleWrapper)\r\n this._cleanupSingleWrapper();\r\n\r\n const items = p.selectedItems;\r\n\r\n if (items.length > 0) {\r\n this._renderSingleItemContent(items[0]);\r\n p.singleWrapper[ItemSymbol] = items[0];\r\n }\r\n }\r\n\r\n /**\r\n * Syncs render state, selected items, and position\r\n * @param {boolean=false} fullItemsRender Should re-render all items?\r\n * @returns {SelectBox}\r\n */\r\n _syncFull(fullItemsRender) {\r\n const p = this._p;\r\n\r\n this._renderBase();\r\n this._syncClearButton();\r\n this._syncPlaceholder();\r\n\r\n fullItemsRender = p.multi && p.showSelection && (fullItemsRender || p.selectedItems.length !== p.multiItemEls.length);\r\n\r\n if (fullItemsRender || !p.showSelection || !p.multi) {\r\n // Remove all item elements\r\n while (p.multiItemEls.length > 0) {\r\n // use fast path by removing in reverse\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n }\r\n }\r\n\r\n if (p.multi) {\r\n if (fullItemsRender) {\r\n const items = p.selectedItems;\r\n\r\n // Sort these\r\n if (p.sortSelectedItems) {\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp,\r\n valueProp = p.valueProp,\r\n stickyValues = p.stickyValues;\r\n\r\n const comparator = p.sortItemComparator || ((a, b) => {\r\n if (stickyValues !== null) {\r\n let sa = stickyValues.has(a[valueProp]);\r\n let sb = stickyValues.has(b[valueProp]);\r\n if (sa && !sb) return -1;\r\n if (!sa && sb) return 1;\r\n }\r\n\r\n const aLabel = a[multiItemLabelProp] || a[labelProp];\r\n const bLabel = b[multiItemLabelProp] || b[labelProp];\r\n return aLabel < bLabel ? -1 : (aLabel > bLabel ? 1 : 0);\r\n });\r\n\r\n items.sort(comparator);\r\n\r\n p.selectedValues = items.map(x => x[valueProp]);\r\n }\r\n\r\n let actualItemCount = 0;\r\n let max = p.maxMultiItems;\r\n let addRestItem = false;\r\n\r\n // Add item elements\r\n for (let i = 0; i < items.length; i++) {\r\n if (items[i]._group) continue;\r\n\r\n if (max != null && actualItemCount === max) {\r\n addRestItem = true;\r\n break;\r\n }\r\n\r\n actualItemCount++;\r\n this._addMultiItemElement(items[i]);\r\n }\r\n\r\n if (addRestItem) {\r\n this._addMultiItemRestElement();\r\n }\r\n }\r\n } else if (!p.multi) {\r\n this._syncSingleItem();\r\n }\r\n\r\n if (getRootNode(p.el) !== document)\r\n return this;\r\n\r\n toggleClass(p.el, `${p.baseClassName}__empty_selection`, p.selectedValues.length === 0);\r\n toggleClass(p.el, `${p.baseClassName}__has_selection`, p.selectedValues.length > 0);\r\n\r\n if (p.searchable || p.multi) {\r\n if (p.input) p.input.readOnly = false;\r\n p.el.classList.add(`${p.baseClassName}__searchable`);\r\n } else {\r\n if (p.input) p.input.readOnly = true;\r\n p.el.classList.remove(`${p.baseClassName}__searchable`);\r\n }\r\n\r\n // Update input size\r\n this._resizeInput()._updateListItems();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} event\r\n * @param {*} [data]\r\n * @private\r\n */\r\n _trigger(event, data) {\r\n const p = this._p;\r\n if (p.on)\r\n p.on(event, ...(data === undefined ? [] : [data]));\r\n p.mitt.emit(event, data);\r\n }\r\n\r\n /**\r\n * Render a multi item\r\n * @param {Object} item\r\n * @returns {Element|null}\r\n * @private\r\n */\r\n _renderMultiItem(item) {\r\n const p = this._p;\r\n\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n const label = item[multiItemLabelProp] ?? item[labelProp];\r\n if (label === false)\r\n return null;\r\n\r\n const itemEl = createElement('li',\r\n {\r\n class: `${p.baseClassName}__item`,\r\n tabindex: '0',\r\n title: label,\r\n },\r\n [\r\n createElement('span', {\r\n class: `${p.baseClassName}__item_remove`,\r\n role: 'presentation',\r\n }),\r\n ],\r\n );\r\n\r\n this._renderMultiItemContent(item, itemEl);\r\n\r\n itemEl[ItemSymbol] = item;\r\n\r\n return itemEl;\r\n }\r\n\r\n /**\r\n * Removes a specific multi item by user event\r\n * @param {Element} itemEl\r\n * @param {Event} originatingEvent\r\n * @returns {SelectBox}\r\n * @private\r\n */\r\n _removeMultiItemFromEvent(itemEl, originatingEvent) {\r\n const p = this._p;\r\n\r\n let nextFocus;\r\n if (/key/.test(originatingEvent.type)) {\r\n const kEvent = /**@type KeyboardEvent*/originatingEvent;\r\n if (kEvent.key === VALUE_DELETE) { // Delete\r\n nextFocus = next(itemEl, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n } else if (kEvent.key === VALUE_BACK_SPACE) { // Backspace\r\n nextFocus = prev(itemEl, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n }\r\n } else if (/click|mouse|touch/.test(originatingEvent.type)) {\r\n nextFocus = next(itemEl, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n }\r\n\r\n const item = itemEl[ItemSymbol], value = item[p.valueProp];\r\n\r\n if (item !== undefined) {\r\n if (value === RestMultiItemsSymbol) {\r\n let items = p.selectedItems.filter(x => !x._group).slice(p.maxMultiItems);\r\n let itemsToRemove = [];\r\n\r\n for (let item of items) {\r\n let removeselEvt = { value: value, item: item, cancel: false };\r\n this._trigger('removesel:before', removeselEvt);\r\n if (!removeselEvt.cancel)\r\n itemsToRemove.push(item);\r\n }\r\n\r\n if (itemsToRemove.length > 0) {\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n\r\n for (let item of itemsToRemove) {\r\n // sync selection\r\n let idx = p.selectedItems.indexOf(item);\r\n if (idx === -1)\r\n idx = p.selectedValues.indexOf(value[p.valueProp]);\r\n if (idx !== -1) {\r\n p.selectedItems.splice(idx, 1);\r\n p.selectedValues.splice(idx, 1);\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n }\r\n }\r\n }\r\n\r\n if (items.length > itemsToRemove.length) {\r\n this._addMultiItemRestElement();\r\n }\r\n\r\n if (itemsToRemove.length > 0) {\r\n this._scheduleSync();\r\n }\r\n } else {\r\n let removeselEvt = { value: value, item: item, cancel: false };\r\n this._trigger('removesel:before', removeselEvt);\r\n if (removeselEvt.cancel)\r\n return this;\r\n\r\n this._removeMultiItem(item);\r\n\r\n // trigger event\r\n this._trigger('removesel', { value: value, item: item });\r\n }\r\n }\r\n\r\n if (!nextFocus) {\r\n nextFocus = p.el.querySelector(`.${p.baseClassName}__item, .${p.baseClassName}__search_field`);\r\n }\r\n\r\n if (hasClass(nextFocus, `${p.baseClassName}__search_wrapper`)) {\r\n nextFocus = nextFocus.querySelector('input');\r\n }\r\n\r\n nextFocus && nextFocus.focus();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @param {boolean} [populate]\r\n * @private\r\n */\r\n _removeMultiItem(item, populate = false) {\r\n const p = this._p;\r\n const valueProp = p.valueProp,\r\n labelProp = p.labelProp;\r\n const value = item[valueProp];\r\n\r\n // sync selection\r\n let idx = p.selectedItems.indexOf(item);\r\n if (idx === -1)\r\n idx = p.selectedValues.indexOf(value);\r\n if (idx !== -1) {\r\n p.selectedItems.splice(idx, 1);\r\n p.selectedValues.splice(idx, 1);\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n }\r\n\r\n // sync multi item element\r\n idx = p.multiItemEls.findIndex(x => x[ItemSymbol] === item);\r\n if (idx === -1)\r\n idx = p.multiItemEls.findIndex(x => x[ItemSymbol][valueProp] === value);\r\n if (idx !== -1) {\r\n this._removeMultiItemElementByIndex(idx);\r\n }\r\n\r\n if (populate) {\r\n this._setInputText(item[p.multiItemLabelProp] || item[labelProp]);\r\n\r\n p.input.focus();\r\n\r\n // Go to end of input\r\n p.input.selectionStart = p.input.selectionEnd = p.input.value.length;\r\n }\r\n\r\n // sync\r\n this._scheduleSync();\r\n }\r\n\r\n /**\r\n * @param {*} value\r\n * @private\r\n */\r\n _setInputText(value) {\r\n const p = this._p;\r\n\r\n p.input.value = value == null ? '' : String(value);\r\n\r\n p.filterTerm = '';\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n }\r\n\r\n /**\r\n * Update input size to current state\r\n * @returns {SelectBox}\r\n * @private\r\n */\r\n _resizeInput() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!el.parentNode || !document.body.contains(el))\r\n return this;\r\n\r\n const input = p.input, backBufferEl = p.inputBackBuffer;\r\n\r\n let inputValue = input.value || input.placeholder;\r\n toggleClass(el, `${p.baseClassName}__has_input`, !!inputValue);\r\n toggleClass(el, `${p.baseClassName}__empty_input`, !inputValue);\r\n\r\n let hasResize = false;\r\n\r\n if (p.multi && p.multiItemEls.length === 0 && p.showSelection) {\r\n // Full width of list wrapper\r\n input.style.width = ''; // reset first\r\n\r\n let beforeWidth = 0, afterWidth = 0;\r\n\r\n let beforeStyle = getComputedStyle(p.list || el, '::before');\r\n if (beforeStyle.content &&\r\n beforeStyle.content !== 'none' &&\r\n beforeStyle.position !== 'absolute' &&\r\n beforeStyle.float !== 'none') {\r\n beforeWidth = getPseudoElementWidth(p.list || el, '::before', true, true, true);\r\n }\r\n\r\n let afterStyle = getComputedStyle(p.list || el, '::after');\r\n if (afterStyle.content &&\r\n afterStyle.content !== 'none' &&\r\n afterStyle.position !== 'absolute' &&\r\n afterStyle.float !== 'none') {\r\n afterWidth = getPseudoElementWidth(p.list || el, '::after', true, true, true);\r\n }\r\n\r\n let contentWidth = getElementWidth(p.list || el); // calculate width\r\n contentWidth -= beforeWidth + afterWidth;\r\n\r\n input.style.width = `${contentWidth}px`;\r\n\r\n hasResize = true; // We may want to track the resize here better to avoid unnecessary event\r\n } else {\r\n // Introduce backbuffer to DOM\r\n setCssProps(backBufferEl, getCssProps(input, inputBackbufferCssProps));\r\n backBufferEl.textContent = inputValue;\r\n el.appendChild(backBufferEl);\r\n\r\n // Measure these\r\n const computedStyle = getComputedStyle(input);\r\n const paddingTotal = (parseFloat(computedStyle.paddingLeft) || 0) + (parseFloat(computedStyle.paddingRight) || 0);\r\n const minWidth = (parseFloat(computedStyle['font-size']) || 0) * 0.75 + paddingTotal;\r\n const backBufferWidth = getElementWidth(backBufferEl, true, true);\r\n const currentWidth = getElementWidth(input, true, true);\r\n let newWidth = Math.max(backBufferWidth, minWidth);\r\n\r\n // Compare\r\n if (newWidth !== currentWidth) {\r\n // Update if needed\r\n setElementWidth(input, newWidth, true, true);\r\n\r\n let bordersWidth = (parseFloat(computedStyle.borderLeftWidth) || 0) + (parseFloat(computedStyle.borderRightWidth) || 0);\r\n let scrollWidth = input.scrollWidth + bordersWidth;\r\n\r\n if (scrollWidth > newWidth) {\r\n // consider scrollWidth delta\r\n let delta = scrollWidth - newWidth;\r\n input.style.width = `${parseFloat(input.style.width) + delta}px`;\r\n\r\n newWidth += delta;\r\n }\r\n\r\n // sync the single value wrapper.\r\n // it is meant as a preview or spacer for single selection value, so its appropriate to sync it with this width\r\n if (p.singleWrapper) {\r\n p.singleWrapper.style.width = '';\r\n\r\n if (inputValue) {\r\n let width = newWidth - paddingTotal - bordersWidth;\r\n if (getElementWidth(p.singleWrapper, false, false) < width) {\r\n setElementWidth(p.singleWrapper, width, false, false);\r\n }\r\n }\r\n }\r\n\r\n hasResize = true;\r\n }\r\n\r\n // Remove backbuffer from DOM\r\n remove(backBufferEl);\r\n }\r\n\r\n if (hasResize)\r\n this._trigger('input:resize');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Update autocomplete position if needed\r\n * @returns {SelectBox}\r\n * @private\r\n */\r\n _repositionDropList() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!p.dropList || !p.dropListVisible || !p.dropList.isVisible())\r\n return this;\r\n\r\n const box = el.getBoundingClientRect();\r\n const serialized = box.left + ',' + box.top + ',' + box.right + ',' + box.bottom;\r\n\r\n if (p.dropList._lastSerializedBox !== serialized) {\r\n p.dropList.relayout(this._getDropListPositionOptions());\r\n p.dropList._lastSerializedBox = serialized;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} event\r\n * @private\r\n */\r\n _handleInputKeydown(event) {\r\n const p = this._p;\r\n\r\n const target = (/**@type HTMLInputElement*/event.target);\r\n\r\n if (event.key === VALUE_BACK_SPACE && event.ctrlKey && target.value.length === 0) {\r\n this.clear();\r\n\r\n event.preventDefault();\r\n } else if (event.key === VALUE_BACK_SPACE && target.value.length === 0) {\r\n const itemEl = p.multiItemEls[p.multiItemEls.length - 1];\r\n if (!itemEl || itemEl[ItemSymbol].value === undefined)\r\n return;\r\n\r\n const item = itemEl[ItemSymbol], value = item[p.valueProp];\r\n\r\n let removeselEvt = { value: value, item: item, cancel: false };\r\n this._trigger('removesel:before', removeselEvt);\r\n if (removeselEvt.cancel)\r\n return;\r\n\r\n this._removeMultiItem(item, true);\r\n\r\n // trigger event\r\n this._trigger('removesel', { value: value, item: item });\r\n\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} event\r\n * @private\r\n */\r\n _handleMultiKeydown(event) {\r\n const p = this._p;\r\n\r\n if (p.disabled) return;\r\n\r\n const isRtl = getComputedStyle(p.el).direction === 'rtl';\r\n\r\n let nextFocus;\r\n\r\n if (event.key === (isRtl ? VALUE_LEFT : VALUE_RIGHT)) { // Next arrow\r\n nextFocus = next(/**@type Element*/event.target, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n if (hasClass(nextFocus, `${p.baseClassName}__search_wrapper`)) {\r\n nextFocus = nextFocus.querySelector('input');\r\n }\r\n nextFocus && nextFocus.focus();\r\n\r\n event.preventDefault();\r\n } else if (event.key === (isRtl ? VALUE_RIGHT : VALUE_LEFT)) { // Prev arrow\r\n nextFocus = prev(/**@type Element*/event.target, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n if (hasClass(nextFocus, `${p.baseClassName}__search_wrapper`)) {\r\n nextFocus = nextFocus.querySelector('input');\r\n }\r\n nextFocus && nextFocus.focus();\r\n\r\n event.preventDefault();\r\n } else if (event.key === VALUE_BACK_SPACE && event.ctrlKey) { // Ctrl + Backspace\r\n const multiItemEls = [];\r\n let itemEl = event.target;\r\n while (itemEl) {\r\n multiItemEls.push(itemEl);\r\n itemEl = prev(/**@type Element*/itemEl, `.${p.baseClassName}__item`);\r\n }\r\n\r\n while (multiItemEls.length) {\r\n this._removeMultiItemFromEvent(multiItemEls.shift(), event);\r\n }\r\n\r\n event.preventDefault();\r\n } else if (event.key === VALUE_DELETE || event.key === VALUE_BACK_SPACE) { // Delete / Backspace\r\n this._removeMultiItemFromEvent(closestUntil(event.target, `.${p.baseClassName}__item`, p.el), event);\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @returns {DropList.PositionOptions}\r\n * @private\r\n */\r\n _getDropListPositionOptions() {\r\n const p = this._p;\r\n\r\n return {\r\n target: /**@type Element*/p.el,\r\n offset: { x: 0, y: 0 },\r\n anchor: { x: 'start', y: 'bottom' },\r\n position: { x: 'start', y: 'top' },\r\n updateWidth: true,\r\n };\r\n }\r\n\r\n /** @private */\r\n _startTrackingPresence() {\r\n const p = this._p;\r\n\r\n this._stopTrackingPresence();\r\n\r\n p.presenceInt = setInterval(function () {\r\n if (getRootNode(p.el) !== document)\r\n this.hide();\r\n }, 200);\r\n }\r\n\r\n /** @private */\r\n _stopTrackingPresence() {\r\n const p = this._p;\r\n\r\n if (p.presenceInt) {\r\n clearInterval(p.presenceInt);\r\n p.presenceInt = null;\r\n }\r\n }\r\n\r\n /**\r\n * Handles sorting, and putting checked items first (according to selectedValues, not item.checked)\r\n * @private\r\n * @param {DropList.ItemBase[]} items\r\n * @param {boolean=false} sort\r\n * @param {boolean=false} sortCheckedFirst\r\n * @param {boolean=false} splitCheckedGroups\r\n * @returns {DropList.ItemBase[]}\r\n */\r\n _sortItems(items, sort, sortCheckedFirst, splitCheckedGroups) {\r\n const p = this._p;\r\n\r\n if (!sort && !sortCheckedFirst)\r\n return items; // Nothing to do\r\n\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp,\r\n valueProp = p.valueProp,\r\n stickyValues = p.stickyValues,\r\n comparator = p.sortItemComparator || ((a, b) => {\r\n if (stickyValues !== null) {\r\n let sa = stickyValues.has(a[valueProp]);\r\n let sb = stickyValues.has(b[valueProp]);\r\n if (sa && !sb) return -1;\r\n if (!sa && sb) return 1;\r\n }\r\n\r\n const aLabel = a[labelProp] || a[multiItemLabelProp];\r\n const bLabel = b[labelProp] || b[multiItemLabelProp];\r\n\r\n if (aLabel < bLabel) return -1;\r\n if (aLabel > bLabel) return 1;\r\n\r\n return 0;\r\n });\r\n\r\n let group = [], stickyGroup = null;\r\n let groups = [group];\r\n const selectedValuesSet = new Set(p.selectedValues);\r\n let item, i, len;\r\n\r\n // Split to groups\r\n for (i = 0, len = items.length; i < len; i++) {\r\n item = items[i];\r\n if (item._group && group.length) {\r\n group = [];\r\n groups.push(group);\r\n }\r\n group.push(item);\r\n }\r\n\r\n // Leftover\r\n if (!group.length) {\r\n groups.length = 0;\r\n }\r\n\r\n // Non-grouped sticky should be first\r\n if (stickyValues && items.length > 0 && !items[0]._group) {\r\n stickyGroup = groups[0].filter(x => stickyValues.has(x[valueProp]));\r\n if (stickyGroup.length > 0) {\r\n groups[0] = groups[0].filter(x => !stickyValues.has(x[valueProp]));\r\n }\r\n }\r\n\r\n if (sort) {\r\n // Sort the groups\r\n groups.sort((a, b) => {\r\n a = a[0];\r\n b = b[0];\r\n\r\n if (stickyValues !== null) {\r\n let sa = stickyValues.has(a[valueProp]);\r\n let sb = stickyValues.has(b[valueProp]);\r\n if (sa && !sb) return -1;\r\n if (!sa && sb) return 1;\r\n }\r\n\r\n // A \"group\" without a group item will come first\r\n if (!a._group && b._group) return -1;\r\n if (a._group && !b._group) return 1;\r\n\r\n return comparator(a, b);\r\n });\r\n }\r\n\r\n if (stickyGroup && stickyGroup.length > 0) {\r\n groups.unshift(stickyGroup);\r\n }\r\n\r\n // Now we have an array of groups, possibly sorted.\r\n // Each group is an array that begins with the group item (group name/id).\r\n // A group could possible start with a normal item, if it's a \"default group\", which had no group item.\r\n\r\n const checkedGroups = [], uncheckedGroups = [];\r\n\r\n // Iterate groups\r\n for (let g = 0, glen = groups.length; g < glen; g++) {\r\n group = groups[g];\r\n\r\n // Sort each group\r\n group.sort((a, b) => {\r\n\r\n // Grouping items come first\r\n if (a._group && !b._group) return -1;\r\n if (!a._group && b._group) return 1;\r\n\r\n if (sortCheckedFirst) {\r\n const aChecked = selectedValuesSet.has(a[valueProp]);\r\n const bChecked = selectedValuesSet.has(b[valueProp]);\r\n\r\n if (aChecked && !bChecked) return -1;\r\n if (!aChecked && bChecked) return 1;\r\n }\r\n\r\n if (sort) {\r\n return comparator(a, b);\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n uncheckedGroups.push(group);\r\n }\r\n\r\n if (sortCheckedFirst && splitCheckedGroups) {\r\n\r\n let virtualGroup;\r\n\r\n // Iterate groups\r\n for (let g = 0, glen = groups.length; g < glen; g++) {\r\n group = groups[g];\r\n\r\n if (group === stickyGroup) {\r\n checkedGroups.push(stickyGroup);\r\n let sgi = uncheckedGroups.indexOf(stickyGroup);\r\n if (sgi !== -1) {\r\n uncheckedGroups.splice(sgi, 1);\r\n }\r\n continue;\r\n }\r\n\r\n virtualGroup = null;\r\n\r\n for (let gi = 0, gilen = group.length; gi < gilen; gi++) {\r\n item = group[gi];\r\n if (item._group) continue;\r\n if (!selectedValuesSet.has(item[p.valueProp])) break;\r\n\r\n if (!virtualGroup) {\r\n virtualGroup = [];\r\n if (group[0]._group) {\r\n virtualGroup.push(group[0]);\r\n }\r\n }\r\n\r\n virtualGroup.push(item);\r\n group.splice(gi--, 1);\r\n gilen--;\r\n }\r\n\r\n if (virtualGroup) {\r\n checkedGroups.push(virtualGroup);\r\n if (group.length === 0 || (group.length === 1 && group[0]._group)) {\r\n groups.splice(g--, 1);\r\n glen--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Prepare the target array\r\n const joined = [];\r\n joined.length = items.length;\r\n let itemIndex = 0;\r\n\r\n groups = checkedGroups.length ?\r\n checkedGroups.concat(uncheckedGroups) : // Concat both lists\r\n uncheckedGroups; // No need for concat\r\n\r\n for (let g = 0, glen = groups.length; g < glen; g++) {\r\n group = groups[g];\r\n\r\n for (i = 0, len = group.length; i < len; i++) {\r\n joined[itemIndex++] = group[i];\r\n }\r\n }\r\n\r\n return joined;\r\n }\r\n}\r\n\r\nexport default SelectBox;\r\n"],"names":["value","replace","ItemSymbol","Symbol","DestroyedSymbol","GhostSymbol","hasOwnProperty","Object","prototype","defaultOptions","baseClassName","itemBlurDelay","capturesFocus","multi","keyDownHandler","autoCheckGroupChildren","useExactTargetWidth","constrainToWindow","autoFlipDirection","estimateWidth","virtualMinItems","labelProp","valueProp","on","DropList","[object Object]","options","o","key","entries","undefined","p","this","_p","ownsEl","elOriginalDisplay","additionalClasses","renderItem","unrenderItem","silenceEvents","mitt","focusItemIndex","focusItemEl","sink","DomEventsSink","classes","concat","initialCss","top","el","Element","style","display","classList","add","role","setCssProps","createElement","class","join","css","items","groupCount","mouseHandled","virtualListHelper","VirtualListHelper","list","virtual","buffer","estimatedItemHeight","itemElementCreatorFn","tabIndex","onItemRender","itemEl","index","item","label","lastMeasureLongestLabelText","setAttribute","console","warn","className","_nocheck","_checked","_group","_child","_nointeraction","_renderItemContent","fn","setOnItemUnrender","err","error","_hookMouseEvents","_hookTouchEvents","_hookFocusEvents","_hookKeyEvents","clearTimeout","blurTimer","filterTimer","remove","destroy","name","Array","from","startsWith","removeAttribute","lastPositionTarget","_syncBaseClasses","prop","hasFocusedItem","_trigger","event","_move","toggleClass","checked","isGroup","isCheckingGroup","_updateGroupStateForItem","closestUntil","target","getItemIndexFromElement","_setSingleSelectedItemEl","atIndex","addItems","itemsToAdd","isMulti","length","_determineVirtualMode","i","count","oitem","splice","push","addItemsAt","render","newItem","itemIndex","itemIndexByValue","itemAtIndex","call","isItemRendered","refreshItemAt","itemIndexByValueOrLabel","removeItemsAt","setCount","map","x","positionOptions","isVisible","w","window","targetBox","offset","targetOffset","getElementOffset","left","height","targetHeight","getElementHeight","width","targetWidth","getElementWidth","bottom","viewport","pageYOffset","pageXOffset","innerWidth","innerHeight","right","defaultVerticalDirection","position","y","isVirtual","_measureItem","updateWidth","_updateWidth","maxViewHeight","roomAbove","roomBelow","elComputedStyle","getComputedStyle","isBoxing","boxSizing","verticalPadding","parseFloat","paddingTop","paddingBottom","verticalBorderWidth","borderTopWidth","borderBottomWidth","estimateFullHeight","Math","max","scrollHeight","maxHeight","isNaN","min","enoughRoomAbove","enoughRoomBelow","newDirection","currentDirection","viewSize","isTargetRtl","targetRtl","direction","isRtlDocument","document","documentElement","anchor","anchoredPosition","invertYPos","specY","scrollLeft","body","parentNode","abs","scrollWidth","clientWidth","minX","maxX","viewCss","rtl","specX","which","setElementHeight","li","getItemElementAt","values","groupIndexes","indexOf","_updateGroupCheckedState","excludeGroups","hiding","setTimeout","onDocumentMouseDown","contains","_delayBlur","appendChild","visible","originalMaxHeight","clientHeight","marginTop","marginBottom","relayout","parseTransition","transition","reduce","v","delay","duration","blurFocusedItem","scrollItemIndexIntoView","itemElement","_getItemIndex","setFocusedItemAtIndex","setSingleSelectedItemAtIndex","_hasScroll","scrollTop","itemPos","previousPos","getItemPosition","itemSize","getItemSize","listHeight","handler","wrapped","off","all","clear","emit","singleSelectedItemEl","data","_mouseHandled","triggerItemSelection","toggleFocusedItem","activeElement","currentTarget","preventDefault","button","_itemUpAction","_handleMouseOver","_focus","currentTouchId","changedTouches","identifier","didScroll","onScroll","onTouchCancel","elToTrackScroll","find","touch","firstChild","evt","_keydown","VALUE_PAGE_UP","VALUE_PAGE_DOWN","VALUE_HOME","VALUE_END","VALUE_UP","VALUE_DOWN","previousPage","nextPage","previous","next","VALUE_ENTER","VALUE_SPACE","VALUE_ESCAPE","hide","type","_keydownFreeType","character","String","fromCharCode","keyCode","keyword","previousFilter","regex","RegExp","escapeRegex","matchIndices","test","matchIndex","nextIndex","directionUp","isFirstItem","isLastItem","visibleItemCount","getVisibleItemCount","base","nextElementSibling","tagName","itemCount","startedAtIndex","groupIndex","affectedItems","len","nextEl","fireEvents","groupItem","hasChecked","hasUnchecked","shouldCheckGroup","lastMeasureItemCount","longestLabel","lastMeasureLongestLabel","longestLabelText","text","createGhostItemElement","lastMeasureItemWidth","targetItemCount","shouldBeVirtual","setVirtual","textContent","insertBefore","autoWidth","newOuterWidth","setElementWidth","bordersWidth","borderLeftWidth","borderRightWidth","delta","throttle","func","wait","timeout","context","args","result","later","leading","Date","now","apply","throttled","remaining","arguments","trailing","cancel","isScheduled","NoResultsItemSymbol","RestMultiItemsSymbol","hasTouchCapability","DocumentTouch","navigator","maxTouchPoints","hasClass","inputBackbufferCssProps","disabled","clearable","hasOpenIndicator","placeholder","sortSelectedItems","sortListItems","sortListCheckedFirst","stickyValues","sortItemComparator","splitListCheckedGroups","blurOnSingleSelection","showSelection","multiPlaceholderFormatter","searchable","noResultsText","filterThrottleWindow","filterOnEmptyTerm","multiItemLabelProp","maxMultiItems","multiItemsRestLabelProvider","selectedValues","isLoadingMode","SelectBox","listOptions","isArray","Set","renderSingleItem","unrenderSingleItem","renderMultiItem","unrenderMultiItem","renderRestMultiItem","unrenderRestMultiItem","renderNoResultsItem","unrenderNoResultsItem","filterFn","filteredItems","currentItemsView","itemsChanged","resizeObserver","selectedItems","selectionChanged","resortBySelectionNeeded","throttledUpdateListItems","_updateListItems","filterTerm","setElementAttrs","aria-haspopup","aria-expanded","_renderBase","multiItemEls","enable","_setupDropdownMenu","clearButtonWrapper","input","focus","selectionStart","selectionEnd","relatedTarget","field","querySelector","_handleInputKeydown","_resizeInput","focusInOutHandler","t","ResizeObserver","observe","setItems","setSelectedValues","setValue","_scheduleSync","syncTimeout","_stopTrackingPresence","dropList","_cleanupSingleWrapper","_removeMultiItemElementByIndex","singleWrapper","inputBackBuffer","openIndicator","disconnect","enabled","toString","resetValues","slice","getSelectedValues","term","mutated","getFilteredItemCount","existingItem","assign","updateItemByValue","performSearch","trim","sortCheckedFirst","comparator","formatter","unrender","setLabelProp","setValueProp","blur","clearEvt","_setInputText","set","has","_setSelectedItems","show","_getDropListPositionOptions","_repositionDropList","getFocusedItemIndex","open","openList","closeList","dropListVisible","setIsLoadingMode","getIsLoadingMode","isListOpen","zIndex","whiteSpace","inputWrapper","autocomplete","autocorrect","autocapitalize","spellcheck","aria-autocomplete","readOnly","_unregisterDropdownEvents","lastActiveElement","_removeMultiItemFromEvent","_handleMultiKeydown","_registerDropdownEvents","spinner","customRenderItem","customUnrenderItem","_startTrackingPresence","parent","offsetHeight","offsetWidth","selEvt","setItemChecked","idx","hasGroupSync","filter","selectEvt","avoidToggleFromClick","suppressKeyPress","suppressKeyPressRepeat","keyEventsTarget","_movePrev","_moveNext","lastKeyAllowsSpaceToggle","VALUE_TAB","toggleList","stopPropagation","isDisabled","tevt","isMultiEnabled","getSelectedItems","setSelectedItems","_refilterItems","_lastSerializedBox","_sortItems","removeAllItems","hasRefocusedItem","setCheckedValues","singleItemIndex","getValue","matcher","lastGroup","mode","syncQueue","queue","_performSync","op","_syncFull","_syncSingleItem","_syncPlaceholder","findIndex","_addMultiItemElement","_addMultiItemRestElement","childNodes","innerHTML","pop","createTextNode","_renderMultiItem","before","clearButton","append","title","defaultMultiPlaceholderFormatter","_renderSingleItemContent","fullItemsRender","_syncClearButton","a","b","sa","sb","aLabel","bLabel","sort","actualItemCount","addRestItem","getRootNode","tabindex","_renderMultiItemContent","originatingEvent","nextFocus","kEvent","VALUE_DELETE","VALUE_BACK_SPACE","prev","itemsToRemove","removeselEvt","_removeMultiItem","populate","backBufferEl","inputValue","hasResize","beforeWidth","afterWidth","beforeStyle","content","float","getPseudoElementWidth","afterStyle","contentWidth","getCssProps","computedStyle","paddingTotal","paddingLeft","paddingRight","minWidth","backBufferWidth","currentWidth","newWidth","box","getBoundingClientRect","serialized","ctrlKey","isRtl","VALUE_LEFT","VALUE_RIGHT","shift","presenceInt","setInterval","clearInterval","splitCheckedGroups","group","stickyGroup","groups","selectedValuesSet","unshift","checkedGroups","uncheckedGroups","g","glen","aChecked","bChecked","virtualGroup","gi","gilen","sgi","joined"],"mappings":";;;;u3BAAA,MAAeA,GAASA,EAAMC,QAAQ,2BAA4B,QC+BlE,MAAMC,EAAaC,OAAO,QACpBC,EAAkBD,OAAO,aACzBE,EAAcF,OAAO,SAErBG,EAAiBC,OAAOC,UAAUF,eAgExC,IAAIG,EAAiB,CACjBC,cAAe,WAEfC,cAAe,IACfC,eAAe,EACfC,OAAO,EACPC,eAAgB,KAChBC,wBAAwB,EACxBC,qBAAqB,EAErBC,mBAAmB,EACnBC,mBAAmB,EAEnBC,eAAe,EACfC,gBAAiB,IAEjBC,UAAW,QACXC,UAAW,QAEXC,GAAI,MAoBR,MAAMC,EAKFC,YAAYC,GACR,MAAMC,EAAI,IAAKlB,GAEf,IAAK,IAAKmB,EAAK5B,KAAUO,OAAOsB,QAAyBH,QACvCI,IAAV9B,IACA2B,EAAEC,GAAO5B,GAEjB,MAAM+B,EAAIC,KAAKC,GAAK,CAChBC,QAAQ,EACRC,kBAAmB,GAEnBzB,cAAeiB,EAAEjB,cACjB0B,kBAAmBT,EAAES,kBACrBzB,cAAegB,EAAEhB,cACjBC,cAAee,EAAEf,cACjBC,MAAOc,EAAEd,MACTC,eAAgBa,EAAEb,eAClBC,uBAAwBY,EAAEZ,uBAC1BC,oBAAqBW,EAAEX,oBACvBC,kBAAmBU,EAAEV,kBACrBC,kBAAmBS,EAAET,kBACrBC,cAAeQ,EAAER,cACjBC,gBAAiBO,EAAEP,gBACnBC,UAAWM,EAAEN,UACbC,UAAWK,EAAEL,UACbe,WAAYV,EAAEU,WACdC,aAAcX,EAAEW,aAChBf,GAAII,EAAEJ,IAAM,KACZgB,eAAe,EACfC,KAAMA,IAENC,gBAAiB,EACjBC,YAAa,KAEbC,KAAM,IAAIC,GAGd,IAAIC,EAAU,CAACd,EAAErB,eAEbqB,EAAEK,oBACFS,EAAUA,EAAQC,OAAOf,EAAEK,oBAG/B,MAAMW,EAAa,CAEfC,IAAK,WAGT,IAAIC,EAAKtB,EAAEsB,GAiGX,GAhGIA,aAAcC,SACdnB,EAAEI,kBAAoBc,EAAGE,MAAMC,SAAW,GAC1CH,EAAGI,UAAUC,OAAOT,GACpBI,EAAGM,KAAO,OACVC,EAA4CP,EAAIF,GAChDhB,EAAEG,QAAS,GAEXe,EAAKQ,EAAc,KAAM,CACrBC,MAAOb,EAAQc,KAAK,KACpBJ,KAAM,OACNK,IAAKb,IAIbhB,EAAEkB,GAAKA,EAEPlB,EAAE8B,MAAQ,GAEV9B,EAAE+B,WAAa,EAEf/B,EAAEgC,cAAe,EAEjBhC,EAAEiC,kBAAoB,IAAIC,EAAkB,CACxCC,KAAMnC,EAAEkB,GACRkB,SAAS,EACTC,OAAQ,EACRC,oBAAqB1C,EAAE0C,qBAAuB,GAC9CC,qBAAsB,IACXb,EAAc,KACjB,CACIF,KAAM,WACNgB,SAAUxC,EAAEnB,eAAiB,EAAI,OAI7C4D,aAAc,CAACC,EAAQC,KACnB,IAAIC,EAEA,IAA0BtE,GAC1BsE,EAAO,CACHC,MAAO7C,EAAE8C,4BACT7E,MAAO,UAEPyB,CAACvB,GAAa,CACVuB,CAACM,EAAEV,WAAYU,EAAE8C,4BACjBpD,CAACM,EAAET,WAAY,YAGvBmD,EAAOK,aAAa,cAAe,SAEnCH,EAAO5C,EAAE8B,MAAMa,GAGdC,GAEDI,QAAQC,KAAK,4BAA8BN,EAAQ,uBAGvDD,EAAOQ,UAAY,GAAGlD,EAAErB,sBAExB,MAAM2C,EAAYoB,EAAOpB,UAErBtB,EAAElB,MACE8D,EAAKO,SACL7B,EAAUC,IAAI,GAAGvB,EAAErB,sCAEnB2C,EAAUC,IAAI,GAAGvB,EAAErB,6BAEfiE,EAAKQ,UACL9B,EAAUC,IAAI,GAAGvB,EAAErB,gCAI3B2C,EAAUC,IAAI,GAAGvB,EAAErB,8BAGnBiE,EAAKS,QACL/B,EAAUC,IAAI,GAAGvB,EAAErB,6BAEnBiE,EAAKU,QACLhC,EAAUC,IAAI,GAAGvB,EAAErB,6BAEnBiE,EAAKW,gBACLjC,EAAUC,IAAI,GAAGvB,EAAErB,qCAEnBqB,EAAEU,iBAAmBiC,IACrB3C,EAAEW,YAAc+B,EAChBpB,EAAUC,IAAI,GAAGvB,EAAErB,8BAGvBsB,KAAKuD,mBAAmBZ,EAAMF,GAE9BA,EAAOvE,GAAcyE,KAIC,mBAAnB5C,EAAEO,aAA6B,CACtC,MAAMkD,EAAKzD,EAAEO,aACbP,EAAEiC,kBAAkByB,mBAAkBxC,IAClC,IACIuC,EAAGvC,EAAG/C,GAAYA,GAAa+C,GACjC,MAAOyC,GAAOX,QAAQY,MAAMD,UACvBzC,EAAG/C,GAEN6B,EAAEW,cAAgBO,IAClBlB,EAAEW,YAAc,cAGxBX,EAAEiC,kBAAkByB,mBAAkBxC,WAC3BA,EAAG/C,GAEN6B,EAAEW,cAAgBO,IAClBlB,EAAEW,YAAc,SAIxBX,EAAEnB,gBACFqC,EAAGsB,SAAW,GAGlBvC,KAAK4D,mBACL5D,KAAK6D,mBACL7D,KAAK8D,mBACL9D,KAAK+D,iBAEL/D,KAAKO,eAAgB,EAGzBd,UACI,GAAIO,KAAK5B,GACL,OACJ4B,KAAK5B,IAAmB,EAExB,MAAM2B,EAAIC,KAAKC,GAYf,GAVA+D,aAAajE,EAAEkE,WACfD,aAAajE,EAAEmE,aAEfnE,EAAEY,KAAKwD,SACPpE,EAAEiC,kBAAkBoC,UAEhBrE,EAAEkB,IACFkD,EAAOpE,EAAEkB,KAGRlB,EAAEG,OAAQ,CACX,IAAK,IAAImE,KAAQC,MAAMC,KAAKxE,EAAEkB,GAAGI,WACzBgD,EAAKG,WAAWzE,EAAErB,gBAClBqB,EAAEkB,GAAGI,UAAU8C,OAAOE,GAG9BtE,EAAEkB,GAAGwD,gBAAgB,QACrB,IAAK,IAAI7E,IAAO,CAAC,WAAY,OAAQ,MAAO,QAAS,SAAU,WAC3DG,EAAEkB,GAAGE,MAAMvB,GAAO,GAEtBG,EAAEkB,GAAGE,MAAMC,QAAUrB,EAAEI,kBAGvBJ,EAAE2E,qBACF3E,EAAE2E,mBAAmBrD,UAAU8C,OAC3B,OAAOpE,EAAErB,gBACT,OAAOqB,EAAErB,sBACT,OAAOqB,EAAErB,8BACNqB,EAAE2E,oBAGb1E,KAAKC,GAAK,KAGdgB,SACI,OAAOjB,KAAKC,GAAGgB,GAOnBxB,qBAAqBoB,GAIjB,OAHUb,KAAKC,GACbG,kBAAoBS,EACtBb,KAAK2E,mBACE3E,KAOXP,aAAamF,GAGT,OAFU5E,KAAKC,GACbZ,UAAYuF,EACP5E,KAOXP,aAAamF,GAGT,OAFU5E,KAAKC,GACbX,UAAYsF,EACP5E,KAGXP,mBACI,MAAMM,EAAIC,KAAKC,GAAIgB,EAAKlB,EAAEkB,GAE1B,IAAKA,EACD,OAEJ,IAAIJ,EAAU,CAACd,EAAErB,eAEbqB,EAAEK,oBACFS,EAAUA,EAAQC,OAAOf,EAAEK,oBAG/Ba,EAAGgC,UAAYpC,EAAQc,KAAK,KAGhClC,kBACI,MAAMM,EAAIC,KAAKC,GAIf,GAFA+D,aAAajE,EAAEkE,YAEVjE,KAAK6E,iBACN,OAGJ,IAAInE,EAAcX,EAAEW,YAChBA,IACAA,EAAYW,UAAU8C,OAAO,GAAGpE,EAAErB,6BAClCqB,EAAEW,YAAc,MAGpB,MAAMiC,EAAO5C,EAAE8B,MAAM9B,EAAEU,gBACvBV,EAAEU,gBAAkB,EAEfkC,GAGL3C,KAAK8E,SAAS,WAAY,CAAE9G,MAAO2E,EAAK3E,MAAO2E,KAAMA,EAAKzE,IAAeyE,IAG7ElD,SAASsF,GACL/E,KAAKgF,MAAM,YAAaD,GAG5BtF,aAAasF,GACT/E,KAAKgF,MAAM,YAAaD,GAG5BtF,oBACI,MAAMM,EAAIC,KAAKC,GAEf,GAAID,KAAK6E,kBAAoB9E,EAAElB,MAAO,CAClC,IAAI8D,EAAO5C,EAAE8B,MAAM9B,EAAEU,gBACrB,GAAIkC,EAAKO,UAAYP,EAAKW,eAAgB,OAAOtD,KAEjD2C,EAAKQ,UAAYR,EAAKQ,SAClBpD,EAAEW,aACFuE,EAAYlF,EAAEW,YAAa,GAAGX,EAAErB,8BAA+BiE,EAAKQ,UAExEnD,KAAK8E,SAAS,QAAS,CACnB9G,MAAO2E,EAAK3E,MACZ2E,KAAMA,EAAKzE,IAAeyE,EAC1BuC,QAASvC,EAAKQ,SACdgC,QAASxC,EAAKS,OACdgC,iBAAiB,IAGrBpF,KAAKqF,yBAAyB1C,GAGlC,OAAO3C,KAGXP,qBAAqBsF,GACjB,MAAMhF,EAAIC,KAAKC,GAEfF,EAAEW,YAAcX,EAAEW,aAAe4E,EAAaP,EAAMQ,OAAQ,KAAMxF,EAAEkB,IACpElB,EAAEU,eAAiBV,EAAEiC,kBAAkBwD,wBAAwBzF,EAAEW,kBACxCZ,IAArBC,EAAEU,iBACFV,EAAEU,gBAAkB,GAExB,IAAIkC,EAAO5C,EAAEW,YAAYxC,GACzB,OAAIyE,EAAKW,iBAIJvD,EAAElB,OACHmB,KAAKyF,yBAAyB1F,EAAEW,aAGpCV,KAAK8E,SAAS,SAAU,CAAE9G,MAAO2E,EAAOA,EAAK3E,WAAQ8B,EAAW6C,KAAMA,EAAKzE,IAAeyE,KAEnF,GASXlD,QAAQkD,EAAM+C,GAAU,GACpB,OAAO1F,KAAK2F,SAAS,CAAChD,GAAO+C,GASjCjG,SAASmG,EAAYF,GAAU,GAC3B,MAAM3F,EAAIC,KAAKC,GAAIZ,EAAYU,EAAEV,UAAWC,EAAYS,EAAET,UAE1D,IAAIuG,EAAU9F,EAAElB,MACZgD,EAAQ9B,EAAE8B,OAEC,MAAX6D,GAAmBA,EAAU,GAAKA,GAAW3F,EAAE8B,MAAMiE,UACrDJ,GAAW,GAIf1F,KAAK+F,sBAAsBlE,EAAMiE,OAASF,EAAWE,QAErD,IAAK,IAAIE,EAAI,EAAGC,EAAQL,EAAWE,OAAQE,EAAIC,EAAOD,IAAK,CACvD,IAAIE,EAAQN,EAAWI,GAEnBrD,EAAO,CACPlD,CAACvB,GAAagI,EACdtD,MAAOsD,EAAM7G,GACbrB,MAAOkI,EAAM5G,GACb4D,WAAYgD,EAAMhD,SAClBI,iBAAkB4C,EAAM5C,gBAGxBuC,IACAlD,EAAKQ,WAAa+C,EAAM/C,UAGxB+C,EAAM9C,SACNT,EAAKS,QAAS,EACdrD,EAAE+B,cAGFoE,EAAM7C,SAINV,EAAKU,QAAS,IAID,IAAbqC,EACA7D,EAAMsE,OAAOT,EAAS,EAAG/C,GAEzBd,EAAMuE,KAAKzD,IAGE,IAAb+C,GACAA,IAQR,OAJA3F,EAAEiC,kBACGqE,WAAWT,EAAWE,QAAqB,IAAbJ,EAAiBA,EAAWA,EAAUE,EAAWE,QAC/EQ,SAEEtG,KAGXP,kBAAkBzB,EAAOuI,GACrB,MAAMxG,EAAIC,KAAKC,GAGf,IAAIuG,EAAYxG,KAAKyG,iBAAiBzI,GACtC,GAAIwI,GAAa,EAAG,OAAOxG,KAE3B,IAAI2C,EAAO3C,KAAK0G,YAAYF,GAuC5B,OAtCA7D,EAAKzE,GAAcqI,EAEfjI,EAAeqI,KAAKJ,EAASxG,EAAEV,aAC/BsD,EAAKC,MAAQ2D,EAAQxG,EAAEV,YAEvBf,EAAeqI,KAAKJ,EAASxG,EAAET,aAC/BqD,EAAK3E,MAAQuI,EAAQxG,EAAET,YAEvBhB,EAAeqI,KAAKJ,EAAS,cAC7B5D,EAAKO,WAAaqD,EAAQrD,UAE1B5E,EAAeqI,KAAKJ,EAAS,oBAC7B5D,EAAKW,iBAAmBiD,EAAQjD,gBAEhCvD,EAAElB,OACEP,EAAeqI,KAAKJ,EAAS,cAC7B5D,EAAKQ,WAAaoD,EAAQpD,UAG9B7E,EAAeqI,KAAKJ,EAAS,aACvBA,EAAQnD,SAAWT,EAAKS,SACtBT,EAAKS,OACLrD,EAAE+B,aACD/B,EAAE+B,aAEPyE,EAAQnD,SAAWT,EAAKS,QAI5B9E,EAAeqI,KAAKJ,EAAS,YAC7B5D,EAAKU,SAAWkD,EAAQlD,QAExBtD,EAAEiC,kBAAkB4E,eAAeJ,IACnCzG,EAAEiC,kBACG6E,cAAcL,GACdF,SAGFtG,KAGXP,WAAWzB,EAAO4E,GACd,MAAM7C,EAAIC,KAAKC,GAGf,IAAIuG,EAAYxG,KAAK8G,wBAAwB9I,EAAO4E,GACpD,OAAI4D,GAAa,IAEHzG,EAAE8B,MAAMsE,OAAOK,EAAW,GAC5B,GAAGpD,QACXrD,EAAE+B,aAGN/B,EAAEiC,kBACG+E,cAAcP,EAAW,GACzBF,UATsBtG,KAc/BP,iBACI,MAAMM,EAAIC,KAAKC,GASf,OAPAF,EAAE8B,MAAMiE,OAAS,EACjB/F,EAAE+B,WAAa,EAEf/B,EAAEiC,kBACGgF,SAAS,GACTV,SAEEtG,KAGXP,gBAAgBzB,GACZ,MAAM+B,EAAIC,KAAKC,GAEf,IAAK,IAAI+F,EAAI,EAAGC,EAAQlG,EAAE8B,MAAMiE,OAAQE,EAAIC,EAAOD,IAAK,CACpD,IAAIrD,EAAO5C,EAAE8B,MAAMmE,GACnB,GAAIrD,EAAK3E,QAAUA,EACf,OAAO2E,EAAKzE,GAIpB,OAAO,KAGXuB,iBAAiBzB,GACb,MAAM+B,EAAIC,KAAKC,GAEf,IAAK,IAAI+F,EAAI,EAAGC,EAAQlG,EAAE8B,MAAMiE,OAAQE,EAAIC,EAAOD,IAE/C,GADWjG,EAAE8B,MAAMmE,GACVhI,QAAUA,EACf,OAAOgI,EAIf,OAAQ,EAGZvG,wBAAwBzB,EAAO4E,GAC3B,MAAM7C,EAAIC,KAAKC,GAEf,IAAK,IAAI+F,EAAI,EAAGC,EAAQlG,EAAE8B,MAAMiE,OAAQE,EAAIC,EAAOD,IAAK,CACpD,IAAIrD,EAAO5C,EAAE8B,MAAMmE,GACnB,GAAIrD,EAAK3E,QAAUA,GAAS2E,EAAKC,QAAUA,EACvC,OAAOoD,EAIf,OAAQ,EAGZvG,QACI,OAAOO,KAAKC,GAAG4B,MAAMoF,KAAIC,GAAKA,EAAEhJ,KAGpCuB,iBACI,OAAOO,KAAKC,GAAG4B,MAGnBpC,YACI,OAAOO,KAAKC,GAAG4B,MAAMiE,OAGzBrG,YAAYiD,GACR,OAAO1C,KAAKC,GAAG4B,MAAMa,KAASxE,GASlCuB,SAAS0H,GACL,MAAMpH,EAAIC,KAAKC,GAAIgB,EAAKlB,EAAEkB,GAE1B,IAAKjB,KAAKoH,YAAa,OAAOpH,KAE9B,IAAIqH,EAAIC,OAEJC,EAAY,GAEZC,EAASL,EAAgBM,cAAgBC,EAAiBP,EAAgB5B,QAC9EgC,EAAUI,KAAOH,EAAOG,KACxBJ,EAAUvG,IAAMwG,EAAOxG,IACvBuG,EAAUK,OAAyC,MAAhCT,EAAgBU,aAC7BC,EAAiBX,EAAgB5B,QAAQ,GAAM,GAC/C4B,EAAgBU,aACtBN,EAAUQ,MAAuC,MAA/BZ,EAAgBa,YAC5BC,EAAgBd,EAAgB5B,QAAQ,GAAM,GAC9C4B,EAAgBa,YACtBT,EAAUW,OAASX,EAAUvG,IAAMuG,EAAUK,OAE7C,IAAIO,EAAW,GACfA,EAASnH,IAAMqG,EAAEe,YACjBD,EAASR,KAAON,EAAEgB,YAClBF,EAASJ,MAAQV,EAAEiB,WACnBH,EAASP,OAASP,EAAEkB,YACpBJ,EAASD,OAASC,EAASnH,IAAMmH,EAASP,OAC1CO,EAASK,MAAQL,EAASR,KAAOQ,EAASJ,MAE1C,IAAIU,EAA4BtB,EAAgBuB,UAA2C,WAA/BvB,EAAgBuB,SAASC,EAC/E,QACA,QAGN1H,EAAGE,MAAM4G,MAAQ,IAGbhI,EAAEZ,eACFY,EAAEiC,kBAAkB4G,cACpB5I,KAAK6I,eAIL9I,EAAEiC,kBAAkB4G,aACpB7I,EAAEiC,kBAAkBsE,SAIpBa,EAAgB2B,aAChB9I,KAAK+I,aAAa5B,GAItB,IAKI6B,EALAC,EAAY1B,EAAUvG,IAAMmH,EAASnH,IACrCkI,EAAYf,EAASD,OAASX,EAAUW,OAM5C,MAAMiB,EAAkBC,iBAAiBnI,GAEzC,IAAIoI,EAAyC,eAA9BF,EAAgBG,UAC3BC,GAAmBC,WAAWL,EAAgBM,aAAe,IAC5DD,WAAWL,EAAgBO,gBAAkB,GAC9CC,GAAuBH,WAAWL,EAAgBS,iBAAmB,IACpEJ,WAAWL,EAAgBU,oBAAsB,GAElD9J,EAAEiC,kBAAkB4G,YACpBI,EACIjJ,EAAEiC,kBAAkB8H,qBACpBP,EACAI,GAIJ1I,EAAGE,MAAMyG,OAAS,GAClB3G,EAAGE,MAAMH,IAAM,UAEfgI,EAAgBe,KAAKC,IAAIlC,EAAiB/H,EAAEkB,IAAKA,EAAGgJ,cACpDjB,GAAiBO,EAAkBI,GAKvC,IAAIO,EAAYV,WAAWL,EAAgBe,WACtCC,MAAMD,KACFb,IACDa,GAAaX,EAAkBI,GAGnCX,EAAgBe,KAAKK,IAAIpB,EAAekB,IAK5C,IAAIG,EAAkBpB,GAAaD,EAC/BsB,EAAkBpB,GAAaF,EAE/BuB,EAAexK,EAAEyK,kBAAoB/B,EACpB,UAAjB8B,IAA6BF,GAAmBC,EAChDC,EAAe,QACS,UAAjBA,IAA6BD,GAAmBD,EACvDE,EAAe,QACRF,GAAmBC,EACtBC,IAAiB9B,IACc,UAA7BA,GAAwCQ,GAAaC,GACrB,UAA7BT,GAAwCS,GAAaD,KAC1DsB,EAAe9B,GAEX4B,GAAoBC,IACxBrB,EAAYC,EACZqB,EAAe,QACRrB,EAAYD,IACnBsB,EAAe,UAGvBxK,EAAEyK,iBAAmBD,EAGrB,IAAIE,EAAW,CACX1C,MAAOE,EAAgBhH,GAAI,GAAM,GACjC2G,OAAQmC,KAAKK,IAAIpB,EAAee,KAAKC,IAAIf,EAAWC,EAAW,KAG/DwB,OAA4C5K,IAA9BqH,EAAgBwD,UAC9BxD,EAAgBwD,UACW,MAA1BxD,EAAgB5B,QAAgF,QAAvD6D,iBAAiBjC,EAAgB5B,QAAQqF,UACnFC,EAAyE,QAAzDzB,iBAAiB0B,SAASC,iBAAiBH,UAE3DI,EAASC,EAAiB9D,EAAgB5B,OAC1C4B,EAAgB6D,OAAS7D,EAAgB6D,OAAO9D,EAAI,QACpDC,EAAgB6D,OAAS7D,EAAgB6D,OAAOrC,EAAI,SACpDpB,EAAWmD,GACXhC,EAAWuC,EAAiBhK,EAC5BkG,EAAgBuB,SAAWvB,EAAgBuB,SAASxB,EAAI,QACxDC,EAAgBuB,SAAWvB,EAAgBuB,SAASC,EAAI,MACxD8B,EAAUC,GAGVQ,EACoB,QAAnBxC,EAASyC,OAAoC,UAAjBZ,GACT,WAAnB7B,EAASyC,OAAuC,UAAjBZ,GACZ,WAAnB7B,EAASyC,OAAyC,QAAnBzC,EAASyC,OAAoC,UAAjBZ,EAE5Da,OACmBtL,IAAlBuH,EAAEgB,YACChB,EAAEgB,aACDyC,SAASC,iBAAmBD,SAASO,KAAKC,YAAcR,SAASO,MAAMD,WAChFA,EAAarB,KAAKwB,IAAIH,GAClBP,IACAO,EAAaN,SAASC,gBAAgBS,YAAcJ,EAAaN,SAASC,gBAAgBU,aAG9F,IAAIC,EAAON,EACPO,EAAOb,SAASC,gBAAgBU,YAAcL,EAAaX,EAAS1C,MAEpE6D,EAAU,CACVlD,SAAY,WACZf,KAAQJ,EAAUI,KAClB3G,IAAOuG,EAAUvG,KAAOkK,EAAcF,EAAO9C,OAASQ,EAASR,OAAW8C,EAAOhK,IAAM0H,EAAS1H,MASpG,GANI6J,IACAe,EAAQjE,MAAQmD,SAASC,gBAAgBU,YAAcX,SAASC,gBAAgBS,aAGpFI,EAAQjE,MAAQqD,EAAOrD,KAAOe,EAASf,KAEnCR,EAAgBK,SACZL,EAAgBK,OAAOmB,IACnBuC,EACAU,EAAQ5K,KAAOmG,EAAgBK,OAAOmB,EAEtCiD,EAAQ5K,KAAOmG,EAAgBK,OAAOmB,GAI1CxB,EAAgBK,OAAON,GAAG,CAC1B,IAAI2E,EAAoC,QAA9B1C,EAAgByB,UAC1BgB,EAAQjE,MAAQkE,GACT1E,EAAgBK,OAAON,EACxBC,EAAgBK,OAAON,EAiBrC,GAbInH,EAAEb,oBACsB,UAAnBwJ,EAASoD,OACVF,EAAQjE,KAAO+D,IACd3B,KAAKC,IAAI4B,EAAQjE,KAAM+D,GAAQjB,EAAS1C,MAAQR,EAAUI,MAAQJ,EAAUQ,MAAQ,IACjE,SAAnBW,EAASoD,OACNF,EAAQjE,KAAOgE,IACd5B,KAAKK,IAAIwB,EAAQjE,KAAMgE,GAAQpE,EAAUI,MAAQJ,EAAUQ,MAAQ,MACxE6D,EAAQjE,MAAQqD,EAAOrD,KAAOe,EAASf,KACvCiE,EAAQjE,MAAQqD,EAAOxC,MAAQE,EAASF,OAK5CzI,EAAEd,kBACF,IAAK,IAAI8M,KAAUlB,EAAgB,CAAC,MAAO,OAAS,CAAC,MAAO,OAC1C,QAAVkB,GAAmBH,EAAQjE,KAAO+D,EAClCE,EAAQjE,KAAO+D,EACA,QAAVK,GAAmBH,EAAQjE,KAAOgE,IACvCC,EAAQjE,KAAOgE,GAyB3B,OApBAC,EAAQjE,MAAQ,KAChBiE,EAAQ5K,KAAO,KACfQ,EAAYP,EAAI2K,GAChBI,EAAiB/K,EAAIwJ,EAAS7C,QAAQ,GAAM,GAG5C7H,EAAEiC,kBAAkBsE,SAGhBa,GAAmBA,EAAgB5B,SACnCxF,EAAE2E,mBAAqByC,EAAgB5B,OAEvCN,EAAYkC,EAAgB5B,OAAQ,OAAOxF,EAAErB,iBAAiB,GAC9DuG,EAAYkC,EAAgB5B,OAAQ,OAAOxF,EAAErB,sBAAwC,UAAjB6L,GACpEtF,EAAYkC,EAAgB5B,OAAQ,OAAOxF,EAAErB,sBAAwC,UAAjB6L,GAEpEtF,EAAYhE,EAAI,GAAGlB,EAAErB,0BAA4C,UAAjB6L,GAChDtF,EAAYhE,EAAI,GAAGlB,EAAErB,0BAA4C,UAAjB6L,IAG7CvK,KAUXP,eAAezB,EAAOkH,GAClB,MAAMnF,EAAIC,KAAKC,GAEfiF,IAAYA,EAEZ,IAAIxC,EAAQ1C,KAAKyG,iBAAiBzI,GAClC,IAAe,IAAX0E,EAAc,OAAO1C,KAEzB,IAAIiM,EAAKlM,EAAEiC,kBAAkBkK,iBAAiBxJ,GAC9C,IAAKuJ,EAAI,OAAOjM,KAEhB,IAAI2C,EAAOsJ,EAAG/N,GAYd,OAVAgH,EAAUA,IAAYvC,EAAKO,SAEvBP,EAAKQ,WAAa+B,IAClBvC,EAAKQ,SAAW+B,EAEhBD,EAAYgH,EAAI,GAAGlM,EAAErB,8BAA+BiE,EAAKQ,UAEzDnD,KAAKqF,yBAAyB1C,IAG3B3C,KASXP,iBAAiB0M,GACb,MAAMpM,EAAIC,KAAKC,GAEf,IAAImM,EAAe,GAEnB,IAAK,IAAIpG,EAAI,EAAGC,EAAQlG,EAAE8B,MAAMiE,OAAQE,EAAIC,EAAOD,IAAK,CACpD,IAAIrD,EAAO5C,EAAE8B,MAAMmE,GACfd,GAAWvC,EAAKO,WAA4C,IAAhCiJ,EAAOE,QAAQ1J,EAAK3E,OAMpD,GAJI2E,EAAKS,QACLgJ,EAAahG,KAAKJ,GAGlBrD,EAAKQ,WAAa+B,EAAS,SAE/BvC,EAAKQ,SAAW+B,EAEhB,IAAI+G,EAAKlM,EAAEiC,kBAAkBkK,iBAAiBlG,GACzCiG,GAELhH,EAAYgH,EAAI,GAAGlM,EAAErB,8BAA+BiE,EAAKQ,UAG7D,GAAIpD,EAAEhB,uBACF,IAAK,IAAIiH,EAAI,EAAGC,EAAQmG,EAAatG,OAAQE,EAAIC,EAAOD,IACpDhG,KAAKsM,yBAAyBF,EAAapG,IAAI,GAIvD,OAAOhG,KASXP,iBAAiB8M,GACb,MAAMxM,EAAIC,KAAKC,GAEfsM,EAAgBA,GAAiBxM,EAAE+B,WAAa,EAEhD,IAAIqK,EAAS,GAEb,IAAK,IAAInG,EAAI,EAAGC,EAAQlG,EAAE8B,MAAMiE,OAAQE,EAAIC,EAAOD,IAAK,CACpD,IAAIrD,EAAO5C,EAAE8B,MAAMmE,GACdrD,EAAKQ,WACNoJ,GAAiB5J,EAAKS,QAC1B+I,EAAO/F,KAAKzD,EAAK3E,QAGrB,OAAOmO,EASX1M,gBAAgB8M,GACZ,MAAMxM,EAAIC,KAAKC,GAEfsM,EAAgBA,GAAiBxM,EAAE+B,WAAa,EAEhD,IAAID,EAAQ,GAEZ,IAAK,IAAImE,EAAI,EAAGC,EAAQlG,EAAE8B,MAAMiE,OAAQE,EAAIC,EAAOD,IAAK,CACpD,IAAIrD,EAAO5C,EAAE8B,MAAMmE,GACdrD,EAAKQ,WACNoJ,GAAiB5J,EAAKS,QAC1BvB,EAAMuE,KAAKzD,EAAKzE,KAGpB,OAAO2D,EASXpC,KAAK0H,GACD,MAAMpH,EAAIC,KAAKC,GAEfF,EAAEyM,QAAS,EAENxM,KAAKoH,aACNpH,KAAK8E,SAAS,eAGlB/E,EAAEgC,cAAe,EAEjB0K,YAAW,KACHzM,KAAK5B,IAEJ2B,EAAE2M,qBAEH3M,EAAEY,KAAKW,IAAIwJ,SAAU,YAAa/K,EAAE2M,oBAAuB3H,IAClDhF,EAAEkB,GAAG0L,SAAS5H,EAAMQ,SACrBvF,KAAK4M,kBAKrB,MAAM3L,EAAKlB,EAAEkB,GAWb,GAVAA,EAAGE,MAAMuH,SAAW,WACpBzH,EAAGI,UAAU8C,OAAO,GAAGpE,EAAErB,4BACzBoM,SAASO,KAAKwB,YAAY5L,GAE1BlB,EAAE+M,SAAU,EAEZ/M,EAAEkB,GAAGE,MAAMC,QAAU,GACkB,SAAnCgI,iBAAiBrJ,EAAEkB,IAAIG,UACvBrB,EAAEkB,GAAGE,MAAMC,QAAU,SAErB+F,EAAiB,CACjB,MAAMgC,EAAkBC,iBAAiBnI,GAGnC8L,EAAoB9L,EAAGE,MAAM+I,UACnC,IAAIA,EAAYY,SAASO,KAAK2B,cACzBxD,WAAWL,EAAgB8D,YAAc,IACzCzD,WAAWL,EAAgB+D,eAAiB,IACd,eAA9B/D,EAAgBG,UACX,GACEE,WAAWL,EAAgBS,iBAAmB,IAC7CJ,WAAWL,EAAgBU,oBAAsB,IAE9D5I,EAAGE,MAAM+I,UAAYH,KAAKK,IAAIF,EAAWV,WAAWL,EAAgBe,YAAcA,GAAa,KAE/FlK,KAAKmN,SAAShG,GAGdlG,EAAGE,MAAM+I,UAAY6C,OAGjBhN,EAAEiC,kBAAkB4G,aACpB7I,EAAEiC,kBAAkBsE,SAQ5B,OAJItG,KAAKoH,aACLpH,KAAK8E,SAAS,QAGX9E,KAGXP,OACI,MAAMM,EAAIC,KAAKC,GAAIgB,EAAKlB,EAAEkB,GAO1B,GALIlB,EAAE2M,sBACF3M,EAAEY,KAAKwD,OAAO2G,SAAU,YAAa/K,EAAE2M,qBACvC3M,EAAE2M,oBAAsB,MAGxB1M,KAAKoH,YAAa,CAmClB,GAlCApH,KAAK8E,SAAS,eAEd/E,EAAEyM,QAAS,EAEPvL,IAEAA,EAAGI,UAAUC,IAAI,GAAGvB,EAAErB,4BAGQ0O,EAAgBhE,iBAAiBrJ,EAAEkB,IAAIoM,YAChEC,QAAO,CAACvN,EAAGwN,IAAMxD,KAAKC,IAAIjK,EAAGwN,EAAEC,MAAQD,EAAEE,WAAW,GAE7B,EACxBhB,YAAW,KACHzM,KAAK5B,IAEL4B,KAAKC,IAAMgB,EAAGqK,YAAcvL,EAAEyM,SAC9BrI,EAAOlD,GACPA,EAAGI,UAAU8C,OAAO,GAAGpE,EAAErB,4BACzBqB,EAAE+M,SAAU,EACZ9M,KAAK8E,SAAS,mBAItBX,EAAOlD,GACPA,EAAGI,UAAU8C,OAAO,GAAGpE,EAAErB,8BAIjCqB,EAAE+M,SAAU,EAEZ9M,KAAK0N,kBACL1N,KAAK8E,SAAS,QAEV9E,KAAK5B,GAAkB,OAC3B4B,KAAK8E,SAAS,cAWlB,OARI/E,EAAE2E,qBACF3E,EAAE2E,mBAAmBrD,UAAU8C,OAC3B,OAAOpE,EAAErB,gBACT,OAAOqB,EAAErB,sBACT,OAAOqB,EAAErB,8BACNqB,EAAE2E,oBAGN1E,KAGXP,YACI,MAAMM,EAAIC,KAAKC,GACf,QAAKF,EAAE+M,SAEA/M,EAAEkB,GAAGqK,YAAiD,SAAnClC,iBAAiBrJ,EAAEkB,IAAIG,QAGrD3B,iBACI,OAAOO,KAAKC,GAAGQ,gBAAkB,EAGrChB,sBACI,OAAKO,KAAK6E,iBAEH7E,KAAKC,GAAGQ,gBADH,EAIhBhB,sBAAsB+G,GAClB,MAAMzG,EAAIC,KAAKC,GAEfF,EAAEU,eAAiB+F,EAEnB,IAAI7D,EAAO,KACP6D,GAAa,IACb7D,EAAO5C,EAAE8B,MAAM2E,IACf7D,GAAQA,EAAKW,iBACbX,EAAO,MACP6D,GAAa,GACbxG,KAAK2N,wBAAwBnH,GAEjC,IAAIoH,EAAcjL,EAAO5C,EAAEiC,kBAAkBkK,iBAAiB1F,GAAa,KAgB3E,OAdIzG,EAAEW,cAAgBkN,IACd7N,EAAEW,cACFX,EAAEW,YAAYW,UAAU8C,OAAO,GAAGpE,EAAErB,6BACpCqB,EAAEW,YAAc,MAGhBkN,IACAA,EAAYvM,UAAUC,IAAI,GAAGvB,EAAErB,6BAC/BqB,EAAEW,YAAckN,EAEhB5N,KAAK8E,SAAS,YAAa,CAAE9G,MAAO4P,EAAY5P,MAAO2E,KAAMiL,EAAY1P,GAAa6G,MAAO,SAI9F/E,KAGXP,eAAekD,GACX,MAAM5C,EAAIC,KAAKC,GAEf,IAAIuG,EAAY7D,EAAKW,gBAAkB,EAAItD,KAAK6N,cAAclL,GAK9D,OAHI6D,GAAa,GAAKzG,EAAE8B,MAAM2E,GAAWlD,iBACrCkD,GAAa,GAEVxG,KAAK8N,sBAAsBtH,GAGtC/G,sBAAsBzB,GAClB,OAAOgC,KAAK8N,sBAAsB9N,KAAKyG,iBAAiBzI,IAG5DyB,6BAA6B+G,GACzB,MAAMzG,EAAIC,KAAKC,GAEf,IAAIwC,EAAS,KAQb,OANI+D,GAAa,IAAMzG,EAAE8B,MAAM2E,GAAWlD,iBACtCb,EAAS1C,EAAEiC,kBAAkBkK,iBAAiB1F,IAGlDxG,KAAKyF,yBAAyBhD,GAEvBzC,KAGXP,sBAAsBkD,GAClB,MAAM5C,EAAIC,KAAKC,GAEf,IAAIuG,EAAY7D,EAAKW,gBAAkB,EAAItD,KAAK6N,cAAclL,GAK9D,OAHI6D,GAAa,GAAKzG,EAAE8B,MAAM2E,GAAWlD,iBACrCkD,GAAa,GAEVxG,KAAK+N,6BAA6BvH,GAG7C/G,6BAA6BzB,GACzB,OAAOgC,KAAK+N,6BAA6B/N,KAAKyG,iBAAiBzI,IAGnEyB,KAAKsF,GACD/E,KAAKgF,MAAM,OAAQD,GAGvBtF,SAASsF,GACL/E,KAAKgF,MAAM,OAAQD,GAGvBtF,cACI,MAAMM,EAAIC,KAAKC,GACf,OAA4B,IAArBF,EAAEU,gBAAwBV,EAAEU,eAAiBV,EAAE8B,MAAMiE,OAGhErG,aACI,MAAMM,EAAIC,KAAKC,GACf,OAAOF,EAAEU,gBAAkB,GAAKV,EAAEU,iBAAmBV,EAAE8B,MAAMiE,OAAS,EAG1ErG,wBAAwB+G,GACpB,MAAMzG,EAAIC,KAAKC,GAEf,GAAID,KAAKgO,aAAc,CACnB,MAAM/M,EAAKlB,EAAEkB,GAAIgN,EAAYhN,EAAGgN,UAEhC,IAAIC,EAASC,GAAe,EAG5B,KACID,EAAUnO,EAAEiC,kBAAkBoM,gBAAgB5H,GAE1C0H,IAAYC,GAHP,CAMTA,EAAcD,EAEd,IAAIG,EAAWtO,EAAEiC,kBAAkBsM,YAAY9H,GAE3C+H,EAAatN,EAAG+L,aAEhBkB,EAAUD,EACVhN,EAAGgN,UAAYC,EACRA,EAAUG,EAAWJ,EAAYM,IACxCtN,EAAGgN,UAAYC,EAAUG,EAAWE,GAIxCxO,EAAEiC,kBAAkBsE,UAI5B,OAAOtG,KASXP,GAAkBsF,EAAqByJ,GAEnC,OADAxO,KAAKC,GAAGO,KAAKjB,GAAGwF,EAAOyJ,GAChBxO,KASXP,KAAoBsF,EAAqByJ,GACrC,IAAIC,EAAWzQ,IACXgC,KAAKC,GAAGO,KAAKkO,IAAI3J,EAAO0J,GACxBD,EAAQxQ,IAGZ,OADAgC,KAAKC,GAAGO,KAAKjB,GAAGwF,EAAO0J,GAChBzO,KASXP,IAAsBsF,EAAqByJ,GAMvC,OALKzJ,GAAUA,EAGX/E,KAAKC,GAAGO,KAAKkO,IAAI3J,EAAOyJ,GAFxBxO,KAAKC,GAAGO,KAAKmO,IAAIC,QAId5O,KASXP,KAAoBsF,EAAgB/G,GAEhC,OADAgC,KAAKC,GAAGO,KAAKqO,KAAK9J,EAAO/G,GAClBgC,KAGXP,cAAckD,GACV,MAAM5C,EAAIC,KAAKC,GAEf,IAAIuG,GAAa,EAEjB,GAAI7D,IACA6D,EAAYzG,EAAE8B,MAAMwK,QAAQ1J,IACT,IAAf6D,GAAkB,CAClB,IAAIxI,EAAS2E,QAAuB7C,IAAf6C,EAAK3E,MAAuB2E,EAAK3E,MAAQ2E,EAC1DC,EAASD,GAAQA,EAAKC,MAASD,EAAKC,MAAQ5E,EAChDwI,EAAYxG,KAAK8G,wBAAwB9I,EAAO4E,GAIxD,OAAO4D,EAGX/G,yBAAyBgD,GACrB,MAAM1C,EAAIC,KAAKC,GAYf,OAVIF,EAAE+O,uBACF/O,EAAE+O,qBAAqBzN,UAAU8C,OAAO,GAAGpE,EAAErB,+BAC7CqB,EAAE+O,qBAAuB,MAGzBrM,IACAA,EAAOpB,UAAUC,IAAI,GAAGvB,EAAErB,+BAC1BqB,EAAE+O,qBAAuBrM,GAGtBzC,KAQXP,SAASsF,EAAOgK,GACZ,MAAMhP,EAAIC,KAAKC,GACXF,EAAER,IACFQ,EAAER,GAAGwF,UAAoBjF,IAATiP,EAAqB,GAAK,CAACA,IAC/ChP,EAAES,KAAKqO,KAAK9J,EAAOgK,GAGvBtP,cAAcsF,EAAOtC,GACjB,GAAI6C,EAAaP,EAAMQ,OAAQ,kCAAmC9C,GAAS,OAE3E,IAAI1C,EAAIC,KAAKC,GAEb,IAAKD,KAAKgP,cAAe,CAKrB,GAHAhP,KAAKiP,qBAAqBlK,GAGtB/E,KAAK5B,GACL,OAEJ4B,KAAKkP,oBAEDpE,SAASqE,gBAAkBnP,KAAKiB,IAAMlB,EAAEW,aACxCsD,aAAajE,EAAEkE,WAGnBwI,YAAW,KACPzM,KAAKgP,eAAgB,IACtB,IAIXvP,mBACI,MAAMM,EAAIC,KAAKC,GAEfF,EAAEY,KACGW,IAAIvB,EAAEkB,GAAI,aAAc8D,IACVO,EAAaP,EAAMQ,OAAQ,KAAMR,EAAMqK,gBAGlDrK,EAAMsK,oBAET/N,IAAIvB,EAAEkB,GAAI,WAAY8D,IACnB,MAAMkH,EAAK3G,EAAaP,EAAMQ,OAAQ,KAAMR,EAAMqK,eAC7CnD,GAEgB,IAAjBlH,EAAMuK,QAEVtP,KAAKuP,cAAcxK,EAAOkH,MAE7B3K,IAAIvB,EAAEkB,GAAI,aAAc8D,IACrB,MAAMkH,EAAK3G,EAAaP,EAAMQ,OAAQ,KAAMR,EAAMqK,eAC7CnD,GAELjM,KAAKwP,iBAAiBzK,EAAOkH,MAIzCxM,iBAAiBsF,EAAOtC,GACpBzC,KAAKyP,OAAO1K,EAAOtC,GAGvBhD,mBACI,MAAMM,EAAIC,KAAKC,GAEf,IAAIyP,EAEJ3P,EAAEY,KAAKW,IAAIvB,EAAEkB,GAAI,cAAe8D,IAC5B,MAAMkH,EAAK3G,EAAaP,EAAMQ,OAAQ,KAAMR,EAAMqK,eAClD,IAAKnD,EAAI,OAET,GAAIyD,EAAgB,OACpB,GAAIpK,EAAaP,EAAMQ,OAAQ,kCAAmC0G,GAAK,OAEvEyD,EAAiB3K,EAAM4K,eAAe,GAAGC,WAGzC5P,KAAKwP,iBAAiBzK,EAAOkH,GAG7B,IAAI4D,GAAY,EACZC,EAAW,KAAQD,GAAY,GAC/BE,EAAgB,KAChBL,EAAiB,KACjB3P,EAAEY,KAAKwD,OAAO,KAAM,yBAGpB6L,EAAkB/D,EAAGX,WACzB,KAAO0E,GACHjQ,EAAEY,KAAKW,IAAI0O,EAAiB,6BAA8BF,GAC1DE,EAAkBA,EAAgB1E,WAEtCvL,EAAEY,KAAKW,IAAIgG,OAAQ,6BAA8BwI,GAEjD/P,EAAEY,KAAKW,IAAIgG,OAAQ,kCAAmCyI,GAEtDhQ,EAAEY,KAAKW,IAAIvB,EAAEkB,GAAI,gCAAiC8D,IAC9C,MAAMkH,EAAK3G,EAAaP,EAAMQ,OAAQ,KAAMR,EAAMqK,eAClD,OAAKnD,GAEO3H,MAAM9F,UAAUyR,KAAKtJ,KAAK5B,EAAM4K,gBAAiBO,GAClDA,EAAMN,aAAeF,KAIhCK,SAEKF,IACD7P,KAAKuP,cAAcxK,EAAOkH,GAC1BlH,EAAMsK,oBAXMU,UAiB5BtQ,mBACI,MAAMM,EAAIC,KAAKC,GAEfF,EAAEY,KACGW,IAAIvB,EAAEkB,GAAI,SAAS8D,IAChB,IAAItC,EAAS1C,EAAEW,aACXX,EAAEkB,GAAGkP,WAETnQ,KAAKyP,OAAO1K,EAAOtC,MAEtBnB,IAAIvB,EAAEkB,GAAI,QAAQ,KACfwL,YAAW,KACHzM,KAAK5B,IAEJ2B,EAAEkB,GAAG0L,SAAS7B,SAASqE,gBACxBnP,KAAK4M,mBAMzBnN,iBACI,MAAMM,EAAIC,KAAKC,GAEfF,EAAEY,KAAKW,IAAIvB,EAAEkB,GAAI,WAAWmP,GAAOpQ,KAAKqQ,SAASD,KACjDrQ,EAAEY,KAAKW,IAAIvB,EAAEkB,GAAI,YAAYmP,GAAOpQ,KAAKqQ,SAASD,KAGtD3Q,SAASsF,GACL,MAAMhF,EAAIC,KAAKC,GAEf,GAAIF,EAAEjB,gBAAkBiB,EAAEjB,eAAe6H,KAAK3G,KAAM+E,GAChD,OAGJ,IAAIsK,GAAiB,EAErB,OAAQtK,EAAMnF,KACV,KAAK0Q,EACL,KAAKC,EACL,KAAKC,EACL,KAAKC,EACL,KAAKC,EACL,KAAKC,EAGD,OAFA5L,EAAMsK,iBAEEtK,EAAMnF,KACV,KAAK0Q,EACDtQ,KAAK4Q,aAAa7L,GAClB,MACJ,KAAKwL,EACDvQ,KAAK6Q,SAAS9L,GACd,MACJ,KAAKyL,EACDxQ,KAAKgF,MAAM,QAASD,GACpB,MACJ,KAAK0L,EACDzQ,KAAKgF,MAAM,OAAQD,GACnB,MACJ,KAAK2L,EACD1Q,KAAK8Q,SAAS/L,GACd,MACJ,KAAK4L,EACD3Q,KAAK+Q,KAAKhM,GAGlB,MAEJ,KAAKiM,EACDhR,KAAKiP,qBAAqBlK,GAC1BA,EAAMsK,iBACN,MAEJ,KAAK4B,EACDjR,KAAKkP,oBACLnK,EAAMsK,iBACN,MAEJ,KAAK6B,EACDnM,EAAMsK,iBACNrP,KAAKmR,OACL,MAEJ,QACI,GAAmB,YAAfpM,EAAMqM,KAAoB,OAC9BpR,KAAKqR,iBAAiBtM,GACtBsK,GAAiB,GAK7B5P,iBAAiB2Q,GACb,MAAMrQ,EAAIC,KAAKC,GAGf,IAAIqR,EAAYlB,EAAIxQ,KAAO2R,OAAOC,aAAapB,EAAIqB,SACnD,GAAyB,IAArBH,EAAUxL,OAAc,OAE5B9B,aAAajE,EAAEmE,aAGf,IAKIvB,EALA+O,GAAW3R,EAAE4R,gBAAkB,IAAML,EAErCM,EAAQ,IAAIC,OAAO,IAAIC,EAAYJ,KAAY,KAE/CK,EAAe,GAInB,IAAK,IAAI/L,EAAI,EAAGC,EAAQlG,EAAE8B,MAAMiE,OAAQE,EAAIC,EAAOD,IAC/CrD,EAAO5C,EAAE8B,MAAMmE,GACX4L,EAAMI,KAAKrP,EAAKC,QAChBmP,EAAa3L,KAAKJ,GAK1B,IAAK+L,EAAajM,OAAQ,CAEtB4L,EAAUJ,EACVM,EAAQ,IAAIC,OAAO,IAAIC,EAAYJ,KAAY,KAE/C,IAAK,IAAI1L,EAAI,EAAGC,EAAQlG,EAAE8B,MAAMiE,OAAQE,EAAIC,EAAOD,IAC/CrD,EAAO5C,EAAE8B,MAAMmE,GACX4L,EAAMI,KAAKrP,EAAKC,QAChBmP,EAAa3L,KAAKJ,GAK9B,IAAIvF,EAAiBV,EAAEU,eACnBwR,GAAc,EAGlB,IAAK,IAAIjM,EAAI,EAAGC,EAAQ8L,EAAajM,OAAQE,EAAIC,EAAOD,IACpD,GAAI+L,EAAa/L,IAAMvF,EAAgB,CACnCwR,EAAaF,EAAa/L,GAC1B,MASR,IAJoB,IAAhBiM,GAAqBF,EAAajM,SAClCmM,EAAaF,EAAa,IAG1BE,GAAc,EAAG,CACjB,IAAIlB,EAAOhR,EAAEiC,kBAAkBkK,iBAAiB+F,GAChDjS,KAAKyP,OAAOW,EAAKW,GAAQ,KAAMkB,GAE1BjS,KAAKoH,aACNpH,KAAKiP,qBAAqBmB,GAI9BrQ,EAAE4R,eAAiBD,EAGnB3R,EAAEmE,YAAcuI,YAAW,YAChB1M,EAAE4R,iBACV,iBAGI5R,EAAE4R,eAIjBlS,OAAOsF,EAAOtC,EAAQ+D,GAClB,MAAMzG,EAAIC,KAAKC,IAEVuG,GAAa/D,IACd+D,EAAYzG,EAAEiC,kBAAkBwD,wBAAwB/C,IAGxD+D,GAAa,EACbxG,KAAK2N,wBAAwBnH,QACR1G,IAAd0G,IACP/D,EAAS,MAGb,IAAI/B,EAAc+B,GAAU1C,EAAEiC,kBAAkBkK,iBAAiB1F,GACjE,IAAK9F,GAAeA,EAAYxC,GAAYoF,eAExC,YADAtD,KAAK0N,kBAIT,GAAIhN,IAAgBX,EAAEW,YAElB,YADAsD,aAAajE,EAAEkE,WAInBjE,KAAK0N,kBAELhN,EAAYW,UAAUC,IAAI,GAAGvB,EAAErB,6BAC/BqB,EAAEW,YAAcA,EAChBX,EAAEU,eAAiB+F,EAEnB,MAAM7D,EAAO5C,EAAE8B,MAAM2E,GACrBxG,KAAK8E,SAAS,YAAa,CAAE9G,MAAO2E,EAAK3E,MAAO2E,KAAMA,EAAKzE,IAAeyE,EAAMoC,MAAOA,IAG3FtF,aACI,GAAIO,KAAK5B,GACL,OAEJ,MAAM2B,EAAIC,KAAKC,GAEf+D,aAAajE,EAAEkE,WAEflE,EAAEkE,UAAYwI,YAAW,KACjBzM,KAAK5B,IACT4B,KAAK0N,oBACN3N,EAAEpB,eAGTc,MAAMmL,EAAW7F,GACb,MAAMhF,EAAIC,KAAKC,GAEf,IAAI8Q,EAAMmB,EAAWC,GAAc,EAEnC,GAAkB,UAAdvH,EACAsH,EAAY,EACZC,GAAc,OACX,GAAkB,SAAdvH,EACPsH,EAAYnS,EAAE8B,MAAMiE,OAAS,EAC7BqM,GAAc,OACX,GAAkB,SAAdvH,EAAsB,CAC7B,IAAK5K,KAAK6E,iBACN,OAAO7E,KAAKgF,MAAM,OAAQD,GAE9BmN,EAAYnS,EAAEU,eAAiB,GACZ,IAAfyR,IACAA,EAAYnS,EAAE8B,MAAMiE,OAAS,GAGjCqM,GAAc,OACX,GAAkB,SAAdvH,EAAsB,CAC7B,IAAK5K,KAAK6E,iBACN,OAAO7E,KAAKgF,MAAM,QAASD,GAE/BmN,EAAYnS,EAAEU,eAAiB,EAC3ByR,IAAcnS,EAAE8B,MAAMiE,SACtBoM,EAAY,GAGhBC,GAAc,MACX,CAAA,GAAkB,cAAdvH,GAA2C,cAAdA,EA2DpC,OAzDA,IAAK5K,KAAK6E,iBACN,OAAO7E,KAAKgF,MAAoB,cAAd4F,EAA4B,OAAS,OAAQ7F,GAGnE,GAAmB,cAAd6F,GAA6B5K,KAAKoS,eACpB,cAAdxH,GAA6B5K,KAAKqS,aAAe,OAEtD,IAAIrS,KAAKgO,aA6CL,OAAOhO,KAAKgF,MAAoB,cAAd4F,EAA4B,QAAU,OAAQ7F,GA3ChE,GAAIhF,EAAEiC,kBAAkB4G,YAAa,CACjC,IAAI0J,EAAmBvS,EAAEiC,kBAAkBuQ,sBAE3CL,EAAYnS,EAAEU,eAEI,cAAdmK,EACAsH,GAAaI,EAEbJ,GAAaI,EAGbJ,EAAY,EACZA,EAAY,EACLA,GAAanS,EAAE8B,MAAMiE,SAC5BoM,EAAYnS,EAAE8B,MAAMiE,aAErB,GAAI/F,EAAEW,YAAa,CACtB,IAAI8R,EAAO9K,EAAiB3H,EAAEW,aAAaM,IACvC4G,EAASE,EAAiB/H,EAAEkB,IAAI,GAEpC,OAAa,CAET,GADA8P,EAAOhR,EAAEW,YAAY+R,oBAChB1B,EAAM,OACX,GAAqB,OAAjBA,EAAK2B,QAET,GAAkB,cAAd9H,GACA,GAAIlD,EAAiBqJ,GAAM/P,IAAMwR,EAAO5K,GAAU,EAC9C,WAEJ,GAAIF,EAAiBqJ,GAAM/P,IAAMwR,EAAO5K,GAAU,EAC9C,MAIRmJ,IACAmB,EAAYnS,EAAEiC,kBAAkBwD,wBAAwBuL,QAEtCjR,IAAdoS,IACAA,GAAa,IAQ7BC,EAA4B,cAAdvH,EAKlB,IAAI+H,EAAY5S,EAAE8B,MAAMiE,OAExB,GAAIoM,GAAaS,EACb,OAGJ,IAAIhQ,EAAO5C,EAAE8B,MAAMqQ,GAEfU,EAAiBV,EAErB,KAAOvP,GAAQA,EAAKW,iBACZ6O,GACAD,KACmB,IAAfA,IACAA,EAAYS,KAGhBT,IACIA,IAAcS,IACdT,EAAY,IAIpBvP,EAAO5C,EAAE8B,MAAMqQ,GAEXA,IAAcU,KAKtB7B,EAAOhR,EAAEiC,kBAAkBkK,iBAAiBgG,GAC5ClS,KAAKyP,OAAO1K,EAAOgM,GAAQ,KAAMmB,GAE5BlS,KAAKoH,aACNpH,KAAKiP,qBAAqBlK,GAIlCtF,aACI,OAAOO,KAAKiB,GAAG+L,aAAehN,KAAKiB,GAAGgJ,aAG1CxK,yBAAyBkD,GACrB,MAAM5C,EAAIC,KAAKC,GAEf,GAAIF,EAAElB,OAASkB,EAAEhB,uBAAwB,CAErC,IAAI8C,EAAOgR,EAAYrM,EAEvB,GAAI7D,EAAKS,OAAQ,CAGbvB,EAAQ9B,EAAE8B,MACVgR,EAAahR,EAAMwK,QAAQ1J,GAE3B,IAAImQ,EAAgB,EAEpB,IAAK,IAAI9M,EAAI6M,EAAa,EAAGE,EAAMlR,EAAMiE,OAAQE,EAAI+M,EAAK/M,IAAK,CAC3D,IAAI+K,EAAOlP,EAAMmE,GAGjB,GAAI+K,EAAK3N,SAAY2N,EAAK1N,QAAUxB,EAAMmE,EAAI,GAAG3C,OAC7C,MAGJ,KAAM0N,EAAK5N,WAAaR,EAAKQ,SACzB,SAGJ4N,EAAK5N,SAAWR,EAAKQ,SAErB2P,IAGA,IAAIE,EAASjT,EAAEiC,kBAAkBkK,iBAAiBlG,GAC9CgN,GACA/N,EAAY+N,EAAQ,GAAGjT,EAAErB,8BAA+BiE,EAAKQ,UAIjEnD,KAAK8E,SAAS,QAAS,CACnB9G,MAAO+S,EAAK/S,MACZ2E,KAAMoO,EAAK7S,IAAe6S,EAC1B7L,QAAS6L,EAAK5N,SACdgC,QAAS4L,EAAK3N,OACdgC,iBAAiB,IAKzBpF,KAAK8E,SAAS,aAAc,CAAE9G,MAAO2E,EAAK3E,MAAO2E,KAAMA,EAAKzE,IAAeyE,EAAMmQ,cAAeA,SAC7F,GAAI/S,EAAE+B,WAAa,EAAG,CACzBD,EAAQ9B,EAAE8B,MACV2E,EAAY3E,EAAMwK,QAAQ1J,GAC1BkQ,GAAc,EAGd,IAAK,IAAI7M,EAAIQ,EAAY,EAAGR,GAAK,EAAGA,IAChC,GAAInE,EAAMmE,GAAG5C,OAAQ,CACjByP,EAAa7M,EACb,MAIJ6M,GAAc,GACd7S,KAAKsM,yBAAyBuG,GAAY,IAKtD,OAAO7S,KAGXP,yBAAyBoT,EAAYI,GACjC,MAAMlT,EAAIC,KAAKC,GAEf,GAAIF,EAAElB,OAASkB,EAAEhB,wBAA0B8T,GAAc,EAAG,CAExD,IAAIhR,EAAQ9B,EAAE8B,MACVqR,EAAYrR,EAAMgR,GACtB,IAAKK,IAAcA,EAAU9P,OAAQ,OAAOpD,KAE5C,IAAI2C,EAAMwQ,GAAa,EAAOC,GAAe,EAE7C,IAAK,IAAIpN,EAAI6M,EAAa,EAAGE,EAAMlR,EAAMiE,OAAQE,EAAI+M,IACjDpQ,EAAOd,EAAMmE,KAGTrD,EAAKS,SAAYT,EAAKU,QAAUxB,EAAMmE,EAAI,GAAG3C,SAJK2C,IAOlDrD,EAAKQ,SACLgQ,GAAa,EACLxQ,EAAKQ,WACbiQ,GAAe,GAKvB,IAAIC,EAAmBF,IAAeC,EACtC,KAAMF,EAAU/P,WAAakQ,EAAkB,CAE3CH,EAAU/P,SAAWkQ,EAGrB,IAAIL,EAASjT,EAAEiC,kBAAkBkK,iBAAiB2G,GAC9CG,GACA/N,EAAY+N,EAAQ,GAAGjT,EAAErB,8BAA+BwU,EAAU/P,UAGlE8P,GAEAjT,KAAK8E,SAAS,QAAS,CACnB9G,MAAOkV,EAAUlV,MACjB2E,KAAMuQ,EAAUhV,IAAegV,EAC/BhO,QAASgO,EAAU/P,SACnBgC,QAAS+N,EAAU9P,OACnBgC,iBAAiB,KAMjC,OAAOpF,KAOXP,eACI,MAAMM,EAAIC,KAAKC,GAEf,GAAIF,EAAEuT,uBAAyBvT,EAAE8B,MAAMiE,OAAQ,CAC3C,IAAIyN,EAAexT,EAAEyT,yBAA2B,EAC5CC,EAAmB1T,EAAE8C,6BAA+B,GAExD,IAAK,IAAImD,EAAI,EAAGnE,EAAQ9B,EAAE8B,MAAOoE,EAAQpE,EAAMiE,OAC1CE,EAAIC,EACJD,IAAK,CAEN,MAAMrD,EAAOd,EAAMmE,GACnB,IAAI0N,EAAO/Q,EAAKC,MACJ,MAAR8Q,IACAA,EAAO/Q,EAAK3E,OACJ,MAAR0V,IACAA,EAAO,IAEX,IAAI5N,EAAS4N,EAAK5N,OACdA,EAASyN,IACTA,EAAezN,EACf2N,EAAmBC,GAI3B3T,EAAEuT,qBAAuBvT,EAAE8B,MAAMiE,OACjC/F,EAAEyT,wBAA0BD,EAC5BxT,EAAE8C,4BAA8B4Q,EASpC,OANI1T,EAAEZ,eAAiBY,EAAEiC,kBAAkB4G,cACvC7I,EAAEiC,kBAAkB2R,uBAAuBtV,GAAa,GAAMoE,IAC1D1C,EAAE6T,qBAAuB3L,EAAgBxF,GAAQ,GAAM,MAIxDzC,KASXP,sBAAsBoU,GAClB,MAAM9T,EAAIC,KAAKC,GAEf,IAAI4B,EAAQ9B,EAAE8B,WACU/B,IAApB+T,IACAA,EAAkBhS,EAAMiE,QAG5B,IAAIgO,EAAkBD,GAAmB9T,EAAEX,gBAM3C,OAJI0U,IAAoB/T,EAAEiC,kBAAkB4G,aACxC7I,EAAEiC,kBAAkB+R,WAAWD,GAAiBxN,SAG7CtG,KAGXP,mBAAmBkD,EAAMF,GACrB,MAAM1C,EAAIC,KAAKC,GAKVF,EAAEM,aAAiE,IAAnDN,EAAEM,WAAWsC,EAAKzE,IAAeyE,EAAMF,KACxDA,EAAOoK,YAAYpL,EAAc,OAAQ,CACrCC,MAAO,GAAG3B,EAAErB,4BACZsV,YAAarR,EAAKC,SAGlB7C,EAAElB,QACG8D,EAAKO,UACNT,EAAOwR,aACHxS,EAAc,OAAQ,CAAEC,MAAO,aAC/Be,EAAO0N,cAa3B1Q,aAAa0H,GACT,MAAMpH,EAAIC,KAAKC,GAAIgB,EAAKlB,EAAEkB,GAE1B,IAAI+G,EAAc,EAEdb,IAEAa,EAAcb,EAAgBa,YACX,MAAfA,IACAA,EAAcC,EAAgBd,EAAgB5B,QAAQ,GAAM,KAIpE,IAAI2O,EAAY,EACXnU,EAAEf,sBACCe,EAAEZ,eAAiBY,EAAEiC,kBAAkB4G,YACvCsL,EAAYnU,EAAE6T,sBAEd3S,EAAGE,MAAM4G,MAAQ,GACjBmM,EAAYjM,EAAgBhH,GAAI,GAAM,KAI9C,IAAIkT,EAAgBpK,KAAKC,IAAIkK,EAAWlM,GAExCoM,EAAgBnT,EAAIkT,GAAe,GAAM,GAEzC,MAAMhL,EAAkBC,iBAAiBnI,GACzC,IAAIoT,GAAgB7K,WAAWL,EAAgBmL,kBAAoB,IAAM9K,WAAWL,EAAgBoL,mBAAqB,GACrH/I,EAAcvK,EAAGuK,YAAc6I,EACnC,GAAI7I,EAAc2I,EAAe,CAE7B,IAAIK,EAAQhJ,EAAc2I,EAC1BlT,EAAGE,MAAM4G,MAAQ,GAAGyB,WAAWvI,EAAGE,MAAM4G,OAASyM,MACjDL,EAAgB3I,EAGpB,OAAO2I,GC/lEf,MAAMM,EAAW,CAACC,EAAMC,EAAMjV,KAC1B,IAAIkV,EAASC,EAASC,EAAMC,EACxBjE,EAAW,EACVpR,IAASA,EAAU,IAExB,MAAMsV,EAAQ,KACVlE,GAA+B,IAApBpR,EAAQuV,QAAoB,EAAIC,KAAKC,MAChDP,EAAU,KACVG,EAASL,EAAKU,MAAMP,EAASC,GACxBF,IAASC,EAAUC,EAAO,OAG7BO,EAAY,WACd,MAAMF,EAAMD,KAAKC,MACZrE,IAAgC,IAApBpR,EAAQuV,UACrBnE,EAAWqE,GAEf,MAAMG,EAAYX,GAAQQ,EAAMrE,GAchC,OAbA+D,EAAU7U,KACV8U,EAAOS,UACHD,GAAa,GAAKA,EAAYX,GAC1BC,IACA5Q,aAAa4Q,GACbA,EAAU,MAEd9D,EAAWqE,EACXJ,EAASL,EAAKU,MAAMP,EAASC,GACxBF,IAASC,EAAUC,EAAO,OACvBF,IAAgC,IAArBlV,EAAQ8V,WAC3BZ,EAAUnI,WAAWuI,EAAOM,IAEzBP,GAaX,OAVAM,EAAUI,OAAS,KACfzR,aAAa4Q,GACb9D,EAAW,EACX8D,EAAUC,EAAUC,EAAO,MAG/BO,EAAUK,YAAc,MACXd,EAGNS,GCNLnX,EAAaC,OAAO,QACpBC,EAAkBD,OAAO,aACzBwX,EAAsBxX,OAAO,oBAC7ByX,EAAuBzX,OAAO,oBAE9B0X,KAAwB,iBAAkBvO,QACxCA,OAAOwO,eAAiBxO,OAAOwD,oBAAoBxD,OAAOwO,eAC3DxO,OAAOyO,UAAUC,gBAQlBC,EAAW,SAAUhV,EAAIgC,GAC3B,OAAIhC,aAAcC,SACPD,EAAGI,UAAUsL,SAAS1J,IAM/BiT,EAA0B,CAC5B,cACA,YACA,cACA,YACA,iBACA,iBACA,eACA,cACA,aACA,eACA,iBA+CEzX,EAAiB,CACnBwC,GAAI,KACJvC,cAAe,YACfyX,UAAU,EACVC,WAAW,EACXC,kBAAkB,EAClBC,YAAa,GACbC,mBAAmB,EACnBC,eAAe,EACfC,sBAAsB,EACtBC,aAAc,KACdC,mBAAoB,KACpBC,wBAAwB,EACxBC,sBAAuB,QACvBhY,OAAO,EACPiY,eAAe,EACfC,0BAA2B,KAC3BC,YAAY,EACZC,cAAe,sBACfC,qBAAsB,IACtBC,mBAAmB,EACnB9X,UAAW,QACXC,UAAW,QACX8X,mBAAoB,cACpBC,cAAe,KACfC,4BAA6B,KAC7BzV,MAAO,GACP0V,oBAAgBzX,EAChB9B,WAAO8B,EACP0X,eAAe,GA6CnB,MAAMC,EAIFhY,YAAYC,GACR,MAAMC,EAAI,IAAKlB,GAEf,IAAK,IAAKmB,EAAK5B,KAAUO,OAAOsB,QAAyBH,QACvCI,IAAV9B,IACA2B,EAAEC,GAAO5B,GAEjB,MAAM+B,EAAIC,KAAKC,GAAK,CAChBC,QAAQ,EAERxB,cAAeiB,EAAEjB,cAEjBgZ,YAAa/X,EAAE+X,YAEfvB,WAAYxW,EAAEwW,SACdC,YAAazW,EAAEyW,UACfC,mBAAoB1W,EAAE0W,iBACtBC,YAAa3W,EAAE2W,YACfC,oBAAqB5W,EAAE4W,kBACvBC,gBAAiB7W,EAAE6W,cACnBC,uBAAwB9W,EAAE8W,qBAC1BC,aAAcpS,MAAMqT,QAAQhY,EAAE+W,cAAgB,IAAIkB,IAAIjY,EAAE+W,cAAgB,KACxEC,mBAAoBhX,EAAEgX,mBACtBC,yBAA0BjX,EAAEiX,uBAC5BC,sBAAuBlX,EAAEkX,sBACzBhY,MAAOc,EAAEd,MACTiY,cAAenX,EAAEmX,cACjBC,0BAA2BpX,EAAEoX,0BAC7BC,WAAYrX,EAAEqX,WACdC,cAAetX,EAAEsX,cACjBC,qBAAsBvX,EAAEuX,qBACxBC,kBAAmBxX,EAAEwX,kBAErB9X,UAAWM,EAAEN,UACbC,UAAWK,EAAEL,UACb8X,mBAAoBzX,EAAEyX,mBAEtBC,cAAe1X,EAAE0X,cACjBC,4BAA6B3X,EAAE2X,4BAE/BO,iBAAkBlY,EAAEkY,iBACpBC,mBAAoBnY,EAAEmY,mBACtBC,gBAAiBpY,EAAEoY,gBACnBC,kBAAmBrY,EAAEqY,kBACrBC,oBAAqBtY,EAAEsY,oBACvBC,sBAAuBvY,EAAEuY,sBACzBC,oBAAqBxY,EAAEwY,oBACvBC,sBAAuBzY,EAAEyY,sBACzBC,SAAU1Y,EAAE0Y,SACZ9Y,GAAII,EAAEJ,IAAM,KACZgB,eAAe,EACfC,KAAMA,IACNJ,kBAAmBT,EAAES,kBAErBoX,gBAAiB7X,EAAE6X,cAEnB3V,MAAO,GACPyW,cAAe,KACfC,iBAAkB,GAClBC,cAAc,EAEd7X,KAAM,IAAIC,EAGV6X,eAAgB,KAEhBC,cAAe,GACfnB,eAAgB,GAChBoB,kBAAkB,EAClBC,yBAAyB,EAEzBC,yBAA0BpE,GAAS,IAAMzU,KAAK8Y,oBAC1CnZ,EAAEuX,qBACF,CAAEjC,SAAS,EAAMO,UAAU,IAE/BuD,WAAY,IAGhB,IAAI9X,EAAKtB,EAAEsB,GACPA,aAAcC,QACdnB,EAAEG,QAAS,EAEXe,EAAKQ,EAAc,QAGvBuX,EAAgB/X,EAAI,CAChBM,KAAM,WACN0X,gBAAiB,OACjBC,gBAAiB,UAErBnZ,EAAEkB,GAAKA,EAEPjB,KAAK2E,mBACL3E,KAAKmZ,cAGLpZ,EAAEqZ,aAAe,GAEjBpZ,KAAKqZ,QAAQtZ,EAAEoW,UAEfnW,KAAKsZ,qBAGLvZ,EAAEY,KACGW,IAAIL,EAAI,SAAUmP,IACXrQ,EAAEwZ,oBAAsBxZ,EAAEwZ,mBAAmB5M,SAASyD,EAAI7K,SAIzDtE,EAAG0L,SAAS7B,SAASqE,iBACtBpP,EAAEyZ,MAAMC,QAER1Z,EAAEyZ,MAAME,eAAiB3Z,EAAEyZ,MAAMG,aAAe5Z,EAAEyZ,MAAMxb,MAAM8H,WAK1E/F,EAAEY,KAAKW,IAAIL,EAAI,SAASmP,IACpB,MAAM7K,EAAsB6K,EAAU,OAEtC,IAAKnP,EAAG0L,SAASyD,EAAIwJ,iBAChB3D,EAAS1Q,EAAQ,GAAGxF,EAAErB,iCACtBuX,EAAS1Q,EAAQ,GAAGxF,EAAErB,uBAAwB,CAC/C,IAAImb,EAAQ5Y,EAAG6Y,cAAc,IAAI/Z,EAAErB,+BACnCmb,GAASA,EAAMJ,YAEpB,GAEH1Z,EAAEY,KACGW,IAAIvB,EAAEyZ,MAAO,WAA8BzU,IACxC/E,KAAK+Z,oBAAoBhV,MAE5BzD,IAAIvB,EAAEyZ,MAAO,SAAS,KACnBxZ,KAAKga,kBAGb,MAAMC,EAAoB,MACtB,IAAIC,EACJ,MAAO,KACCA,GACAlW,aAAakW,GAEjBA,EAAIzN,YAAW,KACXxH,EAAYhE,EAAI,GAAGlB,EAAErB,uBAAwBuC,EAAG0L,SAAS7B,SAASqE,qBAPpD,GAqC1B,OA1BApP,EAAEY,KAAKW,IAAIL,EAAI,QAASgZ,GAAmB,GAC3Cla,EAAEY,KAAKW,IAAIL,EAAI,OAAQgZ,GAAmB,GAG1Cla,EAAEY,KAAKW,IAAIgG,OAAQ,UAAU,IAAMtH,KAAKga,iBACxCja,EAAEY,KAAKW,IAAIgG,OAAQ,qBAAqB,IAAMtH,KAAKga,sBAErBla,IAA1BwH,OAAO6S,iBACPpa,EAAE0Y,eAAiB,IAAI0B,gBAAe,KAClCna,KAAKga,kBAETja,EAAE0Y,eAAe2B,QAAQra,EAAEkB,KAG/BjB,KAAKqa,SAAS1a,EAAEkC,OAEZlC,EAAEd,OAASyF,MAAMqT,QAAQhY,EAAE4X,gBAC3BvX,KAAKsa,kBAAkB3a,EAAE4X,gBACP,MAAX5X,EAAE3B,OACTgC,KAAKua,SAAS5a,EAAE3B,OAGpBgC,KAAKwa,gBAELxa,KAAKO,eAAgB,EAEdP,KAGXP,UACI,GAAIO,KAAK5B,GACL,OACJ4B,KAAK5B,IAAmB,EAExB,MAAM2B,EAAIC,KAAKC,GAiBf,GAfIF,EAAE0a,cACFzW,aAAajE,EAAE0a,oBACR1a,EAAE0a,aAGbza,KAAK0a,wBAEL3a,EAAEY,KAAKwD,SACPpE,EAAE4a,UAAY5a,EAAE4a,SAASvW,UAErBrE,EAAE8Y,0BACF9Y,EAAE8Y,yBAAyBpD,SAE/BzV,KAAK4a,wBAED7a,EAAEiY,mBAAqBjY,EAAEmY,sBAEzB,KAAOnY,EAAEqZ,aAAatT,OAAS,GAE3B9F,KAAK6a,+BAA+B9a,EAAEqZ,aAAatT,OAAS,GAWpE,GAPA3B,EAAOpE,EAAEmC,MACTiC,EAAOpE,EAAE+a,eACT3W,EAAOpE,EAAEyZ,OACTrV,EAAOpE,EAAEgb,iBACT5W,EAAOpE,EAAEwZ,oBACTpV,EAAOpE,EAAEib,gBAEJjb,EAAEG,OAAQ,CACX,IAAK,IAAImE,KAAQC,MAAMC,KAAKxE,EAAEkB,GAAGI,WACzBgD,EAAKG,WAAWzE,EAAErB,gBAClBqB,EAAEkB,GAAGI,UAAU8C,OAAOE,GAG9BtE,EAAEkB,GAAGwD,gBAAgB,QACrB1E,EAAEkB,GAAGwD,gBAAgB,iBACrB1E,EAAEkB,GAAGwD,gBAAgB,iBAGzB1E,EAAE0Y,gBAAgBwC,aAElBjb,KAAKC,GAAK,KAGdgB,SACI,OAAOjB,KAAKC,GAAGgB,GAQnBxB,OAAOyb,GACH,MAAMnb,EAAIC,KAAKC,QAECH,IAAZob,IACAA,GAAU,GAEdnb,EAAEoW,UAAY+E,EACdnb,EAAEkB,GAAG6B,aAAa,gBAAiB/C,EAAEoW,SAASgF,YAC9Cpb,EAAEyZ,MAAMrD,WAAapW,EAAEoW,SAEvB,MAAMiD,EAAerZ,EAAEqZ,aAEvB,IAAK,IAAI3W,KAAU2W,EACXrZ,EAAEoW,SACF1T,EAAOgC,gBAAgB,YAEvBhC,EAAOK,aAAa,WAAY,KAIxC,OAAO9C,KAOXP,YACI,OAAQO,KAAKC,GAAGkW,SAQpB1W,QAAQ0W,GACJ,OAAOnW,KAAKqZ,YAAoBvZ,IAAbqW,IAAkCA,GAOzD1W,aACI,OAAOO,KAAKC,GAAGkW,SAOnB1W,qBAAqBoB,GAIjB,OAHUb,KAAKC,GACbG,kBAAoBS,EACtBb,KAAK2E,mBACE3E,KASXP,SAASoC,EAAOuZ,GAAc,GAC1B,MAAMrb,EAAIC,KAAKC,GAef,OAbK4B,IACDA,EAAQ,IAEZ9B,EAAE8B,MAAQA,EAAMwZ,MAAM,GACtBtb,EAAEuY,cAAgB,KAClBvY,EAAEyY,cAAe,EAEb4C,GACApb,KAAKsa,kBAAkBta,KAAKsb,qBAGhCtb,KAAK8E,SAAS,eAAgB,CAAEyW,KAAM,KAAMC,SAAS,EAAMvV,MAAOjG,KAAKyb,yBAEhEzb,KAGXP,uBACI,MAAMM,EAAIC,KAAKC,GAEf,OAAIF,EAAEuY,cACKvY,EAAEuY,cAAcxS,OAEvB/F,EAAE8B,MACK9B,EAAE8B,MAAMiE,OAEZ,EAGXrG,kBACI,MAAMM,EAAIC,KAAKC,GAEf,SAAUF,EAAE8Y,yBAAyBnD,gBAC/B3V,EAAEuY,gBAAkBvY,EAAEgZ,YAAehZ,EAAEoX,mBAAqBpX,EAAEsY,WAGxE5Y,kBAAkBzB,EAAOuI,GACrB,MAAMxG,EAAIC,KAAKC,GAAIX,EAAYS,EAAET,UAEjC,IAAIoc,EAAe3b,EAAE8B,MAAMoO,MAAK/I,GAAKA,EAAE5H,KAAetB,IAClD0d,GACAnd,OAAOod,OAAOD,EAAcnV,GAE5BxG,EAAE4a,UACF5a,EAAE4a,SAASiB,kBAAkB5d,EAAOuI,GAO5C9G,WAEI,OADUO,KAAKC,GACN4B,MAObpC,aAAa2W,GAGT,OAFAA,IAAcA,EAEVpW,KAAKC,GAAGmW,YAAcA,IAG1BpW,KAAKC,GAAGmW,YAAcA,EACtBpW,KAAKwa,iBAHMxa,KAUfP,eACI,OAAOO,KAAKC,GAAGmW,UAOnB3W,oBAAoByb,GAGhB,OAFAA,IAAYA,EAERlb,KAAKC,GAAGoW,mBAAqB6E,IAGjClb,KAAKC,GAAGoW,iBAAmB6E,EAC3Blb,KAAKwa,iBAHMxa,KAUfP,sBACI,OAAOO,KAAKC,GAAGoW,iBAOnB5W,eAAe6W,GAGX,OAFAtW,KAAKC,GAAGqW,YAA6B,MAAfA,EAAsB,GAAK/E,OAAO+E,GACxDtW,KAAKwa,gBACExa,KAMXP,iBACI,OAAOO,KAAKC,GAAGqW,YAQnB7W,cAAc8b,EAAMM,GAAgB,GAChC,MAAM9b,EAAIC,KAAKC,GAEf,OAAKF,EAAEyZ,OAEPzZ,EAAEyZ,MAAMxb,MAAQud,EAEhBvb,KAAKwa,cAAc,gBAEfqB,IACA9b,EAAEgZ,WAAahZ,EAAEyZ,MAAMxb,MAAM8d,OAC7B/b,EAAEuY,cAAgB,KAClBvY,EAAEyY,cAAe,EAEjBxY,KAAK8E,SAAS,SAAU,CAAE9G,MAAO+B,EAAEyZ,MAAMxb,QACzC+B,EAAE8Y,4BAGC7Y,MAfcA,KAqBzBP,gBACI,MAAMM,EAAIC,KAAKC,GACf,OAAIF,EAAEyZ,MACKzZ,EAAEyZ,MAAMxb,MACZ,GAOXyB,qBAAqB8W,GACjB,MAAMxW,EAAIC,KAAKC,GAEf,OADAsW,IAAsBA,EAClBxW,EAAEwW,oBAAsBA,IAG5BxW,EAAEwW,kBAAoBA,EACtBvW,KAAKwa,cAAc,SAHRxa,KAUfP,6BACI,OAAOO,KAAKC,GAAGsW,kBAOnB9W,iBAAiB+W,GACb,MAAMzW,EAAIC,KAAKC,GAEf,OADAuW,IAAkBA,EACdzW,EAAEyW,gBAAkBA,IAGxBzW,EAAEyW,cAAgBA,EAClBzW,EAAEuY,cAAgB,KAClBvY,EAAEyY,cAAe,EACjBxY,KAAKwa,iBALMxa,KAYfP,yBACI,OAAOO,KAAKC,GAAGuW,cAOnB/W,wBAAwBgX,GACpB,MAAM1W,EAAIC,KAAKC,GAEf,OADAwW,IAAyBA,EACrB1W,EAAEgc,mBAAqBtF,IAG3B1W,EAAEgc,iBAAmBtF,EACrB1W,EAAEyY,cAAe,EACjBxY,KAAKwa,iBAJMxa,KAWfP,gCACI,OAAOO,KAAKC,GAAGwW,qBAOnBhX,gBAAgB0M,GACZ,MAAMpM,EAAIC,KAAKC,GAKf,OAHAF,EAAE2W,aAAepS,MAAMqT,QAAQxL,GAAU,IAAIyL,IAAIzL,GAAU,KAC3DpM,EAAEyY,cAAe,EACjBxY,KAAKwa,gBACExa,KAMXP,kBACI,OAAOO,KAAKC,GAAGyW,aAAepS,MAAMC,KAAKvE,KAAKC,GAAGyW,cAAgB,KAOrEjX,sBAAsBuc,GAClB,MAAMjc,EAAIC,KAAKC,GACf,OAAIF,EAAE4W,qBAAuBqF,IAG7Bjc,EAAE4W,mBAAqBqF,EACvBjc,EAAEyY,cAAe,EACjBxY,KAAKwa,iBAJMxa,KAWfP,wBACI,OAAOO,KAAKC,GAAG0W,mBAOnBlX,0BAA0BmX,GACtB,MAAM7W,EAAIC,KAAKC,GAEf,OADA2W,IAA2BA,EACvB7W,EAAE6W,yBAA2BA,IAGjC7W,EAAE6W,uBAAyBA,EAC3B7W,EAAEyY,cAAe,EACjBxY,KAAKwa,iBAJMxa,KAWfP,kCACI,OAAOO,KAAKC,GAAG2W,uBAOnBnX,iBAAiBqX,GAGb,OADAA,IAAkBA,EADR9W,KAAKC,GAET6W,gBAAkBA,IAGxB9W,KAAKC,GAAG6W,cAAgBA,EACxB9W,KAAKwa,cAAc,SAHRxa,KAUfP,yBACI,OAAOO,KAAKC,GAAG6W,cAOnBrX,6BAA6Bwc,GAGzB,OAFUjc,KAAKC,GAET8W,4BAA8BkF,IAGpCjc,KAAKC,GAAG8W,0BAA4BkF,EACpCjc,KAAKwa,cAAc,SAHRxa,KAWfP,yBAAyBzB,GAErB,OADUgC,KAAKC,GACT4W,wBAA0B7Y,IAGhCgC,KAAKC,GAAG4W,sBAAwB7Y,GAFrBgC,KASfP,2BACI,OAAOO,KAAKC,GAAG4W,sBAOnBpX,SAASZ,GACL,MAAMkB,EAAIC,KAAKC,GAEf,OADApB,IAAUA,EACNkB,EAAElB,QAAUA,IAGhBkB,EAAElB,MAAQA,EAEVmB,KAAKsZ,qBAGLnV,EAAOpE,EAAEwZ,2BACFxZ,EAAEwZ,mBAETvZ,KAAKwa,cAAc,SAVRxa,KAkBfP,iBACI,OAAOO,KAAKC,GAAGpB,MAOnBY,cAAcuX,GACV,MAAMjX,EAAIC,KAAKC,GAEf,OADA+W,IAAeA,EACXjX,EAAEiX,aAAeA,IAGrBjX,EAAEiX,WAAaA,EACfhX,KAAKwa,cAAc,SAHRxa,KAWfP,sBACI,OAAOO,KAAKC,GAAG+W,WAOnBvX,iBAAiBwX,GAGb,OAFAjX,KAAKC,GAAGgX,cAAgBA,EACxBjX,KAAKwa,cAAc,QACZxa,KAMXP,mBACI,OAAOO,KAAKC,GAAGgX,cAOnBxX,wBAAwB6H,GACpB,MAAMvH,EAAIC,KAAKC,GACfF,EAAEmX,qBAAuB5P,EAEzB,IAAIoO,IAAc3V,EAAE8Y,0BAA2B9Y,EAAE8Y,yBAAyBnD,cAU1E,OARI3V,EAAE8Y,0BACF9Y,EAAE8Y,yBAAyBpD,SAE/B1V,EAAE8Y,yBAA2BpE,GAAS,IAAMzU,KAAK8Y,oBAAoB/Y,EAAEmX,sBAAsB,GAEzFxB,GACA3V,EAAE8Y,2BAEC7Y,KAMXP,0BACI,OAAOO,KAAKC,GAAGiX,qBAOnBzX,qBAAqBzB,GAGjB,OAFUgC,KAAKC,GACbkX,kBAAoBnZ,EACfgC,KAMXP,uBACI,OAAOO,KAAKC,GAAGkX,kBAOnB1X,eAAeiY,GAIX,OAHU1X,KAAKC,GACbyX,YAAcA,EAChB1X,KAAKsZ,qBACEtZ,KAQXP,oBAAoB6G,EAAQ4V,GACxB,MAAMnc,EAAIC,KAAKC,GAGf,OAFAF,EAAE8X,iBAAmBvR,EACrBvG,EAAE+X,mBAAqBoE,EAChBlc,KAQXP,mBAAmB6G,EAAQ4V,GACvB,MAAMnc,EAAIC,KAAKC,GAGf,OAFAF,EAAEgY,gBAAkBzR,EACpBvG,EAAEiY,kBAAoBkE,EACflc,KAQXP,uBAAuB6G,EAAQ4V,GAC3B,MAAMnc,EAAIC,KAAKC,GAGf,OAFAF,EAAEkY,oBAAsB3R,EACxBvG,EAAEmY,sBAAwBgE,EACnBlc,KAQXP,uBAAuB6G,EAAQ4V,GAC3B,MAAMnc,EAAIC,KAAKC,GAGf,OAFAF,EAAEoY,oBAAsB7R,EACxBvG,EAAEqY,sBAAwB8D,EACnBlc,KAOXP,aAAamF,GACT,MAAM7E,EAAIC,KAAKC,GAMf,OALAF,EAAEV,UAAYuF,EAEhB7E,EAAE4a,UACL5a,EAAE4a,SAASwB,aAAavX,GAEZ5E,KAOXP,aAAamF,GACT,MAAM7E,EAAIC,KAAKC,GAMf,OALAF,EAAET,UAAYsF,EAEhB7E,EAAE4a,UACL5a,EAAE4a,SAASyB,aAAaxX,GAEZ5E,KAOXP,sBAAsBmF,GAGlB,OAFU5E,KAAKC,GACbmX,mBAAqBxS,EAChB5E,KAOXP,iBAAiBzB,GAGb,OAFUgC,KAAKC,GACboX,cAAgBrZ,EACXgC,KAOXP,+BAA+BzB,GAG3B,OAFUgC,KAAKC,GACbqX,4BAA8BtZ,EACzBgC,KAOXP,YAAY+D,GAGR,OAFUxD,KAAKC,GACboY,SAAW7U,EACNxD,KAMXP,cACI,OAAOO,KAAKC,GAAGoY,SAOnB5Y,aACI,MAAMM,EAAIC,KAAKC,GAKf,OAHIF,EAAEyZ,OACFzZ,EAAEyZ,MAAMC,QAELzZ,KAOXP,YACI,MAAMM,EAAIC,KAAKC,GAKf,OAHIF,EAAEyZ,OACFzZ,EAAEyZ,MAAM6C,OAELrc,KAOXP,QACI,MAAMM,EAAIC,KAAKC,GAEf,IAAIqc,EAAW,CAAE7G,QAAQ,GAEzB,OADAzV,KAAK8E,SAAS,eAAgBwX,GAC1BA,EAAS7G,SAGb1V,EAAE2Y,cAAgB,GAClB3Y,EAAEwX,eAAiB,GACnBxX,EAAE4Y,kBAAmB,EACrB5Y,EAAE6Y,yBAA0B,EAE5B5Y,KAAK8E,SAAS,SAEV9E,KAAK5B,KAET4B,KAAK8Y,mBAEL9Y,KAAKuc,cAAc,IACnBvc,KAAKwa,cAAc,UAdRxa,KAwBfP,WACI,MAAMM,EAAIC,KAAKC,GACf,OAAIF,EAAElB,MACKkB,EAAEwX,eAAe8D,MAAM,GACzBtb,EAAEwX,eAAezR,OAAS,EACxB/F,EAAEwX,eAAe,QADvB,EAWT9X,SAASzB,GAEL,OADUgC,KAAKC,GACTpB,MACKmB,KAAKsa,kBAAkBhW,MAAMqT,QAAQ3Z,GAASA,OAAkB8B,IAAV9B,EAAsB,CAACA,GAAS,IAEtFgC,KAAKsa,uBAA4Bxa,IAAV9B,EAAsB,CAACA,GAAS,IAQtEyB,oBAEI,OADUO,KAAKC,GACNsX,eAAe8D,MAAM,GASlC5b,kBAAkB0M,GACd,MAAMpM,EAAIC,KAAKC,GAAIX,EAAYS,EAAET,UAE5BS,EAAElB,QACHsN,EAASA,EAAOkP,MAAM,EAAG,IAG7B,IAAImB,EAAM,IAAI5E,IACVL,EAAiB,GACjBmB,EAAgB,GAEpB,IAAK,IAAI1a,KAASmO,EAAQ,CACtB,GAAIqQ,EAAIC,IAAIze,GACR,SACJwe,EAAIlb,IAAItD,GAERuZ,EAAenR,KAAKpI,GAEpB,IAAI2E,EAAO5C,EAAE8B,MAAMoO,MAAK/I,GAAKA,EAAE5H,KAAetB,SACjC8B,IAAT6C,EACA+V,EAActS,KAAKzD,GAEnB+V,EAActS,KAAK,CAAE3G,CAACM,EAAET,WAAYtB,IAY5C,OARA+B,EAAEwX,eAAiBA,EACnBxX,EAAE2Y,cAAgBA,EAClB3Y,EAAE4Y,kBAAmB,EACrB5Y,EAAE6Y,yBAA0B,EAE5B5Y,KAAK8Y,mBACL9Y,KAAKwa,cAAc,QAEZxa,KAQXP,wBAEI,OADUO,KAAKC,GACNsX,eAAezR,OAQ5BrG,mBAEI,OADUO,KAAKC,GACNyY,cAAc2C,MAAM,GAWjC5b,iBAAiBoC,GAEb,OADA7B,KAAK0c,kBAAkB7a,GAChB7B,KAMXP,WACI,MAAMM,EAAIC,KAAKC,GAEf,OAAIF,EAAE4a,SAASvT,aAGXrH,EAAEyX,eAAoC,IAAnBzX,EAAE8B,MAAMiE,SAG/B9F,KAAK8E,SAAS,cAAe,CAAE5C,KAAMnC,EAAE4a,WAEvC5a,EAAE4a,SAASgC,KAAK3c,KAAK4c,+BACrB5c,KAAK6c,sBAKL7c,KAAK6c,sBAED9c,EAAE4a,SAAS9V,kBACX9E,EAAE4a,SAAS7M,sBAAsB/N,EAAE4a,SAASmC,wBAhBrC9c,KAyBfP,YACI,MAAMM,EAAIC,KAAKC,GAEf,OAAID,KAAK5B,GACE4B,KAEND,EAAE4a,SAASvT,aAGhBrH,EAAE4a,SAASxJ,OAEJnR,MAJIA,KAWfP,WAAWsd,GACP,MAAMhd,EAAIC,KAAKC,GAIf,YAF0BH,IAATid,GAAsBhd,EAAE4a,SAASvT,YAAgB2V,GAGvD/c,KAAKgd,WACJhd,KAAKid,YAMrBxd,aACI,QAASO,KAAKC,GAAGid,gBAOrBzd,cAAcF,GACV,OAAOS,KAAKmd,sBAAwBrd,IAAPP,GAAoBS,KAAKod,qBAAuB7d,GAOjFE,iBAAiB+X,GACb,MAAMzX,EAAIC,KAAKC,GAIf,OAFAuX,OAAkC1X,IAAlB0X,KAAuCA,EAEnDzX,EAAEyX,gBAAkBA,IAGxBzX,EAAEyX,cAAgBA,EAEdzX,EAAEyX,eAAoC,IAAnBzX,EAAE8B,MAAMiE,QAAgB9F,KAAKqd,aAChDrd,KAAKid,aACGld,EAAEyX,eAAiB1M,SAASqE,iBAClCpP,EAAElB,OAASkB,EAAEiX,aAAejX,EAAEyZ,MAAM7M,SAAS7B,SAASqE,iBAClDpP,EAAElB,QAAUkB,EAAEiX,YAAejX,EAAEkB,GAAG0L,SAAS7B,SAASqE,iBAC1DnP,KAAKgd,WAGThd,KAAKwa,iBAZMxa,KAmBfP,mBACI,OAAOO,KAAKC,GAAGuX,cAOnB/X,cAEI,OADAO,KAAKga,eACEha,KASXP,GAAkBsF,EAAqByJ,GAEnC,OADAxO,KAAKC,GAAGO,KAAKjB,GAAGwF,EAAOyJ,GAChBxO,KASXP,KAAoBsF,EAAqByJ,GACrC,IAAIC,EAAWzQ,IACXgC,KAAKC,GAAGO,KAAKkO,IAAI3J,EAAO0J,GACxBD,EAAQxQ,IAGZ,OADAgC,KAAKC,GAAGO,KAAKjB,GAAGwF,EAAO0J,GAChBzO,KASXP,IAAsBsF,EAAqByJ,GAMvC,OALKzJ,GAAUA,EAGX/E,KAAKC,GAAGO,KAAKkO,IAAI3J,EAAOyJ,GAFxBxO,KAAKC,GAAGO,KAAKmO,IAAIC,QAId5O,KASXP,KAAoBsF,EAAgB/G,GAEhC,OADAgC,KAAKC,GAAGO,KAAKqO,KAAK9J,EAAO/G,GAClBgC,KAIXP,cACI,MAAMM,EAAIC,KAAKC,GAiCf,GA/BKF,EAAEgb,kBACHhb,EAAEgb,gBAAkBtZ,EAAc,OAAQ,CACtCG,IAAK,CACD8G,SAAU,WACV4U,QAAS,EACT3V,KAAM,EACN3G,IAAK,UACLuc,WAAY,UAKnBxd,EAAEyZ,QACHzZ,EAAEyd,aAAe/b,EAAc,OAC3B,CACIC,MAAO,GAAG3B,EAAErB,iCAEhBqB,EAAEyZ,MAAQ/X,EAAc,QAAS,CAC7BC,MAAO,GAAG3B,EAAErB,8BACZ0S,KAAM,SACNqM,aAAc,MACdC,YAAa,MACbC,eAAgB,MAChBC,WAAY,QACZrc,KAAM,UACNsc,oBAAqB,OACrBC,WAAY/d,EAAEiX,YAAcjX,EAAElB,WAKtCkB,EAAElB,OAOF,GANIkB,EAAE+a,gBACF9a,KAAK4a,wBACLzW,EAAOpE,EAAE+a,sBACF/a,EAAE+a,gBAGR/a,EAAEmC,KAAM,CAGTlC,KAAK+d,4BAGL,MAAMC,EAAoBlT,SAASqE,cAEnCpP,EAAEmC,KAAOT,EAAc,KAAM,CACzBC,MAAO,GAAG3B,EAAErB,wBAEhBqB,EAAEkB,GAAG4L,YAAY9M,EAAEmC,MACnBnC,EAAEmC,KAAK2K,YAAY9M,EAAEyd,cACrBzd,EAAEkB,GAAGI,UAAU8C,OAAO,GAAGpE,EAAErB,yBAC3BqB,EAAEkB,GAAGI,UAAUC,IAAI,GAAGvB,EAAErB,wBAGxBqB,EAAEY,KACGW,IAAIvB,EAAEmC,KAAM,SAAUkO,IACd9K,EAAa8K,EAAI7K,OAAQ,IAAIxF,EAAErB,6BAA8B0R,EAAIhB,iBAGlErP,EAAEoW,UAENnW,KAAKie,0BAED3Y,EAAa8K,EAAI7K,OAAQ,IAAIxF,EAAErB,sBAAuB0R,EAAIhB,eAC1DgB,OAEP9O,IAAIvB,EAAEmC,KAAM,WAA8BkO,IAClC9K,EAAa8K,EAAI7K,OAAQ,IAAIxF,EAAErB,sBAAuB0R,EAAIhB,gBAG/DpP,KAAKke,oBAAoB9N,MAG7B4N,IAAsBje,EAAEyZ,OACxBzZ,EAAEyZ,MAAMC,QAEZzZ,KAAKme,gCAST,GANIpe,EAAEmC,OACFiC,EAAOpE,EAAEmC,MACTnC,EAAEY,KAAKwD,OAAOpE,EAAEmC,aACTnC,EAAEmC,OAGRnC,EAAE+a,cAAe,CAGlB9a,KAAK+d,4BAGL,MAAMC,EAAoBlT,SAASqE,cAEnCpP,EAAE+a,cAAgBrZ,EAAc,MAAO,CACnCC,MAAO,GAAG3B,EAAErB,kCAEhBqB,EAAEkB,GAAG4L,YAAY9M,EAAE+a,eACnB/a,EAAEkB,GAAG4L,YAAY9M,EAAEyd,cACnBzd,EAAEkB,GAAGI,UAAU8C,OAAO,GAAGpE,EAAErB,wBAC3BqB,EAAEkB,GAAGI,UAAUC,IAAI,GAAGvB,EAAErB,yBAEpBsf,IAAsBje,EAAEyZ,OACxBzZ,EAAEyZ,MAAMC,QAEZzZ,KAAKme,0BAITpe,EAAEsW,qBAAuBtW,EAAEib,gBACvBjb,EAAEsW,kBACFtW,EAAEib,cAAgBvZ,EAAc,OAAQ,CAAEC,MAAO,GAAG3B,EAAErB,kCACtDqB,EAAEkB,GAAG4L,YAAY9M,EAAEib,iBAEnB7W,EAAOpE,EAAEib,sBACFjb,EAAEib,cACTjb,EAAEkB,GAAGI,UAAU8C,OAAO,GAAGpE,EAAErB,uCAI/BqB,EAAEyX,kBAAoBzX,EAAEqe,UACpBre,EAAEyX,eACFzX,EAAEqe,QAAU3c,EAAc,OAAQ,CAAEC,MAAO,GAAG3B,EAAErB,2BAChDqB,EAAEkB,GAAG4L,YAAY9M,EAAEqe,SACnBre,EAAEkB,GAAGI,UAAUC,IAAI,GAAGvB,EAAErB,gCAExByF,EAAOpE,EAAEqe,gBACFre,EAAEqe,QACTre,EAAEkB,GAAGI,UAAU8C,OAAO,GAAGpE,EAAErB,gCAQvCe,mBACI,MAAMM,EAAIC,KAAKC,GAAIgB,EAAKlB,EAAEkB,GAE1B,IAAKA,EACD,OAEJ,IAAIJ,EAAU,CAACd,EAAErB,eAEbqB,EAAElB,MACFgC,EAAQuF,KAAK,GAAGrG,EAAErB,wBACjBmC,EAAQuF,KAAK,GAAGrG,EAAErB,yBAEnBsB,KAAKqd,aACLxc,EAAQuF,KAAK,GAAGrG,EAAErB,4BACjBmC,EAAQuF,KAAK,GAAGrG,EAAErB,8BAEnBqB,EAAEsW,kBACFxV,EAAQuF,KAAK,GAAGrG,EAAErB,qCAElBqB,EAAEwZ,oBACF1Y,EAAQuF,KAAK,GAAGrG,EAAErB,4BAElBqB,EAAEyX,eACF3W,EAAQuF,KAAK,GAAGrG,EAAErB,8BAEU,IAA5BqB,EAAEwX,eAAezR,QACjBjF,EAAQuF,KAAK,GAAGrG,EAAErB,kCAElBqB,EAAEwX,eAAezR,OAAS,GAC1BjF,EAAQuF,KAAK,GAAGrG,EAAErB,iCAElBqB,EAAEiX,YAAcjX,EAAElB,QAClBgC,EAAQuF,KAAK,GAAGrG,EAAErB,6BAElBqB,EAAEK,oBACFS,EAAUA,EAAQC,OAAOf,EAAEK,oBAG/Ba,EAAGgC,UAAYpC,EAAQc,KAAK,KAIhClC,qBACI,MAAMM,EAAIC,KAAKC,GAAIX,EAAYS,EAAET,UAE7BS,EAAE4a,WACF5a,EAAE4a,SAASvW,iBACJrE,EAAE4a,SACT5a,EAAEyY,cAAe,EACjBzY,EAAE4Y,kBAAmB,EACrB5Y,EAAE6Y,yBAA0B,GAGhC,MAAMT,EAAsBpY,EAAEoY,oBACxBC,EAAwBrY,EAAEqY,sBAC1BiG,GAAoBte,EAAE2X,aAAe,IAAIrX,WACzCie,GAAsBve,EAAE2X,aAAe,IAAIpX,aAE3CD,EAAc8X,GAAuBkG,EAAoB,CAAC1b,EAAMF,IAC9DE,GAAQA,EAAKrD,KAAeqW,GACxBwC,IAA6D,IAAtCA,EAAoBxV,EAAMF,IAIrDA,EAAOoK,YAAYpL,EAAc,MAAO,CACpCC,MAAO,8BACPsS,YAAajU,EAAEkX,kBALR,KASPoH,GACOA,EAAiB1b,EAAMF,GAGtC,KAEEnC,EAAgB8X,GAAyBiG,EAAoB,CAAC1b,EAAMF,KACtE,GAAIE,GAAQA,EAAKrD,KAAeqW,GAC5B,GAAIyC,EACA,OAAOA,EAAsBzV,EAAMF,QAEvC,GAAI6b,EACA,OAAOA,EAAmB3b,EAAMF,GAExC,OAAO,GACP,KAEEkY,EAAW5a,EAAE4a,SAAW,IAAInb,EAAS,CACvCJ,gBAAiB,MAEdW,EAAE2X,YAELrX,WAAYA,EACZC,aAAcA,EAEdzB,MAAOkB,EAAElB,MACTD,eAAe,EAEfS,UAAWU,EAAEV,UACbC,UAAWS,EAAET,UAEbC,GAAI,CAAC8E,EAAMU,KACP,OAAQV,GACJ,IAAK,cAAe,CAChBtE,EAAEmd,iBAAkB,EACpBnd,EAAEkB,GAAG6B,aAAa,gBAAiB,QACnC/C,EAAEkB,GAAGI,UAAUC,IAAI,GAAGvB,EAAErB,4BACxBqB,EAAEkB,GAAGI,UAAU8C,OAAO,GAAGpE,EAAErB,8BAEvBqB,EAAE6Y,yBAA4B7Y,EAAE0W,sBAAwB1W,EAAElB,QAC1DkB,EAAEyY,cAAe,GAErBxY,KAAK8Y,mBACL9Y,KAAK8E,SAAS,OAAQ,CAAE5C,KAAMyY,IAE9B3a,KAAKue,yBAELxe,EAAEY,KAAKW,IAAIgG,OAAQ,wBAAwB,IAAMtH,KAAK6c,wBAEtD,IAAI2B,EAASze,EAAEkB,GAAGqK,WAClB,KAAOkT,IACCA,EAAOvU,aAAeuU,EAAOC,cAC7BD,EAAOhT,YAAcgT,EAAOE,eACxBF,IAAW1T,SAASC,kBACpByT,EAASlX,QAEbvH,EAAEY,KAAKW,IAAIkd,EAAQ,wBAAwB,IAAMxe,KAAK6c,yBAE1D2B,EAASA,EAAOlT,WAGpB,MAEJ,IAAK,OAaD,GAZAvL,EAAEmd,iBAAkB,EACpBnd,EAAEkB,GAAG6B,aAAa,gBAAiB,SACnC/C,EAAEkB,GAAGI,UAAU8C,OAAO,GAAGpE,EAAErB,4BAC3BqB,EAAEkB,GAAGI,UAAUC,IAAI,GAAGvB,EAAErB,8BAEnBqB,EAAElB,QACHmB,KAAKuc,cAAc,IACnBvc,KAAKwa,iBAGTxa,KAAK8E,SAAS,SAEV9E,KAAK5B,GAAkB,OAE3B4B,KAAK0a,wBACL3a,EAAEY,KAAKwD,OAAO,KAAM,kBAEpB,MAEJ,IAAK,QAAS,CACV,IAAKpE,EAAElB,MAAO,OAEd,MAAM8D,EAA+BoC,EAAMpC,KACrC3E,EAAQ+G,EAAM/G,MAEpB,IAAIkH,EAAUH,EAAMG,QACpB,GAAIH,EAAMI,QAAS,OAEnB,IAAIwZ,EAAS,CAAE3gB,MAAOA,EAAO2E,KAAMA,EAAM8S,QAAQ,GAGjD,GAFAzV,KAAK8E,UAAUI,EAAU,SAAW,aAAe,UAAWyZ,GAE1DA,EAAOlJ,OAGP,YADA1V,EAAE4a,SAASiE,eAAe5gB,GAAQkH,GAItC,GAAIA,EACAnF,EAAE2Y,cAActS,KAAKzD,GACrB5C,EAAEwX,eAAenR,KAAKpI,OACnB,CACH,MAAM6gB,EAAM9e,EAAEwX,eAAelL,QAAQrO,IACxB,IAAT6gB,IACA9e,EAAE2Y,cAAcvS,OAAO0Y,EAAK,GAC5B9e,EAAEwX,eAAepR,OAAO0Y,EAAK,IAKrC,MAAMC,IAAiB/Z,EAAMK,gBAEzBrF,EAAE+W,gBACE5R,GAC6B,IAAzByV,EAAShI,aACT3S,KAAKuc,cAAc,IAGnBxc,EAAEwW,kBACGuI,GACD9e,KAAKwa,cAAc,SAEA,MAAnBza,EAAEsX,eACFtX,EAAE2Y,cAAcqG,QAAO7X,IAAMA,EAAE9D,SAAQ0C,OAAS/F,EAAEsX,cAClDrX,KAAKwa,cAAc,mCAEnBxa,KAAKwa,cAAc,sBAAuB7X,GAGzCmc,GACD9e,KAAKwa,mBAGU,MAAnBza,EAAEsX,eACFtX,EAAE2Y,cAAcqG,QAAO7X,IAAMA,EAAE9D,SAAQ0C,SAAW/F,EAAEsX,cACpDrX,KAAKwa,cAAc,8BAEnBxa,KAAKwa,cAAc,yBAA0B7X,GAG5Cmc,GACD9e,KAAKwa,kBAIjBxa,KAAK8E,SAASI,EAAU,SAAW,YAAa,CAAElH,MAAOA,EAAO2E,KAAMA,IAEtE,MAEJ,IAAK,aACD,IAAK5C,EAAElB,MAAO,OAEVkG,EAAM+N,eACN9S,KAAKwa,cAAcza,EAAEwW,kBAAoB,OAAS,MAGtD,MAEJ,IAAK,SAAU,CACX,GAAIxW,EAAElB,MAAO,OAEb,MAAM8D,EAAOoC,EAAMpC,KACb3E,EAAQ+G,EAAM/G,MAEpB,IAAIghB,EAAY,CAAEhhB,MAAOA,EAAO2E,KAAMA,EAAM8S,QAAQ,GAGpD,GAFAzV,KAAK8E,SAAS,gBAAiBka,GAE3BA,EAAUvJ,OACV,OAEJ,GAAIzV,KAAK5B,GAAkB,OAK3B,GAHA4B,KAAK0c,kBAAkB,CAAC/Z,IACxB3C,KAAK8E,SAAS,SAAU,CAAE9G,MAAOA,EAAO2E,KAAMA,IAE1C3C,KAAK5B,GAAkB,OAE3B4B,KAAKid,aAE2B,UAA5Bld,EAAE8W,uBAAqChB,GACX,UAA5B9V,EAAE8W,uBAAqC9W,EAAE8W,wBACzC9W,EAAEyZ,OAASzZ,EAAEyZ,MAAM6C,YAQvCrc,KAAKme,0BAGT1e,4BACcO,KAAKC,GAEbU,KAAKwD,OAAO,KAAM,aAGxB1E,0BACI,MAAMM,EAAIC,KAAKC,GAEfD,KAAK+d,4BAEL,MAAMpD,EAAW5a,EAAE4a,SACnB,IAAKA,EAAU,OAEf,IAAIsE,GAAuB,EACvBvP,EAAiB,KACjBwP,GAAmB,EACnBC,GAAyB,EAE7B,MAAMC,EAAkBrf,EAAElB,OAASkB,EAAEiX,WAAajX,EAAEyZ,MAAQzZ,EAAEkB,GAE9DlB,EAAEY,KACGW,IAAI8d,EAAiB,oBAAoBhP,IACtC,IAAgCA,EAAiB,cAAE0N,SAAnD,CAMA,OAHAoB,GAAmB,EACnBC,GAAyB,EAEjB/O,EAAIxQ,KACR,KAAK0Q,EACL,KAAKC,EACL,KAAKG,EACL,KAAKC,EAID,OAHAuO,GAAmB,EACnB9O,EAAIf,iBAEIe,EAAIxQ,KACR,KAAK0Q,EACGqK,EAASvT,aACTuT,EAAS/J,aAAaR,GAC1B,MACJ,KAAKG,EACGoK,EAASvT,aACTuT,EAAS9J,SAAST,GACtB,MACJ,KAAKM,EACGiK,EAASvT,YACTuT,EAAS7J,SAASV,GAElBpQ,KAAKqf,YAET,MACJ,KAAK1O,EACGgK,EAASvT,YACTuT,EAAS5J,KAAKX,GAEdpQ,KAAKsf,YAKjB,MAEJ,KAAKrO,EACGlR,EAAEwf,0BACE5E,EAASvT,aAAeuT,EAAS9V,mBACjCqa,GAAmB,EACnBC,GAAyB,EACrBpf,EAAElB,MACF8b,EAASzL,kBAAkBkB,GAC1BuK,EAAS1L,qBAAqBmB,GACnCA,EAAIf,kBAGZ,MAEJ,KAAK2B,EACG2J,EAASvT,aAAeuT,EAAS9V,mBACjCqa,GAAmB,EACnBC,GAAyB,EACzB/O,EAAIf,iBACJsL,EAAS1L,qBAAqBmB,IAGlC,MAEJ,KAAKoP,EACG7E,EAASvT,aAAeuT,EAAS9V,kBACjC8V,EAAS1L,qBAAqBmB,GAElC,MAEJ,KAAKc,EACGyJ,EAASvT,cACTuT,EAASxJ,KAAKf,GACdA,EAAIf,kBAER,MAEJ,QACI8P,GAAyB,EACzBxE,EAAStJ,iBAAiBjB,GAIlCrQ,EAAEwf,yBAA2BnP,EAAIxQ,MAAQ8Q,GACrCN,EAAIxQ,MAAQ+Q,GACZP,EAAIxQ,MAAQ0Q,GACZF,EAAIxQ,MAAQ2Q,GACXH,EAAIxQ,MAAQqR,KAAiBlR,EAAEwf,6BAEvCje,IAAI8d,EAAiB,qBAAqBhP,IACvC,GAAI8O,EAGA,OAFAA,GAAmB,OACnB9O,EAAIf,iBAIR,IAAI8P,EAAJ,CAGA,GAAI/O,EAAIxQ,MAAQoR,GAERZ,EAAIxQ,MAAQqR,GACZlR,EAAEwf,2BACDxf,EAAElB,QACF8b,EAAS9V,iBAMd,OAHA7E,KAAKyf,aACLrP,EAAIf,sBACJe,EAAIsP,kBAIR,OAAQtP,EAAIxQ,KACR,KAAK0Q,EACL,KAAKC,EACL,KAAKG,EACL,KAAKC,EAGD,OAFAP,EAAIf,iBAEIe,EAAIxQ,KACR,KAAK0Q,EACGqK,EAASvT,aACTuT,EAAS/J,aAAaR,GAC1B,MACJ,KAAKG,EACGoK,EAASvT,aACTuT,EAAS9J,SAAST,GACtB,MACJ,KAAKM,EACGiK,EAASvT,YACTuT,EAAS7J,SAASV,GAElBpQ,KAAKqf,YAET,MACJ,KAAK1O,EACGgK,EAASvT,YACTuT,EAAS5J,KAAKX,GAEdpQ,KAAKsf,kBAQ7Bvf,EAAEyZ,OACFzZ,EAAEY,KACGW,IAAIvB,EAAEyZ,MAAO,kBAAkB,KAC5BzZ,EAAEgZ,WAAahZ,EAAEyZ,MAAMxb,MAAM8d,OAC7B/b,EAAEuY,cAAgB,KAClBvY,EAAEyY,cAAe,EAEjBxY,KAAK8E,SAAS,SAAU,CAAE9G,MAAO+B,EAAEyZ,MAAMxb,QAEzC+B,EAAE8Y,8BAELvX,IAAIvB,EAAEyZ,MAAO,kBAAkB,MACvBzZ,EAAElB,OAASkB,EAAEiX,YACdhX,KAAKgd,cAGZ1b,IAAIvB,EAAEyZ,MAAO,kBAAkB,KAC5BxZ,KAAK8E,SAAS,gBAEV9E,KAAK5B,KAET6gB,GAAuB,EACvBjf,KAAKgd,WAELiC,GAAuB,EACvBxS,YAAW,KAAQwS,GAAuB,IAAU,QAEvD3d,IAAIvB,EAAEyZ,MAAO,iBAAiB,KAC3BxZ,KAAK8E,SAAS,eAEV9E,KAAK5B,KAEL2B,EAAE8Y,0BACF9Y,EAAE8Y,yBAAyBpD,SAE/BzV,KAAKid,gBAIjBld,EAAEY,KACGW,IAAIvB,EAAEkB,GAAI,sBAAsB,KACxBlB,EAAElB,OAAUkB,EAAEiX,YAAeiI,GAC9Bjf,KAAKyf,aAETR,GAAuB,KAE1B3d,IAAIvB,EAAEkB,GAAI,uBAAuBmP,IAC9B,GAAIV,EAAgB,OAGpB,GAFAA,EAAiBU,EAAIT,eAAe,GAAGC,WAEnC5P,KAAK2f,aACL,OAEJ,GAAIra,EAAa8K,EAAI7K,OAAQ,IAAIxF,EAAErB,wBAAwBqB,EAAErB,uBAAwBqB,EAAEkB,IACnF,OAEJ,IAAI8O,EAAgB,KAChBL,EAAiB,KACjB3P,EAAEY,KAAKwD,OAAOpE,EAAEkB,GAAI,0BAGvBlB,EAAEyZ,OAASzZ,EAAEkB,IAAIwY,QAElB1Z,EAAEY,KACGW,IAAIvB,EAAEkB,GAAI,gCAAiC2e,IAGxC,IAFYtb,MAAM9F,UAAUyR,KAAKtJ,KAAKyJ,EAAIT,gBACtCO,GAASA,EAAMN,aAAeF,IACtB,OAAOK,IAEnB6P,EAAKvQ,iBACLU,OAEHzO,IAAIvB,EAAEkB,GAAI,iCAAkC2e,IACzCA,EAAKvQ,oBAER/N,IAAIvB,EAAEkB,GAAI,kCAAmC8O,MAI9DtQ,YACI,MAAMM,EAAIC,KAAKC,GAEf,GAAID,KAAK6f,iBAAkB,OAE3B,IAAInH,EAAgB1Y,KAAK8f,mBACrBje,EAAQ9B,EAAEuY,eAAiBvY,EAAE8B,MAGjC,GAFI9B,EAAEwY,kBAAoBxY,EAAEwY,iBAAiBzS,SAAWjE,EAAMiE,SAC1DjE,EAAQ9B,EAAEwY,kBACT1W,EAAMiE,QAAU/F,EAAEqW,UAAY,EAAI,GAAM,EAAG,CAC5C,IAAIlE,EAAYwG,EAAc5S,OAAS,EAAIjE,EAAMwK,QAAQqM,EAAc,IAAM,EAAK7W,EAAMiE,OAAS,GAC9E,IAAfoM,GAAqBnS,EAAEqW,YACvBlE,EAAYrQ,EAAMiE,OAAS,GAC/B9F,KAAK+f,kBAAgC,IAAf7N,EAAmB,GAAK,CAACrQ,EAAMqQ,MAI7DzS,YACI,MAAMM,EAAIC,KAAKC,GAEf,GAAID,KAAK6f,iBAAkB,OAE3B,IAAInH,EAAgB1Y,KAAK8f,mBACrBje,EAAQ9B,EAAEuY,eAAiBvY,EAAE8B,MAGjC,GAFI9B,EAAEwY,kBAAoBxY,EAAEwY,iBAAiBzS,SAAWjE,EAAMiE,SAC1DjE,EAAQ9B,EAAEwY,kBACT1W,EAAMiE,QAAU/F,EAAEqW,UAAY,EAAI,GAAM,EAAG,CAC5C,IAAIlE,EAAYwG,EAAc5S,OAAS,EAAIjE,EAAMwK,QAAQqM,EAAc,IAAM,EAAI,EAC7ExG,IAAcrQ,EAAMiE,SACpBoM,EAAYnS,EAAEqW,WAAa,EAAI,GACnCpW,KAAK+f,kBAAgC,IAAf7N,EAAmB,GAAK,CAACrQ,EAAMqQ,MAK7DzS,mBACI,MAAMM,EAAIC,KAAKC,GAET0a,EAAW5a,EAAE4a,SACnB,IAAKA,IAAa5a,EAAEmd,gBAChB,OAYJ,IARKnd,EAAEuY,gBAAkBvY,EAAEgZ,YAAehZ,EAAEoX,mBAAqBpX,EAAEsY,WAC/DrY,KAAKggB,kBAGLjgB,EAAEyY,cAAgBzY,EAAE4Y,oBACpB5Y,EAAE4a,SAASsF,mBAAqB,MAGhClgB,EAAEyY,aAAc,CAChB,IAAI3W,EAAQ9B,EAAEuY,eAAiBvY,EAAE8B,OAC7B9B,EAAEyW,eAAkBzW,EAAE0W,sBAAwB1W,EAAElB,SAChDgD,EAAQ7B,KAAKkgB,WAAWre,EACpB9B,EAAEyW,cACFzW,EAAE0W,sBAAwB1W,EAAElB,MAC5BkB,EAAE6W,yBAEV+D,EAASwF,iBAEY,IAAjBte,EAAMiE,QAAgB/F,EAAEkX,gBACxBpV,EAAQ,CAAC,CACLpC,CAACM,EAAEV,WAAYU,EAAEkX,cACjBxX,CAACM,EAAET,WAAYqW,EACfrS,gBAAgB,EAChBJ,UAAU,KAIlByX,EAAShV,SAAS9D,GAClB9B,EAAEwY,iBAAmB1W,EACrB9B,EAAEyY,cAAe,EACjBzY,EAAE4Y,kBAAmB,EACrB5Y,EAAE6Y,yBAA0B,EAGhC,IAAIwH,GAAmB,EAEvB,GAAIrgB,EAAE4Y,iBAAkB,CACpB,GAAI5Y,EAAElB,MACFkB,EAAE4a,SAAS0F,iBAAiBtgB,EAAEwX,oBAC3B,CACH,MAAM+I,EAAkBvgB,EAAE4a,SAASlU,iBAAiBzG,KAAKugB,YAEzDxgB,EAAE4a,SACG7M,sBAAsBwS,GACtBvS,6BAA6BuS,GAElCF,EAAmBrgB,EAAE4a,SAAS9V,iBAElC9E,EAAE4Y,kBAAmB,EAGzB3Y,KAAK6c,sBAEDuD,GACArgB,EAAE4a,SAAS7M,sBAAsB/N,EAAE4a,SAASmC,uBAIpDrd,iBACI,MAAMM,EAAIC,KAAKC,GAETsb,EAAOxb,EAAEgZ,WAEf,GAAIwC,GAASxb,EAAEoX,mBAAqBpX,EAAEsY,SAAW,CAC7C,IAEIC,EAOJ,GALkB,mBAJTvY,EAAEsY,WAKPC,EAAgBvY,EAAEsY,SAAStY,EAAE8B,MAAO0Z,KAInCjX,MAAMqT,QAAQW,GACf,GAAIiD,EAAM,CACN,MAAMiF,EAAU,IAAI3O,OAAOC,EAAYyJ,GAAO,KACxClc,EAAYU,EAAEV,UAChB+X,EAAqBrX,EAAEqX,mBAE3BkB,EAAgBvY,EAAE8B,MAAMkd,QAAO7X,KACvBA,EAAE9D,QACCod,EAAQxO,KAAK9K,EAAE7H,IAAc6H,EAAEkQ,WAG1CkB,EAAgB,KAMxB,GAFAvY,EAAEuY,cAAgBA,EAEdA,EAAe,CAGf,IAAImI,GAAa,EACb1N,EAAMuF,EAAcxS,OAExB,IAAK,IAAIE,EAAI,EAAGA,EAAI+M,EAAK/M,IACVsS,EAActS,GAEhB5C,UACc,IAAfqd,GAAoBA,IAAcza,EAAI,IAEtCsS,EAAcnS,OAAOsa,EAAW,GAChCza,IACA+M,KAGJ0N,EAAYza,IAID,IAAfya,GACIA,IAAc1N,EAAM,GAEpBuF,EAAcnS,OAAOsa,EAAW,SAK5C1gB,EAAEuY,cAAgB,KAGtBtY,KAAK8E,SAAS,eAAgB,CAAEyW,KAAMA,EAAMC,SAAS,EAAOvV,MAAOjG,KAAKyb,yBAExE1b,EAAEyY,cAAe,EAGrB/Y,kBAAkBoC,GACd,MAAM9B,EAAIC,KAAKC,GAAIX,EAAYS,EAAET,UAE7BS,EAAElB,OACFkB,EAAE2Y,cAAgB7W,EAAMkd,QAAO7X,QAAsBpH,IAAjBoH,EAAE5H,KACtCS,EAAEwX,eAAiBxX,EAAE2Y,cAAczR,KAAIC,GAAKA,EAAE5H,OAE9CS,EAAE2Y,cAAgB7W,EAAMwZ,MAAM,EAAG,GACjCtb,EAAEwX,eAAiB1V,EAAMwZ,MAAM,EAAG,GAAGpU,KAAIC,GAAKA,EAAE5H,MAGpDS,EAAE4Y,kBAAmB,EACrB5Y,EAAE6Y,yBAA0B,EAE5B5Y,KAAK8Y,mBACL9Y,KAAKwa,cAAc,QAGvB/a,cAAcihB,EAAM3R,GAChB,MAAMhP,EAAIC,KAAKC,GAEVF,EAAE4gB,YACH5gB,EAAE4gB,UAAY,IAEL,SAATD,IACA3gB,EAAE4gB,UAAU7a,OAAS,GAEE,IAAvB/F,EAAE4gB,UAAU7a,QAAwC,SAAxB/F,EAAE4gB,UAAU,GAAGD,MAC3C3gB,EAAE4gB,UAAUva,KAAK,CAAEsa,KAAMA,EAAM3R,KAAMA,IAErChP,EAAE0a,cAGN1a,EAAE0a,YAAchO,YAAW,YAChB1M,EAAE0a,YACT,IAAImG,EAAQ7gB,EAAE4gB,iBACP5gB,EAAE4gB,UACT3gB,KAAK6gB,aAAaD,OAI1BnhB,aAAamhB,GACT,MAAM7gB,EAAIC,KAAKC,GAEf,IAAID,KAAK5B,GAGT,IAAK,IAAI0iB,KAAMF,EACX,OAAQE,EAAGJ,MACP,IAAK,OACD1gB,KAAK+gB,WAAU,GACf,MAEJ,IAAK,aACD/gB,KAAKghB,kBACL,MAEJ,IAAK,yBACD,GAAIjhB,EAAE+W,cACF9W,KAAKihB,uBACF,CACH,MAAM3hB,EAAYS,EAAET,UAEhBtB,EADS8iB,EAAG/R,KACCzP,GAEjB,IAAIuf,EAAM9e,EAAEqZ,aAAa8H,WAAUha,GAAKA,EAAEhJ,GAAYoB,KAAetB,KACxD,IAAT6gB,GACA7e,KAAK6a,+BAA+BgE,GAI5C,MAEJ,IAAK,sBACI9e,EAAE+W,cAGH9W,KAAKmhB,qBAAqBL,EAAG/R,MAF7B/O,KAAKihB,mBAKT,MAEJ,IAAK,kCACIlhB,EAAE+W,cAGH9W,KAAKohB,2BAFLphB,KAAKihB,mBAKT,MAEJ,IAAK,6BACIlhB,EAAE+W,cAGU/W,EAAEqZ,aAAarZ,EAAEqZ,aAAatT,OAAS,KACvC5H,KAAc6B,EAAET,aAAesW,GACxC5V,KAAK6a,+BAA+B9a,EAAEqZ,aAAatT,OAAS,GAJhE9F,KAAKihB,mBAQT,MAEJ,IAAK,eACDjhB,KAAKga,eAEL,MAEJ,QACIha,KAAK+gB,WAAU,IAM/BthB,wBACI,MAAMM,EAAIC,KAAKC,GAEf,GAAKF,EAAE+a,cAAP,CAEA,GAAI/a,EAAE+X,oBAAsB/X,EAAE+a,cAAcuG,WAAWvb,OAAS,EAC5D,IACI/F,EAAE+X,mBAAmB/X,EAAE+a,cAAc5c,GAAa6B,EAAE+a,eACtD,MAAOpX,GAAOX,QAAQY,MAAMD,UAG3B3D,EAAE+a,cAAc5c,GACvB6B,EAAE+a,cAAcwG,UAAY,IAOhC7hB,+BAA+BiD,GAC3B,MAAM3C,EAAIC,KAAKC,GAAImZ,EAAerZ,EAAEqZ,aAEpC,GAAIA,EAAatT,OAASpD,EAAO,CAC7B,MAAMD,EAAS2W,EAAa1W,GACtBC,EAAOF,EAAOvE,GAEpB,IAAIge,EAAWvZ,IAAO5C,EAAET,aAAesW,EACjC7V,EAAEmY,uBAAyBnY,EAAEiY,kBAC7BjY,EAAEiY,kBAER,GAAIkE,GAAYzZ,EAAO4e,WAAWvb,OAAS,EACvC,IACIoW,EAASvZ,EAAMF,GACjB,MAAOiB,GAAOX,QAAQY,MAAMD,GAElCS,EAAO1B,GAGHC,IAAU0W,EAAatT,OAAS,EAAGsT,EAAamI,MAC/CnI,EAAajT,OAAOzD,EAAO,IAQxCjD,yBAAyBkD,GACrB,MAAM5C,EAAIC,KAAKC,GAEf,IAAKF,EAAE8X,mBAAkE,IAA9C9X,EAAE8X,iBAAiBlV,EAAM5C,EAAE+a,eAA0B,CAC5E,MAAMzb,EAAYU,EAAEV,UAGpB,IAAIuD,EAAQD,EAFa5C,EAAEqX,qBAEazU,EAAKtD,GACzCuD,MAAAA,IACAA,EAAQ,IAEZ7C,EAAE+a,cAAcjO,YAAY/B,SAAS0W,eAAe5e,KAS5DnD,wBAAwBkD,EAAMF,GAC1B,MAAM1C,EAAIC,KAAKC,GAEf,IAAIqG,EAAS3D,EAAK5C,EAAET,aAAesW,EAC7B7V,EAAEkY,qBAAuBlY,EAAEgY,gBAC3BhY,EAAEgY,gBAER,IAAKzR,IAAmC,IAAzBA,EAAO3D,EAAMF,GAAmB,CAC3C,MAAMpD,EAAYU,EAAEV,UAEduD,EAAQD,EADW5C,EAAEqX,qBACezU,EAAKtD,GAC/CoD,EAAOoK,YAAYpL,EAAc,OAAQ,CACrCuS,YAAapR,MASzBnD,qBAAqBkD,GACjB,MAAM5C,EAAIC,KAAKC,GACTwC,EAASzC,KAAKyhB,iBAAiB9e,GAChCF,IAELif,EAAO3hB,EAAEyd,aAAc/a,GACvB1C,EAAEqZ,aAAahT,KAAK3D,IAIxBhD,2BACI,MAAMM,EAAIC,KAAKC,GAEf,IAAI4B,EAAQ9B,EAAE2Y,cAAc2C,MAAM,GAC9BpV,EAAQpE,EAAMkd,QAAO7X,IAAMA,EAAE9D,SAAQ0C,OAAS/F,EAAEsX,cAChDzU,EAAQ7C,EAAEuX,4BACRvX,EAAEuX,4BAA4BrR,EAAOpE,GACrC,KAAKoE,IAEXjG,KAAKmhB,qBAAqB,CACtBtf,MAAOA,EACPpC,CAACM,EAAET,WAAYsW,EACfnW,CAACM,EAAEV,WAAYuD,IAKvBnD,mBACI,MAAMM,EAAIC,KAAKC,GAGXF,EAAE2Y,cAAc5S,OAAS,GAAK/F,EAAEqW,WAAarW,EAAE+W,cAC1C/W,EAAEwZ,qBACHxZ,EAAEwZ,mBAAqB9X,EACnB1B,EAAElB,MAAQ,KAAO,OACjB,CAAE6C,MAAO,GAAG3B,EAAErB,wBACdqB,EAAE4hB,YAAclgB,EAAc,WAC9B1B,EAAElB,MACF+iB,EAAO7hB,EAAEmC,KAAMnC,EAAEwZ,oBAChBqI,EAAO7hB,EAAEkB,GAAIlB,EAAEwZ,oBACpBxZ,EAAEkB,GAAGI,UAAUC,IAAI,GAAGvB,EAAErB,4BAExBqB,EAAEY,KAAKW,IAAIvB,EAAE4hB,YAAa,SAAS,KAC3B3hB,KAAK2f,cACT3f,KAAK4O,YAIT7O,EAAEwZ,qBACFxZ,EAAEY,KAAKwD,OAAOpE,EAAE4hB,YAAa,SAE7Bxd,EAAOpE,EAAEwZ,2BACFxZ,EAAEwZ,0BACFxZ,EAAE4hB,YACT5hB,EAAEkB,GAAGI,UAAU8C,OAAO,GAAGpE,EAAErB,6BAMvCe,mBACI,MAAMM,EAAIC,KAAKC,GAEf,IAAIqW,EAAc,GAEdvW,EAAElB,QAAUkB,EAAE+W,cAEVR,EADuC,mBAAhCvW,EAAEgX,0BACKhX,EAAEgX,0BAA0BhX,EAAE2Y,eAp0EnB,EAAC7W,EAAOxC,KAC7C,GAAqB,IAAjBwC,EAAMiE,OACN,MAAO,GAEX,IAAI+b,EAAQhgB,EAAM,GAAGxC,GAAa,GAMlC,OAJIwC,EAAMiE,OAAS,IACf+b,GAAS,MAAMhgB,EAAMiE,OAAS,MAG3B+b,GA4zEmBC,CAAiC/hB,EAAE2Y,cAAe3Y,EAAEV,WAEpC,IAA3BU,EAAE2Y,cAAc5S,QAAiB/F,EAAE+W,gBAC1CR,EAA+B,MAAjBvW,EAAEuW,YAAsB,GAAMvW,EAAEuW,YAAc,IAIhEvW,EAAEyZ,MAAM1W,aAAa,cAAewT,GAIxC7W,kBACI,MAAMM,EAAIC,KAAKC,GAEXF,EAAE+a,eACF9a,KAAK4a,wBAET,MAAM/Y,EAAQ9B,EAAE2Y,cAEZ7W,EAAMiE,OAAS,IACf9F,KAAK+hB,yBAAyBlgB,EAAM,IACpC9B,EAAE+a,cAAc5c,GAAc2D,EAAM,IAS5CpC,UAAUuiB,GACN,MAAMjiB,EAAIC,KAAKC,GAQf,GANAD,KAAKmZ,cACLnZ,KAAKiiB,mBACLjiB,KAAKihB,oBAELe,EAAkBjiB,EAAElB,OAASkB,EAAE+W,gBAAkBkL,GAAmBjiB,EAAE2Y,cAAc5S,SAAW/F,EAAEqZ,aAAatT,WAEtF/F,EAAE+W,gBAAkB/W,EAAElB,MAE1C,KAAOkB,EAAEqZ,aAAatT,OAAS,GAE3B9F,KAAK6a,+BAA+B9a,EAAEqZ,aAAatT,OAAS,GAIpE,GAAI/F,EAAElB,OACF,GAAImjB,EAAiB,CACjB,MAAMngB,EAAQ9B,EAAE2Y,cAGhB,GAAI3Y,EAAEwW,kBAAmB,CACrB,MAAMlX,EAAYU,EAAEV,UAChB+X,EAAqBrX,EAAEqX,mBACvB9X,EAAYS,EAAET,UACdoX,EAAe3W,EAAE2W,aAEfsF,EAAajc,EAAE4W,sBAAwBuL,EAAGC,KAC5C,GAAqB,OAAjBzL,EAAuB,CACvB,IAAI0L,EAAK1L,EAAa+F,IAAIyF,EAAE5iB,IACxB+iB,EAAK3L,EAAa+F,IAAI0F,EAAE7iB,IAC5B,GAAI8iB,IAAOC,EAAI,OAAQ,EACvB,IAAKD,GAAMC,EAAI,OAAO,EAG1B,MAAMC,EAASJ,EAAE9K,IAAuB8K,EAAE7iB,GACpCkjB,EAASJ,EAAE/K,IAAuB+K,EAAE9iB,GAC1C,OAAOijB,EAASC,GAAU,EAAKD,EAASC,EAAS,EAAI,IAGzD1gB,EAAM2gB,KAAKxG,GAEXjc,EAAEwX,eAAiB1V,EAAMoF,KAAIC,GAAKA,EAAE5H,KAGxC,IAAImjB,EAAkB,EAClBzY,EAAMjK,EAAEsX,cACRqL,GAAc,EAGlB,IAAK,IAAI1c,EAAI,EAAGA,EAAInE,EAAMiE,OAAQE,IAC9B,IAAInE,EAAMmE,GAAG5C,OAAb,CAEA,GAAW,MAAP4G,GAAeyY,IAAoBzY,EAAK,CACxC0Y,GAAc,EACd,MAGJD,IACAziB,KAAKmhB,qBAAqBtf,EAAMmE,IAGhC0c,GACA1iB,KAAKohB,iCAGLrhB,EAAElB,OACVmB,KAAKghB,kBAGT,OAAI2B,EAAY5iB,EAAEkB,MAAQ6J,WAG1B7F,EAAYlF,EAAEkB,GAAI,GAAGlB,EAAErB,iCAA8D,IAA5BqB,EAAEwX,eAAezR,QAC1Eb,EAAYlF,EAAEkB,GAAI,GAAGlB,EAAErB,+BAAgCqB,EAAEwX,eAAezR,OAAS,GAE7E/F,EAAEiX,YAAcjX,EAAElB,OACdkB,EAAEyZ,QAAOzZ,EAAEyZ,MAAMsE,UAAW,GAChC/d,EAAEkB,GAAGI,UAAUC,IAAI,GAAGvB,EAAErB,+BAEpBqB,EAAEyZ,QAAOzZ,EAAEyZ,MAAMsE,UAAW,GAChC/d,EAAEkB,GAAGI,UAAU8C,OAAO,GAAGpE,EAAErB,8BAI/BsB,KAAKga,eAAelB,oBAdT9Y,KAwBfP,SAASsF,EAAOgK,GACZ,MAAMhP,EAAIC,KAAKC,GACXF,EAAER,IACFQ,EAAER,GAAGwF,UAAoBjF,IAATiP,EAAqB,GAAK,CAACA,IAC/ChP,EAAES,KAAKqO,KAAK9J,EAAOgK,GASvBtP,iBAAiBkD,GACb,MAAM5C,EAAIC,KAAKC,GAETZ,EAAYU,EAAEV,UAEduD,EAAQD,EADW5C,EAAEqX,qBACezU,EAAKtD,GAC/C,IAAc,IAAVuD,EACA,OAAO,KAEX,MAAMH,EAAShB,EAAc,KACzB,CACIC,MAAO,GAAG3B,EAAErB,sBACZkkB,SAAU,IACVf,MAAOjf,GAEX,CACInB,EAAc,OAAQ,CAClBC,MAAO,GAAG3B,EAAErB,6BACZ6C,KAAM,mBASlB,OAJAvB,KAAK6iB,wBAAwBlgB,EAAMF,GAEnCA,EAAOvE,GAAcyE,EAEdF,EAUXhD,0BAA0BgD,EAAQqgB,GAC9B,MAAM/iB,EAAIC,KAAKC,GAEf,IAAI8iB,EACJ,GAAI,MAAM/Q,KAAK8Q,EAAiB1R,MAAO,CACnC,MAAM4R,EAAiCF,EACnCE,EAAOpjB,MAAQqjB,EACfF,EAAYhS,EAAKtO,EAAQ,IAAI1C,EAAErB,wBAAwBqB,EAAErB,iCAClDskB,EAAOpjB,MAAQsjB,IACtBH,EAAYI,EAAK1gB,EAAQ,IAAI1C,EAAErB,wBAAwBqB,EAAErB,sCAEtD,oBAAoBsT,KAAK8Q,EAAiB1R,QACjD2R,EAAYhS,EAAKtO,EAAQ,IAAI1C,EAAErB,wBAAwBqB,EAAErB,kCAG7D,MAAMiE,EAAOF,EAAOvE,GAAaF,EAAQ2E,EAAK5C,EAAET,WAEhD,QAAaQ,IAAT6C,EACA,GAAI3E,IAAU4X,EAAsB,CAChC,IAAI/T,EAAQ9B,EAAE2Y,cAAcqG,QAAO7X,IAAMA,EAAE9D,SAAQiY,MAAMtb,EAAEsX,eACvD+L,EAAgB,GAEpB,IAAK,IAAIzgB,KAAQd,EAAO,CACpB,IAAIwhB,EAAe,CAAErlB,MAAOA,EAAO2E,KAAMA,EAAM8S,QAAQ,GACvDzV,KAAK8E,SAAS,mBAAoBue,GAC7BA,EAAa5N,QACd2N,EAAchd,KAAKzD,GAG3B,GAAIygB,EAActd,OAAS,EAAG,CAC1B9F,KAAK6a,+BAA+B9a,EAAEqZ,aAAatT,OAAS,GAE5D,IAAK,IAAInD,KAAQygB,EAAe,CAE5B,IAAIvE,EAAM9e,EAAE2Y,cAAcrM,QAAQ1J,IACrB,IAATkc,IACAA,EAAM9e,EAAEwX,eAAelL,QAAQrO,EAAM+B,EAAET,cAC9B,IAATuf,IACA9e,EAAE2Y,cAAcvS,OAAO0Y,EAAK,GAC5B9e,EAAEwX,eAAepR,OAAO0Y,EAAK,GAC7B9e,EAAE4Y,kBAAmB,EACrB5Y,EAAE6Y,yBAA0B,IAKpC/W,EAAMiE,OAASsd,EAActd,QAC7B9F,KAAKohB,2BAGLgC,EAActd,OAAS,GACvB9F,KAAKwa,oBAEN,CACH,IAAI6I,EAAe,CAAErlB,MAAOA,EAAO2E,KAAMA,EAAM8S,QAAQ,GAEvD,GADAzV,KAAK8E,SAAS,mBAAoBue,GAC9BA,EAAa5N,OACb,OAAOzV,KAEXA,KAAKsjB,iBAAiB3gB,GAGtB3C,KAAK8E,SAAS,YAAa,CAAE9G,MAAOA,EAAO2E,KAAMA,IAczD,OAVKogB,IACDA,EAAYhjB,EAAEkB,GAAG6Y,cAAc,IAAI/Z,EAAErB,yBAAyBqB,EAAErB,gCAGhEuX,EAAS8M,EAAW,GAAGhjB,EAAErB,mCACzBqkB,EAAYA,EAAUjJ,cAAc,UAGxCiJ,GAAaA,EAAUtJ,QAEhBzZ,KAQXP,iBAAiBkD,EAAM4gB,GAAW,GAC9B,MAAMxjB,EAAIC,KAAKC,GACTX,EAAYS,EAAET,UAChBD,EAAYU,EAAEV,UACZrB,EAAQ2E,EAAKrD,GAGnB,IAAIuf,EAAM9e,EAAE2Y,cAAcrM,QAAQ1J,IACrB,IAATkc,IACAA,EAAM9e,EAAEwX,eAAelL,QAAQrO,KACtB,IAAT6gB,IACA9e,EAAE2Y,cAAcvS,OAAO0Y,EAAK,GAC5B9e,EAAEwX,eAAepR,OAAO0Y,EAAK,GAC7B9e,EAAE4Y,kBAAmB,EACrB5Y,EAAE6Y,yBAA0B,GAIhCiG,EAAM9e,EAAEqZ,aAAa8H,WAAUha,GAAKA,EAAEhJ,KAAgByE,KACzC,IAATkc,IACAA,EAAM9e,EAAEqZ,aAAa8H,WAAUha,GAAKA,EAAEhJ,GAAYoB,KAAetB,MACxD,IAAT6gB,GACA7e,KAAK6a,+BAA+BgE,GAGpC0E,IACAvjB,KAAKuc,cAAc5Z,EAAK5C,EAAEqX,qBAAuBzU,EAAKtD,IAEtDU,EAAEyZ,MAAMC,QAGR1Z,EAAEyZ,MAAME,eAAiB3Z,EAAEyZ,MAAMG,aAAe5Z,EAAEyZ,MAAMxb,MAAM8H,QAIlE9F,KAAKwa,gBAOT/a,cAAczB,GACV,MAAM+B,EAAIC,KAAKC,GAEfF,EAAEyZ,MAAMxb,MAAiB,MAATA,EAAgB,GAAKuT,OAAOvT,GAE5C+B,EAAEgZ,WAAa,GACfhZ,EAAEuY,cAAgB,KAClBvY,EAAEyY,cAAe,EAQrB/Y,eACI,MAAMM,EAAIC,KAAKC,GAAIgB,EAAKlB,EAAEkB,GAE1B,IAAKA,EAAGqK,aAAeR,SAASO,KAAKsB,SAAS1L,GAC1C,OAAOjB,KAEX,MAAMwZ,EAAQzZ,EAAEyZ,MAAOgK,EAAezjB,EAAEgb,gBAExC,IAAI0I,EAAajK,EAAMxb,OAASwb,EAAMlD,YACtCrR,EAAYhE,EAAI,GAAGlB,EAAErB,6BAA8B+kB,GACnDxe,EAAYhE,EAAI,GAAGlB,EAAErB,8BAA+B+kB,GAEpD,IAAIC,GAAY,EAEhB,GAAI3jB,EAAElB,OAAmC,IAA1BkB,EAAEqZ,aAAatT,QAAgB/F,EAAE+W,cAAe,CAE3D0C,EAAMrY,MAAM4G,MAAQ,GAEpB,IAAI4b,EAAc,EAAGC,EAAa,EAE9BC,EAAcza,iBAAiBrJ,EAAEmC,MAAQjB,EAAI,YAC7C4iB,EAAYC,SACY,SAAxBD,EAAYC,SACa,aAAzBD,EAAYnb,UACU,SAAtBmb,EAAYE,QACZJ,EAAcK,EAAsBjkB,EAAEmC,MAAQjB,EAAI,YAAY,GAAM,GAAM,IAG9E,IAAIgjB,EAAa7a,iBAAiBrJ,EAAEmC,MAAQjB,EAAI,WAC5CgjB,EAAWH,SACY,SAAvBG,EAAWH,SACa,aAAxBG,EAAWvb,UACU,SAArBub,EAAWF,QACXH,EAAaI,EAAsBjkB,EAAEmC,MAAQjB,EAAI,WAAW,GAAM,GAAM,IAG5E,IAAIijB,EAAejc,EAAgBlI,EAAEmC,MAAQjB,GAC7CijB,GAAgBP,EAAcC,EAE9BpK,EAAMrY,MAAM4G,MAAQ,GAAGmc,MAEvBR,GAAY,MACT,CAEHliB,EAAYgiB,EAAcW,EAAY3K,EAAOtD,IAC7CsN,EAAaxP,YAAcyP,EAC3BxiB,EAAG4L,YAAY2W,GAGf,MAAMY,EAAgBhb,iBAAiBoQ,GACjC6K,GAAgB7a,WAAW4a,EAAcE,cAAgB,IAAM9a,WAAW4a,EAAcG,eAAiB,GACzGC,EAA2D,KAA/Chb,WAAW4a,EAAc,eAAiB,GAAYC,EAClEI,EAAkBxc,EAAgBub,GAAc,GAAM,GACtDkB,EAAezc,EAAgBuR,GAAO,GAAM,GAClD,IAAImL,EAAW5a,KAAKC,IAAIya,EAAiBD,GAGzC,GAAIG,IAAaD,EAAc,CAE3BtQ,EAAgBoF,EAAOmL,GAAU,GAAM,GAEvC,IAAItQ,GAAgB7K,WAAW4a,EAAc9P,kBAAoB,IAAM9K,WAAW4a,EAAc7P,mBAAqB,GACjH/I,EAAcgO,EAAMhO,YAAc6I,EAEtC,GAAI7I,EAAcmZ,EAAU,CAExB,IAAInQ,EAAQhJ,EAAcmZ,EAC1BnL,EAAMrY,MAAM4G,MAAQ,GAAGyB,WAAWgQ,EAAMrY,MAAM4G,OAASyM,MAEvDmQ,GAAYnQ,EAKhB,GAAIzU,EAAE+a,gBACF/a,EAAE+a,cAAc3Z,MAAM4G,MAAQ,GAE1B0b,GAAY,CACZ,IAAI1b,EAAQ4c,EAAWN,EAAehQ,EAClCpM,EAAgBlI,EAAE+a,eAAe,GAAO,GAAS/S,GACjDqM,EAAgBrU,EAAE+a,cAAe/S,GAAO,GAAO,GAK3D2b,GAAY,EAIhBvf,EAAOqf,GAMX,OAHIE,GACA1jB,KAAK8E,SAAS,gBAEX9E,KAQXP,sBACI,MAAMM,EAAIC,KAAKC,GAAIgB,EAAKlB,EAAEkB,GAE1B,IAAKlB,EAAE4a,WAAa5a,EAAEmd,kBAAoBnd,EAAE4a,SAASvT,YACjD,OAAOpH,KAEX,MAAM4kB,EAAM3jB,EAAG4jB,wBACTC,EAAaF,EAAIjd,KAAO,IAAMid,EAAI5jB,IAAM,IAAM4jB,EAAIpc,MAAQ,IAAMoc,EAAI1c,OAO1E,OALInI,EAAE4a,SAASsF,qBAAuB6E,IAClC/kB,EAAE4a,SAASxN,SAASnN,KAAK4c,+BACzB7c,EAAE4a,SAASsF,mBAAqB6E,GAG7B9kB,KAOXP,oBAAoBsF,GAChB,MAAMhF,EAAIC,KAAKC,GAETsF,EAAqCR,EAAY,OAEvD,GAAIA,EAAMnF,MAAQsjB,GAAoBne,EAAMggB,SAAmC,IAAxBxf,EAAOvH,MAAM8H,OAChE9F,KAAK4O,QAEL7J,EAAMsK,sBACH,GAAItK,EAAMnF,MAAQsjB,GAA4C,IAAxB3d,EAAOvH,MAAM8H,OAAc,CACpE,MAAMrD,EAAS1C,EAAEqZ,aAAarZ,EAAEqZ,aAAatT,OAAS,GACtD,IAAKrD,QAAuC3C,IAA7B2C,EAAOvE,GAAYF,MAC9B,OAEJ,MAAM2E,EAAOF,EAAOvE,GAAaF,EAAQ2E,EAAK5C,EAAET,WAEhD,IAAI+jB,EAAe,CAAErlB,MAAOA,EAAO2E,KAAMA,EAAM8S,QAAQ,GAEvD,GADAzV,KAAK8E,SAAS,mBAAoBue,GAC9BA,EAAa5N,OACb,OAEJzV,KAAKsjB,iBAAiB3gB,GAAM,GAG5B3C,KAAK8E,SAAS,YAAa,CAAE9G,MAAOA,EAAO2E,KAAMA,IAEjDoC,EAAMsK,kBAQd5P,oBAAoBsF,GAChB,MAAMhF,EAAIC,KAAKC,GAEf,GAAIF,EAAEoW,SAAU,OAEhB,MAAM6O,EAA6C,QAArC5b,iBAAiBrJ,EAAEkB,IAAI2J,UAErC,IAAImY,EAEJ,GAAIhe,EAAMnF,OAASolB,EAAQC,EAAaC,GACpCnC,EAAYhS,EAAuBhM,EAAMQ,OAAQ,IAAIxF,EAAErB,wBAAwBqB,EAAErB,iCAC7EuX,EAAS8M,EAAW,GAAGhjB,EAAErB,mCACzBqkB,EAAYA,EAAUjJ,cAAc,UAExCiJ,GAAaA,EAAUtJ,QAEvB1U,EAAMsK,sBACH,GAAItK,EAAMnF,OAASolB,EAAQE,EAAcD,GAC5ClC,EAAYI,EAAuBpe,EAAMQ,OAAQ,IAAIxF,EAAErB,wBAAwBqB,EAAErB,iCAC7EuX,EAAS8M,EAAW,GAAGhjB,EAAErB,mCACzBqkB,EAAYA,EAAUjJ,cAAc,UAExCiJ,GAAaA,EAAUtJ,QAEvB1U,EAAMsK,sBACH,GAAItK,EAAMnF,MAAQsjB,GAAoBne,EAAMggB,QAAS,CACxD,MAAM3L,EAAe,GACrB,IAAI3W,EAASsC,EAAMQ,OACnB,KAAO9C,GACH2W,EAAahT,KAAK3D,GAClBA,EAAS0gB,EAAuB1gB,EAAQ,IAAI1C,EAAErB,uBAGlD,KAAO0a,EAAatT,QAChB9F,KAAKie,0BAA0B7E,EAAa+L,QAASpgB,GAGzDA,EAAMsK,sBACCtK,EAAMnF,MAAQqjB,GAAgBle,EAAMnF,MAAQsjB,IACnDljB,KAAKie,0BAA0B3Y,EAAaP,EAAMQ,OAAQ,IAAIxF,EAAErB,sBAAuBqB,EAAEkB,IAAK8D,GAC9FA,EAAMsK,kBAQd5P,8BAGI,MAAO,CACH8F,OAHMvF,KAAKC,GAGiBgB,GAC5BuG,OAAQ,CAAEN,EAAG,EAAGyB,EAAG,GACnBqC,OAAQ,CAAE9D,EAAG,QAASyB,EAAG,UACzBD,SAAU,CAAExB,EAAG,QAASyB,EAAG,OAC3BG,aAAa,GAKrBrJ,yBACI,MAAMM,EAAIC,KAAKC,GAEfD,KAAK0a,wBAEL3a,EAAEqlB,YAAcC,aAAY,WACpB1C,EAAY5iB,EAAEkB,MAAQ6J,UACtB9K,KAAKmR,SACV,KAIP1R,wBACI,MAAMM,EAAIC,KAAKC,GAEXF,EAAEqlB,cACFE,cAAcvlB,EAAEqlB,aAChBrlB,EAAEqlB,YAAc,MAaxB3lB,WAAWoC,EAAO2gB,EAAMzG,EAAkBwJ,GACtC,MAAMxlB,EAAIC,KAAKC,GAEf,IAAKuiB,IAASzG,EACV,OAAOla,EAEX,MAAMxC,EAAYU,EAAEV,UAChB+X,EAAqBrX,EAAEqX,mBACvB9X,EAAYS,EAAET,UACdoX,EAAe3W,EAAE2W,aACjBsF,EAAajc,EAAE4W,sBAAwBuL,EAAGC,KACtC,GAAqB,OAAjBzL,EAAuB,CACvB,IAAI0L,EAAK1L,EAAa+F,IAAIyF,EAAE5iB,IACxB+iB,EAAK3L,EAAa+F,IAAI0F,EAAE7iB,IAC5B,GAAI8iB,IAAOC,EAAI,OAAQ,EACvB,IAAKD,GAAMC,EAAI,OAAO,EAG1B,MAAMC,EAASJ,EAAE7iB,IAAc6iB,EAAE9K,GAC3BmL,EAASJ,EAAE9iB,IAAc8iB,EAAE/K,GAEjC,OAAIkL,EAASC,GAAgB,EACzBD,EAASC,EAAe,EAErB,IAGf,IAAIiD,EAAQ,GAAIC,EAAc,KAC1BC,EAAS,CAACF,GACd,MAAMG,EAAoB,IAAI/N,IAAI7X,EAAEwX,gBACpC,IAAI5U,EAAMqD,EAAG+M,EAGb,IAAK/M,EAAI,EAAG+M,EAAMlR,EAAMiE,OAAQE,EAAI+M,EAAK/M,IACrCrD,EAAOd,EAAMmE,GACTrD,EAAKS,QAAUoiB,EAAM1f,SACrB0f,EAAQ,GACRE,EAAOtf,KAAKof,IAEhBA,EAAMpf,KAAKzD,GAIV6iB,EAAM1f,SACP4f,EAAO5f,OAAS,GAIhB4Q,GAAgB7U,EAAMiE,OAAS,IAAMjE,EAAM,GAAGuB,SAC9CqiB,EAAcC,EAAO,GAAG3G,QAAO7X,GAAKwP,EAAa+F,IAAIvV,EAAE5H,MACnDmmB,EAAY3f,OAAS,IACrB4f,EAAO,GAAKA,EAAO,GAAG3G,QAAO7X,IAAMwP,EAAa+F,IAAIvV,EAAE5H,QAI1DkjB,GAEAkD,EAAOlD,MAAK,CAACN,EAAGC,KAIZ,GAHAD,EAAIA,EAAE,GACNC,EAAIA,EAAE,GAEe,OAAjBzL,EAAuB,CACvB,IAAI0L,EAAK1L,EAAa+F,IAAIyF,EAAE5iB,IACxB+iB,EAAK3L,EAAa+F,IAAI0F,EAAE7iB,IAC5B,GAAI8iB,IAAOC,EAAI,OAAQ,EACvB,IAAKD,GAAMC,EAAI,OAAO,EAI1B,OAAKH,EAAE9e,QAAU+e,EAAE/e,QAAgB,EAC/B8e,EAAE9e,SAAW+e,EAAE/e,OAAe,EAE3B4Y,EAAWkG,EAAGC,MAIzBsD,GAAeA,EAAY3f,OAAS,GACpC4f,EAAOE,QAAQH,GAOnB,MAAMI,EAAgB,GAAIC,EAAkB,GAG5C,IAAK,IAAIC,EAAI,EAAGC,EAAON,EAAO5f,OAAQigB,EAAIC,EAAMD,IAC5CP,EAAQE,EAAOK,GAGfP,EAAMhD,MAAK,CAACN,EAAGC,KAGX,GAAID,EAAE9e,SAAW+e,EAAE/e,OAAQ,OAAQ,EACnC,IAAK8e,EAAE9e,QAAU+e,EAAE/e,OAAQ,OAAO,EAElC,GAAI2Y,EAAkB,CAClB,MAAMkK,EAAWN,EAAkBlJ,IAAIyF,EAAE5iB,IACnC4mB,EAAWP,EAAkBlJ,IAAI0F,EAAE7iB,IAEzC,GAAI2mB,IAAaC,EAAU,OAAQ,EACnC,IAAKD,GAAYC,EAAU,OAAO,EAGtC,OAAI1D,EACOxG,EAAWkG,EAAGC,GAGlB,KAGX2D,EAAgB1f,KAAKof,GAGzB,GAAIzJ,GAAoBwJ,EAAoB,CAExC,IAAIY,EAGJ,IAAK,IAAIJ,EAAI,EAAGC,EAAON,EAAO5f,OAAQigB,EAAIC,EAAMD,IAG5C,GAFAP,EAAQE,EAAOK,GAEXP,IAAUC,EAAd,CASAU,EAAe,KAEf,IAAK,IAAIC,EAAK,EAAGC,EAAQb,EAAM1f,OAAQsgB,EAAKC,EAAOD,IAE/C,GADAzjB,EAAO6iB,EAAMY,IACTzjB,EAAKS,OAAT,CACA,IAAKuiB,EAAkBlJ,IAAI9Z,EAAK5C,EAAET,YAAa,MAE1C6mB,IACDA,EAAe,GACXX,EAAM,GAAGpiB,QACT+iB,EAAa/f,KAAKof,EAAM,KAIhCW,EAAa/f,KAAKzD,GAClB6iB,EAAMrf,OAAOigB,IAAM,GACnBC,IAGAF,IACAN,EAAczf,KAAK+f,IACE,IAAjBX,EAAM1f,QAAkC,IAAjB0f,EAAM1f,QAAgB0f,EAAM,GAAGpiB,UACtDsiB,EAAOvf,OAAO4f,IAAK,GACnBC,UAhCR,CACIH,EAAczf,KAAKqf,GACnB,IAAIa,EAAMR,EAAgBzZ,QAAQoZ,IACrB,IAATa,GACAR,EAAgB3f,OAAOmgB,EAAK,IAmC5C,MAAMC,EAAS,GACfA,EAAOzgB,OAASjE,EAAMiE,OACtB,IAAIU,EAAY,EAEhBkf,EAASG,EAAc/f,OACnB+f,EAAc/kB,OAAOglB,GACrBA,EAEJ,IAAK,IAAIC,EAAI,EAAGC,EAAON,EAAO5f,OAAQigB,EAAIC,EAAMD,IAG5C,IAFAP,EAAQE,EAAOK,GAEV/f,EAAI,EAAG+M,EAAMyS,EAAM1f,OAAQE,EAAI+M,EAAK/M,IACrCugB,EAAO/f,KAAegf,EAAMxf,GAIpC,OAAOugB"}