{"version":3,"file":"app.bb151f3a.js","sources":["../../../node_modules/jsuites/dist/jsuites.js","../../../node_modules/filepond/dist/filepond.esm.js","../../../node_modules/filepond-plugin-file-validate-type/dist/filepond-plugin-file-validate-type.esm.js","../../../node_modules/filepond-plugin-file-validate-size/dist/filepond-plugin-file-validate-size.esm.js","../../../resources/js/app.js"],"sourcesContent":["\n;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n global.jSuites = factory();\n}(this, (function () {\n\nvar jSuites;\n/******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 195:\n/***/ (function(module) {\n\n/**\r\n * (c) jSuites Javascript Plugins and Web Components (v4)\r\n *\r\n * Website: https://jsuites.net\r\n * Description: Create amazing web based applications.\r\n * Plugin: Organogram\r\n *\r\n * MIT License\r\n */\r\n\r\n;(function (global, factory) {\r\n true ? module.exports = factory() :\r\n 0;\r\n}(this, (function () {\r\n\r\n return (function(str) {\r\n function int64(msint_32, lsint_32) {\r\n this.highOrder = msint_32;\r\n this.lowOrder = lsint_32;\r\n }\r\n\r\n var H = [new int64(0x6a09e667, 0xf3bcc908), new int64(0xbb67ae85, 0x84caa73b),\r\n new int64(0x3c6ef372, 0xfe94f82b), new int64(0xa54ff53a, 0x5f1d36f1),\r\n new int64(0x510e527f, 0xade682d1), new int64(0x9b05688c, 0x2b3e6c1f),\r\n new int64(0x1f83d9ab, 0xfb41bd6b), new int64(0x5be0cd19, 0x137e2179)];\r\n\r\n var K = [new int64(0x428a2f98, 0xd728ae22), new int64(0x71374491, 0x23ef65cd),\r\n new int64(0xb5c0fbcf, 0xec4d3b2f), new int64(0xe9b5dba5, 0x8189dbbc),\r\n new int64(0x3956c25b, 0xf348b538), new int64(0x59f111f1, 0xb605d019),\r\n new int64(0x923f82a4, 0xaf194f9b), new int64(0xab1c5ed5, 0xda6d8118),\r\n new int64(0xd807aa98, 0xa3030242), new int64(0x12835b01, 0x45706fbe),\r\n new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, 0xd5ffb4e2),\r\n new int64(0x72be5d74, 0xf27b896f), new int64(0x80deb1fe, 0x3b1696b1),\r\n new int64(0x9bdc06a7, 0x25c71235), new int64(0xc19bf174, 0xcf692694),\r\n new int64(0xe49b69c1, 0x9ef14ad2), new int64(0xefbe4786, 0x384f25e3),\r\n new int64(0x0fc19dc6, 0x8b8cd5b5), new int64(0x240ca1cc, 0x77ac9c65),\r\n new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),\r\n new int64(0x5cb0a9dc, 0xbd41fbd4), new int64(0x76f988da, 0x831153b5),\r\n new int64(0x983e5152, 0xee66dfab), new int64(0xa831c66d, 0x2db43210),\r\n new int64(0xb00327c8, 0x98fb213f), new int64(0xbf597fc7, 0xbeef0ee4),\r\n new int64(0xc6e00bf3, 0x3da88fc2), new int64(0xd5a79147, 0x930aa725),\r\n new int64(0x06ca6351, 0xe003826f), new int64(0x14292967, 0x0a0e6e70),\r\n new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),\r\n new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, 0x9d95b3df),\r\n new int64(0x650a7354, 0x8baf63de), new int64(0x766a0abb, 0x3c77b2a8),\r\n new int64(0x81c2c92e, 0x47edaee6), new int64(0x92722c85, 0x1482353b),\r\n new int64(0xa2bfe8a1, 0x4cf10364), new int64(0xa81a664b, 0xbc423001),\r\n new int64(0xc24b8b70, 0xd0f89791), new int64(0xc76c51a3, 0x0654be30),\r\n new int64(0xd192e819, 0xd6ef5218), new int64(0xd6990624, 0x5565a910),\r\n new int64(0xf40e3585, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),\r\n new int64(0x19a4c116, 0xb8d2d0c8), new int64(0x1e376c08, 0x5141ab53),\r\n new int64(0x2748774c, 0xdf8eeb99), new int64(0x34b0bcb5, 0xe19b48a8),\r\n new int64(0x391c0cb3, 0xc5c95a63), new int64(0x4ed8aa4a, 0xe3418acb),\r\n new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, 0xd6b2b8a3),\r\n new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),\r\n new int64(0x84c87814, 0xa1f0ab72), new int64(0x8cc70208, 0x1a6439ec),\r\n new int64(0x90befffa, 0x23631e28), new int64(0xa4506ceb, 0xde82bde9),\r\n new int64(0xbef9a3f7, 0xb2c67915), new int64(0xc67178f2, 0xe372532b),\r\n new int64(0xca273ece, 0xea26619c), new int64(0xd186b8c7, 0x21c0c207),\r\n new int64(0xeada7dd6, 0xcde0eb1e), new int64(0xf57d4f7f, 0xee6ed178),\r\n new int64(0x06f067aa, 0x72176fba), new int64(0x0a637dc5, 0xa2c898a6),\r\n new int64(0x113f9804, 0xbef90dae), new int64(0x1b710b35, 0x131c471b),\r\n new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),\r\n new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, 0x9c100d4c),\r\n new int64(0x4cc5d4be, 0xcb3e42b6), new int64(0x597f299c, 0xfc657e2a),\r\n new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)];\r\n\r\n var W = new Array(64);\r\n var a, b, c, d, e, f, g, h, i, j;\r\n var T1, T2;\r\n var charsize = 8;\r\n\r\n function utf8_encode(str) {\r\n return unescape(encodeURIComponent(str));\r\n }\r\n\r\n function str2binb(str) {\r\n var bin = [];\r\n var mask = (1 << charsize) - 1;\r\n var len = str.length * charsize;\r\n\r\n for (var i = 0; i < len; i += charsize) {\r\n bin[i >> 5] |= (str.charCodeAt(i / charsize) & mask) << (32 - charsize - (i % 32));\r\n }\r\n\r\n return bin;\r\n }\r\n\r\n function binb2hex(binarray) {\r\n var hex_tab = \"0123456789abcdef\";\r\n var str = \"\";\r\n var length = binarray.length * 4;\r\n var srcByte;\r\n\r\n for (var i = 0; i < length; i += 1) {\r\n srcByte = binarray[i >> 2] >> ((3 - (i % 4)) * 8);\r\n str += hex_tab.charAt((srcByte >> 4) & 0xF) + hex_tab.charAt(srcByte & 0xF);\r\n }\r\n\r\n return str;\r\n }\r\n\r\n function safe_add_2(x, y) {\r\n var lsw, msw, lowOrder, highOrder;\r\n\r\n lsw = (x.lowOrder & 0xFFFF) + (y.lowOrder & 0xFFFF);\r\n msw = (x.lowOrder >>> 16) + (y.lowOrder >>> 16) + (lsw >>> 16);\r\n lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n lsw = (x.highOrder & 0xFFFF) + (y.highOrder & 0xFFFF) + (msw >>> 16);\r\n msw = (x.highOrder >>> 16) + (y.highOrder >>> 16) + (lsw >>> 16);\r\n highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n return new int64(highOrder, lowOrder);\r\n }\r\n\r\n function safe_add_4(a, b, c, d) {\r\n var lsw, msw, lowOrder, highOrder;\r\n\r\n lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF);\r\n msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (lsw >>> 16);\r\n lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (msw >>> 16);\r\n msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (lsw >>> 16);\r\n highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n return new int64(highOrder, lowOrder);\r\n }\r\n\r\n function safe_add_5(a, b, c, d, e) {\r\n var lsw, msw, lowOrder, highOrder;\r\n\r\n lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF) + (e.lowOrder & 0xFFFF);\r\n msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (e.lowOrder >>> 16) + (lsw >>> 16);\r\n lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (e.highOrder & 0xFFFF) + (msw >>> 16);\r\n msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (e.highOrder >>> 16) + (lsw >>> 16);\r\n highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n return new int64(highOrder, lowOrder);\r\n }\r\n\r\n function maj(x, y, z) {\r\n return new int64(\r\n (x.highOrder & y.highOrder) ^ (x.highOrder & z.highOrder) ^ (y.highOrder & z.highOrder),\r\n (x.lowOrder & y.lowOrder) ^ (x.lowOrder & z.lowOrder) ^ (y.lowOrder & z.lowOrder)\r\n );\r\n }\r\n\r\n function ch(x, y, z) {\r\n return new int64(\r\n (x.highOrder & y.highOrder) ^ (~x.highOrder & z.highOrder),\r\n (x.lowOrder & y.lowOrder) ^ (~x.lowOrder & z.lowOrder)\r\n );\r\n }\r\n\r\n function rotr(x, n) {\r\n if (n <= 32) {\r\n return new int64(\r\n (x.highOrder >>> n) | (x.lowOrder << (32 - n)),\r\n (x.lowOrder >>> n) | (x.highOrder << (32 - n))\r\n );\r\n } else {\r\n return new int64(\r\n (x.lowOrder >>> n) | (x.highOrder << (32 - n)),\r\n (x.highOrder >>> n) | (x.lowOrder << (32 - n))\r\n );\r\n }\r\n }\r\n\r\n function sigma0(x) {\r\n var rotr28 = rotr(x, 28);\r\n var rotr34 = rotr(x, 34);\r\n var rotr39 = rotr(x, 39);\r\n\r\n return new int64(\r\n rotr28.highOrder ^ rotr34.highOrder ^ rotr39.highOrder,\r\n rotr28.lowOrder ^ rotr34.lowOrder ^ rotr39.lowOrder\r\n );\r\n }\r\n\r\n function sigma1(x) {\r\n var rotr14 = rotr(x, 14);\r\n var rotr18 = rotr(x, 18);\r\n var rotr41 = rotr(x, 41);\r\n\r\n return new int64(\r\n rotr14.highOrder ^ rotr18.highOrder ^ rotr41.highOrder,\r\n rotr14.lowOrder ^ rotr18.lowOrder ^ rotr41.lowOrder\r\n );\r\n }\r\n\r\n function gamma0(x) {\r\n var rotr1 = rotr(x, 1), rotr8 = rotr(x, 8), shr7 = shr(x, 7);\r\n\r\n return new int64(\r\n rotr1.highOrder ^ rotr8.highOrder ^ shr7.highOrder,\r\n rotr1.lowOrder ^ rotr8.lowOrder ^ shr7.lowOrder\r\n );\r\n }\r\n\r\n function gamma1(x) {\r\n var rotr19 = rotr(x, 19);\r\n var rotr61 = rotr(x, 61);\r\n var shr6 = shr(x, 6);\r\n\r\n return new int64(\r\n rotr19.highOrder ^ rotr61.highOrder ^ shr6.highOrder,\r\n rotr19.lowOrder ^ rotr61.lowOrder ^ shr6.lowOrder\r\n );\r\n }\r\n\r\n function shr(x, n) {\r\n if (n <= 32) {\r\n return new int64(\r\n x.highOrder >>> n,\r\n x.lowOrder >>> n | (x.highOrder << (32 - n))\r\n );\r\n } else {\r\n return new int64(\r\n 0,\r\n x.highOrder << (32 - n)\r\n );\r\n }\r\n }\r\n\r\n var str = utf8_encode(str);\r\n var strlen = str.length*charsize;\r\n str = str2binb(str);\r\n\r\n str[strlen >> 5] |= 0x80 << (24 - strlen % 32);\r\n str[(((strlen + 128) >> 10) << 5) + 31] = strlen;\r\n\r\n for (var i = 0; i < str.length; i += 32) {\r\n a = H[0];\r\n b = H[1];\r\n c = H[2];\r\n d = H[3];\r\n e = H[4];\r\n f = H[5];\r\n g = H[6];\r\n h = H[7];\r\n\r\n for (var j = 0; j < 80; j++) {\r\n if (j < 16) {\r\n W[j] = new int64(str[j*2 + i], str[j*2 + i + 1]);\r\n } else {\r\n W[j] = safe_add_4(gamma1(W[j - 2]), W[j - 7], gamma0(W[j - 15]), W[j - 16]);\r\n }\r\n\r\n T1 = safe_add_5(h, sigma1(e), ch(e, f, g), K[j], W[j]);\r\n T2 = safe_add_2(sigma0(a), maj(a, b, c));\r\n h = g;\r\n g = f;\r\n f = e;\r\n e = safe_add_2(d, T1);\r\n d = c;\r\n c = b;\r\n b = a;\r\n a = safe_add_2(T1, T2);\r\n }\r\n\r\n H[0] = safe_add_2(a, H[0]);\r\n H[1] = safe_add_2(b, H[1]);\r\n H[2] = safe_add_2(c, H[2]);\r\n H[3] = safe_add_2(d, H[3]);\r\n H[4] = safe_add_2(e, H[4]);\r\n H[5] = safe_add_2(f, H[5]);\r\n H[6] = safe_add_2(g, H[6]);\r\n H[7] = safe_add_2(h, H[7]);\r\n }\r\n\r\n var binarray = [];\r\n for (var i = 0; i < H.length; i++) {\r\n binarray.push(H[i].highOrder);\r\n binarray.push(H[i].lowOrder);\r\n }\r\n\r\n return binb2hex(binarray);\r\n });\r\n\r\n})));\r\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be in strict mode.\n!function() {\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ jsuites; }\n});\n\n;// CONCATENATED MODULE: ./src/utils/dictionary.js\n// Update dictionary\r\nvar setDictionary = function(d) {\r\n if (! document.dictionary) {\r\n document.dictionary = {}\r\n }\r\n // Replace the key into the dictionary and append the new ones\r\n var t = null;\r\n var i = null;\r\n var k = Object.keys(d);\r\n for (i = 0; i < k.length; i++) {\r\n document.dictionary[k[i]] = d[k[i]];\r\n }\r\n}\r\n\r\n// Translate\r\nvar translate = function(t) {\r\n if (typeof(document) !== \"undefined\" && document.dictionary) {\r\n return document.dictionary[t] || t;\r\n } else {\r\n return t;\r\n }\r\n}\r\n\r\n\r\n/* harmony default export */ var dictionary = ({ setDictionary, translate });\n;// CONCATENATED MODULE: ./src/utils/tracking.js\n const Tracking = function(component, state) {\r\n if (state === true) {\r\n window['jSuitesStateControl'] = window['jSuitesStateControl'].filter(function(v) {\r\n return v !== null;\r\n });\r\n\r\n // Start after all events\r\n setTimeout(function() {\r\n window['jSuitesStateControl'].push(component);\r\n }, 0);\r\n\r\n } else {\r\n var index = window['jSuitesStateControl'].indexOf(component);\r\n if (index >= 0) {\r\n window['jSuitesStateControl'].splice(index, 1);\r\n }\r\n }\r\n}\r\n\r\n/* harmony default export */ var tracking = (Tracking);\n;// CONCATENATED MODULE: ./src/utils/helpers.js\nvar Helpers = {};\r\n\r\n// Two digits\r\nHelpers.two = function(value) {\r\n value = '' + value;\r\n if (value.length == 1) {\r\n value = '0' + value;\r\n }\r\n return value;\r\n}\r\n\r\nHelpers.focus = function(el) {\r\n if (el.innerText.length) {\r\n var range = document.createRange();\r\n var sel = window.getSelection();\r\n var node = el.childNodes[el.childNodes.length-1];\r\n range.setStart(node, node.length)\r\n range.collapse(true)\r\n sel.removeAllRanges()\r\n sel.addRange(range)\r\n el.scrollLeft = el.scrollWidth;\r\n }\r\n}\r\n\r\nHelpers.isNumeric = (function (num) {\r\n if (typeof(num) === 'string') {\r\n num = num.trim();\r\n }\r\n return !isNaN(num) && num !== null && num !== '';\r\n});\r\n\r\nHelpers.guid = function() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n}\r\n\r\nHelpers.getNode = function() {\r\n var node = document.getSelection().anchorNode;\r\n if (node) {\r\n return (node.nodeType == 3 ? node.parentNode : node);\r\n } else {\r\n return null;\r\n }\r\n}\r\n/**\r\n * Generate hash from a string\r\n */\r\nHelpers.hash = function(str) {\r\n var hash = 0, i, chr;\r\n\r\n if (str.length === 0) {\r\n return hash;\r\n } else {\r\n for (i = 0; i < str.length; i++) {\r\n chr = str.charCodeAt(i);\r\n if (chr > 32) {\r\n hash = ((hash << 5) - hash) + chr;\r\n hash |= 0;\r\n }\r\n }\r\n }\r\n return hash;\r\n}\r\n\r\n/**\r\n * Generate a random color\r\n */\r\nHelpers.randomColor = function(h) {\r\n var lum = -0.25;\r\n var hex = String('#' + Math.random().toString(16).slice(2, 8).toUpperCase()).replace(/[^0-9a-f]/gi, '');\r\n if (hex.length < 6) {\r\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\r\n }\r\n var rgb = [], c, i;\r\n for (i = 0; i < 3; i++) {\r\n c = parseInt(hex.substr(i * 2, 2), 16);\r\n c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);\r\n rgb.push((\"00\" + c).substr(c.length));\r\n }\r\n\r\n // Return hex\r\n if (h == true) {\r\n return '#' + Helpers.two(rgb[0].toString(16)) + Helpers.two(rgb[1].toString(16)) + Helpers.two(rgb[2].toString(16));\r\n }\r\n\r\n return rgb;\r\n}\r\n\r\nHelpers.getWindowWidth = function() {\r\n var w = window,\r\n d = document,\r\n e = d.documentElement,\r\n g = d.getElementsByTagName('body')[0],\r\n x = w.innerWidth || e.clientWidth || g.clientWidth;\r\n return x;\r\n}\r\n\r\nHelpers.getWindowHeight = function() {\r\n var w = window,\r\n d = document,\r\n e = d.documentElement,\r\n g = d.getElementsByTagName('body')[0],\r\n y = w.innerHeight|| e.clientHeight|| g.clientHeight;\r\n return y;\r\n}\r\n\r\nHelpers.getPosition = function(e) {\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n var x = e.changedTouches[0].pageX;\r\n var y = e.changedTouches[0].pageY;\r\n } else {\r\n var x = (window.Event) ? e.pageX : e.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);\r\n var y = (window.Event) ? e.pageY : e.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);\r\n }\r\n\r\n return [ x, y ];\r\n}\r\n\r\nHelpers.click = function(el) {\r\n if (el.click) {\r\n el.click();\r\n } else {\r\n var evt = new MouseEvent('click', {\r\n bubbles: true,\r\n cancelable: true,\r\n view: window\r\n });\r\n el.dispatchEvent(evt);\r\n }\r\n}\r\n\r\nHelpers.findElement = function(element, condition) {\r\n var foundElement = false;\r\n\r\n function path (element) {\r\n if (element && ! foundElement) {\r\n if (typeof(condition) == 'function') {\r\n foundElement = condition(element)\r\n } else if (typeof(condition) == 'string') {\r\n if (element.classList && element.classList.contains(condition)) {\r\n foundElement = element;\r\n }\r\n }\r\n }\r\n\r\n if (element.parentNode && ! foundElement) {\r\n path(element.parentNode);\r\n }\r\n }\r\n\r\n path(element);\r\n\r\n return foundElement;\r\n}\r\n\r\n/* harmony default export */ var helpers = (Helpers);\n;// CONCATENATED MODULE: ./src/utils/path.js\nfunction Path(str, val, remove) {\r\n str = str.split('.');\r\n if (str.length) {\r\n let o = this;\r\n let p = null;\r\n while (str.length > 1) {\r\n // Get the property\r\n p = str.shift();\r\n // Check if the property exists\r\n if (o.hasOwnProperty(p)) {\r\n o = o[p];\r\n } else {\r\n // Property does not exists\r\n if (typeof(val) === 'undefined') {\r\n return undefined;\r\n } else {\r\n // Create the property\r\n o[p] = {};\r\n // Next property\r\n o = o[p];\r\n }\r\n }\r\n }\r\n // Get the property\r\n p = str.shift();\r\n // Set or get the value\r\n if (typeof(val) !== 'undefined') {\r\n if (remove === true) {\r\n delete o[p];\r\n } else {\r\n o[p] = val;\r\n }\r\n // Success\r\n return true;\r\n } else {\r\n // Return the value\r\n if (o) {\r\n return o[p];\r\n }\r\n }\r\n }\r\n // Something went wrong\r\n return false;\r\n}\n;// CONCATENATED MODULE: ./src/utils/sorting.js\nfunction Sorting(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n var defaults = {\r\n pointer: null,\r\n direction: null,\r\n ondragstart: null,\r\n ondragend: null,\r\n ondrop: null,\r\n }\r\n\r\n var dragElement = null;\r\n\r\n // Loop through the initial configuration\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n el.classList.add('jsorting');\r\n\r\n el.addEventListener('dragstart', function(e) {\r\n let target = e.target;\r\n if (target.nodeType === 3) {\r\n if (target.parentNode.getAttribute('draggable') === 'true') {\r\n target = target.parentNode;\r\n } else {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return;\r\n }\r\n }\r\n\r\n if (target.getAttribute('draggable') === 'true') {\r\n let position = Array.prototype.indexOf.call(target.parentNode.children, target);\r\n dragElement = {\r\n element: target,\r\n o: position,\r\n d: position\r\n }\r\n target.style.opacity = '0.25';\r\n\r\n if (typeof (obj.options.ondragstart) == 'function') {\r\n obj.options.ondragstart(el, target, e);\r\n }\r\n\r\n e.dataTransfer.setDragImage(target,0,0);\r\n }\r\n });\r\n\r\n el.addEventListener('dragover', function(e) {\r\n e.preventDefault();\r\n\r\n if (dragElement) {\r\n if (getElement(e.target)) {\r\n if (e.target.getAttribute('draggable') == 'true' && dragElement.element != e.target) {\r\n if (!obj.options.direction) {\r\n var condition = e.target.clientHeight / 2 > e.offsetY;\r\n } else {\r\n var condition = e.target.clientWidth / 2 > e.offsetX;\r\n }\r\n\r\n if (condition) {\r\n e.target.parentNode.insertBefore(dragElement.element, e.target);\r\n } else {\r\n e.target.parentNode.insertBefore(dragElement.element, e.target.nextSibling);\r\n }\r\n\r\n dragElement.d = Array.prototype.indexOf.call(e.target.parentNode.children, dragElement.element);\r\n }\r\n }\r\n }\r\n });\r\n\r\n el.addEventListener('dragleave', function(e) {\r\n e.preventDefault();\r\n });\r\n\r\n el.addEventListener('dragend', function(e) {\r\n e.preventDefault();\r\n\r\n if (dragElement) {\r\n if (typeof(obj.options.ondragend) == 'function') {\r\n obj.options.ondragend(el, dragElement.element, e);\r\n }\r\n\r\n // Cancelled put element to the original position\r\n if (dragElement.o < dragElement.d) {\r\n e.target.parentNode.insertBefore(dragElement.element, e.target.parentNode.children[dragElement.o]);\r\n } else {\r\n e.target.parentNode.insertBefore(dragElement.element, e.target.parentNode.children[dragElement.o].nextSibling);\r\n }\r\n\r\n dragElement.element.style.opacity = '';\r\n dragElement = null;\r\n }\r\n });\r\n\r\n el.addEventListener('drop', function(e) {\r\n e.preventDefault();\r\n\r\n if (dragElement) {\r\n if (dragElement.o !== dragElement.d) {\r\n if (typeof (obj.options.ondrop) == 'function') {\r\n obj.options.ondrop(el, dragElement.o, dragElement.d, dragElement.element, e.target, e);\r\n }\r\n }\r\n\r\n dragElement.element.style.opacity = '';\r\n dragElement = null;\r\n }\r\n });\r\n\r\n var getElement = function(element) {\r\n var sorting = false;\r\n\r\n function path (element) {\r\n if (element.className) {\r\n if (element.classList.contains('jsorting')) {\r\n sorting = true;\r\n }\r\n }\r\n\r\n if (! sorting) {\r\n path(element.parentNode);\r\n }\r\n }\r\n\r\n path(element);\r\n\r\n return sorting;\r\n }\r\n\r\n for (var i = 0; i < el.children.length; i++) {\r\n if (! el.children[i].hasAttribute('draggable')) {\r\n el.children[i].setAttribute('draggable', 'true');\r\n }\r\n }\r\n\r\n el.val = function() {\r\n var id = null;\r\n var data = [];\r\n for (var i = 0; i < el.children.length; i++) {\r\n if (id = el.children[i].getAttribute('data-id')) {\r\n data.push(id);\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n return el;\r\n}\n;// CONCATENATED MODULE: ./src/utils/lazyloading.js\nfunction LazyLoading(el, options) {\r\n var obj = {}\r\n\r\n // Mandatory options\r\n if (! options.loadUp || typeof(options.loadUp) != 'function') {\r\n options.loadUp = function() {\r\n return false;\r\n }\r\n }\r\n if (! options.loadDown || typeof(options.loadDown) != 'function') {\r\n options.loadDown = function() {\r\n return false;\r\n }\r\n }\r\n // Timer ms\r\n if (! options.timer) {\r\n options.timer = 100;\r\n }\r\n\r\n // Timer\r\n var timeControlLoading = null;\r\n\r\n // Controls\r\n var scrollControls = function(e) {\r\n if (timeControlLoading == null) {\r\n var event = false;\r\n var scrollTop = el.scrollTop;\r\n if (el.scrollTop + (el.clientHeight * 2) >= el.scrollHeight) {\r\n if (options.loadDown()) {\r\n if (scrollTop == el.scrollTop) {\r\n el.scrollTop = el.scrollTop - (el.clientHeight);\r\n }\r\n event = true;\r\n }\r\n } else if (el.scrollTop <= el.clientHeight) {\r\n if (options.loadUp()) {\r\n if (scrollTop == el.scrollTop) {\r\n el.scrollTop = el.scrollTop + (el.clientHeight);\r\n }\r\n event = true;\r\n }\r\n }\r\n\r\n timeControlLoading = setTimeout(function() {\r\n timeControlLoading = null;\r\n }, options.timer);\r\n\r\n if (event) {\r\n if (typeof(options.onupdate) == 'function') {\r\n options.onupdate();\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Onscroll\r\n el.onscroll = function(e) {\r\n scrollControls(e);\r\n }\r\n\r\n el.onwheel = function(e) {\r\n scrollControls(e);\r\n }\r\n\r\n return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/ajax.js\nfunction Ajax() {\r\n var Component = (function(options, complete) {\r\n if (Array.isArray(options)) {\r\n // Create multiple request controller\r\n var multiple = {\r\n instance: [],\r\n complete: complete,\r\n }\r\n\r\n if (options.length > 0) {\r\n for (var i = 0; i < options.length; i++) {\r\n options[i].multiple = multiple;\r\n multiple.instance.push(Component(options[i]));\r\n }\r\n }\r\n\r\n return multiple;\r\n }\r\n\r\n if (! options.data) {\r\n options.data = {};\r\n }\r\n\r\n if (options.type) {\r\n options.method = options.type;\r\n }\r\n\r\n // Default method\r\n if (! options.method) {\r\n options.method = 'GET';\r\n }\r\n\r\n // Default type\r\n if (! options.dataType) {\r\n options.dataType = 'json';\r\n }\r\n\r\n if (options.data) {\r\n // Parse object to variables format\r\n var parseData = function (value, key) {\r\n var vars = [];\r\n if (value) {\r\n var keys = Object.keys(value);\r\n if (keys.length) {\r\n for (var i = 0; i < keys.length; i++) {\r\n if (key) {\r\n var k = key + '[' + keys[i] + ']';\r\n } else {\r\n var k = keys[i];\r\n }\r\n\r\n if (value[k] instanceof FileList) {\r\n vars[k] = value[keys[i]];\r\n } else if (value[keys[i]] === null || value[keys[i]] === undefined) {\r\n vars[k] = '';\r\n } else if (typeof(value[keys[i]]) == 'object') {\r\n var r = parseData(value[keys[i]], k);\r\n var o = Object.keys(r);\r\n for (var j = 0; j < o.length; j++) {\r\n vars[o[j]] = r[o[j]];\r\n }\r\n } else {\r\n vars[k] = value[keys[i]];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return vars;\r\n }\r\n\r\n var d = parseData(options.data);\r\n var k = Object.keys(d);\r\n\r\n // Data form\r\n if (options.method == 'GET') {\r\n if (k.length) {\r\n var data = [];\r\n for (var i = 0; i < k.length; i++) {\r\n data.push(k[i] + '=' + encodeURIComponent(d[k[i]]));\r\n }\r\n\r\n if (options.url.indexOf('?') < 0) {\r\n options.url += '?';\r\n }\r\n options.url += data.join('&');\r\n }\r\n } else {\r\n var data = new FormData();\r\n for (var i = 0; i < k.length; i++) {\r\n if (d[k[i]] instanceof FileList) {\r\n if (d[k[i]].length) {\r\n for (var j = 0; j < d[k[i]].length; j++) {\r\n data.append(k[i], d[k[i]][j], d[k[i]][j].name);\r\n }\r\n }\r\n } else {\r\n data.append(k[i], d[k[i]]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n var httpRequest = new XMLHttpRequest();\r\n httpRequest.open(options.method, options.url, true);\r\n\r\n if (options.requestedWith) {\r\n httpRequest.setRequestHeader('X-Requested-With', options.requestedWith);\r\n } else {\r\n if (options.requestedWith !== false) {\r\n httpRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n }\r\n }\r\n\r\n // Content type\r\n if (options.contentType) {\r\n httpRequest.setRequestHeader('Content-Type', options.contentType);\r\n }\r\n\r\n // Headers\r\n if (options.method === 'POST') {\r\n httpRequest.setRequestHeader('Accept', 'application/json');\r\n } else {\r\n if (options.dataType === 'blob') {\r\n httpRequest.responseType = \"blob\";\r\n } else {\r\n if (! options.contentType) {\r\n if (options.dataType === 'json') {\r\n httpRequest.setRequestHeader('Content-Type', 'text/json');\r\n } else if (options.dataType === 'html') {\r\n httpRequest.setRequestHeader('Content-Type', 'text/html');\r\n }\r\n }\r\n }\r\n }\r\n\r\n // No cache\r\n if (options.cache !== true) {\r\n httpRequest.setRequestHeader('pragma', 'no-cache');\r\n httpRequest.setRequestHeader('cache-control', 'no-cache');\r\n }\r\n\r\n // Authentication\r\n if (options.withCredentials === true) {\r\n httpRequest.withCredentials = true\r\n }\r\n\r\n // Before send\r\n if (typeof(options.beforeSend) == 'function') {\r\n options.beforeSend(httpRequest);\r\n }\r\n\r\n // Before send\r\n if (typeof(Component.beforeSend) == 'function') {\r\n Component.beforeSend(httpRequest);\r\n }\r\n\r\n if (document.ajax && typeof(document.ajax.beforeSend) == 'function') {\r\n document.ajax.beforeSend(httpRequest);\r\n }\r\n\r\n httpRequest.onerror = function() {\r\n if (options.error && typeof(options.error) == 'function') {\r\n options.error({\r\n message: 'Network error: Unable to reach the server.',\r\n status: 0\r\n });\r\n }\r\n }\r\n\r\n httpRequest.ontimeout = function() {\r\n if (options.error && typeof(options.error) == 'function') {\r\n options.error({\r\n message: 'Request timed out after ' + httpRequest.timeout + 'ms.',\r\n status: 0\r\n });\r\n }\r\n }\r\n\r\n httpRequest.onload = function() {\r\n if (httpRequest.status >= 200 && httpRequest.status < 300) {\r\n if (options.dataType === 'json') {\r\n try {\r\n var result = JSON.parse(httpRequest.responseText);\r\n\r\n if (options.success && typeof(options.success) == 'function') {\r\n options.success(result);\r\n }\r\n } catch(err) {\r\n if (options.error && typeof(options.error) == 'function') {\r\n options.error(err, result);\r\n }\r\n }\r\n } else {\r\n if (options.dataType === 'blob') {\r\n var result = httpRequest.response;\r\n } else {\r\n var result = httpRequest.responseText;\r\n }\r\n\r\n if (options.success && typeof(options.success) == 'function') {\r\n options.success(result);\r\n }\r\n }\r\n } else {\r\n if (options.error && typeof(options.error) == 'function') {\r\n options.error(httpRequest.responseText, httpRequest.status);\r\n }\r\n }\r\n\r\n // Global queue\r\n if (Component.queue && Component.queue.length > 0) {\r\n Component.send(Component.queue.shift());\r\n }\r\n\r\n // Global complete method\r\n if (Component.requests && Component.requests.length) {\r\n // Get index of this request in the container\r\n var index = Component.requests.indexOf(httpRequest);\r\n // Remove from the ajax requests container\r\n Component.requests.splice(index, 1);\r\n // Deprecated: Last one?\r\n if (! Component.requests.length) {\r\n // Object event\r\n if (options.complete && typeof(options.complete) == 'function') {\r\n options.complete(result);\r\n }\r\n }\r\n // Group requests\r\n if (options.group) {\r\n if (Component.oncomplete && typeof(Component.oncomplete[options.group]) == 'function') {\r\n if (! Component.pending(options.group)) {\r\n Component.oncomplete[options.group]();\r\n Component.oncomplete[options.group] = null;\r\n }\r\n }\r\n }\r\n // Multiple requests controller\r\n if (options.multiple && options.multiple.instance) {\r\n // Get index of this request in the container\r\n var index = options.multiple.instance.indexOf(httpRequest);\r\n // Remove from the ajax requests container\r\n options.multiple.instance.splice(index, 1);\r\n // If this is the last one call method complete\r\n if (! options.multiple.instance.length) {\r\n if (options.multiple.complete && typeof(options.multiple.complete) == 'function') {\r\n options.multiple.complete(result);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Keep the options\r\n httpRequest.options = options;\r\n // Data\r\n httpRequest.data = data;\r\n\r\n // Queue\r\n if (options.queue === true && Component.requests.length > 0) {\r\n Component.queue.push(httpRequest);\r\n } else {\r\n Component.send(httpRequest)\r\n }\r\n\r\n return httpRequest;\r\n });\r\n\r\n Component.send = function(httpRequest) {\r\n if (httpRequest.data) {\r\n if (Array.isArray(httpRequest.data)) {\r\n httpRequest.send(httpRequest.data.join('&'));\r\n } else {\r\n httpRequest.send(httpRequest.data);\r\n }\r\n } else {\r\n httpRequest.send();\r\n }\r\n\r\n Component.requests.push(httpRequest);\r\n }\r\n\r\n Component.exists = function(url, __callback) {\r\n var http = new XMLHttpRequest();\r\n http.open('HEAD', url, false);\r\n http.send();\r\n if (http.status) {\r\n __callback(http.status);\r\n }\r\n }\r\n\r\n Component.pending = function(group) {\r\n var n = 0;\r\n var o = Component.requests;\r\n if (o && o.length) {\r\n for (var i = 0; i < o.length; i++) {\r\n if (! group || group == o[i].options.group) {\r\n n++\r\n }\r\n }\r\n }\r\n return n;\r\n }\r\n\r\n Component.oncomplete = {};\r\n Component.requests = [];\r\n Component.queue = [];\r\n\r\n return Component\r\n}\r\n\r\n/* harmony default export */ var ajax = (Ajax());\n;// CONCATENATED MODULE: ./src/plugins/animation.js\nfunction Animation() {\r\n const Component = {\r\n loading: {}\r\n }\r\n \r\n Component.loading.show = function(timeout) {\r\n if (! Component.loading.element) {\r\n Component.loading.element = document.createElement('div');\r\n Component.loading.element.className = 'jloading';\r\n }\r\n document.body.appendChild(Component.loading.element);\r\n \r\n // Max timeout in seconds\r\n if (timeout > 0) {\r\n setTimeout(function() {\r\n Component.loading.hide();\r\n }, timeout * 1000)\r\n }\r\n }\r\n \r\n Component.loading.hide = function() {\r\n if (Component.loading.element && Component.loading.element.parentNode) {\r\n document.body.removeChild(Component.loading.element);\r\n }\r\n }\r\n \r\n Component.slideLeft = function (element, direction, done) {\r\n if (direction == true) {\r\n element.classList.add('jslide-left-in');\r\n setTimeout(function () {\r\n element.classList.remove('jslide-left-in');\r\n if (typeof (done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n } else {\r\n element.classList.add('jslide-left-out');\r\n setTimeout(function () {\r\n element.classList.remove('jslide-left-out');\r\n if (typeof (done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n }\r\n }\r\n \r\n Component.slideRight = function (element, direction, done) {\r\n if (direction === true) {\r\n element.classList.add('jslide-right-in');\r\n setTimeout(function () {\r\n element.classList.remove('jslide-right-in');\r\n if (typeof (done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n } else {\r\n element.classList.add('jslide-right-out');\r\n setTimeout(function () {\r\n element.classList.remove('jslide-right-out');\r\n if (typeof (done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n }\r\n }\r\n \r\n Component.slideTop = function (element, direction, done) {\r\n if (direction === true) {\r\n element.classList.add('jslide-top-in');\r\n setTimeout(function () {\r\n element.classList.remove('jslide-top-in');\r\n if (typeof (done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n } else {\r\n element.classList.add('jslide-top-out');\r\n setTimeout(function () {\r\n element.classList.remove('jslide-top-out');\r\n if (typeof (done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n }\r\n }\r\n \r\n Component.slideBottom = function (element, direction, done) {\r\n if (direction === true) {\r\n element.classList.add('jslide-bottom-in');\r\n setTimeout(function () {\r\n element.classList.remove('jslide-bottom-in');\r\n if (typeof (done) == 'function') {\r\n done();\r\n }\r\n }, 400);\r\n } else {\r\n element.classList.add('jslide-bottom-out');\r\n setTimeout(function () {\r\n element.classList.remove('jslide-bottom-out');\r\n if (typeof (done) == 'function') {\r\n done();\r\n }\r\n }, 100);\r\n }\r\n }\r\n \r\n Component.fadeIn = function (element, done) {\r\n element.style.display = '';\r\n element.classList.add('jfade-in');\r\n setTimeout(function () {\r\n element.classList.remove('jfade-in');\r\n if (typeof (done) == 'function') {\r\n done();\r\n }\r\n }, 2000);\r\n }\r\n \r\n Component.fadeOut = function (element, done) {\r\n element.classList.add('jfade-out');\r\n setTimeout(function () {\r\n element.style.display = 'none';\r\n element.classList.remove('jfade-out');\r\n if (typeof (done) == 'function') {\r\n done();\r\n }\r\n }, 1000);\r\n }\r\n\r\n return Component;\r\n}\r\n\r\n/* harmony default export */ var animation = (Animation());\n;// CONCATENATED MODULE: ./src/utils/helpers.date.js\n\r\n\r\n\r\nfunction HelpersDate() {\r\n var Component = {};\r\n\r\n Component.now = function (date, dateOnly) {\r\n var y = null;\r\n var m = null;\r\n var d = null;\r\n var h = null;\r\n var i = null;\r\n var s = null;\r\n\r\n if (Array.isArray(date)) {\r\n y = date[0];\r\n m = date[1];\r\n d = date[2];\r\n h = date[3];\r\n i = date[4];\r\n s = date[5];\r\n } else {\r\n if (! date) {\r\n date = new Date();\r\n }\r\n y = date.getFullYear();\r\n m = date.getMonth() + 1;\r\n d = date.getDate();\r\n h = date.getHours();\r\n i = date.getMinutes();\r\n s = date.getSeconds();\r\n }\r\n\r\n if (dateOnly == true) {\r\n return helpers.two(y) + '-' + helpers.two(m) + '-' + helpers.two(d);\r\n } else {\r\n return helpers.two(y) + '-' + helpers.two(m) + '-' + helpers.two(d) + ' ' + helpers.two(h) + ':' + helpers.two(i) + ':' + helpers.two(s);\r\n }\r\n }\r\n\r\n Component.toArray = function (value) {\r\n var date = value.split(((value.indexOf('T') !== -1) ? 'T' : ' '));\r\n var time = date[1];\r\n var date = date[0].split('-');\r\n var y = parseInt(date[0]);\r\n var m = parseInt(date[1]);\r\n var d = parseInt(date[2]);\r\n var h = 0;\r\n var i = 0;\r\n\r\n if (time) {\r\n time = time.split(':');\r\n h = parseInt(time[0]);\r\n i = parseInt(time[1]);\r\n }\r\n return [y, m, d, h, i, 0];\r\n }\r\n\r\n var excelInitialTime = Date.UTC(1900, 0, 0);\r\n var excelLeapYearBug = Date.UTC(1900, 1, 29);\r\n var millisecondsPerDay = 86400000;\r\n\r\n /**\r\n * Date to number\r\n */\r\n Component.dateToNum = function (jsDate) {\r\n if (typeof (jsDate) === 'string') {\r\n jsDate = new Date(jsDate + ' GMT+0');\r\n }\r\n var jsDateInMilliseconds = jsDate.getTime();\r\n if (jsDateInMilliseconds >= excelLeapYearBug) {\r\n jsDateInMilliseconds += millisecondsPerDay;\r\n }\r\n jsDateInMilliseconds -= excelInitialTime;\r\n\r\n return jsDateInMilliseconds / millisecondsPerDay;\r\n }\r\n\r\n /**\r\n * Number to date\r\n *\r\n * IMPORTANT: Excel incorrectly considers 1900 to be a leap year\r\n */\r\n Component.numToDate = function (excelSerialNumber) {\r\n var jsDateInMilliseconds = excelInitialTime + excelSerialNumber * millisecondsPerDay;\r\n if (jsDateInMilliseconds >= excelLeapYearBug) {\r\n jsDateInMilliseconds -= millisecondsPerDay;\r\n }\r\n\r\n const d = new Date(jsDateInMilliseconds);\r\n\r\n var date = [\r\n d.getUTCFullYear(),\r\n d.getUTCMonth() + 1,\r\n d.getUTCDate(),\r\n d.getUTCHours(),\r\n d.getUTCMinutes(),\r\n d.getUTCSeconds(),\r\n ];\r\n\r\n return Component.now(date);\r\n }\r\n\r\n let weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n let months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\n\r\n Object.defineProperty(Component, 'weekdays', {\r\n get: function () {\r\n return weekdays.map(function(v) {\r\n return dictionary.translate(v);\r\n });\r\n },\r\n });\r\n\r\n Object.defineProperty(Component, 'weekdaysShort', {\r\n get: function () {\r\n return weekdays.map(function(v) {\r\n return dictionary.translate(v).substring(0,3);\r\n });\r\n },\r\n });\r\n\r\n Object.defineProperty(Component, 'months', {\r\n get: function () {\r\n return months.map(function(v) {\r\n return dictionary.translate(v);\r\n });\r\n },\r\n });\r\n\r\n Object.defineProperty(Component, 'monthsShort', {\r\n get: function () {\r\n return months.map(function(v) {\r\n return dictionary.translate(v).substring(0,3);\r\n });\r\n },\r\n });\r\n\r\n return Component;\r\n}\r\n\r\n/* harmony default export */ var helpers_date = (HelpersDate());\n;// CONCATENATED MODULE: ./src/plugins/mask.js\n\r\n\r\n\r\nfunction Mask() {\r\n // Currency\r\n var tokens = {\r\n // Text\r\n text: [ '@' ],\r\n // Currency tokens\r\n currency: [ '#(.{1})##0?(.{1}0+)?( ?;(.*)?)?', '#' ],\r\n // Scientific\r\n scientific: [ '0{1}(.{1}0+)?E{1}\\\\+0+' ],\r\n // Percentage\r\n percentage: [ '0{1}(.{1}0+)?%' ],\r\n // Number\r\n numeric: [ '0{1}(.{1}0+)?' ],\r\n // Data tokens\r\n datetime: [ 'YYYY', 'YYY', 'YY', 'MMMMM', 'MMMM', 'MMM', 'MM', 'DDDDD', 'DDDD', 'DDD', 'DD', 'DY', 'DAY', 'WD', 'D', 'Q', 'MONTH', 'MON', 'HH24', 'HH12', 'HH', '\\\\[H\\\\]', 'H', 'AM/PM', 'MI', 'SS', 'MS', 'Y', 'M' ],\r\n // Other\r\n general: [ 'A', '0', '[0-9a-zA-Z\\$]+', '.']\r\n }\r\n\r\n var getDate = function() {\r\n if (this.mask.toLowerCase().indexOf('[h]') !== -1) {\r\n var m = 0;\r\n if (this.date[4]) {\r\n m = parseFloat(this.date[4] / 60);\r\n }\r\n var v = parseInt(this.date[3]) + m;\r\n v /= 24;\r\n } else if (! (this.date[0] && this.date[1] && this.date[2]) && (this.date[3] || this.date[4])) {\r\n v = helpers.two(this.date[3]) + ':' + helpers.two(this.date[4]) + ':' + helpers.two(this.date[5])\r\n } else {\r\n if (this.date[0] && this.date[1] && ! this.date[2]) {\r\n this.date[2] = 1;\r\n }\r\n v = helpers.two(this.date[0]) + '-' + helpers.two(this.date[1]) + '-' + helpers.two(this.date[2]);\r\n\r\n if (this.date[3] || this.date[4] || this.date[5]) {\r\n v += ' ' + helpers.two(this.date[3]) + ':' + helpers.two(this.date[4]) + ':' + helpers.two(this.date[5]);\r\n }\r\n }\r\n\r\n return v;\r\n }\r\n\r\n var extractDate = function() {\r\n var v = '';\r\n if (! (this.date[0] && this.date[1] && this.date[2]) && (this.date[3] || this.date[4])) {\r\n if (this.mask.toLowerCase().indexOf('[h]') !== -1) {\r\n v = parseInt(this.date[3]);\r\n } else {\r\n let h = parseInt(this.date[3]);\r\n if (h < 13 && this.values.indexOf('PM') !== -1) {\r\n v = (h+12) % 24;\r\n } else {\r\n v = h % 24;\r\n }\r\n }\r\n if (this.date[4]) {\r\n v += parseFloat(this.date[4] / 60);\r\n }\r\n if (this.date[5]) {\r\n v += parseFloat(this.date[5] / 3600);\r\n }\r\n v /= 24;\r\n } else if (this.date[0] || this.date[1] || this.date[2] || this.date[3] || this.date[4] || this.date[5]) {\r\n if (this.date[0] && this.date[1] && ! this.date[2]) {\r\n this.date[2] = 1;\r\n }\r\n var t = helpers_date.now(this.date);\r\n v = helpers_date.dateToNum(t);\r\n if (this.date[4]) {\r\n v += parseFloat(this.date[4] / 60);\r\n }\r\n }\r\n\r\n if (isNaN(v)) {\r\n v = '';\r\n }\r\n\r\n return v;\r\n }\r\n\r\n var isBlank = function(v) {\r\n return v === null || v === '' || v === undefined ? true : false;\r\n }\r\n\r\n var isFormula = function(value) {\r\n var v = (''+value)[0];\r\n return v == '=' ? true : false;\r\n }\r\n\r\n var isNumeric = function(t) {\r\n return t === 'currency' || t === 'percentage' || t === 'scientific' || t === 'numeric' ? true : false;\r\n }\r\n\r\n /**\r\n * Get the decimal defined in the mask configuration\r\n */\r\n var getDecimal = function(v) {\r\n if (v && Number(v) == v) {\r\n return '.';\r\n } else {\r\n if (this.options.decimal) {\r\n return this.options.decimal;\r\n } else {\r\n if (this.locale) {\r\n var t = Intl.NumberFormat(this.locale).format(1.1);\r\n return this.options.decimal = t[1];\r\n } else {\r\n if (! v) {\r\n v = this.mask;\r\n }\r\n var e = new RegExp('0{1}(.{1})0+', 'ig');\r\n var t = e.exec(v);\r\n if (t && t[1] && t[1].length == 1) {\r\n // Save decimal\r\n this.options.decimal = t[1];\r\n // Return decimal\r\n return t[1];\r\n } else {\r\n // Did not find any decimal last resort the default\r\n var e = new RegExp('#{1}(.{1})#+', 'ig');\r\n var t = e.exec(v);\r\n if (t && t[1] && t[1].length == 1) {\r\n if (t[1] === ',') {\r\n this.options.decimal = '.';\r\n } else {\r\n this.options.decimal = ',';\r\n }\r\n } else {\r\n this.options.decimal = '1.1'.toLocaleString().substring(1,2);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (this.options.decimal) {\r\n return this.options.decimal;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n var ParseValue = function(v, decimal) {\r\n if (v == '') {\r\n return '';\r\n }\r\n\r\n // Get decimal\r\n if (! decimal) {\r\n decimal = getDecimal.call(this);\r\n }\r\n\r\n // New value\r\n v = (''+v).split(decimal);\r\n\r\n // Signal\r\n var signal = v[0].match(/[-]+/g);\r\n if (signal && signal.length) {\r\n signal = true;\r\n } else {\r\n signal = false;\r\n }\r\n\r\n v[0] = v[0].match(/[0-9]+/g);\r\n\r\n if (v[0]) {\r\n if (signal) {\r\n v[0].unshift('-');\r\n }\r\n v[0] = v[0].join('');\r\n } else {\r\n if (signal) {\r\n v[0] = '-';\r\n }\r\n }\r\n\r\n if (v[0] || v[1]) {\r\n if (v[1] !== undefined) {\r\n v[1] = v[1].match(/[0-9]+/g);\r\n if (v[1]) {\r\n v[1] = v[1].join('');\r\n } else {\r\n v[1] = '';\r\n }\r\n }\r\n } else {\r\n return '';\r\n }\r\n return v;\r\n }\r\n\r\n var FormatValue = function(v, event) {\r\n if (v === '') {\r\n return '';\r\n }\r\n // Get decimal\r\n var d = getDecimal.call(this);\r\n // Convert value\r\n var o = this.options;\r\n // Parse value\r\n v = ParseValue.call(this, v);\r\n if (v === '') {\r\n return '';\r\n }\r\n var t = null;\r\n // Temporary value\r\n if (v[0]) {\r\n if (o.style === 'percent') {\r\n t = parseFloat(v[0]) / 100;\r\n } else {\r\n t = parseFloat(v[0] + '.1');\r\n }\r\n }\r\n\r\n if ((v[0] === '-' || v[0] === '-00') && ! v[1] && (event && event.inputType == \"deleteContentBackward\")) {\r\n return '';\r\n }\r\n\r\n var n = new Intl.NumberFormat(this.locale, o).format(t);\r\n n = n.split(d);\r\n\r\n if (o.style === 'percent') {\r\n if (n[0].indexOf('%') !== -1) {\r\n n[0] = n[0].replace('%', '');\r\n n[2] = '%';\r\n }\r\n }\r\n\r\n if (typeof(n[1]) !== 'undefined') {\r\n var s = n[1].replace(/[0-9]*/g, '');\r\n if (s) {\r\n n[2] = s;\r\n }\r\n }\r\n\r\n if (v[1] !== undefined) {\r\n n[1] = d + v[1];\r\n } else {\r\n n[1] = '';\r\n }\r\n\r\n return n.join('');\r\n }\r\n\r\n var Format = function(e, event) {\r\n var v = Value.call(e);\r\n if (! v) {\r\n return;\r\n }\r\n\r\n // Get decimal\r\n var n = FormatValue.call(this, v, event);\r\n var t = (n.length) - v.length;\r\n var index = Caret.call(e) + t;\r\n // Set value and update caret\r\n Value.call(e, n, index, true);\r\n }\r\n\r\n var Extract = function(v) {\r\n // Keep the raw value\r\n var current = ParseValue.call(this, v);\r\n if (current) {\r\n // Negative values\r\n if (current[0] === '-') {\r\n current[0] = '-0';\r\n }\r\n return parseFloat(current.join('.'));\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Caret getter and setter methods\r\n */\r\n var Caret = function(index, adjustNumeric) {\r\n if (index === undefined) {\r\n if (this.tagName == 'DIV') {\r\n var pos = 0;\r\n var s = window.getSelection();\r\n if (s) {\r\n if (s.rangeCount !== 0) {\r\n var r = s.getRangeAt(0);\r\n var p = r.cloneRange();\r\n p.selectNodeContents(this);\r\n p.setEnd(r.endContainer, r.endOffset);\r\n pos = p.toString().length;\r\n }\r\n }\r\n return pos;\r\n } else {\r\n return this.selectionStart;\r\n }\r\n } else {\r\n // Get the current value\r\n var n = Value.call(this);\r\n\r\n // Review the position\r\n if (adjustNumeric) {\r\n var p = null;\r\n for (var i = 0; i < n.length; i++) {\r\n if (n[i].match(/[\\-0-9]/g) || n[i] === '.' || n[i] === ',') {\r\n p = i;\r\n }\r\n }\r\n\r\n // If the string has no numbers\r\n if (p === null) {\r\n p = n.indexOf(' ');\r\n }\r\n\r\n if (index >= p) {\r\n index = p + 1;\r\n }\r\n }\r\n\r\n // Do not update caret\r\n if (index > n.length) {\r\n index = n.length;\r\n }\r\n\r\n if (index) {\r\n // Set caret\r\n if (this.tagName == 'DIV') {\r\n var s = window.getSelection();\r\n var r = document.createRange();\r\n\r\n if (this.childNodes[0]) {\r\n r.setStart(this.childNodes[0], index);\r\n s.removeAllRanges();\r\n s.addRange(r);\r\n }\r\n } else {\r\n this.selectionStart = index;\r\n this.selectionEnd = index;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Value getter and setter method\r\n */\r\n var Value = function(v, updateCaret, adjustNumeric) {\r\n if (this.tagName == 'DIV') {\r\n if (v === undefined) {\r\n var v = this.innerText;\r\n if (this.value && this.value.length > v.length) {\r\n v = this.value;\r\n }\r\n return v;\r\n } else {\r\n if (this.innerText !== v) {\r\n this.innerText = v;\r\n\r\n if (updateCaret) {\r\n Caret.call(this, updateCaret, adjustNumeric);\r\n }\r\n }\r\n }\r\n } else {\r\n if (v === undefined) {\r\n return this.value;\r\n } else {\r\n if (this.value !== v) {\r\n this.value = v;\r\n if (updateCaret) {\r\n Caret.call(this, updateCaret, adjustNumeric);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Labels\r\n var weekDaysFull = helpers_date.weekdays;\r\n var weekDays = helpers_date.weekdaysShort;\r\n var monthsFull = helpers_date.months;\r\n var months = helpers_date.monthsShort;\r\n\r\n var parser = {\r\n 'YEAR': function(v, s) {\r\n var y = ''+new Date().getFullYear();\r\n\r\n if (typeof(this.values[this.index]) === 'undefined') {\r\n this.values[this.index] = '';\r\n }\r\n if (parseInt(v) >= 0 && parseInt(v) <= 10) {\r\n if (this.values[this.index].length < s) {\r\n this.values[this.index] += v;\r\n }\r\n }\r\n if (this.values[this.index].length == s) {\r\n if (s == 2) {\r\n var y = y.substr(0,2) + this.values[this.index];\r\n } else if (s == 3) {\r\n var y = y.substr(0,1) + this.values[this.index];\r\n } else if (s == 4) {\r\n var y = this.values[this.index];\r\n }\r\n this.date[0] = y;\r\n this.index++;\r\n }\r\n },\r\n 'YYYY': function(v) {\r\n parser.YEAR.call(this, v, 4);\r\n },\r\n 'YYY': function(v) {\r\n parser.YEAR.call(this, v, 3);\r\n },\r\n 'YY': function(v) {\r\n parser.YEAR.call(this, v, 2);\r\n },\r\n 'FIND': function(v, a) {\r\n if (isBlank(this.values[this.index])) {\r\n this.values[this.index] = '';\r\n }\r\n if (this.event && this.event.inputType && this.event.inputType.indexOf('delete') > -1) {\r\n this.values[this.index] += v;\r\n return;\r\n }\r\n var pos = 0;\r\n var count = 0;\r\n var value = (this.values[this.index] + v).toLowerCase();\r\n for (var i = 0; i < a.length; i++) {\r\n if (a[i].toLowerCase().indexOf(value) == 0) {\r\n pos = i;\r\n count++;\r\n }\r\n }\r\n if (count > 1) {\r\n this.values[this.index] += v;\r\n } else if (count == 1) {\r\n // Jump number of chars\r\n var t = (a[pos].length - this.values[this.index].length) - 1;\r\n this.position += t;\r\n\r\n this.values[this.index] = a[pos];\r\n this.index++;\r\n return pos;\r\n }\r\n },\r\n 'MMM': function(v) {\r\n var ret = parser.FIND.call(this, v, months);\r\n if (ret !== undefined) {\r\n this.date[1] = ret + 1;\r\n }\r\n },\r\n 'MON': function(v) {\r\n parser['MMM'].call(this, v);\r\n },\r\n 'MMMM': function(v) {\r\n var ret = parser.FIND.call(this, v, monthsFull);\r\n if (ret !== undefined) {\r\n this.date[1] = ret + 1;\r\n }\r\n },\r\n 'MONTH': function(v) {\r\n parser['MMMM'].call(this, v);\r\n },\r\n 'MMMMM': function(v) {\r\n if (isBlank(this.values[this.index])) {\r\n this.values[this.index] = '';\r\n }\r\n var pos = 0;\r\n var count = 0;\r\n var value = (this.values[this.index] + v).toLowerCase();\r\n for (var i = 0; i < monthsFull.length; i++) {\r\n if (monthsFull[i][0].toLowerCase().indexOf(value) == 0) {\r\n this.values[this.index] = monthsFull[i][0];\r\n this.date[1] = i + 1;\r\n this.index++;\r\n break;\r\n }\r\n }\r\n },\r\n 'MM': function(v) {\r\n if (isBlank(this.values[this.index])) {\r\n if (parseInt(v) > 1 && parseInt(v) < 10) {\r\n this.date[1] = this.values[this.index] = '0' + v;\r\n this.index++;\r\n } else if (parseInt(v) < 2) {\r\n this.values[this.index] = v;\r\n }\r\n } else {\r\n if (this.values[this.index] == 1 && parseInt(v) < 3) {\r\n this.date[1] = this.values[this.index] += v;\r\n this.index++;\r\n } else if (this.values[this.index] == 0 && parseInt(v) > 0 && parseInt(v) < 10) {\r\n this.date[1] = this.values[this.index] += v;\r\n this.index++;\r\n }\r\n }\r\n },\r\n 'M': function(v) {\r\n var test = false;\r\n if (parseInt(v) >= 0 && parseInt(v) < 10) {\r\n if (isBlank(this.values[this.index])) {\r\n this.values[this.index] = v;\r\n if (v > 1) {\r\n this.date[1] = this.values[this.index];\r\n this.index++;\r\n }\r\n } else {\r\n if (this.values[this.index] == 1 && parseInt(v) < 3) {\r\n this.date[1] = this.values[this.index] += v;\r\n this.index++;\r\n } else if (this.values[this.index] == 0 && parseInt(v) > 0) {\r\n this.date[1] = this.values[this.index] += v;\r\n this.index++;\r\n } else {\r\n var test = true;\r\n }\r\n }\r\n } else {\r\n var test = true;\r\n }\r\n\r\n // Re-test\r\n if (test == true) {\r\n var t = parseInt(this.values[this.index]);\r\n if (t > 0 && t < 12) {\r\n this.date[1] = this.values[this.index];\r\n this.index++;\r\n // Repeat the character\r\n this.position--;\r\n }\r\n }\r\n },\r\n 'D': function(v) {\r\n var test = false;\r\n if (parseInt(v) >= 0 && parseInt(v) < 10) {\r\n if (isBlank(this.values[this.index])) {\r\n this.values[this.index] = v;\r\n if (parseInt(v) > 3) {\r\n this.date[2] = this.values[this.index];\r\n this.index++;\r\n }\r\n } else {\r\n if (this.values[this.index] == 3 && parseInt(v) < 2) {\r\n this.date[2] = this.values[this.index] += v;\r\n this.index++;\r\n } else if (this.values[this.index] == 1 || this.values[this.index] == 2) {\r\n this.date[2] = this.values[this.index] += v;\r\n this.index++;\r\n } else if (this.values[this.index] == 0 && parseInt(v) > 0) {\r\n this.date[2] = this.values[this.index] += v;\r\n this.index++;\r\n } else {\r\n var test = true;\r\n }\r\n }\r\n } else {\r\n var test = true;\r\n }\r\n\r\n // Re-test\r\n if (test == true) {\r\n var t = parseInt(this.values[this.index]);\r\n if (t > 0 && t < 32) {\r\n this.date[2] = this.values[this.index];\r\n this.index++;\r\n // Repeat the character\r\n this.position--;\r\n }\r\n }\r\n },\r\n 'DD': function(v) {\r\n if (isBlank(this.values[this.index])) {\r\n if (parseInt(v) > 3 && parseInt(v) < 10) {\r\n this.date[2] = this.values[this.index] = '0' + v;\r\n this.index++;\r\n } else if (parseInt(v) < 10) {\r\n this.values[this.index] = v;\r\n }\r\n } else {\r\n if (this.values[this.index] == 3 && parseInt(v) < 2) {\r\n this.date[2] = this.values[this.index] += v;\r\n this.index++;\r\n } else if ((this.values[this.index] == 1 || this.values[this.index] == 2) && parseInt(v) < 10) {\r\n this.date[2] = this.values[this.index] += v;\r\n this.index++;\r\n } else if (this.values[this.index] == 0 && parseInt(v) > 0 && parseInt(v) < 10) {\r\n this.date[2] = this.values[this.index] += v;\r\n this.index++;\r\n }\r\n }\r\n },\r\n 'DDD': function(v) {\r\n parser.FIND.call(this, v, weekDays);\r\n },\r\n 'DY': function(v) {\r\n parser['DDD'].call(this, v);\r\n },\r\n 'DDDD': function(v) {\r\n parser.FIND.call(this, v, weekDaysFull);\r\n },\r\n 'DAY': function(v) {\r\n parser['DDDD'].call(this, v);\r\n },\r\n 'HH12': function(v, two) {\r\n if (isBlank(this.values[this.index])) {\r\n if (parseInt(v) > 1 && parseInt(v) < 10) {\r\n if (two) {\r\n v = 0 + v;\r\n }\r\n this.date[3] = this.values[this.index] = v;\r\n this.index++;\r\n } else if (parseInt(v) < 10) {\r\n this.values[this.index] = v;\r\n }\r\n } else {\r\n if (this.values[this.index] == 1 && parseInt(v) < 3) {\r\n this.date[3] = this.values[this.index] += v;\r\n this.index++;\r\n } else if (this.values[this.index] < 1 && parseInt(v) < 10) {\r\n this.date[3] = this.values[this.index] += v;\r\n this.index++;\r\n }\r\n }\r\n },\r\n 'HH24': function(v, two) {\r\n if (parseInt(v) >= 0 && parseInt(v) < 10) {\r\n if (this.values[this.index] == null || this.values[this.index] == '') {\r\n if (parseInt(v) > 2 && parseInt(v) < 10) {\r\n if (two) {\r\n v = 0 + v;\r\n }\r\n this.date[3] = this.values[this.index] = v;\r\n this.index++;\r\n } else if (parseInt(v) < 10) {\r\n this.values[this.index] = v;\r\n }\r\n } else {\r\n if (this.values[this.index] == 2 && parseInt(v) < 4) {\r\n if (! two && this.values[this.index] === '0') {\r\n this.values[this.index] = '';\r\n }\r\n this.date[3] = this.values[this.index] += v;\r\n this.index++;\r\n } else if (this.values[this.index] < 2 && parseInt(v) < 10) {\r\n if (! two && this.values[this.index] === '0') {\r\n this.values[this.index] = '';\r\n }\r\n this.date[3] = this.values[this.index] += v;\r\n this.index++;\r\n }\r\n }\r\n }\r\n },\r\n 'HH': function(v) {\r\n parser['HH24'].call(this, v, 1);\r\n },\r\n 'H': function(v) {\r\n parser['HH24'].call(this, v, 0);\r\n },\r\n '\\\\[H\\\\]': function(v) {\r\n if (this.values[this.index] == undefined) {\r\n this.values[this.index] = '';\r\n }\r\n if (v.match(/[0-9]/g)) {\r\n this.date[3] = this.values[this.index] += v;\r\n } else {\r\n if (this.values[this.index].match(/[0-9]/g)) {\r\n this.date[3] = this.values[this.index];\r\n this.index++;\r\n // Repeat the character\r\n this.position--;\r\n }\r\n }\r\n },\r\n 'N60': function(v, i) {\r\n if (this.values[this.index] == null || this.values[this.index] == '') {\r\n if (parseInt(v) > 5 && parseInt(v) < 10) {\r\n this.date[i] = this.values[this.index] = '0' + v;\r\n this.index++;\r\n } else if (parseInt(v) < 10) {\r\n this.values[this.index] = v;\r\n }\r\n } else {\r\n if (parseInt(v) < 10) {\r\n this.date[i] = this.values[this.index] += v;\r\n this.index++;\r\n }\r\n }\r\n },\r\n 'MI': function(v) {\r\n parser.N60.call(this, v, 4);\r\n },\r\n 'SS': function(v) {\r\n parser.N60.call(this, v, 5);\r\n },\r\n 'AM/PM': function(v) {\r\n if (typeof(this.values[this.index]) === 'undefined') {\r\n this.values[this.index] = '';\r\n }\r\n\r\n if (this.values[this.index] === '') {\r\n if (v.match(/a/i) && this.date[3] < 13) {\r\n this.values[this.index] += 'A';\r\n } else if (v.match(/p/i)) {\r\n this.values[this.index] += 'P';\r\n }\r\n } else if (this.values[this.index] === 'A' || this.values[this.index] === 'P') {\r\n this.values[this.index] += 'M';\r\n this.index++;\r\n }\r\n },\r\n 'WD': function(v) {\r\n if (typeof(this.values[this.index]) === 'undefined') {\r\n this.values[this.index] = '';\r\n }\r\n if (parseInt(v) >= 0 && parseInt(v) < 7) {\r\n this.values[this.index] = v;\r\n }\r\n if (this.values[this.index].length == 1) {\r\n this.index++;\r\n }\r\n },\r\n '0{1}(.{1}0+)?': function(v) {\r\n // Get decimal\r\n var decimal = getDecimal.call(this);\r\n // Negative number\r\n var neg = false;\r\n // Create if is blank\r\n if (isBlank(this.values[this.index])) {\r\n this.values[this.index] = '';\r\n } else {\r\n if (this.values[this.index] == '-') {\r\n neg = true;\r\n }\r\n }\r\n var current = ParseValue.call(this, this.values[this.index], decimal);\r\n if (current) {\r\n this.values[this.index] = current.join(decimal);\r\n }\r\n // New entry\r\n if (parseInt(v) >= 0 && parseInt(v) < 10) {\r\n // Replace the zero for a number\r\n if (this.values[this.index] == '0' && v > 0) {\r\n this.values[this.index] = '';\r\n } else if (this.values[this.index] == '-0' && v > 0) {\r\n this.values[this.index] = '-';\r\n }\r\n // Don't add up zeros because does not mean anything here\r\n if ((this.values[this.index] != '0' && this.values[this.index] != '-0') || v == decimal) {\r\n this.values[this.index] += v;\r\n }\r\n } else if (decimal && v == decimal) {\r\n if (this.values[this.index].indexOf(decimal) == -1) {\r\n if (! this.values[this.index]) {\r\n this.values[this.index] = '0';\r\n }\r\n this.values[this.index] += v;\r\n }\r\n } else if (v == '-') {\r\n // Negative signed\r\n neg = true;\r\n }\r\n\r\n if (neg === true && this.values[this.index][0] !== '-') {\r\n this.values[this.index] = '-' + this.values[this.index];\r\n }\r\n },\r\n '0{1}(.{1}0+)?E{1}\\\\+0+': function(v) {\r\n parser['0{1}(.{1}0+)?'].call(this, v);\r\n },\r\n '0{1}(.{1}0+)?%': function(v) {\r\n parser['0{1}(.{1}0+)?'].call(this, v);\r\n\r\n if (this.values[this.index].match(/[\\-0-9]/g)) {\r\n if (this.values[this.index] && this.values[this.index].indexOf('%') == -1) {\r\n this.values[this.index] += '%';\r\n }\r\n } else {\r\n this.values[this.index] = '';\r\n }\r\n },\r\n '#(.{1})##0?(.{1}0+)?( ?;(.*)?)?': function(v) {\r\n // Parse number\r\n parser['0{1}(.{1}0+)?'].call(this, v);\r\n // Get decimal\r\n var decimal = getDecimal.call(this);\r\n // Get separator\r\n var separator = this.tokens[this.index].substr(1,1);\r\n // Negative\r\n var negative = this.values[this.index][0] === '-' ? true : false;\r\n // Current value\r\n var current = ParseValue.call(this, this.values[this.index], decimal);\r\n\r\n // Get main and decimal parts\r\n if (current !== '') {\r\n // Format number\r\n var n = current[0].match(/[0-9]/g);\r\n if (n) {\r\n // Format\r\n n = n.join('');\r\n var t = [];\r\n var s = 0;\r\n for (var j = n.length - 1; j >= 0 ; j--) {\r\n t.push(n[j]);\r\n s++;\r\n if (! (s % 3)) {\r\n t.push(separator);\r\n }\r\n }\r\n t = t.reverse();\r\n current[0] = t.join('');\r\n if (current[0].substr(0,1) == separator) {\r\n current[0] = current[0].substr(1);\r\n }\r\n } else {\r\n current[0] = '';\r\n }\r\n\r\n // Value\r\n this.values[this.index] = current.join(decimal);\r\n\r\n // Negative\r\n if (negative) {\r\n this.values[this.index] = '-' + this.values[this.index];\r\n }\r\n }\r\n },\r\n '0': function(v) {\r\n if (v.match(/[0-9]/g)) {\r\n this.values[this.index] = v;\r\n this.index++;\r\n }\r\n },\r\n '[0-9a-zA-Z$]+': function(v) {\r\n if (isBlank(this.values[this.index])) {\r\n this.values[this.index] = '';\r\n }\r\n var t = this.tokens[this.index];\r\n var s = this.values[this.index];\r\n var i = s.length;\r\n\r\n if (t[i] == v) {\r\n this.values[this.index] += v;\r\n\r\n if (this.values[this.index] == t) {\r\n this.index++;\r\n }\r\n } else {\r\n this.values[this.index] = t;\r\n this.index++;\r\n\r\n if (v.match(/[\\-0-9]/g)) {\r\n // Repeat the character\r\n this.position--;\r\n }\r\n }\r\n },\r\n 'A': function(v) {\r\n if (v.match(/[a-zA-Z]/gi)) {\r\n this.values[this.index] = v;\r\n this.index++;\r\n }\r\n },\r\n '.': function(v) {\r\n parser['[0-9a-zA-Z$]+'].call(this, v);\r\n },\r\n '@': function(v) {\r\n if (isBlank(this.values[this.index])) {\r\n this.values[this.index] = '';\r\n }\r\n this.values[this.index] += v;\r\n }\r\n }\r\n\r\n /**\r\n * Get the tokens in the mask string\r\n */\r\n var getTokens = function(str) {\r\n if (this.type == 'general') {\r\n var t = [].concat(tokens.general);\r\n } else {\r\n var t = [].concat(tokens.currency, tokens.datetime, tokens.percentage, tokens.scientific, tokens.numeric, tokens.text, tokens.general);\r\n }\r\n // Expression to extract all tokens from the string\r\n var e = new RegExp(t.join('|'), 'gi');\r\n // Extract\r\n return str.match(e);\r\n }\r\n\r\n /**\r\n * Get the method of one given token\r\n */\r\n var getMethod = function(str) {\r\n if (! this.type) {\r\n var types = Object.keys(tokens);\r\n } else if (this.type == 'text') {\r\n var types = [ 'text' ];\r\n } else if (this.type == 'general') {\r\n var types = [ 'general' ];\r\n } else if (this.type == 'datetime') {\r\n var types = [ 'numeric', 'datetime', 'general' ];\r\n } else {\r\n var types = [ 'currency', 'percentage', 'scientific', 'numeric', 'general' ];\r\n }\r\n\r\n // Found\r\n for (var i = 0; i < types.length; i++) {\r\n var type = types[i];\r\n for (var j = 0; j < tokens[type].length; j++) {\r\n var e = new RegExp(tokens[type][j], 'gi');\r\n var r = str.match(e);\r\n if (r) {\r\n return { type: type, method: tokens[type][j] }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Identify each method for each token\r\n */\r\n var getMethods = function(t) {\r\n var result = [];\r\n for (var i = 0; i < t.length; i++) {\r\n var m = getMethod.call(this, t[i]);\r\n if (m) {\r\n result.push(m.method);\r\n } else {\r\n result.push(null);\r\n }\r\n }\r\n\r\n // Compatibility with excel\r\n for (var i = 0; i < result.length; i++) {\r\n if (result[i] == 'MM') {\r\n // Not a month, correct to minutes\r\n if (result[i-1] && result[i-1].indexOf('H') >= 0) {\r\n result[i] = 'MI';\r\n } else if (result[i-2] && result[i-2].indexOf('H') >= 0) {\r\n result[i] = 'MI';\r\n } else if (result[i+1] && result[i+1].indexOf('S') >= 0) {\r\n result[i] = 'MI';\r\n } else if (result[i+2] && result[i+2].indexOf('S') >= 0) {\r\n result[i] = 'MI';\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get the type for one given token\r\n */\r\n var getType = function(str) {\r\n var m = getMethod.call(this, str);\r\n if (m) {\r\n var type = m.type;\r\n }\r\n\r\n if (type) {\r\n var numeric = 0;\r\n // Make sure the correct type\r\n var t = getTokens.call(this, str);\r\n for (var i = 0; i < t.length; i++) {\r\n m = getMethod.call(this, t[i]);\r\n if (m && isNumeric(m.type)) {\r\n numeric++;\r\n }\r\n }\r\n if (numeric > 1) {\r\n type = 'general';\r\n }\r\n }\r\n\r\n return type;\r\n }\r\n\r\n /**\r\n * Parse character per character using the detected tokens in the mask\r\n */\r\n var parse = function() {\r\n // Parser method for this position\r\n if (typeof(parser[this.methods[this.index]]) == 'function') {\r\n parser[this.methods[this.index]].call(this, this.value[this.position]);\r\n this.position++;\r\n } else {\r\n this.values[this.index] = this.tokens[this.index];\r\n this.index++;\r\n }\r\n }\r\n\r\n var toPlainString = function(num) {\r\n return (''+ +num).replace(/(-?)(\\d*)\\.?(\\d*)e([+-]\\d+)/,\r\n function(a,b,c,d,e) {\r\n return e < 0\r\n ? b + '0.' + Array(1-e-c.length).join(0) + c + d\r\n : b + c + d + Array(e-d.length+1).join(0);\r\n });\r\n }\r\n\r\n /**\r\n * Mask function\r\n * @param {mixed|string} JS input or a string to be parsed\r\n * @param {object|string} When the first param is a string, the second is the mask or object with the mask options\r\n */\r\n var obj = function(e, config, returnObject) {\r\n // Options\r\n var r = null;\r\n var t = null;\r\n var o = {\r\n // Element\r\n input: null,\r\n // Current value\r\n value: null,\r\n // Mask options\r\n options: {},\r\n // New values for each token found\r\n values: [],\r\n // Token position\r\n index: 0,\r\n // Character position\r\n position: 0,\r\n // Date raw values\r\n date: [0,0,0,0,0,0],\r\n // Raw number for the numeric values\r\n number: 0,\r\n }\r\n\r\n // This is a JavaScript Event\r\n if (typeof(e) == 'object') {\r\n // Element\r\n o.input = e.target;\r\n // Current value\r\n o.value = Value.call(e.target);\r\n // Current caret position\r\n o.caret = Caret.call(e.target);\r\n // Mask\r\n if (t = e.target.getAttribute('data-mask')) {\r\n o.mask = t;\r\n }\r\n // Type\r\n if (t = e.target.getAttribute('data-type')) {\r\n o.type = t;\r\n }\r\n // Options\r\n if (e.target.mask) {\r\n if (e.target.mask.options) {\r\n o.options = e.target.mask.options;\r\n }\r\n if (e.target.mask.locale) {\r\n o.locale = e.target.mask.locale;\r\n }\r\n } else {\r\n // Locale\r\n if (t = e.target.getAttribute('data-locale')) {\r\n o.locale = t;\r\n if (o.mask) {\r\n o.options.style = o.mask;\r\n }\r\n }\r\n }\r\n // Extra configuration\r\n if (e.target.attributes && e.target.attributes.length) {\r\n for (var i = 0; i < e.target.attributes.length; i++) {\r\n var k = e.target.attributes[i].name;\r\n var v = e.target.attributes[i].value;\r\n if (k.substr(0,4) == 'data') {\r\n o.options[k.substr(5)] = v;\r\n }\r\n }\r\n }\r\n } else {\r\n // Options\r\n if (typeof(config) == 'string') {\r\n // Mask\r\n o.mask = config;\r\n } else {\r\n // Mask\r\n var k = Object.keys(config);\r\n for (var i = 0; i < k.length; i++) {\r\n o[k[i]] = config[k[i]];\r\n }\r\n }\r\n\r\n if (typeof(e) === 'number') {\r\n // Get decimal\r\n getDecimal.call(o, o.mask);\r\n // Replace to the correct decimal\r\n e = (''+e).replace('.', o.options.decimal);\r\n }\r\n\r\n // Current\r\n o.value = e;\r\n\r\n if (o.input) {\r\n // Value\r\n Value.call(o.input, e);\r\n // Focus\r\n helpers.focus(o.input);\r\n // Caret\r\n o.caret = Caret.call(o.input);\r\n }\r\n }\r\n\r\n // Mask detected start the process\r\n if (! isFormula(o.value) && (o.mask || o.locale)) {\r\n // Compatibility fixes\r\n if (o.mask) {\r\n // Remove []\r\n o.mask = o.mask.replace(new RegExp(/\\[h]/),'|h|');\r\n o.mask = o.mask.replace(new RegExp(/\\[.*?\\]/),'');\r\n o.mask = o.mask.replace(new RegExp(/\\|h\\|/),'[h]');\r\n if (o.mask.indexOf(';') !== -1) {\r\n var t = o.mask.split(';');\r\n o.mask = t[0];\r\n }\r\n // Excel mask TODO: Improve\r\n if (o.mask.indexOf('##') !== -1) {\r\n var d = o.mask.split(';');\r\n if (d[0]) {\r\n if (typeof(e) == 'object') {\r\n d[0] = d[0].replace(new RegExp(/_\\)/g), '');\r\n d[0] = d[0].replace(new RegExp(/_\\(/g), '');\r\n }\r\n d[0] = d[0].replace('*', '\\t');\r\n d[0] = d[0].replace(new RegExp(/_-/g), '');\r\n d[0] = d[0].replace(new RegExp(/_/g), '');\r\n d[0] = d[0].replace(new RegExp(/\"/g), '');\r\n d[0] = d[0].replace('##0.###','##0.000');\r\n d[0] = d[0].replace('##0.##','##0.00');\r\n d[0] = d[0].replace('##0.#','##0.0');\r\n d[0] = d[0].replace('##0,###','##0,000');\r\n d[0] = d[0].replace('##0,##','##0,00');\r\n d[0] = d[0].replace('##0,#','##0,0');\r\n }\r\n o.mask = d[0];\r\n }\r\n // Remove back slashes\r\n if (o.mask.indexOf('\\\\') !== -1) {\r\n var d = o.mask.split(';');\r\n d[0] = d[0].replace(new RegExp(/\\\\/g), '');\r\n o.mask = d[0];\r\n }\r\n // Get type\r\n if (! o.type) {\r\n o.type = getType.call(o, o.mask);\r\n }\r\n // Get tokens\r\n o.tokens = getTokens.call(o, o.mask);\r\n }\r\n\r\n // On new input\r\n if (typeof(e) !== 'object' || ! e.inputType || ! e.inputType.indexOf('insert') || ! e.inputType.indexOf('delete')) {\r\n // Start transformation\r\n if (o.locale) {\r\n if (o.input) {\r\n Format.call(o, o.input, e);\r\n } else {\r\n var newValue = FormatValue.call(o, o.value);\r\n }\r\n } else {\r\n // Get tokens\r\n o.methods = getMethods.call(o, o.tokens);\r\n o.event = e;\r\n\r\n // Go through all tokes\r\n while (o.position < o.value.length && typeof(o.tokens[o.index]) !== 'undefined') {\r\n // Get the appropriate parser\r\n parse.call(o);\r\n }\r\n\r\n // New value\r\n var newValue = o.values.join('');\r\n\r\n // Add tokens to the end of string only if string is not empty\r\n if (isNumeric(o.type) && newValue !== '') {\r\n // Complement things in the end of the mask\r\n while (typeof(o.tokens[o.index]) !== 'undefined') {\r\n var t = getMethod.call(o, o.tokens[o.index]);\r\n if (t && t.type == 'general') {\r\n o.values[o.index] = o.tokens[o.index];\r\n }\r\n o.index++;\r\n }\r\n\r\n var adjustNumeric = true;\r\n } else {\r\n var adjustNumeric = false;\r\n }\r\n\r\n // New value\r\n newValue = o.values.join('');\r\n\r\n // Reset value\r\n if (o.input) {\r\n t = newValue.length - o.value.length;\r\n if (t > 0) {\r\n var caret = o.caret + t;\r\n } else {\r\n var caret = o.caret;\r\n }\r\n Value.call(o.input, newValue, caret, adjustNumeric);\r\n }\r\n }\r\n }\r\n\r\n // Update raw data\r\n if (o.input) {\r\n var label = null;\r\n if (isNumeric(o.type)) {\r\n let v = Value.call(o.input);\r\n // Extract the number\r\n o.number = Extract.call(o, v);\r\n // Keep the raw data as a property of the tag\r\n if (o.type == 'percentage' && (''+v).indexOf('%') !== -1) {\r\n label = obj.adjustPrecision(o.number / 100);\r\n } else {\r\n label = o.number;\r\n }\r\n } else if (o.type == 'datetime') {\r\n label = getDate.call(o);\r\n\r\n if (o.date[0] && o.date[1] && o.date[2]) {\r\n o.input.setAttribute('data-completed', true);\r\n }\r\n }\r\n\r\n if (label) {\r\n o.input.setAttribute('data-value', label);\r\n }\r\n }\r\n\r\n if (newValue !== undefined) {\r\n if (returnObject) {\r\n return o;\r\n } else {\r\n return newValue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n obj.adjustPrecision = function(num) {\r\n if (typeof num === 'number' && !Number.isInteger(num)) {\r\n const v = num.toString().split('.');\r\n\r\n if (v[1] && v[1].length > 10) {\r\n let t0 = 0;\r\n const t1 = v[1][v[1].length - 2];\r\n\r\n if (t1 == 0 || t1 == 9) {\r\n for (let i = v[1].length - 2; i > 0; i--) {\r\n if (t0 >= 0 && v[1][i] == t1) {\r\n t0++;\r\n if (t0 > 6) {\r\n break;\r\n }\r\n } else {\r\n t0 = 0;\r\n break;\r\n }\r\n }\r\n\r\n if (t0) {\r\n return parseFloat(parseFloat(num).toFixed(v[1].length - 1));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return num;\r\n }\r\n\r\n // Get the type of the mask\r\n obj.getType = getType;\r\n\r\n // Extract the tokens from a mask\r\n obj.prepare = function(str, o) {\r\n if (! o) {\r\n o = {};\r\n }\r\n return getTokens.call(o, str);\r\n }\r\n\r\n /**\r\n * Apply the mask to a element (legacy)\r\n */\r\n obj.apply = function(e) {\r\n var v = Value.call(e.target);\r\n if (e.key.length == 1) {\r\n v += e.key;\r\n }\r\n Value.call(e.target, obj(v, e.target.getAttribute('data-mask')));\r\n }\r\n\r\n /**\r\n * Legacy support\r\n */\r\n obj.run = function(value, mask, decimal) {\r\n return obj(value, { mask: mask, decimal: decimal });\r\n }\r\n\r\n /**\r\n * Extract number from masked string\r\n */\r\n obj.extract = function(v, options, returnObject) {\r\n if (isBlank(v)) {\r\n return v;\r\n }\r\n if (typeof(options) != 'object') {\r\n return v;\r\n } else {\r\n options = Object.assign({}, options);\r\n\r\n if (! options.options) {\r\n options.options = {};\r\n }\r\n }\r\n\r\n // Compatibility\r\n if (! options.mask && options.format) {\r\n options.mask = options.format;\r\n }\r\n\r\n // Remove []\r\n if (options.mask) {\r\n if (options.mask.indexOf(';') !== -1) {\r\n var t = options.mask.split(';');\r\n options.mask = t[0];\r\n }\r\n options.mask = options.mask.replace(new RegExp(/\\[h]/),'|h|');\r\n options.mask = options.mask.replace(new RegExp(/\\[.*?\\]/),'');\r\n options.mask = options.mask.replace(new RegExp(/\\|h\\|/),'[h]');\r\n }\r\n\r\n // Get decimal\r\n getDecimal.call(options, options.mask);\r\n\r\n var type = null;\r\n var value = null;\r\n\r\n if (options.type == 'percent' || options.options.style == 'percent') {\r\n type = 'percentage';\r\n } else if (options.mask) {\r\n type = getType.call(options, options.mask);\r\n }\r\n\r\n if (type === 'general') {\r\n var o = obj(v, options, true);\r\n\r\n value = v;\r\n } else if (type === 'datetime') {\r\n if (v instanceof Date) {\r\n v = obj.getDateString(v, options.mask);\r\n }\r\n\r\n var o = obj(v, options, true);\r\n\r\n if (helpers.isNumeric(v)) {\r\n value = v;\r\n } else {\r\n value = extractDate.call(o);\r\n }\r\n } else if (type === 'scientific') {\r\n value = v;\r\n if (typeof(v) === 'string') {\r\n value = Number(value);\r\n }\r\n var o = options;\r\n } else {\r\n value = Extract.call(options, v);\r\n // Percentage\r\n if (type === 'percentage' && (''+v).indexOf('%') !== -1) {\r\n value /= 100;\r\n }\r\n var o = options;\r\n }\r\n\r\n o.value = value;\r\n\r\n if (! o.type && type) {\r\n o.type = type;\r\n }\r\n\r\n if (returnObject) {\r\n return o;\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n /**\r\n * Render\r\n */\r\n obj.render = function(value, options, fullMask, strict) {\r\n if (isBlank(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof(options) != 'object') {\r\n return value;\r\n } else {\r\n options = Object.assign({}, options);\r\n\r\n if (! options.options) {\r\n options.options = {};\r\n }\r\n }\r\n\r\n // Compatibility\r\n if (! options.mask && options.format) {\r\n options.mask = options.format;\r\n }\r\n\r\n // Remove []\r\n if (options.mask) {\r\n if (options.mask.indexOf(';') !== -1) {\r\n var t = options.mask.split(';');\r\n if (! fullMask) {\r\n t[0] = t[0].replace(new RegExp(/_\\)/g), '');\r\n t[0] = t[0].replace(new RegExp(/_\\(/g), '');\r\n }\r\n options.mask = t[0];\r\n }\r\n options.mask = options.mask.replace(new RegExp(/\\[h]/),'|h|');\r\n options.mask = options.mask.replace(new RegExp(/\\[.*?\\]/),'');\r\n options.mask = options.mask.replace(new RegExp(/\\|h\\|/),'[h]');\r\n }\r\n\r\n var type = null;\r\n if (options.type == 'percent' || options.options.style == 'percent') {\r\n type = 'percentage';\r\n } else if (options.mask) {\r\n type = getType.call(options, options.mask);\r\n } else if (value instanceof Date) {\r\n type = 'datetime';\r\n }\r\n\r\n // Fill with blanks\r\n var fillWithBlanks = false;\r\n\r\n if (type =='datetime' || options.type == 'calendar') {\r\n var t = obj.getDateString(value, options.mask);\r\n if (t) {\r\n value = t;\r\n }\r\n if (options.mask && fullMask) {\r\n fillWithBlanks = true;\r\n }\r\n } else {\r\n // Parse number\r\n if (typeof(value) === 'string' && jSuites.isNumeric(value)) {\r\n value = Number(value);\r\n }\r\n // Percentage\r\n if (type === 'percentage') {\r\n value = obj.adjustPrecision(value*100);\r\n }\r\n\r\n // Number of decimal places\r\n if (typeof(value) === 'number') {\r\n var t = null;\r\n if (options.mask && fullMask) {\r\n var d = getDecimal.call(options, options.mask);\r\n if (type === 'scientific') {\r\n if (options.mask.indexOf(d) !== -1) {\r\n let exp = options.mask.split('E');\r\n exp = exp[0].split(d);\r\n exp = ('' + exp[1].match(/[0-9]+/g))\r\n exp = exp.length;\r\n t = value.toExponential(exp);\r\n } else {\r\n t = value.toExponential(0);\r\n }\r\n } else {\r\n if (options.mask.indexOf(d) !== -1) {\r\n d = options.mask.split(d);\r\n d = (''+d[1].match(/[0-9]+/g))\r\n d = d.length;\r\n t = value.toFixed(d);\r\n let n = value.toString().split('.');\r\n let fraction = n[1];\r\n if (fraction && fraction.length > d && fraction[fraction.length-1] === '5') {\r\n t = parseFloat(n[0] + '.' + fraction + '1').toFixed(d);\r\n }\r\n } else {\r\n if (value.toString().indexOf(d) !== -1) {\r\n t = value.toFixed(0);\r\n }\r\n }\r\n\r\n // Handle scientific notation\r\n if ((''+t).indexOf('e') !== -1) {\r\n t = toPlainString(t);\r\n }\r\n }\r\n } else if (options.locale && fullMask) {\r\n // Append zeros\r\n var d = (''+value).split('.');\r\n if (options.options) {\r\n if (typeof(d[1]) === 'undefined') {\r\n d[1] = '';\r\n }\r\n var len = d[1].length;\r\n if (options.options.minimumFractionDigits > len) {\r\n for (var i = 0; i < options.options.minimumFractionDigits - len; i++) {\r\n d[1] += '0';\r\n }\r\n }\r\n }\r\n if (! d[1].length) {\r\n t = d[0]\r\n } else {\r\n t = d.join('.');\r\n }\r\n var len = d[1].length;\r\n if (options.options && options.options.maximumFractionDigits < len) {\r\n t = parseFloat(t).toFixed(options.options.maximumFractionDigits);\r\n }\r\n } else {\r\n t = toPlainString(value);\r\n }\r\n\r\n if (t !== null) {\r\n value = t;\r\n // Get decimal\r\n getDecimal.call(options, options.mask);\r\n // Replace to the correct decimal\r\n if (options.options.decimal) {\r\n value = value.replace('.', options.options.decimal);\r\n }\r\n }\r\n } else {\r\n if (options.mask && fullMask) {\r\n fillWithBlanks = true;\r\n }\r\n }\r\n }\r\n\r\n if (fillWithBlanks) {\r\n var s = options.mask.length - value.length;\r\n if (s > 0) {\r\n for (var i = 0; i < s; i++) {\r\n value += ' ';\r\n }\r\n }\r\n }\r\n\r\n if (type === 'scientific') {\r\n if (! fullMask) {\r\n value = toPlainString(value);\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n if (type === 'numeric' && strict === false && typeof(value) === 'string') {\r\n return value;\r\n }\r\n\r\n value = obj(value, options);\r\n\r\n // Numeric mask, number of zeros\r\n if (fullMask && type === 'numeric') {\r\n var maskZeros = options.mask.match(new RegExp(/^[0]+$/gm));\r\n if (maskZeros && maskZeros.length === 1) {\r\n var maskLength = maskZeros[0].length;\r\n if (maskLength > 3) {\r\n value = '' + value;\r\n while (value.length < maskLength) {\r\n value = '0' + value;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n obj.set = function(e, m) {\r\n if (m) {\r\n e.setAttribute('data-mask', m);\r\n // Reset the value\r\n var event = new Event('input', {\r\n bubbles: true,\r\n cancelable: true,\r\n });\r\n e.dispatchEvent(event);\r\n }\r\n }\r\n\r\n // Helper to extract date from a string\r\n obj.extractDateFromString = function (date, format) {\r\n var o = obj(date, { mask: format }, true);\r\n\r\n // Check if in format Excel (Need difference with format date or type detected is numeric)\r\n if (date > 0 && Number(date) == date && (o.values.join(\"\") !== o.value || o.type == \"numeric\")) {\r\n var d = new Date(Math.round((date - 25569) * 86400 * 1000));\r\n return d.getFullYear() + \"-\" + helpers.two(d.getMonth()) + \"-\" + helpers.two(d.getDate()) + ' 00:00:00';\r\n }\r\n\r\n var complete = false;\r\n\r\n if (o.values && o.values.length === o.tokens.length && o.values[o.values.length - 1].length >= o.tokens[o.tokens.length - 1].length) {\r\n complete = true;\r\n }\r\n\r\n if (o.date[0] && o.date[1] && (o.date[2] || complete)) {\r\n if (!o.date[2]) {\r\n o.date[2] = 1;\r\n }\r\n\r\n return o.date[0] + '-' + helpers.two(o.date[1]) + '-' + helpers.two(o.date[2]) + ' ' + helpers.two(o.date[3]) + ':' + helpers.two(o.date[4]) + ':' + helpers.two(o.date[5]);\r\n }\r\n\r\n return '';\r\n }\r\n\r\n // Helper to convert date into string\r\n obj.getDateString = function (value, options) {\r\n if (!options) {\r\n var options = {};\r\n }\r\n\r\n // Labels\r\n if (options && typeof (options) == 'object') {\r\n if (options.format) {\r\n var format = options.format;\r\n } else if (options.mask) {\r\n var format = options.mask;\r\n }\r\n } else {\r\n var format = options;\r\n }\r\n\r\n if (!format) {\r\n format = 'YYYY-MM-DD';\r\n }\r\n\r\n // Convert to number of hours\r\n if (format.indexOf('[h]') >= 0) {\r\n var result = 0;\r\n if (value && helpers.isNumeric(value)) {\r\n result = parseFloat(24 * Number(value));\r\n if (format.indexOf('mm') >= 0) {\r\n var h = ('' + result).split('.');\r\n if (h[1]) {\r\n var d = 60 * parseFloat('0.' + h[1])\r\n d = parseFloat(d.toFixed(2));\r\n } else {\r\n var d = 0;\r\n }\r\n result = parseInt(h[0]) + ':' + helpers.two(d);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // Date instance\r\n if (value instanceof Date) {\r\n value = helpers_date.now(value);\r\n } else if (value && helpers.isNumeric(value)) {\r\n value = helpers_date.numToDate(value);\r\n }\r\n\r\n // Tokens\r\n var tokens = ['DAY', 'WD', 'DDDD', 'DDD', 'DD', 'D', 'Q', 'HH24', 'HH12', 'HH', 'H', 'AM/PM', 'MI', 'SS', 'MS', 'YYYY', 'YYY', 'YY', 'Y', 'MONTH', 'MON', 'MMMMM', 'MMMM', 'MMM', 'MM', 'M', '.'];\r\n\r\n // Expression to extract all tokens from the string\r\n var e = new RegExp(tokens.join('|'), 'gi');\r\n // Extract\r\n var t = format.match(e);\r\n\r\n // Compatibility with excel\r\n for (var i = 0; i < t.length; i++) {\r\n if (t[i].toUpperCase() == 'MM') {\r\n // Not a month, correct to minutes\r\n if (t[i - 1] && t[i - 1].toUpperCase().indexOf('H') >= 0) {\r\n t[i] = 'mi';\r\n } else if (t[i - 2] && t[i - 2].toUpperCase().indexOf('H') >= 0) {\r\n t[i] = 'mi';\r\n } else if (t[i + 1] && t[i + 1].toUpperCase().indexOf('S') >= 0) {\r\n t[i] = 'mi';\r\n } else if (t[i + 2] && t[i + 2].toUpperCase().indexOf('S') >= 0) {\r\n t[i] = 'mi';\r\n }\r\n }\r\n }\r\n\r\n // Object\r\n var o = {\r\n tokens: t\r\n }\r\n\r\n // Value\r\n if (value) {\r\n var d = '' + value;\r\n var splitStr = (d.indexOf('T') !== -1) ? 'T' : ' ';\r\n d = d.split(splitStr);\r\n\r\n var h = 0;\r\n var m = 0;\r\n var s = 0;\r\n\r\n if (d[1]) {\r\n h = d[1].split(':');\r\n m = h[1] ? h[1] : 0;\r\n s = h[2] ? h[2] : 0;\r\n h = h[0] ? h[0] : 0;\r\n }\r\n\r\n d = d[0].split('-');\r\n\r\n let day = new Date(d[0], d[1], 0).getDate();\r\n\r\n if (d[0] && d[1] && d[2] && d[0] > 0 && d[1] > 0 && d[1] < 13 && d[2] > 0 && d[2] <= day) {\r\n\r\n // Data\r\n o.data = [d[0], d[1], d[2], h, m, s];\r\n\r\n // Value\r\n o.value = [];\r\n\r\n // Calendar instance\r\n var calendar = new Date(o.data[0], o.data[1] - 1, o.data[2], o.data[3], o.data[4], o.data[5]);\r\n\r\n // Get method\r\n var get = function (i) {\r\n // Token\r\n var t = this.tokens[i];\r\n // Case token\r\n var s = t.toUpperCase();\r\n var v = null;\r\n\r\n if (s === 'YYYY') {\r\n v = this.data[0];\r\n } else if (s === 'YYY') {\r\n v = this.data[0].substring(1, 4);\r\n } else if (s === 'YY') {\r\n v = this.data[0].substring(2, 4);\r\n } else if (s === 'Y') {\r\n v = this.data[0].substring(3, 4);\r\n } else if (t === 'MON') {\r\n v = helpers_date.months[calendar.getMonth()].substr(0, 3).toUpperCase();\r\n } else if (t === 'mon') {\r\n v = helpers_date.months[calendar.getMonth()].substr(0, 3).toLowerCase();\r\n } else if (t === 'MONTH') {\r\n v = helpers_date.months[calendar.getMonth()].toUpperCase();\r\n } else if (t === 'month') {\r\n v = helpers_date.months[calendar.getMonth()].toLowerCase();\r\n } else if (s === 'MMMMM') {\r\n v = helpers_date.months[calendar.getMonth()].substr(0, 1);\r\n } else if (s === 'MMMM' || t === 'Month') {\r\n v = helpers_date.months[calendar.getMonth()];\r\n } else if (s === 'MMM' || t == 'Mon') {\r\n v = helpers_date.months[calendar.getMonth()].substr(0, 3);\r\n } else if (s === 'MM') {\r\n v = helpers.two(this.data[1]);\r\n } else if (s === 'M') {\r\n v = calendar.getMonth() + 1;\r\n } else if (t === 'DAY') {\r\n v = helpers_date.weekdays[calendar.getDay()].toUpperCase();\r\n } else if (t === 'day') {\r\n v = helpers_date.weekdays[calendar.getDay()].toLowerCase();\r\n } else if (s === 'DDDD' || t == 'Day') {\r\n v = helpers_date.weekdays[calendar.getDay()];\r\n } else if (s === 'DDD') {\r\n v = helpers_date.weekdays[calendar.getDay()].substr(0, 3);\r\n } else if (s === 'DD') {\r\n v = helpers.two(this.data[2]);\r\n } else if (s === 'D') {\r\n v = parseInt(this.data[2]);\r\n } else if (s === 'Q') {\r\n v = Math.floor((calendar.getMonth() + 3) / 3);\r\n } else if (s === 'HH24' || s === 'HH') {\r\n v = this.data[3];\r\n if (v > 12 && this.tokens.indexOf('am/pm') !== -1) {\r\n v -= 12;\r\n }\r\n v = helpers.two(v);\r\n } else if (s === 'HH12') {\r\n if (this.data[3] > 12) {\r\n v = helpers.two(this.data[3] - 12);\r\n } else {\r\n v = helpers.two(this.data[3]);\r\n }\r\n } else if (s === 'H') {\r\n v = this.data[3];\r\n if (v > 12 && this.tokens.indexOf('am/pm') !== -1) {\r\n v -= 12;\r\n v = helpers.two(v);\r\n }\r\n } else if (s === 'MI') {\r\n v = helpers.two(this.data[4]);\r\n } else if (s === 'SS') {\r\n v = helpers.two(this.data[5]);\r\n } else if (s === 'MS') {\r\n v = calendar.getMilliseconds();\r\n } else if (s === 'AM/PM') {\r\n if (this.data[3] >= 12) {\r\n v = 'PM';\r\n } else {\r\n v = 'AM';\r\n }\r\n } else if (s === 'WD') {\r\n v = helpers_date.weekdays[calendar.getDay()];\r\n }\r\n\r\n if (v === null) {\r\n this.value[i] = this.tokens[i];\r\n } else {\r\n this.value[i] = v;\r\n }\r\n }\r\n\r\n for (var i = 0; i < o.tokens.length; i++) {\r\n get.call(o, i);\r\n }\r\n // Put pieces together\r\n value = o.value.join('');\r\n } else {\r\n value = '';\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n return obj;\r\n}\r\n\r\n/* harmony default export */ var mask = (Mask());\r\n\n;// CONCATENATED MODULE: ./src/plugins/calendar.js\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nfunction Calendar() {\r\n var Component = (function (el, options) {\r\n // Already created, update options\r\n if (el.calendar) {\r\n return el.calendar.setOptions(options, true);\r\n }\r\n\r\n // New instance\r\n var obj = {type: 'calendar'};\r\n obj.options = {};\r\n\r\n // Date\r\n obj.date = null;\r\n\r\n /**\r\n * Update options\r\n */\r\n obj.setOptions = function (options, reset) {\r\n // Default configuration\r\n var defaults = {\r\n // Render type: [ default | year-month-picker ]\r\n type: 'default',\r\n // Restrictions\r\n validRange: null,\r\n // Starting weekday - 0 for sunday, 6 for saturday\r\n startingDay: null,\r\n // Date format\r\n format: 'DD/MM/YYYY',\r\n // Allow keyboard date entry\r\n readonly: true,\r\n // Today is default\r\n today: false,\r\n // Show timepicker\r\n time: false,\r\n // Show the reset button\r\n resetButton: true,\r\n // Placeholder\r\n placeholder: '',\r\n // Translations can be done here\r\n months: helpers_date.monthsShort,\r\n monthsFull: helpers_date.months,\r\n weekdays: helpers_date.weekdays,\r\n textDone: dictionary.translate('Done'),\r\n textReset: dictionary.translate('Reset'),\r\n textUpdate: dictionary.translate('Update'),\r\n // Value\r\n value: null,\r\n // Fullscreen (this is automatic set for screensize < 800)\r\n fullscreen: false,\r\n // Create the calendar closed as default\r\n opened: false,\r\n // Events\r\n onopen: null,\r\n onclose: null,\r\n onchange: null,\r\n onupdate: null,\r\n // Internal mode controller\r\n mode: null,\r\n position: null,\r\n // Data type\r\n dataType: null,\r\n // Controls\r\n controls: true,\r\n // Auto select\r\n autoSelect: true,\r\n }\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n if (typeof (obj.options[property]) == 'undefined' || reset === true) {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n }\r\n\r\n // Reset button\r\n if (obj.options.resetButton == false) {\r\n calendarReset.style.display = 'none';\r\n } else {\r\n calendarReset.style.display = '';\r\n }\r\n\r\n // Readonly\r\n if (obj.options.readonly) {\r\n el.setAttribute('readonly', 'readonly');\r\n } else {\r\n el.removeAttribute('readonly');\r\n }\r\n\r\n // Placeholder\r\n if (obj.options.placeholder) {\r\n el.setAttribute('placeholder', obj.options.placeholder);\r\n } else {\r\n el.removeAttribute('placeholder');\r\n }\r\n\r\n if (helpers.isNumeric(obj.options.value) && obj.options.value > 0) {\r\n obj.options.value = Component.numToDate(obj.options.value);\r\n // Data type numeric\r\n obj.options.dataType = 'numeric';\r\n }\r\n\r\n // Texts\r\n calendarReset.innerHTML = obj.options.textReset;\r\n calendarConfirm.innerHTML = obj.options.textDone;\r\n calendarControlsUpdateButton.innerHTML = obj.options.textUpdate;\r\n\r\n // Define mask\r\n if (obj.options.format) {\r\n el.setAttribute('data-mask', obj.options.format.toLowerCase());\r\n }\r\n\r\n // Value\r\n if (!obj.options.value && obj.options.today) {\r\n var value = Component.now();\r\n } else {\r\n var value = obj.options.value;\r\n }\r\n\r\n // Set internal date\r\n if (value) {\r\n // Force the update\r\n obj.options.value = null;\r\n // New value\r\n obj.setValue(value);\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * Open the calendar\r\n */\r\n obj.open = function (value) {\r\n if (!calendar.classList.contains('jcalendar-focus')) {\r\n if (!calendar.classList.contains('jcalendar-inline')) {\r\n // Current\r\n Component.current = obj;\r\n // Start tracking\r\n tracking(obj, true);\r\n // Create the days\r\n obj.getDays();\r\n // Render months\r\n if (obj.options.type == 'year-month-picker') {\r\n obj.getMonths();\r\n }\r\n // Get time\r\n if (obj.options.time) {\r\n calendarSelectHour.value = obj.date[3];\r\n calendarSelectMin.value = obj.date[4];\r\n }\r\n\r\n // Show calendar\r\n calendar.classList.add('jcalendar-focus');\r\n\r\n // Get the position of the corner helper\r\n if (helpers.getWindowWidth() < 800 || obj.options.fullscreen) {\r\n calendar.classList.add('jcalendar-fullsize');\r\n // Animation\r\n animation.slideBottom(calendarContent, 1);\r\n } else {\r\n calendar.classList.remove('jcalendar-fullsize');\r\n\r\n var rect = el.getBoundingClientRect();\r\n var rectContent = calendarContent.getBoundingClientRect();\r\n\r\n if (obj.options.position) {\r\n calendarContainer.style.position = 'fixed';\r\n if (window.innerHeight < rect.bottom + rectContent.height) {\r\n calendarContainer.style.top = (rect.top - (rectContent.height + 2)) + 'px';\r\n } else {\r\n calendarContainer.style.top = (rect.top + rect.height + 2) + 'px';\r\n }\r\n calendarContainer.style.left = rect.left + 'px';\r\n } else {\r\n if (window.innerHeight < rect.bottom + rectContent.height) {\r\n var d = -1 * (rect.height + rectContent.height + 2);\r\n if (d + rect.top < 0) {\r\n d = -1 * (rect.top + rect.height);\r\n }\r\n calendarContainer.style.top = d + 'px';\r\n } else {\r\n calendarContainer.style.top = 2 + 'px';\r\n }\r\n\r\n if (window.innerWidth < rect.left + rectContent.width) {\r\n var d = window.innerWidth - (rect.left + rectContent.width + 20);\r\n calendarContainer.style.left = d + 'px';\r\n } else {\r\n calendarContainer.style.left = '0px';\r\n }\r\n }\r\n }\r\n\r\n // Events\r\n if (typeof (obj.options.onopen) == 'function') {\r\n obj.options.onopen(el);\r\n }\r\n }\r\n }\r\n }\r\n\r\n obj.close = function (ignoreEvents, update) {\r\n if (obj.options.autoSelect !== true && typeof(update) === 'undefined') {\r\n update = false;\r\n }\r\n if (calendar.classList.contains('jcalendar-focus')) {\r\n if (update !== false) {\r\n var element = calendar.querySelector('.jcalendar-selected');\r\n\r\n if (typeof (update) == 'string') {\r\n var value = update;\r\n } else if (!element || element.classList.contains('jcalendar-disabled')) {\r\n var value = obj.options.value\r\n } else {\r\n var value = obj.getValue();\r\n }\r\n\r\n obj.setValue(value);\r\n } else {\r\n let value = obj.options.value || '';\r\n obj.options.value = null;\r\n obj.setValue(value)\r\n }\r\n\r\n // Events\r\n if (!ignoreEvents && typeof (obj.options.onclose) == 'function') {\r\n obj.options.onclose(el);\r\n }\r\n // Hide\r\n calendar.classList.remove('jcalendar-focus');\r\n // Stop tracking\r\n tracking(obj, false);\r\n // Current\r\n Component.current = null;\r\n }\r\n\r\n return obj.options.value;\r\n }\r\n\r\n obj.prev = function () {\r\n // Check if the visualization is the days picker or years picker\r\n if (obj.options.mode == 'years') {\r\n obj.date[0] = obj.date[0] - 12;\r\n\r\n // Update picker table of days\r\n obj.getYears();\r\n } else if (obj.options.mode == 'months') {\r\n obj.date[0] = parseInt(obj.date[0]) - 1;\r\n // Update picker table of months\r\n obj.getMonths();\r\n } else {\r\n // Go to the previous month\r\n if (obj.date[1] < 2) {\r\n obj.date[0] = obj.date[0] - 1;\r\n obj.date[1] = 12;\r\n } else {\r\n obj.date[1] = obj.date[1] - 1;\r\n }\r\n\r\n // Update picker table of days\r\n obj.getDays();\r\n }\r\n }\r\n\r\n obj.next = function () {\r\n // Check if the visualization is the days picker or years picker\r\n if (obj.options.mode == 'years') {\r\n obj.date[0] = parseInt(obj.date[0]) + 12;\r\n\r\n // Update picker table of days\r\n obj.getYears();\r\n } else if (obj.options.mode == 'months') {\r\n obj.date[0] = parseInt(obj.date[0]) + 1;\r\n // Update picker table of months\r\n obj.getMonths();\r\n } else {\r\n // Go to the previous month\r\n if (obj.date[1] > 11) {\r\n obj.date[0] = parseInt(obj.date[0]) + 1;\r\n obj.date[1] = 1;\r\n } else {\r\n obj.date[1] = parseInt(obj.date[1]) + 1;\r\n }\r\n\r\n // Update picker table of days\r\n obj.getDays();\r\n }\r\n }\r\n\r\n /**\r\n * Set today\r\n */\r\n obj.setToday = function () {\r\n // Today\r\n var value = new Date().toISOString().substr(0, 10);\r\n // Change value\r\n obj.setValue(value);\r\n // Value\r\n return value;\r\n }\r\n\r\n obj.setValue = function (val) {\r\n if (!val) {\r\n val = '' + val;\r\n }\r\n // Values\r\n var newValue = val;\r\n var oldValue = obj.options.value;\r\n\r\n if (oldValue != newValue) {\r\n // Set label\r\n if (!newValue) {\r\n obj.date = null;\r\n var val = '';\r\n el.classList.remove('jcalendar_warning');\r\n el.title = '';\r\n } else {\r\n var value = obj.setLabel(newValue, obj.options);\r\n var date = newValue.split(' ');\r\n if (!date[1]) {\r\n date[1] = '00:00:00';\r\n }\r\n var time = date[1].split(':')\r\n var date = date[0].split('-');\r\n var y = parseInt(date[0]);\r\n var m = parseInt(date[1]);\r\n var d = parseInt(date[2]);\r\n var h = parseInt(time[0]);\r\n var i = parseInt(time[1]);\r\n obj.date = [y, m, d, h, i, 0];\r\n var val = obj.setLabel(newValue, obj.options);\r\n\r\n // Current selection day\r\n var current = Component.now(new Date(y, m - 1, d), true);\r\n\r\n // Available ranges\r\n if (obj.options.validRange) {\r\n if (!obj.options.validRange[0] || current >= obj.options.validRange[0]) {\r\n var test1 = true;\r\n } else {\r\n var test1 = false;\r\n }\r\n\r\n if (!obj.options.validRange[1] || current <= obj.options.validRange[1]) {\r\n var test2 = true;\r\n } else {\r\n var test2 = false;\r\n }\r\n\r\n if (!(test1 && test2)) {\r\n el.classList.add('jcalendar_warning');\r\n el.title = dictionary.translate('Date outside the valid range');\r\n } else {\r\n el.classList.remove('jcalendar_warning');\r\n el.title = '';\r\n }\r\n } else {\r\n el.classList.remove('jcalendar_warning');\r\n el.title = '';\r\n }\r\n }\r\n\r\n // New value\r\n obj.options.value = newValue;\r\n\r\n if (typeof (obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, newValue, oldValue);\r\n }\r\n\r\n // Lemonade JS\r\n if (el.value != val) {\r\n el.value = val;\r\n if (typeof (el.oninput) == 'function') {\r\n el.oninput({\r\n type: 'input',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (obj.date) {\r\n obj.getDays();\r\n // Render months\r\n if (obj.options.type == 'year-month-picker') {\r\n obj.getMonths();\r\n }\r\n }\r\n }\r\n\r\n obj.getValue = function () {\r\n if (obj.date) {\r\n if (obj.options.time) {\r\n return helpers.two(obj.date[0]) + '-' + helpers.two(obj.date[1]) + '-' + helpers.two(obj.date[2]) + ' ' + helpers.two(obj.date[3]) + ':' + helpers.two(obj.date[4]) + ':' + helpers.two(0);\r\n } else {\r\n return helpers.two(obj.date[0]) + '-' + helpers.two(obj.date[1]) + '-' + helpers.two(obj.date[2]) + ' ' + helpers.two(0) + ':' + helpers.two(0) + ':' + helpers.two(0);\r\n }\r\n } else {\r\n return \"\";\r\n }\r\n }\r\n\r\n /**\r\n * Calendar\r\n */\r\n obj.update = function (element, v) {\r\n if (element.classList.contains('jcalendar-disabled')) {\r\n // Do nothing\r\n } else {\r\n var elements = calendar.querySelector('.jcalendar-selected');\r\n if (elements) {\r\n elements.classList.remove('jcalendar-selected');\r\n }\r\n element.classList.add('jcalendar-selected');\r\n\r\n if (element.classList.contains('jcalendar-set-month')) {\r\n obj.date[1] = v;\r\n obj.date[2] = 1; // first day of the month\r\n } else {\r\n obj.date[2] = element.innerText;\r\n }\r\n\r\n if (!obj.options.time) {\r\n obj.close(null, true);\r\n } else {\r\n obj.date[3] = calendarSelectHour.value;\r\n obj.date[4] = calendarSelectMin.value;\r\n }\r\n }\r\n\r\n // Update\r\n updateActions();\r\n }\r\n\r\n /**\r\n * Set to blank\r\n */\r\n obj.reset = function () {\r\n // Close calendar\r\n obj.setValue('');\r\n obj.date = null;\r\n obj.close(false, false);\r\n }\r\n\r\n /**\r\n * Get calendar days\r\n */\r\n obj.getDays = function () {\r\n // Mode\r\n obj.options.mode = 'days';\r\n\r\n // Setting current values in case of NULLs\r\n var date = new Date();\r\n\r\n // Current selection\r\n var year = obj.date && helpers.isNumeric(obj.date[0]) ? obj.date[0] : parseInt(date.getFullYear());\r\n var month = obj.date && helpers.isNumeric(obj.date[1]) ? obj.date[1] : parseInt(date.getMonth()) + 1;\r\n var day = obj.date && helpers.isNumeric(obj.date[2]) ? obj.date[2] : parseInt(date.getDate());\r\n var hour = obj.date && helpers.isNumeric(obj.date[3]) ? obj.date[3] : parseInt(date.getHours());\r\n var min = obj.date && helpers.isNumeric(obj.date[4]) ? obj.date[4] : parseInt(date.getMinutes());\r\n\r\n // Selection container\r\n obj.date = [year, month, day, hour, min, 0];\r\n\r\n // Update title\r\n calendarLabelYear.innerHTML = year;\r\n calendarLabelMonth.innerHTML = obj.options.months[month - 1];\r\n\r\n // Current month and Year\r\n var isCurrentMonthAndYear = (date.getMonth() == month - 1) && (date.getFullYear() == year) ? true : false;\r\n var currentDay = date.getDate();\r\n\r\n // Number of days in the month\r\n var date = new Date(year, month, 0, 0, 0);\r\n var numberOfDays = date.getDate();\r\n\r\n // First day\r\n var date = new Date(year, month - 1, 0, 0, 0);\r\n var firstDay = date.getDay() + 1;\r\n\r\n // Index value\r\n var index = obj.options.startingDay || 0;\r\n\r\n // First of day relative to the starting calendar weekday\r\n firstDay = firstDay - index;\r\n\r\n // Reset table\r\n calendarBody.innerHTML = '';\r\n\r\n // Weekdays Row\r\n var row = document.createElement('tr');\r\n row.setAttribute('align', 'center');\r\n calendarBody.appendChild(row);\r\n\r\n // Create weekdays row\r\n for (var i = 0; i < 7; i++) {\r\n var cell = document.createElement('td');\r\n cell.classList.add('jcalendar-weekday')\r\n cell.innerHTML = obj.options.weekdays[index].substr(0, 1);\r\n row.appendChild(cell);\r\n // Next week day\r\n index++;\r\n // Restart index\r\n if (index > 6) {\r\n index = 0;\r\n }\r\n }\r\n\r\n // Index of days\r\n var index = 0;\r\n var d = 0;\r\n\r\n // Calendar table\r\n for (var j = 0; j < 6; j++) {\r\n // Reset cells container\r\n var row = document.createElement('tr');\r\n row.setAttribute('align', 'center');\r\n row.style.height = '34px';\r\n\r\n // Create cells\r\n for (var i = 0; i < 7; i++) {\r\n // Create cell\r\n var cell = document.createElement('td');\r\n cell.classList.add('jcalendar-set-day');\r\n\r\n if (index >= firstDay && index < (firstDay + numberOfDays)) {\r\n // Day cell\r\n d++;\r\n cell.innerHTML = d;\r\n\r\n // Selected\r\n if (d == day) {\r\n cell.classList.add('jcalendar-selected');\r\n }\r\n\r\n // Current selection day is today\r\n if (isCurrentMonthAndYear && currentDay == d) {\r\n cell.style.fontWeight = 'bold';\r\n }\r\n\r\n // Current selection day\r\n var current = Component.now(new Date(year, month - 1, d), true);\r\n\r\n // Available ranges\r\n if (obj.options.validRange) {\r\n if (!obj.options.validRange[0] || current >= obj.options.validRange[0]) {\r\n var test1 = true;\r\n } else {\r\n var test1 = false;\r\n }\r\n\r\n if (!obj.options.validRange[1] || current <= obj.options.validRange[1]) {\r\n var test2 = true;\r\n } else {\r\n var test2 = false;\r\n }\r\n\r\n if (!(test1 && test2)) {\r\n cell.classList.add('jcalendar-disabled');\r\n }\r\n }\r\n }\r\n // Day cell\r\n row.appendChild(cell);\r\n // Index\r\n index++;\r\n }\r\n\r\n // Add cell to the calendar body\r\n calendarBody.appendChild(row);\r\n }\r\n\r\n // Show time controls\r\n if (obj.options.time) {\r\n calendarControlsTime.style.display = '';\r\n } else {\r\n calendarControlsTime.style.display = 'none';\r\n }\r\n\r\n // Update\r\n updateActions();\r\n }\r\n\r\n obj.getMonths = function () {\r\n // Mode\r\n obj.options.mode = 'months';\r\n\r\n // Loading month labels\r\n var months = obj.options.months;\r\n\r\n // Value\r\n var value = obj.options.value;\r\n\r\n // Current date\r\n var date = new Date();\r\n var currentYear = parseInt(date.getFullYear());\r\n var currentMonth = parseInt(date.getMonth()) + 1;\r\n var selectedYear = obj.date && helpers.isNumeric(obj.date[0]) ? obj.date[0] : currentYear;\r\n var selectedMonth = obj.date && helpers.isNumeric(obj.date[1]) ? obj.date[1] : currentMonth;\r\n\r\n // Update title\r\n calendarLabelYear.innerHTML = obj.date[0];\r\n calendarLabelMonth.innerHTML = months[selectedMonth - 1];\r\n\r\n // Table\r\n var table = document.createElement('table');\r\n table.setAttribute('width', '100%');\r\n\r\n // Row\r\n var row = null;\r\n\r\n // Calendar table\r\n for (var i = 0; i < 12; i++) {\r\n if (!(i % 4)) {\r\n // Reset cells container\r\n var row = document.createElement('tr');\r\n row.setAttribute('align', 'center');\r\n table.appendChild(row);\r\n }\r\n\r\n // Create cell\r\n var cell = document.createElement('td');\r\n cell.classList.add('jcalendar-set-month');\r\n cell.setAttribute('data-value', i + 1);\r\n cell.innerText = months[i];\r\n\r\n if (obj.options.validRange) {\r\n var current = selectedYear + '-' + helpers.two(i + 1);\r\n if (!obj.options.validRange[0] || current >= obj.options.validRange[0].substr(0, 7)) {\r\n var test1 = true;\r\n } else {\r\n var test1 = false;\r\n }\r\n\r\n if (!obj.options.validRange[1] || current <= obj.options.validRange[1].substr(0, 7)) {\r\n var test2 = true;\r\n } else {\r\n var test2 = false;\r\n }\r\n\r\n if (!(test1 && test2)) {\r\n cell.classList.add('jcalendar-disabled');\r\n }\r\n }\r\n\r\n if (i + 1 == selectedMonth) {\r\n cell.classList.add('jcalendar-selected');\r\n }\r\n\r\n if (currentYear == selectedYear && i + 1 == currentMonth) {\r\n cell.style.fontWeight = 'bold';\r\n }\r\n\r\n row.appendChild(cell);\r\n }\r\n\r\n calendarBody.innerHTML = '';\r\n calendarBody.children[0].children[0].appendChild(table);\r\n\r\n // Update\r\n updateActions();\r\n }\r\n\r\n obj.getYears = function () {\r\n // Mode\r\n obj.options.mode = 'years';\r\n\r\n // Current date\r\n var date = new Date();\r\n var currentYear = date.getFullYear();\r\n var selectedYear = obj.date && helpers.isNumeric(obj.date[0]) ? obj.date[0] : parseInt(date.getFullYear());\r\n\r\n // Array of years\r\n var y = [];\r\n for (var i = 0; i < 25; i++) {\r\n y[i] = parseInt(obj.date[0]) + (i - 12);\r\n }\r\n\r\n // Assembling the year tables\r\n var table = document.createElement('table');\r\n table.setAttribute('width', '100%');\r\n\r\n for (var i = 0; i < 25; i++) {\r\n if (!(i % 5)) {\r\n // Reset cells container\r\n var row = document.createElement('tr');\r\n row.setAttribute('align', 'center');\r\n table.appendChild(row);\r\n }\r\n\r\n // Create cell\r\n var cell = document.createElement('td');\r\n cell.classList.add('jcalendar-set-year');\r\n cell.innerText = y[i];\r\n\r\n if (selectedYear == y[i]) {\r\n cell.classList.add('jcalendar-selected');\r\n }\r\n\r\n if (currentYear == y[i]) {\r\n cell.style.fontWeight = 'bold';\r\n }\r\n\r\n row.appendChild(cell);\r\n }\r\n\r\n calendarBody.innerHTML = '';\r\n calendarBody.firstChild.firstChild.appendChild(table);\r\n\r\n // Update\r\n updateActions();\r\n }\r\n\r\n obj.setLabel = function (value, mixed) {\r\n return Component.getDateString(value, mixed);\r\n }\r\n\r\n obj.fromFormatted = function (value, format) {\r\n return Component.extractDateFromString(value, format);\r\n }\r\n\r\n var mouseUpControls = function (e) {\r\n var element = helpers.findElement(e.target, 'jcalendar-container');\r\n if (element) {\r\n var action = e.target.className;\r\n\r\n // Object id\r\n if (action == 'jcalendar-prev') {\r\n obj.prev();\r\n } else if (action == 'jcalendar-next') {\r\n obj.next();\r\n } else if (action == 'jcalendar-month') {\r\n obj.getMonths();\r\n } else if (action == 'jcalendar-year') {\r\n obj.getYears();\r\n } else if (action == 'jcalendar-set-year') {\r\n obj.date[0] = e.target.innerText;\r\n if (obj.options.type == 'year-month-picker') {\r\n obj.getMonths();\r\n } else {\r\n obj.getDays();\r\n }\r\n } else if (e.target.classList.contains('jcalendar-set-month')) {\r\n var month = parseInt(e.target.getAttribute('data-value'));\r\n if (obj.options.type == 'year-month-picker') {\r\n obj.update(e.target, month);\r\n } else {\r\n obj.date[1] = month;\r\n obj.getDays();\r\n }\r\n } else if (action == 'jcalendar-confirm' || action == 'jcalendar-update' || action == 'jcalendar-close') {\r\n obj.close(null, true);\r\n } else if (action == 'jcalendar-backdrop') {\r\n obj.close(false, false);\r\n } else if (action == 'jcalendar-reset') {\r\n obj.reset();\r\n } else if (e.target.classList.contains('jcalendar-set-day') && e.target.innerText) {\r\n obj.update(e.target);\r\n }\r\n } else {\r\n obj.close(false, false);\r\n }\r\n }\r\n\r\n var keyUpControls = function (e) {\r\n if (e.target.value && e.target.value.length > 3) {\r\n var test = Component.extractDateFromString(e.target.value, obj.options.format);\r\n if (test) {\r\n obj.setValue(test);\r\n }\r\n }\r\n }\r\n\r\n // Update actions button\r\n var updateActions = function () {\r\n var currentDay = calendar.querySelector('.jcalendar-selected');\r\n\r\n if (currentDay && currentDay.classList.contains('jcalendar-disabled')) {\r\n calendarControlsUpdateButton.setAttribute('disabled', 'disabled');\r\n calendarSelectHour.setAttribute('disabled', 'disabled');\r\n calendarSelectMin.setAttribute('disabled', 'disabled');\r\n } else {\r\n calendarControlsUpdateButton.removeAttribute('disabled');\r\n calendarSelectHour.removeAttribute('disabled');\r\n calendarSelectMin.removeAttribute('disabled');\r\n }\r\n\r\n // Event\r\n if (typeof (obj.options.onupdate) == 'function') {\r\n obj.options.onupdate(el, obj.getValue());\r\n }\r\n }\r\n\r\n var calendar = null;\r\n var calendarReset = null;\r\n var calendarConfirm = null;\r\n var calendarContainer = null;\r\n var calendarContent = null;\r\n var calendarLabelYear = null;\r\n var calendarLabelMonth = null;\r\n var calendarTable = null;\r\n var calendarBody = null;\r\n\r\n var calendarControls = null;\r\n var calendarControlsTime = null;\r\n var calendarControlsUpdate = null;\r\n var calendarControlsUpdateButton = null;\r\n var calendarSelectHour = null;\r\n var calendarSelectMin = null;\r\n\r\n var init = function () {\r\n // Get value from initial element if that is an input\r\n if (el.tagName == 'INPUT' && el.value) {\r\n options.value = el.value;\r\n }\r\n\r\n // Calendar DOM elements\r\n calendarReset = document.createElement('div');\r\n calendarReset.className = 'jcalendar-reset';\r\n\r\n calendarConfirm = document.createElement('div');\r\n calendarConfirm.className = 'jcalendar-confirm';\r\n\r\n calendarControls = document.createElement('div');\r\n calendarControls.className = 'jcalendar-controls'\r\n calendarControls.style.borderBottom = '1px solid #ddd';\r\n calendarControls.appendChild(calendarReset);\r\n calendarControls.appendChild(calendarConfirm);\r\n\r\n calendarContainer = document.createElement('div');\r\n calendarContainer.className = 'jcalendar-container';\r\n calendarContent = document.createElement('div');\r\n calendarContent.className = 'jcalendar-content';\r\n calendarContainer.appendChild(calendarContent);\r\n\r\n // Main element\r\n if (el.tagName == 'DIV') {\r\n calendar = el;\r\n calendar.classList.add('jcalendar-inline');\r\n } else {\r\n // Add controls to the screen\r\n calendarContent.appendChild(calendarControls);\r\n\r\n calendar = document.createElement('div');\r\n calendar.className = 'jcalendar';\r\n }\r\n calendar.classList.add('jcalendar-container');\r\n calendar.appendChild(calendarContainer);\r\n\r\n // Table container\r\n var calendarTableContainer = document.createElement('div');\r\n calendarTableContainer.className = 'jcalendar-table';\r\n calendarContent.appendChild(calendarTableContainer);\r\n\r\n // Previous button\r\n var calendarHeaderPrev = document.createElement('td');\r\n calendarHeaderPrev.setAttribute('colspan', '2');\r\n calendarHeaderPrev.className = 'jcalendar-prev';\r\n\r\n // Header with year and month\r\n calendarLabelYear = document.createElement('span');\r\n calendarLabelYear.className = 'jcalendar-year';\r\n calendarLabelMonth = document.createElement('span');\r\n calendarLabelMonth.className = 'jcalendar-month';\r\n\r\n var calendarHeaderTitle = document.createElement('td');\r\n calendarHeaderTitle.className = 'jcalendar-header';\r\n calendarHeaderTitle.setAttribute('colspan', '3');\r\n calendarHeaderTitle.appendChild(calendarLabelMonth);\r\n calendarHeaderTitle.appendChild(calendarLabelYear);\r\n\r\n var calendarHeaderNext = document.createElement('td');\r\n calendarHeaderNext.setAttribute('colspan', '2');\r\n calendarHeaderNext.className = 'jcalendar-next';\r\n\r\n var calendarHeader = document.createElement('thead');\r\n var calendarHeaderRow = document.createElement('tr');\r\n calendarHeaderRow.appendChild(calendarHeaderPrev);\r\n calendarHeaderRow.appendChild(calendarHeaderTitle);\r\n calendarHeaderRow.appendChild(calendarHeaderNext);\r\n calendarHeader.appendChild(calendarHeaderRow);\r\n\r\n calendarTable = document.createElement('table');\r\n calendarBody = document.createElement('tbody');\r\n calendarTable.setAttribute('cellpadding', '0');\r\n calendarTable.setAttribute('cellspacing', '0');\r\n calendarTable.appendChild(calendarHeader);\r\n calendarTable.appendChild(calendarBody);\r\n calendarTableContainer.appendChild(calendarTable);\r\n\r\n calendarSelectHour = document.createElement('select');\r\n calendarSelectHour.className = 'jcalendar-select';\r\n calendarSelectHour.onchange = function () {\r\n obj.date[3] = this.value;\r\n\r\n // Event\r\n if (typeof (obj.options.onupdate) == 'function') {\r\n obj.options.onupdate(el, obj.getValue());\r\n }\r\n }\r\n\r\n for (var i = 0; i < 24; i++) {\r\n var element = document.createElement('option');\r\n element.value = i;\r\n element.innerHTML = helpers.two(i);\r\n calendarSelectHour.appendChild(element);\r\n }\r\n\r\n calendarSelectMin = document.createElement('select');\r\n calendarSelectMin.className = 'jcalendar-select';\r\n calendarSelectMin.onchange = function () {\r\n obj.date[4] = this.value;\r\n\r\n // Event\r\n if (typeof (obj.options.onupdate) == 'function') {\r\n obj.options.onupdate(el, obj.getValue());\r\n }\r\n }\r\n\r\n for (var i = 0; i < 60; i++) {\r\n var element = document.createElement('option');\r\n element.value = i;\r\n element.innerHTML = helpers.two(i);\r\n calendarSelectMin.appendChild(element);\r\n }\r\n\r\n // Footer controls\r\n var calendarControlsFooter = document.createElement('div');\r\n calendarControlsFooter.className = 'jcalendar-controls';\r\n\r\n calendarControlsTime = document.createElement('div');\r\n calendarControlsTime.className = 'jcalendar-time';\r\n calendarControlsTime.style.maxWidth = '140px';\r\n calendarControlsTime.appendChild(calendarSelectHour);\r\n calendarControlsTime.appendChild(calendarSelectMin);\r\n\r\n calendarControlsUpdateButton = document.createElement('button');\r\n calendarControlsUpdateButton.setAttribute('type', 'button');\r\n calendarControlsUpdateButton.className = 'jcalendar-update';\r\n\r\n calendarControlsUpdate = document.createElement('div');\r\n calendarControlsUpdate.style.flexGrow = '10';\r\n calendarControlsUpdate.appendChild(calendarControlsUpdateButton);\r\n calendarControlsFooter.appendChild(calendarControlsTime);\r\n\r\n // Only show the update button for input elements\r\n if (el.tagName == 'INPUT') {\r\n calendarControlsFooter.appendChild(calendarControlsUpdate);\r\n }\r\n\r\n calendarContent.appendChild(calendarControlsFooter);\r\n\r\n var calendarBackdrop = document.createElement('div');\r\n calendarBackdrop.className = 'jcalendar-backdrop';\r\n calendar.appendChild(calendarBackdrop);\r\n\r\n // Handle events\r\n el.addEventListener(\"keyup\", keyUpControls);\r\n\r\n // Add global events\r\n calendar.addEventListener(\"swipeleft\", function (e) {\r\n animation.slideLeft(calendarTable, 0, function () {\r\n obj.next();\r\n animation.slideRight(calendarTable, 1);\r\n });\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n calendar.addEventListener(\"swiperight\", function (e) {\r\n animation.slideRight(calendarTable, 0, function () {\r\n obj.prev();\r\n animation.slideLeft(calendarTable, 1);\r\n });\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n if ('ontouchend' in document.documentElement === true) {\r\n calendar.addEventListener(\"touchend\", mouseUpControls);\r\n el.addEventListener(\"touchend\", obj.open);\r\n } else {\r\n calendar.addEventListener(\"mouseup\", mouseUpControls);\r\n el.addEventListener(\"mouseup\", obj.open);\r\n }\r\n\r\n // Global controls\r\n if (!Component.hasEvents) {\r\n // Execute only one time\r\n Component.hasEvents = true;\r\n // Enter and Esc\r\n document.addEventListener(\"keydown\", Component.keydown);\r\n }\r\n\r\n // Set configuration\r\n obj.setOptions(options);\r\n\r\n // Append element to the DOM\r\n if (el.tagName == 'INPUT') {\r\n el.parentNode.insertBefore(calendar, el.nextSibling);\r\n // Add properties\r\n el.setAttribute('autocomplete', 'off');\r\n // Element\r\n el.classList.add('jcalendar-input');\r\n // Value\r\n el.value = obj.setLabel(obj.getValue(), obj.options);\r\n } else {\r\n // Get days\r\n obj.getDays();\r\n // Hour\r\n if (obj.options.time) {\r\n calendarSelectHour.value = obj.date[3];\r\n calendarSelectMin.value = obj.date[4];\r\n }\r\n }\r\n\r\n // Default opened\r\n if (obj.options.opened == true) {\r\n obj.open();\r\n }\r\n\r\n // Controls\r\n if (obj.options.controls == false) {\r\n calendarContainer.classList.add('jcalendar-hide-controls');\r\n }\r\n\r\n // Change method\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function (val) {\r\n if (val === undefined) {\r\n return obj.getValue();\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n // Keep object available from the node\r\n el.calendar = calendar.calendar = obj;\r\n }\r\n\r\n init();\r\n\r\n return obj;\r\n });\r\n\r\n Component.keydown = function (e) {\r\n var calendar = null;\r\n if (calendar = Component.current) {\r\n if (e.which == 13) {\r\n // ENTER\r\n calendar.close(false, true);\r\n } else if (e.which == 27) {\r\n // ESC\r\n calendar.close(false, false);\r\n }\r\n }\r\n }\r\n\r\n Component.prettify = function (d, texts) {\r\n if (!texts) {\r\n var texts = {\r\n justNow: 'Just now',\r\n xMinutesAgo: '{0}m ago',\r\n xHoursAgo: '{0}h ago',\r\n xDaysAgo: '{0}d ago',\r\n xWeeksAgo: '{0}w ago',\r\n xMonthsAgo: '{0} mon ago',\r\n xYearsAgo: '{0}y ago',\r\n }\r\n }\r\n\r\n if (d.indexOf('GMT') === -1 && d.indexOf('Z') === -1) {\r\n d += ' GMT';\r\n }\r\n\r\n var d1 = new Date();\r\n var d2 = new Date(d);\r\n var total = parseInt((d1 - d2) / 1000 / 60);\r\n\r\n String.prototype.format = function (o) {\r\n return this.replace('{0}', o);\r\n }\r\n\r\n if (total == 0) {\r\n var text = texts.justNow;\r\n } else if (total < 90) {\r\n var text = texts.xMinutesAgo.format(total);\r\n } else if (total < 1440) { // One day\r\n var text = texts.xHoursAgo.format(Math.round(total / 60));\r\n } else if (total < 20160) { // 14 days\r\n var text = texts.xDaysAgo.format(Math.round(total / 1440));\r\n } else if (total < 43200) { // 30 days\r\n var text = texts.xWeeksAgo.format(Math.round(total / 10080));\r\n } else if (total < 1036800) { // 24 months\r\n var text = texts.xMonthsAgo.format(Math.round(total / 43200));\r\n } else { // 24 months+\r\n var text = texts.xYearsAgo.format(Math.round(total / 525600));\r\n }\r\n\r\n return text;\r\n }\r\n\r\n Component.prettifyAll = function () {\r\n var elements = document.querySelectorAll('.prettydate');\r\n for (var i = 0; i < elements.length; i++) {\r\n if (elements[i].getAttribute('data-date')) {\r\n elements[i].innerHTML = Component.prettify(elements[i].getAttribute('data-date'));\r\n } else {\r\n if (elements[i].innerHTML) {\r\n elements[i].setAttribute('title', elements[i].innerHTML);\r\n elements[i].setAttribute('data-date', elements[i].innerHTML);\r\n elements[i].innerHTML = Component.prettify(elements[i].innerHTML);\r\n }\r\n }\r\n }\r\n }\r\n\r\n Component.now = helpers_date.now;\r\n Component.toArray = helpers_date.toArray;\r\n Component.dateToNum = helpers_date.dateToNum\r\n Component.numToDate = helpers_date.numToDate;\r\n Component.weekdays = helpers_date.weekdays;\r\n Component.months = helpers_date.months;\r\n Component.weekdaysShort = helpers_date.weekdaysShort;\r\n Component.monthsShort = helpers_date.monthsShort;\r\n\r\n // Legacy shortcut\r\n Component.extractDateFromString = mask.extractDateFromString;\r\n Component.getDateString = mask.getDateString;\r\n\r\n return Component;\r\n}\r\n\r\n/* harmony default export */ var calendar = (Calendar());\n;// CONCATENATED MODULE: ./src/plugins/palette.js\n// More palettes https://coolors.co/ or https://gka.github.io/palettes/#/10|s|003790,005647,ffffe0|ffffe0,ff005e,93003a|1|1\r\n\r\nfunction Palette() {\r\n\r\n var palette = {\r\n material: [\r\n [\"#ffebee\", \"#fce4ec\", \"#f3e5f5\", \"#e8eaf6\", \"#e3f2fd\", \"#e0f7fa\", \"#e0f2f1\", \"#e8f5e9\", \"#f1f8e9\", \"#f9fbe7\", \"#fffde7\", \"#fff8e1\", \"#fff3e0\", \"#fbe9e7\", \"#efebe9\", \"#fafafa\", \"#eceff1\"],\r\n [\"#ffcdd2\", \"#f8bbd0\", \"#e1bee7\", \"#c5cae9\", \"#bbdefb\", \"#b2ebf2\", \"#b2dfdb\", \"#c8e6c9\", \"#dcedc8\", \"#f0f4c3\", \"#fff9c4\", \"#ffecb3\", \"#ffe0b2\", \"#ffccbc\", \"#d7ccc8\", \"#f5f5f5\", \"#cfd8dc\"],\r\n [\"#ef9a9a\", \"#f48fb1\", \"#ce93d8\", \"#9fa8da\", \"#90caf9\", \"#80deea\", \"#80cbc4\", \"#a5d6a7\", \"#c5e1a5\", \"#e6ee9c\", \"#fff59d\", \"#ffe082\", \"#ffcc80\", \"#ffab91\", \"#bcaaa4\", \"#eeeeee\", \"#b0bec5\"],\r\n [\"#e57373\", \"#f06292\", \"#ba68c8\", \"#7986cb\", \"#64b5f6\", \"#4dd0e1\", \"#4db6ac\", \"#81c784\", \"#aed581\", \"#dce775\", \"#fff176\", \"#ffd54f\", \"#ffb74d\", \"#ff8a65\", \"#a1887f\", \"#e0e0e0\", \"#90a4ae\"],\r\n [\"#ef5350\", \"#ec407a\", \"#ab47bc\", \"#5c6bc0\", \"#42a5f5\", \"#26c6da\", \"#26a69a\", \"#66bb6a\", \"#9ccc65\", \"#d4e157\", \"#ffee58\", \"#ffca28\", \"#ffa726\", \"#ff7043\", \"#8d6e63\", \"#bdbdbd\", \"#78909c\"],\r\n [\"#f44336\", \"#e91e63\", \"#9c27b0\", \"#3f51b5\", \"#2196f3\", \"#00bcd4\", \"#009688\", \"#4caf50\", \"#8bc34a\", \"#cddc39\", \"#ffeb3b\", \"#ffc107\", \"#ff9800\", \"#ff5722\", \"#795548\", \"#9e9e9e\", \"#607d8b\"],\r\n [\"#e53935\", \"#d81b60\", \"#8e24aa\", \"#3949ab\", \"#1e88e5\", \"#00acc1\", \"#00897b\", \"#43a047\", \"#7cb342\", \"#c0ca33\", \"#fdd835\", \"#ffb300\", \"#fb8c00\", \"#f4511e\", \"#6d4c41\", \"#757575\", \"#546e7a\"],\r\n [\"#d32f2f\", \"#c2185b\", \"#7b1fa2\", \"#303f9f\", \"#1976d2\", \"#0097a7\", \"#00796b\", \"#388e3c\", \"#689f38\", \"#afb42b\", \"#fbc02d\", \"#ffa000\", \"#f57c00\", \"#e64a19\", \"#5d4037\", \"#616161\", \"#455a64\"],\r\n [\"#c62828\", \"#ad1457\", \"#6a1b9a\", \"#283593\", \"#1565c0\", \"#00838f\", \"#00695c\", \"#2e7d32\", \"#558b2f\", \"#9e9d24\", \"#f9a825\", \"#ff8f00\", \"#ef6c00\", \"#d84315\", \"#4e342e\", \"#424242\", \"#37474f\"],\r\n [\"#b71c1c\", \"#880e4f\", \"#4a148c\", \"#1a237e\", \"#0d47a1\", \"#006064\", \"#004d40\", \"#1b5e20\", \"#33691e\", \"#827717\", \"#f57f17\", \"#ff6f00\", \"#e65100\", \"#bf360c\", \"#3e2723\", \"#212121\", \"#263238\"],\r\n ],\r\n fire: [\r\n [\"0b1a6d\", \"840f38\", \"b60718\", \"de030b\", \"ff0c0c\", \"fd491c\", \"fc7521\", \"faa331\", \"fbb535\", \"ffc73a\"],\r\n [\"071147\", \"5f0b28\", \"930513\", \"be0309\", \"ef0000\", \"fa3403\", \"fb670b\", \"f9991b\", \"faad1e\", \"ffc123\"],\r\n [\"03071e\", \"370617\", \"6a040f\", \"9d0208\", \"d00000\", \"dc2f02\", \"e85d04\", \"f48c06\", \"faa307\", \"ffba08\"],\r\n [\"020619\", \"320615\", \"61040d\", \"8c0207\", \"bc0000\", \"c82a02\", \"d05203\", \"db7f06\", \"e19405\", \"efab00\"],\r\n [\"020515\", \"2d0513\", \"58040c\", \"7f0206\", \"aa0000\", \"b62602\", \"b94903\", \"c57205\", \"ca8504\", \"d89b00\"],\r\n ],\r\n baby: [\r\n [\"eddcd2\", \"fff1e6\", \"fde2e4\", \"fad2e1\", \"c5dedd\", \"dbe7e4\", \"f0efeb\", \"d6e2e9\", \"bcd4e6\", \"99c1de\"],\r\n [\"e1c4b3\", \"ffd5b5\", \"fab6ba\", \"f5a8c4\", \"aacecd\", \"bfd5cf\", \"dbd9d0\", \"baceda\", \"9dc0db\", \"7eb1d5\"],\r\n [\"daa990\", \"ffb787\", \"f88e95\", \"f282a9\", \"8fc4c3\", \"a3c8be\", \"cec9b3\", \"9dbcce\", \"82acd2\", \"649dcb\"],\r\n [\"d69070\", \"ff9c5e\", \"f66770\", \"f05f8f\", \"74bbb9\", \"87bfae\", \"c5b993\", \"83aac3\", \"699bca\", \"4d89c2\"],\r\n [\"c97d5d\", \"f58443\", \"eb4d57\", \"e54a7b\", \"66a9a7\", \"78ae9c\", \"b5a67e\", \"7599b1\", \"5c88b7\", \"4978aa\"],\r\n ],\r\n chart: [\r\n ['#C1D37F', '#4C5454', '#FFD275', '#66586F', '#D05D5B', '#C96480', '#95BF8F', '#6EA240', '#0F0F0E', '#EB8258', '#95A3B3', '#995D81'],\r\n ],\r\n }\r\n\r\n var Component = function (o) {\r\n // Otherwise get palette value\r\n if (palette[o]) {\r\n return palette[o];\r\n } else {\r\n return palette.material;\r\n }\r\n }\r\n\r\n Component.get = function (o) {\r\n // Otherwise get palette value\r\n if (palette[o]) {\r\n return palette[o];\r\n } else {\r\n return palette;\r\n }\r\n }\r\n\r\n Component.set = function (o, v) {\r\n palette[o] = v;\r\n }\r\n\r\n return Component;\r\n}\r\n\r\n/* harmony default export */ var palette = (Palette());\n;// CONCATENATED MODULE: ./src/plugins/tabs.js\n\r\n\r\n\r\nfunction Tabs(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n data: [],\r\n position: null,\r\n allowCreate: false,\r\n allowChangePosition: false,\r\n onclick: null,\r\n onload: null,\r\n onchange: null,\r\n oncreate: null,\r\n ondelete: null,\r\n onbeforecreate: null,\r\n onchangeposition: null,\r\n animation: false,\r\n hideHeaders: false,\r\n padding: null,\r\n palette: null,\r\n maxWidth: null,\r\n }\r\n\r\n // Loop through the initial configuration\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Class\r\n el.classList.add('jtabs');\r\n\r\n var prev = null;\r\n var next = null;\r\n var border = null;\r\n\r\n // Helpers\r\n const setBorder = function(index) {\r\n if (obj.options.animation) {\r\n setTimeout(function() {\r\n let rect = obj.headers.children[index].getBoundingClientRect();\r\n\r\n if (obj.options.palette === 'modern') {\r\n border.style.width = rect.width - 4 + 'px';\r\n border.style.left = obj.headers.children[index].offsetLeft + 2 + 'px';\r\n } else {\r\n border.style.width = rect.width + 'px';\r\n border.style.left = obj.headers.children[index].offsetLeft + 'px';\r\n }\r\n\r\n if (obj.options.position === 'bottom') {\r\n border.style.top = '0px';\r\n } else {\r\n border.style.bottom = '0px';\r\n }\r\n }, 50);\r\n }\r\n }\r\n\r\n var updateControls = function(x) {\r\n if (typeof(obj.headers.scrollTo) == 'function') {\r\n obj.headers.scrollTo({\r\n left: x,\r\n behavior: 'smooth',\r\n });\r\n } else {\r\n obj.headers.scrollLeft = x;\r\n }\r\n\r\n if (x <= 1) {\r\n prev.classList.add('disabled');\r\n } else {\r\n prev.classList.remove('disabled');\r\n }\r\n\r\n if (x >= obj.headers.scrollWidth - obj.headers.offsetWidth) {\r\n next.classList.add('disabled');\r\n } else {\r\n next.classList.remove('disabled');\r\n }\r\n\r\n if (obj.headers.scrollWidth <= obj.headers.offsetWidth) {\r\n prev.style.display = 'none';\r\n next.style.display = 'none';\r\n } else {\r\n prev.style.display = '';\r\n next.style.display = '';\r\n }\r\n }\r\n\r\n obj.setBorder = setBorder;\r\n\r\n // Set value\r\n obj.open = function(index) {\r\n // This is to force safari to update the children\r\n const items = Array.from(obj.content.children);\r\n if (! obj.content.children[index]) {\r\n return;\r\n }\r\n\r\n var previous = null;\r\n for (var i = 0; i < obj.headers.children.length; i++) {\r\n if (obj.headers.children[i].classList.contains('jtabs-selected')) {\r\n // Current one\r\n previous = i;\r\n }\r\n // Remote selected\r\n obj.headers.children[i].classList.remove('jtabs-selected');\r\n if (obj.content.children[i]) {\r\n obj.content.children[i].classList.remove('jtabs-selected');\r\n }\r\n }\r\n\r\n obj.headers.children[index].classList.add('jtabs-selected');\r\n if (obj.content.children[index]) {\r\n obj.content.children[index].classList.add('jtabs-selected');\r\n }\r\n\r\n if (previous != index && typeof(obj.options.onchange) == 'function') {\r\n if (obj.content.children[index]) {\r\n obj.options.onchange(el, obj, index, obj.headers.children[index], obj.content.children[index]);\r\n }\r\n }\r\n\r\n // Hide\r\n if (obj.options.hideHeaders == true && (obj.headers.children.length < 3 && obj.options.allowCreate == false)) {\r\n obj.headers.parentNode.style.display = 'none';\r\n } else {\r\n obj.headers.parentNode.style.display = '';\r\n\r\n var x1 = obj.headers.children[index].offsetLeft;\r\n var x2 = x1 + obj.headers.children[index].offsetWidth;\r\n var r1 = obj.headers.scrollLeft;\r\n var r2 = r1 + obj.headers.offsetWidth;\r\n\r\n if (! (r1 <= x1 && r2 >= x2)) {\r\n // Out of the viewport\r\n updateControls(x1 - 1);\r\n }\r\n\r\n // Set border\r\n setBorder(index);\r\n }\r\n }\r\n\r\n obj.selectIndex = function(a) {\r\n var index = Array.prototype.indexOf.call(obj.headers.children, a);\r\n if (index >= 0) {\r\n obj.open(index);\r\n }\r\n\r\n return index;\r\n }\r\n\r\n obj.rename = function(i, title) {\r\n if (! title) {\r\n title = prompt('New title', obj.headers.children[i].innerText);\r\n }\r\n obj.headers.children[i].innerText = title;\r\n setBorder(obj.getActive());\r\n }\r\n\r\n obj.create = function(title, url) {\r\n if (typeof(obj.options.onbeforecreate) == 'function') {\r\n var ret = obj.options.onbeforecreate(el, title);\r\n if (ret === false) {\r\n return false;\r\n } else {\r\n title = ret;\r\n }\r\n }\r\n\r\n var div = obj.appendElement(title);\r\n\r\n if (typeof(obj.options.oncreate) == 'function') {\r\n obj.options.oncreate(el, div)\r\n }\r\n\r\n setBorder(obj.getActive());\r\n\r\n return div;\r\n }\r\n\r\n obj.remove = function(index) {\r\n return obj.deleteElement(index);\r\n }\r\n\r\n obj.nextNumber = function() {\r\n var num = 0;\r\n for (var i = 0; i < obj.headers.children.length; i++) {\r\n var tmp = obj.headers.children[i].innerText.match(/[0-9].*/);\r\n if (tmp > num) {\r\n num = parseInt(tmp);\r\n }\r\n }\r\n if (! num) {\r\n num = 1;\r\n } else {\r\n num++;\r\n }\r\n\r\n return num;\r\n }\r\n\r\n obj.deleteElement = function(index) {\r\n let current = obj.getActive();\r\n\r\n if (! obj.headers.children[index]) {\r\n return false;\r\n } else {\r\n obj.headers.removeChild(obj.headers.children[index]);\r\n obj.content.removeChild(obj.content.children[index]);\r\n }\r\n\r\n if (current === index) {\r\n obj.open(0);\r\n } else {\r\n let current = obj.getActive() || 0;\r\n setBorder(current);\r\n }\r\n\r\n if (typeof(obj.options.ondelete) == 'function') {\r\n obj.options.ondelete(el, index)\r\n }\r\n }\r\n\r\n obj.appendElement = function(title, cb, openTab, position) {\r\n if (! title) {\r\n var title = prompt('Title?', '');\r\n }\r\n\r\n if (title) {\r\n // Add content\r\n var div = document.createElement('div');\r\n\r\n // Add headers\r\n var h = document.createElement('div');\r\n h.innerHTML = title;\r\n h.content = div;\r\n\r\n if (typeof(position) === 'undefined') {\r\n obj.content.appendChild(div);\r\n obj.headers.insertBefore(h, obj.headers.lastChild);\r\n } else {\r\n let r = obj.content.children[position];\r\n if (r) {\r\n obj.content.insertBefore(div, r);\r\n } else {\r\n obj.content.appendChild(div);\r\n }\r\n r = obj.headers.children[position] || obj.headers.lastChild;\r\n obj.headers.insertBefore(h, r);\r\n }\r\n\r\n // Sortable\r\n if (obj.options.allowChangePosition) {\r\n h.setAttribute('draggable', 'true');\r\n }\r\n\r\n // Open new tab\r\n if (openTab !== false) {\r\n // Open new tab\r\n obj.selectIndex(h);\r\n }\r\n\r\n // Callback\r\n if (typeof(cb) == 'function') {\r\n cb(div, h);\r\n }\r\n\r\n // Return element\r\n return div;\r\n }\r\n }\r\n\r\n obj.getActive = function() {\r\n for (var i = 0; i < obj.headers.children.length; i++) {\r\n if (obj.headers.children[i].classList.contains('jtabs-selected')) {\r\n return i;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n obj.updateContent = function(position, newContent) {\r\n if (typeof newContent !== 'string') {\r\n var contentItem = newContent;\r\n } else {\r\n var contentItem = document.createElement('div');\r\n contentItem.innerHTML = newContent;\r\n }\r\n\r\n if (obj.content.children[position].classList.contains('jtabs-selected')) {\r\n newContent.classList.add('jtabs-selected');\r\n }\r\n\r\n obj.content.replaceChild(newContent, obj.content.children[position]);\r\n\r\n setBorder();\r\n }\r\n\r\n obj.updatePosition = function(f, t, ignoreEvents, openTab) {\r\n // Ondrop update position of content\r\n if (f > t) {\r\n obj.content.insertBefore(obj.content.children[f], obj.content.children[t]);\r\n } else {\r\n obj.content.insertBefore(obj.content.children[f], obj.content.children[t].nextSibling);\r\n }\r\n\r\n // Open destination tab\r\n if (openTab !== false) {\r\n obj.open(t);\r\n } else {\r\n const activeIndex = obj.getActive();\r\n\r\n if (t < activeIndex) {\r\n obj.setBorder(activeIndex);\r\n }\r\n }\r\n\r\n // Call event\r\n if (! ignoreEvents && typeof(obj.options.onchangeposition) == 'function') {\r\n obj.options.onchangeposition(obj.headers, f, t);\r\n }\r\n }\r\n\r\n obj.move = function(f, t, ignoreEvents, openTab) {\r\n if (f > t) {\r\n obj.headers.insertBefore(obj.headers.children[f], obj.headers.children[t]);\r\n } else {\r\n obj.headers.insertBefore(obj.headers.children[f], obj.headers.children[t].nextSibling);\r\n }\r\n\r\n obj.updatePosition(f, t, ignoreEvents, openTab);\r\n }\r\n\r\n obj.setBorder = setBorder;\r\n\r\n obj.init = function() {\r\n el.innerHTML = '';\r\n\r\n // Make sure the component is blank\r\n obj.headers = document.createElement('div');\r\n obj.content = document.createElement('div');\r\n obj.headers.classList.add('jtabs-headers');\r\n obj.content.classList.add('jtabs-content');\r\n\r\n if (obj.options.palette) {\r\n el.classList.add('jtabs-modern');\r\n } else {\r\n el.classList.remove('jtabs-modern');\r\n }\r\n\r\n // Padding\r\n if (obj.options.padding) {\r\n obj.content.style.padding = parseInt(obj.options.padding) + 'px';\r\n }\r\n\r\n // Header\r\n var header = document.createElement('div');\r\n header.className = 'jtabs-headers-container';\r\n header.appendChild(obj.headers);\r\n if (obj.options.maxWidth) {\r\n header.style.maxWidth = parseInt(obj.options.maxWidth) + 'px';\r\n }\r\n\r\n // Controls\r\n var controls = document.createElement('div');\r\n controls.className = 'jtabs-controls';\r\n controls.setAttribute('draggable', 'false');\r\n header.appendChild(controls);\r\n\r\n // Append DOM elements\r\n if (obj.options.position == 'bottom') {\r\n el.appendChild(obj.content);\r\n el.appendChild(header);\r\n } else {\r\n el.appendChild(header);\r\n el.appendChild(obj.content);\r\n }\r\n\r\n // New button\r\n if (obj.options.allowCreate == true) {\r\n var add = document.createElement('div');\r\n add.className = 'jtabs-add';\r\n add.onclick = function() {\r\n obj.create();\r\n }\r\n controls.appendChild(add);\r\n }\r\n\r\n prev = document.createElement('div');\r\n prev.className = 'jtabs-prev';\r\n prev.onclick = function() {\r\n updateControls(obj.headers.scrollLeft - obj.headers.offsetWidth);\r\n }\r\n controls.appendChild(prev);\r\n\r\n next = document.createElement('div');\r\n next.className = 'jtabs-next';\r\n next.onclick = function() {\r\n updateControls(obj.headers.scrollLeft + obj.headers.offsetWidth);\r\n }\r\n controls.appendChild(next);\r\n\r\n // Data\r\n for (var i = 0; i < obj.options.data.length; i++) {\r\n // Title\r\n if (obj.options.data[i].titleElement) {\r\n var headerItem = obj.options.data[i].titleElement;\r\n } else {\r\n var headerItem = document.createElement('div');\r\n }\r\n // Icon\r\n if (obj.options.data[i].icon) {\r\n var iconContainer = document.createElement('div');\r\n var icon = document.createElement('i');\r\n icon.classList.add('material-icons');\r\n icon.innerHTML = obj.options.data[i].icon;\r\n iconContainer.appendChild(icon);\r\n headerItem.appendChild(iconContainer);\r\n }\r\n // Title\r\n if (obj.options.data[i].title) {\r\n var title = document.createTextNode(obj.options.data[i].title);\r\n headerItem.appendChild(title);\r\n }\r\n // Width\r\n if (obj.options.data[i].width) {\r\n headerItem.style.width = obj.options.data[i].width;\r\n }\r\n // Content\r\n if (obj.options.data[i].contentElement) {\r\n var contentItem = obj.options.data[i].contentElement;\r\n } else {\r\n var contentItem = document.createElement('div');\r\n contentItem.innerHTML = obj.options.data[i].content;\r\n }\r\n obj.headers.appendChild(headerItem);\r\n obj.content.appendChild(contentItem);\r\n }\r\n\r\n // Animation\r\n border = document.createElement('div');\r\n border.className = 'jtabs-border';\r\n obj.headers.appendChild(border);\r\n\r\n if (obj.options.animation) {\r\n el.classList.add('jtabs-animation');\r\n }\r\n\r\n // Events\r\n obj.headers.addEventListener(\"click\", function(e) {\r\n if (e.target.parentNode.classList.contains('jtabs-headers')) {\r\n var target = e.target;\r\n } else {\r\n if (e.target.tagName == 'I') {\r\n var target = e.target.parentNode.parentNode;\r\n } else {\r\n var target = e.target.parentNode;\r\n }\r\n }\r\n\r\n var index = obj.selectIndex(target);\r\n\r\n if (typeof(obj.options.onclick) == 'function') {\r\n obj.options.onclick(el, obj, index, obj.headers.children[index], obj.content.children[index]);\r\n }\r\n });\r\n\r\n obj.headers.addEventListener(\"contextmenu\", function(e) {\r\n obj.selectIndex(e.target);\r\n });\r\n\r\n if (obj.headers.children.length) {\r\n // Open first tab\r\n obj.open(0);\r\n }\r\n\r\n // Update controls\r\n updateControls(0);\r\n\r\n if (obj.options.allowChangePosition == true) {\r\n Sorting(obj.headers, {\r\n direction: 1,\r\n ondrop: function(a,b,c) {\r\n obj.updatePosition(b,c);\r\n },\r\n });\r\n }\r\n\r\n if (typeof(obj.options.onload) == 'function') {\r\n obj.options.onload(el, obj);\r\n }\r\n }\r\n\r\n // Loading existing nodes as the data\r\n if (el.children[0] && el.children[0].children.length) {\r\n // Create from existing elements\r\n for (var i = 0; i < el.children[0].children.length; i++) {\r\n var item = obj.options.data && obj.options.data[i] ? obj.options.data[i] : {};\r\n\r\n if (el.children[1] && el.children[1].children[i]) {\r\n item.titleElement = el.children[0].children[i];\r\n item.contentElement = el.children[1].children[i];\r\n } else {\r\n item.contentElement = el.children[0].children[i];\r\n }\r\n\r\n obj.options.data[i] = item;\r\n }\r\n }\r\n\r\n // Remote controller flag\r\n var loadingRemoteData = false;\r\n\r\n // Create from data\r\n if (obj.options.data) {\r\n // Append children\r\n for (var i = 0; i < obj.options.data.length; i++) {\r\n if (obj.options.data[i].url) {\r\n ajax({\r\n url: obj.options.data[i].url,\r\n type: 'GET',\r\n dataType: 'text/html',\r\n index: i,\r\n success: function(result) {\r\n obj.options.data[this.index].content = result;\r\n },\r\n complete: function() {\r\n obj.init();\r\n }\r\n });\r\n\r\n // Flag loading\r\n loadingRemoteData = true;\r\n }\r\n }\r\n }\r\n\r\n if (! loadingRemoteData) {\r\n obj.init();\r\n }\r\n\r\n el.tabs = obj;\r\n\r\n return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/color.js\n\r\n\r\n\r\n\r\n\r\n\r\nfunction Color(el, options) {\r\n // Already created, update options\r\n if (el.color) {\r\n return el.color.setOptions(options, true);\r\n }\r\n\r\n // New instance\r\n var obj = { type: 'color' };\r\n obj.options = {};\r\n\r\n var container = null;\r\n var backdrop = null;\r\n var content = null;\r\n var resetButton = null;\r\n var closeButton = null;\r\n var tabs = null;\r\n var jsuitesTabs = null;\r\n\r\n /**\r\n * Update options\r\n */\r\n obj.setOptions = function(options, reset) {\r\n /**\r\n * @typedef {Object} defaults\r\n * @property {(string|Array)} value - Initial value of the compontent\r\n * @property {string} placeholder - The default instruction text on the element\r\n * @property {requestCallback} onchange - Method to be execute after any changes on the element\r\n * @property {requestCallback} onclose - Method to be execute when the element is closed\r\n * @property {string} doneLabel - Label for button done\r\n * @property {string} resetLabel - Label for button reset\r\n * @property {string} resetValue - Value for button reset\r\n * @property {Bool} showResetButton - Active or note for button reset - default false\r\n */\r\n var defaults = {\r\n placeholder: '',\r\n value: null,\r\n onopen: null,\r\n onclose: null,\r\n onchange: null,\r\n closeOnChange: true,\r\n palette: null,\r\n position: null,\r\n doneLabel: 'Done',\r\n resetLabel: 'Reset',\r\n fullscreen: false,\r\n opened: false,\r\n }\r\n\r\n if (! options) {\r\n options = {};\r\n }\r\n\r\n if (options && ! options.palette) {\r\n // Default palette\r\n options.palette = palette();\r\n }\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n }\r\n\r\n // Update the text of the controls, if they have already been created\r\n if (resetButton) {\r\n resetButton.innerHTML = obj.options.resetLabel;\r\n }\r\n if (closeButton) {\r\n closeButton.innerHTML = obj.options.doneLabel;\r\n }\r\n\r\n // Update the pallete\r\n if (obj.options.palette && jsuitesTabs) {\r\n jsuitesTabs.updateContent(0, table());\r\n }\r\n\r\n // Value\r\n if (typeof obj.options.value === 'string') {\r\n el.value = obj.options.value;\r\n if (el.tagName === 'INPUT') {\r\n el.style.color = el.value;\r\n el.style.backgroundColor = el.value;\r\n }\r\n }\r\n\r\n // Placeholder\r\n if (obj.options.placeholder) {\r\n el.setAttribute('placeholder', obj.options.placeholder);\r\n } else {\r\n if (el.getAttribute('placeholder')) {\r\n el.removeAttribute('placeholder');\r\n }\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n obj.select = function(color) {\r\n // Remove current selected mark\r\n var selected = container.querySelector('.jcolor-selected');\r\n if (selected) {\r\n selected.classList.remove('jcolor-selected');\r\n }\r\n\r\n // Mark cell as selected\r\n if (obj.values[color]) {\r\n obj.values[color].classList.add('jcolor-selected');\r\n }\r\n\r\n obj.options.value = color;\r\n }\r\n\r\n /**\r\n * Open color pallete\r\n */\r\n obj.open = function() {\r\n if (! container.classList.contains('jcolor-focus')) {\r\n // Start tracking\r\n tracking(obj, true);\r\n\r\n // Show color picker\r\n container.classList.add('jcolor-focus');\r\n\r\n // Select current color\r\n if (obj.options.value) {\r\n obj.select(obj.options.value);\r\n }\r\n\r\n // Reset margin\r\n content.style.marginTop = '';\r\n content.style.marginLeft = '';\r\n\r\n var rectContent = content.getBoundingClientRect();\r\n var availableWidth = helpers.getWindowWidth();\r\n var availableHeight = helpers.getWindowHeight();\r\n\r\n if (availableWidth < 800 || obj.options.fullscreen == true) {\r\n content.classList.add('jcolor-fullscreen');\r\n animation.slideBottom(content, 1);\r\n backdrop.style.display = 'block';\r\n } else {\r\n if (content.classList.contains('jcolor-fullscreen')) {\r\n content.classList.remove('jcolor-fullscreen');\r\n backdrop.style.display = '';\r\n }\r\n\r\n if (obj.options.position) {\r\n content.style.position = 'fixed';\r\n } else {\r\n content.style.position = '';\r\n }\r\n\r\n if (rectContent.left + rectContent.width > availableWidth) {\r\n content.style.marginLeft = -1 * (rectContent.left + rectContent.width - (availableWidth - 20)) + 'px';\r\n }\r\n if (rectContent.top + rectContent.height > availableHeight) {\r\n content.style.marginTop = -1 * (rectContent.top + rectContent.height - (availableHeight - 20)) + 'px';\r\n }\r\n }\r\n\r\n\r\n if (typeof(obj.options.onopen) == 'function') {\r\n obj.options.onopen(el, obj);\r\n }\r\n\r\n jsuitesTabs.setBorder(jsuitesTabs.getActive());\r\n\r\n // Update sliders\r\n if (obj.options.value) {\r\n var rgb = HexToRgb(obj.options.value);\r\n\r\n rgbInputs.forEach(function(rgbInput, index) {\r\n rgbInput.value = rgb[index];\r\n rgbInput.dispatchEvent(new Event('input'));\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Close color pallete\r\n */\r\n obj.close = function(ignoreEvents) {\r\n if (container.classList.contains('jcolor-focus')) {\r\n // Remove focus\r\n container.classList.remove('jcolor-focus');\r\n // Make sure backdrop is hidden\r\n backdrop.style.display = '';\r\n // Call related events\r\n if (! ignoreEvents && typeof(obj.options.onclose) == 'function') {\r\n obj.options.onclose(el, obj);\r\n }\r\n // Stop the object\r\n tracking(obj, false);\r\n }\r\n\r\n return obj.options.value;\r\n }\r\n\r\n /**\r\n * Set value\r\n */\r\n obj.setValue = function(color) {\r\n if (! color) {\r\n color = '';\r\n }\r\n\r\n if (color != obj.options.value) {\r\n obj.options.value = color;\r\n slidersResult = color;\r\n\r\n // Remove current selecded mark\r\n obj.select(color);\r\n\r\n // Onchange\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, color, obj);\r\n }\r\n\r\n // Changes\r\n if (el.value != obj.options.value) {\r\n // Set input value\r\n el.value = obj.options.value;\r\n if (el.tagName === 'INPUT') {\r\n el.style.color = el.value;\r\n el.style.backgroundColor = el.value;\r\n }\r\n\r\n // Element onchange native\r\n if (typeof(el.oninput) == 'function') {\r\n el.oninput({\r\n type: 'input',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n\r\n if (obj.options.closeOnChange == true) {\r\n obj.close();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get value\r\n */\r\n obj.getValue = function() {\r\n return obj.options.value;\r\n }\r\n\r\n var backdropClickControl = false;\r\n\r\n // Converts a number in decimal to hexadecimal\r\n var decToHex = function(num) {\r\n var hex = num.toString(16);\r\n return hex.length === 1 ? \"0\" + hex : hex;\r\n }\r\n\r\n // Converts a color in rgb to hexadecimal\r\n var rgbToHex = function(r, g, b) {\r\n return \"#\" + decToHex(r) + decToHex(g) + decToHex(b);\r\n }\r\n\r\n // Converts a number in hexadecimal to decimal\r\n var hexToDec = function(hex) {\r\n return parseInt('0x' + hex);\r\n }\r\n\r\n // Converts a color in hexadecimal to rgb\r\n var HexToRgb = function(hex) {\r\n return [hexToDec(hex.substr(1, 2)), hexToDec(hex.substr(3, 2)), hexToDec(hex.substr(5, 2))]\r\n }\r\n\r\n var table = function() {\r\n // Content of the first tab\r\n var tableContainer = document.createElement('div');\r\n tableContainer.className = 'jcolor-grid';\r\n\r\n // Cells\r\n obj.values = [];\r\n\r\n // Table pallete\r\n var t = document.createElement('table');\r\n t.setAttribute('cellpadding', '7');\r\n t.setAttribute('cellspacing', '0');\r\n\r\n for (var j = 0; j < obj.options.palette.length; j++) {\r\n var tr = document.createElement('tr');\r\n for (var i = 0; i < obj.options.palette[j].length; i++) {\r\n var td = document.createElement('td');\r\n var color = obj.options.palette[j][i];\r\n if (color.length < 7 && color.substr(0,1) !== '#') {\r\n color = '#' + color;\r\n }\r\n td.style.backgroundColor = color;\r\n td.setAttribute('data-value', color);\r\n td.innerHTML = '';\r\n tr.appendChild(td);\r\n\r\n // Selected color\r\n if (obj.options.value == color) {\r\n td.classList.add('jcolor-selected');\r\n }\r\n\r\n // Possible values\r\n obj.values[color] = td;\r\n }\r\n t.appendChild(tr);\r\n }\r\n\r\n // Append to the table\r\n tableContainer.appendChild(t);\r\n\r\n return tableContainer;\r\n }\r\n\r\n // Canvas where the image will be rendered\r\n var canvas = document.createElement('canvas');\r\n canvas.width = 200;\r\n canvas.height = 160;\r\n var context = canvas.getContext(\"2d\");\r\n\r\n var resizeCanvas = function() {\r\n // Specifications necessary to correctly obtain colors later in certain positions\r\n var m = tabs.firstChild.getBoundingClientRect();\r\n canvas.width = m.width - 14;\r\n gradient()\r\n }\r\n\r\n var gradient = function() {\r\n var g = context.createLinearGradient(0, 0, canvas.width, 0);\r\n // Create color gradient\r\n g.addColorStop(0, \"rgb(255,0,0)\");\r\n g.addColorStop(0.15, \"rgb(255,0,255)\");\r\n g.addColorStop(0.33, \"rgb(0,0,255)\");\r\n g.addColorStop(0.49, \"rgb(0,255,255)\");\r\n g.addColorStop(0.67, \"rgb(0,255,0)\");\r\n g.addColorStop(0.84, \"rgb(255,255,0)\");\r\n g.addColorStop(1, \"rgb(255,0,0)\");\r\n context.fillStyle = g;\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n g = context.createLinearGradient(0, 0, 0, canvas.height);\r\n g.addColorStop(0, \"rgba(255,255,255,1)\");\r\n g.addColorStop(0.5, \"rgba(255,255,255,0)\");\r\n g.addColorStop(0.5, \"rgba(0,0,0,0)\");\r\n g.addColorStop(1, \"rgba(0,0,0,1)\");\r\n context.fillStyle = g;\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n var hsl = function() {\r\n var element = document.createElement('div');\r\n element.className = \"jcolor-hsl\";\r\n\r\n var point = document.createElement('div');\r\n point.className = 'jcolor-point';\r\n\r\n var div = document.createElement('div');\r\n div.appendChild(canvas);\r\n div.appendChild(point);\r\n element.appendChild(div);\r\n\r\n // Moves the marquee point to the specified position\r\n var update = function(buttons, x, y) {\r\n if (buttons === 1) {\r\n var rect = element.getBoundingClientRect();\r\n var left = x - rect.left;\r\n var top = y - rect.top;\r\n if (left < 0) {\r\n left = 0;\r\n }\r\n if (top < 0) {\r\n top = 0;\r\n }\r\n if (left > rect.width) {\r\n left = rect.width;\r\n }\r\n if (top > rect.height) {\r\n top = rect.height;\r\n }\r\n point.style.left = left + 'px';\r\n point.style.top = top + 'px';\r\n var pixel = context.getImageData(left, top, 1, 1).data;\r\n slidersResult = rgbToHex(pixel[0], pixel[1], pixel[2]);\r\n }\r\n }\r\n\r\n // Applies the point's motion function to the div that contains it\r\n element.addEventListener('mousedown', function(e) {\r\n update(e.buttons, e.clientX, e.clientY);\r\n });\r\n\r\n element.addEventListener('mousemove', function(e) {\r\n update(e.buttons, e.clientX, e.clientY);\r\n });\r\n\r\n element.addEventListener('touchmove', function(e) {\r\n update(1, e.changedTouches[0].clientX, e.changedTouches[0].clientY);\r\n });\r\n\r\n return element;\r\n }\r\n\r\n var slidersResult = '';\r\n\r\n var rgbInputs = [];\r\n\r\n var changeInputColors = function() {\r\n if (slidersResult !== '') {\r\n for (var j = 0; j < rgbInputs.length; j++) {\r\n var currentColor = HexToRgb(slidersResult);\r\n\r\n currentColor[j] = 0;\r\n\r\n var newGradient = 'linear-gradient(90deg, rgb(';\r\n newGradient += currentColor.join(', ');\r\n newGradient += '), rgb(';\r\n\r\n currentColor[j] = 255;\r\n\r\n newGradient += currentColor.join(', ');\r\n newGradient += '))';\r\n\r\n rgbInputs[j].style.backgroundImage = newGradient;\r\n }\r\n }\r\n }\r\n\r\n var sliders = function() {\r\n // Content of the third tab\r\n var slidersElement = document.createElement('div');\r\n slidersElement.className = 'jcolor-sliders';\r\n\r\n var slidersBody = document.createElement('div');\r\n\r\n // Creates a range-type input with the specified name\r\n var createSliderInput = function(name) {\r\n var inputContainer = document.createElement('div');\r\n inputContainer.className = 'jcolor-sliders-input-container';\r\n\r\n var label = document.createElement('label');\r\n label.innerText = name;\r\n\r\n var subContainer = document.createElement('div');\r\n subContainer.className = 'jcolor-sliders-input-subcontainer';\r\n\r\n var input = document.createElement('input');\r\n input.type = 'range';\r\n input.min = 0;\r\n input.max = 255;\r\n input.value = 0;\r\n\r\n inputContainer.appendChild(label);\r\n subContainer.appendChild(input);\r\n\r\n var value = document.createElement('div');\r\n value.innerText = input.value;\r\n\r\n input.addEventListener('input', function() {\r\n value.innerText = input.value;\r\n });\r\n\r\n subContainer.appendChild(value);\r\n inputContainer.appendChild(subContainer);\r\n\r\n slidersBody.appendChild(inputContainer);\r\n\r\n return input;\r\n }\r\n\r\n // Creates red, green and blue inputs\r\n rgbInputs = [\r\n createSliderInput('Red'),\r\n createSliderInput('Green'),\r\n createSliderInput('Blue'),\r\n ];\r\n\r\n slidersElement.appendChild(slidersBody);\r\n\r\n // Element that prints the current color\r\n var slidersResultColor = document.createElement('div');\r\n slidersResultColor.className = 'jcolor-sliders-final-color';\r\n\r\n var resultElement = document.createElement('div');\r\n resultElement.style.visibility = 'hidden';\r\n resultElement.innerText = 'a';\r\n slidersResultColor.appendChild(resultElement)\r\n\r\n // Update the element that prints the current color\r\n var updateResult = function() {\r\n var resultColor = rgbToHex(parseInt(rgbInputs[0].value), parseInt(rgbInputs[1].value), parseInt(rgbInputs[2].value));\r\n\r\n resultElement.innerText = resultColor;\r\n resultElement.style.color = resultColor;\r\n resultElement.style.removeProperty('visibility');\r\n\r\n slidersResult = resultColor;\r\n }\r\n\r\n // Apply the update function to color inputs\r\n rgbInputs.forEach(function(rgbInput) {\r\n rgbInput.addEventListener('input', function() {\r\n updateResult();\r\n changeInputColors();\r\n });\r\n });\r\n\r\n slidersElement.appendChild(slidersResultColor);\r\n\r\n return slidersElement;\r\n }\r\n\r\n var init = function() {\r\n // Initial options\r\n obj.setOptions(options);\r\n\r\n // Add a proper input tag when the element is an input\r\n if (el.tagName == 'INPUT') {\r\n el.classList.add('jcolor-input');\r\n el.readOnly = true;\r\n }\r\n\r\n // Table container\r\n container = document.createElement('div');\r\n container.className = 'jcolor';\r\n\r\n // Table container\r\n backdrop = document.createElement('div');\r\n backdrop.className = 'jcolor-backdrop';\r\n container.appendChild(backdrop);\r\n\r\n // Content\r\n content = document.createElement('div');\r\n content.className = 'jcolor-content';\r\n\r\n // Controls\r\n var controls = document.createElement('div');\r\n controls.className = 'jcolor-controls';\r\n content.appendChild(controls);\r\n\r\n // Reset button\r\n resetButton = document.createElement('div');\r\n resetButton.className = 'jcolor-reset';\r\n resetButton.innerHTML = obj.options.resetLabel;\r\n controls.appendChild(resetButton);\r\n\r\n // Close button\r\n closeButton = document.createElement('div');\r\n closeButton.className = 'jcolor-close';\r\n closeButton.innerHTML = obj.options.doneLabel;\r\n controls.appendChild(closeButton);\r\n\r\n // Element that will be used to create the tabs\r\n tabs = document.createElement('div');\r\n content.appendChild(tabs);\r\n\r\n // Starts the jSuites tabs component\r\n jsuitesTabs = Tabs(tabs, {\r\n animation: true,\r\n data: [\r\n {\r\n title: 'Grid',\r\n contentElement: table(),\r\n },\r\n {\r\n title: 'Spectrum',\r\n contentElement: hsl(),\r\n },\r\n {\r\n title: 'Sliders',\r\n contentElement: sliders(),\r\n }\r\n ],\r\n onchange: function(element, instance, index) {\r\n if (index === 1) {\r\n resizeCanvas();\r\n } else {\r\n var color = slidersResult !== '' ? slidersResult : obj.getValue();\r\n\r\n if (index === 2 && color) {\r\n var rgb = HexToRgb(color);\r\n\r\n rgbInputs.forEach(function(rgbInput, index) {\r\n rgbInput.value = rgb[index];\r\n rgbInput.dispatchEvent(new Event('input'));\r\n });\r\n }\r\n }\r\n },\r\n palette: 'modern',\r\n });\r\n\r\n container.appendChild(content);\r\n\r\n // Insert picker after the element\r\n if (el.tagName == 'INPUT') {\r\n el.parentNode.insertBefore(container, el.nextSibling);\r\n } else {\r\n el.appendChild(container);\r\n }\r\n\r\n container.addEventListener(\"click\", function(e) {\r\n if (e.target.tagName == 'TD') {\r\n var value = e.target.getAttribute('data-value');\r\n if (value) {\r\n obj.setValue(value);\r\n }\r\n } else if (e.target.classList.contains('jcolor-reset')) {\r\n obj.setValue('');\r\n obj.close();\r\n } else if (e.target.classList.contains('jcolor-close')) {\r\n if (jsuitesTabs.getActive() > 0) {\r\n obj.setValue(slidersResult);\r\n }\r\n obj.close();\r\n } else if (e.target.classList.contains('jcolor-backdrop')) {\r\n obj.close();\r\n } else {\r\n obj.open();\r\n }\r\n });\r\n\r\n /**\r\n * If element is focus open the picker\r\n */\r\n el.addEventListener(\"mouseup\", function(e) {\r\n obj.open();\r\n });\r\n\r\n // If the picker is open on the spectrum tab, it changes the canvas size when the window size is changed\r\n window.addEventListener('resize', function() {\r\n if (container.classList.contains('jcolor-focus') && jsuitesTabs.getActive() == 1) {\r\n resizeCanvas();\r\n }\r\n });\r\n\r\n // Default opened\r\n if (obj.options.opened == true) {\r\n obj.open();\r\n }\r\n\r\n // Change\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return obj.getValue();\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n // Keep object available from the node\r\n el.color = obj;\r\n\r\n // Container shortcut\r\n container.color = obj;\r\n }\r\n\r\n obj.toHex = function(rgb) {\r\n var hex = function(x) {\r\n return (\"0\" + parseInt(x).toString(16)).slice(-2);\r\n }\r\n if (rgb) {\r\n if (/^#[0-9A-F]{6}$/i.test(rgb)) {\r\n return rgb;\r\n } else {\r\n rgb = rgb.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/);\r\n if (rgb && rgb.length) {\r\n return \"#\" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);\r\n } else {\r\n return \"\";\r\n }\r\n }\r\n }\r\n }\r\n\r\n init();\r\n\r\n return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/contextmenu.js\n\r\n\r\n\r\nfunction Contextmenu() {\r\n\r\n var Component = function(el, options) {\r\n // New instance\r\n var obj = {type: 'contextmenu'};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n items: null,\r\n onclick: null,\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Class definition\r\n el.classList.add('jcontextmenu');\r\n\r\n /**\r\n * Open contextmenu\r\n */\r\n obj.open = function (e, items) {\r\n if (items) {\r\n // Update content\r\n obj.options.items = items;\r\n // Create items\r\n obj.create(items);\r\n }\r\n\r\n // Close current contextmenu\r\n if (Component.current) {\r\n Component.current.close();\r\n }\r\n\r\n // Add to the opened components monitor\r\n tracking(obj, true);\r\n\r\n // Show context menu\r\n el.classList.add('jcontextmenu-focus');\r\n\r\n // Current\r\n Component.current = obj;\r\n\r\n // Coordinates\r\n if ((obj.options.items && obj.options.items.length > 0) || el.children.length) {\r\n if (e.target) {\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n x = e.changedTouches[0].clientX;\r\n y = e.changedTouches[0].clientY;\r\n } else {\r\n var x = e.clientX;\r\n var y = e.clientY;\r\n }\r\n } else {\r\n var x = e.x;\r\n var y = e.y;\r\n }\r\n\r\n var rect = el.getBoundingClientRect();\r\n\r\n if (window.innerHeight < y + rect.height) {\r\n var h = y - rect.height;\r\n if (h < 0) {\r\n h = 0;\r\n }\r\n el.style.top = h + 'px';\r\n } else {\r\n el.style.top = y + 'px';\r\n }\r\n\r\n if (window.innerWidth < x + rect.width) {\r\n if (x - rect.width > 0) {\r\n el.style.left = (x - rect.width) + 'px';\r\n } else {\r\n el.style.left = '10px';\r\n }\r\n } else {\r\n el.style.left = x + 'px';\r\n }\r\n }\r\n }\r\n\r\n obj.isOpened = function () {\r\n return el.classList.contains('jcontextmenu-focus') ? true : false;\r\n }\r\n\r\n /**\r\n * Close menu\r\n */\r\n obj.close = function () {\r\n if (el.classList.contains('jcontextmenu-focus')) {\r\n el.classList.remove('jcontextmenu-focus');\r\n }\r\n tracking(obj, false);\r\n }\r\n\r\n /**\r\n * Create items based on the declared objectd\r\n * @param {object} items - List of object\r\n */\r\n obj.create = function (items) {\r\n // Update content\r\n el.innerHTML = '';\r\n\r\n // Add header contextmenu\r\n var itemHeader = createHeader();\r\n el.appendChild(itemHeader);\r\n\r\n // Append items\r\n for (var i = 0; i < items.length; i++) {\r\n var itemContainer = createItemElement(items[i]);\r\n el.appendChild(itemContainer);\r\n }\r\n }\r\n\r\n /**\r\n * createHeader for context menu\r\n * @private\r\n * @returns {HTMLElement}\r\n */\r\n function createHeader() {\r\n var header = document.createElement('div');\r\n header.classList.add(\"header\");\r\n header.addEventListener(\"click\", function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n var title = document.createElement('a');\r\n title.classList.add(\"title\");\r\n title.innerHTML = dictionary.translate(\"Menu\");\r\n\r\n header.appendChild(title);\r\n\r\n var closeButton = document.createElement('a');\r\n closeButton.classList.add(\"close\");\r\n closeButton.innerHTML = dictionary.translate(\"close\");\r\n closeButton.addEventListener(\"click\", function (e) {\r\n obj.close();\r\n });\r\n\r\n header.appendChild(closeButton);\r\n\r\n return header;\r\n }\r\n\r\n /**\r\n * Private function for create a new Item element\r\n * @param {type} item\r\n * @returns {jsuitesL#15.jSuites.contextmenu.createItemElement.itemContainer}\r\n */\r\n function createItemElement(item) {\r\n if (item.type && (item.type == 'line' || item.type == 'divisor')) {\r\n var itemContainer = document.createElement('hr');\r\n } else {\r\n var itemContainer = document.createElement('div');\r\n var itemText = document.createElement('a');\r\n itemText.innerHTML = item.title;\r\n\r\n if (item.tooltip) {\r\n itemContainer.setAttribute('title', item.tooltip);\r\n }\r\n\r\n if (item.icon) {\r\n itemContainer.setAttribute('data-icon', item.icon);\r\n }\r\n\r\n if (item.id) {\r\n itemContainer.id = item.id;\r\n }\r\n\r\n if (item.disabled) {\r\n itemContainer.className = 'jcontextmenu-disabled';\r\n } else if (item.onclick) {\r\n itemContainer.method = item.onclick;\r\n itemContainer.addEventListener(\"mousedown\", function (e) {\r\n e.preventDefault();\r\n });\r\n itemContainer.addEventListener(\"mouseup\", function (e) {\r\n // Execute method\r\n this.method(this, e);\r\n });\r\n }\r\n itemContainer.appendChild(itemText);\r\n\r\n if (item.submenu) {\r\n var itemIconSubmenu = document.createElement('span');\r\n itemIconSubmenu.innerHTML = \"►\";\r\n itemContainer.appendChild(itemIconSubmenu);\r\n itemContainer.classList.add('jcontexthassubmenu');\r\n var el_submenu = document.createElement('div');\r\n // Class definition\r\n el_submenu.classList.add('jcontextmenu');\r\n // Focusable\r\n el_submenu.setAttribute('tabindex', '900');\r\n\r\n // Append items\r\n var submenu = item.submenu;\r\n for (var i = 0; i < submenu.length; i++) {\r\n var itemContainerSubMenu = createItemElement(submenu[i]);\r\n el_submenu.appendChild(itemContainerSubMenu);\r\n }\r\n\r\n itemContainer.appendChild(el_submenu);\r\n } else if (item.shortcut) {\r\n var itemShortCut = document.createElement('span');\r\n itemShortCut.innerHTML = item.shortcut;\r\n itemContainer.appendChild(itemShortCut);\r\n }\r\n }\r\n return itemContainer;\r\n }\r\n\r\n if (typeof (obj.options.onclick) == 'function') {\r\n el.addEventListener('click', function (e) {\r\n obj.options.onclick(obj, e);\r\n });\r\n }\r\n\r\n // Create items\r\n if (obj.options.items) {\r\n obj.create(obj.options.items);\r\n }\r\n\r\n window.addEventListener(\"mousewheel\", function () {\r\n obj.close();\r\n });\r\n\r\n el.contextmenu = obj;\r\n\r\n return obj;\r\n }\r\n\r\n return Component;\r\n}\r\n\r\n/* harmony default export */ var contextmenu = (Contextmenu());\n;// CONCATENATED MODULE: ./src/plugins/dropdown.js\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nfunction Dropdown() {\r\n\r\n var Component = (function (el, options) {\r\n // Already created, update options\r\n if (el.dropdown) {\r\n return el.dropdown.setOptions(options, true);\r\n }\r\n\r\n // New instance\r\n var obj = {type: 'dropdown'};\r\n obj.options = {};\r\n\r\n // Success\r\n var success = function (data, val) {\r\n // Set data\r\n if (data && data.length) {\r\n // Sort\r\n if (obj.options.sortResults !== false) {\r\n if (typeof obj.options.sortResults == \"function\") {\r\n data.sort(obj.options.sortResults);\r\n } else {\r\n data.sort(sortData);\r\n }\r\n }\r\n\r\n obj.setData(data);\r\n }\r\n\r\n // Onload method\r\n if (typeof (obj.options.onload) == 'function') {\r\n obj.options.onload(el, obj, data, val);\r\n }\r\n\r\n // Set value\r\n if (val) {\r\n applyValue(val);\r\n }\r\n\r\n // Component value\r\n if (val === undefined || val === null) {\r\n obj.options.value = '';\r\n }\r\n el.value = obj.options.value;\r\n\r\n // Open dropdown\r\n if (obj.options.opened == true) {\r\n obj.open();\r\n }\r\n }\r\n\r\n\r\n // Default sort\r\n var sortData = function (itemA, itemB) {\r\n var testA, testB;\r\n if (typeof itemA == \"string\") {\r\n testA = itemA;\r\n } else {\r\n if (itemA.text) {\r\n testA = itemA.text;\r\n } else if (itemA.name) {\r\n testA = itemA.name;\r\n }\r\n }\r\n\r\n if (typeof itemB == \"string\") {\r\n testB = itemB;\r\n } else {\r\n if (itemB.text) {\r\n testB = itemB.text;\r\n } else if (itemB.name) {\r\n testB = itemB.name;\r\n }\r\n }\r\n\r\n if (typeof testA == \"string\" || typeof testB == \"string\") {\r\n if (typeof testA != \"string\") {\r\n testA = \"\" + testA;\r\n }\r\n if (typeof testB != \"string\") {\r\n testB = \"\" + testB;\r\n }\r\n return testA.localeCompare(testB);\r\n } else {\r\n return testA - testB;\r\n }\r\n }\r\n\r\n /**\r\n * Reset the options for the dropdown\r\n */\r\n var resetValue = function () {\r\n // Reset value container\r\n obj.value = {};\r\n // Remove selected\r\n for (var i = 0; i < obj.items.length; i++) {\r\n if (obj.items[i].selected == true) {\r\n if (obj.items[i].element) {\r\n obj.items[i].element.classList.remove('jdropdown-selected')\r\n }\r\n obj.items[i].selected = null;\r\n }\r\n }\r\n // Reset options\r\n obj.options.value = '';\r\n // Reset value\r\n el.value = '';\r\n }\r\n\r\n /**\r\n * Apply values to the dropdown\r\n */\r\n var applyValue = function (values) {\r\n // Reset the current values\r\n resetValue();\r\n\r\n // Read values\r\n if (values !== null) {\r\n if (!values) {\r\n if (typeof (obj.value['']) !== 'undefined') {\r\n obj.value[''] = '';\r\n }\r\n } else {\r\n if (!Array.isArray(values)) {\r\n values = ('' + values).split(';');\r\n }\r\n for (var i = 0; i < values.length; i++) {\r\n obj.value[values[i]] = '';\r\n }\r\n }\r\n }\r\n\r\n // Update the DOM\r\n for (var i = 0; i < obj.items.length; i++) {\r\n if (typeof (obj.value[Value(i)]) !== 'undefined') {\r\n if (obj.items[i].element) {\r\n obj.items[i].element.classList.add('jdropdown-selected')\r\n }\r\n obj.items[i].selected = true;\r\n\r\n // Keep label\r\n obj.value[Value(i)] = Text(i);\r\n }\r\n }\r\n\r\n // Global value\r\n obj.options.value = Object.keys(obj.value).join(';');\r\n\r\n // Update labels\r\n obj.header.value = obj.getText();\r\n }\r\n\r\n // Get the value of one item\r\n var Value = function (k, v) {\r\n // Legacy purposes\r\n if (!obj.options.format) {\r\n var property = 'value';\r\n } else {\r\n var property = 'id';\r\n }\r\n\r\n if (obj.items[k]) {\r\n if (v !== undefined) {\r\n return obj.items[k].data[property] = v;\r\n } else {\r\n return obj.items[k].data[property];\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n\r\n // Get the label of one item\r\n var Text = function (k, v) {\r\n // Legacy purposes\r\n if (!obj.options.format) {\r\n var property = 'text';\r\n } else {\r\n var property = 'name';\r\n }\r\n\r\n if (obj.items[k]) {\r\n if (v !== undefined) {\r\n return obj.items[k].data[property] = v;\r\n } else {\r\n return obj.items[k].data[property];\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n\r\n var getValue = function () {\r\n return Object.keys(obj.value);\r\n }\r\n\r\n var getText = function () {\r\n var data = [];\r\n var k = Object.keys(obj.value);\r\n for (var i = 0; i < k.length; i++) {\r\n data.push(obj.value[k[i]]);\r\n }\r\n return data;\r\n }\r\n\r\n obj.setOptions = function (options, reset) {\r\n if (!options) {\r\n options = {};\r\n }\r\n\r\n // Default configuration\r\n var defaults = {\r\n url: null,\r\n data: [],\r\n format: 0,\r\n multiple: false,\r\n autocomplete: false,\r\n remoteSearch: false,\r\n lazyLoading: false,\r\n type: null,\r\n width: null,\r\n maxWidth: null,\r\n opened: false,\r\n value: null,\r\n placeholder: '',\r\n newOptions: false,\r\n position: false,\r\n onchange: null,\r\n onload: null,\r\n onopen: null,\r\n onclose: null,\r\n onfocus: null,\r\n onblur: null,\r\n oninsert: null,\r\n onbeforeinsert: null,\r\n onsearch: null,\r\n onbeforesearch: null,\r\n sortResults: false,\r\n autofocus: false,\r\n prompt: null,\r\n allowEmpty: true,\r\n }\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n if (typeof (obj.options[property]) == 'undefined' || reset === true) {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n }\r\n\r\n // Force autocomplete search\r\n if (obj.options.remoteSearch == true || obj.options.type === 'searchbar') {\r\n obj.options.autocomplete = true;\r\n }\r\n\r\n // New options\r\n if (obj.options.newOptions == true) {\r\n obj.header.classList.add('jdropdown-add');\r\n } else {\r\n obj.header.classList.remove('jdropdown-add');\r\n }\r\n\r\n // Autocomplete\r\n if (obj.options.autocomplete == true) {\r\n obj.header.removeAttribute('readonly');\r\n } else {\r\n obj.header.setAttribute('readonly', 'readonly');\r\n }\r\n\r\n // Place holder\r\n if (obj.options.placeholder) {\r\n obj.header.setAttribute('placeholder', obj.options.placeholder);\r\n } else {\r\n obj.header.removeAttribute('placeholder');\r\n }\r\n\r\n // Remove specific dropdown typing to add again\r\n el.classList.remove('jdropdown-searchbar');\r\n el.classList.remove('jdropdown-picker');\r\n el.classList.remove('jdropdown-list');\r\n\r\n if (obj.options.type == 'searchbar') {\r\n el.classList.add('jdropdown-searchbar');\r\n } else if (obj.options.type == 'list') {\r\n el.classList.add('jdropdown-list');\r\n } else if (obj.options.type == 'picker') {\r\n el.classList.add('jdropdown-picker');\r\n } else {\r\n if (helpers.getWindowWidth() < 800) {\r\n if (obj.options.autocomplete) {\r\n el.classList.add('jdropdown-searchbar');\r\n obj.options.type = 'searchbar';\r\n } else {\r\n el.classList.add('jdropdown-picker');\r\n obj.options.type = 'picker';\r\n }\r\n } else {\r\n if (obj.options.width) {\r\n el.style.width = obj.options.width;\r\n el.style.minWidth = obj.options.width;\r\n } else {\r\n el.style.removeProperty('width');\r\n el.style.removeProperty('min-width');\r\n }\r\n\r\n el.classList.add('jdropdown-default');\r\n obj.options.type = 'default';\r\n }\r\n }\r\n\r\n // Close button\r\n if (obj.options.type == 'searchbar') {\r\n containerHeader.appendChild(closeButton);\r\n } else {\r\n container.insertBefore(closeButton, container.firstChild);\r\n }\r\n\r\n // Load the content\r\n if (obj.options.url && !options.data) {\r\n ajax({\r\n url: obj.options.url,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function (data) {\r\n if (data) {\r\n success(data, obj.options.value);\r\n }\r\n }\r\n });\r\n } else {\r\n success(obj.options.data, obj.options.value);\r\n }\r\n\r\n // Return the instance\r\n return obj;\r\n }\r\n\r\n // Helpers\r\n var containerHeader = null;\r\n var container = null;\r\n var content = null;\r\n var closeButton = null;\r\n var resetButton = null;\r\n var backdrop = null;\r\n\r\n var keyTimer = null;\r\n\r\n /**\r\n * Init dropdown\r\n */\r\n var init = function () {\r\n // Do not accept null\r\n if (!options) {\r\n options = {};\r\n }\r\n\r\n // If the element is a SELECT tag, create a configuration object\r\n if (el.tagName == 'SELECT') {\r\n var ret = Component.extractFromDom(el, options);\r\n el = ret.el;\r\n options = ret.options;\r\n }\r\n\r\n // Place holder\r\n if (!options.placeholder && el.getAttribute('placeholder')) {\r\n options.placeholder = el.getAttribute('placeholder');\r\n }\r\n\r\n // Value container\r\n obj.value = {};\r\n // Containers\r\n obj.items = [];\r\n obj.groups = [];\r\n // Search options\r\n obj.search = '';\r\n obj.results = null;\r\n\r\n // Create dropdown\r\n el.classList.add('jdropdown');\r\n\r\n // Header container\r\n containerHeader = document.createElement('div');\r\n containerHeader.className = 'jdropdown-container-header';\r\n\r\n // Header\r\n obj.header = document.createElement('input');\r\n obj.header.className = 'jdropdown-header jss_object';\r\n obj.header.type = 'text';\r\n obj.header.setAttribute('autocomplete', 'off');\r\n obj.header.onfocus = function () {\r\n if (typeof (obj.options.onfocus) == 'function') {\r\n obj.options.onfocus(el);\r\n }\r\n }\r\n\r\n obj.header.onblur = function () {\r\n if (typeof (obj.options.onblur) == 'function') {\r\n obj.options.onblur(el);\r\n }\r\n }\r\n\r\n obj.header.onkeyup = function (e) {\r\n if (obj.options.autocomplete == true && !keyTimer) {\r\n if (obj.search != obj.header.value.trim()) {\r\n keyTimer = setTimeout(function () {\r\n obj.find(obj.header.value.trim());\r\n keyTimer = null;\r\n }, 400);\r\n }\r\n\r\n if (!el.classList.contains('jdropdown-focus')) {\r\n obj.open();\r\n }\r\n } else {\r\n if (!obj.options.autocomplete) {\r\n obj.next(e.key);\r\n }\r\n }\r\n }\r\n\r\n // Global controls\r\n if (!Component.hasEvents) {\r\n // Execute only one time\r\n Component.hasEvents = true;\r\n // Enter and Esc\r\n document.addEventListener(\"keydown\", Component.keydown);\r\n }\r\n\r\n // Container\r\n container = document.createElement('div');\r\n container.className = 'jdropdown-container';\r\n\r\n // Dropdown content\r\n content = document.createElement('div');\r\n content.className = 'jdropdown-content';\r\n\r\n // Close button\r\n closeButton = document.createElement('div');\r\n closeButton.className = 'jdropdown-close';\r\n closeButton.textContent = 'Done';\r\n\r\n // Reset button\r\n resetButton = document.createElement('div');\r\n resetButton.className = 'jdropdown-reset';\r\n resetButton.textContent = 'x';\r\n resetButton.onclick = function () {\r\n obj.reset();\r\n obj.close();\r\n }\r\n\r\n // Create backdrop\r\n backdrop = document.createElement('div');\r\n backdrop.className = 'jdropdown-backdrop';\r\n\r\n // Append elements\r\n containerHeader.appendChild(obj.header);\r\n\r\n container.appendChild(content);\r\n el.appendChild(containerHeader);\r\n el.appendChild(container);\r\n el.appendChild(backdrop);\r\n\r\n // Set the otiptions\r\n obj.setOptions(options);\r\n\r\n if ('ontouchsend' in document.documentElement === true) {\r\n el.addEventListener('touchsend', Component.mouseup);\r\n } else {\r\n el.addEventListener('mouseup', Component.mouseup);\r\n }\r\n\r\n // Lazyloading\r\n if (obj.options.lazyLoading == true) {\r\n LazyLoading(content, {\r\n loadUp: obj.loadUp,\r\n loadDown: obj.loadDown,\r\n });\r\n }\r\n\r\n content.onwheel = function (e) {\r\n e.stopPropagation();\r\n }\r\n\r\n // Change method\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function (val) {\r\n if (val === undefined) {\r\n return obj.getValue(obj.options.multiple ? true : false);\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n // Keep object available from the node\r\n el.dropdown = obj;\r\n }\r\n\r\n /**\r\n * Get the current remote source of data URL\r\n */\r\n obj.getUrl = function () {\r\n return obj.options.url;\r\n }\r\n\r\n /**\r\n * Set the new data from a remote source\r\n * @param {string} url - url from the remote source\r\n * @param {function} callback - callback when the data is loaded\r\n */\r\n obj.setUrl = function (url, callback) {\r\n obj.options.url = url;\r\n\r\n ajax({\r\n url: obj.options.url,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function (data) {\r\n obj.setData(data);\r\n // Callback\r\n if (typeof (callback) == 'function') {\r\n callback(obj);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Set ID for one item\r\n */\r\n obj.setId = function (item, v) {\r\n // Legacy purposes\r\n if (!obj.options.format) {\r\n var property = 'value';\r\n } else {\r\n var property = 'id';\r\n }\r\n\r\n if (typeof (item) == 'object') {\r\n item[property] = v;\r\n } else {\r\n obj.items[item].data[property] = v;\r\n }\r\n }\r\n\r\n const add = function(title, id) {\r\n if (! title) {\r\n let current = obj.options.autocomplete == true ? obj.header.value : '';\r\n title = prompt(dictionary.translate('Add A New Option'), current);\r\n if (! title) {\r\n return false;\r\n }\r\n }\r\n\r\n // Id\r\n if (! id) {\r\n id = helpers.guid();\r\n }\r\n\r\n // Create new item\r\n if (!obj.options.format) {\r\n var item = {\r\n value: id,\r\n text: title,\r\n }\r\n } else {\r\n var item = {\r\n id: id,\r\n name: title,\r\n }\r\n }\r\n\r\n // Callback\r\n if (typeof (obj.options.onbeforeinsert) == 'function') {\r\n let ret = obj.options.onbeforeinsert(obj, item);\r\n if (ret === false) {\r\n return false;\r\n } else if (ret) {\r\n item = ret;\r\n }\r\n }\r\n\r\n // Add item to the main list\r\n obj.options.data.push(item);\r\n\r\n // Create DOM\r\n var newItem = obj.createItem(item);\r\n\r\n // Append DOM to the list\r\n content.appendChild(newItem.element);\r\n\r\n // Callback\r\n if (typeof (obj.options.oninsert) == 'function') {\r\n obj.options.oninsert(obj, item, newItem);\r\n }\r\n\r\n // Show content\r\n if (content.style.display == 'none') {\r\n content.style.display = '';\r\n }\r\n\r\n // Search?\r\n if (obj.results) {\r\n obj.results.push(newItem);\r\n }\r\n\r\n return item;\r\n }\r\n\r\n /**\r\n * Add a new item\r\n * @param {string} title - title of the new item\r\n * @param {string} id - value/id of the new item\r\n */\r\n obj.add = function (title, id) {\r\n if (typeof (obj.options.prompt) == 'function') {\r\n return obj.options.prompt.call(obj, add);\r\n }\r\n return add(title, id);\r\n }\r\n\r\n /**\r\n * Create a new item\r\n */\r\n obj.createItem = function (data, group, groupName) {\r\n // Keep the correct source of data\r\n if (!obj.options.format) {\r\n if (!data.value && data.id !== undefined) {\r\n data.value = data.id;\r\n //delete data.id;\r\n }\r\n if (!data.text && data.name !== undefined) {\r\n data.text = data.name;\r\n //delete data.name;\r\n }\r\n } else {\r\n if (!data.id && data.value !== undefined) {\r\n data.id = data.value;\r\n //delete data.value;\r\n }\r\n if (!data.name && data.text !== undefined) {\r\n data.name = data.text\r\n //delete data.text;\r\n }\r\n }\r\n\r\n // Create item\r\n var item = {};\r\n item.element = document.createElement('div');\r\n item.element.className = 'jdropdown-item';\r\n item.element.indexValue = obj.items.length;\r\n item.data = data;\r\n\r\n // Groupd DOM\r\n if (group) {\r\n item.group = group;\r\n }\r\n\r\n // Id\r\n if (data.id) {\r\n item.element.setAttribute('id', data.id);\r\n }\r\n\r\n // Disabled\r\n if (data.disabled == true) {\r\n item.element.setAttribute('data-disabled', true);\r\n }\r\n\r\n // Tooltip\r\n if (data.tooltip) {\r\n item.element.setAttribute('title', data.tooltip);\r\n }\r\n\r\n // Image\r\n if (data.image) {\r\n var image = document.createElement('img');\r\n image.className = 'jdropdown-image';\r\n image.src = data.image;\r\n if (!data.title) {\r\n image.classList.add('jdropdown-image-small');\r\n }\r\n item.element.appendChild(image);\r\n } else if (data.icon) {\r\n var icon = document.createElement('span');\r\n icon.className = \"jdropdown-icon material-icons\";\r\n icon.innerText = data.icon;\r\n if (!data.title) {\r\n icon.classList.add('jdropdown-icon-small');\r\n }\r\n if (data.color) {\r\n icon.style.color = data.color;\r\n }\r\n item.element.appendChild(icon);\r\n } else if (data.color) {\r\n var color = document.createElement('div');\r\n color.className = 'jdropdown-color';\r\n color.style.backgroundColor = data.color;\r\n item.element.appendChild(color);\r\n }\r\n\r\n // Set content\r\n if (!obj.options.format) {\r\n var text = data.text;\r\n } else {\r\n var text = data.name;\r\n }\r\n\r\n var node = document.createElement('div');\r\n node.className = 'jdropdown-description';\r\n node.textContent = text || ' ';\r\n\r\n // Title\r\n if (data.title) {\r\n var title = document.createElement('div');\r\n title.className = 'jdropdown-title';\r\n title.innerText = data.title;\r\n node.appendChild(title);\r\n }\r\n\r\n // Set content\r\n if (!obj.options.format) {\r\n var val = data.value;\r\n } else {\r\n var val = data.id;\r\n }\r\n\r\n // Value\r\n if (obj.value[val]) {\r\n item.element.classList.add('jdropdown-selected');\r\n item.selected = true;\r\n }\r\n\r\n // Keep DOM accessible\r\n obj.items.push(item);\r\n\r\n // Add node to item\r\n item.element.appendChild(node);\r\n\r\n return item;\r\n }\r\n\r\n obj.appendData = function (data) {\r\n // Create elements\r\n if (data.length) {\r\n // Helpers\r\n var items = [];\r\n var groups = [];\r\n\r\n // Prepare data\r\n for (var i = 0; i < data.length; i++) {\r\n // Process groups\r\n if (data[i].group) {\r\n if (!groups[data[i].group]) {\r\n groups[data[i].group] = [];\r\n }\r\n groups[data[i].group].push(i);\r\n } else {\r\n items.push(i);\r\n }\r\n }\r\n\r\n // Number of items counter\r\n var counter = 0;\r\n\r\n // Groups\r\n var groupNames = Object.keys(groups);\r\n\r\n // Append groups in case exists\r\n if (groupNames.length > 0) {\r\n for (var i = 0; i < groupNames.length; i++) {\r\n // Group container\r\n var group = document.createElement('div');\r\n group.className = 'jdropdown-group';\r\n // Group name\r\n var groupName = document.createElement('div');\r\n groupName.className = 'jdropdown-group-name';\r\n groupName.textContent = groupNames[i];\r\n // Group arrow\r\n var groupArrow = document.createElement('i');\r\n groupArrow.className = 'jdropdown-group-arrow jdropdown-group-arrow-down';\r\n groupName.appendChild(groupArrow);\r\n // Group items\r\n var groupContent = document.createElement('div');\r\n groupContent.className = 'jdropdown-group-items';\r\n for (var j = 0; j < groups[groupNames[i]].length; j++) {\r\n var item = obj.createItem(data[groups[groupNames[i]][j]], group, groupNames[i]);\r\n\r\n if (obj.options.lazyLoading == false || counter < 200) {\r\n groupContent.appendChild(item.element);\r\n counter++;\r\n }\r\n }\r\n // Group itens\r\n group.appendChild(groupName);\r\n group.appendChild(groupContent);\r\n // Keep group DOM\r\n obj.groups.push(group);\r\n // Only add to the screen if children on the group\r\n if (groupContent.children.length > 0) {\r\n // Add DOM to the content\r\n content.appendChild(group);\r\n }\r\n }\r\n }\r\n\r\n if (items.length) {\r\n for (var i = 0; i < items.length; i++) {\r\n var item = obj.createItem(data[items[i]]);\r\n if (obj.options.lazyLoading == false || counter < 200) {\r\n content.appendChild(item.element);\r\n counter++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n obj.setData = function (data) {\r\n // Reset current value\r\n resetValue();\r\n\r\n // Make sure the content container is blank\r\n content.textContent = '';\r\n\r\n // Reset\r\n obj.header.value = '';\r\n\r\n // Reset items and values\r\n obj.items = [];\r\n\r\n // Prepare data\r\n if (data && data.length) {\r\n for (var i = 0; i < data.length; i++) {\r\n // Compatibility\r\n if (typeof (data[i]) != 'object') {\r\n // Correct format\r\n if (!obj.options.format) {\r\n data[i] = {\r\n value: data[i],\r\n text: data[i]\r\n }\r\n } else {\r\n data[i] = {\r\n id: data[i],\r\n name: data[i]\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Append data\r\n obj.appendData(data);\r\n\r\n // Update data\r\n obj.options.data = data;\r\n } else {\r\n // Update data\r\n obj.options.data = [];\r\n }\r\n\r\n obj.close();\r\n }\r\n\r\n obj.getData = function () {\r\n return obj.options.data;\r\n }\r\n\r\n /**\r\n * Get position of the item\r\n */\r\n obj.getPosition = function (val) {\r\n for (var i = 0; i < obj.items.length; i++) {\r\n if (Value(i) == val) {\r\n return i;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Get dropdown current text\r\n */\r\n obj.getText = function (asArray) {\r\n // Get value\r\n var v = getText();\r\n // Return value\r\n if (asArray) {\r\n return v;\r\n } else {\r\n return v.join('; ');\r\n }\r\n }\r\n\r\n /**\r\n * Get dropdown current value\r\n */\r\n obj.getValue = function (asArray) {\r\n // Get value\r\n var v = getValue();\r\n // Return value\r\n if (asArray) {\r\n return v;\r\n } else {\r\n return v.join(';');\r\n }\r\n }\r\n\r\n /**\r\n * Change event\r\n */\r\n var change = function (oldValue) {\r\n // Lemonade JS\r\n if (el.value != obj.options.value) {\r\n el.value = obj.options.value;\r\n if (typeof (el.oninput) == 'function') {\r\n el.oninput({\r\n type: 'input',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n\r\n // Events\r\n if (typeof (obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, obj, oldValue, obj.options.value);\r\n }\r\n }\r\n\r\n /**\r\n * Set value\r\n */\r\n obj.setValue = function (newValue) {\r\n // Current value\r\n var oldValue = obj.getValue();\r\n // New value\r\n if (Array.isArray(newValue)) {\r\n newValue = newValue.join(';')\r\n }\r\n\r\n if (oldValue !== newValue) {\r\n // Set value\r\n applyValue(newValue);\r\n\r\n // Change\r\n change(oldValue);\r\n }\r\n }\r\n\r\n obj.resetSelected = function () {\r\n obj.setValue(null);\r\n }\r\n\r\n obj.selectIndex = function (index, force) {\r\n // Make sure is a number\r\n var index = parseInt(index);\r\n\r\n // Only select those existing elements\r\n if (obj.items && obj.items[index] && (force === true || obj.items[index].data.disabled !== true)) {\r\n // Reset cursor to a new position\r\n obj.setCursor(index, false);\r\n\r\n // Behaviour\r\n if (!obj.options.multiple) {\r\n // Update value\r\n if (obj.items[index].selected) {\r\n if (obj.options.allowEmpty !== false) {\r\n obj.setValue(null);\r\n }\r\n } else {\r\n obj.setValue(Value(index));\r\n }\r\n\r\n // Close component\r\n obj.close();\r\n } else {\r\n // Old value\r\n var oldValue = obj.options.value;\r\n\r\n // Toggle option\r\n if (obj.items[index].selected) {\r\n obj.items[index].element.classList.remove('jdropdown-selected');\r\n obj.items[index].selected = false;\r\n\r\n delete obj.value[Value(index)];\r\n } else {\r\n // Select element\r\n obj.items[index].element.classList.add('jdropdown-selected');\r\n obj.items[index].selected = true;\r\n\r\n // Set value\r\n obj.value[Value(index)] = Text(index);\r\n }\r\n\r\n // Global value\r\n obj.options.value = Object.keys(obj.value).join(';');\r\n\r\n // Update labels for multiple dropdown\r\n if (obj.options.autocomplete == false) {\r\n obj.header.value = getText().join('; ');\r\n }\r\n\r\n // Events\r\n change(oldValue);\r\n }\r\n }\r\n }\r\n\r\n obj.selectItem = function (item) {\r\n obj.selectIndex(item.indexValue);\r\n }\r\n\r\n var exists = function (k, result) {\r\n for (var j = 0; j < result.length; j++) {\r\n if (!obj.options.format) {\r\n if (result[j].value == k) {\r\n return true;\r\n }\r\n } else {\r\n if (result[j].id == k) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n obj.find = function (str) {\r\n if (obj.search == str.trim()) {\r\n return false;\r\n }\r\n\r\n // Search term\r\n obj.search = str;\r\n\r\n // Reset index\r\n obj.setCursor();\r\n\r\n // Remove nodes from all groups\r\n if (obj.groups.length) {\r\n for (var i = 0; i < obj.groups.length; i++) {\r\n obj.groups[i].lastChild.textContent = '';\r\n }\r\n }\r\n\r\n // Remove all nodes\r\n content.textContent = '';\r\n\r\n // Remove current items in the remote search\r\n if (obj.options.remoteSearch == true) {\r\n // Reset results\r\n obj.results = null;\r\n // URL\r\n var url = obj.options.url;\r\n\r\n // Ajax call\r\n let o = {\r\n url: url,\r\n method: 'GET',\r\n data: { q: str },\r\n dataType: 'json',\r\n success: function (result) {\r\n // Reset items\r\n obj.items = [];\r\n\r\n // Add the current selected items to the results in case they are not there\r\n var current = Object.keys(obj.value);\r\n if (current.length) {\r\n for (var i = 0; i < current.length; i++) {\r\n if (!exists(current[i], result)) {\r\n if (!obj.options.format) {\r\n result.unshift({value: current[i], text: obj.value[current[i]]});\r\n } else {\r\n result.unshift({id: current[i], name: obj.value[current[i]]});\r\n }\r\n }\r\n }\r\n }\r\n // Append data\r\n obj.appendData(result);\r\n // Show or hide results\r\n if (!result.length) {\r\n content.style.display = 'none';\r\n } else {\r\n content.style.display = '';\r\n }\r\n\r\n if (typeof(obj.options.onsearch) === 'function') {\r\n obj.options.onsearch(obj, result);\r\n }\r\n }\r\n }\r\n\r\n if (typeof(obj.options.onbeforesearch) === 'function') {\r\n let ret = obj.options.onbeforesearch(obj, o);\r\n if (ret === false) {\r\n return;\r\n } else if (typeof(ret) === 'object') {\r\n o = ret;\r\n }\r\n }\r\n\r\n // Remote search\r\n ajax(o);\r\n } else {\r\n // Search terms\r\n str = new RegExp(str, 'gi');\r\n\r\n // Reset search\r\n var results = [];\r\n\r\n // Append options\r\n for (var i = 0; i < obj.items.length; i++) {\r\n // Item label\r\n var label = Text(i);\r\n // Item title\r\n var title = obj.items[i].data.title || '';\r\n // Group name\r\n var groupName = obj.items[i].data.group || '';\r\n // Synonym\r\n var synonym = obj.items[i].data.synonym || '';\r\n if (synonym) {\r\n synonym = synonym.join(' ');\r\n }\r\n\r\n if (str == null || obj.items[i].selected == true || label.toString().match(str) || title.match(str) || groupName.match(str) || synonym.match(str)) {\r\n results.push(obj.items[i]);\r\n }\r\n }\r\n\r\n if (!results.length) {\r\n content.style.display = 'none';\r\n\r\n // Results\r\n obj.results = null;\r\n } else {\r\n content.style.display = '';\r\n\r\n // Results\r\n obj.results = results;\r\n\r\n // Show 200 items at once\r\n var number = results.length || 0;\r\n\r\n // Lazyloading\r\n if (obj.options.lazyLoading == true && number > 200) {\r\n number = 200;\r\n }\r\n\r\n for (var i = 0; i < number; i++) {\r\n if (obj.results[i].group) {\r\n if (!obj.results[i].group.parentNode) {\r\n content.appendChild(obj.results[i].group);\r\n }\r\n obj.results[i].group.lastChild.appendChild(obj.results[i].element);\r\n } else {\r\n content.appendChild(obj.results[i].element);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Auto focus\r\n if (obj.options.autofocus == true) {\r\n obj.first();\r\n }\r\n }\r\n\r\n obj.open = function () {\r\n // Focus\r\n if (!el.classList.contains('jdropdown-focus')) {\r\n // Current dropdown\r\n Component.current = obj;\r\n\r\n // Start tracking\r\n tracking(obj, true);\r\n\r\n // Add focus\r\n el.classList.add('jdropdown-focus');\r\n\r\n // Animation\r\n if (helpers.getWindowWidth() < 800) {\r\n if (obj.options.type == null || obj.options.type == 'picker') {\r\n animation.slideBottom(container, 1);\r\n }\r\n }\r\n\r\n // Filter\r\n if (obj.options.autocomplete == true) {\r\n obj.header.value = obj.search;\r\n obj.header.focus();\r\n }\r\n\r\n // Set cursor for the first or first selected element\r\n var k = getValue();\r\n if (k[0]) {\r\n var cursor = obj.getPosition(k[0]);\r\n if (cursor !== false) {\r\n obj.setCursor(cursor);\r\n }\r\n }\r\n\r\n // Container Size\r\n if (!obj.options.type || obj.options.type == 'default') {\r\n var rect = el.getBoundingClientRect();\r\n var rectContainer = container.getBoundingClientRect();\r\n\r\n if (obj.options.position) {\r\n container.style.position = 'fixed';\r\n if (window.innerHeight < rect.bottom + rectContainer.height) {\r\n container.style.top = '';\r\n container.style.bottom = (window.innerHeight - rect.top) + 1 + 'px';\r\n } else {\r\n container.style.top = rect.bottom + 'px';\r\n container.style.bottom = '';\r\n }\r\n container.style.left = rect.left + 'px';\r\n } else {\r\n if (window.innerHeight < rect.bottom + rectContainer.height) {\r\n container.style.top = '';\r\n container.style.bottom = rect.height + 1 + 'px';\r\n } else {\r\n container.style.top = '';\r\n container.style.bottom = '';\r\n }\r\n }\r\n\r\n container.style.minWidth = rect.width + 'px';\r\n\r\n if (obj.options.maxWidth) {\r\n container.style.maxWidth = obj.options.maxWidth;\r\n }\r\n\r\n if (!obj.items.length && obj.options.autocomplete == true) {\r\n content.style.display = 'none';\r\n } else {\r\n content.style.display = '';\r\n }\r\n }\r\n }\r\n\r\n // Events\r\n if (typeof (obj.options.onopen) == 'function') {\r\n obj.options.onopen(el);\r\n }\r\n }\r\n\r\n obj.close = function (ignoreEvents) {\r\n if (el.classList.contains('jdropdown-focus')) {\r\n // Update labels\r\n obj.header.value = obj.getText();\r\n // Remove cursor\r\n obj.setCursor();\r\n // Events\r\n if (!ignoreEvents && typeof (obj.options.onclose) == 'function') {\r\n obj.options.onclose(el);\r\n }\r\n // Blur\r\n if (obj.header.blur) {\r\n obj.header.blur();\r\n }\r\n // Remove focus\r\n el.classList.remove('jdropdown-focus');\r\n // Start tracking\r\n tracking(obj, false);\r\n // Current dropdown\r\n Component.current = null;\r\n }\r\n\r\n return obj.getValue();\r\n }\r\n\r\n /**\r\n * Set cursor\r\n */\r\n obj.setCursor = function (index, setPosition) {\r\n // Remove current cursor\r\n if (obj.currentIndex != null) {\r\n // Remove visual cursor\r\n if (obj.items && obj.items[obj.currentIndex]) {\r\n obj.items[obj.currentIndex].element.classList.remove('jdropdown-cursor');\r\n }\r\n }\r\n\r\n if (index == undefined) {\r\n obj.currentIndex = null;\r\n } else {\r\n index = parseInt(index);\r\n\r\n // Cursor only for visible items\r\n if (obj.items[index].element.parentNode) {\r\n obj.items[index].element.classList.add('jdropdown-cursor');\r\n obj.currentIndex = index;\r\n\r\n // Update scroll to the cursor element\r\n if (setPosition !== false && obj.items[obj.currentIndex].element) {\r\n var container = content.scrollTop;\r\n var element = obj.items[obj.currentIndex].element;\r\n content.scrollTop = element.offsetTop - element.scrollTop + element.clientTop - 95;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Compatibility\r\n obj.resetCursor = obj.setCursor;\r\n obj.updateCursor = obj.setCursor;\r\n\r\n /**\r\n * Reset cursor and selected items\r\n */\r\n obj.reset = function () {\r\n // Reset cursor\r\n obj.setCursor();\r\n\r\n // Reset selected\r\n obj.setValue(null);\r\n }\r\n\r\n /**\r\n * First available item\r\n */\r\n obj.first = function () {\r\n if (obj.options.lazyLoading === true) {\r\n obj.loadFirst();\r\n }\r\n\r\n var items = content.querySelectorAll('.jdropdown-item');\r\n if (items.length) {\r\n var newIndex = items[0].indexValue;\r\n obj.setCursor(newIndex);\r\n }\r\n }\r\n\r\n /**\r\n * Last available item\r\n */\r\n obj.last = function () {\r\n if (obj.options.lazyLoading === true) {\r\n obj.loadLast();\r\n }\r\n\r\n var items = content.querySelectorAll('.jdropdown-item');\r\n if (items.length) {\r\n var newIndex = items[items.length - 1].indexValue;\r\n obj.setCursor(newIndex);\r\n }\r\n }\r\n\r\n obj.next = function (letter) {\r\n var newIndex = null;\r\n\r\n if (letter) {\r\n if (letter.length == 1) {\r\n // Current index\r\n var current = obj.currentIndex || -1;\r\n // Letter\r\n letter = letter.toLowerCase();\r\n\r\n var e = null;\r\n var l = null;\r\n var items = content.querySelectorAll('.jdropdown-item');\r\n if (items.length) {\r\n for (var i = 0; i < items.length; i++) {\r\n if (items[i].indexValue > current) {\r\n if (e = obj.items[items[i].indexValue]) {\r\n if (l = e.element.innerText[0]) {\r\n l = l.toLowerCase();\r\n if (letter == l) {\r\n newIndex = items[i].indexValue;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n obj.setCursor(newIndex);\r\n }\r\n }\r\n } else {\r\n if (obj.currentIndex == undefined || obj.currentIndex == null) {\r\n obj.first();\r\n } else {\r\n var element = obj.items[obj.currentIndex].element;\r\n\r\n var next = element.nextElementSibling;\r\n if (next) {\r\n if (next.classList.contains('jdropdown-group')) {\r\n next = next.lastChild.firstChild;\r\n }\r\n newIndex = next.indexValue;\r\n } else {\r\n if (element.parentNode.classList.contains('jdropdown-group-items')) {\r\n if (next = element.parentNode.parentNode.nextElementSibling) {\r\n if (next.classList.contains('jdropdown-group')) {\r\n next = next.lastChild.firstChild;\r\n } else if (next.classList.contains('jdropdown-item')) {\r\n newIndex = next.indexValue;\r\n } else {\r\n next = null;\r\n }\r\n }\r\n\r\n if (next) {\r\n newIndex = next.indexValue;\r\n }\r\n }\r\n }\r\n\r\n if (newIndex !== null) {\r\n obj.setCursor(newIndex);\r\n }\r\n }\r\n }\r\n }\r\n\r\n obj.prev = function () {\r\n var newIndex = null;\r\n\r\n if (obj.currentIndex === null) {\r\n obj.first();\r\n } else {\r\n var element = obj.items[obj.currentIndex].element;\r\n\r\n var prev = element.previousElementSibling;\r\n if (prev) {\r\n if (prev.classList.contains('jdropdown-group')) {\r\n prev = prev.lastChild.lastChild;\r\n }\r\n newIndex = prev.indexValue;\r\n } else {\r\n if (element.parentNode.classList.contains('jdropdown-group-items')) {\r\n if (prev = element.parentNode.parentNode.previousElementSibling) {\r\n if (prev.classList.contains('jdropdown-group')) {\r\n prev = prev.lastChild.lastChild;\r\n } else if (prev.classList.contains('jdropdown-item')) {\r\n newIndex = prev.indexValue;\r\n } else {\r\n prev = null\r\n }\r\n }\r\n\r\n if (prev) {\r\n newIndex = prev.indexValue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (newIndex !== null) {\r\n obj.setCursor(newIndex);\r\n }\r\n }\r\n\r\n obj.loadFirst = function () {\r\n // Search\r\n if (obj.results) {\r\n var results = obj.results;\r\n } else {\r\n var results = obj.items;\r\n }\r\n\r\n // Show 200 items at once\r\n var number = results.length || 0;\r\n\r\n // Lazyloading\r\n if (obj.options.lazyLoading == true && number > 200) {\r\n number = 200;\r\n }\r\n\r\n // Reset container\r\n content.textContent = '';\r\n\r\n // First 200 items\r\n for (var i = 0; i < number; i++) {\r\n if (results[i].group) {\r\n if (!results[i].group.parentNode) {\r\n content.appendChild(results[i].group);\r\n }\r\n results[i].group.lastChild.appendChild(results[i].element);\r\n } else {\r\n content.appendChild(results[i].element);\r\n }\r\n }\r\n\r\n // Scroll go to the begin\r\n content.scrollTop = 0;\r\n }\r\n\r\n obj.loadLast = function () {\r\n // Search\r\n if (obj.results) {\r\n var results = obj.results;\r\n } else {\r\n var results = obj.items;\r\n }\r\n\r\n // Show first page\r\n var number = results.length;\r\n\r\n // Max 200 items\r\n if (number > 200) {\r\n number = number - 200;\r\n\r\n // Reset container\r\n content.textContent = '';\r\n\r\n // First 200 items\r\n for (var i = number; i < results.length; i++) {\r\n if (results[i].group) {\r\n if (!results[i].group.parentNode) {\r\n content.appendChild(results[i].group);\r\n }\r\n results[i].group.lastChild.appendChild(results[i].element);\r\n } else {\r\n content.appendChild(results[i].element);\r\n }\r\n }\r\n\r\n // Scroll go to the begin\r\n content.scrollTop = content.scrollHeight;\r\n }\r\n }\r\n\r\n obj.loadUp = function () {\r\n var test = false;\r\n\r\n // Search\r\n if (obj.results) {\r\n var results = obj.results;\r\n } else {\r\n var results = obj.items;\r\n }\r\n\r\n var items = content.querySelectorAll('.jdropdown-item');\r\n var fistItem = items[0].indexValue;\r\n fistItem = obj.items[fistItem];\r\n var index = results.indexOf(fistItem) - 1;\r\n\r\n if (index > 0) {\r\n var number = 0;\r\n\r\n while (index > 0 && results[index] && number < 200) {\r\n if (results[index].group) {\r\n if (!results[index].group.parentNode) {\r\n content.insertBefore(results[index].group, content.firstChild);\r\n }\r\n results[index].group.lastChild.insertBefore(results[index].element, results[index].group.lastChild.firstChild);\r\n } else {\r\n content.insertBefore(results[index].element, content.firstChild);\r\n }\r\n\r\n index--;\r\n number++;\r\n }\r\n\r\n // New item added\r\n test = true;\r\n }\r\n\r\n return test;\r\n }\r\n\r\n obj.loadDown = function () {\r\n var test = false;\r\n\r\n // Search\r\n if (obj.results) {\r\n var results = obj.results;\r\n } else {\r\n var results = obj.items;\r\n }\r\n\r\n var items = content.querySelectorAll('.jdropdown-item');\r\n var lastItem = items[items.length - 1].indexValue;\r\n lastItem = obj.items[lastItem];\r\n var index = results.indexOf(lastItem) + 1;\r\n\r\n if (index < results.length) {\r\n var number = 0;\r\n while (index < results.length && results[index] && number < 200) {\r\n if (results[index].group) {\r\n if (!results[index].group.parentNode) {\r\n content.appendChild(results[index].group);\r\n }\r\n results[index].group.lastChild.appendChild(results[index].element);\r\n } else {\r\n content.appendChild(results[index].element);\r\n }\r\n\r\n index++;\r\n number++;\r\n }\r\n\r\n // New item added\r\n test = true;\r\n }\r\n\r\n return test;\r\n }\r\n\r\n init();\r\n\r\n return obj;\r\n });\r\n\r\n Component.keydown = function (e) {\r\n var dropdown = null;\r\n if (dropdown = Component.current) {\r\n if (e.which == 13 || e.which == 9) { // enter or tab\r\n if (dropdown.header.value && dropdown.currentIndex == null && dropdown.options.newOptions) {\r\n // if they typed something in, but it matched nothing, and newOptions are allowed, start that flow\r\n dropdown.add();\r\n } else {\r\n // Quick Select/Filter\r\n if (dropdown.currentIndex == null && dropdown.options.autocomplete == true && dropdown.header.value != \"\") {\r\n dropdown.find(dropdown.header.value);\r\n }\r\n dropdown.selectIndex(dropdown.currentIndex);\r\n }\r\n } else if (e.which == 38) { // up arrow\r\n if (dropdown.currentIndex == null) {\r\n dropdown.first();\r\n } else if (dropdown.currentIndex > 0) {\r\n dropdown.prev();\r\n }\r\n e.preventDefault();\r\n } else if (e.which == 40) { // down arrow\r\n if (dropdown.currentIndex == null) {\r\n dropdown.first();\r\n } else if (dropdown.currentIndex + 1 < dropdown.items.length) {\r\n dropdown.next();\r\n }\r\n e.preventDefault();\r\n } else if (e.which == 36) {\r\n dropdown.first();\r\n if (!e.target.classList.contains('jdropdown-header')) {\r\n e.preventDefault();\r\n }\r\n } else if (e.which == 35) {\r\n dropdown.last();\r\n if (!e.target.classList.contains('jdropdown-header')) {\r\n e.preventDefault();\r\n }\r\n } else if (e.which == 27) {\r\n dropdown.close();\r\n } else if (e.which == 33) { // page up\r\n if (dropdown.currentIndex == null) {\r\n dropdown.first();\r\n } else if (dropdown.currentIndex > 0) {\r\n for (var i = 0; i < 7; i++) {\r\n dropdown.prev()\r\n }\r\n }\r\n e.preventDefault();\r\n } else if (e.which == 34) { // page down\r\n if (dropdown.currentIndex == null) {\r\n dropdown.first();\r\n } else if (dropdown.currentIndex + 1 < dropdown.items.length) {\r\n for (var i = 0; i < 7; i++) {\r\n dropdown.next()\r\n }\r\n }\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n Component.mouseup = function (e) {\r\n var element = helpers.findElement(e.target, 'jdropdown');\r\n if (element) {\r\n var dropdown = element.dropdown;\r\n if (e.target.classList.contains('jdropdown-header')) {\r\n if (element.classList.contains('jdropdown-focus') && element.classList.contains('jdropdown-default')) {\r\n var rect = element.getBoundingClientRect();\r\n\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n var x = e.changedTouches[0].clientX;\r\n var y = e.changedTouches[0].clientY;\r\n } else {\r\n var x = e.clientX;\r\n var y = e.clientY;\r\n }\r\n\r\n if (rect.width - (x - rect.left) < 30) {\r\n if (e.target.classList.contains('jdropdown-add')) {\r\n dropdown.add();\r\n } else {\r\n dropdown.close();\r\n }\r\n } else {\r\n if (dropdown.options.autocomplete == false) {\r\n dropdown.close();\r\n }\r\n }\r\n } else {\r\n dropdown.open();\r\n }\r\n } else if (e.target.classList.contains('jdropdown-group-name')) {\r\n var items = e.target.nextSibling.children;\r\n if (e.target.nextSibling.style.display != 'none') {\r\n for (var i = 0; i < items.length; i++) {\r\n if (items[i].style.display != 'none') {\r\n dropdown.selectItem(items[i]);\r\n }\r\n }\r\n }\r\n } else if (e.target.classList.contains('jdropdown-group-arrow')) {\r\n if (e.target.classList.contains('jdropdown-group-arrow-down')) {\r\n e.target.classList.remove('jdropdown-group-arrow-down');\r\n e.target.classList.add('jdropdown-group-arrow-up');\r\n e.target.parentNode.nextSibling.style.display = 'none';\r\n } else {\r\n e.target.classList.remove('jdropdown-group-arrow-up');\r\n e.target.classList.add('jdropdown-group-arrow-down');\r\n e.target.parentNode.nextSibling.style.display = '';\r\n }\r\n } else if (e.target.classList.contains('jdropdown-item')) {\r\n dropdown.selectItem(e.target);\r\n } else if (e.target.classList.contains('jdropdown-image')) {\r\n dropdown.selectItem(e.target.parentNode);\r\n } else if (e.target.classList.contains('jdropdown-description')) {\r\n dropdown.selectItem(e.target.parentNode);\r\n } else if (e.target.classList.contains('jdropdown-title')) {\r\n dropdown.selectItem(e.target.parentNode.parentNode);\r\n } else if (e.target.classList.contains('jdropdown-close') || e.target.classList.contains('jdropdown-backdrop')) {\r\n dropdown.close();\r\n }\r\n }\r\n }\r\n\r\n Component.extractFromDom = function (el, options) {\r\n // Keep reference\r\n var select = el;\r\n if (!options) {\r\n options = {};\r\n }\r\n // Prepare configuration\r\n if (el.getAttribute('multiple') && (!options || options.multiple == undefined)) {\r\n options.multiple = true;\r\n }\r\n if (el.getAttribute('placeholder') && (!options || options.placeholder == undefined)) {\r\n options.placeholder = el.getAttribute('placeholder');\r\n }\r\n if (el.getAttribute('data-autocomplete') && (!options || options.autocomplete == undefined)) {\r\n options.autocomplete = true;\r\n }\r\n if (!options || options.width == undefined) {\r\n options.width = el.offsetWidth;\r\n }\r\n if (el.value && (!options || options.value == undefined)) {\r\n options.value = el.value;\r\n }\r\n if (!options || options.data == undefined) {\r\n options.data = [];\r\n for (var j = 0; j < el.children.length; j++) {\r\n if (el.children[j].tagName == 'OPTGROUP') {\r\n for (var i = 0; i < el.children[j].children.length; i++) {\r\n options.data.push({\r\n value: el.children[j].children[i].value,\r\n text: el.children[j].children[i].textContent,\r\n group: el.children[j].getAttribute('label'),\r\n });\r\n }\r\n } else {\r\n options.data.push({\r\n value: el.children[j].value,\r\n text: el.children[j].textContent,\r\n });\r\n }\r\n }\r\n }\r\n if (!options || options.onchange == undefined) {\r\n options.onchange = function (a, b, c, d) {\r\n if (options.multiple == true) {\r\n if (obj.items[b].classList.contains('jdropdown-selected')) {\r\n select.options[b].setAttribute('selected', 'selected');\r\n } else {\r\n select.options[b].removeAttribute('selected');\r\n }\r\n } else {\r\n select.value = d;\r\n }\r\n }\r\n }\r\n // Create DIV\r\n var div = document.createElement('div');\r\n el.parentNode.insertBefore(div, el);\r\n el.style.display = 'none';\r\n el = div;\r\n\r\n return {el: el, options: options};\r\n }\r\n\r\n return Component;\r\n}\r\n\r\n/* harmony default export */ var dropdown = (Dropdown());\n;// CONCATENATED MODULE: ./src/plugins/picker.js\n\n\n\nfunction Picker(el, options) {\n // Already created, update options\n if (el.picker) {\n return el.picker.setOptions(options, true);\n }\n\n // New instance\n var obj = { type: 'picker' };\n obj.options = {};\n\n var dropdownHeader = null;\n var dropdownContent = null;\n\n /**\n * The element passed is a DOM element\n */\n var isDOM = function(o) {\n return (o instanceof Element || o instanceof HTMLDocument);\n }\n\n /**\n * Create the content options\n */\n var createContent = function() {\n dropdownContent.innerHTML = '';\n\n // Create items\n var keys = Object.keys(obj.options.data);\n\n // Go though all options\n for (var i = 0; i < keys.length; i++) {\n // Item\n var dropdownItem = document.createElement('div');\n dropdownItem.classList.add('jpicker-item');\n dropdownItem.k = keys[i];\n dropdownItem.v = obj.options.data[keys[i]];\n // Label\n var item = obj.getLabel(keys[i], dropdownItem);\n if (isDOM(item)) {\n dropdownItem.appendChild(item);\n } else {\n dropdownItem.innerHTML = item;\n }\n // Append\n dropdownContent.appendChild(dropdownItem);\n }\n }\n\n /**\n * Set or reset the options for the picker\n */\n obj.setOptions = function(options, reset) {\n // Default configuration\n var defaults = {\n value: 0,\n data: null,\n render: null,\n onchange: null,\n onmouseover: null,\n onselect: null,\n onopen: null,\n onclose: null,\n onload: null,\n width: null,\n header: true,\n right: false,\n bottom: false,\n content: false,\n columns: null,\n grid: null,\n height: null,\n }\n\n // Legacy purpose only\n if (options && options.options) {\n options.data = options.options;\n }\n\n // Loop through the initial configuration\n for (var property in defaults) {\n if (options && options.hasOwnProperty(property)) {\n obj.options[property] = options[property];\n } else {\n if (typeof(obj.options[property]) == 'undefined' || reset === true) {\n obj.options[property] = defaults[property];\n }\n }\n }\n\n // Start using the options\n if (obj.options.header === false) {\n dropdownHeader.style.display = 'none';\n } else {\n dropdownHeader.style.display = '';\n }\n\n // Width\n if (obj.options.width) {\n dropdownHeader.style.width = parseInt(obj.options.width) + 'px';\n } else {\n dropdownHeader.style.width = '';\n }\n\n // Height\n if (obj.options.height) {\n dropdownContent.style.maxHeight = obj.options.height + 'px';\n dropdownContent.style.overflow = 'scroll';\n } else {\n dropdownContent.style.overflow = '';\n }\n\n if (obj.options.columns > 0) {\n if (! obj.options.grid) {\n dropdownContent.classList.add('jpicker-columns');\n dropdownContent.style.width = obj.options.width ? obj.options.width : 36 * obj.options.columns + 'px';\n } else {\n dropdownContent.classList.add('jpicker-grid');\n dropdownContent.style.gridTemplateColumns = 'repeat(' + obj.options.grid + ', 1fr)';\n }\n }\n\n if (isNaN(parseInt(obj.options.value))) {\n obj.options.value = 0;\n }\n\n // Create list from data\n createContent();\n\n // Set value\n obj.setValue(obj.options.value);\n\n // Set options all returns the own instance\n return obj;\n }\n\n obj.getValue = function() {\n return obj.options.value;\n }\n\n obj.setValue = function(k, e) {\n // Set label\n obj.setLabel(k);\n\n // Update value\n obj.options.value = String(k);\n\n // Lemonade JS\n if (el.value != obj.options.value) {\n el.value = obj.options.value;\n if (typeof(el.oninput) == 'function') {\n el.oninput({\n type: 'input',\n target: el,\n value: el.value\n });\n }\n }\n\n if (dropdownContent.children[k] && dropdownContent.children[k].getAttribute('type') !== 'generic') {\n obj.close();\n }\n\n // Call method\n if (e) {\n if (typeof (obj.options.onchange) == 'function') {\n var v = obj.options.data[k];\n\n obj.options.onchange(el, obj, v, v, k, e);\n }\n }\n }\n\n obj.getLabel = function(v, item) {\n var label = obj.options.data[v] || null;\n if (typeof(obj.options.render) == 'function') {\n label = obj.options.render(label, item);\n }\n return label;\n }\n\n obj.setLabel = function(v) {\n var item;\n\n if (obj.options.content) {\n item = '' + obj.options.content + '';\n } else {\n item = obj.getLabel(v, null);\n }\n // Label\n if (isDOM(item)) {\n dropdownHeader.innerHTML = '';\n dropdownHeader.appendChild(item);\n } else {\n dropdownHeader.innerHTML = item;\n }\n }\n\n obj.open = function() {\n if (! el.classList.contains('jpicker-focus')) {\n // Start tracking the element\n tracking(obj, true);\n\n // Open picker\n el.classList.add('jpicker-focus');\n el.focus();\n\n var top = 0;\n var left = 0;\n\n dropdownContent.style.marginLeft = '';\n\n var rectHeader = dropdownHeader.getBoundingClientRect();\n var rectContent = dropdownContent.getBoundingClientRect();\n\n if (window.innerHeight < rectHeader.bottom + rectContent.height || obj.options.bottom) {\n top = -1 * (rectContent.height + 4);\n } else {\n top = rectHeader.height + 4;\n }\n\n if (obj.options.right === true) {\n left = -1 * rectContent.width + rectHeader.width;\n }\n\n if (rectContent.left + left < 0) {\n left = left + rectContent.left + 10;\n }\n if (rectContent.left + rectContent.width > window.innerWidth) {\n left = -1 * (10 + rectContent.left + rectContent.width - window.innerWidth);\n }\n\n dropdownContent.style.marginTop = parseInt(top) + 'px';\n dropdownContent.style.marginLeft = parseInt(left) + 'px';\n\n //dropdownContent.style.marginTop\n if (typeof obj.options.onopen == 'function') {\n obj.options.onopen(el, obj);\n }\n }\n }\n\n obj.close = function() {\n if (el.classList.contains('jpicker-focus')) {\n el.classList.remove('jpicker-focus');\n\n // Start tracking the element\n tracking(obj, false);\n\n if (typeof obj.options.onclose == 'function') {\n obj.options.onclose(el, obj);\n }\n }\n }\n\n /**\n * Create floating picker\n */\n var init = function() {\n // Class\n el.classList.add('jpicker');\n el.setAttribute('tabindex', '900');\n el.onmousedown = function(e) {\n if (! el.classList.contains('jpicker-focus')) {\n obj.open();\n }\n }\n\n // Dropdown Header\n dropdownHeader = document.createElement('div');\n dropdownHeader.classList.add('jpicker-header');\n\n // Dropdown content\n dropdownContent = document.createElement('div');\n dropdownContent.classList.add('jpicker-content');\n dropdownContent.onclick = function(e) {\n var item = helpers.findElement(e.target, 'jpicker-item');\n if (item) {\n if (item.parentNode === dropdownContent) {\n // Update label\n obj.setValue(item.k, e);\n }\n }\n }\n // Append content and header\n el.appendChild(dropdownHeader);\n el.appendChild(dropdownContent);\n\n // Default value\n el.value = options.value || 0;\n\n // Set options\n obj.setOptions(options);\n\n if (typeof(obj.options.onload) == 'function') {\n obj.options.onload(el, obj);\n }\n\n // Change\n el.change = obj.setValue;\n\n // Global generic value handler\n el.val = function(val) {\n if (val === undefined) {\n return obj.getValue();\n } else {\n obj.setValue(val);\n }\n }\n\n // Reference\n el.picker = obj;\n }\n\n init();\n\n return obj;\n}\n;// CONCATENATED MODULE: ./src/plugins/toolbar.js\n\r\n\r\n\r\n\r\n\r\nfunction Toolbar(el, options) {\r\n // New instance\r\n var obj = { type:'toolbar' };\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n app: null,\r\n container: false,\r\n badge: false,\r\n title: false,\r\n responsive: false,\r\n maxWidth: null,\r\n bottom: true,\r\n items: [],\r\n }\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n if (! el && options.app && options.app.el) {\r\n el = document.createElement('div');\r\n options.app.el.appendChild(el);\r\n }\r\n\r\n // Arrow\r\n var toolbarArrow = document.createElement('div');\r\n toolbarArrow.classList.add('jtoolbar-item');\r\n toolbarArrow.classList.add('jtoolbar-arrow');\r\n\r\n var toolbarFloating = document.createElement('div');\r\n toolbarFloating.classList.add('jtoolbar-floating');\r\n toolbarArrow.appendChild(toolbarFloating);\r\n\r\n obj.selectItem = function(element) {\r\n var elements = toolbarContent.children;\r\n for (var i = 0; i < elements.length; i++) {\r\n if (element != elements[i]) {\r\n elements[i].classList.remove('jtoolbar-selected');\r\n }\r\n }\r\n element.classList.add('jtoolbar-selected');\r\n }\r\n\r\n obj.hide = function() {\r\n animation.slideBottom(el, 0, function() {\r\n el.style.display = 'none';\r\n });\r\n }\r\n\r\n obj.show = function() {\r\n el.style.display = '';\r\n animation.slideBottom(el, 1);\r\n }\r\n\r\n obj.get = function() {\r\n return el;\r\n }\r\n\r\n obj.setBadge = function(index, value) {\r\n toolbarContent.children[index].children[1].firstChild.innerHTML = value;\r\n }\r\n\r\n obj.destroy = function() {\r\n toolbar.remove();\r\n el.innerHTML = '';\r\n }\r\n\r\n obj.update = function(a, b) {\r\n for (var i = 0; i < toolbarContent.children.length; i++) {\r\n // Toolbar element\r\n var toolbarItem = toolbarContent.children[i];\r\n // State management\r\n if (typeof(toolbarItem.updateState) == 'function') {\r\n toolbarItem.updateState(el, obj, toolbarItem, a, b);\r\n }\r\n }\r\n for (var i = 0; i < toolbarFloating.children.length; i++) {\r\n // Toolbar element\r\n var toolbarItem = toolbarFloating.children[i];\r\n // State management\r\n if (typeof(toolbarItem.updateState) == 'function') {\r\n toolbarItem.updateState(el, obj, toolbarItem, a, b);\r\n }\r\n }\r\n }\r\n\r\n obj.create = function(items) {\r\n // Reset anything in the toolbar\r\n toolbarContent.innerHTML = '';\r\n // Create elements in the toolbar\r\n for (var i = 0; i < items.length; i++) {\r\n var toolbarItem = document.createElement('div');\r\n toolbarItem.classList.add('jtoolbar-item');\r\n\r\n if (items[i].width) {\r\n toolbarItem.style.width = parseInt(items[i].width) + 'px'; \r\n }\r\n\r\n if (items[i].k) {\r\n toolbarItem.k = items[i].k;\r\n }\r\n\r\n if (items[i].tooltip) {\r\n toolbarItem.setAttribute('title', items[i].tooltip);\r\n }\r\n\r\n // Id\r\n if (items[i].id) {\r\n toolbarItem.setAttribute('id', items[i].id);\r\n }\r\n\r\n // Selected\r\n if (items[i].updateState) {\r\n toolbarItem.updateState = items[i].updateState;\r\n }\r\n\r\n if (items[i].active) {\r\n toolbarItem.classList.add('jtoolbar-active');\r\n }\r\n\r\n if (items[i].disabled) {\r\n toolbarItem.classList.add('jtoolbar-disabled');\r\n }\r\n\r\n if (items[i].type == 'select' || items[i].type == 'dropdown') {\r\n Picker(toolbarItem, items[i]);\r\n } else if (items[i].type == 'divisor') {\r\n toolbarItem.classList.add('jtoolbar-divisor');\r\n } else if (items[i].type == 'label') {\r\n toolbarItem.classList.add('jtoolbar-label');\r\n toolbarItem.innerHTML = items[i].content;\r\n } else {\r\n // Material icons\r\n var toolbarIcon = document.createElement('i');\r\n if (typeof(items[i].class) === 'undefined') {\r\n toolbarIcon.classList.add('material-icons');\r\n } else {\r\n var c = items[i].class.split(' ');\r\n for (var j = 0; j < c.length; j++) {\r\n toolbarIcon.classList.add(c[j]);\r\n }\r\n }\r\n toolbarIcon.innerHTML = items[i].content ? items[i].content : '';\r\n toolbarItem.appendChild(toolbarIcon);\r\n\r\n // Badge options\r\n if (obj.options.badge == true) {\r\n var toolbarBadge = document.createElement('div');\r\n toolbarBadge.classList.add('jbadge');\r\n var toolbarBadgeContent = document.createElement('div');\r\n toolbarBadgeContent.innerHTML = items[i].badge ? items[i].badge : '';\r\n toolbarBadge.appendChild(toolbarBadgeContent);\r\n toolbarItem.appendChild(toolbarBadge);\r\n }\r\n\r\n // Title\r\n if (items[i].title) {\r\n if (obj.options.title == true) {\r\n var toolbarTitle = document.createElement('span');\r\n toolbarTitle.innerHTML = items[i].title;\r\n toolbarItem.appendChild(toolbarTitle);\r\n } else {\r\n toolbarItem.setAttribute('title', items[i].title);\r\n }\r\n }\r\n\r\n if (obj.options.app && items[i].route) {\r\n // Route\r\n toolbarItem.route = items[i].route;\r\n // Onclick for route\r\n toolbarItem.onclick = function() {\r\n obj.options.app.pages(this.route);\r\n }\r\n // Create pages\r\n obj.options.app.pages(items[i].route, {\r\n toolbarItem: toolbarItem,\r\n closed: true\r\n });\r\n }\r\n\r\n // Render\r\n if (typeof(items[i].render) === 'function') {\r\n items[i].render(toolbarItem, items[i]);\r\n }\r\n }\r\n\r\n if (items[i].onclick) {\r\n toolbarItem.onclick = items[i].onclick.bind(items[i], el, obj, toolbarItem);\r\n }\r\n\r\n toolbarContent.appendChild(toolbarItem);\r\n }\r\n\r\n // Fits to the page\r\n setTimeout(function() {\r\n obj.refresh();\r\n }, 0);\r\n }\r\n\r\n obj.open = function() {\r\n toolbarArrow.classList.add('jtoolbar-arrow-selected');\r\n\r\n var rectElement = el.getBoundingClientRect();\r\n var rect = toolbarFloating.getBoundingClientRect();\r\n if (rect.bottom > window.innerHeight || obj.options.bottom) {\r\n toolbarFloating.style.bottom = '0';\r\n } else {\r\n toolbarFloating.style.removeProperty('bottom');\r\n }\r\n\r\n toolbarFloating.style.right = '0';\r\n\r\n toolbarArrow.children[0].focus();\r\n // Start tracking\r\n tracking(obj, true);\r\n }\r\n\r\n obj.close = function() {\r\n toolbarArrow.classList.remove('jtoolbar-arrow-selected')\r\n // End tracking\r\n tracking(obj, false);\r\n }\r\n\r\n obj.refresh = function() {\r\n if (obj.options.responsive == true) {\r\n // Width of the c\r\n var rect = el.parentNode.getBoundingClientRect();\r\n if (! obj.options.maxWidth) {\r\n obj.options.maxWidth = rect.width;\r\n }\r\n // Available parent space\r\n var available = parseInt(obj.options.maxWidth);\r\n // Remove arrow\r\n if (toolbarArrow.parentNode) {\r\n toolbarArrow.parentNode.removeChild(toolbarArrow);\r\n }\r\n // Move all items to the toolbar\r\n while (toolbarFloating.firstChild) {\r\n toolbarContent.appendChild(toolbarFloating.firstChild);\r\n }\r\n // Toolbar is larger than the parent, move elements to the floating element\r\n if (available < toolbarContent.offsetWidth) {\r\n // Give space to the floating element\r\n available -= 50;\r\n // Move to the floating option\r\n while (toolbarContent.lastChild && available < toolbarContent.offsetWidth) {\r\n toolbarFloating.insertBefore(toolbarContent.lastChild, toolbarFloating.firstChild);\r\n }\r\n }\r\n // Show arrow\r\n if (toolbarFloating.children.length > 0) {\r\n toolbarContent.appendChild(toolbarArrow);\r\n }\r\n }\r\n }\r\n\r\n obj.setReadonly = function(state) {\r\n state = state ? 'add' : 'remove';\r\n el.classList[state]('jtoolbar-disabled');\r\n }\r\n\r\n el.onclick = function(e) {\r\n var element = helpers.findElement(e.target, 'jtoolbar-item');\r\n if (element) {\r\n obj.selectItem(element);\r\n }\r\n\r\n if (e.target.classList.contains('jtoolbar-arrow')) {\r\n obj.open();\r\n }\r\n }\r\n\r\n window.addEventListener('resize', function() {\r\n obj.refresh();\r\n });\r\n\r\n // Toolbar\r\n el.classList.add('jtoolbar');\r\n // Reset content\r\n el.innerHTML = '';\r\n // Container\r\n if (obj.options.container == true) {\r\n el.classList.add('jtoolbar-container');\r\n }\r\n // Content\r\n var toolbarContent = document.createElement('div');\r\n el.appendChild(toolbarContent);\r\n // Special toolbar for mobile applications\r\n if (obj.options.app) {\r\n el.classList.add('jtoolbar-mobile');\r\n }\r\n // Create toolbar\r\n obj.create(obj.options.items);\r\n // Shortcut\r\n el.toolbar = obj;\r\n\r\n return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/editor.js\n\r\n\r\n\r\n\r\n\r\nfunction Editor() {\r\n var Component = (function(el, options) {\r\n // New instance\r\n var obj = { type:'editor' };\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n // Load data from a remove location\r\n url: null,\r\n // Initial HTML content\r\n value: '',\r\n // Initial snippet\r\n snippet: null,\r\n // Add toolbar\r\n toolbar: true,\r\n toolbarOnTop: false,\r\n // Website parser is to read websites and images from cross domain\r\n remoteParser: null,\r\n // Placeholder\r\n placeholder: null,\r\n // Parse URL\r\n filterPaste: true,\r\n // Accept drop files\r\n dropZone: true,\r\n dropAsSnippet: false,\r\n acceptImages: true,\r\n acceptFiles: false,\r\n maxFileSize: 5000000,\r\n allowImageResize: true,\r\n // Style\r\n maxHeight: null,\r\n height: null,\r\n focus: false,\r\n // Events\r\n onclick: null,\r\n onfocus: null,\r\n onblur: null,\r\n onload: null,\r\n onkeyup: null,\r\n onkeydown: null,\r\n onchange: null,\r\n extensions: null,\r\n type: null,\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Private controllers\r\n var editorTimer = null;\r\n var editorAction = null;\r\n var files = [];\r\n\r\n // Keep the reference for the container\r\n obj.el = el;\r\n\r\n if (typeof(obj.options.onclick) == 'function') {\r\n el.onclick = function(e) {\r\n obj.options.onclick(el, obj, e);\r\n }\r\n }\r\n\r\n // Prepare container\r\n el.classList.add('jeditor-container');\r\n\r\n // Snippet\r\n var snippet = document.createElement('div');\r\n snippet.className = 'jsnippet';\r\n snippet.setAttribute('contenteditable', false);\r\n\r\n // Toolbar\r\n var toolbar = document.createElement('div');\r\n toolbar.className = 'jeditor-toolbar';\r\n\r\n obj.editor = document.createElement('div');\r\n obj.editor.setAttribute('contenteditable', true);\r\n obj.editor.setAttribute('spellcheck', false);\r\n obj.editor.classList.add('jeditor');\r\n\r\n // Placeholder\r\n if (obj.options.placeholder) {\r\n obj.editor.setAttribute('data-placeholder', obj.options.placeholder);\r\n }\r\n\r\n // Max height\r\n if (obj.options.maxHeight || obj.options.height) {\r\n obj.editor.style.overflowY = 'auto';\r\n\r\n if (obj.options.maxHeight) {\r\n obj.editor.style.maxHeight = obj.options.maxHeight;\r\n }\r\n if (obj.options.height) {\r\n obj.editor.style.height = obj.options.height;\r\n }\r\n }\r\n\r\n // Set editor initial value\r\n if (obj.options.url) {\r\n ajax({\r\n url: obj.options.url,\r\n dataType: 'html',\r\n success: function(result) {\r\n obj.editor.innerHTML = result;\r\n\r\n Component.setCursor(obj.editor, obj.options.focus == 'initial' ? true : false);\r\n }\r\n })\r\n } else {\r\n if (obj.options.value) {\r\n obj.editor.innerHTML = obj.options.value;\r\n } else {\r\n // Create from existing elements\r\n for (var i = 0; i < el.children.length; i++) {\r\n obj.editor.appendChild(el.children[i]);\r\n }\r\n }\r\n }\r\n\r\n // Make sure element is empty\r\n el.innerHTML = '';\r\n\r\n /**\r\n * Onchange event controllers\r\n */\r\n var change = function(e) {\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, obj, e);\r\n }\r\n\r\n // Update value\r\n obj.options.value = obj.getData();\r\n\r\n // Lemonade JS\r\n if (el.value != obj.options.value) {\r\n el.value = obj.options.value;\r\n if (typeof(el.oninput) == 'function') {\r\n el.oninput({\r\n type: 'input',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Extract images from a HTML string\r\n */\r\n var extractImageFromHtml = function(html) {\r\n // Create temp element\r\n var div = document.createElement('div');\r\n div.innerHTML = html;\r\n\r\n // Extract images\r\n var img = div.querySelectorAll('img');\r\n\r\n if (img.length) {\r\n for (var i = 0; i < img.length; i++) {\r\n obj.addImage(img[i].src);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Insert node at caret\r\n */\r\n var insertNodeAtCaret = function(newNode) {\r\n var sel, range;\r\n\r\n if (window.getSelection) {\r\n sel = window.getSelection();\r\n if (sel.rangeCount) {\r\n range = sel.getRangeAt(0);\r\n var selectedText = range.toString();\r\n range.deleteContents();\r\n range.insertNode(newNode);\r\n // move the cursor after element\r\n range.setStartAfter(newNode);\r\n range.setEndAfter(newNode);\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n }\r\n }\r\n }\r\n\r\n var updateTotalImages = function() {\r\n var o = null;\r\n if (o = snippet.children[0]) {\r\n // Make sure is a grid\r\n if (! o.classList.contains('jslider-grid')) {\r\n o.classList.add('jslider-grid');\r\n }\r\n // Quantify of images\r\n var number = o.children.length;\r\n // Set the configuration of the grid\r\n o.setAttribute('data-number', number > 4 ? 4 : number);\r\n // Total of images inside the grid\r\n if (number > 4) {\r\n o.setAttribute('data-total', number - 4);\r\n } else {\r\n o.removeAttribute('data-total');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Append image to the snippet\r\n */\r\n var appendImage = function(image) {\r\n if (! snippet.innerHTML) {\r\n obj.appendSnippet({});\r\n }\r\n snippet.children[0].appendChild(image);\r\n updateTotalImages();\r\n }\r\n\r\n /**\r\n * Append snippet\r\n * @Param object data\r\n */\r\n obj.appendSnippet = function(data) {\r\n // Reset snippet\r\n snippet.innerHTML = '';\r\n\r\n // Attributes\r\n var a = [ 'image', 'title', 'description', 'host', 'url' ];\r\n\r\n for (var i = 0; i < a.length; i++) {\r\n var div = document.createElement('div');\r\n div.className = 'jsnippet-' + a[i];\r\n div.setAttribute('data-k', a[i]);\r\n snippet.appendChild(div);\r\n if (data[a[i]]) {\r\n if (a[i] == 'image') {\r\n if (! Array.isArray(data.image)) {\r\n data.image = [ data.image ];\r\n }\r\n for (var j = 0; j < data.image.length; j++) {\r\n var img = document.createElement('img');\r\n img.src = data.image[j];\r\n div.appendChild(img);\r\n }\r\n } else {\r\n div.innerHTML = data[a[i]];\r\n }\r\n }\r\n }\r\n\r\n obj.editor.appendChild(document.createElement('br'));\r\n obj.editor.appendChild(snippet);\r\n }\r\n\r\n /**\r\n * Set editor value\r\n */\r\n obj.setData = function(o) {\r\n if (typeof(o) == 'object') {\r\n obj.editor.innerHTML = o.content;\r\n } else {\r\n obj.editor.innerHTML = o;\r\n }\r\n\r\n if (obj.options.focus) {\r\n Component.setCursor(obj.editor, true);\r\n }\r\n\r\n // Reset files container\r\n files = [];\r\n }\r\n\r\n obj.getFiles = function() {\r\n var f = obj.editor.querySelectorAll('.jfile');\r\n var d = [];\r\n for (var i = 0; i < f.length; i++) {\r\n if (files[f[i].src]) {\r\n d.push(files[f[i].src]);\r\n }\r\n }\r\n return d;\r\n }\r\n\r\n obj.getText = function() {\r\n return obj.editor.innerText;\r\n }\r\n\r\n /**\r\n * Get editor data\r\n */\r\n obj.getData = function(json) {\r\n if (! json) {\r\n var data = obj.editor.innerHTML;\r\n } else {\r\n var data = {\r\n content : '',\r\n }\r\n\r\n // Get snippet\r\n if (snippet.innerHTML) {\r\n var index = 0;\r\n data.snippet = {};\r\n for (var i = 0; i < snippet.children.length; i++) {\r\n // Get key from element\r\n var key = snippet.children[i].getAttribute('data-k');\r\n if (key) {\r\n if (key == 'image') {\r\n if (! data.snippet.image) {\r\n data.snippet.image = [];\r\n }\r\n // Get all images\r\n for (var j = 0; j < snippet.children[i].children.length; j++) {\r\n data.snippet.image.push(snippet.children[i].children[j].getAttribute('src'))\r\n }\r\n } else {\r\n data.snippet[key] = snippet.children[i].innerHTML;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Get files\r\n var f = Object.keys(files);\r\n if (f.length) {\r\n data.files = [];\r\n for (var i = 0; i < f.length; i++) {\r\n data.files.push(files[f[i]]);\r\n }\r\n }\r\n\r\n // Get content\r\n var d = document.createElement('div');\r\n d.innerHTML = obj.editor.innerHTML;\r\n var s = d.querySelector('.jsnippet');\r\n if (s) {\r\n s.remove();\r\n }\r\n\r\n var text = d.innerHTML;\r\n text = text.replace(/
/g, \"\\n\");\r\n text = text.replace(/<\\/div>/g, \"<\\/div>\\n\");\r\n text = text.replace(/<(?:.|\\n)*?>/gm, \"\");\r\n data.content = text.trim();\r\n\r\n // Process extensions\r\n processExtensions('getData', data);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n // Reset\r\n obj.reset = function() {\r\n obj.editor.innerHTML = '';\r\n snippet.innerHTML = '';\r\n files = [];\r\n }\r\n\r\n obj.addPdf = function(data) {\r\n if (data.result.substr(0,4) != 'data') {\r\n console.error('Invalid source');\r\n } else {\r\n var canvas = document.createElement('canvas');\r\n canvas.width = 60;\r\n canvas.height = 60;\r\n\r\n var img = new Image();\r\n var ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n\r\n canvas.toBlob(function(blob) {\r\n var newImage = document.createElement('img');\r\n newImage.src = window.URL.createObjectURL(blob);\r\n newImage.title = data.name;\r\n newImage.className = 'jfile pdf';\r\n\r\n files[newImage.src] = {\r\n file: newImage.src,\r\n extension: 'pdf',\r\n content: data.result,\r\n }\r\n\r\n //insertNodeAtCaret(newImage);\r\n document.execCommand('insertHtml', false, newImage.outerHTML);\r\n });\r\n }\r\n }\r\n\r\n obj.addImage = function(src, asSnippet) {\r\n if (! obj.options.acceptImages) {\r\n return;\r\n }\r\n\r\n if (! src) {\r\n src = '';\r\n }\r\n\r\n if (src.substr(0,4) != 'data' && ! obj.options.remoteParser) {\r\n console.error('remoteParser not defined in your initialization');\r\n } else {\r\n // This is to process cross domain images\r\n if (src.substr(0,4) == 'data') {\r\n var extension = src.split(';')\r\n extension = extension[0].split('/');\r\n extension = extension[1];\r\n } else {\r\n var extension = src.substr(src.lastIndexOf('.') + 1);\r\n // Work for cross browsers\r\n src = obj.options.remoteParser + src;\r\n }\r\n\r\n var img = new Image();\r\n\r\n img.onload = function onload() {\r\n var canvas = document.createElement('canvas');\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n var ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n\r\n canvas.toBlob(function(blob) {\r\n var newImage = document.createElement('img');\r\n newImage.src = window.URL.createObjectURL(blob);\r\n newImage.classList.add('jfile');\r\n newImage.setAttribute('tabindex', '900');\r\n newImage.setAttribute('width', img.width);\r\n newImage.setAttribute('height', img.height);\r\n files[newImage.src] = {\r\n file: newImage.src,\r\n extension: extension,\r\n content: canvas.toDataURL(),\r\n }\r\n\r\n if (obj.options.dropAsSnippet || asSnippet) {\r\n appendImage(newImage);\r\n // Just to understand the attachment is part of a snippet\r\n files[newImage.src].snippet = true;\r\n } else {\r\n //insertNodeAtCaret(newImage);\r\n document.execCommand('insertHtml', false, newImage.outerHTML);\r\n }\r\n\r\n change();\r\n });\r\n };\r\n\r\n img.src = src;\r\n }\r\n }\r\n\r\n obj.addFile = function(files) {\r\n var reader = [];\r\n\r\n for (var i = 0; i < files.length; i++) {\r\n if (files[i].size > obj.options.maxFileSize) {\r\n alert('The file is too big');\r\n } else {\r\n // Only PDF or Images\r\n var type = files[i].type.split('/');\r\n\r\n if (type[0] == 'image') {\r\n type = 1;\r\n } else if (type[1] == 'pdf') {\r\n type = 2;\r\n } else {\r\n type = 0;\r\n }\r\n\r\n if (type) {\r\n // Create file\r\n reader[i] = new FileReader();\r\n reader[i].index = i;\r\n reader[i].type = type;\r\n reader[i].name = files[i].name;\r\n reader[i].date = files[i].lastModified;\r\n reader[i].size = files[i].size;\r\n reader[i].addEventListener(\"load\", function (data) {\r\n // Get result\r\n if (data.target.type == 2) {\r\n if (obj.options.acceptFiles == true) {\r\n obj.addPdf(data.target);\r\n }\r\n } else {\r\n obj.addImage(data.target.result);\r\n }\r\n }, false);\r\n\r\n reader[i].readAsDataURL(files[i])\r\n } else {\r\n alert('The extension is not allowed');\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Destroy\r\n obj.destroy = function() {\r\n obj.editor.removeEventListener('mouseup', editorMouseUp);\r\n obj.editor.removeEventListener('mousedown', editorMouseDown);\r\n obj.editor.removeEventListener('mousemove', editorMouseMove);\r\n obj.editor.removeEventListener('keyup', editorKeyUp);\r\n obj.editor.removeEventListener('keydown', editorKeyDown);\r\n obj.editor.removeEventListener('dragstart', editorDragStart);\r\n obj.editor.removeEventListener('dragenter', editorDragEnter);\r\n obj.editor.removeEventListener('dragover', editorDragOver);\r\n obj.editor.removeEventListener('drop', editorDrop);\r\n obj.editor.removeEventListener('paste', editorPaste);\r\n obj.editor.removeEventListener('blur', editorBlur);\r\n obj.editor.removeEventListener('focus', editorFocus);\r\n\r\n el.editor = null;\r\n el.classList.remove('jeditor-container');\r\n\r\n toolbar.remove();\r\n snippet.remove();\r\n obj.editor.remove();\r\n }\r\n\r\n obj.upload = function() {\r\n helpers.click(obj.file);\r\n }\r\n\r\n // Valid tags\r\n const validTags = [\r\n 'html','body','address','span', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'b', 'i', 'blockquote',\r\n 'strong', 'em', 'ul', 'ol', 'li', 'a', 'code', 'pre', 'hr', 'br', 'img',\r\n 'figure', 'picture', 'figcaption', 'iframe', 'table', 'thead', 'tbody', 'tfoot', 'tr',\r\n 'th', 'td', 'caption', 'u', 'del', 'ins', 'sub', 'sup', 'small', 'mark',\r\n 'input', 'textarea', 'select', 'option', 'button', 'label', 'fieldset',\r\n 'legend', 'audio', 'video', 'abbr', 'cite', 'kbd', 'section', 'article',\r\n 'nav', 'aside', 'header', 'footer', 'main', 'details', 'summary', 'svg', 'line', 'source'\r\n ];\r\n // Valid properties\r\n const validProperty = ['width', 'height', 'align', 'border', 'src', 'tabindex'];\r\n // Valid CSS attributes\r\n const validStyle = ['color', 'font-weight', 'font-size', 'background', 'background-color', 'margin'];\r\n\r\n const parse = function(element) {\r\n // Remove elements that are not white-listed\r\n if (element.tagName && validTags.indexOf(element.tagName.toLowerCase()) === -1) {\r\n if (element.innerText) {\r\n element.innerHTML = element.innerText;\r\n }\r\n }\r\n // Remove attributes\r\n if (element.attributes && element.attributes.length) {\r\n let style = null;\r\n // Process style attribute\r\n let elementStyle = element.getAttribute('style');\r\n if (elementStyle) {\r\n style = [];\r\n let t = elementStyle.split(';');\r\n for (let j = 0; j < t.length; j++) {\r\n let v = t[j].trim().split(':');\r\n if (validStyle.indexOf(v[0].trim()) >= 0) {\r\n let k = v.shift();\r\n v = v.join(':');\r\n style.push(k + ':' + v);\r\n }\r\n }\r\n }\r\n // Process image\r\n if (element.tagName.toUpperCase() === 'IMG') {\r\n if (! obj.options.acceptImages || !element.src) {\r\n element.parentNode.removeChild(element);\r\n } else {\r\n // Check if is data\r\n element.setAttribute('tabindex', '900');\r\n // Check attributes for persistence\r\n obj.addImage(element.src);\r\n }\r\n }\r\n // Remove attributes\r\n let attr = [];\r\n for (let i = 0; i < element.attributes.length; i++) {\r\n attr.push(element.attributes[i].name);\r\n }\r\n if (attr.length) {\r\n attr.forEach(function (v) {\r\n if (validProperty.indexOf(v) === -1) {\r\n element.removeAttribute(v);\r\n } else {\r\n // Protection XSS\r\n if (element.attributes && element.attributes[i] && element.attributes[i].value.indexOf('<') !== -1) {\r\n element.attributes[i].value.replace('<', '<');\r\n }\r\n }\r\n });\r\n }\r\n element.style = '';\r\n // Add valid style\r\n if (style && style.length) {\r\n element.setAttribute('style', style.join(';'));\r\n }\r\n }\r\n // Parse children\r\n if (element.children.length) {\r\n for (let i = element.children.length; i > 0; i--) {\r\n parse(element.children[i - 1]);\r\n }\r\n }\r\n }\r\n\r\n var select = function(e) {\r\n var s = window.getSelection()\r\n var r = document.createRange();\r\n r.selectNode(e);\r\n s.addRange(r)\r\n }\r\n\r\n var filter = function(data) {\r\n if (data) {\r\n data = data.replace(new RegExp('', 'gsi'), '');\r\n }\r\n var parser = new DOMParser();\r\n var d = parser.parseFromString(data, \"text/html\");\r\n parse(d);\r\n var div = document.createElement('div');\r\n div.innerHTML = d.firstChild.innerHTML;\r\n return div;\r\n }\r\n\r\n var editorPaste = function(e) {\r\n if (obj.options.filterPaste == true) {\r\n if (e.clipboardData || e.originalEvent.clipboardData) {\r\n var html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n var text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n var file = (e.originalEvent || e).clipboardData.files\r\n } else if (window.clipboardData) {\r\n var html = window.clipboardData.getData('Html');\r\n var text = window.clipboardData.getData('Text');\r\n var file = window.clipboardData.files\r\n }\r\n\r\n if (file.length) {\r\n // Paste a image from the clipboard\r\n obj.addFile(file);\r\n } else {\r\n if (! html) {\r\n html = text.split('\\r\\n');\r\n if (! e.target.innerText) {\r\n html.map(function(v) {\r\n var d = document.createElement('div');\r\n d.innerText = v;\r\n obj.editor.appendChild(d);\r\n });\r\n } else {\r\n html = html.map(function(v) {\r\n return '
' + v + '
';\r\n });\r\n document.execCommand('insertText', false, html.join(''));\r\n }\r\n } else {\r\n var d = filter(html);\r\n // Paste to the editor\r\n //insertNodeAtCaret(d);\r\n document.execCommand('insertHtml', false, d.innerHTML);\r\n }\r\n }\r\n\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n var editorDragStart = function(e) {\r\n if (editorAction && editorAction.e) {\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n var editorDragEnter = function(e) {\r\n if (editorAction || obj.options.dropZone == false) {\r\n // Do nothing\r\n } else {\r\n el.classList.add('jeditor-dragging');\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n var editorDragOver = function(e) {\r\n if (editorAction || obj.options.dropZone == false) {\r\n // Do nothing\r\n } else {\r\n if (editorTimer) {\r\n clearTimeout(editorTimer);\r\n }\r\n\r\n editorTimer = setTimeout(function() {\r\n el.classList.remove('jeditor-dragging');\r\n }, 100);\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n var editorDrop = function(e) {\r\n if (editorAction || obj.options.dropZone == false) {\r\n // Do nothing\r\n } else {\r\n // Position caret on the drop\r\n var range = null;\r\n if (document.caretRangeFromPoint) {\r\n range=document.caretRangeFromPoint(e.clientX, e.clientY);\r\n } else if (e.rangeParent) {\r\n range=document.createRange();\r\n range.setStart(e.rangeParent,e.rangeOffset);\r\n }\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n sel.anchorNode.parentNode.focus();\r\n\r\n var html = (e.originalEvent || e).dataTransfer.getData('text/html');\r\n var text = (e.originalEvent || e).dataTransfer.getData('text/plain');\r\n var file = (e.originalEvent || e).dataTransfer.files;\r\n\r\n if (file.length) {\r\n obj.addFile(file);\r\n } else if (text) {\r\n extractImageFromHtml(html);\r\n }\r\n\r\n el.classList.remove('jeditor-dragging');\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n var editorBlur = function(e) {\r\n // Process extensions\r\n processExtensions('onevent', e);\r\n // Apply changes\r\n change(e);\r\n // Blur\r\n if (typeof(obj.options.onblur) == 'function') {\r\n obj.options.onblur(el, obj, e);\r\n }\r\n }\r\n\r\n var editorFocus = function(e) {\r\n // Focus\r\n if (typeof(obj.options.onfocus) == 'function') {\r\n obj.options.onfocus(el, obj, e);\r\n }\r\n }\r\n\r\n var editorKeyUp = function(e) {\r\n if (! obj.editor.innerHTML) {\r\n obj.editor.innerHTML = '

';\r\n }\r\n if (typeof(obj.options.onkeyup) == 'function') {\r\n obj.options.onkeyup(el, obj, e);\r\n }\r\n }\r\n\r\n var editorKeyDown = function(e) {\r\n // Process extensions\r\n processExtensions('onevent', e);\r\n\r\n if (e.key == 'Delete') {\r\n if (e.target.tagName == 'IMG') {\r\n var parent = e.target.parentNode;\r\n select(e.target);\r\n if (parent.classList.contains('jsnippet-image')) {\r\n updateTotalImages();\r\n }\r\n }\r\n }\r\n\r\n if (typeof(obj.options.onkeydown) == 'function') {\r\n obj.options.onkeydown(el, obj, e);\r\n }\r\n }\r\n\r\n var editorMouseUp = function(e) {\r\n if (editorAction && editorAction.e) {\r\n editorAction.e.classList.remove('resizing');\r\n\r\n if (editorAction.e.changed == true) {\r\n var image = editorAction.e.cloneNode()\r\n image.width = parseInt(editorAction.e.style.width) || editorAction.e.getAttribute('width');\r\n image.height = parseInt(editorAction.e.style.height) || editorAction.e.getAttribute('height');\r\n editorAction.e.style.width = '';\r\n editorAction.e.style.height = '';\r\n select(editorAction.e);\r\n document.execCommand('insertHtml', false, image.outerHTML);\r\n }\r\n }\r\n\r\n editorAction = false;\r\n }\r\n\r\n var editorMouseDown = function(e) {\r\n var close = function(snippet) {\r\n var rect = snippet.getBoundingClientRect();\r\n if (rect.width - (e.clientX - rect.left) < 40 && e.clientY - rect.top < 40) {\r\n snippet.innerHTML = '';\r\n snippet.remove();\r\n }\r\n }\r\n\r\n if (e.target.tagName == 'IMG') {\r\n if (e.target.style.cursor) {\r\n var rect = e.target.getBoundingClientRect();\r\n editorAction = {\r\n e: e.target,\r\n x: e.clientX,\r\n y: e.clientY,\r\n w: rect.width,\r\n h: rect.height,\r\n d: e.target.style.cursor,\r\n }\r\n\r\n if (! e.target.getAttribute('width')) {\r\n e.target.setAttribute('width', rect.width)\r\n }\r\n\r\n if (! e.target.getAttribute('height')) {\r\n e.target.setAttribute('height', rect.height)\r\n }\r\n\r\n var s = window.getSelection();\r\n if (s.rangeCount) {\r\n for (var i = 0; i < s.rangeCount; i++) {\r\n s.removeRange(s.getRangeAt(i));\r\n }\r\n }\r\n\r\n e.target.classList.add('resizing');\r\n } else {\r\n editorAction = true;\r\n }\r\n } else {\r\n if (e.target.classList.contains('jsnippet')) {\r\n close(e.target);\r\n } else if (e.target.parentNode.classList.contains('jsnippet')) {\r\n close(e.target.parentNode);\r\n }\r\n\r\n editorAction = true;\r\n }\r\n }\r\n\r\n var editorMouseMove = function(e) {\r\n if (e.target.tagName == 'IMG' && ! e.target.parentNode.classList.contains('jsnippet-image') && obj.options.allowImageResize == true) {\r\n if (e.target.getAttribute('tabindex')) {\r\n var rect = e.target.getBoundingClientRect();\r\n if (e.clientY - rect.top < 5) {\r\n if (rect.width - (e.clientX - rect.left) < 5) {\r\n e.target.style.cursor = 'ne-resize';\r\n } else if (e.clientX - rect.left < 5) {\r\n e.target.style.cursor = 'nw-resize';\r\n } else {\r\n e.target.style.cursor = 'n-resize';\r\n }\r\n } else if (rect.height - (e.clientY - rect.top) < 5) {\r\n if (rect.width - (e.clientX - rect.left) < 5) {\r\n e.target.style.cursor = 'se-resize';\r\n } else if (e.clientX - rect.left < 5) {\r\n e.target.style.cursor = 'sw-resize';\r\n } else {\r\n e.target.style.cursor = 's-resize';\r\n }\r\n } else if (rect.width - (e.clientX - rect.left) < 5) {\r\n e.target.style.cursor = 'e-resize';\r\n } else if (e.clientX - rect.left < 5) {\r\n e.target.style.cursor = 'w-resize';\r\n } else {\r\n e.target.style.cursor = '';\r\n }\r\n }\r\n }\r\n\r\n // Move\r\n if (e.which == 1 && editorAction && editorAction.d) {\r\n if (editorAction.d == 'e-resize' || editorAction.d == 'ne-resize' || editorAction.d == 'se-resize') {\r\n editorAction.e.style.width = (editorAction.w + (e.clientX - editorAction.x));\r\n\r\n if (e.shiftKey) {\r\n var newHeight = (e.clientX - editorAction.x) * (editorAction.h / editorAction.w);\r\n editorAction.e.style.height = editorAction.h + newHeight;\r\n } else {\r\n var newHeight = null;\r\n }\r\n }\r\n\r\n if (! newHeight) {\r\n if (editorAction.d == 's-resize' || editorAction.d == 'se-resize' || editorAction.d == 'sw-resize') {\r\n if (! e.shiftKey) {\r\n editorAction.e.style.height = editorAction.h + (e.clientY - editorAction.y);\r\n }\r\n }\r\n }\r\n\r\n editorAction.e.changed = true;\r\n }\r\n }\r\n\r\n var processExtensions = function(method, data) {\r\n if (obj.options.extensions) {\r\n var ext = Object.keys(obj.options.extensions);\r\n if (ext.length) {\r\n for (var i = 0; i < ext.length; i++)\r\n if (obj.options.extensions[ext[i]] && typeof(obj.options.extensions[ext[i]][method]) == 'function') {\r\n obj.options.extensions[ext[i]][method].call(obj, data);\r\n }\r\n }\r\n }\r\n }\r\n\r\n var loadExtensions = function() {\r\n if (obj.options.extensions) {\r\n var ext = Object.keys(obj.options.extensions);\r\n if (ext.length) {\r\n for (var i = 0; i < ext.length; i++) {\r\n if (obj.options.extensions[ext[i]] && typeof (obj.options.extensions[ext[i]]) == 'function') {\r\n obj.options.extensions[ext[i]] = obj.options.extensions[ext[i]](el, obj);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n document.addEventListener('mouseup', editorMouseUp);\r\n document.addEventListener('mousemove', editorMouseMove);\r\n obj.editor.addEventListener('mousedown', editorMouseDown);\r\n obj.editor.addEventListener('keyup', editorKeyUp);\r\n obj.editor.addEventListener('keydown', editorKeyDown);\r\n obj.editor.addEventListener('dragstart', editorDragStart);\r\n obj.editor.addEventListener('dragenter', editorDragEnter);\r\n obj.editor.addEventListener('dragover', editorDragOver);\r\n obj.editor.addEventListener('drop', editorDrop);\r\n obj.editor.addEventListener('paste', editorPaste);\r\n obj.editor.addEventListener('focus', editorFocus);\r\n obj.editor.addEventListener('blur', editorBlur);\r\n\r\n // Append editor to the container\r\n el.appendChild(obj.editor);\r\n // Snippet\r\n if (obj.options.snippet) {\r\n obj.appendSnippet(obj.options.snippet);\r\n }\r\n\r\n // Add toolbar\r\n if (obj.options.toolbar) {\r\n // Default toolbar configuration\r\n if (Array.isArray(obj.options.toolbar)) {\r\n var toolbarOptions = {\r\n container: true,\r\n responsive: true,\r\n items: obj.options.toolbar\r\n }\r\n } else if (obj.options.toolbar === true) {\r\n var toolbarOptions = {\r\n container: true,\r\n responsive: true,\r\n items: [],\r\n }\r\n } else {\r\n var toolbarOptions = obj.options.toolbar;\r\n }\r\n\r\n // Default items\r\n if (! (toolbarOptions.items && toolbarOptions.items.length)) {\r\n toolbarOptions.items = Component.getDefaultToolbar(obj);\r\n }\r\n\r\n if (obj.options.toolbarOnTop) {\r\n // Add class\r\n el.classList.add('toolbar-on-top');\r\n // Append to the DOM\r\n el.insertBefore(toolbar, el.firstChild);\r\n } else {\r\n // Add padding to the editor\r\n obj.editor.style.padding = '15px';\r\n // Append to the DOM\r\n el.appendChild(toolbar);\r\n }\r\n\r\n // Create toolbar\r\n Toolbar(toolbar, toolbarOptions);\r\n\r\n toolbar.addEventListener('click', function() {\r\n obj.editor.focus();\r\n })\r\n }\r\n\r\n // Upload file\r\n obj.file = document.createElement('input');\r\n obj.file.style.display = 'none';\r\n obj.file.type = 'file';\r\n obj.file.setAttribute('accept', 'image/*');\r\n obj.file.onchange = function() {\r\n obj.addFile(this.files);\r\n }\r\n el.appendChild(obj.file);\r\n\r\n // Focus to the editor\r\n if (obj.options.focus) {\r\n Component.setCursor(obj.editor, obj.options.focus == 'initial' ? true : false);\r\n }\r\n\r\n // Change method\r\n el.change = obj.setData;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n // Data type\r\n var o = el.getAttribute('data-html') === 'true' ? false : true;\r\n return obj.getData(o);\r\n } else {\r\n obj.setData(val);\r\n }\r\n }\r\n\r\n loadExtensions();\r\n\r\n el.editor = obj;\r\n\r\n // Onload\r\n if (typeof(obj.options.onload) == 'function') {\r\n obj.options.onload(el, obj, obj.editor);\r\n }\r\n\r\n return obj;\r\n });\r\n\r\n Component.setCursor = function(element, first) {\r\n element.focus();\r\n document.execCommand('selectAll');\r\n var sel = window.getSelection();\r\n var range = sel.getRangeAt(0);\r\n if (first == true) {\r\n var node = range.startContainer;\r\n var size = 0;\r\n } else {\r\n var node = range.endContainer;\r\n var size = node.length;\r\n }\r\n range.setStart(node, size);\r\n range.setEnd(node, size);\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n }\r\n\r\n Component.getDefaultToolbar = function(obj) {\r\n\r\n var color = function(a,b,c) {\r\n if (! c.color) {\r\n var t = null;\r\n var colorPicker = Color(c, {\r\n onchange: function(o, v) {\r\n if (c.k === 'color') {\r\n document.execCommand('foreColor', false, v);\r\n } else {\r\n document.execCommand('backColor', false, v);\r\n }\r\n }\r\n });\r\n c.color.open();\r\n }\r\n }\r\n\r\n var items = [];\r\n\r\n items.push({\r\n content: 'undo',\r\n onclick: function() {\r\n document.execCommand('undo');\r\n }\r\n });\r\n\r\n items.push({\r\n content: 'redo',\r\n onclick: function() {\r\n document.execCommand('redo');\r\n }\r\n });\r\n\r\n items.push({\r\n type: 'divisor'\r\n });\r\n\r\n if (obj.options.toolbarOnTop) {\r\n items.push({\r\n type: 'select',\r\n width: '140px',\r\n options: ['Default', 'Verdana', 'Arial', 'Courier New'],\r\n render: function (e) {\r\n return '' + e + '';\r\n },\r\n onchange: function (a,b,c,d,e) {\r\n document.execCommand(\"fontName\", false, d);\r\n }\r\n });\r\n\r\n items.push({\r\n type: 'select',\r\n content: 'format_size',\r\n options: ['x-small', 'small', 'medium', 'large', 'x-large'],\r\n render: function (e) {\r\n return '' + e + '';\r\n },\r\n onchange: function (a,b,c,d,e) {\r\n //var html = `${text}`;\r\n //document.execCommand('insertHtml', false, html);\r\n document.execCommand(\"fontSize\", false, parseInt(e)+1);\r\n //var f = window.getSelection().anchorNode.parentNode\r\n //f.removeAttribute(\"size\");\r\n //f.style.fontSize = d;\r\n }\r\n });\r\n\r\n items.push({\r\n type: 'select',\r\n options: ['format_align_left', 'format_align_center', 'format_align_right', 'format_align_justify'],\r\n render: function (e) {\r\n return '' + e + '';\r\n },\r\n onchange: function (a,b,c,d,e) {\r\n var options = ['JustifyLeft','justifyCenter','justifyRight','justifyFull'];\r\n document.execCommand(options[e]);\r\n }\r\n });\r\n\r\n items.push({\r\n type: 'divisor'\r\n });\r\n\r\n items.push({\r\n content: 'format_color_text',\r\n k: 'color',\r\n onclick: color,\r\n });\r\n\r\n items.push({\r\n content: 'format_color_fill',\r\n k: 'background-color',\r\n onclick: color,\r\n });\r\n }\r\n\r\n items.push({\r\n content: 'format_bold',\r\n onclick: function(a,b,c) {\r\n document.execCommand('bold');\r\n\r\n if (document.queryCommandState(\"bold\")) {\r\n c.classList.add('selected');\r\n } else {\r\n c.classList.remove('selected');\r\n }\r\n }\r\n });\r\n\r\n items.push({\r\n content: 'format_italic',\r\n onclick: function(a,b,c) {\r\n document.execCommand('italic');\r\n\r\n if (document.queryCommandState(\"italic\")) {\r\n c.classList.add('selected');\r\n } else {\r\n c.classList.remove('selected');\r\n }\r\n }\r\n });\r\n\r\n items.push({\r\n content: 'format_underline',\r\n onclick: function(a,b,c) {\r\n document.execCommand('underline');\r\n\r\n if (document.queryCommandState(\"underline\")) {\r\n c.classList.add('selected');\r\n } else {\r\n c.classList.remove('selected');\r\n }\r\n }\r\n });\r\n\r\n items.push({\r\n type:'divisor'\r\n });\r\n\r\n items.push({\r\n content: 'format_list_bulleted',\r\n onclick: function(a,b,c) {\r\n document.execCommand('insertUnorderedList');\r\n\r\n if (document.queryCommandState(\"insertUnorderedList\")) {\r\n c.classList.add('selected');\r\n } else {\r\n c.classList.remove('selected');\r\n }\r\n }\r\n });\r\n\r\n items.push({\r\n content: 'format_list_numbered',\r\n onclick: function(a,b,c) {\r\n document.execCommand('insertOrderedList');\r\n\r\n if (document.queryCommandState(\"insertOrderedList\")) {\r\n c.classList.add('selected');\r\n } else {\r\n c.classList.remove('selected');\r\n }\r\n }\r\n });\r\n\r\n items.push({\r\n content: 'format_indent_increase',\r\n onclick: function(a,b,c) {\r\n document.execCommand('indent', true, null);\r\n\r\n if (document.queryCommandState(\"indent\")) {\r\n c.classList.add('selected');\r\n } else {\r\n c.classList.remove('selected');\r\n }\r\n }\r\n });\r\n\r\n items.push({\r\n content: 'format_indent_decrease',\r\n onclick: function() {\r\n document.execCommand('outdent');\r\n\r\n if (document.queryCommandState(\"outdent\")) {\r\n this.classList.add('selected');\r\n } else {\r\n this.classList.remove('selected');\r\n }\r\n }\r\n });\r\n\r\n if (obj.options.toolbarOnTop) {\r\n items.push({\r\n type: 'divisor'\r\n });\r\n\r\n items.push({\r\n content: 'photo',\r\n onclick: function () {\r\n obj.upload();\r\n }\r\n });\r\n\r\n items.push({\r\n type: 'select',\r\n content: 'table_view',\r\n columns: 8,\r\n grid: 8,\r\n right: true,\r\n options: [\r\n '0x0', '1x0', '2x0', '3x0', '4x0', '5x0', '6x0', '7x0',\r\n '0x1', '1x1', '2x1', '3x1', '4x1', '5x1', '6x1', '7x1',\r\n '0x2', '1x2', '2x2', '3x2', '4x2', '5x2', '6x2', '7x2',\r\n '0x3', '1x3', '2x3', '3x3', '4x3', '5x3', '6x3', '7x3',\r\n '0x4', '1x4', '2x4', '3x4', '4x4', '5x4', '6x4', '7x4',\r\n '0x5', '1x5', '2x5', '3x5', '4x5', '5x5', '6x5', '7x5',\r\n '0x6', '1x6', '2x6', '3x6', '4x6', '5x6', '6x6', '7x6',\r\n '0x7', '1x7', '2x7', '3x7', '4x7', '5x7', '6x7', '7x7',\r\n ],\r\n render: function (e, item) {\r\n if (item) {\r\n item.onmouseover = this.onmouseover;\r\n e = e.split('x');\r\n item.setAttribute('data-x', e[0]);\r\n item.setAttribute('data-y', e[1]);\r\n }\r\n var element = document.createElement('div');\r\n item.style.margin = '1px';\r\n item.style.border = '1px solid #ddd';\r\n return element;\r\n },\r\n onmouseover: function (e) {\r\n var x = parseInt(e.target.getAttribute('data-x'));\r\n var y = parseInt(e.target.getAttribute('data-y'));\r\n for (var i = 0; i < e.target.parentNode.children.length; i++) {\r\n var element = e.target.parentNode.children[i];\r\n var ex = parseInt(element.getAttribute('data-x'));\r\n var ey = parseInt(element.getAttribute('data-y'));\r\n if (ex <= x && ey <= y) {\r\n element.style.backgroundColor = '#cae1fc';\r\n element.style.borderColor = '#2977ff';\r\n } else {\r\n element.style.backgroundColor = '';\r\n element.style.borderColor = '#ddd';\r\n }\r\n }\r\n },\r\n onchange: function (a, b, c) {\r\n c = c.split('x');\r\n var table = document.createElement('table');\r\n var tbody = document.createElement('tbody');\r\n for (var y = 0; y <= c[1]; y++) {\r\n var tr = document.createElement('tr');\r\n for (var x = 0; x <= c[0]; x++) {\r\n var td = document.createElement('td');\r\n td.innerHTML = '';\r\n tr.appendChild(td);\r\n }\r\n tbody.appendChild(tr);\r\n }\r\n table.appendChild(tbody);\r\n table.setAttribute('width', '100%');\r\n table.setAttribute('cellpadding', '6');\r\n table.setAttribute('cellspacing', '0');\r\n document.execCommand('insertHTML', false, table.outerHTML);\r\n }\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n\r\n return Component;\r\n}\r\n\r\n/* harmony default export */ var editor = (Editor());\r\n\n;// CONCATENATED MODULE: ./src/plugins/floating.js\nfunction Floating() {\r\n var Component = (function (el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n type: 'big',\r\n title: 'Untitled',\r\n width: 510,\r\n height: 472,\r\n }\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Private methods\r\n\r\n var setContent = function () {\r\n var temp = document.createElement('div');\r\n while (el.children[0]) {\r\n temp.appendChild(el.children[0]);\r\n }\r\n\r\n obj.content = document.createElement('div');\r\n obj.content.className = 'jfloating_content';\r\n obj.content.innerHTML = el.innerHTML;\r\n\r\n while (temp.children[0]) {\r\n obj.content.appendChild(temp.children[0]);\r\n }\r\n\r\n obj.container = document.createElement('div');\r\n obj.container.className = 'jfloating';\r\n obj.container.appendChild(obj.content);\r\n\r\n if (obj.options.title) {\r\n obj.container.setAttribute('title', obj.options.title);\r\n } else {\r\n obj.container.classList.add('no-title');\r\n }\r\n\r\n // validate element dimensions\r\n if (obj.options.width) {\r\n obj.container.style.width = parseInt(obj.options.width) + 'px';\r\n }\r\n\r\n if (obj.options.height) {\r\n obj.container.style.height = parseInt(obj.options.height) + 'px';\r\n }\r\n\r\n el.innerHTML = '';\r\n el.appendChild(obj.container);\r\n }\r\n\r\n var setEvents = function () {\r\n if (obj.container) {\r\n obj.container.addEventListener('click', function (e) {\r\n var rect = e.target.getBoundingClientRect();\r\n\r\n if (e.target.classList.contains('jfloating')) {\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n var x = e.changedTouches[0].clientX;\r\n var y = e.changedTouches[0].clientY;\r\n } else {\r\n var x = e.clientX;\r\n var y = e.clientY;\r\n }\r\n\r\n if (rect.width - (x - rect.left) < 50 && (y - rect.top) < 50) {\r\n setTimeout(function () {\r\n obj.close();\r\n }, 100);\r\n } else {\r\n obj.setState();\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n var setType = function () {\r\n obj.container.classList.add('jfloating-' + obj.options.type);\r\n }\r\n\r\n obj.state = {\r\n isMinized: false,\r\n }\r\n\r\n obj.setState = function () {\r\n if (obj.state.isMinized) {\r\n obj.container.classList.remove('jfloating-minimized');\r\n } else {\r\n obj.container.classList.add('jfloating-minimized');\r\n }\r\n obj.state.isMinized = !obj.state.isMinized;\r\n }\r\n\r\n obj.close = function () {\r\n Components.elements.splice(Component.elements.indexOf(obj.container), 1);\r\n obj.updatePosition();\r\n el.remove();\r\n }\r\n\r\n obj.updatePosition = function () {\r\n for (var i = 0; i < Component.elements.length; i++) {\r\n var floating = Component.elements[i];\r\n var prevFloating = Component.elements[i - 1];\r\n floating.style.right = i * (prevFloating ? prevFloating.offsetWidth : floating.offsetWidth) * 1.01 + 'px';\r\n }\r\n }\r\n\r\n obj.init = function () {\r\n // Set content into root\r\n setContent();\r\n\r\n // Set dialog events\r\n setEvents();\r\n\r\n // Set dialog type\r\n setType();\r\n\r\n // Update floating position\r\n Component.elements.push(obj.container);\r\n obj.updatePosition();\r\n\r\n el.floating = obj;\r\n }\r\n\r\n obj.init();\r\n\r\n return obj;\r\n });\r\n\r\n Component.elements = [];\r\n\r\n return Component;\r\n}\r\n\r\n/* harmony default export */ var floating = (Floating());\n;// CONCATENATED MODULE: ./src/plugins/validations.js\n\r\n\r\nfunction Validations() {\r\n /**\r\n * Options: Object,\r\n * Properties:\r\n * Constraint,\r\n * Reference,\r\n * Value\r\n */\r\n\r\n const isNumeric = function(num) {\r\n return !isNaN(num) && num !== null && (typeof num !== 'string' || num.trim() !== '');\r\n }\r\n\r\n const numberCriterias = {\r\n 'between': function(value, range) {\r\n return value >= range[0] && value <= range[1];\r\n },\r\n 'not between': function(value, range) {\r\n return value < range[0] || value > range[1];\r\n },\r\n '<': function(value, range) {\r\n return value < range[0];\r\n },\r\n '<=': function(value, range) {\r\n return value <= range[0];\r\n },\r\n '>': function(value, range) {\r\n return value > range[0];\r\n },\r\n '>=': function(value, range) {\r\n return value >= range[0];\r\n },\r\n '=': function(value, range) {\r\n return value == range[0];\r\n },\r\n '!=': function(value, range) {\r\n return value != range[0];\r\n },\r\n }\r\n\r\n const dateCriterias = {\r\n 'valid date': function() {\r\n return true;\r\n },\r\n '=': function(value, range) {\r\n return value === range[0];\r\n },\r\n '!=': function(value, range) {\r\n return value !== range[0];\r\n },\r\n '<': function(value, range) {\r\n return value < range[0];\r\n },\r\n '<=': function(value, range) {\r\n return value <= range[0];\r\n },\r\n '>': function(value, range) {\r\n return value > range[0];\r\n },\r\n '>=': function(value, range) {\r\n return value >= range[0];\r\n },\r\n 'between': function(value, range) {\r\n return value >= range[0] && value <= range[1];\r\n },\r\n 'not between': function(value, range) {\r\n return value < range[0] || value > range[1];\r\n },\r\n }\r\n\r\n const textCriterias = {\r\n 'contains': function(value, range) {\r\n return value.includes(range[0]);\r\n },\r\n 'not contains': function(value, range) {\r\n return !value.includes(range[0]);\r\n },\r\n 'begins with': function(value, range) {\r\n return value.startsWith(range[0]);\r\n },\r\n 'ends with': function(value, range) {\r\n return value.endsWith(range[0]);\r\n },\r\n '=': function(value, range) {\r\n return value === range[0];\r\n },\r\n '!=': function(value, range) {\r\n return value !== range[0];\r\n },\r\n 'valid email': function(value) {\r\n var pattern = new RegExp(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/);\r\n\r\n return pattern.test(value);\r\n },\r\n 'valid url': function(value) {\r\n var pattern = new RegExp(/(((https?:\\/\\/)|(www\\.))[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|]+)/ig);\r\n\r\n return pattern.test(value);\r\n },\r\n }\r\n\r\n // Component router\r\n const component = function(value, options) {\r\n if (typeof(component[options.type]) === 'function') {\r\n if (options.allowBlank && (typeof value === 'undefined' || value === '' || value === null)) {\r\n return true;\r\n }\r\n return component[options.type].call(this, value, options);\r\n }\r\n return null;\r\n }\r\n \r\n component.url = function(data) {\r\n var pattern = new RegExp(/(((https?:\\/\\/)|(www\\.))[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|]+)/ig);\r\n return pattern.test(data) ? true : false;\r\n }\r\n\r\n component.email = function(data) {\r\n var pattern = new RegExp(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/);\r\n return data && pattern.test(data) ? true : false;\r\n }\r\n \r\n component.required = function(data) {\r\n return data && data.trim() ? true : false;\r\n }\r\n\r\n component.empty = function(data) {\r\n return typeof data === 'undefined' || data === null || (typeof data === 'string' && !data.toString().trim());\r\n }\r\n\r\n component['not exist'] = component.empty;\r\n\r\n component.notEmpty = function(data) {\r\n return !component.empty(data);\r\n }\r\n\r\n component.exist = component.notEmpty;\r\n\r\n component.number = function(data, options) {\r\n if (! isNumeric(data)) {\r\n return false;\r\n }\r\n\r\n if (!options || !options.criteria) {\r\n return true;\r\n }\r\n\r\n if (!numberCriterias[options.criteria]) {\r\n return false;\r\n }\r\n\r\n let values = options.value.map(function(num) {\r\n return parseFloat(num);\r\n })\r\n\r\n return numberCriterias[options.criteria](data, values);\r\n };\r\n\r\n component.login = function(data) {\r\n let pattern = new RegExp(/^[a-zA-Z0-9._-]+$/);\r\n return data && pattern.test(data) ? true : false;\r\n }\r\n\r\n component.list = function(data, options) {\r\n let dataType = typeof data;\r\n if (dataType !== 'string' && dataType !== 'number') {\r\n return false;\r\n }\r\n let list;\r\n if (typeof(options.value[0]) === 'string') {\r\n if (options.source) {\r\n list = options.source;\r\n } else {\r\n list = options.value[0].split(',');\r\n }\r\n } else {\r\n list = options.value[0];\r\n }\r\n\r\n if (! Array.isArray(list)) {\r\n return false;\r\n } else {\r\n let validOption = list.findIndex(function (item) {\r\n return item == data;\r\n });\r\n\r\n return validOption > -1;\r\n }\r\n }\r\n\r\n const getCurrentDateWithoutTime = function() {\r\n let date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n }\r\n\r\n const relativeDates = {\r\n 'one year ago': function() {\r\n let date = getCurrentDateWithoutTime();\r\n\r\n date.setFullYear(date.getFullYear() - 1);\r\n\r\n return date;\r\n },\r\n 'one month ago': function() {\r\n let date = getCurrentDateWithoutTime();\r\n\r\n date.setMonth(date.getMonth() - 1);\r\n\r\n return date;\r\n },\r\n 'one week ago': function() {\r\n let date = getCurrentDateWithoutTime();\r\n\r\n date.setDate(date.getDate() - 7);\r\n\r\n return date;\r\n },\r\n yesterday: function() {\r\n let date = getCurrentDateWithoutTime();\r\n\r\n date.setDate(date.getDate() - 1);\r\n\r\n return date;\r\n },\r\n today: getCurrentDateWithoutTime,\r\n tomorrow: function() {\r\n let date = getCurrentDateWithoutTime();\r\n\r\n date.setDate(date.getDate() + 1);\r\n\r\n return date;\r\n },\r\n };\r\n\r\n component.date = function(data, options) {\r\n if (isNumeric(data) && data > 0 && data < 1000000) {\r\n data = helpers_date.numToDate(data);\r\n }\r\n\r\n if (new Date(data) == 'Invalid Date') {\r\n return false;\r\n }\r\n\r\n if (!options || !options.criteria) {\r\n return true;\r\n }\r\n\r\n if (!dateCriterias[options.criteria]) {\r\n return false;\r\n }\r\n\r\n let values = options.value.map(function(date) {\r\n if (typeof date === 'string' && relativeDates[date]) {\r\n return relativeDates[date]().getTime();\r\n }\r\n\r\n return new Date(date).getTime();\r\n });\r\n\r\n return dateCriterias[options.criteria](new Date(data).getTime(), values);\r\n }\r\n\r\n component.text = function(data, options) {\r\n if (typeof data === 'undefined' || data === null) {\r\n data = '';\r\n } else if (typeof data !== 'string') {\r\n return false;\r\n }\r\n\r\n if (!options || !options.criteria) {\r\n return true;\r\n }\r\n\r\n if (!textCriterias[options.criteria]) {\r\n return false;\r\n }\r\n\r\n return textCriterias[options.criteria](data, options.value);\r\n }\r\n\r\n component.textLength = function(data, options) {\r\n data = data.toString();\r\n\r\n return component.number(data.length, options);\r\n }\r\n\r\n return component;\r\n}\r\n\r\n/* harmony default export */ var validations = (Validations());\n;// CONCATENATED MODULE: ./src/plugins/form.js\n\r\n\r\n\r\n\r\nfunction Form() {\r\n var Component = (function(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n url: null,\r\n message: 'Are you sure? There are unsaved information in your form',\r\n ignore: false,\r\n currentHash: null,\r\n submitButton:null,\r\n validations: null,\r\n onbeforeload: null,\r\n onload: null,\r\n onbeforesave: null,\r\n onsave: null,\r\n onbeforeremove: null,\r\n onremove: null,\r\n onerror: function(el, message) {\r\n alert(message);\r\n }\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Validations\r\n if (! obj.options.validations) {\r\n obj.options.validations = {};\r\n }\r\n\r\n // Submit Button\r\n if (! obj.options.submitButton) {\r\n obj.options.submitButton = el.querySelector('input[type=submit]');\r\n }\r\n\r\n if (obj.options.submitButton && obj.options.url) {\r\n obj.options.submitButton.onclick = function() {\r\n obj.save();\r\n }\r\n }\r\n\r\n if (! obj.options.validations.email) {\r\n obj.options.validations.email = validations.email;\r\n }\r\n\r\n if (! obj.options.validations.length) {\r\n obj.options.validations.length = validations.length;\r\n }\r\n\r\n if (! obj.options.validations.required) {\r\n obj.options.validations.required = validations.required;\r\n }\r\n\r\n obj.setUrl = function(url) {\r\n obj.options.url = url;\r\n }\r\n\r\n obj.load = function() {\r\n ajax({\r\n url: obj.options.url,\r\n method: 'GET',\r\n dataType: 'json',\r\n queue: true,\r\n success: function(data) {\r\n // Overwrite values from the backend\r\n if (typeof(obj.options.onbeforeload) == 'function') {\r\n var ret = obj.options.onbeforeload(el, data);\r\n if (ret) {\r\n data = ret;\r\n }\r\n }\r\n // Apply values to the form\r\n Component.setElements(el, data);\r\n // Onload methods\r\n if (typeof(obj.options.onload) == 'function') {\r\n obj.options.onload(el, data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n obj.save = function() {\r\n var test = obj.validate();\r\n\r\n if (test) {\r\n obj.options.onerror(el, test);\r\n } else {\r\n var data = Component.getElements(el, true);\r\n\r\n if (typeof(obj.options.onbeforesave) == 'function') {\r\n var data = obj.options.onbeforesave(el, data);\r\n\r\n if (data === false) {\r\n return;\r\n }\r\n }\r\n\r\n ajax({\r\n url: obj.options.url,\r\n method: 'POST',\r\n dataType: 'json',\r\n data: data,\r\n success: function(result) {\r\n if (typeof(obj.options.onsave) == 'function') {\r\n obj.options.onsave(el, data, result);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n obj.remove = function() {\r\n if (typeof(obj.options.onbeforeremove) == 'function') {\r\n var ret = obj.options.onbeforeremove(el, obj);\r\n if (ret === false) {\r\n return false;\r\n }\r\n }\r\n\r\n ajax({\r\n url: obj.options.url,\r\n method: 'DELETE',\r\n dataType: 'json',\r\n success: function(result) {\r\n if (typeof(obj.options.onremove) == 'function') {\r\n obj.options.onremove(el, obj, result);\r\n }\r\n\r\n obj.reset();\r\n }\r\n });\r\n }\r\n\r\n var addError = function(element) {\r\n // Add error in the element\r\n element.classList.add('error');\r\n // Submit button\r\n if (obj.options.submitButton) {\r\n obj.options.submitButton.setAttribute('disabled', true);\r\n }\r\n // Return error message\r\n var error = element.getAttribute('data-error') || 'There is an error in the form';\r\n element.setAttribute('title', error);\r\n return error;\r\n }\r\n\r\n var delError = function(element) {\r\n var error = false;\r\n // Remove class from this element\r\n element.classList.remove('error');\r\n element.removeAttribute('title');\r\n // Get elements in the form\r\n var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n // Run all elements\r\n for (var i = 0; i < elements.length; i++) {\r\n if (elements[i].getAttribute('data-validation')) {\r\n if (elements[i].classList.contains('error')) {\r\n error = true;\r\n }\r\n }\r\n }\r\n\r\n if (obj.options.submitButton) {\r\n if (error) {\r\n obj.options.submitButton.setAttribute('disabled', true);\r\n } else {\r\n obj.options.submitButton.removeAttribute('disabled');\r\n }\r\n }\r\n }\r\n\r\n obj.validateElement = function(element) {\r\n // Test results\r\n var test = false;\r\n // Value\r\n var value = Component.getValue(element);\r\n // Validation\r\n var validation = element.getAttribute('data-validation');\r\n // Parse\r\n if (typeof(obj.options.validations[validation]) == 'function' && ! obj.options.validations[validation](value, element)) {\r\n // Not passed in the test\r\n test = addError(element);\r\n } else {\r\n if (element.classList.contains('error')) {\r\n delError(element);\r\n }\r\n }\r\n\r\n return test;\r\n }\r\n\r\n obj.reset = function() {\r\n // Get elements in the form\r\n var name = null;\r\n var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n // Run all elements\r\n for (var i = 0; i < elements.length; i++) {\r\n if (name = elements[i].getAttribute('name')) {\r\n if (elements[i].type == 'checkbox' || elements[i].type == 'radio') {\r\n elements[i].checked = false;\r\n } else {\r\n if (typeof(elements[i].val) == 'function') {\r\n elements[i].val('');\r\n } else {\r\n elements[i].value = '';\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Run form validation\r\n obj.validate = function() {\r\n var test = [];\r\n // Get elements in the form\r\n var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n // Run all elements\r\n for (var i = 0; i < elements.length; i++) {\r\n // Required\r\n if (elements[i].getAttribute('data-validation')) {\r\n var res = obj.validateElement(elements[i]);\r\n if (res) {\r\n test.push(res);\r\n }\r\n }\r\n }\r\n if (test.length > 0) {\r\n return test.join('
');\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n // Check the form\r\n obj.getError = function() {\r\n // Validation\r\n return obj.validation() ? true : false;\r\n }\r\n\r\n // Return the form hash\r\n obj.setHash = function() {\r\n return obj.getHash(Component.getElements(el));\r\n }\r\n\r\n // Get the form hash\r\n obj.getHash = function(str) {\r\n var hash = 0, i, chr;\r\n\r\n if (str.length === 0) {\r\n return hash;\r\n } else {\r\n for (i = 0; i < str.length; i++) {\r\n chr = str.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + chr;\r\n hash |= 0;\r\n }\r\n }\r\n\r\n return hash;\r\n }\r\n\r\n // Is there any change in the form since start tracking?\r\n obj.isChanged = function() {\r\n var hash = obj.setHash();\r\n return (obj.options.currentHash != hash);\r\n }\r\n\r\n // Restart tracking\r\n obj.resetTracker = function() {\r\n obj.options.currentHash = obj.setHash();\r\n obj.options.ignore = false;\r\n }\r\n\r\n // Ignore flag\r\n obj.setIgnore = function(ignoreFlag) {\r\n obj.options.ignore = ignoreFlag ? true : false;\r\n }\r\n\r\n // Start tracking in one second\r\n setTimeout(function() {\r\n obj.options.currentHash = obj.setHash();\r\n }, 1000);\r\n\r\n // Validations\r\n el.addEventListener(\"keyup\", function(e) {\r\n if (e.target.getAttribute('data-validation')) {\r\n obj.validateElement(e.target);\r\n }\r\n });\r\n\r\n // Alert\r\n if (! Component.hasEvents) {\r\n window.addEventListener(\"beforeunload\", function (e) {\r\n if (obj.isChanged() && obj.options.ignore == false) {\r\n var confirmationMessage = obj.options.message? obj.options.message : \"\\o/\";\r\n\r\n if (confirmationMessage) {\r\n if (typeof e == 'undefined') {\r\n e = window.event;\r\n }\r\n\r\n if (e) {\r\n e.returnValue = confirmationMessage;\r\n }\r\n\r\n return confirmationMessage;\r\n } else {\r\n return void(0);\r\n }\r\n }\r\n });\r\n\r\n Component.hasEvents = true;\r\n }\r\n\r\n el.form = obj;\r\n\r\n return obj;\r\n });\r\n\r\n // Get value from one element\r\n Component.getValue = function(element) {\r\n var value = null;\r\n if (element.type == 'checkbox') {\r\n if (element.checked == true) {\r\n value = element.value || true;\r\n }\r\n } else if (element.type == 'radio') {\r\n if (element.checked == true) {\r\n value = element.value;\r\n }\r\n } else if (element.type == 'file') {\r\n value = element.files;\r\n } else if (element.tagName == 'select' && element.multiple == true) {\r\n value = [];\r\n var options = element.querySelectorAll(\"options[selected]\");\r\n for (var j = 0; j < options.length; j++) {\r\n value.push(options[j].value);\r\n }\r\n } else if (typeof(element.val) == 'function') {\r\n value = element.val();\r\n } else {\r\n value = element.value || '';\r\n }\r\n\r\n return value;\r\n }\r\n\r\n // Get form elements\r\n Component.getElements = function(el, asArray) {\r\n var data = {};\r\n var name = null;\r\n var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n if (name = elements[i].getAttribute('name')) {\r\n data[name] = Component.getValue(elements[i]) || '';\r\n }\r\n }\r\n\r\n return asArray == true ? data : JSON.stringify(data);\r\n }\r\n\r\n //Get form elements\r\n Component.setElements = function(el, data) {\r\n var name = null;\r\n var value = null;\r\n var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n for (var i = 0; i < elements.length; i++) {\r\n // Attributes\r\n var type = elements[i].getAttribute('type');\r\n if (name = elements[i].getAttribute('name')) {\r\n // Transform variable names in pathname\r\n name = name.replace(new RegExp(/\\[(.*?)\\]/ig), '.$1');\r\n value = null;\r\n // Seach for the data in the path\r\n if (name.match(/\\./)) {\r\n var tmp = Path.call(data, name) || '';\r\n if (typeof(tmp) !== 'undefined') {\r\n value = tmp;\r\n }\r\n } else {\r\n if (typeof(data[name]) !== 'undefined') {\r\n value = data[name];\r\n }\r\n }\r\n // Set the values\r\n if (value !== null) {\r\n if (type == 'checkbox' || type == 'radio') {\r\n elements[i].checked = value ? true : false;\r\n } else if (type == 'file') {\r\n // Do nothing\r\n } else {\r\n if (typeof (elements[i].val) == 'function') {\r\n elements[i].val(value);\r\n } else {\r\n elements[i].value = value;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return Component;\r\n}\r\n\r\n/* harmony default export */ var plugins_form = (Form());\n;// CONCATENATED MODULE: ./src/plugins/modal.js\n\r\n\r\n\r\n\r\nfunction Modal() {\r\n\r\n var Events = function() {\r\n // Position\r\n var tracker = null;\r\n\r\n var keyDown = function (e) {\r\n if (e.which == 27) {\r\n var modals = document.querySelectorAll('.jmodal');\r\n for (var i = 0; i < modals.length; i++) {\r\n modals[i].parentNode.modal.close();\r\n }\r\n }\r\n }\r\n\r\n var mouseUp = function (e) {\r\n let element = e.composedPath();\r\n var item = helpers.findElement(element[0], 'jmodal');\r\n if (item) {\r\n // Get target info\r\n var rect = item.getBoundingClientRect();\r\n\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n var x = e.changedTouches[0].clientX;\r\n var y = e.changedTouches[0].clientY;\r\n } else {\r\n var x = e.clientX;\r\n var y = e.clientY;\r\n }\r\n\r\n if (rect.width - (x - rect.left) < 50 && (y - rect.top) < 50) {\r\n item.parentNode.modal.close();\r\n }\r\n }\r\n\r\n if (tracker) {\r\n tracker.element.style.cursor = 'auto';\r\n tracker = null;\r\n }\r\n }\r\n\r\n var mouseDown = function (e) {\r\n let element = e.composedPath();\r\n var item = helpers.findElement(element[0], 'jmodal');\r\n if (item) {\r\n // Get target info\r\n var rect = item.getBoundingClientRect();\r\n\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n var x = e.changedTouches[0].clientX;\r\n var y = e.changedTouches[0].clientY;\r\n } else {\r\n var x = e.clientX;\r\n var y = e.clientY;\r\n }\r\n\r\n if (rect.width - (x - rect.left) < 50 && (y - rect.top) < 50) {\r\n // Do nothing\r\n } else {\r\n if (y - rect.top < 50) {\r\n if (document.selection) {\r\n document.selection.empty();\r\n } else if (window.getSelection) {\r\n window.getSelection().removeAllRanges();\r\n }\r\n\r\n tracker = {\r\n left: rect.left,\r\n top: rect.top,\r\n x: e.clientX,\r\n y: e.clientY,\r\n width: rect.width,\r\n height: rect.height,\r\n element: item,\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n var mouseMove = function (e) {\r\n if (tracker) {\r\n e = e || window.event;\r\n if (e.buttons) {\r\n var mouseButton = e.buttons;\r\n } else if (e.button) {\r\n var mouseButton = e.button;\r\n } else {\r\n var mouseButton = e.which;\r\n }\r\n\r\n if (mouseButton) {\r\n tracker.element.style.top = (tracker.top + (e.clientY - tracker.y) + (tracker.height / 2)) + 'px';\r\n tracker.element.style.left = (tracker.left + (e.clientX - tracker.x) + (tracker.width / 2)) + 'px';\r\n tracker.element.style.cursor = 'move';\r\n } else {\r\n tracker.element.style.cursor = 'auto';\r\n }\r\n }\r\n }\r\n\r\n document.addEventListener('keydown', keyDown);\r\n document.addEventListener('mouseup', mouseUp);\r\n document.addEventListener('mousedown', mouseDown);\r\n document.addEventListener('mousemove', mouseMove);\r\n }\r\n\r\n var Component = (function (el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n url: null,\r\n onopen: null,\r\n onclose: null,\r\n onload: null,\r\n closed: false,\r\n width: null,\r\n height: null,\r\n title: null,\r\n padding: null,\r\n backdrop: true,\r\n icon: null,\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Title\r\n if (!obj.options.title && el.getAttribute('title')) {\r\n obj.options.title = el.getAttribute('title');\r\n }\r\n\r\n var temp = document.createElement('div');\r\n while (el.children[0]) {\r\n temp.appendChild(el.children[0]);\r\n }\r\n\r\n obj.title = document.createElement('div');\r\n obj.title.className = 'jmodal_title';\r\n if (obj.options.icon) {\r\n obj.title.setAttribute('data-icon', obj.options.icon);\r\n }\r\n\r\n obj.content = document.createElement('div');\r\n obj.content.className = 'jmodal_content';\r\n obj.content.innerHTML = el.innerHTML;\r\n\r\n while (temp.children[0]) {\r\n obj.content.appendChild(temp.children[0]);\r\n }\r\n\r\n obj.container = document.createElement('div');\r\n obj.container.className = 'jmodal';\r\n obj.container.appendChild(obj.title);\r\n obj.container.appendChild(obj.content);\r\n\r\n if (obj.options.padding) {\r\n obj.content.style.padding = obj.options.padding;\r\n }\r\n if (obj.options.width) {\r\n obj.container.style.width = obj.options.width;\r\n }\r\n if (obj.options.height) {\r\n obj.container.style.height = obj.options.height;\r\n }\r\n if (obj.options.title) {\r\n var title = document.createElement('h4');\r\n title.innerText = obj.options.title;\r\n obj.title.appendChild(title);\r\n }\r\n\r\n el.innerHTML = '';\r\n el.style.display = 'none';\r\n el.appendChild(obj.container);\r\n\r\n // Backdrop\r\n if (obj.options.backdrop) {\r\n var backdrop = document.createElement('div');\r\n backdrop.className = 'jmodal_backdrop';\r\n backdrop.onclick = function () {\r\n obj.close();\r\n }\r\n el.appendChild(backdrop);\r\n }\r\n\r\n obj.open = function () {\r\n el.style.display = 'block';\r\n // Fullscreen\r\n var rect = obj.container.getBoundingClientRect();\r\n if (helpers.getWindowWidth() < rect.width) {\r\n obj.container.style.top = '';\r\n obj.container.style.left = '';\r\n obj.container.classList.add('jmodal_fullscreen');\r\n animation.slideBottom(obj.container, 1);\r\n } else {\r\n if (obj.options.backdrop) {\r\n backdrop.style.display = 'block';\r\n }\r\n }\r\n // Event\r\n if (typeof (obj.options.onopen) == 'function') {\r\n obj.options.onopen(el, obj);\r\n }\r\n }\r\n\r\n obj.resetPosition = function () {\r\n obj.container.style.top = '';\r\n obj.container.style.left = '';\r\n }\r\n\r\n obj.isOpen = function () {\r\n return el.style.display != 'none' ? true : false;\r\n }\r\n\r\n obj.close = function () {\r\n if (obj.isOpen()) {\r\n el.style.display = 'none';\r\n if (obj.options.backdrop) {\r\n // Backdrop\r\n backdrop.style.display = '';\r\n }\r\n // Remove fullscreen class\r\n obj.container.classList.remove('jmodal_fullscreen');\r\n // Event\r\n if (typeof (obj.options.onclose) == 'function') {\r\n obj.options.onclose(el, obj);\r\n }\r\n }\r\n }\r\n\r\n if (obj.options.url) {\r\n ajax({\r\n url: obj.options.url,\r\n method: 'GET',\r\n dataType: 'text/html',\r\n success: function (data) {\r\n obj.content.innerHTML = data;\r\n\r\n if (!obj.options.closed) {\r\n obj.open();\r\n }\r\n\r\n if (typeof (obj.options.onload) === 'function') {\r\n obj.options.onload(obj);\r\n }\r\n }\r\n });\r\n } else {\r\n if (!obj.options.closed) {\r\n obj.open();\r\n }\r\n\r\n if (typeof (obj.options.onload) === 'function') {\r\n obj.options.onload(obj);\r\n }\r\n }\r\n\r\n // Keep object available from the node\r\n el.modal = obj;\r\n\r\n // Create events when the first modal is create only\r\n Events();\r\n\r\n // Execute the events only once\r\n Events = function() {};\r\n\r\n return obj;\r\n });\r\n\r\n return Component;\r\n}\r\n\r\n/* harmony default export */ var modal = (Modal());\n;// CONCATENATED MODULE: ./src/plugins/notification.js\n\r\n\r\n\r\nfunction Notification() {\r\n var Component = function (options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n icon: null,\r\n name: 'Notification',\r\n date: null,\r\n error: null,\r\n title: null,\r\n message: null,\r\n timeout: 4000,\r\n autoHide: true,\r\n closeable: true,\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n var notification = document.createElement('div');\r\n notification.className = 'jnotification';\r\n\r\n if (obj.options.error) {\r\n notification.classList.add('jnotification-error');\r\n }\r\n\r\n var notificationContainer = document.createElement('div');\r\n notificationContainer.className = 'jnotification-container';\r\n notification.appendChild(notificationContainer);\r\n\r\n var notificationHeader = document.createElement('div');\r\n notificationHeader.className = 'jnotification-header';\r\n notificationContainer.appendChild(notificationHeader);\r\n\r\n var notificationImage = document.createElement('div');\r\n notificationImage.className = 'jnotification-image';\r\n notificationHeader.appendChild(notificationImage);\r\n\r\n if (obj.options.icon) {\r\n var notificationIcon = document.createElement('img');\r\n notificationIcon.src = obj.options.icon;\r\n notificationImage.appendChild(notificationIcon);\r\n }\r\n\r\n var notificationName = document.createElement('div');\r\n notificationName.className = 'jnotification-name';\r\n notificationName.innerHTML = obj.options.name;\r\n notificationHeader.appendChild(notificationName);\r\n\r\n if (obj.options.closeable == true) {\r\n var notificationClose = document.createElement('div');\r\n notificationClose.className = 'jnotification-close';\r\n notificationClose.onclick = function () {\r\n obj.hide();\r\n }\r\n notificationHeader.appendChild(notificationClose);\r\n }\r\n\r\n var notificationDate = document.createElement('div');\r\n notificationDate.className = 'jnotification-date';\r\n notificationHeader.appendChild(notificationDate);\r\n\r\n var notificationContent = document.createElement('div');\r\n notificationContent.className = 'jnotification-content';\r\n notificationContainer.appendChild(notificationContent);\r\n\r\n if (obj.options.title) {\r\n var notificationTitle = document.createElement('div');\r\n notificationTitle.className = 'jnotification-title';\r\n notificationTitle.innerHTML = obj.options.title;\r\n notificationContent.appendChild(notificationTitle);\r\n }\r\n\r\n var notificationMessage = document.createElement('div');\r\n notificationMessage.className = 'jnotification-message';\r\n notificationMessage.innerHTML = obj.options.message;\r\n notificationContent.appendChild(notificationMessage);\r\n\r\n obj.show = function () {\r\n document.body.appendChild(notification);\r\n if (helpers.getWindowWidth() > 800) {\r\n animation.fadeIn(notification);\r\n } else {\r\n animation.slideTop(notification, 1);\r\n }\r\n }\r\n\r\n obj.hide = function () {\r\n if (helpers.getWindowWidth() > 800) {\r\n animation.fadeOut(notification, function () {\r\n if (notification.parentNode) {\r\n notification.parentNode.removeChild(notification);\r\n if (notificationTimeout) {\r\n clearTimeout(notificationTimeout);\r\n }\r\n }\r\n });\r\n } else {\r\n animation.slideTop(notification, 0, function () {\r\n if (notification.parentNode) {\r\n notification.parentNode.removeChild(notification);\r\n if (notificationTimeout) {\r\n clearTimeout(notificationTimeout);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n obj.show();\r\n\r\n if (obj.options.autoHide == true) {\r\n var notificationTimeout = setTimeout(function () {\r\n obj.hide();\r\n }, obj.options.timeout);\r\n }\r\n\r\n if (helpers.getWindowWidth() < 800) {\r\n notification.addEventListener(\"swipeup\", function (e) {\r\n obj.hide();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n Component.isVisible = function () {\r\n var j = document.querySelector('.jnotification');\r\n return j && j.parentNode ? true : false;\r\n }\r\n\r\n return Component;\r\n}\r\n\r\n/* harmony default export */ var notification = (Notification());\n;// CONCATENATED MODULE: ./src/plugins/progressbar.js\nfunction Progressbar(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n value: 0,\r\n onchange: null,\r\n width: null,\r\n };\r\n\r\n // Loop through the initial configuration\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Class\r\n el.classList.add('jprogressbar');\r\n el.setAttribute('tabindex', 1);\r\n el.setAttribute('data-value', obj.options.value);\r\n\r\n var bar = document.createElement('div');\r\n bar.style.width = obj.options.value + '%';\r\n bar.style.color = '#fff';\r\n el.appendChild(bar);\r\n\r\n if (obj.options.width) {\r\n el.style.width = obj.options.width;\r\n }\r\n\r\n // Set value\r\n obj.setValue = function(value) {\r\n value = parseInt(value);\r\n obj.options.value = value;\r\n bar.style.width = value + '%';\r\n el.setAttribute('data-value', value + '%');\r\n\r\n if (value < 6) {\r\n el.style.color = '#000';\r\n } else {\r\n el.style.color = '#fff';\r\n }\r\n\r\n // Update value\r\n obj.options.value = value;\r\n\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, value);\r\n }\r\n\r\n // Lemonade JS\r\n if (el.value != obj.options.value) {\r\n el.value = obj.options.value;\r\n if (typeof(el.oninput) == 'function') {\r\n el.oninput({\r\n type: 'input',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n }\r\n\r\n obj.getValue = function() {\r\n return obj.options.value;\r\n }\r\n\r\n var action = function(e) {\r\n if (e.which) {\r\n // Get target info\r\n var rect = el.getBoundingClientRect();\r\n\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n var x = e.changedTouches[0].clientX;\r\n var y = e.changedTouches[0].clientY;\r\n } else {\r\n var x = e.clientX;\r\n var y = e.clientY;\r\n }\r\n\r\n obj.setValue(Math.round((x - rect.left) / rect.width * 100));\r\n }\r\n }\r\n\r\n // Events\r\n if ('touchstart' in document.documentElement === true) {\r\n el.addEventListener('touchstart', action);\r\n el.addEventListener('touchend', action);\r\n } else {\r\n el.addEventListener('mousedown', action);\r\n el.addEventListener(\"mousemove\", action);\r\n }\r\n\r\n // Change\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return obj.getValue();\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n // Reference\r\n el.progressbar = obj;\r\n\r\n return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/rating.js\nfunction Rating(el, options) {\r\n // Already created, update options\r\n if (el.rating) {\r\n return el.rating.setOptions(options, true);\r\n }\r\n\r\n // New instance\r\n var obj = {};\r\n obj.options = {};\r\n\r\n obj.setOptions = function(options, reset) {\r\n // Default configuration\r\n var defaults = {\r\n number: 5,\r\n value: 0,\r\n tooltip: [ 'Very bad', 'Bad', 'Average', 'Good', 'Very good' ],\r\n onchange: null,\r\n };\r\n\r\n // Loop through the initial configuration\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n }\r\n\r\n // Make sure the container is empty\r\n el.innerHTML = '';\r\n\r\n // Add elements\r\n for (var i = 0; i < obj.options.number; i++) {\r\n var div = document.createElement('div');\r\n div.setAttribute('data-index', (i + 1))\r\n div.setAttribute('title', obj.options.tooltip[i])\r\n el.appendChild(div);\r\n }\r\n\r\n // Selected option\r\n if (obj.options.value) {\r\n for (var i = 0; i < obj.options.number; i++) {\r\n if (i < obj.options.value) {\r\n el.children[i].classList.add('jrating-selected');\r\n }\r\n }\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n // Set value\r\n obj.setValue = function(index) {\r\n for (var i = 0; i < obj.options.number; i++) {\r\n if (i < index) {\r\n el.children[i].classList.add('jrating-selected');\r\n } else {\r\n el.children[i].classList.remove('jrating-over');\r\n el.children[i].classList.remove('jrating-selected');\r\n }\r\n }\r\n\r\n obj.options.value = index;\r\n\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, index);\r\n }\r\n\r\n // Lemonade JS\r\n if (el.value != obj.options.value) {\r\n el.value = obj.options.value;\r\n if (typeof(el.oninput) == 'function') {\r\n el.oninput({\r\n type: 'input',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n }\r\n\r\n obj.getValue = function() {\r\n return obj.options.value;\r\n }\r\n\r\n var init = function() {\r\n // Start plugin\r\n obj.setOptions(options);\r\n\r\n // Class\r\n el.classList.add('jrating');\r\n\r\n // Events\r\n el.addEventListener(\"click\", function(e) {\r\n var index = e.target.getAttribute('data-index');\r\n if (index != undefined) {\r\n if (index == obj.options.value) {\r\n obj.setValue(0);\r\n } else {\r\n obj.setValue(index);\r\n }\r\n }\r\n });\r\n\r\n el.addEventListener(\"mouseover\", function(e) {\r\n var index = e.target.getAttribute('data-index');\r\n for (var i = 0; i < obj.options.number; i++) {\r\n if (i < index) {\r\n el.children[i].classList.add('jrating-over');\r\n } else {\r\n el.children[i].classList.remove('jrating-over');\r\n }\r\n }\r\n });\r\n\r\n el.addEventListener(\"mouseout\", function(e) {\r\n for (var i = 0; i < obj.options.number; i++) {\r\n el.children[i].classList.remove('jrating-over');\r\n }\r\n });\r\n\r\n // Change\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return obj.getValue();\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n // Reference\r\n el.rating = obj;\r\n }\r\n\r\n init();\r\n\r\n return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/search.js\n\r\n\r\n\r\nfunction Search(el, options) {\r\n if (el.search) {\r\n return el.search;\r\n }\r\n\r\n var index = null;\r\n\r\n var select = function(e) {\r\n if (e.target.classList.contains('jsearch_item')) {\r\n var element = e.target;\r\n } else {\r\n var element = e.target.parentNode;\r\n }\r\n\r\n obj.selectIndex(element);\r\n e.preventDefault();\r\n }\r\n\r\n var createList = function(data) {\r\n if (typeof(obj.options.onsearch) == 'function') {\r\n var ret = obj.options.onsearch(obj, data);\r\n if (ret) {\r\n data = ret;\r\n }\r\n }\r\n\r\n // Reset container\r\n container.innerHTML = '';\r\n // Print results\r\n if (! data.length) {\r\n // Show container\r\n el.style.display = '';\r\n } else {\r\n // Show container\r\n el.style.display = 'block';\r\n\r\n // Show items (only 10)\r\n var len = data.length < 11 ? data.length : 10;\r\n for (var i = 0; i < len; i++) {\r\n if (typeof(data[i]) == 'string') {\r\n var text = data[i];\r\n var value = data[i];\r\n } else {\r\n // Legacy\r\n var text = data[i].text;\r\n if (! text && data[i].name) {\r\n text = data[i].name;\r\n }\r\n var value = data[i].value;\r\n if (! value && data[i].id) {\r\n value = data[i].id;\r\n }\r\n }\r\n\r\n var div = document.createElement('div');\r\n div.setAttribute('data-value', value);\r\n div.setAttribute('data-text', text);\r\n div.className = 'jsearch_item';\r\n\r\n if (data[i].id) {\r\n div.setAttribute('id', data[i].id)\r\n }\r\n\r\n if (obj.options.forceSelect && i == 0) {\r\n div.classList.add('selected');\r\n }\r\n var img = document.createElement('img');\r\n if (data[i].image) {\r\n img.src = data[i].image;\r\n } else {\r\n img.style.display = 'none';\r\n }\r\n div.appendChild(img);\r\n\r\n var item = document.createElement('div');\r\n item.innerHTML = text;\r\n div.appendChild(item);\r\n\r\n // Append item to the container\r\n container.appendChild(div);\r\n }\r\n }\r\n }\r\n\r\n var execute = function(str) {\r\n if (str != obj.terms) {\r\n // New terms\r\n obj.terms = str;\r\n // New index\r\n if (obj.options.forceSelect) {\r\n index = 0;\r\n } else {\r\n index = null;\r\n }\r\n // Array or remote search\r\n if (Array.isArray(obj.options.data)) {\r\n var test = function(o) {\r\n if (typeof(o) == 'string') {\r\n if ((''+o).toLowerCase().search(str.toLowerCase()) >= 0) {\r\n return true;\r\n }\r\n } else {\r\n for (var key in o) {\r\n var value = o[key];\r\n if ((''+value).toLowerCase().search(str.toLowerCase()) >= 0) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n var results = obj.options.data.filter(function(item) {\r\n return test(item);\r\n });\r\n\r\n // Show items\r\n createList(results);\r\n } else {\r\n // Get remove results\r\n ajax({\r\n url: obj.options.data + str,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function(data) {\r\n // Show items\r\n createList(data);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Search timer\r\n var timer = null;\r\n\r\n // Search methods\r\n var obj = function(str) {\r\n if (timer) {\r\n clearTimeout(timer);\r\n }\r\n timer = setTimeout(function() {\r\n execute(str);\r\n }, 500);\r\n }\r\n if(options.forceSelect === null) {\r\n options.forceSelect = true;\r\n }\r\n obj.options = {\r\n data: options.data || null,\r\n input: options.input || null,\r\n searchByNode: options.searchByNode || null,\r\n onselect: options.onselect || null,\r\n forceSelect: options.forceSelect,\r\n onsearch: options.onsearch || null,\r\n onbeforesearch: options.onbeforesearch || null,\r\n };\r\n\r\n obj.selectIndex = function(item) {\r\n var id = item.getAttribute('id');\r\n var text = item.getAttribute('data-text');\r\n var value = item.getAttribute('data-value');\r\n var image = item.children[0].src || '';\r\n // Onselect\r\n if (typeof(obj.options.onselect) == 'function') {\r\n obj.options.onselect(obj, text, value, id, image);\r\n }\r\n // Close container\r\n obj.close();\r\n }\r\n\r\n obj.open = function() {\r\n el.style.display = 'block';\r\n }\r\n\r\n obj.close = function() {\r\n if (timer) {\r\n clearTimeout(timer);\r\n }\r\n // Current terms\r\n obj.terms = '';\r\n // Remove results\r\n container.innerHTML = '';\r\n // Hide\r\n el.style.display = '';\r\n }\r\n\r\n obj.isOpened = function() {\r\n return el.style.display ? true : false;\r\n }\r\n\r\n obj.keydown = function(e) {\r\n if (obj.isOpened()) {\r\n if (e.key == 'Enter') {\r\n // Enter\r\n if (index!==null && container.children[index]) {\r\n obj.selectIndex(container.children[index]);\r\n e.preventDefault();\r\n } else {\r\n obj.close();\r\n }\r\n } else if (e.key === 'ArrowUp') {\r\n // Up\r\n if (index!==null && container.children[0]) {\r\n container.children[index].classList.remove('selected');\r\n if(!obj.options.forceSelect && index === 0) {\r\n index = null;\r\n } else {\r\n index = Math.max(0, index-1);\r\n container.children[index].classList.add('selected');\r\n }\r\n }\r\n e.preventDefault();\r\n } else if (e.key === 'ArrowDown') {\r\n // Down\r\n if(index == null) {\r\n index = -1;\r\n } else {\r\n container.children[index].classList.remove('selected');\r\n }\r\n if (index < 9 && container.children[index+1]) {\r\n index++;\r\n }\r\n container.children[index].classList.add('selected');\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n obj.keyup = function(e) {\r\n if (! obj.options.searchByNode && obj.options.input) {\r\n if (obj.options.input.tagName === 'DIV') {\r\n var terms = obj.options.input.innerText;\r\n } else {\r\n var terms = obj.options.input.value;\r\n }\r\n } else {\r\n // Current node\r\n var node = helpers.getNode();\r\n if (node) {\r\n var terms = node.innerText;\r\n }\r\n }\r\n\r\n if (typeof(obj.options.onbeforesearch) == 'function') {\r\n var ret = obj.options.onbeforesearch(obj, terms);\r\n if (ret) {\r\n terms = ret;\r\n } else {\r\n if (ret === false) {\r\n // Ignore event\r\n return;\r\n }\r\n }\r\n }\r\n\r\n obj(terms);\r\n }\r\n\r\n obj.blur = function(e) {\r\n obj.close();\r\n }\r\n\r\n // Add events\r\n if (obj.options.input) {\r\n obj.options.input.addEventListener(\"keyup\", obj.keyup);\r\n obj.options.input.addEventListener(\"keydown\", obj.keydown);\r\n obj.options.input.addEventListener(\"blur\", obj.blur);\r\n }\r\n\r\n // Append element\r\n var container = document.createElement('div');\r\n container.classList.add('jsearch_container');\r\n container.onmousedown = select;\r\n el.appendChild(container);\r\n\r\n el.classList.add('jsearch');\r\n el.search = obj;\r\n\r\n return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/slider.js\nfunction Slider(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n obj.currentImage = null;\r\n\r\n if (options) {\r\n obj.options = options;\r\n }\r\n\r\n // Focus\r\n el.setAttribute('tabindex', '900')\r\n\r\n // Items\r\n obj.options.items = [];\r\n\r\n if (! el.classList.contains('jslider')) {\r\n el.classList.add('jslider');\r\n el.classList.add('unselectable');\r\n\r\n if (obj.options.height) {\r\n el.style.minHeight = parseInt(obj.options.height) + 'px';\r\n }\r\n if (obj.options.width) {\r\n el.style.width = parseInt(obj.options.width) + 'px';\r\n }\r\n if (obj.options.grid) {\r\n el.classList.add('jslider-grid');\r\n var number = el.children.length;\r\n if (number > 4) {\r\n el.setAttribute('data-total', number - 4);\r\n }\r\n el.setAttribute('data-number', (number > 4 ? 4 : number));\r\n }\r\n\r\n // Add slider counter\r\n var counter = document.createElement('div');\r\n counter.classList.add('jslider-counter');\r\n\r\n // Move children inside\r\n if (el.children.length > 0) {\r\n // Keep children items\r\n for (var i = 0; i < el.children.length; i++) {\r\n obj.options.items.push(el.children[i]);\r\n \r\n // counter click event\r\n var item = document.createElement('div');\r\n item.onclick = function() {\r\n var index = Array.prototype.slice.call(counter.children).indexOf(this);\r\n obj.show(obj.currentImage = obj.options.items[index]);\r\n }\r\n counter.appendChild(item);\r\n }\r\n }\r\n // Add caption\r\n var caption = document.createElement('div');\r\n caption.className = 'jslider-caption';\r\n\r\n // Add close buttom\r\n var controls = document.createElement('div');\r\n var close = document.createElement('div');\r\n close.className = 'jslider-close';\r\n close.innerHTML = '';\r\n \r\n close.onclick = function() {\r\n obj.close();\r\n }\r\n controls.appendChild(caption);\r\n controls.appendChild(close);\r\n }\r\n\r\n obj.updateCounter = function(index) {\r\n for (var i = 0; i < counter.children.length; i ++) {\r\n if (counter.children[i].classList.contains('jslider-counter-focus')) {\r\n counter.children[i].classList.remove('jslider-counter-focus');\r\n break;\r\n }\r\n }\r\n counter.children[index].classList.add('jslider-counter-focus');\r\n }\r\n\r\n obj.show = function(target) {\r\n if (! target) {\r\n var target = el.children[0];\r\n }\r\n\r\n // Focus element\r\n el.classList.add('jslider-focus');\r\n el.classList.remove('jslider-grid');\r\n el.appendChild(controls);\r\n el.appendChild(counter);\r\n\r\n // Update counter\r\n var index = obj.options.items.indexOf(target);\r\n obj.updateCounter(index);\r\n\r\n // Remove display\r\n for (var i = 0; i < el.children.length; i++) {\r\n el.children[i].style.display = '';\r\n }\r\n target.style.display = 'block';\r\n\r\n // Is there any previous\r\n if (target.previousElementSibling) {\r\n el.classList.add('jslider-left');\r\n } else {\r\n el.classList.remove('jslider-left');\r\n }\r\n\r\n // Is there any next\r\n if (target.nextElementSibling && target.nextElementSibling.tagName == 'IMG') {\r\n el.classList.add('jslider-right');\r\n } else {\r\n el.classList.remove('jslider-right');\r\n }\r\n\r\n obj.currentImage = target;\r\n\r\n // Vertical image\r\n if (obj.currentImage.offsetHeight > obj.currentImage.offsetWidth) {\r\n obj.currentImage.classList.add('jslider-vertical');\r\n }\r\n\r\n controls.children[0].innerText = obj.currentImage.getAttribute('title');\r\n }\r\n\r\n obj.open = function() {\r\n obj.show();\r\n\r\n // Event\r\n if (typeof(obj.options.onopen) == 'function') {\r\n obj.options.onopen(el);\r\n }\r\n }\r\n\r\n obj.close = function() {\r\n // Remove control classes\r\n el.classList.remove('jslider-focus');\r\n el.classList.remove('jslider-left');\r\n el.classList.remove('jslider-right');\r\n // Show as a grid depending on the configuration\r\n if (obj.options.grid) {\r\n el.classList.add('jslider-grid');\r\n }\r\n // Remove display\r\n for (var i = 0; i < el.children.length; i++) {\r\n el.children[i].style.display = '';\r\n }\r\n // Remove controls from the component\r\n counter.remove();\r\n controls.remove();\r\n // Current image\r\n obj.currentImage = null;\r\n // Event\r\n if (typeof(obj.options.onclose) == 'function') {\r\n obj.options.onclose(el);\r\n }\r\n }\r\n\r\n obj.reset = function() {\r\n el.innerHTML = '';\r\n }\r\n\r\n obj.next = function() {\r\n var nextImage = obj.currentImage.nextElementSibling;\r\n if (nextImage && nextImage.tagName === 'IMG') {\r\n obj.show(obj.currentImage.nextElementSibling);\r\n }\r\n }\r\n \r\n obj.prev = function() {\r\n if (obj.currentImage.previousElementSibling) {\r\n obj.show(obj.currentImage.previousElementSibling);\r\n }\r\n }\r\n\r\n var mouseUp = function(e) {\r\n // Open slider\r\n if (e.target.tagName == 'IMG') {\r\n obj.show(e.target);\r\n } else if (! e.target.classList.contains('jslider-close') && ! (e.target.parentNode.classList.contains('jslider-counter') || e.target.classList.contains('jslider-counter'))){\r\n // Arrow controls\r\n var offsetX = e.offsetX || e.changedTouches[0].clientX;\r\n if (e.target.clientWidth - offsetX < 40) {\r\n // Show next image\r\n obj.next();\r\n } else if (offsetX < 40) {\r\n // Show previous image\r\n obj.prev();\r\n }\r\n }\r\n }\r\n\r\n if ('ontouchend' in document.documentElement === true) {\r\n el.addEventListener('touchend', mouseUp);\r\n } else {\r\n el.addEventListener('mouseup', mouseUp);\r\n }\r\n\r\n // Add global events\r\n el.addEventListener(\"swipeleft\", function(e) {\r\n obj.next();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n el.addEventListener(\"swiperight\", function(e) {\r\n obj.prev();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n el.addEventListener('keydown', function(e) {\r\n if (e.which == 27) {\r\n obj.close();\r\n }\r\n });\r\n\r\n el.slider = obj;\r\n\r\n return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/tags.js\n\r\n\r\n\r\n\r\nfunction Tags(el, options) {\r\n // Redefine configuration\r\n if (el.tags) {\r\n return el.tags.setOptions(options, true);\r\n }\r\n\r\n var obj = { type:'tags' };\r\n obj.options = {};\r\n\r\n // Limit\r\n var limit = function() {\r\n return obj.options.limit && el.children.length >= obj.options.limit ? true : false;\r\n }\r\n\r\n // Search helpers\r\n var search = null;\r\n var searchContainer = null;\r\n\r\n obj.setOptions = function(options, reset) {\r\n /**\r\n * @typedef {Object} defaults\r\n * @property {(string|Array)} value - Initial value of the compontent\r\n * @property {number} limit - Max number of tags inside the element\r\n * @property {string} search - The URL for suggestions\r\n * @property {string} placeholder - The default instruction text on the element\r\n * @property {validation} validation - Method to validate the tags\r\n * @property {requestCallback} onbeforechange - Method to be execute before any changes on the element\r\n * @property {requestCallback} onchange - Method to be execute after any changes on the element\r\n * @property {requestCallback} onfocus - Method to be execute when on focus\r\n * @property {requestCallback} onblur - Method to be execute when on blur\r\n * @property {requestCallback} onload - Method to be execute when the element is loaded\r\n */\r\n var defaults = {\r\n value: '',\r\n limit: null,\r\n search: null,\r\n placeholder: null,\r\n validation: null,\r\n onbeforepaste: null,\r\n onbeforechange: null,\r\n onremoveitem: null,\r\n onlimit: null,\r\n onchange: null,\r\n onfocus: null,\r\n onblur: null,\r\n onload: null,\r\n }\r\n\r\n // Loop through though the default configuration\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n }\r\n\r\n // Placeholder\r\n if (obj.options.placeholder) {\r\n el.setAttribute('data-placeholder', obj.options.placeholder);\r\n } else {\r\n el.removeAttribute('data-placeholder');\r\n }\r\n el.placeholder = obj.options.placeholder;\r\n\r\n // Update value\r\n obj.setValue(obj.options.value);\r\n\r\n // Validate items\r\n filter();\r\n\r\n // Create search box\r\n if (obj.options.search) {\r\n if (! searchContainer) {\r\n searchContainer = document.createElement('div');\r\n el.parentNode.insertBefore(searchContainer, el.nextSibling);\r\n\r\n // Create container\r\n search = Search(searchContainer, {\r\n data: obj.options.search,\r\n onselect: function(a,b,c) {\r\n obj.selectIndex(b,c);\r\n }\r\n });\r\n }\r\n } else {\r\n if (searchContainer) {\r\n search = null;\r\n searchContainer.remove();\r\n searchContainer = null;\r\n }\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * Add a new tag to the element\r\n * @param {(?string|Array)} value - The value of the new element\r\n */\r\n obj.add = function(value, focus) {\r\n if (typeof(obj.options.onbeforechange) == 'function') {\r\n var ret = obj.options.onbeforechange(el, obj, obj.options.value, value);\r\n if (ret === false) {\r\n return false;\r\n } else { \r\n if (ret != null) {\r\n value = ret;\r\n }\r\n }\r\n }\r\n\r\n // Make sure search is closed\r\n if (search) {\r\n search.close();\r\n }\r\n\r\n if (limit()) {\r\n if (typeof(obj.options.onlimit) == 'function') {\r\n obj.options.onlimit(obj, obj.options.limit);\r\n } else {\r\n alert(dictionary.translate('You reach the limit number of entries') + ' ' + obj.options.limit);\r\n }\r\n } else {\r\n // Get node\r\n var node = helpers.getNode();\r\n\r\n if (node && node.parentNode && node.parentNode.classList.contains('jtags') &&\r\n node.nextSibling && (! (node.nextSibling.innerText && node.nextSibling.innerText.trim()))) {\r\n div = node.nextSibling;\r\n } else {\r\n // Remove not used last item\r\n if (el.lastChild) {\r\n if (! el.lastChild.innerText.trim()) {\r\n el.removeChild(el.lastChild);\r\n }\r\n }\r\n\r\n // Mix argument string or array\r\n if (! value || typeof(value) == 'string') {\r\n var div = createElement(value, value, node);\r\n } else {\r\n for (var i = 0; i <= value.length; i++) {\r\n if (! limit()) {\r\n if (! value[i] || typeof(value[i]) == 'string') {\r\n var t = value[i] || '';\r\n var v = null;\r\n } else {\r\n var t = value[i].text;\r\n var v = value[i].value;\r\n }\r\n\r\n // Add element\r\n var div = createElement(t, v);\r\n }\r\n }\r\n }\r\n\r\n // Change\r\n change();\r\n }\r\n\r\n // Place caret\r\n if (focus) {\r\n setFocus(div);\r\n }\r\n }\r\n }\r\n\r\n obj.setLimit = function(limit) {\r\n obj.options.limit = limit;\r\n var n = el.children.length - limit;\r\n while (el.children.length > limit) {\r\n el.removeChild(el.lastChild);\r\n }\r\n }\r\n\r\n // Remove a item node\r\n obj.remove = function(node) {\r\n // Remove node\r\n node.parentNode.removeChild(node);\r\n // Make sure element is not blank\r\n if (! el.children.length) {\r\n obj.add('', true);\r\n } else {\r\n change();\r\n }\r\n\r\n if (typeof(obj.options.onremoveitem) == 'function') {\r\n obj.options.onremoveitem(el, obj, node);\r\n }\r\n }\r\n\r\n /**\r\n * Get all tags in the element\r\n * @return {Array} data - All tags as an array\r\n */\r\n obj.getData = function() {\r\n var data = [];\r\n for (var i = 0; i < el.children.length; i++) {\r\n // Get value\r\n var text = el.children[i].innerText.replace(\"\\n\", \"\");\r\n // Get id\r\n var value = el.children[i].getAttribute('data-value');\r\n if (! value) {\r\n value = text;\r\n }\r\n // Item\r\n if (text || value) {\r\n data.push({ text: text, value: value });\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n /**\r\n * Get the value of one tag. Null for all tags\r\n * @param {?number} index - Tag index number. Null for all tags.\r\n * @return {string} value - All tags separated by comma\r\n */\r\n obj.getValue = function(index) {\r\n var value = null;\r\n\r\n if (index != null) {\r\n // Get one individual value\r\n value = el.children[index].getAttribute('data-value');\r\n if (! value) {\r\n value = el.children[index].innerText.replace(\"\\n\", \"\");\r\n }\r\n } else {\r\n // Get all\r\n var data = [];\r\n for (var i = 0; i < el.children.length; i++) {\r\n value = el.children[i].innerText.replace(\"\\n\", \"\");\r\n if (value) {\r\n data.push(obj.getValue(i));\r\n }\r\n }\r\n value = data.join(',');\r\n }\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * Set the value of the element based on a string separeted by (,|;|\\r\\n)\r\n * @param {mixed} value - A string or array object with values\r\n */\r\n obj.setValue = function(mixed) {\r\n if (! mixed) {\r\n obj.reset();\r\n } else {\r\n if (el.value != mixed) {\r\n if (Array.isArray(mixed)) {\r\n obj.add(mixed);\r\n } else {\r\n // Remove whitespaces\r\n var text = (''+mixed).trim();\r\n // Tags\r\n var data = extractTags(text);\r\n // Reset\r\n el.innerHTML = '';\r\n // Add tags to the element\r\n obj.add(data);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Reset the data from the element\r\n */\r\n obj.reset = function() {\r\n // Empty class\r\n el.classList.add('jtags-empty');\r\n // Empty element\r\n el.innerHTML = '
';\r\n // Execute changes\r\n change();\r\n }\r\n\r\n /**\r\n * Verify if all tags in the element are valid\r\n * @return {boolean}\r\n */\r\n obj.isValid = function() {\r\n var test = 0;\r\n for (var i = 0; i < el.children.length; i++) {\r\n if (el.children[i].classList.contains('jtags_error')) {\r\n test++;\r\n }\r\n }\r\n return test == 0 ? true : false;\r\n }\r\n\r\n /**\r\n * Add one element from the suggestions to the element\r\n * @param {object} item - Node element in the suggestions container\r\n */ \r\n obj.selectIndex = function(text, value) {\r\n var node = helpers.getNode();\r\n if (node) {\r\n // Append text to the caret\r\n node.innerText = text;\r\n // Set node id\r\n if (value) {\r\n node.setAttribute('data-value', value);\r\n }\r\n // Remove any error\r\n node.classList.remove('jtags_error');\r\n if (! limit()) {\r\n // Add new item\r\n obj.add('', true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Search for suggestions\r\n * @param {object} node - Target node for any suggestions\r\n */\r\n obj.search = function(node) {\r\n // Search for\r\n var terms = node.innerText;\r\n }\r\n\r\n // Destroy tags element\r\n obj.destroy = function() {\r\n // Bind events\r\n el.removeEventListener('mouseup', tagsMouseUp);\r\n el.removeEventListener('keydown', tagsKeyDown);\r\n el.removeEventListener('keyup', tagsKeyUp);\r\n el.removeEventListener('paste', tagsPaste);\r\n el.removeEventListener('focus', tagsFocus);\r\n el.removeEventListener('blur', tagsBlur);\r\n\r\n // Remove element\r\n el.parentNode.removeChild(el);\r\n }\r\n\r\n var setFocus = function(node) {\r\n if (el.children.length) {\r\n var range = document.createRange();\r\n var sel = window.getSelection();\r\n if (! node) {\r\n var node = el.childNodes[el.childNodes.length-1];\r\n }\r\n range.setStart(node, node.length)\r\n range.collapse(true)\r\n sel.removeAllRanges()\r\n sel.addRange(range)\r\n el.scrollLeft = el.scrollWidth;\r\n }\r\n }\r\n\r\n var createElement = function(label, value, node) {\r\n var div = document.createElement('div');\r\n div.textContent = label ? label : '';\r\n if (value) {\r\n div.setAttribute('data-value', value);\r\n }\r\n\r\n if (node && node.parentNode.classList.contains('jtags')) {\r\n el.insertBefore(div, node.nextSibling);\r\n } else {\r\n el.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n\r\n var change = function() {\r\n // Value\r\n var value = obj.getValue();\r\n\r\n if (value != obj.options.value) {\r\n obj.options.value = value;\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, obj, obj.options.value);\r\n }\r\n\r\n // Lemonade JS\r\n if (el.value != obj.options.value) {\r\n el.value = obj.options.value;\r\n if (typeof(el.oninput) == 'function') {\r\n el.oninput({\r\n type: 'input',\r\n target: el,\r\n value: el.value\r\n });\r\n }\r\n }\r\n }\r\n\r\n filter();\r\n }\r\n\r\n /**\r\n * Filter tags\r\n */\r\n var filter = function() {\r\n for (var i = 0; i < el.children.length; i++) {\r\n if (el.children[i].tagName === 'DIV') {\r\n // Create label design\r\n if (!obj.getValue(i)) {\r\n el.children[i].classList.remove('jtags_label');\r\n } else {\r\n el.children[i].classList.add('jtags_label');\r\n\r\n // Validation in place\r\n if (typeof (obj.options.validation) == 'function') {\r\n if (obj.getValue(i)) {\r\n if (!obj.options.validation(el.children[i], el.children[i].innerText, el.children[i].getAttribute('data-value'))) {\r\n el.children[i].classList.add('jtags_error');\r\n } else {\r\n el.children[i].classList.remove('jtags_error');\r\n }\r\n } else {\r\n el.children[i].classList.remove('jtags_error');\r\n }\r\n } else {\r\n el.children[i].classList.remove('jtags_error');\r\n }\r\n }\r\n }\r\n }\r\n\r\n isEmpty();\r\n }\r\n\r\n var isEmpty = function() {\r\n // Can't be empty\r\n if (! el.innerText.trim()) {\r\n if (! el.children.length || el.children[0].tagName === 'BR') {\r\n el.innerHTML = '';\r\n setFocus(createElement());\r\n }\r\n } else {\r\n el.classList.remove('jtags-empty');\r\n }\r\n }\r\n\r\n /**\r\n * Extract tags from a string\r\n * @param {string} text - Raw string\r\n * @return {Array} data - Array with extracted tags\r\n */\r\n var extractTags = function(text) {\r\n /** @type {Array} */\r\n var data = [];\r\n\r\n /** @type {string} */\r\n var word = '';\r\n\r\n // Remove whitespaces\r\n text = text.trim();\r\n\r\n if (text) {\r\n for (var i = 0; i < text.length; i++) {\r\n if (text[i] == ',' || text[i] == ';' || text[i] == '\\n') {\r\n if (word) {\r\n data.push(word.trim());\r\n word = '';\r\n }\r\n } else {\r\n word += text[i];\r\n }\r\n }\r\n\r\n if (word) {\r\n data.push(word);\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /** @type {number} */\r\n var anchorOffset = 0;\r\n\r\n /**\r\n * Processing event keydown on the element\r\n * @param e {object}\r\n */\r\n var tagsKeyDown = function(e) {\r\n // Anchoroffset\r\n anchorOffset = window.getSelection().anchorOffset;\r\n\r\n // Verify if is empty\r\n isEmpty();\r\n\r\n // Comma\r\n if (e.key === 'Tab' || e.key === ';' || e.key === ',') {\r\n var n = window.getSelection().anchorOffset;\r\n if (n > 1) {\r\n if (limit()) {\r\n if (typeof(obj.options.onlimit) == 'function') {\r\n obj.options.onlimit(obj, obj.options.limit)\r\n }\r\n } else {\r\n obj.add('', true);\r\n }\r\n }\r\n e.preventDefault();\r\n } else if (e.key == 'Enter') {\r\n if (! search || ! search.isOpened()) {\r\n var n = window.getSelection().anchorOffset;\r\n if (n > 1) {\r\n if (! limit()) {\r\n obj.add('', true);\r\n }\r\n }\r\n e.preventDefault();\r\n }\r\n } else if (e.key == 'Backspace') {\r\n // Back space - do not let last item to be removed\r\n if (el.children.length == 1 && window.getSelection().anchorOffset < 1) {\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n // Search events\r\n if (search) {\r\n search.keydown(e);\r\n }\r\n\r\n // Verify if is empty\r\n isEmpty();\r\n }\r\n\r\n /**\r\n * Processing event keyup on the element\r\n * @param e {object}\r\n */\r\n var tagsKeyUp = function(e) {\r\n if (e.which == 39) {\r\n // Right arrow\r\n var n = window.getSelection().anchorOffset;\r\n if (n > 1 && n == anchorOffset) {\r\n obj.add('', true);\r\n }\r\n } else if (e.which == 13 || e.which == 38 || e.which == 40) {\r\n e.preventDefault();\r\n } else {\r\n if (search) {\r\n search.keyup(e);\r\n }\r\n }\r\n\r\n filter();\r\n }\r\n\r\n /**\r\n * Processing event paste on the element\r\n * @param e {object}\r\n */\r\n var tagsPaste = function(e) {\r\n if (e.clipboardData || e.originalEvent.clipboardData) {\r\n var text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n } else if (window.clipboardData) {\r\n var text = window.clipboardData.getData('Text');\r\n }\r\n\r\n var data = extractTags(text);\r\n\r\n if (typeof(obj.options.onbeforepaste) == 'function') {\r\n var ret = obj.options.onbeforepaste(el, obj, data);\r\n if (ret === false) {\r\n e.preventDefault();\r\n return false;\r\n } else {\r\n if (ret) {\r\n data = ret;\r\n }\r\n }\r\n }\r\n\r\n if (data.length > 1) {\r\n obj.add(data, true);\r\n e.preventDefault();\r\n } else if (data[0]) {\r\n document.execCommand('insertText', false, data[0])\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Processing event mouseup on the element\r\n * @param e {object}\r\n */\r\n var tagsMouseUp = function(e) {\r\n if (e.target.parentNode && e.target.parentNode.classList.contains('jtags')) {\r\n if (e.target.classList.contains('jtags_label') || e.target.classList.contains('jtags_error')) {\r\n var rect = e.target.getBoundingClientRect();\r\n if (rect.width - (e.clientX - rect.left) < 16) {\r\n obj.remove(e.target);\r\n }\r\n }\r\n }\r\n\r\n // Set focus in the last item\r\n if (e.target == el) {\r\n setFocus();\r\n }\r\n }\r\n\r\n var tagsFocus = function() {\r\n if (! el.classList.contains('jtags-focus')) {\r\n if (! el.children.length || obj.getValue(el.children.length - 1)) {\r\n if (! limit()) {\r\n createElement('');\r\n }\r\n }\r\n\r\n if (typeof(obj.options.onfocus) == 'function') {\r\n obj.options.onfocus(el, obj, obj.getValue());\r\n }\r\n\r\n el.classList.add('jtags-focus');\r\n }\r\n }\r\n\r\n var tagsBlur = function() {\r\n if (el.classList.contains('jtags-focus')) {\r\n if (search) {\r\n search.close();\r\n }\r\n\r\n for (var i = 0; i < el.children.length - 1; i++) {\r\n // Create label design\r\n if (! obj.getValue(i)) {\r\n el.removeChild(el.children[i]);\r\n }\r\n }\r\n\r\n change();\r\n\r\n el.classList.remove('jtags-focus');\r\n\r\n if (typeof(obj.options.onblur) == 'function') {\r\n obj.options.onblur(el, obj, obj.getValue());\r\n }\r\n }\r\n }\r\n\r\n var init = function() {\r\n // Bind events\r\n if ('touchend' in document.documentElement === true) {\r\n el.addEventListener('touchend', tagsMouseUp);\r\n } else {\r\n el.addEventListener('mouseup', tagsMouseUp);\r\n }\r\n\r\n el.addEventListener('keydown', tagsKeyDown);\r\n el.addEventListener('keyup', tagsKeyUp);\r\n el.addEventListener('paste', tagsPaste);\r\n el.addEventListener('focus', tagsFocus);\r\n el.addEventListener('blur', tagsBlur);\r\n\r\n // Editable\r\n el.setAttribute('contenteditable', true);\r\n\r\n // Prepare container\r\n el.classList.add('jtags');\r\n\r\n // Initial options\r\n obj.setOptions(options);\r\n\r\n if (typeof(obj.options.onload) == 'function') {\r\n obj.options.onload(el, obj);\r\n }\r\n\r\n // Change methods\r\n el.change = obj.setValue;\r\n\r\n // Global generic value handler\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return obj.getValue();\r\n } else {\r\n obj.setValue(val);\r\n }\r\n }\r\n\r\n el.tags = obj;\r\n }\r\n\r\n init();\r\n\r\n return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/upload.js\n\r\n\r\n\r\n\r\nfunction Upload(el, options) {\r\n var obj = {};\r\n obj.options = {};\r\n\r\n // Default configuration\r\n var defaults = {\r\n type: 'image',\r\n extension: '*',\r\n input: false,\r\n minWidth: false,\r\n maxWidth: null,\r\n maxHeight: null,\r\n maxJpegSizeBytes: null, // For example, 350Kb would be 350000\r\n onchange: null,\r\n multiple: false,\r\n remoteParser: null,\r\n };\r\n\r\n // Loop through our object\r\n for (var property in defaults) {\r\n if (options && options.hasOwnProperty(property)) {\r\n obj.options[property] = options[property];\r\n } else {\r\n obj.options[property] = defaults[property];\r\n }\r\n }\r\n\r\n // Multiple\r\n if (obj.options.multiple == true) {\r\n el.setAttribute('data-multiple', true);\r\n }\r\n\r\n // Container\r\n el.content = [];\r\n\r\n // Upload icon\r\n el.classList.add('jupload');\r\n\r\n if (obj.options.input == true) {\r\n el.classList.add('input');\r\n }\r\n\r\n obj.add = function(data) {\r\n // Reset container for single files\r\n if (obj.options.multiple == false) {\r\n el.content = [];\r\n el.innerText = '';\r\n }\r\n\r\n // Append to the element\r\n if (obj.options.type == 'image') {\r\n var img = document.createElement('img');\r\n img.setAttribute('src', data.file);\r\n img.setAttribute('tabindex', -1);\r\n if (! el.getAttribute('name')) {\r\n img.className = 'jfile';\r\n img.content = data;\r\n }\r\n el.appendChild(img);\r\n } else {\r\n if (data.name) {\r\n var name = data.name;\r\n } else {\r\n var name = data.file;\r\n }\r\n var div = document.createElement('div');\r\n div.innerText = name || obj.options.type;\r\n div.classList.add('jupload-item');\r\n div.setAttribute('tabindex', -1);\r\n el.appendChild(div);\r\n }\r\n\r\n if (data.content) {\r\n data.file = helpers.guid();\r\n }\r\n\r\n // Push content\r\n el.content.push(data);\r\n\r\n // Onchange\r\n if (typeof(obj.options.onchange) == 'function') {\r\n obj.options.onchange(el, data);\r\n }\r\n }\r\n\r\n obj.addFromFile = function(file) {\r\n var type = file.type.split('/');\r\n if (type[0] == obj.options.type) {\r\n var readFile = new FileReader();\r\n readFile.addEventListener(\"load\", function (v) {\r\n var data = {\r\n file: v.srcElement.result,\r\n extension: file.name.substr(file.name.lastIndexOf('.') + 1),\r\n name: file.name,\r\n size: file.size,\r\n lastmodified: file.lastModified,\r\n content: v.srcElement.result,\r\n }\r\n\r\n obj.add(data);\r\n });\r\n\r\n readFile.readAsDataURL(file);\r\n } else {\r\n alert(dictionary.translate('This extension is not allowed'));\r\n }\r\n }\r\n\r\n obj.addFromUrl = function(src) {\r\n if (src.substr(0,4) != 'data' && ! obj.options.remoteParser) {\r\n console.error('remoteParser not defined in your initialization');\r\n } else {\r\n // This is to process cross domain images\r\n if (src.substr(0,4) == 'data') {\r\n var extension = src.split(';')\r\n extension = extension[0].split('/');\r\n var type = extension[0].replace('data:','');\r\n if (type == obj.options.type) {\r\n var data = {\r\n file: src,\r\n name: '',\r\n extension: extension[1],\r\n content: src,\r\n }\r\n obj.add(data);\r\n } else {\r\n alert(obj.options.text.extensionNotAllowed);\r\n }\r\n } else {\r\n var extension = src.substr(src.lastIndexOf('.') + 1);\r\n // Work for cross browsers\r\n src = obj.options.remoteParser + src;\r\n // Get remove content\r\n ajax({\r\n url: src,\r\n type: 'GET',\r\n dataType: 'blob',\r\n success: function(data) {\r\n //add(extension[0].replace('data:',''), data);\r\n }\r\n })\r\n }\r\n }\r\n }\r\n\r\n var getDataURL = function(canvas, type) {\r\n var compression = 0.92;\r\n var lastContentLength = null;\r\n var content = canvas.toDataURL(type, compression);\r\n while (obj.options.maxJpegSizeBytes && type === 'image/jpeg' &&\r\n content.length > obj.options.maxJpegSizeBytes && content.length !== lastContentLength) {\r\n // Apply the compression\r\n compression *= 0.9;\r\n lastContentLength = content.length;\r\n content = canvas.toDataURL(type, compression);\r\n }\r\n return content;\r\n }\r\n\r\n var mime = obj.options.type + '/' + obj.options.extension;\r\n var input = document.createElement('input');\r\n input.type = 'file';\r\n input.setAttribute('accept', mime);\r\n input.onchange = function() {\r\n for (var i = 0; i < this.files.length; i++) {\r\n obj.addFromFile(this.files[i]);\r\n }\r\n }\r\n\r\n // Allow multiple files\r\n if (obj.options.multiple == true) {\r\n input.setAttribute('multiple', true);\r\n }\r\n\r\n var current = null;\r\n\r\n el.addEventListener(\"click\", function(e) {\r\n current = null;\r\n if (! el.children.length || e.target === el) {\r\n helpers.click(input);\r\n } else {\r\n if (e.target.parentNode == el) {\r\n current = e.target;\r\n }\r\n }\r\n });\r\n\r\n el.addEventListener(\"dblclick\", function(e) {\r\n helpers.click(input);\r\n });\r\n\r\n el.addEventListener('dragenter', function(e) {\r\n el.style.border = '1px dashed #000';\r\n });\r\n\r\n el.addEventListener('dragleave', function(e) {\r\n el.style.border = '1px solid #eee';\r\n });\r\n\r\n el.addEventListener('dragstop', function(e) {\r\n el.style.border = '1px solid #eee';\r\n });\r\n\r\n el.addEventListener('dragover', function(e) {\r\n e.preventDefault();\r\n });\r\n\r\n el.addEventListener('keydown', function(e) {\r\n if (current && e.which == 46) {\r\n var index = Array.prototype.indexOf.call(el.children, current);\r\n if (index >= 0) {\r\n el.content.splice(index, 1);\r\n current.remove();\r\n current = null;\r\n }\r\n }\r\n });\r\n\r\n el.addEventListener('drop', function(e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n var html = (e.originalEvent || e).dataTransfer.getData('text/html');\r\n var file = (e.originalEvent || e).dataTransfer.files;\r\n\r\n if (file.length) {\r\n for (var i = 0; i < e.dataTransfer.files.length; i++) {\r\n obj.addFromFile(e.dataTransfer.files[i]);\r\n }\r\n } else if (html) {\r\n if (obj.options.multiple == false) {\r\n el.innerText = '';\r\n }\r\n\r\n // Create temp element\r\n var div = document.createElement('div');\r\n div.innerHTML = html;\r\n\r\n // Extract images\r\n var img = div.querySelectorAll('img');\r\n\r\n if (img.length) {\r\n for (var i = 0; i < img.length; i++) {\r\n obj.addFromUrl(img[i].src);\r\n }\r\n }\r\n }\r\n\r\n el.style.border = '1px solid #eee';\r\n\r\n return false;\r\n });\r\n\r\n el.val = function(val) {\r\n if (val === undefined) {\r\n return el.content && el.content.length ? el.content : null;\r\n } else {\r\n // Reset\r\n el.innerText = '';\r\n el.content = [];\r\n\r\n if (val) {\r\n if (Array.isArray(val)) {\r\n for (var i = 0; i < val.length; i++) {\r\n if (typeof(val[i]) == 'string') {\r\n obj.add({ file: val[i] });\r\n } else {\r\n obj.add(val[i]);\r\n }\r\n }\r\n } else if (typeof(val) == 'string') {\r\n obj.add({ file: val });\r\n }\r\n }\r\n }\r\n }\r\n\r\n el.upload = el.image = obj;\r\n\r\n return obj;\r\n}\r\n\n// EXTERNAL MODULE: ./packages/sha512/sha512.js\nvar sha512 = __webpack_require__(195);\nvar sha512_default = /*#__PURE__*/__webpack_require__.n(sha512);\n;// CONCATENATED MODULE: ./src/jsuites.js\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nvar jsuites_jSuites = {\r\n // Helpers\r\n ...dictionary,\r\n ...helpers,\r\n /** Current version */\r\n version: '5.8.1',\r\n /** Bind new extensions to Jsuites */\r\n setExtensions: function(o) {\r\n if (typeof(o) == 'object') {\r\n var k = Object.keys(o);\r\n for (var i = 0; i < k.length; i++) {\r\n jsuites_jSuites[k[i]] = o[k[i]];\r\n }\r\n }\r\n },\r\n tracking: tracking,\r\n path: Path,\r\n sorting: Sorting,\r\n lazyLoading: LazyLoading,\r\n // Plugins\r\n ajax: ajax,\r\n animation: animation,\r\n calendar: calendar,\r\n color: Color,\r\n contextmenu: contextmenu,\r\n dropdown: dropdown,\r\n editor: editor,\r\n floating: floating,\r\n form: plugins_form,\r\n mask: mask,\r\n modal: modal,\r\n notification: notification,\r\n palette: palette,\r\n picker: Picker,\r\n progressbar: Progressbar,\r\n rating: Rating,\r\n search: Search,\r\n slider: Slider,\r\n tabs: Tabs,\r\n tags: Tags,\r\n toolbar: Toolbar,\r\n upload: Upload,\r\n validations: validations,\r\n}\r\n\r\n// Legacy\r\njsuites_jSuites.image = Upload;\r\njsuites_jSuites.image.create = function(data) {\r\n var img = document.createElement('img');\r\n img.setAttribute('src', data.file);\r\n img.className = 'jfile';\r\n img.setAttribute('tabindex', -1);\r\n img.content = data;\r\n\r\n return img;\r\n}\r\n\r\njsuites_jSuites.tracker = plugins_form;\r\njsuites_jSuites.loading = animation.loading;\r\njsuites_jSuites.sha512 = (sha512_default());\r\n\r\n\r\n/** Core events */\r\nconst Events = function() {\r\n\r\n if (typeof(window['jSuitesStateControl']) === 'undefined') {\r\n window['jSuitesStateControl'] = [];\r\n } else {\r\n // Do nothing\r\n return;\r\n }\r\n\r\n const find = function(DOMElement, component) {\r\n if (DOMElement[component.type] && DOMElement[component.type] == component) {\r\n return true;\r\n }\r\n if (DOMElement.component && DOMElement.component == component) {\r\n return true;\r\n }\r\n if (DOMElement.parentNode) {\r\n return find(DOMElement.parentNode, component);\r\n }\r\n return false;\r\n }\r\n\r\n const isOpened = function(e) {\r\n let state = window['jSuitesStateControl'];\r\n if (state && state.length > 0) {\r\n for (let i = 0; i < state.length; i++) {\r\n if (state[i] && ! find(e, state[i])) {\r\n state[i].close();\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Width of the border\r\n let cornerSize = 15;\r\n\r\n // Current element\r\n let element = null;\r\n\r\n // Controllers\r\n let editorAction = false;\r\n\r\n // Event state\r\n let state = {\r\n x: null,\r\n y: null,\r\n }\r\n\r\n // Tooltip element\r\n let tooltip = document.createElement('div')\r\n tooltip.classList.add('jtooltip');\r\n\r\n const isWebcomponent = function(e) {\r\n return e && (e.shadowRoot || (e.tagName && e.tagName.includes('-')));\r\n }\r\n\r\n const getElement = function(e) {\r\n let d;\r\n let element;\r\n // Which component I am clicking\r\n let path = e.path || (e.composedPath && e.composedPath());\r\n\r\n // If path available get the first element in the chain\r\n if (path) {\r\n element = path[0];\r\n // Adjustment sales force\r\n if (element && isWebcomponent(element) && ! element.shadowRoot && e.toElement) {\r\n element = e.toElement;\r\n }\r\n } else {\r\n // Try to guess using the coordinates\r\n if (e.target && isWebcomponent(e.target)) {\r\n d = e.target.shadowRoot;\r\n } else {\r\n d = document;\r\n }\r\n // Get the first target element\r\n element = d.elementFromPoint(x, y);\r\n }\r\n return element;\r\n }\r\n\r\n // Events\r\n const mouseDown = function(e) {\r\n // Verify current components tracking\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n var x = e.changedTouches[0].clientX;\r\n var y = e.changedTouches[0].clientY;\r\n } else {\r\n var x = e.clientX;\r\n var y = e.clientY;\r\n }\r\n\r\n let element = getElement(e);\r\n // Editable\r\n let editable = element && element.tagName === 'DIV' && element.getAttribute('contentEditable');\r\n // Check if this is the floating\r\n let item = jsuites_jSuites.findElement(element, 'jpanel');\r\n // Jfloating found\r\n if (item && ! item.classList.contains(\"readonly\") && ! editable) {\r\n // Keep the tracking information\r\n let rect = item.getBoundingClientRect();\r\n let angle = 0;\r\n if (item.style.rotate) {\r\n // Extract the angle value from the match and convert it to a number\r\n angle = parseFloat(item.style.rotate);\r\n }\r\n let action = 'move';\r\n if (element.getAttribute('data-action')) {\r\n action = element.getAttribute('data-action');\r\n } else {\r\n if (item.style.cursor) {\r\n action = 'resize';\r\n } else {\r\n item.style.cursor = 'move';\r\n }\r\n }\r\n\r\n // Action\r\n editorAction = {\r\n action: action,\r\n a: angle,\r\n e: item,\r\n x: x,\r\n y: y,\r\n l: rect.left,\r\n t: rect.top,\r\n b: rect.bottom,\r\n r: rect.right,\r\n w: rect.width,\r\n h: rect.height,\r\n d: item.style.cursor,\r\n actioned: false,\r\n }\r\n // Make sure width and height styling is OK\r\n if (! item.style.width) {\r\n item.style.width = rect.width + 'px';\r\n }\r\n if (! item.style.height) {\r\n item.style.height = rect.height + 'px';\r\n }\r\n } else {\r\n // No floating action found\r\n editorAction = false;\r\n }\r\n\r\n isOpened(element);\r\n\r\n focus(e);\r\n }\r\n\r\n const calculateAngle = function(x1, y1, x2, y2, x3, y3) {\r\n // Calculate dx and dy for the first line\r\n const dx1 = x2 - x1;\r\n const dy1 = y2 - y1;\r\n // Calculate dx and dy for the second line\r\n const dx2 = x3 - x1;\r\n const dy2 = y3 - y1;\r\n // Calculate the angle for the first line\r\n let angle1 = Math.atan2(dy1, dx1);\r\n // Calculate the angle for the second line\r\n let angle2 = Math.atan2(dy2, dx2);\r\n // Calculate the angle difference in radians\r\n let angleDifference = angle2 - angle1;\r\n // Convert the angle difference to degrees\r\n angleDifference = angleDifference * (180 / Math.PI);\r\n // Normalize the angle difference to be within [0, 360) degrees\r\n if (angleDifference < 0) {\r\n angleDifference += 360;\r\n }\r\n return angleDifference;\r\n }\r\n\r\n const mouseUp = function(e) {\r\n if (editorAction && editorAction.e) {\r\n if (typeof(editorAction.e.refresh) == 'function' && state.actioned) {\r\n editorAction.e.refresh();\r\n }\r\n editorAction.e.style.cursor = '';\r\n }\r\n\r\n // Reset\r\n state = {\r\n x: null,\r\n y: null,\r\n }\r\n\r\n editorAction = false;\r\n }\r\n\r\n const mouseMove = function(e) {\r\n if (editorAction) {\r\n let x = e.clientX || e.pageX;\r\n let y = e.clientY || e.pageY;\r\n\r\n if (state.x == null && state.y == null) {\r\n state.x = x;\r\n state.y = y;\r\n }\r\n\r\n // Action on going\r\n if (editorAction.action === 'move') {\r\n var dx = x - state.x;\r\n var dy = y - state.y;\r\n var top = editorAction.e.offsetTop + dy;\r\n var left = editorAction.e.offsetLeft + dx;\r\n\r\n // Update position\r\n editorAction.e.style.top = top + 'px';\r\n editorAction.e.style.left = left + 'px';\r\n\r\n // Update element\r\n if (typeof (editorAction.e.refresh) == 'function') {\r\n state.actioned = true;\r\n editorAction.e.refresh('position', top, left);\r\n }\r\n } else if (editorAction.action === 'rotate') {\r\n let ox = editorAction.l+editorAction.w/2;\r\n let oy = editorAction.t+editorAction.h/2;\r\n let angle = calculateAngle(ox, oy, editorAction.x, editorAction.y, x, y);\r\n angle = angle + editorAction.a % 360;\r\n angle = Math.round(angle / 2) * 2;\r\n editorAction.e.style.rotate = `${angle}deg`;\r\n // Update element\r\n if (typeof (editorAction.e.refresh) == 'function') {\r\n state.actioned = true;\r\n editorAction.e.refresh('rotate', angle);\r\n }\r\n } else if (editorAction.action === 'resize') {\r\n let top = null;\r\n let left = null;\r\n let width = null;\r\n let height = null;\r\n\r\n if (editorAction.d == 'e-resize' || editorAction.d == 'ne-resize' || editorAction.d == 'se-resize') {\r\n width = editorAction.e.offsetWidth + (x - state.x);\r\n\r\n if (e.shiftKey) {\r\n height = editorAction.e.offsetHeight + (x - state.x) * (editorAction.e.offsetHeight / editorAction.e.offsetWidth);\r\n }\r\n } else if (editorAction.d === 'w-resize' || editorAction.d == 'nw-resize'|| editorAction.d == 'sw-resize') {\r\n left = editorAction.e.offsetLeft + (x - state.x);\r\n width = editorAction.e.offsetLeft + editorAction.e.offsetWidth - left;\r\n\r\n if (e.shiftKey) {\r\n height = editorAction.e.offsetHeight - (x - state.x) * (editorAction.e.offsetHeight / editorAction.e.offsetWidth);\r\n }\r\n }\r\n\r\n if (editorAction.d == 's-resize' || editorAction.d == 'se-resize' || editorAction.d == 'sw-resize') {\r\n if (! height) {\r\n height = editorAction.e.offsetHeight + (y - state.y);\r\n }\r\n } else if (editorAction.d === 'n-resize' || editorAction.d == 'ne-resize' || editorAction.d == 'nw-resize') {\r\n top = editorAction.e.offsetTop + (y - state.y);\r\n height = editorAction.e.offsetTop + editorAction.e.offsetHeight - top;\r\n }\r\n\r\n if (top) {\r\n editorAction.e.style.top = top + 'px';\r\n }\r\n if (left) {\r\n editorAction.e.style.left = left + 'px';\r\n }\r\n if (width) {\r\n editorAction.e.style.width = width + 'px';\r\n }\r\n if (height) {\r\n editorAction.e.style.height = height + 'px';\r\n }\r\n\r\n // Update element\r\n if (typeof(editorAction.e.refresh) == 'function') {\r\n state.actioned = true;\r\n editorAction.e.refresh('dimensions', width, height);\r\n }\r\n }\r\n\r\n state.x = x;\r\n state.y = y;\r\n } else {\r\n let element = getElement(e);\r\n // Resize action\r\n let item = jsuites_jSuites.findElement(element, 'jpanel');\r\n // Found eligible component\r\n if (item) {\r\n // Resizing action\r\n let controls = item.classList.contains('jpanel-controls');\r\n if (controls) {\r\n let position = element.getAttribute('data-position');\r\n if (position) {\r\n item.style.cursor = position;\r\n } else {\r\n item.style.cursor = '';\r\n }\r\n } else if (item.getAttribute('tabindex')) {\r\n let rect = item.getBoundingClientRect();\r\n //console.log(e.clientY - rect.top, rect.width - (e.clientX - rect.left), cornerSize)\r\n if (e.clientY - rect.top < cornerSize) {\r\n if (rect.width - (e.clientX - rect.left) < cornerSize) {\r\n item.style.cursor = 'ne-resize';\r\n } else if (e.clientX - rect.left < cornerSize) {\r\n item.style.cursor = 'nw-resize';\r\n } else {\r\n item.style.cursor = 'n-resize';\r\n }\r\n } else if (rect.height - (e.clientY - rect.top) < cornerSize) {\r\n if (rect.width - (e.clientX - rect.left) < cornerSize) {\r\n item.style.cursor = 'se-resize';\r\n } else if (e.clientX - rect.left < cornerSize) {\r\n item.style.cursor = 'sw-resize';\r\n } else {\r\n item.style.cursor = 's-resize';\r\n }\r\n } else if (rect.width - (e.clientX - rect.left) < cornerSize) {\r\n item.style.cursor = 'e-resize';\r\n } else if (e.clientX - rect.left < cornerSize) {\r\n item.style.cursor = 'w-resize';\r\n } else {\r\n item.style.cursor = '';\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n let position = ['n','ne','e','se','s','sw','w','nw','rotate'];\r\n position.forEach(function(v, k) {\r\n position[k] = document.createElement('div');\r\n position[k].classList.add('jpanel-action');\r\n if (v === 'rotate') {\r\n position[k].setAttribute('data-action', 'rotate');\r\n } else {\r\n position[k].setAttribute('data-action', 'resize');\r\n position[k].setAttribute('data-position', v + '-resize');\r\n }\r\n });\r\n\r\n let currentElement;\r\n\r\n const focus = function(e) {\r\n let element = getElement(e);\r\n // Check if this is the floating\r\n let item = jsuites_jSuites.findElement(element, 'jpanel');\r\n if (item && ! item.classList.contains(\"readonly\") && item.classList.contains('jpanel-controls')) {\r\n item.append(...position);\r\n\r\n if (! item.classList.contains('jpanel-rotate')) {\r\n position[position.length-1].remove();\r\n }\r\n\r\n currentElement = item;\r\n } else {\r\n blur(e);\r\n }\r\n }\r\n\r\n const blur = function(e) {\r\n if (currentElement) {\r\n position.forEach(function(v) {\r\n v.remove();\r\n });\r\n currentElement = null;\r\n }\r\n }\r\n\r\n const mouseOver = function(e) {\r\n let element = getElement(e);\r\n var message = element.getAttribute('data-tooltip');\r\n if (message) {\r\n // Instructions\r\n tooltip.innerText = message;\r\n\r\n // Position\r\n if (e.changedTouches && e.changedTouches[0]) {\r\n var x = e.changedTouches[0].clientX;\r\n var y = e.changedTouches[0].clientY;\r\n } else {\r\n var x = e.clientX;\r\n var y = e.clientY;\r\n }\r\n\r\n tooltip.style.top = y + 'px';\r\n tooltip.style.left = x + 'px';\r\n document.body.appendChild(tooltip);\r\n } else if (tooltip.innerText) {\r\n tooltip.innerText = '';\r\n document.body.removeChild(tooltip);\r\n }\r\n }\r\n\r\n const contextMenu = function(e) {\r\n var item = document.activeElement;\r\n if (item && typeof(item.contextmenu) == 'function') {\r\n // Create edition\r\n item.contextmenu(e);\r\n\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n } else {\r\n // Search for possible context menus\r\n item = jsuites_jSuites.findElement(e.target, function(o) {\r\n return o.tagName && o.getAttribute('aria-contextmenu-id');\r\n });\r\n\r\n if (item) {\r\n var o = document.querySelector('#' + item);\r\n if (! o) {\r\n console.error('JSUITES: contextmenu id not found: ' + item);\r\n } else {\r\n o.contextmenu.open(e);\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n }\r\n }\r\n }\r\n }\r\n\r\n const keyDown = function(e) {\r\n let item = document.activeElement;\r\n if (item) {\r\n if (e.key === \"Delete\" && typeof(item.delete) == 'function') {\r\n item.delete();\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n }\r\n }\r\n\r\n let state = window['jSuitesStateControl'];\r\n if (state && state.length > 0) {\r\n item = state[state.length - 1];\r\n if (item) {\r\n if (e.key === \"Escape\" && typeof(item.isOpened) == 'function' && typeof(item.close) == 'function') {\r\n if (item.isOpened()) {\r\n item.close();\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n const input = function(e) {\r\n if (e.target.getAttribute('data-mask') || e.target.mask) {\r\n jsuites_jSuites.mask(e);\r\n }\r\n }\r\n\r\n document.addEventListener('focusin', focus);\r\n document.addEventListener('mouseup', mouseUp);\r\n document.addEventListener(\"mousedown\", mouseDown);\r\n document.addEventListener('mousemove', mouseMove);\r\n document.addEventListener('mouseover', mouseOver);\r\n document.addEventListener('keydown', keyDown);\r\n document.addEventListener('contextmenu', contextMenu);\r\n document.addEventListener('input', input);\r\n}\r\n\r\nif (typeof(document) !== \"undefined\") {\r\n Events();\r\n}\r\n\r\n/* harmony default export */ var jsuites = (jsuites_jSuites);\n}();\njSuites = __webpack_exports__[\"default\"];\n/******/ })()\n;\n\n return jSuites;\n})));","/*!\n * FilePond 4.32.5\n * Licensed under MIT, https://opensource.org/licenses/MIT/\n * Please visit https://pqina.nl/filepond/ for details.\n */\n\n/* eslint-disable */\n\nconst isNode = value => value instanceof HTMLElement;\n\nconst createStore = (initialState, queries = [], actions = []) => {\n // internal state\n const state = {\n ...initialState,\n };\n\n // contains all actions for next frame, is clear when actions are requested\n const actionQueue = [];\n const dispatchQueue = [];\n\n // returns a duplicate of the current state\n const getState = () => ({ ...state });\n\n // returns a duplicate of the actions array and clears the actions array\n const processActionQueue = () => {\n // create copy of actions queue\n const queue = [...actionQueue];\n\n // clear actions queue (we don't want no double actions)\n actionQueue.length = 0;\n\n return queue;\n };\n\n // processes actions that might block the main UI thread\n const processDispatchQueue = () => {\n // create copy of actions queue\n const queue = [...dispatchQueue];\n\n // clear actions queue (we don't want no double actions)\n dispatchQueue.length = 0;\n\n // now dispatch these actions\n queue.forEach(({ type, data }) => {\n dispatch(type, data);\n });\n };\n\n // adds a new action, calls its handler and\n const dispatch = (type, data, isBlocking) => {\n // is blocking action (should never block if document is hidden)\n if (isBlocking && !document.hidden) {\n dispatchQueue.push({ type, data });\n return;\n }\n\n // if this action has a handler, handle the action\n if (actionHandlers[type]) {\n actionHandlers[type](data);\n }\n\n // now add action\n actionQueue.push({\n type,\n data,\n });\n };\n\n const query = (str, ...args) => (queryHandles[str] ? queryHandles[str](...args) : null);\n\n const api = {\n getState,\n processActionQueue,\n processDispatchQueue,\n dispatch,\n query,\n };\n\n let queryHandles = {};\n queries.forEach(query => {\n queryHandles = {\n ...query(state),\n ...queryHandles,\n };\n });\n\n let actionHandlers = {};\n actions.forEach(action => {\n actionHandlers = {\n ...action(dispatch, query, state),\n ...actionHandlers,\n };\n });\n\n return api;\n};\n\nconst defineProperty = (obj, property, definition) => {\n if (typeof definition === 'function') {\n obj[property] = definition;\n return;\n }\n Object.defineProperty(obj, property, { ...definition });\n};\n\nconst forin = (obj, cb) => {\n for (const key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n\n cb(key, obj[key]);\n }\n};\n\nconst createObject = definition => {\n const obj = {};\n forin(definition, property => {\n defineProperty(obj, property, definition[property]);\n });\n return obj;\n};\n\nconst attr = (node, name, value = null) => {\n if (value === null) {\n return node.getAttribute(name) || node.hasAttribute(name);\n }\n node.setAttribute(name, value);\n};\n\nconst ns = 'http://www.w3.org/2000/svg';\nconst svgElements = ['svg', 'path']; // only svg elements used\n\nconst isSVGElement = tag => svgElements.includes(tag);\n\nconst createElement = (tag, className, attributes = {}) => {\n if (typeof className === 'object') {\n attributes = className;\n className = null;\n }\n const element = isSVGElement(tag)\n ? document.createElementNS(ns, tag)\n : document.createElement(tag);\n if (className) {\n if (isSVGElement(tag)) {\n attr(element, 'class', className);\n } else {\n element.className = className;\n }\n }\n forin(attributes, (name, value) => {\n attr(element, name, value);\n });\n return element;\n};\n\nconst appendChild = parent => (child, index) => {\n if (typeof index !== 'undefined' && parent.children[index]) {\n parent.insertBefore(child, parent.children[index]);\n } else {\n parent.appendChild(child);\n }\n};\n\nconst appendChildView = (parent, childViews) => (view, index) => {\n if (typeof index !== 'undefined') {\n childViews.splice(index, 0, view);\n } else {\n childViews.push(view);\n }\n\n return view;\n};\n\nconst removeChildView = (parent, childViews) => view => {\n // remove from child views\n childViews.splice(childViews.indexOf(view), 1);\n\n // remove the element\n if (view.element.parentNode) {\n parent.removeChild(view.element);\n }\n\n return view;\n};\n\nconst IS_BROWSER = (() =>\n typeof window !== 'undefined' && typeof window.document !== 'undefined')();\nconst isBrowser = () => IS_BROWSER;\n\nconst testElement = isBrowser() ? createElement('svg') : {};\nconst getChildCount =\n 'children' in testElement ? el => el.children.length : el => el.childNodes.length;\n\nconst getViewRect = (elementRect, childViews, offset, scale) => {\n const left = offset[0] || elementRect.left;\n const top = offset[1] || elementRect.top;\n const right = left + elementRect.width;\n const bottom = top + elementRect.height * (scale[1] || 1);\n\n const rect = {\n // the rectangle of the element itself\n element: {\n ...elementRect,\n },\n\n // the rectangle of the element expanded to contain its children, does not include any margins\n inner: {\n left: elementRect.left,\n top: elementRect.top,\n right: elementRect.right,\n bottom: elementRect.bottom,\n },\n\n // the rectangle of the element expanded to contain its children including own margin and child margins\n // margins will be added after we've recalculated the size\n outer: {\n left,\n top,\n right,\n bottom,\n },\n };\n\n // expand rect to fit all child rectangles\n childViews\n .filter(childView => !childView.isRectIgnored())\n .map(childView => childView.rect)\n .forEach(childViewRect => {\n expandRect(rect.inner, { ...childViewRect.inner });\n expandRect(rect.outer, { ...childViewRect.outer });\n });\n\n // calculate inner width and height\n calculateRectSize(rect.inner);\n\n // append additional margin (top and left margins are included in top and left automatically)\n rect.outer.bottom += rect.element.marginBottom;\n rect.outer.right += rect.element.marginRight;\n\n // calculate outer width and height\n calculateRectSize(rect.outer);\n\n return rect;\n};\n\nconst expandRect = (parent, child) => {\n // adjust for parent offset\n child.top += parent.top;\n child.right += parent.left;\n child.bottom += parent.top;\n child.left += parent.left;\n\n if (child.bottom > parent.bottom) {\n parent.bottom = child.bottom;\n }\n\n if (child.right > parent.right) {\n parent.right = child.right;\n }\n};\n\nconst calculateRectSize = rect => {\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n};\n\nconst isNumber = value => typeof value === 'number';\n\n/**\n * Determines if position is at destination\n * @param position\n * @param destination\n * @param velocity\n * @param errorMargin\n * @returns {boolean}\n */\nconst thereYet = (position, destination, velocity, errorMargin = 0.001) => {\n return Math.abs(position - destination) < errorMargin && Math.abs(velocity) < errorMargin;\n};\n\n/**\n * Spring animation\n */\nconst spring =\n // default options\n ({ stiffness = 0.5, damping = 0.75, mass = 10 } = {}) =>\n // method definition\n {\n let target = null;\n let position = null;\n let velocity = 0;\n let resting = false;\n\n // updates spring state\n const interpolate = (ts, skipToEndState) => {\n // in rest, don't animate\n if (resting) return;\n\n // need at least a target or position to do springy things\n if (!(isNumber(target) && isNumber(position))) {\n resting = true;\n velocity = 0;\n return;\n }\n\n // calculate spring force\n const f = -(position - target) * stiffness;\n\n // update velocity by adding force based on mass\n velocity += f / mass;\n\n // update position by adding velocity\n position += velocity;\n\n // slow down based on amount of damping\n velocity *= damping;\n\n // we've arrived if we're near target and our velocity is near zero\n if (thereYet(position, target, velocity) || skipToEndState) {\n position = target;\n velocity = 0;\n resting = true;\n\n // we done\n api.onupdate(position);\n api.oncomplete(position);\n } else {\n // progress update\n api.onupdate(position);\n }\n };\n\n /**\n * Set new target value\n * @param value\n */\n const setTarget = value => {\n // if currently has no position, set target and position to this value\n if (isNumber(value) && !isNumber(position)) {\n position = value;\n }\n\n // next target value will not be animated to\n if (target === null) {\n target = value;\n position = value;\n }\n\n // let start moving to target\n target = value;\n\n // already at target\n if (position === target || typeof target === 'undefined') {\n // now resting as target is current position, stop moving\n resting = true;\n velocity = 0;\n\n // done!\n api.onupdate(position);\n api.oncomplete(position);\n\n return;\n }\n\n resting = false;\n };\n\n // need 'api' to call onupdate callback\n const api = createObject({\n interpolate,\n target: {\n set: setTarget,\n get: () => target,\n },\n resting: {\n get: () => resting,\n },\n onupdate: value => {},\n oncomplete: value => {},\n });\n\n return api;\n };\n\nconst easeLinear = t => t;\nconst easeInOutQuad = t => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t);\n\nconst tween =\n // default values\n ({ duration = 500, easing = easeInOutQuad, delay = 0 } = {}) =>\n // method definition\n {\n let start = null;\n let t;\n let p;\n let resting = true;\n let reverse = false;\n let target = null;\n\n const interpolate = (ts, skipToEndState) => {\n if (resting || target === null) return;\n\n if (start === null) {\n start = ts;\n }\n\n if (ts - start < delay) return;\n\n t = ts - start - delay;\n\n if (t >= duration || skipToEndState) {\n t = 1;\n p = reverse ? 0 : 1;\n api.onupdate(p * target);\n api.oncomplete(p * target);\n resting = true;\n } else {\n p = t / duration;\n api.onupdate((t >= 0 ? easing(reverse ? 1 - p : p) : 0) * target);\n }\n };\n\n // need 'api' to call onupdate callback\n const api = createObject({\n interpolate,\n target: {\n get: () => (reverse ? 0 : target),\n set: value => {\n // is initial value\n if (target === null) {\n target = value;\n api.onupdate(value);\n api.oncomplete(value);\n return;\n }\n\n // want to tween to a smaller value and have a current value\n if (value < target) {\n target = 1;\n reverse = true;\n } else {\n // not tweening to a smaller value\n reverse = false;\n target = value;\n }\n\n // let's go!\n resting = false;\n start = null;\n },\n },\n resting: {\n get: () => resting,\n },\n onupdate: value => {},\n oncomplete: value => {},\n });\n\n return api;\n };\n\nconst animator = {\n spring,\n tween,\n};\n\n/*\n { type: 'spring', stiffness: .5, damping: .75, mass: 10 };\n { translation: { type: 'spring', ... }, ... }\n { translation: { x: { type: 'spring', ... } } }\n*/\nconst createAnimator = (definition, category, property) => {\n // default is single definition\n // we check if transform is set, if so, we check if property is set\n const def =\n definition[category] && typeof definition[category][property] === 'object'\n ? definition[category][property]\n : definition[category] || definition;\n\n const type = typeof def === 'string' ? def : def.type;\n const props = typeof def === 'object' ? { ...def } : {};\n\n return animator[type] ? animator[type](props) : null;\n};\n\nconst addGetSet = (keys, obj, props, overwrite = false) => {\n obj = Array.isArray(obj) ? obj : [obj];\n obj.forEach(o => {\n keys.forEach(key => {\n let name = key;\n let getter = () => props[key];\n let setter = value => (props[key] = value);\n\n if (typeof key === 'object') {\n name = key.key;\n getter = key.getter || getter;\n setter = key.setter || setter;\n }\n\n if (o[name] && !overwrite) {\n return;\n }\n\n o[name] = {\n get: getter,\n set: setter,\n };\n });\n });\n};\n\n// add to state,\n// add getters and setters to internal and external api (if not set)\n// setup animators\n\nconst animations = ({ mixinConfig, viewProps, viewInternalAPI, viewExternalAPI }) => {\n // initial properties\n const initialProps = { ...viewProps };\n\n // list of all active animations\n const animations = [];\n\n // setup animators\n forin(mixinConfig, (property, animation) => {\n const animator = createAnimator(animation);\n if (!animator) {\n return;\n }\n\n // when the animator updates, update the view state value\n animator.onupdate = value => {\n viewProps[property] = value;\n };\n\n // set animator target\n animator.target = initialProps[property];\n\n // when value is set, set the animator target value\n const prop = {\n key: property,\n setter: value => {\n // if already at target, we done!\n if (animator.target === value) {\n return;\n }\n\n animator.target = value;\n },\n getter: () => viewProps[property],\n };\n\n // add getters and setters\n addGetSet([prop], [viewInternalAPI, viewExternalAPI], viewProps, true);\n\n // add it to the list for easy updating from the _write method\n animations.push(animator);\n });\n\n // expose internal write api\n return {\n write: ts => {\n let skipToEndState = document.hidden;\n let resting = true;\n animations.forEach(animation => {\n if (!animation.resting) resting = false;\n animation.interpolate(ts, skipToEndState);\n });\n return resting;\n },\n destroy: () => {},\n };\n};\n\nconst addEvent = element => (type, fn) => {\n element.addEventListener(type, fn);\n};\n\nconst removeEvent = element => (type, fn) => {\n element.removeEventListener(type, fn);\n};\n\n// mixin\nconst listeners = ({\n mixinConfig,\n viewProps,\n viewInternalAPI,\n viewExternalAPI,\n viewState,\n view,\n}) => {\n const events = [];\n\n const add = addEvent(view.element);\n const remove = removeEvent(view.element);\n\n viewExternalAPI.on = (type, fn) => {\n events.push({\n type,\n fn,\n });\n add(type, fn);\n };\n\n viewExternalAPI.off = (type, fn) => {\n events.splice(events.findIndex(event => event.type === type && event.fn === fn), 1);\n remove(type, fn);\n };\n\n return {\n write: () => {\n // not busy\n return true;\n },\n destroy: () => {\n events.forEach(event => {\n remove(event.type, event.fn);\n });\n },\n };\n};\n\n// add to external api and link to props\n\nconst apis = ({ mixinConfig, viewProps, viewExternalAPI }) => {\n addGetSet(mixinConfig, viewExternalAPI, viewProps);\n};\n\nconst isDefined = value => value != null;\n\n// add to state,\n// add getters and setters to internal and external api (if not set)\n// set initial state based on props in viewProps\n// apply as transforms each frame\n\nconst defaults = {\n opacity: 1,\n scaleX: 1,\n scaleY: 1,\n translateX: 0,\n translateY: 0,\n rotateX: 0,\n rotateY: 0,\n rotateZ: 0,\n originX: 0,\n originY: 0,\n};\n\nconst styles = ({ mixinConfig, viewProps, viewInternalAPI, viewExternalAPI, view }) => {\n // initial props\n const initialProps = { ...viewProps };\n\n // current props\n const currentProps = {};\n\n // we will add those properties to the external API and link them to the viewState\n addGetSet(mixinConfig, [viewInternalAPI, viewExternalAPI], viewProps);\n\n // override rect on internal and external rect getter so it takes in account transforms\n const getOffset = () => [viewProps['translateX'] || 0, viewProps['translateY'] || 0];\n const getScale = () => [viewProps['scaleX'] || 0, viewProps['scaleY'] || 0];\n const getRect = () =>\n view.rect ? getViewRect(view.rect, view.childViews, getOffset(), getScale()) : null;\n viewInternalAPI.rect = { get: getRect };\n viewExternalAPI.rect = { get: getRect };\n\n // apply view props\n mixinConfig.forEach(key => {\n viewProps[key] =\n typeof initialProps[key] === 'undefined' ? defaults[key] : initialProps[key];\n });\n\n // expose api\n return {\n write: () => {\n // see if props have changed\n if (!propsHaveChanged(currentProps, viewProps)) {\n return;\n }\n\n // moves element to correct position on screen\n applyStyles(view.element, viewProps);\n\n // store new transforms\n Object.assign(currentProps, { ...viewProps });\n\n // no longer busy\n return true;\n },\n destroy: () => {},\n };\n};\n\nconst propsHaveChanged = (currentProps, newProps) => {\n // different amount of keys\n if (Object.keys(currentProps).length !== Object.keys(newProps).length) {\n return true;\n }\n\n // lets analyze the individual props\n for (const prop in newProps) {\n if (newProps[prop] !== currentProps[prop]) {\n return true;\n }\n }\n\n return false;\n};\n\nconst applyStyles = (\n element,\n {\n opacity,\n perspective,\n translateX,\n translateY,\n scaleX,\n scaleY,\n rotateX,\n rotateY,\n rotateZ,\n originX,\n originY,\n width,\n height,\n }\n) => {\n let transforms = '';\n let styles = '';\n\n // handle transform origin\n if (isDefined(originX) || isDefined(originY)) {\n styles += `transform-origin: ${originX || 0}px ${originY || 0}px;`;\n }\n\n // transform order is relevant\n // 0. perspective\n if (isDefined(perspective)) {\n transforms += `perspective(${perspective}px) `;\n }\n\n // 1. translate\n if (isDefined(translateX) || isDefined(translateY)) {\n transforms += `translate3d(${translateX || 0}px, ${translateY || 0}px, 0) `;\n }\n\n // 2. scale\n if (isDefined(scaleX) || isDefined(scaleY)) {\n transforms += `scale3d(${isDefined(scaleX) ? scaleX : 1}, ${\n isDefined(scaleY) ? scaleY : 1\n }, 1) `;\n }\n\n // 3. rotate\n if (isDefined(rotateZ)) {\n transforms += `rotateZ(${rotateZ}rad) `;\n }\n\n if (isDefined(rotateX)) {\n transforms += `rotateX(${rotateX}rad) `;\n }\n\n if (isDefined(rotateY)) {\n transforms += `rotateY(${rotateY}rad) `;\n }\n\n // add transforms\n if (transforms.length) {\n styles += `transform:${transforms};`;\n }\n\n // add opacity\n if (isDefined(opacity)) {\n styles += `opacity:${opacity};`;\n\n // if we reach zero, we make the element inaccessible\n if (opacity === 0) {\n styles += `visibility:hidden;`;\n }\n\n // if we're below 100% opacity this element can't be clicked\n if (opacity < 1) {\n styles += `pointer-events:none;`;\n }\n }\n\n // add height\n if (isDefined(height)) {\n styles += `height:${height}px;`;\n }\n\n // add width\n if (isDefined(width)) {\n styles += `width:${width}px;`;\n }\n\n // apply styles\n const elementCurrentStyle = element.elementCurrentStyle || '';\n\n // if new styles does not match current styles, lets update!\n if (styles.length !== elementCurrentStyle.length || styles !== elementCurrentStyle) {\n element.style.cssText = styles;\n // store current styles so we can compare them to new styles later on\n // _not_ getting the style value is faster\n element.elementCurrentStyle = styles;\n }\n};\n\nconst Mixins = {\n styles,\n listeners,\n animations,\n apis,\n};\n\nconst updateRect = (rect = {}, element = {}, style = {}) => {\n if (!element.layoutCalculated) {\n rect.paddingTop = parseInt(style.paddingTop, 10) || 0;\n rect.marginTop = parseInt(style.marginTop, 10) || 0;\n rect.marginRight = parseInt(style.marginRight, 10) || 0;\n rect.marginBottom = parseInt(style.marginBottom, 10) || 0;\n rect.marginLeft = parseInt(style.marginLeft, 10) || 0;\n element.layoutCalculated = true;\n }\n\n rect.left = element.offsetLeft || 0;\n rect.top = element.offsetTop || 0;\n rect.width = element.offsetWidth || 0;\n rect.height = element.offsetHeight || 0;\n\n rect.right = rect.left + rect.width;\n rect.bottom = rect.top + rect.height;\n\n rect.scrollTop = element.scrollTop;\n\n rect.hidden = element.offsetParent === null;\n\n return rect;\n};\n\nconst createView =\n // default view definition\n ({\n // element definition\n tag = 'div',\n name = null,\n attributes = {},\n\n // view interaction\n read = () => {},\n write = () => {},\n create = () => {},\n destroy = () => {},\n\n // hooks\n filterFrameActionsForChild = (child, actions) => actions,\n didCreateView = () => {},\n didWriteView = () => {},\n\n // rect related\n ignoreRect = false,\n ignoreRectUpdate = false,\n\n // mixins\n mixins = [],\n } = {}) => (\n // each view requires reference to store\n store,\n // specific properties for this view\n props = {}\n ) => {\n // root element should not be changed\n const element = createElement(tag, `filepond--${name}`, attributes);\n\n // style reference should also not be changed\n const style = window.getComputedStyle(element, null);\n\n // element rectangle\n const rect = updateRect();\n let frameRect = null;\n\n // rest state\n let isResting = false;\n\n // pretty self explanatory\n const childViews = [];\n\n // loaded mixins\n const activeMixins = [];\n\n // references to created children\n const ref = {};\n\n // state used for each instance\n const state = {};\n\n // list of writers that will be called to update this view\n const writers = [\n write, // default writer\n ];\n\n const readers = [\n read, // default reader\n ];\n\n const destroyers = [\n destroy, // default destroy\n ];\n\n // core view methods\n const getElement = () => element;\n const getChildViews = () => childViews.concat();\n const getReference = () => ref;\n const createChildView = store => (view, props) => view(store, props);\n const getRect = () => {\n if (frameRect) {\n return frameRect;\n }\n frameRect = getViewRect(rect, childViews, [0, 0], [1, 1]);\n return frameRect;\n };\n const getStyle = () => style;\n\n /**\n * Read data from DOM\n * @private\n */\n const _read = () => {\n frameRect = null;\n\n // read child views\n childViews.forEach(child => child._read());\n\n const shouldUpdate = !(ignoreRectUpdate && rect.width && rect.height);\n if (shouldUpdate) {\n updateRect(rect, element, style);\n }\n\n // readers\n const api = { root: internalAPI, props, rect };\n readers.forEach(reader => reader(api));\n };\n\n /**\n * Write data to DOM\n * @private\n */\n const _write = (ts, frameActions, shouldOptimize) => {\n // if no actions, we assume that the view is resting\n let resting = frameActions.length === 0;\n\n // writers\n writers.forEach(writer => {\n const writerResting = writer({\n props,\n root: internalAPI,\n actions: frameActions,\n timestamp: ts,\n shouldOptimize,\n });\n if (writerResting === false) {\n resting = false;\n }\n });\n\n // run mixins\n activeMixins.forEach(mixin => {\n // if one of the mixins is still busy after write operation, we are not resting\n const mixinResting = mixin.write(ts);\n if (mixinResting === false) {\n resting = false;\n }\n });\n\n // updates child views that are currently attached to the DOM\n childViews\n .filter(child => !!child.element.parentNode)\n .forEach(child => {\n // if a child view is not resting, we are not resting\n const childResting = child._write(\n ts,\n filterFrameActionsForChild(child, frameActions),\n shouldOptimize\n );\n if (!childResting) {\n resting = false;\n }\n });\n\n // append new elements to DOM and update those\n childViews\n //.filter(child => !child.element.parentNode)\n .forEach((child, index) => {\n // skip\n if (child.element.parentNode) {\n return;\n }\n\n // append to DOM\n internalAPI.appendChild(child.element, index);\n\n // call read (need to know the size of these elements)\n child._read();\n\n // re-call write\n child._write(\n ts,\n filterFrameActionsForChild(child, frameActions),\n shouldOptimize\n );\n\n // we just added somthing to the dom, no rest\n resting = false;\n });\n\n // update resting state\n isResting = resting;\n\n didWriteView({\n props,\n root: internalAPI,\n actions: frameActions,\n timestamp: ts,\n });\n\n // let parent know if we are resting\n return resting;\n };\n\n const _destroy = () => {\n activeMixins.forEach(mixin => mixin.destroy());\n destroyers.forEach(destroyer => {\n destroyer({ root: internalAPI, props });\n });\n childViews.forEach(child => child._destroy());\n };\n\n // sharedAPI\n const sharedAPIDefinition = {\n element: {\n get: getElement,\n },\n style: {\n get: getStyle,\n },\n childViews: {\n get: getChildViews,\n },\n };\n\n // private API definition\n const internalAPIDefinition = {\n ...sharedAPIDefinition,\n rect: {\n get: getRect,\n },\n\n // access to custom children references\n ref: {\n get: getReference,\n },\n\n // dom modifiers\n is: needle => name === needle,\n appendChild: appendChild(element),\n createChildView: createChildView(store),\n linkView: view => {\n childViews.push(view);\n return view;\n },\n unlinkView: view => {\n childViews.splice(childViews.indexOf(view), 1);\n },\n appendChildView: appendChildView(element, childViews),\n removeChildView: removeChildView(element, childViews),\n registerWriter: writer => writers.push(writer),\n registerReader: reader => readers.push(reader),\n registerDestroyer: destroyer => destroyers.push(destroyer),\n invalidateLayout: () => (element.layoutCalculated = false),\n\n // access to data store\n dispatch: store.dispatch,\n query: store.query,\n };\n\n // public view API methods\n const externalAPIDefinition = {\n element: {\n get: getElement,\n },\n childViews: {\n get: getChildViews,\n },\n rect: {\n get: getRect,\n },\n resting: {\n get: () => isResting,\n },\n isRectIgnored: () => ignoreRect,\n _read,\n _write,\n _destroy,\n };\n\n // mixin API methods\n const mixinAPIDefinition = {\n ...sharedAPIDefinition,\n rect: {\n get: () => rect,\n },\n };\n\n // add mixin functionality\n Object.keys(mixins)\n .sort((a, b) => {\n // move styles to the back of the mixin list (so adjustments of other mixins are applied to the props correctly)\n if (a === 'styles') {\n return 1;\n } else if (b === 'styles') {\n return -1;\n }\n return 0;\n })\n .forEach(key => {\n const mixinAPI = Mixins[key]({\n mixinConfig: mixins[key],\n viewProps: props,\n viewState: state,\n viewInternalAPI: internalAPIDefinition,\n viewExternalAPI: externalAPIDefinition,\n view: createObject(mixinAPIDefinition),\n });\n\n if (mixinAPI) {\n activeMixins.push(mixinAPI);\n }\n });\n\n // construct private api\n const internalAPI = createObject(internalAPIDefinition);\n\n // create the view\n create({\n root: internalAPI,\n props,\n });\n\n // append created child views to root node\n const childCount = getChildCount(element); // need to know the current child count so appending happens in correct order\n childViews.forEach((child, index) => {\n internalAPI.appendChild(child.element, childCount + index);\n });\n\n // call did create\n didCreateView(internalAPI);\n\n // expose public api\n return createObject(externalAPIDefinition);\n };\n\nconst createPainter = (read, write, fps = 60) => {\n const name = '__framePainter';\n\n // set global painter\n if (window[name]) {\n window[name].readers.push(read);\n window[name].writers.push(write);\n return;\n }\n\n window[name] = {\n readers: [read],\n writers: [write],\n };\n\n const painter = window[name];\n\n const interval = 1000 / fps;\n let last = null;\n let id = null;\n let requestTick = null;\n let cancelTick = null;\n\n const setTimerType = () => {\n if (document.hidden) {\n requestTick = () => window.setTimeout(() => tick(performance.now()), interval);\n cancelTick = () => window.clearTimeout(id);\n } else {\n requestTick = () => window.requestAnimationFrame(tick);\n cancelTick = () => window.cancelAnimationFrame(id);\n }\n };\n\n document.addEventListener('visibilitychange', () => {\n if (cancelTick) cancelTick();\n setTimerType();\n tick(performance.now());\n });\n\n const tick = ts => {\n // queue next tick\n id = requestTick(tick);\n\n // limit fps\n if (!last) {\n last = ts;\n }\n\n const delta = ts - last;\n\n if (delta <= interval) {\n // skip frame\n return;\n }\n\n // align next frame\n last = ts - (delta % interval);\n\n // update view\n painter.readers.forEach(read => read());\n painter.writers.forEach(write => write(ts));\n };\n\n setTimerType();\n tick(performance.now());\n\n return {\n pause: () => {\n cancelTick(id);\n },\n };\n};\n\nconst createRoute = (routes, fn) => ({ root, props, actions = [], timestamp, shouldOptimize }) => {\n actions\n .filter(action => routes[action.type])\n .forEach(action =>\n routes[action.type]({ root, props, action: action.data, timestamp, shouldOptimize })\n );\n if (fn) {\n fn({ root, props, actions, timestamp, shouldOptimize });\n }\n};\n\nconst insertBefore = (newNode, referenceNode) =>\n referenceNode.parentNode.insertBefore(newNode, referenceNode);\n\nconst insertAfter = (newNode, referenceNode) => {\n return referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);\n};\n\nconst isArray = value => Array.isArray(value);\n\nconst isEmpty = value => value == null;\n\nconst trim = str => str.trim();\n\nconst toString = value => '' + value;\n\nconst toArray = (value, splitter = ',') => {\n if (isEmpty(value)) {\n return [];\n }\n if (isArray(value)) {\n return value;\n }\n return toString(value)\n .split(splitter)\n .map(trim)\n .filter(str => str.length);\n};\n\nconst isBoolean = value => typeof value === 'boolean';\n\nconst toBoolean = value => (isBoolean(value) ? value : value === 'true');\n\nconst isString = value => typeof value === 'string';\n\nconst toNumber = value =>\n isNumber(value) ? value : isString(value) ? toString(value).replace(/[a-z]+/gi, '') : 0;\n\nconst toInt = value => parseInt(toNumber(value), 10);\n\nconst toFloat = value => parseFloat(toNumber(value));\n\nconst isInt = value => isNumber(value) && isFinite(value) && Math.floor(value) === value;\n\nconst toBytes = (value, base = 1000) => {\n // is in bytes\n if (isInt(value)) {\n return value;\n }\n\n // is natural file size\n let naturalFileSize = toString(value).trim();\n\n // if is value in megabytes\n if (/MB$/i.test(naturalFileSize)) {\n naturalFileSize = naturalFileSize.replace(/MB$i/, '').trim();\n return toInt(naturalFileSize) * base * base;\n }\n\n // if is value in kilobytes\n if (/KB/i.test(naturalFileSize)) {\n naturalFileSize = naturalFileSize.replace(/KB$i/, '').trim();\n return toInt(naturalFileSize) * base;\n }\n\n return toInt(naturalFileSize);\n};\n\nconst isFunction = value => typeof value === 'function';\n\nconst toFunctionReference = string => {\n let ref = self;\n let levels = string.split('.');\n let level = null;\n while ((level = levels.shift())) {\n ref = ref[level];\n if (!ref) {\n return null;\n }\n }\n return ref;\n};\n\nconst methods = {\n process: 'POST',\n patch: 'PATCH',\n revert: 'DELETE',\n fetch: 'GET',\n restore: 'GET',\n load: 'GET',\n};\n\nconst createServerAPI = outline => {\n const api = {};\n\n api.url = isString(outline) ? outline : outline.url || '';\n api.timeout = outline.timeout ? parseInt(outline.timeout, 10) : 0;\n api.headers = outline.headers ? outline.headers : {};\n\n forin(methods, key => {\n api[key] = createAction(key, outline[key], methods[key], api.timeout, api.headers);\n });\n\n // remove process if no url or process on outline\n api.process = outline.process || isString(outline) || outline.url ? api.process : null;\n\n // special treatment for remove\n api.remove = outline.remove || null;\n\n // remove generic headers from api object\n delete api.headers;\n\n return api;\n};\n\nconst createAction = (name, outline, method, timeout, headers) => {\n // is explicitely set to null so disable\n if (outline === null) {\n return null;\n }\n\n // if is custom function, done! Dev handles everything.\n if (typeof outline === 'function') {\n return outline;\n }\n\n // build action object\n const action = {\n url: method === 'GET' || method === 'PATCH' ? `?${name}=` : '',\n method,\n headers,\n withCredentials: false,\n timeout,\n onload: null,\n ondata: null,\n onerror: null,\n };\n\n // is a single url\n if (isString(outline)) {\n action.url = outline;\n return action;\n }\n\n // overwrite\n Object.assign(action, outline);\n\n // see if should reformat headers;\n if (isString(action.headers)) {\n const parts = action.headers.split(/:(.+)/);\n action.headers = {\n header: parts[0],\n value: parts[1],\n };\n }\n\n // if is bool withCredentials\n action.withCredentials = toBoolean(action.withCredentials);\n\n return action;\n};\n\nconst toServerAPI = value => createServerAPI(value);\n\nconst isNull = value => value === null;\n\nconst isObject = value => typeof value === 'object' && value !== null;\n\nconst isAPI = value => {\n return (\n isObject(value) &&\n isString(value.url) &&\n isObject(value.process) &&\n isObject(value.revert) &&\n isObject(value.restore) &&\n isObject(value.fetch)\n );\n};\n\nconst getType = value => {\n if (isArray(value)) {\n return 'array';\n }\n\n if (isNull(value)) {\n return 'null';\n }\n\n if (isInt(value)) {\n return 'int';\n }\n\n if (/^[0-9]+ ?(?:GB|MB|KB)$/gi.test(value)) {\n return 'bytes';\n }\n\n if (isAPI(value)) {\n return 'api';\n }\n\n return typeof value;\n};\n\nconst replaceSingleQuotes = str =>\n str\n .replace(/{\\s*'/g, '{\"')\n .replace(/'\\s*}/g, '\"}')\n .replace(/'\\s*:/g, '\":')\n .replace(/:\\s*'/g, ':\"')\n .replace(/,\\s*'/g, ',\"')\n .replace(/'\\s*,/g, '\",');\n\nconst conversionTable = {\n array: toArray,\n boolean: toBoolean,\n int: value => (getType(value) === 'bytes' ? toBytes(value) : toInt(value)),\n number: toFloat,\n float: toFloat,\n bytes: toBytes,\n string: value => (isFunction(value) ? value : toString(value)),\n function: value => toFunctionReference(value),\n serverapi: toServerAPI,\n object: value => {\n try {\n return JSON.parse(replaceSingleQuotes(value));\n } catch (e) {\n return null;\n }\n },\n};\n\nconst convertTo = (value, type) => conversionTable[type](value);\n\nconst getValueByType = (newValue, defaultValue, valueType) => {\n // can always assign default value\n if (newValue === defaultValue) {\n return newValue;\n }\n\n // get the type of the new value\n let newValueType = getType(newValue);\n\n // is valid type?\n if (newValueType !== valueType) {\n // is string input, let's attempt to convert\n const convertedValue = convertTo(newValue, valueType);\n\n // what is the type now\n newValueType = getType(convertedValue);\n\n // no valid conversions found\n if (convertedValue === null) {\n throw `Trying to assign value with incorrect type to \"${option}\", allowed type: \"${valueType}\"`;\n } else {\n newValue = convertedValue;\n }\n }\n\n // assign new value\n return newValue;\n};\n\nconst createOption = (defaultValue, valueType) => {\n let currentValue = defaultValue;\n return {\n enumerable: true,\n get: () => currentValue,\n set: newValue => {\n currentValue = getValueByType(newValue, defaultValue, valueType);\n },\n };\n};\n\nconst createOptions = options => {\n const obj = {};\n forin(options, prop => {\n const optionDefinition = options[prop];\n obj[prop] = createOption(optionDefinition[0], optionDefinition[1]);\n });\n return createObject(obj);\n};\n\nconst createInitialState = options => ({\n // model\n items: [],\n\n // timeout used for calling update items\n listUpdateTimeout: null,\n\n // timeout used for stacking metadata updates\n itemUpdateTimeout: null,\n\n // queue of items waiting to be processed\n processingQueue: [],\n\n // options\n options: createOptions(options),\n});\n\nconst fromCamels = (string, separator = '-') =>\n string\n .split(/(?=[A-Z])/)\n .map(part => part.toLowerCase())\n .join(separator);\n\nconst createOptionAPI = (store, options) => {\n const obj = {};\n forin(options, key => {\n obj[key] = {\n get: () => store.getState().options[key],\n set: value => {\n store.dispatch(`SET_${fromCamels(key, '_').toUpperCase()}`, {\n value,\n });\n },\n };\n });\n return obj;\n};\n\nconst createOptionActions = options => (dispatch, query, state) => {\n const obj = {};\n forin(options, key => {\n const name = fromCamels(key, '_').toUpperCase();\n\n obj[`SET_${name}`] = action => {\n try {\n state.options[key] = action.value;\n } catch (e) {\n // nope, failed\n }\n\n // we successfully set the value of this option\n dispatch(`DID_SET_${name}`, { value: state.options[key] });\n };\n });\n return obj;\n};\n\nconst createOptionQueries = options => state => {\n const obj = {};\n forin(options, key => {\n obj[`GET_${fromCamels(key, '_').toUpperCase()}`] = action => state.options[key];\n });\n return obj;\n};\n\nconst InteractionMethod = {\n API: 1,\n DROP: 2,\n BROWSE: 3,\n PASTE: 4,\n NONE: 5,\n};\n\nconst getUniqueId = () =>\n Math.random()\n .toString(36)\n .substring(2, 11);\n\nconst arrayRemove = (arr, index) => arr.splice(index, 1);\n\nconst run = (cb, sync) => {\n if (sync) {\n cb();\n } else if (document.hidden) {\n Promise.resolve(1).then(cb);\n } else {\n setTimeout(cb, 0);\n }\n};\n\nconst on = () => {\n const listeners = [];\n const off = (event, cb) => {\n arrayRemove(\n listeners,\n listeners.findIndex(listener => listener.event === event && (listener.cb === cb || !cb))\n );\n };\n const fire = (event, args, sync) => {\n listeners\n .filter(listener => listener.event === event)\n .map(listener => listener.cb)\n .forEach(cb => run(() => cb(...args), sync));\n };\n return {\n fireSync: (event, ...args) => {\n fire(event, args, true);\n },\n fire: (event, ...args) => {\n fire(event, args, false);\n },\n on: (event, cb) => {\n listeners.push({ event, cb });\n },\n onOnce: (event, cb) => {\n listeners.push({\n event,\n cb: (...args) => {\n off(event, cb);\n cb(...args);\n },\n });\n },\n off,\n };\n};\n\nconst copyObjectPropertiesToObject = (src, target, excluded) => {\n Object.getOwnPropertyNames(src)\n .filter(property => !excluded.includes(property))\n .forEach(key =>\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(src, key))\n );\n};\n\nconst PRIVATE = [\n 'fire',\n 'process',\n 'revert',\n 'load',\n 'on',\n 'off',\n 'onOnce',\n 'retryLoad',\n 'extend',\n 'archive',\n 'archived',\n 'release',\n 'released',\n 'requestProcessing',\n 'freeze',\n];\n\nconst createItemAPI = item => {\n const api = {};\n copyObjectPropertiesToObject(item, api, PRIVATE);\n return api;\n};\n\nconst removeReleasedItems = items => {\n items.forEach((item, index) => {\n if (item.released) {\n arrayRemove(items, index);\n }\n });\n};\n\nconst ItemStatus = {\n INIT: 1,\n IDLE: 2,\n PROCESSING_QUEUED: 9,\n PROCESSING: 3,\n PROCESSING_COMPLETE: 5,\n PROCESSING_ERROR: 6,\n PROCESSING_REVERT_ERROR: 10,\n LOADING: 7,\n LOAD_ERROR: 8,\n};\n\nconst FileOrigin = {\n INPUT: 1,\n LIMBO: 2,\n LOCAL: 3,\n};\n\nconst getNonNumeric = str => /[^0-9]+/.exec(str);\n\nconst getDecimalSeparator = () => getNonNumeric((1.1).toLocaleString())[0];\n\nconst getThousandsSeparator = () => {\n // Added for browsers that do not return the thousands separator (happend on native browser Android 4.4.4)\n // We check against the normal toString output and if they're the same return a comma when decimal separator is a dot\n const decimalSeparator = getDecimalSeparator();\n const thousandsStringWithSeparator = (1000.0).toLocaleString();\n const thousandsStringWithoutSeparator = (1000.0).toString();\n if (thousandsStringWithSeparator !== thousandsStringWithoutSeparator) {\n return getNonNumeric(thousandsStringWithSeparator)[0];\n }\n return decimalSeparator === '.' ? ',' : '.';\n};\n\nconst Type = {\n BOOLEAN: 'boolean',\n INT: 'int',\n NUMBER: 'number',\n STRING: 'string',\n ARRAY: 'array',\n OBJECT: 'object',\n FUNCTION: 'function',\n ACTION: 'action',\n SERVER_API: 'serverapi',\n REGEX: 'regex',\n};\n\n// all registered filters\nconst filters = [];\n\n// loops over matching filters and passes options to each filter, returning the mapped results\nconst applyFilterChain = (key, value, utils) =>\n new Promise((resolve, reject) => {\n // find matching filters for this key\n const matchingFilters = filters.filter(f => f.key === key).map(f => f.cb);\n\n // resolve now\n if (matchingFilters.length === 0) {\n resolve(value);\n return;\n }\n\n // first filter to kick things of\n const initialFilter = matchingFilters.shift();\n\n // chain filters\n matchingFilters\n .reduce(\n // loop over promises passing value to next promise\n (current, next) => current.then(value => next(value, utils)),\n\n // call initial filter, will return a promise\n initialFilter(value, utils)\n\n // all executed\n )\n .then(value => resolve(value))\n .catch(error => reject(error));\n });\n\nconst applyFilters = (key, value, utils) =>\n filters.filter(f => f.key === key).map(f => f.cb(value, utils));\n\n// adds a new filter to the list\nconst addFilter = (key, cb) => filters.push({ key, cb });\n\nconst extendDefaultOptions = additionalOptions => Object.assign(defaultOptions, additionalOptions);\n\nconst getOptions = () => ({ ...defaultOptions });\n\nconst setOptions = opts => {\n forin(opts, (key, value) => {\n // key does not exist, so this option cannot be set\n if (!defaultOptions[key]) {\n return;\n }\n defaultOptions[key][0] = getValueByType(\n value,\n defaultOptions[key][0],\n defaultOptions[key][1]\n );\n });\n};\n\n// default options on app\nconst defaultOptions = {\n // the id to add to the root element\n id: [null, Type.STRING],\n\n // input field name to use\n name: ['filepond', Type.STRING],\n\n // disable the field\n disabled: [false, Type.BOOLEAN],\n\n // classname to put on wrapper\n className: [null, Type.STRING],\n\n // is the field required\n required: [false, Type.BOOLEAN],\n\n // Allow media capture when value is set\n captureMethod: [null, Type.STRING],\n // - \"camera\", \"microphone\" or \"camcorder\",\n // - Does not work with multiple on apple devices\n // - If set, acceptedFileTypes must be made to match with media wildcard \"image/*\", \"audio/*\" or \"video/*\"\n\n // sync `acceptedFileTypes` property with `accept` attribute\n allowSyncAcceptAttribute: [true, Type.BOOLEAN],\n\n // Feature toggles\n allowDrop: [true, Type.BOOLEAN], // Allow dropping of files\n allowBrowse: [true, Type.BOOLEAN], // Allow browsing the file system\n allowPaste: [true, Type.BOOLEAN], // Allow pasting files\n allowMultiple: [false, Type.BOOLEAN], // Allow multiple files (disabled by default, as multiple attribute is also required on input to allow multiple)\n allowReplace: [true, Type.BOOLEAN], // Allow dropping a file on other file to replace it (only works when multiple is set to false)\n allowRevert: [true, Type.BOOLEAN], // Allows user to revert file upload\n allowRemove: [true, Type.BOOLEAN], // Allow user to remove a file\n allowProcess: [true, Type.BOOLEAN], // Allows user to process a file, when set to false, this removes the file upload button\n allowReorder: [false, Type.BOOLEAN], // Allow reordering of files\n allowDirectoriesOnly: [false, Type.BOOLEAN], // Allow only selecting directories with browse (no support for filtering dnd at this point)\n\n // Try store file if `server` not set\n storeAsFile: [false, Type.BOOLEAN],\n\n // Revert mode\n forceRevert: [false, Type.BOOLEAN], // Set to 'force' to require the file to be reverted before removal\n\n // Input requirements\n maxFiles: [null, Type.INT], // Max number of files\n checkValidity: [false, Type.BOOLEAN], // Enables custom validity messages\n\n // Where to put file\n itemInsertLocationFreedom: [true, Type.BOOLEAN], // Set to false to always add items to begin or end of list\n itemInsertLocation: ['before', Type.STRING], // Default index in list to add items that have been dropped at the top of the list\n itemInsertInterval: [75, Type.INT],\n\n // Drag 'n Drop related\n dropOnPage: [false, Type.BOOLEAN], // Allow dropping of files anywhere on page (prevents browser from opening file if dropped outside of Up)\n dropOnElement: [true, Type.BOOLEAN], // Drop needs to happen on element (set to false to also load drops outside of Up)\n dropValidation: [false, Type.BOOLEAN], // Enable or disable validating files on drop\n ignoredFiles: [['.ds_store', 'thumbs.db', 'desktop.ini'], Type.ARRAY],\n\n // Upload related\n instantUpload: [true, Type.BOOLEAN], // Should upload files immediately on drop\n maxParallelUploads: [2, Type.INT], // Maximum files to upload in parallel\n allowMinimumUploadDuration: [true, Type.BOOLEAN], // if true uploads take at least 750 ms, this ensures the user sees the upload progress giving trust the upload actually happened\n\n // Chunks\n chunkUploads: [false, Type.BOOLEAN], // Enable chunked uploads\n chunkForce: [false, Type.BOOLEAN], // Force use of chunk uploads even for files smaller than chunk size\n chunkSize: [5000000, Type.INT], // Size of chunks (5MB default)\n chunkRetryDelays: [[500, 1000, 3000], Type.ARRAY], // Amount of times to retry upload of a chunk when it fails\n\n // The server api end points to use for uploading (see docs)\n server: [null, Type.SERVER_API],\n\n // File size calculations, can set to 1024, this is only used for display, properties use file size base 1000\n fileSizeBase: [1000, Type.INT],\n\n // Labels and status messages\n labelFileSizeBytes: ['bytes', Type.STRING],\n labelFileSizeKilobytes: ['KB', Type.STRING],\n labelFileSizeMegabytes: ['MB', Type.STRING],\n labelFileSizeGigabytes: ['GB', Type.STRING],\n\n labelDecimalSeparator: [getDecimalSeparator(), Type.STRING], // Default is locale separator\n labelThousandsSeparator: [getThousandsSeparator(), Type.STRING], // Default is locale separator\n\n labelIdle: [\n 'Drag & Drop your files or Browse',\n Type.STRING,\n ],\n labelInvalidField: ['Field contains invalid files', Type.STRING],\n labelFileWaitingForSize: ['Waiting for size', Type.STRING],\n labelFileSizeNotAvailable: ['Size not available', Type.STRING],\n labelFileCountSingular: ['file in list', Type.STRING],\n labelFileCountPlural: ['files in list', Type.STRING],\n labelFileLoading: ['Loading', Type.STRING],\n labelFileAdded: ['Added', Type.STRING], // assistive only\n labelFileLoadError: ['Error during load', Type.STRING],\n labelFileRemoved: ['Removed', Type.STRING], // assistive only\n labelFileRemoveError: ['Error during remove', Type.STRING],\n labelFileProcessing: ['Uploading', Type.STRING],\n labelFileProcessingComplete: ['Upload complete', Type.STRING],\n labelFileProcessingAborted: ['Upload cancelled', Type.STRING],\n labelFileProcessingError: ['Error during upload', Type.STRING],\n labelFileProcessingRevertError: ['Error during revert', Type.STRING],\n\n labelTapToCancel: ['tap to cancel', Type.STRING],\n labelTapToRetry: ['tap to retry', Type.STRING],\n labelTapToUndo: ['tap to undo', Type.STRING],\n\n labelButtonRemoveItem: ['Remove', Type.STRING],\n labelButtonAbortItemLoad: ['Abort', Type.STRING],\n labelButtonRetryItemLoad: ['Retry', Type.STRING],\n labelButtonAbortItemProcessing: ['Cancel', Type.STRING],\n labelButtonUndoItemProcessing: ['Undo', Type.STRING],\n labelButtonRetryItemProcessing: ['Retry', Type.STRING],\n labelButtonProcessItem: ['Upload', Type.STRING],\n\n // make sure width and height plus viewpox are even numbers so icons are nicely centered\n iconRemove: [\n '',\n Type.STRING,\n ],\n iconProcess: [\n '',\n Type.STRING,\n ],\n iconRetry: [\n '',\n Type.STRING,\n ],\n iconUndo: [\n '',\n Type.STRING,\n ],\n iconDone: [\n '',\n Type.STRING,\n ],\n\n // event handlers\n oninit: [null, Type.FUNCTION],\n onwarning: [null, Type.FUNCTION],\n onerror: [null, Type.FUNCTION],\n onactivatefile: [null, Type.FUNCTION],\n oninitfile: [null, Type.FUNCTION],\n onaddfilestart: [null, Type.FUNCTION],\n onaddfileprogress: [null, Type.FUNCTION],\n onaddfile: [null, Type.FUNCTION],\n onprocessfilestart: [null, Type.FUNCTION],\n onprocessfileprogress: [null, Type.FUNCTION],\n onprocessfileabort: [null, Type.FUNCTION],\n onprocessfilerevert: [null, Type.FUNCTION],\n onprocessfile: [null, Type.FUNCTION],\n onprocessfiles: [null, Type.FUNCTION],\n onremovefile: [null, Type.FUNCTION],\n onpreparefile: [null, Type.FUNCTION],\n onupdatefiles: [null, Type.FUNCTION],\n onreorderfiles: [null, Type.FUNCTION],\n\n // hooks\n beforeDropFile: [null, Type.FUNCTION],\n beforeAddFile: [null, Type.FUNCTION],\n beforeRemoveFile: [null, Type.FUNCTION],\n beforePrepareFile: [null, Type.FUNCTION],\n\n // styles\n stylePanelLayout: [null, Type.STRING], // null 'integrated', 'compact', 'circle'\n stylePanelAspectRatio: [null, Type.STRING], // null or '3:2' or 1\n styleItemPanelAspectRatio: [null, Type.STRING],\n styleButtonRemoveItemPosition: ['left', Type.STRING],\n styleButtonProcessItemPosition: ['right', Type.STRING],\n styleLoadIndicatorPosition: ['right', Type.STRING],\n styleProgressIndicatorPosition: ['right', Type.STRING],\n styleButtonRemoveItemAlign: [false, Type.BOOLEAN],\n\n // custom initial files array\n files: [[], Type.ARRAY],\n\n // show support by displaying credits\n credits: [['https://pqina.nl/', 'Powered by PQINA'], Type.ARRAY],\n};\n\nconst getItemByQuery = (items, query) => {\n // just return first index\n if (isEmpty(query)) {\n return items[0] || null;\n }\n\n // query is index\n if (isInt(query)) {\n return items[query] || null;\n }\n\n // if query is item, get the id\n if (typeof query === 'object') {\n query = query.id;\n }\n\n // assume query is a string and return item by id\n return items.find(item => item.id === query) || null;\n};\n\nconst getNumericAspectRatioFromString = aspectRatio => {\n if (isEmpty(aspectRatio)) {\n return aspectRatio;\n }\n if (/:/.test(aspectRatio)) {\n const parts = aspectRatio.split(':');\n return parts[1] / parts[0];\n }\n return parseFloat(aspectRatio);\n};\n\nconst getActiveItems = items => items.filter(item => !item.archived);\n\nconst Status = {\n EMPTY: 0,\n IDLE: 1, // waiting\n ERROR: 2, // a file is in error state\n BUSY: 3, // busy processing or loading\n READY: 4, // all files uploaded\n};\n\nlet res = null;\nconst canUpdateFileInput = () => {\n if (res === null) {\n try {\n const dataTransfer = new DataTransfer();\n dataTransfer.items.add(new File(['hello world'], 'This_Works.txt'));\n const el = document.createElement('input');\n el.setAttribute('type', 'file');\n el.files = dataTransfer.files;\n res = el.files.length === 1;\n } catch (err) {\n res = false;\n }\n }\n return res;\n};\n\nconst ITEM_ERROR = [\n ItemStatus.LOAD_ERROR,\n ItemStatus.PROCESSING_ERROR,\n ItemStatus.PROCESSING_REVERT_ERROR,\n];\nconst ITEM_BUSY = [\n ItemStatus.LOADING,\n ItemStatus.PROCESSING,\n ItemStatus.PROCESSING_QUEUED,\n ItemStatus.INIT,\n];\nconst ITEM_READY = [ItemStatus.PROCESSING_COMPLETE];\n\nconst isItemInErrorState = item => ITEM_ERROR.includes(item.status);\nconst isItemInBusyState = item => ITEM_BUSY.includes(item.status);\nconst isItemInReadyState = item => ITEM_READY.includes(item.status);\n\nconst isAsync = state =>\n isObject(state.options.server) &&\n (isObject(state.options.server.process) || isFunction(state.options.server.process));\n\nconst queries = state => ({\n GET_STATUS: () => {\n const items = getActiveItems(state.items);\n\n const { EMPTY, ERROR, BUSY, IDLE, READY } = Status;\n\n if (items.length === 0) return EMPTY;\n\n if (items.some(isItemInErrorState)) return ERROR;\n\n if (items.some(isItemInBusyState)) return BUSY;\n\n if (items.some(isItemInReadyState)) return READY;\n\n return IDLE;\n },\n\n GET_ITEM: query => getItemByQuery(state.items, query),\n\n GET_ACTIVE_ITEM: query => getItemByQuery(getActiveItems(state.items), query),\n\n GET_ACTIVE_ITEMS: () => getActiveItems(state.items),\n\n GET_ITEMS: () => state.items,\n\n GET_ITEM_NAME: query => {\n const item = getItemByQuery(state.items, query);\n return item ? item.filename : null;\n },\n\n GET_ITEM_SIZE: query => {\n const item = getItemByQuery(state.items, query);\n return item ? item.fileSize : null;\n },\n\n GET_STYLES: () =>\n Object.keys(state.options)\n .filter(key => /^style/.test(key))\n .map(option => ({\n name: option,\n value: state.options[option],\n })),\n\n GET_PANEL_ASPECT_RATIO: () => {\n const isShapeCircle = /circle/.test(state.options.stylePanelLayout);\n const aspectRatio = isShapeCircle\n ? 1\n : getNumericAspectRatioFromString(state.options.stylePanelAspectRatio);\n return aspectRatio;\n },\n\n GET_ITEM_PANEL_ASPECT_RATIO: () => state.options.styleItemPanelAspectRatio,\n\n GET_ITEMS_BY_STATUS: status =>\n getActiveItems(state.items).filter(item => item.status === status),\n\n GET_TOTAL_ITEMS: () => getActiveItems(state.items).length,\n\n SHOULD_UPDATE_FILE_INPUT: () =>\n state.options.storeAsFile && canUpdateFileInput() && !isAsync(state),\n\n IS_ASYNC: () => isAsync(state),\n\n GET_FILE_SIZE_LABELS: query => ({\n labelBytes: query('GET_LABEL_FILE_SIZE_BYTES') || undefined,\n labelKilobytes: query('GET_LABEL_FILE_SIZE_KILOBYTES') || undefined,\n labelMegabytes: query('GET_LABEL_FILE_SIZE_MEGABYTES') || undefined,\n labelGigabytes: query('GET_LABEL_FILE_SIZE_GIGABYTES') || undefined,\n }),\n});\n\nconst hasRoomForItem = state => {\n const count = getActiveItems(state.items).length;\n\n // if cannot have multiple items, to add one item it should currently not contain items\n if (!state.options.allowMultiple) {\n return count === 0;\n }\n\n // if allows multiple items, we check if a max item count has been set, if not, there's no limit\n const maxFileCount = state.options.maxFiles;\n if (maxFileCount === null) {\n return true;\n }\n\n // we check if the current count is smaller than the max count, if so, another file can still be added\n if (count < maxFileCount) {\n return true;\n }\n\n // no more room for another file\n return false;\n};\n\nconst limit = (value, min, max) => Math.max(Math.min(max, value), min);\n\nconst arrayInsert = (arr, index, item) => arr.splice(index, 0, item);\n\nconst insertItem = (items, item, index) => {\n if (isEmpty(item)) {\n return null;\n }\n\n // if index is undefined, append\n if (typeof index === 'undefined') {\n items.push(item);\n return item;\n }\n\n // limit the index to the size of the items array\n index = limit(index, 0, items.length);\n\n // add item to array\n arrayInsert(items, index, item);\n\n // expose\n return item;\n};\n\nconst isBase64DataURI = str =>\n /^\\s*data:([a-z]+\\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\\-._~:@\\/?%\\s]*)\\s*$/i.test(\n str\n );\n\nconst getFilenameFromURL = url =>\n `${url}`\n .split('/')\n .pop()\n .split('?')\n .shift();\n\nconst getExtensionFromFilename = name => name.split('.').pop();\n\nconst guesstimateExtension = type => {\n // if no extension supplied, exit here\n if (typeof type !== 'string') {\n return '';\n }\n\n // get subtype\n const subtype = type.split('/').pop();\n\n // is svg subtype\n if (/svg/.test(subtype)) {\n return 'svg';\n }\n\n if (/zip|compressed/.test(subtype)) {\n return 'zip';\n }\n\n if (/plain/.test(subtype)) {\n return 'txt';\n }\n\n if (/msword/.test(subtype)) {\n return 'doc';\n }\n\n // if is valid subtype\n if (/[a-z]+/.test(subtype)) {\n // always use jpg extension\n if (subtype === 'jpeg') {\n return 'jpg';\n }\n\n // return subtype\n return subtype;\n }\n\n return '';\n};\n\nconst leftPad = (value, padding = '') => (padding + value).slice(-padding.length);\n\nconst getDateString = (date = new Date()) =>\n `${date.getFullYear()}-${leftPad(date.getMonth() + 1, '00')}-${leftPad(\n date.getDate(),\n '00'\n )}_${leftPad(date.getHours(), '00')}-${leftPad(date.getMinutes(), '00')}-${leftPad(\n date.getSeconds(),\n '00'\n )}`;\n\nconst getFileFromBlob = (blob, filename, type = null, extension = null) => {\n const file =\n typeof type === 'string'\n ? blob.slice(0, blob.size, type)\n : blob.slice(0, blob.size, blob.type);\n file.lastModifiedDate = new Date();\n\n // copy relative path\n if (blob._relativePath) file._relativePath = blob._relativePath;\n\n // if blob has name property, use as filename if no filename supplied\n if (!isString(filename)) {\n filename = getDateString();\n }\n\n // if filename supplied but no extension and filename has extension\n if (filename && extension === null && getExtensionFromFilename(filename)) {\n file.name = filename;\n } else {\n extension = extension || guesstimateExtension(file.type);\n file.name = filename + (extension ? '.' + extension : '');\n }\n\n return file;\n};\n\nconst getBlobBuilder = () => {\n return (window.BlobBuilder =\n window.BlobBuilder ||\n window.WebKitBlobBuilder ||\n window.MozBlobBuilder ||\n window.MSBlobBuilder);\n};\n\nconst createBlob = (arrayBuffer, mimeType) => {\n const BB = getBlobBuilder();\n\n if (BB) {\n const bb = new BB();\n bb.append(arrayBuffer);\n return bb.getBlob(mimeType);\n }\n\n return new Blob([arrayBuffer], {\n type: mimeType,\n });\n};\n\nconst getBlobFromByteStringWithMimeType = (byteString, mimeType) => {\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n\n return createBlob(ab, mimeType);\n};\n\nconst getMimeTypeFromBase64DataURI = dataURI => {\n return (/^data:(.+);/.exec(dataURI) || [])[1] || null;\n};\n\nconst getBase64DataFromBase64DataURI = dataURI => {\n // get data part of string (remove data:image/jpeg...,)\n const data = dataURI.split(',')[1];\n\n // remove any whitespace as that causes InvalidCharacterError in IE\n return data.replace(/\\s/g, '');\n};\n\nconst getByteStringFromBase64DataURI = dataURI => {\n return atob(getBase64DataFromBase64DataURI(dataURI));\n};\n\nconst getBlobFromBase64DataURI = dataURI => {\n const mimeType = getMimeTypeFromBase64DataURI(dataURI);\n const byteString = getByteStringFromBase64DataURI(dataURI);\n\n return getBlobFromByteStringWithMimeType(byteString, mimeType);\n};\n\nconst getFileFromBase64DataURI = (dataURI, filename, extension) => {\n return getFileFromBlob(getBlobFromBase64DataURI(dataURI), filename, null, extension);\n};\n\nconst getFileNameFromHeader = header => {\n // test if is content disposition header, if not exit\n if (!/^content-disposition:/i.test(header)) return null;\n\n // get filename parts\n const matches = header\n .split(/filename=|filename\\*=.+''/)\n .splice(1)\n .map(name => name.trim().replace(/^[\"']|[;\"']{0,2}$/g, ''))\n .filter(name => name.length);\n\n return matches.length ? decodeURI(matches[matches.length - 1]) : null;\n};\n\nconst getFileSizeFromHeader = header => {\n if (/content-length:/i.test(header)) {\n const size = header.match(/[0-9]+/)[0];\n return size ? parseInt(size, 10) : null;\n }\n return null;\n};\n\nconst getTranfserIdFromHeader = header => {\n if (/x-content-transfer-id:/i.test(header)) {\n const id = (header.split(':')[1] || '').trim();\n return id || null;\n }\n return null;\n};\n\nconst getFileInfoFromHeaders = headers => {\n const info = {\n source: null,\n name: null,\n size: null,\n };\n\n const rows = headers.split('\\n');\n for (let header of rows) {\n const name = getFileNameFromHeader(header);\n if (name) {\n info.name = name;\n continue;\n }\n\n const size = getFileSizeFromHeader(header);\n if (size) {\n info.size = size;\n continue;\n }\n\n const source = getTranfserIdFromHeader(header);\n if (source) {\n info.source = source;\n continue;\n }\n }\n\n return info;\n};\n\nconst createFileLoader = fetchFn => {\n const state = {\n source: null,\n complete: false,\n progress: 0,\n size: null,\n timestamp: null,\n duration: 0,\n request: null,\n };\n\n const getProgress = () => state.progress;\n const abort = () => {\n if (state.request && state.request.abort) {\n state.request.abort();\n }\n };\n\n // load source\n const load = () => {\n // get quick reference\n const source = state.source;\n\n api.fire('init', source);\n\n // Load Files\n if (source instanceof File) {\n api.fire('load', source);\n } else if (source instanceof Blob) {\n // Load blobs, set default name to current date\n api.fire('load', getFileFromBlob(source, source.name));\n } else if (isBase64DataURI(source)) {\n // Load base 64, set default name to current date\n api.fire('load', getFileFromBase64DataURI(source));\n } else {\n // Deal as if is external URL, let's load it!\n loadURL(source);\n }\n };\n\n // loads a url\n const loadURL = url => {\n // is remote url and no fetch method supplied\n if (!fetchFn) {\n api.fire('error', {\n type: 'error',\n body: \"Can't load URL\",\n code: 400,\n });\n return;\n }\n\n // set request start\n state.timestamp = Date.now();\n\n // load file\n state.request = fetchFn(\n url,\n response => {\n // update duration\n state.duration = Date.now() - state.timestamp;\n\n // done!\n state.complete = true;\n\n // turn blob response into a file\n if (response instanceof Blob) {\n response = getFileFromBlob(response, response.name || getFilenameFromURL(url));\n }\n\n api.fire(\n 'load',\n // if has received blob, we go with blob, if no response, we return null\n response instanceof Blob ? response : response ? response.body : null\n );\n },\n error => {\n api.fire(\n 'error',\n typeof error === 'string'\n ? {\n type: 'error',\n code: 0,\n body: error,\n }\n : error\n );\n },\n (computable, current, total) => {\n // collected some meta data already\n if (total) {\n state.size = total;\n }\n\n // update duration\n state.duration = Date.now() - state.timestamp;\n\n // if we can't compute progress, we're not going to fire progress events\n if (!computable) {\n state.progress = null;\n return;\n }\n\n // update progress percentage\n state.progress = current / total;\n\n // expose\n api.fire('progress', state.progress);\n },\n () => {\n api.fire('abort');\n },\n response => {\n const fileinfo = getFileInfoFromHeaders(\n typeof response === 'string' ? response : response.headers\n );\n api.fire('meta', {\n size: state.size || fileinfo.size,\n filename: fileinfo.name,\n source: fileinfo.source,\n });\n }\n );\n };\n\n const api = {\n ...on(),\n setSource: source => (state.source = source),\n getProgress, // file load progress\n abort, // abort file load\n load, // start load\n };\n\n return api;\n};\n\nconst isGet = method => /GET|HEAD/.test(method);\n\nconst sendRequest = (data, url, options) => {\n const api = {\n onheaders: () => {},\n onprogress: () => {},\n onload: () => {},\n ontimeout: () => {},\n onerror: () => {},\n onabort: () => {},\n abort: () => {\n aborted = true;\n xhr.abort();\n },\n };\n\n // timeout identifier, only used when timeout is defined\n let aborted = false;\n let headersReceived = false;\n\n // set default options\n options = {\n method: 'POST',\n headers: {},\n withCredentials: false,\n ...options,\n };\n\n // encode url\n url = encodeURI(url);\n\n // if method is GET, add any received data to url\n\n if (isGet(options.method) && data) {\n url = `${url}${encodeURIComponent(typeof data === 'string' ? data : JSON.stringify(data))}`;\n }\n\n // create request\n const xhr = new XMLHttpRequest();\n\n // progress of load\n const process = isGet(options.method) ? xhr : xhr.upload;\n process.onprogress = e => {\n // no progress event when aborted ( onprogress is called once after abort() )\n if (aborted) {\n return;\n }\n\n api.onprogress(e.lengthComputable, e.loaded, e.total);\n };\n\n // tries to get header info to the app as fast as possible\n xhr.onreadystatechange = () => {\n // not interesting in these states ('unsent' and 'openend' as they don't give us any additional info)\n if (xhr.readyState < 2) {\n return;\n }\n\n // no server response\n if (xhr.readyState === 4 && xhr.status === 0) {\n return;\n }\n\n if (headersReceived) {\n return;\n }\n\n headersReceived = true;\n\n // we've probably received some useful data in response headers\n api.onheaders(xhr);\n };\n\n // load successful\n xhr.onload = () => {\n // is classified as valid response\n if (xhr.status >= 200 && xhr.status < 300) {\n api.onload(xhr);\n } else {\n api.onerror(xhr);\n }\n };\n\n // error during load\n xhr.onerror = () => api.onerror(xhr);\n\n // request aborted\n xhr.onabort = () => {\n aborted = true;\n api.onabort();\n };\n\n // request timeout\n xhr.ontimeout = () => api.ontimeout(xhr);\n\n // open up open up!\n xhr.open(options.method, url, true);\n\n // set timeout if defined (do it after open so IE11 plays ball)\n if (isInt(options.timeout)) {\n xhr.timeout = options.timeout;\n }\n\n // add headers\n Object.keys(options.headers).forEach(key => {\n const value = unescape(encodeURIComponent(options.headers[key]));\n xhr.setRequestHeader(key, value);\n });\n\n // set type of response\n if (options.responseType) {\n xhr.responseType = options.responseType;\n }\n\n // set credentials\n if (options.withCredentials) {\n xhr.withCredentials = true;\n }\n\n // let's send our data\n xhr.send(data);\n\n return api;\n};\n\nconst createResponse = (type, code, body, headers) => ({\n type,\n code,\n body,\n headers,\n});\n\nconst createTimeoutResponse = cb => xhr => {\n cb(createResponse('error', 0, 'Timeout', xhr.getAllResponseHeaders()));\n};\n\nconst hasQS = str => /\\?/.test(str);\nconst buildURL = (...parts) => {\n let url = '';\n parts.forEach(part => {\n url += hasQS(url) && hasQS(part) ? part.replace(/\\?/, '&') : part;\n });\n return url;\n};\n\nconst createFetchFunction = (apiUrl = '', action) => {\n // custom handler (should also handle file, load, error, progress and abort)\n if (typeof action === 'function') {\n return action;\n }\n\n // no action supplied\n if (!action || !isString(action.url)) {\n return null;\n }\n\n // set onload hanlder\n const onload = action.onload || (res => res);\n const onerror = action.onerror || (res => null);\n\n // internal handler\n return (url, load, error, progress, abort, headers) => {\n // do local or remote request based on if the url is external\n const request = sendRequest(url, buildURL(apiUrl, action.url), {\n ...action,\n responseType: 'blob',\n });\n\n request.onload = xhr => {\n // get headers\n const headers = xhr.getAllResponseHeaders();\n\n // get filename\n const filename = getFileInfoFromHeaders(headers).name || getFilenameFromURL(url);\n\n // create response\n load(\n createResponse(\n 'load',\n xhr.status,\n action.method === 'HEAD'\n ? null\n : getFileFromBlob(onload(xhr.response), filename),\n headers\n )\n );\n };\n\n request.onerror = xhr => {\n error(\n createResponse(\n 'error',\n xhr.status,\n onerror(xhr.response) || xhr.statusText,\n xhr.getAllResponseHeaders()\n )\n );\n };\n\n request.onheaders = xhr => {\n headers(createResponse('headers', xhr.status, null, xhr.getAllResponseHeaders()));\n };\n\n request.ontimeout = createTimeoutResponse(error);\n request.onprogress = progress;\n request.onabort = abort;\n\n // should return request\n return request;\n };\n};\n\nconst ChunkStatus = {\n QUEUED: 0,\n COMPLETE: 1,\n PROCESSING: 2,\n ERROR: 3,\n WAITING: 4,\n};\n\n/*\nfunction signature:\n (file, metadata, load, error, progress, abort, transfer, options) => {\n return {\n abort:() => {}\n }\n}\n*/\n\n// apiUrl, action, name, file, metadata, load, error, progress, abort, transfer, options\nconst processFileChunked = (\n apiUrl,\n action,\n name,\n file,\n metadata,\n load,\n error,\n progress,\n abort,\n transfer,\n options\n) => {\n // all chunks\n const chunks = [];\n const { chunkTransferId, chunkServer, chunkSize, chunkRetryDelays } = options;\n\n // default state\n const state = {\n serverId: chunkTransferId,\n aborted: false,\n };\n\n // set onload handlers\n const ondata = action.ondata || (fd => fd);\n const onload =\n action.onload ||\n ((xhr, method) =>\n method === 'HEAD' ? xhr.getResponseHeader('Upload-Offset') : xhr.response);\n const onerror = action.onerror || (res => null);\n\n // create server hook\n const requestTransferId = cb => {\n const formData = new FormData();\n\n // add metadata under same name\n if (isObject(metadata)) formData.append(name, JSON.stringify(metadata));\n\n const headers =\n typeof action.headers === 'function'\n ? action.headers(file, metadata)\n : {\n ...action.headers,\n 'Upload-Length': file.size,\n };\n\n const requestParams = {\n ...action,\n headers,\n };\n\n // send request object\n const request = sendRequest(ondata(formData), buildURL(apiUrl, action.url), requestParams);\n\n request.onload = xhr => cb(onload(xhr, requestParams.method));\n\n request.onerror = xhr =>\n error(\n createResponse(\n 'error',\n xhr.status,\n onerror(xhr.response) || xhr.statusText,\n xhr.getAllResponseHeaders()\n )\n );\n\n request.ontimeout = createTimeoutResponse(error);\n };\n\n const requestTransferOffset = cb => {\n const requestUrl = buildURL(apiUrl, chunkServer.url, state.serverId);\n\n const headers =\n typeof action.headers === 'function'\n ? action.headers(state.serverId)\n : {\n ...action.headers,\n };\n\n const requestParams = {\n headers,\n method: 'HEAD',\n };\n\n const request = sendRequest(null, requestUrl, requestParams);\n\n request.onload = xhr => cb(onload(xhr, requestParams.method));\n\n request.onerror = xhr =>\n error(\n createResponse(\n 'error',\n xhr.status,\n onerror(xhr.response) || xhr.statusText,\n xhr.getAllResponseHeaders()\n )\n );\n\n request.ontimeout = createTimeoutResponse(error);\n };\n\n // create chunks\n const lastChunkIndex = Math.floor(file.size / chunkSize);\n for (let i = 0; i <= lastChunkIndex; i++) {\n const offset = i * chunkSize;\n const data = file.slice(offset, offset + chunkSize, 'application/offset+octet-stream');\n chunks[i] = {\n index: i,\n size: data.size,\n offset,\n data,\n file,\n progress: 0,\n retries: [...chunkRetryDelays],\n status: ChunkStatus.QUEUED,\n error: null,\n request: null,\n timeout: null,\n };\n }\n\n const completeProcessingChunks = () => load(state.serverId);\n\n const canProcessChunk = chunk =>\n chunk.status === ChunkStatus.QUEUED || chunk.status === ChunkStatus.ERROR;\n\n const processChunk = chunk => {\n // processing is paused, wait here\n if (state.aborted) return;\n\n // get next chunk to process\n chunk = chunk || chunks.find(canProcessChunk);\n\n // no more chunks to process\n if (!chunk) {\n // all done?\n if (chunks.every(chunk => chunk.status === ChunkStatus.COMPLETE)) {\n completeProcessingChunks();\n }\n\n // no chunk to handle\n return;\n }\n\n // now processing this chunk\n chunk.status = ChunkStatus.PROCESSING;\n chunk.progress = null;\n\n // allow parsing of formdata\n const ondata = chunkServer.ondata || (fd => fd);\n const onerror = chunkServer.onerror || (res => null);\n const onload = chunkServer.onload || (() => {});\n\n // send request object\n const requestUrl = buildURL(apiUrl, chunkServer.url, state.serverId);\n\n const headers =\n typeof chunkServer.headers === 'function'\n ? chunkServer.headers(chunk)\n : {\n ...chunkServer.headers,\n 'Content-Type': 'application/offset+octet-stream',\n 'Upload-Offset': chunk.offset,\n 'Upload-Length': file.size,\n 'Upload-Name': file.name,\n };\n\n const request = (chunk.request = sendRequest(ondata(chunk.data), requestUrl, {\n ...chunkServer,\n headers,\n }));\n\n request.onload = xhr => {\n // allow hooking into request result\n onload(xhr, chunk.index, chunks.length);\n\n // done!\n chunk.status = ChunkStatus.COMPLETE;\n\n // remove request reference\n chunk.request = null;\n\n // start processing more chunks\n processChunks();\n };\n\n request.onprogress = (lengthComputable, loaded, total) => {\n chunk.progress = lengthComputable ? loaded : null;\n updateTotalProgress();\n };\n\n request.onerror = xhr => {\n chunk.status = ChunkStatus.ERROR;\n chunk.request = null;\n chunk.error = onerror(xhr.response) || xhr.statusText;\n if (!retryProcessChunk(chunk)) {\n error(\n createResponse(\n 'error',\n xhr.status,\n onerror(xhr.response) || xhr.statusText,\n xhr.getAllResponseHeaders()\n )\n );\n }\n };\n\n request.ontimeout = xhr => {\n chunk.status = ChunkStatus.ERROR;\n chunk.request = null;\n if (!retryProcessChunk(chunk)) {\n createTimeoutResponse(error)(xhr);\n }\n };\n\n request.onabort = () => {\n chunk.status = ChunkStatus.QUEUED;\n chunk.request = null;\n abort();\n };\n };\n\n const retryProcessChunk = chunk => {\n // no more retries left\n if (chunk.retries.length === 0) return false;\n\n // new retry\n chunk.status = ChunkStatus.WAITING;\n clearTimeout(chunk.timeout);\n chunk.timeout = setTimeout(() => {\n processChunk(chunk);\n }, chunk.retries.shift());\n\n // we're going to retry\n return true;\n };\n\n const updateTotalProgress = () => {\n // calculate total progress fraction\n const totalBytesTransfered = chunks.reduce((p, chunk) => {\n if (p === null || chunk.progress === null) return null;\n return p + chunk.progress;\n }, 0);\n\n // can't compute progress\n if (totalBytesTransfered === null) return progress(false, 0, 0);\n\n // calculate progress values\n const totalSize = chunks.reduce((total, chunk) => total + chunk.size, 0);\n\n // can update progress indicator\n progress(true, totalBytesTransfered, totalSize);\n };\n\n // process new chunks\n const processChunks = () => {\n const totalProcessing = chunks.filter(chunk => chunk.status === ChunkStatus.PROCESSING)\n .length;\n if (totalProcessing >= 1) return;\n processChunk();\n };\n\n const abortChunks = () => {\n chunks.forEach(chunk => {\n clearTimeout(chunk.timeout);\n if (chunk.request) {\n chunk.request.abort();\n }\n });\n };\n\n // let's go!\n if (!state.serverId) {\n requestTransferId(serverId => {\n // stop here if aborted, might have happened in between request and callback\n if (state.aborted) return;\n\n // pass back to item so we can use it if something goes wrong\n transfer(serverId);\n\n // store internally\n state.serverId = serverId;\n processChunks();\n });\n } else {\n requestTransferOffset(offset => {\n // stop here if aborted, might have happened in between request and callback\n if (state.aborted) return;\n\n // mark chunks with lower offset as complete\n chunks\n .filter(chunk => chunk.offset < offset)\n .forEach(chunk => {\n chunk.status = ChunkStatus.COMPLETE;\n chunk.progress = chunk.size;\n });\n\n // continue processing\n processChunks();\n });\n }\n\n return {\n abort: () => {\n state.aborted = true;\n abortChunks();\n },\n };\n};\n\n/*\nfunction signature:\n (file, metadata, load, error, progress, abort) => {\n return {\n abort:() => {}\n }\n}\n*/\nconst createFileProcessorFunction = (apiUrl, action, name, options) => (\n file,\n metadata,\n load,\n error,\n progress,\n abort,\n transfer\n) => {\n // no file received\n if (!file) return;\n\n // if was passed a file, and we can chunk it, exit here\n const canChunkUpload = options.chunkUploads;\n const shouldChunkUpload = canChunkUpload && file.size > options.chunkSize;\n const willChunkUpload = canChunkUpload && (shouldChunkUpload || options.chunkForce);\n if (file instanceof Blob && willChunkUpload)\n return processFileChunked(\n apiUrl,\n action,\n name,\n file,\n metadata,\n load,\n error,\n progress,\n abort,\n transfer,\n options\n );\n\n // set handlers\n const ondata = action.ondata || (fd => fd);\n const onload = action.onload || (res => res);\n const onerror = action.onerror || (res => null);\n\n const headers =\n typeof action.headers === 'function'\n ? action.headers(file, metadata) || {}\n : {\n ...action.headers,\n };\n\n const requestParams = {\n ...action,\n headers,\n };\n\n // create formdata object\n var formData = new FormData();\n\n // add metadata under same name\n if (isObject(metadata)) {\n formData.append(name, JSON.stringify(metadata));\n }\n\n // Turn into an array of objects so no matter what the input, we can handle it the same way\n (file instanceof Blob ? [{ name: null, file }] : file).forEach(item => {\n formData.append(\n name,\n item.file,\n item.name === null ? item.file.name : `${item.name}${item.file.name}`\n );\n });\n\n // send request object\n const request = sendRequest(ondata(formData), buildURL(apiUrl, action.url), requestParams);\n request.onload = xhr => {\n load(createResponse('load', xhr.status, onload(xhr.response), xhr.getAllResponseHeaders()));\n };\n\n request.onerror = xhr => {\n error(\n createResponse(\n 'error',\n xhr.status,\n onerror(xhr.response) || xhr.statusText,\n xhr.getAllResponseHeaders()\n )\n );\n };\n\n request.ontimeout = createTimeoutResponse(error);\n request.onprogress = progress;\n request.onabort = abort;\n\n // should return request\n return request;\n};\n\nconst createProcessorFunction = (apiUrl = '', action, name, options) => {\n // custom handler (should also handle file, load, error, progress and abort)\n if (typeof action === 'function') return (...params) => action(name, ...params, options);\n\n // no action supplied\n if (!action || !isString(action.url)) return null;\n\n // internal handler\n return createFileProcessorFunction(apiUrl, action, name, options);\n};\n\n/*\n function signature:\n (uniqueFileId, load, error) => { }\n */\nconst createRevertFunction = (apiUrl = '', action) => {\n // is custom implementation\n if (typeof action === 'function') {\n return action;\n }\n\n // no action supplied, return stub function, interface will work, but file won't be removed\n if (!action || !isString(action.url)) {\n return (uniqueFileId, load) => load();\n }\n\n // set onload hanlder\n const onload = action.onload || (res => res);\n const onerror = action.onerror || (res => null);\n\n // internal implementation\n return (uniqueFileId, load, error) => {\n const request = sendRequest(\n uniqueFileId,\n apiUrl + action.url,\n action // contains method, headers and withCredentials properties\n );\n request.onload = xhr => {\n load(\n createResponse(\n 'load',\n xhr.status,\n onload(xhr.response),\n xhr.getAllResponseHeaders()\n )\n );\n };\n\n request.onerror = xhr => {\n error(\n createResponse(\n 'error',\n xhr.status,\n onerror(xhr.response) || xhr.statusText,\n xhr.getAllResponseHeaders()\n )\n );\n };\n\n request.ontimeout = createTimeoutResponse(error);\n\n return request;\n };\n};\n\nconst getRandomNumber = (min = 0, max = 1) => min + Math.random() * (max - min);\n\nconst createPerceivedPerformanceUpdater = (\n cb,\n duration = 1000,\n offset = 0,\n tickMin = 25,\n tickMax = 250\n) => {\n let timeout = null;\n const start = Date.now();\n\n const tick = () => {\n let runtime = Date.now() - start;\n let delay = getRandomNumber(tickMin, tickMax);\n\n if (runtime + delay > duration) {\n delay = runtime + delay - duration;\n }\n\n let progress = runtime / duration;\n if (progress >= 1 || document.hidden) {\n cb(1);\n return;\n }\n\n cb(progress);\n\n timeout = setTimeout(tick, delay);\n };\n\n if (duration > 0) tick();\n\n return {\n clear: () => {\n clearTimeout(timeout);\n },\n };\n};\n\nconst createFileProcessor = (processFn, options) => {\n const state = {\n complete: false,\n perceivedProgress: 0,\n perceivedPerformanceUpdater: null,\n progress: null,\n timestamp: null,\n perceivedDuration: 0,\n duration: 0,\n request: null,\n response: null,\n };\n\n const { allowMinimumUploadDuration } = options;\n\n const process = (file, metadata) => {\n const progressFn = () => {\n // we've not yet started the real download, stop here\n // the request might not go through, for instance, there might be some server trouble\n // if state.progress is null, the server does not allow computing progress and we show the spinner instead\n if (state.duration === 0 || state.progress === null) return;\n\n // as we're now processing, fire the progress event\n api.fire('progress', api.getProgress());\n };\n\n const completeFn = () => {\n state.complete = true;\n api.fire('load-perceived', state.response.body);\n };\n\n // let's start processing\n api.fire('start');\n\n // set request start\n state.timestamp = Date.now();\n\n // create perceived performance progress indicator\n state.perceivedPerformanceUpdater = createPerceivedPerformanceUpdater(\n progress => {\n state.perceivedProgress = progress;\n state.perceivedDuration = Date.now() - state.timestamp;\n\n progressFn();\n\n // if fake progress is done, and a response has been received,\n // and we've not yet called the complete method\n if (state.response && state.perceivedProgress === 1 && !state.complete) {\n // we done!\n completeFn();\n }\n },\n // random delay as in a list of files you start noticing\n // files uploading at the exact same speed\n allowMinimumUploadDuration ? getRandomNumber(750, 1500) : 0\n );\n\n // remember request so we can abort it later\n state.request = processFn(\n // the file to process\n file,\n\n // the metadata to send along\n metadata,\n\n // callbacks (load, error, progress, abort, transfer)\n // load expects the body to be a server id if\n // you want to make use of revert\n response => {\n // we put the response in state so we can access\n // it outside of this method\n state.response = isObject(response)\n ? response\n : {\n type: 'load',\n code: 200,\n body: `${response}`,\n headers: {},\n };\n\n // update duration\n state.duration = Date.now() - state.timestamp;\n\n // force progress to 1 as we're now done\n state.progress = 1;\n\n // actual load is done let's share results\n api.fire('load', state.response.body);\n\n // we are really done\n // if perceived progress is 1 ( wait for perceived progress to complete )\n // or if server does not support progress ( null )\n if (\n !allowMinimumUploadDuration ||\n (allowMinimumUploadDuration && state.perceivedProgress === 1)\n ) {\n completeFn();\n }\n },\n\n // error is expected to be an object with type, code, body\n error => {\n // cancel updater\n state.perceivedPerformanceUpdater.clear();\n\n // update others about this error\n api.fire(\n 'error',\n isObject(error)\n ? error\n : {\n type: 'error',\n code: 0,\n body: `${error}`,\n }\n );\n },\n\n // actual processing progress\n (computable, current, total) => {\n // update actual duration\n state.duration = Date.now() - state.timestamp;\n\n // update actual progress\n state.progress = computable ? current / total : null;\n\n progressFn();\n },\n\n // abort does not expect a value\n () => {\n // stop updater\n state.perceivedPerformanceUpdater.clear();\n\n // fire the abort event so we can switch visuals\n api.fire('abort', state.response ? state.response.body : null);\n },\n\n // register the id for this transfer\n transferId => {\n api.fire('transfer', transferId);\n }\n );\n };\n\n const abort = () => {\n // no request running, can't abort\n if (!state.request) return;\n\n // stop updater\n state.perceivedPerformanceUpdater.clear();\n\n // abort actual request\n if (state.request.abort) state.request.abort();\n\n // if has response object, we've completed the request\n state.complete = true;\n };\n\n const reset = () => {\n abort();\n state.complete = false;\n state.perceivedProgress = 0;\n state.progress = 0;\n state.timestamp = null;\n state.perceivedDuration = 0;\n state.duration = 0;\n state.request = null;\n state.response = null;\n };\n\n const getProgress = allowMinimumUploadDuration\n ? () => (state.progress ? Math.min(state.progress, state.perceivedProgress) : null)\n : () => state.progress || null;\n\n const getDuration = allowMinimumUploadDuration\n ? () => Math.min(state.duration, state.perceivedDuration)\n : () => state.duration;\n\n const api = {\n ...on(),\n process, // start processing file\n abort, // abort active process request\n getProgress,\n getDuration,\n reset,\n };\n\n return api;\n};\n\nconst getFilenameWithoutExtension = name => name.substring(0, name.lastIndexOf('.')) || name;\n\nconst createFileStub = source => {\n let data = [source.name, source.size, source.type];\n\n // is blob or base64, then we need to set the name\n if (source instanceof Blob || isBase64DataURI(source)) {\n data[0] = source.name || getDateString();\n } else if (isBase64DataURI(source)) {\n // if is base64 data uri we need to determine the average size and type\n data[1] = source.length;\n data[2] = getMimeTypeFromBase64DataURI(source);\n } else if (isString(source)) {\n // url\n data[0] = getFilenameFromURL(source);\n data[1] = 0;\n data[2] = 'application/octet-stream';\n }\n\n return {\n name: data[0],\n size: data[1],\n type: data[2],\n };\n};\n\nconst isFile = value => !!(value instanceof File || (value instanceof Blob && value.name));\n\nconst deepCloneObject = src => {\n if (!isObject(src)) return src;\n const target = isArray(src) ? [] : {};\n for (const key in src) {\n if (!src.hasOwnProperty(key)) continue;\n const v = src[key];\n target[key] = v && isObject(v) ? deepCloneObject(v) : v;\n }\n return target;\n};\n\nconst createItem = (origin = null, serverFileReference = null, file = null) => {\n // unique id for this item, is used to identify the item across views\n const id = getUniqueId();\n\n /**\n * Internal item state\n */\n const state = {\n // is archived\n archived: false,\n\n // if is frozen, no longer fires events\n frozen: false,\n\n // removed from view\n released: false,\n\n // original source\n source: null,\n\n // file model reference\n file,\n\n // id of file on server\n serverFileReference,\n\n // id of file transfer on server\n transferId: null,\n\n // is aborted\n processingAborted: false,\n\n // current item status\n status: serverFileReference ? ItemStatus.PROCESSING_COMPLETE : ItemStatus.INIT,\n\n // active processes\n activeLoader: null,\n activeProcessor: null,\n };\n\n // callback used when abort processing is called to link back to the resolve method\n let abortProcessingRequestComplete = null;\n\n /**\n * Externally added item metadata\n */\n const metadata = {};\n\n // item data\n const setStatus = status => (state.status = status);\n\n // fire event unless the item has been archived\n const fire = (event, ...params) => {\n if (state.released || state.frozen) return;\n api.fire(event, ...params);\n };\n\n // file data\n const getFileExtension = () => getExtensionFromFilename(state.file.name);\n const getFileType = () => state.file.type;\n const getFileSize = () => state.file.size;\n const getFile = () => state.file;\n\n //\n // logic to load a file\n //\n const load = (source, loader, onload) => {\n // remember the original item source\n state.source = source;\n\n // source is known\n api.fireSync('init');\n\n // file stub is already there\n if (state.file) {\n api.fireSync('load-skip');\n return;\n }\n\n // set a stub file object while loading the actual data\n state.file = createFileStub(source);\n\n // starts loading\n loader.on('init', () => {\n fire('load-init');\n });\n\n // we'eve received a size indication, let's update the stub\n loader.on('meta', meta => {\n // set size of file stub\n state.file.size = meta.size;\n\n // set name of file stub\n state.file.filename = meta.filename;\n\n // if has received source, we done\n if (meta.source) {\n origin = FileOrigin.LIMBO;\n state.serverFileReference = meta.source;\n state.status = ItemStatus.PROCESSING_COMPLETE;\n }\n\n // size has been updated\n fire('load-meta');\n });\n\n // the file is now loading we need to update the progress indicators\n loader.on('progress', progress => {\n setStatus(ItemStatus.LOADING);\n\n fire('load-progress', progress);\n });\n\n // an error was thrown while loading the file, we need to switch to error state\n loader.on('error', error => {\n setStatus(ItemStatus.LOAD_ERROR);\n\n fire('load-request-error', error);\n });\n\n // user or another process aborted the file load (cannot retry)\n loader.on('abort', () => {\n setStatus(ItemStatus.INIT);\n fire('load-abort');\n });\n\n // done loading\n loader.on('load', file => {\n // as we've now loaded the file the loader is no longer required\n state.activeLoader = null;\n\n // called when file has loaded succesfully\n const success = result => {\n // set (possibly) transformed file\n state.file = isFile(result) ? result : state.file;\n\n // file received\n if (origin === FileOrigin.LIMBO && state.serverFileReference) {\n setStatus(ItemStatus.PROCESSING_COMPLETE);\n } else {\n setStatus(ItemStatus.IDLE);\n }\n\n fire('load');\n };\n\n const error = result => {\n // set original file\n state.file = file;\n fire('load-meta');\n\n setStatus(ItemStatus.LOAD_ERROR);\n fire('load-file-error', result);\n };\n\n // if we already have a server file reference, we don't need to call the onload method\n if (state.serverFileReference) {\n success(file);\n return;\n }\n\n // no server id, let's give this file the full treatment\n onload(file, success, error);\n });\n\n // set loader source data\n loader.setSource(source);\n\n // set as active loader\n state.activeLoader = loader;\n\n // load the source data\n loader.load();\n };\n\n const retryLoad = () => {\n if (!state.activeLoader) {\n return;\n }\n state.activeLoader.load();\n };\n\n const abortLoad = () => {\n if (state.activeLoader) {\n state.activeLoader.abort();\n return;\n }\n setStatus(ItemStatus.INIT);\n fire('load-abort');\n };\n\n //\n // logic to process a file\n //\n const process = (processor, onprocess) => {\n // processing was aborted\n if (state.processingAborted) {\n state.processingAborted = false;\n return;\n }\n\n // now processing\n setStatus(ItemStatus.PROCESSING);\n\n // reset abort callback\n abortProcessingRequestComplete = null;\n\n // if no file loaded we'll wait for the load event\n if (!(state.file instanceof Blob)) {\n api.on('load', () => {\n process(processor, onprocess);\n });\n return;\n }\n\n // setup processor\n processor.on('load', serverFileReference => {\n // need this id to be able to revert the upload\n state.transferId = null;\n state.serverFileReference = serverFileReference;\n });\n\n // register transfer id\n processor.on('transfer', transferId => {\n // need this id to be able to revert the upload\n state.transferId = transferId;\n });\n\n processor.on('load-perceived', serverFileReference => {\n // no longer required\n state.activeProcessor = null;\n\n // need this id to be able to rever the upload\n state.transferId = null;\n state.serverFileReference = serverFileReference;\n\n setStatus(ItemStatus.PROCESSING_COMPLETE);\n fire('process-complete', serverFileReference);\n });\n\n processor.on('start', () => {\n fire('process-start');\n });\n\n processor.on('error', error => {\n state.activeProcessor = null;\n setStatus(ItemStatus.PROCESSING_ERROR);\n fire('process-error', error);\n });\n\n processor.on('abort', serverFileReference => {\n state.activeProcessor = null;\n\n // if file was uploaded but processing was cancelled during perceived processor time store file reference\n state.serverFileReference = serverFileReference;\n\n setStatus(ItemStatus.IDLE);\n fire('process-abort');\n\n // has timeout so doesn't interfere with remove action\n if (abortProcessingRequestComplete) {\n abortProcessingRequestComplete();\n }\n });\n\n processor.on('progress', progress => {\n fire('process-progress', progress);\n });\n\n // when successfully transformed\n const success = file => {\n // if was archived in the mean time, don't process\n if (state.archived) return;\n\n // process file!\n processor.process(file, { ...metadata });\n };\n\n // something went wrong during transform phase\n const error = console.error;\n\n // start processing the file\n onprocess(state.file, success, error);\n\n // set as active processor\n state.activeProcessor = processor;\n };\n\n const requestProcessing = () => {\n state.processingAborted = false;\n setStatus(ItemStatus.PROCESSING_QUEUED);\n };\n\n const abortProcessing = () =>\n new Promise(resolve => {\n if (!state.activeProcessor) {\n state.processingAborted = true;\n\n setStatus(ItemStatus.IDLE);\n fire('process-abort');\n\n resolve();\n return;\n }\n\n abortProcessingRequestComplete = () => {\n resolve();\n };\n\n state.activeProcessor.abort();\n });\n\n //\n // logic to revert a processed file\n //\n const revert = (revertFileUpload, forceRevert) =>\n new Promise((resolve, reject) => {\n // a completed upload will have a serverFileReference, a failed chunked upload where\n // getting a serverId succeeded but >=0 chunks have been uploaded will have transferId set\n const serverTransferId =\n state.serverFileReference !== null ? state.serverFileReference : state.transferId;\n\n // cannot revert without a server id for this process\n if (serverTransferId === null) {\n resolve();\n return;\n }\n\n // revert the upload (fire and forget)\n revertFileUpload(\n serverTransferId,\n () => {\n // reset file server id and transfer id as now it's not available on the server\n state.serverFileReference = null;\n state.transferId = null;\n resolve();\n },\n error => {\n // don't set error state when reverting is optional, it will always resolve\n if (!forceRevert) {\n resolve();\n return;\n }\n\n // oh no errors\n setStatus(ItemStatus.PROCESSING_REVERT_ERROR);\n fire('process-revert-error');\n reject(error);\n }\n );\n\n // fire event\n setStatus(ItemStatus.IDLE);\n fire('process-revert');\n });\n\n // exposed methods\n const setMetadata = (key, value, silent) => {\n const keys = key.split('.');\n const root = keys[0];\n const last = keys.pop();\n let data = metadata;\n keys.forEach(key => (data = data[key]));\n\n // compare old value against new value, if they're the same, we're not updating\n if (JSON.stringify(data[last]) === JSON.stringify(value)) return;\n\n // update value\n data[last] = value;\n\n // fire update\n fire('metadata-update', {\n key: root,\n value: metadata[root],\n silent,\n });\n };\n\n const getMetadata = key => deepCloneObject(key ? metadata[key] : metadata);\n\n const api = {\n id: { get: () => id },\n origin: { get: () => origin, set: value => (origin = value) },\n serverId: { get: () => state.serverFileReference },\n transferId: { get: () => state.transferId },\n status: { get: () => state.status },\n filename: { get: () => state.file.name },\n filenameWithoutExtension: { get: () => getFilenameWithoutExtension(state.file.name) },\n fileExtension: { get: getFileExtension },\n fileType: { get: getFileType },\n fileSize: { get: getFileSize },\n file: { get: getFile },\n relativePath: { get: () => state.file._relativePath },\n\n source: { get: () => state.source },\n\n getMetadata,\n setMetadata: (key, value, silent) => {\n if (isObject(key)) {\n const data = key;\n Object.keys(data).forEach(key => {\n setMetadata(key, data[key], value);\n });\n return key;\n }\n setMetadata(key, value, silent);\n return value;\n },\n\n extend: (name, handler) => (itemAPI[name] = handler),\n\n abortLoad,\n retryLoad,\n requestProcessing,\n abortProcessing,\n\n load,\n process,\n revert,\n\n ...on(),\n\n freeze: () => (state.frozen = true),\n\n release: () => (state.released = true),\n released: { get: () => state.released },\n\n archive: () => (state.archived = true),\n archived: { get: () => state.archived },\n\n // replace source and file object\n setFile: file => (state.file = file),\n };\n\n // create it here instead of returning it instantly so we can extend it later\n const itemAPI = createObject(api);\n\n return itemAPI;\n};\n\nconst getItemIndexByQuery = (items, query) => {\n // just return first index\n if (isEmpty(query)) {\n return 0;\n }\n\n // invalid queries\n if (!isString(query)) {\n return -1;\n }\n\n // return item by id (or -1 if not found)\n return items.findIndex(item => item.id === query);\n};\n\nconst getItemById = (items, itemId) => {\n const index = getItemIndexByQuery(items, itemId);\n if (index < 0) {\n return;\n }\n return items[index] || null;\n};\n\nconst fetchBlob = (url, load, error, progress, abort, headers) => {\n const request = sendRequest(null, url, {\n method: 'GET',\n responseType: 'blob',\n });\n\n request.onload = xhr => {\n // get headers\n const headers = xhr.getAllResponseHeaders();\n\n // get filename\n const filename = getFileInfoFromHeaders(headers).name || getFilenameFromURL(url);\n\n // create response\n load(createResponse('load', xhr.status, getFileFromBlob(xhr.response, filename), headers));\n };\n\n request.onerror = xhr => {\n error(createResponse('error', xhr.status, xhr.statusText, xhr.getAllResponseHeaders()));\n };\n\n request.onheaders = xhr => {\n headers(createResponse('headers', xhr.status, null, xhr.getAllResponseHeaders()));\n };\n\n request.ontimeout = createTimeoutResponse(error);\n request.onprogress = progress;\n request.onabort = abort;\n\n // should return request\n return request;\n};\n\nconst getDomainFromURL = url => {\n if (url.indexOf('//') === 0) {\n url = location.protocol + url;\n }\n return url\n .toLowerCase()\n .replace('blob:', '')\n .replace(/([a-z])?:\\/\\//, '$1')\n .split('/')[0];\n};\n\nconst isExternalURL = url =>\n (url.indexOf(':') > -1 || url.indexOf('//') > -1) &&\n getDomainFromURL(location.href) !== getDomainFromURL(url);\n\nconst dynamicLabel = label => (...params) => (isFunction(label) ? label(...params) : label);\n\nconst isMockItem = item => !isFile(item.file);\n\nconst listUpdated = (dispatch, state) => {\n clearTimeout(state.listUpdateTimeout);\n state.listUpdateTimeout = setTimeout(() => {\n dispatch('DID_UPDATE_ITEMS', { items: getActiveItems(state.items) });\n }, 0);\n};\n\nconst optionalPromise = (fn, ...params) =>\n new Promise(resolve => {\n if (!fn) {\n return resolve(true);\n }\n\n const result = fn(...params);\n\n if (result == null) {\n return resolve(true);\n }\n\n if (typeof result === 'boolean') {\n return resolve(result);\n }\n\n if (typeof result.then === 'function') {\n result.then(resolve);\n }\n });\n\nconst sortItems = (state, compare) => {\n state.items.sort((a, b) => compare(createItemAPI(a), createItemAPI(b)));\n};\n\n// returns item based on state\nconst getItemByQueryFromState = (state, itemHandler) => ({\n query,\n success = () => {},\n failure = () => {},\n ...options\n} = {}) => {\n const item = getItemByQuery(state.items, query);\n if (!item) {\n failure({\n error: createResponse('error', 0, 'Item not found'),\n file: null,\n });\n return;\n }\n itemHandler(item, success, failure, options || {});\n};\n\nconst actions = (dispatch, query, state) => ({\n /**\n * Aborts all ongoing processes\n */\n ABORT_ALL: () => {\n getActiveItems(state.items).forEach(item => {\n item.freeze();\n item.abortLoad();\n item.abortProcessing();\n });\n },\n\n /**\n * Sets initial files\n */\n DID_SET_FILES: ({ value = [] }) => {\n // map values to file objects\n const files = value.map(file => ({\n source: file.source ? file.source : file,\n options: file.options,\n }));\n\n // loop over files, if file is in list, leave it be, if not, remove\n // test if items should be moved\n let activeItems = getActiveItems(state.items);\n\n activeItems.forEach(item => {\n // if item not is in new value, remove\n if (!files.find(file => file.source === item.source || file.source === item.file)) {\n dispatch('REMOVE_ITEM', { query: item, remove: false });\n }\n });\n\n // add new files\n activeItems = getActiveItems(state.items);\n files.forEach((file, index) => {\n // if file is already in list\n if (activeItems.find(item => item.source === file.source || item.file === file.source))\n return;\n\n // not in list, add\n dispatch('ADD_ITEM', {\n ...file,\n interactionMethod: InteractionMethod.NONE,\n index,\n });\n });\n },\n\n DID_UPDATE_ITEM_METADATA: ({ id, action, change }) => {\n // don't do anything\n if (change.silent) return;\n\n // if is called multiple times in close succession we combined all calls together to save resources\n clearTimeout(state.itemUpdateTimeout);\n state.itemUpdateTimeout = setTimeout(() => {\n const item = getItemById(state.items, id);\n\n // only revert and attempt to upload when we're uploading to a server\n if (!query('IS_ASYNC')) {\n // should we update the output data\n applyFilterChain('SHOULD_PREPARE_OUTPUT', false, {\n item,\n query,\n action,\n change,\n }).then(shouldPrepareOutput => {\n // plugins determined the output data should be prepared (or not), can be adjusted with beforePrepareOutput hook\n const beforePrepareFile = query('GET_BEFORE_PREPARE_FILE');\n if (beforePrepareFile)\n shouldPrepareOutput = beforePrepareFile(item, shouldPrepareOutput);\n\n if (!shouldPrepareOutput) return;\n\n dispatch(\n 'REQUEST_PREPARE_OUTPUT',\n {\n query: id,\n item,\n success: file => {\n dispatch('DID_PREPARE_OUTPUT', { id, file });\n },\n },\n true\n );\n });\n\n return;\n }\n\n // if is local item we need to enable upload button so change can be propagated to server\n if (item.origin === FileOrigin.LOCAL) {\n dispatch('DID_LOAD_ITEM', {\n id: item.id,\n error: null,\n serverFileReference: item.source,\n });\n }\n\n // for async scenarios\n const upload = () => {\n // we push this forward a bit so the interface is updated correctly\n setTimeout(() => {\n dispatch('REQUEST_ITEM_PROCESSING', { query: id });\n }, 32);\n };\n\n const revert = doUpload => {\n item.revert(\n createRevertFunction(state.options.server.url, state.options.server.revert),\n query('GET_FORCE_REVERT')\n )\n .then(doUpload ? upload : () => {})\n .catch(() => {});\n };\n\n const abort = doUpload => {\n item.abortProcessing().then(doUpload ? upload : () => {});\n };\n\n // if we should re-upload the file immediately\n if (item.status === ItemStatus.PROCESSING_COMPLETE) {\n return revert(state.options.instantUpload);\n }\n\n // if currently uploading, cancel upload\n if (item.status === ItemStatus.PROCESSING) {\n return abort(state.options.instantUpload);\n }\n\n if (state.options.instantUpload) {\n upload();\n }\n }, 0);\n },\n\n MOVE_ITEM: ({ query, index }) => {\n const item = getItemByQuery(state.items, query);\n if (!item) return;\n const currentIndex = state.items.indexOf(item);\n index = limit(index, 0, state.items.length - 1);\n if (currentIndex === index) return;\n state.items.splice(index, 0, state.items.splice(currentIndex, 1)[0]);\n },\n\n SORT: ({ compare }) => {\n sortItems(state, compare);\n dispatch('DID_SORT_ITEMS', {\n items: query('GET_ACTIVE_ITEMS'),\n });\n },\n\n ADD_ITEMS: ({ items, index, interactionMethod, success = () => {}, failure = () => {} }) => {\n let currentIndex = index;\n\n if (index === -1 || typeof index === 'undefined') {\n const insertLocation = query('GET_ITEM_INSERT_LOCATION');\n const totalItems = query('GET_TOTAL_ITEMS');\n currentIndex = insertLocation === 'before' ? 0 : totalItems;\n }\n\n const ignoredFiles = query('GET_IGNORED_FILES');\n const isValidFile = source =>\n isFile(source) ? !ignoredFiles.includes(source.name.toLowerCase()) : !isEmpty(source);\n const validItems = items.filter(isValidFile);\n\n const promises = validItems.map(\n source =>\n new Promise((resolve, reject) => {\n dispatch('ADD_ITEM', {\n interactionMethod,\n source: source.source || source,\n success: resolve,\n failure: reject,\n index: currentIndex++,\n options: source.options || {},\n });\n })\n );\n\n Promise.all(promises)\n .then(success)\n .catch(failure);\n },\n\n /**\n * @param source\n * @param index\n * @param interactionMethod\n */\n ADD_ITEM: ({\n source,\n index = -1,\n interactionMethod,\n success = () => {},\n failure = () => {},\n options = {},\n }) => {\n // if no source supplied\n if (isEmpty(source)) {\n failure({\n error: createResponse('error', 0, 'No source'),\n file: null,\n });\n return;\n }\n\n // filter out invalid file items, used to filter dropped directory contents\n if (isFile(source) && state.options.ignoredFiles.includes(source.name.toLowerCase())) {\n // fail silently\n return;\n }\n\n // test if there's still room in the list of files\n if (!hasRoomForItem(state)) {\n // if multiple allowed, we can't replace\n // or if only a single item is allowed but we're not allowed to replace it we exit\n if (\n state.options.allowMultiple ||\n (!state.options.allowMultiple && !state.options.allowReplace)\n ) {\n const error = createResponse('warning', 0, 'Max files');\n\n dispatch('DID_THROW_MAX_FILES', {\n source,\n error,\n });\n\n failure({ error, file: null });\n\n return;\n }\n\n // let's replace the item\n // id of first item we're about to remove\n const item = getActiveItems(state.items)[0];\n\n // if has been processed remove it from the server as well\n if (\n item.status === ItemStatus.PROCESSING_COMPLETE ||\n item.status === ItemStatus.PROCESSING_REVERT_ERROR\n ) {\n const forceRevert = query('GET_FORCE_REVERT');\n item.revert(\n createRevertFunction(state.options.server.url, state.options.server.revert),\n forceRevert\n )\n .then(() => {\n if (!forceRevert) return;\n\n // try to add now\n dispatch('ADD_ITEM', {\n source,\n index,\n interactionMethod,\n success,\n failure,\n options,\n });\n })\n .catch(() => {}); // no need to handle this catch state for now\n\n if (forceRevert) return;\n }\n\n // remove first item as it will be replaced by this item\n dispatch('REMOVE_ITEM', { query: item.id });\n }\n\n // where did the file originate\n const origin =\n options.type === 'local'\n ? FileOrigin.LOCAL\n : options.type === 'limbo'\n ? FileOrigin.LIMBO\n : FileOrigin.INPUT;\n\n // create a new blank item\n const item = createItem(\n // where did this file come from\n origin,\n\n // an input file never has a server file reference\n origin === FileOrigin.INPUT ? null : source,\n\n // file mock data, if defined\n options.file\n );\n\n // set initial meta data\n Object.keys(options.metadata || {}).forEach(key => {\n item.setMetadata(key, options.metadata[key]);\n });\n\n // created the item, let plugins add methods\n applyFilters('DID_CREATE_ITEM', item, { query, dispatch });\n\n // where to insert new items\n const itemInsertLocation = query('GET_ITEM_INSERT_LOCATION');\n\n // adjust index if is not allowed to pick location\n if (!state.options.itemInsertLocationFreedom) {\n index = itemInsertLocation === 'before' ? -1 : state.items.length;\n }\n\n // add item to list\n insertItem(state.items, item, index);\n\n // sort items in list\n if (isFunction(itemInsertLocation) && source) {\n sortItems(state, itemInsertLocation);\n }\n\n // get a quick reference to the item id\n const id = item.id;\n\n // observe item events\n item.on('init', () => {\n dispatch('DID_INIT_ITEM', { id });\n });\n\n item.on('load-init', () => {\n dispatch('DID_START_ITEM_LOAD', { id });\n });\n\n item.on('load-meta', () => {\n dispatch('DID_UPDATE_ITEM_META', { id });\n });\n\n item.on('load-progress', progress => {\n dispatch('DID_UPDATE_ITEM_LOAD_PROGRESS', { id, progress });\n });\n\n item.on('load-request-error', error => {\n const mainStatus = dynamicLabel(state.options.labelFileLoadError)(error);\n\n // is client error, no way to recover\n if (error.code >= 400 && error.code < 500) {\n dispatch('DID_THROW_ITEM_INVALID', {\n id,\n error,\n status: {\n main: mainStatus,\n sub: `${error.code} (${error.body})`,\n },\n });\n\n // reject the file so can be dealt with through API\n failure({ error, file: createItemAPI(item) });\n return;\n }\n\n // is possible server error, so might be possible to retry\n dispatch('DID_THROW_ITEM_LOAD_ERROR', {\n id,\n error,\n status: {\n main: mainStatus,\n sub: state.options.labelTapToRetry,\n },\n });\n });\n\n item.on('load-file-error', error => {\n dispatch('DID_THROW_ITEM_INVALID', {\n id,\n error: error.status,\n status: error.status,\n });\n failure({ error: error.status, file: createItemAPI(item) });\n });\n\n item.on('load-abort', () => {\n dispatch('REMOVE_ITEM', { query: id });\n });\n\n item.on('load-skip', () => {\n item.on('metadata-update', change => {\n if (!isFile(item.file)) return;\n dispatch('DID_UPDATE_ITEM_METADATA', { id, change });\n });\n\n dispatch('COMPLETE_LOAD_ITEM', {\n query: id,\n item,\n data: {\n source,\n success,\n },\n });\n });\n\n item.on('load', () => {\n const handleAdd = shouldAdd => {\n // no should not add this file\n if (!shouldAdd) {\n dispatch('REMOVE_ITEM', {\n query: id,\n });\n return;\n }\n\n // now interested in metadata updates\n item.on('metadata-update', change => {\n dispatch('DID_UPDATE_ITEM_METADATA', { id, change });\n });\n\n // let plugins decide if the output data should be prepared at this point\n // means we'll do this and wait for idle state\n applyFilterChain('SHOULD_PREPARE_OUTPUT', false, { item, query }).then(\n shouldPrepareOutput => {\n // plugins determined the output data should be prepared (or not), can be adjusted with beforePrepareOutput hook\n const beforePrepareFile = query('GET_BEFORE_PREPARE_FILE');\n if (beforePrepareFile)\n shouldPrepareOutput = beforePrepareFile(item, shouldPrepareOutput);\n\n const loadComplete = () => {\n dispatch('COMPLETE_LOAD_ITEM', {\n query: id,\n item,\n data: {\n source,\n success,\n },\n });\n\n listUpdated(dispatch, state);\n };\n\n // exit\n if (shouldPrepareOutput) {\n // wait for idle state and then run PREPARE_OUTPUT\n dispatch(\n 'REQUEST_PREPARE_OUTPUT',\n {\n query: id,\n item,\n success: file => {\n dispatch('DID_PREPARE_OUTPUT', { id, file });\n loadComplete();\n },\n },\n true\n );\n\n return;\n }\n\n loadComplete();\n }\n );\n };\n\n // item loaded, allow plugins to\n // - read data (quickly)\n // - add metadata\n applyFilterChain('DID_LOAD_ITEM', item, { query, dispatch })\n .then(() => {\n optionalPromise(query('GET_BEFORE_ADD_FILE'), createItemAPI(item)).then(\n handleAdd\n );\n })\n .catch(e => {\n if (!e || !e.error || !e.status) return handleAdd(false);\n dispatch('DID_THROW_ITEM_INVALID', {\n id,\n error: e.error,\n status: e.status,\n });\n });\n });\n\n item.on('process-start', () => {\n dispatch('DID_START_ITEM_PROCESSING', { id });\n });\n\n item.on('process-progress', progress => {\n dispatch('DID_UPDATE_ITEM_PROCESS_PROGRESS', { id, progress });\n });\n\n item.on('process-error', error => {\n dispatch('DID_THROW_ITEM_PROCESSING_ERROR', {\n id,\n error,\n status: {\n main: dynamicLabel(state.options.labelFileProcessingError)(error),\n sub: state.options.labelTapToRetry,\n },\n });\n });\n\n item.on('process-revert-error', error => {\n dispatch('DID_THROW_ITEM_PROCESSING_REVERT_ERROR', {\n id,\n error,\n status: {\n main: dynamicLabel(state.options.labelFileProcessingRevertError)(error),\n sub: state.options.labelTapToRetry,\n },\n });\n });\n\n item.on('process-complete', serverFileReference => {\n dispatch('DID_COMPLETE_ITEM_PROCESSING', {\n id,\n error: null,\n serverFileReference,\n });\n dispatch('DID_DEFINE_VALUE', { id, value: serverFileReference });\n });\n\n item.on('process-abort', () => {\n dispatch('DID_ABORT_ITEM_PROCESSING', { id });\n });\n\n item.on('process-revert', () => {\n dispatch('DID_REVERT_ITEM_PROCESSING', { id });\n dispatch('DID_DEFINE_VALUE', { id, value: null });\n });\n\n // let view know the item has been inserted\n dispatch('DID_ADD_ITEM', { id, index, interactionMethod });\n\n listUpdated(dispatch, state);\n\n // start loading the source\n const { url, load, restore, fetch } = state.options.server || {};\n\n item.load(\n source,\n\n // this creates a function that loads the file based on the type of file (string, base64, blob, file) and location of file (local, remote, limbo)\n createFileLoader(\n origin === FileOrigin.INPUT\n ? // input, if is remote, see if should use custom fetch, else use default fetchBlob\n isString(source) && isExternalURL(source)\n ? fetch\n ? createFetchFunction(url, fetch)\n : fetchBlob // remote url\n : fetchBlob // try to fetch url\n : // limbo or local\n origin === FileOrigin.LIMBO\n ? createFetchFunction(url, restore) // limbo\n : createFetchFunction(url, load) // local\n ),\n\n // called when the file is loaded so it can be piped through the filters\n (file, success, error) => {\n // let's process the file\n applyFilterChain('LOAD_FILE', file, { query })\n .then(success)\n .catch(error);\n }\n );\n },\n\n REQUEST_PREPARE_OUTPUT: ({ item, success, failure = () => {} }) => {\n // error response if item archived\n const err = {\n error: createResponse('error', 0, 'Item not found'),\n file: null,\n };\n\n // don't handle archived items, an item could have been archived (load aborted) while waiting to be prepared\n if (item.archived) return failure(err);\n\n // allow plugins to alter the file data\n applyFilterChain('PREPARE_OUTPUT', item.file, { query, item }).then(result => {\n applyFilterChain('COMPLETE_PREPARE_OUTPUT', result, { query, item }).then(result => {\n // don't handle archived items, an item could have been archived (load aborted) while being prepared\n if (item.archived) return failure(err);\n\n // we done!\n success(result);\n });\n });\n },\n\n COMPLETE_LOAD_ITEM: ({ item, data }) => {\n const { success, source } = data;\n\n // sort items in list\n const itemInsertLocation = query('GET_ITEM_INSERT_LOCATION');\n if (isFunction(itemInsertLocation) && source) {\n sortItems(state, itemInsertLocation);\n }\n\n // let interface know the item has loaded\n dispatch('DID_LOAD_ITEM', {\n id: item.id,\n error: null,\n serverFileReference: item.origin === FileOrigin.INPUT ? null : source,\n });\n\n // item has been successfully loaded and added to the\n // list of items so can now be safely returned for use\n success(createItemAPI(item));\n\n // if this is a local server file we need to show a different state\n if (item.origin === FileOrigin.LOCAL) {\n dispatch('DID_LOAD_LOCAL_ITEM', { id: item.id });\n return;\n }\n\n // if is a temp server file we prevent async upload call here (as the file is already on the server)\n if (item.origin === FileOrigin.LIMBO) {\n dispatch('DID_COMPLETE_ITEM_PROCESSING', {\n id: item.id,\n error: null,\n serverFileReference: source,\n });\n\n dispatch('DID_DEFINE_VALUE', {\n id: item.id,\n value: item.serverId || source,\n });\n return;\n }\n\n // id we are allowed to upload the file immediately, lets do it\n if (query('IS_ASYNC') && state.options.instantUpload) {\n dispatch('REQUEST_ITEM_PROCESSING', { query: item.id });\n }\n },\n\n RETRY_ITEM_LOAD: getItemByQueryFromState(state, item => {\n // try loading the source one more time\n item.retryLoad();\n }),\n\n REQUEST_ITEM_PREPARE: getItemByQueryFromState(state, (item, success, failure) => {\n dispatch(\n 'REQUEST_PREPARE_OUTPUT',\n {\n query: item.id,\n item,\n success: file => {\n dispatch('DID_PREPARE_OUTPUT', { id: item.id, file });\n success({\n file: item,\n output: file,\n });\n },\n failure,\n },\n true\n );\n }),\n\n REQUEST_ITEM_PROCESSING: getItemByQueryFromState(state, (item, success, failure) => {\n // cannot be queued (or is already queued)\n const itemCanBeQueuedForProcessing =\n // waiting for something\n item.status === ItemStatus.IDLE ||\n // processing went wrong earlier\n item.status === ItemStatus.PROCESSING_ERROR;\n\n // not ready to be processed\n if (!itemCanBeQueuedForProcessing) {\n const processNow = () =>\n dispatch('REQUEST_ITEM_PROCESSING', { query: item, success, failure });\n\n const process = () => (document.hidden ? processNow() : setTimeout(processNow, 32));\n\n // if already done processing or tried to revert but didn't work, try again\n if (\n item.status === ItemStatus.PROCESSING_COMPLETE ||\n item.status === ItemStatus.PROCESSING_REVERT_ERROR\n ) {\n item.revert(\n createRevertFunction(state.options.server.url, state.options.server.revert),\n query('GET_FORCE_REVERT')\n )\n .then(process)\n .catch(() => {}); // don't continue with processing if something went wrong\n } else if (item.status === ItemStatus.PROCESSING) {\n item.abortProcessing().then(process);\n }\n\n return;\n }\n\n // already queued for processing\n if (item.status === ItemStatus.PROCESSING_QUEUED) return;\n\n item.requestProcessing();\n\n dispatch('DID_REQUEST_ITEM_PROCESSING', { id: item.id });\n\n dispatch('PROCESS_ITEM', { query: item, success, failure }, true);\n }),\n\n PROCESS_ITEM: getItemByQueryFromState(state, (item, success, failure) => {\n const maxParallelUploads = query('GET_MAX_PARALLEL_UPLOADS');\n const totalCurrentUploads = query('GET_ITEMS_BY_STATUS', ItemStatus.PROCESSING).length;\n\n // queue and wait till queue is freed up\n if (totalCurrentUploads === maxParallelUploads) {\n // queue for later processing\n state.processingQueue.push({\n id: item.id,\n success,\n failure,\n });\n\n // stop it!\n return;\n }\n\n // if was not queued or is already processing exit here\n if (item.status === ItemStatus.PROCESSING) return;\n\n const processNext = () => {\n // process queueud items\n const queueEntry = state.processingQueue.shift();\n\n // no items left\n if (!queueEntry) return;\n\n // get item reference\n const { id, success, failure } = queueEntry;\n const itemReference = getItemByQuery(state.items, id);\n\n // if item was archived while in queue, jump to next\n if (!itemReference || itemReference.archived) {\n processNext();\n return;\n }\n\n // process queued item\n dispatch('PROCESS_ITEM', { query: id, success, failure }, true);\n };\n\n // we done function\n item.onOnce('process-complete', () => {\n success(createItemAPI(item));\n processNext();\n\n // if origin is local, and we're instant uploading, trigger remove of original\n // as revert will remove file from list\n const server = state.options.server;\n const instantUpload = state.options.instantUpload;\n if (instantUpload && item.origin === FileOrigin.LOCAL && isFunction(server.remove)) {\n const noop = () => {};\n item.origin = FileOrigin.LIMBO;\n state.options.server.remove(item.source, noop, noop);\n }\n\n // All items processed? No errors?\n const allItemsProcessed =\n query('GET_ITEMS_BY_STATUS', ItemStatus.PROCESSING_COMPLETE).length ===\n state.items.length;\n if (allItemsProcessed) {\n dispatch('DID_COMPLETE_ITEM_PROCESSING_ALL');\n }\n });\n\n // we error function\n item.onOnce('process-error', error => {\n failure({ error, file: createItemAPI(item) });\n processNext();\n });\n\n // start file processing\n const options = state.options;\n item.process(\n createFileProcessor(\n createProcessorFunction(options.server.url, options.server.process, options.name, {\n chunkTransferId: item.transferId,\n chunkServer: options.server.patch,\n chunkUploads: options.chunkUploads,\n chunkForce: options.chunkForce,\n chunkSize: options.chunkSize,\n chunkRetryDelays: options.chunkRetryDelays,\n }),\n {\n allowMinimumUploadDuration: query('GET_ALLOW_MINIMUM_UPLOAD_DURATION'),\n }\n ),\n // called when the file is about to be processed so it can be piped through the transform filters\n (file, success, error) => {\n // allow plugins to alter the file data\n applyFilterChain('PREPARE_OUTPUT', file, { query, item })\n .then(file => {\n dispatch('DID_PREPARE_OUTPUT', { id: item.id, file });\n\n success(file);\n })\n .catch(error);\n }\n );\n }),\n\n RETRY_ITEM_PROCESSING: getItemByQueryFromState(state, item => {\n dispatch('REQUEST_ITEM_PROCESSING', { query: item });\n }),\n\n REQUEST_REMOVE_ITEM: getItemByQueryFromState(state, item => {\n optionalPromise(query('GET_BEFORE_REMOVE_FILE'), createItemAPI(item)).then(shouldRemove => {\n if (!shouldRemove) {\n return;\n }\n dispatch('REMOVE_ITEM', { query: item });\n });\n }),\n\n RELEASE_ITEM: getItemByQueryFromState(state, item => {\n item.release();\n }),\n\n REMOVE_ITEM: getItemByQueryFromState(state, (item, success, failure, options) => {\n const removeFromView = () => {\n // get id reference\n const id = item.id;\n\n // archive the item, this does not remove it from the list\n getItemById(state.items, id).archive();\n\n // tell the view the item has been removed\n dispatch('DID_REMOVE_ITEM', { error: null, id, item });\n\n // now the list has been modified\n listUpdated(dispatch, state);\n\n // correctly removed\n success(createItemAPI(item));\n };\n\n // if this is a local file and the `server.remove` function has been configured,\n // send source there so dev can remove file from server\n const server = state.options.server;\n if (\n item.origin === FileOrigin.LOCAL &&\n server &&\n isFunction(server.remove) &&\n options.remove !== false\n ) {\n dispatch('DID_START_ITEM_REMOVE', { id: item.id });\n\n server.remove(\n item.source,\n () => removeFromView(),\n status => {\n dispatch('DID_THROW_ITEM_REMOVE_ERROR', {\n id: item.id,\n error: createResponse('error', 0, status, null),\n status: {\n main: dynamicLabel(state.options.labelFileRemoveError)(status),\n sub: state.options.labelTapToRetry,\n },\n });\n }\n );\n } else {\n // if is requesting revert and can revert need to call revert handler (not calling request_ because that would also trigger beforeRemoveHook)\n if (\n (options.revert && item.origin !== FileOrigin.LOCAL && item.serverId !== null) ||\n // if chunked uploads are enabled and we're uploading in chunks for this specific file\n // or if the file isn't big enough for chunked uploads but chunkForce is set then call\n // revert before removing from the view...\n (state.options.chunkUploads && item.file.size > state.options.chunkSize) ||\n (state.options.chunkUploads && state.options.chunkForce)\n ) {\n item.revert(\n createRevertFunction(state.options.server.url, state.options.server.revert),\n query('GET_FORCE_REVERT')\n );\n }\n\n // can now safely remove from view\n removeFromView();\n }\n }),\n\n ABORT_ITEM_LOAD: getItemByQueryFromState(state, item => {\n item.abortLoad();\n }),\n\n ABORT_ITEM_PROCESSING: getItemByQueryFromState(state, item => {\n // test if is already processed\n if (item.serverId) {\n dispatch('REVERT_ITEM_PROCESSING', { id: item.id });\n return;\n }\n\n // abort\n item.abortProcessing().then(() => {\n const shouldRemove = state.options.instantUpload;\n if (shouldRemove) {\n dispatch('REMOVE_ITEM', { query: item.id });\n }\n });\n }),\n\n REQUEST_REVERT_ITEM_PROCESSING: getItemByQueryFromState(state, item => {\n // not instant uploading, revert immediately\n if (!state.options.instantUpload) {\n dispatch('REVERT_ITEM_PROCESSING', { query: item });\n return;\n }\n\n // if we're instant uploading the file will also be removed if we revert,\n // so if a before remove file hook is defined we need to run it now\n const handleRevert = shouldRevert => {\n if (!shouldRevert) return;\n dispatch('REVERT_ITEM_PROCESSING', { query: item });\n };\n\n const fn = query('GET_BEFORE_REMOVE_FILE');\n if (!fn) {\n return handleRevert(true);\n }\n\n const requestRemoveResult = fn(createItemAPI(item));\n if (requestRemoveResult == null) {\n // undefined or null\n return handleRevert(true);\n }\n\n if (typeof requestRemoveResult === 'boolean') {\n return handleRevert(requestRemoveResult);\n }\n\n if (typeof requestRemoveResult.then === 'function') {\n requestRemoveResult.then(handleRevert);\n }\n }),\n\n REVERT_ITEM_PROCESSING: getItemByQueryFromState(state, item => {\n item.revert(\n createRevertFunction(state.options.server.url, state.options.server.revert),\n query('GET_FORCE_REVERT')\n )\n .then(() => {\n const shouldRemove = state.options.instantUpload || isMockItem(item);\n if (shouldRemove) {\n dispatch('REMOVE_ITEM', { query: item.id });\n }\n })\n .catch(() => {});\n }),\n\n SET_OPTIONS: ({ options }) => {\n // get all keys passed\n const optionKeys = Object.keys(options);\n\n // get prioritized keyed to include (remove once not in options object)\n const prioritizedOptionKeys = PrioritizedOptions.filter(key => optionKeys.includes(key));\n\n // order the keys, prioritized first, then rest\n const orderedOptionKeys = [\n // add prioritized first if passed to options, else remove\n ...prioritizedOptionKeys,\n\n // prevent duplicate keys\n ...Object.keys(options).filter(key => !prioritizedOptionKeys.includes(key)),\n ];\n\n // dispatch set event for each option\n orderedOptionKeys.forEach(key => {\n dispatch(`SET_${fromCamels(key, '_').toUpperCase()}`, {\n value: options[key],\n });\n });\n },\n});\n\nconst PrioritizedOptions = [\n 'server', // must be processed before \"files\"\n];\n\nconst formatFilename = name => name;\n\nconst createElement$1 = tagName => {\n return document.createElement(tagName);\n};\n\nconst text = (node, value) => {\n let textNode = node.childNodes[0];\n if (!textNode) {\n textNode = document.createTextNode(value);\n node.appendChild(textNode);\n } else if (value !== textNode.nodeValue) {\n textNode.nodeValue = value;\n }\n};\n\nconst polarToCartesian = (centerX, centerY, radius, angleInDegrees) => {\n const angleInRadians = (((angleInDegrees % 360) - 90) * Math.PI) / 180.0;\n return {\n x: centerX + radius * Math.cos(angleInRadians),\n y: centerY + radius * Math.sin(angleInRadians),\n };\n};\n\nconst describeArc = (x, y, radius, startAngle, endAngle, arcSweep) => {\n const start = polarToCartesian(x, y, radius, endAngle);\n const end = polarToCartesian(x, y, radius, startAngle);\n return ['M', start.x, start.y, 'A', radius, radius, 0, arcSweep, 0, end.x, end.y].join(' ');\n};\n\nconst percentageArc = (x, y, radius, from, to) => {\n let arcSweep = 1;\n if (to > from && to - from <= 0.5) {\n arcSweep = 0;\n }\n if (from > to && from - to >= 0.5) {\n arcSweep = 0;\n }\n return describeArc(\n x,\n y,\n radius,\n Math.min(0.9999, from) * 360,\n Math.min(0.9999, to) * 360,\n arcSweep\n );\n};\n\nconst create = ({ root, props }) => {\n // start at 0\n props.spin = false;\n props.progress = 0;\n props.opacity = 0;\n\n // svg\n const svg = createElement('svg');\n root.ref.path = createElement('path', {\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n });\n svg.appendChild(root.ref.path);\n\n root.ref.svg = svg;\n\n root.appendChild(svg);\n};\n\nconst write = ({ root, props }) => {\n if (props.opacity === 0) {\n return;\n }\n\n if (props.align) {\n root.element.dataset.align = props.align;\n }\n\n // get width of stroke\n const ringStrokeWidth = parseInt(attr(root.ref.path, 'stroke-width'), 10);\n\n // calculate size of ring\n const size = root.rect.element.width * 0.5;\n\n // ring state\n let ringFrom = 0;\n let ringTo = 0;\n\n // now in busy mode\n if (props.spin) {\n ringFrom = 0;\n ringTo = 0.5;\n } else {\n ringFrom = 0;\n ringTo = props.progress;\n }\n\n // get arc path\n const coordinates = percentageArc(size, size, size - ringStrokeWidth, ringFrom, ringTo);\n\n // update progress bar\n attr(root.ref.path, 'd', coordinates);\n\n // hide while contains 0 value\n attr(root.ref.path, 'stroke-opacity', props.spin || props.progress > 0 ? 1 : 0);\n};\n\nconst progressIndicator = createView({\n tag: 'div',\n name: 'progress-indicator',\n ignoreRectUpdate: true,\n ignoreRect: true,\n create,\n write,\n mixins: {\n apis: ['progress', 'spin', 'align'],\n styles: ['opacity'],\n animations: {\n opacity: { type: 'tween', duration: 500 },\n progress: {\n type: 'spring',\n stiffness: 0.95,\n damping: 0.65,\n mass: 10,\n },\n },\n },\n});\n\nconst create$1 = ({ root, props }) => {\n root.element.innerHTML = (props.icon || '') + `${props.label}`;\n\n props.isDisabled = false;\n};\n\nconst write$1 = ({ root, props }) => {\n const { isDisabled } = props;\n const shouldDisable = root.query('GET_DISABLED') || props.opacity === 0;\n\n if (shouldDisable && !isDisabled) {\n props.isDisabled = true;\n attr(root.element, 'disabled', 'disabled');\n } else if (!shouldDisable && isDisabled) {\n props.isDisabled = false;\n root.element.removeAttribute('disabled');\n }\n};\n\nconst fileActionButton = createView({\n tag: 'button',\n attributes: {\n type: 'button',\n },\n ignoreRect: true,\n ignoreRectUpdate: true,\n name: 'file-action-button',\n mixins: {\n apis: ['label'],\n styles: ['translateX', 'translateY', 'scaleX', 'scaleY', 'opacity'],\n animations: {\n scaleX: 'spring',\n scaleY: 'spring',\n translateX: 'spring',\n translateY: 'spring',\n opacity: { type: 'tween', duration: 250 },\n },\n listeners: true,\n },\n create: create$1,\n write: write$1,\n});\n\nconst toNaturalFileSize = (bytes, decimalSeparator = '.', base = 1000, options = {}) => {\n const {\n labelBytes = 'bytes',\n labelKilobytes = 'KB',\n labelMegabytes = 'MB',\n labelGigabytes = 'GB',\n } = options;\n\n // no negative byte sizes\n bytes = Math.round(Math.abs(bytes));\n\n const KB = base;\n const MB = base * base;\n const GB = base * base * base;\n\n // just bytes\n if (bytes < KB) {\n return `${bytes} ${labelBytes}`;\n }\n\n // kilobytes\n if (bytes < MB) {\n return `${Math.floor(bytes / KB)} ${labelKilobytes}`;\n }\n\n // megabytes\n if (bytes < GB) {\n return `${removeDecimalsWhenZero(bytes / MB, 1, decimalSeparator)} ${labelMegabytes}`;\n }\n\n // gigabytes\n return `${removeDecimalsWhenZero(bytes / GB, 2, decimalSeparator)} ${labelGigabytes}`;\n};\n\nconst removeDecimalsWhenZero = (value, decimalCount, separator) => {\n return value\n .toFixed(decimalCount)\n .split('.')\n .filter(part => part !== '0')\n .join(separator);\n};\n\nconst create$2 = ({ root, props }) => {\n // filename\n const fileName = createElement$1('span');\n fileName.className = 'filepond--file-info-main';\n // hide for screenreaders\n // the file is contained in a fieldset with legend that contains the filename\n // no need to read it twice\n attr(fileName, 'aria-hidden', 'true');\n root.appendChild(fileName);\n root.ref.fileName = fileName;\n\n // filesize\n const fileSize = createElement$1('span');\n fileSize.className = 'filepond--file-info-sub';\n root.appendChild(fileSize);\n root.ref.fileSize = fileSize;\n\n // set initial values\n text(fileSize, root.query('GET_LABEL_FILE_WAITING_FOR_SIZE'));\n text(fileName, formatFilename(root.query('GET_ITEM_NAME', props.id)));\n};\n\nconst updateFile = ({ root, props }) => {\n text(\n root.ref.fileSize,\n toNaturalFileSize(\n root.query('GET_ITEM_SIZE', props.id),\n '.',\n root.query('GET_FILE_SIZE_BASE'),\n root.query('GET_FILE_SIZE_LABELS', root.query)\n )\n );\n text(root.ref.fileName, formatFilename(root.query('GET_ITEM_NAME', props.id)));\n};\n\nconst updateFileSizeOnError = ({ root, props }) => {\n // if size is available don't fallback to unknown size message\n if (isInt(root.query('GET_ITEM_SIZE', props.id))) {\n updateFile({ root, props });\n return;\n }\n\n text(root.ref.fileSize, root.query('GET_LABEL_FILE_SIZE_NOT_AVAILABLE'));\n};\n\nconst fileInfo = createView({\n name: 'file-info',\n ignoreRect: true,\n ignoreRectUpdate: true,\n write: createRoute({\n DID_LOAD_ITEM: updateFile,\n DID_UPDATE_ITEM_META: updateFile,\n DID_THROW_ITEM_LOAD_ERROR: updateFileSizeOnError,\n DID_THROW_ITEM_INVALID: updateFileSizeOnError,\n }),\n didCreateView: root => {\n applyFilters('CREATE_VIEW', { ...root, view: root });\n },\n create: create$2,\n mixins: {\n styles: ['translateX', 'translateY'],\n animations: {\n translateX: 'spring',\n translateY: 'spring',\n },\n },\n});\n\nconst toPercentage = value => Math.round(value * 100);\n\nconst create$3 = ({ root }) => {\n // main status\n const main = createElement$1('span');\n main.className = 'filepond--file-status-main';\n root.appendChild(main);\n root.ref.main = main;\n\n // sub status\n const sub = createElement$1('span');\n sub.className = 'filepond--file-status-sub';\n root.appendChild(sub);\n root.ref.sub = sub;\n\n didSetItemLoadProgress({ root, action: { progress: null } });\n};\n\nconst didSetItemLoadProgress = ({ root, action }) => {\n const title =\n action.progress === null\n ? root.query('GET_LABEL_FILE_LOADING')\n : `${root.query('GET_LABEL_FILE_LOADING')} ${toPercentage(action.progress)}%`;\n text(root.ref.main, title);\n text(root.ref.sub, root.query('GET_LABEL_TAP_TO_CANCEL'));\n};\n\nconst didSetItemProcessProgress = ({ root, action }) => {\n const title =\n action.progress === null\n ? root.query('GET_LABEL_FILE_PROCESSING')\n : `${root.query('GET_LABEL_FILE_PROCESSING')} ${toPercentage(action.progress)}%`;\n text(root.ref.main, title);\n text(root.ref.sub, root.query('GET_LABEL_TAP_TO_CANCEL'));\n};\n\nconst didRequestItemProcessing = ({ root }) => {\n text(root.ref.main, root.query('GET_LABEL_FILE_PROCESSING'));\n text(root.ref.sub, root.query('GET_LABEL_TAP_TO_CANCEL'));\n};\n\nconst didAbortItemProcessing = ({ root }) => {\n text(root.ref.main, root.query('GET_LABEL_FILE_PROCESSING_ABORTED'));\n text(root.ref.sub, root.query('GET_LABEL_TAP_TO_RETRY'));\n};\n\nconst didCompleteItemProcessing = ({ root }) => {\n text(root.ref.main, root.query('GET_LABEL_FILE_PROCESSING_COMPLETE'));\n text(root.ref.sub, root.query('GET_LABEL_TAP_TO_UNDO'));\n};\n\nconst clear = ({ root }) => {\n text(root.ref.main, '');\n text(root.ref.sub, '');\n};\n\nconst error = ({ root, action }) => {\n text(root.ref.main, action.status.main);\n text(root.ref.sub, action.status.sub);\n};\n\nconst fileStatus = createView({\n name: 'file-status',\n ignoreRect: true,\n ignoreRectUpdate: true,\n write: createRoute({\n DID_LOAD_ITEM: clear,\n DID_REVERT_ITEM_PROCESSING: clear,\n DID_REQUEST_ITEM_PROCESSING: didRequestItemProcessing,\n DID_ABORT_ITEM_PROCESSING: didAbortItemProcessing,\n DID_COMPLETE_ITEM_PROCESSING: didCompleteItemProcessing,\n DID_UPDATE_ITEM_PROCESS_PROGRESS: didSetItemProcessProgress,\n DID_UPDATE_ITEM_LOAD_PROGRESS: didSetItemLoadProgress,\n DID_THROW_ITEM_LOAD_ERROR: error,\n DID_THROW_ITEM_INVALID: error,\n DID_THROW_ITEM_PROCESSING_ERROR: error,\n DID_THROW_ITEM_PROCESSING_REVERT_ERROR: error,\n DID_THROW_ITEM_REMOVE_ERROR: error,\n }),\n didCreateView: root => {\n applyFilters('CREATE_VIEW', { ...root, view: root });\n },\n create: create$3,\n mixins: {\n styles: ['translateX', 'translateY', 'opacity'],\n animations: {\n opacity: { type: 'tween', duration: 250 },\n translateX: 'spring',\n translateY: 'spring',\n },\n },\n});\n\n/**\n * Button definitions for the file view\n */\n\nconst Buttons = {\n AbortItemLoad: {\n label: 'GET_LABEL_BUTTON_ABORT_ITEM_LOAD',\n action: 'ABORT_ITEM_LOAD',\n className: 'filepond--action-abort-item-load',\n align: 'LOAD_INDICATOR_POSITION', // right\n },\n RetryItemLoad: {\n label: 'GET_LABEL_BUTTON_RETRY_ITEM_LOAD',\n action: 'RETRY_ITEM_LOAD',\n icon: 'GET_ICON_RETRY',\n className: 'filepond--action-retry-item-load',\n align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n },\n RemoveItem: {\n label: 'GET_LABEL_BUTTON_REMOVE_ITEM',\n action: 'REQUEST_REMOVE_ITEM',\n icon: 'GET_ICON_REMOVE',\n className: 'filepond--action-remove-item',\n align: 'BUTTON_REMOVE_ITEM_POSITION', // left\n },\n ProcessItem: {\n label: 'GET_LABEL_BUTTON_PROCESS_ITEM',\n action: 'REQUEST_ITEM_PROCESSING',\n icon: 'GET_ICON_PROCESS',\n className: 'filepond--action-process-item',\n align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n },\n AbortItemProcessing: {\n label: 'GET_LABEL_BUTTON_ABORT_ITEM_PROCESSING',\n action: 'ABORT_ITEM_PROCESSING',\n className: 'filepond--action-abort-item-processing',\n align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n },\n RetryItemProcessing: {\n label: 'GET_LABEL_BUTTON_RETRY_ITEM_PROCESSING',\n action: 'RETRY_ITEM_PROCESSING',\n icon: 'GET_ICON_RETRY',\n className: 'filepond--action-retry-item-processing',\n align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n },\n RevertItemProcessing: {\n label: 'GET_LABEL_BUTTON_UNDO_ITEM_PROCESSING',\n action: 'REQUEST_REVERT_ITEM_PROCESSING',\n icon: 'GET_ICON_UNDO',\n className: 'filepond--action-revert-item-processing',\n align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n },\n};\n\n// make a list of buttons, we can then remove buttons from this list if they're disabled\nconst ButtonKeys = [];\nforin(Buttons, key => {\n ButtonKeys.push(key);\n});\n\nconst calculateFileInfoOffset = root => {\n if (getRemoveIndicatorAligment(root) === 'right') return 0;\n const buttonRect = root.ref.buttonRemoveItem.rect.element;\n return buttonRect.hidden ? null : buttonRect.width + buttonRect.left;\n};\n\nconst calculateButtonWidth = root => {\n const buttonRect = root.ref.buttonAbortItemLoad.rect.element;\n return buttonRect.width;\n};\n\n// Force on full pixels so text stays crips\nconst calculateFileVerticalCenterOffset = root =>\n Math.floor(root.ref.buttonRemoveItem.rect.element.height / 4);\nconst calculateFileHorizontalCenterOffset = root =>\n Math.floor(root.ref.buttonRemoveItem.rect.element.left / 2);\n\nconst getLoadIndicatorAlignment = root => root.query('GET_STYLE_LOAD_INDICATOR_POSITION');\nconst getProcessIndicatorAlignment = root => root.query('GET_STYLE_PROGRESS_INDICATOR_POSITION');\nconst getRemoveIndicatorAligment = root => root.query('GET_STYLE_BUTTON_REMOVE_ITEM_POSITION');\n\nconst DefaultStyle = {\n buttonAbortItemLoad: { opacity: 0 },\n buttonRetryItemLoad: { opacity: 0 },\n buttonRemoveItem: { opacity: 0 },\n buttonProcessItem: { opacity: 0 },\n buttonAbortItemProcessing: { opacity: 0 },\n buttonRetryItemProcessing: { opacity: 0 },\n buttonRevertItemProcessing: { opacity: 0 },\n loadProgressIndicator: { opacity: 0, align: getLoadIndicatorAlignment },\n processProgressIndicator: { opacity: 0, align: getProcessIndicatorAlignment },\n processingCompleteIndicator: { opacity: 0, scaleX: 0.75, scaleY: 0.75 },\n info: { translateX: 0, translateY: 0, opacity: 0 },\n status: { translateX: 0, translateY: 0, opacity: 0 },\n};\n\nconst IdleStyle = {\n buttonRemoveItem: { opacity: 1 },\n buttonProcessItem: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n status: { translateX: calculateFileInfoOffset },\n};\n\nconst ProcessingStyle = {\n buttonAbortItemProcessing: { opacity: 1 },\n processProgressIndicator: { opacity: 1 },\n status: { opacity: 1 },\n};\n\nconst StyleMap = {\n DID_THROW_ITEM_INVALID: {\n buttonRemoveItem: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n status: { translateX: calculateFileInfoOffset, opacity: 1 },\n },\n DID_START_ITEM_LOAD: {\n buttonAbortItemLoad: { opacity: 1 },\n loadProgressIndicator: { opacity: 1 },\n status: { opacity: 1 },\n },\n DID_THROW_ITEM_LOAD_ERROR: {\n buttonRetryItemLoad: { opacity: 1 },\n buttonRemoveItem: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n status: { opacity: 1 },\n },\n DID_START_ITEM_REMOVE: {\n processProgressIndicator: { opacity: 1, align: getRemoveIndicatorAligment },\n info: { translateX: calculateFileInfoOffset },\n status: { opacity: 0 },\n },\n DID_THROW_ITEM_REMOVE_ERROR: {\n processProgressIndicator: { opacity: 0, align: getRemoveIndicatorAligment },\n buttonRemoveItem: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n status: { opacity: 1, translateX: calculateFileInfoOffset },\n },\n DID_LOAD_ITEM: IdleStyle,\n DID_LOAD_LOCAL_ITEM: {\n buttonRemoveItem: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n status: { translateX: calculateFileInfoOffset },\n },\n DID_START_ITEM_PROCESSING: ProcessingStyle,\n DID_REQUEST_ITEM_PROCESSING: ProcessingStyle,\n DID_UPDATE_ITEM_PROCESS_PROGRESS: ProcessingStyle,\n DID_COMPLETE_ITEM_PROCESSING: {\n buttonRevertItemProcessing: { opacity: 1 },\n info: { opacity: 1 },\n status: { opacity: 1 },\n },\n DID_THROW_ITEM_PROCESSING_ERROR: {\n buttonRemoveItem: { opacity: 1 },\n buttonRetryItemProcessing: { opacity: 1 },\n status: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n },\n DID_THROW_ITEM_PROCESSING_REVERT_ERROR: {\n buttonRevertItemProcessing: { opacity: 1 },\n status: { opacity: 1 },\n info: { opacity: 1 },\n },\n DID_ABORT_ITEM_PROCESSING: {\n buttonRemoveItem: { opacity: 1 },\n buttonProcessItem: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n status: { opacity: 1 },\n },\n DID_REVERT_ITEM_PROCESSING: IdleStyle,\n};\n\n// complete indicator view\nconst processingCompleteIndicatorView = createView({\n create: ({ root }) => {\n root.element.innerHTML = root.query('GET_ICON_DONE');\n },\n name: 'processing-complete-indicator',\n ignoreRect: true,\n mixins: {\n styles: ['scaleX', 'scaleY', 'opacity'],\n animations: {\n scaleX: 'spring',\n scaleY: 'spring',\n opacity: { type: 'tween', duration: 250 },\n },\n },\n});\n\n/**\n * Creates the file view\n */\nconst create$4 = ({ root, props }) => {\n // copy Buttons object\n const LocalButtons = Object.keys(Buttons).reduce((prev, curr) => {\n prev[curr] = { ...Buttons[curr] };\n return prev;\n }, {});\n\n const { id } = props;\n\n // allow reverting upload\n const allowRevert = root.query('GET_ALLOW_REVERT');\n\n // allow remove file\n const allowRemove = root.query('GET_ALLOW_REMOVE');\n\n // allow processing upload\n const allowProcess = root.query('GET_ALLOW_PROCESS');\n\n // is instant uploading, need this to determine the icon of the undo button\n const instantUpload = root.query('GET_INSTANT_UPLOAD');\n\n // is async set up\n const isAsync = root.query('IS_ASYNC');\n\n // should align remove item buttons\n const alignRemoveItemButton = root.query('GET_STYLE_BUTTON_REMOVE_ITEM_ALIGN');\n\n // enabled buttons array\n let buttonFilter;\n if (isAsync) {\n if (allowProcess && !allowRevert) {\n // only remove revert button\n buttonFilter = key => !/RevertItemProcessing/.test(key);\n } else if (!allowProcess && allowRevert) {\n // only remove process button\n buttonFilter = key => !/ProcessItem|RetryItemProcessing|AbortItemProcessing/.test(key);\n } else if (!allowProcess && !allowRevert) {\n // remove all process buttons\n buttonFilter = key => !/Process/.test(key);\n }\n } else {\n // no process controls available\n buttonFilter = key => !/Process/.test(key);\n }\n\n const enabledButtons = buttonFilter ? ButtonKeys.filter(buttonFilter) : ButtonKeys.concat();\n\n // update icon and label for revert button when instant uploading\n if (instantUpload && allowRevert) {\n LocalButtons['RevertItemProcessing'].label = 'GET_LABEL_BUTTON_REMOVE_ITEM';\n LocalButtons['RevertItemProcessing'].icon = 'GET_ICON_REMOVE';\n }\n\n // remove last button (revert) if not allowed\n if (isAsync && !allowRevert) {\n const map = StyleMap['DID_COMPLETE_ITEM_PROCESSING'];\n map.info.translateX = calculateFileHorizontalCenterOffset;\n map.info.translateY = calculateFileVerticalCenterOffset;\n map.status.translateY = calculateFileVerticalCenterOffset;\n map.processingCompleteIndicator = { opacity: 1, scaleX: 1, scaleY: 1 };\n }\n\n // should align center\n if (isAsync && !allowProcess) {\n [\n 'DID_START_ITEM_PROCESSING',\n 'DID_REQUEST_ITEM_PROCESSING',\n 'DID_UPDATE_ITEM_PROCESS_PROGRESS',\n 'DID_THROW_ITEM_PROCESSING_ERROR',\n ].forEach(key => {\n StyleMap[key].status.translateY = calculateFileVerticalCenterOffset;\n });\n StyleMap['DID_THROW_ITEM_PROCESSING_ERROR'].status.translateX = calculateButtonWidth;\n }\n\n // move remove button to right\n if (alignRemoveItemButton && allowRevert) {\n LocalButtons['RevertItemProcessing'].align = 'BUTTON_REMOVE_ITEM_POSITION';\n const map = StyleMap['DID_COMPLETE_ITEM_PROCESSING'];\n map.info.translateX = calculateFileInfoOffset;\n map.status.translateY = calculateFileVerticalCenterOffset;\n map.processingCompleteIndicator = { opacity: 1, scaleX: 1, scaleY: 1 };\n }\n\n // show/hide RemoveItem button\n if (!allowRemove) {\n LocalButtons['RemoveItem'].disabled = true;\n }\n\n // create the button views\n forin(LocalButtons, (key, definition) => {\n // create button\n const buttonView = root.createChildView(fileActionButton, {\n label: root.query(definition.label),\n icon: root.query(definition.icon),\n opacity: 0,\n });\n\n // should be appended?\n if (enabledButtons.includes(key)) {\n root.appendChildView(buttonView);\n }\n\n // toggle\n if (definition.disabled) {\n buttonView.element.setAttribute('disabled', 'disabled');\n buttonView.element.setAttribute('hidden', 'hidden');\n }\n\n // add position attribute\n buttonView.element.dataset.align = root.query(`GET_STYLE_${definition.align}`);\n\n // add class\n buttonView.element.classList.add(definition.className);\n\n // handle interactions\n buttonView.on('click', e => {\n e.stopPropagation();\n if (definition.disabled) return;\n root.dispatch(definition.action, { query: id });\n });\n\n // set reference\n root.ref[`button${key}`] = buttonView;\n });\n\n // checkmark\n root.ref.processingCompleteIndicator = root.appendChildView(\n root.createChildView(processingCompleteIndicatorView)\n );\n root.ref.processingCompleteIndicator.element.dataset.align = root.query(\n `GET_STYLE_BUTTON_PROCESS_ITEM_POSITION`\n );\n\n // create file info view\n root.ref.info = root.appendChildView(root.createChildView(fileInfo, { id }));\n\n // create file status view\n root.ref.status = root.appendChildView(root.createChildView(fileStatus, { id }));\n\n // add progress indicators\n const loadIndicatorView = root.appendChildView(\n root.createChildView(progressIndicator, {\n opacity: 0,\n align: root.query(`GET_STYLE_LOAD_INDICATOR_POSITION`),\n })\n );\n loadIndicatorView.element.classList.add('filepond--load-indicator');\n root.ref.loadProgressIndicator = loadIndicatorView;\n\n const progressIndicatorView = root.appendChildView(\n root.createChildView(progressIndicator, {\n opacity: 0,\n align: root.query(`GET_STYLE_PROGRESS_INDICATOR_POSITION`),\n })\n );\n progressIndicatorView.element.classList.add('filepond--process-indicator');\n root.ref.processProgressIndicator = progressIndicatorView;\n\n // current active styles\n root.ref.activeStyles = [];\n};\n\nconst write$2 = ({ root, actions, props }) => {\n // route actions\n route({ root, actions, props });\n\n // select last state change action\n let action = actions\n .concat()\n .filter(action => /^DID_/.test(action.type))\n .reverse()\n .find(action => StyleMap[action.type]);\n\n // a new action happened, let's get the matching styles\n if (action) {\n // define new active styles\n root.ref.activeStyles = [];\n\n const stylesToApply = StyleMap[action.type];\n forin(DefaultStyle, (name, defaultStyles) => {\n // get reference to control\n const control = root.ref[name];\n\n // loop over all styles for this control\n forin(defaultStyles, (key, defaultValue) => {\n const value =\n stylesToApply[name] && typeof stylesToApply[name][key] !== 'undefined'\n ? stylesToApply[name][key]\n : defaultValue;\n root.ref.activeStyles.push({ control, key, value });\n });\n });\n }\n\n // apply active styles to element\n root.ref.activeStyles.forEach(({ control, key, value }) => {\n control[key] = typeof value === 'function' ? value(root) : value;\n });\n};\n\nconst route = createRoute({\n DID_SET_LABEL_BUTTON_ABORT_ITEM_PROCESSING: ({ root, action }) => {\n root.ref.buttonAbortItemProcessing.label = action.value;\n },\n DID_SET_LABEL_BUTTON_ABORT_ITEM_LOAD: ({ root, action }) => {\n root.ref.buttonAbortItemLoad.label = action.value;\n },\n DID_SET_LABEL_BUTTON_ABORT_ITEM_REMOVAL: ({ root, action }) => {\n root.ref.buttonAbortItemRemoval.label = action.value;\n },\n DID_REQUEST_ITEM_PROCESSING: ({ root }) => {\n root.ref.processProgressIndicator.spin = true;\n root.ref.processProgressIndicator.progress = 0;\n },\n DID_START_ITEM_LOAD: ({ root }) => {\n root.ref.loadProgressIndicator.spin = true;\n root.ref.loadProgressIndicator.progress = 0;\n },\n DID_START_ITEM_REMOVE: ({ root }) => {\n root.ref.processProgressIndicator.spin = true;\n root.ref.processProgressIndicator.progress = 0;\n },\n DID_UPDATE_ITEM_LOAD_PROGRESS: ({ root, action }) => {\n root.ref.loadProgressIndicator.spin = false;\n root.ref.loadProgressIndicator.progress = action.progress;\n },\n DID_UPDATE_ITEM_PROCESS_PROGRESS: ({ root, action }) => {\n root.ref.processProgressIndicator.spin = false;\n root.ref.processProgressIndicator.progress = action.progress;\n },\n});\n\nconst file = createView({\n create: create$4,\n write: write$2,\n didCreateView: root => {\n applyFilters('CREATE_VIEW', { ...root, view: root });\n },\n name: 'file',\n});\n\n/**\n * Creates the file view\n */\nconst create$5 = ({ root, props }) => {\n // filename\n root.ref.fileName = createElement$1('legend');\n root.appendChild(root.ref.fileName);\n\n // file appended\n root.ref.file = root.appendChildView(root.createChildView(file, { id: props.id }));\n\n // data has moved to data.js\n root.ref.data = false;\n};\n\n/**\n * Data storage\n */\nconst didLoadItem = ({ root, props }) => {\n // updates the legend of the fieldset so screenreaders can better group buttons\n text(root.ref.fileName, formatFilename(root.query('GET_ITEM_NAME', props.id)));\n};\n\nconst fileWrapper = createView({\n create: create$5,\n ignoreRect: true,\n write: createRoute({\n DID_LOAD_ITEM: didLoadItem,\n }),\n didCreateView: root => {\n applyFilters('CREATE_VIEW', { ...root, view: root });\n },\n tag: 'fieldset',\n name: 'file-wrapper',\n});\n\nconst PANEL_SPRING_PROPS = { type: 'spring', damping: 0.6, mass: 7 };\n\nconst create$6 = ({ root, props }) => {\n [\n {\n name: 'top',\n },\n {\n name: 'center',\n props: {\n translateY: null,\n scaleY: null,\n },\n mixins: {\n animations: {\n scaleY: PANEL_SPRING_PROPS,\n },\n styles: ['translateY', 'scaleY'],\n },\n },\n {\n name: 'bottom',\n props: {\n translateY: null,\n },\n mixins: {\n animations: {\n translateY: PANEL_SPRING_PROPS,\n },\n styles: ['translateY'],\n },\n },\n ].forEach(section => {\n createSection(root, section, props.name);\n });\n\n root.element.classList.add(`filepond--${props.name}`);\n\n root.ref.scalable = null;\n};\n\nconst createSection = (root, section, className) => {\n const viewConstructor = createView({\n name: `panel-${section.name} filepond--${className}`,\n mixins: section.mixins,\n ignoreRectUpdate: true,\n });\n\n const view = root.createChildView(viewConstructor, section.props);\n\n root.ref[section.name] = root.appendChildView(view);\n};\n\nconst write$3 = ({ root, props }) => {\n // update scalable state\n if (root.ref.scalable === null || props.scalable !== root.ref.scalable) {\n root.ref.scalable = isBoolean(props.scalable) ? props.scalable : true;\n root.element.dataset.scalable = root.ref.scalable;\n }\n\n // no height, can't set\n if (!props.height) return;\n\n // get child rects\n const topRect = root.ref.top.rect.element;\n const bottomRect = root.ref.bottom.rect.element;\n\n // make sure height never is smaller than bottom and top seciton heights combined (will probably never happen, but who knows)\n const height = Math.max(topRect.height + bottomRect.height, props.height);\n\n // offset center part\n root.ref.center.translateY = topRect.height;\n\n // scale center part\n // use math ceil to prevent transparent lines because of rounding errors\n root.ref.center.scaleY = (height - topRect.height - bottomRect.height) / 100;\n\n // offset bottom part\n root.ref.bottom.translateY = height - bottomRect.height;\n};\n\nconst panel = createView({\n name: 'panel',\n read: ({ root, props }) => (props.heightCurrent = root.ref.bottom.translateY),\n write: write$3,\n create: create$6,\n ignoreRect: true,\n mixins: {\n apis: ['height', 'heightCurrent', 'scalable'],\n },\n});\n\nconst createDragHelper = items => {\n const itemIds = items.map(item => item.id);\n let prevIndex = undefined;\n return {\n setIndex: index => {\n prevIndex = index;\n },\n getIndex: () => prevIndex,\n getItemIndex: item => itemIds.indexOf(item.id),\n };\n};\n\nconst ITEM_TRANSLATE_SPRING = {\n type: 'spring',\n stiffness: 0.75,\n damping: 0.45,\n mass: 10,\n};\n\nconst ITEM_SCALE_SPRING = 'spring';\n\nconst StateMap = {\n DID_START_ITEM_LOAD: 'busy',\n DID_UPDATE_ITEM_LOAD_PROGRESS: 'loading',\n DID_THROW_ITEM_INVALID: 'load-invalid',\n DID_THROW_ITEM_LOAD_ERROR: 'load-error',\n DID_LOAD_ITEM: 'idle',\n DID_THROW_ITEM_REMOVE_ERROR: 'remove-error',\n DID_START_ITEM_REMOVE: 'busy',\n DID_START_ITEM_PROCESSING: 'busy processing',\n DID_REQUEST_ITEM_PROCESSING: 'busy processing',\n DID_UPDATE_ITEM_PROCESS_PROGRESS: 'processing',\n DID_COMPLETE_ITEM_PROCESSING: 'processing-complete',\n DID_THROW_ITEM_PROCESSING_ERROR: 'processing-error',\n DID_THROW_ITEM_PROCESSING_REVERT_ERROR: 'processing-revert-error',\n DID_ABORT_ITEM_PROCESSING: 'cancelled',\n DID_REVERT_ITEM_PROCESSING: 'idle',\n};\n\n/**\n * Creates the file view\n */\nconst create$7 = ({ root, props }) => {\n // select\n root.ref.handleClick = e => root.dispatch('DID_ACTIVATE_ITEM', { id: props.id });\n\n // set id\n root.element.id = `filepond--item-${props.id}`;\n root.element.addEventListener('click', root.ref.handleClick);\n\n // file view\n root.ref.container = root.appendChildView(root.createChildView(fileWrapper, { id: props.id }));\n\n // file panel\n root.ref.panel = root.appendChildView(root.createChildView(panel, { name: 'item-panel' }));\n\n // default start height\n root.ref.panel.height = null;\n\n // by default not marked for removal\n props.markedForRemoval = false;\n\n // if not allowed to reorder file items, exit here\n if (!root.query('GET_ALLOW_REORDER')) return;\n\n // set to idle so shows grab cursor\n root.element.dataset.dragState = 'idle';\n\n const grab = e => {\n if (!e.isPrimary) return;\n\n let removedActivateListener = false;\n\n const origin = {\n x: e.pageX,\n y: e.pageY,\n };\n\n props.dragOrigin = {\n x: root.translateX,\n y: root.translateY,\n };\n\n props.dragCenter = {\n x: e.offsetX,\n y: e.offsetY,\n };\n\n const dragState = createDragHelper(root.query('GET_ACTIVE_ITEMS'));\n\n root.dispatch('DID_GRAB_ITEM', { id: props.id, dragState });\n\n const drag = e => {\n if (!e.isPrimary) return;\n\n e.stopPropagation();\n e.preventDefault();\n\n props.dragOffset = {\n x: e.pageX - origin.x,\n y: e.pageY - origin.y,\n };\n\n // if dragged stop listening to clicks, will re-add when done dragging\n const dist =\n props.dragOffset.x * props.dragOffset.x + props.dragOffset.y * props.dragOffset.y;\n if (dist > 16 && !removedActivateListener) {\n removedActivateListener = true;\n root.element.removeEventListener('click', root.ref.handleClick);\n }\n\n root.dispatch('DID_DRAG_ITEM', { id: props.id, dragState });\n };\n\n const drop = e => {\n if (!e.isPrimary) return;\n\n props.dragOffset = {\n x: e.pageX - origin.x,\n y: e.pageY - origin.y,\n };\n\n reset();\n };\n\n const cancel = () => {\n reset();\n };\n\n const reset = () => {\n document.removeEventListener('pointercancel', cancel);\n document.removeEventListener('pointermove', drag);\n document.removeEventListener('pointerup', drop);\n\n root.dispatch('DID_DROP_ITEM', { id: props.id, dragState });\n\n // start listening to clicks again\n if (removedActivateListener) {\n setTimeout(() => root.element.addEventListener('click', root.ref.handleClick), 0);\n }\n };\n\n document.addEventListener('pointercancel', cancel);\n document.addEventListener('pointermove', drag);\n document.addEventListener('pointerup', drop);\n };\n\n root.element.addEventListener('pointerdown', grab);\n};\n\nconst route$1 = createRoute({\n DID_UPDATE_PANEL_HEIGHT: ({ root, action }) => {\n root.height = action.height;\n },\n});\n\nconst write$4 = createRoute(\n {\n DID_GRAB_ITEM: ({ root, props }) => {\n props.dragOrigin = {\n x: root.translateX,\n y: root.translateY,\n };\n },\n DID_DRAG_ITEM: ({ root }) => {\n root.element.dataset.dragState = 'drag';\n },\n DID_DROP_ITEM: ({ root, props }) => {\n props.dragOffset = null;\n props.dragOrigin = null;\n root.element.dataset.dragState = 'drop';\n },\n },\n ({ root, actions, props, shouldOptimize }) => {\n if (root.element.dataset.dragState === 'drop') {\n if (root.scaleX <= 1) {\n root.element.dataset.dragState = 'idle';\n }\n }\n\n // select last state change action\n let action = actions\n .concat()\n .filter(action => /^DID_/.test(action.type))\n .reverse()\n .find(action => StateMap[action.type]);\n\n // no need to set same state twice\n if (action && action.type !== props.currentState) {\n // set current state\n props.currentState = action.type;\n\n // set state\n root.element.dataset.filepondItemState = StateMap[props.currentState] || '';\n }\n\n // route actions\n const aspectRatio =\n root.query('GET_ITEM_PANEL_ASPECT_RATIO') || root.query('GET_PANEL_ASPECT_RATIO');\n if (!aspectRatio) {\n route$1({ root, actions, props });\n if (!root.height && root.ref.container.rect.element.height > 0) {\n root.height = root.ref.container.rect.element.height;\n }\n } else if (!shouldOptimize) {\n root.height = root.rect.element.width * aspectRatio;\n }\n\n // sync panel height with item height\n if (shouldOptimize) {\n root.ref.panel.height = null;\n }\n\n root.ref.panel.height = root.height;\n }\n);\n\nconst item = createView({\n create: create$7,\n write: write$4,\n destroy: ({ root, props }) => {\n root.element.removeEventListener('click', root.ref.handleClick);\n root.dispatch('RELEASE_ITEM', { query: props.id });\n },\n tag: 'li',\n name: 'item',\n mixins: {\n apis: [\n 'id',\n 'interactionMethod',\n 'markedForRemoval',\n 'spawnDate',\n 'dragCenter',\n 'dragOrigin',\n 'dragOffset',\n ],\n styles: ['translateX', 'translateY', 'scaleX', 'scaleY', 'opacity', 'height'],\n animations: {\n scaleX: ITEM_SCALE_SPRING,\n scaleY: ITEM_SCALE_SPRING,\n translateX: ITEM_TRANSLATE_SPRING,\n translateY: ITEM_TRANSLATE_SPRING,\n opacity: { type: 'tween', duration: 150 },\n },\n },\n});\n\nvar getItemsPerRow = (horizontalSpace, itemWidth) => {\n // add one pixel leeway, when using percentages for item width total items can be 1.99 per row\n\n return Math.max(1, Math.floor((horizontalSpace + 1) / itemWidth));\n};\n\nconst getItemIndexByPosition = (view, children, positionInView) => {\n if (!positionInView) return;\n\n const horizontalSpace = view.rect.element.width;\n // const children = view.childViews;\n const l = children.length;\n let last = null;\n\n // -1, don't move items to accomodate (either add to top or bottom)\n if (l === 0 || positionInView.top < children[0].rect.element.top) return -1;\n\n // let's get the item width\n const item = children[0];\n const itemRect = item.rect.element;\n const itemHorizontalMargin = itemRect.marginLeft + itemRect.marginRight;\n const itemWidth = itemRect.width + itemHorizontalMargin;\n const itemsPerRow = getItemsPerRow(horizontalSpace, itemWidth);\n\n // stack\n if (itemsPerRow === 1) {\n for (let index = 0; index < l; index++) {\n const child = children[index];\n const childMid = child.rect.outer.top + child.rect.element.height * 0.5;\n if (positionInView.top < childMid) {\n return index;\n }\n }\n return l;\n }\n\n // grid\n const itemVerticalMargin = itemRect.marginTop + itemRect.marginBottom;\n const itemHeight = itemRect.height + itemVerticalMargin;\n for (let index = 0; index < l; index++) {\n const indexX = index % itemsPerRow;\n const indexY = Math.floor(index / itemsPerRow);\n\n const offsetX = indexX * itemWidth;\n const offsetY = indexY * itemHeight;\n\n const itemTop = offsetY - itemRect.marginTop;\n const itemRight = offsetX + itemWidth;\n const itemBottom = offsetY + itemHeight + itemRect.marginBottom;\n\n if (positionInView.top < itemBottom && positionInView.top > itemTop) {\n if (positionInView.left < itemRight) {\n return index;\n } else if (index !== l - 1) {\n last = index;\n } else {\n last = null;\n }\n }\n }\n\n if (last !== null) {\n return last;\n }\n\n return l;\n};\n\nconst dropAreaDimensions = {\n height: 0,\n width: 0,\n get getHeight() {\n return this.height;\n },\n set setHeight(val) {\n if (this.height === 0 || val === 0) this.height = val;\n },\n get getWidth() {\n return this.width;\n },\n set setWidth(val) {\n if (this.width === 0 || val === 0) this.width = val;\n },\n setDimensions: function(height, width) {\n if (this.height === 0 || height === 0) this.height = height;\n if (this.width === 0 || width === 0) this.width = width;\n },\n};\n\nconst create$8 = ({ root }) => {\n // need to set role to list as otherwise it won't be read as a list by VoiceOver\n attr(root.element, 'role', 'list');\n\n root.ref.lastItemSpanwDate = Date.now();\n};\n\n/**\n * Inserts a new item\n * @param root\n * @param action\n */\nconst addItemView = ({ root, action }) => {\n const { id, index, interactionMethod } = action;\n\n root.ref.addIndex = index;\n\n const now = Date.now();\n let spawnDate = now;\n let opacity = 1;\n\n if (interactionMethod !== InteractionMethod.NONE) {\n opacity = 0;\n const cooldown = root.query('GET_ITEM_INSERT_INTERVAL');\n const dist = now - root.ref.lastItemSpanwDate;\n spawnDate = dist < cooldown ? now + (cooldown - dist) : now;\n }\n\n root.ref.lastItemSpanwDate = spawnDate;\n\n root.appendChildView(\n root.createChildView(\n // view type\n item,\n\n // props\n {\n spawnDate,\n id,\n opacity,\n interactionMethod,\n }\n ),\n index\n );\n};\n\nconst moveItem = (item, x, y, vx = 0, vy = 1) => {\n // set to null to remove animation while dragging\n if (item.dragOffset) {\n item.translateX = null;\n item.translateY = null;\n item.translateX = item.dragOrigin.x + item.dragOffset.x;\n item.translateY = item.dragOrigin.y + item.dragOffset.y;\n item.scaleX = 1.025;\n item.scaleY = 1.025;\n } else {\n item.translateX = x;\n item.translateY = y;\n\n if (Date.now() > item.spawnDate) {\n // reveal element\n if (item.opacity === 0) {\n introItemView(item, x, y, vx, vy);\n }\n\n // make sure is default scale every frame\n item.scaleX = 1;\n item.scaleY = 1;\n item.opacity = 1;\n }\n }\n};\n\nconst introItemView = (item, x, y, vx, vy) => {\n if (item.interactionMethod === InteractionMethod.NONE) {\n item.translateX = null;\n item.translateX = x;\n item.translateY = null;\n item.translateY = y;\n } else if (item.interactionMethod === InteractionMethod.DROP) {\n item.translateX = null;\n item.translateX = x - vx * 20;\n\n item.translateY = null;\n item.translateY = y - vy * 10;\n\n item.scaleX = 0.8;\n item.scaleY = 0.8;\n } else if (item.interactionMethod === InteractionMethod.BROWSE) {\n item.translateY = null;\n item.translateY = y - 30;\n } else if (item.interactionMethod === InteractionMethod.API) {\n item.translateX = null;\n item.translateX = x - 30;\n item.translateY = null;\n }\n};\n\n/**\n * Removes an existing item\n * @param root\n * @param action\n */\nconst removeItemView = ({ root, action }) => {\n const { id } = action;\n\n // get the view matching the given id\n const view = root.childViews.find(child => child.id === id);\n\n // if no view found, exit\n if (!view) {\n return;\n }\n\n // animate view out of view\n view.scaleX = 0.9;\n view.scaleY = 0.9;\n view.opacity = 0;\n\n // mark for removal\n view.markedForRemoval = true;\n};\n\nconst getItemHeight = child =>\n child.rect.element.height +\n child.rect.element.marginBottom * 0.5 +\n child.rect.element.marginTop * 0.5;\nconst getItemWidth = child =>\n child.rect.element.width +\n child.rect.element.marginLeft * 0.5 +\n child.rect.element.marginRight * 0.5;\n\nconst dragItem = ({ root, action }) => {\n const { id, dragState } = action;\n\n // reference to item\n const item = root.query('GET_ITEM', { id });\n\n // get the view matching the given id\n const view = root.childViews.find(child => child.id === id);\n\n const numItems = root.childViews.length;\n const oldIndex = dragState.getItemIndex(item);\n\n // if no view found, exit\n if (!view) return;\n\n const dragPosition = {\n x: view.dragOrigin.x + view.dragOffset.x + view.dragCenter.x,\n y: view.dragOrigin.y + view.dragOffset.y + view.dragCenter.y,\n };\n\n // get drag area dimensions\n const dragHeight = getItemHeight(view);\n const dragWidth = getItemWidth(view);\n\n // get rows and columns (There will always be at least one row and one column if a file is present)\n let cols = Math.floor(root.rect.outer.width / dragWidth);\n if (cols > numItems) cols = numItems;\n\n // rows are used to find when we have left the preview area bounding box\n const rows = Math.floor(numItems / cols + 1);\n\n dropAreaDimensions.setHeight = dragHeight * rows;\n dropAreaDimensions.setWidth = dragWidth * cols;\n\n // get new index of dragged item\n var location = {\n y: Math.floor(dragPosition.y / dragHeight),\n x: Math.floor(dragPosition.x / dragWidth),\n getGridIndex: function getGridIndex() {\n if (\n dragPosition.y > dropAreaDimensions.getHeight ||\n dragPosition.y < 0 ||\n dragPosition.x > dropAreaDimensions.getWidth ||\n dragPosition.x < 0\n )\n return oldIndex;\n return this.y * cols + this.x;\n },\n getColIndex: function getColIndex() {\n const items = root.query('GET_ACTIVE_ITEMS');\n const visibleChildren = root.childViews.filter(child => child.rect.element.height);\n const children = items.map(item =>\n visibleChildren.find(childView => childView.id === item.id)\n );\n const currentIndex = children.findIndex(child => child === view);\n const dragHeight = getItemHeight(view);\n const l = children.length;\n let idx = l;\n let childHeight = 0;\n let childBottom = 0;\n let childTop = 0;\n for (let i = 0; i < l; i++) {\n childHeight = getItemHeight(children[i]);\n childTop = childBottom;\n childBottom = childTop + childHeight;\n if (dragPosition.y < childBottom) {\n if (currentIndex > i) {\n if (dragPosition.y < childTop + dragHeight) {\n idx = i;\n break;\n }\n continue;\n }\n idx = i;\n break;\n }\n }\n return idx;\n },\n };\n\n // get new index\n const index = cols > 1 ? location.getGridIndex() : location.getColIndex();\n root.dispatch('MOVE_ITEM', { query: view, index });\n\n // if the index of the item changed, dispatch reorder action\n const currentIndex = dragState.getIndex();\n\n if (currentIndex === undefined || currentIndex !== index) {\n dragState.setIndex(index);\n\n if (currentIndex === undefined) return;\n\n root.dispatch('DID_REORDER_ITEMS', {\n items: root.query('GET_ACTIVE_ITEMS'),\n origin: oldIndex,\n target: index,\n });\n }\n};\n\n/**\n * Setup action routes\n */\nconst route$2 = createRoute({\n DID_ADD_ITEM: addItemView,\n DID_REMOVE_ITEM: removeItemView,\n DID_DRAG_ITEM: dragItem,\n});\n\n/**\n * Write to view\n * @param root\n * @param actions\n * @param props\n */\nconst write$5 = ({ root, props, actions, shouldOptimize }) => {\n // route actions\n route$2({ root, props, actions });\n\n const { dragCoordinates } = props;\n\n // available space on horizontal axis\n const horizontalSpace = root.rect.element.width;\n\n // only draw children that have dimensions\n const visibleChildren = root.childViews.filter(child => child.rect.element.height);\n\n // sort based on current active items\n const children = root\n .query('GET_ACTIVE_ITEMS')\n .map(item => visibleChildren.find(child => child.id === item.id))\n .filter(item => item);\n\n // get index\n const dragIndex = dragCoordinates\n ? getItemIndexByPosition(root, children, dragCoordinates)\n : null;\n\n // add index is used to reserve the dropped/added item index till the actual item is rendered\n const addIndex = root.ref.addIndex || null;\n\n // add index no longer needed till possibly next draw\n root.ref.addIndex = null;\n\n let dragIndexOffset = 0;\n let removeIndexOffset = 0;\n let addIndexOffset = 0;\n\n if (children.length === 0) return;\n\n const childRect = children[0].rect.element;\n const itemVerticalMargin = childRect.marginTop + childRect.marginBottom;\n const itemHorizontalMargin = childRect.marginLeft + childRect.marginRight;\n const itemWidth = childRect.width + itemHorizontalMargin;\n const itemHeight = childRect.height + itemVerticalMargin;\n const itemsPerRow = getItemsPerRow(horizontalSpace, itemWidth);\n\n // stack\n if (itemsPerRow === 1) {\n let offsetY = 0;\n let dragOffset = 0;\n\n children.forEach((child, index) => {\n if (dragIndex) {\n let dist = index - dragIndex;\n if (dist === -2) {\n dragOffset = -itemVerticalMargin * 0.25;\n } else if (dist === -1) {\n dragOffset = -itemVerticalMargin * 0.75;\n } else if (dist === 0) {\n dragOffset = itemVerticalMargin * 0.75;\n } else if (dist === 1) {\n dragOffset = itemVerticalMargin * 0.25;\n } else {\n dragOffset = 0;\n }\n }\n\n if (shouldOptimize) {\n child.translateX = null;\n child.translateY = null;\n }\n\n if (!child.markedForRemoval) {\n moveItem(child, 0, offsetY + dragOffset);\n }\n\n let itemHeight = child.rect.element.height + itemVerticalMargin;\n\n let visualHeight = itemHeight * (child.markedForRemoval ? child.opacity : 1);\n\n offsetY += visualHeight;\n });\n }\n // grid\n else {\n let prevX = 0;\n let prevY = 0;\n\n children.forEach((child, index) => {\n if (index === dragIndex) {\n dragIndexOffset = 1;\n }\n\n if (index === addIndex) {\n addIndexOffset += 1;\n }\n\n if (child.markedForRemoval && child.opacity < 0.5) {\n removeIndexOffset -= 1;\n }\n\n const visualIndex = index + addIndexOffset + dragIndexOffset + removeIndexOffset;\n\n const indexX = visualIndex % itemsPerRow;\n const indexY = Math.floor(visualIndex / itemsPerRow);\n\n const offsetX = indexX * itemWidth;\n const offsetY = indexY * itemHeight;\n\n const vectorX = Math.sign(offsetX - prevX);\n const vectorY = Math.sign(offsetY - prevY);\n\n prevX = offsetX;\n prevY = offsetY;\n\n if (child.markedForRemoval) return;\n\n if (shouldOptimize) {\n child.translateX = null;\n child.translateY = null;\n }\n\n moveItem(child, offsetX, offsetY, vectorX, vectorY);\n });\n }\n};\n\n/**\n * Filters actions that are meant specifically for a certain child of the list\n * @param child\n * @param actions\n */\nconst filterSetItemActions = (child, actions) =>\n actions.filter(action => {\n // if action has an id, filter out actions that don't have this child id\n if (action.data && action.data.id) {\n return child.id === action.data.id;\n }\n\n // allow all other actions\n return true;\n });\n\nconst list = createView({\n create: create$8,\n write: write$5,\n tag: 'ul',\n name: 'list',\n didWriteView: ({ root }) => {\n root.childViews\n .filter(view => view.markedForRemoval && view.opacity === 0 && view.resting)\n .forEach(view => {\n view._destroy();\n root.removeChildView(view);\n });\n },\n filterFrameActionsForChild: filterSetItemActions,\n mixins: {\n apis: ['dragCoordinates'],\n },\n});\n\nconst create$9 = ({ root, props }) => {\n root.ref.list = root.appendChildView(root.createChildView(list));\n props.dragCoordinates = null;\n props.overflowing = false;\n};\n\nconst storeDragCoordinates = ({ root, props, action }) => {\n if (!root.query('GET_ITEM_INSERT_LOCATION_FREEDOM')) return;\n props.dragCoordinates = {\n left: action.position.scopeLeft - root.ref.list.rect.element.left,\n top:\n action.position.scopeTop -\n (root.rect.outer.top + root.rect.element.marginTop + root.rect.element.scrollTop),\n };\n};\n\nconst clearDragCoordinates = ({ props }) => {\n props.dragCoordinates = null;\n};\n\nconst route$3 = createRoute({\n DID_DRAG: storeDragCoordinates,\n DID_END_DRAG: clearDragCoordinates,\n});\n\nconst write$6 = ({ root, props, actions }) => {\n // route actions\n route$3({ root, props, actions });\n\n // current drag position\n root.ref.list.dragCoordinates = props.dragCoordinates;\n\n // if currently overflowing but no longer received overflow\n if (props.overflowing && !props.overflow) {\n props.overflowing = false;\n\n // reset overflow state\n root.element.dataset.state = '';\n root.height = null;\n }\n\n // if is not overflowing currently but does receive overflow value\n if (props.overflow) {\n const newHeight = Math.round(props.overflow);\n if (newHeight !== root.height) {\n props.overflowing = true;\n root.element.dataset.state = 'overflow';\n root.height = newHeight;\n }\n }\n};\n\nconst listScroller = createView({\n create: create$9,\n write: write$6,\n name: 'list-scroller',\n mixins: {\n apis: ['overflow', 'dragCoordinates'],\n styles: ['height', 'translateY'],\n animations: {\n translateY: 'spring',\n },\n },\n});\n\nconst attrToggle = (element, name, state, enabledValue = '') => {\n if (state) {\n attr(element, name, enabledValue);\n } else {\n element.removeAttribute(name);\n }\n};\n\nconst resetFileInput = input => {\n // no value, no need to reset\n if (!input || input.value === '') {\n return;\n }\n\n try {\n // for modern browsers\n input.value = '';\n } catch (err) {}\n\n // for IE10\n if (input.value) {\n // quickly append input to temp form and reset form\n const form = createElement$1('form');\n const parentNode = input.parentNode;\n const ref = input.nextSibling;\n form.appendChild(input);\n form.reset();\n\n // re-inject input where it originally was\n if (ref) {\n parentNode.insertBefore(input, ref);\n } else {\n parentNode.appendChild(input);\n }\n }\n};\n\nconst create$a = ({ root, props }) => {\n // set id so can be referenced from outside labels\n root.element.id = `filepond--browser-${props.id}`;\n\n // set name of element (is removed when a value is set)\n attr(root.element, 'name', root.query('GET_NAME'));\n\n // we have to link this element to the status element\n attr(root.element, 'aria-controls', `filepond--assistant-${props.id}`);\n\n // set label, we use labelled by as otherwise the screenreader does not read the \"browse\" text in the label (as it has tabindex: 0)\n attr(root.element, 'aria-labelledby', `filepond--drop-label-${props.id}`);\n\n // set configurable props\n setAcceptedFileTypes({ root, action: { value: root.query('GET_ACCEPTED_FILE_TYPES') } });\n toggleAllowMultiple({ root, action: { value: root.query('GET_ALLOW_MULTIPLE') } });\n toggleDirectoryFilter({ root, action: { value: root.query('GET_ALLOW_DIRECTORIES_ONLY') } });\n toggleDisabled({ root });\n toggleRequired({ root, action: { value: root.query('GET_REQUIRED') } });\n setCaptureMethod({ root, action: { value: root.query('GET_CAPTURE_METHOD') } });\n\n // handle changes to the input field\n root.ref.handleChange = e => {\n if (!root.element.value) {\n return;\n }\n\n // extract files and move value of webkitRelativePath path to _relativePath\n const files = Array.from(root.element.files).map(file => {\n file._relativePath = file.webkitRelativePath;\n return file;\n });\n\n // we add a little delay so the OS file select window can move out of the way before we add our file\n setTimeout(() => {\n // load files\n props.onload(files);\n\n // reset input, it's just for exposing a method to drop files, should not retain any state\n resetFileInput(root.element);\n }, 250);\n };\n\n root.element.addEventListener('change', root.ref.handleChange);\n};\n\nconst setAcceptedFileTypes = ({ root, action }) => {\n if (!root.query('GET_ALLOW_SYNC_ACCEPT_ATTRIBUTE')) return;\n attrToggle(root.element, 'accept', !!action.value, action.value ? action.value.join(',') : '');\n};\n\nconst toggleAllowMultiple = ({ root, action }) => {\n attrToggle(root.element, 'multiple', action.value);\n};\n\nconst toggleDirectoryFilter = ({ root, action }) => {\n attrToggle(root.element, 'webkitdirectory', action.value);\n};\n\nconst toggleDisabled = ({ root }) => {\n const isDisabled = root.query('GET_DISABLED');\n const doesAllowBrowse = root.query('GET_ALLOW_BROWSE');\n const disableField = isDisabled || !doesAllowBrowse;\n attrToggle(root.element, 'disabled', disableField);\n};\n\nconst toggleRequired = ({ root, action }) => {\n // want to remove required, always possible\n if (!action.value) {\n attrToggle(root.element, 'required', false);\n }\n // if want to make required, only possible when zero items\n else if (root.query('GET_TOTAL_ITEMS') === 0) {\n attrToggle(root.element, 'required', true);\n }\n};\n\nconst setCaptureMethod = ({ root, action }) => {\n attrToggle(root.element, 'capture', !!action.value, action.value === true ? '' : action.value);\n};\n\nconst updateRequiredStatus = ({ root }) => {\n const { element } = root;\n // always remove the required attribute when more than zero items\n if (root.query('GET_TOTAL_ITEMS') > 0) {\n attrToggle(element, 'required', false);\n attrToggle(element, 'name', false);\n } else {\n // add name attribute\n attrToggle(element, 'name', true, root.query('GET_NAME'));\n\n // remove any validation messages\n const shouldCheckValidity = root.query('GET_CHECK_VALIDITY');\n if (shouldCheckValidity) {\n element.setCustomValidity('');\n }\n\n // we only add required if the field has been deemed required\n if (root.query('GET_REQUIRED')) {\n attrToggle(element, 'required', true);\n }\n }\n};\n\nconst updateFieldValidityStatus = ({ root }) => {\n const shouldCheckValidity = root.query('GET_CHECK_VALIDITY');\n if (!shouldCheckValidity) return;\n root.element.setCustomValidity(root.query('GET_LABEL_INVALID_FIELD'));\n};\n\nconst browser = createView({\n tag: 'input',\n name: 'browser',\n ignoreRect: true,\n ignoreRectUpdate: true,\n attributes: {\n type: 'file',\n },\n create: create$a,\n destroy: ({ root }) => {\n root.element.removeEventListener('change', root.ref.handleChange);\n },\n write: createRoute({\n DID_LOAD_ITEM: updateRequiredStatus,\n DID_REMOVE_ITEM: updateRequiredStatus,\n DID_THROW_ITEM_INVALID: updateFieldValidityStatus,\n\n DID_SET_DISABLED: toggleDisabled,\n DID_SET_ALLOW_BROWSE: toggleDisabled,\n DID_SET_ALLOW_DIRECTORIES_ONLY: toggleDirectoryFilter,\n DID_SET_ALLOW_MULTIPLE: toggleAllowMultiple,\n DID_SET_ACCEPTED_FILE_TYPES: setAcceptedFileTypes,\n DID_SET_CAPTURE_METHOD: setCaptureMethod,\n DID_SET_REQUIRED: toggleRequired,\n }),\n});\n\nconst Key = {\n ENTER: 13,\n SPACE: 32,\n};\n\nconst create$b = ({ root, props }) => {\n // create the label and link it to the file browser\n const label = createElement$1('label');\n attr(label, 'for', `filepond--browser-${props.id}`);\n\n // use for labeling file input (aria-labelledby on file input)\n attr(label, 'id', `filepond--drop-label-${props.id}`);\n\n // handle keys\n root.ref.handleKeyDown = e => {\n const isActivationKey = e.keyCode === Key.ENTER || e.keyCode === Key.SPACE;\n if (!isActivationKey) return;\n // stops from triggering the element a second time\n e.preventDefault();\n\n // click link (will then in turn activate file input)\n root.ref.label.click();\n };\n\n root.ref.handleClick = e => {\n const isLabelClick = e.target === label || label.contains(e.target);\n\n // don't want to click twice\n if (isLabelClick) return;\n\n // click link (will then in turn activate file input)\n root.ref.label.click();\n };\n\n // attach events\n label.addEventListener('keydown', root.ref.handleKeyDown);\n root.element.addEventListener('click', root.ref.handleClick);\n\n // update\n updateLabelValue(label, props.caption);\n\n // add!\n root.appendChild(label);\n root.ref.label = label;\n};\n\nconst updateLabelValue = (label, value) => {\n label.innerHTML = value;\n const clickable = label.querySelector('.filepond--label-action');\n if (clickable) {\n attr(clickable, 'tabindex', '0');\n }\n return value;\n};\n\nconst dropLabel = createView({\n name: 'drop-label',\n ignoreRect: true,\n create: create$b,\n destroy: ({ root }) => {\n root.ref.label.addEventListener('keydown', root.ref.handleKeyDown);\n root.element.removeEventListener('click', root.ref.handleClick);\n },\n write: createRoute({\n DID_SET_LABEL_IDLE: ({ root, action }) => {\n updateLabelValue(root.ref.label, action.value);\n },\n }),\n mixins: {\n styles: ['opacity', 'translateX', 'translateY'],\n animations: {\n opacity: { type: 'tween', duration: 150 },\n translateX: 'spring',\n translateY: 'spring',\n },\n },\n});\n\nconst blob = createView({\n name: 'drip-blob',\n ignoreRect: true,\n mixins: {\n styles: ['translateX', 'translateY', 'scaleX', 'scaleY', 'opacity'],\n animations: {\n scaleX: 'spring',\n scaleY: 'spring',\n translateX: 'spring',\n translateY: 'spring',\n opacity: { type: 'tween', duration: 250 },\n },\n },\n});\n\nconst addBlob = ({ root }) => {\n const centerX = root.rect.element.width * 0.5;\n const centerY = root.rect.element.height * 0.5;\n\n root.ref.blob = root.appendChildView(\n root.createChildView(blob, {\n opacity: 0,\n scaleX: 2.5,\n scaleY: 2.5,\n translateX: centerX,\n translateY: centerY,\n })\n );\n};\n\nconst moveBlob = ({ root, action }) => {\n if (!root.ref.blob) {\n addBlob({ root });\n return;\n }\n\n root.ref.blob.translateX = action.position.scopeLeft;\n root.ref.blob.translateY = action.position.scopeTop;\n root.ref.blob.scaleX = 1;\n root.ref.blob.scaleY = 1;\n root.ref.blob.opacity = 1;\n};\n\nconst hideBlob = ({ root }) => {\n if (!root.ref.blob) {\n return;\n }\n root.ref.blob.opacity = 0;\n};\n\nconst explodeBlob = ({ root }) => {\n if (!root.ref.blob) {\n return;\n }\n root.ref.blob.scaleX = 2.5;\n root.ref.blob.scaleY = 2.5;\n root.ref.blob.opacity = 0;\n};\n\nconst write$7 = ({ root, props, actions }) => {\n route$4({ root, props, actions });\n\n const { blob } = root.ref;\n\n if (actions.length === 0 && blob && blob.opacity === 0) {\n root.removeChildView(blob);\n root.ref.blob = null;\n }\n};\n\nconst route$4 = createRoute({\n DID_DRAG: moveBlob,\n DID_DROP: explodeBlob,\n DID_END_DRAG: hideBlob,\n});\n\nconst drip = createView({\n ignoreRect: true,\n ignoreRectUpdate: true,\n name: 'drip',\n write: write$7,\n});\n\nconst setInputFiles = (element, files) => {\n try {\n // Create a DataTransfer instance and add a newly created file\n const dataTransfer = new DataTransfer();\n files.forEach(file => {\n if (file instanceof File) {\n dataTransfer.items.add(file);\n } else {\n dataTransfer.items.add(\n new File([file], file.name, {\n type: file.type,\n })\n );\n }\n });\n\n // Assign the DataTransfer files list to the file input\n element.files = dataTransfer.files;\n } catch (err) {\n return false;\n }\n return true;\n};\n\nconst create$c = ({ root }) => {\n root.ref.fields = {};\n const legend = document.createElement('legend');\n legend.textContent = 'Files';\n root.element.appendChild(legend);\n};\n\nconst getField = (root, id) => root.ref.fields[id];\n\nconst syncFieldPositionsWithItems = root => {\n root.query('GET_ACTIVE_ITEMS').forEach(item => {\n if (!root.ref.fields[item.id]) return;\n root.element.appendChild(root.ref.fields[item.id]);\n });\n};\n\nconst didReorderItems = ({ root }) => syncFieldPositionsWithItems(root);\n\nconst didAddItem = ({ root, action }) => {\n const fileItem = root.query('GET_ITEM', action.id);\n const isLocalFile = fileItem.origin === FileOrigin.LOCAL;\n const shouldUseFileInput = !isLocalFile && root.query('SHOULD_UPDATE_FILE_INPUT');\n const dataContainer = createElement$1('input');\n dataContainer.type = shouldUseFileInput ? 'file' : 'hidden';\n dataContainer.name = root.query('GET_NAME');\n root.ref.fields[action.id] = dataContainer;\n syncFieldPositionsWithItems(root);\n};\n\nconst didLoadItem$1 = ({ root, action }) => {\n const field = getField(root, action.id);\n if (!field) return;\n\n // store server ref in hidden input\n if (action.serverFileReference !== null) field.value = action.serverFileReference;\n\n // store file item in file input\n if (!root.query('SHOULD_UPDATE_FILE_INPUT')) return;\n\n const fileItem = root.query('GET_ITEM', action.id);\n setInputFiles(field, [fileItem.file]);\n};\n\nconst didPrepareOutput = ({ root, action }) => {\n // this timeout pushes the handler after 'load'\n if (!root.query('SHOULD_UPDATE_FILE_INPUT')) return;\n setTimeout(() => {\n const field = getField(root, action.id);\n if (!field) return;\n setInputFiles(field, [action.file]);\n }, 0);\n};\n\nconst didSetDisabled = ({ root }) => {\n root.element.disabled = root.query('GET_DISABLED');\n};\n\nconst didRemoveItem = ({ root, action }) => {\n const field = getField(root, action.id);\n if (!field) return;\n if (field.parentNode) field.parentNode.removeChild(field);\n delete root.ref.fields[action.id];\n};\n\n// only runs for server files. will refuse to update the value if the field\n// is a file field\nconst didDefineValue = ({ root, action }) => {\n const field = getField(root, action.id);\n if (!field) return;\n if (action.value === null) {\n // clear field value\n field.removeAttribute('value');\n } else {\n // set field value\n if (field.type != 'file') {\n field.value = action.value;\n }\n }\n syncFieldPositionsWithItems(root);\n};\n\nconst write$8 = createRoute({\n DID_SET_DISABLED: didSetDisabled,\n DID_ADD_ITEM: didAddItem,\n DID_LOAD_ITEM: didLoadItem$1,\n DID_REMOVE_ITEM: didRemoveItem,\n DID_DEFINE_VALUE: didDefineValue,\n DID_PREPARE_OUTPUT: didPrepareOutput,\n DID_REORDER_ITEMS: didReorderItems,\n DID_SORT_ITEMS: didReorderItems,\n});\n\nconst data = createView({\n tag: 'fieldset',\n name: 'data',\n create: create$c,\n write: write$8,\n ignoreRect: true,\n});\n\nconst getRootNode = element => ('getRootNode' in element ? element.getRootNode() : document);\n\nconst images = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff'];\nconst text$1 = ['css', 'csv', 'html', 'txt'];\nconst map = {\n zip: 'zip|compressed',\n epub: 'application/epub+zip',\n};\n\nconst guesstimateMimeType = (extension = '') => {\n extension = extension.toLowerCase();\n if (images.includes(extension)) {\n return (\n 'image/' + (extension === 'jpg' ? 'jpeg' : extension === 'svg' ? 'svg+xml' : extension)\n );\n }\n if (text$1.includes(extension)) {\n return 'text/' + extension;\n }\n\n return map[extension] || '';\n};\n\nconst requestDataTransferItems = dataTransfer =>\n new Promise((resolve, reject) => {\n // try to get links from transfer, if found we'll exit immediately (unless a file is in the dataTransfer as well, this is because Firefox could represent the file as a URL and a file object at the same time)\n const links = getLinks(dataTransfer);\n if (links.length && !hasFiles(dataTransfer)) {\n return resolve(links);\n }\n // try to get files from the transfer\n getFiles(dataTransfer).then(resolve);\n });\n\n/**\n * Test if datatransfer has files\n */\nconst hasFiles = dataTransfer => {\n if (dataTransfer.files) return dataTransfer.files.length > 0;\n return false;\n};\n\n/**\n * Extracts files from a DataTransfer object\n */\nconst getFiles = dataTransfer =>\n new Promise((resolve, reject) => {\n // get the transfer items as promises\n const promisedFiles = (dataTransfer.items ? Array.from(dataTransfer.items) : [])\n\n // only keep file system items (files and directories)\n .filter(item => isFileSystemItem(item))\n\n // map each item to promise\n .map(item => getFilesFromItem(item));\n\n // if is empty, see if we can extract some info from the files property as a fallback\n if (!promisedFiles.length) {\n // TODO: test for directories (should not be allowed)\n // Use FileReader, problem is that the files property gets lost in the process\n resolve(dataTransfer.files ? Array.from(dataTransfer.files) : []);\n return;\n }\n\n // done!\n Promise.all(promisedFiles)\n .then(returnedFileGroups => {\n // flatten groups\n const files = [];\n returnedFileGroups.forEach(group => {\n files.push.apply(files, group);\n });\n\n // done (filter out empty files)!\n resolve(\n files\n .filter(file => file)\n .map(file => {\n if (!file._relativePath) file._relativePath = file.webkitRelativePath;\n return file;\n })\n );\n })\n .catch(console.error);\n });\n\nconst isFileSystemItem = item => {\n if (isEntry(item)) {\n const entry = getAsEntry(item);\n if (entry) {\n return entry.isFile || entry.isDirectory;\n }\n }\n return item.kind === 'file';\n};\n\nconst getFilesFromItem = item =>\n new Promise((resolve, reject) => {\n if (isDirectoryEntry(item)) {\n getFilesInDirectory(getAsEntry(item))\n .then(resolve)\n .catch(reject);\n return;\n }\n\n resolve([item.getAsFile()]);\n });\n\nconst getFilesInDirectory = entry =>\n new Promise((resolve, reject) => {\n const files = [];\n\n // the total entries to read\n let dirCounter = 0;\n let fileCounter = 0;\n\n const resolveIfDone = () => {\n if (fileCounter === 0 && dirCounter === 0) {\n resolve(files);\n }\n };\n\n // the recursive function\n const readEntries = dirEntry => {\n dirCounter++;\n\n const directoryReader = dirEntry.createReader();\n\n // directories are returned in batches, we need to process all batches before we're done\n const readBatch = () => {\n directoryReader.readEntries(entries => {\n if (entries.length === 0) {\n dirCounter--;\n resolveIfDone();\n return;\n }\n\n entries.forEach(entry => {\n // recursively read more directories\n if (entry.isDirectory) {\n readEntries(entry);\n } else {\n // read as file\n fileCounter++;\n\n entry.file(file => {\n const correctedFile = correctMissingFileType(file);\n if (entry.fullPath) correctedFile._relativePath = entry.fullPath;\n files.push(correctedFile);\n fileCounter--;\n resolveIfDone();\n });\n }\n });\n\n // try to get next batch of files\n readBatch();\n }, reject);\n };\n\n // read first batch of files\n readBatch();\n };\n\n // go!\n readEntries(entry);\n });\n\nconst correctMissingFileType = file => {\n if (file.type.length) return file;\n const date = file.lastModifiedDate;\n const name = file.name;\n const type = guesstimateMimeType(getExtensionFromFilename(file.name));\n if (!type.length) return file;\n file = file.slice(0, file.size, type);\n file.name = name;\n file.lastModifiedDate = date;\n return file;\n};\n\nconst isDirectoryEntry = item => isEntry(item) && (getAsEntry(item) || {}).isDirectory;\n\nconst isEntry = item => 'webkitGetAsEntry' in item;\n\nconst getAsEntry = item => item.webkitGetAsEntry();\n\n/**\n * Extracts links from a DataTransfer object\n */\nconst getLinks = dataTransfer => {\n let links = [];\n try {\n // look in meta data property\n links = getLinksFromTransferMetaData(dataTransfer);\n if (links.length) {\n return links;\n }\n links = getLinksFromTransferURLData(dataTransfer);\n } catch (e) {\n // nope nope nope (probably IE trouble)\n }\n return links;\n};\n\nconst getLinksFromTransferURLData = dataTransfer => {\n let data = dataTransfer.getData('url');\n if (typeof data === 'string' && data.length) {\n return [data];\n }\n return [];\n};\n\nconst getLinksFromTransferMetaData = dataTransfer => {\n let data = dataTransfer.getData('text/html');\n if (typeof data === 'string' && data.length) {\n const matches = data.match(/src\\s*=\\s*\"(.+?)\"/);\n if (matches) {\n return [matches[1]];\n }\n }\n return [];\n};\n\nconst dragNDropObservers = [];\n\nconst eventPosition = e => ({\n pageLeft: e.pageX,\n pageTop: e.pageY,\n scopeLeft: e.offsetX || e.layerX,\n scopeTop: e.offsetY || e.layerY,\n});\n\nconst createDragNDropClient = (element, scopeToObserve, filterElement) => {\n const observer = getDragNDropObserver(scopeToObserve);\n\n const client = {\n element,\n filterElement,\n state: null,\n ondrop: () => {},\n onenter: () => {},\n ondrag: () => {},\n onexit: () => {},\n onload: () => {},\n allowdrop: () => {},\n };\n\n client.destroy = observer.addListener(client);\n\n return client;\n};\n\nconst getDragNDropObserver = element => {\n // see if already exists, if so, return\n const observer = dragNDropObservers.find(item => item.element === element);\n if (observer) {\n return observer;\n }\n\n // create new observer, does not yet exist for this element\n const newObserver = createDragNDropObserver(element);\n dragNDropObservers.push(newObserver);\n return newObserver;\n};\n\nconst createDragNDropObserver = element => {\n const clients = [];\n\n const routes = {\n dragenter,\n dragover,\n dragleave,\n drop,\n };\n\n const handlers = {};\n\n forin(routes, (event, createHandler) => {\n handlers[event] = createHandler(element, clients);\n element.addEventListener(event, handlers[event], false);\n });\n\n const observer = {\n element,\n addListener: client => {\n // add as client\n clients.push(client);\n\n // return removeListener function\n return () => {\n // remove client\n clients.splice(clients.indexOf(client), 1);\n\n // if no more clients, clean up observer\n if (clients.length === 0) {\n dragNDropObservers.splice(dragNDropObservers.indexOf(observer), 1);\n\n forin(routes, event => {\n element.removeEventListener(event, handlers[event], false);\n });\n }\n };\n },\n };\n\n return observer;\n};\n\nconst elementFromPoint = (root, point) => {\n if (!('elementFromPoint' in root)) {\n root = document;\n }\n return root.elementFromPoint(point.x, point.y);\n};\n\nconst isEventTarget = (e, target) => {\n // get root\n const root = getRootNode(target);\n\n // get element at position\n // if root is not actual shadow DOM and does not have elementFromPoint method, use the one on document\n const elementAtPosition = elementFromPoint(root, {\n x: e.pageX - window.pageXOffset,\n y: e.pageY - window.pageYOffset,\n });\n\n // test if target is the element or if one of its children is\n return elementAtPosition === target || target.contains(elementAtPosition);\n};\n\nlet initialTarget = null;\n\nconst setDropEffect = (dataTransfer, effect) => {\n // is in try catch as IE11 will throw error if not\n try {\n dataTransfer.dropEffect = effect;\n } catch (e) {}\n};\n\nconst dragenter = (root, clients) => e => {\n e.preventDefault();\n\n initialTarget = e.target;\n\n clients.forEach(client => {\n const { element, onenter } = client;\n\n if (isEventTarget(e, element)) {\n client.state = 'enter';\n\n // fire enter event\n onenter(eventPosition(e));\n }\n });\n};\n\nconst dragover = (root, clients) => e => {\n e.preventDefault();\n\n const dataTransfer = e.dataTransfer;\n\n requestDataTransferItems(dataTransfer).then(items => {\n let overDropTarget = false;\n\n clients.some(client => {\n const { filterElement, element, onenter, onexit, ondrag, allowdrop } = client;\n\n // by default we can drop\n setDropEffect(dataTransfer, 'copy');\n\n // allow transfer of these items\n const allowsTransfer = allowdrop(items);\n\n // only used when can be dropped on page\n if (!allowsTransfer) {\n setDropEffect(dataTransfer, 'none');\n return;\n }\n\n // targetting this client\n if (isEventTarget(e, element)) {\n overDropTarget = true;\n\n // had no previous state, means we are entering this client\n if (client.state === null) {\n client.state = 'enter';\n onenter(eventPosition(e));\n return;\n }\n\n // now over element (no matter if it allows the drop or not)\n client.state = 'over';\n\n // needs to allow transfer\n if (filterElement && !allowsTransfer) {\n setDropEffect(dataTransfer, 'none');\n return;\n }\n\n // dragging\n ondrag(eventPosition(e));\n } else {\n // should be over an element to drop\n if (filterElement && !overDropTarget) {\n setDropEffect(dataTransfer, 'none');\n }\n\n // might have just left this client?\n if (client.state) {\n client.state = null;\n onexit(eventPosition(e));\n }\n }\n });\n });\n};\n\nconst drop = (root, clients) => e => {\n e.preventDefault();\n\n const dataTransfer = e.dataTransfer;\n\n requestDataTransferItems(dataTransfer).then(items => {\n clients.forEach(client => {\n const { filterElement, element, ondrop, onexit, allowdrop } = client;\n\n client.state = null;\n\n // if we're filtering on element we need to be over the element to drop\n if (filterElement && !isEventTarget(e, element)) return;\n\n // no transfer for this client\n if (!allowdrop(items)) return onexit(eventPosition(e));\n\n // we can drop these items on this client\n ondrop(eventPosition(e), items);\n });\n });\n};\n\nconst dragleave = (root, clients) => e => {\n if (initialTarget !== e.target) {\n return;\n }\n\n clients.forEach(client => {\n const { onexit } = client;\n\n client.state = null;\n\n onexit(eventPosition(e));\n });\n};\n\nconst createHopper = (scope, validateItems, options) => {\n // is now hopper scope\n scope.classList.add('filepond--hopper');\n\n // shortcuts\n const { catchesDropsOnPage, requiresDropOnElement, filterItems = items => items } = options;\n\n // create a dnd client\n const client = createDragNDropClient(\n scope,\n catchesDropsOnPage ? document.documentElement : scope,\n requiresDropOnElement\n );\n\n // current client state\n let lastState = '';\n let currentState = '';\n\n // determines if a file may be dropped\n client.allowdrop = items => {\n // TODO: if we can, throw error to indicate the items cannot by dropped\n\n return validateItems(filterItems(items));\n };\n\n client.ondrop = (position, items) => {\n const filteredItems = filterItems(items);\n\n if (!validateItems(filteredItems)) {\n api.ondragend(position);\n return;\n }\n\n currentState = 'drag-drop';\n\n api.onload(filteredItems, position);\n };\n\n client.ondrag = position => {\n api.ondrag(position);\n };\n\n client.onenter = position => {\n currentState = 'drag-over';\n\n api.ondragstart(position);\n };\n\n client.onexit = position => {\n currentState = 'drag-exit';\n\n api.ondragend(position);\n };\n\n const api = {\n updateHopperState: () => {\n if (lastState !== currentState) {\n scope.dataset.hopperState = currentState;\n lastState = currentState;\n }\n },\n onload: () => {},\n ondragstart: () => {},\n ondrag: () => {},\n ondragend: () => {},\n destroy: () => {\n // destroy client\n client.destroy();\n },\n };\n\n return api;\n};\n\nlet listening = false;\nconst listeners$1 = [];\n\nconst handlePaste = e => {\n // if is pasting in input or textarea and the target is outside of a filepond scope, ignore\n const activeEl = document.activeElement;\n const isActiveElementEditable =\n activeEl &&\n (/textarea|input/i.test(activeEl.nodeName) ||\n activeEl.getAttribute('contenteditable') === 'true');\n\n if (isActiveElementEditable) {\n // test textarea or input is contained in filepond root\n let inScope = false;\n let element = activeEl;\n while (element !== document.body) {\n if (element.classList.contains('filepond--root')) {\n inScope = true;\n break;\n }\n element = element.parentNode;\n }\n\n if (!inScope) return;\n }\n\n requestDataTransferItems(e.clipboardData).then(files => {\n // no files received\n if (!files.length) {\n return;\n }\n\n // notify listeners of received files\n listeners$1.forEach(listener => listener(files));\n });\n};\n\nconst listen = cb => {\n // can't add twice\n if (listeners$1.includes(cb)) {\n return;\n }\n\n // add initial listener\n listeners$1.push(cb);\n\n // setup paste listener for entire page\n if (listening) {\n return;\n }\n\n listening = true;\n document.addEventListener('paste', handlePaste);\n};\n\nconst unlisten = listener => {\n arrayRemove(listeners$1, listeners$1.indexOf(listener));\n\n // clean up\n if (listeners$1.length === 0) {\n document.removeEventListener('paste', handlePaste);\n listening = false;\n }\n};\n\nconst createPaster = () => {\n const cb = files => {\n api.onload(files);\n };\n\n const api = {\n destroy: () => {\n unlisten(cb);\n },\n onload: () => {},\n };\n\n listen(cb);\n\n return api;\n};\n\n/**\n * Creates the file view\n */\nconst create$d = ({ root, props }) => {\n root.element.id = `filepond--assistant-${props.id}`;\n attr(root.element, 'role', 'alert');\n attr(root.element, 'aria-live', 'polite');\n attr(root.element, 'aria-relevant', 'additions');\n};\n\nlet addFilesNotificationTimeout = null;\nlet notificationClearTimeout = null;\n\nconst filenames = [];\n\nconst assist = (root, message) => {\n root.element.textContent = message;\n};\n\nconst clear$1 = root => {\n root.element.textContent = '';\n};\n\nconst listModified = (root, filename, label) => {\n const total = root.query('GET_TOTAL_ITEMS');\n assist(\n root,\n `${label} ${filename}, ${total} ${\n total === 1\n ? root.query('GET_LABEL_FILE_COUNT_SINGULAR')\n : root.query('GET_LABEL_FILE_COUNT_PLURAL')\n }`\n );\n\n // clear group after set amount of time so the status is not read twice\n clearTimeout(notificationClearTimeout);\n notificationClearTimeout = setTimeout(() => {\n clear$1(root);\n }, 1500);\n};\n\nconst isUsingFilePond = root => root.element.parentNode.contains(document.activeElement);\n\nconst itemAdded = ({ root, action }) => {\n if (!isUsingFilePond(root)) {\n return;\n }\n\n root.element.textContent = '';\n const item = root.query('GET_ITEM', action.id);\n filenames.push(item.filename);\n\n clearTimeout(addFilesNotificationTimeout);\n addFilesNotificationTimeout = setTimeout(() => {\n listModified(root, filenames.join(', '), root.query('GET_LABEL_FILE_ADDED'));\n filenames.length = 0;\n }, 750);\n};\n\nconst itemRemoved = ({ root, action }) => {\n if (!isUsingFilePond(root)) {\n return;\n }\n\n const item = action.item;\n listModified(root, item.filename, root.query('GET_LABEL_FILE_REMOVED'));\n};\n\nconst itemProcessed = ({ root, action }) => {\n // will also notify the user when FilePond is not being used, as the user might be occupied with other activities while uploading a file\n\n const item = root.query('GET_ITEM', action.id);\n const filename = item.filename;\n const label = root.query('GET_LABEL_FILE_PROCESSING_COMPLETE');\n\n assist(root, `${filename} ${label}`);\n};\n\nconst itemProcessedUndo = ({ root, action }) => {\n const item = root.query('GET_ITEM', action.id);\n const filename = item.filename;\n const label = root.query('GET_LABEL_FILE_PROCESSING_ABORTED');\n\n assist(root, `${filename} ${label}`);\n};\n\nconst itemError = ({ root, action }) => {\n const item = root.query('GET_ITEM', action.id);\n const filename = item.filename;\n\n // will also notify the user when FilePond is not being used, as the user might be occupied with other activities while uploading a file\n\n assist(root, `${action.status.main} ${filename} ${action.status.sub}`);\n};\n\nconst assistant = createView({\n create: create$d,\n ignoreRect: true,\n ignoreRectUpdate: true,\n write: createRoute({\n DID_LOAD_ITEM: itemAdded,\n DID_REMOVE_ITEM: itemRemoved,\n DID_COMPLETE_ITEM_PROCESSING: itemProcessed,\n\n DID_ABORT_ITEM_PROCESSING: itemProcessedUndo,\n DID_REVERT_ITEM_PROCESSING: itemProcessedUndo,\n\n DID_THROW_ITEM_REMOVE_ERROR: itemError,\n DID_THROW_ITEM_LOAD_ERROR: itemError,\n DID_THROW_ITEM_INVALID: itemError,\n DID_THROW_ITEM_PROCESSING_ERROR: itemError,\n }),\n tag: 'span',\n name: 'assistant',\n});\n\nconst toCamels = (string, separator = '-') =>\n string.replace(new RegExp(`${separator}.`, 'g'), sub => sub.charAt(1).toUpperCase());\n\nconst debounce = (func, interval = 16, immidiateOnly = true) => {\n let last = Date.now();\n let timeout = null;\n\n return (...args) => {\n clearTimeout(timeout);\n\n const dist = Date.now() - last;\n\n const fn = () => {\n last = Date.now();\n func(...args);\n };\n\n if (dist < interval) {\n // we need to delay by the difference between interval and dist\n // for example: if distance is 10 ms and interval is 16 ms,\n // we need to wait an additional 6ms before calling the function)\n if (!immidiateOnly) {\n timeout = setTimeout(fn, interval - dist);\n }\n } else {\n // go!\n fn();\n }\n };\n};\n\nconst MAX_FILES_LIMIT = 1000000;\n\nconst prevent = e => e.preventDefault();\n\nconst create$e = ({ root, props }) => {\n // Add id\n const id = root.query('GET_ID');\n if (id) {\n root.element.id = id;\n }\n\n // Add className\n const className = root.query('GET_CLASS_NAME');\n if (className) {\n className\n .split(' ')\n .filter(name => name.length)\n .forEach(name => {\n root.element.classList.add(name);\n });\n }\n\n // Field label\n root.ref.label = root.appendChildView(\n root.createChildView(dropLabel, {\n ...props,\n translateY: null,\n caption: root.query('GET_LABEL_IDLE'),\n })\n );\n\n // List of items\n root.ref.list = root.appendChildView(root.createChildView(listScroller, { translateY: null }));\n\n // Background panel\n root.ref.panel = root.appendChildView(root.createChildView(panel, { name: 'panel-root' }));\n\n // Assistant notifies assistive tech when content changes\n root.ref.assistant = root.appendChildView(root.createChildView(assistant, { ...props }));\n\n // Data\n root.ref.data = root.appendChildView(root.createChildView(data, { ...props }));\n\n // Measure (tests if fixed height was set)\n // DOCTYPE needs to be set for this to work\n root.ref.measure = createElement$1('div');\n root.ref.measure.style.height = '100%';\n root.element.appendChild(root.ref.measure);\n\n // information on the root height or fixed height status\n root.ref.bounds = null;\n\n // apply initial style properties\n root.query('GET_STYLES')\n .filter(style => !isEmpty(style.value))\n .map(({ name, value }) => {\n root.element.dataset[name] = value;\n });\n\n // determine if width changed\n root.ref.widthPrevious = null;\n root.ref.widthUpdated = debounce(() => {\n root.ref.updateHistory = [];\n root.dispatch('DID_RESIZE_ROOT');\n }, 250);\n\n // history of updates\n root.ref.previousAspectRatio = null;\n root.ref.updateHistory = [];\n\n // prevent scrolling and zooming on iOS (only if supports pointer events, for then we can enable reorder)\n const canHover = window.matchMedia('(pointer: fine) and (hover: hover)').matches;\n const hasPointerEvents = 'PointerEvent' in window;\n if (root.query('GET_ALLOW_REORDER') && hasPointerEvents && !canHover) {\n root.element.addEventListener('touchmove', prevent, { passive: false });\n root.element.addEventListener('gesturestart', prevent);\n }\n\n // add credits\n const credits = root.query('GET_CREDITS');\n const hasCredits = credits.length === 2;\n if (hasCredits) {\n const frag = document.createElement('a');\n frag.className = 'filepond--credits';\n frag.href = credits[0];\n frag.tabIndex = -1;\n frag.target = '_blank';\n frag.rel = 'noopener noreferrer nofollow';\n frag.textContent = credits[1];\n root.element.appendChild(frag);\n root.ref.credits = frag;\n }\n};\n\nconst write$9 = ({ root, props, actions }) => {\n // route actions\n route$5({ root, props, actions });\n\n // apply style properties\n actions\n .filter(action => /^DID_SET_STYLE_/.test(action.type))\n .filter(action => !isEmpty(action.data.value))\n .map(({ type, data }) => {\n const name = toCamels(type.substring(8).toLowerCase(), '_');\n root.element.dataset[name] = data.value;\n root.invalidateLayout();\n });\n\n if (root.rect.element.hidden) return;\n\n if (root.rect.element.width !== root.ref.widthPrevious) {\n root.ref.widthPrevious = root.rect.element.width;\n root.ref.widthUpdated();\n }\n\n // get box bounds, we do this only once\n let bounds = root.ref.bounds;\n if (!bounds) {\n bounds = root.ref.bounds = calculateRootBoundingBoxHeight(root);\n\n // destroy measure element\n root.element.removeChild(root.ref.measure);\n root.ref.measure = null;\n }\n\n // get quick references to various high level parts of the upload tool\n const { hopper, label, list, panel } = root.ref;\n\n // sets correct state to hopper scope\n if (hopper) {\n hopper.updateHopperState();\n }\n\n // bool to indicate if we're full or not\n const aspectRatio = root.query('GET_PANEL_ASPECT_RATIO');\n const isMultiItem = root.query('GET_ALLOW_MULTIPLE');\n const totalItems = root.query('GET_TOTAL_ITEMS');\n const maxItems = isMultiItem ? root.query('GET_MAX_FILES') || MAX_FILES_LIMIT : 1;\n const atMaxCapacity = totalItems === maxItems;\n\n // action used to add item\n const addAction = actions.find(action => action.type === 'DID_ADD_ITEM');\n\n // if reached max capacity and we've just reached it\n if (atMaxCapacity && addAction) {\n // get interaction type\n const interactionMethod = addAction.data.interactionMethod;\n\n // hide label\n label.opacity = 0;\n\n if (isMultiItem) {\n label.translateY = -40;\n } else {\n if (interactionMethod === InteractionMethod.API) {\n label.translateX = 40;\n } else if (interactionMethod === InteractionMethod.BROWSE) {\n label.translateY = 40;\n } else {\n label.translateY = 30;\n }\n }\n } else if (!atMaxCapacity) {\n label.opacity = 1;\n label.translateX = 0;\n label.translateY = 0;\n }\n\n const listItemMargin = calculateListItemMargin(root);\n\n const listHeight = calculateListHeight(root);\n\n const labelHeight = label.rect.element.height;\n const currentLabelHeight = !isMultiItem || atMaxCapacity ? 0 : labelHeight;\n\n const listMarginTop = atMaxCapacity ? list.rect.element.marginTop : 0;\n const listMarginBottom = totalItems === 0 ? 0 : list.rect.element.marginBottom;\n\n const visualHeight = currentLabelHeight + listMarginTop + listHeight.visual + listMarginBottom;\n const boundsHeight = currentLabelHeight + listMarginTop + listHeight.bounds + listMarginBottom;\n\n // link list to label bottom position\n list.translateY =\n Math.max(0, currentLabelHeight - list.rect.element.marginTop) - listItemMargin.top;\n\n if (aspectRatio) {\n // fixed aspect ratio\n\n // calculate height based on width\n const width = root.rect.element.width;\n const height = width * aspectRatio;\n\n // clear history if aspect ratio has changed\n if (aspectRatio !== root.ref.previousAspectRatio) {\n root.ref.previousAspectRatio = aspectRatio;\n root.ref.updateHistory = [];\n }\n\n // remember this width\n const history = root.ref.updateHistory;\n history.push(width);\n\n const MAX_BOUNCES = 2;\n if (history.length > MAX_BOUNCES * 2) {\n const l = history.length;\n const bottom = l - 10;\n let bounces = 0;\n for (let i = l; i >= bottom; i--) {\n if (history[i] === history[i - 2]) {\n bounces++;\n }\n\n if (bounces >= MAX_BOUNCES) {\n // dont adjust height\n return;\n }\n }\n }\n\n // fix height of panel so it adheres to aspect ratio\n panel.scalable = false;\n panel.height = height;\n\n // available height for list\n const listAvailableHeight =\n // the height of the panel minus the label height\n height -\n currentLabelHeight -\n // the room we leave open between the end of the list and the panel bottom\n (listMarginBottom - listItemMargin.bottom) -\n // if we're full we need to leave some room between the top of the panel and the list\n (atMaxCapacity ? listMarginTop : 0);\n\n if (listHeight.visual > listAvailableHeight) {\n list.overflow = listAvailableHeight;\n } else {\n list.overflow = null;\n }\n\n // set container bounds (so pushes siblings downwards)\n root.height = height;\n } else if (bounds.fixedHeight) {\n // fixed height\n\n // fix height of panel\n panel.scalable = false;\n\n // available height for list\n const listAvailableHeight =\n // the height of the panel minus the label height\n bounds.fixedHeight -\n currentLabelHeight -\n // the room we leave open between the end of the list and the panel bottom\n (listMarginBottom - listItemMargin.bottom) -\n // if we're full we need to leave some room between the top of the panel and the list\n (atMaxCapacity ? listMarginTop : 0);\n\n // set list height\n if (listHeight.visual > listAvailableHeight) {\n list.overflow = listAvailableHeight;\n } else {\n list.overflow = null;\n }\n\n // no need to set container bounds as these are handles by CSS fixed height\n } else if (bounds.cappedHeight) {\n // max-height\n\n // not a fixed height panel\n const isCappedHeight = visualHeight >= bounds.cappedHeight;\n const panelHeight = Math.min(bounds.cappedHeight, visualHeight);\n panel.scalable = true;\n panel.height = isCappedHeight\n ? panelHeight\n : panelHeight - listItemMargin.top - listItemMargin.bottom;\n\n // available height for list\n const listAvailableHeight =\n // the height of the panel minus the label height\n panelHeight -\n currentLabelHeight -\n // the room we leave open between the end of the list and the panel bottom\n (listMarginBottom - listItemMargin.bottom) -\n // if we're full we need to leave some room between the top of the panel and the list\n (atMaxCapacity ? listMarginTop : 0);\n\n // set list height (if is overflowing)\n if (visualHeight > bounds.cappedHeight && listHeight.visual > listAvailableHeight) {\n list.overflow = listAvailableHeight;\n } else {\n list.overflow = null;\n }\n\n // set container bounds (so pushes siblings downwards)\n root.height = Math.min(\n bounds.cappedHeight,\n boundsHeight - listItemMargin.top - listItemMargin.bottom\n );\n } else {\n // flexible height\n\n // not a fixed height panel\n const itemMargin = totalItems > 0 ? listItemMargin.top + listItemMargin.bottom : 0;\n panel.scalable = true;\n panel.height = Math.max(labelHeight, visualHeight - itemMargin);\n\n // set container bounds (so pushes siblings downwards)\n root.height = Math.max(labelHeight, boundsHeight - itemMargin);\n }\n\n // move credits to bottom\n if (root.ref.credits && panel.heightCurrent)\n root.ref.credits.style.transform = `translateY(${panel.heightCurrent}px)`;\n};\n\nconst calculateListItemMargin = root => {\n const item = root.ref.list.childViews[0].childViews[0];\n return item\n ? {\n top: item.rect.element.marginTop,\n bottom: item.rect.element.marginBottom,\n }\n : {\n top: 0,\n bottom: 0,\n };\n};\n\nconst calculateListHeight = root => {\n let visual = 0;\n let bounds = 0;\n\n // get file list reference\n const scrollList = root.ref.list;\n const itemList = scrollList.childViews[0];\n const visibleChildren = itemList.childViews.filter(child => child.rect.element.height);\n const children = root\n .query('GET_ACTIVE_ITEMS')\n .map(item => visibleChildren.find(child => child.id === item.id))\n .filter(item => item);\n\n // no children, done!\n if (children.length === 0) return { visual, bounds };\n\n const horizontalSpace = itemList.rect.element.width;\n const dragIndex = getItemIndexByPosition(itemList, children, scrollList.dragCoordinates);\n\n const childRect = children[0].rect.element;\n\n const itemVerticalMargin = childRect.marginTop + childRect.marginBottom;\n const itemHorizontalMargin = childRect.marginLeft + childRect.marginRight;\n\n const itemWidth = childRect.width + itemHorizontalMargin;\n const itemHeight = childRect.height + itemVerticalMargin;\n\n const newItem = typeof dragIndex !== 'undefined' && dragIndex >= 0 ? 1 : 0;\n const removedItem = children.find(child => child.markedForRemoval && child.opacity < 0.45)\n ? -1\n : 0;\n const verticalItemCount = children.length + newItem + removedItem;\n const itemsPerRow = getItemsPerRow(horizontalSpace, itemWidth);\n\n // stack\n if (itemsPerRow === 1) {\n children.forEach(item => {\n const height = item.rect.element.height + itemVerticalMargin;\n bounds += height;\n visual += height * item.opacity;\n });\n }\n // grid\n else {\n bounds = Math.ceil(verticalItemCount / itemsPerRow) * itemHeight;\n visual = bounds;\n }\n\n return { visual, bounds };\n};\n\nconst calculateRootBoundingBoxHeight = root => {\n const height = root.ref.measureHeight || null;\n const cappedHeight = parseInt(root.style.maxHeight, 10) || null;\n const fixedHeight = height === 0 ? null : height;\n\n return {\n cappedHeight,\n fixedHeight,\n };\n};\n\nconst exceedsMaxFiles = (root, items) => {\n const allowReplace = root.query('GET_ALLOW_REPLACE');\n const allowMultiple = root.query('GET_ALLOW_MULTIPLE');\n const totalItems = root.query('GET_TOTAL_ITEMS');\n let maxItems = root.query('GET_MAX_FILES');\n\n // total amount of items being dragged\n const totalBrowseItems = items.length;\n\n // if does not allow multiple items and dragging more than one item\n if (!allowMultiple && totalBrowseItems > 1) {\n root.dispatch('DID_THROW_MAX_FILES', {\n source: items,\n error: createResponse('warning', 0, 'Max files'),\n });\n return true;\n }\n\n // limit max items to one if not allowed to drop multiple items\n maxItems = allowMultiple ? maxItems : 1;\n\n if (!allowMultiple && allowReplace) {\n // There is only one item, so there is room to replace or add an item\n return false;\n }\n\n // no more room?\n const hasMaxItems = isInt(maxItems);\n if (hasMaxItems && totalItems + totalBrowseItems > maxItems) {\n root.dispatch('DID_THROW_MAX_FILES', {\n source: items,\n error: createResponse('warning', 0, 'Max files'),\n });\n return true;\n }\n\n return false;\n};\n\nconst getDragIndex = (list, children, position) => {\n const itemList = list.childViews[0];\n return getItemIndexByPosition(itemList, children, {\n left: position.scopeLeft - itemList.rect.element.left,\n top:\n position.scopeTop -\n (list.rect.outer.top + list.rect.element.marginTop + list.rect.element.scrollTop),\n });\n};\n\n/**\n * Enable or disable file drop functionality\n */\nconst toggleDrop = root => {\n const isAllowed = root.query('GET_ALLOW_DROP');\n const isDisabled = root.query('GET_DISABLED');\n const enabled = isAllowed && !isDisabled;\n if (enabled && !root.ref.hopper) {\n const hopper = createHopper(\n root.element,\n items => {\n // allow quick validation of dropped items\n const beforeDropFile = root.query('GET_BEFORE_DROP_FILE') || (() => true);\n\n // all items should be validated by all filters as valid\n const dropValidation = root.query('GET_DROP_VALIDATION');\n return dropValidation\n ? items.every(\n item =>\n applyFilters('ALLOW_HOPPER_ITEM', item, {\n query: root.query,\n }).every(result => result === true) && beforeDropFile(item)\n )\n : true;\n },\n {\n filterItems: items => {\n const ignoredFiles = root.query('GET_IGNORED_FILES');\n return items.filter(item => {\n if (isFile(item)) {\n return !ignoredFiles.includes(item.name.toLowerCase());\n }\n return true;\n });\n },\n catchesDropsOnPage: root.query('GET_DROP_ON_PAGE'),\n requiresDropOnElement: root.query('GET_DROP_ON_ELEMENT'),\n }\n );\n\n hopper.onload = (items, position) => {\n // get item children elements and sort based on list sort\n const list = root.ref.list.childViews[0];\n const visibleChildren = list.childViews.filter(child => child.rect.element.height);\n const children = root\n .query('GET_ACTIVE_ITEMS')\n .map(item => visibleChildren.find(child => child.id === item.id))\n .filter(item => item);\n\n applyFilterChain('ADD_ITEMS', items, { dispatch: root.dispatch }).then(queue => {\n // these files don't fit so stop here\n if (exceedsMaxFiles(root, queue)) return false;\n\n // go\n root.dispatch('ADD_ITEMS', {\n items: queue,\n index: getDragIndex(root.ref.list, children, position),\n interactionMethod: InteractionMethod.DROP,\n });\n });\n\n root.dispatch('DID_DROP', { position });\n\n root.dispatch('DID_END_DRAG', { position });\n };\n\n hopper.ondragstart = position => {\n root.dispatch('DID_START_DRAG', { position });\n };\n\n hopper.ondrag = debounce(position => {\n root.dispatch('DID_DRAG', { position });\n });\n\n hopper.ondragend = position => {\n root.dispatch('DID_END_DRAG', { position });\n };\n\n root.ref.hopper = hopper;\n\n root.ref.drip = root.appendChildView(root.createChildView(drip));\n } else if (!enabled && root.ref.hopper) {\n root.ref.hopper.destroy();\n root.ref.hopper = null;\n root.removeChildView(root.ref.drip);\n }\n};\n\n/**\n * Enable or disable browse functionality\n */\nconst toggleBrowse = (root, props) => {\n const isAllowed = root.query('GET_ALLOW_BROWSE');\n const isDisabled = root.query('GET_DISABLED');\n const enabled = isAllowed && !isDisabled;\n if (enabled && !root.ref.browser) {\n root.ref.browser = root.appendChildView(\n root.createChildView(browser, {\n ...props,\n onload: items => {\n applyFilterChain('ADD_ITEMS', items, {\n dispatch: root.dispatch,\n }).then(queue => {\n // these files don't fit so stop here\n if (exceedsMaxFiles(root, queue)) return false;\n\n // add items!\n root.dispatch('ADD_ITEMS', {\n items: queue,\n index: -1,\n interactionMethod: InteractionMethod.BROWSE,\n });\n });\n },\n }),\n 0\n );\n } else if (!enabled && root.ref.browser) {\n root.removeChildView(root.ref.browser);\n root.ref.browser = null;\n }\n};\n\n/**\n * Enable or disable paste functionality\n */\nconst togglePaste = root => {\n const isAllowed = root.query('GET_ALLOW_PASTE');\n const isDisabled = root.query('GET_DISABLED');\n const enabled = isAllowed && !isDisabled;\n if (enabled && !root.ref.paster) {\n root.ref.paster = createPaster();\n root.ref.paster.onload = items => {\n applyFilterChain('ADD_ITEMS', items, { dispatch: root.dispatch }).then(queue => {\n // these files don't fit so stop here\n if (exceedsMaxFiles(root, queue)) return false;\n\n // add items!\n root.dispatch('ADD_ITEMS', {\n items: queue,\n index: -1,\n interactionMethod: InteractionMethod.PASTE,\n });\n });\n };\n } else if (!enabled && root.ref.paster) {\n root.ref.paster.destroy();\n root.ref.paster = null;\n }\n};\n\n/**\n * Route actions\n */\nconst route$5 = createRoute({\n DID_SET_ALLOW_BROWSE: ({ root, props }) => {\n toggleBrowse(root, props);\n },\n DID_SET_ALLOW_DROP: ({ root }) => {\n toggleDrop(root);\n },\n DID_SET_ALLOW_PASTE: ({ root }) => {\n togglePaste(root);\n },\n DID_SET_DISABLED: ({ root, props }) => {\n toggleDrop(root);\n togglePaste(root);\n toggleBrowse(root, props);\n const isDisabled = root.query('GET_DISABLED');\n if (isDisabled) {\n root.element.dataset.disabled = 'disabled';\n } else {\n // delete root.element.dataset.disabled; <= this does not work on iOS 10\n root.element.removeAttribute('data-disabled');\n }\n },\n});\n\nconst root = createView({\n name: 'root',\n read: ({ root }) => {\n if (root.ref.measure) {\n root.ref.measureHeight = root.ref.measure.offsetHeight;\n }\n },\n create: create$e,\n write: write$9,\n destroy: ({ root }) => {\n if (root.ref.paster) {\n root.ref.paster.destroy();\n }\n if (root.ref.hopper) {\n root.ref.hopper.destroy();\n }\n root.element.removeEventListener('touchmove', prevent);\n root.element.removeEventListener('gesturestart', prevent);\n },\n mixins: {\n styles: ['height'],\n },\n});\n\n// creates the app\nconst createApp = (initialOptions = {}) => {\n // let element\n let originalElement = null;\n\n // get default options\n const defaultOptions = getOptions();\n\n // create the data store, this will contain all our app info\n const store = createStore(\n // initial state (should be serializable)\n createInitialState(defaultOptions),\n\n // queries\n [queries, createOptionQueries(defaultOptions)],\n\n // action handlers\n [actions, createOptionActions(defaultOptions)]\n );\n\n // set initial options\n store.dispatch('SET_OPTIONS', { options: initialOptions });\n\n // kick thread if visibility changes\n const visibilityHandler = () => {\n if (document.hidden) return;\n store.dispatch('KICK');\n };\n document.addEventListener('visibilitychange', visibilityHandler);\n\n // re-render on window resize start and finish\n let resizeDoneTimer = null;\n let isResizing = false;\n let isResizingHorizontally = false;\n let initialWindowWidth = null;\n let currentWindowWidth = null;\n const resizeHandler = () => {\n if (!isResizing) {\n isResizing = true;\n }\n clearTimeout(resizeDoneTimer);\n resizeDoneTimer = setTimeout(() => {\n isResizing = false;\n initialWindowWidth = null;\n currentWindowWidth = null;\n if (isResizingHorizontally) {\n isResizingHorizontally = false;\n store.dispatch('DID_STOP_RESIZE');\n }\n }, 500);\n };\n window.addEventListener('resize', resizeHandler);\n\n // render initial view\n const view = root(store, { id: getUniqueId() });\n\n //\n // PRIVATE API -------------------------------------------------------------------------------------\n //\n let isResting = false;\n let isHidden = false;\n\n const readWriteApi = {\n // necessary for update loop\n\n /**\n * Reads from dom (never call manually)\n * @private\n */\n _read: () => {\n // test if we're resizing horizontally\n // TODO: see if we can optimize this by measuring root rect\n if (isResizing) {\n currentWindowWidth = window.innerWidth;\n if (!initialWindowWidth) {\n initialWindowWidth = currentWindowWidth;\n }\n\n if (!isResizingHorizontally && currentWindowWidth !== initialWindowWidth) {\n store.dispatch('DID_START_RESIZE');\n isResizingHorizontally = true;\n }\n }\n\n if (isHidden && isResting) {\n // test if is no longer hidden\n isResting = view.element.offsetParent === null;\n }\n\n // if resting, no need to read as numbers will still all be correct\n if (isResting) return;\n\n // read view data\n view._read();\n\n // if is hidden we need to know so we exit rest mode when revealed\n isHidden = view.rect.element.hidden;\n },\n\n /**\n * Writes to dom (never call manually)\n * @private\n */\n _write: ts => {\n // get all actions from store\n const actions = store\n .processActionQueue()\n\n // filter out set actions (these will automatically trigger DID_SET)\n .filter(action => !/^SET_/.test(action.type));\n\n // if was idling and no actions stop here\n if (isResting && !actions.length) return;\n\n // some actions might trigger events\n routeActionsToEvents(actions);\n\n // update the view\n isResting = view._write(ts, actions, isResizingHorizontally);\n\n // will clean up all archived items\n removeReleasedItems(store.query('GET_ITEMS'));\n\n // now idling\n if (isResting) {\n store.processDispatchQueue();\n }\n },\n };\n\n //\n // EXPOSE EVENTS -------------------------------------------------------------------------------------\n //\n const createEvent = name => data => {\n // create default event\n const event = {\n type: name,\n };\n\n // no data to add\n if (!data) {\n return event;\n }\n\n // copy relevant props\n if (data.hasOwnProperty('error')) {\n event.error = data.error ? { ...data.error } : null;\n }\n\n if (data.status) {\n event.status = { ...data.status };\n }\n\n if (data.file) {\n event.output = data.file;\n }\n\n // only source is available, else add item if possible\n if (data.source) {\n event.file = data.source;\n } else if (data.item || data.id) {\n const item = data.item ? data.item : store.query('GET_ITEM', data.id);\n event.file = item ? createItemAPI(item) : null;\n }\n\n // map all items in a possible items array\n if (data.items) {\n event.items = data.items.map(createItemAPI);\n }\n\n // if this is a progress event add the progress amount\n if (/progress/.test(name)) {\n event.progress = data.progress;\n }\n\n // copy relevant props\n if (data.hasOwnProperty('origin') && data.hasOwnProperty('target')) {\n event.origin = data.origin;\n event.target = data.target;\n }\n\n return event;\n };\n\n const eventRoutes = {\n DID_DESTROY: createEvent('destroy'),\n\n DID_INIT: createEvent('init'),\n\n DID_THROW_MAX_FILES: createEvent('warning'),\n\n DID_INIT_ITEM: createEvent('initfile'),\n DID_START_ITEM_LOAD: createEvent('addfilestart'),\n DID_UPDATE_ITEM_LOAD_PROGRESS: createEvent('addfileprogress'),\n DID_LOAD_ITEM: createEvent('addfile'),\n\n DID_THROW_ITEM_INVALID: [createEvent('error'), createEvent('addfile')],\n\n DID_THROW_ITEM_LOAD_ERROR: [createEvent('error'), createEvent('addfile')],\n\n DID_THROW_ITEM_REMOVE_ERROR: [createEvent('error'), createEvent('removefile')],\n\n DID_PREPARE_OUTPUT: createEvent('preparefile'),\n\n DID_START_ITEM_PROCESSING: createEvent('processfilestart'),\n DID_UPDATE_ITEM_PROCESS_PROGRESS: createEvent('processfileprogress'),\n DID_ABORT_ITEM_PROCESSING: createEvent('processfileabort'),\n DID_COMPLETE_ITEM_PROCESSING: createEvent('processfile'),\n DID_COMPLETE_ITEM_PROCESSING_ALL: createEvent('processfiles'),\n DID_REVERT_ITEM_PROCESSING: createEvent('processfilerevert'),\n\n DID_THROW_ITEM_PROCESSING_ERROR: [createEvent('error'), createEvent('processfile')],\n\n DID_REMOVE_ITEM: createEvent('removefile'),\n\n DID_UPDATE_ITEMS: createEvent('updatefiles'),\n\n DID_ACTIVATE_ITEM: createEvent('activatefile'),\n\n DID_REORDER_ITEMS: createEvent('reorderfiles'),\n };\n\n const exposeEvent = event => {\n // create event object to be dispatched\n const detail = { pond: exports, ...event };\n delete detail.type;\n view.element.dispatchEvent(\n new CustomEvent(`FilePond:${event.type}`, {\n // event info\n detail,\n\n // event behaviour\n bubbles: true,\n cancelable: true,\n composed: true, // triggers listeners outside of shadow root\n })\n );\n\n // event object to params used for `on()` event handlers and callbacks `oninit()`\n const params = [];\n\n // if is possible error event, make it the first param\n if (event.hasOwnProperty('error')) {\n params.push(event.error);\n }\n\n // file is always section\n if (event.hasOwnProperty('file')) {\n params.push(event.file);\n }\n\n // append other props\n const filtered = ['type', 'error', 'file'];\n Object.keys(event)\n .filter(key => !filtered.includes(key))\n .forEach(key => params.push(event[key]));\n\n // on(type, () => { })\n exports.fire(event.type, ...params);\n\n // oninit = () => {}\n const handler = store.query(`GET_ON${event.type.toUpperCase()}`);\n if (handler) {\n handler(...params);\n }\n };\n\n const routeActionsToEvents = actions => {\n if (!actions.length) return;\n actions\n .filter(action => eventRoutes[action.type])\n .forEach(action => {\n const routes = eventRoutes[action.type];\n (Array.isArray(routes) ? routes : [routes]).forEach(route => {\n // this isn't fantastic, but because of the stacking of settimeouts plugins can handle the did_load before the did_init\n if (action.type === 'DID_INIT_ITEM') {\n exposeEvent(route(action.data));\n } else {\n setTimeout(() => {\n exposeEvent(route(action.data));\n }, 0);\n }\n });\n });\n };\n\n //\n // PUBLIC API -------------------------------------------------------------------------------------\n //\n const setOptions = options => store.dispatch('SET_OPTIONS', { options });\n\n const getFile = query => store.query('GET_ACTIVE_ITEM', query);\n\n const prepareFile = query =>\n new Promise((resolve, reject) => {\n store.dispatch('REQUEST_ITEM_PREPARE', {\n query,\n success: item => {\n resolve(item);\n },\n failure: error => {\n reject(error);\n },\n });\n });\n\n const addFile = (source, options = {}) =>\n new Promise((resolve, reject) => {\n addFiles([{ source, options }], { index: options.index })\n .then(items => resolve(items && items[0]))\n .catch(reject);\n });\n\n const isFilePondFile = obj => obj.file && obj.id;\n\n const removeFile = (query, options) => {\n // if only passed options\n if (typeof query === 'object' && !isFilePondFile(query) && !options) {\n options = query;\n query = undefined;\n }\n\n // request item removal\n store.dispatch('REMOVE_ITEM', { ...options, query });\n\n // see if item has been removed\n return store.query('GET_ACTIVE_ITEM', query) === null;\n };\n\n const addFiles = (...args) =>\n new Promise((resolve, reject) => {\n const sources = [];\n const options = {};\n\n // user passed a sources array\n if (isArray(args[0])) {\n sources.push.apply(sources, args[0]);\n Object.assign(options, args[1] || {});\n } else {\n // user passed sources as arguments, last one might be options object\n const lastArgument = args[args.length - 1];\n if (typeof lastArgument === 'object' && !(lastArgument instanceof Blob)) {\n Object.assign(options, args.pop());\n }\n\n // add rest to sources\n sources.push(...args);\n }\n\n store.dispatch('ADD_ITEMS', {\n items: sources,\n index: options.index,\n interactionMethod: InteractionMethod.API,\n success: resolve,\n failure: reject,\n });\n });\n\n const getFiles = () => store.query('GET_ACTIVE_ITEMS');\n\n const processFile = query =>\n new Promise((resolve, reject) => {\n store.dispatch('REQUEST_ITEM_PROCESSING', {\n query,\n success: item => {\n resolve(item);\n },\n failure: error => {\n reject(error);\n },\n });\n });\n\n const prepareFiles = (...args) => {\n const queries = Array.isArray(args[0]) ? args[0] : args;\n const items = queries.length ? queries : getFiles();\n return Promise.all(items.map(prepareFile));\n };\n\n const processFiles = (...args) => {\n const queries = Array.isArray(args[0]) ? args[0] : args;\n if (!queries.length) {\n const files = getFiles().filter(\n item =>\n !(item.status === ItemStatus.IDLE && item.origin === FileOrigin.LOCAL) &&\n item.status !== ItemStatus.PROCESSING &&\n item.status !== ItemStatus.PROCESSING_COMPLETE &&\n item.status !== ItemStatus.PROCESSING_REVERT_ERROR\n );\n return Promise.all(files.map(processFile));\n }\n return Promise.all(queries.map(processFile));\n };\n\n const removeFiles = (...args) => {\n const queries = Array.isArray(args[0]) ? args[0] : args;\n\n let options;\n if (typeof queries[queries.length - 1] === 'object') {\n options = queries.pop();\n } else if (Array.isArray(args[0])) {\n options = args[1];\n }\n\n const files = getFiles();\n\n if (!queries.length) return Promise.all(files.map(file => removeFile(file, options)));\n\n // when removing by index the indexes shift after each file removal so we need to convert indexes to ids\n const mappedQueries = queries\n .map(query => (isNumber(query) ? (files[query] ? files[query].id : null) : query))\n .filter(query => query);\n\n return mappedQueries.map(q => removeFile(q, options));\n };\n\n const exports = {\n // supports events\n ...on(),\n\n // inject private api methods\n ...readWriteApi,\n\n // inject all getters and setters\n ...createOptionAPI(store, defaultOptions),\n\n /**\n * Override options defined in options object\n * @param options\n */\n setOptions,\n\n /**\n * Load the given file\n * @param source - the source of the file (either a File, base64 data uri or url)\n * @param options - object, { index: 0 }\n */\n addFile,\n\n /**\n * Load the given files\n * @param sources - the sources of the files to load\n * @param options - object, { index: 0 }\n */\n addFiles,\n\n /**\n * Returns the file objects matching the given query\n * @param query { string, number, null }\n */\n getFile,\n\n /**\n * Upload file with given name\n * @param query { string, number, null }\n */\n processFile,\n\n /**\n * Request prepare output for file with given name\n * @param query { string, number, null }\n */\n prepareFile,\n\n /**\n * Removes a file by its name\n * @param query { string, number, null }\n */\n removeFile,\n\n /**\n * Moves a file to a new location in the files list\n */\n moveFile: (query, index) => store.dispatch('MOVE_ITEM', { query, index }),\n\n /**\n * Returns all files (wrapped in public api)\n */\n getFiles,\n\n /**\n * Starts uploading all files\n */\n processFiles,\n\n /**\n * Clears all files from the files list\n */\n removeFiles,\n\n /**\n * Starts preparing output of all files\n */\n prepareFiles,\n\n /**\n * Sort list of files\n */\n sort: compare => store.dispatch('SORT', { compare }),\n\n /**\n * Browse the file system for a file\n */\n browse: () => {\n // needs to be trigger directly as user action needs to be traceable (is not traceable in requestAnimationFrame)\n var input = view.element.querySelector('input[type=file]');\n if (input) {\n input.click();\n }\n },\n\n /**\n * Destroys the app\n */\n destroy: () => {\n // request destruction\n exports.fire('destroy', view.element);\n\n // stop active processes (file uploads, fetches, stuff like that)\n // loop over items and depending on states call abort for ongoing processes\n store.dispatch('ABORT_ALL');\n\n // destroy view\n view._destroy();\n\n // stop listening to resize\n window.removeEventListener('resize', resizeHandler);\n\n // stop listening to the visiblitychange event\n document.removeEventListener('visibilitychange', visibilityHandler);\n\n // dispatch destroy\n store.dispatch('DID_DESTROY');\n },\n\n /**\n * Inserts the plugin before the target element\n */\n insertBefore: element => insertBefore(view.element, element),\n\n /**\n * Inserts the plugin after the target element\n */\n insertAfter: element => insertAfter(view.element, element),\n\n /**\n * Appends the plugin to the target element\n */\n appendTo: element => element.appendChild(view.element),\n\n /**\n * Replaces an element with the app\n */\n replaceElement: element => {\n // insert the app before the element\n insertBefore(view.element, element);\n\n // remove the original element\n element.parentNode.removeChild(element);\n\n // remember original element\n originalElement = element;\n },\n\n /**\n * Restores the original element\n */\n restoreElement: () => {\n if (!originalElement) {\n return; // no element to restore\n }\n\n // restore original element\n insertAfter(originalElement, view.element);\n\n // remove our element\n view.element.parentNode.removeChild(view.element);\n\n // remove reference\n originalElement = null;\n },\n\n /**\n * Returns true if the app root is attached to given element\n * @param element\n */\n isAttachedTo: element => view.element === element || originalElement === element,\n\n /**\n * Returns the root element\n */\n element: {\n get: () => view.element,\n },\n\n /**\n * Returns the current pond status\n */\n status: {\n get: () => store.query('GET_STATUS'),\n },\n };\n\n // Done!\n store.dispatch('DID_INIT');\n\n // create actual api object\n return createObject(exports);\n};\n\nconst createAppObject = (customOptions = {}) => {\n // default options\n const defaultOptions = {};\n forin(getOptions(), (key, value) => {\n defaultOptions[key] = value[0];\n });\n\n // set app options\n const app = createApp({\n // default options\n ...defaultOptions,\n\n // custom options\n ...customOptions,\n });\n\n // return the plugin instance\n return app;\n};\n\nconst lowerCaseFirstLetter = string => string.charAt(0).toLowerCase() + string.slice(1);\n\nconst attributeNameToPropertyName = attributeName => toCamels(attributeName.replace(/^data-/, ''));\n\nconst mapObject = (object, propertyMap) => {\n // remove unwanted\n forin(propertyMap, (selector, mapping) => {\n forin(object, (property, value) => {\n // create regexp shortcut\n const selectorRegExp = new RegExp(selector);\n\n // tests if\n const matches = selectorRegExp.test(property);\n\n // no match, skip\n if (!matches) {\n return;\n }\n\n // if there's a mapping, the original property is always removed\n delete object[property];\n\n // should only remove, we done!\n if (mapping === false) {\n return;\n }\n\n // move value to new property\n if (isString(mapping)) {\n object[mapping] = value;\n return;\n }\n\n // move to group\n const group = mapping.group;\n if (isObject(mapping) && !object[group]) {\n object[group] = {};\n }\n\n object[group][lowerCaseFirstLetter(property.replace(selectorRegExp, ''))] = value;\n });\n\n // do submapping\n if (mapping.mapping) {\n mapObject(object[mapping.group], mapping.mapping);\n }\n });\n};\n\nconst getAttributesAsObject = (node, attributeMapping = {}) => {\n // turn attributes into object\n const attributes = [];\n forin(node.attributes, index => {\n attributes.push(node.attributes[index]);\n });\n\n const output = attributes\n .filter(attribute => attribute.name)\n .reduce((obj, attribute) => {\n const value = attr(node, attribute.name);\n\n obj[attributeNameToPropertyName(attribute.name)] =\n value === attribute.name ? true : value;\n return obj;\n }, {});\n\n // do mapping of object properties\n mapObject(output, attributeMapping);\n\n return output;\n};\n\nconst createAppAtElement = (element, options = {}) => {\n // how attributes of the input element are mapped to the options for the plugin\n const attributeMapping = {\n // translate to other name\n '^class$': 'className',\n '^multiple$': 'allowMultiple',\n '^capture$': 'captureMethod',\n '^webkitdirectory$': 'allowDirectoriesOnly',\n\n // group under single property\n '^server': {\n group: 'server',\n mapping: {\n '^process': {\n group: 'process',\n },\n '^revert': {\n group: 'revert',\n },\n '^fetch': {\n group: 'fetch',\n },\n '^restore': {\n group: 'restore',\n },\n '^load': {\n group: 'load',\n },\n },\n },\n\n // don't include in object\n '^type$': false,\n '^files$': false,\n };\n\n // add additional option translators\n applyFilters('SET_ATTRIBUTE_TO_OPTION_MAP', attributeMapping);\n\n // create final options object by setting options object and then overriding options supplied on element\n const mergedOptions = {\n ...options,\n };\n\n const attributeOptions = getAttributesAsObject(\n element.nodeName === 'FIELDSET' ? element.querySelector('input[type=file]') : element,\n attributeMapping\n );\n\n // merge with options object\n Object.keys(attributeOptions).forEach(key => {\n if (isObject(attributeOptions[key])) {\n if (!isObject(mergedOptions[key])) {\n mergedOptions[key] = {};\n }\n Object.assign(mergedOptions[key], attributeOptions[key]);\n } else {\n mergedOptions[key] = attributeOptions[key];\n }\n });\n\n // if parent is a fieldset, get files from parent by selecting all input fields that are not file upload fields\n // these will then be automatically set to the initial files\n mergedOptions.files = (options.files || []).concat(\n Array.from(element.querySelectorAll('input:not([type=file])')).map(input => ({\n source: input.value,\n options: {\n type: input.dataset.type,\n },\n }))\n );\n\n // build plugin\n const app = createAppObject(mergedOptions);\n\n // add already selected files\n if (element.files) {\n Array.from(element.files).forEach(file => {\n app.addFile(file);\n });\n }\n\n // replace the target element\n app.replaceElement(element);\n\n // expose\n return app;\n};\n\n// if an element is passed, we create the instance at that element, if not, we just create an up object\nconst createApp$1 = (...args) =>\n isNode(args[0]) ? createAppAtElement(...args) : createAppObject(...args);\n\nconst PRIVATE_METHODS = ['fire', '_read', '_write'];\n\nconst createAppAPI = app => {\n const api = {};\n\n copyObjectPropertiesToObject(app, api, PRIVATE_METHODS);\n\n return api;\n};\n\n/**\n * Replaces placeholders in given string with replacements\n * @param string - \"Foo {bar}\"\"\n * @param replacements - { \"bar\": 10 }\n */\nconst replaceInString = (string, replacements) =>\n string.replace(/(?:{([a-zA-Z]+)})/g, (match, group) => replacements[group]);\n\nconst createWorker = fn => {\n const workerBlob = new Blob(['(', fn.toString(), ')()'], {\n type: 'application/javascript',\n });\n const workerURL = URL.createObjectURL(workerBlob);\n const worker = new Worker(workerURL);\n\n return {\n transfer: (message, cb) => {},\n post: (message, cb, transferList) => {\n const id = getUniqueId();\n\n worker.onmessage = e => {\n if (e.data.id === id) {\n cb(e.data.message);\n }\n };\n\n worker.postMessage(\n {\n id,\n message,\n },\n transferList\n );\n },\n terminate: () => {\n worker.terminate();\n URL.revokeObjectURL(workerURL);\n },\n };\n};\n\nconst loadImage = url =>\n new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve(img);\n };\n img.onerror = e => {\n reject(e);\n };\n img.src = url;\n });\n\nconst renameFile = (file, name) => {\n const renamedFile = file.slice(0, file.size, file.type);\n renamedFile.lastModifiedDate = file.lastModifiedDate;\n renamedFile.name = name;\n return renamedFile;\n};\n\nconst copyFile = file => renameFile(file, file.name);\n\n// already registered plugins (can't register twice)\nconst registeredPlugins = [];\n\n// pass utils to plugin\nconst createAppPlugin = plugin => {\n // already registered\n if (registeredPlugins.includes(plugin)) {\n return;\n }\n\n // remember this plugin\n registeredPlugins.push(plugin);\n\n // setup!\n const pluginOutline = plugin({\n addFilter,\n utils: {\n Type,\n forin,\n isString,\n isFile,\n toNaturalFileSize,\n replaceInString,\n getExtensionFromFilename,\n getFilenameWithoutExtension,\n guesstimateMimeType,\n getFileFromBlob,\n getFilenameFromURL,\n createRoute,\n createWorker,\n createView,\n createItemAPI,\n loadImage,\n copyFile,\n renameFile,\n createBlob,\n applyFilterChain,\n text,\n getNumericAspectRatioFromString,\n },\n views: {\n fileActionButton,\n },\n });\n\n // add plugin options to default options\n extendDefaultOptions(pluginOutline.options);\n};\n\n// feature detection used by supported() method\nconst isOperaMini = () => Object.prototype.toString.call(window.operamini) === '[object OperaMini]';\nconst hasPromises = () => 'Promise' in window;\nconst hasBlobSlice = () => 'slice' in Blob.prototype;\nconst hasCreateObjectURL = () => 'URL' in window && 'createObjectURL' in window.URL;\nconst hasVisibility = () => 'visibilityState' in document;\nconst hasTiming = () => 'performance' in window; // iOS 8.x\nconst hasCSSSupports = () => 'supports' in (window.CSS || {}); // use to detect Safari 9+\nconst isIE11 = () => /MSIE|Trident/.test(window.navigator.userAgent);\n\nconst supported = (() => {\n // Runs immediately and then remembers result for subsequent calls\n const isSupported =\n // Has to be a browser\n isBrowser() &&\n // Can't run on Opera Mini due to lack of everything\n !isOperaMini() &&\n // Require these APIs to feature detect a modern browser\n hasVisibility() &&\n hasPromises() &&\n hasBlobSlice() &&\n hasCreateObjectURL() &&\n hasTiming() &&\n // doesn't need CSSSupports but is a good way to detect Safari 9+ (we do want to support IE11 though)\n (hasCSSSupports() || isIE11());\n\n return () => isSupported;\n})();\n\n/**\n * Plugin internal state (over all instances)\n */\nconst state = {\n // active app instances, used to redraw the apps and to find the later\n apps: [],\n};\n\n// plugin name\nconst name = 'filepond';\n\n/**\n * Public Plugin methods\n */\nconst fn = () => {};\nlet Status$1 = {};\nlet FileStatus = {};\nlet FileOrigin$1 = {};\nlet OptionTypes = {};\nlet create$f = fn;\nlet destroy = fn;\nlet parse = fn;\nlet find = fn;\nlet registerPlugin = fn;\nlet getOptions$1 = fn;\nlet setOptions$1 = fn;\n\n// if not supported, no API\nif (supported()) {\n // start painter and fire load event\n createPainter(\n () => {\n state.apps.forEach(app => app._read());\n },\n ts => {\n state.apps.forEach(app => app._write(ts));\n }\n );\n\n // fire loaded event so we know when FilePond is available\n const dispatch = () => {\n // let others know we have area ready\n document.dispatchEvent(\n new CustomEvent('FilePond:loaded', {\n detail: {\n supported,\n create: create$f,\n destroy,\n parse,\n find,\n registerPlugin,\n setOptions: setOptions$1,\n },\n })\n );\n\n // clean up event\n document.removeEventListener('DOMContentLoaded', dispatch);\n };\n\n if (document.readyState !== 'loading') {\n // move to back of execution queue, FilePond should have been exported by then\n setTimeout(() => dispatch(), 0);\n } else {\n document.addEventListener('DOMContentLoaded', dispatch);\n }\n\n // updates the OptionTypes object based on the current options\n const updateOptionTypes = () =>\n forin(getOptions(), (key, value) => {\n OptionTypes[key] = value[1];\n });\n\n Status$1 = { ...Status };\n FileOrigin$1 = { ...FileOrigin };\n FileStatus = { ...ItemStatus };\n\n OptionTypes = {};\n updateOptionTypes();\n\n // create method, creates apps and adds them to the app array\n create$f = (...args) => {\n const app = createApp$1(...args);\n app.on('destroy', destroy);\n state.apps.push(app);\n return createAppAPI(app);\n };\n\n // destroys apps and removes them from the app array\n destroy = hook => {\n // returns true if the app was destroyed successfully\n const indexToRemove = state.apps.findIndex(app => app.isAttachedTo(hook));\n if (indexToRemove >= 0) {\n // remove from apps\n const app = state.apps.splice(indexToRemove, 1)[0];\n\n // restore original dom element\n app.restoreElement();\n\n return true;\n }\n\n return false;\n };\n\n // parses the given context for plugins (does not include the context element itself)\n parse = context => {\n // get all possible hooks\n const matchedHooks = Array.from(context.querySelectorAll(`.${name}`));\n\n // filter out already active hooks\n const newHooks = matchedHooks.filter(\n newHook => !state.apps.find(app => app.isAttachedTo(newHook))\n );\n\n // create new instance for each hook\n return newHooks.map(hook => create$f(hook));\n };\n\n // returns an app based on the given element hook\n find = hook => {\n const app = state.apps.find(app => app.isAttachedTo(hook));\n if (!app) {\n return null;\n }\n return createAppAPI(app);\n };\n\n // adds a plugin extension\n registerPlugin = (...plugins) => {\n // register plugins\n plugins.forEach(createAppPlugin);\n\n // update OptionTypes, each plugin might have extended the default options\n updateOptionTypes();\n };\n\n getOptions$1 = () => {\n const opts = {};\n forin(getOptions(), (key, value) => {\n opts[key] = value[0];\n });\n return opts;\n };\n\n setOptions$1 = opts => {\n if (isObject(opts)) {\n // update existing plugins\n state.apps.forEach(app => {\n app.setOptions(opts);\n });\n\n // override defaults\n setOptions(opts);\n }\n\n // return new options\n return getOptions$1();\n };\n}\n\nexport {\n FileOrigin$1 as FileOrigin,\n FileStatus,\n OptionTypes,\n Status$1 as Status,\n create$f as create,\n destroy,\n find,\n getOptions$1 as getOptions,\n parse,\n registerPlugin,\n setOptions$1 as setOptions,\n supported,\n};\n","/*!\n * FilePondPluginFileValidateType 1.2.9\n * Licensed under MIT, https://opensource.org/licenses/MIT/\n * Please visit https://pqina.nl/filepond/ for details.\n */\n\n/* eslint-disable */\n\nconst plugin = ({ addFilter, utils }) => {\n // get quick reference to Type utils\n const {\n Type,\n isString,\n replaceInString,\n guesstimateMimeType,\n getExtensionFromFilename,\n getFilenameFromURL,\n } = utils;\n\n const mimeTypeMatchesWildCard = (mimeType, wildcard) => {\n const mimeTypeGroup = (/^[^/]+/.exec(mimeType) || []).pop(); // image/png -> image\n const wildcardGroup = wildcard.slice(0, -2); // image/* -> image\n return mimeTypeGroup === wildcardGroup;\n };\n\n const isValidMimeType = (acceptedTypes, userInputType) =>\n acceptedTypes.some(acceptedType => {\n // accepted is wildcard mime type\n if (/\\*$/.test(acceptedType)) {\n return mimeTypeMatchesWildCard(userInputType, acceptedType);\n }\n\n // is normal mime type\n return acceptedType === userInputType;\n });\n\n const getItemType = item => {\n // if the item is a url we guess the mime type by the extension\n let type = '';\n if (isString(item)) {\n const filename = getFilenameFromURL(item);\n const extension = getExtensionFromFilename(filename);\n if (extension) {\n type = guesstimateMimeType(extension);\n }\n } else {\n type = item.type;\n }\n\n return type;\n };\n\n const validateFile = (item, acceptedFileTypes, typeDetector) => {\n // no types defined, everything is allowed \\o/\n if (acceptedFileTypes.length === 0) {\n return true;\n }\n\n // gets the item type\n const type = getItemType(item);\n\n // no type detector, test now\n if (!typeDetector) {\n return isValidMimeType(acceptedFileTypes, type);\n }\n\n // use type detector\n return new Promise((resolve, reject) => {\n typeDetector(item, type)\n .then(detectedType => {\n if (isValidMimeType(acceptedFileTypes, detectedType)) {\n resolve();\n } else {\n reject();\n }\n })\n .catch(reject);\n });\n };\n\n const applyMimeTypeMap = map => acceptedFileType =>\n map[acceptedFileType] === null ? false : map[acceptedFileType] || acceptedFileType;\n\n // setup attribute mapping for accept\n addFilter('SET_ATTRIBUTE_TO_OPTION_MAP', map =>\n Object.assign(map, {\n accept: 'acceptedFileTypes',\n })\n );\n\n // filtering if an item is allowed in hopper\n addFilter('ALLOW_HOPPER_ITEM', (file, { query }) => {\n // if we are not doing file type validation exit\n if (!query('GET_ALLOW_FILE_TYPE_VALIDATION')) {\n return true;\n }\n\n // we validate the file against the accepted file types\n return validateFile(file, query('GET_ACCEPTED_FILE_TYPES'));\n });\n\n // called for each file that is loaded\n // right before it is set to the item state\n // should return a promise\n addFilter(\n 'LOAD_FILE',\n (file, { query }) =>\n new Promise((resolve, reject) => {\n if (!query('GET_ALLOW_FILE_TYPE_VALIDATION')) {\n resolve(file);\n return;\n }\n\n const acceptedFileTypes = query('GET_ACCEPTED_FILE_TYPES');\n\n // custom type detector method\n const typeDetector = query('GET_FILE_VALIDATE_TYPE_DETECT_TYPE');\n\n // if invalid, exit here\n const validationResult = validateFile(file, acceptedFileTypes, typeDetector);\n\n const handleRejection = () => {\n const acceptedFileTypesMapped = acceptedFileTypes\n .map(\n applyMimeTypeMap(\n query('GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES_MAP')\n )\n )\n .filter(label => label !== false);\n\n const acceptedFileTypesMappedUnique = acceptedFileTypesMapped.filter(\n (item, index) => acceptedFileTypesMapped.indexOf(item) === index\n );\n\n reject({\n status: {\n main: query('GET_LABEL_FILE_TYPE_NOT_ALLOWED'),\n sub: replaceInString(\n query('GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES'),\n {\n allTypes: acceptedFileTypesMappedUnique.join(', '),\n allButLastType: acceptedFileTypesMappedUnique\n .slice(0, -1)\n .join(', '),\n lastType:\n acceptedFileTypesMappedUnique[\n acceptedFileTypesMappedUnique.length - 1\n ],\n }\n ),\n },\n });\n };\n\n // has returned new filename immidiately\n if (typeof validationResult === 'boolean') {\n if (!validationResult) {\n return handleRejection();\n }\n return resolve(file);\n }\n\n // is promise\n validationResult\n .then(() => {\n resolve(file);\n })\n .catch(handleRejection);\n })\n );\n\n // expose plugin\n return {\n // default options\n options: {\n // Enable or disable file type validation\n allowFileTypeValidation: [true, Type.BOOLEAN],\n\n // What file types to accept\n acceptedFileTypes: [[], Type.ARRAY],\n // - must be comma separated\n // - mime types: image/png, image/jpeg, image/gif\n // - extensions: .png, .jpg, .jpeg ( not enabled yet )\n // - wildcards: image/*\n\n // label to show when a type is not allowed\n labelFileTypeNotAllowed: ['File is of invalid type', Type.STRING],\n\n // nicer label\n fileValidateTypeLabelExpectedTypes: [\n 'Expects {allButLastType} or {lastType}',\n Type.STRING,\n ],\n\n // map mime types to extensions\n fileValidateTypeLabelExpectedTypesMap: [{}, Type.OBJECT],\n\n // Custom function to detect type of file\n fileValidateTypeDetectType: [null, Type.FUNCTION],\n },\n };\n};\n\n// fire pluginloaded event if running in browser, this allows registering the plugin when using async script tags\nconst isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\nif (isBrowser) {\n document.dispatchEvent(new CustomEvent('FilePond:pluginloaded', { detail: plugin }));\n}\n\nexport default plugin;\n","/*!\n * FilePondPluginFileValidateSize 2.2.8\n * Licensed under MIT, https://opensource.org/licenses/MIT/\n * Please visit https://pqina.nl/filepond/ for details.\n */\n\n/* eslint-disable */\n\nconst plugin = ({ addFilter, utils }) => {\n // get quick reference to Type utils\n const { Type, replaceInString, toNaturalFileSize } = utils;\n\n // filtering if an item is allowed in hopper\n addFilter('ALLOW_HOPPER_ITEM', (file, { query }) => {\n if (!query('GET_ALLOW_FILE_SIZE_VALIDATION')) {\n return true;\n }\n\n const sizeMax = query('GET_MAX_FILE_SIZE');\n if (sizeMax !== null && file.size > sizeMax) {\n return false;\n }\n\n const sizeMin = query('GET_MIN_FILE_SIZE');\n if (sizeMin !== null && file.size < sizeMin) {\n return false;\n }\n\n return true;\n });\n\n // called for each file that is loaded\n // right before it is set to the item state\n // should return a promise\n addFilter(\n 'LOAD_FILE',\n (file, { query }) =>\n new Promise((resolve, reject) => {\n // if not allowed, all fine, exit\n if (!query('GET_ALLOW_FILE_SIZE_VALIDATION')) {\n return resolve(file);\n }\n\n // check if file should be filtered\n const fileFilter = query('GET_FILE_VALIDATE_SIZE_FILTER');\n if (fileFilter && !fileFilter(file)) {\n return resolve(file);\n }\n\n // reject or resolve based on file size\n const sizeMax = query('GET_MAX_FILE_SIZE');\n if (sizeMax !== null && file.size > sizeMax) {\n reject({\n status: {\n main: query('GET_LABEL_MAX_FILE_SIZE_EXCEEDED'),\n sub: replaceInString(query('GET_LABEL_MAX_FILE_SIZE'), {\n filesize: toNaturalFileSize(\n sizeMax,\n '.',\n query('GET_FILE_SIZE_BASE'),\n query('GET_FILE_SIZE_LABELS', query)\n ),\n }),\n },\n });\n return;\n }\n\n // reject or resolve based on file size\n const sizeMin = query('GET_MIN_FILE_SIZE');\n if (sizeMin !== null && file.size < sizeMin) {\n reject({\n status: {\n main: query('GET_LABEL_MIN_FILE_SIZE_EXCEEDED'),\n sub: replaceInString(query('GET_LABEL_MIN_FILE_SIZE'), {\n filesize: toNaturalFileSize(\n sizeMin,\n '.',\n query('GET_FILE_SIZE_BASE'),\n query('GET_FILE_SIZE_LABELS', query)\n ),\n }),\n },\n });\n return;\n }\n\n // returns the current option value\n const totalSizeMax = query('GET_MAX_TOTAL_FILE_SIZE');\n if (totalSizeMax !== null) {\n // get the current total file size\n const currentTotalSize = query('GET_ACTIVE_ITEMS').reduce((total, item) => {\n return total + item.fileSize;\n }, 0);\n\n // get the size of the new file\n if (currentTotalSize > totalSizeMax) {\n reject({\n status: {\n main: query('GET_LABEL_MAX_TOTAL_FILE_SIZE_EXCEEDED'),\n sub: replaceInString(query('GET_LABEL_MAX_TOTAL_FILE_SIZE'), {\n filesize: toNaturalFileSize(\n totalSizeMax,\n '.',\n query('GET_FILE_SIZE_BASE'),\n query('GET_FILE_SIZE_LABELS', query)\n ),\n }),\n },\n });\n return;\n }\n }\n\n // file is fine, let's pass it back\n resolve(file);\n })\n );\n\n return {\n options: {\n // Enable or disable file type validation\n allowFileSizeValidation: [true, Type.BOOLEAN],\n\n // Max individual file size in bytes\n maxFileSize: [null, Type.INT],\n\n // Min individual file size in bytes\n minFileSize: [null, Type.INT],\n\n // Max total file size in bytes\n maxTotalFileSize: [null, Type.INT],\n\n // Filter the files that need to be validated for size\n fileValidateSizeFilter: [null, Type.FUNCTION],\n\n // error labels\n labelMinFileSizeExceeded: ['File is too small', Type.STRING],\n labelMinFileSize: ['Minimum file size is {filesize}', Type.STRING],\n\n labelMaxFileSizeExceeded: ['File is too large', Type.STRING],\n labelMaxFileSize: ['Maximum file size is {filesize}', Type.STRING],\n\n labelMaxTotalFileSizeExceeded: ['Maximum total size exceeded', Type.STRING],\n labelMaxTotalFileSize: ['Maximum total file size is {filesize}', Type.STRING],\n },\n };\n};\n\n// fire pluginloaded event if running in browser, this allows registering the plugin when using async script tags\nconst isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\nif (isBrowser) {\n document.dispatchEvent(new CustomEvent('FilePond:pluginloaded', { detail: plugin }));\n}\n\nexport default plugin;\n","import './bootstrap';\r\n\r\nimport * as jSuites from 'jsuites';\r\nwindow.jSuites = jSuites;\r\n\r\nimport * as FilePond from 'filepond';\r\nwindow.FilePond = FilePond;\r\n\r\nimport FilePondPluginFileValidateType from 'filepond-plugin-file-validate-type';\r\nFilePond.registerPlugin(FilePondPluginFileValidateType);\r\n\r\nimport FilePondPluginFileValidateSize from 'filepond-plugin-file-validate-size';\r\nFilePond.registerPlugin(FilePondPluginFileValidateSize);\r\n"],"names":["global","factory","module","this","jSuites","__webpack_modules__","str","int64","msint_32","lsint_32","H","K","W","a","b","c","d","e","f","g","h","i","j","T1","T2","charsize","utf8_encode","str2binb","bin","mask","len","binb2hex","binarray","hex_tab","length","srcByte","safe_add_2","x","y","lsw","msw","lowOrder","highOrder","safe_add_4","safe_add_5","maj","z","ch","rotr","n","sigma0","rotr28","rotr34","rotr39","sigma1","rotr14","rotr18","rotr41","gamma0","rotr1","rotr8","shr7","shr","gamma1","rotr19","rotr61","shr6","strlen","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","getter","exports","definition","key","obj","prop","__webpack_exports__","jsuites","setDictionary","k","translate","t","dictionary","tracking","component","state","v","index","Helpers","value","el","range","sel","node","num","r","hash","chr","lum","hex","rgb","w","evt","element","condition","foundElement","path","helpers","Path","val","remove","o","Sorting","options","defaults","dragElement","property","target","position","getElement","sorting","id","data","LazyLoading","timeControlLoading","scrollControls","event","scrollTop","Ajax","Component","complete","multiple","parseData","vars","keys","httpRequest","result","err","url","__callback","http","group","ajax","Animation","timeout","direction","done","animation","HelpersDate","date","dateOnly","m","s","time","excelInitialTime","excelLeapYearBug","millisecondsPerDay","jsDate","jsDateInMilliseconds","excelSerialNumber","weekdays","months","helpers_date","Mask","tokens","getDate","extractDate","isBlank","isFormula","isNumeric","getDecimal","ParseValue","decimal","signal","FormatValue","Format","Value","Caret","Extract","current","adjustNumeric","pos","p","updateCaret","weekDaysFull","weekDays","monthsFull","parser","count","ret","test","two","neg","separator","negative","getTokens","getMethod","types","type","getMethods","getType","numeric","parse","toPlainString","config","returnObject","newValue","caret","label","t0","t1","fullMask","strict","fillWithBlanks","exp","fraction","maskZeros","maskLength","format","splitStr","day","calendar","get","Calendar","reset","calendarReset","calendarConfirm","calendarControlsUpdateButton","calendarSelectHour","calendarSelectMin","calendarContent","rect","rectContent","calendarContainer","ignoreEvents","update","oldValue","test1","test2","elements","updateActions","year","month","hour","min","calendarLabelYear","calendarLabelMonth","isCurrentMonthAndYear","currentDay","numberOfDays","firstDay","calendarBody","row","cell","calendarControlsTime","currentYear","currentMonth","selectedYear","selectedMonth","table","mixed","mouseUpControls","action","keyUpControls","calendarTable","calendarControls","calendarControlsUpdate","init","calendarTableContainer","calendarHeaderPrev","calendarHeaderTitle","calendarHeaderNext","calendarHeader","calendarHeaderRow","calendarControlsFooter","calendarBackdrop","texts","d1","d2","total","text","Palette","palette","Tabs","prev","next","border","setBorder","updateControls","previous","x1","x2","r1","r2","title","div","tmp","cb","openTab","newContent","contentItem","activeIndex","header","controls","add","headerItem","iconContainer","icon","item","loadingRemoteData","Color","container","backdrop","content","resetButton","closeButton","tabs","jsuitesTabs","color","selected","availableWidth","availableHeight","HexToRgb","rgbInputs","rgbInput","slidersResult","decToHex","rgbToHex","hexToDec","tableContainer","tr","td","canvas","context","resizeCanvas","gradient","hsl","point","buttons","left","top","pixel","changeInputColors","currentColor","newGradient","sliders","slidersElement","slidersBody","createSliderInput","name","inputContainer","subContainer","input","slidersResultColor","resultElement","updateResult","resultColor","instance","Contextmenu","items","itemHeader","createHeader","itemContainer","createItemElement","itemText","itemIconSubmenu","el_submenu","submenu","itemContainerSubMenu","itemShortCut","contextmenu","Dropdown","success","sortData","applyValue","itemA","itemB","testA","testB","resetValue","values","Text","getValue","getText","containerHeader","keyTimer","callback","newItem","groupName","image","groups","counter","groupNames","groupArrow","groupContent","asArray","change","force","exists","results","synonym","number","cursor","rectContainer","setPosition","newIndex","letter","l","fistItem","lastItem","dropdown","select","Picker","dropdownHeader","dropdownContent","isDOM","createContent","dropdownItem","rectHeader","Toolbar","toolbarArrow","toolbarFloating","toolbarContent","toolbarItem","toolbarIcon","toolbarBadge","toolbarBadgeContent","toolbarTitle","available","Editor","editorTimer","editorAction","files","snippet","toolbar","extractImageFromHtml","html","img","updateTotalImages","appendImage","json","processExtensions","ctx","blob","newImage","src","asSnippet","extension","reader","editorMouseUp","editorMouseDown","editorMouseMove","editorKeyUp","editorKeyDown","editorDragStart","editorDragEnter","editorDragOver","editorDrop","editorPaste","editorBlur","editorFocus","validTags","validProperty","validStyle","style","elementStyle","attr","filter","file","parent","close","newHeight","method","ext","loadExtensions","toolbarOptions","first","size","ex","ey","tbody","editor","Floating","setContent","temp","setEvents","setType","floating","prevFloating","Validations","numberCriterias","dateCriterias","textCriterias","pattern","dataType","list","getCurrentDateWithoutTime","relativeDates","validations","Form","message","addError","error","delError","validation","res","ignoreFlag","confirmationMessage","plugins_form","Modal","Events","tracker","keyDown","modals","mouseUp","mouseDown","mouseMove","mouseButton","modal","Notification","notification","notificationContainer","notificationHeader","notificationImage","notificationIcon","notificationName","notificationClose","notificationDate","notificationContent","notificationTitle","notificationMessage","notificationTimeout","Progressbar","bar","Rating","Search","createList","execute","timer","terms","Slider","caption","nextImage","offsetX","Tags","limit","search","searchContainer","focus","createElement","setFocus","extractTags","tagsMouseUp","tagsKeyDown","tagsKeyUp","tagsPaste","tagsFocus","tagsBlur","isEmpty","word","anchorOffset","Upload","readFile","mime","sha512","sha512_default","jsuites_jSuites","find","DOMElement","isOpened","cornerSize","tooltip","isWebcomponent","editable","angle","calculateAngle","y1","y2","x3","y3","dx1","dy1","dx2","dy2","angle1","angleDifference","dx","dy","ox","oy","width","height","currentElement","blur","mouseOver","contextMenu","isNode","createStore","initialState","queries","actions","actionQueue","dispatchQueue","getState","processActionQueue","queue","processDispatchQueue","dispatch","isBlocking","actionHandlers","query","args","queryHandles","api","defineProperty","forin","createObject","ns","svgElements","isSVGElement","tag","className","attributes","appendChild","child","appendChildView","childViews","view","removeChildView","IS_BROWSER","isBrowser","testElement","getChildCount","getViewRect","elementRect","offset","scale","right","bottom","childView","childViewRect","expandRect","calculateRectSize","isNumber","thereYet","destination","velocity","errorMargin","spring","stiffness","damping","mass","resting","ts","skipToEndState","easeInOutQuad","tween","duration","easing","delay","start","reverse","animator","createAnimator","category","def","props","addGetSet","overwrite","setter","animations","mixinConfig","viewProps","viewInternalAPI","viewExternalAPI","initialProps","addEvent","fn","removeEvent","listeners","viewState","events","apis","isDefined","styles","currentProps","getOffset","getScale","getRect","propsHaveChanged","applyStyles","newProps","opacity","perspective","translateX","translateY","scaleX","scaleY","rotateX","rotateY","rotateZ","originX","originY","transforms","elementCurrentStyle","Mixins","updateRect","createView","read","write","create","destroy","filterFrameActionsForChild","didCreateView","didWriteView","ignoreRect","ignoreRectUpdate","mixins","store","frameRect","isResting","activeMixins","ref","writers","readers","destroyers","getChildViews","getReference","createChildView","getStyle","_read","internalAPI","_write","frameActions","shouldOptimize","writer","mixin","_destroy","destroyer","sharedAPIDefinition","internalAPIDefinition","needle","externalAPIDefinition","mixinAPIDefinition","mixinAPI","childCount","createPainter","fps","painter","interval","last","requestTick","cancelTick","setTimerType","tick","delta","createRoute","routes","root","timestamp","insertBefore","newNode","referenceNode","insertAfter","isArray","trim","toString","toArray","splitter","isBoolean","toBoolean","isString","toNumber","toInt","toFloat","isInt","toBytes","base","naturalFileSize","isFunction","toFunctionReference","string","levels","level","methods","createServerAPI","outline","createAction","headers","parts","toServerAPI","isNull","isObject","isAPI","replaceSingleQuotes","conversionTable","convertTo","getValueByType","defaultValue","valueType","newValueType","convertedValue","createOption","currentValue","createOptions","optionDefinition","createInitialState","fromCamels","part","createOptionAPI","createOptionActions","createOptionQueries","InteractionMethod","getUniqueId","arrayRemove","arr","run","sync","on","off","listener","fire","copyObjectPropertiesToObject","excluded","PRIVATE","createItemAPI","removeReleasedItems","ItemStatus","FileOrigin","getNonNumeric","getDecimalSeparator","getThousandsSeparator","decimalSeparator","thousandsStringWithSeparator","thousandsStringWithoutSeparator","Type","filters","applyFilterChain","utils","resolve","reject","matchingFilters","initialFilter","applyFilters","addFilter","extendDefaultOptions","additionalOptions","defaultOptions","getOptions","setOptions","opts","getItemByQuery","getNumericAspectRatioFromString","aspectRatio","getActiveItems","Status","canUpdateFileInput","dataTransfer","ITEM_ERROR","ITEM_BUSY","ITEM_READY","isItemInErrorState","isItemInBusyState","isItemInReadyState","isAsync","EMPTY","ERROR","BUSY","IDLE","READY","option","status","hasRoomForItem","maxFileCount","max","arrayInsert","insertItem","isBase64DataURI","getFilenameFromURL","getExtensionFromFilename","guesstimateExtension","subtype","leftPad","padding","getDateString","getFileFromBlob","filename","getBlobBuilder","createBlob","arrayBuffer","mimeType","BB","bb","getBlobFromByteStringWithMimeType","byteString","ab","ia","getMimeTypeFromBase64DataURI","dataURI","getBase64DataFromBase64DataURI","getByteStringFromBase64DataURI","getBlobFromBase64DataURI","getFileFromBase64DataURI","getFileNameFromHeader","matches","getFileSizeFromHeader","getTranfserIdFromHeader","getFileInfoFromHeaders","info","rows","source","createFileLoader","fetchFn","getProgress","abort","load","loadURL","response","computable","fileinfo","isGet","sendRequest","aborted","xhr","headersReceived","process","createResponse","code","body","createTimeoutResponse","hasQS","buildURL","createFetchFunction","apiUrl","onload","onerror","progress","request","ChunkStatus","processFileChunked","metadata","transfer","chunks","chunkTransferId","chunkServer","chunkSize","chunkRetryDelays","ondata","fd","requestTransferId","formData","requestParams","requestTransferOffset","requestUrl","lastChunkIndex","completeProcessingChunks","canProcessChunk","chunk","processChunk","processChunks","lengthComputable","loaded","updateTotalProgress","retryProcessChunk","totalBytesTransfered","totalSize","abortChunks","serverId","createFileProcessorFunction","canChunkUpload","shouldChunkUpload","willChunkUpload","createProcessorFunction","params","createRevertFunction","uniqueFileId","getRandomNumber","createPerceivedPerformanceUpdater","tickMin","tickMax","runtime","createFileProcessor","processFn","allowMinimumUploadDuration","progressFn","completeFn","transferId","getDuration","getFilenameWithoutExtension","createFileStub","isFile","deepCloneObject","createItem","origin","serverFileReference","abortProcessingRequestComplete","setStatus","getFileExtension","getFileType","getFileSize","getFile","loader","meta","retryLoad","abortLoad","processor","onprocess","requestProcessing","abortProcessing","revert","revertFileUpload","forceRevert","serverTransferId","setMetadata","silent","handler","itemAPI","getItemIndexByQuery","getItemById","itemId","fetchBlob","getDomainFromURL","isExternalURL","dynamicLabel","isMockItem","listUpdated","optionalPromise","sortItems","compare","getItemByQueryFromState","itemHandler","failure","activeItems","shouldPrepareOutput","beforePrepareFile","upload","doUpload","currentIndex","interactionMethod","insertLocation","totalItems","ignoredFiles","isValidFile","promises","itemInsertLocation","mainStatus","handleAdd","shouldAdd","loadComplete","restore","fetch","processNow","maxParallelUploads","processNext","queueEntry","itemReference","server","noop","shouldRemove","removeFromView","handleRevert","shouldRevert","requestRemoveResult","optionKeys","prioritizedOptionKeys","PrioritizedOptions","formatFilename","createElement$1","tagName","textNode","polarToCartesian","centerX","centerY","radius","angleInDegrees","angleInRadians","describeArc","startAngle","endAngle","arcSweep","end","percentageArc","from","to","svg","ringStrokeWidth","ringFrom","ringTo","coordinates","progressIndicator","create$1","write$1","isDisabled","shouldDisable","fileActionButton","toNaturalFileSize","bytes","labelBytes","labelKilobytes","labelMegabytes","labelGigabytes","KB","MB","GB","removeDecimalsWhenZero","decimalCount","create$2","fileName","fileSize","updateFile","updateFileSizeOnError","fileInfo","toPercentage","create$3","main","sub","didSetItemLoadProgress","didSetItemProcessProgress","didRequestItemProcessing","didAbortItemProcessing","didCompleteItemProcessing","clear","fileStatus","Buttons","ButtonKeys","calculateFileInfoOffset","getRemoveIndicatorAligment","buttonRect","calculateButtonWidth","calculateFileVerticalCenterOffset","calculateFileHorizontalCenterOffset","getLoadIndicatorAlignment","getProcessIndicatorAlignment","DefaultStyle","IdleStyle","ProcessingStyle","StyleMap","processingCompleteIndicatorView","create$4","LocalButtons","curr","allowRevert","allowRemove","allowProcess","instantUpload","alignRemoveItemButton","buttonFilter","enabledButtons","map","buttonView","loadIndicatorView","progressIndicatorView","write$2","route","stylesToApply","defaultStyles","control","create$5","didLoadItem","fileWrapper","PANEL_SPRING_PROPS","create$6","section","createSection","viewConstructor","write$3","topRect","bottomRect","panel","createDragHelper","itemIds","prevIndex","ITEM_TRANSLATE_SPRING","ITEM_SCALE_SPRING","StateMap","create$7","grab","removedActivateListener","dragState","drag","drop","cancel","route$1","write$4","getItemsPerRow","horizontalSpace","itemWidth","getItemIndexByPosition","children","positionInView","itemRect","itemHorizontalMargin","itemsPerRow","childMid","itemVerticalMargin","itemHeight","indexX","indexY","offsetY","itemTop","itemRight","itemBottom","dropAreaDimensions","create$8","addItemView","now","spawnDate","cooldown","dist","moveItem","vx","vy","introItemView","removeItemView","getItemHeight","getItemWidth","dragItem","numItems","oldIndex","dragPosition","dragHeight","dragWidth","cols","location","visibleChildren","idx","childHeight","childBottom","childTop","route$2","write$5","dragCoordinates","dragIndex","addIndex","dragIndexOffset","removeIndexOffset","addIndexOffset","childRect","dragOffset","visualHeight","prevX","prevY","visualIndex","vectorX","vectorY","filterSetItemActions","create$9","storeDragCoordinates","clearDragCoordinates","route$3","write$6","listScroller","attrToggle","enabledValue","resetFileInput","form","parentNode","create$a","setAcceptedFileTypes","toggleAllowMultiple","toggleDirectoryFilter","toggleDisabled","toggleRequired","setCaptureMethod","doesAllowBrowse","disableField","updateRequiredStatus","updateFieldValidityStatus","browser","Key","create$b","updateLabelValue","clickable","dropLabel","addBlob","moveBlob","hideBlob","explodeBlob","write$7","route$4","drip","setInputFiles","create$c","legend","getField","syncFieldPositionsWithItems","didReorderItems","didAddItem","shouldUseFileInput","dataContainer","didLoadItem$1","field","fileItem","didPrepareOutput","didSetDisabled","didRemoveItem","didDefineValue","write$8","getRootNode","images","text$1","guesstimateMimeType","requestDataTransferItems","links","getLinks","hasFiles","getFiles","promisedFiles","isFileSystemItem","getFilesFromItem","returnedFileGroups","isEntry","entry","getAsEntry","isDirectoryEntry","getFilesInDirectory","dirCounter","fileCounter","resolveIfDone","readEntries","dirEntry","directoryReader","readBatch","entries","correctedFile","correctMissingFileType","getLinksFromTransferMetaData","getLinksFromTransferURLData","dragNDropObservers","eventPosition","createDragNDropClient","scopeToObserve","filterElement","observer","getDragNDropObserver","client","newObserver","createDragNDropObserver","clients","dragenter","dragover","dragleave","handlers","createHandler","elementFromPoint","isEventTarget","elementAtPosition","initialTarget","setDropEffect","effect","onenter","overDropTarget","onexit","ondrag","allowdrop","allowsTransfer","ondrop","createHopper","scope","validateItems","catchesDropsOnPage","requiresDropOnElement","filterItems","lastState","currentState","filteredItems","listening","listeners$1","handlePaste","activeEl","inScope","listen","unlisten","createPaster","create$d","addFilesNotificationTimeout","notificationClearTimeout","filenames","assist","clear$1","listModified","isUsingFilePond","itemAdded","itemRemoved","itemProcessed","itemProcessedUndo","itemError","assistant","toCamels","debounce","func","immidiateOnly","MAX_FILES_LIMIT","prevent","create$e","canHover","hasPointerEvents","credits","frag","write$9","route$5","bounds","calculateRootBoundingBoxHeight","hopper","isMultiItem","maxItems","atMaxCapacity","addAction","listItemMargin","calculateListItemMargin","listHeight","calculateListHeight","labelHeight","currentLabelHeight","listMarginTop","listMarginBottom","boundsHeight","history","MAX_BOUNCES","bounces","listAvailableHeight","isCappedHeight","panelHeight","itemMargin","visual","scrollList","itemList","removedItem","verticalItemCount","exceedsMaxFiles","allowReplace","allowMultiple","totalBrowseItems","getDragIndex","toggleDrop","isAllowed","enabled","beforeDropFile","toggleBrowse","togglePaste","createApp","initialOptions","originalElement","visibilityHandler","resizeDoneTimer","isResizing","isResizingHorizontally","initialWindowWidth","currentWindowWidth","resizeHandler","isHidden","readWriteApi","routeActionsToEvents","createEvent","eventRoutes","exposeEvent","detail","filtered","prepareFile","addFile","addFiles","isFilePondFile","removeFile","sources","lastArgument","processFile","prepareFiles","processFiles","removeFiles","q","createAppObject","customOptions","lowerCaseFirstLetter","attributeNameToPropertyName","attributeName","mapObject","object","propertyMap","selector","mapping","selectorRegExp","getAttributesAsObject","attributeMapping","output","attribute","createAppAtElement","mergedOptions","attributeOptions","app","createApp$1","PRIVATE_METHODS","createAppAPI","replaceInString","replacements","match","createWorker","workerBlob","workerURL","worker","transferList","loadImage","renameFile","renamedFile","copyFile","registeredPlugins","createAppPlugin","plugin","pluginOutline","isOperaMini","hasPromises","hasBlobSlice","hasCreateObjectURL","hasVisibility","hasTiming","hasCSSSupports","isIE11","supported","isSupported","Status$1","FileStatus","FileOrigin$1","OptionTypes","create$f","registerPlugin","getOptions$1","setOptions$1","updateOptionTypes","hook","indexToRemove","newHook","plugins","mimeTypeMatchesWildCard","wildcard","mimeTypeGroup","wildcardGroup","isValidMimeType","acceptedTypes","userInputType","acceptedType","getItemType","validateFile","acceptedFileTypes","typeDetector","detectedType","applyMimeTypeMap","acceptedFileType","validationResult","handleRejection","acceptedFileTypesMapped","acceptedFileTypesMappedUnique","sizeMax","sizeMin","fileFilter","totalSizeMax","FilePond","FilePond.registerPlugin","FilePondPluginFileValidateType","FilePondPluginFileValidateSize"],"mappings":"klBACE,SAAUA,EAAQC,EAAS,CACsCC,EAAiB,QAAAD,EAAO,CAG1F,GAACE,GAAO,UAAY,CAErB,IAAIC,EACK,OAAC,UAAW,CACX,IAAIC,EAAuB,CAE/B,IACC,SAASH,EAAQ,EAYtB,SAAUF,EAAQC,EAAS,CACjBC,EAAO,QAAUD,EAAO,CAEnC,GAAC,KAAO,UAAY,CAEjB,OAAQ,SAASK,GAAK,CAClB,SAASC,EAAMC,GAAUC,GAAU,CAC/B,KAAK,UAAYD,GACjB,KAAK,SAAWC,EACnB,CAED,IAAIC,EAAI,CAAC,IAAIH,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACxE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,SAAU,EACnE,IAAIA,EAAM,UAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,SAAU,CAAC,EAEpEI,EAAI,CAAC,IAAIJ,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,SAAU,EACxE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,UAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,UAAY,UAAU,EACnE,IAAIA,EAAM,UAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,SAAU,EACnE,IAAIA,EAAM,WAAY,SAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,SAAU,EACnE,IAAIA,EAAM,UAAY,UAAU,EAAG,IAAIA,EAAM,UAAY,UAAU,EACnE,IAAIA,EAAM,UAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,SAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,UAAY,UAAU,EAAG,IAAIA,EAAM,UAAY,SAAU,EACnE,IAAIA,EAAM,UAAY,UAAU,EAAG,IAAIA,EAAM,UAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,SAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,SAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,UAAY,SAAU,EACnE,IAAIA,EAAM,UAAY,UAAU,EAAG,IAAIA,EAAM,UAAY,UAAU,EACnE,IAAIA,EAAM,UAAY,UAAU,EAAG,IAAIA,EAAM,UAAY,UAAU,EACnE,IAAIA,EAAM,UAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,SAAU,EACnE,IAAIA,EAAM,WAAY,SAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,SAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,UAAY,UAAU,EAAG,IAAIA,EAAM,UAAY,UAAU,EACnE,IAAIA,EAAM,UAAY,UAAU,EAAG,IAAIA,EAAM,UAAY,SAAU,EACnE,IAAIA,EAAM,UAAY,SAAU,EAAG,IAAIA,EAAM,UAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,SAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,UAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,EACnE,IAAIA,EAAM,WAAY,SAAU,EAAG,IAAIA,EAAM,WAAY,UAAU,CAAC,EAEpEK,EAAI,IAAI,MAAM,EAAE,EAChBC,EAAGC,EAAGC,EAAGC,GAAGC,GAAGC,GAAGC,GAAGC,GAAGC,GAAGC,EAC3BC,GAAIC,GACJC,GAAW,EAEf,SAASC,GAAYpB,GAAK,CACtB,OAAO,SAAS,mBAAmBA,EAAG,CAAC,CAC1C,CAED,SAASqB,GAASrB,GAAK,CAKnB,QAJIsB,GAAM,CAAA,EACNC,IAAQ,GAAKJ,IAAY,EACzBK,GAAMxB,GAAI,OAASmB,GAEdJ,GAAI,EAAGA,GAAIS,GAAKT,IAAKI,GAC1BG,GAAIP,IAAK,KAAOf,GAAI,WAAWe,GAAII,EAAQ,EAAII,KAAU,GAAKJ,GAAYJ,GAAI,GAGlF,OAAOO,EACV,CAED,SAASG,GAASC,GAAU,CAMxB,QALIC,GAAU,mBACV3B,GAAM,GACN4B,GAASF,GAAS,OAAS,EAC3BG,GAEKd,GAAI,EAAGA,GAAIa,GAAQb,IAAK,EAC7Bc,GAAUH,GAASX,IAAK,KAAQ,EAAKA,GAAI,GAAM,EAC/Cf,IAAO2B,GAAQ,OAAQE,IAAW,EAAK,EAAG,EAAIF,GAAQ,OAAOE,GAAU,EAAG,EAG9E,OAAO7B,EACV,CAED,SAAS8B,GAAWC,GAAGC,GAAG,CACtB,IAAIC,GAAKC,GAAKC,GAAUC,GAExB,OAAAH,IAAOF,GAAE,SAAW,QAAWC,GAAE,SAAW,OAC5CE,IAAOH,GAAE,WAAa,KAAOC,GAAE,WAAa,KAAOC,KAAQ,IAC3DE,IAAaD,GAAM,QAAW,GAAOD,GAAM,MAE3CA,IAAOF,GAAE,UAAY,QAAWC,GAAE,UAAY,QAAWE,KAAQ,IACjEA,IAAOH,GAAE,YAAc,KAAOC,GAAE,YAAc,KAAOC,KAAQ,IAC7DG,IAAcF,GAAM,QAAW,GAAOD,GAAM,MAErC,IAAIhC,EAAMmC,GAAWD,EAAQ,CACvC,CAED,SAASE,GAAW9B,GAAGC,GAAGC,GAAGC,GAAG,CAC5B,IAAIuB,GAAKC,GAAKC,GAAUC,GAExB,OAAAH,IAAO1B,GAAE,SAAW,QAAWC,GAAE,SAAW,QAAWC,GAAE,SAAW,QAAWC,GAAE,SAAW,OAC5FwB,IAAO3B,GAAE,WAAa,KAAOC,GAAE,WAAa,KAAOC,GAAE,WAAa,KAAOC,GAAE,WAAa,KAAOuB,KAAQ,IACvGE,IAAaD,GAAM,QAAW,GAAOD,GAAM,MAE3CA,IAAO1B,GAAE,UAAY,QAAWC,GAAE,UAAY,QAAWC,GAAE,UAAY,QAAWC,GAAE,UAAY,QAAWwB,KAAQ,IACnHA,IAAO3B,GAAE,YAAc,KAAOC,GAAE,YAAc,KAAOC,GAAE,YAAc,KAAOC,GAAE,YAAc,KAAOuB,KAAQ,IAC3GG,IAAcF,GAAM,QAAW,GAAOD,GAAM,MAErC,IAAIhC,EAAMmC,GAAWD,EAAQ,CACvC,CAED,SAASG,GAAW/B,GAAGC,GAAGC,GAAGC,GAAGC,GAAG,CAC/B,IAAIsB,GAAKC,GAAKC,GAAUC,GAExB,OAAAH,IAAO1B,GAAE,SAAW,QAAWC,GAAE,SAAW,QAAWC,GAAE,SAAW,QAAWC,GAAE,SAAW,QAAWC,GAAE,SAAW,OACpHuB,IAAO3B,GAAE,WAAa,KAAOC,GAAE,WAAa,KAAOC,GAAE,WAAa,KAAOC,GAAE,WAAa,KAAOC,GAAE,WAAa,KAAOsB,KAAQ,IAC7HE,IAAaD,GAAM,QAAW,GAAOD,GAAM,MAE3CA,IAAO1B,GAAE,UAAY,QAAWC,GAAE,UAAY,QAAWC,GAAE,UAAY,QAAWC,GAAE,UAAY,QAAWC,GAAE,UAAY,QAAWuB,KAAQ,IAC5IA,IAAO3B,GAAE,YAAc,KAAOC,GAAE,YAAc,KAAOC,GAAE,YAAc,KAAOC,GAAE,YAAc,KAAOC,GAAE,YAAc,KAAOsB,KAAQ,IAClIG,IAAcF,GAAM,QAAW,GAAOD,GAAM,MAErC,IAAIhC,EAAMmC,GAAWD,EAAQ,CACvC,CAED,SAASI,EAAIR,GAAGC,GAAGQ,GAAG,CAClB,OAAO,IAAIvC,EACN8B,GAAE,UAAYC,GAAE,UAAcD,GAAE,UAAYS,GAAE,UAAcR,GAAE,UAAYQ,GAAE,UAC5ET,GAAE,SAAWC,GAAE,SAAaD,GAAE,SAAWS,GAAE,SAAaR,GAAE,SAAWQ,GAAE,QACxF,CACS,CAED,SAASC,GAAGV,GAAGC,GAAGQ,GAAG,CACjB,OAAO,IAAIvC,EACN8B,GAAE,UAAYC,GAAE,UAAc,CAACD,GAAE,UAAYS,GAAE,UAC/CT,GAAE,SAAWC,GAAE,SAAa,CAACD,GAAE,SAAWS,GAAE,QAC7D,CACS,CAED,SAASE,GAAKX,GAAGY,GAAG,CAChB,OAAIA,IAAK,GACE,IAAI1C,EACN8B,GAAE,YAAcY,GAAMZ,GAAE,UAAa,GAAKY,GAC1CZ,GAAE,WAAaY,GAAMZ,GAAE,WAAc,GAAKY,EAC/D,EAEuB,IAAI1C,EACN8B,GAAE,WAAaY,GAAMZ,GAAE,WAAc,GAAKY,GAC1CZ,GAAE,YAAcY,GAAMZ,GAAE,UAAa,GAAKY,EAC/D,CAES,CAED,SAASC,GAAOb,GAAG,CACf,IAAIc,GAASH,GAAKX,GAAG,EAAE,EACnBe,GAASJ,GAAKX,GAAG,EAAE,EACnBgB,GAASL,GAAKX,GAAG,EAAE,EAEvB,OAAO,IAAI9B,EACP4C,GAAO,UAAYC,GAAO,UAAYC,GAAO,UAC7CF,GAAO,SAAWC,GAAO,SAAWC,GAAO,QAC3D,CACS,CAED,SAASC,GAAOjB,GAAG,CACf,IAAIkB,GAASP,GAAKX,GAAG,EAAE,EACnBmB,GAASR,GAAKX,GAAG,EAAE,EACnBoB,GAAST,GAAKX,GAAG,EAAE,EAEvB,OAAO,IAAI9B,EACPgD,GAAO,UAAYC,GAAO,UAAYC,GAAO,UAC7CF,GAAO,SAAWC,GAAO,SAAWC,GAAO,QAC3D,CACS,CAED,SAASC,GAAOrB,GAAG,CACf,IAAIsB,GAAQX,GAAKX,GAAG,CAAC,EAAGuB,GAAQZ,GAAKX,GAAG,CAAC,EAAGwB,GAAOC,GAAIzB,GAAG,CAAC,EAE3D,OAAO,IAAI9B,EACPoD,GAAM,UAAYC,GAAM,UAAYC,GAAK,UACzCF,GAAM,SAAWC,GAAM,SAAWC,GAAK,QACvD,CACS,CAED,SAASE,GAAO1B,GAAG,CACf,IAAI2B,GAAShB,GAAKX,GAAG,EAAE,EACnB4B,GAASjB,GAAKX,GAAG,EAAE,EACnB6B,GAAOJ,GAAIzB,GAAG,CAAC,EAEnB,OAAO,IAAI9B,EACPyD,GAAO,UAAYC,GAAO,UAAYC,GAAK,UAC3CF,GAAO,SAAWC,GAAO,SAAWC,GAAK,QACzD,CACS,CAED,SAASJ,GAAIzB,GAAGY,GAAG,CACf,OAAIA,IAAK,GACE,IAAI1C,EACP8B,GAAE,YAAcY,GAChBZ,GAAE,WAAaY,GAAKZ,GAAE,WAAc,GAAKY,EAC7D,EAEuB,IAAI1C,EACP,EACA8B,GAAE,WAAc,GAAKY,EACzC,CAES,CAED,IAAI3C,GAAMoB,GAAYpB,EAAG,EACrB6D,GAAS7D,GAAI,OAAOmB,GACxBnB,GAAMqB,GAASrB,EAAG,EAElBA,GAAI6D,IAAU,IAAM,KAAS,GAAKA,GAAS,GAC3C7D,IAAO6D,GAAS,KAAQ,IAAO,GAAK,IAAMA,GAE1C,QAAS9C,GAAI,EAAGA,GAAIf,GAAI,OAAQe,IAAK,GAAI,CACrCR,EAAIH,EAAE,GACNI,EAAIJ,EAAE,GACNK,EAAIL,EAAE,GACNM,GAAIN,EAAE,GACNO,GAAIP,EAAE,GACNQ,GAAIR,EAAE,GACNS,GAAIT,EAAE,GACNU,GAAIV,EAAE,GAEN,QAASY,EAAI,EAAGA,EAAI,GAAIA,IAChBA,EAAI,GACJV,EAAEU,GAAK,IAAIf,EAAMD,GAAIgB,EAAE,EAAID,IAAIf,GAAIgB,EAAE,EAAID,GAAI,EAAE,EAE/CT,EAAEU,GAAKqB,GAAWoB,GAAOnD,EAAEU,EAAI,EAAE,EAAGV,EAAEU,EAAI,GAAIoC,GAAO9C,EAAEU,EAAI,GAAG,EAAGV,EAAEU,EAAI,GAAG,EAG9EC,GAAKqB,GAAWxB,GAAGkC,GAAOrC,EAAC,EAAG8B,GAAG9B,GAAGC,GAAGC,EAAC,EAAGR,EAAEW,GAAIV,EAAEU,EAAE,EACrDE,GAAKY,GAAWc,GAAOrC,CAAC,EAAGgC,EAAIhC,EAAGC,EAAGC,CAAC,CAAC,EACvCK,GAAID,GACJA,GAAID,GACJA,GAAID,GACJA,GAAImB,GAAWpB,GAAGO,EAAE,EACpBP,GAAID,EACJA,EAAID,EACJA,EAAID,EACJA,EAAIuB,GAAWb,GAAIC,EAAE,EAGzBd,EAAE,GAAK0B,GAAWvB,EAAGH,EAAE,EAAE,EACzBA,EAAE,GAAK0B,GAAWtB,EAAGJ,EAAE,EAAE,EACzBA,EAAE,GAAK0B,GAAWrB,EAAGL,EAAE,EAAE,EACzBA,EAAE,GAAK0B,GAAWpB,GAAGN,EAAE,EAAE,EACzBA,EAAE,GAAK0B,GAAWnB,GAAGP,EAAE,EAAE,EACzBA,EAAE,GAAK0B,GAAWlB,GAAGR,EAAE,EAAE,EACzBA,EAAE,GAAK0B,GAAWjB,GAAGT,EAAE,EAAE,EACzBA,EAAE,GAAK0B,GAAWhB,GAAGV,EAAE,EAAE,CAC5B,CAGD,QADIsB,GAAW,CAAA,EACNX,GAAI,EAAGA,GAAIX,EAAE,OAAQW,KAC1BW,GAAS,KAAKtB,EAAEW,IAAG,SAAS,EAC5BW,GAAS,KAAKtB,EAAEW,IAAG,QAAQ,EAG/B,OAAOU,GAASC,EAAQ,CAChC,CAEA,EAGA,CAEA,EAGcoC,EAA2B,CAAA,EAG/B,SAASC,EAAoBC,EAAU,CAEtC,IAAIC,EAAeH,EAAyBE,GAC5C,GAAIC,IAAiB,OACpB,OAAOA,EAAa,QAGrB,IAAIrE,EAASkE,EAAyBE,GAAY,CAGjD,QAAS,CAAE,CACvB,EAGW,OAAAjE,EAAoBiE,GAAU,KAAKpE,EAAO,QAASA,EAAQA,EAAO,QAASmE,CAAmB,EAGvFnE,EAAO,OACd,EAIA,UAAW,CAEXmE,EAAoB,EAAI,SAASnE,EAAQ,CACxC,IAAIsE,EAAStE,GAAUA,EAAO,WAC7B,UAAW,CAAE,OAAOA,EAAO,OAAa,EACxC,UAAW,CAAE,OAAOA,GACrB,OAAAmE,EAAoB,EAAEG,EAAQ,CAAE,EAAGA,CAAQ,CAAA,EACpCA,CACnB,CACA,KAGW,UAAW,CAEXH,EAAoB,EAAI,SAASI,EAASC,EAAY,CACrD,QAAQC,KAAOD,EACXL,EAAoB,EAAEK,EAAYC,CAAG,GAAK,CAACN,EAAoB,EAAEI,EAASE,CAAG,GAC/E,OAAO,eAAeF,EAASE,EAAK,CAAE,WAAY,GAAM,IAAKD,EAAWC,EAAM,CAAA,CAG5F,CACA,IAGW,UAAW,CACXN,EAAoB,EAAI,SAASO,EAAKC,EAAM,CAAE,OAAO,OAAO,UAAU,eAAe,KAAKD,EAAKC,CAAI,CAAI,CAClH,IAGA,IAAIC,EAAsB,CAAA,GAEzB,UAAW,CAIZT,EAAoB,EAAES,EAAqB,CACzC,QAAW,UAAW,CAAE,OAAqBC,EAAU,CACzD,CAAC,EAID,IAAIC,EAAgB,SAAShE,EAAG,CACtB,SAAS,aACX,SAAS,WAAa,CAAE,GAI5B,IAAIK,EAAI,KACJ4D,EAAI,OAAO,KAAKjE,CAAC,EACrB,IAAKK,EAAI,EAAGA,EAAI4D,EAAE,OAAQ5D,IACtB,SAAS,WAAW4D,EAAE5D,IAAML,EAAEiE,EAAE5D,GAEvC,EAGG6D,EAAY,SAASC,EAAG,CACxB,OAAI,OAAO,SAAc,KAAe,SAAS,YACtC,SAAS,WAAWA,IAAMA,CAIxC,EAGgCC,EAAc,CAAE,cAAAJ,EAAe,UAAAE,CAAW,EAqB1CG,EAnBf,SAASC,EAAWC,EAAO,CACzC,GAAIA,IAAU,GACV,OAAO,oBAAyB,OAAO,oBAAuB,OAAO,SAASC,EAAG,CAC7E,OAAOA,IAAM,IACzB,CAAS,EAGD,WAAW,UAAW,CAClB,OAAO,oBAAuB,KAAKF,CAAS,CAC/C,EAAE,CAAC,MAED,CACH,IAAIG,EAAQ,OAAO,oBAAuB,QAAQH,CAAS,EACvDG,GAAS,GACT,OAAO,oBAAuB,OAAOA,EAAO,CAAC,CAEpD,CACJ,EAIGC,EAAU,CAAA,EAGdA,EAAQ,IAAM,SAASC,EAAO,CAC1B,OAAAA,EAAQ,GAAKA,EACTA,EAAM,QAAU,IAChBA,EAAQ,IAAMA,GAEXA,CACV,EAEDD,EAAQ,MAAQ,SAASE,EAAI,CACzB,GAAIA,EAAG,UAAU,OAAQ,CACrB,IAAIC,EAAQ,SAAS,cACjBC,EAAM,OAAO,eACbC,EAAOH,EAAG,WAAWA,EAAG,WAAW,OAAO,GAC9CC,EAAM,SAASE,EAAMA,EAAK,MAAM,EAChCF,EAAM,SAAS,EAAI,EACnBC,EAAI,gBAAiB,EACrBA,EAAI,SAASD,CAAK,EAClBD,EAAG,WAAaA,EAAG,WACtB,CACJ,EAEDF,EAAQ,UAAa,SAAUM,EAAK,CAChC,OAAI,OAAOA,GAAS,WAChBA,EAAMA,EAAI,QAEP,CAAC,MAAMA,CAAG,GAAKA,IAAQ,MAAQA,IAAQ,EAClD,EAEAN,EAAQ,KAAO,UAAW,CACtB,MAAO,uCAAuC,QAAQ,QAAS,SAAS3E,EAAG,CACvE,IAAIkF,EAAI,KAAK,OAAM,EAAK,GAAK,EAAGT,EAAIzE,GAAK,IAAMkF,EAAKA,EAAI,EAAM,EAC9D,OAAOT,EAAE,SAAS,EAAE,CAC5B,CAAK,CACJ,EAEDE,EAAQ,QAAU,UAAW,CACzB,IAAIK,EAAO,SAAS,aAAY,EAAG,WACnC,OAAIA,EACQA,EAAK,UAAY,EAAIA,EAAK,WAAaA,EAExC,IAEd,EAIDL,EAAQ,KAAO,SAASpF,EAAK,CACzB,IAAI4F,EAAO,EAAG7E,EAAG8E,EAEjB,GAAI7F,EAAI,SAAW,EACf,OAAO4F,EAEP,IAAK7E,EAAI,EAAGA,EAAIf,EAAI,OAAQe,IACxB8E,EAAM7F,EAAI,WAAWe,CAAC,EAClB8E,EAAM,KACND,GAASA,GAAQ,GAAKA,EAAQC,EAC9BD,GAAQ,GAIpB,OAAOA,CACV,EAKDR,EAAQ,YAAc,SAAStE,EAAG,CAC9B,IAAIgF,EAAM,KACNC,EAAM,OAAO,IAAM,KAAK,OAAQ,EAAC,SAAS,EAAE,EAAE,MAAM,EAAG,CAAC,EAAE,YAAW,CAAE,EAAE,QAAQ,cAAe,EAAE,EAClGA,EAAI,OAAS,IACbA,EAAMA,EAAI,GAAKA,EAAI,GAAKA,EAAI,GAAKA,EAAI,GAAKA,EAAI,GAAKA,EAAI,IAE3D,IAAIC,EAAM,CAAA,EAAIvF,EAAGM,EACjB,IAAKA,EAAI,EAAGA,EAAI,EAAGA,IACfN,EAAI,SAASsF,EAAI,OAAOhF,EAAI,EAAG,CAAC,EAAG,EAAE,EACrCN,EAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,EAAGA,EAAKA,EAAIqF,CAAI,EAAG,GAAG,CAAC,EAAE,SAAS,EAAE,EACrEE,EAAI,MAAM,KAAOvF,GAAG,OAAOA,EAAE,MAAM,CAAC,EAIxC,OAAIK,GAAK,GACE,IAAMsE,EAAQ,IAAIY,EAAI,GAAG,SAAS,EAAE,CAAC,EAAIZ,EAAQ,IAAIY,EAAI,GAAG,SAAS,EAAE,CAAC,EAAIZ,EAAQ,IAAIY,EAAI,GAAG,SAAS,EAAE,CAAC,EAG/GA,CACV,EAEDZ,EAAQ,eAAiB,UAAW,CAChC,IAAIa,EAAI,OACRvF,EAAI,SACJC,EAAID,EAAE,gBACNG,EAAIH,EAAE,qBAAqB,MAAM,EAAE,GACnCqB,EAAIkE,EAAE,YAActF,EAAE,aAAeE,EAAE,YACvC,OAAOkB,CACV,EAEDqD,EAAQ,gBAAkB,UAAW,CACjC,IAAIa,EAAI,OACRvF,EAAI,SACJC,EAAID,EAAE,gBACNG,EAAIH,EAAE,qBAAqB,MAAM,EAAE,GACnCsB,EAAIiE,EAAE,aAActF,EAAE,cAAeE,EAAE,aACvC,OAAQmB,CACX,EAEDoD,EAAQ,YAAc,SAASzE,EAAG,CAC9B,GAAIA,EAAE,gBAAkBA,EAAE,eAAe,GACrC,IAAIoB,EAAIpB,EAAE,eAAe,GAAG,MACxBqB,EAAIrB,EAAE,eAAe,GAAG,UAE5B,KAAIoB,EAAK,OAAO,MAASpB,EAAE,MAAQA,EAAE,SAAW,SAAS,gBAAgB,WAAa,SAAS,gBAAgB,WAAa,SAAS,KAAK,YACtIqB,EAAK,OAAO,MAASrB,EAAE,MAAQA,EAAE,SAAW,SAAS,gBAAgB,UAAY,SAAS,gBAAgB,UAAY,SAAS,KAAK,WAG5I,MAAO,CAAEoB,EAAGC,EACf,EAEDoD,EAAQ,MAAQ,SAASE,EAAI,CACzB,GAAIA,EAAG,MACHA,EAAG,MAAK,MACL,CACH,IAAIY,EAAM,IAAI,WAAW,QAAS,CAC9B,QAAS,GACT,WAAY,GACZ,KAAM,MAClB,CAAS,EACDZ,EAAG,cAAcY,CAAG,CACvB,CACJ,EAEDd,EAAQ,YAAc,SAASe,EAASC,EAAW,CAC/C,IAAIC,EAAe,GAEnB,SAASC,EAAMH,EAAS,CAChBA,GAAW,CAAEE,IACT,OAAOD,GAAc,WACrBC,EAAeD,EAAUD,CAAO,EACzB,OAAOC,GAAc,UACxBD,EAAQ,WAAaA,EAAQ,UAAU,SAASC,CAAS,IACzDC,EAAeF,IAKvBA,EAAQ,YAAc,CAAEE,GACxBC,EAAKH,EAAQ,UAAU,CAE9B,CAED,OAAAG,EAAKH,CAAO,EAELE,CACV,EAE4B,IAAIE,EAAWnB,EAE5C,SAASoB,EAAKxG,EAAKyG,EAAKC,EAAQ,CAE5B,GADA1G,EAAMA,EAAI,MAAM,GAAG,EACfA,EAAI,OAAQ,CACZ,IAAI2G,EAAI,KACJ,EAAI,KACR,KAAO3G,EAAI,OAAS,GAIhB,GAFA,EAAIA,EAAI,QAEJ2G,EAAE,eAAe,CAAC,EAClBA,EAAIA,EAAE,OACH,CAEH,GAAI,OAAOF,EAAS,IAChB,OAGAE,EAAE,GAAK,GAEPA,EAAIA,EAAE,EAEb,CAKL,GAFA,EAAI3G,EAAI,QAEJ,OAAOyG,EAAS,IAChB,OAAIC,IAAW,GACX,OAAOC,EAAE,GAETA,EAAE,GAAKF,EAGJ,GAGP,GAAIE,EACA,OAAOA,EAAE,EAGpB,CAED,MAAO,EACV,CAED,SAASC,EAAQtB,EAAIuB,EAAS,CAC1B,IAAIvC,EAAM,CAAA,EACVA,EAAI,QAAU,GAEd,IAAIwC,EAAW,CACX,QAAS,KACT,UAAW,KACX,YAAa,KACb,UAAW,KACX,OAAQ,IACX,EAEGC,EAAc,KAGlB,QAASC,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,GAEhC1C,EAAI,QAAQ0C,GAAYF,EAASE,GAIzC1B,EAAG,UAAU,IAAI,UAAU,EAE3BA,EAAG,iBAAiB,YAAa,SAAS3E,EAAG,CACzC,IAAIsG,EAAStG,EAAE,OACf,GAAIsG,EAAO,WAAa,EACpB,GAAIA,EAAO,WAAW,aAAa,WAAW,IAAM,OAChDA,EAASA,EAAO,eACb,CACHtG,EAAE,eAAc,EAChBA,EAAE,gBAAe,EACjB,MACH,CAGL,GAAIsG,EAAO,aAAa,WAAW,IAAM,OAAQ,CAC7C,IAAIC,EAAW,MAAM,UAAU,QAAQ,KAAKD,EAAO,WAAW,SAAUA,CAAM,EAC9EF,EAAc,CACV,QAASE,EACT,EAAGC,EACH,EAAGA,CACN,EACDD,EAAO,MAAM,QAAU,OAEnB,OAAQ3C,EAAI,QAAQ,aAAgB,YACpCA,EAAI,QAAQ,YAAYgB,EAAI2B,EAAQtG,CAAC,EAGzCA,EAAE,aAAa,aAAasG,EAAO,EAAE,CAAC,CACzC,CACT,CAAK,EAED3B,EAAG,iBAAiB,WAAY,SAAS3E,EAAG,CAGxC,GAFAA,EAAE,eAAc,EAEZoG,GACII,EAAWxG,EAAE,MAAM,GACfA,EAAE,OAAO,aAAa,WAAW,GAAK,QAAUoG,EAAY,SAAWpG,EAAE,OAAQ,CACjF,GAAK2D,EAAI,QAAQ,UAGb,IAAI8B,EAAYzF,EAAE,OAAO,YAAc,EAAIA,EAAE,YAF7C,KAAIyF,EAAYzF,EAAE,OAAO,aAAe,EAAIA,EAAE,QAK9CyF,EACAzF,EAAE,OAAO,WAAW,aAAaoG,EAAY,QAASpG,EAAE,MAAM,EAE9DA,EAAE,OAAO,WAAW,aAAaoG,EAAY,QAASpG,EAAE,OAAO,WAAW,EAG9EoG,EAAY,EAAI,MAAM,UAAU,QAAQ,KAAKpG,EAAE,OAAO,WAAW,SAAUoG,EAAY,OAAO,CACjG,CAGjB,CAAK,EAEDzB,EAAG,iBAAiB,YAAa,SAAS3E,EAAG,CACzCA,EAAE,eAAc,CACxB,CAAK,EAED2E,EAAG,iBAAiB,UAAW,SAAS3E,EAAG,CACvCA,EAAE,eAAc,EAEZoG,IACI,OAAOzC,EAAI,QAAQ,WAAc,YACjCA,EAAI,QAAQ,UAAUgB,EAAIyB,EAAY,QAASpG,CAAC,EAIhDoG,EAAY,EAAIA,EAAY,EAC5BpG,EAAE,OAAO,WAAW,aAAaoG,EAAY,QAASpG,EAAE,OAAO,WAAW,SAASoG,EAAY,EAAE,EAEjGpG,EAAE,OAAO,WAAW,aAAaoG,EAAY,QAASpG,EAAE,OAAO,WAAW,SAASoG,EAAY,GAAG,WAAW,EAGjHA,EAAY,QAAQ,MAAM,QAAU,GACpCA,EAAc,KAE1B,CAAK,EAEDzB,EAAG,iBAAiB,OAAQ,SAAS3E,EAAG,CACpCA,EAAE,eAAc,EAEZoG,IACIA,EAAY,IAAMA,EAAY,GAC1B,OAAQzC,EAAI,QAAQ,QAAW,YAC/BA,EAAI,QAAQ,OAAOgB,EAAIyB,EAAY,EAAGA,EAAY,EAAGA,EAAY,QAASpG,EAAE,OAAQA,CAAC,EAI7FoG,EAAY,QAAQ,MAAM,QAAU,GACpCA,EAAc,KAE1B,CAAK,EAsBD,QApBII,EAAa,SAAShB,EAAS,CAC/B,IAAIiB,EAAU,GAEd,SAASd,EAAMH,EAAS,CAChBA,EAAQ,WACJA,EAAQ,UAAU,SAAS,UAAU,IACrCiB,EAAU,IAIZA,GACFd,EAAKH,EAAQ,UAAU,CAE9B,CAED,OAAAG,EAAKH,CAAO,EAELiB,CACV,EAEQrG,EAAI,EAAGA,EAAIuE,EAAG,SAAS,OAAQvE,IAC9BuE,EAAG,SAASvE,GAAG,aAAa,WAAW,GACzCuE,EAAG,SAASvE,GAAG,aAAa,YAAa,MAAM,EAIvD,OAAAuE,EAAG,IAAM,UAAW,CAGhB,QAFI+B,EAAK,KACLC,EAAO,CAAA,EACFvG,EAAI,EAAGA,EAAIuE,EAAG,SAAS,OAAQvE,KAChCsG,EAAK/B,EAAG,SAASvE,GAAG,aAAa,SAAS,IAC1CuG,EAAK,KAAKD,CAAE,EAGpB,OAAOC,CACV,EAEMhC,CACV,CAED,SAASiC,GAAYjC,EAAIuB,EAAS,CAC9B,IAAIvC,EAAM,CAAE,GAGR,CAAEuC,EAAQ,QAAU,OAAOA,EAAQ,QAAW,cAC9CA,EAAQ,OAAS,UAAW,CACxB,MAAO,EACV,IAED,CAAEA,EAAQ,UAAY,OAAOA,EAAQ,UAAa,cAClDA,EAAQ,SAAW,UAAW,CAC1B,MAAO,EACV,GAGCA,EAAQ,QACVA,EAAQ,MAAQ,KAIpB,IAAIW,EAAqB,KAGrBC,EAAiB,SAAS9G,EAAG,CAC7B,GAAI6G,GAAsB,KAAM,CAC5B,IAAIE,EAAQ,GACRC,EAAYrC,EAAG,UACfA,EAAG,UAAaA,EAAG,aAAe,GAAMA,EAAG,aACvCuB,EAAQ,aACJc,GAAarC,EAAG,YAChBA,EAAG,UAAYA,EAAG,UAAaA,EAAG,cAEtCoC,EAAQ,IAELpC,EAAG,WAAaA,EAAG,cACtBuB,EAAQ,WACJc,GAAarC,EAAG,YAChBA,EAAG,UAAYA,EAAG,UAAaA,EAAG,cAEtCoC,EAAQ,IAIhBF,EAAqB,WAAW,UAAW,CACvCA,EAAqB,IACrC,EAAeX,EAAQ,KAAK,EAEZa,GACI,OAAOb,EAAQ,UAAa,YAC5BA,EAAQ,SAAQ,CAG3B,CACJ,EAGD,OAAAvB,EAAG,SAAW,SAAS3E,EAAG,CACtB8G,EAAgB,CACnB,EAEDnC,EAAG,QAAU,SAAS3E,EAAG,CACrB8G,EAAgB,CACnB,EAEMnD,CACV,CAED,SAASsD,IAAO,CACZ,IAAIC,EAAa,SAAShB,EAASiB,EAAU,CACzC,GAAI,MAAM,QAAQjB,CAAO,EAAG,CAExB,IAAIkB,EAAW,CACX,SAAU,CAAE,EACZ,SAAUD,CACb,EAED,GAAIjB,EAAQ,OAAS,EACjB,QAAS9F,EAAI,EAAGA,EAAI8F,EAAQ,OAAQ9F,IAChC8F,EAAQ9F,GAAG,SAAWgH,EACtBA,EAAS,SAAS,KAAKF,EAAUhB,EAAQ9F,EAAE,CAAC,EAIpD,OAAOgH,CACV,CAoBD,GAlBMlB,EAAQ,OACVA,EAAQ,KAAO,IAGfA,EAAQ,OACRA,EAAQ,OAASA,EAAQ,MAIvBA,EAAQ,SACVA,EAAQ,OAAS,OAIfA,EAAQ,WACVA,EAAQ,SAAW,QAGnBA,EAAQ,KAAM,CAEd,IAAImB,EAAY,SAAU3C,EAAOhB,EAAK,CAClC,IAAI4D,EAAO,CAAA,EACX,GAAI5C,EAAO,CACP,IAAI6C,EAAO,OAAO,KAAK7C,CAAK,EAC5B,GAAI6C,EAAK,OACL,QAASnH,EAAI,EAAGA,EAAImH,EAAK,OAAQnH,IAAK,CAClC,GAAIsD,EACA,IAAIM,GAAIN,EAAM,IAAM6D,EAAKnH,GAAK,QAE9B,KAAI4D,GAAIuD,EAAKnH,GAGjB,GAAIsE,EAAMV,cAAc,SACpBsD,EAAKtD,IAAKU,EAAM6C,EAAKnH,YACdsE,EAAM6C,EAAKnH,MAAQ,MAAQsE,EAAM6C,EAAKnH,MAAQ,OACrDkH,EAAKtD,IAAK,WACH,OAAOU,EAAM6C,EAAKnH,KAAQ,SAGjC,QAFI4E,GAAIqC,EAAU3C,EAAM6C,EAAKnH,IAAK4D,EAAC,EAC/BgC,GAAI,OAAO,KAAKhB,EAAC,EACZ3E,GAAI,EAAGA,GAAI2F,GAAE,OAAQ3F,KAC1BiH,EAAKtB,GAAE3F,KAAM2E,GAAEgB,GAAE3F,UAGrBiH,EAAKtD,IAAKU,EAAM6C,EAAKnH,GAE5B,CAER,CAED,OAAOkH,CACV,EAEGvH,EAAIsH,EAAUnB,EAAQ,IAAI,EAC1BlC,EAAI,OAAO,KAAKjE,CAAC,EAGrB,GAAImG,EAAQ,QAAU,OAClB,GAAIlC,EAAE,OAAQ,CAEV,QADI2C,EAAO,CAAA,EACFvG,EAAI,EAAGA,EAAI4D,EAAE,OAAQ5D,IAC1BuG,EAAK,KAAK3C,EAAE5D,GAAK,IAAM,mBAAmBL,EAAEiE,EAAE5D,GAAG,CAAC,EAGlD8F,EAAQ,IAAI,QAAQ,GAAG,EAAI,IAC3BA,EAAQ,KAAO,KAEnBA,EAAQ,KAAOS,EAAK,KAAK,GAAG,CAC/B,MAGD,SADIA,EAAO,IAAI,SACNvG,EAAI,EAAGA,EAAI4D,EAAE,OAAQ5D,IAC1B,GAAIL,EAAEiE,EAAE5D,cAAe,UACnB,GAAIL,EAAEiE,EAAE5D,IAAI,OACR,QAASC,EAAI,EAAGA,EAAIN,EAAEiE,EAAE5D,IAAI,OAAQC,IAChCsG,EAAK,OAAO3C,EAAE5D,GAAIL,EAAEiE,EAAE5D,IAAIC,GAAIN,EAAEiE,EAAE5D,IAAIC,GAAG,IAAI,OAIrDsG,EAAK,OAAO3C,EAAE5D,GAAIL,EAAEiE,EAAE5D,GAAG,CAIxC,CAED,IAAIoH,EAAc,IAAI,eACtB,OAAAA,EAAY,KAAKtB,EAAQ,OAAQA,EAAQ,IAAK,EAAI,EAE9CA,EAAQ,cACRsB,EAAY,iBAAiB,mBAAoBtB,EAAQ,aAAa,EAElEA,EAAQ,gBAAkB,IAC1BsB,EAAY,iBAAiB,mBAAoB,gBAAgB,EAKrEtB,EAAQ,aACRsB,EAAY,iBAAiB,eAAgBtB,EAAQ,WAAW,EAIhEA,EAAQ,SAAW,OACnBsB,EAAY,iBAAiB,SAAU,kBAAkB,EAErDtB,EAAQ,WAAa,OACrBsB,EAAY,aAAe,OAErBtB,EAAQ,cACNA,EAAQ,WAAa,OACrBsB,EAAY,iBAAiB,eAAgB,WAAW,EACjDtB,EAAQ,WAAa,QAC5BsB,EAAY,iBAAiB,eAAgB,WAAW,GAOpEtB,EAAQ,QAAU,KAClBsB,EAAY,iBAAiB,SAAU,UAAU,EACjDA,EAAY,iBAAiB,gBAAiB,UAAU,GAIxDtB,EAAQ,kBAAoB,KAC5BsB,EAAY,gBAAkB,IAI9B,OAAOtB,EAAQ,YAAe,YAC9BA,EAAQ,WAAWsB,CAAW,EAI9B,OAAON,EAAU,YAAe,YAChCA,EAAU,WAAWM,CAAW,EAGhC,SAAS,MAAQ,OAAO,SAAS,KAAK,YAAe,YACrD,SAAS,KAAK,WAAWA,CAAW,EAGxCA,EAAY,QAAU,UAAW,CACzBtB,EAAQ,OAAS,OAAOA,EAAQ,OAAU,YAC1CA,EAAQ,MAAM,CACV,QAAS,6CACT,OAAQ,CAC5B,CAAiB,CAER,EAEDsB,EAAY,UAAY,UAAW,CAC3BtB,EAAQ,OAAS,OAAOA,EAAQ,OAAU,YAC1CA,EAAQ,MAAM,CACV,QAAS,2BAA6BsB,EAAY,QAAU,MAC5D,OAAQ,CAC5B,CAAiB,CAER,EAEDA,EAAY,OAAS,UAAW,CAC5B,GAAIA,EAAY,QAAU,KAAOA,EAAY,OAAS,IAClD,GAAItB,EAAQ,WAAa,OACrB,GAAI,CACA,IAAIuB,EAAS,KAAK,MAAMD,EAAY,YAAY,EAE5CtB,EAAQ,SAAW,OAAOA,EAAQ,SAAY,YAC9CA,EAAQ,QAAQuB,CAAM,CAE7B,OAAOC,EAAN,CACMxB,EAAQ,OAAS,OAAOA,EAAQ,OAAU,YAC1CA,EAAQ,MAAMwB,EAAKD,CAAM,CAEhC,KACE,CACH,GAAIvB,EAAQ,WAAa,OACrB,IAAIuB,EAASD,EAAY,aAEzB,KAAIC,EAASD,EAAY,aAGzBtB,EAAQ,SAAW,OAAOA,EAAQ,SAAY,YAC9CA,EAAQ,QAAQuB,CAAM,CAE7B,MAEGvB,EAAQ,OAAS,OAAOA,EAAQ,OAAU,YAC1CA,EAAQ,MAAMsB,EAAY,aAAcA,EAAY,MAAM,EAUlE,GALIN,EAAU,OAASA,EAAU,MAAM,OAAS,GAC5CA,EAAU,KAAKA,EAAU,MAAM,MAAO,CAAA,EAItCA,EAAU,UAAYA,EAAU,SAAS,OAAQ,CAEjD,IAAI1C,EAAQ0C,EAAU,SAAS,QAAQM,CAAW,EAoBlD,GAlBAN,EAAU,SAAS,OAAO1C,EAAO,CAAC,EAE5B0C,EAAU,SAAS,QAEjBhB,EAAQ,UAAY,OAAOA,EAAQ,UAAa,YAChDA,EAAQ,SAASuB,CAAM,EAI3BvB,EAAQ,OACJgB,EAAU,YAAc,OAAOA,EAAU,WAAWhB,EAAQ,QAAW,aACjEgB,EAAU,QAAQhB,EAAQ,KAAK,IACjCgB,EAAU,WAAWhB,EAAQ,OAAM,EACnCgB,EAAU,WAAWhB,EAAQ,OAAS,OAK9CA,EAAQ,UAAYA,EAAQ,SAAS,SAAU,CAE/C,IAAI1B,EAAQ0B,EAAQ,SAAS,SAAS,QAAQsB,CAAW,EAEzDtB,EAAQ,SAAS,SAAS,OAAO1B,EAAO,CAAC,EAEnC0B,EAAQ,SAAS,SAAS,QACxBA,EAAQ,SAAS,UAAY,OAAOA,EAAQ,SAAS,UAAa,YAClEA,EAAQ,SAAS,SAASuB,CAAM,CAG3C,CACJ,CACJ,EAGDD,EAAY,QAAUtB,EAEtBsB,EAAY,KAAOb,EAGfT,EAAQ,QAAU,IAAQgB,EAAU,SAAS,OAAS,EACtDA,EAAU,MAAM,KAAKM,CAAW,EAEhCN,EAAU,KAAKM,CAAW,EAGvBA,CACf,EAEI,OAAAN,EAAU,KAAO,SAASM,EAAa,CAC/BA,EAAY,KACR,MAAM,QAAQA,EAAY,IAAI,EAC9BA,EAAY,KAAKA,EAAY,KAAK,KAAK,GAAG,CAAC,EAE3CA,EAAY,KAAKA,EAAY,IAAI,EAGrCA,EAAY,KAAI,EAGpBN,EAAU,SAAS,KAAKM,CAAW,CACtC,EAEDN,EAAU,OAAS,SAASS,EAAKC,EAAY,CACzC,IAAIC,EAAO,IAAI,eACfA,EAAK,KAAK,OAAQF,EAAK,EAAK,EAC5BE,EAAK,KAAI,EACLA,EAAK,QACLD,EAAWC,EAAK,MAAM,CAE7B,EAEDX,EAAU,QAAU,SAASY,EAAO,CAChC,IAAI,EAAI,EACJ9B,EAAIkB,EAAU,SAClB,GAAIlB,GAAKA,EAAE,OACP,QAAS5F,EAAI,EAAGA,EAAI4F,EAAE,OAAQ5F,KACtB,CAAE0H,GAASA,GAAS9B,EAAE5F,GAAG,QAAQ,QACjC,IAIZ,OAAO,CACV,EAED8G,EAAU,WAAa,GACvBA,EAAU,SAAW,GACrBA,EAAU,MAAQ,GAEXA,CACV,CAE4B,IAAIa,GAAQd,GAAI,EAE7C,SAASe,IAAY,CACjB,MAAMd,EAAY,CACd,QAAS,CAAE,CACd,EAED,OAAAA,EAAU,QAAQ,KAAO,SAASe,EAAS,CACjCf,EAAU,QAAQ,UACpBA,EAAU,QAAQ,QAAU,SAAS,cAAc,KAAK,EACxDA,EAAU,QAAQ,QAAQ,UAAY,YAE1C,SAAS,KAAK,YAAYA,EAAU,QAAQ,OAAO,EAG/Ce,EAAU,GACV,WAAW,UAAW,CAClBf,EAAU,QAAQ,MAClC,EAAee,EAAU,GAAI,CAExB,EAEDf,EAAU,QAAQ,KAAO,UAAW,CAC5BA,EAAU,QAAQ,SAAWA,EAAU,QAAQ,QAAQ,YACvD,SAAS,KAAK,YAAYA,EAAU,QAAQ,OAAO,CAE1D,EAEDA,EAAU,UAAY,SAAU1B,EAAS0C,EAAWC,EAAM,CAClDD,GAAa,IACb1C,EAAQ,UAAU,IAAI,gBAAgB,EACtC,WAAW,UAAY,CACnBA,EAAQ,UAAU,OAAO,gBAAgB,EACrC,OAAQ2C,GAAS,YACjBA,GAEP,EAAE,GAAG,IAEN3C,EAAQ,UAAU,IAAI,iBAAiB,EACvC,WAAW,UAAY,CACnBA,EAAQ,UAAU,OAAO,iBAAiB,EACtC,OAAQ2C,GAAS,YACjBA,GAEP,EAAE,GAAG,EAEb,EAEDjB,EAAU,WAAa,SAAU1B,EAAS0C,EAAWC,EAAM,CACnDD,IAAc,IACd1C,EAAQ,UAAU,IAAI,iBAAiB,EACvC,WAAW,UAAY,CACnBA,EAAQ,UAAU,OAAO,iBAAiB,EACtC,OAAQ2C,GAAS,YACjBA,GAEP,EAAE,GAAG,IAEN3C,EAAQ,UAAU,IAAI,kBAAkB,EACxC,WAAW,UAAY,CACnBA,EAAQ,UAAU,OAAO,kBAAkB,EACvC,OAAQ2C,GAAS,YACjBA,GAEP,EAAE,GAAG,EAEb,EAEDjB,EAAU,SAAW,SAAU1B,EAAS0C,EAAWC,EAAM,CACjDD,IAAc,IACd1C,EAAQ,UAAU,IAAI,eAAe,EACrC,WAAW,UAAY,CACnBA,EAAQ,UAAU,OAAO,eAAe,EACpC,OAAQ2C,GAAS,YACjBA,GAEP,EAAE,GAAG,IAEN3C,EAAQ,UAAU,IAAI,gBAAgB,EACtC,WAAW,UAAY,CACnBA,EAAQ,UAAU,OAAO,gBAAgB,EACrC,OAAQ2C,GAAS,YACjBA,GAEP,EAAE,GAAG,EAEb,EAEDjB,EAAU,YAAc,SAAU1B,EAAS0C,EAAWC,EAAM,CACpDD,IAAc,IACd1C,EAAQ,UAAU,IAAI,kBAAkB,EACxC,WAAW,UAAY,CACnBA,EAAQ,UAAU,OAAO,kBAAkB,EACvC,OAAQ2C,GAAS,YACjBA,GAEP,EAAE,GAAG,IAEN3C,EAAQ,UAAU,IAAI,mBAAmB,EACzC,WAAW,UAAY,CACnBA,EAAQ,UAAU,OAAO,mBAAmB,EACxC,OAAQ2C,GAAS,YACjBA,GAEP,EAAE,GAAG,EAEb,EAEDjB,EAAU,OAAS,SAAU1B,EAAS2C,EAAM,CACxC3C,EAAQ,MAAM,QAAU,GACxBA,EAAQ,UAAU,IAAI,UAAU,EAChC,WAAW,UAAY,CACnBA,EAAQ,UAAU,OAAO,UAAU,EAC/B,OAAQ2C,GAAS,YACjBA,GAEP,EAAE,GAAI,CACV,EAEDjB,EAAU,QAAU,SAAU1B,EAAS2C,EAAM,CACzC3C,EAAQ,UAAU,IAAI,WAAW,EACjC,WAAW,UAAY,CACnBA,EAAQ,MAAM,QAAU,OACxBA,EAAQ,UAAU,OAAO,WAAW,EAChC,OAAQ2C,GAAS,YACjBA,GAEP,EAAE,GAAI,CACV,EAEMjB,CACV,CAE4B,IAAIkB,GAAaJ,GAAS,EAKvD,SAASK,IAAc,CACnB,IAAInB,EAAY,CAAA,EAEhBA,EAAU,IAAM,SAAUoB,EAAMC,EAAU,CACtC,IAAIlH,EAAI,KACJmH,EAAI,KACJzI,EAAI,KACJI,EAAI,KACJC,EAAI,KACJqI,EAAI,KAqBR,OAnBI,MAAM,QAAQH,CAAI,GAClBjH,EAAIiH,EAAK,GACTE,EAAIF,EAAK,GACTvI,EAAIuI,EAAK,GACTnI,EAAImI,EAAK,GACTlI,EAAIkI,EAAK,GACTG,EAAIH,EAAK,KAEHA,IACFA,EAAO,IAAI,MAEfjH,EAAIiH,EAAK,cACTE,EAAIF,EAAK,SAAU,EAAG,EACtBvI,EAAIuI,EAAK,UACTnI,EAAImI,EAAK,WACTlI,EAAIkI,EAAK,aACTG,EAAIH,EAAK,cAGTC,GAAY,GACL3C,EAAQ,IAAIvE,CAAC,EAAI,IAAMuE,EAAQ,IAAI4C,CAAC,EAAI,IAAM5C,EAAQ,IAAI7F,CAAC,EAE3D6F,EAAQ,IAAIvE,CAAC,EAAI,IAAMuE,EAAQ,IAAI4C,CAAC,EAAI,IAAM5C,EAAQ,IAAI7F,CAAC,EAAI,IAAM6F,EAAQ,IAAIzF,CAAC,EAAI,IAAMyF,EAAQ,IAAIxF,CAAC,EAAI,IAAMwF,EAAQ,IAAI6C,CAAC,CAE9I,EAEDvB,EAAU,QAAU,SAAUxC,EAAO,CACjC,IAAI4D,EAAO5D,EAAM,MAAQA,EAAM,QAAQ,GAAG,IAAM,GAAM,IAAM,GAAG,EAC3DgE,EAAOJ,EAAK,GACZA,EAAOA,EAAK,GAAG,MAAM,GAAG,EACxBjH,EAAI,SAASiH,EAAK,EAAE,EACpBE,EAAI,SAASF,EAAK,EAAE,EACpBvI,EAAI,SAASuI,EAAK,EAAE,EACpBnI,EAAI,EACJC,EAAI,EAER,OAAIsI,IACAA,EAAOA,EAAK,MAAM,GAAG,EACrBvI,EAAI,SAASuI,EAAK,EAAE,EACpBtI,EAAI,SAASsI,EAAK,EAAE,GAEjB,CAACrH,EAAGmH,EAAGzI,EAAGI,EAAGC,EAAG,CAAC,CAC3B,EAED,IAAIuI,EAAmB,KAAK,IAAI,KAAM,EAAG,CAAC,EACtCC,EAAmB,KAAK,IAAI,KAAM,EAAG,EAAE,EACvCC,EAAqB,MAKzB3B,EAAU,UAAY,SAAU4B,EAAQ,CAChC,OAAQA,GAAY,WACpBA,EAAS,IAAI,KAAKA,EAAS,SAAS,GAExC,IAAIC,EAAuBD,EAAO,UAClC,OAAIC,GAAwBH,IACxBG,GAAwBF,GAE5BE,GAAwBJ,EAEjBI,EAAuBF,CACjC,EAOD3B,EAAU,UAAY,SAAU8B,EAAmB,CAC/C,IAAID,EAAuBJ,EAAmBK,EAAoBH,EAC9DE,GAAwBH,IACxBG,GAAwBF,GAG5B,MAAM9I,EAAI,IAAI,KAAKgJ,CAAoB,EAEvC,IAAIT,EAAO,CACPvI,EAAE,eAAgB,EAClBA,EAAE,YAAW,EAAK,EAClBA,EAAE,WAAY,EACdA,EAAE,YAAa,EACfA,EAAE,cAAe,EACjBA,EAAE,cAAe,CAC7B,EAEQ,OAAOmH,EAAU,IAAIoB,CAAI,CAC5B,EAED,IAAIW,EAAW,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,UAAU,EACxFC,EAAS,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,UAAU,EAEtI,cAAO,eAAehC,EAAW,WAAY,CACzC,IAAK,UAAY,CACb,OAAO+B,EAAS,IAAI,SAAS1E,EAAG,CAC5B,OAAOJ,EAAW,UAAUI,CAAC,CAC7C,CAAa,CACJ,CACT,CAAK,EAED,OAAO,eAAe2C,EAAW,gBAAiB,CAC9C,IAAK,UAAY,CACb,OAAO+B,EAAS,IAAI,SAAS1E,EAAG,CAC5B,OAAOJ,EAAW,UAAUI,CAAC,EAAE,UAAU,EAAE,CAAC,CAC5D,CAAa,CACJ,CACT,CAAK,EAED,OAAO,eAAe2C,EAAW,SAAU,CACvC,IAAK,UAAY,CACb,OAAOgC,EAAO,IAAI,SAAS3E,EAAG,CAC1B,OAAOJ,EAAW,UAAUI,CAAC,CAC7C,CAAa,CACJ,CACT,CAAK,EAED,OAAO,eAAe2C,EAAW,cAAe,CAC5C,IAAK,UAAY,CACb,OAAOgC,EAAO,IAAI,SAAS3E,EAAG,CAC1B,OAAOJ,EAAW,UAAUI,CAAC,EAAE,UAAU,EAAE,CAAC,CAC5D,CAAa,CACJ,CACT,CAAK,EAEM2C,CACV,CAE4B,IAAIiC,EAAgBd,GAAW,EAK5D,SAASe,IAAO,CAEZ,IAAIC,EAAS,CAET,KAAM,CAAE,GAAK,EAEb,SAAU,CAAE,kCAAmC,GAAK,EAEpD,WAAY,CAAE,wBAA0B,EAExC,WAAY,CAAE,gBAAkB,EAEhC,QAAS,CAAE,eAAiB,EAE5B,SAAU,CAAE,OAAQ,MAAO,KAAM,QAAS,OAAQ,MAAO,KAAM,QAAS,OAAQ,MAAO,KAAM,KAAM,MAAO,KAAM,IAAK,IAAK,QAAS,MAAO,OAAQ,OAAQ,KAAM,UAAW,IAAK,QAAS,KAAM,KAAM,KAAM,IAAK,GAAK,EAErN,QAAS,CAAE,IAAK,IAAK,gBAAkB,GAAG,CAC7C,EAEGC,EAAU,UAAW,CACrB,GAAI,KAAK,KAAK,YAAW,EAAG,QAAQ,KAAK,IAAM,GAAI,CAC/C,IAAId,EAAI,EACJ,KAAK,KAAK,KACVA,EAAI,WAAW,KAAK,KAAK,GAAK,EAAE,GAEpC,IAAIjE,EAAI,SAAS,KAAK,KAAK,EAAE,EAAIiE,EACjCjE,GAAK,EACjB,KAAmB,EAAG,KAAK,KAAK,IAAM,KAAK,KAAK,IAAM,KAAK,KAAK,MAAQ,KAAK,KAAK,IAAM,KAAK,KAAK,IACtFA,EAAIqB,EAAQ,IAAI,KAAK,KAAK,EAAE,EAAI,IAAMA,EAAQ,IAAI,KAAK,KAAK,EAAE,EAAI,IAAMA,EAAQ,IAAI,KAAK,KAAK,EAAE,GAE5F,KAAK,KAAK,IAAM,KAAK,KAAK,IAAM,CAAE,KAAK,KAAK,KAC5C,KAAK,KAAK,GAAK,GAEnBrB,EAAIqB,EAAQ,IAAI,KAAK,KAAK,EAAE,EAAI,IAAMA,EAAQ,IAAI,KAAK,KAAK,EAAE,EAAI,IAAMA,EAAQ,IAAI,KAAK,KAAK,EAAE,GAE5F,KAAK,KAAK,IAAM,KAAK,KAAK,IAAM,KAAK,KAAK,MAC1CrB,GAAK,IAAMqB,EAAQ,IAAI,KAAK,KAAK,EAAE,EAAI,IAAMA,EAAQ,IAAI,KAAK,KAAK,EAAE,EAAI,IAAMA,EAAQ,IAAI,KAAK,KAAK,EAAE,IAI/G,OAAOrB,CACV,EAEGgF,EAAc,UAAW,CACzB,IAAIhF,EAAI,GACR,GAAI,EAAG,KAAK,KAAK,IAAM,KAAK,KAAK,IAAM,KAAK,KAAK,MAAQ,KAAK,KAAK,IAAM,KAAK,KAAK,IAAK,CACpF,GAAI,KAAK,KAAK,YAAW,EAAG,QAAQ,KAAK,IAAM,GAC3CA,EAAI,SAAS,KAAK,KAAK,EAAE,MACtB,CACH,IAAIpE,EAAI,SAAS,KAAK,KAAK,EAAE,EACzBA,EAAI,IAAM,KAAK,OAAO,QAAQ,IAAI,IAAM,GACxCoE,GAAKpE,EAAE,IAAM,GAEboE,EAAIpE,EAAI,EAEf,CACG,KAAK,KAAK,KACVoE,GAAK,WAAW,KAAK,KAAK,GAAK,EAAE,GAEjC,KAAK,KAAK,KACVA,GAAK,WAAW,KAAK,KAAK,GAAK,IAAI,GAEvCA,GAAK,EACjB,SAAmB,KAAK,KAAK,IAAM,KAAK,KAAK,IAAM,KAAK,KAAK,IAAM,KAAK,KAAK,IAAM,KAAK,KAAK,IAAM,KAAK,KAAK,GAAI,CACjG,KAAK,KAAK,IAAM,KAAK,KAAK,IAAM,CAAE,KAAK,KAAK,KAC5C,KAAK,KAAK,GAAK,GAEnB,IAAIL,EAAIiF,EAAa,IAAI,KAAK,IAAI,EAClC5E,EAAI4E,EAAa,UAAUjF,CAAC,EACxB,KAAK,KAAK,KACVK,GAAK,WAAW,KAAK,KAAK,GAAK,EAAE,EAExC,CAED,OAAI,MAAMA,CAAC,IACPA,EAAI,IAGDA,CACV,EAEGiF,EAAU,SAASjF,EAAG,CACtB,OAAOA,IAAM,MAAQA,IAAM,IAAMA,IAAM,MAC1C,EAEGkF,EAAY,SAAS/E,EAAO,CAC5B,IAAIH,GAAK,GAAGG,GAAO,GACnB,OAAOH,GAAK,GACf,EAEGmF,EAAY,SAASxF,EAAG,CACxB,OAAOA,IAAM,YAAcA,IAAM,cAAgBA,IAAM,cAAgBA,IAAM,SAChF,EAKGyF,EAAa,SAASpF,EAAG,CACzB,GAAIA,GAAK,OAAOA,CAAC,GAAKA,EAClB,MAAO,IAEP,GAAI,KAAK,QAAQ,QACb,OAAO,KAAK,QAAQ,QAEpB,GAAI,KAAK,OAAQ,CACb,IAAIL,EAAI,KAAK,aAAa,KAAK,MAAM,EAAE,OAAO,GAAG,EACjD,OAAO,KAAK,QAAQ,QAAUA,EAAE,EACpD,KAAuB,CACGK,IACFA,EAAK,KAAK,MAEd,IAAIvE,EAAI,IAAI,OAAO,eAAgB,IAAI,EACnCkE,EAAIlE,EAAE,KAAKuE,CAAC,EAChB,GAAIL,GAAKA,EAAE,IAAMA,EAAE,GAAG,QAAU,EAE5B,YAAK,QAAQ,QAAUA,EAAE,GAElBA,EAAE,GAGT,IAAIlE,EAAI,IAAI,OAAO,eAAgB,IAAI,EACnCkE,EAAIlE,EAAE,KAAKuE,CAAC,EACZL,GAAKA,EAAE,IAAMA,EAAE,GAAG,QAAU,EACxBA,EAAE,KAAO,IACT,KAAK,QAAQ,QAAU,IAEvB,KAAK,QAAQ,QAAU,IAG3B,KAAK,QAAQ,QAAU,MAAM,eAAc,EAAG,UAAU,EAAE,CAAC,CAGtE,CAIT,OAAI,KAAK,QAAQ,QACN,KAAK,QAAQ,QAEb,IAEd,EAEG0F,EAAa,SAASrF,EAAGsF,EAAS,CAClC,GAAItF,GAAK,GACL,MAAO,GAILsF,IACFA,EAAUF,EAAW,KAAK,IAAI,GAIlCpF,GAAK,GAAGA,GAAG,MAAMsF,CAAO,EAGxB,IAAIC,EAASvF,EAAE,GAAG,MAAM,OAAO,EAoB/B,GAnBIuF,GAAUA,EAAO,OACjBA,EAAS,GAETA,EAAS,GAGbvF,EAAE,GAAKA,EAAE,GAAG,MAAM,SAAS,EAEvBA,EAAE,IACEuF,GACAvF,EAAE,GAAG,QAAQ,GAAG,EAEpBA,EAAE,GAAKA,EAAE,GAAG,KAAK,EAAE,GAEfuF,IACAvF,EAAE,GAAK,KAIXA,EAAE,IAAMA,EAAE,GACNA,EAAE,KAAO,SACTA,EAAE,GAAKA,EAAE,GAAG,MAAM,SAAS,EACvBA,EAAE,GACFA,EAAE,GAAKA,EAAE,GAAG,KAAK,EAAE,EAEnBA,EAAE,GAAK,QAIf,OAAO,GAEX,OAAOA,CACV,EAEGwF,EAAc,SAASxF,EAAGwC,EAAO,CACjC,GAAIxC,IAAM,GACN,MAAO,GAGX,IAAIxE,EAAI4J,EAAW,KAAK,IAAI,EAExB3D,EAAI,KAAK,QAGb,GADAzB,EAAIqF,EAAW,KAAK,KAAMrF,CAAC,EACvBA,IAAM,GACN,MAAO,GAEX,IAAIL,EAAI,KAUR,GARIK,EAAE,KACEyB,EAAE,QAAU,UACZ9B,EAAI,WAAWK,EAAE,EAAE,EAAI,IAEvBL,EAAI,WAAWK,EAAE,GAAK,IAAI,IAI7BA,EAAE,KAAO,KAAOA,EAAE,KAAO,QAAU,CAAEA,EAAE,IAAOwC,GAASA,EAAM,WAAa,wBAC3E,MAAO,GAGX,IAAI/E,EAAI,IAAI,KAAK,aAAa,KAAK,OAAQgE,CAAC,EAAE,OAAO9B,CAAC,EAUtD,GATAlC,EAAIA,EAAE,MAAMjC,CAAC,EAETiG,EAAE,QAAU,WACRhE,EAAE,GAAG,QAAQ,GAAG,IAAM,KACtBA,EAAE,GAAKA,EAAE,GAAG,QAAQ,IAAK,EAAE,EAC3BA,EAAE,GAAK,KAIX,OAAOA,EAAE,GAAQ,IAAa,CAC9B,IAAIyG,EAAIzG,EAAE,GAAG,QAAQ,UAAW,EAAE,EAC9ByG,IACAzG,EAAE,GAAKyG,EAEd,CAED,OAAIlE,EAAE,KAAO,OACTvC,EAAE,GAAKjC,EAAIwE,EAAE,GAEbvC,EAAE,GAAK,GAGJA,EAAE,KAAK,EAAE,CACnB,EAEGgI,EAAS,SAAShK,EAAG+G,EAAO,CAC5B,IAAIxC,EAAI0F,EAAM,KAAKjK,CAAC,EACpB,GAAI,EAAEuE,EAKN,KAAIvC,EAAI+H,EAAY,KAAK,KAAMxF,EAAGwC,CAAK,EACnC7C,EAAKlC,EAAE,OAAUuC,EAAE,OACnBC,EAAQ0F,EAAM,KAAKlK,CAAC,EAAIkE,EAE5B+F,EAAM,KAAKjK,EAAGgC,EAAGwC,EAAO,EAAI,EAC/B,EAEG2F,EAAU,SAAS5F,EAAG,CAEtB,IAAI6F,EAAUR,EAAW,KAAK,KAAMrF,CAAC,EACrC,OAAI6F,GAEIA,EAAQ,KAAO,MACfA,EAAQ,GAAK,MAEV,WAAWA,EAAQ,KAAK,GAAG,CAAC,GAEhC,IACV,EAKGF,EAAQ,SAAS1F,EAAO6F,EAAe,CACvC,GAAI7F,IAAU,OACV,GAAI,KAAK,SAAW,MAAO,CACvB,IAAI8F,EAAM,EACN7B,EAAI,OAAO,eACf,GAAIA,GACIA,EAAE,aAAe,EAAG,CACpB,IAAIzD,EAAIyD,EAAE,WAAW,CAAC,EAClB8B,EAAIvF,EAAE,aACVuF,EAAE,mBAAmB,IAAI,EACzBA,EAAE,OAAOvF,EAAE,aAAcA,EAAE,SAAS,EACpCsF,EAAMC,EAAE,SAAU,EAAC,MACtB,CAEL,OAAOD,CACvB,KACgB,QAAO,KAAK,mBAEb,CAEH,IAAItI,EAAIiI,EAAM,KAAK,IAAI,EAGvB,GAAII,EAAe,CAEf,QADIE,EAAI,KACCnK,EAAI,EAAGA,EAAI4B,EAAE,OAAQ5B,KACtB4B,EAAE5B,GAAG,MAAM,UAAU,GAAK4B,EAAE5B,KAAO,KAAO4B,EAAE5B,KAAO,OACnDmK,EAAInK,GAKRmK,IAAM,OACNA,EAAIvI,EAAE,QAAQ,GAAG,GAGjBwC,GAAS+F,IACT/F,EAAQ+F,EAAI,EAEnB,CAOD,GAJI/F,EAAQxC,EAAE,SACVwC,EAAQxC,EAAE,QAGVwC,EAEA,GAAI,KAAK,SAAW,MAAO,CACvB,IAAIiE,EAAI,OAAO,eACXzD,EAAI,SAAS,cAEb,KAAK,WAAW,KAChBA,EAAE,SAAS,KAAK,WAAW,GAAIR,CAAK,EACpCiE,EAAE,gBAAe,EACjBA,EAAE,SAASzD,CAAC,EAEpC,MACoB,KAAK,eAAiBR,EACtB,KAAK,aAAeA,CAG/B,CACJ,EAKGyF,EAAQ,SAAS1F,EAAGiG,EAAaH,EAAe,CAChD,GAAI,KAAK,SAAW,MAChB,GAAI9F,IAAM,OAAW,CACjB,IAAIA,EAAI,KAAK,UACb,OAAI,KAAK,OAAS,KAAK,MAAM,OAASA,EAAE,SACpCA,EAAI,KAAK,OAENA,CACvB,MACoB,KAAK,YAAcA,IACnB,KAAK,UAAYA,EAEbiG,GACAN,EAAM,KAAK,KAAMM,EAAaH,CAAa,OAIpD,CACH,GAAI9F,IAAM,OACN,OAAO,KAAK,MAER,KAAK,QAAUA,IACf,KAAK,MAAQA,EACTiG,GACAN,EAAM,KAAK,KAAMM,EAAaH,CAAa,EAI1D,CACJ,EAGGI,EAAetB,EAAa,SAC5BuB,EAAWvB,EAAa,cACxBwB,EAAaxB,EAAa,OAC1BD,GAASC,EAAa,YAEtByB,GAAS,CACT,KAAQ,SAASrG,EAAGkE,EAAG,CACnB,IAAIpH,EAAI,GAAG,IAAI,KAAM,EAAC,YAAW,EAUjC,GARI,OAAO,KAAK,OAAO,KAAK,OAAY,MACpC,KAAK,OAAO,KAAK,OAAS,IAE1B,SAASkD,CAAC,GAAK,GAAK,SAASA,CAAC,GAAK,IAC/B,KAAK,OAAO,KAAK,OAAO,OAASkE,IACjC,KAAK,OAAO,KAAK,QAAUlE,GAG/B,KAAK,OAAO,KAAK,OAAO,QAAUkE,EAAG,CACrC,GAAIA,GAAK,EACL,IAAIpH,EAAIA,EAAE,OAAO,EAAE,CAAC,EAAI,KAAK,OAAO,KAAK,eAClCoH,GAAK,EACZ,IAAIpH,EAAIA,EAAE,OAAO,EAAE,CAAC,EAAI,KAAK,OAAO,KAAK,eAClCoH,GAAK,EACZ,IAAIpH,EAAI,KAAK,OAAO,KAAK,OAE7B,KAAK,KAAK,GAAKA,EACf,KAAK,OACR,CACJ,EACD,KAAQ,SAASkD,EAAG,CAChBqG,GAAO,KAAK,KAAK,KAAMrG,EAAG,CAAC,CAC9B,EACD,IAAO,SAASA,EAAG,CACfqG,GAAO,KAAK,KAAK,KAAMrG,EAAG,CAAC,CAC9B,EACD,GAAM,SAASA,EAAG,CACdqG,GAAO,KAAK,KAAK,KAAMrG,EAAG,CAAC,CAC9B,EACD,KAAQ,SAASA,EAAG3E,EAAG,CAInB,GAHI4J,EAAQ,KAAK,OAAO,KAAK,MAAM,IAC/B,KAAK,OAAO,KAAK,OAAS,IAE1B,KAAK,OAAS,KAAK,MAAM,WAAa,KAAK,MAAM,UAAU,QAAQ,QAAQ,EAAI,GAAI,CACnF,KAAK,OAAO,KAAK,QAAUjF,EAC3B,MACH,CAID,QAHI+F,EAAM,EACNO,EAAQ,EACRnG,GAAS,KAAK,OAAO,KAAK,OAASH,GAAG,cACjCnE,EAAI,EAAGA,EAAIR,EAAE,OAAQQ,IACtBR,EAAEQ,GAAG,YAAa,EAAC,QAAQsE,CAAK,GAAK,IACrC4F,EAAMlK,EACNyK,KAGR,GAAIA,EAAQ,EACR,KAAK,OAAO,KAAK,QAAUtG,UACpBsG,GAAS,EAAG,CAEnB,IAAI3G,EAAKtE,EAAE0K,GAAK,OAAS,KAAK,OAAO,KAAK,OAAO,OAAU,EAC3D,YAAK,UAAYpG,EAEjB,KAAK,OAAO,KAAK,OAAStE,EAAE0K,GAC5B,KAAK,QACEA,CACV,CACJ,EACD,IAAO,SAAS/F,EAAG,CACf,IAAIuG,EAAMF,GAAO,KAAK,KAAK,KAAMrG,EAAG2E,EAAM,EACtC4B,IAAQ,SACR,KAAK,KAAK,GAAKA,EAAM,EAE5B,EACD,IAAO,SAASvG,EAAG,CACfqG,GAAO,IAAO,KAAK,KAAMrG,CAAC,CAC7B,EACD,KAAQ,SAASA,EAAG,CAChB,IAAIuG,EAAMF,GAAO,KAAK,KAAK,KAAMrG,EAAGoG,CAAU,EAC1CG,IAAQ,SACR,KAAK,KAAK,GAAKA,EAAM,EAE5B,EACD,MAAS,SAASvG,EAAG,CACjBqG,GAAO,KAAQ,KAAK,KAAMrG,CAAC,CAC9B,EACD,MAAS,SAASA,EAAG,CACbiF,EAAQ,KAAK,OAAO,KAAK,MAAM,IAC/B,KAAK,OAAO,KAAK,OAAS,IAK9B,QADI9E,GAAS,KAAK,OAAO,KAAK,OAASH,GAAG,cACjCnE,EAAI,EAAGA,EAAIuK,EAAW,OAAQvK,IACnC,GAAIuK,EAAWvK,GAAG,GAAG,YAAW,EAAG,QAAQsE,CAAK,GAAK,EAAG,CACpD,KAAK,OAAO,KAAK,OAASiG,EAAWvK,GAAG,GACxC,KAAK,KAAK,GAAKA,EAAI,EACnB,KAAK,QACL,KACH,CAER,EACD,GAAM,SAASmE,EAAG,CACViF,EAAQ,KAAK,OAAO,KAAK,MAAM,EAC3B,SAASjF,CAAC,EAAI,GAAK,SAASA,CAAC,EAAI,IACjC,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,OAAS,IAAMA,EAC/C,KAAK,SACE,SAASA,CAAC,EAAI,IACrB,KAAK,OAAO,KAAK,OAASA,GAG1B,KAAK,OAAO,KAAK,QAAU,GAAK,SAASA,CAAC,EAAI,GAC9C,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAC1C,KAAK,SACE,KAAK,OAAO,KAAK,QAAU,GAAK,SAASA,CAAC,EAAI,GAAK,SAASA,CAAC,EAAI,KACxE,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAC1C,KAAK,QAGhB,EACD,EAAK,SAASA,EAAG,CACb,IAAIwG,EAAO,GACX,GAAI,SAASxG,CAAC,GAAK,GAAK,SAASA,CAAC,EAAI,GAClC,GAAIiF,EAAQ,KAAK,OAAO,KAAK,MAAM,EAC/B,KAAK,OAAO,KAAK,OAASjF,EACtBA,EAAI,IACJ,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,OAChC,KAAK,iBAGL,KAAK,OAAO,KAAK,QAAU,GAAK,SAASA,CAAC,EAAI,EAC9C,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAC1C,KAAK,gBACE,KAAK,OAAO,KAAK,QAAU,GAAK,SAASA,CAAC,EAAI,EACrD,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAC1C,KAAK,YAEL,KAAIwG,EAAO,OAInB,KAAIA,EAAO,GAIf,GAAIA,GAAQ,GAAM,CACd,IAAI7G,EAAI,SAAS,KAAK,OAAO,KAAK,MAAM,EACpCA,EAAI,GAAKA,EAAI,KACb,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,OAChC,KAAK,QAEL,KAAK,WAEZ,CACJ,EACD,EAAK,SAASK,EAAG,CACb,IAAIwG,EAAO,GACX,GAAI,SAASxG,CAAC,GAAK,GAAK,SAASA,CAAC,EAAI,GAClC,GAAIiF,EAAQ,KAAK,OAAO,KAAK,MAAM,EAC/B,KAAK,OAAO,KAAK,OAASjF,EACtB,SAASA,CAAC,EAAI,IACd,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,OAChC,KAAK,iBAGL,KAAK,OAAO,KAAK,QAAU,GAAK,SAASA,CAAC,EAAI,EAC9C,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAC1C,KAAK,gBACE,KAAK,OAAO,KAAK,QAAU,GAAK,KAAK,OAAO,KAAK,QAAU,EAClE,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAC1C,KAAK,gBACE,KAAK,OAAO,KAAK,QAAU,GAAK,SAASA,CAAC,EAAI,EACrD,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAC1C,KAAK,YAEL,KAAIwG,EAAO,OAInB,KAAIA,EAAO,GAIf,GAAIA,GAAQ,GAAM,CACd,IAAI7G,EAAI,SAAS,KAAK,OAAO,KAAK,MAAM,EACpCA,EAAI,GAAKA,EAAI,KACb,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,OAChC,KAAK,QAEL,KAAK,WAEZ,CACJ,EACD,GAAM,SAASK,EAAG,CACViF,EAAQ,KAAK,OAAO,KAAK,MAAM,EAC3B,SAASjF,CAAC,EAAI,GAAK,SAASA,CAAC,EAAI,IACjC,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,OAAS,IAAMA,EAC/C,KAAK,SACE,SAASA,CAAC,EAAI,KACrB,KAAK,OAAO,KAAK,OAASA,GAG1B,KAAK,OAAO,KAAK,QAAU,GAAK,SAASA,CAAC,EAAI,GAC9C,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAC1C,KAAK,UACG,KAAK,OAAO,KAAK,QAAU,GAAK,KAAK,OAAO,KAAK,QAAU,IAAM,SAASA,CAAC,EAAI,IACvF,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAC1C,KAAK,SACE,KAAK,OAAO,KAAK,QAAU,GAAK,SAASA,CAAC,EAAI,GAAK,SAASA,CAAC,EAAI,KACxE,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAC1C,KAAK,QAGhB,EACD,IAAO,SAASA,EAAG,CACfqG,GAAO,KAAK,KAAK,KAAMrG,EAAGmG,CAAQ,CACrC,EACD,GAAM,SAASnG,EAAG,CACdqG,GAAO,IAAO,KAAK,KAAMrG,CAAC,CAC7B,EACD,KAAQ,SAASA,EAAG,CAChBqG,GAAO,KAAK,KAAK,KAAMrG,EAAGkG,CAAY,CACzC,EACD,IAAO,SAASlG,EAAG,CACfqG,GAAO,KAAQ,KAAK,KAAMrG,CAAC,CAC9B,EACD,KAAQ,SAASA,EAAGyG,EAAK,CACjBxB,EAAQ,KAAK,OAAO,KAAK,MAAM,EAC3B,SAASjF,CAAC,EAAI,GAAK,SAASA,CAAC,EAAI,IAC7ByG,IACAzG,EAAI,EAAIA,GAEZ,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,OAASA,EACzC,KAAK,SACE,SAASA,CAAC,EAAI,KACrB,KAAK,OAAO,KAAK,OAASA,GAG1B,KAAK,OAAO,KAAK,QAAU,GAAK,SAASA,CAAC,EAAI,GAC9C,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAC1C,KAAK,SACE,KAAK,OAAO,KAAK,OAAS,GAAK,SAASA,CAAC,EAAI,KACpD,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAC1C,KAAK,QAGhB,EACD,KAAQ,SAASA,EAAGyG,EAAK,CACjB,SAASzG,CAAC,GAAK,GAAK,SAASA,CAAC,EAAI,KAC9B,KAAK,OAAO,KAAK,QAAU,MAAQ,KAAK,OAAO,KAAK,QAAU,GAC1D,SAASA,CAAC,EAAI,GAAK,SAASA,CAAC,EAAI,IAC7ByG,IACAzG,EAAI,EAAIA,GAEZ,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,OAASA,EACzC,KAAK,SACE,SAASA,CAAC,EAAI,KACrB,KAAK,OAAO,KAAK,OAASA,GAG1B,KAAK,OAAO,KAAK,QAAU,GAAK,SAASA,CAAC,EAAI,GAC1C,CAAEyG,GAAO,KAAK,OAAO,KAAK,SAAW,MACrC,KAAK,OAAO,KAAK,OAAS,IAE9B,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUzG,EAC1C,KAAK,SACE,KAAK,OAAO,KAAK,OAAS,GAAK,SAASA,CAAC,EAAI,KAChD,CAAEyG,GAAO,KAAK,OAAO,KAAK,SAAW,MACrC,KAAK,OAAO,KAAK,OAAS,IAE9B,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUzG,EAC1C,KAAK,SAIpB,EACD,GAAM,SAASA,EAAG,CACdqG,GAAO,KAAQ,KAAK,KAAMrG,EAAG,CAAC,CACjC,EACD,EAAK,SAASA,EAAG,CACbqG,GAAO,KAAQ,KAAK,KAAMrG,EAAG,CAAC,CACjC,EACD,UAAW,SAASA,EAAG,CACf,KAAK,OAAO,KAAK,QAAU,OAC3B,KAAK,OAAO,KAAK,OAAS,IAE1BA,EAAE,MAAM,QAAQ,EAChB,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,QAAUA,EAEtC,KAAK,OAAO,KAAK,OAAO,MAAM,QAAQ,IACtC,KAAK,KAAK,GAAK,KAAK,OAAO,KAAK,OAChC,KAAK,QAEL,KAAK,WAGhB,EACD,IAAO,SAASA,EAAGnE,EAAG,CACd,KAAK,OAAO,KAAK,QAAU,MAAQ,KAAK,OAAO,KAAK,QAAU,GAC1D,SAASmE,CAAC,EAAI,GAAK,SAASA,CAAC,EAAI,IACjC,KAAK,KAAKnE,GAAK,KAAK,OAAO,KAAK,OAAS,IAAMmE,EAC/C,KAAK,SACE,SAASA,CAAC,EAAI,KACrB,KAAK,OAAO,KAAK,OAASA,GAG1B,SAASA,CAAC,EAAI,KACd,KAAK,KAAKnE,GAAK,KAAK,OAAO,KAAK,QAAUmE,EAC1C,KAAK,QAGhB,EACD,GAAM,SAASA,EAAG,CACdqG,GAAO,IAAI,KAAK,KAAMrG,EAAG,CAAC,CAC7B,EACD,GAAM,SAASA,EAAG,CACdqG,GAAO,IAAI,KAAK,KAAMrG,EAAG,CAAC,CAC7B,EACD,QAAS,SAASA,EAAG,CACb,OAAO,KAAK,OAAO,KAAK,OAAY,MACpC,KAAK,OAAO,KAAK,OAAS,IAG1B,KAAK,OAAO,KAAK,SAAW,GACxBA,EAAE,MAAM,IAAI,GAAK,KAAK,KAAK,GAAK,GAChC,KAAK,OAAO,KAAK,QAAU,IACpBA,EAAE,MAAM,IAAI,IACnB,KAAK,OAAO,KAAK,QAAU,MAExB,KAAK,OAAO,KAAK,SAAW,KAAO,KAAK,OAAO,KAAK,SAAW,OACtE,KAAK,OAAO,KAAK,QAAU,IAC3B,KAAK,QAEZ,EACD,GAAM,SAASA,EAAG,CACV,OAAO,KAAK,OAAO,KAAK,OAAY,MACpC,KAAK,OAAO,KAAK,OAAS,IAE1B,SAASA,CAAC,GAAK,GAAK,SAASA,CAAC,EAAI,IAClC,KAAK,OAAO,KAAK,OAASA,GAE1B,KAAK,OAAO,KAAK,OAAO,QAAU,GAClC,KAAK,OAEZ,EACD,gBAAiB,SAASA,EAAG,CAEzB,IAAIsF,EAAUF,EAAW,KAAK,IAAI,EAE9BsB,EAAM,GAENzB,EAAQ,KAAK,OAAO,KAAK,MAAM,EAC/B,KAAK,OAAO,KAAK,OAAS,GAEtB,KAAK,OAAO,KAAK,QAAU,MAC3ByB,EAAM,IAGd,IAAIb,EAAUR,EAAW,KAAK,KAAM,KAAK,OAAO,KAAK,OAAQC,CAAO,EAChEO,IACA,KAAK,OAAO,KAAK,OAASA,EAAQ,KAAKP,CAAO,GAG9C,SAAStF,CAAC,GAAK,GAAK,SAASA,CAAC,EAAI,IAE9B,KAAK,OAAO,KAAK,QAAU,KAAOA,EAAI,EACtC,KAAK,OAAO,KAAK,OAAS,GACnB,KAAK,OAAO,KAAK,QAAU,MAAQA,EAAI,IAC9C,KAAK,OAAO,KAAK,OAAS,MAGzB,KAAK,OAAO,KAAK,QAAU,KAAO,KAAK,OAAO,KAAK,QAAU,MAASA,GAAKsF,KAC5E,KAAK,OAAO,KAAK,QAAUtF,IAExBsF,GAAWtF,GAAKsF,EACnB,KAAK,OAAO,KAAK,OAAO,QAAQA,CAAO,GAAK,KACtC,KAAK,OAAO,KAAK,SACnB,KAAK,OAAO,KAAK,OAAS,KAE9B,KAAK,OAAO,KAAK,QAAUtF,GAExBA,GAAK,MAEZ0G,EAAM,IAGNA,IAAQ,IAAQ,KAAK,OAAO,KAAK,OAAO,KAAO,MAC/C,KAAK,OAAO,KAAK,OAAS,IAAM,KAAK,OAAO,KAAK,OAExD,EACD,yBAA0B,SAAS1G,EAAG,CAClCqG,GAAO,iBAAiB,KAAK,KAAMrG,CAAC,CACvC,EACD,iBAAkB,SAASA,EAAG,CAC1BqG,GAAO,iBAAiB,KAAK,KAAMrG,CAAC,EAEhC,KAAK,OAAO,KAAK,OAAO,MAAM,UAAU,EACpC,KAAK,OAAO,KAAK,QAAU,KAAK,OAAO,KAAK,OAAO,QAAQ,GAAG,GAAK,KACnE,KAAK,OAAO,KAAK,QAAU,KAG/B,KAAK,OAAO,KAAK,OAAS,EAEjC,EACD,kCAAmC,SAASA,EAAG,CAE3CqG,GAAO,iBAAiB,KAAK,KAAMrG,CAAC,EAEpC,IAAIsF,EAAUF,EAAW,KAAK,IAAI,EAE9BuB,EAAY,KAAK,OAAO,KAAK,OAAO,OAAO,EAAE,CAAC,EAE9CC,EAAW,KAAK,OAAO,KAAK,OAAO,KAAO,IAE1Cf,EAAUR,EAAW,KAAK,KAAM,KAAK,OAAO,KAAK,OAAQC,CAAO,EAGpE,GAAIO,IAAY,GAAI,CAEhB,IAAIpI,EAAIoI,EAAQ,GAAG,MAAM,QAAQ,EACjC,GAAIpI,EAAG,CAEHA,EAAIA,EAAE,KAAK,EAAE,EAGb,QAFIkC,EAAI,CAAA,EACJuE,EAAI,EACCpI,EAAI2B,EAAE,OAAS,EAAG3B,GAAK,EAAIA,IAChC6D,EAAE,KAAKlC,EAAE3B,EAAE,EACXoI,IACOA,EAAI,GACPvE,EAAE,KAAKgH,CAAS,EAGxBhH,EAAIA,EAAE,UACNkG,EAAQ,GAAKlG,EAAE,KAAK,EAAE,EAClBkG,EAAQ,GAAG,OAAO,EAAE,CAAC,GAAKc,IAC1Bd,EAAQ,GAAKA,EAAQ,GAAG,OAAO,CAAC,EAExD,MACoBA,EAAQ,GAAK,GAIjB,KAAK,OAAO,KAAK,OAASA,EAAQ,KAAKP,CAAO,EAG1CsB,IACA,KAAK,OAAO,KAAK,OAAS,IAAM,KAAK,OAAO,KAAK,OAExD,CACJ,EACD,EAAK,SAAS5G,EAAG,CACTA,EAAE,MAAM,QAAQ,IAChB,KAAK,OAAO,KAAK,OAASA,EAC1B,KAAK,QAEZ,EACD,gBAAiB,SAASA,EAAG,CACrBiF,EAAQ,KAAK,OAAO,KAAK,MAAM,IAC/B,KAAK,OAAO,KAAK,OAAS,IAE9B,IAAItF,EAAI,KAAK,OAAO,KAAK,OACrBuE,EAAI,KAAK,OAAO,KAAK,OACrBrI,EAAIqI,EAAE,OAENvE,EAAE9D,IAAMmE,GACR,KAAK,OAAO,KAAK,QAAUA,EAEvB,KAAK,OAAO,KAAK,QAAUL,GAC3B,KAAK,UAGT,KAAK,OAAO,KAAK,OAASA,EAC1B,KAAK,QAEDK,EAAE,MAAM,UAAU,GAElB,KAAK,WAGhB,EACD,EAAK,SAASA,EAAG,CACTA,EAAE,MAAM,YAAY,IACpB,KAAK,OAAO,KAAK,OAASA,EAC1B,KAAK,QAEZ,EACD,IAAK,SAASA,EAAG,CACbqG,GAAO,iBAAiB,KAAK,KAAMrG,CAAC,CACvC,EACD,IAAK,SAASA,EAAG,CACTiF,EAAQ,KAAK,OAAO,KAAK,MAAM,IAC/B,KAAK,OAAO,KAAK,OAAS,IAE9B,KAAK,OAAO,KAAK,QAAUjF,CAC9B,CACJ,EAKG6G,GAAY,SAAS/L,EAAK,CAC1B,GAAI,KAAK,MAAQ,UACb,IAAI6E,EAAI,CAAE,EAAC,OAAOmF,EAAO,OAAO,MAEhC,KAAInF,EAAI,CAAA,EAAG,OAAOmF,EAAO,SAAUA,EAAO,SAAUA,EAAO,WAAYA,EAAO,WAAYA,EAAO,QAASA,EAAO,KAAMA,EAAO,OAAO,EAGzI,IAAIrJ,EAAI,IAAI,OAAOkE,EAAE,KAAK,GAAG,EAAG,IAAI,EAEpC,OAAO7E,EAAI,MAAMW,CAAC,CACrB,EAKGqL,GAAY,SAAShM,EAAK,CAC1B,GAAM,KAAK,KAEJ,GAAI,KAAK,MAAQ,OACpB,IAAIiM,EAAQ,CAAE,gBACP,KAAK,MAAQ,UACpB,IAAIA,EAAQ,CAAE,mBACP,KAAK,MAAQ,WACpB,IAAIA,EAAQ,CAAE,UAAW,WAAY,SAAS,MAE9C,KAAIA,EAAQ,CAAE,WAAY,aAAc,aAAc,UAAW,eARjE,KAAIA,EAAQ,OAAO,KAAKjC,CAAM,EAYlC,QAASjJ,EAAI,EAAGA,EAAIkL,EAAM,OAAQlL,IAE9B,QADImL,EAAOD,EAAMlL,GACRC,EAAI,EAAGA,EAAIgJ,EAAOkC,GAAM,OAAQlL,IAAK,CAC1C,IAAIL,EAAI,IAAI,OAAOqJ,EAAOkC,GAAMlL,GAAI,IAAI,EACpC2E,EAAI3F,EAAI,MAAMW,CAAC,EACnB,GAAIgF,EACA,MAAO,CAAE,KAAMuG,EAAM,OAAQlC,EAAOkC,GAAMlL,EAAI,CAErD,CAER,EAKGmL,EAAa,SAAStH,EAAG,CAEzB,QADIuD,EAAS,CAAA,EACJrH,EAAI,EAAGA,EAAI8D,EAAE,OAAQ9D,IAAK,CAC/B,IAAIoI,EAAI6C,GAAU,KAAK,KAAMnH,EAAE9D,EAAE,EAC7BoI,EACAf,EAAO,KAAKe,EAAE,MAAM,EAEpBf,EAAO,KAAK,IAAI,CAEvB,CAGD,QAASrH,EAAI,EAAGA,EAAIqH,EAAO,OAAQrH,IAC3BqH,EAAOrH,IAAM,OAETqH,EAAOrH,EAAE,IAAMqH,EAAOrH,EAAE,GAAG,QAAQ,GAAG,GAAK,GAEpCqH,EAAOrH,EAAE,IAAMqH,EAAOrH,EAAE,GAAG,QAAQ,GAAG,GAAK,GAE3CqH,EAAOrH,EAAE,IAAMqH,EAAOrH,EAAE,GAAG,QAAQ,GAAG,GAAK,GAE3CqH,EAAOrH,EAAE,IAAMqH,EAAOrH,EAAE,GAAG,QAAQ,GAAG,GAAK,KAClDqH,EAAOrH,GAAK,MAKxB,OAAOqH,CACV,EAKGgE,EAAU,SAASpM,EAAK,CACxB,IAAImJ,EAAI6C,GAAU,KAAK,KAAMhM,CAAG,EAChC,GAAImJ,EACA,IAAI+C,EAAO/C,EAAE,KAGjB,GAAI+C,EAAM,CAIN,QAHIG,EAAU,EAEVxH,EAAIkH,GAAU,KAAK,KAAM/L,CAAG,EACvBe,EAAI,EAAGA,EAAI8D,EAAE,OAAQ9D,IAC1BoI,EAAI6C,GAAU,KAAK,KAAMnH,EAAE9D,EAAE,EACzBoI,GAAKkB,EAAUlB,EAAE,IAAI,GACrBkD,IAGJA,EAAU,IACVH,EAAO,UAEd,CAED,OAAOA,CACV,EAKGI,EAAQ,UAAW,CAEf,OAAOf,GAAO,KAAK,QAAQ,KAAK,SAAY,YAC5CA,GAAO,KAAK,QAAQ,KAAK,QAAQ,KAAK,KAAM,KAAK,MAAM,KAAK,SAAS,EACrE,KAAK,aAEL,KAAK,OAAO,KAAK,OAAS,KAAK,OAAO,KAAK,OAC3C,KAAK,QAEZ,EAEGgB,EAAgB,SAAS7G,EAAK,CAC9B,OAAQ,IAAI,CAACA,GAAK,QAAQ,8BACxB,SAASnF,EAAEC,EAAEC,EAAEC,EAAEC,EAAG,CAClB,OAAOA,EAAI,EACPH,EAAI,KAAO,MAAM,EAAEG,EAAEF,EAAE,MAAM,EAAE,KAAK,CAAC,EAAIA,EAAIC,EAC7CF,EAAIC,EAAIC,EAAI,MAAMC,EAAED,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CACtD,CAAW,CACN,EAOG4D,EAAM,SAAS3D,EAAG6L,EAAQC,EAAc,CAGxC,IAAI5H,EAAI,KACJ8B,EAAI,CAEJ,MAAO,KAEP,MAAO,KAEP,QAAS,CAAE,EAEX,OAAQ,CAAE,EAEV,MAAO,EAEP,SAAU,EAEV,KAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAElB,OAAQ,CACX,EAGD,GAAI,OAAOhG,GAAM,UAiCb,GA/BAgG,EAAE,MAAQhG,EAAE,OAEZgG,EAAE,MAAQiE,EAAM,KAAKjK,EAAE,MAAM,EAE7BgG,EAAE,MAAQkE,EAAM,KAAKlK,EAAE,MAAM,GAEzBkE,EAAIlE,EAAE,OAAO,aAAa,WAAW,KACrCgG,EAAE,KAAO9B,IAGTA,EAAIlE,EAAE,OAAO,aAAa,WAAW,KACrCgG,EAAE,KAAO9B,GAGTlE,EAAE,OAAO,MACLA,EAAE,OAAO,KAAK,UACdgG,EAAE,QAAUhG,EAAE,OAAO,KAAK,SAE1BA,EAAE,OAAO,KAAK,SACdgG,EAAE,OAAShG,EAAE,OAAO,KAAK,UAIzBkE,EAAIlE,EAAE,OAAO,aAAa,aAAa,KACvCgG,EAAE,OAAS9B,EACP8B,EAAE,OACFA,EAAE,QAAQ,MAAQA,EAAE,OAK5BhG,EAAE,OAAO,YAAcA,EAAE,OAAO,WAAW,OAC3C,QAASI,EAAI,EAAGA,EAAIJ,EAAE,OAAO,WAAW,OAAQI,IAAK,CACjD,IAAI4D,EAAIhE,EAAE,OAAO,WAAWI,GAAG,KAC3BmE,EAAIvE,EAAE,OAAO,WAAWI,GAAG,MAC3B4D,EAAE,OAAO,EAAE,CAAC,GAAK,SACjBgC,EAAE,QAAQhC,EAAE,OAAO,CAAC,GAAKO,EAEhC,MAEF,CAEH,GAAI,OAAOsH,GAAW,SAElB7F,EAAE,KAAO6F,MAIT,SADI7H,EAAI,OAAO,KAAK6H,CAAM,EACjBzL,EAAI,EAAGA,EAAI4D,EAAE,OAAQ5D,IAC1B4F,EAAEhC,EAAE5D,IAAMyL,EAAO7H,EAAE5D,IAIvB,OAAOJ,GAAO,WAEd2J,EAAW,KAAK3D,EAAGA,EAAE,IAAI,EAEzBhG,GAAK,GAAGA,GAAG,QAAQ,IAAKgG,EAAE,QAAQ,OAAO,GAI7CA,EAAE,MAAQhG,EAENgG,EAAE,QAEFiE,EAAM,KAAKjE,EAAE,MAAOhG,CAAC,EAErB4F,EAAQ,MAAMI,EAAE,KAAK,EAErBA,EAAE,MAAQkE,EAAM,KAAKlE,EAAE,KAAK,EAEnC,CAGD,GAAI,CAAEyD,EAAUzD,EAAE,KAAK,IAAMA,EAAE,MAAQA,EAAE,QAAS,CAE9C,GAAIA,EAAE,KAAM,CAKR,GAHAA,EAAE,KAAOA,EAAE,KAAK,QAAQ,IAAI,OAAO,MAAM,EAAE,KAAK,EAChDA,EAAE,KAAOA,EAAE,KAAK,QAAQ,IAAI,OAAO,SAAS,EAAE,EAAE,EAChDA,EAAE,KAAOA,EAAE,KAAK,QAAQ,IAAI,OAAO,OAAO,EAAE,KAAK,EAC7CA,EAAE,KAAK,QAAQ,GAAG,IAAM,GAAI,CAC5B,IAAI9B,EAAI8B,EAAE,KAAK,MAAM,GAAG,EACxBA,EAAE,KAAO9B,EAAE,EACd,CAED,GAAI8B,EAAE,KAAK,QAAQ,IAAI,IAAM,GAAI,CAC7B,IAAIjG,EAAIiG,EAAE,KAAK,MAAM,GAAG,EACpBjG,EAAE,KACE,OAAOC,GAAM,WACbD,EAAE,GAAKA,EAAE,GAAG,QAAQ,IAAI,OAAO,MAAM,EAAG,EAAE,EAC1CA,EAAE,GAAKA,EAAE,GAAG,QAAQ,IAAI,OAAO,MAAM,EAAG,EAAE,GAE9CA,EAAE,GAAKA,EAAE,GAAG,QAAQ,IAAK,GAAI,EAC7BA,EAAE,GAAKA,EAAE,GAAG,QAAQ,IAAI,OAAO,KAAK,EAAG,EAAE,EACzCA,EAAE,GAAKA,EAAE,GAAG,QAAQ,IAAI,OAAO,IAAI,EAAG,EAAE,EACxCA,EAAE,GAAKA,EAAE,GAAG,QAAQ,IAAI,OAAO,IAAI,EAAG,EAAE,EACxCA,EAAE,GAAKA,EAAE,GAAG,QAAQ,UAAU,SAAS,EACvCA,EAAE,GAAKA,EAAE,GAAG,QAAQ,SAAS,QAAQ,EACrCA,EAAE,GAAKA,EAAE,GAAG,QAAQ,QAAQ,OAAO,EACnCA,EAAE,GAAKA,EAAE,GAAG,QAAQ,UAAU,SAAS,EACvCA,EAAE,GAAKA,EAAE,GAAG,QAAQ,SAAS,QAAQ,EACrCA,EAAE,GAAKA,EAAE,GAAG,QAAQ,QAAQ,OAAO,GAEvCiG,EAAE,KAAOjG,EAAE,EACd,CAED,GAAIiG,EAAE,KAAK,QAAQ,IAAI,IAAM,GAAI,CAC7B,IAAIjG,EAAIiG,EAAE,KAAK,MAAM,GAAG,EACxBjG,EAAE,GAAKA,EAAE,GAAG,QAAQ,IAAI,OAAO,KAAK,EAAG,EAAE,EACzCiG,EAAE,KAAOjG,EAAE,EACd,CAEKiG,EAAE,OACJA,EAAE,KAAOyF,EAAQ,KAAKzF,EAAGA,EAAE,IAAI,GAGnCA,EAAE,OAASoF,GAAU,KAAKpF,EAAGA,EAAE,IAAI,CACtC,CAGD,GAAI,OAAOhG,GAAO,UAAa,CAAEA,EAAE,WAAa,CAAEA,EAAE,UAAU,QAAQ,QAAQ,GAAK,CAAEA,EAAE,UAAU,QAAQ,QAAQ,EAE7G,GAAIgG,EAAE,OACF,GAAIA,EAAE,MACFgE,EAAO,KAAKhE,EAAGA,EAAE,MAAOhG,CAAC,MAEzB,KAAI+L,GAAWhC,EAAY,KAAK/D,EAAGA,EAAE,KAAK,MAE3C,CAMH,IAJAA,EAAE,QAAUwF,EAAW,KAAKxF,EAAGA,EAAE,MAAM,EACvCA,EAAE,MAAQhG,EAGHgG,EAAE,SAAWA,EAAE,MAAM,QAAU,OAAOA,EAAE,OAAOA,EAAE,OAAY,KAEhE2F,EAAM,KAAK3F,CAAC,EAIhB,IAAI+F,GAAW/F,EAAE,OAAO,KAAK,EAAE,EAG/B,GAAI0D,EAAU1D,EAAE,IAAI,GAAK+F,KAAa,GAAI,CAEtC,KAAO,OAAO/F,EAAE,OAAOA,EAAE,OAAY,KAAa,CAC9C,IAAI9B,EAAImH,GAAU,KAAKrF,EAAGA,EAAE,OAAOA,EAAE,MAAM,EACvC9B,GAAKA,EAAE,MAAQ,YACf8B,EAAE,OAAOA,EAAE,OAASA,EAAE,OAAOA,EAAE,QAEnCA,EAAE,OACL,CAED,IAAIqE,GAAgB,EAC5C,KACwB,KAAIA,GAAgB,GAOxB,GAHA0B,GAAW/F,EAAE,OAAO,KAAK,EAAE,EAGvBA,EAAE,MAAO,CAET,GADA9B,EAAI6H,GAAS,OAAS/F,EAAE,MAAM,OAC1B9B,EAAI,EACJ,IAAI8H,GAAQhG,EAAE,MAAQ9B,MAEtB,KAAI8H,GAAQhG,EAAE,MAElBiE,EAAM,KAAKjE,EAAE,MAAO+F,GAAUC,GAAO3B,EAAa,CACrD,CACJ,CAIL,GAAIrE,EAAE,MAAO,CACT,IAAIiG,EAAQ,KACZ,GAAIvC,EAAU1D,EAAE,IAAI,EAAG,CACnB,IAAIzB,EAAI0F,EAAM,KAAKjE,EAAE,KAAK,EAE1BA,EAAE,OAASmE,EAAQ,KAAKnE,EAAGzB,CAAC,EAExByB,EAAE,MAAQ,eAAiB,GAAGzB,GAAG,QAAQ,GAAG,IAAM,GAClD0H,EAAQtI,EAAI,gBAAgBqC,EAAE,OAAS,GAAG,EAE1CiG,EAAQjG,EAAE,MAElC,MAA2BA,EAAE,MAAQ,aACjBiG,EAAQ3C,EAAQ,KAAKtD,CAAC,EAElBA,EAAE,KAAK,IAAMA,EAAE,KAAK,IAAMA,EAAE,KAAK,IACjCA,EAAE,MAAM,aAAa,iBAAkB,EAAI,GAI/CiG,GACAjG,EAAE,MAAM,aAAa,aAAciG,CAAK,CAE/C,CAED,GAAIF,KAAa,OACb,OAAID,EACO9F,EAEA+F,EAGlB,CACJ,EAED,OAAApI,EAAI,gBAAkB,SAASoB,EAAK,CAChC,GAAI,OAAOA,GAAQ,UAAY,CAAC,OAAO,UAAUA,CAAG,EAAG,CACnD,MAAMR,EAAIQ,EAAI,SAAU,EAAC,MAAM,GAAG,EAElC,GAAIR,EAAE,IAAMA,EAAE,GAAG,OAAS,GAAI,CAC1B,IAAI2H,EAAK,EACT,MAAMC,EAAK5H,EAAE,GAAGA,EAAE,GAAG,OAAS,GAE9B,GAAI4H,GAAM,GAAKA,GAAM,EAAG,CACpB,QAAS/L,EAAImE,EAAE,GAAG,OAAS,EAAGnE,EAAI,EAAGA,IACjC,GAAI8L,GAAM,GAAK3H,EAAE,GAAGnE,IAAM+L,GAEtB,GADAD,IACIA,EAAK,EACL,UAED,CACHA,EAAK,EACL,KACH,CAGL,GAAIA,EACA,OAAO,WAAW,WAAWnH,CAAG,EAAE,QAAQR,EAAE,GAAG,OAAS,CAAC,CAAC,CAEjE,CACJ,CACJ,CAED,OAAOQ,CACV,EAGDpB,EAAI,QAAU8H,EAGd9H,EAAI,QAAU,SAAStE,EAAK2G,EAAG,CAC3B,OAAMA,IACFA,EAAI,CAAA,GAEDoF,GAAU,KAAKpF,EAAG3G,CAAG,CAC/B,EAKDsE,EAAI,MAAQ,SAAS3D,EAAG,CACpB,IAAIuE,EAAI0F,EAAM,KAAKjK,EAAE,MAAM,EACvBA,EAAE,IAAI,QAAU,IAChBuE,GAAKvE,EAAE,KAEXiK,EAAM,KAAKjK,EAAE,OAAQ2D,EAAIY,EAAGvE,EAAE,OAAO,aAAa,WAAW,CAAC,CAAC,CAClE,EAKD2D,EAAI,IAAM,SAASe,EAAO9D,EAAMiJ,EAAS,CACrC,OAAOlG,EAAIe,EAAO,CAAE,KAAM9D,EAAM,QAASiJ,CAAO,CAAE,CACrD,EAKDlG,EAAI,QAAU,SAASY,EAAG2B,EAAS4F,EAAc,CAI7C,GAHItC,EAAQjF,CAAC,GAGT,OAAO2B,GAAY,SACnB,OAAO3B,EAeX,GAbI2B,EAAU,OAAO,OAAO,CAAE,EAAEA,CAAO,EAE7BA,EAAQ,UACVA,EAAQ,QAAU,IAKtB,CAAEA,EAAQ,MAAQA,EAAQ,SAC1BA,EAAQ,KAAOA,EAAQ,QAIvBA,EAAQ,KAAM,CACd,GAAIA,EAAQ,KAAK,QAAQ,GAAG,IAAM,GAAI,CAClC,IAAIhC,EAAIgC,EAAQ,KAAK,MAAM,GAAG,EAC9BA,EAAQ,KAAOhC,EAAE,EACpB,CACDgC,EAAQ,KAAOA,EAAQ,KAAK,QAAQ,IAAI,OAAO,MAAM,EAAE,KAAK,EAC5DA,EAAQ,KAAOA,EAAQ,KAAK,QAAQ,IAAI,OAAO,SAAS,EAAE,EAAE,EAC5DA,EAAQ,KAAOA,EAAQ,KAAK,QAAQ,IAAI,OAAO,OAAO,EAAE,KAAK,CAChE,CAGDyD,EAAW,KAAKzD,EAASA,EAAQ,IAAI,EAErC,IAAIqF,EAAO,KACP7G,EAAQ,KAQZ,GANIwB,EAAQ,MAAQ,WAAaA,EAAQ,QAAQ,OAAS,UACtDqF,EAAO,aACArF,EAAQ,OACfqF,EAAOE,EAAQ,KAAKvF,EAASA,EAAQ,IAAI,GAGzCqF,IAAS,UAAW,CACpB,IAAIvF,EAAIrC,EAAIY,EAAG2B,EAAS,EAAI,EAE5BxB,EAAQH,CACpB,SAAmBgH,IAAS,WAAY,CACxBhH,aAAa,OACbA,EAAIZ,EAAI,cAAcY,EAAG2B,EAAQ,IAAI,GAGzC,IAAIF,EAAIrC,EAAIY,EAAG2B,EAAS,EAAI,EAExBN,EAAQ,UAAUrB,CAAC,EACnBG,EAAQH,EAERG,EAAQ6E,EAAY,KAAKvD,CAAC,CAE1C,SAAmBuF,IAAS,aAAc,CAC9B7G,EAAQH,EACJ,OAAOA,GAAO,WACdG,EAAQ,OAAOA,CAAK,GAExB,IAAIsB,EAAIE,CACpB,KAAe,CACHxB,EAAQyF,EAAQ,KAAKjE,EAAS3B,CAAC,EAE3BgH,IAAS,eAAiB,GAAGhH,GAAG,QAAQ,GAAG,IAAM,KACjDG,GAAS,KAEb,IAAIsB,EAAIE,CACX,CAQD,OANAF,EAAE,MAAQtB,EAEN,CAAEsB,EAAE,MAAQuF,IACZvF,EAAE,KAAOuF,GAGTO,EACO9F,EAEAtB,CAEd,EAKDf,EAAI,OAAS,SAASe,EAAOwB,EAASkG,EAAUC,EAAQ,CAKpD,GAJI7C,EAAQ9E,CAAK,GAIb,OAAOwB,GAAY,SACnB,OAAOxB,EAeX,GAbIwB,EAAU,OAAO,OAAO,CAAE,EAAEA,CAAO,EAE7BA,EAAQ,UACVA,EAAQ,QAAU,IAKtB,CAAEA,EAAQ,MAAQA,EAAQ,SAC1BA,EAAQ,KAAOA,EAAQ,QAIvBA,EAAQ,KAAM,CACd,GAAIA,EAAQ,KAAK,QAAQ,GAAG,IAAM,GAAI,CAClC,IAAIhC,EAAIgC,EAAQ,KAAK,MAAM,GAAG,EACxBkG,IACFlI,EAAE,GAAKA,EAAE,GAAG,QAAQ,IAAI,OAAO,MAAM,EAAG,EAAE,EAC1CA,EAAE,GAAKA,EAAE,GAAG,QAAQ,IAAI,OAAO,MAAM,EAAG,EAAE,GAE9CgC,EAAQ,KAAOhC,EAAE,EACpB,CACDgC,EAAQ,KAAOA,EAAQ,KAAK,QAAQ,IAAI,OAAO,MAAM,EAAE,KAAK,EAC5DA,EAAQ,KAAOA,EAAQ,KAAK,QAAQ,IAAI,OAAO,SAAS,EAAE,EAAE,EAC5DA,EAAQ,KAAOA,EAAQ,KAAK,QAAQ,IAAI,OAAO,OAAO,EAAE,KAAK,CAChE,CAED,IAAIqF,EAAO,KACPrF,EAAQ,MAAQ,WAAaA,EAAQ,QAAQ,OAAS,UACtDqF,EAAO,aACArF,EAAQ,KACfqF,EAAOE,EAAQ,KAAKvF,EAASA,EAAQ,IAAI,EAClCxB,aAAiB,OACxB6G,EAAO,YAIX,IAAIe,EAAiB,GAErB,GAAIf,GAAO,YAAcrF,EAAQ,MAAQ,WAAY,CACjD,IAAIhC,EAAIP,EAAI,cAAce,EAAOwB,EAAQ,IAAI,EACzChC,IACAQ,EAAQR,GAERgC,EAAQ,MAAQkG,IAChBE,EAAiB,GAEjC,SAEgB,OAAO5H,GAAW,UAAYvF,EAAQ,UAAUuF,CAAK,IACrDA,EAAQ,OAAOA,CAAK,GAGpB6G,IAAS,eACT7G,EAAQf,EAAI,gBAAgBe,EAAM,GAAG,GAIrC,OAAOA,GAAW,SAAU,CAC5B,IAAIR,EAAI,KACR,GAAIgC,EAAQ,MAAQkG,EAAU,CAC1B,IAAIrM,EAAI4J,EAAW,KAAKzD,EAASA,EAAQ,IAAI,EAC7C,GAAIqF,IAAS,aACT,GAAIrF,EAAQ,KAAK,QAAQnG,CAAC,IAAM,GAAI,CAChC,IAAIwM,EAAMrG,EAAQ,KAAK,MAAM,GAAG,EAChCqG,EAAMA,EAAI,GAAG,MAAMxM,CAAC,EACpBwM,EAAO,GAAKA,EAAI,GAAG,MAAM,SAAS,EAClCA,EAAMA,EAAI,OACVrI,EAAIQ,EAAM,cAAc6H,CAAG,CACvD,MAC4BrI,EAAIQ,EAAM,cAAc,CAAC,MAE1B,CACH,GAAIwB,EAAQ,KAAK,QAAQnG,CAAC,IAAM,GAAI,CAChCA,EAAImG,EAAQ,KAAK,MAAMnG,CAAC,EACxBA,EAAK,GAAGA,EAAE,GAAG,MAAM,SAAS,EAC5BA,EAAIA,EAAE,OACNmE,EAAIQ,EAAM,QAAQ3E,CAAC,EACnB,IAAIiC,EAAI0C,EAAM,SAAU,EAAC,MAAM,GAAG,EAC9B8H,GAAWxK,EAAE,GACbwK,IAAYA,GAAS,OAASzM,GAAKyM,GAASA,GAAS,OAAO,KAAO,MACnEtI,EAAI,WAAWlC,EAAE,GAAK,IAAMwK,GAAW,GAAG,EAAE,QAAQzM,CAAC,EAErF,MACgC2E,EAAM,SAAU,EAAC,QAAQ3E,CAAC,IAAM,KAChCmE,EAAIQ,EAAM,QAAQ,CAAC,IAKtB,GAAGR,GAAG,QAAQ,GAAG,IAAM,KACxBA,EAAI0H,EAAc1H,CAAC,EAE1B,CACrB,SAA2BgC,EAAQ,QAAUkG,EAAU,CAEnC,IAAIrM,GAAK,GAAG2E,GAAO,MAAM,GAAG,EAC5B,GAAIwB,EAAQ,QAAS,CACb,OAAOnG,EAAE,GAAQ,MACjBA,EAAE,GAAK,IAEX,IAAIc,GAAMd,EAAE,GAAG,OACf,GAAImG,EAAQ,QAAQ,sBAAwBrF,GACxC,QAAST,EAAI,EAAGA,EAAI8F,EAAQ,QAAQ,sBAAwBrF,GAAKT,IAC7DL,EAAE,IAAM,GAGnB,CACKA,EAAE,GAAG,OAGPmE,EAAInE,EAAE,KAAK,GAAG,EAFdmE,EAAInE,EAAE,GAIV,IAAIc,GAAMd,EAAE,GAAG,OACXmG,EAAQ,SAAWA,EAAQ,QAAQ,sBAAwBrF,KAC3DqD,EAAI,WAAWA,CAAC,EAAE,QAAQgC,EAAQ,QAAQ,qBAAqB,EAEvF,MACoBhC,EAAI0H,EAAclH,CAAK,EAGvBR,IAAM,OACNQ,EAAQR,EAERyF,EAAW,KAAKzD,EAASA,EAAQ,IAAI,EAEjCA,EAAQ,QAAQ,UAChBxB,EAAQA,EAAM,QAAQ,IAAKwB,EAAQ,QAAQ,OAAO,GAG1E,MACoBA,EAAQ,MAAQkG,IAChBE,EAAiB,IAK7B,GAAIA,EAAgB,CAChB,IAAI7D,GAAIvC,EAAQ,KAAK,OAASxB,EAAM,OACpC,GAAI+D,GAAI,EACJ,QAASrI,EAAI,EAAGA,EAAIqI,GAAGrI,IACnBsE,GAAS,GAGpB,CAED,GAAI6G,IAAS,aACT,GAAI,CAAEa,EACF1H,EAAQkH,EAAclH,CAAK,MAE3B,QAAOA,EAIf,GAAI6G,IAAS,WAAac,IAAW,IAAS,OAAO3H,GAAW,SAC5D,OAAOA,EAMX,GAHAA,EAAQf,EAAIe,EAAOwB,CAAO,EAGtBkG,GAAYb,IAAS,UAAW,CAChC,IAAIkB,GAAYvG,EAAQ,KAAK,MAAM,IAAI,OAAO,UAAU,CAAC,EACzD,GAAIuG,IAAaA,GAAU,SAAW,EAAG,CACrC,IAAIC,EAAaD,GAAU,GAAG,OAC9B,GAAIC,EAAa,EAEb,IADAhI,EAAQ,GAAKA,EACNA,EAAM,OAASgI,GAClBhI,EAAQ,IAAMA,CAGzB,CACJ,CAED,OAAOA,CACV,EAEDf,EAAI,IAAM,SAAS3D,EAAGwI,EAAG,CACrB,GAAIA,EAAG,CACHxI,EAAE,aAAa,YAAawI,CAAC,EAE7B,IAAIzB,EAAQ,IAAI,MAAM,QAAS,CAC3B,QAAS,GACT,WAAY,EAC5B,CAAa,EACD/G,EAAE,cAAc+G,CAAK,CACxB,CACJ,EAGDpD,EAAI,sBAAwB,SAAU2E,EAAMqE,EAAQ,CAChD,IAAI3G,EAAIrC,EAAI2E,EAAM,CAAE,KAAMqE,CAAM,EAAI,EAAI,EAGxC,GAAIrE,EAAO,GAAK,OAAOA,CAAI,GAAKA,IAAStC,EAAE,OAAO,KAAK,EAAE,IAAMA,EAAE,OAASA,EAAE,MAAQ,WAAY,CAC5F,IAAIjG,EAAI,IAAI,KAAK,KAAK,OAAOuI,EAAO,OAAS,MAAQ,GAAI,CAAC,EAC1D,OAAOvI,EAAE,YAAa,EAAG,IAAM6F,EAAQ,IAAI7F,EAAE,SAAU,CAAA,EAAI,IAAM6F,EAAQ,IAAI7F,EAAE,QAAO,CAAE,EAAI,WAC/F,CAED,IAAIoH,EAAW,GAMf,OAJInB,EAAE,QAAUA,EAAE,OAAO,SAAWA,EAAE,OAAO,QAAUA,EAAE,OAAOA,EAAE,OAAO,OAAS,GAAG,QAAUA,EAAE,OAAOA,EAAE,OAAO,OAAS,GAAG,SACzHmB,EAAW,IAGXnB,EAAE,KAAK,IAAMA,EAAE,KAAK,KAAOA,EAAE,KAAK,IAAMmB,IACnCnB,EAAE,KAAK,KACRA,EAAE,KAAK,GAAK,GAGTA,EAAE,KAAK,GAAK,IAAMJ,EAAQ,IAAII,EAAE,KAAK,EAAE,EAAI,IAAMJ,EAAQ,IAAII,EAAE,KAAK,EAAE,EAAI,IAAMJ,EAAQ,IAAII,EAAE,KAAK,EAAE,EAAI,IAAMJ,EAAQ,IAAII,EAAE,KAAK,EAAE,EAAI,IAAMJ,EAAQ,IAAII,EAAE,KAAK,EAAE,GAGvK,EACV,EAGDrC,EAAI,cAAgB,SAAUe,EAAOwB,EAAS,CAC1C,GAAI,CAACA,EACD,IAAIA,EAAU,CAAA,EAIlB,GAAIA,GAAW,OAAQA,GAAY,UAC/B,GAAIA,EAAQ,OACR,IAAIyG,EAASzG,EAAQ,eACdA,EAAQ,KACf,IAAIyG,EAASzG,EAAQ,SAGzB,KAAIyG,EAASzG,EAQjB,GALKyG,IACDA,EAAS,cAITA,EAAO,QAAQ,KAAK,GAAK,EAAG,CAC5B,IAAIlF,EAAS,EACb,GAAI/C,GAASkB,EAAQ,UAAUlB,CAAK,IAChC+C,EAAS,WAAW,GAAK,OAAO/C,CAAK,CAAC,EAClCiI,EAAO,QAAQ,IAAI,GAAK,GAAG,CAC3B,IAAIxM,GAAK,GAAKsH,GAAQ,MAAM,GAAG,EAC/B,GAAItH,EAAE,GAAI,CACN,IAAIJ,EAAI,GAAK,WAAW,KAAOI,EAAE,EAAE,EACnCJ,EAAI,WAAWA,EAAE,QAAQ,CAAC,CAAC,CACnD,KACwB,KAAIA,EAAI,EAEZ0H,EAAS,SAAStH,EAAE,EAAE,EAAI,IAAMyF,EAAQ,IAAI7F,CAAC,CAChD,CAEL,OAAO0H,CACV,CAGG/C,aAAiB,KACjBA,EAAQyE,EAAa,IAAIzE,CAAK,EACvBA,GAASkB,EAAQ,UAAUlB,CAAK,IACvCA,EAAQyE,EAAa,UAAUzE,CAAK,GAYxC,QARI2E,EAAS,CAAC,MAAO,KAAM,OAAQ,MAAO,KAAM,IAAK,IAAK,OAAQ,OAAQ,KAAM,IAAK,QAAS,KAAM,KAAM,KAAM,OAAQ,MAAO,KAAM,IAAK,QAAS,MAAO,QAAS,OAAQ,MAAO,KAAM,IAAK,GAAG,EAG5LrJ,EAAI,IAAI,OAAOqJ,EAAO,KAAK,GAAG,EAAG,IAAI,EAErCnF,EAAIyI,EAAO,MAAM3M,CAAC,EAGbI,GAAI,EAAGA,GAAI8D,EAAE,OAAQ9D,KACtB8D,EAAE9D,IAAG,YAAW,GAAM,OAElB8D,EAAE9D,GAAI,IAAM8D,EAAE9D,GAAI,GAAG,YAAW,EAAG,QAAQ,GAAG,GAAK,GAE5C8D,EAAE9D,GAAI,IAAM8D,EAAE9D,GAAI,GAAG,YAAa,EAAC,QAAQ,GAAG,GAAK,GAEnD8D,EAAE9D,GAAI,IAAM8D,EAAE9D,GAAI,GAAG,YAAa,EAAC,QAAQ,GAAG,GAAK,GAEnD8D,EAAE9D,GAAI,IAAM8D,EAAE9D,GAAI,GAAG,YAAa,EAAC,QAAQ,GAAG,GAAK,KAC1D8D,EAAE9D,IAAK,MAMnB,IAAI4F,GAAI,CACJ,OAAQ9B,CACX,EAGD,GAAIQ,EAAO,CACP,IAAI3E,EAAI,GAAK2E,EACTkI,GAAY7M,EAAE,QAAQ,GAAG,IAAM,GAAM,IAAM,IAC/CA,EAAIA,EAAE,MAAM6M,EAAQ,EAEpB,IAAIzM,EAAI,EACJqI,EAAI,EACJC,EAAI,EAEJ1I,EAAE,KACFI,EAAIJ,EAAE,GAAG,MAAM,GAAG,EAClByI,EAAIrI,EAAE,GAAKA,EAAE,GAAK,EAClBsI,EAAItI,EAAE,GAAKA,EAAE,GAAK,EAClBA,EAAIA,EAAE,GAAKA,EAAE,GAAK,GAGtBJ,EAAIA,EAAE,GAAG,MAAM,GAAG,EAElB,IAAI8M,GAAM,IAAI,KAAK9M,EAAE,GAAIA,EAAE,GAAI,CAAC,EAAE,QAAO,EAEzC,GAAIA,EAAE,IAAMA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAK,GAAKA,EAAE,GAAK,GAAKA,EAAE,GAAK,IAAMA,EAAE,GAAK,GAAKA,EAAE,IAAM8M,GAAK,CAGtF7G,GAAE,KAAO,CAACjG,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAII,EAAGqI,EAAGC,CAAC,EAGnCzC,GAAE,MAAQ,GA8FV,QA3FI8G,EAAW,IAAI,KAAK9G,GAAE,KAAK,GAAIA,GAAE,KAAK,GAAK,EAAGA,GAAE,KAAK,GAAIA,GAAE,KAAK,GAAIA,GAAE,KAAK,GAAIA,GAAE,KAAK,EAAE,EAGxF+G,GAAM,SAAU3M,GAAG,CAEnB,IAAI8D,GAAI,KAAK,OAAO9D,IAEhBqI,GAAIvE,GAAE,cACNK,GAAI,KAEJkE,KAAM,OACNlE,GAAI,KAAK,KAAK,GACPkE,KAAM,MACblE,GAAI,KAAK,KAAK,GAAG,UAAU,EAAG,CAAC,EACxBkE,KAAM,KACblE,GAAI,KAAK,KAAK,GAAG,UAAU,EAAG,CAAC,EACxBkE,KAAM,IACblE,GAAI,KAAK,KAAK,GAAG,UAAU,EAAG,CAAC,EACxBL,KAAM,MACbK,GAAI4E,EAAa,OAAO2D,EAAS,SAAQ,GAAI,OAAO,EAAG,CAAC,EAAE,YAAW,EAC9D5I,KAAM,MACbK,GAAI4E,EAAa,OAAO2D,EAAS,SAAQ,GAAI,OAAO,EAAG,CAAC,EAAE,YAAW,EAC9D5I,KAAM,QACbK,GAAI4E,EAAa,OAAO2D,EAAS,SAAU,GAAE,cACtC5I,KAAM,QACbK,GAAI4E,EAAa,OAAO2D,EAAS,SAAU,GAAE,cACtCrE,KAAM,QACblE,GAAI4E,EAAa,OAAO2D,EAAS,SAAU,GAAE,OAAO,EAAG,CAAC,EACjDrE,KAAM,QAAUvE,KAAM,QAC7BK,GAAI4E,EAAa,OAAO2D,EAAS,SAAU,GACpCrE,KAAM,OAASvE,IAAK,MAC3BK,GAAI4E,EAAa,OAAO2D,EAAS,SAAU,GAAE,OAAO,EAAG,CAAC,EACjDrE,KAAM,KACblE,GAAIqB,EAAQ,IAAI,KAAK,KAAK,EAAE,EACrB6C,KAAM,IACblE,GAAIuI,EAAS,SAAU,EAAG,EACnB5I,KAAM,MACbK,GAAI4E,EAAa,SAAS2D,EAAS,OAAQ,GAAE,cACtC5I,KAAM,MACbK,GAAI4E,EAAa,SAAS2D,EAAS,OAAQ,GAAE,cACtCrE,KAAM,QAAUvE,IAAK,MAC5BK,GAAI4E,EAAa,SAAS2D,EAAS,OAAQ,GACpCrE,KAAM,MACblE,GAAI4E,EAAa,SAAS2D,EAAS,OAAQ,GAAE,OAAO,EAAG,CAAC,EACjDrE,KAAM,KACblE,GAAIqB,EAAQ,IAAI,KAAK,KAAK,EAAE,EACrB6C,KAAM,IACblE,GAAI,SAAS,KAAK,KAAK,EAAE,EAClBkE,KAAM,IACblE,GAAI,KAAK,OAAOuI,EAAS,WAAa,GAAK,CAAC,EACrCrE,KAAM,QAAUA,KAAM,MAC7BlE,GAAI,KAAK,KAAK,GACVA,GAAI,IAAM,KAAK,OAAO,QAAQ,OAAO,IAAM,KAC3CA,IAAK,IAETA,GAAIqB,EAAQ,IAAIrB,EAAC,GACVkE,KAAM,OACT,KAAK,KAAK,GAAK,GACflE,GAAIqB,EAAQ,IAAI,KAAK,KAAK,GAAK,EAAE,EAEjCrB,GAAIqB,EAAQ,IAAI,KAAK,KAAK,EAAE,EAEzB6C,KAAM,KACblE,GAAI,KAAK,KAAK,GACVA,GAAI,IAAM,KAAK,OAAO,QAAQ,OAAO,IAAM,KAC3CA,IAAK,GACLA,GAAIqB,EAAQ,IAAIrB,EAAC,IAEdkE,KAAM,KACblE,GAAIqB,EAAQ,IAAI,KAAK,KAAK,EAAE,EACrB6C,KAAM,KACblE,GAAIqB,EAAQ,IAAI,KAAK,KAAK,EAAE,EACrB6C,KAAM,KACblE,GAAIuI,EAAS,kBACNrE,KAAM,QACT,KAAK,KAAK,IAAM,GAChBlE,GAAI,KAEJA,GAAI,KAEDkE,KAAM,OACblE,GAAI4E,EAAa,SAAS2D,EAAS,OAAQ,IAG3CvI,KAAM,KACN,KAAK,MAAMnE,IAAK,KAAK,OAAOA,IAE5B,KAAK,MAAMA,IAAKmE,EAEvB,EAEQnE,GAAI,EAAGA,GAAI4F,GAAE,OAAO,OAAQ5F,KACjC2M,GAAI,KAAK/G,GAAG5F,EAAC,EAGjBsE,EAAQsB,GAAE,MAAM,KAAK,EAAE,CACvC,MACgBtB,EAAQ,EAEf,CAED,OAAOA,CACV,EAEMf,CACV,CAE4B,IAAI/C,GAAQwI,GAAI,EAU7C,SAAS4D,IAAW,CAChB,IAAI9F,EAAa,SAAUvC,EAAIuB,EAAS,CAEpC,GAAIvB,EAAG,SACH,OAAOA,EAAG,SAAS,WAAWuB,EAAS,EAAI,EAI/C,IAAIvC,EAAM,CAAC,KAAM,UAAU,EAC3BA,EAAI,QAAU,GAGdA,EAAI,KAAO,KAKXA,EAAI,WAAa,SAAUuC,EAAS+G,EAAO,CAEvC,IAAI9G,EAAW,CAEX,KAAM,UAEN,WAAY,KAEZ,YAAa,KAEb,OAAQ,aAER,SAAU,GAEV,MAAO,GAEP,KAAM,GAEN,YAAa,GAEb,YAAa,GAEb,OAAQgD,EAAa,YACrB,WAAYA,EAAa,OACzB,SAAUA,EAAa,SACvB,SAAUhF,EAAW,UAAU,MAAM,EACrC,UAAWA,EAAW,UAAU,OAAO,EACvC,WAAYA,EAAW,UAAU,QAAQ,EAEzC,MAAO,KAEP,WAAY,GAEZ,OAAQ,GAER,OAAQ,KACR,QAAS,KACT,SAAU,KACV,SAAU,KAEV,KAAM,KACN,SAAU,KAEV,SAAU,KAEV,SAAU,GAEV,WAAY,EACf,EAGD,QAASkC,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,IAE5B,OAAQ1C,EAAI,QAAQ0C,GAAc,KAAe4G,IAAU,MAC3DtJ,EAAI,QAAQ0C,GAAYF,EAASE,IA2C7C,GArCI1C,EAAI,QAAQ,aAAe,GAC3BuJ,EAAc,MAAM,QAAU,OAE9BA,EAAc,MAAM,QAAU,GAI9BvJ,EAAI,QAAQ,SACZgB,EAAG,aAAa,WAAY,UAAU,EAEtCA,EAAG,gBAAgB,UAAU,EAI7BhB,EAAI,QAAQ,YACZgB,EAAG,aAAa,cAAehB,EAAI,QAAQ,WAAW,EAEtDgB,EAAG,gBAAgB,aAAa,EAGhCiB,EAAQ,UAAUjC,EAAI,QAAQ,KAAK,GAAKA,EAAI,QAAQ,MAAQ,IAC5DA,EAAI,QAAQ,MAAQuD,EAAU,UAAUvD,EAAI,QAAQ,KAAK,EAEzDA,EAAI,QAAQ,SAAW,WAI3BuJ,EAAc,UAAYvJ,EAAI,QAAQ,UACtCwJ,EAAgB,UAAYxJ,EAAI,QAAQ,SACxCyJ,GAA6B,UAAYzJ,EAAI,QAAQ,WAGjDA,EAAI,QAAQ,QACZgB,EAAG,aAAa,YAAahB,EAAI,QAAQ,OAAO,YAAW,CAAE,EAI7D,CAACA,EAAI,QAAQ,OAASA,EAAI,QAAQ,MAClC,IAAIe,EAAQwC,EAAU,UAEtB,KAAIxC,EAAQf,EAAI,QAAQ,MAI5B,OAAIe,IAEAf,EAAI,QAAQ,MAAQ,KAEpBA,EAAI,SAASe,CAAK,GAGff,CACV,EAKDA,EAAI,KAAO,SAAUe,EAAO,CACxB,GAAI,CAACoI,EAAS,UAAU,SAAS,iBAAiB,GAC1C,CAACA,EAAS,UAAU,SAAS,kBAAkB,EAAG,CAqBlD,GAnBA5F,EAAU,QAAUvD,EAEpBS,EAAST,EAAK,EAAI,EAElBA,EAAI,QAAO,EAEPA,EAAI,QAAQ,MAAQ,qBACpBA,EAAI,UAAS,EAGbA,EAAI,QAAQ,OACZ0J,EAAmB,MAAQ1J,EAAI,KAAK,GACpC2J,EAAkB,MAAQ3J,EAAI,KAAK,IAIvCmJ,EAAS,UAAU,IAAI,iBAAiB,EAGpClH,EAAQ,eAAgB,EAAG,KAAOjC,EAAI,QAAQ,WAC9CmJ,EAAS,UAAU,IAAI,oBAAoB,EAE3C1E,GAAU,YAAYmF,EAAiB,CAAC,MACrC,CACHT,EAAS,UAAU,OAAO,oBAAoB,EAE9C,IAAIU,EAAO7I,EAAG,wBACV8I,EAAcF,EAAgB,wBAElC,GAAI5J,EAAI,QAAQ,SACZ+J,EAAkB,MAAM,SAAW,QAC/B,OAAO,YAAcF,EAAK,OAASC,EAAY,OAC/CC,EAAkB,MAAM,IAAOF,EAAK,KAAOC,EAAY,OAAS,GAAM,KAEtEC,EAAkB,MAAM,IAAOF,EAAK,IAAMA,EAAK,OAAS,EAAK,KAEjEE,EAAkB,MAAM,KAAOF,EAAK,KAAO,SACxC,CACH,GAAI,OAAO,YAAcA,EAAK,OAASC,EAAY,OAAQ,CACvD,IAAI,EAAI,IAAMD,EAAK,OAASC,EAAY,OAAS,GAC7C,EAAID,EAAK,IAAM,IACf,EAAI,IAAMA,EAAK,IAAMA,EAAK,SAE9BE,EAAkB,MAAM,IAAM,EAAI,IAClE,MACgCA,EAAkB,MAAM,IAAM,EAAI,KAGtC,GAAI,OAAO,WAAaF,EAAK,KAAOC,EAAY,MAAO,CACnD,IAAI,EAAI,OAAO,YAAcD,EAAK,KAAOC,EAAY,MAAQ,IAC7DC,EAAkB,MAAM,KAAO,EAAI,IACnE,MACgCA,EAAkB,MAAM,KAAO,KAEtC,CACJ,CAGG,OAAQ/J,EAAI,QAAQ,QAAW,YAC/BA,EAAI,QAAQ,OAAOgB,CAAE,CAE5B,CAER,EAEDhB,EAAI,MAAQ,SAAUgK,EAAcC,EAAQ,CAIxC,GAHIjK,EAAI,QAAQ,aAAe,IAAQ,OAAOiK,EAAY,MACtDA,EAAS,IAETd,EAAS,UAAU,SAAS,iBAAiB,EAAG,CAChD,GAAIc,IAAW,GAAO,CAClB,IAAIpI,EAAUsH,EAAS,cAAc,qBAAqB,EAE1D,GAAI,OAAQc,GAAW,SACnB,IAAIlJ,EAAQkJ,UACL,CAACpI,GAAWA,EAAQ,UAAU,SAAS,oBAAoB,EAClE,IAAId,EAAQf,EAAI,QAAQ,UAExB,KAAIe,EAAQf,EAAI,WAGpBA,EAAI,SAASe,CAAK,CACtC,KAAuB,CACH,IAAIA,EAAQf,EAAI,QAAQ,OAAS,GACjCA,EAAI,QAAQ,MAAQ,KACpBA,EAAI,SAASe,CAAK,CACrB,CAGG,CAACiJ,GAAgB,OAAQhK,EAAI,QAAQ,SAAY,YACjDA,EAAI,QAAQ,QAAQgB,CAAE,EAG1BmI,EAAS,UAAU,OAAO,iBAAiB,EAE3C1I,EAAST,EAAK,EAAK,EAEnBuD,EAAU,QAAU,IACvB,CAED,OAAOvD,EAAI,QAAQ,KACtB,EAEDA,EAAI,KAAO,UAAY,CAEfA,EAAI,QAAQ,MAAQ,SACpBA,EAAI,KAAK,GAAKA,EAAI,KAAK,GAAK,GAG5BA,EAAI,SAAQ,GACLA,EAAI,QAAQ,MAAQ,UAC3BA,EAAI,KAAK,GAAK,SAASA,EAAI,KAAK,EAAE,EAAI,EAEtCA,EAAI,UAAS,IAGTA,EAAI,KAAK,GAAK,GACdA,EAAI,KAAK,GAAKA,EAAI,KAAK,GAAK,EAC5BA,EAAI,KAAK,GAAK,IAEdA,EAAI,KAAK,GAAKA,EAAI,KAAK,GAAK,EAIhCA,EAAI,QAAO,EAElB,EAEDA,EAAI,KAAO,UAAY,CAEfA,EAAI,QAAQ,MAAQ,SACpBA,EAAI,KAAK,GAAK,SAASA,EAAI,KAAK,EAAE,EAAI,GAGtCA,EAAI,SAAQ,GACLA,EAAI,QAAQ,MAAQ,UAC3BA,EAAI,KAAK,GAAK,SAASA,EAAI,KAAK,EAAE,EAAI,EAEtCA,EAAI,UAAS,IAGTA,EAAI,KAAK,GAAK,IACdA,EAAI,KAAK,GAAK,SAASA,EAAI,KAAK,EAAE,EAAI,EACtCA,EAAI,KAAK,GAAK,GAEdA,EAAI,KAAK,GAAK,SAASA,EAAI,KAAK,EAAE,EAAI,EAI1CA,EAAI,QAAO,EAElB,EAKDA,EAAI,SAAW,UAAY,CAEvB,IAAIe,EAAQ,IAAI,OAAO,YAAa,EAAC,OAAO,EAAG,EAAE,EAEjD,OAAAf,EAAI,SAASe,CAAK,EAEXA,CACV,EAEDf,EAAI,SAAW,SAAUmC,EAAK,CACrBA,IACDA,EAAM,GAAKA,GAGf,IAAIiG,EAAWjG,EACX+H,EAAWlK,EAAI,QAAQ,MAE3B,GAAIkK,GAAY9B,EAAU,CAEtB,GAAKA,EAKE,CACSpI,EAAI,SAASoI,EAAUpI,EAAI,OAAO,EAC9C,IAAI2E,EAAOyD,EAAS,MAAM,GAAG,EACxBzD,EAAK,KACNA,EAAK,GAAK,YAEd,IAAII,EAAOJ,EAAK,GAAG,MAAM,GAAG,EACxBA,EAAOA,EAAK,GAAG,MAAM,GAAG,EACxBjH,EAAI,SAASiH,EAAK,EAAE,EACpBE,EAAI,SAASF,EAAK,EAAE,EACpBvI,EAAI,SAASuI,EAAK,EAAE,EACpBnI,EAAI,SAASuI,EAAK,EAAE,EACpBtI,EAAI,SAASsI,EAAK,EAAE,EACxB/E,EAAI,KAAO,CAACtC,EAAGmH,EAAGzI,EAAGI,EAAGC,EAAG,CAAC,EAC5B,IAAI0F,EAAMnC,EAAI,SAASoI,EAAUpI,EAAI,OAAO,EAGxCyG,EAAUlD,EAAU,IAAI,IAAI,KAAK7F,EAAGmH,EAAI,EAAGzI,CAAC,EAAG,EAAI,EAGvD,GAAI4D,EAAI,QAAQ,WAAY,CACxB,GAAI,CAACA,EAAI,QAAQ,WAAW,IAAMyG,GAAWzG,EAAI,QAAQ,WAAW,GAChE,IAAImK,GAAQ,OAEZ,KAAIA,GAAQ,GAGhB,GAAI,CAACnK,EAAI,QAAQ,WAAW,IAAMyG,GAAWzG,EAAI,QAAQ,WAAW,GAChE,IAAIoK,GAAQ,OAEZ,KAAIA,GAAQ,GAGVD,IAASC,IAIXpJ,EAAG,UAAU,OAAO,mBAAmB,EACvCA,EAAG,MAAQ,KAJXA,EAAG,UAAU,IAAI,mBAAmB,EACpCA,EAAG,MAAQR,EAAW,UAAU,8BAA8B,EAK1F,MACwBQ,EAAG,UAAU,OAAO,mBAAmB,EACvCA,EAAG,MAAQ,EAElB,KAjDc,CACXhB,EAAI,KAAO,KACX,IAAImC,EAAM,GACVnB,EAAG,UAAU,OAAO,mBAAmB,EACvCA,EAAG,MAAQ,EAC/B,CA+CgBhB,EAAI,QAAQ,MAAQoI,EAEhB,OAAQpI,EAAI,QAAQ,UAAa,YACjCA,EAAI,QAAQ,SAASgB,EAAIoH,EAAU8B,CAAQ,EAI3ClJ,EAAG,OAASmB,IACZnB,EAAG,MAAQmB,EACP,OAAQnB,EAAG,SAAY,YACvBA,EAAG,QAAQ,CACP,KAAM,QACN,OAAQA,EACR,MAAOA,EAAG,KACtC,CAAyB,EAGZ,CAEGhB,EAAI,OACJA,EAAI,QAAO,EAEPA,EAAI,QAAQ,MAAQ,qBACpBA,EAAI,UAAS,EAGxB,EAEDA,EAAI,SAAW,UAAY,CACvB,OAAIA,EAAI,KACAA,EAAI,QAAQ,KACLiC,EAAQ,IAAIjC,EAAI,KAAK,EAAE,EAAI,IAAMiC,EAAQ,IAAIjC,EAAI,KAAK,EAAE,EAAI,IAAMiC,EAAQ,IAAIjC,EAAI,KAAK,EAAE,EAAI,IAAMiC,EAAQ,IAAIjC,EAAI,KAAK,EAAE,EAAI,IAAMiC,EAAQ,IAAIjC,EAAI,KAAK,EAAE,EAAI,IAAMiC,EAAQ,IAAI,CAAC,EAElLA,EAAQ,IAAIjC,EAAI,KAAK,EAAE,EAAI,IAAMiC,EAAQ,IAAIjC,EAAI,KAAK,EAAE,EAAI,IAAMiC,EAAQ,IAAIjC,EAAI,KAAK,EAAE,EAAI,IAAMiC,EAAQ,IAAI,CAAC,EAAI,IAAMA,EAAQ,IAAI,CAAC,EAAI,IAAMA,EAAQ,IAAI,CAAC,EAGlK,EAEd,EAKDjC,EAAI,OAAS,SAAU6B,EAASjB,EAAG,CAC/B,GAAI,CAAAiB,EAAQ,UAAU,SAAS,oBAAoB,EAE5C,CACH,IAAIwI,EAAWlB,EAAS,cAAc,qBAAqB,EACvDkB,GACAA,EAAS,UAAU,OAAO,oBAAoB,EAElDxI,EAAQ,UAAU,IAAI,oBAAoB,EAEtCA,EAAQ,UAAU,SAAS,qBAAqB,GAChD7B,EAAI,KAAK,GAAKY,EACdZ,EAAI,KAAK,GAAK,GAEdA,EAAI,KAAK,GAAK6B,EAAQ,UAGrB7B,EAAI,QAAQ,MAGbA,EAAI,KAAK,GAAK0J,EAAmB,MACjC1J,EAAI,KAAK,GAAK2J,EAAkB,OAHhC3J,EAAI,MAAM,KAAM,EAAI,CAK3B,CAGDsK,GACH,EAKDtK,EAAI,MAAQ,UAAY,CAEpBA,EAAI,SAAS,EAAE,EACfA,EAAI,KAAO,KACXA,EAAI,MAAM,GAAO,EAAK,CACzB,EAKDA,EAAI,QAAU,UAAY,CAEtBA,EAAI,QAAQ,KAAO,OAGnB,IAAI2E,EAAO,IAAI,KAGX4F,EAAOvK,EAAI,MAAQiC,EAAQ,UAAUjC,EAAI,KAAK,EAAE,EAAIA,EAAI,KAAK,GAAK,SAAS2E,EAAK,YAAW,CAAE,EAC7F6F,EAAQxK,EAAI,MAAQiC,EAAQ,UAAUjC,EAAI,KAAK,EAAE,EAAIA,EAAI,KAAK,GAAK,SAAS2E,EAAK,SAAQ,CAAE,EAAI,EAC/FuE,EAAMlJ,EAAI,MAAQiC,EAAQ,UAAUjC,EAAI,KAAK,EAAE,EAAIA,EAAI,KAAK,GAAK,SAAS2E,EAAK,QAAO,CAAE,EACxF8F,EAAOzK,EAAI,MAAQiC,EAAQ,UAAUjC,EAAI,KAAK,EAAE,EAAIA,EAAI,KAAK,GAAK,SAAS2E,EAAK,SAAQ,CAAE,EAC1F+F,EAAM1K,EAAI,MAAQiC,EAAQ,UAAUjC,EAAI,KAAK,EAAE,EAAIA,EAAI,KAAK,GAAK,SAAS2E,EAAK,WAAU,CAAE,EAG/F3E,EAAI,KAAO,CAACuK,EAAMC,EAAOtB,EAAKuB,EAAMC,EAAK,CAAC,EAG1CC,EAAkB,UAAYJ,EAC9BK,EAAmB,UAAY5K,EAAI,QAAQ,OAAOwK,EAAQ,GAG1D,IAAIK,EAAyBlG,EAAK,SAAQ,GAAM6F,EAAQ,GAAO7F,EAAK,YAAW,GAAM4F,EACjFO,EAAanG,EAAK,UAGlBA,EAAO,IAAI,KAAK4F,EAAMC,EAAO,EAAG,EAAG,CAAC,EACpCO,EAAepG,EAAK,UAGpBA,EAAO,IAAI,KAAK4F,EAAMC,EAAQ,EAAG,EAAG,EAAG,CAAC,EACxCQ,EAAWrG,EAAK,OAAM,EAAK,EAG3B9D,GAAQb,EAAI,QAAQ,aAAe,EAGvCgL,EAAWA,EAAWnK,GAGtBoK,EAAa,UAAY,GAGzB,IAAIC,EAAM,SAAS,cAAc,IAAI,EACrCA,EAAI,aAAa,QAAS,QAAQ,EAClCD,EAAa,YAAYC,CAAG,EAG5B,QAASzO,GAAI,EAAGA,GAAI,EAAGA,KAAK,CACxB,IAAI0O,GAAO,SAAS,cAAc,IAAI,EACtCA,GAAK,UAAU,IAAI,mBAAmB,EACtCA,GAAK,UAAYnL,EAAI,QAAQ,SAASa,IAAO,OAAO,EAAG,CAAC,EACxDqK,EAAI,YAAYC,EAAI,EAEpBtK,KAEIA,GAAQ,IACRA,GAAQ,EAEf,CAOD,QAJIA,GAAQ,EACRzE,EAAI,EAGCM,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAExB,IAAIwO,EAAM,SAAS,cAAc,IAAI,EACrCA,EAAI,aAAa,QAAS,QAAQ,EAClCA,EAAI,MAAM,OAAS,OAGnB,QAASzO,GAAI,EAAGA,GAAI,EAAGA,KAAK,CAExB,IAAI0O,GAAO,SAAS,cAAc,IAAI,EAGtC,GAFAA,GAAK,UAAU,IAAI,mBAAmB,EAElCtK,IAASmK,GAAYnK,GAASmK,EAAWD,EAAe,CAExD3O,IACA+O,GAAK,UAAY/O,EAGbA,GAAK8M,GACLiC,GAAK,UAAU,IAAI,oBAAoB,EAIvCN,GAAyBC,GAAc1O,IACvC+O,GAAK,MAAM,WAAa,QAI5B,IAAI1E,EAAUlD,EAAU,IAAI,IAAI,KAAKgH,EAAMC,EAAQ,EAAGpO,CAAC,EAAG,EAAI,EAG9D,GAAI4D,EAAI,QAAQ,WAAY,CACxB,GAAI,CAACA,EAAI,QAAQ,WAAW,IAAMyG,GAAWzG,EAAI,QAAQ,WAAW,GAChE,IAAImK,GAAQ,OAEZ,KAAIA,GAAQ,GAGhB,GAAI,CAACnK,EAAI,QAAQ,WAAW,IAAMyG,GAAWzG,EAAI,QAAQ,WAAW,GAChE,IAAIoK,GAAQ,OAEZ,KAAIA,GAAQ,GAGVD,IAASC,IACXe,GAAK,UAAU,IAAI,oBAAoB,CAE9C,CACJ,CAEDD,EAAI,YAAYC,EAAI,EAEpBtK,IACH,CAGDoK,EAAa,YAAYC,CAAG,CAC/B,CAGGlL,EAAI,QAAQ,KACZoL,GAAqB,MAAM,QAAU,GAErCA,GAAqB,MAAM,QAAU,OAIzCd,GACH,EAEDtK,EAAI,UAAY,UAAY,CAExBA,EAAI,QAAQ,KAAO,SAGnB,IAAIuF,EAASvF,EAAI,QAAQ,OAGbA,EAAI,QAAQ,MAGxB,IAAI2E,EAAO,IAAI,KACX0G,EAAc,SAAS1G,EAAK,YAAa,CAAA,EACzC2G,EAAe,SAAS3G,EAAK,SAAU,CAAA,EAAI,EAC3C4G,EAAevL,EAAI,MAAQiC,EAAQ,UAAUjC,EAAI,KAAK,EAAE,EAAIA,EAAI,KAAK,GAAKqL,EAC1EG,EAAgBxL,EAAI,MAAQiC,EAAQ,UAAUjC,EAAI,KAAK,EAAE,EAAIA,EAAI,KAAK,GAAKsL,EAG/EX,EAAkB,UAAY3K,EAAI,KAAK,GACvC4K,EAAmB,UAAYrF,EAAOiG,EAAgB,GAGtD,IAAIC,EAAQ,SAAS,cAAc,OAAO,EAC1CA,EAAM,aAAa,QAAS,MAAM,EAMlC,QAHIP,EAAM,KAGDzO,EAAI,EAAGA,EAAI,GAAIA,IAAK,CACzB,GAAI,EAAEA,EAAI,GAAI,CAEV,IAAIyO,EAAM,SAAS,cAAc,IAAI,EACrCA,EAAI,aAAa,QAAS,QAAQ,EAClCO,EAAM,YAAYP,CAAG,CACxB,CAGD,IAAIC,EAAO,SAAS,cAAc,IAAI,EAKtC,GAJAA,EAAK,UAAU,IAAI,qBAAqB,EACxCA,EAAK,aAAa,aAAc1O,EAAI,CAAC,EACrC0O,EAAK,UAAY5F,EAAO9I,GAEpBuD,EAAI,QAAQ,WAAY,CACxB,IAAIyG,EAAU8E,EAAe,IAAMtJ,EAAQ,IAAIxF,EAAI,CAAC,EACpD,GAAI,CAACuD,EAAI,QAAQ,WAAW,IAAMyG,GAAWzG,EAAI,QAAQ,WAAW,GAAG,OAAO,EAAG,CAAC,EAC9E,IAAImK,GAAQ,OAEZ,KAAIA,GAAQ,GAGhB,GAAI,CAACnK,EAAI,QAAQ,WAAW,IAAMyG,GAAWzG,EAAI,QAAQ,WAAW,GAAG,OAAO,EAAG,CAAC,EAC9E,IAAIoK,GAAQ,OAEZ,KAAIA,GAAQ,GAGVD,IAASC,IACXe,EAAK,UAAU,IAAI,oBAAoB,CAE9C,CAEG1O,EAAI,GAAK+O,GACTL,EAAK,UAAU,IAAI,oBAAoB,EAGvCE,GAAeE,GAAgB9O,EAAI,GAAK6O,IACxCH,EAAK,MAAM,WAAa,QAG5BD,EAAI,YAAYC,CAAI,CACvB,CAEDF,EAAa,UAAY,iCACzBA,EAAa,SAAS,GAAG,SAAS,GAAG,YAAYQ,CAAK,EAGtDnB,GACH,EAEDtK,EAAI,SAAW,UAAY,CAEvBA,EAAI,QAAQ,KAAO,QASnB,QANI2E,EAAO,IAAI,KACX0G,EAAc1G,EAAK,cACnB4G,EAAevL,EAAI,MAAQiC,EAAQ,UAAUjC,EAAI,KAAK,EAAE,EAAIA,EAAI,KAAK,GAAK,SAAS2E,EAAK,YAAW,CAAE,EAGrGjH,EAAI,CAAA,EACCjB,EAAI,EAAGA,EAAI,GAAIA,IACpBiB,EAAEjB,GAAK,SAASuD,EAAI,KAAK,EAAE,GAAKvD,EAAI,IAIxC,IAAIgP,EAAQ,SAAS,cAAc,OAAO,EAC1CA,EAAM,aAAa,QAAS,MAAM,EAElC,QAAShP,EAAI,EAAGA,EAAI,GAAIA,IAAK,CACzB,GAAI,EAAEA,EAAI,GAAI,CAEV,IAAIyO,EAAM,SAAS,cAAc,IAAI,EACrCA,EAAI,aAAa,QAAS,QAAQ,EAClCO,EAAM,YAAYP,CAAG,CACxB,CAGD,IAAIC,EAAO,SAAS,cAAc,IAAI,EACtCA,EAAK,UAAU,IAAI,oBAAoB,EACvCA,EAAK,UAAYzN,EAAEjB,GAEf8O,GAAgB7N,EAAEjB,IAClB0O,EAAK,UAAU,IAAI,oBAAoB,EAGvCE,GAAe3N,EAAEjB,KACjB0O,EAAK,MAAM,WAAa,QAG5BD,EAAI,YAAYC,CAAI,CACvB,CAEDF,EAAa,UAAY,iCACzBA,EAAa,WAAW,WAAW,YAAYQ,CAAK,EAGpDnB,GACH,EAEDtK,EAAI,SAAW,SAAUe,EAAO2K,EAAO,CACnC,OAAOnI,EAAU,cAAcxC,EAAO2K,CAAK,CAC9C,EAED1L,EAAI,cAAgB,SAAUe,EAAOiI,EAAQ,CACzC,OAAOzF,EAAU,sBAAsBxC,EAAOiI,CAAM,CACvD,EAED,IAAI2C,EAAkB,SAAUtP,EAAG,CAC/B,IAAIwF,EAAUI,EAAQ,YAAY5F,EAAE,OAAQ,qBAAqB,EACjE,GAAIwF,EAAS,CACT,IAAI+J,EAASvP,EAAE,OAAO,UAGtB,GAAIuP,GAAU,iBACV5L,EAAI,KAAI,UACD4L,GAAU,iBACjB5L,EAAI,KAAI,UACD4L,GAAU,kBACjB5L,EAAI,UAAS,UACN4L,GAAU,iBACjB5L,EAAI,SAAQ,UACL4L,GAAU,qBACjB5L,EAAI,KAAK,GAAK3D,EAAE,OAAO,UACnB2D,EAAI,QAAQ,MAAQ,oBACpBA,EAAI,UAAS,EAEbA,EAAI,QAAO,UAER3D,EAAE,OAAO,UAAU,SAAS,qBAAqB,EAAG,CAC3D,IAAImO,EAAQ,SAASnO,EAAE,OAAO,aAAa,YAAY,CAAC,EACpD2D,EAAI,QAAQ,MAAQ,oBACpBA,EAAI,OAAO3D,EAAE,OAAQmO,CAAK,GAE1BxK,EAAI,KAAK,GAAKwK,EACdxK,EAAI,QAAO,EAEnC,MAA2B4L,GAAU,qBAAuBA,GAAU,oBAAsBA,GAAU,kBAClF5L,EAAI,MAAM,KAAM,EAAI,EACb4L,GAAU,qBACjB5L,EAAI,MAAM,GAAO,EAAK,EACf4L,GAAU,kBACjB5L,EAAI,MAAK,EACF3D,EAAE,OAAO,UAAU,SAAS,mBAAmB,GAAKA,EAAE,OAAO,WACpE2D,EAAI,OAAO3D,EAAE,MAAM,CAEvC,MACgB2D,EAAI,MAAM,GAAO,EAAK,CAE7B,EAEG6L,EAAgB,SAAUxP,EAAG,CAC7B,GAAIA,EAAE,OAAO,OAASA,EAAE,OAAO,MAAM,OAAS,EAAG,CAC7C,IAAI+K,EAAO7D,EAAU,sBAAsBlH,EAAE,OAAO,MAAO2D,EAAI,QAAQ,MAAM,EACzEoH,GACApH,EAAI,SAASoH,CAAI,CAExB,CACJ,EAGGkD,EAAgB,UAAY,CAC5B,IAAIQ,EAAa3B,EAAS,cAAc,qBAAqB,EAEzD2B,GAAcA,EAAW,UAAU,SAAS,oBAAoB,GAChErB,GAA6B,aAAa,WAAY,UAAU,EAChEC,EAAmB,aAAa,WAAY,UAAU,EACtDC,EAAkB,aAAa,WAAY,UAAU,IAErDF,GAA6B,gBAAgB,UAAU,EACvDC,EAAmB,gBAAgB,UAAU,EAC7CC,EAAkB,gBAAgB,UAAU,GAI5C,OAAQ3J,EAAI,QAAQ,UAAa,YACjCA,EAAI,QAAQ,SAASgB,EAAIhB,EAAI,SAAQ,CAAE,CAE9C,EAEGmJ,EAAW,KACXI,EAAgB,KAChBC,EAAkB,KAClBO,EAAoB,KACpBH,EAAkB,KAClBe,EAAoB,KACpBC,EAAqB,KACrBkB,EAAgB,KAChBb,EAAe,KAEfc,GAAmB,KACnBX,GAAuB,KACvBY,GAAyB,KACzBvC,GAA+B,KAC/BC,EAAqB,KACrBC,EAAoB,KAEpBsC,EAAO,UAAY,CAEfjL,EAAG,SAAW,SAAWA,EAAG,QAC5BuB,EAAQ,MAAQvB,EAAG,OAIvBuI,EAAgB,SAAS,cAAc,KAAK,EAC5CA,EAAc,UAAY,kBAE1BC,EAAkB,SAAS,cAAc,KAAK,EAC9CA,EAAgB,UAAY,oBAE5BuC,GAAmB,SAAS,cAAc,KAAK,EAC/CA,GAAiB,UAAY,qBAC7BA,GAAiB,MAAM,aAAe,iBACtCA,GAAiB,YAAYxC,CAAa,EAC1CwC,GAAiB,YAAYvC,CAAe,EAE5CO,EAAoB,SAAS,cAAc,KAAK,EAChDA,EAAkB,UAAY,sBAC9BH,EAAkB,SAAS,cAAc,KAAK,EAC9CA,EAAgB,UAAY,oBAC5BG,EAAkB,YAAYH,CAAe,EAGzC5I,EAAG,SAAW,OACdmI,EAAWnI,EACXmI,EAAS,UAAU,IAAI,kBAAkB,IAGzCS,EAAgB,YAAYmC,EAAgB,EAE5C5C,EAAW,SAAS,cAAc,KAAK,EACvCA,EAAS,UAAY,aAEzBA,EAAS,UAAU,IAAI,qBAAqB,EAC5CA,EAAS,YAAYY,CAAiB,EAGtC,IAAImC,EAAyB,SAAS,cAAc,KAAK,EACzDA,EAAuB,UAAY,kBACnCtC,EAAgB,YAAYsC,CAAsB,EAGlD,IAAIC,EAAqB,SAAS,cAAc,IAAI,EACpDA,EAAmB,aAAa,UAAW,GAAG,EAC9CA,EAAmB,UAAY,iBAG/BxB,EAAoB,SAAS,cAAc,MAAM,EACjDA,EAAkB,UAAY,iBAC9BC,EAAqB,SAAS,cAAc,MAAM,EAClDA,EAAmB,UAAY,kBAE/B,IAAIwB,EAAsB,SAAS,cAAc,IAAI,EACrDA,EAAoB,UAAY,mBAChCA,EAAoB,aAAa,UAAW,GAAG,EAC/CA,EAAoB,YAAYxB,CAAkB,EAClDwB,EAAoB,YAAYzB,CAAiB,EAEjD,IAAI0B,EAAqB,SAAS,cAAc,IAAI,EACpDA,EAAmB,aAAa,UAAW,GAAG,EAC9CA,EAAmB,UAAY,iBAE/B,IAAIC,EAAiB,SAAS,cAAc,OAAO,EAC/CC,EAAoB,SAAS,cAAc,IAAI,EACnDA,EAAkB,YAAYJ,CAAkB,EAChDI,EAAkB,YAAYH,CAAmB,EACjDG,EAAkB,YAAYF,CAAkB,EAChDC,EAAe,YAAYC,CAAiB,EAE5CT,EAAgB,SAAS,cAAc,OAAO,EAC9Cb,EAAe,SAAS,cAAc,OAAO,EAC7Ca,EAAc,aAAa,cAAe,GAAG,EAC7CA,EAAc,aAAa,cAAe,GAAG,EAC7CA,EAAc,YAAYQ,CAAc,EACxCR,EAAc,YAAYb,CAAY,EACtCiB,EAAuB,YAAYJ,CAAa,EAEhDpC,EAAqB,SAAS,cAAc,QAAQ,EACpDA,EAAmB,UAAY,mBAC/BA,EAAmB,SAAW,UAAY,CACtC1J,EAAI,KAAK,GAAK,KAAK,MAGf,OAAQA,EAAI,QAAQ,UAAa,YACjCA,EAAI,QAAQ,SAASgB,EAAIhB,EAAI,SAAQ,CAAE,CAE9C,EAEG,QAASvD,EAAI,EAAGA,EAAI,GAAIA,IAAK,CACzB,IAAIoF,EAAU,SAAS,cAAc,QAAQ,EAC7CA,EAAQ,MAAQpF,EAChBoF,EAAQ,UAAYI,EAAQ,IAAIxF,CAAC,EACjCiN,EAAmB,YAAY7H,CAAO,CACzC,CAEL8H,EAAoB,SAAS,cAAc,QAAQ,EACnDA,EAAkB,UAAY,mBAC9BA,EAAkB,SAAW,UAAY,CACrC3J,EAAI,KAAK,GAAK,KAAK,MAGf,OAAQA,EAAI,QAAQ,UAAa,YACjCA,EAAI,QAAQ,SAASgB,EAAIhB,EAAI,SAAQ,CAAE,CAE9C,EAED,QAASvD,EAAI,EAAGA,EAAI,GAAIA,IAAK,CACzB,IAAIoF,EAAU,SAAS,cAAc,QAAQ,EAC7CA,EAAQ,MAAQpF,EAChBoF,EAAQ,UAAYI,EAAQ,IAAIxF,CAAC,EACjCkN,EAAkB,YAAY9H,CAAO,CACxC,CAGD,IAAI2K,EAAyB,SAAS,cAAc,KAAK,EACzDA,EAAuB,UAAY,qBAEnCpB,GAAuB,SAAS,cAAc,KAAK,EACnDA,GAAqB,UAAY,iBACjCA,GAAqB,MAAM,SAAW,QACtCA,GAAqB,YAAY1B,CAAkB,EACnD0B,GAAqB,YAAYzB,CAAiB,EAElDF,GAA+B,SAAS,cAAc,QAAQ,EAC9DA,GAA6B,aAAa,OAAQ,QAAQ,EAC1DA,GAA6B,UAAY,mBAEzCuC,GAAyB,SAAS,cAAc,KAAK,EACrDA,GAAuB,MAAM,SAAW,KACxCA,GAAuB,YAAYvC,EAA4B,EAC/D+C,EAAuB,YAAYpB,EAAoB,EAGnDpK,EAAG,SAAW,SACdwL,EAAuB,YAAYR,EAAsB,EAG7DpC,EAAgB,YAAY4C,CAAsB,EAElD,IAAIC,EAAmB,SAAS,cAAc,KAAK,EACnDA,EAAiB,UAAY,qBAC7BtD,EAAS,YAAYsD,CAAgB,EAGrCzL,EAAG,iBAAiB,QAAS6K,CAAa,EAG1C1C,EAAS,iBAAiB,YAAa,SAAU9M,EAAG,CAChDoI,GAAU,UAAUqH,EAAe,EAAG,UAAY,CAC9C9L,EAAI,KAAI,EACRyE,GAAU,WAAWqH,EAAe,CAAC,CACzD,CAAiB,EACDzP,EAAE,eAAc,EAChBA,EAAE,gBAAe,CACjC,CAAa,EAED8M,EAAS,iBAAiB,aAAc,SAAU9M,EAAG,CACjDoI,GAAU,WAAWqH,EAAe,EAAG,UAAY,CAC/C9L,EAAI,KAAI,EACRyE,GAAU,UAAUqH,EAAe,CAAC,CACxD,CAAiB,EACDzP,EAAE,eAAc,EAChBA,EAAE,gBAAe,CACjC,CAAa,EAEG,eAAgB,SAAS,iBACzB8M,EAAS,iBAAiB,WAAYwC,CAAe,EACrD3K,EAAG,iBAAiB,WAAYhB,EAAI,IAAI,IAExCmJ,EAAS,iBAAiB,UAAWwC,CAAe,EACpD3K,EAAG,iBAAiB,UAAWhB,EAAI,IAAI,GAItCuD,EAAU,YAEXA,EAAU,UAAY,GAEtB,SAAS,iBAAiB,UAAWA,EAAU,OAAO,GAI1DvD,EAAI,WAAWuC,CAAO,EAGlBvB,EAAG,SAAW,SACdA,EAAG,WAAW,aAAamI,EAAUnI,EAAG,WAAW,EAEnDA,EAAG,aAAa,eAAgB,KAAK,EAErCA,EAAG,UAAU,IAAI,iBAAiB,EAElCA,EAAG,MAAQhB,EAAI,SAASA,EAAI,SAAU,EAAEA,EAAI,OAAO,IAGnDA,EAAI,QAAO,EAEPA,EAAI,QAAQ,OACZ0J,EAAmB,MAAQ1J,EAAI,KAAK,GACpC2J,EAAkB,MAAQ3J,EAAI,KAAK,KAKvCA,EAAI,QAAQ,QAAU,IACtBA,EAAI,KAAI,EAIRA,EAAI,QAAQ,UAAY,IACxB+J,EAAkB,UAAU,IAAI,yBAAyB,EAI7D/I,EAAG,OAAShB,EAAI,SAGhBgB,EAAG,IAAM,SAAUmB,EAAK,CACpB,GAAIA,IAAQ,OACR,OAAOnC,EAAI,WAEXA,EAAI,SAASmC,CAAG,CAEvB,EAGDnB,EAAG,SAAWmI,EAAS,SAAWnJ,CACrC,EAED,OAAAiM,IAEOjM,CACf,EAEI,OAAAuD,EAAU,QAAU,SAAUlH,EAAG,CAC7B,IAAI8M,EAAW,MACXA,EAAW5F,EAAU,WACjBlH,EAAE,OAAS,GAEX8M,EAAS,MAAM,GAAO,EAAI,EACnB9M,EAAE,OAAS,IAElB8M,EAAS,MAAM,GAAO,EAAK,EAGtC,EAED5F,EAAU,SAAW,SAAUnH,EAAGsQ,EAAO,CACrC,GAAI,CAACA,EACD,IAAIA,EAAQ,CACR,QAAS,WACT,YAAa,WACb,UAAW,WACX,SAAU,WACV,UAAW,WACX,WAAY,cACZ,UAAW,UACd,EAGDtQ,EAAE,QAAQ,KAAK,IAAM,IAAMA,EAAE,QAAQ,GAAG,IAAM,KAC9CA,GAAK,QAGT,IAAIuQ,EAAK,IAAI,KACTC,EAAK,IAAI,KAAKxQ,CAAC,EACfyQ,EAAQ,UAAUF,EAAKC,GAAM,IAAO,EAAE,EAM1C,GAJA,OAAO,UAAU,OAAS,SAAUvK,EAAG,CACnC,OAAO,KAAK,QAAQ,MAAOA,CAAC,CAC/B,EAEGwK,GAAS,EACT,IAAIC,EAAOJ,EAAM,gBACVG,EAAQ,GACf,IAAIC,EAAOJ,EAAM,YAAY,OAAOG,CAAK,UAClCA,EAAQ,KACf,IAAIC,EAAOJ,EAAM,UAAU,OAAO,KAAK,MAAMG,EAAQ,EAAE,CAAC,UACjDA,EAAQ,MACf,IAAIC,EAAOJ,EAAM,SAAS,OAAO,KAAK,MAAMG,EAAQ,IAAI,CAAC,UAClDA,EAAQ,MACf,IAAIC,EAAOJ,EAAM,UAAU,OAAO,KAAK,MAAMG,EAAQ,KAAK,CAAC,UACpDA,EAAQ,QACf,IAAIC,EAAOJ,EAAM,WAAW,OAAO,KAAK,MAAMG,EAAQ,KAAK,CAAC,MAE5D,KAAIC,EAAOJ,EAAM,UAAU,OAAO,KAAK,MAAMG,EAAQ,MAAM,CAAC,EAGhE,OAAOC,CACV,EAEDvJ,EAAU,YAAc,UAAY,CAEhC,QADI8G,EAAW,SAAS,iBAAiB,aAAa,EAC7C5N,EAAI,EAAGA,EAAI4N,EAAS,OAAQ5N,IAC7B4N,EAAS5N,GAAG,aAAa,WAAW,EACpC4N,EAAS5N,GAAG,UAAY8G,EAAU,SAAS8G,EAAS5N,GAAG,aAAa,WAAW,CAAC,EAE5E4N,EAAS5N,GAAG,YACZ4N,EAAS5N,GAAG,aAAa,QAAS4N,EAAS5N,GAAG,SAAS,EACvD4N,EAAS5N,GAAG,aAAa,YAAa4N,EAAS5N,GAAG,SAAS,EAC3D4N,EAAS5N,GAAG,UAAY8G,EAAU,SAAS8G,EAAS5N,GAAG,SAAS,EAI/E,EAED8G,EAAU,IAAMiC,EAAa,IAC7BjC,EAAU,QAAUiC,EAAa,QACjCjC,EAAU,UAAYiC,EAAa,UACnCjC,EAAU,UAAYiC,EAAa,UACnCjC,EAAU,SAAWiC,EAAa,SAClCjC,EAAU,OAASiC,EAAa,OAChCjC,EAAU,cAAgBiC,EAAa,cACvCjC,EAAU,YAAciC,EAAa,YAGrCjC,EAAU,sBAAwBtG,GAAK,sBACvCsG,EAAU,cAAgBtG,GAAK,cAExBsG,CACV,CAE4B,IAAI4F,GAAYE,GAAQ,EAIrD,SAAS0D,IAAU,CAEf,IAAIC,EAAU,CACV,SAAU,CACN,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC1L,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC1L,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC1L,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC1L,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC1L,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC1L,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC1L,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC1L,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EAC1L,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,CAC7L,EACD,KAAM,CACF,CAAC,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAAQ,EACnG,CAAC,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAAQ,EACnG,CAAC,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAAQ,EACnG,CAAC,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAAQ,EACnG,CAAC,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAAQ,CACtG,EACD,KAAM,CACF,CAAC,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAAQ,EACnG,CAAC,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAAQ,EACnG,CAAC,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAAQ,EACnG,CAAC,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAAQ,EACnG,CAAC,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAAQ,CACtG,EACD,MAAO,CACH,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,CACtI,CACJ,EAEGzJ,EAAY,SAAUlB,EAAG,CAEzB,OAAI2K,EAAQ3K,GACD2K,EAAQ3K,GAER2K,EAAQ,QAEtB,EAED,OAAAzJ,EAAU,IAAM,SAAUlB,EAAG,CAEzB,OAAI2K,EAAQ3K,GACD2K,EAAQ3K,GAER2K,CAEd,EAEDzJ,EAAU,IAAM,SAAUlB,EAAGzB,EAAG,CAC5BoM,EAAQ3K,GAAKzB,CAChB,EAEM2C,CACV,CAE4B,IAAIyJ,GAAWD,GAAO,EAKnD,SAASE,GAAKjM,EAAIuB,EAAS,CACvB,IAAIvC,EAAM,CAAA,EACVA,EAAI,QAAU,GAGd,IAAIwC,EAAW,CACX,KAAM,CAAE,EACR,SAAU,KACV,YAAa,GACb,oBAAqB,GACrB,QAAS,KACT,OAAQ,KACR,SAAU,KACV,SAAU,KACV,SAAU,KACV,eAAgB,KAChB,iBAAkB,KAClB,UAAW,GACX,YAAa,GACb,QAAS,KACT,QAAS,KACT,SAAU,IACb,EAGD,QAASE,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,GAEhC1C,EAAI,QAAQ0C,GAAYF,EAASE,GAKzC1B,EAAG,UAAU,IAAI,OAAO,EAExB,IAAIkM,EAAO,KACPC,EAAO,KACPC,EAAS,KAGb,MAAMC,EAAY,SAASxM,EAAO,CAC1Bb,EAAI,QAAQ,WACZ,WAAW,UAAW,CAClB,IAAI6J,EAAO7J,EAAI,QAAQ,SAASa,GAAO,wBAEnCb,EAAI,QAAQ,UAAY,UACxBoN,EAAO,MAAM,MAAQvD,EAAK,MAAQ,EAAI,KACtCuD,EAAO,MAAM,KAAOpN,EAAI,QAAQ,SAASa,GAAO,WAAa,EAAI,OAEjEuM,EAAO,MAAM,MAAQvD,EAAK,MAAQ,KAClCuD,EAAO,MAAM,KAAOpN,EAAI,QAAQ,SAASa,GAAO,WAAa,MAG7Db,EAAI,QAAQ,WAAa,SACzBoN,EAAO,MAAM,IAAM,MAEnBA,EAAO,MAAM,OAAS,KAE7B,EAAE,EAAE,CAEZ,EAED,IAAIE,EAAiB,SAAS7P,EAAG,CACzB,OAAOuC,EAAI,QAAQ,UAAa,WAChCA,EAAI,QAAQ,SAAS,CACjB,KAAMvC,EACN,SAAU,QAC1B,CAAa,EAEDuC,EAAI,QAAQ,WAAavC,EAGzBA,GAAK,EACLyP,EAAK,UAAU,IAAI,UAAU,EAE7BA,EAAK,UAAU,OAAO,UAAU,EAGhCzP,GAAKuC,EAAI,QAAQ,YAAcA,EAAI,QAAQ,YAC3CmN,EAAK,UAAU,IAAI,UAAU,EAE7BA,EAAK,UAAU,OAAO,UAAU,EAGhCnN,EAAI,QAAQ,aAAeA,EAAI,QAAQ,aACvCkN,EAAK,MAAM,QAAU,OACrBC,EAAK,MAAM,QAAU,SAErBD,EAAK,MAAM,QAAU,GACrBC,EAAK,MAAM,QAAU,GAE5B,EAyZD,GAvZAnN,EAAI,UAAYqN,EAGhBrN,EAAI,KAAO,SAASa,EAAO,CAGvB,GADc,MAAM,KAAKb,EAAI,QAAQ,QAAQ,EACzC,EAAEA,EAAI,QAAQ,SAASa,GAK3B,SADI0M,EAAW,KACN9Q,EAAI,EAAGA,EAAIuD,EAAI,QAAQ,SAAS,OAAQvD,IACzCuD,EAAI,QAAQ,SAASvD,GAAG,UAAU,SAAS,gBAAgB,IAE3D8Q,EAAW9Q,GAGfuD,EAAI,QAAQ,SAASvD,GAAG,UAAU,OAAO,gBAAgB,EACrDuD,EAAI,QAAQ,SAASvD,IACrBuD,EAAI,QAAQ,SAASvD,GAAG,UAAU,OAAO,gBAAgB,EAgBjE,GAZAuD,EAAI,QAAQ,SAASa,GAAO,UAAU,IAAI,gBAAgB,EACtDb,EAAI,QAAQ,SAASa,IACrBb,EAAI,QAAQ,SAASa,GAAO,UAAU,IAAI,gBAAgB,EAG1D0M,GAAY1M,GAAS,OAAOb,EAAI,QAAQ,UAAa,YACjDA,EAAI,QAAQ,SAASa,IACrBb,EAAI,QAAQ,SAASgB,EAAIhB,EAAKa,EAAOb,EAAI,QAAQ,SAASa,GAAQb,EAAI,QAAQ,SAASa,EAAM,EAKjGb,EAAI,QAAQ,aAAe,IAASA,EAAI,QAAQ,SAAS,OAAS,GAAKA,EAAI,QAAQ,aAAe,GAClGA,EAAI,QAAQ,WAAW,MAAM,QAAU,WACpC,CACHA,EAAI,QAAQ,WAAW,MAAM,QAAU,GAEvC,IAAIwN,GAAKxN,EAAI,QAAQ,SAASa,GAAO,WACjC4M,GAAKD,GAAKxN,EAAI,QAAQ,SAASa,GAAO,YACtC6M,GAAK1N,EAAI,QAAQ,WACjB2N,GAAKD,GAAK1N,EAAI,QAAQ,YAEnB0N,IAAMF,IAAMG,IAAMF,IAErBH,EAAeE,GAAK,CAAC,EAIzBH,EAAUxM,CAAK,CAClB,EACJ,EAEDb,EAAI,YAAc,SAAS/D,EAAG,CAC1B,IAAI4E,EAAQ,MAAM,UAAU,QAAQ,KAAKb,EAAI,QAAQ,SAAU/D,CAAC,EAChE,OAAI4E,GAAS,GACTb,EAAI,KAAKa,CAAK,EAGXA,CACV,EAEDb,EAAI,OAAS,SAASvD,EAAGmR,EAAO,CACtBA,IACFA,EAAQ,OAAO,YAAa5N,EAAI,QAAQ,SAASvD,GAAG,SAAS,GAEjEuD,EAAI,QAAQ,SAASvD,GAAG,UAAYmR,EACpCP,EAAUrN,EAAI,UAAS,CAAE,CAC5B,EAEDA,EAAI,OAAS,SAAS4N,EAAO5J,EAAK,CAC9B,GAAI,OAAOhE,EAAI,QAAQ,gBAAmB,WAAY,CAClD,IAAImH,EAAMnH,EAAI,QAAQ,eAAegB,EAAI4M,CAAK,EAC9C,GAAIzG,IAAQ,GACR,MAAO,GAEPyG,EAAQzG,CAEf,CAED,IAAI0G,GAAM7N,EAAI,cAAc4N,CAAK,EAEjC,OAAI,OAAO5N,EAAI,QAAQ,UAAa,YAChCA,EAAI,QAAQ,SAASgB,EAAI6M,EAAG,EAGhCR,EAAUrN,EAAI,UAAS,CAAE,EAElB6N,EACV,EAED7N,EAAI,OAAS,SAASa,EAAO,CACzB,OAAOb,EAAI,cAAca,CAAK,CACjC,EAEDb,EAAI,WAAa,UAAW,CAExB,QADIoB,EAAM,EACD3E,EAAI,EAAGA,EAAIuD,EAAI,QAAQ,SAAS,OAAQvD,IAAK,CAClD,IAAIqR,EAAM9N,EAAI,QAAQ,SAASvD,GAAG,UAAU,MAAM,SAAS,EACvDqR,EAAM1M,IACNA,EAAM,SAAS0M,CAAG,EAEzB,CACD,OAAM1M,EAGFA,IAFAA,EAAM,EAKHA,CACV,EAEDpB,EAAI,cAAgB,SAASa,EAAO,CAChC,IAAI4F,EAAUzG,EAAI,YAElB,GAAMA,EAAI,QAAQ,SAASa,GAGvBb,EAAI,QAAQ,YAAYA,EAAI,QAAQ,SAASa,EAAM,EACnDb,EAAI,QAAQ,YAAYA,EAAI,QAAQ,SAASa,EAAM,MAHnD,OAAO,GAMX,GAAI4F,IAAY5F,EACZb,EAAI,KAAK,CAAC,MACP,CACH,IAAIyG,EAAUzG,EAAI,UAAS,GAAM,EACjCqN,EAAU5G,CAAO,CACpB,CAEG,OAAOzG,EAAI,QAAQ,UAAa,YAChCA,EAAI,QAAQ,SAASgB,EAAIH,CAAK,CAErC,EAEDb,EAAI,cAAgB,SAAS4N,EAAOG,EAAIC,EAASpL,GAAU,CACvD,GAAI,CAAEgL,EACF,IAAIA,EAAQ,OAAO,SAAU,EAAE,EAGnC,GAAIA,EAAO,CAEP,IAAIC,GAAM,SAAS,cAAc,KAAK,EAGlCrR,GAAI,SAAS,cAAc,KAAK,EAIpC,GAHAA,GAAE,UAAYoR,EACdpR,GAAE,QAAUqR,GAER,OAAOjL,GAAc,IACrB5C,EAAI,QAAQ,YAAY6N,EAAG,EAC3B7N,EAAI,QAAQ,aAAaxD,GAAGwD,EAAI,QAAQ,SAAS,MAC9C,CACH,IAAIqB,GAAIrB,EAAI,QAAQ,SAAS4C,IACzBvB,GACArB,EAAI,QAAQ,aAAa6N,GAAKxM,EAAC,EAE/BrB,EAAI,QAAQ,YAAY6N,EAAG,EAE/BxM,GAAIrB,EAAI,QAAQ,SAAS4C,KAAa5C,EAAI,QAAQ,UAClDA,EAAI,QAAQ,aAAaxD,GAAG6E,EAAC,CAChC,CAGD,OAAIrB,EAAI,QAAQ,qBACZxD,GAAE,aAAa,YAAa,MAAM,EAIlCwR,IAAY,IAEZhO,EAAI,YAAYxD,EAAC,EAIjB,OAAOuR,GAAO,YACdA,EAAGF,GAAKrR,EAAC,EAINqR,EACV,CACJ,EAED7N,EAAI,UAAY,UAAW,CACvB,QAASvD,EAAI,EAAGA,EAAIuD,EAAI,QAAQ,SAAS,OAAQvD,IAC7C,GAAIuD,EAAI,QAAQ,SAASvD,GAAG,UAAU,SAAS,gBAAgB,EAC3D,OAAOA,EAGf,MAAO,EACV,EAEDuD,EAAI,cAAgB,SAAS4C,EAAUqL,EAAY,CAC/C,GAAI,OAAOA,GAAe,SACtB,IAAIC,EAAcD,MACf,CACH,IAAIC,EAAc,SAAS,cAAc,KAAK,EAC9CA,EAAY,UAAYD,CAC3B,CAEGjO,EAAI,QAAQ,SAAS4C,GAAU,UAAU,SAAS,gBAAgB,GAClEqL,EAAW,UAAU,IAAI,gBAAgB,EAG7CjO,EAAI,QAAQ,aAAaiO,EAAYjO,EAAI,QAAQ,SAAS4C,EAAS,EAEnEyK,GACH,EAEDrN,EAAI,eAAiB,SAAS1D,EAAGiE,EAAGyJ,EAAcgE,GAAS,CASvD,GAPI1R,EAAIiE,EACJP,EAAI,QAAQ,aAAaA,EAAI,QAAQ,SAAS1D,GAAI0D,EAAI,QAAQ,SAASO,EAAE,EAEzEP,EAAI,QAAQ,aAAaA,EAAI,QAAQ,SAAS1D,GAAI0D,EAAI,QAAQ,SAASO,GAAG,WAAW,EAIrFyN,KAAY,GACZhO,EAAI,KAAKO,CAAC,MACP,CACH,MAAM4N,GAAcnO,EAAI,YAEpBO,EAAI4N,IACJnO,EAAI,UAAUmO,EAAW,CAEhC,CAGG,CAAEnE,GAAgB,OAAOhK,EAAI,QAAQ,kBAAqB,YAC1DA,EAAI,QAAQ,iBAAiBA,EAAI,QAAS1D,EAAGiE,CAAC,CAErD,EAEDP,EAAI,KAAO,SAAS1D,EAAGiE,EAAGyJ,EAAcgE,GAAS,CACzC1R,EAAIiE,EACJP,EAAI,QAAQ,aAAaA,EAAI,QAAQ,SAAS1D,GAAI0D,EAAI,QAAQ,SAASO,EAAE,EAEzEP,EAAI,QAAQ,aAAaA,EAAI,QAAQ,SAAS1D,GAAI0D,EAAI,QAAQ,SAASO,GAAG,WAAW,EAGzFP,EAAI,eAAe1D,EAAGiE,EAAGyJ,EAAcgE,EAAO,CACjD,EAEDhO,EAAI,UAAYqN,EAEhBrN,EAAI,KAAO,UAAW,CAClBgB,EAAG,UAAY,GAGfhB,EAAI,QAAU,SAAS,cAAc,KAAK,EAC1CA,EAAI,QAAU,SAAS,cAAc,KAAK,EAC1CA,EAAI,QAAQ,UAAU,IAAI,eAAe,EACzCA,EAAI,QAAQ,UAAU,IAAI,eAAe,EAErCA,EAAI,QAAQ,QACZgB,EAAG,UAAU,IAAI,cAAc,EAE/BA,EAAG,UAAU,OAAO,cAAc,EAIlChB,EAAI,QAAQ,UACZA,EAAI,QAAQ,MAAM,QAAU,SAASA,EAAI,QAAQ,OAAO,EAAI,MAIhE,IAAIoO,EAAS,SAAS,cAAc,KAAK,EACzCA,EAAO,UAAY,0BACnBA,EAAO,YAAYpO,EAAI,OAAO,EAC1BA,EAAI,QAAQ,WACZoO,EAAO,MAAM,SAAW,SAASpO,EAAI,QAAQ,QAAQ,EAAI,MAI7D,IAAIqO,EAAW,SAAS,cAAc,KAAK,EAe3C,GAdAA,EAAS,UAAY,iBACrBA,EAAS,aAAa,YAAa,OAAO,EAC1CD,EAAO,YAAYC,CAAQ,EAGvBrO,EAAI,QAAQ,UAAY,UACxBgB,EAAG,YAAYhB,EAAI,OAAO,EAC1BgB,EAAG,YAAYoN,CAAM,IAErBpN,EAAG,YAAYoN,CAAM,EACrBpN,EAAG,YAAYhB,EAAI,OAAO,GAI1BA,EAAI,QAAQ,aAAe,GAAM,CACjC,IAAIsO,EAAM,SAAS,cAAc,KAAK,EACtCA,EAAI,UAAY,YAChBA,EAAI,QAAU,UAAW,CACrBtO,EAAI,OAAM,CACb,EACDqO,EAAS,YAAYC,CAAG,CAC3B,CAEDpB,EAAO,SAAS,cAAc,KAAK,EACnCA,EAAK,UAAY,aACjBA,EAAK,QAAU,UAAW,CACtBI,EAAetN,EAAI,QAAQ,WAAaA,EAAI,QAAQ,WAAW,CAClE,EACDqO,EAAS,YAAYnB,CAAI,EAEzBC,EAAO,SAAS,cAAc,KAAK,EACnCA,EAAK,UAAY,aACjBA,EAAK,QAAU,UAAW,CACtBG,EAAetN,EAAI,QAAQ,WAAaA,EAAI,QAAQ,WAAW,CAClE,EACDqO,EAAS,YAAYlB,CAAI,EAGzB,QAAS1Q,GAAI,EAAGA,GAAIuD,EAAI,QAAQ,KAAK,OAAQvD,KAAK,CAE9C,GAAIuD,EAAI,QAAQ,KAAKvD,IAAG,aACpB,IAAI8R,GAAavO,EAAI,QAAQ,KAAKvD,IAAG,iBAErC,KAAI8R,GAAa,SAAS,cAAc,KAAK,EAGjD,GAAIvO,EAAI,QAAQ,KAAKvD,IAAG,KAAM,CAC1B,IAAI+R,GAAgB,SAAS,cAAc,KAAK,EAC5CC,GAAO,SAAS,cAAc,GAAG,EACrCA,GAAK,UAAU,IAAI,gBAAgB,EACnCA,GAAK,UAAYzO,EAAI,QAAQ,KAAKvD,IAAG,KACrC+R,GAAc,YAAYC,EAAI,EAC9BF,GAAW,YAAYC,EAAa,CACvC,CAED,GAAIxO,EAAI,QAAQ,KAAKvD,IAAG,MAAO,CAC3B,IAAImR,EAAQ,SAAS,eAAe5N,EAAI,QAAQ,KAAKvD,IAAG,KAAK,EAC7D8R,GAAW,YAAYX,CAAK,CAC/B,CAMD,GAJI5N,EAAI,QAAQ,KAAKvD,IAAG,QACpB8R,GAAW,MAAM,MAAQvO,EAAI,QAAQ,KAAKvD,IAAG,OAG7CuD,EAAI,QAAQ,KAAKvD,IAAG,eACpB,IAAIyR,EAAclO,EAAI,QAAQ,KAAKvD,IAAG,mBACnC,CACH,IAAIyR,EAAc,SAAS,cAAc,KAAK,EAC9CA,EAAY,UAAYlO,EAAI,QAAQ,KAAKvD,IAAG,OAC/C,CACDuD,EAAI,QAAQ,YAAYuO,EAAU,EAClCvO,EAAI,QAAQ,YAAYkO,CAAW,CACtC,CAGDd,EAAS,SAAS,cAAc,KAAK,EACrCA,EAAO,UAAY,eACnBpN,EAAI,QAAQ,YAAYoN,CAAM,EAE1BpN,EAAI,QAAQ,WACZgB,EAAG,UAAU,IAAI,iBAAiB,EAItChB,EAAI,QAAQ,iBAAiB,QAAS,SAAS3D,EAAG,CAC9C,GAAIA,EAAE,OAAO,WAAW,UAAU,SAAS,eAAe,EACtD,IAAIsG,EAAStG,EAAE,eAEXA,EAAE,OAAO,SAAW,IACpB,IAAIsG,EAAStG,EAAE,OAAO,WAAW,eAEjC,KAAIsG,EAAStG,EAAE,OAAO,WAI9B,IAAIwE,EAAQb,EAAI,YAAY2C,CAAM,EAE9B,OAAO3C,EAAI,QAAQ,SAAY,YAC/BA,EAAI,QAAQ,QAAQgB,EAAIhB,EAAKa,EAAOb,EAAI,QAAQ,SAASa,GAAQb,EAAI,QAAQ,SAASa,EAAM,CAE5G,CAAS,EAEDb,EAAI,QAAQ,iBAAiB,cAAe,SAAS3D,EAAG,CACpD2D,EAAI,YAAY3D,EAAE,MAAM,CACpC,CAAS,EAEG2D,EAAI,QAAQ,SAAS,QAErBA,EAAI,KAAK,CAAC,EAIdsN,EAAe,CAAC,EAEZtN,EAAI,QAAQ,qBAAuB,IACnCsC,EAAQtC,EAAI,QAAS,CACjB,UAAW,EACX,OAAQ,SAAS/D,EAAEC,EAAEC,EAAG,CACpB6D,EAAI,eAAe9D,EAAEC,CAAC,CACzB,CACjB,CAAa,EAGD,OAAO6D,EAAI,QAAQ,QAAW,YAC9BA,EAAI,QAAQ,OAAOgB,EAAIhB,CAAG,CAEjC,EAGGgB,EAAG,SAAS,IAAMA,EAAG,SAAS,GAAG,SAAS,OAE1C,QAASvE,EAAI,EAAGA,EAAIuE,EAAG,SAAS,GAAG,SAAS,OAAQvE,IAAK,CACrD,IAAIiS,EAAO1O,EAAI,QAAQ,MAAQA,EAAI,QAAQ,KAAKvD,GAAKuD,EAAI,QAAQ,KAAKvD,GAAK,CAAA,EAEvEuE,EAAG,SAAS,IAAMA,EAAG,SAAS,GAAG,SAASvE,IAC1CiS,EAAK,aAAe1N,EAAG,SAAS,GAAG,SAASvE,GAC5CiS,EAAK,eAAiB1N,EAAG,SAAS,GAAG,SAASvE,IAE9CiS,EAAK,eAAiB1N,EAAG,SAAS,GAAG,SAASvE,GAGlDuD,EAAI,QAAQ,KAAKvD,GAAKiS,CACzB,CAIL,IAAIC,EAAoB,GAGxB,GAAI3O,EAAI,QAAQ,KAEZ,QAASvD,EAAI,EAAGA,EAAIuD,EAAI,QAAQ,KAAK,OAAQvD,IACrCuD,EAAI,QAAQ,KAAKvD,GAAG,MACpB2H,GAAK,CACD,IAAKpE,EAAI,QAAQ,KAAKvD,GAAG,IACzB,KAAM,MACN,SAAU,YACV,MAAOA,EACP,QAAS,SAASqH,EAAQ,CACtB9D,EAAI,QAAQ,KAAK,KAAK,OAAO,QAAU8D,CAC1C,EACD,SAAU,UAAW,CACjB9D,EAAI,KAAI,CACX,CACrB,CAAiB,EAGD2O,EAAoB,IAKhC,OAAMA,GACF3O,EAAI,KAAI,EAGZgB,EAAG,KAAOhB,EAEHA,CACV,CAQD,SAAS4O,GAAM5N,EAAIuB,EAAS,CAExB,GAAIvB,EAAG,MACH,OAAOA,EAAG,MAAM,WAAWuB,EAAS,EAAI,EAI5C,IAAIvC,EAAM,CAAE,KAAM,SAClBA,EAAI,QAAU,GAEd,IAAI6O,EAAY,KACZC,EAAW,KACXC,EAAU,KACVC,EAAc,KACdC,EAAc,KACdC,EAAO,KACPC,EAAc,KAKlBnP,EAAI,WAAa,SAASuC,EAAS+G,EAAO,CAYtC,IAAI9G,EAAW,CACX,YAAa,GACb,MAAO,KACP,OAAQ,KACR,QAAS,KACT,SAAU,KACV,cAAe,GACf,QAAS,KACT,SAAU,KACV,UAAW,OACX,WAAY,QACZ,WAAY,GACZ,OAAQ,EACX,EAEKD,IACFA,EAAU,CAAA,GAGVA,GAAW,CAAEA,EAAQ,UAErBA,EAAQ,QAAUyK,MAItB,QAAStK,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,IAE5B,OAAO1C,EAAI,QAAQ0C,GAAc,KAAe4G,IAAU,MAC1DtJ,EAAI,QAAQ0C,GAAYF,EAASE,IAM7C,OAAIsM,IACAA,EAAY,UAAYhP,EAAI,QAAQ,YAEpCiP,IACAA,EAAY,UAAYjP,EAAI,QAAQ,WAIpCA,EAAI,QAAQ,SAAWmP,GACvBA,EAAY,cAAc,EAAG1D,EAAO,CAAA,EAIpC,OAAOzL,EAAI,QAAQ,OAAU,WAC7BgB,EAAG,MAAQhB,EAAI,QAAQ,MACnBgB,EAAG,UAAY,UACfA,EAAG,MAAM,MAAQA,EAAG,MACpBA,EAAG,MAAM,gBAAkBA,EAAG,QAKlChB,EAAI,QAAQ,YACZgB,EAAG,aAAa,cAAehB,EAAI,QAAQ,WAAW,EAElDgB,EAAG,aAAa,aAAa,GAC7BA,EAAG,gBAAgB,aAAa,EAIjChB,CACV,EAEDA,EAAI,OAAS,SAASoP,EAAO,CAEzB,IAAIC,EAAWR,EAAU,cAAc,kBAAkB,EACrDQ,GACAA,EAAS,UAAU,OAAO,iBAAiB,EAI3CrP,EAAI,OAAOoP,IACXpP,EAAI,OAAOoP,GAAO,UAAU,IAAI,iBAAiB,EAGrDpP,EAAI,QAAQ,MAAQoP,CACvB,EAKDpP,EAAI,KAAO,UAAW,CAClB,GAAI,CAAE6O,EAAU,UAAU,SAAS,cAAc,EAAG,CAEhDpO,EAAST,EAAK,EAAI,EAGlB6O,EAAU,UAAU,IAAI,cAAc,EAGlC7O,EAAI,QAAQ,OACZA,EAAI,OAAOA,EAAI,QAAQ,KAAK,EAIhC+O,EAAQ,MAAM,UAAY,GAC1BA,EAAQ,MAAM,WAAa,GAE3B,IAAIjF,EAAciF,EAAQ,wBACtBO,EAAiBrN,EAAQ,iBACzBsN,EAAkBtN,EAAQ,kBAkC9B,GAhCIqN,EAAiB,KAAOtP,EAAI,QAAQ,YAAc,IAClD+O,EAAQ,UAAU,IAAI,mBAAmB,EACzCtK,GAAU,YAAYsK,EAAS,CAAC,EAChCD,EAAS,MAAM,QAAU,UAErBC,EAAQ,UAAU,SAAS,mBAAmB,IAC9CA,EAAQ,UAAU,OAAO,mBAAmB,EAC5CD,EAAS,MAAM,QAAU,IAGzB9O,EAAI,QAAQ,SACZ+O,EAAQ,MAAM,SAAW,QAEzBA,EAAQ,MAAM,SAAW,GAGzBjF,EAAY,KAAOA,EAAY,MAAQwF,IACvCP,EAAQ,MAAM,WAAa,IAAMjF,EAAY,KAAOA,EAAY,OAASwF,EAAiB,KAAO,MAEjGxF,EAAY,IAAMA,EAAY,OAASyF,IACvCR,EAAQ,MAAM,UAAY,IAAMjF,EAAY,IAAMA,EAAY,QAAUyF,EAAkB,KAAO,OAKrG,OAAOvP,EAAI,QAAQ,QAAW,YAC9BA,EAAI,QAAQ,OAAOgB,EAAIhB,CAAG,EAG9BmP,EAAY,UAAUA,EAAY,UAAW,CAAA,EAGzCnP,EAAI,QAAQ,MAAO,CACnB,IAAI0B,EAAM8N,EAASxP,EAAI,QAAQ,KAAK,EAEpCyP,EAAU,QAAQ,SAASC,EAAU7O,EAAO,CACxC6O,EAAS,MAAQhO,EAAIb,GACrB6O,EAAS,cAAc,IAAI,MAAM,OAAO,CAAC,CAC7D,CAAiB,CACJ,CACJ,CACJ,EAKD1P,EAAI,MAAQ,SAASgK,EAAc,CAC/B,OAAI6E,EAAU,UAAU,SAAS,cAAc,IAE3CA,EAAU,UAAU,OAAO,cAAc,EAEzCC,EAAS,MAAM,QAAU,GAErB,CAAE9E,GAAgB,OAAOhK,EAAI,QAAQ,SAAY,YACjDA,EAAI,QAAQ,QAAQgB,EAAIhB,CAAG,EAG/BS,EAAST,EAAK,EAAK,GAGhBA,EAAI,QAAQ,KACtB,EAKDA,EAAI,SAAW,SAASoP,EAAO,CACrBA,IACFA,EAAQ,IAGRA,GAASpP,EAAI,QAAQ,QACrBA,EAAI,QAAQ,MAAQoP,EACpBO,EAAgBP,EAGhBpP,EAAI,OAAOoP,CAAK,EAGZ,OAAOpP,EAAI,QAAQ,UAAa,YAChCA,EAAI,QAAQ,SAASgB,EAAIoO,EAAOpP,CAAG,EAInCgB,EAAG,OAAShB,EAAI,QAAQ,QAExBgB,EAAG,MAAQhB,EAAI,QAAQ,MACnBgB,EAAG,UAAY,UACfA,EAAG,MAAM,MAAQA,EAAG,MACpBA,EAAG,MAAM,gBAAkBA,EAAG,OAI9B,OAAOA,EAAG,SAAY,YACtBA,EAAG,QAAQ,CACP,KAAM,QACN,OAAQA,EACR,MAAOA,EAAG,KAClC,CAAqB,GAILhB,EAAI,QAAQ,eAAiB,IAC7BA,EAAI,MAAK,EAGpB,EAKDA,EAAI,SAAW,UAAW,CACtB,OAAOA,EAAI,QAAQ,KACtB,EAKD,IAAI4P,EAAW,SAASxO,EAAK,CACzB,IAAIK,EAAML,EAAI,SAAS,EAAE,EACzB,OAAOK,EAAI,SAAW,EAAI,IAAMA,EAAMA,CACzC,EAGGoO,EAAW,SAAS,EAAGtT,EAAGL,EAAG,CAC7B,MAAO,IAAM0T,EAAS,CAAC,EAAIA,EAASrT,CAAC,EAAIqT,EAAS1T,CAAC,CACtD,EAGG4T,EAAW,SAASrO,EAAK,CACzB,OAAO,SAAS,KAAOA,CAAG,CAC7B,EAGG+N,EAAW,SAAS/N,EAAK,CACzB,MAAO,CAACqO,EAASrO,EAAI,OAAO,EAAG,CAAC,CAAC,EAAGqO,EAASrO,EAAI,OAAO,EAAG,CAAC,CAAC,EAAGqO,EAASrO,EAAI,OAAO,EAAG,CAAC,CAAC,CAAC,CAC7F,EAEGgK,EAAQ,UAAW,CAEnB,IAAIsE,EAAiB,SAAS,cAAc,KAAK,EACjDA,EAAe,UAAY,cAG3B/P,EAAI,OAAS,GAGb,IAAIO,EAAI,SAAS,cAAc,OAAO,EACtCA,EAAE,aAAa,cAAe,GAAG,EACjCA,EAAE,aAAa,cAAe,GAAG,EAEjC,QAAS7D,EAAI,EAAGA,EAAIsD,EAAI,QAAQ,QAAQ,OAAQtD,IAAK,CAEjD,QADIsT,EAAK,SAAS,cAAc,IAAI,EAC3BvT,EAAI,EAAGA,EAAIuD,EAAI,QAAQ,QAAQtD,GAAG,OAAQD,IAAK,CACpD,IAAIwT,EAAK,SAAS,cAAc,IAAI,EAChCb,EAAQpP,EAAI,QAAQ,QAAQtD,GAAGD,GAC/B2S,EAAM,OAAS,GAAKA,EAAM,OAAO,EAAE,CAAC,IAAM,MAC1CA,EAAQ,IAAMA,GAElBa,EAAG,MAAM,gBAAkBb,EAC3Ba,EAAG,aAAa,aAAcb,CAAK,EACnCa,EAAG,UAAY,GACfD,EAAG,YAAYC,CAAE,EAGbjQ,EAAI,QAAQ,OAASoP,GACrBa,EAAG,UAAU,IAAI,iBAAiB,EAItCjQ,EAAI,OAAOoP,GAASa,CACvB,CACD1P,EAAE,YAAYyP,CAAE,CACnB,CAGD,OAAAD,EAAe,YAAYxP,CAAC,EAErBwP,CACV,EAGGG,EAAS,SAAS,cAAc,QAAQ,EAC5CA,EAAO,MAAQ,IACfA,EAAO,OAAS,IAChB,IAAIC,GAAUD,EAAO,WAAW,IAAI,EAEhCE,GAAe,UAAW,CAE1B,IAAIvL,EAAIqK,EAAK,WAAW,sBAAqB,EAC7CgB,EAAO,MAAQrL,EAAE,MAAQ,GACzBwL,GAAU,CACb,EAEGA,GAAW,UAAW,CACtB,IAAI9T,EAAI4T,GAAQ,qBAAqB,EAAG,EAAGD,EAAO,MAAO,CAAC,EAE1D3T,EAAE,aAAa,EAAM,cAAc,EACnCA,EAAE,aAAa,IAAM,gBAAgB,EACrCA,EAAE,aAAa,IAAM,cAAc,EACnCA,EAAE,aAAa,IAAM,gBAAgB,EACrCA,EAAE,aAAa,IAAM,cAAc,EACnCA,EAAE,aAAa,IAAM,gBAAgB,EACrCA,EAAE,aAAa,EAAM,cAAc,EACnC4T,GAAQ,UAAY5T,EACpB4T,GAAQ,SAAS,EAAG,EAAGD,EAAO,MAAOA,EAAO,MAAM,EAClD3T,EAAI4T,GAAQ,qBAAqB,EAAG,EAAG,EAAGD,EAAO,MAAM,EACvD3T,EAAE,aAAa,EAAK,qBAAqB,EACzCA,EAAE,aAAa,GAAK,qBAAqB,EACzCA,EAAE,aAAa,GAAK,eAAe,EACnCA,EAAE,aAAa,EAAK,eAAe,EACnC4T,GAAQ,UAAY5T,EACpB4T,GAAQ,SAAS,EAAG,EAAGD,EAAO,MAAOA,EAAO,MAAM,CACrD,EAEGI,GAAM,UAAW,CACjB,IAAIzO,EAAU,SAAS,cAAc,KAAK,EAC1CA,EAAQ,UAAY,aAEpB,IAAI0O,EAAQ,SAAS,cAAc,KAAK,EACxCA,EAAM,UAAY,eAElB,IAAI1C,EAAM,SAAS,cAAc,KAAK,EACtCA,EAAI,YAAYqC,CAAM,EACtBrC,EAAI,YAAY0C,CAAK,EACrB1O,EAAQ,YAAYgM,CAAG,EAGvB,IAAI5D,EAAS,SAASuG,EAAS/S,EAAGC,EAAG,CACjC,GAAI8S,IAAY,EAAG,CACf,IAAI3G,EAAOhI,EAAQ,wBACf4O,EAAOhT,EAAIoM,EAAK,KAChB6G,GAAMhT,EAAImM,EAAK,IACf4G,EAAO,IACPA,EAAO,GAEPC,GAAM,IACNA,GAAM,GAEND,EAAO5G,EAAK,QACZ4G,EAAO5G,EAAK,OAEZ6G,GAAM7G,EAAK,SACX6G,GAAM7G,EAAK,QAEf0G,EAAM,MAAM,KAAOE,EAAO,KAC1BF,EAAM,MAAM,IAAMG,GAAM,KACxB,IAAIC,GAAQR,GAAQ,aAAaM,EAAMC,GAAK,EAAG,CAAC,EAAE,KAClDf,EAAgBE,EAASc,GAAM,GAAIA,GAAM,GAAIA,GAAM,EAAE,CACxD,CACJ,EAGD,OAAA9O,EAAQ,iBAAiB,YAAa,SAASxF,EAAG,CAC9C4N,EAAO5N,EAAE,QAASA,EAAE,QAASA,EAAE,OAAO,CAClD,CAAS,EAEDwF,EAAQ,iBAAiB,YAAa,SAASxF,EAAG,CAC9C4N,EAAO5N,EAAE,QAASA,EAAE,QAASA,EAAE,OAAO,CAClD,CAAS,EAEDwF,EAAQ,iBAAiB,YAAa,SAASxF,EAAG,CAC9C4N,EAAO,EAAG5N,EAAE,eAAe,GAAG,QAASA,EAAE,eAAe,GAAG,OAAO,CAC9E,CAAS,EAEMwF,CACV,EAEG8N,EAAgB,GAEhBF,EAAY,CAAA,EAEZmB,EAAoB,UAAW,CAC/B,GAAIjB,IAAkB,GAClB,QAASjT,EAAI,EAAGA,EAAI+S,EAAU,OAAQ/S,IAAK,CACvC,IAAImU,EAAerB,EAASG,CAAa,EAEzCkB,EAAanU,GAAK,EAElB,IAAIoU,EAAc,8BAClBA,GAAeD,EAAa,KAAK,IAAI,EACrCC,GAAe,UAEfD,EAAanU,GAAK,IAElBoU,GAAeD,EAAa,KAAK,IAAI,EACrCC,GAAe,KAEfrB,EAAU/S,GAAG,MAAM,gBAAkBoU,CACxC,CAER,EAEGC,EAAU,UAAW,CAErB,IAAIC,EAAiB,SAAS,cAAc,KAAK,EACjDA,EAAe,UAAY,iBAE3B,IAAIC,EAAc,SAAS,cAAc,KAAK,EAG1CC,EAAoB,SAASC,EAAM,CACnC,IAAIC,EAAiB,SAAS,cAAc,KAAK,EACjDA,EAAe,UAAY,iCAE3B,IAAI9I,EAAQ,SAAS,cAAc,OAAO,EAC1CA,EAAM,UAAY6I,EAElB,IAAIE,GAAe,SAAS,cAAc,KAAK,EAC/CA,GAAa,UAAY,oCAEzB,IAAIC,GAAQ,SAAS,cAAc,OAAO,EAC1CA,GAAM,KAAO,QACbA,GAAM,IAAM,EACZA,GAAM,IAAM,IACZA,GAAM,MAAQ,EAEdF,EAAe,YAAY9I,CAAK,EAChC+I,GAAa,YAAYC,EAAK,EAE9B,IAAIvQ,GAAQ,SAAS,cAAc,KAAK,EACxC,OAAAA,GAAM,UAAYuQ,GAAM,MAExBA,GAAM,iBAAiB,QAAS,UAAW,CACvCvQ,GAAM,UAAYuQ,GAAM,KACxC,CAAa,EAEDD,GAAa,YAAYtQ,EAAK,EAC9BqQ,EAAe,YAAYC,EAAY,EAEvCJ,EAAY,YAAYG,CAAc,EAE/BE,EACV,EAGD7B,EAAY,CACRyB,EAAkB,KAAK,EACvBA,EAAkB,OAAO,EACzBA,EAAkB,MAAM,CACpC,EAEQF,EAAe,YAAYC,CAAW,EAGtC,IAAIM,EAAqB,SAAS,cAAc,KAAK,EACrDA,EAAmB,UAAY,6BAE/B,IAAIC,EAAgB,SAAS,cAAc,KAAK,EAChDA,EAAc,MAAM,WAAa,SACjCA,EAAc,UAAY,IAC1BD,EAAmB,YAAYC,CAAa,EAG5C,IAAIC,EAAe,UAAW,CAC1B,IAAIC,EAAc7B,EAAS,SAASJ,EAAU,GAAG,KAAK,EAAG,SAASA,EAAU,GAAG,KAAK,EAAG,SAASA,EAAU,GAAG,KAAK,CAAC,EAEnH+B,EAAc,UAAYE,EAC1BF,EAAc,MAAM,MAAQE,EAC5BF,EAAc,MAAM,eAAe,YAAY,EAE/C7B,EAAgB+B,CACnB,EAGD,OAAAjC,EAAU,QAAQ,SAASC,EAAU,CACjCA,EAAS,iBAAiB,QAAS,UAAW,CAC1C+B,IACAb,GAChB,CAAa,CACb,CAAS,EAEDI,EAAe,YAAYO,CAAkB,EAEtCP,CACV,EAEG/E,EAAO,UAAW,CAElBjM,EAAI,WAAWuC,CAAO,EAGlBvB,EAAG,SAAW,UACdA,EAAG,UAAU,IAAI,cAAc,EAC/BA,EAAG,SAAW,IAIlB6N,EAAY,SAAS,cAAc,KAAK,EACxCA,EAAU,UAAY,SAGtBC,EAAW,SAAS,cAAc,KAAK,EACvCA,EAAS,UAAY,kBACrBD,EAAU,YAAYC,CAAQ,EAG9BC,EAAU,SAAS,cAAc,KAAK,EACtCA,EAAQ,UAAY,iBAGpB,IAAIV,EAAW,SAAS,cAAc,KAAK,EAC3CA,EAAS,UAAY,kBACrBU,EAAQ,YAAYV,CAAQ,EAG5BW,EAAe,SAAS,cAAc,KAAK,EAC3CA,EAAY,UAAY,eACxBA,EAAY,UAAYhP,EAAI,QAAQ,WACpCqO,EAAS,YAAYW,CAAW,EAGhCC,EAAe,SAAS,cAAc,KAAK,EAC3CA,EAAY,UAAY,eACxBA,EAAY,UAAYjP,EAAI,QAAQ,UACpCqO,EAAS,YAAYY,CAAW,EAGhCC,EAAO,SAAS,cAAc,KAAK,EACnCH,EAAQ,YAAYG,CAAI,EAGxBC,EAAclC,GAAKiC,EAAM,CACrB,UAAW,GACX,KAAM,CACF,CACI,MAAO,OACP,eAAgBzD,EAAO,CAC1B,EACD,CACI,MAAO,WACP,eAAgB6E,GAAK,CACxB,EACD,CACI,MAAO,UACP,eAAgBS,EAAS,CAC5B,CACJ,EACD,SAAU,SAASlP,EAAS8P,EAAU9Q,EAAO,CACzC,GAAIA,IAAU,EACVuP,SACG,CACH,IAAIhB,EAAQO,IAAkB,GAAKA,EAAgB3P,EAAI,WAEvD,GAAIa,IAAU,GAAKuO,EAAO,CACtB,IAAI1N,EAAM8N,EAASJ,CAAK,EAExBK,EAAU,QAAQ,SAASC,EAAU7O,EAAO,CACxC6O,EAAS,MAAQhO,EAAIb,GACrB6O,EAAS,cAAc,IAAI,MAAM,OAAO,CAAC,CACrE,CAAyB,CACJ,CACJ,CACJ,EACD,QAAS,QACrB,CAAS,EAEDb,EAAU,YAAYE,CAAO,EAGzB/N,EAAG,SAAW,QACdA,EAAG,WAAW,aAAa6N,EAAW7N,EAAG,WAAW,EAEpDA,EAAG,YAAY6N,CAAS,EAG5BA,EAAU,iBAAiB,QAAS,SAASxS,EAAG,CAC5C,GAAIA,EAAE,OAAO,SAAW,KAAM,CAC1B,IAAI0E,EAAQ1E,EAAE,OAAO,aAAa,YAAY,EAC1C0E,GACAf,EAAI,SAASe,CAAK,CAEtC,MAAuB1E,EAAE,OAAO,UAAU,SAAS,cAAc,GACjD2D,EAAI,SAAS,EAAE,EACfA,EAAI,MAAK,GACF3D,EAAE,OAAO,UAAU,SAAS,cAAc,GAC7C8S,EAAY,UAAW,EAAG,GAC1BnP,EAAI,SAAS2P,CAAa,EAE9B3P,EAAI,MAAK,GACF3D,EAAE,OAAO,UAAU,SAAS,iBAAiB,EACpD2D,EAAI,MAAK,EAETA,EAAI,KAAI,CAExB,CAAS,EAKDgB,EAAG,iBAAiB,UAAW,SAAS3E,EAAG,CACvC2D,EAAI,KAAI,CACpB,CAAS,EAGD,OAAO,iBAAiB,SAAU,UAAW,CACrC6O,EAAU,UAAU,SAAS,cAAc,GAAKM,EAAY,UAAW,GAAI,GAC3EiB,IAEhB,CAAS,EAGGpQ,EAAI,QAAQ,QAAU,IACtBA,EAAI,KAAI,EAIZgB,EAAG,OAAShB,EAAI,SAGhBgB,EAAG,IAAM,SAASmB,EAAK,CACnB,GAAIA,IAAQ,OACR,OAAOnC,EAAI,WAEXA,EAAI,SAASmC,CAAG,CAEvB,EAGDnB,EAAG,MAAQhB,EAGX6O,EAAU,MAAQ7O,CACrB,EAED,OAAAA,EAAI,MAAQ,SAAS0B,EAAK,CACtB,IAAID,EAAM,SAAShE,EAAG,CAClB,OAAQ,IAAM,SAASA,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CACnD,EACD,GAAIiE,EACA,MAAI,kBAAkB,KAAKA,CAAG,EACnBA,GAEPA,EAAMA,EAAI,MAAM,kCAAkC,EAC9CA,GAAOA,EAAI,OACJ,IAAMD,EAAIC,EAAI,EAAE,EAAID,EAAIC,EAAI,EAAE,EAAID,EAAIC,EAAI,EAAE,EAE5C,GAItB,EAEDuK,IAEOjM,CACV,CAKD,SAAS4R,IAAc,CAEnB,IAAIrO,EAAY,SAASvC,EAAIuB,EAAS,CAElC,IAAIvC,EAAM,CAAC,KAAM,aAAa,EAC9BA,EAAI,QAAU,GAGd,IAAIwC,EAAW,CACX,MAAO,KACP,QAAS,IACrB,EAGQ,QAASE,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,GAEhC1C,EAAI,QAAQ0C,GAAYF,EAASE,GAKzC1B,EAAG,UAAU,IAAI,cAAc,EAK/BhB,EAAI,KAAO,SAAU3D,EAAGwV,EAAO,CAuB3B,GAtBIA,IAEA7R,EAAI,QAAQ,MAAQ6R,EAEpB7R,EAAI,OAAO6R,CAAK,GAIhBtO,EAAU,SACVA,EAAU,QAAQ,QAItB9C,EAAST,EAAK,EAAI,EAGlBgB,EAAG,UAAU,IAAI,oBAAoB,EAGrCuC,EAAU,QAAUvD,EAGfA,EAAI,QAAQ,OAASA,EAAI,QAAQ,MAAM,OAAS,GAAMgB,EAAG,SAAS,OAAQ,CAC3E,GAAI3E,EAAE,OACF,GAAIA,EAAE,gBAAkBA,EAAE,eAAe,GACrCoB,EAAIpB,EAAE,eAAe,GAAG,QACxBqB,EAAIrB,EAAE,eAAe,GAAG,YAExB,KAAIoB,EAAIpB,EAAE,QACNqB,EAAIrB,EAAE,YAGd,KAAIoB,EAAIpB,EAAE,EACNqB,EAAIrB,EAAE,EAGd,IAAIwN,EAAO7I,EAAG,wBAEd,GAAI,OAAO,YAActD,EAAImM,EAAK,OAAQ,CACtC,IAAIrN,EAAIkB,EAAImM,EAAK,OACbrN,EAAI,IACJA,EAAI,GAERwE,EAAG,MAAM,IAAMxE,EAAI,IACvC,MACoBwE,EAAG,MAAM,IAAMtD,EAAI,KAGnB,OAAO,WAAaD,EAAIoM,EAAK,MACzBpM,EAAIoM,EAAK,MAAQ,EACjB7I,EAAG,MAAM,KAAQvD,EAAIoM,EAAK,MAAS,KAEnC7I,EAAG,MAAM,KAAO,OAGpBA,EAAG,MAAM,KAAOvD,EAAI,IAE3B,CACJ,EAEDuC,EAAI,SAAW,UAAY,CACvB,MAAO,EAAAgB,EAAG,UAAU,SAAS,oBAAoB,CACpD,EAKDhB,EAAI,MAAQ,UAAY,CAChBgB,EAAG,UAAU,SAAS,oBAAoB,GAC1CA,EAAG,UAAU,OAAO,oBAAoB,EAE5CP,EAAST,EAAK,EAAK,CACtB,EAMDA,EAAI,OAAS,SAAU6R,EAAO,CAE1B7Q,EAAG,UAAY,GAGf,IAAI8Q,EAAaC,IACjB/Q,EAAG,YAAY8Q,CAAU,EAGzB,QAASrV,EAAI,EAAGA,EAAIoV,EAAM,OAAQpV,IAAK,CACnC,IAAIuV,EAAgBC,EAAkBJ,EAAMpV,EAAE,EAC9CuE,EAAG,YAAYgR,CAAa,CAC/B,CACJ,EAOD,SAASD,GAAe,CACpB,IAAI3D,EAAS,SAAS,cAAc,KAAK,EACzCA,EAAO,UAAU,IAAI,QAAQ,EAC7BA,EAAO,iBAAiB,QAAS,SAAU/R,EAAG,CAC1CA,EAAE,eAAc,EAChBA,EAAE,gBAAe,CACjC,CAAa,EACD,IAAIuR,EAAQ,SAAS,cAAc,GAAG,EACtCA,EAAM,UAAU,IAAI,OAAO,EAC3BA,EAAM,UAAYpN,EAAW,UAAU,MAAM,EAE7C4N,EAAO,YAAYR,CAAK,EAExB,IAAIqB,EAAc,SAAS,cAAc,GAAG,EAC5C,OAAAA,EAAY,UAAU,IAAI,OAAO,EACjCA,EAAY,UAAYzO,EAAW,UAAU,OAAO,EACpDyO,EAAY,iBAAiB,QAAS,SAAU5S,EAAG,CAC/C2D,EAAI,MAAK,CACzB,CAAa,EAEDoO,EAAO,YAAYa,CAAW,EAEvBb,CACV,CAOD,SAAS6D,EAAkBvD,EAAM,CAC7B,GAAIA,EAAK,OAASA,EAAK,MAAQ,QAAUA,EAAK,MAAQ,WAClD,IAAIsD,EAAgB,SAAS,cAAc,IAAI,MAC5C,CACH,IAAIA,EAAgB,SAAS,cAAc,KAAK,EAC5CE,EAAW,SAAS,cAAc,GAAG,EA6BzC,GA5BAA,EAAS,UAAYxD,EAAK,MAEtBA,EAAK,SACLsD,EAAc,aAAa,QAAStD,EAAK,OAAO,EAGhDA,EAAK,MACLsD,EAAc,aAAa,YAAatD,EAAK,IAAI,EAGjDA,EAAK,KACLsD,EAAc,GAAKtD,EAAK,IAGxBA,EAAK,SACLsD,EAAc,UAAY,wBACnBtD,EAAK,UACZsD,EAAc,OAAStD,EAAK,QAC5BsD,EAAc,iBAAiB,YAAa,SAAU3V,GAAG,CACrDA,GAAE,eAAc,CACxC,CAAqB,EACD2V,EAAc,iBAAiB,UAAW,SAAU3V,GAAG,CAEnD,KAAK,OAAO,KAAMA,EAAC,CAC3C,CAAqB,GAEL2V,EAAc,YAAYE,CAAQ,EAE9BxD,EAAK,QAAS,CACd,IAAIyD,EAAkB,SAAS,cAAc,MAAM,EACnDA,EAAgB,UAAY,UAC5BH,EAAc,YAAYG,CAAe,EACzCH,EAAc,UAAU,IAAI,oBAAoB,EAChD,IAAII,EAAa,SAAS,cAAc,KAAK,EAE7CA,EAAW,UAAU,IAAI,cAAc,EAEvCA,EAAW,aAAa,WAAY,KAAK,EAIzC,QADIC,EAAU3D,EAAK,QACVjS,EAAI,EAAGA,EAAI4V,EAAQ,OAAQ5V,IAAK,CACrC,IAAI6V,EAAuBL,EAAkBI,EAAQ5V,EAAE,EACvD2V,EAAW,YAAYE,CAAoB,CAC9C,CAEDN,EAAc,YAAYI,CAAU,CACxD,SAA2B1D,EAAK,SAAU,CACtB,IAAI6D,GAAe,SAAS,cAAc,MAAM,EAChDA,GAAa,UAAY7D,EAAK,SAC9BsD,EAAc,YAAYO,EAAY,CACzC,CACJ,CACD,OAAOP,CACV,CAED,OAAI,OAAQhS,EAAI,QAAQ,SAAY,YAChCgB,EAAG,iBAAiB,QAAS,SAAU3E,EAAG,CACtC2D,EAAI,QAAQ,QAAQA,EAAK3D,CAAC,CAC1C,CAAa,EAID2D,EAAI,QAAQ,OACZA,EAAI,OAAOA,EAAI,QAAQ,KAAK,EAGhC,OAAO,iBAAiB,aAAc,UAAY,CAC9CA,EAAI,MAAK,CACrB,CAAS,EAEDgB,EAAG,YAAchB,EAEVA,CACV,EAED,OAAOuD,CACV,CAE4B,IAAIiP,EAAeZ,GAAW,EAS3D,SAASa,IAAW,CAEhB,IAAIlP,EAAa,SAAUvC,EAAIuB,EAAS,CAEpC,GAAIvB,EAAG,SACH,OAAOA,EAAG,SAAS,WAAWuB,EAAS,EAAI,EAI/C,IAAIvC,EAAM,CAAC,KAAM,UAAU,EAC3BA,EAAI,QAAU,GAGd,IAAI0S,EAAU,SAAU1P,EAAMb,EAAK,CAE3Ba,GAAQA,EAAK,SAEThD,EAAI,QAAQ,cAAgB,KACxB,OAAOA,EAAI,QAAQ,aAAe,WAClCgD,EAAK,KAAKhD,EAAI,QAAQ,WAAW,EAEjCgD,EAAK,KAAK2P,CAAQ,GAI1B3S,EAAI,QAAQgD,CAAI,GAIhB,OAAQhD,EAAI,QAAQ,QAAW,YAC/BA,EAAI,QAAQ,OAAOgB,EAAIhB,EAAKgD,EAAMb,CAAG,EAIrCA,GACAyQ,EAAWzQ,CAAG,EAIOA,GAAQ,OAC7BnC,EAAI,QAAQ,MAAQ,IAExBgB,EAAG,MAAQhB,EAAI,QAAQ,MAGnBA,EAAI,QAAQ,QAAU,IACtBA,EAAI,KAAI,CAEf,EAIG2S,EAAW,SAAUE,EAAOC,EAAO,CACnC,IAAIC,EAAOC,EAqBX,OApBI,OAAOH,GAAS,SAChBE,EAAQF,EAEJA,EAAM,KACNE,EAAQF,EAAM,KACPA,EAAM,OACbE,EAAQF,EAAM,MAIlB,OAAOC,GAAS,SAChBE,EAAQF,EAEJA,EAAM,KACNE,EAAQF,EAAM,KACPA,EAAM,OACbE,EAAQF,EAAM,MAIlB,OAAOC,GAAS,UAAY,OAAOC,GAAS,UACxC,OAAOD,GAAS,WAChBA,EAAQ,GAAKA,GAEb,OAAOC,GAAS,WAChBA,EAAQ,GAAKA,GAEVD,EAAM,cAAcC,CAAK,GAEzBD,EAAQC,CAEtB,EAKGC,EAAa,UAAY,CAEzBjT,EAAI,MAAQ,GAEZ,QAASvD,EAAI,EAAGA,EAAIuD,EAAI,MAAM,OAAQvD,IAC9BuD,EAAI,MAAMvD,GAAG,UAAY,KACrBuD,EAAI,MAAMvD,GAAG,SACbuD,EAAI,MAAMvD,GAAG,QAAQ,UAAU,OAAO,oBAAoB,EAE9DuD,EAAI,MAAMvD,GAAG,SAAW,MAIhCuD,EAAI,QAAQ,MAAQ,GAEpBgB,EAAG,MAAQ,EACd,EAKG4R,EAAa,SAAUM,EAAQ,CAK/B,GAHAD,IAGIC,IAAW,KACX,GAAI,CAACA,EACG,OAAQlT,EAAI,MAAM,IAAS,MAC3BA,EAAI,MAAM,IAAM,QAEjB,CACE,MAAM,QAAQkT,CAAM,IACrBA,GAAU,GAAKA,GAAQ,MAAM,GAAG,GAEpC,QAASzW,EAAI,EAAGA,EAAIyW,EAAO,OAAQzW,IAC/BuD,EAAI,MAAMkT,EAAOzW,IAAM,EAE9B,CAIL,QAASA,EAAI,EAAGA,EAAIuD,EAAI,MAAM,OAAQvD,IAC9B,OAAQuD,EAAI,MAAMsG,EAAM7J,CAAC,GAAQ,MAC7BuD,EAAI,MAAMvD,GAAG,SACbuD,EAAI,MAAMvD,GAAG,QAAQ,UAAU,IAAI,oBAAoB,EAE3DuD,EAAI,MAAMvD,GAAG,SAAW,GAGxBuD,EAAI,MAAMsG,EAAM7J,CAAC,GAAK0W,EAAK1W,CAAC,GAKpCuD,EAAI,QAAQ,MAAQ,OAAO,KAAKA,EAAI,KAAK,EAAE,KAAK,GAAG,EAGnDA,EAAI,OAAO,MAAQA,EAAI,QAAO,CACjC,EAGGsG,EAAQ,SAAUjG,EAAGO,EAAG,CAExB,GAAKZ,EAAI,QAAQ,OAGb,IAAI0C,EAAW,SAFf,KAAIA,EAAW,QAKnB,OAAI1C,EAAI,MAAMK,GACNO,IAAM,OACCZ,EAAI,MAAMK,GAAG,KAAKqC,GAAY9B,EAE9BZ,EAAI,MAAMK,GAAG,KAAKqC,GAI1B,EACV,EAGGyQ,EAAO,SAAU9S,EAAGO,EAAG,CAEvB,GAAKZ,EAAI,QAAQ,OAGb,IAAI0C,EAAW,WAFf,KAAIA,EAAW,OAKnB,OAAI1C,EAAI,MAAMK,GACNO,IAAM,OACCZ,EAAI,MAAMK,GAAG,KAAKqC,GAAY9B,EAE9BZ,EAAI,MAAMK,GAAG,KAAKqC,GAI1B,EACV,EAEG0Q,EAAW,UAAY,CACvB,OAAO,OAAO,KAAKpT,EAAI,KAAK,CAC/B,EAEGqT,EAAU,UAAY,CAGtB,QAFIrQ,EAAO,CAAA,EACP3C,EAAI,OAAO,KAAKL,EAAI,KAAK,EACpBvD,EAAI,EAAGA,EAAI4D,EAAE,OAAQ5D,IAC1BuG,EAAK,KAAKhD,EAAI,MAAMK,EAAE5D,GAAG,EAE7B,OAAOuG,CACV,EAEDhD,EAAI,WAAa,SAAUuC,EAAS+G,EAAO,CAClC/G,IACDA,EAAU,CAAA,GAId,IAAIC,EAAW,CACX,IAAK,KACL,KAAM,CAAE,EACR,OAAQ,EACR,SAAU,GACV,aAAc,GACd,aAAc,GACd,YAAa,GACb,KAAM,KACN,MAAO,KACP,SAAU,KACV,OAAQ,GACR,MAAO,KACP,YAAa,GACb,WAAY,GACZ,SAAU,GACV,SAAU,KACV,OAAQ,KACR,OAAQ,KACR,QAAS,KACT,QAAS,KACT,OAAQ,KACR,SAAU,KACV,eAAgB,KAChB,SAAU,KACV,eAAgB,KAChB,YAAa,GACb,UAAW,GACX,OAAQ,KACR,WAAY,EACf,EAGD,QAASE,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,IAE5B,OAAQ1C,EAAI,QAAQ0C,GAAc,KAAe4G,IAAU,MAC3DtJ,EAAI,QAAQ0C,GAAYF,EAASE,IAM7C,OAAI1C,EAAI,QAAQ,cAAgB,IAAQA,EAAI,QAAQ,OAAS,eACzDA,EAAI,QAAQ,aAAe,IAI3BA,EAAI,QAAQ,YAAc,GAC1BA,EAAI,OAAO,UAAU,IAAI,eAAe,EAExCA,EAAI,OAAO,UAAU,OAAO,eAAe,EAI3CA,EAAI,QAAQ,cAAgB,GAC5BA,EAAI,OAAO,gBAAgB,UAAU,EAErCA,EAAI,OAAO,aAAa,WAAY,UAAU,EAI9CA,EAAI,QAAQ,YACZA,EAAI,OAAO,aAAa,cAAeA,EAAI,QAAQ,WAAW,EAE9DA,EAAI,OAAO,gBAAgB,aAAa,EAI5CgB,EAAG,UAAU,OAAO,qBAAqB,EACzCA,EAAG,UAAU,OAAO,kBAAkB,EACtCA,EAAG,UAAU,OAAO,gBAAgB,EAEhChB,EAAI,QAAQ,MAAQ,YACpBgB,EAAG,UAAU,IAAI,qBAAqB,EAC/BhB,EAAI,QAAQ,MAAQ,OAC3BgB,EAAG,UAAU,IAAI,gBAAgB,EAC1BhB,EAAI,QAAQ,MAAQ,SAC3BgB,EAAG,UAAU,IAAI,kBAAkB,EAE/BiB,EAAQ,eAAgB,EAAG,IACvBjC,EAAI,QAAQ,cACZgB,EAAG,UAAU,IAAI,qBAAqB,EACtChB,EAAI,QAAQ,KAAO,cAEnBgB,EAAG,UAAU,IAAI,kBAAkB,EACnChB,EAAI,QAAQ,KAAO,WAGnBA,EAAI,QAAQ,OACZgB,EAAG,MAAM,MAAQhB,EAAI,QAAQ,MAC7BgB,EAAG,MAAM,SAAWhB,EAAI,QAAQ,QAEhCgB,EAAG,MAAM,eAAe,OAAO,EAC/BA,EAAG,MAAM,eAAe,WAAW,GAGvCA,EAAG,UAAU,IAAI,mBAAmB,EACpChB,EAAI,QAAQ,KAAO,WAKvBA,EAAI,QAAQ,MAAQ,YACpBsT,EAAgB,YAAYrE,CAAW,EAEvCJ,EAAU,aAAaI,EAAaJ,EAAU,UAAU,EAIxD7O,EAAI,QAAQ,KAAO,CAACuC,EAAQ,KAC5B6B,GAAK,CACD,IAAKpE,EAAI,QAAQ,IACjB,OAAQ,MACR,SAAU,OACV,QAAS,SAAUgD,EAAM,CACjBA,GACA0P,EAAQ1P,EAAMhD,EAAI,QAAQ,KAAK,CAEtC,CACrB,CAAiB,EAED0S,EAAQ1S,EAAI,QAAQ,KAAMA,EAAI,QAAQ,KAAK,EAIxCA,CACV,EAGD,IAAIsT,EAAkB,KAClBzE,EAAY,KACZE,EAAU,KACVE,EAAc,KACdD,GAAc,KACdF,GAAW,KAEXyE,GAAW,KAKXtH,GAAO,UAAY,CAOnB,GALK1J,IACDA,EAAU,CAAA,GAIVvB,EAAG,SAAW,SAAU,CACxB,IAAImG,EAAM5D,EAAU,eAAevC,EAAIuB,CAAO,EAC9CvB,EAAKmG,EAAI,GACT5E,EAAU4E,EAAI,OACjB,CAGG,CAAC5E,EAAQ,aAAevB,EAAG,aAAa,aAAa,IACrDuB,EAAQ,YAAcvB,EAAG,aAAa,aAAa,GAIvDhB,EAAI,MAAQ,GAEZA,EAAI,MAAQ,GACZA,EAAI,OAAS,GAEbA,EAAI,OAAS,GACbA,EAAI,QAAU,KAGdgB,EAAG,UAAU,IAAI,WAAW,EAG5BsS,EAAkB,SAAS,cAAc,KAAK,EAC9CA,EAAgB,UAAY,6BAG5BtT,EAAI,OAAS,SAAS,cAAc,OAAO,EAC3CA,EAAI,OAAO,UAAY,8BACvBA,EAAI,OAAO,KAAO,OAClBA,EAAI,OAAO,aAAa,eAAgB,KAAK,EAC7CA,EAAI,OAAO,QAAU,UAAY,CACzB,OAAQA,EAAI,QAAQ,SAAY,YAChCA,EAAI,QAAQ,QAAQgB,CAAE,CAE7B,EAEDhB,EAAI,OAAO,OAAS,UAAY,CACxB,OAAQA,EAAI,QAAQ,QAAW,YAC/BA,EAAI,QAAQ,OAAOgB,CAAE,CAE5B,EAEDhB,EAAI,OAAO,QAAU,SAAU3D,EAAG,CAC1B2D,EAAI,QAAQ,cAAgB,IAAQ,CAACuT,IACjCvT,EAAI,QAAUA,EAAI,OAAO,MAAM,SAC/BuT,GAAW,WAAW,UAAY,CAC9BvT,EAAI,KAAKA,EAAI,OAAO,MAAM,KAAI,CAAE,EAChCuT,GAAW,IACd,EAAE,GAAG,GAGLvS,EAAG,UAAU,SAAS,iBAAiB,GACxChB,EAAI,KAAI,GAGPA,EAAI,QAAQ,cACbA,EAAI,KAAK3D,EAAE,GAAG,CAGzB,EAGIkH,EAAU,YAEXA,EAAU,UAAY,GAEtB,SAAS,iBAAiB,UAAWA,EAAU,OAAO,GAI1DsL,EAAY,SAAS,cAAc,KAAK,EACxCA,EAAU,UAAY,sBAGtBE,EAAU,SAAS,cAAc,KAAK,EACtCA,EAAQ,UAAY,oBAGpBE,EAAc,SAAS,cAAc,KAAK,EAC1CA,EAAY,UAAY,kBACxBA,EAAY,YAAc,OAG1BD,GAAc,SAAS,cAAc,KAAK,EAC1CA,GAAY,UAAY,kBACxBA,GAAY,YAAc,IAC1BA,GAAY,QAAU,UAAY,CAC9BhP,EAAI,MAAK,EACTA,EAAI,MAAK,CACZ,EAGD8O,GAAW,SAAS,cAAc,KAAK,EACvCA,GAAS,UAAY,qBAGrBwE,EAAgB,YAAYtT,EAAI,MAAM,EAEtC6O,EAAU,YAAYE,CAAO,EAC7B/N,EAAG,YAAYsS,CAAe,EAC9BtS,EAAG,YAAY6N,CAAS,EACxB7N,EAAG,YAAY8N,EAAQ,EAGvB9O,EAAI,WAAWuC,CAAO,EAElB,gBAAiB,SAAS,gBAC1BvB,EAAG,iBAAiB,YAAauC,EAAU,OAAO,EAElDvC,EAAG,iBAAiB,UAAWuC,EAAU,OAAO,EAIhDvD,EAAI,QAAQ,aAAe,IAC3BiD,GAAY8L,EAAS,CACjB,OAAQ/O,EAAI,OACZ,SAAUA,EAAI,QAClC,CAAiB,EAGL+O,EAAQ,QAAU,SAAU1S,EAAG,CAC3BA,EAAE,gBAAe,CACpB,EAGD2E,EAAG,OAAShB,EAAI,SAGhBgB,EAAG,IAAM,SAAUmB,EAAK,CACpB,GAAIA,IAAQ,OACR,OAAOnC,EAAI,SAAS,EAAAA,EAAI,QAAQ,QAAuB,EAEvDA,EAAI,SAASmC,CAAG,CAEvB,EAGDnB,EAAG,SAAWhB,CACjB,EAKDA,EAAI,OAAS,UAAY,CACrB,OAAOA,EAAI,QAAQ,GACtB,EAODA,EAAI,OAAS,SAAUgE,EAAKwP,EAAU,CAClCxT,EAAI,QAAQ,IAAMgE,EAElBI,GAAK,CACD,IAAKpE,EAAI,QAAQ,IACjB,OAAQ,MACR,SAAU,OACV,QAAS,SAAUgD,EAAM,CACrBhD,EAAI,QAAQgD,CAAI,EAEZ,OAAQwQ,GAAa,YACrBA,EAASxT,CAAG,CAEnB,CACjB,CAAa,CACJ,EAKDA,EAAI,MAAQ,SAAU0O,EAAM9N,EAAG,CAE3B,GAAKZ,EAAI,QAAQ,OAGb,IAAI0C,EAAW,SAFf,KAAIA,EAAW,QAKf,OAAQgM,GAAS,SACjBA,EAAKhM,GAAY9B,EAEjBZ,EAAI,MAAM0O,GAAM,KAAKhM,GAAY9B,CAExC,EAED,MAAM0N,EAAM,SAASV,EAAO7K,EAAI,CAC5B,GAAI,CAAE6K,EAAO,CACT,IAAInH,EAAUzG,EAAI,QAAQ,cAAgB,GAAOA,EAAI,OAAO,MAAQ,GAEpE,GADA4N,EAAQ,OAAOpN,EAAW,UAAU,kBAAkB,EAAGiG,CAAO,EAC5D,CAAEmH,EACF,MAAO,EAEd,CAQD,GALM7K,IACFA,EAAKd,EAAQ,QAIZjC,EAAI,QAAQ,OAMb,IAAI0O,EAAO,CACP,GAAI3L,EACJ,KAAM6K,CACT,MARD,KAAIc,EAAO,CACP,MAAO3L,EACP,KAAM6K,CACT,EASL,GAAI,OAAQ5N,EAAI,QAAQ,gBAAmB,WAAY,CACnD,IAAImH,EAAMnH,EAAI,QAAQ,eAAeA,EAAK0O,CAAI,EAC9C,GAAIvH,IAAQ,GACR,MAAO,GACAA,IACPuH,EAAOvH,EAEd,CAGDnH,EAAI,QAAQ,KAAK,KAAK0O,CAAI,EAG1B,IAAI+E,EAAUzT,EAAI,WAAW0O,CAAI,EAGjC,OAAAK,EAAQ,YAAY0E,EAAQ,OAAO,EAG/B,OAAQzT,EAAI,QAAQ,UAAa,YACjCA,EAAI,QAAQ,SAASA,EAAK0O,EAAM+E,CAAO,EAIvC1E,EAAQ,MAAM,SAAW,SACzBA,EAAQ,MAAM,QAAU,IAIxB/O,EAAI,SACJA,EAAI,QAAQ,KAAKyT,CAAO,EAGrB/E,CACV,EAOD1O,EAAI,IAAM,SAAU4N,EAAO7K,EAAI,CAC3B,OAAI,OAAQ/C,EAAI,QAAQ,QAAW,WACxBA,EAAI,QAAQ,OAAO,KAAKA,EAAKsO,CAAG,EAEpCA,EAAIV,EAAO7K,CAAE,CACvB,EAKD/C,EAAI,WAAa,SAAUgD,EAAMmB,EAAOuP,EAAW,CAE1C1T,EAAI,QAAQ,QAUT,CAACgD,EAAK,IAAMA,EAAK,QAAU,SAC3BA,EAAK,GAAKA,EAAK,OAGf,CAACA,EAAK,MAAQA,EAAK,OAAS,SAC5BA,EAAK,KAAOA,EAAK,QAdjB,CAACA,EAAK,OAASA,EAAK,KAAO,SAC3BA,EAAK,MAAQA,EAAK,IAGlB,CAACA,EAAK,MAAQA,EAAK,OAAS,SAC5BA,EAAK,KAAOA,EAAK,OAezB,IAAI0L,EAAO,CAAA,EA2BX,GA1BAA,EAAK,QAAU,SAAS,cAAc,KAAK,EAC3CA,EAAK,QAAQ,UAAY,iBACzBA,EAAK,QAAQ,WAAa1O,EAAI,MAAM,OACpC0O,EAAK,KAAO1L,EAGRmB,IACAuK,EAAK,MAAQvK,GAIbnB,EAAK,IACL0L,EAAK,QAAQ,aAAa,KAAM1L,EAAK,EAAE,EAIvCA,EAAK,UAAY,IACjB0L,EAAK,QAAQ,aAAa,gBAAiB,EAAI,EAI/C1L,EAAK,SACL0L,EAAK,QAAQ,aAAa,QAAS1L,EAAK,OAAO,EAI/CA,EAAK,MAAO,CACZ,IAAI2Q,EAAQ,SAAS,cAAc,KAAK,EACxCA,EAAM,UAAY,kBAClBA,EAAM,IAAM3Q,EAAK,MACZA,EAAK,OACN2Q,EAAM,UAAU,IAAI,uBAAuB,EAE/CjF,EAAK,QAAQ,YAAYiF,CAAK,CAC9C,SAAuB3Q,EAAK,KAAM,CAClB,IAAIyL,EAAO,SAAS,cAAc,MAAM,EACxCA,EAAK,UAAY,gCACjBA,EAAK,UAAYzL,EAAK,KACjBA,EAAK,OACNyL,EAAK,UAAU,IAAI,sBAAsB,EAEzCzL,EAAK,QACLyL,EAAK,MAAM,MAAQzL,EAAK,OAE5B0L,EAAK,QAAQ,YAAYD,CAAI,CAC7C,SAAuBzL,EAAK,MAAO,CACnB,IAAIoM,EAAQ,SAAS,cAAc,KAAK,EACxCA,EAAM,UAAY,kBAClBA,EAAM,MAAM,gBAAkBpM,EAAK,MACnC0L,EAAK,QAAQ,YAAYU,CAAK,CACjC,CAGD,GAAKpP,EAAI,QAAQ,OAGb,IAAI8M,EAAO9J,EAAK,SAFhB,KAAI8J,EAAO9J,EAAK,KAKpB,IAAI7B,EAAO,SAAS,cAAc,KAAK,EAKvC,GAJAA,EAAK,UAAY,wBACjBA,EAAK,YAAc2L,GAAQ,SAGvB9J,EAAK,MAAO,CACZ,IAAI4K,EAAQ,SAAS,cAAc,KAAK,EACxCA,EAAM,UAAY,kBAClBA,EAAM,UAAY5K,EAAK,MACvB7B,EAAK,YAAYyM,CAAK,CACzB,CAGD,GAAK5N,EAAI,QAAQ,OAGb,IAAImC,EAAMa,EAAK,OAFf,KAAIb,EAAMa,EAAK,MAMnB,OAAIhD,EAAI,MAAMmC,KACVuM,EAAK,QAAQ,UAAU,IAAI,oBAAoB,EAC/CA,EAAK,SAAW,IAIpB1O,EAAI,MAAM,KAAK0O,CAAI,EAGnBA,EAAK,QAAQ,YAAYvN,CAAI,EAEtBuN,CACV,EAED1O,EAAI,WAAa,SAAUgD,EAAM,CAE7B,GAAIA,EAAK,OAAQ,CAMb,QAJI6O,EAAQ,CAAA,EACR+B,EAAS,CAAA,EAGJnX,EAAI,EAAGA,EAAIuG,EAAK,OAAQvG,IAEzBuG,EAAKvG,GAAG,OACHmX,EAAO5Q,EAAKvG,GAAG,SAChBmX,EAAO5Q,EAAKvG,GAAG,OAAS,CAAA,GAE5BmX,EAAO5Q,EAAKvG,GAAG,OAAO,KAAKA,CAAC,GAE5BoV,EAAM,KAAKpV,CAAC,EAKpB,IAAIoX,EAAU,EAGVC,EAAa,OAAO,KAAKF,CAAM,EAGnC,GAAIE,EAAW,OAAS,EACpB,QAASrX,EAAI,EAAGA,EAAIqX,EAAW,OAAQrX,IAAK,CAExC,IAAI0H,EAAQ,SAAS,cAAc,KAAK,EACxCA,EAAM,UAAY,kBAElB,IAAIuP,EAAY,SAAS,cAAc,KAAK,EAC5CA,EAAU,UAAY,uBACtBA,EAAU,YAAcI,EAAWrX,GAEnC,IAAIsX,EAAa,SAAS,cAAc,GAAG,EAC3CA,EAAW,UAAY,mDACvBL,EAAU,YAAYK,CAAU,EAEhC,IAAIC,EAAe,SAAS,cAAc,KAAK,EAC/CA,EAAa,UAAY,wBACzB,QAAStX,EAAI,EAAGA,EAAIkX,EAAOE,EAAWrX,IAAI,OAAQC,IAAK,CACnD,IAAIgS,GAAO1O,EAAI,WAAWgD,EAAK4Q,EAAOE,EAAWrX,IAAIC,IAAKyH,EAAO2P,EAAWrX,EAAE,GAE1EuD,EAAI,QAAQ,aAAe,IAAS6T,EAAU,OAC9CG,EAAa,YAAYtF,GAAK,OAAO,EACrCmF,IAEP,CAED1P,EAAM,YAAYuP,CAAS,EAC3BvP,EAAM,YAAY6P,CAAY,EAE9BhU,EAAI,OAAO,KAAKmE,CAAK,EAEjB6P,EAAa,SAAS,OAAS,GAE/BjF,EAAQ,YAAY5K,CAAK,CAEhC,CAGL,GAAI0N,EAAM,OACN,QAASpV,EAAI,EAAGA,EAAIoV,EAAM,OAAQpV,IAAK,CACnC,IAAIiS,GAAO1O,EAAI,WAAWgD,EAAK6O,EAAMpV,GAAG,GACpCuD,EAAI,QAAQ,aAAe,IAAS6T,EAAU,OAC9C9E,EAAQ,YAAYL,GAAK,OAAO,EAChCmF,IAEP,CAER,CACJ,EAED7T,EAAI,QAAU,SAAUgD,EAAM,CAc1B,GAZAiQ,IAGAlE,EAAQ,YAAc,GAGtB/O,EAAI,OAAO,MAAQ,GAGnBA,EAAI,MAAQ,GAGRgD,GAAQA,EAAK,OAAQ,CACrB,QAASvG,EAAI,EAAGA,EAAIuG,EAAK,OAAQvG,IAEzB,OAAQuG,EAAKvG,IAAO,WAEfuD,EAAI,QAAQ,OAMbgD,EAAKvG,GAAK,CACN,GAAIuG,EAAKvG,GACT,KAAMuG,EAAKvG,EACd,EARDuG,EAAKvG,GAAK,CACN,MAAOuG,EAAKvG,GACZ,KAAMuG,EAAKvG,EACd,GAWbuD,EAAI,WAAWgD,CAAI,EAGnBhD,EAAI,QAAQ,KAAOgD,CACnC,MAEgBhD,EAAI,QAAQ,KAAO,GAGvBA,EAAI,MAAK,CACZ,EAEDA,EAAI,QAAU,UAAY,CACtB,OAAOA,EAAI,QAAQ,IACtB,EAKDA,EAAI,YAAc,SAAUmC,EAAK,CAC7B,QAAS1F,EAAI,EAAGA,EAAIuD,EAAI,MAAM,OAAQvD,IAClC,GAAI6J,EAAM7J,CAAC,GAAK0F,EACZ,OAAO1F,EAGf,MAAO,EACV,EAKDuD,EAAI,QAAU,SAAUiU,EAAS,CAE7B,IAAIrT,EAAIyS,IAER,OAAIY,EACOrT,EAEAA,EAAE,KAAK,IAAI,CAEzB,EAKDZ,EAAI,SAAW,SAAUiU,EAAS,CAE9B,IAAIrT,EAAIwS,IAER,OAAIa,EACOrT,EAEAA,EAAE,KAAK,GAAG,CAExB,EAKD,IAAIsT,EAAS,SAAUhK,EAAU,CAEzBlJ,EAAG,OAAShB,EAAI,QAAQ,QACxBgB,EAAG,MAAQhB,EAAI,QAAQ,MACnB,OAAQgB,EAAG,SAAY,YACvBA,EAAG,QAAQ,CACP,KAAM,QACN,OAAQA,EACR,MAAOA,EAAG,KAClC,CAAqB,GAKL,OAAQhB,EAAI,QAAQ,UAAa,YACjCA,EAAI,QAAQ,SAASgB,EAAIhB,EAAKkK,EAAUlK,EAAI,QAAQ,KAAK,CAEhE,EAKDA,EAAI,SAAW,SAAUoI,EAAU,CAE/B,IAAI8B,EAAWlK,EAAI,WAEf,MAAM,QAAQoI,CAAQ,IACtBA,EAAWA,EAAS,KAAK,GAAG,GAG5B8B,IAAa9B,IAEbwK,EAAWxK,CAAQ,EAGnB8L,EAAOhK,CAAQ,EAEtB,EAEDlK,EAAI,cAAgB,UAAY,CAC5BA,EAAI,SAAS,IAAI,CACpB,EAEDA,EAAI,YAAc,SAAUa,EAAOsT,EAAO,CAEtC,IAAItT,EAAQ,SAASA,CAAK,EAG1B,GAAIb,EAAI,OAASA,EAAI,MAAMa,KAAWsT,IAAU,IAAQnU,EAAI,MAAMa,GAAO,KAAK,WAAa,IAKvF,GAHAb,EAAI,UAAUa,EAAO,EAAK,EAGtB,CAACb,EAAI,QAAQ,SAETA,EAAI,MAAMa,GAAO,SACbb,EAAI,QAAQ,aAAe,IAC3BA,EAAI,SAAS,IAAI,EAGrBA,EAAI,SAASsG,EAAMzF,CAAK,CAAC,EAI7Bb,EAAI,MAAK,MACN,CAEH,IAAIkK,EAAWlK,EAAI,QAAQ,MAGvBA,EAAI,MAAMa,GAAO,UACjBb,EAAI,MAAMa,GAAO,QAAQ,UAAU,OAAO,oBAAoB,EAC9Db,EAAI,MAAMa,GAAO,SAAW,GAE5B,OAAOb,EAAI,MAAMsG,EAAMzF,CAAK,KAG5Bb,EAAI,MAAMa,GAAO,QAAQ,UAAU,IAAI,oBAAoB,EAC3Db,EAAI,MAAMa,GAAO,SAAW,GAG5Bb,EAAI,MAAMsG,EAAMzF,CAAK,GAAKsS,EAAKtS,CAAK,GAIxCb,EAAI,QAAQ,MAAQ,OAAO,KAAKA,EAAI,KAAK,EAAE,KAAK,GAAG,EAG/CA,EAAI,QAAQ,cAAgB,KAC5BA,EAAI,OAAO,MAAQqT,EAAO,EAAG,KAAK,IAAI,GAI1Ca,EAAOhK,CAAQ,CAClB,CAER,EAEDlK,EAAI,WAAa,SAAU0O,EAAM,CAC7B1O,EAAI,YAAY0O,EAAK,UAAU,CAClC,EAED,IAAI0F,EAAS,SAAU/T,EAAGyD,EAAQ,CAC9B,QAASpH,EAAI,EAAGA,EAAIoH,EAAO,OAAQpH,IAC/B,GAAKsD,EAAI,QAAQ,QAKb,GAAI8D,EAAOpH,GAAG,IAAM2D,EAChB,MAAO,WALPyD,EAAOpH,GAAG,OAAS2D,EACnB,MAAO,GAQnB,MAAO,EACV,EAED,OAAAL,EAAI,KAAO,SAAUtE,EAAK,CACtB,GAAIsE,EAAI,QAAUtE,EAAI,KAAI,EACtB,MAAO,GAUX,GANAsE,EAAI,OAAStE,EAGbsE,EAAI,UAAS,EAGTA,EAAI,OAAO,OACX,QAASvD,EAAI,EAAGA,EAAIuD,EAAI,OAAO,OAAQvD,IACnCuD,EAAI,OAAOvD,GAAG,UAAU,YAAc,GAQ9C,GAHAsS,EAAQ,YAAc,GAGlB/O,EAAI,QAAQ,cAAgB,GAAM,CAElCA,EAAI,QAAU,KAEd,IAAIgE,EAAMhE,EAAI,QAAQ,IAGtB,IAAIqC,EAAI,CACJ,IAAK2B,EACL,OAAQ,MACR,KAAM,CAAE,EAAGtI,CAAK,EAChB,SAAU,OACV,QAAS,SAAUoI,EAAQ,CAEvB9D,EAAI,MAAQ,GAGZ,IAAIyG,GAAU,OAAO,KAAKzG,EAAI,KAAK,EACnC,GAAIyG,GAAQ,OACR,QAAShK,GAAI,EAAGA,GAAIgK,GAAQ,OAAQhK,KAC3B2X,EAAO3N,GAAQhK,IAAIqH,CAAM,IACrB9D,EAAI,QAAQ,OAGb8D,EAAO,QAAQ,CAAC,GAAI2C,GAAQhK,IAAI,KAAMuD,EAAI,MAAMyG,GAAQhK,IAAG,CAAC,EAF5DqH,EAAO,QAAQ,CAAC,MAAO2C,GAAQhK,IAAI,KAAMuD,EAAI,MAAMyG,GAAQhK,IAAG,CAAC,GAQ/EuD,EAAI,WAAW8D,CAAM,EAEhBA,EAAO,OAGRiL,EAAQ,MAAM,QAAU,GAFxBA,EAAQ,MAAM,QAAU,OAKxB,OAAO/O,EAAI,QAAQ,UAAc,YACjCA,EAAI,QAAQ,SAASA,EAAK8D,CAAM,CAEvC,CACJ,EAED,GAAI,OAAO9D,EAAI,QAAQ,gBAAoB,WAAY,CACnD,IAAImH,EAAMnH,EAAI,QAAQ,eAAeA,EAAKqC,CAAC,EAC3C,GAAI8E,IAAQ,GACR,OACO,OAAOA,GAAS,WACvB9E,EAAI8E,EAEX,CAGD/C,GAAK/B,CAAC,CACtB,KAAmB,CAEH3G,EAAM,IAAI,OAAOA,EAAK,IAAI,EAM1B,QAHI2Y,EAAU,CAAA,EAGL5X,EAAI,EAAGA,EAAIuD,EAAI,MAAM,OAAQvD,IAAK,CAEvC,IAAI6L,EAAQ6K,EAAK1W,CAAC,EAEdmR,EAAQ5N,EAAI,MAAMvD,GAAG,KAAK,OAAS,GAEnCiX,EAAY1T,EAAI,MAAMvD,GAAG,KAAK,OAAS,GAEvC6X,EAAUtU,EAAI,MAAMvD,GAAG,KAAK,SAAW,GACvC6X,IACAA,EAAUA,EAAQ,KAAK,GAAG,IAG1B5Y,GAAO,MAAQsE,EAAI,MAAMvD,GAAG,UAAY,IAAQ6L,EAAM,SAAU,EAAC,MAAM5M,CAAG,GAAKkS,EAAM,MAAMlS,CAAG,GAAKgY,EAAU,MAAMhY,CAAG,GAAK4Y,EAAQ,MAAM5Y,CAAG,IAC5I2Y,EAAQ,KAAKrU,EAAI,MAAMvD,EAAE,CAEhC,CAED,GAAI,CAAC4X,EAAQ,OACTtF,EAAQ,MAAM,QAAU,OAGxB/O,EAAI,QAAU,SACX,CACH+O,EAAQ,MAAM,QAAU,GAGxB/O,EAAI,QAAUqU,EAGd,IAAIE,EAASF,EAAQ,QAAU,EAG3BrU,EAAI,QAAQ,aAAe,IAAQuU,EAAS,MAC5CA,EAAS,KAGb,QAAS9X,EAAI,EAAGA,EAAI8X,EAAQ9X,IACpBuD,EAAI,QAAQvD,GAAG,OACVuD,EAAI,QAAQvD,GAAG,MAAM,YACtBsS,EAAQ,YAAY/O,EAAI,QAAQvD,GAAG,KAAK,EAE5CuD,EAAI,QAAQvD,GAAG,MAAM,UAAU,YAAYuD,EAAI,QAAQvD,GAAG,OAAO,GAEjEsS,EAAQ,YAAY/O,EAAI,QAAQvD,GAAG,OAAO,CAGrD,CACJ,CAGGuD,EAAI,QAAQ,WAAa,IACzBA,EAAI,MAAK,CAEhB,EAEDA,EAAI,KAAO,UAAY,CAEnB,GAAI,CAACgB,EAAG,UAAU,SAAS,iBAAiB,EAAG,CAE3CuC,EAAU,QAAUvD,EAGpBS,EAAST,EAAK,EAAI,EAGlBgB,EAAG,UAAU,IAAI,iBAAiB,EAG9BiB,EAAQ,eAAgB,EAAG,MACvBjC,EAAI,QAAQ,MAAQ,MAAQA,EAAI,QAAQ,MAAQ,WAChDyE,GAAU,YAAYoK,EAAW,CAAC,EAKtC7O,EAAI,QAAQ,cAAgB,KAC5BA,EAAI,OAAO,MAAQA,EAAI,OACvBA,EAAI,OAAO,SAIf,IAAIK,EAAI+S,IACR,GAAI/S,EAAE,GAAI,CACN,IAAImU,EAASxU,EAAI,YAAYK,EAAE,EAAE,EAC7BmU,IAAW,IACXxU,EAAI,UAAUwU,CAAM,CAE3B,CAGD,GAAI,CAACxU,EAAI,QAAQ,MAAQA,EAAI,QAAQ,MAAQ,UAAW,CACpD,IAAI6J,EAAO7I,EAAG,wBACVyT,EAAgB5F,EAAU,wBAE1B7O,EAAI,QAAQ,UACZ6O,EAAU,MAAM,SAAW,QACvB,OAAO,YAAchF,EAAK,OAAS4K,EAAc,QACjD5F,EAAU,MAAM,IAAM,GACtBA,EAAU,MAAM,OAAU,OAAO,YAAchF,EAAK,IAAO,EAAI,OAE/DgF,EAAU,MAAM,IAAMhF,EAAK,OAAS,KACpCgF,EAAU,MAAM,OAAS,IAE7BA,EAAU,MAAM,KAAOhF,EAAK,KAAO,MAE/B,OAAO,YAAcA,EAAK,OAAS4K,EAAc,QACjD5F,EAAU,MAAM,IAAM,GACtBA,EAAU,MAAM,OAAShF,EAAK,OAAS,EAAI,OAE3CgF,EAAU,MAAM,IAAM,GACtBA,EAAU,MAAM,OAAS,IAIjCA,EAAU,MAAM,SAAWhF,EAAK,MAAQ,KAEpC7J,EAAI,QAAQ,WACZ6O,EAAU,MAAM,SAAW7O,EAAI,QAAQ,UAGvC,CAACA,EAAI,MAAM,QAAUA,EAAI,QAAQ,cAAgB,GACjD+O,EAAQ,MAAM,QAAU,OAExBA,EAAQ,MAAM,QAAU,EAE/B,CACJ,CAGG,OAAQ/O,EAAI,QAAQ,QAAW,YAC/BA,EAAI,QAAQ,OAAOgB,CAAE,CAE5B,EAEDhB,EAAI,MAAQ,SAAUgK,EAAc,CAChC,OAAIhJ,EAAG,UAAU,SAAS,iBAAiB,IAEvChB,EAAI,OAAO,MAAQA,EAAI,QAAO,EAE9BA,EAAI,UAAS,EAET,CAACgK,GAAgB,OAAQhK,EAAI,QAAQ,SAAY,YACjDA,EAAI,QAAQ,QAAQgB,CAAE,EAGtBhB,EAAI,OAAO,MACXA,EAAI,OAAO,OAGfgB,EAAG,UAAU,OAAO,iBAAiB,EAErCP,EAAST,EAAK,EAAK,EAEnBuD,EAAU,QAAU,MAGjBvD,EAAI,UACd,EAKDA,EAAI,UAAY,SAAUa,EAAO6T,EAAa,CAS1C,GAPI1U,EAAI,cAAgB,MAEhBA,EAAI,OAASA,EAAI,MAAMA,EAAI,eAC3BA,EAAI,MAAMA,EAAI,cAAc,QAAQ,UAAU,OAAO,kBAAkB,EAI3Ea,GAAS,KACTb,EAAI,aAAe,aAEnBa,EAAQ,SAASA,CAAK,EAGlBb,EAAI,MAAMa,GAAO,QAAQ,aACzBb,EAAI,MAAMa,GAAO,QAAQ,UAAU,IAAI,kBAAkB,EACzDb,EAAI,aAAea,EAGf6T,IAAgB,IAAS1U,EAAI,MAAMA,EAAI,cAAc,SAAS,CAC9C+O,EAAQ,UACxB,IAAIlN,EAAU7B,EAAI,MAAMA,EAAI,cAAc,QAC1C+O,EAAQ,UAAYlN,EAAQ,UAAYA,EAAQ,UAAYA,EAAQ,UAAY,EACnF,CAGZ,EAGD7B,EAAI,YAAcA,EAAI,UACtBA,EAAI,aAAeA,EAAI,UAKvBA,EAAI,MAAQ,UAAY,CAEpBA,EAAI,UAAS,EAGbA,EAAI,SAAS,IAAI,CACpB,EAKDA,EAAI,MAAQ,UAAY,CAChBA,EAAI,QAAQ,cAAgB,IAC5BA,EAAI,UAAS,EAGjB,IAAI6R,EAAQ9C,EAAQ,iBAAiB,iBAAiB,EACtD,GAAI8C,EAAM,OAAQ,CACd,IAAI8C,EAAW9C,EAAM,GAAG,WACxB7R,EAAI,UAAU2U,CAAQ,CACzB,CACJ,EAKD3U,EAAI,KAAO,UAAY,CACfA,EAAI,QAAQ,cAAgB,IAC5BA,EAAI,SAAQ,EAGhB,IAAI6R,EAAQ9C,EAAQ,iBAAiB,iBAAiB,EACtD,GAAI8C,EAAM,OAAQ,CACd,IAAI8C,EAAW9C,EAAMA,EAAM,OAAS,GAAG,WACvC7R,EAAI,UAAU2U,CAAQ,CACzB,CACJ,EAED3U,EAAI,KAAO,SAAU4U,EAAQ,CACzB,IAAID,EAAW,KAEf,GAAIC,GACA,GAAIA,EAAO,QAAU,EAAG,CAEpB,IAAInO,EAAUzG,EAAI,cAAgB,GAElC4U,EAASA,EAAO,cAEhB,IAAIvY,EAAI,KACJwY,EAAI,KACJhD,EAAQ9C,EAAQ,iBAAiB,iBAAiB,EACtD,GAAI8C,EAAM,OAAQ,CACd,QAASpV,EAAI,EAAGA,EAAIoV,EAAM,OAAQpV,IAC9B,GAAIoV,EAAMpV,GAAG,WAAagK,IAClBpK,EAAI2D,EAAI,MAAM6R,EAAMpV,GAAG,eACnBoY,EAAIxY,EAAE,QAAQ,UAAU,MACxBwY,EAAIA,EAAE,cACFD,GAAUC,GAAG,CACbF,EAAW9C,EAAMpV,GAAG,WACpB,KACH,CAKjBuD,EAAI,UAAU2U,CAAQ,CACzB,CACJ,UAEG3U,EAAI,cAAgB,MAAaA,EAAI,cAAgB,KACrDA,EAAI,MAAK,MACN,CACH,IAAI6B,EAAU7B,EAAI,MAAMA,EAAI,cAAc,QAEtCmN,EAAOtL,EAAQ,mBACfsL,GACIA,EAAK,UAAU,SAAS,iBAAiB,IACzCA,EAAOA,EAAK,UAAU,YAE1BwH,EAAWxH,EAAK,YAEZtL,EAAQ,WAAW,UAAU,SAAS,uBAAuB,KACzDsL,EAAOtL,EAAQ,WAAW,WAAW,sBACjCsL,EAAK,UAAU,SAAS,iBAAiB,EACzCA,EAAOA,EAAK,UAAU,WACfA,EAAK,UAAU,SAAS,gBAAgB,EAC/CwH,EAAWxH,EAAK,WAEhBA,EAAO,MAIXA,IACAwH,EAAWxH,EAAK,aAKxBwH,IAAa,MACb3U,EAAI,UAAU2U,CAAQ,CAE7B,CAER,EAED3U,EAAI,KAAO,UAAY,CACnB,IAAI2U,EAAW,KAEf,GAAI3U,EAAI,eAAiB,KACrBA,EAAI,MAAK,MACN,CACH,IAAI6B,EAAU7B,EAAI,MAAMA,EAAI,cAAc,QAEtCkN,EAAOrL,EAAQ,uBACfqL,GACIA,EAAK,UAAU,SAAS,iBAAiB,IACzCA,EAAOA,EAAK,UAAU,WAE1ByH,EAAWzH,EAAK,YAEZrL,EAAQ,WAAW,UAAU,SAAS,uBAAuB,KACzDqL,EAAOrL,EAAQ,WAAW,WAAW,0BACjCqL,EAAK,UAAU,SAAS,iBAAiB,EACzCA,EAAOA,EAAK,UAAU,UACfA,EAAK,UAAU,SAAS,gBAAgB,EAC/CyH,EAAWzH,EAAK,WAEhBA,EAAO,MAIXA,IACAyH,EAAWzH,EAAK,YAI/B,CAEGyH,IAAa,MACb3U,EAAI,UAAU2U,CAAQ,CAE7B,EAED3U,EAAI,UAAY,UAAY,CAExB,GAAIA,EAAI,QACJ,IAAIqU,EAAUrU,EAAI,YAElB,KAAIqU,EAAUrU,EAAI,MAItB,IAAIuU,EAASF,EAAQ,QAAU,EAG3BrU,EAAI,QAAQ,aAAe,IAAQuU,EAAS,MAC5CA,EAAS,KAIbxF,EAAQ,YAAc,GAGtB,QAAStS,EAAI,EAAGA,EAAI8X,EAAQ9X,IACpB4X,EAAQ5X,GAAG,OACN4X,EAAQ5X,GAAG,MAAM,YAClBsS,EAAQ,YAAYsF,EAAQ5X,GAAG,KAAK,EAExC4X,EAAQ5X,GAAG,MAAM,UAAU,YAAY4X,EAAQ5X,GAAG,OAAO,GAEzDsS,EAAQ,YAAYsF,EAAQ5X,GAAG,OAAO,EAK9CsS,EAAQ,UAAY,CACvB,EAED/O,EAAI,SAAW,UAAY,CAEvB,GAAIA,EAAI,QACJ,IAAIqU,EAAUrU,EAAI,YAElB,KAAIqU,EAAUrU,EAAI,MAItB,IAAIuU,EAASF,EAAQ,OAGrB,GAAIE,EAAS,IAAK,CACdA,EAASA,EAAS,IAGlBxF,EAAQ,YAAc,GAGtB,QAAStS,EAAI8X,EAAQ9X,EAAI4X,EAAQ,OAAQ5X,IACjC4X,EAAQ5X,GAAG,OACN4X,EAAQ5X,GAAG,MAAM,YAClBsS,EAAQ,YAAYsF,EAAQ5X,GAAG,KAAK,EAExC4X,EAAQ5X,GAAG,MAAM,UAAU,YAAY4X,EAAQ5X,GAAG,OAAO,GAEzDsS,EAAQ,YAAYsF,EAAQ5X,GAAG,OAAO,EAK9CsS,EAAQ,UAAYA,EAAQ,YAC/B,CACJ,EAED/O,EAAI,OAAS,UAAY,CACrB,IAAIoH,EAAO,GAGX,GAAIpH,EAAI,QACJ,IAAIqU,EAAUrU,EAAI,YAElB,KAAIqU,EAAUrU,EAAI,MAGtB,IAAI6R,EAAQ9C,EAAQ,iBAAiB,iBAAiB,EAClD+F,EAAWjD,EAAM,GAAG,WACxBiD,EAAW9U,EAAI,MAAM8U,GACrB,IAAIjU,EAAQwT,EAAQ,QAAQS,CAAQ,EAAI,EAExC,GAAIjU,EAAQ,EAAG,CAGX,QAFI0T,EAAS,EAEN1T,EAAQ,GAAKwT,EAAQxT,IAAU0T,EAAS,KACvCF,EAAQxT,GAAO,OACVwT,EAAQxT,GAAO,MAAM,YACtBkO,EAAQ,aAAasF,EAAQxT,GAAO,MAAOkO,EAAQ,UAAU,EAEjEsF,EAAQxT,GAAO,MAAM,UAAU,aAAawT,EAAQxT,GAAO,QAASwT,EAAQxT,GAAO,MAAM,UAAU,UAAU,GAE7GkO,EAAQ,aAAasF,EAAQxT,GAAO,QAASkO,EAAQ,UAAU,EAGnElO,IACA0T,IAIJnN,EAAO,EACV,CAED,OAAOA,CACV,EAEDpH,EAAI,SAAW,UAAY,CACvB,IAAIoH,EAAO,GAGX,GAAIpH,EAAI,QACJ,IAAIqU,EAAUrU,EAAI,YAElB,KAAIqU,EAAUrU,EAAI,MAGtB,IAAI6R,EAAQ9C,EAAQ,iBAAiB,iBAAiB,EAClDgG,EAAWlD,EAAMA,EAAM,OAAS,GAAG,WACvCkD,EAAW/U,EAAI,MAAM+U,GACrB,IAAIlU,EAAQwT,EAAQ,QAAQU,CAAQ,EAAI,EAExC,GAAIlU,EAAQwT,EAAQ,OAAQ,CAExB,QADIE,EAAS,EACN1T,EAAQwT,EAAQ,QAAUA,EAAQxT,IAAU0T,EAAS,KACpDF,EAAQxT,GAAO,OACVwT,EAAQxT,GAAO,MAAM,YACtBkO,EAAQ,YAAYsF,EAAQxT,GAAO,KAAK,EAE5CwT,EAAQxT,GAAO,MAAM,UAAU,YAAYwT,EAAQxT,GAAO,OAAO,GAEjEkO,EAAQ,YAAYsF,EAAQxT,GAAO,OAAO,EAG9CA,IACA0T,IAIJnN,EAAO,EACV,CAED,OAAOA,CACV,EAED6E,KAEOjM,CACf,EAEI,OAAAuD,EAAU,QAAU,SAAUlH,EAAG,CAC7B,IAAI2Y,EAAW,KACf,GAAIA,EAAWzR,EAAU,SACrB,GAAIlH,EAAE,OAAS,IAAMA,EAAE,OAAS,EACxB2Y,EAAS,OAAO,OAASA,EAAS,cAAgB,MAAQA,EAAS,QAAQ,WAE3EA,EAAS,IAAG,GAGRA,EAAS,cAAgB,MAAQA,EAAS,QAAQ,cAAgB,IAAQA,EAAS,OAAO,OAAS,IACnGA,EAAS,KAAKA,EAAS,OAAO,KAAK,EAEvCA,EAAS,YAAYA,EAAS,YAAY,WAEvC3Y,EAAE,OAAS,GACd2Y,EAAS,cAAgB,KACzBA,EAAS,MAAK,EACPA,EAAS,aAAe,GAC/BA,EAAS,KAAI,EAEjB3Y,EAAE,eAAc,UACTA,EAAE,OAAS,GACd2Y,EAAS,cAAgB,KACzBA,EAAS,MAAK,EACPA,EAAS,aAAe,EAAIA,EAAS,MAAM,QAClDA,EAAS,KAAI,EAEjB3Y,EAAE,eAAc,UACTA,EAAE,OAAS,GAClB2Y,EAAS,MAAK,EACT3Y,EAAE,OAAO,UAAU,SAAS,kBAAkB,GAC/CA,EAAE,eAAc,UAEbA,EAAE,OAAS,GAClB2Y,EAAS,KAAI,EACR3Y,EAAE,OAAO,UAAU,SAAS,kBAAkB,GAC/CA,EAAE,eAAc,UAEbA,EAAE,OAAS,GAClB2Y,EAAS,MAAK,UACP3Y,EAAE,OAAS,GAAI,CACtB,GAAI2Y,EAAS,cAAgB,KACzBA,EAAS,MAAK,UACPA,EAAS,aAAe,EAC/B,QAASvY,EAAI,EAAGA,EAAI,EAAGA,IACnBuY,EAAS,KAAM,EAGvB3Y,EAAE,eAAc,CAChC,SAAuBA,EAAE,OAAS,GAAI,CACtB,GAAI2Y,EAAS,cAAgB,KACzBA,EAAS,MAAK,UACPA,EAAS,aAAe,EAAIA,EAAS,MAAM,OAClD,QAASvY,EAAI,EAAGA,EAAI,EAAGA,IACnBuY,EAAS,KAAM,EAGvB3Y,EAAE,eAAc,CACnB,EAER,EAEDkH,EAAU,QAAU,SAAUlH,EAAG,CAC7B,IAAIwF,EAAUI,EAAQ,YAAY5F,EAAE,OAAQ,WAAW,EACvD,GAAIwF,EAAS,CACT,IAAImT,EAAWnT,EAAQ,SACvB,GAAIxF,EAAE,OAAO,UAAU,SAAS,kBAAkB,EAC9C,GAAIwF,EAAQ,UAAU,SAAS,iBAAiB,GAAKA,EAAQ,UAAU,SAAS,mBAAmB,EAAG,CAClG,IAAIgI,EAAOhI,EAAQ,wBAEnB,GAAIxF,EAAE,gBAAkBA,EAAE,eAAe,GAAI,CACzC,IAAIoB,EAAIpB,EAAE,eAAe,GAAG,QACpBA,EAAE,eAAe,GAAG,OACpD,KAA2B,CACH,IAAIoB,EAAIpB,EAAE,QACFA,EAAE,OACb,CAEGwN,EAAK,OAASpM,EAAIoM,EAAK,MAAQ,GAC3BxN,EAAE,OAAO,UAAU,SAAS,eAAe,EAC3C2Y,EAAS,IAAG,EAEZA,EAAS,MAAK,EAGdA,EAAS,QAAQ,cAAgB,IACjCA,EAAS,MAAK,CAG1C,MACoBA,EAAS,KAAI,UAEV3Y,EAAE,OAAO,UAAU,SAAS,sBAAsB,EAAG,CAC5D,IAAIwV,EAAQxV,EAAE,OAAO,YAAY,SACjC,GAAIA,EAAE,OAAO,YAAY,MAAM,SAAW,OACtC,QAASI,EAAI,EAAGA,EAAIoV,EAAM,OAAQpV,IAC1BoV,EAAMpV,GAAG,MAAM,SAAW,QAC1BuY,EAAS,WAAWnD,EAAMpV,EAAE,CAIxD,MAAuBJ,EAAE,OAAO,UAAU,SAAS,uBAAuB,EACtDA,EAAE,OAAO,UAAU,SAAS,4BAA4B,GACxDA,EAAE,OAAO,UAAU,OAAO,4BAA4B,EACtDA,EAAE,OAAO,UAAU,IAAI,0BAA0B,EACjDA,EAAE,OAAO,WAAW,YAAY,MAAM,QAAU,SAEhDA,EAAE,OAAO,UAAU,OAAO,0BAA0B,EACpDA,EAAE,OAAO,UAAU,IAAI,4BAA4B,EACnDA,EAAE,OAAO,WAAW,YAAY,MAAM,QAAU,IAE7CA,EAAE,OAAO,UAAU,SAAS,gBAAgB,EACnD2Y,EAAS,WAAW3Y,EAAE,MAAM,EACrBA,EAAE,OAAO,UAAU,SAAS,iBAAiB,GAE7CA,EAAE,OAAO,UAAU,SAAS,uBAAuB,EAD1D2Y,EAAS,WAAW3Y,EAAE,OAAO,UAAU,EAGhCA,EAAE,OAAO,UAAU,SAAS,iBAAiB,EACpD2Y,EAAS,WAAW3Y,EAAE,OAAO,WAAW,UAAU,GAC3CA,EAAE,OAAO,UAAU,SAAS,iBAAiB,GAAKA,EAAE,OAAO,UAAU,SAAS,oBAAoB,IACzG2Y,EAAS,MAAK,CAErB,CACJ,EAEDzR,EAAU,eAAiB,SAAUvC,EAAIuB,EAAS,CAE9C,IAAI0S,EAASjU,EAoBb,GAnBKuB,IACDA,EAAU,CAAA,GAGVvB,EAAG,aAAa,UAAU,IAAM,CAACuB,GAAWA,EAAQ,UAAY,QAChEA,EAAQ,SAAW,IAEnBvB,EAAG,aAAa,aAAa,IAAM,CAACuB,GAAWA,EAAQ,aAAe,QACtEA,EAAQ,YAAcvB,EAAG,aAAa,aAAa,GAEnDA,EAAG,aAAa,mBAAmB,IAAM,CAACuB,GAAWA,EAAQ,cAAgB,QAC7EA,EAAQ,aAAe,KAEvB,CAACA,GAAWA,EAAQ,OAAS,QAC7BA,EAAQ,MAAQvB,EAAG,aAEnBA,EAAG,QAAU,CAACuB,GAAWA,EAAQ,OAAS,QAC1CA,EAAQ,MAAQvB,EAAG,OAEnB,CAACuB,GAAWA,EAAQ,MAAQ,KAAW,CACvCA,EAAQ,KAAO,GACf,QAAS7F,EAAI,EAAGA,EAAIsE,EAAG,SAAS,OAAQtE,IACpC,GAAIsE,EAAG,SAAStE,GAAG,SAAW,WAC1B,QAASD,EAAI,EAAGA,EAAIuE,EAAG,SAAStE,GAAG,SAAS,OAAQD,IAChD8F,EAAQ,KAAK,KAAK,CACd,MAAOvB,EAAG,SAAStE,GAAG,SAASD,GAAG,MAClC,KAAMuE,EAAG,SAAStE,GAAG,SAASD,GAAG,YACjC,MAAOuE,EAAG,SAAStE,GAAG,aAAa,OAAO,CACtE,CAAyB,OAGL6F,EAAQ,KAAK,KAAK,CACd,MAAOvB,EAAG,SAAStE,GAAG,MACtB,KAAMsE,EAAG,SAAStE,GAAG,WAC7C,CAAqB,CAGZ,EACG,CAAC6F,GAAWA,EAAQ,UAAY,QAChCA,EAAQ,SAAW,SAAUtG,EAAGC,EAAGC,EAAGC,EAAG,CACjCmG,EAAQ,UAAY,GAChB,IAAI,MAAMrG,GAAG,UAAU,SAAS,oBAAoB,EACpD+Y,EAAO,QAAQ/Y,GAAG,aAAa,WAAY,UAAU,EAErD+Y,EAAO,QAAQ/Y,GAAG,gBAAgB,UAAU,EAGhD+Y,EAAO,MAAQ7Y,CAEtB,GAGL,IAAIyR,EAAM,SAAS,cAAc,KAAK,EACtC,OAAA7M,EAAG,WAAW,aAAa6M,EAAK7M,CAAE,EAClCA,EAAG,MAAM,QAAU,OACnBA,EAAK6M,EAEE,CAAC,GAAI7M,EAAI,QAASuB,CAAO,CACnC,EAEMgB,CACV,CAE4B,IAAIyR,GAAYvC,GAAQ,EAKrD,SAASyC,GAAOlU,EAAIuB,EAAS,CAEzB,GAAIvB,EAAG,OACH,OAAOA,EAAG,OAAO,WAAWuB,EAAS,EAAI,EAI7C,IAAIvC,EAAM,CAAE,KAAM,UAClBA,EAAI,QAAU,GAEd,IAAImV,EAAiB,KACjBC,EAAkB,KAKlBC,EAAQ,SAAShT,EAAG,CACpB,OAAQA,aAAa,SAAWA,aAAa,YAChD,EAKGiT,EAAgB,UAAW,CAC3BF,EAAgB,UAAY,GAM5B,QAHIxR,EAAO,OAAO,KAAK5D,EAAI,QAAQ,IAAI,EAG9BvD,EAAI,EAAGA,EAAImH,EAAK,OAAQnH,IAAK,CAElC,IAAI8Y,EAAe,SAAS,cAAc,KAAK,EAC/CA,EAAa,UAAU,IAAI,cAAc,EACzCA,EAAa,EAAI3R,EAAKnH,GACtB8Y,EAAa,EAAIvV,EAAI,QAAQ,KAAK4D,EAAKnH,IAEvC,IAAIiS,EAAO1O,EAAI,SAAS4D,EAAKnH,GAAI8Y,CAAY,EACzCF,EAAM3G,CAAI,EACV6G,EAAa,YAAY7G,CAAI,EAE7B6G,EAAa,UAAY7G,EAG7B0G,EAAgB,YAAYG,CAAY,CAC3C,CACJ,EAKDvV,EAAI,WAAa,SAASuC,EAAS+G,EAAO,CAEtC,IAAI9G,EAAW,CACX,MAAO,EACP,KAAM,KACN,OAAQ,KACR,SAAU,KACV,YAAa,KACb,SAAU,KACV,OAAQ,KACR,QAAS,KACT,OAAQ,KACR,MAAO,KACP,OAAQ,GACR,MAAO,GACP,OAAQ,GACR,QAAS,GACT,QAAS,KACT,KAAM,KACN,OAAQ,IACX,EAGGD,GAAWA,EAAQ,UACnBA,EAAQ,KAAOA,EAAQ,SAI3B,QAASG,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,IAE5B,OAAO1C,EAAI,QAAQ0C,GAAc,KAAe4G,IAAU,MAC1DtJ,EAAI,QAAQ0C,GAAYF,EAASE,IAM7C,OAAI1C,EAAI,QAAQ,SAAW,GACvBmV,EAAe,MAAM,QAAU,OAE/BA,EAAe,MAAM,QAAU,GAI/BnV,EAAI,QAAQ,MACZmV,EAAe,MAAM,MAAQ,SAASnV,EAAI,QAAQ,KAAK,EAAI,KAE3DmV,EAAe,MAAM,MAAQ,GAI7BnV,EAAI,QAAQ,QACZoV,EAAgB,MAAM,UAAYpV,EAAI,QAAQ,OAAS,KACvDoV,EAAgB,MAAM,SAAW,UAEjCA,EAAgB,MAAM,SAAW,GAGjCpV,EAAI,QAAQ,QAAU,IAChBA,EAAI,QAAQ,MAIdoV,EAAgB,UAAU,IAAI,cAAc,EAC5CA,EAAgB,MAAM,oBAAsB,UAAYpV,EAAI,QAAQ,KAAO,WAJ3EoV,EAAgB,UAAU,IAAI,iBAAiB,EAC/CA,EAAgB,MAAM,MAAQpV,EAAI,QAAQ,MAAQA,EAAI,QAAQ,MAAQ,GAAKA,EAAI,QAAQ,QAAU,OAOrG,MAAM,SAASA,EAAI,QAAQ,KAAK,CAAC,IACjCA,EAAI,QAAQ,MAAQ,GAIxBsV,IAGAtV,EAAI,SAASA,EAAI,QAAQ,KAAK,EAGvBA,CACV,EAEDA,EAAI,SAAW,UAAW,CACtB,OAAOA,EAAI,QAAQ,KACtB,EAEDA,EAAI,SAAW,SAASK,EAAGhE,EAAG,CAwB1B,GAtBA2D,EAAI,SAASK,CAAC,EAGdL,EAAI,QAAQ,MAAQ,OAAOK,CAAC,EAGxBW,EAAG,OAAShB,EAAI,QAAQ,QACxBgB,EAAG,MAAQhB,EAAI,QAAQ,MACnB,OAAOgB,EAAG,SAAY,YACtBA,EAAG,QAAQ,CACP,KAAM,QACN,OAAQA,EACR,MAAOA,EAAG,KAC9B,CAAiB,GAILoU,EAAgB,SAAS/U,IAAM+U,EAAgB,SAAS/U,GAAG,aAAa,MAAM,IAAM,WACpFL,EAAI,MAAK,EAIT3D,GACI,OAAQ2D,EAAI,QAAQ,UAAa,WAAY,CAC7C,IAAIY,EAAIZ,EAAI,QAAQ,KAAKK,GAEzBL,EAAI,QAAQ,SAASgB,EAAIhB,EAAKY,EAAGA,EAAGP,EAAGhE,CAAC,CAC3C,CAER,EAED2D,EAAI,SAAW,SAASY,EAAG8N,EAAM,CAC7B,IAAIpG,EAAQtI,EAAI,QAAQ,KAAKY,IAAM,KACnC,OAAI,OAAOZ,EAAI,QAAQ,QAAW,aAC9BsI,EAAQtI,EAAI,QAAQ,OAAOsI,EAAOoG,CAAI,GAEnCpG,CACV,EAEDtI,EAAI,SAAW,SAASY,EAAG,CACvB,IAAI8N,EAEA1O,EAAI,QAAQ,QACZ0O,EAAO,6BAA+B1O,EAAI,QAAQ,QAAU,OAE5D0O,EAAO1O,EAAI,SAASY,EAAG,IAAI,EAG3ByU,EAAM3G,CAAI,GACVyG,EAAe,UAAY,GAC3BA,EAAe,YAAYzG,CAAI,GAE/ByG,EAAe,UAAYzG,CAElC,EAED1O,EAAI,KAAO,UAAW,CAClB,GAAI,CAAEgB,EAAG,UAAU,SAAS,eAAe,EAAG,CAE1CP,EAAST,EAAK,EAAI,EAGlBgB,EAAG,UAAU,IAAI,eAAe,EAChCA,EAAG,MAAK,EAER,IAAI0P,EAAM,EACND,EAAO,EAEX2E,EAAgB,MAAM,WAAa,GAEnC,IAAII,EAAaL,EAAe,wBAC5BrL,EAAcsL,EAAgB,wBAE9B,OAAO,YAAcI,EAAW,OAAS1L,EAAY,QAAU9J,EAAI,QAAQ,OAC3E0Q,EAAM,IAAM5G,EAAY,OAAS,GAEjC4G,EAAM8E,EAAW,OAAS,EAG1BxV,EAAI,QAAQ,QAAU,KACtByQ,EAAO,GAAK3G,EAAY,MAAQ0L,EAAW,OAG3C1L,EAAY,KAAO2G,EAAO,IAC1BA,EAAOA,EAAO3G,EAAY,KAAO,IAEjCA,EAAY,KAAOA,EAAY,MAAQ,OAAO,aAC9C2G,EAAO,IAAM,GAAK3G,EAAY,KAAOA,EAAY,MAAQ,OAAO,aAGpEsL,EAAgB,MAAM,UAAY,SAAS1E,CAAG,EAAI,KAClD0E,EAAgB,MAAM,WAAa,SAAS3E,CAAI,EAAI,KAGhD,OAAOzQ,EAAI,QAAQ,QAAU,YAC7BA,EAAI,QAAQ,OAAOgB,EAAIhB,CAAG,CAEjC,CACJ,EAEDA,EAAI,MAAQ,UAAW,CACfgB,EAAG,UAAU,SAAS,eAAe,IACrCA,EAAG,UAAU,OAAO,eAAe,EAGnCP,EAAST,EAAK,EAAK,EAEf,OAAOA,EAAI,QAAQ,SAAW,YAC9BA,EAAI,QAAQ,QAAQgB,EAAIhB,CAAG,EAGtC,EAKD,IAAIiM,EAAO,UAAW,CAElBjL,EAAG,UAAU,IAAI,SAAS,EAC1BA,EAAG,aAAa,WAAY,KAAK,EACjCA,EAAG,YAAc,SAAS3E,EAAG,CACnB2E,EAAG,UAAU,SAAS,eAAe,GACvChB,EAAI,KAAI,CAEf,EAGDmV,EAAiB,SAAS,cAAc,KAAK,EAC7CA,EAAe,UAAU,IAAI,gBAAgB,EAG7CC,EAAkB,SAAS,cAAc,KAAK,EAC9CA,EAAgB,UAAU,IAAI,iBAAiB,EAC/CA,EAAgB,QAAU,SAAS/Y,EAAG,CAClC,IAAIqS,EAAOzM,EAAQ,YAAY5F,EAAE,OAAQ,cAAc,EACnDqS,GACIA,EAAK,aAAe0G,GAEpBpV,EAAI,SAAS0O,EAAK,EAAGrS,CAAC,CAGjC,EAED2E,EAAG,YAAYmU,CAAc,EAC7BnU,EAAG,YAAYoU,CAAe,EAG9BpU,EAAG,MAAQuB,EAAQ,OAAS,EAG5BvC,EAAI,WAAWuC,CAAO,EAElB,OAAOvC,EAAI,QAAQ,QAAW,YAC9BA,EAAI,QAAQ,OAAOgB,EAAIhB,CAAG,EAI9BgB,EAAG,OAAShB,EAAI,SAGhBgB,EAAG,IAAM,SAASmB,EAAK,CACnB,GAAIA,IAAQ,OACR,OAAOnC,EAAI,WAEXA,EAAI,SAASmC,CAAG,CAEvB,EAGDnB,EAAG,OAAShB,CACf,EAED,OAAAiM,IAEOjM,CACV,CAOD,SAASyV,GAAQzU,EAAIuB,EAAS,CAE1B,IAAIvC,EAAM,CAAE,KAAK,WACjBA,EAAI,QAAU,GAGd,IAAIwC,EAAW,CACX,IAAK,KACL,UAAW,GACX,MAAO,GACP,MAAO,GACP,WAAY,GACZ,SAAU,KACV,OAAQ,GACR,MAAO,CAAE,CACZ,EAGD,QAASE,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,GAEhC1C,EAAI,QAAQ0C,GAAYF,EAASE,GAIrC,CAAE1B,GAAMuB,EAAQ,KAAOA,EAAQ,IAAI,KACnCvB,EAAK,SAAS,cAAc,KAAK,EACjCuB,EAAQ,IAAI,GAAG,YAAYvB,CAAE,GAIjC,IAAI0U,EAAe,SAAS,cAAc,KAAK,EAC/CA,EAAa,UAAU,IAAI,eAAe,EAC1CA,EAAa,UAAU,IAAI,gBAAgB,EAE3C,IAAIC,EAAkB,SAAS,cAAc,KAAK,EAClDA,EAAgB,UAAU,IAAI,mBAAmB,EACjDD,EAAa,YAAYC,CAAe,EAExC3V,EAAI,WAAa,SAAS6B,EAAS,CAE/B,QADIwI,EAAWuL,EAAe,SACrBnZ,EAAI,EAAGA,EAAI4N,EAAS,OAAQ5N,IAC7BoF,GAAWwI,EAAS5N,IACpB4N,EAAS5N,GAAG,UAAU,OAAO,mBAAmB,EAGxDoF,EAAQ,UAAU,IAAI,mBAAmB,CAC5C,EAED7B,EAAI,KAAO,UAAW,CAClByE,GAAU,YAAYzD,EAAI,EAAG,UAAW,CACpCA,EAAG,MAAM,QAAU,MAC/B,CAAS,CACJ,EAEDhB,EAAI,KAAO,UAAW,CAClBgB,EAAG,MAAM,QAAU,GACnByD,GAAU,YAAYzD,EAAI,CAAC,CAC9B,EAEDhB,EAAI,IAAM,UAAW,CACjB,OAAOgB,CACV,EAEDhB,EAAI,SAAW,SAASa,EAAOE,EAAO,CAClC6U,EAAe,SAAS/U,GAAO,SAAS,GAAG,WAAW,UAAYE,CACrE,EAEDf,EAAI,QAAU,UAAW,CACrB,QAAQ,OAAM,EACdgB,EAAG,UAAY,EAClB,EAEDhB,EAAI,OAAS,SAAS/D,EAAGC,EAAG,CACxB,QAASO,EAAI,EAAGA,EAAImZ,EAAe,SAAS,OAAQnZ,IAAK,CAErD,IAAIoZ,EAAcD,EAAe,SAASnZ,GAEtC,OAAOoZ,EAAY,aAAgB,YACnCA,EAAY,YAAY7U,EAAIhB,EAAK6V,EAAa5Z,EAAGC,CAAC,CAEzD,CACD,QAASO,EAAI,EAAGA,EAAIkZ,EAAgB,SAAS,OAAQlZ,IAAK,CAEtD,IAAIoZ,EAAcF,EAAgB,SAASlZ,GAEvC,OAAOoZ,EAAY,aAAgB,YACnCA,EAAY,YAAY7U,EAAIhB,EAAK6V,EAAa5Z,EAAGC,CAAC,CAEzD,CACJ,EAED8D,EAAI,OAAS,SAAS6R,EAAO,CAEzB+D,EAAe,UAAY,GAE3B,QAASnZ,EAAI,EAAGA,EAAIoV,EAAM,OAAQpV,IAAK,CACnC,IAAIoZ,EAAc,SAAS,cAAc,KAAK,EAiC9C,GAhCAA,EAAY,UAAU,IAAI,eAAe,EAErChE,EAAMpV,GAAG,QACToZ,EAAY,MAAM,MAAQ,SAAShE,EAAMpV,GAAG,KAAK,EAAI,MAGrDoV,EAAMpV,GAAG,IACToZ,EAAY,EAAIhE,EAAMpV,GAAG,GAGzBoV,EAAMpV,GAAG,SACToZ,EAAY,aAAa,QAAShE,EAAMpV,GAAG,OAAO,EAIlDoV,EAAMpV,GAAG,IACToZ,EAAY,aAAa,KAAMhE,EAAMpV,GAAG,EAAE,EAI1CoV,EAAMpV,GAAG,cACToZ,EAAY,YAAchE,EAAMpV,GAAG,aAGnCoV,EAAMpV,GAAG,QACToZ,EAAY,UAAU,IAAI,iBAAiB,EAG3ChE,EAAMpV,GAAG,UACToZ,EAAY,UAAU,IAAI,mBAAmB,EAG7ChE,EAAMpV,GAAG,MAAQ,UAAYoV,EAAMpV,GAAG,MAAQ,WAC9CyY,GAAOW,EAAahE,EAAMpV,EAAE,UACrBoV,EAAMpV,GAAG,MAAQ,UACxBoZ,EAAY,UAAU,IAAI,kBAAkB,UACrChE,EAAMpV,GAAG,MAAQ,QACxBoZ,EAAY,UAAU,IAAI,gBAAgB,EAC1CA,EAAY,UAAYhE,EAAMpV,GAAG,YAC9B,CAEH,IAAIqZ,EAAc,SAAS,cAAc,GAAG,EAC5C,GAAI,OAAOjE,EAAMpV,GAAG,MAAW,IAC3BqZ,EAAY,UAAU,IAAI,gBAAgB,MAG1C,SADI3Z,EAAI0V,EAAMpV,GAAG,MAAM,MAAM,GAAG,EACvBC,EAAI,EAAGA,EAAIP,EAAE,OAAQO,IAC1BoZ,EAAY,UAAU,IAAI3Z,EAAEO,EAAE,EAOtC,GAJAoZ,EAAY,UAAYjE,EAAMpV,GAAG,QAAUoV,EAAMpV,GAAG,QAAU,GAC9DoZ,EAAY,YAAYC,CAAW,EAG/B9V,EAAI,QAAQ,OAAS,GAAM,CAC3B,IAAI+V,EAAe,SAAS,cAAc,KAAK,EAC/CA,EAAa,UAAU,IAAI,QAAQ,EACnC,IAAIC,EAAsB,SAAS,cAAc,KAAK,EACtDA,EAAoB,UAAYnE,EAAMpV,GAAG,MAAQoV,EAAMpV,GAAG,MAAQ,GAClEsZ,EAAa,YAAYC,CAAmB,EAC5CH,EAAY,YAAYE,CAAY,CACvC,CAGD,GAAIlE,EAAMpV,GAAG,MACT,GAAIuD,EAAI,QAAQ,OAAS,GAAM,CAC3B,IAAIiW,GAAe,SAAS,cAAc,MAAM,EAChDA,GAAa,UAAYpE,EAAMpV,GAAG,MAClCoZ,EAAY,YAAYI,EAAY,CAC5D,MACwBJ,EAAY,aAAa,QAAShE,EAAMpV,GAAG,KAAK,EAIpDuD,EAAI,QAAQ,KAAO6R,EAAMpV,GAAG,QAE5BoZ,EAAY,MAAQhE,EAAMpV,GAAG,MAE7BoZ,EAAY,QAAU,UAAW,CAC7B7V,EAAI,QAAQ,IAAI,MAAM,KAAK,KAAK,CACnC,EAEDA,EAAI,QAAQ,IAAI,MAAM6R,EAAMpV,GAAG,MAAO,CAClC,YAAaoZ,EACb,OAAQ,EAChC,CAAqB,GAID,OAAOhE,EAAMpV,GAAG,QAAY,YAC5BoV,EAAMpV,GAAG,OAAOoZ,EAAahE,EAAMpV,EAAE,CAE5C,CAEGoV,EAAMpV,GAAG,UACToZ,EAAY,QAAUhE,EAAMpV,GAAG,QAAQ,KAAKoV,EAAMpV,GAAIuE,EAAIhB,EAAK6V,CAAW,GAG9ED,EAAe,YAAYC,CAAW,CACzC,CAGD,WAAW,UAAW,CAClB7V,EAAI,QAAO,CACd,EAAE,CAAC,CACP,EAEDA,EAAI,KAAO,UAAW,CAClB0V,EAAa,UAAU,IAAI,yBAAyB,EAElC1U,EAAG,sBAAwB,EAC7C,IAAI6I,EAAO8L,EAAgB,wBACvB9L,EAAK,OAAS,OAAO,aAAe7J,EAAI,QAAQ,OAChD2V,EAAgB,MAAM,OAAS,IAE/BA,EAAgB,MAAM,eAAe,QAAQ,EAGjDA,EAAgB,MAAM,MAAQ,IAE9BD,EAAa,SAAS,GAAG,MAAK,EAE9BjV,EAAST,EAAK,EAAI,CACrB,EAEDA,EAAI,MAAQ,UAAW,CACnB0V,EAAa,UAAU,OAAO,yBAAyB,EAEvDjV,EAAST,EAAK,EAAK,CACtB,EAEDA,EAAI,QAAU,UAAW,CACrB,GAAIA,EAAI,QAAQ,YAAc,GAAM,CAEhC,IAAI6J,EAAO7I,EAAG,WAAW,sBAAqB,EACxChB,EAAI,QAAQ,WACdA,EAAI,QAAQ,SAAW6J,EAAK,OAGhC,IAAIqM,EAAY,SAASlW,EAAI,QAAQ,QAAQ,EAM7C,IAJI0V,EAAa,YACbA,EAAa,WAAW,YAAYA,CAAY,EAG7CC,EAAgB,YACnBC,EAAe,YAAYD,EAAgB,UAAU,EAGzD,GAAIO,EAAYN,EAAe,YAI3B,IAFAM,GAAa,GAENN,EAAe,WAAaM,EAAYN,EAAe,aAC1DD,EAAgB,aAAaC,EAAe,UAAWD,EAAgB,UAAU,EAIrFA,EAAgB,SAAS,OAAS,GAClCC,EAAe,YAAYF,CAAY,CAE9C,CACJ,EAED1V,EAAI,YAAc,SAASW,EAAO,CAC9BA,EAAQA,EAAQ,MAAQ,SACxBK,EAAG,UAAUL,GAAO,mBAAmB,CAC1C,EAEDK,EAAG,QAAU,SAAS3E,EAAG,CACrB,IAAIwF,EAAUI,EAAQ,YAAY5F,EAAE,OAAQ,eAAe,EACvDwF,GACA7B,EAAI,WAAW6B,CAAO,EAGtBxF,EAAE,OAAO,UAAU,SAAS,gBAAgB,GAC5C2D,EAAI,KAAI,CAEf,EAED,OAAO,iBAAiB,SAAU,UAAW,CACzCA,EAAI,QAAO,CACnB,CAAK,EAGDgB,EAAG,UAAU,IAAI,UAAU,EAE3BA,EAAG,UAAY,GAEXhB,EAAI,QAAQ,WAAa,IACzBgB,EAAG,UAAU,IAAI,oBAAoB,EAGzC,IAAI4U,EAAiB,SAAS,cAAc,KAAK,EACjD,OAAA5U,EAAG,YAAY4U,CAAc,EAEzB5V,EAAI,QAAQ,KACZgB,EAAG,UAAU,IAAI,iBAAiB,EAGtChB,EAAI,OAAOA,EAAI,QAAQ,KAAK,EAE5BgB,EAAG,QAAUhB,EAENA,CACV,CAOD,SAASmW,IAAS,CACd,IAAI5S,EAAa,SAASvC,EAAIuB,EAAS,CAEnC,IAAIvC,EAAM,CAAE,KAAK,UACjBA,EAAI,QAAU,GAGd,IAAIwC,EAAW,CAEX,IAAK,KAEL,MAAO,GAEP,QAAS,KAET,QAAS,GACT,aAAc,GAEd,aAAc,KAEd,YAAa,KAEb,YAAa,GAEb,SAAU,GACV,cAAe,GACf,aAAc,GACd,YAAa,GACb,YAAa,IACb,iBAAkB,GAElB,UAAW,KACX,OAAQ,KACR,MAAO,GAEP,QAAS,KACT,QAAS,KACT,OAAQ,KACR,OAAQ,KACR,QAAS,KACT,UAAW,KACX,SAAU,KACV,WAAY,KACZ,KAAM,IAClB,EAGQ,QAASE,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,GAEhC1C,EAAI,QAAQ0C,GAAYF,EAASE,GAKzC,IAAI0T,EAAc,KACdC,EAAe,KACfC,EAAQ,CAAA,EAGZtW,EAAI,GAAKgB,EAEL,OAAOhB,EAAI,QAAQ,SAAY,aAC/BgB,EAAG,QAAU,SAAS3E,EAAG,CACrB2D,EAAI,QAAQ,QAAQgB,EAAIhB,EAAK3D,CAAC,CACjC,GAIL2E,EAAG,UAAU,IAAI,mBAAmB,EAGpC,IAAIuV,EAAU,SAAS,cAAc,KAAK,EAC1CA,EAAQ,UAAY,WACpBA,EAAQ,aAAa,kBAAmB,EAAK,EAG7C,IAAIC,EAAU,SAAS,cAAc,KAAK,EA0B1C,GAzBAA,EAAQ,UAAY,kBAEpBxW,EAAI,OAAS,SAAS,cAAc,KAAK,EACzCA,EAAI,OAAO,aAAa,kBAAmB,EAAI,EAC/CA,EAAI,OAAO,aAAa,aAAc,EAAK,EAC3CA,EAAI,OAAO,UAAU,IAAI,SAAS,EAG9BA,EAAI,QAAQ,aACZA,EAAI,OAAO,aAAa,mBAAoBA,EAAI,QAAQ,WAAW,GAInEA,EAAI,QAAQ,WAAaA,EAAI,QAAQ,UACrCA,EAAI,OAAO,MAAM,UAAY,OAEzBA,EAAI,QAAQ,YACZA,EAAI,OAAO,MAAM,UAAYA,EAAI,QAAQ,WAEzCA,EAAI,QAAQ,SACZA,EAAI,OAAO,MAAM,OAASA,EAAI,QAAQ,SAK1CA,EAAI,QAAQ,IACZoE,GAAK,CACD,IAAKpE,EAAI,QAAQ,IACjB,SAAU,OACV,QAAS,SAAS8D,EAAQ,CACtB9D,EAAI,OAAO,UAAY8D,EAEvBP,EAAU,UAAUvD,EAAI,OAAQA,EAAI,QAAQ,OAAS,SAAwB,CAChF,CACjB,CAAa,UAEGA,EAAI,QAAQ,MACZA,EAAI,OAAO,UAAYA,EAAI,QAAQ,UAGnC,SAASvD,EAAI,EAAGA,EAAIuE,EAAG,SAAS,OAAQvE,IACpCuD,EAAI,OAAO,YAAYgB,EAAG,SAASvE,EAAE,EAMjDuE,EAAG,UAAY,GAKf,IAAIkT,EAAS,SAAS7X,EAAG,CACjB,OAAO2D,EAAI,QAAQ,UAAa,YAChCA,EAAI,QAAQ,SAASgB,EAAIhB,EAAK3D,CAAC,EAInC2D,EAAI,QAAQ,MAAQA,EAAI,QAAO,EAG3BgB,EAAG,OAAShB,EAAI,QAAQ,QACxBgB,EAAG,MAAQhB,EAAI,QAAQ,MACnB,OAAOgB,EAAG,SAAY,YACtBA,EAAG,QAAQ,CACP,KAAM,QACN,OAAQA,EACR,MAAOA,EAAG,KAClC,CAAqB,EAGZ,EAKGyV,EAAuB,SAASC,EAAM,CAEtC,IAAI7I,EAAM,SAAS,cAAc,KAAK,EACtCA,EAAI,UAAY6I,EAGhB,IAAIC,EAAM9I,EAAI,iBAAiB,KAAK,EAEpC,GAAI8I,EAAI,OACJ,QAASla,GAAI,EAAGA,GAAIka,EAAI,OAAQla,KAC5BuD,EAAI,SAAS2W,EAAIla,IAAG,GAAG,CAGlC,EAwBGma,EAAoB,UAAW,CAC/B,IAAIvU,EAAI,KACR,GAAIA,EAAIkU,EAAQ,SAAS,GAAI,CAEnBlU,EAAE,UAAU,SAAS,cAAc,GACrCA,EAAE,UAAU,IAAI,cAAc,EAGlC,IAAIkS,EAASlS,EAAE,SAAS,OAExBA,EAAE,aAAa,cAAekS,EAAS,EAAI,EAAIA,CAAM,EAEjDA,EAAS,EACTlS,EAAE,aAAa,aAAckS,EAAS,CAAC,EAEvClS,EAAE,gBAAgB,YAAY,CAErC,CACJ,EAKGwU,EAAc,SAASlD,EAAO,CACxB4C,EAAQ,WACVvW,EAAI,cAAc,CAAA,CAAE,EAExBuW,EAAQ,SAAS,GAAG,YAAY5C,CAAK,EACrCiD,GACH,EAMD5W,EAAI,cAAgB,SAASgD,EAAM,CAE/BuT,EAAQ,UAAY,GAKpB,QAFIta,EAAI,CAAE,QAAS,QAAS,cAAe,OAAQ,OAE1CQ,EAAI,EAAGA,EAAIR,EAAE,OAAQQ,IAAK,CAC/B,IAAIoR,GAAM,SAAS,cAAc,KAAK,EAItC,GAHAA,GAAI,UAAY,YAAc5R,EAAEQ,GAChCoR,GAAI,aAAa,SAAU5R,EAAEQ,EAAE,EAC/B8Z,EAAQ,YAAY1I,EAAG,EACnB7K,EAAK/G,EAAEQ,IACP,GAAIR,EAAEQ,IAAM,QAAS,CACX,MAAM,QAAQuG,EAAK,KAAK,IAC1BA,EAAK,MAAQ,CAAEA,EAAK,KAAK,GAE7B,QAAStG,GAAI,EAAGA,GAAIsG,EAAK,MAAM,OAAQtG,KAAK,CACxC,IAAIia,GAAM,SAAS,cAAc,KAAK,EACtCA,GAAI,IAAM3T,EAAK,MAAMtG,IACrBmR,GAAI,YAAY8I,EAAG,CACtB,CACzB,MACwB9I,GAAI,UAAY7K,EAAK/G,EAAEQ,GAGlC,CAEDuD,EAAI,OAAO,YAAY,SAAS,cAAc,IAAI,CAAC,EACnDA,EAAI,OAAO,YAAYuW,CAAO,CACjC,EAKDvW,EAAI,QAAU,SAASqC,EAAG,CAClB,OAAOA,GAAM,SACbrC,EAAI,OAAO,UAAYqC,EAAE,QAEzBrC,EAAI,OAAO,UAAYqC,EAGvBrC,EAAI,QAAQ,OACZuD,EAAU,UAAUvD,EAAI,OAAQ,EAAI,EAIxCsW,EAAQ,CAAA,CACX,EAEDtW,EAAI,SAAW,UAAW,CAGtB,QAFI1D,EAAI0D,EAAI,OAAO,iBAAiB,QAAQ,EACxC5D,EAAI,CAAA,EACCK,EAAI,EAAGA,EAAIH,EAAE,OAAQG,IACtB6Z,EAAMha,EAAEG,GAAG,MACXL,EAAE,KAAKka,EAAMha,EAAEG,GAAG,IAAI,EAG9B,OAAOL,CACV,EAED4D,EAAI,QAAU,UAAW,CACrB,OAAOA,EAAI,OAAO,SACrB,EAKDA,EAAI,QAAU,SAAS8W,EAAM,CACzB,GAAMA,EAEC,CACH,IAAI9T,EAAO,CACP,QAAU,EACb,EAGD,GAAIuT,EAAQ,UAAW,CAEnBvT,EAAK,QAAU,GACf,QAASvG,EAAI,EAAGA,EAAI8Z,EAAQ,SAAS,OAAQ9Z,IAAK,CAE9C,IAAIsD,GAAMwW,EAAQ,SAAS9Z,GAAG,aAAa,QAAQ,EACnD,GAAIsD,GACA,GAAIA,IAAO,QAAS,CACViD,EAAK,QAAQ,QACfA,EAAK,QAAQ,MAAQ,IAGzB,QAAStG,GAAI,EAAGA,GAAI6Z,EAAQ,SAAS9Z,GAAG,SAAS,OAAQC,KACrDsG,EAAK,QAAQ,MAAM,KAAKuT,EAAQ,SAAS9Z,GAAG,SAASC,IAAG,aAAa,KAAK,CAAC,CAE/G,MACgCsG,EAAK,QAAQjD,IAAOwW,EAAQ,SAAS9Z,GAAG,SAGnD,CACJ,CAGD,IAAIH,GAAI,OAAO,KAAKga,CAAK,EACzB,GAAIha,GAAE,OAAQ,CACV0G,EAAK,MAAQ,GACb,QAASvG,EAAI,EAAGA,EAAIH,GAAE,OAAQG,IAC1BuG,EAAK,MAAM,KAAKsT,EAAMha,GAAEG,GAAG,CAElC,CAGD,IAAIL,GAAI,SAAS,cAAc,KAAK,EACpCA,GAAE,UAAY4D,EAAI,OAAO,UACzB,IAAI8E,GAAI1I,GAAE,cAAc,WAAW,EAC/B0I,IACAA,GAAE,OAAM,EAGZ,IAAIgI,GAAO1Q,GAAE,UACb0Q,GAAOA,GAAK,QAAQ,QAAS;AAAA,CAAI,EACjCA,GAAOA,GAAK,QAAQ,WAAY;AAAA,CAAW,EAC3CA,GAAOA,GAAK,QAAQ,iBAAkB,EAAE,EACxC9J,EAAK,QAAU8J,GAAK,OAGpBiK,GAAkB,UAAW/T,CAAI,CACpC,KAtDG,KAAIA,EAAOhD,EAAI,OAAO,UAwD1B,OAAOgD,CACV,EAGDhD,EAAI,MAAQ,UAAW,CACnBA,EAAI,OAAO,UAAY,GACvBuW,EAAQ,UAAY,GACpBD,EAAQ,CAAA,CACX,EAEDtW,EAAI,OAAS,SAASgD,EAAM,CACxB,GAAIA,EAAK,OAAO,OAAO,EAAE,CAAC,GAAK,OAC3B,QAAQ,MAAM,gBAAgB,MAC3B,CACH,IAAIkN,EAAS,SAAS,cAAc,QAAQ,EAC5CA,EAAO,MAAQ,GACfA,EAAO,OAAS,GAEhB,IAAIyG,EAAM,IAAI,MACVK,GAAM9G,EAAO,WAAW,IAAI,EAChC8G,GAAI,UAAUL,EAAK,EAAG,EAAGzG,EAAO,MAAOA,EAAO,MAAM,EAEpDA,EAAO,OAAO,SAAS+G,GAAM,CACzB,IAAIC,GAAW,SAAS,cAAc,KAAK,EAC3CA,GAAS,IAAM,OAAO,IAAI,gBAAgBD,EAAI,EAC9CC,GAAS,MAAQlU,EAAK,KACtBkU,GAAS,UAAY,YAErBZ,EAAMY,GAAS,KAAO,CAClB,KAAMA,GAAS,IACf,UAAW,MACX,QAASlU,EAAK,MACjB,EAGD,SAAS,YAAY,aAAc,GAAOkU,GAAS,SAAS,CAChF,CAAiB,CACJ,CACJ,EAEDlX,EAAI,SAAW,SAASmX,EAAKC,EAAW,CACpC,GAAI,EAAEpX,EAAI,QAAQ,aAQlB,GAJMmX,IACFA,EAAM,IAGNA,EAAI,OAAO,EAAE,CAAC,GAAK,QAAU,CAAEnX,EAAI,QAAQ,aAC3C,QAAQ,MAAM,iDAAiD,MAC5D,CAEH,GAAImX,EAAI,OAAO,EAAE,CAAC,GAAK,OAAQ,CAC3B,IAAIE,EAAYF,EAAI,MAAM,GAAG,EAC7BE,EAAYA,EAAU,GAAG,MAAM,GAAG,EAClCA,EAAYA,EAAU,EAC1C,KAAuB,CACH,IAAIA,EAAYF,EAAI,OAAOA,EAAI,YAAY,GAAG,EAAI,CAAC,EAEnDA,EAAMnX,EAAI,QAAQ,aAAemX,CACpC,CAED,IAAIR,GAAM,IAAI,MAEdA,GAAI,OAAS,UAAkB,CAC3B,IAAIzG,GAAS,SAAS,cAAc,QAAQ,EAC5CA,GAAO,MAAQyG,GAAI,MACnBzG,GAAO,OAASyG,GAAI,OAEpB,IAAIK,GAAM9G,GAAO,WAAW,IAAI,EAChC8G,GAAI,UAAUL,GAAK,EAAG,EAAGzG,GAAO,MAAOA,GAAO,MAAM,EAEpDA,GAAO,OAAO,SAAS+G,GAAM,CACzB,IAAIC,GAAW,SAAS,cAAc,KAAK,EAC3CA,GAAS,IAAM,OAAO,IAAI,gBAAgBD,EAAI,EAC9CC,GAAS,UAAU,IAAI,OAAO,EAC9BA,GAAS,aAAa,WAAY,KAAK,EACvCA,GAAS,aAAa,QAASP,GAAI,KAAK,EACxCO,GAAS,aAAa,SAAUP,GAAI,MAAM,EAC1CL,EAAMY,GAAS,KAAO,CAClB,KAAMA,GAAS,IACf,UAAWG,EACX,QAASnH,GAAO,UAAW,CAC9B,EAEGlQ,EAAI,QAAQ,eAAiBoX,GAC7BP,EAAYK,EAAQ,EAEpBZ,EAAMY,GAAS,KAAK,QAAU,IAG9B,SAAS,YAAY,aAAc,GAAOA,GAAS,SAAS,EAGhEhD,GACxB,CAAqB,CACrB,EAEgByC,GAAI,IAAMQ,CACb,CACJ,EAEDnX,EAAI,QAAU,SAASsW,EAAO,CAG1B,QAFIgB,EAAS,CAAA,EAEJ7a,EAAI,EAAGA,EAAI6Z,EAAM,OAAQ7Z,IAC9B,GAAI6Z,EAAM7Z,GAAG,KAAOuD,EAAI,QAAQ,YAC5B,MAAM,qBAAqB,MACxB,CAEH,IAAI4H,GAAO0O,EAAM7Z,GAAG,KAAK,MAAM,GAAG,EAE9BmL,GAAK,IAAM,QACXA,GAAO,EACAA,GAAK,IAAM,MAClBA,GAAO,EAEPA,GAAO,EAGPA,IAEA0P,EAAO7a,GAAK,IAAI,WAChB6a,EAAO7a,GAAG,MAAQA,EAClB6a,EAAO7a,GAAG,KAAOmL,GACjB0P,EAAO7a,GAAG,KAAO6Z,EAAM7Z,GAAG,KAC1B6a,EAAO7a,GAAG,KAAO6Z,EAAM7Z,GAAG,aAC1B6a,EAAO7a,GAAG,KAAO6Z,EAAM7Z,GAAG,KAC1B6a,EAAO7a,GAAG,iBAAiB,OAAQ,SAAUuG,GAAM,CAE3CA,GAAK,OAAO,MAAQ,EAChBhD,EAAI,QAAQ,aAAe,IAC3BA,EAAI,OAAOgD,GAAK,MAAM,EAG1BhD,EAAI,SAASgD,GAAK,OAAO,MAAM,CAEtC,EAAE,EAAK,EAERsU,EAAO7a,GAAG,cAAc6Z,EAAM7Z,EAAE,GAEhC,MAAM,8BAA8B,CAE3C,CAER,EAGDuD,EAAI,QAAU,UAAW,CACrBA,EAAI,OAAO,oBAAoB,UAAWuX,CAAa,EACvDvX,EAAI,OAAO,oBAAoB,YAAawX,CAAe,EAC3DxX,EAAI,OAAO,oBAAoB,YAAayX,CAAe,EAC3DzX,EAAI,OAAO,oBAAoB,QAAS0X,CAAW,EACnD1X,EAAI,OAAO,oBAAoB,UAAW2X,CAAa,EACvD3X,EAAI,OAAO,oBAAoB,YAAa4X,CAAe,EAC3D5X,EAAI,OAAO,oBAAoB,YAAa6X,CAAe,EAC3D7X,EAAI,OAAO,oBAAoB,WAAY8X,CAAc,EACzD9X,EAAI,OAAO,oBAAoB,OAAQ+X,CAAU,EACjD/X,EAAI,OAAO,oBAAoB,QAASgY,CAAW,EACnDhY,EAAI,OAAO,oBAAoB,OAAQiY,CAAU,EACjDjY,EAAI,OAAO,oBAAoB,QAASkY,CAAW,EAEnDlX,EAAG,OAAS,KACZA,EAAG,UAAU,OAAO,mBAAmB,EAEvCwV,EAAQ,OAAM,EACdD,EAAQ,OAAM,EACdvW,EAAI,OAAO,QACd,EAEDA,EAAI,OAAS,UAAW,CACpBiC,EAAQ,MAAMjC,EAAI,IAAI,CACzB,EAGD,MAAMmY,GAAY,CACd,OAAO,OAAO,UAAU,OAAQ,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAK,IAAK,IAAK,aAC1F,SAAU,KAAM,KAAM,KAAM,KAAM,IAAK,OAAQ,MAAO,KAAM,KAAM,MAClE,SAAU,UAAW,aAAc,SAAU,QAAS,QAAS,QAAS,QAAS,KACjF,KAAM,KAAM,UAAW,IAAK,MAAO,MAAO,MAAO,MAAO,QAAS,OACjE,QAAS,WAAY,SAAU,SAAU,SAAU,QAAS,WAC5D,SAAU,QAAS,QAAS,OAAQ,OAAQ,MAAO,UAAW,UAC9D,MAAO,QAAS,SAAU,SAAU,OAAQ,UAAW,UAAW,MAAO,OAAQ,QAC7F,EAEcC,GAAgB,CAAC,QAAS,SAAU,QAAS,SAAU,MAAO,UAAU,EAExEC,GAAa,CAAC,QAAS,cAAe,YAAa,aAAc,mBAAoB,QAAQ,EAE7FrQ,GAAQ,SAASnG,EAAS,CAQ5B,GANIA,EAAQ,SAAWsW,GAAU,QAAQtW,EAAQ,QAAQ,YAAW,CAAE,IAAM,IACpEA,EAAQ,YACRA,EAAQ,UAAYA,EAAQ,WAIhCA,EAAQ,YAAcA,EAAQ,WAAW,OAAQ,CACjD,IAAIyW,EAAQ,KAERC,EAAe1W,EAAQ,aAAa,OAAO,EAC/C,GAAI0W,EAAc,CACdD,EAAQ,CAAA,EACR,IAAI/X,GAAIgY,EAAa,MAAM,GAAG,EAC9B,QAAS7b,GAAI,EAAGA,GAAI6D,GAAE,OAAQ7D,KAAK,CAC/B,IAAIkE,GAAIL,GAAE7D,IAAG,OAAO,MAAM,GAAG,EAC7B,GAAI2b,GAAW,QAAQzX,GAAE,GAAG,KAAI,CAAE,GAAK,EAAG,CACtC,IAAIP,GAAIO,GAAE,QACVA,GAAIA,GAAE,KAAK,GAAG,EACd0X,EAAM,KAAKjY,GAAI,IAAMO,EAAC,CACzB,CACJ,CACJ,CAEGiB,EAAQ,QAAQ,YAAW,IAAO,QAC9B,CAAE7B,EAAI,QAAQ,cAAgB,CAAC6B,EAAQ,IACvCA,EAAQ,WAAW,YAAYA,CAAO,GAGtCA,EAAQ,aAAa,WAAY,KAAK,EAEtC7B,EAAI,SAAS6B,EAAQ,GAAG,IAIhC,IAAI2W,GAAO,CAAA,EACX,QAAS/b,GAAI,EAAGA,GAAIoF,EAAQ,WAAW,OAAQpF,KAC3C+b,GAAK,KAAK3W,EAAQ,WAAWpF,IAAG,IAAI,EAEpC+b,GAAK,QACLA,GAAK,QAAQ,SAAU5X,GAAG,CAClBwX,GAAc,QAAQxX,EAAC,IAAM,GAC7BiB,EAAQ,gBAAgBjB,EAAC,EAGrBiB,EAAQ,YAAcA,EAAQ,WAAWpF,IAAMoF,EAAQ,WAAWpF,GAAG,MAAM,QAAQ,GAAG,IAAM,IAC5FoF,EAAQ,WAAWpF,GAAG,MAAM,QAAQ,IAAK,OAAO,CAGhF,CAAqB,EAELoF,EAAQ,MAAQ,GAEZyW,GAASA,EAAM,QACfzW,EAAQ,aAAa,QAASyW,EAAM,KAAK,GAAG,CAAC,CAEpD,CAED,GAAIzW,EAAQ,SAAS,OACjB,QAASpF,EAAIoF,EAAQ,SAAS,OAAQpF,EAAI,EAAGA,IACzCuL,GAAMnG,EAAQ,SAASpF,EAAI,EAAE,CAGxC,EAED,IAAIwY,EAAS,SAAS5Y,EAAG,CACrB,IAAIyI,EAAI,OAAO,aAAc,EACzBzD,EAAI,SAAS,cACjBA,EAAE,WAAWhF,CAAC,EACdyI,EAAE,SAASzD,CAAC,CACf,EAEGoX,EAAS,SAASzV,EAAM,CACpBA,IACAA,EAAOA,EAAK,QAAQ,IAAI,OAAO,eAAgB,KAAK,EAAG,EAAE,GAE7D,IAAIiE,EAAS,IAAI,UACb7K,EAAI6K,EAAO,gBAAgBjE,EAAM,WAAW,EAChDgF,GAAM5L,CAAC,EACP,IAAIyR,GAAM,SAAS,cAAc,KAAK,EACtC,OAAAA,GAAI,UAAYzR,EAAE,WAAW,UACtByR,EACV,EAEGmK,EAAc,SAAS3b,EAAG,CAC1B,GAAI2D,EAAI,QAAQ,aAAe,GAAM,CACjC,GAAI3D,EAAE,eAAiBA,EAAE,cAAc,cACnC,IAAIqa,GAAQra,EAAE,eAAiBA,GAAG,cAAc,QAAQ,WAAW,EAC/DyQ,GAAQzQ,EAAE,eAAiBA,GAAG,cAAc,QAAQ,YAAY,EAChEqc,IAAQrc,EAAE,eAAiBA,GAAG,cAAc,cACzC,OAAO,cACd,IAAIqa,EAAO,OAAO,cAAc,QAAQ,MAAM,EAC1C5J,EAAO,OAAO,cAAc,QAAQ,MAAM,EAC1C4L,GAAO,OAAO,cAAc,MAGpC,GAAIA,GAAK,OAEL1Y,EAAI,QAAQ0Y,EAAI,UAEZ,CAAEhC,EACFA,EAAO5J,EAAK,MAAM;AAAA,CAAM,EAClBzQ,EAAE,OAAO,WAOXqa,EAAOA,EAAK,IAAI,SAAS9V,GAAG,CACxB,MAAO,QAAUA,GAAI,QACrD,CAA6B,EACD,SAAS,YAAY,aAAc,GAAO8V,EAAK,KAAK,EAAE,CAAC,GATvDA,EAAK,IAAI,SAAS9V,GAAG,CACjB,IAAIxE,GAAI,SAAS,cAAc,KAAK,EACpCA,GAAE,UAAYwE,GACdZ,EAAI,OAAO,YAAY5D,EAAC,CACxD,CAA6B,MAOF,CACH,IAAIA,GAAIqc,EAAO/B,CAAI,EAGnB,SAAS,YAAY,aAAc,GAAOta,GAAE,SAAS,CACxD,CAGLC,EAAE,eAAc,CACnB,CACJ,EAEGub,EAAkB,SAASvb,EAAG,CAC1Bga,GAAgBA,EAAa,GAC7Bha,EAAE,eAAc,CAEvB,EAEGwb,EAAkB,SAASxb,EAAG,CAC1Bga,GAAgBrW,EAAI,QAAQ,UAAY,KAGxCgB,EAAG,UAAU,IAAI,kBAAkB,EACnC3E,EAAE,eAAc,EAEvB,EAEGyb,EAAiB,SAASzb,EAAG,CACzBga,GAAgBrW,EAAI,QAAQ,UAAY,KAGpCoW,GACA,aAAaA,CAAW,EAG5BA,EAAc,WAAW,UAAW,CAChCpV,EAAG,UAAU,OAAO,kBAAkB,CACzC,EAAE,GAAG,EACN3E,EAAE,eAAc,EAEvB,EAEG0b,EAAa,SAAS1b,EAAG,CACzB,GAAI,EAAAga,GAAgBrW,EAAI,QAAQ,UAAY,IAErC,CAEH,IAAIiB,EAAQ,KACR,SAAS,oBACTA,EAAM,SAAS,oBAAoB5E,EAAE,QAASA,EAAE,OAAO,EAChDA,EAAE,cACT4E,EAAM,SAAS,cACfA,EAAM,SAAS5E,EAAE,YAAYA,EAAE,WAAW,GAE9C,IAAI6E,EAAM,OAAO,eACjBA,EAAI,gBAAe,EACnBA,EAAI,SAASD,CAAK,EAClBC,EAAI,WAAW,WAAW,QAE1B,IAAIwV,IAAQra,EAAE,eAAiBA,GAAG,aAAa,QAAQ,WAAW,EAC9DyQ,IAAQzQ,EAAE,eAAiBA,GAAG,aAAa,QAAQ,YAAY,EAC/Dqc,IAAQrc,EAAE,eAAiBA,GAAG,aAAa,MAE3Cqc,GAAK,OACL1Y,EAAI,QAAQ0Y,EAAI,EACT5L,IACP2J,EAAqBC,EAAI,EAG7B1V,EAAG,UAAU,OAAO,kBAAkB,EACtC3E,EAAE,eAAc,CACnB,CACJ,EAEG4b,EAAa,SAAS5b,EAAG,CAEzB0a,GAAkB,UAAW1a,CAAC,EAE9B6X,EAAO7X,CAAC,EAEJ,OAAO2D,EAAI,QAAQ,QAAW,YAC9BA,EAAI,QAAQ,OAAOgB,EAAIhB,EAAK3D,CAAC,CAEpC,EAEG6b,EAAc,SAAS7b,EAAG,CAEtB,OAAO2D,EAAI,QAAQ,SAAY,YAC/BA,EAAI,QAAQ,QAAQgB,EAAIhB,EAAK3D,CAAC,CAErC,EAEGqb,EAAc,SAASrb,EAAG,CACpB2D,EAAI,OAAO,YACbA,EAAI,OAAO,UAAY,mBAEvB,OAAOA,EAAI,QAAQ,SAAY,YAC/BA,EAAI,QAAQ,QAAQgB,EAAIhB,EAAK3D,CAAC,CAErC,EAEGsb,EAAgB,SAAStb,EAAG,CAI5B,GAFA0a,GAAkB,UAAW1a,CAAC,EAE1BA,EAAE,KAAO,UACLA,EAAE,OAAO,SAAW,MAAO,CAC3B,IAAIsc,EAAStc,EAAE,OAAO,WACtB4Y,EAAO5Y,EAAE,MAAM,EACXsc,EAAO,UAAU,SAAS,gBAAgB,GAC1C/B,GAEP,CAGD,OAAO5W,EAAI,QAAQ,WAAc,YACjCA,EAAI,QAAQ,UAAUgB,EAAIhB,EAAK3D,CAAC,CAEvC,EAEGkb,EAAgB,SAASlb,EAAG,CAC5B,GAAIga,GAAgBA,EAAa,IAC7BA,EAAa,EAAE,UAAU,OAAO,UAAU,EAEtCA,EAAa,EAAE,SAAW,IAAM,CAChC,IAAI1C,EAAQ0C,EAAa,EAAE,UAAW,EACtC1C,EAAM,MAAQ,SAAS0C,EAAa,EAAE,MAAM,KAAK,GAAKA,EAAa,EAAE,aAAa,OAAO,EACzF1C,EAAM,OAAS,SAAS0C,EAAa,EAAE,MAAM,MAAM,GAAKA,EAAa,EAAE,aAAa,QAAQ,EAC5FA,EAAa,EAAE,MAAM,MAAQ,GAC7BA,EAAa,EAAE,MAAM,OAAS,GAC9BpB,EAAOoB,EAAa,CAAC,EACrB,SAAS,YAAY,aAAc,GAAO1C,EAAM,SAAS,CAC5D,CAGL0C,EAAe,EAClB,EAEGmB,EAAkB,SAASnb,EAAG,CAC9B,IAAIuc,EAAQ,SAASrC,GAAS,CAC1B,IAAI1M,GAAO0M,GAAQ,wBACf1M,GAAK,OAASxN,EAAE,QAAUwN,GAAK,MAAQ,IAAMxN,EAAE,QAAUwN,GAAK,IAAM,KACpE0M,GAAQ,UAAY,GACpBA,GAAQ,OAAM,EAErB,EAED,GAAIla,EAAE,OAAO,SAAW,MACpB,GAAIA,EAAE,OAAO,MAAM,OAAQ,CACvB,IAAIwN,EAAOxN,EAAE,OAAO,sBAAqB,EACzCga,EAAe,CACX,EAAGha,EAAE,OACL,EAAGA,EAAE,QACL,EAAGA,EAAE,QACL,EAAGwN,EAAK,MACR,EAAGA,EAAK,OACR,EAAGxN,EAAE,OAAO,MAAM,MACrB,EAEKA,EAAE,OAAO,aAAa,OAAO,GAC/BA,EAAE,OAAO,aAAa,QAASwN,EAAK,KAAK,EAGvCxN,EAAE,OAAO,aAAa,QAAQ,GAChCA,EAAE,OAAO,aAAa,SAAUwN,EAAK,MAAM,EAG/C,IAAI/E,GAAI,OAAO,eACf,GAAIA,GAAE,WACF,QAASrI,GAAI,EAAGA,GAAIqI,GAAE,WAAYrI,KAC9BqI,GAAE,YAAYA,GAAE,WAAWrI,EAAC,CAAC,EAIrCJ,EAAE,OAAO,UAAU,IAAI,UAAU,CACrD,MACoBga,EAAe,QAGfha,EAAE,OAAO,UAAU,SAAS,UAAU,EACtCuc,EAAMvc,EAAE,MAAM,EACPA,EAAE,OAAO,WAAW,UAAU,SAAS,UAAU,GACxDuc,EAAMvc,EAAE,OAAO,UAAU,EAG7Bga,EAAe,EAEtB,EAEGoB,EAAkB,SAASpb,EAAG,CAC9B,GAAIA,EAAE,OAAO,SAAW,OAAS,CAAEA,EAAE,OAAO,WAAW,UAAU,SAAS,gBAAgB,GAAK2D,EAAI,QAAQ,kBAAoB,IACvH3D,EAAE,OAAO,aAAa,UAAU,EAAG,CACnC,IAAIwN,EAAOxN,EAAE,OAAO,sBAAqB,EACrCA,EAAE,QAAUwN,EAAK,IAAM,EACnBA,EAAK,OAASxN,EAAE,QAAUwN,EAAK,MAAQ,EACvCxN,EAAE,OAAO,MAAM,OAAS,YACjBA,EAAE,QAAUwN,EAAK,KAAO,EAC/BxN,EAAE,OAAO,MAAM,OAAS,YAExBA,EAAE,OAAO,MAAM,OAAS,WAErBwN,EAAK,QAAUxN,EAAE,QAAUwN,EAAK,KAAO,EAC1CA,EAAK,OAASxN,EAAE,QAAUwN,EAAK,MAAQ,EACvCxN,EAAE,OAAO,MAAM,OAAS,YACjBA,EAAE,QAAUwN,EAAK,KAAO,EAC/BxN,EAAE,OAAO,MAAM,OAAS,YAExBA,EAAE,OAAO,MAAM,OAAS,WAErBwN,EAAK,OAASxN,EAAE,QAAUwN,EAAK,MAAQ,EAC9CxN,EAAE,OAAO,MAAM,OAAS,WACjBA,EAAE,QAAUwN,EAAK,KAAO,EAC/BxN,EAAE,OAAO,MAAM,OAAS,WAExBA,EAAE,OAAO,MAAM,OAAS,EAE/B,CAIL,GAAIA,EAAE,OAAS,GAAKga,GAAgBA,EAAa,EAAG,CAChD,GAAIA,EAAa,GAAK,YAAcA,EAAa,GAAK,aAAgBA,EAAa,GAAK,YAGpF,GAFAA,EAAa,EAAE,MAAM,MAASA,EAAa,GAAKha,EAAE,QAAUga,EAAa,GAErEha,EAAE,SAAU,CACZ,IAAIwc,GAAaxc,EAAE,QAAUga,EAAa,IAAMA,EAAa,EAAIA,EAAa,GAC9EA,EAAa,EAAE,MAAM,OAASA,EAAa,EAAIwC,CACvE,KACwB,KAAIA,EAAa,KAInBA,IACExC,EAAa,GAAK,YAAcA,EAAa,GAAK,aAAeA,EAAa,GAAK,eAC7Eha,EAAE,WACJga,EAAa,EAAE,MAAM,OAASA,EAAa,GAAKha,EAAE,QAAUga,EAAa,KAKrFA,EAAa,EAAE,QAAU,EAC5B,CACJ,EAEGU,GAAoB,SAAS+B,EAAQ9V,EAAM,CAC3C,GAAIhD,EAAI,QAAQ,WAAY,CACxB,IAAI+Y,EAAM,OAAO,KAAK/Y,EAAI,QAAQ,UAAU,EAC5C,GAAI+Y,EAAI,OACJ,QAAStc,GAAI,EAAGA,GAAIsc,EAAI,OAAQtc,KACxBuD,EAAI,QAAQ,WAAW+Y,EAAItc,MAAO,OAAOuD,EAAI,QAAQ,WAAW+Y,EAAItc,KAAIqc,IAAY,YACpF9Y,EAAI,QAAQ,WAAW+Y,EAAItc,KAAIqc,GAAQ,KAAK9Y,EAAKgD,CAAI,CAGpE,CACJ,EAEGgW,GAAiB,UAAW,CAC5B,GAAIhZ,EAAI,QAAQ,WAAY,CACxB,IAAI+Y,EAAM,OAAO,KAAK/Y,EAAI,QAAQ,UAAU,EAC5C,GAAI+Y,EAAI,OACJ,QAAStc,EAAI,EAAGA,EAAIsc,EAAI,OAAQtc,IACxBuD,EAAI,QAAQ,WAAW+Y,EAAItc,KAAO,OAAQuD,EAAI,QAAQ,WAAW+Y,EAAItc,KAAQ,aAC7EuD,EAAI,QAAQ,WAAW+Y,EAAItc,IAAMuD,EAAI,QAAQ,WAAW+Y,EAAItc,IAAIuE,EAAIhB,CAAG,EAItF,CACJ,EAuBD,GArBA,SAAS,iBAAiB,UAAWuX,CAAa,EAClD,SAAS,iBAAiB,YAAaE,CAAe,EACtDzX,EAAI,OAAO,iBAAiB,YAAawX,CAAe,EACxDxX,EAAI,OAAO,iBAAiB,QAAS0X,CAAW,EAChD1X,EAAI,OAAO,iBAAiB,UAAW2X,CAAa,EACpD3X,EAAI,OAAO,iBAAiB,YAAa4X,CAAe,EACxD5X,EAAI,OAAO,iBAAiB,YAAa6X,CAAe,EACxD7X,EAAI,OAAO,iBAAiB,WAAY8X,CAAc,EACtD9X,EAAI,OAAO,iBAAiB,OAAQ+X,CAAU,EAC9C/X,EAAI,OAAO,iBAAiB,QAASgY,CAAW,EAChDhY,EAAI,OAAO,iBAAiB,QAASkY,CAAW,EAChDlY,EAAI,OAAO,iBAAiB,OAAQiY,CAAU,EAG9CjX,EAAG,YAAYhB,EAAI,MAAM,EAErBA,EAAI,QAAQ,SACZA,EAAI,cAAcA,EAAI,QAAQ,OAAO,EAIrCA,EAAI,QAAQ,QAAS,CAErB,GAAI,MAAM,QAAQA,EAAI,QAAQ,OAAO,EACjC,IAAIiZ,GAAiB,CACjB,UAAW,GACX,WAAY,GACZ,MAAOjZ,EAAI,QAAQ,OACtB,UACMA,EAAI,QAAQ,UAAY,GAC/B,IAAIiZ,GAAiB,CACjB,UAAW,GACX,WAAY,GACZ,MAAO,CAAE,CACZ,MAED,KAAIA,GAAiBjZ,EAAI,QAAQ,QAI9BiZ,GAAe,OAASA,GAAe,MAAM,SAChDA,GAAe,MAAQ1V,EAAU,kBAAkBvD,CAAG,GAGtDA,EAAI,QAAQ,cAEZgB,EAAG,UAAU,IAAI,gBAAgB,EAEjCA,EAAG,aAAawV,EAASxV,EAAG,UAAU,IAGtChB,EAAI,OAAO,MAAM,QAAU,OAE3BgB,EAAG,YAAYwV,CAAO,GAI1Bf,GAAQe,EAASyC,EAAc,EAE/BzC,EAAQ,iBAAiB,QAAS,UAAW,CACzCxW,EAAI,OAAO,OAC3B,CAAa,CACJ,CAGD,OAAAA,EAAI,KAAO,SAAS,cAAc,OAAO,EACzCA,EAAI,KAAK,MAAM,QAAU,OACzBA,EAAI,KAAK,KAAO,OAChBA,EAAI,KAAK,aAAa,SAAU,SAAS,EACzCA,EAAI,KAAK,SAAW,UAAW,CAC3BA,EAAI,QAAQ,KAAK,KAAK,CACzB,EACDgB,EAAG,YAAYhB,EAAI,IAAI,EAGnBA,EAAI,QAAQ,OACZuD,EAAU,UAAUvD,EAAI,OAAQA,EAAI,QAAQ,OAAS,SAAwB,EAIjFgB,EAAG,OAAShB,EAAI,QAGhBgB,EAAG,IAAM,SAASmB,EAAK,CACnB,GAAIA,IAAQ,OAAW,CAEnB,IAAIE,EAAIrB,EAAG,aAAa,WAAW,IAAM,OACzC,OAAOhB,EAAI,QAAQqC,CAAC,CACpC,MACgBrC,EAAI,QAAQmC,CAAG,CAEtB,EAED6W,KAEAhY,EAAG,OAAShB,EAGR,OAAOA,EAAI,QAAQ,QAAW,YAC9BA,EAAI,QAAQ,OAAOgB,EAAIhB,EAAKA,EAAI,MAAM,EAGnCA,CACf,EAEI,OAAAuD,EAAU,UAAY,SAAS1B,EAASqX,EAAO,CAC3CrX,EAAQ,MAAK,EACb,SAAS,YAAY,WAAW,EAChC,IAAIX,EAAM,OAAO,eACbD,EAAQC,EAAI,WAAW,CAAC,EAC5B,GAAIgY,GAAS,GACT,IAAI/X,EAAOF,EAAM,eACbkY,EAAO,MAEX,KAAIhY,EAAOF,EAAM,aACbkY,EAAOhY,EAAK,OAEpBF,EAAM,SAASE,EAAMgY,CAAI,EACzBlY,EAAM,OAAOE,EAAMgY,CAAI,EACvBjY,EAAI,gBAAe,EACnBA,EAAI,SAASD,CAAK,CACrB,EAEDsC,EAAU,kBAAoB,SAASvD,EAAK,CAExC,IAAIoP,EAAQ,SAASnT,EAAEC,EAAEC,EAAG,CAClBA,EAAE,QAEcyS,GAAMzS,EAAG,CACvB,SAAU,SAASkG,EAAGzB,EAAG,CACjBzE,EAAE,IAAM,QACR,SAAS,YAAY,YAAa,GAAOyE,CAAC,EAE1C,SAAS,YAAY,YAAa,GAAOA,CAAC,CAEjD,CACrB,CAAiB,EACDzE,EAAE,MAAM,OAEf,EAEG0V,EAAQ,CAAA,EAEZ,OAAAA,EAAM,KAAK,CACP,QAAS,OACT,QAAS,UAAW,CAChB,SAAS,YAAY,MAAM,CAC9B,CACb,CAAS,EAEDA,EAAM,KAAK,CACP,QAAS,OACT,QAAS,UAAW,CAChB,SAAS,YAAY,MAAM,CAC9B,CACb,CAAS,EAEDA,EAAM,KAAK,CACP,KAAM,SAClB,CAAS,EAEG7R,EAAI,QAAQ,eACZ6R,EAAM,KAAK,CACP,KAAM,SACN,MAAO,QACP,QAAS,CAAC,UAAW,UAAW,QAAS,aAAa,EACtD,OAAQ,SAAUxV,EAAG,CACjB,MAAO,4BAA8BA,EAAI,KAAOA,EAAI,SACvD,EACD,SAAU,SAAUJ,EAAEC,EAAEC,EAAEC,EAAEC,EAAG,CAC3B,SAAS,YAAY,WAAY,GAAOD,CAAC,CAC5C,CACjB,CAAa,EAEDyV,EAAM,KAAK,CACP,KAAM,SACN,QAAS,cACT,QAAS,CAAC,UAAW,QAAS,SAAU,QAAS,SAAS,EAC1D,OAAQ,SAAUxV,EAAG,CACjB,MAAO,0BAA4BA,EAAI,KAAOA,EAAI,SACrD,EACD,SAAU,SAAUJ,EAAEC,EAAEC,EAAEC,EAAEC,EAAG,CAG3B,SAAS,YAAY,WAAY,GAAO,SAASA,CAAC,EAAE,CAAC,CAIxD,CACjB,CAAa,EAEDwV,EAAM,KAAK,CACP,KAAM,SACN,QAAS,CAAC,oBAAqB,sBAAuB,qBAAsB,sBAAsB,EAClG,OAAQ,SAAUxV,EAAG,CACjB,MAAO,6BAA+BA,EAAI,MAC7C,EACD,SAAU,SAAUJ,EAAEC,EAAEC,EAAEC,EAAEC,EAAG,CAC3B,IAAIkG,EAAU,CAAC,cAAc,gBAAgB,eAAe,aAAa,EACzE,SAAS,YAAYA,EAAQlG,EAAE,CAClC,CACjB,CAAa,EAEDwV,EAAM,KAAK,CACP,KAAM,SACtB,CAAa,EAEDA,EAAM,KAAK,CACP,QAAS,oBACT,EAAG,QACH,QAASzC,CACzB,CAAa,EAEDyC,EAAM,KAAK,CACP,QAAS,oBACT,EAAG,mBACH,QAASzC,CACzB,CAAa,GAGLyC,EAAM,KAAK,CACP,QAAS,cACT,QAAS,SAAS5V,EAAEC,EAAEC,EAAG,CACrB,SAAS,YAAY,MAAM,EAEvB,SAAS,kBAAkB,MAAM,EACjCA,EAAE,UAAU,IAAI,UAAU,EAE1BA,EAAE,UAAU,OAAO,UAAU,CAEpC,CACb,CAAS,EAED0V,EAAM,KAAK,CACP,QAAS,gBACT,QAAS,SAAS5V,EAAEC,EAAEC,EAAG,CACrB,SAAS,YAAY,QAAQ,EAEzB,SAAS,kBAAkB,QAAQ,EACnCA,EAAE,UAAU,IAAI,UAAU,EAE1BA,EAAE,UAAU,OAAO,UAAU,CAEpC,CACb,CAAS,EAED0V,EAAM,KAAK,CACP,QAAS,mBACT,QAAS,SAAS5V,EAAEC,EAAEC,EAAG,CACrB,SAAS,YAAY,WAAW,EAE5B,SAAS,kBAAkB,WAAW,EACtCA,EAAE,UAAU,IAAI,UAAU,EAE1BA,EAAE,UAAU,OAAO,UAAU,CAEpC,CACb,CAAS,EAED0V,EAAM,KAAK,CACP,KAAK,SACjB,CAAS,EAEDA,EAAM,KAAK,CACP,QAAS,uBACT,QAAS,SAAS5V,EAAEC,EAAEC,EAAG,CACrB,SAAS,YAAY,qBAAqB,EAEtC,SAAS,kBAAkB,qBAAqB,EAChDA,EAAE,UAAU,IAAI,UAAU,EAE1BA,EAAE,UAAU,OAAO,UAAU,CAEpC,CACb,CAAS,EAED0V,EAAM,KAAK,CACP,QAAS,uBACT,QAAS,SAAS5V,EAAEC,EAAEC,EAAG,CACrB,SAAS,YAAY,mBAAmB,EAEpC,SAAS,kBAAkB,mBAAmB,EAC9CA,EAAE,UAAU,IAAI,UAAU,EAE1BA,EAAE,UAAU,OAAO,UAAU,CAEpC,CACb,CAAS,EAED0V,EAAM,KAAK,CACP,QAAS,yBACT,QAAS,SAAS5V,EAAEC,EAAEC,EAAG,CACrB,SAAS,YAAY,SAAU,GAAM,IAAI,EAErC,SAAS,kBAAkB,QAAQ,EACnCA,EAAE,UAAU,IAAI,UAAU,EAE1BA,EAAE,UAAU,OAAO,UAAU,CAEpC,CACb,CAAS,EAED0V,EAAM,KAAK,CACP,QAAS,yBACT,QAAS,UAAW,CAChB,SAAS,YAAY,SAAS,EAE1B,SAAS,kBAAkB,SAAS,EACpC,KAAK,UAAU,IAAI,UAAU,EAE7B,KAAK,UAAU,OAAO,UAAU,CAEvC,CACb,CAAS,EAEG7R,EAAI,QAAQ,eACZ6R,EAAM,KAAK,CACP,KAAM,SACtB,CAAa,EAEDA,EAAM,KAAK,CACP,QAAS,QACT,QAAS,UAAY,CACjB7R,EAAI,OAAM,CACb,CACjB,CAAa,EAED6R,EAAM,KAAK,CACP,KAAM,SACN,QAAS,aACT,QAAS,EACT,KAAM,EACN,MAAO,GACP,QAAS,CACL,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACjD,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACjD,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACjD,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACjD,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACjD,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACjD,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACjD,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KACpD,EACD,OAAQ,SAAUxV,EAAGqS,EAAM,CACnBA,IACAA,EAAK,YAAc,KAAK,YACxBrS,EAAIA,EAAE,MAAM,GAAG,EACfqS,EAAK,aAAa,SAAUrS,EAAE,EAAE,EAChCqS,EAAK,aAAa,SAAUrS,EAAE,EAAE,GAEpC,IAAIwF,EAAU,SAAS,cAAc,KAAK,EAC1C,OAAA6M,EAAK,MAAM,OAAS,MACpBA,EAAK,MAAM,OAAS,iBACb7M,CACV,EACD,YAAa,SAAUxF,EAAG,CAGtB,QAFIoB,EAAI,SAASpB,EAAE,OAAO,aAAa,QAAQ,CAAC,EAC5CqB,EAAI,SAASrB,EAAE,OAAO,aAAa,QAAQ,CAAC,EACvCI,EAAI,EAAGA,EAAIJ,EAAE,OAAO,WAAW,SAAS,OAAQI,IAAK,CAC1D,IAAIoF,EAAUxF,EAAE,OAAO,WAAW,SAASI,GACvC2c,EAAK,SAASvX,EAAQ,aAAa,QAAQ,CAAC,EAC5CwX,EAAK,SAASxX,EAAQ,aAAa,QAAQ,CAAC,EAC5CuX,GAAM3b,GAAK4b,GAAM3b,GACjBmE,EAAQ,MAAM,gBAAkB,UAChCA,EAAQ,MAAM,YAAc,YAE5BA,EAAQ,MAAM,gBAAkB,GAChCA,EAAQ,MAAM,YAAc,OAEnC,CACJ,EACD,SAAU,SAAU5F,EAAGC,EAAGC,EAAG,CACzBA,EAAIA,EAAE,MAAM,GAAG,EAGf,QAFIsP,EAAQ,SAAS,cAAc,OAAO,EACtC6N,EAAQ,SAAS,cAAc,OAAO,EACjC5b,EAAI,EAAGA,GAAKvB,EAAE,GAAIuB,IAAK,CAE5B,QADIsS,EAAK,SAAS,cAAc,IAAI,EAC3BvS,EAAI,EAAGA,GAAKtB,EAAE,GAAIsB,IAAK,CAC5B,IAAIwS,EAAK,SAAS,cAAc,IAAI,EACpCA,EAAG,UAAY,GACfD,EAAG,YAAYC,CAAE,CACpB,CACDqJ,EAAM,YAAYtJ,CAAE,CACvB,CACDvE,EAAM,YAAY6N,CAAK,EACvB7N,EAAM,aAAa,QAAS,MAAM,EAClCA,EAAM,aAAa,cAAe,GAAG,EACrCA,EAAM,aAAa,cAAe,GAAG,EACrC,SAAS,YAAY,aAAc,GAAOA,EAAM,SAAS,CAC5D,CACjB,CAAa,GAGEoG,CACV,EAEMtO,CACV,CAE4B,IAAIgW,GAAUpD,GAAM,EAGjD,SAASqD,IAAW,CAChB,IAAIjW,EAAa,SAAUvC,EAAIuB,EAAS,CACpC,IAAIvC,EAAM,CAAA,EACVA,EAAI,QAAU,GAGd,IAAIwC,EAAW,CACX,KAAM,MACN,MAAO,WACP,MAAO,IACP,OAAQ,GACX,EAGD,QAASE,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,GAEhC1C,EAAI,QAAQ0C,GAAYF,EAASE,GAMzC,IAAI+W,EAAa,UAAY,CAEzB,QADIC,EAAO,SAAS,cAAc,KAAK,EAChC1Y,EAAG,SAAS,IACf0Y,EAAK,YAAY1Y,EAAG,SAAS,EAAE,EAOnC,IAJAhB,EAAI,QAAU,SAAS,cAAc,KAAK,EAC1CA,EAAI,QAAQ,UAAY,oBACxBA,EAAI,QAAQ,UAAYgB,EAAG,UAEpB0Y,EAAK,SAAS,IACjB1Z,EAAI,QAAQ,YAAY0Z,EAAK,SAAS,EAAE,EAG5C1Z,EAAI,UAAY,SAAS,cAAc,KAAK,EAC5CA,EAAI,UAAU,UAAY,YAC1BA,EAAI,UAAU,YAAYA,EAAI,OAAO,EAEjCA,EAAI,QAAQ,MACZA,EAAI,UAAU,aAAa,QAASA,EAAI,QAAQ,KAAK,EAErDA,EAAI,UAAU,UAAU,IAAI,UAAU,EAItCA,EAAI,QAAQ,QACZA,EAAI,UAAU,MAAM,MAAQ,SAASA,EAAI,QAAQ,KAAK,EAAI,MAG1DA,EAAI,QAAQ,SACZA,EAAI,UAAU,MAAM,OAAS,SAASA,EAAI,QAAQ,MAAM,EAAI,MAGhEgB,EAAG,UAAY,GACfA,EAAG,YAAYhB,EAAI,SAAS,CAC/B,EAEG2Z,EAAY,UAAY,CACpB3Z,EAAI,WACJA,EAAI,UAAU,iBAAiB,QAAS,SAAU3D,EAAG,CACjD,IAAIwN,EAAOxN,EAAE,OAAO,sBAAqB,EAEzC,GAAIA,EAAE,OAAO,UAAU,SAAS,WAAW,EAAG,CAC1C,GAAIA,EAAE,gBAAkBA,EAAE,eAAe,GACrC,IAAIoB,EAAIpB,EAAE,eAAe,GAAG,QACxBqB,EAAIrB,EAAE,eAAe,GAAG,YAE5B,KAAIoB,EAAIpB,EAAE,QACNqB,EAAIrB,EAAE,QAGVwN,EAAK,OAASpM,EAAIoM,EAAK,MAAQ,IAAOnM,EAAImM,EAAK,IAAO,GACtD,WAAW,UAAY,CACnB7J,EAAI,MAAK,CACZ,EAAE,GAAG,EAENA,EAAI,SAAQ,CAEnB,CACrB,CAAiB,CAER,EAEG4Z,EAAU,UAAY,CACtB5Z,EAAI,UAAU,UAAU,IAAI,aAAeA,EAAI,QAAQ,IAAI,CAC9D,EAED,OAAAA,EAAI,MAAQ,CACR,UAAW,EACd,EAEDA,EAAI,SAAW,UAAY,CACnBA,EAAI,MAAM,UACVA,EAAI,UAAU,UAAU,OAAO,qBAAqB,EAEpDA,EAAI,UAAU,UAAU,IAAI,qBAAqB,EAErDA,EAAI,MAAM,UAAY,CAACA,EAAI,MAAM,SACpC,EAEDA,EAAI,MAAQ,UAAY,CACpB,WAAW,SAAS,OAAOuD,EAAU,SAAS,QAAQvD,EAAI,SAAS,EAAG,CAAC,EACvEA,EAAI,eAAc,EAClBgB,EAAG,OAAM,CACZ,EAEDhB,EAAI,eAAiB,UAAY,CAC7B,QAASvD,EAAI,EAAGA,EAAI8G,EAAU,SAAS,OAAQ9G,IAAK,CAChD,IAAIod,EAAWtW,EAAU,SAAS9G,GAC9Bqd,EAAevW,EAAU,SAAS9G,EAAI,GAC1Cod,EAAS,MAAM,MAAQpd,GAAKqd,EAAeA,EAAa,YAAcD,EAAS,aAAe,KAAO,IACxG,CACJ,EAED7Z,EAAI,KAAO,UAAY,CAEnByZ,IAGAE,IAGAC,IAGArW,EAAU,SAAS,KAAKvD,EAAI,SAAS,EACrCA,EAAI,eAAc,EAElBgB,EAAG,SAAWhB,CACjB,EAEDA,EAAI,KAAI,EAEDA,CACf,EAEI,OAAAuD,EAAU,SAAW,GAEdA,CACV,CAE4B,IAAIsW,GAAYL,GAAQ,EAIrD,SAASO,IAAc,CASnB,MAAMhU,EAAY,SAAS3E,EAAK,CAC5B,MAAO,CAAC,MAAMA,CAAG,GAAKA,IAAQ,OAAS,OAAOA,GAAQ,UAAYA,EAAI,KAAM,IAAK,GACpF,EAEK4Y,EAAkB,CACpB,QAAW,SAASjZ,EAAOE,EAAO,CAC9B,OAAOF,GAASE,EAAM,IAAMF,GAASE,EAAM,EAC9C,EACD,cAAe,SAASF,EAAOE,EAAO,CAClC,OAAOF,EAAQE,EAAM,IAAMF,EAAQE,EAAM,EAC5C,EACD,IAAK,SAASF,EAAOE,EAAO,CACxB,OAAOF,EAAQE,EAAM,EACxB,EACD,KAAM,SAASF,EAAOE,EAAO,CACzB,OAAOF,GAASE,EAAM,EACzB,EACD,IAAK,SAASF,EAAOE,EAAO,CACxB,OAAOF,EAAQE,EAAM,EACxB,EACD,KAAM,SAASF,EAAOE,EAAO,CACzB,OAAOF,GAASE,EAAM,EACzB,EACD,IAAK,SAASF,EAAOE,EAAO,CACxB,OAAOF,GAASE,EAAM,EACzB,EACD,KAAM,SAASF,EAAOE,EAAO,CACzB,OAAOF,GAASE,EAAM,EACzB,CACJ,EAEKgZ,EAAgB,CAClB,aAAc,UAAW,CACrB,MAAO,EACV,EACD,IAAK,SAASlZ,EAAOE,EAAO,CACxB,OAAOF,IAAUE,EAAM,EAC1B,EACD,KAAM,SAASF,EAAOE,EAAO,CACzB,OAAOF,IAAUE,EAAM,EAC1B,EACD,IAAK,SAASF,EAAOE,EAAO,CACxB,OAAOF,EAAQE,EAAM,EACxB,EACD,KAAM,SAASF,EAAOE,EAAO,CACzB,OAAOF,GAASE,EAAM,EACzB,EACD,IAAK,SAASF,EAAOE,EAAO,CACxB,OAAOF,EAAQE,EAAM,EACxB,EACD,KAAM,SAASF,EAAOE,EAAO,CACzB,OAAOF,GAASE,EAAM,EACzB,EACD,QAAW,SAASF,EAAOE,EAAO,CAC9B,OAAOF,GAASE,EAAM,IAAMF,GAASE,EAAM,EAC9C,EACD,cAAe,SAASF,EAAOE,EAAO,CAClC,OAAOF,EAAQE,EAAM,IAAMF,EAAQE,EAAM,EAC5C,CACJ,EAEKiZ,EAAgB,CAClB,SAAY,SAASnZ,EAAOE,EAAO,CAC/B,OAAOF,EAAM,SAASE,EAAM,EAAE,CACjC,EACD,eAAgB,SAASF,EAAOE,EAAO,CACnC,MAAO,CAACF,EAAM,SAASE,EAAM,EAAE,CAClC,EACD,cAAe,SAASF,EAAOE,EAAO,CAClC,OAAOF,EAAM,WAAWE,EAAM,EAAE,CACnC,EACD,YAAa,SAASF,EAAOE,EAAO,CAChC,OAAOF,EAAM,SAASE,EAAM,EAAE,CACjC,EACD,IAAK,SAASF,EAAOE,EAAO,CACxB,OAAOF,IAAUE,EAAM,EAC1B,EACD,KAAM,SAASF,EAAOE,EAAO,CACzB,OAAOF,IAAUE,EAAM,EAC1B,EACD,cAAe,SAASF,EAAO,CAC3B,IAAIoZ,EAAU,IAAI,OAAO,4BAA4B,EAErD,OAAOA,EAAQ,KAAKpZ,CAAK,CAC5B,EACD,YAAa,SAASA,EAAO,CACzB,IAAIoZ,EAAU,IAAI,OAAO,6EAA6E,EAEtG,OAAOA,EAAQ,KAAKpZ,CAAK,CAC5B,CACJ,EAGKL,EAAY,SAASK,EAAOwB,EAAS,CACvC,OAAI,OAAO7B,EAAU6B,EAAQ,OAAW,WAChCA,EAAQ,aAAe,OAAOxB,EAAU,KAAeA,IAAU,IAAMA,IAAU,MAC1E,GAEJL,EAAU6B,EAAQ,MAAM,KAAK,KAAMxB,EAAOwB,CAAO,EAErD,IACV,EAED7B,EAAU,IAAM,SAASsC,EAAM,CAC3B,IAAImX,EAAU,IAAI,OAAO,6EAA6E,EACtG,MAAO,EAAAA,EAAQ,KAAKnX,CAAI,CAC3B,EAEDtC,EAAU,MAAQ,SAASsC,EAAM,CAC7B,IAAImX,EAAU,IAAI,OAAO,4BAA4B,EACrD,MAAO,GAAAnX,GAAQmX,EAAQ,KAAKnX,CAAI,EACnC,EAEDtC,EAAU,SAAW,SAASsC,EAAM,CAChC,MAAO,GAAAA,GAAQA,EAAK,KAAI,EAC3B,EAEDtC,EAAU,MAAQ,SAASsC,EAAM,CAC7B,OAAO,OAAOA,EAAS,KAAeA,IAAS,MAAS,OAAOA,GAAS,UAAY,CAACA,EAAK,WAAW,KAAM,CAC9G,EAEDtC,EAAU,aAAeA,EAAU,MAEnCA,EAAU,SAAW,SAASsC,EAAM,CAChC,MAAO,CAACtC,EAAU,MAAMsC,CAAI,CAC/B,EAEDtC,EAAU,MAAQA,EAAU,SAE5BA,EAAU,OAAS,SAASsC,EAAMT,EAAS,CACxC,GAAI,CAAEwD,EAAU/C,CAAI,EAChB,MAAO,GAGX,GAAI,CAACT,GAAW,CAACA,EAAQ,SACrB,MAAO,GAGX,GAAI,CAACyX,EAAgBzX,EAAQ,UACzB,MAAO,GAGX,IAAI2Q,EAAS3Q,EAAQ,MAAM,IAAI,SAASnB,EAAK,CAC1C,OAAO,WAAWA,CAAG,CAC/B,CAAQ,EAED,OAAO4Y,EAAgBzX,EAAQ,UAAUS,EAAMkQ,CAAM,CAC5D,EAEIxS,EAAU,MAAQ,SAASsC,EAAM,CAC7B,IAAImX,EAAU,IAAI,OAAO,mBAAmB,EAC5C,MAAO,GAAAnX,GAAQmX,EAAQ,KAAKnX,CAAI,EACnC,EAEDtC,EAAU,KAAO,SAASsC,EAAMT,EAAS,CACrC,IAAI6X,EAAW,OAAOpX,EACtB,GAAIoX,IAAa,UAAYA,IAAa,SACtC,MAAO,GAEX,IAAIC,EAWJ,OAVI,OAAO9X,EAAQ,MAAM,IAAQ,SACzBA,EAAQ,OACR8X,EAAO9X,EAAQ,OAEf8X,EAAO9X,EAAQ,MAAM,GAAG,MAAM,GAAG,EAGrC8X,EAAO9X,EAAQ,MAAM,GAGnB,MAAM,QAAQ8X,CAAI,EAGFA,EAAK,UAAU,SAAU3L,EAAM,CAC7C,OAAOA,GAAQ1L,CAC/B,CAAa,EAEoB,GANd,EAQd,EAED,MAAMsX,EAA4B,UAAW,CACzC,IAAI3V,EAAO,IAAI,KACf,OAAAA,EAAK,SAAS,EAAG,EAAG,EAAG,CAAC,EACjBA,CACV,EAEK4V,EAAgB,CAClB,eAAgB,UAAW,CACvB,IAAI5V,EAAO2V,IAEX,OAAA3V,EAAK,YAAYA,EAAK,YAAa,EAAG,CAAC,EAEhCA,CACV,EACD,gBAAiB,UAAW,CACxB,IAAIA,EAAO2V,IAEX,OAAA3V,EAAK,SAASA,EAAK,SAAU,EAAG,CAAC,EAE1BA,CACV,EACD,eAAgB,UAAW,CACvB,IAAIA,EAAO2V,IAEX,OAAA3V,EAAK,QAAQA,EAAK,QAAS,EAAG,CAAC,EAExBA,CACV,EACD,UAAW,UAAW,CAClB,IAAIA,EAAO2V,IAEX,OAAA3V,EAAK,QAAQA,EAAK,QAAS,EAAG,CAAC,EAExBA,CACV,EACD,MAAO2V,EACP,SAAU,UAAW,CACjB,IAAI3V,EAAO2V,IAEX,OAAA3V,EAAK,QAAQA,EAAK,QAAS,EAAG,CAAC,EAExBA,CACV,CACT,EAEI,OAAAjE,EAAU,KAAO,SAASsC,EAAMT,EAAS,CAKrC,GAJIwD,EAAU/C,CAAI,GAAKA,EAAO,GAAKA,EAAO,MACtCA,EAAOwC,EAAa,UAAUxC,CAAI,GAGlC,IAAI,KAAKA,CAAI,GAAK,eAClB,MAAO,GAGX,GAAI,CAACT,GAAW,CAACA,EAAQ,SACrB,MAAO,GAGX,GAAI,CAAC0X,EAAc1X,EAAQ,UACvB,MAAO,GAGX,IAAI2Q,EAAS3Q,EAAQ,MAAM,IAAI,SAASoC,EAAM,CAC1C,OAAI,OAAOA,GAAS,UAAY4V,EAAc5V,GACnC4V,EAAc5V,GAAO,EAAC,QAAO,EAGjC,IAAI,KAAKA,CAAI,EAAE,QAAO,CACzC,CAAS,EAED,OAAOsV,EAAc1X,EAAQ,UAAU,IAAI,KAAKS,CAAI,EAAE,UAAWkQ,CAAM,CAC1E,EAEDxS,EAAU,KAAO,SAASsC,EAAMT,EAAS,CACrC,GAAI,OAAOS,EAAS,KAAeA,IAAS,KACxCA,EAAO,WACA,OAAOA,GAAS,SACvB,MAAO,GAGX,MAAI,CAACT,GAAW,CAACA,EAAQ,SACd,GAGN2X,EAAc3X,EAAQ,UAIpB2X,EAAc3X,EAAQ,UAAUS,EAAMT,EAAQ,KAAK,EAH/C,EAId,EAED7B,EAAU,WAAa,SAASsC,EAAMT,EAAS,CAC3C,OAAAS,EAAOA,EAAK,WAELtC,EAAU,OAAOsC,EAAK,OAAQT,CAAO,CAC/C,EAEM7B,CACV,CAE4B,IAAI8Z,GAAeT,GAAW,EAM3D,SAASU,IAAO,CACZ,IAAIlX,EAAa,SAASvC,EAAIuB,EAAS,CACnC,IAAIvC,EAAM,CAAA,EACVA,EAAI,QAAU,GAGd,IAAIwC,EAAW,CACX,IAAK,KACL,QAAS,2DACT,OAAQ,GACR,YAAa,KACb,aAAa,KACb,YAAa,KACb,aAAc,KACd,OAAQ,KACR,aAAc,KACd,OAAQ,KACR,eAAgB,KAChB,SAAU,KACV,QAAS,SAASxB,EAAI0Z,EAAS,CAC3B,MAAMA,CAAO,CAChB,CACb,EAGQ,QAAShY,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,GAEhC1C,EAAI,QAAQ0C,GAAYF,EAASE,GAKnC1C,EAAI,QAAQ,cACdA,EAAI,QAAQ,YAAc,IAIxBA,EAAI,QAAQ,eACdA,EAAI,QAAQ,aAAegB,EAAG,cAAc,oBAAoB,GAGhEhB,EAAI,QAAQ,cAAgBA,EAAI,QAAQ,MACxCA,EAAI,QAAQ,aAAa,QAAU,UAAW,CAC1CA,EAAI,KAAI,CACX,GAGCA,EAAI,QAAQ,YAAY,QAC1BA,EAAI,QAAQ,YAAY,MAAQwa,GAAY,OAG1Cxa,EAAI,QAAQ,YAAY,SAC1BA,EAAI,QAAQ,YAAY,OAASwa,GAAY,QAG3Cxa,EAAI,QAAQ,YAAY,WAC1BA,EAAI,QAAQ,YAAY,SAAWwa,GAAY,UAGnDxa,EAAI,OAAS,SAASgE,EAAK,CACvBhE,EAAI,QAAQ,IAAMgE,CACrB,EAEDhE,EAAI,KAAO,UAAW,CAClBoE,GAAK,CACD,IAAKpE,EAAI,QAAQ,IACjB,OAAQ,MACR,SAAU,OACV,MAAO,GACP,QAAS,SAASgD,EAAM,CAEpB,GAAI,OAAOhD,EAAI,QAAQ,cAAiB,WAAY,CAChD,IAAImH,EAAMnH,EAAI,QAAQ,aAAagB,EAAIgC,CAAI,EACvCmE,IACAnE,EAAOmE,EAEd,CAED5D,EAAU,YAAYvC,EAAIgC,CAAI,EAE1B,OAAOhD,EAAI,QAAQ,QAAW,YAC9BA,EAAI,QAAQ,OAAOgB,EAAIgC,CAAI,CAElC,CACjB,CAAa,CACJ,EAEDhD,EAAI,KAAO,UAAW,CAClB,IAAIoH,EAAOpH,EAAI,WAEf,GAAIoH,EACApH,EAAI,QAAQ,QAAQgB,EAAIoG,CAAI,MACzB,CACH,IAAIpE,EAAOO,EAAU,YAAYvC,EAAI,EAAI,EAEzC,GAAI,OAAOhB,EAAI,QAAQ,cAAiB,WAAY,CAChD,IAAIgD,EAAOhD,EAAI,QAAQ,aAAagB,EAAIgC,CAAI,EAE5C,GAAIA,IAAS,GACT,MAEP,CAEDoB,GAAK,CACD,IAAKpE,EAAI,QAAQ,IACjB,OAAQ,OACR,SAAU,OACV,KAAMgD,EACN,QAAS,SAASc,EAAQ,CAClB,OAAO9D,EAAI,QAAQ,QAAW,YAC9BA,EAAI,QAAQ,OAAOgB,EAAIgC,EAAMc,CAAM,CAE1C,CACrB,CAAiB,CACJ,CACJ,EAED9D,EAAI,OAAS,UAAW,CACpB,GAAI,OAAOA,EAAI,QAAQ,gBAAmB,WAAY,CAClD,IAAImH,EAAMnH,EAAI,QAAQ,eAAegB,EAAIhB,CAAG,EAC5C,GAAImH,IAAQ,GACR,MAAO,EAEd,CAED/C,GAAK,CACD,IAAKpE,EAAI,QAAQ,IACjB,OAAQ,SACR,SAAU,OACV,QAAS,SAAS8D,EAAQ,CAClB,OAAO9D,EAAI,QAAQ,UAAa,YAChCA,EAAI,QAAQ,SAASgB,EAAIhB,EAAK8D,CAAM,EAGxC9D,EAAI,MAAK,CACZ,CACjB,CAAa,CACJ,EAED,IAAI2a,EAAW,SAAS9Y,EAAS,CAE7BA,EAAQ,UAAU,IAAI,OAAO,EAEzB7B,EAAI,QAAQ,cACZA,EAAI,QAAQ,aAAa,aAAa,WAAY,EAAI,EAG1D,IAAI4a,EAAQ/Y,EAAQ,aAAa,YAAY,GAAK,gCAClD,OAAAA,EAAQ,aAAa,QAAS+Y,CAAK,EAC5BA,CACV,EAEGC,EAAW,SAAShZ,EAAS,CAC7B,IAAI+Y,EAAQ,GAEZ/Y,EAAQ,UAAU,OAAO,OAAO,EAChCA,EAAQ,gBAAgB,OAAO,EAI/B,QAFIwI,EAAWrJ,EAAG,iBAAiB,oCAAoC,EAE9DvE,EAAI,EAAGA,EAAI4N,EAAS,OAAQ5N,IAC7B4N,EAAS5N,GAAG,aAAa,iBAAiB,GACtC4N,EAAS5N,GAAG,UAAU,SAAS,OAAO,IACtCme,EAAQ,IAKhB5a,EAAI,QAAQ,eACR4a,EACA5a,EAAI,QAAQ,aAAa,aAAa,WAAY,EAAI,EAEtDA,EAAI,QAAQ,aAAa,gBAAgB,UAAU,EAG9D,EAED,OAAAA,EAAI,gBAAkB,SAAS6B,EAAS,CAEpC,IAAIuF,EAAO,GAEPrG,EAAQwC,EAAU,SAAS1B,CAAO,EAElCiZ,EAAajZ,EAAQ,aAAa,iBAAiB,EAEvD,OAAI,OAAO7B,EAAI,QAAQ,YAAY8a,IAAgB,YAAc,CAAE9a,EAAI,QAAQ,YAAY8a,GAAY/Z,EAAOc,CAAO,EAEjHuF,EAAOuT,EAAS9Y,CAAO,EAEnBA,EAAQ,UAAU,SAAS,OAAO,GAClCgZ,EAAShZ,CAAO,EAIjBuF,CACV,EAEDpH,EAAI,MAAQ,UAAW,CAKnB,QAFIqK,EAAWrJ,EAAG,iBAAiB,oCAAoC,EAE9DvE,EAAI,EAAGA,EAAI4N,EAAS,OAAQ5N,IACtB4N,EAAS5N,GAAG,aAAa,MAAM,IAClC4N,EAAS5N,GAAG,MAAQ,YAAc4N,EAAS5N,GAAG,MAAQ,QACtD4N,EAAS5N,GAAG,QAAU,GAElB,OAAO4N,EAAS5N,GAAG,KAAQ,WAC3B4N,EAAS5N,GAAG,IAAI,EAAE,EAElB4N,EAAS5N,GAAG,MAAQ,GAKvC,EAGDuD,EAAI,SAAW,UAAW,CAKtB,QAJIoH,EAAO,CAAA,EAEPiD,EAAWrJ,EAAG,iBAAiB,oCAAoC,EAE9DvE,EAAI,EAAGA,EAAI4N,EAAS,OAAQ5N,IAEjC,GAAI4N,EAAS5N,GAAG,aAAa,iBAAiB,EAAG,CAC7C,IAAIse,EAAM/a,EAAI,gBAAgBqK,EAAS5N,EAAE,EACrCse,GACA3T,EAAK,KAAK2T,CAAG,CAEpB,CAEL,OAAI3T,EAAK,OAAS,EACPA,EAAK,KAAK,MAAM,EAEhB,EAEd,EAGDpH,EAAI,SAAW,UAAW,CAEtB,MAAO,EAAAA,EAAI,YACd,EAGDA,EAAI,QAAU,UAAW,CACrB,OAAOA,EAAI,QAAQuD,EAAU,YAAYvC,CAAE,CAAC,CAC/C,EAGDhB,EAAI,QAAU,SAAStE,EAAK,CACxB,IAAI4F,EAAO,EAAG7E,EAAG8E,EAEjB,GAAI7F,EAAI,SAAW,EACf,OAAO4F,EAEP,IAAK7E,EAAI,EAAGA,EAAIf,EAAI,OAAQe,IAC1B8E,EAAM7F,EAAI,WAAWe,CAAC,EACtB6E,GAASA,GAAQ,GAAKA,EAAQC,EAC9BD,GAAQ,EAId,OAAOA,CACV,EAGDtB,EAAI,UAAY,UAAW,CACvB,IAAIsB,EAAOtB,EAAI,UACf,OAAQA,EAAI,QAAQ,aAAesB,CACtC,EAGDtB,EAAI,aAAe,UAAW,CAC1BA,EAAI,QAAQ,YAAcA,EAAI,QAAO,EACrCA,EAAI,QAAQ,OAAS,EACxB,EAGDA,EAAI,UAAY,SAASgb,EAAY,CACjChb,EAAI,QAAQ,OAAS,EAAAgb,CACxB,EAGD,WAAW,UAAW,CAClBhb,EAAI,QAAQ,YAAcA,EAAI,QAAO,CACxC,EAAE,GAAI,EAGPgB,EAAG,iBAAiB,QAAS,SAAS3E,EAAG,CACjCA,EAAE,OAAO,aAAa,iBAAiB,GACvC2D,EAAI,gBAAgB3D,EAAE,MAAM,CAE5C,CAAS,EAGKkH,EAAU,YACZ,OAAO,iBAAiB,eAAgB,SAAUlH,EAAG,CACjD,GAAI2D,EAAI,UAAW,GAAIA,EAAI,QAAQ,QAAU,GAAO,CAChD,IAAIib,EAAuBjb,EAAI,QAAQ,QAASA,EAAI,QAAQ,QAAU,KAEtE,OAAIib,GACI,OAAO5e,EAAK,MACZA,EAAI,OAAO,OAGXA,IACAA,EAAE,YAAc4e,GAGbA,GAEP,MAEP,CACjB,CAAa,EAED1X,EAAU,UAAY,IAG1BvC,EAAG,KAAOhB,EAEHA,CACf,EAGI,OAAAuD,EAAU,SAAW,SAAS1B,EAAS,CACnC,IAAId,EAAQ,KACZ,GAAIc,EAAQ,MAAQ,WACZA,EAAQ,SAAW,KACnBd,EAAQc,EAAQ,OAAS,YAEtBA,EAAQ,MAAQ,QACnBA,EAAQ,SAAW,KACnBd,EAAQc,EAAQ,eAEbA,EAAQ,MAAQ,OACvBd,EAAQc,EAAQ,cACTA,EAAQ,SAAW,UAAYA,EAAQ,UAAY,GAAM,CAChEd,EAAQ,CAAA,EAER,QADIwB,EAAUV,EAAQ,iBAAiB,mBAAmB,EACjDnF,EAAI,EAAGA,EAAI6F,EAAQ,OAAQ7F,IAChCqE,EAAM,KAAKwB,EAAQ7F,GAAG,KAAK,CAElC,MAAU,OAAOmF,EAAQ,KAAQ,WAC9Bd,EAAQc,EAAQ,MAEhBd,EAAQc,EAAQ,OAAS,GAG7B,OAAOd,CACV,EAGDwC,EAAU,YAAc,SAASvC,EAAIiT,EAAS,CAK1C,QAJIjR,EAAO,CAAA,EACPmO,EAAO,KACP9G,EAAWrJ,EAAG,iBAAiB,oCAAoC,EAE9DvE,EAAI,EAAGA,EAAI4N,EAAS,OAAQ5N,KAC7B0U,EAAO9G,EAAS5N,GAAG,aAAa,MAAM,KACtCuG,EAAKmO,GAAQ5N,EAAU,SAAS8G,EAAS5N,EAAE,GAAK,IAIxD,OAAOwX,GAAW,GAAOjR,EAAO,KAAK,UAAUA,CAAI,CACtD,EAGDO,EAAU,YAAc,SAASvC,EAAIgC,EAAM,CAIvC,QAHImO,EAAO,KACPpQ,EAAQ,KACRsJ,EAAWrJ,EAAG,iBAAiB,oCAAoC,EAC9DvE,EAAI,EAAGA,EAAI4N,EAAS,OAAQ5N,IAAK,CAEtC,IAAImL,EAAOyC,EAAS5N,GAAG,aAAa,MAAM,EAC1C,GAAI0U,EAAO9G,EAAS5N,GAAG,aAAa,MAAM,EAAG,CAKzC,GAHA0U,EAAOA,EAAK,QAAQ,IAAI,OAAO,aAAa,EAAG,KAAK,EACpDpQ,EAAQ,KAEJoQ,EAAK,MAAM,IAAI,EAAG,CAClB,IAAIrD,EAAM5L,EAAK,KAAKc,EAAMmO,CAAI,GAAK,GAC/B,OAAOrD,EAAS,MAChB/M,EAAQ+M,EAEhC,MACwB,OAAO9K,EAAKmO,GAAW,MACvBpQ,EAAQiC,EAAKmO,IAIjBpQ,IAAU,OACN6G,GAAQ,YAAcA,GAAQ,QAC9ByC,EAAS5N,GAAG,QAAU,EAAAsE,EACf6G,GAAQ,SAGX,OAAQyC,EAAS5N,GAAG,KAAQ,WAC5B4N,EAAS5N,GAAG,IAAIsE,CAAK,EAErBsJ,EAAS5N,GAAG,MAAQsE,GAInC,CACJ,CACJ,EAEMwC,CACV,CAE4B,IAAI2X,GAAgBT,GAAI,EAMrD,SAASU,IAAQ,CAEb,IAAIC,EAAS,UAAW,CAEpB,IAAIC,EAAU,KAEVC,EAAU,SAAUjf,EAAG,CACvB,GAAIA,EAAE,OAAS,GAEX,QADIkf,EAAS,SAAS,iBAAiB,SAAS,EACvC9e,EAAI,EAAGA,EAAI8e,EAAO,OAAQ9e,IAC/B8e,EAAO9e,GAAG,WAAW,MAAM,MAAK,CAG3C,EAEG+e,EAAU,SAAUnf,EAAG,CACvB,IAAIwF,EAAUxF,EAAE,eAChB,IAAIqS,EAAOzM,EAAQ,YAAYJ,EAAQ,GAAI,QAAQ,EACnD,GAAI6M,EAAM,CAEN,IAAI7E,EAAO6E,EAAK,wBAEhB,GAAIrS,EAAE,gBAAkBA,EAAE,eAAe,GACrC,IAAIoB,EAAIpB,EAAE,eAAe,GAAG,QACxBqB,EAAIrB,EAAE,eAAe,GAAG,YAE5B,KAAIoB,EAAIpB,EAAE,QACNqB,EAAIrB,EAAE,QAGVwN,EAAK,OAASpM,EAAIoM,EAAK,MAAQ,IAAOnM,EAAImM,EAAK,IAAO,IACtD6E,EAAK,WAAW,MAAM,OAE7B,CAEG2M,IACAA,EAAQ,QAAQ,MAAM,OAAS,OAC/BA,EAAU,KAEjB,EAEGI,EAAY,SAAUpf,EAAG,CACzB,IAAIwF,EAAUxF,EAAE,eAChB,IAAIqS,EAAOzM,EAAQ,YAAYJ,EAAQ,GAAI,QAAQ,EACnD,GAAI6M,EAAM,CAEN,IAAI7E,EAAO6E,EAAK,wBAEhB,GAAIrS,EAAE,gBAAkBA,EAAE,eAAe,GACrC,IAAIoB,EAAIpB,EAAE,eAAe,GAAG,QACxBqB,EAAIrB,EAAE,eAAe,GAAG,YAE5B,KAAIoB,EAAIpB,EAAE,QACNqB,EAAIrB,EAAE,QAGVwN,EAAK,OAASpM,EAAIoM,EAAK,MAAQ,IAAOnM,EAAImM,EAAK,IAAO,IAGlDnM,EAAImM,EAAK,IAAM,KACX,SAAS,UACT,SAAS,UAAU,QACZ,OAAO,cACd,OAAO,eAAe,kBAG1BwR,EAAU,CACN,KAAMxR,EAAK,KACX,IAAKA,EAAK,IACV,EAAGxN,EAAE,QACL,EAAGA,EAAE,QACL,MAAOwN,EAAK,MACZ,OAAQA,EAAK,OACb,QAAS6E,CACZ,EAGZ,CACJ,EAEGgN,EAAY,SAAUrf,EAAG,CACzB,GAAIgf,EAAS,CAET,GADAhf,EAAIA,GAAK,OAAO,MACZA,EAAE,QACF,IAAIsf,EAActf,EAAE,gBACbA,EAAE,OACT,IAAIsf,EAActf,EAAE,WAEpB,KAAIsf,EAActf,EAAE,MAGpBsf,GACAN,EAAQ,QAAQ,MAAM,IAAOA,EAAQ,KAAOhf,EAAE,QAAUgf,EAAQ,GAAMA,EAAQ,OAAS,EAAM,KAC7FA,EAAQ,QAAQ,MAAM,KAAQA,EAAQ,MAAQhf,EAAE,QAAUgf,EAAQ,GAAMA,EAAQ,MAAQ,EAAM,KAC9FA,EAAQ,QAAQ,MAAM,OAAS,QAE/BA,EAAQ,QAAQ,MAAM,OAAS,MAEtC,CACJ,EAED,SAAS,iBAAiB,UAAWC,CAAO,EAC5C,SAAS,iBAAiB,UAAWE,CAAO,EAC5C,SAAS,iBAAiB,YAAaC,CAAS,EAChD,SAAS,iBAAiB,YAAaC,CAAS,CACnD,EAEGnY,EAAa,SAAUvC,EAAIuB,EAAS,CACpC,IAAIvC,EAAM,CAAA,EACVA,EAAI,QAAU,GAGd,IAAIwC,EAAW,CACX,IAAK,KACL,OAAQ,KACR,QAAS,KACT,OAAQ,KACR,OAAQ,GACR,MAAO,KACP,OAAQ,KACR,MAAO,KACP,QAAS,KACT,SAAU,GACV,KAAM,IAClB,EAGQ,QAASE,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,GAEhC1C,EAAI,QAAQ0C,GAAYF,EAASE,GAKrC,CAAC1C,EAAI,QAAQ,OAASgB,EAAG,aAAa,OAAO,IAC7ChB,EAAI,QAAQ,MAAQgB,EAAG,aAAa,OAAO,GAI/C,QADI0Y,EAAO,SAAS,cAAc,KAAK,EAChC1Y,EAAG,SAAS,IACf0Y,EAAK,YAAY1Y,EAAG,SAAS,EAAE,EAanC,IAVAhB,EAAI,MAAQ,SAAS,cAAc,KAAK,EACxCA,EAAI,MAAM,UAAY,eAClBA,EAAI,QAAQ,MACZA,EAAI,MAAM,aAAa,YAAaA,EAAI,QAAQ,IAAI,EAGxDA,EAAI,QAAU,SAAS,cAAc,KAAK,EAC1CA,EAAI,QAAQ,UAAY,iBACxBA,EAAI,QAAQ,UAAYgB,EAAG,UAEpB0Y,EAAK,SAAS,IACjB1Z,EAAI,QAAQ,YAAY0Z,EAAK,SAAS,EAAE,EAiB5C,GAdA1Z,EAAI,UAAY,SAAS,cAAc,KAAK,EAC5CA,EAAI,UAAU,UAAY,SAC1BA,EAAI,UAAU,YAAYA,EAAI,KAAK,EACnCA,EAAI,UAAU,YAAYA,EAAI,OAAO,EAEjCA,EAAI,QAAQ,UACZA,EAAI,QAAQ,MAAM,QAAUA,EAAI,QAAQ,SAExCA,EAAI,QAAQ,QACZA,EAAI,UAAU,MAAM,MAAQA,EAAI,QAAQ,OAExCA,EAAI,QAAQ,SACZA,EAAI,UAAU,MAAM,OAASA,EAAI,QAAQ,QAEzCA,EAAI,QAAQ,MAAO,CACnB,IAAI4N,EAAQ,SAAS,cAAc,IAAI,EACvCA,EAAM,UAAY5N,EAAI,QAAQ,MAC9BA,EAAI,MAAM,YAAY4N,CAAK,CAC9B,CAOD,GALA5M,EAAG,UAAY,GACfA,EAAG,MAAM,QAAU,OACnBA,EAAG,YAAYhB,EAAI,SAAS,EAGxBA,EAAI,QAAQ,SAAU,CACtB,IAAI8O,EAAW,SAAS,cAAc,KAAK,EAC3CA,EAAS,UAAY,kBACrBA,EAAS,QAAU,UAAY,CAC3B9O,EAAI,MAAK,CACZ,EACDgB,EAAG,YAAY8N,CAAQ,CAC1B,CAED,OAAA9O,EAAI,KAAO,UAAY,CACnBgB,EAAG,MAAM,QAAU,QAEnB,IAAI6I,EAAO7J,EAAI,UAAU,sBAAqB,EAC1CiC,EAAQ,iBAAmB4H,EAAK,OAChC7J,EAAI,UAAU,MAAM,IAAM,GAC1BA,EAAI,UAAU,MAAM,KAAO,GAC3BA,EAAI,UAAU,UAAU,IAAI,mBAAmB,EAC/CyE,GAAU,YAAYzE,EAAI,UAAW,CAAC,GAElCA,EAAI,QAAQ,WACZ8O,EAAS,MAAM,QAAU,SAI7B,OAAQ9O,EAAI,QAAQ,QAAW,YAC/BA,EAAI,QAAQ,OAAOgB,EAAIhB,CAAG,CAEjC,EAEDA,EAAI,cAAgB,UAAY,CAC5BA,EAAI,UAAU,MAAM,IAAM,GAC1BA,EAAI,UAAU,MAAM,KAAO,EAC9B,EAEDA,EAAI,OAAS,UAAY,CACrB,OAAOgB,EAAG,MAAM,SAAW,MAC9B,EAEDhB,EAAI,MAAQ,UAAY,CAChBA,EAAI,WACJgB,EAAG,MAAM,QAAU,OACfhB,EAAI,QAAQ,WAEZ8O,EAAS,MAAM,QAAU,IAG7B9O,EAAI,UAAU,UAAU,OAAO,mBAAmB,EAE9C,OAAQA,EAAI,QAAQ,SAAY,YAChCA,EAAI,QAAQ,QAAQgB,EAAIhB,CAAG,EAGtC,EAEGA,EAAI,QAAQ,IACZoE,GAAK,CACD,IAAKpE,EAAI,QAAQ,IACjB,OAAQ,MACR,SAAU,YACV,QAAS,SAAUgD,EAAM,CACrBhD,EAAI,QAAQ,UAAYgD,EAEnBhD,EAAI,QAAQ,QACbA,EAAI,KAAI,EAGR,OAAQA,EAAI,QAAQ,QAAY,YAChCA,EAAI,QAAQ,OAAOA,CAAG,CAE7B,CACjB,CAAa,GAEIA,EAAI,QAAQ,QACbA,EAAI,KAAI,EAGR,OAAQA,EAAI,QAAQ,QAAY,YAChCA,EAAI,QAAQ,OAAOA,CAAG,GAK9BgB,EAAG,MAAQhB,EAGXob,IAGAA,EAAS,UAAW,CAAA,EAEbpb,CACf,EAEI,OAAOuD,CACV,CAE4B,IAAIqY,GAAST,GAAK,EAK/C,SAASU,IAAe,CACpB,IAAItY,EAAY,SAAUhB,EAAS,CAC/B,IAAIvC,EAAM,CAAA,EACVA,EAAI,QAAU,GAGd,IAAIwC,EAAW,CACX,KAAM,KACN,KAAM,eACN,KAAM,KACN,MAAO,KACP,MAAO,KACP,QAAS,KACT,QAAS,IACT,SAAU,GACV,UAAW,EACvB,EAGQ,QAASE,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,GAEhC1C,EAAI,QAAQ0C,GAAYF,EAASE,GAIzC,IAAIoZ,EAAe,SAAS,cAAc,KAAK,EAC/CA,EAAa,UAAY,gBAErB9b,EAAI,QAAQ,OACZ8b,EAAa,UAAU,IAAI,qBAAqB,EAGpD,IAAIC,EAAwB,SAAS,cAAc,KAAK,EACxDA,EAAsB,UAAY,0BAClCD,EAAa,YAAYC,CAAqB,EAE9C,IAAIC,EAAqB,SAAS,cAAc,KAAK,EACrDA,EAAmB,UAAY,uBAC/BD,EAAsB,YAAYC,CAAkB,EAEpD,IAAIC,EAAoB,SAAS,cAAc,KAAK,EAIpD,GAHAA,EAAkB,UAAY,sBAC9BD,EAAmB,YAAYC,CAAiB,EAE5Cjc,EAAI,QAAQ,KAAM,CAClB,IAAIkc,EAAmB,SAAS,cAAc,KAAK,EACnDA,EAAiB,IAAMlc,EAAI,QAAQ,KACnCic,EAAkB,YAAYC,CAAgB,CACjD,CAED,IAAIC,EAAmB,SAAS,cAAc,KAAK,EAKnD,GAJAA,EAAiB,UAAY,qBAC7BA,EAAiB,UAAYnc,EAAI,QAAQ,KACzCgc,EAAmB,YAAYG,CAAgB,EAE3Cnc,EAAI,QAAQ,WAAa,GAAM,CAC/B,IAAIoc,EAAoB,SAAS,cAAc,KAAK,EACpDA,EAAkB,UAAY,sBAC9BA,EAAkB,QAAU,UAAY,CACpCpc,EAAI,KAAI,CACX,EACDgc,EAAmB,YAAYI,CAAiB,CACnD,CAED,IAAIC,EAAmB,SAAS,cAAc,KAAK,EACnDA,EAAiB,UAAY,qBAC7BL,EAAmB,YAAYK,CAAgB,EAE/C,IAAIC,EAAsB,SAAS,cAAc,KAAK,EAItD,GAHAA,EAAoB,UAAY,wBAChCP,EAAsB,YAAYO,CAAmB,EAEjDtc,EAAI,QAAQ,MAAO,CACnB,IAAIuc,EAAoB,SAAS,cAAc,KAAK,EACpDA,EAAkB,UAAY,sBAC9BA,EAAkB,UAAYvc,EAAI,QAAQ,MAC1Csc,EAAoB,YAAYC,CAAiB,CACpD,CAED,IAAIC,EAAsB,SAAS,cAAc,KAAK,EAsCtD,GArCAA,EAAoB,UAAY,wBAChCA,EAAoB,UAAYxc,EAAI,QAAQ,QAC5Csc,EAAoB,YAAYE,CAAmB,EAEnDxc,EAAI,KAAO,UAAY,CACnB,SAAS,KAAK,YAAY8b,CAAY,EAClC7Z,EAAQ,eAAgB,EAAG,IAC3BwC,GAAU,OAAOqX,CAAY,EAE7BrX,GAAU,SAASqX,EAAc,CAAC,CAEzC,EAED9b,EAAI,KAAO,UAAY,CACfiC,EAAQ,eAAgB,EAAG,IAC3BwC,GAAU,QAAQqX,EAAc,UAAY,CACpCA,EAAa,aACbA,EAAa,WAAW,YAAYA,CAAY,EAC5CW,IACA,aAAaA,EAAmB,EAG5D,CAAiB,EAEDhY,GAAU,SAASqX,EAAc,EAAG,UAAY,CACxCA,EAAa,aACbA,EAAa,WAAW,YAAYA,CAAY,EAC5CW,IACA,aAAaA,EAAmB,EAG5D,CAAiB,CAEjB,EAEQzc,EAAI,KAAI,EAEJA,EAAI,QAAQ,UAAY,GACxB,IAAIyc,GAAsB,WAAW,UAAY,CAC7Czc,EAAI,KAAI,CACxB,EAAeA,EAAI,QAAQ,OAAO,EAG1B,OAAIiC,EAAQ,eAAgB,EAAG,KAC3B6Z,EAAa,iBAAiB,UAAW,SAAUzf,GAAG,CAClD2D,EAAI,KAAI,EACR3D,GAAE,eAAc,EAChBA,GAAE,gBAAe,CACjC,CAAa,EAGE2D,CACV,EAED,OAAAuD,EAAU,UAAY,UAAY,CAC9B,IAAI7G,EAAI,SAAS,cAAc,gBAAgB,EAC/C,MAAO,GAAAA,GAAKA,EAAE,WACjB,EAEM6G,CACV,CAE4B,IAAIuY,GAAgBD,GAAY,EAE7D,SAASa,GAAY1b,EAAIuB,EAAS,CAC9B,IAAIvC,EAAM,CAAA,EACVA,EAAI,QAAU,GAGd,IAAIwC,EAAW,CACX,MAAO,EACP,SAAU,KACV,MAAO,IACf,EAGI,QAASE,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,GAEhC1C,EAAI,QAAQ0C,GAAYF,EAASE,GAKzC1B,EAAG,UAAU,IAAI,cAAc,EAC/BA,EAAG,aAAa,WAAY,CAAC,EAC7BA,EAAG,aAAa,aAAchB,EAAI,QAAQ,KAAK,EAE/C,IAAI2c,EAAM,SAAS,cAAc,KAAK,EACtCA,EAAI,MAAM,MAAQ3c,EAAI,QAAQ,MAAQ,IACtC2c,EAAI,MAAM,MAAQ,OAClB3b,EAAG,YAAY2b,CAAG,EAEd3c,EAAI,QAAQ,QACZgB,EAAG,MAAM,MAAQhB,EAAI,QAAQ,OAIjCA,EAAI,SAAW,SAASe,EAAO,CAC3BA,EAAQ,SAASA,CAAK,EACtBf,EAAI,QAAQ,MAAQe,EACpB4b,EAAI,MAAM,MAAQ5b,EAAQ,IAC1BC,EAAG,aAAa,aAAcD,EAAQ,GAAG,EAErCA,EAAQ,EACRC,EAAG,MAAM,MAAQ,OAEjBA,EAAG,MAAM,MAAQ,OAIrBhB,EAAI,QAAQ,MAAQe,EAEhB,OAAOf,EAAI,QAAQ,UAAa,YAChCA,EAAI,QAAQ,SAASgB,EAAID,CAAK,EAI9BC,EAAG,OAAShB,EAAI,QAAQ,QACxBgB,EAAG,MAAQhB,EAAI,QAAQ,MACnB,OAAOgB,EAAG,SAAY,YACtBA,EAAG,QAAQ,CACP,KAAM,QACN,OAAQA,EACR,MAAOA,EAAG,KAC9B,CAAiB,EAGZ,EAEDhB,EAAI,SAAW,UAAW,CACtB,OAAOA,EAAI,QAAQ,KACtB,EAED,IAAI4L,EAAS,SAASvP,EAAG,CACrB,GAAIA,EAAE,MAAO,CAET,IAAIwN,EAAO7I,EAAG,wBAEd,GAAI3E,EAAE,gBAAkBA,EAAE,eAAe,GAAI,CACzC,IAAIoB,EAAIpB,EAAE,eAAe,GAAG,QACpBA,EAAE,eAAe,GAAG,OAC5C,KAAmB,CACH,IAAIoB,EAAIpB,EAAE,QACFA,EAAE,OACb,CAED2D,EAAI,SAAS,KAAK,OAAOvC,EAAIoM,EAAK,MAAQA,EAAK,MAAQ,GAAG,CAAC,CAC9D,CACJ,EAGD,MAAI,eAAgB,SAAS,iBACzB7I,EAAG,iBAAiB,aAAc4K,CAAM,EACxC5K,EAAG,iBAAiB,WAAY4K,CAAM,IAEtC5K,EAAG,iBAAiB,YAAa4K,CAAM,EACvC5K,EAAG,iBAAiB,YAAa4K,CAAM,GAI3C5K,EAAG,OAAShB,EAAI,SAGhBgB,EAAG,IAAM,SAASmB,EAAK,CACnB,GAAIA,IAAQ,OACR,OAAOnC,EAAI,WAEXA,EAAI,SAASmC,CAAG,CAEvB,EAGDnB,EAAG,YAAchB,EAEVA,CACV,CAED,SAAS4c,GAAO5b,EAAIuB,EAAS,CAEzB,GAAIvB,EAAG,OACH,OAAOA,EAAG,OAAO,WAAWuB,EAAS,EAAI,EAI7C,IAAIvC,EAAM,CAAA,EACVA,EAAI,QAAU,GAEdA,EAAI,WAAa,SAASuC,EAAS+G,EAAO,CAEtC,IAAI9G,EAAW,CACX,OAAQ,EACR,MAAO,EACP,QAAS,CAAE,WAAY,MAAO,UAAW,OAAQ,WAAa,EAC9D,SAAU,IACtB,EAGQ,QAASE,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,IAE5B,OAAO1C,EAAI,QAAQ0C,GAAc,KAAe4G,IAAU,MAC1DtJ,EAAI,QAAQ0C,GAAYF,EAASE,IAM7C1B,EAAG,UAAY,GAGf,QAASvE,EAAI,EAAGA,EAAIuD,EAAI,QAAQ,OAAQvD,IAAK,CACzC,IAAIoR,EAAM,SAAS,cAAc,KAAK,EACtCA,EAAI,aAAa,aAAepR,EAAI,CAAG,EACvCoR,EAAI,aAAa,QAAS7N,EAAI,QAAQ,QAAQvD,EAAE,EAChDuE,EAAG,YAAY6M,CAAG,CACrB,CAGD,GAAI7N,EAAI,QAAQ,MACZ,QAASvD,EAAI,EAAGA,EAAIuD,EAAI,QAAQ,OAAQvD,IAChCA,EAAIuD,EAAI,QAAQ,OAChBgB,EAAG,SAASvE,GAAG,UAAU,IAAI,kBAAkB,EAK3D,OAAOuD,CACV,EAGDA,EAAI,SAAW,SAASa,EAAO,CAC3B,QAASpE,EAAI,EAAGA,EAAIuD,EAAI,QAAQ,OAAQvD,IAChCA,EAAIoE,EACJG,EAAG,SAASvE,GAAG,UAAU,IAAI,kBAAkB,GAE/CuE,EAAG,SAASvE,GAAG,UAAU,OAAO,cAAc,EAC9CuE,EAAG,SAASvE,GAAG,UAAU,OAAO,kBAAkB,GAI1DuD,EAAI,QAAQ,MAAQa,EAEhB,OAAOb,EAAI,QAAQ,UAAa,YAChCA,EAAI,QAAQ,SAASgB,EAAIH,CAAK,EAI9BG,EAAG,OAAShB,EAAI,QAAQ,QACxBgB,EAAG,MAAQhB,EAAI,QAAQ,MACnB,OAAOgB,EAAG,SAAY,YACtBA,EAAG,QAAQ,CACP,KAAM,QACN,OAAQA,EACR,MAAOA,EAAG,KAC9B,CAAiB,EAGZ,EAEDhB,EAAI,SAAW,UAAW,CACtB,OAAOA,EAAI,QAAQ,KACtB,EAED,IAAIiM,EAAO,UAAW,CAElBjM,EAAI,WAAWuC,CAAO,EAGtBvB,EAAG,UAAU,IAAI,SAAS,EAG1BA,EAAG,iBAAiB,QAAS,SAAS3E,EAAG,CACrC,IAAIwE,EAAQxE,EAAE,OAAO,aAAa,YAAY,EAC1CwE,GAAS,OACLA,GAASb,EAAI,QAAQ,MACrBA,EAAI,SAAS,CAAC,EAEdA,EAAI,SAASa,CAAK,EAGtC,CAAS,EAEDG,EAAG,iBAAiB,YAAa,SAAS3E,EAAG,CAEzC,QADIwE,EAAQxE,EAAE,OAAO,aAAa,YAAY,EACrCI,EAAI,EAAGA,EAAIuD,EAAI,QAAQ,OAAQvD,IAChCA,EAAIoE,EACJG,EAAG,SAASvE,GAAG,UAAU,IAAI,cAAc,EAE3CuE,EAAG,SAASvE,GAAG,UAAU,OAAO,cAAc,CAGlE,CAAS,EAEDuE,EAAG,iBAAiB,WAAY,SAAS3E,EAAG,CACxC,QAASI,EAAI,EAAGA,EAAIuD,EAAI,QAAQ,OAAQvD,IACpCuE,EAAG,SAASvE,GAAG,UAAU,OAAO,cAAc,CAE9D,CAAS,EAGDuE,EAAG,OAAShB,EAAI,SAGhBgB,EAAG,IAAM,SAASmB,EAAK,CACnB,GAAIA,IAAQ,OACR,OAAOnC,EAAI,WAEXA,EAAI,SAASmC,CAAG,CAEvB,EAGDnB,EAAG,OAAShB,CACf,EAED,OAAAiM,IAEOjM,CACV,CAKD,SAAS6c,GAAO7b,EAAIuB,EAAS,CACzB,GAAIvB,EAAG,OACH,OAAOA,EAAG,OAGd,IAAIH,EAAS,KAEToU,EAAS,SAAS5Y,EAAG,CACrB,GAAIA,EAAE,OAAO,UAAU,SAAS,cAAc,EAC1C,IAAIwF,EAAUxF,EAAE,WAEhB,KAAIwF,EAAUxF,EAAE,OAAO,WAG3B2D,EAAI,YAAY6B,CAAO,EACvBxF,EAAE,eAAc,CACnB,EAEGygB,EAAa,SAAS9Z,EAAM,CAC5B,GAAI,OAAOhD,EAAI,QAAQ,UAAa,WAAY,CAC5C,IAAImH,EAAMnH,EAAI,QAAQ,SAASA,EAAKgD,CAAI,EACpCmE,IACAnE,EAAOmE,EAEd,CAKD,GAFA0H,EAAU,UAAY,GAElB,CAAE7L,EAAK,OAEPhC,EAAG,MAAM,QAAU,OAChB,CAEHA,EAAG,MAAM,QAAU,QAInB,QADI9D,EAAM8F,EAAK,OAAS,GAAKA,EAAK,OAAS,GAClCvG,EAAI,EAAGA,EAAIS,EAAKT,IAAK,CAC1B,GAAI,OAAOuG,EAAKvG,IAAO,SACnB,IAAIqQ,EAAO9J,EAAKvG,GACZsE,EAAQiC,EAAKvG,OACd,CAEH,IAAIqQ,EAAO9J,EAAKvG,GAAG,KACf,CAAEqQ,GAAQ9J,EAAKvG,GAAG,OAClBqQ,EAAO9J,EAAKvG,GAAG,MAEnB,IAAIsE,EAAQiC,EAAKvG,GAAG,MAChB,CAAEsE,GAASiC,EAAKvG,GAAG,KACnBsE,EAAQiC,EAAKvG,GAAG,GAEvB,CAED,IAAIoR,EAAM,SAAS,cAAc,KAAK,EACtCA,EAAI,aAAa,aAAc9M,CAAK,EACpC8M,EAAI,aAAa,YAAaf,CAAI,EAClCe,EAAI,UAAY,eAEZ7K,EAAKvG,GAAG,IACRoR,EAAI,aAAa,KAAM7K,EAAKvG,GAAG,EAAE,EAGjCuD,EAAI,QAAQ,aAAevD,GAAK,GAChCoR,EAAI,UAAU,IAAI,UAAU,EAEhC,IAAI8I,GAAM,SAAS,cAAc,KAAK,EAClC3T,EAAKvG,GAAG,MACRka,GAAI,IAAM3T,EAAKvG,GAAG,MAElBka,GAAI,MAAM,QAAU,OAExB9I,EAAI,YAAY8I,EAAG,EAEnB,IAAIjI,GAAO,SAAS,cAAc,KAAK,EACvCA,GAAK,UAAY5B,EACjBe,EAAI,YAAYa,EAAI,EAGpBG,EAAU,YAAYhB,CAAG,CAC5B,CACJ,CACJ,EAEGkP,EAAU,SAASrhB,EAAK,CACxB,GAAIA,GAAOsE,EAAI,MAUX,GARAA,EAAI,MAAQtE,EAERsE,EAAI,QAAQ,YACZa,EAAQ,EAERA,EAAQ,KAGR,MAAM,QAAQb,EAAI,QAAQ,IAAI,EAAG,CACjC,IAAIoH,EAAO,SAAS/E,EAAG,CACnB,GAAI,OAAOA,GAAM,UACb,IAAK,GAAGA,GAAG,YAAa,EAAC,OAAO3G,EAAI,aAAa,GAAK,EAClD,MAAO,OAGX,SAASqE,KAAOsC,EAAG,CACf,IAAItB,EAAQsB,EAAEtC,GACd,IAAK,GAAGgB,GAAO,YAAa,EAAC,OAAOrF,EAAI,aAAa,GAAK,EACtD,MAAO,EAEd,CAEL,MAAO,EACV,EAEG2Y,EAAUrU,EAAI,QAAQ,KAAK,OAAO,SAAS0O,EAAM,CACjD,OAAOtH,EAAKsH,CAAI,CACpC,CAAiB,EAGDoO,EAAWzI,CAAO,CAClC,MAEgBjQ,GAAK,CACD,IAAKpE,EAAI,QAAQ,KAAOtE,EACxB,OAAQ,MACR,SAAU,OACV,QAAS,SAASsH,EAAM,CAEpB8Z,EAAW9Z,CAAI,CAClB,CACrB,CAAiB,CAGZ,EAGGga,EAAQ,KAGRhd,EAAM,SAAStE,EAAK,CAChBshB,GACA,aAAaA,CAAK,EAEtBA,EAAQ,WAAW,UAAW,CAC1BD,EAAQrhB,CAAG,CACd,EAAE,GAAG,CACT,EACE6G,EAAQ,cAAgB,OACvBA,EAAQ,YAAc,IAE1BvC,EAAI,QAAU,CACV,KAAMuC,EAAQ,MAAQ,KACtB,MAAOA,EAAQ,OAAS,KACxB,aAAcA,EAAQ,cAAgB,KACtC,SAAUA,EAAQ,UAAY,KAC9B,YAAaA,EAAQ,YACrB,SAAUA,EAAQ,UAAY,KAC9B,eAAgBA,EAAQ,gBAAkB,IAClD,EAEIvC,EAAI,YAAc,SAAS0O,EAAM,CAC7B,IAAI3L,EAAK2L,EAAK,aAAa,IAAI,EAC3B5B,EAAO4B,EAAK,aAAa,WAAW,EACpC3N,EAAQ2N,EAAK,aAAa,YAAY,EACtCiF,EAAQjF,EAAK,SAAS,GAAG,KAAO,GAEhC,OAAO1O,EAAI,QAAQ,UAAa,YAChCA,EAAI,QAAQ,SAASA,EAAK8M,EAAM/L,EAAOgC,EAAI4Q,CAAK,EAGpD3T,EAAI,MAAK,CACZ,EAEDA,EAAI,KAAO,UAAW,CAClBgB,EAAG,MAAM,QAAU,OACtB,EAEDhB,EAAI,MAAQ,UAAW,CACfgd,GACA,aAAaA,CAAK,EAGtBhd,EAAI,MAAQ,GAEZ6O,EAAU,UAAY,GAEtB7N,EAAG,MAAM,QAAU,EACtB,EAEDhB,EAAI,SAAW,UAAW,CACtB,MAAO,EAAAgB,EAAG,MAAM,OACnB,EAEDhB,EAAI,QAAU,SAAS3D,EAAG,CAClB2D,EAAI,aACA3D,EAAE,KAAO,QAELwE,IAAQ,MAAQgO,EAAU,SAAShO,IACnCb,EAAI,YAAY6O,EAAU,SAAShO,EAAM,EACzCxE,EAAE,eAAc,GAEhB2D,EAAI,MAAK,EAEN3D,EAAE,MAAQ,WAEbwE,IAAQ,MAAQgO,EAAU,SAAS,KACnCA,EAAU,SAAShO,GAAO,UAAU,OAAO,UAAU,EAClD,CAACb,EAAI,QAAQ,aAAea,IAAU,EACrCA,EAAQ,MAERA,EAAQ,KAAK,IAAI,EAAGA,EAAM,CAAC,EAC3BgO,EAAU,SAAShO,GAAO,UAAU,IAAI,UAAU,IAG1DxE,EAAE,eAAc,GACTA,EAAE,MAAQ,cAEdwE,GAAS,KACRA,EAAQ,GAERgO,EAAU,SAAShO,GAAO,UAAU,OAAO,UAAU,EAErDA,EAAQ,GAAKgO,EAAU,SAAShO,EAAM,IACtCA,IAEJgO,EAAU,SAAShO,GAAO,UAAU,IAAI,UAAU,EAClDxE,EAAE,eAAc,GAG3B,EAED2D,EAAI,MAAQ,SAAS3D,EAAG,CACpB,GAAI,CAAE2D,EAAI,QAAQ,cAAgBA,EAAI,QAAQ,MAC1C,GAAIA,EAAI,QAAQ,MAAM,UAAY,MAC9B,IAAIid,EAAQjd,EAAI,QAAQ,MAAM,cAE9B,KAAIid,EAAQjd,EAAI,QAAQ,MAAM,UAE/B,CAEH,IAAImB,EAAOc,EAAQ,UACnB,GAAId,EACA,IAAI8b,EAAQ9b,EAAK,SAExB,CAED,GAAI,OAAOnB,EAAI,QAAQ,gBAAmB,WAAY,CAClD,IAAImH,EAAMnH,EAAI,QAAQ,eAAeA,EAAKid,CAAK,EAC/C,GAAI9V,EACA8V,EAAQ9V,UAEJA,IAAQ,GAER,MAGX,CAEDnH,EAAIid,CAAK,CACZ,EAEDjd,EAAI,KAAO,SAAS3D,EAAG,CACnB2D,EAAI,MAAK,CACZ,EAGGA,EAAI,QAAQ,QACZA,EAAI,QAAQ,MAAM,iBAAiB,QAASA,EAAI,KAAK,EACrDA,EAAI,QAAQ,MAAM,iBAAiB,UAAWA,EAAI,OAAO,EACzDA,EAAI,QAAQ,MAAM,iBAAiB,OAAQA,EAAI,IAAI,GAIvD,IAAI6O,EAAY,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAU,UAAU,IAAI,mBAAmB,EAC3CA,EAAU,YAAcoG,EACxBjU,EAAG,YAAY6N,CAAS,EAExB7N,EAAG,UAAU,IAAI,SAAS,EAC1BA,EAAG,OAAShB,EAELA,CACV,CAED,SAASkd,GAAOlc,EAAIuB,EAAS,CACzB,IAAIvC,EAAM,CAAA,EAcV,GAbAA,EAAI,QAAU,GACdA,EAAI,aAAe,KAEfuC,IACAvC,EAAI,QAAUuC,GAIlBvB,EAAG,aAAa,WAAY,KAAK,EAGjChB,EAAI,QAAQ,MAAQ,GAEhB,CAAEgB,EAAG,UAAU,SAAS,SAAS,EAAG,CAUpC,GATAA,EAAG,UAAU,IAAI,SAAS,EAC1BA,EAAG,UAAU,IAAI,cAAc,EAE3BhB,EAAI,QAAQ,SACZgB,EAAG,MAAM,UAAY,SAAShB,EAAI,QAAQ,MAAM,EAAI,MAEpDA,EAAI,QAAQ,QACZgB,EAAG,MAAM,MAAQ,SAAShB,EAAI,QAAQ,KAAK,EAAI,MAE/CA,EAAI,QAAQ,KAAM,CAClBgB,EAAG,UAAU,IAAI,cAAc,EAC/B,IAAIuT,EAASvT,EAAG,SAAS,OACrBuT,EAAS,GACTvT,EAAG,aAAa,aAAcuT,EAAS,CAAC,EAE5CvT,EAAG,aAAa,cAAgBuT,EAAS,EAAI,EAAIA,EACpD,CAGD,IAAIV,EAAU,SAAS,cAAc,KAAK,EAI1C,GAHAA,EAAQ,UAAU,IAAI,iBAAiB,EAGnC7S,EAAG,SAAS,OAAS,EAErB,QAASvE,EAAI,EAAGA,EAAIuE,EAAG,SAAS,OAAQvE,IAAK,CACzCuD,EAAI,QAAQ,MAAM,KAAKgB,EAAG,SAASvE,EAAE,EAGrC,IAAIiS,EAAO,SAAS,cAAc,KAAK,EACvCA,EAAK,QAAU,UAAW,CACtB,IAAI7N,EAAQ,MAAM,UAAU,MAAM,KAAKgT,EAAQ,QAAQ,EAAE,QAAQ,IAAI,EACrE7T,EAAI,KAAKA,EAAI,aAAeA,EAAI,QAAQ,MAAMa,EAAM,CACvD,EACDgT,EAAQ,YAAYnF,CAAI,CAC3B,CAGL,IAAIyO,EAAU,SAAS,cAAc,KAAK,EAC1CA,EAAQ,UAAY,kBAGpB,IAAI9O,EAAW,SAAS,cAAc,KAAK,EACvCuK,EAAQ,SAAS,cAAc,KAAK,EACxCA,EAAM,UAAY,gBAClBA,EAAM,UAAY,GAElBA,EAAM,QAAU,UAAW,CACvB5Y,EAAI,MAAK,CACZ,EACDqO,EAAS,YAAY8O,CAAO,EAC5B9O,EAAS,YAAYuK,CAAK,CAC7B,CAED5Y,EAAI,cAAgB,SAASa,EAAO,CAChC,QAASpE,EAAI,EAAGA,EAAIoX,EAAQ,SAAS,OAAQpX,IACzC,GAAIoX,EAAQ,SAASpX,GAAG,UAAU,SAAS,uBAAuB,EAAG,CACjEoX,EAAQ,SAASpX,GAAG,UAAU,OAAO,uBAAuB,EAC5D,KACH,CAELoX,EAAQ,SAAShT,GAAO,UAAU,IAAI,uBAAuB,CAChE,EAEDb,EAAI,KAAO,SAAS2C,EAAQ,CACxB,GAAI,CAAEA,EACF,IAAIA,EAAS3B,EAAG,SAAS,GAI7BA,EAAG,UAAU,IAAI,eAAe,EAChCA,EAAG,UAAU,OAAO,cAAc,EAClCA,EAAG,YAAYqN,CAAQ,EACvBrN,EAAG,YAAY6S,CAAO,EAGtB,IAAIhT,EAAQb,EAAI,QAAQ,MAAM,QAAQ2C,CAAM,EAC5C3C,EAAI,cAAca,CAAK,EAGvB,QAASpE,EAAI,EAAGA,EAAIuE,EAAG,SAAS,OAAQvE,IACpCuE,EAAG,SAASvE,GAAG,MAAM,QAAU,GAEnCkG,EAAO,MAAM,QAAU,QAGnBA,EAAO,uBACP3B,EAAG,UAAU,IAAI,cAAc,EAE/BA,EAAG,UAAU,OAAO,cAAc,EAIlC2B,EAAO,oBAAsBA,EAAO,mBAAmB,SAAW,MAClE3B,EAAG,UAAU,IAAI,eAAe,EAEhCA,EAAG,UAAU,OAAO,eAAe,EAGvChB,EAAI,aAAe2C,EAGf3C,EAAI,aAAa,aAAeA,EAAI,aAAa,aACjDA,EAAI,aAAa,UAAU,IAAI,kBAAkB,EAGrDqO,EAAS,SAAS,GAAG,UAAYrO,EAAI,aAAa,aAAa,OAAO,CACzE,EAEDA,EAAI,KAAO,UAAW,CAClBA,EAAI,KAAI,EAGJ,OAAOA,EAAI,QAAQ,QAAW,YAC9BA,EAAI,QAAQ,OAAOgB,CAAE,CAE5B,EAEDhB,EAAI,MAAQ,UAAW,CAEnBgB,EAAG,UAAU,OAAO,eAAe,EACnCA,EAAG,UAAU,OAAO,cAAc,EAClCA,EAAG,UAAU,OAAO,eAAe,EAE/BhB,EAAI,QAAQ,MACZgB,EAAG,UAAU,IAAI,cAAc,EAGnC,QAASvE,EAAI,EAAGA,EAAIuE,EAAG,SAAS,OAAQvE,IACpCuE,EAAG,SAASvE,GAAG,MAAM,QAAU,GAGnCoX,EAAQ,OAAM,EACdxF,EAAS,OAAM,EAEfrO,EAAI,aAAe,KAEf,OAAOA,EAAI,QAAQ,SAAY,YAC/BA,EAAI,QAAQ,QAAQgB,CAAE,CAE7B,EAEDhB,EAAI,MAAQ,UAAW,CACnBgB,EAAG,UAAY,EAClB,EAEDhB,EAAI,KAAO,UAAW,CAClB,IAAIod,EAAYpd,EAAI,aAAa,mBAC7Bod,GAAaA,EAAU,UAAY,OACnCpd,EAAI,KAAKA,EAAI,aAAa,kBAAkB,CAEnD,EAEDA,EAAI,KAAO,UAAW,CACdA,EAAI,aAAa,wBACjBA,EAAI,KAAKA,EAAI,aAAa,sBAAsB,CAEvD,EAED,IAAIwb,EAAU,SAASnf,EAAG,CAEtB,GAAIA,EAAE,OAAO,SAAW,MACpB2D,EAAI,KAAK3D,EAAE,MAAM,UACV,CAAEA,EAAE,OAAO,UAAU,SAAS,eAAe,GAAK,EAAGA,EAAE,OAAO,WAAW,UAAU,SAAS,iBAAiB,GAAKA,EAAE,OAAO,UAAU,SAAS,iBAAiB,GAAG,CAEzK,IAAIghB,EAAUhhB,EAAE,SAAWA,EAAE,eAAe,GAAG,QAC3CA,EAAE,OAAO,YAAcghB,EAAU,GAEjCrd,EAAI,KAAI,EACDqd,EAAU,IAEjBrd,EAAI,KAAI,CAEf,CACJ,EAED,MAAI,eAAgB,SAAS,gBACzBgB,EAAG,iBAAiB,WAAYwa,CAAO,EAEvCxa,EAAG,iBAAiB,UAAWwa,CAAO,EAI1Cxa,EAAG,iBAAiB,YAAa,SAAS3E,EAAG,CACzC2D,EAAI,KAAI,EACR3D,EAAE,eAAc,EAChBA,EAAE,gBAAe,CACzB,CAAK,EAED2E,EAAG,iBAAiB,aAAc,SAAS3E,EAAG,CAC1C2D,EAAI,KAAI,EACR3D,EAAE,eAAc,EAChBA,EAAE,gBAAe,CACzB,CAAK,EAED2E,EAAG,iBAAiB,UAAW,SAAS3E,EAAG,CACnCA,EAAE,OAAS,IACX2D,EAAI,MAAK,CAErB,CAAK,EAEDgB,EAAG,OAAShB,EAELA,CACV,CAMD,SAASsd,GAAKtc,EAAIuB,EAAS,CAEvB,GAAIvB,EAAG,KACH,OAAOA,EAAG,KAAK,WAAWuB,EAAS,EAAI,EAG3C,IAAIvC,EAAM,CAAE,KAAK,QACjBA,EAAI,QAAU,GAGd,IAAIud,EAAQ,UAAW,CACnB,MAAO,GAAAvd,EAAI,QAAQ,OAASgB,EAAG,SAAS,QAAUhB,EAAI,QAAQ,MACjE,EAGGwd,EAAS,KACTC,EAAkB,KAEtBzd,EAAI,WAAa,SAASuC,EAAS+G,EAAO,CActC,IAAI9G,EAAW,CACX,MAAO,GACP,MAAO,KACP,OAAQ,KACR,YAAa,KACb,WAAY,KACZ,cAAe,KACf,eAAgB,KAChB,aAAc,KACd,QAAS,KACT,SAAU,KACV,QAAS,KACT,OAAQ,KACR,OAAQ,IACX,EAGD,QAASE,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,IAE5B,OAAO1C,EAAI,QAAQ0C,GAAc,KAAe4G,IAAU,MAC1DtJ,EAAI,QAAQ0C,GAAYF,EAASE,IAM7C,OAAI1C,EAAI,QAAQ,YACZgB,EAAG,aAAa,mBAAoBhB,EAAI,QAAQ,WAAW,EAE3DgB,EAAG,gBAAgB,kBAAkB,EAEzCA,EAAG,YAAchB,EAAI,QAAQ,YAG7BA,EAAI,SAASA,EAAI,QAAQ,KAAK,EAG9ByY,IAGIzY,EAAI,QAAQ,OACNyd,IACFA,EAAkB,SAAS,cAAc,KAAK,EAC9Czc,EAAG,WAAW,aAAayc,EAAiBzc,EAAG,WAAW,EAG1Dwc,EAASX,GAAOY,EAAiB,CAC7B,KAAMzd,EAAI,QAAQ,OAClB,SAAU,SAAS/D,EAAEC,EAAEC,EAAG,CACtB6D,EAAI,YAAY9D,EAAEC,CAAC,CACtB,CACrB,CAAiB,GAGDshB,IACAD,EAAS,KACTC,EAAgB,OAAM,EACtBA,EAAkB,MAInBzd,CACV,EAMDA,EAAI,IAAM,SAASe,EAAO2c,EAAO,CAC7B,GAAI,OAAO1d,EAAI,QAAQ,gBAAmB,WAAY,CAClD,IAAImH,EAAMnH,EAAI,QAAQ,eAAegB,EAAIhB,EAAKA,EAAI,QAAQ,MAAOe,CAAK,EACtE,GAAIoG,IAAQ,GACR,MAAO,GAEHA,GAAO,OACPpG,EAAQoG,EAGnB,CAOD,GAJIqW,GACAA,EAAO,MAAK,EAGZD,EAAK,EACD,OAAOvd,EAAI,QAAQ,SAAY,WAC/BA,EAAI,QAAQ,QAAQA,EAAKA,EAAI,QAAQ,KAAK,EAE1C,MAAMQ,EAAW,UAAU,uCAAuC,EAAI,IAAMR,EAAI,QAAQ,KAAK,MAE9F,CAEH,IAAImB,EAAOc,EAAQ,UAEnB,GAAId,GAAQA,EAAK,YAAcA,EAAK,WAAW,UAAU,SAAS,OAAO,GACrEA,EAAK,aAAgB,EAAGA,EAAK,YAAY,WAAaA,EAAK,YAAY,UAAU,KAAI,GACrF0M,EAAM1M,EAAK,gBACR,CASH,GAPIH,EAAG,YACGA,EAAG,UAAU,UAAU,KAAI,GAC7BA,EAAG,YAAYA,EAAG,SAAS,GAK/B,CAAED,GAAS,OAAOA,GAAU,SAC5B,IAAI8M,EAAM8P,EAAc5c,EAAOA,EAAOI,CAAI,MAE1C,SAAS1E,EAAI,EAAGA,GAAKsE,EAAM,OAAQtE,IAC/B,GAAI,CAAE8gB,EAAK,EAAI,CACX,GAAI,CAAExc,EAAMtE,IAAM,OAAOsE,EAAMtE,IAAO,SAClC,IAAI8D,EAAIQ,EAAMtE,IAAM,GAChBmE,EAAI,SAER,KAAIL,EAAIQ,EAAMtE,GAAG,KACbmE,EAAIG,EAAMtE,GAAG,MAIrB,IAAIoR,EAAM8P,EAAcpd,EAAGK,CAAC,CAC/B,CAKTsT,GACH,CAGGwJ,GACAE,EAAS/P,CAAG,CAEnB,CACJ,EAED7N,EAAI,SAAW,SAASud,EAAO,CAG3B,IAFAvd,EAAI,QAAQ,MAAQud,EACZvc,EAAG,SAAS,OAASuc,EACtBvc,EAAG,SAAS,OAASuc,GACxBvc,EAAG,YAAYA,EAAG,SAAS,CAElC,EAGDhB,EAAI,OAAS,SAASmB,EAAM,CAExBA,EAAK,WAAW,YAAYA,CAAI,EAE1BH,EAAG,SAAS,OAGdkT,IAFAlU,EAAI,IAAI,GAAI,EAAI,EAKhB,OAAOA,EAAI,QAAQ,cAAiB,YACpCA,EAAI,QAAQ,aAAagB,EAAIhB,EAAKmB,CAAI,CAE7C,EAMDnB,EAAI,QAAU,UAAW,CAErB,QADIgD,EAAO,CAAA,EACFvG,EAAI,EAAGA,EAAIuE,EAAG,SAAS,OAAQvE,IAAK,CAEzC,IAAIqQ,EAAO9L,EAAG,SAASvE,GAAG,UAAU,QAAQ;AAAA,EAAM,EAAE,EAEhDsE,EAAQC,EAAG,SAASvE,GAAG,aAAa,YAAY,EAC9CsE,IACFA,EAAQ+L,IAGRA,GAAQ/L,IACRiC,EAAK,KAAK,CAAE,KAAM8J,EAAM,MAAO/L,CAAK,CAAE,CAE7C,CACD,OAAOiC,CACV,EAODhD,EAAI,SAAW,SAASa,EAAO,CAC3B,IAAIE,EAAQ,KAEZ,GAAIF,GAAS,KAETE,EAAQC,EAAG,SAASH,GAAO,aAAa,YAAY,EAC9CE,IACFA,EAAQC,EAAG,SAASH,GAAO,UAAU,QAAQ;AAAA,EAAM,EAAE,OAEtD,CAGH,QADImC,EAAO,CAAA,EACFvG,EAAI,EAAGA,EAAIuE,EAAG,SAAS,OAAQvE,IACpCsE,EAAQC,EAAG,SAASvE,GAAG,UAAU,QAAQ;AAAA,EAAM,EAAE,EAC7CsE,GACAiC,EAAK,KAAKhD,EAAI,SAASvD,CAAC,CAAC,EAGjCsE,EAAQiC,EAAK,KAAK,GAAG,CACxB,CAED,OAAOjC,CACV,EAMDf,EAAI,SAAW,SAAS0L,EAAO,CAC3B,GAAI,CAAEA,EACF1L,EAAI,MAAK,UAELgB,EAAG,OAAS0K,EACZ,GAAI,MAAM,QAAQA,CAAK,EACnB1L,EAAI,IAAI0L,CAAK,MACV,CAEH,IAAIoB,GAAQ,GAAGpB,GAAO,KAAI,EAEtB1I,EAAO6a,EAAY/Q,CAAI,EAE3B9L,EAAG,UAAY,GAEfhB,EAAI,IAAIgD,CAAI,CACf,CAGZ,EAKDhD,EAAI,MAAQ,UAAW,CAEnBgB,EAAG,UAAU,IAAI,aAAa,EAE9BA,EAAG,UAAY,cAEfkT,GACH,EAMDlU,EAAI,QAAU,UAAW,CAErB,QADIoH,EAAO,EACF3K,EAAI,EAAGA,EAAIuE,EAAG,SAAS,OAAQvE,IAChCuE,EAAG,SAASvE,GAAG,UAAU,SAAS,aAAa,GAC/C2K,IAGR,OAAOA,GAAQ,CAClB,EAMDpH,EAAI,YAAc,SAAS8M,EAAM/L,EAAO,CACpC,IAAII,EAAOc,EAAQ,UACfd,IAEAA,EAAK,UAAY2L,EAEb/L,GACAI,EAAK,aAAa,aAAcJ,CAAK,EAGzCI,EAAK,UAAU,OAAO,aAAa,EAC7Boc,EAAK,GAEPvd,EAAI,IAAI,GAAI,EAAI,EAG3B,EAMDA,EAAI,OAAS,SAASmB,EAAM,CAEZA,EAAK,SACpB,EAGDnB,EAAI,QAAU,UAAW,CAErBgB,EAAG,oBAAoB,UAAW8c,EAAW,EAC7C9c,EAAG,oBAAoB,UAAW+c,CAAW,EAC7C/c,EAAG,oBAAoB,QAASgd,CAAS,EACzChd,EAAG,oBAAoB,QAASid,CAAS,EACzCjd,EAAG,oBAAoB,QAASkd,EAAS,EACzCld,EAAG,oBAAoB,OAAQmd,EAAQ,EAGvCnd,EAAG,WAAW,YAAYA,CAAE,CAC/B,EAED,IAAI4c,EAAW,SAASzc,EAAM,CAC1B,GAAIH,EAAG,SAAS,OAAQ,CACpB,IAAIC,EAAQ,SAAS,cACjBC,EAAM,OAAO,eACjB,GAAI,CAAEC,EACF,IAAIA,EAAOH,EAAG,WAAWA,EAAG,WAAW,OAAO,GAElDC,EAAM,SAASE,EAAMA,EAAK,MAAM,EAChCF,EAAM,SAAS,EAAI,EACnBC,EAAI,gBAAiB,EACrBA,EAAI,SAASD,CAAK,EAClBD,EAAG,WAAaA,EAAG,WACtB,CACJ,EAEG2c,EAAgB,SAASrV,EAAOvH,EAAOI,EAAM,CAC7C,IAAI0M,EAAM,SAAS,cAAc,KAAK,EACtC,OAAAA,EAAI,YAAcvF,GAAgB,GAC9BvH,GACA8M,EAAI,aAAa,aAAc9M,CAAK,EAGpCI,GAAQA,EAAK,WAAW,UAAU,SAAS,OAAO,EAClDH,EAAG,aAAa6M,EAAK1M,EAAK,WAAW,EAErCH,EAAG,YAAY6M,CAAG,EAGfA,CACV,EAEGqG,EAAS,UAAW,CAEpB,IAAInT,EAAQf,EAAI,WAEZe,GAASf,EAAI,QAAQ,QACrBA,EAAI,QAAQ,MAAQe,EAChB,OAAOf,EAAI,QAAQ,UAAa,YAChCA,EAAI,QAAQ,SAASgB,EAAIhB,EAAKA,EAAI,QAAQ,KAAK,EAI/CgB,EAAG,OAAShB,EAAI,QAAQ,QACxBgB,EAAG,MAAQhB,EAAI,QAAQ,MACnB,OAAOgB,EAAG,SAAY,YACtBA,EAAG,QAAQ,CACP,KAAM,QACN,OAAQA,EACR,MAAOA,EAAG,KAClC,CAAqB,IAKbyX,GACH,EAKGA,EAAS,UAAW,CACpB,QAAShc,EAAI,EAAGA,EAAIuE,EAAG,SAAS,OAAQvE,IAChCuE,EAAG,SAASvE,GAAG,UAAY,QAEtBuD,EAAI,SAASvD,CAAC,GAGfuE,EAAG,SAASvE,GAAG,UAAU,IAAI,aAAa,EAGtC,OAAQuD,EAAI,QAAQ,YAAe,YAC/BA,EAAI,SAASvD,CAAC,EACTuD,EAAI,QAAQ,WAAWgB,EAAG,SAASvE,GAAIuE,EAAG,SAASvE,GAAG,UAAWuE,EAAG,SAASvE,GAAG,aAAa,YAAY,CAAC,EAG3GuE,EAAG,SAASvE,GAAG,UAAU,OAAO,aAAa,EAF7CuE,EAAG,SAASvE,GAAG,UAAU,IAAI,aAAa,EAQlDuE,EAAG,SAASvE,GAAG,UAAU,OAAO,aAAa,GAhBjDuE,EAAG,SAASvE,GAAG,UAAU,OAAO,aAAa,GAsBzD2hB,GACH,EAEGA,EAAU,UAAW,CAEfpd,EAAG,UAAU,OAMfA,EAAG,UAAU,OAAO,aAAa,GAL7B,CAAEA,EAAG,SAAS,QAAUA,EAAG,SAAS,GAAG,UAAY,QACnDA,EAAG,UAAY,GACf4c,EAASD,EAAa,CAAE,EAKnC,EAOGE,EAAc,SAAS/Q,EAAM,CAE7B,IAAI9J,EAAO,CAAA,EAGPqb,EAAO,GAKX,GAFAvR,EAAOA,EAAK,OAERA,EAAM,CACN,QAASrQ,EAAI,EAAGA,EAAIqQ,EAAK,OAAQrQ,IACzBqQ,EAAKrQ,IAAM,KAAOqQ,EAAKrQ,IAAM,KAAOqQ,EAAKrQ,IAAM;AAAA,EAC3C4hB,IACArb,EAAK,KAAKqb,EAAK,KAAM,CAAA,EACrBA,EAAO,IAGXA,GAAQvR,EAAKrQ,GAIjB4hB,GACArb,EAAK,KAAKqb,CAAI,CAErB,CAED,OAAOrb,CACV,EAGGsb,EAAe,EAMfP,EAAc,SAAS1hB,EAAG,CAQ1B,GANAiiB,EAAe,OAAO,aAAc,EAAC,aAGrCF,IAGI/hB,EAAE,MAAQ,OAAUA,EAAE,MAAQ,KAAOA,EAAE,MAAQ,IAAK,CACpD,IAAIgC,EAAI,OAAO,aAAY,EAAG,aAC1BA,EAAI,IACAkf,EAAK,EACD,OAAOvd,EAAI,QAAQ,SAAY,YAC/BA,EAAI,QAAQ,QAAQA,EAAKA,EAAI,QAAQ,KAAK,EAG9CA,EAAI,IAAI,GAAI,EAAI,GAGxB3D,EAAE,eAAc,CAC5B,SAAmBA,EAAE,KAAO,SAChB,GAAI,CAAEmhB,GAAU,CAAEA,EAAO,SAAQ,EAAI,CACjC,IAAInf,EAAI,OAAO,aAAY,EAAG,aAC1BA,EAAI,IACEkf,EAAK,GACPvd,EAAI,IAAI,GAAI,EAAI,GAGxB3D,EAAE,eAAc,CACnB,OACMA,EAAE,KAAO,aAEZ2E,EAAG,SAAS,QAAU,GAAK,OAAO,aAAY,EAAG,aAAe,GAChE3E,EAAE,eAAc,EAKpBmhB,GACAA,EAAO,QAAQnhB,CAAC,EAIpB+hB,GACH,EAMGJ,EAAY,SAAS3hB,EAAG,CACxB,GAAIA,EAAE,OAAS,GAAI,CAEf,IAAIgC,EAAI,OAAO,aAAY,EAAG,aAC1BA,EAAI,GAAKA,GAAKigB,GACdte,EAAI,IAAI,GAAI,EAAI,CAEhC,MAAmB3D,EAAE,OAAS,IAAMA,EAAE,OAAS,IAAMA,EAAE,OAAS,GACpDA,EAAE,eAAc,EAEZmhB,GACAA,EAAO,MAAMnhB,CAAC,EAItBoc,GACH,EAMGwF,EAAa,SAAS5hB,EAAG,CACzB,GAAIA,EAAE,eAAiBA,EAAE,cAAc,cACnC,IAAIyQ,GAAQzQ,EAAE,eAAiBA,GAAG,cAAc,QAAQ,YAAY,UAC7D,OAAO,cACd,IAAIyQ,EAAO,OAAO,cAAc,QAAQ,MAAM,EAGlD,IAAI9J,EAAO6a,EAAY/Q,CAAI,EAE3B,GAAI,OAAO9M,EAAI,QAAQ,eAAkB,WAAY,CACjD,IAAImH,EAAMnH,EAAI,QAAQ,cAAcgB,EAAIhB,EAAKgD,CAAI,EACjD,GAAImE,IAAQ,GACR,OAAA9K,EAAE,eAAc,EACT,GAEH8K,IACAnE,EAAOmE,EAGlB,CAEGnE,EAAK,OAAS,GACdhD,EAAI,IAAIgD,EAAM,EAAI,EAClB3G,EAAE,eAAc,GACT2G,EAAK,KACZ,SAAS,YAAY,aAAc,GAAOA,EAAK,EAAE,EACjD3G,EAAE,eAAc,EAEvB,EAMGyhB,GAAc,SAASzhB,EAAG,CAC1B,GAAIA,EAAE,OAAO,YAAcA,EAAE,OAAO,WAAW,UAAU,SAAS,OAAO,IACjEA,EAAE,OAAO,UAAU,SAAS,aAAa,GAAKA,EAAE,OAAO,UAAU,SAAS,aAAa,GAAG,CAC1F,IAAIwN,EAAOxN,EAAE,OAAO,sBAAqB,EACrCwN,EAAK,OAASxN,EAAE,QAAUwN,EAAK,MAAQ,IACvC7J,EAAI,OAAO3D,EAAE,MAAM,CAE1B,CAIDA,EAAE,QAAU2E,GACZ4c,GAEP,EAEGM,GAAY,UAAW,CACjBld,EAAG,UAAU,SAAS,aAAa,KACjC,CAAEA,EAAG,SAAS,QAAUhB,EAAI,SAASgB,EAAG,SAAS,OAAS,CAAC,KACrDuc,EAAK,GACPI,EAAc,EAAE,GAIpB,OAAO3d,EAAI,QAAQ,SAAY,YAC/BA,EAAI,QAAQ,QAAQgB,EAAIhB,EAAKA,EAAI,SAAQ,CAAE,EAG/CgB,EAAG,UAAU,IAAI,aAAa,EAErC,EAEGmd,GAAW,UAAW,CACtB,GAAInd,EAAG,UAAU,SAAS,aAAa,EAAG,CAClCwc,GACAA,EAAO,MAAK,EAGhB,QAAS/gB,EAAI,EAAGA,EAAIuE,EAAG,SAAS,OAAS,EAAGvE,IAElCuD,EAAI,SAASvD,CAAC,GAChBuE,EAAG,YAAYA,EAAG,SAASvE,EAAE,EAIrCyX,IAEAlT,EAAG,UAAU,OAAO,aAAa,EAE7B,OAAOhB,EAAI,QAAQ,QAAW,YAC9BA,EAAI,QAAQ,OAAOgB,EAAIhB,EAAKA,EAAI,SAAQ,CAAE,CAEjD,CACJ,EAEGiM,GAAO,UAAW,CAEd,aAAc,SAAS,gBACvBjL,EAAG,iBAAiB,WAAY8c,EAAW,EAE3C9c,EAAG,iBAAiB,UAAW8c,EAAW,EAG9C9c,EAAG,iBAAiB,UAAW+c,CAAW,EAC1C/c,EAAG,iBAAiB,QAASgd,CAAS,EACtChd,EAAG,iBAAiB,QAASid,CAAS,EACtCjd,EAAG,iBAAiB,QAASkd,EAAS,EACtCld,EAAG,iBAAiB,OAAQmd,EAAQ,EAGpCnd,EAAG,aAAa,kBAAmB,EAAI,EAGvCA,EAAG,UAAU,IAAI,OAAO,EAGxBhB,EAAI,WAAWuC,CAAO,EAElB,OAAOvC,EAAI,QAAQ,QAAW,YAC9BA,EAAI,QAAQ,OAAOgB,EAAIhB,CAAG,EAI9BgB,EAAG,OAAShB,EAAI,SAGhBgB,EAAG,IAAM,SAASmB,EAAK,CACnB,GAAIA,IAAQ,OACR,OAAOnC,EAAI,WAEXA,EAAI,SAASmC,CAAG,CAEvB,EAEDnB,EAAG,KAAOhB,CACb,EAED,OAAAiM,KAEOjM,CACV,CAMD,SAASue,GAAOvd,EAAIuB,EAAS,CACzB,IAAIvC,EAAM,CAAA,EACVA,EAAI,QAAU,GAGd,IAAIwC,EAAW,CACX,KAAM,QACN,UAAW,IACX,MAAO,GACP,SAAU,GACV,SAAU,KACV,UAAW,KACX,iBAAkB,KAClB,SAAU,KACV,SAAU,GACV,aAAc,IACtB,EAGI,QAASE,KAAYF,EACbD,GAAWA,EAAQ,eAAeG,CAAQ,EAC1C1C,EAAI,QAAQ0C,GAAYH,EAAQG,GAEhC1C,EAAI,QAAQ0C,GAAYF,EAASE,GAKrC1C,EAAI,QAAQ,UAAY,IACxBgB,EAAG,aAAa,gBAAiB,EAAI,EAIzCA,EAAG,QAAU,GAGbA,EAAG,UAAU,IAAI,SAAS,EAEtBhB,EAAI,QAAQ,OAAS,IACrBgB,EAAG,UAAU,IAAI,OAAO,EAG5BhB,EAAI,IAAM,SAASgD,EAAM,CAQrB,GANIhD,EAAI,QAAQ,UAAY,KACxBgB,EAAG,QAAU,GACbA,EAAG,UAAY,IAIfhB,EAAI,QAAQ,MAAQ,QAAS,CAC7B,IAAI2W,EAAM,SAAS,cAAc,KAAK,EACtCA,EAAI,aAAa,MAAO3T,EAAK,IAAI,EACjC2T,EAAI,aAAa,WAAY,EAAE,EACzB3V,EAAG,aAAa,MAAM,IACxB2V,EAAI,UAAY,QAChBA,EAAI,QAAU3T,GAElBhC,EAAG,YAAY2V,CAAG,CAC9B,KAAe,CACH,GAAI3T,EAAK,KACL,IAAImO,EAAOnO,EAAK,SAEhB,KAAImO,EAAOnO,EAAK,KAEpB,IAAI6K,EAAM,SAAS,cAAc,KAAK,EACtCA,EAAI,UAAYsD,GAAQnR,EAAI,QAAQ,KACpC6N,EAAI,UAAU,IAAI,cAAc,EAChCA,EAAI,aAAa,WAAY,EAAE,EAC/B7M,EAAG,YAAY6M,CAAG,CACrB,CAEG7K,EAAK,UACLA,EAAK,KAAOf,EAAQ,QAIxBjB,EAAG,QAAQ,KAAKgC,CAAI,EAGhB,OAAOhD,EAAI,QAAQ,UAAa,YAChCA,EAAI,QAAQ,SAASgB,EAAIgC,CAAI,CAEpC,EAEDhD,EAAI,YAAc,SAAS0Y,EAAM,CAC7B,IAAI9Q,EAAO8Q,EAAK,KAAK,MAAM,GAAG,EAC9B,GAAI9Q,EAAK,IAAM5H,EAAI,QAAQ,KAAM,CAC7B,IAAIwe,EAAW,IAAI,WACnBA,EAAS,iBAAiB,OAAQ,SAAU5d,EAAG,CAC3C,IAAIoC,EAAO,CACP,KAAMpC,EAAE,WAAW,OACnB,UAAW8X,EAAK,KAAK,OAAOA,EAAK,KAAK,YAAY,GAAG,EAAI,CAAC,EAC1D,KAAMA,EAAK,KACX,KAAMA,EAAK,KACX,aAAcA,EAAK,aACnB,QAAS9X,EAAE,WAAW,MACzB,EAEDZ,EAAI,IAAIgD,CAAI,CAC5B,CAAa,EAEDwb,EAAS,cAAc9F,CAAI,CACvC,MACY,MAAMlY,EAAW,UAAU,+BAA+B,CAAC,CAElE,EAEDR,EAAI,WAAa,SAASmX,EAAK,CAC3B,GAAIA,EAAI,OAAO,EAAE,CAAC,GAAK,QAAU,CAAEnX,EAAI,QAAQ,aAC3C,QAAQ,MAAM,iDAAiD,UAG3DmX,EAAI,OAAO,EAAE,CAAC,GAAK,OAAQ,CAC3B,IAAIE,EAAYF,EAAI,MAAM,GAAG,EAC7BE,EAAYA,EAAU,GAAG,MAAM,GAAG,EAClC,IAAIzP,EAAOyP,EAAU,GAAG,QAAQ,QAAQ,EAAE,EAC1C,GAAIzP,GAAQ5H,EAAI,QAAQ,KAAM,CAC1B,IAAIgD,EAAO,CACP,KAAMmU,EACN,KAAM,GACN,UAAWE,EAAU,GACrB,QAASF,CACZ,EACDnX,EAAI,IAAIgD,CAAI,CAChC,MACoB,MAAMhD,EAAI,QAAQ,KAAK,mBAAmB,CAE9D,KAAmB,CACH,IAAIqX,EAAYF,EAAI,OAAOA,EAAI,YAAY,GAAG,EAAI,CAAC,EAEnDA,EAAMnX,EAAI,QAAQ,aAAemX,EAEjC/S,GAAK,CACD,IAAK+S,EACL,KAAM,MACN,SAAU,OACV,QAAS,SAASnU,EAAM,CAEvB,CACrB,CAAiB,CACJ,CAER,EAgBD,IAAIyb,EAAOze,EAAI,QAAQ,KAAO,IAAMA,EAAI,QAAQ,UAC5CsR,EAAQ,SAAS,cAAc,OAAO,EAC1CA,EAAM,KAAO,OACbA,EAAM,aAAa,SAAUmN,CAAI,EACjCnN,EAAM,SAAW,UAAW,CACxB,QAAS7U,EAAI,EAAGA,EAAI,KAAK,MAAM,OAAQA,IACnCuD,EAAI,YAAY,KAAK,MAAMvD,EAAE,CAEpC,EAGGuD,EAAI,QAAQ,UAAY,IACxBsR,EAAM,aAAa,WAAY,EAAI,EAGvC,IAAI7K,EAAU,KAEd,OAAAzF,EAAG,iBAAiB,QAAS,SAAS3E,EAAG,CACrCoK,EAAU,KACN,CAAEzF,EAAG,SAAS,QAAU3E,EAAE,SAAW2E,EACrCiB,EAAQ,MAAMqP,CAAK,EAEfjV,EAAE,OAAO,YAAc2E,IACvByF,EAAUpK,EAAE,OAG5B,CAAK,EAED2E,EAAG,iBAAiB,WAAY,SAAS3E,EAAG,CACxC4F,EAAQ,MAAMqP,CAAK,CAC3B,CAAK,EAEDtQ,EAAG,iBAAiB,YAAa,SAAS3E,EAAG,CACzC2E,EAAG,MAAM,OAAS,iBAC1B,CAAK,EAEDA,EAAG,iBAAiB,YAAa,SAAS3E,EAAG,CACzC2E,EAAG,MAAM,OAAS,gBAC1B,CAAK,EAEDA,EAAG,iBAAiB,WAAY,SAAS3E,EAAG,CACxC2E,EAAG,MAAM,OAAS,gBAC1B,CAAK,EAEDA,EAAG,iBAAiB,WAAY,SAAS3E,EAAG,CACxCA,EAAE,eAAc,CACxB,CAAK,EAED2E,EAAG,iBAAiB,UAAW,SAAS3E,EAAG,CACvC,GAAIoK,GAAWpK,EAAE,OAAS,GAAI,CAC1B,IAAIwE,EAAQ,MAAM,UAAU,QAAQ,KAAKG,EAAG,SAAUyF,CAAO,EACzD5F,GAAS,IACTG,EAAG,QAAQ,OAAOH,EAAO,CAAC,EAC1B4F,EAAQ,OAAM,EACdA,EAAU,KAEjB,CACT,CAAK,EAEDzF,EAAG,iBAAiB,OAAQ,SAAS3E,EAAG,CACpCA,EAAE,eAAc,EAChBA,EAAE,gBAAe,EAEjB,IAAIqa,GAAQra,EAAE,eAAiBA,GAAG,aAAa,QAAQ,WAAW,EAC9Dqc,GAAQrc,EAAE,eAAiBA,GAAG,aAAa,MAE/C,GAAIqc,EAAK,OACL,QAASjc,EAAI,EAAGA,EAAIJ,EAAE,aAAa,MAAM,OAAQI,IAC7CuD,EAAI,YAAY3D,EAAE,aAAa,MAAMI,EAAE,UAEpCia,EAAM,CACT1W,EAAI,QAAQ,UAAY,KACxBgB,EAAG,UAAY,IAInB,IAAI6M,EAAM,SAAS,cAAc,KAAK,EACtCA,EAAI,UAAY6I,EAGhB,IAAIC,EAAM9I,EAAI,iBAAiB,KAAK,EAEpC,GAAI8I,EAAI,OACJ,QAASla,EAAI,EAAGA,EAAIka,EAAI,OAAQla,IAC5BuD,EAAI,WAAW2W,EAAIla,GAAG,GAAG,CAGpC,CAED,OAAAuE,EAAG,MAAM,OAAS,iBAEX,EACf,CAAK,EAEDA,EAAG,IAAM,SAASmB,EAAK,CACnB,GAAIA,IAAQ,OACR,OAAOnB,EAAG,SAAWA,EAAG,QAAQ,OAASA,EAAG,QAAU,KAMtD,GAHAA,EAAG,UAAY,GACfA,EAAG,QAAU,GAETmB,EACA,GAAI,MAAM,QAAQA,CAAG,EACjB,QAAS1F,EAAI,EAAGA,EAAI0F,EAAI,OAAQ1F,IACxB,OAAO0F,EAAI1F,IAAO,SAClBuD,EAAI,IAAI,CAAE,KAAMmC,EAAI1F,EAAE,CAAE,EAExBuD,EAAI,IAAImC,EAAI1F,EAAE,OAGf,OAAO0F,GAAQ,UACtBnC,EAAI,IAAI,CAAE,KAAMmC,CAAK,CAAA,CAIpC,EAEDnB,EAAG,OAASA,EAAG,MAAQhB,EAEhBA,CACV,CAGD,IAAI0e,GAASjf,EAAoB,GAAG,EAChCkf,GAA8Blf,EAAoB,EAAEif,EAAM,EAsD1DE,GAAkB,CAElB,GAAGpe,EACH,GAAGyB,EAEH,QAAS,QAET,cAAe,SAASI,EAAG,CACvB,GAAI,OAAOA,GAAM,SAEb,QADIhC,EAAI,OAAO,KAAKgC,CAAC,EACZ5F,EAAI,EAAGA,EAAI4D,EAAE,OAAQ5D,IAC1BmiB,GAAgBve,EAAE5D,IAAM4F,EAAEhC,EAAE5D,GAGvC,EACD,SAAUgE,EACV,KAAMyB,EACN,QAASI,EACT,YAAaW,GAEb,KAAMmB,GACN,UAAWK,GACX,SAAU0E,GACV,MAAOyF,GACP,YAAa4D,EACb,SAAUwC,GACV,OAAQuE,GACR,SAAUM,GACV,KAAMqB,GACN,KAAMje,GACN,MAAO2e,GACP,aAAcE,GACd,QAAS9O,GACT,OAAQkI,GACR,YAAawH,GACb,OAAQE,GACR,OAAQC,GACR,OAAQK,GACR,KAAMjQ,GACN,KAAMqQ,GACN,QAAS7H,GACT,OAAQ8I,GACR,YAAa/D,EAChB,EAGDoE,GAAgB,MAAQL,GACxBK,GAAgB,MAAM,OAAS,SAAS5b,EAAM,CAC1C,IAAI2T,EAAM,SAAS,cAAc,KAAK,EACtC,OAAAA,EAAI,aAAa,MAAO3T,EAAK,IAAI,EACjC2T,EAAI,UAAY,QAChBA,EAAI,aAAa,WAAY,EAAE,EAC/BA,EAAI,QAAU3T,EAEP2T,CACV,EAEDiI,GAAgB,QAAU1D,GAC1B0D,GAAgB,QAAUna,GAAU,QACpCma,GAAgB,OAAUD,GAAc,EA+cpC,OAAO,SAAc,KA3cV,UAAW,CAEtB,GAAI,OAAO,OAAO,oBAA4B,IAC1C,OAAO,oBAAyB,OAGhC,QAGJ,MAAME,EAAO,SAASC,EAAYpe,EAAW,CAIzC,OAHIoe,EAAWpe,EAAU,OAASoe,EAAWpe,EAAU,OAASA,GAG5Doe,EAAW,WAAaA,EAAW,WAAape,EACzC,GAEPoe,EAAW,WACJD,EAAKC,EAAW,WAAYpe,CAAS,EAEzC,EACV,EAEKqe,EAAW,SAAS1iB,EAAG,CACzB,IAAIsE,EAAQ,OAAO,oBACnB,GAAIA,GAASA,EAAM,OAAS,EACxB,QAASlE,EAAI,EAAGA,EAAIkE,EAAM,OAAQlE,IAC1BkE,EAAMlE,IAAM,CAAEoiB,EAAKxiB,EAAGsE,EAAMlE,EAAE,GAC9BkE,EAAMlE,GAAG,OAIxB,EAGD,IAAIuiB,EAAa,GAMb3I,EAAe,GAGf1V,EAAQ,CACR,EAAG,KACH,EAAG,IACN,EAGGse,EAAU,SAAS,cAAc,KAAK,EAC1CA,EAAQ,UAAU,IAAI,UAAU,EAEhC,MAAMC,EAAiB,SAAS7iB,EAAG,CAC/B,OAAOA,IAAMA,EAAE,YAAeA,EAAE,SAAWA,EAAE,QAAQ,SAAS,GAAG,EACpE,EAEKwG,EAAa,SAASxG,EAAG,CAC3B,IAAID,EACAyF,EAEAG,EAAO3F,EAAE,MAASA,EAAE,cAAgBA,EAAE,aAAY,EAGtD,OAAI2F,GACAH,EAAUG,EAAK,GAEXH,GAAWqd,EAAerd,CAAO,GAAK,CAAEA,EAAQ,YAAcxF,EAAE,YAChEwF,EAAUxF,EAAE,aAIZA,EAAE,QAAU6iB,EAAe7iB,EAAE,MAAM,EACnCD,EAAIC,EAAE,OAAO,WAEbD,EAAI,SAGRyF,EAAUzF,EAAE,iBAAiB,EAAG,CAAC,GAE9ByF,CACV,EAGK4Z,EAAY,SAASpf,EAAG,CAE1B,GAAIA,EAAE,gBAAkBA,EAAE,eAAe,GACrC,IAAIoB,EAAIpB,EAAE,eAAe,GAAG,QACxBqB,EAAIrB,EAAE,eAAe,GAAG,YAE5B,KAAIoB,EAAIpB,EAAE,QACNqB,EAAIrB,EAAE,QAGd,IAAIwF,EAAUgB,EAAWxG,CAAC,EAEtB8iB,EAAWtd,GAAWA,EAAQ,UAAY,OAASA,EAAQ,aAAa,iBAAiB,EAEzF6M,EAAOkQ,GAAgB,YAAY/c,EAAS,QAAQ,EAExD,GAAI6M,GAAQ,CAAEA,EAAK,UAAU,SAAS,UAAU,GAAK,CAAEyQ,EAAU,CAE7D,IAAItV,EAAO6E,EAAK,wBACZ0Q,EAAQ,EACR1Q,EAAK,MAAM,SAEX0Q,EAAQ,WAAW1Q,EAAK,MAAM,MAAM,GAExC,IAAI9C,EAAS,OACT/J,EAAQ,aAAa,aAAa,EAClC+J,EAAS/J,EAAQ,aAAa,aAAa,EAEvC6M,EAAK,MAAM,OACX9C,EAAS,SAET8C,EAAK,MAAM,OAAS,OAK5B2H,EAAe,CACX,OAAQzK,EACR,EAAGwT,EACH,EAAG1Q,EACH,EAAGjR,EACH,EAAGC,EACH,EAAGmM,EAAK,KACR,EAAGA,EAAK,IACR,EAAGA,EAAK,OACR,EAAGA,EAAK,MACR,EAAGA,EAAK,MACR,EAAGA,EAAK,OACR,EAAG6E,EAAK,MAAM,OACd,SAAU,EACb,EAEKA,EAAK,MAAM,QACbA,EAAK,MAAM,MAAQ7E,EAAK,MAAQ,MAE9B6E,EAAK,MAAM,SACbA,EAAK,MAAM,OAAS7E,EAAK,OAAS,KAElD,MAEYwM,EAAe,GAGnB0I,EAASld,CAAO,EAEhB6b,EAAMrhB,CAAC,CACV,EAEKgjB,EAAiB,SAAS7R,EAAI8R,EAAI7R,EAAI8R,EAAIC,EAAIC,EAAI,CAEpD,MAAMC,EAAMjS,EAAKD,EACXmS,EAAMJ,EAAKD,EAEXM,EAAMJ,EAAKhS,EACXqS,EAAMJ,EAAKH,EAEjB,IAAIQ,EAAS,KAAK,MAAMH,EAAKD,CAAG,EAI5BK,EAFS,KAAK,MAAMF,EAAKD,CAAG,EAEDE,EAE/B,OAAAC,EAAkBA,GAAmB,IAAM,KAAK,IAE5CA,EAAkB,IAClBA,GAAmB,KAEhBA,CACV,EAEKvE,EAAU,SAASnf,EAAG,CACpBga,GAAgBA,EAAa,IACzB,OAAOA,EAAa,EAAE,SAAY,YAAc1V,EAAM,UACtD0V,EAAa,EAAE,UAEnBA,EAAa,EAAE,MAAM,OAAS,IAIlC1V,EAAQ,CACJ,EAAG,KACH,EAAG,IACN,EAED0V,EAAe,EAClB,EAEKqF,EAAY,SAASrf,EAAG,CAC1B,GAAIga,EAAc,CACd,IAAI5Y,EAAIpB,EAAE,SAAWA,EAAE,MACnBqB,EAAIrB,EAAE,SAAWA,EAAE,MAQvB,GANIsE,EAAM,GAAK,MAAQA,EAAM,GAAK,OAC9BA,EAAM,EAAIlD,EACVkD,EAAM,EAAIjD,GAIV2Y,EAAa,SAAW,OAAQ,CAChC,IAAI2J,EAAKviB,EAAIkD,EAAM,EACfsf,EAAKviB,EAAIiD,EAAM,EACf+P,EAAM2F,EAAa,EAAE,UAAY4J,EACjCxP,EAAO4F,EAAa,EAAE,WAAa2J,EAGvC3J,EAAa,EAAE,MAAM,IAAM3F,EAAM,KACjC2F,EAAa,EAAE,MAAM,KAAO5F,EAAO,KAG/B,OAAQ4F,EAAa,EAAE,SAAY,aACnC1V,EAAM,SAAW,GACjB0V,EAAa,EAAE,QAAQ,WAAY3F,EAAKD,CAAI,EAEhE,SAAuB4F,EAAa,SAAW,SAAU,CACzC,IAAI6J,EAAK7J,EAAa,EAAEA,EAAa,EAAE,EACnC8J,EAAK9J,EAAa,EAAEA,EAAa,EAAE,EACnC+I,EAAQC,EAAea,EAAIC,EAAI9J,EAAa,EAAGA,EAAa,EAAG5Y,EAAGC,CAAC,EACvE0hB,EAAQA,EAAQ/I,EAAa,EAAI,IACjC+I,EAAQ,KAAK,MAAMA,EAAQ,CAAC,EAAI,EAChC/I,EAAa,EAAE,MAAM,OAAS,GAAG+I,OAE7B,OAAQ/I,EAAa,EAAE,SAAY,aACnC1V,EAAM,SAAW,GACjB0V,EAAa,EAAE,QAAQ,SAAU+I,CAAK,EAE1D,SAAuB/I,EAAa,SAAW,SAAU,CACzC,IAAI3F,EAAM,KACND,EAAO,KACP2P,EAAQ,KACRC,EAAS,KAEThK,EAAa,GAAK,YAAcA,EAAa,GAAK,aAAeA,EAAa,GAAK,aACnF+J,EAAQ/J,EAAa,EAAE,aAAe5Y,EAAIkD,EAAM,GAE5CtE,EAAE,WACFgkB,EAAShK,EAAa,EAAE,cAAgB5Y,EAAIkD,EAAM,IAAM0V,EAAa,EAAE,aAAeA,EAAa,EAAE,gBAElGA,EAAa,IAAM,YAAcA,EAAa,GAAK,aAAcA,EAAa,GAAK,eAC1F5F,EAAO4F,EAAa,EAAE,YAAc5Y,EAAIkD,EAAM,GAC9Cyf,EAAQ/J,EAAa,EAAE,WAAaA,EAAa,EAAE,YAAc5F,EAE7DpU,EAAE,WACFgkB,EAAShK,EAAa,EAAE,cAAgB5Y,EAAIkD,EAAM,IAAM0V,EAAa,EAAE,aAAeA,EAAa,EAAE,eAIzGA,EAAa,GAAK,YAAcA,EAAa,GAAK,aAAeA,EAAa,GAAK,YAC7EgK,IACFA,EAAShK,EAAa,EAAE,cAAgB3Y,EAAIiD,EAAM,KAE/C0V,EAAa,IAAM,YAAcA,EAAa,GAAK,aAAeA,EAAa,GAAK,eAC3F3F,EAAM2F,EAAa,EAAE,WAAa3Y,EAAIiD,EAAM,GAC5C0f,EAAShK,EAAa,EAAE,UAAYA,EAAa,EAAE,aAAe3F,GAGlEA,IACA2F,EAAa,EAAE,MAAM,IAAM3F,EAAM,MAEjCD,IACA4F,EAAa,EAAE,MAAM,KAAO5F,EAAO,MAEnC2P,IACA/J,EAAa,EAAE,MAAM,MAAQ+J,EAAQ,MAErCC,IACAhK,EAAa,EAAE,MAAM,OAASgK,EAAS,MAIvC,OAAOhK,EAAa,EAAE,SAAY,aAClC1V,EAAM,SAAW,GACjB0V,EAAa,EAAE,QAAQ,aAAc+J,EAAOC,CAAM,EAEzD,CAED1f,EAAM,EAAIlD,EACVkD,EAAM,EAAIjD,CACtB,KAAe,CACH,IAAImE,EAAUgB,EAAWxG,CAAC,EAEtBqS,EAAOkQ,GAAgB,YAAY/c,EAAS,QAAQ,EAExD,GAAI6M,GAGA,GADeA,EAAK,UAAU,SAAS,iBAAiB,EAC1C,CACV,IAAI9L,EAAWf,EAAQ,aAAa,eAAe,EAC/Ce,EACA8L,EAAK,MAAM,OAAS9L,EAEpB8L,EAAK,MAAM,OAAS,EAE3B,SAAUA,EAAK,aAAa,UAAU,EAAG,CACtC,IAAI7E,EAAO6E,EAAK,wBAEZrS,EAAE,QAAUwN,EAAK,IAAMmV,EACnBnV,EAAK,OAASxN,EAAE,QAAUwN,EAAK,MAAQmV,EACvCtQ,EAAK,MAAM,OAAS,YACbrS,EAAE,QAAUwN,EAAK,KAAOmV,EAC/BtQ,EAAK,MAAM,OAAS,YAEpBA,EAAK,MAAM,OAAS,WAEjB7E,EAAK,QAAUxN,EAAE,QAAUwN,EAAK,KAAOmV,EAC1CnV,EAAK,OAASxN,EAAE,QAAUwN,EAAK,MAAQmV,EACvCtQ,EAAK,MAAM,OAAS,YACbrS,EAAE,QAAUwN,EAAK,KAAOmV,EAC/BtQ,EAAK,MAAM,OAAS,YAEpBA,EAAK,MAAM,OAAS,WAEjB7E,EAAK,OAASxN,EAAE,QAAUwN,EAAK,MAAQmV,EAC9CtQ,EAAK,MAAM,OAAS,WACbrS,EAAE,QAAUwN,EAAK,KAAOmV,EAC/BtQ,EAAK,MAAM,OAAS,WAEpBA,EAAK,MAAM,OAAS,EAE3B,EAER,CACJ,EAED,IAAI9L,EAAW,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,QAAQ,EAC5DA,EAAS,QAAQ,SAAShC,EAAGP,EAAG,CAC5BuC,EAASvC,GAAK,SAAS,cAAc,KAAK,EAC1CuC,EAASvC,GAAG,UAAU,IAAI,eAAe,EACrCO,IAAM,SACNgC,EAASvC,GAAG,aAAa,cAAe,QAAQ,GAEhDuC,EAASvC,GAAG,aAAa,cAAe,QAAQ,EAChDuC,EAASvC,GAAG,aAAa,gBAAiBO,EAAI,SAAS,EAEnE,CAAK,EAED,IAAI0f,EAEJ,MAAM5C,EAAQ,SAASrhB,EAAG,CACtB,IAAIwF,EAAUgB,EAAWxG,CAAC,EAEtBqS,EAAOkQ,GAAgB,YAAY/c,EAAS,QAAQ,EACpD6M,GAAQ,CAAEA,EAAK,UAAU,SAAS,UAAU,GAAKA,EAAK,UAAU,SAAS,iBAAiB,GAC1FA,EAAK,OAAO,GAAG9L,CAAQ,EAEjB8L,EAAK,UAAU,SAAS,eAAe,GACzC9L,EAASA,EAAS,OAAO,GAAG,OAAM,EAGtC0d,EAAiB5R,GAEjB6R,EAAM,CAEb,EAEKA,EAAO,SAASlkB,EAAG,CACjBikB,IACA1d,EAAS,QAAQ,SAAShC,EAAG,CACzBA,EAAE,OAAM,CACxB,CAAa,EACD0f,EAAiB,KAExB,EAEKE,GAAY,SAASnkB,EAAG,CAE1B,IAAIqe,EADU7X,EAAWxG,CAAC,EACJ,aAAa,cAAc,EACjD,GAAIqe,EAAS,CAKT,GAHAuE,EAAQ,UAAYvE,EAGhBre,EAAE,gBAAkBA,EAAE,eAAe,GACrC,IAAIoB,EAAIpB,EAAE,eAAe,GAAG,QACxBqB,EAAIrB,EAAE,eAAe,GAAG,YAE5B,KAAIoB,EAAIpB,EAAE,QACNqB,EAAIrB,EAAE,QAGd4iB,EAAQ,MAAM,IAAMvhB,EAAI,KACxBuhB,EAAQ,MAAM,KAAOxhB,EAAI,KACzB,SAAS,KAAK,YAAYwhB,CAAO,CAC7C,MAAmBA,EAAQ,YACfA,EAAQ,UAAY,GACpB,SAAS,KAAK,YAAYA,CAAO,EAExC,EAEKwB,GAAc,SAASpkB,EAAG,CAC5B,IAAIqS,EAAO,SAAS,cACpB,GAAIA,GAAQ,OAAOA,EAAK,aAAgB,WAEpCA,EAAK,YAAYrS,CAAC,EAElBA,EAAE,eAAc,EAChBA,EAAE,yBAAwB,UAG1BqS,EAAOkQ,GAAgB,YAAYviB,EAAE,OAAQ,SAASgG,EAAG,CACrD,OAAOA,EAAE,SAAWA,EAAE,aAAa,qBAAqB,CACxE,CAAa,EAEGqM,EAAM,CACN,IAAIrM,EAAI,SAAS,cAAc,IAAMqM,CAAI,EACnCrM,GAGFA,EAAE,YAAY,KAAKhG,CAAC,EACpBA,EAAE,eAAc,EAChBA,EAAE,yBAAwB,GAJ1B,QAAQ,MAAM,sCAAwCqS,CAAI,CAMjE,CAER,EAEK4M,GAAU,SAASjf,EAAG,CACxB,IAAIqS,EAAO,SAAS,cAChBA,GACIrS,EAAE,MAAQ,UAAY,OAAOqS,EAAK,QAAW,aAC7CA,EAAK,OAAM,EACXrS,EAAE,eAAc,EAChBA,EAAE,yBAAwB,GAIlC,IAAIsE,EAAQ,OAAO,oBACfA,GAASA,EAAM,OAAS,IACxB+N,EAAO/N,EAAMA,EAAM,OAAS,GACxB+N,GACIrS,EAAE,MAAQ,UAAY,OAAOqS,EAAK,UAAa,YAAc,OAAOA,EAAK,OAAU,YAC/EA,EAAK,aACLA,EAAK,MAAK,EACVrS,EAAE,eAAc,EAChBA,EAAE,yBAAwB,GAK7C,EAEKiV,GAAQ,SAASjV,EAAG,EAClBA,EAAE,OAAO,aAAa,WAAW,GAAKA,EAAE,OAAO,OAC/CuiB,GAAgB,KAAKviB,CAAC,CAE7B,EAED,SAAS,iBAAiB,UAAWqhB,CAAK,EAC1C,SAAS,iBAAiB,UAAWlC,CAAO,EAC5C,SAAS,iBAAiB,YAAaC,CAAS,EAChD,SAAS,iBAAiB,YAAaC,CAAS,EAChD,SAAS,iBAAiB,YAAa8E,EAAS,EAChD,SAAS,iBAAiB,UAAWlF,EAAO,EAC5C,SAAS,iBAAiB,cAAemF,EAAW,EACpD,SAAS,iBAAiB,QAASnP,EAAK,CAC3C,IAM4B,IAAInR,GAAWye,EAC5C,KACApjB,EAAU0E,EAAoB,OAC9B,EAAa,EAGF1E,CACX,iFC/kaA;AAAA;AAAA;AAAA;AAAA,GAQA,MAAMklB,GAAS3f,GAASA,aAAiB,YAEnC4f,GAAc,CAACC,EAAcC,EAAU,CAAA,EAAIC,EAAU,CAAA,IAAO,CAE9D,MAAMngB,EAAQ,CACV,GAAGigB,CACX,EAGUG,EAAc,CAAA,EACdC,EAAgB,CAAA,EAGhBC,EAAW,KAAO,CAAE,GAAGtgB,CAAO,GAG9BugB,EAAqB,IAAM,CAE7B,MAAMC,EAAQ,CAAC,GAAGJ,CAAW,EAG7B,OAAAA,EAAY,OAAS,EAEdI,CACf,EAGUC,EAAuB,IAAM,CAE/B,MAAMD,EAAQ,CAAC,GAAGH,CAAa,EAG/BA,EAAc,OAAS,EAGvBG,EAAM,QAAQ,CAAC,CAAE,KAAAvZ,EAAM,KAAA5E,EAAI,IAAO,CAC9Bqe,EAASzZ,EAAM5E,EAAI,CAC/B,CAAS,CACT,EAGUqe,EAAW,CAACzZ,EAAM5E,EAAMse,KAAe,CAEzC,GAAIA,IAAc,CAAC,SAAS,OAAQ,CAChCN,EAAc,KAAK,CAAE,KAAApZ,EAAM,KAAA5E,CAAM,CAAA,EACjC,MACH,CAGGue,EAAe3Z,IACf2Z,EAAe3Z,GAAM5E,CAAI,EAI7B+d,EAAY,KAAK,CACb,KAAAnZ,EACA,KAAA5E,CACZ,CAAS,CACT,EAEUwe,EAAQ,CAAC9lB,KAAQ+lB,IAAUC,EAAahmB,GAAOgmB,EAAahmB,GAAK,GAAG+lB,CAAI,EAAI,KAE5EE,EAAM,CACR,SAAAV,EACA,mBAAAC,EACA,qBAAAE,EACA,SAAAC,EACA,MAAAG,CACR,EAEI,IAAIE,EAAe,CAAA,EACnBb,EAAQ,QAAQW,GAAS,CACrBE,EAAe,CACX,GAAGF,EAAM7gB,CAAK,EACd,GAAG+gB,CACf,CACA,CAAK,EAED,IAAIH,EAAiB,CAAA,EACrB,OAAAT,EAAQ,QAAQlV,GAAU,CACtB2V,EAAiB,CACb,GAAG3V,EAAOyV,EAAUG,EAAO7gB,CAAK,EAChC,GAAG4gB,CACf,CACA,CAAK,EAEMI,CACX,EAEMC,GAAiB,CAAC5hB,EAAK0C,EAAU5C,IAAe,CAClD,GAAI,OAAOA,GAAe,WAAY,CAClCE,EAAI0C,GAAY5C,EAChB,MACH,CACD,OAAO,eAAeE,EAAK0C,EAAU,CAAE,GAAG5C,CAAU,CAAE,CAC1D,EAEM+hB,GAAQ,CAAC7hB,EAAK+N,IAAO,CACvB,UAAWhO,KAAOC,EACV,CAACA,EAAI,eAAeD,CAAG,GAI3BgO,EAAGhO,EAAKC,EAAID,EAAI,CAExB,EAEM+hB,GAAehiB,GAAc,CAC/B,MAAME,EAAM,CAAA,EACZ,OAAA6hB,GAAM/hB,EAAY4C,GAAY,CAC1Bkf,GAAe5hB,EAAK0C,EAAU5C,EAAW4C,EAAS,CAC1D,CAAK,EACM1C,CACX,EAEMwY,GAAO,CAACrX,EAAMgQ,EAAMpQ,EAAQ,OAAS,CACvC,GAAIA,IAAU,KACV,OAAOI,EAAK,aAAagQ,CAAI,GAAKhQ,EAAK,aAAagQ,CAAI,EAE5DhQ,EAAK,aAAagQ,EAAMpQ,CAAK,CACjC,EAEMghB,GAAK,6BACLC,GAAc,CAAC,MAAO,MAAM,EAE5BC,GAAeC,GAAOF,GAAY,SAASE,CAAG,EAE9CvE,GAAgB,CAACuE,EAAKC,EAAWC,EAAa,CAAA,IAAO,CACnD,OAAOD,GAAc,WACrBC,EAAaD,EACbA,EAAY,MAEhB,MAAMtgB,EAAUogB,GAAaC,CAAG,EAC1B,SAAS,gBAAgBH,GAAIG,CAAG,EAChC,SAAS,cAAcA,CAAG,EAChC,OAAIC,IACIF,GAAaC,CAAG,EAChB1J,GAAK3W,EAAS,QAASsgB,CAAS,EAEhCtgB,EAAQ,UAAYsgB,GAG5BN,GAAMO,EAAY,CAACjR,EAAMpQ,IAAU,CAC/ByX,GAAK3W,EAASsP,EAAMpQ,CAAK,CACjC,CAAK,EACMc,CACX,EAEMwgB,GAAc1J,GAAU,CAAC2J,EAAOzhB,IAAU,CACxC,OAAOA,EAAU,KAAe8X,EAAO,SAAS9X,GAChD8X,EAAO,aAAa2J,EAAO3J,EAAO,SAAS9X,EAAM,EAEjD8X,EAAO,YAAY2J,CAAK,CAEhC,EAEMC,GAAkB,CAAC5J,EAAQ6J,IAAe,CAACC,EAAM5hB,KAC/C,OAAOA,EAAU,IACjB2hB,EAAW,OAAO3hB,EAAO,EAAG4hB,CAAI,EAEhCD,EAAW,KAAKC,CAAI,EAGjBA,GAGLC,GAAkB,CAAC/J,EAAQ6J,IAAeC,IAE5CD,EAAW,OAAOA,EAAW,QAAQC,CAAI,EAAG,CAAC,EAGzCA,EAAK,QAAQ,YACb9J,EAAO,YAAY8J,EAAK,OAAO,EAG5BA,GAGLE,IAAc,IAChB,OAAO,OAAW,KAAe,OAAO,OAAO,SAAa,KAAW,EACrEC,GAAY,IAAMD,GAElBE,GAAcD,GAAW,EAAGjF,GAAc,KAAK,EAAI,CAAA,EACnDmF,GACF,aAAcD,GAAc7hB,GAAMA,EAAG,SAAS,OAASA,GAAMA,EAAG,WAAW,OAEzE+hB,GAAc,CAACC,EAAaR,EAAYS,EAAQC,IAAU,CAC5D,MAAMzS,EAAOwS,EAAO,IAAMD,EAAY,KAChCtS,EAAMuS,EAAO,IAAMD,EAAY,IAC/BG,EAAQ1S,EAAOuS,EAAY,MAC3BI,EAAS1S,EAAMsS,EAAY,QAAUE,EAAM,IAAM,GAEjDrZ,EAAO,CAET,QAAS,CACL,GAAGmZ,CACN,EAGD,MAAO,CACH,KAAMA,EAAY,KAClB,IAAKA,EAAY,IACjB,MAAOA,EAAY,MACnB,OAAQA,EAAY,MACvB,EAID,MAAO,CACH,KAAAvS,EACA,IAAAC,EACA,MAAAyS,EACA,OAAAC,CACH,CACT,EAGI,OAAAZ,EACK,OAAOa,GAAa,CAACA,EAAU,cAAa,CAAE,EAC9C,IAAIA,GAAaA,EAAU,IAAI,EAC/B,QAAQC,GAAiB,CACtBC,GAAW1Z,EAAK,MAAO,CAAE,GAAGyZ,EAAc,KAAK,CAAE,EACjDC,GAAW1Z,EAAK,MAAO,CAAE,GAAGyZ,EAAc,KAAK,CAAE,CAC7D,CAAS,EAGLE,GAAkB3Z,EAAK,KAAK,EAG5BA,EAAK,MAAM,QAAUA,EAAK,QAAQ,aAClCA,EAAK,MAAM,OAASA,EAAK,QAAQ,YAGjC2Z,GAAkB3Z,EAAK,KAAK,EAErBA,CACX,EAEM0Z,GAAa,CAAC5K,EAAQ2J,IAAU,CAElCA,EAAM,KAAO3J,EAAO,IACpB2J,EAAM,OAAS3J,EAAO,KACtB2J,EAAM,QAAU3J,EAAO,IACvB2J,EAAM,MAAQ3J,EAAO,KAEjB2J,EAAM,OAAS3J,EAAO,SACtBA,EAAO,OAAS2J,EAAM,QAGtBA,EAAM,MAAQ3J,EAAO,QACrBA,EAAO,MAAQ2J,EAAM,MAE7B,EAEMkB,GAAoB3Z,GAAQ,CAC9BA,EAAK,MAAQA,EAAK,MAAQA,EAAK,KAC/BA,EAAK,OAASA,EAAK,OAASA,EAAK,GACrC,EAEM4Z,GAAW1iB,GAAS,OAAOA,GAAU,SAUrC2iB,GAAW,CAAC9gB,EAAU+gB,EAAaC,EAAUC,EAAc,OACtD,KAAK,IAAIjhB,EAAW+gB,CAAW,EAAIE,GAAe,KAAK,IAAID,CAAQ,EAAIC,EAM5EC,GAEF,CAAC,CAAE,UAAAC,EAAY,GAAK,QAAAC,EAAU,IAAM,KAAAC,EAAO,EAAE,EAAK,CAAE,IAEhD,CACI,IAAIthB,EAAS,KACTC,EAAW,KACXghB,EAAW,EACXM,EAAU,GA6Ed,MAAMvC,EAAMG,GAAa,CACrB,YA3EgB,CAACqC,EAAIC,IAAmB,CAExC,GAAIF,EAAS,OAGb,GAAI,EAAET,GAAS9gB,CAAM,GAAK8gB,GAAS7gB,CAAQ,GAAI,CAC3CshB,EAAU,GACVN,EAAW,EACX,MACH,CAGD,MAAMtnB,EAAI,EAAEsG,EAAWD,GAAUohB,EAGjCH,GAAYtnB,EAAI2nB,EAGhBrhB,GAAYghB,EAGZA,GAAYI,EAGRN,GAAS9gB,EAAUD,EAAQihB,CAAQ,GAAKQ,GACxCxhB,EAAWD,EACXihB,EAAW,EACXM,EAAU,GAGVvC,EAAI,SAAS/e,CAAQ,EACrB+e,EAAI,WAAW/e,CAAQ,GAGvB+e,EAAI,SAAS/e,CAAQ,CAEzC,EAwCgB,OAAQ,CACJ,IAnCU7B,GAAS,CAgBvB,GAdI0iB,GAAS1iB,CAAK,GAAK,CAAC0iB,GAAS7gB,CAAQ,IACrCA,EAAW7B,GAIX4B,IAAW,OACXA,EAAS5B,EACT6B,EAAW7B,GAIf4B,EAAS5B,EAGL6B,IAAaD,GAAU,OAAOA,EAAW,IAAa,CAEtDuhB,EAAU,GACVN,EAAW,EAGXjC,EAAI,SAAS/e,CAAQ,EACrB+e,EAAI,WAAW/e,CAAQ,EAEvB,MACH,CAEDshB,EAAU,EAC1B,EAOoB,IAAK,IAAMvhB,CACd,EACD,QAAS,CACL,IAAK,IAAMuhB,CACd,EACD,SAAUnjB,GAAS,CAAE,EACrB,WAAYA,GAAS,CAAE,CACvC,CAAa,EAED,OAAO4gB,CACnB,EAGM0C,GAAgB9jB,GAAMA,EAAI,GAAM,EAAIA,EAAIA,EAAI,IAAM,EAAI,EAAIA,GAAKA,EAE/D+jB,GAEF,CAAC,CAAE,SAAAC,EAAW,IAAK,OAAAC,EAASH,GAAe,MAAAI,EAAQ,CAAC,EAAK,CAAE,IAEvD,CACI,IAAIC,EAAQ,KACRnkB,EACAqG,EACAsd,EAAU,GACVS,EAAU,GACVhiB,EAAS,KA0Bb,MAAMgf,EAAMG,GAAa,CACrB,YAzBgB,CAACqC,EAAIC,IAAmB,CACpCF,GAAWvhB,IAAW,OAEtB+hB,IAAU,OACVA,EAAQP,GAGR,EAAAA,EAAKO,EAAQD,KAEjBlkB,EAAI4jB,EAAKO,EAAQD,EAEblkB,GAAKgkB,GAAYH,GACjB7jB,EAAI,EACJqG,EAAI+d,EAAU,EAAI,EAClBhD,EAAI,SAAS/a,EAAIjE,CAAM,EACvBgf,EAAI,WAAW/a,EAAIjE,CAAM,EACzBuhB,EAAU,KAEVtd,EAAIrG,EAAIgkB,EACR5C,EAAI,UAAUphB,GAAK,EAAIikB,EAAOG,EAAU,EAAI/d,EAAIA,CAAC,EAAI,GAAKjE,CAAM,IAEpF,EAKgB,OAAQ,CACJ,IAAK,IAAOgiB,EAAU,EAAIhiB,EAC1B,IAAK5B,GAAS,CAEV,GAAI4B,IAAW,KAAM,CACjBA,EAAS5B,EACT4gB,EAAI,SAAS5gB,CAAK,EAClB4gB,EAAI,WAAW5gB,CAAK,EACpB,MACH,CAGGA,EAAQ4B,GACRA,EAAS,EACTgiB,EAAU,KAGVA,EAAU,GACVhiB,EAAS5B,GAIbmjB,EAAU,GACVQ,EAAQ,IACX,CACJ,EACD,QAAS,CACL,IAAK,IAAMR,CACd,EACD,SAAUnjB,GAAS,CAAE,EACrB,WAAYA,GAAS,CAAE,CACvC,CAAa,EAED,OAAO4gB,CACnB,EAEMiD,GAAW,CACb,OAAAd,GACA,MAAAQ,EACJ,EAOMO,GAAiB,CAAC/kB,EAAYglB,EAAUpiB,IAAa,CAGvD,MAAMqiB,EACFjlB,EAAWglB,IAAa,OAAOhlB,EAAWglB,GAAUpiB,IAAc,SAC5D5C,EAAWglB,GAAUpiB,GACrB5C,EAAWglB,IAAahlB,EAE5B8H,EAAO,OAAOmd,GAAQ,SAAWA,EAAMA,EAAI,KAC3CC,EAAQ,OAAOD,GAAQ,SAAW,CAAE,GAAGA,CAAK,EAAG,GAErD,OAAOH,GAAShd,GAAQgd,GAAShd,GAAMod,CAAK,EAAI,IACpD,EAEMC,GAAY,CAACrhB,EAAM5D,EAAKglB,EAAOE,EAAY,KAAU,CACvDllB,EAAM,MAAM,QAAQA,CAAG,EAAIA,EAAM,CAACA,CAAG,EACrCA,EAAI,QAAQqC,GAAK,CACbuB,EAAK,QAAQ7D,GAAO,CAChB,IAAIoR,EAAOpR,EACPH,EAAS,IAAMolB,EAAMjlB,GACrBolB,EAASpkB,GAAUikB,EAAMjlB,GAAOgB,EAEhC,OAAOhB,GAAQ,WACfoR,EAAOpR,EAAI,IACXH,EAASG,EAAI,QAAUH,EACvBulB,EAASplB,EAAI,QAAUolB,GAGvB,EAAA9iB,EAAE8O,IAAS,CAAC+T,KAIhB7iB,EAAE8O,GAAQ,CACN,IAAKvR,EACL,IAAKulB,CACrB,EACA,CAAS,CACT,CAAK,CACL,EAMMC,GAAa,CAAC,CAAE,YAAAC,EAAa,UAAAC,EAAW,gBAAAC,EAAiB,gBAAAC,CAAe,IAAO,CAEjF,MAAMC,EAAe,CAAE,GAAGH,GAGpBF,EAAa,CAAA,EAGnB,OAAAvD,GAAMwD,EAAa,CAAC3iB,EAAU+B,IAAc,CACxC,MAAMmgB,EAAWC,GAAepgB,CAAS,EACzC,GAAI,CAACmgB,EACD,OAIJA,EAAS,SAAW7jB,GAAS,CACzBukB,EAAU5iB,GAAY3B,CAClC,EAGQ6jB,EAAS,OAASa,EAAa/iB,GAiB/BuiB,GAAU,CAdG,CACT,IAAKviB,EACL,OAAQ3B,GAAS,CAET6jB,EAAS,SAAW7jB,IAIxB6jB,EAAS,OAAS7jB,EACrB,EACD,OAAQ,IAAMukB,EAAU5iB,EACpC,CAGuB,EAAG,CAAC6iB,EAAiBC,CAAe,EAAGF,EAAW,EAAI,EAGrEF,EAAW,KAAKR,CAAQ,CAChC,CAAK,EAGM,CACH,MAAOT,GAAM,CACT,IAAIC,EAAiB,SAAS,OAC1BF,EAAU,GACd,OAAAkB,EAAW,QAAQ3gB,GAAa,CACvBA,EAAU,UAASyf,EAAU,IAClCzf,EAAU,YAAY0f,EAAIC,CAAc,CACxD,CAAa,EACMF,CACV,EACD,QAAS,IAAM,CAAE,CACzB,CACA,EAEMwB,GAAW7jB,GAAW,CAAC+F,EAAM+d,IAAO,CACtC9jB,EAAQ,iBAAiB+F,EAAM+d,CAAE,CACrC,EAEMC,GAAc/jB,GAAW,CAAC+F,EAAM+d,IAAO,CACzC9jB,EAAQ,oBAAoB+F,EAAM+d,CAAE,CACxC,EAGME,GAAY,CAAC,CACf,YAAAR,EACA,UAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,UAAAM,EACA,KAAArD,CACJ,IAAM,CACF,MAAMsD,EAAS,CAAA,EAETzX,EAAMoX,GAASjD,EAAK,OAAO,EAC3BrgB,EAASwjB,GAAYnD,EAAK,OAAO,EAEvC,OAAA+C,EAAgB,GAAK,CAAC5d,EAAM+d,IAAO,CAC/BI,EAAO,KAAK,CACR,KAAAne,EACA,GAAA+d,CACZ,CAAS,EACDrX,EAAI1G,EAAM+d,CAAE,CACpB,EAEIH,EAAgB,IAAM,CAAC5d,EAAM+d,IAAO,CAChCI,EAAO,OAAOA,EAAO,UAAU3iB,GAASA,EAAM,OAASwE,GAAQxE,EAAM,KAAOuiB,CAAE,EAAG,CAAC,EAClFvjB,EAAOwF,EAAM+d,CAAE,CACvB,EAEW,CACH,MAAO,IAEI,GAEX,QAAS,IAAM,CACXI,EAAO,QAAQ3iB,GAAS,CACpBhB,EAAOgB,EAAM,KAAMA,EAAM,EAAE,CAC3C,CAAa,CACJ,CACT,CACA,EAIM4iB,GAAO,CAAC,CAAE,YAAAX,EAAa,UAAAC,EAAW,gBAAAE,CAAe,IAAO,CAC1DP,GAAUI,EAAaG,EAAiBF,CAAS,CACrD,EAEMW,GAAYllB,GAASA,GAAS,KAO9ByB,GAAW,CACb,QAAS,EACT,OAAQ,EACR,OAAQ,EACR,WAAY,EACZ,WAAY,EACZ,QAAS,EACT,QAAS,EACT,QAAS,EACT,QAAS,EACT,QAAS,CACb,EAEM0jB,GAAS,CAAC,CAAE,YAAAb,EAAa,UAAAC,EAAW,gBAAAC,EAAiB,gBAAAC,EAAiB,KAAA/C,KAAW,CAEnF,MAAMgD,EAAe,CAAE,GAAGH,GAGpBa,EAAe,CAAA,EAGrBlB,GAAUI,EAAa,CAACE,EAAiBC,CAAe,EAAGF,CAAS,EAGpE,MAAMc,EAAY,IAAM,CAACd,EAAU,YAAiB,EAAGA,EAAU,YAAiB,CAAC,EAC7Ee,EAAW,IAAM,CAACf,EAAU,QAAa,EAAGA,EAAU,QAAa,CAAC,EACpEgB,EAAU,IACZ7D,EAAK,KAAOM,GAAYN,EAAK,KAAMA,EAAK,WAAY2D,EAAW,EAAEC,EAAU,CAAA,EAAI,KACnF,OAAAd,EAAgB,KAAO,CAAE,IAAKe,CAAO,EACrCd,EAAgB,KAAO,CAAE,IAAKc,CAAO,EAGrCjB,EAAY,QAAQtlB,GAAO,CACvBulB,EAAUvlB,GACN,OAAO0lB,EAAa1lB,GAAS,IAAcyC,GAASzC,GAAO0lB,EAAa1lB,EACpF,CAAK,EAGM,CACH,MAAO,IAAM,CAET,GAAI,EAACwmB,GAAiBJ,EAAcb,CAAS,EAK7C,OAAAkB,GAAY/D,EAAK,QAAS6C,CAAS,EAGnC,OAAO,OAAOa,EAAc,CAAE,GAAGb,CAAW,CAAA,EAGrC,EACV,EACD,QAAS,IAAM,CAAE,CACzB,CACA,EAEMiB,GAAmB,CAACJ,EAAcM,IAAa,CAEjD,GAAI,OAAO,KAAKN,CAAY,EAAE,SAAW,OAAO,KAAKM,CAAQ,EAAE,OAC3D,MAAO,GAIX,UAAWxmB,KAAQwmB,EACf,GAAIA,EAASxmB,KAAUkmB,EAAalmB,GAChC,MAAO,GAIf,MAAO,EACX,EAEMumB,GAAc,CAChB3kB,EACA,CACI,QAAA6kB,EACA,YAAAC,EACA,WAAAC,EACA,WAAAC,EACA,OAAAC,EACA,OAAAC,EACA,QAAAC,EACA,QAAAC,EACA,QAAAC,EACA,QAAAC,EACA,QAAAC,EACA,MAAAhH,EACA,OAAAC,CACH,IACA,CACD,IAAIgH,EAAa,GACbnB,EAAS,IAGTD,GAAUkB,CAAO,GAAKlB,GAAUmB,CAAO,KACvClB,GAAU,qBAAqBiB,GAAW,OAAOC,GAAW,QAK5DnB,GAAUU,CAAW,IACrBU,GAAc,eAAeV,UAI7BV,GAAUW,CAAU,GAAKX,GAAUY,CAAU,KAC7CQ,GAAc,eAAeT,GAAc,QAAQC,GAAc,aAIjEZ,GAAUa,CAAM,GAAKb,GAAUc,CAAM,KACrCM,GAAc,WAAWpB,GAAUa,CAAM,EAAIA,EAAS,MAClDb,GAAUc,CAAM,EAAIA,EAAS,UAKjCd,GAAUiB,CAAO,IACjBG,GAAc,WAAWH,UAGzBjB,GAAUe,CAAO,IACjBK,GAAc,WAAWL,UAGzBf,GAAUgB,CAAO,IACjBI,GAAc,WAAWJ,UAIzBI,EAAW,SACXnB,GAAU,aAAamB,MAIvBpB,GAAUS,CAAO,IACjBR,GAAU,WAAWQ,KAGjBA,IAAY,IACZR,GAAU,sBAIVQ,EAAU,IACVR,GAAU,yBAKdD,GAAU5F,CAAM,IAChB6F,GAAU,UAAU7F,QAIpB4F,GAAU7F,CAAK,IACf8F,GAAU,SAAS9F,QAIvB,MAAMkH,GAAsBzlB,EAAQ,qBAAuB,IAGvDqkB,EAAO,SAAWoB,GAAoB,QAAUpB,IAAWoB,MAC3DzlB,EAAQ,MAAM,QAAUqkB,EAGxBrkB,EAAQ,oBAAsBqkB,EAEtC,EAEMqB,GAAS,CACX,OAAArB,GACA,UAAAL,GACA,WAAAT,GACA,KAAAY,EACJ,EAEMwB,GAAa,CAAC3d,EAAO,CAAE,EAAEhI,EAAU,CAAE,EAAEyW,EAAQ,MAC5CzW,EAAQ,mBACTgI,EAAK,WAAa,SAASyO,EAAM,WAAY,EAAE,GAAK,EACpDzO,EAAK,UAAY,SAASyO,EAAM,UAAW,EAAE,GAAK,EAClDzO,EAAK,YAAc,SAASyO,EAAM,YAAa,EAAE,GAAK,EACtDzO,EAAK,aAAe,SAASyO,EAAM,aAAc,EAAE,GAAK,EACxDzO,EAAK,WAAa,SAASyO,EAAM,WAAY,EAAE,GAAK,EACpDzW,EAAQ,iBAAmB,IAG/BgI,EAAK,KAAOhI,EAAQ,YAAc,EAClCgI,EAAK,IAAMhI,EAAQ,WAAa,EAChCgI,EAAK,MAAQhI,EAAQ,aAAe,EACpCgI,EAAK,OAAShI,EAAQ,cAAgB,EAEtCgI,EAAK,MAAQA,EAAK,KAAOA,EAAK,MAC9BA,EAAK,OAASA,EAAK,IAAMA,EAAK,OAE9BA,EAAK,UAAYhI,EAAQ,UAEzBgI,EAAK,OAAShI,EAAQ,eAAiB,KAEhCgI,GAGL4d,GAEF,CAAC,CAEG,IAAAvF,EAAM,MACN,KAAA/Q,EAAO,KACP,WAAAiR,EAAa,CAAE,EAGf,KAAAsF,EAAO,IAAM,CAAE,EACf,MAAAC,EAAQ,IAAM,CAAE,EAChB,OAAAC,EAAS,IAAM,CAAE,EACjB,QAAAC,EAAU,IAAM,CAAE,EAGlB,2BAAAC,EAA6B,CAACxF,EAAOxB,IAAYA,EACjD,cAAAiH,EAAgB,IAAM,CAAE,EACxB,aAAAC,EAAe,IAAM,CAAE,EAGvB,WAAAC,EAAa,GACb,iBAAAC,EAAmB,GAGnB,OAAAC,EAAS,CAAE,CACd,EAAG,KAAO,CAEPC,EAEApD,EAAQ,CAAE,IACT,CAED,MAAMnjB,EAAU8b,GAAcuE,EAAK,aAAa/Q,IAAQiR,CAAU,EAG5D9J,GAAQ,OAAO,iBAAiBzW,EAAS,IAAI,EAG7CgI,GAAO2d,KACb,IAAIa,GAAY,KAGZC,GAAY,GAGhB,MAAM9F,GAAa,CAAA,EAGb+F,GAAe,CAAA,EAGfC,EAAM,CAAA,EAGN7nB,GAAQ,CAAA,EAGR8nB,GAAU,CACZd,CACZ,EAEce,GAAU,CACZhB,CACZ,EAEciB,GAAa,CACfd,CACZ,EAGchlB,GAAa,IAAMhB,EACnB+mB,GAAgB,IAAMpG,GAAW,SACjCqG,GAAe,IAAML,EACrBM,GAAkBV,IAAS,CAAC3F,GAAMuC,KAAUvC,GAAK2F,GAAOpD,EAAK,EAC7DsB,GAAU,IACR+B,KAGJA,GAAYtF,GAAYlZ,GAAM2Y,GAAY,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EACjD6F,IAELU,EAAW,IAAMzQ,GAMjB0Q,GAAQ,IAAM,CAChBX,GAAY,KAGZ7F,GAAW,QAAQF,IAASA,GAAM,MAAO,CAAA,EAEpB,EAAE4F,GAAoBre,GAAK,OAASA,GAAK,SAE1D2d,GAAW3d,GAAMhI,EAASyW,EAAK,EAInC,MAAMqJ,GAAM,CAAE,KAAMsH,GAAa,MAAAjE,EAAO,KAAAnb,EAAI,EAC5C6e,GAAQ,QAAQpR,IAAUA,GAAOqK,EAAG,CAAC,CACjD,EAMcuH,GAAS,CAAC/E,GAAIgF,GAAcC,KAAmB,CAEjD,IAAIlF,GAAUiF,GAAa,SAAW,EAGtC,OAAAV,GAAQ,QAAQY,IAAU,CACAA,GAAO,CACzB,MAAArE,EACA,KAAMiE,GACN,QAASE,GACT,UAAWhF,GACX,eAAAiF,EACpB,CAAiB,IACqB,KAClBlF,GAAU,GAE9B,CAAa,EAGDqE,GAAa,QAAQe,IAAS,CAELA,GAAM,MAAMnF,EAAE,IACd,KACjBD,GAAU,GAE9B,CAAa,EAGD1B,GACK,OAAOF,IAAS,CAAC,CAACA,GAAM,QAAQ,UAAU,EAC1C,QAAQA,IAAS,CAEOA,GAAM,OACvB6B,GACA2D,EAA2BxF,GAAO6G,EAAY,EAC9CC,EACxB,IAEwBlF,GAAU,GAElC,CAAiB,EAGL1B,GAEK,QAAQ,CAACF,GAAOzhB,KAAU,CAEnByhB,GAAM,QAAQ,aAKlB2G,GAAY,YAAY3G,GAAM,QAASzhB,EAAK,EAG5CyhB,GAAM,MAAK,EAGXA,GAAM,OACF6B,GACA2D,EAA2BxF,GAAO6G,EAAY,EAC9CC,EACxB,EAGoBlF,GAAU,GAC9B,CAAiB,EAGLoE,GAAYpE,GAEZ8D,EAAa,CACT,MAAAhD,EACA,KAAMiE,GACN,QAASE,GACT,UAAWhF,EAC3B,CAAa,EAGMD,EACnB,EAEcqF,GAAW,IAAM,CACnBhB,GAAa,QAAQe,IAASA,GAAM,QAAS,CAAA,EAC7CX,GAAW,QAAQa,IAAa,CAC5BA,GAAU,CAAE,KAAMP,GAAa,MAAAjE,CAAO,CAAA,CACtD,CAAa,EACDxC,GAAW,QAAQF,IAASA,GAAM,SAAU,CAAA,CACxD,EAGcmH,GAAsB,CACxB,QAAS,CACL,IAAK5mB,EACR,EACD,MAAO,CACH,IAAKkmB,CACR,EACD,WAAY,CACR,IAAKH,EACR,CACb,EAGcc,GAAwB,CAC1B,GAAGD,GACH,KAAM,CACF,IAAKnD,EACR,EAGD,IAAK,CACD,IAAKuC,EACR,EAGD,GAAIc,IAAUxY,IAASwY,GACvB,YAAatH,GAAYxgB,CAAO,EAChC,gBAAiBinB,GAAgBV,CAAK,EACtC,SAAU3F,KACND,GAAW,KAAKC,EAAI,EACbA,IAEX,WAAYA,IAAQ,CAChBD,GAAW,OAAOA,GAAW,QAAQC,EAAI,EAAG,CAAC,CAChD,EACD,gBAAiBF,GAAgB1gB,EAAS2gB,EAAU,EACpD,gBAAiBE,GAAgB7gB,EAAS2gB,EAAU,EACpD,eAAgB6G,IAAUZ,GAAQ,KAAKY,EAAM,EAC7C,eAAgB/R,IAAUoR,GAAQ,KAAKpR,EAAM,EAC7C,kBAAmBkS,IAAab,GAAW,KAAKa,EAAS,EACzD,iBAAkB,IAAO3nB,EAAQ,iBAAmB,GAGpD,SAAUumB,EAAM,SAChB,MAAOA,EAAM,KACzB,EAGcwB,GAAwB,CAC1B,QAAS,CACL,IAAK/mB,EACR,EACD,WAAY,CACR,IAAK+lB,EACR,EACD,KAAM,CACF,IAAKtC,EACR,EACD,QAAS,CACL,IAAK,IAAMgC,EACd,EACD,cAAe,IAAML,EACrB,MAAAe,GACA,OAAAE,GACA,SAAAK,EACZ,EAGcM,GAAqB,CACvB,GAAGJ,GACH,KAAM,CACF,IAAK,IAAM5f,EACd,CACb,EAGQ,OAAO,KAAKse,CAAM,EACb,KAAK,CAAClsB,GAAGC,KAEFD,KAAM,SACC,EACAC,KAAM,SACN,GAEJ,CACV,EACA,QAAQ6D,IAAO,CACZ,MAAM+pB,GAAWvC,GAAOxnB,IAAK,CACzB,YAAaooB,EAAOpoB,IACpB,UAAWilB,EACX,UAAWrkB,GACX,gBAAiB+oB,GACjB,gBAAiBE,GACjB,KAAM9H,GAAa+H,EAAkB,CACzD,CAAiB,EAEGC,IACAvB,GAAa,KAAKuB,EAAQ,CAE9C,CAAa,EAGL,MAAMb,GAAcnH,GAAa4H,EAAqB,EAGtD9B,EAAO,CACH,KAAMqB,GACN,MAAAjE,CACZ,CAAS,EAGD,MAAM+E,GAAajH,GAAcjhB,CAAO,EACxC,OAAA2gB,GAAW,QAAQ,CAACF,GAAOzhB,KAAU,CACjCooB,GAAY,YAAY3G,GAAM,QAASyH,GAAalpB,EAAK,CACrE,CAAS,EAGDknB,EAAckB,EAAW,EAGlBnH,GAAa8H,EAAqB,CACjD,EAEMI,GAAgB,CAACtC,EAAMC,EAAOsC,EAAM,KAAO,CAC7C,MAAM9Y,EAAO,iBAGb,GAAI,OAAOA,GAAO,CACd,OAAOA,GAAM,QAAQ,KAAKuW,CAAI,EAC9B,OAAOvW,GAAM,QAAQ,KAAKwW,CAAK,EAC/B,MACH,CAED,OAAOxW,GAAQ,CACX,QAAS,CAACuW,CAAI,EACd,QAAS,CAACC,CAAK,CACvB,EAEI,MAAMuC,EAAU,OAAO/Y,GAEjBgZ,EAAW,IAAOF,EACxB,IAAIG,EAAO,KACPrnB,EAAK,KACLsnB,EAAc,KACdC,EAAa,KAEjB,MAAMC,EAAe,IAAM,CACnB,SAAS,QACTF,EAAc,IAAM,OAAO,WAAW,IAAMG,EAAK,YAAY,IAAG,CAAE,EAAGL,CAAQ,EAC7EG,EAAa,IAAM,OAAO,aAAavnB,CAAE,IAEzCsnB,EAAc,IAAM,OAAO,sBAAsBG,CAAI,EACrDF,EAAa,IAAM,OAAO,qBAAqBvnB,CAAE,EAE7D,EAEI,SAAS,iBAAiB,mBAAoB,IAAM,CAC5CunB,GAAYA,IAChBC,IACAC,EAAK,YAAY,IAAG,CAAE,CAC9B,CAAK,EAED,MAAMA,EAAOrG,GAAM,CAEfphB,EAAKsnB,EAAYG,CAAI,EAGhBJ,IACDA,EAAOjG,GAGX,MAAMsG,EAAQtG,EAAKiG,EAEfK,GAASN,IAMbC,EAAOjG,EAAMsG,EAAQN,EAGrBD,EAAQ,QAAQ,QAAQxC,GAAQA,EAAM,CAAA,EACtCwC,EAAQ,QAAQ,QAAQvC,GAASA,EAAMxD,CAAE,CAAC,EAClD,EAEI,OAAAoG,IACAC,EAAK,YAAY,IAAG,CAAE,EAEf,CACH,MAAO,IAAM,CACTF,EAAWvnB,CAAE,CAChB,CACT,CACA,EAEM2nB,GAAc,CAACC,EAAQhF,IAAO,CAAC,CAAE,KAAAiF,EAAM,MAAA5F,EAAO,QAAAlE,EAAU,CAAA,EAAI,UAAA+J,EAAW,eAAAzB,CAAc,IAAO,CAC9FtI,EACK,OAAOlV,GAAU+e,EAAO/e,EAAO,KAAK,EACpC,QAAQA,GACL+e,EAAO/e,EAAO,MAAM,CAAE,KAAAgf,EAAM,MAAA5F,EAAO,OAAQpZ,EAAO,KAAM,UAAAif,EAAW,eAAAzB,CAAc,CAAE,CAC/F,EACQzD,GACAA,EAAG,CAAE,KAAAiF,EAAM,MAAA5F,EAAO,QAAAlE,EAAS,UAAA+J,EAAW,eAAAzB,CAAc,CAAE,CAE9D,EAEM0B,GAAe,CAACC,EAASC,IAC3BA,EAAc,WAAW,aAAaD,EAASC,CAAa,EAE1DC,GAAc,CAACF,EAASC,IACnBA,EAAc,WAAW,aAAaD,EAASC,EAAc,WAAW,EAG7EE,GAAUnqB,GAAS,MAAM,QAAQA,CAAK,EAEtCqd,GAAUrd,GAASA,GAAS,KAE5BoqB,GAAOzvB,GAAOA,EAAI,OAElB0vB,GAAWrqB,GAAS,GAAKA,EAEzBsqB,GAAU,CAACtqB,EAAOuqB,EAAW,MAC3BlN,GAAQrd,CAAK,EACN,GAEPmqB,GAAQnqB,CAAK,EACNA,EAEJqqB,GAASrqB,CAAK,EAChB,MAAMuqB,CAAQ,EACd,IAAIH,EAAI,EACR,OAAOzvB,GAAOA,EAAI,MAAM,EAG3B6vB,GAAYxqB,GAAS,OAAOA,GAAU,UAEtCyqB,GAAYzqB,GAAUwqB,GAAUxqB,CAAK,EAAIA,EAAQA,IAAU,OAE3D0qB,GAAW1qB,GAAS,OAAOA,GAAU,SAErC2qB,GAAW3qB,GACb0iB,GAAS1iB,CAAK,EAAIA,EAAQ0qB,GAAS1qB,CAAK,EAAIqqB,GAASrqB,CAAK,EAAE,QAAQ,WAAY,EAAE,EAAI,EAEpF4qB,GAAQ5qB,GAAS,SAAS2qB,GAAS3qB,CAAK,EAAG,EAAE,EAE7C6qB,GAAU7qB,GAAS,WAAW2qB,GAAS3qB,CAAK,CAAC,EAE7C8qB,GAAQ9qB,GAAS0iB,GAAS1iB,CAAK,GAAK,SAASA,CAAK,GAAK,KAAK,MAAMA,CAAK,IAAMA,EAE7E+qB,GAAU,CAAC/qB,EAAOgrB,EAAO,MAAS,CAEpC,GAAIF,GAAM9qB,CAAK,EACX,OAAOA,EAIX,IAAIirB,EAAkBZ,GAASrqB,CAAK,EAAE,KAAI,EAG1C,MAAI,OAAO,KAAKirB,CAAe,GAC3BA,EAAkBA,EAAgB,QAAQ,OAAQ,EAAE,EAAE,OAC/CL,GAAMK,CAAe,EAAID,EAAOA,GAIvC,MAAM,KAAKC,CAAe,GAC1BA,EAAkBA,EAAgB,QAAQ,OAAQ,EAAE,EAAE,OAC/CL,GAAMK,CAAe,EAAID,GAG7BJ,GAAMK,CAAe,CAChC,EAEMC,GAAalrB,GAAS,OAAOA,GAAU,WAEvCmrB,GAAsBC,GAAU,CAClC,IAAI3D,EAAM,KACN4D,EAASD,EAAO,MAAM,GAAG,EACzBE,EAAQ,KACZ,KAAQA,EAAQD,EAAO,SAEnB,GADA5D,EAAMA,EAAI6D,GACN,CAAC7D,EACD,OAAO,KAGf,OAAOA,CACX,EAEM8D,GAAU,CACZ,QAAS,OACT,MAAO,QACP,OAAQ,SACR,MAAO,MACP,QAAS,MACT,KAAM,KACV,EAEMC,GAAkBC,GAAW,CAC/B,MAAM7K,EAAM,CAAA,EAEZ,OAAAA,EAAI,IAAM8J,GAASe,CAAO,EAAIA,EAAUA,EAAQ,KAAO,GACvD7K,EAAI,QAAU6K,EAAQ,QAAU,SAASA,EAAQ,QAAS,EAAE,EAAI,EAChE7K,EAAI,QAAU6K,EAAQ,QAAUA,EAAQ,QAAU,GAElD3K,GAAMyK,GAASvsB,GAAO,CAClB4hB,EAAI5hB,GAAO0sB,GAAa1sB,EAAKysB,EAAQzsB,GAAMusB,GAAQvsB,GAAM4hB,EAAI,QAASA,EAAI,OAAO,CACzF,CAAK,EAGDA,EAAI,QAAU6K,EAAQ,SAAWf,GAASe,CAAO,GAAKA,EAAQ,IAAM7K,EAAI,QAAU,KAGlFA,EAAI,OAAS6K,EAAQ,QAAU,KAG/B,OAAO7K,EAAI,QAEJA,CACX,EAEM8K,GAAe,CAACtb,EAAMqb,EAAS1T,EAAQxU,EAASooB,IAAY,CAE9D,GAAIF,IAAY,KACZ,OAAO,KAIX,GAAI,OAAOA,GAAY,WACnB,OAAOA,EAIX,MAAM5gB,EAAS,CACX,IAAKkN,IAAW,OAASA,IAAW,QAAU,IAAI3H,KAAU,GAC5D,OAAA2H,EACA,QAAA4T,EACA,gBAAiB,GACjB,QAAApoB,EACA,OAAQ,KACR,OAAQ,KACR,QAAS,IACjB,EAGI,GAAImnB,GAASe,CAAO,EAChB,OAAA5gB,EAAO,IAAM4gB,EACN5gB,EAOX,GAHA,OAAO,OAAOA,EAAQ4gB,CAAO,EAGzBf,GAAS7f,EAAO,OAAO,EAAG,CAC1B,MAAM+gB,EAAQ/gB,EAAO,QAAQ,MAAM,OAAO,EAC1CA,EAAO,QAAU,CACb,OAAQ+gB,EAAM,GACd,MAAOA,EAAM,EACzB,CACK,CAGD,OAAA/gB,EAAO,gBAAkB4f,GAAU5f,EAAO,eAAe,EAElDA,CACX,EAEMghB,GAAc7rB,GAASwrB,GAAgBxrB,CAAK,EAE5C8rB,GAAS9rB,GAASA,IAAU,KAE5B+rB,GAAW/rB,GAAS,OAAOA,GAAU,UAAYA,IAAU,KAE3DgsB,GAAQhsB,GAEN+rB,GAAS/rB,CAAK,GACd0qB,GAAS1qB,EAAM,GAAG,GAClB+rB,GAAS/rB,EAAM,OAAO,GACtB+rB,GAAS/rB,EAAM,MAAM,GACrB+rB,GAAS/rB,EAAM,OAAO,GACtB+rB,GAAS/rB,EAAM,KAAK,EAItB+G,GAAU/G,GACRmqB,GAAQnqB,CAAK,EACN,QAGP8rB,GAAO9rB,CAAK,EACL,OAGP8qB,GAAM9qB,CAAK,EACJ,MAGP,2BAA2B,KAAKA,CAAK,EAC9B,QAGPgsB,GAAMhsB,CAAK,EACJ,MAGJ,OAAOA,EAGZisB,GAAsBtxB,GACxBA,EACK,QAAQ,SAAU,IAAI,EACtB,QAAQ,SAAU,IAAI,EACtB,QAAQ,SAAU,IAAI,EACtB,QAAQ,SAAU,IAAI,EACtB,QAAQ,SAAU,IAAI,EACtB,QAAQ,SAAU,IAAI,EAEzBuxB,GAAkB,CACpB,MAAO5B,GACP,QAASG,GACT,IAAKzqB,GAAU+G,GAAQ/G,CAAK,IAAM,QAAU+qB,GAAQ/qB,CAAK,EAAI4qB,GAAM5qB,CAAK,EACxE,OAAQ6qB,GACR,MAAOA,GACP,MAAOE,GACP,OAAQ/qB,GAAUkrB,GAAWlrB,CAAK,EAAIA,EAAQqqB,GAASrqB,CAAK,EAC5D,SAAUA,GAASmrB,GAAoBnrB,CAAK,EAC5C,UAAW6rB,GACX,OAAQ7rB,GAAS,CACb,GAAI,CACA,OAAO,KAAK,MAAMisB,GAAoBjsB,CAAK,CAAC,CAC/C,MAAC,CACE,OAAO,IACV,CACJ,CACL,EAEMmsB,GAAY,CAACnsB,EAAO6G,IAASqlB,GAAgBrlB,GAAM7G,CAAK,EAExDosB,GAAiB,CAAC/kB,EAAUglB,EAAcC,IAAc,CAE1D,GAAIjlB,IAAaglB,EACb,OAAOhlB,EAIX,IAAIklB,EAAexlB,GAAQM,CAAQ,EAGnC,GAAIklB,IAAiBD,EAAW,CAE5B,MAAME,EAAiBL,GAAU9kB,EAAUilB,CAAS,EAMpD,GAHAC,EAAexlB,GAAQylB,CAAc,EAGjCA,IAAmB,KACnB,KAAM,kDAAkD,2BAA2BF,KAEnFjlB,EAAWmlB,CAElB,CAGD,OAAOnlB,CACX,EAEMolB,GAAe,CAACJ,EAAcC,IAAc,CAC9C,IAAII,EAAeL,EACnB,MAAO,CACH,WAAY,GACZ,IAAK,IAAMK,EACX,IAAKrlB,GAAY,CACbqlB,EAAeN,GAAe/kB,EAAUglB,EAAcC,CAAS,CAClE,CACT,CACA,EAEMK,GAAgBnrB,GAAW,CAC7B,MAAMvC,EAAM,CAAA,EACZ,OAAA6hB,GAAMtf,EAAStC,GAAQ,CACnB,MAAM0tB,EAAmBprB,EAAQtC,GACjCD,EAAIC,GAAQutB,GAAaG,EAAiB,GAAIA,EAAiB,EAAE,CACzE,CAAK,EACM7L,GAAa9hB,CAAG,CAC3B,EAEM4tB,GAAqBrrB,IAAY,CAEnC,MAAO,CAAE,EAGT,kBAAmB,KAGnB,kBAAmB,KAGnB,gBAAiB,CAAE,EAGnB,QAASmrB,GAAcnrB,CAAO,CAClC,GAEMsrB,GAAa,CAAC1B,EAAQ5kB,EAAY,MACpC4kB,EACK,MAAM,WAAW,EACjB,IAAI2B,GAAQA,EAAK,aAAa,EAC9B,KAAKvmB,CAAS,EAEjBwmB,GAAkB,CAAC3F,EAAO7lB,IAAY,CACxC,MAAMvC,EAAM,CAAA,EACZ,OAAA6hB,GAAMtf,EAASxC,GAAO,CAClBC,EAAID,GAAO,CACP,IAAK,IAAMqoB,EAAM,SAAQ,EAAG,QAAQroB,GACpC,IAAKgB,GAAS,CACVqnB,EAAM,SAAS,OAAOyF,GAAW9tB,EAAK,GAAG,EAAE,YAAa,IAAI,CACxD,MAAAgB,CACpB,CAAiB,CACJ,CACb,CACA,CAAK,EACMf,CACX,EAEMguB,GAAsBzrB,GAAW,CAAC8e,EAAUG,EAAO7gB,IAAU,CAC/D,MAAMX,EAAM,CAAA,EACZ,OAAA6hB,GAAMtf,EAASxC,GAAO,CAClB,MAAMoR,EAAO0c,GAAW9tB,EAAK,GAAG,EAAE,YAAW,EAE7CC,EAAI,OAAOmR,KAAUvF,GAAU,CAC3B,GAAI,CACAjL,EAAM,QAAQZ,GAAO6L,EAAO,KAC/B,MAAC,CAED,CAGDyV,EAAS,WAAWlQ,IAAQ,CAAE,MAAOxQ,EAAM,QAAQZ,EAAI,CAAE,CACrE,CACA,CAAK,EACMC,CACX,EAEMiuB,GAAsB1rB,GAAW5B,GAAS,CAC5C,MAAMX,EAAM,CAAA,EACZ,OAAA6hB,GAAMtf,EAASxC,GAAO,CAClBC,EAAI,OAAO6tB,GAAW9tB,EAAK,GAAG,EAAE,iBAAmB6L,GAAUjL,EAAM,QAAQZ,EACnF,CAAK,EACMC,CACX,EAEMkuB,GAAoB,CACtB,IAAK,EACL,KAAM,EACN,OAAQ,EACR,MAAO,EACP,KAAM,CACV,EAEMC,GAAc,IAChB,KAAK,OAAQ,EACR,SAAS,EAAE,EACX,UAAU,EAAG,EAAE,EAElBC,GAAc,CAACC,EAAKxtB,IAAUwtB,EAAI,OAAOxtB,EAAO,CAAC,EAEjDytB,GAAM,CAACvgB,EAAIwgB,IAAS,CAClBA,EACAxgB,IACO,SAAS,OAChB,QAAQ,QAAQ,CAAC,EAAE,KAAKA,CAAE,EAE1B,WAAWA,EAAI,CAAC,CAExB,EAEMygB,GAAK,IAAM,CACb,MAAM3I,EAAY,CAAA,EACZ4I,EAAM,CAACrrB,EAAO2K,IAAO,CACvBqgB,GACIvI,EACAA,EAAU,UAAU6I,GAAYA,EAAS,QAAUtrB,IAAUsrB,EAAS,KAAO3gB,GAAM,CAACA,EAAG,CACnG,CACA,EACU4gB,EAAO,CAACvrB,EAAOqe,EAAM8M,IAAS,CAChC1I,EACK,OAAO6I,GAAYA,EAAS,QAAUtrB,CAAK,EAC3C,IAAIsrB,GAAYA,EAAS,EAAE,EAC3B,QAAQ3gB,GAAMugB,GAAI,IAAMvgB,EAAG,GAAG0T,CAAI,EAAG8M,CAAI,CAAC,CACvD,EACI,MAAO,CACH,SAAU,CAACnrB,KAAUqe,IAAS,CAC1BkN,EAAKvrB,EAAOqe,EAAM,EAAI,CACzB,EACD,KAAM,CAACre,KAAUqe,IAAS,CACtBkN,EAAKvrB,EAAOqe,EAAM,EAAK,CAC1B,EACD,GAAI,CAACre,EAAO2K,IAAO,CACf8X,EAAU,KAAK,CAAE,MAAAziB,EAAO,GAAA2K,CAAI,CAAA,CAC/B,EACD,OAAQ,CAAC3K,EAAO2K,IAAO,CACnB8X,EAAU,KAAK,CACX,MAAAziB,EACA,GAAI,IAAIqe,IAAS,CACbgN,EAAIrrB,EAAO2K,CAAE,EACbA,EAAG,GAAG0T,CAAI,CACb,CACjB,CAAa,CACJ,EACD,IAAAgN,CACR,CACA,EAEMG,GAA+B,CAACzX,EAAKxU,EAAQksB,IAAa,CAC5D,OAAO,oBAAoB1X,CAAG,EACzB,OAAOzU,GAAY,CAACmsB,EAAS,SAASnsB,CAAQ,CAAC,EAC/C,QAAQ3C,GACL,OAAO,eAAe4C,EAAQ5C,EAAK,OAAO,yBAAyBoX,EAAKpX,CAAG,CAAC,CACxF,CACA,EAEM+uB,GAAU,CACZ,OACA,UACA,SACA,OACA,KACA,MACA,SACA,YACA,SACA,UACA,WACA,UACA,WACA,oBACA,QACJ,EAEMC,GAAgBrgB,GAAQ,CAC1B,MAAMiT,EAAM,CAAA,EACZ,OAAAiN,GAA6BlgB,EAAMiT,EAAKmN,EAAO,EACxCnN,CACX,EAEMqN,GAAsBnd,GAAS,CACjCA,EAAM,QAAQ,CAACnD,EAAM7N,IAAU,CACvB6N,EAAK,UACL0f,GAAYvc,EAAOhR,CAAK,CAEpC,CAAK,CACL,EAEMouB,GAAa,CACf,KAAM,EACN,KAAM,EACN,kBAAmB,EACnB,WAAY,EACZ,oBAAqB,EACrB,iBAAkB,EAClB,wBAAyB,GACzB,QAAS,EACT,WAAY,CAChB,EAEMC,GAAa,CACf,MAAO,EACP,MAAO,EACP,MAAO,CACX,EAEMC,GAAgBzzB,GAAO,UAAU,KAAKA,CAAG,EAEzC0zB,GAAsB,IAAMD,GAAe,KAAK,eAAgB,CAAA,EAAE,GAElEE,GAAwB,IAAM,CAGhC,MAAMC,EAAmBF,KACnBG,EAAgC,KAAQ,iBACxCC,EAAmC,KAAQ,WACjD,OAAID,IAAiCC,EAC1BL,GAAcI,CAA4B,EAAE,GAEhDD,IAAqB,IAAM,IAAM,GAC5C,EAEMG,EAAO,CACT,QAAS,UACT,IAAK,MACL,OAAQ,SACR,OAAQ,SACR,MAAO,QACP,OAAQ,SACR,SAAU,WACV,OAAQ,SACR,WAAY,YACZ,MAAO,OACX,EAGMC,GAAU,CAAA,EAGVC,GAAmB,CAAC5vB,EAAKgB,EAAO6uB,IAClC,IAAI,QAAQ,CAACC,EAASC,IAAW,CAE7B,MAAMC,EAAkBL,GAAQ,OAAOpzB,GAAKA,EAAE,MAAQyD,CAAG,EAAE,IAAIzD,GAAKA,EAAE,EAAE,EAGxE,GAAIyzB,EAAgB,SAAW,EAAG,CAC9BF,EAAQ9uB,CAAK,EACb,MACH,CAGD,MAAMivB,EAAgBD,EAAgB,QAGtCA,EACK,OAEG,CAACtpB,EAAS0G,IAAS1G,EAAQ,KAAK1F,GAASoM,EAAKpM,EAAO6uB,CAAK,CAAC,EAG3DI,EAAcjvB,EAAO6uB,CAAK,CAG7B,EACA,KAAK7uB,GAAS8uB,EAAQ9uB,CAAK,CAAC,EAC5B,MAAM6Z,GAASkV,EAAOlV,CAAK,CAAC,CACzC,CAAK,EAECqV,GAAe,CAAClwB,EAAKgB,EAAO6uB,IAC9BF,GAAQ,OAAOpzB,GAAKA,EAAE,MAAQyD,CAAG,EAAE,IAAIzD,GAAKA,EAAE,GAAGyE,EAAO6uB,CAAK,CAAC,EAG5DM,GAAY,CAACnwB,EAAKgO,IAAO2hB,GAAQ,KAAK,CAAE,IAAA3vB,EAAK,GAAAgO,CAAE,CAAE,EAEjDoiB,GAAuBC,GAAqB,OAAO,OAAOC,GAAgBD,CAAiB,EAE3FE,GAAa,KAAO,CAAE,GAAGD,EAAc,GAEvCE,GAAaC,GAAQ,CACvB3O,GAAM2O,EAAM,CAACzwB,EAAKgB,IAAU,CAEpB,CAACsvB,GAAetwB,KAGpBswB,GAAetwB,GAAK,GAAKotB,GACrBpsB,EACAsvB,GAAetwB,GAAK,GACpBswB,GAAetwB,GAAK,EAChC,EACA,CAAK,CACL,EAGMswB,GAAiB,CAEnB,GAAI,CAAC,KAAMZ,EAAK,MAAM,EAGtB,KAAM,CAAC,WAAYA,EAAK,MAAM,EAG9B,SAAU,CAAC,GAAOA,EAAK,OAAO,EAG9B,UAAW,CAAC,KAAMA,EAAK,MAAM,EAG7B,SAAU,CAAC,GAAOA,EAAK,OAAO,EAG9B,cAAe,CAAC,KAAMA,EAAK,MAAM,EAMjC,yBAA0B,CAAC,GAAMA,EAAK,OAAO,EAG7C,UAAW,CAAC,GAAMA,EAAK,OAAO,EAC9B,YAAa,CAAC,GAAMA,EAAK,OAAO,EAChC,WAAY,CAAC,GAAMA,EAAK,OAAO,EAC/B,cAAe,CAAC,GAAOA,EAAK,OAAO,EACnC,aAAc,CAAC,GAAMA,EAAK,OAAO,EACjC,YAAa,CAAC,GAAMA,EAAK,OAAO,EAChC,YAAa,CAAC,GAAMA,EAAK,OAAO,EAChC,aAAc,CAAC,GAAMA,EAAK,OAAO,EACjC,aAAc,CAAC,GAAOA,EAAK,OAAO,EAClC,qBAAsB,CAAC,GAAOA,EAAK,OAAO,EAG1C,YAAa,CAAC,GAAOA,EAAK,OAAO,EAGjC,YAAa,CAAC,GAAOA,EAAK,OAAO,EAGjC,SAAU,CAAC,KAAMA,EAAK,GAAG,EACzB,cAAe,CAAC,GAAOA,EAAK,OAAO,EAGnC,0BAA2B,CAAC,GAAMA,EAAK,OAAO,EAC9C,mBAAoB,CAAC,SAAUA,EAAK,MAAM,EAC1C,mBAAoB,CAAC,GAAIA,EAAK,GAAG,EAGjC,WAAY,CAAC,GAAOA,EAAK,OAAO,EAChC,cAAe,CAAC,GAAMA,EAAK,OAAO,EAClC,eAAgB,CAAC,GAAOA,EAAK,OAAO,EACpC,aAAc,CAAC,CAAC,YAAa,YAAa,aAAa,EAAGA,EAAK,KAAK,EAGpE,cAAe,CAAC,GAAMA,EAAK,OAAO,EAClC,mBAAoB,CAAC,EAAGA,EAAK,GAAG,EAChC,2BAA4B,CAAC,GAAMA,EAAK,OAAO,EAG/C,aAAc,CAAC,GAAOA,EAAK,OAAO,EAClC,WAAY,CAAC,GAAOA,EAAK,OAAO,EAChC,UAAW,CAAC,IAASA,EAAK,GAAG,EAC7B,iBAAkB,CAAC,CAAC,IAAK,IAAM,GAAI,EAAGA,EAAK,KAAK,EAGhD,OAAQ,CAAC,KAAMA,EAAK,UAAU,EAG9B,aAAc,CAAC,IAAMA,EAAK,GAAG,EAG7B,mBAAoB,CAAC,QAASA,EAAK,MAAM,EACzC,uBAAwB,CAAC,KAAMA,EAAK,MAAM,EAC1C,uBAAwB,CAAC,KAAMA,EAAK,MAAM,EAC1C,uBAAwB,CAAC,KAAMA,EAAK,MAAM,EAE1C,sBAAuB,CAACL,KAAuBK,EAAK,MAAM,EAC1D,wBAAyB,CAACJ,KAAyBI,EAAK,MAAM,EAE9D,UAAW,CACP,+EACAA,EAAK,MACR,EACD,kBAAmB,CAAC,+BAAgCA,EAAK,MAAM,EAC/D,wBAAyB,CAAC,mBAAoBA,EAAK,MAAM,EACzD,0BAA2B,CAAC,qBAAsBA,EAAK,MAAM,EAC7D,uBAAwB,CAAC,eAAgBA,EAAK,MAAM,EACpD,qBAAsB,CAAC,gBAAiBA,EAAK,MAAM,EACnD,iBAAkB,CAAC,UAAWA,EAAK,MAAM,EACzC,eAAgB,CAAC,QAASA,EAAK,MAAM,EACrC,mBAAoB,CAAC,oBAAqBA,EAAK,MAAM,EACrD,iBAAkB,CAAC,UAAWA,EAAK,MAAM,EACzC,qBAAsB,CAAC,sBAAuBA,EAAK,MAAM,EACzD,oBAAqB,CAAC,YAAaA,EAAK,MAAM,EAC9C,4BAA6B,CAAC,kBAAmBA,EAAK,MAAM,EAC5D,2BAA4B,CAAC,mBAAoBA,EAAK,MAAM,EAC5D,yBAA0B,CAAC,sBAAuBA,EAAK,MAAM,EAC7D,+BAAgC,CAAC,sBAAuBA,EAAK,MAAM,EAEnE,iBAAkB,CAAC,gBAAiBA,EAAK,MAAM,EAC/C,gBAAiB,CAAC,eAAgBA,EAAK,MAAM,EAC7C,eAAgB,CAAC,cAAeA,EAAK,MAAM,EAE3C,sBAAuB,CAAC,SAAUA,EAAK,MAAM,EAC7C,yBAA0B,CAAC,QAASA,EAAK,MAAM,EAC/C,yBAA0B,CAAC,QAASA,EAAK,MAAM,EAC/C,+BAAgC,CAAC,SAAUA,EAAK,MAAM,EACtD,8BAA+B,CAAC,OAAQA,EAAK,MAAM,EACnD,+BAAgC,CAAC,QAASA,EAAK,MAAM,EACrD,uBAAwB,CAAC,SAAUA,EAAK,MAAM,EAG9C,WAAY,CACR,6UACAA,EAAK,MACR,EACD,YAAa,CACT,yTACAA,EAAK,MACR,EACD,UAAW,CACP,8YACAA,EAAK,MACR,EACD,SAAU,CACN,kZACAA,EAAK,MACR,EACD,SAAU,CACN,oQACAA,EAAK,MACR,EAGD,OAAQ,CAAC,KAAMA,EAAK,QAAQ,EAC5B,UAAW,CAAC,KAAMA,EAAK,QAAQ,EAC/B,QAAS,CAAC,KAAMA,EAAK,QAAQ,EAC7B,eAAgB,CAAC,KAAMA,EAAK,QAAQ,EACpC,WAAY,CAAC,KAAMA,EAAK,QAAQ,EAChC,eAAgB,CAAC,KAAMA,EAAK,QAAQ,EACpC,kBAAmB,CAAC,KAAMA,EAAK,QAAQ,EACvC,UAAW,CAAC,KAAMA,EAAK,QAAQ,EAC/B,mBAAoB,CAAC,KAAMA,EAAK,QAAQ,EACxC,sBAAuB,CAAC,KAAMA,EAAK,QAAQ,EAC3C,mBAAoB,CAAC,KAAMA,EAAK,QAAQ,EACxC,oBAAqB,CAAC,KAAMA,EAAK,QAAQ,EACzC,cAAe,CAAC,KAAMA,EAAK,QAAQ,EACnC,eAAgB,CAAC,KAAMA,EAAK,QAAQ,EACpC,aAAc,CAAC,KAAMA,EAAK,QAAQ,EAClC,cAAe,CAAC,KAAMA,EAAK,QAAQ,EACnC,cAAe,CAAC,KAAMA,EAAK,QAAQ,EACnC,eAAgB,CAAC,KAAMA,EAAK,QAAQ,EAGpC,eAAgB,CAAC,KAAMA,EAAK,QAAQ,EACpC,cAAe,CAAC,KAAMA,EAAK,QAAQ,EACnC,iBAAkB,CAAC,KAAMA,EAAK,QAAQ,EACtC,kBAAmB,CAAC,KAAMA,EAAK,QAAQ,EAGvC,iBAAkB,CAAC,KAAMA,EAAK,MAAM,EACpC,sBAAuB,CAAC,KAAMA,EAAK,MAAM,EACzC,0BAA2B,CAAC,KAAMA,EAAK,MAAM,EAC7C,8BAA+B,CAAC,OAAQA,EAAK,MAAM,EACnD,+BAAgC,CAAC,QAASA,EAAK,MAAM,EACrD,2BAA4B,CAAC,QAASA,EAAK,MAAM,EACjD,+BAAgC,CAAC,QAASA,EAAK,MAAM,EACrD,2BAA4B,CAAC,GAAOA,EAAK,OAAO,EAGhD,MAAO,CAAC,CAAA,EAAIA,EAAK,KAAK,EAGtB,QAAS,CAAC,CAAC,oBAAqB,kBAAkB,EAAGA,EAAK,KAAK,CACnE,EAEMgB,GAAiB,CAAC5e,EAAO2P,IAEvBpD,GAAQoD,CAAK,EACN3P,EAAM,IAAM,KAInBga,GAAMrK,CAAK,EACJ3P,EAAM2P,IAAU,MAIvB,OAAOA,GAAU,WACjBA,EAAQA,EAAM,IAIX3P,EAAM,KAAKnD,GAAQA,EAAK,KAAO8S,CAAK,GAAK,MAG9CkP,GAAkCC,GAAe,CACnD,GAAIvS,GAAQuS,CAAW,EACnB,OAAOA,EAEX,GAAI,IAAI,KAAKA,CAAW,EAAG,CACvB,MAAMhE,EAAQgE,EAAY,MAAM,GAAG,EACnC,OAAOhE,EAAM,GAAKA,EAAM,EAC3B,CACD,OAAO,WAAWgE,CAAW,CACjC,EAEMC,GAAiB/e,GAASA,EAAM,OAAOnD,GAAQ,CAACA,EAAK,QAAQ,EAE7DmiB,GAAS,CACX,MAAO,EACP,KAAM,EACN,MAAO,EACP,KAAM,EACN,MAAO,CACX,EAEA,IAAI9V,GAAM,KACV,MAAM+V,GAAqB,IAAM,CAC7B,GAAI/V,KAAQ,KACR,GAAI,CACA,MAAMgW,EAAe,IAAI,aACzBA,EAAa,MAAM,IAAI,IAAI,KAAK,CAAC,aAAa,EAAG,gBAAgB,CAAC,EAClE,MAAM/vB,EAAK,SAAS,cAAc,OAAO,EACzCA,EAAG,aAAa,OAAQ,MAAM,EAC9BA,EAAG,MAAQ+vB,EAAa,MACxBhW,GAAM/Z,EAAG,MAAM,SAAW,CAC7B,MAAC,CACE+Z,GAAM,EACT,CAEL,OAAOA,EACX,EAEMiW,GAAa,CACf/B,GAAW,WACXA,GAAW,iBACXA,GAAW,uBACf,EACMgC,GAAY,CACdhC,GAAW,QACXA,GAAW,WACXA,GAAW,kBACXA,GAAW,IACf,EACMiC,GAAa,CAACjC,GAAW,mBAAmB,EAE5CkC,GAAqBziB,GAAQsiB,GAAW,SAAStiB,EAAK,MAAM,EAC5D0iB,GAAoB1iB,GAAQuiB,GAAU,SAASviB,EAAK,MAAM,EAC1D2iB,GAAqB3iB,GAAQwiB,GAAW,SAASxiB,EAAK,MAAM,EAE5D4iB,GAAU3wB,GACZmsB,GAASnsB,EAAM,QAAQ,MAAM,IAC5BmsB,GAASnsB,EAAM,QAAQ,OAAO,OAAO,GAAKsrB,GAAWtrB,EAAM,QAAQ,OAAO,OAAO,GAEhFkgB,GAAUlgB,IAAU,CACtB,WAAY,IAAM,CACd,MAAMkR,EAAQ+e,GAAejwB,EAAM,KAAK,EAElC,CAAE,MAAA4wB,EAAO,MAAAC,EAAO,KAAAC,EAAM,KAAAC,EAAM,MAAAC,CAAO,EAAGd,GAE5C,OAAIhf,EAAM,SAAW,EAAU0f,EAE3B1f,EAAM,KAAKsf,EAAkB,EAAUK,EAEvC3f,EAAM,KAAKuf,EAAiB,EAAUK,EAEtC5f,EAAM,KAAKwf,EAAkB,EAAUM,EAEpCD,CACV,EAED,SAAUlQ,GAASiP,GAAe9vB,EAAM,MAAO6gB,CAAK,EAEpD,gBAAiBA,GAASiP,GAAeG,GAAejwB,EAAM,KAAK,EAAG6gB,CAAK,EAE3E,iBAAkB,IAAMoP,GAAejwB,EAAM,KAAK,EAElD,UAAW,IAAMA,EAAM,MAEvB,cAAe6gB,GAAS,CACpB,MAAM9S,EAAO+hB,GAAe9vB,EAAM,MAAO6gB,CAAK,EAC9C,OAAO9S,EAAOA,EAAK,SAAW,IACjC,EAED,cAAe8S,GAAS,CACpB,MAAM9S,EAAO+hB,GAAe9vB,EAAM,MAAO6gB,CAAK,EAC9C,OAAO9S,EAAOA,EAAK,SAAW,IACjC,EAED,WAAY,IACR,OAAO,KAAK/N,EAAM,OAAO,EACpB,OAAOZ,GAAO,SAAS,KAAKA,CAAG,CAAC,EAChC,IAAI6xB,IAAW,CACZ,KAAMA,EACN,MAAOjxB,EAAM,QAAQixB,EACrC,EAAc,EAEV,uBAAwB,IACE,SAAS,KAAKjxB,EAAM,QAAQ,gBAAgB,EAE5D,EACA+vB,GAAgC/vB,EAAM,QAAQ,qBAAqB,EAI7E,4BAA6B,IAAMA,EAAM,QAAQ,0BAEjD,oBAAqBkxB,GACjBjB,GAAejwB,EAAM,KAAK,EAAE,OAAO+N,GAAQA,EAAK,SAAWmjB,CAAM,EAErE,gBAAiB,IAAMjB,GAAejwB,EAAM,KAAK,EAAE,OAEnD,yBAA0B,IACtBA,EAAM,QAAQ,aAAemwB,GAAkB,GAAM,CAACQ,GAAQ3wB,CAAK,EAEvE,SAAU,IAAM2wB,GAAQ3wB,CAAK,EAE7B,qBAAsB6gB,IAAU,CAC5B,WAAYA,EAAM,2BAA2B,GAAK,OAClD,eAAgBA,EAAM,+BAA+B,GAAK,OAC1D,eAAgBA,EAAM,+BAA+B,GAAK,OAC1D,eAAgBA,EAAM,+BAA+B,GAAK,MAClE,EACA,GAEMsQ,GAAiBnxB,GAAS,CAC5B,MAAMuG,EAAQ0pB,GAAejwB,EAAM,KAAK,EAAE,OAG1C,GAAI,CAACA,EAAM,QAAQ,cACf,OAAOuG,IAAU,EAIrB,MAAM6qB,EAAepxB,EAAM,QAAQ,SAMnC,OALIoxB,IAAiB,MAKjB7qB,EAAQ6qB,CAMhB,EAEMxU,GAAQ,CAACxc,EAAO2J,EAAKsnB,IAAQ,KAAK,IAAI,KAAK,IAAIA,EAAKjxB,CAAK,EAAG2J,CAAG,EAE/DunB,GAAc,CAAC5D,EAAKxtB,EAAO6N,IAAS2f,EAAI,OAAOxtB,EAAO,EAAG6N,CAAI,EAE7DwjB,GAAa,CAACrgB,EAAOnD,EAAM7N,IACzBud,GAAQ1P,CAAI,EACL,KAIP,OAAO7N,EAAU,KACjBgR,EAAM,KAAKnD,CAAI,EACRA,IAIX7N,EAAQ0c,GAAM1c,EAAO,EAAGgR,EAAM,MAAM,EAGpCogB,GAAYpgB,EAAOhR,EAAO6N,CAAI,EAGvBA,GAGLyjB,GAAkBz2B,GACpB,4GAA4G,KACxGA,CACR,EAEM02B,GAAqBpuB,GACvB,GAAGA,IACE,MAAM,GAAG,EACT,IAAK,EACL,MAAM,GAAG,EACT,QAEHquB,GAA2BlhB,GAAQA,EAAK,MAAM,GAAG,EAAE,MAEnDmhB,GAAuB1qB,GAAQ,CAEjC,GAAI,OAAOA,GAAS,SAChB,MAAO,GAIX,MAAM2qB,EAAU3qB,EAAK,MAAM,GAAG,EAAE,IAAG,EAGnC,MAAI,MAAM,KAAK2qB,CAAO,EACX,MAGP,iBAAiB,KAAKA,CAAO,EACtB,MAGP,QAAQ,KAAKA,CAAO,EACb,MAGP,SAAS,KAAKA,CAAO,EACd,MAIP,SAAS,KAAKA,CAAO,EAEjBA,IAAY,OACL,MAIJA,EAGJ,EACX,EAEMC,GAAU,CAACzxB,EAAO0xB,EAAU,MAAQA,EAAU1xB,GAAO,MAAM,CAAC0xB,EAAQ,MAAM,EAE1EC,GAAgB,CAAC/tB,EAAO,IAAI,OAC9B,GAAGA,EAAK,YAAa,KAAI6tB,GAAQ7tB,EAAK,SAAU,EAAG,EAAG,IAAI,KAAK6tB,GAC3D7tB,EAAK,QAAS,EACd,IACH,KAAI6tB,GAAQ7tB,EAAK,SAAQ,EAAI,IAAI,KAAK6tB,GAAQ7tB,EAAK,WAAU,EAAI,IAAI,KAAK6tB,GACvE7tB,EAAK,WAAY,EACjB,IACH,IAECguB,GAAkB,CAAC1b,EAAM2b,EAAUhrB,EAAO,KAAMyP,EAAY,OAAS,CACvE,MAAMqB,EACF,OAAO9Q,GAAS,SACVqP,EAAK,MAAM,EAAGA,EAAK,KAAMrP,CAAI,EAC7BqP,EAAK,MAAM,EAAGA,EAAK,KAAMA,EAAK,IAAI,EAC5C,OAAAyB,EAAK,iBAAmB,IAAI,KAGxBzB,EAAK,gBAAeyB,EAAK,cAAgBzB,EAAK,eAG7CwU,GAASmH,CAAQ,IAClBA,EAAWF,GAAa,GAIxBE,GAAYvb,IAAc,MAAQgb,GAAyBO,CAAQ,EACnEla,EAAK,KAAOka,GAEZvb,EAAYA,GAAaib,GAAqB5Z,EAAK,IAAI,EACvDA,EAAK,KAAOka,GAAYvb,EAAY,IAAMA,EAAY,KAGnDqB,CACX,EAEMma,GAAiB,IACX,OAAO,YACX,OAAO,aACP,OAAO,mBACP,OAAO,gBACP,OAAO,cAGTC,GAAa,CAACC,EAAaC,IAAa,CAC1C,MAAMC,EAAKJ,KAEX,GAAII,EAAI,CACJ,MAAMC,EAAK,IAAID,EACf,OAAAC,EAAG,OAAOH,CAAW,EACdG,EAAG,QAAQF,CAAQ,CAC7B,CAED,OAAO,IAAI,KAAK,CAACD,CAAW,EAAG,CAC3B,KAAMC,CACd,CAAK,CACL,EAEMG,GAAoC,CAACC,EAAYJ,IAAa,CAChE,MAAMK,EAAK,IAAI,YAAYD,EAAW,MAAM,EACtCE,EAAK,IAAI,WAAWD,CAAE,EAE5B,QAAS52B,EAAI,EAAGA,EAAI22B,EAAW,OAAQ32B,IACnC62B,EAAG72B,GAAK22B,EAAW,WAAW32B,CAAC,EAGnC,OAAOq2B,GAAWO,EAAIL,CAAQ,CAClC,EAEMO,GAA+BC,IACzB,cAAc,KAAKA,CAAO,GAAK,IAAI,IAAM,KAG/CC,GAAiCD,GAEtBA,EAAQ,MAAM,GAAG,EAAE,GAGpB,QAAQ,MAAO,EAAE,EAG3BE,GAAiCF,GAC5B,KAAKC,GAA+BD,CAAO,CAAC,EAGjDG,GAA2BH,GAAW,CACxC,MAAMR,EAAWO,GAA6BC,CAAO,EAC/CJ,EAAaM,GAA+BF,CAAO,EAEzD,OAAOL,GAAkCC,EAAYJ,CAAQ,CACjE,EAEMY,GAA2B,CAACJ,EAASZ,EAAUvb,IAC1Csb,GAAgBgB,GAAyBH,CAAO,EAAGZ,EAAU,KAAMvb,CAAS,EAGjFwc,GAAwBzlB,GAAU,CAEpC,GAAI,CAAC,yBAAyB,KAAKA,CAAM,EAAG,OAAO,KAGnD,MAAM0lB,EAAU1lB,EACX,MAAM,2BAA2B,EACjC,OAAO,CAAC,EACR,IAAI+C,GAAQA,EAAK,KAAM,EAAC,QAAQ,qBAAsB,EAAE,CAAC,EACzD,OAAOA,GAAQA,EAAK,MAAM,EAE/B,OAAO2iB,EAAQ,OAAS,UAAUA,EAAQA,EAAQ,OAAS,EAAE,EAAI,IACrE,EAEMC,GAAwB3lB,GAAU,CACpC,GAAI,mBAAmB,KAAKA,CAAM,EAAG,CACjC,MAAM+K,EAAO/K,EAAO,MAAM,QAAQ,EAAE,GACpC,OAAO+K,EAAO,SAASA,EAAM,EAAE,EAAI,IACtC,CACD,OAAO,IACX,EAEM6a,GAA0B5lB,GACxB,0BAA0B,KAAKA,CAAM,IACzBA,EAAO,MAAM,GAAG,EAAE,IAAM,IAAI,QAC3B,KAKf6lB,GAAyBvH,GAAW,CACtC,MAAMwH,EAAO,CACT,OAAQ,KACR,KAAM,KACN,KAAM,IACd,EAEUC,EAAOzH,EAAQ,MAAM;AAAA,CAAI,EAC/B,QAASte,KAAU+lB,EAAM,CACrB,MAAMhjB,EAAO0iB,GAAsBzlB,CAAM,EACzC,GAAI+C,EAAM,CACN+iB,EAAK,KAAO/iB,EACZ,QACH,CAED,MAAMgI,EAAO4a,GAAsB3lB,CAAM,EACzC,GAAI+K,EAAM,CACN+a,EAAK,KAAO/a,EACZ,QACH,CAED,MAAMib,EAASJ,GAAwB5lB,CAAM,EAC7C,GAAIgmB,EAAQ,CACRF,EAAK,OAASE,EACd,QACH,CACJ,CAED,OAAOF,CACX,EAEMG,GAAmBC,GAAW,CAChC,MAAM3zB,EAAQ,CACV,OAAQ,KACR,SAAU,GACV,SAAU,EACV,KAAM,KACN,UAAW,KACX,SAAU,EACV,QAAS,IACjB,EAEU4zB,EAAc,IAAM5zB,EAAM,SAC1B6zB,EAAQ,IAAM,CACZ7zB,EAAM,SAAWA,EAAM,QAAQ,OAC/BA,EAAM,QAAQ,OAE1B,EAGU8zB,EAAO,IAAM,CAEf,MAAML,EAASzzB,EAAM,OAErBghB,EAAI,KAAK,OAAQyS,CAAM,EAGnBA,aAAkB,KAClBzS,EAAI,KAAK,OAAQyS,CAAM,EAChBA,aAAkB,KAEzBzS,EAAI,KAAK,OAAQgR,GAAgByB,EAAQA,EAAO,IAAI,CAAC,EAC9CjC,GAAgBiC,CAAM,EAE7BzS,EAAI,KAAK,OAAQiS,GAAyBQ,CAAM,CAAC,EAGjDM,EAAQN,CAAM,CAE1B,EAGUM,EAAU1wB,GAAO,CAEnB,GAAI,CAACswB,EAAS,CACV3S,EAAI,KAAK,QAAS,CACd,KAAM,QACN,KAAM,iBACN,KAAM,GACtB,CAAa,EACD,MACH,CAGDhhB,EAAM,UAAY,KAAK,MAGvBA,EAAM,QAAU2zB,EACZtwB,EACA2wB,GAAY,CAERh0B,EAAM,SAAW,KAAK,IAAG,EAAKA,EAAM,UAGpCA,EAAM,SAAW,GAGbg0B,aAAoB,OACpBA,EAAWhC,GAAgBgC,EAAUA,EAAS,MAAQvC,GAAmBpuB,CAAG,CAAC,GAGjF2d,EAAI,KACA,OAEAgT,aAAoB,KAAOA,EAAWA,EAAWA,EAAS,KAAO,IACrF,CACa,EACD/Z,GAAS,CACL+G,EAAI,KACA,QACA,OAAO/G,GAAU,SACX,CACI,KAAM,QACN,KAAM,EACN,KAAMA,CACT,EACDA,CAC1B,CACa,EACD,CAACga,EAAYnuB,EAASoG,IAAU,CAU5B,GARIA,IACAlM,EAAM,KAAOkM,GAIjBlM,EAAM,SAAW,KAAK,IAAG,EAAKA,EAAM,UAGhC,CAACi0B,EAAY,CACbj0B,EAAM,SAAW,KACjB,MACH,CAGDA,EAAM,SAAW8F,EAAUoG,EAG3B8U,EAAI,KAAK,WAAYhhB,EAAM,QAAQ,CACtC,EACD,IAAM,CACFghB,EAAI,KAAK,OAAO,CACnB,EACDgT,GAAY,CACR,MAAME,EAAWZ,GACb,OAAOU,GAAa,SAAWA,EAAWA,EAAS,OACvE,EACgBhT,EAAI,KAAK,OAAQ,CACb,KAAMhhB,EAAM,MAAQk0B,EAAS,KAC7B,SAAUA,EAAS,KACnB,OAAQA,EAAS,MACrC,CAAiB,CACJ,CACb,CACA,EAEUlT,EAAM,CACR,GAAG6M,GAAI,EACP,UAAW4F,GAAWzzB,EAAM,OAASyzB,EACrC,YAAAG,EACA,MAAAC,EACA,KAAAC,CACR,EAEI,OAAO9S,CACX,EAEMmT,GAAQhc,GAAU,WAAW,KAAKA,CAAM,EAExCic,GAAc,CAAC/xB,EAAMgB,EAAKzB,IAAY,CACxC,MAAMof,EAAM,CACR,UAAW,IAAM,CAAE,EACnB,WAAY,IAAM,CAAE,EACpB,OAAQ,IAAM,CAAE,EAChB,UAAW,IAAM,CAAE,EACnB,QAAS,IAAM,CAAE,EACjB,QAAS,IAAM,CAAE,EACjB,MAAO,IAAM,CACTqT,EAAU,GACVC,EAAI,MAAK,CACZ,CACT,EAGI,IAAID,EAAU,GACVE,EAAkB,GAGtB3yB,EAAU,CACN,OAAQ,OACR,QAAS,CAAE,EACX,gBAAiB,GACjB,GAAGA,CACX,EAGIyB,EAAM,UAAUA,CAAG,EAIf8wB,GAAMvyB,EAAQ,MAAM,GAAKS,IACzBgB,EAAM,GAAGA,IAAM,mBAAmB,OAAOhB,GAAS,SAAWA,EAAO,KAAK,UAAUA,CAAI,CAAC,KAI5F,MAAMiyB,EAAM,IAAI,eAGVE,EAAUL,GAAMvyB,EAAQ,MAAM,EAAI0yB,EAAMA,EAAI,OAClD,OAAAE,EAAQ,WAAa94B,GAAK,CAElB24B,GAIJrT,EAAI,WAAWtlB,EAAE,iBAAkBA,EAAE,OAAQA,EAAE,KAAK,CAC5D,EAGI44B,EAAI,mBAAqB,IAAM,CAEvBA,EAAI,WAAa,GAKjBA,EAAI,aAAe,GAAKA,EAAI,SAAW,GAIvCC,IAIJA,EAAkB,GAGlBvT,EAAI,UAAUsT,CAAG,EACzB,EAGIA,EAAI,OAAS,IAAM,CAEXA,EAAI,QAAU,KAAOA,EAAI,OAAS,IAClCtT,EAAI,OAAOsT,CAAG,EAEdtT,EAAI,QAAQsT,CAAG,CAE3B,EAGIA,EAAI,QAAU,IAAMtT,EAAI,QAAQsT,CAAG,EAGnCA,EAAI,QAAU,IAAM,CAChBD,EAAU,GACVrT,EAAI,QAAO,CACnB,EAGIsT,EAAI,UAAY,IAAMtT,EAAI,UAAUsT,CAAG,EAGvCA,EAAI,KAAK1yB,EAAQ,OAAQyB,EAAK,EAAI,EAG9B6nB,GAAMtpB,EAAQ,OAAO,IACrB0yB,EAAI,QAAU1yB,EAAQ,SAI1B,OAAO,KAAKA,EAAQ,OAAO,EAAE,QAAQxC,GAAO,CACxC,MAAMgB,EAAQ,SAAS,mBAAmBwB,EAAQ,QAAQxC,EAAI,CAAC,EAC/Dk1B,EAAI,iBAAiBl1B,EAAKgB,CAAK,CACvC,CAAK,EAGGwB,EAAQ,eACR0yB,EAAI,aAAe1yB,EAAQ,cAI3BA,EAAQ,kBACR0yB,EAAI,gBAAkB,IAI1BA,EAAI,KAAKjyB,CAAI,EAEN2e,CACX,EAEMyT,GAAiB,CAACxtB,EAAMytB,EAAMC,EAAM5I,KAAa,CACnD,KAAA9kB,EACA,KAAAytB,EACA,KAAAC,EACA,QAAA5I,CACJ,GAEM6I,GAAwBxnB,GAAMknB,GAAO,CACvClnB,EAAGqnB,GAAe,QAAS,EAAG,UAAWH,EAAI,sBAAuB,CAAA,CAAC,CACzE,EAEMO,GAAQ95B,GAAO,KAAK,KAAKA,CAAG,EAC5B+5B,GAAW,IAAI9I,IAAU,CAC3B,IAAI3oB,EAAM,GACV,OAAA2oB,EAAM,QAAQmB,GAAQ,CAClB9pB,GAAOwxB,GAAMxxB,CAAG,GAAKwxB,GAAM1H,CAAI,EAAIA,EAAK,QAAQ,KAAM,GAAG,EAAIA,CACrE,CAAK,EACM9pB,CACX,EAEM0xB,GAAsB,CAACC,EAAS,GAAI/pB,IAAW,CAEjD,GAAI,OAAOA,GAAW,WAClB,OAAOA,EAIX,GAAI,CAACA,GAAU,CAAC6f,GAAS7f,EAAO,GAAG,EAC/B,OAAO,KAIX,MAAMgqB,EAAShqB,EAAO,SAAWmP,GAAOA,GAClC8a,EAAUjqB,EAAO,UAAYmP,GAAO,MAG1C,MAAO,CAAC/W,EAAKywB,EAAM7Z,EAAOkb,EAAUtB,EAAO9H,IAAY,CAEnD,MAAMqJ,EAAUhB,GAAY/wB,EAAKyxB,GAASE,EAAQ/pB,EAAO,GAAG,EAAG,CAC3D,GAAGA,EACH,aAAc,MAC1B,CAAS,EAED,OAAAmqB,EAAQ,OAASd,GAAO,CAEpB,MAAMvI,EAAUuI,EAAI,wBAGdrC,EAAWqB,GAAuBvH,CAAO,EAAE,MAAQ0F,GAAmBpuB,CAAG,EAG/EywB,EACIW,GACI,OACAH,EAAI,OACJrpB,EAAO,SAAW,OACZ,KACA+mB,GAAgBiD,EAAOX,EAAI,QAAQ,EAAGrC,CAAQ,EACpDlG,CACH,CACjB,CACA,EAEQqJ,EAAQ,QAAUd,GAAO,CACrBra,EACIwa,GACI,QACAH,EAAI,OACJY,EAAQZ,EAAI,QAAQ,GAAKA,EAAI,WAC7BA,EAAI,sBAAuB,CAC9B,CACjB,CACA,EAEQc,EAAQ,UAAYd,GAAO,CACvBvI,EAAQ0I,GAAe,UAAWH,EAAI,OAAQ,KAAMA,EAAI,sBAAuB,CAAA,CAAC,CAC5F,EAEQc,EAAQ,UAAYR,GAAsB3a,CAAK,EAC/Cmb,EAAQ,WAAaD,EACrBC,EAAQ,QAAUvB,EAGXuB,CACf,CACA,EAEMC,GAAc,CAChB,OAAQ,EACR,SAAU,EACV,WAAY,EACZ,MAAO,EACP,QAAS,CACb,EAYMC,GAAqB,CACvBN,EACA/pB,EACAuF,EACAuH,EACAwd,EACAzB,EACA7Z,EACAkb,EACAtB,EACA2B,EACA5zB,IACC,CAED,MAAM6zB,EAAS,CAAA,EACT,CAAE,gBAAAC,EAAiB,YAAAC,EAAa,UAAAC,EAAW,iBAAAC,CAAgB,EAAKj0B,EAGhE5B,GAAQ,CACV,SAAU01B,EACV,QAAS,EACjB,EAGUI,GAAS7qB,EAAO,SAAW8qB,IAAMA,IACjCd,GACFhqB,EAAO,SACN,CAACqpB,GAAKnc,KACHA,KAAW,OAASmc,GAAI,kBAAkB,eAAe,EAAIA,GAAI,UACnEY,GAAUjqB,EAAO,UAAYmP,IAAO,MAGpC4b,GAAoB5oB,IAAM,CAC5B,MAAM6oB,GAAW,IAAI,SAGjB9J,GAASoJ,CAAQ,GAAGU,GAAS,OAAOzlB,EAAM,KAAK,UAAU+kB,CAAQ,CAAC,EAEtE,MAAMxJ,EACF,OAAO9gB,EAAO,SAAY,WACpBA,EAAO,QAAQ8M,EAAMwd,CAAQ,EAC7B,CACI,GAAGtqB,EAAO,QACV,gBAAiB8M,EAAK,IAC5C,EAEcme,GAAgB,CAClB,GAAGjrB,EACH,QAAA8gB,CACZ,EAGcqJ,GAAUhB,GAAY0B,GAAOG,EAAQ,EAAGnB,GAASE,EAAQ/pB,EAAO,GAAG,EAAGirB,EAAa,EAEzFd,GAAQ,OAASd,IAAOlnB,GAAG6nB,GAAOX,GAAK4B,GAAc,MAAM,CAAC,EAE5Dd,GAAQ,QAAUd,IACdra,EACIwa,GACI,QACAH,GAAI,OACJY,GAAQZ,GAAI,QAAQ,GAAKA,GAAI,WAC7BA,GAAI,sBAAuB,CAC9B,CACjB,EAEQc,GAAQ,UAAYR,GAAsB3a,CAAK,CACvD,EAEUkc,GAAwB/oB,IAAM,CAChC,MAAMgpB,GAAatB,GAASE,EAAQW,EAAY,IAAK31B,GAAM,QAAQ,EAS7Dk2B,GAAgB,CAClB,QAPA,OAAOjrB,EAAO,SAAY,WACpBA,EAAO,QAAQjL,GAAM,QAAQ,EAC7B,CACI,GAAGiL,EAAO,OAChC,EAIY,OAAQ,MACpB,EAEcmqB,GAAUhB,GAAY,KAAMgC,GAAYF,EAAa,EAE3Dd,GAAQ,OAASd,IAAOlnB,GAAG6nB,GAAOX,GAAK4B,GAAc,MAAM,CAAC,EAE5Dd,GAAQ,QAAUd,IACdra,EACIwa,GACI,QACAH,GAAI,OACJY,GAAQZ,GAAI,QAAQ,GAAKA,GAAI,WAC7BA,GAAI,sBAAuB,CAC9B,CACjB,EAEQc,GAAQ,UAAYR,GAAsB3a,CAAK,CACvD,EAGUoc,EAAiB,KAAK,MAAMte,EAAK,KAAO6d,CAAS,EACvD,QAAS95B,GAAI,EAAGA,IAAKu6B,EAAgBv6B,KAAK,CACtC,MAAMwmB,GAASxmB,GAAI85B,EACbvzB,EAAO0V,EAAK,MAAMuK,GAAQA,GAASsT,EAAW,iCAAiC,EACrFH,EAAO35B,IAAK,CACR,MAAOA,GACP,KAAMuG,EAAK,KACX,OAAAigB,GACA,KAAAjgB,EACA,KAAA0V,EACA,SAAU,EACV,QAAS,CAAC,GAAG8d,CAAgB,EAC7B,OAAQR,GAAY,OACpB,MAAO,KACP,QAAS,KACT,QAAS,IACrB,CACK,CAED,MAAMiB,GAA2B,IAAMxC,EAAK9zB,GAAM,QAAQ,EAEpDu2B,GAAkBC,IACpBA,GAAM,SAAWnB,GAAY,QAAUmB,GAAM,SAAWnB,GAAY,MAElEoB,GAAeD,IAAS,CAE1B,GAAIx2B,GAAM,QAAS,OAMnB,GAHAw2B,GAAQA,IAASf,EAAO,KAAKc,EAAe,EAGxC,CAACC,GAAO,CAEJf,EAAO,MAAMe,IAASA,GAAM,SAAWnB,GAAY,QAAQ,GAC3DiB,KAIJ,MACH,CAGDE,GAAM,OAASnB,GAAY,WAC3BmB,GAAM,SAAW,KAGjB,MAAMV,GAASH,EAAY,SAAWI,IAAMA,IACtCb,EAAUS,EAAY,UAAYvb,IAAO,MACzC6a,GAASU,EAAY,SAAW,IAAM,CAAE,GAGxCS,GAAatB,GAASE,EAAQW,EAAY,IAAK31B,GAAM,QAAQ,EAE7D+rB,GACF,OAAO4J,EAAY,SAAY,WACzBA,EAAY,QAAQa,EAAK,EACzB,CACI,GAAGb,EAAY,QACf,eAAgB,kCAChB,gBAAiBa,GAAM,OACvB,gBAAiBze,EAAK,KACtB,cAAeA,EAAK,IAC1C,EAEcqd,GAAWoB,GAAM,QAAUpC,GAAY0B,GAAOU,GAAM,IAAI,EAAGJ,GAAY,CACzE,GAAGT,EACH,QAAA5J,EACH,CAAA,EAEDqJ,GAAQ,OAASd,IAAO,CAEpBW,GAAOX,GAAKkC,GAAM,MAAOf,EAAO,MAAM,EAGtCe,GAAM,OAASnB,GAAY,SAG3BmB,GAAM,QAAU,KAGhBE,IACZ,EAEQtB,GAAQ,WAAa,CAACuB,GAAkBC,GAAQ1qB,KAAU,CACtDsqB,GAAM,SAAWG,GAAmBC,GAAS,KAC7CC,IACZ,EAEQzB,GAAQ,QAAUd,IAAO,CACrBkC,GAAM,OAASnB,GAAY,MAC3BmB,GAAM,QAAU,KAChBA,GAAM,MAAQtB,EAAQZ,GAAI,QAAQ,GAAKA,GAAI,WACtCwC,GAAkBN,EAAK,GACxBvc,EACIwa,GACI,QACAH,GAAI,OACJY,EAAQZ,GAAI,QAAQ,GAAKA,GAAI,WAC7BA,GAAI,sBAAuB,CAC9B,CACrB,CAEA,EAEQc,GAAQ,UAAYd,IAAO,CACvBkC,GAAM,OAASnB,GAAY,MAC3BmB,GAAM,QAAU,KACXM,GAAkBN,EAAK,GACxB5B,GAAsB3a,CAAK,EAAEqa,EAAG,CAEhD,EAEQc,GAAQ,QAAU,IAAM,CACpBoB,GAAM,OAASnB,GAAY,OAC3BmB,GAAM,QAAU,KAChB3C,GACZ,CACA,EAEUiD,GAAoBN,IAElBA,GAAM,QAAQ,SAAW,EAAU,IAGvCA,GAAM,OAASnB,GAAY,QAC3B,aAAamB,GAAM,OAAO,EAC1BA,GAAM,QAAU,WAAW,IAAM,CAC7BC,GAAaD,EAAK,CACrB,EAAEA,GAAM,QAAQ,MAAK,CAAE,EAGjB,IAGLK,GAAsB,IAAM,CAE9B,MAAME,GAAuBtB,EAAO,OAAO,CAACxvB,EAAGuwB,KACvCvwB,IAAM,MAAQuwB,GAAM,WAAa,KAAa,KAC3CvwB,EAAIuwB,GAAM,SAClB,CAAC,EAGJ,GAAIO,KAAyB,KAAM,OAAO5B,EAAS,GAAO,EAAG,CAAC,EAG9D,MAAM6B,GAAYvB,EAAO,OAAO,CAACvpB,EAAOsqB,KAAUtqB,EAAQsqB,GAAM,KAAM,CAAC,EAGvErB,EAAS,GAAM4B,GAAsBC,EAAS,CACtD,EAGUN,GAAgB,IAAM,CACAjB,EAAO,OAAOe,IAASA,GAAM,SAAWnB,GAAY,UAAU,EACjF,QACkB,GACvBoB,IACR,EAEUQ,GAAc,IAAM,CACtBxB,EAAO,QAAQe,IAAS,CACpB,aAAaA,GAAM,OAAO,EACtBA,GAAM,SACNA,GAAM,QAAQ,OAE9B,CAAS,CACT,EAGI,OAAKx2B,GAAM,SAaPm2B,GAAsB7T,IAAU,CAExBtiB,GAAM,UAGVy1B,EACK,OAAOe,IAASA,GAAM,OAASlU,EAAM,EACrC,QAAQkU,IAAS,CACdA,GAAM,OAASnB,GAAY,SAC3BmB,GAAM,SAAWA,GAAM,IAC3C,CAAiB,EAGLE,KACZ,CAAS,EA1BDV,GAAkBkB,IAAY,CAEtBl3B,GAAM,UAGVw1B,EAAS0B,EAAQ,EAGjBl3B,GAAM,SAAWk3B,GACjBR,KACZ,CAAS,EAmBE,CACH,MAAO,IAAM,CACT12B,GAAM,QAAU,GAChBi3B,IACH,CACT,CACA,EAUME,GAA8B,CAACnC,EAAQ/pB,EAAQuF,EAAM5O,IAAY,CACnEmW,EACAwd,EACAzB,EACA7Z,EACAkb,EACAtB,EACA2B,IACC,CAED,GAAI,CAACzd,EAAM,OAGX,MAAMqf,EAAiBx1B,EAAQ,aACzBy1B,EAAoBD,GAAkBrf,EAAK,KAAOnW,EAAQ,UAC1D01B,EAAkBF,IAAmBC,GAAqBz1B,EAAQ,YACxE,GAAImW,aAAgB,MAAQuf,EACxB,OAAOhC,GACHN,EACA/pB,EACAuF,EACAuH,EACAwd,EACAzB,EACA7Z,EACAkb,EACAtB,EACA2B,EACA5zB,CACZ,EAGI,MAAMk0B,EAAS7qB,EAAO,SAAW8qB,IAAMA,IACjCd,EAAShqB,EAAO,SAAWmP,IAAOA,IAClC8a,GAAUjqB,EAAO,UAAYmP,IAAO,MAEpC2R,GACF,OAAO9gB,EAAO,SAAY,WACpBA,EAAO,QAAQ8M,EAAMwd,CAAQ,GAAK,CAAE,EACpC,CACI,GAAGtqB,EAAO,OAC5B,EAEUirB,GAAgB,CAClB,GAAGjrB,EACH,QAAA8gB,EACR,EAGI,IAAIkK,GAAW,IAAI,SAGf9J,GAASoJ,CAAQ,GACjBU,GAAS,OAAOzlB,EAAM,KAAK,UAAU+kB,CAAQ,CAAC,GAIjDxd,aAAgB,KAAO,CAAC,CAAE,KAAM,KAAM,KAAAA,CAAI,CAAE,EAAIA,GAAM,QAAQhK,IAAQ,CACnEkoB,GAAS,OACLzlB,EACAzC,GAAK,KACLA,GAAK,OAAS,KAAOA,GAAK,KAAK,KAAO,GAAGA,GAAK,OAAOA,GAAK,KAAK,MAC3E,CACA,CAAK,EAGD,MAAMqnB,GAAUhB,GAAY0B,EAAOG,EAAQ,EAAGnB,GAASE,EAAQ/pB,EAAO,GAAG,EAAGirB,EAAa,EACzF,OAAAd,GAAQ,OAASd,IAAO,CACpBR,EAAKW,GAAe,OAAQH,GAAI,OAAQW,EAAOX,GAAI,QAAQ,EAAGA,GAAI,sBAAqB,CAAE,CAAC,CAClG,EAEIc,GAAQ,QAAUd,IAAO,CACrBra,EACIwa,GACI,QACAH,GAAI,OACJY,GAAQZ,GAAI,QAAQ,GAAKA,GAAI,WAC7BA,GAAI,sBAAuB,CAC9B,CACb,CACA,EAEIc,GAAQ,UAAYR,GAAsB3a,CAAK,EAC/Cmb,GAAQ,WAAaD,EACrBC,GAAQ,QAAUvB,EAGXuB,EACX,EAEMmC,GAA0B,CAACvC,EAAS,GAAI/pB,EAAQuF,EAAM5O,IAEpD,OAAOqJ,GAAW,WAAmB,IAAIusB,IAAWvsB,EAAOuF,EAAM,GAAGgnB,EAAQ51B,CAAO,EAGnF,CAACqJ,GAAU,CAAC6f,GAAS7f,EAAO,GAAG,EAAU,KAGtCksB,GAA4BnC,EAAQ/pB,EAAQuF,EAAM5O,CAAO,EAO9D61B,GAAuB,CAACzC,EAAS,GAAI/pB,IAAW,CAElD,GAAI,OAAOA,GAAW,WAClB,OAAOA,EAIX,GAAI,CAACA,GAAU,CAAC6f,GAAS7f,EAAO,GAAG,EAC/B,MAAO,CAACysB,EAAc5D,IAASA,IAInC,MAAMmB,EAAShqB,EAAO,SAAWmP,GAAOA,GAClC8a,EAAUjqB,EAAO,UAAYmP,GAAO,MAG1C,MAAO,CAACsd,EAAc5D,EAAM7Z,IAAU,CAClC,MAAMmb,EAAUhB,GACZsD,EACA1C,EAAS/pB,EAAO,IAChBA,CACZ,EACQ,OAAAmqB,EAAQ,OAASd,GAAO,CACpBR,EACIW,GACI,OACAH,EAAI,OACJW,EAAOX,EAAI,QAAQ,EACnBA,EAAI,sBAAuB,CAC9B,CACjB,CACA,EAEQc,EAAQ,QAAUd,GAAO,CACrBra,EACIwa,GACI,QACAH,EAAI,OACJY,EAAQZ,EAAI,QAAQ,GAAKA,EAAI,WAC7BA,EAAI,sBAAuB,CAC9B,CACjB,CACA,EAEQc,EAAQ,UAAYR,GAAsB3a,CAAK,EAExCmb,CACf,CACA,EAEMuC,GAAkB,CAAC5tB,EAAM,EAAGsnB,EAAM,IAAMtnB,EAAM,KAAK,OAAM,GAAMsnB,EAAMtnB,GAErE6tB,GAAoC,CACtCxqB,EACAwW,EAAW,IACXtB,EAAS,EACTuV,EAAU,GACVC,EAAU,MACT,CACD,IAAIn0B,EAAU,KACd,MAAMogB,EAAQ,KAAK,MAEb8F,EAAO,IAAM,CACf,IAAIkO,EAAU,KAAK,IAAG,EAAKhU,EACvBD,EAAQ6T,GAAgBE,EAASC,CAAO,EAExCC,EAAUjU,EAAQF,IAClBE,EAAQiU,EAAUjU,EAAQF,GAG9B,IAAIuR,EAAW4C,EAAUnU,EACzB,GAAIuR,GAAY,GAAK,SAAS,OAAQ,CAClC/nB,EAAG,CAAC,EACJ,MACH,CAEDA,EAAG+nB,CAAQ,EAEXxxB,EAAU,WAAWkmB,EAAM/F,CAAK,CACxC,EAEI,OAAIF,EAAW,GAAGiG,IAEX,CACH,MAAO,IAAM,CACT,aAAalmB,CAAO,CACvB,CACT,CACA,EAEMq0B,GAAsB,CAACC,EAAWr2B,IAAY,CAChD,MAAM5B,EAAQ,CACV,SAAU,GACV,kBAAmB,EACnB,4BAA6B,KAC7B,SAAU,KACV,UAAW,KACX,kBAAmB,EACnB,SAAU,EACV,QAAS,KACT,SAAU,IAClB,EAEU,CAAE,2BAAAk4B,CAA4B,EAAGt2B,EAEjC4yB,EAAU,CAACzc,EAAMwd,IAAa,CAChC,MAAM4C,EAAa,IAAM,CAIjBn4B,EAAM,WAAa,GAAKA,EAAM,WAAa,MAG/CghB,EAAI,KAAK,WAAYA,EAAI,YAAa,CAAA,CAClD,EAEcoX,EAAa,IAAM,CACrBp4B,EAAM,SAAW,GACjBghB,EAAI,KAAK,iBAAkBhhB,EAAM,SAAS,IAAI,CAC1D,EAGQghB,EAAI,KAAK,OAAO,EAGhBhhB,EAAM,UAAY,KAAK,MAGvBA,EAAM,4BAA8B43B,GAChCzC,GAAY,CACRn1B,EAAM,kBAAoBm1B,EAC1Bn1B,EAAM,kBAAoB,KAAK,IAAG,EAAKA,EAAM,UAE7Cm4B,IAIIn4B,EAAM,UAAYA,EAAM,oBAAsB,GAAK,CAACA,EAAM,UAE1Do4B,GAEP,EAGDF,EAA6BP,GAAgB,IAAK,IAAI,EAAI,CACtE,EAGQ33B,EAAM,QAAUi4B,EAEZlgB,EAGAwd,EAKAvB,GAAY,CAGRh0B,EAAM,SAAWmsB,GAAS6H,CAAQ,EAC5BA,EACA,CACI,KAAM,OACN,KAAM,IACN,KAAM,GAAGA,IACT,QAAS,CAAE,CACrC,EAGgBh0B,EAAM,SAAW,KAAK,IAAG,EAAKA,EAAM,UAGpCA,EAAM,SAAW,EAGjBghB,EAAI,KAAK,OAAQhhB,EAAM,SAAS,IAAI,GAMhC,CAACk4B,GACAA,GAA8Bl4B,EAAM,oBAAsB,IAE3Do4B,GAEP,EAGDne,GAAS,CAELja,EAAM,4BAA4B,QAGlCghB,EAAI,KACA,QACAmL,GAASlS,CAAK,EACRA,EACA,CACI,KAAM,QACN,KAAM,EACN,KAAM,GAAGA,GACZ,CAC3B,CACa,EAGD,CAACga,EAAYnuB,EAASoG,KAAU,CAE5BlM,EAAM,SAAW,KAAK,IAAG,EAAKA,EAAM,UAGpCA,EAAM,SAAWi0B,EAAanuB,EAAUoG,GAAQ,KAEhDisB,GACH,EAGD,IAAM,CAEFn4B,EAAM,4BAA4B,QAGlCghB,EAAI,KAAK,QAAShhB,EAAM,SAAWA,EAAM,SAAS,KAAO,IAAI,CAChE,EAGDq4B,GAAc,CACVrX,EAAI,KAAK,WAAYqX,CAAU,CAClC,CACb,CACA,EAEUxE,EAAQ,IAAM,CAEZ,CAAC7zB,EAAM,UAGXA,EAAM,4BAA4B,QAG9BA,EAAM,QAAQ,OAAOA,EAAM,QAAQ,QAGvCA,EAAM,SAAW,GACzB,EAEU2I,EAAQ,IAAM,CAChBkrB,IACA7zB,EAAM,SAAW,GACjBA,EAAM,kBAAoB,EAC1BA,EAAM,SAAW,EACjBA,EAAM,UAAY,KAClBA,EAAM,kBAAoB,EAC1BA,EAAM,SAAW,EACjBA,EAAM,QAAU,KAChBA,EAAM,SAAW,IACzB,EAEU4zB,EAAcsE,EACd,IAAOl4B,EAAM,SAAW,KAAK,IAAIA,EAAM,SAAUA,EAAM,iBAAiB,EAAI,KAC5E,IAAMA,EAAM,UAAY,KAExBs4B,EAAcJ,EACd,IAAM,KAAK,IAAIl4B,EAAM,SAAUA,EAAM,iBAAiB,EACtD,IAAMA,EAAM,SAEZghB,EAAM,CACR,GAAG6M,GAAI,EACP,QAAA2G,EACA,MAAAX,EACA,YAAAD,EACA,YAAA0E,EACA,MAAA3vB,CACR,EAEI,OAAOqY,CACX,EAEMuX,GAA8B/nB,GAAQA,EAAK,UAAU,EAAGA,EAAK,YAAY,GAAG,CAAC,GAAKA,EAElFgoB,GAAiB/E,GAAU,CAC7B,IAAIpxB,EAAO,CAACoxB,EAAO,KAAMA,EAAO,KAAMA,EAAO,IAAI,EAGjD,OAAIA,aAAkB,MAAQjC,GAAgBiC,CAAM,EAChDpxB,EAAK,GAAKoxB,EAAO,MAAQ1B,GAAa,EAC/BP,GAAgBiC,CAAM,GAE7BpxB,EAAK,GAAKoxB,EAAO,OACjBpxB,EAAK,GAAKuwB,GAA6Ba,CAAM,GACtC3I,GAAS2I,CAAM,IAEtBpxB,EAAK,GAAKovB,GAAmBgC,CAAM,EACnCpxB,EAAK,GAAK,EACVA,EAAK,GAAK,4BAGP,CACH,KAAMA,EAAK,GACX,KAAMA,EAAK,GACX,KAAMA,EAAK,EACnB,CACA,EAEMo2B,GAASr4B,GAAS,CAAC,EAAEA,aAAiB,MAASA,aAAiB,MAAQA,EAAM,MAE9Es4B,GAAkBliB,GAAO,CAC3B,GAAI,CAAC2V,GAAS3V,CAAG,EAAG,OAAOA,EAC3B,MAAMxU,EAASuoB,GAAQ/T,CAAG,EAAI,CAAA,EAAK,CAAA,EACnC,UAAWpX,KAAOoX,EAAK,CACnB,GAAI,CAACA,EAAI,eAAepX,CAAG,EAAG,SAC9B,MAAMa,EAAIuW,EAAIpX,GACd4C,EAAO5C,GAAOa,GAAKksB,GAASlsB,CAAC,EAAIy4B,GAAgBz4B,CAAC,EAAIA,CACzD,CACD,OAAO+B,CACX,EAEM22B,GAAa,CAACC,EAAS,KAAMC,EAAsB,KAAM9gB,EAAO,OAAS,CAE3E,MAAM3V,EAAKorB,KAKLxtB,EAAQ,CAEV,SAAU,GAGV,OAAQ,GAGR,SAAU,GAGV,OAAQ,KAGR,KAAA+X,EAGA,oBAAA8gB,EAGA,WAAY,KAGZ,kBAAmB,GAGnB,OAAQA,EAAsBvK,GAAW,oBAAsBA,GAAW,KAG1E,aAAc,KACd,gBAAiB,IACzB,EAGI,IAAIwK,EAAiC,KAKrC,MAAMvD,EAAW,CAAA,EAGXwD,EAAY7H,IAAWlxB,EAAM,OAASkxB,GAGtClD,EAAO,CAACvrB,MAAU+0B,KAAW,CAC3Bx3B,EAAM,UAAYA,EAAM,QAC5BghB,EAAI,KAAKve,GAAO,GAAG+0B,EAAM,CACjC,EAGUwB,EAAmB,IAAMtH,GAAyB1xB,EAAM,KAAK,IAAI,EACjEi5B,EAAc,IAAMj5B,EAAM,KAAK,KAC/Bk5B,EAAc,IAAMl5B,EAAM,KAAK,KAC/Bm5B,EAAU,IAAMn5B,EAAM,KAKtB8zB,EAAO,CAACL,GAAQ2F,GAAQnE,KAAW,CAQrC,GANAj1B,EAAM,OAASyzB,GAGfzS,EAAI,SAAS,MAAM,EAGfhhB,EAAM,KAAM,CACZghB,EAAI,SAAS,WAAW,EACxB,MACH,CAGDhhB,EAAM,KAAOw4B,GAAe/E,EAAM,EAGlC2F,GAAO,GAAG,OAAQ,IAAM,CACpBpL,EAAK,WAAW,CAC5B,CAAS,EAGDoL,GAAO,GAAG,OAAQC,IAAQ,CAEtBr5B,EAAM,KAAK,KAAOq5B,GAAK,KAGvBr5B,EAAM,KAAK,SAAWq5B,GAAK,SAGvBA,GAAK,SACLT,EAASrK,GAAW,MACpBvuB,EAAM,oBAAsBq5B,GAAK,OACjCr5B,EAAM,OAASsuB,GAAW,qBAI9BN,EAAK,WAAW,CAC5B,CAAS,EAGDoL,GAAO,GAAG,WAAYjE,IAAY,CAC9B4D,EAAUzK,GAAW,OAAO,EAE5BN,EAAK,gBAAiBmH,EAAQ,CAC1C,CAAS,EAGDiE,GAAO,GAAG,QAASnf,IAAS,CACxB8e,EAAUzK,GAAW,UAAU,EAE/BN,EAAK,qBAAsB/T,EAAK,CAC5C,CAAS,EAGDmf,GAAO,GAAG,QAAS,IAAM,CACrBL,EAAUzK,GAAW,IAAI,EACzBN,EAAK,YAAY,CAC7B,CAAS,EAGDoL,GAAO,GAAG,OAAQrhB,IAAQ,CAEtB/X,EAAM,aAAe,KAGrB,MAAM+R,GAAU5O,IAAU,CAEtBnD,EAAM,KAAOy4B,GAAOt1B,EAAM,EAAIA,GAASnD,EAAM,KAGzC44B,IAAWrK,GAAW,OAASvuB,EAAM,oBACrC+4B,EAAUzK,GAAW,mBAAmB,EAExCyK,EAAUzK,GAAW,IAAI,EAG7BN,EAAK,MAAM,CAC3B,EAEkB/T,GAAQ9W,IAAU,CAEpBnD,EAAM,KAAO+X,GACbiW,EAAK,WAAW,EAEhB+K,EAAUzK,GAAW,UAAU,EAC/BN,EAAK,kBAAmB7qB,EAAM,CAC9C,EAGY,GAAInD,EAAM,oBAAqB,CAC3B+R,GAAQgG,EAAI,EACZ,MACH,CAGDkd,GAAOld,GAAMhG,GAASkI,EAAK,CACvC,CAAS,EAGDmf,GAAO,UAAU3F,EAAM,EAGvBzzB,EAAM,aAAeo5B,GAGrBA,GAAO,KAAI,CACnB,EAEUE,EAAY,IAAM,CAChB,CAACt5B,EAAM,cAGXA,EAAM,aAAa,MAC3B,EAEUu5B,EAAY,IAAM,CACpB,GAAIv5B,EAAM,aAAc,CACpBA,EAAM,aAAa,QACnB,MACH,CACD+4B,EAAUzK,GAAW,IAAI,EACzBN,EAAK,YAAY,CACzB,EAKUwG,GAAU,CAACgF,GAAWC,KAAc,CAEtC,GAAIz5B,EAAM,kBAAmB,CACzBA,EAAM,kBAAoB,GAC1B,MACH,CASD,GANA+4B,EAAUzK,GAAW,UAAU,EAG/BwK,EAAiC,KAG7B,EAAE94B,EAAM,gBAAgB,MAAO,CAC/BghB,EAAI,GAAG,OAAQ,IAAM,CACjBwT,GAAQgF,GAAWC,EAAS,CAC5C,CAAa,EACD,MACH,CAGDD,GAAU,GAAG,OAAQX,IAAuB,CAExC74B,EAAM,WAAa,KACnBA,EAAM,oBAAsB64B,EACxC,CAAS,EAGDW,GAAU,GAAG,WAAYnB,IAAc,CAEnCr4B,EAAM,WAAaq4B,EAC/B,CAAS,EAEDmB,GAAU,GAAG,iBAAkBX,IAAuB,CAElD74B,EAAM,gBAAkB,KAGxBA,EAAM,WAAa,KACnBA,EAAM,oBAAsB64B,GAE5BE,EAAUzK,GAAW,mBAAmB,EACxCN,EAAK,mBAAoB6K,EAAmB,CACxD,CAAS,EAEDW,GAAU,GAAG,QAAS,IAAM,CACxBxL,EAAK,eAAe,CAChC,CAAS,EAEDwL,GAAU,GAAG,QAASvf,IAAS,CAC3Bja,EAAM,gBAAkB,KACxB+4B,EAAUzK,GAAW,gBAAgB,EACrCN,EAAK,gBAAiB/T,EAAK,CACvC,CAAS,EAEDuf,GAAU,GAAG,QAASX,IAAuB,CACzC74B,EAAM,gBAAkB,KAGxBA,EAAM,oBAAsB64B,GAE5BE,EAAUzK,GAAW,IAAI,EACzBN,EAAK,eAAe,EAGhB8K,GACAA,GAEhB,CAAS,EAEDU,GAAU,GAAG,WAAYrE,IAAY,CACjCnH,EAAK,mBAAoBmH,EAAQ,CAC7C,CAAS,EAGD,MAAMpjB,GAAUgG,IAAQ,CAEhB/X,EAAM,UAGVw5B,GAAU,QAAQzhB,GAAM,CAAE,GAAGwd,CAAU,CAAA,CACnD,EAGctb,GAAQ,QAAQ,MAGtBwf,GAAUz5B,EAAM,KAAM+R,GAASkI,EAAK,EAGpCja,EAAM,gBAAkBw5B,EAChC,EAEUE,GAAoB,IAAM,CAC5B15B,EAAM,kBAAoB,GAC1B+4B,EAAUzK,GAAW,iBAAiB,CAC9C,EAEUqL,GAAkB,IACpB,IAAI,QAAQzK,IAAW,CACnB,GAAI,CAAClvB,EAAM,gBAAiB,CACxBA,EAAM,kBAAoB,GAE1B+4B,EAAUzK,GAAW,IAAI,EACzBN,EAAK,eAAe,EAEpBkB,KACA,MACH,CAED4J,EAAiC,IAAM,CACnC5J,IAChB,EAEYlvB,EAAM,gBAAgB,OAClC,CAAS,EAKC45B,GAAS,CAACC,GAAkBC,KAC9B,IAAI,QAAQ,CAAC5K,GAASC,KAAW,CAG7B,MAAM4K,GACF/5B,EAAM,sBAAwB,KAAOA,EAAM,oBAAsBA,EAAM,WAG3E,GAAI+5B,KAAqB,KAAM,CAC3B7K,KACA,MACH,CAGD2K,GACIE,GACA,IAAM,CAEF/5B,EAAM,oBAAsB,KAC5BA,EAAM,WAAa,KACnBkvB,IACH,EACDjV,IAAS,CAEL,GAAI,CAAC6f,GAAa,CACd5K,KACA,MACH,CAGD6J,EAAUzK,GAAW,uBAAuB,EAC5CN,EAAK,sBAAsB,EAC3BmB,GAAOlV,EAAK,CACf,CACjB,EAGY8e,EAAUzK,GAAW,IAAI,EACzBN,EAAK,gBAAgB,CACjC,CAAS,EAGCgM,GAAc,CAAC56B,GAAKgB,GAAO65B,KAAW,CACxC,MAAMh3B,GAAO7D,GAAI,MAAM,GAAG,EACpB6qB,GAAOhnB,GAAK,GACZwmB,GAAOxmB,GAAK,MAClB,IAAIZ,GAAOkzB,EACXtyB,GAAK,QAAQ7D,IAAQiD,GAAOA,GAAKjD,GAAK,EAGlC,KAAK,UAAUiD,GAAKonB,GAAK,IAAM,KAAK,UAAUrpB,EAAK,IAGvDiC,GAAKonB,IAAQrpB,GAGb4tB,EAAK,kBAAmB,CACpB,IAAK/D,GACL,MAAOsL,EAAStL,IAChB,OAAAgQ,EACZ,CAAS,EACT,EAIUjZ,EAAM,CACR,GAAI,CAAE,IAAK,IAAM5e,CAAI,EACrB,OAAQ,CAAE,IAAK,IAAMw2B,EAAQ,IAAKx4B,IAAUw4B,EAASx4B,EAAQ,EAC7D,SAAU,CAAE,IAAK,IAAMJ,EAAM,mBAAqB,EAClD,WAAY,CAAE,IAAK,IAAMA,EAAM,UAAY,EAC3C,OAAQ,CAAE,IAAK,IAAMA,EAAM,MAAQ,EACnC,SAAU,CAAE,IAAK,IAAMA,EAAM,KAAK,IAAM,EACxC,yBAA0B,CAAE,IAAK,IAAMu4B,GAA4Bv4B,EAAM,KAAK,IAAI,CAAG,EACrF,cAAe,CAAE,IAAKg5B,CAAkB,EACxC,SAAU,CAAE,IAAKC,CAAa,EAC9B,SAAU,CAAE,IAAKC,CAAa,EAC9B,KAAM,CAAE,IAAKC,CAAS,EACtB,aAAc,CAAE,IAAK,IAAMn5B,EAAM,KAAK,aAAe,EAErD,OAAQ,CAAE,IAAK,IAAMA,EAAM,MAAQ,EAEnC,YAlBgBZ,IAAOs5B,GAAgBt5B,GAAMm2B,EAASn2B,IAAOm2B,CAAQ,EAmBrE,YAAa,CAACn2B,GAAKgB,GAAO65B,KAAW,CACjC,GAAI9N,GAAS/sB,EAAG,EAAG,CACf,MAAMiD,GAAOjD,GACb,cAAO,KAAKiD,EAAI,EAAE,QAAQjD,IAAO,CAC7B46B,GAAY56B,GAAKiD,GAAKjD,IAAMgB,EAAK,CACrD,CAAiB,EACMhB,EACV,CACD,OAAA46B,GAAY56B,GAAKgB,GAAO65B,EAAM,EACvB75B,EACV,EAED,OAAQ,CAACoQ,GAAM0pB,KAAaC,GAAQ3pB,IAAQ0pB,GAE5C,UAAAX,EACA,UAAAD,EACA,kBAAAI,GACA,gBAAAC,GAEA,KAAA7F,EACA,QAAAU,GACA,OAAAoF,GAEA,GAAG/L,GAAI,EAEP,OAAQ,IAAO7tB,EAAM,OAAS,GAE9B,QAAS,IAAOA,EAAM,SAAW,GACjC,SAAU,CAAE,IAAK,IAAMA,EAAM,QAAU,EAEvC,QAAS,IAAOA,EAAM,SAAW,GACjC,SAAU,CAAE,IAAK,IAAMA,EAAM,QAAU,EAGvC,QAAS+X,IAAS/X,EAAM,KAAO+X,EACvC,EAGUoiB,GAAUhZ,GAAaH,CAAG,EAEhC,OAAOmZ,EACX,EAEMC,GAAsB,CAAClpB,EAAO2P,IAE5BpD,GAAQoD,CAAK,EACN,EAINiK,GAASjK,CAAK,EAKZ3P,EAAM,UAAUnD,GAAQA,EAAK,KAAO8S,CAAK,EAJrC,GAOTwZ,GAAc,CAACnpB,EAAOopB,IAAW,CACnC,MAAMp6B,EAAQk6B,GAAoBlpB,EAAOopB,CAAM,EAC/C,GAAI,EAAAp6B,EAAQ,GAGZ,OAAOgR,EAAMhR,IAAU,IAC3B,EAEMq6B,GAAY,CAACl3B,EAAKywB,EAAM7Z,EAAOkb,EAAUtB,EAAO9H,IAAY,CAC9D,MAAMqJ,EAAUhB,GAAY,KAAM/wB,EAAK,CACnC,OAAQ,MACR,aAAc,MACtB,CAAK,EAED,OAAA+xB,EAAQ,OAASd,GAAO,CAEpB,MAAMvI,EAAUuI,EAAI,wBAGdrC,EAAWqB,GAAuBvH,CAAO,EAAE,MAAQ0F,GAAmBpuB,CAAG,EAG/EywB,EAAKW,GAAe,OAAQH,EAAI,OAAQtC,GAAgBsC,EAAI,SAAUrC,CAAQ,EAAGlG,CAAO,CAAC,CACjG,EAEIqJ,EAAQ,QAAUd,GAAO,CACrBra,EAAMwa,GAAe,QAASH,EAAI,OAAQA,EAAI,WAAYA,EAAI,sBAAuB,CAAA,CAAC,CAC9F,EAEIc,EAAQ,UAAYd,GAAO,CACvBvI,EAAQ0I,GAAe,UAAWH,EAAI,OAAQ,KAAMA,EAAI,sBAAuB,CAAA,CAAC,CACxF,EAEIc,EAAQ,UAAYR,GAAsB3a,CAAK,EAC/Cmb,EAAQ,WAAaD,EACrBC,EAAQ,QAAUvB,EAGXuB,CACX,EAEMoF,GAAmBn3B,IACjBA,EAAI,QAAQ,IAAI,IAAM,IACtBA,EAAM,SAAS,SAAWA,GAEvBA,EACF,YAAa,EACb,QAAQ,QAAS,EAAE,EACnB,QAAQ,gBAAiB,IAAI,EAC7B,MAAM,GAAG,EAAE,IAGdo3B,GAAgBp3B,IACjBA,EAAI,QAAQ,GAAG,EAAI,IAAMA,EAAI,QAAQ,IAAI,EAAI,KAC9Cm3B,GAAiB,SAAS,IAAI,IAAMA,GAAiBn3B,CAAG,EAEtDq3B,GAAe/yB,GAAS,IAAI6vB,IAAYlM,GAAW3jB,CAAK,EAAIA,EAAM,GAAG6vB,CAAM,EAAI7vB,EAE/EgzB,GAAa5sB,GAAQ,CAAC0qB,GAAO1qB,EAAK,IAAI,EAEtC6sB,GAAc,CAACla,EAAU1gB,IAAU,CACrC,aAAaA,EAAM,iBAAiB,EACpCA,EAAM,kBAAoB,WAAW,IAAM,CACvC0gB,EAAS,mBAAoB,CAAE,MAAOuP,GAAejwB,EAAM,KAAK,CAAC,CAAE,CACtE,EAAE,CAAC,CACR,EAEM66B,GAAkB,CAAC7V,KAAOwS,IAC5B,IAAI,QAAQtI,GAAW,CACnB,GAAI,CAAClK,EACD,OAAOkK,EAAQ,EAAI,EAGvB,MAAM/rB,EAAS6hB,EAAG,GAAGwS,CAAM,EAE3B,GAAIr0B,GAAU,KACV,OAAO+rB,EAAQ,EAAI,EAGvB,GAAI,OAAO/rB,GAAW,UAClB,OAAO+rB,EAAQ/rB,CAAM,EAGrB,OAAOA,EAAO,MAAS,YACvBA,EAAO,KAAK+rB,CAAO,CAE/B,CAAK,EAEC4L,GAAY,CAAC96B,EAAO+6B,IAAY,CAClC/6B,EAAM,MAAM,KAAK,CAAC1E,EAAGC,IAAMw/B,EAAQ3M,GAAc9yB,CAAC,EAAG8yB,GAAc7yB,CAAC,CAAC,CAAC,CAC1E,EAGMy/B,GAA0B,CAACh7B,EAAOi7B,IAAgB,CAAC,CACrD,MAAApa,EACA,QAAA9O,EAAU,IAAM,CAAE,EAClB,QAAAmpB,EAAU,IAAM,CAAE,KACft5B,CACP,EAAI,KAAO,CACP,MAAMmM,EAAO+hB,GAAe9vB,EAAM,MAAO6gB,CAAK,EAC9C,GAAI,CAAC9S,EAAM,CACPmtB,EAAQ,CACJ,MAAOzG,GAAe,QAAS,EAAG,gBAAgB,EAClD,KAAM,IAClB,CAAS,EACD,MACH,CACDwG,EAAYltB,EAAMgE,EAASmpB,EAASt5B,GAAW,CAAE,CAAA,CACrD,EAEMue,GAAU,CAACO,EAAUG,EAAO7gB,KAAW,CAIzC,UAAW,IAAM,CACbiwB,GAAejwB,EAAM,KAAK,EAAE,QAAQ+N,GAAQ,CACxCA,EAAK,OAAM,EACXA,EAAK,UAAS,EACdA,EAAK,gBAAe,CAChC,CAAS,CACJ,EAKD,cAAe,CAAC,CAAE,MAAA3N,EAAQ,CAAA,KAAS,CAE/B,MAAMuV,EAAQvV,EAAM,IAAI2X,IAAS,CAC7B,OAAQA,EAAK,OAASA,EAAK,OAASA,EACpC,QAASA,EAAK,OACjB,EAAC,EAIF,IAAIojB,EAAclL,GAAejwB,EAAM,KAAK,EAE5Cm7B,EAAY,QAAQptB,GAAQ,CAEnB4H,EAAM,KAAKoC,GAAQA,EAAK,SAAWhK,EAAK,QAAUgK,EAAK,SAAWhK,EAAK,IAAI,GAC5E2S,EAAS,cAAe,CAAE,MAAO3S,EAAM,OAAQ,EAAK,CAAE,CAEtE,CAAS,EAGDotB,EAAclL,GAAejwB,EAAM,KAAK,EACxC2V,EAAM,QAAQ,CAACoC,EAAM7X,IAAU,CAEvBi7B,EAAY,KAAKptB,GAAQA,EAAK,SAAWgK,EAAK,QAAUhK,EAAK,OAASgK,EAAK,MAAM,GAIrF2I,EAAS,WAAY,CACjB,GAAG3I,EACH,kBAAmBwV,GAAkB,KACrC,MAAArtB,CAChB,CAAa,CACb,CAAS,CACJ,EAED,yBAA0B,CAAC,CAAE,GAAAkC,EAAI,OAAA6I,EAAQ,OAAAsI,CAAM,IAAO,CAE9CA,EAAO,SAGX,aAAavT,EAAM,iBAAiB,EACpCA,EAAM,kBAAoB,WAAW,IAAM,CACvC,MAAM+N,EAAOssB,GAAYr6B,EAAM,MAAOoC,CAAE,EAGxC,GAAI,CAACye,EAAM,UAAU,EAAG,CAEpBmO,GAAiB,wBAAyB,GAAO,CAC7C,KAAAjhB,EACA,MAAA8S,EACA,OAAA5V,EACA,OAAAsI,CACpB,CAAiB,EAAE,KAAK6nB,GAAuB,CAE3B,MAAMC,EAAoBxa,EAAM,yBAAyB,EACrDwa,IACAD,EAAsBC,EAAkBttB,EAAMqtB,CAAmB,GAEhEA,GAEL1a,EACI,yBACA,CACI,MAAOte,EACP,KAAA2L,EACA,QAASgK,GAAQ,CACb2I,EAAS,qBAAsB,CAAE,GAAAte,EAAI,KAAA2V,CAAM,CAAA,CAC9C,CACJ,EACD,EACxB,CACA,CAAiB,EAED,MACH,CAGGhK,EAAK,SAAWwgB,GAAW,OAC3B7N,EAAS,gBAAiB,CACtB,GAAI3S,EAAK,GACT,MAAO,KACP,oBAAqBA,EAAK,MAC9C,CAAiB,EAIL,MAAMutB,EAAS,IAAM,CAEjB,WAAW,IAAM,CACb5a,EAAS,0BAA2B,CAAE,MAAOte,CAAI,CAAA,CACpD,EAAE,EAAE,CACrB,EAEkBw3B,EAAS2B,GAAY,CACvBxtB,EAAK,OACD0pB,GAAqBz3B,EAAM,QAAQ,OAAO,IAAKA,EAAM,QAAQ,OAAO,MAAM,EAC1E6gB,EAAM,kBAAkB,CAC3B,EACI,KAAK0a,EAAWD,EAAS,IAAM,EAAE,EACjC,MAAM,IAAM,CAAA,CAAE,CACnC,EAEkBzH,EAAQ0H,GAAY,CACtBxtB,EAAK,gBAAe,EAAG,KAAKwtB,EAAWD,EAAS,IAAM,CAAA,CAAE,CACxE,EAGY,GAAIvtB,EAAK,SAAWugB,GAAW,oBAC3B,OAAOsL,EAAO55B,EAAM,QAAQ,aAAa,EAI7C,GAAI+N,EAAK,SAAWugB,GAAW,WAC3B,OAAOuF,EAAM7zB,EAAM,QAAQ,aAAa,EAGxCA,EAAM,QAAQ,eACds7B,GAEP,EAAE,CAAC,EACP,EAED,UAAW,CAAC,CAAE,MAAAza,EAAO,MAAA3gB,KAAY,CAC7B,MAAM6N,EAAO+hB,GAAe9vB,EAAM,MAAO6gB,CAAK,EAC9C,GAAI,CAAC9S,EAAM,OACX,MAAMytB,EAAex7B,EAAM,MAAM,QAAQ+N,CAAI,EAC7C7N,EAAQ0c,GAAM1c,EAAO,EAAGF,EAAM,MAAM,OAAS,CAAC,EAC1Cw7B,IAAiBt7B,GACrBF,EAAM,MAAM,OAAOE,EAAO,EAAGF,EAAM,MAAM,OAAOw7B,EAAc,CAAC,EAAE,EAAE,CACtE,EAED,KAAM,CAAC,CAAE,QAAAT,KAAc,CACnBD,GAAU96B,EAAO+6B,CAAO,EACxBra,EAAS,iBAAkB,CACvB,MAAOG,EAAM,kBAAkB,CAC3C,CAAS,CACJ,EAED,UAAW,CAAC,CAAE,MAAA3P,EAAO,MAAAhR,EAAO,kBAAAu7B,EAAmB,QAAA1pB,EAAU,IAAM,GAAI,QAAAmpB,EAAU,IAAM,CAAA,KAAS,CACxF,IAAIM,EAAet7B,EAEnB,GAAIA,IAAU,IAAM,OAAOA,EAAU,IAAa,CAC9C,MAAMw7B,EAAiB7a,EAAM,0BAA0B,EACjD8a,EAAa9a,EAAM,iBAAiB,EAC1C2a,EAAeE,IAAmB,SAAW,EAAIC,CACpD,CAED,MAAMC,EAAe/a,EAAM,mBAAmB,EACxCgb,EAAcpI,GAChBgF,GAAOhF,CAAM,EAAI,CAACmI,EAAa,SAASnI,EAAO,KAAK,YAAW,CAAE,EAAI,CAAChW,GAAQgW,CAAM,EAGlFqI,EAFa5qB,EAAM,OAAO2qB,CAAW,EAEf,IACxBpI,GACI,IAAI,QAAQ,CAACvE,EAASC,IAAW,CAC7BzO,EAAS,WAAY,CACjB,kBAAA+a,EACA,OAAQhI,EAAO,QAAUA,EACzB,QAASvE,EACT,QAASC,EACT,MAAOqM,IACP,QAAS/H,EAAO,SAAW,CAAE,CACrD,CAAqB,CACrB,CAAiB,CACjB,EAEQ,QAAQ,IAAIqI,CAAQ,EACf,KAAK/pB,CAAO,EACZ,MAAMmpB,CAAO,CACrB,EAOD,SAAU,CAAC,CACP,OAAAzH,EACA,MAAAvzB,EAAQ,GACR,kBAAAu7B,EACA,QAAA1pB,EAAU,IAAM,CAAE,EAClB,QAAAmpB,EAAU,IAAM,CAAE,EAClB,QAAAt5B,EAAU,CAAE,CACpB,IAAU,CAEF,GAAI6b,GAAQgW,CAAM,EAAG,CACjByH,EAAQ,CACJ,MAAOzG,GAAe,QAAS,EAAG,WAAW,EAC7C,KAAM,IACtB,CAAa,EACD,MACH,CAGD,GAAIgE,GAAOhF,CAAM,GAAKzzB,EAAM,QAAQ,aAAa,SAASyzB,EAAO,KAAK,YAAa,CAAA,EAE/E,OAIJ,GAAI,CAACtC,GAAenxB,CAAK,EAAG,CAGxB,GACIA,EAAM,QAAQ,eACb,CAACA,EAAM,QAAQ,eAAiB,CAACA,EAAM,QAAQ,aAClD,CACE,MAAMia,GAAQwa,GAAe,UAAW,EAAG,WAAW,EAEtD/T,EAAS,sBAAuB,CAC5B,OAAA+S,EACA,MAAAxZ,EACpB,CAAiB,EAEDihB,EAAQ,CAAE,MAAAjhB,GAAO,KAAM,IAAM,CAAA,EAE7B,MACH,CAID,MAAMlM,GAAOkiB,GAAejwB,EAAM,KAAK,EAAE,GAGzC,GACI+N,GAAK,SAAWugB,GAAW,qBAC3BvgB,GAAK,SAAWugB,GAAW,wBAC7B,CACE,MAAMwL,GAAcjZ,EAAM,kBAAkB,EAoB5C,GAnBA9S,GAAK,OACD0pB,GAAqBz3B,EAAM,QAAQ,OAAO,IAAKA,EAAM,QAAQ,OAAO,MAAM,EAC1E85B,EACH,EACI,KAAK,IAAM,CACJ,CAACA,IAGLpZ,EAAS,WAAY,CACjB,OAAA+S,EACA,MAAAvzB,EACA,kBAAAu7B,EACA,QAAA1pB,EACA,QAAAmpB,EACA,QAAAt5B,CAC5B,CAAyB,CACzB,CAAqB,EACA,MAAM,IAAM,CAAA,CAAE,EAEfk4B,GAAa,MACpB,CAGDpZ,EAAS,cAAe,CAAE,MAAO3S,GAAK,EAAI,CAAA,CAC7C,CAGD,MAAM6qB,EACFh3B,EAAQ,OAAS,QACX2sB,GAAW,MACX3sB,EAAQ,OAAS,QACjB2sB,GAAW,MACXA,GAAW,MAGfxgB,EAAO4qB,GAETC,EAGAA,IAAWrK,GAAW,MAAQ,KAAOkF,EAGrC7xB,EAAQ,IACpB,EAGQ,OAAO,KAAKA,EAAQ,UAAY,CAAA,CAAE,EAAE,QAAQxC,IAAO,CAC/C2O,EAAK,YAAY3O,GAAKwC,EAAQ,SAASxC,GAAI,CACvD,CAAS,EAGDkwB,GAAa,kBAAmBvhB,EAAM,CAAE,MAAA8S,EAAO,SAAAH,CAAU,CAAA,EAGzD,MAAMqb,EAAqBlb,EAAM,0BAA0B,EAGtD7gB,EAAM,QAAQ,4BACfE,EAAQ67B,IAAuB,SAAW,GAAK/7B,EAAM,MAAM,QAI/DuxB,GAAWvxB,EAAM,MAAO+N,EAAM7N,CAAK,EAG/BorB,GAAWyQ,CAAkB,GAAKtI,GAClCqH,GAAU96B,EAAO+7B,CAAkB,EAIvC,MAAM35B,EAAK2L,EAAK,GAGhBA,EAAK,GAAG,OAAQ,IAAM,CAClB2S,EAAS,gBAAiB,CAAE,GAAAte,CAAE,CAAE,CAC5C,CAAS,EAED2L,EAAK,GAAG,YAAa,IAAM,CACvB2S,EAAS,sBAAuB,CAAE,GAAAte,CAAE,CAAE,CAClD,CAAS,EAED2L,EAAK,GAAG,YAAa,IAAM,CACvB2S,EAAS,uBAAwB,CAAE,GAAAte,CAAE,CAAE,CACnD,CAAS,EAED2L,EAAK,GAAG,gBAAiBonB,IAAY,CACjCzU,EAAS,gCAAiC,CAAE,GAAAte,EAAI,SAAA+yB,EAAU,CAAA,CACtE,CAAS,EAEDpnB,EAAK,GAAG,qBAAsBkM,IAAS,CACnC,MAAM+hB,GAAatB,GAAa16B,EAAM,QAAQ,kBAAkB,EAAEia,EAAK,EAGvE,GAAIA,GAAM,MAAQ,KAAOA,GAAM,KAAO,IAAK,CACvCyG,EAAS,yBAA0B,CAC/B,GAAAte,EACA,MAAA6X,GACA,OAAQ,CACJ,KAAM+hB,GACN,IAAK,GAAG/hB,GAAM,SAASA,GAAM,OAChC,CACrB,CAAiB,EAGDihB,EAAQ,CAAE,MAAAjhB,GAAO,KAAMmU,GAAcrgB,CAAI,CAAC,CAAE,EAC5C,MACH,CAGD2S,EAAS,4BAA6B,CAClC,GAAAte,EACA,MAAA6X,GACA,OAAQ,CACJ,KAAM+hB,GACN,IAAKh8B,EAAM,QAAQ,eACtB,CACjB,CAAa,CACb,CAAS,EAED+N,EAAK,GAAG,kBAAmBkM,IAAS,CAChCyG,EAAS,yBAA0B,CAC/B,GAAAte,EACA,MAAO6X,GAAM,OACb,OAAQA,GAAM,MAC9B,CAAa,EACDihB,EAAQ,CAAE,MAAOjhB,GAAM,OAAQ,KAAMmU,GAAcrgB,CAAI,CAAC,CAAE,CACtE,CAAS,EAEDA,EAAK,GAAG,aAAc,IAAM,CACxB2S,EAAS,cAAe,CAAE,MAAOte,CAAI,CAAA,CACjD,CAAS,EAED2L,EAAK,GAAG,YAAa,IAAM,CACvBA,EAAK,GAAG,kBAAmBwF,IAAU,CAC7B,CAACklB,GAAO1qB,EAAK,IAAI,GACrB2S,EAAS,2BAA4B,CAAE,GAAAte,EAAI,OAAAmR,EAAQ,CAAA,CACnE,CAAa,EAEDmN,EAAS,qBAAsB,CAC3B,MAAOte,EACP,KAAA2L,EACA,KAAM,CACF,OAAA0lB,EACA,QAAA1hB,CACH,CACjB,CAAa,CACb,CAAS,EAEDhE,EAAK,GAAG,OAAQ,IAAM,CAClB,MAAMkuB,GAAYC,IAAa,CAE3B,GAAI,CAACA,GAAW,CACZxb,EAAS,cAAe,CACpB,MAAOte,CAC/B,CAAqB,EACD,MACH,CAGD2L,EAAK,GAAG,kBAAmBwF,IAAU,CACjCmN,EAAS,2BAA4B,CAAE,GAAAte,EAAI,OAAAmR,EAAQ,CAAA,CACvE,CAAiB,EAIDyb,GAAiB,wBAAyB,GAAO,CAAE,KAAAjhB,EAAM,MAAA8S,CAAO,CAAA,EAAE,KAC9Dua,IAAuB,CAEnB,MAAMC,GAAoBxa,EAAM,yBAAyB,EACrDwa,KACAD,GAAsBC,GAAkBttB,EAAMqtB,EAAmB,GAErE,MAAMe,GAAe,IAAM,CACvBzb,EAAS,qBAAsB,CAC3B,MAAOte,EACP,KAAA2L,EACA,KAAM,CACF,OAAA0lB,EACA,QAAA1hB,CACH,CACjC,CAA6B,EAED6oB,GAAYla,EAAU1gB,CAAK,CACvD,EAGwB,GAAIo7B,GAAqB,CAErB1a,EACI,yBACA,CACI,MAAOte,EACP,KAAA2L,EACA,QAASgK,GAAQ,CACb2I,EAAS,qBAAsB,CAAE,GAAAte,EAAI,KAAA2V,CAAM,CAAA,EAC3CokB,IACH,CACJ,EACD,EAChC,EAE4B,MACH,CAEDA,IACH,CACrB,CACA,EAKYnN,GAAiB,gBAAiBjhB,EAAM,CAAE,MAAA8S,EAAO,SAAAH,CAAQ,CAAE,EACtD,KAAK,IAAM,CACRma,GAAgBha,EAAM,qBAAqB,EAAGuN,GAAcrgB,CAAI,CAAC,EAAE,KAC/DkuB,EACxB,CACA,CAAiB,EACA,MAAMvgC,IAAK,CACR,GAAI,CAACA,IAAK,CAACA,GAAE,OAAS,CAACA,GAAE,OAAQ,OAAOugC,GAAU,EAAK,EACvDvb,EAAS,yBAA0B,CAC/B,GAAAte,EACA,MAAO1G,GAAE,MACT,OAAQA,GAAE,MAClC,CAAqB,CACrB,CAAiB,CACjB,CAAS,EAEDqS,EAAK,GAAG,gBAAiB,IAAM,CAC3B2S,EAAS,4BAA6B,CAAE,GAAAte,CAAE,CAAE,CACxD,CAAS,EAED2L,EAAK,GAAG,mBAAoBonB,IAAY,CACpCzU,EAAS,mCAAoC,CAAE,GAAAte,EAAI,SAAA+yB,EAAU,CAAA,CACzE,CAAS,EAEDpnB,EAAK,GAAG,gBAAiBkM,IAAS,CAC9ByG,EAAS,kCAAmC,CACxC,GAAAte,EACA,MAAA6X,GACA,OAAQ,CACJ,KAAMygB,GAAa16B,EAAM,QAAQ,wBAAwB,EAAEia,EAAK,EAChE,IAAKja,EAAM,QAAQ,eACtB,CACjB,CAAa,CACb,CAAS,EAED+N,EAAK,GAAG,uBAAwBkM,IAAS,CACrCyG,EAAS,yCAA0C,CAC/C,GAAAte,EACA,MAAA6X,GACA,OAAQ,CACJ,KAAMygB,GAAa16B,EAAM,QAAQ,8BAA8B,EAAEia,EAAK,EACtE,IAAKja,EAAM,QAAQ,eACtB,CACjB,CAAa,CACb,CAAS,EAED+N,EAAK,GAAG,mBAAoB8qB,IAAuB,CAC/CnY,EAAS,+BAAgC,CACrC,GAAAte,EACA,MAAO,KACP,oBAAAy2B,EAChB,CAAa,EACDnY,EAAS,mBAAoB,CAAE,GAAAte,EAAI,MAAOy2B,EAAqB,CAAA,CAC3E,CAAS,EAED9qB,EAAK,GAAG,gBAAiB,IAAM,CAC3B2S,EAAS,4BAA6B,CAAE,GAAAte,CAAE,CAAE,CACxD,CAAS,EAED2L,EAAK,GAAG,iBAAkB,IAAM,CAC5B2S,EAAS,6BAA8B,CAAE,GAAAte,CAAE,CAAE,EAC7Cse,EAAS,mBAAoB,CAAE,GAAAte,EAAI,MAAO,IAAM,CAAA,CAC5D,CAAS,EAGDse,EAAS,eAAgB,CAAE,GAAAte,EAAI,MAAAlC,EAAO,kBAAAu7B,CAAmB,CAAA,EAEzDb,GAAYla,EAAU1gB,CAAK,EAG3B,KAAM,CAAE,IAAAqD,EAAK,KAAAywB,EAAM,QAAAsI,EAAS,MAAAC,EAAO,EAAGr8B,EAAM,QAAQ,QAAU,GAE9D+N,EAAK,KACD0lB,EAGAC,GACIkF,IAAWrK,GAAW,MAEhBzD,GAAS2I,CAAM,GAAKgH,GAAchH,CAAM,GACpC4I,GACItH,GAAoB1xB,EAAKg5B,EAAK,EAElC9B,GAEN3B,IAAWrK,GAAW,MACpBwG,GAAoB1xB,EAAK+4B,CAAO,EAChCrH,GAAoB1xB,EAAKywB,CAAI,CACtC,EAGD,CAAC/b,GAAMhG,GAASkI,KAAU,CAEtB+U,GAAiB,YAAajX,GAAM,CAAE,MAAA8I,CAAK,CAAE,EACxC,KAAK9O,EAAO,EACZ,MAAMkI,EAAK,CACnB,CACb,CACK,EAED,uBAAwB,CAAC,CAAE,KAAAlM,EAAM,QAAAgE,EAAS,QAAAmpB,EAAU,IAAM,CAAA,KAAS,CAE/D,MAAM93B,EAAM,CACR,MAAOqxB,GAAe,QAAS,EAAG,gBAAgB,EAClD,KAAM,IAClB,EAGQ,GAAI1mB,EAAK,SAAU,OAAOmtB,EAAQ93B,CAAG,EAGrC4rB,GAAiB,iBAAkBjhB,EAAK,KAAM,CAAE,MAAA8S,EAAO,KAAA9S,CAAM,CAAA,EAAE,KAAK5K,GAAU,CAC1E6rB,GAAiB,0BAA2B7rB,EAAQ,CAAE,MAAA0d,EAAO,KAAA9S,EAAM,EAAE,KAAK5K,GAAU,CAEhF,GAAI4K,EAAK,SAAU,OAAOmtB,EAAQ93B,CAAG,EAGrC2O,EAAQ5O,CAAM,CAC9B,CAAa,CACb,CAAS,CACJ,EAED,mBAAoB,CAAC,CAAE,KAAA4K,EAAM,KAAA1L,KAAW,CACpC,KAAM,CAAE,QAAA0P,EAAS,OAAA0hB,CAAQ,EAAGpxB,EAGtB05B,EAAqBlb,EAAM,0BAA0B,EAiB3D,GAhBIyK,GAAWyQ,CAAkB,GAAKtI,GAClCqH,GAAU96B,EAAO+7B,CAAkB,EAIvCrb,EAAS,gBAAiB,CACtB,GAAI3S,EAAK,GACT,MAAO,KACP,oBAAqBA,EAAK,SAAWwgB,GAAW,MAAQ,KAAOkF,CAC3E,CAAS,EAID1hB,EAAQqc,GAAcrgB,CAAI,CAAC,EAGvBA,EAAK,SAAWwgB,GAAW,MAAO,CAClC7N,EAAS,sBAAuB,CAAE,GAAI3S,EAAK,EAAI,CAAA,EAC/C,MACH,CAGD,GAAIA,EAAK,SAAWwgB,GAAW,MAAO,CAClC7N,EAAS,+BAAgC,CACrC,GAAI3S,EAAK,GACT,MAAO,KACP,oBAAqB0lB,CACrC,CAAa,EAED/S,EAAS,mBAAoB,CACzB,GAAI3S,EAAK,GACT,MAAOA,EAAK,UAAY0lB,CACxC,CAAa,EACD,MACH,CAGG5S,EAAM,UAAU,GAAK7gB,EAAM,QAAQ,eACnC0gB,EAAS,0BAA2B,CAAE,MAAO3S,EAAK,EAAI,CAAA,CAE7D,EAED,gBAAiBitB,GAAwBh7B,EAAO+N,GAAQ,CAEpDA,EAAK,UAAS,CACtB,CAAK,EAED,qBAAsBitB,GAAwBh7B,EAAO,CAAC+N,EAAMgE,EAASmpB,IAAY,CAC7Exa,EACI,yBACA,CACI,MAAO3S,EAAK,GACZ,KAAAA,EACA,QAASgK,GAAQ,CACb2I,EAAS,qBAAsB,CAAE,GAAI3S,EAAK,GAAI,KAAAgK,CAAI,CAAE,EACpDhG,EAAQ,CACJ,KAAMhE,EACN,OAAQgK,CAChC,CAAqB,CACJ,EACD,QAAAmjB,CACH,EACD,EACZ,CACA,CAAK,EAED,wBAAyBF,GAAwBh7B,EAAO,CAAC+N,EAAMgE,EAASmpB,IAAY,CAShF,GAAI,EALAntB,EAAK,SAAWugB,GAAW,MAE3BvgB,EAAK,SAAWugB,GAAW,kBAGI,CAC/B,MAAMgO,EAAa,IACf5b,EAAS,0BAA2B,CAAE,MAAO3S,EAAM,QAAAgE,EAAS,QAAAmpB,CAAO,CAAE,EAEnE1G,EAAU,IAAO,SAAS,OAAS8H,EAAY,EAAG,WAAWA,EAAY,EAAE,EAI7EvuB,EAAK,SAAWugB,GAAW,qBAC3BvgB,EAAK,SAAWugB,GAAW,wBAE3BvgB,EAAK,OACD0pB,GAAqBz3B,EAAM,QAAQ,OAAO,IAAKA,EAAM,QAAQ,OAAO,MAAM,EAC1E6gB,EAAM,kBAAkB,CAC3B,EACI,KAAK2T,CAAO,EACZ,MAAM,IAAM,CAAA,CAAE,EACZzmB,EAAK,SAAWugB,GAAW,YAClCvgB,EAAK,gBAAe,EAAG,KAAKymB,CAAO,EAGvC,MACH,CAGGzmB,EAAK,SAAWugB,GAAW,oBAE/BvgB,EAAK,kBAAiB,EAEtB2S,EAAS,8BAA+B,CAAE,GAAI3S,EAAK,EAAI,CAAA,EAEvD2S,EAAS,eAAgB,CAAE,MAAO3S,EAAM,QAAAgE,EAAS,QAAAmpB,CAAO,EAAI,EAAI,EACxE,CAAK,EAED,aAAcF,GAAwBh7B,EAAO,CAAC+N,EAAMgE,EAASmpB,IAAY,CACrE,MAAMqB,EAAqB1b,EAAM,0BAA0B,EAI3D,GAH4BA,EAAM,sBAAuByN,GAAW,UAAU,EAAE,SAGpDiO,EAAoB,CAE5Cv8B,EAAM,gBAAgB,KAAK,CACvB,GAAI+N,EAAK,GACT,QAAAgE,EACA,QAAAmpB,CAChB,CAAa,EAGD,MACH,CAGD,GAAIntB,EAAK,SAAWugB,GAAW,WAAY,OAE3C,MAAMkO,EAAc,IAAM,CAEtB,MAAMC,EAAaz8B,EAAM,gBAAgB,MAAK,EAG9C,GAAI,CAACy8B,EAAY,OAGjB,KAAM,CAAE,GAAAr6B,EAAI,QAAA2P,EAAS,QAAAmpB,CAAO,EAAKuB,EAC3BC,EAAgB5M,GAAe9vB,EAAM,MAAOoC,CAAE,EAGpD,GAAI,CAACs6B,GAAiBA,EAAc,SAAU,CAC1CF,IACA,MACH,CAGD9b,EAAS,eAAgB,CAAE,MAAOte,EAAI,QAAA2P,EAAS,QAAAmpB,CAAO,EAAI,EAAI,CAC1E,EAGQntB,EAAK,OAAO,mBAAoB,IAAM,CAClCgE,EAAQqc,GAAcrgB,CAAI,CAAC,EAC3ByuB,IAIA,MAAMG,EAAS38B,EAAM,QAAQ,OAE7B,GADsBA,EAAM,QAAQ,eACf+N,EAAK,SAAWwgB,GAAW,OAASjD,GAAWqR,EAAO,MAAM,EAAG,CAChF,MAAMC,EAAO,IAAM,GACnB7uB,EAAK,OAASwgB,GAAW,MACzBvuB,EAAM,QAAQ,OAAO,OAAO+N,EAAK,OAAQ6uB,EAAMA,CAAI,CACtD,CAIG/b,EAAM,sBAAuByN,GAAW,mBAAmB,EAAE,SAC7DtuB,EAAM,MAAM,QAEZ0gB,EAAS,kCAAkC,CAE3D,CAAS,EAGD3S,EAAK,OAAO,gBAAiBkM,GAAS,CAClCihB,EAAQ,CAAE,MAAAjhB,EAAO,KAAMmU,GAAcrgB,CAAI,CAAC,CAAE,EAC5CyuB,GACZ,CAAS,EAGD,MAAM56B,EAAU5B,EAAM,QACtB+N,EAAK,QACDiqB,GACIT,GAAwB31B,EAAQ,OAAO,IAAKA,EAAQ,OAAO,QAASA,EAAQ,KAAM,CAC9E,gBAAiBmM,EAAK,WACtB,YAAanM,EAAQ,OAAO,MAC5B,aAAcA,EAAQ,aACtB,WAAYA,EAAQ,WACpB,UAAWA,EAAQ,UACnB,iBAAkBA,EAAQ,gBAC9C,CAAiB,EACD,CACI,2BAA4Bif,EAAM,mCAAmC,CACxE,CACJ,EAED,CAAC9I,EAAMhG,EAASkI,IAAU,CAEtB+U,GAAiB,iBAAkBjX,EAAM,CAAE,MAAA8I,EAAO,KAAA9S,CAAI,CAAE,EACnD,KAAKgK,GAAQ,CACV2I,EAAS,qBAAsB,CAAE,GAAI3S,EAAK,GAAI,KAAAgK,CAAI,CAAE,EAEpDhG,EAAQgG,CAAI,CACpC,CAAqB,EACA,MAAMkC,CAAK,CACnB,CACb,CACA,CAAK,EAED,sBAAuB+gB,GAAwBh7B,EAAO+N,GAAQ,CAC1D2S,EAAS,0BAA2B,CAAE,MAAO3S,CAAM,CAAA,CAC3D,CAAK,EAED,oBAAqBitB,GAAwBh7B,EAAO+N,GAAQ,CACxD8sB,GAAgBha,EAAM,wBAAwB,EAAGuN,GAAcrgB,CAAI,CAAC,EAAE,KAAK8uB,GAAgB,CACnF,CAACA,GAGLnc,EAAS,cAAe,CAAE,MAAO3S,CAAM,CAAA,CACnD,CAAS,CACT,CAAK,EAED,aAAcitB,GAAwBh7B,EAAO+N,GAAQ,CACjDA,EAAK,QAAO,CACpB,CAAK,EAED,YAAaitB,GAAwBh7B,EAAO,CAAC+N,EAAMgE,EAASmpB,EAASt5B,IAAY,CAC7E,MAAMk7B,EAAiB,IAAM,CAEzB,MAAM16B,EAAK2L,EAAK,GAGhBssB,GAAYr6B,EAAM,MAAOoC,CAAE,EAAE,QAAO,EAGpCse,EAAS,kBAAmB,CAAE,MAAO,KAAM,GAAAte,EAAI,KAAA2L,CAAI,CAAE,EAGrD6sB,GAAYla,EAAU1gB,CAAK,EAG3B+R,EAAQqc,GAAcrgB,CAAI,CAAC,CACvC,EAIc4uB,EAAS38B,EAAM,QAAQ,OAEzB+N,EAAK,SAAWwgB,GAAW,OAC3BoO,GACArR,GAAWqR,EAAO,MAAM,GACxB/6B,EAAQ,SAAW,IAEnB8e,EAAS,wBAAyB,CAAE,GAAI3S,EAAK,EAAI,CAAA,EAEjD4uB,EAAO,OACH5uB,EAAK,OACL,IAAM+uB,EAAgB,EACtB5L,GAAU,CACNxQ,EAAS,8BAA+B,CACpC,GAAI3S,EAAK,GACT,MAAO0mB,GAAe,QAAS,EAAGvD,EAAQ,IAAI,EAC9C,OAAQ,CACJ,KAAMwJ,GAAa16B,EAAM,QAAQ,oBAAoB,EAAEkxB,CAAM,EAC7D,IAAKlxB,EAAM,QAAQ,eACtB,CACzB,CAAqB,CACJ,CACjB,KAIiB4B,EAAQ,QAAUmM,EAAK,SAAWwgB,GAAW,OAASxgB,EAAK,WAAa,MAIxE/N,EAAM,QAAQ,cAAgB+N,EAAK,KAAK,KAAO/N,EAAM,QAAQ,WAC7DA,EAAM,QAAQ,cAAgBA,EAAM,QAAQ,aAE7C+N,EAAK,OACD0pB,GAAqBz3B,EAAM,QAAQ,OAAO,IAAKA,EAAM,QAAQ,OAAO,MAAM,EAC1E6gB,EAAM,kBAAkB,CAC5C,EAIYic,IAEZ,CAAK,EAED,gBAAiB9B,GAAwBh7B,EAAO+N,GAAQ,CACpDA,EAAK,UAAS,CACtB,CAAK,EAED,sBAAuBitB,GAAwBh7B,EAAO+N,GAAQ,CAE1D,GAAIA,EAAK,SAAU,CACf2S,EAAS,yBAA0B,CAAE,GAAI3S,EAAK,EAAI,CAAA,EAClD,MACH,CAGDA,EAAK,kBAAkB,KAAK,IAAM,CACT/N,EAAM,QAAQ,eAE/B0gB,EAAS,cAAe,CAAE,MAAO3S,EAAK,EAAI,CAAA,CAE1D,CAAS,CACT,CAAK,EAED,+BAAgCitB,GAAwBh7B,EAAO+N,GAAQ,CAEnE,GAAI,CAAC/N,EAAM,QAAQ,cAAe,CAC9B0gB,EAAS,yBAA0B,CAAE,MAAO3S,CAAM,CAAA,EAClD,MACH,CAID,MAAMgvB,EAAeC,GAAgB,CAC7B,CAACA,GACLtc,EAAS,yBAA0B,CAAE,MAAO3S,CAAM,CAAA,CAC9D,EAEciX,EAAKnE,EAAM,wBAAwB,EACzC,GAAI,CAACmE,EACD,OAAO+X,EAAa,EAAI,EAG5B,MAAME,EAAsBjY,EAAGoJ,GAAcrgB,CAAI,CAAC,EAClD,GAAIkvB,GAAuB,KAEvB,OAAOF,EAAa,EAAI,EAG5B,GAAI,OAAOE,GAAwB,UAC/B,OAAOF,EAAaE,CAAmB,EAGvC,OAAOA,EAAoB,MAAS,YACpCA,EAAoB,KAAKF,CAAY,CAEjD,CAAK,EAED,uBAAwB/B,GAAwBh7B,EAAO+N,GAAQ,CAC3DA,EAAK,OACD0pB,GAAqBz3B,EAAM,QAAQ,OAAO,IAAKA,EAAM,QAAQ,OAAO,MAAM,EAC1E6gB,EAAM,kBAAkB,CAC3B,EACI,KAAK,IAAM,EACa7gB,EAAM,QAAQ,eAAiB26B,GAAW5sB,CAAI,IAE/D2S,EAAS,cAAe,CAAE,MAAO3S,EAAK,EAAI,CAAA,CAE9D,CAAa,EACA,MAAM,IAAM,CAAA,CAAE,CAC3B,CAAK,EAED,YAAa,CAAC,CAAE,QAAAnM,KAAc,CAE1B,MAAMs7B,EAAa,OAAO,KAAKt7B,CAAO,EAGhCu7B,EAAwBC,GAAmB,OAAOh+B,GAAO89B,EAAW,SAAS99B,CAAG,CAAC,EAG7D,CAEtB,GAAG+9B,EAGH,GAAG,OAAO,KAAKv7B,CAAO,EAAE,OAAOxC,GAAO,CAAC+9B,EAAsB,SAAS/9B,CAAG,CAAC,CACtF,EAG0B,QAAQA,GAAO,CAC7BshB,EAAS,OAAOwM,GAAW9tB,EAAK,GAAG,EAAE,YAAa,IAAI,CAClD,MAAOwC,EAAQxC,EAC/B,CAAa,CACb,CAAS,CACJ,CACL,GAEMg+B,GAAqB,CACvB,QACJ,EAEMC,GAAiB7sB,GAAQA,EAEzB8sB,GAAkBC,GACb,SAAS,cAAcA,CAAO,EAGnCpxB,GAAO,CAAC3L,EAAMJ,IAAU,CAC1B,IAAIo9B,EAAWh9B,EAAK,WAAW,GAC1Bg9B,EAGMp9B,IAAUo9B,EAAS,YAC1BA,EAAS,UAAYp9B,IAHrBo9B,EAAW,SAAS,eAAep9B,CAAK,EACxCI,EAAK,YAAYg9B,CAAQ,EAIjC,EAEMC,GAAmB,CAACC,EAASC,EAASC,EAAQC,IAAmB,CACnE,MAAMC,GAAoBD,EAAiB,IAAO,IAAM,KAAK,GAAM,IACnE,MAAO,CACH,EAAGH,EAAUE,EAAS,KAAK,IAAIE,CAAc,EAC7C,EAAGH,EAAUC,EAAS,KAAK,IAAIE,CAAc,CACrD,CACA,EAEMC,GAAc,CAACjhC,EAAGC,EAAG6gC,EAAQI,EAAYC,EAAUC,IAAa,CAClE,MAAMna,EAAQ0Z,GAAiB3gC,EAAGC,EAAG6gC,EAAQK,CAAQ,EAC/CE,EAAMV,GAAiB3gC,EAAGC,EAAG6gC,EAAQI,CAAU,EACrD,MAAO,CAAC,IAAKja,EAAM,EAAGA,EAAM,EAAG,IAAK6Z,EAAQA,EAAQ,EAAGM,EAAU,EAAGC,EAAI,EAAGA,EAAI,CAAC,EAAE,KAAK,GAAG,CAC9F,EAEMC,GAAgB,CAACthC,EAAGC,EAAG6gC,EAAQS,EAAMC,IAAO,CAC9C,IAAIJ,EAAW,EACf,OAAII,EAAKD,GAAQC,EAAKD,GAAQ,KAC1BH,EAAW,GAEXG,EAAOC,GAAMD,EAAOC,GAAM,KAC1BJ,EAAW,GAERH,GACHjhC,EACAC,EACA6gC,EACA,KAAK,IAAI,MAAQS,CAAI,EAAI,IACzB,KAAK,IAAI,MAAQC,CAAE,EAAI,IACvBJ,CACR,CACA,EAEMjX,GAAS,CAAC,CAAE,KAAAgD,EAAM,MAAA5F,KAAY,CAEhCA,EAAM,KAAO,GACbA,EAAM,SAAW,EACjBA,EAAM,QAAU,EAGhB,MAAMka,EAAMvhB,GAAc,KAAK,EAC/BiN,EAAK,IAAI,KAAOjN,GAAc,OAAQ,CAClC,eAAgB,EAChB,iBAAkB,OAC1B,CAAK,EACDuhB,EAAI,YAAYtU,EAAK,IAAI,IAAI,EAE7BA,EAAK,IAAI,IAAMsU,EAEftU,EAAK,YAAYsU,CAAG,CACxB,EAEMvX,GAAQ,CAAC,CAAE,KAAAiD,EAAM,MAAA5F,KAAY,CAC/B,GAAIA,EAAM,UAAY,EAClB,OAGAA,EAAM,QACN4F,EAAK,QAAQ,QAAQ,MAAQ5F,EAAM,OAIvC,MAAMma,EAAkB,SAAS3mB,GAAKoS,EAAK,IAAI,KAAM,cAAc,EAAG,EAAE,EAGlEzR,EAAOyR,EAAK,KAAK,QAAQ,MAAQ,GAGvC,IAAIwU,EAAW,EACXC,EAAS,EAGTra,EAAM,MACNoa,EAAW,EACXC,EAAS,KAETD,EAAW,EACXC,EAASra,EAAM,UAInB,MAAMsa,EAAcP,GAAc5lB,EAAMA,EAAMA,EAAOgmB,EAAiBC,EAAUC,CAAM,EAGtF7mB,GAAKoS,EAAK,IAAI,KAAM,IAAK0U,CAAW,EAGpC9mB,GAAKoS,EAAK,IAAI,KAAM,iBAAkB5F,EAAM,MAAQA,EAAM,SAAW,EAAI,EAAI,CAAC,CAClF,EAEMua,GAAoB9X,GAAW,CACjC,IAAK,MACL,KAAM,qBACN,iBAAkB,GAClB,WAAY,GACZ,OAAAG,GACA,MAAAD,GACA,OAAQ,CACJ,KAAM,CAAC,WAAY,OAAQ,OAAO,EAClC,OAAQ,CAAC,SAAS,EAClB,WAAY,CACR,QAAS,CAAE,KAAM,QAAS,SAAU,GAAK,EACzC,SAAU,CACN,KAAM,SACN,UAAW,IACX,QAAS,IACT,KAAM,EACT,CACJ,CACJ,CACL,CAAC,EAEK6X,GAAW,CAAC,CAAE,KAAA5U,EAAM,MAAA5F,KAAY,CAClC4F,EAAK,QAAQ,WAAa5F,EAAM,MAAQ,IAAM,SAASA,EAAM,eAE7DA,EAAM,WAAa,EACvB,EAEMya,GAAU,CAAC,CAAE,KAAA7U,EAAM,MAAA5F,KAAY,CACjC,KAAM,CAAE,WAAA0a,CAAY,EAAG1a,EACjB2a,EAAgB/U,EAAK,MAAM,cAAc,GAAK5F,EAAM,UAAY,EAElE2a,GAAiB,CAACD,GAClB1a,EAAM,WAAa,GACnBxM,GAAKoS,EAAK,QAAS,WAAY,UAAU,GAClC,CAAC+U,GAAiBD,IACzB1a,EAAM,WAAa,GACnB4F,EAAK,QAAQ,gBAAgB,UAAU,EAE/C,EAEMgV,GAAmBnY,GAAW,CAChC,IAAK,SACL,WAAY,CACR,KAAM,QACT,EACD,WAAY,GACZ,iBAAkB,GAClB,KAAM,qBACN,OAAQ,CACJ,KAAM,CAAC,OAAO,EACd,OAAQ,CAAC,aAAc,aAAc,SAAU,SAAU,SAAS,EAClE,WAAY,CACR,OAAQ,SACR,OAAQ,SACR,WAAY,SACZ,WAAY,SACZ,QAAS,CAAE,KAAM,QAAS,SAAU,GAAK,CAC5C,EACD,UAAW,EACd,EACD,OAAQ+X,GACR,MAAOC,EACX,CAAC,EAEKI,GAAoB,CAACC,EAAOxQ,EAAmB,IAAKvD,EAAO,IAAMxpB,EAAU,KAAO,CACpF,KAAM,CACF,WAAAw9B,EAAa,QACb,eAAAC,EAAiB,KACjB,eAAAC,EAAiB,KACjB,eAAAC,EAAiB,IACpB,EAAG39B,EAGJu9B,EAAQ,KAAK,MAAM,KAAK,IAAIA,CAAK,CAAC,EAElC,MAAMK,EAAKpU,EACLqU,EAAKrU,EAAOA,EACZsU,EAAKtU,EAAOA,EAAOA,EAGzB,OAAI+T,EAAQK,EACD,GAAGL,KAASC,IAInBD,EAAQM,EACD,GAAG,KAAK,MAAMN,EAAQK,CAAE,KAAKH,IAIpCF,EAAQO,EACD,GAAGC,GAAuBR,EAAQM,EAAI,EAAG9Q,CAAgB,KAAK2Q,IAIlE,GAAGK,GAAuBR,EAAQO,EAAI,EAAG/Q,CAAgB,KAAK4Q,GACzE,EAEMI,GAAyB,CAACv/B,EAAOw/B,EAAch5B,IAC1CxG,EACF,QAAQw/B,CAAY,EACpB,MAAM,GAAG,EACT,OAAOzS,GAAQA,IAAS,GAAG,EAC3B,KAAKvmB,CAAS,EAGjBi5B,GAAW,CAAC,CAAE,KAAA5V,EAAM,MAAA5F,KAAY,CAElC,MAAMyb,EAAWxC,GAAgB,MAAM,EACvCwC,EAAS,UAAY,2BAIrBjoB,GAAKioB,EAAU,cAAe,MAAM,EACpC7V,EAAK,YAAY6V,CAAQ,EACzB7V,EAAK,IAAI,SAAW6V,EAGpB,MAAMC,EAAWzC,GAAgB,MAAM,EACvCyC,EAAS,UAAY,0BACrB9V,EAAK,YAAY8V,CAAQ,EACzB9V,EAAK,IAAI,SAAW8V,EAGpB5zB,GAAK4zB,EAAU9V,EAAK,MAAM,iCAAiC,CAAC,EAC5D9d,GAAK2zB,EAAUzC,GAAepT,EAAK,MAAM,gBAAiB5F,EAAM,EAAE,CAAC,CAAC,CACxE,EAEM2b,GAAa,CAAC,CAAE,KAAA/V,EAAM,MAAA5F,KAAY,CACpClY,GACI8d,EAAK,IAAI,SACTiV,GACIjV,EAAK,MAAM,gBAAiB5F,EAAM,EAAE,EACpC,IACA4F,EAAK,MAAM,oBAAoB,EAC/BA,EAAK,MAAM,uBAAwBA,EAAK,KAAK,CAChD,CACT,EACI9d,GAAK8d,EAAK,IAAI,SAAUoT,GAAepT,EAAK,MAAM,gBAAiB5F,EAAM,EAAE,CAAC,CAAC,CACjF,EAEM4b,GAAwB,CAAC,CAAE,KAAAhW,EAAM,MAAA5F,KAAY,CAE/C,GAAI6G,GAAMjB,EAAK,MAAM,gBAAiB5F,EAAM,EAAE,CAAC,EAAG,CAC9C2b,GAAW,CAAE,KAAA/V,EAAM,MAAA5F,CAAK,CAAE,EAC1B,MACH,CAEDlY,GAAK8d,EAAK,IAAI,SAAUA,EAAK,MAAM,mCAAmC,CAAC,CAC3E,EAEMiW,GAAWpZ,GAAW,CACxB,KAAM,YACN,WAAY,GACZ,iBAAkB,GAClB,MAAOiD,GAAY,CACf,cAAeiW,GACf,qBAAsBA,GACtB,0BAA2BC,GAC3B,uBAAwBA,EAChC,CAAK,EACD,cAAehW,GAAQ,CACnBqF,GAAa,cAAe,CAAE,GAAGrF,EAAM,KAAMA,CAAI,CAAE,CACtD,EACD,OAAQ4V,GACR,OAAQ,CACJ,OAAQ,CAAC,aAAc,YAAY,EACnC,WAAY,CACR,WAAY,SACZ,WAAY,QACf,CACJ,CACL,CAAC,EAEKM,GAAe//B,GAAS,KAAK,MAAMA,EAAQ,GAAG,EAE9CggC,GAAW,CAAC,CAAE,KAAAnW,KAAW,CAE3B,MAAMoW,EAAO/C,GAAgB,MAAM,EACnC+C,EAAK,UAAY,6BACjBpW,EAAK,YAAYoW,CAAI,EACrBpW,EAAK,IAAI,KAAOoW,EAGhB,MAAMC,EAAMhD,GAAgB,MAAM,EAClCgD,EAAI,UAAY,4BAChBrW,EAAK,YAAYqW,CAAG,EACpBrW,EAAK,IAAI,IAAMqW,EAEfC,GAAuB,CAAE,KAAAtW,EAAM,OAAQ,CAAE,SAAU,IAAM,CAAA,CAAE,CAC/D,EAEMsW,GAAyB,CAAC,CAAE,KAAAtW,EAAM,OAAAhf,KAAa,CACjD,MAAMgC,EACFhC,EAAO,WAAa,KACdgf,EAAK,MAAM,wBAAwB,EACnC,GAAGA,EAAK,MAAM,wBAAwB,KAAKkW,GAAal1B,EAAO,QAAQ,KACjFkB,GAAK8d,EAAK,IAAI,KAAMhd,CAAK,EACzBd,GAAK8d,EAAK,IAAI,IAAKA,EAAK,MAAM,yBAAyB,CAAC,CAC5D,EAEMuW,GAA4B,CAAC,CAAE,KAAAvW,EAAM,OAAAhf,KAAa,CACpD,MAAMgC,EACFhC,EAAO,WAAa,KACdgf,EAAK,MAAM,2BAA2B,EACtC,GAAGA,EAAK,MAAM,2BAA2B,KAAKkW,GAAal1B,EAAO,QAAQ,KACpFkB,GAAK8d,EAAK,IAAI,KAAMhd,CAAK,EACzBd,GAAK8d,EAAK,IAAI,IAAKA,EAAK,MAAM,yBAAyB,CAAC,CAC5D,EAEMwW,GAA2B,CAAC,CAAE,KAAAxW,KAAW,CAC3C9d,GAAK8d,EAAK,IAAI,KAAMA,EAAK,MAAM,2BAA2B,CAAC,EAC3D9d,GAAK8d,EAAK,IAAI,IAAKA,EAAK,MAAM,yBAAyB,CAAC,CAC5D,EAEMyW,GAAyB,CAAC,CAAE,KAAAzW,KAAW,CACzC9d,GAAK8d,EAAK,IAAI,KAAMA,EAAK,MAAM,mCAAmC,CAAC,EACnE9d,GAAK8d,EAAK,IAAI,IAAKA,EAAK,MAAM,wBAAwB,CAAC,CAC3D,EAEM0W,GAA4B,CAAC,CAAE,KAAA1W,KAAW,CAC5C9d,GAAK8d,EAAK,IAAI,KAAMA,EAAK,MAAM,oCAAoC,CAAC,EACpE9d,GAAK8d,EAAK,IAAI,IAAKA,EAAK,MAAM,uBAAuB,CAAC,CAC1D,EAEM2W,GAAQ,CAAC,CAAE,KAAA3W,KAAW,CACxB9d,GAAK8d,EAAK,IAAI,KAAM,EAAE,EACtB9d,GAAK8d,EAAK,IAAI,IAAK,EAAE,CACzB,EAEMhQ,GAAQ,CAAC,CAAE,KAAAgQ,EAAM,OAAAhf,KAAa,CAChCkB,GAAK8d,EAAK,IAAI,KAAMhf,EAAO,OAAO,IAAI,EACtCkB,GAAK8d,EAAK,IAAI,IAAKhf,EAAO,OAAO,GAAG,CACxC,EAEM41B,GAAa/Z,GAAW,CAC1B,KAAM,cACN,WAAY,GACZ,iBAAkB,GAClB,MAAOiD,GAAY,CACf,cAAe6W,GACf,2BAA4BA,GAC5B,4BAA6BH,GAC7B,0BAA2BC,GAC3B,6BAA8BC,GAC9B,iCAAkCH,GAClC,8BAA+BD,GAC/B,0BAA2BtmB,GAC3B,uBAAwBA,GACxB,gCAAiCA,GACjC,uCAAwCA,GACxC,4BAA6BA,EACrC,CAAK,EACD,cAAegQ,GAAQ,CACnBqF,GAAa,cAAe,CAAE,GAAGrF,EAAM,KAAMA,CAAI,CAAE,CACtD,EACD,OAAQmW,GACR,OAAQ,CACJ,OAAQ,CAAC,aAAc,aAAc,SAAS,EAC9C,WAAY,CACR,QAAS,CAAE,KAAM,QAAS,SAAU,GAAK,EACzC,WAAY,SACZ,WAAY,QACf,CACJ,CACL,CAAC,EAMKU,GAAU,CACZ,cAAe,CACX,MAAO,mCACP,OAAQ,kBACR,UAAW,mCACX,MAAO,yBACV,EACD,cAAe,CACX,MAAO,mCACP,OAAQ,kBACR,KAAM,iBACN,UAAW,mCACX,MAAO,8BACV,EACD,WAAY,CACR,MAAO,+BACP,OAAQ,sBACR,KAAM,kBACN,UAAW,+BACX,MAAO,6BACV,EACD,YAAa,CACT,MAAO,gCACP,OAAQ,0BACR,KAAM,mBACN,UAAW,gCACX,MAAO,8BACV,EACD,oBAAqB,CACjB,MAAO,yCACP,OAAQ,wBACR,UAAW,yCACX,MAAO,8BACV,EACD,oBAAqB,CACjB,MAAO,yCACP,OAAQ,wBACR,KAAM,iBACN,UAAW,yCACX,MAAO,8BACV,EACD,qBAAsB,CAClB,MAAO,wCACP,OAAQ,iCACR,KAAM,gBACN,UAAW,0CACX,MAAO,8BACV,CACL,EAGMC,GAAa,CAAA,EACnB7f,GAAM4f,GAAS1hC,GAAO,CAClB2hC,GAAW,KAAK3hC,CAAG,CACvB,CAAC,EAED,MAAM4hC,GAA0B/W,GAAQ,CACpC,GAAIgX,GAA2BhX,CAAI,IAAM,QAAS,MAAO,GACzD,MAAMiX,EAAajX,EAAK,IAAI,iBAAiB,KAAK,QAClD,OAAOiX,EAAW,OAAS,KAAOA,EAAW,MAAQA,EAAW,IACpE,EAEMC,GAAuBlX,GACNA,EAAK,IAAI,oBAAoB,KAAK,QACnC,MAIhBmX,GAAoCnX,GACtC,KAAK,MAAMA,EAAK,IAAI,iBAAiB,KAAK,QAAQ,OAAS,CAAC,EAC1DoX,GAAsCpX,GACxC,KAAK,MAAMA,EAAK,IAAI,iBAAiB,KAAK,QAAQ,KAAO,CAAC,EAExDqX,GAA4BrX,GAAQA,EAAK,MAAM,mCAAmC,EAClFsX,GAA+BtX,GAAQA,EAAK,MAAM,uCAAuC,EACzFgX,GAA6BhX,GAAQA,EAAK,MAAM,uCAAuC,EAEvFuX,GAAe,CACjB,oBAAqB,CAAE,QAAS,CAAG,EACnC,oBAAqB,CAAE,QAAS,CAAG,EACnC,iBAAkB,CAAE,QAAS,CAAG,EAChC,kBAAmB,CAAE,QAAS,CAAG,EACjC,0BAA2B,CAAE,QAAS,CAAG,EACzC,0BAA2B,CAAE,QAAS,CAAG,EACzC,2BAA4B,CAAE,QAAS,CAAG,EAC1C,sBAAuB,CAAE,QAAS,EAAG,MAAOF,EAA2B,EACvE,yBAA0B,CAAE,QAAS,EAAG,MAAOC,EAA8B,EAC7E,4BAA6B,CAAE,QAAS,EAAG,OAAQ,IAAM,OAAQ,GAAM,EACvE,KAAM,CAAE,WAAY,EAAG,WAAY,EAAG,QAAS,CAAG,EAClD,OAAQ,CAAE,WAAY,EAAG,WAAY,EAAG,QAAS,CAAG,CACxD,EAEME,GAAY,CACd,iBAAkB,CAAE,QAAS,CAAG,EAChC,kBAAmB,CAAE,QAAS,CAAG,EACjC,KAAM,CAAE,WAAYT,EAAyB,EAC7C,OAAQ,CAAE,WAAYA,EAAyB,CACnD,EAEMU,GAAkB,CACpB,0BAA2B,CAAE,QAAS,CAAG,EACzC,yBAA0B,CAAE,QAAS,CAAG,EACxC,OAAQ,CAAE,QAAS,CAAG,CAC1B,EAEMC,GAAW,CACb,uBAAwB,CACpB,iBAAkB,CAAE,QAAS,CAAG,EAChC,KAAM,CAAE,WAAYX,EAAyB,EAC7C,OAAQ,CAAE,WAAYA,GAAyB,QAAS,CAAG,CAC9D,EACD,oBAAqB,CACjB,oBAAqB,CAAE,QAAS,CAAG,EACnC,sBAAuB,CAAE,QAAS,CAAG,EACrC,OAAQ,CAAE,QAAS,CAAG,CACzB,EACD,0BAA2B,CACvB,oBAAqB,CAAE,QAAS,CAAG,EACnC,iBAAkB,CAAE,QAAS,CAAG,EAChC,KAAM,CAAE,WAAYA,EAAyB,EAC7C,OAAQ,CAAE,QAAS,CAAG,CACzB,EACD,sBAAuB,CACnB,yBAA0B,CAAE,QAAS,EAAG,MAAOC,EAA4B,EAC3E,KAAM,CAAE,WAAYD,EAAyB,EAC7C,OAAQ,CAAE,QAAS,CAAG,CACzB,EACD,4BAA6B,CACzB,yBAA0B,CAAE,QAAS,EAAG,MAAOC,EAA4B,EAC3E,iBAAkB,CAAE,QAAS,CAAG,EAChC,KAAM,CAAE,WAAYD,EAAyB,EAC7C,OAAQ,CAAE,QAAS,EAAG,WAAYA,EAAyB,CAC9D,EACD,cAAeS,GACf,oBAAqB,CACjB,iBAAkB,CAAE,QAAS,CAAG,EAChC,KAAM,CAAE,WAAYT,EAAyB,EAC7C,OAAQ,CAAE,WAAYA,EAAyB,CAClD,EACD,0BAA2BU,GAC3B,4BAA6BA,GAC7B,iCAAkCA,GAClC,6BAA8B,CAC1B,2BAA4B,CAAE,QAAS,CAAG,EAC1C,KAAM,CAAE,QAAS,CAAG,EACpB,OAAQ,CAAE,QAAS,CAAG,CACzB,EACD,gCAAiC,CAC7B,iBAAkB,CAAE,QAAS,CAAG,EAChC,0BAA2B,CAAE,QAAS,CAAG,EACzC,OAAQ,CAAE,QAAS,CAAG,EACtB,KAAM,CAAE,WAAYV,EAAyB,CAChD,EACD,uCAAwC,CACpC,2BAA4B,CAAE,QAAS,CAAG,EAC1C,OAAQ,CAAE,QAAS,CAAG,EACtB,KAAM,CAAE,QAAS,CAAG,CACvB,EACD,0BAA2B,CACvB,iBAAkB,CAAE,QAAS,CAAG,EAChC,kBAAmB,CAAE,QAAS,CAAG,EACjC,KAAM,CAAE,WAAYA,EAAyB,EAC7C,OAAQ,CAAE,QAAS,CAAG,CACzB,EACD,2BAA4BS,EAChC,EAGMG,GAAkC9a,GAAW,CAC/C,OAAQ,CAAC,CAAE,KAAAmD,KAAW,CAClBA,EAAK,QAAQ,UAAYA,EAAK,MAAM,eAAe,CACtD,EACD,KAAM,gCACN,WAAY,GACZ,OAAQ,CACJ,OAAQ,CAAC,SAAU,SAAU,SAAS,EACtC,WAAY,CACR,OAAQ,SACR,OAAQ,SACR,QAAS,CAAE,KAAM,QAAS,SAAU,GAAK,CAC5C,CACJ,CACL,CAAC,EAKK4X,GAAW,CAAC,CAAE,KAAA5X,EAAM,MAAA5F,KAAY,CAElC,MAAMyd,EAAe,OAAO,KAAKhB,EAAO,EAAE,OAAO,CAACv0B,EAAMw1B,KACpDx1B,EAAKw1B,GAAQ,CAAE,GAAGjB,GAAQiB,EAAK,EACxBx1B,GACR,CAAE,CAAA,EAEC,CAAE,GAAAnK,CAAI,EAAGiiB,EAGT2d,EAAc/X,EAAK,MAAM,kBAAkB,EAG3CgY,EAAchY,EAAK,MAAM,kBAAkB,EAG3CiY,EAAejY,EAAK,MAAM,mBAAmB,EAG7CkY,EAAgBlY,EAAK,MAAM,oBAAoB,EAG/C0G,EAAU1G,EAAK,MAAM,UAAU,EAG/BmY,EAAwBnY,EAAK,MAAM,oCAAoC,EAG7E,IAAIoY,EACA1R,EACIuR,GAAgB,CAACF,EAEjBK,EAAejjC,GAAO,CAAC,uBAAuB,KAAKA,CAAG,EAC/C,CAAC8iC,GAAgBF,EAExBK,EAAejjC,GAAO,CAAC,sDAAsD,KAAKA,CAAG,EAC9E,CAAC8iC,GAAgB,CAACF,IAEzBK,EAAejjC,GAAO,CAAC,UAAU,KAAKA,CAAG,GAI7CijC,EAAejjC,GAAO,CAAC,UAAU,KAAKA,CAAG,EAG7C,MAAMkjC,EAAiBD,EAAetB,GAAW,OAAOsB,CAAY,EAAItB,GAAW,SASnF,GANIoB,GAAiBH,IACjBF,EAAa,qBAAwB,MAAQ,+BAC7CA,EAAa,qBAAwB,KAAO,mBAI5CnR,GAAW,CAACqR,EAAa,CACzB,MAAMO,EAAMZ,GAAS,6BACrBY,EAAI,KAAK,WAAalB,GACtBkB,EAAI,KAAK,WAAanB,GACtBmB,EAAI,OAAO,WAAanB,GACxBmB,EAAI,4BAA8B,CAAE,QAAS,EAAG,OAAQ,EAAG,OAAQ,EACtE,CAgBD,GAbI5R,GAAW,CAACuR,IACZ,CACI,4BACA,8BACA,mCACA,iCACZ,EAAU,QAAQ9iC,GAAO,CACbuiC,GAASviC,GAAK,OAAO,WAAagiC,EAC9C,CAAS,EACDO,GAAS,gCAAmC,OAAO,WAAaR,IAIhEiB,GAAyBJ,EAAa,CACtCF,EAAa,qBAAwB,MAAQ,8BAC7C,MAAMS,EAAMZ,GAAS,6BACrBY,EAAI,KAAK,WAAavB,GACtBuB,EAAI,OAAO,WAAanB,GACxBmB,EAAI,4BAA8B,CAAE,QAAS,EAAG,OAAQ,EAAG,OAAQ,EACtE,CAGIN,IACDH,EAAa,WAAc,SAAW,IAI1C5gB,GAAM4gB,EAAc,CAAC1iC,EAAKD,IAAe,CAErC,MAAMqjC,GAAavY,EAAK,gBAAgBgV,GAAkB,CACtD,MAAOhV,EAAK,MAAM9qB,EAAW,KAAK,EAClC,KAAM8qB,EAAK,MAAM9qB,EAAW,IAAI,EAChC,QAAS,CACrB,CAAS,EAGGmjC,EAAe,SAASljC,CAAG,GAC3B6qB,EAAK,gBAAgBuY,EAAU,EAI/BrjC,EAAW,WACXqjC,GAAW,QAAQ,aAAa,WAAY,UAAU,EACtDA,GAAW,QAAQ,aAAa,SAAU,QAAQ,GAItDA,GAAW,QAAQ,QAAQ,MAAQvY,EAAK,MAAM,aAAa9qB,EAAW,OAAO,EAG7EqjC,GAAW,QAAQ,UAAU,IAAIrjC,EAAW,SAAS,EAGrDqjC,GAAW,GAAG,QAAS9mC,IAAK,CACxBA,GAAE,gBAAe,EACb,CAAAyD,EAAW,UACf8qB,EAAK,SAAS9qB,EAAW,OAAQ,CAAE,MAAOiD,CAAE,CAAE,CAC1D,CAAS,EAGD6nB,EAAK,IAAI,SAAS7qB,KAASojC,EACnC,CAAK,EAGDvY,EAAK,IAAI,4BAA8BA,EAAK,gBACxCA,EAAK,gBAAgB2X,EAA+B,CAC5D,EACI3X,EAAK,IAAI,4BAA4B,QAAQ,QAAQ,MAAQA,EAAK,MAC9D,wCACR,EAGIA,EAAK,IAAI,KAAOA,EAAK,gBAAgBA,EAAK,gBAAgBiW,GAAU,CAAE,GAAA99B,CAAE,CAAE,CAAC,EAG3E6nB,EAAK,IAAI,OAASA,EAAK,gBAAgBA,EAAK,gBAAgB4W,GAAY,CAAE,GAAAz+B,CAAE,CAAE,CAAC,EAG/E,MAAMqgC,EAAoBxY,EAAK,gBAC3BA,EAAK,gBAAgB2U,GAAmB,CACpC,QAAS,EACT,MAAO3U,EAAK,MAAM,mCAAmC,CACjE,CAAS,CACT,EACIwY,EAAkB,QAAQ,UAAU,IAAI,0BAA0B,EAClExY,EAAK,IAAI,sBAAwBwY,EAEjC,MAAMC,EAAwBzY,EAAK,gBAC/BA,EAAK,gBAAgB2U,GAAmB,CACpC,QAAS,EACT,MAAO3U,EAAK,MAAM,uCAAuC,CACrE,CAAS,CACT,EACIyY,EAAsB,QAAQ,UAAU,IAAI,6BAA6B,EACzEzY,EAAK,IAAI,yBAA2ByY,EAGpCzY,EAAK,IAAI,aAAe,EAC5B,EAEM0Y,GAAU,CAAC,CAAE,KAAA1Y,EAAM,QAAA9J,EAAS,MAAAkE,CAAK,IAAO,CAE1Cue,GAAM,CAAE,KAAA3Y,EAAM,QAAA9J,EAAS,MAAAkE,CAAO,CAAA,EAG9B,IAAIpZ,EAASkV,EACR,OAAQ,EACR,OAAOlV,GAAU,QAAQ,KAAKA,EAAO,IAAI,CAAC,EAC1C,QAAS,EACT,KAAKA,GAAU02B,GAAS12B,EAAO,KAAK,EAGzC,GAAIA,EAAQ,CAERgf,EAAK,IAAI,aAAe,GAExB,MAAM4Y,EAAgBlB,GAAS12B,EAAO,MACtCiW,GAAMsgB,GAAc,CAAChxB,EAAMsyB,IAAkB,CAEzC,MAAMC,EAAU9Y,EAAK,IAAIzZ,GAGzB0Q,GAAM4hB,EAAe,CAAC1jC,EAAKqtB,IAAiB,CACxC,MAAMrsB,EACFyiC,EAAcryB,IAAS,OAAOqyB,EAAcryB,GAAMpR,GAAS,IACrDyjC,EAAcryB,GAAMpR,GACpBqtB,EACVxC,EAAK,IAAI,aAAa,KAAK,CAAE,QAAA8Y,EAAS,IAAA3jC,EAAK,MAAAgB,CAAK,CAAE,CAClE,CAAa,CACb,CAAS,CACJ,CAGD6pB,EAAK,IAAI,aAAa,QAAQ,CAAC,CAAE,QAAA8Y,EAAS,IAAA3jC,EAAK,MAAAgB,KAAY,CACvD2iC,EAAQ3jC,GAAO,OAAOgB,GAAU,WAAaA,EAAM6pB,CAAI,EAAI7pB,CACnE,CAAK,CACL,EAEMwiC,GAAQ7Y,GAAY,CACtB,2CAA4C,CAAC,CAAE,KAAAE,EAAM,OAAAhf,KAAa,CAC9Dgf,EAAK,IAAI,0BAA0B,MAAQhf,EAAO,KACrD,EACD,qCAAsC,CAAC,CAAE,KAAAgf,EAAM,OAAAhf,KAAa,CACxDgf,EAAK,IAAI,oBAAoB,MAAQhf,EAAO,KAC/C,EACD,wCAAyC,CAAC,CAAE,KAAAgf,EAAM,OAAAhf,KAAa,CAC3Dgf,EAAK,IAAI,uBAAuB,MAAQhf,EAAO,KAClD,EACD,4BAA6B,CAAC,CAAE,KAAAgf,KAAW,CACvCA,EAAK,IAAI,yBAAyB,KAAO,GACzCA,EAAK,IAAI,yBAAyB,SAAW,CAChD,EACD,oBAAqB,CAAC,CAAE,KAAAA,KAAW,CAC/BA,EAAK,IAAI,sBAAsB,KAAO,GACtCA,EAAK,IAAI,sBAAsB,SAAW,CAC7C,EACD,sBAAuB,CAAC,CAAE,KAAAA,KAAW,CACjCA,EAAK,IAAI,yBAAyB,KAAO,GACzCA,EAAK,IAAI,yBAAyB,SAAW,CAChD,EACD,8BAA+B,CAAC,CAAE,KAAAA,EAAM,OAAAhf,KAAa,CACjDgf,EAAK,IAAI,sBAAsB,KAAO,GACtCA,EAAK,IAAI,sBAAsB,SAAWhf,EAAO,QACpD,EACD,iCAAkC,CAAC,CAAE,KAAAgf,EAAM,OAAAhf,KAAa,CACpDgf,EAAK,IAAI,yBAAyB,KAAO,GACzCA,EAAK,IAAI,yBAAyB,SAAWhf,EAAO,QACvD,CACL,CAAC,EAEK8M,GAAO+O,GAAW,CACpB,OAAQ+a,GACR,MAAOc,GACP,cAAe1Y,GAAQ,CACnBqF,GAAa,cAAe,CAAE,GAAGrF,EAAM,KAAMA,CAAI,CAAE,CACtD,EACD,KAAM,MACV,CAAC,EAKK+Y,GAAW,CAAC,CAAE,KAAA/Y,EAAM,MAAA5F,KAAY,CAElC4F,EAAK,IAAI,SAAWqT,GAAgB,QAAQ,EAC5CrT,EAAK,YAAYA,EAAK,IAAI,QAAQ,EAGlCA,EAAK,IAAI,KAAOA,EAAK,gBAAgBA,EAAK,gBAAgBlS,GAAM,CAAE,GAAIsM,EAAM,EAAE,CAAE,CAAC,EAGjF4F,EAAK,IAAI,KAAO,EACpB,EAKMgZ,GAAc,CAAC,CAAE,KAAAhZ,EAAM,MAAA5F,KAAY,CAErClY,GAAK8d,EAAK,IAAI,SAAUoT,GAAepT,EAAK,MAAM,gBAAiB5F,EAAM,EAAE,CAAC,CAAC,CACjF,EAEM6e,GAAcpc,GAAW,CAC3B,OAAQkc,GACR,WAAY,GACZ,MAAOjZ,GAAY,CACf,cAAekZ,EACvB,CAAK,EACD,cAAehZ,GAAQ,CACnBqF,GAAa,cAAe,CAAE,GAAGrF,EAAM,KAAMA,CAAI,CAAE,CACtD,EACD,IAAK,WACL,KAAM,cACV,CAAC,EAEKkZ,GAAqB,CAAE,KAAM,SAAU,QAAS,GAAK,KAAM,GAE3DC,GAAW,CAAC,CAAE,KAAAnZ,EAAM,MAAA5F,KAAY,CAClC,CACI,CACI,KAAM,KACT,EACD,CACI,KAAM,SACN,MAAO,CACH,WAAY,KACZ,OAAQ,IACX,EACD,OAAQ,CACJ,WAAY,CACR,OAAQ8e,EACX,EACD,OAAQ,CAAC,aAAc,QAAQ,CAClC,CACJ,EACD,CACI,KAAM,SACN,MAAO,CACH,WAAY,IACf,EACD,OAAQ,CACJ,WAAY,CACR,WAAYA,EACf,EACD,OAAQ,CAAC,YAAY,CACxB,CACJ,CACT,EAAM,QAAQE,GAAW,CACjBC,GAAcrZ,EAAMoZ,EAAShf,EAAM,IAAI,CAC/C,CAAK,EAED4F,EAAK,QAAQ,UAAU,IAAI,aAAa5F,EAAM,MAAM,EAEpD4F,EAAK,IAAI,SAAW,IACxB,EAEMqZ,GAAgB,CAACrZ,EAAMoZ,EAAS7hB,IAAc,CAChD,MAAM+hB,EAAkBzc,GAAW,CAC/B,KAAM,SAASuc,EAAQ,kBAAkB7hB,IACzC,OAAQ6hB,EAAQ,OAChB,iBAAkB,EAC1B,CAAK,EAEKvhB,EAAOmI,EAAK,gBAAgBsZ,EAAiBF,EAAQ,KAAK,EAEhEpZ,EAAK,IAAIoZ,EAAQ,MAAQpZ,EAAK,gBAAgBnI,CAAI,CACtD,EAEM0hB,GAAU,CAAC,CAAE,KAAAvZ,EAAM,MAAA5F,KAAY,CAQjC,IANI4F,EAAK,IAAI,WAAa,MAAQ5F,EAAM,WAAa4F,EAAK,IAAI,YAC1DA,EAAK,IAAI,SAAWW,GAAUvG,EAAM,QAAQ,EAAIA,EAAM,SAAW,GACjE4F,EAAK,QAAQ,QAAQ,SAAWA,EAAK,IAAI,UAIzC,CAAC5F,EAAM,OAAQ,OAGnB,MAAMof,EAAUxZ,EAAK,IAAI,IAAI,KAAK,QAC5ByZ,EAAazZ,EAAK,IAAI,OAAO,KAAK,QAGlCvK,EAAS,KAAK,IAAI+jB,EAAQ,OAASC,EAAW,OAAQrf,EAAM,MAAM,EAGxE4F,EAAK,IAAI,OAAO,WAAawZ,EAAQ,OAIrCxZ,EAAK,IAAI,OAAO,QAAUvK,EAAS+jB,EAAQ,OAASC,EAAW,QAAU,IAGzEzZ,EAAK,IAAI,OAAO,WAAavK,EAASgkB,EAAW,MACrD,EAEMC,GAAQ7c,GAAW,CACrB,KAAM,QACN,KAAM,CAAC,CAAE,KAAAmD,EAAM,MAAA5F,KAAaA,EAAM,cAAgB4F,EAAK,IAAI,OAAO,WAClE,MAAOuZ,GACP,OAAQJ,GACR,WAAY,GACZ,OAAQ,CACJ,KAAM,CAAC,SAAU,gBAAiB,UAAU,CAC/C,CACL,CAAC,EAEKQ,GAAmB1yB,GAAS,CAC9B,MAAM2yB,EAAU3yB,EAAM,IAAInD,GAAQA,EAAK,EAAE,EACzC,IAAI+1B,EACJ,MAAO,CACH,SAAU5jC,GAAS,CACf4jC,EAAY5jC,CACf,EACD,SAAU,IAAM4jC,EAChB,aAAc/1B,GAAQ81B,EAAQ,QAAQ91B,EAAK,EAAE,CACrD,CACA,EAEMg2B,GAAwB,CAC1B,KAAM,SACN,UAAW,IACX,QAAS,IACT,KAAM,EACV,EAEMC,GAAoB,SAEpBC,GAAW,CACb,oBAAqB,OACrB,8BAA+B,UAC/B,uBAAwB,eACxB,0BAA2B,aAC3B,cAAe,OACf,4BAA6B,eAC7B,sBAAuB,OACvB,0BAA2B,kBAC3B,4BAA6B,kBAC7B,iCAAkC,aAClC,6BAA8B,sBAC9B,gCAAiC,mBACjC,uCAAwC,0BACxC,0BAA2B,YAC3B,2BAA4B,MAChC,EAKMC,GAAW,CAAC,CAAE,KAAAja,EAAM,MAAA5F,KAAY,CAqBlC,GAnBA4F,EAAK,IAAI,YAAcvuB,GAAKuuB,EAAK,SAAS,oBAAqB,CAAE,GAAI5F,EAAM,EAAI,CAAA,EAG/E4F,EAAK,QAAQ,GAAK,kBAAkB5F,EAAM,KAC1C4F,EAAK,QAAQ,iBAAiB,QAASA,EAAK,IAAI,WAAW,EAG3DA,EAAK,IAAI,UAAYA,EAAK,gBAAgBA,EAAK,gBAAgBiZ,GAAa,CAAE,GAAI7e,EAAM,EAAE,CAAE,CAAC,EAG7F4F,EAAK,IAAI,MAAQA,EAAK,gBAAgBA,EAAK,gBAAgB0Z,GAAO,CAAE,KAAM,YAAY,CAAE,CAAC,EAGzF1Z,EAAK,IAAI,MAAM,OAAS,KAGxB5F,EAAM,iBAAmB,GAGrB,CAAC4F,EAAK,MAAM,mBAAmB,EAAG,OAGtCA,EAAK,QAAQ,QAAQ,UAAY,OAEjC,MAAMka,EAAOzoC,GAAK,CACd,GAAI,CAACA,EAAE,UAAW,OAElB,IAAI0oC,EAA0B,GAE9B,MAAMxL,EAAS,CACX,EAAGl9B,EAAE,MACL,EAAGA,EAAE,KACjB,EAEQ2oB,EAAM,WAAa,CACf,EAAG4F,EAAK,WACR,EAAGA,EAAK,UACpB,EAEQ5F,EAAM,WAAa,CACf,EAAG3oB,EAAE,QACL,EAAGA,EAAE,OACjB,EAEQ,MAAM2oC,EAAYT,GAAiB3Z,EAAK,MAAM,kBAAkB,CAAC,EAEjEA,EAAK,SAAS,gBAAiB,CAAE,GAAI5F,EAAM,GAAI,UAAAggB,CAAS,CAAE,EAE1D,MAAMC,EAAO5oC,GAAK,CACd,GAAI,CAACA,EAAE,UAAW,OAElBA,EAAE,gBAAe,EACjBA,EAAE,eAAc,EAEhB2oB,EAAM,WAAa,CACf,EAAG3oB,EAAE,MAAQk9B,EAAO,EACpB,EAAGl9B,EAAE,MAAQk9B,EAAO,CACpC,EAIgBvU,EAAM,WAAW,EAAIA,EAAM,WAAW,EAAIA,EAAM,WAAW,EAAIA,EAAM,WAAW,EACzE,IAAM,CAAC+f,IACdA,EAA0B,GAC1Bna,EAAK,QAAQ,oBAAoB,QAASA,EAAK,IAAI,WAAW,GAGlEA,EAAK,SAAS,gBAAiB,CAAE,GAAI5F,EAAM,GAAI,UAAAggB,CAAS,CAAE,CACtE,EAEcE,EAAO7oC,GAAK,CACV,CAACA,EAAE,YAEP2oB,EAAM,WAAa,CACf,EAAG3oB,EAAE,MAAQk9B,EAAO,EACpB,EAAGl9B,EAAE,MAAQk9B,EAAO,CACpC,EAEYjwB,IACZ,EAEc67B,EAAS,IAAM,CACjB77B,GACZ,EAEcA,EAAQ,IAAM,CAChB,SAAS,oBAAoB,gBAAiB67B,CAAM,EACpD,SAAS,oBAAoB,cAAeF,CAAI,EAChD,SAAS,oBAAoB,YAAaC,CAAI,EAE9Cta,EAAK,SAAS,gBAAiB,CAAE,GAAI5F,EAAM,GAAI,UAAAggB,CAAS,CAAE,EAGtDD,GACA,WAAW,IAAMna,EAAK,QAAQ,iBAAiB,QAASA,EAAK,IAAI,WAAW,EAAG,CAAC,CAEhG,EAEQ,SAAS,iBAAiB,gBAAiBua,CAAM,EACjD,SAAS,iBAAiB,cAAeF,CAAI,EAC7C,SAAS,iBAAiB,YAAaC,CAAI,CACnD,EAEIta,EAAK,QAAQ,iBAAiB,cAAeka,CAAI,CACrD,EAEMM,GAAU1a,GAAY,CACxB,wBAAyB,CAAC,CAAE,KAAAE,EAAM,OAAAhf,KAAa,CAC3Cgf,EAAK,OAAShf,EAAO,MACxB,CACL,CAAC,EAEKy5B,GAAU3a,GACZ,CACI,cAAe,CAAC,CAAE,KAAAE,EAAM,MAAA5F,KAAY,CAChCA,EAAM,WAAa,CACf,EAAG4F,EAAK,WACR,EAAGA,EAAK,UACxB,CACS,EACD,cAAe,CAAC,CAAE,KAAAA,KAAW,CACzBA,EAAK,QAAQ,QAAQ,UAAY,MACpC,EACD,cAAe,CAAC,CAAE,KAAAA,EAAM,MAAA5F,KAAY,CAChCA,EAAM,WAAa,KACnBA,EAAM,WAAa,KACnB4F,EAAK,QAAQ,QAAQ,UAAY,MACpC,CACJ,EACD,CAAC,CAAE,KAAAA,EAAM,QAAA9J,EAAS,MAAAkE,EAAO,eAAAoE,CAAc,IAAO,CACtCwB,EAAK,QAAQ,QAAQ,YAAc,QAC/BA,EAAK,QAAU,IACfA,EAAK,QAAQ,QAAQ,UAAY,QAKzC,IAAIhf,EAASkV,EACR,OAAQ,EACR,OAAOlV,GAAU,QAAQ,KAAKA,EAAO,IAAI,CAAC,EAC1C,QAAS,EACT,KAAKA,GAAUg5B,GAASh5B,EAAO,KAAK,EAGrCA,GAAUA,EAAO,OAASoZ,EAAM,eAEhCA,EAAM,aAAepZ,EAAO,KAG5Bgf,EAAK,QAAQ,QAAQ,kBAAoBga,GAAS5f,EAAM,eAAiB,IAI7E,MAAM2L,EACF/F,EAAK,MAAM,6BAA6B,GAAKA,EAAK,MAAM,wBAAwB,EAC/E+F,EAKOvH,IACRwB,EAAK,OAASA,EAAK,KAAK,QAAQ,MAAQ+F,IALxCyU,GAAQ,CAAE,KAAAxa,EAAM,QAAA9J,EAAS,MAAAkE,CAAO,CAAA,EAC5B,CAAC4F,EAAK,QAAUA,EAAK,IAAI,UAAU,KAAK,QAAQ,OAAS,IACzDA,EAAK,OAASA,EAAK,IAAI,UAAU,KAAK,QAAQ,SAOlDxB,IACAwB,EAAK,IAAI,MAAM,OAAS,MAG5BA,EAAK,IAAI,MAAM,OAASA,EAAK,MAChC,CACL,EAEMlc,GAAO+Y,GAAW,CACpB,OAAQod,GACR,MAAOQ,GACP,QAAS,CAAC,CAAE,KAAAza,EAAM,MAAA5F,KAAY,CAC1B4F,EAAK,QAAQ,oBAAoB,QAASA,EAAK,IAAI,WAAW,EAC9DA,EAAK,SAAS,eAAgB,CAAE,MAAO5F,EAAM,EAAE,CAAE,CACpD,EACD,IAAK,KACL,KAAM,OACN,OAAQ,CACJ,KAAM,CACF,KACA,oBACA,mBACA,YACA,aACA,aACA,YACH,EACD,OAAQ,CAAC,aAAc,aAAc,SAAU,SAAU,UAAW,QAAQ,EAC5E,WAAY,CACR,OAAQ2f,GACR,OAAQA,GACR,WAAYD,GACZ,WAAYA,GACZ,QAAS,CAAE,KAAM,QAAS,SAAU,GAAK,CAC5C,CACJ,CACL,CAAC,EAED,IAAIY,GAAiB,CAACC,EAAiBC,IAG5B,KAAK,IAAI,EAAG,KAAK,OAAOD,EAAkB,GAAKC,CAAS,CAAC,EAGpE,MAAMC,GAAyB,CAAChjB,EAAMijB,EAAUC,IAAmB,CAC/D,GAAI,CAACA,EAAgB,OAErB,MAAMJ,EAAkB9iB,EAAK,KAAK,QAAQ,MAEpC5N,EAAI6wB,EAAS,OACnB,IAAItb,EAAO,KAGX,GAAIvV,IAAM,GAAK8wB,EAAe,IAAMD,EAAS,GAAG,KAAK,QAAQ,IAAK,MAAO,GAIzE,MAAME,EADOF,EAAS,GACA,KAAK,QACrBG,EAAuBD,EAAS,WAAaA,EAAS,YACtDJ,EAAYI,EAAS,MAAQC,EAC7BC,EAAcR,GAAeC,EAAiBC,CAAS,EAG7D,GAAIM,IAAgB,EAAG,CACnB,QAASjlC,EAAQ,EAAGA,EAAQgU,EAAGhU,IAAS,CACpC,MAAMyhB,EAAQojB,EAAS7kC,GACjBklC,EAAWzjB,EAAM,KAAK,MAAM,IAAMA,EAAM,KAAK,QAAQ,OAAS,GACpE,GAAIqjB,EAAe,IAAMI,EACrB,OAAOllC,CAEd,CACD,OAAOgU,CACV,CAGD,MAAMmxB,EAAqBJ,EAAS,UAAYA,EAAS,aACnDK,EAAaL,EAAS,OAASI,EACrC,QAASnlC,EAAQ,EAAGA,EAAQgU,EAAGhU,IAAS,CACpC,MAAMqlC,EAASrlC,EAAQilC,EACjBK,EAAS,KAAK,MAAMtlC,EAAQilC,CAAW,EAEvCzoB,GAAU6oB,EAASV,EACnBY,GAAUD,EAASF,EAEnBI,GAAUD,GAAUR,EAAS,UAC7BU,GAAYjpB,GAAUmoB,EACtBe,GAAaH,GAAUH,EAAaL,EAAS,aAEnD,GAAID,EAAe,IAAMY,IAAcZ,EAAe,IAAMU,GAAS,CACjE,GAAIV,EAAe,KAAOW,GACtB,OAAOzlC,EACAA,IAAUgU,EAAI,EACrBuV,EAAOvpB,EAEPupB,EAAO,IAEd,CACJ,CAED,OAAIA,IAAS,KACFA,EAGJvV,CACX,EAEM2xB,GAAqB,CACvB,OAAQ,EACR,MAAO,EACP,IAAI,WAAY,CACZ,OAAO,KAAK,MACf,EACD,IAAI,UAAUrkC,EAAK,EACX,KAAK,SAAW,GAAKA,IAAQ,KAAG,KAAK,OAASA,EACrD,EACD,IAAI,UAAW,CACX,OAAO,KAAK,KACf,EACD,IAAI,SAASA,EAAK,EACV,KAAK,QAAU,GAAKA,IAAQ,KAAG,KAAK,MAAQA,EACnD,EACD,cAAe,SAASke,EAAQD,EAAO,EAC/B,KAAK,SAAW,GAAKC,IAAW,KAAG,KAAK,OAASA,IACjD,KAAK,QAAU,GAAKD,IAAU,KAAG,KAAK,MAAQA,EACrD,CACL,EAEMqmB,GAAW,CAAC,CAAE,KAAA7b,KAAW,CAE3BpS,GAAKoS,EAAK,QAAS,OAAQ,MAAM,EAEjCA,EAAK,IAAI,kBAAoB,KAAK,IAAG,CACzC,EAOM8b,GAAc,CAAC,CAAE,KAAA9b,EAAM,OAAAhf,KAAa,CACtC,KAAM,CAAE,GAAA7I,EAAI,MAAAlC,EAAO,kBAAAu7B,CAAiB,EAAKxwB,EAEzCgf,EAAK,IAAI,SAAW/pB,EAEpB,MAAM8lC,EAAM,KAAK,MACjB,IAAIC,EAAYD,EACZjgB,EAAU,EAEd,GAAI0V,IAAsBlO,GAAkB,KAAM,CAC9CxH,EAAU,EACV,MAAMmgB,EAAWjc,EAAK,MAAM,0BAA0B,EAChDkc,EAAOH,EAAM/b,EAAK,IAAI,kBAC5Bgc,EAAYE,EAAOD,EAAWF,GAAOE,EAAWC,GAAQH,CAC3D,CAED/b,EAAK,IAAI,kBAAoBgc,EAE7Bhc,EAAK,gBACDA,EAAK,gBAEDlc,GAGA,CACI,UAAAk4B,EACA,GAAA7jC,EACA,QAAA2jB,EACA,kBAAA0V,CACH,CACJ,EACDv7B,CACR,CACA,EAEMkmC,GAAW,CAACr4B,EAAMjR,EAAGC,EAAGspC,EAAK,EAAGC,EAAK,IAAM,CAEzCv4B,EAAK,YACLA,EAAK,WAAa,KAClBA,EAAK,WAAa,KAClBA,EAAK,WAAaA,EAAK,WAAW,EAAIA,EAAK,WAAW,EACtDA,EAAK,WAAaA,EAAK,WAAW,EAAIA,EAAK,WAAW,EACtDA,EAAK,OAAS,MACdA,EAAK,OAAS,QAEdA,EAAK,WAAajR,EAClBiR,EAAK,WAAahR,EAEd,KAAK,MAAQgR,EAAK,YAEdA,EAAK,UAAY,GACjBw4B,GAAcx4B,EAAMjR,EAAGC,EAAGspC,EAAIC,CAAE,EAIpCv4B,EAAK,OAAS,EACdA,EAAK,OAAS,EACdA,EAAK,QAAU,GAG3B,EAEMw4B,GAAgB,CAACx4B,EAAMjR,EAAGC,EAAGspC,EAAIC,IAAO,CACtCv4B,EAAK,oBAAsBwf,GAAkB,MAC7Cxf,EAAK,WAAa,KAClBA,EAAK,WAAajR,EAClBiR,EAAK,WAAa,KAClBA,EAAK,WAAahR,GACXgR,EAAK,oBAAsBwf,GAAkB,MACpDxf,EAAK,WAAa,KAClBA,EAAK,WAAajR,EAAIupC,EAAK,GAE3Bt4B,EAAK,WAAa,KAClBA,EAAK,WAAahR,EAAIupC,EAAK,GAE3Bv4B,EAAK,OAAS,GACdA,EAAK,OAAS,IACPA,EAAK,oBAAsBwf,GAAkB,QACpDxf,EAAK,WAAa,KAClBA,EAAK,WAAahR,EAAI,IACfgR,EAAK,oBAAsBwf,GAAkB,MACpDxf,EAAK,WAAa,KAClBA,EAAK,WAAajR,EAAI,GACtBiR,EAAK,WAAa,KAE1B,EAOMy4B,GAAiB,CAAC,CAAE,KAAAvc,EAAM,OAAAhf,KAAa,CACzC,KAAM,CAAE,GAAA7I,CAAI,EAAG6I,EAGT6W,EAAOmI,EAAK,WAAW,KAAKtI,GAASA,EAAM,KAAOvf,CAAE,EAGtD,CAAC0f,IAKLA,EAAK,OAAS,GACdA,EAAK,OAAS,GACdA,EAAK,QAAU,EAGfA,EAAK,iBAAmB,GAC5B,EAEM2kB,GAAgB9kB,GAClBA,EAAM,KAAK,QAAQ,OACnBA,EAAM,KAAK,QAAQ,aAAe,GAClCA,EAAM,KAAK,QAAQ,UAAY,GAC7B+kB,GAAe/kB,GACjBA,EAAM,KAAK,QAAQ,MACnBA,EAAM,KAAK,QAAQ,WAAa,GAChCA,EAAM,KAAK,QAAQ,YAAc,GAE/BglB,GAAW,CAAC,CAAE,KAAA1c,EAAM,OAAAhf,KAAa,CACnC,KAAM,CAAE,GAAA7I,EAAI,UAAAiiC,CAAW,EAAGp5B,EAGpB8C,EAAOkc,EAAK,MAAM,WAAY,CAAE,GAAA7nB,CAAE,CAAE,EAGpC0f,EAAOmI,EAAK,WAAW,KAAKtI,IAASA,GAAM,KAAOvf,CAAE,EAEpDwkC,EAAW3c,EAAK,WAAW,OAC3B4c,EAAWxC,EAAU,aAAat2B,CAAI,EAG5C,GAAI,CAAC+T,EAAM,OAEX,MAAMglB,EAAe,CACjB,EAAGhlB,EAAK,WAAW,EAAIA,EAAK,WAAW,EAAIA,EAAK,WAAW,EAC3D,EAAGA,EAAK,WAAW,EAAIA,EAAK,WAAW,EAAIA,EAAK,WAAW,CACnE,EAGUilB,EAAaN,GAAc3kB,CAAI,EAC/BklB,EAAYN,GAAa5kB,CAAI,EAGnC,IAAImlB,EAAO,KAAK,MAAMhd,EAAK,KAAK,MAAM,MAAQ+c,CAAS,EACnDC,EAAOL,IAAUK,EAAOL,GAG5B,MAAMpT,EAAO,KAAK,MAAMoT,EAAWK,EAAO,CAAC,EAE3CpB,GAAmB,UAAYkB,EAAavT,EAC5CqS,GAAmB,SAAWmB,EAAYC,EAG1C,IAAIC,EAAW,CACX,EAAG,KAAK,MAAMJ,EAAa,EAAIC,CAAU,EACzC,EAAG,KAAK,MAAMD,EAAa,EAAIE,CAAS,EACxC,aAAc,UAAwB,CAClC,OACIF,EAAa,EAAIjB,GAAmB,WACpCiB,EAAa,EAAI,GACjBA,EAAa,EAAIjB,GAAmB,UACpCiB,EAAa,EAAI,EAEVD,EACJ,KAAK,EAAII,EAAO,KAAK,CAC/B,EACD,YAAa,UAAuB,CAChC,MAAM/1B,GAAQ+Y,EAAK,MAAM,kBAAkB,EACrCkd,GAAkBld,EAAK,WAAW,OAAOtI,IAASA,GAAM,KAAK,QAAQ,MAAM,EAC3EojB,GAAW7zB,GAAM,IAAInD,IACvBo5B,GAAgB,KAAKzkB,IAAaA,GAAU,KAAO3U,GAAK,EAAE,CAC1E,EACkBytB,GAAeuJ,GAAS,UAAUpjB,IAASA,KAAUG,CAAI,EACzDilB,GAAaN,GAAc3kB,CAAI,EAC/B5N,EAAI6wB,GAAS,OACnB,IAAIqC,GAAMlzB,EACNmzB,GAAc,EACdC,GAAc,EACdC,GAAW,EACf,QAASzrC,GAAI,EAAGA,GAAIoY,EAAGpY,KAInB,GAHAurC,GAAcZ,GAAc1B,GAASjpC,GAAE,EACvCyrC,GAAWD,GACXA,GAAcC,GAAWF,GACrBP,EAAa,EAAIQ,GAAa,CAC9B,GAAI9L,GAAe1/B,GAAG,CAClB,GAAIgrC,EAAa,EAAIS,GAAWR,GAAY,CACxCK,GAAMtrC,GACN,KACH,CACD,QACH,CACDsrC,GAAMtrC,GACN,KACH,CAEL,OAAOsrC,EACV,CACT,EAGI,MAAMlnC,EAAQ+mC,EAAO,EAAIC,EAAS,eAAiBA,EAAS,cAC5Djd,EAAK,SAAS,YAAa,CAAE,MAAOnI,EAAM,MAAA5hB,CAAK,CAAE,EAGjD,MAAMs7B,EAAe6I,EAAU,WAE/B,GAAI7I,IAAiB,QAAaA,IAAiBt7B,EAAO,CAGtD,GAFAmkC,EAAU,SAASnkC,CAAK,EAEpBs7B,IAAiB,OAAW,OAEhCvR,EAAK,SAAS,oBAAqB,CAC/B,MAAOA,EAAK,MAAM,kBAAkB,EACpC,OAAQ4c,EACR,OAAQ3mC,CACpB,CAAS,CACJ,CACL,EAKMsnC,GAAUzd,GAAY,CACxB,aAAcgc,GACd,gBAAiBS,GACjB,cAAeG,EACnB,CAAC,EAQKc,GAAU,CAAC,CAAE,KAAAxd,EAAM,MAAA5F,EAAO,QAAAlE,EAAS,eAAAsI,CAAc,IAAO,CAE1D+e,GAAQ,CAAE,KAAAvd,EAAM,MAAA5F,EAAO,QAAAlE,CAAS,CAAA,EAEhC,KAAM,CAAE,gBAAAunB,CAAiB,EAAGrjB,EAGtBugB,EAAkB3a,EAAK,KAAK,QAAQ,MAGpCkd,EAAkBld,EAAK,WAAW,OAAOtI,IAASA,GAAM,KAAK,QAAQ,MAAM,EAG3EojB,EAAW9a,EACZ,MAAM,kBAAkB,EACxB,IAAIlc,IAAQo5B,EAAgB,KAAKxlB,IAASA,GAAM,KAAO5T,GAAK,EAAE,CAAC,EAC/D,OAAOA,IAAQA,EAAI,EAGlB45B,EAAYD,EACZ5C,GAAuB7a,EAAM8a,EAAU2C,CAAe,EACtD,KAGAE,EAAW3d,EAAK,IAAI,UAAY,KAGtCA,EAAK,IAAI,SAAW,KAEpB,IAAI4d,EAAkB,EAClBC,EAAoB,EACpBC,EAAiB,EAErB,GAAIhD,EAAS,SAAW,EAAG,OAE3B,MAAMiD,EAAYjD,EAAS,GAAG,KAAK,QAC7BM,EAAqB2C,EAAU,UAAYA,EAAU,aACrD9C,EAAuB8C,EAAU,WAAaA,EAAU,YACxDnD,GAAYmD,EAAU,MAAQ9C,EAC9BI,GAAa0C,EAAU,OAAS3C,EAChCF,GAAcR,GAAeC,EAAiBC,EAAS,EAG7D,GAAIM,KAAgB,EAAG,CACnB,IAAIM,GAAU,EACVwC,GAAa,EAEjBlD,EAAS,QAAQ,CAACpjB,GAAOzhB,IAAU,CAC/B,GAAIynC,EAAW,CACX,IAAIxB,GAAOjmC,EAAQynC,EACfxB,KAAS,GACT8B,GAAa,CAAC5C,EAAqB,IAC5Bc,KAAS,GAChB8B,GAAa,CAAC5C,EAAqB,IAC5Bc,KAAS,EAChB8B,GAAa5C,EAAqB,IAC3Bc,KAAS,EAChB8B,GAAa5C,EAAqB,IAElC4C,GAAa,CAEpB,CAEGxf,IACA9G,GAAM,WAAa,KACnBA,GAAM,WAAa,MAGlBA,GAAM,kBACPykB,GAASzkB,GAAO,EAAG8jB,GAAUwC,EAAU,EAK3C,IAAIC,IAFavmB,GAAM,KAAK,QAAQ,OAAS0jB,IAEZ1jB,GAAM,iBAAmBA,GAAM,QAAU,GAE1E8jB,IAAWyC,EACvB,CAAS,CACJ,KAEI,CACD,IAAIC,GAAQ,EACRC,GAAQ,EAEZrD,EAAS,QAAQ,CAACpjB,GAAOzhB,IAAU,CAC3BA,IAAUynC,IACVE,EAAkB,GAGlB3nC,IAAU0nC,IACVG,GAAkB,GAGlBpmB,GAAM,kBAAoBA,GAAM,QAAU,KAC1CmmB,GAAqB,GAGzB,MAAMO,GAAcnoC,EAAQ6nC,EAAiBF,EAAkBC,EAEzDvC,GAAS8C,GAAclD,GACvBK,GAAS,KAAK,MAAM6C,GAAclD,EAAW,EAE7CzoB,GAAU6oB,GAASV,GACnBY,GAAUD,GAASF,GAEnBgD,GAAU,KAAK,KAAK5rB,GAAUyrB,EAAK,EACnCI,GAAU,KAAK,KAAK9C,GAAU2C,EAAK,EAEzCD,GAAQzrB,GACR0rB,GAAQ3C,GAEJ,CAAA9jB,GAAM,mBAEN8G,IACA9G,GAAM,WAAa,KACnBA,GAAM,WAAa,MAGvBykB,GAASzkB,GAAOjF,GAAS+oB,GAAS6C,GAASC,EAAO,EAC9D,CAAS,CACJ,CACL,EAOMC,GAAuB,CAAC7mB,EAAOxB,IACjCA,EAAQ,OAAOlV,GAEPA,EAAO,MAAQA,EAAO,KAAK,GACpB0W,EAAM,KAAO1W,EAAO,KAAK,GAI7B,EACV,EAECyO,GAAOoN,GAAW,CACpB,OAAQgf,GACR,MAAO2B,GACP,IAAK,KACL,KAAM,OACN,aAAc,CAAC,CAAE,KAAAxd,KAAW,CACxBA,EAAK,WACA,OAAOnI,GAAQA,EAAK,kBAAoBA,EAAK,UAAY,GAAKA,EAAK,OAAO,EAC1E,QAAQA,GAAQ,CACbA,EAAK,SAAQ,EACbmI,EAAK,gBAAgBnI,CAAI,CACzC,CAAa,CACR,EACD,2BAA4B0mB,GAC5B,OAAQ,CACJ,KAAM,CAAC,iBAAiB,CAC3B,CACL,CAAC,EAEKC,GAAW,CAAC,CAAE,KAAAxe,EAAM,MAAA5F,KAAY,CAClC4F,EAAK,IAAI,KAAOA,EAAK,gBAAgBA,EAAK,gBAAgBvQ,EAAI,CAAC,EAC/D2K,EAAM,gBAAkB,KACxBA,EAAM,YAAc,EACxB,EAEMqkB,GAAuB,CAAC,CAAE,KAAAze,EAAM,MAAA5F,EAAO,OAAApZ,CAAM,IAAO,CAClD,CAACgf,EAAK,MAAM,kCAAkC,IAClD5F,EAAM,gBAAkB,CACpB,KAAMpZ,EAAO,SAAS,UAAYgf,EAAK,IAAI,KAAK,KAAK,QAAQ,KAC7D,IACIhf,EAAO,SAAS,UACfgf,EAAK,KAAK,MAAM,IAAMA,EAAK,KAAK,QAAQ,UAAYA,EAAK,KAAK,QAAQ,UACnF,EACA,EAEM0e,GAAuB,CAAC,CAAE,MAAAtkB,KAAY,CACxCA,EAAM,gBAAkB,IAC5B,EAEMukB,GAAU7e,GAAY,CACxB,SAAU2e,GACV,aAAcC,EAClB,CAAC,EAEKE,GAAU,CAAC,CAAE,KAAA5e,EAAM,MAAA5F,EAAO,QAAAlE,CAAO,IAAO,CAiB1C,GAfAyoB,GAAQ,CAAE,KAAA3e,EAAM,MAAA5F,EAAO,QAAAlE,CAAS,CAAA,EAGhC8J,EAAK,IAAI,KAAK,gBAAkB5F,EAAM,gBAGlCA,EAAM,aAAe,CAACA,EAAM,WAC5BA,EAAM,YAAc,GAGpB4F,EAAK,QAAQ,QAAQ,MAAQ,GAC7BA,EAAK,OAAS,MAId5F,EAAM,SAAU,CAChB,MAAMnM,EAAY,KAAK,MAAMmM,EAAM,QAAQ,EACvCnM,IAAc+R,EAAK,SACnB5F,EAAM,YAAc,GACpB4F,EAAK,QAAQ,QAAQ,MAAQ,WAC7BA,EAAK,OAAS/R,EAErB,CACL,EAEM4wB,GAAehiB,GAAW,CAC5B,OAAQ2hB,GACR,MAAOI,GACP,KAAM,gBACN,OAAQ,CACJ,KAAM,CAAC,WAAY,iBAAiB,EACpC,OAAQ,CAAC,SAAU,YAAY,EAC/B,WAAY,CACR,WAAY,QACf,CACJ,CACL,CAAC,EAEKE,GAAa,CAAC7nC,EAASsP,EAAMxQ,EAAOgpC,EAAe,KAAO,CACxDhpC,EACA6X,GAAK3W,EAASsP,EAAMw4B,CAAY,EAEhC9nC,EAAQ,gBAAgBsP,CAAI,CAEpC,EAEMy4B,GAAiBt4B,GAAS,CAE5B,GAAI,GAACA,GAASA,EAAM,QAAU,IAI9B,IAAI,CAEAA,EAAM,MAAQ,EACtB,MAAM,CAAc,CAGhB,GAAIA,EAAM,MAAO,CAEb,MAAMu4B,EAAO5L,GAAgB,MAAM,EAC7B6L,EAAax4B,EAAM,WACnBkX,EAAMlX,EAAM,YAClBu4B,EAAK,YAAYv4B,CAAK,EACtBu4B,EAAK,MAAK,EAGNrhB,EACAshB,EAAW,aAAax4B,EAAOkX,CAAG,EAElCshB,EAAW,YAAYx4B,CAAK,CAEnC,EACL,EAEMy4B,GAAW,CAAC,CAAE,KAAAnf,EAAM,MAAA5F,KAAY,CAElC4F,EAAK,QAAQ,GAAK,qBAAqB5F,EAAM,KAG7CxM,GAAKoS,EAAK,QAAS,OAAQA,EAAK,MAAM,UAAU,CAAC,EAGjDpS,GAAKoS,EAAK,QAAS,gBAAiB,uBAAuB5F,EAAM,IAAI,EAGrExM,GAAKoS,EAAK,QAAS,kBAAmB,wBAAwB5F,EAAM,IAAI,EAGxEglB,GAAqB,CAAE,KAAApf,EAAM,OAAQ,CAAE,MAAOA,EAAK,MAAM,yBAAyB,CAAG,CAAA,CAAE,EACvFqf,GAAoB,CAAE,KAAArf,EAAM,OAAQ,CAAE,MAAOA,EAAK,MAAM,oBAAoB,CAAG,CAAA,CAAE,EACjFsf,GAAsB,CAAE,KAAAtf,EAAM,OAAQ,CAAE,MAAOA,EAAK,MAAM,4BAA4B,CAAG,CAAA,CAAE,EAC3Fuf,GAAe,CAAE,KAAAvf,CAAI,CAAE,EACvBwf,GAAe,CAAE,KAAAxf,EAAM,OAAQ,CAAE,MAAOA,EAAK,MAAM,cAAc,CAAG,CAAA,CAAE,EACtEyf,GAAiB,CAAE,KAAAzf,EAAM,OAAQ,CAAE,MAAOA,EAAK,MAAM,oBAAoB,CAAG,CAAA,CAAE,EAG9EA,EAAK,IAAI,aAAevuB,GAAK,CACzB,GAAI,CAACuuB,EAAK,QAAQ,MACd,OAIJ,MAAMtU,EAAQ,MAAM,KAAKsU,EAAK,QAAQ,KAAK,EAAE,IAAIlS,IAC7CA,EAAK,cAAgBA,EAAK,mBACnBA,EACV,EAGD,WAAW,IAAM,CAEbsM,EAAM,OAAO1O,CAAK,EAGlBszB,GAAehf,EAAK,OAAO,CAC9B,EAAE,GAAG,CACd,EAEIA,EAAK,QAAQ,iBAAiB,SAAUA,EAAK,IAAI,YAAY,CACjE,EAEMof,GAAuB,CAAC,CAAE,KAAApf,EAAM,OAAAhf,KAAa,CAC3C,CAACgf,EAAK,MAAM,iCAAiC,GACjD8e,GAAW9e,EAAK,QAAS,SAAU,CAAC,CAAChf,EAAO,MAAOA,EAAO,MAAQA,EAAO,MAAM,KAAK,GAAG,EAAI,EAAE,CACjG,EAEMq+B,GAAsB,CAAC,CAAE,KAAArf,EAAM,OAAAhf,KAAa,CAC9C89B,GAAW9e,EAAK,QAAS,WAAYhf,EAAO,KAAK,CACrD,EAEMs+B,GAAwB,CAAC,CAAE,KAAAtf,EAAM,OAAAhf,KAAa,CAChD89B,GAAW9e,EAAK,QAAS,kBAAmBhf,EAAO,KAAK,CAC5D,EAEMu+B,GAAiB,CAAC,CAAE,KAAAvf,KAAW,CACjC,MAAM8U,EAAa9U,EAAK,MAAM,cAAc,EACtC0f,EAAkB1f,EAAK,MAAM,kBAAkB,EAC/C2f,EAAe7K,GAAc,CAAC4K,EACpCZ,GAAW9e,EAAK,QAAS,WAAY2f,CAAY,CACrD,EAEMH,GAAiB,CAAC,CAAE,KAAAxf,EAAM,OAAAhf,KAAa,CAEpCA,EAAO,MAIHgf,EAAK,MAAM,iBAAiB,IAAM,GACvC8e,GAAW9e,EAAK,QAAS,WAAY,EAAI,EAJzC8e,GAAW9e,EAAK,QAAS,WAAY,EAAK,CAMlD,EAEMyf,GAAmB,CAAC,CAAE,KAAAzf,EAAM,OAAAhf,KAAa,CAC3C89B,GAAW9e,EAAK,QAAS,UAAW,CAAC,CAAChf,EAAO,MAAOA,EAAO,QAAU,GAAO,GAAKA,EAAO,KAAK,CACjG,EAEM4+B,GAAuB,CAAC,CAAE,KAAA5f,KAAW,CACvC,KAAM,CAAE,QAAA/oB,CAAS,EAAG+oB,EAEhBA,EAAK,MAAM,iBAAiB,EAAI,GAChC8e,GAAW7nC,EAAS,WAAY,EAAK,EACrC6nC,GAAW7nC,EAAS,OAAQ,EAAK,IAGjC6nC,GAAW7nC,EAAS,OAAQ,GAAM+oB,EAAK,MAAM,UAAU,CAAC,EAG5BA,EAAK,MAAM,oBAAoB,GAEvD/oB,EAAQ,kBAAkB,EAAE,EAI5B+oB,EAAK,MAAM,cAAc,GACzB8e,GAAW7nC,EAAS,WAAY,EAAI,EAGhD,EAEM4oC,GAA4B,CAAC,CAAE,KAAA7f,KAAW,CAExC,CADwBA,EAAK,MAAM,oBAAoB,GAE3DA,EAAK,QAAQ,kBAAkBA,EAAK,MAAM,yBAAyB,CAAC,CACxE,EAEM8f,GAAUjjB,GAAW,CACvB,IAAK,QACL,KAAM,UACN,WAAY,GACZ,iBAAkB,GAClB,WAAY,CACR,KAAM,MACT,EACD,OAAQsiB,GACR,QAAS,CAAC,CAAE,KAAAnf,KAAW,CACnBA,EAAK,QAAQ,oBAAoB,SAAUA,EAAK,IAAI,YAAY,CACnE,EACD,MAAOF,GAAY,CACf,cAAe8f,GACf,gBAAiBA,GACjB,uBAAwBC,GAExB,iBAAkBN,GAClB,qBAAsBA,GACtB,+BAAgCD,GAChC,uBAAwBD,GACxB,4BAA6BD,GAC7B,uBAAwBK,GACxB,iBAAkBD,EAC1B,CAAK,CACL,CAAC,EAEKO,GAAM,CACR,MAAO,GACP,MAAO,EACX,EAEMC,GAAW,CAAC,CAAE,KAAAhgB,EAAM,MAAA5F,KAAY,CAElC,MAAM1c,EAAQ21B,GAAgB,OAAO,EACrCzlB,GAAKlQ,EAAO,MAAO,qBAAqB0c,EAAM,IAAI,EAGlDxM,GAAKlQ,EAAO,KAAM,wBAAwB0c,EAAM,IAAI,EAGpD4F,EAAK,IAAI,cAAgBvuB,GAAK,EACFA,EAAE,UAAYsuC,GAAI,OAAStuC,EAAE,UAAYsuC,GAAI,SAGrEtuC,EAAE,eAAc,EAGhBuuB,EAAK,IAAI,MAAM,QACvB,EAEIA,EAAK,IAAI,YAAcvuB,GAAK,CACHA,EAAE,SAAWiM,GAASA,EAAM,SAASjM,EAAE,MAAM,GAMlEuuB,EAAK,IAAI,MAAM,OACvB,EAGItiB,EAAM,iBAAiB,UAAWsiB,EAAK,IAAI,aAAa,EACxDA,EAAK,QAAQ,iBAAiB,QAASA,EAAK,IAAI,WAAW,EAG3DigB,GAAiBviC,EAAO0c,EAAM,OAAO,EAGrC4F,EAAK,YAAYtiB,CAAK,EACtBsiB,EAAK,IAAI,MAAQtiB,CACrB,EAEMuiC,GAAmB,CAACviC,EAAOvH,IAAU,CACvCuH,EAAM,UAAYvH,EAClB,MAAM+pC,EAAYxiC,EAAM,cAAc,yBAAyB,EAC/D,OAAIwiC,GACAtyB,GAAKsyB,EAAW,WAAY,GAAG,EAE5B/pC,CACX,EAEMgqC,GAAYtjB,GAAW,CACzB,KAAM,aACN,WAAY,GACZ,OAAQmjB,GACR,QAAS,CAAC,CAAE,KAAAhgB,KAAW,CACnBA,EAAK,IAAI,MAAM,iBAAiB,UAAWA,EAAK,IAAI,aAAa,EACjEA,EAAK,QAAQ,oBAAoB,QAASA,EAAK,IAAI,WAAW,CACjE,EACD,MAAOF,GAAY,CACf,mBAAoB,CAAC,CAAE,KAAAE,EAAM,OAAAhf,KAAa,CACtCi/B,GAAiBjgB,EAAK,IAAI,MAAOhf,EAAO,KAAK,CAChD,CACT,CAAK,EACD,OAAQ,CACJ,OAAQ,CAAC,UAAW,aAAc,YAAY,EAC9C,WAAY,CACR,QAAS,CAAE,KAAM,QAAS,SAAU,GAAK,EACzC,WAAY,SACZ,WAAY,QACf,CACJ,CACL,CAAC,EAEKqL,GAAOwQ,GAAW,CACpB,KAAM,YACN,WAAY,GACZ,OAAQ,CACJ,OAAQ,CAAC,aAAc,aAAc,SAAU,SAAU,SAAS,EAClE,WAAY,CACR,OAAQ,SACR,OAAQ,SACR,WAAY,SACZ,WAAY,SACZ,QAAS,CAAE,KAAM,QAAS,SAAU,GAAK,CAC5C,CACJ,CACL,CAAC,EAEKujB,GAAU,CAAC,CAAE,KAAApgB,KAAW,CAC1B,MAAMyT,EAAUzT,EAAK,KAAK,QAAQ,MAAQ,GACpC0T,EAAU1T,EAAK,KAAK,QAAQ,OAAS,GAE3CA,EAAK,IAAI,KAAOA,EAAK,gBACjBA,EAAK,gBAAgB3T,GAAM,CACvB,QAAS,EACT,OAAQ,IACR,OAAQ,IACR,WAAYonB,EACZ,WAAYC,CACxB,CAAS,CACT,CACA,EAEM2M,GAAW,CAAC,CAAE,KAAArgB,EAAM,OAAAhf,KAAa,CACnC,GAAI,CAACgf,EAAK,IAAI,KAAM,CAChBogB,GAAQ,CAAE,KAAApgB,CAAI,CAAE,EAChB,MACH,CAEDA,EAAK,IAAI,KAAK,WAAahf,EAAO,SAAS,UAC3Cgf,EAAK,IAAI,KAAK,WAAahf,EAAO,SAAS,SAC3Cgf,EAAK,IAAI,KAAK,OAAS,EACvBA,EAAK,IAAI,KAAK,OAAS,EACvBA,EAAK,IAAI,KAAK,QAAU,CAC5B,EAEMsgB,GAAW,CAAC,CAAE,KAAAtgB,KAAW,CACvB,CAACA,EAAK,IAAI,OAGdA,EAAK,IAAI,KAAK,QAAU,EAC5B,EAEMugB,GAAc,CAAC,CAAE,KAAAvgB,KAAW,CAC1B,CAACA,EAAK,IAAI,OAGdA,EAAK,IAAI,KAAK,OAAS,IACvBA,EAAK,IAAI,KAAK,OAAS,IACvBA,EAAK,IAAI,KAAK,QAAU,EAC5B,EAEMwgB,GAAU,CAAC,CAAE,KAAAxgB,EAAM,MAAA5F,EAAO,QAAAlE,CAAO,IAAO,CAC1CuqB,GAAQ,CAAE,KAAAzgB,EAAM,MAAA5F,EAAO,QAAAlE,CAAS,CAAA,EAEhC,KAAM,CAAE,KAAA7J,CAAI,EAAK2T,EAAK,IAElB9J,EAAQ,SAAW,GAAK7J,GAAQA,EAAK,UAAY,IACjD2T,EAAK,gBAAgB3T,CAAI,EACzB2T,EAAK,IAAI,KAAO,KAExB,EAEMygB,GAAU3gB,GAAY,CACxB,SAAUugB,GACV,SAAUE,GACV,aAAcD,EAClB,CAAC,EAEKI,GAAO7jB,GAAW,CACpB,WAAY,GACZ,iBAAkB,GAClB,KAAM,OACN,MAAO2jB,EACX,CAAC,EAEKG,GAAgB,CAAC1pC,EAASyU,IAAU,CACtC,GAAI,CAEA,MAAMya,EAAe,IAAI,aACzBza,EAAM,QAAQoC,GAAQ,CACdA,aAAgB,KAChBqY,EAAa,MAAM,IAAIrY,CAAI,EAE3BqY,EAAa,MAAM,IACf,IAAI,KAAK,CAACrY,CAAI,EAAGA,EAAK,KAAM,CACxB,KAAMA,EAAK,IACnC,CAAqB,CACrB,CAEA,CAAS,EAGD7W,EAAQ,MAAQkvB,EAAa,KAChC,MAAC,CACE,MAAO,EACV,CACD,MAAO,EACX,EAEMya,GAAW,CAAC,CAAE,KAAA5gB,KAAW,CAC3BA,EAAK,IAAI,OAAS,GAClB,MAAM6gB,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,YAAc,QACrB7gB,EAAK,QAAQ,YAAY6gB,CAAM,CACnC,EAEMC,GAAW,CAAC9gB,EAAM7nB,IAAO6nB,EAAK,IAAI,OAAO7nB,GAEzC4oC,GAA8B/gB,GAAQ,CACxCA,EAAK,MAAM,kBAAkB,EAAE,QAAQlc,GAAQ,CACvC,CAACkc,EAAK,IAAI,OAAOlc,EAAK,KAC1Bkc,EAAK,QAAQ,YAAYA,EAAK,IAAI,OAAOlc,EAAK,GAAG,CACzD,CAAK,CACL,EAEMk9B,GAAkB,CAAC,CAAE,KAAAhhB,CAAM,IAAK+gB,GAA4B/gB,CAAI,EAEhEihB,GAAa,CAAC,CAAE,KAAAjhB,EAAM,OAAAhf,KAAa,CAGrC,MAAMkgC,EAAqB,EAFVlhB,EAAK,MAAM,WAAYhf,EAAO,EAAE,EACpB,SAAWsjB,GAAW,QACRtE,EAAK,MAAM,0BAA0B,EAC1EmhB,EAAgB9N,GAAgB,OAAO,EAC7C8N,EAAc,KAAOD,EAAqB,OAAS,SACnDC,EAAc,KAAOnhB,EAAK,MAAM,UAAU,EAC1CA,EAAK,IAAI,OAAOhf,EAAO,IAAMmgC,EAC7BJ,GAA4B/gB,CAAI,CACpC,EAEMohB,GAAgB,CAAC,CAAE,KAAAphB,EAAM,OAAAhf,KAAa,CACxC,MAAMqgC,EAAQP,GAAS9gB,EAAMhf,EAAO,EAAE,EAOtC,GANI,CAACqgC,IAGDrgC,EAAO,sBAAwB,OAAMqgC,EAAM,MAAQrgC,EAAO,qBAG1D,CAACgf,EAAK,MAAM,0BAA0B,GAAG,OAE7C,MAAMshB,EAAWthB,EAAK,MAAM,WAAYhf,EAAO,EAAE,EACjD2/B,GAAcU,EAAO,CAACC,EAAS,IAAI,CAAC,CACxC,EAEMC,GAAmB,CAAC,CAAE,KAAAvhB,EAAM,OAAAhf,KAAa,CAEvC,CAACgf,EAAK,MAAM,0BAA0B,GAC1C,WAAW,IAAM,CACb,MAAMqhB,EAAQP,GAAS9gB,EAAMhf,EAAO,EAAE,EAClC,CAACqgC,GACLV,GAAcU,EAAO,CAACrgC,EAAO,IAAI,CAAC,CACrC,EAAE,CAAC,CACR,EAEMwgC,GAAiB,CAAC,CAAE,KAAAxhB,KAAW,CACjCA,EAAK,QAAQ,SAAWA,EAAK,MAAM,cAAc,CACrD,EAEMyhB,GAAgB,CAAC,CAAE,KAAAzhB,EAAM,OAAAhf,KAAa,CACxC,MAAMqgC,EAAQP,GAAS9gB,EAAMhf,EAAO,EAAE,EAClC,CAACqgC,IACDA,EAAM,YAAYA,EAAM,WAAW,YAAYA,CAAK,EACxD,OAAOrhB,EAAK,IAAI,OAAOhf,EAAO,IAClC,EAIM0gC,GAAiB,CAAC,CAAE,KAAA1hB,EAAM,OAAAhf,KAAa,CACzC,MAAMqgC,EAAQP,GAAS9gB,EAAMhf,EAAO,EAAE,EAClC,CAACqgC,IACDrgC,EAAO,QAAU,KAEjBqgC,EAAM,gBAAgB,OAAO,EAGzBA,EAAM,MAAQ,SACdA,EAAM,MAAQrgC,EAAO,OAG7B+/B,GAA4B/gB,CAAI,EACpC,EAEM2hB,GAAU7hB,GAAY,CACxB,iBAAkB0hB,GAClB,aAAcP,GACd,cAAeG,GACf,gBAAiBK,GACjB,iBAAkBC,GAClB,mBAAoBH,GACpB,kBAAmBP,GACnB,eAAgBA,EACpB,CAAC,EAEK5oC,GAAOykB,GAAW,CACpB,IAAK,WACL,KAAM,OACN,OAAQ+jB,GACR,MAAOe,GACP,WAAY,EAChB,CAAC,EAEKC,GAAc3qC,GAAY,gBAAiBA,EAAUA,EAAQ,YAAW,EAAK,SAE7E4qC,GAAS,CAAC,MAAO,OAAQ,MAAO,MAAO,MAAO,OAAQ,MAAO,MAAM,EACnEC,GAAS,CAAC,MAAO,MAAO,OAAQ,KAAK,EACrCxJ,GAAM,CACR,IAAK,iBACL,KAAM,sBACV,EAEMyJ,GAAsB,CAACt1B,EAAY,MACrCA,EAAYA,EAAU,cAClBo1B,GAAO,SAASp1B,CAAS,EAErB,UAAYA,IAAc,MAAQ,OAASA,IAAc,MAAQ,UAAYA,GAGjFq1B,GAAO,SAASr1B,CAAS,EAClB,QAAUA,EAGd6rB,GAAI7rB,IAAc,IAGvBu1B,GAA2B7b,GAC7B,IAAI,QAAQ,CAAClB,EAASC,IAAW,CAE7B,MAAM+c,EAAQC,GAAS/b,CAAY,EACnC,GAAI8b,EAAM,QAAU,CAACE,GAAShc,CAAY,EACtC,OAAOlB,EAAQgd,CAAK,EAGxBG,GAASjc,CAAY,EAAE,KAAKlB,CAAO,CAC3C,CAAK,EAKCkd,GAAWhc,GACTA,EAAa,MAAcA,EAAa,MAAM,OAAS,EACpD,GAMLic,GAAWjc,GACb,IAAI,QAAQ,CAAClB,EAASC,IAAW,CAE7B,MAAMmd,GAAiBlc,EAAa,MAAQ,MAAM,KAAKA,EAAa,KAAK,EAAI,CAAE,GAG1E,OAAOriB,GAAQw+B,GAAiBx+B,CAAI,CAAC,EAGrC,IAAIA,GAAQy+B,GAAiBz+B,CAAI,CAAC,EAGvC,GAAI,CAACu+B,EAAc,OAAQ,CAGvBpd,EAAQkB,EAAa,MAAQ,MAAM,KAAKA,EAAa,KAAK,EAAI,CAAA,CAAE,EAChE,MACH,CAGD,QAAQ,IAAIkc,CAAa,EACpB,KAAKG,GAAsB,CAExB,MAAM92B,EAAQ,CAAA,EACd82B,EAAmB,QAAQjpC,GAAS,CAChCmS,EAAM,KAAK,MAAMA,EAAOnS,CAAK,CACjD,CAAiB,EAGD0rB,EACIvZ,EACK,OAAOoC,GAAQA,CAAI,EACnB,IAAIA,IACIA,EAAK,gBAAeA,EAAK,cAAgBA,EAAK,oBAC5CA,EACV,CACzB,CACA,CAAa,EACA,MAAM,QAAQ,KAAK,CAChC,CAAK,EAECw0B,GAAmBx+B,GAAQ,CAC7B,GAAI2+B,GAAQ3+B,CAAI,EAAG,CACf,MAAM4+B,EAAQC,GAAW7+B,CAAI,EAC7B,GAAI4+B,EACA,OAAOA,EAAM,QAAUA,EAAM,WAEpC,CACD,OAAO5+B,EAAK,OAAS,MACzB,EAEMy+B,GAAmBz+B,GACrB,IAAI,QAAQ,CAACmhB,EAASC,IAAW,CAC7B,GAAI0d,GAAiB9+B,CAAI,EAAG,CACxB++B,GAAoBF,GAAW7+B,CAAI,CAAC,EAC/B,KAAKmhB,CAAO,EACZ,MAAMC,CAAM,EACjB,MACH,CAEDD,EAAQ,CAACnhB,EAAK,UAAS,CAAE,CAAC,CAClC,CAAK,EAEC++B,GAAsBH,GACxB,IAAI,QAAQ,CAACzd,EAASC,IAAW,CAC7B,MAAMxZ,EAAQ,CAAA,EAGd,IAAIo3B,EAAa,EACbC,EAAc,EAElB,MAAMC,EAAgB,IAAM,CACpBD,IAAgB,GAAKD,IAAe,GACpC7d,EAAQvZ,CAAK,CAE7B,EAGcu3B,EAAcC,GAAY,CAC5BJ,IAEA,MAAMK,EAAkBD,EAAS,eAG3BE,EAAY,IAAM,CACpBD,EAAgB,YAAYE,GAAW,CACnC,GAAIA,EAAQ,SAAW,EAAG,CACtBP,IACAE,IACA,MACH,CAEDK,EAAQ,QAAQX,GAAS,CAEjBA,EAAM,YACNO,EAAYP,CAAK,GAGjBK,IAEAL,EAAM,KAAK50B,GAAQ,CACf,MAAMw1B,EAAgBC,GAAuBz1B,CAAI,EAC7C40B,EAAM,WAAUY,EAAc,cAAgBZ,EAAM,UACxDh3B,EAAM,KAAK43B,CAAa,EACxBP,IACAC,GAChC,CAA6B,EAE7B,CAAqB,EAGDI,GACH,EAAEle,CAAM,CACzB,EAGYke,GACZ,EAGQH,EAAYP,CAAK,CACzB,CAAK,EAECa,GAAyBz1B,GAAQ,CACnC,GAAIA,EAAK,KAAK,OAAQ,OAAOA,EAC7B,MAAM/T,EAAO+T,EAAK,iBACZvH,EAAOuH,EAAK,KACZ9Q,EAAO+kC,GAAoBta,GAAyB3Z,EAAK,IAAI,CAAC,EACpE,OAAK9Q,EAAK,SACV8Q,EAAOA,EAAK,MAAM,EAAGA,EAAK,KAAM9Q,CAAI,EACpC8Q,EAAK,KAAOvH,EACZuH,EAAK,iBAAmB/T,GACjB+T,CACX,EAEM80B,GAAmB9+B,GAAQ2+B,GAAQ3+B,CAAI,IAAM6+B,GAAW7+B,CAAI,GAAK,CAAE,GAAE,YAErE2+B,GAAU3+B,GAAQ,qBAAsBA,EAExC6+B,GAAa7+B,GAAQA,EAAK,mBAK1Bo+B,GAAW/b,GAAgB,CAC7B,IAAI8b,EAAQ,CAAA,EACZ,GAAI,CAGA,GADAA,EAAQuB,GAA6Brd,CAAY,EAC7C8b,EAAM,OACN,OAAOA,EAEXA,EAAQwB,GAA4Btd,CAAY,CACnD,MAAC,CAED,CACD,OAAO8b,CACX,EAEMwB,GAA8Btd,GAAgB,CAChD,IAAI/tB,EAAO+tB,EAAa,QAAQ,KAAK,EACrC,OAAI,OAAO/tB,GAAS,UAAYA,EAAK,OAC1B,CAACA,CAAI,EAET,EACX,EAEMorC,GAA+Brd,GAAgB,CACjD,IAAI/tB,EAAO+tB,EAAa,QAAQ,WAAW,EAC3C,GAAI,OAAO/tB,GAAS,UAAYA,EAAK,OAAQ,CACzC,MAAM8wB,EAAU9wB,EAAK,MAAM,mBAAmB,EAC9C,GAAI8wB,EACA,MAAO,CAACA,EAAQ,EAAE,CAEzB,CACD,MAAO,EACX,EAEMwa,GAAqB,CAAA,EAErBC,GAAgB,IAAM,CACxB,SAAU,EAAE,MACZ,QAAS,EAAE,MACX,UAAW,EAAE,SAAW,EAAE,OAC1B,SAAU,EAAE,SAAW,EAAE,MAC7B,GAEMC,GAAwB,CAAC3sC,EAAS4sC,EAAgBC,IAAkB,CACtE,MAAMC,EAAWC,GAAqBH,CAAc,EAE9CI,EAAS,CACX,QAAAhtC,EACA,cAAA6sC,EACA,MAAO,KACP,OAAQ,IAAM,CAAE,EAChB,QAAS,IAAM,CAAE,EACjB,OAAQ,IAAM,CAAE,EAChB,OAAQ,IAAM,CAAE,EAChB,OAAQ,IAAM,CAAE,EAChB,UAAW,IAAM,CAAE,CAC3B,EAEI,OAAAG,EAAO,QAAUF,EAAS,YAAYE,CAAM,EAErCA,CACX,EAEMD,GAAuB/sC,GAAW,CAEpC,MAAM8sC,EAAWL,GAAmB,KAAK5/B,GAAQA,EAAK,UAAY7M,CAAO,EACzE,GAAI8sC,EACA,OAAOA,EAIX,MAAMG,EAAcC,GAAwBltC,CAAO,EACnD,OAAAysC,GAAmB,KAAKQ,CAAW,EAC5BA,CACX,EAEMC,GAA0BltC,GAAW,CACvC,MAAMmtC,EAAU,CAAA,EAEVrkB,EAAS,CACX,UAAAskB,GACA,SAAAC,GACA,UAAAC,GACA,KAAAjK,EACR,EAEUkK,EAAW,CAAA,EAEjBvtB,GAAM8I,EAAQ,CAACvnB,EAAOisC,IAAkB,CACpCD,EAAShsC,GAASisC,EAAcxtC,EAASmtC,CAAO,EAChDntC,EAAQ,iBAAiBuB,EAAOgsC,EAAShsC,GAAQ,EAAK,CAC9D,CAAK,EAED,MAAMurC,EAAW,CACb,QAAA9sC,EACA,YAAagtC,IAETG,EAAQ,KAAKH,CAAM,EAGZ,IAAM,CAETG,EAAQ,OAAOA,EAAQ,QAAQH,CAAM,EAAG,CAAC,EAGrCG,EAAQ,SAAW,IACnBV,GAAmB,OAAOA,GAAmB,QAAQK,CAAQ,EAAG,CAAC,EAEjE9sB,GAAM8I,EAAQvnB,GAAS,CACnBvB,EAAQ,oBAAoBuB,EAAOgsC,EAAShsC,GAAQ,EAAK,CACjF,CAAqB,EAErB,EAEA,EAEI,OAAOurC,CACX,EAEMW,GAAmB,CAAC1kB,EAAMra,KACtB,qBAAsBqa,IACxBA,EAAO,UAEJA,EAAK,iBAAiBra,EAAM,EAAGA,EAAM,CAAC,GAG3Cg/B,GAAgB,CAAC,EAAG5sC,IAAW,CAEjC,MAAMioB,EAAO4hB,GAAY7pC,CAAM,EAIzB6sC,EAAoBF,GAAiB1kB,EAAM,CAC7C,EAAG,EAAE,MAAQ,OAAO,YACpB,EAAG,EAAE,MAAQ,OAAO,WAC5B,CAAK,EAGD,OAAO4kB,IAAsB7sC,GAAUA,EAAO,SAAS6sC,CAAiB,CAC5E,EAEA,IAAIC,GAAgB,KAEpB,MAAMC,GAAgB,CAAC3e,EAAc4e,IAAW,CAE5C,GAAI,CACA5e,EAAa,WAAa4e,CAClC,MAAM,CAAY,CAClB,EAEMV,GAAY,CAACrkB,EAAMokB,IAAY3yC,GAAK,CACtCA,EAAE,eAAc,EAEhBozC,GAAgBpzC,EAAE,OAElB2yC,EAAQ,QAAQH,GAAU,CACtB,KAAM,CAAE,QAAAhtC,EAAS,QAAA+tC,CAAS,EAAGf,EAEzBU,GAAclzC,EAAGwF,CAAO,IACxBgtC,EAAO,MAAQ,QAGfe,EAAQrB,GAAclyC,CAAC,CAAC,EAEpC,CAAK,CACL,EAEM6yC,GAAW,CAACtkB,EAAMokB,IAAY3yC,GAAK,CACrCA,EAAE,eAAc,EAEhB,MAAM00B,EAAe10B,EAAE,aAEvBuwC,GAAyB7b,CAAY,EAAE,KAAKlf,GAAS,CACjD,IAAIg+B,EAAiB,GAErBb,EAAQ,KAAKH,GAAU,CACnB,KAAM,CAAE,cAAAH,EAAe,QAAA7sC,EAAS,QAAA+tC,EAAS,OAAAE,EAAQ,OAAAC,EAAQ,UAAAC,CAAW,EAAGnB,EAGvEa,GAAc3e,EAAc,MAAM,EAGlC,MAAMkf,EAAiBD,EAAUn+B,CAAK,EAGtC,GAAI,CAACo+B,EAAgB,CACjBP,GAAc3e,EAAc,MAAM,EAClC,MACH,CAGD,GAAIwe,GAAclzC,EAAGwF,CAAO,EAAG,CAI3B,GAHAguC,EAAiB,GAGbhB,EAAO,QAAU,KAAM,CACvBA,EAAO,MAAQ,QACfe,EAAQrB,GAAclyC,CAAC,CAAC,EACxB,MACH,CAMD,GAHAwyC,EAAO,MAAQ,OAGXH,GAAiB,CAACuB,EAAgB,CAClCP,GAAc3e,EAAc,MAAM,EAClC,MACH,CAGDgf,EAAOxB,GAAclyC,CAAC,CAAC,CACvC,MAEoBqyC,GAAiB,CAACmB,GAClBH,GAAc3e,EAAc,MAAM,EAIlC8d,EAAO,QACPA,EAAO,MAAQ,KACfiB,EAAOvB,GAAclyC,CAAC,CAAC,EAG3C,CAAS,CACT,CAAK,CACL,EAEM6oC,GAAO,CAACta,EAAMokB,IAAY3yC,GAAK,CACjCA,EAAE,eAAc,EAEhB,MAAM00B,EAAe10B,EAAE,aAEvBuwC,GAAyB7b,CAAY,EAAE,KAAKlf,GAAS,CACjDm9B,EAAQ,QAAQH,GAAU,CACtB,KAAM,CAAE,cAAAH,EAAe,QAAA7sC,EAAS,OAAAquC,EAAQ,OAAAJ,EAAQ,UAAAE,CAAW,EAAGnB,EAK9D,GAHAA,EAAO,MAAQ,KAGX,EAAAH,GAAiB,CAACa,GAAclzC,EAAGwF,CAAO,GAG9C,IAAI,CAACmuC,EAAUn+B,CAAK,EAAG,OAAOi+B,EAAOvB,GAAclyC,CAAC,CAAC,EAGrD6zC,EAAO3B,GAAclyC,CAAC,EAAGwV,CAAK,EAC1C,CAAS,CACT,CAAK,CACL,EAEMs9B,GAAY,CAACvkB,EAAMokB,IAAY3yC,GAAK,CAClCozC,KAAkBpzC,EAAE,QAIxB2yC,EAAQ,QAAQH,GAAU,CACtB,KAAM,CAAE,OAAAiB,CAAQ,EAAGjB,EAEnBA,EAAO,MAAQ,KAEfiB,EAAOvB,GAAclyC,CAAC,CAAC,CAC/B,CAAK,CACL,EAEM8zC,GAAe,CAACC,EAAOC,EAAe9tC,IAAY,CAEpD6tC,EAAM,UAAU,IAAI,kBAAkB,EAGtC,KAAM,CAAE,mBAAAE,EAAoB,sBAAAC,EAAuB,YAAAC,EAAc3+B,GAASA,CAAO,EAAGtP,EAG9EssC,EAASL,GACX4B,EACAE,EAAqB,SAAS,gBAAkBF,EAChDG,CACR,EAGI,IAAIE,EAAY,GACZC,EAAe,GAGnB7B,EAAO,UAAYh9B,GAGRw+B,EAAcG,EAAY3+B,CAAK,CAAC,EAG3Cg9B,EAAO,OAAS,CAACjsC,EAAUiP,IAAU,CACjC,MAAM8+B,EAAgBH,EAAY3+B,CAAK,EAEvC,GAAI,CAACw+B,EAAcM,CAAa,EAAG,CAC/BhvB,EAAI,UAAU/e,CAAQ,EACtB,MACH,CAED8tC,EAAe,YAEf/uB,EAAI,OAAOgvB,EAAe/tC,CAAQ,CAC1C,EAEIisC,EAAO,OAASjsC,GAAY,CACxB+e,EAAI,OAAO/e,CAAQ,CAC3B,EAEIisC,EAAO,QAAUjsC,GAAY,CACzB8tC,EAAe,YAEf/uB,EAAI,YAAY/e,CAAQ,CAChC,EAEIisC,EAAO,OAASjsC,GAAY,CACxB8tC,EAAe,YAEf/uB,EAAI,UAAU/e,CAAQ,CAC9B,EAEI,MAAM+e,EAAM,CACR,kBAAmB,IAAM,CACjB8uB,IAAcC,IACdN,EAAM,QAAQ,YAAcM,EAC5BD,EAAYC,EAEnB,EACD,OAAQ,IAAM,CAAE,EAChB,YAAa,IAAM,CAAE,EACrB,OAAQ,IAAM,CAAE,EAChB,UAAW,IAAM,CAAE,EACnB,QAAS,IAAM,CAEX7B,EAAO,QAAO,CACjB,CACT,EAEI,OAAOltB,CACX,EAEA,IAAIivB,GAAY,GAChB,MAAMC,GAAc,CAAA,EAEdC,GAAc,GAAK,CAErB,MAAMC,EAAW,SAAS,cAM1B,GAJIA,IACC,kBAAkB,KAAKA,EAAS,QAAQ,GACrCA,EAAS,aAAa,iBAAiB,IAAM,QAExB,CAEzB,IAAIC,EAAU,GACVnvC,EAAUkvC,EACd,KAAOlvC,IAAY,SAAS,MAAM,CAC9B,GAAIA,EAAQ,UAAU,SAAS,gBAAgB,EAAG,CAC9CmvC,EAAU,GACV,KACH,CACDnvC,EAAUA,EAAQ,UACrB,CAED,GAAI,CAACmvC,EAAS,MACjB,CAEDpE,GAAyB,EAAE,aAAa,EAAE,KAAKt2B,GAAS,CAEhD,CAACA,EAAM,QAKXu6B,GAAY,QAAQniB,GAAYA,EAASpY,CAAK,CAAC,CACvD,CAAK,CACL,EAEM26B,GAASljC,GAAM,CAEb8iC,GAAY,SAAS9iC,CAAE,IAK3B8iC,GAAY,KAAK9iC,CAAE,EAGf,CAAA6iC,KAIJA,GAAY,GACZ,SAAS,iBAAiB,QAASE,EAAW,GAClD,EAEMI,GAAWxiB,GAAY,CACzBN,GAAYyiB,GAAaA,GAAY,QAAQniB,CAAQ,CAAC,EAGlDmiB,GAAY,SAAW,IACvB,SAAS,oBAAoB,QAASC,EAAW,EACjDF,GAAY,GAEpB,EAEMO,GAAe,IAAM,CACvB,MAAMpjC,EAAKuI,GAAS,CAChBqL,EAAI,OAAOrL,CAAK,CACxB,EAEUqL,EAAM,CACR,QAAS,IAAM,CACXuvB,GAASnjC,CAAE,CACd,EACD,OAAQ,IAAM,CAAE,CACxB,EAEI,OAAAkjC,GAAOljC,CAAE,EAEF4T,CACX,EAKMyvB,GAAW,CAAC,CAAE,KAAAxmB,EAAM,MAAA5F,KAAY,CAClC4F,EAAK,QAAQ,GAAK,uBAAuB5F,EAAM,KAC/CxM,GAAKoS,EAAK,QAAS,OAAQ,OAAO,EAClCpS,GAAKoS,EAAK,QAAS,YAAa,QAAQ,EACxCpS,GAAKoS,EAAK,QAAS,gBAAiB,WAAW,CACnD,EAEA,IAAIymB,GAA8B,KAC9BC,GAA2B,KAE/B,MAAMC,GAAY,CAAA,EAEZC,GAAS,CAAC5mB,EAAMlQ,IAAY,CAC9BkQ,EAAK,QAAQ,YAAclQ,CAC/B,EAEM+2B,GAAU7mB,GAAQ,CACpBA,EAAK,QAAQ,YAAc,EAC/B,EAEM8mB,GAAe,CAAC9mB,EAAMgI,EAAUtqB,IAAU,CAC5C,MAAMuE,EAAQ+d,EAAK,MAAM,iBAAiB,EAC1C4mB,GACI5mB,EACA,GAAGtiB,KAASsqB,MAAa/lB,KACrBA,IAAU,EACJ+d,EAAK,MAAM,+BAA+B,EAC1CA,EAAK,MAAM,6BAA6B,GAE1D,EAGI,aAAa0mB,EAAwB,EACrCA,GAA2B,WAAW,IAAM,CACxCG,GAAQ7mB,CAAI,CACf,EAAE,IAAI,CACX,EAEM+mB,GAAkB/mB,GAAQA,EAAK,QAAQ,WAAW,SAAS,SAAS,aAAa,EAEjFgnB,GAAY,CAAC,CAAE,KAAAhnB,EAAM,OAAAhf,KAAa,CACpC,GAAI,CAAC+lC,GAAgB/mB,CAAI,EACrB,OAGJA,EAAK,QAAQ,YAAc,GAC3B,MAAMlc,EAAOkc,EAAK,MAAM,WAAYhf,EAAO,EAAE,EAC7C2lC,GAAU,KAAK7iC,EAAK,QAAQ,EAE5B,aAAa2iC,EAA2B,EACxCA,GAA8B,WAAW,IAAM,CAC3CK,GAAa9mB,EAAM2mB,GAAU,KAAK,IAAI,EAAG3mB,EAAK,MAAM,sBAAsB,CAAC,EAC3E2mB,GAAU,OAAS,CACtB,EAAE,GAAG,CACV,EAEMM,GAAc,CAAC,CAAE,KAAAjnB,EAAM,OAAAhf,KAAa,CACtC,GAAI,CAAC+lC,GAAgB/mB,CAAI,EACrB,OAGJ,MAAMlc,EAAO9C,EAAO,KACpB8lC,GAAa9mB,EAAMlc,EAAK,SAAUkc,EAAK,MAAM,wBAAwB,CAAC,CAC1E,EAEMknB,GAAgB,CAAC,CAAE,KAAAlnB,EAAM,OAAAhf,KAAa,CAIxC,MAAMgnB,EADOhI,EAAK,MAAM,WAAYhf,EAAO,EAAE,EACvB,SAChBtD,EAAQsiB,EAAK,MAAM,oCAAoC,EAE7D4mB,GAAO5mB,EAAM,GAAGgI,KAAYtqB,GAAO,CACvC,EAEMypC,GAAoB,CAAC,CAAE,KAAAnnB,EAAM,OAAAhf,KAAa,CAE5C,MAAMgnB,EADOhI,EAAK,MAAM,WAAYhf,EAAO,EAAE,EACvB,SAChBtD,EAAQsiB,EAAK,MAAM,mCAAmC,EAE5D4mB,GAAO5mB,EAAM,GAAGgI,KAAYtqB,GAAO,CACvC,EAEM0pC,GAAY,CAAC,CAAE,KAAApnB,EAAM,OAAAhf,KAAa,CAEpC,MAAMgnB,EADOhI,EAAK,MAAM,WAAYhf,EAAO,EAAE,EACvB,SAItB4lC,GAAO5mB,EAAM,GAAGhf,EAAO,OAAO,QAAQgnB,KAAYhnB,EAAO,OAAO,KAAK,CACzE,EAEMqmC,GAAYxqB,GAAW,CACzB,OAAQ2pB,GACR,WAAY,GACZ,iBAAkB,GAClB,MAAO1mB,GAAY,CACf,cAAeknB,GACf,gBAAiBC,GACjB,6BAA8BC,GAE9B,0BAA2BC,GAC3B,2BAA4BA,GAE5B,4BAA6BC,GAC7B,0BAA2BA,GAC3B,uBAAwBA,GACxB,gCAAiCA,EACzC,CAAK,EACD,IAAK,OACL,KAAM,WACV,CAAC,EAEKE,GAAW,CAAC/lB,EAAQ5kB,EAAY,MAClC4kB,EAAO,QAAQ,IAAI,OAAO,GAAG5kB,KAAc,GAAG,EAAG05B,GAAOA,EAAI,OAAO,CAAC,EAAE,YAAW,CAAE,EAEjFkR,GAAW,CAACC,EAAMjoB,EAAW,GAAIkoB,EAAgB,KAAS,CAC5D,IAAIjoB,EAAO,KAAK,MACZ9lB,EAAU,KAEd,MAAO,IAAImd,IAAS,CAChB,aAAand,CAAO,EAEpB,MAAMwiC,EAAO,KAAK,IAAG,EAAK1c,EAEpBzE,EAAK,IAAM,CACbyE,EAAO,KAAK,MACZgoB,EAAK,GAAG3wB,CAAI,CACxB,EAEYqlB,EAAO3c,EAIFkoB,IACD/tC,EAAU,WAAWqhB,EAAIwE,EAAW2c,CAAI,GAI5CnhB,GAEZ,CACA,EAEM2sB,GAAkB,IAElBC,GAAU,GAAK,EAAE,iBAEjBC,GAAW,CAAC,CAAE,KAAA5nB,EAAM,MAAA5F,KAAY,CAElC,MAAMjiB,EAAK6nB,EAAK,MAAM,QAAQ,EAC1B7nB,IACA6nB,EAAK,QAAQ,GAAK7nB,GAItB,MAAMof,EAAYyI,EAAK,MAAM,gBAAgB,EACzCzI,GACAA,EACK,MAAM,GAAG,EACT,OAAOhR,GAAQA,EAAK,MAAM,EAC1B,QAAQA,GAAQ,CACbyZ,EAAK,QAAQ,UAAU,IAAIzZ,CAAI,CAC/C,CAAa,EAITyZ,EAAK,IAAI,MAAQA,EAAK,gBAClBA,EAAK,gBAAgBmgB,GAAW,CAC5B,GAAG/lB,EACH,WAAY,KACZ,QAAS4F,EAAK,MAAM,gBAAgB,CAChD,CAAS,CACT,EAGIA,EAAK,IAAI,KAAOA,EAAK,gBAAgBA,EAAK,gBAAgB6e,GAAc,CAAE,WAAY,IAAI,CAAE,CAAC,EAG7F7e,EAAK,IAAI,MAAQA,EAAK,gBAAgBA,EAAK,gBAAgB0Z,GAAO,CAAE,KAAM,YAAY,CAAE,CAAC,EAGzF1Z,EAAK,IAAI,UAAYA,EAAK,gBAAgBA,EAAK,gBAAgBqnB,GAAW,CAAE,GAAGjtB,CAAK,CAAE,CAAC,EAGvF4F,EAAK,IAAI,KAAOA,EAAK,gBAAgBA,EAAK,gBAAgB5nB,GAAM,CAAE,GAAGgiB,CAAK,CAAE,CAAC,EAI7E4F,EAAK,IAAI,QAAUqT,GAAgB,KAAK,EACxCrT,EAAK,IAAI,QAAQ,MAAM,OAAS,OAChCA,EAAK,QAAQ,YAAYA,EAAK,IAAI,OAAO,EAGzCA,EAAK,IAAI,OAAS,KAGlBA,EAAK,MAAM,YAAY,EAClB,OAAOtS,GAAS,CAAC8F,GAAQ9F,EAAM,KAAK,CAAC,EACrC,IAAI,CAAC,CAAE,KAAAnH,EAAM,MAAApQ,KAAY,CACtB6pB,EAAK,QAAQ,QAAQzZ,GAAQpQ,CACzC,CAAS,EAGL6pB,EAAK,IAAI,cAAgB,KACzBA,EAAK,IAAI,aAAeunB,GAAS,IAAM,CACnCvnB,EAAK,IAAI,cAAgB,GACzBA,EAAK,SAAS,iBAAiB,CAClC,EAAE,GAAG,EAGNA,EAAK,IAAI,oBAAsB,KAC/BA,EAAK,IAAI,cAAgB,GAGzB,MAAM6nB,EAAW,OAAO,WAAW,oCAAoC,EAAE,QACnEC,EAAmB,iBAAkB,OACvC9nB,EAAK,MAAM,mBAAmB,GAAK8nB,GAAoB,CAACD,IACxD7nB,EAAK,QAAQ,iBAAiB,YAAa2nB,GAAS,CAAE,QAAS,EAAK,CAAE,EACtE3nB,EAAK,QAAQ,iBAAiB,eAAgB2nB,EAAO,GAIzD,MAAMI,EAAU/nB,EAAK,MAAM,aAAa,EAExC,GADmB+nB,EAAQ,SAAW,EACtB,CACZ,MAAMC,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,UAAY,oBACjBA,EAAK,KAAOD,EAAQ,GACpBC,EAAK,SAAW,GAChBA,EAAK,OAAS,SACdA,EAAK,IAAM,+BACXA,EAAK,YAAcD,EAAQ,GAC3B/nB,EAAK,QAAQ,YAAYgoB,CAAI,EAC7BhoB,EAAK,IAAI,QAAUgoB,CACtB,CACL,EAEMC,GAAU,CAAC,CAAE,KAAAjoB,EAAM,MAAA5F,EAAO,QAAAlE,CAAO,IAAO,CAc1C,GAZAgyB,GAAQ,CAAE,KAAAloB,EAAM,MAAA5F,EAAO,QAAAlE,CAAS,CAAA,EAGhCA,EACK,OAAOlV,GAAU,kBAAkB,KAAKA,EAAO,IAAI,CAAC,EACpD,OAAOA,GAAU,CAACwS,GAAQxS,EAAO,KAAK,KAAK,CAAC,EAC5C,IAAI,CAAC,CAAE,KAAAhE,EAAM,KAAA5E,MAAW,CACrB,MAAMmO,GAAO+gC,GAAStqC,EAAK,UAAU,CAAC,EAAE,cAAe,GAAG,EAC1DgjB,EAAK,QAAQ,QAAQzZ,IAAQnO,GAAK,MAClC4nB,EAAK,iBAAgB,CACjC,CAAS,EAEDA,EAAK,KAAK,QAAQ,OAAQ,OAE1BA,EAAK,KAAK,QAAQ,QAAUA,EAAK,IAAI,gBACrCA,EAAK,IAAI,cAAgBA,EAAK,KAAK,QAAQ,MAC3CA,EAAK,IAAI,gBAIb,IAAImoB,EAASnoB,EAAK,IAAI,OACjBmoB,IACDA,EAASnoB,EAAK,IAAI,OAASooB,GAA+BpoB,CAAI,EAG9DA,EAAK,QAAQ,YAAYA,EAAK,IAAI,OAAO,EACzCA,EAAK,IAAI,QAAU,MAIvB,KAAM,CAAE,OAAAqoB,EAAQ,MAAA3qC,EAAO,KAAA+R,EAAM,MAAAiqB,CAAO,EAAG1Z,EAAK,IAGxCqoB,GACAA,EAAO,kBAAiB,EAI5B,MAAMtiB,EAAc/F,EAAK,MAAM,wBAAwB,EACjDsoB,EAActoB,EAAK,MAAM,oBAAoB,EAC7C0R,EAAa1R,EAAK,MAAM,iBAAiB,EACzCuoB,EAAWD,EAActoB,EAAK,MAAM,eAAe,GAAK0nB,GAAkB,EAC1Ec,EAAgB9W,IAAe6W,EAG/BE,EAAYvyB,EAAQ,KAAKlV,GAAUA,EAAO,OAAS,cAAc,EAGvE,GAAIwnC,GAAiBC,EAAW,CAE5B,MAAMjX,EAAoBiX,EAAU,KAAK,kBAGzC/qC,EAAM,QAAU,EAEZ4qC,EACA5qC,EAAM,WAAa,IAEf8zB,IAAsBlO,GAAkB,IACxC5lB,EAAM,WAAa,GACZ8zB,IAAsBlO,GAAkB,OAC/C5lB,EAAM,WAAa,GAEnBA,EAAM,WAAa,EAGnC,MAAgB8qC,IACR9qC,EAAM,QAAU,EAChBA,EAAM,WAAa,EACnBA,EAAM,WAAa,GAGvB,MAAMgrC,EAAiBC,GAAwB3oB,CAAI,EAE7C4oB,EAAaC,GAAoB7oB,CAAI,EAErC8oB,GAAcprC,EAAM,KAAK,QAAQ,OACjCqrC,GAAqB,CAACT,GAAeE,EAAgB,EAAIM,GAEzDE,GAAgBR,EAAgB/4B,EAAK,KAAK,QAAQ,UAAY,EAC9Dw5B,GAAmBvX,IAAe,EAAI,EAAIjiB,EAAK,KAAK,QAAQ,aAE5DwuB,GAAe8K,GAAqBC,GAAgBJ,EAAW,OAASK,GACxEC,GAAeH,GAAqBC,GAAgBJ,EAAW,OAASK,GAM9E,GAHAx5B,EAAK,WACD,KAAK,IAAI,EAAGs5B,GAAqBt5B,EAAK,KAAK,QAAQ,SAAS,EAAIi5B,EAAe,IAE/E3iB,EAAa,CAIb,MAAMvQ,EAAQwK,EAAK,KAAK,QAAQ,MAC1BvK,GAASD,EAAQuQ,EAGnBA,IAAgB/F,EAAK,IAAI,sBACzBA,EAAK,IAAI,oBAAsB+F,EAC/B/F,EAAK,IAAI,cAAgB,IAI7B,MAAMmpB,GAAUnpB,EAAK,IAAI,cACzBmpB,GAAQ,KAAK3zB,CAAK,EAElB,MAAM4zB,GAAc,EACpB,GAAID,GAAQ,OAASC,GAAc,EAAG,CAClC,MAAMn/B,GAAIk/B,GAAQ,OACZ3wB,GAASvO,GAAI,GACnB,IAAIo/B,GAAU,EACd,QAASx3C,GAAIoY,GAAGpY,IAAK2mB,GAAQ3mB,KAKzB,GAJIs3C,GAAQt3C,MAAOs3C,GAAQt3C,GAAI,IAC3Bw3C,KAGAA,IAAWD,GAEX,MAGX,CAGD1P,EAAM,SAAW,GACjBA,EAAM,OAASjkB,GAGf,MAAM6zB,GAEF7zB,GACAszB,IAECE,GAAmBP,EAAe,SAElCF,EAAgBQ,GAAgB,GAEjCJ,EAAW,OAASU,GACpB75B,EAAK,SAAW65B,GAEhB75B,EAAK,SAAW,KAIpBuQ,EAAK,OAASvK,EACtB,SAAe0yB,EAAO,YAAa,CAI3BzO,EAAM,SAAW,GAGjB,MAAM4P,EAEFnB,EAAO,YACPY,IAECE,GAAmBP,EAAe,SAElCF,EAAgBQ,GAAgB,GAGjCJ,EAAW,OAASU,EACpB75B,EAAK,SAAW65B,EAEhB75B,EAAK,SAAW,IAI5B,SAAe04B,EAAO,aAAc,CAI5B,MAAMoB,EAAiBtL,IAAgBkK,EAAO,aACxCqB,GAAc,KAAK,IAAIrB,EAAO,aAAclK,EAAY,EAC9DvE,EAAM,SAAW,GACjBA,EAAM,OAAS6P,EACTC,GACAA,GAAcd,EAAe,IAAMA,EAAe,OAGxD,MAAMY,GAEFE,GACAT,IAECE,GAAmBP,EAAe,SAElCF,EAAgBQ,GAAgB,GAGjC/K,GAAekK,EAAO,cAAgBS,EAAW,OAASU,GAC1D75B,EAAK,SAAW65B,GAEhB75B,EAAK,SAAW,KAIpBuQ,EAAK,OAAS,KAAK,IACfmoB,EAAO,aACPe,GAAeR,EAAe,IAAMA,EAAe,MAC/D,CACA,KAAW,CAIH,MAAMe,EAAa/X,EAAa,EAAIgX,EAAe,IAAMA,EAAe,OAAS,EACjFhP,EAAM,SAAW,GACjBA,EAAM,OAAS,KAAK,IAAIoP,GAAa7K,GAAewL,CAAU,EAG9DzpB,EAAK,OAAS,KAAK,IAAI8oB,GAAaI,GAAeO,CAAU,CAChE,CAGGzpB,EAAK,IAAI,SAAW0Z,EAAM,gBAC1B1Z,EAAK,IAAI,QAAQ,MAAM,UAAY,cAAc0Z,EAAM,mBAC/D,EAEMiP,GAA0B3oB,GAAQ,CACpC,MAAMlc,EAAOkc,EAAK,IAAI,KAAK,WAAW,GAAG,WAAW,GACpD,OAAOlc,EACD,CACI,IAAKA,EAAK,KAAK,QAAQ,UACvB,OAAQA,EAAK,KAAK,QAAQ,YAC7B,EACD,CACI,IAAK,EACL,OAAQ,CACtB,CACA,EAEM+kC,GAAsB7oB,GAAQ,CAChC,IAAI0pB,EAAS,EACTvB,EAAS,EAGb,MAAMwB,EAAa3pB,EAAK,IAAI,KACtB4pB,EAAWD,EAAW,WAAW,GACjCzM,EAAkB0M,EAAS,WAAW,OAAOlyB,IAASA,GAAM,KAAK,QAAQ,MAAM,EAC/EojB,EAAW9a,EACZ,MAAM,kBAAkB,EACxB,IAAIlc,IAAQo5B,EAAgB,KAAKxlB,IAASA,GAAM,KAAO5T,GAAK,EAAE,CAAC,EAC/D,OAAOA,IAAQA,EAAI,EAGxB,GAAIg3B,EAAS,SAAW,EAAG,MAAO,CAAE,OAAA4O,EAAQ,OAAAvB,GAE5C,MAAMxN,EAAkBiP,EAAS,KAAK,QAAQ,MACxClM,EAAY7C,GAAuB+O,EAAU9O,EAAU6O,EAAW,eAAe,EAEjF5L,EAAYjD,EAAS,GAAG,KAAK,QAE7BM,EAAqB2C,EAAU,UAAYA,EAAU,aACrD9C,EAAuB8C,EAAU,WAAaA,EAAU,YAExDnD,EAAYmD,EAAU,MAAQ9C,EAC9BI,EAAa0C,EAAU,OAAS3C,EAEhCvyB,EAAU,OAAO60B,EAAc,KAAeA,GAAa,EAAI,EAAI,EACnEmM,EAAc/O,EAAS,KAAKpjB,IAASA,GAAM,kBAAoBA,GAAM,QAAU,GAAI,EACnF,GACA,EACAoyB,GAAoBhP,EAAS,OAASjyB,EAAUghC,EAChD3O,GAAcR,GAAeC,EAAiBC,CAAS,EAG7D,OAAIM,KAAgB,EAChBJ,EAAS,QAAQh3B,IAAQ,CACrB,MAAM2R,GAAS3R,GAAK,KAAK,QAAQ,OAASs3B,EAC1C+M,GAAU1yB,GACVi0B,GAAUj0B,GAAS3R,GAAK,OACpC,CAAS,GAIDqkC,EAAS,KAAK,KAAK2B,GAAoB5O,EAAW,EAAIG,EACtDqO,EAASvB,GAGN,CAAE,OAAAuB,EAAQ,OAAAvB,EACrB,EAEMC,GAAiCpoB,GAAQ,CAC3C,MAAMvK,EAASuK,EAAK,IAAI,eAAiB,KAIzC,MAAO,CACH,aAJiB,SAASA,EAAK,MAAM,UAAW,EAAE,GAAK,KAKvD,YAJgBvK,IAAW,EAAI,KAAOA,CAK9C,CACA,EAEMs0B,GAAkB,CAAC/pB,EAAM/Y,IAAU,CACrC,MAAM+iC,EAAehqB,EAAK,MAAM,mBAAmB,EAC7CiqB,EAAgBjqB,EAAK,MAAM,oBAAoB,EAC/C0R,EAAa1R,EAAK,MAAM,iBAAiB,EAC/C,IAAIuoB,EAAWvoB,EAAK,MAAM,eAAe,EAGzC,MAAMkqB,EAAmBjjC,EAAM,OAG/B,MAAI,CAACgjC,GAAiBC,EAAmB,GACrClqB,EAAK,SAAS,sBAAuB,CACjC,OAAQ/Y,EACR,MAAOujB,GAAe,UAAW,EAAG,WAAW,CAC3D,CAAS,EACM,KAIX+d,EAAW0B,EAAgB1B,EAAW,EAElC,CAAC0B,GAAiBD,EAEX,GAIS/oB,GAAMsnB,CAAQ,GACf7W,EAAawY,EAAmB3B,GAC/CvoB,EAAK,SAAS,sBAAuB,CACjC,OAAQ/Y,EACR,MAAOujB,GAAe,UAAW,EAAG,WAAW,CAC3D,CAAS,EACM,IAGJ,GACX,EAEM2f,GAAe,CAAC16B,EAAMqrB,EAAU9iC,IAAa,CAC/C,MAAM4xC,EAAWn6B,EAAK,WAAW,GACjC,OAAOorB,GAAuB+O,EAAU9O,EAAU,CAC9C,KAAM9iC,EAAS,UAAY4xC,EAAS,KAAK,QAAQ,KACjD,IACI5xC,EAAS,UACRyX,EAAK,KAAK,MAAM,IAAMA,EAAK,KAAK,QAAQ,UAAYA,EAAK,KAAK,QAAQ,UACnF,CAAK,CACL,EAKM26B,GAAapqB,GAAQ,CACvB,MAAMqqB,EAAYrqB,EAAK,MAAM,gBAAgB,EACvC8U,EAAa9U,EAAK,MAAM,cAAc,EACtCsqB,EAAUD,GAAa,CAACvV,EAC9B,GAAIwV,GAAW,CAACtqB,EAAK,IAAI,OAAQ,CAC7B,MAAMqoB,EAAS9C,GACXvlB,EAAK,QACL/Y,GAAS,CAEL,MAAMsjC,EAAiBvqB,EAAK,MAAM,sBAAsB,IAAM,IAAM,IAIpE,OADuBA,EAAK,MAAM,qBAAqB,EAEjD/Y,EAAM,MACFnD,GACIuhB,GAAa,oBAAqBvhB,EAAM,CACpC,MAAOkc,EAAK,KAC9C,CAA+B,EAAE,MAAM9mB,GAAUA,IAAW,EAAI,GAAKqxC,EAAezmC,CAAI,CACjE,EACD,EACT,EACD,CACI,YAAamD,GAAS,CAClB,MAAM0qB,EAAe3R,EAAK,MAAM,mBAAmB,EACnD,OAAO/Y,EAAM,OAAOnD,GACZ0qB,GAAO1qB,CAAI,EACJ,CAAC6tB,EAAa,SAAS7tB,EAAK,KAAK,YAAW,CAAE,EAElD,EACV,CACJ,EACD,mBAAoBkc,EAAK,MAAM,kBAAkB,EACjD,sBAAuBA,EAAK,MAAM,qBAAqB,CAC1D,CACb,EAEQqoB,EAAO,OAAS,CAACphC,EAAOjP,IAAa,CAGjC,MAAMklC,EADOld,EAAK,IAAI,KAAK,WAAW,GACT,WAAW,OAAOtI,GAASA,EAAM,KAAK,QAAQ,MAAM,EAC3EojB,EAAW9a,EACZ,MAAM,kBAAkB,EACxB,IAAIlc,GAAQo5B,EAAgB,KAAKxlB,GAASA,EAAM,KAAO5T,EAAK,EAAE,CAAC,EAC/D,OAAOA,GAAQA,CAAI,EAExBihB,GAAiB,YAAa9d,EAAO,CAAE,SAAU+Y,EAAK,QAAU,CAAA,EAAE,KAAKzJ,GAAS,CAE5E,GAAIwzB,GAAgB/pB,EAAMzJ,CAAK,EAAG,MAAO,GAGzCyJ,EAAK,SAAS,YAAa,CACvB,MAAOzJ,EACP,MAAO4zB,GAAanqB,EAAK,IAAI,KAAM8a,EAAU9iC,CAAQ,EACrD,kBAAmBsrB,GAAkB,IACzD,CAAiB,CACjB,CAAa,EAEDtD,EAAK,SAAS,WAAY,CAAE,SAAAhoB,CAAU,CAAA,EAEtCgoB,EAAK,SAAS,eAAgB,CAAE,SAAAhoB,CAAU,CAAA,CACtD,EAEQqwC,EAAO,YAAcrwC,GAAY,CAC7BgoB,EAAK,SAAS,iBAAkB,CAAE,SAAAhoB,CAAU,CAAA,CACxD,EAEQqwC,EAAO,OAASd,GAASvvC,GAAY,CACjCgoB,EAAK,SAAS,WAAY,CAAE,SAAAhoB,CAAU,CAAA,CAClD,CAAS,EAEDqwC,EAAO,UAAYrwC,GAAY,CAC3BgoB,EAAK,SAAS,eAAgB,CAAE,SAAAhoB,CAAU,CAAA,CACtD,EAEQgoB,EAAK,IAAI,OAASqoB,EAElBroB,EAAK,IAAI,KAAOA,EAAK,gBAAgBA,EAAK,gBAAgB0gB,EAAI,CAAC,CAClE,KAAU,CAAC4J,GAAWtqB,EAAK,IAAI,SAC5BA,EAAK,IAAI,OAAO,UAChBA,EAAK,IAAI,OAAS,KAClBA,EAAK,gBAAgBA,EAAK,IAAI,IAAI,EAE1C,EAKMwqB,GAAe,CAACxqB,EAAM5F,IAAU,CAClC,MAAMiwB,EAAYrqB,EAAK,MAAM,kBAAkB,EACzC8U,EAAa9U,EAAK,MAAM,cAAc,EACtCsqB,EAAUD,GAAa,CAACvV,EAC1BwV,GAAW,CAACtqB,EAAK,IAAI,QACrBA,EAAK,IAAI,QAAUA,EAAK,gBACpBA,EAAK,gBAAgB8f,GAAS,CAC1B,GAAG1lB,EACH,OAAQnT,GAAS,CACb8d,GAAiB,YAAa9d,EAAO,CACjC,SAAU+Y,EAAK,QACvC,CAAqB,EAAE,KAAKzJ,GAAS,CAEb,GAAIwzB,GAAgB/pB,EAAMzJ,CAAK,EAAG,MAAO,GAGzCyJ,EAAK,SAAS,YAAa,CACvB,MAAOzJ,EACP,MAAO,GACP,kBAAmB+M,GAAkB,MACjE,CAAyB,CACzB,CAAqB,CACJ,CACjB,CAAa,EACD,CACZ,EACe,CAACgnB,GAAWtqB,EAAK,IAAI,UAC5BA,EAAK,gBAAgBA,EAAK,IAAI,OAAO,EACrCA,EAAK,IAAI,QAAU,KAE3B,EAKMyqB,GAAczqB,GAAQ,CACxB,MAAMqqB,EAAYrqB,EAAK,MAAM,iBAAiB,EACxC8U,EAAa9U,EAAK,MAAM,cAAc,EACtCsqB,EAAUD,GAAa,CAACvV,EAC1BwV,GAAW,CAACtqB,EAAK,IAAI,QACrBA,EAAK,IAAI,OAASumB,KAClBvmB,EAAK,IAAI,OAAO,OAAS/Y,GAAS,CAC9B8d,GAAiB,YAAa9d,EAAO,CAAE,SAAU+Y,EAAK,QAAU,CAAA,EAAE,KAAKzJ,GAAS,CAE5E,GAAIwzB,GAAgB/pB,EAAMzJ,CAAK,EAAG,MAAO,GAGzCyJ,EAAK,SAAS,YAAa,CACvB,MAAOzJ,EACP,MAAO,GACP,kBAAmB+M,GAAkB,KACzD,CAAiB,CACjB,CAAa,CACb,GACe,CAACgnB,GAAWtqB,EAAK,IAAI,SAC5BA,EAAK,IAAI,OAAO,UAChBA,EAAK,IAAI,OAAS,KAE1B,EAKMkoB,GAAUpoB,GAAY,CACxB,qBAAsB,CAAC,CAAE,KAAAE,EAAM,MAAA5F,KAAY,CACvCowB,GAAaxqB,EAAM5F,CAAK,CAC3B,EACD,mBAAoB,CAAC,CAAE,KAAA4F,KAAW,CAC9BoqB,GAAWpqB,CAAI,CAClB,EACD,oBAAqB,CAAC,CAAE,KAAAA,KAAW,CAC/ByqB,GAAYzqB,CAAI,CACnB,EACD,iBAAkB,CAAC,CAAE,KAAAA,EAAM,MAAA5F,KAAY,CACnCgwB,GAAWpqB,CAAI,EACfyqB,GAAYzqB,CAAI,EAChBwqB,GAAaxqB,EAAM5F,CAAK,EACL4F,EAAK,MAAM,cAAc,EAExCA,EAAK,QAAQ,QAAQ,SAAW,WAGhCA,EAAK,QAAQ,gBAAgB,eAAe,CAEnD,CACL,CAAC,EAEKA,GAAOnD,GAAW,CACpB,KAAM,OACN,KAAM,CAAC,CAAE,KAAAmD,KAAW,CACZA,EAAK,IAAI,UACTA,EAAK,IAAI,cAAgBA,EAAK,IAAI,QAAQ,aAEjD,EACD,OAAQ4nB,GACR,MAAOK,GACP,QAAS,CAAC,CAAE,KAAAjoB,KAAW,CACfA,EAAK,IAAI,QACTA,EAAK,IAAI,OAAO,UAEhBA,EAAK,IAAI,QACTA,EAAK,IAAI,OAAO,UAEpBA,EAAK,QAAQ,oBAAoB,YAAa2nB,EAAO,EACrD3nB,EAAK,QAAQ,oBAAoB,eAAgB2nB,EAAO,CAC3D,EACD,OAAQ,CACJ,OAAQ,CAAC,QAAQ,CACpB,CACL,CAAC,EAGK+C,GAAY,CAACC,EAAiB,KAAO,CAEvC,IAAIC,EAAkB,KAGtB,MAAMnlB,EAAiBC,KAGjBlI,EAAQzH,GAEViN,GAAmByC,CAAc,EAGjC,CAACxP,GAASoN,GAAoBoC,CAAc,CAAC,EAG7C,CAACvP,GAASkN,GAAoBqC,CAAc,CAAC,CACrD,EAGIjI,EAAM,SAAS,cAAe,CAAE,QAASmtB,CAAgB,CAAA,EAGzD,MAAME,EAAoB,IAAM,CACxB,SAAS,QACbrtB,EAAM,SAAS,MAAM,CAC7B,EACI,SAAS,iBAAiB,mBAAoBqtB,CAAiB,EAG/D,IAAIC,EAAkB,KAClBC,EAAa,GACbC,EAAyB,GACzBC,EAAqB,KACrBC,EAAqB,KACzB,MAAMC,EAAgB,IAAM,CACnBJ,IACDA,EAAa,IAEjB,aAAaD,CAAe,EAC5BA,EAAkB,WAAW,IAAM,CAC/BC,EAAa,GACbE,EAAqB,KACrBC,EAAqB,KACjBF,IACAA,EAAyB,GACzBxtB,EAAM,SAAS,iBAAiB,EAEvC,EAAE,GAAG,CACd,EACI,OAAO,iBAAiB,SAAU2tB,CAAa,EAG/C,MAAMtzB,EAAOmI,GAAKxC,EAAO,CAAE,GAAI+F,GAAa,CAAA,CAAE,EAK9C,IAAI7F,EAAY,GACZ0tB,EAAW,GAEf,MAAMC,EAAe,CAOjB,MAAO,IAAM,CAGLN,IACAG,EAAqB,OAAO,WACvBD,IACDA,EAAqBC,GAGrB,CAACF,GAA0BE,IAAuBD,IAClDztB,EAAM,SAAS,kBAAkB,EACjCwtB,EAAyB,KAI7BI,GAAY1tB,IAEZA,EAAY7F,EAAK,QAAQ,eAAiB,MAI1C,CAAA6F,IAGJ7F,EAAK,MAAK,EAGVuzB,EAAWvzB,EAAK,KAAK,QAAQ,OAChC,EAMD,OAAQ0B,GAAM,CAEV,MAAMrD,GAAUsH,EACX,mBAAoB,EAGpB,OAAOxc,IAAU,CAAC,QAAQ,KAAKA,GAAO,IAAI,CAAC,EAG5C0c,GAAa,CAACxH,GAAQ,SAG1Bo1B,GAAqBp1B,EAAO,EAG5BwH,EAAY7F,EAAK,OAAO0B,EAAIrD,GAAS80B,CAAsB,EAG3D5mB,GAAoB5G,EAAM,MAAM,WAAW,CAAC,EAGxCE,GACAF,EAAM,qBAAoB,EAEjC,CACT,EAKU+tB,EAAchlC,GAAQnO,IAAQ,CAEhC,MAAMI,GAAQ,CACV,KAAM+N,CAClB,EAGQ,GAAI,CAACnO,GACD,OAAOI,GAiBX,GAbIJ,GAAK,eAAe,OAAO,IAC3BI,GAAM,MAAQJ,GAAK,MAAQ,CAAE,GAAGA,GAAK,KAAO,EAAG,MAG/CA,GAAK,SACLI,GAAM,OAAS,CAAE,GAAGJ,GAAK,MAAM,GAG/BA,GAAK,OACLI,GAAM,OAASJ,GAAK,MAIpBA,GAAK,OACLI,GAAM,KAAOJ,GAAK,eACXA,GAAK,MAAQA,GAAK,GAAI,CAC7B,MAAM0L,GAAO1L,GAAK,KAAOA,GAAK,KAAOolB,EAAM,MAAM,WAAYplB,GAAK,EAAE,EACpEI,GAAM,KAAOsL,GAAOqgB,GAAcrgB,EAAI,EAAI,IAC7C,CAGD,OAAI1L,GAAK,QACLI,GAAM,MAAQJ,GAAK,MAAM,IAAI+rB,EAAa,GAI1C,WAAW,KAAK5d,CAAI,IACpB/N,GAAM,SAAWJ,GAAK,UAItBA,GAAK,eAAe,QAAQ,GAAKA,GAAK,eAAe,QAAQ,IAC7DI,GAAM,OAASJ,GAAK,OACpBI,GAAM,OAASJ,GAAK,QAGjBI,EACf,EAEUgzC,GAAc,CAChB,YAAaD,EAAY,SAAS,EAElC,SAAUA,EAAY,MAAM,EAE5B,oBAAqBA,EAAY,SAAS,EAE1C,cAAeA,EAAY,UAAU,EACrC,oBAAqBA,EAAY,cAAc,EAC/C,8BAA+BA,EAAY,iBAAiB,EAC5D,cAAeA,EAAY,SAAS,EAEpC,uBAAwB,CAACA,EAAY,OAAO,EAAGA,EAAY,SAAS,CAAC,EAErE,0BAA2B,CAACA,EAAY,OAAO,EAAGA,EAAY,SAAS,CAAC,EAExE,4BAA6B,CAACA,EAAY,OAAO,EAAGA,EAAY,YAAY,CAAC,EAE7E,mBAAoBA,EAAY,aAAa,EAE7C,0BAA2BA,EAAY,kBAAkB,EACzD,iCAAkCA,EAAY,qBAAqB,EACnE,0BAA2BA,EAAY,kBAAkB,EACzD,6BAA8BA,EAAY,aAAa,EACvD,iCAAkCA,EAAY,cAAc,EAC5D,2BAA4BA,EAAY,mBAAmB,EAE3D,gCAAiC,CAACA,EAAY,OAAO,EAAGA,EAAY,aAAa,CAAC,EAElF,gBAAiBA,EAAY,YAAY,EAEzC,iBAAkBA,EAAY,aAAa,EAE3C,kBAAmBA,EAAY,cAAc,EAE7C,kBAAmBA,EAAY,cAAc,CACrD,EAEUE,GAAcjzC,GAAS,CAEzB,MAAMkzC,GAAS,CAAE,KAAMz2C,GAAS,GAAGuD,CAAK,EACxC,OAAOkzC,GAAO,KACd7zB,EAAK,QAAQ,cACT,IAAI,YAAY,YAAYrf,EAAM,OAAQ,CAEtC,OAAAkzC,GAGA,QAAS,GACT,WAAY,GACZ,SAAU,EAC1B,CAAa,CACb,EAGQ,MAAMne,GAAS,CAAA,EAGX/0B,EAAM,eAAe,OAAO,GAC5B+0B,GAAO,KAAK/0B,EAAM,KAAK,EAIvBA,EAAM,eAAe,MAAM,GAC3B+0B,GAAO,KAAK/0B,EAAM,IAAI,EAI1B,MAAMmzC,GAAW,CAAC,OAAQ,QAAS,MAAM,EACzC,OAAO,KAAKnzC,CAAK,EACZ,OAAOrD,IAAO,CAACw2C,GAAS,SAASx2C,EAAG,CAAC,EACrC,QAAQA,IAAOo4B,GAAO,KAAK/0B,EAAMrD,GAAI,CAAC,EAG3CF,GAAQ,KAAKuD,EAAM,KAAM,GAAG+0B,EAAM,EAGlC,MAAM0C,GAAUzS,EAAM,MAAM,SAAShlB,EAAM,KAAK,eAAe,EAC3Dy3B,IACAA,GAAQ,GAAG1C,EAAM,CAE7B,EAEU+d,GAAuBp1B,GAAW,CAChC,CAACA,EAAQ,QACbA,EACK,OAAOlV,IAAUwqC,GAAYxqC,GAAO,KAAK,EACzC,QAAQA,IAAU,CACf,MAAM+e,GAASyrB,GAAYxqC,GAAO,OACjC,MAAM,QAAQ+e,EAAM,EAAIA,GAAS,CAACA,EAAM,GAAG,QAAQ4Y,IAAS,CAErD33B,GAAO,OAAS,gBAChByqC,GAAY9S,GAAM33B,GAAO,IAAI,CAAC,EAE9B,WAAW,IAAM,CACbyqC,GAAY9S,GAAM33B,GAAO,IAAI,CAAC,CACjC,EAAE,CAAC,CAE5B,CAAiB,CACjB,CAAa,CACb,EAKU2kB,GAAahuB,GAAW6lB,EAAM,SAAS,cAAe,CAAE,QAAA7lB,CAAO,CAAE,EAEjEu3B,GAAUtY,GAAS4G,EAAM,MAAM,kBAAmB5G,CAAK,EAEvDg1B,GAAch1B,GAChB,IAAI,QAAQ,CAACqO,GAASC,KAAW,CAC7B1H,EAAM,SAAS,uBAAwB,CACnC,MAAA5G,EACA,QAAS9S,IAAQ,CACbmhB,GAAQnhB,EAAI,CACf,EACD,QAASkM,IAAS,CACdkV,GAAOlV,EAAK,CACf,CACjB,CAAa,CACb,CAAS,EAEC67B,EAAU,CAACriB,EAAQ7xB,GAAU,CAAE,IACjC,IAAI,QAAQ,CAACstB,GAASC,KAAW,CAC7B4mB,GAAS,CAAC,CAAE,OAAAtiB,EAAQ,QAAA7xB,EAAO,CAAE,EAAG,CAAE,MAAOA,GAAQ,MAAO,EACnD,KAAKsP,IAASge,GAAQhe,IAASA,GAAM,EAAE,CAAC,EACxC,MAAMie,EAAM,CAC7B,CAAS,EAEC6mB,GAAiB32C,GAAOA,EAAI,MAAQA,EAAI,GAExC42C,GAAa,CAACp1B,EAAOjf,MAEnB,OAAOif,GAAU,UAAY,CAACm1B,GAAen1B,CAAK,GAAK,CAACjf,KACxDA,GAAUif,EACVA,EAAQ,QAIZ4G,EAAM,SAAS,cAAe,CAAE,GAAG7lB,GAAS,MAAAif,CAAK,CAAE,EAG5C4G,EAAM,MAAM,kBAAmB5G,CAAK,IAAM,MAG/Ck1B,GAAW,IAAIj1B,IACjB,IAAI,QAAQ,CAACoO,GAASC,KAAW,CAC7B,MAAM+mB,GAAU,CAAA,EACVt0C,GAAU,CAAA,EAGhB,GAAI2oB,GAAQzJ,EAAK,EAAE,EACfo1B,GAAQ,KAAK,MAAMA,GAASp1B,EAAK,EAAE,EACnC,OAAO,OAAOlf,GAASkf,EAAK,IAAM,CAAA,CAAE,MACjC,CAEH,MAAMq1B,GAAer1B,EAAKA,EAAK,OAAS,GACpC,OAAOq1B,IAAiB,UAAY,EAAEA,cAAwB,OAC9D,OAAO,OAAOv0C,GAASkf,EAAK,IAAK,CAAA,EAIrCo1B,GAAQ,KAAK,GAAGp1B,CAAI,CACvB,CAED2G,EAAM,SAAS,YAAa,CACxB,MAAOyuB,GACP,MAAOt0C,GAAQ,MACf,kBAAmB2rB,GAAkB,IACrC,QAAS2B,GACT,QAASC,EACzB,CAAa,CACb,CAAS,EAECkd,GAAW,IAAM5kB,EAAM,MAAM,kBAAkB,EAE/C2uB,GAAcv1B,GAChB,IAAI,QAAQ,CAACqO,GAASC,KAAW,CAC7B1H,EAAM,SAAS,0BAA2B,CACtC,MAAA5G,EACA,QAAS9S,IAAQ,CACbmhB,GAAQnhB,EAAI,CACf,EACD,QAASkM,IAAS,CACdkV,GAAOlV,EAAK,CACf,CACjB,CAAa,CACb,CAAS,EAECo8B,GAAe,IAAIv1B,IAAS,CAC9B,MAAMZ,GAAU,MAAM,QAAQY,EAAK,EAAE,EAAIA,EAAK,GAAKA,EAC7C5P,GAAQgP,GAAQ,OAASA,GAAUmsB,GAAQ,EACjD,OAAO,QAAQ,IAAIn7B,GAAM,IAAI2kC,EAAW,CAAC,CACjD,EAEUS,GAAe,IAAIx1B,IAAS,CAC9B,MAAMZ,GAAU,MAAM,QAAQY,EAAK,EAAE,EAAIA,EAAK,GAAKA,EACnD,GAAI,CAACZ,GAAQ,OAAQ,CACjB,MAAMvK,GAAQ02B,GAAQ,EAAG,OACrBt+B,IACI,EAAEA,GAAK,SAAWugB,GAAW,MAAQvgB,GAAK,SAAWwgB,GAAW,QAChExgB,GAAK,SAAWugB,GAAW,YAC3BvgB,GAAK,SAAWugB,GAAW,qBAC3BvgB,GAAK,SAAWugB,GAAW,uBAC/C,EACY,OAAO,QAAQ,IAAI3Y,GAAM,IAAIygC,EAAW,CAAC,CAC5C,CACD,OAAO,QAAQ,IAAIl2B,GAAQ,IAAIk2B,EAAW,CAAC,CACnD,EAEUG,GAAc,IAAIz1B,IAAS,CAC7B,MAAMZ,GAAU,MAAM,QAAQY,EAAK,EAAE,EAAIA,EAAK,GAAKA,EAEnD,IAAIlf,GACA,OAAOse,GAAQA,GAAQ,OAAS,IAAO,SACvCte,GAAUse,GAAQ,MACX,MAAM,QAAQY,EAAK,EAAE,IAC5Blf,GAAUkf,EAAK,IAGnB,MAAMnL,GAAQ02B,KAEd,OAAKnsB,GAAQ,OAGSA,GACjB,IAAIW,IAAUiC,GAASjC,EAAK,EAAKlL,GAAMkL,IAASlL,GAAMkL,IAAO,GAAK,KAAQA,EAAM,EAChF,OAAOA,IAASA,EAAK,EAEL,IAAI21B,IAAKP,GAAWO,GAAG50C,EAAO,CAAC,EAPxB,QAAQ,IAAI+T,GAAM,IAAIoC,IAAQk+B,GAAWl+B,GAAMnW,EAAO,CAAC,CAAC,CAQ5F,EAEU1C,GAAU,CAEZ,GAAG2uB,GAAI,EAGP,GAAGynB,EAGH,GAAGloB,GAAgB3F,EAAOiI,CAAc,EAMxC,WAAAE,GAOA,QAAAkmB,EAOA,SAAAC,GAMA,QAAA5c,GAMA,YAAAid,GAMA,YAAAP,GAMA,WAAAI,GAKA,SAAU,CAACp1B,EAAO3gB,KAAUunB,EAAM,SAAS,YAAa,CAAE,MAAA5G,EAAO,MAAA3gB,GAAO,EAKxE,SAAAmsC,GAKA,aAAAiK,GAKA,YAAAC,GAKA,aAAAF,GAKA,KAAMtb,GAAWtT,EAAM,SAAS,OAAQ,CAAE,QAAAsT,EAAS,EAKnD,OAAQ,IAAM,CAEV,IAAIpqB,EAAQmR,EAAK,QAAQ,cAAc,kBAAkB,EACrDnR,GACAA,EAAM,MAAK,CAElB,EAKD,QAAS,IAAM,CAEXzR,GAAQ,KAAK,UAAW4iB,EAAK,OAAO,EAIpC2F,EAAM,SAAS,WAAW,EAG1B3F,EAAK,SAAQ,EAGb,OAAO,oBAAoB,SAAUszB,CAAa,EAGlD,SAAS,oBAAoB,mBAAoBN,CAAiB,EAGlErtB,EAAM,SAAS,aAAa,CAC/B,EAKD,aAAcvmB,GAAWipB,GAAarI,EAAK,QAAS5gB,CAAO,EAK3D,YAAaA,GAAWopB,GAAYxI,EAAK,QAAS5gB,CAAO,EAKzD,SAAUA,GAAWA,EAAQ,YAAY4gB,EAAK,OAAO,EAKrD,eAAgB5gB,GAAW,CAEvBipB,GAAarI,EAAK,QAAS5gB,CAAO,EAGlCA,EAAQ,WAAW,YAAYA,CAAO,EAGtC2zC,EAAkB3zC,CACrB,EAKD,eAAgB,IAAM,CACd,CAAC2zC,IAKLvqB,GAAYuqB,EAAiB/yB,EAAK,OAAO,EAGzCA,EAAK,QAAQ,WAAW,YAAYA,EAAK,OAAO,EAGhD+yB,EAAkB,KACrB,EAMD,aAAc3zC,GAAW4gB,EAAK,UAAY5gB,GAAW2zC,IAAoB3zC,EAKzE,QAAS,CACL,IAAK,IAAM4gB,EAAK,OACnB,EAKD,OAAQ,CACJ,IAAK,IAAM2F,EAAM,MAAM,YAAY,CACtC,CACT,EAGI,OAAAA,EAAM,SAAS,UAAU,EAGlBtG,GAAajiB,EAAO,CAC/B,EAEMu3C,GAAkB,CAACC,EAAgB,KAAO,CAE5C,MAAMhnB,EAAiB,CAAA,EACvB,OAAAxO,GAAMyO,GAAU,EAAI,CAACvwB,EAAKgB,IAAU,CAChCsvB,EAAetwB,GAAOgB,EAAM,EACpC,CAAK,EAGWu0C,GAAU,CAElB,GAAGjlB,EAGH,GAAGgnB,CACX,CAAK,CAIL,EAEMC,GAAuBnrB,GAAUA,EAAO,OAAO,CAAC,EAAE,YAAW,EAAKA,EAAO,MAAM,CAAC,EAEhForB,GAA8BC,GAAiBtF,GAASsF,EAAc,QAAQ,SAAU,EAAE,CAAC,EAE3FC,GAAY,CAACC,EAAQC,IAAgB,CAEvC91B,GAAM81B,EAAa,CAACC,EAAUC,IAAY,CACtCh2B,GAAM61B,EAAQ,CAACh1C,EAAU3B,IAAU,CAE/B,MAAM+2C,EAAiB,IAAI,OAAOF,CAAQ,EAc1C,GARI,CAHYE,EAAe,KAAKp1C,CAAQ,IAQ5C,OAAOg1C,EAAOh1C,GAGVm1C,IAAY,IACZ,OAIJ,GAAIpsB,GAASosB,CAAO,EAAG,CACnBH,EAAOG,GAAW92C,EAClB,MACH,CAGD,MAAMoD,EAAQ0zC,EAAQ,MAClB/qB,GAAS+qB,CAAO,GAAK,CAACH,EAAOvzC,KAC7BuzC,EAAOvzC,GAAS,IAGpBuzC,EAAOvzC,GAAOmzC,GAAqB50C,EAAS,QAAQo1C,EAAgB,EAAE,CAAC,GAAK/2C,CACxF,CAAS,EAGG82C,EAAQ,SACRJ,GAAUC,EAAOG,EAAQ,OAAQA,EAAQ,OAAO,CAE5D,CAAK,CACL,EAEME,GAAwB,CAAC52C,EAAM62C,EAAmB,KAAO,CAE3D,MAAM51B,EAAa,CAAA,EACnBP,GAAM1gB,EAAK,WAAYN,GAAS,CAC5BuhB,EAAW,KAAKjhB,EAAK,WAAWN,EAAM,CAC9C,CAAK,EAED,MAAMo3C,EAAS71B,EACV,OAAO81B,GAAaA,EAAU,IAAI,EAClC,OAAO,CAACl4C,EAAKk4C,IAAc,CACxB,MAAMn3C,EAAQyX,GAAKrX,EAAM+2C,EAAU,IAAI,EAEvC,OAAAl4C,EAAIu3C,GAA4BW,EAAU,IAAI,GAC1Cn3C,IAAUm3C,EAAU,KAAO,GAAOn3C,EAC/Bf,CACV,EAAE,CAAE,CAAA,EAGT,OAAAy3C,GAAUQ,EAAQD,CAAgB,EAE3BC,CACX,EAEME,GAAqB,CAACt2C,EAASU,EAAU,KAAO,CAElD,MAAMy1C,EAAmB,CAErB,UAAW,YACX,aAAc,gBACd,YAAa,gBACb,oBAAqB,uBAGrB,UAAW,CACP,MAAO,SACP,QAAS,CACL,WAAY,CACR,MAAO,SACV,EACD,UAAW,CACP,MAAO,QACV,EACD,SAAU,CACN,MAAO,OACV,EACD,WAAY,CACR,MAAO,SACV,EACD,QAAS,CACL,MAAO,MACV,CACJ,CACJ,EAGD,SAAU,GACV,UAAW,EACnB,EAGI/nB,GAAa,8BAA+B+nB,CAAgB,EAG5D,MAAMI,EAAgB,CAClB,GAAG71C,CACX,EAEU81C,EAAmBN,GACrBl2C,EAAQ,WAAa,WAAaA,EAAQ,cAAc,kBAAkB,EAAIA,EAC9Em2C,CACR,EAGI,OAAO,KAAKK,CAAgB,EAAE,QAAQt4C,GAAO,CACrC+sB,GAASurB,EAAiBt4C,EAAI,GACzB+sB,GAASsrB,EAAcr4C,EAAI,IAC5Bq4C,EAAcr4C,GAAO,IAEzB,OAAO,OAAOq4C,EAAcr4C,GAAMs4C,EAAiBt4C,EAAI,GAEvDq4C,EAAcr4C,GAAOs4C,EAAiBt4C,EAElD,CAAK,EAIDq4C,EAAc,OAAS71C,EAAQ,OAAS,CAAE,GAAE,OACxC,MAAM,KAAKV,EAAQ,iBAAiB,wBAAwB,CAAC,EAAE,IAAIyP,IAAU,CACzE,OAAQA,EAAM,MACd,QAAS,CACL,KAAMA,EAAM,QAAQ,IACvB,CACb,EAAU,CACV,EAGI,MAAMgnC,EAAMlB,GAAgBgB,CAAa,EAGzC,OAAIv2C,EAAQ,OACR,MAAM,KAAKA,EAAQ,KAAK,EAAE,QAAQ6W,GAAQ,CACtC4/B,EAAI,QAAQ5/B,CAAI,CAC5B,CAAS,EAIL4/B,EAAI,eAAez2C,CAAO,EAGnBy2C,CACX,EAGMC,GAAc,IAAI92B,IACpBf,GAAOe,EAAK,EAAE,EAAI02B,GAAmB,GAAG12B,CAAI,EAAI21B,GAAgB,GAAG31B,CAAI,EAErE+2B,GAAkB,CAAC,OAAQ,QAAS,QAAQ,EAE5CC,GAAeH,GAAO,CACxB,MAAM32B,EAAM,CAAA,EAEZ,OAAAiN,GAA6B0pB,EAAK32B,EAAK62B,EAAe,EAE/C72B,CACX,EAOM+2B,GAAkB,CAACvsB,EAAQwsB,IAC7BxsB,EAAO,QAAQ,qBAAsB,CAACysB,EAAOz0C,IAAUw0C,EAAax0C,EAAM,EAExE00C,GAAelzB,GAAM,CACvB,MAAMmzB,EAAa,IAAI,KAAK,CAAC,IAAKnzB,EAAG,SAAQ,EAAI,KAAK,EAAG,CACrD,KAAM,wBACd,CAAK,EACKozB,EAAY,IAAI,gBAAgBD,CAAU,EAC1CE,EAAS,IAAI,OAAOD,CAAS,EAEnC,MAAO,CACH,SAAU,CAACr+B,EAAS3M,IAAO,CAAE,EAC7B,KAAM,CAAC2M,EAAS3M,EAAIkrC,IAAiB,CACjC,MAAMl2C,EAAKorB,KAEX6qB,EAAO,UAAY38C,GAAK,CAChBA,EAAE,KAAK,KAAO0G,GACdgL,EAAG1R,EAAE,KAAK,OAAO,CAErC,EAEY28C,EAAO,YACH,CACI,GAAAj2C,EACA,QAAA2X,CACH,EACDu+B,CAChB,CACS,EACD,UAAW,IAAM,CACbD,EAAO,UAAS,EAChB,IAAI,gBAAgBD,CAAS,CAChC,CACT,CACA,EAEMG,GAAYl1C,GACd,IAAI,QAAQ,CAAC6rB,EAASC,IAAW,CAC7B,MAAMnZ,EAAM,IAAI,MAChBA,EAAI,OAAS,IAAM,CACfkZ,EAAQlZ,CAAG,CACvB,EACQA,EAAI,QAAUta,GAAK,CACfyzB,EAAOzzB,CAAC,CACpB,EACQsa,EAAI,IAAM3S,CAClB,CAAK,EAECm1C,GAAa,CAACzgC,EAAMvH,IAAS,CAC/B,MAAMioC,EAAc1gC,EAAK,MAAM,EAAGA,EAAK,KAAMA,EAAK,IAAI,EACtD,OAAA0gC,EAAY,iBAAmB1gC,EAAK,iBACpC0gC,EAAY,KAAOjoC,EACZioC,CACX,EAEMC,GAAW3gC,GAAQygC,GAAWzgC,EAAMA,EAAK,IAAI,EAG7C4gC,GAAoB,CAAA,EAGpBC,GAAkBC,GAAU,CAE9B,GAAIF,GAAkB,SAASE,CAAM,EACjC,OAIJF,GAAkB,KAAKE,CAAM,EAG7B,MAAMC,EAAgBD,EAAO,CACzB,UAAAtpB,GACA,MAAO,CACH,KAAAT,EACA,MAAA5N,GACA,SAAA4J,GACA,OAAA2N,GACA,kBAAAyG,GACA,gBAAA6Y,GACA,yBAAArmB,GACA,4BAAA6G,GACA,oBAAAyT,GACA,gBAAAha,GACA,mBAAAP,GACA,YAAA1H,GACA,aAAAmuB,GACA,WAAApxB,GACA,cAAAsH,GACA,UAAAmqB,GACA,SAAAG,GACA,WAAAF,GACA,WAAArmB,GACA,iBAAAnD,GACA,KAAA7iB,GACA,gCAAA4jB,EACH,EACD,MAAO,CACH,iBAAAkP,EACH,CACT,CAAK,EAGDzP,GAAqBspB,EAAc,OAAO,CAC9C,EAGMC,GAAc,IAAM,OAAO,UAAU,SAAS,KAAK,OAAO,SAAS,IAAM,qBACzEC,GAAc,IAAM,YAAa,OACjCC,GAAe,IAAM,UAAW,KAAK,UACrCC,GAAqB,IAAM,QAAS,QAAU,oBAAqB,OAAO,IAC1EC,GAAgB,IAAM,oBAAqB,SAC3CC,GAAY,IAAM,gBAAiB,OACnCC,GAAiB,IAAM,aAAe,OAAO,KAAO,CAAE,GACtDC,GAAS,IAAM,eAAe,KAAK,OAAO,UAAU,SAAS,EAE7DC,IAAa,IAAM,CAErB,MAAMC,EAEFv3B,GAAW,GAEX,CAAC82B,GAAa,GAEdI,GAAe,GACfH,GAAa,GACbC,GAAc,GACdC,GAAoB,GACpBE,GAAW,IAEVC,GAAgB,GAAIC,GAAM,GAE/B,MAAO,IAAME,CACjB,KAKMx5C,GAAQ,CAEV,KAAM,CAAE,CACZ,EAGMwQ,GAAO,WAKPwU,GAAK,IAAM,CAAA,EACjB,IAAIy0B,GAAW,CAAA,EACXC,GAAa,CAAA,EACbC,GAAe,CAAA,EACfC,GAAc,CAAA,EACdC,GAAW70B,GACXkC,GAAUlC,GACV3d,GAAQ2d,GACR9G,GAAO8G,GACP80B,GAAiB90B,GACjB+0B,GAAe/0B,GACfg1B,GAAeh1B,GAGnB,GAAIu0B,KAAa,CAEblwB,GACI,IAAM,CACFrpB,GAAM,KAAK,QAAQ23C,GAAOA,EAAI,MAAK,CAAE,CACxC,EACDn0B,GAAM,CACFxjB,GAAM,KAAK,QAAQ23C,GAAOA,EAAI,OAAOn0B,CAAE,CAAC,CAC3C,CACT,EAGI,MAAM9C,EAAW,IAAM,CAEnB,SAAS,cACL,IAAI,YAAY,kBAAmB,CAC/B,OAAQ,CACJ,UAAA64B,GACA,OAAQM,GACR,QAAA3yB,GACA,MAAA7f,GACA,KAAA6W,GACA,eAAA47B,GACA,WAAYE,EACf,CACjB,CAAa,CACb,EAGQ,SAAS,oBAAoB,mBAAoBt5B,CAAQ,CACjE,EAEQ,SAAS,aAAe,UAExB,WAAW,IAAMA,IAAY,CAAC,EAE9B,SAAS,iBAAiB,mBAAoBA,CAAQ,EAI1D,MAAMu5B,EAAoB,IACtB/4B,GAAMyO,GAAU,EAAI,CAACvwB,EAAKgB,IAAU,CAChCw5C,GAAYx6C,GAAOgB,EAAM,EACrC,CAAS,EAELq5C,GAAW,CAAE,GAAGvpB,IAChBypB,GAAe,CAAE,GAAGprB,IACpBmrB,GAAa,CAAE,GAAGprB,IAElBsrB,GAAc,CAAA,EACdK,IAGAJ,GAAW,IAAI/4B,IAAS,CACpB,MAAM62B,EAAMC,GAAY,GAAG92B,CAAI,EAC/B,OAAA62B,EAAI,GAAG,UAAWzwB,EAAO,EACzBlnB,GAAM,KAAK,KAAK23C,CAAG,EACZG,GAAaH,CAAG,CAC/B,EAGIzwB,GAAUgzB,GAAQ,CAEd,MAAMC,EAAgBn6C,GAAM,KAAK,UAAU23C,GAAOA,EAAI,aAAauC,CAAI,CAAC,EACxE,OAAIC,GAAiB,GAELn6C,GAAM,KAAK,OAAOm6C,EAAe,CAAC,EAAE,GAG5C,eAAc,EAEX,IAGJ,EACf,EAGI9yC,GAAQmI,GAEiB,MAAM,KAAKA,EAAQ,iBAAiB,IAAIgB,IAAM,CAAC,EAGtC,OAC1B4pC,GAAW,CAACp6C,GAAM,KAAK,KAAK23C,GAAOA,EAAI,aAAayC,CAAO,CAAC,CACxE,EAGwB,IAAIF,GAAQL,GAASK,CAAI,CAAC,EAI9Ch8B,GAAOg8B,GAAQ,CACX,MAAMvC,EAAM33C,GAAM,KAAK,KAAK23C,GAAOA,EAAI,aAAauC,CAAI,CAAC,EACzD,OAAKvC,EAGEG,GAAaH,CAAG,EAFZ,IAGnB,EAGImC,GAAiB,IAAIO,IAAY,CAE7BA,EAAQ,QAAQzB,EAAe,EAG/BqB,GACR,EAEIF,GAAe,IAAM,CACjB,MAAMlqB,EAAO,CAAA,EACb,OAAA3O,GAAMyO,GAAU,EAAI,CAACvwB,EAAKgB,IAAU,CAChCyvB,EAAKzwB,GAAOgB,EAAM,EAC9B,CAAS,EACMyvB,CACf,EAEImqB,GAAenqB,IACP1D,GAAS0D,CAAI,IAEb7vB,GAAM,KAAK,QAAQ23C,GAAO,CACtBA,EAAI,WAAW9nB,CAAI,CACnC,CAAa,EAGDD,GAAWC,CAAI,GAIZkqB,GAAY,EAE3B,qZCzgTA;AAAA;AAAA;AAAA;AAAA,GAQA,MAAMlB,GAAS,CAAC,CAAE,UAAAtpB,EAAW,MAAAN,KAAY,CAErC,KAAM,CACF,KAAAH,EACA,SAAAhE,EACA,gBAAAitB,EACA,oBAAA/L,EACA,yBAAAta,EACA,mBAAAD,CACH,EAAGxC,EAEEqrB,EAA0B,CAACjoB,EAAUkoB,IAAa,CACpD,MAAMC,GAAiB,SAAS,KAAKnoB,CAAQ,GAAK,CAAA,GAAI,MAChDooB,GAAgBF,EAAS,MAAM,EAAG,EAAE,EAC1C,OAAOC,IAAkBC,EACjC,EAEUC,EAAkB,CAACC,EAAeC,IACpCD,EAAc,KAAKE,GAEX,MAAM,KAAKA,CAAY,EAChBP,EAAwBM,EAAeC,CAAY,EAIvDA,IAAiBD,CAC3B,EAECE,EAAc/sC,GAAQ,CAExB,IAAI9G,EAAO,GACX,GAAI6jB,EAAS/c,CAAI,EAAG,CAChB,MAAMkkB,EAAWR,EAAmB1jB,CAAI,EAClC2I,GAAYgb,EAAyBO,CAAQ,EAC/Cvb,KACAzP,EAAO+kC,EAAoBt1B,EAAS,EAEpD,MACYzP,EAAO8G,EAAK,KAGhB,OAAO9G,CACf,EAEU8zC,EAAe,CAAChtC,EAAMitC,EAAmBC,IAAiB,CAE5D,GAAID,EAAkB,SAAW,EAC7B,MAAO,GAIX,MAAM/zC,GAAO6zC,EAAY/sC,CAAI,EAG7B,OAAKktC,EAKE,IAAI,QAAQ,CAAC/rB,GAASC,KAAW,CACpC8rB,EAAaltC,EAAM9G,EAAI,EAClB,KAAKi0C,IAAgB,CACdR,EAAgBM,EAAmBE,EAAY,EAC/ChsB,KAEAC,IAExB,CAAiB,EACA,MAAMA,EAAM,CAC7B,CAAS,EAdUurB,EAAgBM,EAAmB/zC,EAAI,CAe1D,EAEUk0C,EAAmB5Y,GAAO6Y,GAC5B7Y,EAAI6Y,KAAsB,KAAO,GAAQ7Y,EAAI6Y,IAAqBA,EAGtE,OAAA7rB,EAAU,8BAA+BgT,GACrC,OAAO,OAAOA,EAAK,CACf,OAAQ,mBACpB,CAAS,CACT,EAGIhT,EAAU,oBAAqB,CAACxX,EAAM,CAAE,MAAA8I,CAAK,IAEpCA,EAAM,gCAAgC,EAKpCk6B,EAAahjC,EAAM8I,EAAM,yBAAyB,CAAC,EAJ/C,EAKd,EAKD0O,EACI,YACA,CAACxX,EAAM,CAAE,MAAA8I,CAAO,IACZ,IAAI,QAAQ,CAACqO,EAASC,KAAW,CAC7B,GAAI,CAACtO,EAAM,gCAAgC,EAAG,CAC1CqO,EAAQnX,CAAI,EACZ,MACH,CAED,MAAMijC,GAAoBn6B,EAAM,yBAAyB,EAGnDo6B,GAAep6B,EAAM,oCAAoC,EAGzDw6B,GAAmBN,EAAahjC,EAAMijC,GAAmBC,EAAY,EAErEK,GAAkB,IAAM,CAC1B,MAAMC,GAA0BP,GAC3B,IACGG,EACIt6B,EAAM,iDAAiD,CAC1D,CACJ,EACA,OAAOlZ,IAASA,KAAU,EAAK,EAE9B6zC,EAAgCD,GAAwB,OAC1D,CAACxtC,GAAM7N,KAAUq7C,GAAwB,QAAQxtC,EAAI,IAAM7N,EACnF,EAEoBivB,GAAO,CACH,OAAQ,CACJ,KAAMtO,EAAM,iCAAiC,EAC7C,IAAKk3B,EACDl3B,EAAM,6CAA6C,EACnD,CACI,SAAU26B,EAA8B,KAAK,IAAI,EACjD,eAAgBA,EACX,MAAM,EAAG,EAAE,EACX,KAAK,IAAI,EACd,SACIA,EACIA,EAA8B,OAAS,EAElD,CACJ,CACJ,CACzB,CAAqB,CACrB,EAGgB,GAAI,OAAOH,IAAqB,UAC5B,OAAKA,GAGEnsB,EAAQnX,CAAI,EAFRujC,GAAe,EAM9BD,GACK,KAAK,IAAM,CACRnsB,EAAQnX,CAAI,CACpC,CAAqB,EACA,MAAMujC,EAAe,CAC1C,CAAa,CACb,EAGW,CAEH,QAAS,CAEL,wBAAyB,CAAC,GAAMxsB,EAAK,OAAO,EAG5C,kBAAmB,CAAC,CAAA,EAAIA,EAAK,KAAK,EAOlC,wBAAyB,CAAC,0BAA2BA,EAAK,MAAM,EAGhE,mCAAoC,CAChC,yCACAA,EAAK,MACR,EAGD,sCAAuC,CAAC,CAAA,EAAIA,EAAK,MAAM,EAGvD,2BAA4B,CAAC,KAAMA,EAAK,QAAQ,CACnD,CACT,CACA,EAGM7M,GAAY,OAAO,OAAW,KAAe,OAAO,OAAO,SAAa,IAC1EA,IACA,SAAS,cAAc,IAAI,YAAY,wBAAyB,CAAE,OAAQ42B,EAAQ,CAAA,CAAC,EC9MvF;AAAA;AAAA;AAAA;AAAA,GAQA,MAAMA,GAAS,CAAC,CAAE,UAAAtpB,EAAW,MAAAN,KAAY,CAErC,KAAM,CAAE,KAAAH,EAAM,gBAAAipB,EAAiB,kBAAA7Y,CAAiB,EAAKjQ,EAGrD,OAAAM,EAAU,oBAAqB,CAACxX,EAAM,CAAE,MAAA8I,CAAK,IAAO,CAChD,GAAI,CAACA,EAAM,gCAAgC,EACvC,MAAO,GAGX,MAAM46B,EAAU56B,EAAM,mBAAmB,EACzC,GAAI46B,IAAY,MAAQ1jC,EAAK,KAAO0jC,EAChC,MAAO,GAGX,MAAMC,EAAU76B,EAAM,mBAAmB,EACzC,MAAI,EAAA66B,IAAY,MAAQ3jC,EAAK,KAAO2jC,EAK5C,CAAK,EAKDnsB,EACI,YACA,CAACxX,EAAM,CAAE,MAAA8I,CAAO,IACZ,IAAI,QAAQ,CAACqO,EAASC,IAAW,CAE7B,GAAI,CAACtO,EAAM,gCAAgC,EACvC,OAAOqO,EAAQnX,CAAI,EAIvB,MAAM4jC,EAAa96B,EAAM,+BAA+B,EACxD,GAAI86B,GAAc,CAACA,EAAW5jC,CAAI,EAC9B,OAAOmX,EAAQnX,CAAI,EAIvB,MAAM0jC,EAAU56B,EAAM,mBAAmB,EACzC,GAAI46B,IAAY,MAAQ1jC,EAAK,KAAO0jC,EAAS,CACzCtsB,EAAO,CACH,OAAQ,CACJ,KAAMtO,EAAM,kCAAkC,EAC9C,IAAKk3B,EAAgBl3B,EAAM,yBAAyB,EAAG,CACnD,SAAUqe,EACNuc,EACA,IACA56B,EAAM,oBAAoB,EAC1BA,EAAM,uBAAwBA,CAAK,CACtC,CACjC,CAA6B,CACJ,CACzB,CAAqB,EACD,MACH,CAGD,MAAM66B,EAAU76B,EAAM,mBAAmB,EACzC,GAAI66B,IAAY,MAAQ3jC,EAAK,KAAO2jC,EAAS,CACzCvsB,EAAO,CACH,OAAQ,CACJ,KAAMtO,EAAM,kCAAkC,EAC9C,IAAKk3B,EAAgBl3B,EAAM,yBAAyB,EAAG,CACnD,SAAUqe,EACNwc,EACA,IACA76B,EAAM,oBAAoB,EAC1BA,EAAM,uBAAwBA,CAAK,CACtC,CACjC,CAA6B,CACJ,CACzB,CAAqB,EACD,MACH,CAGD,MAAM+6B,EAAe/6B,EAAM,yBAAyB,EACpD,GAAI+6B,IAAiB,MAEQ/6B,EAAM,kBAAkB,EAAE,OAAO,CAAC3U,EAAO6B,IACvD7B,EAAQ6B,EAAK,SACrB,CAAC,EAGmB6tC,EAAc,CACjCzsB,EAAO,CACH,OAAQ,CACJ,KAAMtO,EAAM,wCAAwC,EACpD,IAAKk3B,EAAgBl3B,EAAM,+BAA+B,EAAG,CACzD,SAAUqe,EACN0c,EACA,IACA/6B,EAAM,oBAAoB,EAC1BA,EAAM,uBAAwBA,CAAK,CACtC,CACrC,CAAiC,CACJ,CAC7B,CAAyB,EACD,MACH,CAILqO,EAAQnX,CAAI,CAC5B,CAAa,CACb,EAEW,CACH,QAAS,CAEL,wBAAyB,CAAC,GAAM+W,EAAK,OAAO,EAG5C,YAAa,CAAC,KAAMA,EAAK,GAAG,EAG5B,YAAa,CAAC,KAAMA,EAAK,GAAG,EAG5B,iBAAkB,CAAC,KAAMA,EAAK,GAAG,EAGjC,uBAAwB,CAAC,KAAMA,EAAK,QAAQ,EAG5C,yBAA0B,CAAC,oBAAqBA,EAAK,MAAM,EAC3D,iBAAkB,CAAC,kCAAmCA,EAAK,MAAM,EAEjE,yBAA0B,CAAC,oBAAqBA,EAAK,MAAM,EAC3D,iBAAkB,CAAC,kCAAmCA,EAAK,MAAM,EAEjE,8BAA+B,CAAC,8BAA+BA,EAAK,MAAM,EAC1E,sBAAuB,CAAC,wCAAyCA,EAAK,MAAM,CAC/E,CACT,CACA,EAGM7M,GAAY,OAAO,OAAW,KAAe,OAAO,OAAO,SAAa,IAC1EA,IACA,SAAS,cAAc,IAAI,YAAY,wBAAyB,CAAE,OAAQ42B,EAAQ,CAAA,CAAC,ECrJvF,OAAO,QAAUh+C,GAGjB,OAAO,SAAWghD,GAGlBC,GAAwBC,EAA8B,EAGtDD,GAAwBE,EAA8B"}