valyrian.js 8.0.8 → 8.0.10

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.
Files changed (52) hide show
  1. package/dist/index.js +18 -10
  2. package/dist/index.js.map +2 -2
  3. package/dist/index.min.js +1 -1
  4. package/dist/index.min.js.map +1 -1
  5. package/dist/index.mjs +18 -10
  6. package/dist/index.mjs.map +2 -2
  7. package/dist/lib/index.d.ts +3 -2
  8. package/dist/lib/index.d.ts.map +1 -1
  9. package/dist/lib/node/index.d.ts +2 -1
  10. package/dist/lib/node/index.d.ts.map +1 -1
  11. package/dist/lib/node/utils/session-storage.d.ts.map +1 -1
  12. package/dist/lib/{pulse-store → pulses}/index.d.ts +5 -6
  13. package/dist/lib/pulses/index.d.ts.map +1 -0
  14. package/dist/lib/utils/deep-freeze.d.ts +2 -2
  15. package/dist/lib/utils/deep-freeze.d.ts.map +1 -1
  16. package/dist/node/index.js +27 -24
  17. package/dist/node/index.js.map +2 -2
  18. package/dist/node/index.mjs +27 -24
  19. package/dist/node/index.mjs.map +2 -2
  20. package/dist/{pulse-store → pulses}/index.js +93 -27
  21. package/dist/pulses/index.js.map +7 -0
  22. package/dist/pulses/index.min.js +1 -0
  23. package/dist/pulses/index.min.js.map +1 -0
  24. package/dist/{pulse-store → pulses}/index.mjs +90 -24
  25. package/dist/pulses/index.mjs.map +7 -0
  26. package/dist/utils/index.js +105 -18
  27. package/dist/utils/index.js.map +3 -3
  28. package/dist/utils/index.min.js +1 -1
  29. package/dist/utils/index.min.js.map +1 -1
  30. package/dist/utils/index.mjs +105 -18
  31. package/dist/utils/index.mjs.map +3 -3
  32. package/lib/index.ts +18 -9
  33. package/lib/node/index.ts +1 -1
  34. package/lib/node/utils/session-storage.ts +28 -25
  35. package/lib/node/utils/sw.ts +1 -1
  36. package/lib/{pulse-store → pulses}/index.ts +111 -51
  37. package/lib/utils/deep-freeze.ts +112 -20
  38. package/package.json +1 -1
  39. package/dist/lib/pulse-store/index.d.ts.map +0 -1
  40. package/dist/lib/signals/index.d.ts +0 -6
  41. package/dist/lib/signals/index.d.ts.map +0 -1
  42. package/dist/pulse-store/index.js.map +0 -7
  43. package/dist/pulse-store/index.min.js +0 -1
  44. package/dist/pulse-store/index.min.js.map +0 -1
  45. package/dist/pulse-store/index.mjs.map +0 -7
  46. package/dist/signals/index.js +0 -98
  47. package/dist/signals/index.js.map +0 -7
  48. package/dist/signals/index.min.js +0 -1
  49. package/dist/signals/index.min.js.map +0 -1
  50. package/dist/signals/index.mjs +0 -77
  51. package/dist/signals/index.mjs.map +0 -7
  52. package/lib/signals/index.ts +0 -107
