tweak-ui 0.8.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.assetsignore +2 -0
- package/dist/lib/builder.d.ts +7 -5
- package/dist/lib/builder.d.ts.map +1 -1
- package/dist/lib/components/controls/angle.d.ts +3 -3
- package/dist/lib/components/controls/angle.d.ts.map +1 -1
- package/dist/lib/components/controls/bitmask.d.ts +3 -3
- package/dist/lib/components/controls/bitmask.d.ts.map +1 -1
- package/dist/lib/components/controls/bool.d.ts +3 -3
- package/dist/lib/components/controls/bool.d.ts.map +1 -1
- package/dist/lib/components/controls/color-picker.d.ts +3 -3
- package/dist/lib/components/controls/color-picker.d.ts.map +1 -1
- package/dist/lib/components/controls/color.d.ts +3 -3
- package/dist/lib/components/controls/color.d.ts.map +1 -1
- package/dist/lib/components/controls/input.d.ts +3 -3
- package/dist/lib/components/controls/input.d.ts.map +1 -1
- package/dist/lib/components/controls/matrix.d.ts +3 -3
- package/dist/lib/components/controls/matrix.d.ts.map +1 -1
- package/dist/lib/components/controls/point.d.ts +12 -7
- package/dist/lib/components/controls/point.d.ts.map +1 -1
- package/dist/lib/components/controls/poll.d.ts +3 -3
- package/dist/lib/components/controls/poll.d.ts.map +1 -1
- package/dist/lib/components/controls/scalar.d.ts +3 -3
- package/dist/lib/components/controls/scalar.d.ts.map +1 -1
- package/dist/lib/components/controls/select.d.ts +2 -2
- package/dist/lib/components/controls/select.d.ts.map +1 -1
- package/dist/lib/components/controls/spherical.d.ts +10 -5
- package/dist/lib/components/controls/spherical.d.ts.map +1 -1
- package/dist/lib/components/controls/string.d.ts +3 -3
- package/dist/lib/components/controls/string.d.ts.map +1 -1
- package/dist/lib/components/controls/vector.d.ts +3 -3
- package/dist/lib/components/controls/vector.d.ts.map +1 -1
- package/dist/lib/components/elements/widget.d.ts +4 -0
- package/dist/lib/components/elements/widget.d.ts.map +1 -1
- package/dist/lib/core/utils.d.ts +1 -0
- package/dist/lib/core/utils.d.ts.map +1 -1
- package/dist/style.css +1 -1
- package/dist/tweak-ui.module.js +514 -501
- package/dist/tweak-ui.module.js.map +1 -1
- package/dist/tweak-ui.umd.js +3 -3
- package/dist/tweak-ui.umd.js.map +1 -1
- package/dist/wrangler.json +1 -0
- package/package.json +13 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tweak-ui.module.js","names":[],"sources":["../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/vnode.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/hyperscriptVnode.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/util/hasOwn.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/emptyAttrs.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/cachedAttrsIsStaticMap.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/hyperscript.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/trust.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/fragment.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/hyperscript.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/delayedRemoval.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/domFor.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/render.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/api/mount-redraw.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/mount-redraw.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/querystring/build.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/pathname/build.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/request/request.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/request.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/util/decodeURIComponentSafe.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/querystring/parse.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/pathname/parse.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/pathname/compileTemplate.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/util/censor.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/api/router.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/route.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/index.js","../src/lib/components/container/bar.ts","../src/lib/components/container/grid.ts","../src/lib/core/utils.ts","../src/lib/components/container/group.ts","../src/lib/components/container/list.ts","../src/lib/components/container/section.ts","../src/lib/core/control.ts","../src/lib/core/render.ts","../src/lib/core/types.ts","../src/lib/mount.ts","../src/lib/components/container/split.ts","../src/lib/components/container/tabs.ts","../src/lib/components/container/tree.ts","../src/lib/components/container/dialog.ts","../src/lib/components/elements/button.ts","../src/lib/components/elements/divider.ts","../src/lib/stats/sampler.ts","../src/lib/stats/stats-renderer.ts","../src/lib/components/elements/graph.ts","../src/lib/components/elements/image.ts","../src/lib/components/elements/widget.ts","../src/lib/components/controls/scalar.ts","../src/lib/components/controls/angle.ts","../src/lib/components/controls/bool.ts","../src/lib/color/converter.ts","../src/lib/color/array-format.ts","../src/lib/color/css-string-format.ts","../src/lib/color/hex-string-format.ts","../src/lib/color/number-format.ts","../src/lib/color/object-format.ts","../src/lib/color/formatter.ts","../src/lib/components/controls/color-picker.ts","../src/lib/components/controls/color.ts","../src/lib/components/controls/input.ts","../src/lib/components/controls/matrix.ts","../src/lib/components/controls/point.ts","../src/lib/components/controls/select.ts","../src/lib/components/controls/spherical.ts","../src/lib/components/controls/string.ts","../src/lib/components/controls/vector.ts","../src/lib/components/controls/bitmask.ts","../src/lib/components/controls/poll.ts","../src/lib/builder.ts"],"sourcesContent":["\"use strict\"\n\nfunction Vnode(tag, key, attrs, children, text, dom) {\n\treturn {tag: tag, key: key, attrs: attrs, children: children, text: text, dom: dom, is: undefined, domSize: undefined, state: undefined, events: undefined, instance: undefined}\n}\nVnode.normalize = function(node) {\n\tif (Array.isArray(node)) return Vnode(\"[\", undefined, undefined, Vnode.normalizeChildren(node), undefined, undefined)\n\tif (node == null || typeof node === \"boolean\") return null\n\tif (typeof node === \"object\") return node\n\treturn Vnode(\"#\", undefined, undefined, String(node), undefined, undefined)\n}\nVnode.normalizeChildren = function(input) {\n\t// Preallocate the array length (initially holey) and fill every index immediately in order.\n\t// Benchmarking shows better performance on V8.\n\tvar children = new Array(input.length)\n\t// Count the number of keyed normalized vnodes for consistency check.\n\t// Note: this is a perf-sensitive check.\n\t// Fun fact: merging the loop like this is somehow faster than splitting\n\t// the check within updateNodes(), noticeably so.\n\tvar numKeyed = 0\n\tfor (var i = 0; i < input.length; i++) {\n\t\tchildren[i] = Vnode.normalize(input[i])\n\t\tif (children[i] !== null && children[i].key != null) numKeyed++\n\t}\n\tif (numKeyed !== 0 && numKeyed !== input.length) {\n\t\tthrow new TypeError(children.includes(null)\n\t\t\t? \"In fragments, vnodes must either all have keys or none have keys. You may wish to consider using an explicit keyed empty fragment, m.fragment({key: ...}), instead of a hole.\"\n\t\t\t: \"In fragments, vnodes must either all have keys or none have keys.\"\n\t\t)\n\t}\n\treturn children\n}\n\nmodule.exports = Vnode\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\n\n// Note: the processing of variadic parameters is perf-sensitive.\n//\n// In native ES6, it might be preferable to define hyperscript and fragment\n// factories with a final ...args parameter and call hyperscriptVnode(...args),\n// since modern engines can optimize spread calls.\n//\n// However, benchmarks showed this was not faster. As a result, spread is used\n// only in the parameter lists of hyperscript and fragment, while an array is\n// passed to hyperscriptVnode.\nmodule.exports = function(attrs, children) {\n\tif (attrs == null || typeof attrs === \"object\" && attrs.tag == null && !Array.isArray(attrs)) {\n\t\tif (children.length === 1 && Array.isArray(children[0])) children = children[0]\n\t} else {\n\t\tchildren = children.length === 0 && Array.isArray(attrs) ? attrs : [attrs, ...children]\n\t\tattrs = undefined\n\t}\n\n\treturn Vnode(\"\", attrs && attrs.key, attrs, children)\n}\n","// This exists so I'm only saving it once.\n\"use strict\"\n\nmodule.exports = {}.hasOwnProperty\n","\"use strict\"\n\n// This is an attrs object that is used by default when attrs is undefined or null.\nmodule.exports = {}\n","\"use strict\"\n\nvar emptyAttrs = require(\"./emptyAttrs\")\n\n// This Map manages the following:\n// - Whether an attrs is cached attrs generated by compileSelector().\n// - Whether the cached attrs is \"static\", i.e., does not contain any form attributes.\n// These information will be useful to skip updating attrs in render().\n//\n// Since the attrs used as keys in this map are not released from the selectorCache object,\n// there is no risk of memory leaks. Therefore, Map is used here instead of WeakMap.\nmodule.exports = new Map([[emptyAttrs, true]])\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\nvar hyperscriptVnode = require(\"./hyperscriptVnode\")\nvar hasOwn = require(\"../util/hasOwn\")\nvar emptyAttrs = require(\"./emptyAttrs\")\nvar cachedAttrsIsStaticMap = require(\"./cachedAttrsIsStaticMap\")\n\nvar selectorParser = /(?:(^|#|\\.)([^#\\.\\[\\]]+))|(\\[(.+?)(?:\\s*=\\s*(\"|'|)((?:\\\\[\"'\\]]|.)*?)\\5)?\\])/g\nvar selectorCache = Object.create(null)\n\nfunction isEmpty(object) {\n\tfor (var key in object) if (hasOwn.call(object, key)) return false\n\treturn true\n}\n\nfunction isFormAttributeKey(key) {\n\treturn key === \"value\" || key === \"checked\" || key === \"selectedIndex\" || key === \"selected\"\n}\n\nfunction compileSelector(selector) {\n\tvar match, tag = \"div\", classes = [], attrs = {}, isStatic = true\n\twhile (match = selectorParser.exec(selector)) {\n\t\tvar type = match[1], value = match[2]\n\t\tif (type === \"\" && value !== \"\") tag = value\n\t\telse if (type === \"#\") attrs.id = value\n\t\telse if (type === \".\") classes.push(value)\n\t\telse if (match[3][0] === \"[\") {\n\t\t\tvar attrValue = match[6]\n\t\t\tif (attrValue) attrValue = attrValue.replace(/\\\\([\"'])/g, \"$1\").replace(/\\\\\\\\/g, \"\\\\\")\n\t\t\tif (match[4] === \"class\") classes.push(attrValue)\n\t\t\telse {\n\t\t\t\tattrs[match[4]] = attrValue === \"\" ? attrValue : attrValue || true\n\t\t\t\tif (isFormAttributeKey(match[4])) isStatic = false\n\t\t\t}\n\t\t}\n\t}\n\tif (classes.length > 0) attrs.className = classes.join(\" \")\n\tif (isEmpty(attrs)) attrs = emptyAttrs\n\telse cachedAttrsIsStaticMap.set(attrs, isStatic)\n\treturn selectorCache[selector] = {tag: tag, attrs: attrs, is: attrs.is}\n}\n\nfunction execSelector(state, vnode) {\n\tvnode.tag = state.tag\n\n\tvar attrs = vnode.attrs\n\tif (attrs == null) {\n\t\tvnode.attrs = state.attrs\n\t\tvnode.is = state.is\n\t\treturn vnode\n\t}\n\n\tif (hasOwn.call(attrs, \"class\")) {\n\t\tif (attrs.class != null) attrs.className = attrs.class\n\t\tattrs.class = null\n\t}\n\n\tif (state.attrs !== emptyAttrs) {\n\t\tvar className = attrs.className\n\t\tattrs = Object.assign({}, state.attrs, attrs)\n\n\t\tif (state.attrs.className != null) attrs.className =\n\t\t\tclassName != null\n\t\t\t\t? String(state.attrs.className) + \" \" + String(className)\n\t\t\t\t: state.attrs.className\n\t}\n\n\t// workaround for #2622 (reorder keys in attrs to set \"type\" first)\n\t// The DOM does things to inputs based on the \"type\", so it needs set first.\n\t// See: https://github.com/MithrilJS/mithril.js/issues/2622\n\tif (state.tag === \"input\" && hasOwn.call(attrs, \"type\")) {\n\t\tattrs = Object.assign({type: attrs.type}, attrs)\n\t}\n\n\t// This reduces the complexity of the evaluation of \"is\" within the render function.\n\tvnode.is = attrs.is\n\n\tvnode.attrs = attrs\n\n\treturn vnode\n}\n\nfunction hyperscript(selector, attrs, ...children) {\n\tif (selector == null || typeof selector !== \"string\" && typeof selector !== \"function\" && typeof selector.view !== \"function\") {\n\t\tthrow Error(\"The selector must be either a string or a component.\");\n\t}\n\n\tvar vnode = hyperscriptVnode(attrs, children)\n\n\tif (typeof selector === \"string\") {\n\t\tvnode.children = Vnode.normalizeChildren(vnode.children)\n\t\tif (selector !== \"[\") return execSelector(selectorCache[selector] || compileSelector(selector), vnode)\n\t}\n\n\tif (vnode.attrs == null) vnode.attrs = {}\n\tvnode.tag = selector\n\treturn vnode\n}\n\nmodule.exports = hyperscript\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\n\nmodule.exports = function(html) {\n\tif (html == null) html = \"\"\n\treturn Vnode(\"<\", undefined, undefined, html, undefined, undefined)\n}\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\nvar hyperscriptVnode = require(\"./hyperscriptVnode\")\n\nmodule.exports = function(attrs, ...children) {\n\tvar vnode = hyperscriptVnode(attrs, children)\n\n\tif (vnode.attrs == null) vnode.attrs = {}\n\tvnode.tag = \"[\"\n\tvnode.children = Vnode.normalizeChildren(vnode.children)\n\treturn vnode\n}\n","\"use strict\"\n\nvar hyperscript = require(\"./render/hyperscript\")\n\nhyperscript.trust = require(\"./render/trust\")\nhyperscript.fragment = require(\"./render/fragment\")\n\nmodule.exports = hyperscript\n","\"use strict\"\n\nmodule.exports = new WeakMap\n","\"use strict\"\n\nvar delayedRemoval = require(\"./delayedRemoval\")\n\nfunction *domFor(vnode) {\n\t// To avoid unintended mangling of the internal bundler,\n\t// parameter destructuring is not used here.\n\tvar dom = vnode.dom\n\tvar domSize = vnode.domSize\n\tvar generation = delayedRemoval.get(dom)\n\tif (dom != null) do {\n\t\tvar nextSibling = dom.nextSibling\n\n\t\tif (delayedRemoval.get(dom) === generation) {\n\t\t\tyield dom\n\t\t\tdomSize--\n\t\t}\n\n\t\tdom = nextSibling\n\t}\n\twhile (domSize)\n}\n\nmodule.exports = domFor\n","\"use strict\"\n\nvar Vnode = require(\"./vnode\")\nvar delayedRemoval = require(\"./delayedRemoval\")\nvar domFor = require(\"./domFor\")\nvar cachedAttrsIsStaticMap = require(\"./cachedAttrsIsStaticMap\")\n\nmodule.exports = function() {\n\tvar nameSpace = {\n\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\tmath: \"http://www.w3.org/1998/Math/MathML\"\n\t}\n\n\tvar currentRedraw\n\tvar currentRender\n\n\tfunction getDocument(dom) {\n\t\treturn dom.ownerDocument;\n\t}\n\n\tfunction getNameSpace(vnode) {\n\t\treturn vnode.attrs && vnode.attrs.xmlns || nameSpace[vnode.tag]\n\t}\n\n\t//sanity check to discourage people from doing `vnode.state = ...`\n\tfunction checkState(vnode, original) {\n\t\tif (vnode.state !== original) throw new Error(\"'vnode.state' must not be modified.\")\n\t}\n\n\t//Note: the hook is passed as the `this` argument to allow proxying the\n\t//arguments without requiring a full array allocation to do so. It also\n\t//takes advantage of the fact the current `vnode` is the first argument in\n\t//all lifecycle methods.\n\tfunction callHook(vnode) {\n\t\tvar original = vnode.state\n\t\ttry {\n\t\t\treturn this.apply(original, arguments)\n\t\t} finally {\n\t\t\tcheckState(vnode, original)\n\t\t}\n\t}\n\n\t// IE11 (at least) throws an UnspecifiedError when accessing document.activeElement when\n\t// inside an iframe. Catch and swallow this error, and heavy-handidly return null.\n\tfunction activeElement(dom) {\n\t\ttry {\n\t\t\treturn getDocument(dom).activeElement\n\t\t} catch (e) {\n\t\t\treturn null\n\t\t}\n\t}\n\t//create\n\tfunction createNodes(parent, vnodes, start, end, hooks, nextSibling, ns) {\n\t\tfor (var i = start; i < end; i++) {\n\t\t\tvar vnode = vnodes[i]\n\t\t\tif (vnode != null) {\n\t\t\t\tcreateNode(parent, vnode, hooks, ns, nextSibling)\n\t\t\t}\n\t\t}\n\t}\n\tfunction createNode(parent, vnode, hooks, ns, nextSibling) {\n\t\tvar tag = vnode.tag\n\t\tif (typeof tag === \"string\") {\n\t\t\tvnode.state = {}\n\t\t\tif (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks)\n\t\t\tswitch (tag) {\n\t\t\t\tcase \"#\": createText(parent, vnode, nextSibling); break\n\t\t\t\tcase \"<\": createHTML(parent, vnode, ns, nextSibling); break\n\t\t\t\tcase \"[\": createFragment(parent, vnode, hooks, ns, nextSibling); break\n\t\t\t\tdefault: createElement(parent, vnode, hooks, ns, nextSibling)\n\t\t\t}\n\t\t}\n\t\telse createComponent(parent, vnode, hooks, ns, nextSibling)\n\t}\n\tfunction createText(parent, vnode, nextSibling) {\n\t\tvnode.dom = getDocument(parent).createTextNode(vnode.children)\n\t\tinsertDOM(parent, vnode.dom, nextSibling)\n\t}\n\tvar possibleParents = {caption: \"table\", thead: \"table\", tbody: \"table\", tfoot: \"table\", tr: \"tbody\", th: \"tr\", td: \"tr\", colgroup: \"table\", col: \"colgroup\"}\n\tfunction createHTML(parent, vnode, ns, nextSibling) {\n\t\tvar match = vnode.children.match(/^\\s*?<(\\w+)/im) || []\n\t\t// not using the proper parent makes the child element(s) vanish.\n\t\t// var div = document.createElement(\"div\")\n\t\t// div.innerHTML = \"<td>i</td><td>j</td>\"\n\t\t// console.log(div.innerHTML)\n\t\t// --> \"ij\", no <td> in sight.\n\t\tvar temp = getDocument(parent).createElement(possibleParents[match[1]] || \"div\")\n\t\tif (ns === \"http://www.w3.org/2000/svg\") {\n\t\t\ttemp.innerHTML = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\">\" + vnode.children + \"</svg>\"\n\t\t\ttemp = temp.firstChild\n\t\t} else {\n\t\t\ttemp.innerHTML = vnode.children\n\t\t}\n\t\tvnode.dom = temp.firstChild\n\t\tvnode.domSize = temp.childNodes.length\n\t\tvar fragment = getDocument(parent).createDocumentFragment()\n\t\tvar child\n\t\twhile (child = temp.firstChild) {\n\t\t\tfragment.appendChild(child)\n\t\t}\n\t\tinsertDOM(parent, fragment, nextSibling)\n\t}\n\tfunction createFragment(parent, vnode, hooks, ns, nextSibling) {\n\t\tvar fragment = getDocument(parent).createDocumentFragment()\n\t\tif (vnode.children != null) {\n\t\t\tvar children = vnode.children\n\t\t\tcreateNodes(fragment, children, 0, children.length, hooks, null, ns)\n\t\t}\n\t\tvnode.dom = fragment.firstChild\n\t\tvnode.domSize = fragment.childNodes.length\n\t\tinsertDOM(parent, fragment, nextSibling)\n\t}\n\tfunction createElement(parent, vnode, hooks, ns, nextSibling) {\n\t\tvar tag = vnode.tag\n\t\tvar attrs = vnode.attrs\n\t\tvar is = vnode.is\n\n\t\tns = getNameSpace(vnode) || ns\n\n\t\tvar element = ns ?\n\t\t\tis ? getDocument(parent).createElementNS(ns, tag, {is: is}) : getDocument(parent).createElementNS(ns, tag) :\n\t\t\tis ? getDocument(parent).createElement(tag, {is: is}) : getDocument(parent).createElement(tag)\n\t\tvnode.dom = element\n\n\t\tif (attrs != null) {\n\t\t\tsetAttrs(vnode, attrs, ns)\n\t\t}\n\n\t\tinsertDOM(parent, element, nextSibling)\n\n\t\tif (!maybeSetContentEditable(vnode)) {\n\t\t\tif (vnode.children != null) {\n\t\t\t\tvar children = vnode.children\n\t\t\t\tcreateNodes(element, children, 0, children.length, hooks, null, ns)\n\t\t\t\tif (vnode.tag === \"select\" && attrs != null) setLateSelectAttrs(vnode, attrs)\n\t\t\t}\n\t\t}\n\t}\n\tfunction initComponent(vnode, hooks) {\n\t\tvar sentinel\n\t\tif (typeof vnode.tag.view === \"function\") {\n\t\t\tvnode.state = Object.create(vnode.tag)\n\t\t\tsentinel = vnode.state.view\n\t\t\tif (sentinel.$$reentrantLock$$ != null) return\n\t\t\tsentinel.$$reentrantLock$$ = true\n\t\t} else {\n\t\t\tvnode.state = void 0\n\t\t\tsentinel = vnode.tag\n\t\t\tif (sentinel.$$reentrantLock$$ != null) return\n\t\t\tsentinel.$$reentrantLock$$ = true\n\t\t\tvnode.state = (vnode.tag.prototype != null && typeof vnode.tag.prototype.view === \"function\") ? new vnode.tag(vnode) : vnode.tag(vnode)\n\t\t}\n\t\tinitLifecycle(vnode.state, vnode, hooks)\n\t\tif (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks)\n\t\tvnode.instance = Vnode.normalize(callHook.call(vnode.state.view, vnode))\n\t\tif (vnode.instance === vnode) throw Error(\"A view cannot return the vnode it received as argument\")\n\t\tsentinel.$$reentrantLock$$ = null\n\t}\n\tfunction createComponent(parent, vnode, hooks, ns, nextSibling) {\n\t\tinitComponent(vnode, hooks)\n\t\tif (vnode.instance != null) {\n\t\t\tcreateNode(parent, vnode.instance, hooks, ns, nextSibling)\n\t\t\tvnode.dom = vnode.instance.dom\n\t\t\tvnode.domSize = vnode.instance.domSize\n\t\t}\n\t\telse {\n\t\t\tvnode.domSize = 0\n\t\t}\n\t}\n\n\t//update\n\t/**\n\t * @param {Element|Fragment} parent - the parent element\n\t * @param {Vnode[] | null} old - the list of vnodes of the last `render()` call for\n\t * this part of the tree\n\t * @param {Vnode[] | null} vnodes - as above, but for the current `render()` call.\n\t * @param {Function[]} hooks - an accumulator of post-render hooks (oncreate/onupdate)\n\t * @param {Element | null} nextSibling - the next DOM node if we're dealing with a\n\t * fragment that is not the last item in its\n\t * parent\n\t * @param {'svg' | 'math' | String | null} ns) - the current XML namespace, if any\n\t * @returns void\n\t */\n\t// This function diffs and patches lists of vnodes, both keyed and unkeyed.\n\t//\n\t// We will:\n\t//\n\t// 1. describe its general structure\n\t// 2. focus on the diff algorithm optimizations\n\t// 3. discuss DOM node operations.\n\n\t// ## Overview:\n\t//\n\t// The updateNodes() function:\n\t// - deals with trivial cases\n\t// - determines whether the lists are keyed or unkeyed based on the first non-null node\n\t// of each list.\n\t// - diffs them and patches the DOM if needed (that's the brunt of the code)\n\t// - manages the leftovers: after diffing, are there:\n\t// - old nodes left to remove?\n\t// \t - new nodes to insert?\n\t// \t deal with them!\n\t//\n\t// The lists are only iterated over once, with an exception for the nodes in `old` that\n\t// are visited in the fourth part of the diff and in the `removeNodes` loop.\n\n\t// ## Diffing\n\t//\n\t// Reading https://github.com/localvoid/ivi/blob/ddc09d06abaef45248e6133f7040d00d3c6be853/packages/ivi/src/vdom/implementation.ts#L617-L837\n\t// may be good for context on longest increasing subsequence-based logic for moving nodes.\n\t//\n\t// In order to diff keyed lists, one has to\n\t//\n\t// 1) match nodes in both lists, per key, and update them accordingly\n\t// 2) create the nodes present in the new list, but absent in the old one\n\t// 3) remove the nodes present in the old list, but absent in the new one\n\t// 4) figure out what nodes in 1) to move in order to minimize the DOM operations.\n\t//\n\t// To achieve 1) one can create a dictionary of keys => index (for the old list), then iterate\n\t// over the new list and for each new vnode, find the corresponding vnode in the old list using\n\t// the map.\n\t// 2) is achieved in the same step: if a new node has no corresponding entry in the map, it is new\n\t// and must be created.\n\t// For the removals, we actually remove the nodes that have been updated from the old list.\n\t// The nodes that remain in that list after 1) and 2) have been performed can be safely removed.\n\t// The fourth step is a bit more complex and relies on the longest increasing subsequence (LIS)\n\t// algorithm.\n\t//\n\t// the longest increasing subsequence is the list of nodes that can remain in place. Imagine going\n\t// from `1,2,3,4,5` to `4,5,1,2,3` where the numbers are not necessarily the keys, but the indices\n\t// corresponding to the keyed nodes in the old list (keyed nodes `e,d,c,b,a` => `b,a,e,d,c` would\n\t// match the above lists, for example).\n\t//\n\t// In there are two increasing subsequences: `4,5` and `1,2,3`, the latter being the longest. We\n\t// can update those nodes without moving them, and only call `insertNode` on `4` and `5`.\n\t//\n\t// @localvoid adapted the algo to also support node deletions and insertions (the `lis` is actually\n\t// the longest increasing subsequence *of old nodes still present in the new list*).\n\t//\n\t// It is a general algorithm that is fireproof in all circumstances, but it requires the allocation\n\t// and the construction of a `key => oldIndex` map, and three arrays (one with `newIndex => oldIndex`,\n\t// the `LIS` and a temporary one to create the LIS).\n\t//\n\t// So we cheat where we can: if the tails of the lists are identical, they are guaranteed to be part of\n\t// the LIS and can be updated without moving them.\n\t//\n\t// If two nodes are swapped, they are guaranteed not to be part of the LIS, and must be moved (with\n\t// the exception of the last node if the list is fully reversed).\n\t//\n\t// ## Finding the next sibling.\n\t//\n\t// `updateNode()` and `createNode()` expect a nextSibling parameter to perform DOM operations.\n\t// When the list is being traversed top-down, at any index, the DOM nodes up to the previous\n\t// vnode reflect the content of the new list, whereas the rest of the DOM nodes reflect the old\n\t// list. The next sibling must be looked for in the old list using `getNextSibling(... oldStart + 1 ...)`.\n\t//\n\t// In the other scenarios (swaps, upwards traversal, map-based diff),\n\t// the new vnodes list is traversed upwards. The DOM nodes at the bottom of the list reflect the\n\t// bottom part of the new vnodes list, and we can use the `v.dom` value of the previous node\n\t// as the next sibling (cached in the `nextSibling` variable).\n\n\n\t// ## DOM node moves\n\t//\n\t// In most scenarios `updateNode()` and `createNode()` perform the DOM operations. However,\n\t// this is not the case if the node moved (second and fourth part of the diff algo). We move\n\t// the old DOM nodes before updateNode runs because it enables us to use the cached `nextSibling`\n\t// variable rather than fetching it using `getNextSibling()`.\n\n\tfunction updateNodes(parent, old, vnodes, hooks, nextSibling, ns) {\n\t\tif (old === vnodes || old == null && vnodes == null) return\n\t\telse if (old == null || old.length === 0) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, ns)\n\t\telse if (vnodes == null || vnodes.length === 0) removeNodes(parent, old, 0, old.length)\n\t\telse {\n\t\t\tvar isOldKeyed = old[0] != null && old[0].key != null\n\t\t\tvar isKeyed = vnodes[0] != null && vnodes[0].key != null\n\t\t\tvar start = 0, oldStart = 0\n\t\t\tif (!isOldKeyed) while (oldStart < old.length && old[oldStart] == null) oldStart++\n\t\t\tif (!isKeyed) while (start < vnodes.length && vnodes[start] == null) start++\n\t\t\tif (isOldKeyed !== isKeyed) {\n\t\t\t\tremoveNodes(parent, old, oldStart, old.length)\n\t\t\t\tcreateNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns)\n\t\t\t} else if (!isKeyed) {\n\t\t\t\t// Don't index past the end of either list (causes deopts).\n\t\t\t\tvar commonLength = old.length < vnodes.length ? old.length : vnodes.length\n\t\t\t\t// Rewind if necessary to the first non-null index on either side.\n\t\t\t\t// We could alternatively either explicitly create or remove nodes when `start !== oldStart`\n\t\t\t\t// but that would be optimizing for sparse lists which are more rare than dense ones.\n\t\t\t\tstart = start < oldStart ? start : oldStart\n\t\t\t\tfor (; start < commonLength; start++) {\n\t\t\t\t\to = old[start]\n\t\t\t\t\tv = vnodes[start]\n\t\t\t\t\tif (o === v || o == null && v == null) continue\n\t\t\t\t\telse if (o == null) createNode(parent, v, hooks, ns, getNextSibling(old, start + 1, nextSibling))\n\t\t\t\t\telse if (v == null) removeNode(parent, o)\n\t\t\t\t\telse updateNode(parent, o, v, hooks, getNextSibling(old, start + 1, nextSibling), ns)\n\t\t\t\t}\n\t\t\t\tif (old.length > commonLength) removeNodes(parent, old, start, old.length)\n\t\t\t\tif (vnodes.length > commonLength) createNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns)\n\t\t\t} else {\n\t\t\t\t// keyed diff\n\t\t\t\tvar oldEnd = old.length - 1, end = vnodes.length - 1, map, o, v, oe, ve, topSibling\n\n\t\t\t\t// bottom-up\n\t\t\t\twhile (oldEnd >= oldStart && end >= start) {\n\t\t\t\t\toe = old[oldEnd]\n\t\t\t\t\tve = vnodes[end]\n\t\t\t\t\tif (oe.key !== ve.key) break\n\t\t\t\t\tif (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns)\n\t\t\t\t\tif (ve.dom != null) nextSibling = ve.dom\n\t\t\t\t\toldEnd--, end--\n\t\t\t\t}\n\t\t\t\t// top-down\n\t\t\t\twhile (oldEnd >= oldStart && end >= start) {\n\t\t\t\t\to = old[oldStart]\n\t\t\t\t\tv = vnodes[start]\n\t\t\t\t\tif (o.key !== v.key) break\n\t\t\t\t\toldStart++, start++\n\t\t\t\t\tif (o !== v) updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), ns)\n\t\t\t\t}\n\t\t\t\t// swaps and list reversals\n\t\t\t\twhile (oldEnd >= oldStart && end >= start) {\n\t\t\t\t\tif (start === end) break\n\t\t\t\t\tif (o.key !== ve.key || oe.key !== v.key) break\n\t\t\t\t\ttopSibling = getNextSibling(old, oldStart, nextSibling)\n\t\t\t\t\tmoveDOM(parent, oe, topSibling)\n\t\t\t\t\tif (oe !== v) updateNode(parent, oe, v, hooks, topSibling, ns)\n\t\t\t\t\tif (++start <= --end) moveDOM(parent, o, nextSibling)\n\t\t\t\t\tif (o !== ve) updateNode(parent, o, ve, hooks, nextSibling, ns)\n\t\t\t\t\tif (ve.dom != null) nextSibling = ve.dom\n\t\t\t\t\toldStart++; oldEnd--\n\t\t\t\t\toe = old[oldEnd]\n\t\t\t\t\tve = vnodes[end]\n\t\t\t\t\to = old[oldStart]\n\t\t\t\t\tv = vnodes[start]\n\t\t\t\t}\n\t\t\t\t// bottom up once again\n\t\t\t\twhile (oldEnd >= oldStart && end >= start) {\n\t\t\t\t\tif (oe.key !== ve.key) break\n\t\t\t\t\tif (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns)\n\t\t\t\t\tif (ve.dom != null) nextSibling = ve.dom\n\t\t\t\t\toldEnd--, end--\n\t\t\t\t\toe = old[oldEnd]\n\t\t\t\t\tve = vnodes[end]\n\t\t\t\t}\n\t\t\t\tif (start > end) removeNodes(parent, old, oldStart, oldEnd + 1)\n\t\t\t\telse if (oldStart > oldEnd) createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns)\n\t\t\t\telse {\n\t\t\t\t\t// inspired by ivi https://github.com/ivijs/ivi/ by Boris Kaul\n\t\t\t\t\tvar originalNextSibling = nextSibling, vnodesLength = end - start + 1, oldIndices = new Array(vnodesLength), li=0, i=0, pos = 2147483647, matched = 0, map, lisIndices\n\t\t\t\t\tfor (i = 0; i < vnodesLength; i++) oldIndices[i] = -1\n\t\t\t\t\tfor (i = end; i >= start; i--) {\n\t\t\t\t\t\tif (map == null) map = getKeyMap(old, oldStart, oldEnd + 1)\n\t\t\t\t\t\tve = vnodes[i]\n\t\t\t\t\t\tvar oldIndex = map[ve.key]\n\t\t\t\t\t\tif (oldIndex != null) {\n\t\t\t\t\t\t\tpos = (oldIndex < pos) ? oldIndex : -1 // becomes -1 if nodes were re-ordered\n\t\t\t\t\t\t\toldIndices[i-start] = oldIndex\n\t\t\t\t\t\t\toe = old[oldIndex]\n\t\t\t\t\t\t\told[oldIndex] = null\n\t\t\t\t\t\t\tif (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns)\n\t\t\t\t\t\t\tif (ve.dom != null) nextSibling = ve.dom\n\t\t\t\t\t\t\tmatched++\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnextSibling = originalNextSibling\n\t\t\t\t\tif (matched !== oldEnd - oldStart + 1) removeNodes(parent, old, oldStart, oldEnd + 1)\n\t\t\t\t\tif (matched === 0) createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns)\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (pos === -1) {\n\t\t\t\t\t\t\t// the indices of the indices of the items that are part of the\n\t\t\t\t\t\t\t// longest increasing subsequence in the oldIndices list\n\t\t\t\t\t\t\tlisIndices = makeLisIndices(oldIndices)\n\t\t\t\t\t\t\tli = lisIndices.length - 1\n\t\t\t\t\t\t\tfor (i = end; i >= start; i--) {\n\t\t\t\t\t\t\t\tv = vnodes[i]\n\t\t\t\t\t\t\t\tif (oldIndices[i-start] === -1) createNode(parent, v, hooks, ns, nextSibling)\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tif (lisIndices[li] === i - start) li--\n\t\t\t\t\t\t\t\t\telse moveDOM(parent, v, nextSibling)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (v.dom != null) nextSibling = vnodes[i].dom\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfor (i = end; i >= start; i--) {\n\t\t\t\t\t\t\t\tv = vnodes[i]\n\t\t\t\t\t\t\t\tif (oldIndices[i-start] === -1) createNode(parent, v, hooks, ns, nextSibling)\n\t\t\t\t\t\t\t\tif (v.dom != null) nextSibling = vnodes[i].dom\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfunction updateNode(parent, old, vnode, hooks, nextSibling, ns) {\n\t\tvar oldTag = old.tag, tag = vnode.tag\n\t\tif (oldTag === tag && old.is === vnode.is) {\n\t\t\tvnode.state = old.state\n\t\t\tvnode.events = old.events\n\t\t\tif (shouldNotUpdate(vnode, old)) return\n\t\t\tif (typeof oldTag === \"string\") {\n\t\t\t\tif (vnode.attrs != null) {\n\t\t\t\t\tupdateLifecycle(vnode.attrs, vnode, hooks)\n\t\t\t\t}\n\t\t\t\tswitch (oldTag) {\n\t\t\t\t\tcase \"#\": updateText(old, vnode); break\n\t\t\t\t\tcase \"<\": updateHTML(parent, old, vnode, ns, nextSibling); break\n\t\t\t\t\tcase \"[\": updateFragment(parent, old, vnode, hooks, nextSibling, ns); break\n\t\t\t\t\tdefault: updateElement(old, vnode, hooks, ns)\n\t\t\t\t}\n\t\t\t}\n\t\t\telse updateComponent(parent, old, vnode, hooks, nextSibling, ns)\n\t\t}\n\t\telse {\n\t\t\tremoveNode(parent, old)\n\t\t\tcreateNode(parent, vnode, hooks, ns, nextSibling)\n\t\t}\n\t}\n\tfunction updateText(old, vnode) {\n\t\tif (old.children.toString() !== vnode.children.toString()) {\n\t\t\told.dom.nodeValue = vnode.children\n\t\t}\n\t\tvnode.dom = old.dom\n\t}\n\tfunction updateHTML(parent, old, vnode, ns, nextSibling) {\n\t\tif (old.children !== vnode.children) {\n\t\t\tremoveDOM(parent, old)\n\t\t\tcreateHTML(parent, vnode, ns, nextSibling)\n\t\t}\n\t\telse {\n\t\t\tvnode.dom = old.dom\n\t\t\tvnode.domSize = old.domSize\n\t\t}\n\t}\n\tfunction updateFragment(parent, old, vnode, hooks, nextSibling, ns) {\n\t\tupdateNodes(parent, old.children, vnode.children, hooks, nextSibling, ns)\n\t\tvar domSize = 0, children = vnode.children\n\t\tvnode.dom = null\n\t\tif (children != null) {\n\t\t\tfor (var i = 0; i < children.length; i++) {\n\t\t\t\tvar child = children[i]\n\t\t\t\tif (child != null && child.dom != null) {\n\t\t\t\t\tif (vnode.dom == null) vnode.dom = child.dom\n\t\t\t\t\tdomSize += child.domSize || 1\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvnode.domSize = domSize\n\t}\n\tfunction updateElement(old, vnode, hooks, ns) {\n\t\tvar element = vnode.dom = old.dom\n\t\tns = getNameSpace(vnode) || ns\n\n\t\tif (old.attrs != vnode.attrs || (vnode.attrs != null && !cachedAttrsIsStaticMap.get(vnode.attrs))) {\n\t\t\tupdateAttrs(vnode, old.attrs, vnode.attrs, ns)\n\t\t}\n\t\tif (!maybeSetContentEditable(vnode)) {\n\t\t\tupdateNodes(element, old.children, vnode.children, hooks, null, ns)\n\t\t}\n\t}\n\tfunction updateComponent(parent, old, vnode, hooks, nextSibling, ns) {\n\t\tvnode.instance = Vnode.normalize(callHook.call(vnode.state.view, vnode))\n\t\tif (vnode.instance === vnode) throw Error(\"A view cannot return the vnode it received as argument\")\n\t\tupdateLifecycle(vnode.state, vnode, hooks)\n\t\tif (vnode.attrs != null) updateLifecycle(vnode.attrs, vnode, hooks)\n\t\tif (vnode.instance != null) {\n\t\t\tif (old.instance == null) createNode(parent, vnode.instance, hooks, ns, nextSibling)\n\t\t\telse updateNode(parent, old.instance, vnode.instance, hooks, nextSibling, ns)\n\t\t\tvnode.dom = vnode.instance.dom\n\t\t\tvnode.domSize = vnode.instance.domSize\n\t\t}\n\t\telse {\n\t\t\tif (old.instance != null) removeNode(parent, old.instance)\n\t\t\tvnode.domSize = 0\n\t\t}\n\t}\n\tfunction getKeyMap(vnodes, start, end) {\n\t\tvar map = Object.create(null)\n\t\tfor (; start < end; start++) {\n\t\t\tvar vnode = vnodes[start]\n\t\t\tif (vnode != null) {\n\t\t\t\tvar key = vnode.key\n\t\t\t\tif (key != null) map[key] = start\n\t\t\t}\n\t\t}\n\t\treturn map\n\t}\n\t// Lifted from ivi https://github.com/ivijs/ivi/\n\t// takes a list of unique numbers (-1 is special and can\n\t// occur multiple times) and returns an array with the indices\n\t// of the items that are part of the longest increasing\n\t// subsequence\n\tvar lisTemp = []\n\tfunction makeLisIndices(a) {\n\t\tvar result = [0]\n\t\tvar u = 0, v = 0, i = 0\n\t\tvar il = lisTemp.length = a.length\n\t\tfor (var i = 0; i < il; i++) lisTemp[i] = a[i]\n\t\tfor (var i = 0; i < il; ++i) {\n\t\t\tif (a[i] === -1) continue\n\t\t\tvar j = result[result.length - 1]\n\t\t\tif (a[j] < a[i]) {\n\t\t\t\tlisTemp[i] = j\n\t\t\t\tresult.push(i)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tu = 0\n\t\t\tv = result.length - 1\n\t\t\twhile (u < v) {\n\t\t\t\t// Fast integer average without overflow.\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tvar c = (u >>> 1) + (v >>> 1) + (u & v & 1)\n\t\t\t\tif (a[result[c]] < a[i]) {\n\t\t\t\t\tu = c + 1\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tv = c\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (a[i] < a[result[u]]) {\n\t\t\t\tif (u > 0) lisTemp[i] = result[u - 1]\n\t\t\t\tresult[u] = i\n\t\t\t}\n\t\t}\n\t\tu = result.length\n\t\tv = result[u - 1]\n\t\twhile (u-- > 0) {\n\t\t\tresult[u] = v\n\t\t\tv = lisTemp[v]\n\t\t}\n\t\tlisTemp.length = 0\n\t\treturn result\n\t}\n\n\tfunction getNextSibling(vnodes, i, nextSibling) {\n\t\tfor (; i < vnodes.length; i++) {\n\t\t\tif (vnodes[i] != null && vnodes[i].dom != null) return vnodes[i].dom\n\t\t}\n\t\treturn nextSibling\n\t}\n\n\t// This handles fragments with zombie children (removed from vdom, but persisted in DOM through onbeforeremove)\n\tfunction moveDOM(parent, vnode, nextSibling) {\n\t\tif (vnode.dom != null) {\n\t\t\tvar target\n\t\t\tif (vnode.domSize == null || vnode.domSize === 1) {\n\t\t\t\t// don't allocate for the common case\n\t\t\t\ttarget = vnode.dom\n\t\t\t} else {\n\t\t\t\ttarget = getDocument(parent).createDocumentFragment()\n\t\t\t\tfor (var dom of domFor(vnode)) target.appendChild(dom)\n\t\t\t}\n\t\t\tinsertDOM(parent, target, nextSibling)\n\t\t}\n\t}\n\n\tfunction insertDOM(parent, dom, nextSibling) {\n\t\tif (nextSibling != null) parent.insertBefore(dom, nextSibling)\n\t\telse parent.appendChild(dom)\n\t}\n\n\tfunction maybeSetContentEditable(vnode) {\n\t\tif (vnode.attrs == null || (\n\t\t\tvnode.attrs.contenteditable == null && // attribute\n\t\t\tvnode.attrs.contentEditable == null // property\n\t\t)) return false\n\t\tvar children = vnode.children\n\t\tif (children != null && children.length === 1 && children[0].tag === \"<\") {\n\t\t\tvar content = children[0].children\n\t\t\tif (vnode.dom.innerHTML !== content) vnode.dom.innerHTML = content\n\t\t}\n\t\telse if (children != null && children.length !== 0) throw new Error(\"Child node of a contenteditable must be trusted.\")\n\t\treturn true\n\t}\n\n\t//remove\n\tfunction removeNodes(parent, vnodes, start, end) {\n\t\tfor (var i = start; i < end; i++) {\n\t\t\tvar vnode = vnodes[i]\n\t\t\tif (vnode != null) removeNode(parent, vnode)\n\t\t}\n\t}\n\tfunction tryBlockRemove(parent, vnode, source, counter) {\n\t\tvar original = vnode.state\n\t\tvar result = callHook.call(source.onbeforeremove, vnode)\n\t\tif (result == null) return\n\n\t\tvar generation = currentRender\n\t\tfor (var dom of domFor(vnode)) delayedRemoval.set(dom, generation)\n\t\tcounter.v++\n\n\t\tPromise.resolve(result).finally(function () {\n\t\t\tcheckState(vnode, original)\n\t\t\ttryResumeRemove(parent, vnode, counter)\n\t\t})\n\t}\n\tfunction tryResumeRemove(parent, vnode, counter) {\n\t\tif (--counter.v === 0) {\n\t\t\tonremove(vnode)\n\t\t\tremoveDOM(parent, vnode)\n\t\t}\n\t}\n\tfunction removeNode(parent, vnode) {\n\t\tvar counter = {v: 1}\n\t\tif (typeof vnode.tag !== \"string\" && typeof vnode.state.onbeforeremove === \"function\") tryBlockRemove(parent, vnode, vnode.state, counter)\n\t\tif (vnode.attrs && typeof vnode.attrs.onbeforeremove === \"function\") tryBlockRemove(parent, vnode, vnode.attrs, counter)\n\t\ttryResumeRemove(parent, vnode, counter)\n\t}\n\tfunction removeDOM(parent, vnode) {\n\t\tif (vnode.dom == null) return\n\t\tif (vnode.domSize == null || vnode.domSize === 1) {\n\t\t\tparent.removeChild(vnode.dom)\n\t\t} else {\n\t\t\tfor (var dom of domFor(vnode)) parent.removeChild(dom)\n\t\t}\n\t}\n\n\tfunction onremove(vnode) {\n\t\tif (typeof vnode.tag !== \"string\" && typeof vnode.state.onremove === \"function\") callHook.call(vnode.state.onremove, vnode)\n\t\tif (vnode.attrs && typeof vnode.attrs.onremove === \"function\") callHook.call(vnode.attrs.onremove, vnode)\n\t\tif (typeof vnode.tag !== \"string\") {\n\t\t\tif (vnode.instance != null) onremove(vnode.instance)\n\t\t} else {\n\t\t\tif (vnode.events != null) vnode.events._ = null\n\t\t\tvar children = vnode.children\n\t\t\tif (Array.isArray(children)) {\n\t\t\t\tfor (var i = 0; i < children.length; i++) {\n\t\t\t\t\tvar child = children[i]\n\t\t\t\t\tif (child != null) onremove(child)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t//attrs\n\tfunction setAttrs(vnode, attrs, ns) {\n\t\tfor (var key in attrs) {\n\t\t\tsetAttr(vnode, key, null, attrs[key], ns)\n\t\t}\n\t}\n\tfunction setAttr(vnode, key, old, value, ns) {\n\t\tif (key === \"key\" || value == null || isLifecycleMethod(key) || (old === value && !isFormAttribute(vnode, key)) && typeof value !== \"object\") return\n\t\tif (key[0] === \"o\" && key[1] === \"n\") return updateEvent(vnode, key, value)\n\t\tif (key.slice(0, 6) === \"xlink:\") vnode.dom.setAttributeNS(\"http://www.w3.org/1999/xlink\", key.slice(6), value)\n\t\telse if (key === \"style\") updateStyle(vnode.dom, old, value)\n\t\telse if (hasPropertyKey(vnode, key, ns)) {\n\t\t\tif (key === \"value\") {\n\t\t\t\t// Only do the coercion if we're actually going to check the value.\n\t\t\t\t/* eslint-disable no-implicit-coercion */\n\t\t\t\t//setting input[value] to same value by typing on focused element moves cursor to end in Chrome\n\t\t\t\t//setting input[type=file][value] to same value causes an error to be generated if it's non-empty\n\t\t\t\t//minlength/maxlength validation isn't performed on script-set values(#2256)\n\t\t\t\tif ((vnode.tag === \"input\" || vnode.tag === \"textarea\") && vnode.dom.value === \"\" + value) return\n\t\t\t\t//setting select[value] to same value while having select open blinks select dropdown in Chrome\n\t\t\t\tif (vnode.tag === \"select\" && old !== null && vnode.dom.value === \"\" + value) return\n\t\t\t\t//setting option[value] to same value while having select open blinks select dropdown in Chrome\n\t\t\t\tif (vnode.tag === \"option\" && old !== null && vnode.dom.value === \"\" + value) return\n\t\t\t\t//setting input[type=file][value] to different value is an error if it's non-empty\n\t\t\t\t// Not ideal, but it at least works around the most common source of uncaught exceptions for now.\n\t\t\t\tif (vnode.tag === \"input\" && vnode.attrs.type === \"file\" && \"\" + value !== \"\") { console.error(\"`value` is read-only on file inputs!\"); return }\n\t\t\t\t/* eslint-enable no-implicit-coercion */\n\t\t\t}\n\t\t\t// If you assign an input type that is not supported by IE 11 with an assignment expression, an error will occur.\n\t\t\tif (vnode.tag === \"input\" && key === \"type\") vnode.dom.setAttribute(key, value)\n\t\t\telse vnode.dom[key] = value\n\t\t} else {\n\t\t\tif (typeof value === \"boolean\") {\n\t\t\t\tif (value) vnode.dom.setAttribute(key, \"\")\n\t\t\t\telse vnode.dom.removeAttribute(key)\n\t\t\t}\n\t\t\telse vnode.dom.setAttribute(key === \"className\" ? \"class\" : key, value)\n\t\t}\n\t}\n\tfunction removeAttr(vnode, key, old, ns) {\n\t\tif (key === \"key\" || old == null || isLifecycleMethod(key)) return\n\t\tif (key[0] === \"o\" && key[1] === \"n\") updateEvent(vnode, key, undefined)\n\t\telse if (key === \"style\") updateStyle(vnode.dom, old, null)\n\t\telse if (\n\t\t\thasPropertyKey(vnode, key, ns)\n\t\t\t&& key !== \"className\"\n\t\t\t&& key !== \"title\" // creates \"null\" as title\n\t\t\t&& !(key === \"value\" && (\n\t\t\t\tvnode.tag === \"option\"\n\t\t\t\t|| vnode.tag === \"select\" && vnode.dom.selectedIndex === -1 && vnode.dom === activeElement(vnode.dom)\n\t\t\t))\n\t\t\t&& !(vnode.tag === \"input\" && key === \"type\")\n\t\t) {\n\t\t\tvnode.dom[key] = null\n\t\t} else {\n\t\t\tvar nsLastIndex = key.indexOf(\":\")\n\t\t\tif (nsLastIndex !== -1) key = key.slice(nsLastIndex + 1)\n\t\t\tif (old !== false) vnode.dom.removeAttribute(key === \"className\" ? \"class\" : key)\n\t\t}\n\t}\n\tfunction setLateSelectAttrs(vnode, attrs) {\n\t\tif (\"value\" in attrs) {\n\t\t\tif(attrs.value === null) {\n\t\t\t\tif (vnode.dom.selectedIndex !== -1) vnode.dom.value = null\n\t\t\t} else {\n\t\t\t\tvar normalized = \"\" + attrs.value // eslint-disable-line no-implicit-coercion\n\t\t\t\tif (vnode.dom.value !== normalized || vnode.dom.selectedIndex === -1) {\n\t\t\t\t\tvnode.dom.value = normalized\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (\"selectedIndex\" in attrs) setAttr(vnode, \"selectedIndex\", null, attrs.selectedIndex, undefined)\n\t}\n\tfunction updateAttrs(vnode, old, attrs, ns) {\n\t\t// Some attributes may NOT be case-sensitive (e.g. data-***),\n\t\t// so removal should be done first to prevent accidental removal for newly setting values.\n\t\tvar val\n\t\tif (old != null) {\n\t\t\tif (old === attrs && !cachedAttrsIsStaticMap.has(attrs)) {\n\t\t\t\tconsole.warn(\"Don't reuse attrs object, use new object for every redraw, this will throw in next major\")\n\t\t\t}\n\t\t\tfor (var key in old) {\n\t\t\t\tif (((val = old[key]) != null) && (attrs == null || attrs[key] == null)) {\n\t\t\t\t\tremoveAttr(vnode, key, val, ns)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (attrs != null) {\n\t\t\tfor (var key in attrs) {\n\t\t\t\tsetAttr(vnode, key, old && old[key], attrs[key], ns)\n\t\t\t}\n\t\t}\n\t}\n\tfunction isFormAttribute(vnode, attr) {\n\t\treturn attr === \"value\" || attr === \"checked\" || attr === \"selectedIndex\" || attr === \"selected\" && (vnode.dom === activeElement(vnode.dom) || vnode.tag === \"option\" && vnode.dom.parentNode === activeElement(vnode.dom))\n\t}\n\tfunction isLifecycleMethod(attr) {\n\t\treturn attr === \"oninit\" || attr === \"oncreate\" || attr === \"onupdate\" || attr === \"onremove\" || attr === \"onbeforeremove\" || attr === \"onbeforeupdate\"\n\t}\n\tfunction hasPropertyKey(vnode, key, ns) {\n\t\t// Filter out namespaced keys\n\t\treturn ns === undefined && (\n\t\t\t// If it's a custom element, just keep it.\n\t\t\tvnode.tag.indexOf(\"-\") > -1 || vnode.is ||\n\t\t\t// If it's a normal element, let's try to avoid a few browser bugs.\n\t\t\tkey !== \"href\" && key !== \"list\" && key !== \"form\" && key !== \"width\" && key !== \"height\"// && key !== \"type\"\n\t\t\t// Defer the property check until *after* we check everything.\n\t\t) && key in vnode.dom\n\t}\n\n\t//style\n\tfunction updateStyle(element, old, style) {\n\t\tif (old === style) {\n\t\t\t// Styles are equivalent, do nothing.\n\t\t} else if (style == null) {\n\t\t\t// New style is missing, just clear it.\n\t\t\telement.style = \"\"\n\t\t} else if (typeof style !== \"object\") {\n\t\t\t// New style is a string, let engine deal with patching.\n\t\t\telement.style = style\n\t\t} else if (old == null || typeof old !== \"object\") {\n\t\t\t// `old` is missing or a string, `style` is an object.\n\t\t\telement.style = \"\"\n\t\t\t// Add new style properties\n\t\t\tfor (var key in style) {\n\t\t\t\tvar value = style[key]\n\t\t\t\tif (value != null) {\n\t\t\t\t\tif (key.includes(\"-\")) element.style.setProperty(key, String(value))\n\t\t\t\t\telse element.style[key] = String(value)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Both old & new are (different) objects.\n\t\t\t// Remove style properties that no longer exist\n\t\t\t// Style properties may have two cases(dash-case and camelCase),\n\t\t\t// so removal should be done first to prevent accidental removal for newly setting values.\n\t\t\tfor (var key in old) {\n\t\t\t\tif (old[key] != null && style[key] == null) {\n\t\t\t\t\tif (key.includes(\"-\")) element.style.removeProperty(key)\n\t\t\t\t\telse element.style[key] = \"\"\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Update style properties that have changed\n\t\t\tfor (var key in style) {\n\t\t\t\tvar value = style[key]\n\t\t\t\tif (value != null && (value = String(value)) !== String(old[key])) {\n\t\t\t\t\tif (key.includes(\"-\")) element.style.setProperty(key, value)\n\t\t\t\t\telse element.style[key] = value\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Here's an explanation of how this works:\n\t// 1. The event names are always (by design) prefixed by `on`.\n\t// 2. The EventListener interface accepts either a function or an object\n\t// with a `handleEvent` method.\n\t// 3. The object does not inherit from `Object.prototype`, to avoid\n\t// any potential interference with that (e.g. setters).\n\t// 4. The event name is remapped to the handler before calling it.\n\t// 5. In function-based event handlers, `ev.target === this`. We replicate\n\t// that below.\n\t// 6. In function-based event handlers, `return false` prevents the default\n\t// action and stops event propagation. We replicate that below.\n\tfunction EventDict() {\n\t\t// Save this, so the current redraw is correctly tracked.\n\t\tthis._ = currentRedraw\n\t}\n\tEventDict.prototype = Object.create(null)\n\tEventDict.prototype.handleEvent = function (ev) {\n\t\tvar handler = this[\"on\" + ev.type]\n\t\tvar result\n\t\tif (typeof handler === \"function\") result = handler.call(ev.currentTarget, ev)\n\t\telse if (typeof handler.handleEvent === \"function\") handler.handleEvent(ev)\n\t\tvar self = this\n\t\tif (self._ != null) {\n\t\t\tif (ev.redraw !== false) (0, self._)()\n\t\t\tif (result != null && typeof result.then === \"function\") {\n\t\t\t\tPromise.resolve(result).then(function () {\n\t\t\t\t\tif (self._ != null && ev.redraw !== false) (0, self._)()\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tif (result === false) {\n\t\t\tev.preventDefault()\n\t\t\tev.stopPropagation()\n\t\t}\n\t}\n\n\t//event\n\tfunction updateEvent(vnode, key, value) {\n\t\tif (vnode.events != null) {\n\t\t\tvnode.events._ = currentRedraw\n\t\t\tif (vnode.events[key] === value) return\n\t\t\tif (value != null && (typeof value === \"function\" || typeof value === \"object\")) {\n\t\t\t\tif (vnode.events[key] == null) vnode.dom.addEventListener(key.slice(2), vnode.events, false)\n\t\t\t\tvnode.events[key] = value\n\t\t\t} else {\n\t\t\t\tif (vnode.events[key] != null) vnode.dom.removeEventListener(key.slice(2), vnode.events, false)\n\t\t\t\tvnode.events[key] = undefined\n\t\t\t}\n\t\t} else if (value != null && (typeof value === \"function\" || typeof value === \"object\")) {\n\t\t\tvnode.events = new EventDict()\n\t\t\tvnode.dom.addEventListener(key.slice(2), vnode.events, false)\n\t\t\tvnode.events[key] = value\n\t\t}\n\t}\n\n\t//lifecycle\n\tfunction initLifecycle(source, vnode, hooks) {\n\t\tif (typeof source.oninit === \"function\") callHook.call(source.oninit, vnode)\n\t\tif (typeof source.oncreate === \"function\") hooks.push(callHook.bind(source.oncreate, vnode))\n\t}\n\tfunction updateLifecycle(source, vnode, hooks) {\n\t\tif (typeof source.onupdate === \"function\") hooks.push(callHook.bind(source.onupdate, vnode))\n\t}\n\tfunction shouldNotUpdate(vnode, old) {\n\t\tdo {\n\t\t\tif (vnode.attrs != null && typeof vnode.attrs.onbeforeupdate === \"function\") {\n\t\t\t\tvar force = callHook.call(vnode.attrs.onbeforeupdate, vnode, old)\n\t\t\t\tif (force !== undefined && !force) break\n\t\t\t}\n\t\t\tif (typeof vnode.tag !== \"string\" && typeof vnode.state.onbeforeupdate === \"function\") {\n\t\t\t\tvar force = callHook.call(vnode.state.onbeforeupdate, vnode, old)\n\t\t\t\tif (force !== undefined && !force) break\n\t\t\t}\n\t\t\treturn false\n\t\t} while (false); // eslint-disable-line no-constant-condition\n\t\tvnode.dom = old.dom\n\t\tvnode.domSize = old.domSize\n\t\tvnode.instance = old.instance\n\t\t// One would think having the actual latest attributes would be ideal,\n\t\t// but it doesn't let us properly diff based on our current internal\n\t\t// representation. We have to save not only the old DOM info, but also\n\t\t// the attributes used to create it, as we diff *that*, not against the\n\t\t// DOM directly (with a few exceptions in `setAttr`). And, of course, we\n\t\t// need to save the children and text as they are conceptually not\n\t\t// unlike special \"attributes\" internally.\n\t\tvnode.attrs = old.attrs\n\t\tvnode.children = old.children\n\t\tvnode.text = old.text\n\t\treturn true\n\t}\n\n\tvar currentDOM\n\n\treturn function(dom, vnodes, redraw) {\n\t\tif (!dom) throw new TypeError(\"DOM element being rendered to does not exist.\")\n\t\tif (currentDOM != null && dom.contains(currentDOM)) {\n\t\t\tthrow new TypeError(\"Node is currently being rendered to and thus is locked.\")\n\t\t}\n\t\tvar prevRedraw = currentRedraw\n\t\tvar prevDOM = currentDOM\n\t\tvar hooks = []\n\t\tvar active = activeElement(dom)\n\t\tvar namespace = dom.namespaceURI\n\n\t\tcurrentDOM = dom\n\t\tcurrentRedraw = typeof redraw === \"function\" ? redraw : undefined\n\t\tcurrentRender = {}\n\t\ttry {\n\t\t\t// First time rendering into a node clears it out\n\t\t\tif (dom.vnodes == null) dom.textContent = \"\"\n\t\t\tvnodes = Vnode.normalizeChildren(Array.isArray(vnodes) ? vnodes : [vnodes])\n\t\t\tupdateNodes(dom, dom.vnodes, vnodes, hooks, null, namespace === \"http://www.w3.org/1999/xhtml\" ? undefined : namespace)\n\t\t\tdom.vnodes = vnodes\n\t\t\t// `document.activeElement` can return null: https://html.spec.whatwg.org/multipage/interaction.html#dom-document-activeelement\n\t\t\tif (active != null && activeElement(dom) !== active && typeof active.focus === \"function\") active.focus()\n\t\t\tfor (var i = 0; i < hooks.length; i++) hooks[i]()\n\t\t} finally {\n\t\t\tcurrentRedraw = prevRedraw\n\t\t\tcurrentDOM = prevDOM\n\t\t}\n\t}\n}\n","\"use strict\"\n\nmodule.exports = require(\"./render/render\")()\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\n\nmodule.exports = function(render, schedule, console) {\n\tvar subscriptions = []\n\tvar pending = false\n\tvar offset = -1\n\n\tfunction sync() {\n\t\tfor (offset = 0; offset < subscriptions.length; offset += 2) {\n\t\t\ttry { render(subscriptions[offset], Vnode(subscriptions[offset + 1]), redraw) }\n\t\t\tcatch (e) { console.error(e) }\n\t\t}\n\t\toffset = -1\n\t}\n\n\tfunction redraw() {\n\t\tif (!pending) {\n\t\t\tpending = true\n\t\t\tschedule(function() {\n\t\t\t\tpending = false\n\t\t\t\tsync()\n\t\t\t})\n\t\t}\n\t}\n\n\tredraw.sync = sync\n\n\tfunction mount(root, component) {\n\t\tif (component != null && component.view == null && typeof component !== \"function\") {\n\t\t\tthrow new TypeError(\"m.mount expects a component, not a vnode.\")\n\t\t}\n\n\t\tvar index = subscriptions.indexOf(root)\n\t\tif (index >= 0) {\n\t\t\tsubscriptions.splice(index, 2)\n\t\t\tif (index <= offset) offset -= 2\n\t\t\trender(root, [])\n\t\t}\n\n\t\tif (component != null) {\n\t\t\tsubscriptions.push(root, component)\n\t\t\trender(root, Vnode(component), redraw)\n\t\t}\n\t}\n\n\treturn {mount: mount, redraw: redraw}\n}\n","\"use strict\"\n\nvar render = require(\"./render\")\n\nmodule.exports = require(\"./api/mount-redraw\")(render, typeof requestAnimationFrame !== \"undefined\" ? requestAnimationFrame : null, typeof console !== \"undefined\" ? console : null)\n","\"use strict\"\n\nmodule.exports = function(object) {\n\tif (Object.prototype.toString.call(object) !== \"[object Object]\") return \"\"\n\n\tvar args = []\n\tfor (var key in object) {\n\t\tdestructure(key, object[key])\n\t}\n\n\treturn args.join(\"&\")\n\n\tfunction destructure(key, value) {\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (var i = 0; i < value.length; i++) {\n\t\t\t\tdestructure(key + \"[\" + i + \"]\", value[i])\n\t\t\t}\n\t\t}\n\t\telse if (Object.prototype.toString.call(value) === \"[object Object]\") {\n\t\t\tfor (var i in value) {\n\t\t\t\tdestructure(key + \"[\" + i + \"]\", value[i])\n\t\t\t}\n\t\t}\n\t\telse args.push(encodeURIComponent(key) + (value != null && value !== \"\" ? \"=\" + encodeURIComponent(value) : \"\"))\n\t}\n}\n","\"use strict\"\n\nvar buildQueryString = require(\"../querystring/build\")\n\n// Returns `path` from `template` + `params`\nmodule.exports = function(template, params) {\n\tif ((/:([^\\/\\.-]+)(\\.{3})?:/).test(template)) {\n\t\tthrow new SyntaxError(\"Template parameter names must be separated by either a '/', '-', or '.'.\")\n\t}\n\tif (params == null) return template\n\tvar queryIndex = template.indexOf(\"?\")\n\tvar hashIndex = template.indexOf(\"#\")\n\tvar queryEnd = hashIndex < 0 ? template.length : hashIndex\n\tvar pathEnd = queryIndex < 0 ? queryEnd : queryIndex\n\tvar path = template.slice(0, pathEnd)\n\tvar query = {}\n\n\tObject.assign(query, params)\n\n\tvar resolved = path.replace(/:([^\\/\\.-]+)(\\.{3})?/g, function(m, key, variadic) {\n\t\tdelete query[key]\n\t\t// If no such parameter exists, don't interpolate it.\n\t\tif (params[key] == null) return m\n\t\t// Escape normal parameters, but not variadic ones.\n\t\treturn variadic ? params[key] : encodeURIComponent(String(params[key]))\n\t})\n\n\t// In case the template substitution adds new query/hash parameters.\n\tvar newQueryIndex = resolved.indexOf(\"?\")\n\tvar newHashIndex = resolved.indexOf(\"#\")\n\tvar newQueryEnd = newHashIndex < 0 ? resolved.length : newHashIndex\n\tvar newPathEnd = newQueryIndex < 0 ? newQueryEnd : newQueryIndex\n\tvar result = resolved.slice(0, newPathEnd)\n\n\tif (queryIndex >= 0) result += template.slice(queryIndex, queryEnd)\n\tif (newQueryIndex >= 0) result += (queryIndex < 0 ? \"?\" : \"&\") + resolved.slice(newQueryIndex, newQueryEnd)\n\tvar querystring = buildQueryString(query)\n\tif (querystring) result += (queryIndex < 0 && newQueryIndex < 0 ? \"?\" : \"&\") + querystring\n\tif (hashIndex >= 0) result += template.slice(hashIndex)\n\tif (newHashIndex >= 0) result += (hashIndex < 0 ? \"\" : \"&\") + resolved.slice(newHashIndex)\n\treturn result\n}\n","\"use strict\"\n\nvar buildPathname = require(\"../pathname/build\")\nvar hasOwn = require(\"../util/hasOwn\")\n\nmodule.exports = function($window, oncompletion) {\n\tfunction PromiseProxy(executor) {\n\t\treturn new Promise(executor)\n\t}\n\n\tfunction makeRequest(url, args) {\n\t\treturn new Promise(function(resolve, reject) {\n\t\t\turl = buildPathname(url, args.params)\n\t\t\tvar method = args.method != null ? args.method.toUpperCase() : \"GET\"\n\t\t\tvar body = args.body\n\t\t\tvar assumeJSON = (args.serialize == null || args.serialize === JSON.serialize) && !(body instanceof $window.FormData || body instanceof $window.URLSearchParams)\n\t\t\tvar responseType = args.responseType || (typeof args.extract === \"function\" ? \"\" : \"json\")\n\n\t\t\tvar xhr = new $window.XMLHttpRequest(), aborted = false, isTimeout = false\n\t\t\tvar original = xhr, replacedAbort\n\t\t\tvar abort = xhr.abort\n\n\t\t\txhr.abort = function() {\n\t\t\t\taborted = true\n\t\t\t\tabort.call(this)\n\t\t\t}\n\n\t\t\txhr.open(method, url, args.async !== false, typeof args.user === \"string\" ? args.user : undefined, typeof args.password === \"string\" ? args.password : undefined)\n\n\t\t\tif (assumeJSON && body != null && !hasHeader(args, \"content-type\")) {\n\t\t\t\txhr.setRequestHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n\t\t\t}\n\t\t\tif (typeof args.deserialize !== \"function\" && !hasHeader(args, \"accept\")) {\n\t\t\t\txhr.setRequestHeader(\"Accept\", \"application/json, text/*\")\n\t\t\t}\n\t\t\tif (args.withCredentials) xhr.withCredentials = args.withCredentials\n\t\t\tif (args.timeout) xhr.timeout = args.timeout\n\t\t\txhr.responseType = responseType\n\n\t\t\tfor (var key in args.headers) {\n\t\t\t\tif (hasOwn.call(args.headers, key)) {\n\t\t\t\t\txhr.setRequestHeader(key, args.headers[key])\n\t\t\t\t}\n\t\t\t}\n\n\t\t\txhr.onreadystatechange = function(ev) {\n\t\t\t\t// Don't throw errors on xhr.abort().\n\t\t\t\tif (aborted) return\n\n\t\t\t\tif (ev.target.readyState === 4) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar success = (ev.target.status >= 200 && ev.target.status < 300) || ev.target.status === 304 || (/^file:\\/\\//i).test(url)\n\t\t\t\t\t\t// When the response type isn't \"\" or \"text\",\n\t\t\t\t\t\t// `xhr.responseText` is the wrong thing to use.\n\t\t\t\t\t\t// Browsers do the right thing and throw here, and we\n\t\t\t\t\t\t// should honor that and do the right thing by\n\t\t\t\t\t\t// preferring `xhr.response` where possible/practical.\n\t\t\t\t\t\tvar response = ev.target.response, message\n\n\t\t\t\t\t\tif (responseType === \"json\") {\n\t\t\t\t\t\t\t// For IE and Edge, which don't implement\n\t\t\t\t\t\t\t// `responseType: \"json\"`.\n\t\t\t\t\t\t\tif (!ev.target.responseType && typeof args.extract !== \"function\") {\n\t\t\t\t\t\t\t\t// Handle no-content which will not parse.\n\t\t\t\t\t\t\t\ttry { response = JSON.parse(ev.target.responseText) }\n\t\t\t\t\t\t\t\tcatch (e) { response = null }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (!responseType || responseType === \"text\") {\n\t\t\t\t\t\t\t// Only use this default if it's text. If a parsed\n\t\t\t\t\t\t\t// document is needed on old IE and friends (all\n\t\t\t\t\t\t\t// unsupported), the user should use a custom\n\t\t\t\t\t\t\t// `config` instead. They're already using this at\n\t\t\t\t\t\t\t// their own risk.\n\t\t\t\t\t\t\tif (response == null) response = ev.target.responseText\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (typeof args.extract === \"function\") {\n\t\t\t\t\t\t\tresponse = args.extract(ev.target, args)\n\t\t\t\t\t\t\tsuccess = true\n\t\t\t\t\t\t} else if (typeof args.deserialize === \"function\") {\n\t\t\t\t\t\t\tresponse = args.deserialize(response)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (success) {\n\t\t\t\t\t\t\tif (typeof args.type === \"function\") {\n\t\t\t\t\t\t\t\tif (Array.isArray(response)) {\n\t\t\t\t\t\t\t\t\tfor (var i = 0; i < response.length; i++) {\n\t\t\t\t\t\t\t\t\t\tresponse[i] = new args.type(response[i])\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse response = new args.type(response)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresolve(response)\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tvar completeErrorResponse = function() {\n\t\t\t\t\t\t\t\ttry { message = ev.target.responseText }\n\t\t\t\t\t\t\t\tcatch (e) { message = response }\n\t\t\t\t\t\t\t\tvar error = new Error(message)\n\t\t\t\t\t\t\t\terror.code = ev.target.status\n\t\t\t\t\t\t\t\terror.response = response\n\t\t\t\t\t\t\t\treject(error)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (xhr.status === 0) {\n\t\t\t\t\t\t\t\t// Use setTimeout to push this code block onto the event queue\n\t\t\t\t\t\t\t\t// This allows `xhr.ontimeout` to run in the case that there is a timeout\n\t\t\t\t\t\t\t\t// Without this setTimeout, `xhr.ontimeout` doesn't have a chance to reject\n\t\t\t\t\t\t\t\t// as `xhr.onreadystatechange` will run before it\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tif (isTimeout) return\n\t\t\t\t\t\t\t\t\tcompleteErrorResponse()\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t} else completeErrorResponse()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e) {\n\t\t\t\t\t\treject(e)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\txhr.ontimeout = function (ev) {\n\t\t\t\tisTimeout = true\n\t\t\t\tvar error = new Error(\"Request timed out\")\n\t\t\t\terror.code = ev.target.status\n\t\t\t\treject(error)\n\t\t\t}\n\n\t\t\tif (typeof args.config === \"function\") {\n\t\t\t\txhr = args.config(xhr, args, url) || xhr\n\n\t\t\t\t// Propagate the `abort` to any replacement XHR as well.\n\t\t\t\tif (xhr !== original) {\n\t\t\t\t\treplacedAbort = xhr.abort\n\t\t\t\t\txhr.abort = function() {\n\t\t\t\t\t\taborted = true\n\t\t\t\t\t\treplacedAbort.call(this)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (body == null) xhr.send()\n\t\t\telse if (typeof args.serialize === \"function\") xhr.send(args.serialize(body))\n\t\t\telse if (body instanceof $window.FormData || body instanceof $window.URLSearchParams) xhr.send(body)\n\t\t\telse xhr.send(JSON.stringify(body))\n\t\t})\n\t}\n\n\t// In case the global Promise is some userland library's where they rely on\n\t// `foo instanceof this.constructor`, `this.constructor.resolve(value)`, or\n\t// similar. Let's *not* break them.\n\tPromiseProxy.prototype = Promise.prototype\n\tPromiseProxy.__proto__ = Promise // eslint-disable-line no-proto\n\n\tfunction hasHeader(args, name) {\n\t\tfor (var key in args.headers) {\n\t\t\tif (hasOwn.call(args.headers, key) && key.toLowerCase() === name) return true\n\t\t}\n\t\treturn false\n\t}\n\n\treturn {\n\t\trequest: function(url, args) {\n\t\t\tif (typeof url !== \"string\") { args = url; url = url.url }\n\t\t\telse if (args == null) args = {}\n\t\t\tvar promise = makeRequest(url, args)\n\t\t\tif (args.background === true) return promise\n\t\t\tvar count = 0\n\t\t\tfunction complete() {\n\t\t\t\tif (--count === 0 && typeof oncompletion === \"function\") oncompletion()\n\t\t\t}\n\n\t\t\treturn wrap(promise)\n\n\t\t\tfunction wrap(promise) {\n\t\t\t\tvar then = promise.then\n\t\t\t\t// Set the constructor, so engines know to not await or resolve\n\t\t\t\t// this as a native promise. At the time of writing, this is\n\t\t\t\t// only necessary for V8, but their behavior is the correct\n\t\t\t\t// behavior per spec. See this spec issue for more details:\n\t\t\t\t// https://github.com/tc39/ecma262/issues/1577. Also, see the\n\t\t\t\t// corresponding comment in `request/tests/test-request.js` for\n\t\t\t\t// a bit more background on the issue at hand.\n\t\t\t\tpromise.constructor = PromiseProxy\n\t\t\t\tpromise.then = function() {\n\t\t\t\t\tcount++\n\t\t\t\t\tvar next = then.apply(promise, arguments)\n\t\t\t\t\tnext.then(complete, function(e) {\n\t\t\t\t\t\tcomplete()\n\t\t\t\t\t\tif (count === 0) throw e\n\t\t\t\t\t})\n\t\t\t\t\treturn wrap(next)\n\t\t\t\t}\n\t\t\t\treturn promise\n\t\t\t}\n\t\t}\n\t}\n}\n","\"use strict\"\n\nvar mountRedraw = require(\"./mount-redraw\")\n\nmodule.exports = require(\"./request/request\")(typeof window !== \"undefined\" ? window : null, mountRedraw.redraw)\n","\"use strict\"\n\n/*\nPercent encodings encode UTF-8 bytes, so this regexp needs to match that.\nHere's how UTF-8 encodes stuff:\n- `00-7F`: 1-byte, for U+0000-U+007F\n- `C2-DF 80-BF`: 2-byte, for U+0080-U+07FF\n- `E0-EF 80-BF 80-BF`: 3-byte, encodes U+0800-U+FFFF\n- `F0-F4 80-BF 80-BF 80-BF`: 4-byte, encodes U+10000-U+10FFFF\nIn this, there's a number of invalid byte sequences:\n- `80-BF`: Continuation byte, invalid as start\n- `C0-C1 80-BF`: Overlong encoding for U+0000-U+007F\n- `E0 80-9F 80-BF`: Overlong encoding for U+0080-U+07FF\n- `ED A0-BF 80-BF`: Encoding for UTF-16 surrogate U+D800-U+DFFF\n- `F0 80-8F 80-BF 80-BF`: Overlong encoding for U+0800-U+FFFF\n- `F4 90-BF`: RFC 3629 restricted UTF-8 to only code points UTF-16 could encode.\n- `F5-FF`: RFC 3629 restricted UTF-8 to only code points UTF-16 could encode.\nSo in reality, only the following sequences can encode are valid characters:\n- 00-7F\n- C2-DF 80-BF\n- E0 A0-BF 80-BF\n- E1-EC 80-BF 80-BF\n- ED 80-9F 80-BF\n- EE-EF 80-BF 80-BF\n- F0 90-BF 80-BF 80-BF\n- F1-F3 80-BF 80-BF 80-BF\n- F4 80-8F 80-BF 80-BF\n\nThe regexp just tries to match this as compactly as possible.\n*/\nvar validUtf8Encodings = /%(?:[0-7]|(?!c[01]|e0%[89]|ed%[ab]|f0%8|f4%[9ab])(?:c|d|(?:e|f[0-4]%[89ab])[\\da-f]%[89ab])[\\da-f]%[89ab])[\\da-f]/gi\n\nmodule.exports = function(str) {\n\treturn String(str).replace(validUtf8Encodings, decodeURIComponent)\n}\n","\"use strict\"\n\nvar decodeURIComponentSafe = require(\"../util/decodeURIComponentSafe\")\n\nmodule.exports = function(string) {\n\tif (string === \"\" || string == null) return {}\n\tif (string.charAt(0) === \"?\") string = string.slice(1)\n\n\tvar entries = string.split(\"&\"), counters = {}, data = {}\n\tfor (var i = 0; i < entries.length; i++) {\n\t\tvar entry = entries[i].split(\"=\")\n\t\tvar key = decodeURIComponentSafe(entry[0])\n\t\tvar value = entry.length === 2 ? decodeURIComponentSafe(entry[1]) : \"\"\n\n\t\tif (value === \"true\") value = true\n\t\telse if (value === \"false\") value = false\n\n\t\tvar levels = key.split(/\\]\\[?|\\[/)\n\t\tvar cursor = data\n\t\tif (key.indexOf(\"[\") > -1) levels.pop()\n\t\tfor (var j = 0; j < levels.length; j++) {\n\t\t\tvar level = levels[j], nextLevel = levels[j + 1]\n\t\t\tvar isNumber = nextLevel == \"\" || !isNaN(parseInt(nextLevel, 10))\n\t\t\tif (level === \"\") {\n\t\t\t\tvar key = levels.slice(0, j).join()\n\t\t\t\tif (counters[key] == null) {\n\t\t\t\t\tcounters[key] = Array.isArray(cursor) ? cursor.length : 0\n\t\t\t\t}\n\t\t\t\tlevel = counters[key]++\n\t\t\t}\n\t\t\t// Disallow direct prototype pollution\n\t\t\telse if (level === \"__proto__\") break\n\t\t\tif (j === levels.length - 1) cursor[level] = value\n\t\t\telse {\n\t\t\t\t// Read own properties exclusively to disallow indirect\n\t\t\t\t// prototype pollution\n\t\t\t\tvar desc = Object.getOwnPropertyDescriptor(cursor, level)\n\t\t\t\tif (desc != null) desc = desc.value\n\t\t\t\tif (desc == null) cursor[level] = desc = isNumber ? [] : {}\n\t\t\t\tcursor = desc\n\t\t\t}\n\t\t}\n\t}\n\treturn data\n}\n","\"use strict\"\n\nvar parseQueryString = require(\"../querystring/parse\")\n\n// Returns `{path, params}` from `url`\nmodule.exports = function(url) {\n\tvar queryIndex = url.indexOf(\"?\")\n\tvar hashIndex = url.indexOf(\"#\")\n\tvar queryEnd = hashIndex < 0 ? url.length : hashIndex\n\tvar pathEnd = queryIndex < 0 ? queryEnd : queryIndex\n\tvar path = url.slice(0, pathEnd).replace(/\\/{2,}/g, \"/\")\n\n\tif (!path) path = \"/\"\n\telse {\n\t\tif (path[0] !== \"/\") path = \"/\" + path\n\t}\n\treturn {\n\t\tpath: path,\n\t\tparams: queryIndex < 0\n\t\t\t? {}\n\t\t\t: parseQueryString(url.slice(queryIndex + 1, queryEnd)),\n\t}\n}\n","\"use strict\"\n\nvar parsePathname = require(\"./parse\")\n\n// Compiles a template into a function that takes a resolved path (without query\n// strings) and returns an object containing the template parameters with their\n// parsed values. This expects the input of the compiled template to be the\n// output of `parsePathname`. Note that it does *not* remove query parameters\n// specified in the template.\nmodule.exports = function(template) {\n\tvar templateData = parsePathname(template)\n\tvar templateKeys = Object.keys(templateData.params)\n\tvar keys = []\n\tvar regexp = new RegExp(\"^\" + templateData.path.replace(\n\t\t// I escape literal text so people can use things like `:file.:ext` or\n\t\t// `:lang-:locale` in routes. This is all merged into one pass so I\n\t\t// don't also accidentally escape `-` and make it harder to detect it to\n\t\t// ban it from template parameters.\n\t\t/:([^\\/.-]+)(\\.{3}|\\.(?!\\.)|-)?|[\\\\^$*+.()|\\[\\]{}]/g,\n\t\tfunction(m, key, extra) {\n\t\t\tif (key == null) return \"\\\\\" + m\n\t\t\tkeys.push({k: key, r: extra === \"...\"})\n\t\t\tif (extra === \"...\") return \"(.*)\"\n\t\t\tif (extra === \".\") return \"([^/]+)\\\\.\"\n\t\t\treturn \"([^/]+)\" + (extra || \"\")\n\t\t}\n\t) + \"\\\\/?$\")\n\treturn function(data) {\n\t\t// First, check the params. Usually, there isn't any, and it's just\n\t\t// checking a static set.\n\t\tfor (var i = 0; i < templateKeys.length; i++) {\n\t\t\tif (templateData.params[templateKeys[i]] !== data.params[templateKeys[i]]) return false\n\t\t}\n\t\t// If no interpolations exist, let's skip all the ceremony\n\t\tif (!keys.length) return regexp.test(data.path)\n\t\tvar values = regexp.exec(data.path)\n\t\tif (values == null) return false\n\t\tfor (var i = 0; i < keys.length; i++) {\n\t\t\tdata.params[keys[i].k] = keys[i].r ? values[i + 1] : decodeURIComponent(values[i + 1])\n\t\t}\n\t\treturn true\n\t}\n}\n","\"use strict\"\n\n// Note: this is mildly perf-sensitive.\n//\n// It does *not* use `delete` - dynamic `delete`s usually cause objects to bail\n// out into dictionary mode and just generally cause a bunch of optimization\n// issues within engines.\n//\n// Ideally, I would've preferred to do this, if it weren't for the optimization\n// issues:\n//\n// ```js\n// const hasOwn = require(\"./hasOwn\")\n// const magic = [\n// \"key\", \"oninit\", \"oncreate\", \"onbeforeupdate\", \"onupdate\",\n// \"onbeforeremove\", \"onremove\",\n// ]\n// module.exports = (attrs, extras) => {\n// const result = Object.assign(Object.create(null), attrs)\n// for (const key of magic) delete result[key]\n// if (extras != null) for (const key of extras) delete result[key]\n// return result\n// }\n// ```\n\nvar hasOwn = require(\"./hasOwn\")\nvar magic = /^(?:key|oninit|oncreate|onbeforeupdate|onupdate|onbeforeremove|onremove)$/\n\nmodule.exports = function(attrs, extras) {\n\tvar result = {}\n\n\tif (extras != null) {\n\t\tfor (var key in attrs) {\n\t\t\tif (hasOwn.call(attrs, key) && !magic.test(key) && extras.indexOf(key) < 0) {\n\t\t\t\tresult[key] = attrs[key]\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (var key in attrs) {\n\t\t\tif (hasOwn.call(attrs, key) && !magic.test(key)) {\n\t\t\t\tresult[key] = attrs[key]\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result\n}\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\nvar hyperscript = require(\"../render/hyperscript\")\n\nvar decodeURIComponentSafe = require(\"../util/decodeURIComponentSafe\")\nvar buildPathname = require(\"../pathname/build\")\nvar parsePathname = require(\"../pathname/parse\")\nvar compileTemplate = require(\"../pathname/compileTemplate\")\nvar censor = require(\"../util/censor\")\n\nmodule.exports = function($window, mountRedraw) {\n\tvar p = Promise.resolve()\n\n\tvar scheduled = false\n\n\tvar ready = false\n\tvar hasBeenResolved = false\n\n\tvar dom, compiled, fallbackRoute\n\n\tvar currentResolver, component, attrs, currentPath, lastUpdate\n\n\tvar RouterRoot = {\n\t\tonremove: function() {\n\t\t\tready = hasBeenResolved = false\n\t\t\t$window.removeEventListener(\"popstate\", fireAsync, false)\n\t\t},\n\t\tview: function() {\n\t\t\t// The route has already been resolved.\n\t\t\t// Therefore, the following early return is not needed.\n\t\t\t// if (!hasBeenResolved) return\n\n\t\t\tvar vnode = Vnode(component, attrs.key, attrs)\n\t\t\tif (currentResolver) return currentResolver.render(vnode)\n\t\t\t// Wrap in a fragment to preserve existing key semantics\n\t\t\treturn [vnode]\n\t\t},\n\t}\n\n\tvar SKIP = route.SKIP = {}\n\n\tfunction resolveRoute() {\n\t\tscheduled = false\n\t\t// Consider the pathname holistically. The prefix might even be invalid,\n\t\t// but that's not our problem.\n\t\tvar prefix = $window.location.hash\n\t\tif (route.prefix[0] !== \"#\") {\n\t\t\tprefix = $window.location.search + prefix\n\t\t\tif (route.prefix[0] !== \"?\") {\n\t\t\t\tprefix = $window.location.pathname + prefix\n\t\t\t\tif (prefix[0] !== \"/\") prefix = \"/\" + prefix\n\t\t\t}\n\t\t}\n\t\tvar path = decodeURIComponentSafe(prefix).slice(route.prefix.length)\n\t\tvar data = parsePathname(path)\n\n\t\tObject.assign(data.params, $window.history.state)\n\n\t\tfunction reject(e) {\n\t\t\tconsole.error(e)\n\t\t\troute.set(fallbackRoute, null, {replace: true})\n\t\t}\n\n\t\tloop(0)\n\t\tfunction loop(i) {\n\t\t\tfor (; i < compiled.length; i++) {\n\t\t\t\tif (compiled[i].check(data)) {\n\t\t\t\t\tvar payload = compiled[i].component\n\t\t\t\t\tvar matchedRoute = compiled[i].route\n\t\t\t\t\tvar localComp = payload\n\t\t\t\t\tvar update = lastUpdate = function(comp) {\n\t\t\t\t\t\tif (update !== lastUpdate) return\n\t\t\t\t\t\tif (comp === SKIP) return loop(i + 1)\n\t\t\t\t\t\tcomponent = comp != null && (typeof comp.view === \"function\" || typeof comp === \"function\")? comp : \"div\"\n\t\t\t\t\t\tattrs = data.params, currentPath = path, lastUpdate = null\n\t\t\t\t\t\tcurrentResolver = payload.render ? payload : null\n\t\t\t\t\t\tif (hasBeenResolved) mountRedraw.redraw()\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\thasBeenResolved = true\n\t\t\t\t\t\t\tmountRedraw.mount(dom, RouterRoot)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// There's no understating how much I *wish* I could\n\t\t\t\t\t// use `async`/`await` here...\n\t\t\t\t\tif (payload.view || typeof payload === \"function\") {\n\t\t\t\t\t\tpayload = {}\n\t\t\t\t\t\tupdate(localComp)\n\t\t\t\t\t}\n\t\t\t\t\telse if (payload.onmatch) {\n\t\t\t\t\t\tp.then(function () {\n\t\t\t\t\t\t\treturn payload.onmatch(data.params, path, matchedRoute)\n\t\t\t\t\t\t}).then(update, path === fallbackRoute ? null : reject)\n\t\t\t\t\t}\n\t\t\t\t\telse update(/* \"div\" */)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (path === fallbackRoute) {\n\t\t\t\tthrow new Error(\"Could not resolve default route \" + fallbackRoute + \".\")\n\t\t\t}\n\t\t\troute.set(fallbackRoute, null, {replace: true})\n\t\t}\n\t}\n\n\tfunction fireAsync() {\n\t\tif (!scheduled) {\n\t\t\tscheduled = true\n\t\t\t// TODO: just do `mountRedraw.redraw()` here and elide the timer\n\t\t\t// dependency. Note that this will muck with tests a *lot*, so it's\n\t\t\t// not as easy of a change as it sounds.\n\t\t\tsetTimeout(resolveRoute)\n\t\t}\n\t}\n\n\tfunction route(root, defaultRoute, routes) {\n\t\tif (!root) throw new TypeError(\"DOM element being rendered to does not exist.\")\n\n\t\tcompiled = Object.keys(routes).map(function(route) {\n\t\t\tif (route[0] !== \"/\") throw new SyntaxError(\"Routes must start with a '/'.\")\n\t\t\tif ((/:([^\\/\\.-]+)(\\.{3})?:/).test(route)) {\n\t\t\t\tthrow new SyntaxError(\"Route parameter names must be separated with either '/', '.', or '-'.\")\n\t\t\t}\n\t\t\treturn {\n\t\t\t\troute: route,\n\t\t\t\tcomponent: routes[route],\n\t\t\t\tcheck: compileTemplate(route),\n\t\t\t}\n\t\t})\n\t\tfallbackRoute = defaultRoute\n\t\tif (defaultRoute != null) {\n\t\t\tvar defaultData = parsePathname(defaultRoute)\n\n\t\t\tif (!compiled.some(function (i) { return i.check(defaultData) })) {\n\t\t\t\tthrow new ReferenceError(\"Default route doesn't match any known routes.\")\n\t\t\t}\n\t\t}\n\t\tdom = root\n\n\t\t$window.addEventListener(\"popstate\", fireAsync, false)\n\n\t\tready = true\n\n\t\t// The RouterRoot component is mounted when the route is first resolved.\n\t\tresolveRoute()\n\t}\n\troute.set = function(path, data, options) {\n\t\tif (lastUpdate != null) {\n\t\t\toptions = options || {}\n\t\t\toptions.replace = true\n\t\t}\n\t\tlastUpdate = null\n\n\t\tpath = buildPathname(path, data)\n\t\tif (ready) {\n\t\t\tfireAsync()\n\t\t\tvar state = options ? options.state : null\n\t\t\tvar title = options ? options.title : null\n\t\t\tif (options && options.replace) $window.history.replaceState(state, title, route.prefix + path)\n\t\t\telse $window.history.pushState(state, title, route.prefix + path)\n\t\t}\n\t\telse {\n\t\t\t$window.location.href = route.prefix + path\n\t\t}\n\t}\n\troute.get = function() {return currentPath}\n\troute.prefix = \"#!\"\n\troute.Link = {\n\t\tview: function(vnode) {\n\t\t\t// Omit the used parameters from the rendered element - they are\n\t\t\t// internal. Also, censor the various lifecycle methods.\n\t\t\t//\n\t\t\t// We don't strip the other parameters because for convenience we\n\t\t\t// let them be specified in the selector as well.\n\t\t\tvar child = hyperscript(\n\t\t\t\tvnode.attrs.selector || \"a\",\n\t\t\t\tcensor(vnode.attrs, [\"options\", \"params\", \"selector\", \"onclick\"]),\n\t\t\t\tvnode.children\n\t\t\t)\n\t\t\tvar options, onclick, href\n\n\t\t\t// Let's provide a *right* way to disable a route link, rather than\n\t\t\t// letting people screw up accessibility on accident.\n\t\t\t//\n\t\t\t// The attribute is coerced so users don't get surprised over\n\t\t\t// `disabled: 0` resulting in a button that's somehow routable\n\t\t\t// despite being visibly disabled.\n\t\t\tif (child.attrs.disabled = Boolean(child.attrs.disabled)) {\n\t\t\t\tchild.attrs.href = null\n\t\t\t\tchild.attrs[\"aria-disabled\"] = \"true\"\n\t\t\t\t// If you *really* do want add `onclick` on a disabled link, use\n\t\t\t\t// an `oncreate` hook to add it.\n\t\t\t} else {\n\t\t\t\toptions = vnode.attrs.options\n\t\t\t\tonclick = vnode.attrs.onclick\n\t\t\t\t// Easier to build it now to keep it isomorphic.\n\t\t\t\thref = buildPathname(child.attrs.href, vnode.attrs.params)\n\t\t\t\tchild.attrs.href = route.prefix + href\n\t\t\t\tchild.attrs.onclick = function(e) {\n\t\t\t\t\tvar result\n\t\t\t\t\tif (typeof onclick === \"function\") {\n\t\t\t\t\t\tresult = onclick.call(e.currentTarget, e)\n\t\t\t\t\t} else if (onclick == null || typeof onclick !== \"object\") {\n\t\t\t\t\t\t// do nothing\n\t\t\t\t\t} else if (typeof onclick.handleEvent === \"function\") {\n\t\t\t\t\t\tonclick.handleEvent(e)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Adapted from React Router's implementation:\n\t\t\t\t\t// https://github.com/ReactTraining/react-router/blob/520a0acd48ae1b066eb0b07d6d4d1790a1d02482/packages/react-router-dom/modules/Link.js\n\t\t\t\t\t//\n\t\t\t\t\t// Try to be flexible and intuitive in how we handle links.\n\t\t\t\t\t// Fun fact: links aren't as obvious to get right as you\n\t\t\t\t\t// would expect. There's a lot more valid ways to click a\n\t\t\t\t\t// link than this, and one might want to not simply click a\n\t\t\t\t\t// link, but right click or command-click it to copy the\n\t\t\t\t\t// link target, etc. Nope, this isn't just for blind people.\n\t\t\t\t\tif (\n\t\t\t\t\t\t// Skip if `onclick` prevented default\n\t\t\t\t\t\tresult !== false && !e.defaultPrevented &&\n\t\t\t\t\t\t// Ignore everything but left clicks\n\t\t\t\t\t\t(e.button === 0 || e.which === 0 || e.which === 1) &&\n\t\t\t\t\t\t// Let the browser handle `target=_blank`, etc.\n\t\t\t\t\t\t(!e.currentTarget.target || e.currentTarget.target === \"_self\") &&\n\t\t\t\t\t\t// No modifier keys\n\t\t\t\t\t\t!e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey\n\t\t\t\t\t) {\n\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\te.redraw = false\n\t\t\t\t\t\troute.set(href, null, options)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn child\n\t\t},\n\t}\n\troute.param = function(key) {\n\t\treturn attrs && key != null ? attrs[key] : attrs\n\t}\n\n\treturn route\n}\n","\"use strict\"\n\nvar mountRedraw = require(\"./mount-redraw\")\n\nmodule.exports = require(\"./api/router\")(typeof window !== \"undefined\" ? window : null, mountRedraw)\n","\"use strict\"\n\nvar hyperscript = require(\"./hyperscript\")\nvar mountRedraw = require(\"./mount-redraw\")\nvar request = require(\"./request\")\nvar router = require(\"./route\")\n\nvar m = function m() { return hyperscript.apply(this, arguments) }\nm.m = hyperscript\nm.trust = hyperscript.trust\nm.fragment = hyperscript.fragment\nm.Fragment = \"[\"\nm.mount = mountRedraw.mount\nm.route = router\nm.render = require(\"./render\")\nm.redraw = mountRedraw.redraw\nm.request = request.request\nm.parseQueryString = require(\"./querystring/parse\")\nm.buildQueryString = require(\"./querystring/build\")\nm.parsePathname = require(\"./pathname/parse\")\nm.buildPathname = require(\"./pathname/build\")\nm.vnode = require(\"./render/vnode\")\nm.censor = require(\"./util/censor\")\nm.domFor = require(\"./render/domFor\")\n\nmodule.exports = m\n","import { Attributes, Children, FactoryComponent, default as m, Vnode } from 'mithril'\n\n/**\n * Bar component model\n * @public\n */\nexport type BarAttrs = Attributes & {\n /**\n * Custom CSS Style\n */\n style?: Partial<CSSStyleDeclaration>\n\n /**\n * Start children\n */\n start?: Children\n\n /**\n * End children\n */\n end?: Children\n}\n\nexport function uiBar<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(BarComponent, attrs, children)\n}\n\nexport function uiBarStart<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(BarStartComponent, attrs, children)\n}\n\nexport function uiBarEnd<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(BarEndComponent, attrs, children)\n}\n\nexport function uiBarContent<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(BarContentComponent, attrs, children)\n}\n\nexport const BarComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs: { start, end, ...rest }, children }) => {\n return m('div.twk-bar', rest, [\n start ? m(BarStartComponent, start) : null,\n children,\n end ? m(BarEndComponent, end) : null,\n ])\n },\n }\n}\n\nexport const BarStartComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs, children }) => {\n return m('div.twk-bar-start', attrs, children)\n },\n }\n}\n\nexport const BarEndComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs, children }) => {\n return m('div.twk-bar-end', attrs, children)\n },\n }\n}\n\nexport const BarContentComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs, children }) => {\n return m('div.twk-bar-content', attrs, children)\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\n\n/**\n * Grid component model\n * @public\n */\nexport type GridAttrs = {\n /**\n * Grit template columns specification, e.g. \"1fr 2fr 1fr\" or \"3\"\n */\n columns?: number | string\n /**\n * Grit template rows specification\n */\n rows?: number | string\n /**\n * Custom CSS Style\n */\n style?: Partial<CSSStyleDeclaration>\n}\n\nexport function uiGrid<T>(attrs: GridAttrs, children?: Children): Vnode<GridAttrs> {\n return m(GridComponent, attrs, children)\n}\n\nexport const GridComponent: FactoryComponent<GridAttrs> = () => {\n return {\n view: (node) => {\n const data = node.attrs\n return m(\n 'div.twk-grid',\n {\n style: {\n gridTemplateColumns:\n typeof data.columns === 'number'\n ? `repeat(${data.columns}, 1fr)`\n : data.columns || 'none',\n gridTemplateRows:\n typeof data.rows === 'number' ? `repeat(${data.rows}, 1fr)` : data.rows || 'none',\n ...(data.style || {}),\n },\n },\n node.children,\n )\n },\n }\n}\n","/**\n * Checks if value is a string\n * @internal\n */\nexport function isString(v: any): v is string {\n return typeof v === 'string'\n}\n/**\n * Checks if value is a number\n * @internal\n */\nexport function isNumber(v: any): v is number {\n return typeof v === 'number'\n}\n/**\n * Checks if value is a function\n * @internal\n */\nexport function isFunction(v: any): v is (...args: any[]) => any {\n return typeof v === 'function'\n}\n/**\n * Checks if value is an array\n * @internal\n */\nexport function isArray(v: any): v is any[] {\n return Array.isArray(v)\n}\n/**\n * Checks if value is an object\n * @internal\n */\nexport function isObject(v: any): v is object {\n return v != null && typeof v === 'object' && !isArray(v)\n}\n/**\n * Calls a function if it is not null\n * @internal\n */\nexport function call<T extends (...args: any) => any>(\n cb: T | null | undefined,\n ...args: Parameters<T>\n) {\n return isFunction(cb) ? cb(...args) : null\n}\n\n/**\n * Clamps a number value\n * @internal\n */\nexport function clamp(v: number, min: number, max: number): number {\n if (v != null) {\n if (min != null && v < min) {\n return min\n }\n if (max != null && v > max) {\n return max\n }\n }\n return v\n}\n\nexport type ClassValue =\n | string\n | null\n | undefined\n | false\n | ClassDictionary\n | ClassArray\n | (() => ClassValue)\n\nexport interface ClassDictionary {\n [key: string]: boolean | (() => boolean)\n}\n\nexport interface ClassArray extends Array<ClassValue> {}\n\nexport function uiStyle(\n style: Partial<CSSStyleDeclaration> | undefined,\n): Partial<CSSStyleDeclaration> {\n return style || {}\n}\n\n/**\n * Builds a css class from various argument types\n * @param exp\n */\nexport function uiClass(...args: ClassValue[]): string\nexport function uiClass(): string {\n // common case\n if (arguments.length === 1 && isString(arguments[0])) {\n return arguments[0] as string\n }\n if (arguments.length === 0) {\n return ''\n }\n\n const result: string[] = []\n\n const process = (value: ClassValue): void => {\n if (!value) return\n\n // function\n if (typeof value === 'function') {\n process(value())\n return\n }\n\n // string\n if (typeof value === 'string') {\n if (value) {\n result.push(value)\n }\n return\n }\n\n // array\n if (Array.isArray(value)) {\n for (const v of value) {\n process(v)\n }\n return\n }\n\n // object\n if (typeof value === 'object') {\n for (const key in value) {\n const v = value[key]\n const resolved = typeof v === 'function' ? v() : v\n if (resolved) result.push(key)\n }\n }\n }\n\n for (const arg of arguments) {\n process(arg)\n }\n\n return result.join(' ')\n}\n\n/**\n * Pads a string\n * @internal\n */\nexport function padLeft(value: string, length: number, char: string) {\n while (value.length < length) {\n value = `${char}${value}`\n }\n return value\n}\n\n/**\n * Gets current mouse coordinates from mouse or touch event\n * @internal\n */\nexport function getTouchPoint(e: MouseEvent | TouchEvent): [number, number] {\n let cx = 0\n let cy = 0\n if ('touches' in e) {\n cx = e.touches.item(0)!.pageX\n cy = e.touches.item(0)!.pageY\n } else {\n cx = e.pageX\n cy = e.pageY\n }\n return [cx, cy]\n}\n\nexport function getTouchInTarget(\n e: MouseEvent | TouchEvent,\n target?: HTMLElement | null,\n offset?: [number, number],\n) {\n target = target || (e.target as HTMLElement)\n const rect = target.getBoundingClientRect()\n const tx = window.pageXOffset || document.documentElement.scrollLeft\n const ty = window.pageYOffset || document.documentElement.scrollTop\n\n const cw = target.clientWidth\n const ch = target.clientHeight\n let [cx, cy] = getTouchPoint(e)\n if (offset) {\n cx += offset[0]\n cy += offset[1]\n }\n const x = cx - tx - rect.left\n const y = cy - ty - rect.top\n return {\n width: cw,\n height: ch,\n x: x,\n y: y,\n normalizedX: x / cw,\n normalizedY: y / ch,\n }\n}\n\nexport function dragUtil({\n onStart,\n onMove,\n onEnd,\n}: {\n onStart?: (e: MouseEvent | TouchEvent) => void\n onMove?: (e: MouseEvent | TouchEvent) => void\n onEnd?: (e: MouseEvent | TouchEvent) => void\n}) {\n const util = {\n target: null as HTMLElement | null,\n activate: (e: MouseEvent) => {\n util.deactivate()\n util.target = e.target as HTMLElement\n if (onStart) {\n onStart(e)\n }\n if (onMove) {\n document.addEventListener('mousemove', onMove, { passive: false })\n document.addEventListener('touchmove', onMove, { passive: false })\n }\n if (onEnd) {\n document.addEventListener('mouseup', onEnd)\n document.addEventListener('touchend', onEnd)\n document.addEventListener('touchcancel', onEnd)\n }\n },\n deactivate: () => {\n util.target = null\n if (onMove) {\n document.removeEventListener('mousemove', onMove)\n document.removeEventListener('touchmove', onMove)\n }\n if (onEnd) {\n document.removeEventListener('mouseup', onEnd)\n document.removeEventListener('touchend', onEnd)\n document.removeEventListener('touchcancel', onEnd)\n }\n },\n onStart,\n onMove,\n onEnd,\n }\n return util\n}\n\nexport function eventWithTimout(el: Element, event: string, timeout: number): Promise<boolean> {\n return new Promise((resolve) => {\n let didResolve = false\n const handler = (e: Event) => {\n didResolve = true\n el.removeEventListener(event, handler)\n resolve(true)\n }\n el.addEventListener(event, handler)\n setTimeout(() => {\n el.removeEventListener(event, handler)\n if (!didResolve) {\n didResolve = true\n resolve(false)\n }\n }, timeout)\n })\n}\n","import m, { Child, Children, FactoryComponent, Vnode } from 'mithril'\nimport { ClassValue, eventWithTimout, uiClass } from '../../core/utils'\n\n/**\n * Group component model\n * @public\n */\nexport type GroupAttrs = {\n /**\n * Group icon\n */\n icon?: Child\n /**\n * Group title\n */\n title?: Child\n /**\n * Group CSS Style\n */\n style?: Partial<CSSStyleDeclaration>\n /**\n * Additional CSS class for the group element\n */\n class?: ClassValue\n /**\n * Whether the child elements can be collapsed\n */\n collapsible?: boolean\n /**\n * Whether the child elements are collapsed\n */\n collapsed?: boolean\n /**\n * WHether the group is disabled. Disabled groups can not be expanded.\n */\n disabled?: boolean\n /**\n * Adds an offset to the left side\n */\n inset?: boolean\n /**\n * Is called when this Group has been collapsed or expanded\n */\n onToggle?: (node: Vnode<GroupAttrs>) => void\n /**\n * Is called when this Group has been expanded\n */\n onExpand?: (node: Vnode<GroupAttrs>) => void\n /**\n * Is called when this Group has been collapsed\n */\n onCollapse?: (node: Vnode<GroupAttrs>) => void\n}\n\nexport function uiGroup<T>(attrs: GroupAttrs, children?: Children): Vnode<GroupAttrs> {\n return m(GroupComponent, attrs, children)\n}\n\nexport const GroupComponent: FactoryComponent<GroupAttrs> = () => {\n let title: Child\n let icon: Child\n let collapsible: boolean\n let collapsed: boolean\n let animate = false\n\n function updateState(node: Vnode<GroupAttrs>) {\n const data = node.attrs\n title = data.title || ''\n collapsible = !!data.collapsible\n collapsed ??= !!data.collapsed\n }\n\n function handleToggle() {\n animate = true\n collapsed = !collapsed\n }\n\n function groupTitle() {\n if (!icon && !title && !collapsible) {\n return null\n }\n return m(\n 'div.twk-group-title',\n {\n onclick: collapsible ? handleToggle : undefined,\n },\n icon,\n title,\n )\n }\n\n return {\n oninit: updateState,\n onupdate: updateState,\n view: ({ attrs, children }) => {\n title = attrs.title || ''\n icon = attrs.icon || ''\n collapsible = !!attrs.collapsible\n collapsed ??= !!attrs.collapsed\n return m(\n 'div.twk-group',\n {\n class: uiClass({\n ['twk-group-collapsible']: !!collapsible,\n ['twk-group-collapsed']: !!collapsed,\n }),\n style: attrs.style,\n },\n m.fragment({}, [groupTitle()]),\n collapsed ? null : m(GroupContent, { animate }, children),\n )\n },\n }\n}\n\nconst GroupContent: FactoryComponent<{ animate: boolean }> = () => {\n return {\n onbeforeremove: async ({ dom }) => {\n dom.classList.remove('enter')\n dom.classList.add('leave')\n if (await eventWithTimout(dom, 'animationstart', 50)) {\n await eventWithTimout(dom, 'animationend', 2000)\n }\n },\n view: ({ children, attrs }) => {\n return m(\n 'div.twk-group-content',\n {\n class: uiClass({\n animate: attrs.animate,\n enter: true,\n }),\n },\n children,\n )\n },\n }\n}\n","import m, { Attributes, Children, FactoryComponent, Vnode } from 'mithril'\nimport { StyleAttr } from '../../core'\n\n/**\n * List component model\n * @public\n */\nexport type ListAttrs = Attributes & {\n /**\n * Maps to flex-flow CSS property.\n * @links https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/flex-flow\n */\n flow?: `row` | `column` | string\n /**\n * Maps to flex CSS property.\n * @links https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/flex\n */\n flex?: string | number\n /**\n * Custom CSS Style\n */\n style?: StyleAttr\n}\n\nexport function uiFlex<T>(attrs: ListAttrs, children?: Children): Vnode<ListAttrs> {\n return m(FlexComponent, attrs, children)\n}\n\nexport const FlexComponent: FactoryComponent<ListAttrs> = () => {\n return {\n view: ({ attrs: { flex, flow, style, ...rest }, children }) => {\n return m(\n 'div.twk-flex',\n {\n style: {\n flex: flex ?? 'auto',\n flexFlow: flow || 'column nowrap',\n ...(style || {}),\n },\n ...rest,\n },\n children,\n )\n },\n }\n}\n","import m, { Attributes, Children, FactoryComponent, Vnode } from 'mithril'\n\n/**\n * Page component model\n * @public\n */\nexport type SectionAttrs = Attributes & {\n /**\n * Custom CSS Style\n */\n style?: Partial<CSSStyleDeclaration>\n\n /**\n * Header children\n */\n header?: Children\n\n /**\n * Footer children\n */\n footer?: Children\n}\n\nexport function uiSection<T>(attrs: SectionAttrs, children?: Children): Vnode<SectionAttrs> {\n return m(SectionComponent, attrs, children)\n}\n\nexport function uiSectionHeader<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(SectionHeaderComponent, attrs, children)\n}\n\nexport function uiSectionFooter<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(SectionFooterComponent, attrs, children)\n}\n\nexport function uiSectionContent<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(SectionContentComponent, attrs, children)\n}\n\nexport const SectionComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs: { header, footer, ...rest }, children }) => {\n return m('div.twk-section', rest, [\n header ? m(SectionHeaderComponent, header) : null,\n children,\n footer ? m(SectionFooterComponent, footer) : null,\n ])\n },\n }\n}\n\nexport const SectionHeaderComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs, children }) => {\n return m('header.twk-section-header', attrs, children)\n },\n }\n}\n\nexport const SectionFooterComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs, children }) => {\n return m('footer.twk-section-footer', attrs, children)\n },\n }\n}\n\nexport const SectionContentComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs, children }) => {\n return m('main.twk-section-content', attrs, children)\n },\n }\n}\n","import { TweakableAttrs } from './types'\nimport { isObject } from './utils'\n\n/**\n * Gets a value of a view model\n *\n * @public\n * @param control - The model of a component\n */\nexport function getControlValue<V>(control: TweakableAttrs<any, V>): V {\n return toControl(control, getRawValue(control))\n}\n\n/**\n * Sets a value on a view model\n *\n * @public\n * @param control - The model of a component\n * @param value - The value for the component\n * @returns the encoded value as it was written to the model\n */\nexport function setControlValue<V, R>(control: TweakableAttrs<any, V>, value: V) {\n const raw = fromControl(control, value)\n setRawValue(control, raw)\n return raw\n}\n\nexport function getRawValue(attrs: TweakableAttrs<any, any>) {\n if (attrs.binding) {\n return attrs.binding.get(attrs.value, attrs.field)\n }\n if (attrs.value == null) {\n return null\n }\n if (attrs.field != null) {\n return attrs.value[attrs.field]\n }\n return attrs.value\n}\n\nexport function setRawValue(attrs: TweakableAttrs<any, any>, value: any): void {\n if (attrs.binding) {\n attrs.binding.set?.(value, attrs.value, attrs.field)\n return\n }\n if (attrs.value == null) {\n return\n }\n if (attrs.field) {\n if (!isWriteable(attrs.value, attrs.field)) {\n console.warn(\n `Cannot write value to control model. Property \"${String(attrs.field)}\" is not writeable.`,\n )\n return\n }\n attrs.value[attrs.field] = value\n return\n }\n attrs.value = value\n}\n\nfunction isWriteable<T>(obj: T, key: keyof T): boolean {\n const desc = Object.getOwnPropertyDescriptor(obj, key)\n return !desc || !!desc.writable || !!desc.set\n}\n\nfunction fromControl<Value>(source: TweakableAttrs<unknown, Value>, value: Value): unknown {\n if (source.adapter) {\n return source.adapter.fromControl(value)\n }\n return value\n}\n\nfunction toControl<Value>(source: TweakableAttrs<unknown, Value>, raw: unknown): Value {\n if (source.adapter) {\n return source.adapter.toControl(raw)\n }\n return raw as any\n}\n","import m, { ChildArrayOrPrimitive, Children, FactoryComponent, Vnode } from 'mithril'\nimport { ComponentChildren, ComponentDescriptor } from './types'\n\nexport function isVnode(child: Children): child is Vnode {\n return typeof child === 'object' && child != null && 'tag' in child\n}\n\nexport function mapChildren(\n nodes: ChildArrayOrPrimitive | undefined,\n fn: (child: Vnode, index: number, all: Children[]) => Children,\n) {\n if (Array.isArray(nodes)) {\n return nodes.map((it, i, list) => {\n if (isVnode(it)) {\n return fn(it, i, list)\n }\n return it\n })\n }\n if (isVnode(nodes)) {\n return fn(nodes, 0, [nodes])\n }\n return nodes\n}\n\nexport function renderChildren(children: ComponentChildren): Children {\n if (children == null) {\n return null\n }\n if (typeof children === 'function') {\n return children()\n }\n if (Array.isArray(children)) {\n return children.map((it) => {\n if (isDescriptor(it)) {\n const { component, attributes, children } = it\n return m(component as any, attributes, renderChildren(children || []))\n }\n return it\n })\n }\n return children\n}\n\nfunction isDescriptor(child: any): child is ComponentDescriptor<any> {\n return typeof child === 'object' && child != null && 'component' in child && 'attributes' in child\n}\n\n// prettier-ignore\nexport type LabeledFn<T> =\n & ((opts: T) => Vnode<T> | null)\n & ((label: string, opts: Omit<T, 'label'>) => Vnode<T> | null)\n\nexport function labeledFn<T>(component: FactoryComponent<T>): LabeledFn<T> {\n return () => {\n let attr: T & { label?: string }\n if (arguments.length === 1) {\n attr = arguments[0] || {}\n } else if (arguments.length > 1) {\n attr = arguments[1] || {}\n attr.label = arguments[0]\n } else {\n attr = {} as T & { label?: string }\n }\n return m(component, attr)\n }\n}\n","import type { Children, ClassComponent, FactoryComponent } from 'mithril'\n\nexport type EventAttrs = Partial<GlobalEventHandlers>\n\nexport type StyleAttr = Partial<CSSStyleDeclaration> & { [key: string]: any }\n\n/**\n * A UI component, which can be either a Mithril factory component or a Mithril class component.\n *\n * @public\n */\nexport type Component<Attr extends Object> = FactoryComponent<Attr> | ClassComponent<Attr>\n\n/**\n * A descriptor for a component, which includes the component itself, its attributes, and optionally its children.\n *\n * @internal\n */\nexport type ComponentDescriptor<Attr extends Object> = {\n component: Component<Attr> | string\n attributes: Attr\n children?: ComponentChildren\n}\n\n/**\n *\n */\nexport type ComponentChildren = ComponentSchema | Children | (() => Children)\n\n/**\n * A schema for a set of components, which is an array of component descriptors.\n *\n * @internal\n */\nexport type ComponentSchema = Array<ComponentDescriptor<any>>\n\nexport function binding<T>(target: T, field: keyof T): ValueBinding<T, T[keyof T]> {\n return {\n get: () => target[field],\n set: (value) => (target[field] = value),\n }\n}\n\n/**\n * A get/set pair that encapsulates access to a value without exposing the source object.\n *\n * @public\n */\nexport type ValueBinding<M, T> = {\n get: (model: M, field?: keyof M) => T\n set?: (value: T, model: M, field?: keyof M) => void\n}\n\nexport type TweakableAttrs<T, Value = unknown> = {\n /**\n * The target object being tweaked.\n */\n value: T\n /**\n * The property on `value` to read from and write to\n */\n field?: keyof T\n /**\n * The custom binding controller\n */\n binding?: ValueBinding<T, Value>\n /**\n * An optional adapter to convert between the raw value and the control value.\n */\n adapter?: ControlAdapter<any, Value>\n}\n\n/**\n * Converts between the raw stored value and the value the control operates on.\n * Use when the control's internal representation differs from the source data format\n * e.g. radians stored, degrees displayed; or a packed integer unpacked into a vector.\n *\n * @public\n */\nexport type ControlAdapter<RawValue, ControlValue> = {\n toControl: (value: RawValue) => ControlValue\n fromControl: (value: ControlValue) => RawValue\n}\n\nexport type OmitIn<A, Keys extends keyof A> = {\n [P in keyof A as P extends Keys ? never : P]: A[P]\n}\n","import m, { ChildArray, Component } from 'mithril'\nimport { Builder, BuilderFn } from './builder'\nimport { renderChildren } from './core'\n\n/**\n * Mithril's hyperscript function.\n *\n * @public\n * @remarks\n * Useful to create custom components\n */\nexport const h = m\n\n/**\n * Mounts a ui to the given element\n */\nexport function mountUi(target: Element | string, data: ChildArray): void\nexport function mountUi(target: Element | string, data: BuilderFn): void\nexport function mountUi<A, S>(target: Element | string, data: Component<A, S>): void\nexport function mountUi(target: Element | string, data: ChildArray | BuilderFn | Component): void {\n const el = typeof target === 'string' ? document.querySelector(target)! : target\n el.classList.add('tweak-ui')\n if (!data) {\n m.mount(el, null)\n } else if (Array.isArray(data)) {\n m.mount(el, { view: () => data })\n } else if (typeof data === 'function') {\n const schema = Builder.build(data)\n m.mount(el, {\n view: () => renderChildren(schema),\n })\n } else {\n m.mount(el, data)\n }\n}\n\n/**\n * Unmounts the ui from given host element\n *\n * @public\n * @param el - The ui host element\n */\nexport function unmountUi(target: Element | string) {\n const el = typeof target === 'string' ? document.querySelector(target)! : target\n m.mount(el, null)\n}\n\n/**\n * Redraws the ui\n *\n * @public\n * @remarks\n * When changing the ui description object qui callbacks (e.g. `onInput` or `onChange`)\n * the ui will redraw automatically.\n *\n * However if the ui description object is changed from outside the qui callback\n * then this method must be called in order to update the visual state.\n */\nexport function redrawUi() {\n m.redraw()\n}\n","import m, { Children, FactoryComponent, Vnode, VnodeDOM } from 'mithril'\nimport { EventAttrs, mapChildren, StyleAttr } from '../../core'\nimport { uiClass } from '../../core/utils'\nimport { h } from '../../mount'\n\n/**\n * Split pane component model\n * @public\n */\nexport type SplitAttr = EventAttrs & {\n /**\n * Custom CSS Style\n */\n style?: StyleAttr\n /**\n * Whether the split is horizontal (side by side) or vertical (stacked)\n */\n flow?: 'row' | 'column'\n /**\n * Minimum size in pixels for each pane. Default is 16px.\n */\n minSize?: number\n}\n\nexport function uiSplit<T>(attrs: SplitAttr, children?: Children): Vnode<SplitAttr> {\n return m(SplitComponent, attrs, children)\n}\n\n/**\n * Split pane component model\n * @public\n */\nexport type SplitContentAttr = EventAttrs & {\n [key: string]: any\n /**\n * Custom CSS Style\n */\n style?: StyleAttr\n /**\n *\n */\n fluid?: boolean\n}\n\nexport function uiSplitContent<T>(attrs: SplitAttr, children?: Children): Vnode<SplitAttr> {\n return m(SplitContentComponent, attrs, children)\n}\n\nexport const SplitContentComponent: FactoryComponent<SplitContentAttr> = (vnode) => {\n return {\n view: ({ attrs, children }) =>\n h(\n 'div',\n {\n ...attrs,\n class: uiClass({ fluid: !!attrs.fluid }, attrs.class),\n },\n children,\n ),\n }\n}\n\nexport const SplitComponent: FactoryComponent<SplitAttr> = () => {\n let isHorizontal = false\n let minSizePx = 0\n let startEvent!: MouseEvent | null\n let startBoxL!: DOMRect | null\n let startBoxR!: DOMRect | null\n let dragElemL!: HTMLElement | null\n let dragElemR!: HTMLElement | null\n let dragIndex: number\n let measured: number | null = null\n let container: HTMLElement | null = null\n\n function handleMouseDown(e: MouseEvent, index: number, childL: VnodeDOM, childR: VnodeDOM) {\n tearDown()\n e.stopPropagation()\n\n startEvent = e\n startBoxL = childL.dom?.getBoundingClientRect()\n startBoxR = childR.dom?.getBoundingClientRect()\n dragElemL = childL.dom as HTMLElement\n dragElemR = childR.dom as HTMLElement\n dragIndex = index\n\n window.addEventListener('mousemove', handleMove)\n window.addEventListener('mouseup', tearDown)\n\n const parent = dragElemL.parentElement as HTMLElement\n if (parent) {\n parent.classList.add('dragging')\n }\n }\n\n function handleMove(e: MouseEvent) {\n if (!startBoxL || !startBoxR || !startEvent || !dragElemL || !dragElemR) {\n return\n }\n\n if (measured == null) {\n measured = measurePanes()\n }\n\n const delta = isHorizontal ? e.clientX - startEvent.clientX : e.clientY - startEvent.clientY\n const baseL = isHorizontal ? startBoxL.width : startBoxL.height\n const baseR = isHorizontal ? startBoxR.width : startBoxR.height\n const total = baseL + baseR\n\n const sizeL = Math.max(minSizePx, Math.min(baseL + delta, total - minSizePx))\n const sizeR = total - sizeL\n const basisL = (sizeL / measured) * 100\n const basisR = (sizeR / measured) * 100\n dragElemL.style.flex = `0 0 ${basisL}%`\n dragElemR.style.flex = `0 0 ${basisR}%`\n }\n\n function measurePanes(): number {\n if (!container) {\n return 0\n }\n let total = 0\n for (let i = 0; i < container.children.length; i++) {\n const el = container.children[i] as HTMLElement\n const rect = el.getBoundingClientRect()\n const size = isHorizontal ? rect.width : rect.height\n total += size\n if (!el.classList.contains('fluid')) {\n el.style.flex = `0 0 ${size}px`\n } else {\n el.style.flex = `1`\n }\n }\n return total\n }\n\n function tearDown() {\n const parent = dragElemL?.parentElement as HTMLElement\n if (parent) {\n parent.classList.remove('dragging')\n }\n dragElemL = null\n dragElemR = null\n startBoxL = null\n startBoxR = null\n startEvent = null\n measured = null\n window.removeEventListener('mousemove', handleMove)\n window.removeEventListener('mouseup', tearDown)\n measurePanes()\n }\n\n return {\n oncreate: ({ dom }) => {\n container = dom as HTMLElement\n },\n view: ({ attrs: { style, flow, minSize, ...rest }, children }) => {\n isHorizontal = flow === 'row'\n minSizePx = minSize = Math.max(minSize || 16, 0)\n queueMicrotask(measurePanes)\n return m(\n 'div.twk-split-pane',\n {\n ...rest,\n class: uiClass({\n 'twk-split-pane-h': isHorizontal,\n 'twk-split-pane-v': !isHorizontal,\n }),\n style: {\n ...(style || {}),\n display: 'flex',\n flexDirection: isHorizontal ? 'row' : 'column',\n },\n },\n mapChildren(children, (child, i, list) => {\n if (!child) {\n return null\n }\n const noGutter = !list[i + 1]\n return [\n child,\n noGutter\n ? null\n : m('div.twk-split-gutter', {\n class: uiClass({\n 'twk-split-gutter-h': isHorizontal,\n 'twk-split-gutter-v': !isHorizontal,\n }),\n onmousedown: (e: MouseEvent) =>\n handleMouseDown(e, i, child as any, list[i + 1] as any),\n }),\n ]\n }),\n )\n },\n }\n}\n","import { Child, Children, FactoryComponent, default as m, Vnode } from 'mithril'\n\nimport { mapChildren } from '../../core'\nimport { uiClass } from '../../core/utils'\nimport { GroupAttrs } from './group'\n\n/**\n * Tabs component model\n * @public\n */\nexport type TabsAttrs = {\n vertical?: boolean\n}\n\nconst tabsHost = Symbol('tabsHost')\n\nexport interface TabsHost {\n attach(node: Vnode<TabAttrs>): void\n detach(node: Vnode<TabAttrs>): void\n activate(node: Vnode<TabAttrs>): void\n isActive(child: Vnode<TabAttrs>): boolean\n}\n\nexport interface TabAttrs {\n title: Child\n active?: boolean\n disabled?: boolean\n}\n\nexport const TabComponent: FactoryComponent<TabAttrs> = () => {\n let host: TabsHost\n let vnode: Vnode<TabAttrs>\n\n return {\n oninit: (node) => {\n host = (node.attrs as any)[tabsHost]\n vnode = node\n if (!host) {\n throw new Error('TabPane must be used inside a Tabs component')\n }\n host.attach(node)\n },\n onremove: () => {\n host.detach(vnode)\n },\n view: ({ attrs, children }) => {\n const title = attrs.title\n const active = host.isActive(vnode)\n return [\n m(\n 'button.twk-btn.twk-tab',\n {\n class: uiClass({\n active,\n }),\n onclick: () => host.activate(vnode),\n },\n title,\n ),\n !active ? null : m('div.twk-tab-content', {}, children),\n ]\n },\n }\n}\n\nexport function uiTabs(attrs: TabsAttrs, children?: Children): Vnode<TabsAttrs> {\n return m(TabsComponent, attrs, children)\n}\n\nexport const TabsComponent: FactoryComponent<TabsAttrs> = () => {\n const children: Vnode<TabAttrs>[] = []\n let active: Vnode<TabAttrs> | null = null\n const host: TabsHost = {\n attach(child) {\n children.push(child)\n active ||= child\n if (child.attrs.active) {\n active = child\n }\n },\n detach(child) {\n const index = children.indexOf(child)\n if (index >= 0) {\n children.splice(index, 1)\n }\n if (active === child) {\n active = children[0] || null\n }\n },\n activate(child) {\n active = child\n },\n isActive(child) {\n return active === child\n },\n }\n\n function tabChildren(node: Vnode<TabsAttrs>) {\n return mapChildren(node.children, (child) => {\n if (!child) {\n return child\n }\n if (child.tag === TabComponent) {\n return m(\n child.tag as any,\n {\n ...child.attrs,\n [tabsHost]: host,\n },\n child.children,\n )\n }\n // assume the child is a group and wrap it in a tab\n // pull the title from the group attrs\n const attrs = child.attrs as GroupAttrs\n return m(\n TabComponent,\n {\n title: attrs.title || '',\n ...{ [tabsHost]: host },\n },\n m(\n child.tag as any,\n {\n ...attrs,\n title: undefined,\n },\n child.children,\n ),\n )\n })\n }\n\n return {\n view: (node) => {\n return m(\n 'div.twk-tabs',\n {\n class: uiClass({\n 'twk-tabs-vertical': !!node.attrs.vertical,\n }),\n },\n m.fragment({}, [tabChildren(node)]),\n )\n },\n }\n}\n","import m, { Child, FactoryComponent, Vnode } from 'mithril'\nimport { uiClass } from '../../core/utils'\n\nexport interface TreeAttrs<T> {\n data: Iterable<T>\n adapter: TreeDataAdapter<T>\n selectedId?: string\n rowHeight?: number\n style?: Partial<CSSStyleDeclaration>\n onSelect?: (node: T) => void\n}\n\nexport interface TreeDataAdapter<T> {\n version: number\n nodeId(node: T): string\n nodeLabel(node: T): Child\n nodeIcon(node: T, expanded: boolean): Child\n nodeChildren(node: T): Iterable<T> | undefined\n isExpanded(node: T): boolean\n setExpanded(node: T, expanded: boolean): void\n connect?(controller: TreeController<T>): void\n}\n\nexport interface TreeController<T> {\n scrollTo(node: T): void\n}\n\nexport function uiTree<T>(attrs: TreeAttrs<T>): Vnode<TreeAttrs<T>> {\n return m(TreeComponent, attrs)\n}\n\ninterface FlatNode<T> {\n node: T\n depth: number\n expanded: boolean\n}\n\nfunction flattenTree<T>(\n data: Iterable<T>,\n adapter: TreeDataAdapter<T>,\n depth = 0,\n result: FlatNode<T>[] = [],\n): FlatNode<T>[] {\n for (const node of data) {\n const expanded = adapter.isExpanded(node) ?? false\n const children = adapter.nodeChildren(node)\n result.push({ node, depth, expanded })\n if (!!children && expanded) {\n flattenTree(children, adapter, depth + 1, result)\n }\n }\n return result\n}\n\nconst ROW_HEIGHT = 22\nexport const TreeComponent: FactoryComponent<TreeAttrs<any>> = () => {\n let scrollTop = 0\n let observer: ResizeObserver | null = null\n let height = 0\n let nodes: FlatNode<any>[] = []\n let treeVersion: number | undefined\n let adapter: TreeDataAdapter<any> | null = null\n let selectedId: string | undefined\n let rowHeight: number | undefined\n let onSelect: ((node: any) => void) | undefined\n let data: Iterable<any> = []\n let scrollEl: HTMLElement | null = null\n return {\n onremove() {\n observer?.disconnect()\n },\n oncreate({ dom }) {\n observer = new ResizeObserver((entries) => {\n let newHeight = entries[0].contentRect.height\n if (newHeight !== height) {\n height = newHeight\n m.redraw()\n }\n })\n observer.observe(dom)\n },\n onupdate({ attrs: { adapter } }) {\n adapter.connect?.({\n scrollTo(node) {\n const index = nodes.findIndex((it) => it.node === node)\n if (index >= 0) {\n scrollEl?.scrollTo({\n top: index * (rowHeight ?? ROW_HEIGHT),\n behavior: 'instant',\n })\n m.redraw()\n }\n },\n })\n },\n view({ attrs }) {\n data = attrs.data!\n adapter = attrs.adapter!\n selectedId = attrs.selectedId!\n rowHeight = attrs.rowHeight ?? ROW_HEIGHT\n onSelect = attrs.onSelect\n\n if (treeVersion == null || treeVersion !== adapter.version) {\n nodes = flattenTree(data, adapter)\n }\n\n const totalRows = nodes.length\n const visibleRows = Math.ceil(height / rowHeight)\n const startIdx = Math.floor(scrollTop / rowHeight)\n const endIdx = Math.min(startIdx + visibleRows, totalRows)\n const offsetY = startIdx * rowHeight\n const childNodes = nodes.slice(startIdx, endIdx)\n return m(\n 'div.twk-tree',\n {\n style: attrs.style ?? {},\n oncreate: ({ dom }) => {\n scrollEl = dom as HTMLElement\n },\n onscroll: (e: UIEvent) => {\n scrollTop = (e.target as HTMLElement).scrollTop\n },\n },\n m(\n 'div.twk-tree-spacer',\n {\n style: {\n height: `${totalRows * rowHeight}px`,\n },\n },\n m(\n 'div.twk-tree-viewport',\n {\n style: {\n '--twk-tree-row-height': `${rowHeight}px`,\n transform: `translateY(${offsetY}px)`,\n },\n },\n childNodes.map(({ node, depth, expanded }) => {\n const id = adapter!.nodeId(node)\n const isSelected = id === selectedId\n const icon = adapter!.nodeIcon(node, adapter!.isExpanded(node))\n const isExpandable = !!adapter!.nodeChildren(node)\n return m(\n 'div.twk-tree-row',\n {\n key: id,\n class: uiClass({\n selected: isSelected,\n expandable: isExpandable,\n }),\n style: {\n height: `${rowHeight}px`,\n '--twk-tree-row-depth': depth,\n },\n onclick: () => onSelect?.(node),\n },\n [\n m('span.twk-tree-toggle', {\n class: uiClass({ expanded, expandable: isExpandable }),\n onclick: (e: MouseEvent) => {\n if (isExpandable) {\n e.stopPropagation()\n adapter!.setExpanded(node, !expanded)\n }\n },\n }),\n icon ? m('span.twk-tree-icon', {}, icon) : null,\n m('span.twk-tree-label', {}, adapter!.nodeLabel(node)),\n ],\n )\n }),\n ),\n ),\n )\n },\n }\n}\n","import { Attributes, Children, FactoryComponent, default as m, Vnode } from 'mithril'\nimport { redrawUi } from '../../mount'\n\n/**\n * Bar component model\n * @public\n */\nexport type DialogAttrs = Attributes & {\n /**\n * Custom CSS Style\n */\n style?: Partial<CSSStyleDeclaration>\n}\n\nexport function uiDialog<T>(attrs: DialogAttrs, children?: Children): Vnode<DialogAttrs> {\n return m(DialogComponent, attrs, children)\n}\n\nexport const DialogComponent: FactoryComponent<DialogAttrs> = () => {\n let dialogRef: HTMLDialogElement | null = null\n return {\n oncreate: ({ dom }) => {\n dialogRef = dom as HTMLDialogElement\n dialogRef.addEventListener('close', redrawUi)\n },\n onremove: () => {\n dialogRef?.removeEventListener('close', redrawUi)\n dialogRef = null\n },\n view: ({ attrs, children }) => {\n return m('dialog.twk-dialog', attrs, [dialogRef?.open ? children : null])\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\nimport { EventAttrs, StyleAttr } from '../../core'\nimport { uiClass } from '../../core/utils'\n\n/**\n * Button component model\n * @public\n */\nexport type ButtonAttrs = EventAttrs & {\n [key: string]: any\n\n /**\n *\n */\n style?: StyleAttr\n /**\n * Whether the button square\n */\n square?: boolean\n\n /**\n * Whether the button a block\n */\n block?: boolean\n\n /**\n * Whether the button is large\n */\n large?: boolean\n\n /**\n *\n */\n accent?: boolean\n\n /**\n * Css flex property\n */\n flex?: string\n}\n\nexport function uiButton<T>(attrs: ButtonAttrs, children?: Children): Vnode<ButtonAttrs> {\n return m(ButtonComponent as any, attrs as any, children)\n}\n\nexport const ButtonComponent: FactoryComponent<ButtonAttrs> = () => {\n return {\n view: ({ attrs, children }) => {\n const { square, block, class: className, style, ...rest } = attrs\n return m(\n 'button.twk-btn',\n {\n type: 'button',\n class: uiClass(\n {\n 'twk-btn-sq': !!square,\n 'twk-btn-bl': !!block,\n 'twk-btn-lg': !!attrs.large,\n 'twk-btn-accent': !!attrs.accent,\n },\n className,\n ),\n style: {\n flex: attrs.flex,\n ...(style || {}),\n },\n ...rest,\n },\n children,\n )\n },\n }\n}\n","import m, { Attributes, FactoryComponent, Vnode } from 'mithril'\n\nexport function uiDivider(attrs: Attributes): Vnode<Attributes> {\n return m(Divider, attrs)\n}\n\nexport const Divider: FactoryComponent<Attributes> = () => {\n return {\n view: (node) => {\n return m('div.twk-divider', node.attrs, node.children)\n },\n }\n}\n","export type StatTransform = 'linear' | 'log' | 'exp'\n\nexport type SamplerConfig = {\n /**\n * Display name of the stat\n */\n name?: string\n\n /**\n * Display color of the stat\n */\n color?: string\n\n /**\n * Formatting for the current value\n */\n fractionDigits?: number\n\n /**\n * Function that returns the current value of the stat\n */\n sample: () => number\n\n /**\n * Smoothing factor for EMA calculation.\n *\n * @remarks\n * 0 is no smoothing, 0.9 is heavy smoothing. Don't set to 1 or it will never update! Default is 0 (no smoothing).\n */\n smoothing?: number\n\n /**\n * Expected minimum value for display. Used for normalization and auto-ranging. Default is 0.\n */\n min?: number\n\n /**\n * Expected maximum value for display. Used for normalization and auto-ranging. Default is 1.\n */\n max?: number\n\n transform?: StatTransform\n\n noGraph?: boolean\n}\n\nexport interface Sampler {\n color?: string\n noGraph?: boolean\n fractionDigits?: number\n\n smoothing: number\n transform: (v: number) => number\n min: number\n max: number\n\n sample: () => number\n\n value: number | null\n normalized: number\n\n // --- canonical ring buffer ---\n buffer: Float32Array\n head: number\n count: number\n index: number\n\n // --- O(1) average ---\n sum: number\n avg: number\n\n // --- monotonic queues ---\n minDeque: Float32Array\n maxDeque: Float32Array\n minIdx: Uint32Array\n maxIdx: Uint32Array\n\n minHead: number\n minTail: number\n maxHead: number\n maxTail: number\n\n minSeen: number\n maxSeen: number\n}\n\nexport function sampler(config: SamplerConfig, size: number): Sampler {\n const sampler: Sampler = {\n color: config.color,\n noGraph: config.noGraph,\n fractionDigits: config.fractionDigits,\n\n smoothing: config.smoothing ?? 0,\n transform: linearTransform,\n min: config.min ?? 0,\n max: config.max ?? 1,\n\n value: null,\n normalized: 0,\n\n buffer: new Float32Array(size),\n head: 0,\n count: 0,\n index: 0,\n\n sum: 0,\n avg: 0,\n\n minDeque: new Float32Array(size),\n maxDeque: new Float32Array(size),\n minIdx: new Uint32Array(size),\n maxIdx: new Uint32Array(size),\n\n minHead: 0,\n minTail: 0,\n maxHead: 0,\n maxTail: 0,\n\n minSeen: Infinity,\n maxSeen: -Infinity,\n\n sample: () => processValue(config.sample(), sampler),\n }\n switch (config.transform) {\n case 'log':\n sampler.transform = logTransform\n break\n case 'exp':\n sampler.transform = expTransform\n break\n default:\n sampler.transform = linearTransform\n break\n }\n return sampler\n}\n\nfunction logTransform(v: number): number {\n return Math.log10(1 + Math.max(0, v))\n}\n\nfunction expTransform(v: number): number {\n return Math.exp(v) - 1\n}\n\nfunction linearTransform(v: number): number {\n return v\n}\n\nfunction processValue(sample: number, s: Sampler): number {\n // --- EMA ---\n if (s.value == null) {\n s.value = sample\n } else {\n const a = s.smoothing\n s.value = a * s.value + (1 - a) * sample\n }\n\n const v = s.value\n const i = s.index++\n const size = s.buffer.length\n\n // --- remove outgoing value (for avg) ---\n if (s.count === size) {\n const old = s.buffer[s.head]\n s.sum -= old\n } else {\n s.count++\n }\n\n // --- write new value ---\n s.buffer[s.head] = v\n s.head = (s.head + 1) % size\n\n // --- update sum / avg ---\n s.sum += v\n s.avg = s.sum / s.count\n\n // --- MIN QUEUE ---\n while (s.minHead !== s.minTail) {\n const last = (s.minTail - 1 + size) % size\n if (s.minDeque[last] <= v) break\n s.minTail = last\n }\n\n s.minDeque[s.minTail] = v\n s.minIdx[s.minTail] = i\n s.minTail = (s.minTail + 1) % size\n\n while (s.minHead !== s.minTail && s.minIdx[s.minHead] <= i - size) {\n s.minHead = (s.minHead + 1) % size\n }\n\n // --- MAX QUEUE ---\n while (s.maxHead !== s.maxTail) {\n const last = (s.maxTail - 1 + size) % size\n if (s.maxDeque[last] >= v) break\n s.maxTail = last\n }\n\n s.maxDeque[s.maxTail] = v\n s.maxIdx[s.maxTail] = i\n s.maxTail = (s.maxTail + 1) % size\n\n while (s.maxHead !== s.maxTail && s.maxIdx[s.maxHead] <= i - size) {\n s.maxHead = (s.maxHead + 1) % size\n }\n\n // --- current window min/max ---\n const winMin = s.minHead !== s.minTail ? s.minDeque[s.minHead] : s.min\n\n const winMax = s.maxHead !== s.maxTail ? s.maxDeque[s.maxHead] : s.max\n\n s.minSeen = winMin\n s.maxSeen = winMax\n\n // --- normalization ---\n const t = s.transform\n\n const tv = t(v)\n const tmin = t(Math.min(s.min, winMin))\n const tmax = t(Math.max(s.max, winMax))\n\n const denom = tmax - tmin || 1\n const norm = (tv - tmin) / denom\n\n s.normalized = Math.max(0, Math.min(1, norm))\n return s.normalized\n}\n","import { sampler, Sampler, SamplerConfig } from './sampler'\n\nexport type StatsConfig<T extends SamplerConfig = SamplerConfig> = {\n historySize?: number\n collapsed?: boolean\n rows: Array<T>\n}\n\nexport type StatsRenderer = {\n resize: (width: number, height: number) => void\n configure: (config: StatsConfig) => void\n update: () => void\n render: () => void\n sampler: (row: number) => Sampler\n samplerCount: number\n}\n\nexport function statsRenderer(canvas: HTMLCanvasElement): StatsRenderer {\n const gl = canvas.getContext('webgl2')!\n if (!gl) {\n throw new Error('WebGL2 is not supported in this browser')\n }\n\n const prog = createProgram(gl)\n const vbo = gl.createBuffer()\n\n const locX = 0\n const locRow = 1\n const locVal = 2\n\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo)\n gl.enableVertexAttribArray(locX)\n gl.enableVertexAttribArray(locRow)\n gl.enableVertexAttribArray(locVal)\n\n gl.vertexAttribPointer(locX, 1, gl.FLOAT, false, 12, 0)\n gl.vertexAttribPointer(locRow, 1, gl.FLOAT, false, 12, 4)\n gl.vertexAttribPointer(locVal, 1, gl.FLOAT, false, 12, 8)\n\n const uHistory = gl.getUniformLocation(prog, 'u_history')\n const uViewWidth = gl.getUniformLocation(prog, 'u_width')\n const uViewHeight = gl.getUniformLocation(prog, 'u_height')\n const uRowHeight = gl.getUniformLocation(prog, 'u_rowH')\n const uPad = gl.getUniformLocation(prog, 'u_padding')\n const uColor = gl.getUniformLocation(prog, 'u_color')\n\n let collapsed = false\n let history = 100\n let rows = 0\n let verts: Float32Array\n let data: Float32Array\n let head: Uint32Array\n\n const colors: Array<[number, number, number]> = []\n const samplers: Sampler[] = []\n function configure(config: StatsConfig) {\n collapsed = !!config.collapsed\n rows = config.rows.length\n history = Math.max(config.historySize || 100, 100)\n data = new Float32Array(rows * history)\n head = new Uint32Array(rows)\n verts = new Float32Array(rows * history * 3)\n\n samplers.length = rows\n colors.length = rows\n for (let i = 0; i < rows; i++) {\n samplers[i] = sampler(config.rows[i], history)\n const hex = config.rows[i].color!\n const r = parseInt(hex.slice(1, 3), 16) / 255\n const g = parseInt(hex.slice(3, 5), 16) / 255\n const b = parseInt(hex.slice(5, 7), 16) / 255\n colors[i] = [r, g, b]\n }\n }\n\n function resize(width: number, height: number) {\n canvas.width = width\n canvas.height = height\n }\n\n function update() {\n for (let i = 0; i < samplers.length; i++) {\n head[i] = (head[i] + 1) % history\n data[i * history + head[i]] = samplers[i].sample()\n }\n }\n\n function render() {\n for (let r = 0; r < rows; r++) {\n for (let i = 0; i < history; i++) {\n const idx = (head[r] + i + 1) % history\n const base = (r * history + i) * 3\n\n verts[base + 0] = i\n verts[base + 1] = collapsed ? 0 : r\n verts[base + 2] = data[r * history + idx]\n }\n }\n\n gl.viewport(0, 0, canvas.width, canvas.height)\n gl.clearColor(0, 0, 0, 0)\n gl.clear(gl.COLOR_BUFFER_BIT)\n\n const padding = 0\n gl.useProgram(prog)\n gl.uniform1f(uHistory, history)\n gl.uniform1f(uViewWidth, canvas.width)\n gl.uniform1f(uViewHeight, canvas.height)\n gl.uniform1f(uPad, padding)\n gl.uniform1f(uRowHeight, (canvas.height - padding - rows * padding) / (collapsed ? 1 : rows))\n\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo)\n gl.bufferData(gl.ARRAY_BUFFER, verts, gl.DYNAMIC_DRAW)\n\n for (let r = 0; r < rows; r++) {\n if (samplers[r].noGraph) {\n continue\n }\n gl.uniform3fv(uColor, colors[r])\n gl.drawArrays(gl.LINE_STRIP, r * history, history)\n }\n }\n\n return {\n resize,\n configure,\n update,\n render,\n sampler: (row: number) => samplers[row],\n samplerCount: samplers.length,\n }\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\n\nlayout(location=0) in float a_x;\nlayout(location=1) in float a_row;\nlayout(location=2) in float a_value;\n\nuniform float u_history;\nuniform float u_width;\nuniform float u_height;\nuniform float u_padding;\nuniform float u_rowH;\n\nvoid main() {\n float x = u_padding + (a_x / (u_history - 1.0)) * (u_width - 2.0 * u_padding);\n float yBase = u_padding + a_row * (u_rowH + u_padding);\n float y = yBase + u_rowH - 2.0 - a_value * (u_rowH - 4.0);\n\n float ndcX = (x / u_width) * 2.0 - 1.0;\n float ndcY = 1.0 - (y / u_height) * 2.0;\n\n gl_Position = vec4(ndcX, ndcY, 0.0, 1.0);\n}\n`\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec3 u_color;\nout vec4 outColor;\nvoid main(){\n outColor = vec4(u_color,1.0);\n}\n`\n\nfunction compile(gl: WebGL2RenderingContext, type: number, src: string) {\n const s = gl.createShader(type)!\n gl.shaderSource(s, src)\n gl.compileShader(s)\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n throw gl.getShaderInfoLog(s)\n }\n return s\n}\n\nfunction createProgram(gl: WebGL2RenderingContext) {\n const prog = gl.createProgram()\n gl.attachShader(prog, compile(gl, gl.VERTEX_SHADER, VERT))\n gl.attachShader(prog, compile(gl, gl.FRAGMENT_SHADER, FRAG))\n gl.linkProgram(prog)\n gl.useProgram(prog)\n return prog\n}\n","import m, { Children, FactoryComponent, Vnode, VnodeDOM } from 'mithril'\nimport { StatsConfig, statsRenderer, StatsRenderer } from '../../stats'\n\nexport interface GraphAttrs extends Partial<StatsConfig> {\n rowHeight?: number\n}\n\nexport function uiGraph(attrs: GraphAttrs, children?: Children): Vnode<GraphAttrs> {\n return m(GraphComponent, attrs, children)\n}\n\nexport const GraphComponent: FactoryComponent<GraphAttrs> = () => {\n let observer: ResizeObserver | null = null\n let frameId: number | null = null\n let canvas: HTMLCanvasElement | null = null\n let renderer: StatsRenderer\n let config: StatsConfig = { rows: [] }\n let legendNodes: HTMLDivElement[] = []\n let legendTimer: number | null = null\n\n function connect(el: HTMLCanvasElement) {\n canvas = el\n observer?.observe(canvas)\n updateGraph()\n legendTimer = setInterval(updateLegend, 250)\n }\n\n function disconnect() {\n observer?.disconnect()\n if (frameId !== null) {\n cancelAnimationFrame(frameId)\n frameId = null\n }\n if (legendTimer !== null) {\n clearInterval(legendTimer)\n legendTimer = null\n }\n }\n\n function updateGraph() {\n if (canvas?.isConnected) {\n renderer.update()\n renderer.render()\n frameId = requestAnimationFrame(updateGraph)\n } else {\n disconnect()\n }\n }\n\n function updateLegend() {\n renderLegend(renderer, legendNodes)\n }\n\n function canvasCreated({ dom }: VnodeDOM) {\n disconnect()\n const canvas = dom as HTMLCanvasElement\n if (!(canvas instanceof HTMLCanvasElement)) {\n console.error('Graph component must be a canvas element')\n return\n }\n observer = new ResizeObserver((entries) => {\n const size = sizeFromObserver(entries)\n if (size && renderer) {\n renderer.resize(size.width, size.height)\n }\n })\n renderer = statsRenderer(canvas)\n for (let i = 0; i < config.rows.length; i++) {\n config.rows[i].color ||= colorForIndex(i)\n }\n renderer.configure(config)\n connect(canvas)\n }\n\n function cavasRemoved() {\n disconnect()\n }\n\n function updateConfig(node: Vnode<GraphAttrs>) {\n config = {\n ...node.attrs,\n rows: (node.attrs.rows || []).map((r, i) => {\n return {\n ...r,\n name: r.name || `Row ${i + 1}`,\n color: r.color || colorForIndex(i),\n }\n }),\n }\n }\n return {\n oninit: updateConfig,\n onupdate: updateConfig,\n onremove: () => {\n disconnect()\n },\n view: ({ attrs: { rowHeight, collapsed } }) => {\n const height = (rowHeight || 50) * (collapsed ? 1 : config.rows.length) * devicePixelRatio\n return [\n m('canvas.twk-graph', {\n style: `width: 100%; height: ${height}px`,\n oncreate: canvasCreated,\n onremove: cavasRemoved,\n }),\n m('table.twk-graph', {}, [\n m(\n 'tbody',\n {},\n config.rows.map((r, i) => {\n return m(\n 'tr',\n {\n oncreate: ({ dom }) => (legendNodes[i] = dom as HTMLDivElement),\n },\n [\n m('td', { style: r.noGraph ? {} : `color: ${r.color}`, title: r.name! }, [\n m('span', r.name!),\n ]),\n m('td.twk-stats', { title: 'min / max / avg' }, []),\n m('td.twk-current', {}),\n ],\n )\n }),\n ),\n ]),\n ]\n },\n }\n}\n\nfunction sizeFromObserver(entries: ResizeObserverEntry[]) {\n const entry = entries[0]\n if (entry.devicePixelContentBoxSize) {\n const width = entry.devicePixelContentBoxSize[0].inlineSize\n const height = entry.devicePixelContentBoxSize[0].blockSize\n return { width, height }\n }\n if (entry.contentBoxSize) {\n const width = Math.round(entry.contentBoxSize[0].inlineSize * devicePixelRatio)\n const height = Math.round(entry.contentBoxSize[0].blockSize * devicePixelRatio)\n return { width, height }\n }\n return null\n}\n\nfunction renderLegend(renderer: StatsRenderer | null, nodes: HTMLElement[]) {\n if (!renderer) {\n return\n }\n\n for (let i = 0; i < nodes.length; i++) {\n const el = nodes[i]\n const sampler = renderer.sampler(i)\n if (!sampler || !el) {\n continue\n }\n\n const current = el.querySelector('.twk-current')\n const stats = el.querySelector('.twk-stats')\n if (current) {\n current.textContent = formatValue(sampler.value, sampler.fractionDigits)\n }\n if (stats) {\n if (sampler.noGraph) {\n stats.textContent = ''\n } else {\n const fd = sampler.fractionDigits\n stats.textContent = `${formatValue(sampler.minSeen, fd)}/${formatValue(sampler.maxSeen, fd)}/${formatValue(sampler.avg, fd)}`\n }\n }\n }\n}\n\nfunction formatValue(value: number | null, fractionDigits?: number): string {\n if (value == null) {\n return 'n/a'\n }\n if (fractionDigits != null) {\n return value.toFixed(fractionDigits)\n }\n const abs = Math.abs(value)\n if (abs < Number.EPSILON) {\n return '0'\n }\n if (abs < 1) {\n return value.toFixed(3)\n }\n if (abs < 10) {\n return value.toFixed(2)\n }\n if (abs < 100) {\n return value.toFixed(1)\n }\n return value.toFixed(0)\n}\n\nconst DEFAULT_COLORS = [\n '#1F77B4', // deep blue\n '#FF7F0E', // orange\n '#2CA02C', // strong green\n '#D62728', // strong red\n '#9467BD', // violet\n '#8C564B', // muted brown\n '#E377C2', // magenta\n '#7F7F7F', // neutral gray\n\n '#5DA5DA', // blue\n '#F17CB0', // pink\n '#60BD68', // green\n '#B2912F', // brown/gold\n '#B276B2', // purple\n '#DECF3F', // yellow\n '#F15854', // red\n '#4D4D4D', // gray\n\n '#17BECF', // cyan\n '#AEC7E8', // light blue\n '#FFBB78', // light orange\n '#98DF8A', // light green\n]\n\nfunction colorForIndex(i: number): string {\n return DEFAULT_COLORS[i % DEFAULT_COLORS.length]\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\n\nimport { EventAttrs, StyleAttr } from '../../core'\nimport { isNumber } from '../../core/utils'\n\n/**\n * Image component model\n * @public\n */\nexport type ImageAttrs = EventAttrs & {\n /**\n * The image source url\n */\n src?: string | any\n\n /**\n *\n */\n render?: (src: any) => Promise<ImageBitmap>\n\n /**\n * Aspect ratio of the picture container\n */\n aspect?: number | string\n\n /**\n * A fixed width\n */\n width?: number | string\n\n /**\n *\n */\n fit?: 'contain' | 'cover' | 'fill'\n\n class?: string\n style?: StyleAttr\n}\n\nexport function uiImage(attrs: ImageAttrs, children?: Children): Vnode<ImageAttrs> {\n return m(ImageComponent, attrs, children)\n}\n\nexport const ImageComponent: FactoryComponent<ImageAttrs> = () => {\n let src: string\n let srcLoadArg: any\n let srcRender: (src: any) => Promise<ImageBitmap>\n\n let cssWidth: string\n let cssAspect: string\n let cssFit: string\n\n let elImage: HTMLImageElement\n let loadGeneration = 0\n let lastSrcLoadArg: any\n let lastSrc: string\n\n function hasChanged() {\n return srcLoadArg !== lastSrcLoadArg || src !== lastSrc\n }\n\n function parseSize(width: ImageAttrs['width']) {\n if (isNumber(width)) {\n return `${width}px`\n }\n return width\n }\n\n function parseAspect(aspect: ImageAttrs['aspect']) {\n return String(aspect || '')\n }\n\n function captureState(attrs: ImageAttrs) {\n src = typeof attrs.src === 'string' ? attrs.src : ''\n srcLoadArg = attrs.src\n srcRender = attrs.render!\n cssAspect = parseAspect(attrs.aspect)\n cssWidth = parseSize(attrs.width)!\n cssFit = attrs.fit || 'fit'\n }\n\n async function loadImage() {\n if (!elImage || !hasChanged()) {\n return\n }\n lastSrcLoadArg = srcLoadArg\n lastSrc = src\n if (!srcRender) {\n elImage.src = src\n return\n }\n loadGeneration++\n const generation = loadGeneration\n\n elImage.classList.add('twk-loading')\n const bitmap = await srcRender(srcLoadArg)\n if (generation !== loadGeneration) {\n bitmap.close() // stale, discard\n return\n }\n\n await renderThumbnail(elImage, bitmap)\n elImage.classList.remove('twk-loading')\n }\n\n async function renderThumbnail(img: HTMLImageElement, bitmap: ImageBitmap) {\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height)\n canvas.getContext('2d')!.drawImage(bitmap, 0, 0)\n const blob = await canvas.convertToBlob({ type: 'image/png' })\n bitmap.close()\n\n const next = URL.createObjectURL(blob)\n URL.revokeObjectURL(img.src)\n img.src = next\n }\n\n function grabRestAttrs(attrs: ImageAttrs) {\n const { src, render, aspect, width, fit, ...rest } = attrs\n return rest\n }\n\n return {\n oninit({ attrs }) {\n captureState(attrs)\n },\n onbeforeupdate({ attrs }, old) {\n captureState(attrs)\n },\n onupdate() {\n loadImage()\n },\n view: ({ attrs }) => {\n return m('img.twk-image', {\n src,\n style: {\n width: cssWidth,\n aspectRatio: cssAspect,\n objectFit: cssFit,\n ...(attrs.style || {}),\n },\n\n onremove: () => {\n elImage = null!\n },\n oncreate: ({ dom }) => {\n elImage = dom as HTMLImageElement\n loadImage()\n },\n ...grabRestAttrs(attrs),\n })\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\nimport { EventAttrs, StyleAttr, TweakableAttrs } from '../../core'\n\nexport type WidgetAttrs = EventAttrs &\n CommonWidgetAttrs & {\n [property: string]: any\n\n /**\n * The HTML tag to use for the control container, defaults to 'div'\n */\n tagName?: string\n\n /**\n * Style object to apply to the control container\n */\n style?: StyleAttr\n }\n\nexport interface CommonWidgetAttrs {\n /**\n * A label for the control\n */\n label?: Children | false\n\n /**\n * Additional CSS class names to apply to the control container\n */\n class?: string\n}\n\nexport type ValueWidgetAttrs<T = any, V = any> = CommonWidgetAttrs & TweakableAttrs<T, V>\n\nexport const WidgetComponent: FactoryComponent<WidgetAttrs> = () => {\n return {\n view: (node) => {\n const { label, tip, tagName, ...rest } = node.attrs\n return [\n m(\n `${tagName || 'div'}.twk-widget`,\n {\n ...rest,\n },\n label === false ? null : m('div.twk-widget-label', {}, label),\n node.children,\n ),\n ]\n },\n }\n}\n\nexport function uiWidget(attrs: WidgetAttrs, children?: Children): Vnode<WidgetAttrs> {\n return m(WidgetComponent, attrs, children)\n}\n","import m, { Child, Children, FactoryComponent, Vnode } from 'mithril'\n\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { clamp, dragUtil, getTouchInTarget, uiClass } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\n\nexport type ScalarWidgetAttrs<T = unknown> = CommonWidgetAttrs & ScalarInputAttrs<T>\n\n/**\n * Scalar component model\n * @public\n */\nexport type ScalarInputAttrs<T = unknown> = TweakableAttrs<T, number> & {\n /**\n * The placeholder text\n */\n placeholder?: string\n\n /**\n * Content before the input field\n */\n slotBefore?: Child\n\n /**\n * Content after the input field\n */\n slotAfter?: Child\n\n /**\n * The unit to display after the value. For example, \"px\" or \"kg\".\n */\n unit?: string\n\n /**\n * The min value\n */\n min?: number\n\n /**\n * The max value\n */\n max?: number\n\n /**\n * The step value\n */\n step?: number\n\n /**\n * Displays a range slider below the input field. By default, this is false.\n */\n range?: boolean\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: number) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: number) => void\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n\n /**\n * The minimum number of fraction digits to display. By default, this is 1.\n */\n decimals?: number\n\n class?: string\n}\n\nexport function uiScalarWidget<T>(\n attrs: ScalarWidgetAttrs<T>,\n children?: Children,\n): Vnode<ScalarWidgetAttrs<T>> {\n return m(ScalarWidgetComponent as any, attrs as any, children)\n}\n\nexport function uiScalarInput<T>(\n attrs: ScalarInputAttrs<T>,\n children?: Children,\n): Vnode<ScalarInputAttrs<T>> {\n return m(ScalarInputComponent as any, attrs as any, children)\n}\n\nexport const ScalarWidgetComponent: FactoryComponent<ScalarWidgetAttrs> = () => {\n return {\n view: ({ attrs: { label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: 'label.twk-scalar-widget',\n label: label ?? rest.field,\n class: className,\n },\n [m(ScalarInputComponent, rest)],\n )\n },\n }\n}\n\nexport const ScalarInputComponent: FactoryComponent<ScalarInputAttrs> = () => {\n let min: number\n let max: number\n let step: number | undefined\n let readonly: boolean\n let placeholder: string\n let value: number\n let attrs: ScalarInputAttrs\n let editing: boolean\n let hasMinMax = false\n let hasStep = false\n let canDrag = false\n let range = false\n let formatter: Intl.NumberFormat | undefined\n\n function updateState(node: m.Vnode<ScalarInputAttrs>) {\n if (!formatter || node.attrs.decimals !== attrs.decimals) {\n formatter = new Intl.NumberFormat('en-US', {\n minimumFractionDigits: node.attrs.decimals ?? 1,\n maximumFractionDigits: node.attrs.decimals ?? 1,\n useGrouping: false,\n })\n }\n\n attrs = node.attrs\n min = attrs.min!\n max = attrs.max!\n step = attrs.step!\n range = !!attrs.range\n value = getControlValue<number>(attrs)\n readonly = !!attrs.readonly\n hasMinMax = min != null && max != null\n hasStep = step != null\n canDrag = hasMinMax || hasStep\n }\n\n function setModelValue(e: 'input' | 'change', v: number) {\n value = isNaN(v) ? null! : clamp(v, min, max)!\n setControlValue(attrs, value)\n const cb = e === 'input' ? attrs.oninput : attrs.onchange\n cb?.(attrs.value, value)\n m.redraw()\n }\n\n function onfocus() {\n editing = true\n }\n\n function onblur() {\n editing = false\n }\n\n function oninput(e: Event) {\n const el = e.target as HTMLInputElement\n setModelValue('input', parseFloat(el.value))\n }\n\n function onchange(e: Event) {\n const el = e.target as HTMLInputElement\n setModelValue('change', parseFloat(el.value))\n }\n\n function limit(v: number) {\n v = clamp(v, min, max)\n if (step != null) {\n v = Math.round(v / step) * step\n }\n return parseFloat(v.toFixed(5))\n }\n\n function onDragStart(e: MouseEvent) {\n if (!canDrag || readonly) {\n return\n }\n drag.activate(e)\n }\n\n let dragStartValue: number\n let dragStartPos: number\n let drag = dragUtil({\n onStart: (e) => {\n dragStartValue = value\n dragStartPos = getTouchInTarget(e, drag.target).normalizedX\n },\n onMove: (e) => {\n e.preventDefault()\n drag.target?.blur()\n const d = dragStartPos - getTouchInTarget(e, drag.target).normalizedX\n let v = dragStartValue\n if (hasMinMax) {\n v -= d * (max - min)\n } else if (hasStep) {\n v -= Math.round(d * 100) * step!\n }\n setModelValue('input', limit(v))\n },\n onEnd: () => {\n setModelValue('change', value)\n drag.deactivate()\n },\n })\n\n function onwheel(e: WheelEvent) {\n if (!editing) {\n return\n }\n e.preventDefault()\n const dir = (e.ctrlKey ? 0.5 : 1) * clamp(e.deltaY, -1, 1)\n const add = (step || 0.2) * dir\n if (add) {\n setModelValue('change', limit((value || 0) - add))\n }\n }\n\n return {\n onremove: () => {\n drag.deactivate()\n },\n oninit: updateState,\n onbeforeupdate: updateState,\n view: (node) => {\n updateState(node)\n const scalar = hasMinMax ? (value - min) / (max - min) : NaN\n return m(\n 'div.twk-input.twk-scalar-input',\n {\n style: hasMinMax ? `--twk-scalar-value: ${scalar}` : '',\n class: uiClass(\n {\n 'twk-input-readonly': readonly,\n 'twk-scalar-dragable': !readonly && (hasMinMax || hasStep),\n 'twk-scalar-range': range,\n },\n node.attrs.class,\n ),\n },\n [\n node.attrs.slotBefore ? m('span', {}, node.attrs.slotBefore) : null,\n m('input', {\n type: editing ? 'number' : 'text',\n min: min,\n max: max,\n step: step,\n value: editing ? value : formatter!.format(value),\n onfocus: onfocus,\n onblur: onblur,\n oninput: oninput,\n onchange: onchange,\n onwheel: onwheel,\n onmousedown: onDragStart,\n ontouchstart: onDragStart,\n placeholder: placeholder!,\n disabled: readonly,\n }),\n node.attrs.unit ? m('span.twk-color-muted', {}, node.attrs.unit) : null,\n node.attrs.slotAfter ? m('span', {}, node.attrs.slotAfter) : null,\n ],\n )\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\nimport { ControlAdapter, getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { call, dragUtil, getTouchInTarget, uiClass } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\nimport { uiScalarInput } from './scalar'\n\nexport type AngleWidgetAttrs<T = unknown> = CommonWidgetAttrs & AngleInputAttrs<T>\n\n/**\n * Spherical component model\n * @public\n */\nexport type AngleInputAttrs<T = unknown> = TweakableAttrs<T, number> & {\n /**\n * Whether to use degrees instead of radians\n */\n degree?: boolean\n\n /**\n * The min value in degrees\n */\n min?: number\n\n /**\n * The max value in degrees\n */\n max?: number\n\n /**\n * The step value in degrees\n */\n step?: number\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (target: T, value: number) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (target: T, value: number) => void\n}\n\nexport function uiAngleWidget<T>(\n attrs: AngleWidgetAttrs<T>,\n children?: Children,\n): Vnode<AngleWidgetAttrs<T>> {\n return m(AngleWidgetComponent as any, attrs as any, children)\n}\n\nexport function uiAngleInput<T>(\n attrs: AngleInputAttrs<T>,\n children?: Children,\n): Vnode<AngleInputAttrs<T>> {\n return m(AngleInputComponent as any, attrs as any, children)\n}\n\nexport const AngleWidgetComponent: FactoryComponent<AngleWidgetAttrs<unknown>> = () => {\n return {\n view: ({ attrs: { label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: 'label.twk-angle-widget',\n label: label ?? rest.field,\n class: className,\n },\n [m(AngleInputComponent, rest)],\n )\n },\n }\n}\n\nconst RAD_TO_DEG = 180 / Math.PI\nconst DEG_TO_RAD = Math.PI / 180\n\nexport const radToDegAdapter: ControlAdapter<number, number> = {\n toControl: (value: number) => value * RAD_TO_DEG,\n fromControl: (value: number) => value * DEG_TO_RAD,\n}\n\nexport const degToRadAdapter: ControlAdapter<number, number> = {\n toControl: (value: number) => value * DEG_TO_RAD,\n fromControl: (value: number) => value * RAD_TO_DEG,\n}\n\nexport const AngleInputComponent: FactoryComponent<AngleInputAttrs> = () => {\n let angle = 0 // in radians\n let dragging = false\n let pos = [0, 0]\n let paneElement: HTMLElement\n let min: number\n let max: number\n let step: number | undefined\n let attrs: AngleInputAttrs\n\n function clampAndSnapAngle(angle: number) {\n if (min != null && max != null) {\n if (min <= max) {\n if (angle < min) {\n angle = min\n } else if (angle > max) {\n angle = max\n }\n } else if (!(angle >= min || angle <= max)) {\n const dMin = Math.abs(angle - min)\n const dMax = Math.abs(angle - max)\n angle = dMin < dMax ? min : max\n }\n } else if (min != null) {\n if (angle < min) {\n angle = min\n }\n } else if (max != null) {\n if (angle > max) {\n angle = max\n }\n }\n\n if (step != null) {\n angle = Math.round(angle / step) * step\n }\n return angle\n }\n\n function wrapDegrees(angle: number) {\n angle = angle % 360\n if (angle < 0) {\n angle += 360\n }\n return angle\n }\n\n function updateState(node: Vnode<AngleInputAttrs>) {\n attrs = node.attrs\n\n min = attrs.min!\n max = attrs.max!\n step = attrs.step!\n min = min != null ? wrapDegrees(min) * DEG_TO_RAD : null!\n max = max != null ? wrapDegrees(max) * DEG_TO_RAD : null!\n step = step != null ? wrapDegrees(step) * DEG_TO_RAD : null!\n angle = getControlValue(attrs) ?? angle\n if (attrs.degree) {\n angle = angle * DEG_TO_RAD\n }\n updatePositions()\n }\n\n function onEvent(type: 'change' | 'input') {\n updatePositions()\n const value = attrs.degree ? angle * RAD_TO_DEG : angle\n setControlValue(attrs, value)\n call(type === 'input' ? attrs.oninput : attrs.onchange, attrs.value, value)\n }\n\n function updatePositions() {\n pos[0] = Math.cos(angle)\n pos[1] = Math.sin(angle)\n }\n\n function onDragStart(e: MouseEvent) {\n dragging = true\n drag.activate(e)\n }\n\n let touchOffset: [number, number]\n const drag = dragUtil({\n onStart: (e) => {\n const touch = getTouchInTarget(e)\n touchOffset = [-(touch.x - touch.width / 2), -(touch.y - touch.height / 2)]\n },\n onMove: (e) => {\n e.preventDefault()\n const position = getTouchInTarget(e, paneElement, touchOffset)\n const px = position.normalizedX - 0.5\n const py = position.normalizedY - 0.5\n if (dragging) {\n angle = Math.atan2(px, -py)\n\n // ensure angle is always positive for better UX\n if (angle < 0) {\n angle += 2 * Math.PI\n }\n }\n angle = clampAndSnapAngle(angle)\n onEvent('input')\n m.redraw()\n },\n onEnd: () => {\n drag.deactivate()\n dragging = false\n onEvent('change')\n m.redraw()\n },\n })\n\n function wrapAngle(angle: number) {\n if (angle < 0) {\n angle += 360\n }\n return angle % 360\n }\n\n return {\n onremove: () => {\n drag.deactivate()\n },\n oninit: (node) => {\n updateState(node)\n },\n onupdate: (node) => {\n updateState(node)\n },\n view: ({ attrs: { ...rest } }: Vnode<AngleInputAttrs>) => {\n return m(\n 'div.twk-angle-input',\n {\n style: {\n '--angle-value': `${wrapAngle(angle * RAD_TO_DEG)}`,\n },\n },\n [\n uiScalarInput({\n unit: attrs.degree ? '°' : 'rad',\n range: true,\n ...rest,\n slotAfter: m('span.twk-flex-row', [\n m('span.twk-color-dim', '/'),\n (attrs.degree ? angle : angle * RAD_TO_DEG).toFixed(1),\n m('span.twk-color-dim', attrs.degree ? 'rad' : '°'),\n ]),\n }),\n\n m('div.twk-angle-pane', {\n oncreate: (vnode) => (paneElement = vnode.dom as HTMLElement),\n // onmousedown: onDragStart,\n // ontouchstart: onDragStart,\n class: uiClass({\n 'is-dragging': dragging,\n }),\n style: {\n aspectRatio: '1',\n display: 'flex',\n 'align-items': 'center',\n 'justify-content': 'center',\n position: 'relative',\n },\n }),\n ],\n )\n },\n }\n}\n","import m, { Child, Children, FactoryComponent, Vnode } from 'mithril'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { uiClass } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\n\nexport type BooleanWidgetAttrs<T = unknown> = CommonWidgetAttrs & BooleanInputAttrs<T>\n\n/**\n * Describes a checkbox control\n * @public\n */\nexport type BooleanInputAttrs<T = unknown> = TweakableAttrs<T, boolean> & {\n /**\n * This is called when the control value changes\n */\n onchange?: (model: T, value: boolean) => void\n\n /**\n * This is called when the control value changes\n */\n oninput?: (model: T, value: boolean) => void\n\n /**\n * Content before the input field\n */\n slotBefore?: Child\n\n /**\n * Content after the input field\n */\n slotAfter?: Child\n\n /**\n * Content shown when the value is true\n */\n slotTrue?: Child\n\n /**\n * Content shown when the value is false\n */\n slotFalse?: Child\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n\n /**\n * Whether to use a toggle button style instead of a checkbox. By default, this is false (checkbox style).\n */\n toggle?: boolean\n\n /**\n * Aligns the checkbox to the start or end of the control.\n * By default, the checkbox is placed at the end of the control.\n */\n align?: 'start' | 'end'\n}\n\nexport function uiBoolWidget<T>(\n attrs: BooleanWidgetAttrs<T>,\n children?: Children,\n): Vnode<BooleanWidgetAttrs<T>> {\n return m(BoolWidgetComponent as any, attrs as any, children)\n}\n\nexport function uiBoolInput<T>(\n attrs: BooleanInputAttrs<T>,\n children?: Children,\n): Vnode<BooleanInputAttrs<T>> {\n return m(BoolInputComponent as any, attrs as any, children)\n}\n\nexport const BoolWidgetComponent: FactoryComponent<BooleanWidgetAttrs> = () => {\n return {\n view: ({ attrs: { label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: 'label.twk-bool-widget',\n label: label ?? rest.field,\n class: className,\n },\n [m(BoolInputComponent, rest)],\n )\n },\n }\n}\n\nexport const BoolInputComponent: FactoryComponent<BooleanInputAttrs> = () => {\n let attrs: BooleanInputAttrs\n\n function onchange(e: Event) {\n const value = (e.target as HTMLInputElement).checked\n setControlValue(attrs, value)\n attrs.oninput?.(attrs.value, value)\n attrs.onchange?.(attrs.value, value)\n }\n\n return {\n view: (node) => {\n attrs = node.attrs\n const checked = getControlValue(attrs) === true\n const alignEnd = attrs.align === 'end'\n return m(\n 'div.twk-bool-input',\n {\n class: uiClass({\n 'twk-align-start': !alignEnd,\n 'twk-align-end': !!alignEnd,\n 'twk-bool-true': checked,\n 'twk-bool-false': !checked,\n }),\n },\n [\n attrs.slotBefore,\n attrs.readonly\n ? checked\n ? attrs.slotTrue || m('span', 'true')\n : attrs.slotFalse || m('span', 'false')\n : m('input', {\n class: uiClass({\n 'twk-toggle': !!attrs.toggle,\n 'twk-check': !attrs.toggle,\n }),\n type: 'checkbox',\n checked: checked,\n onchange: onchange,\n }),\n\n attrs.slotAfter,\n node.children,\n ],\n )\n },\n }\n}\n","import { clamp } from '../core/utils'\r\nimport { HSV, RGB } from './types'\r\n\r\n/**\r\n * Converts hsv to rgb\r\n *\r\n * @public\r\n * @param hsv - HSV components where H is in range [0:360] and S and V are in range [0:1]\r\n * @returns RGB color components in range [0:1]\r\n */\r\nexport function hsv2rgb(hsv: HSV): RGB {\r\n let H = hsv.h % 360\r\n let S = clamp(hsv.s, 0, 1)\r\n let V = clamp(hsv.v, 0, 1)\r\n\r\n let C = V * S\r\n let X = C * (1 - Math.abs(((H / 60) % 2) - 1))\r\n let m = V - C\r\n\r\n const rgb: RGB = { r: 0, g: 0, b: 0 }\r\n if (H < 60) {\r\n rgb.r = C\r\n rgb.g = X\r\n rgb.b = 0\r\n } else if (H < 120) {\r\n rgb.r = X\r\n rgb.g = C\r\n rgb.b = 0\r\n } else if (H < 180) {\r\n rgb.r = 0\r\n rgb.g = C\r\n rgb.b = X\r\n } else if (H < 240) {\r\n rgb.r = 0\r\n rgb.g = X\r\n rgb.b = C\r\n } else if (H < 300) {\r\n rgb.r = X\r\n rgb.g = 0\r\n rgb.b = C\r\n } else {\r\n rgb.r = C\r\n rgb.g = 0\r\n rgb.b = X\r\n }\r\n\r\n rgb.r += m\r\n rgb.g += m\r\n rgb.b += m\r\n\r\n return rgb\r\n}\r\n\r\n/**\r\n * Converts rgb to hsv\r\n *\r\n * @public\r\n * @remarks\r\n * The RGB components are assumed to be in range [0:1].\r\n * The resulting H component is in range [0:360] and S and V in range [0:1]\r\n */\r\nexport function rgb2hsv(rgb: RGB): HSV {\r\n let r = rgb.r\r\n let g = rgb.g\r\n let b = rgb.b\r\n\r\n let V = Math.max(r, g, b)\r\n let d = V - Math.min(r, g, b)\r\n\r\n let S = 0\r\n let H = 0\r\n if (d !== 0) {\r\n S = d / V\r\n if (V === r) {\r\n H = (g - b) / d + (g < b ? 6 : 0)\r\n H = (H % 6) * 60\r\n } else if (V === g) {\r\n H = (b - r) / d + 2\r\n H = H * 60\r\n } else {\r\n H = (r - g) / d + 4\r\n H = H * 60\r\n }\r\n }\r\n\r\n return { h: H, s: S, v: V }\r\n}\r\n","import { ColorAdapter, RGBA } from './types'\n\nexport class ArrayColorAdapter implements ColorAdapter<number[]> {\n constructor(\n private components: string[],\n private normalized: boolean,\n ) {\n //\n }\n public toControl(v: number[]) {\n v = v || []\n const result: RGBA = { r: 0, g: 0, b: 0, a: 1 }\n this.components.forEach((key, i) => {\n result[key] = (v[i] || 0) / (this.normalized ? 1 : 255)\n })\n return result\n }\n\n public fromControl(rgba: RGBA) {\n return this.components.map(\n (key) => (this.normalized ? rgba[key] : Math.round(rgba[key] * 255)) || 0,\n )\n }\n}\n","import { ColorAdapter, RGBA } from './types'\n\nexport class CssColorAdapter implements ColorAdapter<string> {\n private components: string[] = ['r', 'g', 'b', 'a']\n\n public constructor(components: string[]) {\n this.components = components\n }\n\n public toControl(value: string) {\n value = value || 'rgba(0, 0, 0)'\n const result: RGBA = { r: 0, g: 0, b: 0, a: 1 }\n const values = value\n .replace(/[rgba\\(\\)]/gi, '')\n .split(/,\\s*?/gi)\n .map(Number)\n this.components.forEach((key, i) => {\n result[key] = (values[i] || 0) / (key === 'a' ? 1 : 255)\n })\n return result\n }\n\n public fromControl(rgba: RGBA) {\n return (\n this.components.join('') +\n '(' +\n this.components\n .map((key) => {\n return key === 'a' ? rgba[key] : Math.round(rgba[key] * 255)\n })\n .join(', ') +\n ')'\n )\n }\n}\n","import { padLeft } from '../core/utils'\nimport { ColorAdapter, RGBA } from './types'\n\nexport class HexColorAdapter implements ColorAdapter<string> {\n constructor(\n private components: string[],\n private prefix = '#',\n ) {}\n public toControl(value?: string) {\n value = value || '#000'\n const result: RGBA = { r: 0, g: 0, b: 0, a: 1 }\n let v = value.match(/[0-9a-f]+/i)?.[0]\n if (v == null) {\n return result\n }\n if (v.length === this.components.length) {\n v = v\n .split('')\n .map((it) => `${it}${it}`)\n .join('')\n }\n this.components.forEach((key, i) => {\n result[key] = parseInt(v.substr(i * 2, 2), 16) / 255\n })\n return result\n }\n\n public fromControl(rgba: RGBA) {\n return (\n this.prefix +\n this.components\n .map((key) => padLeft(Math.round(rgba[key] * 255).toString(16), 2, '0'))\n .join('')\n )\n }\n}\n","import { padLeft } from '../core/utils'\nimport { ColorAdapter, RGBA } from './types'\n\nexport class NumberColorAdapter implements ColorAdapter<number> {\n private componentsRev: string[]\n constructor(private components: string[]) {\n this.componentsRev = components.slice().reverse()\n }\n public toControl(v: number) {\n v = v || 0\n const result: RGBA = { r: 0, g: 0, b: 0, a: 1 }\n this.components.forEach((key, i) => {\n result[key] = ((v >> (i * 8)) & 255) / 255\n })\n return result\n }\n\n public fromControl(rgba: RGBA) {\n const val = this.componentsRev\n .map((key) => padLeft(Math.round(rgba[key] * 255 || 0).toString(16), 2, '0'))\n .join('')\n return parseInt('0x' + val, 16)\n }\n}\n","import { ColorAdapter, RGBA } from './types'\n\nconst components = ['r', 'g', 'b', 'a']\nexport class ObjectColorCodec implements ColorAdapter<{ [key: string]: number }> {\n constructor(\n private components: string[],\n private normalized: boolean,\n ) {\n //\n }\n public toControl(v: { [key: string]: number }) {\n v = v || {}\n const result: RGBA = { r: 0, g: 0, b: 0, a: 1 }\n this.components.forEach((key, i) => {\n result[components[i]] = (v[key] || 0) / (this.normalized ? 1 : 255)\n })\n return result\n }\n\n public fromControl(rgba: RGBA) {\n const result: { [key: string]: number } = {}\n this.components.forEach((key, i) => {\n result[key] = (this.normalized ? rgba[components[i]] : Math.round(rgba[key] * 255)) || 0\n })\n return result\n }\n}\n","import { ArrayColorAdapter } from './array-format'\nimport { CssColorAdapter } from './css-string-format'\nimport { HexColorAdapter } from './hex-string-format'\nimport { NumberColorAdapter } from './number-format'\nimport { ObjectColorCodec } from './object-format'\nimport { ColorAdapter } from './types'\n\nconst codecs: { [key: string]: ColorAdapter<any> } = {}\n\n/**\n * Gets a formatter implementation for the given format\n *\n * @public\n * @param format - The format code\n */\nexport function getColorAdapter(format: string = 'rgb()'): ColorAdapter<any> {\n if (format in codecs) {\n return codecs[format]\n }\n\n {\n // array format\n // - prefix: [] or [n]\n // - optional trailing layout of components (e.g. [n]bgra)\n const match = format.match(/^\\[(n?)\\]([rgba]+)?$/i)\n if (match) {\n const isNormalized = !!match[1]\n const components = (match[2] || 'rgba').toLowerCase().split('')\n codecs[format] = new ArrayColorAdapter(components, isNormalized)\n return codecs[format]\n }\n }\n\n {\n // object format\n // - prefix: {} or {n} for normalized values\n // - optional trailing mapping of (e.g. {n}xyzw, to map rgba to xyzw)\n const match = format.match(/^\\{(n?)\\}([rgbaxyzw]+)?$/i)\n if (match) {\n const isNormalized = !!match[1]\n const components = (match[2] || 'rgba').split('')\n codecs[format] = new ObjectColorCodec(components, isNormalized)\n return codecs[format]\n }\n }\n\n {\n // number format\n // - prefix: 0x\n // - optional trailing mapping of (e.g. 0xRGBA)\n const match = format.match(/^0x([rgba]+)?$/i)\n if (match) {\n const components = (match[1] || 'rgba').toLowerCase().split('')\n codecs[format] = new NumberColorAdapter(components)\n return codecs[format]\n }\n }\n\n {\n // hex format\n // - prefix: #\n // - optional trailing mapping of (e.g. #RGBA)\n const match = format.match(/^#([rgba]+)?$/)\n if (match) {\n const components = (match[1] || 'rgba').toLowerCase().split('')\n codecs[format] = new HexColorAdapter(components, '#')\n return codecs[format]\n }\n }\n\n {\n // css format\n // - suffix: ()\n // - leading mapping (e.g. rgb() or rgba())\n const match = format.match(/^(rgb|rgba)\\(\\)$/)\n if (match) {\n const components = (match[2] || 'rgba').toLowerCase().split('')\n codecs[format] = new CssColorAdapter(components)\n return codecs[format]\n }\n }\n {\n // hex format without # prefix\n // - trailing mapping of (e.g. RGBA)\n const match = format.match(/^[rgba]+$/)\n if (match) {\n const components = format.split('')\n codecs[format] = new HexColorAdapter(components, '')\n return codecs[format]\n }\n }\n return codecs[format]\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\nimport { getColorAdapter, HSV, hsv2rgb, HSVA, rgb2hsv, RGBA } from '../../color'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { call, clamp, getTouchPoint } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\n\nexport type ColorPickerWidgetAttrs<T = unknown> = CommonWidgetAttrs & ColorPickerAttrs<T>\n\n/**\n * Color picker component model\n *\n * @public\n */\nexport type ColorPickerAttrs<T = unknown> = TweakableAttrs<T, any> & {\n /**\n * The format of the string value. Defaults to 'rgb'\n *\n * @remarks\n * This must be a combination of the letters `r`, `g`, `b` and `a`.\n *\n * A prefix of `#` indicates the input/output is a hex string. e.g. #rgba\n *\n * A prefix of `0x` indicates the input is a number. e.g. 0xrgba\n *\n * A prefix of `[]` indicates the input is an array of numbers. e.g. `[]rgba`\n *\n * If a prefix is missing `#` is assumed\n */\n format?: string\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: any) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: any) => void\n}\n\nexport function uiColorPickerWidget<T>(\n attrs: ColorPickerWidgetAttrs<T>,\n children?: Children,\n): Vnode<ColorPickerWidgetAttrs<T>> {\n return m(ColorPickerWidgetComponent as any, attrs as any, children)\n}\n\nexport function uiColorPicker<T>(\n attrs: ColorPickerAttrs<T>,\n children?: Children,\n): Vnode<ColorPickerAttrs<T>> {\n return m(ColorPicker as any, attrs as any, children)\n}\n\nexport const ColorPickerWidgetComponent: FactoryComponent<ColorPickerWidgetAttrs> = () => {\n return {\n view: ({ attrs: { label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: 'div.twk-picker-color-widget',\n label: label ?? rest.field,\n class: className,\n },\n [m(ColorPicker, rest)],\n )\n },\n }\n}\n\nexport const ColorPicker: FactoryComponent<ColorPickerAttrs> = () => {\n let hue = 0 // range [0,1]\n let sat = 0 // range [0,1]\n let val = 0 // range [0,1]\n let a = 0 // range [0,1]\n let attrs: ColorPickerAttrs\n\n function getHSVA(s = sat, v = val): HSVA {\n return {\n h: hue * 360,\n s: s,\n v: v,\n a: a,\n }\n }\n\n function getRGB(s = sat, v = val) {\n return hsv2rgb(getHSVA(s, v))\n }\n\n function getRGBA(s = sat, v = val, alpha = a): RGBA {\n return { ...getRGB(s, v), a: alpha }\n }\n\n function setHSV(hsv: HSV) {\n hue = hsv.h / 360\n sat = hsv.s\n val = hsv.v\n }\n\n function setHSVA(hsv: HSVA) {\n setHSV(hsv)\n a = hsv.a\n }\n\n function getHexRGB(s?: number, v?: number) {\n return getColorAdapter('#rgb').fromControl(getRGBA(s, v))\n }\n\n function getHexRGBA(s?: number, v?: number) {\n return getColorAdapter('#rgba').fromControl(getRGBA(s, v))\n }\n\n function getCssRGBA(s = sat, v = val, alpha: number = a) {\n return getColorAdapter('rgba()').fromControl(getRGBA(s, v, alpha))\n }\n\n function parseInput(value: string | number | number[], format: string | undefined) {\n const rgba = getColorAdapter(format || 'rgb').toControl(value)\n setHSVA({\n ...rgb2hsv(rgba),\n a: rgba.a,\n })\n }\n\n function formatOutput(format: string | undefined) {\n return getColorAdapter(format).fromControl(getRGBA())\n }\n\n function triggerInput() {\n const value = formatOutput(attrs.format)\n const written = setControlValue(attrs, value)\n call(attrs.oninput, attrs.value, written)\n }\n\n function triggerChange() {\n const value = formatOutput(attrs.format)\n const written = setControlValue(attrs, value)\n call(attrs.onchange, attrs.value, written)\n }\n\n function hasAlpha() {\n return attrs.format?.match(/a/i)\n }\n\n //\n // manual input\n //\n\n function inputR(e: Event) {\n input(e, 'r')\n }\n\n function inputG(e: Event) {\n input(e, 'g')\n }\n\n function inputB(e: Event) {\n input(e, 'b')\n }\n\n function input(e: Event, field: keyof RGBA) {\n const color = getRGBA()\n color[field] = parseInt((e.target as HTMLInputElement).value, 10) / 255\n setHSV(rgb2hsv(color))\n triggerInput()\n triggerChange()\n }\n\n function inputHex(e: Event) {\n parseInput((e.target as HTMLInputElement).value, hasAlpha() ? 'rgba' : 'rgb')\n triggerInput()\n triggerChange()\n }\n\n //\n // drag input\n //\n\n let target: HTMLElement | null = null\n let kind: 'sv' | 'h' | 'a'\n function beginPickSV(e: MouseEvent) {\n kind = 'sv'\n enableDrag(e.target as HTMLElement)\n onMouseMove(e)\n }\n\n function beginPickH(e: MouseEvent) {\n kind = 'h'\n enableDrag(e.target as HTMLElement)\n onMouseMove(e)\n }\n\n function beginPickA(e: MouseEvent) {\n kind = 'a'\n enableDrag(e.target as HTMLElement)\n onMouseMove(e)\n }\n\n function enableDrag(el: HTMLElement) {\n disableDrag()\n target = el\n const options = { passive: false }\n document.addEventListener('mousemove', onMouseMove, options)\n document.addEventListener('mouseup', onMouseUp, options)\n document.addEventListener('touchmove', onMouseMove, options)\n document.addEventListener('touchend', onMouseUp, options)\n document.addEventListener('touchcancel', onMouseUp, options)\n }\n\n function disableDrag() {\n document.removeEventListener('mousemove', onMouseMove)\n document.removeEventListener('mouseup', onMouseUp)\n document.removeEventListener('touchmove', onMouseMove)\n document.removeEventListener('touchend', onMouseUp)\n document.removeEventListener('touchcancel', onMouseUp)\n }\n\n function onMouseMove(e: MouseEvent | TouchEvent) {\n if (!target) {\n return\n }\n e.preventDefault()\n\n const rect = target.getBoundingClientRect()\n const tx = window.pageXOffset || document.documentElement.scrollLeft\n const ty = window.pageYOffset || document.documentElement.scrollTop\n const cw = target.clientWidth\n const ch = target.clientHeight\n let [cx, cy] = getTouchPoint(e)\n cx = clamp((cx - tx - rect.left) / cw, 0, 1)\n cy = clamp((cy - ty - rect.top) / ch, 0, 1)\n\n if (kind === 'sv') {\n sat = cx\n val = 1 - cy\n }\n if (kind === 'h') {\n hue = 1 - cx\n }\n if (kind === 'a') {\n a = cx\n }\n\n triggerInput()\n m.redraw()\n }\n\n function onMouseUp() {\n if (target != null) {\n target = null\n disableDrag()\n triggerChange()\n }\n }\n\n return {\n onremove: () => {\n disableDrag()\n },\n oninit: (node) => {\n attrs = node.attrs\n parseInput(getControlValue(attrs), attrs.format)\n },\n onupdate: (node) => {\n attrs = node.attrs\n parseInput(getControlValue(attrs), attrs.format)\n },\n view: (node) => {\n attrs = node.attrs\n parseInput(getControlValue(attrs), attrs.format)\n const rgba = getRGBA()\n return m('div.twk-color-picker', {}, [\n m(\n '.color-picker-inputs',\n m(\"input.twk-input.input-hex[type='text']\", {\n value: hasAlpha() ? getHexRGBA() : getHexRGB(),\n onchange: inputHex,\n }),\n m(\"input.twk-input.input-r[type='number']\", {\n min: 0,\n max: 255,\n step: 1,\n value: Math.round(rgba.r * 255),\n onchange: inputR,\n }),\n m(\"input.twk-input.input-g[type='number']\", {\n min: 0,\n max: 255,\n step: 1,\n value: Math.round(rgba.g * 255),\n onchange: inputG,\n }),\n m(\"input.twk-input.input-b[type='number']\", {\n min: 0,\n max: 255,\n step: 1,\n value: Math.round(rgba.b * 255),\n onchange: inputB,\n }),\n ),\n m(\n '.color-picker-panel',\n m(\n '.color-picker-sv',\n {\n tabindex: 0,\n onmousedown: beginPickSV,\n ontouchstart: beginPickSV,\n style: {\n 'background-color': `${getCssRGBA(1, 1, 1)}`,\n 'user-select': 'none',\n },\n },\n m('.color-picker-sv-bg', {\n style: {\n background: 'linear-gradient(to right,rgba(255,255,255,1),rgba(255,255,255,0))',\n 'user-select': 'none',\n 'pointer-events': 'none',\n },\n }),\n m('.color-picker-sv-bg', {\n style: {\n background: 'linear-gradient(to top,rgba(0,0,0,1),rgba(0,0,0,0))',\n 'user-select': 'none',\n 'pointer-events': 'none',\n },\n }),\n m('.color-picker-sv-cursor', {\n style: {\n 'user-select': 'none',\n 'pointer-events': 'none',\n 'background-color': `${getCssRGBA(hue, sat, 1)}`,\n left: `${sat * 100}%`,\n top: `${(1 - val) * 100}%`,\n },\n }),\n ),\n m(\n '.color-picker-h',\n {\n tabindex: 0,\n onmousedown: beginPickH,\n ontouchstart: beginPickH,\n style: {\n 'user-select': 'none',\n background:\n 'linear-gradient(to right, #f00 0, #f0f 17% , #00f 33% , #0ff 50% , #0f0 67% , #ff0 83% , #f00 100%)',\n },\n },\n m('.color-picker-h-cursor', {\n style: {\n 'user-select': 'none',\n 'pointer-events': 'none',\n 'background-color': `${getCssRGBA(1, 1, 1)}`,\n position: 'absolute',\n left: `${(1 - hue) * 100}%`,\n },\n }),\n ),\n !hasAlpha()\n ? null\n : m(\n '.color-picker-a',\n {\n tabindex: 0,\n onmousedown: beginPickA,\n ontouchstart: beginPickA,\n style: {\n 'user-select': 'none',\n },\n },\n m('.color-picker-a-bg', {\n style: {\n background: `linear-gradient(to right, ${getCssRGBA(\n sat,\n val,\n 0,\n )}, ${getCssRGBA(sat, val, 1)})`,\n },\n }),\n m('.color-picker-a-cursor', {\n style: {\n 'user-select': 'none',\n 'pointer-events': 'none',\n position: 'absolute',\n left: `${a * 100}%`,\n },\n }),\n ),\n ),\n ])\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\nimport { getColorAdapter } from '../../color'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { isArray, isNumber, isObject, isString, padLeft } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\nimport { ColorPickerAttrs, uiColorPicker } from './color-picker'\n\nexport type ColorWidgetAttrs<T = unknown> = CommonWidgetAttrs & ColorAttrs<T>\n\n/**\n * Color component model\n * @public\n */\nexport type ColorAttrs<T = unknown> = TweakableAttrs<T, any> & {\n /**\n * The format of the string value. Defaults to 'rgb'\n *\n * @remarks\n * This must be a combination of the letters r, g, b and a\n * and it must match the input value.\n */\n format?: string\n\n /**\n * Whether each component is normalized to range [0:1]\n */\n normalized?: boolean\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: any) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: any) => void\n}\n\nexport function uiColorWidget<T>(\n attrs: ColorWidgetAttrs<T>,\n children?: Children,\n): Vnode<ColorWidgetAttrs<T>> {\n return m(ColorWidgetComponent as any, attrs as any, children)\n}\n\nexport function uiColor<T>(attrs: ColorAttrs<T>, children?: Children): Vnode<ColorAttrs<T>> {\n return m(ColorComponent as any, attrs as any, children)\n}\n\nexport const ColorWidgetComponent: FactoryComponent<ColorWidgetAttrs> = () => {\n return {\n view: ({ attrs: { label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: 'div.twk-color-widget',\n label: label ?? rest.field,\n class: className,\n },\n [m(ColorComponent, rest)],\n )\n },\n }\n}\n\nexport const ColorComponent: FactoryComponent<ColorAttrs> = () => {\n let attrs: ColorAttrs<any>\n let opened = false\n let rgba: string\n let value: any\n const codec = getColorAdapter('rgba()')\n\n function updateState(node: Vnode<ColorAttrs>) {\n attrs = node.attrs\n value = getControlValue(attrs)\n rgba = codec.fromControl(getColorAdapter(attrs.format).toControl(value))\n }\n\n function toggle() {\n opened = !opened\n }\n\n function onPickerInput(p: ColorPickerAttrs, v: any) {\n setControlValue(attrs, v)\n attrs.oninput?.(attrs.value, v)\n }\n\n function onPickerChange(p: ColorPickerAttrs, v: any) {\n setControlValue(attrs, v)\n attrs.onchange?.(attrs.value, v)\n }\n\n function getText() {\n if (isString(value)) {\n return value\n }\n if (isNumber(value)) {\n return '0x' + padLeft(value.toString(16), 8, '0')\n }\n if (isArray(value)) {\n return value.map((it: number) => (it < 1 && it > 0 ? it.toFixed(2) : it)).join(' , ')\n }\n if (isObject(value)) {\n return Object.keys(value)\n .map((k) => {\n const it = (value as any)[k]\n return `${k}: ${it < 1 && it > 0 ? it.toFixed(2) : it}`\n })\n .join(' ')\n }\n if (value == null) {\n return 'null'\n }\n return '?'\n }\n\n return {\n oninit: updateState,\n onbeforeupdate: updateState,\n view: ({ attrs: { value, field, binding, format } }) => {\n return [\n m(\n 'div.twk-color-input',\n {\n style: { '--twk-color-value': rgba },\n },\n m(\n \"button.twk-btn[type='button']\",\n {\n onclick: toggle,\n },\n getText() || '?',\n ),\n opened\n ? m.fragment({}, [\n uiColorPicker({\n binding: binding as never,\n value: value as any,\n field: field,\n format: format,\n oninput: onPickerInput,\n onchange: onPickerChange,\n }),\n ])\n : null,\n ),\n ]\n },\n }\n}\n","import m, { Child, Children, FactoryComponent, Vnode } from 'mithril'\nimport { getControlValue, setControlValue } from '../../core'\nimport { uiWidget, ValueWidgetAttrs } from '../elements'\n\n/**\n * Basic input component model\n * @public\n */\nexport type InputWidgetAttrs<T = unknown> = ValueWidgetAttrs<T, string> & {\n /**\n * The placeholder text\n */\n placeholder?: string\n\n /**\n * Content before the input field\n */\n slotBefore?: Child\n\n /**\n * Content after the input field\n */\n slotAfter?: Child\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: string) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: string) => void\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n\n /**\n *\n */\n type?: string\n}\n\nexport function uiInputWidget<T>(\n attrs: InputWidgetAttrs<T>,\n children?: Children,\n): Vnode<InputWidgetAttrs<T>> {\n return m(InputWidgetComponent as any, attrs as any, children)\n}\n\nexport function uiInput<T>(\n attrs: InputWidgetAttrs<T>,\n children?: Children,\n): Vnode<InputWidgetAttrs<T>> {\n return m(InputWidgetComponent as any, attrs as any, children)\n}\n\nexport const InputWidgetComponent: FactoryComponent<InputWidgetAttrs> = () => {\n return {\n view: ({ attrs: { label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: 'label.twk-input-widget',\n label: label ?? rest.field,\n class: className,\n },\n m(InputComponent, rest),\n )\n },\n }\n}\n\nexport const InputComponent: FactoryComponent<InputWidgetAttrs> = () => {\n let attrs: InputWidgetAttrs\n function onchange(e: Event) {\n const el = e.target as HTMLInputElement\n const value = el.value\n setControlValue(attrs, value)\n const cb = e.type === 'input' ? attrs.oninput : attrs.onchange\n cb?.(attrs.value, value)\n }\n\n return {\n view: (node) => {\n attrs = node.attrs\n return m('div.twk-input', {}, [\n node.attrs.slotBefore ? m('span', {}, node.attrs.slotBefore) : null,\n m('input', {\n type: attrs.type || 'text',\n value: getControlValue(attrs),\n oninput: onchange,\n onchange: onchange,\n placeholder: attrs.placeholder,\n disabled: attrs.readonly,\n }),\n node.attrs.slotAfter ? m('span', {}, node.attrs.slotAfter) : null,\n ])\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\nimport { uiScalarInput } from './scalar'\n\n/**\n * @public\n */\nexport type MatrixElements = number[]\nexport type MatrixWidgetAttrs<T = unknown> = CommonWidgetAttrs & MatrixInputAttrs<T>\n\n/**\n * Matrix component model\n * @public\n */\nexport type MatrixInputAttrs<T = unknown> = TweakableAttrs<T, MatrixElements> & {\n /**\n * The number of rows in the matrix\n */\n rows: number\n /**\n * The number of columns in the matrix\n */\n cols: number\n /**\n * Whether the input values are ordered in row-major order. Default assumes column-major order.\n */\n rowMajor?: boolean\n /**\n * The min value\n */\n min?: number\n /**\n * The max value\n */\n max?: number\n /**\n * The step value\n */\n step?: number\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: unknown) => void\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: unknown) => void\n /**\n * Disables the control input\n */\n readonly?: boolean\n}\n\nexport function uiMatrixWidget<T>(\n attrs: MatrixWidgetAttrs<T>,\n children?: Children,\n): Vnode<MatrixWidgetAttrs<T>> {\n return m(MatrixWidgetComponent as any, attrs as any, children)\n}\n\nexport const MatrixWidgetComponent: FactoryComponent<MatrixWidgetAttrs> = () => {\n return {\n view: ({ attrs: { label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: 'label.twk-matrix-widget',\n label: label ?? rest.field,\n class: className,\n },\n [m(MatrixInputComponent, rest)],\n )\n },\n }\n}\nexport function uiMatrixInput<T>(\n attrs: MatrixInputAttrs<T>,\n children?: Children,\n): Vnode<MatrixInputAttrs<T>> {\n return m(MatrixInputComponent as any, attrs as any, children)\n}\n\nexport const MatrixInputComponent: FactoryComponent<MatrixInputAttrs> = () => {\n let attrs: MatrixInputAttrs\n\n function onchange(type: 'input' | 'change', field: number, v: number) {\n const value = getControlValue(attrs) || ({} as any)\n value[field] = v\n setControlValue(attrs, value)\n const cb = type === 'input' ? attrs.oninput : attrs.onchange\n cb?.(attrs.value, value)\n }\n\n function indices(rows: number, cols: number) {\n const result: number[] = []\n cols = attrs.rowMajor ? rows : cols\n rows = attrs.rowMajor ? cols : rows\n for (let c = 0; c < cols; c++) {\n for (let r = 0; r < rows; r++) {\n result.push(r * cols + c)\n }\n }\n return result\n }\n\n return {\n view: (node) => {\n attrs = node.attrs\n const cols = attrs.cols ?? 1\n const rows = attrs.rows ?? 1\n const value = getControlValue(attrs)\n return m(\n 'div.twk-matrix-input',\n {\n style: {\n display: 'grid',\n gridTemplateColumns: `repeat(${cols}, auto)`,\n },\n },\n indices(rows, cols).map((field) => {\n return uiScalarInput({\n min: attrs.min,\n max: attrs.max,\n step: attrs.step,\n value,\n field,\n readonly: attrs.readonly,\n oninput: (_, v) => onchange('input', field, v as number),\n onchange: (_, v) => onchange('change', field, v as number),\n })\n }),\n )\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\n\nimport { getControlValue } from '../../core'\nimport { call, clamp, dragUtil, getTouchPoint, uiClass } from '../../core/utils'\nimport { uiWidget, ValueWidgetAttrs } from '../elements'\n\n/**\n * Point component model\n * @public\n */\nexport type PointAttrs<T = unknown> = ValueWidgetAttrs<T, any> & {\n /**\n * The object field names. Defaults to `['x', 'y']`\n */\n keys?: string[]\n\n /**\n * X-Axis min and max valuse\n */\n rangeX?: [number, number]\n\n /**\n * Y-Axis min and max valuse\n */\n rangeY?: [number, number]\n\n /**\n * Value to reset to when released\n */\n reset?: [number, number]\n\n /**\n * Snap to grid value\n */\n snap?: number\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: PointAttrs<T>, value: number) => void\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: PointAttrs<T>, value: number) => void\n}\n\nconst DEFAULT_RANGE = [0, 1]\nconst DEFAULT_KEYS = ['x', 'y']\n\nexport function uiPoint<T>(attrs: PointAttrs<T>, children?: Children): Vnode<PointAttrs<T>> {\n return m(PointComponent as any, attrs as any, children)\n}\n\nexport const PointComponent: FactoryComponent<PointAttrs> = () => {\n let kx: any\n let ky: any\n let xRange = DEFAULT_RANGE\n let yRange = DEFAULT_RANGE\n let vx = 0\n let vy = 0\n let x = 0\n let y = 0\n let rx: number\n let ry: number\n let snap: number\n let attrs: PointAttrs\n\n function updateState(node: m.Vnode<PointAttrs>) {\n attrs = node.attrs\n const keys = attrs.keys || DEFAULT_KEYS\n kx = keys[0]\n ky = keys[1]\n const value: any = getControlValue(attrs) ?? {\n [kx]: vx,\n [ky]: vy,\n }\n snap = attrs.snap!\n vx = value[kx] || 0\n vy = value[ky] || 0\n xRange = attrs.rangeX || xRange\n yRange = attrs.rangeY || yRange\n x = (vx - xRange[0]) / (xRange[1] - xRange[0])\n y = (vy - yRange[0]) / (yRange[1] - yRange[0])\n const reset = attrs.reset\n if (reset) {\n rx = (reset[0] - xRange[0]) / (xRange[1] - xRange[0])\n ry = (reset[1] - yRange[0]) / (yRange[1] - yRange[0])\n }\n }\n\n function updateValue() {\n vx = xRange[0] + (xRange[1] - xRange[0]) * x\n vy = yRange[0] + (yRange[1] - yRange[0]) * y\n if (snap > 0) {\n vx = Math.floor(vx / snap) * snap\n vy = Math.floor(vy / snap) * snap\n x = (vx - xRange[0]) / (xRange[1] - xRange[0])\n y = (vy - yRange[0]) / (yRange[1] - yRange[0])\n }\n }\n\n function onchange(type: 'change' | 'input') {\n updateValue()\n const value: any = getControlValue(attrs) ?? {\n [kx]: vx,\n [ky]: vy,\n }\n value[kx] = vx\n value[ky] = vy\n call(type === 'input' ? attrs.oninput : attrs.onchange, attrs, value)\n }\n\n function onMouseDown(e: MouseEvent) {\n drag.activate(e)\n }\n\n const drag = dragUtil({\n onMove: (e) => {\n e.preventDefault()\n const target = drag.target!\n const rect = target.getBoundingClientRect()\n const tx = window.pageXOffset || document.documentElement.scrollLeft\n const ty = window.pageYOffset || document.documentElement.scrollTop\n\n const cw = target.clientWidth\n const ch = target.clientHeight\n let [cx, cy] = getTouchPoint(e)\n x = clamp((cx - tx - rect.left) / cw, 0, 1)\n y = clamp((cy - ty - rect.top) / ch, 0, 1)\n\n onchange('input')\n m.redraw()\n },\n onEnd: () => {\n drag.deactivate()\n if (rx != null && ry != null) {\n x = rx\n y = ry\n onchange('input')\n }\n onchange('change')\n m.redraw()\n },\n })\n\n return {\n onremove: drag.deactivate,\n oninit: updateState,\n onupdate: updateState,\n view: (node) => {\n updateState(node)\n return uiWidget(\n {\n label: attrs.label,\n class: uiClass('twk-point', attrs.class),\n },\n m(\n '.point-area',\n {\n tabindex: 0,\n onmousedown: onMouseDown,\n ontouchstart: onMouseDown,\n },\n m('.point-x-axis', {\n style: {\n 'pointer-events': 'none',\n position: 'absolute',\n left: 0,\n right: 0,\n top: `${y * 100}%`,\n height: `1px`,\n },\n }),\n m('.point-y-axis', {\n style: {\n 'pointer-events': 'none',\n position: 'absolute',\n left: `${x * 100}%`,\n top: 0,\n bottom: 0,\n width: `1px`,\n },\n }),\n m('.point-cursor', {\n style: {\n 'pointer-events': 'none',\n left: `${x * 100}%`,\n top: `${y * 100}%`,\n position: 'absolute',\n width: '11px',\n height: '11px',\n 'margin-top': '-5px',\n 'margin-left': '-5px',\n border: '1px solid white',\n 'border-radius': '5px',\n 'box-shadow': '0px 0px 2px 1px rgba(0, 0, 0, 0.75)',\n },\n }),\n ),\n )\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\n\nimport { getControlValue, setControlValue } from '../../core'\nimport { isNumber, isString } from '../../core/utils'\nimport { uiWidget, ValueWidgetAttrs } from '../elements'\n\n/**\n * @public\n */\nexport type SelectOption = {\n label: string\n value: unknown\n disabled?: boolean\n}\n/**\n * @public\n */\nexport type SelectOptionArray = Array<SelectOption | SelectOptionGroup | string | number>\n/**\n * @public\n */\nexport type SelectOptionsObject = {\n [key: string]: unknown\n}\n/**\n * @public\n */\nexport type SelectOptionGroup<T = SelectOptionArray | SelectOptionsObject> = {\n label: string\n options: T\n disabled?: boolean\n}\n\n/**\n * Select component select options\n * @public\n */\nexport type SelectModelOptions = SelectOptionArray | SelectOptionsObject\n\n/**\n * Select component model\n * @public\n */\nexport type SelectAttrs<T = unknown, V = any> = ValueWidgetAttrs<T, V> & {\n /**\n * The select options\n */\n options?: SelectModelOptions\n\n /**\n * This is called once the control value is committed by the user.\n */\n onchange?: (model: T, value: V) => void\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n}\n\nfunction optionsFromFlatArray(arr: SelectOptionArray): SelectOption[] {\n const res: SelectOption[] = []\n for (const it of arr) {\n if (isString(it) || isNumber(it)) {\n res.push({ value: it, label: String(it) })\n continue\n }\n if ('value' in it) {\n res.push(it)\n continue\n }\n }\n return res\n}\n\nfunction optionsFromArray(\n arr: SelectOptionArray,\n): Array<SelectOption | SelectOptionGroup<SelectOption[]>> {\n const res: Array<SelectOption | SelectOptionGroup<SelectOption[]>> = []\n for (const it of arr) {\n if (isString(it) || isNumber(it) || it == null) {\n res.push({ value: it, label: String(it) })\n } else if ('value' in it) {\n res.push(it)\n } else if ('options' in it) {\n res.push({\n label: it.label,\n disabled: it.disabled,\n options: Array.isArray(it.options)\n ? optionsFromFlatArray(it.options)\n : optionsFromObject(it.options),\n })\n }\n }\n return res\n}\n\nfunction optionsFromObject(obj: SelectOptionsObject): Array<SelectOption> {\n return Object.keys(obj)\n .sort()\n .map((key) => ({ value: obj[key], label: key }))\n}\n\nfunction getOptions(\n node: m.Vnode<SelectAttrs>,\n): Array<SelectOption | SelectOptionGroup<SelectOption[]>> {\n const options = node.attrs.options\n\n if (!options) {\n return []\n }\n\n if (Array.isArray(options)) {\n return optionsFromArray(options)\n }\n return optionsFromObject(options)\n}\n\nexport function uiSelect<T>(attrs: SelectAttrs<T>, children?: Children): Vnode<SelectAttrs<T>> {\n return m(SelectComponent as any, attrs as any, children)\n}\n\nexport const SelectComponent: FactoryComponent<SelectAttrs> = () => {\n let attrs: SelectAttrs\n let options: Array<SelectOption | SelectOptionGroup<SelectOption[]>>\n\n function getSelectedIndex() {\n const value = getControlValue(attrs)\n let i = 0\n for (const o0 of options) {\n if ('options' in o0) {\n for (const o1 of o0.options) {\n if (o1.value === value) {\n return i\n }\n i++\n }\n } else {\n if (o0.value === value) {\n return i\n }\n i++\n }\n }\n }\n\n function getSelectionAt(index: number) {\n let i = 0\n for (const o0 of options) {\n if ('options' in o0) {\n for (const o1 of o0.options) {\n if (i === index) {\n return o1.value\n }\n i += 1\n }\n } else {\n if (i === index) {\n return o0.value\n }\n i += 1\n }\n }\n return null\n }\n\n function onchange(e: Event) {\n const el = e.target as HTMLSelectElement\n const value = getSelectionAt(el.selectedIndex)\n const written = setControlValue(attrs, value)\n attrs.onchange?.(attrs, written)\n }\n\n return {\n view: (node) => {\n attrs = node.attrs\n options = getOptions(node)\n return uiWidget(\n {\n tagName: 'label.twk-select',\n label: attrs.label ?? attrs.field,\n class: attrs.class,\n },\n m(\n 'select.twk-select-input',\n {\n selectedIndex: getSelectedIndex(),\n onchange: onchange,\n disabled: attrs.readonly,\n },\n options.map((it) => {\n if ('options' in it) {\n return m(\n 'optgroup',\n {\n disabled: !!it.disabled,\n label: it.label || '',\n },\n it.options.map(option),\n )\n }\n return option(it)\n }),\n ),\n )\n },\n }\n}\n\nfunction option(it: SelectOption) {\n return m(\n 'option',\n {\n value: it.value,\n label: it.label,\n disabled: !!it.disabled,\n },\n it.label || '',\n )\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\n\nimport { getControlValue, setControlValue } from '../../core'\nimport { call, clamp, dragUtil, getTouchInTarget, uiClass } from '../../core/utils'\nimport { uiWidget, ValueWidgetAttrs } from '../elements'\n\n/**\n * @public\n */\nexport type CartesianValue = { x: number; y: number; z: number }\n\n/**\n * @internal\n */\nexport type SphericalValue = { radius: number; azimuth: number; polar: number }\n\n/**\n * Spherical component model\n * @public\n */\nexport type SphericalAttrs<T = unknown> = ValueWidgetAttrs<T, CartesianValue> & {\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: unknown) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: unknown) => void\n}\n\nexport function uiSpherical<T>(\n attrs: SphericalAttrs<T>,\n children?: Children,\n): Vnode<SphericalAttrs<T>> {\n return m(SphericalComponent as any, attrs as any, children)\n}\n\nexport const SphericalComponent: FactoryComponent<SphericalAttrs> = () => {\n let radius = 1\n let azimuth = 0 // [0, 2PI]\n let polar = 0 // [0, PI]\n let backface = false\n let paneElement: HTMLElement\n\n let dragging: 'pol' | 'azi' | null = null\n let attrs: SphericalAttrs\n let cartesian: CartesianValue\n function read(): SphericalValue {\n return toSpherical(getControlValue(attrs) || toCartesian(radius, azimuth, polar))\n }\n\n function updateState(node: m.Vnode<SphericalAttrs>) {\n attrs = node.attrs\n const value = read()\n radius = value.radius ?? 1\n azimuth = value.azimuth ?? 0\n polar = value.polar ?? 0\n backface = polar > Math.PI / 2\n }\n\n function onchange(type: 'change' | 'input') {\n const value = toCartesian(radius, azimuth, polar)\n setControlValue(attrs, value)\n call(type === 'input' ? attrs.oninput : attrs.onchange, attrs.value, value)\n }\n\n function onStartPolar(e: MouseEvent) {\n dragging = 'pol'\n drag.activate(e)\n ;(e.target as HTMLElement).focus()\n return false\n }\n function onStartAzim(e: MouseEvent) {\n dragging = 'azi'\n drag.activate(e)\n ;(e.target as HTMLElement).focus()\n return false\n }\n\n const drag = dragUtil({\n onStart: (e) => {},\n onMove: (e) => {\n const position = getTouchInTarget(e, paneElement)\n const px = position.normalizedX - 0.5\n const py = position.normalizedY - 0.5\n if (dragging === 'azi') {\n // [-PI;PI]\n azimuth = Math.atan2(py, px)\n if (azimuth < 0) {\n azimuth += 2 * Math.PI\n }\n } else if (dragging === 'pol') {\n // closest point on segment\n // p0: [0, 0], p1: vPhi\n const ab = [Math.cos(azimuth), Math.sin(azimuth)]\n const ac = [px, py]\n const t = (ab[0] * ac[0] + ab[1] * ac[1]) / Math.sqrt(ab[0] * ab[0] + ab[1] * ab[1])\n\n polar = Math.PI * clamp(t, 0, 0.5)\n if (backface) {\n polar = Math.PI - polar\n }\n }\n onchange('input')\n m.redraw()\n },\n onEnd: (e) => {\n drag.deactivate()\n dragging = null\n onchange('change')\n m.redraw()\n },\n })\n\n function onPhiInput(model: unknown, value: number) {\n azimuth = toRad(value)\n onchange('input')\n }\n function onPhiChange(model: unknown, value: number) {\n azimuth = toRad(value)\n onchange('change')\n }\n\n function onThetaInput(model: unknown, value: number) {\n polar = toRad(value)\n onchange('input')\n }\n function onThetaChange(model: unknown, value: number) {\n polar = toRad(value)\n onchange('change')\n }\n function onBackfaceChange(model: unknown, value: boolean) {\n backface = value\n polar = Math.PI - polar\n onchange('change')\n setTimeout(() => m.redraw())\n }\n\n return {\n onremove: () => {\n drag.deactivate()\n },\n oninit: updateState,\n onupdate: updateState,\n view: () => {\n cartesian = toCartesian(radius, azimuth, polar, cartesian)\n return uiWidget(\n {\n tagName: 'label.twk-spherical',\n label: attrs.label ?? attrs.field,\n class: attrs.class,\n style: {\n '--azimuth-value': `${toDeg(azimuth)}`,\n '--polar-value': `${toDeg(polar)}`,\n },\n },\n [\n m(\n 'div.twk-spherical-label',\n {},\n `x: ${cartesian.x.toFixed(2)} y: ${cartesian.y.toFixed(2)} z: ${cartesian.z.toFixed(2)}`,\n ),\n m(\n 'div.twk-spherical-pane',\n {\n oncreate: (vnode) => (paneElement = vnode.dom as HTMLElement),\n class: uiClass({\n 'is-dragging': !!dragging,\n }),\n style: {\n aspectRatio: '1',\n display: 'flex',\n 'align-items': 'center',\n 'justify-content': 'center',\n position: 'relative',\n },\n },\n m(\n 'div.twk-spherical-arm',\n {\n onmousedown: onStartPolar,\n ontouchstart: onStartPolar,\n tabIndex: 0,\n style: {\n width: '50%', // gives us the radius\n display: 'flex',\n justifyContent: 'end', // push knob to edge\n alignItems: 'center',\n transform: `translateX(50%) rotate(${azimuth}rad)`,\n transformOrigin: 'left center',\n },\n },\n m('div.twk-spherical-knob', {\n onmousedown: onStartAzim,\n ontouchstart: onStartAzim,\n tabIndex: 0,\n style: {\n aspectRatio: '1',\n transform: 'translateX(100%)',\n },\n }),\n ),\n ),\n ],\n )\n },\n }\n}\n\nfunction toDeg(value: number) {\n return value * (180 / Math.PI)\n}\nfunction toRad(value: number) {\n return value * (Math.PI / 180)\n}\n\n/**\n *\n * @param value\n * @returns\n */\nfunction toSpherical(value: Partial<CartesianValue>) {\n const x = value?.x ?? 0\n const y = value?.y ?? 0\n const z = value?.z ?? 0\n\n const radius = Math.sqrt(x * x + y * y + z * z) || 1\n\n const theta = Math.atan2(z, x) || 0 // rotation around Y\n const phi = Math.acos(y / radius) || 0 // angle from +Y\n\n return {\n radius,\n azimuth: theta,\n polar: phi,\n }\n}\n\n/**\n *\n * @param r - radius [0;inf]\n * @param theta - azimuth [0;2PI]\n * @param phi - polar [0;PI]\n * @returns\n */\nfunction toCartesian(\n r: number,\n theta: number,\n phi: number,\n out?: Partial<CartesianValue>,\n): CartesianValue {\n const sinPhi = Math.sin(phi)\n\n out = out || {}\n out.x = r * Math.cos(theta) * sinPhi\n out.y = r * Math.cos(phi)\n out.z = r * Math.sin(theta) * sinPhi\n\n return out as CartesianValue\n}\n","import m, { Child, Children, FactoryComponent, Vnode } from 'mithril'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { uiClass } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\n\nexport type StringWidgetAttrs<T = unknown> = CommonWidgetAttrs & StringInputAttrs<T>\n\n/**\n * Text component model\n * @public\n */\nexport type StringInputAttrs<T = unknown> = TweakableAttrs<T, string> & {\n /**\n * The placeholder text\n */\n placeholder?: string\n\n /**\n *\n */\n slotStart?: Child\n\n /**\n *\n */\n slotEnd?: Child\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: string) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: string) => void\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n\n /**\n * The number of rows for a textarea. If not specified, a single-line input will be used.\n */\n rows?: number\n}\n\nexport function uiStringWidget<T>(\n attrs: StringWidgetAttrs<T>,\n children?: Children,\n): Vnode<StringWidgetAttrs<T>> {\n return m(StringWidgetComponent as any, attrs as any, children)\n}\n\nexport function uiString<T>(\n attrs: StringInputAttrs<T>,\n children?: Children,\n): Vnode<StringInputAttrs<T>> {\n return m(StringInputComponent as any, attrs as any, children)\n}\n\nexport const StringWidgetComponent: FactoryComponent<StringWidgetAttrs> = () => {\n return {\n view: ({ attrs: { label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: 'label.twk-string-widget',\n label: label ?? rest.field,\n class: className,\n },\n [m(StringInputComponent, rest)],\n )\n },\n }\n}\nexport const StringInputComponent: FactoryComponent<StringInputAttrs> = () => {\n let attrs: StringInputAttrs\n function onchange(e: Event) {\n const el = e.target as HTMLInputElement\n const value = el.value\n setControlValue(attrs, value)\n const cb = e.type === 'input' ? attrs.oninput : attrs.onchange\n cb?.(attrs.value, value)\n }\n\n return {\n view: (node) => {\n attrs = node.attrs\n const editable = !attrs.readonly\n const value = getControlValue(attrs)\n return m(\n 'div.twk-input.twk-string-input',\n {\n class: uiClass({\n 'twk-input-readonly': !!attrs.readonly,\n }),\n },\n [\n attrs.slotStart ?? null,\n editable ? null : m('div.twk-input-value', value),\n !editable\n ? null\n : m(attrs.rows ? 'textarea' : \"input[type='text']\", {\n value: value,\n oninput: onchange,\n onchange: onchange,\n placeholder: attrs.placeholder,\n disabled: attrs.readonly,\n rows: attrs.rows,\n }),\n\n attrs.slotEnd ?? null,\n ],\n )\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\nimport { uiScalarInput } from './scalar'\n\nexport type VectorWidgetAttrs<T = unknown> = CommonWidgetAttrs & VectorInputAttrs<T>\n\n/**\n * Vector component model\n * @public\n */\nexport type VectorInputAttrs<T = unknown> = TweakableAttrs<T, any> & {\n /**\n * The vector object field names. Defaults to `['x', 'y', 'z']`\n */\n keys?: string[]\n /**\n * The min value\n */\n min?: number\n /**\n * The max value\n */\n max?: number\n /**\n * The step value\n */\n step?: number\n /**\n * Number of columns to display. By default, this is determined by the number of keys.\n */\n cols?: number\n /**\n * Whether to hide the field labels and just show the input controls. Default is false.\n */\n unlabeled?: boolean\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: unknown, key?: string | number) => void\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: unknown, key?: string | number) => void\n /**\n * Disables the control input\n */\n readonly?: boolean\n}\n\nexport function uiVectorWidget<T>(\n attrs: VectorWidgetAttrs<T>,\n children?: Children,\n): Vnode<VectorWidgetAttrs<T>> {\n return m(VectorWidgetComponent as any, attrs as any, children)\n}\n\nexport function uiVectorInput<T>(\n attrs: VectorInputAttrs<T>,\n children?: Children,\n): Vnode<VectorInputAttrs<T>> {\n return m(VectorInputComponent as any, attrs as any, children)\n}\n\nexport const VectorWidgetComponent: FactoryComponent<VectorWidgetAttrs> = () => {\n return {\n view: ({ attrs: { label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: 'label.twk-vector-widget',\n label: label ?? rest.field,\n class: className,\n },\n [m(VectorInputComponent, rest)],\n )\n },\n }\n}\nconst defaultKeys = ['x', 'y', 'z']\nexport const VectorInputComponent: FactoryComponent<VectorInputAttrs> = () => {\n function onchange(type: 'input' | 'change', field: string, v: number, attrs: VectorInputAttrs) {\n const value: any = getControlValue(attrs) || {}\n value[field] = isNaN(v) ? null : v\n setControlValue(attrs, value)\n const cb = type === 'input' ? attrs.oninput : attrs.onchange\n cb?.(attrs.value, value, field)\n }\n\n return {\n view: ({ attrs }) => {\n const keys = attrs.keys || defaultKeys\n const cols = attrs.cols || keys.length\n const value = getControlValue(attrs) as any\n return m(\n 'div.twk-vector-input',\n {\n style: {\n display: 'grid',\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n },\n },\n keys.map((field) => {\n return uiScalarInput({\n min: attrs.min,\n max: attrs.max,\n step: attrs.step,\n value,\n field,\n readonly: attrs.readonly,\n slotBefore: attrs.unlabeled ? null : m('span.twk-color-muted', field),\n oninput: (_, v) => onchange('input', field, v as number, attrs),\n onchange: (_, v) => onchange('change', field, v as number, attrs),\n placeholder: field,\n })\n }),\n )\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { uiClass } from '../../core/utils'\nimport { CommonWidgetAttrs, uiButton, uiWidget } from '../elements'\n\n/**\n * @public\n */\nexport type BitmaskWidgetAttrs<T = unknown> = CommonWidgetAttrs & BitmaskInputAttrs<T>\n\n/**\n * Bitmask component model\n * @public\n */\nexport type BitmaskInputAttrs<T = unknown> = TweakableAttrs<T, number> & {\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: unknown) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: unknown) => void\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n\n /**\n * The number of bits in the mask\n */\n bitCount?: number\n\n /**\n * Maaping of names to bit values. If provided, the control will display the names instead of the bit indices.\n */\n names?: Record<string, number>\n}\n\nexport function uiBitmaskWidget<T>(\n attrs: BitmaskWidgetAttrs<T>,\n children?: Children,\n): Vnode<BitmaskWidgetAttrs<T>> {\n return m(BitmaskWidgetComponent as any, attrs as any, children)\n}\n\nexport const BitmaskWidgetComponent: FactoryComponent<BitmaskWidgetAttrs> = () => {\n return {\n view: ({ attrs: { label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: 'div.twk-Bitmask-widget',\n label: label ?? rest.field,\n class: className,\n },\n [m(BitmaskInputComponent, rest)],\n )\n },\n }\n}\n\nexport function uiBitmaskInput<T>(\n attrs: BitmaskInputAttrs<T>,\n children?: Children,\n): Vnode<BitmaskInputAttrs<T>> {\n return m(BitmaskInputComponent as any, attrs as any, children)\n}\n\nexport const BitmaskInputComponent: FactoryComponent<BitmaskInputAttrs> = () => {\n let attrs: BitmaskInputAttrs\n\n function getBitCount() {\n return attrs.bitCount || 32\n }\n\n function toggleBit(index: number) {\n let value = getControlValue(attrs)\n value = value ^ (1 << index)\n emitChange(value)\n }\n\n function setAllBits() {\n const bitCount = getBitCount()\n let value = getControlValue(attrs)\n for (let i = 0; i < bitCount; i++) {\n value = value | (1 << i)\n }\n emitChange(value)\n }\n\n function clearAllBits() {\n const bitCount = getBitCount()\n let value = getControlValue(attrs)\n for (let i = 0; i < bitCount; i++) {\n value = value & ~(1 << i)\n }\n emitChange(value)\n }\n\n function emitChange(value: number) {\n setControlValue(attrs, value)\n attrs.oninput?.(attrs.value, value)\n attrs.onchange?.(attrs.value, value)\n }\n\n function isBitSet(value: number, index: number) {\n return (value & (1 << index)) !== 0\n }\n\n function bitName(index: number) {\n if (attrs.names) {\n for (const [name, value] of Object.entries(attrs.names)) {\n if (value === 1 << index) {\n return name\n }\n }\n }\n return null\n }\n\n return {\n view: (node) => {\n attrs = node.attrs\n const bitCount = getBitCount()\n const value = getControlValue(attrs)\n return m(\n 'div.twk-bitmask-input',\n {},\n Array.from({ length: bitCount }, (_, i) => {\n return m(\n 'label.twk-bitmask-row',\n {\n tabindex: 0,\n class: uiClass({\n 'twk-bitmask-active': isBitSet(value, i),\n }),\n onclick: () => toggleBit(i),\n },\n [\n m('div.twk-bitmask-indicator', {}),\n m('div.twk-bitmask-name', {}, bitName(i) || ''),\n m('div.twk-bitmask-bit', {}, `bit ${i}`),\n m(\n 'div.twk-bitmask-value',\n {},\n '0x' + String(Math.pow(2, i).toString(16)).padStart(Math.ceil(bitCount / 4), '0'),\n ),\n ],\n )\n }),\n )\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\nimport { getControlValue, TweakableAttrs } from '../../core'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\n\nexport type PollWidgetAttrs<T = unknown> = CommonWidgetAttrs & PollAttrs<T>\n\nexport type PollAttrs<T = unknown> = TweakableAttrs<T, string | number | boolean> & {\n interval?: number\n}\n\nexport function uiPollWidget<T>(\n attrs: PollWidgetAttrs<T>,\n children?: Children,\n): Vnode<PollWidgetAttrs<T>> {\n return m(PollWidgetComponent as any, attrs as any, children)\n}\n\nexport function uiPoll<T>(attrs: PollAttrs<T>, children?: Children): Vnode<PollAttrs<T>> {\n return m(PollComponent as any, attrs as any, children)\n}\n\nexport const PollWidgetComponent: FactoryComponent<PollWidgetAttrs> = () => {\n return {\n view: ({ attrs }) => {\n return uiWidget(\n {\n tagName: 'label.twk-input.twk-input-readonly',\n label: attrs.label ?? attrs.field,\n class: attrs.class,\n },\n m(PollComponent, attrs),\n )\n },\n }\n}\n\nexport const PollComponent: FactoryComponent<PollWidgetAttrs> = () => {\n let el: HTMLElement\n let timer: number\n let attrs: PollAttrs\n\n return {\n oncreate({ dom }) {\n el = dom as HTMLElement\n timer = setInterval(() => {\n const value = getControlValue(attrs) ?? ''\n el.textContent = String(value)\n }, attrs.interval ?? 500)\n },\n\n onremove() {\n clearInterval(timer)\n },\n view: (node) => {\n attrs = node.attrs\n return m('div.twk-poll', {})\n },\n }\n}\n","import { Children } from 'mithril'\nimport {\n AngleInputComponent,\n AngleWidgetComponent,\n BarComponent,\n BarContentComponent,\n BarEndComponent,\n BarStartComponent,\n BitmaskInputComponent,\n BitmaskWidgetComponent,\n BoolInputComponent,\n BoolWidgetComponent,\n ButtonAttrs,\n ButtonComponent,\n ColorComponent,\n ColorPicker,\n ColorPickerWidgetComponent,\n ColorWidgetComponent,\n Divider,\n FlexComponent,\n GraphAttrs,\n GraphComponent,\n GridComponent,\n GroupAttrs,\n GroupComponent,\n ImageAttrs,\n ImageComponent,\n MatrixInputComponent,\n MatrixWidgetComponent,\n PointComponent,\n PollComponent,\n PollWidgetComponent,\n ScalarInputComponent,\n ScalarWidgetComponent,\n SectionComponent,\n SectionFooterComponent,\n SectionHeaderComponent,\n SelectComponent,\n SphericalComponent,\n SplitComponent,\n SplitContentComponent,\n StringInputComponent,\n StringWidgetComponent,\n TabsComponent,\n TreeAttrs,\n TreeComponent,\n VectorInputComponent,\n VectorWidgetComponent,\n WidgetAttrs,\n WidgetComponent,\n} from './components'\nimport { Component, ComponentChildren, ComponentSchema, OmitIn, TweakableAttrs } from './core'\nimport { isFunction, isObject, isString } from './core/utils'\n\n/**\n * @public\n */\nexport type BuilderFn = (b: Builder) => void\n\n/**\n * @public\n */\nexport type TabsBuilderFn = (b: TabsBuilder) => void\n\n/**\n * @public\n */\nexport interface TabsBuilder {\n group(label: string, builder: BuilderFn): GroupAttrs\n}\n\n/**\n *\n * @public\n */\nexport class Builder {\n public static build(fn: BuilderFn) {\n const builder = new Builder()\n fn(builder)\n return builder.close()\n }\n\n public schema: ComponentSchema = []\n\n public close() {\n const result = this.schema\n this.schema = []\n return result\n }\n\n public group = groupGenerator(this, GroupComponent)\n\n public flex = componentGenerator(this, FlexComponent)\n public grid = componentGenerator(this, GridComponent)\n public tabs = componentGenerator(this, TabsComponent)\n public split = componentGenerator(this, SplitComponent)\n public splitContent = componentGenerator(this, SplitContentComponent)\n public section = componentGenerator(this, SectionComponent)\n public sectionHeader = componentGenerator(this, SectionHeaderComponent)\n public sectionFooter = componentGenerator(this, SectionFooterComponent)\n public bar = componentGenerator(this, BarComponent)\n public barStart = componentGenerator(this, BarStartComponent)\n public barEnd = componentGenerator(this, BarEndComponent)\n public barContent = componentGenerator(this, BarContentComponent)\n\n public bool = widgetGenerator(this, BoolWidgetComponent)\n public string = widgetGenerator(this, StringWidgetComponent)\n public scalar = widgetGenerator(this, ScalarWidgetComponent)\n public vector = widgetGenerator(this, VectorWidgetComponent)\n public matrix = widgetGenerator(this, MatrixWidgetComponent)\n public select = widgetGenerator(this, SelectComponent)\n public angle = widgetGenerator(this, AngleWidgetComponent)\n public bitmask = widgetGenerator(this, BitmaskWidgetComponent)\n public poll = widgetGenerator(this, PollWidgetComponent)\n public color = widgetGenerator(this, ColorWidgetComponent)\n public colorPicker = widgetGenerator(this, ColorPickerWidgetComponent)\n\n public boolInput = widgetGenerator(this, BoolInputComponent)\n public stringInput = widgetGenerator(this, StringInputComponent)\n public scalarInput = widgetGenerator(this, ScalarInputComponent)\n public vectorInput = widgetGenerator(this, VectorInputComponent)\n public matrixInput = widgetGenerator(this, MatrixInputComponent)\n public selectInput = widgetGenerator(this, SelectComponent)\n public angleInput = widgetGenerator(this, AngleInputComponent)\n public bitmaskInput = widgetGenerator(this, BitmaskInputComponent)\n public pollInput = widgetGenerator(this, PollComponent)\n public colorInput = widgetGenerator(this, ColorComponent)\n public colorPickerInput = widgetGenerator(this, ColorPicker)\n\n public point = widgetGenerator(this, PointComponent)\n public spherical = widgetGenerator(this, SphericalComponent)\n\n public button(text: string, opts: ButtonAttrs = {}) {\n this.add(ButtonComponent, opts, text)\n }\n\n public image(opts: ImageAttrs) {\n this.add(ImageComponent, opts)\n }\n\n public divider(content?: Children) {\n this.add(Divider, {}, content)\n }\n\n public tree<T>(opts: TreeAttrs<T>) {\n this.add(TreeComponent, opts)\n }\n\n public graph(opts: GraphAttrs) {\n this.add(GraphComponent, opts)\n }\n\n public widget(label: string, children?: ComponentChildren) {\n this.add(WidgetComponent, { label }, children)\n }\n\n public pre(label: string, children?: ComponentChildren) {\n this.add(\n WidgetComponent,\n {\n label,\n style: {\n whiteSpace: 'pre',\n },\n },\n children,\n )\n }\n\n /**\n * Adds a render function as a component\n * This breaks out of the static builder schema and allows for dynamic content.\n */\n public view(view: () => Children) {\n this.add({ view })\n }\n\n /**\n * Adds a render function as a component\n * This breaks out of the static builder schema and allows for dynamic content.\n */\n public control(attrs: WidgetAttrs, children?: ComponentChildren) {\n this.add(WidgetComponent, attrs, children)\n }\n\n /**\n * Adds a component to the builder schema\n */\n public add<Attrs extends Object>(\n component: Component<Attrs> | string,\n attributes?: Attrs,\n children?: ComponentChildren,\n ) {\n if (this.schema) {\n this.schema.push({ component, attributes, children })\n } else {\n throw new Error('Cannot use control builder after it was closed')\n }\n }\n}\n\nexport type GroupGenerator<T extends Object> = {\n (builder: BuilderFn): void\n (opts: Partial<T>): void\n (opts: Partial<T>, builder: BuilderFn): void\n (label: string, builder: BuilderFn): void\n (label: string, opts: Partial<T>): void\n (label: string, opts: Partial<T>, builder: BuilderFn): void\n}\n\nfunction groupGenerator<Attrs extends Object>(\n builder: Builder,\n component: Component<Attrs>,\n): GroupGenerator<Attrs> {\n return function () {\n const { options, children } = groupOptions<Attrs>(builder, arguments)\n builder.add(component, options, children)\n }\n}\n\nexport type FieldGenerator<A extends TweakableAttrs<any, any>> = {\n (opts: A): void\n <V, K extends keyof V>(target: V, property: K): void\n <V, K extends keyof V>(target: V, property: K, opts: OmitIn<A, 'value' | 'field'>): void\n}\n\nfunction widgetGenerator<A extends TweakableAttrs<any, any>>(\n builder: Builder,\n component: Component<A>,\n): FieldGenerator<A> {\n return function () {\n builder.add(component, fieldOptions<A>(arguments))\n }\n}\n\nexport type ComponentGenerator<T extends Object> = {\n (builder: BuilderFn): void\n (opts: Partial<T>): void\n (opts: Partial<T>, builder: BuilderFn): void\n}\n\nfunction componentGenerator<Attrs extends Object>(\n builder: Builder,\n component: Component<Attrs>,\n): ComponentGenerator<Attrs> {\n return function () {\n const { options, children } = componentOptions<Attrs>(builder, arguments)\n builder.add(component, options, children)\n }\n}\n\nfunction groupOptions<T extends Object>(b: Builder, args: IArguments) {\n let title: string | null = null\n let options: T & { title?: string } = {} as T\n let cb: BuilderFn | null = null\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (isString(arg)) {\n title = arg\n } else if (isObject(arg)) {\n options = arg as T\n } else if (isFunction(arg)) {\n cb = arg\n }\n }\n\n if (title) {\n options.title = title\n }\n\n const children: Builder['schema'] = []\n if (cb) {\n const controls = b.schema\n b.schema = children\n cb(b)\n b.schema = controls\n }\n return { options, children }\n}\n\nfunction fieldOptions<T extends TweakableAttrs<any, any> & WidgetAttrs>(args: IArguments): T {\n let attr: T\n\n if (args.length === 1) {\n return args[0] || {}\n }\n if (args.length > 1) {\n attr = args[2] || {}\n attr.value = args[0]\n attr.field = args[1]\n if (attr.label === undefined) {\n attr.label = String(attr.field || '')\n }\n } else {\n attr = {} as T\n }\n\n return attr\n}\n\nfunction componentOptions<T extends Object>(b: Builder, args: IArguments) {\n let options: T | null = null\n let cb: BuilderFn | null = null\n\n if (!args.length) {\n return { options: {} as T, children: [] }\n }\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (isObject(arg)) {\n options = arg as T\n } else if (isFunction(arg)) {\n cb = arg\n }\n }\n\n const children: Builder['schema'] = []\n if (cb) {\n const controls = b.schema\n b.schema = children\n cb(b)\n b.schema = controls\n }\n return { options: options || ({} as T), children }\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"mappings":";;;;;;;;;;;CAEA,SAAS,EAAM,GAAK,GAAK,GAAO,GAAU,GAAM,GAAK;AACpD,SAAO;GAAM;GAAU;GAAY;GAAiB;GAAgB;GAAW;GAAK,IAAI,KAAA;GAAW,SAAS,KAAA;GAAW,OAAO,KAAA;GAAW,QAAQ,KAAA;GAAW,UAAU,KAAA;GAAU;;AA8BjL,CA5BA,EAAM,YAAY,SAAS,GAAM;AAIhC,SAHI,MAAM,QAAQ,EAAK,GAAS,EAAM,KAAK,KAAA,GAAW,KAAA,GAAW,EAAM,kBAAkB,EAAK,EAAE,KAAA,GAAW,KAAA,EAAU,GACjH,KAAQ,QAAQ,OAAO,KAAS,YAAkB,OAClD,OAAO,KAAS,WAAiB,IAC9B,EAAM,KAAK,KAAA,GAAW,KAAA,GAAW,OAAO,EAAK,EAAE,KAAA,GAAW,KAAA,EAAU;IAE5E,EAAM,oBAAoB,SAAS,GAAO;AASzC,OAAK,IAND,IAAe,MAAM,EAAM,OAAO,EAKlC,IAAW,GACN,IAAI,GAAG,IAAI,EAAM,QAAQ,IAEjC,CADA,EAAS,KAAK,EAAM,UAAU,EAAM,GAAG,EACnC,EAAS,OAAO,QAAQ,EAAS,GAAG,OAAO,QAAM;AAEtD,MAAI,MAAa,KAAK,MAAa,EAAM,OACxC,OAAU,UAAU,EAAS,SAAS,KAAK,GACxC,kLACA,oEACF;AAEF,SAAO;IAGR,EAAO,UAAU;;CC/BjB,IAAI,IAAA,GAAA;AAWJ,GAAO,UAAU,SAAS,GAAO,GAAU;AAQ1C,SAPI,KAAS,QAAQ,OAAO,KAAU,YAAY,EAAM,OAAO,QAAQ,CAAC,MAAM,QAAQ,EAAM,GACvF,EAAS,WAAW,KAAK,MAAM,QAAQ,EAAS,GAAG,KAAE,IAAW,EAAS,OAE7E,IAAW,EAAS,WAAW,KAAK,MAAM,QAAQ,EAAM,GAAG,IAAQ,CAAC,GAAO,GAAG,EAAS,EACvF,IAAQ,KAAA,IAGF,EAAM,IAAI,KAAS,EAAM,KAAK,GAAO,EAAS;;;AClBtD,GAAO,UAAU,EAAE,CAAC;;ACApB,GAAO,UAAU,EAAE;;CCDnB,IAAI,IAAA,GAAA;AASJ,GAAO,UAAU,IAAI,IAAI,CAAC,CAAC,GAAY,GAAK,CAAC,CAAC;;CCT9C,IAAI,IAAA,GAAA,EACA,IAAA,GAAA,EACA,IAAA,GAAA,EACA,IAAA,GAAA,EACA,IAAA,GAAA,EAEA,IAAiB,gFACjB,IAAgB,OAAO,OAAO,KAAK;CAEvC,SAAS,EAAQ,GAAQ;AACxB,OAAK,IAAI,KAAO,EAAQ,KAAI,EAAO,KAAK,GAAQ,EAAI,CAAE,QAAO;AAC7D,SAAO;;CAGR,SAAS,EAAmB,GAAK;AAChC,SAAO,MAAQ,WAAW,MAAQ,aAAa,MAAQ,mBAAmB,MAAQ;;CAGnF,SAAS,EAAgB,GAAU;AAElC,OADA,IAAI,GAAO,IAAM,OAAO,IAAU,EAAE,EAAE,IAAQ,EAAE,EAAE,IAAW,IACtD,IAAQ,EAAe,KAAK,EAAS,GAAE;GAC7C,IAAI,IAAO,EAAM,IAAI,IAAQ,EAAM;AACnC,OAAI,MAAS,MAAM,MAAU,GAAI,KAAM;YAC9B,MAAS,IAAK,GAAM,KAAK;YACzB,MAAS,IAAK,GAAQ,KAAK,EAAM;YACjC,EAAM,GAAG,OAAO,KAAK;IAC7B,IAAI,IAAY,EAAM;AAEtB,IADA,AAAe,MAAY,EAAU,QAAQ,aAAa,KAAK,CAAC,QAAQ,SAAS,KAAK,EAClF,EAAM,OAAO,UAAS,EAAQ,KAAK,EAAU,IAEhD,EAAM,EAAM,MAAM,MAAc,KAAK,IAAY,KAAa,IAC1D,EAAmB,EAAM,GAAG,KAAE,IAAW;;;AAOhD,SAHI,EAAQ,SAAS,MAAG,EAAM,YAAY,EAAQ,KAAK,IAAI,GACvD,EAAQ,EAAM,GAAE,IAAQ,IACvB,EAAuB,IAAI,GAAO,EAAS,EACzC,EAAc,KAAY;GAAM;GAAY;GAAO,IAAI,EAAM;GAAG;;CAGxE,SAAS,EAAa,GAAO,GAAO;AACnC,IAAM,MAAM,EAAM;EAElB,IAAI,IAAQ,EAAM;AAClB,MAAI,KAAS,KAGZ,QAFA,EAAM,QAAQ,EAAM,OACpB,EAAM,KAAK,EAAM,IACV;AAQR,MALI,EAAO,KAAK,GAAO,QAAQ,KAC1B,EAAM,SAAS,SAAM,EAAM,YAAY,EAAM,QACjD,EAAM,QAAQ,OAGX,EAAM,UAAU,GAAY;GAC/B,IAAI,IAAY,EAAM;AAGtB,GAFA,IAAQ,OAAO,OAAO,EAAE,EAAE,EAAM,OAAO,EAAM,EAEzC,EAAM,MAAM,aAAa,SAAM,EAAM,YACxC,KAAa,OAEV,EAAM,MAAM,YADZ,OAAO,EAAM,MAAM,UAAU,GAAG,MAAM,OAAO,EAAU;;AAgB5D,SATI,EAAM,QAAQ,WAAW,EAAO,KAAK,GAAO,OAAO,KACtD,IAAQ,OAAO,OAAO,EAAC,MAAM,EAAM,MAAK,EAAE,EAAM,GAIjD,EAAM,KAAK,EAAM,IAEjB,EAAM,QAAQ,GAEP;;CAGR,SAAS,EAAY,GAAU,GAAO,GAAG,GAAU;AAClD,MAAI,KAAY,QAAQ,OAAO,KAAa,YAAY,OAAO,KAAa,cAAc,OAAO,EAAS,QAAS,WAClH,OAAM,MAAM,uDAAuD;EAGpE,IAAI,IAAQ,EAAiB,GAAO,EAAS;AAS7C,SAPI,OAAO,KAAa,aACvB,EAAM,WAAW,EAAM,kBAAkB,EAAM,SAAS,EACpD,MAAa,OAAY,EAAa,EAAc,MAAa,EAAgB,EAAS,EAAE,EAAM,IAGvG,AAAyB,EAAM,UAAQ,EAAE,EACzC,EAAM,MAAM,GACL;;AAGR,GAAO,UAAU;;CClGjB,IAAI,IAAA,GAAA;AAEJ,GAAO,UAAU,SAAS,GAAM;AAE/B,SADA,AAAkB,MAAO,IAClB,EAAM,KAAK,KAAA,GAAW,KAAA,GAAW,GAAM,KAAA,GAAW,KAAA,EAAU;;;CCJpE,IAAI,IAAA,GAAA,EACA,IAAA,GAAA;AAEJ,GAAO,UAAU,SAAS,GAAO,GAAG,GAAU;EAC7C,IAAI,IAAQ,EAAiB,GAAO,EAAS;AAK7C,SAHA,AAAyB,EAAM,UAAQ,EAAE,EACzC,EAAM,MAAM,KACZ,EAAM,WAAW,EAAM,kBAAkB,EAAM,SAAS,EACjD;;;CCTR,IAAI,IAAA,GAAA;AAKJ,CAHA,EAAY,QAAA,GAAA,EACZ,EAAY,WAAA,GAAA,EAEZ,EAAO,UAAU;;ACLjB,GAAO,0BAAU,IAAI,SAAO;;CCA5B,IAAI,IAAA,GAAA;CAEJ,UAAU,EAAO,GAAO;EAGvB,IAAI,IAAM,EAAM,KACZ,IAAU,EAAM,SAChB,IAAa,EAAe,IAAI,EAAI;AACxC,MAAI,KAAO,KAAM,IAAG;GACnB,IAAI,IAAc,EAAI;AAOtB,GALI,EAAe,IAAI,EAAI,KAAK,MAC/B,MAAM,GACN,MAGD,IAAM;WAEA;;AAGR,GAAO,UAAU;;CCrBjB,IAAI,IAAA,GAAA,EACA,IAAA,GAAA,EACA,IAAA,GAAA,EACA,IAAA,GAAA;AAEJ,GAAO,UAAU,WAAW;EAC3B,IAAI,IAAY;GACf,KAAK;GACL,MAAM;GACN,EAEG,GACA;EAEJ,SAAS,EAAY,GAAK;AACzB,UAAO,EAAI;;EAGZ,SAAS,EAAa,GAAO;AAC5B,UAAO,EAAM,SAAS,EAAM,MAAM,SAAS,EAAU,EAAM;;EAI5D,SAAS,EAAW,GAAO,GAAU;AACpC,OAAI,EAAM,UAAU,EAAU,OAAU,MAAM,sCAAsC;;EAOrF,SAAS,EAAS,GAAO;GACxB,IAAI,IAAW,EAAM;AACrB,OAAI;AACH,WAAO,KAAK,MAAM,GAAU,UAAU;aAC7B;AACT,MAAW,GAAO,EAAS;;;EAM7B,SAAS,EAAc,GAAK;AAC3B,OAAI;AACH,WAAO,EAAY,EAAI,CAAC;WACb;AACX,WAAO;;;EAIT,SAAS,EAAY,GAAQ,GAAQ,GAAO,GAAK,GAAO,GAAa,GAAI;AACxE,QAAK,IAAI,IAAI,GAAO,IAAI,GAAK,KAAK;IACjC,IAAI,IAAQ,EAAO;AACnB,IAAI,KAAS,QACZ,EAAW,GAAQ,GAAO,GAAO,GAAI,EAAY;;;EAIpD,SAAS,EAAW,GAAQ,GAAO,GAAO,GAAI,GAAa;GAC1D,IAAI,IAAM,EAAM;AAChB,OAAI,OAAO,KAAQ,SAGlB,SAFA,EAAM,QAAQ,EAAE,EACZ,EAAM,SAAS,QAAM,EAAc,EAAM,OAAO,GAAO,EAAM,EACzD,GAAR;IACC,KAAK;AAAK,OAAW,GAAQ,GAAO,EAAY;AAAE;IAClD,KAAK;AAAK,OAAW,GAAQ,GAAO,GAAI,EAAY;AAAE;IACtD,KAAK;AAAK,OAAe,GAAQ,GAAO,GAAO,GAAI,EAAY;AAAE;IACjE,QAAS,GAAc,GAAQ,GAAO,GAAO,GAAI,EAAY;;OAG1D,GAAgB,GAAQ,GAAO,GAAO,GAAI,EAAY;;EAE5D,SAAS,EAAW,GAAQ,GAAO,GAAa;AAE/C,GADA,EAAM,MAAM,EAAY,EAAO,CAAC,eAAe,EAAM,SAAS,EAC9D,EAAU,GAAQ,EAAM,KAAK,EAAY;;EAE1C,IAAI,IAAkB;GAAC,SAAS;GAAS,OAAO;GAAS,OAAO;GAAS,OAAO;GAAS,IAAI;GAAS,IAAI;GAAM,IAAI;GAAM,UAAU;GAAS,KAAK;GAAW;EAC7J,SAAS,EAAW,GAAQ,GAAO,GAAI,GAAa;GACnD,IAAI,IAAQ,EAAM,SAAS,MAAM,gBAAgB,IAAI,EAAE,EAMnD,IAAO,EAAY,EAAO,CAAC,cAAc,EAAgB,EAAM,OAAO,MAAM;AAQhF,GAPI,MAAO,gCACV,EAAK,YAAY,+CAA+C,EAAM,WAAW,UACjF,IAAO,EAAK,cAEZ,EAAK,YAAY,EAAM,UAExB,EAAM,MAAM,EAAK,YACjB,EAAM,UAAU,EAAK,WAAW;AAGhC,QAFA,IAAI,IAAW,EAAY,EAAO,CAAC,wBAAwB,EACvD,GACG,IAAQ,EAAK,YACnB,GAAS,YAAY,EAAM;AAE5B,KAAU,GAAQ,GAAU,EAAY;;EAEzC,SAAS,EAAe,GAAQ,GAAO,GAAO,GAAI,GAAa;GAC9D,IAAI,IAAW,EAAY,EAAO,CAAC,wBAAwB;AAC3D,OAAI,EAAM,YAAY,MAAM;IAC3B,IAAI,IAAW,EAAM;AACrB,MAAY,GAAU,GAAU,GAAG,EAAS,QAAQ,GAAO,MAAM,EAAG;;AAIrE,GAFA,EAAM,MAAM,EAAS,YACrB,EAAM,UAAU,EAAS,WAAW,QACpC,EAAU,GAAQ,GAAU,EAAY;;EAEzC,SAAS,EAAc,GAAQ,GAAO,GAAO,GAAI,GAAa;GAC7D,IAAI,IAAM,EAAM,KACZ,IAAQ,EAAM,OACd,IAAK,EAAM;AAEf,OAAK,EAAa,EAAM,IAAI;GAE5B,IAAI,IAAU,IACb,IAAK,EAAY,EAAO,CAAC,gBAAgB,GAAI,GAAK,EAAK,OAAG,CAAC,GAAG,EAAY,EAAO,CAAC,gBAAgB,GAAI,EAAI,GAC1G,IAAK,EAAY,EAAO,CAAC,cAAc,GAAK,EAAK,OAAG,CAAC,GAAG,EAAY,EAAO,CAAC,cAAc,EAAI;AAS/F,OARA,EAAM,MAAM,GAER,KAAS,QACZ,GAAS,GAAO,GAAO,EAAG,EAG3B,EAAU,GAAQ,GAAS,EAAY,EAEnC,CAAC,EAAwB,EAAM,IAC9B,EAAM,YAAY,MAAM;IAC3B,IAAI,IAAW,EAAM;AAErB,IADA,EAAY,GAAS,GAAU,GAAG,EAAS,QAAQ,GAAO,MAAM,EAAG,EAC/D,EAAM,QAAQ,YAAY,KAAS,QAAM,GAAmB,GAAO,EAAM;;;EAIhF,SAAS,EAAc,GAAO,GAAO;GACpC,IAAI;AACJ,OAAI,OAAO,EAAM,IAAI,QAAS,YAAY;AAGzC,QAFA,EAAM,QAAQ,OAAO,OAAO,EAAM,IAAI,EACtC,IAAW,EAAM,MAAM,MACnB,EAAS,qBAAqB,KAAM;AACxC,MAAS,oBAAoB;UACvB;AAGN,QAFA,EAAM,QAAQ,KAAK,GACnB,IAAW,EAAM,KACb,EAAS,qBAAqB,KAAM;AAExC,IADA,EAAS,oBAAoB,IAC7B,EAAM,QAAS,EAAM,IAAI,aAAa,QAAQ,OAAO,EAAM,IAAI,UAAU,QAAS,aAAc,IAAI,EAAM,IAAI,EAAM,GAAG,EAAM,IAAI,EAAM;;AAKxI,OAHA,EAAc,EAAM,OAAO,GAAO,EAAM,EACpC,EAAM,SAAS,QAAM,EAAc,EAAM,OAAO,GAAO,EAAM,EACjE,EAAM,WAAW,EAAM,UAAU,EAAS,KAAK,EAAM,MAAM,MAAM,EAAM,CAAC,EACpE,EAAM,aAAa,EAAO,OAAM,MAAM,yDAAyD;AACnG,KAAS,oBAAoB;;EAE9B,SAAS,EAAgB,GAAQ,GAAO,GAAO,GAAI,GAAa;AAE/D,GADA,EAAc,GAAO,EAAM,EACvB,EAAM,YAAY,OAMrB,EAAM,UAAU,KALhB,EAAW,GAAQ,EAAM,UAAU,GAAO,GAAI,EAAY,EAC1D,EAAM,MAAM,EAAM,SAAS,KAC3B,EAAM,UAAU,EAAM,SAAS;;EA0GjC,SAAS,EAAY,GAAQ,GAAK,GAAQ,GAAO,GAAa,GAAI;AAC7D,eAAQ,KAAU,KAAO,QAAQ,KAAU,WACtC,KAAO,QAAQ,EAAI,WAAW,EAAG,GAAY,GAAQ,GAAQ,GAAG,EAAO,QAAQ,GAAO,GAAa,EAAG;YACtG,KAAU,QAAQ,EAAO,WAAW,EAAG,GAAY,GAAQ,GAAK,GAAG,EAAI,OAAO;QAClF;IACJ,IAAI,IAAa,EAAI,MAAM,QAAQ,EAAI,GAAG,OAAO,MAC7C,IAAU,EAAO,MAAM,QAAQ,EAAO,GAAG,OAAO,MAChD,IAAQ,GAAG,IAAW;AAC1B,QAAI,CAAC,EAAY,QAAO,IAAW,EAAI,UAAU,EAAI,MAAa,MAAM;AACxE,QAAI,CAAC,EAAS,QAAO,IAAQ,EAAO,UAAU,EAAO,MAAU,MAAM;AACrE,QAAI,MAAe,EAElB,CADA,EAAY,GAAQ,GAAK,GAAU,EAAI,OAAO,EAC9C,EAAY,GAAQ,GAAQ,GAAO,EAAO,QAAQ,GAAO,GAAa,EAAG;aAC9D,GAiBL;AAKN,UAHA,IAAI,IAAS,EAAI,SAAS,GAAG,IAAM,EAAO,SAAS,GAAG,GAAK,GAAG,GAAG,GAAI,GAAI,GAGlE,KAAU,KAAY,KAAO,MACnC,IAAK,EAAI,IACT,IAAK,EAAO,IACR,EAAG,QAAQ,EAAG,MAGlB,CAFI,MAAO,KAAI,EAAW,GAAQ,GAAI,GAAI,GAAO,GAAa,EAAG,EAC7D,EAAG,OAAO,SAAM,IAAc,EAAG,MACrC,KAAU;AAGX,YAAO,KAAU,KAAY,KAAO,MACnC,IAAI,EAAI,IACR,IAAI,EAAO,IACP,EAAE,QAAQ,EAAE,MAEhB,CADA,KAAY,KACR,MAAM,KAAG,EAAW,GAAQ,GAAG,GAAG,GAAO,EAAe,GAAK,GAAU,EAAY,EAAE,EAAG;AAG7F,YAAO,KAAU,KAAY,KAAO,KAE/B,EADA,MAAU,KACV,EAAE,QAAQ,EAAG,OAAO,EAAG,QAAQ,EAAE,MAWrC,CAVA,IAAa,EAAe,GAAK,GAAU,EAAY,EACvD,EAAQ,GAAQ,GAAI,EAAW,EAC3B,MAAO,KAAG,EAAW,GAAQ,GAAI,GAAG,GAAO,GAAY,EAAG,EAC1D,EAAE,KAAS,EAAE,KAAK,EAAQ,GAAQ,GAAG,EAAY,EACjD,MAAM,KAAI,EAAW,GAAQ,GAAG,GAAI,GAAO,GAAa,EAAG,EAC3D,EAAG,OAAO,SAAM,IAAc,EAAG,MACrC,KAAY,KACZ,IAAK,EAAI,IACT,IAAK,EAAO,IACZ,IAAI,EAAI,IACR,IAAI,EAAO;AAGZ,YAAO,KAAU,KAAY,KAAO,KAC/B,EAAG,QAAQ,EAAG,KAKlB,CAJI,MAAO,KAAI,EAAW,GAAQ,GAAI,GAAI,GAAO,GAAa,EAAG,EAC7D,EAAG,OAAO,SAAM,IAAc,EAAG,MACrC,KAAU,KACV,IAAK,EAAI,IACT,IAAK,EAAO;AAEb,SAAI,IAAQ,EAAK,GAAY,GAAQ,GAAK,GAAU,IAAS,EAAE;cACtD,IAAW,EAAQ,GAAY,GAAQ,GAAQ,GAAO,IAAM,GAAG,GAAO,GAAa,EAAG;UAC1F;MAEJ,IAAI,IAAsB,GAAa,IAAe,IAAM,IAAQ,GAAG,IAAiB,MAAM,EAAa,EAAE,IAAG,GAAG,IAAE,GAAG,IAAM,YAAY,IAAU,GAAG,GAAK;AAC5J,WAAK,IAAI,GAAG,IAAI,GAAc,IAAK,GAAW,KAAK;AACnD,WAAK,IAAI,GAAK,KAAK,GAAO,KAAK;AAE9B,OADA,AAAiB,MAAM,EAAU,GAAK,GAAU,IAAS,EAAE,EAC3D,IAAK,EAAO;OACZ,IAAI,IAAW,EAAI,EAAG;AACtB,OAAI,KAAY,SACf,IAAO,IAAW,IAAO,IAAW,IACpC,EAAW,IAAE,KAAS,GACtB,IAAK,EAAI,IACT,EAAI,KAAY,MACZ,MAAO,KAAI,EAAW,GAAQ,GAAI,GAAI,GAAO,GAAa,EAAG,EAC7D,EAAG,OAAO,SAAM,IAAc,EAAG,MACrC;;AAKF,UAFA,IAAc,GACV,MAAY,IAAS,IAAW,KAAG,EAAY,GAAQ,GAAK,GAAU,IAAS,EAAE,EACjF,MAAY,EAAG,GAAY,GAAQ,GAAQ,GAAO,IAAM,GAAG,GAAO,GAAa,EAAG;eAEjF,MAAQ,GAKX,MAFA,IAAa,EAAe,EAAW,EACvC,IAAK,EAAW,SAAS,GACpB,IAAI,GAAK,KAAK,GAAO,IAOzB,CANA,IAAI,EAAO,IACP,EAAW,IAAE,OAAW,KAAI,EAAW,GAAQ,GAAG,GAAO,GAAI,EAAY,GAExE,EAAW,OAAQ,IAAI,IAAO,MAC7B,EAAQ,GAAQ,GAAG,EAAY,EAEjC,EAAE,OAAO,SAAM,IAAc,EAAO,GAAG;UAG5C,MAAK,IAAI,GAAK,KAAK,GAAO,IAGzB,CAFA,IAAI,EAAO,IACP,EAAW,IAAE,OAAW,MAAI,EAAW,GAAQ,GAAG,GAAO,GAAI,EAAY,EACzE,EAAE,OAAO,SAAM,IAAc,EAAO,GAAG;;WAzG3B;KAEpB,IAAI,IAAe,EAAI,SAAS,EAAO,SAAS,EAAI,SAAS,EAAO;AAKpE,UADA,IAAQ,IAAQ,IAAW,IAAQ,GAC5B,IAAQ,GAAc,IAC5B,KAAI,EAAI,IACR,IAAI,EAAO,IACP,QAAM,KAAK,KAAK,QAAQ,KAAK,UACxB,KAAK,OAAM,EAAW,GAAQ,GAAG,GAAO,GAAI,EAAe,GAAK,IAAQ,GAAG,EAAY,CAAC,GACxF,KAAK,OAAM,GAAW,GAAQ,EAAE,GACpC,EAAW,GAAQ,GAAG,GAAG,GAAO,EAAe,GAAK,IAAQ,GAAG,EAAY,EAAE,EAAG;AAGtF,KADI,EAAI,SAAS,KAAc,EAAY,GAAQ,GAAK,GAAO,EAAI,OAAO,EACtE,EAAO,SAAS,KAAc,EAAY,GAAQ,GAAQ,GAAO,EAAO,QAAQ,GAAO,GAAa,EAAG;;;;EAiG9G,SAAS,EAAW,GAAQ,GAAK,GAAO,GAAO,GAAa,GAAI;GAC/D,IAAI,IAAS,EAAI;AACjB,OAAI,MADwB,EAAM,OACZ,EAAI,OAAO,EAAM,IAAI;AAG1C,QAFA,EAAM,QAAQ,EAAI,OAClB,EAAM,SAAS,EAAI,QACf,GAAgB,GAAO,EAAI,CAAE;AACjC,QAAI,OAAO,KAAW,SAIrB,SAHI,EAAM,SAAS,QAClB,EAAgB,EAAM,OAAO,GAAO,EAAM,EAEnC,GAAR;KACC,KAAK;AAAK,QAAW,GAAK,EAAM;AAAE;KAClC,KAAK;AAAK,QAAW,GAAQ,GAAK,GAAO,GAAI,EAAY;AAAE;KAC3D,KAAK;AAAK,QAAe,GAAQ,GAAK,GAAO,GAAO,GAAa,EAAG;AAAE;KACtE,QAAS,GAAc,GAAK,GAAO,GAAO,EAAG;;QAG1C,GAAgB,GAAQ,GAAK,GAAO,GAAO,GAAa,EAAG;SAIhE,CADA,GAAW,GAAQ,EAAI,EACvB,EAAW,GAAQ,GAAO,GAAO,GAAI,EAAY;;EAGnD,SAAS,EAAW,GAAK,GAAO;AAI/B,GAHI,EAAI,SAAS,UAAU,KAAK,EAAM,SAAS,UAAU,KACxD,EAAI,IAAI,YAAY,EAAM,WAE3B,EAAM,MAAM,EAAI;;EAEjB,SAAS,EAAW,GAAQ,GAAK,GAAO,GAAI,GAAa;AACxD,GAAI,EAAI,aAAa,EAAM,YAK1B,EAAM,MAAM,EAAI,KAChB,EAAM,UAAU,EAAI,YALpB,GAAU,GAAQ,EAAI,EACtB,EAAW,GAAQ,GAAO,GAAI,EAAY;;EAO5C,SAAS,EAAe,GAAQ,GAAK,GAAO,GAAO,GAAa,GAAI;AACnE,KAAY,GAAQ,EAAI,UAAU,EAAM,UAAU,GAAO,GAAa,EAAG;GACzE,IAAI,IAAU,GAAG,IAAW,EAAM;AAElC,OADA,EAAM,MAAM,MACR,KAAY,KACf,MAAK,IAAI,IAAI,GAAG,IAAI,EAAS,QAAQ,KAAK;IACzC,IAAI,IAAQ,EAAS;AACrB,IAAI,KAAS,QAAQ,EAAM,OAAO,SACjC,AAAuB,EAAM,QAAM,EAAM,KACzC,KAAW,EAAM,WAAW;;AAI/B,KAAM,UAAU;;EAEjB,SAAS,EAAc,GAAK,GAAO,GAAO,GAAI;GAC7C,IAAI,IAAU,EAAM,MAAM,EAAI;AAM9B,GALA,IAAK,EAAa,EAAM,IAAI,IAExB,EAAI,SAAS,EAAM,SAAU,EAAM,SAAS,QAAQ,CAAC,EAAuB,IAAI,EAAM,MAAM,KAC/F,GAAY,GAAO,EAAI,OAAO,EAAM,OAAO,EAAG,EAE1C,EAAwB,EAAM,IAClC,EAAY,GAAS,EAAI,UAAU,EAAM,UAAU,GAAO,MAAM,EAAG;;EAGrE,SAAS,EAAgB,GAAQ,GAAK,GAAO,GAAO,GAAa,GAAI;AAEpE,OADA,EAAM,WAAW,EAAM,UAAU,EAAS,KAAK,EAAM,MAAM,MAAM,EAAM,CAAC,EACpE,EAAM,aAAa,EAAO,OAAM,MAAM,yDAAyD;AAGnG,GAFA,EAAgB,EAAM,OAAO,GAAO,EAAM,EACtC,EAAM,SAAS,QAAM,EAAgB,EAAM,OAAO,GAAO,EAAM,EAC/D,EAAM,YAAY,QAOjB,EAAI,YAAY,QAAM,GAAW,GAAQ,EAAI,SAAS,EAC1D,EAAM,UAAU,MAPZ,EAAI,YAAY,OAAM,EAAW,GAAQ,EAAM,UAAU,GAAO,GAAI,EAAY,GAC/E,EAAW,GAAQ,EAAI,UAAU,EAAM,UAAU,GAAO,GAAa,EAAG,EAC7E,EAAM,MAAM,EAAM,SAAS,KAC3B,EAAM,UAAU,EAAM,SAAS;;EAOjC,SAAS,EAAU,GAAQ,GAAO,GAAK;AAEtC,QADA,IAAI,IAAM,OAAO,OAAO,KAAK,EACtB,IAAQ,GAAK,KAAS;IAC5B,IAAI,IAAQ,EAAO;AACnB,QAAI,KAAS,MAAM;KAClB,IAAI,IAAM,EAAM;AAChB,KAAI,KAAO,SAAM,EAAI,KAAO;;;AAG9B,UAAO;;EAOR,IAAI,IAAU,EAAE;EAChB,SAAS,EAAe,GAAG;AAI1B,QAAK,IAHD,IAAS,CAAC,EAAE,EACZ,IAAI,GAAG,IAAI,GAAG,IAAI,GAClB,IAAK,EAAQ,SAAS,EAAE,QACnB,IAAI,GAAG,IAAI,GAAI,IAAK,GAAQ,KAAK,EAAE;AAC5C,QAAK,IAAI,IAAI,GAAG,IAAI,GAAI,EAAE,EACrB,OAAE,OAAO,IACb;QAAI,IAAI,EAAO,EAAO,SAAS;AAC/B,QAAI,EAAE,KAAK,EAAE,IAAI;AAEhB,KADA,EAAQ,KAAK,GACb,EAAO,KAAK,EAAE;AACd;;AAID,SAFA,IAAI,GACJ,IAAI,EAAO,SAAS,GACb,IAAI,IAAG;KAGb,IAAI,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI,IAAI;AACzC,KAAI,EAAE,EAAO,MAAM,EAAE,KACpB,IAAI,IAAI,IAGR,IAAI;;AAGN,IAAI,EAAE,KAAK,EAAE,EAAO,QACf,IAAI,MAAG,EAAQ,KAAK,EAAO,IAAI,KACnC,EAAO,KAAK;;AAKd,QAFA,IAAI,EAAO,QACX,IAAI,EAAO,IAAI,IACR,MAAM,GAEZ,CADA,EAAO,KAAK,GACZ,IAAI,EAAQ;AAGb,UADA,EAAQ,SAAS,GACV;;EAGR,SAAS,EAAe,GAAQ,GAAG,GAAa;AAC/C,UAAO,IAAI,EAAO,QAAQ,IACzB,KAAI,EAAO,MAAM,QAAQ,EAAO,GAAG,OAAO,KAAM,QAAO,EAAO,GAAG;AAElE,UAAO;;EAIR,SAAS,EAAQ,GAAQ,GAAO,GAAa;AAC5C,OAAI,EAAM,OAAO,MAAM;IACtB,IAAI;AACJ,QAAI,EAAM,WAAW,QAAQ,EAAM,YAAY,EAE9C,KAAS,EAAM;SACT;AACN,SAAS,EAAY,EAAO,CAAC,wBAAwB;AACrD,UAAK,IAAI,KAAO,EAAO,EAAM,CAAE,GAAO,YAAY,EAAI;;AAEvD,MAAU,GAAQ,GAAQ,EAAY;;;EAIxC,SAAS,EAAU,GAAQ,GAAK,GAAa;AAC5C,GAAI,KAAe,OACd,EAAO,YAAY,EAAI,GADH,EAAO,aAAa,GAAK,EAAY;;EAI/D,SAAS,EAAwB,GAAO;AACvC,OAAI,EAAM,SAAS,QAClB,EAAM,MAAM,mBAAmB,QAC/B,EAAM,MAAM,mBAAmB,KAC7B,QAAO;GACV,IAAI,IAAW,EAAM;AACrB,OAAI,KAAY,QAAQ,EAAS,WAAW,KAAK,EAAS,GAAG,QAAQ,KAAK;IACzE,IAAI,IAAU,EAAS,GAAG;AAC1B,IAAI,EAAM,IAAI,cAAc,MAAS,EAAM,IAAI,YAAY;cAEnD,KAAY,QAAQ,EAAS,WAAW,EAAG,OAAU,MAAM,mDAAmD;AACvH,UAAO;;EAIR,SAAS,EAAY,GAAQ,GAAQ,GAAO,GAAK;AAChD,QAAK,IAAI,IAAI,GAAO,IAAI,GAAK,KAAK;IACjC,IAAI,IAAQ,EAAO;AACnB,IAAI,KAAS,QAAM,GAAW,GAAQ,EAAM;;;EAG9C,SAAS,GAAe,GAAQ,GAAO,GAAQ,GAAS;GACvD,IAAI,IAAW,EAAM,OACjB,IAAS,EAAS,KAAK,EAAO,gBAAgB,EAAM;AACpD,YAAU,MAEd;QAAI,IAAa;AACjB,SAAK,IAAI,KAAO,EAAO,EAAM,CAAE,GAAe,IAAI,GAAK,EAAW;AAGlE,IAFA,EAAQ,KAER,QAAQ,QAAQ,EAAO,CAAC,QAAQ,WAAY;AAE3C,KADA,EAAW,GAAO,EAAS,EAC3B,GAAgB,GAAQ,GAAO,EAAQ;MACtC;;;EAEH,SAAS,GAAgB,GAAQ,GAAO,GAAS;AAChD,GAAI,EAAE,EAAQ,MAAM,MACnB,EAAS,EAAM,EACf,GAAU,GAAQ,EAAM;;EAG1B,SAAS,GAAW,GAAQ,GAAO;GAClC,IAAI,IAAU,EAAC,GAAG,GAAE;AAGpB,GAFI,OAAO,EAAM,OAAQ,YAAY,OAAO,EAAM,MAAM,kBAAmB,cAAY,GAAe,GAAQ,GAAO,EAAM,OAAO,EAAQ,EACtI,EAAM,SAAS,OAAO,EAAM,MAAM,kBAAmB,cAAY,GAAe,GAAQ,GAAO,EAAM,OAAO,EAAQ,EACxH,GAAgB,GAAQ,GAAO,EAAQ;;EAExC,SAAS,GAAU,GAAQ,GAAO;AAC7B,SAAM,OAAO,KACjB,KAAI,EAAM,WAAW,QAAQ,EAAM,YAAY,EAC9C,GAAO,YAAY,EAAM,IAAI;OAE7B,MAAK,IAAI,KAAO,EAAO,EAAM,CAAE,GAAO,YAAY,EAAI;;EAIxD,SAAS,EAAS,GAAO;AAGxB,OAFI,OAAO,EAAM,OAAQ,YAAY,OAAO,EAAM,MAAM,YAAa,cAAY,EAAS,KAAK,EAAM,MAAM,UAAU,EAAM,EACvH,EAAM,SAAS,OAAO,EAAM,MAAM,YAAa,cAAY,EAAS,KAAK,EAAM,MAAM,UAAU,EAAM,EACrG,OAAO,EAAM,OAAQ,UACpB,EAAM,YAAY,QAAM,EAAS,EAAM,SAAS;QAC9C;AACN,IAAI,EAAM,UAAU,SAAM,EAAM,OAAO,IAAI;IAC3C,IAAI,IAAW,EAAM;AACrB,QAAI,MAAM,QAAQ,EAAS,CAC1B,MAAK,IAAI,IAAI,GAAG,IAAI,EAAS,QAAQ,KAAK;KACzC,IAAI,IAAQ,EAAS;AACrB,KAAI,KAAS,QAAM,EAAS,EAAM;;;;EAOtC,SAAS,GAAS,GAAO,GAAO,GAAI;AACnC,QAAK,IAAI,KAAO,EACf,GAAQ,GAAO,GAAK,MAAM,EAAM,IAAM,EAAG;;EAG3C,SAAS,EAAQ,GAAO,GAAK,GAAK,GAAO,GAAI;AACxC,eAAQ,SAAS,KAAS,QAAQ,EAAkB,EAAI,IAAK,MAAQ,KAAS,CAAC,EAAgB,GAAO,EAAI,IAAK,OAAO,KAAU,WACpI;QAAI,EAAI,OAAO,OAAO,EAAI,OAAO,IAAK,QAAO,EAAY,GAAO,GAAK,EAAM;AAC3E,QAAI,EAAI,MAAM,GAAG,EAAE,KAAK,SAAU,GAAM,IAAI,eAAe,gCAAgC,EAAI,MAAM,EAAE,EAAE,EAAM;aACtG,MAAQ,QAAS,IAAY,EAAM,KAAK,GAAK,EAAM;aACnD,GAAe,GAAO,GAAK,EAAG,EAAE;AACxC,SAAI,MAAQ,SAAS;AAUpB,WAJK,EAAM,QAAQ,WAAW,EAAM,QAAQ,eAAe,EAAM,IAAI,UAAU,KAAK,KAEhF,EAAM,QAAQ,YAAY,MAAQ,QAAQ,EAAM,IAAI,UAAU,KAAK,KAEnE,EAAM,QAAQ,YAAY,MAAQ,QAAQ,EAAM,IAAI,UAAU,KAAK,EAAO;AAG9E,UAAI,EAAM,QAAQ,WAAW,EAAM,MAAM,SAAS,UAAU,KAAK,KAAU,IAAI;AAAE,eAAQ,MAAM,uCAAuC;AAAE;;;AAIzI,KAAI,EAAM,QAAQ,WAAW,MAAQ,SAAQ,EAAM,IAAI,aAAa,GAAK,EAAM,GAC1E,EAAM,IAAI,KAAO;WAElB,OAAO,KAAU,YAChB,IAAO,EAAM,IAAI,aAAa,GAAK,GAAG,GACrC,EAAM,IAAI,gBAAgB,EAAI,GAE/B,EAAM,IAAI,aAAa,MAAQ,cAAc,UAAU,GAAK,EAAM;;;EAGzE,SAAS,GAAW,GAAO,GAAK,GAAK,GAAI;AACpC,eAAQ,SAAS,KAAO,QAAQ,EAAkB,EAAI,EAC1D,KAAI,EAAI,OAAO,OAAO,EAAI,OAAO,IAAK,GAAY,GAAO,GAAK,KAAA,EAAU;YAC/D,MAAQ,QAAS,IAAY,EAAM,KAAK,GAAK,KAAK;YAE1D,GAAe,GAAO,GAAK,EAAG,IAC3B,MAAQ,eACR,MAAQ,WACR,EAAE,MAAQ,YACZ,EAAM,QAAQ,YACX,EAAM,QAAQ,YAAY,EAAM,IAAI,kBAAkB,MAAM,EAAM,QAAQ,EAAc,EAAM,IAAI,MAEnG,EAAE,EAAM,QAAQ,WAAW,MAAQ,QAEtC,GAAM,IAAI,KAAO;QACX;IACN,IAAI,IAAc,EAAI,QAAQ,IAAI;AAElC,IADI,MAAgB,OAAI,IAAM,EAAI,MAAM,IAAc,EAAE,GACpD,MAAQ,MAAO,EAAM,IAAI,gBAAgB,MAAQ,cAAc,UAAU,EAAI;;;EAGnF,SAAS,GAAmB,GAAO,GAAO;AACzC,OAAI,WAAW,EACd,KAAG,EAAM,UAAU,MACd,EAAM,IAAI,kBAAkB,OAAI,EAAM,IAAI,QAAQ;QAChD;IACN,IAAI,IAAa,KAAK,EAAM;AAC5B,KAAI,EAAM,IAAI,UAAU,KAAc,EAAM,IAAI,kBAAkB,QACjE,EAAM,IAAI,QAAQ;;AAIrB,GAAI,mBAAmB,KAAO,EAAQ,GAAO,iBAAiB,MAAM,EAAM,eAAe,KAAA,EAAU;;EAEpG,SAAS,GAAY,GAAO,GAAK,GAAO,GAAI;GAG3C,IAAI;AACJ,OAAI,KAAO,KAIV,MAAK,IAAI,KAHL,MAAQ,KAAS,CAAC,EAAuB,IAAI,EAAM,IACtD,QAAQ,KAAK,2FAA2F,EAEzF,EACf,EAAM,IAAM,EAAI,OAAS,SAAU,KAAS,QAAQ,EAAM,MAAQ,SACjE,GAAW,GAAO,GAAK,GAAK,EAAG;AAIlC,OAAI,KAAS,KACZ,MAAK,IAAI,KAAO,EACf,GAAQ,GAAO,GAAK,KAAO,EAAI,IAAM,EAAM,IAAM,EAAG;;EAIvD,SAAS,EAAgB,GAAO,GAAM;AACrC,UAAO,MAAS,WAAW,MAAS,aAAa,MAAS,mBAAmB,MAAS,eAAe,EAAM,QAAQ,EAAc,EAAM,IAAI,IAAI,EAAM,QAAQ,YAAY,EAAM,IAAI,eAAe,EAAc,EAAM,IAAI;;EAE3N,SAAS,EAAkB,GAAM;AAChC,UAAO,MAAS,YAAY,MAAS,cAAc,MAAS,cAAc,MAAS,cAAc,MAAS,oBAAoB,MAAS;;EAExI,SAAS,GAAe,GAAO,GAAK,GAAI;AAEvC,UAAO,MAAO,KAAA,MAEb,EAAM,IAAI,QAAQ,IAAI,GAAG,MAAM,EAAM,MAErC,MAAQ,UAAU,MAAQ,UAAU,MAAQ,UAAU,MAAQ,WAAW,MAAQ,aAE7E,KAAO,EAAM;;EAInB,SAAS,GAAY,GAAS,GAAK,GAAO;AACzC,OAAI,MAAQ,EAAO,KAER,KAAS,KAEnB,GAAQ,QAAQ;YACN,OAAO,KAAU,SAE3B,GAAQ,QAAQ;YACS,OAAO,KAAQ,aAA9B,EAIV,MAAK,IAAI,KAFT,EAAQ,QAAQ,IAEA,GAAO;IACtB,IAAI,IAAQ,EAAM;AAClB,IAAI,KAAS,SACR,EAAI,SAAS,IAAI,GAAE,EAAQ,MAAM,YAAY,GAAK,OAAO,EAAM,CAAC,GAC/D,EAAQ,MAAM,KAAO,OAAO,EAAM;;QAGnC;AAKN,SAAK,IAAI,KAAO,EACf,CAAI,EAAI,MAAQ,QAAQ,EAAM,MAAQ,SACjC,EAAI,SAAS,IAAI,GAAE,EAAQ,MAAM,eAAe,EAAI,GACnD,EAAQ,MAAM,KAAO;AAI5B,SAAK,IAAI,KAAO,GAAO;KACtB,IAAI,IAAQ,EAAM;AAClB,KAAI,KAAS,SAAS,IAAQ,OAAO,EAAM,MAAM,OAAO,EAAI,GAAK,KAC5D,EAAI,SAAS,IAAI,GAAE,EAAQ,MAAM,YAAY,GAAK,EAAM,GACvD,EAAQ,MAAM,KAAO;;;;EAiB9B,SAAS,IAAY;AAEpB,QAAK,IAAI;;AAGV,EADA,EAAU,YAAY,OAAO,OAAO,KAAK,EACzC,EAAU,UAAU,cAAc,SAAU,GAAI;GAC/C,IAAI,IAAU,KAAK,OAAO,EAAG,OACzB;AACJ,GAAI,OAAO,KAAY,aAAY,IAAS,EAAQ,KAAK,EAAG,eAAe,EAAG,GACrE,OAAO,EAAQ,eAAgB,cAAY,EAAQ,YAAY,EAAG;GAC3E,IAAI,IAAO;AASX,GARI,EAAK,KAAK,SACT,EAAG,WAAW,OAAQ,GAAG,EAAK,IAAI,EAClC,KAAU,QAAQ,OAAO,EAAO,QAAS,cAC5C,QAAQ,QAAQ,EAAO,CAAC,KAAK,WAAY;AACxC,IAAI,EAAK,KAAK,QAAQ,EAAG,WAAW,OAAQ,GAAG,EAAK,IAAI;KACvD,GAGA,MAAW,OACd,EAAG,gBAAgB,EACnB,EAAG,iBAAiB;;EAKtB,SAAS,EAAY,GAAO,GAAK,GAAO;AACvC,OAAI,EAAM,UAAU,MAAM;AAEzB,QADA,EAAM,OAAO,IAAI,GACb,EAAM,OAAO,OAAS,EAAO;AACjC,IAAI,KAAS,SAAS,OAAO,KAAU,cAAc,OAAO,KAAU,aACjE,EAAM,OAAO,MAAc,EAAM,IAAI,iBAAiB,EAAI,MAAM,EAAE,EAAE,EAAM,QAAQ,GAAM,EAC5F,EAAM,OAAO,KAAO,MAEhB,EAAM,OAAO,MAAQ,QAAM,EAAM,IAAI,oBAAoB,EAAI,MAAM,EAAE,EAAE,EAAM,QAAQ,GAAM,EAC/F,EAAM,OAAO,KAAO,KAAA;UAEX,KAAS,SAAS,OAAO,KAAU,cAAc,OAAO,KAAU,cAC5E,EAAM,SAAS,IAAI,GAAW,EAC9B,EAAM,IAAI,iBAAiB,EAAI,MAAM,EAAE,EAAE,EAAM,QAAQ,GAAM,EAC7D,EAAM,OAAO,KAAO;;EAKtB,SAAS,EAAc,GAAQ,GAAO,GAAO;AAE5C,GADI,OAAO,EAAO,UAAW,cAAY,EAAS,KAAK,EAAO,QAAQ,EAAM,EACxE,OAAO,EAAO,YAAa,cAAY,EAAM,KAAK,EAAS,KAAK,EAAO,UAAU,EAAM,CAAC;;EAE7F,SAAS,EAAgB,GAAQ,GAAO,GAAO;AAC9C,GAAI,OAAO,EAAO,YAAa,cAAY,EAAM,KAAK,EAAS,KAAK,EAAO,UAAU,EAAM,CAAC;;EAE7F,SAAS,GAAgB,GAAO,GAAK;AACpC,MAAG;AACF,QAAI,EAAM,SAAS,QAAQ,OAAO,EAAM,MAAM,kBAAmB,YAAY;KAC5E,IAAI,IAAQ,EAAS,KAAK,EAAM,MAAM,gBAAgB,GAAO,EAAI;AACjE,SAAI,MAAU,KAAA,KAAa,CAAC,EAAO;;AAEpC,QAAI,OAAO,EAAM,OAAQ,YAAY,OAAO,EAAM,MAAM,kBAAmB,YAAY;KACtF,IAAI,IAAQ,EAAS,KAAK,EAAM,MAAM,gBAAgB,GAAO,EAAI;AACjE,SAAI,MAAU,KAAA,KAAa,CAAC,EAAO;;AAEpC,WAAO;YACC;AAcT,UAbA,EAAM,MAAM,EAAI,KAChB,EAAM,UAAU,EAAI,SACpB,EAAM,WAAW,EAAI,UAQrB,EAAM,QAAQ,EAAI,OAClB,EAAM,WAAW,EAAI,UACrB,EAAM,OAAO,EAAI,MACV;;EAGR,IAAI;AAEJ,SAAO,SAAS,GAAK,GAAQ,GAAQ;AACpC,OAAI,CAAC,EAAK,OAAU,UAAU,gDAAgD;AAC9E,OAAI,KAAc,QAAQ,EAAI,SAAS,EAAW,CACjD,OAAU,UAAU,0DAA0D;GAE/E,IAAI,IAAa,GACb,IAAU,GACV,IAAQ,EAAE,EACV,IAAS,EAAc,EAAI,EAC3B,IAAY,EAAI;AAIpB,GAFA,IAAa,GACb,IAAgB,OAAO,KAAW,aAAa,IAAS,KAAA,GACxD,IAAgB,EAAE;AAClB,OAAI;AAOH,IALI,EAAI,WAAgB,EAAI,cAAc,KAC1C,IAAS,EAAM,kBAAkB,MAAM,QAAQ,EAAO,GAAG,IAAS,CAAC,EAAO,CAAC,EAC3E,EAAY,GAAK,EAAI,QAAQ,GAAQ,GAAO,MAAM,MAAc,iCAAiC,KAAA,IAAY,EAAU,EACvH,EAAI,SAAS,GAET,KAAU,QAAQ,EAAc,EAAI,KAAK,KAAU,OAAO,EAAO,SAAU,cAAY,EAAO,OAAO;AACzG,SAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,IAAK,GAAM,IAAI;aACxC;AAET,IADA,IAAgB,GAChB,IAAa;;;;;ACx4BhB,GAAO,UAAA,GAAA,EAAsC;;CCA7C,IAAI,IAAA,GAAA;AAEJ,GAAO,UAAU,SAAS,GAAQ,GAAU,GAAS;EACpD,IAAI,IAAgB,EAAE,EAClB,IAAU,IACV,IAAS;EAEb,SAAS,IAAO;AACf,QAAK,IAAS,GAAG,IAAS,EAAc,QAAQ,KAAU,EACzD,KAAI;AAAE,MAAO,EAAc,IAAS,EAAM,EAAc,IAAS,GAAG,EAAE,EAAO;YACtE,GAAG;AAAE,MAAQ,MAAM,EAAE;;AAE7B,OAAS;;EAGV,SAAS,IAAS;AACjB,GAAK,MACJ,IAAU,IACV,EAAS,WAAW;AAEnB,IADA,IAAU,IACV,GAAM;KACL;;AAIJ,IAAO,OAAO;EAEd,SAAS,EAAM,GAAM,GAAW;AAC/B,OAAI,KAAa,QAAQ,EAAU,QAAQ,QAAQ,OAAO,KAAc,WACvE,OAAU,UAAU,4CAA4C;GAGjE,IAAI,IAAQ,EAAc,QAAQ,EAAK;AAOvC,GANI,KAAS,MACZ,EAAc,OAAO,GAAO,EAAE,EAC1B,KAAS,MAAQ,KAAU,IAC/B,EAAO,GAAM,EAAE,CAAC,GAGb,KAAa,SAChB,EAAc,KAAK,GAAM,EAAU,EACnC,EAAO,GAAM,EAAM,EAAU,EAAE,EAAO;;AAIxC,SAAO;GAAQ;GAAe;GAAO;;;CC7CtC,IAAI,IAAA,GAAA;AAEJ,GAAO,UAAA,GAAA,CAAwC,GAAQ,OAAO,wBAA0B,MAAc,wBAAwB,MAAM,OAAO,UAAY,MAAc,UAAU,KAAK;;ACFpL,GAAO,UAAU,SAAS,GAAQ;AACjC,MAAI,OAAO,UAAU,SAAS,KAAK,EAAO,KAAK,kBAAmB,QAAO;EAEzE,IAAI,IAAO,EAAE;AACb,OAAK,IAAI,KAAO,EACf,GAAY,GAAK,EAAO,GAAK;AAG9B,SAAO,EAAK,KAAK,IAAI;EAErB,SAAS,EAAY,GAAK,GAAO;AAChC,OAAI,MAAM,QAAQ,EAAM,CACvB,MAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,IACjC,GAAY,IAAM,MAAM,IAAI,KAAK,EAAM,GAAG;YAGnC,OAAO,UAAU,SAAS,KAAK,EAAM,KAAK,kBAClD,MAAK,IAAI,KAAK,EACb,GAAY,IAAM,MAAM,IAAI,KAAK,EAAM,GAAG;OAGvC,GAAK,KAAK,mBAAmB,EAAI,IAAI,KAAS,QAAQ,MAAU,KAAK,MAAM,mBAAmB,EAAM,GAAG,IAAI;;;;CCrBlH,IAAI,IAAA,GAAA;AAGJ,GAAO,UAAU,SAAS,GAAU,GAAQ;AAC3C,MAAK,wBAAyB,KAAK,EAAS,CAC3C,OAAU,YAAY,2EAA2E;AAElG,MAAI,KAAU,KAAM,QAAO;EAC3B,IAAI,IAAa,EAAS,QAAQ,IAAI,EAClC,IAAY,EAAS,QAAQ,IAAI,EACjC,IAAW,IAAY,IAAI,EAAS,SAAS,GAC7C,IAAU,IAAa,IAAI,IAAW,GACtC,IAAO,EAAS,MAAM,GAAG,EAAQ,EACjC,IAAQ,EAAE;AAEd,SAAO,OAAO,GAAO,EAAO;EAE5B,IAAI,IAAW,EAAK,QAAQ,yBAAyB,SAAS,GAAG,GAAK,GAAU;AAK/E,UAJA,OAAO,EAAM,IAET,EAAO,MAAQ,OAAa,IAEzB,IAAW,EAAO,KAAO,mBAAmB,OAAO,EAAO,GAAK,CAAC;IACtE,EAGE,IAAgB,EAAS,QAAQ,IAAI,EACrC,IAAe,EAAS,QAAQ,IAAI,EACpC,IAAc,IAAe,IAAI,EAAS,SAAS,GACnD,IAAa,IAAgB,IAAI,IAAc,GAC/C,IAAS,EAAS,MAAM,GAAG,EAAW;AAG1C,EADI,KAAc,MAAG,KAAU,EAAS,MAAM,GAAY,EAAS,GAC/D,KAAiB,MAAG,MAAW,IAAa,IAAI,MAAM,OAAO,EAAS,MAAM,GAAe,EAAY;EAC3G,IAAI,IAAc,EAAiB,EAAM;AAIzC,SAHI,MAAa,MAAW,IAAa,KAAK,IAAgB,IAAI,MAAM,OAAO,IAC3E,KAAa,MAAG,KAAU,EAAS,MAAM,EAAU,GACnD,KAAgB,MAAG,MAAW,IAAY,IAAI,KAAK,OAAO,EAAS,MAAM,EAAa,GACnF;;;CCtCR,IAAI,IAAA,GAAA,EACA,IAAA,GAAA;AAEJ,GAAO,UAAU,SAAS,GAAS,GAAc;EAChD,SAAS,EAAa,GAAU;AAC/B,UAAO,IAAI,QAAQ,EAAS;;EAG7B,SAAS,EAAY,GAAK,GAAM;AAC/B,UAAO,IAAI,QAAQ,SAAS,GAAS,GAAQ;AAC5C,QAAM,EAAc,GAAK,EAAK,OAAO;IACrC,IAAI,IAAS,EAAK,UAAU,OAAmC,QAA5B,EAAK,OAAO,aAAa,EACxD,IAAO,EAAK,MACZ,KAAc,EAAK,aAAa,QAAQ,EAAK,cAAc,KAAK,cAAc,EAAE,aAAgB,EAAQ,YAAY,aAAgB,EAAQ,kBAC5I,IAAe,EAAK,iBAAiB,OAAO,EAAK,WAAY,aAAa,KAAK,SAE/E,IAAM,IAAI,EAAQ,gBAAgB,EAAE,IAAU,IAAO,IAAY,IACjE,IAAW,GAAK,GAChB,IAAQ,EAAI;AAmBhB,SAAK,IAAI,KAjBT,EAAI,QAAQ,WAAW;AAEtB,KADA,IAAU,IACV,EAAM,KAAK,KAAK;OAGjB,EAAI,KAAK,GAAQ,GAAK,EAAK,UAAU,IAAO,OAAO,EAAK,QAAS,WAAW,EAAK,OAAO,KAAA,GAAW,OAAO,EAAK,YAAa,WAAW,EAAK,WAAW,KAAA,EAAU,EAE7J,KAAc,KAAQ,QAAQ,CAAC,EAAU,GAAM,eAAe,IACjE,EAAI,iBAAiB,gBAAgB,kCAAkC,EAEpE,OAAO,EAAK,eAAgB,cAAc,CAAC,EAAU,GAAM,SAAS,IACvE,EAAI,iBAAiB,UAAU,2BAA2B,EAEvD,EAAK,oBAAiB,EAAI,kBAAkB,EAAK,kBACjD,EAAK,YAAS,EAAI,UAAU,EAAK,UACrC,EAAI,eAAe,GAEH,EAAK,QACpB,CAAI,EAAO,KAAK,EAAK,SAAS,EAAI,IACjC,EAAI,iBAAiB,GAAK,EAAK,QAAQ,GAAK;AAqG9C,IAjGA,EAAI,qBAAqB,SAAS,GAAI;AAEjC,eAEA,EAAG,OAAO,eAAe,EAC5B,KAAI;MACH,IAAI,IAAW,EAAG,OAAO,UAAU,OAAO,EAAG,OAAO,SAAS,OAAQ,EAAG,OAAO,WAAW,OAAQ,cAAe,KAAK,EAAI,EAMtH,IAAW,EAAG,OAAO,UAAU;AAEnC,UAAI,MAAiB;WAGhB,CAAC,EAAG,OAAO,gBAAgB,OAAO,EAAK,WAAY,WAEtD,KAAI;AAAE,YAAW,KAAK,MAAM,EAAG,OAAO,aAAa;eACzC;AAAE,YAAW;;cAEd,CAAC,KAAgB,MAAiB,YAMtB,MAAW,EAAG,OAAO;AAU5C,UAPI,OAAO,EAAK,WAAY,cAC3B,IAAW,EAAK,QAAQ,EAAG,QAAQ,EAAK,EACxC,IAAU,MACA,OAAO,EAAK,eAAgB,eACtC,IAAW,EAAK,YAAY,EAAS,GAGlC,GAAS;AACZ,WAAI,OAAO,EAAK,QAAS,WACxB,KAAI,MAAM,QAAQ,EAAS,CAC1B,MAAK,IAAI,IAAI,GAAG,IAAI,EAAS,QAAQ,IACpC,GAAS,KAAK,IAAI,EAAK,KAAK,EAAS,GAAG;WAGrC,KAAW,IAAI,EAAK,KAAK,EAAS;AAExC,SAAQ,EAAS;aAEb;OACJ,IAAI,IAAwB,WAAW;AACtC,YAAI;AAAE,aAAU,EAAG,OAAO;gBAChB;AAAE,aAAU;;QACtB,IAAI,IAAY,MAAM,EAAQ;AAG9B,QAFA,EAAM,OAAO,EAAG,OAAO,QACvB,EAAM,WAAW,GACjB,EAAO,EAAM;;AAGd,OAAI,EAAI,WAAW,IAKlB,WAAW,WAAW;AACjB,aACJ,GAAuB;SACtB,GACI,GAAuB;;cAGzB,GAAG;AACT,QAAO,EAAE;;OAKZ,EAAI,YAAY,SAAU,GAAI;AAC7B,SAAY;KACZ,IAAI,IAAQ,gBAAI,MAAM,oBAAoB;AAE1C,KADA,EAAM,OAAO,EAAG,OAAO,QACvB,EAAO,EAAM;OAGV,OAAO,EAAK,UAAW,eAC1B,IAAM,EAAK,OAAO,GAAK,GAAM,EAAI,IAAI,GAGjC,MAAQ,MACX,IAAgB,EAAI,OACpB,EAAI,QAAQ,WAAW;AAEtB,KADA,IAAU,IACV,EAAc,KAAK,KAAK;SAKvB,KAAQ,OAAM,EAAI,MAAM,GACnB,OAAO,EAAK,aAAc,aAAY,EAAI,KAAK,EAAK,UAAU,EAAK,CAAC,GACpE,aAAgB,EAAQ,YAAY,aAAgB,EAAQ,kBAAiB,EAAI,KAAK,EAAK,GAC/F,EAAI,KAAK,KAAK,UAAU,EAAK,CAAC;KAClC;;AAOH,EADA,EAAa,YAAY,QAAQ,WACjC,EAAa,YAAY;EAEzB,SAAS,EAAU,GAAM,GAAM;AAC9B,QAAK,IAAI,KAAO,EAAK,QACpB,KAAI,EAAO,KAAK,EAAK,SAAS,EAAI,IAAI,EAAI,aAAa,KAAK,EAAM,QAAO;AAE1E,UAAO;;AAGR,SAAO,EACN,SAAS,SAAS,GAAK,GAAM;AAC5B,GAAI,OAAO,KAAQ,WACI,MAAO,EAAE,IADD,IAAO,GAAK,IAAM,EAAI;GAErD,IAAI,IAAU,EAAY,GAAK,EAAK;AACpC,OAAI,EAAK,eAAe,GAAM,QAAO;GACrC,IAAI,IAAQ;GACZ,SAAS,IAAW;AACnB,IAAI,EAAE,MAAU,KAAK,OAAO,KAAiB,cAAY,GAAc;;AAGxE,UAAO,EAAK,EAAQ;GAEpB,SAAS,EAAK,GAAS;IACtB,IAAI,IAAO,EAAQ;AAkBnB,WAVA,EAAQ,cAAc,GACtB,EAAQ,OAAO,WAAW;AACzB;KACA,IAAI,IAAO,EAAK,MAAM,GAAS,UAAU;AAKzC,YAJA,EAAK,KAAK,GAAU,SAAS,GAAG;AAE/B,UADA,GAAU,EACN,MAAU,EAAG,OAAM;OACtB,EACK,EAAK,EAAK;OAEX;;KAGT;;;CCnMF,IAAI,IAAA,GAAA;AAEJ,GAAO,UAAA,GAAA,CAAuC,OAAO,SAAW,MAAc,SAAS,MAAM,EAAY,OAAO;;CC0BhH,IAAI,IAAqB;AAEzB,GAAO,UAAU,SAAS,GAAK;AAC9B,SAAO,OAAO,EAAI,CAAC,QAAQ,GAAoB,mBAAmB;;;CC/BnE,IAAI,IAAA,GAAA;AAEJ,GAAO,UAAU,SAAS,GAAQ;AACjC,MAAI,MAAW,MAAM,KAAU,KAAM,QAAO,EAAE;AAC9C,EAAI,EAAO,OAAO,EAAE,KAAK,QAAK,IAAS,EAAO,MAAM,EAAE;AAGtD,OAAK,IADD,IAAU,EAAO,MAAM,IAAI,EAAE,IAAW,EAAE,EAAE,IAAO,EAAE,EAChD,IAAI,GAAG,IAAI,EAAQ,QAAQ,KAAK;GACxC,IAAI,IAAQ,EAAQ,GAAG,MAAM,IAAI,EAC7B,IAAM,EAAuB,EAAM,GAAG,EACtC,IAAQ,EAAM,WAAW,IAAI,EAAuB,EAAM,GAAG,GAAG;AAEpE,GAAI,MAAU,SAAQ,IAAQ,KACrB,MAAU,YAAS,IAAQ;GAEpC,IAAI,IAAS,EAAI,MAAM,WAAW,EAC9B,IAAS;AACb,GAAI,EAAI,QAAQ,IAAI,GAAG,MAAI,EAAO,KAAK;AACvC,QAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK;IACvC,IAAI,IAAQ,EAAO,IAAI,IAAY,EAAO,IAAI,IAC1C,IAAW,KAAa,MAAM,CAAC,MAAM,SAAS,GAAW,GAAG,CAAC;AACjE,QAAI,MAAU,IAAI;KACjB,IAAI,IAAM,EAAO,MAAM,GAAG,EAAE,CAAC,MAAM;AAInC,KAHI,EAAS,OACZ,EAAS,KAAO,MAAM,QAAQ,EAAO,GAAG,EAAO,SAAS,IAEzD,IAAQ,EAAS;eAGT,MAAU,YAAa;AAChC,QAAI,MAAM,EAAO,SAAS,EAAG,GAAO,KAAS;SACxC;KAGJ,IAAI,IAAO,OAAO,yBAAyB,GAAQ,EAAM;AAGzD,KAFI,KAAQ,SAAM,IAAO,EAAK,QAC1B,MAAc,EAAO,KAAS,IAAO,IAAW,EAAE,GAAG,EAAE,GAC3D,IAAS;;;;AAIZ,SAAO;;;CCzCR,IAAI,IAAA,GAAA;AAGJ,GAAO,UAAU,SAAS,GAAK;EAC9B,IAAI,IAAa,EAAI,QAAQ,IAAI,EAC7B,IAAY,EAAI,QAAQ,IAAI,EAC5B,IAAW,IAAY,IAAI,EAAI,SAAS,GACxC,IAAU,IAAa,IAAI,IAAW,GACtC,IAAO,EAAI,MAAM,GAAG,EAAQ,CAAC,QAAQ,WAAW,IAAI;AAMxD,SAJK,IAEA,EAAK,OAAO,QAAK,IAAO,MAAM,KAFxB,IAAO,KAIX;GACA;GACN,QAAQ,IAAa,IAClB,EAAE,GACF,EAAiB,EAAI,MAAM,IAAa,GAAG,EAAS,CAAC;GACxD;;;CCnBF,IAAI,IAAA,GAAA;AAOJ,GAAO,UAAU,SAAS,GAAU;EACnC,IAAI,IAAe,EAAc,EAAS,EACtC,IAAe,OAAO,KAAK,EAAa,OAAO,EAC/C,IAAO,EAAE,EACT,IAAa,OAAO,MAAM,EAAa,KAAK,QAK/C,sDACA,SAAS,GAAG,GAAK,GAAO;AAKvB,UAJI,KAAO,OAAa,OAAO,KAC/B,EAAK,KAAK;IAAC,GAAG;IAAK,GAAG,MAAU;IAAM,CAAC,EACnC,MAAU,QAAc,SACxB,MAAU,MAAY,eACnB,aAAa,KAAS;IAE9B,GAAG,QAAQ;AACZ,SAAO,SAAS,GAAM;AAGrB,QAAK,IAAI,IAAI,GAAG,IAAI,EAAa,QAAQ,IACxC,KAAI,EAAa,OAAO,EAAa,QAAQ,EAAK,OAAO,EAAa,IAAK,QAAO;AAGnF,OAAI,CAAC,EAAK,OAAQ,QAAO,EAAO,KAAK,EAAK,KAAK;GAC/C,IAAI,IAAS,EAAO,KAAK,EAAK,KAAK;AACnC,OAAI,KAAU,KAAM,QAAO;AAC3B,QAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,IAChC,GAAK,OAAO,EAAK,GAAG,KAAK,EAAK,GAAG,IAAI,EAAO,IAAI,KAAK,mBAAmB,EAAO,IAAI,GAAG;AAEvF,UAAO;;;;CCfT,IAAI,IAAA,GAAA,EACA,IAAQ;AAEZ,GAAO,UAAU,SAAS,GAAO,GAAQ;EACxC,IAAI,IAAS,EAAE;AAEf,MAAI,KAAU,WACR,IAAI,KAAO,EACf,CAAI,EAAO,KAAK,GAAO,EAAI,IAAI,CAAC,EAAM,KAAK,EAAI,IAAI,EAAO,QAAQ,EAAI,GAAG,MACxE,EAAO,KAAO,EAAM;MAItB,MAAK,IAAI,KAAO,EACf,CAAI,EAAO,KAAK,GAAO,EAAI,IAAI,CAAC,EAAM,KAAK,EAAI,KAC9C,EAAO,KAAO,EAAM;AAKvB,SAAO;;;CC3CR,IAAI,IAAA,GAAA,EACA,IAAA,GAAA,EAEA,IAAA,GAAA,EACA,IAAA,GAAA,EACA,IAAA,GAAA,EACA,IAAA,GAAA,EACA,IAAA,GAAA;AAEJ,GAAO,UAAU,SAAS,GAAS,GAAa;EAC/C,IAAI,IAAI,QAAQ,SAAS,EAErB,IAAY,IAEZ,IAAQ,IACR,IAAkB,IAElB,GAAK,GAAU,GAEf,GAAiB,GAAW,GAAO,GAAa,GAEhD,IAAa;GAChB,UAAU,WAAW;AAEpB,IADA,IAAQ,IAAkB,IAC1B,EAAQ,oBAAoB,YAAY,GAAW,GAAM;;GAE1D,MAAM,WAAW;IAKhB,IAAI,IAAQ,EAAM,GAAW,EAAM,KAAK,EAAM;AAG9C,WAFI,IAAwB,EAAgB,OAAO,EAAM,GAElD,CAAC,EAAM;;GAEf,EAEG,IAAO,EAAM,OAAO,EAAE;EAE1B,SAAS,IAAe;AACvB,OAAY;GAGZ,IAAI,IAAS,EAAQ,SAAS;AAC9B,GAAI,EAAM,OAAO,OAAO,QACvB,IAAS,EAAQ,SAAS,SAAS,GAC/B,EAAM,OAAO,OAAO,QACvB,IAAS,EAAQ,SAAS,WAAW,GACjC,EAAO,OAAO,QAAK,IAAS,MAAM;GAGxC,IAAI,IAAO,EAAuB,EAAO,CAAC,MAAM,EAAM,OAAO,OAAO,EAChE,IAAO,EAAc,EAAK;AAE9B,UAAO,OAAO,EAAK,QAAQ,EAAQ,QAAQ,MAAM;GAEjD,SAAS,EAAO,GAAG;AAElB,IADA,QAAQ,MAAM,EAAE,EAChB,EAAM,IAAI,GAAe,MAAM,EAAC,SAAS,IAAK,CAAC;;AAGhD,KAAK,EAAE;GACP,SAAS,EAAK,GAAG;AAChB,WAAO,IAAI,EAAS,QAAQ,IAC3B,KAAI,EAAS,GAAG,MAAM,EAAK,EAAE;KAC5B,IAAI,IAAU,EAAS,GAAG,WACtB,IAAe,EAAS,GAAG,OAC3B,IAAY,GACZ,IAAS,IAAa,SAAS,GAAM;AACpC,gBAAW,GACf;WAAI,MAAS,EAAM,QAAO,EAAK,IAAI,EAAE;AAIrC,OAHA,IAAY,KAAQ,SAAS,OAAO,EAAK,QAAS,cAAc,OAAO,KAAS,cAAa,IAAO,OACpG,IAAQ,EAAK,QAAQ,IAAc,GAAM,IAAa,MACtD,IAAkB,EAAQ,SAAS,IAAU,MACzC,IAAiB,EAAY,QAAQ,IAExC,IAAkB,IAClB,EAAY,MAAM,GAAK,EAAW;;;AAKpC,KAAI,EAAQ,QAAQ,OAAO,KAAY,cACtC,IAAU,EAAE,EACZ,EAAO,EAAU,IAET,EAAQ,UAChB,EAAE,KAAK,WAAY;AAClB,aAAO,EAAQ,QAAQ,EAAK,QAAQ,GAAM,EAAa;OACtD,CAAC,KAAK,GAAQ,MAAS,IAAgB,OAAO,EAAO,GAEnD,GAAmB;AACxB;;AAIF,QAAI,MAAS,EACZ,OAAU,MAAM,qCAAqC,IAAgB,IAAI;AAE1E,MAAM,IAAI,GAAe,MAAM,EAAC,SAAS,IAAK,CAAC;;;EAIjD,SAAS,IAAY;AACpB,GAAK,MACJ,IAAY,IAIZ,WAAW,EAAa;;EAI1B,SAAS,EAAM,GAAM,GAAc,GAAQ;AAC1C,OAAI,CAAC,EAAM,OAAU,UAAU,gDAAgD;AAc/E,OAZA,IAAW,OAAO,KAAK,EAAO,CAAC,IAAI,SAAS,GAAO;AAClD,QAAI,EAAM,OAAO,IAAK,OAAU,YAAY,gCAAgC;AAC5E,QAAK,wBAAyB,KAAK,EAAM,CACxC,OAAU,YAAY,wEAAwE;AAE/F,WAAO;KACC;KACP,WAAW,EAAO;KAClB,OAAO,EAAgB,EAAM;KAC7B;KACA,EACF,IAAgB,GACZ,KAAgB,MAAM;IACzB,IAAI,IAAc,EAAc,EAAa;AAE7C,QAAI,CAAC,EAAS,KAAK,SAAU,GAAG;AAAE,YAAO,EAAE,MAAM,EAAY;MAAG,CAC/D,OAAU,eAAe,gDAAgD;;AAU3E,GAPA,IAAM,GAEN,EAAQ,iBAAiB,YAAY,GAAW,GAAM,EAEtD,IAAQ,IAGR,GAAc;;AAgGf,SA9FA,EAAM,MAAM,SAAS,GAAM,GAAM,GAAS;AAQzC,OAPI,KAAc,SACjB,MAAqB,EAAE,EACvB,EAAQ,UAAU,KAEnB,IAAa,MAEb,IAAO,EAAc,GAAM,EAAK,EAC5B,GAAO;AACV,OAAW;IACX,IAAI,IAAQ,IAAU,EAAQ,QAAQ,MAClC,IAAQ,IAAU,EAAQ,QAAQ;AACtC,IAAI,KAAW,EAAQ,UAAS,EAAQ,QAAQ,aAAa,GAAO,GAAO,EAAM,SAAS,EAAK,GAC1F,EAAQ,QAAQ,UAAU,GAAO,GAAO,EAAM,SAAS,EAAK;SAGjE,GAAQ,SAAS,OAAO,EAAM,SAAS;KAGzC,EAAM,MAAM,WAAW;AAAC,UAAO;KAC/B,EAAM,SAAS,MACf,EAAM,OAAO,EACZ,MAAM,SAAS,GAAO;GAMrB,IAAI,IAAQ,EACX,EAAM,MAAM,YAAY,KACxB,EAAO,EAAM,OAAO;IAAC;IAAW;IAAU;IAAY;IAAU,CAAC,EACjE,EAAM,SACN,EACG,GAAS,GAAS;AAsDtB,WA9CI,EAAM,MAAM,WAAW,EAAQ,EAAM,MAAM,aAC9C,EAAM,MAAM,OAAO,MACnB,EAAM,MAAM,mBAAmB,WAI/B,IAAU,EAAM,MAAM,SACtB,IAAU,EAAM,MAAM,SAEtB,IAAO,EAAc,EAAM,MAAM,MAAM,EAAM,MAAM,OAAO,EAC1D,EAAM,MAAM,OAAO,EAAM,SAAS,GAClC,EAAM,MAAM,UAAU,SAAS,GAAG;IACjC,IAAI;AAkBJ,IAjBI,OAAO,KAAY,aACtB,IAAS,EAAQ,KAAK,EAAE,eAAe,EAAE,GACZ,OAAO,KAAY,aAAtC,KAEA,OAAO,EAAQ,eAAgB,cACzC,EAAQ,YAAY,EAAE,EActB,MAAW,MAAS,CAAC,EAAE,qBAEtB,EAAE,WAAW,KAAK,EAAE,UAAU,KAAK,EAAE,UAAU,OAE/C,CAAC,EAAE,cAAc,UAAU,EAAE,cAAc,WAAW,YAEvD,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,WAE9C,EAAE,gBAAgB,EAClB,EAAE,SAAS,IACX,EAAM,IAAI,GAAM,MAAM,EAAQ;OAI1B;KAER,EACD,EAAM,QAAQ,SAAS,GAAK;AAC3B,UAAO,KAAS,KAAO,OAAO,EAAM,KAAO;KAGrC;;;CC/OR,IAAI,IAAA,GAAA;AAEJ,GAAO,UAAA,GAAA,CAAkC,OAAO,SAAW,MAAc,SAAS,MAAM,EAAY;;CCFpG,IAAI,IAAA,GAAA,EACA,IAAA,GAAA,EACA,IAAA,GAAA,EACA,IAAA,GAAA,EAEA,IAAI,WAAa;AAAE,SAAO,EAAY,MAAM,MAAM,UAAU;;AAkBhE,CAjBA,EAAE,IAAI,GACN,EAAE,QAAQ,EAAY,OACtB,EAAE,WAAW,EAAY,UACzB,EAAE,WAAW,KACb,EAAE,QAAQ,EAAY,OACtB,EAAE,QAAQ,GACV,EAAE,SAAA,GAAA,EACF,EAAE,SAAS,EAAY,QACvB,EAAE,UAAU,EAAQ,SACpB,EAAE,mBAAA,GAAA,EACF,EAAE,mBAAA,GAAA,EACF,EAAE,gBAAA,GAAA,EACF,EAAE,gBAAA,GAAA,EACF,EAAE,QAAA,GAAA,EACF,EAAE,SAAA,GAAA,EACF,EAAE,SAAA,GAAA,EAEF,EAAO,UAAU;;ACFjB,SAAgB,GAAS,GAAmB,GAAwC;AAClF,SAAA,GAAA,EAAA,SAAS,GAAc,GAAO,EAAS;;AAGzC,SAAgB,GAAc,GAAmB,GAAwC;AACvF,SAAA,GAAA,EAAA,SAAS,IAAmB,GAAO,EAAS;;AAG9C,SAAgB,GAAY,GAAmB,GAAwC;AACrF,SAAA,GAAA,EAAA,SAAS,GAAiB,GAAO,EAAS;;AAG5C,SAAgB,GAAgB,GAAmB,GAAwC;AACzF,SAAA,GAAA,EAAA,SAAS,IAAqB,GAAO,EAAS;;AAGhD,IAAa,WACJ,EACL,OAAO,EAAE,OAAO,EAAE,UAAO,QAAK,GAAG,KAAQ,mBACvC,GAAA,EAAA,SAAS,eAAe,GAAM;CAC5B,KAAA,GAAA,EAAA,SAAU,IAAmB,EAAM,GAAG;CACtC;CACA,KAAA,GAAA,EAAA,SAAQ,GAAiB,EAAI,GAAG;CACjC,CAAC,EAEL,GAGU,YACJ,EACL,OAAO,EAAE,UAAO,mBACd,GAAA,EAAA,SAAS,qBAAqB,GAAO,EAAS,EAEjD,GAGU,WACJ,EACL,OAAO,EAAE,UAAO,mBACd,GAAA,EAAA,SAAS,mBAAmB,GAAO,EAAS,EAE/C,GAGU,YACJ,EACL,OAAO,EAAE,UAAO,mBACd,GAAA,EAAA,SAAS,uBAAuB,GAAO,EAAS,EAEnD;;;ACnDH,SAAgB,GAAU,GAAkB,GAAuC;AACjF,SAAA,GAAA,EAAA,SAAS,IAAe,GAAO,EAAS;;AAG1C,IAAa,YACJ,EACL,OAAO,MAAS;CACd,IAAM,IAAO,EAAK;AAClB,SAAA,GAAA,EAAA,SACE,gBACA,EACE,OAAO;EACL,qBACE,OAAO,EAAK,WAAY,WACpB,UAAU,EAAK,QAAQ,UACvB,EAAK,WAAW;EACtB,kBACE,OAAO,EAAK,QAAS,WAAW,UAAU,EAAK,KAAK,UAAU,EAAK,QAAQ;EAC7E,GAAI,EAAK,SAAS,EAAE;EACrB,EACF,EACD,EAAK,SACN;GAEJ;;;ACzCH,SAAgB,EAAS,GAAqB;AAC5C,QAAO,OAAO,KAAM;;AAMtB,SAAgB,EAAS,GAAqB;AAC5C,QAAO,OAAO,KAAM;;AAMtB,SAAgB,GAAW,GAAsC;AAC/D,QAAO,OAAO,KAAM;;AAMtB,SAAgB,GAAQ,GAAoB;AAC1C,QAAO,MAAM,QAAQ,EAAE;;AAMzB,SAAgB,EAAS,GAAqB;AAC5C,QAAoB,OAAO,KAAM,cAA1B,KAAsC,CAAC,GAAQ,EAAE;;AAM1D,SAAgB,EACd,GACA,GAAG,GACH;AACA,QAAO,GAAW,EAAG,GAAG,EAAG,GAAG,EAAK,GAAG;;AAOxC,SAAgB,EAAM,GAAW,GAAa,GAAqB;AACjE,KAAI,KAAK,MAAM;AACb,MAAI,KAAO,QAAQ,IAAI,EACrB,QAAO;AAET,MAAI,KAAO,QAAQ,IAAI,EACrB,QAAO;;AAGX,QAAO;;AA6BT,SAAgB,IAAkB;AAEhC,KAAI,UAAU,WAAW,KAAK,EAAS,UAAU,GAAG,CAClD,QAAO,UAAU;AAEnB,KAAI,UAAU,WAAW,EACvB,QAAO;CAGT,IAAM,IAAmB,EAAE,EAErB,KAAW,MAA4B;AACtC,SAGL;OAAI,OAAO,KAAU,YAAY;AAC/B,MAAQ,GAAO,CAAC;AAChB;;AAIF,OAAI,OAAO,KAAU,UAAU;AAC7B,IAAI,KACF,EAAO,KAAK,EAAM;AAEpB;;AAIF,OAAI,MAAM,QAAQ,EAAM,EAAE;AACxB,SAAK,IAAM,KAAK,EACd,GAAQ,EAAE;AAEZ;;AAIF,OAAI,OAAO,KAAU,SACnB,MAAK,IAAM,KAAO,GAAO;IACvB,IAAM,IAAI,EAAM;AAEhB,KADiB,OAAO,KAAM,aAAa,GAAG,GAAG,MACnC,EAAO,KAAK,EAAI;;;;AAKpC,MAAK,IAAM,KAAO,UAChB,GAAQ,EAAI;AAGd,QAAO,EAAO,KAAK,IAAI;;AAOzB,SAAgB,GAAQ,GAAe,GAAgB,GAAc;AACnE,QAAO,EAAM,SAAS,GACpB,KAAQ,GAAG,IAAO;AAEpB,QAAO;;AAOT,SAAgB,EAAc,GAA8C;CAC1E,IAAI,IAAK,GACL,IAAK;AAQT,QAPI,aAAa,KACf,IAAK,EAAE,QAAQ,KAAK,EAAE,CAAE,OACxB,IAAK,EAAE,QAAQ,KAAK,EAAE,CAAE,UAExB,IAAK,EAAE,OACP,IAAK,EAAE,QAEF,CAAC,GAAI,EAAG;;AAGjB,SAAgB,GACd,GACA,GACA,GACA;AACA,OAAoB,EAAE;CACtB,IAAM,IAAO,EAAO,uBAAuB,EACrC,IAAK,OAAO,eAAe,SAAS,gBAAgB,YACpD,IAAK,OAAO,eAAe,SAAS,gBAAgB,WAEpD,IAAK,EAAO,aACZ,IAAK,EAAO,cACd,CAAC,GAAI,KAAM,EAAc,EAAE;AAC/B,CAAI,MACF,KAAM,EAAO,IACb,KAAM,EAAO;CAEf,IAAM,IAAI,IAAK,IAAK,EAAK,MACnB,IAAI,IAAK,IAAK,EAAK;AACzB,QAAO;EACL,OAAO;EACP,QAAQ;EACL;EACA;EACH,aAAa,IAAI;EACjB,aAAa,IAAI;EAClB;;AAGH,SAAgB,GAAS,EACvB,YACA,WACA,YAKC;CACD,IAAM,IAAO;EACX,QAAQ;EACR,WAAW,MAAkB;AAU3B,GATA,EAAK,YAAY,EACjB,EAAK,SAAS,EAAE,QACZ,KACF,EAAQ,EAAE,EAER,MACF,SAAS,iBAAiB,aAAa,GAAQ,EAAE,SAAS,IAAO,CAAC,EAClE,SAAS,iBAAiB,aAAa,GAAQ,EAAE,SAAS,IAAO,CAAC,GAEhE,MACF,SAAS,iBAAiB,WAAW,EAAM,EAC3C,SAAS,iBAAiB,YAAY,EAAM,EAC5C,SAAS,iBAAiB,eAAe,EAAM;;EAGnD,kBAAkB;AAMhB,GALA,EAAK,SAAS,MACV,MACF,SAAS,oBAAoB,aAAa,EAAO,EACjD,SAAS,oBAAoB,aAAa,EAAO,GAE/C,MACF,SAAS,oBAAoB,WAAW,EAAM,EAC9C,SAAS,oBAAoB,YAAY,EAAM,EAC/C,SAAS,oBAAoB,eAAe,EAAM;;EAGtD;EACA;EACA;EACD;AACD,QAAO;;AAGT,SAAgB,GAAgB,GAAa,GAAe,GAAmC;AAC7F,QAAO,IAAI,SAAS,MAAY;EAC9B,IAAI,IAAa,IACX,KAAW,MAAa;AAG5B,GAFA,IAAa,IACb,EAAG,oBAAoB,GAAO,EAAQ,EACtC,EAAQ,GAAK;;AAGf,EADA,EAAG,iBAAiB,GAAO,EAAQ,EACnC,iBAAiB;AAEf,GADA,EAAG,oBAAoB,GAAO,EAAQ,EACjC,MACH,IAAa,IACb,EAAQ,GAAM;KAEf,EAAQ;GACX;;;;AC9MJ,SAAgB,GAAW,GAAmB,GAAwC;AACpF,SAAA,GAAA,EAAA,SAAS,IAAgB,GAAO,EAAS;;AAG3C,IAAa,WAAqD;CAChE,IAAI,GACA,GACA,GACA,GACA,IAAU;CAEd,SAAS,EAAY,GAAyB;EAC5C,IAAM,IAAO,EAAK;AAGlB,EAFA,IAAQ,EAAK,SAAS,IACtB,IAAc,CAAC,CAAC,EAAK,aACrB,MAAc,CAAC,CAAC,EAAK;;CAGvB,SAAS,IAAe;AAEtB,EADA,IAAU,IACV,IAAY,CAAC;;CAGf,SAAS,IAAa;AAIpB,SAHI,CAAC,KAAQ,CAAC,KAAS,CAAC,IACf,QAET,GAAA,EAAA,SACE,uBACA,EACE,SAAS,IAAc,IAAe,KAAA,GACvC,EACD,GACA,EACD;;AAGH,QAAO;EACL,QAAQ;EACR,UAAU;EACV,OAAO,EAAE,UAAO,mBACd,IAAQ,EAAM,SAAS,IACvB,IAAO,EAAM,QAAQ,IACrB,IAAc,CAAC,CAAC,EAAM,aACtB,MAAc,CAAC,CAAC,EAAM,YACtB,GAAA,EAAA,SACE,iBACA;GACE,OAAO,EAAQ;IACZ,yBAA0B,CAAC,CAAC;IAC5B,uBAAwB,CAAC,CAAC;IAC5B,CAAC;GACF,OAAO,EAAM;GACd,EACD,EAAA,QAAE,SAAS,EAAE,EAAE,CAAC,GAAY,CAAC,CAAC,EAC9B,IAAY,QAAA,GAAA,EAAA,SAAS,IAAc,EAAE,YAAS,EAAE,EAAS,CAC1D;EAEJ;GAGG,YACG;CACL,gBAAgB,OAAO,EAAE,aAAU;AAGjC,EAFA,EAAI,UAAU,OAAO,QAAQ,EAC7B,EAAI,UAAU,IAAI,QAAQ,EACtB,MAAM,GAAgB,GAAK,kBAAkB,GAAG,IAClD,MAAM,GAAgB,GAAK,gBAAgB,IAAK;;CAGpD,OAAO,EAAE,aAAU,gBACjB,GAAA,EAAA,SACE,yBACA,EACE,OAAO,EAAQ;EACb,SAAS,EAAM;EACf,OAAO;EACR,CAAC,EACH,EACD,EACD;CAEJ;;;AChHH,SAAgB,GAAU,GAAkB,GAAuC;AACjF,SAAA,GAAA,EAAA,SAAS,IAAe,GAAO,EAAS;;AAG1C,IAAa,YACJ,EACL,OAAO,EAAE,OAAO,EAAE,SAAM,SAAM,UAAO,GAAG,KAAQ,mBAC9C,GAAA,EAAA,SACE,gBACA;CACE,OAAO;EACL,MAAM,KAAQ;EACd,UAAU,KAAQ;EAClB,GAAI,KAAS,EAAE;EAChB;CACD,GAAG;CACJ,EACD,EACD,EAEJ;;;ACrBH,SAAgB,GAAa,GAAqB,GAA0C;AAC1F,SAAA,GAAA,EAAA,SAAS,IAAkB,GAAO,EAAS;;AAG7C,SAAgB,GAAmB,GAAmB,GAAwC;AAC5F,SAAA,GAAA,EAAA,SAAS,IAAwB,GAAO,EAAS;;AAGnD,SAAgB,GAAmB,GAAmB,GAAwC;AAC5F,SAAA,GAAA,EAAA,SAAS,IAAwB,GAAO,EAAS;;AAGnD,SAAgB,GAAoB,GAAmB,GAAwC;AAC7F,SAAA,GAAA,EAAA,SAAS,IAAyB,GAAO,EAAS;;AAGpD,IAAa,YACJ,EACL,OAAO,EAAE,OAAO,EAAE,WAAQ,WAAQ,GAAG,KAAQ,mBAC3C,GAAA,EAAA,SAAS,mBAAmB,GAAM;CAChC,KAAA,GAAA,EAAA,SAAW,IAAwB,EAAO,GAAG;CAC7C;CACA,KAAA,GAAA,EAAA,SAAW,IAAwB,EAAO,GAAG;CAC9C,CAAC,EAEL,GAGU,YACJ,EACL,OAAO,EAAE,UAAO,mBACd,GAAA,EAAA,SAAS,6BAA6B,GAAO,EAAS,EAEzD,GAGU,YACJ,EACL,OAAO,EAAE,UAAO,mBACd,GAAA,EAAA,SAAS,6BAA6B,GAAO,EAAS,EAEzD,GAGU,YACJ,EACL,OAAO,EAAE,UAAO,mBACd,GAAA,EAAA,SAAS,4BAA4B,GAAO,EAAS,EAExD;;;AC/DH,SAAgB,EAAmB,GAAoC;AACrE,QAAO,GAAU,GAAS,GAAY,EAAQ,CAAC;;AAWjD,SAAgB,EAAsB,GAAiC,GAAU;CAC/E,IAAM,IAAM,GAAY,GAAS,EAAM;AAEvC,QADA,GAAY,GAAS,EAAI,EAClB;;AAGT,SAAgB,GAAY,GAAiC;AAU3D,QATI,EAAM,UACD,EAAM,QAAQ,IAAI,EAAM,OAAO,EAAM,MAAM,GAEhD,EAAM,SAAS,OACV,OAEL,EAAM,SAAS,OAGZ,EAAM,QAFJ,EAAM,MAAM,EAAM;;AAK7B,SAAgB,GAAY,GAAiC,GAAkB;AAC7E,KAAI,EAAM,SAAS;AACjB,IAAM,QAAQ,MAAM,GAAO,EAAM,OAAO,EAAM,MAAM;AACpD;;AAEE,OAAM,SAAS,MAGnB;MAAI,EAAM,OAAO;AACf,OAAI,CAAC,GAAY,EAAM,OAAO,EAAM,MAAM,EAAE;AAC1C,YAAQ,KACN,kDAAkD,OAAO,EAAM,MAAM,CAAC,qBACvE;AACD;;AAEF,KAAM,MAAM,EAAM,SAAS;AAC3B;;AAEF,IAAM,QAAQ;;;AAGhB,SAAS,GAAe,GAAQ,GAAuB;CACrD,IAAM,IAAO,OAAO,yBAAyB,GAAK,EAAI;AACtD,QAAO,CAAC,KAAQ,CAAC,CAAC,EAAK,YAAY,CAAC,CAAC,EAAK;;AAG5C,SAAS,GAAmB,GAAwC,GAAuB;AAIzF,QAHI,EAAO,UACF,EAAO,QAAQ,YAAY,EAAM,GAEnC;;AAGT,SAAS,GAAiB,GAAwC,GAAqB;AAIrF,QAHI,EAAO,UACF,EAAO,QAAQ,UAAU,EAAI,GAE/B;;;;AC1ET,SAAgB,GAAQ,GAAiC;AACvD,QAAO,OAAO,KAAU,cAAY,KAAiB,SAAS;;AAGhE,SAAgB,GACd,GACA,GACA;AAYA,QAXI,MAAM,QAAQ,EAAM,GACf,EAAM,KAAK,GAAI,GAAG,MACnB,GAAQ,EAAG,GACN,EAAG,GAAI,GAAG,EAAK,GAEjB,EACP,GAEA,GAAQ,EAAM,GACT,EAAG,GAAO,GAAG,CAAC,EAAM,CAAC,GAEvB;;AAGT,SAAgB,GAAe,GAAuC;AAgBpE,QAfI,KAAY,OACP,OAEL,OAAO,KAAa,aACf,GAAU,GAEf,MAAM,QAAQ,EAAS,GAClB,EAAS,KAAK,MAAO;AAC1B,MAAI,GAAa,EAAG,EAAE;GACpB,IAAM,EAAE,cAAW,eAAY,gBAAa;AAC5C,WAAA,GAAA,EAAA,SAAS,GAAkB,GAAY,GAAe,KAAY,EAAE,CAAC,CAAC;;AAExE,SAAO;GACP,GAEG;;AAGT,SAAS,GAAa,GAA+C;AACnE,QAAO,OAAO,KAAU,cAAY,KAAiB,eAAe,KAAS,gBAAgB;;AAQ/F,SAAgB,GAAa,GAA8C;AACzE,cAAa;EACX,IAAI;AASJ,SARI,UAAU,WAAW,IACvB,IAAO,UAAU,MAAM,EAAE,GAChB,UAAU,SAAS,KAC5B,IAAO,UAAU,MAAM,EAAE,EACzB,EAAK,QAAQ,UAAU,MAEvB,IAAO,EAAE,GAEX,GAAA,EAAA,SAAS,GAAW,EAAK;;;;;AC5B7B,SAAgB,GAAW,GAAW,GAA6C;AACjF,QAAO;EACL,WAAW,EAAO;EAClB,MAAM,MAAW,EAAO,KAAS;EAClC;;;;AC7BH,IAAa,KAAI,EAAA;AAQjB,SAAgB,GAAQ,GAA0B,GAAgD;CAChG,IAAM,IAAK,OAAO,KAAW,WAAW,SAAS,cAAc,EAAO,GAAI;AAE1E,KADA,EAAG,UAAU,IAAI,WAAW,EACxB,CAAC,EACH,GAAA,QAAE,MAAM,GAAI,KAAK;UACR,MAAM,QAAQ,EAAK,CAC5B,GAAA,QAAE,MAAM,GAAI,EAAE,YAAY,GAAM,CAAC;UACxB,OAAO,KAAS,YAAY;EACrC,IAAM,IAAS,GAAQ,MAAM,EAAK;AAClC,IAAA,QAAE,MAAM,GAAI,EACV,YAAY,GAAe,EAAO,EACnC,CAAC;OAEF,GAAA,QAAE,MAAM,GAAI,EAAK;;AAUrB,SAAgB,GAAU,GAA0B;CAClD,IAAM,IAAK,OAAO,KAAW,WAAW,SAAS,cAAc,EAAO,GAAI;AAC1E,GAAA,QAAE,MAAM,GAAI,KAAK;;AAcnB,SAAgB,KAAW;AACzB,GAAA,QAAE,QAAQ;;;;ACnCZ,SAAgB,GAAW,GAAkB,GAAuC;AAClF,SAAA,GAAA,EAAA,SAAS,IAAgB,GAAO,EAAS;;AAmB3C,SAAgB,GAAkB,GAAkB,GAAuC;AACzF,SAAA,GAAA,EAAA,SAAS,IAAuB,GAAO,EAAS;;AAGlD,IAAa,MAA6D,OACjE,EACL,OAAO,EAAE,UAAO,kBACd,GACE,OACA;CACE,GAAG;CACH,OAAO,EAAQ,EAAE,OAAO,CAAC,CAAC,EAAM,OAAO,EAAE,EAAM,MAAM;CACtD,EACD,EACD,EACJ,GAGU,WAAoD;CAC/D,IAAI,IAAe,IACf,IAAY,GACZ,GACA,GACA,GACA,GACA,GAEA,IAA0B,MAC1B,IAAgC;CAEpC,SAAS,EAAgB,GAAe,GAAe,GAAkB,GAAkB;AAYzF,EAXA,GAAU,EACV,EAAE,iBAAiB,EAEnB,IAAa,GACb,IAAY,EAAO,KAAK,uBAAuB,EAC/C,IAAY,EAAO,KAAK,uBAAuB,EAC/C,IAAY,EAAO,KACnB,IAAY,EAAO,KAGnB,OAAO,iBAAiB,aAAa,EAAW,EAChD,OAAO,iBAAiB,WAAW,EAAS;EAE5C,IAAM,IAAS,EAAU;AACzB,EAAI,KACF,EAAO,UAAU,IAAI,WAAW;;CAIpC,SAAS,EAAW,GAAe;AACjC,MAAI,CAAC,KAAa,CAAC,KAAa,CAAC,KAAc,CAAC,KAAa,CAAC,EAC5D;AAGF,EACE,MAAW,GAAc;EAG3B,IAAM,IAAQ,IAAe,EAAE,UAAU,EAAW,UAAU,EAAE,UAAU,EAAW,SAC/E,IAAQ,IAAe,EAAU,QAAQ,EAAU,QAEnD,IAAQ,KADA,IAAe,EAAU,QAAQ,EAAU,SAGnD,IAAQ,KAAK,IAAI,GAAW,KAAK,IAAI,IAAQ,GAAO,IAAQ,EAAU,CAAC,EACvE,IAAQ,IAAQ,GAChB,IAAU,IAAQ,IAAY,KAC9B,IAAU,IAAQ,IAAY;AAEpC,EADA,EAAU,MAAM,OAAO,OAAO,EAAO,IACrC,EAAU,MAAM,OAAO,OAAO,EAAO;;CAGvC,SAAS,IAAuB;AAC9B,MAAI,CAAC,EACH,QAAO;EAET,IAAI,IAAQ;AACZ,OAAK,IAAI,IAAI,GAAG,IAAI,EAAU,SAAS,QAAQ,KAAK;GAClD,IAAM,IAAK,EAAU,SAAS,IACxB,IAAO,EAAG,uBAAuB,EACjC,IAAO,IAAe,EAAK,QAAQ,EAAK;AAE9C,GADA,KAAS,GACJ,EAAG,UAAU,SAAS,QAAQ,GAGjC,EAAG,MAAM,OAAO,MAFhB,EAAG,MAAM,OAAO,OAAO,EAAK;;AAKhC,SAAO;;CAGT,SAAS,IAAW;EAClB,IAAM,IAAS,GAAW;AAY1B,EAXI,KACF,EAAO,UAAU,OAAO,WAAW,EAErC,IAAY,MACZ,IAAY,MACZ,IAAY,MACZ,IAAY,MACZ,IAAa,MACb,IAAW,MACX,OAAO,oBAAoB,aAAa,EAAW,EACnD,OAAO,oBAAoB,WAAW,EAAS,EAC/C,GAAc;;AAGhB,QAAO;EACL,WAAW,EAAE,aAAU;AACrB,OAAY;;EAEd,OAAO,EAAE,OAAO,EAAE,UAAO,SAAM,YAAS,GAAG,KAAQ,mBACjD,IAAe,MAAS,OACxB,IAAY,IAAU,KAAK,IAAI,KAAW,IAAI,EAAE,EAChD,eAAe,EAAa,GAC5B,GAAA,EAAA,SACE,sBACA;GACE,GAAG;GACH,OAAO,EAAQ;IACb,oBAAoB;IACpB,oBAAoB,CAAC;IACtB,CAAC;GACF,OAAO;IACL,GAAI,KAAS,EAAE;IACf,SAAS;IACT,eAAe,IAAe,QAAQ;IACvC;GACF,EACD,GAAY,IAAW,GAAO,GAAG,MAC1B,IAIE,CACL,GAFgB,EAAK,IAAI,MAIrB,GAAA,EAAA,SACE,wBAAwB;GACxB,OAAO,EAAQ;IACb,sBAAsB;IACtB,sBAAsB,CAAC;IACxB,CAAC;GACF,cAAc,MACZ,EAAgB,GAAG,GAAG,GAAc,EAAK,IAAI,GAAU;GAC1D,CAAC,GARF,KASL,GAfQ,KAgBT,CACH;EAEJ;GCpLG,KAAW,OAAO,WAAW,EAetB,WAAiD;CAC5D,IAAI,GACA;AAEJ,QAAO;EACL,SAAS,MAAS;AAGhB,OAFA,IAAQ,EAAK,MAAc,KAC3B,IAAQ,GACJ,CAAC,EACH,OAAU,MAAM,+CAA+C;AAEjE,KAAK,OAAO,EAAK;;EAEnB,gBAAgB;AACd,KAAK,OAAO,EAAM;;EAEpB,OAAO,EAAE,UAAO,kBAAe;GAC7B,IAAM,IAAQ,EAAM,OACd,IAAS,EAAK,SAAS,EAAM;AACnC,UAAO,EAAA,GAAA,EAAA,SAEH,0BACA;IACE,OAAO,EAAQ,EACb,WACD,CAAC;IACF,eAAe,EAAK,SAAS,EAAM;IACpC,EACD,EACD,EACA,KAAS,GAAA,EAAA,SAAS,uBAAuB,EAAE,EAAE,EAAS,GAA7C,KACX;;EAEJ;;AAGH,SAAgB,GAAO,GAAkB,GAAuC;AAC9E,SAAA,GAAA,EAAA,SAAS,IAAe,GAAO,EAAS;;AAG1C,IAAa,WAAmD;CAC9D,IAAM,IAA8B,EAAE,EAClC,IAAiC,MAC/B,IAAiB;EACrB,OAAO,GAAO;AAGZ,GAFA,EAAS,KAAK,EAAM,EACpB,MAAW,GACP,EAAM,MAAM,WACd,IAAS;;EAGb,OAAO,GAAO;GACZ,IAAM,IAAQ,EAAS,QAAQ,EAAM;AAIrC,GAHI,KAAS,KACX,EAAS,OAAO,GAAO,EAAE,EAEvB,MAAW,MACb,IAAS,EAAS,MAAM;;EAG5B,SAAS,GAAO;AACd,OAAS;;EAEX,SAAS,GAAO;AACd,UAAO,MAAW;;EAErB;CAED,SAAS,EAAY,GAAwB;AAC3C,SAAO,GAAY,EAAK,WAAW,MAAU;AAC3C,OAAI,CAAC,EACH,QAAO;AAET,OAAI,EAAM,QAAQ,GAChB,SAAA,GAAA,EAAA,SACE,EAAM,KACN;IACE,GAAG,EAAM;KACR,KAAW;IACb,EACD,EAAM,SACP;GAIH,IAAM,IAAQ,EAAM;AACpB,WAAA,GAAA,EAAA,SACE,IACA;IACE,OAAO,EAAM,SAAS;KAChB,KAAW;IAClB,GAAA,GAAA,EAAA,SAEC,EAAM,KACN;IACE,GAAG;IACH,OAAO,KAAA;IACR,EACD,EAAM,SACP,CACF;IACD;;AAGJ,QAAO,EACL,OAAO,OACL,GAAA,EAAA,SACE,gBACA,EACE,OAAO,EAAQ,EACb,qBAAqB,CAAC,CAAC,EAAK,MAAM,UACnC,CAAC,EACH,EACD,EAAA,QAAE,SAAS,EAAE,EAAE,CAAC,EAAY,EAAK,CAAC,CAAC,CACpC,EAEJ;;;;ACtHH,SAAgB,GAAU,GAA0C;AAClE,SAAA,GAAA,EAAA,SAAS,IAAe,EAAM;;AAShC,SAAS,GACP,GACA,GACA,IAAQ,GACR,IAAwB,EAAE,EACX;AACf,MAAK,IAAM,KAAQ,GAAM;EACvB,IAAM,IAAW,EAAQ,WAAW,EAAK,IAAI,IACvC,IAAW,EAAQ,aAAa,EAAK;AAE3C,EADA,EAAO,KAAK;GAAE;GAAM;GAAO;GAAU,CAAC,EAChC,KAAY,KAChB,GAAY,GAAU,GAAS,IAAQ,GAAG,EAAO;;AAGrD,QAAO;;AAGT,IAAM,KAAa,IACN,WAAwD;CACnE,IAAI,IAAY,GACZ,IAAkC,MAClC,IAAS,GACT,IAAyB,EAAE,EAE3B,IAAuC,MACvC,GACA,GACA,GACA,IAAsB,EAAE,EACxB,IAA+B;AACnC,QAAO;EACL,WAAW;AACT,MAAU,YAAY;;EAExB,SAAS,EAAE,UAAO;AAQhB,GAPA,IAAW,IAAI,gBAAgB,MAAY;IACzC,IAAI,IAAY,EAAQ,GAAG,YAAY;AACvC,IAAI,MAAc,MAChB,IAAS,GACT,EAAA,QAAE,QAAQ;KAEZ,EACF,EAAS,QAAQ,EAAI;;EAEvB,SAAS,EAAE,OAAO,EAAE,gBAAa;AAC/B,KAAQ,UAAU,EAChB,SAAS,GAAM;IACb,IAAM,IAAQ,EAAM,WAAW,MAAO,EAAG,SAAS,EAAK;AACvD,IAAI,KAAS,MACX,GAAU,SAAS;KACjB,KAAK,KAAS,KAAa;KAC3B,UAAU;KACX,CAAC,EACF,EAAA,QAAE,QAAQ;MAGf,CAAC;;EAEJ,KAAK,EAAE,YAAS;AAQZ,GAPF,IAAO,EAAM,MACb,IAAU,EAAM,SAChB,IAAa,EAAM,YACnB,IAAY,EAAM,aAAa,IAC/B,IAAW,EAAM,UAGf,IAAQ,GAAY,GAAM,EAAQ;GAGpC,IAAM,IAAY,EAAM,QAClB,IAAc,KAAK,KAAK,IAAS,EAAU,EAC3C,IAAW,KAAK,MAAM,IAAY,EAAU,EAC5C,IAAS,KAAK,IAAI,IAAW,GAAa,EAAU,EACpD,IAAU,IAAW,GACrB,IAAa,EAAM,MAAM,GAAU,EAAO;AAChD,WAAA,GAAA,EAAA,SACE,gBACA;IACE,OAAO,EAAM,SAAS,EAAE;IACxB,WAAW,EAAE,aAAU;AACrB,SAAW;;IAEb,WAAW,MAAe;AACxB,SAAa,EAAE,OAAuB;;IAEzC,GAAA,GAAA,EAAA,SAEC,uBACA,EACE,OAAO,EACL,QAAQ,GAAG,IAAY,EAAU,KAClC,EACF,GAAA,GAAA,EAAA,SAEC,yBACA,EACE,OAAO;IACL,yBAAyB,GAAG,EAAU;IACtC,WAAW,cAAc,EAAQ;IAClC,EACF,EACD,EAAW,KAAK,EAAE,SAAM,UAAO,kBAAe;IAC5C,IAAM,IAAK,EAAS,OAAO,EAAK,EAC1B,IAAa,MAAO,GACpB,IAAO,EAAS,SAAS,GAAM,EAAS,WAAW,EAAK,CAAC,EACzD,IAAe,CAAC,CAAC,EAAS,aAAa,EAAK;AAClD,YAAA,GAAA,EAAA,SACE,oBACA;KACE,KAAK;KACL,OAAO,EAAQ;MACb,UAAU;MACV,YAAY;MACb,CAAC;KACF,OAAO;MACL,QAAQ,GAAG,EAAU;MACrB,wBAAwB;MACzB;KACD,eAAe,IAAW,EAAK;KAChC,EACD;oBACI,wBAAwB;MACxB,OAAO,EAAQ;OAAE;OAAU,YAAY;OAAc,CAAC;MACtD,UAAU,MAAkB;AAC1B,OAAI,MACF,EAAE,iBAAiB,EACnB,EAAS,YAAY,GAAM,CAAC,EAAS;;MAG1C,CAAC;KACF,KAAA,GAAA,EAAA,SAAS,sBAAsB,EAAE,EAAE,EAAK,GAAG;oBACzC,uBAAuB,EAAE,EAAE,EAAS,UAAU,EAAK,CAAC;KACvD,CACF;KACD,CACH,CACF,CACF;;EAEJ;;;;AClKH,SAAgB,GAAY,GAAoB,GAAyC;AACvF,SAAA,GAAA,EAAA,SAAS,IAAiB,GAAO,EAAS;;AAG5C,IAAa,WAAuD;CAClE,IAAI,IAAsC;AAC1C,QAAO;EACL,WAAW,EAAE,aAAU;AAErB,GADA,IAAY,GACZ,EAAU,iBAAiB,SAAS,GAAS;;EAE/C,gBAAgB;AAEd,GADA,GAAW,oBAAoB,SAAS,GAAS,EACjD,IAAY;;EAEd,OAAO,EAAE,UAAO,mBACd,GAAA,EAAA,SAAS,qBAAqB,GAAO,CAAC,GAAW,OAAO,IAAW,KAAK,CAAC;EAE5E;;;;ACSH,SAAgB,GAAY,GAAoB,GAAyC;AACvF,SAAA,GAAA,EAAA,SAAS,IAAwB,GAAc,EAAS;;AAG1D,IAAa,YACJ,EACL,OAAO,EAAE,UAAO,kBAAe;CAC7B,IAAM,EAAE,WAAQ,UAAO,OAAO,GAAW,UAAO,GAAG,MAAS;AAC5D,SAAA,GAAA,EAAA,SACE,kBACA;EACE,MAAM;EACN,OAAO,EACL;GACE,cAAc,CAAC,CAAC;GAChB,cAAc,CAAC,CAAC;GAChB,cAAc,CAAC,CAAC,EAAM;GACtB,kBAAkB,CAAC,CAAC,EAAM;GAC3B,EACD,EACD;EACD,OAAO;GACL,MAAM,EAAM;GACZ,GAAI,KAAS,EAAE;GAChB;EACD,GAAG;EACJ,EACD,EACD;GAEJ;;;ACrEH,SAAgB,GAAU,GAAsC;AAC9D,SAAA,GAAA,EAAA,SAAS,IAAS,EAAM;;AAG1B,IAAa,YACJ,EACL,OAAO,OACL,GAAA,EAAA,SAAS,mBAAmB,EAAK,OAAO,EAAK,SAAS,EAEzD;;;AC2EH,SAAgB,GAAQ,GAAuB,GAAuB;CACpE,IAAM,IAAmB;EACvB,OAAO,EAAO;EACd,SAAS,EAAO;EAChB,gBAAgB,EAAO;EAEvB,WAAW,EAAO,aAAa;EAC/B,WAAW;EACX,KAAK,EAAO,OAAO;EACnB,KAAK,EAAO,OAAO;EAEnB,OAAO;EACP,YAAY;EAEZ,QAAQ,IAAI,aAAa,EAAK;EAC9B,MAAM;EACN,OAAO;EACP,OAAO;EAEP,KAAK;EACL,KAAK;EAEL,UAAU,IAAI,aAAa,EAAK;EAChC,UAAU,IAAI,aAAa,EAAK;EAChC,QAAQ,IAAI,YAAY,EAAK;EAC7B,QAAQ,IAAI,YAAY,EAAK;EAE7B,SAAS;EACT,SAAS;EACT,SAAS;EACT,SAAS;EAET,SAAS;EACT,SAAS;EAET,cAAc,GAAa,EAAO,QAAQ,EAAE,EAAQ;EACrD;AACD,SAAQ,EAAO,WAAf;EACE,KAAK;AACH,KAAQ,YAAY;AACpB;EACF,KAAK;AACH,KAAQ,YAAY;AACpB;EACF;AACE,KAAQ,YAAY;AACpB;;AAEJ,QAAO;;AAGT,SAAS,GAAa,GAAmB;AACvC,QAAO,KAAK,MAAM,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;;AAGvC,SAAS,GAAa,GAAmB;AACvC,QAAO,KAAK,IAAI,EAAE,GAAG;;AAGvB,SAAS,GAAgB,GAAmB;AAC1C,QAAO;;AAGT,SAAS,GAAa,GAAgB,GAAoB;AAExD,KAAI,EAAE,SAAS,KACb,GAAE,QAAQ;MACL;EACL,IAAM,IAAI,EAAE;AACZ,IAAE,QAAQ,IAAI,EAAE,SAAS,IAAI,KAAK;;CAGpC,IAAM,IAAI,EAAE,OACN,IAAI,EAAE,SACN,IAAO,EAAE,OAAO;AAGtB,KAAI,EAAE,UAAU,GAAM;EACpB,IAAM,IAAM,EAAE,OAAO,EAAE;AACvB,IAAE,OAAO;OAET,GAAE;AAYJ,MARA,EAAE,OAAO,EAAE,QAAQ,GACnB,EAAE,QAAQ,EAAE,OAAO,KAAK,GAGxB,EAAE,OAAO,GACT,EAAE,MAAM,EAAE,MAAM,EAAE,OAGX,EAAE,YAAY,EAAE,UAAS;EAC9B,IAAM,KAAQ,EAAE,UAAU,IAAI,KAAQ;AACtC,MAAI,EAAE,SAAS,MAAS,EAAG;AAC3B,IAAE,UAAU;;AAOd,MAJA,EAAE,SAAS,EAAE,WAAW,GACxB,EAAE,OAAO,EAAE,WAAW,GACtB,EAAE,WAAW,EAAE,UAAU,KAAK,GAEvB,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,IAAI,GAC3D,GAAE,WAAW,EAAE,UAAU,KAAK;AAIhC,QAAO,EAAE,YAAY,EAAE,UAAS;EAC9B,IAAM,KAAQ,EAAE,UAAU,IAAI,KAAQ;AACtC,MAAI,EAAE,SAAS,MAAS,EAAG;AAC3B,IAAE,UAAU;;AAOd,MAJA,EAAE,SAAS,EAAE,WAAW,GACxB,EAAE,OAAO,EAAE,WAAW,GACtB,EAAE,WAAW,EAAE,UAAU,KAAK,GAEvB,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,IAAI,GAC3D,GAAE,WAAW,EAAE,UAAU,KAAK;CAIhC,IAAM,IAAS,EAAE,YAAY,EAAE,UAAkC,EAAE,MAA1B,EAAE,SAAS,EAAE,UAEhD,IAAS,EAAE,YAAY,EAAE,UAAkC,EAAE,MAA1B,EAAE,SAAS,EAAE;AAGtD,CADA,EAAE,UAAU,GACZ,EAAE,UAAU;CAGZ,IAAM,IAAI,EAAE,WAEN,IAAK,EAAE,EAAE,EACT,IAAO,EAAE,KAAK,IAAI,EAAE,KAAK,EAAO,CAAC,EAGjC,IAFO,EAAE,KAAK,IAAI,EAAE,KAAK,EAAO,CAAC,GAElB,KAAQ,GACvB,KAAQ,IAAK,KAAQ;AAG3B,QADA,EAAE,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAK,CAAC,EACtC,EAAE;;;;AClNX,SAAgB,GAAc,GAA0C;CACtE,IAAM,IAAK,EAAO,WAAW,SAAS;AACtC,KAAI,CAAC,EACH,OAAU,MAAM,0CAA0C;CAG5D,IAAM,IAAO,GAAc,EAAG,EACxB,IAAM,EAAG,cAAc;AAa7B,CAPA,EAAG,WAAW,EAAG,cAAc,EAAI,EACnC,EAAG,wBAAwB,EAAK,EAChC,EAAG,wBAAwB,EAAO,EAClC,EAAG,wBAAwB,EAAO,EAElC,EAAG,oBAAoB,GAAM,GAAG,EAAG,OAAO,IAAO,IAAI,EAAE,EACvD,EAAG,oBAAoB,GAAQ,GAAG,EAAG,OAAO,IAAO,IAAI,EAAE,EACzD,EAAG,oBAAoB,GAAQ,GAAG,EAAG,OAAO,IAAO,IAAI,EAAE;CAEzD,IAAM,IAAW,EAAG,mBAAmB,GAAM,YAAY,EACnD,IAAa,EAAG,mBAAmB,GAAM,UAAU,EACnD,IAAc,EAAG,mBAAmB,GAAM,WAAW,EACrD,IAAa,EAAG,mBAAmB,GAAM,SAAS,EAClD,IAAO,EAAG,mBAAmB,GAAM,YAAY,EAC/C,IAAS,EAAG,mBAAmB,GAAM,UAAU,EAEjD,IAAY,IACZ,IAAU,KACV,IAAO,GACP,GACA,GACA,GAEE,IAA0C,EAAE,EAC5C,IAAsB,EAAE;CAC9B,SAAS,EAAU,GAAqB;AAStC,EARA,IAAY,CAAC,CAAC,EAAO,WACrB,IAAO,EAAO,KAAK,QACnB,IAAU,KAAK,IAAI,EAAO,eAAe,KAAK,IAAI,EAClD,IAAO,IAAI,aAAa,IAAO,EAAQ,EACvC,IAAO,IAAI,YAAY,EAAK,EAC5B,IAAQ,IAAI,aAAa,IAAO,IAAU,EAAE,EAE5C,EAAS,SAAS,GAClB,EAAO,SAAS;AAChB,OAAK,IAAI,IAAI,GAAG,IAAI,GAAM,KAAK;AAC7B,KAAS,KAAK,GAAQ,EAAO,KAAK,IAAI,EAAQ;GAC9C,IAAM,IAAM,EAAO,KAAK,GAAG;AAI3B,KAAO,KAAK;IAHF,SAAS,EAAI,MAAM,GAAG,EAAE,EAAE,GAAG,GAAG;IAChC,SAAS,EAAI,MAAM,GAAG,EAAE,EAAE,GAAG,GAAG;IAChC,SAAS,EAAI,MAAM,GAAG,EAAE,EAAE,GAAG,GAAG;IACrB;;;CAIzB,SAAS,EAAO,GAAe,GAAgB;AAE7C,EADA,EAAO,QAAQ,GACf,EAAO,SAAS;;CAGlB,SAAS,IAAS;AAChB,OAAK,IAAI,IAAI,GAAG,IAAI,EAAS,QAAQ,IAEnC,CADA,EAAK,MAAM,EAAK,KAAK,KAAK,GAC1B,EAAK,IAAI,IAAU,EAAK,MAAM,EAAS,GAAG,QAAQ;;CAItD,SAAS,IAAS;AAChB,OAAK,IAAI,IAAI,GAAG,IAAI,GAAM,IACxB,MAAK,IAAI,IAAI,GAAG,IAAI,GAAS,KAAK;GAChC,IAAM,KAAO,EAAK,KAAK,IAAI,KAAK,GAC1B,KAAQ,IAAI,IAAU,KAAK;AAIjC,GAFA,EAAM,IAAO,KAAK,GAClB,EAAM,IAAO,KAAK,IAAY,IAAI,GAClC,EAAM,IAAO,KAAK,EAAK,IAAI,IAAU;;AAiBzC,EAbA,EAAG,SAAS,GAAG,GAAG,EAAO,OAAO,EAAO,OAAO,EAC9C,EAAG,WAAW,GAAG,GAAG,GAAG,EAAE,EACzB,EAAG,MAAM,EAAG,iBAAiB,EAG7B,EAAG,WAAW,EAAK,EACnB,EAAG,UAAU,GAAU,EAAQ,EAC/B,EAAG,UAAU,GAAY,EAAO,MAAM,EACtC,EAAG,UAAU,GAAa,EAAO,OAAO,EACxC,EAAG,UAAU,GAAM,EAAQ,EAC3B,EAAG,UAAU,IAAa,EAAO,SAAS,IAAU,IAAO,MAAY,IAAY,IAAI,GAAM,EAE7F,EAAG,WAAW,EAAG,cAAc,EAAI,EACnC,EAAG,WAAW,EAAG,cAAc,GAAO,EAAG,aAAa;AAEtD,OAAK,IAAI,IAAI,GAAG,IAAI,GAAM,IACpB,GAAS,GAAG,YAGhB,EAAG,WAAW,GAAQ,EAAO,GAAG,EAChC,EAAG,WAAW,EAAG,YAAY,IAAI,GAAS,EAAQ;;AAItD,QAAO;EACL;EACA;EACA;EACA;EACA,UAAU,MAAgB,EAAS;EACnC,cAAc,EAAS;EACxB;;AAGH,IAAM,KAAkB,goBAyBlB,KAAkB;AASxB,SAAS,GAAQ,GAA4B,GAAc,GAAa;CACtE,IAAM,IAAI,EAAG,aAAa,EAAK;AAG/B,KAFA,EAAG,aAAa,GAAG,EAAI,EACvB,EAAG,cAAc,EAAE,EACf,CAAC,EAAG,mBAAmB,GAAG,EAAG,eAAe,CAC9C,OAAM,EAAG,iBAAiB,EAAE;AAE9B,QAAO;;AAGT,SAAS,GAAc,GAA4B;CACjD,IAAM,IAAO,EAAG,eAAe;AAK/B,QAJA,EAAG,aAAa,GAAM,GAAQ,GAAI,EAAG,eAAe,GAAK,CAAC,EAC1D,EAAG,aAAa,GAAM,GAAQ,GAAI,EAAG,iBAAiB,GAAK,CAAC,EAC5D,EAAG,YAAY,EAAK,EACpB,EAAG,WAAW,EAAK,EACZ;;;;AChLT,SAAgB,GAAQ,GAAmB,GAAwC;AACjF,SAAA,GAAA,EAAA,SAAS,IAAgB,GAAO,EAAS;;AAG3C,IAAa,WAAqD;CAChE,IAAI,IAAkC,MAClC,IAAyB,MACzB,IAAmC,MACnC,GACA,IAAsB,EAAE,MAAM,EAAE,EAAE,EAClC,IAAgC,EAAE,EAClC,IAA6B;CAEjC,SAAS,EAAQ,GAAuB;AAItC,EAHA,IAAS,GACT,GAAU,QAAQ,EAAO,EACzB,GAAa,EACb,IAAc,YAAY,GAAc,IAAI;;CAG9C,SAAS,IAAa;AAMpB,EALA,GAAU,YAAY,EAClB,MAAY,SACd,qBAAqB,EAAQ,EAC7B,IAAU,OAER,MAAgB,SAClB,cAAc,EAAY,EAC1B,IAAc;;CAIlB,SAAS,IAAc;AACrB,EAAI,GAAQ,eACV,EAAS,QAAQ,EACjB,EAAS,QAAQ,EACjB,IAAU,sBAAsB,EAAY,IAE5C,GAAY;;CAIhB,SAAS,IAAe;AACtB,KAAa,GAAU,EAAY;;CAGrC,SAAS,EAAc,EAAE,UAAiB;AACxC,KAAY;EACZ,IAAM,IAAS;AACf,MAAI,EAAE,aAAkB,oBAAoB;AAC1C,WAAQ,MAAM,2CAA2C;AACzD;;AAQF,EANA,IAAW,IAAI,gBAAgB,MAAY;GACzC,IAAM,IAAO,GAAiB,EAAQ;AACtC,GAAI,KAAQ,KACV,EAAS,OAAO,EAAK,OAAO,EAAK,OAAO;IAE1C,EACF,IAAW,GAAc,EAAO;AAChC,OAAK,IAAI,IAAI,GAAG,IAAI,EAAO,KAAK,QAAQ,IACtC,GAAO,KAAK,GAAG,UAAU,GAAc,EAAE;AAG3C,EADA,EAAS,UAAU,EAAO,EAC1B,EAAQ,EAAO;;CAGjB,SAAS,IAAe;AACtB,KAAY;;CAGd,SAAS,EAAa,GAAyB;AAC7C,MAAS;GACP,GAAG,EAAK;GACR,OAAO,EAAK,MAAM,QAAQ,EAAE,EAAE,KAAK,GAAG,OAC7B;IACL,GAAG;IACH,MAAM,EAAE,QAAQ,OAAO,IAAI;IAC3B,OAAO,EAAE,SAAS,GAAc,EAAE;IACnC,EACD;GACH;;AAEH,QAAO;EACL,QAAQ;EACR,UAAU;EACV,gBAAgB;AACd,MAAY;;EAEd,OAAO,EAAE,OAAO,EAAE,cAAW,qBAEpB,EAAA,GAAA,EAAA,SACH,oBAAoB;GACpB,OAAO,yBAHK,KAAa,OAAO,IAAY,IAAI,EAAO,KAAK,UAAU,iBAGhC;GACtC,UAAU;GACV,UAAU;GACX,CAAC,GAAA,GAAA,EAAA,SACA,mBAAmB,EAAE,EAAE,EAAA,GAAA,EAAA,SAErB,SACA,EAAE,EACF,EAAO,KAAK,KAAK,GAAG,OAClB,GAAA,EAAA,SACE,MACA,EACE,WAAW,EAAE,aAAW,EAAY,KAAK,GAC1C,EACD;kBACI,MAAM;IAAE,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE;IAAS,OAAO,EAAE;IAAO,EAAE,EAAA,GAAA,EAAA,SACrE,QAAQ,EAAE,KAAM,CACnB,CAAC;kBACA,gBAAgB,EAAE,OAAO,mBAAmB,EAAE,EAAE,CAAC;kBACjD,kBAAkB,EAAE,CAAC;GACxB,CACF,CACD,CACH,CACF,CAAC,CACH;EAEJ;;AAGH,SAAS,GAAiB,GAAgC;CACxD,IAAM,IAAQ,EAAQ;AAWtB,QAVI,EAAM,4BAGD;EAAE,OAFK,EAAM,0BAA0B,GAAG;EAEjC,QADD,EAAM,0BAA0B,GAAG;EAC1B,GAEtB,EAAM,iBAGD;EAAE,OAFK,KAAK,MAAM,EAAM,eAAe,GAAG,aAAa,iBAAiB;EAE/D,QADD,KAAK,MAAM,EAAM,eAAe,GAAG,YAAY,iBAAiB;EACvD,GAEnB;;AAGT,SAAS,GAAa,GAAgC,GAAsB;AACrE,OAIL,MAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;EACrC,IAAM,IAAK,EAAM,IACX,IAAU,EAAS,QAAQ,EAAE;AACnC,MAAI,CAAC,KAAW,CAAC,EACf;EAGF,IAAM,IAAU,EAAG,cAAc,eAAe,EAC1C,IAAQ,EAAG,cAAc,aAAa;AAI5C,MAHI,MACF,EAAQ,cAAc,GAAY,EAAQ,OAAO,EAAQ,eAAe,GAEtE,EACF,KAAI,EAAQ,QACV,GAAM,cAAc;OACf;GACL,IAAM,IAAK,EAAQ;AACnB,KAAM,cAAc,GAAG,GAAY,EAAQ,SAAS,EAAG,CAAC,GAAG,GAAY,EAAQ,SAAS,EAAG,CAAC,GAAG,GAAY,EAAQ,KAAK,EAAG;;;;AAMnI,SAAS,GAAY,GAAsB,GAAiC;AAC1E,KAAI,KAAS,KACX,QAAO;AAET,KAAI,KAAkB,KACpB,QAAO,EAAM,QAAQ,EAAe;CAEtC,IAAM,IAAM,KAAK,IAAI,EAAM;AAa3B,QAZI,eACK,MAEL,IAAM,IACD,EAAM,QAAQ,EAAE,GAErB,IAAM,KACD,EAAM,QAAQ,EAAE,GAErB,IAAM,MACD,EAAM,QAAQ,EAAE,GAElB,EAAM,QAAQ,EAAE;;AAGzB,IAAM,KAAiB;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACD;AAED,SAAS,GAAc,GAAmB;AACxC,QAAO,GAAe,IAAI,GAAe;;;;ACvL3C,SAAgB,GAAQ,GAAmB,GAAwC;AACjF,SAAA,GAAA,EAAA,SAAS,IAAgB,GAAO,EAAS;;AAG3C,IAAa,WAAqD;CAChE,IAAI,GACA,GACA,GAEA,GACA,GACA,GAEA,GACA,IAAiB,GACjB,GACA;CAEJ,SAAS,IAAa;AACpB,SAAO,MAAe,KAAkB,MAAQ;;CAGlD,SAAS,EAAU,GAA4B;AAI7C,SAHI,EAAS,EAAM,GACV,GAAG,EAAM,MAEX;;CAGT,SAAS,EAAY,GAA8B;AACjD,SAAO,OAAO,KAAU,GAAG;;CAG7B,SAAS,EAAa,GAAmB;AAMvC,EALA,IAAM,OAAO,EAAM,OAAQ,WAAW,EAAM,MAAM,IAClD,IAAa,EAAM,KACnB,IAAY,EAAM,QAClB,IAAY,EAAY,EAAM,OAAO,EACrC,IAAW,EAAU,EAAM,MAAM,EACjC,IAAS,EAAM,OAAO;;CAGxB,eAAe,IAAY;AACzB,MAAI,CAAC,KAAW,CAAC,GAAY,CAC3B;AAIF,MAFA,IAAiB,GACjB,IAAU,GACN,CAAC,GAAW;AACd,KAAQ,MAAM;AACd;;AAEF;EACA,IAAM,IAAa;AAEnB,IAAQ,UAAU,IAAI,cAAc;EACpC,IAAM,IAAS,MAAM,EAAU,EAAW;AAC1C,MAAI,MAAe,GAAgB;AACjC,KAAO,OAAO;AACd;;AAIF,EADA,MAAM,EAAgB,GAAS,EAAO,EACtC,EAAQ,UAAU,OAAO,cAAc;;CAGzC,eAAe,EAAgB,GAAuB,GAAqB;EACzE,IAAM,IAAS,IAAI,gBAAgB,EAAO,OAAO,EAAO,OAAO;AAC/D,IAAO,WAAW,KAAK,CAAE,UAAU,GAAQ,GAAG,EAAE;EAChD,IAAM,IAAO,MAAM,EAAO,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9D,IAAO,OAAO;EAEd,IAAM,IAAO,IAAI,gBAAgB,EAAK;AAEtC,EADA,IAAI,gBAAgB,EAAI,IAAI,EAC5B,EAAI,MAAM;;CAGZ,SAAS,EAAc,GAAmB;EACxC,IAAM,EAAE,QAAK,WAAQ,WAAQ,UAAO,QAAK,GAAG,MAAS;AACrD,SAAO;;AAGT,QAAO;EACL,OAAO,EAAE,YAAS;AAChB,KAAa,EAAM;;EAErB,eAAe,EAAE,YAAS,GAAK;AAC7B,KAAa,EAAM;;EAErB,WAAW;AACT,MAAW;;EAEb,OAAO,EAAE,gBACP,GAAA,EAAA,SAAS,iBAAiB;GACxB;GACA,OAAO;IACL,OAAO;IACP,aAAa;IACb,WAAW;IACX,GAAI,EAAM,SAAS,EAAE;IACtB;GAED,gBAAgB;AACd,QAAU;;GAEZ,WAAW,EAAE,aAAU;AAErB,IADA,IAAU,GACV,GAAW;;GAEb,GAAG,EAAc,EAAM;GACxB,CAAC;EAEL;GCvHU,YACJ,EACL,OAAO,MAAS;CACd,IAAM,EAAE,UAAO,QAAK,YAAS,GAAG,MAAS,EAAK;AAC9C,QAAO,EAAA,GAAA,EAAA,SAEH,GAAG,KAAW,MAAM,cACpB,EACE,GAAG,GACJ,EACD,MAAU,KAAQ,QAAA,GAAA,EAAA,SAAS,wBAAwB,EAAE,EAAE,EAAM,EAC7D,EAAK,SACN,CACF;GAEJ;AAGH,SAAgB,EAAS,GAAoB,GAAyC;AACpF,SAAA,GAAA,EAAA,SAAS,IAAiB,GAAO,EAAS;;;;AC4B5C,SAAgB,GACd,GACA,GAC6B;AAC7B,SAAA,GAAA,EAAA,SAAS,IAA8B,GAAc,EAAS;;AAGhE,SAAgB,GACd,GACA,GAC4B;AAC5B,SAAA,GAAA,EAAA,SAAS,IAA6B,GAAc,EAAS;;AAG/D,IAAa,YACJ,EACL,OAAO,EAAE,OAAO,EAAE,UAAO,OAAO,GAAW,GAAG,UACrC,EACL;CACE,SAAS;CACT,OAAO,KAAS,EAAK;CACrB,OAAO;CACR,EACD,EAAA,GAAA,EAAA,SAAG,IAAsB,EAAK,CAAC,CAChC,EAEJ,GAGU,WAAiE;CAC5E,IAAI,GACA,GACA,GACA,GAEA,GACA,GACA,GACA,IAAY,IACZ,IAAU,IACV,IAAU,IACV,IAAQ,IACR;CAEJ,SAAS,EAAY,GAAiC;AAkBpD,GAjBI,CAAC,KAAa,EAAK,MAAM,aAAa,EAAM,cAC9C,IAAY,IAAI,KAAK,aAAa,SAAS;GACzC,uBAAuB,EAAK,MAAM,YAAY;GAC9C,uBAAuB,EAAK,MAAM,YAAY;GAC9C,aAAa;GACd,CAAC,GAGJ,IAAQ,EAAK,OACb,IAAM,EAAM,KACZ,IAAM,EAAM,KACZ,IAAO,EAAM,MACb,IAAQ,CAAC,CAAC,EAAM,OAChB,IAAQ,EAAwB,EAAM,EACtC,IAAW,CAAC,CAAC,EAAM,UACnB,IAAY,KAAO,QAAQ,KAAO,MAClC,IAAU,KAAQ,MAClB,IAAU,KAAa;;CAGzB,SAAS,EAAc,GAAuB,GAAW;AAKvD,EAJA,IAAQ,MAAM,EAAE,GAAG,OAAQ,EAAM,GAAG,GAAK,EAAI,EAC7C,EAAgB,GAAO,EAAM,GAClB,MAAM,UAAU,EAAM,UAAU,EAAM,YAC5C,EAAM,OAAO,EAAM,EACxB,EAAA,QAAE,QAAQ;;CAGZ,SAAS,IAAU;AACjB,MAAU;;CAGZ,SAAS,IAAS;AAChB,MAAU;;CAGZ,SAAS,EAAQ,GAAU;EACzB,IAAM,IAAK,EAAE;AACb,IAAc,SAAS,WAAW,EAAG,MAAM,CAAC;;CAG9C,SAAS,EAAS,GAAU;EAC1B,IAAM,IAAK,EAAE;AACb,IAAc,UAAU,WAAW,EAAG,MAAM,CAAC;;CAG/C,SAAS,EAAM,GAAW;AAKxB,SAJA,IAAI,EAAM,GAAG,GAAK,EAAI,EAClB,KAAQ,SACV,IAAI,KAAK,MAAM,IAAI,EAAK,GAAG,IAEtB,WAAW,EAAE,QAAQ,EAAE,CAAC;;CAGjC,SAAS,EAAY,GAAe;AAC9B,GAAC,KAAW,KAGhB,EAAK,SAAS,EAAE;;CAGlB,IAAI,GACA,GACA,IAAO,GAAS;EAClB,UAAU,MAAM;AAEd,GADA,IAAiB,GACjB,IAAe,GAAiB,GAAG,EAAK,OAAO,CAAC;;EAElD,SAAS,MAAM;AAEb,GADA,EAAE,gBAAgB,EAClB,EAAK,QAAQ,MAAM;GACnB,IAAM,IAAI,IAAe,GAAiB,GAAG,EAAK,OAAO,CAAC,aACtD,IAAI;AAMR,GALI,IACF,KAAK,KAAK,IAAM,KACP,MACT,KAAK,KAAK,MAAM,IAAI,IAAI,GAAG,IAE7B,EAAc,SAAS,EAAM,EAAE,CAAC;;EAElC,aAAa;AAEX,GADA,EAAc,UAAU,EAAM,EAC9B,EAAK,YAAY;;EAEpB,CAAC;CAEF,SAAS,EAAQ,GAAe;AAC9B,MAAI,CAAC,EACH;AAEF,IAAE,gBAAgB;EAClB,IAAM,KAAO,EAAE,UAAU,KAAM,KAAK,EAAM,EAAE,QAAQ,IAAI,EAAE,EACpD,KAAO,KAAQ,MAAO;AAC5B,EAAI,KACF,EAAc,UAAU,GAAO,KAAS,KAAK,EAAI,CAAC;;AAItD,QAAO;EACL,gBAAgB;AACd,KAAK,YAAY;;EAEnB,QAAQ;EACR,gBAAgB;EAChB,OAAO,MAAS;AACd,KAAY,EAAK;GACjB,IAAM,IAAS,KAAa,IAAQ,MAAQ,IAAM,KAAO;AACzD,WAAA,GAAA,EAAA,SACE,kCACA;IACE,OAAO,IAAY,uBAAuB,MAAW;IACrD,OAAO,EACL;KACE,sBAAsB;KACtB,uBAAuB,CAAC,MAAa,KAAa;KAClD,oBAAoB;KACrB,EACD,EAAK,MAAM,MACZ;IACF,EACD;IACE,EAAK,MAAM,cAAA,GAAA,EAAA,SAAe,QAAQ,EAAE,EAAE,EAAK,MAAM,WAAW,GAAG;mBAC7D,SAAS;KACT,MAAM,IAAU,WAAW;KACtB;KACA;KACC;KACN,OAAO,IAAU,IAAQ,EAAW,OAAO,EAAM;KACxC;KACD;KACC;KACC;KACD;KACT,aAAa;KACb,cAAc;KACD;KACb,UAAU;KACX,CAAC;IACF,EAAK,MAAM,QAAA,GAAA,EAAA,SAAS,wBAAwB,EAAE,EAAE,EAAK,MAAM,KAAK,GAAG;IACnE,EAAK,MAAM,aAAA,GAAA,EAAA,SAAc,QAAQ,EAAE,EAAE,EAAK,MAAM,UAAU,GAAG;IAC9D,CACF;;EAEJ;;;;ACvNH,SAAgB,GACd,GACA,GAC4B;AAC5B,SAAA,GAAA,EAAA,SAAS,IAA6B,GAAc,EAAS;;AAG/D,SAAgB,GACd,GACA,GAC2B;AAC3B,SAAA,GAAA,EAAA,SAAS,IAA4B,GAAc,EAAS;;AAG9D,IAAa,YACJ,EACL,OAAO,EAAE,OAAO,EAAE,UAAO,OAAO,GAAW,GAAG,UACrC,EACL;CACE,SAAS;CACT,OAAO,KAAS,EAAK;CACrB,OAAO;CACR,EACD,EAAA,GAAA,EAAA,SAAG,IAAqB,EAAK,CAAC,CAC/B,EAEJ,GAGG,IAAa,MAAM,KAAK,IACxB,IAAa,KAAK,KAAK,KAEhB,KAAkD;CAC7D,YAAY,MAAkB,IAAQ;CACtC,cAAc,MAAkB,IAAQ;CACzC,EAEY,KAAkD;CAC7D,YAAY,MAAkB,IAAQ;CACtC,cAAc,MAAkB,IAAQ;CACzC,EAEY,WAA+D;CAC1E,IAAI,IAAQ,GACR,IAAW,IACX,IAAM,CAAC,GAAG,EAAE,EACZ,GACA,GACA,GACA,GACA;CAEJ,SAAS,EAAkB,GAAe;AA0BxC,SAzBI,KAAO,QAAQ,KAAO,OACpB,KAAO,IACL,IAAQ,IACV,IAAQ,IACC,IAAQ,MACjB,IAAQ,KAEC,KAAS,KAAO,KAAS,MAGpC,IAFa,KAAK,IAAI,IAAQ,EAAI,GACrB,KAAK,IAAI,IAAQ,EAAI,GACZ,IAAM,KAErB,KAAO,OAIP,KAAO,QACZ,IAAQ,MACV,IAAQ,KALN,IAAQ,MACV,IAAQ,IAQR,KAAQ,SACV,IAAQ,KAAK,MAAM,IAAQ,EAAK,GAAG,IAE9B;;CAGT,SAAS,EAAY,GAAe;AAKlC,SAJA,KAAgB,KACZ,IAAQ,MACV,KAAS,MAEJ;;CAGT,SAAS,EAAY,GAA8B;AAajD,EAZA,IAAQ,EAAK,OAEb,IAAM,EAAM,KACZ,IAAM,EAAM,KACZ,IAAO,EAAM,MACb,IAAM,KAAO,OAAuC,OAAhC,EAAY,EAAI,GAAG,GACvC,IAAM,KAAO,OAAuC,OAAhC,EAAY,EAAI,GAAG,GACvC,IAAO,KAAQ,OAAwC,OAAjC,EAAY,EAAK,GAAG,GAC1C,IAAQ,EAAgB,EAAM,IAAI,GAC9B,EAAM,WACR,KAAgB,IAElB,GAAiB;;CAGnB,SAAS,EAAQ,GAA0B;AACzC,KAAiB;EACjB,IAAM,IAAQ,EAAM,SAAS,IAAQ,IAAa;AAElD,EADA,EAAgB,GAAO,EAAM,EAC7B,EAAK,MAAS,UAAU,EAAM,UAAU,EAAM,UAAU,EAAM,OAAO,EAAM;;CAG7E,SAAS,IAAkB;AAEzB,EADA,EAAI,KAAK,KAAK,IAAI,EAAM,EACxB,EAAI,KAAK,KAAK,IAAI,EAAM;;CAQ1B,IAAI,GACE,IAAO,GAAS;EACpB,UAAU,MAAM;GACd,IAAM,IAAQ,GAAiB,EAAE;AACjC,OAAc,CAAC,EAAE,EAAM,IAAI,EAAM,QAAQ,IAAI,EAAE,EAAM,IAAI,EAAM,SAAS,GAAG;;EAE7E,SAAS,MAAM;AACb,KAAE,gBAAgB;GAClB,IAAM,IAAW,GAAiB,GAAG,GAAa,EAAY,EACxD,IAAK,EAAS,cAAc,IAC5B,IAAK,EAAS,cAAc;AAWlC,GAVI,MACF,IAAQ,KAAK,MAAM,GAAI,CAAC,EAAG,EAGvB,IAAQ,MACV,KAAS,IAAI,KAAK,MAGtB,IAAQ,EAAkB,EAAM,EAChC,EAAQ,QAAQ,EAChB,EAAA,QAAE,QAAQ;;EAEZ,aAAa;AAIX,GAHA,EAAK,YAAY,EACjB,IAAW,IACX,EAAQ,SAAS,EACjB,EAAA,QAAE,QAAQ;;EAEb,CAAC;CAEF,SAAS,EAAU,GAAe;AAIhC,SAHI,IAAQ,MACV,KAAS,MAEJ,IAAQ;;AAGjB,QAAO;EACL,gBAAgB;AACd,KAAK,YAAY;;EAEnB,SAAS,MAAS;AAChB,KAAY,EAAK;;EAEnB,WAAW,MAAS;AAClB,KAAY,EAAK;;EAEnB,OAAO,EAAE,OAAO,EAAE,GAAG,WACnB,GAAA,EAAA,SACE,uBACA,EACE,OAAO,EACL,iBAAiB,GAAG,EAAU,IAAQ,EAAW,IAClD,EACF,EACD,CACE,GAAc;GACZ,MAAM,EAAM,SAAS,MAAM;GAC3B,OAAO;GACP,GAAG;GACH,YAAA,GAAA,EAAA,SAAa,qBAAqB;mBAC9B,sBAAsB,IAAI;KAC3B,EAAM,SAAS,IAAQ,IAAQ,GAAY,QAAQ,EAAE;mBACpD,sBAAsB,EAAM,SAAS,QAAQ,IAAI;IACpD,CAAC;GACH,CAAC,GAAA,GAAA,EAAA,SAEA,sBAAsB;GACtB,WAAW,MAAW,IAAc,EAAM;GAG1C,OAAO,EAAQ,EACb,eAAe,GAChB,CAAC;GACF,OAAO;IACL,aAAa;IACb,SAAS;IACT,eAAe;IACf,mBAAmB;IACnB,UAAU;IACX;GACF,CAAC,CACH,CACF;EAEJ;;;;ACzMH,SAAgB,GACd,GACA,GAC8B;AAC9B,SAAA,GAAA,EAAA,SAAS,IAA4B,GAAc,EAAS;;AAG9D,SAAgB,GACd,GACA,GAC6B;AAC7B,SAAA,GAAA,EAAA,SAAS,IAA2B,GAAc,EAAS;;AAG7D,IAAa,YACJ,EACL,OAAO,EAAE,OAAO,EAAE,UAAO,OAAO,GAAW,GAAG,UACrC,EACL;CACE,SAAS;CACT,OAAO,KAAS,EAAK;CACrB,OAAO;CACR,EACD,EAAA,GAAA,EAAA,SAAG,IAAoB,EAAK,CAAC,CAC9B,EAEJ,GAGU,WAAgE;CAC3E,IAAI;CAEJ,SAAS,EAAS,GAAU;EAC1B,IAAM,IAAS,EAAE,OAA4B;AAG7C,EAFA,EAAgB,GAAO,EAAM,EAC7B,EAAM,UAAU,EAAM,OAAO,EAAM,EACnC,EAAM,WAAW,EAAM,OAAO,EAAM;;AAGtC,QAAO,EACL,OAAO,MAAS;AACd,MAAQ,EAAK;EACb,IAAM,IAAU,EAAgB,EAAM,KAAK,IACrC,IAAW,EAAM,UAAU;AACjC,UAAA,GAAA,EAAA,SACE,sBACA,EACE,OAAO,EAAQ;GACb,mBAAmB,CAAC;GACpB,iBAAiB,CAAC,CAAC;GACnB,iBAAiB;GACjB,kBAAkB,CAAC;GACpB,CAAC,EACH,EACD;GACE,EAAM;GACN,EAAM,WACF,IACE,EAAM,aAAA,GAAA,EAAA,SAAc,QAAQ,OAAO,GACnC,EAAM,cAAA,GAAA,EAAA,SAAe,QAAQ,QAAQ,IAAA,GAAA,EAAA,SACrC,SAAS;IACT,OAAO,EAAQ;KACb,cAAc,CAAC,CAAC,EAAM;KACtB,aAAa,CAAC,EAAM;KACrB,CAAC;IACF,MAAM;IACG;IACC;IACX,CAAC;GAEN,EAAM;GACN,EAAK;GACN,CACF;IAEJ;;;;AC5HH,SAAgB,GAAQ,GAAe;CACrC,IAAI,IAAI,EAAI,IAAI,KACZ,IAAI,EAAM,EAAI,GAAG,GAAG,EAAE,EACtB,IAAI,EAAM,EAAI,GAAG,GAAG,EAAE,EAEtB,IAAI,IAAI,GACR,IAAI,KAAK,IAAI,KAAK,IAAM,IAAI,KAAM,IAAK,EAAE,GACzC,IAAI,IAAI,GAEN,IAAW;EAAE,GAAG;EAAG,GAAG;EAAG,GAAG;EAAG;AA+BrC,QA9BI,IAAI,MACN,EAAI,IAAI,GACR,EAAI,IAAI,GACR,EAAI,IAAI,KACC,IAAI,OACb,EAAI,IAAI,GACR,EAAI,IAAI,GACR,EAAI,IAAI,KACC,IAAI,OACb,EAAI,IAAI,GACR,EAAI,IAAI,GACR,EAAI,IAAI,KACC,IAAI,OACb,EAAI,IAAI,GACR,EAAI,IAAI,GACR,EAAI,IAAI,KACC,IAAI,OACb,EAAI,IAAI,GACR,EAAI,IAAI,GACR,EAAI,IAAI,MAER,EAAI,IAAI,GACR,EAAI,IAAI,GACR,EAAI,IAAI,IAGV,EAAI,KAAK,GACT,EAAI,KAAK,GACT,EAAI,KAAK,GAEF;;AAWT,SAAgB,GAAQ,GAAe;CACrC,IAAI,IAAI,EAAI,GACR,IAAI,EAAI,GACR,IAAI,EAAI,GAER,IAAI,KAAK,IAAI,GAAG,GAAG,EAAE,EACrB,IAAI,IAAI,KAAK,IAAI,GAAG,GAAG,EAAE,EAEzB,IAAI,GACJ,IAAI;AAeR,QAdI,MAAM,MACR,IAAI,IAAI,GACJ,MAAM,KACR,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,IAC/B,IAAK,IAAI,IAAK,MACL,MAAM,KACf,KAAK,IAAI,KAAK,IAAI,GAClB,KAAQ,OAER,KAAK,IAAI,KAAK,IAAI,GAClB,KAAQ,MAIL;EAAE,GAAG;EAAG,GAAG;EAAG,GAAG;EAAG;;;;ACnF7B,IAAa,KAAb,MAAiE;CAC/D,YACE,GACA,GACA;AADQ,EADA,KAAA,aAAA,GACA,KAAA,aAAA;;CAIV,UAAiB,GAAa;AAC5B,QAAS,EAAE;EACX,IAAM,IAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG;AAI/C,SAHA,KAAK,WAAW,SAAS,GAAK,MAAM;AAClC,KAAO,MAAQ,EAAE,MAAM,MAAM,KAAK,aAAa,IAAI;IACnD,EACK;;CAGT,YAAmB,GAAY;AAC7B,SAAO,KAAK,WAAW,KACpB,OAAS,KAAK,aAAa,EAAK,KAAO,KAAK,MAAM,EAAK,KAAO,IAAI,KAAK,EACzE;;GCnBQ,KAAb,MAA6D;CAC3D,aAA+B;EAAC;EAAK;EAAK;EAAK;EAAI;CAEnD,YAAmB,GAAsB;AACvC,OAAK,aAAa;;CAGpB,UAAiB,GAAe;AAC9B,QAAiB;EACjB,IAAM,IAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG,EACzC,IAAS,EACZ,QAAQ,gBAAgB,GAAG,CAC3B,MAAM,UAAU,CAChB,IAAI,OAAO;AAId,SAHA,KAAK,WAAW,SAAS,GAAK,MAAM;AAClC,KAAO,MAAQ,EAAO,MAAM,MAAM,MAAQ,MAAM,IAAI;IACpD,EACK;;CAGT,YAAmB,GAAY;AAC7B,SACE,KAAK,WAAW,KAAK,GAAG,GACxB,MACA,KAAK,WACF,KAAK,MACG,MAAQ,MAAM,EAAK,KAAO,KAAK,MAAM,EAAK,KAAO,IAAI,CAC5D,CACD,KAAK,KAAK,GACb;;GC5BO,KAAb,MAA6D;CAC3D,YACE,GACA,IAAiB,KACjB;AADQ,EADA,KAAA,aAAA,GACA,KAAA,SAAA;;CAEV,UAAiB,GAAgB;AAC/B,QAAiB;EACjB,IAAM,IAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG,EAC3C,IAAI,EAAM,MAAM,aAAa,GAAG;AAapC,SAZI,KAAK,OACA,KAEL,EAAE,WAAW,KAAK,WAAW,WAC/B,IAAI,EACD,MAAM,GAAG,CACT,KAAK,MAAO,GAAG,IAAK,IAAK,CACzB,KAAK,GAAG,GAEb,KAAK,WAAW,SAAS,GAAK,MAAM;AAClC,KAAO,KAAO,SAAS,EAAE,OAAO,IAAI,GAAG,EAAE,EAAE,GAAG,GAAG;IACjD,EACK;;CAGT,YAAmB,GAAY;AAC7B,SACE,KAAK,SACL,KAAK,WACF,KAAK,MAAQ,GAAQ,KAAK,MAAM,EAAK,KAAO,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,CACvE,KAAK,GAAG;;GC7BJ,KAAb,MAAgE;CAC9D;CACA,YAAY,GAA8B;AACxC,EADkB,KAAA,aAAA,GAClB,KAAK,gBAAgB,EAAW,OAAO,CAAC,SAAS;;CAEnD,UAAiB,GAAW;AAC1B,QAAS;EACT,IAAM,IAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG;AAI/C,SAHA,KAAK,WAAW,SAAS,GAAK,MAAM;AAClC,KAAO,MAAS,KAAM,IAAI,IAAM,OAAO;IACvC,EACK;;CAGT,YAAmB,GAAY;EAC7B,IAAM,IAAM,KAAK,cACd,KAAK,MAAQ,GAAQ,KAAK,MAAM,EAAK,KAAO,OAAO,EAAE,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,CAC5E,KAAK,GAAG;AACX,SAAO,SAAS,OAAO,GAAK,GAAG;;GCnB7B,KAAa;CAAC;CAAK;CAAK;CAAK;CAAI,EAC1B,KAAb,MAAiF;CAC/E,YACE,GACA,GACA;AADQ,EADA,KAAA,aAAA,GACA,KAAA,aAAA;;CAIV,UAAiB,GAA8B;AAC7C,QAAS,EAAE;EACX,IAAM,IAAe;GAAE,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG,GAAG;GAAG;AAI/C,SAHA,KAAK,WAAW,SAAS,GAAK,MAAM;AAClC,KAAO,GAAW,OAAO,EAAE,MAAQ,MAAM,KAAK,aAAa,IAAI;IAC/D,EACK;;CAGT,YAAmB,GAAY;EAC7B,IAAM,IAAoC,EAAE;AAI5C,SAHA,KAAK,WAAW,SAAS,GAAK,MAAM;AAClC,KAAO,MAAQ,KAAK,aAAa,EAAK,GAAW,MAAM,KAAK,MAAM,EAAK,KAAO,IAAI,KAAK;IACvF,EACK;;GCjBL,IAA+C,EAAE;AAQvD,SAAgB,EAAgB,IAAiB,SAA4B;AAC3E,KAAI,KAAU,EACZ,QAAO,EAAO;CAGhB;EAIE,IAAM,IAAQ,EAAO,MAAM,wBAAwB;AACnD,MAAI,GAAO;GACT,IAAM,IAAe,CAAC,CAAC,EAAM;AAG7B,UADA,EAAO,KAAU,IAAI,IADD,EAAM,MAAM,QAAQ,aAAa,CAAC,MAAM,GAAG,EACZ,EAAa,EACzD,EAAO;;;CAIlB;EAIE,IAAM,IAAQ,EAAO,MAAM,4BAA4B;AACvD,MAAI,GAAO;GACT,IAAM,IAAe,CAAC,CAAC,EAAM;AAG7B,UADA,EAAO,KAAU,IAAI,IADD,EAAM,MAAM,QAAQ,MAAM,GAAG,EACC,EAAa,EACxD,EAAO;;;CAIlB;EAIE,IAAM,IAAQ,EAAO,MAAM,kBAAkB;AAC7C,MAAI,EAGF,QADA,EAAO,KAAU,IAAI,IADD,EAAM,MAAM,QAAQ,aAAa,CAAC,MAAM,GAAG,CACZ,EAC5C,EAAO;;CAIlB;EAIE,IAAM,IAAQ,EAAO,MAAM,gBAAgB;AAC3C,MAAI,EAGF,QADA,EAAO,KAAU,IAAI,IADD,EAAM,MAAM,QAAQ,aAAa,CAAC,MAAM,GAAG,EACd,IAAI,EAC9C,EAAO;;CAIlB;EAIE,IAAM,IAAQ,EAAO,MAAM,mBAAmB;AAC9C,MAAI,EAGF,QADA,EAAO,KAAU,IAAI,IADD,EAAM,MAAM,QAAQ,aAAa,CAAC,MAAM,GAAG,CACf,EACzC,EAAO;;AAalB,QAPgB,EAAO,MAAM,YAAY,KAGrC,EAAO,KAAU,IAAI,GADF,EAAO,MAAM,GAAG,EACc,GAAG,GAIjD,EAAO;;;;AC/ChB,SAAgB,GACd,GACA,GACkC;AAClC,SAAA,GAAA,EAAA,SAAS,IAAmC,GAAc,EAAS;;AAGrE,SAAgB,GACd,GACA,GAC4B;AAC5B,SAAA,GAAA,EAAA,SAAS,IAAoB,GAAc,EAAS;;AAGtD,IAAa,YACJ,EACL,OAAO,EAAE,OAAO,EAAE,UAAO,OAAO,GAAW,GAAG,UACrC,EACL;CACE,SAAS;CACT,OAAO,KAAS,EAAK;CACrB,OAAO;CACR,EACD,EAAA,GAAA,EAAA,SAAG,IAAa,EAAK,CAAC,CACvB,EAEJ,GAGU,WAAwD;CACnE,IAAI,IAAM,GACN,IAAM,GACN,IAAM,GACN,IAAI,GACJ;CAEJ,SAAS,EAAQ,IAAI,GAAK,IAAI,GAAW;AACvC,SAAO;GACL,GAAG,IAAM;GACN;GACA;GACA;GACJ;;CAGH,SAAS,EAAO,IAAI,GAAK,IAAI,GAAK;AAChC,SAAO,GAAQ,EAAQ,GAAG,EAAE,CAAC;;CAG/B,SAAS,EAAQ,IAAI,GAAK,IAAI,GAAK,IAAQ,GAAS;AAClD,SAAO;GAAE,GAAG,EAAO,GAAG,EAAE;GAAK;GAAO;;CAGtC,SAAS,EAAO,GAAU;AAGxB,EAFA,IAAM,EAAI,IAAI,KACd,IAAM,EAAI,GACV,IAAM,EAAI;;CAGZ,SAAS,EAAQ,GAAW;AAE1B,EADA,EAAO,EAAI,EACX,IAAI,EAAI;;CAGV,SAAS,EAAU,GAAY,GAAY;AACzC,SAAO,EAAgB,OAAO,CAAC,YAAY,EAAQ,GAAG,EAAE,CAAC;;CAG3D,SAAS,EAAW,GAAY,GAAY;AAC1C,SAAO,EAAgB,QAAQ,CAAC,YAAY,EAAQ,GAAG,EAAE,CAAC;;CAG5D,SAAS,EAAW,IAAI,GAAK,IAAI,GAAK,IAAgB,GAAG;AACvD,SAAO,EAAgB,SAAS,CAAC,YAAY,EAAQ,GAAG,GAAG,EAAM,CAAC;;CAGpE,SAAS,EAAW,GAAmC,GAA4B;EACjF,IAAM,IAAO,EAAgB,KAAU,MAAM,CAAC,UAAU,EAAM;AAC9D,IAAQ;GACN,GAAG,GAAQ,EAAK;GAChB,GAAG,EAAK;GACT,CAAC;;CAGJ,SAAS,EAAa,GAA4B;AAChD,SAAO,EAAgB,EAAO,CAAC,YAAY,GAAS,CAAC;;CAGvD,SAAS,IAAe;EACtB,IAAM,IAAQ,EAAa,EAAM,OAAO,EAClC,IAAU,EAAgB,GAAO,EAAM;AAC7C,IAAK,EAAM,SAAS,EAAM,OAAO,EAAQ;;CAG3C,SAAS,IAAgB;EACvB,IAAM,IAAQ,EAAa,EAAM,OAAO,EAClC,IAAU,EAAgB,GAAO,EAAM;AAC7C,IAAK,EAAM,UAAU,EAAM,OAAO,EAAQ;;CAG5C,SAAS,IAAW;AAClB,SAAO,EAAM,QAAQ,MAAM,KAAK;;CAOlC,SAAS,EAAO,GAAU;AACxB,IAAM,GAAG,IAAI;;CAGf,SAAS,EAAO,GAAU;AACxB,IAAM,GAAG,IAAI;;CAGf,SAAS,EAAO,GAAU;AACxB,IAAM,GAAG,IAAI;;CAGf,SAAS,EAAM,GAAU,GAAmB;EAC1C,IAAM,IAAQ,GAAS;AAIvB,EAHA,EAAM,KAAS,SAAU,EAAE,OAA4B,OAAO,GAAG,GAAG,KACpE,EAAO,GAAQ,EAAM,CAAC,EACtB,GAAc,EACd,GAAe;;CAGjB,SAAS,EAAS,GAAU;AAG1B,EAFA,EAAY,EAAE,OAA4B,OAAO,GAAU,GAAG,SAAS,MAAM,EAC7E,GAAc,EACd,GAAe;;CAOjB,IAAI,IAA6B,MAC7B;CACJ,SAAS,EAAY,GAAe;AAGlC,EAFA,IAAO,MACP,EAAW,EAAE,OAAsB,EACnC,EAAY,EAAE;;CAGhB,SAAS,EAAW,GAAe;AAGjC,EAFA,IAAO,KACP,EAAW,EAAE,OAAsB,EACnC,EAAY,EAAE;;CAGhB,SAAS,EAAW,GAAe;AAGjC,EAFA,IAAO,KACP,EAAW,EAAE,OAAsB,EACnC,EAAY,EAAE;;CAGhB,SAAS,EAAW,GAAiB;AAEnC,EADA,GAAa,EACb,IAAS;EACT,IAAM,IAAU,EAAE,SAAS,IAAO;AAKlC,EAJA,SAAS,iBAAiB,aAAa,GAAa,EAAQ,EAC5D,SAAS,iBAAiB,WAAW,GAAW,EAAQ,EACxD,SAAS,iBAAiB,aAAa,GAAa,EAAQ,EAC5D,SAAS,iBAAiB,YAAY,GAAW,EAAQ,EACzD,SAAS,iBAAiB,eAAe,GAAW,EAAQ;;CAG9D,SAAS,IAAc;AAKrB,EAJA,SAAS,oBAAoB,aAAa,EAAY,EACtD,SAAS,oBAAoB,WAAW,EAAU,EAClD,SAAS,oBAAoB,aAAa,EAAY,EACtD,SAAS,oBAAoB,YAAY,EAAU,EACnD,SAAS,oBAAoB,eAAe,EAAU;;CAGxD,SAAS,EAAY,GAA4B;AAC/C,MAAI,CAAC,EACH;AAEF,IAAE,gBAAgB;EAElB,IAAM,IAAO,EAAO,uBAAuB,EACrC,IAAK,OAAO,eAAe,SAAS,gBAAgB,YACpD,IAAK,OAAO,eAAe,SAAS,gBAAgB,WACpD,IAAK,EAAO,aACZ,IAAK,EAAO,cACd,CAAC,GAAI,KAAM,EAAc,EAAE;AAgB/B,EAfA,IAAK,GAAO,IAAK,IAAK,EAAK,QAAQ,GAAI,GAAG,EAAE,EAC5C,IAAK,GAAO,IAAK,IAAK,EAAK,OAAO,GAAI,GAAG,EAAE,EAEvC,MAAS,SACX,IAAM,GACN,IAAM,IAAI,IAER,MAAS,QACX,IAAM,IAAI,IAER,MAAS,QACX,IAAI,IAGN,GAAc,EACd,EAAA,QAAE,QAAQ;;CAGZ,SAAS,IAAY;AACnB,EAAI,KAAU,SACZ,IAAS,MACT,GAAa,EACb,GAAe;;AAInB,QAAO;EACL,gBAAgB;AACd,MAAa;;EAEf,SAAS,MAAS;AAEhB,GADA,IAAQ,EAAK,OACb,EAAW,EAAgB,EAAM,EAAE,EAAM,OAAO;;EAElD,WAAW,MAAS;AAElB,GADA,IAAQ,EAAK,OACb,EAAW,EAAgB,EAAM,EAAE,EAAM,OAAO;;EAElD,OAAO,MAAS;AAEd,GADA,IAAQ,EAAK,OACb,EAAW,EAAgB,EAAM,EAAE,EAAM,OAAO;GAChD,IAAM,IAAO,GAAS;AACtB,WAAA,GAAA,EAAA,SAAS,wBAAwB,EAAE,EAAE,EAAA,GAAA,EAAA,SAEjC,yBAAA,GAAA,EAAA,SACE,0CAA0C;IAC1C,OAAO,GAAU,GAAG,GAAY,GAAG,GAAW;IAC9C,UAAU;IACX,CAAC,GAAA,GAAA,EAAA,SACA,0CAA0C;IAC1C,KAAK;IACL,KAAK;IACL,MAAM;IACN,OAAO,KAAK,MAAM,EAAK,IAAI,IAAI;IAC/B,UAAU;IACX,CAAC,GAAA,GAAA,EAAA,SACA,0CAA0C;IAC1C,KAAK;IACL,KAAK;IACL,MAAM;IACN,OAAO,KAAK,MAAM,EAAK,IAAI,IAAI;IAC/B,UAAU;IACX,CAAC,GAAA,GAAA,EAAA,SACA,0CAA0C;IAC1C,KAAK;IACL,KAAK;IACL,MAAM;IACN,OAAO,KAAK,MAAM,EAAK,IAAI,IAAI;IAC/B,UAAU;IACX,CAAC,CACH,GAAA,GAAA,EAAA,SAEC,wBAAA,GAAA,EAAA,SAEE,oBACA;IACE,UAAU;IACV,aAAa;IACb,cAAc;IACd,OAAO;KACL,oBAAoB,GAAG,EAAW,GAAG,GAAG,EAAE;KAC1C,eAAe;KAChB;IACF,GAAA,GAAA,EAAA,SACC,uBAAuB,EACvB,OAAO;IACL,YAAY;IACZ,eAAe;IACf,kBAAkB;IACnB,EACF,CAAC,GAAA,GAAA,EAAA,SACA,uBAAuB,EACvB,OAAO;IACL,YAAY;IACZ,eAAe;IACf,kBAAkB;IACnB,EACF,CAAC,GAAA,GAAA,EAAA,SACA,2BAA2B,EAC3B,OAAO;IACL,eAAe;IACf,kBAAkB;IAClB,oBAAoB,GAAG,EAAW,GAAK,GAAK,EAAE;IAC9C,MAAM,GAAG,IAAM,IAAI;IACnB,KAAK,IAAI,IAAI,KAAO,IAAI;IACzB,EACF,CAAC,CACH,GAAA,GAAA,EAAA,SAEC,mBACA;IACE,UAAU;IACV,aAAa;IACb,cAAc;IACd,OAAO;KACL,eAAe;KACf,YACE;KACH;IACF,GAAA,GAAA,EAAA,SACC,0BAA0B,EAC1B,OAAO;IACL,eAAe;IACf,kBAAkB;IAClB,oBAAoB,GAAG,EAAW,GAAG,GAAG,EAAE;IAC1C,UAAU;IACV,MAAM,IAAI,IAAI,KAAO,IAAI;IAC1B,EACF,CAAC,CACH,EACA,GAAU,IACP,GAAA,EAAA,SAEE,mBACA;IACE,UAAU;IACV,aAAa;IACb,cAAc;IACd,OAAO,EACL,eAAe,QAChB;IACF,GAAA,GAAA,EAAA,SACC,sBAAsB,EACtB,OAAO,EACL,YAAY,6BAA6B,EACvC,GACA,GACA,EACD,CAAC,IAAI,EAAW,GAAK,GAAK,EAAE,CAAC,IAC/B,EACF,CAAC,GAAA,GAAA,EAAA,SACA,0BAA0B,EAC1B,OAAO;IACL,eAAe;IACf,kBAAkB;IAClB,UAAU;IACV,MAAM,GAAG,IAAI,IAAI;IAClB,EACF,CAAC,CACH,GA5BD,KA6BL,CACF,CAAC;;EAEL;;;;AClWH,SAAgB,GACd,GACA,GAC4B;AAC5B,SAAA,GAAA,EAAA,SAAS,IAA6B,GAAc,EAAS;;AAG/D,SAAgB,GAAW,GAAsB,GAA2C;AAC1F,SAAA,GAAA,EAAA,SAAS,IAAuB,GAAc,EAAS;;AAGzD,IAAa,YACJ,EACL,OAAO,EAAE,OAAO,EAAE,UAAO,OAAO,GAAW,GAAG,UACrC,EACL;CACE,SAAS;CACT,OAAO,KAAS,EAAK;CACrB,OAAO;CACR,EACD,EAAA,GAAA,EAAA,SAAG,IAAgB,EAAK,CAAC,CAC1B,EAEJ,GAGU,WAAqD;CAChE,IAAI,GACA,IAAS,IACT,GACA,GACE,IAAQ,EAAgB,SAAS;CAEvC,SAAS,EAAY,GAAyB;AAG5C,EAFA,IAAQ,EAAK,OACb,IAAQ,EAAgB,EAAM,EAC9B,IAAO,EAAM,YAAY,EAAgB,EAAM,OAAO,CAAC,UAAU,EAAM,CAAC;;CAG1E,SAAS,IAAS;AAChB,MAAS,CAAC;;CAGZ,SAAS,EAAc,GAAqB,GAAQ;AAElD,EADA,EAAgB,GAAO,EAAE,EACzB,EAAM,UAAU,EAAM,OAAO,EAAE;;CAGjC,SAAS,EAAe,GAAqB,GAAQ;AAEnD,EADA,EAAgB,GAAO,EAAE,EACzB,EAAM,WAAW,EAAM,OAAO,EAAE;;CAGlC,SAAS,IAAU;AAqBjB,SApBI,EAAS,EAAM,GACV,IAEL,EAAS,EAAM,GACV,OAAO,GAAQ,EAAM,SAAS,GAAG,EAAE,GAAG,IAAI,GAE/C,GAAQ,EAAM,GACT,EAAM,KAAK,MAAgB,IAAK,KAAK,IAAK,IAAI,EAAG,QAAQ,EAAE,GAAG,EAAI,CAAC,KAAK,MAAM,GAEnF,EAAS,EAAM,GACV,OAAO,KAAK,EAAM,CACtB,KAAK,MAAM;GACV,IAAM,IAAM,EAAc;AAC1B,UAAO,GAAG,EAAE,IAAI,IAAK,KAAK,IAAK,IAAI,EAAG,QAAQ,EAAE,GAAG;IACnD,CACD,KAAK,IAAI,GAEV,KAAS,OACJ,SAEF;;AAGT,QAAO;EACL,QAAQ;EACR,gBAAgB;EAChB,OAAO,EAAE,OAAO,EAAE,UAAO,UAAO,YAAS,kBAChC,EAAA,GAAA,EAAA,SAEH,uBACA,EACE,OAAO,EAAE,qBAAqB,GAAM,EACrC,GAAA,GAAA,EAAA,SAEC,iCACA,EACE,SAAS,GACV,EACD,GAAS,IAAI,IACd,EACD,IACI,EAAA,QAAE,SAAS,EAAE,EAAE,CACb,GAAc;GACH;GACF;GACA;GACC;GACR,SAAS;GACT,UAAU;GACX,CAAC,CACH,CAAC,GACF,KACL,CACF;EAEJ;;;;ACvGH,SAAgB,GACd,GACA,GAC4B;AAC5B,SAAA,GAAA,EAAA,SAAS,IAA6B,GAAc,EAAS;;AAG/D,SAAgB,GACd,GACA,GAC4B;AAC5B,SAAA,GAAA,EAAA,SAAS,IAA6B,GAAc,EAAS;;AAG/D,IAAa,YACJ,EACL,OAAO,EAAE,OAAO,EAAE,UAAO,OAAO,GAAW,GAAG,UACrC,EACL;CACE,SAAS;CACT,OAAO,KAAS,EAAK;CACrB,OAAO;CACR,GAAA,GAAA,EAAA,SACC,IAAgB,EAAK,CACxB,EAEJ,GAGU,WAA2D;CACtE,IAAI;CACJ,SAAS,EAAS,GAAU;EAE1B,IAAM,IADK,EAAE,OACI;AAGjB,EAFA,EAAgB,GAAO,EAAM,GAClB,EAAE,SAAS,UAAU,EAAM,UAAU,EAAM,YACjD,EAAM,OAAO,EAAM;;AAG1B,QAAO,EACL,OAAO,OACL,IAAQ,EAAK,QACb,GAAA,EAAA,SAAS,iBAAiB,EAAE,EAAE;EAC5B,EAAK,MAAM,cAAA,GAAA,EAAA,SAAe,QAAQ,EAAE,EAAE,EAAK,MAAM,WAAW,GAAG;iBAC7D,SAAS;GACT,MAAM,EAAM,QAAQ;GACpB,OAAO,EAAgB,EAAM;GAC7B,SAAS;GACC;GACV,aAAa,EAAM;GACnB,UAAU,EAAM;GACjB,CAAC;EACF,EAAK,MAAM,aAAA,GAAA,EAAA,SAAc,QAAQ,EAAE,EAAE,EAAK,MAAM,UAAU,GAAG;EAC9D,CAAC,GAEL;;;;AC9CH,SAAgB,GACd,GACA,GAC6B;AAC7B,SAAA,GAAA,EAAA,SAAS,IAA8B,GAAc,EAAS;;AAGhE,IAAa,YACJ,EACL,OAAO,EAAE,OAAO,EAAE,UAAO,OAAO,GAAW,GAAG,UACrC,EACL;CACE,SAAS;CACT,OAAO,KAAS,EAAK;CACrB,OAAO;CACR,EACD,EAAA,GAAA,EAAA,SAAG,IAAsB,EAAK,CAAC,CAChC,EAEJ;AAEH,SAAgB,GACd,GACA,GAC4B;AAC5B,SAAA,GAAA,EAAA,SAAS,IAA6B,GAAc,EAAS;;AAG/D,IAAa,WAAiE;CAC5E,IAAI;CAEJ,SAAS,EAAS,GAA0B,GAAe,GAAW;EACpE,IAAM,IAAQ,EAAgB,EAAM,IAAK,EAAE;AAI3C,EAHA,EAAM,KAAS,GACf,EAAgB,GAAO,EAAM,GAClB,MAAS,UAAU,EAAM,UAAU,EAAM,YAC/C,EAAM,OAAO,EAAM;;CAG1B,SAAS,EAAQ,GAAc,GAAc;EAC3C,IAAM,IAAmB,EAAE;AAE3B,EADA,IAAO,EAAM,WAAW,IAAO,GAC/B,IAAO,EAAM,WAAW,IAAO;AAC/B,OAAK,IAAI,IAAI,GAAG,IAAI,GAAM,IACxB,MAAK,IAAI,IAAI,GAAG,IAAI,GAAM,IACxB,GAAO,KAAK,IAAI,IAAO,EAAE;AAG7B,SAAO;;AAGT,QAAO,EACL,OAAO,MAAS;AACd,MAAQ,EAAK;EACb,IAAM,IAAO,EAAM,QAAQ,GACrB,IAAO,EAAM,QAAQ,GACrB,IAAQ,EAAgB,EAAM;AACpC,UAAA,GAAA,EAAA,SACE,wBACA,EACE,OAAO;GACL,SAAS;GACT,qBAAqB,UAAU,EAAK;GACrC,EACF,EACD,EAAQ,GAAM,EAAK,CAAC,KAAK,MAChB,GAAc;GACnB,KAAK,EAAM;GACX,KAAK,EAAM;GACX,MAAM,EAAM;GACZ;GACA;GACA,UAAU,EAAM;GAChB,UAAU,GAAG,MAAM,EAAS,SAAS,GAAO,EAAY;GACxD,WAAW,GAAG,MAAM,EAAS,UAAU,GAAO,EAAY;GAC3D,CAAC,CACF,CACH;IAEJ;GCvFG,KAAgB,CAAC,GAAG,EAAE,EACtB,KAAe,CAAC,KAAK,IAAI;AAE/B,SAAgB,GAAW,GAAsB,GAA2C;AAC1F,SAAA,GAAA,EAAA,SAAS,IAAuB,GAAc,EAAS;;AAGzD,IAAa,WAAqD;CAChE,IAAI,GACA,GACA,IAAS,IACT,IAAS,IACT,IAAK,GACL,IAAK,GACL,IAAI,GACJ,IAAI,GACJ,GACA,GACA,GACA;CAEJ,SAAS,EAAY,GAA2B;AAC9C,MAAQ,EAAK;EACb,IAAM,IAAO,EAAM,QAAQ;AAE3B,EADA,IAAK,EAAK,IACV,IAAK,EAAK;EACV,IAAM,IAAa,EAAgB,EAAM,IAAI;IAC1C,IAAK;IACL,IAAK;GACP;AAOD,EANA,IAAO,EAAM,MACb,IAAK,EAAM,MAAO,GAClB,IAAK,EAAM,MAAO,GAClB,IAAS,EAAM,UAAU,GACzB,IAAS,EAAM,UAAU,GACzB,KAAK,IAAK,EAAO,OAAO,EAAO,KAAK,EAAO,KAC3C,KAAK,IAAK,EAAO,OAAO,EAAO,KAAK,EAAO;EAC3C,IAAM,IAAQ,EAAM;AACpB,EAAI,MACF,KAAM,EAAM,KAAK,EAAO,OAAO,EAAO,KAAK,EAAO,KAClD,KAAM,EAAM,KAAK,EAAO,OAAO,EAAO,KAAK,EAAO;;CAItD,SAAS,IAAc;AAGrB,EAFA,IAAK,EAAO,MAAM,EAAO,KAAK,EAAO,MAAM,GAC3C,IAAK,EAAO,MAAM,EAAO,KAAK,EAAO,MAAM,GACvC,IAAO,MACT,IAAK,KAAK,MAAM,IAAK,EAAK,GAAG,GAC7B,IAAK,KAAK,MAAM,IAAK,EAAK,GAAG,GAC7B,KAAK,IAAK,EAAO,OAAO,EAAO,KAAK,EAAO,KAC3C,KAAK,IAAK,EAAO,OAAO,EAAO,KAAK,EAAO;;CAI/C,SAAS,EAAS,GAA0B;AAC1C,KAAa;EACb,IAAM,IAAa,EAAgB,EAAM,IAAI;IAC1C,IAAK;IACL,IAAK;GACP;AAGD,EAFA,EAAM,KAAM,GACZ,EAAM,KAAM,GACZ,EAAK,MAAS,UAAU,EAAM,UAAU,EAAM,UAAU,GAAO,EAAM;;CAGvE,SAAS,EAAY,GAAe;AAClC,IAAK,SAAS,EAAE;;CAGlB,IAAM,IAAO,GAAS;EACpB,SAAS,MAAM;AACb,KAAE,gBAAgB;GAClB,IAAM,IAAS,EAAK,QACd,IAAO,EAAO,uBAAuB,EACrC,IAAK,OAAO,eAAe,SAAS,gBAAgB,YACpD,IAAK,OAAO,eAAe,SAAS,gBAAgB,WAEpD,IAAK,EAAO,aACZ,IAAK,EAAO,cACd,CAAC,GAAI,KAAM,EAAc,EAAE;AAK/B,GAJA,IAAI,GAAO,IAAK,IAAK,EAAK,QAAQ,GAAI,GAAG,EAAE,EAC3C,IAAI,GAAO,IAAK,IAAK,EAAK,OAAO,GAAI,GAAG,EAAE,EAE1C,EAAS,QAAQ,EACjB,EAAA,QAAE,QAAQ;;EAEZ,aAAa;AAQX,GAPA,EAAK,YAAY,EACb,KAAM,QAAQ,KAAM,SACtB,IAAI,GACJ,IAAI,GACJ,EAAS,QAAQ,GAEnB,EAAS,SAAS,EAClB,EAAA,QAAE,QAAQ;;EAEb,CAAC;AAEF,QAAO;EACL,UAAU,EAAK;EACf,QAAQ;EACR,UAAU;EACV,OAAO,OACL,EAAY,EAAK,EACV,EACL;GACE,OAAO,EAAM;GACb,OAAO,EAAQ,aAAa,EAAM,MAAM;GACzC,GAAA,GAAA,EAAA,SAEC,eACA;GACE,UAAU;GACV,aAAa;GACb,cAAc;GACf,GAAA,GAAA,EAAA,SACC,iBAAiB,EACjB,OAAO;GACL,kBAAkB;GAClB,UAAU;GACV,MAAM;GACN,OAAO;GACP,KAAK,GAAG,IAAI,IAAI;GAChB,QAAQ;GACT,EACF,CAAC,GAAA,GAAA,EAAA,SACA,iBAAiB,EACjB,OAAO;GACL,kBAAkB;GAClB,UAAU;GACV,MAAM,GAAG,IAAI,IAAI;GACjB,KAAK;GACL,QAAQ;GACR,OAAO;GACR,EACF,CAAC,GAAA,GAAA,EAAA,SACA,iBAAiB,EACjB,OAAO;GACL,kBAAkB;GAClB,MAAM,GAAG,IAAI,IAAI;GACjB,KAAK,GAAG,IAAI,IAAI;GAChB,UAAU;GACV,OAAO;GACP,QAAQ;GACR,cAAc;GACd,eAAe;GACf,QAAQ;GACR,iBAAiB;GACjB,cAAc;GACf,EACF,CAAC,CACH,CACF;EAEJ;;;;AChJH,SAAS,GAAqB,GAAwC;CACpE,IAAM,IAAsB,EAAE;AAC9B,MAAK,IAAM,KAAM,GAAK;AACpB,MAAI,EAAS,EAAG,IAAI,EAAS,EAAG,EAAE;AAChC,KAAI,KAAK;IAAE,OAAO;IAAI,OAAO,OAAO,EAAG;IAAE,CAAC;AAC1C;;AAEF,MAAI,WAAW,GAAI;AACjB,KAAI,KAAK,EAAG;AACZ;;;AAGJ,QAAO;;AAGT,SAAS,GACP,GACyD;CACzD,IAAM,IAA+D,EAAE;AACvE,MAAK,IAAM,KAAM,EACf,CAAI,EAAS,EAAG,IAAI,EAAS,EAAG,IAAI,KAAM,OACxC,EAAI,KAAK;EAAE,OAAO;EAAI,OAAO,OAAO,EAAG;EAAE,CAAC,GACjC,WAAW,IACpB,EAAI,KAAK,EAAG,GACH,aAAa,KACtB,EAAI,KAAK;EACP,OAAO,EAAG;EACV,UAAU,EAAG;EACb,SAAS,MAAM,QAAQ,EAAG,QAAQ,GAC9B,GAAqB,EAAG,QAAQ,GAChC,GAAkB,EAAG,QAAQ;EAClC,CAAC;AAGN,QAAO;;AAGT,SAAS,GAAkB,GAA+C;AACxE,QAAO,OAAO,KAAK,EAAI,CACpB,MAAM,CACN,KAAK,OAAS;EAAE,OAAO,EAAI;EAAM,OAAO;EAAK,EAAE;;AAGpD,SAAS,GACP,GACyD;CACzD,IAAM,IAAU,EAAK,MAAM;AAS3B,QAPK,IAID,MAAM,QAAQ,EAAQ,GACjB,GAAiB,EAAQ,GAE3B,GAAkB,EAAQ,GANxB,EAAE;;AASb,SAAgB,GAAY,GAAuB,GAA4C;AAC7F,SAAA,GAAA,EAAA,SAAS,IAAwB,GAAc,EAAS;;AAG1D,IAAa,WAAuD;CAClE,IAAI,GACA;CAEJ,SAAS,IAAmB;EAC1B,IAAM,IAAQ,EAAgB,EAAM,EAChC,IAAI;AACR,OAAK,IAAM,KAAM,EACf,KAAI,aAAa,EACf,MAAK,IAAM,KAAM,EAAG,SAAS;AAC3B,OAAI,EAAG,UAAU,EACf,QAAO;AAET;;OAEG;AACL,OAAI,EAAG,UAAU,EACf,QAAO;AAET;;;CAKN,SAAS,EAAe,GAAe;EACrC,IAAI,IAAI;AACR,OAAK,IAAM,KAAM,EACf,KAAI,aAAa,EACf,MAAK,IAAM,KAAM,EAAG,SAAS;AAC3B,OAAI,MAAM,EACR,QAAO,EAAG;AAEZ,QAAK;;OAEF;AACL,OAAI,MAAM,EACR,QAAO,EAAG;AAEZ,QAAK;;AAGT,SAAO;;CAGT,SAAS,EAAS,GAAU;EAC1B,IAAM,IAAK,EAAE,QACP,IAAQ,EAAe,EAAG,cAAc,EACxC,IAAU,EAAgB,GAAO,EAAM;AAC7C,IAAM,WAAW,GAAO,EAAQ;;AAGlC,QAAO,EACL,OAAO,OACL,IAAQ,EAAK,OACb,IAAU,GAAW,EAAK,EACnB,EACL;EACE,SAAS;EACT,OAAO,EAAM,SAAS,EAAM;EAC5B,OAAO,EAAM;EACd,GAAA,GAAA,EAAA,SAEC,2BACA;EACE,eAAe,GAAkB;EACvB;EACV,UAAU,EAAM;EACjB,EACD,EAAQ,KAAK,MACP,aAAa,KACf,GAAA,EAAA,SACE,YACA;EACE,UAAU,CAAC,CAAC,EAAG;EACf,OAAO,EAAG,SAAS;EACpB,EACD,EAAG,QAAQ,IAAI,GAAO,CACvB,GAEI,GAAO,EAAG,CACjB,CACH,CACF,GAEJ;;AAGH,SAAS,GAAO,GAAkB;AAChC,SAAA,GAAA,EAAA,SACE,UACA;EACE,OAAO,EAAG;EACV,OAAO,EAAG;EACV,UAAU,CAAC,CAAC,EAAG;EAChB,EACD,EAAG,SAAS,GACb;;;;ACvLH,SAAgB,GACd,GACA,GAC0B;AAC1B,SAAA,GAAA,EAAA,SAAS,IAA2B,GAAc,EAAS;;AAG7D,IAAa,WAA6D;CACxE,IAAI,IAAS,GACT,IAAU,GACV,IAAQ,GACR,IAAW,IACX,GAEA,IAAiC,MACjC,GACA;CACJ,SAAS,IAAuB;AAC9B,SAAO,GAAY,EAAgB,EAAM,IAAI,GAAY,GAAQ,GAAS,EAAM,CAAC;;CAGnF,SAAS,EAAY,GAA+B;AAClD,MAAQ,EAAK;EACb,IAAM,IAAQ,GAAM;AAIpB,EAHA,IAAS,EAAM,UAAU,GACzB,IAAU,EAAM,WAAW,GAC3B,IAAQ,EAAM,SAAS,GACvB,IAAW,IAAQ,KAAK,KAAK;;CAG/B,SAAS,EAAS,GAA0B;EAC1C,IAAM,IAAQ,GAAY,GAAQ,GAAS,EAAM;AAEjD,EADA,EAAgB,GAAO,EAAM,EAC7B,EAAK,MAAS,UAAU,EAAM,UAAU,EAAM,UAAU,EAAM,OAAO,EAAM;;CAG7E,SAAS,EAAa,GAAe;AAInC,SAHA,IAAW,OACX,EAAK,SAAS,EAAE,EACd,EAAE,OAAuB,OAAO,EAC3B;;CAET,SAAS,EAAY,GAAe;AAIlC,SAHA,IAAW,OACX,EAAK,SAAS,EAAE,EACd,EAAE,OAAuB,OAAO,EAC3B;;CAGT,IAAM,IAAO,GAAS;EACpB,UAAU,MAAM;EAChB,SAAS,MAAM;GACb,IAAM,IAAW,GAAiB,GAAG,EAAY,EAC3C,IAAK,EAAS,cAAc,IAC5B,IAAK,EAAS,cAAc;AAClC,OAAI,MAAa,MAGf,CADA,IAAU,KAAK,MAAM,GAAI,EAAG,EACxB,IAAU,MACZ,KAAW,IAAI,KAAK;YAEb,MAAa,OAAO;IAG7B,IAAM,IAAK,CAAC,KAAK,IAAI,EAAQ,EAAE,KAAK,IAAI,EAAQ,CAAC,EAC3C,IAAK,CAAC,GAAI,EAAG,EACb,KAAK,EAAG,KAAK,EAAG,KAAK,EAAG,KAAK,EAAG,MAAM,KAAK,KAAK,EAAG,KAAK,EAAG,KAAK,EAAG,KAAK,EAAG,GAAG;AAGpF,IADA,IAAQ,KAAK,KAAK,EAAM,GAAG,GAAG,GAAI,EAC9B,MACF,IAAQ,KAAK,KAAK;;AAItB,GADA,EAAS,QAAQ,EACjB,EAAA,QAAE,QAAQ;;EAEZ,QAAQ,MAAM;AAIZ,GAHA,EAAK,YAAY,EACjB,IAAW,MACX,EAAS,SAAS,EAClB,EAAA,QAAE,QAAQ;;EAEb,CAAC;AA0BF,QAAO;EACL,gBAAgB;AACd,KAAK,YAAY;;EAEnB,QAAQ;EACR,UAAU;EACV,aACE,IAAY,GAAY,GAAQ,GAAS,GAAO,EAAU,EACnD,EACL;GACE,SAAS;GACT,OAAO,EAAM,SAAS,EAAM;GAC5B,OAAO,EAAM;GACb,OAAO;IACL,mBAAmB,GAAG,GAAM,EAAQ;IACpC,iBAAiB,GAAG,GAAM,EAAM;IACjC;GACF,EACD,EAAA,GAAA,EAAA,SAEI,2BACA,EAAE,EACF,MAAM,EAAU,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAU,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAU,EAAE,QAAQ,EAAE,GACvF,GAAA,GAAA,EAAA,SAEC,0BACA;GACE,WAAW,MAAW,IAAc,EAAM;GAC1C,OAAO,EAAQ,EACb,eAAe,CAAC,CAAC,GAClB,CAAC;GACF,OAAO;IACL,aAAa;IACb,SAAS;IACT,eAAe;IACf,mBAAmB;IACnB,UAAU;IACX;GACF,GAAA,GAAA,EAAA,SAEC,yBACA;GACE,aAAa;GACb,cAAc;GACd,UAAU;GACV,OAAO;IACL,OAAO;IACP,SAAS;IACT,gBAAgB;IAChB,YAAY;IACZ,WAAW,0BAA0B,EAAQ;IAC7C,iBAAiB;IAClB;GACF,GAAA,GAAA,EAAA,SACC,0BAA0B;GAC1B,aAAa;GACb,cAAc;GACd,UAAU;GACV,OAAO;IACL,aAAa;IACb,WAAW;IACZ;GACF,CAAC,CACH,CACF,CACF,CACF;EAEJ;;AAGH,SAAS,GAAM,GAAe;AAC5B,QAAgB,MAAM,KAAK,KAApB;;AAWT,SAAS,GAAY,GAAgC;CACnD,IAAM,IAAI,GAAO,KAAK,GAChB,IAAI,GAAO,KAAK,GAChB,IAAI,GAAO,KAAK,GAEhB,IAAS,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI;AAKnD,QAAO;EACL;EACA,SALY,KAAK,MAAM,GAAG,EAAE,IAAI;EAMhC,OALU,KAAK,KAAK,IAAI,EAAO,IAAI;EAMpC;;AAUH,SAAS,GACP,GACA,GACA,GACA,GACgB;CAChB,IAAM,IAAS,KAAK,IAAI,EAAI;AAO5B,QALA,MAAa,EAAE,EACf,EAAI,IAAI,IAAI,KAAK,IAAI,EAAM,GAAG,GAC9B,EAAI,IAAI,IAAI,KAAK,IAAI,EAAI,EACzB,EAAI,IAAI,IAAI,KAAK,IAAI,EAAM,GAAG,GAEvB;;;;ACpNT,SAAgB,GACd,GACA,GAC6B;AAC7B,SAAA,GAAA,EAAA,SAAS,IAA8B,GAAc,EAAS;;AAGhE,SAAgB,GACd,GACA,GAC4B;AAC5B,SAAA,GAAA,EAAA,SAAS,IAA6B,GAAc,EAAS;;AAG/D,IAAa,YACJ,EACL,OAAO,EAAE,OAAO,EAAE,UAAO,OAAO,GAAW,GAAG,UACrC,EACL;CACE,SAAS;CACT,OAAO,KAAS,EAAK;CACrB,OAAO;CACR,EACD,EAAA,GAAA,EAAA,SAAG,IAAsB,EAAK,CAAC,CAChC,EAEJ,GAEU,WAAiE;CAC5E,IAAI;CACJ,SAAS,EAAS,GAAU;EAE1B,IAAM,IADK,EAAE,OACI;AAGjB,EAFA,EAAgB,GAAO,EAAM,GAClB,EAAE,SAAS,UAAU,EAAM,UAAU,EAAM,YACjD,EAAM,OAAO,EAAM;;AAG1B,QAAO,EACL,OAAO,MAAS;AACd,MAAQ,EAAK;EACb,IAAM,IAAW,CAAC,EAAM,UAClB,IAAQ,EAAgB,EAAM;AACpC,UAAA,GAAA,EAAA,SACE,kCACA,EACE,OAAO,EAAQ,EACb,sBAAsB,CAAC,CAAC,EAAM,UAC/B,CAAC,EACH,EACD;GACE,EAAM,aAAa;GACnB,IAAW,QAAA,GAAA,EAAA,SAAS,uBAAuB,EAAM;GAChD,KACG,GAAA,EAAA,SACE,EAAM,OAAO,aAAa,sBAAsB;IACzC;IACP,SAAS;IACC;IACV,aAAa,EAAM;IACnB,UAAU,EAAM;IAChB,MAAM,EAAM;IACb,CAAC,GARF;GAUJ,EAAM,WAAW;GAClB,CACF;IAEJ;;;;AClEH,SAAgB,GACd,GACA,GAC6B;AAC7B,SAAA,GAAA,EAAA,SAAS,IAA8B,GAAc,EAAS;;AAGhE,SAAgB,GACd,GACA,GAC4B;AAC5B,SAAA,GAAA,EAAA,SAAS,IAA6B,GAAc,EAAS;;AAG/D,IAAa,YACJ,EACL,OAAO,EAAE,OAAO,EAAE,UAAO,OAAO,GAAW,GAAG,UACrC,EACL;CACE,SAAS;CACT,OAAO,KAAS,EAAK;CACrB,OAAO;CACR,EACD,EAAA,GAAA,EAAA,SAAG,IAAsB,EAAK,CAAC,CAChC,EAEJ,GAEG,KAAc;CAAC;CAAK;CAAK;CAAI,EACtB,WAAiE;CAC5E,SAAS,EAAS,GAA0B,GAAe,GAAW,GAAyB;EAC7F,IAAM,IAAa,EAAgB,EAAM,IAAI,EAAE;AAI/C,EAHA,EAAM,KAAS,MAAM,EAAE,GAAG,OAAO,GACjC,EAAgB,GAAO,EAAM,GAClB,MAAS,UAAU,EAAM,UAAU,EAAM,YAC/C,EAAM,OAAO,GAAO,EAAM;;AAGjC,QAAO,EACL,OAAO,EAAE,eAAY;EACnB,IAAM,IAAO,EAAM,QAAQ,IACrB,IAAO,EAAM,QAAQ,EAAK,QAC1B,IAAQ,EAAgB,EAAM;AACpC,UAAA,GAAA,EAAA,SACE,wBACA,EACE,OAAO;GACL,SAAS;GACT,qBAAqB,UAAU,EAAK;GACrC,EACF,EACD,EAAK,KAAK,MACD,GAAc;GACnB,KAAK,EAAM;GACX,KAAK,EAAM;GACX,MAAM,EAAM;GACZ;GACA;GACA,UAAU,EAAM;GAChB,YAAY,EAAM,YAAY,QAAA,GAAA,EAAA,SAAS,wBAAwB,EAAM;GACrE,UAAU,GAAG,MAAM,EAAS,SAAS,GAAO,GAAa,EAAM;GAC/D,WAAW,GAAG,MAAM,EAAS,UAAU,GAAO,GAAa,EAAM;GACjE,aAAa;GACd,CAAC,CACF,CACH;IAEJ;;;;AC5EH,SAAgB,GACd,GACA,GAC8B;AAC9B,SAAA,GAAA,EAAA,SAAS,IAA+B,GAAc,EAAS;;AAGjE,IAAa,YACJ,EACL,OAAO,EAAE,OAAO,EAAE,UAAO,OAAO,GAAW,GAAG,UACrC,EACL;CACE,SAAS;CACT,OAAO,KAAS,EAAK;CACrB,OAAO;CACR,EACD,EAAA,GAAA,EAAA,SAAG,IAAuB,EAAK,CAAC,CACjC,EAEJ;AAGH,SAAgB,GACd,GACA,GAC6B;AAC7B,SAAA,GAAA,EAAA,SAAS,IAA8B,GAAc,EAAS;;AAGhE,IAAa,WAAmE;CAC9E,IAAI;CAEJ,SAAS,IAAc;AACrB,SAAO,EAAM,YAAY;;CAG3B,SAAS,EAAU,GAAe;EAChC,IAAI,IAAQ,EAAgB,EAAM;AAElC,EADA,KAAiB,KAAK,GACtB,EAAW,EAAM;;CAqBnB,SAAS,EAAW,GAAe;AAGjC,EAFA,EAAgB,GAAO,EAAM,EAC7B,EAAM,UAAU,EAAM,OAAO,EAAM,EACnC,EAAM,WAAW,EAAM,OAAO,EAAM;;CAGtC,SAAS,EAAS,GAAe,GAAe;AAC9C,UAAQ,IAAS,KAAK,MAAY;;CAGpC,SAAS,EAAQ,GAAe;AAC9B,MAAI,EAAM;QACH,IAAM,CAAC,GAAM,MAAU,OAAO,QAAQ,EAAM,MAAM,CACrD,KAAI,MAAU,KAAK,EACjB,QAAO;;AAIb,SAAO;;AAGT,QAAO,EACL,OAAO,MAAS;AACd,MAAQ,EAAK;EACb,IAAM,IAAW,GAAa,EACxB,IAAQ,EAAgB,EAAM;AACpC,UAAA,GAAA,EAAA,SACE,yBACA,EAAE,EACF,MAAM,KAAK,EAAE,QAAQ,GAAU,GAAG,GAAG,OACnC,GAAA,EAAA,SACE,yBACA;GACE,UAAU;GACV,OAAO,EAAQ,EACb,sBAAsB,EAAS,GAAO,EAAE,EACzC,CAAC;GACF,eAAe,EAAU,EAAE;GAC5B,EACD;kBACI,6BAA6B,EAAE,CAAC;kBAChC,wBAAwB,EAAE,EAAE,EAAQ,EAAE,IAAI,GAAG;kBAC7C,uBAAuB,EAAE,EAAE,OAAO,IAAI;kBAEtC,yBACA,EAAE,EACF,OAAO,QAAgB,KAAG,GAAG,SAAS,GAAG,CAAC,CAAC,SAAS,KAAK,KAAK,IAAW,EAAE,EAAE,IAAI,CAClF;GACF,CACF,CACD,CACH;IAEJ;;;;ACnJH,SAAgB,GACd,GACA,GAC2B;AAC3B,SAAA,GAAA,EAAA,SAAS,IAA4B,GAAc,EAAS;;AAG9D,SAAgB,GAAU,GAAqB,GAA0C;AACvF,SAAA,GAAA,EAAA,SAAS,IAAsB,GAAc,EAAS;;AAGxD,IAAa,YACJ,EACL,OAAO,EAAE,eACA,EACL;CACE,SAAS;CACT,OAAO,EAAM,SAAS,EAAM;CAC5B,OAAO,EAAM;CACd,GAAA,GAAA,EAAA,SACC,IAAe,EAAM,CACxB,EAEJ,GAGU,WAAyD;CACpE,IAAI,GACA,GACA;AAEJ,QAAO;EACL,SAAS,EAAE,UAAO;AAEhB,GADA,IAAK,GACL,IAAQ,kBAAkB;IACxB,IAAM,IAAQ,EAAgB,EAAM,IAAI;AACxC,MAAG,cAAc,OAAO,EAAM;MAC7B,EAAM,YAAY,IAAI;;EAG3B,WAAW;AACT,iBAAc,EAAM;;EAEtB,OAAO,OACL,IAAQ,EAAK,QACb,GAAA,EAAA,SAAS,gBAAgB,EAAE,CAAC;EAE/B;GCkBU,KAAb,MAAa,EAAQ;CACnB,OAAc,MAAM,GAAe;EACjC,IAAM,IAAU,IAAI,GAAS;AAE7B,SADA,EAAG,EAAQ,EACJ,EAAQ,OAAO;;CAGxB,SAAiC,EAAE;CAEnC,QAAe;EACb,IAAM,IAAS,KAAK;AAEpB,SADA,KAAK,SAAS,EAAE,EACT;;CAGT,QAAe,GAAe,MAAM,GAAe;CAEnD,OAAc,EAAmB,MAAM,GAAc;CACrD,OAAc,EAAmB,MAAM,GAAc;CACrD,OAAc,EAAmB,MAAM,GAAc;CACrD,QAAe,EAAmB,MAAM,GAAe;CACvD,eAAsB,EAAmB,MAAM,GAAsB;CACrE,UAAiB,EAAmB,MAAM,GAAiB;CAC3D,gBAAuB,EAAmB,MAAM,GAAuB;CACvE,gBAAuB,EAAmB,MAAM,GAAuB;CACvE,MAAa,EAAmB,MAAM,EAAa;CACnD,WAAkB,EAAmB,MAAM,GAAkB;CAC7D,SAAgB,EAAmB,MAAM,EAAgB;CACzD,aAAoB,EAAmB,MAAM,GAAoB;CAEjE,OAAc,EAAgB,MAAM,GAAoB;CACxD,SAAgB,EAAgB,MAAM,GAAsB;CAC5D,SAAgB,EAAgB,MAAM,GAAsB;CAC5D,SAAgB,EAAgB,MAAM,GAAsB;CAC5D,SAAgB,EAAgB,MAAM,GAAsB;CAC5D,SAAgB,EAAgB,MAAM,GAAgB;CACtD,QAAe,EAAgB,MAAM,GAAqB;CAC1D,UAAiB,EAAgB,MAAM,GAAuB;CAC9D,OAAc,EAAgB,MAAM,GAAoB;CACxD,QAAe,EAAgB,MAAM,GAAqB;CAC1D,cAAqB,EAAgB,MAAM,GAA2B;CAEtE,YAAmB,EAAgB,MAAM,GAAmB;CAC5D,cAAqB,EAAgB,MAAM,GAAqB;CAChE,cAAqB,EAAgB,MAAM,GAAqB;CAChE,cAAqB,EAAgB,MAAM,GAAqB;CAChE,cAAqB,EAAgB,MAAM,GAAqB;CAChE,cAAqB,EAAgB,MAAM,GAAgB;CAC3D,aAAoB,EAAgB,MAAM,GAAoB;CAC9D,eAAsB,EAAgB,MAAM,GAAsB;CAClE,YAAmB,EAAgB,MAAM,GAAc;CACvD,aAAoB,EAAgB,MAAM,GAAe;CACzD,mBAA0B,EAAgB,MAAM,GAAY;CAE5D,QAAe,EAAgB,MAAM,GAAe;CACpD,YAAmB,EAAgB,MAAM,GAAmB;CAE5D,OAAc,GAAc,IAAoB,EAAE,EAAE;AAClD,OAAK,IAAI,IAAiB,GAAM,EAAK;;CAGvC,MAAa,GAAkB;AAC7B,OAAK,IAAI,IAAgB,EAAK;;CAGhC,QAAe,GAAoB;AACjC,OAAK,IAAI,IAAS,EAAE,EAAE,EAAQ;;CAGhC,KAAe,GAAoB;AACjC,OAAK,IAAI,IAAe,EAAK;;CAG/B,MAAa,GAAkB;AAC7B,OAAK,IAAI,IAAgB,EAAK;;CAGhC,OAAc,GAAe,GAA8B;AACzD,OAAK,IAAI,IAAiB,EAAE,UAAO,EAAE,EAAS;;CAGhD,IAAW,GAAe,GAA8B;AACtD,OAAK,IACH,IACA;GACE;GACA,OAAO,EACL,YAAY,OACb;GACF,EACD,EACD;;CAOH,KAAY,GAAsB;AAChC,OAAK,IAAI,EAAE,SAAM,CAAC;;CAOpB,QAAe,GAAoB,GAA8B;AAC/D,OAAK,IAAI,IAAiB,GAAO,EAAS;;CAM5C,IACE,GACA,GACA,GACA;AACA,MAAI,KAAK,OACP,MAAK,OAAO,KAAK;GAAE;GAAW;GAAY;GAAU,CAAC;MAErD,OAAU,MAAM,iDAAiD;;;AAcvE,SAAS,GACP,GACA,GACuB;AACvB,QAAO,WAAY;EACjB,IAAM,EAAE,YAAS,gBAAa,GAAoB,GAAS,UAAU;AACrE,IAAQ,IAAI,GAAW,GAAS,EAAS;;;AAU7C,SAAS,EACP,GACA,GACmB;AACnB,QAAO,WAAY;AACjB,IAAQ,IAAI,GAAW,GAAgB,UAAU,CAAC;;;AAUtD,SAAS,EACP,GACA,GAC2B;AAC3B,QAAO,WAAY;EACjB,IAAM,EAAE,YAAS,gBAAa,GAAwB,GAAS,UAAU;AACzE,IAAQ,IAAI,GAAW,GAAS,EAAS;;;AAI7C,SAAS,GAA+B,GAAY,GAAkB;CACpE,IAAI,IAAuB,MACvB,IAAkC,EAAE,EACpC,IAAuB;AAE3B,MAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK;EACpC,IAAM,IAAM,EAAK;AACjB,EAAI,EAAS,EAAI,GACf,IAAQ,IACC,EAAS,EAAI,GACtB,IAAU,IACD,GAAW,EAAI,KACxB,IAAK;;AAIT,CAAI,MACF,EAAQ,QAAQ;CAGlB,IAAM,IAA8B,EAAE;AACtC,KAAI,GAAI;EACN,IAAM,IAAW,EAAE;AAGnB,EAFA,EAAE,SAAS,GACX,EAAG,EAAE,EACL,EAAE,SAAS;;AAEb,QAAO;EAAE;EAAS;EAAU;;AAG9B,SAAS,GAA+D,GAAqB;CAC3F,IAAI;AAgBJ,QAdI,EAAK,WAAW,IACX,EAAK,MAAM,EAAE,IAElB,EAAK,SAAS,KAChB,IAAO,EAAK,MAAM,EAAE,EACpB,EAAK,QAAQ,EAAK,IAClB,EAAK,QAAQ,EAAK,IACd,EAAK,UAAU,KAAA,MACjB,EAAK,QAAQ,OAAO,EAAK,SAAS,GAAG,KAGvC,IAAO,EAAE,EAGJ;;AAGT,SAAS,GAAmC,GAAY,GAAkB;CACxE,IAAI,IAAoB,MACpB,IAAuB;AAE3B,KAAI,CAAC,EAAK,OACR,QAAO;EAAE,SAAS,EAAE;EAAO,UAAU,EAAE;EAAE;AAE3C,MAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK;EACpC,IAAM,IAAM,EAAK;AACjB,EAAI,EAAS,EAAI,GACf,IAAU,IACD,GAAW,EAAI,KACxB,IAAK;;CAIT,IAAM,IAA8B,EAAE;AACtC,KAAI,GAAI;EACN,IAAM,IAAW,EAAE;AAGnB,EAFA,EAAE,SAAS,GACX,EAAG,EAAE,EACL,EAAE,SAAS;;AAEb,QAAO;EAAE,SAAS,KAAY,EAAE;EAAQ;EAAU"}
|
|
1
|
+
{"version":3,"file":"tweak-ui.module.js","names":[],"sources":["../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/vnode.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/hyperscriptVnode.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/util/hasOwn.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/emptyAttrs.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/cachedAttrsIsStaticMap.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/hyperscript.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/trust.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/fragment.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/hyperscript.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/delayedRemoval.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/domFor.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render/render.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/render.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/api/mount-redraw.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/mount-redraw.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/querystring/build.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/pathname/build.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/request/request.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/request.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/util/decodeURIComponentSafe.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/querystring/parse.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/pathname/parse.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/pathname/compileTemplate.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/util/censor.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/api/router.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/route.js","../node_modules/.pnpm/mithril@2.3.8/node_modules/mithril/index.js","../src/lib/components/container/bar.ts","../src/lib/components/container/grid.ts","../src/lib/core/utils.ts","../src/lib/components/container/group.ts","../src/lib/components/container/list.ts","../src/lib/components/container/section.ts","../src/lib/core/control.ts","../src/lib/core/render.ts","../src/lib/core/types.ts","../src/lib/mount.ts","../src/lib/components/container/split.ts","../src/lib/components/container/tabs.ts","../src/lib/components/container/tree.ts","../src/lib/components/container/dialog.ts","../src/lib/components/elements/button.ts","../src/lib/components/elements/divider.ts","../src/lib/stats/sampler.ts","../src/lib/stats/stats-renderer.ts","../src/lib/components/elements/graph.ts","../src/lib/components/elements/image.ts","../src/lib/components/elements/widget.ts","../src/lib/components/controls/scalar.ts","../src/lib/components/controls/angle.ts","../src/lib/components/controls/bool.ts","../src/lib/color/converter.ts","../src/lib/color/array-format.ts","../src/lib/color/css-string-format.ts","../src/lib/color/hex-string-format.ts","../src/lib/color/number-format.ts","../src/lib/color/object-format.ts","../src/lib/color/formatter.ts","../src/lib/components/controls/color-picker.ts","../src/lib/components/controls/color.ts","../src/lib/components/controls/input.ts","../src/lib/components/controls/matrix.ts","../src/lib/components/controls/point.ts","../src/lib/components/controls/select.ts","../src/lib/components/controls/spherical.ts","../src/lib/components/controls/string.ts","../src/lib/components/controls/vector.ts","../src/lib/components/controls/bitmask.ts","../src/lib/components/controls/poll.ts","../src/lib/builder.ts"],"sourcesContent":["\"use strict\"\n\nfunction Vnode(tag, key, attrs, children, text, dom) {\n\treturn {tag: tag, key: key, attrs: attrs, children: children, text: text, dom: dom, is: undefined, domSize: undefined, state: undefined, events: undefined, instance: undefined}\n}\nVnode.normalize = function(node) {\n\tif (Array.isArray(node)) return Vnode(\"[\", undefined, undefined, Vnode.normalizeChildren(node), undefined, undefined)\n\tif (node == null || typeof node === \"boolean\") return null\n\tif (typeof node === \"object\") return node\n\treturn Vnode(\"#\", undefined, undefined, String(node), undefined, undefined)\n}\nVnode.normalizeChildren = function(input) {\n\t// Preallocate the array length (initially holey) and fill every index immediately in order.\n\t// Benchmarking shows better performance on V8.\n\tvar children = new Array(input.length)\n\t// Count the number of keyed normalized vnodes for consistency check.\n\t// Note: this is a perf-sensitive check.\n\t// Fun fact: merging the loop like this is somehow faster than splitting\n\t// the check within updateNodes(), noticeably so.\n\tvar numKeyed = 0\n\tfor (var i = 0; i < input.length; i++) {\n\t\tchildren[i] = Vnode.normalize(input[i])\n\t\tif (children[i] !== null && children[i].key != null) numKeyed++\n\t}\n\tif (numKeyed !== 0 && numKeyed !== input.length) {\n\t\tthrow new TypeError(children.includes(null)\n\t\t\t? \"In fragments, vnodes must either all have keys or none have keys. You may wish to consider using an explicit keyed empty fragment, m.fragment({key: ...}), instead of a hole.\"\n\t\t\t: \"In fragments, vnodes must either all have keys or none have keys.\"\n\t\t)\n\t}\n\treturn children\n}\n\nmodule.exports = Vnode\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\n\n// Note: the processing of variadic parameters is perf-sensitive.\n//\n// In native ES6, it might be preferable to define hyperscript and fragment\n// factories with a final ...args parameter and call hyperscriptVnode(...args),\n// since modern engines can optimize spread calls.\n//\n// However, benchmarks showed this was not faster. As a result, spread is used\n// only in the parameter lists of hyperscript and fragment, while an array is\n// passed to hyperscriptVnode.\nmodule.exports = function(attrs, children) {\n\tif (attrs == null || typeof attrs === \"object\" && attrs.tag == null && !Array.isArray(attrs)) {\n\t\tif (children.length === 1 && Array.isArray(children[0])) children = children[0]\n\t} else {\n\t\tchildren = children.length === 0 && Array.isArray(attrs) ? attrs : [attrs, ...children]\n\t\tattrs = undefined\n\t}\n\n\treturn Vnode(\"\", attrs && attrs.key, attrs, children)\n}\n","// This exists so I'm only saving it once.\n\"use strict\"\n\nmodule.exports = {}.hasOwnProperty\n","\"use strict\"\n\n// This is an attrs object that is used by default when attrs is undefined or null.\nmodule.exports = {}\n","\"use strict\"\n\nvar emptyAttrs = require(\"./emptyAttrs\")\n\n// This Map manages the following:\n// - Whether an attrs is cached attrs generated by compileSelector().\n// - Whether the cached attrs is \"static\", i.e., does not contain any form attributes.\n// These information will be useful to skip updating attrs in render().\n//\n// Since the attrs used as keys in this map are not released from the selectorCache object,\n// there is no risk of memory leaks. Therefore, Map is used here instead of WeakMap.\nmodule.exports = new Map([[emptyAttrs, true]])\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\nvar hyperscriptVnode = require(\"./hyperscriptVnode\")\nvar hasOwn = require(\"../util/hasOwn\")\nvar emptyAttrs = require(\"./emptyAttrs\")\nvar cachedAttrsIsStaticMap = require(\"./cachedAttrsIsStaticMap\")\n\nvar selectorParser = /(?:(^|#|\\.)([^#\\.\\[\\]]+))|(\\[(.+?)(?:\\s*=\\s*(\"|'|)((?:\\\\[\"'\\]]|.)*?)\\5)?\\])/g\nvar selectorCache = Object.create(null)\n\nfunction isEmpty(object) {\n\tfor (var key in object) if (hasOwn.call(object, key)) return false\n\treturn true\n}\n\nfunction isFormAttributeKey(key) {\n\treturn key === \"value\" || key === \"checked\" || key === \"selectedIndex\" || key === \"selected\"\n}\n\nfunction compileSelector(selector) {\n\tvar match, tag = \"div\", classes = [], attrs = {}, isStatic = true\n\twhile (match = selectorParser.exec(selector)) {\n\t\tvar type = match[1], value = match[2]\n\t\tif (type === \"\" && value !== \"\") tag = value\n\t\telse if (type === \"#\") attrs.id = value\n\t\telse if (type === \".\") classes.push(value)\n\t\telse if (match[3][0] === \"[\") {\n\t\t\tvar attrValue = match[6]\n\t\t\tif (attrValue) attrValue = attrValue.replace(/\\\\([\"'])/g, \"$1\").replace(/\\\\\\\\/g, \"\\\\\")\n\t\t\tif (match[4] === \"class\") classes.push(attrValue)\n\t\t\telse {\n\t\t\t\tattrs[match[4]] = attrValue === \"\" ? attrValue : attrValue || true\n\t\t\t\tif (isFormAttributeKey(match[4])) isStatic = false\n\t\t\t}\n\t\t}\n\t}\n\tif (classes.length > 0) attrs.className = classes.join(\" \")\n\tif (isEmpty(attrs)) attrs = emptyAttrs\n\telse cachedAttrsIsStaticMap.set(attrs, isStatic)\n\treturn selectorCache[selector] = {tag: tag, attrs: attrs, is: attrs.is}\n}\n\nfunction execSelector(state, vnode) {\n\tvnode.tag = state.tag\n\n\tvar attrs = vnode.attrs\n\tif (attrs == null) {\n\t\tvnode.attrs = state.attrs\n\t\tvnode.is = state.is\n\t\treturn vnode\n\t}\n\n\tif (hasOwn.call(attrs, \"class\")) {\n\t\tif (attrs.class != null) attrs.className = attrs.class\n\t\tattrs.class = null\n\t}\n\n\tif (state.attrs !== emptyAttrs) {\n\t\tvar className = attrs.className\n\t\tattrs = Object.assign({}, state.attrs, attrs)\n\n\t\tif (state.attrs.className != null) attrs.className =\n\t\t\tclassName != null\n\t\t\t\t? String(state.attrs.className) + \" \" + String(className)\n\t\t\t\t: state.attrs.className\n\t}\n\n\t// workaround for #2622 (reorder keys in attrs to set \"type\" first)\n\t// The DOM does things to inputs based on the \"type\", so it needs set first.\n\t// See: https://github.com/MithrilJS/mithril.js/issues/2622\n\tif (state.tag === \"input\" && hasOwn.call(attrs, \"type\")) {\n\t\tattrs = Object.assign({type: attrs.type}, attrs)\n\t}\n\n\t// This reduces the complexity of the evaluation of \"is\" within the render function.\n\tvnode.is = attrs.is\n\n\tvnode.attrs = attrs\n\n\treturn vnode\n}\n\nfunction hyperscript(selector, attrs, ...children) {\n\tif (selector == null || typeof selector !== \"string\" && typeof selector !== \"function\" && typeof selector.view !== \"function\") {\n\t\tthrow Error(\"The selector must be either a string or a component.\");\n\t}\n\n\tvar vnode = hyperscriptVnode(attrs, children)\n\n\tif (typeof selector === \"string\") {\n\t\tvnode.children = Vnode.normalizeChildren(vnode.children)\n\t\tif (selector !== \"[\") return execSelector(selectorCache[selector] || compileSelector(selector), vnode)\n\t}\n\n\tif (vnode.attrs == null) vnode.attrs = {}\n\tvnode.tag = selector\n\treturn vnode\n}\n\nmodule.exports = hyperscript\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\n\nmodule.exports = function(html) {\n\tif (html == null) html = \"\"\n\treturn Vnode(\"<\", undefined, undefined, html, undefined, undefined)\n}\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\nvar hyperscriptVnode = require(\"./hyperscriptVnode\")\n\nmodule.exports = function(attrs, ...children) {\n\tvar vnode = hyperscriptVnode(attrs, children)\n\n\tif (vnode.attrs == null) vnode.attrs = {}\n\tvnode.tag = \"[\"\n\tvnode.children = Vnode.normalizeChildren(vnode.children)\n\treturn vnode\n}\n","\"use strict\"\n\nvar hyperscript = require(\"./render/hyperscript\")\n\nhyperscript.trust = require(\"./render/trust\")\nhyperscript.fragment = require(\"./render/fragment\")\n\nmodule.exports = hyperscript\n","\"use strict\"\n\nmodule.exports = new WeakMap\n","\"use strict\"\n\nvar delayedRemoval = require(\"./delayedRemoval\")\n\nfunction *domFor(vnode) {\n\t// To avoid unintended mangling of the internal bundler,\n\t// parameter destructuring is not used here.\n\tvar dom = vnode.dom\n\tvar domSize = vnode.domSize\n\tvar generation = delayedRemoval.get(dom)\n\tif (dom != null) do {\n\t\tvar nextSibling = dom.nextSibling\n\n\t\tif (delayedRemoval.get(dom) === generation) {\n\t\t\tyield dom\n\t\t\tdomSize--\n\t\t}\n\n\t\tdom = nextSibling\n\t}\n\twhile (domSize)\n}\n\nmodule.exports = domFor\n","\"use strict\"\n\nvar Vnode = require(\"./vnode\")\nvar delayedRemoval = require(\"./delayedRemoval\")\nvar domFor = require(\"./domFor\")\nvar cachedAttrsIsStaticMap = require(\"./cachedAttrsIsStaticMap\")\n\nmodule.exports = function() {\n\tvar nameSpace = {\n\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\tmath: \"http://www.w3.org/1998/Math/MathML\"\n\t}\n\n\tvar currentRedraw\n\tvar currentRender\n\n\tfunction getDocument(dom) {\n\t\treturn dom.ownerDocument;\n\t}\n\n\tfunction getNameSpace(vnode) {\n\t\treturn vnode.attrs && vnode.attrs.xmlns || nameSpace[vnode.tag]\n\t}\n\n\t//sanity check to discourage people from doing `vnode.state = ...`\n\tfunction checkState(vnode, original) {\n\t\tif (vnode.state !== original) throw new Error(\"'vnode.state' must not be modified.\")\n\t}\n\n\t//Note: the hook is passed as the `this` argument to allow proxying the\n\t//arguments without requiring a full array allocation to do so. It also\n\t//takes advantage of the fact the current `vnode` is the first argument in\n\t//all lifecycle methods.\n\tfunction callHook(vnode) {\n\t\tvar original = vnode.state\n\t\ttry {\n\t\t\treturn this.apply(original, arguments)\n\t\t} finally {\n\t\t\tcheckState(vnode, original)\n\t\t}\n\t}\n\n\t// IE11 (at least) throws an UnspecifiedError when accessing document.activeElement when\n\t// inside an iframe. Catch and swallow this error, and heavy-handidly return null.\n\tfunction activeElement(dom) {\n\t\ttry {\n\t\t\treturn getDocument(dom).activeElement\n\t\t} catch (e) {\n\t\t\treturn null\n\t\t}\n\t}\n\t//create\n\tfunction createNodes(parent, vnodes, start, end, hooks, nextSibling, ns) {\n\t\tfor (var i = start; i < end; i++) {\n\t\t\tvar vnode = vnodes[i]\n\t\t\tif (vnode != null) {\n\t\t\t\tcreateNode(parent, vnode, hooks, ns, nextSibling)\n\t\t\t}\n\t\t}\n\t}\n\tfunction createNode(parent, vnode, hooks, ns, nextSibling) {\n\t\tvar tag = vnode.tag\n\t\tif (typeof tag === \"string\") {\n\t\t\tvnode.state = {}\n\t\t\tif (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks)\n\t\t\tswitch (tag) {\n\t\t\t\tcase \"#\": createText(parent, vnode, nextSibling); break\n\t\t\t\tcase \"<\": createHTML(parent, vnode, ns, nextSibling); break\n\t\t\t\tcase \"[\": createFragment(parent, vnode, hooks, ns, nextSibling); break\n\t\t\t\tdefault: createElement(parent, vnode, hooks, ns, nextSibling)\n\t\t\t}\n\t\t}\n\t\telse createComponent(parent, vnode, hooks, ns, nextSibling)\n\t}\n\tfunction createText(parent, vnode, nextSibling) {\n\t\tvnode.dom = getDocument(parent).createTextNode(vnode.children)\n\t\tinsertDOM(parent, vnode.dom, nextSibling)\n\t}\n\tvar possibleParents = {caption: \"table\", thead: \"table\", tbody: \"table\", tfoot: \"table\", tr: \"tbody\", th: \"tr\", td: \"tr\", colgroup: \"table\", col: \"colgroup\"}\n\tfunction createHTML(parent, vnode, ns, nextSibling) {\n\t\tvar match = vnode.children.match(/^\\s*?<(\\w+)/im) || []\n\t\t// not using the proper parent makes the child element(s) vanish.\n\t\t// var div = document.createElement(\"div\")\n\t\t// div.innerHTML = \"<td>i</td><td>j</td>\"\n\t\t// console.log(div.innerHTML)\n\t\t// --> \"ij\", no <td> in sight.\n\t\tvar temp = getDocument(parent).createElement(possibleParents[match[1]] || \"div\")\n\t\tif (ns === \"http://www.w3.org/2000/svg\") {\n\t\t\ttemp.innerHTML = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\">\" + vnode.children + \"</svg>\"\n\t\t\ttemp = temp.firstChild\n\t\t} else {\n\t\t\ttemp.innerHTML = vnode.children\n\t\t}\n\t\tvnode.dom = temp.firstChild\n\t\tvnode.domSize = temp.childNodes.length\n\t\tvar fragment = getDocument(parent).createDocumentFragment()\n\t\tvar child\n\t\twhile (child = temp.firstChild) {\n\t\t\tfragment.appendChild(child)\n\t\t}\n\t\tinsertDOM(parent, fragment, nextSibling)\n\t}\n\tfunction createFragment(parent, vnode, hooks, ns, nextSibling) {\n\t\tvar fragment = getDocument(parent).createDocumentFragment()\n\t\tif (vnode.children != null) {\n\t\t\tvar children = vnode.children\n\t\t\tcreateNodes(fragment, children, 0, children.length, hooks, null, ns)\n\t\t}\n\t\tvnode.dom = fragment.firstChild\n\t\tvnode.domSize = fragment.childNodes.length\n\t\tinsertDOM(parent, fragment, nextSibling)\n\t}\n\tfunction createElement(parent, vnode, hooks, ns, nextSibling) {\n\t\tvar tag = vnode.tag\n\t\tvar attrs = vnode.attrs\n\t\tvar is = vnode.is\n\n\t\tns = getNameSpace(vnode) || ns\n\n\t\tvar element = ns ?\n\t\t\tis ? getDocument(parent).createElementNS(ns, tag, {is: is}) : getDocument(parent).createElementNS(ns, tag) :\n\t\t\tis ? getDocument(parent).createElement(tag, {is: is}) : getDocument(parent).createElement(tag)\n\t\tvnode.dom = element\n\n\t\tif (attrs != null) {\n\t\t\tsetAttrs(vnode, attrs, ns)\n\t\t}\n\n\t\tinsertDOM(parent, element, nextSibling)\n\n\t\tif (!maybeSetContentEditable(vnode)) {\n\t\t\tif (vnode.children != null) {\n\t\t\t\tvar children = vnode.children\n\t\t\t\tcreateNodes(element, children, 0, children.length, hooks, null, ns)\n\t\t\t\tif (vnode.tag === \"select\" && attrs != null) setLateSelectAttrs(vnode, attrs)\n\t\t\t}\n\t\t}\n\t}\n\tfunction initComponent(vnode, hooks) {\n\t\tvar sentinel\n\t\tif (typeof vnode.tag.view === \"function\") {\n\t\t\tvnode.state = Object.create(vnode.tag)\n\t\t\tsentinel = vnode.state.view\n\t\t\tif (sentinel.$$reentrantLock$$ != null) return\n\t\t\tsentinel.$$reentrantLock$$ = true\n\t\t} else {\n\t\t\tvnode.state = void 0\n\t\t\tsentinel = vnode.tag\n\t\t\tif (sentinel.$$reentrantLock$$ != null) return\n\t\t\tsentinel.$$reentrantLock$$ = true\n\t\t\tvnode.state = (vnode.tag.prototype != null && typeof vnode.tag.prototype.view === \"function\") ? new vnode.tag(vnode) : vnode.tag(vnode)\n\t\t}\n\t\tinitLifecycle(vnode.state, vnode, hooks)\n\t\tif (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks)\n\t\tvnode.instance = Vnode.normalize(callHook.call(vnode.state.view, vnode))\n\t\tif (vnode.instance === vnode) throw Error(\"A view cannot return the vnode it received as argument\")\n\t\tsentinel.$$reentrantLock$$ = null\n\t}\n\tfunction createComponent(parent, vnode, hooks, ns, nextSibling) {\n\t\tinitComponent(vnode, hooks)\n\t\tif (vnode.instance != null) {\n\t\t\tcreateNode(parent, vnode.instance, hooks, ns, nextSibling)\n\t\t\tvnode.dom = vnode.instance.dom\n\t\t\tvnode.domSize = vnode.instance.domSize\n\t\t}\n\t\telse {\n\t\t\tvnode.domSize = 0\n\t\t}\n\t}\n\n\t//update\n\t/**\n\t * @param {Element|Fragment} parent - the parent element\n\t * @param {Vnode[] | null} old - the list of vnodes of the last `render()` call for\n\t * this part of the tree\n\t * @param {Vnode[] | null} vnodes - as above, but for the current `render()` call.\n\t * @param {Function[]} hooks - an accumulator of post-render hooks (oncreate/onupdate)\n\t * @param {Element | null} nextSibling - the next DOM node if we're dealing with a\n\t * fragment that is not the last item in its\n\t * parent\n\t * @param {'svg' | 'math' | String | null} ns) - the current XML namespace, if any\n\t * @returns void\n\t */\n\t// This function diffs and patches lists of vnodes, both keyed and unkeyed.\n\t//\n\t// We will:\n\t//\n\t// 1. describe its general structure\n\t// 2. focus on the diff algorithm optimizations\n\t// 3. discuss DOM node operations.\n\n\t// ## Overview:\n\t//\n\t// The updateNodes() function:\n\t// - deals with trivial cases\n\t// - determines whether the lists are keyed or unkeyed based on the first non-null node\n\t// of each list.\n\t// - diffs them and patches the DOM if needed (that's the brunt of the code)\n\t// - manages the leftovers: after diffing, are there:\n\t// - old nodes left to remove?\n\t// \t - new nodes to insert?\n\t// \t deal with them!\n\t//\n\t// The lists are only iterated over once, with an exception for the nodes in `old` that\n\t// are visited in the fourth part of the diff and in the `removeNodes` loop.\n\n\t// ## Diffing\n\t//\n\t// Reading https://github.com/localvoid/ivi/blob/ddc09d06abaef45248e6133f7040d00d3c6be853/packages/ivi/src/vdom/implementation.ts#L617-L837\n\t// may be good for context on longest increasing subsequence-based logic for moving nodes.\n\t//\n\t// In order to diff keyed lists, one has to\n\t//\n\t// 1) match nodes in both lists, per key, and update them accordingly\n\t// 2) create the nodes present in the new list, but absent in the old one\n\t// 3) remove the nodes present in the old list, but absent in the new one\n\t// 4) figure out what nodes in 1) to move in order to minimize the DOM operations.\n\t//\n\t// To achieve 1) one can create a dictionary of keys => index (for the old list), then iterate\n\t// over the new list and for each new vnode, find the corresponding vnode in the old list using\n\t// the map.\n\t// 2) is achieved in the same step: if a new node has no corresponding entry in the map, it is new\n\t// and must be created.\n\t// For the removals, we actually remove the nodes that have been updated from the old list.\n\t// The nodes that remain in that list after 1) and 2) have been performed can be safely removed.\n\t// The fourth step is a bit more complex and relies on the longest increasing subsequence (LIS)\n\t// algorithm.\n\t//\n\t// the longest increasing subsequence is the list of nodes that can remain in place. Imagine going\n\t// from `1,2,3,4,5` to `4,5,1,2,3` where the numbers are not necessarily the keys, but the indices\n\t// corresponding to the keyed nodes in the old list (keyed nodes `e,d,c,b,a` => `b,a,e,d,c` would\n\t// match the above lists, for example).\n\t//\n\t// In there are two increasing subsequences: `4,5` and `1,2,3`, the latter being the longest. We\n\t// can update those nodes without moving them, and only call `insertNode` on `4` and `5`.\n\t//\n\t// @localvoid adapted the algo to also support node deletions and insertions (the `lis` is actually\n\t// the longest increasing subsequence *of old nodes still present in the new list*).\n\t//\n\t// It is a general algorithm that is fireproof in all circumstances, but it requires the allocation\n\t// and the construction of a `key => oldIndex` map, and three arrays (one with `newIndex => oldIndex`,\n\t// the `LIS` and a temporary one to create the LIS).\n\t//\n\t// So we cheat where we can: if the tails of the lists are identical, they are guaranteed to be part of\n\t// the LIS and can be updated without moving them.\n\t//\n\t// If two nodes are swapped, they are guaranteed not to be part of the LIS, and must be moved (with\n\t// the exception of the last node if the list is fully reversed).\n\t//\n\t// ## Finding the next sibling.\n\t//\n\t// `updateNode()` and `createNode()` expect a nextSibling parameter to perform DOM operations.\n\t// When the list is being traversed top-down, at any index, the DOM nodes up to the previous\n\t// vnode reflect the content of the new list, whereas the rest of the DOM nodes reflect the old\n\t// list. The next sibling must be looked for in the old list using `getNextSibling(... oldStart + 1 ...)`.\n\t//\n\t// In the other scenarios (swaps, upwards traversal, map-based diff),\n\t// the new vnodes list is traversed upwards. The DOM nodes at the bottom of the list reflect the\n\t// bottom part of the new vnodes list, and we can use the `v.dom` value of the previous node\n\t// as the next sibling (cached in the `nextSibling` variable).\n\n\n\t// ## DOM node moves\n\t//\n\t// In most scenarios `updateNode()` and `createNode()` perform the DOM operations. However,\n\t// this is not the case if the node moved (second and fourth part of the diff algo). We move\n\t// the old DOM nodes before updateNode runs because it enables us to use the cached `nextSibling`\n\t// variable rather than fetching it using `getNextSibling()`.\n\n\tfunction updateNodes(parent, old, vnodes, hooks, nextSibling, ns) {\n\t\tif (old === vnodes || old == null && vnodes == null) return\n\t\telse if (old == null || old.length === 0) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, ns)\n\t\telse if (vnodes == null || vnodes.length === 0) removeNodes(parent, old, 0, old.length)\n\t\telse {\n\t\t\tvar isOldKeyed = old[0] != null && old[0].key != null\n\t\t\tvar isKeyed = vnodes[0] != null && vnodes[0].key != null\n\t\t\tvar start = 0, oldStart = 0\n\t\t\tif (!isOldKeyed) while (oldStart < old.length && old[oldStart] == null) oldStart++\n\t\t\tif (!isKeyed) while (start < vnodes.length && vnodes[start] == null) start++\n\t\t\tif (isOldKeyed !== isKeyed) {\n\t\t\t\tremoveNodes(parent, old, oldStart, old.length)\n\t\t\t\tcreateNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns)\n\t\t\t} else if (!isKeyed) {\n\t\t\t\t// Don't index past the end of either list (causes deopts).\n\t\t\t\tvar commonLength = old.length < vnodes.length ? old.length : vnodes.length\n\t\t\t\t// Rewind if necessary to the first non-null index on either side.\n\t\t\t\t// We could alternatively either explicitly create or remove nodes when `start !== oldStart`\n\t\t\t\t// but that would be optimizing for sparse lists which are more rare than dense ones.\n\t\t\t\tstart = start < oldStart ? start : oldStart\n\t\t\t\tfor (; start < commonLength; start++) {\n\t\t\t\t\to = old[start]\n\t\t\t\t\tv = vnodes[start]\n\t\t\t\t\tif (o === v || o == null && v == null) continue\n\t\t\t\t\telse if (o == null) createNode(parent, v, hooks, ns, getNextSibling(old, start + 1, nextSibling))\n\t\t\t\t\telse if (v == null) removeNode(parent, o)\n\t\t\t\t\telse updateNode(parent, o, v, hooks, getNextSibling(old, start + 1, nextSibling), ns)\n\t\t\t\t}\n\t\t\t\tif (old.length > commonLength) removeNodes(parent, old, start, old.length)\n\t\t\t\tif (vnodes.length > commonLength) createNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns)\n\t\t\t} else {\n\t\t\t\t// keyed diff\n\t\t\t\tvar oldEnd = old.length - 1, end = vnodes.length - 1, map, o, v, oe, ve, topSibling\n\n\t\t\t\t// bottom-up\n\t\t\t\twhile (oldEnd >= oldStart && end >= start) {\n\t\t\t\t\toe = old[oldEnd]\n\t\t\t\t\tve = vnodes[end]\n\t\t\t\t\tif (oe.key !== ve.key) break\n\t\t\t\t\tif (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns)\n\t\t\t\t\tif (ve.dom != null) nextSibling = ve.dom\n\t\t\t\t\toldEnd--, end--\n\t\t\t\t}\n\t\t\t\t// top-down\n\t\t\t\twhile (oldEnd >= oldStart && end >= start) {\n\t\t\t\t\to = old[oldStart]\n\t\t\t\t\tv = vnodes[start]\n\t\t\t\t\tif (o.key !== v.key) break\n\t\t\t\t\toldStart++, start++\n\t\t\t\t\tif (o !== v) updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), ns)\n\t\t\t\t}\n\t\t\t\t// swaps and list reversals\n\t\t\t\twhile (oldEnd >= oldStart && end >= start) {\n\t\t\t\t\tif (start === end) break\n\t\t\t\t\tif (o.key !== ve.key || oe.key !== v.key) break\n\t\t\t\t\ttopSibling = getNextSibling(old, oldStart, nextSibling)\n\t\t\t\t\tmoveDOM(parent, oe, topSibling)\n\t\t\t\t\tif (oe !== v) updateNode(parent, oe, v, hooks, topSibling, ns)\n\t\t\t\t\tif (++start <= --end) moveDOM(parent, o, nextSibling)\n\t\t\t\t\tif (o !== ve) updateNode(parent, o, ve, hooks, nextSibling, ns)\n\t\t\t\t\tif (ve.dom != null) nextSibling = ve.dom\n\t\t\t\t\toldStart++; oldEnd--\n\t\t\t\t\toe = old[oldEnd]\n\t\t\t\t\tve = vnodes[end]\n\t\t\t\t\to = old[oldStart]\n\t\t\t\t\tv = vnodes[start]\n\t\t\t\t}\n\t\t\t\t// bottom up once again\n\t\t\t\twhile (oldEnd >= oldStart && end >= start) {\n\t\t\t\t\tif (oe.key !== ve.key) break\n\t\t\t\t\tif (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns)\n\t\t\t\t\tif (ve.dom != null) nextSibling = ve.dom\n\t\t\t\t\toldEnd--, end--\n\t\t\t\t\toe = old[oldEnd]\n\t\t\t\t\tve = vnodes[end]\n\t\t\t\t}\n\t\t\t\tif (start > end) removeNodes(parent, old, oldStart, oldEnd + 1)\n\t\t\t\telse if (oldStart > oldEnd) createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns)\n\t\t\t\telse {\n\t\t\t\t\t// inspired by ivi https://github.com/ivijs/ivi/ by Boris Kaul\n\t\t\t\t\tvar originalNextSibling = nextSibling, vnodesLength = end - start + 1, oldIndices = new Array(vnodesLength), li=0, i=0, pos = 2147483647, matched = 0, map, lisIndices\n\t\t\t\t\tfor (i = 0; i < vnodesLength; i++) oldIndices[i] = -1\n\t\t\t\t\tfor (i = end; i >= start; i--) {\n\t\t\t\t\t\tif (map == null) map = getKeyMap(old, oldStart, oldEnd + 1)\n\t\t\t\t\t\tve = vnodes[i]\n\t\t\t\t\t\tvar oldIndex = map[ve.key]\n\t\t\t\t\t\tif (oldIndex != null) {\n\t\t\t\t\t\t\tpos = (oldIndex < pos) ? oldIndex : -1 // becomes -1 if nodes were re-ordered\n\t\t\t\t\t\t\toldIndices[i-start] = oldIndex\n\t\t\t\t\t\t\toe = old[oldIndex]\n\t\t\t\t\t\t\told[oldIndex] = null\n\t\t\t\t\t\t\tif (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns)\n\t\t\t\t\t\t\tif (ve.dom != null) nextSibling = ve.dom\n\t\t\t\t\t\t\tmatched++\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnextSibling = originalNextSibling\n\t\t\t\t\tif (matched !== oldEnd - oldStart + 1) removeNodes(parent, old, oldStart, oldEnd + 1)\n\t\t\t\t\tif (matched === 0) createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns)\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (pos === -1) {\n\t\t\t\t\t\t\t// the indices of the indices of the items that are part of the\n\t\t\t\t\t\t\t// longest increasing subsequence in the oldIndices list\n\t\t\t\t\t\t\tlisIndices = makeLisIndices(oldIndices)\n\t\t\t\t\t\t\tli = lisIndices.length - 1\n\t\t\t\t\t\t\tfor (i = end; i >= start; i--) {\n\t\t\t\t\t\t\t\tv = vnodes[i]\n\t\t\t\t\t\t\t\tif (oldIndices[i-start] === -1) createNode(parent, v, hooks, ns, nextSibling)\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tif (lisIndices[li] === i - start) li--\n\t\t\t\t\t\t\t\t\telse moveDOM(parent, v, nextSibling)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (v.dom != null) nextSibling = vnodes[i].dom\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfor (i = end; i >= start; i--) {\n\t\t\t\t\t\t\t\tv = vnodes[i]\n\t\t\t\t\t\t\t\tif (oldIndices[i-start] === -1) createNode(parent, v, hooks, ns, nextSibling)\n\t\t\t\t\t\t\t\tif (v.dom != null) nextSibling = vnodes[i].dom\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfunction updateNode(parent, old, vnode, hooks, nextSibling, ns) {\n\t\tvar oldTag = old.tag, tag = vnode.tag\n\t\tif (oldTag === tag && old.is === vnode.is) {\n\t\t\tvnode.state = old.state\n\t\t\tvnode.events = old.events\n\t\t\tif (shouldNotUpdate(vnode, old)) return\n\t\t\tif (typeof oldTag === \"string\") {\n\t\t\t\tif (vnode.attrs != null) {\n\t\t\t\t\tupdateLifecycle(vnode.attrs, vnode, hooks)\n\t\t\t\t}\n\t\t\t\tswitch (oldTag) {\n\t\t\t\t\tcase \"#\": updateText(old, vnode); break\n\t\t\t\t\tcase \"<\": updateHTML(parent, old, vnode, ns, nextSibling); break\n\t\t\t\t\tcase \"[\": updateFragment(parent, old, vnode, hooks, nextSibling, ns); break\n\t\t\t\t\tdefault: updateElement(old, vnode, hooks, ns)\n\t\t\t\t}\n\t\t\t}\n\t\t\telse updateComponent(parent, old, vnode, hooks, nextSibling, ns)\n\t\t}\n\t\telse {\n\t\t\tremoveNode(parent, old)\n\t\t\tcreateNode(parent, vnode, hooks, ns, nextSibling)\n\t\t}\n\t}\n\tfunction updateText(old, vnode) {\n\t\tif (old.children.toString() !== vnode.children.toString()) {\n\t\t\told.dom.nodeValue = vnode.children\n\t\t}\n\t\tvnode.dom = old.dom\n\t}\n\tfunction updateHTML(parent, old, vnode, ns, nextSibling) {\n\t\tif (old.children !== vnode.children) {\n\t\t\tremoveDOM(parent, old)\n\t\t\tcreateHTML(parent, vnode, ns, nextSibling)\n\t\t}\n\t\telse {\n\t\t\tvnode.dom = old.dom\n\t\t\tvnode.domSize = old.domSize\n\t\t}\n\t}\n\tfunction updateFragment(parent, old, vnode, hooks, nextSibling, ns) {\n\t\tupdateNodes(parent, old.children, vnode.children, hooks, nextSibling, ns)\n\t\tvar domSize = 0, children = vnode.children\n\t\tvnode.dom = null\n\t\tif (children != null) {\n\t\t\tfor (var i = 0; i < children.length; i++) {\n\t\t\t\tvar child = children[i]\n\t\t\t\tif (child != null && child.dom != null) {\n\t\t\t\t\tif (vnode.dom == null) vnode.dom = child.dom\n\t\t\t\t\tdomSize += child.domSize || 1\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvnode.domSize = domSize\n\t}\n\tfunction updateElement(old, vnode, hooks, ns) {\n\t\tvar element = vnode.dom = old.dom\n\t\tns = getNameSpace(vnode) || ns\n\n\t\tif (old.attrs != vnode.attrs || (vnode.attrs != null && !cachedAttrsIsStaticMap.get(vnode.attrs))) {\n\t\t\tupdateAttrs(vnode, old.attrs, vnode.attrs, ns)\n\t\t}\n\t\tif (!maybeSetContentEditable(vnode)) {\n\t\t\tupdateNodes(element, old.children, vnode.children, hooks, null, ns)\n\t\t}\n\t}\n\tfunction updateComponent(parent, old, vnode, hooks, nextSibling, ns) {\n\t\tvnode.instance = Vnode.normalize(callHook.call(vnode.state.view, vnode))\n\t\tif (vnode.instance === vnode) throw Error(\"A view cannot return the vnode it received as argument\")\n\t\tupdateLifecycle(vnode.state, vnode, hooks)\n\t\tif (vnode.attrs != null) updateLifecycle(vnode.attrs, vnode, hooks)\n\t\tif (vnode.instance != null) {\n\t\t\tif (old.instance == null) createNode(parent, vnode.instance, hooks, ns, nextSibling)\n\t\t\telse updateNode(parent, old.instance, vnode.instance, hooks, nextSibling, ns)\n\t\t\tvnode.dom = vnode.instance.dom\n\t\t\tvnode.domSize = vnode.instance.domSize\n\t\t}\n\t\telse {\n\t\t\tif (old.instance != null) removeNode(parent, old.instance)\n\t\t\tvnode.domSize = 0\n\t\t}\n\t}\n\tfunction getKeyMap(vnodes, start, end) {\n\t\tvar map = Object.create(null)\n\t\tfor (; start < end; start++) {\n\t\t\tvar vnode = vnodes[start]\n\t\t\tif (vnode != null) {\n\t\t\t\tvar key = vnode.key\n\t\t\t\tif (key != null) map[key] = start\n\t\t\t}\n\t\t}\n\t\treturn map\n\t}\n\t// Lifted from ivi https://github.com/ivijs/ivi/\n\t// takes a list of unique numbers (-1 is special and can\n\t// occur multiple times) and returns an array with the indices\n\t// of the items that are part of the longest increasing\n\t// subsequence\n\tvar lisTemp = []\n\tfunction makeLisIndices(a) {\n\t\tvar result = [0]\n\t\tvar u = 0, v = 0, i = 0\n\t\tvar il = lisTemp.length = a.length\n\t\tfor (var i = 0; i < il; i++) lisTemp[i] = a[i]\n\t\tfor (var i = 0; i < il; ++i) {\n\t\t\tif (a[i] === -1) continue\n\t\t\tvar j = result[result.length - 1]\n\t\t\tif (a[j] < a[i]) {\n\t\t\t\tlisTemp[i] = j\n\t\t\t\tresult.push(i)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tu = 0\n\t\t\tv = result.length - 1\n\t\t\twhile (u < v) {\n\t\t\t\t// Fast integer average without overflow.\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tvar c = (u >>> 1) + (v >>> 1) + (u & v & 1)\n\t\t\t\tif (a[result[c]] < a[i]) {\n\t\t\t\t\tu = c + 1\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tv = c\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (a[i] < a[result[u]]) {\n\t\t\t\tif (u > 0) lisTemp[i] = result[u - 1]\n\t\t\t\tresult[u] = i\n\t\t\t}\n\t\t}\n\t\tu = result.length\n\t\tv = result[u - 1]\n\t\twhile (u-- > 0) {\n\t\t\tresult[u] = v\n\t\t\tv = lisTemp[v]\n\t\t}\n\t\tlisTemp.length = 0\n\t\treturn result\n\t}\n\n\tfunction getNextSibling(vnodes, i, nextSibling) {\n\t\tfor (; i < vnodes.length; i++) {\n\t\t\tif (vnodes[i] != null && vnodes[i].dom != null) return vnodes[i].dom\n\t\t}\n\t\treturn nextSibling\n\t}\n\n\t// This handles fragments with zombie children (removed from vdom, but persisted in DOM through onbeforeremove)\n\tfunction moveDOM(parent, vnode, nextSibling) {\n\t\tif (vnode.dom != null) {\n\t\t\tvar target\n\t\t\tif (vnode.domSize == null || vnode.domSize === 1) {\n\t\t\t\t// don't allocate for the common case\n\t\t\t\ttarget = vnode.dom\n\t\t\t} else {\n\t\t\t\ttarget = getDocument(parent).createDocumentFragment()\n\t\t\t\tfor (var dom of domFor(vnode)) target.appendChild(dom)\n\t\t\t}\n\t\t\tinsertDOM(parent, target, nextSibling)\n\t\t}\n\t}\n\n\tfunction insertDOM(parent, dom, nextSibling) {\n\t\tif (nextSibling != null) parent.insertBefore(dom, nextSibling)\n\t\telse parent.appendChild(dom)\n\t}\n\n\tfunction maybeSetContentEditable(vnode) {\n\t\tif (vnode.attrs == null || (\n\t\t\tvnode.attrs.contenteditable == null && // attribute\n\t\t\tvnode.attrs.contentEditable == null // property\n\t\t)) return false\n\t\tvar children = vnode.children\n\t\tif (children != null && children.length === 1 && children[0].tag === \"<\") {\n\t\t\tvar content = children[0].children\n\t\t\tif (vnode.dom.innerHTML !== content) vnode.dom.innerHTML = content\n\t\t}\n\t\telse if (children != null && children.length !== 0) throw new Error(\"Child node of a contenteditable must be trusted.\")\n\t\treturn true\n\t}\n\n\t//remove\n\tfunction removeNodes(parent, vnodes, start, end) {\n\t\tfor (var i = start; i < end; i++) {\n\t\t\tvar vnode = vnodes[i]\n\t\t\tif (vnode != null) removeNode(parent, vnode)\n\t\t}\n\t}\n\tfunction tryBlockRemove(parent, vnode, source, counter) {\n\t\tvar original = vnode.state\n\t\tvar result = callHook.call(source.onbeforeremove, vnode)\n\t\tif (result == null) return\n\n\t\tvar generation = currentRender\n\t\tfor (var dom of domFor(vnode)) delayedRemoval.set(dom, generation)\n\t\tcounter.v++\n\n\t\tPromise.resolve(result).finally(function () {\n\t\t\tcheckState(vnode, original)\n\t\t\ttryResumeRemove(parent, vnode, counter)\n\t\t})\n\t}\n\tfunction tryResumeRemove(parent, vnode, counter) {\n\t\tif (--counter.v === 0) {\n\t\t\tonremove(vnode)\n\t\t\tremoveDOM(parent, vnode)\n\t\t}\n\t}\n\tfunction removeNode(parent, vnode) {\n\t\tvar counter = {v: 1}\n\t\tif (typeof vnode.tag !== \"string\" && typeof vnode.state.onbeforeremove === \"function\") tryBlockRemove(parent, vnode, vnode.state, counter)\n\t\tif (vnode.attrs && typeof vnode.attrs.onbeforeremove === \"function\") tryBlockRemove(parent, vnode, vnode.attrs, counter)\n\t\ttryResumeRemove(parent, vnode, counter)\n\t}\n\tfunction removeDOM(parent, vnode) {\n\t\tif (vnode.dom == null) return\n\t\tif (vnode.domSize == null || vnode.domSize === 1) {\n\t\t\tparent.removeChild(vnode.dom)\n\t\t} else {\n\t\t\tfor (var dom of domFor(vnode)) parent.removeChild(dom)\n\t\t}\n\t}\n\n\tfunction onremove(vnode) {\n\t\tif (typeof vnode.tag !== \"string\" && typeof vnode.state.onremove === \"function\") callHook.call(vnode.state.onremove, vnode)\n\t\tif (vnode.attrs && typeof vnode.attrs.onremove === \"function\") callHook.call(vnode.attrs.onremove, vnode)\n\t\tif (typeof vnode.tag !== \"string\") {\n\t\t\tif (vnode.instance != null) onremove(vnode.instance)\n\t\t} else {\n\t\t\tif (vnode.events != null) vnode.events._ = null\n\t\t\tvar children = vnode.children\n\t\t\tif (Array.isArray(children)) {\n\t\t\t\tfor (var i = 0; i < children.length; i++) {\n\t\t\t\t\tvar child = children[i]\n\t\t\t\t\tif (child != null) onremove(child)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t//attrs\n\tfunction setAttrs(vnode, attrs, ns) {\n\t\tfor (var key in attrs) {\n\t\t\tsetAttr(vnode, key, null, attrs[key], ns)\n\t\t}\n\t}\n\tfunction setAttr(vnode, key, old, value, ns) {\n\t\tif (key === \"key\" || value == null || isLifecycleMethod(key) || (old === value && !isFormAttribute(vnode, key)) && typeof value !== \"object\") return\n\t\tif (key[0] === \"o\" && key[1] === \"n\") return updateEvent(vnode, key, value)\n\t\tif (key.slice(0, 6) === \"xlink:\") vnode.dom.setAttributeNS(\"http://www.w3.org/1999/xlink\", key.slice(6), value)\n\t\telse if (key === \"style\") updateStyle(vnode.dom, old, value)\n\t\telse if (hasPropertyKey(vnode, key, ns)) {\n\t\t\tif (key === \"value\") {\n\t\t\t\t// Only do the coercion if we're actually going to check the value.\n\t\t\t\t/* eslint-disable no-implicit-coercion */\n\t\t\t\t//setting input[value] to same value by typing on focused element moves cursor to end in Chrome\n\t\t\t\t//setting input[type=file][value] to same value causes an error to be generated if it's non-empty\n\t\t\t\t//minlength/maxlength validation isn't performed on script-set values(#2256)\n\t\t\t\tif ((vnode.tag === \"input\" || vnode.tag === \"textarea\") && vnode.dom.value === \"\" + value) return\n\t\t\t\t//setting select[value] to same value while having select open blinks select dropdown in Chrome\n\t\t\t\tif (vnode.tag === \"select\" && old !== null && vnode.dom.value === \"\" + value) return\n\t\t\t\t//setting option[value] to same value while having select open blinks select dropdown in Chrome\n\t\t\t\tif (vnode.tag === \"option\" && old !== null && vnode.dom.value === \"\" + value) return\n\t\t\t\t//setting input[type=file][value] to different value is an error if it's non-empty\n\t\t\t\t// Not ideal, but it at least works around the most common source of uncaught exceptions for now.\n\t\t\t\tif (vnode.tag === \"input\" && vnode.attrs.type === \"file\" && \"\" + value !== \"\") { console.error(\"`value` is read-only on file inputs!\"); return }\n\t\t\t\t/* eslint-enable no-implicit-coercion */\n\t\t\t}\n\t\t\t// If you assign an input type that is not supported by IE 11 with an assignment expression, an error will occur.\n\t\t\tif (vnode.tag === \"input\" && key === \"type\") vnode.dom.setAttribute(key, value)\n\t\t\telse vnode.dom[key] = value\n\t\t} else {\n\t\t\tif (typeof value === \"boolean\") {\n\t\t\t\tif (value) vnode.dom.setAttribute(key, \"\")\n\t\t\t\telse vnode.dom.removeAttribute(key)\n\t\t\t}\n\t\t\telse vnode.dom.setAttribute(key === \"className\" ? \"class\" : key, value)\n\t\t}\n\t}\n\tfunction removeAttr(vnode, key, old, ns) {\n\t\tif (key === \"key\" || old == null || isLifecycleMethod(key)) return\n\t\tif (key[0] === \"o\" && key[1] === \"n\") updateEvent(vnode, key, undefined)\n\t\telse if (key === \"style\") updateStyle(vnode.dom, old, null)\n\t\telse if (\n\t\t\thasPropertyKey(vnode, key, ns)\n\t\t\t&& key !== \"className\"\n\t\t\t&& key !== \"title\" // creates \"null\" as title\n\t\t\t&& !(key === \"value\" && (\n\t\t\t\tvnode.tag === \"option\"\n\t\t\t\t|| vnode.tag === \"select\" && vnode.dom.selectedIndex === -1 && vnode.dom === activeElement(vnode.dom)\n\t\t\t))\n\t\t\t&& !(vnode.tag === \"input\" && key === \"type\")\n\t\t) {\n\t\t\tvnode.dom[key] = null\n\t\t} else {\n\t\t\tvar nsLastIndex = key.indexOf(\":\")\n\t\t\tif (nsLastIndex !== -1) key = key.slice(nsLastIndex + 1)\n\t\t\tif (old !== false) vnode.dom.removeAttribute(key === \"className\" ? \"class\" : key)\n\t\t}\n\t}\n\tfunction setLateSelectAttrs(vnode, attrs) {\n\t\tif (\"value\" in attrs) {\n\t\t\tif(attrs.value === null) {\n\t\t\t\tif (vnode.dom.selectedIndex !== -1) vnode.dom.value = null\n\t\t\t} else {\n\t\t\t\tvar normalized = \"\" + attrs.value // eslint-disable-line no-implicit-coercion\n\t\t\t\tif (vnode.dom.value !== normalized || vnode.dom.selectedIndex === -1) {\n\t\t\t\t\tvnode.dom.value = normalized\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (\"selectedIndex\" in attrs) setAttr(vnode, \"selectedIndex\", null, attrs.selectedIndex, undefined)\n\t}\n\tfunction updateAttrs(vnode, old, attrs, ns) {\n\t\t// Some attributes may NOT be case-sensitive (e.g. data-***),\n\t\t// so removal should be done first to prevent accidental removal for newly setting values.\n\t\tvar val\n\t\tif (old != null) {\n\t\t\tif (old === attrs && !cachedAttrsIsStaticMap.has(attrs)) {\n\t\t\t\tconsole.warn(\"Don't reuse attrs object, use new object for every redraw, this will throw in next major\")\n\t\t\t}\n\t\t\tfor (var key in old) {\n\t\t\t\tif (((val = old[key]) != null) && (attrs == null || attrs[key] == null)) {\n\t\t\t\t\tremoveAttr(vnode, key, val, ns)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (attrs != null) {\n\t\t\tfor (var key in attrs) {\n\t\t\t\tsetAttr(vnode, key, old && old[key], attrs[key], ns)\n\t\t\t}\n\t\t}\n\t}\n\tfunction isFormAttribute(vnode, attr) {\n\t\treturn attr === \"value\" || attr === \"checked\" || attr === \"selectedIndex\" || attr === \"selected\" && (vnode.dom === activeElement(vnode.dom) || vnode.tag === \"option\" && vnode.dom.parentNode === activeElement(vnode.dom))\n\t}\n\tfunction isLifecycleMethod(attr) {\n\t\treturn attr === \"oninit\" || attr === \"oncreate\" || attr === \"onupdate\" || attr === \"onremove\" || attr === \"onbeforeremove\" || attr === \"onbeforeupdate\"\n\t}\n\tfunction hasPropertyKey(vnode, key, ns) {\n\t\t// Filter out namespaced keys\n\t\treturn ns === undefined && (\n\t\t\t// If it's a custom element, just keep it.\n\t\t\tvnode.tag.indexOf(\"-\") > -1 || vnode.is ||\n\t\t\t// If it's a normal element, let's try to avoid a few browser bugs.\n\t\t\tkey !== \"href\" && key !== \"list\" && key !== \"form\" && key !== \"width\" && key !== \"height\"// && key !== \"type\"\n\t\t\t// Defer the property check until *after* we check everything.\n\t\t) && key in vnode.dom\n\t}\n\n\t//style\n\tfunction updateStyle(element, old, style) {\n\t\tif (old === style) {\n\t\t\t// Styles are equivalent, do nothing.\n\t\t} else if (style == null) {\n\t\t\t// New style is missing, just clear it.\n\t\t\telement.style = \"\"\n\t\t} else if (typeof style !== \"object\") {\n\t\t\t// New style is a string, let engine deal with patching.\n\t\t\telement.style = style\n\t\t} else if (old == null || typeof old !== \"object\") {\n\t\t\t// `old` is missing or a string, `style` is an object.\n\t\t\telement.style = \"\"\n\t\t\t// Add new style properties\n\t\t\tfor (var key in style) {\n\t\t\t\tvar value = style[key]\n\t\t\t\tif (value != null) {\n\t\t\t\t\tif (key.includes(\"-\")) element.style.setProperty(key, String(value))\n\t\t\t\t\telse element.style[key] = String(value)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Both old & new are (different) objects.\n\t\t\t// Remove style properties that no longer exist\n\t\t\t// Style properties may have two cases(dash-case and camelCase),\n\t\t\t// so removal should be done first to prevent accidental removal for newly setting values.\n\t\t\tfor (var key in old) {\n\t\t\t\tif (old[key] != null && style[key] == null) {\n\t\t\t\t\tif (key.includes(\"-\")) element.style.removeProperty(key)\n\t\t\t\t\telse element.style[key] = \"\"\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Update style properties that have changed\n\t\t\tfor (var key in style) {\n\t\t\t\tvar value = style[key]\n\t\t\t\tif (value != null && (value = String(value)) !== String(old[key])) {\n\t\t\t\t\tif (key.includes(\"-\")) element.style.setProperty(key, value)\n\t\t\t\t\telse element.style[key] = value\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Here's an explanation of how this works:\n\t// 1. The event names are always (by design) prefixed by `on`.\n\t// 2. The EventListener interface accepts either a function or an object\n\t// with a `handleEvent` method.\n\t// 3. The object does not inherit from `Object.prototype`, to avoid\n\t// any potential interference with that (e.g. setters).\n\t// 4. The event name is remapped to the handler before calling it.\n\t// 5. In function-based event handlers, `ev.target === this`. We replicate\n\t// that below.\n\t// 6. In function-based event handlers, `return false` prevents the default\n\t// action and stops event propagation. We replicate that below.\n\tfunction EventDict() {\n\t\t// Save this, so the current redraw is correctly tracked.\n\t\tthis._ = currentRedraw\n\t}\n\tEventDict.prototype = Object.create(null)\n\tEventDict.prototype.handleEvent = function (ev) {\n\t\tvar handler = this[\"on\" + ev.type]\n\t\tvar result\n\t\tif (typeof handler === \"function\") result = handler.call(ev.currentTarget, ev)\n\t\telse if (typeof handler.handleEvent === \"function\") handler.handleEvent(ev)\n\t\tvar self = this\n\t\tif (self._ != null) {\n\t\t\tif (ev.redraw !== false) (0, self._)()\n\t\t\tif (result != null && typeof result.then === \"function\") {\n\t\t\t\tPromise.resolve(result).then(function () {\n\t\t\t\t\tif (self._ != null && ev.redraw !== false) (0, self._)()\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tif (result === false) {\n\t\t\tev.preventDefault()\n\t\t\tev.stopPropagation()\n\t\t}\n\t}\n\n\t//event\n\tfunction updateEvent(vnode, key, value) {\n\t\tif (vnode.events != null) {\n\t\t\tvnode.events._ = currentRedraw\n\t\t\tif (vnode.events[key] === value) return\n\t\t\tif (value != null && (typeof value === \"function\" || typeof value === \"object\")) {\n\t\t\t\tif (vnode.events[key] == null) vnode.dom.addEventListener(key.slice(2), vnode.events, false)\n\t\t\t\tvnode.events[key] = value\n\t\t\t} else {\n\t\t\t\tif (vnode.events[key] != null) vnode.dom.removeEventListener(key.slice(2), vnode.events, false)\n\t\t\t\tvnode.events[key] = undefined\n\t\t\t}\n\t\t} else if (value != null && (typeof value === \"function\" || typeof value === \"object\")) {\n\t\t\tvnode.events = new EventDict()\n\t\t\tvnode.dom.addEventListener(key.slice(2), vnode.events, false)\n\t\t\tvnode.events[key] = value\n\t\t}\n\t}\n\n\t//lifecycle\n\tfunction initLifecycle(source, vnode, hooks) {\n\t\tif (typeof source.oninit === \"function\") callHook.call(source.oninit, vnode)\n\t\tif (typeof source.oncreate === \"function\") hooks.push(callHook.bind(source.oncreate, vnode))\n\t}\n\tfunction updateLifecycle(source, vnode, hooks) {\n\t\tif (typeof source.onupdate === \"function\") hooks.push(callHook.bind(source.onupdate, vnode))\n\t}\n\tfunction shouldNotUpdate(vnode, old) {\n\t\tdo {\n\t\t\tif (vnode.attrs != null && typeof vnode.attrs.onbeforeupdate === \"function\") {\n\t\t\t\tvar force = callHook.call(vnode.attrs.onbeforeupdate, vnode, old)\n\t\t\t\tif (force !== undefined && !force) break\n\t\t\t}\n\t\t\tif (typeof vnode.tag !== \"string\" && typeof vnode.state.onbeforeupdate === \"function\") {\n\t\t\t\tvar force = callHook.call(vnode.state.onbeforeupdate, vnode, old)\n\t\t\t\tif (force !== undefined && !force) break\n\t\t\t}\n\t\t\treturn false\n\t\t} while (false); // eslint-disable-line no-constant-condition\n\t\tvnode.dom = old.dom\n\t\tvnode.domSize = old.domSize\n\t\tvnode.instance = old.instance\n\t\t// One would think having the actual latest attributes would be ideal,\n\t\t// but it doesn't let us properly diff based on our current internal\n\t\t// representation. We have to save not only the old DOM info, but also\n\t\t// the attributes used to create it, as we diff *that*, not against the\n\t\t// DOM directly (with a few exceptions in `setAttr`). And, of course, we\n\t\t// need to save the children and text as they are conceptually not\n\t\t// unlike special \"attributes\" internally.\n\t\tvnode.attrs = old.attrs\n\t\tvnode.children = old.children\n\t\tvnode.text = old.text\n\t\treturn true\n\t}\n\n\tvar currentDOM\n\n\treturn function(dom, vnodes, redraw) {\n\t\tif (!dom) throw new TypeError(\"DOM element being rendered to does not exist.\")\n\t\tif (currentDOM != null && dom.contains(currentDOM)) {\n\t\t\tthrow new TypeError(\"Node is currently being rendered to and thus is locked.\")\n\t\t}\n\t\tvar prevRedraw = currentRedraw\n\t\tvar prevDOM = currentDOM\n\t\tvar hooks = []\n\t\tvar active = activeElement(dom)\n\t\tvar namespace = dom.namespaceURI\n\n\t\tcurrentDOM = dom\n\t\tcurrentRedraw = typeof redraw === \"function\" ? redraw : undefined\n\t\tcurrentRender = {}\n\t\ttry {\n\t\t\t// First time rendering into a node clears it out\n\t\t\tif (dom.vnodes == null) dom.textContent = \"\"\n\t\t\tvnodes = Vnode.normalizeChildren(Array.isArray(vnodes) ? vnodes : [vnodes])\n\t\t\tupdateNodes(dom, dom.vnodes, vnodes, hooks, null, namespace === \"http://www.w3.org/1999/xhtml\" ? undefined : namespace)\n\t\t\tdom.vnodes = vnodes\n\t\t\t// `document.activeElement` can return null: https://html.spec.whatwg.org/multipage/interaction.html#dom-document-activeelement\n\t\t\tif (active != null && activeElement(dom) !== active && typeof active.focus === \"function\") active.focus()\n\t\t\tfor (var i = 0; i < hooks.length; i++) hooks[i]()\n\t\t} finally {\n\t\t\tcurrentRedraw = prevRedraw\n\t\t\tcurrentDOM = prevDOM\n\t\t}\n\t}\n}\n","\"use strict\"\n\nmodule.exports = require(\"./render/render\")()\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\n\nmodule.exports = function(render, schedule, console) {\n\tvar subscriptions = []\n\tvar pending = false\n\tvar offset = -1\n\n\tfunction sync() {\n\t\tfor (offset = 0; offset < subscriptions.length; offset += 2) {\n\t\t\ttry { render(subscriptions[offset], Vnode(subscriptions[offset + 1]), redraw) }\n\t\t\tcatch (e) { console.error(e) }\n\t\t}\n\t\toffset = -1\n\t}\n\n\tfunction redraw() {\n\t\tif (!pending) {\n\t\t\tpending = true\n\t\t\tschedule(function() {\n\t\t\t\tpending = false\n\t\t\t\tsync()\n\t\t\t})\n\t\t}\n\t}\n\n\tredraw.sync = sync\n\n\tfunction mount(root, component) {\n\t\tif (component != null && component.view == null && typeof component !== \"function\") {\n\t\t\tthrow new TypeError(\"m.mount expects a component, not a vnode.\")\n\t\t}\n\n\t\tvar index = subscriptions.indexOf(root)\n\t\tif (index >= 0) {\n\t\t\tsubscriptions.splice(index, 2)\n\t\t\tif (index <= offset) offset -= 2\n\t\t\trender(root, [])\n\t\t}\n\n\t\tif (component != null) {\n\t\t\tsubscriptions.push(root, component)\n\t\t\trender(root, Vnode(component), redraw)\n\t\t}\n\t}\n\n\treturn {mount: mount, redraw: redraw}\n}\n","\"use strict\"\n\nvar render = require(\"./render\")\n\nmodule.exports = require(\"./api/mount-redraw\")(render, typeof requestAnimationFrame !== \"undefined\" ? requestAnimationFrame : null, typeof console !== \"undefined\" ? console : null)\n","\"use strict\"\n\nmodule.exports = function(object) {\n\tif (Object.prototype.toString.call(object) !== \"[object Object]\") return \"\"\n\n\tvar args = []\n\tfor (var key in object) {\n\t\tdestructure(key, object[key])\n\t}\n\n\treturn args.join(\"&\")\n\n\tfunction destructure(key, value) {\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (var i = 0; i < value.length; i++) {\n\t\t\t\tdestructure(key + \"[\" + i + \"]\", value[i])\n\t\t\t}\n\t\t}\n\t\telse if (Object.prototype.toString.call(value) === \"[object Object]\") {\n\t\t\tfor (var i in value) {\n\t\t\t\tdestructure(key + \"[\" + i + \"]\", value[i])\n\t\t\t}\n\t\t}\n\t\telse args.push(encodeURIComponent(key) + (value != null && value !== \"\" ? \"=\" + encodeURIComponent(value) : \"\"))\n\t}\n}\n","\"use strict\"\n\nvar buildQueryString = require(\"../querystring/build\")\n\n// Returns `path` from `template` + `params`\nmodule.exports = function(template, params) {\n\tif ((/:([^\\/\\.-]+)(\\.{3})?:/).test(template)) {\n\t\tthrow new SyntaxError(\"Template parameter names must be separated by either a '/', '-', or '.'.\")\n\t}\n\tif (params == null) return template\n\tvar queryIndex = template.indexOf(\"?\")\n\tvar hashIndex = template.indexOf(\"#\")\n\tvar queryEnd = hashIndex < 0 ? template.length : hashIndex\n\tvar pathEnd = queryIndex < 0 ? queryEnd : queryIndex\n\tvar path = template.slice(0, pathEnd)\n\tvar query = {}\n\n\tObject.assign(query, params)\n\n\tvar resolved = path.replace(/:([^\\/\\.-]+)(\\.{3})?/g, function(m, key, variadic) {\n\t\tdelete query[key]\n\t\t// If no such parameter exists, don't interpolate it.\n\t\tif (params[key] == null) return m\n\t\t// Escape normal parameters, but not variadic ones.\n\t\treturn variadic ? params[key] : encodeURIComponent(String(params[key]))\n\t})\n\n\t// In case the template substitution adds new query/hash parameters.\n\tvar newQueryIndex = resolved.indexOf(\"?\")\n\tvar newHashIndex = resolved.indexOf(\"#\")\n\tvar newQueryEnd = newHashIndex < 0 ? resolved.length : newHashIndex\n\tvar newPathEnd = newQueryIndex < 0 ? newQueryEnd : newQueryIndex\n\tvar result = resolved.slice(0, newPathEnd)\n\n\tif (queryIndex >= 0) result += template.slice(queryIndex, queryEnd)\n\tif (newQueryIndex >= 0) result += (queryIndex < 0 ? \"?\" : \"&\") + resolved.slice(newQueryIndex, newQueryEnd)\n\tvar querystring = buildQueryString(query)\n\tif (querystring) result += (queryIndex < 0 && newQueryIndex < 0 ? \"?\" : \"&\") + querystring\n\tif (hashIndex >= 0) result += template.slice(hashIndex)\n\tif (newHashIndex >= 0) result += (hashIndex < 0 ? \"\" : \"&\") + resolved.slice(newHashIndex)\n\treturn result\n}\n","\"use strict\"\n\nvar buildPathname = require(\"../pathname/build\")\nvar hasOwn = require(\"../util/hasOwn\")\n\nmodule.exports = function($window, oncompletion) {\n\tfunction PromiseProxy(executor) {\n\t\treturn new Promise(executor)\n\t}\n\n\tfunction makeRequest(url, args) {\n\t\treturn new Promise(function(resolve, reject) {\n\t\t\turl = buildPathname(url, args.params)\n\t\t\tvar method = args.method != null ? args.method.toUpperCase() : \"GET\"\n\t\t\tvar body = args.body\n\t\t\tvar assumeJSON = (args.serialize == null || args.serialize === JSON.serialize) && !(body instanceof $window.FormData || body instanceof $window.URLSearchParams)\n\t\t\tvar responseType = args.responseType || (typeof args.extract === \"function\" ? \"\" : \"json\")\n\n\t\t\tvar xhr = new $window.XMLHttpRequest(), aborted = false, isTimeout = false\n\t\t\tvar original = xhr, replacedAbort\n\t\t\tvar abort = xhr.abort\n\n\t\t\txhr.abort = function() {\n\t\t\t\taborted = true\n\t\t\t\tabort.call(this)\n\t\t\t}\n\n\t\t\txhr.open(method, url, args.async !== false, typeof args.user === \"string\" ? args.user : undefined, typeof args.password === \"string\" ? args.password : undefined)\n\n\t\t\tif (assumeJSON && body != null && !hasHeader(args, \"content-type\")) {\n\t\t\t\txhr.setRequestHeader(\"Content-Type\", \"application/json; charset=utf-8\")\n\t\t\t}\n\t\t\tif (typeof args.deserialize !== \"function\" && !hasHeader(args, \"accept\")) {\n\t\t\t\txhr.setRequestHeader(\"Accept\", \"application/json, text/*\")\n\t\t\t}\n\t\t\tif (args.withCredentials) xhr.withCredentials = args.withCredentials\n\t\t\tif (args.timeout) xhr.timeout = args.timeout\n\t\t\txhr.responseType = responseType\n\n\t\t\tfor (var key in args.headers) {\n\t\t\t\tif (hasOwn.call(args.headers, key)) {\n\t\t\t\t\txhr.setRequestHeader(key, args.headers[key])\n\t\t\t\t}\n\t\t\t}\n\n\t\t\txhr.onreadystatechange = function(ev) {\n\t\t\t\t// Don't throw errors on xhr.abort().\n\t\t\t\tif (aborted) return\n\n\t\t\t\tif (ev.target.readyState === 4) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar success = (ev.target.status >= 200 && ev.target.status < 300) || ev.target.status === 304 || (/^file:\\/\\//i).test(url)\n\t\t\t\t\t\t// When the response type isn't \"\" or \"text\",\n\t\t\t\t\t\t// `xhr.responseText` is the wrong thing to use.\n\t\t\t\t\t\t// Browsers do the right thing and throw here, and we\n\t\t\t\t\t\t// should honor that and do the right thing by\n\t\t\t\t\t\t// preferring `xhr.response` where possible/practical.\n\t\t\t\t\t\tvar response = ev.target.response, message\n\n\t\t\t\t\t\tif (responseType === \"json\") {\n\t\t\t\t\t\t\t// For IE and Edge, which don't implement\n\t\t\t\t\t\t\t// `responseType: \"json\"`.\n\t\t\t\t\t\t\tif (!ev.target.responseType && typeof args.extract !== \"function\") {\n\t\t\t\t\t\t\t\t// Handle no-content which will not parse.\n\t\t\t\t\t\t\t\ttry { response = JSON.parse(ev.target.responseText) }\n\t\t\t\t\t\t\t\tcatch (e) { response = null }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (!responseType || responseType === \"text\") {\n\t\t\t\t\t\t\t// Only use this default if it's text. If a parsed\n\t\t\t\t\t\t\t// document is needed on old IE and friends (all\n\t\t\t\t\t\t\t// unsupported), the user should use a custom\n\t\t\t\t\t\t\t// `config` instead. They're already using this at\n\t\t\t\t\t\t\t// their own risk.\n\t\t\t\t\t\t\tif (response == null) response = ev.target.responseText\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (typeof args.extract === \"function\") {\n\t\t\t\t\t\t\tresponse = args.extract(ev.target, args)\n\t\t\t\t\t\t\tsuccess = true\n\t\t\t\t\t\t} else if (typeof args.deserialize === \"function\") {\n\t\t\t\t\t\t\tresponse = args.deserialize(response)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (success) {\n\t\t\t\t\t\t\tif (typeof args.type === \"function\") {\n\t\t\t\t\t\t\t\tif (Array.isArray(response)) {\n\t\t\t\t\t\t\t\t\tfor (var i = 0; i < response.length; i++) {\n\t\t\t\t\t\t\t\t\t\tresponse[i] = new args.type(response[i])\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse response = new args.type(response)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresolve(response)\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tvar completeErrorResponse = function() {\n\t\t\t\t\t\t\t\ttry { message = ev.target.responseText }\n\t\t\t\t\t\t\t\tcatch (e) { message = response }\n\t\t\t\t\t\t\t\tvar error = new Error(message)\n\t\t\t\t\t\t\t\terror.code = ev.target.status\n\t\t\t\t\t\t\t\terror.response = response\n\t\t\t\t\t\t\t\treject(error)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (xhr.status === 0) {\n\t\t\t\t\t\t\t\t// Use setTimeout to push this code block onto the event queue\n\t\t\t\t\t\t\t\t// This allows `xhr.ontimeout` to run in the case that there is a timeout\n\t\t\t\t\t\t\t\t// Without this setTimeout, `xhr.ontimeout` doesn't have a chance to reject\n\t\t\t\t\t\t\t\t// as `xhr.onreadystatechange` will run before it\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tif (isTimeout) return\n\t\t\t\t\t\t\t\t\tcompleteErrorResponse()\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t} else completeErrorResponse()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch (e) {\n\t\t\t\t\t\treject(e)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\txhr.ontimeout = function (ev) {\n\t\t\t\tisTimeout = true\n\t\t\t\tvar error = new Error(\"Request timed out\")\n\t\t\t\terror.code = ev.target.status\n\t\t\t\treject(error)\n\t\t\t}\n\n\t\t\tif (typeof args.config === \"function\") {\n\t\t\t\txhr = args.config(xhr, args, url) || xhr\n\n\t\t\t\t// Propagate the `abort` to any replacement XHR as well.\n\t\t\t\tif (xhr !== original) {\n\t\t\t\t\treplacedAbort = xhr.abort\n\t\t\t\t\txhr.abort = function() {\n\t\t\t\t\t\taborted = true\n\t\t\t\t\t\treplacedAbort.call(this)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (body == null) xhr.send()\n\t\t\telse if (typeof args.serialize === \"function\") xhr.send(args.serialize(body))\n\t\t\telse if (body instanceof $window.FormData || body instanceof $window.URLSearchParams) xhr.send(body)\n\t\t\telse xhr.send(JSON.stringify(body))\n\t\t})\n\t}\n\n\t// In case the global Promise is some userland library's where they rely on\n\t// `foo instanceof this.constructor`, `this.constructor.resolve(value)`, or\n\t// similar. Let's *not* break them.\n\tPromiseProxy.prototype = Promise.prototype\n\tPromiseProxy.__proto__ = Promise // eslint-disable-line no-proto\n\n\tfunction hasHeader(args, name) {\n\t\tfor (var key in args.headers) {\n\t\t\tif (hasOwn.call(args.headers, key) && key.toLowerCase() === name) return true\n\t\t}\n\t\treturn false\n\t}\n\n\treturn {\n\t\trequest: function(url, args) {\n\t\t\tif (typeof url !== \"string\") { args = url; url = url.url }\n\t\t\telse if (args == null) args = {}\n\t\t\tvar promise = makeRequest(url, args)\n\t\t\tif (args.background === true) return promise\n\t\t\tvar count = 0\n\t\t\tfunction complete() {\n\t\t\t\tif (--count === 0 && typeof oncompletion === \"function\") oncompletion()\n\t\t\t}\n\n\t\t\treturn wrap(promise)\n\n\t\t\tfunction wrap(promise) {\n\t\t\t\tvar then = promise.then\n\t\t\t\t// Set the constructor, so engines know to not await or resolve\n\t\t\t\t// this as a native promise. At the time of writing, this is\n\t\t\t\t// only necessary for V8, but their behavior is the correct\n\t\t\t\t// behavior per spec. See this spec issue for more details:\n\t\t\t\t// https://github.com/tc39/ecma262/issues/1577. Also, see the\n\t\t\t\t// corresponding comment in `request/tests/test-request.js` for\n\t\t\t\t// a bit more background on the issue at hand.\n\t\t\t\tpromise.constructor = PromiseProxy\n\t\t\t\tpromise.then = function() {\n\t\t\t\t\tcount++\n\t\t\t\t\tvar next = then.apply(promise, arguments)\n\t\t\t\t\tnext.then(complete, function(e) {\n\t\t\t\t\t\tcomplete()\n\t\t\t\t\t\tif (count === 0) throw e\n\t\t\t\t\t})\n\t\t\t\t\treturn wrap(next)\n\t\t\t\t}\n\t\t\t\treturn promise\n\t\t\t}\n\t\t}\n\t}\n}\n","\"use strict\"\n\nvar mountRedraw = require(\"./mount-redraw\")\n\nmodule.exports = require(\"./request/request\")(typeof window !== \"undefined\" ? window : null, mountRedraw.redraw)\n","\"use strict\"\n\n/*\nPercent encodings encode UTF-8 bytes, so this regexp needs to match that.\nHere's how UTF-8 encodes stuff:\n- `00-7F`: 1-byte, for U+0000-U+007F\n- `C2-DF 80-BF`: 2-byte, for U+0080-U+07FF\n- `E0-EF 80-BF 80-BF`: 3-byte, encodes U+0800-U+FFFF\n- `F0-F4 80-BF 80-BF 80-BF`: 4-byte, encodes U+10000-U+10FFFF\nIn this, there's a number of invalid byte sequences:\n- `80-BF`: Continuation byte, invalid as start\n- `C0-C1 80-BF`: Overlong encoding for U+0000-U+007F\n- `E0 80-9F 80-BF`: Overlong encoding for U+0080-U+07FF\n- `ED A0-BF 80-BF`: Encoding for UTF-16 surrogate U+D800-U+DFFF\n- `F0 80-8F 80-BF 80-BF`: Overlong encoding for U+0800-U+FFFF\n- `F4 90-BF`: RFC 3629 restricted UTF-8 to only code points UTF-16 could encode.\n- `F5-FF`: RFC 3629 restricted UTF-8 to only code points UTF-16 could encode.\nSo in reality, only the following sequences can encode are valid characters:\n- 00-7F\n- C2-DF 80-BF\n- E0 A0-BF 80-BF\n- E1-EC 80-BF 80-BF\n- ED 80-9F 80-BF\n- EE-EF 80-BF 80-BF\n- F0 90-BF 80-BF 80-BF\n- F1-F3 80-BF 80-BF 80-BF\n- F4 80-8F 80-BF 80-BF\n\nThe regexp just tries to match this as compactly as possible.\n*/\nvar validUtf8Encodings = /%(?:[0-7]|(?!c[01]|e0%[89]|ed%[ab]|f0%8|f4%[9ab])(?:c|d|(?:e|f[0-4]%[89ab])[\\da-f]%[89ab])[\\da-f]%[89ab])[\\da-f]/gi\n\nmodule.exports = function(str) {\n\treturn String(str).replace(validUtf8Encodings, decodeURIComponent)\n}\n","\"use strict\"\n\nvar decodeURIComponentSafe = require(\"../util/decodeURIComponentSafe\")\n\nmodule.exports = function(string) {\n\tif (string === \"\" || string == null) return {}\n\tif (string.charAt(0) === \"?\") string = string.slice(1)\n\n\tvar entries = string.split(\"&\"), counters = {}, data = {}\n\tfor (var i = 0; i < entries.length; i++) {\n\t\tvar entry = entries[i].split(\"=\")\n\t\tvar key = decodeURIComponentSafe(entry[0])\n\t\tvar value = entry.length === 2 ? decodeURIComponentSafe(entry[1]) : \"\"\n\n\t\tif (value === \"true\") value = true\n\t\telse if (value === \"false\") value = false\n\n\t\tvar levels = key.split(/\\]\\[?|\\[/)\n\t\tvar cursor = data\n\t\tif (key.indexOf(\"[\") > -1) levels.pop()\n\t\tfor (var j = 0; j < levels.length; j++) {\n\t\t\tvar level = levels[j], nextLevel = levels[j + 1]\n\t\t\tvar isNumber = nextLevel == \"\" || !isNaN(parseInt(nextLevel, 10))\n\t\t\tif (level === \"\") {\n\t\t\t\tvar key = levels.slice(0, j).join()\n\t\t\t\tif (counters[key] == null) {\n\t\t\t\t\tcounters[key] = Array.isArray(cursor) ? cursor.length : 0\n\t\t\t\t}\n\t\t\t\tlevel = counters[key]++\n\t\t\t}\n\t\t\t// Disallow direct prototype pollution\n\t\t\telse if (level === \"__proto__\") break\n\t\t\tif (j === levels.length - 1) cursor[level] = value\n\t\t\telse {\n\t\t\t\t// Read own properties exclusively to disallow indirect\n\t\t\t\t// prototype pollution\n\t\t\t\tvar desc = Object.getOwnPropertyDescriptor(cursor, level)\n\t\t\t\tif (desc != null) desc = desc.value\n\t\t\t\tif (desc == null) cursor[level] = desc = isNumber ? [] : {}\n\t\t\t\tcursor = desc\n\t\t\t}\n\t\t}\n\t}\n\treturn data\n}\n","\"use strict\"\n\nvar parseQueryString = require(\"../querystring/parse\")\n\n// Returns `{path, params}` from `url`\nmodule.exports = function(url) {\n\tvar queryIndex = url.indexOf(\"?\")\n\tvar hashIndex = url.indexOf(\"#\")\n\tvar queryEnd = hashIndex < 0 ? url.length : hashIndex\n\tvar pathEnd = queryIndex < 0 ? queryEnd : queryIndex\n\tvar path = url.slice(0, pathEnd).replace(/\\/{2,}/g, \"/\")\n\n\tif (!path) path = \"/\"\n\telse {\n\t\tif (path[0] !== \"/\") path = \"/\" + path\n\t}\n\treturn {\n\t\tpath: path,\n\t\tparams: queryIndex < 0\n\t\t\t? {}\n\t\t\t: parseQueryString(url.slice(queryIndex + 1, queryEnd)),\n\t}\n}\n","\"use strict\"\n\nvar parsePathname = require(\"./parse\")\n\n// Compiles a template into a function that takes a resolved path (without query\n// strings) and returns an object containing the template parameters with their\n// parsed values. This expects the input of the compiled template to be the\n// output of `parsePathname`. Note that it does *not* remove query parameters\n// specified in the template.\nmodule.exports = function(template) {\n\tvar templateData = parsePathname(template)\n\tvar templateKeys = Object.keys(templateData.params)\n\tvar keys = []\n\tvar regexp = new RegExp(\"^\" + templateData.path.replace(\n\t\t// I escape literal text so people can use things like `:file.:ext` or\n\t\t// `:lang-:locale` in routes. This is all merged into one pass so I\n\t\t// don't also accidentally escape `-` and make it harder to detect it to\n\t\t// ban it from template parameters.\n\t\t/:([^\\/.-]+)(\\.{3}|\\.(?!\\.)|-)?|[\\\\^$*+.()|\\[\\]{}]/g,\n\t\tfunction(m, key, extra) {\n\t\t\tif (key == null) return \"\\\\\" + m\n\t\t\tkeys.push({k: key, r: extra === \"...\"})\n\t\t\tif (extra === \"...\") return \"(.*)\"\n\t\t\tif (extra === \".\") return \"([^/]+)\\\\.\"\n\t\t\treturn \"([^/]+)\" + (extra || \"\")\n\t\t}\n\t) + \"\\\\/?$\")\n\treturn function(data) {\n\t\t// First, check the params. Usually, there isn't any, and it's just\n\t\t// checking a static set.\n\t\tfor (var i = 0; i < templateKeys.length; i++) {\n\t\t\tif (templateData.params[templateKeys[i]] !== data.params[templateKeys[i]]) return false\n\t\t}\n\t\t// If no interpolations exist, let's skip all the ceremony\n\t\tif (!keys.length) return regexp.test(data.path)\n\t\tvar values = regexp.exec(data.path)\n\t\tif (values == null) return false\n\t\tfor (var i = 0; i < keys.length; i++) {\n\t\t\tdata.params[keys[i].k] = keys[i].r ? values[i + 1] : decodeURIComponent(values[i + 1])\n\t\t}\n\t\treturn true\n\t}\n}\n","\"use strict\"\n\n// Note: this is mildly perf-sensitive.\n//\n// It does *not* use `delete` - dynamic `delete`s usually cause objects to bail\n// out into dictionary mode and just generally cause a bunch of optimization\n// issues within engines.\n//\n// Ideally, I would've preferred to do this, if it weren't for the optimization\n// issues:\n//\n// ```js\n// const hasOwn = require(\"./hasOwn\")\n// const magic = [\n// \"key\", \"oninit\", \"oncreate\", \"onbeforeupdate\", \"onupdate\",\n// \"onbeforeremove\", \"onremove\",\n// ]\n// module.exports = (attrs, extras) => {\n// const result = Object.assign(Object.create(null), attrs)\n// for (const key of magic) delete result[key]\n// if (extras != null) for (const key of extras) delete result[key]\n// return result\n// }\n// ```\n\nvar hasOwn = require(\"./hasOwn\")\nvar magic = /^(?:key|oninit|oncreate|onbeforeupdate|onupdate|onbeforeremove|onremove)$/\n\nmodule.exports = function(attrs, extras) {\n\tvar result = {}\n\n\tif (extras != null) {\n\t\tfor (var key in attrs) {\n\t\t\tif (hasOwn.call(attrs, key) && !magic.test(key) && extras.indexOf(key) < 0) {\n\t\t\t\tresult[key] = attrs[key]\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (var key in attrs) {\n\t\t\tif (hasOwn.call(attrs, key) && !magic.test(key)) {\n\t\t\t\tresult[key] = attrs[key]\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result\n}\n","\"use strict\"\n\nvar Vnode = require(\"../render/vnode\")\nvar hyperscript = require(\"../render/hyperscript\")\n\nvar decodeURIComponentSafe = require(\"../util/decodeURIComponentSafe\")\nvar buildPathname = require(\"../pathname/build\")\nvar parsePathname = require(\"../pathname/parse\")\nvar compileTemplate = require(\"../pathname/compileTemplate\")\nvar censor = require(\"../util/censor\")\n\nmodule.exports = function($window, mountRedraw) {\n\tvar p = Promise.resolve()\n\n\tvar scheduled = false\n\n\tvar ready = false\n\tvar hasBeenResolved = false\n\n\tvar dom, compiled, fallbackRoute\n\n\tvar currentResolver, component, attrs, currentPath, lastUpdate\n\n\tvar RouterRoot = {\n\t\tonremove: function() {\n\t\t\tready = hasBeenResolved = false\n\t\t\t$window.removeEventListener(\"popstate\", fireAsync, false)\n\t\t},\n\t\tview: function() {\n\t\t\t// The route has already been resolved.\n\t\t\t// Therefore, the following early return is not needed.\n\t\t\t// if (!hasBeenResolved) return\n\n\t\t\tvar vnode = Vnode(component, attrs.key, attrs)\n\t\t\tif (currentResolver) return currentResolver.render(vnode)\n\t\t\t// Wrap in a fragment to preserve existing key semantics\n\t\t\treturn [vnode]\n\t\t},\n\t}\n\n\tvar SKIP = route.SKIP = {}\n\n\tfunction resolveRoute() {\n\t\tscheduled = false\n\t\t// Consider the pathname holistically. The prefix might even be invalid,\n\t\t// but that's not our problem.\n\t\tvar prefix = $window.location.hash\n\t\tif (route.prefix[0] !== \"#\") {\n\t\t\tprefix = $window.location.search + prefix\n\t\t\tif (route.prefix[0] !== \"?\") {\n\t\t\t\tprefix = $window.location.pathname + prefix\n\t\t\t\tif (prefix[0] !== \"/\") prefix = \"/\" + prefix\n\t\t\t}\n\t\t}\n\t\tvar path = decodeURIComponentSafe(prefix).slice(route.prefix.length)\n\t\tvar data = parsePathname(path)\n\n\t\tObject.assign(data.params, $window.history.state)\n\n\t\tfunction reject(e) {\n\t\t\tconsole.error(e)\n\t\t\troute.set(fallbackRoute, null, {replace: true})\n\t\t}\n\n\t\tloop(0)\n\t\tfunction loop(i) {\n\t\t\tfor (; i < compiled.length; i++) {\n\t\t\t\tif (compiled[i].check(data)) {\n\t\t\t\t\tvar payload = compiled[i].component\n\t\t\t\t\tvar matchedRoute = compiled[i].route\n\t\t\t\t\tvar localComp = payload\n\t\t\t\t\tvar update = lastUpdate = function(comp) {\n\t\t\t\t\t\tif (update !== lastUpdate) return\n\t\t\t\t\t\tif (comp === SKIP) return loop(i + 1)\n\t\t\t\t\t\tcomponent = comp != null && (typeof comp.view === \"function\" || typeof comp === \"function\")? comp : \"div\"\n\t\t\t\t\t\tattrs = data.params, currentPath = path, lastUpdate = null\n\t\t\t\t\t\tcurrentResolver = payload.render ? payload : null\n\t\t\t\t\t\tif (hasBeenResolved) mountRedraw.redraw()\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\thasBeenResolved = true\n\t\t\t\t\t\t\tmountRedraw.mount(dom, RouterRoot)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// There's no understating how much I *wish* I could\n\t\t\t\t\t// use `async`/`await` here...\n\t\t\t\t\tif (payload.view || typeof payload === \"function\") {\n\t\t\t\t\t\tpayload = {}\n\t\t\t\t\t\tupdate(localComp)\n\t\t\t\t\t}\n\t\t\t\t\telse if (payload.onmatch) {\n\t\t\t\t\t\tp.then(function () {\n\t\t\t\t\t\t\treturn payload.onmatch(data.params, path, matchedRoute)\n\t\t\t\t\t\t}).then(update, path === fallbackRoute ? null : reject)\n\t\t\t\t\t}\n\t\t\t\t\telse update(/* \"div\" */)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (path === fallbackRoute) {\n\t\t\t\tthrow new Error(\"Could not resolve default route \" + fallbackRoute + \".\")\n\t\t\t}\n\t\t\troute.set(fallbackRoute, null, {replace: true})\n\t\t}\n\t}\n\n\tfunction fireAsync() {\n\t\tif (!scheduled) {\n\t\t\tscheduled = true\n\t\t\t// TODO: just do `mountRedraw.redraw()` here and elide the timer\n\t\t\t// dependency. Note that this will muck with tests a *lot*, so it's\n\t\t\t// not as easy of a change as it sounds.\n\t\t\tsetTimeout(resolveRoute)\n\t\t}\n\t}\n\n\tfunction route(root, defaultRoute, routes) {\n\t\tif (!root) throw new TypeError(\"DOM element being rendered to does not exist.\")\n\n\t\tcompiled = Object.keys(routes).map(function(route) {\n\t\t\tif (route[0] !== \"/\") throw new SyntaxError(\"Routes must start with a '/'.\")\n\t\t\tif ((/:([^\\/\\.-]+)(\\.{3})?:/).test(route)) {\n\t\t\t\tthrow new SyntaxError(\"Route parameter names must be separated with either '/', '.', or '-'.\")\n\t\t\t}\n\t\t\treturn {\n\t\t\t\troute: route,\n\t\t\t\tcomponent: routes[route],\n\t\t\t\tcheck: compileTemplate(route),\n\t\t\t}\n\t\t})\n\t\tfallbackRoute = defaultRoute\n\t\tif (defaultRoute != null) {\n\t\t\tvar defaultData = parsePathname(defaultRoute)\n\n\t\t\tif (!compiled.some(function (i) { return i.check(defaultData) })) {\n\t\t\t\tthrow new ReferenceError(\"Default route doesn't match any known routes.\")\n\t\t\t}\n\t\t}\n\t\tdom = root\n\n\t\t$window.addEventListener(\"popstate\", fireAsync, false)\n\n\t\tready = true\n\n\t\t// The RouterRoot component is mounted when the route is first resolved.\n\t\tresolveRoute()\n\t}\n\troute.set = function(path, data, options) {\n\t\tif (lastUpdate != null) {\n\t\t\toptions = options || {}\n\t\t\toptions.replace = true\n\t\t}\n\t\tlastUpdate = null\n\n\t\tpath = buildPathname(path, data)\n\t\tif (ready) {\n\t\t\tfireAsync()\n\t\t\tvar state = options ? options.state : null\n\t\t\tvar title = options ? options.title : null\n\t\t\tif (options && options.replace) $window.history.replaceState(state, title, route.prefix + path)\n\t\t\telse $window.history.pushState(state, title, route.prefix + path)\n\t\t}\n\t\telse {\n\t\t\t$window.location.href = route.prefix + path\n\t\t}\n\t}\n\troute.get = function() {return currentPath}\n\troute.prefix = \"#!\"\n\troute.Link = {\n\t\tview: function(vnode) {\n\t\t\t// Omit the used parameters from the rendered element - they are\n\t\t\t// internal. Also, censor the various lifecycle methods.\n\t\t\t//\n\t\t\t// We don't strip the other parameters because for convenience we\n\t\t\t// let them be specified in the selector as well.\n\t\t\tvar child = hyperscript(\n\t\t\t\tvnode.attrs.selector || \"a\",\n\t\t\t\tcensor(vnode.attrs, [\"options\", \"params\", \"selector\", \"onclick\"]),\n\t\t\t\tvnode.children\n\t\t\t)\n\t\t\tvar options, onclick, href\n\n\t\t\t// Let's provide a *right* way to disable a route link, rather than\n\t\t\t// letting people screw up accessibility on accident.\n\t\t\t//\n\t\t\t// The attribute is coerced so users don't get surprised over\n\t\t\t// `disabled: 0` resulting in a button that's somehow routable\n\t\t\t// despite being visibly disabled.\n\t\t\tif (child.attrs.disabled = Boolean(child.attrs.disabled)) {\n\t\t\t\tchild.attrs.href = null\n\t\t\t\tchild.attrs[\"aria-disabled\"] = \"true\"\n\t\t\t\t// If you *really* do want add `onclick` on a disabled link, use\n\t\t\t\t// an `oncreate` hook to add it.\n\t\t\t} else {\n\t\t\t\toptions = vnode.attrs.options\n\t\t\t\tonclick = vnode.attrs.onclick\n\t\t\t\t// Easier to build it now to keep it isomorphic.\n\t\t\t\thref = buildPathname(child.attrs.href, vnode.attrs.params)\n\t\t\t\tchild.attrs.href = route.prefix + href\n\t\t\t\tchild.attrs.onclick = function(e) {\n\t\t\t\t\tvar result\n\t\t\t\t\tif (typeof onclick === \"function\") {\n\t\t\t\t\t\tresult = onclick.call(e.currentTarget, e)\n\t\t\t\t\t} else if (onclick == null || typeof onclick !== \"object\") {\n\t\t\t\t\t\t// do nothing\n\t\t\t\t\t} else if (typeof onclick.handleEvent === \"function\") {\n\t\t\t\t\t\tonclick.handleEvent(e)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Adapted from React Router's implementation:\n\t\t\t\t\t// https://github.com/ReactTraining/react-router/blob/520a0acd48ae1b066eb0b07d6d4d1790a1d02482/packages/react-router-dom/modules/Link.js\n\t\t\t\t\t//\n\t\t\t\t\t// Try to be flexible and intuitive in how we handle links.\n\t\t\t\t\t// Fun fact: links aren't as obvious to get right as you\n\t\t\t\t\t// would expect. There's a lot more valid ways to click a\n\t\t\t\t\t// link than this, and one might want to not simply click a\n\t\t\t\t\t// link, but right click or command-click it to copy the\n\t\t\t\t\t// link target, etc. Nope, this isn't just for blind people.\n\t\t\t\t\tif (\n\t\t\t\t\t\t// Skip if `onclick` prevented default\n\t\t\t\t\t\tresult !== false && !e.defaultPrevented &&\n\t\t\t\t\t\t// Ignore everything but left clicks\n\t\t\t\t\t\t(e.button === 0 || e.which === 0 || e.which === 1) &&\n\t\t\t\t\t\t// Let the browser handle `target=_blank`, etc.\n\t\t\t\t\t\t(!e.currentTarget.target || e.currentTarget.target === \"_self\") &&\n\t\t\t\t\t\t// No modifier keys\n\t\t\t\t\t\t!e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey\n\t\t\t\t\t) {\n\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\te.redraw = false\n\t\t\t\t\t\troute.set(href, null, options)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn child\n\t\t},\n\t}\n\troute.param = function(key) {\n\t\treturn attrs && key != null ? attrs[key] : attrs\n\t}\n\n\treturn route\n}\n","\"use strict\"\n\nvar mountRedraw = require(\"./mount-redraw\")\n\nmodule.exports = require(\"./api/router\")(typeof window !== \"undefined\" ? window : null, mountRedraw)\n","\"use strict\"\n\nvar hyperscript = require(\"./hyperscript\")\nvar mountRedraw = require(\"./mount-redraw\")\nvar request = require(\"./request\")\nvar router = require(\"./route\")\n\nvar m = function m() { return hyperscript.apply(this, arguments) }\nm.m = hyperscript\nm.trust = hyperscript.trust\nm.fragment = hyperscript.fragment\nm.Fragment = \"[\"\nm.mount = mountRedraw.mount\nm.route = router\nm.render = require(\"./render\")\nm.redraw = mountRedraw.redraw\nm.request = request.request\nm.parseQueryString = require(\"./querystring/parse\")\nm.buildQueryString = require(\"./querystring/build\")\nm.parsePathname = require(\"./pathname/parse\")\nm.buildPathname = require(\"./pathname/build\")\nm.vnode = require(\"./render/vnode\")\nm.censor = require(\"./util/censor\")\nm.domFor = require(\"./render/domFor\")\n\nmodule.exports = m\n","import { Attributes, Children, FactoryComponent, default as m, Vnode } from 'mithril'\n\n/**\n * Bar component model\n * @public\n */\nexport type BarAttrs = Attributes & {\n /**\n * Custom CSS Style\n */\n style?: Partial<CSSStyleDeclaration>\n\n /**\n * Start children\n */\n start?: Children\n\n /**\n * End children\n */\n end?: Children\n}\n\nexport function uiBar<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(BarComponent, attrs, children)\n}\n\nexport function uiBarStart<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(BarStartComponent, attrs, children)\n}\n\nexport function uiBarEnd<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(BarEndComponent, attrs, children)\n}\n\nexport function uiBarContent<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(BarContentComponent, attrs, children)\n}\n\nexport const BarComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs: { start, end, ...rest }, children }) => {\n return m('div.twk-bar', rest, [\n start ? m(BarStartComponent, start) : null,\n children,\n end ? m(BarEndComponent, end) : null,\n ])\n },\n }\n}\n\nexport const BarStartComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs, children }) => {\n return m('div.twk-bar-start', attrs, children)\n },\n }\n}\n\nexport const BarEndComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs, children }) => {\n return m('div.twk-bar-end', attrs, children)\n },\n }\n}\n\nexport const BarContentComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs, children }) => {\n return m('div.twk-bar-content', attrs, children)\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\n\n/**\n * Grid component model\n * @public\n */\nexport type GridAttrs = {\n /**\n * Grit template columns specification, e.g. \"1fr 2fr 1fr\" or \"3\"\n */\n columns?: number | string\n /**\n * Grit template rows specification\n */\n rows?: number | string\n /**\n * Custom CSS Style\n */\n style?: Partial<CSSStyleDeclaration>\n}\n\nexport function uiGrid<T>(attrs: GridAttrs, children?: Children): Vnode<GridAttrs> {\n return m(GridComponent, attrs, children)\n}\n\nexport const GridComponent: FactoryComponent<GridAttrs> = () => {\n return {\n view: (node) => {\n const data = node.attrs\n return m(\n 'div.twk-grid',\n {\n style: {\n gridTemplateColumns:\n typeof data.columns === 'number'\n ? `repeat(${data.columns}, 1fr)`\n : data.columns || 'none',\n gridTemplateRows:\n typeof data.rows === 'number' ? `repeat(${data.rows}, 1fr)` : data.rows || 'none',\n ...(data.style || {}),\n },\n },\n node.children,\n )\n },\n }\n}\n","/**\n * Checks if value is a string\n * @internal\n */\nexport function isString(v: any): v is string {\n return typeof v === 'string'\n}\n/**\n * Checks if value is a number\n * @internal\n */\nexport function isNumber(v: any): v is number {\n return typeof v === 'number'\n}\n/**\n * Checks if value is a function\n * @internal\n */\nexport function isFunction(v: any): v is (...args: any[]) => any {\n return typeof v === 'function'\n}\n/**\n * Checks if value is an array\n * @internal\n */\nexport function isArray(v: any): v is any[] {\n return Array.isArray(v)\n}\n/**\n * Checks if value is an object\n * @internal\n */\nexport function isObject(v: any): v is object {\n return v != null && typeof v === 'object' && !isArray(v)\n}\n/**\n * Calls a function if it is not null\n * @internal\n */\nexport function call<T extends (...args: any) => any>(\n cb: T | null | undefined,\n ...args: Parameters<T>\n) {\n return isFunction(cb) ? cb(...args) : null\n}\n\n/**\n * Clamps a number value\n * @internal\n */\nexport function clamp(v: number, min: number, max: number): number {\n if (v != null) {\n if (min != null && v < min) {\n return min\n }\n if (max != null && v > max) {\n return max\n }\n }\n return v\n}\n\nexport type ClassValue =\n | string\n | null\n | undefined\n | false\n | ClassDictionary\n | ClassArray\n | (() => ClassValue)\n\nexport interface ClassDictionary {\n [key: string]: boolean | (() => boolean)\n}\n\nexport interface ClassArray extends Array<ClassValue> {}\n\nexport function uiStyle(\n style: Partial<CSSStyleDeclaration> | undefined,\n): Partial<CSSStyleDeclaration> {\n return style || {}\n}\n\n/**\n * Builds a css class from various argument types\n * @param exp\n */\nexport function uiClass(...args: ClassValue[]): string\nexport function uiClass(): string {\n // common case\n if (arguments.length === 1 && isString(arguments[0])) {\n return arguments[0] as string\n }\n if (arguments.length === 0) {\n return ''\n }\n\n const result: string[] = []\n\n const process = (value: ClassValue): void => {\n if (!value) return\n\n // function\n if (typeof value === 'function') {\n process(value())\n return\n }\n\n // string\n if (typeof value === 'string') {\n if (value) {\n result.push(value)\n }\n return\n }\n\n // array\n if (Array.isArray(value)) {\n for (const v of value) {\n process(v)\n }\n return\n }\n\n // object\n if (typeof value === 'object') {\n for (const key in value) {\n const v = value[key]\n const resolved = typeof v === 'function' ? v() : v\n if (resolved) result.push(key)\n }\n }\n }\n\n for (const arg of arguments) {\n process(arg)\n }\n\n return result.join(' ')\n}\n\n/**\n * Pads a string\n * @internal\n */\nexport function padLeft(value: string, length: number, char: string) {\n while (value.length < length) {\n value = `${char}${value}`\n }\n return value\n}\n\n/**\n * Gets current mouse coordinates from mouse or touch event\n * @internal\n */\nexport function getTouchPoint(e: MouseEvent | TouchEvent): [number, number] {\n let cx = 0\n let cy = 0\n if ('touches' in e) {\n cx = e.touches.item(0)!.pageX\n cy = e.touches.item(0)!.pageY\n } else {\n cx = e.pageX\n cy = e.pageY\n }\n return [cx, cy]\n}\n\nexport type TouchInfo = ReturnType<typeof getTouchInTarget>\nexport function getTouchInTarget(\n e: MouseEvent | TouchEvent,\n target?: HTMLElement | null,\n offset?: [number, number],\n) {\n target = target || (e.target as HTMLElement)\n const rect = target.getBoundingClientRect()\n const tx = window.pageXOffset || document.documentElement.scrollLeft\n const ty = window.pageYOffset || document.documentElement.scrollTop\n\n const cw = target.clientWidth\n const ch = target.clientHeight\n let [cx, cy] = getTouchPoint(e)\n if (offset) {\n cx += offset[0]\n cy += offset[1]\n }\n const x = cx - tx - rect.left\n const y = cy - ty - rect.top\n return {\n width: cw,\n height: ch,\n x: x,\n y: y,\n normalizedX: x / cw,\n normalizedY: y / ch,\n }\n}\n\nexport function dragUtil({\n onStart,\n onMove,\n onEnd,\n}: {\n onStart?: (e: MouseEvent | TouchEvent) => void\n onMove?: (e: MouseEvent | TouchEvent) => void\n onEnd?: (e: MouseEvent | TouchEvent) => void\n}) {\n const util = {\n target: null as HTMLElement | null,\n activate: (e: MouseEvent) => {\n util.deactivate()\n util.target = e.target as HTMLElement\n if (onStart) {\n onStart(e)\n }\n if (onMove) {\n document.addEventListener('mousemove', onMove, { passive: false })\n document.addEventListener('touchmove', onMove, { passive: false })\n }\n if (onEnd) {\n document.addEventListener('mouseup', onEnd)\n document.addEventListener('touchend', onEnd)\n document.addEventListener('touchcancel', onEnd)\n }\n },\n deactivate: () => {\n util.target = null\n if (onMove) {\n document.removeEventListener('mousemove', onMove)\n document.removeEventListener('touchmove', onMove)\n }\n if (onEnd) {\n document.removeEventListener('mouseup', onEnd)\n document.removeEventListener('touchend', onEnd)\n document.removeEventListener('touchcancel', onEnd)\n }\n },\n onStart,\n onMove,\n onEnd,\n }\n return util\n}\n\nexport function eventWithTimout(el: Element, event: string, timeout: number): Promise<boolean> {\n return new Promise((resolve) => {\n let didResolve = false\n const handler = (e: Event) => {\n didResolve = true\n el.removeEventListener(event, handler)\n resolve(true)\n }\n el.addEventListener(event, handler)\n setTimeout(() => {\n el.removeEventListener(event, handler)\n if (!didResolve) {\n didResolve = true\n resolve(false)\n }\n }, timeout)\n })\n}\n","import m, { Child, Children, FactoryComponent, Vnode } from 'mithril'\nimport { ClassValue, eventWithTimout, uiClass } from '../../core/utils'\n\n/**\n * Group component model\n * @public\n */\nexport type GroupAttrs = {\n /**\n * Group icon\n */\n icon?: Child\n /**\n * Group title\n */\n title?: Child\n /**\n * Group CSS Style\n */\n style?: Partial<CSSStyleDeclaration>\n /**\n * Additional CSS class for the group element\n */\n class?: ClassValue\n /**\n * Whether the child elements can be collapsed\n */\n collapsible?: boolean\n /**\n * Whether the child elements are collapsed\n */\n collapsed?: boolean\n /**\n * WHether the group is disabled. Disabled groups can not be expanded.\n */\n disabled?: boolean\n /**\n * Adds an offset to the left side\n */\n inset?: boolean\n /**\n * Is called when this Group has been collapsed or expanded\n */\n onToggle?: (node: Vnode<GroupAttrs>) => void\n /**\n * Is called when this Group has been expanded\n */\n onExpand?: (node: Vnode<GroupAttrs>) => void\n /**\n * Is called when this Group has been collapsed\n */\n onCollapse?: (node: Vnode<GroupAttrs>) => void\n}\n\nexport function uiGroup<T>(attrs: GroupAttrs, children?: Children): Vnode<GroupAttrs> {\n return m(GroupComponent, attrs, children)\n}\n\nexport const GroupComponent: FactoryComponent<GroupAttrs> = () => {\n let title: Child\n let icon: Child\n let collapsible: boolean\n let collapsed: boolean\n let animate = false\n\n function updateState(node: Vnode<GroupAttrs>) {\n const data = node.attrs\n title = data.title || ''\n collapsible = !!data.collapsible\n collapsed ??= !!data.collapsed\n }\n\n function handleToggle() {\n animate = true\n collapsed = !collapsed\n }\n\n function groupTitle() {\n if (!icon && !title && !collapsible) {\n return null\n }\n return m(\n 'div.twk-group-title',\n {\n onclick: collapsible ? handleToggle : undefined,\n },\n icon,\n title,\n )\n }\n\n return {\n oninit: updateState,\n onupdate: updateState,\n view: ({ attrs, children }) => {\n title = attrs.title || ''\n icon = attrs.icon || ''\n collapsible = !!attrs.collapsible\n collapsed ??= !!attrs.collapsed\n return m(\n 'div.twk-group',\n {\n class: uiClass({\n ['twk-group-collapsible']: !!collapsible,\n ['twk-group-collapsed']: !!collapsed,\n }),\n style: attrs.style,\n },\n m.fragment({}, [groupTitle()]),\n collapsed ? null : m(GroupContent, { animate }, children),\n )\n },\n }\n}\n\nconst GroupContent: FactoryComponent<{ animate: boolean }> = () => {\n return {\n onbeforeremove: async ({ dom }) => {\n dom.classList.remove('enter')\n dom.classList.add('leave')\n if (await eventWithTimout(dom, 'animationstart', 50)) {\n await eventWithTimout(dom, 'animationend', 2000)\n }\n },\n view: ({ children, attrs }) => {\n return m(\n 'div.twk-group-content',\n {\n class: uiClass({\n animate: attrs.animate,\n enter: true,\n }),\n },\n children,\n )\n },\n }\n}\n","import m, { Attributes, Children, FactoryComponent, Vnode } from 'mithril'\nimport { StyleAttr } from '../../core'\n\n/**\n * List component model\n * @public\n */\nexport type ListAttrs = Attributes & {\n /**\n * Maps to flex-flow CSS property.\n * @links https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/flex-flow\n */\n flow?: `row` | `column` | string\n /**\n * Maps to flex CSS property.\n * @links https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/flex\n */\n flex?: string | number\n /**\n * Custom CSS Style\n */\n style?: StyleAttr\n}\n\nexport function uiFlex<T>(attrs: ListAttrs, children?: Children): Vnode<ListAttrs> {\n return m(FlexComponent, attrs, children)\n}\n\nexport const FlexComponent: FactoryComponent<ListAttrs> = () => {\n return {\n view: ({ attrs: { flex, flow, style, ...rest }, children }) => {\n return m(\n 'div.twk-flex',\n {\n style: {\n flex: flex ?? 'auto',\n flexFlow: flow || 'column nowrap',\n ...(style || {}),\n },\n ...rest,\n },\n children,\n )\n },\n }\n}\n","import m, { Attributes, Children, FactoryComponent, Vnode } from 'mithril'\n\n/**\n * Page component model\n * @public\n */\nexport type SectionAttrs = Attributes & {\n /**\n * Custom CSS Style\n */\n style?: Partial<CSSStyleDeclaration>\n\n /**\n * Header children\n */\n header?: Children\n\n /**\n * Footer children\n */\n footer?: Children\n}\n\nexport function uiSection<T>(attrs: SectionAttrs, children?: Children): Vnode<SectionAttrs> {\n return m(SectionComponent, attrs, children)\n}\n\nexport function uiSectionHeader<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(SectionHeaderComponent, attrs, children)\n}\n\nexport function uiSectionFooter<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(SectionFooterComponent, attrs, children)\n}\n\nexport function uiSectionContent<T>(attrs: Attributes, children?: Children): Vnode<Attributes> {\n return m(SectionContentComponent, attrs, children)\n}\n\nexport const SectionComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs: { header, footer, ...rest }, children }) => {\n return m('div.twk-section', rest, [\n header ? m(SectionHeaderComponent, header) : null,\n children,\n footer ? m(SectionFooterComponent, footer) : null,\n ])\n },\n }\n}\n\nexport const SectionHeaderComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs, children }) => {\n return m('header.twk-section-header', attrs, children)\n },\n }\n}\n\nexport const SectionFooterComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs, children }) => {\n return m('footer.twk-section-footer', attrs, children)\n },\n }\n}\n\nexport const SectionContentComponent: FactoryComponent<Attributes> = () => {\n return {\n view: ({ attrs, children }) => {\n return m('main.twk-section-content', attrs, children)\n },\n }\n}\n","import { TweakableAttrs } from './types'\nimport { isObject } from './utils'\n\n/**\n * Gets a value of a view model\n *\n * @public\n * @param control - The model of a component\n */\nexport function getControlValue<V>(control: TweakableAttrs<any, V>): V {\n return toControl(control, getRawValue(control))\n}\n\n/**\n * Sets a value on a view model\n *\n * @public\n * @param control - The model of a component\n * @param value - The value for the component\n * @returns the encoded value as it was written to the model\n */\nexport function setControlValue<V, R>(control: TweakableAttrs<any, V>, value: V) {\n const raw = fromControl(control, value)\n setRawValue(control, raw)\n return raw\n}\n\nexport function getRawValue(attrs: TweakableAttrs<any, any>) {\n if (attrs.binding) {\n return attrs.binding.get(attrs.value, attrs.field)\n }\n if (attrs.value == null) {\n return null\n }\n if (attrs.field != null) {\n return attrs.value[attrs.field]\n }\n return attrs.value\n}\n\nexport function setRawValue(attrs: TweakableAttrs<any, any>, value: any): void {\n if (attrs.binding) {\n attrs.binding.set?.(value, attrs.value, attrs.field)\n return\n }\n if (attrs.value == null) {\n return\n }\n if (attrs.field) {\n if (!isWriteable(attrs.value, attrs.field)) {\n console.warn(\n `Cannot write value to control model. Property \"${String(attrs.field)}\" is not writeable.`,\n )\n return\n }\n attrs.value[attrs.field] = value\n return\n }\n attrs.value = value\n}\n\nfunction isWriteable<T>(obj: T, key: keyof T): boolean {\n const desc = Object.getOwnPropertyDescriptor(obj, key)\n return !desc || !!desc.writable || !!desc.set\n}\n\nfunction fromControl<Value>(source: TweakableAttrs<unknown, Value>, value: Value): unknown {\n if (source.adapter) {\n return source.adapter.fromControl(value)\n }\n return value\n}\n\nfunction toControl<Value>(source: TweakableAttrs<unknown, Value>, raw: unknown): Value {\n if (source.adapter) {\n return source.adapter.toControl(raw)\n }\n return raw as any\n}\n","import m, { ChildArrayOrPrimitive, Children, FactoryComponent, Vnode } from 'mithril'\nimport { ComponentChildren, ComponentDescriptor } from './types'\n\nexport function isVnode(child: Children): child is Vnode {\n return typeof child === 'object' && child != null && 'tag' in child\n}\n\nexport function mapChildren(\n nodes: ChildArrayOrPrimitive | undefined,\n fn: (child: Vnode, index: number, all: Children[]) => Children,\n) {\n if (Array.isArray(nodes)) {\n return nodes.map((it, i, list) => {\n if (isVnode(it)) {\n return fn(it, i, list)\n }\n return it\n })\n }\n if (isVnode(nodes)) {\n return fn(nodes, 0, [nodes])\n }\n return nodes\n}\n\nexport function renderChildren(children: ComponentChildren): Children {\n if (children == null) {\n return null\n }\n if (typeof children === 'function') {\n return children()\n }\n if (Array.isArray(children)) {\n return children.map((it) => {\n if (isDescriptor(it)) {\n const { component, attributes, children } = it\n return m(component as any, attributes, renderChildren(children || []))\n }\n return it\n })\n }\n return children\n}\n\nfunction isDescriptor(child: any): child is ComponentDescriptor<any> {\n return typeof child === 'object' && child != null && 'component' in child && 'attributes' in child\n}\n\n// prettier-ignore\nexport type LabeledFn<T> =\n & ((opts: T) => Vnode<T> | null)\n & ((label: string, opts: Omit<T, 'label'>) => Vnode<T> | null)\n\nexport function labeledFn<T>(component: FactoryComponent<T>): LabeledFn<T> {\n return () => {\n let attr: T & { label?: string }\n if (arguments.length === 1) {\n attr = arguments[0] || {}\n } else if (arguments.length > 1) {\n attr = arguments[1] || {}\n attr.label = arguments[0]\n } else {\n attr = {} as T & { label?: string }\n }\n return m(component, attr)\n }\n}\n","import type { Children, ClassComponent, FactoryComponent } from 'mithril'\n\nexport type EventAttrs = Partial<GlobalEventHandlers>\n\nexport type StyleAttr = Partial<CSSStyleDeclaration> & { [key: string]: any }\n\n/**\n * A UI component, which can be either a Mithril factory component or a Mithril class component.\n *\n * @public\n */\nexport type Component<Attr extends Object> = FactoryComponent<Attr> | ClassComponent<Attr>\n\n/**\n * A descriptor for a component, which includes the component itself, its attributes, and optionally its children.\n *\n * @internal\n */\nexport type ComponentDescriptor<Attr extends Object> = {\n component: Component<Attr> | string\n attributes: Attr\n children?: ComponentChildren\n}\n\n/**\n *\n */\nexport type ComponentChildren = ComponentSchema | Children | (() => Children)\n\n/**\n * A schema for a set of components, which is an array of component descriptors.\n *\n * @internal\n */\nexport type ComponentSchema = Array<ComponentDescriptor<any>>\n\nexport function binding<T>(target: T, field: keyof T): ValueBinding<T, T[keyof T]> {\n return {\n get: () => target[field],\n set: (value) => (target[field] = value),\n }\n}\n\n/**\n * A get/set pair that encapsulates access to a value without exposing the source object.\n *\n * @public\n */\nexport type ValueBinding<M, T> = {\n get: (model: M, field?: keyof M) => T\n set?: (value: T, model: M, field?: keyof M) => void\n}\n\nexport type TweakableAttrs<T, Value = unknown> = {\n /**\n * The target object being tweaked.\n */\n value: T\n /**\n * The property on `value` to read from and write to\n */\n field?: keyof T\n /**\n * The custom binding controller\n */\n binding?: ValueBinding<T, Value>\n /**\n * An optional adapter to convert between the raw value and the control value.\n */\n adapter?: ControlAdapter<any, Value>\n}\n\n/**\n * Converts between the raw stored value and the value the control operates on.\n * Use when the control's internal representation differs from the source data format\n * e.g. radians stored, degrees displayed; or a packed integer unpacked into a vector.\n *\n * @public\n */\nexport type ControlAdapter<RawValue, ControlValue> = {\n toControl: (value: RawValue) => ControlValue\n fromControl: (value: ControlValue) => RawValue\n}\n\nexport type OmitIn<A, Keys extends keyof A> = {\n [P in keyof A as P extends Keys ? never : P]: A[P]\n}\n","import m, { ChildArray, Component } from 'mithril'\nimport { Builder, BuilderFn } from './builder'\nimport { renderChildren } from './core'\n\n/**\n * Mithril's hyperscript function.\n *\n * @public\n * @remarks\n * Useful to create custom components\n */\nexport const h = m\n\n/**\n * Mounts a ui to the given element\n */\nexport function mountUi(target: Element | string, data: ChildArray): void\nexport function mountUi(target: Element | string, data: BuilderFn): void\nexport function mountUi<A, S>(target: Element | string, data: Component<A, S>): void\nexport function mountUi(target: Element | string, data: ChildArray | BuilderFn | Component): void {\n const el = typeof target === 'string' ? document.querySelector(target)! : target\n el.classList.add('tweak-ui')\n if (!data) {\n m.mount(el, null)\n } else if (Array.isArray(data)) {\n m.mount(el, { view: () => data })\n } else if (typeof data === 'function') {\n const schema = Builder.build(data)\n m.mount(el, {\n view: () => renderChildren(schema),\n })\n } else {\n m.mount(el, data)\n }\n}\n\n/**\n * Unmounts the ui from given host element\n *\n * @public\n * @param el - The ui host element\n */\nexport function unmountUi(target: Element | string) {\n const el = typeof target === 'string' ? document.querySelector(target)! : target\n m.mount(el, null)\n}\n\n/**\n * Redraws the ui\n *\n * @public\n * @remarks\n * When changing the ui description object qui callbacks (e.g. `onInput` or `onChange`)\n * the ui will redraw automatically.\n *\n * However if the ui description object is changed from outside the qui callback\n * then this method must be called in order to update the visual state.\n */\nexport function redrawUi() {\n m.redraw()\n}\n","import m, { Children, FactoryComponent, Vnode, VnodeDOM } from 'mithril'\nimport { EventAttrs, mapChildren, StyleAttr } from '../../core'\nimport { uiClass } from '../../core/utils'\nimport { h } from '../../mount'\n\n/**\n * Split pane component model\n * @public\n */\nexport type SplitAttr = EventAttrs & {\n /**\n * Custom CSS Style\n */\n style?: StyleAttr\n /**\n * Whether the split is horizontal (side by side) or vertical (stacked)\n */\n flow?: 'row' | 'column'\n /**\n * Minimum size in pixels for each pane. Default is 16px.\n */\n minSize?: number\n}\n\nexport function uiSplit<T>(attrs: SplitAttr, children?: Children): Vnode<SplitAttr> {\n return m(SplitComponent, attrs, children)\n}\n\n/**\n * Split pane component model\n * @public\n */\nexport type SplitContentAttr = EventAttrs & {\n [key: string]: any\n /**\n * Custom CSS Style\n */\n style?: StyleAttr\n /**\n *\n */\n fluid?: boolean\n}\n\nexport function uiSplitContent<T>(attrs: SplitAttr, children?: Children): Vnode<SplitAttr> {\n return m(SplitContentComponent, attrs, children)\n}\n\nexport const SplitContentComponent: FactoryComponent<SplitContentAttr> = (vnode) => {\n return {\n view: ({ attrs, children }) =>\n h(\n 'div',\n {\n ...attrs,\n class: uiClass({ fluid: !!attrs.fluid }, attrs.class),\n },\n children,\n ),\n }\n}\n\nexport const SplitComponent: FactoryComponent<SplitAttr> = () => {\n let isHorizontal = false\n let minSizePx = 0\n let startEvent!: MouseEvent | null\n let startBoxL!: DOMRect | null\n let startBoxR!: DOMRect | null\n let dragElemL!: HTMLElement | null\n let dragElemR!: HTMLElement | null\n let dragIndex: number\n let measured: number | null = null\n let container: HTMLElement | null = null\n\n function handleMouseDown(e: MouseEvent, index: number, childL: VnodeDOM, childR: VnodeDOM) {\n tearDown()\n e.stopPropagation()\n\n startEvent = e\n startBoxL = childL.dom?.getBoundingClientRect()\n startBoxR = childR.dom?.getBoundingClientRect()\n dragElemL = childL.dom as HTMLElement\n dragElemR = childR.dom as HTMLElement\n dragIndex = index\n\n window.addEventListener('mousemove', handleMove)\n window.addEventListener('mouseup', tearDown)\n\n const parent = dragElemL.parentElement as HTMLElement\n if (parent) {\n parent.classList.add('dragging')\n }\n }\n\n function handleMove(e: MouseEvent) {\n if (!startBoxL || !startBoxR || !startEvent || !dragElemL || !dragElemR) {\n return\n }\n\n if (measured == null) {\n measured = measurePanes()\n }\n\n const delta = isHorizontal ? e.clientX - startEvent.clientX : e.clientY - startEvent.clientY\n const baseL = isHorizontal ? startBoxL.width : startBoxL.height\n const baseR = isHorizontal ? startBoxR.width : startBoxR.height\n const total = baseL + baseR\n\n const sizeL = Math.max(minSizePx, Math.min(baseL + delta, total - minSizePx))\n const sizeR = total - sizeL\n const basisL = (sizeL / measured) * 100\n const basisR = (sizeR / measured) * 100\n dragElemL.style.flex = `0 0 ${basisL}%`\n dragElemR.style.flex = `0 0 ${basisR}%`\n }\n\n function measurePanes(): number {\n if (!container) {\n return 0\n }\n let total = 0\n for (let i = 0; i < container.children.length; i++) {\n const el = container.children[i] as HTMLElement\n const rect = el.getBoundingClientRect()\n const size = isHorizontal ? rect.width : rect.height\n total += size\n if (!el.classList.contains('fluid')) {\n el.style.flex = `0 0 ${size}px`\n } else {\n el.style.flex = `1`\n }\n }\n return total\n }\n\n function tearDown() {\n const parent = dragElemL?.parentElement as HTMLElement\n if (parent) {\n parent.classList.remove('dragging')\n }\n dragElemL = null\n dragElemR = null\n startBoxL = null\n startBoxR = null\n startEvent = null\n measured = null\n window.removeEventListener('mousemove', handleMove)\n window.removeEventListener('mouseup', tearDown)\n measurePanes()\n }\n\n return {\n oncreate: ({ dom }) => {\n container = dom as HTMLElement\n },\n view: ({ attrs: { style, flow, minSize, ...rest }, children }) => {\n isHorizontal = flow === 'row'\n minSizePx = minSize = Math.max(minSize || 16, 0)\n queueMicrotask(measurePanes)\n return m(\n 'div.twk-split-pane',\n {\n ...rest,\n class: uiClass({\n 'twk-split-pane-h': isHorizontal,\n 'twk-split-pane-v': !isHorizontal,\n }),\n style: {\n ...(style || {}),\n display: 'flex',\n flexDirection: isHorizontal ? 'row' : 'column',\n },\n },\n mapChildren(children, (child, i, list) => {\n if (!child) {\n return null\n }\n const noGutter = !list[i + 1]\n return [\n child,\n noGutter\n ? null\n : m('div.twk-split-gutter', {\n class: uiClass({\n 'twk-split-gutter-h': isHorizontal,\n 'twk-split-gutter-v': !isHorizontal,\n }),\n onmousedown: (e: MouseEvent) =>\n handleMouseDown(e, i, child as any, list[i + 1] as any),\n }),\n ]\n }),\n )\n },\n }\n}\n","import { Child, Children, FactoryComponent, default as m, Vnode } from 'mithril'\n\nimport { mapChildren } from '../../core'\nimport { uiClass } from '../../core/utils'\nimport { GroupAttrs } from './group'\n\n/**\n * Tabs component model\n * @public\n */\nexport type TabsAttrs = {\n vertical?: boolean\n}\n\nconst tabsHost = Symbol('tabsHost')\n\nexport interface TabsHost {\n attach(node: Vnode<TabAttrs>): void\n detach(node: Vnode<TabAttrs>): void\n activate(node: Vnode<TabAttrs>): void\n isActive(child: Vnode<TabAttrs>): boolean\n}\n\nexport interface TabAttrs {\n title: Child\n active?: boolean\n disabled?: boolean\n}\n\nexport const TabComponent: FactoryComponent<TabAttrs> = () => {\n let host: TabsHost\n let vnode: Vnode<TabAttrs>\n\n return {\n oninit: (node) => {\n host = (node.attrs as any)[tabsHost]\n vnode = node\n if (!host) {\n throw new Error('TabPane must be used inside a Tabs component')\n }\n host.attach(node)\n },\n onremove: () => {\n host.detach(vnode)\n },\n view: ({ attrs, children }) => {\n const title = attrs.title\n const active = host.isActive(vnode)\n return [\n m(\n 'button.twk-btn.twk-tab',\n {\n class: uiClass({\n active,\n }),\n onclick: () => host.activate(vnode),\n },\n title,\n ),\n !active ? null : m('div.twk-tab-content', {}, children),\n ]\n },\n }\n}\n\nexport function uiTabs(attrs: TabsAttrs, children?: Children): Vnode<TabsAttrs> {\n return m(TabsComponent, attrs, children)\n}\n\nexport const TabsComponent: FactoryComponent<TabsAttrs> = () => {\n const children: Vnode<TabAttrs>[] = []\n let active: Vnode<TabAttrs> | null = null\n const host: TabsHost = {\n attach(child) {\n children.push(child)\n active ||= child\n if (child.attrs.active) {\n active = child\n }\n },\n detach(child) {\n const index = children.indexOf(child)\n if (index >= 0) {\n children.splice(index, 1)\n }\n if (active === child) {\n active = children[0] || null\n }\n },\n activate(child) {\n active = child\n },\n isActive(child) {\n return active === child\n },\n }\n\n function tabChildren(node: Vnode<TabsAttrs>) {\n return mapChildren(node.children, (child) => {\n if (!child) {\n return child\n }\n if (child.tag === TabComponent) {\n return m(\n child.tag as any,\n {\n ...child.attrs,\n [tabsHost]: host,\n },\n child.children,\n )\n }\n // assume the child is a group and wrap it in a tab\n // pull the title from the group attrs\n const attrs = child.attrs as GroupAttrs\n return m(\n TabComponent,\n {\n title: attrs.title || '',\n ...{ [tabsHost]: host },\n },\n m(\n child.tag as any,\n {\n ...attrs,\n title: undefined,\n },\n child.children,\n ),\n )\n })\n }\n\n return {\n view: (node) => {\n return m(\n 'div.twk-tabs',\n {\n class: uiClass({\n 'twk-tabs-vertical': !!node.attrs.vertical,\n }),\n },\n m.fragment({}, [tabChildren(node)]),\n )\n },\n }\n}\n","import m, { Child, FactoryComponent, Vnode } from 'mithril'\nimport { uiClass } from '../../core/utils'\n\nexport interface TreeAttrs<T> {\n data: Iterable<T>\n adapter: TreeDataAdapter<T>\n selectedId?: string\n rowHeight?: number\n style?: Partial<CSSStyleDeclaration>\n onSelect?: (node: T) => void\n}\n\nexport interface TreeDataAdapter<T> {\n version: number\n nodeId(node: T): string\n nodeLabel(node: T): Child\n nodeIcon(node: T, expanded: boolean): Child\n nodeChildren(node: T): Iterable<T> | undefined\n isExpanded(node: T): boolean\n setExpanded(node: T, expanded: boolean): void\n connect?(controller: TreeController<T>): void\n}\n\nexport interface TreeController<T> {\n scrollTo(node: T): void\n}\n\nexport function uiTree<T>(attrs: TreeAttrs<T>): Vnode<TreeAttrs<T>> {\n return m(TreeComponent, attrs)\n}\n\ninterface FlatNode<T> {\n node: T\n depth: number\n expanded: boolean\n}\n\nfunction flattenTree<T>(\n data: Iterable<T>,\n adapter: TreeDataAdapter<T>,\n depth = 0,\n result: FlatNode<T>[] = [],\n): FlatNode<T>[] {\n for (const node of data) {\n const expanded = adapter.isExpanded(node) ?? false\n const children = adapter.nodeChildren(node)\n result.push({ node, depth, expanded })\n if (!!children && expanded) {\n flattenTree(children, adapter, depth + 1, result)\n }\n }\n return result\n}\n\nconst ROW_HEIGHT = 22\nexport const TreeComponent: FactoryComponent<TreeAttrs<any>> = () => {\n let scrollTop = 0\n let observer: ResizeObserver | null = null\n let height = 0\n let nodes: FlatNode<any>[] = []\n let treeVersion: number | undefined\n let adapter: TreeDataAdapter<any> | null = null\n let selectedId: string | undefined\n let rowHeight: number | undefined\n let onSelect: ((node: any) => void) | undefined\n let data: Iterable<any> = []\n let scrollEl: HTMLElement | null = null\n return {\n onremove() {\n observer?.disconnect()\n },\n oncreate({ dom }) {\n observer = new ResizeObserver((entries) => {\n let newHeight = entries[0].contentRect.height\n if (newHeight !== height) {\n height = newHeight\n m.redraw()\n }\n })\n observer.observe(dom)\n },\n onupdate({ attrs: { adapter } }) {\n adapter.connect?.({\n scrollTo(node) {\n const index = nodes.findIndex((it) => it.node === node)\n if (index >= 0) {\n scrollEl?.scrollTo({\n top: index * (rowHeight ?? ROW_HEIGHT),\n behavior: 'instant',\n })\n m.redraw()\n }\n },\n })\n },\n view({ attrs }) {\n data = attrs.data!\n adapter = attrs.adapter!\n selectedId = attrs.selectedId!\n rowHeight = attrs.rowHeight ?? ROW_HEIGHT\n onSelect = attrs.onSelect\n\n if (treeVersion == null || treeVersion !== adapter.version) {\n nodes = flattenTree(data, adapter)\n }\n\n const totalRows = nodes.length\n const visibleRows = Math.ceil(height / rowHeight)\n const startIdx = Math.floor(scrollTop / rowHeight)\n const endIdx = Math.min(startIdx + visibleRows, totalRows)\n const offsetY = startIdx * rowHeight\n const childNodes = nodes.slice(startIdx, endIdx)\n return m(\n 'div.twk-tree',\n {\n style: attrs.style ?? {},\n oncreate: ({ dom }) => {\n scrollEl = dom as HTMLElement\n },\n onscroll: (e: UIEvent) => {\n scrollTop = (e.target as HTMLElement).scrollTop\n },\n },\n m(\n 'div.twk-tree-spacer',\n {\n style: {\n height: `${totalRows * rowHeight}px`,\n },\n },\n m(\n 'div.twk-tree-viewport',\n {\n style: {\n '--twk-tree-row-height': `${rowHeight}px`,\n transform: `translateY(${offsetY}px)`,\n },\n },\n childNodes.map(({ node, depth, expanded }) => {\n const id = adapter!.nodeId(node)\n const isSelected = id === selectedId\n const icon = adapter!.nodeIcon(node, adapter!.isExpanded(node))\n const isExpandable = !!adapter!.nodeChildren(node)\n return m(\n 'div.twk-tree-row',\n {\n key: id,\n class: uiClass({\n selected: isSelected,\n expandable: isExpandable,\n }),\n style: {\n height: `${rowHeight}px`,\n '--twk-tree-row-depth': depth,\n },\n onclick: () => onSelect?.(node),\n },\n [\n m('span.twk-tree-toggle', {\n class: uiClass({ expanded, expandable: isExpandable }),\n onclick: (e: MouseEvent) => {\n if (isExpandable) {\n e.stopPropagation()\n adapter!.setExpanded(node, !expanded)\n }\n },\n }),\n icon ? m('span.twk-tree-icon', {}, icon) : null,\n m('span.twk-tree-label', {}, adapter!.nodeLabel(node)),\n ],\n )\n }),\n ),\n ),\n )\n },\n }\n}\n","import { Attributes, Children, FactoryComponent, default as m, Vnode } from 'mithril'\nimport { redrawUi } from '../../mount'\n\n/**\n * Bar component model\n * @public\n */\nexport type DialogAttrs = Attributes & {\n /**\n * Custom CSS Style\n */\n style?: Partial<CSSStyleDeclaration>\n}\n\nexport function uiDialog<T>(attrs: DialogAttrs, children?: Children): Vnode<DialogAttrs> {\n return m(DialogComponent, attrs, children)\n}\n\nexport const DialogComponent: FactoryComponent<DialogAttrs> = () => {\n let dialogRef: HTMLDialogElement | null = null\n return {\n oncreate: ({ dom }) => {\n dialogRef = dom as HTMLDialogElement\n dialogRef.addEventListener('close', redrawUi)\n },\n onremove: () => {\n dialogRef?.removeEventListener('close', redrawUi)\n dialogRef = null\n },\n view: ({ attrs, children }) => {\n return m('dialog.twk-dialog', attrs, [dialogRef?.open ? children : null])\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\nimport { EventAttrs, StyleAttr } from '../../core'\nimport { uiClass } from '../../core/utils'\n\n/**\n * Button component model\n * @public\n */\nexport type ButtonAttrs = EventAttrs & {\n [key: string]: any\n\n /**\n *\n */\n style?: StyleAttr\n /**\n * Whether the button square\n */\n square?: boolean\n\n /**\n * Whether the button a block\n */\n block?: boolean\n\n /**\n * Whether the button is large\n */\n large?: boolean\n\n /**\n *\n */\n accent?: boolean\n\n /**\n * Css flex property\n */\n flex?: string\n}\n\nexport function uiButton<T>(attrs: ButtonAttrs, children?: Children): Vnode<ButtonAttrs> {\n return m(ButtonComponent as any, attrs as any, children)\n}\n\nexport const ButtonComponent: FactoryComponent<ButtonAttrs> = () => {\n return {\n view: ({ attrs, children }) => {\n const { square, block, class: className, style, ...rest } = attrs\n return m(\n 'button.twk-btn',\n {\n type: 'button',\n class: uiClass(\n {\n 'twk-btn-sq': !!square,\n 'twk-btn-bl': !!block,\n 'twk-btn-lg': !!attrs.large,\n 'twk-btn-accent': !!attrs.accent,\n },\n className,\n ),\n style: {\n flex: attrs.flex,\n ...(style || {}),\n },\n ...rest,\n },\n children,\n )\n },\n }\n}\n","import m, { Attributes, FactoryComponent, Vnode } from 'mithril'\n\nexport function uiDivider(attrs: Attributes): Vnode<Attributes> {\n return m(Divider, attrs)\n}\n\nexport const Divider: FactoryComponent<Attributes> = () => {\n return {\n view: (node) => {\n return m('div.twk-divider', node.attrs, node.children)\n },\n }\n}\n","export type StatTransform = 'linear' | 'log' | 'exp'\n\nexport type SamplerConfig = {\n /**\n * Display name of the stat\n */\n name?: string\n\n /**\n * Display color of the stat\n */\n color?: string\n\n /**\n * Formatting for the current value\n */\n fractionDigits?: number\n\n /**\n * Function that returns the current value of the stat\n */\n sample: () => number\n\n /**\n * Smoothing factor for EMA calculation.\n *\n * @remarks\n * 0 is no smoothing, 0.9 is heavy smoothing. Don't set to 1 or it will never update! Default is 0 (no smoothing).\n */\n smoothing?: number\n\n /**\n * Expected minimum value for display. Used for normalization and auto-ranging. Default is 0.\n */\n min?: number\n\n /**\n * Expected maximum value for display. Used for normalization and auto-ranging. Default is 1.\n */\n max?: number\n\n transform?: StatTransform\n\n noGraph?: boolean\n}\n\nexport interface Sampler {\n color?: string\n noGraph?: boolean\n fractionDigits?: number\n\n smoothing: number\n transform: (v: number) => number\n min: number\n max: number\n\n sample: () => number\n\n value: number | null\n normalized: number\n\n // --- canonical ring buffer ---\n buffer: Float32Array\n head: number\n count: number\n index: number\n\n // --- O(1) average ---\n sum: number\n avg: number\n\n // --- monotonic queues ---\n minDeque: Float32Array\n maxDeque: Float32Array\n minIdx: Uint32Array\n maxIdx: Uint32Array\n\n minHead: number\n minTail: number\n maxHead: number\n maxTail: number\n\n minSeen: number\n maxSeen: number\n}\n\nexport function sampler(config: SamplerConfig, size: number): Sampler {\n const sampler: Sampler = {\n color: config.color,\n noGraph: config.noGraph,\n fractionDigits: config.fractionDigits,\n\n smoothing: config.smoothing ?? 0,\n transform: linearTransform,\n min: config.min ?? 0,\n max: config.max ?? 1,\n\n value: null,\n normalized: 0,\n\n buffer: new Float32Array(size),\n head: 0,\n count: 0,\n index: 0,\n\n sum: 0,\n avg: 0,\n\n minDeque: new Float32Array(size),\n maxDeque: new Float32Array(size),\n minIdx: new Uint32Array(size),\n maxIdx: new Uint32Array(size),\n\n minHead: 0,\n minTail: 0,\n maxHead: 0,\n maxTail: 0,\n\n minSeen: Infinity,\n maxSeen: -Infinity,\n\n sample: () => processValue(config.sample(), sampler),\n }\n switch (config.transform) {\n case 'log':\n sampler.transform = logTransform\n break\n case 'exp':\n sampler.transform = expTransform\n break\n default:\n sampler.transform = linearTransform\n break\n }\n return sampler\n}\n\nfunction logTransform(v: number): number {\n return Math.log10(1 + Math.max(0, v))\n}\n\nfunction expTransform(v: number): number {\n return Math.exp(v) - 1\n}\n\nfunction linearTransform(v: number): number {\n return v\n}\n\nfunction processValue(sample: number, s: Sampler): number {\n // --- EMA ---\n if (s.value == null) {\n s.value = sample\n } else {\n const a = s.smoothing\n s.value = a * s.value + (1 - a) * sample\n }\n\n const v = s.value\n const i = s.index++\n const size = s.buffer.length\n\n // --- remove outgoing value (for avg) ---\n if (s.count === size) {\n const old = s.buffer[s.head]\n s.sum -= old\n } else {\n s.count++\n }\n\n // --- write new value ---\n s.buffer[s.head] = v\n s.head = (s.head + 1) % size\n\n // --- update sum / avg ---\n s.sum += v\n s.avg = s.sum / s.count\n\n // --- MIN QUEUE ---\n while (s.minHead !== s.minTail) {\n const last = (s.minTail - 1 + size) % size\n if (s.minDeque[last] <= v) break\n s.minTail = last\n }\n\n s.minDeque[s.minTail] = v\n s.minIdx[s.minTail] = i\n s.minTail = (s.minTail + 1) % size\n\n while (s.minHead !== s.minTail && s.minIdx[s.minHead] <= i - size) {\n s.minHead = (s.minHead + 1) % size\n }\n\n // --- MAX QUEUE ---\n while (s.maxHead !== s.maxTail) {\n const last = (s.maxTail - 1 + size) % size\n if (s.maxDeque[last] >= v) break\n s.maxTail = last\n }\n\n s.maxDeque[s.maxTail] = v\n s.maxIdx[s.maxTail] = i\n s.maxTail = (s.maxTail + 1) % size\n\n while (s.maxHead !== s.maxTail && s.maxIdx[s.maxHead] <= i - size) {\n s.maxHead = (s.maxHead + 1) % size\n }\n\n // --- current window min/max ---\n const winMin = s.minHead !== s.minTail ? s.minDeque[s.minHead] : s.min\n\n const winMax = s.maxHead !== s.maxTail ? s.maxDeque[s.maxHead] : s.max\n\n s.minSeen = winMin\n s.maxSeen = winMax\n\n // --- normalization ---\n const t = s.transform\n\n const tv = t(v)\n const tmin = t(Math.min(s.min, winMin))\n const tmax = t(Math.max(s.max, winMax))\n\n const denom = tmax - tmin || 1\n const norm = (tv - tmin) / denom\n\n s.normalized = Math.max(0, Math.min(1, norm))\n return s.normalized\n}\n","import { sampler, Sampler, SamplerConfig } from './sampler'\n\nexport type StatsConfig<T extends SamplerConfig = SamplerConfig> = {\n historySize?: number\n collapsed?: boolean\n rows: Array<T>\n}\n\nexport type StatsRenderer = {\n resize: (width: number, height: number) => void\n configure: (config: StatsConfig) => void\n update: () => void\n render: () => void\n sampler: (row: number) => Sampler\n samplerCount: number\n}\n\nexport function statsRenderer(canvas: HTMLCanvasElement): StatsRenderer {\n const gl = canvas.getContext('webgl2')!\n if (!gl) {\n throw new Error('WebGL2 is not supported in this browser')\n }\n\n const prog = createProgram(gl)\n const vbo = gl.createBuffer()\n\n const locX = 0\n const locRow = 1\n const locVal = 2\n\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo)\n gl.enableVertexAttribArray(locX)\n gl.enableVertexAttribArray(locRow)\n gl.enableVertexAttribArray(locVal)\n\n gl.vertexAttribPointer(locX, 1, gl.FLOAT, false, 12, 0)\n gl.vertexAttribPointer(locRow, 1, gl.FLOAT, false, 12, 4)\n gl.vertexAttribPointer(locVal, 1, gl.FLOAT, false, 12, 8)\n\n const uHistory = gl.getUniformLocation(prog, 'u_history')\n const uViewWidth = gl.getUniformLocation(prog, 'u_width')\n const uViewHeight = gl.getUniformLocation(prog, 'u_height')\n const uRowHeight = gl.getUniformLocation(prog, 'u_rowH')\n const uPad = gl.getUniformLocation(prog, 'u_padding')\n const uColor = gl.getUniformLocation(prog, 'u_color')\n\n let collapsed = false\n let history = 100\n let rows = 0\n let verts: Float32Array\n let data: Float32Array\n let head: Uint32Array\n\n const colors: Array<[number, number, number]> = []\n const samplers: Sampler[] = []\n function configure(config: StatsConfig) {\n collapsed = !!config.collapsed\n rows = config.rows.length\n history = Math.max(config.historySize || 100, 100)\n data = new Float32Array(rows * history)\n head = new Uint32Array(rows)\n verts = new Float32Array(rows * history * 3)\n\n samplers.length = rows\n colors.length = rows\n for (let i = 0; i < rows; i++) {\n samplers[i] = sampler(config.rows[i], history)\n const hex = config.rows[i].color!\n const r = parseInt(hex.slice(1, 3), 16) / 255\n const g = parseInt(hex.slice(3, 5), 16) / 255\n const b = parseInt(hex.slice(5, 7), 16) / 255\n colors[i] = [r, g, b]\n }\n }\n\n function resize(width: number, height: number) {\n canvas.width = width\n canvas.height = height\n }\n\n function update() {\n for (let i = 0; i < samplers.length; i++) {\n head[i] = (head[i] + 1) % history\n data[i * history + head[i]] = samplers[i].sample()\n }\n }\n\n function render() {\n for (let r = 0; r < rows; r++) {\n for (let i = 0; i < history; i++) {\n const idx = (head[r] + i + 1) % history\n const base = (r * history + i) * 3\n\n verts[base + 0] = i\n verts[base + 1] = collapsed ? 0 : r\n verts[base + 2] = data[r * history + idx]\n }\n }\n\n gl.viewport(0, 0, canvas.width, canvas.height)\n gl.clearColor(0, 0, 0, 0)\n gl.clear(gl.COLOR_BUFFER_BIT)\n\n const padding = 0\n gl.useProgram(prog)\n gl.uniform1f(uHistory, history)\n gl.uniform1f(uViewWidth, canvas.width)\n gl.uniform1f(uViewHeight, canvas.height)\n gl.uniform1f(uPad, padding)\n gl.uniform1f(uRowHeight, (canvas.height - padding - rows * padding) / (collapsed ? 1 : rows))\n\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo)\n gl.bufferData(gl.ARRAY_BUFFER, verts, gl.DYNAMIC_DRAW)\n\n for (let r = 0; r < rows; r++) {\n if (samplers[r].noGraph) {\n continue\n }\n gl.uniform3fv(uColor, colors[r])\n gl.drawArrays(gl.LINE_STRIP, r * history, history)\n }\n }\n\n return {\n resize,\n configure,\n update,\n render,\n sampler: (row: number) => samplers[row],\n samplerCount: samplers.length,\n }\n}\n\nconst VERT = /* glsl */ `#version 300 es\nprecision highp float;\n\nlayout(location=0) in float a_x;\nlayout(location=1) in float a_row;\nlayout(location=2) in float a_value;\n\nuniform float u_history;\nuniform float u_width;\nuniform float u_height;\nuniform float u_padding;\nuniform float u_rowH;\n\nvoid main() {\n float x = u_padding + (a_x / (u_history - 1.0)) * (u_width - 2.0 * u_padding);\n float yBase = u_padding + a_row * (u_rowH + u_padding);\n float y = yBase + u_rowH - 2.0 - a_value * (u_rowH - 4.0);\n\n float ndcX = (x / u_width) * 2.0 - 1.0;\n float ndcY = 1.0 - (y / u_height) * 2.0;\n\n gl_Position = vec4(ndcX, ndcY, 0.0, 1.0);\n}\n`\n\nconst FRAG = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec3 u_color;\nout vec4 outColor;\nvoid main(){\n outColor = vec4(u_color,1.0);\n}\n`\n\nfunction compile(gl: WebGL2RenderingContext, type: number, src: string) {\n const s = gl.createShader(type)!\n gl.shaderSource(s, src)\n gl.compileShader(s)\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n throw gl.getShaderInfoLog(s)\n }\n return s\n}\n\nfunction createProgram(gl: WebGL2RenderingContext) {\n const prog = gl.createProgram()\n gl.attachShader(prog, compile(gl, gl.VERTEX_SHADER, VERT))\n gl.attachShader(prog, compile(gl, gl.FRAGMENT_SHADER, FRAG))\n gl.linkProgram(prog)\n gl.useProgram(prog)\n return prog\n}\n","import m, { Children, FactoryComponent, Vnode, VnodeDOM } from 'mithril'\nimport { StatsConfig, statsRenderer, StatsRenderer } from '../../stats'\n\nexport interface GraphAttrs extends Partial<StatsConfig> {\n rowHeight?: number\n}\n\nexport function uiGraph(attrs: GraphAttrs, children?: Children): Vnode<GraphAttrs> {\n return m(GraphComponent, attrs, children)\n}\n\nexport const GraphComponent: FactoryComponent<GraphAttrs> = () => {\n let observer: ResizeObserver | null = null\n let frameId: number | null = null\n let canvas: HTMLCanvasElement | null = null\n let renderer: StatsRenderer\n let config: StatsConfig = { rows: [] }\n let legendNodes: HTMLDivElement[] = []\n let legendTimer: number | null = null\n\n function connect(el: HTMLCanvasElement) {\n canvas = el\n observer?.observe(canvas)\n updateGraph()\n legendTimer = setInterval(updateLegend, 250)\n }\n\n function disconnect() {\n observer?.disconnect()\n if (frameId !== null) {\n cancelAnimationFrame(frameId)\n frameId = null\n }\n if (legendTimer !== null) {\n clearInterval(legendTimer)\n legendTimer = null\n }\n }\n\n function updateGraph() {\n if (canvas?.isConnected) {\n renderer.update()\n renderer.render()\n frameId = requestAnimationFrame(updateGraph)\n } else {\n disconnect()\n }\n }\n\n function updateLegend() {\n renderLegend(renderer, legendNodes)\n }\n\n function canvasCreated({ dom }: VnodeDOM) {\n disconnect()\n const canvas = dom as HTMLCanvasElement\n if (!(canvas instanceof HTMLCanvasElement)) {\n console.error('Graph component must be a canvas element')\n return\n }\n observer = new ResizeObserver((entries) => {\n const size = sizeFromObserver(entries)\n if (size && renderer) {\n renderer.resize(size.width, size.height)\n }\n })\n renderer = statsRenderer(canvas)\n for (let i = 0; i < config.rows.length; i++) {\n config.rows[i].color ||= colorForIndex(i)\n }\n renderer.configure(config)\n connect(canvas)\n }\n\n function cavasRemoved() {\n disconnect()\n }\n\n function updateConfig(node: Vnode<GraphAttrs>) {\n config = {\n ...node.attrs,\n rows: (node.attrs.rows || []).map((r, i) => {\n return {\n ...r,\n name: r.name || `Row ${i + 1}`,\n color: r.color || colorForIndex(i),\n }\n }),\n }\n }\n return {\n oninit: updateConfig,\n onupdate: updateConfig,\n onremove: () => {\n disconnect()\n },\n view: ({ attrs: { rowHeight, collapsed } }) => {\n const height = (rowHeight || 50) * (collapsed ? 1 : config.rows.length) * devicePixelRatio\n return [\n m('canvas.twk-graph', {\n style: `width: 100%; height: ${height}px`,\n oncreate: canvasCreated,\n onremove: cavasRemoved,\n }),\n m('table.twk-graph', {}, [\n m(\n 'tbody',\n {},\n config.rows.map((r, i) => {\n return m(\n 'tr',\n {\n oncreate: ({ dom }) => (legendNodes[i] = dom as HTMLDivElement),\n },\n [\n m('td', { style: r.noGraph ? {} : `color: ${r.color}`, title: r.name! }, [\n m('span', r.name!),\n ]),\n m('td.twk-stats', { title: 'min / max / avg' }, []),\n m('td.twk-current', {}),\n ],\n )\n }),\n ),\n ]),\n ]\n },\n }\n}\n\nfunction sizeFromObserver(entries: ResizeObserverEntry[]) {\n const entry = entries[0]\n if (entry.devicePixelContentBoxSize) {\n const width = entry.devicePixelContentBoxSize[0].inlineSize\n const height = entry.devicePixelContentBoxSize[0].blockSize\n return { width, height }\n }\n if (entry.contentBoxSize) {\n const width = Math.round(entry.contentBoxSize[0].inlineSize * devicePixelRatio)\n const height = Math.round(entry.contentBoxSize[0].blockSize * devicePixelRatio)\n return { width, height }\n }\n return null\n}\n\nfunction renderLegend(renderer: StatsRenderer | null, nodes: HTMLElement[]) {\n if (!renderer) {\n return\n }\n\n for (let i = 0; i < nodes.length; i++) {\n const el = nodes[i]\n const sampler = renderer.sampler(i)\n if (!sampler || !el) {\n continue\n }\n\n const current = el.querySelector('.twk-current')\n const stats = el.querySelector('.twk-stats')\n if (current) {\n current.textContent = formatValue(sampler.value, sampler.fractionDigits)\n }\n if (stats) {\n if (sampler.noGraph) {\n stats.textContent = ''\n } else {\n const fd = sampler.fractionDigits\n stats.textContent = `${formatValue(sampler.minSeen, fd)}/${formatValue(sampler.maxSeen, fd)}/${formatValue(sampler.avg, fd)}`\n }\n }\n }\n}\n\nfunction formatValue(value: number | null, fractionDigits?: number): string {\n if (value == null) {\n return 'n/a'\n }\n if (fractionDigits != null) {\n return value.toFixed(fractionDigits)\n }\n const abs = Math.abs(value)\n if (abs < Number.EPSILON) {\n return '0'\n }\n if (abs < 1) {\n return value.toFixed(3)\n }\n if (abs < 10) {\n return value.toFixed(2)\n }\n if (abs < 100) {\n return value.toFixed(1)\n }\n return value.toFixed(0)\n}\n\nconst DEFAULT_COLORS = [\n '#1F77B4', // deep blue\n '#FF7F0E', // orange\n '#2CA02C', // strong green\n '#D62728', // strong red\n '#9467BD', // violet\n '#8C564B', // muted brown\n '#E377C2', // magenta\n '#7F7F7F', // neutral gray\n\n '#5DA5DA', // blue\n '#F17CB0', // pink\n '#60BD68', // green\n '#B2912F', // brown/gold\n '#B276B2', // purple\n '#DECF3F', // yellow\n '#F15854', // red\n '#4D4D4D', // gray\n\n '#17BECF', // cyan\n '#AEC7E8', // light blue\n '#FFBB78', // light orange\n '#98DF8A', // light green\n]\n\nfunction colorForIndex(i: number): string {\n return DEFAULT_COLORS[i % DEFAULT_COLORS.length]\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\n\nimport { EventAttrs, StyleAttr } from '../../core'\nimport { isNumber } from '../../core/utils'\n\n/**\n * Image component model\n * @public\n */\nexport type ImageAttrs = EventAttrs & {\n /**\n * The image source url\n */\n src?: string | any\n\n /**\n *\n */\n render?: (src: any) => Promise<ImageBitmap>\n\n /**\n * Aspect ratio of the picture container\n */\n aspect?: number | string\n\n /**\n * A fixed width\n */\n width?: number | string\n\n /**\n *\n */\n fit?: 'contain' | 'cover' | 'fill'\n\n class?: string\n style?: StyleAttr\n}\n\nexport function uiImage(attrs: ImageAttrs, children?: Children): Vnode<ImageAttrs> {\n return m(ImageComponent, attrs, children)\n}\n\nexport const ImageComponent: FactoryComponent<ImageAttrs> = () => {\n let src: string\n let srcLoadArg: any\n let srcRender: (src: any) => Promise<ImageBitmap>\n\n let cssWidth: string\n let cssAspect: string\n let cssFit: string\n\n let elImage: HTMLImageElement\n let loadGeneration = 0\n let lastSrcLoadArg: any\n let lastSrc: string\n\n function hasChanged() {\n return srcLoadArg !== lastSrcLoadArg || src !== lastSrc\n }\n\n function parseSize(width: ImageAttrs['width']) {\n if (isNumber(width)) {\n return `${width}px`\n }\n return width\n }\n\n function parseAspect(aspect: ImageAttrs['aspect']) {\n return String(aspect || '')\n }\n\n function captureState(attrs: ImageAttrs) {\n src = typeof attrs.src === 'string' ? attrs.src : ''\n srcLoadArg = attrs.src\n srcRender = attrs.render!\n cssAspect = parseAspect(attrs.aspect)\n cssWidth = parseSize(attrs.width)!\n cssFit = attrs.fit || 'fit'\n }\n\n async function loadImage() {\n if (!elImage || !hasChanged()) {\n return\n }\n lastSrcLoadArg = srcLoadArg\n lastSrc = src\n if (!srcRender) {\n elImage.src = src\n return\n }\n loadGeneration++\n const generation = loadGeneration\n\n elImage.classList.add('twk-loading')\n const bitmap = await srcRender(srcLoadArg)\n if (generation !== loadGeneration) {\n bitmap.close() // stale, discard\n return\n }\n\n await renderThumbnail(elImage, bitmap)\n elImage.classList.remove('twk-loading')\n }\n\n async function renderThumbnail(img: HTMLImageElement, bitmap: ImageBitmap) {\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height)\n canvas.getContext('2d')!.drawImage(bitmap, 0, 0)\n const blob = await canvas.convertToBlob({ type: 'image/png' })\n bitmap.close()\n\n const next = URL.createObjectURL(blob)\n URL.revokeObjectURL(img.src)\n img.src = next\n }\n\n function grabRestAttrs(attrs: ImageAttrs) {\n const { src, render, aspect, width, fit, ...rest } = attrs\n return rest\n }\n\n return {\n oninit({ attrs }) {\n captureState(attrs)\n },\n onbeforeupdate({ attrs }, old) {\n captureState(attrs)\n },\n onupdate() {\n loadImage()\n },\n view: ({ attrs }) => {\n return m('img.twk-image', {\n src,\n style: {\n width: cssWidth,\n aspectRatio: cssAspect,\n objectFit: cssFit,\n ...(attrs.style || {}),\n },\n\n onremove: () => {\n elImage = null!\n },\n oncreate: ({ dom }) => {\n elImage = dom as HTMLImageElement\n loadImage()\n },\n ...grabRestAttrs(attrs),\n })\n },\n }\n}\n","import m, { Children, FactoryComponent, Vnode } from 'mithril'\nimport { EventAttrs, StyleAttr, TweakableAttrs } from '../../core'\n\nexport type WidgetAttrs = EventAttrs &\n CommonWidgetAttrs & {\n [property: string]: any\n\n /**\n * The HTML tag to use for the control container, defaults to 'div'\n */\n tagName?: string\n\n /**\n * Style object to apply to the control container\n */\n style?: StyleAttr\n }\n\nexport interface CommonWidgetAttrs {\n /**\n * The HTML tag to use for the control container, defaults to 'div'\n */\n tagName?: string\n\n /**\n * A label for the control\n */\n label?: Children | false\n\n /**\n * Additional CSS class names to apply to the control container\n */\n class?: string\n}\n\nexport type ValueWidgetAttrs<T = any, V = any> = CommonWidgetAttrs & TweakableAttrs<T, V>\n\nexport const WidgetComponent: FactoryComponent<WidgetAttrs> = () => {\n return {\n view: (node) => {\n const { label, tip, tagName, ...rest } = node.attrs\n return [\n m(\n `${tagName || 'div'}.twk-widget`,\n {\n ...rest,\n },\n label === false ? null : m('div.twk-widget-label', {}, label),\n node.children,\n ),\n ]\n },\n }\n}\n\nexport function uiWidget(attrs: WidgetAttrs, children?: Children): Vnode<WidgetAttrs> {\n return m(WidgetComponent, attrs, children)\n}\n","import m, { Child, Children, Vnode } from 'mithril'\n\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { clamp, dragUtil, getTouchInTarget, TouchInfo, uiClass } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\n\nexport type ScalarWidgetAttrs<T = unknown> = CommonWidgetAttrs & ScalarInputAttrs<T>\n\n/**\n * Scalar component model\n * @public\n */\nexport type ScalarInputAttrs<T = unknown> = TweakableAttrs<T, number> & {\n /**\n * The placeholder text\n */\n placeholder?: string\n\n /**\n * Content before the input field\n */\n slotBefore?: Child\n\n /**\n * Content after the input field\n */\n slotAfter?: Child\n\n /**\n * The unit to display after the value. For example, \"px\" or \"kg\".\n */\n unit?: string\n\n /**\n * The min value\n */\n min?: number\n\n /**\n * The max value\n */\n max?: number\n\n /**\n * The step value\n */\n step?: number\n\n /**\n * Displays a range slider below the input field. By default, this is false.\n */\n range?: boolean\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: number) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: number) => void\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n\n /**\n * The minimum number of fraction digits to display. By default, this is 1.\n */\n decimals?: number\n\n class?: string\n}\n\nexport function uiScalarWidget<T>(\n attrs: ScalarWidgetAttrs<T>,\n children?: Children,\n): Vnode<ScalarWidgetAttrs<T>> {\n return m(ScalarWidgetComponent<T>, attrs, children)\n}\n\nexport function uiScalarInput<T>(\n attrs: ScalarInputAttrs<T>,\n children?: Children,\n): Vnode<ScalarInputAttrs<T>> {\n return m(ScalarInputComponent<T>, attrs, children)\n}\n\nexport const ScalarWidgetComponent = <T>(): m.Component<ScalarWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName || 'div'}.twk-scalar-widget`,\n label: label ?? (rest.field as any),\n class: className,\n },\n [m(ScalarInputComponent<T>, rest)],\n )\n },\n }\n}\n\nexport const ScalarInputComponent = <T>(): m.Component<ScalarInputAttrs<T>> => {\n let min: number\n let max: number\n let step: number | undefined\n let readonly: boolean\n let placeholder: string\n let value: number\n let attrs: ScalarInputAttrs<T>\n let editing: boolean\n let hasMinMax = false\n let hasStep = false\n let canDrag = false\n let range = false\n let formatter: Intl.NumberFormat | undefined\n\n function updateState(node: m.Vnode<ScalarInputAttrs<T>>) {\n if (!formatter || node.attrs.decimals !== attrs.decimals) {\n formatter = new Intl.NumberFormat('en-US', {\n minimumFractionDigits: node.attrs.decimals ?? 1,\n maximumFractionDigits: node.attrs.decimals ?? 1,\n useGrouping: false,\n })\n }\n\n attrs = node.attrs\n min = attrs.min!\n max = attrs.max!\n step = attrs.step!\n range = !!attrs.range\n value = getControlValue<number>(attrs)\n readonly = !!attrs.readonly\n hasMinMax = min != null && max != null\n hasStep = step != null\n canDrag = hasMinMax || hasStep\n }\n\n function setModelValue(e: 'input' | 'change', v: number) {\n value = isNaN(v) ? null! : clamp(v, min, max)!\n setControlValue(attrs, value)\n const cb = e === 'input' ? attrs.oninput : attrs.onchange\n cb?.(attrs.value, value)\n m.redraw()\n }\n\n function onfocus() {\n editing = true\n }\n\n function onblur() {\n editing = false\n }\n\n function oninput(e: Event) {\n const el = e.target as HTMLInputElement\n setModelValue('input', parseFloat(el.value))\n }\n\n function onchange(e: Event) {\n const el = e.target as HTMLInputElement\n setModelValue('change', parseFloat(el.value))\n }\n\n function limit(v: number) {\n v = clamp(v, min, max)\n if (step != null) {\n v = Math.round(v / step) * step\n }\n return parseFloat(v.toFixed(5))\n }\n\n function onDragStart(e: MouseEvent) {\n if (!canDrag || readonly) {\n return\n }\n if (document.activeElement === e.target) {\n return\n }\n drag.activate(e)\n }\n\n let dragStartValue: number\n let dragStartInfo: TouchInfo\n let dragDidMove = false\n let drag = dragUtil({\n onStart: (e) => {\n e.preventDefault()\n ;(document.activeElement as HTMLElement)?.blur()\n dragDidMove = false\n dragStartValue = value\n dragStartInfo = getTouchInTarget(e, drag.target)\n },\n onMove: (e) => {\n e.preventDefault()\n document.body.classList.add('twk-dragging')\n dragDidMove = true\n drag.target?.blur()\n const touchInfo = getTouchInTarget(e, drag.target)\n const d = (dragStartInfo.x - touchInfo.x) / Math.max(touchInfo.width, 200)\n let v = dragStartValue\n if (hasMinMax) {\n v -= d * (max - min)\n } else if (hasStep) {\n v -= Math.round(d * 100) * step!\n }\n setModelValue('input', limit(v))\n },\n onEnd: (e) => {\n document.body.classList.remove('twk-dragging')\n const input = drag.target as HTMLInputElement\n if (!dragDidMove) {\n input.focus()\n } else {\n setModelValue('change', value)\n }\n drag.deactivate()\n },\n })\n\n function onwheel(e: WheelEvent) {\n if (!editing) {\n return\n }\n e.preventDefault()\n const dir = (e.ctrlKey ? 0.5 : 1) * clamp(e.deltaY, -1, 1)\n const add = (step || 0.2) * dir\n if (add) {\n setModelValue('change', limit((value || 0) - add))\n }\n }\n\n return {\n onremove: () => {\n drag.deactivate()\n },\n oninit: updateState,\n onbeforeupdate: updateState,\n view: (node) => {\n updateState(node)\n const scalar = hasMinMax ? (value - min) / (max - min) : NaN\n return m(\n 'div.twk-input.twk-scalar-input',\n {\n style: hasMinMax ? `--twk-scalar-value: ${scalar}` : '',\n class: uiClass(\n {\n 'twk-input-readonly': readonly,\n 'twk-scalar-dragable': !readonly && (hasMinMax || hasStep),\n 'twk-scalar-range': range,\n 'twk-scalar-dragging': !!drag.target,\n },\n node.attrs.class,\n ),\n },\n [\n node.attrs.slotBefore ? m('span', {}, node.attrs.slotBefore) : null,\n m('input', {\n type: editing ? 'number' : 'text',\n min: min,\n max: max,\n step: step,\n value: editing ? value : formatter!.format(value),\n onfocus: onfocus,\n onblur: onblur,\n oninput: oninput,\n onchange: onchange,\n onwheel: onwheel,\n onmousedown: onDragStart,\n ontouchstart: onDragStart,\n placeholder: placeholder!,\n disabled: readonly,\n }),\n node.attrs.unit ? m('span.twk-color-muted', {}, node.attrs.unit) : null,\n node.attrs.slotAfter ? m('span', {}, node.attrs.slotAfter) : null,\n ],\n )\n },\n }\n}\n","import m, { Children, Vnode } from 'mithril'\nimport { ControlAdapter, getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { call, dragUtil, getTouchInTarget, uiClass } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\nimport { uiScalarInput } from './scalar'\n\nexport type AngleWidgetAttrs<T = unknown> = CommonWidgetAttrs & AngleInputAttrs<T>\n\n/**\n * Spherical component model\n * @public\n */\nexport type AngleInputAttrs<T = unknown> = TweakableAttrs<T, number> & {\n /**\n * Whether to use degrees instead of radians\n */\n degree?: boolean\n\n /**\n * The min value in degrees\n */\n min?: number\n\n /**\n * The max value in degrees\n */\n max?: number\n\n /**\n * The step value in degrees\n */\n step?: number\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (target: T, value: number) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (target: T, value: number) => void\n}\n\nexport function uiAngleWidget<T>(\n attrs: AngleWidgetAttrs<T>,\n children?: Children,\n): Vnode<AngleWidgetAttrs<T>> {\n return m(AngleWidgetComponent<T>, attrs, children)\n}\n\nexport function uiAngleInput<T>(\n attrs: AngleInputAttrs<T>,\n children?: Children,\n): Vnode<AngleInputAttrs<T>> {\n return m(AngleInputComponent<T>, attrs, children)\n}\n\nexport const AngleWidgetComponent = <T>(): m.Component<AngleWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName || 'div'}.twk-angle-widget`,\n label: label ?? (rest.field as any),\n class: className,\n },\n [m(AngleInputComponent<T>, rest)],\n )\n },\n }\n}\n\nconst RAD_TO_DEG = 180 / Math.PI\nconst DEG_TO_RAD = Math.PI / 180\n\nexport const radToDegAdapter: ControlAdapter<number, number> = {\n toControl: (value: number) => value * RAD_TO_DEG,\n fromControl: (value: number) => value * DEG_TO_RAD,\n}\n\nexport const degToRadAdapter: ControlAdapter<number, number> = {\n toControl: (value: number) => value * DEG_TO_RAD,\n fromControl: (value: number) => value * RAD_TO_DEG,\n}\n\nexport const AngleInputComponent = <T>(): m.Component<AngleInputAttrs<T>> => {\n let angle = 0 // in radians\n let dragging = false\n let pos = [0, 0]\n let paneElement: HTMLElement\n let min: number\n let max: number\n let step: number | undefined\n let attrs: AngleInputAttrs<T>\n\n function clampAndSnapAngle(angle: number) {\n if (min != null && max != null) {\n if (min <= max) {\n if (angle < min) {\n angle = min\n } else if (angle > max) {\n angle = max\n }\n } else if (!(angle >= min || angle <= max)) {\n const dMin = Math.abs(angle - min)\n const dMax = Math.abs(angle - max)\n angle = dMin < dMax ? min : max\n }\n } else if (min != null) {\n if (angle < min) {\n angle = min\n }\n } else if (max != null) {\n if (angle > max) {\n angle = max\n }\n }\n\n if (step != null) {\n angle = Math.round(angle / step) * step\n }\n return angle\n }\n\n function wrapDegrees(angle: number) {\n angle = angle % 360\n if (angle < 0) {\n angle += 360\n }\n return angle\n }\n\n function updateState(node: Vnode<AngleInputAttrs<T>>) {\n attrs = node.attrs\n\n min = attrs.min!\n max = attrs.max!\n step = attrs.step!\n min = min != null ? wrapDegrees(min) * DEG_TO_RAD : null!\n max = max != null ? wrapDegrees(max) * DEG_TO_RAD : null!\n step = step != null ? wrapDegrees(step) * DEG_TO_RAD : null!\n angle = getControlValue(attrs) ?? angle\n if (attrs.degree) {\n angle = angle * DEG_TO_RAD\n }\n updatePositions()\n }\n\n function onEvent(type: 'change' | 'input') {\n updatePositions()\n const value = attrs.degree ? angle * RAD_TO_DEG : angle\n setControlValue(attrs, value)\n call(type === 'input' ? attrs.oninput : attrs.onchange, attrs.value, value)\n }\n\n function updatePositions() {\n pos[0] = Math.cos(angle)\n pos[1] = Math.sin(angle)\n }\n\n function onDragStart(e: MouseEvent) {\n dragging = true\n drag.activate(e)\n }\n\n let touchOffset: [number, number]\n const drag = dragUtil({\n onStart: (e) => {\n const touch = getTouchInTarget(e)\n touchOffset = [-(touch.x - touch.width / 2), -(touch.y - touch.height / 2)]\n },\n onMove: (e) => {\n e.preventDefault()\n const position = getTouchInTarget(e, paneElement, touchOffset)\n const px = position.normalizedX - 0.5\n const py = position.normalizedY - 0.5\n if (dragging) {\n angle = Math.atan2(px, -py)\n\n // ensure angle is always positive for better UX\n if (angle < 0) {\n angle += 2 * Math.PI\n }\n }\n angle = clampAndSnapAngle(angle)\n onEvent('input')\n m.redraw()\n },\n onEnd: () => {\n drag.deactivate()\n dragging = false\n onEvent('change')\n m.redraw()\n },\n })\n\n function wrapAngle(angle: number) {\n if (angle < 0) {\n angle += 360\n }\n return angle % 360\n }\n\n return {\n onremove: () => {\n drag.deactivate()\n },\n oninit: (node) => {\n updateState(node)\n },\n onupdate: (node) => {\n updateState(node)\n },\n view: ({ attrs: { ...rest } }: Vnode<AngleInputAttrs<T>>) => {\n return m(\n 'div.twk-angle-input',\n {\n style: {\n '--angle-value': `${wrapAngle(angle * RAD_TO_DEG)}`,\n },\n },\n [\n uiScalarInput({\n unit: attrs.degree ? '°' : 'rad',\n range: true,\n ...rest,\n slotAfter: m('span.twk-flex-row', [\n m('span.twk-color-dim', '/'),\n (attrs.degree ? angle : angle * RAD_TO_DEG).toFixed(1),\n m('span.twk-color-dim', attrs.degree ? 'rad' : '°'),\n ]),\n }),\n\n m('div.twk-angle-pane', {\n oncreate: (vnode) => (paneElement = vnode.dom as HTMLElement),\n // onmousedown: onDragStart,\n // ontouchstart: onDragStart,\n class: uiClass({\n 'is-dragging': dragging,\n }),\n style: {\n aspectRatio: '1',\n display: 'flex',\n 'align-items': 'center',\n 'justify-content': 'center',\n position: 'relative',\n },\n }),\n ],\n )\n },\n }\n}\n","import m, { Child, Children, Vnode } from 'mithril'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { uiClass } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\n\nexport type BooleanWidgetAttrs<T = unknown> = CommonWidgetAttrs & BooleanInputAttrs<T>\n\n/**\n * Describes a checkbox control\n * @public\n */\nexport type BooleanInputAttrs<T = unknown> = TweakableAttrs<T, boolean> & {\n /**\n * This is called when the control value changes\n */\n onchange?: (model: T, value: boolean) => void\n\n /**\n * This is called when the control value changes\n */\n oninput?: (model: T, value: boolean) => void\n\n /**\n * Content before the input field\n */\n slotBefore?: Child\n\n /**\n * Content after the input field\n */\n slotAfter?: Child\n\n /**\n * Content shown when the value is true\n */\n slotTrue?: Child\n\n /**\n * Content shown when the value is false\n */\n slotFalse?: Child\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n\n /**\n * Whether to use a toggle button style instead of a checkbox. By default, this is false (checkbox style).\n */\n toggle?: boolean\n\n /**\n * Aligns the checkbox to the start or end of the control.\n * By default, the checkbox is placed at the end of the control.\n */\n align?: 'start' | 'end'\n}\n\nexport function uiBoolWidget<T>(\n attrs: BooleanWidgetAttrs<T>,\n children?: Children,\n): Vnode<BooleanWidgetAttrs<T>> {\n return m(BoolWidgetComponent<T>, attrs, children)\n}\n\nexport function uiBoolInput<T>(\n attrs: BooleanInputAttrs<T>,\n children?: Children,\n): Vnode<BooleanInputAttrs<T>> {\n return m(BoolInputComponent<T>, attrs, children)\n}\n\nexport const BoolWidgetComponent = <T>(): m.Component<BooleanWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName}.twk-bool-widget`,\n label: label ?? (rest.field as any),\n class: className,\n },\n [m(BoolInputComponent<T>, rest)],\n )\n },\n }\n}\n\nexport const BoolInputComponent = <T>(): m.Component<BooleanInputAttrs<T>> => {\n let attrs: BooleanInputAttrs<T>\n\n function onchange(e: Event) {\n const value = (e.target as HTMLInputElement).checked\n setControlValue(attrs, value)\n attrs.oninput?.(attrs.value, value)\n attrs.onchange?.(attrs.value, value)\n }\n\n return {\n view: (node) => {\n attrs = node.attrs\n const checked = getControlValue(attrs) === true\n const alignEnd = attrs.align === 'end'\n return m(\n 'div.twk-bool-input',\n {\n class: uiClass({\n 'twk-align-start': !alignEnd,\n 'twk-align-end': !!alignEnd,\n 'twk-bool-true': checked,\n 'twk-bool-false': !checked,\n }),\n },\n [\n attrs.slotBefore,\n attrs.readonly\n ? checked\n ? attrs.slotTrue || m('span', 'true')\n : attrs.slotFalse || m('span', 'false')\n : m('input', {\n class: uiClass({\n 'twk-toggle': !!attrs.toggle,\n 'twk-check': !attrs.toggle,\n }),\n type: 'checkbox',\n checked: checked,\n onchange: onchange,\n }),\n\n attrs.slotAfter,\n node.children,\n ],\n )\n },\n }\n}\n","import { clamp } from '../core/utils'\r\nimport { HSV, RGB } from './types'\r\n\r\n/**\r\n * Converts hsv to rgb\r\n *\r\n * @public\r\n * @param hsv - HSV components where H is in range [0:360] and S and V are in range [0:1]\r\n * @returns RGB color components in range [0:1]\r\n */\r\nexport function hsv2rgb(hsv: HSV): RGB {\r\n let H = hsv.h % 360\r\n let S = clamp(hsv.s, 0, 1)\r\n let V = clamp(hsv.v, 0, 1)\r\n\r\n let C = V * S\r\n let X = C * (1 - Math.abs(((H / 60) % 2) - 1))\r\n let m = V - C\r\n\r\n const rgb: RGB = { r: 0, g: 0, b: 0 }\r\n if (H < 60) {\r\n rgb.r = C\r\n rgb.g = X\r\n rgb.b = 0\r\n } else if (H < 120) {\r\n rgb.r = X\r\n rgb.g = C\r\n rgb.b = 0\r\n } else if (H < 180) {\r\n rgb.r = 0\r\n rgb.g = C\r\n rgb.b = X\r\n } else if (H < 240) {\r\n rgb.r = 0\r\n rgb.g = X\r\n rgb.b = C\r\n } else if (H < 300) {\r\n rgb.r = X\r\n rgb.g = 0\r\n rgb.b = C\r\n } else {\r\n rgb.r = C\r\n rgb.g = 0\r\n rgb.b = X\r\n }\r\n\r\n rgb.r += m\r\n rgb.g += m\r\n rgb.b += m\r\n\r\n return rgb\r\n}\r\n\r\n/**\r\n * Converts rgb to hsv\r\n *\r\n * @public\r\n * @remarks\r\n * The RGB components are assumed to be in range [0:1].\r\n * The resulting H component is in range [0:360] and S and V in range [0:1]\r\n */\r\nexport function rgb2hsv(rgb: RGB): HSV {\r\n let r = rgb.r\r\n let g = rgb.g\r\n let b = rgb.b\r\n\r\n let V = Math.max(r, g, b)\r\n let d = V - Math.min(r, g, b)\r\n\r\n let S = 0\r\n let H = 0\r\n if (d !== 0) {\r\n S = d / V\r\n if (V === r) {\r\n H = (g - b) / d + (g < b ? 6 : 0)\r\n H = (H % 6) * 60\r\n } else if (V === g) {\r\n H = (b - r) / d + 2\r\n H = H * 60\r\n } else {\r\n H = (r - g) / d + 4\r\n H = H * 60\r\n }\r\n }\r\n\r\n return { h: H, s: S, v: V }\r\n}\r\n","import { ColorAdapter, RGBA } from './types'\n\nexport class ArrayColorAdapter implements ColorAdapter<number[]> {\n constructor(\n private components: string[],\n private normalized: boolean,\n ) {\n //\n }\n public toControl(v: number[]) {\n v = v || []\n const result: RGBA = { r: 0, g: 0, b: 0, a: 1 }\n this.components.forEach((key, i) => {\n result[key] = (v[i] || 0) / (this.normalized ? 1 : 255)\n })\n return result\n }\n\n public fromControl(rgba: RGBA) {\n return this.components.map(\n (key) => (this.normalized ? rgba[key] : Math.round(rgba[key] * 255)) || 0,\n )\n }\n}\n","import { ColorAdapter, RGBA } from './types'\n\nexport class CssColorAdapter implements ColorAdapter<string> {\n private components: string[] = ['r', 'g', 'b', 'a']\n\n public constructor(components: string[]) {\n this.components = components\n }\n\n public toControl(value: string) {\n value = value || 'rgba(0, 0, 0)'\n const result: RGBA = { r: 0, g: 0, b: 0, a: 1 }\n const values = value\n .replace(/[rgba\\(\\)]/gi, '')\n .split(/,\\s*?/gi)\n .map(Number)\n this.components.forEach((key, i) => {\n result[key] = (values[i] || 0) / (key === 'a' ? 1 : 255)\n })\n return result\n }\n\n public fromControl(rgba: RGBA) {\n return (\n this.components.join('') +\n '(' +\n this.components\n .map((key) => {\n return key === 'a' ? rgba[key] : Math.round(rgba[key] * 255)\n })\n .join(', ') +\n ')'\n )\n }\n}\n","import { padLeft } from '../core/utils'\nimport { ColorAdapter, RGBA } from './types'\n\nexport class HexColorAdapter implements ColorAdapter<string> {\n constructor(\n private components: string[],\n private prefix = '#',\n ) {}\n public toControl(value?: string) {\n value = value || '#000'\n const result: RGBA = { r: 0, g: 0, b: 0, a: 1 }\n let v = value.match(/[0-9a-f]+/i)?.[0]\n if (v == null) {\n return result\n }\n if (v.length === this.components.length) {\n v = v\n .split('')\n .map((it) => `${it}${it}`)\n .join('')\n }\n this.components.forEach((key, i) => {\n result[key] = parseInt(v.substr(i * 2, 2), 16) / 255\n })\n return result\n }\n\n public fromControl(rgba: RGBA) {\n return (\n this.prefix +\n this.components\n .map((key) => padLeft(Math.round(rgba[key] * 255).toString(16), 2, '0'))\n .join('')\n )\n }\n}\n","import { padLeft } from '../core/utils'\nimport { ColorAdapter, RGBA } from './types'\n\nexport class NumberColorAdapter implements ColorAdapter<number> {\n private componentsRev: string[]\n constructor(private components: string[]) {\n this.componentsRev = components.slice().reverse()\n }\n public toControl(v: number) {\n v = v || 0\n const result: RGBA = { r: 0, g: 0, b: 0, a: 1 }\n this.components.forEach((key, i) => {\n result[key] = ((v >> (i * 8)) & 255) / 255\n })\n return result\n }\n\n public fromControl(rgba: RGBA) {\n const val = this.componentsRev\n .map((key) => padLeft(Math.round(rgba[key] * 255 || 0).toString(16), 2, '0'))\n .join('')\n return parseInt('0x' + val, 16)\n }\n}\n","import { ColorAdapter, RGBA } from './types'\n\nconst components = ['r', 'g', 'b', 'a']\nexport class ObjectColorCodec implements ColorAdapter<{ [key: string]: number }> {\n constructor(\n private components: string[],\n private normalized: boolean,\n ) {\n //\n }\n public toControl(v: { [key: string]: number }) {\n v = v || {}\n const result: RGBA = { r: 0, g: 0, b: 0, a: 1 }\n this.components.forEach((key, i) => {\n result[components[i]] = (v[key] || 0) / (this.normalized ? 1 : 255)\n })\n return result\n }\n\n public fromControl(rgba: RGBA) {\n const result: { [key: string]: number } = {}\n this.components.forEach((key, i) => {\n result[key] = (this.normalized ? rgba[components[i]] : Math.round(rgba[key] * 255)) || 0\n })\n return result\n }\n}\n","import { ArrayColorAdapter } from './array-format'\nimport { CssColorAdapter } from './css-string-format'\nimport { HexColorAdapter } from './hex-string-format'\nimport { NumberColorAdapter } from './number-format'\nimport { ObjectColorCodec } from './object-format'\nimport { ColorAdapter } from './types'\n\nconst codecs: { [key: string]: ColorAdapter<any> } = {}\n\n/**\n * Gets a formatter implementation for the given format\n *\n * @public\n * @param format - The format code\n */\nexport function getColorAdapter(format: string = 'rgb()'): ColorAdapter<any> {\n if (format in codecs) {\n return codecs[format]\n }\n\n {\n // array format\n // - prefix: [] or [n]\n // - optional trailing layout of components (e.g. [n]bgra)\n const match = format.match(/^\\[(n?)\\]([rgba]+)?$/i)\n if (match) {\n const isNormalized = !!match[1]\n const components = (match[2] || 'rgba').toLowerCase().split('')\n codecs[format] = new ArrayColorAdapter(components, isNormalized)\n return codecs[format]\n }\n }\n\n {\n // object format\n // - prefix: {} or {n} for normalized values\n // - optional trailing mapping of (e.g. {n}xyzw, to map rgba to xyzw)\n const match = format.match(/^\\{(n?)\\}([rgbaxyzw]+)?$/i)\n if (match) {\n const isNormalized = !!match[1]\n const components = (match[2] || 'rgba').split('')\n codecs[format] = new ObjectColorCodec(components, isNormalized)\n return codecs[format]\n }\n }\n\n {\n // number format\n // - prefix: 0x\n // - optional trailing mapping of (e.g. 0xRGBA)\n const match = format.match(/^0x([rgba]+)?$/i)\n if (match) {\n const components = (match[1] || 'rgba').toLowerCase().split('')\n codecs[format] = new NumberColorAdapter(components)\n return codecs[format]\n }\n }\n\n {\n // hex format\n // - prefix: #\n // - optional trailing mapping of (e.g. #RGBA)\n const match = format.match(/^#([rgba]+)?$/)\n if (match) {\n const components = (match[1] || 'rgba').toLowerCase().split('')\n codecs[format] = new HexColorAdapter(components, '#')\n return codecs[format]\n }\n }\n\n {\n // css format\n // - suffix: ()\n // - leading mapping (e.g. rgb() or rgba())\n const match = format.match(/^(rgb|rgba)\\(\\)$/)\n if (match) {\n const components = (match[2] || 'rgba').toLowerCase().split('')\n codecs[format] = new CssColorAdapter(components)\n return codecs[format]\n }\n }\n {\n // hex format without # prefix\n // - trailing mapping of (e.g. RGBA)\n const match = format.match(/^[rgba]+$/)\n if (match) {\n const components = format.split('')\n codecs[format] = new HexColorAdapter(components, '')\n return codecs[format]\n }\n }\n return codecs[format]\n}\n","import m, { Children, Vnode } from 'mithril'\nimport { getColorAdapter, HSV, hsv2rgb, HSVA, rgb2hsv, RGBA } from '../../color'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { call, clamp, getTouchPoint } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\n\nexport type ColorPickerWidgetAttrs<T = unknown> = CommonWidgetAttrs & ColorPickerAttrs<T>\n\n/**\n * Color picker component model\n *\n * @public\n */\nexport type ColorPickerAttrs<T = unknown> = TweakableAttrs<T, any> & {\n /**\n * The format of the string value. Defaults to 'rgb'\n *\n * @remarks\n * This must be a combination of the letters `r`, `g`, `b` and `a`.\n *\n * A prefix of `#` indicates the input/output is a hex string. e.g. #rgba\n *\n * A prefix of `0x` indicates the input is a number. e.g. 0xrgba\n *\n * A prefix of `[]` indicates the input is an array of numbers. e.g. `[]rgba`\n *\n * If a prefix is missing `#` is assumed\n */\n format?: string\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: any) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: any) => void\n}\n\nexport function uiColorPickerWidget<T>(\n attrs: ColorPickerWidgetAttrs<T>,\n children?: Children,\n): Vnode<ColorPickerWidgetAttrs<T>> {\n return m(ColorPickerWidgetComponent<T>, attrs, children)\n}\n\nexport function uiColorPicker<T>(\n attrs: ColorPickerAttrs<T>,\n children?: Children,\n): Vnode<ColorPickerAttrs<T>> {\n return m(ColorPicker<T>, attrs, children)\n}\n\nexport const ColorPickerWidgetComponent = <T>(): m.Component<ColorPickerWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName || 'div'}.twk-picker-color-widget`,\n label: label ?? (rest.field as any),\n class: className,\n },\n [m(ColorPicker<T>, rest)],\n )\n },\n }\n}\n\nexport const ColorPicker = <T>(): m.Component<ColorPickerAttrs<T>> => {\n let hue = 0 // range [0,1]\n let sat = 0 // range [0,1]\n let val = 0 // range [0,1]\n let a = 0 // range [0,1]\n let attrs: ColorPickerAttrs<T>\n\n function getHSVA(s = sat, v = val): HSVA {\n return {\n h: hue * 360,\n s: s,\n v: v,\n a: a,\n }\n }\n\n function getRGB(s = sat, v = val) {\n return hsv2rgb(getHSVA(s, v))\n }\n\n function getRGBA(s = sat, v = val, alpha = a): RGBA {\n return { ...getRGB(s, v), a: alpha }\n }\n\n function setHSV(hsv: HSV) {\n hue = hsv.h / 360\n sat = hsv.s\n val = hsv.v\n }\n\n function setHSVA(hsv: HSVA) {\n setHSV(hsv)\n a = hsv.a\n }\n\n function getHexRGB(s?: number, v?: number) {\n return getColorAdapter('#rgb').fromControl(getRGBA(s, v))\n }\n\n function getHexRGBA(s?: number, v?: number) {\n return getColorAdapter('#rgba').fromControl(getRGBA(s, v))\n }\n\n function getCssRGBA(s = sat, v = val, alpha: number = a) {\n return getColorAdapter('rgba()').fromControl(getRGBA(s, v, alpha))\n }\n\n function parseInput(value: string | number | number[], format: string | undefined) {\n const rgba = getColorAdapter(format || 'rgb').toControl(value)\n setHSVA({\n ...rgb2hsv(rgba),\n a: rgba.a,\n })\n }\n\n function formatOutput(format: string | undefined) {\n return getColorAdapter(format).fromControl(getRGBA())\n }\n\n function triggerInput() {\n const value = formatOutput(attrs.format)\n const written = setControlValue(attrs, value)\n call(attrs.oninput, attrs.value, written)\n }\n\n function triggerChange() {\n const value = formatOutput(attrs.format)\n const written = setControlValue(attrs, value)\n call(attrs.onchange, attrs.value, written)\n }\n\n function hasAlpha() {\n return attrs.format?.match(/a/i)\n }\n\n //\n // manual input\n //\n\n function inputR(e: Event) {\n input(e, 'r')\n }\n\n function inputG(e: Event) {\n input(e, 'g')\n }\n\n function inputB(e: Event) {\n input(e, 'b')\n }\n\n function input(e: Event, field: keyof RGBA) {\n const color = getRGBA()\n color[field] = parseInt((e.target as HTMLInputElement).value, 10) / 255\n setHSV(rgb2hsv(color))\n triggerInput()\n triggerChange()\n }\n\n function inputHex(e: Event) {\n parseInput((e.target as HTMLInputElement).value, hasAlpha() ? 'rgba' : 'rgb')\n triggerInput()\n triggerChange()\n }\n\n //\n // drag input\n //\n\n let target: HTMLElement | null = null\n let kind: 'sv' | 'h' | 'a'\n function beginPickSV(e: MouseEvent) {\n kind = 'sv'\n enableDrag(e.target as HTMLElement)\n onMouseMove(e)\n }\n\n function beginPickH(e: MouseEvent) {\n kind = 'h'\n enableDrag(e.target as HTMLElement)\n onMouseMove(e)\n }\n\n function beginPickA(e: MouseEvent) {\n kind = 'a'\n enableDrag(e.target as HTMLElement)\n onMouseMove(e)\n }\n\n function enableDrag(el: HTMLElement) {\n disableDrag()\n target = el\n const options = { passive: false }\n document.addEventListener('mousemove', onMouseMove, options)\n document.addEventListener('mouseup', onMouseUp, options)\n document.addEventListener('touchmove', onMouseMove, options)\n document.addEventListener('touchend', onMouseUp, options)\n document.addEventListener('touchcancel', onMouseUp, options)\n }\n\n function disableDrag() {\n document.removeEventListener('mousemove', onMouseMove)\n document.removeEventListener('mouseup', onMouseUp)\n document.removeEventListener('touchmove', onMouseMove)\n document.removeEventListener('touchend', onMouseUp)\n document.removeEventListener('touchcancel', onMouseUp)\n }\n\n function onMouseMove(e: MouseEvent | TouchEvent) {\n if (!target) {\n return\n }\n e.preventDefault()\n\n const rect = target.getBoundingClientRect()\n const tx = window.pageXOffset || document.documentElement.scrollLeft\n const ty = window.pageYOffset || document.documentElement.scrollTop\n const cw = target.clientWidth\n const ch = target.clientHeight\n let [cx, cy] = getTouchPoint(e)\n cx = clamp((cx - tx - rect.left) / cw, 0, 1)\n cy = clamp((cy - ty - rect.top) / ch, 0, 1)\n\n if (kind === 'sv') {\n sat = cx\n val = 1 - cy\n }\n if (kind === 'h') {\n hue = 1 - cx\n }\n if (kind === 'a') {\n a = cx\n }\n\n triggerInput()\n m.redraw()\n }\n\n function onMouseUp() {\n if (target != null) {\n target = null\n disableDrag()\n triggerChange()\n }\n }\n\n return {\n onremove: () => {\n disableDrag()\n },\n oninit: (node) => {\n attrs = node.attrs\n parseInput(getControlValue(attrs), attrs.format)\n },\n onupdate: (node) => {\n attrs = node.attrs\n parseInput(getControlValue(attrs), attrs.format)\n },\n view: (node) => {\n attrs = node.attrs\n parseInput(getControlValue(attrs), attrs.format)\n const rgba = getRGBA()\n return m('div.twk-color-picker', {}, [\n m(\n '.color-picker-inputs',\n m(\"input.twk-input.input-hex[type='text']\", {\n value: hasAlpha() ? getHexRGBA() : getHexRGB(),\n onchange: inputHex,\n }),\n m(\"input.twk-input.input-r[type='number']\", {\n min: 0,\n max: 255,\n step: 1,\n value: Math.round(rgba.r * 255),\n onchange: inputR,\n }),\n m(\"input.twk-input.input-g[type='number']\", {\n min: 0,\n max: 255,\n step: 1,\n value: Math.round(rgba.g * 255),\n onchange: inputG,\n }),\n m(\"input.twk-input.input-b[type='number']\", {\n min: 0,\n max: 255,\n step: 1,\n value: Math.round(rgba.b * 255),\n onchange: inputB,\n }),\n ),\n m(\n '.color-picker-panel',\n m(\n '.color-picker-sv',\n {\n tabindex: 0,\n onmousedown: beginPickSV,\n ontouchstart: beginPickSV,\n style: {\n 'background-color': `${getCssRGBA(1, 1, 1)}`,\n 'user-select': 'none',\n },\n },\n m('.color-picker-sv-bg', {\n style: {\n background: 'linear-gradient(to right,rgba(255,255,255,1),rgba(255,255,255,0))',\n 'user-select': 'none',\n 'pointer-events': 'none',\n },\n }),\n m('.color-picker-sv-bg', {\n style: {\n background: 'linear-gradient(to top,rgba(0,0,0,1),rgba(0,0,0,0))',\n 'user-select': 'none',\n 'pointer-events': 'none',\n },\n }),\n m('.color-picker-sv-cursor', {\n style: {\n 'user-select': 'none',\n 'pointer-events': 'none',\n 'background-color': `${getCssRGBA(hue, sat, 1)}`,\n left: `${sat * 100}%`,\n top: `${(1 - val) * 100}%`,\n },\n }),\n ),\n m(\n '.color-picker-h',\n {\n tabindex: 0,\n onmousedown: beginPickH,\n ontouchstart: beginPickH,\n style: {\n 'user-select': 'none',\n background:\n 'linear-gradient(to right, #f00 0, #f0f 17% , #00f 33% , #0ff 50% , #0f0 67% , #ff0 83% , #f00 100%)',\n },\n },\n m('.color-picker-h-cursor', {\n style: {\n 'user-select': 'none',\n 'pointer-events': 'none',\n 'background-color': `${getCssRGBA(1, 1, 1)}`,\n position: 'absolute',\n left: `${(1 - hue) * 100}%`,\n },\n }),\n ),\n !hasAlpha()\n ? null\n : m(\n '.color-picker-a',\n {\n tabindex: 0,\n onmousedown: beginPickA,\n ontouchstart: beginPickA,\n style: {\n 'user-select': 'none',\n },\n },\n m('.color-picker-a-bg', {\n style: {\n background: `linear-gradient(to right, ${getCssRGBA(\n sat,\n val,\n 0,\n )}, ${getCssRGBA(sat, val, 1)})`,\n },\n }),\n m('.color-picker-a-cursor', {\n style: {\n 'user-select': 'none',\n 'pointer-events': 'none',\n position: 'absolute',\n left: `${a * 100}%`,\n },\n }),\n ),\n ),\n ])\n },\n }\n}\n","import m, { Children, Vnode } from 'mithril'\nimport { getColorAdapter } from '../../color'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { isArray, isNumber, isObject, isString, padLeft } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\nimport { uiColorPicker } from './color-picker'\n\nexport type ColorWidgetAttrs<T = unknown> = CommonWidgetAttrs & ColorAttrs<T>\n\n/**\n * Color component model\n * @public\n */\nexport type ColorAttrs<T = unknown> = TweakableAttrs<T, any> & {\n /**\n * The format of the string value. Defaults to 'rgb'\n *\n * @remarks\n * This must be a combination of the letters r, g, b and a\n * and it must match the input value.\n */\n format?: string\n\n /**\n * Whether each component is normalized to range [0:1]\n */\n normalized?: boolean\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: any) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: any) => void\n}\n\nexport function uiColorWidget<T>(\n attrs: ColorWidgetAttrs<T>,\n children?: Children,\n): Vnode<ColorWidgetAttrs<T>> {\n return m(ColorWidgetComponent<T>, attrs, children)\n}\n\nexport function uiColor<T>(attrs: ColorAttrs<T>, children?: Children): Vnode<ColorAttrs<T>> {\n return m(ColorComponent<T>, attrs, children)\n}\n\nexport const ColorWidgetComponent = <T>(): m.Component<ColorWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName || ''}.twk-color-widget`,\n label: label ?? (rest.field as any),\n class: className,\n },\n [m(ColorComponent<T>, rest)],\n )\n },\n }\n}\n\nexport const ColorComponent = <T>(): m.Component<ColorAttrs<T>> => {\n let attrs: ColorAttrs<T>\n let opened = false\n let rgba: string\n let value: any\n const codec = getColorAdapter('rgba()')\n\n function updateState(node: Vnode<ColorAttrs<T>>) {\n attrs = node.attrs\n value = getControlValue(attrs)\n rgba = codec.fromControl(getColorAdapter(attrs.format).toControl(value))\n }\n\n function toggle() {\n opened = !opened\n }\n\n function onPickerInput(p: T, v: any) {\n setControlValue(attrs, v)\n attrs.oninput?.(attrs.value, v)\n }\n\n function onPickerChange(p: T, v: any) {\n setControlValue(attrs, v)\n attrs.onchange?.(attrs.value, v)\n }\n\n function getText() {\n if (isString(value)) {\n return value\n }\n if (isNumber(value)) {\n return '0x' + padLeft(value.toString(16), 8, '0')\n }\n if (isArray(value)) {\n return value.map((it: number) => (it < 1 && it > 0 ? it.toFixed(2) : it)).join(' , ')\n }\n if (isObject(value)) {\n return Object.keys(value)\n .map((k) => {\n const it = (value as any)[k]\n return `${k}: ${it < 1 && it > 0 ? it.toFixed(2) : it}`\n })\n .join(' ')\n }\n if (value == null) {\n return 'null'\n }\n return '?'\n }\n\n return {\n oninit: updateState,\n onbeforeupdate: updateState,\n view: ({ attrs: { value, field, binding, format } }) => {\n return [\n m(\n 'div.twk-color-input',\n {\n style: { '--twk-color-value': rgba },\n },\n m(\n \"button.twk-btn[type='button']\",\n {\n onclick: toggle,\n },\n getText() || '?',\n ),\n opened\n ? m.fragment({}, [\n uiColorPicker({\n binding: binding as never,\n value: value as any,\n field: field,\n format: format,\n oninput: onPickerInput,\n onchange: onPickerChange,\n }),\n ])\n : null,\n ),\n ]\n },\n }\n}\n","import m, { Child, Children, Vnode } from 'mithril'\nimport { getControlValue, setControlValue } from '../../core'\nimport { uiWidget, ValueWidgetAttrs } from '../elements'\n\n/**\n * Basic input component model\n * @public\n */\nexport type InputWidgetAttrs<T = unknown> = ValueWidgetAttrs<T, string> & {\n /**\n * The placeholder text\n */\n placeholder?: string\n\n /**\n * Content before the input field\n */\n slotBefore?: Child\n\n /**\n * Content after the input field\n */\n slotAfter?: Child\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: string) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: string) => void\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n\n /**\n *\n */\n type?: string\n}\n\nexport function uiInputWidget<T>(\n attrs: InputWidgetAttrs<T>,\n children?: Children,\n): Vnode<InputWidgetAttrs<T>> {\n return m(InputWidgetComponent<T>, attrs, children)\n}\n\nexport function uiInput<T>(\n attrs: InputWidgetAttrs<T>,\n children?: Children,\n): Vnode<InputWidgetAttrs<T>> {\n return m(InputComponent<T>, attrs, children)\n}\n\nexport const InputWidgetComponent = <T>(): m.Component<InputWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName || 'div'}.twk-input-widget`,\n label: label ?? (rest.field as any),\n class: className,\n },\n m(InputComponent<T>, rest),\n )\n },\n }\n}\n\nexport const InputComponent = <T>(): m.Component<InputWidgetAttrs<T>> => {\n let attrs: InputWidgetAttrs<T>\n function onchange(e: Event) {\n const el = e.target as HTMLInputElement\n const value = el.value\n setControlValue(attrs, value)\n const cb = e.type === 'input' ? attrs.oninput : attrs.onchange\n cb?.(attrs.value, value)\n }\n\n return {\n view: (node) => {\n attrs = node.attrs\n return m('div.twk-input', {}, [\n node.attrs.slotBefore ? m('span', {}, node.attrs.slotBefore) : null,\n m('input', {\n type: attrs.type || 'text',\n value: getControlValue(attrs),\n oninput: onchange,\n onchange: onchange,\n placeholder: attrs.placeholder,\n disabled: attrs.readonly,\n }),\n node.attrs.slotAfter ? m('span', {}, node.attrs.slotAfter) : null,\n ])\n },\n }\n}\n","import m, { Children, Vnode } from 'mithril'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\nimport { uiScalarInput } from './scalar'\n\n/**\n * @public\n */\nexport type MatrixElements = number[]\nexport type MatrixWidgetAttrs<T = unknown> = CommonWidgetAttrs & MatrixInputAttrs<T>\n\n/**\n * Matrix component model\n * @public\n */\nexport type MatrixInputAttrs<T = unknown> = TweakableAttrs<T, MatrixElements> & {\n /**\n * The number of rows in the matrix\n */\n rows: number\n /**\n * The number of columns in the matrix\n */\n cols: number\n /**\n * Whether the input values are ordered in row-major order. Default assumes column-major order.\n */\n rowMajor?: boolean\n /**\n * The min value\n */\n min?: number\n /**\n * The max value\n */\n max?: number\n /**\n * The step value\n */\n step?: number\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: unknown) => void\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: unknown) => void\n /**\n * Disables the control input\n */\n readonly?: boolean\n}\n\nexport function uiMatrixWidget<T>(\n attrs: MatrixWidgetAttrs<T>,\n children?: Children,\n): Vnode<MatrixWidgetAttrs<T>> {\n return m(MatrixWidgetComponent<T>, attrs, children)\n}\n\nexport const MatrixWidgetComponent = <T>(): m.Component<MatrixWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName || ''}.twk-matrix-widget`,\n label: label ?? (rest.field as any),\n class: className,\n },\n [m(MatrixInputComponent<T>, rest)],\n )\n },\n }\n}\nexport function uiMatrixInput<T>(\n attrs: MatrixInputAttrs<T>,\n children?: Children,\n): Vnode<MatrixInputAttrs<T>> {\n return m(MatrixInputComponent<T>, attrs, children)\n}\n\nexport const MatrixInputComponent = <T>(): m.Component<MatrixInputAttrs<T>> => {\n let attrs: MatrixInputAttrs<T>\n\n function onchange(type: 'input' | 'change', field: number, v: number) {\n const value = getControlValue(attrs) || ({} as any)\n value[field] = v\n setControlValue(attrs, value)\n const cb = type === 'input' ? attrs.oninput : attrs.onchange\n cb?.(attrs.value, value)\n }\n\n function indices(rows: number, cols: number) {\n const result: number[] = []\n cols = attrs.rowMajor ? rows : cols\n rows = attrs.rowMajor ? cols : rows\n for (let c = 0; c < cols; c++) {\n for (let r = 0; r < rows; r++) {\n result.push(r * cols + c)\n }\n }\n return result\n }\n\n return {\n view: (node) => {\n attrs = node.attrs\n const cols = attrs.cols ?? 1\n const rows = attrs.rows ?? 1\n const value = getControlValue(attrs)\n return m(\n 'div.twk-matrix-input',\n {\n style: {\n display: 'grid',\n gridTemplateColumns: `repeat(${cols}, auto)`,\n },\n },\n indices(rows, cols).map((field) => {\n return uiScalarInput({\n min: attrs.min,\n max: attrs.max,\n step: attrs.step,\n value,\n field,\n readonly: attrs.readonly,\n oninput: (_, v) => onchange('input', field, v as number),\n onchange: (_, v) => onchange('change', field, v as number),\n })\n }),\n )\n },\n }\n}\n","import m, { Children, Vnode } from 'mithril'\n\nimport { getControlValue, TweakableAttrs } from '../../core'\nimport { call, clamp, dragUtil, getTouchPoint, uiClass } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\n\nexport type PointWidgetAttrs<T = unknown> = CommonWidgetAttrs & PointInputAttrs<T>\n\n/**\n * Point component model\n * @public\n */\nexport type PointInputAttrs<T = unknown> = TweakableAttrs<T, any> & {\n /**\n * The object field names. Defaults to `['x', 'y']`\n */\n keys?: string[]\n\n /**\n * X-Axis min and max valuse\n */\n rangeX?: [number, number]\n\n /**\n * Y-Axis min and max valuse\n */\n rangeY?: [number, number]\n\n /**\n * Value to reset to when released\n */\n reset?: [number, number]\n\n /**\n * Snap to grid value\n */\n snap?: number\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: PointInputAttrs<T>, value: number) => void\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: PointInputAttrs<T>, value: number) => void\n}\n\nconst DEFAULT_RANGE = [0, 1]\nconst DEFAULT_KEYS = ['x', 'y']\n\nexport function uiPointWidget<T>(\n attrs: PointWidgetAttrs<T>,\n children?: Children,\n): Vnode<PointWidgetAttrs<T>> {\n return m(PointWidgetComponent<T>, attrs, children)\n}\n\nexport function uiPoint<T>(\n attrs: PointWidgetAttrs<T>,\n children?: Children,\n): Vnode<PointWidgetAttrs<T>> {\n return m(PointWidgetComponent<T>, attrs, children)\n}\n\nexport function uiPointInput<T>(\n attrs: PointInputAttrs<T>,\n children?: Children,\n): Vnode<PointInputAttrs<T>> {\n return m(PointInputComponent<T>, attrs, children)\n}\n\nexport const PointWidgetComponent = <T>(): m.Component<PointWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName || 'div'}.twk-point-widget`,\n label: label ?? (rest.field as any),\n class: uiClass('twk-point', className),\n },\n [m(PointInputComponent<T>, rest)],\n )\n },\n }\n}\n\nexport const PointInputComponent = <T>(): m.Component<PointInputAttrs<T>> => {\n let kx: any\n let ky: any\n let xRange = DEFAULT_RANGE\n let yRange = DEFAULT_RANGE\n let vx = 0\n let vy = 0\n let x = 0\n let y = 0\n let rx: number\n let ry: number\n let snap: number\n let attrs: PointInputAttrs<T>\n\n function updateState(node: m.Vnode<PointInputAttrs<T>>) {\n attrs = node.attrs\n const keys = attrs.keys || DEFAULT_KEYS\n kx = keys[0]\n ky = keys[1]\n const value: any = getControlValue(attrs) ?? {\n [kx]: vx,\n [ky]: vy,\n }\n snap = attrs.snap!\n vx = value[kx] || 0\n vy = value[ky] || 0\n xRange = attrs.rangeX || xRange\n yRange = attrs.rangeY || yRange\n x = (vx - xRange[0]) / (xRange[1] - xRange[0])\n y = (vy - yRange[0]) / (yRange[1] - yRange[0])\n const reset = attrs.reset\n if (reset) {\n rx = (reset[0] - xRange[0]) / (xRange[1] - xRange[0])\n ry = (reset[1] - yRange[0]) / (yRange[1] - yRange[0])\n }\n }\n\n function updateValue() {\n vx = xRange[0] + (xRange[1] - xRange[0]) * x\n vy = yRange[0] + (yRange[1] - yRange[0]) * y\n if (snap > 0) {\n vx = Math.floor(vx / snap) * snap\n vy = Math.floor(vy / snap) * snap\n x = (vx - xRange[0]) / (xRange[1] - xRange[0])\n y = (vy - yRange[0]) / (yRange[1] - yRange[0])\n }\n }\n\n function onchange(type: 'change' | 'input') {\n updateValue()\n const value: any = getControlValue(attrs) ?? {\n [kx]: vx,\n [ky]: vy,\n }\n value[kx] = vx\n value[ky] = vy\n call(type === 'input' ? attrs.oninput : attrs.onchange, attrs, value)\n }\n\n function onMouseDown(e: MouseEvent) {\n drag.activate(e)\n }\n\n const drag = dragUtil({\n onMove: (e) => {\n e.preventDefault()\n const target = drag.target!\n const rect = target.getBoundingClientRect()\n const tx = window.pageXOffset || document.documentElement.scrollLeft\n const ty = window.pageYOffset || document.documentElement.scrollTop\n\n const cw = target.clientWidth\n const ch = target.clientHeight\n let [cx, cy] = getTouchPoint(e)\n x = clamp((cx - tx - rect.left) / cw, 0, 1)\n y = clamp((cy - ty - rect.top) / ch, 0, 1)\n\n onchange('input')\n m.redraw()\n },\n onEnd: () => {\n drag.deactivate()\n if (rx != null && ry != null) {\n x = rx\n y = ry\n onchange('input')\n }\n onchange('change')\n m.redraw()\n },\n })\n\n return {\n onremove: drag.deactivate,\n oninit: updateState,\n onupdate: updateState,\n view: (node) => {\n updateState(node)\n return m(\n '.point-area',\n {\n tabindex: 0,\n onmousedown: onMouseDown,\n ontouchstart: onMouseDown,\n },\n m('.point-x-axis', {\n style: {\n 'pointer-events': 'none',\n position: 'absolute',\n left: 0,\n right: 0,\n top: `${y * 100}%`,\n height: `1px`,\n },\n }),\n m('.point-y-axis', {\n style: {\n 'pointer-events': 'none',\n position: 'absolute',\n left: `${x * 100}%`,\n top: 0,\n bottom: 0,\n width: `1px`,\n },\n }),\n m('.point-cursor', {\n style: {\n 'pointer-events': 'none',\n left: `${x * 100}%`,\n top: `${y * 100}%`,\n position: 'absolute',\n width: '11px',\n height: '11px',\n 'margin-top': '-5px',\n 'margin-left': '-5px',\n border: '1px solid white',\n 'border-radius': '5px',\n 'box-shadow': '0px 0px 2px 1px rgba(0, 0, 0, 0.75)',\n },\n }),\n )\n },\n }\n}\n","import m, { Children, Vnode } from 'mithril'\n\nimport { getControlValue, setControlValue } from '../../core'\nimport { isNumber, isString } from '../../core/utils'\nimport { uiWidget, ValueWidgetAttrs } from '../elements'\n\n/**\n * @public\n */\nexport type SelectOption = {\n label: string\n value: unknown\n disabled?: boolean\n}\n/**\n * @public\n */\nexport type SelectOptionArray = Array<SelectOption | SelectOptionGroup | string | number>\n/**\n * @public\n */\nexport type SelectOptionsObject = {\n [key: string]: unknown\n}\n/**\n * @public\n */\nexport type SelectOptionGroup<T = SelectOptionArray | SelectOptionsObject> = {\n label: string\n options: T\n disabled?: boolean\n}\n\n/**\n * Select component select options\n * @public\n */\nexport type SelectModelOptions = SelectOptionArray | SelectOptionsObject\n\n/**\n * Select component model\n * @public\n */\nexport type SelectAttrs<T = unknown, V = any> = ValueWidgetAttrs<T, V> & {\n /**\n * The select options\n */\n options?: SelectModelOptions\n\n /**\n * This is called once the control value is committed by the user.\n */\n onchange?: (model: T, value: V) => void\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n}\n\nfunction optionsFromFlatArray(arr: SelectOptionArray): SelectOption[] {\n const res: SelectOption[] = []\n for (const it of arr) {\n if (isString(it) || isNumber(it)) {\n res.push({ value: it, label: String(it) })\n continue\n }\n if ('value' in it) {\n res.push(it)\n continue\n }\n }\n return res\n}\n\nfunction optionsFromArray(\n arr: SelectOptionArray,\n): Array<SelectOption | SelectOptionGroup<SelectOption[]>> {\n const res: Array<SelectOption | SelectOptionGroup<SelectOption[]>> = []\n for (const it of arr) {\n if (isString(it) || isNumber(it) || it == null) {\n res.push({ value: it, label: String(it) })\n } else if ('value' in it) {\n res.push(it)\n } else if ('options' in it) {\n res.push({\n label: it.label,\n disabled: it.disabled,\n options: Array.isArray(it.options)\n ? optionsFromFlatArray(it.options)\n : optionsFromObject(it.options),\n })\n }\n }\n return res\n}\n\nfunction optionsFromObject(obj: SelectOptionsObject): Array<SelectOption> {\n return Object.keys(obj)\n .sort()\n .map((key) => ({ value: obj[key], label: key }))\n}\n\nfunction getOptions<T>(\n node: m.Vnode<SelectAttrs<T>>,\n): Array<SelectOption | SelectOptionGroup<SelectOption[]>> {\n const options = node.attrs.options\n\n if (!options) {\n return []\n }\n\n if (Array.isArray(options)) {\n return optionsFromArray(options)\n }\n return optionsFromObject(options)\n}\n\nexport function uiSelect<T>(attrs: SelectAttrs<T>, children?: Children): Vnode<SelectAttrs<T>> {\n return m(SelectComponent<T>, attrs, children)\n}\n\nexport const SelectComponent = <T>(): m.Component<SelectAttrs<T>> => {\n let attrs: SelectAttrs<T>\n let options: Array<SelectOption | SelectOptionGroup<SelectOption[]>>\n\n function getSelectedIndex() {\n const value = getControlValue(attrs)\n let i = 0\n for (const o0 of options) {\n if ('options' in o0) {\n for (const o1 of o0.options) {\n if (o1.value === value) {\n return i\n }\n i++\n }\n } else {\n if (o0.value === value) {\n return i\n }\n i++\n }\n }\n }\n\n function getSelectionAt(index: number) {\n let i = 0\n for (const o0 of options) {\n if ('options' in o0) {\n for (const o1 of o0.options) {\n if (i === index) {\n return o1.value\n }\n i += 1\n }\n } else {\n if (i === index) {\n return o0.value\n }\n i += 1\n }\n }\n return null\n }\n\n function onchange(e: Event) {\n const el = e.target as HTMLSelectElement\n const value = getSelectionAt(el.selectedIndex)\n const written = setControlValue(attrs, value)\n attrs.onchange?.(attrs.value, written)\n }\n\n return {\n view: (node) => {\n attrs = node.attrs\n options = getOptions(node)\n return uiWidget(\n {\n tagName: `${attrs.tagName || 'div'}.twk-select`,\n label: attrs.label ?? (attrs.field as any),\n class: attrs.class,\n },\n m(\n 'select.twk-select-input',\n {\n selectedIndex: getSelectedIndex(),\n onchange: onchange,\n disabled: attrs.readonly,\n },\n options.map((it) => {\n if ('options' in it) {\n return m(\n 'optgroup',\n {\n disabled: !!it.disabled,\n label: it.label || '',\n },\n it.options.map(option),\n )\n }\n return option(it)\n }),\n ),\n )\n },\n }\n}\n\nfunction option(it: SelectOption) {\n return m(\n 'option',\n {\n value: it.value,\n label: it.label,\n disabled: !!it.disabled,\n },\n it.label || '',\n )\n}\n","import m, { Children, Vnode } from 'mithril'\n\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { call, clamp, dragUtil, getTouchInTarget, uiClass } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\n\n/**\n * @public\n */\nexport type CartesianValue = { x: number; y: number; z: number }\n\n/**\n * @internal\n */\nexport type SphericalValue = { radius: number; azimuth: number; polar: number }\n\nexport type SphericalWidgetAttrs<T = unknown> = CommonWidgetAttrs & SphericalInputAttrs<T>\n\n/**\n * Spherical component model\n * @public\n */\nexport type SphericalInputAttrs<T = unknown> = TweakableAttrs<T, CartesianValue> & {\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: unknown) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: unknown) => void\n}\n\nexport function uiSphericalWidget<T>(\n attrs: SphericalWidgetAttrs<T>,\n children?: Children,\n): Vnode<SphericalWidgetAttrs<T>> {\n return m(SphericalWidgetComponent<T>, attrs, children)\n}\n\nexport function uiSpherical<T>(\n attrs: SphericalWidgetAttrs<T>,\n children?: Children,\n): Vnode<SphericalWidgetAttrs<T>> {\n return m(SphericalWidgetComponent<T>, attrs, children)\n}\n\nexport function uiSphericalInput<T>(\n attrs: SphericalInputAttrs<T>,\n children?: Children,\n): Vnode<SphericalInputAttrs<T>> {\n return m(SphericalInputComponent<T>, attrs, children)\n}\n\nexport const SphericalWidgetComponent = <T>(): m.Component<SphericalWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName || 'div'}.twk-spherical-widget`,\n label: label ?? (rest.field as any),\n class: className,\n },\n [m(SphericalInputComponent<T>, rest)],\n )\n },\n }\n}\n\nexport const SphericalInputComponent = <T>(): m.Component<SphericalInputAttrs<T>> => {\n let radius = 1\n let azimuth = 0 // [0, 2PI]\n let polar = 0 // [0, PI], 0 = front pole, PI/2 = equator, PI = back pole\n let paneElement: HTMLElement\n\n let dragging = false\n let attrs: SphericalInputAttrs<T>\n let cartesian: CartesianValue\n function read(): SphericalValue {\n return toSpherical(getControlValue(attrs) || toCartesian(radius, azimuth, polar))\n }\n\n // derived fresh from `polar` everywhere it's needed - `polar` can be mutated\n // directly (e.g. by onToggleBackface) between lifecycle hooks, so caching this\n // in a variable that's only refreshed by updateState() risks reading a stale\n // value the moment `view()` runs before the next onupdate.\n function isBackface() {\n return polar > Math.PI / 2\n }\n\n function updateState(node: m.Vnode<SphericalInputAttrs<T>>) {\n attrs = node.attrs\n const value = read()\n radius = value.radius ?? 1\n azimuth = value.azimuth ?? 0\n polar = value.polar ?? 0\n }\n\n function onchange(type: 'change' | 'input') {\n const value = toCartesian(radius, azimuth, polar)\n setControlValue(attrs, value)\n call(type === 'input' ? attrs.oninput : attrs.onchange, attrs.value, value)\n }\n\n // how far the knob sits from the pane center, as a fraction of the pane radius:\n // 0 = pole (front or back, depending on `hemisphereIsBack`), 1 = equator\n function reachOf(currentPolar: number, hemisphereIsBack: boolean) {\n return hemisphereIsBack ? (Math.PI - currentPolar) / (Math.PI / 2) : currentPolar / (Math.PI / 2)\n }\n\n function onPaneDown(e: MouseEvent) {\n dragging = true\n paneElement?.focus()\n drag.activate(e)\n }\n\n function onToggleBackface() {\n polar = Math.PI - polar\n onchange('change')\n }\n\n // the hemisphere being edited for the duration of one drag gesture; only the\n // explicit toggle (onToggleBackface) is allowed to switch hemispheres\n let dragBackface = false\n const drag = dragUtil({\n onStart: () => {\n dragBackface = isBackface()\n },\n onMove: (e) => {\n e.preventDefault()\n const position = getTouchInTarget(e, paneElement)\n const nx = (position.normalizedX - 0.5) * 2\n const ny = (position.normalizedY - 0.5) * 2\n const reach = clamp(Math.sqrt(nx * nx + ny * ny), 0, 1)\n azimuth = Math.atan2(ny, nx)\n polar = dragBackface ? Math.PI - reach * (Math.PI / 2) : reach * (Math.PI / 2)\n onchange('input')\n m.redraw()\n },\n onEnd: () => {\n drag.deactivate()\n dragging = false\n onchange('change')\n m.redraw()\n },\n })\n\n return {\n onremove: () => {\n drag.deactivate()\n },\n oninit: updateState,\n onupdate: updateState,\n view: () => {\n cartesian = toCartesian(radius, azimuth, polar, cartesian)\n const backface = isBackface()\n const reach = reachOf(polar, backface)\n const dx = Math.cos(azimuth) * reach\n const dy = Math.sin(azimuth) * reach\n return m('div.twk-spherical-input', {}, [\n m('div.twk-spherical-info', {}, [\n m('div.twk-spherical-label', {}, `x: ${cartesian.x.toFixed(2)}`),\n m('div.twk-spherical-label', {}, `y: ${cartesian.y.toFixed(2)}`),\n m('div.twk-spherical-label', {}, `z: ${cartesian.z.toFixed(2)}`),\n m(\"input.twk-toggle[type='checkbox']\", {\n checked: backface,\n onchange: onToggleBackface,\n title: 'Edit the back side of the sphere',\n }),\n ]),\n m(\n 'div.twk-spherical-pane',\n {\n oncreate: (vnode) => (paneElement = vnode.dom as HTMLElement),\n onmousedown: onPaneDown,\n ontouchstart: onPaneDown,\n tabIndex: 0,\n class: uiClass({\n 'is-dragging': dragging,\n }),\n },\n [\n m('div.twk-spherical-arm', {\n style: {\n width: `${reach * 50}%`,\n transform: `rotate(${azimuth}rad)`,\n },\n }),\n m('div.twk-spherical-knob', {\n class: uiClass({ 'is-back': backface }),\n style: {\n left: `${50 + dx * 50}%`,\n top: `${50 + dy * 50}%`,\n },\n }),\n ],\n ),\n ])\n },\n }\n}\n\n/**\n *\n * @param value\n * @returns\n */\nfunction toSpherical(value: Partial<CartesianValue>) {\n const x = value?.x ?? 0\n const y = value?.y ?? 0\n const z = value?.z ?? 0\n\n const radius = Math.sqrt(x * x + y * y + z * z) || 1\n\n const theta = Math.atan2(z, x) || 0 // rotation around Y\n const phi = Math.acos(y / radius) || 0 // angle from +Y\n\n return {\n radius,\n azimuth: theta,\n polar: phi,\n }\n}\n\n/**\n *\n * @param r - radius [0;inf]\n * @param theta - azimuth [0;2PI]\n * @param phi - polar [0;PI]\n * @returns\n */\nfunction toCartesian(\n r: number,\n theta: number,\n phi: number,\n out?: Partial<CartesianValue>,\n): CartesianValue {\n const sinPhi = Math.sin(phi)\n\n out = out || {}\n out.x = r * Math.cos(theta) * sinPhi\n out.y = r * Math.cos(phi)\n out.z = r * Math.sin(theta) * sinPhi\n\n return out as CartesianValue\n}\n","import m, { Child, Children, Vnode } from 'mithril'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { uiClass } from '../../core/utils'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\n\nexport type StringWidgetAttrs<T = unknown> = CommonWidgetAttrs & StringInputAttrs<T>\n\n/**\n * Text component model\n * @public\n */\nexport type StringInputAttrs<T = unknown> = TweakableAttrs<T, string> & {\n /**\n * The placeholder text\n */\n placeholder?: string\n\n /**\n *\n */\n slotStart?: Child\n\n /**\n *\n */\n slotEnd?: Child\n\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: string) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: string) => void\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n\n /**\n * The number of rows for a textarea. If not specified, a single-line input will be used.\n */\n rows?: number\n}\n\nexport function uiStringWidget<T>(\n attrs: StringWidgetAttrs<T>,\n children?: Children,\n): Vnode<StringWidgetAttrs<T>> {\n return m(StringWidgetComponent<T>, attrs, children)\n}\n\nexport function uiString<T>(\n attrs: StringInputAttrs<T>,\n children?: Children,\n): Vnode<StringInputAttrs<T>> {\n return m(StringInputComponent<T>, attrs, children)\n}\n\nexport const StringWidgetComponent = <T>(): m.Component<StringWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName || 'div'}.twk-string-widget`,\n label: label ?? (rest.field as any),\n class: className,\n },\n [m(StringInputComponent<T>, rest)],\n )\n },\n }\n}\nexport const StringInputComponent = <T>(): m.Component<StringInputAttrs<T>> => {\n let attrs: StringInputAttrs<T>\n function onchange(e: Event) {\n const el = e.target as HTMLInputElement\n const value = el.value\n setControlValue(attrs, value)\n const cb = e.type === 'input' ? attrs.oninput : attrs.onchange\n cb?.(attrs.value, value)\n }\n\n return {\n view: (node) => {\n attrs = node.attrs\n const editable = !attrs.readonly\n const value = getControlValue(attrs)\n return m(\n 'div.twk-input.twk-string-input',\n {\n class: uiClass({\n 'twk-input-readonly': !!attrs.readonly,\n }),\n },\n [\n attrs.slotStart ?? null,\n editable ? null : m('div.twk-input-value', value),\n !editable\n ? null\n : m(attrs.rows ? 'textarea' : \"input[type='text']\", {\n value: value,\n oninput: onchange,\n onchange: onchange,\n placeholder: attrs.placeholder,\n disabled: attrs.readonly,\n rows: attrs.rows,\n }),\n\n attrs.slotEnd ?? null,\n ],\n )\n },\n }\n}\n","import m, { Children, Vnode } from 'mithril'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\nimport { uiScalarInput } from './scalar'\n\nexport type VectorWidgetAttrs<T = unknown> = CommonWidgetAttrs & VectorInputAttrs<T>\n\n/**\n * Vector component model\n * @public\n */\nexport type VectorInputAttrs<T = unknown> = TweakableAttrs<T, any> & {\n /**\n * The vector object field names. Defaults to `['x', 'y', 'z']`\n */\n keys?: string[]\n /**\n * The min value\n */\n min?: number\n /**\n * The max value\n */\n max?: number\n /**\n * The step value\n */\n step?: number\n /**\n * Number of columns to display. By default, this is determined by the number of keys.\n */\n cols?: number\n /**\n * Whether to hide the field labels and just show the input controls. Default is false.\n */\n unlabeled?: boolean\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: unknown, key?: string | number) => void\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: unknown, key?: string | number) => void\n /**\n * Disables the control input\n */\n readonly?: boolean\n}\n\nexport function uiVectorWidget<T>(\n attrs: VectorWidgetAttrs<T>,\n children?: Children,\n): Vnode<VectorWidgetAttrs<T>> {\n return m(VectorWidgetComponent<T>, attrs, children)\n}\n\nexport function uiVectorInput<T>(\n attrs: VectorInputAttrs<T>,\n children?: Children,\n): Vnode<VectorInputAttrs<T>> {\n return m(VectorInputComponent<T>, attrs, children)\n}\n\nexport const VectorWidgetComponent = <T>(): m.Component<VectorWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName || 'div'}.twk-vector-widget`,\n label: label ?? (rest.field as any),\n class: className,\n },\n [m(VectorInputComponent<T>, rest)],\n )\n },\n }\n}\nconst defaultKeys = ['x', 'y', 'z']\nexport const VectorInputComponent = <T>(): m.Component<VectorInputAttrs<T>> => {\n function onchange(\n type: 'input' | 'change',\n field: string,\n v: number,\n attrs: VectorInputAttrs<T>,\n ) {\n const value: any = getControlValue(attrs) || {}\n value[field] = isNaN(v) ? null : v\n setControlValue(attrs, value)\n const cb = type === 'input' ? attrs.oninput : attrs.onchange\n cb?.(attrs.value, value, field)\n }\n\n return {\n view: ({ attrs }) => {\n const keys = attrs.keys || defaultKeys\n const cols = attrs.cols || keys.length\n const value = getControlValue(attrs) as any\n return m(\n 'div.twk-vector-input',\n {\n style: {\n display: 'grid',\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n },\n },\n keys.map((field) => {\n return uiScalarInput({\n min: attrs.min,\n max: attrs.max,\n step: attrs.step,\n value,\n field,\n readonly: attrs.readonly,\n slotBefore: attrs.unlabeled ? null : m('span.twk-color-muted', field),\n oninput: (_, v) => onchange('input', field, v as number, attrs),\n onchange: (_, v) => onchange('change', field, v as number, attrs),\n placeholder: field,\n })\n }),\n )\n },\n }\n}\n","import m, { Children, Vnode } from 'mithril'\nimport { getControlValue, setControlValue, TweakableAttrs } from '../../core'\nimport { uiClass } from '../../core/utils'\nimport { CommonWidgetAttrs, uiButton, uiWidget } from '../elements'\n\n/**\n * @public\n */\nexport type BitmaskWidgetAttrs<T = unknown> = CommonWidgetAttrs & BitmaskInputAttrs<T>\n\n/**\n * Bitmask component model\n * @public\n */\nexport type BitmaskInputAttrs<T = unknown> = TweakableAttrs<T, number> & {\n /**\n * This is called when the control value has been changed.\n */\n oninput?: (model: T, value: unknown) => void\n\n /**\n * This is called once the control value is committed by the user.\n *\n * @remarks\n * Unlike the `onInput` callback, this is not necessarily called for each value change.\n */\n onchange?: (model: T, value: unknown) => void\n\n /**\n * Disables the control input\n */\n readonly?: boolean\n\n /**\n * The number of bits in the mask\n */\n bitCount?: number\n\n /**\n * Maaping of names to bit values. If provided, the control will display the names instead of the bit indices.\n */\n names?: Record<string, number>\n}\n\nexport function uiBitmaskWidget<T>(\n attrs: BitmaskWidgetAttrs<T>,\n children?: Children,\n): Vnode<BitmaskWidgetAttrs<T>> {\n return m(BitmaskWidgetComponent<T>, attrs, children)\n}\n\nexport const BitmaskWidgetComponent = <T>(): m.Component<BitmaskWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName || 'div'}.twk-Bitmask-widget`,\n label: label ?? (rest.field as any),\n class: className,\n },\n [m(BitmaskInputComponent<T>, rest)],\n )\n },\n }\n}\n\nexport function uiBitmaskInput<T>(\n attrs: BitmaskInputAttrs<T>,\n children?: Children,\n): Vnode<BitmaskInputAttrs<T>> {\n return m(BitmaskInputComponent<T>, attrs, children)\n}\n\nexport const BitmaskInputComponent = <T>(): m.Component<BitmaskInputAttrs<T>> => {\n let attrs: BitmaskInputAttrs<T>\n\n function getBitCount() {\n return attrs.bitCount || 32\n }\n\n function toggleBit(index: number) {\n let value = getControlValue(attrs)\n value = value ^ (1 << index)\n emitChange(value)\n }\n\n function setAllBits() {\n const bitCount = getBitCount()\n let value = getControlValue(attrs)\n for (let i = 0; i < bitCount; i++) {\n value = value | (1 << i)\n }\n emitChange(value)\n }\n\n function clearAllBits() {\n const bitCount = getBitCount()\n let value = getControlValue(attrs)\n for (let i = 0; i < bitCount; i++) {\n value = value & ~(1 << i)\n }\n emitChange(value)\n }\n\n function emitChange(value: number) {\n setControlValue(attrs, value)\n attrs.oninput?.(attrs.value, value)\n attrs.onchange?.(attrs.value, value)\n }\n\n function isBitSet(value: number, index: number) {\n return (value & (1 << index)) !== 0\n }\n\n function bitName(index: number) {\n if (attrs.names) {\n for (const [name, value] of Object.entries(attrs.names)) {\n if (value === 1 << index) {\n return name\n }\n }\n }\n return null\n }\n\n return {\n view: (node) => {\n attrs = node.attrs\n const bitCount = getBitCount()\n const value = getControlValue(attrs)\n return m(\n 'div.twk-bitmask-input',\n {},\n Array.from({ length: bitCount }, (_, i) => {\n return m(\n 'label.twk-bitmask-row',\n {\n tabindex: 0,\n class: uiClass({\n 'twk-bitmask-active': isBitSet(value, i),\n }),\n onclick: () => toggleBit(i),\n },\n [\n m('div.twk-bitmask-indicator', {}),\n m('div.twk-bitmask-name', {}, bitName(i) || ''),\n m('div.twk-bitmask-bit', {}, `bit ${i}`),\n m(\n 'div.twk-bitmask-value',\n {},\n '0x' + String(Math.pow(2, i).toString(16)).padStart(Math.ceil(bitCount / 4), '0'),\n ),\n ],\n )\n }),\n )\n },\n }\n}\n","import m, { Children, Vnode } from 'mithril'\nimport { getControlValue, TweakableAttrs } from '../../core'\nimport { CommonWidgetAttrs, uiWidget } from '../elements'\n\nexport type PollWidgetAttrs<T = unknown> = CommonWidgetAttrs & PollAttrs<T>\n\nexport type PollAttrs<T = unknown> = TweakableAttrs<T, string | number | boolean> & {\n interval?: number\n}\n\nexport function uiPollWidget<T>(\n attrs: PollWidgetAttrs<T>,\n children?: Children,\n): Vnode<PollWidgetAttrs<T>> {\n return m(PollWidgetComponent<T>, attrs, children)\n}\n\nexport function uiPoll<T>(attrs: PollAttrs<T>, children?: Children): Vnode<PollAttrs<T>> {\n return m(PollComponent<T>, attrs, children)\n}\n\nexport const PollWidgetComponent = <T>(): m.Component<PollWidgetAttrs<T>> => {\n return {\n view: ({ attrs: { tagName, label, field, class: className, ...rest } }) => {\n return uiWidget(\n {\n tagName: `${tagName || 'div'}.twk-input.twk-input-readonly`,\n label: label ?? (field as any),\n class: className,\n },\n m(PollComponent<T>, rest),\n )\n },\n }\n}\n\nexport const PollComponent = <T>(): m.Component<PollAttrs<T>> => {\n let el: HTMLElement\n let timer: number\n let attrs: PollAttrs<T>\n\n return {\n oncreate({ dom }) {\n el = dom as HTMLElement\n timer = setInterval(() => {\n const value = getControlValue(attrs) ?? ''\n el.textContent = String(value)\n }, attrs.interval ?? 500)\n },\n\n onremove() {\n clearInterval(timer)\n },\n view: (node) => {\n attrs = node.attrs\n return m('div.twk-poll', {})\n },\n }\n}\n","import { Children } from 'mithril'\nimport {\n AngleInputComponent,\n AngleWidgetComponent,\n BarComponent,\n BarContentComponent,\n BarEndComponent,\n BarStartComponent,\n BitmaskInputComponent,\n BitmaskWidgetComponent,\n BoolInputComponent,\n BoolWidgetComponent,\n ButtonAttrs,\n ButtonComponent,\n ColorComponent,\n ColorPicker,\n ColorPickerWidgetComponent,\n ColorWidgetComponent,\n Divider,\n FlexComponent,\n GraphAttrs,\n GraphComponent,\n GridComponent,\n GroupAttrs,\n GroupComponent,\n ImageAttrs,\n ImageComponent,\n MatrixInputComponent,\n MatrixWidgetComponent,\n PointInputComponent,\n PointWidgetComponent,\n PollComponent,\n PollWidgetComponent,\n ScalarInputComponent,\n ScalarWidgetComponent,\n SectionComponent,\n SectionFooterComponent,\n SectionHeaderComponent,\n SelectComponent,\n SphericalInputComponent,\n SphericalWidgetComponent,\n SplitComponent,\n SplitContentComponent,\n StringInputComponent,\n StringWidgetComponent,\n TabsComponent,\n TreeAttrs,\n TreeComponent,\n VectorInputComponent,\n VectorWidgetComponent,\n WidgetAttrs,\n WidgetComponent,\n} from './components'\nimport { Component, ComponentChildren, ComponentSchema, OmitIn, TweakableAttrs } from './core'\nimport { isFunction, isObject, isString } from './core/utils'\n\n/**\n * @public\n */\nexport type BuilderFn = (b: Builder) => void\n\n/**\n * @public\n */\nexport type TabsBuilderFn = (b: TabsBuilder) => void\n\n/**\n * @public\n */\nexport interface TabsBuilder {\n group(label: string, builder: BuilderFn): GroupAttrs\n}\n\n/**\n *\n * @public\n */\nexport class Builder {\n public static build(fn: BuilderFn) {\n const builder = new Builder()\n fn(builder)\n return builder.close()\n }\n\n public schema: ComponentSchema = []\n\n public close() {\n const result = this.schema\n this.schema = []\n return result\n }\n\n public group = groupGenerator(this, GroupComponent)\n\n public flex = componentGenerator(this, FlexComponent)\n public grid = componentGenerator(this, GridComponent)\n public tabs = componentGenerator(this, TabsComponent)\n public split = componentGenerator(this, SplitComponent)\n public splitContent = componentGenerator(this, SplitContentComponent)\n public section = componentGenerator(this, SectionComponent)\n public sectionHeader = componentGenerator(this, SectionHeaderComponent)\n public sectionFooter = componentGenerator(this, SectionFooterComponent)\n public bar = componentGenerator(this, BarComponent)\n public barStart = componentGenerator(this, BarStartComponent)\n public barEnd = componentGenerator(this, BarEndComponent)\n public barContent = componentGenerator(this, BarContentComponent)\n\n public bool = widgetGenerator(this, BoolWidgetComponent)\n public string = widgetGenerator(this, StringWidgetComponent)\n public scalar = widgetGenerator(this, ScalarWidgetComponent)\n public vector = widgetGenerator(this, VectorWidgetComponent)\n public matrix = widgetGenerator(this, MatrixWidgetComponent)\n public select = widgetGenerator(this, SelectComponent)\n public angle = widgetGenerator(this, AngleWidgetComponent)\n public bitmask = widgetGenerator(this, BitmaskWidgetComponent)\n public poll = widgetGenerator(this, PollWidgetComponent)\n public color = widgetGenerator(this, ColorWidgetComponent)\n public colorPicker = widgetGenerator(this, ColorPickerWidgetComponent)\n public point = widgetGenerator(this, PointWidgetComponent)\n public spherical = widgetGenerator(this, SphericalWidgetComponent)\n\n public boolInput = widgetGenerator(this, BoolInputComponent)\n public stringInput = widgetGenerator(this, StringInputComponent)\n public scalarInput = widgetGenerator(this, ScalarInputComponent)\n public vectorInput = widgetGenerator(this, VectorInputComponent)\n public matrixInput = widgetGenerator(this, MatrixInputComponent)\n public selectInput = widgetGenerator(this, SelectComponent)\n public angleInput = widgetGenerator(this, AngleInputComponent)\n public bitmaskInput = widgetGenerator(this, BitmaskInputComponent)\n public pollInput = widgetGenerator(this, PollComponent)\n public colorInput = widgetGenerator(this, ColorComponent)\n public colorPickerInput = widgetGenerator(this, ColorPicker)\n public pointInput = widgetGenerator(this, PointInputComponent)\n public sphericalInput = widgetGenerator(this, SphericalInputComponent)\n\n public button(text: string, opts: ButtonAttrs = {}) {\n this.add(ButtonComponent, opts, text)\n }\n\n public image(opts: ImageAttrs) {\n this.add(ImageComponent, opts)\n }\n\n public divider(content?: Children) {\n this.add(Divider, {}, content)\n }\n\n public tree<T>(opts: TreeAttrs<T>) {\n this.add(TreeComponent, opts)\n }\n\n public graph(opts: GraphAttrs) {\n this.add(GraphComponent, opts)\n }\n\n public widget(label: string | false, children?: ComponentChildren) {\n this.add(WidgetComponent, { label }, children)\n }\n\n public pre(label: string | false, children?: ComponentChildren) {\n this.add(\n WidgetComponent,\n {\n label,\n style: {\n whiteSpace: 'pre',\n },\n },\n children,\n )\n }\n\n /**\n * Adds a render function as a component\n * This breaks out of the static builder schema and allows for dynamic content.\n */\n public view(view: () => Children) {\n this.add({ view })\n }\n\n /**\n * Adds a render function as a component\n * This breaks out of the static builder schema and allows for dynamic content.\n */\n public control(attrs: WidgetAttrs, children?: ComponentChildren) {\n this.add(WidgetComponent, attrs, children)\n }\n\n /**\n * Adds a component to the builder schema\n */\n public add<Attrs extends Object>(\n component: Component<Attrs> | string,\n attributes?: Attrs,\n children?: ComponentChildren,\n ) {\n if (this.schema) {\n this.schema.push({ component, attributes, children })\n } else {\n throw new Error('Cannot use control builder after it was closed')\n }\n }\n}\n\nexport type GroupGenerator<T extends Object> = {\n (builder: BuilderFn): void\n (opts: Partial<T>): void\n (opts: Partial<T>, builder: BuilderFn): void\n (label: string, builder: BuilderFn): void\n (label: string, opts: Partial<T>): void\n (label: string, opts: Partial<T>, builder: BuilderFn): void\n}\n\nfunction groupGenerator<Attrs extends Object>(\n builder: Builder,\n component: Component<Attrs>,\n): GroupGenerator<Attrs> {\n return function () {\n const { options, children } = groupOptions<Attrs>(builder, arguments)\n builder.add(component, options, children)\n }\n}\n\nexport type FieldGenerator<A extends TweakableAttrs<any, any>> = {\n (opts: A): void\n <V, K extends keyof V>(target: V, property: K): void\n <V, K extends keyof V>(target: V, property: K, opts: OmitIn<A, 'value' | 'field'>): void\n}\n\nfunction widgetGenerator<A extends TweakableAttrs<any, any>>(\n builder: Builder,\n component: Component<A>,\n): FieldGenerator<A> {\n return function () {\n builder.add(component, fieldOptions<A>(arguments))\n }\n}\n\nexport type ComponentGenerator<T extends Object> = {\n (builder: BuilderFn): void\n (opts: Partial<T>): void\n (opts: Partial<T>, builder: BuilderFn): void\n}\n\nfunction componentGenerator<Attrs extends Object>(\n builder: Builder,\n component: Component<Attrs>,\n): ComponentGenerator<Attrs> {\n return function () {\n const { options, children } = componentOptions<Attrs>(builder, arguments)\n builder.add(component, options, children)\n }\n}\n\nfunction groupOptions<T extends Object>(b: Builder, args: IArguments) {\n let title: string | null = null\n let options: T & { title?: string } = {} as T\n let cb: BuilderFn | null = null\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (isString(arg)) {\n title = arg\n } else if (isObject(arg)) {\n options = arg as T\n } else if (isFunction(arg)) {\n cb = arg\n }\n }\n\n if (title) {\n options.title = title\n }\n\n const children: Builder['schema'] = []\n if (cb) {\n const controls = b.schema\n b.schema = children\n cb(b)\n b.schema = controls\n }\n return { options, children }\n}\n\nfunction fieldOptions<T extends TweakableAttrs<any, any> & WidgetAttrs>(args: IArguments): T {\n let attr: T\n\n if (args.length === 1) {\n return args[0] || {}\n }\n if (args.length > 1) {\n attr = args[2] || {}\n attr.value = args[0]\n attr.field = args[1]\n if (attr.label === undefined) {\n attr.label = String(attr.field || '')\n }\n } else {\n attr = {} as T\n }\n\n return attr\n}\n\nfunction componentOptions<T extends Object>(b: Builder, args: IArguments) {\n let options: T | null = null\n let cb: BuilderFn | null = null\n\n if (!args.length) {\n return { options: {} as T, children: [] }\n }\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (isObject(arg)) {\n options = arg as T\n } else if (isFunction(arg)) {\n cb = arg\n }\n }\n\n const children: Builder['schema'] = []\n if (cb) {\n const controls = b.schema\n b.schema = children\n cb(b)\n b.schema = controls\n }\n return { options: options || ({} as T), children }\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"mappings":"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"}
|