valyrian.js 6.0.3 → 6.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2,7 +2,6 @@
2
2
  var ComponentString = "__component__";
3
3
  var TextString = "#text";
4
4
  var isNodeJs = Boolean(typeof process !== "undefined" && process.versions && process.versions.node);
5
- var ValyrianSymbol = Symbol("Valyrian");
6
5
  var Und = void 0;
7
6
  var Vnode = function Vnode2(tag, props, children) {
8
7
  this.props = props;
@@ -22,18 +21,26 @@ function createDomElement(tag, isSVG = false) {
22
21
  return isSVG ? document.createElementNS("http://www.w3.org/2000/svg", tag) : document.createElement(tag);
23
22
  }
24
23
  function domToVnode(dom) {
25
- let vnode = v(dom.tagName.toLowerCase(), {}, ...Array.from(dom.childNodes).filter((child) => child.nodeType === 1 || child.nodeType === 3).map((child) => {
26
- if (child.nodeType === 1) {
27
- return domToVnode(child);
24
+ if (dom.nodeType === 3) {
25
+ let vnode = v(TextString, {}, []);
26
+ vnode.nodeValue = dom.nodeValue;
27
+ vnode.dom = dom;
28
+ return vnode;
29
+ }
30
+ if (dom.nodeType === 1) {
31
+ let children = [];
32
+ for (let i = 0; i < dom.childNodes.length; i++) {
33
+ let child = domToVnode(dom.childNodes[i]);
34
+ if (child) {
35
+ children.push(child);
36
+ }
28
37
  }
29
- let text = new Vnode(TextString, {}, []);
30
- text.nodeValue = String(child.nodeValue);
31
- text.dom = child;
32
- return text;
33
- }));
34
- [].forEach.call(dom.attributes, (prop) => vnode.props[prop.nodeName] = prop.nodeValue);
35
- vnode.dom = dom;
36
- return vnode;
38
+ let props = {};
39
+ [].forEach.call(dom.attributes, (prop) => props[prop.nodeName] = prop.nodeValue);
40
+ let vnode = v(dom.tagName.toLowerCase(), props, ...children);
41
+ vnode.dom = dom;
42
+ return vnode;
43
+ }
37
44
  }
38
45
  var trust = (htmlString) => {
39
46
  let div = createDomElement("div");
@@ -55,25 +62,44 @@ var reservedProps = {
55
62
  "v-class": true,
56
63
  "v-html": true
57
64
  };
65
+ var eventListenerNames = {};
66
+ var onCleanupList = [];
67
+ var onMountList = [];
68
+ var onUpdateList = [];
69
+ var onUnmountList = [];
58
70
  var current = {};
71
+ function eventListener(e) {
72
+ let dom = e.target;
73
+ let name = `v-on${e.type}`;
74
+ while (dom) {
75
+ if (dom[name]) {
76
+ dom[name](e, dom);
77
+ if (!e.defaultPrevented) {
78
+ update();
79
+ }
80
+ return;
81
+ }
82
+ dom = dom.parentNode;
83
+ }
84
+ }
59
85
  function onCleanup(callback) {
60
- if (current.app?.onCleanup.indexOf(callback) === -1) {
61
- current.app?.onCleanup.push(callback);
86
+ if (onCleanupList.indexOf(callback) === -1) {
87
+ onCleanupList.push(callback);
62
88
  }
63
89
  }
64
90
  function onUnmount(callback) {
65
- if (current.app?.onUnmount.indexOf(callback) === -1) {
66
- current.app?.onUnmount.push(callback);
91
+ if (onUnmountList.indexOf(callback) === -1) {
92
+ onUnmountList.push(callback);
67
93
  }
68
94
  }
69
95
  function onMount(callback) {
70
- if (current.app?.onMount.indexOf(callback) === -1) {
71
- current.app?.onMount.push(callback);
96
+ if (onMountList.indexOf(callback) === -1) {
97
+ onMountList.push(callback);
72
98
  }
73
99
  }
74
100
  function onUpdate(callback) {
75
- if (current.app?.onUpdate.indexOf(callback) === -1) {
76
- current.app?.onUpdate.push(callback);
101
+ if (onUpdateList.indexOf(callback) === -1) {
102
+ onUpdateList.push(callback);
77
103
  }
78
104
  }
79
105
  function mount(container, component) {
@@ -94,102 +120,54 @@ function mount(container, component) {
94
120
  } else {
95
121
  throw new Error("Component must be a Valyrian Component or a Vnode component");
96
122
  }
97
- if (component[ValyrianSymbol]) {
98
- unmount(component);
99
- } else {
100
- let eventListener = function(e) {
101
- let dom = e.target;
102
- let name = `v-on${e.type}`;
103
- while (dom) {
104
- if (dom[name]) {
105
- dom[name](e, dom);
106
- if (!e.defaultPrevented) {
107
- update(component);
108
- }
109
- return;
110
- }
111
- dom = dom.parentNode;
112
- }
113
- };
114
- component[ValyrianSymbol] = {
115
- isMounted: false,
116
- eventListenerNames: {},
117
- onCleanup: [],
118
- onMount: [],
119
- onUpdate: [],
120
- onUnmount: []
121
- };
122
- component[ValyrianSymbol].eventListener = eventListener;
123
- }
124
- component[ValyrianSymbol].component = vnodeComponent;
125
- component[ValyrianSymbol].container = appContainer;
126
- component[ValyrianSymbol].mainVnode = domToVnode(appContainer);
127
- return update(component);
128
- }
129
- function callCleanup(valyrianApp) {
130
- for (let i = 0; i < valyrianApp.onCleanup.length; i++) {
131
- valyrianApp.onCleanup[i]();
132
- }
133
- valyrianApp.onCleanup = [];
134
- }
135
- function callUnmount(valyrianApp) {
136
- for (let i = 0; i < valyrianApp.onUnmount.length; i++) {
137
- valyrianApp.onUnmount[i]();
138
- }
139
- valyrianApp.onUnmount = [];
140
- }
141
- function callMount(valyrianApp) {
142
- for (let i = 0; i < valyrianApp.onMount.length; i++) {
143
- valyrianApp.onMount[i]();
123
+ if (v.isMounted) {
124
+ unmount();
144
125
  }
145
- valyrianApp.onMount = [];
126
+ v.component = vnodeComponent;
127
+ v.container = appContainer;
128
+ v.mainVnode = domToVnode(appContainer);
129
+ return update();
146
130
  }
147
- function callUpdate(valyrianApp) {
148
- for (let i = 0; i < valyrianApp.onUpdate.length; i++) {
149
- valyrianApp.onUpdate[i]();
131
+ function callCallbackList(list) {
132
+ for (let i = 0; i < list.length; i++) {
133
+ list[i]();
150
134
  }
151
- valyrianApp.onUpdate = [];
135
+ list = [];
152
136
  }
153
- function update(component) {
154
- if (component && component[ValyrianSymbol]) {
155
- let valyrianApp = component[ValyrianSymbol];
156
- current.app = valyrianApp;
157
- valyrianApp.onCleanup.length && callCleanup(valyrianApp);
158
- let oldVnode = valyrianApp.mainVnode;
159
- valyrianApp.mainVnode = new Vnode(valyrianApp.mainVnode.tag, valyrianApp.mainVnode.props, [valyrianApp.component]);
160
- valyrianApp.mainVnode.dom = oldVnode.dom;
161
- patch(valyrianApp.mainVnode, oldVnode, valyrianApp);
137
+ function update() {
138
+ if (v.component && v.mainVnode) {
139
+ onCleanupList.length && callCallbackList(onCleanupList);
140
+ let oldVnode = v.mainVnode;
141
+ v.mainVnode = new Vnode(v.mainVnode.tag, v.mainVnode.props, [v.component]);
142
+ v.mainVnode.dom = oldVnode.dom;
143
+ patch(v.mainVnode, oldVnode);
162
144
  oldVnode = null;
163
- if (valyrianApp.isMounted === false) {
164
- valyrianApp.onMount.length && callMount(valyrianApp);
165
- valyrianApp.isMounted = true;
145
+ if (v.isMounted === false) {
146
+ onMountList.length && callCallbackList(onMountList);
147
+ v.isMounted = true;
166
148
  } else {
167
- valyrianApp.onUpdate.length && callUpdate(valyrianApp);
149
+ onUpdateList.length && callCallbackList(onUpdateList);
168
150
  }
169
151
  if (isNodeJs) {
170
- return valyrianApp.mainVnode.dom.innerHTML;
152
+ return v.mainVnode.dom.innerHTML;
171
153
  }
172
154
  }
173
155
  }
174
- function unmount(component) {
175
- if (!component || !component[ValyrianSymbol]) {
176
- return;
177
- }
178
- let valyrianApp = component[ValyrianSymbol];
179
- if (valyrianApp.isMounted) {
180
- valyrianApp.onCleanup.length && callCleanup(valyrianApp);
181
- valyrianApp.onUnmount.length && callUnmount(valyrianApp);
182
- let oldVnode = valyrianApp.mainVnode;
183
- valyrianApp.mainVnode = new Vnode(valyrianApp.mainVnode.tag, valyrianApp.mainVnode.props, []);
184
- valyrianApp.mainVnode.dom = oldVnode.dom;
185
- valyrianApp.mainVnode.isSVG = oldVnode.isSVG;
186
- patch(valyrianApp.mainVnode, oldVnode, valyrianApp);
156
+ function unmount() {
157
+ if (v.isMounted && v.mainVnode && v.component) {
158
+ onCleanupList.length && callCallbackList(onCleanupList);
159
+ onUnmountList.length && callCallbackList(onUnmountList);
160
+ let oldVnode = v.mainVnode;
161
+ v.mainVnode = new Vnode(v.mainVnode.tag, v.mainVnode.props, []);
162
+ v.mainVnode.dom = oldVnode.dom;
163
+ v.mainVnode.isSVG = oldVnode.isSVG;
164
+ patch(v.mainVnode, oldVnode);
187
165
  oldVnode = null;
166
+ v.component = null;
167
+ v.isMounted = false;
188
168
  if (isNodeJs) {
189
- return valyrianApp.mainVnode.dom.innerHTML;
169
+ return v.mainVnode.dom.innerHTML;
190
170
  }
191
- valyrianApp = null;
192
- Reflect.deleteProperty(component, ValyrianSymbol);
193
171
  }
194
172
  }
195
173
  var emptyVnode = new Vnode("__empty__", {}, []);
@@ -207,10 +185,9 @@ function sharedSetAttribute(prop, value, vnode, oldVnode) {
207
185
  return;
208
186
  }
209
187
  if (typeof value === "function") {
210
- let valyrianApp = current.app;
211
- if (prop in valyrianApp.eventListenerNames === false) {
212
- valyrianApp.eventListenerNames[prop] = true;
213
- valyrianApp.container.addEventListener(prop.slice(2), valyrianApp.eventListener);
188
+ if (prop in eventListenerNames === false) {
189
+ eventListenerNames[prop] = true;
190
+ v.container.addEventListener(prop.slice(2), eventListener);
214
191
  }
215
192
  vnode.dom[`v-${prop}`] = value;
216
193
  return;
@@ -251,7 +228,7 @@ function setAttributes(vnode, oldVnode) {
251
228
  }
252
229
  }
253
230
  }
254
- function patch(newVnode, oldVnode = emptyVnode, valyrianApp) {
231
+ function patch(newVnode, oldVnode = emptyVnode) {
255
232
  current.vnode = newVnode;
256
233
  current.oldVnode = oldVnode === emptyVnode ? Und : oldVnode;
257
234
  let newTree = newVnode.children;
@@ -307,7 +284,7 @@ function patch(newVnode, oldVnode = emptyVnode, valyrianApp) {
307
284
  shouldPatch = false;
308
285
  } else {
309
286
  setAttributes(childVnode, oldChildVnode);
310
- if (valyrianApp.isMounted) {
287
+ if (v.isMounted) {
311
288
  childVnode.props.onupdate && childVnode.props.onupdate(childVnode, oldChildVnode);
312
289
  } else {
313
290
  childVnode.props.oncreate && childVnode.props.oncreate(childVnode);
@@ -324,7 +301,7 @@ function patch(newVnode, oldVnode = emptyVnode, valyrianApp) {
324
301
  oldTree[i] && newKeyedList[oldTree[i].props.key] === Und && onremove(oldTree[i]);
325
302
  newVnode.dom.replaceChild(childVnode.dom, newVnode.dom.childNodes[i]);
326
303
  }
327
- shouldPatch && patch(childVnode, oldChildVnode, valyrianApp);
304
+ shouldPatch && patch(childVnode, oldChildVnode);
328
305
  }
329
306
  for (let i = newTreeLength; i < oldTreeLength; i++) {
330
307
  if (newKeyedList[oldTree[i].props.key] === Und) {
@@ -359,12 +336,12 @@ function patch(newVnode, oldVnode = emptyVnode, valyrianApp) {
359
336
  continue;
360
337
  }
361
338
  setAttributes(newChildVnode, oldChildVnode);
362
- if (valyrianApp.isMounted) {
339
+ if (v.isMounted) {
363
340
  newChildVnode.props.onupdate && newChildVnode.props.onupdate(newChildVnode, oldChildVnode);
364
341
  } else {
365
342
  newChildVnode.props.oncreate && newChildVnode.props.oncreate(newChildVnode);
366
343
  }
367
- patch(newChildVnode, oldChildVnode, valyrianApp);
344
+ patch(newChildVnode, oldChildVnode);
368
345
  continue;
369
346
  }
370
347
  newChildVnode.dom = createDomElement(newChildVnode.tag, newChildVnode.isSVG);
@@ -372,7 +349,7 @@ function patch(newVnode, oldVnode = emptyVnode, valyrianApp) {
372
349
  oldChildVnode.tag !== TextString && onremove(oldChildVnode);
373
350
  newChildVnode.props.oncreate && newChildVnode.props.oncreate(newChildVnode);
374
351
  newVnode.dom.replaceChild(newChildVnode.dom, oldChildVnode.dom);
375
- patch(newChildVnode, emptyVnode, valyrianApp);
352
+ patch(newChildVnode, emptyVnode);
376
353
  continue;
377
354
  }
378
355
  if (newChildVnode.tag === TextString) {
@@ -384,7 +361,7 @@ function patch(newVnode, oldVnode = emptyVnode, valyrianApp) {
384
361
  setAttributes(newChildVnode);
385
362
  newVnode.dom.appendChild(newChildVnode.dom);
386
363
  newChildVnode.props.oncreate && newChildVnode.props.oncreate(newChildVnode);
387
- patch(newChildVnode, emptyVnode, valyrianApp);
364
+ patch(newChildVnode, emptyVnode);
388
365
  }
389
366
  for (let i = newTreeLength; i < oldTreeLength; i++) {
390
367
  let oldChildVnode = oldTree[i];
@@ -542,6 +519,7 @@ v.reservedProps = reservedProps;
542
519
  v.isVnode = isVnode;
543
520
  v.isComponent = isComponent;
544
521
  v.isVnodeComponent = isVnodeComponent;
522
+ v.isMounted = false;
545
523
  v.isNodeJs = isNodeJs;
546
524
  v.trust = trust;
547
525
  v.onCleanup = onCleanup;
@@ -554,6 +532,7 @@ v.update = update;
554
532
  v.setAttribute = setAttribute;
555
533
  v.directive = directive;
556
534
  v.use = use;
535
+ var lib_default = v;
557
536
  export {
558
- v
537
+ lib_default as default
559
538
  };
package/dist/index.min.js CHANGED
@@ -1 +1 @@
1
- (()=>{var e="__component__",n="#text",o=Boolean("undefined"!=typeof process&&process.versions&&process.versions.node),t=Symbol("Valyrian"),r=void 0,i=function(e,n,o){this.props=n,this.children=o,this.tag=e};function p(e){return"function"==typeof e||"object"==typeof e&&null!==e&&"view"in e}function d(n){return n instanceof i&&n.tag===e}function l(e,n=!1){return n?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}function a(e){let o=U(e.tagName.toLowerCase(),{},...Array.from(e.childNodes).filter(e=>1===e.nodeType||3===e.nodeType).map(e=>{if(1===e.nodeType)return a(e);let o=new i(n,{},[]);return o.nodeValue=String(e.nodeValue),o.dom=e,o}));return[].forEach.call(e.attributes,e=>o.props[e.nodeName]=e.nodeValue),o.dom=e,o}var s=e=>{let n=l("div");return n.innerHTML=e.trim(),[].map.call(n.childNodes,e=>a(e))},u={key:!0,state:!0,oncreate:!0,onupdate:!0,onremove:!0,shouldupdate:!0,"v-once":!0,"v-if":!0,"v-unless":!0,"v-for":!0,"v-show":!0,"v-class":!0,"v-html":!0},c={};function m(e){for(let n=0;n<e.onCleanup.length;n++)e.onCleanup[n]();e.onCleanup=[]}function f(e){if(e&&e[t]){let n=e[t];c.app=n,n.onCleanup.length&&m(n);let r=n.mainVnode;if(n.mainVnode=new i(n.mainVnode.tag,n.mainVnode.props,[n.component]),n.mainVnode.dom=r.dom,w(n.mainVnode,r,n),r=null,!1===n.isMounted?(n.onMount.length&&function(e){for(let n=0;n<e.onMount.length;n++)e.onMount[n]();e.onMount=[]}(n),n.isMounted=!0):n.onUpdate.length&&function(e){for(let n=0;n<e.onUpdate.length;n++)e.onUpdate[n]();e.onUpdate=[]}(n),o)return n.mainVnode.dom.innerHTML}}function h(e){if(!e||!e[t])return;let n=e[t];if(n.isMounted){n.onCleanup.length&&m(n),n.onUnmount.length&&function(e){for(let n=0;n<e.onUnmount.length;n++)e.onUnmount[n]();e.onUnmount=[]}(n);let r=n.mainVnode;if(n.mainVnode=new i(n.mainVnode.tag,n.mainVnode.props,[]),n.mainVnode.dom=r.dom,n.mainVnode.isSVG=r.isSVG,w(n.mainVnode,r,n),r=null,o)return n.mainVnode.dom.innerHTML;n=null,Reflect.deleteProperty(e,t)}}var v=new i("__empty__",{},[]);function g(e){for(let o=0;o<e.children.length;o++)e.children[o].tag!==n&&g(e.children[o]);e.props.onremove&&e.props.onremove(e)}function V(e,n,o,t){if(u[e])return M[e]?M[e](o.props[e],o,t):void 0;if("function"==typeof n){let t=c.app;return e in t.eventListenerNames==!1&&(t.eventListenerNames[e]=!0,t.container.addEventListener(e.slice(2),t.eventListener)),void(o.dom[`v-${e}`]=n)}e in o.dom&&!1===o.isSVG?o.dom[e]!=n&&(o.dom[e]=n):t&&t.props[e]===n||(!1===n?o.dom.removeAttribute(e):o.dom.setAttribute(e,n))}function y(e,n,o,t){o.props[e]=n,V(e,n,o,t)}function C(e,n){for(let o in e.props)if(!1===V(o,e.props[o],e,n))return;if(n)for(let o in n.props)o in e.props==!1&&"function"!=typeof n.props[o]&&o in u==!1&&(o in n.dom&&!1===e.isSVG?n.dom[o]=null:n.dom.removeAttribute(o))}function w(o,t=v,p){c.vnode=o,c.oldVnode=t===v?r:t;let d=o.children,a=t.children;for(let t=0;t<d.length;t++){let p=d[t];if(p instanceof i){if(p.tag!==n){if(p.tag===e){let e=p.component;c.component=e;let n=("view"in e?e.view:e).call(e,p.props,...p.children);d.splice(t--,1,n);continue}p.isSVG=o.isSVG||"svg"===p.tag}}else Array.isArray(p)?d.splice(t--,1,...p):null===p||p===r?d.splice(t--,1):(d[t]=new i(n,{},[]),d[t].nodeValue=p)}let s=a.length,u=d.length;if(0!==u)if(s&&"key"in d[0].props&&"key"in a[0].props){let e={};for(let n=0;n<s;n++)e[a[n].props.key]=n;let n={};for(let e=0;e<u;e++)n[d[e].props.key]=e;for(let t=0;t<u;t++){let i=d[t],s=a[e[i.props.key]],u=!0;s?(i.dom=s.dom,"v-once"in i.props||i.props.shouldupdate&&!1===i.props.shouldupdate(i,s)?(i.children=s.children,u=!1):(C(i,s),p.isMounted?i.props.onupdate&&i.props.onupdate(i,s):i.props.oncreate&&i.props.oncreate(i))):(i.dom=l(i.tag,i.isSVG),C(i),i.props.oncreate&&i.props.oncreate(i)),o.dom.childNodes[t]===r?o.dom.appendChild(i.dom):o.dom.childNodes[t]!==i.dom&&(a[t]&&n[a[t].props.key]===r&&g(a[t]),o.dom.replaceChild(i.dom,o.dom.childNodes[t])),u&&w(i,s,p)}for(let e=u;e<s;e++)if(n[a[e].props.key]===r){let n=a[e];g(n),n.dom.parentNode&&n.dom.parentNode.removeChild(n.dom)}}else{for(let e=0;e<u;e++){let t=d[e];if(e<s){let r=a[e];if(t.tag===n){if(r.tag===n){t.dom=r.dom,t.dom.nodeValue!=t.nodeValue&&(t.dom.nodeValue=t.nodeValue);continue}t.dom=document.createTextNode(t.nodeValue),g(r),o.dom.replaceChild(t.dom,r.dom);continue}if(r.tag===t.tag){if(t.dom=r.dom,t.props["v-once"]||t.props.shouldupdate&&!1===t.props.shouldupdate(t,r)){t.children=r.children;continue}C(t,r),p.isMounted?t.props.onupdate&&t.props.onupdate(t,r):t.props.oncreate&&t.props.oncreate(t),w(t,r,p);continue}t.dom=l(t.tag,t.isSVG),C(t),r.tag!==n&&g(r),t.props.oncreate&&t.props.oncreate(t),o.dom.replaceChild(t.dom,r.dom),w(t,v,p)}else t.tag!==n?(t.dom=l(t.tag,t.isSVG),C(t),o.dom.appendChild(t.dom),t.props.oncreate&&t.props.oncreate(t),w(t,v,p)):(t.dom=document.createTextNode(t.nodeValue),o.dom.appendChild(t.dom))}for(let e=u;e<s;e++){let o=a[e];o.tag!==n&&g(o),o.dom.parentNode&&o.dom.parentNode.removeChild(o.dom)}}else{for(let e=0;e<s;e++)a[e].tag!==n&&g(a[e]);o.dom.textContent=""}}function N(e){return(o,t,r)=>{if(e?o:!o){let e=document.createTextNode("");return r&&r.dom&&r.dom.parentNode&&(r.tag!==n&&g(r),r.dom.parentNode.replaceChild(e,r.dom)),t.tag=n,t.children=[],t.props={},t.dom=e,!1}}}var M={"v-if":N(!1),"v-unless":N(!0),"v-for":(e,n)=>{n.children=e.map(n.children[0])},"v-show":(e,n)=>{n.dom.style.display=e?"":"none"},"v-class":(e,n)=>{for(let o in e)n.dom.classList.toggle(o,e[o])},"v-html":(e,n)=>{n.children=[s(e)]},"v-model":([e,n,o],t,r)=>{let i,p;if("input"===t.name)switch(o=o||"oninput",t.props.type){case"checkbox":Array.isArray(e[n])?(p=o=>{let t=o.target.value,r=e[n].indexOf(t);-1===r?e[n].push(t):e[n].splice(r,1)},i=-1!==e[n].indexOf(t.dom.value)):"value"in t.props?(p=()=>{e[n]===t.props.value?e[n]=null:e[n]=t.props.value},i=e[n]===t.props.value):(p=()=>e[n]=!e[n],i=e[n]),y("checked",i,t,r);break;case"radio":y("checked",e[n]===t.dom.value,t,r);break;default:y("value",e[n],t,r)}else"select"===t.name?(o=o||"onclick",t.props.multiple?(p=o=>{let t=o.target.value;if(o.ctrlKey){let o=e[n].indexOf(t);-1===o?e[n].push(t):e[n].splice(o,1)}else e[n].splice(0,e[n].length),e[n].push(t)},t.children.forEach(o=>{if("option"===o.tag){let t="value"in o.props?o.props.value:o.children.join("").trim();o.props.selected=-1!==e[n].indexOf(t)}})):t.children.forEach(o=>{if("option"===o.tag){let t="value"in o.props?o.props.value:o.children.join("").trim();o.props.selected=t===e[n]}})):"textarea"===t.name&&(o=o||"oninput",t.children=[e[n]]);t.props[o]||(p||(p=o=>e[n]=o.target.value),y(o,p,t,r))}},x=new Map;var U=function(e,n,...o){if("string"==typeof e)return new i(e,n||{},o);const t=new i("__component__",n||{},o);return t.component=e,t};U.fragment=(e,...n)=>n,U.current=c,U.directives=M,U.reservedProps=u,U.isVnode=function(e){return e instanceof i},U.isComponent=p,U.isVnodeComponent=d,U.isNodeJs=o,U.trust=s,U.onCleanup=function(e){-1===c.app?.onCleanup.indexOf(e)&&c.app?.onCleanup.push(e)},U.onUnmount=function(e){-1===c.app?.onUnmount.indexOf(e)&&c.app?.onUnmount.push(e)},U.onMount=function(e){-1===c.app?.onMount.indexOf(e)&&c.app?.onMount.push(e)},U.onUpdate=function(e){-1===c.app?.onUpdate.indexOf(e)&&c.app?.onUpdate.push(e)},U.mount=function(e,n){let r,i=null;if(i=o?"string"==typeof e?l("svg"===e?"svg":"div","svg"===e):e:"string"==typeof e?document.querySelectorAll(e)[0]:e,!i)throw new Error("Container not found");if(d(n))r=n;else{if(!p(n))throw new Error("Component must be a Valyrian Component or a Vnode component");r=U(n,{})}if(n[t])h(n);else{let e=function(e){let o=e.target,t=`v-on${e.type}`;for(;o;){if(o[t])return o[t](e,o),void(e.defaultPrevented||f(n));o=o.parentNode}};n[t]={isMounted:!1,eventListenerNames:{},onCleanup:[],onMount:[],onUpdate:[],onUnmount:[]},n[t].eventListener=e}return n[t].component=r,n[t].container=i,n[t].mainVnode=a(i),f(n)},U.unmount=h,U.update=f,U.setAttribute=y,U.directive=function(e,n){let o=`v-${e}`;M[o]=n,u[o]=!0},U.use=function(e,n){if(x.has(e))return x.get(e);let o=e(U,n);return x.set(e,o),o};var k={v:U};"undefined"!=typeof module?module.exports=k:self.Valyrian=k})();
1
+ (()=>{var e="__component__",o="#text",n=Boolean("undefined"!=typeof process&&process.versions&&process.versions.node),t=void 0,r=function(e,o,n){this.props=o,this.children=n,this.tag=e};function i(e){return"function"==typeof e||"object"==typeof e&&null!==e&&"view"in e}function d(o){return o instanceof r&&o.tag===e}function p(e,o=!1){return o?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}function l(e){if(3===e.nodeType){let n=G(o,{},[]);return n.nodeValue=e.nodeValue,n.dom=e,n}if(1===e.nodeType){let o=[];for(let n=0;n<e.childNodes.length;n++){let t=l(e.childNodes[n]);t&&o.push(t)}let n={};[].forEach.call(e.attributes,e=>n[e.nodeName]=e.nodeValue);let t=G(e.tagName.toLowerCase(),n,...o);return t.dom=e,t}}var s=e=>{let o=p("div");return o.innerHTML=e.trim(),[].map.call(o.childNodes,e=>l(e))},a={key:!0,state:!0,oncreate:!0,onupdate:!0,onremove:!0,shouldupdate:!0,"v-once":!0,"v-if":!0,"v-unless":!0,"v-for":!0,"v-show":!0,"v-class":!0,"v-html":!0},u={},c=[],m=[],f=[],h=[],v={};function g(e){let o=e.target,n=`v-on${e.type}`;for(;o;){if(o[n])return o[n](e,o),void(e.defaultPrevented||y());o=o.parentNode}}function V(e){for(let o=0;o<e.length;o++)e[o]();e=[]}function y(){if(G.component&&G.mainVnode){c.length&&V(c);let e=G.mainVnode;if(G.mainVnode=new r(G.mainVnode.tag,G.mainVnode.props,[G.component]),G.mainVnode.dom=e.dom,_(G.mainVnode,e),e=null,!1===G.isMounted?(m.length&&V(m),G.isMounted=!0):f.length&&V(f),n)return G.mainVnode.dom.innerHTML}}function w(){if(G.isMounted&&G.mainVnode&&G.component){c.length&&V(c),h.length&&V(h);let e=G.mainVnode;if(G.mainVnode=new r(G.mainVnode.tag,G.mainVnode.props,[]),G.mainVnode.dom=e.dom,G.mainVnode.isSVG=e.isSVG,_(G.mainVnode,e),e=null,G.component=null,G.isMounted=!1,n)return G.mainVnode.dom.innerHTML}}var N=new r("__empty__",{},[]);function C(e){for(let n=0;n<e.children.length;n++)e.children[n].tag!==o&&C(e.children[n]);e.props.onremove&&e.props.onremove(e)}function x(e,o,n,t){return a[e]?b[e]?b[e](n.props[e],n,t):void 0:"function"==typeof o?(e in u==!1&&(u[e]=!0,G.container.addEventListener(e.slice(2),g)),void(n.dom[`v-${e}`]=o)):void(e in n.dom&&!1===n.isSVG?n.dom[e]!=o&&(n.dom[e]=o):t&&t.props[e]===o||(!1===o?n.dom.removeAttribute(e):n.dom.setAttribute(e,o)))}function k(e,o,n,t){n.props[e]=o,x(e,o,n,t)}function M(e,o){for(let n in e.props)if(!1===x(n,e.props[n],e,o))return;if(o)for(let n in o.props)n in e.props==!1&&"function"!=typeof o.props[n]&&n in a==!1&&(n in o.dom&&!1===e.isSVG?o.dom[n]=null:o.dom.removeAttribute(n))}function _(n,i=N){v.vnode=n,v.oldVnode=i===N?t:i;let d=n.children,l=i.children;for(let i=0;i<d.length;i++){let p=d[i];if(p instanceof r){if(p.tag!==o){if(p.tag===e){let e=p.component;v.component=e;let o=("view"in e?e.view:e).call(e,p.props,...p.children);d.splice(i--,1,o);continue}p.isSVG=n.isSVG||"svg"===p.tag}}else Array.isArray(p)?d.splice(i--,1,...p):null===p||p===t?d.splice(i--,1):(d[i]=new r(o,{},[]),d[i].nodeValue=p)}let s=l.length,a=d.length;if(0!==a)if(s&&"key"in d[0].props&&"key"in l[0].props){let e={};for(let o=0;o<s;o++)e[l[o].props.key]=o;let o={};for(let e=0;e<a;e++)o[d[e].props.key]=e;for(let r=0;r<a;r++){let i=d[r],s=l[e[i.props.key]],a=!0;s?(i.dom=s.dom,"v-once"in i.props||i.props.shouldupdate&&!1===i.props.shouldupdate(i,s)?(i.children=s.children,a=!1):(M(i,s),G.isMounted?i.props.onupdate&&i.props.onupdate(i,s):i.props.oncreate&&i.props.oncreate(i))):(i.dom=p(i.tag,i.isSVG),M(i),i.props.oncreate&&i.props.oncreate(i)),n.dom.childNodes[r]===t?n.dom.appendChild(i.dom):n.dom.childNodes[r]!==i.dom&&(l[r]&&o[l[r].props.key]===t&&C(l[r]),n.dom.replaceChild(i.dom,n.dom.childNodes[r])),a&&_(i,s)}for(let e=a;e<s;e++)if(o[l[e].props.key]===t){let o=l[e];C(o),o.dom.parentNode&&o.dom.parentNode.removeChild(o.dom)}}else{for(let e=0;e<a;e++){let t=d[e];if(e<s){let r=l[e];if(t.tag===o){if(r.tag===o){t.dom=r.dom,t.dom.nodeValue!=t.nodeValue&&(t.dom.nodeValue=t.nodeValue);continue}t.dom=document.createTextNode(t.nodeValue),C(r),n.dom.replaceChild(t.dom,r.dom);continue}if(r.tag===t.tag){if(t.dom=r.dom,t.props["v-once"]||t.props.shouldupdate&&!1===t.props.shouldupdate(t,r)){t.children=r.children;continue}M(t,r),G.isMounted?t.props.onupdate&&t.props.onupdate(t,r):t.props.oncreate&&t.props.oncreate(t),_(t,r);continue}t.dom=p(t.tag,t.isSVG),M(t),r.tag!==o&&C(r),t.props.oncreate&&t.props.oncreate(t),n.dom.replaceChild(t.dom,r.dom),_(t,N)}else t.tag!==o?(t.dom=p(t.tag,t.isSVG),M(t),n.dom.appendChild(t.dom),t.props.oncreate&&t.props.oncreate(t),_(t,N)):(t.dom=document.createTextNode(t.nodeValue),n.dom.appendChild(t.dom))}for(let e=a;e<s;e++){let n=l[e];n.tag!==o&&C(n),n.dom.parentNode&&n.dom.parentNode.removeChild(n.dom)}}else{for(let e=0;e<s;e++)l[e].tag!==o&&C(l[e]);n.dom.textContent=""}}function S(e){return(n,t,r)=>{if(e?n:!n){let e=document.createTextNode("");return r&&r.dom&&r.dom.parentNode&&(r.tag!==o&&C(r),r.dom.parentNode.replaceChild(e,r.dom)),t.tag=o,t.children=[],t.props={},t.dom=e,!1}}}var b={"v-if":S(!1),"v-unless":S(!0),"v-for":(e,o)=>{o.children=e.map(o.children[0])},"v-show":(e,o)=>{o.dom.style.display=e?"":"none"},"v-class":(e,o)=>{for(let n in e)o.dom.classList.toggle(n,e[n])},"v-html":(e,o)=>{o.children=[s(e)]},"v-model":([e,o,n],t,r)=>{let i,d;if("input"===t.name)switch(n=n||"oninput",t.props.type){case"checkbox":Array.isArray(e[o])?(d=n=>{let t=n.target.value,r=e[o].indexOf(t);-1===r?e[o].push(t):e[o].splice(r,1)},i=-1!==e[o].indexOf(t.dom.value)):"value"in t.props?(d=()=>{e[o]===t.props.value?e[o]=null:e[o]=t.props.value},i=e[o]===t.props.value):(d=()=>e[o]=!e[o],i=e[o]),k("checked",i,t,r);break;case"radio":k("checked",e[o]===t.dom.value,t,r);break;default:k("value",e[o],t,r)}else"select"===t.name?(n=n||"onclick",t.props.multiple?(d=n=>{let t=n.target.value;if(n.ctrlKey){let n=e[o].indexOf(t);-1===n?e[o].push(t):e[o].splice(n,1)}else e[o].splice(0,e[o].length),e[o].push(t)},t.children.forEach(n=>{if("option"===n.tag){let t="value"in n.props?n.props.value:n.children.join("").trim();n.props.selected=-1!==e[o].indexOf(t)}})):t.children.forEach(n=>{if("option"===n.tag){let t="value"in n.props?n.props.value:n.children.join("").trim();n.props.selected=t===e[o]}})):"textarea"===t.name&&(n=n||"oninput",t.children=[e[o]]);t.props[n]||(d||(d=n=>e[o]=n.target.value),k(n,d,t,r))}},A=new Map;var G=function(e,o,...n){if("string"==typeof e)return new r(e,o||{},n);const t=new r("__component__",o||{},n);return t.component=e,t};G.fragment=(e,...o)=>o,G.current=v,G.directives=b,G.reservedProps=a,G.isVnode=function(e){return e instanceof r},G.isComponent=i,G.isVnodeComponent=d,G.isMounted=!1,G.isNodeJs=n,G.trust=s,G.onCleanup=function(e){-1===c.indexOf(e)&&c.push(e)},G.onUnmount=function(e){-1===h.indexOf(e)&&h.push(e)},G.onMount=function(e){-1===m.indexOf(e)&&m.push(e)},G.onUpdate=function(e){-1===f.indexOf(e)&&f.push(e)},G.mount=function(e,o){let t,r=null;if(r=n?"string"==typeof e?p("svg"===e?"svg":"div","svg"===e):e:"string"==typeof e?document.querySelectorAll(e)[0]:e,!r)throw new Error("Container not found");if(d(o))t=o;else{if(!i(o))throw new Error("Component must be a Valyrian Component or a Vnode component");t=G(o,{})}return G.isMounted&&w(),G.component=t,G.container=r,G.mainVnode=l(r),y()},G.unmount=w,G.update=y,G.setAttribute=k,G.directive=function(e,o){let n=`v-${e}`;b[n]=o,a[n]=!0},G.use=function(e,o){if(A.has(e))return A.get(e);let n=e(G,o);return A.set(e,n),n};var E={default:G};"undefined"!=typeof module?module.exports=E:self.Valyrian=E})();
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9pbmRleC50cyJdLCJuYW1lcyI6WyJDb21wb25lbnRTdHJpbmciLCJUZXh0U3RyaW5nIiwiaXNOb2RlSnMiLCJCb29sZWFuIiwicHJvY2VzcyIsInZlcnNpb25zIiwibm9kZSIsIlZhbHlyaWFuU3ltYm9sIiwiU3ltYm9sIiwiVW5kIiwiVm5vZGUiLCJ0YWciLCJwcm9wcyIsImNoaWxkcmVuIiwidGhpcyIsImlzQ29tcG9uZW50IiwiY29tcG9uZW50IiwiaXNWbm9kZUNvbXBvbmVudCIsInZub2RlIiwiY3JlYXRlRG9tRWxlbWVudCIsImlzU1ZHIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJjcmVhdGVFbGVtZW50IiwiZG9tVG9Wbm9kZSIsImRvbSIsInYiLCJ0YWdOYW1lIiwidG9Mb3dlckNhc2UiLCJBcnJheSIsImZyb20iLCJjaGlsZE5vZGVzIiwiZmlsdGVyIiwiY2hpbGQiLCJub2RlVHlwZSIsIm1hcCIsInRleHQiLCJub2RlVmFsdWUiLCJTdHJpbmciLCJmb3JFYWNoIiwiY2FsbCIsImF0dHJpYnV0ZXMiLCJwcm9wIiwibm9kZU5hbWUiLCJ0cnVzdCIsImh0bWxTdHJpbmciLCJkaXYiLCJpbm5lckhUTUwiLCJ0cmltIiwiaXRlbSIsInJlc2VydmVkUHJvcHMiLCJrZXkiLCJzdGF0ZSIsIm9uY3JlYXRlIiwib251cGRhdGUiLCJvbnJlbW92ZSIsInNob3VsZHVwZGF0ZSIsImN1cnJlbnQiLCJjYWxsQ2xlYW51cCIsInZhbHlyaWFuQXBwIiwiaSIsIm9uQ2xlYW51cCIsImxlbmd0aCIsInVwZGF0ZSIsImFwcCIsIm9sZFZub2RlIiwibWFpblZub2RlIiwicGF0Y2giLCJpc01vdW50ZWQiLCJvbk1vdW50IiwiY2FsbE1vdW50Iiwib25VcGRhdGUiLCJjYWxsVXBkYXRlIiwidW5tb3VudCIsIm9uVW5tb3VudCIsImNhbGxVbm1vdW50IiwiUmVmbGVjdCIsImRlbGV0ZVByb3BlcnR5IiwiZW1wdHlWbm9kZSIsInNoYXJlZFNldEF0dHJpYnV0ZSIsInZhbHVlIiwiZGlyZWN0aXZlcyIsImV2ZW50TGlzdGVuZXJOYW1lcyIsImNvbnRhaW5lciIsImFkZEV2ZW50TGlzdGVuZXIiLCJzbGljZSIsImV2ZW50TGlzdGVuZXIiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJuYW1lIiwic2V0QXR0cmlidXRlcyIsIm5ld1Zub2RlIiwibmV3VHJlZSIsIm9sZFRyZWUiLCJjaGlsZFZub2RlIiwicmVzdWx0IiwidmlldyIsInNwbGljZSIsImlzQXJyYXkiLCJvbGRUcmVlTGVuZ3RoIiwibmV3VHJlZUxlbmd0aCIsIm9sZEtleWVkTGlzdCIsIm5ld0tleWVkTGlzdCIsIm9sZENoaWxkVm5vZGUiLCJzaG91bGRQYXRjaCIsImFwcGVuZENoaWxkIiwicmVwbGFjZUNoaWxkIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwibmV3Q2hpbGRWbm9kZSIsImNyZWF0ZVRleHROb2RlIiwidGV4dENvbnRlbnQiLCJoaWRlRGlyZWN0aXZlIiwidGVzdCIsImJvb2wiLCJuZXdkb20iLCJzZXQiLCJzdHlsZSIsImRpc3BsYXkiLCJjbGFzc2VzIiwiY2xhc3NMaXN0IiwidG9nZ2xlIiwiaHRtbCIsIm1vZGVsIiwicHJvcGVydHkiLCJldmVudCIsImhhbmRsZXIiLCJ0eXBlIiwiZSIsInZhbCIsInRhcmdldCIsImlkeCIsImluZGV4T2YiLCJwdXNoIiwibXVsdGlwbGUiLCJjdHJsS2V5IiwidmFsdWUyIiwiam9pbiIsInNlbGVjdGVkIiwicGx1Z2lucyIsIk1hcCIsInRhZ09yQ29tcG9uZW50IiwiZnJhZ21lbnQiLCJpc1Zub2RlIiwib2JqZWN0IiwiY2FsbGJhY2siLCJtb3VudCIsInZub2RlQ29tcG9uZW50IiwiYXBwQ29udGFpbmVyIiwicXVlcnlTZWxlY3RvckFsbCIsIkVycm9yIiwiZGVmYXVsdFByZXZlbnRlZCIsImRpcmVjdGl2ZSIsImRpcmVjdGl2ZTIiLCJmdWxsTmFtZSIsInVzZSIsInBsdWdpbiIsIm9wdGlvbnMiLCJoYXMiLCJn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Q3JCLElBQUl2RyxFQUFNdUcsRUFBRUUsT0FDUnpDLEVBQU8sT0FBT3VDLEVBQUVELE9BQ3BCLEtBQU90RyxHQUFLLENBQ1YsR0FBSUEsRUFBSWdFLEdBS04sT0FKQWhFLEVBQUlnRSxHQUFNdUMsRUFBR3ZHLFFBQ1J1RyxFQUFFdUIsa0JBQ0x4RixFQUFPL0MsSUFJWFMsRUFBTUEsRUFBSWtGLGFBbkJkM0YsRUFBVVQsR0FBa0IsQ0FDMUI2RCxXQUFXLEVBQ1hjLG1CQUFvQixHQUNwQnJCLFVBQVcsR0FDWFEsUUFBUyxHQUNURSxTQUFVLEdBQ1ZHLFVBQVcsSUFnQmIxRCxFQUFVVCxHQUFnQitFLGNBQWdCQSxFQVE1QyxPQUxBdEUsRUFBVVQsR0FBZ0JTLFVBQVltSSxFQUN0Q25JLEVBQVVULEdBQWdCNEUsVUFBWWlFLEVBQ3RDcEksRUFBVVQsR0FBZ0IyRCxVQUFZMUMsRUFBVzRILEdBRzFDckYsRUFBTy9DLElBMGdCaEJVLEVBQUUrQyxRQUFVQSxFQUNaL0MsRUFBRXFDLE9BQVNBLEVBRVhyQyxFQUFFOEQsYUFBZUEsRUFDakI5RCxFQUFFOEgsVUF0TEYsU0FBbUIvRCxFQUFjZ0UsR0FDL0IsSUFBSUMsRUFBVyxLQUFLakUsSUFDcEJSLEVBQVd5RSxHQUFZRCxFQUN2QnZHLEVBQWN3RyxJQUFZLEdBb0w1QmhJLEVBQUVpSSxJQXBERixTQUFhQyxFQUFnQkMsR0FDM0IsR0FBSWxCLEVBQVFtQixJQUFJRixHQUNkLE9BQU9qQixFQUFRb0IsSUFBSUgsR0FHckIsSUFBSTdELEVBQVM2RCxFQUFPbEksRUFBR21JLEdBRXZCLE9BREFsQixFQUFRdkIsSUFBSXdDLEVBQVE3RCxHQUNiQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG4vKiBlc2xpbnQtZGlzYWJsZSBzb25hcmpzL2NvZ25pdGl2ZS1jb21wbGV4aXR5ICovXG4vKioqIFZub2RlICoqKi9cblxuaW1wb3J0IHtcbiAgQ2hpbGRyZW4sXG4gIEN1cnJlbnQsXG4gIERpcmVjdGl2ZSxcbiAgRGlyZWN0aXZlcyxcbiAgRG9tRWxlbWVudCxcbiAgSVZub2RlLFxuICBNb3VudGVkVmFseXJpYW5BcHAsXG4gIFBsdWdpbixcbiAgUHJvcHMsXG4gIFJlc2VydmVkUHJvcHMsXG4gIFZhbHlyaWFuLFxuICBWYWx5cmlhbkFwcCxcbiAgVmFseXJpYW5Db21wb25lbnQsXG4gIFZub2RlQ29tcG9uZW50LFxuICBWbm9kZVdpdGhEb21cbn0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuXG4vKioqIENvbnN0YW50cyAqKiovXG5jb25zdCBDb21wb25lbnRTdHJpbmcgPSBcIl9fY29tcG9uZW50X19cIjtcbmNvbnN0IFRleHRTdHJpbmcgPSBcIiN0ZXh0XCI7XG5jb25zdCBpc05vZGVKcyA9IEJvb2xlYW4odHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGUpO1xuY29uc3QgVmFseXJpYW5TeW1ib2wgPSBTeW1ib2woXCJWYWx5cmlhblwiKTtcbmNvbnN0IFVuZCA9IHVuZGVmaW5lZDtcblxuLyoqKiBWbm9kZSAqKiovXG5cbmNvbnN0IFZub2RlID0gZnVuY3Rpb24gVm5vZGUodGhpczogSVZub2RlLCB0YWc6IHN0cmluZywgcHJvcHM6IFByb3BzLCBjaGlsZHJlbjogQ2hpbGRyZW4pIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIHRoaXMudGFnID0gdGFnO1xufSBhcyB1bmtub3duIGFzIElWbm9kZTtcblxuZnVuY3Rpb24gaXNWbm9kZShvYmplY3Q/OiB1bmtub3duIHwgSVZub2RlKTogb2JqZWN0IGlzIElWbm9kZSB7XG4gIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBWbm9kZTtcbn1cblxuZnVuY3Rpb24gaXNDb21wb25lbnQoY29tcG9uZW50PzogdW5rbm93biB8IFZhbHlyaWFuQ29tcG9uZW50KTogY29tcG9uZW50IGlzIFZhbHlyaWFuQ29tcG9uZW50IHtcbiAgcmV0dXJuIHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIiB8fCAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJvYmplY3RcIiAmJiBjb21wb25lbnQgIT09IG51bGwgJiYgXCJ2aWV3XCIgaW4gY29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gaXNWbm9kZUNvbXBvbmVudCh2bm9kZT86IHVua25vd24gfCBWbm9kZUNvbXBvbmVudCk6IHZub2RlIGlzIFZub2RlQ29tcG9uZW50IHtcbiAgcmV0dXJuIHZub2RlIGluc3RhbmNlb2YgVm5vZGUgJiYgdm5vZGUudGFnID09PSBDb21wb25lbnRTdHJpbmc7XG59XG5cbi8qKiogVXRpbCAqKiovXG5cbmZ1bmN0aW9uIGNyZWF0ZURvbUVsZW1lbnQodGFnOiBzdHJpbmcsIGlzU1ZHOiBib29sZWFuID0gZmFsc2UpIHtcbiAgcmV0dXJuIGlzU1ZHID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdGFnKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbn1cblxuZnVuY3Rpb24gZG9tVG9Wbm9kZShkb206IERvbUVsZW1lbnQpOiBWbm9kZVdpdGhEb20ge1xuICBsZXQgdm5vZGUgPSB2KFxuICAgIGRvbS50YWdOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAge30sXG4gICAgLi4uQXJyYXkuZnJvbShkb20uY2hpbGROb2RlcylcbiAgICAgIC5maWx0ZXIoKGNoaWxkKSA9PiAoY2hpbGQgYXMgRG9tRWxlbWVudCkubm9kZVR5cGUgPT09IDEgfHwgKGNoaWxkIGFzIERvbUVsZW1lbnQpLm5vZGVUeXBlID09PSAzKVxuICAgICAgLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgaWYgKChjaGlsZCBhcyBEb21FbGVtZW50KS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBkb21Ub1Zub2RlKGNoaWxkIGFzIERvbUVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRleHQgPSBuZXcgVm5vZGUoVGV4dFN0cmluZywge30sIFtdKTtcbiAgICAgICAgdGV4dC5ub2RlVmFsdWUgPSBTdHJpbmcoKGNoaWxkIGFzIERvbUVsZW1lbnQpLm5vZGVWYWx1ZSk7XG4gICAgICAgIHRleHQuZG9tID0gY2hpbGQgYXMgRG9tRWxlbWVudDtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICB9KVxuICApO1xuICBbXS5mb3JFYWNoLmNhbGwoZG9tLmF0dHJpYnV0ZXMsIChwcm9wOiBBdHRyKSA9PiAodm5vZGUucHJvcHNbcHJvcC5ub2RlTmFtZV0gPSBwcm9wLm5vZGVWYWx1ZSkpO1xuICB2bm9kZS5kb20gPSBkb207XG4gIHJldHVybiB2bm9kZSBhcyBWbm9kZVdpdGhEb207XG59XG5cbmNvbnN0IHRydXN0ID0gKGh0bWxTdHJpbmc6IHN0cmluZyk6IENoaWxkcmVuID0+IHtcbiAgbGV0IGRpdiA9IGNyZWF0ZURvbUVsZW1lbnQoXCJkaXZcIik7XG4gIGRpdi5pbm5lckhUTUwgPSBodG1sU3RyaW5nLnRyaW0oKTtcblxuICByZXR1cm4gW10ubWFwLmNhbGwoZGl2LmNoaWxkTm9kZXMsIChpdGVtKSA9PiBkb21Ub1Zub2RlKGl0ZW0pKSBhcyBDaGlsZHJlbjtcbn07XG5cbmNvbnN0IHJlc2VydmVkUHJvcHM6IFJlc2VydmVkUHJvcHMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgc3RhdGU6IHRydWUsXG4gIG9uY3JlYXRlOiB0cnVlLFxuICBvbnVwZGF0ZTogdHJ1ZSxcbiAgb25yZW1vdmU6IHRydWUsXG4gIHNob3VsZHVwZGF0ZTogdHJ1ZSxcbiAgXCJ2LW9uY2VcIjogdHJ1ZSxcblxuICAvLyBCdWlsdCBpbiBkaXJlY3RpdmVzXG4gIFwidi1pZlwiOiB0cnVlLFxuICBcInYtdW5sZXNzXCI6IHRydWUsXG4gIFwidi1mb3JcIjogdHJ1ZSxcbiAgXCJ2LXNob3dcIjogdHJ1ZSxcbiAgXCJ2LWNsYXNzXCI6IHRydWUsXG4gIFwidi1odG1sXCI6IHRydWVcbn07XG5cbi8qKiogTW91bnQgKioqL1xuXG5jb25zdCBjdXJyZW50OiBDdXJyZW50ID0ge307XG5cbmZ1bmN0aW9uIG9uQ2xlYW51cChjYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgaWYgKGN1cnJlbnQuYXBwPy5vbkNsZWFudXAuaW5kZXhPZihjYWxsYmFjaykgPT09IC0xKSB7XG4gICAgY3VycmVudC5hcHA/Lm9uQ2xlYW51cC5wdXNoKGNhbGxiYWNrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvblVubW91bnQoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gIGlmIChjdXJyZW50LmFwcD8ub25Vbm1vdW50LmluZGV4T2YoY2FsbGJhY2spID09PSAtMSkge1xuICAgIGN1cnJlbnQuYXBwPy5vblVubW91bnQucHVzaChjYWxsYmFjayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25Nb3VudChjYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgaWYgKGN1cnJlbnQuYXBwPy5vbk1vdW50LmluZGV4T2YoY2FsbGJhY2spID09PSAtMSkge1xuICAgIGN1cnJlbnQuYXBwPy5vbk1vdW50LnB1c2goY2FsbGJhY2spO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uVXBkYXRlKGNhbGxiYWNrOiBGdW5jdGlvbikge1xuICBpZiAoY3VycmVudC5hcHA/Lm9uVXBkYXRlLmluZGV4T2YoY2FsbGJhY2spID09PSAtMSkge1xuICAgIGN1cnJlbnQuYXBwPy5vblVwZGF0ZS5wdXNoKGNhbGxiYWNrKTtcbiAgfVxufVxuXG4vKlxuICAqIE1vdW50cyBhIGNvbXBvbmVudCB0byB0aGUgRE9NXG4gIG1vdW50KCcjYXBwJywgKCkgPT4gPGRpdj5IZWxsbyB3b3JsZDwvZGl2Pik7IC8vIEFwcCBpcyBhIEZ1bmN0aW9uYWwgQ29tcG9uZW50XG4gIG1vdW50KCcjYXBwJywgeyB2aWV3OiAoKSA9PiA8ZGl2PkhlbGxvIHdvcmxkPC9kaXY+IH0pOyAvLyBBcHAgaXMgYSBQT0pPIGNvbXBvbmVudCB3aXRoIGEgdmlldyBtZXRob2RcbiAgbW91bnQoJyNhcHAnLCBjbGFzc0luc3RhbmNlKTsgLy8gQXBwIGlzIGEgY2xhc3MgaW5zdGFuY2Ugd2l0aCBhIHZpZXcgbWV0aG9kXG4gIG1vdW50KCcjYXBwJywgPEFwcD48ZGl2PkhlbGxvIHdvcmxkPC9kaXY+PC9BcHA+KTsgLy8gQXBwIGlzIGEgVm5vZGUgY29tcG9uZW50IChWbm9kZSB3aXRoIHRhZyBfX2NvbXBvbmVudF9fKVxuKi9cblxuZnVuY3Rpb24gbW91bnQoY29udGFpbmVyOiBEb21FbGVtZW50IHwgc3RyaW5nLCBjb21wb25lbnQ6IFZhbHlyaWFuQ29tcG9uZW50IHwgSVZub2RlKTogdm9pZCB8IHN0cmluZyB7XG4gIGxldCBhcHBDb250YWluZXIgPSBudWxsO1xuXG4gIGlmIChpc05vZGVKcykge1xuICAgIGFwcENvbnRhaW5lciA9IHR5cGVvZiBjb250YWluZXIgPT09IFwic3RyaW5nXCIgPyBjcmVhdGVEb21FbGVtZW50KGNvbnRhaW5lciA9PT0gXCJzdmdcIiA/IFwic3ZnXCIgOiBcImRpdlwiLCBjb250YWluZXIgPT09IFwic3ZnXCIpIDogY29udGFpbmVyO1xuICB9IGVsc2Uge1xuICAgIGFwcENvbnRhaW5lciA9IHR5cGVvZiBjb250YWluZXIgPT09IFwic3RyaW5nXCIgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGNvbnRhaW5lcilbMF0gOiBjb250YWluZXI7XG4gIH1cblxuICBpZiAoIWFwcENvbnRhaW5lcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRhaW5lciBub3QgZm91bmRcIik7XG4gIH1cblxuICBsZXQgdm5vZGVDb21wb25lbnQ6IFZub2RlQ29tcG9uZW50IHwgSVZub2RlO1xuXG4gIGlmIChpc1Zub2RlQ29tcG9uZW50KGNvbXBvbmVudCkpIHtcbiAgICB2bm9kZUNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgfSBlbHNlIGlmIChpc0NvbXBvbmVudChjb21wb25lbnQpKSB7XG4gICAgdm5vZGVDb21wb25lbnQgPSB2KGNvbXBvbmVudCwge30pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvbXBvbmVudCBtdXN0IGJlIGEgVmFseXJpYW4gQ29tcG9uZW50IG9yIGEgVm5vZGUgY29tcG9uZW50XCIpO1xuICB9XG5cbiAgaWYgKGNvbXBvbmVudFtWYWx5cmlhblN5bWJvbF0pIHtcbiAgICB1bm1vdW50KGNvbXBvbmVudCk7XG4gIH0gZWxzZSB7XG4gICAgY29tcG9uZW50W1ZhbHlyaWFuU3ltYm9sXSA9IHtcbiAgICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgICBldmVudExpc3RlbmVyTmFtZXM6IHt9LFxuICAgICAgb25DbGVhbnVwOiBbXSxcbiAgICAgIG9uTW91bnQ6IFtdLFxuICAgICAgb25VcGRhdGU6IFtdLFxuICAgICAgb25Vbm1vdW50OiBbXVxuICAgIH07XG4gICAgZnVuY3Rpb24gZXZlbnRMaXN0ZW5lcihlOiBFdmVudCkge1xuICAgICAgbGV0IGRvbSA9IGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgbGV0IG5hbWUgPSBgdi1vbiR7ZS50eXBlfWA7XG4gICAgICB3aGlsZSAoZG9tKSB7XG4gICAgICAgIGlmIChkb21bbmFtZV0pIHtcbiAgICAgICAgICBkb21bbmFtZV0oZSwgZG9tKTtcbiAgICAgICAgICBpZiAoIWUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgdXBkYXRlKGNvbXBvbmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkb20gPSBkb20ucGFyZW50Tm9kZSBhcyBEb21FbGVtZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBjb21wb25lbnRbVmFseXJpYW5TeW1ib2xdLmV2ZW50TGlzdGVuZXIgPSBldmVudExpc3RlbmVyO1xuICB9XG5cbiAgY29tcG9uZW50W1ZhbHlyaWFuU3ltYm9sXS5jb21wb25lbnQgPSB2bm9kZUNvbXBvbmVudDtcbiAgY29tcG9uZW50W1ZhbHlyaWFuU3ltYm9sXS5jb250YWluZXIgPSBhcHBDb250YWluZXI7XG4gIGNvbXBvbmVudFtWYWx5cmlhblN5bWJvbF0ubWFpblZub2RlID0gZG9tVG9Wbm9kZShhcHBDb250YWluZXIpO1xuXG4gIC8vIHVwZGF0ZVxuICByZXR1cm4gdXBkYXRlKGNvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGNhbGxDbGVhbnVwKHZhbHlyaWFuQXBwOiBWYWx5cmlhbkFwcCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHlyaWFuQXBwLm9uQ2xlYW51cC5sZW5ndGg7IGkrKykge1xuICAgIHZhbHlyaWFuQXBwLm9uQ2xlYW51cFtpXSgpO1xuICB9XG4gIHZhbHlyaWFuQXBwLm9uQ2xlYW51cCA9IFtdO1xufVxuXG5mdW5jdGlvbiBjYWxsVW5tb3VudCh2YWx5cmlhbkFwcDogVmFseXJpYW5BcHApIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx5cmlhbkFwcC5vblVubW91bnQubGVuZ3RoOyBpKyspIHtcbiAgICB2YWx5cmlhbkFwcC5vblVubW91bnRbaV0oKTtcbiAgfVxuICB2YWx5cmlhbkFwcC5vblVubW91bnQgPSBbXTtcbn1cblxuZnVuY3Rpb24gY2FsbE1vdW50KHZhbHlyaWFuQXBwOiBWYWx5cmlhbkFwcCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHlyaWFuQXBwLm9uTW91bnQubGVuZ3RoOyBpKyspIHtcbiAgICB2YWx5cmlhbkFwcC5vbk1vdW50W2ldKCk7XG4gIH1cbiAgdmFseXJpYW5BcHAub25Nb3VudCA9IFtdO1xufVxuXG5mdW5jdGlvbiBjYWxsVXBkYXRlKHZhbHlyaWFuQXBwOiBWYWx5cmlhbkFwcCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHlyaWFuQXBwLm9uVXBkYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFseXJpYW5BcHAub25VcGRhdGVbaV0oKTtcbiAgfVxuICB2YWx5cmlhbkFwcC5vblVwZGF0ZSA9IFtdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGUoY29tcG9uZW50PzogVmFseXJpYW5Db21wb25lbnQgfCBJVm5vZGUpOiB2b2lkIHwgc3RyaW5nIHtcbiAgaWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnRbVmFseXJpYW5TeW1ib2xdKSB7XG4gICAgbGV0IHZhbHlyaWFuQXBwID0gY29tcG9uZW50W1ZhbHlyaWFuU3ltYm9sXTtcbiAgICBjdXJyZW50LmFwcCA9IHZhbHlyaWFuQXBwO1xuICAgIHZhbHlyaWFuQXBwLm9uQ2xlYW51cC5sZW5ndGggJiYgY2FsbENsZWFudXAodmFseXJpYW5BcHApO1xuICAgIGxldCBvbGRWbm9kZTogVm5vZGVXaXRoRG9tIHwgbnVsbCA9IHZhbHlyaWFuQXBwLm1haW5Wbm9kZSBhcyBWbm9kZVdpdGhEb207XG4gICAgdmFseXJpYW5BcHAubWFpblZub2RlID0gbmV3IFZub2RlKHZhbHlyaWFuQXBwLm1haW5Wbm9kZS50YWcsIHZhbHlyaWFuQXBwLm1haW5Wbm9kZS5wcm9wcywgW3ZhbHlyaWFuQXBwLmNvbXBvbmVudF0pIGFzIFZub2RlV2l0aERvbTtcbiAgICB2YWx5cmlhbkFwcC5tYWluVm5vZGUuZG9tID0gb2xkVm5vZGUuZG9tO1xuICAgIHBhdGNoKHZhbHlyaWFuQXBwLm1haW5Wbm9kZSwgb2xkVm5vZGUsIHZhbHlyaWFuQXBwKTtcbiAgICBvbGRWbm9kZSA9IG51bGw7XG4gICAgaWYgKHZhbHlyaWFuQXBwLmlzTW91bnRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHZhbHlyaWFuQXBwLm9uTW91bnQubGVuZ3RoICYmIGNhbGxNb3VudCh2YWx5cmlhbkFwcCk7XG4gICAgICB2YWx5cmlhbkFwcC5pc01vdW50ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx5cmlhbkFwcC5vblVwZGF0ZS5sZW5ndGggJiYgY2FsbFVwZGF0ZSh2YWx5cmlhbkFwcCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTm9kZUpzKSB7XG4gICAgICByZXR1cm4gdmFseXJpYW5BcHAubWFpblZub2RlLmRvbS5pbm5lckhUTUw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVubW91bnQoY29tcG9uZW50PzogVmFseXJpYW5Db21wb25lbnQgfCBJVm5vZGUpOiB2b2lkIHwgc3RyaW5nIHtcbiAgaWYgKCFjb21wb25lbnQgfHwgIWNvbXBvbmVudFtWYWx5cmlhblN5bWJvbF0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgdmFseXJpYW5BcHAgPSBjb21wb25lbnRbVmFseXJpYW5TeW1ib2xdIGFzIE1vdW50ZWRWYWx5cmlhbkFwcDtcblxuICBpZiAodmFseXJpYW5BcHAuaXNNb3VudGVkKSB7XG4gICAgdmFseXJpYW5BcHAub25DbGVhbnVwLmxlbmd0aCAmJiBjYWxsQ2xlYW51cCh2YWx5cmlhbkFwcCk7XG4gICAgdmFseXJpYW5BcHAub25Vbm1vdW50Lmxlbmd0aCAmJiBjYWxsVW5tb3VudCh2YWx5cmlhbkFwcCk7XG4gICAgbGV0IG9sZFZub2RlOiBWbm9kZVdpdGhEb20gfCBudWxsID0gdmFseXJpYW5BcHAubWFpblZub2RlIGFzIFZub2RlV2l0aERvbTtcbiAgICB2YWx5cmlhbkFwcC5tYWluVm5vZGUgPSBuZXcgVm5vZGUodmFseXJpYW5BcHAubWFpblZub2RlLnRhZywgdmFseXJpYW5BcHAubWFpblZub2RlLnByb3BzLCBbXSkgYXMgVm5vZGVXaXRoRG9tO1xuICAgIHZhbHlyaWFuQXBwLm1haW5Wbm9kZS5kb20gPSBvbGRWbm9kZS5kb207XG4gICAgdmFseXJpYW5BcHAubWFpblZub2RlLmlzU1ZHID0gb2xkVm5vZGUuaXNTVkc7XG4gICAgcGF0Y2godmFseXJpYW5BcHAubWFpblZub2RlLCBvbGRWbm9kZSwgdmFseXJpYW5BcHApO1xuICAgIG9sZFZub2RlID0gbnVsbDtcblxuICAgIGlmIChpc05vZGVKcykge1xuICAgICAgcmV0dXJuIHZhbHlyaWFuQXBwLm1haW5Wbm9kZS5kb20uaW5uZXJIVE1MO1xuICAgIH1cblxuICAgICh2YWx5cmlhbkFwcCBhcyBhbnkpID0gbnVsbDtcbiAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGNvbXBvbmVudCwgVmFseXJpYW5TeW1ib2wpO1xuICB9XG59XG5cbmxldCBlbXB0eVZub2RlID0gbmV3IFZub2RlKFwiX19lbXB0eV9fXCIsIHt9LCBbXSk7XG5cbmZ1bmN0aW9uIG9ucmVtb3ZlKHZub2RlOiBJVm5vZGUpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2bm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZub2RlLmNoaWxkcmVuW2ldLnRhZyAhPT0gVGV4dFN0cmluZyAmJiBvbnJlbW92ZSh2bm9kZS5jaGlsZHJlbltpXSk7XG4gIH1cblxuICB2bm9kZS5wcm9wcy5vbnJlbW92ZSAmJiB2bm9kZS5wcm9wcy5vbnJlbW92ZSh2bm9kZSk7XG59XG5cbmZ1bmN0aW9uIHNoYXJlZFNldEF0dHJpYnV0ZShwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnksIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB8IGJvb2xlYW4ge1xuICAvLyBJdCBpcyBhIHJlc2VydmVkIHByb3BcbiAgaWYgKHJlc2VydmVkUHJvcHNbcHJvcF0pIHtcbiAgICAvLyBJZiBpdCBpcyBhIGRpcmVjdGl2ZSBuYW1lIGNhbGwgdGhlIGRpcmVjdGl2ZVxuICAgIGlmIChkaXJlY3RpdmVzW3Byb3BdKSB7XG4gICAgICByZXR1cm4gZGlyZWN0aXZlc1twcm9wXSh2bm9kZS5wcm9wc1twcm9wXSwgdm5vZGUsIG9sZFZub2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJdCBpcyBub3QgYSByZXNlcnZlZCBwcm9wIHNvIHdlIGFkZCBpdCB0byB0aGUgZG9tXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB2YWx5cmlhbkFwcCA9IGN1cnJlbnQuYXBwIGFzIE1vdW50ZWRWYWx5cmlhbkFwcDtcbiAgICBpZiAocHJvcCBpbiB2YWx5cmlhbkFwcC5ldmVudExpc3RlbmVyTmFtZXMgPT09IGZhbHNlKSB7XG4gICAgICB2YWx5cmlhbkFwcC5ldmVudExpc3RlbmVyTmFtZXNbcHJvcF0gPSB0cnVlO1xuICAgICAgdmFseXJpYW5BcHAuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIocHJvcC5zbGljZSgyKSwgdmFseXJpYW5BcHAuZXZlbnRMaXN0ZW5lcik7XG4gICAgfVxuICAgIHZub2RlLmRvbVtgdi0ke3Byb3B9YF0gPSB2YWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocHJvcCBpbiB2bm9kZS5kb20gJiYgdm5vZGUuaXNTVkcgPT09IGZhbHNlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgIGlmICh2bm9kZS5kb21bcHJvcF0gIT0gdmFsdWUpIHtcbiAgICAgIHZub2RlLmRvbVtwcm9wXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBVc2Ugc2V0IGF0dHJpYnV0ZVxuICBpZiAoIW9sZFZub2RlIHx8IG9sZFZub2RlLnByb3BzW3Byb3BdICE9PSB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHZub2RlLmRvbS5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZub2RlLmRvbS5zZXRBdHRyaWJ1dGUocHJvcCwgdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCB2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkge1xuICB2bm9kZS5wcm9wc1tuYW1lXSA9IHZhbHVlO1xuXG4gIHNoYXJlZFNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgdm5vZGUsIG9sZFZub2RlKTtcbn1cblxuZnVuY3Rpb24gc2V0QXR0cmlidXRlcyh2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkge1xuICBmb3IgKGxldCBwcm9wIGluIHZub2RlLnByb3BzKSB7XG4gICAgaWYgKHNoYXJlZFNldEF0dHJpYnV0ZShwcm9wLCB2bm9kZS5wcm9wc1twcm9wXSwgdm5vZGUsIG9sZFZub2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAob2xkVm5vZGUpIHtcbiAgICBmb3IgKGxldCBwcm9wIGluIG9sZFZub2RlLnByb3BzKSB7XG4gICAgICBpZiAocHJvcCBpbiB2bm9kZS5wcm9wcyA9PT0gZmFsc2UgJiYgdHlwZW9mIG9sZFZub2RlLnByb3BzW3Byb3BdICE9PSBcImZ1bmN0aW9uXCIgJiYgcHJvcCBpbiByZXNlcnZlZFByb3BzID09PSBmYWxzZSkge1xuICAgICAgICBpZiAocHJvcCBpbiBvbGRWbm9kZS5kb20gJiYgdm5vZGUuaXNTVkcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgb2xkVm5vZGUuZG9tW3Byb3BdID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbGRWbm9kZS5kb20ucmVtb3ZlQXR0cmlidXRlKHByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiBwYXRjaChuZXdWbm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZTogVm5vZGVXaXRoRG9tIHwgSVZub2RlID0gZW1wdHlWbm9kZSwgdmFseXJpYW5BcHA6IE1vdW50ZWRWYWx5cmlhbkFwcCkge1xuICBjdXJyZW50LnZub2RlID0gbmV3Vm5vZGU7XG4gIGN1cnJlbnQub2xkVm5vZGUgPSBvbGRWbm9kZSA9PT0gZW1wdHlWbm9kZSA/IFVuZCA6IChvbGRWbm9kZSBhcyBWbm9kZVdpdGhEb20pO1xuICBsZXQgbmV3VHJlZSA9IG5ld1Zub2RlLmNoaWxkcmVuO1xuICBsZXQgb2xkVHJlZSA9IG9sZFZub2RlLmNoaWxkcmVuO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZS5sZW5ndGg7IGkrKykge1xuICAgIGxldCBjaGlsZFZub2RlID0gbmV3VHJlZVtpXTtcbiAgICBpZiAoY2hpbGRWbm9kZSBpbnN0YW5jZW9mIFZub2RlKSB7XG4gICAgICBpZiAoY2hpbGRWbm9kZS50YWcgIT09IFRleHRTdHJpbmcpIHtcbiAgICAgICAgaWYgKGNoaWxkVm5vZGUudGFnID09PSBDb21wb25lbnRTdHJpbmcpIHtcbiAgICAgICAgICBsZXQgY29tcG9uZW50ID0gY2hpbGRWbm9kZS5jb21wb25lbnQgYXMgVmFseXJpYW5Db21wb25lbnQ7XG4gICAgICAgICAgY3VycmVudC5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAgICAgbGV0IHJlc3VsdCA9IChcInZpZXdcIiBpbiBjb21wb25lbnQgPyBjb21wb25lbnQudmlldyA6IGNvbXBvbmVudCkuY2FsbChjb21wb25lbnQsIGNoaWxkVm5vZGUucHJvcHMsIC4uLmNoaWxkVm5vZGUuY2hpbGRyZW4pO1xuXG4gICAgICAgICAgbmV3VHJlZS5zcGxpY2UoaS0tLCAxLCByZXN1bHQpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkVm5vZGUuaXNTVkcgPSBuZXdWbm9kZS5pc1NWRyB8fCBjaGlsZFZub2RlLnRhZyA9PT0gXCJzdmdcIjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRWbm9kZSkpIHtcbiAgICAgIG5ld1RyZWUuc3BsaWNlKGktLSwgMSwgLi4uY2hpbGRWbm9kZSk7XG4gICAgfSBlbHNlIGlmIChjaGlsZFZub2RlID09PSBudWxsIHx8IGNoaWxkVm5vZGUgPT09IFVuZCkge1xuICAgICAgbmV3VHJlZS5zcGxpY2UoaS0tLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VHJlZVtpXSA9IG5ldyBWbm9kZShUZXh0U3RyaW5nLCB7fSwgW10pO1xuICAgICAgbmV3VHJlZVtpXS5ub2RlVmFsdWUgPSBjaGlsZFZub2RlO1xuICAgIH1cbiAgfVxuXG4gIGxldCBvbGRUcmVlTGVuZ3RoID0gb2xkVHJlZS5sZW5ndGg7XG4gIGxldCBuZXdUcmVlTGVuZ3RoID0gbmV3VHJlZS5sZW5ndGg7XG5cbiAgLy8gSWYgbmV3IHRyZWUgaXMgZW1wdHksIHJlbW92ZSBhbGwgb2xkIG5vZGVzXG4gIGlmIChuZXdUcmVlTGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbGRUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICAgIG9sZFRyZWVbaV0udGFnICE9PSBUZXh0U3RyaW5nICYmIG9ucmVtb3ZlKG9sZFRyZWVbaV0pO1xuICAgIH1cblxuICAgIG5ld1Zub2RlLmRvbS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgdGhlIHRyZWUgaXMga2V5ZWQgbGlzdCBhbmQgaXMgbm90IGZpcnN0IHJlbmRlciBhbmQgb2xkIHRyZWUgaXMga2V5ZWQgbGlzdCB0b29cbiAgaWYgKG9sZFRyZWVMZW5ndGggJiYgXCJrZXlcIiBpbiBuZXdUcmVlWzBdLnByb3BzICYmIFwia2V5XCIgaW4gb2xkVHJlZVswXS5wcm9wcykge1xuICAgIGxldCBvbGRLZXllZExpc3Q6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZFRyZWVMZW5ndGg7IGkrKykge1xuICAgICAgb2xkS2V5ZWRMaXN0W29sZFRyZWVbaV0ucHJvcHMua2V5XSA9IGk7XG4gICAgfVxuXG4gICAgbGV0IG5ld0tleWVkTGlzdDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZUxlbmd0aDsgaSsrKSB7XG4gICAgICBuZXdLZXllZExpc3RbbmV3VHJlZVtpXS5wcm9wcy5rZXldID0gaTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWVMZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGNoaWxkVm5vZGUgPSBuZXdUcmVlW2ldO1xuICAgICAgbGV0IG9sZENoaWxkVm5vZGUgPSBvbGRUcmVlW29sZEtleWVkTGlzdFtjaGlsZFZub2RlLnByb3BzLmtleV1dO1xuICAgICAgbGV0IHNob3VsZFBhdGNoID0gdHJ1ZTtcblxuICAgICAgaWYgKG9sZENoaWxkVm5vZGUpIHtcbiAgICAgICAgY2hpbGRWbm9kZS5kb20gPSBvbGRDaGlsZFZub2RlLmRvbTtcbiAgICAgICAgaWYgKFwidi1vbmNlXCIgaW4gY2hpbGRWbm9kZS5wcm9wcyB8fCAoY2hpbGRWbm9kZS5wcm9wcy5zaG91bGR1cGRhdGUgJiYgY2hpbGRWbm9kZS5wcm9wcy5zaG91bGR1cGRhdGUoY2hpbGRWbm9kZSwgb2xkQ2hpbGRWbm9kZSkgPT09IGZhbHNlKSkge1xuICAgICAgICAgIC8vIHNraXAgdGhpcyBwYXRjaFxuICAgICAgICAgIGNoaWxkVm5vZGUuY2hpbGRyZW4gPSBvbGRDaGlsZFZub2RlLmNoaWxkcmVuO1xuICAgICAgICAgIHNob3VsZFBhdGNoID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0QXR0cmlidXRlcyhjaGlsZFZub2RlLCBvbGRDaGlsZFZub2RlKTtcbiAgICAgICAgICBpZiAodmFseXJpYW5BcHAuaXNNb3VudGVkKSB7XG4gICAgICAgICAgICBjaGlsZFZub2RlLnByb3BzLm9udXBkYXRlICYmIGNoaWxkVm5vZGUucHJvcHMub251cGRhdGUoY2hpbGRWbm9kZSwgb2xkQ2hpbGRWbm9kZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoaWxkVm5vZGUucHJvcHMub25jcmVhdGUgJiYgY2hpbGRWbm9kZS5wcm9wcy5vbmNyZWF0ZShjaGlsZFZub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkVm5vZGUuZG9tID0gY3JlYXRlRG9tRWxlbWVudChjaGlsZFZub2RlLnRhZywgY2hpbGRWbm9kZS5pc1NWRyk7XG4gICAgICAgIHNldEF0dHJpYnV0ZXMoY2hpbGRWbm9kZSk7XG4gICAgICAgIGNoaWxkVm5vZGUucHJvcHMub25jcmVhdGUgJiYgY2hpbGRWbm9kZS5wcm9wcy5vbmNyZWF0ZShjaGlsZFZub2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld1Zub2RlLmRvbS5jaGlsZE5vZGVzW2ldID09PSBVbmQpIHtcbiAgICAgICAgbmV3Vm5vZGUuZG9tLmFwcGVuZENoaWxkKGNoaWxkVm5vZGUuZG9tKTtcbiAgICAgIH0gZWxzZSBpZiAobmV3Vm5vZGUuZG9tLmNoaWxkTm9kZXNbaV0gIT09IGNoaWxkVm5vZGUuZG9tKSB7XG4gICAgICAgIG9sZFRyZWVbaV0gJiYgbmV3S2V5ZWRMaXN0W29sZFRyZWVbaV0ucHJvcHMua2V5XSA9PT0gVW5kICYmIG9ucmVtb3ZlKG9sZFRyZWVbaV0pO1xuICAgICAgICBuZXdWbm9kZS5kb20ucmVwbGFjZUNoaWxkKGNoaWxkVm5vZGUuZG9tLCBuZXdWbm9kZS5kb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIHNob3VsZFBhdGNoICYmIHBhdGNoKGNoaWxkVm5vZGUsIG9sZENoaWxkVm5vZGUsIHZhbHlyaWFuQXBwKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgdGhlIHJlc3Qgb2YgdGhlIGNoaWxkcmVuLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZW1cbiAgICBmb3IgKGxldCBpID0gbmV3VHJlZUxlbmd0aDsgaSA8IG9sZFRyZWVMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5ld0tleWVkTGlzdFtvbGRUcmVlW2ldLnByb3BzLmtleV0gPT09IFVuZCkge1xuICAgICAgICBsZXQgb2xkQ2hpbGRWbm9kZSA9IG9sZFRyZWVbaV07XG4gICAgICAgIG9ucmVtb3ZlKG9sZENoaWxkVm5vZGUpO1xuICAgICAgICBvbGRDaGlsZFZub2RlLmRvbS5wYXJlbnROb2RlICYmIG9sZENoaWxkVm5vZGUuZG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob2xkQ2hpbGRWbm9kZS5kb20pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIElmIG5ldyB0cmVlIGFuZCBvbGQgdHJlZSBoYXZlIG1vcmUgdGhhbiBvbmUgY2hpbGQsIHdlIHNob3VsZCB1cGRhdGUgdGhlIGRvbVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWVMZW5ndGg7IGkrKykge1xuICAgIGxldCBuZXdDaGlsZFZub2RlID0gbmV3VHJlZVtpXTtcblxuICAgIC8vIE9sZCBjaGlsZCBleGlzdHNcbiAgICBpZiAoaSA8IG9sZFRyZWVMZW5ndGgpIHtcbiAgICAgIGxldCBvbGRDaGlsZFZub2RlID0gb2xkVHJlZVtpXTtcbiAgICAgIC8vIE5ldyBjaGlsZCBpcyBhIHRleHQgbm9kZVxuICAgICAgaWYgKG5ld0NoaWxkVm5vZGUudGFnID09PSBUZXh0U3RyaW5nKSB7XG4gICAgICAgIC8vIE9sZCBjaGlsZCBpcyBhIHRleHQgbm9kZVxuICAgICAgICBpZiAob2xkQ2hpbGRWbm9kZS50YWcgPT09IFRleHRTdHJpbmcpIHtcbiAgICAgICAgICBuZXdDaGlsZFZub2RlLmRvbSA9IG9sZENoaWxkVm5vZGUuZG9tO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgICAgICAgICBpZiAobmV3Q2hpbGRWbm9kZS5kb20ubm9kZVZhbHVlICE9IG5ld0NoaWxkVm5vZGUubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICBuZXdDaGlsZFZub2RlLmRvbS5ub2RlVmFsdWUgPSBuZXdDaGlsZFZub2RlLm5vZGVWYWx1ZSBhcyBzdHJpbmc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT2xkIGNoaWxkIGlzIGEgbm9ybWFsIG5vZGVcbiAgICAgICAgbmV3Q2hpbGRWbm9kZS5kb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdDaGlsZFZub2RlLm5vZGVWYWx1ZSBhcyBzdHJpbmcpIGFzIHVua25vd24gYXMgRG9tRWxlbWVudDtcbiAgICAgICAgb25yZW1vdmUob2xkQ2hpbGRWbm9kZSk7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGRWbm9kZS5kb20sIG9sZENoaWxkVm5vZGUuZG9tKTtcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTmV3IGNoaWxkIGlzIGEgbm9ybWFsIG5vZGVcbiAgICAgIC8vIE9sZCBjaGlsZCBpcyB0aGUgc2FtZSB0eXBlIGFzIG5ldyBjaGlsZFxuICAgICAgaWYgKG9sZENoaWxkVm5vZGUudGFnID09PSBuZXdDaGlsZFZub2RlLnRhZykge1xuICAgICAgICBuZXdDaGlsZFZub2RlLmRvbSA9IG9sZENoaWxkVm5vZGUuZG9tO1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgdi1vbmNlIGRpcmVjdGl2ZSBvciBhIHNob3VsZHVwZGF0ZSBtZXRob2QgdGhhdCByZXR1cm5zIGZhbHNlLCB3ZSBza2lwIHRoZSB1cGRhdGVcbiAgICAgICAgaWYgKG5ld0NoaWxkVm5vZGUucHJvcHNbXCJ2LW9uY2VcIl0gfHwgKG5ld0NoaWxkVm5vZGUucHJvcHMuc2hvdWxkdXBkYXRlICYmIG5ld0NoaWxkVm5vZGUucHJvcHMuc2hvdWxkdXBkYXRlKG5ld0NoaWxkVm5vZGUsIG9sZENoaWxkVm5vZGUpID09PSBmYWxzZSkpIHtcbiAgICAgICAgICBuZXdDaGlsZFZub2RlLmNoaWxkcmVuID0gb2xkQ2hpbGRWbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIHVwZGF0ZSB0aGUgZG9tIGVsZW1lbnRcbiAgICAgICAgc2V0QXR0cmlidXRlcyhuZXdDaGlsZFZub2RlLCBvbGRDaGlsZFZub2RlKTtcbiAgICAgICAgaWYgKHZhbHlyaWFuQXBwLmlzTW91bnRlZCkge1xuICAgICAgICAgIG5ld0NoaWxkVm5vZGUucHJvcHMub251cGRhdGUgJiYgbmV3Q2hpbGRWbm9kZS5wcm9wcy5vbnVwZGF0ZShuZXdDaGlsZFZub2RlLCBvbGRDaGlsZFZub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdDaGlsZFZub2RlLnByb3BzLm9uY3JlYXRlICYmIG5ld0NoaWxkVm5vZGUucHJvcHMub25jcmVhdGUobmV3Q2hpbGRWbm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXRjaChuZXdDaGlsZFZub2RlLCBvbGRDaGlsZFZub2RlLCB2YWx5cmlhbkFwcCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBPbGQgY2hpbGQgaXMgb2YgYSBkaWZmZXJlbnQgdHlwZSB0aGFuIG5ldyBjaGlsZFxuICAgICAgbmV3Q2hpbGRWbm9kZS5kb20gPSBjcmVhdGVEb21FbGVtZW50KG5ld0NoaWxkVm5vZGUudGFnLCBuZXdDaGlsZFZub2RlLmlzU1ZHKTtcbiAgICAgIHNldEF0dHJpYnV0ZXMobmV3Q2hpbGRWbm9kZSk7XG4gICAgICBvbGRDaGlsZFZub2RlLnRhZyAhPT0gVGV4dFN0cmluZyAmJiBvbnJlbW92ZShvbGRDaGlsZFZub2RlKTtcbiAgICAgIG5ld0NoaWxkVm5vZGUucHJvcHMub25jcmVhdGUgJiYgbmV3Q2hpbGRWbm9kZS5wcm9wcy5vbmNyZWF0ZShuZXdDaGlsZFZub2RlKTtcbiAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGRWbm9kZS5kb20sIG9sZENoaWxkVm5vZGUuZG9tKTtcbiAgICAgIHBhdGNoKG5ld0NoaWxkVm5vZGUsIGVtcHR5Vm5vZGUsIHZhbHlyaWFuQXBwKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIE9sZCBjaGlsZCBkb2VzIG5vdCBleGlzdHNcbiAgICAvLyBOZXcgY2hpbGQgaXMgYSB0ZXh0IG5vZGVcbiAgICBpZiAobmV3Q2hpbGRWbm9kZS50YWcgPT09IFRleHRTdHJpbmcpIHtcbiAgICAgIG5ld0NoaWxkVm5vZGUuZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGRWbm9kZS5ub2RlVmFsdWUgYXMgc3RyaW5nKSBhcyB1bmtub3duIGFzIERvbUVsZW1lbnQ7XG4gICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQobmV3Q2hpbGRWbm9kZS5kb20pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gTmV3IGNoaWxkIGlzIGEgbm9ybWFsIG5vZGVcbiAgICBuZXdDaGlsZFZub2RlLmRvbSA9IGNyZWF0ZURvbUVsZW1lbnQobmV3Q2hpbGRWbm9kZS50YWcsIG5ld0NoaWxkVm5vZGUuaXNTVkcpO1xuICAgIHNldEF0dHJpYnV0ZXMobmV3Q2hpbGRWbm9kZSk7XG4gICAgbmV3Vm5vZGUuZG9tLmFwcGVuZENoaWxkKG5ld0NoaWxkVm5vZGUuZG9tKTtcbiAgICBuZXdDaGlsZFZub2RlLnByb3BzLm9uY3JlYXRlICYmIG5ld0NoaWxkVm5vZGUucHJvcHMub25jcmVhdGUobmV3Q2hpbGRWbm9kZSk7XG4gICAgcGF0Y2gobmV3Q2hpbGRWbm9kZSwgZW1wdHlWbm9kZSwgdmFseXJpYW5BcHApO1xuICB9XG5cbiAgLy8gRm9yIHRoZSByZXN0IG9mIHRoZSBjaGlsZHJlbiwgd2Ugc2hvdWxkIHJlbW92ZSB0aGVtXG4gIGZvciAobGV0IGkgPSBuZXdUcmVlTGVuZ3RoOyBpIDwgb2xkVHJlZUxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IG9sZENoaWxkVm5vZGUgPSBvbGRUcmVlW2ldO1xuICAgIG9sZENoaWxkVm5vZGUudGFnICE9PSBUZXh0U3RyaW5nICYmIG9ucmVtb3ZlKG9sZENoaWxkVm5vZGUpO1xuICAgIG9sZENoaWxkVm5vZGUuZG9tLnBhcmVudE5vZGUgJiYgb2xkQ2hpbGRWbm9kZS5kb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvbGRDaGlsZFZub2RlLmRvbSk7XG4gIH1cbn1cblxuLyoqKiBEaXJlY3RpdmVzICoqKi9cblxuZnVuY3Rpb24gZGlyZWN0aXZlKG5hbWU6IHN0cmluZywgZGlyZWN0aXZlOiBEaXJlY3RpdmUpIHtcbiAgbGV0IGZ1bGxOYW1lID0gYHYtJHtuYW1lfWA7XG4gIGRpcmVjdGl2ZXNbZnVsbE5hbWVdID0gZGlyZWN0aXZlO1xuICByZXNlcnZlZFByb3BzW2Z1bGxOYW1lXSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGhpZGVEaXJlY3RpdmUodGVzdDogYm9vbGVhbik6IERpcmVjdGl2ZSB7XG4gIHJldHVybiAoYm9vbDogYm9vbGVhbiwgdm5vZGU6IElWbm9kZSwgb2xkVm5vZGU/OiBJVm5vZGUpID0+IHtcbiAgICBsZXQgdmFsdWUgPSB0ZXN0ID8gYm9vbCA6ICFib29sO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgbGV0IG5ld2RvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgICAgaWYgKG9sZFZub2RlICYmIG9sZFZub2RlLmRvbSAmJiBvbGRWbm9kZS5kb20ucGFyZW50Tm9kZSkge1xuICAgICAgICBvbGRWbm9kZS50YWcgIT09IFRleHRTdHJpbmcgJiYgb25yZW1vdmUob2xkVm5vZGUpO1xuICAgICAgICBvbGRWbm9kZS5kb20ucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3ZG9tLCBvbGRWbm9kZS5kb20pO1xuICAgICAgfVxuICAgICAgdm5vZGUudGFnID0gVGV4dFN0cmluZztcbiAgICAgIHZub2RlLmNoaWxkcmVuID0gW107XG4gICAgICB2bm9kZS5wcm9wcyA9IHt9O1xuICAgICAgdm5vZGUuZG9tID0gbmV3ZG9tIGFzIHVua25vd24gYXMgRG9tRWxlbWVudDtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59XG5cbmNvbnN0IGRpcmVjdGl2ZXM6IERpcmVjdGl2ZXMgPSB7XG4gIFwidi1pZlwiOiBoaWRlRGlyZWN0aXZlKGZhbHNlKSxcbiAgXCJ2LXVubGVzc1wiOiBoaWRlRGlyZWN0aXZlKHRydWUpLFxuICBcInYtZm9yXCI6IChzZXQ6IHVua25vd25bXSwgdm5vZGU6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIHZub2RlLmNoaWxkcmVuID0gc2V0Lm1hcCh2bm9kZS5jaGlsZHJlblswXSk7XG4gIH0sXG4gIFwidi1zaG93XCI6IChib29sOiBib29sZWFuLCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgKHZub2RlLmRvbSBhcyB1bmtub3duIGFzIHsgc3R5bGU6IHsgZGlzcGxheTogc3RyaW5nIH0gfSkuc3R5bGUuZGlzcGxheSA9IGJvb2wgPyBcIlwiIDogXCJub25lXCI7XG4gIH0sXG4gIFwidi1jbGFzc1wiOiAoY2xhc3NlczogeyBbeDogc3RyaW5nXTogYm9vbGVhbiB9LCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBjbGFzc2VzKSB7XG4gICAgICAodm5vZGUuZG9tIGFzIERvbUVsZW1lbnQpLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgY2xhc3Nlc1tuYW1lXSk7XG4gICAgfVxuICB9LFxuICBcInYtaHRtbFwiOiAoaHRtbDogc3RyaW5nLCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgdm5vZGUuY2hpbGRyZW4gPSBbdHJ1c3QoaHRtbCldO1xuICB9LFxuICBcInYtbW9kZWxcIjogKFttb2RlbCwgcHJvcGVydHksIGV2ZW50XTogYW55W10sIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgbGV0IHZhbHVlO1xuICAgIGxldCBoYW5kbGVyO1xuICAgIGlmICh2bm9kZS5uYW1lID09PSBcImlucHV0XCIpIHtcbiAgICAgIGV2ZW50ID0gZXZlbnQgfHwgXCJvbmlucHV0XCI7XG4gICAgICBzd2l0Y2ggKHZub2RlLnByb3BzLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6IHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eV0pKSB7XG4gICAgICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGxldCB2YWwgPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlO1xuICAgICAgICAgICAgICBsZXQgaWR4ID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsKTtcbiAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2Yodm5vZGUuZG9tLnZhbHVlKSAhPT0gLTE7XG4gICAgICAgICAgfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gdm5vZGUucHJvcHMpIHtcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldID0gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSB2bm9kZS5wcm9wcy52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5wcm9wcy52YWx1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlciA9ICgpID0+IChtb2RlbFtwcm9wZXJ0eV0gPSAhbW9kZWxbcHJvcGVydHldKTtcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHZhbHVlLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyYWRpb1wiOiB7XG4gICAgICAgICAgc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCBtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLmRvbS52YWx1ZSwgdm5vZGUsIG9sZFZub2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgbW9kZWxbcHJvcGVydHldLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2bm9kZS5uYW1lID09PSBcInNlbGVjdFwiKSB7XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25jbGlja1wiO1xuICAgICAgaWYgKHZub2RlLnByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIGhhbmRsZXIgPSAoZTogRXZlbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7XG4gICAgICAgICAgbGV0IHZhbCA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWU7XG4gICAgICAgICAgaWYgKGUuY3RybEtleSkge1xuICAgICAgICAgICAgbGV0IGlkeCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbCk7XG4gICAgICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKDAsIG1vZGVsW3Byb3BlcnR5XS5sZW5ndGgpO1xuICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBJVm5vZGUpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBcInZhbHVlXCIgaW4gY2hpbGQucHJvcHMgPyBjaGlsZC5wcm9wcy52YWx1ZSA6IGNoaWxkLmNoaWxkcmVuLmpvaW4oXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuc2VsZWN0ZWQgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWx1ZSkgIT09IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogSVZub2RlKSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gXCJvcHRpb25cIikge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gXCJ2YWx1ZVwiIGluIGNoaWxkLnByb3BzID8gY2hpbGQucHJvcHMudmFsdWUgOiBjaGlsZC5jaGlsZHJlbi5qb2luKFwiXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGNoaWxkLnByb3BzLnNlbGVjdGVkID0gdmFsdWUgPT09IG1vZGVsW3Byb3BlcnR5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodm5vZGUubmFtZSA9PT0gXCJ0ZXh0YXJlYVwiKSB7XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25pbnB1dFwiO1xuICAgICAgdm5vZGUuY2hpbGRyZW4gPSBbbW9kZWxbcHJvcGVydHldXTtcbiAgICB9XG5cbiAgICBpZiAoIXZub2RlLnByb3BzW2V2ZW50XSkge1xuICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgIGhhbmRsZXIgPSAoZTogRXZlbnQpID0+IChtb2RlbFtwcm9wZXJ0eV0gPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHNldEF0dHJpYnV0ZShldmVudCwgaGFuZGxlciwgdm5vZGUsIG9sZFZub2RlKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKiogUGx1Z2lucyAqKiovXG5jb25zdCBwbHVnaW5zID0gbmV3IE1hcDxQbHVnaW4sIGFueT4oKTtcblxuZnVuY3Rpb24gdXNlKHBsdWdpbjogUGx1Z2luLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgYW55Pik6IHZvaWQgfCBhbnkge1xuICBpZiAocGx1Z2lucy5oYXMocGx1Z2luKSkge1xuICAgIHJldHVybiBwbHVnaW5zLmdldChwbHVnaW4pO1xuICB9XG5cbiAgbGV0IHJlc3VsdCA9IHBsdWdpbih2LCBvcHRpb25zKTtcbiAgcGx1Z2lucy5zZXQocGx1Z2luLCByZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKioqIEh5cGVyc2NyaXB0ICoqKi9cblxuZXhwb3J0IGNvbnN0IHY6IFZhbHlyaWFuID0gZnVuY3Rpb24gdih0YWdPckNvbXBvbmVudDogc3RyaW5nIHwgVmFseXJpYW5Db21wb25lbnQsIHByb3BzOiBQcm9wcywgLi4uY2hpbGRyZW46IENoaWxkcmVuKTogSVZub2RlIHwgVm5vZGVDb21wb25lbnQge1xuICBpZiAodHlwZW9mIHRhZ09yQ29tcG9uZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIG5ldyBWbm9kZSh0YWdPckNvbXBvbmVudCwgcHJvcHMgfHwge30sIGNoaWxkcmVuKTtcbiAgfVxuXG4gIGNvbnN0IHZub2RlID0gbmV3IFZub2RlKFwiX19jb21wb25lbnRfX1wiLCBwcm9wcyB8fCB7fSwgY2hpbGRyZW4pO1xuICB2bm9kZS5jb21wb25lbnQgPSB0YWdPckNvbXBvbmVudDtcbiAgcmV0dXJuIHZub2RlIGFzIFZub2RlQ29tcG9uZW50O1xufTtcblxudi5mcmFnbWVudCA9IChwcm9wczogUHJvcHMsIC4uLmNoaWxkcmVuOiBDaGlsZHJlbik6IENoaWxkcmVuID0+IHtcbiAgcmV0dXJuIGNoaWxkcmVuO1xufTtcblxuLyoqKiBWIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgKioqL1xuLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBtYWtlIHRoZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGF2YWlsYWJsZSBmb3IgcGx1Z2luc1xudi5jdXJyZW50ID0gY3VycmVudDtcblxudi5kaXJlY3RpdmVzID0gZGlyZWN0aXZlcztcblxudi5yZXNlcnZlZFByb3BzID0gcmVzZXJ2ZWRQcm9wcztcblxudi5pc1Zub2RlID0gaXNWbm9kZTtcbnYuaXNDb21wb25lbnQgPSBpc0NvbXBvbmVudDtcbnYuaXNWbm9kZUNvbXBvbmVudCA9IGlzVm5vZGVDb21wb25lbnQ7XG5cbnYuaXNOb2RlSnMgPSBpc05vZGVKcztcbnYudHJ1c3QgPSB0cnVzdDtcblxudi5vbkNsZWFudXAgPSBvbkNsZWFudXA7XG52Lm9uVW5tb3VudCA9IG9uVW5tb3VudDtcbnYub25Nb3VudCA9IG9uTW91bnQ7XG52Lm9uVXBkYXRlID0gb25VcGRhdGU7XG5cbnYubW91bnQgPSBtb3VudDtcbnYudW5tb3VudCA9IHVubW91bnQ7XG52LnVwZGF0ZSA9IHVwZGF0ZTtcblxudi5zZXRBdHRyaWJ1dGUgPSBzZXRBdHRyaWJ1dGU7XG52LmRpcmVjdGl2ZSA9IGRpcmVjdGl2ZTtcbnYudXNlID0gdXNlO1xuIl19
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9pbmRleC50cyJdLCJuYW1lcyI6WyJDb21wb25lbnRTdHJpbmciLCJUZXh0U3RyaW5nIiwiaXNOb2RlSnMiLCJCb29sZWFuIiwicHJvY2VzcyIsInZlcnNpb25zIiwibm9kZSIsIlVuZCIsIlZub2RlIiwidGFnIiwicHJvcHMiLCJjaGlsZHJlbiIsInRoaXMiLCJpc0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzVm5vZGVDb21wb25lbnQiLCJ2bm9kZSIsImNyZWF0ZURvbUVsZW1lbnQiLCJpc1NWRyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwiY3JlYXRlRWxlbWVudCIsImRvbVRvVm5vZGUiLCJkb20iLCJub2RlVHlwZSIsInYiLCJub2RlVmFsdWUiLCJpIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkIiwicHVzaCIsImZvckVhY2giLCJjYWxsIiwiYXR0cmlidXRlcyIsInByb3AiLCJub2RlTmFtZSIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsInRydXN0IiwiaHRtbFN0cmluZyIsImRpdiIsImlubmVySFRNTCIsInRyaW0iLCJtYXAiLCJpdGVtIiwicmVzZXJ2ZWRQcm9wcyIsImtleSIsInN0YXRlIiwib25jcmVhdGUiLCJvbnVwZGF0ZSIsIm9ucmVtb3ZlIiwic2hvdWxkdXBkYXRlIiwiZXZlbnRMaXN0ZW5lck5hbWVzIiwib25DbGVhbnVwTGlzdCIsIm9uTW91bnRMaXN0Iiwib25VcGRhdGVMaXN0Iiwib25Vbm1vdW50TGlzdCIsImN1cnJlbnQiLCJldmVudExpc3RlbmVyIiwiZSIsInRhcmdldCIsIm5hbWUiLCJ0eXBlIiwiZGVmYXVsdFByZXZlbnRlZCIsInVwZGF0ZSIsInBhcmVudE5vZGUiLCJjYWxsQ2FsbGJhY2tMaXN0IiwibGlzdCIsIm1haW5Wbm9kZSIsIm9sZFZub2RlIiwicGF0Y2giLCJpc01vdW50ZWQiLCJ1bm1vdW50IiwiZW1wdHlWbm9kZSIsInNoYXJlZFNldEF0dHJpYnV0ZSIsInZhbHVlIiwiZGlyZWN0aXZlcyIsImNvbnRhaW5lciIsImFkZEV2ZW50TGlzdGVuZXIiLCJzbGljZSIsInJlbW92ZUF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZXMiLCJuZXdWbm9kZSIsIm5ld1RyZWUiLCJvbGRUcmVlIiwiY2hpbGRWbm9kZSIsInJlc3VsdCIsInZpZXciLCJzcGxpY2UiLCJBcnJheSIsImlzQXJyYXkiLCJvbGRUcmVlTGVuZ3RoIiwibmV3VHJlZUxlbmd0aCIsIm9sZEtleWVkTGlzdCIsIm5ld0tleWVkTGlzdCIsIm9sZENoaWxkVm5vZGUiLCJzaG91bGRQYXRjaCIsImFwcGVuZENoaWxkIiwicmVwbGFjZUNoaWxkIiwicmVtb3ZlQ2hpbGQiLCJuZXdDaGlsZFZub2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJ0ZXh0Q29udGVudCIsImhpZGVEaXJlY3RpdmUiLCJ0ZXN0IiwiYm9vbCIsIm5ld2RvbSIsInNldCIsInN0eWxlIiwiZGlzcGxheSIsImNsYXNzZXMiLCJjbGFzc0xpc3QiLCJ0b2dnbGUiLCJodG1sIiwibW9kZWwiLCJwcm9wZXJ0eSIsImV2ZW50IiwiaGFuZGxlciIsInZhbCIsImlkeCIsImluZGV4T2YiLCJtdWx0aXBsZSIsImN0cmxLZXkiLCJ2YWx1ZTIiLCJqb2luIiwic2VsZWN0ZWQiLCJwbHVnaW5zIiwiTWFwIiwidGFnT3JDb21wb25lbnQiLCJmcmFnbWVudCIsImlzVm5vZGUiLCJvYmplY3QiLCJvbkNsZWFudXAiLCJjYWxsYmFjayIsIm9uVW5tb3VudCIsIm9uTW91bnQiLCJvblVwZGF0ZSIsIm1vdW50Iiwidm5vZGVDb21wb25lbnQiLCJhcHBDb250YWluZXIiLCJxdWVyeVNlbGVjdG9yQWxsIiwiRXJyb3IiLCJkaXJlY3RpdmUiLCJkaXJlY3RpdmUyIiwiZnVsbE5hbWUiLCJ1c2UiLCJwbHVnaW4iLCJvcHRpb25zIiwiaGFzIiwiZ2V0Il0sIm1hcHBpbmdzIjoiTUFxQkEsSUFBTUEsRUFBa0IsZ0JBQ2xCQyxFQUFhLFFBQ2JDLEVBQVdDLFFBQTJCLG9CQUFa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Q29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuLyogZXNsaW50LWRpc2FibGUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eSAqL1xuLyoqKiBWbm9kZSAqKiovXG5cbmltcG9ydCB7XG4gIENoaWxkcmVuLFxuICBDdXJyZW50LFxuICBEaXJlY3RpdmUsXG4gIERpcmVjdGl2ZXMsXG4gIERvbUVsZW1lbnQsXG4gIElWbm9kZSxcbiAgUGx1Z2luLFxuICBQcm9wcyxcbiAgUmVzZXJ2ZWRQcm9wcyxcbiAgVmFseXJpYW4sXG4gIFZhbHlyaWFuQ29tcG9uZW50LFxuICBWbm9kZUNvbXBvbmVudCxcbiAgVm5vZGVXaXRoRG9tXG59IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcblxuLyoqKiBDb25zdGFudHMgKioqL1xuY29uc3QgQ29tcG9uZW50U3RyaW5nID0gXCJfX2NvbXBvbmVudF9fXCI7XG5jb25zdCBUZXh0U3RyaW5nID0gXCIjdGV4dFwiO1xuY29uc3QgaXNOb2RlSnMgPSBCb29sZWFuKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcbmNvbnN0IFVuZCA9IHVuZGVmaW5lZDtcblxuLyoqKiBWbm9kZSAqKiovXG5cbmNvbnN0IFZub2RlID0gZnVuY3Rpb24gVm5vZGUodGhpczogSVZub2RlLCB0YWc6IHN0cmluZywgcHJvcHM6IFByb3BzLCBjaGlsZHJlbjogQ2hpbGRyZW4pIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIHRoaXMudGFnID0gdGFnO1xufSBhcyB1bmtub3duIGFzIElWbm9kZTtcblxuZnVuY3Rpb24gaXNWbm9kZShvYmplY3Q/OiB1bmtub3duIHwgSVZub2RlKTogb2JqZWN0IGlzIElWbm9kZSB7XG4gIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBWbm9kZTtcbn1cblxuZnVuY3Rpb24gaXNDb21wb25lbnQoY29tcG9uZW50PzogdW5rbm93biB8IFZhbHlyaWFuQ29tcG9uZW50KTogY29tcG9uZW50IGlzIFZhbHlyaWFuQ29tcG9uZW50IHtcbiAgcmV0dXJuIHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIiB8fCAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJvYmplY3RcIiAmJiBjb21wb25lbnQgIT09IG51bGwgJiYgXCJ2aWV3XCIgaW4gY29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gaXNWbm9kZUNvbXBvbmVudCh2bm9kZT86IHVua25vd24gfCBWbm9kZUNvbXBvbmVudCk6IHZub2RlIGlzIFZub2RlQ29tcG9uZW50IHtcbiAgcmV0dXJuIHZub2RlIGluc3RhbmNlb2YgVm5vZGUgJiYgdm5vZGUudGFnID09PSBDb21wb25lbnRTdHJpbmc7XG59XG5cbi8qKiogVXRpbCAqKiovXG5cbmZ1bmN0aW9uIGNyZWF0ZURvbUVsZW1lbnQodGFnOiBzdHJpbmcsIGlzU1ZHOiBib29sZWFuID0gZmFsc2UpIHtcbiAgcmV0dXJuIGlzU1ZHID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdGFnKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbn1cblxuZnVuY3Rpb24gZG9tVG9Wbm9kZShkb206IERvbUVsZW1lbnQpOiB2b2lkIHwgVm5vZGVXaXRoRG9tIHtcbiAgaWYgKGRvbS5ub2RlVHlwZSA9PT0gMykge1xuICAgIGxldCB2bm9kZSA9IHYoVGV4dFN0cmluZywge30sIFtdKTtcbiAgICB2bm9kZS5ub2RlVmFsdWUgPSBkb20ubm9kZVZhbHVlIGFzIHN0cmluZztcbiAgICB2bm9kZS5kb20gPSBkb207XG4gICAgcmV0dXJuIHZub2RlIGFzIFZub2RlV2l0aERvbTtcbiAgfVxuXG4gIGlmIChkb20ubm9kZVR5cGUgPT09IDEpIHtcbiAgICBsZXQgY2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgY2hpbGQgPSBkb21Ub1Zub2RlKGRvbS5jaGlsZE5vZGVzW2ldIGFzIERvbUVsZW1lbnQpO1xuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwcm9wczogUHJvcHMgPSB7fTtcbiAgICBbXS5mb3JFYWNoLmNhbGwoZG9tLmF0dHJpYnV0ZXMsIChwcm9wOiBBdHRyKSA9PiAocHJvcHNbcHJvcC5ub2RlTmFtZV0gPSBwcm9wLm5vZGVWYWx1ZSkpO1xuXG4gICAgbGV0IHZub2RlID0gdihkb20udGFnTmFtZS50b0xvd2VyQ2FzZSgpLCBwcm9wcywgLi4uY2hpbGRyZW4pO1xuICAgIHZub2RlLmRvbSA9IGRvbTtcbiAgICByZXR1cm4gdm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICB9XG59XG5cbmNvbnN0IHRydXN0ID0gKGh0bWxTdHJpbmc6IHN0cmluZyk6IENoaWxkcmVuID0+IHtcbiAgbGV0IGRpdiA9IGNyZWF0ZURvbUVsZW1lbnQoXCJkaXZcIik7XG4gIGRpdi5pbm5lckhUTUwgPSBodG1sU3RyaW5nLnRyaW0oKTtcblxuICByZXR1cm4gW10ubWFwLmNhbGwoZGl2LmNoaWxkTm9kZXMsIChpdGVtKSA9PiBkb21Ub1Zub2RlKGl0ZW0pKSBhcyBDaGlsZHJlbjtcbn07XG5cbmNvbnN0IHJlc2VydmVkUHJvcHM6IFJlc2VydmVkUHJvcHMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgc3RhdGU6IHRydWUsXG4gIG9uY3JlYXRlOiB0cnVlLFxuICBvbnVwZGF0ZTogdHJ1ZSxcbiAgb25yZW1vdmU6IHRydWUsXG4gIHNob3VsZHVwZGF0ZTogdHJ1ZSxcbiAgXCJ2LW9uY2VcIjogdHJ1ZSxcblxuICAvLyBCdWlsdCBpbiBkaXJlY3RpdmVzXG4gIFwidi1pZlwiOiB0cnVlLFxuICBcInYtdW5sZXNzXCI6IHRydWUsXG4gIFwidi1mb3JcIjogdHJ1ZSxcbiAgXCJ2LXNob3dcIjogdHJ1ZSxcbiAgXCJ2LWNsYXNzXCI6IHRydWUsXG4gIFwidi1odG1sXCI6IHRydWVcbn07XG5cbi8qKiogTW91bnQgKioqL1xuXG5jb25zdCBldmVudExpc3RlbmVyTmFtZXM6IFJlY29yZDxzdHJpbmcsIHRydWU+ID0ge307XG5sZXQgb25DbGVhbnVwTGlzdDogRnVuY3Rpb25bXSA9IFtdO1xubGV0IG9uTW91bnRMaXN0OiBGdW5jdGlvbltdID0gW107XG5sZXQgb25VcGRhdGVMaXN0OiBGdW5jdGlvbltdID0gW107XG5sZXQgb25Vbm1vdW50TGlzdDogRnVuY3Rpb25bXSA9IFtdO1xuY29uc3QgY3VycmVudDogQ3VycmVudCA9IHt9O1xuZnVuY3Rpb24gZXZlbnRMaXN0ZW5lcihlOiBFdmVudCkge1xuICBsZXQgZG9tID0gZS50YXJnZXQgYXMgRG9tRWxlbWVudDtcbiAgbGV0IG5hbWUgPSBgdi1vbiR7ZS50eXBlfWA7XG4gIHdoaWxlIChkb20pIHtcbiAgICBpZiAoZG9tW25hbWVdKSB7XG4gICAgICBkb21bbmFtZV0oZSwgZG9tKTtcbiAgICAgIGlmICghZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHVwZGF0ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkb20gPSBkb20ucGFyZW50Tm9kZSBhcyBEb21FbGVtZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uQ2xlYW51cChjYWxsYmFjazogRnVuY3Rpb24pOiB2b2lkIHtcbiAgaWYgKG9uQ2xlYW51cExpc3QuaW5kZXhPZihjYWxsYmFjaykgPT09IC0xKSB7XG4gICAgb25DbGVhbnVwTGlzdC5wdXNoKGNhbGxiYWNrKTtcbiAgfVxufVxuZnVuY3Rpb24gb25Vbm1vdW50KGNhbGxiYWNrOiBGdW5jdGlvbik6IHZvaWQge1xuICBpZiAob25Vbm1vdW50TGlzdC5pbmRleE9mKGNhbGxiYWNrKSA9PT0gLTEpIHtcbiAgICBvblVubW91bnRMaXN0LnB1c2goY2FsbGJhY2spO1xuICB9XG59XG5mdW5jdGlvbiBvbk1vdW50KGNhbGxiYWNrOiBGdW5jdGlvbik6IHZvaWQge1xuICBpZiAob25Nb3VudExpc3QuaW5kZXhPZihjYWxsYmFjaykgPT09IC0xKSB7XG4gICAgb25Nb3VudExpc3QucHVzaChjYWxsYmFjayk7XG4gIH1cbn1cbmZ1bmN0aW9uIG9uVXBkYXRlKGNhbGxiYWNrOiBGdW5jdGlvbik6IHZvaWQge1xuICBpZiAob25VcGRhdGVMaXN0LmluZGV4T2YoY2FsbGJhY2spID09PSAtMSkge1xuICAgIG9uVXBkYXRlTGlzdC5wdXNoKGNhbGxiYWNrKTtcbiAgfVxufVxuXG4vKlxuICAqIE1vdW50cyBhIGNvbXBvbmVudCB0byB0aGUgRE9NXG4gIG1vdW50KCcjYXBwJywgKCkgPT4gPGRpdj5IZWxsbyB3b3JsZDwvZGl2Pik7IC8vIEFwcCBpcyBhIEZ1bmN0aW9uYWwgQ29tcG9uZW50XG4gIG1vdW50KCcjYXBwJywgeyB2aWV3OiAoKSA9PiA8ZGl2PkhlbGxvIHdvcmxkPC9kaXY+IH0pOyAvLyBBcHAgaXMgYSBQT0pPIGNvbXBvbmVudCB3aXRoIGEgdmlldyBtZXRob2RcbiAgbW91bnQoJyNhcHAnLCBjbGFzc0luc3RhbmNlKTsgLy8gQXBwIGlzIGEgY2xhc3MgaW5zdGFuY2Ugd2l0aCBhIHZpZXcgbWV0aG9kXG4gIG1vdW50KCcjYXBwJywgPEFwcD48ZGl2PkhlbGxvIHdvcmxkPC9kaXY+PC9BcHA+KTsgLy8gQXBwIGlzIGEgVm5vZGUgY29tcG9uZW50IChWbm9kZSB3aXRoIHRhZyBfX2NvbXBvbmVudF9fKVxuKi9cblxuZnVuY3Rpb24gbW91bnQoY29udGFpbmVyOiBEb21FbGVtZW50IHwgc3RyaW5nLCBjb21wb25lbnQ6IFZhbHlyaWFuQ29tcG9uZW50IHwgSVZub2RlKTogdm9pZCB8IHN0cmluZyB7XG4gIGxldCBhcHBDb250YWluZXIgPSBudWxsO1xuXG4gIGlmIChpc05vZGVKcykge1xuICAgIGFwcENvbnRhaW5lciA9IHR5cGVvZiBjb250YWluZXIgPT09IFwic3RyaW5nXCIgPyBjcmVhdGVEb21FbGVtZW50KGNvbnRhaW5lciA9PT0gXCJzdmdcIiA/IFwic3ZnXCIgOiBcImRpdlwiLCBjb250YWluZXIgPT09IFwic3ZnXCIpIDogY29udGFpbmVyO1xuICB9IGVsc2Uge1xuICAgIGFwcENvbnRhaW5lciA9IHR5cGVvZiBjb250YWluZXIgPT09IFwic3RyaW5nXCIgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGNvbnRhaW5lcilbMF0gOiBjb250YWluZXI7XG4gIH1cblxuICBpZiAoIWFwcENvbnRhaW5lcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRhaW5lciBub3QgZm91bmRcIik7XG4gIH1cblxuICBsZXQgdm5vZGVDb21wb25lbnQ6IFZub2RlQ29tcG9uZW50IHwgSVZub2RlO1xuXG4gIGlmIChpc1Zub2RlQ29tcG9uZW50KGNvbXBvbmVudCkpIHtcbiAgICB2bm9kZUNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgfSBlbHNlIGlmIChpc0NvbXBvbmVudChjb21wb25lbnQpKSB7XG4gICAgdm5vZGVDb21wb25lbnQgPSB2KGNvbXBvbmVudCwge30pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvbXBvbmVudCBtdXN0IGJlIGEgVmFseXJpYW4gQ29tcG9uZW50IG9yIGEgVm5vZGUgY29tcG9uZW50XCIpO1xuICB9XG5cbiAgaWYgKHYuaXNNb3VudGVkKSB7XG4gICAgdW5tb3VudCgpO1xuICB9XG5cbiAgdi5jb21wb25lbnQgPSB2bm9kZUNvbXBvbmVudCBhcyBWbm9kZUNvbXBvbmVudDtcbiAgdi5jb250YWluZXIgPSBhcHBDb250YWluZXI7XG4gIHYubWFpblZub2RlID0gZG9tVG9Wbm9kZShhcHBDb250YWluZXIpIGFzIFZub2RlV2l0aERvbTtcblxuICAvLyB1cGRhdGVcbiAgcmV0dXJuIHVwZGF0ZSgpO1xufVxuXG5mdW5jdGlvbiBjYWxsQ2FsbGJhY2tMaXN0KGxpc3Q6IEZ1bmN0aW9uW10pOiB2b2lkIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgbGlzdFtpXSgpO1xuICB9XG4gIGxpc3QgPSBbXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlKCk6IHZvaWQgfCBzdHJpbmcge1xuICBpZiAodi5jb21wb25lbnQgJiYgdi5tYWluVm5vZGUpIHtcbiAgICBvbkNsZWFudXBMaXN0Lmxlbmd0aCAmJiBjYWxsQ2FsbGJhY2tMaXN0KG9uQ2xlYW51cExpc3QpO1xuICAgIGxldCBvbGRWbm9kZTogVm5vZGVXaXRoRG9tIHwgbnVsbCA9IHYubWFpblZub2RlIGFzIFZub2RlV2l0aERvbTtcbiAgICB2Lm1haW5Wbm9kZSA9IG5ldyBWbm9kZSh2Lm1haW5Wbm9kZS50YWcsIHYubWFpblZub2RlLnByb3BzLCBbdi5jb21wb25lbnRdKSBhcyBWbm9kZVdpdGhEb207XG4gICAgdi5tYWluVm5vZGUuZG9tID0gb2xkVm5vZGUuZG9tO1xuICAgIHBhdGNoKHYubWFpblZub2RlLCBvbGRWbm9kZSk7XG4gICAgb2xkVm5vZGUgPSBudWxsO1xuICAgIGlmICh2LmlzTW91bnRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIG9uTW91bnRMaXN0Lmxlbmd0aCAmJiBjYWxsQ2FsbGJhY2tMaXN0KG9uTW91bnRMaXN0KTtcbiAgICAgIHYuaXNNb3VudGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25VcGRhdGVMaXN0Lmxlbmd0aCAmJiBjYWxsQ2FsbGJhY2tMaXN0KG9uVXBkYXRlTGlzdCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTm9kZUpzKSB7XG4gICAgICByZXR1cm4gdi5tYWluVm5vZGUuZG9tLmlubmVySFRNTDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5tb3VudCgpOiB2b2lkIHwgc3RyaW5nIHtcbiAgaWYgKHYuaXNNb3VudGVkICYmIHYubWFpblZub2RlICYmIHYuY29tcG9uZW50KSB7XG4gICAgb25DbGVhbnVwTGlzdC5sZW5ndGggJiYgY2FsbENhbGxiYWNrTGlzdChvbkNsZWFudXBMaXN0KTtcbiAgICBvblVubW91bnRMaXN0Lmxlbmd0aCAmJiBjYWxsQ2FsbGJhY2tMaXN0KG9uVW5tb3VudExpc3QpO1xuICAgIGxldCBvbGRWbm9kZTogVm5vZGVXaXRoRG9tIHwgbnVsbCA9IHYubWFpblZub2RlIGFzIFZub2RlV2l0aERvbTtcbiAgICB2Lm1haW5Wbm9kZSA9IG5ldyBWbm9kZSh2Lm1haW5Wbm9kZS50YWcsIHYubWFpblZub2RlLnByb3BzLCBbXSkgYXMgVm5vZGVXaXRoRG9tO1xuICAgIHYubWFpblZub2RlLmRvbSA9IG9sZFZub2RlLmRvbTtcbiAgICB2Lm1haW5Wbm9kZS5pc1NWRyA9IG9sZFZub2RlLmlzU1ZHO1xuICAgIHBhdGNoKHYubWFpblZub2RlLCBvbGRWbm9kZSk7XG4gICAgb2xkVm5vZGUgPSBudWxsO1xuICAgIHYuY29tcG9uZW50ID0gbnVsbDtcbiAgICB2LmlzTW91bnRlZCA9IGZhbHNlO1xuICAgIGlmIChpc05vZGVKcykge1xuICAgICAgcmV0dXJuIHYubWFpblZub2RlLmRvbS5pbm5lckhUTUw7XG4gICAgfVxuICB9XG59XG5cbmxldCBlbXB0eVZub2RlID0gbmV3IFZub2RlKFwiX19lbXB0eV9fXCIsIHt9LCBbXSk7XG5cbmZ1bmN0aW9uIG9ucmVtb3ZlKHZub2RlOiBJVm5vZGUpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2bm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZub2RlLmNoaWxkcmVuW2ldLnRhZyAhPT0gVGV4dFN0cmluZyAmJiBvbnJlbW92ZSh2bm9kZS5jaGlsZHJlbltpXSk7XG4gIH1cblxuICB2bm9kZS5wcm9wcy5vbnJlbW92ZSAmJiB2bm9kZS5wcm9wcy5vbnJlbW92ZSh2bm9kZSk7XG59XG5cbmZ1bmN0aW9uIHNoYXJlZFNldEF0dHJpYnV0ZShwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnksIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB8IGJvb2xlYW4ge1xuICAvLyBJdCBpcyBhIHJlc2VydmVkIHByb3BcbiAgaWYgKHJlc2VydmVkUHJvcHNbcHJvcF0pIHtcbiAgICAvLyBJZiBpdCBpcyBhIGRpcmVjdGl2ZSBuYW1lIGNhbGwgdGhlIGRpcmVjdGl2ZVxuICAgIGlmIChkaXJlY3RpdmVzW3Byb3BdKSB7XG4gICAgICByZXR1cm4gZGlyZWN0aXZlc1twcm9wXSh2bm9kZS5wcm9wc1twcm9wXSwgdm5vZGUsIG9sZFZub2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJdCBpcyBub3QgYSByZXNlcnZlZCBwcm9wIHNvIHdlIGFkZCBpdCB0byB0aGUgZG9tXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGlmIChwcm9wIGluIGV2ZW50TGlzdGVuZXJOYW1lcyA9PT0gZmFsc2UpIHtcbiAgICAgIGV2ZW50TGlzdGVuZXJOYW1lc1twcm9wXSA9IHRydWU7XG4gICAgICAodi5jb250YWluZXIgYXMgRG9tRWxlbWVudCkuYWRkRXZlbnRMaXN0ZW5lcihwcm9wLnNsaWNlKDIpLCBldmVudExpc3RlbmVyKTtcbiAgICB9XG4gICAgdm5vZGUuZG9tW2B2LSR7cHJvcH1gXSA9IHZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcm9wIGluIHZub2RlLmRvbSAmJiB2bm9kZS5pc1NWRyA9PT0gZmFsc2UpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgaWYgKHZub2RlLmRvbVtwcm9wXSAhPSB2YWx1ZSkge1xuICAgICAgdm5vZGUuZG9tW3Byb3BdID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFVzZSBzZXQgYXR0cmlidXRlXG4gIGlmICghb2xkVm5vZGUgfHwgb2xkVm5vZGUucHJvcHNbcHJvcF0gIT09IHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgdm5vZGUuZG9tLnJlbW92ZUF0dHJpYnV0ZShwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm5vZGUuZG9tLnNldEF0dHJpYnV0ZShwcm9wLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKSB7XG4gIHZub2RlLnByb3BzW25hbWVdID0gdmFsdWU7XG5cbiAgc2hhcmVkU2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlLCB2bm9kZSwgb2xkVm5vZGUpO1xufVxuXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzKHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKSB7XG4gIGZvciAobGV0IHByb3AgaW4gdm5vZGUucHJvcHMpIHtcbiAgICBpZiAoc2hhcmVkU2V0QXR0cmlidXRlKHByb3AsIHZub2RlLnByb3BzW3Byb3BdLCB2bm9kZSwgb2xkVm5vZGUpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvbGRWbm9kZSkge1xuICAgIGZvciAobGV0IHByb3AgaW4gb2xkVm5vZGUucHJvcHMpIHtcbiAgICAgIGlmIChwcm9wIGluIHZub2RlLnByb3BzID09PSBmYWxzZSAmJiB0eXBlb2Ygb2xkVm5vZGUucHJvcHNbcHJvcF0gIT09IFwiZnVuY3Rpb25cIiAmJiBwcm9wIGluIHJlc2VydmVkUHJvcHMgPT09IGZhbHNlKSB7XG4gICAgICAgIGlmIChwcm9wIGluIG9sZFZub2RlLmRvbSAmJiB2bm9kZS5pc1NWRyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvbGRWbm9kZS5kb21bcHJvcF0gPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9sZFZub2RlLmRvbS5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIHBhdGNoKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlOiBWbm9kZVdpdGhEb20gfCBJVm5vZGUgPSBlbXB0eVZub2RlKSB7XG4gIGN1cnJlbnQudm5vZGUgPSBuZXdWbm9kZTtcbiAgY3VycmVudC5vbGRWbm9kZSA9IG9sZFZub2RlID09PSBlbXB0eVZub2RlID8gVW5kIDogKG9sZFZub2RlIGFzIFZub2RlV2l0aERvbSk7XG4gIGxldCBuZXdUcmVlID0gbmV3Vm5vZGUuY2hpbGRyZW47XG4gIGxldCBvbGRUcmVlID0gb2xkVm5vZGUuY2hpbGRyZW47XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdUcmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGNoaWxkVm5vZGUgPSBuZXdUcmVlW2ldO1xuICAgIGlmIChjaGlsZFZub2RlIGluc3RhbmNlb2YgVm5vZGUpIHtcbiAgICAgIGlmIChjaGlsZFZub2RlLnRhZyAhPT0gVGV4dFN0cmluZykge1xuICAgICAgICBpZiAoY2hpbGRWbm9kZS50YWcgPT09IENvbXBvbmVudFN0cmluZykge1xuICAgICAgICAgIGxldCBjb21wb25lbnQgPSBjaGlsZFZub2RlLmNvbXBvbmVudCBhcyBWYWx5cmlhbkNvbXBvbmVudDtcbiAgICAgICAgICBjdXJyZW50LmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gKFwidmlld1wiIGluIGNvbXBvbmVudCA/IGNvbXBvbmVudC52aWV3IDogY29tcG9uZW50KS5jYWxsKGNvbXBvbmVudCwgY2hpbGRWbm9kZS5wcm9wcywgLi4uY2hpbGRWbm9kZS5jaGlsZHJlbik7XG5cbiAgICAgICAgICBuZXdUcmVlLnNwbGljZShpLS0sIDEsIHJlc3VsdCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRWbm9kZS5pc1NWRyA9IG5ld1Zub2RlLmlzU1ZHIHx8IGNoaWxkVm5vZGUudGFnID09PSBcInN2Z1wiO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjaGlsZFZub2RlKSkge1xuICAgICAgbmV3VHJlZS5zcGxpY2UoaS0tLCAxLCAuLi5jaGlsZFZub2RlKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkVm5vZGUgPT09IG51bGwgfHwgY2hpbGRWbm9kZSA9PT0gVW5kKSB7XG4gICAgICBuZXdUcmVlLnNwbGljZShpLS0sIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdUcmVlW2ldID0gbmV3IFZub2RlKFRleHRTdHJpbmcsIHt9LCBbXSk7XG4gICAgICBuZXdUcmVlW2ldLm5vZGVWYWx1ZSA9IGNoaWxkVm5vZGU7XG4gICAgfVxuICB9XG5cbiAgbGV0IG9sZFRyZWVMZW5ndGggPSBvbGRUcmVlLmxlbmd0aDtcbiAgbGV0IG5ld1RyZWVMZW5ndGggPSBuZXdUcmVlLmxlbmd0aDtcblxuICAvLyBJZiBuZXcgdHJlZSBpcyBlbXB0eSwgcmVtb3ZlIGFsbCBvbGQgbm9kZXNcbiAgaWYgKG5ld1RyZWVMZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZFRyZWVMZW5ndGg7IGkrKykge1xuICAgICAgb2xkVHJlZVtpXS50YWcgIT09IFRleHRTdHJpbmcgJiYgb25yZW1vdmUob2xkVHJlZVtpXSk7XG4gICAgfVxuXG4gICAgbmV3Vm5vZGUuZG9tLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiB0aGUgdHJlZSBpcyBrZXllZCBsaXN0IGFuZCBpcyBub3QgZmlyc3QgcmVuZGVyIGFuZCBvbGQgdHJlZSBpcyBrZXllZCBsaXN0IHRvb1xuICBpZiAob2xkVHJlZUxlbmd0aCAmJiBcImtleVwiIGluIG5ld1RyZWVbMF0ucHJvcHMgJiYgXCJrZXlcIiBpbiBvbGRUcmVlWzBdLnByb3BzKSB7XG4gICAgbGV0IG9sZEtleWVkTGlzdDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2xkVHJlZUxlbmd0aDsgaSsrKSB7XG4gICAgICBvbGRLZXllZExpc3Rbb2xkVHJlZVtpXS5wcm9wcy5rZXldID0gaTtcbiAgICB9XG5cbiAgICBsZXQgbmV3S2V5ZWRMaXN0OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICAgIG5ld0tleWVkTGlzdFtuZXdUcmVlW2ldLnByb3BzLmtleV0gPSBpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZUxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgY2hpbGRWbm9kZSA9IG5ld1RyZWVbaV07XG4gICAgICBsZXQgb2xkQ2hpbGRWbm9kZSA9IG9sZFRyZWVbb2xkS2V5ZWRMaXN0W2NoaWxkVm5vZGUucHJvcHMua2V5XV07XG4gICAgICBsZXQgc2hvdWxkUGF0Y2ggPSB0cnVlO1xuXG4gICAgICBpZiAob2xkQ2hpbGRWbm9kZSkge1xuICAgICAgICBjaGlsZFZub2RlLmRvbSA9IG9sZENoaWxkVm5vZGUuZG9tO1xuICAgICAgICBpZiAoXCJ2LW9uY2VcIiBpbiBjaGlsZFZub2RlLnByb3BzIHx8IChjaGlsZFZub2RlLnByb3BzLnNob3VsZHVwZGF0ZSAmJiBjaGlsZFZub2RlLnByb3BzLnNob3VsZHVwZGF0ZShjaGlsZFZub2RlLCBvbGRDaGlsZFZub2RlKSA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgLy8gc2tpcCB0aGlzIHBhdGNoXG4gICAgICAgICAgY2hpbGRWbm9kZS5jaGlsZHJlbiA9IG9sZENoaWxkVm5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgc2hvdWxkUGF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRBdHRyaWJ1dGVzKGNoaWxkVm5vZGUsIG9sZENoaWxkVm5vZGUpO1xuICAgICAgICAgIGlmICh2LmlzTW91bnRlZCkge1xuICAgICAgICAgICAgY2hpbGRWbm9kZS5wcm9wcy5vbnVwZGF0ZSAmJiBjaGlsZFZub2RlLnByb3BzLm9udXBkYXRlKGNoaWxkVm5vZGUsIG9sZENoaWxkVm5vZGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGlsZFZub2RlLnByb3BzLm9uY3JlYXRlICYmIGNoaWxkVm5vZGUucHJvcHMub25jcmVhdGUoY2hpbGRWbm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlsZFZub2RlLmRvbSA9IGNyZWF0ZURvbUVsZW1lbnQoY2hpbGRWbm9kZS50YWcsIGNoaWxkVm5vZGUuaXNTVkcpO1xuICAgICAgICBzZXRBdHRyaWJ1dGVzKGNoaWxkVm5vZGUpO1xuICAgICAgICBjaGlsZFZub2RlLnByb3BzLm9uY3JlYXRlICYmIGNoaWxkVm5vZGUucHJvcHMub25jcmVhdGUoY2hpbGRWbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdWbm9kZS5kb20uY2hpbGROb2Rlc1tpXSA9PT0gVW5kKSB7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5hcHBlbmRDaGlsZChjaGlsZFZub2RlLmRvbSk7XG4gICAgICB9IGVsc2UgaWYgKG5ld1Zub2RlLmRvbS5jaGlsZE5vZGVzW2ldICE9PSBjaGlsZFZub2RlLmRvbSkge1xuICAgICAgICBvbGRUcmVlW2ldICYmIG5ld0tleWVkTGlzdFtvbGRUcmVlW2ldLnByb3BzLmtleV0gPT09IFVuZCAmJiBvbnJlbW92ZShvbGRUcmVlW2ldKTtcbiAgICAgICAgbmV3Vm5vZGUuZG9tLnJlcGxhY2VDaGlsZChjaGlsZFZub2RlLmRvbSwgbmV3Vm5vZGUuZG9tLmNoaWxkTm9kZXNbaV0pO1xuICAgICAgfVxuXG4gICAgICBzaG91bGRQYXRjaCAmJiBwYXRjaChjaGlsZFZub2RlLCBvbGRDaGlsZFZub2RlKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgdGhlIHJlc3Qgb2YgdGhlIGNoaWxkcmVuLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZW1cbiAgICBmb3IgKGxldCBpID0gbmV3VHJlZUxlbmd0aDsgaSA8IG9sZFRyZWVMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5ld0tleWVkTGlzdFtvbGRUcmVlW2ldLnByb3BzLmtleV0gPT09IFVuZCkge1xuICAgICAgICBsZXQgb2xkQ2hpbGRWbm9kZSA9IG9sZFRyZWVbaV07XG4gICAgICAgIG9ucmVtb3ZlKG9sZENoaWxkVm5vZGUpO1xuICAgICAgICBvbGRDaGlsZFZub2RlLmRvbS5wYXJlbnROb2RlICYmIG9sZENoaWxkVm5vZGUuZG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob2xkQ2hpbGRWbm9kZS5kb20pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIElmIG5ldyB0cmVlIGFuZCBvbGQgdHJlZSBoYXZlIG1vcmUgdGhhbiBvbmUgY2hpbGQsIHdlIHNob3VsZCB1cGRhdGUgdGhlIGRvbVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWVMZW5ndGg7IGkrKykge1xuICAgIGxldCBuZXdDaGlsZFZub2RlID0gbmV3VHJlZVtpXTtcblxuICAgIC8vIE9sZCBjaGlsZCBleGlzdHNcbiAgICBpZiAoaSA8IG9sZFRyZWVMZW5ndGgpIHtcbiAgICAgIGxldCBvbGRDaGlsZFZub2RlID0gb2xkVHJlZVtpXTtcbiAgICAgIC8vIE5ldyBjaGlsZCBpcyBhIHRleHQgbm9kZVxuICAgICAgaWYgKG5ld0NoaWxkVm5vZGUudGFnID09PSBUZXh0U3RyaW5nKSB7XG4gICAgICAgIC8vIE9sZCBjaGlsZCBpcyBhIHRleHQgbm9kZVxuICAgICAgICBpZiAob2xkQ2hpbGRWbm9kZS50YWcgPT09IFRleHRTdHJpbmcpIHtcbiAgICAgICAgICBuZXdDaGlsZFZub2RlLmRvbSA9IG9sZENoaWxkVm5vZGUuZG9tO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgICAgICAgICBpZiAobmV3Q2hpbGRWbm9kZS5kb20ubm9kZVZhbHVlICE9IG5ld0NoaWxkVm5vZGUubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICBuZXdDaGlsZFZub2RlLmRvbS5ub2RlVmFsdWUgPSBuZXdDaGlsZFZub2RlLm5vZGVWYWx1ZSBhcyBzdHJpbmc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT2xkIGNoaWxkIGlzIGEgbm9ybWFsIG5vZGVcbiAgICAgICAgbmV3Q2hpbGRWbm9kZS5kb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdDaGlsZFZub2RlLm5vZGVWYWx1ZSBhcyBzdHJpbmcpIGFzIHVua25vd24gYXMgRG9tRWxlbWVudDtcbiAgICAgICAgb25yZW1vdmUob2xkQ2hpbGRWbm9kZSk7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGRWbm9kZS5kb20sIG9sZENoaWxkVm5vZGUuZG9tKTtcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTmV3IGNoaWxkIGlzIGEgbm9ybWFsIG5vZGVcbiAgICAgIC8vIE9sZCBjaGlsZCBpcyB0aGUgc2FtZSB0eXBlIGFzIG5ldyBjaGlsZFxuICAgICAgaWYgKG9sZENoaWxkVm5vZGUudGFnID09PSBuZXdDaGlsZFZub2RlLnRhZykge1xuICAgICAgICBuZXdDaGlsZFZub2RlLmRvbSA9IG9sZENoaWxkVm5vZGUuZG9tO1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgdi1vbmNlIGRpcmVjdGl2ZSBvciBhIHNob3VsZHVwZGF0ZSBtZXRob2QgdGhhdCByZXR1cm5zIGZhbHNlLCB3ZSBza2lwIHRoZSB1cGRhdGVcbiAgICAgICAgaWYgKG5ld0NoaWxkVm5vZGUucHJvcHNbXCJ2LW9uY2VcIl0gfHwgKG5ld0NoaWxkVm5vZGUucHJvcHMuc2hvdWxkdXBkYXRlICYmIG5ld0NoaWxkVm5vZGUucHJvcHMuc2hvdWxkdXBkYXRlKG5ld0NoaWxkVm5vZGUsIG9sZENoaWxkVm5vZGUpID09PSBmYWxzZSkpIHtcbiAgICAgICAgICBuZXdDaGlsZFZub2RlLmNoaWxkcmVuID0gb2xkQ2hpbGRWbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIHVwZGF0ZSB0aGUgZG9tIGVsZW1lbnRcbiAgICAgICAgc2V0QXR0cmlidXRlcyhuZXdDaGlsZFZub2RlLCBvbGRDaGlsZFZub2RlKTtcbiAgICAgICAgaWYgKHYuaXNNb3VudGVkKSB7XG4gICAgICAgICAgbmV3Q2hpbGRWbm9kZS5wcm9wcy5vbnVwZGF0ZSAmJiBuZXdDaGlsZFZub2RlLnByb3BzLm9udXBkYXRlKG5ld0NoaWxkVm5vZGUsIG9sZENoaWxkVm5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0NoaWxkVm5vZGUucHJvcHMub25jcmVhdGUgJiYgbmV3Q2hpbGRWbm9kZS5wcm9wcy5vbmNyZWF0ZShuZXdDaGlsZFZub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhdGNoKG5ld0NoaWxkVm5vZGUsIG9sZENoaWxkVm5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gT2xkIGNoaWxkIGlzIG9mIGEgZGlmZmVyZW50IHR5cGUgdGhhbiBuZXcgY2hpbGRcbiAgICAgIG5ld0NoaWxkVm5vZGUuZG9tID0gY3JlYXRlRG9tRWxlbWVudChuZXdDaGlsZFZub2RlLnRhZywgbmV3Q2hpbGRWbm9kZS5pc1NWRyk7XG4gICAgICBzZXRBdHRyaWJ1dGVzKG5ld0NoaWxkVm5vZGUpO1xuICAgICAgb2xkQ2hpbGRWbm9kZS50YWcgIT09IFRleHRTdHJpbmcgJiYgb25yZW1vdmUob2xkQ2hpbGRWbm9kZSk7XG4gICAgICBuZXdDaGlsZFZub2RlLnByb3BzLm9uY3JlYXRlICYmIG5ld0NoaWxkVm5vZGUucHJvcHMub25jcmVhdGUobmV3Q2hpbGRWbm9kZSk7XG4gICAgICBuZXdWbm9kZS5kb20ucmVwbGFjZUNoaWxkKG5ld0NoaWxkVm5vZGUuZG9tLCBvbGRDaGlsZFZub2RlLmRvbSk7XG4gICAgICBwYXRjaChuZXdDaGlsZFZub2RlLCBlbXB0eVZub2RlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIE9sZCBjaGlsZCBkb2VzIG5vdCBleGlzdHNcbiAgICAvLyBOZXcgY2hpbGQgaXMgYSB0ZXh0IG5vZGVcbiAgICBpZiAobmV3Q2hpbGRWbm9kZS50YWcgPT09IFRleHRTdHJpbmcpIHtcbiAgICAgIG5ld0NoaWxkVm5vZGUuZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGRWbm9kZS5ub2RlVmFsdWUgYXMgc3RyaW5nKSBhcyB1bmtub3duIGFzIERvbUVsZW1lbnQ7XG4gICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQobmV3Q2hpbGRWbm9kZS5kb20pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gTmV3IGNoaWxkIGlzIGEgbm9ybWFsIG5vZGVcbiAgICBuZXdDaGlsZFZub2RlLmRvbSA9IGNyZWF0ZURvbUVsZW1lbnQobmV3Q2hpbGRWbm9kZS50YWcsIG5ld0NoaWxkVm5vZGUuaXNTVkcpO1xuICAgIHNldEF0dHJpYnV0ZXMobmV3Q2hpbGRWbm9kZSk7XG4gICAgbmV3Vm5vZGUuZG9tLmFwcGVuZENoaWxkKG5ld0NoaWxkVm5vZGUuZG9tKTtcbiAgICBuZXdDaGlsZFZub2RlLnByb3BzLm9uY3JlYXRlICYmIG5ld0NoaWxkVm5vZGUucHJvcHMub25jcmVhdGUobmV3Q2hpbGRWbm9kZSk7XG4gICAgcGF0Y2gobmV3Q2hpbGRWbm9kZSwgZW1wdHlWbm9kZSk7XG4gIH1cblxuICAvLyBGb3IgdGhlIHJlc3Qgb2YgdGhlIGNoaWxkcmVuLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZW1cbiAgZm9yIChsZXQgaSA9IG5ld1RyZWVMZW5ndGg7IGkgPCBvbGRUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgb2xkQ2hpbGRWbm9kZSA9IG9sZFRyZWVbaV07XG4gICAgb2xkQ2hpbGRWbm9kZS50YWcgIT09IFRleHRTdHJpbmcgJiYgb25yZW1vdmUob2xkQ2hpbGRWbm9kZSk7XG4gICAgb2xkQ2hpbGRWbm9kZS5kb20ucGFyZW50Tm9kZSAmJiBvbGRDaGlsZFZub2RlLmRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9sZENoaWxkVm5vZGUuZG9tKTtcbiAgfVxufVxuXG4vKioqIERpcmVjdGl2ZXMgKioqL1xuXG5mdW5jdGlvbiBkaXJlY3RpdmUobmFtZTogc3RyaW5nLCBkaXJlY3RpdmU6IERpcmVjdGl2ZSkge1xuICBsZXQgZnVsbE5hbWUgPSBgdi0ke25hbWV9YDtcbiAgZGlyZWN0aXZlc1tmdWxsTmFtZV0gPSBkaXJlY3RpdmU7XG4gIHJlc2VydmVkUHJvcHNbZnVsbE5hbWVdID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaGlkZURpcmVjdGl2ZSh0ZXN0OiBib29sZWFuKTogRGlyZWN0aXZlIHtcbiAgcmV0dXJuIChib29sOiBib29sZWFuLCB2bm9kZTogSVZub2RlLCBvbGRWbm9kZT86IElWbm9kZSkgPT4ge1xuICAgIGxldCB2YWx1ZSA9IHRlc3QgPyBib29sIDogIWJvb2w7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBsZXQgbmV3ZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XG4gICAgICBpZiAob2xkVm5vZGUgJiYgb2xkVm5vZGUuZG9tICYmIG9sZFZub2RlLmRvbS5wYXJlbnROb2RlKSB7XG4gICAgICAgIG9sZFZub2RlLnRhZyAhPT0gVGV4dFN0cmluZyAmJiBvbnJlbW92ZShvbGRWbm9kZSk7XG4gICAgICAgIG9sZFZub2RlLmRvbS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdkb20sIG9sZFZub2RlLmRvbSk7XG4gICAgICB9XG4gICAgICB2bm9kZS50YWcgPSBUZXh0U3RyaW5nO1xuICAgICAgdm5vZGUuY2hpbGRyZW4gPSBbXTtcbiAgICAgIHZub2RlLnByb3BzID0ge307XG4gICAgICB2bm9kZS5kb20gPSBuZXdkb20gYXMgdW5rbm93biBhcyBEb21FbGVtZW50O1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbn1cblxuY29uc3QgZGlyZWN0aXZlczogRGlyZWN0aXZlcyA9IHtcbiAgXCJ2LWlmXCI6IGhpZGVEaXJlY3RpdmUoZmFsc2UpLFxuICBcInYtdW5sZXNzXCI6IGhpZGVEaXJlY3RpdmUodHJ1ZSksXG4gIFwidi1mb3JcIjogKHNldDogdW5rbm93bltdLCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgdm5vZGUuY2hpbGRyZW4gPSBzZXQubWFwKHZub2RlLmNoaWxkcmVuWzBdKTtcbiAgfSxcbiAgXCJ2LXNob3dcIjogKGJvb2w6IGJvb2xlYW4sIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICAodm5vZGUuZG9tIGFzIHVua25vd24gYXMgeyBzdHlsZTogeyBkaXNwbGF5OiBzdHJpbmcgfSB9KS5zdHlsZS5kaXNwbGF5ID0gYm9vbCA/IFwiXCIgOiBcIm5vbmVcIjtcbiAgfSxcbiAgXCJ2LWNsYXNzXCI6IChjbGFzc2VzOiB7IFt4OiBzdHJpbmddOiBib29sZWFuIH0sIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBmb3IgKGxldCBuYW1lIGluIGNsYXNzZXMpIHtcbiAgICAgICh2bm9kZS5kb20gYXMgRG9tRWxlbWVudCkuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBjbGFzc2VzW25hbWVdKTtcbiAgICB9XG4gIH0sXG4gIFwidi1odG1sXCI6IChodG1sOiBzdHJpbmcsIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICB2bm9kZS5jaGlsZHJlbiA9IFt0cnVzdChodG1sKV07XG4gIH0sXG4gIFwidi1tb2RlbFwiOiAoW21vZGVsLCBwcm9wZXJ0eSwgZXZlbnRdOiBhbnlbXSwgdm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBsZXQgdmFsdWU7XG4gICAgbGV0IGhhbmRsZXI7XG4gICAgaWYgKHZub2RlLm5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uaW5wdXRcIjtcbiAgICAgIHN3aXRjaCAodm5vZGUucHJvcHMudHlwZSkge1xuICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjoge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5XSkpIHtcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHZhbCA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWU7XG4gICAgICAgICAgICAgIGxldCBpZHggPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWwpO1xuICAgICAgICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2bm9kZS5kb20udmFsdWUpICE9PSAtMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiB2bm9kZS5wcm9wcykge1xuICAgICAgICAgICAgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUucHJvcHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XSA9IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVyID0gKCkgPT4gKG1vZGVsW3Byb3BlcnR5XSA9ICFtb2RlbFtwcm9wZXJ0eV0pO1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgdmFsdWUsIHZub2RlLCBvbGRWbm9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJhZGlvXCI6IHtcbiAgICAgICAgICBzZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUuZG9tLnZhbHVlLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBzZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBtb2RlbFtwcm9wZXJ0eV0sIHZub2RlLCBvbGRWbm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZub2RlLm5hbWUgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgIGV2ZW50ID0gZXZlbnQgfHwgXCJvbmNsaWNrXCI7XG4gICAgICBpZiAodm5vZGUucHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgaGFuZGxlciA9IChlOiBFdmVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHtcbiAgICAgICAgICBsZXQgdmFsID0gKGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KS52YWx1ZTtcbiAgICAgICAgICBpZiAoZS5jdHJsS2V5KSB7XG4gICAgICAgICAgICBsZXQgaWR4ID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsKTtcbiAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoMCwgbW9kZWxbcHJvcGVydHldLmxlbmd0aCk7XG4gICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IElWbm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IFwidmFsdWVcIiBpbiBjaGlsZC5wcm9wcyA/IGNoaWxkLnByb3BzLnZhbHVlIDogY2hpbGQuY2hpbGRyZW4uam9pbihcIlwiKS50cmltKCk7XG4gICAgICAgICAgICBjaGlsZC5wcm9wcy5zZWxlY3RlZCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbHVlKSAhPT0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBJVm5vZGUpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBcInZhbHVlXCIgaW4gY2hpbGQucHJvcHMgPyBjaGlsZC5wcm9wcy52YWx1ZSA6IGNoaWxkLmNoaWxkcmVuLmpvaW4oXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuc2VsZWN0ZWQgPSB2YWx1ZSA9PT0gbW9kZWxbcHJvcGVydHldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2bm9kZS5uYW1lID09PSBcInRleHRhcmVhXCIpIHtcbiAgICAgIGV2ZW50ID0gZXZlbnQgfHwgXCJvbmlucHV0XCI7XG4gICAgICB2bm9kZS5jaGlsZHJlbiA9IFttb2RlbFtwcm9wZXJ0eV1dO1xuICAgIH1cblxuICAgIGlmICghdm5vZGUucHJvcHNbZXZlbnRdKSB7XG4gICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgaGFuZGxlciA9IChlOiBFdmVudCkgPT4gKG1vZGVsW3Byb3BlcnR5XSA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWUpO1xuICAgICAgfVxuICAgICAgc2V0QXR0cmlidXRlKGV2ZW50LCBoYW5kbGVyLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqKiBQbHVnaW5zICoqKi9cbmNvbnN0IHBsdWdpbnMgPSBuZXcgTWFwPFBsdWdpbiwgYW55PigpO1xuXG5mdW5jdGlvbiB1c2UocGx1Z2luOiBQbHVnaW4sIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCBhbnk+KTogdm9pZCB8IGFueSB7XG4gIGlmIChwbHVnaW5zLmhhcyhwbHVnaW4pKSB7XG4gICAgcmV0dXJuIHBsdWdpbnMuZ2V0KHBsdWdpbik7XG4gIH1cblxuICBsZXQgcmVzdWx0ID0gcGx1Z2luKHYsIG9wdGlvbnMpO1xuICBwbHVnaW5zLnNldChwbHVnaW4sIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiogSHlwZXJzY3JpcHQgKioqL1xuXG5jb25zdCB2OiBWYWx5cmlhbiA9IGZ1bmN0aW9uIHYodGFnT3JDb21wb25lbnQ6IHN0cmluZyB8IFZhbHlyaWFuQ29tcG9uZW50LCBwcm9wczogUHJvcHMsIC4uLmNoaWxkcmVuOiBDaGlsZHJlbik6IElWbm9kZSB8IFZub2RlQ29tcG9uZW50IHtcbiAgaWYgKHR5cGVvZiB0YWdPckNvbXBvbmVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBuZXcgVm5vZGUodGFnT3JDb21wb25lbnQsIHByb3BzIHx8IHt9LCBjaGlsZHJlbik7XG4gIH1cblxuICBjb25zdCB2bm9kZSA9IG5ldyBWbm9kZShcIl9fY29tcG9uZW50X19cIiwgcHJvcHMgfHwge30sIGNoaWxkcmVuKTtcbiAgdm5vZGUuY29tcG9uZW50ID0gdGFnT3JDb21wb25lbnQ7XG4gIHJldHVybiB2bm9kZSBhcyBWbm9kZUNvbXBvbmVudDtcbn07XG5cbnYuZnJhZ21lbnQgPSAocHJvcHM6IFByb3BzLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pOiBDaGlsZHJlbiA9PiB7XG4gIHJldHVybiBjaGlsZHJlbjtcbn07XG5cbi8qKiogViBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzICoqKi9cbi8vIFRoaXMgaXMgaW50ZW5kZWQgdG8gbWFrZSB0aGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBhdmFpbGFibGUgZm9yIHBsdWdpbnNcbnYuY3VycmVudCA9IGN1cnJlbnQ7XG5cbnYuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG5cbnYucmVzZXJ2ZWRQcm9wcyA9IHJlc2VydmVkUHJvcHM7XG5cbnYuaXNWbm9kZSA9IGlzVm5vZGU7XG52LmlzQ29tcG9uZW50ID0gaXNDb21wb25lbnQ7XG52LmlzVm5vZGVDb21wb25lbnQgPSBpc1Zub2RlQ29tcG9uZW50O1xuXG52LmlzTW91bnRlZCA9IGZhbHNlO1xudi5pc05vZGVKcyA9IGlzTm9kZUpzO1xudi50cnVzdCA9IHRydXN0O1xuXG52Lm9uQ2xlYW51cCA9IG9uQ2xlYW51cDtcbnYub25Vbm1vdW50ID0gb25Vbm1vdW50O1xudi5vbk1vdW50ID0gb25Nb3VudDtcbnYub25VcGRhdGUgPSBvblVwZGF0ZTtcblxudi5tb3VudCA9IG1vdW50O1xudi51bm1vdW50ID0gdW5tb3VudDtcbnYudXBkYXRlID0gdXBkYXRlO1xuXG52LnNldEF0dHJpYnV0ZSA9IHNldEF0dHJpYnV0ZTtcbnYuZGlyZWN0aXZlID0gZGlyZWN0aXZlO1xudi51c2UgPSB1c2U7XG5cbmV4cG9ydCBkZWZhdWx0IHY7XG4iXX0=