package/dist/index.js CHANGED
@@ -50,13 +50,14 @@ __export(lib_exports, {
50
50
  module.exports = __toCommonJS(lib_exports);
51
51
  var isNodeJs = Boolean(typeof process !== "undefined" && process.versions && process.versions.node);
52
52
  var Vnode = class {
53
- constructor(tag, props, children, dom, isSVG, directComponents, hasKeys, oncreate, oncleanup, onupdate, onremove) {
53
+ constructor(tag, props, children, dom, isSVG, oldChildComponents, childComponents, hasKeys, oncreate, oncleanup, onupdate, onremove) {
54
54
  this.tag = tag;
55
55
  this.props = props;
56
56
  this.children = children;
57
57
  this.dom = dom;
58
58
  this.isSVG = isSVG;
59
- this.directComponents = directComponents;
59
+ this.oldChildComponents = oldChildComponents;
60
+ this.childComponents = childComponents;
60
61
  this.hasKeys = hasKeys;
61
62
  this.oncreate = oncreate;
62
63
  this.oncleanup = oncleanup;
@@ -149,13 +150,19 @@ function validateIsCalledInsideComponent() {
149
150
  }
150
151
  var onCreate = (callback) => {
151
152
  validateIsCalledInsideComponent();
152
- if (!current.oldVnode) {
153
- addCallbackToSet(callback, "oncreate" /* onCreate */, current.vnode);
153
+ const parentVnode = current.vnode;
154
+ const component = current.component;
155
+ const hasComponentAsOldChild = parentVnode.oldChildComponents && parentVnode.oldChildComponents.has(component);
156
+ if (!hasComponentAsOldChild) {
157
+ addCallbackToSet(callback, "oncreate" /* onCreate */, parentVnode);
154
158
  }
155
159
  };
156
160
  var onUpdate = (callback) => {
157
161
  validateIsCalledInsideComponent();
158
- if (current.oldVnode) {
162
+ const parentVnode = current.vnode;
163
+ const component = current.component;
164
+ const hasComponentAsChild = parentVnode.childComponents && parentVnode.childComponents.has(component);
165
+ if (hasComponentAsChild) {
159
166
  addCallbackToSet(callback, "onupdate" /* onUpdate */, current.vnode);
160
167
  }
161
168
  };
@@ -169,7 +176,7 @@ var onRemove = (callback) => {
169
176
  const component = current.component;
170
177
  let removed = false;
171
178
  function removeCallback() {
172
- const hasComponentAsChild = parentVnode.directComponents && parentVnode.directComponents.has(component);
179
+ const hasComponentAsChild = parentVnode.childComponents && parentVnode.childComponents.has(component);
173
180
  if (hasComponentAsChild || removed) {
174
181
  return;
175
182
  }
@@ -487,8 +494,9 @@ function flatTree(newVnode) {
487
494
  children[i2] = callback(set[i2], i2);
488
495
  }
489
496
  }
490
- if (newVnode.directComponents) {
491
- newVnode.directComponents.clear();
497
+ newVnode.oldChildComponents = newVnode.childComponents;
498
+ if (newVnode.childComponents) {
499
+ newVnode.childComponents = /* @__PURE__ */ new Set();
492
500
  }
493
501
  while (i < children.length) {
494
502
  const newChild = children[i];
@@ -505,8 +513,8 @@ function flatTree(newVnode) {
505
513
  newChild.isSVG = newVnode.isSVG || newChild.tag === "svg";
506
514
  if (typeof newChild.tag !== "string") {
507
515
  const component = current.component = newChild.tag;
508
- newVnode.directComponents = newVnode.directComponents || /* @__PURE__ */ new Set();
509
- newVnode.directComponents.add(component);
516
+ newVnode.childComponents = newVnode.childComponents || /* @__PURE__ */ new Set();
517
+ newVnode.childComponents.add(component);
510
518
  children[i] = (isPOJOComponent(component) ? component.view : component).bind(component)(
511
519
  newChild.props,
512
520
  newChild.children
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../lib/index.ts"],
4
- "sourcesContent": ["/* eslint-disable */\ndeclare global {\n var document: Document;\n namespace JSX {\n interface IntrinsicElements extends DefaultRecord {}\n type Element = ReturnType<\n typeof v | ((...args: any) => string | number | null | undefined | boolean | Promise<any>)\n >;\n type ComponentReturnType = string | number | null | undefined | boolean | Element | Element[];\n }\n}\n\ninterface DefaultRecord extends Record<string | number | symbol, any> {}\n\nexport interface Properties extends DefaultRecord {\n key?: string | number;\n}\n\nexport interface DomElement extends Element, DefaultRecord {}\n\nexport interface Component extends DefaultRecord {\n (props: Properties, children: any[]): Vnode | any;\n}\n\nexport interface POJOComponent extends DefaultRecord {\n view: Component;\n}\n\nexport type ValyrianComponent = Component | POJOComponent;\n\nexport interface VnodeComponentInterface extends Vnode {\n tag: ValyrianComponent;\n}\n\nexport interface Children extends Array<Vnode | VnodeComponentInterface | ValyrianComponent | any> {}\n\nexport interface Directive {\n (value: any, vnode: VnodeWithDom, oldProps?: Properties): false | void | any;\n}\n\nexport const isNodeJs = Boolean(typeof process !== \"undefined\" && process.versions && process.versions.node);\n\nexport class Vnode {\n constructor(\n public tag: string | Component | POJOComponent,\n public props: null | Properties,\n public children: Children,\n public dom?: DomElement,\n public isSVG?: boolean,\n public directComponents?: Set<ValyrianComponent>,\n public hasKeys?: boolean,\n public oncreate?: Set<Function>,\n public oncleanup?: Set<Function>,\n public onupdate?: Set<Function>,\n public onremove?: Set<Function>\n ) {}\n}\n\nexport interface VnodeWithDom extends Vnode {\n tag: string;\n dom: DomElement;\n props: Properties;\n}\n\nexport const isPOJOComponent = (component: unknown): component is POJOComponent =>\n Boolean(component && typeof component === \"object\" && \"view\" in component);\n\nexport const isComponent = (component: unknown): component is Component =>\n Boolean(typeof component === \"function\" || isPOJOComponent(component));\nexport const isVnode = (object?: unknown): object is Vnode => object instanceof Vnode;\n\nexport const isVnodeComponent = (object?: unknown): object is VnodeComponentInterface => {\n return isVnode(object) && isComponent(object.tag);\n};\n\nexport function v(tagOrComponent: string | ValyrianComponent, props: Properties | null, ...children: Children) {\n return new Vnode(tagOrComponent, props, children);\n}\n\nv.fragment = (_: Properties, ...children: Children) => children;\n\nexport function hidrateDomToVnode(dom: any): VnodeWithDom | void {\n if (dom.nodeType === 3) {\n return dom.nodeValue;\n }\n\n if (dom.nodeType === 1) {\n const tag = dom.nodeName.toLowerCase();\n const props = {} as Properties;\n const children = [] as Children;\n\n for (let i = 0, l = dom.childNodes.length; i < l; i++) {\n const childDom = dom.childNodes[i];\n if (childDom.nodeType === 3) {\n children.push(childDom.nodeValue);\n } else if (childDom.nodeType === 1) {\n const childVnode = hidrateDomToVnode(childDom);\n children.push(childVnode);\n }\n }\n\n const attributes = dom.attributes;\n for (let i = 0, l = attributes.length; i < l; i++) {\n const attr = attributes[i];\n props[attr.nodeName] = attr.nodeValue;\n }\n\n const vnode = new Vnode(tag, props, children);\n vnode.dom = dom;\n dom.vnode = vnode;\n vnode.isSVG = tag === \"svg\";\n return vnode as VnodeWithDom;\n }\n}\n\nexport function trust(htmlString: string) {\n const div = document.createElement(\"div\");\n div.innerHTML = htmlString.trim();\n return Array.from(div.childNodes).map(hidrateDomToVnode);\n}\n\nlet mainComponent: VnodeComponentInterface | null = null;\nlet mainVnode: VnodeWithDom | null = null;\nlet isMounted = false;\n\nexport const current = {\n oldVnode: null as Vnode | null,\n vnode: null as Vnode | null,\n component: null as ValyrianComponent | null,\n event: null as Event | null\n};\n\nexport const reservedProps = new Set<string>([\n \"key\",\n \"state\",\n \"v-keep\",\n \"v-text\",\n \"v-if\",\n \"v-for\",\n \"v-show\",\n \"v-class\",\n \"v-html\",\n \"v-model\",\n \"v-create\",\n \"v-update\",\n \"v-cleanup\"\n]);\n\nenum SetType {\n onCreate = \"oncreate\",\n onUpdate = \"onupdate\",\n onCleanup = \"oncleanup\",\n onRemove = \"onremove\"\n}\n\nfunction addCallbackToSet(callback: Function, setType: SetType, vnode: VnodeWithDom) {\n vnode[setType] = vnode[setType] || new Set();\n vnode[setType].add(() => {\n const cleanup = callback();\n if (typeof cleanup === \"function\") {\n vnode[SetType.onCleanup] = vnode[SetType.onCleanup] || new Set();\n vnode[SetType.onCleanup].add(cleanup);\n }\n });\n}\n\nfunction validateIsCalledInsideComponent() {\n if (!current.vnode) {\n throw new Error(\"This function must be called inside a component\");\n }\n}\n\nexport const onCreate = (callback: Function) => {\n validateIsCalledInsideComponent();\n if (!current.oldVnode) {\n addCallbackToSet(callback, SetType.onCreate, current.vnode as VnodeWithDom);\n }\n};\nexport const onUpdate = (callback: Function) => {\n validateIsCalledInsideComponent();\n if (current.oldVnode) {\n addCallbackToSet(callback, SetType.onUpdate, current.vnode as VnodeWithDom);\n }\n};\nexport const onCleanup = (callback: Function) => {\n validateIsCalledInsideComponent();\n addCallbackToSet(callback, SetType.onCleanup, current.vnode as VnodeWithDom);\n};\nexport const onRemove = (callback: Function) => {\n validateIsCalledInsideComponent();\n\n const parentVnode = current.vnode as VnodeWithDom;\n const component = current.component as ValyrianComponent;\n let removed = false;\n\n function removeCallback() {\n const hasComponentAsChild = parentVnode.directComponents && parentVnode.directComponents.has(component);\n\n if (hasComponentAsChild || removed) {\n return;\n }\n\n removed = true;\n callback();\n }\n\n addCallbackToSet(removeCallback, SetType.onRemove, current.vnode as VnodeWithDom);\n};\nconst callSet = (set?: Set<Function> | null) => {\n if (!set) {\n return;\n }\n for (const callback of set) {\n callback();\n }\n set.clear();\n};\n\nexport const directives: Record<string, Directive> = {\n \"v-create\": (callback, childVnode, oldProps) => {\n if (!oldProps) {\n addCallbackToSet(() => callback(childVnode), SetType.onCreate, current.vnode as VnodeWithDom);\n }\n },\n\n \"v-update\": (callback, childVnode, oldProps) => {\n if (oldProps) {\n addCallbackToSet(() => callback(childVnode, oldProps), SetType.onUpdate, current.vnode as VnodeWithDom);\n }\n },\n\n \"v-remove\": (callback, childVnode) => {\n let parentVnode = current.vnode as VnodeWithDom;\n let currentChildVnode = childVnode as VnodeWithDom;\n while (parentVnode) {\n parentVnode.onremove = parentVnode.onremove || new Set();\n addCallbackToSet(\n () => {\n if (!childVnode.dom.vnode || currentChildVnode.dom.parentNode) {\n return;\n }\n callback(childVnode);\n childVnode.dom.vnode = null;\n },\n SetType.onRemove,\n parentVnode\n );\n\n if (!parentVnode.dom.parentElement) {\n break;\n }\n currentChildVnode = parentVnode;\n parentVnode = (parentVnode.dom.parentElement as DomElement).vnode as VnodeWithDom;\n }\n },\n\n \"v-cleanup\": (callback, vnode) => {\n addCallbackToSet(() => callback(vnode), SetType.onCleanup, current.vnode as VnodeWithDom);\n },\n\n \"v-if\": (value, vnode) => {\n if (!Boolean(value)) {\n const parentNode = vnode.dom?.parentNode;\n if (parentNode) {\n parentNode.replaceChild(document.createTextNode(\"\"), vnode.dom);\n }\n\n return false;\n }\n },\n\n \"v-show\": (value, vnode) => {\n const bool = Boolean(value);\n (\n vnode.dom as unknown as {\n style: { display: string };\n }\n ).style.display = bool ? \"\" : \"none\";\n },\n\n \"v-html\": (value, vnode) => {\n vnode.children = trust(value as string);\n },\n\n // The \"v-model\" directive binds the value of an input element to a model property\n \"v-model\": (model, vnode) => {\n // eslint-disable-next-line prefer-const\n if (\"name\" in vnode.props === false) {\n return;\n }\n\n let value;\n const property = vnode.props.name;\n let event = \"oninput\";\n\n // This function updates the model property when the input element's value changes\n let handler = (e: Event) => (model[property] = (e.target as DomElement & Record<string, any>).value);\n if (vnode.tag === \"input\") {\n // Depending on the type of input element, use a different handler function\n switch (vnode.props.type) {\n case \"checkbox\": {\n if (Array.isArray(model[property])) {\n // If the model property is an array, add or remove the value from the array when the checkbox is checked or unchecked\n handler = (e: Event) => {\n const val = (e.target as DomElement & Record<string, any>).value;\n const idx = model[property].indexOf(val);\n if (idx === -1) {\n model[property].push(val);\n } else {\n model[property].splice(idx, 1);\n }\n };\n // If the value is in the array, set the checkbox to be checked\n value = model[property].indexOf(vnode.dom.value) !== -1;\n } else if (\"value\" in vnode.props) {\n // If the input element has a \"value\" attribute, use it to determine the checked state\n handler = () => {\n if (model[property] === vnode.props.value) {\n model[property] = null;\n } else {\n model[property] = vnode.props.value;\n }\n };\n value = model[property] === vnode.props.value;\n } else {\n // If there is no \"value\" attribute, use a boolean value for the model property\n handler = () => (model[property] = !model[property]);\n value = model[property];\n }\n // Set the \"checked\" attribute on the input element\n // eslint-disable-next-line no-use-before-define\n setAttribute(\"checked\", value, vnode);\n break;\n }\n case \"radio\": {\n // If the element is a radio button, set the \"checked\" attribute based on the value of the model property\n // eslint-disable-next-line no-use-before-define\n setAttribute(\"checked\", model[property] === vnode.dom.value, vnode);\n break;\n }\n default: {\n // For all other input types, set the \"value\" attribute based on the value of the model property\n // eslint-disable-next-line no-use-before-define\n setAttribute(\"value\", model[property], vnode);\n }\n }\n } else if (vnode.tag === \"select\") {\n // If the element is a select element, use the \"click\" event by default\n event = \"onclick\";\n if (vnode.props.multiple) {\n // If the select element allows multiple selections, update the model property with an array of selected values\n handler = (e: Event & Record<string, any>) => {\n const val = (e.target as DomElement & Record<string, any>).value;\n if (e.ctrlKey) {\n // If the Ctrl key is pressed, add or remove the value from the array\n const idx = model[property].indexOf(val);\n if (idx === -1) {\n model[property].push(val);\n } else {\n model[property].splice(idx, 1);\n }\n } else {\n // If the Ctrl key is not pressed, set the model property to an array with the selected value\n model[property].splice(0, model[property].length);\n model[property].push(val);\n }\n };\n // Set the \"selected\" attribute on the options based on whether they are in the model property array\n vnode.children.forEach((child: VnodeWithDom) => {\n if (child.tag === \"option\") {\n const value = \"value\" in child.props ? child.props.value : child.children.join(\"\").trim();\n child.props.selected = model[property].indexOf(value) !== -1;\n }\n });\n } else {\n // If the select element does not allow multiple selections, set the \"selected\" attribute on the options based on the value of the model property\n vnode.children.forEach((child: VnodeWithDom) => {\n if (child.tag === \"option\") {\n const value = \"value\" in child.props ? child.props.value : child.children.join(\"\").trim();\n child.props.selected = value === model[property];\n }\n });\n }\n } else if (vnode.tag === \"textarea\") {\n // Set the textarea's content to the value of the model property\n vnode.children = [model[property]];\n }\n\n // We assume that the prev handler if any will not be changed by the user across patchs\n const prevHandler = vnode.props[event];\n\n // Set the event handler on the element\n // eslint-disable-next-line no-use-before-define\n setAttribute(\n event,\n (e: Event) => {\n handler(e);\n\n // If the previous handler is defined, call it after the model has been updated\n if (prevHandler) {\n prevHandler(e);\n }\n },\n vnode\n );\n },\n\n \"v-class\": (value, vnode) => {\n if (typeof value === \"string\") {\n vnode.dom.className = value;\n } else if (Array.isArray(value)) {\n vnode.dom.className = value.join(\" \");\n } else if (typeof value === \"object\") {\n const classList = vnode.dom.classList;\n for (const name in value) {\n const val = typeof value[name] === \"function\" ? (value[name] as Function)() : value[name];\n classList.toggle(name, val);\n }\n }\n },\n\n // Frequent used properties\n class(value, vnode) {\n if (vnode.dom.className !== value) {\n if (vnode.isSVG) {\n vnode.dom.setAttribute(\"class\", value);\n return;\n }\n vnode.dom.className = value;\n }\n },\n\n className(value, vnode) {\n directives.class(value, vnode);\n },\n\n id: (value, vnode) => {\n if (vnode.dom.id !== value) {\n if (vnode.isSVG) {\n vnode.dom.setAttribute(\"id\", value);\n return;\n }\n vnode.dom.id = value;\n }\n },\n\n style: (value, vnode) => {\n if (typeof value === \"string\") {\n if (vnode.isSVG) {\n vnode.dom.setAttribute(\"style\", value);\n return;\n }\n vnode.dom.style = value;\n } else if (typeof value === \"object\") {\n if (vnode.isSVG) {\n vnode.dom.setAttribute(\"style\", \"\");\n } else {\n vnode.dom.style = \"\";\n }\n const domStyle = vnode.dom.style;\n for (const name in value) {\n domStyle[name] = value[name];\n }\n }\n }\n};\n\nexport function directive(name: string, directive: Directive) {\n const directiveName = `v-${name}`;\n directives[directiveName] = directive;\n reservedProps.add(directiveName);\n}\n\nexport function setPropNameReserved(name: string) {\n reservedProps.add(name);\n}\n\nconst eventListenerNames = new Set<string>();\n\nfunction eventListener(e: Event) {\n current.event = e;\n let dom = e.target as DomElement;\n const name = `on${e.type}`;\n\n while (dom) {\n const oldVnode = dom.vnode as VnodeWithDom;\n if (oldVnode && oldVnode.props[name]) {\n oldVnode.props[name](e, oldVnode);\n\n if (!e.defaultPrevented) {\n // eslint-disable-next-line no-use-before-define\n update();\n }\n return;\n }\n dom = dom.parentNode as DomElement;\n }\n\n current.event = null;\n}\n\nfunction sharedSetAttribute(name: string, value: any, newVnode: VnodeWithDom): void | boolean {\n const newVnodeDom = newVnode.dom;\n if (typeof value === \"function\") {\n if (!eventListenerNames.has(name)) {\n // We attach the delegated event listener to the main vnode dom element, which is the root of the component\n (mainVnode as VnodeWithDom).dom.addEventListener(name.slice(2), eventListener);\n eventListenerNames.add(name);\n }\n return;\n }\n\n if (!newVnode.isSVG && name in newVnodeDom) {\n newVnodeDom[name] = value;\n return;\n }\n\n if (value === false) {\n newVnodeDom.removeAttribute(name);\n } else {\n newVnodeDom.setAttribute(name, value);\n }\n}\n\nexport function setAttribute(name: string, value: any, newVnode: VnodeWithDom): void {\n if (!reservedProps.has(name)) {\n newVnode.props[name] = value;\n sharedSetAttribute(name, value, newVnode);\n }\n}\n\nexport function updateAttributes(newVnode: VnodeWithDom, oldVnode?: VnodeWithDom): void {\n const vnodeDom = newVnode.dom;\n const vnodeProps = newVnode.props;\n vnodeDom.vnode = newVnode;\n\n if (oldVnode) {\n for (const name in oldVnode.props) {\n if (name in vnodeProps === false && !eventListenerNames.has(name) && !reservedProps.has(name)) {\n if (!newVnode.isSVG && name in vnodeDom) {\n vnodeDom[name] = null;\n } else {\n vnodeDom.removeAttribute(name);\n }\n }\n }\n }\n\n for (const name in vnodeProps) {\n if (directives[name]) {\n if (directives[name](vnodeProps[name], newVnode, oldVnode?.props) === false) {\n break;\n }\n continue;\n }\n\n if (!reservedProps.has(name)) {\n sharedSetAttribute(name, vnodeProps[name], newVnode);\n }\n }\n}\n\nexport function createElement(tag: string, isSVG: boolean): DomElement {\n return isSVG\n ? document.createElementNS(\"http://www.w3.org/2000/svg\", tag)\n : (document.createElement(tag) as DomElement);\n}\n\nfunction flatTree(newVnode: VnodeWithDom) {\n let i = 0;\n let children: Children;\n\n if (\"v-for\" in newVnode.props === false) {\n children = [...newVnode.children];\n } else {\n children = [];\n const set = newVnode.props[\"v-for\"];\n const l = set.length;\n const callback = newVnode.children[0];\n\n if (typeof callback !== \"function\") {\n console.warn(\"v-for directive must have a callback function as children\");\n return children;\n }\n\n for (let i = 0; i < l; i++) {\n children[i] = callback(set[i], i);\n }\n }\n\n if (newVnode.directComponents) {\n newVnode.directComponents.clear();\n }\n\n while (i < children.length) {\n const newChild = children[i];\n\n if (newChild == null) {\n children.splice(i, 1);\n continue;\n }\n\n if (Array.isArray(newChild)) {\n children.splice(i, 1, ...newChild);\n continue;\n }\n\n if (newChild instanceof Vnode) {\n newChild.props = newChild.props || {};\n newChild.isSVG = newVnode.isSVG || newChild.tag === \"svg\";\n\n if (typeof newChild.tag !== \"string\") {\n const component = (current.component = newChild.tag);\n newVnode.directComponents = newVnode.directComponents || new Set();\n newVnode.directComponents.add(component);\n\n children[i] = (isPOJOComponent(component) ? component.view : component).bind(component)(\n newChild.props,\n newChild.children\n );\n\n continue;\n }\n\n newVnode.hasKeys = newVnode.hasKeys || \"key\" in newChild.props;\n }\n\n i++;\n }\n\n return children;\n}\n\nfunction processNewChild(newChild: VnodeWithDom, parentVnode: VnodeWithDom, oldDom?: DomElement) {\n if (oldDom) {\n newChild.dom = createElement(newChild.tag, newChild.isSVG as boolean);\n parentVnode.dom.replaceChild(newChild.dom, oldDom);\n } else {\n newChild.dom = parentVnode.dom.appendChild(createElement(newChild.tag, newChild.isSVG as boolean));\n }\n updateAttributes(newChild);\n if (\"v-text\" in newChild.props) {\n newChild.dom.textContent = newChild.props[\"v-text\"];\n return;\n }\n\n current.oldVnode = null;\n current.vnode = newChild;\n\n const children = flatTree(newChild);\n if (children.length === 0) {\n newChild.dom.textContent = \"\";\n return;\n }\n\n for (let i = 0, l = children.length; i < l; i++) {\n if (children[i] instanceof Vnode === false) {\n newChild.dom.appendChild(document.createTextNode(children[i]));\n continue;\n }\n processNewChild(children[i] as VnodeWithDom, newChild);\n }\n}\n\n// eslint-disable-next-line complexity\nfunction patch(newVnode: VnodeWithDom, oldVnode: VnodeWithDom | null): void {\n current.oldVnode = oldVnode;\n current.vnode = newVnode;\n const children = flatTree(newVnode);\n const dom = newVnode.dom;\n\n if (children.length === 0) {\n if (dom.childNodes.length) {\n dom.textContent = \"\";\n }\n // There are no children so we don't need to call the oncreate and onupdate callbacks\n return;\n }\n\n const childNodes = dom.childNodes as unknown as DomElement[];\n const oldChildrenLength = childNodes.length;\n const childrenLength = children.length;\n if (oldChildrenLength === 0) {\n for (let i = 0; i < childrenLength; i++) {\n const newChild = children[i] as VnodeWithDom;\n if (newChild instanceof Vnode === false) {\n dom.appendChild(document.createTextNode(newChild));\n continue;\n }\n processNewChild(newChild, newVnode);\n }\n // The oncreate callback must be called after the children are created\n newVnode.oncreate && callSet(newVnode.oncreate);\n return;\n }\n\n let oldTree = childNodes as unknown as DomElement[];\n const oldKeyedList: Record<string, number> = {};\n\n if (newVnode.hasKeys) {\n const newOldTree = [];\n for (let i = 0, l = oldTree.length; i < l; i++) {\n newOldTree[i] = oldTree[i];\n const oldVnode = oldTree[i].vnode as VnodeWithDom;\n oldKeyedList[!oldVnode || \"key\" in oldVnode.props === false ? i : (oldVnode.props.key as string)] = i;\n }\n oldTree = newOldTree;\n }\n\n for (let i = 0, l = children.length; i < l; i++) {\n const newChild = children[i] as VnodeWithDom;\n\n if (newChild instanceof Vnode === false) {\n const oldChild = oldTree[i];\n if (!oldChild) {\n dom.appendChild(document.createTextNode(newChild));\n continue;\n }\n\n if (oldChild.nodeType !== 3) {\n dom.replaceChild(document.createTextNode(newChild), oldChild);\n continue;\n }\n\n // eslint-disable-next-line eqeqeq\n if (oldChild.nodeValue != newChild) {\n oldChild.nodeValue = newChild;\n }\n continue;\n }\n\n const oldChild = oldTree[newVnode.hasKeys ? oldKeyedList[(newChild.props.key as any) || i] : i] as DomElement;\n\n if (!oldChild || newChild.tag !== oldChild.nodeName.toLowerCase()) {\n processNewChild(newChild, newVnode, childNodes[i] as DomElement);\n continue;\n }\n\n newChild.dom = oldChild;\n const currentChild = childNodes[i];\n const oldChildVnode = oldChild.vnode as VnodeWithDom;\n if (!currentChild) {\n dom.appendChild(oldChild);\n } else if (currentChild !== oldChild) {\n dom.replaceChild(oldChild, currentChild);\n }\n\n if (\"v-keep\" in newChild.props && oldChildVnode) {\n if (oldChildVnode.props[\"v-keep\"] === newChild.props[\"v-keep\"]) {\n continue;\n }\n\n const oldProps = childNodes[i + 1]?.vnode?.props;\n if (oldProps && \"key\" in oldProps === false && oldProps[\"v-keep\"] === newChild.props[\"v-keep\"]) {\n oldChild.remove();\n oldTree.splice(i, 1);\n continue;\n }\n }\n\n updateAttributes(newChild as VnodeWithDom, oldChildVnode);\n\n if (\"v-text\" in newChild.props) {\n // eslint-disable-next-line eqeqeq\n if (oldChild.textContent != newChild.props[\"v-text\"]) {\n oldChild.textContent = newChild.props[\"v-text\"];\n }\n continue;\n }\n\n // Call the cleanup for the old child vnode before the patch\n callSet(oldChildVnode?.oncleanup);\n // eslint-disable-next-line no-use-before-define\n patch(newChild as VnodeWithDom, oldChildVnode || null);\n // Call the remove for the old child vnode after the patch\n callSet(oldChildVnode?.onremove);\n }\n\n for (let i = childNodes.length, l = children.length; i > l; i--) {\n childNodes[i - 1].remove();\n }\n\n // In here we could have new children or/and patched children\n // So we need to call the oncreate and onupdate callbacks\n callSet(newVnode.oncreate);\n callSet(newVnode.onupdate);\n}\n\nexport function updateVnode(vnode: VnodeWithDom, shouldCleanup = true): string | void {\n vnode.props = vnode.props || {};\n if (shouldCleanup) {\n // The clean up must be from the old vnode\n // and in here the vnode is the old one\n // so, we need to call the cleanup before the patch\n // inside the patch the clean up will be called only for the old children\n callSet(vnode.oncleanup);\n }\n // Clone the old on remove set to call it after the patch\n const oldOnRemoveSet = vnode.onremove ? new Set(vnode.onremove) : null;\n current.vnode = vnode;\n patch(vnode, shouldCleanup ? vnode : null);\n // Call the old on remove set\n callSet(oldOnRemoveSet);\n isMounted = true;\n current.oldVnode = null;\n current.vnode = null;\n current.component = null;\n}\n\nexport function update(): string {\n if (mainVnode) {\n mainVnode.children = [mainComponent];\n // If the updateVnode method is called from outside the main lib (e.g. from a directive)\n // it always be considered as mounted, so the cleanup will be called before the patch\n // But in here, we need to pass the shouldCleanup as false if the app is not mounted\n updateVnode(mainVnode as VnodeWithDom, isMounted);\n if (isNodeJs) {\n return mainVnode.dom.innerHTML;\n }\n }\n return \"\";\n}\n\nlet debouncedUpdateTimeout: any;\nconst debouncedUpdateMethod = isNodeJs ? update : () => requestAnimationFrame(update);\n\nexport function debouncedUpdate(timeout = 42) {\n if (current.event) {\n current.event.preventDefault();\n }\n clearTimeout(debouncedUpdateTimeout);\n debouncedUpdateTimeout = setTimeout(debouncedUpdateMethod, timeout);\n}\n\nexport function unmount() {\n if (mainVnode) {\n mainComponent = v(() => null, {}) as VnodeComponentInterface;\n const result = update();\n for (const name in eventListenerNames) {\n mainVnode.dom.removeEventListener(name.slice(2).toLowerCase(), eventListener);\n Reflect.deleteProperty(eventListenerNames, name);\n }\n\n callSet(mainVnode.onremove);\n\n mainComponent = null;\n mainVnode = null;\n isMounted = false;\n current.vnode = null;\n current.component = null;\n current.event = null;\n return result;\n }\n\n return \"\";\n}\n\nexport function mount(dom: string | DomElement, component: ValyrianComponent | VnodeComponentInterface | any) {\n const container =\n typeof dom === \"string\" ? (isNodeJs ? createElement(dom, dom === \"svg\") : document.querySelector(dom)) : dom;\n\n if (isComponent(component)) {\n mainComponent = v(component, {}, []) as VnodeComponentInterface;\n } else if (isVnodeComponent(component)) {\n mainComponent = component;\n } else {\n mainComponent = v(() => component, {}, []) as VnodeComponentInterface;\n }\n\n mainVnode = hidrateDomToVnode(container) as VnodeWithDom;\n return update();\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable */\ndeclare global {\n var document: Document;\n namespace JSX {\n interface IntrinsicElements extends DefaultRecord {}\n type Element = ReturnType<\n typeof v | ((...args: any) => string | number | null | undefined | boolean | Promise<any>)\n >;\n type ComponentReturnType = string | number | null | undefined | boolean | Element | Element[];\n }\n}\n\ninterface DefaultRecord extends Record<string | number | symbol, any> {}\n\nexport interface Properties extends DefaultRecord {\n key?: string | number;\n}\n\nexport interface DomElement extends Element, DefaultRecord {}\n\nexport interface Component extends DefaultRecord {\n (props: Properties, children: any[]): Vnode | any;\n}\n\nexport interface POJOComponent extends DefaultRecord {\n view: Component;\n}\n\nexport type ValyrianComponent = Component | POJOComponent;\n\nexport interface VnodeComponentInterface extends Vnode {\n tag: ValyrianComponent;\n}\n\nexport interface Children extends Array<Vnode | VnodeComponentInterface | ValyrianComponent | any> {}\n\nexport interface Directive {\n (value: any, vnode: VnodeWithDom, oldProps?: Properties): false | void | any;\n}\n\nexport const isNodeJs = Boolean(typeof process !== \"undefined\" && process.versions && process.versions.node);\n\nexport class Vnode {\n constructor(\n public tag: string | Component | POJOComponent,\n public props: null | Properties,\n public children: Children,\n public dom?: DomElement,\n public isSVG?: boolean,\n public oldChildComponents?: Set<ValyrianComponent>,\n public childComponents?: Set<ValyrianComponent>,\n public hasKeys?: boolean,\n public oncreate?: Set<Function>,\n public oncleanup?: Set<Function>,\n public onupdate?: Set<Function>,\n public onremove?: Set<Function>\n ) {}\n}\n\nexport interface VnodeWithDom extends Vnode {\n tag: string;\n dom: DomElement;\n props: Properties;\n}\n\nexport const isPOJOComponent = (component: unknown): component is POJOComponent =>\n Boolean(component && typeof component === \"object\" && \"view\" in component);\n\nexport const isComponent = (component: unknown): component is Component =>\n Boolean(typeof component === \"function\" || isPOJOComponent(component));\nexport const isVnode = (object?: unknown): object is Vnode => object instanceof Vnode;\n\nexport const isVnodeComponent = (object?: unknown): object is VnodeComponentInterface => {\n return isVnode(object) && isComponent(object.tag);\n};\n\nexport function v(tagOrComponent: string | ValyrianComponent, props: Properties | null, ...children: Children) {\n return new Vnode(tagOrComponent, props, children);\n}\n\nv.fragment = (_: Properties, ...children: Children) => children;\n\nexport function hidrateDomToVnode(dom: any): VnodeWithDom | void {\n if (dom.nodeType === 3) {\n return dom.nodeValue;\n }\n\n if (dom.nodeType === 1) {\n const tag = dom.nodeName.toLowerCase();\n const props = {} as Properties;\n const children = [] as Children;\n\n for (let i = 0, l = dom.childNodes.length; i < l; i++) {\n const childDom = dom.childNodes[i];\n if (childDom.nodeType === 3) {\n children.push(childDom.nodeValue);\n } else if (childDom.nodeType === 1) {\n const childVnode = hidrateDomToVnode(childDom);\n children.push(childVnode);\n }\n }\n\n const attributes = dom.attributes;\n for (let i = 0, l = attributes.length; i < l; i++) {\n const attr = attributes[i];\n props[attr.nodeName] = attr.nodeValue;\n }\n\n const vnode = new Vnode(tag, props, children);\n vnode.dom = dom;\n dom.vnode = vnode;\n vnode.isSVG = tag === \"svg\";\n return vnode as VnodeWithDom;\n }\n}\n\nexport function trust(htmlString: string) {\n const div = document.createElement(\"div\");\n div.innerHTML = htmlString.trim();\n return Array.from(div.childNodes).map(hidrateDomToVnode);\n}\n\nlet mainComponent: VnodeComponentInterface | null = null;\nlet mainVnode: VnodeWithDom | null = null;\nlet isMounted = false;\n\nexport const current = {\n oldVnode: null as Vnode | null,\n vnode: null as Vnode | null,\n component: null as ValyrianComponent | null,\n event: null as Event | null\n};\n\nexport const reservedProps = new Set<string>([\n \"key\",\n \"state\",\n \"v-keep\",\n \"v-text\",\n \"v-if\",\n \"v-for\",\n \"v-show\",\n \"v-class\",\n \"v-html\",\n \"v-model\",\n \"v-create\",\n \"v-update\",\n \"v-cleanup\"\n]);\n\nenum SetType {\n onCreate = \"oncreate\",\n onUpdate = \"onupdate\",\n onCleanup = \"oncleanup\",\n onRemove = \"onremove\"\n}\n\nfunction addCallbackToSet(callback: Function, setType: SetType, vnode: VnodeWithDom) {\n vnode[setType] = vnode[setType] || new Set();\n vnode[setType].add(() => {\n const cleanup = callback();\n if (typeof cleanup === \"function\") {\n vnode[SetType.onCleanup] = vnode[SetType.onCleanup] || new Set();\n vnode[SetType.onCleanup].add(cleanup);\n }\n });\n}\n\nfunction validateIsCalledInsideComponent() {\n if (!current.vnode) {\n throw new Error(\"This function must be called inside a component\");\n }\n}\n\nexport const onCreate = (callback: Function) => {\n validateIsCalledInsideComponent();\n const parentVnode = current.vnode as VnodeWithDom;\n const component = current.component as ValyrianComponent;\n const hasComponentAsOldChild = parentVnode.oldChildComponents && parentVnode.oldChildComponents.has(component);\n\n if (!hasComponentAsOldChild) {\n addCallbackToSet(callback, SetType.onCreate, parentVnode);\n }\n};\nexport const onUpdate = (callback: Function) => {\n validateIsCalledInsideComponent();\n const parentVnode = current.vnode as VnodeWithDom;\n const component = current.component as ValyrianComponent;\n const hasComponentAsChild = parentVnode.childComponents && parentVnode.childComponents.has(component);\n if (hasComponentAsChild) {\n addCallbackToSet(callback, SetType.onUpdate, current.vnode as VnodeWithDom);\n }\n};\nexport const onCleanup = (callback: Function) => {\n validateIsCalledInsideComponent();\n addCallbackToSet(callback, SetType.onCleanup, current.vnode as VnodeWithDom);\n};\nexport const onRemove = (callback: Function) => {\n validateIsCalledInsideComponent();\n\n const parentVnode = current.vnode as VnodeWithDom;\n const component = current.component as ValyrianComponent;\n let removed = false;\n\n function removeCallback() {\n const hasComponentAsChild = parentVnode.childComponents && parentVnode.childComponents.has(component);\n\n if (hasComponentAsChild || removed) {\n return;\n }\n\n removed = true;\n callback();\n }\n\n addCallbackToSet(removeCallback, SetType.onRemove, current.vnode as VnodeWithDom);\n};\nconst callSet = (set?: Set<Function> | null) => {\n if (!set) {\n return;\n }\n for (const callback of set) {\n callback();\n }\n set.clear();\n};\n\nexport const directives: Record<string, Directive> = {\n \"v-create\": (callback, childVnode, oldProps) => {\n if (!oldProps) {\n addCallbackToSet(() => callback(childVnode), SetType.onCreate, current.vnode as VnodeWithDom);\n }\n },\n\n \"v-update\": (callback, childVnode, oldProps) => {\n if (oldProps) {\n addCallbackToSet(() => callback(childVnode, oldProps), SetType.onUpdate, current.vnode as VnodeWithDom);\n }\n },\n\n \"v-remove\": (callback, childVnode) => {\n let parentVnode = current.vnode as VnodeWithDom;\n let currentChildVnode = childVnode as VnodeWithDom;\n while (parentVnode) {\n parentVnode.onremove = parentVnode.onremove || new Set();\n addCallbackToSet(\n () => {\n if (!childVnode.dom.vnode || currentChildVnode.dom.parentNode) {\n return;\n }\n callback(childVnode);\n childVnode.dom.vnode = null;\n },\n SetType.onRemove,\n parentVnode\n );\n\n if (!parentVnode.dom.parentElement) {\n break;\n }\n currentChildVnode = parentVnode;\n parentVnode = (parentVnode.dom.parentElement as DomElement).vnode as VnodeWithDom;\n }\n },\n\n \"v-cleanup\": (callback, vnode) => {\n addCallbackToSet(() => callback(vnode), SetType.onCleanup, current.vnode as VnodeWithDom);\n },\n\n \"v-if\": (value, vnode) => {\n if (!Boolean(value)) {\n const parentNode = vnode.dom?.parentNode;\n if (parentNode) {\n parentNode.replaceChild(document.createTextNode(\"\"), vnode.dom);\n }\n\n return false;\n }\n },\n\n \"v-show\": (value, vnode) => {\n const bool = Boolean(value);\n (\n vnode.dom as unknown as {\n style: { display: string };\n }\n ).style.display = bool ? \"\" : \"none\";\n },\n\n \"v-html\": (value, vnode) => {\n vnode.children = trust(value as string);\n },\n\n // The \"v-model\" directive binds the value of an input element to a model property\n \"v-model\": (model, vnode) => {\n // eslint-disable-next-line prefer-const\n if (\"name\" in vnode.props === false) {\n return;\n }\n\n let value;\n const property = vnode.props.name;\n let event = \"oninput\";\n\n // This function updates the model property when the input element's value changes\n let handler = (e: Event) => (model[property] = (e.target as DomElement & Record<string, any>).value);\n if (vnode.tag === \"input\") {\n // Depending on the type of input element, use a different handler function\n switch (vnode.props.type) {\n case \"checkbox\": {\n if (Array.isArray(model[property])) {\n // If the model property is an array, add or remove the value from the array when the checkbox is checked or unchecked\n handler = (e: Event) => {\n const val = (e.target as DomElement & Record<string, any>).value;\n const idx = model[property].indexOf(val);\n if (idx === -1) {\n model[property].push(val);\n } else {\n model[property].splice(idx, 1);\n }\n };\n // If the value is in the array, set the checkbox to be checked\n value = model[property].indexOf(vnode.dom.value) !== -1;\n } else if (\"value\" in vnode.props) {\n // If the input element has a \"value\" attribute, use it to determine the checked state\n handler = () => {\n if (model[property] === vnode.props.value) {\n model[property] = null;\n } else {\n model[property] = vnode.props.value;\n }\n };\n value = model[property] === vnode.props.value;\n } else {\n // If there is no \"value\" attribute, use a boolean value for the model property\n handler = () => (model[property] = !model[property]);\n value = model[property];\n }\n // Set the \"checked\" attribute on the input element\n // eslint-disable-next-line no-use-before-define\n setAttribute(\"checked\", value, vnode);\n break;\n }\n case \"radio\": {\n // If the element is a radio button, set the \"checked\" attribute based on the value of the model property\n // eslint-disable-next-line no-use-before-define\n setAttribute(\"checked\", model[property] === vnode.dom.value, vnode);\n break;\n }\n default: {\n // For all other input types, set the \"value\" attribute based on the value of the model property\n // eslint-disable-next-line no-use-before-define\n setAttribute(\"value\", model[property], vnode);\n }\n }\n } else if (vnode.tag === \"select\") {\n // If the element is a select element, use the \"click\" event by default\n event = \"onclick\";\n if (vnode.props.multiple) {\n // If the select element allows multiple selections, update the model property with an array of selected values\n handler = (e: Event & Record<string, any>) => {\n const val = (e.target as DomElement & Record<string, any>).value;\n if (e.ctrlKey) {\n // If the Ctrl key is pressed, add or remove the value from the array\n const idx = model[property].indexOf(val);\n if (idx === -1) {\n model[property].push(val);\n } else {\n model[property].splice(idx, 1);\n }\n } else {\n // If the Ctrl key is not pressed, set the model property to an array with the selected value\n model[property].splice(0, model[property].length);\n model[property].push(val);\n }\n };\n // Set the \"selected\" attribute on the options based on whether they are in the model property array\n vnode.children.forEach((child: VnodeWithDom) => {\n if (child.tag === \"option\") {\n const value = \"value\" in child.props ? child.props.value : child.children.join(\"\").trim();\n child.props.selected = model[property].indexOf(value) !== -1;\n }\n });\n } else {\n // If the select element does not allow multiple selections, set the \"selected\" attribute on the options based on the value of the model property\n vnode.children.forEach((child: VnodeWithDom) => {\n if (child.tag === \"option\") {\n const value = \"value\" in child.props ? child.props.value : child.children.join(\"\").trim();\n child.props.selected = value === model[property];\n }\n });\n }\n } else if (vnode.tag === \"textarea\") {\n // Set the textarea's content to the value of the model property\n vnode.children = [model[property]];\n }\n\n // We assume that the prev handler if any will not be changed by the user across patchs\n const prevHandler = vnode.props[event];\n\n // Set the event handler on the element\n // eslint-disable-next-line no-use-before-define\n setAttribute(\n event,\n (e: Event) => {\n handler(e);\n\n // If the previous handler is defined, call it after the model has been updated\n if (prevHandler) {\n prevHandler(e);\n }\n },\n vnode\n );\n },\n\n \"v-class\": (value, vnode) => {\n if (typeof value === \"string\") {\n vnode.dom.className = value;\n } else if (Array.isArray(value)) {\n vnode.dom.className = value.join(\" \");\n } else if (typeof value === \"object\") {\n const classList = vnode.dom.classList;\n for (const name in value) {\n const val = typeof value[name] === \"function\" ? (value[name] as Function)() : value[name];\n classList.toggle(name, val);\n }\n }\n },\n\n // Frequent used properties\n class(value, vnode) {\n if (vnode.dom.className !== value) {\n if (vnode.isSVG) {\n vnode.dom.setAttribute(\"class\", value);\n return;\n }\n vnode.dom.className = value;\n }\n },\n\n className(value, vnode) {\n directives.class(value, vnode);\n },\n\n id: (value, vnode) => {\n if (vnode.dom.id !== value) {\n if (vnode.isSVG) {\n vnode.dom.setAttribute(\"id\", value);\n return;\n }\n vnode.dom.id = value;\n }\n },\n\n style: (value, vnode) => {\n if (typeof value === \"string\") {\n if (vnode.isSVG) {\n vnode.dom.setAttribute(\"style\", value);\n return;\n }\n vnode.dom.style = value;\n } else if (typeof value === \"object\") {\n if (vnode.isSVG) {\n vnode.dom.setAttribute(\"style\", \"\");\n } else {\n vnode.dom.style = \"\";\n }\n const domStyle = vnode.dom.style;\n for (const name in value) {\n domStyle[name] = value[name];\n }\n }\n }\n};\n\nexport function directive(name: string, directive: Directive) {\n const directiveName = `v-${name}`;\n directives[directiveName] = directive;\n reservedProps.add(directiveName);\n}\n\nexport function setPropNameReserved(name: string) {\n reservedProps.add(name);\n}\n\nconst eventListenerNames = new Set<string>();\n\nfunction eventListener(e: Event) {\n current.event = e;\n let dom = e.target as DomElement;\n const name = `on${e.type}`;\n\n while (dom) {\n const oldVnode = dom.vnode as VnodeWithDom;\n if (oldVnode && oldVnode.props[name]) {\n oldVnode.props[name](e, oldVnode);\n\n if (!e.defaultPrevented) {\n // eslint-disable-next-line no-use-before-define\n update();\n }\n return;\n }\n dom = dom.parentNode as DomElement;\n }\n\n current.event = null;\n}\n\nfunction sharedSetAttribute(name: string, value: any, newVnode: VnodeWithDom): void | boolean {\n const newVnodeDom = newVnode.dom;\n if (typeof value === \"function\") {\n if (!eventListenerNames.has(name)) {\n // We attach the delegated event listener to the main vnode dom element, which is the root of the component\n (mainVnode as VnodeWithDom).dom.addEventListener(name.slice(2), eventListener);\n eventListenerNames.add(name);\n }\n return;\n }\n\n if (!newVnode.isSVG && name in newVnodeDom) {\n newVnodeDom[name] = value;\n return;\n }\n\n if (value === false) {\n newVnodeDom.removeAttribute(name);\n } else {\n newVnodeDom.setAttribute(name, value);\n }\n}\n\nexport function setAttribute(name: string, value: any, newVnode: VnodeWithDom): void {\n if (!reservedProps.has(name)) {\n newVnode.props[name] = value;\n sharedSetAttribute(name, value, newVnode);\n }\n}\n\nexport function updateAttributes(newVnode: VnodeWithDom, oldVnode?: VnodeWithDom): void {\n const vnodeDom = newVnode.dom;\n const vnodeProps = newVnode.props;\n vnodeDom.vnode = newVnode;\n\n if (oldVnode) {\n for (const name in oldVnode.props) {\n if (name in vnodeProps === false && !eventListenerNames.has(name) && !reservedProps.has(name)) {\n if (!newVnode.isSVG && name in vnodeDom) {\n vnodeDom[name] = null;\n } else {\n vnodeDom.removeAttribute(name);\n }\n }\n }\n }\n\n for (const name in vnodeProps) {\n if (directives[name]) {\n if (directives[name](vnodeProps[name], newVnode, oldVnode?.props) === false) {\n break;\n }\n continue;\n }\n\n if (!reservedProps.has(name)) {\n sharedSetAttribute(name, vnodeProps[name], newVnode);\n }\n }\n}\n\nexport function createElement(tag: string, isSVG: boolean): DomElement {\n return isSVG\n ? document.createElementNS(\"http://www.w3.org/2000/svg\", tag)\n : (document.createElement(tag) as DomElement);\n}\n\nfunction flatTree(newVnode: VnodeWithDom) {\n let i = 0;\n let children: Children;\n\n if (\"v-for\" in newVnode.props === false) {\n children = [...newVnode.children];\n } else {\n children = [];\n const set = newVnode.props[\"v-for\"];\n const l = set.length;\n const callback = newVnode.children[0];\n\n if (typeof callback !== \"function\") {\n console.warn(\"v-for directive must have a callback function as children\");\n return children;\n }\n\n for (let i = 0; i < l; i++) {\n children[i] = callback(set[i], i);\n }\n }\n\n newVnode.oldChildComponents = newVnode.childComponents;\n if (newVnode.childComponents) {\n newVnode.childComponents = new Set();\n }\n\n while (i < children.length) {\n const newChild = children[i];\n\n if (newChild == null) {\n children.splice(i, 1);\n continue;\n }\n\n if (Array.isArray(newChild)) {\n children.splice(i, 1, ...newChild);\n continue;\n }\n\n if (newChild instanceof Vnode) {\n newChild.props = newChild.props || {};\n newChild.isSVG = newVnode.isSVG || newChild.tag === \"svg\";\n\n if (typeof newChild.tag !== \"string\") {\n const component = (current.component = newChild.tag);\n newVnode.childComponents = newVnode.childComponents || new Set();\n newVnode.childComponents.add(component);\n\n children[i] = (isPOJOComponent(component) ? component.view : component).bind(component)(\n newChild.props,\n newChild.children\n );\n\n continue;\n }\n\n newVnode.hasKeys = newVnode.hasKeys || \"key\" in newChild.props;\n }\n\n i++;\n }\n\n return children;\n}\n\nfunction processNewChild(newChild: VnodeWithDom, parentVnode: VnodeWithDom, oldDom?: DomElement) {\n if (oldDom) {\n newChild.dom = createElement(newChild.tag, newChild.isSVG as boolean);\n parentVnode.dom.replaceChild(newChild.dom, oldDom);\n } else {\n newChild.dom = parentVnode.dom.appendChild(createElement(newChild.tag, newChild.isSVG as boolean));\n }\n updateAttributes(newChild);\n if (\"v-text\" in newChild.props) {\n newChild.dom.textContent = newChild.props[\"v-text\"];\n return;\n }\n\n current.oldVnode = null;\n current.vnode = newChild;\n\n const children = flatTree(newChild);\n if (children.length === 0) {\n newChild.dom.textContent = \"\";\n return;\n }\n\n for (let i = 0, l = children.length; i < l; i++) {\n if (children[i] instanceof Vnode === false) {\n newChild.dom.appendChild(document.createTextNode(children[i]));\n continue;\n }\n processNewChild(children[i] as VnodeWithDom, newChild);\n }\n}\n\n// eslint-disable-next-line complexity\nfunction patch(newVnode: VnodeWithDom, oldVnode: VnodeWithDom | null): void {\n current.oldVnode = oldVnode;\n current.vnode = newVnode;\n const children = flatTree(newVnode);\n const dom = newVnode.dom;\n\n if (children.length === 0) {\n if (dom.childNodes.length) {\n dom.textContent = \"\";\n }\n // There are no children so we don't need to call the oncreate and onupdate callbacks\n return;\n }\n\n const childNodes = dom.childNodes as unknown as DomElement[];\n const oldChildrenLength = childNodes.length;\n const childrenLength = children.length;\n if (oldChildrenLength === 0) {\n for (let i = 0; i < childrenLength; i++) {\n const newChild = children[i] as VnodeWithDom;\n if (newChild instanceof Vnode === false) {\n dom.appendChild(document.createTextNode(newChild));\n continue;\n }\n processNewChild(newChild, newVnode);\n }\n // The oncreate callback must be called after the children are created\n newVnode.oncreate && callSet(newVnode.oncreate);\n return;\n }\n\n let oldTree = childNodes as unknown as DomElement[];\n const oldKeyedList: Record<string, number> = {};\n\n if (newVnode.hasKeys) {\n const newOldTree = [];\n for (let i = 0, l = oldTree.length; i < l; i++) {\n newOldTree[i] = oldTree[i];\n const oldVnode = oldTree[i].vnode as VnodeWithDom;\n oldKeyedList[!oldVnode || \"key\" in oldVnode.props === false ? i : (oldVnode.props.key as string)] = i;\n }\n oldTree = newOldTree;\n }\n\n for (let i = 0, l = children.length; i < l; i++) {\n const newChild = children[i] as VnodeWithDom;\n\n if (newChild instanceof Vnode === false) {\n const oldChild = oldTree[i];\n if (!oldChild) {\n dom.appendChild(document.createTextNode(newChild));\n continue;\n }\n\n if (oldChild.nodeType !== 3) {\n dom.replaceChild(document.createTextNode(newChild), oldChild);\n continue;\n }\n\n // eslint-disable-next-line eqeqeq\n if (oldChild.nodeValue != newChild) {\n oldChild.nodeValue = newChild;\n }\n continue;\n }\n\n const oldChild = oldTree[newVnode.hasKeys ? oldKeyedList[(newChild.props.key as any) || i] : i] as DomElement;\n\n if (!oldChild || newChild.tag !== oldChild.nodeName.toLowerCase()) {\n processNewChild(newChild, newVnode, childNodes[i] as DomElement);\n continue;\n }\n\n newChild.dom = oldChild;\n const currentChild = childNodes[i];\n const oldChildVnode = oldChild.vnode as VnodeWithDom;\n if (!currentChild) {\n dom.appendChild(oldChild);\n } else if (currentChild !== oldChild) {\n dom.replaceChild(oldChild, currentChild);\n }\n\n if (\"v-keep\" in newChild.props && oldChildVnode) {\n if (oldChildVnode.props[\"v-keep\"] === newChild.props[\"v-keep\"]) {\n continue;\n }\n\n const oldProps = childNodes[i + 1]?.vnode?.props;\n if (oldProps && \"key\" in oldProps === false && oldProps[\"v-keep\"] === newChild.props[\"v-keep\"]) {\n oldChild.remove();\n oldTree.splice(i, 1);\n continue;\n }\n }\n\n updateAttributes(newChild as VnodeWithDom, oldChildVnode);\n\n if (\"v-text\" in newChild.props) {\n // eslint-disable-next-line eqeqeq\n if (oldChild.textContent != newChild.props[\"v-text\"]) {\n oldChild.textContent = newChild.props[\"v-text\"];\n }\n continue;\n }\n\n // Call the cleanup for the old child vnode before the patch\n callSet(oldChildVnode?.oncleanup);\n // eslint-disable-next-line no-use-before-define\n patch(newChild as VnodeWithDom, oldChildVnode || null);\n // Call the remove for the old child vnode after the patch\n callSet(oldChildVnode?.onremove);\n }\n\n for (let i = childNodes.length, l = children.length; i > l; i--) {\n childNodes[i - 1].remove();\n }\n\n // In here we could have new children or/and patched children\n // So we need to call the oncreate and onupdate callbacks\n callSet(newVnode.oncreate);\n callSet(newVnode.onupdate);\n}\n\nexport function updateVnode(vnode: VnodeWithDom, shouldCleanup = true): string | void {\n vnode.props = vnode.props || {};\n if (shouldCleanup) {\n // The clean up must be from the old vnode\n // and in here the vnode is the old one\n // so, we need to call the cleanup before the patch\n // inside the patch the clean up will be called only for the old children\n callSet(vnode.oncleanup);\n }\n // Clone the old on remove set to call it after the patch\n const oldOnRemoveSet = vnode.onremove ? new Set(vnode.onremove) : null;\n current.vnode = vnode;\n patch(vnode, shouldCleanup ? vnode : null);\n // Call the old on remove set\n callSet(oldOnRemoveSet);\n isMounted = true;\n current.oldVnode = null;\n current.vnode = null;\n current.component = null;\n}\n\nexport function update(): string {\n if (mainVnode) {\n mainVnode.children = [mainComponent];\n // If the updateVnode method is called from outside the main lib (e.g. from a directive)\n // it always be considered as mounted, so the cleanup will be called before the patch\n // But in here, we need to pass the shouldCleanup as false if the app is not mounted\n updateVnode(mainVnode as VnodeWithDom, isMounted);\n if (isNodeJs) {\n return mainVnode.dom.innerHTML;\n }\n }\n return \"\";\n}\n\nlet debouncedUpdateTimeout: any;\nconst debouncedUpdateMethod = isNodeJs ? update : () => requestAnimationFrame(update);\n\nexport function debouncedUpdate(timeout = 42) {\n if (current.event) {\n current.event.preventDefault();\n }\n clearTimeout(debouncedUpdateTimeout);\n debouncedUpdateTimeout = setTimeout(debouncedUpdateMethod, timeout);\n}\n\nexport function unmount() {\n if (mainVnode) {\n mainComponent = v(() => null, {}) as VnodeComponentInterface;\n const result = update();\n for (const name in eventListenerNames) {\n mainVnode.dom.removeEventListener(name.slice(2).toLowerCase(), eventListener);\n Reflect.deleteProperty(eventListenerNames, name);\n }\n\n callSet(mainVnode.onremove);\n\n mainComponent = null;\n mainVnode = null;\n isMounted = false;\n current.vnode = null;\n current.component = null;\n current.event = null;\n return result;\n }\n\n return \"\";\n}\n\nexport function mount(dom: string | DomElement, component: ValyrianComponent | VnodeComponentInterface | any) {\n const container =\n typeof dom === \"string\" ? (isNodeJs ? createElement(dom, dom === \"svg\") : document.querySelector(dom)) : dom;\n\n if (isComponent(component)) {\n mainComponent = v(component, {}, []) as VnodeComponentInterface;\n } else if (isVnodeComponent(component)) {\n mainComponent = component;\n } else {\n mainComponent = v(() => component, {}, []) as VnodeComponentInterface;\n }\n\n mainVnode = hidrateDomToVnode(container) as VnodeWithDom;\n return update();\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["value", "directive", "i", "oldVnode", "oldChild"]
7
7
  }
package/dist/index.min.js CHANGED
@@ -1 +1 @@
1
- (()=>{var e=Boolean("undefined"!=typeof process&&process.versions&&process.versions.node),n=class{constructor(e,n,o,t,s,r,i,d,l,c,p){this.tag=e,this.props=n,this.children=o,this.dom=t,this.isSVG=s,this.directComponents=r,this.hasKeys=i,this.oncreate=d,this.oncleanup=l,this.onupdate=c,this.onremove=p}},o=e=>Boolean(e&&"object"==typeof e&&"view"in e),t=e=>Boolean("function"==typeof e||o(e)),s=e=>e instanceof n,r=e=>s(e)&&t(e.tag);function i(e,o,...t){return new n(e,o,t)}function d(e){if(3===e.nodeType)return e.nodeValue;if(1===e.nodeType){const o=e.nodeName.toLowerCase(),t={},s=[];for(let n=0,o=e.childNodes.length;n<o;n++){const o=e.childNodes[n];if(3===o.nodeType)s.push(o.nodeValue);else if(1===o.nodeType){const e=d(o);s.push(e)}}const r=e.attributes;for(let e=0,n=r.length;e<n;e++){const n=r[e];t[n.nodeName]=n.nodeValue}const i=new n(o,t,s);return i.dom=e,e.vnode=i,i.isSVG="svg"===o,i}}function l(e){const n=document.createElement("div");return n.innerHTML=e.trim(),Array.from(n.childNodes).map(d)}i.fragment=(e,...n)=>n;var c=null,p=null,a=!1,u={oldVnode:null,vnode:null,component:null,event:null},f=new Set(["key","state","v-keep","v-text","v-if","v-for","v-show","v-class","v-html","v-model","v-create","v-update","v-cleanup"]);function v(e,n,o){o[n]=o[n]||new Set,o[n].add(()=>{const n=e();"function"==typeof n&&(o.oncleanup=o.oncleanup||new Set,o.oncleanup.add(n))})}function m(){if(!u.vnode)throw new Error("This function must be called inside a component")}var h=e=>{if(e){for(const n of e)n();e.clear()}},y={"v-create":(e,n,o)=>{o||v(()=>e(n),"oncreate",u.vnode)},"v-update":(e,n,o)=>{o&&v(()=>e(n,o),"onupdate",u.vnode)},"v-remove":(e,n)=>{let o=u.vnode,t=n;for(;o&&(o.onremove=o.onremove||new Set,v(()=>{n.dom.vnode&&!t.dom.parentNode&&(e(n),n.dom.vnode=null)},"onremove",o),o.dom.parentElement);)t=o,o=o.dom.parentElement.vnode},"v-cleanup":(e,n)=>{v(()=>e(n),"oncleanup",u.vnode)},"v-if":(e,n)=>{if(!Boolean(e)){const e=n.dom?.parentNode;return e&&e.replaceChild(document.createTextNode(""),n.dom),!1}},"v-show":(e,n)=>{const o=Boolean(e);n.dom.style.display=o?"":"none"},"v-html":(e,n)=>{n.children=l(e)},"v-model":(e,n)=>{if("name"in n.props==!1)return;let o;const t=n.props.name;let s="oninput",r=n=>e[t]=n.target.value;if("input"===n.tag)switch(n.props.type){case"checkbox":Array.isArray(e[t])?(r=n=>{const o=n.target.value,s=e[t].indexOf(o);-1===s?e[t].push(o):e[t].splice(s,1)},o=-1!==e[t].indexOf(n.dom.value)):"value"in n.props?(r=()=>{e[t]===n.props.value?e[t]=null:e[t]=n.props.value},o=e[t]===n.props.value):(r=()=>e[t]=!e[t],o=e[t]),N("checked",o,n);break;case"radio":N("checked",e[t]===n.dom.value,n);break;default:N("value",e[t],n)}else"select"===n.tag?(s="onclick",n.props.multiple?(r=n=>{const o=n.target.value;if(n.ctrlKey){const n=e[t].indexOf(o);-1===n?e[t].push(o):e[t].splice(n,1)}else e[t].splice(0,e[t].length),e[t].push(o)},n.children.forEach(n=>{if("option"===n.tag){const o="value"in n.props?n.props.value:n.children.join("").trim();n.props.selected=-1!==e[t].indexOf(o)}})):n.children.forEach(n=>{if("option"===n.tag){const o="value"in n.props?n.props.value:n.children.join("").trim();n.props.selected=o===e[t]}})):"textarea"===n.tag&&(n.children=[e[t]]);const i=n.props[s];N(s,e=>{r(e),i&&i(e)},n)},"v-class":(e,n)=>{if("string"==typeof e)n.dom.className=e;else if(Array.isArray(e))n.dom.className=e.join(" ");else if("object"==typeof e){const o=n.dom.classList;for(const n in e){const t="function"==typeof e[n]?e[n]():e[n];o.toggle(n,t)}}},class(e,n){if(n.dom.className!==e){if(n.isSVG)return void n.dom.setAttribute("class",e);n.dom.className=e}},className(e,n){y.class(e,n)},id:(e,n)=>{if(n.dom.id!==e){if(n.isSVG)return void n.dom.setAttribute("id",e);n.dom.id=e}},style:(e,n)=>{if("string"==typeof e){if(n.isSVG)return void n.dom.setAttribute("style",e);n.dom.style=e}else if("object"==typeof e){n.isSVG?n.dom.setAttribute("style",""):n.dom.style="";const o=n.dom.style;for(const n in e)o[n]=e[n]}}};var g,C=new Set;function V(e){u.event=e;let n=e.target;const o=`on${e.type}`;for(;n;){const t=n.vnode;if(t&&t.props[o])return t.props[o](e,t),void(e.defaultPrevented||G());n=n.parentNode}u.event=null}function w(e,n,o){const t=o.dom;"function"!=typeof n?o.isSVG||!(e in t)?!1===n?t.removeAttribute(e):t.setAttribute(e,n):t[e]=n:C.has(e)||(p.dom.addEventListener(e.slice(2),V),C.add(e))}function N(e,n,o){f.has(e)||(o.props[e]=n,w(e,n,o))}function x(e,n){const o=e.dom,t=e.props;if(o.vnode=e,n)for(const s in n.props)s in t!=!1||C.has(s)||f.has(s)||(!e.isSVG&&s in o?o[s]=null:o.removeAttribute(s));for(const o in t)if(y[o]){if(!1===y[o](t[o],e,n?.props))break}else f.has(o)||w(o,t[o],e)}function b(e,n){return n?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}function S(e){let t,s=0;if("v-for"in e.props==!1)t=[...e.children];else{t=[];const n=e.props["v-for"],o=n.length,s=e.children[0];if("function"!=typeof s)return console.warn("v-for directive must have a callback function as children"),t;for(let e=0;e<o;e++)t[e]=s(n[e],e)}for(e.directComponents&&e.directComponents.clear();s<t.length;){const r=t[s];if(null!=r)if(Array.isArray(r))t.splice(s,1,...r);else{if(r instanceof n){if(r.props=r.props||{},r.isSVG=e.isSVG||"svg"===r.tag,"string"!=typeof r.tag){const n=u.component=r.tag;e.directComponents=e.directComponents||new Set,e.directComponents.add(n),t[s]=(o(n)?n.view:n).bind(n)(r.props,r.children);continue}e.hasKeys=e.hasKeys||"key"in r.props}s++}else t.splice(s,1)}return t}function k(e,o,t){if(t?(e.dom=b(e.tag,e.isSVG),o.dom.replaceChild(e.dom,t)):e.dom=o.dom.appendChild(b(e.tag,e.isSVG)),x(e),"v-text"in e.props)return void(e.dom.textContent=e.props["v-text"]);u.oldVnode=null,u.vnode=e;const s=S(e);if(0!==s.length)for(let o=0,t=s.length;o<t;o++)s[o]instanceof n!=!1?k(s[o],e):e.dom.appendChild(document.createTextNode(s[o]));else e.dom.textContent=""}function A(e,o){u.oldVnode=o,u.vnode=e;const t=S(e),s=e.dom;if(0===t.length)return void(s.childNodes.length&&(s.textContent=""));const r=s.childNodes,i=r.length,d=t.length;if(0===i){for(let o=0;o<d;o++){const r=t[o];r instanceof n!=!1?k(r,e):s.appendChild(document.createTextNode(r))}return void(e.oncreate&&h(e.oncreate))}let l=r;const c={};if(e.hasKeys){const e=[];for(let n=0,o=l.length;n<o;n++){e[n]=l[n];const o=l[n].vnode;c[o&&"key"in o.props!=!1?o.props.key:n]=n}l=e}for(let o=0,i=t.length;o<i;o++){const i=t[o];if(i instanceof n==!1){const e=l[o];if(!e){s.appendChild(document.createTextNode(i));continue}if(3!==e.nodeType){s.replaceChild(document.createTextNode(i),e);continue}e.nodeValue!=i&&(e.nodeValue=i);continue}const d=l[e.hasKeys?c[i.props.key||o]:o];if(!d||i.tag!==d.nodeName.toLowerCase()){k(i,e,r[o]);continue}i.dom=d;const p=r[o],a=d.vnode;if(p?p!==d&&s.replaceChild(d,p):s.appendChild(d),"v-keep"in i.props&&a){if(a.props["v-keep"]===i.props["v-keep"])continue;const e=r[o+1]?.vnode?.props;if(e&&"key"in e==!1&&e["v-keep"]===i.props["v-keep"]){d.remove(),l.splice(o,1);continue}}x(i,a),"v-text"in i.props?d.textContent!=i.props["v-text"]&&(d.textContent=i.props["v-text"]):(h(a?.oncleanup),A(i,a||null),h(a?.onremove))}for(let e=r.length,n=t.length;e>n;e--)r[e-1].remove();h(e.oncreate),h(e.onupdate)}function T(e,n=!0){e.props=e.props||{},n&&h(e.oncleanup);const o=e.onremove?new Set(e.onremove):null;u.vnode=e,A(e,n?e:null),h(o),a=!0,u.oldVnode=null,u.vnode=null,u.component=null}function G(){return p&&(p.children=[c],T(p,a),e)?p.dom.innerHTML:""}var E=e?G:()=>requestAnimationFrame(G);var L={Vnode:n,createElement:b,current:u,debouncedUpdate:function(e=42){u.event&&u.event.preventDefault(),clearTimeout(g),g=setTimeout(E,e)},directive:function(e,n){const o=`v-${e}`;y[o]=n,f.add(o)},directives:y,hidrateDomToVnode:d,isComponent:t,isNodeJs:e,isPOJOComponent:o,isVnode:s,isVnodeComponent:r,mount:function(n,o){const s="string"==typeof n?e?b(n,"svg"===n):document.querySelector(n):n;return c=t(o)?i(o,{},[]):r(o)?o:i(()=>o,{},[]),p=d(s),G()},onCleanup:e=>{m(),v(e,"oncleanup",u.vnode)},onCreate:e=>{m(),u.oldVnode||v(e,"oncreate",u.vnode)},onRemove:e=>{m();const n=u.vnode,o=u.component;let t=!1;v(function(){n.directComponents&&n.directComponents.has(o)||t||(t=!0,e())},"onremove",u.vnode)},onUpdate:e=>{m(),u.oldVnode&&v(e,"onupdate",u.vnode)},reservedProps:f,setAttribute:N,setPropNameReserved:function(e){f.add(e)},trust:l,unmount:function(){if(p){c=i(()=>null,{});const e=G();for(const e in C)p.dom.removeEventListener(e.slice(2).toLowerCase(),V),Reflect.deleteProperty(C,e);return h(p.onremove),c=null,p=null,a=!1,u.vnode=null,u.component=null,u.event=null,e}return""},update:G,updateAttributes:x,updateVnode:T,v:i};"undefined"!=typeof module?module.exports=L:self.Valyrian=L})();//# sourceMappingURL=index.min.js.map
1
+ (()=>{var e=Boolean("undefined"!=typeof process&&process.versions&&process.versions.node),n=class{constructor(e,n,o,t,s,i,r,l,d,c,p,a){this.tag=e,this.props=n,this.children=o,this.dom=t,this.isSVG=s,this.oldChildComponents=i,this.childComponents=r,this.hasKeys=l,this.oncreate=d,this.oncleanup=c,this.onupdate=p,this.onremove=a}},o=e=>Boolean(e&&"object"==typeof e&&"view"in e),t=e=>Boolean("function"==typeof e||o(e)),s=e=>e instanceof n,i=e=>s(e)&&t(e.tag);function r(e,o,...t){return new n(e,o,t)}function l(e){if(3===e.nodeType)return e.nodeValue;if(1===e.nodeType){const o=e.nodeName.toLowerCase(),t={},s=[];for(let n=0,o=e.childNodes.length;n<o;n++){const o=e.childNodes[n];if(3===o.nodeType)s.push(o.nodeValue);else if(1===o.nodeType){const e=l(o);s.push(e)}}const i=e.attributes;for(let e=0,n=i.length;e<n;e++){const n=i[e];t[n.nodeName]=n.nodeValue}const r=new n(o,t,s);return r.dom=e,e.vnode=r,r.isSVG="svg"===o,r}}function d(e){const n=document.createElement("div");return n.innerHTML=e.trim(),Array.from(n.childNodes).map(l)}r.fragment=(e,...n)=>n;var c=null,p=null,a=!1,u={oldVnode:null,vnode:null,component:null,event:null},f=new Set(["key","state","v-keep","v-text","v-if","v-for","v-show","v-class","v-html","v-model","v-create","v-update","v-cleanup"]);function m(e,n,o){o[n]=o[n]||new Set,o[n].add(()=>{const n=e();"function"==typeof n&&(o.oncleanup=o.oncleanup||new Set,o.oncleanup.add(n))})}function v(){if(!u.vnode)throw new Error("This function must be called inside a component")}var h=e=>{if(e){for(const n of e)n();e.clear()}},y={"v-create":(e,n,o)=>{o||m(()=>e(n),"oncreate",u.vnode)},"v-update":(e,n,o)=>{o&&m(()=>e(n,o),"onupdate",u.vnode)},"v-remove":(e,n)=>{let o=u.vnode,t=n;for(;o&&(o.onremove=o.onremove||new Set,m(()=>{n.dom.vnode&&!t.dom.parentNode&&(e(n),n.dom.vnode=null)},"onremove",o),o.dom.parentElement);)t=o,o=o.dom.parentElement.vnode},"v-cleanup":(e,n)=>{m(()=>e(n),"oncleanup",u.vnode)},"v-if":(e,n)=>{if(!Boolean(e)){const e=n.dom?.parentNode;return e&&e.replaceChild(document.createTextNode(""),n.dom),!1}},"v-show":(e,n)=>{const o=Boolean(e);n.dom.style.display=o?"":"none"},"v-html":(e,n)=>{n.children=d(e)},"v-model":(e,n)=>{if("name"in n.props==!1)return;let o;const t=n.props.name;let s="oninput",i=n=>e[t]=n.target.value;if("input"===n.tag)switch(n.props.type){case"checkbox":Array.isArray(e[t])?(i=n=>{const o=n.target.value,s=e[t].indexOf(o);-1===s?e[t].push(o):e[t].splice(s,1)},o=-1!==e[t].indexOf(n.dom.value)):"value"in n.props?(i=()=>{e[t]===n.props.value?e[t]=null:e[t]=n.props.value},o=e[t]===n.props.value):(i=()=>e[t]=!e[t],o=e[t]),N("checked",o,n);break;case"radio":N("checked",e[t]===n.dom.value,n);break;default:N("value",e[t],n)}else"select"===n.tag?(s="onclick",n.props.multiple?(i=n=>{const o=n.target.value;if(n.ctrlKey){const n=e[t].indexOf(o);-1===n?e[t].push(o):e[t].splice(n,1)}else e[t].splice(0,e[t].length),e[t].push(o)},n.children.forEach(n=>{if("option"===n.tag){const o="value"in n.props?n.props.value:n.children.join("").trim();n.props.selected=-1!==e[t].indexOf(o)}})):n.children.forEach(n=>{if("option"===n.tag){const o="value"in n.props?n.props.value:n.children.join("").trim();n.props.selected=o===e[t]}})):"textarea"===n.tag&&(n.children=[e[t]]);const r=n.props[s];N(s,e=>{i(e),r&&r(e)},n)},"v-class":(e,n)=>{if("string"==typeof e)n.dom.className=e;else if(Array.isArray(e))n.dom.className=e.join(" ");else if("object"==typeof e){const o=n.dom.classList;for(const n in e){const t="function"==typeof e[n]?e[n]():e[n];o.toggle(n,t)}}},class(e,n){if(n.dom.className!==e){if(n.isSVG)return void n.dom.setAttribute("class",e);n.dom.className=e}},className(e,n){y.class(e,n)},id:(e,n)=>{if(n.dom.id!==e){if(n.isSVG)return void n.dom.setAttribute("id",e);n.dom.id=e}},style:(e,n)=>{if("string"==typeof e){if(n.isSVG)return void n.dom.setAttribute("style",e);n.dom.style=e}else if("object"==typeof e){n.isSVG?n.dom.setAttribute("style",""):n.dom.style="";const o=n.dom.style;for(const n in e)o[n]=e[n]}}};var g,C=new Set;function V(e){u.event=e;let n=e.target;const o=`on${e.type}`;for(;n;){const t=n.vnode;if(t&&t.props[o])return t.props[o](e,t),void(e.defaultPrevented||G());n=n.parentNode}u.event=null}function w(e,n,o){const t=o.dom;"function"!=typeof n?o.isSVG||!(e in t)?!1===n?t.removeAttribute(e):t.setAttribute(e,n):t[e]=n:C.has(e)||(p.dom.addEventListener(e.slice(2),V),C.add(e))}function N(e,n,o){f.has(e)||(o.props[e]=n,w(e,n,o))}function x(e,n){const o=e.dom,t=e.props;if(o.vnode=e,n)for(const s in n.props)s in t!=!1||C.has(s)||f.has(s)||(!e.isSVG&&s in o?o[s]=null:o.removeAttribute(s));for(const o in t)if(y[o]){if(!1===y[o](t[o],e,n?.props))break}else f.has(o)||w(o,t[o],e)}function S(e,n){return n?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}function b(e){let t,s=0;if("v-for"in e.props==!1)t=[...e.children];else{t=[];const n=e.props["v-for"],o=n.length,s=e.children[0];if("function"!=typeof s)return console.warn("v-for directive must have a callback function as children"),t;for(let e=0;e<o;e++)t[e]=s(n[e],e)}for(e.oldChildComponents=e.childComponents,e.childComponents&&(e.childComponents=new Set);s<t.length;){const i=t[s];if(null!=i)if(Array.isArray(i))t.splice(s,1,...i);else{if(i instanceof n){if(i.props=i.props||{},i.isSVG=e.isSVG||"svg"===i.tag,"string"!=typeof i.tag){const n=u.component=i.tag;e.childComponents=e.childComponents||new Set,e.childComponents.add(n),t[s]=(o(n)?n.view:n).bind(n)(i.props,i.children);continue}e.hasKeys=e.hasKeys||"key"in i.props}s++}else t.splice(s,1)}return t}function k(e,o,t){if(t?(e.dom=S(e.tag,e.isSVG),o.dom.replaceChild(e.dom,t)):e.dom=o.dom.appendChild(S(e.tag,e.isSVG)),x(e),"v-text"in e.props)return void(e.dom.textContent=e.props["v-text"]);u.oldVnode=null,u.vnode=e;const s=b(e);if(0!==s.length)for(let o=0,t=s.length;o<t;o++)s[o]instanceof n!=!1?k(s[o],e):e.dom.appendChild(document.createTextNode(s[o]));else e.dom.textContent=""}function A(e,o){u.oldVnode=o,u.vnode=e;const t=b(e),s=e.dom;if(0===t.length)return void(s.childNodes.length&&(s.textContent=""));const i=s.childNodes,r=i.length,l=t.length;if(0===r){for(let o=0;o<l;o++){const i=t[o];i instanceof n!=!1?k(i,e):s.appendChild(document.createTextNode(i))}return void(e.oncreate&&h(e.oncreate))}let d=i;const c={};if(e.hasKeys){const e=[];for(let n=0,o=d.length;n<o;n++){e[n]=d[n];const o=d[n].vnode;c[o&&"key"in o.props!=!1?o.props.key:n]=n}d=e}for(let o=0,r=t.length;o<r;o++){const r=t[o];if(r instanceof n==!1){const e=d[o];if(!e){s.appendChild(document.createTextNode(r));continue}if(3!==e.nodeType){s.replaceChild(document.createTextNode(r),e);continue}e.nodeValue!=r&&(e.nodeValue=r);continue}const l=d[e.hasKeys?c[r.props.key||o]:o];if(!l||r.tag!==l.nodeName.toLowerCase()){k(r,e,i[o]);continue}r.dom=l;const p=i[o],a=l.vnode;if(p?p!==l&&s.replaceChild(l,p):s.appendChild(l),"v-keep"in r.props&&a){if(a.props["v-keep"]===r.props["v-keep"])continue;const e=i[o+1]?.vnode?.props;if(e&&"key"in e==!1&&e["v-keep"]===r.props["v-keep"]){l.remove(),d.splice(o,1);continue}}x(r,a),"v-text"in r.props?l.textContent!=r.props["v-text"]&&(l.textContent=r.props["v-text"]):(h(a?.oncleanup),A(r,a||null),h(a?.onremove))}for(let e=i.length,n=t.length;e>n;e--)i[e-1].remove();h(e.oncreate),h(e.onupdate)}function T(e,n=!0){e.props=e.props||{},n&&h(e.oncleanup);const o=e.onremove?new Set(e.onremove):null;u.vnode=e,A(e,n?e:null),h(o),a=!0,u.oldVnode=null,u.vnode=null,u.component=null}function G(){return p&&(p.children=[c],T(p,a),e)?p.dom.innerHTML:""}var E=e?G:()=>requestAnimationFrame(G);var L={Vnode:n,createElement:S,current:u,debouncedUpdate:function(e=42){u.event&&u.event.preventDefault(),clearTimeout(g),g=setTimeout(E,e)},directive:function(e,n){const o=`v-${e}`;y[o]=n,f.add(o)},directives:y,hidrateDomToVnode:l,isComponent:t,isNodeJs:e,isPOJOComponent:o,isVnode:s,isVnodeComponent:i,mount:function(n,o){const s="string"==typeof n?e?S(n,"svg"===n):document.querySelector(n):n;return c=t(o)?r(o,{},[]):i(o)?o:r(()=>o,{},[]),p=l(s),G()},onCleanup:e=>{v(),m(e,"oncleanup",u.vnode)},onCreate:e=>{v();const n=u.vnode,o=u.component;n.oldChildComponents&&n.oldChildComponents.has(o)||m(e,"oncreate",n)},onRemove:e=>{v();const n=u.vnode,o=u.component;let t=!1;m(function(){n.childComponents&&n.childComponents.has(o)||t||(t=!0,e())},"onremove",u.vnode)},onUpdate:e=>{v();const n=u.vnode,o=u.component;n.childComponents&&n.childComponents.has(o)&&m(e,"onupdate",u.vnode)},reservedProps:f,setAttribute:N,setPropNameReserved:function(e){f.add(e)},trust:d,unmount:function(){if(p){c=r(()=>null,{});const e=G();for(const e in C)p.dom.removeEventListener(e.slice(2).toLowerCase(),V),Reflect.deleteProperty(C,e);return h(p.onremove),c=null,p=null,a=!1,u.vnode=null,u.component=null,u.event=null,e}return""},update:G,updateAttributes:x,updateVnode:T,v:r};"undefined"!=typeof module?module.exports=L:self.Valyrian=L})();//# sourceMappingURL=index.min.js.map
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc05vZGVKcyIsIkJvb2xlYW4iLCJwcm9jZXNzIiwidmVyc2lvbnMiLCJub2RlIiwiVm5vZGUiLCJjb25zdHJ1Y3RvciIsInRhZyIsInByb3BzIiwiY2hpbGRyZW4iLCJkb20iLCJpc1NWRyIsImRpcmVjdENvbXBvbmVudHMiLCJoYXNLZXlzIiwib25jcmVhdGUiLCJvbmNsZWFudXAiLCJvbnVwZGF0ZSIsIm9ucmVtb3ZlIiwidGhpcyIsImlzUE9KT0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzQ29tcG9uZW50IiwiaXNWbm9kZSIsIm9iamVjdCIsImlzVm5vZGVDb21wb25lbnQiLCJ2IiwidGFnT3JDb21wb25lbnQiLCJoaWRyYXRlRG9tVG9Wbm9kZSIsIm5vZGVUeXBlIiwibm9kZVZhbHVlIiwibm9kZU5hbWUiLCJ0b0xvd2VyQ2FzZSIsImkiLCJsIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkRG9tIiwicHVzaCIsImNoaWxkVm5vZGUiLCJhdHRyaWJ1dGVzIiwiYXR0ciIsInZub2RlIiwidHJ1c3QiLCJodG1sU3RyaW5nIiwiZGl2IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwidHJpbSIsIkFycmF5IiwiZnJvbSIsIm1hcCIsImZyYWdtZW50IiwiXyIsIm1haW5Db21wb25lbnQiLCJtYWluVm5vZGUiLCJpc01vdW50ZWQiLCJjdXJyZW50Iiwib2xkVm5vZGUiLCJldmVudCIsInJlc2VydmVkUHJvcHMiLCJTZXQiLCJhZGRDYWxsYmFja1RvU2V0IiwiY2FsbGJhY2siLCJzZXRUeXBlIiwiYWRkIiwiY2xlYW51cCIsInZhbGlkYXRlSXNDYWxsZWRJbnNpZGVDb21wb25lbnQiLCJFcnJvciIsImNhbGxTZXQiLCJzZXQiLCJjbGVhciIsImRpcmVjdGl2ZXMiLCJvbGRQcm9wcyIsInBhcmVudFZub2RlIiwiY3VycmVudENoaWxkVm5vZGUiLCJwYXJlbnROb2RlIiwicGFyZW50RWxlbWVudCIsInZhbHVlIiwicmVwbGFjZUNoaWxkIiwiY3JlYXRlVGV4dE5vZGUiLCJib29sIiwic3R5bGUiLCJkaXNwbGF5IiwibW9kZWwiLCJwcm9wZXJ0eSIsIm5hbWUiLCJoYW5kbGVyIiwiZSIsInRhcmdldCIsInR5cGUiLCJpc0FycmF5IiwidmFsIiwiaWR4IiwiaW5kZXhPZiIsInNwbGljZSIsInNldEF0dHJpYnV0ZSIsIm11bHRpcGxlIiwiY3RybEtleSIsImZvckVhY2giLCJjaGlsZCIsImpvaW4iLCJzZWxlY3RlZCIsInByZXZIYW5kbGVyIiwiY2xhc3NOYW1lIiwiY2xhc3NMaXN0IiwidG9nZ2xlIiwiY2xhc3MiLCJpZCIsImRvbVN0eWxlIiwiZGVib3VuY2VkVXBkYXRlVGltZW91dCIsImV2ZW50TGlzdGVuZXJOYW1lcyIsImV2ZW50TGlzdGVuZXIiLCJkZWZhdWx0UHJldmVudGVkIiwidXBkYXRlIiwic2hhcmVkU2V0QXR0cmlidXRlIiwibmV3Vm5vZGUiLCJuZXdWbm9kZURvbSIsInJlbW92ZUF0dHJpYnV0ZSIsImhhcyIsImFkZEV2ZW50TGlzdGVuZXIiLCJzbGljZSIsInVwZGF0ZUF0dHJpYnV0ZXMiLCJ2bm9kZURvbSIsInZub2RlUHJvcHMiLCJjcmVhdGVFbGVtZW50TlMiLCJmbGF0VHJlZSIsImNvbnNvbGUiLCJ3YXJuIiwibmV3Q2hpbGQiLCJ2aWV3IiwiYmluZCIsInByb2Nlc3NOZXdDaGlsZCIsIm9sZERvbSIsImFwcGVuZENoaWxkIiwidGV4dENvbnRlbnQiLCJwYXRjaCIsIm9sZENoaWxkcmVuTGVuZ3RoIiwiY2hpbGRyZW5MZW5ndGgiLCJvbGRUcmVlIiwib2xkS2V5ZWRMaXN0IiwibmV3T2xkVHJlZSIsImtleSIsIm9sZENoaWxkIiwiY3VycmVudENoaWxkIiwib2xkQ2hpbGRWbm9kZSIsInJlbW92ZSIsInVwZGF0ZVZub2RlIiwic2hvdWxkQ2xlYW51cCIsIm9sZE9uUmVtb3ZlU2V0IiwiZGVib3VuY2VkVXBkYXRlTWV0aG9kIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwidGltZW91dCIsInByZXZlbnREZWZhdWx0IiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImRpcmVjdGl2ZSIsImRpcmVjdGl2ZU5hbWUiLCJjb250YWluZXIiLCJxdWVyeVNlbGVjdG9yIiwicmVtb3ZlZCIsInJlc3VsdCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgdmFyIGRvY3VtZW50OiBEb2N1bWVudDtcbiAgbmFtZXNwYWNlIEpTWCB7XG4gICAgaW50ZXJmYWNlIEludHJpbnNpY0VsZW1lbnRzIGV4dGVuZHMgRGVmYXVsdFJlY29yZCB7fVxuICAgIHR5cGUgRWxlbWVudCA9IFJldHVyblR5cGU8XG4gICAgICB0eXBlb2YgdiB8ICgoLi4uYXJnczogYW55KSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkIHwgYm9vbGVhbiB8IFByb21pc2U8YW55PilcbiAgICA+O1xuICAgIHR5cGUgQ29tcG9uZW50UmV0dXJuVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQgfCBib29sZWFuIHwgRWxlbWVudCB8IEVsZW1lbnRbXTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgRGVmYXVsdFJlY29yZCBleHRlbmRzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIGFueT4ge31cblxuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0aWVzIGV4dGVuZHMgRGVmYXVsdFJlY29yZCB7XG4gIGtleT86IHN0cmluZyB8IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb21FbGVtZW50IGV4dGVuZHMgRWxlbWVudCwgRGVmYXVsdFJlY29yZCB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCBleHRlbmRzIERlZmF1bHRSZWNvcmQge1xuICAocHJvcHM6IFByb3BlcnRpZXMsIGNoaWxkcmVuOiBhbnlbXSk6IFZub2RlIHwgYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBPSk9Db21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0UmVjb3JkIHtcbiAgdmlldzogQ29tcG9uZW50O1xufVxuXG5leHBvcnQgdHlwZSBWYWx5cmlhbkNvbXBvbmVudCA9IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgZXh0ZW5kcyBWbm9kZSB7XG4gIHRhZzogVmFseXJpYW5Db21wb25lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRyZW4gZXh0ZW5kcyBBcnJheTxWbm9kZSB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIHwgVmFseXJpYW5Db21wb25lbnQgfCBhbnk+IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0aXZlIHtcbiAgKHZhbHVlOiBhbnksIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFByb3BzPzogUHJvcGVydGllcyk6IGZhbHNlIHwgdm9pZCB8IGFueTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzTm9kZUpzID0gQm9vbGVhbih0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZSk7XG5cbmV4cG9ydCBjbGFzcyBWbm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0YWc6IHN0cmluZyB8IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQsXG4gICAgcHVibGljIHByb3BzOiBudWxsIHwgUHJvcGVydGllcyxcbiAgICBwdWJsaWMgY2hpbGRyZW46IENoaWxkcmVuLFxuICAgIHB1YmxpYyBkb20/OiBEb21FbGVtZW50LFxuICAgIHB1YmxpYyBpc1NWRz86IGJvb2xlYW4sXG4gICAgcHVibGljIGRpcmVjdENvbXBvbmVudHM/OiBTZXQ8VmFseXJpYW5Db21wb25lbnQ+LFxuICAgIHB1YmxpYyBoYXNLZXlzPzogYm9vbGVhbixcbiAgICBwdWJsaWMgb25jcmVhdGU/OiBTZXQ8RnVuY3Rpb24+LFxuICAgIHB1YmxpYyBvbmNsZWFudXA/OiBTZXQ8RnVuY3Rpb24+LFxuICAgIHB1YmxpYyBvbnVwZGF0ZT86IFNldDxGdW5jdGlvbj4sXG4gICAgcHVibGljIG9ucmVtb3ZlPzogU2V0PEZ1bmN0aW9uPlxuICApIHt9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm5vZGVXaXRoRG9tIGV4dGVuZHMgVm5vZGUge1xuICB0YWc6IHN0cmluZztcbiAgZG9tOiBEb21FbGVtZW50O1xuICBwcm9wczogUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IGlzUE9KT0NvbXBvbmVudCA9IChjb21wb25lbnQ6IHVua25vd24pOiBjb21wb25lbnQgaXMgUE9KT0NvbXBvbmVudCA9PlxuICBCb29sZWFuKGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIFwidmlld1wiIGluIGNvbXBvbmVudCk7XG5cbmV4cG9ydCBjb25zdCBpc0NvbXBvbmVudCA9IChjb21wb25lbnQ6IHVua25vd24pOiBjb21wb25lbnQgaXMgQ29tcG9uZW50ID0+XG4gIEJvb2xlYW4odHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiIHx8IGlzUE9KT0NvbXBvbmVudChjb21wb25lbnQpKTtcbmV4cG9ydCBjb25zdCBpc1Zub2RlID0gKG9iamVjdD86IHVua25vd24pOiBvYmplY3QgaXMgVm5vZGUgPT4gb2JqZWN0IGluc3RhbmNlb2YgVm5vZGU7XG5cbmV4cG9ydCBjb25zdCBpc1Zub2RlQ29tcG9uZW50ID0gKG9iamVjdD86IHVua25vd24pOiBvYmplY3QgaXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgPT4ge1xuICByZXR1cm4gaXNWbm9kZShvYmplY3QpICYmIGlzQ29tcG9uZW50KG9iamVjdC50YWcpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHYodGFnT3JDb21wb25lbnQ6IHN0cmluZyB8IFZhbHlyaWFuQ29tcG9uZW50LCBwcm9wczogUHJvcGVydGllcyB8IG51bGwsIC4uLmNoaWxkcmVuOiBDaGlsZHJlbikge1xuICByZXR1cm4gbmV3IFZub2RlKHRhZ09yQ29tcG9uZW50LCBwcm9wcywgY2hpbGRyZW4pO1xufVxuXG52LmZyYWdtZW50ID0gKF86IFByb3BlcnRpZXMsIC4uLmNoaWxkcmVuOiBDaGlsZHJlbikgPT4gY2hpbGRyZW47XG5cbmV4cG9ydCBmdW5jdGlvbiBoaWRyYXRlRG9tVG9Wbm9kZShkb206IGFueSk6IFZub2RlV2l0aERvbSB8IHZvaWQge1xuICBpZiAoZG9tLm5vZGVUeXBlID09PSAzKSB7XG4gICAgcmV0dXJuIGRvbS5ub2RlVmFsdWU7XG4gIH1cblxuICBpZiAoZG9tLm5vZGVUeXBlID09PSAxKSB7XG4gICAgY29uc3QgdGFnID0gZG9tLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgcHJvcHMgPSB7fSBhcyBQcm9wZXJ0aWVzO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gW10gYXMgQ2hpbGRyZW47XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGREb20gPSBkb20uY2hpbGROb2Rlc1tpXTtcbiAgICAgIGlmIChjaGlsZERvbS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkRG9tLm5vZGVWYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkRG9tLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkVm5vZGUgPSBoaWRyYXRlRG9tVG9Wbm9kZShjaGlsZERvbSk7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRWbm9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGRvbS5hdHRyaWJ1dGVzO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gYXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBhdHRyaWJ1dGVzW2ldO1xuICAgICAgcHJvcHNbYXR0ci5ub2RlTmFtZV0gPSBhdHRyLm5vZGVWYWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB2bm9kZSA9IG5ldyBWbm9kZSh0YWcsIHByb3BzLCBjaGlsZHJlbik7XG4gICAgdm5vZGUuZG9tID0gZG9tO1xuICAgIGRvbS52bm9kZSA9IHZub2RlO1xuICAgIHZub2RlLmlzU1ZHID0gdGFnID09PSBcInN2Z1wiO1xuICAgIHJldHVybiB2bm9kZSBhcyBWbm9kZVdpdGhEb207XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRydXN0KGh0bWxTdHJpbmc6IHN0cmluZykge1xuICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBkaXYuaW5uZXJIVE1MID0gaHRtbFN0cmluZy50cmltKCk7XG4gIHJldHVybiBBcnJheS5mcm9tKGRpdi5jaGlsZE5vZGVzKS5tYXAoaGlkcmF0ZURvbVRvVm5vZGUpO1xufVxuXG5sZXQgbWFpbkNvbXBvbmVudDogVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcbmxldCBtYWluVm5vZGU6IFZub2RlV2l0aERvbSB8IG51bGwgPSBudWxsO1xubGV0IGlzTW91bnRlZCA9IGZhbHNlO1xuXG5leHBvcnQgY29uc3QgY3VycmVudCA9IHtcbiAgb2xkVm5vZGU6IG51bGwgYXMgVm5vZGUgfCBudWxsLFxuICB2bm9kZTogbnVsbCBhcyBWbm9kZSB8IG51bGwsXG4gIGNvbXBvbmVudDogbnVsbCBhcyBWYWx5cmlhbkNvbXBvbmVudCB8IG51bGwsXG4gIGV2ZW50OiBudWxsIGFzIEV2ZW50IHwgbnVsbFxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2VydmVkUHJvcHMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICBcImtleVwiLFxuICBcInN0YXRlXCIsXG4gIFwidi1rZWVwXCIsXG4gIFwidi10ZXh0XCIsXG4gIFwidi1pZlwiLFxuICBcInYtZm9yXCIsXG4gIFwidi1zaG93XCIsXG4gIFwidi1jbGFzc1wiLFxuICBcInYtaHRtbFwiLFxuICBcInYtbW9kZWxcIixcbiAgXCJ2LWNyZWF0ZVwiLFxuICBcInYtdXBkYXRlXCIsXG4gIFwidi1jbGVhbnVwXCJcbl0pO1xuXG5lbnVtIFNldFR5cGUge1xuICBvbkNyZWF0ZSA9IFwib25jcmVhdGVcIixcbiAgb25VcGRhdGUgPSBcIm9udXBkYXRlXCIsXG4gIG9uQ2xlYW51cCA9IFwib25jbGVhbnVwXCIsXG4gIG9uUmVtb3ZlID0gXCJvbnJlbW92ZVwiXG59XG5cbmZ1bmN0aW9uIGFkZENhbGxiYWNrVG9TZXQoY2FsbGJhY2s6IEZ1bmN0aW9uLCBzZXRUeXBlOiBTZXRUeXBlLCB2bm9kZTogVm5vZGVXaXRoRG9tKSB7XG4gIHZub2RlW3NldFR5cGVdID0gdm5vZGVbc2V0VHlwZV0gfHwgbmV3IFNldCgpO1xuICB2bm9kZVtzZXRUeXBlXS5hZGQoKCkgPT4ge1xuICAgIGNvbnN0IGNsZWFudXAgPSBjYWxsYmFjaygpO1xuICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB2bm9kZVtTZXRUeXBlLm9uQ2xlYW51cF0gPSB2bm9kZVtTZXRUeXBlLm9uQ2xlYW51cF0gfHwgbmV3IFNldCgpO1xuICAgICAgdm5vZGVbU2V0VHlwZS5vbkNsZWFudXBdLmFkZChjbGVhbnVwKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUlzQ2FsbGVkSW5zaWRlQ29tcG9uZW50KCkge1xuICBpZiAoIWN1cnJlbnQudm5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluc2lkZSBhIGNvbXBvbmVudFwiKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb25DcmVhdGUgPSAoY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB7XG4gIHZhbGlkYXRlSXNDYWxsZWRJbnNpZGVDb21wb25lbnQoKTtcbiAgaWYgKCFjdXJyZW50Lm9sZFZub2RlKSB7XG4gICAgYWRkQ2FsbGJhY2tUb1NldChjYWxsYmFjaywgU2V0VHlwZS5vbkNyZWF0ZSwgY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb20pO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IG9uVXBkYXRlID0gKGNhbGxiYWNrOiBGdW5jdGlvbikgPT4ge1xuICB2YWxpZGF0ZUlzQ2FsbGVkSW5zaWRlQ29tcG9uZW50KCk7XG4gIGlmIChjdXJyZW50Lm9sZFZub2RlKSB7XG4gICAgYWRkQ2FsbGJhY2tUb1NldChjYWxsYmFjaywgU2V0VHlwZS5vblVwZGF0ZSwgY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb20pO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IG9uQ2xlYW51cCA9IChjYWxsYmFjazogRnVuY3Rpb24pID0+IHtcbiAgdmFsaWRhdGVJc0NhbGxlZEluc2lkZUNvbXBvbmVudCgpO1xuICBhZGRDYWxsYmFja1RvU2V0KGNhbGxiYWNrLCBTZXRUeXBlLm9uQ2xlYW51cCwgY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb20pO1xufTtcbmV4cG9ydCBjb25zdCBvblJlbW92ZSA9IChjYWxsYmFjazogRnVuY3Rpb24pID0+IHtcbiAgdmFsaWRhdGVJc0NhbGxlZEluc2lkZUNvbXBvbmVudCgpO1xuXG4gIGNvbnN0IHBhcmVudFZub2RlID0gY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb207XG4gIGNvbnN0IGNvbXBvbmVudCA9IGN1cnJlbnQuY29tcG9uZW50IGFzIFZhbHlyaWFuQ29tcG9uZW50O1xuICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHJlbW92ZUNhbGxiYWNrKCkge1xuICAgIGNvbnN0IGhhc0NvbXBvbmVudEFzQ2hpbGQgPSBwYXJlbnRWbm9kZS5kaXJlY3RDb21wb25lbnRzICYmIHBhcmVudFZub2RlLmRpcmVjdENvbXBvbmVudHMuaGFzKGNvbXBvbmVudCk7XG5cbiAgICBpZiAoaGFzQ29tcG9uZW50QXNDaGlsZCB8fCByZW1vdmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVtb3ZlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIGFkZENhbGxiYWNrVG9TZXQocmVtb3ZlQ2FsbGJhY2ssIFNldFR5cGUub25SZW1vdmUsIGN1cnJlbnQudm5vZGUgYXMgVm5vZGVXaXRoRG9tKTtcbn07XG5jb25zdCBjYWxsU2V0ID0gKHNldD86IFNldDxGdW5jdGlvbj4gfCBudWxsKSA9PiB7XG4gIGlmICghc2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoY29uc3QgY2FsbGJhY2sgb2Ygc2V0KSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuICBzZXQuY2xlYXIoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkaXJlY3RpdmVzOiBSZWNvcmQ8c3RyaW5nLCBEaXJlY3RpdmU+ID0ge1xuICBcInYtY3JlYXRlXCI6IChjYWxsYmFjaywgY2hpbGRWbm9kZSwgb2xkUHJvcHMpID0+IHtcbiAgICBpZiAoIW9sZFByb3BzKSB7XG4gICAgICBhZGRDYWxsYmFja1RvU2V0KCgpID0+IGNhbGxiYWNrKGNoaWxkVm5vZGUpLCBTZXRUeXBlLm9uQ3JlYXRlLCBjdXJyZW50LnZub2RlIGFzIFZub2RlV2l0aERvbSk7XG4gICAgfVxuICB9LFxuXG4gIFwidi11cGRhdGVcIjogKGNhbGxiYWNrLCBjaGlsZFZub2RlLCBvbGRQcm9wcykgPT4ge1xuICAgIGlmIChvbGRQcm9wcykge1xuICAgICAgYWRkQ2FsbGJhY2tUb1NldCgoKSA9PiBjYWxsYmFjayhjaGlsZFZub2RlLCBvbGRQcm9wcyksIFNldFR5cGUub25VcGRhdGUsIGN1cnJlbnQudm5vZGUgYXMgVm5vZGVXaXRoRG9tKTtcbiAgICB9XG4gIH0sXG5cbiAgXCJ2LXJlbW92ZVwiOiAoY2FsbGJhY2ssIGNoaWxkVm5vZGUpID0+IHtcbiAgICBsZXQgcGFyZW50Vm5vZGUgPSBjdXJyZW50LnZub2RlIGFzIFZub2RlV2l0aERvbTtcbiAgICBsZXQgY3VycmVudENoaWxkVm5vZGUgPSBjaGlsZFZub2RlIGFzIFZub2RlV2l0aERvbTtcbiAgICB3aGlsZSAocGFyZW50Vm5vZGUpIHtcbiAgICAgIHBhcmVudFZub2RlLm9ucmVtb3ZlID0gcGFyZW50Vm5vZGUub25yZW1vdmUgfHwgbmV3IFNldCgpO1xuICAgICAgYWRkQ2FsbGJhY2tUb1NldChcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGlmICghY2hpbGRWbm9kZS5kb20udm5vZGUgfHwgY3VycmVudENoaWxkVm5vZGUuZG9tLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbGJhY2soY2hpbGRWbm9kZSk7XG4gICAgICAgICAgY2hpbGRWbm9kZS5kb20udm5vZGUgPSBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBTZXRUeXBlLm9uUmVtb3ZlLFxuICAgICAgICBwYXJlbnRWbm9kZVxuICAgICAgKTtcblxuICAgICAgaWYgKCFwYXJlbnRWbm9kZS5kb20ucGFyZW50RWxlbWVudCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRDaGlsZFZub2RlID0gcGFyZW50Vm5vZGU7XG4gICAgICBwYXJlbnRWbm9kZSA9IChwYXJlbnRWbm9kZS5kb20ucGFyZW50RWxlbWVudCBhcyBEb21FbGVtZW50KS52bm9kZSBhcyBWbm9kZVdpdGhEb207XG4gICAgfVxuICB9LFxuXG4gIFwidi1jbGVhbnVwXCI6IChjYWxsYmFjaywgdm5vZGUpID0+IHtcbiAgICBhZGRDYWxsYmFja1RvU2V0KCgpID0+IGNhbGxiYWNrKHZub2RlKSwgU2V0VHlwZS5vbkNsZWFudXAsIGN1cnJlbnQudm5vZGUgYXMgVm5vZGVXaXRoRG9tKTtcbiAgfSxcblxuICBcInYtaWZcIjogKHZhbHVlLCB2bm9kZSkgPT4ge1xuICAgIGlmICghQm9vbGVhbih2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB2bm9kZS5kb20/LnBhcmVudE5vZGU7XG4gICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICBwYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKSwgdm5vZGUuZG9tKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcblxuICBcInYtc2hvd1wiOiAodmFsdWUsIHZub2RlKSA9PiB7XG4gICAgY29uc3QgYm9vbCA9IEJvb2xlYW4odmFsdWUpO1xuICAgIChcbiAgICAgIHZub2RlLmRvbSBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgc3R5bGU6IHsgZGlzcGxheTogc3RyaW5nIH07XG4gICAgICB9XG4gICAgKS5zdHlsZS5kaXNwbGF5ID0gYm9vbCA/IFwiXCIgOiBcIm5vbmVcIjtcbiAgfSxcblxuICBcInYtaHRtbFwiOiAodmFsdWUsIHZub2RlKSA9PiB7XG4gICAgdm5vZGUuY2hpbGRyZW4gPSB0cnVzdCh2YWx1ZSBhcyBzdHJpbmcpO1xuICB9LFxuXG4gIC8vIFRoZSBcInYtbW9kZWxcIiBkaXJlY3RpdmUgYmluZHMgdGhlIHZhbHVlIG9mIGFuIGlucHV0IGVsZW1lbnQgdG8gYSBtb2RlbCBwcm9wZXJ0eVxuICBcInYtbW9kZWxcIjogKG1vZGVsLCB2bm9kZSkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBpZiAoXCJuYW1lXCIgaW4gdm5vZGUucHJvcHMgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHZhbHVlO1xuICAgIGNvbnN0IHByb3BlcnR5ID0gdm5vZGUucHJvcHMubmFtZTtcbiAgICBsZXQgZXZlbnQgPSBcIm9uaW5wdXRcIjtcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgbW9kZWwgcHJvcGVydHkgd2hlbiB0aGUgaW5wdXQgZWxlbWVudCdzIHZhbHVlIGNoYW5nZXNcbiAgICBsZXQgaGFuZGxlciA9IChlOiBFdmVudCkgPT4gKG1vZGVsW3Byb3BlcnR5XSA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWUpO1xuICAgIGlmICh2bm9kZS50YWcgPT09IFwiaW5wdXRcIikge1xuICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGlucHV0IGVsZW1lbnQsIHVzZSBhIGRpZmZlcmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICBzd2l0Y2ggKHZub2RlLnByb3BzLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6IHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eV0pKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbW9kZWwgcHJvcGVydHkgaXMgYW4gYXJyYXksIGFkZCBvciByZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIGFycmF5IHdoZW4gdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQgb3IgdW5jaGVja2VkXG4gICAgICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWU7XG4gICAgICAgICAgICAgIGNvbnN0IGlkeCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbCk7XG4gICAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgaW4gdGhlIGFycmF5LCBzZXQgdGhlIGNoZWNrYm94IHRvIGJlIGNoZWNrZWRcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2Yodm5vZGUuZG9tLnZhbHVlKSAhPT0gLTE7XG4gICAgICAgICAgfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gdm5vZGUucHJvcHMpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBlbGVtZW50IGhhcyBhIFwidmFsdWVcIiBhdHRyaWJ1dGUsIHVzZSBpdCB0byBkZXRlcm1pbmUgdGhlIGNoZWNrZWQgc3RhdGVcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldID0gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSB2bm9kZS5wcm9wcy52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5wcm9wcy52YWx1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gXCJ2YWx1ZVwiIGF0dHJpYnV0ZSwgdXNlIGEgYm9vbGVhbiB2YWx1ZSBmb3IgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgICAgICBoYW5kbGVyID0gKCkgPT4gKG1vZGVsW3Byb3BlcnR5XSA9ICFtb2RlbFtwcm9wZXJ0eV0pO1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNldCB0aGUgXCJjaGVja2VkXCIgYXR0cmlidXRlIG9uIHRoZSBpbnB1dCBlbGVtZW50XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB2YWx1ZSwgdm5vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyYWRpb1wiOiB7XG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSByYWRpbyBidXR0b24sIHNldCB0aGUgXCJjaGVja2VkXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUuZG9tLnZhbHVlLCB2bm9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC8vIEZvciBhbGwgb3RoZXIgaW5wdXQgdHlwZXMsIHNldCB0aGUgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgbW9kZWxbcHJvcGVydHldLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZub2RlLnRhZyA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSBzZWxlY3QgZWxlbWVudCwgdXNlIHRoZSBcImNsaWNrXCIgZXZlbnQgYnkgZGVmYXVsdFxuICAgICAgZXZlbnQgPSBcIm9uY2xpY2tcIjtcbiAgICAgIGlmICh2bm9kZS5wcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0IGVsZW1lbnQgYWxsb3dzIG11bHRpcGxlIHNlbGVjdGlvbnMsIHVwZGF0ZSB0aGUgbW9kZWwgcHJvcGVydHkgd2l0aCBhbiBhcnJheSBvZiBzZWxlY3RlZCB2YWx1ZXNcbiAgICAgICAgaGFuZGxlciA9IChlOiBFdmVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlO1xuICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDdHJsIGtleSBpcyBwcmVzc2VkLCBhZGQgb3IgcmVtb3ZlIHRoZSB2YWx1ZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgY29uc3QgaWR4ID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsKTtcbiAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDdHJsIGtleSBpcyBub3QgcHJlc3NlZCwgc2V0IHRoZSBtb2RlbCBwcm9wZXJ0eSB0byBhbiBhcnJheSB3aXRoIHRoZSBzZWxlY3RlZCB2YWx1ZVxuICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnNwbGljZSgwLCBtb2RlbFtwcm9wZXJ0eV0ubGVuZ3RoKTtcbiAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBTZXQgdGhlIFwic2VsZWN0ZWRcIiBhdHRyaWJ1dGUgb24gdGhlIG9wdGlvbnMgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBpbiB0aGUgbW9kZWwgcHJvcGVydHkgYXJyYXlcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gXCJ2YWx1ZVwiIGluIGNoaWxkLnByb3BzID8gY2hpbGQucHJvcHMudmFsdWUgOiBjaGlsZC5jaGlsZHJlbi5qb2luKFwiXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGNoaWxkLnByb3BzLnNlbGVjdGVkID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsdWUpICE9PSAtMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdCBlbGVtZW50IGRvZXMgbm90IGFsbG93IG11bHRpcGxlIHNlbGVjdGlvbnMsIHNldCB0aGUgXCJzZWxlY3RlZFwiIGF0dHJpYnV0ZSBvbiB0aGUgb3B0aW9ucyBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IFwidmFsdWVcIiBpbiBjaGlsZC5wcm9wcyA/IGNoaWxkLnByb3BzLnZhbHVlIDogY2hpbGQuY2hpbGRyZW4uam9pbihcIlwiKS50cmltKCk7XG4gICAgICAgICAgICBjaGlsZC5wcm9wcy5zZWxlY3RlZCA9IHZhbHVlID09PSBtb2RlbFtwcm9wZXJ0eV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZub2RlLnRhZyA9PT0gXCJ0ZXh0YXJlYVwiKSB7XG4gICAgICAvLyBTZXQgdGhlIHRleHRhcmVhJ3MgY29udGVudCB0byB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICB2bm9kZS5jaGlsZHJlbiA9IFttb2RlbFtwcm9wZXJ0eV1dO1xuICAgIH1cblxuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBwcmV2IGhhbmRsZXIgaWYgYW55IHdpbGwgbm90IGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIgYWNyb3NzIHBhdGNoc1xuICAgIGNvbnN0IHByZXZIYW5kbGVyID0gdm5vZGUucHJvcHNbZXZlbnRdO1xuXG4gICAgLy8gU2V0IHRoZSBldmVudCBoYW5kbGVyIG9uIHRoZSBlbGVtZW50XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgc2V0QXR0cmlidXRlKFxuICAgICAgZXZlbnQsXG4gICAgICAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgaGFuZGxlcihlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgaGFuZGxlciBpcyBkZWZpbmVkLCBjYWxsIGl0IGFmdGVyIHRoZSBtb2RlbCBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICAgIGlmIChwcmV2SGFuZGxlcikge1xuICAgICAgICAgIHByZXZIYW5kbGVyKGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdm5vZGVcbiAgICApO1xuICB9LFxuXG4gIFwidi1jbGFzc1wiOiAodmFsdWUsIHZub2RlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdm5vZGUuZG9tLmNsYXNzTmFtZSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZub2RlLmRvbS5jbGFzc05hbWUgPSB2YWx1ZS5qb2luKFwiIFwiKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdm5vZGUuZG9tLmNsYXNzTGlzdDtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCB2YWwgPSB0eXBlb2YgdmFsdWVbbmFtZV0gPT09IFwiZnVuY3Rpb25cIiA/ICh2YWx1ZVtuYW1lXSBhcyBGdW5jdGlvbikoKSA6IHZhbHVlW25hbWVdO1xuICAgICAgICBjbGFzc0xpc3QudG9nZ2xlKG5hbWUsIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIEZyZXF1ZW50IHVzZWQgcHJvcGVydGllc1xuICBjbGFzcyh2YWx1ZSwgdm5vZGUpIHtcbiAgICBpZiAodm5vZGUuZG9tLmNsYXNzTmFtZSAhPT0gdmFsdWUpIHtcbiAgICAgIGlmICh2bm9kZS5pc1NWRykge1xuICAgICAgICB2bm9kZS5kb20uc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2bm9kZS5kb20uY2xhc3NOYW1lID0gdmFsdWU7XG4gICAgfVxuICB9LFxuXG4gIGNsYXNzTmFtZSh2YWx1ZSwgdm5vZGUpIHtcbiAgICBkaXJlY3RpdmVzLmNsYXNzKHZhbHVlLCB2bm9kZSk7XG4gIH0sXG5cbiAgaWQ6ICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICBpZiAodm5vZGUuZG9tLmlkICE9PSB2YWx1ZSkge1xuICAgICAgaWYgKHZub2RlLmlzU1ZHKSB7XG4gICAgICAgIHZub2RlLmRvbS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZub2RlLmRvbS5pZCA9IHZhbHVlO1xuICAgIH1cbiAgfSxcblxuICBzdHlsZTogKHZhbHVlLCB2bm9kZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmICh2bm9kZS5pc1NWRykge1xuICAgICAgICB2bm9kZS5kb20uc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgdmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2bm9kZS5kb20uc3R5bGUgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgaWYgKHZub2RlLmlzU1ZHKSB7XG4gICAgICAgIHZub2RlLmRvbS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcIlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZub2RlLmRvbS5zdHlsZSA9IFwiXCI7XG4gICAgICB9XG4gICAgICBjb25zdCBkb21TdHlsZSA9IHZub2RlLmRvbS5zdHlsZTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBpbiB2YWx1ZSkge1xuICAgICAgICBkb21TdHlsZVtuYW1lXSA9IHZhbHVlW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdGl2ZShuYW1lOiBzdHJpbmcsIGRpcmVjdGl2ZTogRGlyZWN0aXZlKSB7XG4gIGNvbnN0IGRpcmVjdGl2ZU5hbWUgPSBgdi0ke25hbWV9YDtcbiAgZGlyZWN0aXZlc1tkaXJlY3RpdmVOYW1lXSA9IGRpcmVjdGl2ZTtcbiAgcmVzZXJ2ZWRQcm9wcy5hZGQoZGlyZWN0aXZlTmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRQcm9wTmFtZVJlc2VydmVkKG5hbWU6IHN0cmluZykge1xuICByZXNlcnZlZFByb3BzLmFkZChuYW1lKTtcbn1cblxuY29uc3QgZXZlbnRMaXN0ZW5lck5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmZ1bmN0aW9uIGV2ZW50TGlzdGVuZXIoZTogRXZlbnQpIHtcbiAgY3VycmVudC5ldmVudCA9IGU7XG4gIGxldCBkb20gPSBlLnRhcmdldCBhcyBEb21FbGVtZW50O1xuICBjb25zdCBuYW1lID0gYG9uJHtlLnR5cGV9YDtcblxuICB3aGlsZSAoZG9tKSB7XG4gICAgY29uc3Qgb2xkVm5vZGUgPSBkb20udm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICAgIGlmIChvbGRWbm9kZSAmJiBvbGRWbm9kZS5wcm9wc1tuYW1lXSkge1xuICAgICAgb2xkVm5vZGUucHJvcHNbbmFtZV0oZSwgb2xkVm5vZGUpO1xuXG4gICAgICBpZiAoIWUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgdXBkYXRlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvbSA9IGRvbS5wYXJlbnROb2RlIGFzIERvbUVsZW1lbnQ7XG4gIH1cblxuICBjdXJyZW50LmV2ZW50ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2hhcmVkU2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgbmV3Vm5vZGU6IFZub2RlV2l0aERvbSk6IHZvaWQgfCBib29sZWFuIHtcbiAgY29uc3QgbmV3Vm5vZGVEb20gPSBuZXdWbm9kZS5kb207XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGlmICghZXZlbnRMaXN0ZW5lck5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgLy8gV2UgYXR0YWNoIHRoZSBkZWxlZ2F0ZWQgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG1haW4gdm5vZGUgZG9tIGVsZW1lbnQsIHdoaWNoIGlzIHRoZSByb290IG9mIHRoZSBjb21wb25lbnRcbiAgICAgIChtYWluVm5vZGUgYXMgVm5vZGVXaXRoRG9tKS5kb20uYWRkRXZlbnRMaXN0ZW5lcihuYW1lLnNsaWNlKDIpLCBldmVudExpc3RlbmVyKTtcbiAgICAgIGV2ZW50TGlzdGVuZXJOYW1lcy5hZGQobmFtZSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghbmV3Vm5vZGUuaXNTVkcgJiYgbmFtZSBpbiBuZXdWbm9kZURvbSkge1xuICAgIG5ld1Zub2RlRG9tW25hbWVdID0gdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgIG5ld1Zub2RlRG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBuZXdWbm9kZURvbS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBuZXdWbm9kZTogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIGlmICghcmVzZXJ2ZWRQcm9wcy5oYXMobmFtZSkpIHtcbiAgICBuZXdWbm9kZS5wcm9wc1tuYW1lXSA9IHZhbHVlO1xuICAgIHNoYXJlZFNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgbmV3Vm5vZGUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGVzKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIGNvbnN0IHZub2RlRG9tID0gbmV3Vm5vZGUuZG9tO1xuICBjb25zdCB2bm9kZVByb3BzID0gbmV3Vm5vZGUucHJvcHM7XG4gIHZub2RlRG9tLnZub2RlID0gbmV3Vm5vZGU7XG5cbiAgaWYgKG9sZFZub2RlKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIG9sZFZub2RlLnByb3BzKSB7XG4gICAgICBpZiAobmFtZSBpbiB2bm9kZVByb3BzID09PSBmYWxzZSAmJiAhZXZlbnRMaXN0ZW5lck5hbWVzLmhhcyhuYW1lKSAmJiAhcmVzZXJ2ZWRQcm9wcy5oYXMobmFtZSkpIHtcbiAgICAgICAgaWYgKCFuZXdWbm9kZS5pc1NWRyAmJiBuYW1lIGluIHZub2RlRG9tKSB7XG4gICAgICAgICAgdm5vZGVEb21bbmFtZV0gPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZub2RlRG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgbmFtZSBpbiB2bm9kZVByb3BzKSB7XG4gICAgaWYgKGRpcmVjdGl2ZXNbbmFtZV0pIHtcbiAgICAgIGlmIChkaXJlY3RpdmVzW25hbWVdKHZub2RlUHJvcHNbbmFtZV0sIG5ld1Zub2RlLCBvbGRWbm9kZT8ucHJvcHMpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghcmVzZXJ2ZWRQcm9wcy5oYXMobmFtZSkpIHtcbiAgICAgIHNoYXJlZFNldEF0dHJpYnV0ZShuYW1lLCB2bm9kZVByb3BzW25hbWVdLCBuZXdWbm9kZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZzogc3RyaW5nLCBpc1NWRzogYm9vbGVhbik6IERvbUVsZW1lbnQge1xuICByZXR1cm4gaXNTVkdcbiAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHRhZylcbiAgICA6IChkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZykgYXMgRG9tRWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIGZsYXRUcmVlKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20pIHtcbiAgbGV0IGkgPSAwO1xuICBsZXQgY2hpbGRyZW46IENoaWxkcmVuO1xuXG4gIGlmIChcInYtZm9yXCIgaW4gbmV3Vm5vZGUucHJvcHMgPT09IGZhbHNlKSB7XG4gICAgY2hpbGRyZW4gPSBbLi4ubmV3Vm5vZGUuY2hpbGRyZW5dO1xuICB9IGVsc2Uge1xuICAgIGNoaWxkcmVuID0gW107XG4gICAgY29uc3Qgc2V0ID0gbmV3Vm5vZGUucHJvcHNbXCJ2LWZvclwiXTtcbiAgICBjb25zdCBsID0gc2V0Lmxlbmd0aDtcbiAgICBjb25zdCBjYWxsYmFjayA9IG5ld1Zub2RlLmNoaWxkcmVuWzBdO1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJ2LWZvciBkaXJlY3RpdmUgbXVzdCBoYXZlIGEgY2FsbGJhY2sgZnVuY3Rpb24gYXMgY2hpbGRyZW5cIik7XG4gICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNoaWxkcmVuW2ldID0gY2FsbGJhY2soc2V0W2ldLCBpKTtcbiAgICB9XG4gIH1cblxuICBpZiAobmV3Vm5vZGUuZGlyZWN0Q29tcG9uZW50cykge1xuICAgIG5ld1Zub2RlLmRpcmVjdENvbXBvbmVudHMuY2xlYXIoKTtcbiAgfVxuXG4gIHdoaWxlIChpIDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3Q2hpbGQgPSBjaGlsZHJlbltpXTtcblxuICAgIGlmIChuZXdDaGlsZCA9PSBudWxsKSB7XG4gICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdDaGlsZCkpIHtcbiAgICAgIGNoaWxkcmVuLnNwbGljZShpLCAxLCAuLi5uZXdDaGlsZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobmV3Q2hpbGQgaW5zdGFuY2VvZiBWbm9kZSkge1xuICAgICAgbmV3Q2hpbGQucHJvcHMgPSBuZXdDaGlsZC5wcm9wcyB8fCB7fTtcbiAgICAgIG5ld0NoaWxkLmlzU1ZHID0gbmV3Vm5vZGUuaXNTVkcgfHwgbmV3Q2hpbGQudGFnID09PSBcInN2Z1wiO1xuXG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkLnRhZyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSAoY3VycmVudC5jb21wb25lbnQgPSBuZXdDaGlsZC50YWcpO1xuICAgICAgICBuZXdWbm9kZS5kaXJlY3RDb21wb25lbnRzID0gbmV3Vm5vZGUuZGlyZWN0Q29tcG9uZW50cyB8fCBuZXcgU2V0KCk7XG4gICAgICAgIG5ld1Zub2RlLmRpcmVjdENvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7XG5cbiAgICAgICAgY2hpbGRyZW5baV0gPSAoaXNQT0pPQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQudmlldyA6IGNvbXBvbmVudCkuYmluZChjb21wb25lbnQpKFxuICAgICAgICAgIG5ld0NoaWxkLnByb3BzLFxuICAgICAgICAgIG5ld0NoaWxkLmNoaWxkcmVuXG4gICAgICAgICk7XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIG5ld1Zub2RlLmhhc0tleXMgPSBuZXdWbm9kZS5oYXNLZXlzIHx8IFwia2V5XCIgaW4gbmV3Q2hpbGQucHJvcHM7XG4gICAgfVxuXG4gICAgaSsrO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzTmV3Q2hpbGQobmV3Q2hpbGQ6IFZub2RlV2l0aERvbSwgcGFyZW50Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkRG9tPzogRG9tRWxlbWVudCkge1xuICBpZiAob2xkRG9tKSB7XG4gICAgbmV3Q2hpbGQuZG9tID0gY3JlYXRlRWxlbWVudChuZXdDaGlsZC50YWcsIG5ld0NoaWxkLmlzU1ZHIGFzIGJvb2xlYW4pO1xuICAgIHBhcmVudFZub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuZG9tLCBvbGREb20pO1xuICB9IGVsc2Uge1xuICAgIG5ld0NoaWxkLmRvbSA9IHBhcmVudFZub2RlLmRvbS5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KG5ld0NoaWxkLnRhZywgbmV3Q2hpbGQuaXNTVkcgYXMgYm9vbGVhbikpO1xuICB9XG4gIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Q2hpbGQpO1xuICBpZiAoXCJ2LXRleHRcIiBpbiBuZXdDaGlsZC5wcm9wcykge1xuICAgIG5ld0NoaWxkLmRvbS50ZXh0Q29udGVudCA9IG5ld0NoaWxkLnByb3BzW1widi10ZXh0XCJdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGN1cnJlbnQub2xkVm5vZGUgPSBudWxsO1xuICBjdXJyZW50LnZub2RlID0gbmV3Q2hpbGQ7XG5cbiAgY29uc3QgY2hpbGRyZW4gPSBmbGF0VHJlZShuZXdDaGlsZCk7XG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICBuZXdDaGlsZC5kb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgVm5vZGUgPT09IGZhbHNlKSB7XG4gICAgICBuZXdDaGlsZC5kb20uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGRyZW5baV0pKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwcm9jZXNzTmV3Q2hpbGQoY2hpbGRyZW5baV0gYXMgVm5vZGVXaXRoRG9tLCBuZXdDaGlsZCk7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIHBhdGNoKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlOiBWbm9kZVdpdGhEb20gfCBudWxsKTogdm9pZCB7XG4gIGN1cnJlbnQub2xkVm5vZGUgPSBvbGRWbm9kZTtcbiAgY3VycmVudC52bm9kZSA9IG5ld1Zub2RlO1xuICBjb25zdCBjaGlsZHJlbiA9IGZsYXRUcmVlKG5ld1Zub2RlKTtcbiAgY29uc3QgZG9tID0gbmV3Vm5vZGUuZG9tO1xuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoZG9tLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICBkb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIH1cbiAgICAvLyBUaGVyZSBhcmUgbm8gY2hpbGRyZW4gc28gd2UgZG9uJ3QgbmVlZCB0byBjYWxsIHRoZSBvbmNyZWF0ZSBhbmQgb251cGRhdGUgY2FsbGJhY2tzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2hpbGROb2RlcyA9IGRvbS5jaGlsZE5vZGVzIGFzIHVua25vd24gYXMgRG9tRWxlbWVudFtdO1xuICBjb25zdCBvbGRDaGlsZHJlbkxlbmd0aCA9IGNoaWxkTm9kZXMubGVuZ3RoO1xuICBjb25zdCBjaGlsZHJlbkxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgaWYgKG9sZENoaWxkcmVuTGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuZXdDaGlsZCA9IGNoaWxkcmVuW2ldIGFzIFZub2RlV2l0aERvbTtcbiAgICAgIGlmIChuZXdDaGlsZCBpbnN0YW5jZW9mIFZub2RlID09PSBmYWxzZSkge1xuICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwcm9jZXNzTmV3Q2hpbGQobmV3Q2hpbGQsIG5ld1Zub2RlKTtcbiAgICB9XG4gICAgLy8gVGhlIG9uY3JlYXRlIGNhbGxiYWNrIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZHJlbiBhcmUgY3JlYXRlZFxuICAgIG5ld1Zub2RlLm9uY3JlYXRlICYmIGNhbGxTZXQobmV3Vm5vZGUub25jcmVhdGUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBvbGRUcmVlID0gY2hpbGROb2RlcyBhcyB1bmtub3duIGFzIERvbUVsZW1lbnRbXTtcbiAgY29uc3Qgb2xkS2V5ZWRMaXN0OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbiAgaWYgKG5ld1Zub2RlLmhhc0tleXMpIHtcbiAgICBjb25zdCBuZXdPbGRUcmVlID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvbGRUcmVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbmV3T2xkVHJlZVtpXSA9IG9sZFRyZWVbaV07XG4gICAgICBjb25zdCBvbGRWbm9kZSA9IG9sZFRyZWVbaV0udm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICAgICAgb2xkS2V5ZWRMaXN0WyFvbGRWbm9kZSB8fCBcImtleVwiIGluIG9sZFZub2RlLnByb3BzID09PSBmYWxzZSA/IGkgOiAob2xkVm5vZGUucHJvcHMua2V5IGFzIHN0cmluZyldID0gaTtcbiAgICB9XG4gICAgb2xkVHJlZSA9IG5ld09sZFRyZWU7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IG5ld0NoaWxkID0gY2hpbGRyZW5baV0gYXMgVm5vZGVXaXRoRG9tO1xuXG4gICAgaWYgKG5ld0NoaWxkIGluc3RhbmNlb2YgVm5vZGUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBvbGRDaGlsZCA9IG9sZFRyZWVbaV07XG4gICAgICBpZiAoIW9sZENoaWxkKSB7XG4gICAgICAgIGRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdDaGlsZCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZENoaWxkLm5vZGVUeXBlICE9PSAzKSB7XG4gICAgICAgIGRvbS5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQpLCBvbGRDaGlsZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgICBpZiAob2xkQ2hpbGQubm9kZVZhbHVlICE9IG5ld0NoaWxkKSB7XG4gICAgICAgIG9sZENoaWxkLm5vZGVWYWx1ZSA9IG5ld0NoaWxkO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQ2hpbGQgPSBvbGRUcmVlW25ld1Zub2RlLmhhc0tleXMgPyBvbGRLZXllZExpc3RbKG5ld0NoaWxkLnByb3BzLmtleSBhcyBhbnkpIHx8IGldIDogaV0gYXMgRG9tRWxlbWVudDtcblxuICAgIGlmICghb2xkQ2hpbGQgfHwgbmV3Q2hpbGQudGFnICE9PSBvbGRDaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBwcm9jZXNzTmV3Q2hpbGQobmV3Q2hpbGQsIG5ld1Zub2RlLCBjaGlsZE5vZGVzW2ldIGFzIERvbUVsZW1lbnQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbmV3Q2hpbGQuZG9tID0gb2xkQ2hpbGQ7XG4gICAgY29uc3QgY3VycmVudENoaWxkID0gY2hpbGROb2Rlc1tpXTtcbiAgICBjb25zdCBvbGRDaGlsZFZub2RlID0gb2xkQ2hpbGQudm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICAgIGlmICghY3VycmVudENoaWxkKSB7XG4gICAgICBkb20uYXBwZW5kQ2hpbGQob2xkQ2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudENoaWxkICE9PSBvbGRDaGlsZCkge1xuICAgICAgZG9tLnJlcGxhY2VDaGlsZChvbGRDaGlsZCwgY3VycmVudENoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAoXCJ2LWtlZXBcIiBpbiBuZXdDaGlsZC5wcm9wcyAmJiBvbGRDaGlsZFZub2RlKSB7XG4gICAgICBpZiAob2xkQ2hpbGRWbm9kZS5wcm9wc1tcInYta2VlcFwiXSA9PT0gbmV3Q2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9sZFByb3BzID0gY2hpbGROb2Rlc1tpICsgMV0/LnZub2RlPy5wcm9wcztcbiAgICAgIGlmIChvbGRQcm9wcyAmJiBcImtleVwiIGluIG9sZFByb3BzID09PSBmYWxzZSAmJiBvbGRQcm9wc1tcInYta2VlcFwiXSA9PT0gbmV3Q2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgICAgb2xkQ2hpbGQucmVtb3ZlKCk7XG4gICAgICAgIG9sZFRyZWUuc3BsaWNlKGksIDEpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSwgb2xkQ2hpbGRWbm9kZSk7XG5cbiAgICBpZiAoXCJ2LXRleHRcIiBpbiBuZXdDaGlsZC5wcm9wcykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgICAgaWYgKG9sZENoaWxkLnRleHRDb250ZW50ICE9IG5ld0NoaWxkLnByb3BzW1widi10ZXh0XCJdKSB7XG4gICAgICAgIG9sZENoaWxkLnRleHRDb250ZW50ID0gbmV3Q2hpbGQucHJvcHNbXCJ2LXRleHRcIl07XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIHRoZSBjbGVhbnVwIGZvciB0aGUgb2xkIGNoaWxkIHZub2RlIGJlZm9yZSB0aGUgcGF0Y2hcbiAgICBjYWxsU2V0KG9sZENoaWxkVm5vZGU/Lm9uY2xlYW51cCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgcGF0Y2gobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tLCBvbGRDaGlsZFZub2RlIHx8IG51bGwpO1xuICAgIC8vIENhbGwgdGhlIHJlbW92ZSBmb3IgdGhlIG9sZCBjaGlsZCB2bm9kZSBhZnRlciB0aGUgcGF0Y2hcbiAgICBjYWxsU2V0KG9sZENoaWxkVm5vZGU/Lm9ucmVtb3ZlKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSBjaGlsZE5vZGVzLmxlbmd0aCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA+IGw7IGktLSkge1xuICAgIGNoaWxkTm9kZXNbaSAtIDFdLnJlbW92ZSgpO1xuICB9XG5cbiAgLy8gSW4gaGVyZSB3ZSBjb3VsZCBoYXZlIG5ldyBjaGlsZHJlbiBvci9hbmQgcGF0Y2hlZCBjaGlsZHJlblxuICAvLyBTbyB3ZSBuZWVkIHRvIGNhbGwgdGhlIG9uY3JlYXRlIGFuZCBvbnVwZGF0ZSBjYWxsYmFja3NcbiAgY2FsbFNldChuZXdWbm9kZS5vbmNyZWF0ZSk7XG4gIGNhbGxTZXQobmV3Vm5vZGUub251cGRhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVm5vZGUodm5vZGU6IFZub2RlV2l0aERvbSwgc2hvdWxkQ2xlYW51cCA9IHRydWUpOiBzdHJpbmcgfCB2b2lkIHtcbiAgdm5vZGUucHJvcHMgPSB2bm9kZS5wcm9wcyB8fCB7fTtcbiAgaWYgKHNob3VsZENsZWFudXApIHtcbiAgICAvLyBUaGUgY2xlYW4gdXAgbXVzdCBiZSBmcm9tIHRoZSBvbGQgdm5vZGVcbiAgICAvLyBhbmQgaW4gaGVyZSB0aGUgdm5vZGUgaXMgdGhlIG9sZCBvbmVcbiAgICAvLyBzbywgd2UgbmVlZCB0byBjYWxsIHRoZSBjbGVhbnVwIGJlZm9yZSB0aGUgcGF0Y2hcbiAgICAvLyBpbnNpZGUgIHRoZSBwYXRjaCB0aGUgY2xlYW4gdXAgd2lsbCBiZSBjYWxsZWQgb25seSBmb3IgdGhlIG9sZCBjaGlsZHJlblxuICAgIGNhbGxTZXQodm5vZGUub25jbGVhbnVwKTtcbiAgfVxuICAvLyBDbG9uZSB0aGUgb2xkIG9uIHJlbW92ZSBzZXQgdG8gY2FsbCBpdCBhZnRlciB0aGUgcGF0Y2hcbiAgY29uc3Qgb2xkT25SZW1vdmVTZXQgPSB2bm9kZS5vbnJlbW92ZSA/IG5ldyBTZXQodm5vZGUub25yZW1vdmUpIDogbnVsbDtcbiAgY3VycmVudC52bm9kZSA9IHZub2RlO1xuICBwYXRjaCh2bm9kZSwgc2hvdWxkQ2xlYW51cCA/IHZub2RlIDogbnVsbCk7XG4gIC8vIENhbGwgdGhlIG9sZCBvbiByZW1vdmUgc2V0XG4gIGNhbGxTZXQob2xkT25SZW1vdmVTZXQpO1xuICBpc01vdW50ZWQgPSB0cnVlO1xuICBjdXJyZW50Lm9sZFZub2RlID0gbnVsbDtcbiAgY3VycmVudC52bm9kZSA9IG51bGw7XG4gIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZSgpOiBzdHJpbmcge1xuICBpZiAobWFpblZub2RlKSB7XG4gICAgbWFpblZub2RlLmNoaWxkcmVuID0gW21haW5Db21wb25lbnRdO1xuICAgIC8vIElmIHRoZSB1cGRhdGVWbm9kZSBtZXRob2QgaXMgY2FsbGVkIGZyb20gb3V0c2lkZSB0aGUgbWFpbiBsaWIgKGUuZy4gZnJvbSBhIGRpcmVjdGl2ZSlcbiAgICAvLyBpdCBhbHdheXMgYmUgY29uc2lkZXJlZCBhcyBtb3VudGVkLCBzbyB0aGUgY2xlYW51cCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHBhdGNoXG4gICAgLy8gQnV0IGluIGhlcmUsIHdlIG5lZWQgdG8gcGFzcyB0aGUgc2hvdWxkQ2xlYW51cCBhcyBmYWxzZSBpZiB0aGUgYXBwIGlzIG5vdCBtb3VudGVkXG4gICAgdXBkYXRlVm5vZGUobWFpblZub2RlIGFzIFZub2RlV2l0aERvbSwgaXNNb3VudGVkKTtcbiAgICBpZiAoaXNOb2RlSnMpIHtcbiAgICAgIHJldHVybiBtYWluVm5vZGUuZG9tLmlubmVySFRNTDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59XG5cbmxldCBkZWJvdW5jZWRVcGRhdGVUaW1lb3V0OiBhbnk7XG5jb25zdCBkZWJvdW5jZWRVcGRhdGVNZXRob2QgPSBpc05vZGVKcyA/IHVwZGF0ZSA6ICgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGUpO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2VkVXBkYXRlKHRpbWVvdXQgPSA0Mikge1xuICBpZiAoY3VycmVudC5ldmVudCkge1xuICAgIGN1cnJlbnQuZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICBjbGVhclRpbWVvdXQoZGVib3VuY2VkVXBkYXRlVGltZW91dCk7XG4gIGRlYm91bmNlZFVwZGF0ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGRlYm91bmNlZFVwZGF0ZU1ldGhvZCwgdGltZW91dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bm1vdW50KCkge1xuICBpZiAobWFpblZub2RlKSB7XG4gICAgbWFpbkNvbXBvbmVudCA9IHYoKCkgPT4gbnVsbCwge30pIGFzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHVwZGF0ZSgpO1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBldmVudExpc3RlbmVyTmFtZXMpIHtcbiAgICAgIG1haW5Wbm9kZS5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIGV2ZW50TGlzdGVuZXIpO1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShldmVudExpc3RlbmVyTmFtZXMsIG5hbWUpO1xuICAgIH1cblxuICAgIGNhbGxTZXQobWFpblZub2RlLm9ucmVtb3ZlKTtcblxuICAgIG1haW5Db21wb25lbnQgPSBudWxsO1xuICAgIG1haW5Wbm9kZSA9IG51bGw7XG4gICAgaXNNb3VudGVkID0gZmFsc2U7XG4gICAgY3VycmVudC52bm9kZSA9IG51bGw7XG4gICAgY3VycmVudC5jb21wb25lbnQgPSBudWxsO1xuICAgIGN1cnJlbnQuZXZlbnQgPSBudWxsO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gXCJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vdW50KGRvbTogc3RyaW5nIHwgRG9tRWxlbWVudCwgY29tcG9uZW50OiBWYWx5cmlhbkNvbXBvbmVudCB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIHwgYW55KSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9XG4gICAgdHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIiA/IChpc05vZGVKcyA/IGNyZWF0ZUVsZW1lbnQoZG9tLCBkb20gPT09IFwic3ZnXCIpIDogZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihkb20pKSA6IGRvbTtcblxuICBpZiAoaXNDb21wb25lbnQoY29tcG9uZW50KSkge1xuICAgIG1haW5Db21wb25lbnQgPSB2KGNvbXBvbmVudCwge30sIFtdKSBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgfSBlbHNlIGlmIChpc1Zub2RlQ29tcG9uZW50KGNvbXBvbmVudCkpIHtcbiAgICBtYWluQ29tcG9uZW50ID0gY29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIG1haW5Db21wb25lbnQgPSB2KCgpID0+IGNvbXBvbmVudCwge30sIFtdKSBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgfVxuXG4gIG1haW5Wbm9kZSA9IGhpZHJhdGVEb21Ub1Zub2RlKGNvbnRhaW5lcikgYXMgVm5vZGVXaXRoRG9tO1xuICByZXR1cm4gdXBkYXRlKCk7XG59XG4iXSwibWFwcGluZ3MiOiJNQXdDTyxJQUFNQSxFQUFXQyxRQUEyQixvQkFBWkMsU0FBMkJBLFFBQVFDLFVBQVlELFFBQVFDLFNBQVNDLE1BRTFGQyxFQUFOLE1BQ0wsV0FBQUMsQ0FDU0MsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsR0FWQUMsS0FBQVgsTUFDQVcsS0FBQVYsUUFDQVUsS0FBQVQsV0FDQVMsS0FBQVIsTUFDQVEsS0FBQVAsUUFDQU8sS0FBQU4sbUJBQ0FNLEtBQUFMLFVBQ0FLLEtBQUFKLFdBQ0FJLEtBQUFILFlBQ0FHLEtBQUFGLFdBQ0FFLEtBQUFELFVBQ04sR0FTUUUsRUFBbUJDLEdBQzlCbkIsUUFBUW1CLEdBQWtDLGlCQUFkQSxHQUEwQixTQUFVQSxHQUVyREMsRUFBZUQsR0FDMUJuQixRQUE2QixtQkFBZG1CLEdBQTRCRCxFQUFnQkMsSUFDaERFLEVBQVdDLEdBQXNDQSxhQUFrQmxCLEVBRW5FbUIsRUFBb0JELEdBQ3hCRCxFQUFRQyxJQUFXRixFQUFZRSxFQUFPaEIsS0FHeEMsU0FBU2tCLEVBQUVDLEVBQTRDbEIsS0FBNkJDLEdBQ3pGLE9BQU8sSUFBSUosRUFBTXFCLEVBQWdCbEIsRUFBT0MsRUFDMUMsQ0FJTyxTQUFTa0IsRUFBa0JqQixHQUNoQyxHQUFxQixJQUFqQkEsRUFBSWtCLFNBQ04sT0FBT2xCLEVBQUltQixVQUdiLEdBQXFCLElBQWpCbkIsRUFBSWtCLFNBQWdCLENBQ3RCLE1BQU1yQixFQUFNRyxFQUFJb0IsU0FBU0MsY0FDbkJ2QixFQUFRLENBQUMsRUFDVEMsRUFBVyxHQUVqQixRQUFTdUIsRUFBSSxFQUFHQyxFQUFJdkIsRUFBSXdCLFdBQVdD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
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc05vZGVKcyIsIkJvb2xlYW4iLCJwcm9jZXNzIiwidmVyc2lvbnMiLCJub2RlIiwiVm5vZGUiLCJjb25zdHJ1Y3RvciIsInRhZyIsInByb3BzIiwiY2hpbGRyZW4iLCJkb20iLCJpc1NWRyIsIm9sZENoaWxkQ29tcG9uZW50cyIsImNoaWxkQ29tcG9uZW50cyIsImhhc0tleXMiLCJvbmNyZWF0ZSIsIm9uY2xlYW51cCIsIm9udXBkYXRlIiwib25yZW1vdmUiLCJ0aGlzIiwiaXNQT0pPQ29tcG9uZW50IiwiY29tcG9uZW50IiwiaXNDb21wb25lbnQiLCJpc1Zub2RlIiwib2JqZWN0IiwiaXNWbm9kZUNvbXBvbmVudCIsInYiLCJ0YWdPckNvbXBvbmVudCIsImhpZHJhdGVEb21Ub1Zub2RlIiwibm9kZVR5cGUiLCJub2RlVmFsdWUiLCJub2RlTmFtZSIsInRvTG93ZXJDYXNlIiwiaSIsImwiLCJjaGlsZE5vZGVzIiwibGVuZ3RoIiwiY2hpbGREb20iLCJwdXNoIiwiY2hpbGRWbm9kZSIsImF0dHJpYnV0ZXMiLCJhdHRyIiwidm5vZGUiLCJ0cnVzdCIsImh0bWxTdHJpbmciLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lckhUTUwiLCJ0cmltIiwiQXJyYXkiLCJmcm9tIiwibWFwIiwiZnJhZ21lbnQiLCJfIiwibWFpbkNvbXBvbmVudCIsIm1haW5Wbm9kZSIsImlzTW91bnRlZCIsImN1cnJlbnQiLCJvbGRWbm9kZSIsImV2ZW50IiwicmVzZXJ2ZWRQcm9wcyIsIlNldCIsImFkZENhbGxiYWNrVG9TZXQiLCJjYWxsYmFjayIsInNldFR5cGUiLCJhZGQiLCJjbGVhbnVwIiwidmFsaWRhdGVJc0NhbGxlZEluc2lkZUNvbXBvbmVudCIsIkVycm9yIiwiY2FsbFNldCIsInNldCIsImNsZWFyIiwiZGlyZWN0aXZlcyIsIm9sZFByb3BzIiwicGFyZW50Vm5vZGUiLCJjdXJyZW50Q2hpbGRWbm9kZSIsInBhcmVudE5vZGUiLCJwYXJlbnRFbGVtZW50IiwidmFsdWUiLCJyZXBsYWNlQ2hpbGQiLCJjcmVhdGVUZXh0Tm9kZSIsImJvb2wiLCJzdHlsZSIsImRpc3BsYXkiLCJtb2RlbCIsInByb3BlcnR5IiwibmFtZSIsImhhbmRsZXIiLCJlIiwidGFyZ2V0IiwidHlwZSIsImlzQXJyYXkiLCJ2YWwiLCJpZHgiLCJpbmRleE9mIiwic3BsaWNlIiwic2V0QXR0cmlidXRlIiwibXVsdGlwbGUiLCJjdHJsS2V5IiwiZm9yRWFjaCIsImNoaWxkIiwiam9pbiIsInNlbGVjdGVkIiwicHJldkhhbmRsZXIiLCJjbGFzc05hbWUiLCJjbGFzc0xpc3QiLCJ0b2dnbGUiLCJjbGFzcyIsImlkIiwiZG9tU3R5bGUiLCJkZWJvdW5jZWRVcGRhdGVUaW1lb3V0IiwiZXZlbnRMaXN0ZW5lck5hbWVzIiwiZXZlbnRMaXN0ZW5lciIsImRlZmF1bHRQcmV2ZW50ZWQiLCJ1cGRhdGUiLCJzaGFyZWRTZXRBdHRyaWJ1dGUiLCJuZXdWbm9kZSIsIm5ld1Zub2RlRG9tIiwicmVtb3ZlQXR0cmlidXRlIiwiaGFzIiwiYWRkRXZlbnRMaXN0ZW5lciIsInNsaWNlIiwidXBkYXRlQXR0cmlidXRlcyIsInZub2RlRG9tIiwidm5vZGVQcm9wcyIsImNyZWF0ZUVsZW1lbnROUyIsImZsYXRUcmVlIiwiY29uc29sZSIsIndhcm4iLCJuZXdDaGlsZCIsInZpZXciLCJiaW5kIiwicHJvY2Vzc05ld0NoaWxkIiwib2xkRG9tIiwiYXBwZW5kQ2hpbGQiLCJ0ZXh0Q29udGVudCIsInBhdGNoIiwib2xkQ2hpbGRyZW5MZW5ndGgiLCJjaGlsZHJlbkxlbmd0aCIsIm9sZFRyZWUiLCJvbGRLZXllZExpc3QiLCJuZXdPbGRUcmVlIiwia2V5Iiwib2xkQ2hpbGQiLCJjdXJyZW50Q2hpbGQiLCJvbGRDaGlsZFZub2RlIiwicmVtb3ZlIiwidXBkYXRlVm5vZGUiLCJzaG91bGRDbGVhbnVwIiwib2xkT25SZW1vdmVTZXQiLCJkZWJvdW5jZWRVcGRhdGVNZXRob2QiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ0aW1lb3V0IiwicHJldmVudERlZmF1bHQiLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiZGlyZWN0aXZlIiwiZGlyZWN0aXZlTmFtZSIsImNvbnRhaW5lciIsInF1ZXJ5U2VsZWN0b3IiLCJyZW1vdmVkIiwicmVzdWx0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSJdLCJzb3VyY2VzIjpbIi4uL2xpYi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuZGVjbGFyZSBnbG9iYWwge1xuICB2YXIgZG9jdW1lbnQ6IERvY3VtZW50O1xuICBuYW1lc3BhY2UgSlNYIHtcbiAgICBpbnRlcmZhY2UgSW50cmluc2ljRWxlbWVudHMgZXh0ZW5kcyBEZWZhdWx0UmVjb3JkIHt9XG4gICAgdHlwZSBFbGVtZW50ID0gUmV0dXJuVHlwZTxcbiAgICAgIHR5cGVvZiB2IHwgKCguLi5hcmdzOiBhbnkpID0+IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQgfCBib29sZWFuIHwgUHJvbWlzZTxhbnk+KVxuICAgID47XG4gICAgdHlwZSBDb21wb25lbnRSZXR1cm5UeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCB8IGJvb2xlYW4gfCBFbGVtZW50IHwgRWxlbWVudFtdO1xuICB9XG59XG5cbmludGVyZmFjZSBEZWZhdWx0UmVjb3JkIGV4dGVuZHMgUmVjb3JkPHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgYW55PiB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnRpZXMgZXh0ZW5kcyBEZWZhdWx0UmVjb3JkIHtcbiAga2V5Pzogc3RyaW5nIHwgbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERvbUVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50LCBEZWZhdWx0UmVjb3JkIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50IGV4dGVuZHMgRGVmYXVsdFJlY29yZCB7XG4gIChwcm9wczogUHJvcGVydGllcywgY2hpbGRyZW46IGFueVtdKTogVm5vZGUgfCBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUE9KT0NvbXBvbmVudCBleHRlbmRzIERlZmF1bHRSZWNvcmQge1xuICB2aWV3OiBDb21wb25lbnQ7XG59XG5cbmV4cG9ydCB0eXBlIFZhbHlyaWFuQ29tcG9uZW50ID0gQ29tcG9uZW50IHwgUE9KT0NvbXBvbmVudDtcblxuZXhwb3J0IGludGVyZmFjZSBWbm9kZUNvbXBvbmVudEludGVyZmFjZSBleHRlbmRzIFZub2RlIHtcbiAgdGFnOiBWYWx5cmlhbkNvbXBvbmVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGlsZHJlbiBleHRlbmRzIEFycmF5PFZub2RlIHwgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgfCBWYWx5cmlhbkNvbXBvbmVudCB8IGFueT4ge31cblxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmUge1xuICAodmFsdWU6IGFueSwgdm5vZGU6IFZub2RlV2l0aERvbSwgb2xkUHJvcHM/OiBQcm9wZXJ0aWVzKTogZmFsc2UgfCB2b2lkIHwgYW55O1xufVxuXG5leHBvcnQgY29uc3QgaXNOb2RlSnMgPSBCb29sZWFuKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcblxuZXhwb3J0IGNsYXNzIFZub2RlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRhZzogc3RyaW5nIHwgQ29tcG9uZW50IHwgUE9KT0NvbXBvbmVudCxcbiAgICBwdWJsaWMgcHJvcHM6IG51bGwgfCBQcm9wZXJ0aWVzLFxuICAgIHB1YmxpYyBjaGlsZHJlbjogQ2hpbGRyZW4sXG4gICAgcHVibGljIGRvbT86IERvbUVsZW1lbnQsXG4gICAgcHVibGljIGlzU1ZHPzogYm9vbGVhbixcbiAgICBwdWJsaWMgb2xkQ2hpbGRDb21wb25lbnRzPzogU2V0PFZhbHlyaWFuQ29tcG9uZW50PixcbiAgICBwdWJsaWMgY2hpbGRDb21wb25lbnRzPzogU2V0PFZhbHlyaWFuQ29tcG9uZW50PixcbiAgICBwdWJsaWMgaGFzS2V5cz86IGJvb2xlYW4sXG4gICAgcHVibGljIG9uY3JlYXRlPzogU2V0PEZ1bmN0aW9uPixcbiAgICBwdWJsaWMgb25jbGVhbnVwPzogU2V0PEZ1bmN0aW9uPixcbiAgICBwdWJsaWMgb251cGRhdGU/OiBTZXQ8RnVuY3Rpb24+LFxuICAgIHB1YmxpYyBvbnJlbW92ZT86IFNldDxGdW5jdGlvbj5cbiAgKSB7fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlV2l0aERvbSBleHRlbmRzIFZub2RlIHtcbiAgdGFnOiBzdHJpbmc7XG4gIGRvbTogRG9tRWxlbWVudDtcbiAgcHJvcHM6IFByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBjb25zdCBpc1BPSk9Db21wb25lbnQgPSAoY29tcG9uZW50OiB1bmtub3duKTogY29tcG9uZW50IGlzIFBPSk9Db21wb25lbnQgPT5cbiAgQm9vbGVhbihjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJvYmplY3RcIiAmJiBcInZpZXdcIiBpbiBjb21wb25lbnQpO1xuXG5leHBvcnQgY29uc3QgaXNDb21wb25lbnQgPSAoY29tcG9uZW50OiB1bmtub3duKTogY29tcG9uZW50IGlzIENvbXBvbmVudCA9PlxuICBCb29sZWFuKHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIiB8fCBpc1BPSk9Db21wb25lbnQoY29tcG9uZW50KSk7XG5leHBvcnQgY29uc3QgaXNWbm9kZSA9IChvYmplY3Q/OiB1bmtub3duKTogb2JqZWN0IGlzIFZub2RlID0+IG9iamVjdCBpbnN0YW5jZW9mIFZub2RlO1xuXG5leHBvcnQgY29uc3QgaXNWbm9kZUNvbXBvbmVudCA9IChvYmplY3Q/OiB1bmtub3duKTogb2JqZWN0IGlzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlID0+IHtcbiAgcmV0dXJuIGlzVm5vZGUob2JqZWN0KSAmJiBpc0NvbXBvbmVudChvYmplY3QudGFnKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB2KHRhZ09yQ29tcG9uZW50OiBzdHJpbmcgfCBWYWx5cmlhbkNvbXBvbmVudCwgcHJvcHM6IFByb3BlcnRpZXMgfCBudWxsLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pIHtcbiAgcmV0dXJuIG5ldyBWbm9kZSh0YWdPckNvbXBvbmVudCwgcHJvcHMsIGNoaWxkcmVuKTtcbn1cblxudi5mcmFnbWVudCA9IChfOiBQcm9wZXJ0aWVzLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pID0+IGNoaWxkcmVuO1xuXG5leHBvcnQgZnVuY3Rpb24gaGlkcmF0ZURvbVRvVm5vZGUoZG9tOiBhbnkpOiBWbm9kZVdpdGhEb20gfCB2b2lkIHtcbiAgaWYgKGRvbS5ub2RlVHlwZSA9PT0gMykge1xuICAgIHJldHVybiBkb20ubm9kZVZhbHVlO1xuICB9XG5cbiAgaWYgKGRvbS5ub2RlVHlwZSA9PT0gMSkge1xuICAgIGNvbnN0IHRhZyA9IGRvbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHByb3BzID0ge30gYXMgUHJvcGVydGllcztcbiAgICBjb25zdCBjaGlsZHJlbiA9IFtdIGFzIENoaWxkcmVuO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBkb20uY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkRG9tID0gZG9tLmNoaWxkTm9kZXNbaV07XG4gICAgICBpZiAoY2hpbGREb20ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZERvbS5ub2RlVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZERvbS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICBjb25zdCBjaGlsZFZub2RlID0gaGlkcmF0ZURvbVRvVm5vZGUoY2hpbGREb20pO1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkVm5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkb20uYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cmlidXRlc1tpXTtcbiAgICAgIHByb3BzW2F0dHIubm9kZU5hbWVdID0gYXR0ci5ub2RlVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3Qgdm5vZGUgPSBuZXcgVm5vZGUodGFnLCBwcm9wcywgY2hpbGRyZW4pO1xuICAgIHZub2RlLmRvbSA9IGRvbTtcbiAgICBkb20udm5vZGUgPSB2bm9kZTtcbiAgICB2bm9kZS5pc1NWRyA9IHRhZyA9PT0gXCJzdmdcIjtcbiAgICByZXR1cm4gdm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnVzdChodG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgZGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmcudHJpbSgpO1xuICByZXR1cm4gQXJyYXkuZnJvbShkaXYuY2hpbGROb2RlcykubWFwKGhpZHJhdGVEb21Ub1Zub2RlKTtcbn1cblxubGV0IG1haW5Db21wb25lbnQ6IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIHwgbnVsbCA9IG51bGw7XG5sZXQgbWFpblZub2RlOiBWbm9kZVdpdGhEb20gfCBudWxsID0gbnVsbDtcbmxldCBpc01vdW50ZWQgPSBmYWxzZTtcblxuZXhwb3J0IGNvbnN0IGN1cnJlbnQgPSB7XG4gIG9sZFZub2RlOiBudWxsIGFzIFZub2RlIHwgbnVsbCxcbiAgdm5vZGU6IG51bGwgYXMgVm5vZGUgfCBudWxsLFxuICBjb21wb25lbnQ6IG51bGwgYXMgVmFseXJpYW5Db21wb25lbnQgfCBudWxsLFxuICBldmVudDogbnVsbCBhcyBFdmVudCB8IG51bGxcbn07XG5cbmV4cG9ydCBjb25zdCByZXNlcnZlZFByb3BzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgXCJrZXlcIixcbiAgXCJzdGF0ZVwiLFxuICBcInYta2VlcFwiLFxuICBcInYtdGV4dFwiLFxuICBcInYtaWZcIixcbiAgXCJ2LWZvclwiLFxuICBcInYtc2hvd1wiLFxuICBcInYtY2xhc3NcIixcbiAgXCJ2LWh0bWxcIixcbiAgXCJ2LW1vZGVsXCIsXG4gIFwidi1jcmVhdGVcIixcbiAgXCJ2LXVwZGF0ZVwiLFxuICBcInYtY2xlYW51cFwiXG5dKTtcblxuZW51bSBTZXRUeXBlIHtcbiAgb25DcmVhdGUgPSBcIm9uY3JlYXRlXCIsXG4gIG9uVXBkYXRlID0gXCJvbnVwZGF0ZVwiLFxuICBvbkNsZWFudXAgPSBcIm9uY2xlYW51cFwiLFxuICBvblJlbW92ZSA9IFwib25yZW1vdmVcIlxufVxuXG5mdW5jdGlvbiBhZGRDYWxsYmFja1RvU2V0KGNhbGxiYWNrOiBGdW5jdGlvbiwgc2V0VHlwZTogU2V0VHlwZSwgdm5vZGU6IFZub2RlV2l0aERvbSkge1xuICB2bm9kZVtzZXRUeXBlXSA9IHZub2RlW3NldFR5cGVdIHx8IG5ldyBTZXQoKTtcbiAgdm5vZGVbc2V0VHlwZV0uYWRkKCgpID0+IHtcbiAgICBjb25zdCBjbGVhbnVwID0gY2FsbGJhY2soKTtcbiAgICBpZiAodHlwZW9mIGNsZWFudXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdm5vZGVbU2V0VHlwZS5vbkNsZWFudXBdID0gdm5vZGVbU2V0VHlwZS5vbkNsZWFudXBdIHx8IG5ldyBTZXQoKTtcbiAgICAgIHZub2RlW1NldFR5cGUub25DbGVhbnVwXS5hZGQoY2xlYW51cCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVJc0NhbGxlZEluc2lkZUNvbXBvbmVudCgpIHtcbiAgaWYgKCFjdXJyZW50LnZub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSBjb21wb25lbnRcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG9uQ3JlYXRlID0gKGNhbGxiYWNrOiBGdW5jdGlvbikgPT4ge1xuICB2YWxpZGF0ZUlzQ2FsbGVkSW5zaWRlQ29tcG9uZW50KCk7XG4gIGNvbnN0IHBhcmVudFZub2RlID0gY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb207XG4gIGNvbnN0IGNvbXBvbmVudCA9IGN1cnJlbnQuY29tcG9uZW50IGFzIFZhbHlyaWFuQ29tcG9uZW50O1xuICBjb25zdCBoYXNDb21wb25lbnRBc09sZENoaWxkID0gcGFyZW50Vm5vZGUub2xkQ2hpbGRDb21wb25lbnRzICYmIHBhcmVudFZub2RlLm9sZENoaWxkQ29tcG9uZW50cy5oYXMoY29tcG9uZW50KTtcblxuICBpZiAoIWhhc0NvbXBvbmVudEFzT2xkQ2hpbGQpIHtcbiAgICBhZGRDYWxsYmFja1RvU2V0KGNhbGxiYWNrLCBTZXRUeXBlLm9uQ3JlYXRlLCBwYXJlbnRWbm9kZSk7XG4gIH1cbn07XG5leHBvcnQgY29uc3Qgb25VcGRhdGUgPSAoY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB7XG4gIHZhbGlkYXRlSXNDYWxsZWRJbnNpZGVDb21wb25lbnQoKTtcbiAgY29uc3QgcGFyZW50Vm5vZGUgPSBjdXJyZW50LnZub2RlIGFzIFZub2RlV2l0aERvbTtcbiAgY29uc3QgY29tcG9uZW50ID0gY3VycmVudC5jb21wb25lbnQgYXMgVmFseXJpYW5Db21wb25lbnQ7XG4gIGNvbnN0IGhhc0NvbXBvbmVudEFzQ2hpbGQgPSBwYXJlbnRWbm9kZS5jaGlsZENvbXBvbmVudHMgJiYgcGFyZW50Vm5vZGUuY2hpbGRDb21wb25lbnRzLmhhcyhjb21wb25lbnQpO1xuICBpZiAoaGFzQ29tcG9uZW50QXNDaGlsZCkge1xuICAgIGFkZENhbGxiYWNrVG9TZXQoY2FsbGJhY2ssIFNldFR5cGUub25VcGRhdGUsIGN1cnJlbnQudm5vZGUgYXMgVm5vZGVXaXRoRG9tKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCBvbkNsZWFudXAgPSAoY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB7XG4gIHZhbGlkYXRlSXNDYWxsZWRJbnNpZGVDb21wb25lbnQoKTtcbiAgYWRkQ2FsbGJhY2tUb1NldChjYWxsYmFjaywgU2V0VHlwZS5vbkNsZWFudXAsIGN1cnJlbnQudm5vZGUgYXMgVm5vZGVXaXRoRG9tKTtcbn07XG5leHBvcnQgY29uc3Qgb25SZW1vdmUgPSAoY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB7XG4gIHZhbGlkYXRlSXNDYWxsZWRJbnNpZGVDb21wb25lbnQoKTtcblxuICBjb25zdCBwYXJlbnRWbm9kZSA9IGN1cnJlbnQudm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICBjb25zdCBjb21wb25lbnQgPSBjdXJyZW50LmNvbXBvbmVudCBhcyBWYWx5cmlhbkNvbXBvbmVudDtcbiAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiByZW1vdmVDYWxsYmFjaygpIHtcbiAgICBjb25zdCBoYXNDb21wb25lbnRBc0NoaWxkID0gcGFyZW50Vm5vZGUuY2hpbGRDb21wb25lbnRzICYmIHBhcmVudFZub2RlLmNoaWxkQ29tcG9uZW50cy5oYXMoY29tcG9uZW50KTtcblxuICAgIGlmIChoYXNDb21wb25lbnRBc0NoaWxkIHx8IHJlbW92ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZW1vdmVkID0gdHJ1ZTtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgYWRkQ2FsbGJhY2tUb1NldChyZW1vdmVDYWxsYmFjaywgU2V0VHlwZS5vblJlbW92ZSwgY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb20pO1xufTtcbmNvbnN0IGNhbGxTZXQgPSAoc2V0PzogU2V0PEZ1bmN0aW9uPiB8IG51bGwpID0+IHtcbiAgaWYgKCFzZXQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBzZXQpIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG4gIHNldC5jbGVhcigpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRpcmVjdGl2ZXM6IFJlY29yZDxzdHJpbmcsIERpcmVjdGl2ZT4gPSB7XG4gIFwidi1jcmVhdGVcIjogKGNhbGxiYWNrLCBjaGlsZFZub2RlLCBvbGRQcm9wcykgPT4ge1xuICAgIGlmICghb2xkUHJvcHMpIHtcbiAgICAgIGFkZENhbGxiYWNrVG9TZXQoKCkgPT4gY2FsbGJhY2soY2hpbGRWbm9kZSksIFNldFR5cGUub25DcmVhdGUsIGN1cnJlbnQudm5vZGUgYXMgVm5vZGVXaXRoRG9tKTtcbiAgICB9XG4gIH0sXG5cbiAgXCJ2LXVwZGF0ZVwiOiAoY2FsbGJhY2ssIGNoaWxkVm5vZGUsIG9sZFByb3BzKSA9PiB7XG4gICAgaWYgKG9sZFByb3BzKSB7XG4gICAgICBhZGRDYWxsYmFja1RvU2V0KCgpID0+IGNhbGxiYWNrKGNoaWxkVm5vZGUsIG9sZFByb3BzKSwgU2V0VHlwZS5vblVwZGF0ZSwgY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb20pO1xuICAgIH1cbiAgfSxcblxuICBcInYtcmVtb3ZlXCI6IChjYWxsYmFjaywgY2hpbGRWbm9kZSkgPT4ge1xuICAgIGxldCBwYXJlbnRWbm9kZSA9IGN1cnJlbnQudm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICAgIGxldCBjdXJyZW50Q2hpbGRWbm9kZSA9IGNoaWxkVm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICAgIHdoaWxlIChwYXJlbnRWbm9kZSkge1xuICAgICAgcGFyZW50Vm5vZGUub25yZW1vdmUgPSBwYXJlbnRWbm9kZS5vbnJlbW92ZSB8fCBuZXcgU2V0KCk7XG4gICAgICBhZGRDYWxsYmFja1RvU2V0KFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjaGlsZFZub2RlLmRvbS52bm9kZSB8fCBjdXJyZW50Q2hpbGRWbm9kZS5kb20ucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYWxsYmFjayhjaGlsZFZub2RlKTtcbiAgICAgICAgICBjaGlsZFZub2RlLmRvbS52bm9kZSA9IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIFNldFR5cGUub25SZW1vdmUsXG4gICAgICAgIHBhcmVudFZub2RlXG4gICAgICApO1xuXG4gICAgICBpZiAoIXBhcmVudFZub2RlLmRvbS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY3VycmVudENoaWxkVm5vZGUgPSBwYXJlbnRWbm9kZTtcbiAgICAgIHBhcmVudFZub2RlID0gKHBhcmVudFZub2RlLmRvbS5wYXJlbnRFbGVtZW50IGFzIERvbUVsZW1lbnQpLnZub2RlIGFzIFZub2RlV2l0aERvbTtcbiAgICB9XG4gIH0sXG5cbiAgXCJ2LWNsZWFudXBcIjogKGNhbGxiYWNrLCB2bm9kZSkgPT4ge1xuICAgIGFkZENhbGxiYWNrVG9TZXQoKCkgPT4gY2FsbGJhY2sodm5vZGUpLCBTZXRUeXBlLm9uQ2xlYW51cCwgY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb20pO1xuICB9LFxuXG4gIFwidi1pZlwiOiAodmFsdWUsIHZub2RlKSA9PiB7XG4gICAgaWYgKCFCb29sZWFuKHZhbHVlKSkge1xuICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHZub2RlLmRvbT8ucGFyZW50Tm9kZTtcbiAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgIHBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpLCB2bm9kZS5kb20pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuXG4gIFwidi1zaG93XCI6ICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICBjb25zdCBib29sID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgKFxuICAgICAgdm5vZGUuZG9tIGFzIHVua25vd24gYXMge1xuICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiBzdHJpbmcgfTtcbiAgICAgIH1cbiAgICApLnN0eWxlLmRpc3BsYXkgPSBib29sID8gXCJcIiA6IFwibm9uZVwiO1xuICB9LFxuXG4gIFwidi1odG1sXCI6ICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICB2bm9kZS5jaGlsZHJlbiA9IHRydXN0KHZhbHVlIGFzIHN0cmluZyk7XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1tb2RlbFwiIGRpcmVjdGl2ZSBiaW5kcyB0aGUgdmFsdWUgb2YgYW4gaW5wdXQgZWxlbWVudCB0byBhIG1vZGVsIHByb3BlcnR5XG4gIFwidi1tb2RlbFwiOiAobW9kZWwsIHZub2RlKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGlmIChcIm5hbWVcIiBpbiB2bm9kZS5wcm9wcyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdmFsdWU7XG4gICAgY29uc3QgcHJvcGVydHkgPSB2bm9kZS5wcm9wcy5uYW1lO1xuICAgIGxldCBldmVudCA9IFwib25pbnB1dFwiO1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBtb2RlbCBwcm9wZXJ0eSB3aGVuIHRoZSBpbnB1dCBlbGVtZW50J3MgdmFsdWUgY2hhbmdlc1xuICAgIGxldCBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiAobW9kZWxbcHJvcGVydHldID0gKGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KS52YWx1ZSk7XG4gICAgaWYgKHZub2RlLnRhZyA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAvLyBEZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgaW5wdXQgZWxlbWVudCwgdXNlIGEgZGlmZmVyZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgIHN3aXRjaCAodm5vZGUucHJvcHMudHlwZSkge1xuICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjoge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5XSkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBtb2RlbCBwcm9wZXJ0eSBpcyBhbiBhcnJheSwgYWRkIG9yIHJlbW92ZSB0aGUgdmFsdWUgZnJvbSB0aGUgYXJyYXkgd2hlbiB0aGUgY2hlY2tib3ggaXMgY2hlY2tlZCBvciB1bmNoZWNrZWRcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KS52YWx1ZTtcbiAgICAgICAgICAgICAgY29uc3QgaWR4ID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsKTtcbiAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBpbiB0aGUgYXJyYXksIHNldCB0aGUgY2hlY2tib3ggdG8gYmUgY2hlY2tlZFxuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2bm9kZS5kb20udmFsdWUpICE9PSAtMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiB2bm9kZS5wcm9wcykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGlucHV0IGVsZW1lbnQgaGFzIGEgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSwgdXNlIGl0IHRvIGRldGVybWluZSB0aGUgY2hlY2tlZCBzdGF0ZVxuICAgICAgICAgICAgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUucHJvcHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XSA9IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBcInZhbHVlXCIgYXR0cmlidXRlLCB1c2UgYSBib29sZWFuIHZhbHVlIGZvciB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoKSA9PiAobW9kZWxbcHJvcGVydHldID0gIW1vZGVsW3Byb3BlcnR5XSk7XG4gICAgICAgICAgICB2YWx1ZSA9IG1vZGVsW3Byb3BlcnR5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU2V0IHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUgb24gdGhlIGlucHV0IGVsZW1lbnRcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHZhbHVlLCB2bm9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJhZGlvXCI6IHtcbiAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhIHJhZGlvIGJ1dHRvbiwgc2V0IHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBwcm9wZXJ0eVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgIHNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgbW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5kb20udmFsdWUsIHZub2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBpbnB1dCB0eXBlcywgc2V0IHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBtb2RlbFtwcm9wZXJ0eV0sIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSBcInNlbGVjdFwiKSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhIHNlbGVjdCBlbGVtZW50LCB1c2UgdGhlIFwiY2xpY2tcIiBldmVudCBieSBkZWZhdWx0XG4gICAgICBldmVudCA9IFwib25jbGlja1wiO1xuICAgICAgaWYgKHZub2RlLnByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3QgZWxlbWVudCBhbGxvd3MgbXVsdGlwbGUgc2VsZWN0aW9ucywgdXBkYXRlIHRoZSBtb2RlbCBwcm9wZXJ0eSB3aXRoIGFuIGFycmF5IG9mIHNlbGVjdGVkIHZhbHVlc1xuICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWU7XG4gICAgICAgICAgaWYgKGUuY3RybEtleSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIEN0cmwga2V5IGlzIHByZXNzZWQsIGFkZCBvciByZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIGFycmF5XG4gICAgICAgICAgICBjb25zdCBpZHggPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWwpO1xuICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlIEN0cmwga2V5IGlzIG5vdCBwcmVzc2VkLCBzZXQgdGhlIG1vZGVsIHByb3BlcnR5IHRvIGFuIGFycmF5IHdpdGggdGhlIHNlbGVjdGVkIHZhbHVlXG4gICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKDAsIG1vZGVsW3Byb3BlcnR5XS5sZW5ndGgpO1xuICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFNldCB0aGUgXCJzZWxlY3RlZFwiIGF0dHJpYnV0ZSBvbiB0aGUgb3B0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgYXJlIGluIHRoZSBtb2RlbCBwcm9wZXJ0eSBhcnJheVxuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gXCJvcHRpb25cIikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBcInZhbHVlXCIgaW4gY2hpbGQucHJvcHMgPyBjaGlsZC5wcm9wcy52YWx1ZSA6IGNoaWxkLmNoaWxkcmVuLmpvaW4oXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuc2VsZWN0ZWQgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWx1ZSkgIT09IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0IGVsZW1lbnQgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9ucywgc2V0IHRoZSBcInNlbGVjdGVkXCIgYXR0cmlidXRlIG9uIHRoZSBvcHRpb25zIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gXCJ2YWx1ZVwiIGluIGNoaWxkLnByb3BzID8gY2hpbGQucHJvcHMudmFsdWUgOiBjaGlsZC5jaGlsZHJlbi5qb2luKFwiXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGNoaWxkLnByb3BzLnNlbGVjdGVkID0gdmFsdWUgPT09IG1vZGVsW3Byb3BlcnR5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSBcInRleHRhcmVhXCIpIHtcbiAgICAgIC8vIFNldCB0aGUgdGV4dGFyZWEncyBjb250ZW50IHRvIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgIHZub2RlLmNoaWxkcmVuID0gW21vZGVsW3Byb3BlcnR5XV07XG4gICAgfVxuXG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIHByZXYgaGFuZGxlciBpZiBhbnkgd2lsbCBub3QgYmUgY2hhbmdlZCBieSB0aGUgdXNlciBhY3Jvc3MgcGF0Y2hzXG4gICAgY29uc3QgcHJldkhhbmRsZXIgPSB2bm9kZS5wcm9wc1tldmVudF07XG5cbiAgICAvLyBTZXQgdGhlIGV2ZW50IGhhbmRsZXIgb24gdGhlIGVsZW1lbnRcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICBzZXRBdHRyaWJ1dGUoXG4gICAgICBldmVudCxcbiAgICAgIChlOiBFdmVudCkgPT4ge1xuICAgICAgICBoYW5kbGVyKGUpO1xuXG4gICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBoYW5kbGVyIGlzIGRlZmluZWQsIGNhbGwgaXQgYWZ0ZXIgdGhlIG1vZGVsIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICAgICAgaWYgKHByZXZIYW5kbGVyKSB7XG4gICAgICAgICAgcHJldkhhbmRsZXIoZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB2bm9kZVxuICAgICk7XG4gIH0sXG5cbiAgXCJ2LWNsYXNzXCI6ICh2YWx1ZSwgdm5vZGUpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2bm9kZS5kb20uY2xhc3NOYW1lID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdm5vZGUuZG9tLmNsYXNzTmFtZSA9IHZhbHVlLmpvaW4oXCIgXCIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBjbGFzc0xpc3QgPSB2bm9kZS5kb20uY2xhc3NMaXN0O1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHR5cGVvZiB2YWx1ZVtuYW1lXSA9PT0gXCJmdW5jdGlvblwiID8gKHZhbHVlW25hbWVdIGFzIEZ1bmN0aW9uKSgpIDogdmFsdWVbbmFtZV07XG4gICAgICAgIGNsYXNzTGlzdC50b2dnbGUobmFtZSwgdmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gRnJlcXVlbnQgdXNlZCBwcm9wZXJ0aWVzXG4gIGNsYXNzKHZhbHVlLCB2bm9kZSkge1xuICAgIGlmICh2bm9kZS5kb20uY2xhc3NOYW1lICE9PSB2YWx1ZSkge1xuICAgICAgaWYgKHZub2RlLmlzU1ZHKSB7XG4gICAgICAgIHZub2RlLmRvbS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZub2RlLmRvbS5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgICB9XG4gIH0sXG5cbiAgY2xhc3NOYW1lKHZhbHVlLCB2bm9kZSkge1xuICAgIGRpcmVjdGl2ZXMuY2xhc3ModmFsdWUsIHZub2RlKTtcbiAgfSxcblxuICBpZDogKHZhbHVlLCB2bm9kZSkgPT4ge1xuICAgIGlmICh2bm9kZS5kb20uaWQgIT09IHZhbHVlKSB7XG4gICAgICBpZiAodm5vZGUuaXNTVkcpIHtcbiAgICAgICAgdm5vZGUuZG9tLnNldEF0dHJpYnV0ZShcImlkXCIsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdm5vZGUuZG9tLmlkID0gdmFsdWU7XG4gICAgfVxuICB9LFxuXG4gIHN0eWxlOiAodmFsdWUsIHZub2RlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKHZub2RlLmlzU1ZHKSB7XG4gICAgICAgIHZub2RlLmRvbS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZub2RlLmRvbS5zdHlsZSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAodm5vZGUuaXNTVkcpIHtcbiAgICAgICAgdm5vZGUuZG9tLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGUuZG9tLnN0eWxlID0gXCJcIjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRvbVN0eWxlID0gdm5vZGUuZG9tLnN0eWxlO1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIHZhbHVlKSB7XG4gICAgICAgIGRvbVN0eWxlW25hbWVdID0gdmFsdWVbbmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlyZWN0aXZlKG5hbWU6IHN0cmluZywgZGlyZWN0aXZlOiBEaXJlY3RpdmUpIHtcbiAgY29uc3QgZGlyZWN0aXZlTmFtZSA9IGB2LSR7bmFtZX1gO1xuICBkaXJlY3RpdmVzW2RpcmVjdGl2ZU5hbWVdID0gZGlyZWN0aXZlO1xuICByZXNlcnZlZFByb3BzLmFkZChkaXJlY3RpdmVOYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3BOYW1lUmVzZXJ2ZWQobmFtZTogc3RyaW5nKSB7XG4gIHJlc2VydmVkUHJvcHMuYWRkKG5hbWUpO1xufVxuXG5jb25zdCBldmVudExpc3RlbmVyTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuZnVuY3Rpb24gZXZlbnRMaXN0ZW5lcihlOiBFdmVudCkge1xuICBjdXJyZW50LmV2ZW50ID0gZTtcbiAgbGV0IGRvbSA9IGUudGFyZ2V0IGFzIERvbUVsZW1lbnQ7XG4gIGNvbnN0IG5hbWUgPSBgb24ke2UudHlwZX1gO1xuXG4gIHdoaWxlIChkb20pIHtcbiAgICBjb25zdCBvbGRWbm9kZSA9IGRvbS52bm9kZSBhcyBWbm9kZVdpdGhEb207XG4gICAgaWYgKG9sZFZub2RlICYmIG9sZFZub2RlLnByb3BzW25hbWVdKSB7XG4gICAgICBvbGRWbm9kZS5wcm9wc1tuYW1lXShlLCBvbGRWbm9kZSk7XG5cbiAgICAgIGlmICghZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICB1cGRhdGUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZG9tID0gZG9tLnBhcmVudE5vZGUgYXMgRG9tRWxlbWVudDtcbiAgfVxuXG4gIGN1cnJlbnQuZXZlbnQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBzaGFyZWRTZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBuZXdWbm9kZTogVm5vZGVXaXRoRG9tKTogdm9pZCB8IGJvb2xlYW4ge1xuICBjb25zdCBuZXdWbm9kZURvbSA9IG5ld1Zub2RlLmRvbTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaWYgKCFldmVudExpc3RlbmVyTmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAvLyBXZSBhdHRhY2ggdGhlIGRlbGVnYXRlZCBldmVudCBsaXN0ZW5lciB0byB0aGUgbWFpbiB2bm9kZSBkb20gZWxlbWVudCwgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgdGhlIGNvbXBvbmVudFxuICAgICAgKG1haW5Wbm9kZSBhcyBWbm9kZVdpdGhEb20pLmRvbS5hZGRFdmVudExpc3RlbmVyKG5hbWUuc2xpY2UoMiksIGV2ZW50TGlzdGVuZXIpO1xuICAgICAgZXZlbnRMaXN0ZW5lck5hbWVzLmFkZChuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFuZXdWbm9kZS5pc1NWRyAmJiBuYW1lIGluIG5ld1Zub2RlRG9tKSB7XG4gICAgbmV3Vm5vZGVEb21bbmFtZV0gPSB2YWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgbmV3Vm5vZGVEb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9IGVsc2Uge1xuICAgIG5ld1Zub2RlRG9tLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG5ld1Zub2RlOiBWbm9kZVdpdGhEb20pOiB2b2lkIHtcbiAgaWYgKCFyZXNlcnZlZFByb3BzLmhhcyhuYW1lKSkge1xuICAgIG5ld1Zub2RlLnByb3BzW25hbWVdID0gdmFsdWU7XG4gICAgc2hhcmVkU2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlLCBuZXdWbm9kZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pOiB2b2lkIHtcbiAgY29uc3Qgdm5vZGVEb20gPSBuZXdWbm9kZS5kb207XG4gIGNvbnN0IHZub2RlUHJvcHMgPSBuZXdWbm9kZS5wcm9wcztcbiAgdm5vZGVEb20udm5vZGUgPSBuZXdWbm9kZTtcblxuICBpZiAob2xkVm5vZGUpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gb2xkVm5vZGUucHJvcHMpIHtcbiAgICAgIGlmIChuYW1lIGluIHZub2RlUHJvcHMgPT09IGZhbHNlICYmICFldmVudExpc3RlbmVyTmFtZXMuaGFzKG5hbWUpICYmICFyZXNlcnZlZFByb3BzLmhhcyhuYW1lKSkge1xuICAgICAgICBpZiAoIW5ld1Zub2RlLmlzU1ZHICYmIG5hbWUgaW4gdm5vZGVEb20pIHtcbiAgICAgICAgICB2bm9kZURvbVtuYW1lXSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm5vZGVEb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBuYW1lIGluIHZub2RlUHJvcHMpIHtcbiAgICBpZiAoZGlyZWN0aXZlc1tuYW1lXSkge1xuICAgICAgaWYgKGRpcmVjdGl2ZXNbbmFtZV0odm5vZGVQcm9wc1tuYW1lXSwgbmV3Vm5vZGUsIG9sZFZub2RlPy5wcm9wcykgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNlcnZlZFByb3BzLmhhcyhuYW1lKSkge1xuICAgICAgc2hhcmVkU2V0QXR0cmlidXRlKG5hbWUsIHZub2RlUHJvcHNbbmFtZV0sIG5ld1Zub2RlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnOiBzdHJpbmcsIGlzU1ZHOiBib29sZWFuKTogRG9tRWxlbWVudCB7XG4gIHJldHVybiBpc1NWR1xuICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdGFnKVxuICAgIDogKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKSBhcyBEb21FbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gZmxhdFRyZWUobmV3Vm5vZGU6IFZub2RlV2l0aERvbSkge1xuICBsZXQgaSA9IDA7XG4gIGxldCBjaGlsZHJlbjogQ2hpbGRyZW47XG5cbiAgaWYgKFwidi1mb3JcIiBpbiBuZXdWbm9kZS5wcm9wcyA9PT0gZmFsc2UpIHtcbiAgICBjaGlsZHJlbiA9IFsuLi5uZXdWbm9kZS5jaGlsZHJlbl07XG4gIH0gZWxzZSB7XG4gICAgY2hpbGRyZW4gPSBbXTtcbiAgICBjb25zdCBzZXQgPSBuZXdWbm9kZS5wcm9wc1tcInYtZm9yXCJdO1xuICAgIGNvbnN0IGwgPSBzZXQubGVuZ3RoO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gbmV3Vm5vZGUuY2hpbGRyZW5bMF07XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUud2FybihcInYtZm9yIGRpcmVjdGl2ZSBtdXN0IGhhdmUgYSBjYWxsYmFjayBmdW5jdGlvbiBhcyBjaGlsZHJlblwiKTtcbiAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgY2hpbGRyZW5baV0gPSBjYWxsYmFjayhzZXRbaV0sIGkpO1xuICAgIH1cbiAgfVxuXG4gIG5ld1Zub2RlLm9sZENoaWxkQ29tcG9uZW50cyA9IG5ld1Zub2RlLmNoaWxkQ29tcG9uZW50cztcbiAgaWYgKG5ld1Zub2RlLmNoaWxkQ29tcG9uZW50cykge1xuICAgIG5ld1Zub2RlLmNoaWxkQ29tcG9uZW50cyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHdoaWxlIChpIDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3Q2hpbGQgPSBjaGlsZHJlbltpXTtcblxuICAgIGlmIChuZXdDaGlsZCA9PSBudWxsKSB7XG4gICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdDaGlsZCkpIHtcbiAgICAgIGNoaWxkcmVuLnNwbGljZShpLCAxLCAuLi5uZXdDaGlsZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobmV3Q2hpbGQgaW5zdGFuY2VvZiBWbm9kZSkge1xuICAgICAgbmV3Q2hpbGQucHJvcHMgPSBuZXdDaGlsZC5wcm9wcyB8fCB7fTtcbiAgICAgIG5ld0NoaWxkLmlzU1ZHID0gbmV3Vm5vZGUuaXNTVkcgfHwgbmV3Q2hpbGQudGFnID09PSBcInN2Z1wiO1xuXG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkLnRhZyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSAoY3VycmVudC5jb21wb25lbnQgPSBuZXdDaGlsZC50YWcpO1xuICAgICAgICBuZXdWbm9kZS5jaGlsZENvbXBvbmVudHMgPSBuZXdWbm9kZS5jaGlsZENvbXBvbmVudHMgfHwgbmV3IFNldCgpO1xuICAgICAgICBuZXdWbm9kZS5jaGlsZENvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7XG5cbiAgICAgICAgY2hpbGRyZW5baV0gPSAoaXNQT0pPQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQudmlldyA6IGNvbXBvbmVudCkuYmluZChjb21wb25lbnQpKFxuICAgICAgICAgIG5ld0NoaWxkLnByb3BzLFxuICAgICAgICAgIG5ld0NoaWxkLmNoaWxkcmVuXG4gICAgICAgICk7XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIG5ld1Zub2RlLmhhc0tleXMgPSBuZXdWbm9kZS5oYXNLZXlzIHx8IFwia2V5XCIgaW4gbmV3Q2hpbGQucHJvcHM7XG4gICAgfVxuXG4gICAgaSsrO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzTmV3Q2hpbGQobmV3Q2hpbGQ6IFZub2RlV2l0aERvbSwgcGFyZW50Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkRG9tPzogRG9tRWxlbWVudCkge1xuICBpZiAob2xkRG9tKSB7XG4gICAgbmV3Q2hpbGQuZG9tID0gY3JlYXRlRWxlbWVudChuZXdDaGlsZC50YWcsIG5ld0NoaWxkLmlzU1ZHIGFzIGJvb2xlYW4pO1xuICAgIHBhcmVudFZub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuZG9tLCBvbGREb20pO1xuICB9IGVsc2Uge1xuICAgIG5ld0NoaWxkLmRvbSA9IHBhcmVudFZub2RlLmRvbS5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KG5ld0NoaWxkLnRhZywgbmV3Q2hpbGQuaXNTVkcgYXMgYm9vbGVhbikpO1xuICB9XG4gIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Q2hpbGQpO1xuICBpZiAoXCJ2LXRleHRcIiBpbiBuZXdDaGlsZC5wcm9wcykge1xuICAgIG5ld0NoaWxkLmRvbS50ZXh0Q29udGVudCA9IG5ld0NoaWxkLnByb3BzW1widi10ZXh0XCJdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGN1cnJlbnQub2xkVm5vZGUgPSBudWxsO1xuICBjdXJyZW50LnZub2RlID0gbmV3Q2hpbGQ7XG5cbiAgY29uc3QgY2hpbGRyZW4gPSBmbGF0VHJlZShuZXdDaGlsZCk7XG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICBuZXdDaGlsZC5kb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgVm5vZGUgPT09IGZhbHNlKSB7XG4gICAgICBuZXdDaGlsZC5kb20uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGRyZW5baV0pKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwcm9jZXNzTmV3Q2hpbGQoY2hpbGRyZW5baV0gYXMgVm5vZGVXaXRoRG9tLCBuZXdDaGlsZCk7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIHBhdGNoKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlOiBWbm9kZVdpdGhEb20gfCBudWxsKTogdm9pZCB7XG4gIGN1cnJlbnQub2xkVm5vZGUgPSBvbGRWbm9kZTtcbiAgY3VycmVudC52bm9kZSA9IG5ld1Zub2RlO1xuICBjb25zdCBjaGlsZHJlbiA9IGZsYXRUcmVlKG5ld1Zub2RlKTtcbiAgY29uc3QgZG9tID0gbmV3Vm5vZGUuZG9tO1xuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoZG9tLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICBkb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIH1cbiAgICAvLyBUaGVyZSBhcmUgbm8gY2hpbGRyZW4gc28gd2UgZG9uJ3QgbmVlZCB0byBjYWxsIHRoZSBvbmNyZWF0ZSBhbmQgb251cGRhdGUgY2FsbGJhY2tzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2hpbGROb2RlcyA9IGRvbS5jaGlsZE5vZGVzIGFzIHVua25vd24gYXMgRG9tRWxlbWVudFtdO1xuICBjb25zdCBvbGRDaGlsZHJlbkxlbmd0aCA9IGNoaWxkTm9kZXMubGVuZ3RoO1xuICBjb25zdCBjaGlsZHJlbkxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgaWYgKG9sZENoaWxkcmVuTGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuZXdDaGlsZCA9IGNoaWxkcmVuW2ldIGFzIFZub2RlV2l0aERvbTtcbiAgICAgIGlmIChuZXdDaGlsZCBpbnN0YW5jZW9mIFZub2RlID09PSBmYWxzZSkge1xuICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwcm9jZXNzTmV3Q2hpbGQobmV3Q2hpbGQsIG5ld1Zub2RlKTtcbiAgICB9XG4gICAgLy8gVGhlIG9uY3JlYXRlIGNhbGxiYWNrIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZHJlbiBhcmUgY3JlYXRlZFxuICAgIG5ld1Zub2RlLm9uY3JlYXRlICYmIGNhbGxTZXQobmV3Vm5vZGUub25jcmVhdGUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBvbGRUcmVlID0gY2hpbGROb2RlcyBhcyB1bmtub3duIGFzIERvbUVsZW1lbnRbXTtcbiAgY29uc3Qgb2xkS2V5ZWRMaXN0OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbiAgaWYgKG5ld1Zub2RlLmhhc0tleXMpIHtcbiAgICBjb25zdCBuZXdPbGRUcmVlID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvbGRUcmVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbmV3T2xkVHJlZVtpXSA9IG9sZFRyZWVbaV07XG4gICAgICBjb25zdCBvbGRWbm9kZSA9IG9sZFRyZWVbaV0udm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICAgICAgb2xkS2V5ZWRMaXN0WyFvbGRWbm9kZSB8fCBcImtleVwiIGluIG9sZFZub2RlLnByb3BzID09PSBmYWxzZSA/IGkgOiAob2xkVm5vZGUucHJvcHMua2V5IGFzIHN0cmluZyldID0gaTtcbiAgICB9XG4gICAgb2xkVHJlZSA9IG5ld09sZFRyZWU7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IG5ld0NoaWxkID0gY2hpbGRyZW5baV0gYXMgVm5vZGVXaXRoRG9tO1xuXG4gICAgaWYgKG5ld0NoaWxkIGluc3RhbmNlb2YgVm5vZGUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBvbGRDaGlsZCA9IG9sZFRyZWVbaV07XG4gICAgICBpZiAoIW9sZENoaWxkKSB7XG4gICAgICAgIGRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdDaGlsZCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZENoaWxkLm5vZGVUeXBlICE9PSAzKSB7XG4gICAgICAgIGRvbS5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQpLCBvbGRDaGlsZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgICBpZiAob2xkQ2hpbGQubm9kZVZhbHVlICE9IG5ld0NoaWxkKSB7XG4gICAgICAgIG9sZENoaWxkLm5vZGVWYWx1ZSA9IG5ld0NoaWxkO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQ2hpbGQgPSBvbGRUcmVlW25ld1Zub2RlLmhhc0tleXMgPyBvbGRLZXllZExpc3RbKG5ld0NoaWxkLnByb3BzLmtleSBhcyBhbnkpIHx8IGldIDogaV0gYXMgRG9tRWxlbWVudDtcblxuICAgIGlmICghb2xkQ2hpbGQgfHwgbmV3Q2hpbGQudGFnICE9PSBvbGRDaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBwcm9jZXNzTmV3Q2hpbGQobmV3Q2hpbGQsIG5ld1Zub2RlLCBjaGlsZE5vZGVzW2ldIGFzIERvbUVsZW1lbnQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbmV3Q2hpbGQuZG9tID0gb2xkQ2hpbGQ7XG4gICAgY29uc3QgY3VycmVudENoaWxkID0gY2hpbGROb2Rlc1tpXTtcbiAgICBjb25zdCBvbGRDaGlsZFZub2RlID0gb2xkQ2hpbGQudm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICAgIGlmICghY3VycmVudENoaWxkKSB7XG4gICAgICBkb20uYXBwZW5kQ2hpbGQob2xkQ2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudENoaWxkICE9PSBvbGRDaGlsZCkge1xuICAgICAgZG9tLnJlcGxhY2VDaGlsZChvbGRDaGlsZCwgY3VycmVudENoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAoXCJ2LWtlZXBcIiBpbiBuZXdDaGlsZC5wcm9wcyAmJiBvbGRDaGlsZFZub2RlKSB7XG4gICAgICBpZiAob2xkQ2hpbGRWbm9kZS5wcm9wc1tcInYta2VlcFwiXSA9PT0gbmV3Q2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9sZFByb3BzID0gY2hpbGROb2Rlc1tpICsgMV0/LnZub2RlPy5wcm9wcztcbiAgICAgIGlmIChvbGRQcm9wcyAmJiBcImtleVwiIGluIG9sZFByb3BzID09PSBmYWxzZSAmJiBvbGRQcm9wc1tcInYta2VlcFwiXSA9PT0gbmV3Q2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgICAgb2xkQ2hpbGQucmVtb3ZlKCk7XG4gICAgICAgIG9sZFRyZWUuc3BsaWNlKGksIDEpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSwgb2xkQ2hpbGRWbm9kZSk7XG5cbiAgICBpZiAoXCJ2LXRleHRcIiBpbiBuZXdDaGlsZC5wcm9wcykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgICAgaWYgKG9sZENoaWxkLnRleHRDb250ZW50ICE9IG5ld0NoaWxkLnByb3BzW1widi10ZXh0XCJdKSB7XG4gICAgICAgIG9sZENoaWxkLnRleHRDb250ZW50ID0gbmV3Q2hpbGQucHJvcHNbXCJ2LXRleHRcIl07XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIHRoZSBjbGVhbnVwIGZvciB0aGUgb2xkIGNoaWxkIHZub2RlIGJlZm9yZSB0aGUgcGF0Y2hcbiAgICBjYWxsU2V0KG9sZENoaWxkVm5vZGU/Lm9uY2xlYW51cCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgcGF0Y2gobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tLCBvbGRDaGlsZFZub2RlIHx8IG51bGwpO1xuICAgIC8vIENhbGwgdGhlIHJlbW92ZSBmb3IgdGhlIG9sZCBjaGlsZCB2bm9kZSBhZnRlciB0aGUgcGF0Y2hcbiAgICBjYWxsU2V0KG9sZENoaWxkVm5vZGU/Lm9ucmVtb3ZlKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSBjaGlsZE5vZGVzLmxlbmd0aCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA+IGw7IGktLSkge1xuICAgIGNoaWxkTm9kZXNbaSAtIDFdLnJlbW92ZSgpO1xuICB9XG5cbiAgLy8gSW4gaGVyZSB3ZSBjb3VsZCBoYXZlIG5ldyBjaGlsZHJlbiBvci9hbmQgcGF0Y2hlZCBjaGlsZHJlblxuICAvLyBTbyB3ZSBuZWVkIHRvIGNhbGwgdGhlIG9uY3JlYXRlIGFuZCBvbnVwZGF0ZSBjYWxsYmFja3NcbiAgY2FsbFNldChuZXdWbm9kZS5vbmNyZWF0ZSk7XG4gIGNhbGxTZXQobmV3Vm5vZGUub251cGRhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVm5vZGUodm5vZGU6IFZub2RlV2l0aERvbSwgc2hvdWxkQ2xlYW51cCA9IHRydWUpOiBzdHJpbmcgfCB2b2lkIHtcbiAgdm5vZGUucHJvcHMgPSB2bm9kZS5wcm9wcyB8fCB7fTtcbiAgaWYgKHNob3VsZENsZWFudXApIHtcbiAgICAvLyBUaGUgY2xlYW4gdXAgbXVzdCBiZSBmcm9tIHRoZSBvbGQgdm5vZGVcbiAgICAvLyBhbmQgaW4gaGVyZSB0aGUgdm5vZGUgaXMgdGhlIG9sZCBvbmVcbiAgICAvLyBzbywgd2UgbmVlZCB0byBjYWxsIHRoZSBjbGVhbnVwIGJlZm9yZSB0aGUgcGF0Y2hcbiAgICAvLyBpbnNpZGUgIHRoZSBwYXRjaCB0aGUgY2xlYW4gdXAgd2lsbCBiZSBjYWxsZWQgb25seSBmb3IgdGhlIG9sZCBjaGlsZHJlblxuICAgIGNhbGxTZXQodm5vZGUub25jbGVhbnVwKTtcbiAgfVxuICAvLyBDbG9uZSB0aGUgb2xkIG9uIHJlbW92ZSBzZXQgdG8gY2FsbCBpdCBhZnRlciB0aGUgcGF0Y2hcbiAgY29uc3Qgb2xkT25SZW1vdmVTZXQgPSB2bm9kZS5vbnJlbW92ZSA/IG5ldyBTZXQodm5vZGUub25yZW1vdmUpIDogbnVsbDtcbiAgY3VycmVudC52bm9kZSA9IHZub2RlO1xuICBwYXRjaCh2bm9kZSwgc2hvdWxkQ2xlYW51cCA/IHZub2RlIDogbnVsbCk7XG4gIC8vIENhbGwgdGhlIG9sZCBvbiByZW1vdmUgc2V0XG4gIGNhbGxTZXQob2xkT25SZW1vdmVTZXQpO1xuICBpc01vdW50ZWQgPSB0cnVlO1xuICBjdXJyZW50Lm9sZFZub2RlID0gbnVsbDtcbiAgY3VycmVudC52bm9kZSA9IG51bGw7XG4gIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZSgpOiBzdHJpbmcge1xuICBpZiAobWFpblZub2RlKSB7XG4gICAgbWFpblZub2RlLmNoaWxkcmVuID0gW21haW5Db21wb25lbnRdO1xuICAgIC8vIElmIHRoZSB1cGRhdGVWbm9kZSBtZXRob2QgaXMgY2FsbGVkIGZyb20gb3V0c2lkZSB0aGUgbWFpbiBsaWIgKGUuZy4gZnJvbSBhIGRpcmVjdGl2ZSlcbiAgICAvLyBpdCBhbHdheXMgYmUgY29uc2lkZXJlZCBhcyBtb3VudGVkLCBzbyB0aGUgY2xlYW51cCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHBhdGNoXG4gICAgLy8gQnV0IGluIGhlcmUsIHdlIG5lZWQgdG8gcGFzcyB0aGUgc2hvdWxkQ2xlYW51cCBhcyBmYWxzZSBpZiB0aGUgYXBwIGlzIG5vdCBtb3VudGVkXG4gICAgdXBkYXRlVm5vZGUobWFpblZub2RlIGFzIFZub2RlV2l0aERvbSwgaXNNb3VudGVkKTtcbiAgICBpZiAoaXNOb2RlSnMpIHtcbiAgICAgIHJldHVybiBtYWluVm5vZGUuZG9tLmlubmVySFRNTDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59XG5cbmxldCBkZWJvdW5jZWRVcGRhdGVUaW1lb3V0OiBhbnk7XG5jb25zdCBkZWJvdW5jZWRVcGRhdGVNZXRob2QgPSBpc05vZGVKcyA/IHVwZGF0ZSA6ICgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGUpO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2VkVXBkYXRlKHRpbWVvdXQgPSA0Mikge1xuICBpZiAoY3VycmVudC5ldmVudCkge1xuICAgIGN1cnJlbnQuZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICBjbGVhclRpbWVvdXQoZGVib3VuY2VkVXBkYXRlVGltZW91dCk7XG4gIGRlYm91bmNlZFVwZGF0ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGRlYm91bmNlZFVwZGF0ZU1ldGhvZCwgdGltZW91dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bm1vdW50KCkge1xuICBpZiAobWFpblZub2RlKSB7XG4gICAgbWFpbkNvbXBvbmVudCA9IHYoKCkgPT4gbnVsbCwge30pIGFzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHVwZGF0ZSgpO1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBldmVudExpc3RlbmVyTmFtZXMpIHtcbiAgICAgIG1haW5Wbm9kZS5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIGV2ZW50TGlzdGVuZXIpO1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShldmVudExpc3RlbmVyTmFtZXMsIG5hbWUpO1xuICAgIH1cblxuICAgIGNhbGxTZXQobWFpblZub2RlLm9ucmVtb3ZlKTtcblxuICAgIG1haW5Db21wb25lbnQgPSBudWxsO1xuICAgIG1haW5Wbm9kZSA9IG51bGw7XG4gICAgaXNNb3VudGVkID0gZmFsc2U7XG4gICAgY3VycmVudC52bm9kZSA9IG51bGw7XG4gICAgY3VycmVudC5jb21wb25lbnQgPSBudWxsO1xuICAgIGN1cnJlbnQuZXZlbnQgPSBudWxsO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gXCJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vdW50KGRvbTogc3RyaW5nIHwgRG9tRWxlbWVudCwgY29tcG9uZW50OiBWYWx5cmlhbkNvbXBvbmVudCB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIHwgYW55KSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9XG4gICAgdHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIiA/IChpc05vZGVKcyA/IGNyZWF0ZUVsZW1lbnQoZG9tLCBkb20gPT09IFwic3ZnXCIpIDogZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihkb20pKSA6IGRvbTtcblxuICBpZiAoaXNDb21wb25lbnQoY29tcG9uZW50KSkge1xuICAgIG1haW5Db21wb25lbnQgPSB2KGNvbXBvbmVudCwge30sIFtdKSBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgfSBlbHNlIGlmIChpc1Zub2RlQ29tcG9uZW50KGNvbXBvbmVudCkpIHtcbiAgICBtYWluQ29tcG9uZW50ID0gY29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIG1haW5Db21wb25lbnQgPSB2KCgpID0+IGNvbXBvbmVudCwge30sIFtdKSBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgfVxuXG4gIG1haW5Wbm9kZSA9IGhpZHJhdGVEb21Ub1Zub2RlKGNvbnRhaW5lcikgYXMgVm5vZGVXaXRoRG9tO1xuICByZXR1cm4gdXBkYXRlKCk7XG59XG4iXSwibWFwcGluZ3MiOiJNQXdDTyxJQUFNQSxFQUFXQyxRQUEyQixvQkFBWkMsU0FBMkJBLFFBQVFDLFVBQVlELFFBQVFDLFNBQVNDLE1BRTFGQyxFQUFOLE1BQ0wsV0FBQUMsQ0FDU0MsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsR0FYQUMsS0FBQVos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