valyrian.js 7.2.6 → 7.2.8

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.
@@ -41,6 +41,7 @@ function deepFreeze(obj) {
41
41
  }
42
42
  var DataSet = class {
43
43
  #vnode;
44
+ // eslint-disable-next-line no-unused-vars
44
45
  #handler;
45
46
  #data = [];
46
47
  #isFrozen = false;
@@ -18,6 +18,7 @@ function deepFreeze(obj) {
18
18
  }
19
19
  var DataSet = class {
20
20
  #vnode;
21
+ // eslint-disable-next-line no-unused-vars
21
22
  #handler;
22
23
  #data = [];
23
24
  #isFrozen = false;
@@ -1,4 +1,4 @@
1
- export declare type Hook = any;
1
+ export type Hook = any;
2
2
  export interface HookDefinition {
3
3
  onCreate: (...args: any[]) => any;
4
4
  onUpdate?: (hook: Hook, ...args: any[]) => any;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/hooks/index.ts"],"names":[],"mappings":"AAQA,oBAAY,IAAI,GAAG,GAAG,CAAC;AAEvB,MAAM,WAAW,cAAc;IAE7B,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAElC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAE/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC;IAEhC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC;IAE/B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IAEzB,CAAC,cAAc,EAAE,cAAc,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CAC3D;AAED,eAAO,MAAM,UAAU,YAiEG,CAAC;AAS3B,eAAO,MAAM,QAAQ,YA7EyB,GAAG,EAAE,KAAK,GAqGtD,CAAC;AAGH,eAAO,MAAM,SAAS,YAxGwB,GAAG,EAAE,KAAK,GA4JtD,CAAC;AAEH,eAAO,MAAM,MAAM,YA9J2B,GAAG,EAAE,KAAK,GAqKtD,CAAC;AAEH,eAAO,MAAM,WAAW,YAvKsB,GAAG,EAAE,KAAK,GAqLtD,CAAC;AAEH,eAAO,MAAM,OAAO,YAvL0B,GAAG,EAAE,KAAK,GAuMtD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/hooks/index.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,IAAI,GAAG,GAAG,CAAC;AAEvB,MAAM,WAAW,cAAc;IAE7B,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAElC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAE/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC;IAEhC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC;IAE/B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IAEzB,CAAC,cAAc,EAAE,cAAc,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CAC3D;AAED,eAAO,MAAM,UAAU,YAiEG,CAAC;AAS3B,eAAO,MAAM,QAAQ,YA7EyB,GAAG,EAAE,KAAK,GAqGtD,CAAC;AAGH,eAAO,MAAM,SAAS,YAxGwB,GAAG,EAAE,KAAK,GA4JtD,CAAC;AAEH,eAAO,MAAM,MAAM,YA9J2B,GAAG,EAAE,KAAK,GAqKtD,CAAC;AAEH,eAAO,MAAM,WAAW,YAvKsB,GAAG,EAAE,KAAK,GAqLtD,CAAC;AAEH,eAAO,MAAM,OAAO,YAvL0B,GAAG,EAAE,KAAK,GAuMtD,CAAC"}
package/dist/index.js CHANGED
@@ -104,6 +104,7 @@ var reservedProps = {
104
104
  key: true,
105
105
  state: true,
106
106
  "v-keep": true,
107
+ // Built in directives
107
108
  "v-if": true,
108
109
  "v-unless": true,
109
110
  "v-for": true,
@@ -173,8 +174,11 @@ var hideDirective = (test) => (bool, vnode, oldnode) => {
173
174
  }
174
175
  };
175
176
  var directives = {
177
+ // The "v-if" directive hides an element if the given condition is false
176
178
  "v-if": hideDirective(false),
179
+ // The "v-unless" directive hides an element if the given condition is true
177
180
  "v-unless": hideDirective(true),
181
+ // The "v-for" directive creates a loop and applies a callback function to each item in the loop
178
182
  "v-for": (set, vnode) => {
179
183
  let newChildren = [];
180
184
  let callback = vnode.children[0];
@@ -183,17 +187,21 @@ var directives = {
183
187
  }
184
188
  vnode.children = newChildren;
185
189
  },
190
+ // The "v-show" directive shows or hides an element by setting the "display" style property
186
191
  "v-show": (bool, vnode) => {
187
192
  vnode.dom.style.display = bool ? "" : "none";
188
193
  },
194
+ // The "v-class" directive adds or removes class names from an element based on a condition
189
195
  "v-class": (classes, vnode) => {
190
196
  for (let name in classes) {
191
197
  vnode.dom.classList.toggle(name, classes[name]);
192
198
  }
193
199
  },
200
+ // The "v-html" directive sets the inner HTML of an element to the given HTML string
194
201
  "v-html": (html, vnode) => {
195
202
  vnode.children = [trust(html)];
196
203
  },
204
+ // The "v-model" directive binds the value of an input element to a model property
197
205
  "v-model": ([model, property, event], vnode, oldVnode) => {
198
206
  let value;
199
207
  let handler = (e) => model[property] = e.target.value;
@@ -284,6 +292,10 @@ var directives = {
284
292
  oldVnode
285
293
  );
286
294
  },
295
+ // The "v-create" directive is called when a new virtual node is created.
296
+ // The provided callback function is called with the new virtual node as an argument.
297
+ // This directive is only called once per virtual node, when it is first created.
298
+ // eslint-disable-next-line no-unused-vars
287
299
  "v-create": (callback, vnode, oldVnode) => {
288
300
  if (!oldVnode) {
289
301
  let cleanup = callback(vnode);
@@ -292,6 +304,9 @@ var directives = {
292
304
  }
293
305
  }
294
306
  },
307
+ // The "v-update" directive is called when an existing virtual node is updated.
308
+ // The provided callback function is called with the new and old virtual nodes as arguments.
309
+ // This directive is only called once per virtual node update.
295
310
  "v-update": (callback, vnode, oldVnode) => {
296
311
  if (oldVnode) {
297
312
  let cleanup = callback(vnode, oldVnode);
@@ -300,6 +315,9 @@ var directives = {
300
315
  }
301
316
  }
302
317
  },
318
+ // The "v-cleanup" directive is called when the update is cleaned up.
319
+ // The provided callback function is called with the old virtual node as an argument.
320
+ // This directive is only called once per virtual node, when the update is cleaned up.
303
321
  "v-cleanup": (callback, vnode, oldVnode) => {
304
322
  onCleanup(() => callback(vnode, oldVnode));
305
323
  }
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0ZXh0VGFnIiwiaXNOb2RlSnMiLCJCb29sZWFuIiwicHJvY2VzcyIsInZlcnNpb25zIiwibm9kZSIsImNyZWF0ZURvbUVsZW1lbnQiLCJ0YWciLCJpc1NWRyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwiY3JlYXRlRWxlbWVudCIsIlZub2RlIiwicHJvcHMiLCJjaGlsZHJlbiIsInRoaXMiLCJpc0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzVm5vZGUiLCJvYmplY3QiLCJpc1Zub2RlQ29tcG9uZW50IiwiZG9tVG9Wbm9kZSIsImRvbSIsIm5vZGVUeXBlIiwidm5vZGUiLCJub2RlVmFsdWUiLCJpIiwibCIsImNoaWxkTm9kZXMiLCJsZW5ndGgiLCJjaGlsZERvbSIsInB1c2giLCJhdHRyaWJ1dGVzIiwiYXR0ciIsIm5vZGVOYW1lIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwidHJ1c3QiLCJodG1sU3RyaW5nIiwiZGl2IiwiaW5uZXJIVE1MIiwidHJpbSIsIm1hcCIsImNhbGwiLCJpdGVtIiwibWFpbkNvbXBvbmVudCIsIm1haW5Wbm9kZSIsImlzTW91bnRlZCIsImN1cnJlbnQiLCJvbGRWbm9kZSIsImV2ZW50IiwicmVzZXJ2ZWRQcm9wcyIsImtleSIsInN0YXRlIiwib25DbGVhbnVwU2V0IiwiU2V0Iiwib25Nb3VudFNldCIsIm9uVXBkYXRlU2V0Iiwib25Vbm1vdW50U2V0Iiwib25DbGVhbnVwIiwiY2FsbGJhY2siLCJhZGQiLCJjYWxsU2V0Iiwic2V0IiwiY2xlYXIiLCJldmVudExpc3RlbmVyTmFtZXMiLCJldmVudExpc3RlbmVyIiwiZSIsInRhcmdldCIsIm5hbWUiLCJ0eXBlIiwiZGVmYXVsdFByZXZlbnRlZCIsInVwZGF0ZSIsInBhcmVudE5vZGUiLCJoaWRlRGlyZWN0aXZlIiwidGVzdCIsImJvb2wiLCJvbGRub2RlIiwibmV3ZG9tIiwiY3JlYXRlVGV4dE5vZGUiLCJyZXBsYWNlQ2hpbGQiLCJkaXJlY3RpdmVzIiwibmV3Q2hpbGRyZW4iLCJzdHlsZSIsImRpc3BsYXkiLCJjbGFzc2VzIiwiY2xhc3NMaXN0IiwidG9nZ2xlIiwiaHRtbCIsIm1vZGVsIiwicHJvcGVydHkiLCJ2YWx1ZSIsImhhbmRsZXIiLCJBcnJheSIsImlzQXJyYXkiLCJ2YWwiLCJpZHgiLCJpbmRleE9mIiwic3BsaWNlIiwic2hhcmVkU2V0QXR0cmlidXRlIiwibXVsdGlwbGUiLCJjdHJsS2V5IiwiZm9yRWFjaCIsImNoaWxkIiwiam9pbiIsInNlbGVjdGVkIiwicHJldkhhbmRsZXIiLCJjbGVhbnVwIiwibmV3Vm5vZGUiLCJhZGRFdmVudExpc3RlbmVyIiwic2xpY2UiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJ1cGRhdGVBdHRyaWJ1dGVzIiwicGF0Y2giLCJ0ZXh0Q29udGVudCIsIm5ld1RyZWUiLCJvbGRUcmVlIiwib2xkVHJlZUxlbmd0aCIsIm5ld1RyZWVMZW5ndGgiLCJvbGRLZXllZExpc3QiLCJuZXdLZXllZExpc3QiLCJuZXdDaGlsZCIsIm9sZENoaWxkIiwic2hvdWxkUGF0Y2giLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwidmlldyIsImJpbmQiLCJvbGRNYWluVm5vZGUiLCJ1bm1vdW50IiwicmVzdWx0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSIsInYiLCJ0YWdPckNvbXBvbmVudCIsImZyYWdtZW50IiwiXyIsImRpcmVjdGl2ZSIsImRpcmVjdGl2ZU5hbWUiLCJjb250YWluZXIiLCJxdWVyeVNlbGVjdG9yQWxsIiwidm5vZGVDb21wb25lbnQiXSwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eSAqL1xuLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuXG4vLyBUaGUgVm5vZGVQcm9wZXJ0aWVzIGludGVyZmFjZSByZXByZXNlbnRzIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIGEgdmlydHVhbCBub2RlLlxuZXhwb3J0IGludGVyZmFjZSBWbm9kZVByb3BlcnRpZXMge1xuICAvLyBBIHVuaXF1ZSBrZXkgZm9yIHRoZSB2aXJ0dWFsIG5vZGUsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBvciBhIG51bWJlci5cbiAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIG9wdGltaXppbmcgdXBkYXRlcyBpbiBhIGxpc3Qgb2Ygbm9kZXMuXG4gIGtleT86IHN0cmluZyB8IG51bWJlcjtcbiAgLy8gQSBzdGF0ZSBvYmplY3QgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHZpcnR1YWwgbm9kZS5cbiAgc3RhdGU/OiBhbnk7XG4gIC8vIEFuIGluZGV4IHNpZ25hdHVyZSB0aGF0IGFsbG93cyBmb3IgYW55IG90aGVyIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQuXG4gIFtrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbF06IGFueTtcbn1cblxuLy8gVGhlIERvbUVsZW1lbnQgaW50ZXJmYWNlIGV4dGVuZHMgdGhlIEVsZW1lbnQgaW50ZXJmYWNlIHdpdGggYW4gaW5kZXggc2lnbmF0dXJlLlxuLy8gVGhpcyBhbGxvd3MgZm9yIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gRE9NIGVsZW1lbnRzLlxuZXhwb3J0IGludGVyZmFjZSBEb21FbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLy8gVGhlIFZub2RlSW50ZXJmYWNlIHJlcHJlc2VudHMgYSB2aXJ0dWFsIG5vZGUuIEl0IGhhcyBhIG51bWJlciBvZiBvcHRpb25hbCBmaWVsZHMsXG4vLyBpbmNsdWRpbmcgYSB0YWcsIHByb3BzLCBjaGlsZHJlbiwgYW5kIGEgRE9NIGVsZW1lbnQuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlSW50ZXJmYWNlIHtcbiAgLy8gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdmlydHVhbCBub2RlLiBJdCB0YWtlcyBhIHRhZywgcHJvcHMsIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMuXG4gIC8vIFRoZSB0YWcgY2FuIGJlIGEgc3RyaW5nLCBhIGNvbXBvbmVudCwgb3IgYSBQT0pPIGNvbXBvbmVudC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG5ldyAodGFnOiBzdHJpbmcgfCBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50LCBwcm9wczogVm5vZGVQcm9wZXJ0aWVzLCBjaGlsZHJlbjogQ2hpbGRyZW4pOiBWbm9kZUludGVyZmFjZTtcbiAgLy8gVGhlIHRhZyBmb3IgdGhlIHZpcnR1YWwgbm9kZS4gSXQgY2FuIGJlIGEgc3RyaW5nLCBhIGNvbXBvbmVudCwgb3IgYSBQT0pPIGNvbXBvbmVudC5cbiAgdGFnOiBzdHJpbmcgfCBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50O1xuICAvLyBUaGUgcHJvcHMgZm9yIHRoZSB2aXJ0dWFsIG5vZGUuXG4gIHByb3BzOiBWbm9kZVByb3BlcnRpZXM7XG4gIC8vIFRoZSBjaGlsZHJlbiBmb3IgdGhlIHZpcnR1YWwgbm9kZS5cbiAgY2hpbGRyZW46IENoaWxkcmVuO1xuICAvLyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2aXJ0dWFsIG5vZGUgaXMgYW4gU1ZHIGVsZW1lbnQuXG4gIGlzU1ZHPzogYm9vbGVhbjtcbiAgLy8gVGhlIERPTSBlbGVtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHZpcnR1YWwgbm9kZS5cbiAgZG9tPzogRG9tRWxlbWVudDtcbiAgLy8gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmlydHVhbCBub2RlIGhhcyBiZWVuIHByb2Nlc3NlZCBpbiB0aGUga2V5ZWQgZGlmZmluZyBhbGdvcml0aG0uXG4gIHByb2Nlc3NlZD86IGJvb2xlYW47XG4gIC8vIEFuIGluZGV4IHNpZ25hdHVyZSB0aGF0IGFsbG93cyBmb3IgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byB0aGUgdmlydHVhbCBub2RlLlxuICBba2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2xdOiBhbnk7XG59XG5cbi8vIFRoZSBWbm9kZVdpdGhEb20gaW50ZXJmYWNlIHJlcHJlc2VudHMgYSB2aXJ0dWFsIG5vZGUgdGhhdCBoYXMgYSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlV2l0aERvbSBleHRlbmRzIFZub2RlSW50ZXJmYWNlIHtcbiAgZG9tOiBEb21FbGVtZW50O1xufVxuXG4vLyBUaGUgQ29tcG9uZW50IGludGVyZmFjZSByZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmlydHVhbCBub2RlIG9yIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzLlxuLy8gSXQgY2FuIGFsc28gaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCB7XG4gIC8vIFRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2aXJ0dWFsIG5vZGUgb3IgYSBsaXN0IG9mIHZpcnR1YWwgbm9kZXMuXG4gIC8vIEl0IGNhbiB0YWtlIHByb3BzIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAocHJvcHM/OiBWbm9kZVByb3BlcnRpZXMgfCBudWxsLCAuLi5jaGlsZHJlbjogYW55W10pOiBWbm9kZUludGVyZmFjZSB8IENoaWxkcmVuIHwgYW55O1xuICAvLyBBbiBpbmRleCBzaWduYXR1cmUgdGhhdCBhbGxvd3MgZm9yIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vLyBUaGUgUE9KT0NvbXBvbmVudCBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIFwicGxhaW4gb2xkIEphdmFTY3JpcHQgb2JqZWN0XCIgKFBPSk8pIGNvbXBvbmVudC5cbi8vIEl0IGhhcyBhIHZpZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmlydHVhbCBub2RlIG9yIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzLFxuLy8gYXMgd2VsbCBhcyBvcHRpb25hbCBwcm9wcyBhbmQgY2hpbGRyZW4uXG4vLyBJdCBjYW4gYmUgdXNlZCBhbHNvIHRvIGlkZW50aWZ5IGNsYXNzIGluc3RhbmNlIGNvbXBvbmVudHMuXG5leHBvcnQgaW50ZXJmYWNlIFBPSk9Db21wb25lbnQge1xuICAvLyBUaGUgdmlldyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2aXJ0dWFsIG5vZGUgb3IgYSBsaXN0IG9mIHZpcnR1YWwgbm9kZXMuXG4gIHZpZXc6IENvbXBvbmVudDtcbiAgLy8gVGhlIHByb3BzIGZvciB0aGUgY29tcG9uZW50LlxuICBwcm9wcz86IFZub2RlUHJvcGVydGllcyB8IG51bGw7XG4gIC8vIFRoZSBjaGlsZHJlbiBmb3IgdGhlIGNvbXBvbmVudC5cbiAgY2hpbGRyZW4/OiBhbnlbXTtcbiAgLy8gQW4gaW5kZXggc2lnbmF0dXJlIHRoYXQgYWxsb3dzIGZvciBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBQT0pPIGNvbXBvbmVudC5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vLyBUaGUgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgcmVwcmVzZW50cyBhIHZpcnR1YWwgbm9kZSB0aGF0IGhhcyBhIGNvbXBvbmVudCBhcyBpdHMgdGFnLlxuLy8gSXQgaGFzIHByb3BzIGFuZCBjaGlsZHJlbiwganVzdCBsaWtlIGEgcmVndWxhciB2aXJ0dWFsIG5vZGUuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIGV4dGVuZHMgVm5vZGVJbnRlcmZhY2Uge1xuICB0YWc6IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQ7XG4gIHByb3BzOiBWbm9kZVByb3BlcnRpZXM7XG4gIGNoaWxkcmVuOiBDaGlsZHJlbjtcbn1cblxuLy8gVGhlIENoaWxkcmVuIGludGVyZmFjZSByZXByZXNlbnRzIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzIG9yIG90aGVyIHZhbHVlcy5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRyZW4gZXh0ZW5kcyBBcnJheTxWbm9kZUludGVyZmFjZSB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIHwgYW55PiB7fVxuXG4vLyBUaGUgRGlyZWN0aXZlIGludGVyZmFjZSByZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIHZpcnR1YWwgbm9kZS5cbi8vIEl0IHJlY2VpdmVzIHRoZSB2YWx1ZSwgdmlydHVhbCBub2RlLCBhbmQgb2xkIHZpcnR1YWwgbm9kZSBhcyBhcmd1bWVudHMsIGFuZCBjYW4gcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZS5cbi8vIElmIG9ubHkgdGhlIHZpcnR1YWwgbm9kZSBpcyBwYXNzZWQsIGl0IG1lYW5zIGl0cyB0aGUgb24gY3JlYXRlIHBoYXNlIGZvciB0aGUgdi1ub2RlLlxuLy8gSWYgdGhlIG9sZCB2aXJ0dWFsIG5vZGUgaXMgYWxzbyBwYXNzZWQsIGl0IG1lYW5zIGl0cyB0aGUgb24gdXBkYXRlIHBoYXNlIGZvciB0aGUgdi1ub2RlLlxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgKHZhbHVlOiBhbnksIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB8IGJvb2xlYW47XG59XG5cbi8vIFRoZSBEaXJlY3RpdmVzIGludGVyZmFjZSBpcyBhIG1hcHBpbmcgb2YgZGlyZWN0aXZlIG5hbWVzIHRvIERpcmVjdGl2ZSBmdW5jdGlvbnMuXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZXMge1xuICBba2V5OiBzdHJpbmddOiBEaXJlY3RpdmU7XG59XG5cbi8vIFRoZSBSZXNlcnZlZFByb3BzIGludGVyZmFjZSBpcyBhIG1hcHBpbmcgb2YgcmVzZXJ2ZWQgcHJvcCBuYW1lcyB0byB0aGUgdmFsdWUgYHRydWVgLlxuLy8gVGhlc2UgcHJvcCBuYW1lcyBjYW5ub3QgYmUgdXNlZCBhcyBjdXN0b20gcHJvcCBuYW1lcy5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzZXJ2ZWRQcm9wcyB7XG4gIFtrZXk6IHN0cmluZ106IHRydWU7XG59XG5cbi8vIFRoZSBDdXJyZW50IGludGVyZmFjZSByZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgdmlydHVhbCBub2RlIHRoYXQgYXJlIGJlaW5nIHByb2Nlc3NlZC5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VycmVudCB7XG4gIC8vIFRoZSBjdXJyZW50IGNvbXBvbmVudC4gSXQgY2FuIGJlIGEgY29tcG9uZW50LCBhIFBPSk8gY29tcG9uZW50LCBvciBudWxsLlxuICBjb21wb25lbnQ6IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQgfCBudWxsO1xuICAvLyBUaGUgY3VycmVudCB2aXJ0dWFsIG5vZGUuIEl0IG11c3QgaGF2ZSBhIERPTSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgdm5vZGU6IFZub2RlV2l0aERvbSB8IG51bGw7XG4gIC8vIFRoZSBvbGQgdmlydHVhbCBub2RlLiBJdCBtdXN0IGhhdmUgYSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuXG4gIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tIHwgbnVsbDtcbiAgLy8gVGhlIGN1cnJlbnQgZXZlbnQuIEl0IGNhbiBiZSBhbiBldmVudCBvciBudWxsLlxuICBldmVudDogRXZlbnQgfCBudWxsO1xufVxuXG4vLyBUaGUgViBmdW5jdGlvbiBpcyB0aGUgbWFpbiBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgdmlydHVhbCBub2Rlcy5cbi8vIEl0IHRha2VzIGEgdGFnIG9yIGNvbXBvbmVudCwgcHJvcHMsIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm5zIGEgdmlydHVhbCBub2RlLlxuZXhwb3J0IGludGVyZmFjZSBWIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICAodGFnT3JDb21wb25lbnQ6IHN0cmluZyB8IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQsIHByb3BzOiBWbm9kZVByb3BlcnRpZXMgfCBudWxsLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pOlxuICAgIHwgVm5vZGVJbnRlcmZhY2VcbiAgICB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIGZyYWdtZW50KF86IGFueSwgLi4uY2hpbGRyZW46IENoaWxkcmVuKTogQ2hpbGRyZW47XG59XG4vLyAndGV4dFRhZycgaXMgYSBjb25zdGFudCBzdHJpbmcgdGhhdCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0ZXh0IG5vZGVzIGluIHRoZSB2aXJ0dWFsIERPTS5cbmNvbnN0IHRleHRUYWcgPSBcIiN0ZXh0XCI7XG5cbi8vICdpc05vZGVKcycgaXMgYSBib29sZWFuIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgY29kZSBpcyBydW5uaW5nIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLlxuLy8gSXQgaXMgZGV0ZXJtaW5lZCBieSBjaGVja2luZyBpZiB0aGUgJ3Byb2Nlc3MnIGdsb2JhbCBvYmplY3QgaXMgZGVmaW5lZCBhbmQgaGFzIGEgJ3ZlcnNpb25zJyBwcm9wZXJ0eS5cbmV4cG9ydCBsZXQgaXNOb2RlSnMgPSBCb29sZWFuKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcblxuLy8gJ2NyZWF0ZURvbUVsZW1lbnQnIGlzIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgbmV3IERPTSBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCB0YWcgbmFtZS5cbi8vIElmICdpc1NWRycgaXMgdHJ1ZSwgaXQgY3JlYXRlcyBhbiBTVkcgZWxlbWVudCBpbnN0ZWFkIG9mIGEgcmVndWxhciBET00gZWxlbWVudC5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEb21FbGVtZW50KHRhZzogc3RyaW5nLCBpc1NWRzogYm9vbGVhbiA9IGZhbHNlKTogRG9tRWxlbWVudCB7XG4gIHJldHVybiBpc1NWRyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHRhZykgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG59XG5cbi8vICdWbm9kZScgaXMgYSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSB2aXJ0dWFsIERPTSBub2RlLlxuLy8gSXQgaGFzIHRocmVlIHByb3BlcnRpZXM6ICd0YWcnLCAncHJvcHMnLCBhbmQgJ2NoaWxkcmVuJy5cbi8vICdWbm9kZScgaXMgZXhwb3J0ZWQgYXMgYW4gb2JqZWN0IHdpdGggYSB0eXBlIG9mICdWbm9kZUludGVyZmFjZScuXG4vLyBUaGUgJ2FzIHVua25vd24gYXMgVm5vZGVJbnRlcmZhY2UnIGlzIHVzZWQgdG8gdGVsbCBUeXBlU2NyaXB0IHRoYXQgdGhlICdWbm9kZScgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHR5cGUgYXMgJ1Zub2RlSW50ZXJmYWNlJy5cbmV4cG9ydCBjb25zdCBWbm9kZSA9IGZ1bmN0aW9uIFZub2RlKHRoaXM6IFZub2RlSW50ZXJmYWNlLCB0YWc6IHN0cmluZywgcHJvcHM6IFZub2RlUHJvcGVydGllcywgY2hpbGRyZW46IENoaWxkcmVuKSB7XG4gIC8vICd0aGlzJyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgJ1Zub2RlJy5cbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xufSBhcyB1bmtub3duIGFzIFZub2RlSW50ZXJmYWNlO1xuXG4vLyAnaXNDb21wb25lbnQnIGlzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuICdjb21wb25lbnQnIGlzIGEgdmFsaWQgY29tcG9uZW50IGFuZCBmYWxzZSBvdGhlcndpc2UuXG4vLyBBIGNvbXBvbmVudCBpcyBlaXRoZXIgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhICd2aWV3JyBmdW5jdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudChjb21wb25lbnQpOiBjb21wb25lbnQgaXMgQ29tcG9uZW50IHtcbiAgcmV0dXJuIGNvbXBvbmVudCAmJiAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiIHx8ICh0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIFwidmlld1wiIGluIGNvbXBvbmVudCkpO1xufVxuXG4vLyAnaXNWbm9kZScgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ29iamVjdCcgaXMgYSAnVm5vZGUnIGluc3RhbmNlIGFuZCBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnQgY29uc3QgaXNWbm9kZSA9IChvYmplY3Q/OiB1bmtub3duIHwgVm5vZGVJbnRlcmZhY2UpOiBvYmplY3QgaXMgVm5vZGVJbnRlcmZhY2UgPT4ge1xuICAvLyBVc2UgdGhlICdpbnN0YW5jZW9mJyBvcGVyYXRvciB0byBjaGVjayBpZiAnb2JqZWN0JyBpcyBhbiBpbnN0YW5jZSBvZiAnVm5vZGUnLlxuICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgVm5vZGU7XG59O1xuXG4vLyAnaXNWbm9kZUNvbXBvbmVudCcgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ29iamVjdCcgaXMgYSAnVm5vZGUnIGluc3RhbmNlIHdpdGggYSAndGFnJyBwcm9wZXJ0eSB0aGF0IGlzIGEgdmFsaWQgY29tcG9uZW50LlxuLy8gSXQgcmV0dXJucyBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnQgY29uc3QgaXNWbm9kZUNvbXBvbmVudCA9IChvYmplY3Q/OiB1bmtub3duIHwgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UpOiBvYmplY3QgaXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgPT4ge1xuICAvLyBDaGVjayBpZiAnb2JqZWN0JyBpcyBhICdWbm9kZScgaW5zdGFuY2UgYW5kIGl0cyAndGFnJyBwcm9wZXJ0eSBpcyBhIHZhbGlkIGNvbXBvbmVudC5cbiAgcmV0dXJuIGlzVm5vZGUob2JqZWN0KSAmJiBpc0NvbXBvbmVudChvYmplY3QudGFnKTtcbn07XG5cbi8vICdkb21Ub1Zub2RlJyBpcyBhIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYSBET00gbm9kZSB0byBhICdWbm9kZScgaW5zdGFuY2UuXG5leHBvcnQgZnVuY3Rpb24gZG9tVG9Wbm9kZShkb206IGFueSk6IFZub2RlV2l0aERvbSB7XG4gIC8vIElmIHRoZSBjaGlsZCBub2RlIGlzIGEgdGV4dCBub2RlLCBjcmVhdGUgYSAnVm5vZGUnIGluc3RhbmNlIHdpdGggdGhlICd0ZXh0VGFnJyBjb25zdGFudCBhcyB0aGUgJ3RhZycgcHJvcGVydHkuXG4gIC8vIFNldCB0aGUgJ2RvbScgcHJvcGVydHkgb2YgdGhlICdWbm9kZScgaW5zdGFuY2UgdG8gdGhlIGNoaWxkIERPTSBub2RlLlxuICAvLyBQdXNoIHRoZSAnVm5vZGUnIGluc3RhbmNlIHRvIHRoZSAnY2hpbGRyZW4nIGFycmF5LlxuICBpZiAoZG9tLm5vZGVUeXBlID09PSAzKSB7XG4gICAgbGV0IHZub2RlID0gbmV3IFZub2RlKHRleHRUYWcsIHt9LCBbZG9tLm5vZGVWYWx1ZV0pO1xuICAgIHZub2RlLmRvbSA9IGRvbTtcbiAgICByZXR1cm4gdm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICB9XG5cbiAgbGV0IGNoaWxkcmVuOiBWbm9kZVdpdGhEb21bXSA9IFtdO1xuICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIGNoaWxkIG5vZGVzIG9mICdkb20nLlxuICBmb3IgKGxldCBpID0gMCwgbCA9IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGxldCBjaGlsZERvbSA9IGRvbS5jaGlsZE5vZGVzW2ldO1xuICAgIC8vIElmIHRoZSBjaGlsZCBub2RlIGlzIGFuIGVsZW1lbnQgbm9kZSwgcmVjdXJzaXZlbHkgY2FsbCAnZG9tVG9Wbm9kZScgdG8gY29udmVydCBpdCB0byBhICdWbm9kZScgaW5zdGFuY2UuXG4gICAgLy8gUHVzaCB0aGUgJ1Zub2RlJyBpbnN0YW5jZSB0byB0aGUgJ2NoaWxkcmVuJyBhcnJheS5cbiAgICBpZiAoY2hpbGREb20ubm9kZVR5cGUgPT09IDEgfHwgY2hpbGREb20ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goZG9tVG9Wbm9kZShjaGlsZERvbSkpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBwcm9wczogVm5vZGVQcm9wZXJ0aWVzID0ge307XG4gIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgYXR0cmlidXRlcyBvZiAnZG9tJy5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBkb20uYXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBsZXQgYXR0ciA9IGRvbS5hdHRyaWJ1dGVzW2ldO1xuICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlIHRvIHRoZSAncHJvcHMnIG9iamVjdCwgdXNpbmcgdGhlIGF0dHJpYnV0ZSdzIG5hbWUgYXMgdGhlIGtleSBhbmQgaXRzIHZhbHVlIGFzIHRoZSB2YWx1ZS5cbiAgICBwcm9wc1thdHRyLm5vZGVOYW1lXSA9IGF0dHIubm9kZVZhbHVlO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbmV3ICdWbm9kZScgaW5zdGFuY2Ugd2l0aCB0aGUgJ3RhZycgcHJvcGVydHkgc2V0IHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiBvZiB0aGUgRE9NIG5vZGUncyB0YWcgbmFtZS5cbiAgLy8gU2V0IHRoZSAncHJvcHMnIGFuZCAnY2hpbGRyZW4nIHByb3BlcnRpZXMgdG8gdGhlICdwcm9wcycgYW5kICdjaGlsZHJlbicgYXJyYXlzIHJlc3BlY3RpdmVseS5cbiAgLy8gU2V0IHRoZSAnZG9tJyBwcm9wZXJ0eSBvZiB0aGUgJ1Zub2RlJyBpbnN0YW5jZSB0byB0aGUgRE9NIG5vZGUuXG4gIGxldCB2bm9kZSA9IG5ldyBWbm9kZShkb20udGFnTmFtZS50b0xvd2VyQ2FzZSgpLCBwcm9wcywgY2hpbGRyZW4pO1xuICB2bm9kZS5kb20gPSBkb207XG4gIHJldHVybiB2bm9kZSBhcyBWbm9kZVdpdGhEb207XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gYW4gSFRNTCBzdHJpbmcgYW5kIGNyZWF0ZXMgYSB2aXJ0dWFsIG5vZGUgcmVwcmVzZW50YXRpb24gb2YgaXRcbi8vIHVzaW5nIHRoZSBgZG9tVG9Wbm9kZWAgZnVuY3Rpb24uIEl0IGRvZXMgdGhpcyBieSBjcmVhdGluZyBhIG5ldyBgZGl2YCBlbGVtZW50LCBzZXR0aW5nXG4vLyBpdHMgYGlubmVySFRNTGAgdG8gdGhlIHByb3ZpZGVkIEhUTUwgc3RyaW5nLCBhbmQgdGhlbiB1c2luZyBgbWFwYCB0byBpdGVyYXRlIG92ZXIgdGhlXG4vLyBgY2hpbGROb2Rlc2Agb2YgdGhlIGBkaXZgIGVsZW1lbnQsIHBhc3NpbmcgZWFjaCBvbmUgdG8gYGRvbVRvVm5vZGVgIHRvIGNyZWF0ZSBhIHZpcnR1YWxcbi8vIG5vZGUgcmVwcmVzZW50YXRpb24gb2YgaXQuIFRoZSByZXN1bHRpbmcgYXJyYXkgb2YgdmlydHVhbCBub2RlcyBpcyB0aGVuIHJldHVybmVkLlxuZXhwb3J0IGZ1bmN0aW9uIHRydXN0KGh0bWxTdHJpbmc6IHN0cmluZykge1xuICBsZXQgZGl2ID0gY3JlYXRlRG9tRWxlbWVudChcImRpdlwiKTtcbiAgZGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmcudHJpbSgpO1xuXG4gIHJldHVybiBbXS5tYXAuY2FsbChkaXYuY2hpbGROb2RlcywgKGl0ZW0pID0+IGRvbVRvVm5vZGUoaXRlbSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyogTWFpbiBDb21wb25lbnQgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8vIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBzdG9yZSB0aGUgbWFpbiBjb21wb25lbnQsIHRoZSBtYWluIHZpcnR1YWwgbm9kZSwgYW5kIHdoZXRoZXJcbi8vIHRoZSBtYWluIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgbW91bnRlZC5cbmxldCBtYWluQ29tcG9uZW50OiBWbm9kZUNvbXBvbmVudEludGVyZmFjZSB8IG51bGwgPSBudWxsO1xubGV0IG1haW5Wbm9kZTogVm5vZGVXaXRoRG9tIHwgbnVsbCA9IG51bGw7XG5sZXQgaXNNb3VudGVkID0gZmFsc2U7XG5cbi8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIGN1cnJlbnQgdmlydHVhbCBub2RlIGFuZCBjb21wb25lbnQgYmVpbmcgcmVuZGVyZWQuXG5leHBvcnQgY29uc3QgY3VycmVudDogQ3VycmVudCA9IHtcbiAgdm5vZGU6IG51bGwsXG4gIG9sZFZub2RlOiBudWxsLFxuICBjb21wb25lbnQ6IG51bGwsXG4gIGV2ZW50OiBudWxsXG59O1xuXG4vKiBSZXNlcnZlZCBwcm9wcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLy8gVGhpcyBvYmplY3QgaXMgdXNlZCB0byBzdG9yZSB0aGUgbmFtZXMgb2YgcmVzZXJ2ZWQgcHJvcHMsIHdoaWNoIGFyZSBwcm9wcyB0aGF0IGFyZSByZXNlcnZlZFxuLy8gZm9yIHNwZWNpYWwgcHVycG9zZXMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBhcyByZWd1bGFyIGNvbXBvbmVudCBwcm9wcy5cbmV4cG9ydCBjb25zdCByZXNlcnZlZFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB0cnVlPiA9IHtcbiAga2V5OiB0cnVlLFxuICBzdGF0ZTogdHJ1ZSxcbiAgXCJ2LWtlZXBcIjogdHJ1ZSxcblxuICAvLyBCdWlsdCBpbiBkaXJlY3RpdmVzXG4gIFwidi1pZlwiOiB0cnVlLFxuICBcInYtdW5sZXNzXCI6IHRydWUsXG4gIFwidi1mb3JcIjogdHJ1ZSxcbiAgXCJ2LXNob3dcIjogdHJ1ZSxcbiAgXCJ2LWNsYXNzXCI6IHRydWUsXG4gIFwidi1odG1sXCI6IHRydWUsXG4gIFwidi1tb2RlbFwiOiB0cnVlLFxuICBcInYtY3JlYXRlXCI6IHRydWUsXG4gIFwidi11cGRhdGVcIjogdHJ1ZSxcbiAgXCJ2LWNsZWFudXBcIjogdHJ1ZVxufTtcblxuLyogTW91bnRpbmcsIFVwZGF0aW5nLCBDbGVhbnVwIGFuZCBVbm1vdW50aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi8vIFRoZXNlIHNldHMgYXJlIHVzZWQgdG8gc3RvcmUgY2FsbGJhY2tzIGZvciB2YXJpb3VzIGxpZmVjeWNsZSBldmVudHM6IG1vdW50aW5nLCB1cGRhdGluZyxcbi8vIGNsZWFuaW5nIHVwLCBhbmQgdW5tb3VudGluZy5cbmNvbnN0IG9uQ2xlYW51cFNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcbmNvbnN0IG9uTW91bnRTZXQ6IFNldDxGdW5jdGlvbj4gPSBuZXcgU2V0KCk7XG5jb25zdCBvblVwZGF0ZVNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcbmNvbnN0IG9uVW5tb3VudFNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcblxuLy8gVGhlc2UgZnVuY3Rpb25zIGFsbG93IHVzZXJzIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbGlmZWN5Y2xlIGV2ZW50cy5cbmV4cG9ydCBmdW5jdGlvbiBvbk1vdW50KGNhbGxiYWNrKSB7XG4gIGlmICghaXNNb3VudGVkKSB7XG4gICAgb25Nb3VudFNldC5hZGQoY2FsbGJhY2spO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvblVwZGF0ZShjYWxsYmFjaykge1xuICBvblVwZGF0ZVNldC5hZGQoY2FsbGJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25DbGVhbnVwKGNhbGxiYWNrKSB7XG4gIG9uQ2xlYW51cFNldC5hZGQoY2FsbGJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25Vbm1vdW50KGNhbGxiYWNrKSB7XG4gIGlmICghaXNNb3VudGVkKSB7XG4gICAgb25Vbm1vdW50U2V0LmFkZChjYWxsYmFjayk7XG4gIH1cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNhbGwgYWxsIHRoZSBjYWxsYmFja3MgaW4gYSBnaXZlbiBzZXQuXG5mdW5jdGlvbiBjYWxsU2V0KHNldCkge1xuICBmb3IgKGxldCBjYWxsYmFjayBvZiBzZXQpIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgc2V0LmNsZWFyKCk7XG59XG5cbi8qIEV2ZW50IGxpc3RlbmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8vIFRoaXMgb2JqZWN0IHN0b3JlcyB0aGUgbmFtZXMgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkXG5jb25zdCBldmVudExpc3RlbmVyTmFtZXM6IFJlY29yZDxzdHJpbmcsIHRydWU+ID0ge307XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYW4gZXZlbnQgb2NjdXJzXG5mdW5jdGlvbiBldmVudExpc3RlbmVyKGU6IEV2ZW50KSB7XG4gIC8vIFNldCB0aGUgY3VycmVudCBldmVudCB0byB0aGUgZXZlbnQgdGhhdCBvY2N1cnJlZCBzbyB0aGF0IGl0IGNhbiBiZSBwcmV2ZW50ZWQgaWYgbmVjZXNzYXJ5XG4gIGN1cnJlbnQuZXZlbnQgPSBlO1xuXG4gIC8vIENvbnZlcnQgdGhlIHRhcmdldCBvZiB0aGUgZXZlbnQgdG8gYSBET00gZWxlbWVudFxuICBsZXQgZG9tID0gZS50YXJnZXQgYXMgRG9tRWxlbWVudDtcblxuICAvLyBDcmVhdGUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IGxpc3RlbmVyIGJ5IGFkZGluZyBcInYtb25cIiB0byB0aGUgZXZlbnQgdHlwZVxuICBsZXQgbmFtZSA9IGB2LW9uJHtlLnR5cGV9YDtcblxuICAvLyBLZWVwIGdvaW5nIHVwIHRoZSBET00gdHJlZSB1bnRpbCB3ZSBmaW5kIGFuIGVsZW1lbnQgd2l0aCBhbiBldmVudCBsaXN0ZW5lclxuICAvLyBtYXRjaGluZyB0aGUgZXZlbnQgdHlwZVxuICB3aGlsZSAoZG9tKSB7XG4gICAgaWYgKGRvbVtuYW1lXSkge1xuICAgICAgLy8gQ2FsbCB0aGUgZXZlbnQgbGlzdGVuZXIgZnVuY3Rpb25cbiAgICAgIGRvbVtuYW1lXShlLCBkb20pO1xuXG4gICAgICAvLyBJZiB0aGUgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGV2ZW50IGhhc24ndCBiZWVuIHByZXZlbnRlZCwgdXBkYXRlIHRoZSBET01cbiAgICAgIGlmICghZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHVwZGF0ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkb20gPSBkb20ucGFyZW50Tm9kZSBhcyBEb21FbGVtZW50O1xuICB9XG5cbiAgY3VycmVudC5ldmVudCA9IG51bGw7XG59XG5cbi8qIERpcmVjdGl2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8vIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGRpcmVjdGl2ZSB0aGF0IGhpZGVzIGFuIGVsZW1lbnQgYmFzZWQgb24gYSBjb25kaXRpb25cbmxldCBoaWRlRGlyZWN0aXZlID0gKHRlc3Q6IGJvb2xlYW4pID0+IChib29sOiBib29sZWFuLCB2bm9kZTogVm5vZGVJbnRlcmZhY2UsIG9sZG5vZGU/OiBWbm9kZUludGVyZmFjZSkgPT4ge1xuICAvLyBJZiB0ZXN0IGlzIHRydWUsIHVzZSB0aGUgdmFsdWUgb2YgYm9vbC4gT3RoZXJ3aXNlLCB1c2UgdGhlIG9wcG9zaXRlIG9mIGJvb2wuXG4gIGxldCB2YWx1ZSA9IHRlc3QgPyBib29sIDogIWJvb2w7XG5cbiAgLy8gSWYgdGhlIHZhbHVlIGlzIHRydWUsIGhpZGUgdGhlIGVsZW1lbnQgYnkgcmVwbGFjaW5nIGl0IHdpdGggYSB0ZXh0IG5vZGVcbiAgaWYgKHZhbHVlKSB7XG4gICAgbGV0IG5ld2RvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgIGlmIChvbGRub2RlICYmIG9sZG5vZGUuZG9tICYmIG9sZG5vZGUuZG9tLnBhcmVudE5vZGUpIHtcbiAgICAgIG9sZG5vZGUuZG9tLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld2RvbSwgb2xkbm9kZS5kb20pO1xuICAgIH1cbiAgICB2bm9kZS50YWcgPSBcIiN0ZXh0XCI7XG4gICAgdm5vZGUuY2hpbGRyZW4gPSBbXTtcbiAgICB2bm9kZS5wcm9wcyA9IHt9O1xuICAgIHZub2RlLmRvbSA9IG5ld2RvbSBhcyB1bmtub3duIGFzIERvbUVsZW1lbnQ7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vLyBUaGlzIG9iamVjdCBzdG9yZXMgYWxsIHRoZSBhdmFpbGFibGUgZGlyZWN0aXZlc1xuZXhwb3J0IGNvbnN0IGRpcmVjdGl2ZXM6IERpcmVjdGl2ZXMgPSB7XG4gIC8vIFRoZSBcInYtaWZcIiBkaXJlY3RpdmUgaGlkZXMgYW4gZWxlbWVudCBpZiB0aGUgZ2l2ZW4gY29uZGl0aW9uIGlzIGZhbHNlXG4gIFwidi1pZlwiOiBoaWRlRGlyZWN0aXZlKGZhbHNlKSxcblxuICAvLyBUaGUgXCJ2LXVubGVzc1wiIGRpcmVjdGl2ZSBoaWRlcyBhbiBlbGVtZW50IGlmIHRoZSBnaXZlbiBjb25kaXRpb24gaXMgdHJ1ZVxuICBcInYtdW5sZXNzXCI6IGhpZGVEaXJlY3RpdmUodHJ1ZSksXG5cbiAgLy8gVGhlIFwidi1mb3JcIiBkaXJlY3RpdmUgY3JlYXRlcyBhIGxvb3AgYW5kIGFwcGxpZXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBlYWNoIGl0ZW0gaW4gdGhlIGxvb3BcbiAgXCJ2LWZvclwiOiAoc2V0OiB1bmtub3duW10sIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBsZXQgbmV3Q2hpbGRyZW46IFZub2RlSW50ZXJmYWNlW10gPSBbXTtcbiAgICBsZXQgY2FsbGJhY2sgPSB2bm9kZS5jaGlsZHJlblswXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHNldC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goY2FsbGJhY2soc2V0W2ldLCBpKSk7XG4gICAgfVxuICAgIHZub2RlLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1zaG93XCIgZGlyZWN0aXZlIHNob3dzIG9yIGhpZGVzIGFuIGVsZW1lbnQgYnkgc2V0dGluZyB0aGUgXCJkaXNwbGF5XCIgc3R5bGUgcHJvcGVydHlcbiAgXCJ2LXNob3dcIjogKGJvb2w6IGJvb2xlYW4sIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICAoXG4gICAgICB2bm9kZS5kb20gYXMgdW5rbm93biBhcyB7XG4gICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6IHN0cmluZyB9O1xuICAgICAgfVxuICAgICkuc3R5bGUuZGlzcGxheSA9IGJvb2wgPyBcIlwiIDogXCJub25lXCI7XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1jbGFzc1wiIGRpcmVjdGl2ZSBhZGRzIG9yIHJlbW92ZXMgY2xhc3MgbmFtZXMgZnJvbSBhbiBlbGVtZW50IGJhc2VkIG9uIGEgY29uZGl0aW9uXG4gIFwidi1jbGFzc1wiOiAoY2xhc3NlczogeyBbeDogc3RyaW5nXTogYm9vbGVhbiB9LCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgY2xhc3MgbmFtZXMgaW4gdGhlIGNsYXNzZXMgb2JqZWN0XG4gICAgZm9yIChsZXQgbmFtZSBpbiBjbGFzc2VzKSB7XG4gICAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBjbGFzcyBuYW1lIGZyb20gdGhlIGVsZW1lbnQncyBjbGFzcyBsaXN0IGJhc2VkIG9uIHRoZSB2YWx1ZSBpbiB0aGUgY2xhc3NlcyBvYmplY3RcbiAgICAgICh2bm9kZS5kb20gYXMgRG9tRWxlbWVudCkuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBjbGFzc2VzW25hbWVdKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1odG1sXCIgZGlyZWN0aXZlIHNldHMgdGhlIGlubmVyIEhUTUwgb2YgYW4gZWxlbWVudCB0byB0aGUgZ2l2ZW4gSFRNTCBzdHJpbmdcbiAgXCJ2LWh0bWxcIjogKGh0bWw6IHN0cmluZywgdm5vZGU6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIC8vIFNldCB0aGUgY2hpbGRyZW4gb2YgdGhlIHZub2RlIHRvIGEgdHJ1c3RlZCB2ZXJzaW9uIG9mIHRoZSBIVE1MIHN0cmluZ1xuICAgIHZub2RlLmNoaWxkcmVuID0gW3RydXN0KGh0bWwpXTtcbiAgfSxcblxuICAvLyBUaGUgXCJ2LW1vZGVsXCIgZGlyZWN0aXZlIGJpbmRzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dCBlbGVtZW50IHRvIGEgbW9kZWwgcHJvcGVydHlcbiAgXCJ2LW1vZGVsXCI6IChbbW9kZWwsIHByb3BlcnR5LCBldmVudF06IGFueVtdLCB2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIGxldCB2YWx1ZTtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIG1vZGVsIHByb3BlcnR5IHdoZW4gdGhlIGlucHV0IGVsZW1lbnQncyB2YWx1ZSBjaGFuZ2VzXG4gICAgbGV0IGhhbmRsZXIgPSAoZTogRXZlbnQpID0+IChtb2RlbFtwcm9wZXJ0eV0gPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlKTtcbiAgICBpZiAodm5vZGUudGFnID09PSBcImlucHV0XCIpIHtcbiAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGFuIGlucHV0LCB1c2UgdGhlIFwiaW5wdXRcIiBldmVudCBieSBkZWZhdWx0XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25pbnB1dFwiO1xuICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGlucHV0IGVsZW1lbnQsIHVzZSBhIGRpZmZlcmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICBzd2l0Y2ggKHZub2RlLnByb3BzLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6IHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eV0pKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbW9kZWwgcHJvcGVydHkgaXMgYW4gYXJyYXksIGFkZCBvciByZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIGFycmF5IHdoZW4gdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQgb3IgdW5jaGVja2VkXG4gICAgICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGxldCB2YWwgPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlO1xuICAgICAgICAgICAgICBsZXQgaWR4ID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsKTtcbiAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBpbiB0aGUgYXJyYXksIHNldCB0aGUgY2hlY2tib3ggdG8gYmUgY2hlY2tlZFxuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2bm9kZS5kb20udmFsdWUpICE9PSAtMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiB2bm9kZS5wcm9wcykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGlucHV0IGVsZW1lbnQgaGFzIGEgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSwgdXNlIGl0IHRvIGRldGVybWluZSB0aGUgY2hlY2tlZCBzdGF0ZVxuICAgICAgICAgICAgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUucHJvcHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XSA9IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBcInZhbHVlXCIgYXR0cmlidXRlLCB1c2UgYSBib29sZWFuIHZhbHVlIGZvciB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoKSA9PiAobW9kZWxbcHJvcGVydHldID0gIW1vZGVsW3Byb3BlcnR5XSk7XG4gICAgICAgICAgICB2YWx1ZSA9IG1vZGVsW3Byb3BlcnR5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU2V0IHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUgb24gdGhlIGlucHV0IGVsZW1lbnRcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHZhbHVlLCB2bm9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJhZGlvXCI6IHtcbiAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhIHJhZGlvIGJ1dHRvbiwgc2V0IHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBwcm9wZXJ0eVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgIHNoYXJlZFNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgbW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5kb20udmFsdWUsIHZub2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBpbnB1dCB0eXBlcywgc2V0IHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBtb2RlbFtwcm9wZXJ0eV0sIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSBcInNlbGVjdFwiKSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhIHNlbGVjdCBlbGVtZW50LCB1c2UgdGhlIFwiY2xpY2tcIiBldmVudCBieSBkZWZhdWx0XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25jbGlja1wiO1xuICAgICAgaWYgKHZub2RlLnByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3QgZWxlbWVudCBhbGxvd3MgbXVsdGlwbGUgc2VsZWN0aW9ucywgdXBkYXRlIHRoZSBtb2RlbCBwcm9wZXJ0eSB3aXRoIGFuIGFycmF5IG9mIHNlbGVjdGVkIHZhbHVlc1xuICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikgPT4ge1xuICAgICAgICAgIGxldCB2YWwgPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlO1xuICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDdHJsIGtleSBpcyBwcmVzc2VkLCBhZGQgb3IgcmVtb3ZlIHRoZSB2YWx1ZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgbGV0IGlkeCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbCk7XG4gICAgICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgQ3RybCBrZXkgaXMgbm90IHByZXNzZWQsIHNldCB0aGUgbW9kZWwgcHJvcGVydHkgdG8gYW4gYXJyYXkgd2l0aCB0aGUgc2VsZWN0ZWQgdmFsdWVcbiAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoMCwgbW9kZWxbcHJvcGVydHldLmxlbmd0aCk7XG4gICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gU2V0IHRoZSBcInNlbGVjdGVkXCIgYXR0cmlidXRlIG9uIHRoZSBvcHRpb25zIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBhcmUgaW4gdGhlIG1vZGVsIHByb3BlcnR5IGFycmF5XG4gICAgICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBWbm9kZUludGVyZmFjZSkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IFwidmFsdWVcIiBpbiBjaGlsZC5wcm9wcyA/IGNoaWxkLnByb3BzLnZhbHVlIDogY2hpbGQuY2hpbGRyZW4uam9pbihcIlwiKS50cmltKCk7XG4gICAgICAgICAgICBjaGlsZC5wcm9wcy5zZWxlY3RlZCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbHVlKSAhPT0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3QgZWxlbWVudCBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb25zLCBzZXQgdGhlIFwic2VsZWN0ZWRcIiBhdHRyaWJ1dGUgb24gdGhlIG9wdGlvbnMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBwcm9wZXJ0eVxuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogVm5vZGVJbnRlcmZhY2UpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBcInZhbHVlXCIgaW4gY2hpbGQucHJvcHMgPyBjaGlsZC5wcm9wcy52YWx1ZSA6IGNoaWxkLmNoaWxkcmVuLmpvaW4oXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuc2VsZWN0ZWQgPSB2YWx1ZSA9PT0gbW9kZWxbcHJvcGVydHldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2bm9kZS50YWcgPT09IFwidGV4dGFyZWFcIikge1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSB0ZXh0YXJlYSwgdXNlIHRoZSBcImlucHV0XCIgZXZlbnQgYnkgZGVmYXVsdFxuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uaW5wdXRcIjtcbiAgICAgIC8vIFNldCB0aGUgdGV4dGFyZWEncyBjb250ZW50IHRvIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgIHZub2RlLmNoaWxkcmVuID0gW21vZGVsW3Byb3BlcnR5XV07XG4gICAgfVxuXG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIHByZXYgaGFuZGxlciBpZiBhbnkgd2lsbCBub3QgYmUgY2hhbmdlZCBieSB0aGUgdXNlciBhY3Jvc3MgcGF0Y2hzXG4gICAgbGV0IHByZXZIYW5kbGVyID0gdm5vZGUucHJvcHNbZXZlbnRdO1xuXG4gICAgLy8gU2V0IHRoZSBldmVudCBoYW5kbGVyIG9uIHRoZSBlbGVtZW50XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgc2hhcmVkU2V0QXR0cmlidXRlKFxuICAgICAgZXZlbnQsXG4gICAgICAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgaGFuZGxlcihlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgaGFuZGxlciBpcyBkZWZpbmVkLCBjYWxsIGl0IGFmdGVyIHRoZSBtb2RlbCBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICAgIGlmIChwcmV2SGFuZGxlcikge1xuICAgICAgICAgIHByZXZIYW5kbGVyKGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdm5vZGUsXG4gICAgICBvbGRWbm9kZVxuICAgICk7XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1jcmVhdGVcIiBkaXJlY3RpdmUgaXMgY2FsbGVkIHdoZW4gYSBuZXcgdmlydHVhbCBub2RlIGlzIGNyZWF0ZWQuXG4gIC8vIFRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgbmV3IHZpcnR1YWwgbm9kZSBhcyBhbiBhcmd1bWVudC5cbiAgLy8gVGhpcyBkaXJlY3RpdmUgaXMgb25seSBjYWxsZWQgb25jZSBwZXIgdmlydHVhbCBub2RlLCB3aGVuIGl0IGlzIGZpcnN0IGNyZWF0ZWQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBcInYtY3JlYXRlXCI6IChjYWxsYmFjazogKHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHZvaWQsIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgLy8gSWYgdGhpcyBpcyBub3QgYW4gdXBkYXRlLCBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHRoZSBuZXcgdmlydHVhbCBub2RlXG4gICAgaWYgKCFvbGRWbm9kZSkge1xuICAgICAgbGV0IGNsZWFudXAgPSBjYWxsYmFjayh2bm9kZSk7XG5cbiAgICAgIC8vIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGEgZnVuY3Rpb24sIGNhbGwgaXQgd2hlbiB0aGUgdXBkYXRlIGlzIGdvbm5hIGJlIGNsZWFuZWQgdXBcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9uQ2xlYW51cChjbGVhbnVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gVGhlIFwidi11cGRhdGVcIiBkaXJlY3RpdmUgaXMgY2FsbGVkIHdoZW4gYW4gZXhpc3RpbmcgdmlydHVhbCBub2RlIGlzIHVwZGF0ZWQuXG4gIC8vIFRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgbmV3IGFuZCBvbGQgdmlydHVhbCBub2RlcyBhcyBhcmd1bWVudHMuXG4gIC8vIFRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgY2FsbGVkIG9uY2UgcGVyIHZpcnR1YWwgbm9kZSB1cGRhdGUuXG4gIFwidi11cGRhdGVcIjogKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGNhbGxiYWNrOiAodm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU6IFZub2RlV2l0aERvbSkgPT4gdm9pZCxcbiAgICB2bm9kZTogVm5vZGVXaXRoRG9tLFxuICAgIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tXG4gICkgPT4ge1xuICAgIC8vIElmIHRoaXMgaXMgYW4gdXBkYXRlLCBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHRoZSBuZXcgYW5kIG9sZCB2aXJ0dWFsIG5vZGVzXG4gICAgaWYgKG9sZFZub2RlKSB7XG4gICAgICBsZXQgY2xlYW51cCA9IGNhbGxiYWNrKHZub2RlLCBvbGRWbm9kZSk7XG5cbiAgICAgIC8vIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGEgZnVuY3Rpb24sIGNhbGwgaXQgd2hlbiB0aGUgdXBkYXRlIGlzIGdvbm5hIGJlIGNsZWFuZWQgdXBcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9uQ2xlYW51cChjbGVhbnVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1jbGVhbnVwXCIgZGlyZWN0aXZlIGlzIGNhbGxlZCB3aGVuIHRoZSB1cGRhdGUgaXMgY2xlYW5lZCB1cC5cbiAgLy8gVGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBvbGQgdmlydHVhbCBub2RlIGFzIGFuIGFyZ3VtZW50LlxuICAvLyBUaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IGNhbGxlZCBvbmNlIHBlciB2aXJ0dWFsIG5vZGUsIHdoZW4gdGhlIHVwZGF0ZSBpcyBjbGVhbmVkIHVwLlxuICBcInYtY2xlYW51cFwiOiAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY2FsbGJhY2s6ICh2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkgPT4gdm9pZCxcbiAgICB2bm9kZTogVm5vZGVXaXRoRG9tLFxuICAgIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tXG4gICkgPT4ge1xuICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gdGhlIGxpc3Qgb2YgY2xlYW51cCBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHVwZGF0ZSBpcyBjbGVhbmVkIHVwXG4gICAgb25DbGVhbnVwKCgpID0+IGNhbGxiYWNrKHZub2RlLCBvbGRWbm9kZSkpO1xuICB9XG59O1xuLy8gQWRkIGEgZGlyZWN0aXZlIHRvIHRoZSBnbG9iYWwgZGlyZWN0aXZlcyBvYmplY3QsIHdpdGggdGhlIGtleSBiZWluZyB0aGUgbmFtZVxuLy8gcHJlY2VkZWQgYnkgXCJ2LVwiLiBBbHNvIGFkZCB0aGUgbmFtZSB0byB0aGUgZ2xvYmFsIHJlc2VydmVkUHJvcHMgb2JqZWN0LlxuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdGl2ZShuYW1lOiBzdHJpbmcsIGRpcmVjdGl2ZTogRGlyZWN0aXZlKSB7XG4gIGxldCBkaXJlY3RpdmVOYW1lID0gYHYtJHtuYW1lfWA7XG4gIGRpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0gPSBkaXJlY3RpdmU7XG4gIHJlc2VydmVkUHJvcHNbZGlyZWN0aXZlTmFtZV0gPSB0cnVlO1xufVxuXG4vLyBTZXQgYW4gYXR0cmlidXRlIG9uIGEgdmlydHVhbCBET00gbm9kZSBhbmQgdXBkYXRlIHRoZSBhY3R1YWwgRE9NIGVsZW1lbnQuXG4vLyBJZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIGF0dHJpYnV0ZVxuLy8gbmFtZSB0byB0aGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgbWFpblZub2RlLlxuLy8gSWYgb2xkVm5vZGUgaXMgcHJvdmlkZWQsIGNvbXBhcmUgdGhlIG5ldyBhdHRyaWJ1dGUgdmFsdWUgdG8gdGhlIG9sZCB2YWx1ZVxuLy8gYW5kIG9ubHkgdXBkYXRlIHRoZSBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LlxuZnVuY3Rpb24gc2hhcmVkU2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgbmV3Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pOiB2b2lkIHwgYm9vbGVhbiB7XG4gIC8vIElmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgYSBmdW5jdGlvbiwgYWRkIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgYXR0cmlidXRlXG4gIC8vIG5hbWUgdG8gdGhlIERPTSBlbGVtZW50IHJlcHJlc2VudGVkIGJ5IG1haW5Wbm9kZS5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgLy8gT25seSBhZGQgdGhlIGV2ZW50IGxpc3RlbmVyIGlmIGl0IGhhc24ndCBiZWVuIGFkZGVkIHlldC5cbiAgICBpZiAobmFtZSBpbiBldmVudExpc3RlbmVyTmFtZXMgPT09IGZhbHNlKSB7XG4gICAgICAobWFpblZub2RlIGFzIFZub2RlV2l0aERvbSkuZG9tLmFkZEV2ZW50TGlzdGVuZXIobmFtZS5zbGljZSgyKSwgZXZlbnRMaXN0ZW5lcik7XG4gICAgICBldmVudExpc3RlbmVyTmFtZXNbbmFtZV0gPSB0cnVlO1xuICAgIH1cbiAgICBuZXdWbm9kZS5kb21bYHYtJHtuYW1lfWBdID0gdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50IG9uIHRoZSBET00gZWxlbWVudCBhbmQgbmV3Vm5vZGUgaXMgbm90IGFuIFNWRyxcbiAgLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLlxuICBpZiAobmFtZSBpbiBuZXdWbm9kZS5kb20gJiYgbmV3Vm5vZGUuaXNTVkcgPT09IGZhbHNlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgIGlmIChuZXdWbm9kZS5kb21bbmFtZV0gIT0gdmFsdWUpIHtcbiAgICAgIG5ld1Zub2RlLmRvbVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiBvbGRWbm9kZSBpcyBub3QgcHJvdmlkZWQgb3IgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZCwgdXBkYXRlIHRoZVxuICAvLyBhdHRyaWJ1dGUgb24gdGhlIERPTSBlbGVtZW50LlxuICBpZiAoIW9sZFZub2RlIHx8IHZhbHVlICE9PSBvbGRWbm9kZS5wcm9wc1tuYW1lXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIG5ld1Zub2RlLmRvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1Zub2RlLmRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBTZXQgYW4gYXR0cmlidXRlIG9uIGEgdmlydHVhbCBET00gbm9kZSBhbmQgdXBkYXRlIHRoZSBhY3R1YWwgRE9NIGVsZW1lbnQuXG4vLyBTa2lwIHRoZSBhdHRyaWJ1dGUgaWYgaXQgaXMgaW4gdGhlIHJlc2VydmVkUHJvcHMgb2JqZWN0LlxuZXhwb3J0IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIGlmIChuYW1lIGluIHJlc2VydmVkUHJvcHMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbmV3Vm5vZGUucHJvcHNbbmFtZV0gPSB2YWx1ZTtcbiAgc2hhcmVkU2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlLCBuZXdWbm9kZSBhcyBWbm9kZVdpdGhEb20sIG9sZFZub2RlKTtcbn1cblxuLy8gVXBkYXRlIHRoZSBhdHRyaWJ1dGVzIG9uIGEgdmlydHVhbCBET00gbm9kZS4gSWYgb2xkVm5vZGUgaXMgcHJvdmlkZWQsIHJlbW92ZVxuLy8gYXR0cmlidXRlcyBmcm9tIHRoZSBET00gZWxlbWVudCB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiBuZXdWbm9kZS5wcm9wcyBidXQgYXJlXG4vLyBwcmVzZW50IGluIG9sZFZub2RlLnByb3BzLiBUaGVuLCBpdGVyYXRlIG92ZXIgdGhlIGF0dHJpYnV0ZXMgaW4gbmV3Vm5vZGUucHJvcHNcbi8vIGFuZCB1cGRhdGUgdGhlIERPTSBlbGVtZW50IHdpdGggdGhlIGF0dHJpYnV0ZXMgdXNpbmcgdGhlIHNoYXJlZFNldEF0dHJpYnV0ZVxuLy8gZnVuY3Rpb24uIElmIGFuIGF0dHJpYnV0ZSBpcyBpbiB0aGUgcmVzZXJ2ZWRQcm9wcyBvYmplY3QgYW5kIGhhcyBhIGNvcnJlc3BvbmRpbmdcbi8vIGRpcmVjdGl2ZSBpbiB0aGUgZGlyZWN0aXZlcyBvYmplY3QsIGNhbGwgdGhlIGRpcmVjdGl2ZSB3aXRoIHRoZSBhdHRyaWJ1dGUgdmFsdWVcbi8vIGFuZCB0aGUgdHdvIHZpcnR1YWwgRE9NIG5vZGVzIGFzIGFyZ3VtZW50cy4gSWYgdGhlIGRpcmVjdGl2ZSByZXR1cm5zIGZhbHNlLCBleGl0XG4vLyB0aGUgbG9vcC5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGVzKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIC8vIElmIG9sZFZub2RlIGlzIHByb3ZpZGVkLCByZW1vdmUgYXR0cmlidXRlcyBmcm9tIHRoZSBET00gZWxlbWVudCB0aGF0IGFyZSBub3RcbiAgLy8gcHJlc2VudCBpbiBuZXdWbm9kZS5wcm9wcyBidXQgYXJlIHByZXNlbnQgaW4gb2xkVm5vZGUucHJvcHMuXG4gIGlmIChvbGRWbm9kZSkge1xuICAgIGZvciAobGV0IG5hbWUgaW4gb2xkVm5vZGUucHJvcHMpIHtcbiAgICAgIGlmIChuYW1lIGluIG5ld1Zub2RlLnByb3BzID09PSBmYWxzZSAmJiBuYW1lIGluIGV2ZW50TGlzdGVuZXJOYW1lcyA9PT0gZmFsc2UgJiYgbmFtZSBpbiByZXNlcnZlZFByb3BzID09PSBmYWxzZSkge1xuICAgICAgICBpZiAobmFtZSBpbiBuZXdWbm9kZS5kb20gJiYgbmV3Vm5vZGUuaXNTVkcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgbmV3Vm5vZGUuZG9tW25hbWVdID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWbm9kZS5kb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBhdHRyaWJ1dGVzIGluIG5ld1Zub2RlLnByb3BzIGFuZCB1cGRhdGUgdGhlIERPTSBlbGVtZW50IHdpdGhcbiAgLy8gdGhlIGF0dHJpYnV0ZXMgdXNpbmcgdGhlIHNoYXJlZFNldEF0dHJpYnV0ZSBmdW5jdGlvbi5cbiAgZm9yIChsZXQgbmFtZSBpbiBuZXdWbm9kZS5wcm9wcykge1xuICAgIGlmIChuYW1lIGluIHJlc2VydmVkUHJvcHMpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIGEgZGlyZWN0aXZlIGZvciB0aGUgYXR0cmlidXRlLCBjYWxsIGl0IHdpdGggdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICAgICAgLy8gYW5kIHRoZSB0d28gdmlydHVhbCBET00gbm9kZXMgYXMgYXJndW1lbnRzLiBJZiB0aGUgZGlyZWN0aXZlIHJldHVybnMgZmFsc2UsXG4gICAgICAvLyBleGl0IHRoZSBsb29wLlxuICAgICAgaWYgKG5hbWUgaW4gZGlyZWN0aXZlcyAmJiBkaXJlY3RpdmVzW25hbWVdKG5ld1Zub2RlLnByb3BzW25hbWVdLCBuZXdWbm9kZSwgb2xkVm5vZGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBzaGFyZWRTZXRBdHRyaWJ1dGUobmFtZSwgbmV3Vm5vZGUucHJvcHNbbmFtZV0sIG5ld1Zub2RlLCBvbGRWbm9kZSk7XG4gIH1cbn1cblxuLyogcGF0Y2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBQYXRjaCBhIERPTSBub2RlIHdpdGggYSBuZXcgVk5vZGUgdHJlZVxuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIC8vIElmIHRoZSBuZXcgdHJlZSBoYXMgbm8gY2hpbGRyZW4sIHNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgRE9NIGVsZW1lbnQgdG8gYW4gZW1wdHkgc3RyaW5nXG4gIGlmIChuZXdWbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICBuZXdWbm9kZS5kb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5ldyBhbmQgb2xkIHZpcnR1YWwgRE9NIG5vZGVzXG4gIGxldCBuZXdUcmVlID0gbmV3Vm5vZGUuY2hpbGRyZW47XG4gIGxldCBvbGRUcmVlID0gb2xkVm5vZGU/LmNoaWxkcmVuIHx8IFtdO1xuICAvLyBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgb2xkIHRyZWVcbiAgbGV0IG9sZFRyZWVMZW5ndGggPSBvbGRUcmVlLmxlbmd0aDtcblxuICAvLyBJZiB0aGUgb2xkIHRyZWUgaGFzIGNoaWxkcmVuIGFuZCB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIG5ldyB0cmVlIGlzIGEgVk5vZGUgd2l0aCBhIFwia2V5XCJcbiAgLy8gYXR0cmlidXRlIGFuZCB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIG9sZCB0cmVlIGlzIGEgVk5vZGUgd2l0aCBhIFwia2V5XCIgYXR0cmlidXRlLCB1cGRhdGVcbiAgLy8gdGhlIERPTSBlbGVtZW50IGluIHBsYWNlIGJ5IGNvbXBhcmluZyB0aGUga2V5cyBvZiB0aGUgbm9kZXMgaW4gdGhlIHRyZWVzLlxuICBpZiAob2xkVHJlZUxlbmd0aCAmJiBuZXdUcmVlWzBdIGluc3RhbmNlb2YgVm5vZGUgJiYgXCJrZXlcIiBpbiBuZXdUcmVlWzBdLnByb3BzICYmIFwia2V5XCIgaW4gb2xkVHJlZVswXS5wcm9wcykge1xuICAgIC8vIEdldCB0aGUgbGVuZ3RocyBvZiB0aGUgbmV3IGFuZCBvbGQgdHJlZXNcbiAgICBsZXQgbmV3VHJlZUxlbmd0aCA9IG5ld1RyZWUubGVuZ3RoO1xuXG4gICAgLy8gQ3JlYXRlIGFuIG9iamVjdCB0aGF0IG1hcHMga2V5cyB0byBpbmRpY2VzIGluIHRoZSBvbGQgdHJlZVxuICAgIGxldCBvbGRLZXllZExpc3Q6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZFRyZWVMZW5ndGg7IGkrKykge1xuICAgICAgb2xkS2V5ZWRMaXN0W29sZFRyZWVbaV0ucHJvcHMua2V5XSA9IGk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFuIG9iamVjdCB0aGF0IG1hcHMga2V5cyB0byBpbmRpY2VzIGluIHRoZSBuZXcgdHJlZVxuICAgIGxldCBuZXdLZXllZExpc3Q6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWVMZW5ndGg7IGkrKykge1xuICAgICAgbmV3S2V5ZWRMaXN0W25ld1RyZWVbaV0ucHJvcHMua2V5XSA9IGk7XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBuZXcgdHJlZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZUxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbmV3IGNoaWxkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBvbGQgY2hpbGRcbiAgICAgIGxldCBuZXdDaGlsZCA9IG5ld1RyZWVbaV07XG4gICAgICBsZXQgb2xkQ2hpbGQgPSBvbGRUcmVlW29sZEtleWVkTGlzdFtuZXdDaGlsZC5wcm9wcy5rZXldXTtcbiAgICAgIC8vIEluaXRpYWxpemUgYSBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHBhdGNoIHRoZSBjaGlsZFxuICAgICAgbGV0IHNob3VsZFBhdGNoID0gdHJ1ZTtcblxuICAgICAgLy8gSWYgdGhlIG9sZCBjaGlsZCBleGlzdHMsIHVwZGF0ZSB0aGUgRE9NIGVsZW1lbnQgb2YgdGhlIG5ldyBjaGlsZCB0byBtYXRjaCB0aGUgb2xkIGNoaWxkJ3MgRE9NIGVsZW1lbnRcbiAgICAgIGlmIChvbGRDaGlsZCkge1xuICAgICAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZC5kb207XG4gICAgICAgIC8vIElmIHRoZSBuZXcgYW5kIG9sZCBjaGlsZHJlbiBoYXZlIHRoZSBzYW1lIFwidi1rZWVwXCIgYXR0cmlidXRlIHZhbHVlLCB1cGRhdGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBuZXcgY2hpbGQgdG8gbWF0Y2ggdGhlIG9sZCBjaGlsZCdzIGNoaWxkcmVuXG4gICAgICAgIGlmIChcInYta2VlcFwiIGluIG5ld0NoaWxkLnByb3BzICYmIG5ld0NoaWxkLnByb3BzW1widi1rZWVwXCJdID09PSBvbGRDaGlsZC5wcm9wc1tcInYta2VlcFwiXSkge1xuICAgICAgICAgIG5ld0NoaWxkLmNoaWxkcmVuID0gb2xkQ2hpbGQuY2hpbGRyZW47XG4gICAgICAgICAgLy8gU2V0IHRoZSBzaG91bGRQYXRjaCBmbGFnIHRvIGZhbHNlXG4gICAgICAgICAgc2hvdWxkUGF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkLCBvbGRDaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgb2xkIGNoaWxkIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgYSBuZXcgRE9NIGVsZW1lbnQgZm9yIHRoZSBuZXcgY2hpbGQgYW5kIHVwZGF0ZSBpdHMgYXR0cmlidXRlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3Q2hpbGQuZG9tID0gY3JlYXRlRG9tRWxlbWVudChuZXdDaGlsZC50YWcsIG5ld0NoaWxkLmlzU1ZHKTtcbiAgICAgICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBuZXcgY2hpbGQncyBET00gZWxlbWVudCBpcyBub3QgdGhlIGktdGggY2hpbGQgb2YgdGhlIHBhcmVudCBET00gZWxlbWVudCwgaW5zZXJ0IGl0XG4gICAgICBpZiAoIW5ld1Zub2RlLmRvbS5jaGlsZE5vZGVzW2ldKSB7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5hcHBlbmRDaGlsZChuZXdDaGlsZC5kb20pO1xuXG4gICAgICAgIC8vIElmIHRoZSBuZXcgY2hpbGQncyBET00gZWxlbWVudCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGktdGggY2hpbGQgb2YgdGhlIHBhcmVudCBET00gZWxlbWVudCwgcmVwbGFjZSB0aGUgaS10aCBjaGlsZCB3aXRoIHRoZSBuZXcgY2hpbGQncyBET00gZWxlbWVudFxuICAgICAgfSBlbHNlIGlmIChuZXdWbm9kZS5kb20uY2hpbGROb2Rlc1tpXSAhPT0gbmV3Q2hpbGQuZG9tKSB7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuZG9tLCBuZXdWbm9kZS5kb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBzaG91bGRQYXRjaCBmbGFnIGlzIHRydWUsIHJlY3Vyc2l2ZWx5IGNhbGwgdGhlIHBhdGNoIGZ1bmN0aW9uIG9uIHRoZSBuZXcgY2hpbGQsIHBhc3NpbmcgaW4gdGhlIG9sZCBjaGlsZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG4gICAgICBzaG91bGRQYXRjaCAmJiBwYXRjaChuZXdDaGlsZCwgb2xkQ2hpbGQpO1xuICAgIH1cblxuICAgIC8vIEZvciB0aGUgcmVzdCBvZiB0aGUgY2hpbGRyZW4sIHdlIHNob3VsZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBET01cbiAgICBmb3IgKGxldCBpID0gbmV3VHJlZUxlbmd0aDsgaSA8IG9sZFRyZWVMZW5ndGg7IGkrKykge1xuICAgICAgLy8gSWYgdGhlIGktdGggY2hpbGQgb2YgdGhlIG9sZCB0cmVlIGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIGtleSBpbiB0aGUgbmV3IHRyZWUsIHJlbW92ZSBpdHMgRE9NIGVsZW1lbnQgZnJvbSB0aGUgcGFyZW50IERPTSBlbGVtZW50XG4gICAgICBpZiAoIW5ld0tleWVkTGlzdFtvbGRUcmVlW2ldLnByb3BzLmtleV0pIHtcbiAgICAgICAgb2xkVHJlZVtpXS5kb20ucGFyZW50Tm9kZSAmJiBvbGRUcmVlW2ldLmRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9sZFRyZWVbaV0uZG9tKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgdGhlIG5ldyB0cmVlIGhhcyBubyBjaGlsZHJlbiwgc2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHBhcmVudCBET00gZWxlbWVudCB0byBhbiBlbXB0eSBzdHJpbmdcbiAgaWYgKG5ld1RyZWUubGVuZ3RoID09PSAwKSB7XG4gICAgbmV3Vm5vZGUuZG9tLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBTZXQgdGhlIGdsb2JhbCBjdXJyZW50IG9iamVjdCB0byB0aGUgbmV3IGFuZCBvbGQgdmlydHVhbCBET00gbm9kZXNcbiAgY3VycmVudC52bm9kZSA9IG5ld1Zub2RlO1xuICBjdXJyZW50Lm9sZFZub2RlID0gb2xkVm5vZGU7XG5cbiAgLy8gRmxhdHRlbiB0aGUgbmV3IHRyZWVcbiAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhhdCBpcyBuZWNlc3NhcnkgdG8gZmxhdHRlbiB0aGUgdHJlZSBiZWZvcmUgdGhlIHBhdGNoIHByb2Nlc3NcbiAgLy8gdG8gbGV0IHRoZSBob29rcyBhbmQgc2lnbmFscyB3b3JrIHByb3Blcmx5XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZS5sZW5ndGg7IGkrKykge1xuICAgIGxldCBuZXdDaGlsZCA9IG5ld1RyZWVbaV07XG5cbiAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIGlzIGEgVm5vZGUgYW5kIGlzIG5vdCBhIHRleHQgbm9kZVxuICAgIGlmIChuZXdDaGlsZCBpbnN0YW5jZW9mIFZub2RlKSB7XG4gICAgICAvLyBJZiB0aGUgdGFnIG9mIHRoZSBuZXcgY2hpbGQgaXMgbm90IGEgc3RyaW5nLCBpdCBpcyBhIGNvbXBvbmVudFxuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZC50YWcgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gU2V0IHRoZSBjdXJyZW50IGNvbXBvbmVudCB0byB0aGUgdGFnIG9mIHRoZSBuZXcgY2hpbGRcbiAgICAgICAgY3VycmVudC5jb21wb25lbnQgPSBuZXdDaGlsZC50YWc7XG4gICAgICAgIC8vIFJlcGxhY2UgdGhlIG5ldyBjaGlsZCB3aXRoIHRoZSByZXN1bHQgb2YgY2FsbGluZyBpdHMgdmlldyBvciBiaW5kIG1ldGhvZCwgcGFzc2luZyBpbiB0aGUgcHJvcHMgYW5kIGNoaWxkcmVuIGFzIGFyZ3VtZW50c1xuICAgICAgICBuZXdUcmVlLnNwbGljZShcbiAgICAgICAgICBpLS0sXG4gICAgICAgICAgMSxcbiAgICAgICAgICAoXCJ2aWV3XCIgaW4gbmV3Q2hpbGQudGFnID8gbmV3Q2hpbGQudGFnLnZpZXcuYmluZChuZXdDaGlsZC50YWcpIDogbmV3Q2hpbGQudGFnLmJpbmQobmV3Q2hpbGQudGFnKSkoXG4gICAgICAgICAgICBuZXdDaGlsZC5wcm9wcyxcbiAgICAgICAgICAgIC4uLm5ld0NoaWxkLmNoaWxkcmVuXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIGlzIGFuIGFycmF5LCBmbGF0dGVuIGl0IGFuZCBjb250aW51ZSB0aGUgbG9vcFxuICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgbmV3VHJlZS5zcGxpY2UoaS0tLCAxLCAuLi5uZXdDaGlsZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIGlzIG51bGwgb3IgdW5kZWZpbmVkLCByZW1vdmUgaXQgZnJvbSB0aGUgbmV3IHRyZWUgYW5kIGNvbnRpbnVlIHRoZSBsb29wXG4gICAgaWYgKG5ld0NoaWxkID09PSBudWxsIHx8IG5ld0NoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ld1RyZWUuc3BsaWNlKGktLSwgMSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIGlzIGEgVm5vZGUsIHNldCB0aGUgdGV4dCBvZiB0aGUgVm5vZGUgdG8gdGhlIHRleHQgY29udGVudCBvZiBpdHMgZG9tIHByb3BlcnR5XG4gICAgbmV3VHJlZVtpXSA9IG5ldyBWbm9kZSh0ZXh0VGFnLCB7fSwgW25ld0NoaWxkXSk7XG4gIH1cblxuICAvLyBQYXRjaCB0aGUgdGhlIG9sZCB0cmVlXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZS5sZW5ndGg7IGkrKykge1xuICAgIGxldCBuZXdDaGlsZCA9IG5ld1RyZWVbaV07XG5cbiAgICBpZiAobmV3Q2hpbGQudGFnID09PSB0ZXh0VGFnKSB7XG4gICAgICAvLyBJZiBubyBvbGQgY2hpbGQgZXhpc3RzIGF0IHRoZSBzYW1lIGluZGV4XG4gICAgICBpZiAoaSA+PSBvbGRUcmVlTGVuZ3RoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyB0ZXh0IG5vZGUgZm9yIHRoZSBuZXcgY2hpbGRcbiAgICAgICAgbmV3Q2hpbGQuZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQuY2hpbGRyZW5bMF0pO1xuICAgICAgICAvLyBBcHBlbmQgdGhlIG5ldyB0ZXh0IG5vZGUgdG8gdGhlIGRvbVxuICAgICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQobmV3Q2hpbGQuZG9tKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZXJlIGlzIGFuIG9sZCBjaGlsZCBhdCB0aGUgc2FtZSBpbmRleFxuICAgICAgbGV0IG9sZENoaWxkID0gb2xkVHJlZVtpXTtcblxuICAgICAgLy8gSWYgdGhlIG9sZCBjaGlsZCBpcyBub3QgYSB0ZXh0IG5vZGVcbiAgICAgIGlmIChvbGRDaGlsZC50YWcgIT09IHRleHRUYWcpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHRleHQgbm9kZSBmb3IgdGhlIG5ldyBjaGlsZFxuICAgICAgICBuZXdDaGlsZC5kb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdDaGlsZC5jaGlsZHJlblswXSk7XG4gICAgICAgIC8vIFJlcGxhY2UgdGhlIG9sZCBjaGlsZCBpbiB0aGUgZG9tIHdpdGggdGhlIG5ldyB0ZXh0IG5vZGVcbiAgICAgICAgbmV3Vm5vZGUuZG9tLnJlcGxhY2VDaGlsZChuZXdDaGlsZC5kb20sIG9sZENoaWxkLmRvbSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgb2xkIGNoaWxkIGlzIGEgdGV4dCBub2RlXG4gICAgICAvLyBTZXQgdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgdGV4dCBWbm9kZSB0byB0aGUgZG9tIHByb3BlcnR5IG9mIHRoZSBvbGQgY2hpbGRcbiAgICAgIG5ld0NoaWxkLmRvbSA9IG9sZENoaWxkLmRvbTtcbiAgICAgIC8vIElmIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIG9sZCBjaGlsZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbmV3IGNoaWxkLCB1cGRhdGUgdGhlIHRleHQgY29udGVudCBvZiB0aGUgb2xkIGNoaWxkXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgICBpZiAobmV3Q2hpbGQuY2hpbGRyZW5bMF0gIT0gb2xkQ2hpbGQuZG9tLnRleHRDb250ZW50KSB7XG4gICAgICAgIG9sZENoaWxkLmRvbS50ZXh0Q29udGVudCA9IG5ld0NoaWxkLmNoaWxkcmVuWzBdO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyBub3QgYSB0ZXh0IG5vZGVcbiAgICAvLyBTZXQgdGhlIGlzU1ZHIGZsYWcgZm9yIHRoZSBuZXcgY2hpbGQgaWYgaXQgaXMgYW4gU1ZHIGVsZW1lbnQgb3IgaWYgdGhlIHBhcmVudCBpcyBhbiBTVkcgZWxlbWVudFxuICAgIG5ld0NoaWxkLmlzU1ZHID0gbmV3Vm5vZGUuaXNTVkcgfHwgbmV3Q2hpbGQudGFnID09PSBcInN2Z1wiO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gb2xkIGNoaWxkIGF0IHRoZSBzYW1lIGluZGV4XG4gICAgaWYgKGkgPj0gb2xkVHJlZUxlbmd0aCkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRvbSBlbGVtZW50IGZvciB0aGUgbmV3IGNoaWxkXG4gICAgICBuZXdDaGlsZC5kb20gPSBjcmVhdGVEb21FbGVtZW50KG5ld0NoaWxkLnRhZyBhcyBzdHJpbmcsIG5ld0NoaWxkLmlzU1ZHKTtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmV3IGNoaWxkXG4gICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICAvLyBBcHBlbmQgdGhlIG5ldyBjaGlsZCB0byB0aGUgZG9tXG4gICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQobmV3Q2hpbGQuZG9tKTtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBhdGNoIHRoZSBuZXcgY2hpbGRcbiAgICAgIHBhdGNoKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBvbGQgY2hpbGQgYXQgdGhlIHNhbWUgaW5kZXhcbiAgICBsZXQgb2xkQ2hpbGQgPSBvbGRUcmVlW2ldO1xuXG4gICAgLy8gSWYgdGhlIHRhZyBvZiB0aGUgbmV3IGNoaWxkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB0YWcgb2YgdGhlIG9sZCBjaGlsZFxuICAgIGlmIChuZXdDaGlsZC50YWcgIT09IG9sZENoaWxkLnRhZykge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRvbSBlbGVtZW50IGZvciB0aGUgbmV3IGNoaWxkXG4gICAgICBuZXdDaGlsZC5kb20gPSBjcmVhdGVEb21FbGVtZW50KG5ld0NoaWxkLnRhZyBhcyBzdHJpbmcsIG5ld0NoaWxkLmlzU1ZHKTtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmV3IGNoaWxkXG4gICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICAvLyBSZXBsYWNlIHRoZSBvbGQgY2hpbGQgaW4gdGhlIGRvbSB3aXRoIHRoZSBuZXcgY2hpbGRcbiAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuZG9tLCBvbGRDaGlsZC5kb20pO1xuICAgICAgLy8gUmVjdXJzaXZlbHkgcGF0Y2ggdGhlIG5ldyBjaGlsZFxuICAgICAgcGF0Y2gobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB0YWcgb2YgdGhlIG5ldyBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgdGFnIG9mIHRoZSBvbGQgY2hpbGRcbiAgICAvLyBTZXQgdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgbmV3IGNoaWxkIHRvIHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIG9sZCBjaGlsZFxuICAgIG5ld0NoaWxkLmRvbSA9IG9sZENoaWxkLmRvbTtcbiAgICAvLyBJZiB0aGUgdi1rZWVwIHByb3AgaXMgdGhlIHNhbWUgZm9yIGJvdGggdGhlIG5ldyBhbmQgb2xkIGNoaWxkLCBzZXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBuZXcgY2hpbGQgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBvbGQgY2hpbGRcbiAgICBpZiAoXCJ2LWtlZXBcIiBpbiBuZXdDaGlsZC5wcm9wcyAmJiBuZXdDaGlsZC5wcm9wc1tcInYta2VlcFwiXSA9PT0gb2xkQ2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgIG5ld0NoaWxkLmNoaWxkcmVuID0gb2xkQ2hpbGQuY2hpbGRyZW47XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5ldyBjaGlsZCBiYXNlZCBvbiB0aGUgb2xkIGNoaWxkXG4gICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20sIG9sZENoaWxkKTtcbiAgICAvLyBSZWN1cnNpdmVseSBwYXRjaCB0aGUgbmV3IGFuZCBvbGQgY2hpbGRyZW5cbiAgICBwYXRjaChuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20sIG9sZENoaWxkKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBhbnkgb2xkIGNoaWxkcmVuIHRoYXQgYXJlIG5vIGxvbmdlciBwcmVzZW50IGluIHRoZSBuZXcgdHJlZVxuICBmb3IgKGxldCBpID0gbmV3VHJlZS5sZW5ndGg7IGkgPCBvbGRUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICBuZXdWbm9kZS5kb20ucmVtb3ZlQ2hpbGQob2xkVHJlZVtpXS5kb20pO1xuICB9XG59XG5cbi8vIFVwZGF0ZSB0aGUgbWFpbiBWbm9kZVxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZSgpOiB2b2lkIHwgc3RyaW5nIHtcbiAgLy8gSWYgdGhlIG1haW4gVm5vZGUgZXhpc3RzXG4gIGlmIChtYWluVm5vZGUpIHtcbiAgICAvLyBDYWxsIGFueSBjbGVhbnVwIGZ1bmN0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIG9uQ2xlYW51cFNldCBzZXRcbiAgICBjYWxsU2V0KG9uQ2xlYW51cFNldCk7XG4gICAgLy8gU3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIG9sZCBtYWluIFZub2RlXG4gICAgbGV0IG9sZE1haW5Wbm9kZSA9IG1haW5Wbm9kZTtcbiAgICAvLyBDcmVhdGUgYSBuZXcgbWFpbiBWbm9kZSB3aXRoIHRoZSBtYWluIGNvbXBvbmVudCBhcyBpdHMgb25seSBjaGlsZFxuICAgIG1haW5Wbm9kZSA9IG5ldyBWbm9kZShvbGRNYWluVm5vZGUudGFnLCBvbGRNYWluVm5vZGUucHJvcHMsIFttYWluQ29tcG9uZW50XSkgYXMgVm5vZGVXaXRoRG9tO1xuICAgIG1haW5Wbm9kZS5kb20gPSBvbGRNYWluVm5vZGUuZG9tO1xuICAgIG1haW5Wbm9kZS5pc1NWRyA9IG9sZE1haW5Wbm9kZS5pc1NWRztcblxuICAgIC8vIFJlY3Vyc2l2ZWx5IHBhdGNoIHRoZSBuZXcgYW5kIG9sZCBtYWluIFZub2Rlc1xuICAgIHBhdGNoKG1haW5Wbm9kZSwgb2xkTWFpblZub2RlKTtcblxuICAgIC8vIENhbGwgYW55IHVwZGF0ZSBvciBtb3VudCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBvblVwZGF0ZVNldCBvciBvbk1vdW50U2V0IHNldFxuICAgIGNhbGxTZXQoaXNNb3VudGVkID8gb25VcGRhdGVTZXQgOiBvbk1vdW50U2V0KTtcblxuICAgIC8vIFNldCB0aGUgaXNNb3VudGVkIGZsYWcgdG8gdHJ1ZVxuICAgIGlzTW91bnRlZCA9IHRydWU7XG5cbiAgICAvLyBSZXNldCB0aGUgY3VycmVudCB2bm9kZSwgb2xkVm5vZGUsIGFuZCBjb21wb25lbnQgcHJvcGVydGllc1xuICAgIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQub2xkVm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcblxuICAgIC8vIElmIHRoZSBjb2RlIGlzIHJ1bm5pbmcgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LCByZXR1cm4gdGhlIGlubmVyIEhUTUwgb2YgdGhlIG1haW4gVm5vZGUncyBkb20gZWxlbWVudFxuICAgIGlmIChpc05vZGVKcykge1xuICAgICAgcmV0dXJuIG1haW5Wbm9kZS5kb20uaW5uZXJIVE1MO1xuICAgIH1cbiAgfVxufVxuXG4vLyBVcGRhdGUgY3VzdG9tIFZub2RlXG4vLyBJdCBpcyBhc3N1bWVkIHRoYXQgYSBmaXJzdCBtb3VudCBoYXMgYWxyZWFkeSBvY2N1cnJlZCwgc28sXG4vLyB0aGUgb2xkVm5vZGUgaXMgbm90IG51bGwgYW5kIHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIG9sZFZub2RlIGlzIG5vdCBudWxsXG4vLyBZb3UgbmVlZCB0byBzZXQgdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgbmV3Vm5vZGUgdG8gdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgb2xkVm5vZGVcbi8vIFRoZSBzYW1lIHdpdGggdGhlIGlzU1ZHIHByb3BlcnR5XG4vLyBQcmVmZXIgdGhpcyBmdW5jdGlvbiBvdmVyIHBhdGNoIHRvIGFsbG93IGZvciBjbGVhbnVwLCBvblVwZGF0ZSBhbmQgb25Nb3VudCBzZXRzIHRvIGJlIGNhbGxlZFxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZub2RlKHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlOiBWbm9kZVdpdGhEb20pOiBzdHJpbmcgfCB2b2lkIHtcbiAgLy8gQ2FsbCBhbnkgY2xlYW51cCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBvbkNsZWFudXBTZXQgc2V0XG4gIGNhbGxTZXQob25DbGVhbnVwU2V0KTtcblxuICAvLyBSZWN1cnNpdmVseSBwYXRjaCB0aGUgbmV3IGFuZCBvbGQgbWFpbiBWbm9kZXNcbiAgcGF0Y2godm5vZGUsIG9sZFZub2RlKTtcblxuICAvLyBTZXQgdGhlIG9sZFZub2RlJ3MgdGFnLCBwcm9wcywgY2hpbGRyZW4sIGRvbSwgYW5kIGlzU1ZHIHByb3BlcnRpZXMgdG8gdGhlIG5ld1Zub2RlJ3MgdGFnLCBwcm9wcywgY2hpbGRyZW4sIGRvbSwgYW5kIGlzU1ZHIHByb3BlcnRpZXNcbiAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgZm9yIHRoZSBvbGRWbm9kZSB0byBiZSB1c2VkIGFzIHRoZSBuZXdWbm9kZSBpbiB0aGUgbmV4dCB1cGRhdGUgd2l0aCB0aGUgbm9ybWFsIHVwZGF0ZSBmdW5jdGlvblxuICBvbGRWbm9kZS50YWcgPSB2bm9kZS50YWc7XG4gIG9sZFZub2RlLnByb3BzID0geyAuLi52bm9kZS5wcm9wcyB9O1xuICBvbGRWbm9kZS5jaGlsZHJlbiA9IFsuLi52bm9kZS5jaGlsZHJlbl07XG4gIG9sZFZub2RlLmRvbSA9IHZub2RlLmRvbTtcbiAgb2xkVm5vZGUuaXNTVkcgPSB2bm9kZS5pc1NWRztcblxuICAvLyBDYWxsIGFueSB1cGRhdGUgb3IgbW91bnQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgb25VcGRhdGVTZXQgb3Igb25Nb3VudFNldCBzZXRcbiAgY2FsbFNldChpc01vdW50ZWQgPyBvblVwZGF0ZVNldCA6IG9uTW91bnRTZXQpO1xuXG4gIC8vIFNldCB0aGUgaXNNb3VudGVkIGZsYWcgdG8gdHJ1ZVxuICBpc01vdW50ZWQgPSB0cnVlO1xuXG4gIC8vIFJlc2V0IHRoZSBjdXJyZW50IHZub2RlLCBvbGRWbm9kZSwgYW5kIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICBjdXJyZW50Lm9sZFZub2RlID0gbnVsbDtcbiAgY3VycmVudC5jb21wb25lbnQgPSBudWxsO1xuXG4gIGlmIChpc05vZGVKcykge1xuICAgIHJldHVybiB2bm9kZS5kb20uaW5uZXJIVE1MO1xuICB9XG59XG5cbi8vIFVubW91bnQgdGhlIG1haW4gVm5vZGVcbmV4cG9ydCBmdW5jdGlvbiB1bm1vdW50KCkge1xuICAvLyBJZiB0aGUgbWFpbiBWbm9kZSBleGlzdHNcbiAgaWYgKG1haW5Wbm9kZSkge1xuICAgIC8vIFNldCB0aGUgbWFpbiBjb21wb25lbnQgdG8gYSBudWxsIFZub2RlXG4gICAgbWFpbkNvbXBvbmVudCA9IG5ldyBWbm9kZSgoKSA9PiBudWxsLCB7fSwgW10pIGFzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIC8vIFVwZGF0ZSB0aGUgbWFpbiBWbm9kZVxuICAgIGxldCByZXN1bHQgPSB1cGRhdGUoKTtcbiAgICAvLyBDYWxsIGFueSB1bm1vdW50IGZ1bmN0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIG9uVW5tb3VudFNldCBzZXRcbiAgICBjYWxsU2V0KG9uVW5tb3VudFNldCk7XG5cbiAgICAvLyBSZW1vdmUgYW55IGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIG1haW4gVm5vZGUncyBkb20gZWxlbWVudFxuICAgIGZvciAobGV0IG5hbWUgaW4gZXZlbnRMaXN0ZW5lck5hbWVzKSB7XG4gICAgICBtYWluVm5vZGUuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCBldmVudExpc3RlbmVyKTtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoZXZlbnRMaXN0ZW5lck5hbWVzLCBuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCB0aGUgbWFpbiBjb21wb25lbnQgYW5kIG1haW4gVm5vZGVcbiAgICBtYWluQ29tcG9uZW50ID0gbnVsbDtcbiAgICBtYWluVm5vZGUgPSBudWxsO1xuICAgIC8vIFNldCB0aGUgaXNNb3VudGVkIGZsYWcgdG8gZmFsc2VcbiAgICBpc01vdW50ZWQgPSBmYWxzZTtcbiAgICAvLyBSZXNldCB0aGUgY3VycmVudCB2bm9kZSwgb2xkVm5vZGUsIGFuZCBjb21wb25lbnQgcHJvcGVydGllc1xuICAgIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQub2xkVm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBvZiB1cGRhdGluZyB0aGUgbWFpbiBWbm9kZVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gYSBET00gZWxlbWVudCBvciBhIERPTSBlbGVtZW50IHNlbGVjdG9yIGFuZCBhIGNvbXBvbmVudCB0byBiZSBtb3VudGVkIG9uIGl0LlxuZXhwb3J0IGZ1bmN0aW9uIG1vdW50KGRvbSwgY29tcG9uZW50KSB7XG4gIC8vIENoZWNrIGlmIHRoZSAnZG9tJyBhcmd1bWVudCBpcyBhIHN0cmluZy4gSWYgaXQgaXMsIHNlbGVjdCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgJ2RvbScgYXJndW1lbnQgYXMgdGhlIGNvbnRhaW5lci5cbiAgbGV0IGNvbnRhaW5lciA9XG4gICAgdHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBpc05vZGVKc1xuICAgICAgICA/IGNyZWF0ZURvbUVsZW1lbnQoZG9tLCBkb20gPT09IFwic3ZnXCIpXG4gICAgICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChkb20pWzBdXG4gICAgICA6IGRvbTtcblxuICAvLyBDaGVjayBpZiB0aGUgJ2NvbXBvbmVudCcgYXJndW1lbnQgaXMgYSBWbm9kZSBjb21wb25lbnQgb3IgYSByZWd1bGFyIGNvbXBvbmVudC5cbiAgLy8gSWYgaXQncyBhIHJlZ3VsYXIgY29tcG9uZW50LCBjcmVhdGUgYSBuZXcgVm5vZGUgY29tcG9uZW50IHVzaW5nIHRoZSAnY29tcG9uZW50JyBhcmd1bWVudCBhcyB0aGUgdGFnLlxuICAvLyBJZiBpdCdzIG5vdCBhIGNvbXBvbmVudCBhdCBhbGwsIGNyZWF0ZSBhIG5ldyBWbm9kZSBjb21wb25lbnQgd2l0aCB0aGUgJ2NvbXBvbmVudCcgYXJndW1lbnQgYXMgdGhlIHJlbmRlcmluZyBmdW5jdGlvbi5cbiAgbGV0IHZub2RlQ29tcG9uZW50ID0gaXNWbm9kZUNvbXBvbmVudChjb21wb25lbnQpXG4gICAgPyBjb21wb25lbnRcbiAgICA6IGlzQ29tcG9uZW50KGNvbXBvbmVudClcbiAgICA/IG5ldyBWbm9kZShjb21wb25lbnQsIHt9LCBbXSlcbiAgICA6IG5ldyBWbm9kZSgoKSA9PiBjb21wb25lbnQsIHt9LCBbXSk7XG5cbiAgLy8gSWYgYSBtYWluIGNvbXBvbmVudCBhbHJlYWR5IGV4aXN0cyBhbmQgaXQncyBub3QgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgJ3Zub2RlQ29tcG9uZW50JywgdW5tb3VudCBpdC5cbiAgaWYgKG1haW5Db21wb25lbnQgJiYgbWFpbkNvbXBvbmVudC50YWcgIT09IHZub2RlQ29tcG9uZW50LnRhZykge1xuICAgIHVubW91bnQoKTtcbiAgfVxuXG4gIC8vIFNldCB0aGUgJ3Zub2RlQ29tcG9uZW50JyBhcyB0aGUgbWFpbiBjb21wb25lbnQuXG4gIG1haW5Db21wb25lbnQgPSB2bm9kZUNvbXBvbmVudCBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgLy8gQ29udmVydCB0aGUgY29udGFpbmVyIGVsZW1lbnQgdG8gYSBWbm9kZS5cbiAgbWFpblZub2RlID0gZG9tVG9Wbm9kZShjb250YWluZXIpO1xuICAvLyBVcGRhdGUgdGhlIERPTSB3aXRoIHRoZSBuZXcgY29tcG9uZW50LlxuICByZXR1cm4gdXBkYXRlKCk7XG59XG5cbi8vIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBWbm9kZSBvYmplY3RzLlxuLy8gSXQgdGFrZXMgaW4gYSB0YWcgb3IgY29tcG9uZW50LCBhbmQgb3B0aW9uYWwgcHJvcHMgYW5kIGNoaWxkcmVuIGFyZ3VtZW50cy5cbmV4cG9ydCBjb25zdCB2OiBWID0gKHRhZ09yQ29tcG9uZW50LCBwcm9wcyA9IHt9LCAuLi5jaGlsZHJlbikgPT4ge1xuICAvLyBSZXR1cm4gYSBuZXcgVm5vZGUgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gIHJldHVybiBuZXcgVm5vZGUodGFnT3JDb21wb25lbnQsIHByb3BzIHx8IHt9LCBjaGlsZHJlbik7XG59O1xuXG4vLyBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY3JlYXRlcyBhIGZyYWdtZW50IFZub2RlLlxuLy8gSXQgdGFrZXMgaW4gYSBwbGFjZWhvbGRlciBhbmQgdGhlIGNoaWxkcmVuIGFyZ3VtZW50cywgcmV0dXJucyBvbmx5IHRoZSBjaGlsZHJlbi5cbnYuZnJhZ21lbnQgPSAoXzogVm5vZGVQcm9wZXJ0aWVzLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pID0+IGNoaWxkcmVuO1xuIl0sIm1hcHBpbmdzIjoiTUFrSUEsSUFBTUEsRUFBVSxRQUlMQyxFQUFXQyxRQUEyQixvQkFBWkMsU0FBMkJBLFFBQVFDLFVBQVlELFFBQVFDLFNBQVNDLE1BSTlGLFNBQVNDLEVBQWlCQyxFQUFhQyxHQUFpQixHQUM3RCxPQUFPQSxFQUFRQyxTQUFTQyxnQkFBZ0IsNkJBQThCSCxHQUFPRSxTQUFTRSxjQUFjSixFQUN0RyxDQU1PLElBQU1LLEVBQVEsU0FBcUNMLEVBQWFNLEVBQXdCQyxHQUU3RkMsS0FBS1IsSUFBTUEsRUFDWFEsS0FBS0YsTUFBUUEsRUFDYkUsS0FBS0QsU0FBV0EsQ0FDbEIsRUFJTyxTQUFTRSxFQUFZQyxHQUMxQixPQUFPQSxJQUFtQyxtQkFBZEEsR0FBa0QsaUJBQWRBLEdBQTBCLFNBQVVBLEVBQ3RHLENBR08sSUFBTUMsRUFBV0MsR0FFZkEsYUFBa0JQLEVBS2RRLEVBQW9CRCxHQUV4QkQsRUFBUUMsSUFBV0gsRUFBWUcsRUFBT1osS0FJeEMsU0FBU2MsRUFBV0MsR0FJekIsR0FBcUIsSUFBakJBLEVBQUlDLFNBQWdCLENBQ3RCLElBQUlDLEVBQVEsSUFBSVosRUFBTVosRUFBUyxDQUFDLEVBQUcsQ0FBQ3NCLEVBQUlHLFlBRXhDLE9BREFELEVBQU1GLElBQU1BLEVBQ0xFLENBQ1QsQ0FFQSxJQUFJVixFQUEyQixHQUUvQixRQUFTWSxFQUFJLEVB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
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0ZXh0VGFnIiwiaXNOb2RlSnMiLCJCb29sZWFuIiwicHJvY2VzcyIsInZlcnNpb25zIiwibm9kZSIsImNyZWF0ZURvbUVsZW1lbnQiLCJ0YWciLCJpc1NWRyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwiY3JlYXRlRWxlbWVudCIsIlZub2RlIiwicHJvcHMiLCJjaGlsZHJlbiIsInRoaXMiLCJpc0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzVm5vZGUiLCJvYmplY3QiLCJpc1Zub2RlQ29tcG9uZW50IiwiZG9tVG9Wbm9kZSIsImRvbSIsIm5vZGVUeXBlIiwidm5vZGUiLCJub2RlVmFsdWUiLCJpIiwibCIsImNoaWxkTm9kZXMiLCJsZW5ndGgiLCJjaGlsZERvbSIsInB1c2giLCJhdHRyaWJ1dGVzIiwiYXR0ciIsIm5vZGVOYW1lIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwidHJ1c3QiLCJodG1sU3RyaW5nIiwiZGl2IiwiaW5uZXJIVE1MIiwidHJpbSIsIm1hcCIsImNhbGwiLCJpdGVtIiwibWFpbkNvbXBvbmVudCIsIm1haW5Wbm9kZSIsImlzTW91bnRlZCIsImN1cnJlbnQiLCJvbGRWbm9kZSIsImV2ZW50IiwicmVzZXJ2ZWRQcm9wcyIsImtleSIsInN0YXRlIiwib25DbGVhbnVwU2V0IiwiU2V0Iiwib25Nb3VudFNldCIsIm9uVXBkYXRlU2V0Iiwib25Vbm1vdW50U2V0Iiwib25DbGVhbnVwIiwiY2FsbGJhY2siLCJhZGQiLCJjYWxsU2V0Iiwic2V0IiwiY2xlYXIiLCJldmVudExpc3RlbmVyTmFtZXMiLCJldmVudExpc3RlbmVyIiwiZSIsInRhcmdldCIsIm5hbWUiLCJ0eXBlIiwiZGVmYXVsdFByZXZlbnRlZCIsInVwZGF0ZSIsInBhcmVudE5vZGUiLCJoaWRlRGlyZWN0aXZlIiwidGVzdCIsImJvb2wiLCJvbGRub2RlIiwibmV3ZG9tIiwiY3JlYXRlVGV4dE5vZGUiLCJyZXBsYWNlQ2hpbGQiLCJkaXJlY3RpdmVzIiwibmV3Q2hpbGRyZW4iLCJzdHlsZSIsImRpc3BsYXkiLCJjbGFzc2VzIiwiY2xhc3NMaXN0IiwidG9nZ2xlIiwiaHRtbCIsIm1vZGVsIiwicHJvcGVydHkiLCJ2YWx1ZSIsImhhbmRsZXIiLCJBcnJheSIsImlzQXJyYXkiLCJ2YWwiLCJpZHgiLCJpbmRleE9mIiwic3BsaWNlIiwic2hhcmVkU2V0QXR0cmlidXRlIiwibXVsdGlwbGUiLCJjdHJsS2V5IiwiZm9yRWFjaCIsImNoaWxkIiwiam9pbiIsInNlbGVjdGVkIiwicHJldkhhbmRsZXIiLCJjbGVhbnVwIiwibmV3Vm5vZGUiLCJhZGRFdmVudExpc3RlbmVyIiwic2xpY2UiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJ1cGRhdGVBdHRyaWJ1dGVzIiwicGF0Y2giLCJ0ZXh0Q29udGVudCIsIm5ld1RyZWUiLCJvbGRUcmVlIiwib2xkVHJlZUxlbmd0aCIsIm5ld1RyZWVMZW5ndGgiLCJvbGRLZXllZExpc3QiLCJuZXdLZXllZExpc3QiLCJuZXdDaGlsZCIsIm9sZENoaWxkIiwic2hvdWxkUGF0Y2giLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwidmlldyIsImJpbmQiLCJvbGRNYWluVm5vZGUiLCJ1bm1vdW50IiwicmVzdWx0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSIsInYiLCJ0YWdPckNvbXBvbmVudCIsImZyYWdtZW50IiwiXyIsImRpcmVjdGl2ZSIsImRpcmVjdGl2ZU5hbWUiLCJjb250YWluZXIiLCJxdWVyeVNlbGVjdG9yQWxsIiwidm5vZGVDb21wb25lbnQiXSwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eSAqL1xuLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuXG4vLyBUaGUgVm5vZGVQcm9wZXJ0aWVzIGludGVyZmFjZSByZXByZXNlbnRzIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIGEgdmlydHVhbCBub2RlLlxuZXhwb3J0IGludGVyZmFjZSBWbm9kZVByb3BlcnRpZXMge1xuICAvLyBBIHVuaXF1ZSBrZXkgZm9yIHRoZSB2aXJ0dWFsIG5vZGUsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBvciBhIG51bWJlci5cbiAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIG9wdGltaXppbmcgdXBkYXRlcyBpbiBhIGxpc3Qgb2Ygbm9kZXMuXG4gIGtleT86IHN0cmluZyB8IG51bWJlcjtcbiAgLy8gQSBzdGF0ZSBvYmplY3QgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHZpcnR1YWwgbm9kZS5cbiAgc3RhdGU/OiBhbnk7XG4gIC8vIEFuIGluZGV4IHNpZ25hdHVyZSB0aGF0IGFsbG93cyBmb3IgYW55IG90aGVyIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQuXG4gIFtrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbF06IGFueTtcbn1cblxuLy8gVGhlIERvbUVsZW1lbnQgaW50ZXJmYWNlIGV4dGVuZHMgdGhlIEVsZW1lbnQgaW50ZXJmYWNlIHdpdGggYW4gaW5kZXggc2lnbmF0dXJlLlxuLy8gVGhpcyBhbGxvd3MgZm9yIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gRE9NIGVsZW1lbnRzLlxuZXhwb3J0IGludGVyZmFjZSBEb21FbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLy8gVGhlIFZub2RlSW50ZXJmYWNlIHJlcHJlc2VudHMgYSB2aXJ0dWFsIG5vZGUuIEl0IGhhcyBhIG51bWJlciBvZiBvcHRpb25hbCBmaWVsZHMsXG4vLyBpbmNsdWRpbmcgYSB0YWcsIHByb3BzLCBjaGlsZHJlbiwgYW5kIGEgRE9NIGVsZW1lbnQuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlSW50ZXJmYWNlIHtcbiAgLy8gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdmlydHVhbCBub2RlLiBJdCB0YWtlcyBhIHRhZywgcHJvcHMsIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMuXG4gIC8vIFRoZSB0YWcgY2FuIGJlIGEgc3RyaW5nLCBhIGNvbXBvbmVudCwgb3IgYSBQT0pPIGNvbXBvbmVudC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG5ldyAodGFnOiBzdHJpbmcgfCBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50LCBwcm9wczogVm5vZGVQcm9wZXJ0aWVzLCBjaGlsZHJlbjogQ2hpbGRyZW4pOiBWbm9kZUludGVyZmFjZTtcbiAgLy8gVGhlIHRhZyBmb3IgdGhlIHZpcnR1YWwgbm9kZS4gSXQgY2FuIGJlIGEgc3RyaW5nLCBhIGNvbXBvbmVudCwgb3IgYSBQT0pPIGNvbXBvbmVudC5cbiAgdGFnOiBzdHJpbmcgfCBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50O1xuICAvLyBUaGUgcHJvcHMgZm9yIHRoZSB2aXJ0dWFsIG5vZGUuXG4gIHByb3BzOiBWbm9kZVByb3BlcnRpZXM7XG4gIC8vIFRoZSBjaGlsZHJlbiBmb3IgdGhlIHZpcnR1YWwgbm9kZS5cbiAgY2hpbGRyZW46IENoaWxkcmVuO1xuICAvLyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2aXJ0dWFsIG5vZGUgaXMgYW4gU1ZHIGVsZW1lbnQuXG4gIGlzU1ZHPzogYm9vbGVhbjtcbiAgLy8gVGhlIERPTSBlbGVtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHZpcnR1YWwgbm9kZS5cbiAgZG9tPzogRG9tRWxlbWVudDtcbiAgLy8gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmlydHVhbCBub2RlIGhhcyBiZWVuIHByb2Nlc3NlZCBpbiB0aGUga2V5ZWQgZGlmZmluZyBhbGdvcml0aG0uXG4gIHByb2Nlc3NlZD86IGJvb2xlYW47XG4gIC8vIEFuIGluZGV4IHNpZ25hdHVyZSB0aGF0IGFsbG93cyBmb3IgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byB0aGUgdmlydHVhbCBub2RlLlxuICBba2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2xdOiBhbnk7XG59XG5cbi8vIFRoZSBWbm9kZVdpdGhEb20gaW50ZXJmYWNlIHJlcHJlc2VudHMgYSB2aXJ0dWFsIG5vZGUgdGhhdCBoYXMgYSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlV2l0aERvbSBleHRlbmRzIFZub2RlSW50ZXJmYWNlIHtcbiAgZG9tOiBEb21FbGVtZW50O1xufVxuXG4vLyBUaGUgQ29tcG9uZW50IGludGVyZmFjZSByZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmlydHVhbCBub2RlIG9yIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzLlxuLy8gSXQgY2FuIGFsc28gaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCB7XG4gIC8vIFRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2aXJ0dWFsIG5vZGUgb3IgYSBsaXN0IG9mIHZpcnR1YWwgbm9kZXMuXG4gIC8vIEl0IGNhbiB0YWtlIHByb3BzIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAocHJvcHM/OiBWbm9kZVByb3BlcnRpZXMgfCBudWxsLCAuLi5jaGlsZHJlbjogYW55W10pOiBWbm9kZUludGVyZmFjZSB8IENoaWxkcmVuIHwgYW55O1xuICAvLyBBbiBpbmRleCBzaWduYXR1cmUgdGhhdCBhbGxvd3MgZm9yIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vLyBUaGUgUE9KT0NvbXBvbmVudCBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIFwicGxhaW4gb2xkIEphdmFTY3JpcHQgb2JqZWN0XCIgKFBPSk8pIGNvbXBvbmVudC5cbi8vIEl0IGhhcyBhIHZpZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmlydHVhbCBub2RlIG9yIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzLFxuLy8gYXMgd2VsbCBhcyBvcHRpb25hbCBwcm9wcyBhbmQgY2hpbGRyZW4uXG4vLyBJdCBjYW4gYmUgdXNlZCBhbHNvIHRvIGlkZW50aWZ5IGNsYXNzIGluc3RhbmNlIGNvbXBvbmVudHMuXG5leHBvcnQgaW50ZXJmYWNlIFBPSk9Db21wb25lbnQge1xuICAvLyBUaGUgdmlldyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2aXJ0dWFsIG5vZGUgb3IgYSBsaXN0IG9mIHZpcnR1YWwgbm9kZXMuXG4gIHZpZXc6IENvbXBvbmVudDtcbiAgLy8gVGhlIHByb3BzIGZvciB0aGUgY29tcG9uZW50LlxuICBwcm9wcz86IFZub2RlUHJvcGVydGllcyB8IG51bGw7XG4gIC8vIFRoZSBjaGlsZHJlbiBmb3IgdGhlIGNvbXBvbmVudC5cbiAgY2hpbGRyZW4/OiBhbnlbXTtcbiAgLy8gQW4gaW5kZXggc2lnbmF0dXJlIHRoYXQgYWxsb3dzIGZvciBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBQT0pPIGNvbXBvbmVudC5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vLyBUaGUgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgcmVwcmVzZW50cyBhIHZpcnR1YWwgbm9kZSB0aGF0IGhhcyBhIGNvbXBvbmVudCBhcyBpdHMgdGFnLlxuLy8gSXQgaGFzIHByb3BzIGFuZCBjaGlsZHJlbiwganVzdCBsaWtlIGEgcmVndWxhciB2aXJ0dWFsIG5vZGUuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIGV4dGVuZHMgVm5vZGVJbnRlcmZhY2Uge1xuICB0YWc6IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQ7XG4gIHByb3BzOiBWbm9kZVByb3BlcnRpZXM7XG4gIGNoaWxkcmVuOiBDaGlsZHJlbjtcbn1cblxuLy8gVGhlIENoaWxkcmVuIGludGVyZmFjZSByZXByZXNlbnRzIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzIG9yIG90aGVyIHZhbHVlcy5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRyZW4gZXh0ZW5kcyBBcnJheTxWbm9kZUludGVyZmFjZSB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIHwgYW55PiB7fVxuXG4vLyBUaGUgRGlyZWN0aXZlIGludGVyZmFjZSByZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIHZpcnR1YWwgbm9kZS5cbi8vIEl0IHJlY2VpdmVzIHRoZSB2YWx1ZSwgdmlydHVhbCBub2RlLCBhbmQgb2xkIHZpcnR1YWwgbm9kZSBhcyBhcmd1bWVudHMsIGFuZCBjYW4gcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZS5cbi8vIElmIG9ubHkgdGhlIHZpcnR1YWwgbm9kZSBpcyBwYXNzZWQsIGl0IG1lYW5zIGl0cyB0aGUgb24gY3JlYXRlIHBoYXNlIGZvciB0aGUgdi1ub2RlLlxuLy8gSWYgdGhlIG9sZCB2aXJ0dWFsIG5vZGUgaXMgYWxzbyBwYXNzZWQsIGl0IG1lYW5zIGl0cyB0aGUgb24gdXBkYXRlIHBoYXNlIGZvciB0aGUgdi1ub2RlLlxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgKHZhbHVlOiBhbnksIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB8IGJvb2xlYW47XG59XG5cbi8vIFRoZSBEaXJlY3RpdmVzIGludGVyZmFjZSBpcyBhIG1hcHBpbmcgb2YgZGlyZWN0aXZlIG5hbWVzIHRvIERpcmVjdGl2ZSBmdW5jdGlvbnMuXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZXMge1xuICBba2V5OiBzdHJpbmddOiBEaXJlY3RpdmU7XG59XG5cbi8vIFRoZSBSZXNlcnZlZFByb3BzIGludGVyZmFjZSBpcyBhIG1hcHBpbmcgb2YgcmVzZXJ2ZWQgcHJvcCBuYW1lcyB0byB0aGUgdmFsdWUgYHRydWVgLlxuLy8gVGhlc2UgcHJvcCBuYW1lcyBjYW5ub3QgYmUgdXNlZCBhcyBjdXN0b20gcHJvcCBuYW1lcy5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzZXJ2ZWRQcm9wcyB7XG4gIFtrZXk6IHN0cmluZ106IHRydWU7XG59XG5cbi8vIFRoZSBDdXJyZW50IGludGVyZmFjZSByZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgdmlydHVhbCBub2RlIHRoYXQgYXJlIGJlaW5nIHByb2Nlc3NlZC5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VycmVudCB7XG4gIC8vIFRoZSBjdXJyZW50IGNvbXBvbmVudC4gSXQgY2FuIGJlIGEgY29tcG9uZW50LCBhIFBPSk8gY29tcG9uZW50LCBvciBudWxsLlxuICBjb21wb25lbnQ6IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQgfCBudWxsO1xuICAvLyBUaGUgY3VycmVudCB2aXJ0dWFsIG5vZGUuIEl0IG11c3QgaGF2ZSBhIERPTSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgdm5vZGU6IFZub2RlV2l0aERvbSB8IG51bGw7XG4gIC8vIFRoZSBvbGQgdmlydHVhbCBub2RlLiBJdCBtdXN0IGhhdmUgYSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuXG4gIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tIHwgbnVsbDtcbiAgLy8gVGhlIGN1cnJlbnQgZXZlbnQuIEl0IGNhbiBiZSBhbiBldmVudCBvciBudWxsLlxuICBldmVudDogRXZlbnQgfCBudWxsO1xufVxuXG4vLyBUaGUgViBmdW5jdGlvbiBpcyB0aGUgbWFpbiBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgdmlydHVhbCBub2Rlcy5cbi8vIEl0IHRha2VzIGEgdGFnIG9yIGNvbXBvbmVudCwgcHJvcHMsIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm5zIGEgdmlydHVhbCBub2RlLlxuZXhwb3J0IGludGVyZmFjZSBWIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICAodGFnT3JDb21wb25lbnQ6IHN0cmluZyB8IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQsIHByb3BzOiBWbm9kZVByb3BlcnRpZXMgfCBudWxsLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pOlxuICAgIHwgVm5vZGVJbnRlcmZhY2VcbiAgICB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIGZyYWdtZW50KF86IGFueSwgLi4uY2hpbGRyZW46IENoaWxkcmVuKTogQ2hpbGRyZW47XG59XG4vLyAndGV4dFRhZycgaXMgYSBjb25zdGFudCBzdHJpbmcgdGhhdCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0ZXh0IG5vZGVzIGluIHRoZSB2aXJ0dWFsIERPTS5cbmNvbnN0IHRleHRUYWcgPSBcIiN0ZXh0XCI7XG5cbi8vICdpc05vZGVKcycgaXMgYSBib29sZWFuIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgY29kZSBpcyBydW5uaW5nIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLlxuLy8gSXQgaXMgZGV0ZXJtaW5lZCBieSBjaGVja2luZyBpZiB0aGUgJ3Byb2Nlc3MnIGdsb2JhbCBvYmplY3QgaXMgZGVmaW5lZCBhbmQgaGFzIGEgJ3ZlcnNpb25zJyBwcm9wZXJ0eS5cbmV4cG9ydCBsZXQgaXNOb2RlSnMgPSBCb29sZWFuKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcblxuLy8gJ2NyZWF0ZURvbUVsZW1lbnQnIGlzIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgbmV3IERPTSBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCB0YWcgbmFtZS5cbi8vIElmICdpc1NWRycgaXMgdHJ1ZSwgaXQgY3JlYXRlcyBhbiBTVkcgZWxlbWVudCBpbnN0ZWFkIG9mIGEgcmVndWxhciBET00gZWxlbWVudC5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEb21FbGVtZW50KHRhZzogc3RyaW5nLCBpc1NWRzogYm9vbGVhbiA9IGZhbHNlKTogRG9tRWxlbWVudCB7XG4gIHJldHVybiBpc1NWRyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHRhZykgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG59XG5cbi8vICdWbm9kZScgaXMgYSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSB2aXJ0dWFsIERPTSBub2RlLlxuLy8gSXQgaGFzIHRocmVlIHByb3BlcnRpZXM6ICd0YWcnLCAncHJvcHMnLCBhbmQgJ2NoaWxkcmVuJy5cbi8vICdWbm9kZScgaXMgZXhwb3J0ZWQgYXMgYW4gb2JqZWN0IHdpdGggYSB0eXBlIG9mICdWbm9kZUludGVyZmFjZScuXG4vLyBUaGUgJ2FzIHVua25vd24gYXMgVm5vZGVJbnRlcmZhY2UnIGlzIHVzZWQgdG8gdGVsbCBUeXBlU2NyaXB0IHRoYXQgdGhlICdWbm9kZScgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHR5cGUgYXMgJ1Zub2RlSW50ZXJmYWNlJy5cbmV4cG9ydCBjb25zdCBWbm9kZSA9IGZ1bmN0aW9uIFZub2RlKHRoaXM6IFZub2RlSW50ZXJmYWNlLCB0YWc6IHN0cmluZywgcHJvcHM6IFZub2RlUHJvcGVydGllcywgY2hpbGRyZW46IENoaWxkcmVuKSB7XG4gIC8vICd0aGlzJyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgJ1Zub2RlJy5cbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xufSBhcyB1bmtub3duIGFzIFZub2RlSW50ZXJmYWNlO1xuXG4vLyAnaXNDb21wb25lbnQnIGlzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuICdjb21wb25lbnQnIGlzIGEgdmFsaWQgY29tcG9uZW50IGFuZCBmYWxzZSBvdGhlcndpc2UuXG4vLyBBIGNvbXBvbmVudCBpcyBlaXRoZXIgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhICd2aWV3JyBmdW5jdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudChjb21wb25lbnQpOiBjb21wb25lbnQgaXMgQ29tcG9uZW50IHtcbiAgcmV0dXJuIGNvbXBvbmVudCAmJiAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiIHx8ICh0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIFwidmlld1wiIGluIGNvbXBvbmVudCkpO1xufVxuXG4vLyAnaXNWbm9kZScgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ29iamVjdCcgaXMgYSAnVm5vZGUnIGluc3RhbmNlIGFuZCBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnQgY29uc3QgaXNWbm9kZSA9IChvYmplY3Q/OiB1bmtub3duIHwgVm5vZGVJbnRlcmZhY2UpOiBvYmplY3QgaXMgVm5vZGVJbnRlcmZhY2UgPT4ge1xuICAvLyBVc2UgdGhlICdpbnN0YW5jZW9mJyBvcGVyYXRvciB0byBjaGVjayBpZiAnb2JqZWN0JyBpcyBhbiBpbnN0YW5jZSBvZiAnVm5vZGUnLlxuICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgVm5vZGU7XG59O1xuXG4vLyAnaXNWbm9kZUNvbXBvbmVudCcgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ29iamVjdCcgaXMgYSAnVm5vZGUnIGluc3RhbmNlIHdpdGggYSAndGFnJyBwcm9wZXJ0eSB0aGF0IGlzIGEgdmFsaWQgY29tcG9uZW50LlxuLy8gSXQgcmV0dXJucyBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnQgY29uc3QgaXNWbm9kZUNvbXBvbmVudCA9IChvYmplY3Q/OiB1bmtub3duIHwgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UpOiBvYmplY3QgaXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgPT4ge1xuICAvLyBDaGVjayBpZiAnb2JqZWN0JyBpcyBhICdWbm9kZScgaW5zdGFuY2UgYW5kIGl0cyAndGFnJyBwcm9wZXJ0eSBpcyBhIHZhbGlkIGNvbXBvbmVudC5cbiAgcmV0dXJuIGlzVm5vZGUob2JqZWN0KSAmJiBpc0NvbXBvbmVudChvYmplY3QudGFnKTtcbn07XG5cbi8vICdkb21Ub1Zub2RlJyBpcyBhIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYSBET00gbm9kZSB0byBhICdWbm9kZScgaW5zdGFuY2UuXG5leHBvcnQgZnVuY3Rpb24gZG9tVG9Wbm9kZShkb206IGFueSk6IFZub2RlV2l0aERvbSB7XG4gIC8vIElmIHRoZSBjaGlsZCBub2RlIGlzIGEgdGV4dCBub2RlLCBjcmVhdGUgYSAnVm5vZGUnIGluc3RhbmNlIHdpdGggdGhlICd0ZXh0VGFnJyBjb25zdGFudCBhcyB0aGUgJ3RhZycgcHJvcGVydHkuXG4gIC8vIFNldCB0aGUgJ2RvbScgcHJvcGVydHkgb2YgdGhlICdWbm9kZScgaW5zdGFuY2UgdG8gdGhlIGNoaWxkIERPTSBub2RlLlxuICAvLyBQdXNoIHRoZSAnVm5vZGUnIGluc3RhbmNlIHRvIHRoZSAnY2hpbGRyZW4nIGFycmF5LlxuICBpZiAoZG9tLm5vZGVUeXBlID09PSAzKSB7XG4gICAgbGV0IHZub2RlID0gbmV3IFZub2RlKHRleHRUYWcsIHt9LCBbZG9tLm5vZGVWYWx1ZV0pO1xuICAgIHZub2RlLmRvbSA9IGRvbTtcbiAgICByZXR1cm4gdm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICB9XG5cbiAgbGV0IGNoaWxkcmVuOiBWbm9kZVdpdGhEb21bXSA9IFtdO1xuICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIGNoaWxkIG5vZGVzIG9mICdkb20nLlxuICBmb3IgKGxldCBpID0gMCwgbCA9IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGxldCBjaGlsZERvbSA9IGRvbS5jaGlsZE5vZGVzW2ldO1xuICAgIC8vIElmIHRoZSBjaGlsZCBub2RlIGlzIGFuIGVsZW1lbnQgbm9kZSwgcmVjdXJzaXZlbHkgY2FsbCAnZG9tVG9Wbm9kZScgdG8gY29udmVydCBpdCB0byBhICdWbm9kZScgaW5zdGFuY2UuXG4gICAgLy8gUHVzaCB0aGUgJ1Zub2RlJyBpbnN0YW5jZSB0byB0aGUgJ2NoaWxkcmVuJyBhcnJheS5cbiAgICBpZiAoY2hpbGREb20ubm9kZVR5cGUgPT09IDEgfHwgY2hpbGREb20ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goZG9tVG9Wbm9kZShjaGlsZERvbSkpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBwcm9wczogVm5vZGVQcm9wZXJ0aWVzID0ge307XG4gIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgYXR0cmlidXRlcyBvZiAnZG9tJy5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBkb20uYXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBsZXQgYXR0ciA9IGRvbS5hdHRyaWJ1dGVzW2ldO1xuICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlIHRvIHRoZSAncHJvcHMnIG9iamVjdCwgdXNpbmcgdGhlIGF0dHJpYnV0ZSdzIG5hbWUgYXMgdGhlIGtleSBhbmQgaXRzIHZhbHVlIGFzIHRoZSB2YWx1ZS5cbiAgICBwcm9wc1thdHRyLm5vZGVOYW1lXSA9IGF0dHIubm9kZVZhbHVlO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbmV3ICdWbm9kZScgaW5zdGFuY2Ugd2l0aCB0aGUgJ3RhZycgcHJvcGVydHkgc2V0IHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiBvZiB0aGUgRE9NIG5vZGUncyB0YWcgbmFtZS5cbiAgLy8gU2V0IHRoZSAncHJvcHMnIGFuZCAnY2hpbGRyZW4nIHByb3BlcnRpZXMgdG8gdGhlICdwcm9wcycgYW5kICdjaGlsZHJlbicgYXJyYXlzIHJlc3BlY3RpdmVseS5cbiAgLy8gU2V0IHRoZSAnZG9tJyBwcm9wZXJ0eSBvZiB0aGUgJ1Zub2RlJyBpbnN0YW5jZSB0byB0aGUgRE9NIG5vZGUuXG4gIGxldCB2bm9kZSA9IG5ldyBWbm9kZShkb20udGFnTmFtZS50b0xvd2VyQ2FzZSgpLCBwcm9wcywgY2hpbGRyZW4pO1xuICB2bm9kZS5kb20gPSBkb207XG4gIHJldHVybiB2bm9kZSBhcyBWbm9kZVdpdGhEb207XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gYW4gSFRNTCBzdHJpbmcgYW5kIGNyZWF0ZXMgYSB2aXJ0dWFsIG5vZGUgcmVwcmVzZW50YXRpb24gb2YgaXRcbi8vIHVzaW5nIHRoZSBgZG9tVG9Wbm9kZWAgZnVuY3Rpb24uIEl0IGRvZXMgdGhpcyBieSBjcmVhdGluZyBhIG5ldyBgZGl2YCBlbGVtZW50LCBzZXR0aW5nXG4vLyBpdHMgYGlubmVySFRNTGAgdG8gdGhlIHByb3ZpZGVkIEhUTUwgc3RyaW5nLCBhbmQgdGhlbiB1c2luZyBgbWFwYCB0byBpdGVyYXRlIG92ZXIgdGhlXG4vLyBgY2hpbGROb2Rlc2Agb2YgdGhlIGBkaXZgIGVsZW1lbnQsIHBhc3NpbmcgZWFjaCBvbmUgdG8gYGRvbVRvVm5vZGVgIHRvIGNyZWF0ZSBhIHZpcnR1YWxcbi8vIG5vZGUgcmVwcmVzZW50YXRpb24gb2YgaXQuIFRoZSByZXN1bHRpbmcgYXJyYXkgb2YgdmlydHVhbCBub2RlcyBpcyB0aGVuIHJldHVybmVkLlxuZXhwb3J0IGZ1bmN0aW9uIHRydXN0KGh0bWxTdHJpbmc6IHN0cmluZykge1xuICBsZXQgZGl2ID0gY3JlYXRlRG9tRWxlbWVudChcImRpdlwiKTtcbiAgZGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmcudHJpbSgpO1xuXG4gIHJldHVybiBbXS5tYXAuY2FsbChkaXYuY2hpbGROb2RlcywgKGl0ZW0pID0+IGRvbVRvVm5vZGUoaXRlbSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyogTWFpbiBDb21wb25lbnQgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8vIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBzdG9yZSB0aGUgbWFpbiBjb21wb25lbnQsIHRoZSBtYWluIHZpcnR1YWwgbm9kZSwgYW5kIHdoZXRoZXJcbi8vIHRoZSBtYWluIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgbW91bnRlZC5cbmxldCBtYWluQ29tcG9uZW50OiBWbm9kZUNvbXBvbmVudEludGVyZmFjZSB8IG51bGwgPSBudWxsO1xubGV0IG1haW5Wbm9kZTogVm5vZGVXaXRoRG9tIHwgbnVsbCA9IG51bGw7XG5sZXQgaXNNb3VudGVkID0gZmFsc2U7XG5cbi8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIGN1cnJlbnQgdmlydHVhbCBub2RlIGFuZCBjb21wb25lbnQgYmVpbmcgcmVuZGVyZWQuXG5leHBvcnQgY29uc3QgY3VycmVudDogQ3VycmVudCA9IHtcbiAgdm5vZGU6IG51bGwsXG4gIG9sZFZub2RlOiBudWxsLFxuICBjb21wb25lbnQ6IG51bGwsXG4gIGV2ZW50OiBudWxsXG59O1xuXG4vKiBSZXNlcnZlZCBwcm9wcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLy8gVGhpcyBvYmplY3QgaXMgdXNlZCB0byBzdG9yZSB0aGUgbmFtZXMgb2YgcmVzZXJ2ZWQgcHJvcHMsIHdoaWNoIGFyZSBwcm9wcyB0aGF0IGFyZSByZXNlcnZlZFxuLy8gZm9yIHNwZWNpYWwgcHVycG9zZXMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBhcyByZWd1bGFyIGNvbXBvbmVudCBwcm9wcy5cbmV4cG9ydCBjb25zdCByZXNlcnZlZFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB0cnVlPiA9IHtcbiAga2V5OiB0cnVlLFxuICBzdGF0ZTogdHJ1ZSxcbiAgXCJ2LWtlZXBcIjogdHJ1ZSxcblxuICAvLyBCdWlsdCBpbiBkaXJlY3RpdmVzXG4gIFwidi1pZlwiOiB0cnVlLFxuICBcInYtdW5sZXNzXCI6IHRydWUsXG4gIFwidi1mb3JcIjogdHJ1ZSxcbiAgXCJ2LXNob3dcIjogdHJ1ZSxcbiAgXCJ2LWNsYXNzXCI6IHRydWUsXG4gIFwidi1odG1sXCI6IHRydWUsXG4gIFwidi1tb2RlbFwiOiB0cnVlLFxuICBcInYtY3JlYXRlXCI6IHRydWUsXG4gIFwidi11cGRhdGVcIjogdHJ1ZSxcbiAgXCJ2LWNsZWFudXBcIjogdHJ1ZVxufTtcblxuLyogTW91bnRpbmcsIFVwZGF0aW5nLCBDbGVhbnVwIGFuZCBVbm1vdW50aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi8vIFRoZXNlIHNldHMgYXJlIHVzZWQgdG8gc3RvcmUgY2FsbGJhY2tzIGZvciB2YXJpb3VzIGxpZmVjeWNsZSBldmVudHM6IG1vdW50aW5nLCB1cGRhdGluZyxcbi8vIGNsZWFuaW5nIHVwLCBhbmQgdW5tb3VudGluZy5cbmNvbnN0IG9uQ2xlYW51cFNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcbmNvbnN0IG9uTW91bnRTZXQ6IFNldDxGdW5jdGlvbj4gPSBuZXcgU2V0KCk7XG5jb25zdCBvblVwZGF0ZVNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcbmNvbnN0IG9uVW5tb3VudFNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcblxuLy8gVGhlc2UgZnVuY3Rpb25zIGFsbG93IHVzZXJzIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbGlmZWN5Y2xlIGV2ZW50cy5cbmV4cG9ydCBmdW5jdGlvbiBvbk1vdW50KGNhbGxiYWNrKSB7XG4gIGlmICghaXNNb3VudGVkKSB7XG4gICAgb25Nb3VudFNldC5hZGQoY2FsbGJhY2spO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvblVwZGF0ZShjYWxsYmFjaykge1xuICBvblVwZGF0ZVNldC5hZGQoY2FsbGJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25DbGVhbnVwKGNhbGxiYWNrKSB7XG4gIG9uQ2xlYW51cFNldC5hZGQoY2FsbGJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25Vbm1vdW50KGNhbGxiYWNrKSB7XG4gIGlmICghaXNNb3VudGVkKSB7XG4gICAgb25Vbm1vdW50U2V0LmFkZChjYWxsYmFjayk7XG4gIH1cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNhbGwgYWxsIHRoZSBjYWxsYmFja3MgaW4gYSBnaXZlbiBzZXQuXG5mdW5jdGlvbiBjYWxsU2V0KHNldCkge1xuICBmb3IgKGxldCBjYWxsYmFjayBvZiBzZXQpIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgc2V0LmNsZWFyKCk7XG59XG5cbi8qIEV2ZW50IGxpc3RlbmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8vIFRoaXMgb2JqZWN0IHN0b3JlcyB0aGUgbmFtZXMgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkXG5jb25zdCBldmVudExpc3RlbmVyTmFtZXM6IFJlY29yZDxzdHJpbmcsIHRydWU+ID0ge307XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYW4gZXZlbnQgb2NjdXJzXG5mdW5jdGlvbiBldmVudExpc3RlbmVyKGU6IEV2ZW50KSB7XG4gIC8vIFNldCB0aGUgY3VycmVudCBldmVudCB0byB0aGUgZXZlbnQgdGhhdCBvY2N1cnJlZCBzbyB0aGF0IGl0IGNhbiBiZSBwcmV2ZW50ZWQgaWYgbmVjZXNzYXJ5XG4gIGN1cnJlbnQuZXZlbnQgPSBlO1xuXG4gIC8vIENvbnZlcnQgdGhlIHRhcmdldCBvZiB0aGUgZXZlbnQgdG8gYSBET00gZWxlbWVudFxuICBsZXQgZG9tID0gZS50YXJnZXQgYXMgRG9tRWxlbWVudDtcblxuICAvLyBDcmVhdGUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IGxpc3RlbmVyIGJ5IGFkZGluZyBcInYtb25cIiB0byB0aGUgZXZlbnQgdHlwZVxuICBsZXQgbmFtZSA9IGB2LW9uJHtlLnR5cGV9YDtcblxuICAvLyBLZWVwIGdvaW5nIHVwIHRoZSBET00gdHJlZSB1bnRpbCB3ZSBmaW5kIGFuIGVsZW1lbnQgd2l0aCBhbiBldmVudCBsaXN0ZW5lclxuICAvLyBtYXRjaGluZyB0aGUgZXZlbnQgdHlwZVxuICB3aGlsZSAoZG9tKSB7XG4gICAgaWYgKGRvbVtuYW1lXSkge1xuICAgICAgLy8gQ2FsbCB0aGUgZXZlbnQgbGlzdGVuZXIgZnVuY3Rpb25cbiAgICAgIGRvbVtuYW1lXShlLCBkb20pO1xuXG4gICAgICAvLyBJZiB0aGUgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGV2ZW50IGhhc24ndCBiZWVuIHByZXZlbnRlZCwgdXBkYXRlIHRoZSBET01cbiAgICAgIGlmICghZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHVwZGF0ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkb20gPSBkb20ucGFyZW50Tm9kZSBhcyBEb21FbGVtZW50O1xuICB9XG5cbiAgY3VycmVudC5ldmVudCA9IG51bGw7XG59XG5cbi8qIERpcmVjdGl2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8vIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGRpcmVjdGl2ZSB0aGF0IGhpZGVzIGFuIGVsZW1lbnQgYmFzZWQgb24gYSBjb25kaXRpb25cbmxldCBoaWRlRGlyZWN0aXZlID0gKHRlc3Q6IGJvb2xlYW4pID0+IChib29sOiBib29sZWFuLCB2bm9kZTogVm5vZGVJbnRlcmZhY2UsIG9sZG5vZGU/OiBWbm9kZUludGVyZmFjZSkgPT4ge1xuICAvLyBJZiB0ZXN0IGlzIHRydWUsIHVzZSB0aGUgdmFsdWUgb2YgYm9vbC4gT3RoZXJ3aXNlLCB1c2UgdGhlIG9wcG9zaXRlIG9mIGJvb2wuXG4gIGxldCB2YWx1ZSA9IHRlc3QgPyBib29sIDogIWJvb2w7XG5cbiAgLy8gSWYgdGhlIHZhbHVlIGlzIHRydWUsIGhpZGUgdGhlIGVsZW1lbnQgYnkgcmVwbGFjaW5nIGl0IHdpdGggYSB0ZXh0IG5vZGVcbiAgaWYgKHZhbHVlKSB7XG4gICAgbGV0IG5ld2RvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgIGlmIChvbGRub2RlICYmIG9sZG5vZGUuZG9tICYmIG9sZG5vZGUuZG9tLnBhcmVudE5vZGUpIHtcbiAgICAgIG9sZG5vZGUuZG9tLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld2RvbSwgb2xkbm9kZS5kb20pO1xuICAgIH1cbiAgICB2bm9kZS50YWcgPSBcIiN0ZXh0XCI7XG4gICAgdm5vZGUuY2hpbGRyZW4gPSBbXTtcbiAgICB2bm9kZS5wcm9wcyA9IHt9O1xuICAgIHZub2RlLmRvbSA9IG5ld2RvbSBhcyB1bmtub3duIGFzIERvbUVsZW1lbnQ7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vLyBUaGlzIG9iamVjdCBzdG9yZXMgYWxsIHRoZSBhdmFpbGFibGUgZGlyZWN0aXZlc1xuZXhwb3J0IGNvbnN0IGRpcmVjdGl2ZXM6IERpcmVjdGl2ZXMgPSB7XG4gIC8vIFRoZSBcInYtaWZcIiBkaXJlY3RpdmUgaGlkZXMgYW4gZWxlbWVudCBpZiB0aGUgZ2l2ZW4gY29uZGl0aW9uIGlzIGZhbHNlXG4gIFwidi1pZlwiOiBoaWRlRGlyZWN0aXZlKGZhbHNlKSxcblxuICAvLyBUaGUgXCJ2LXVubGVzc1wiIGRpcmVjdGl2ZSBoaWRlcyBhbiBlbGVtZW50IGlmIHRoZSBnaXZlbiBjb25kaXRpb24gaXMgdHJ1ZVxuICBcInYtdW5sZXNzXCI6IGhpZGVEaXJlY3RpdmUodHJ1ZSksXG5cbiAgLy8gVGhlIFwidi1mb3JcIiBkaXJlY3RpdmUgY3JlYXRlcyBhIGxvb3AgYW5kIGFwcGxpZXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBlYWNoIGl0ZW0gaW4gdGhlIGxvb3BcbiAgXCJ2LWZvclwiOiAoc2V0OiB1bmtub3duW10sIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBsZXQgbmV3Q2hpbGRyZW46IFZub2RlSW50ZXJmYWNlW10gPSBbXTtcbiAgICBsZXQgY2FsbGJhY2sgPSB2bm9kZS5jaGlsZHJlblswXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHNldC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goY2FsbGJhY2soc2V0W2ldLCBpKSk7XG4gICAgfVxuICAgIHZub2RlLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1zaG93XCIgZGlyZWN0aXZlIHNob3dzIG9yIGhpZGVzIGFuIGVsZW1lbnQgYnkgc2V0dGluZyB0aGUgXCJkaXNwbGF5XCIgc3R5bGUgcHJvcGVydHlcbiAgXCJ2LXNob3dcIjogKGJvb2w6IGJvb2xlYW4sIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICAoXG4gICAgICB2bm9kZS5kb20gYXMgdW5rbm93biBhcyB7XG4gICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6IHN0cmluZyB9O1xuICAgICAgfVxuICAgICkuc3R5bGUuZGlzcGxheSA9IGJvb2wgPyBcIlwiIDogXCJub25lXCI7XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1jbGFzc1wiIGRpcmVjdGl2ZSBhZGRzIG9yIHJlbW92ZXMgY2xhc3MgbmFtZXMgZnJvbSBhbiBlbGVtZW50IGJhc2VkIG9uIGEgY29uZGl0aW9uXG4gIFwidi1jbGFzc1wiOiAoY2xhc3NlczogeyBbeDogc3RyaW5nXTogYm9vbGVhbiB9LCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgY2xhc3MgbmFtZXMgaW4gdGhlIGNsYXNzZXMgb2JqZWN0XG4gICAgZm9yIChsZXQgbmFtZSBpbiBjbGFzc2VzKSB7XG4gICAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBjbGFzcyBuYW1lIGZyb20gdGhlIGVsZW1lbnQncyBjbGFzcyBsaXN0IGJhc2VkIG9uIHRoZSB2YWx1ZSBpbiB0aGUgY2xhc3NlcyBvYmplY3RcbiAgICAgICh2bm9kZS5kb20gYXMgRG9tRWxlbWVudCkuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBjbGFzc2VzW25hbWVdKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1odG1sXCIgZGlyZWN0aXZlIHNldHMgdGhlIGlubmVyIEhUTUwgb2YgYW4gZWxlbWVudCB0byB0aGUgZ2l2ZW4gSFRNTCBzdHJpbmdcbiAgXCJ2LWh0bWxcIjogKGh0bWw6IHN0cmluZywgdm5vZGU6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIC8vIFNldCB0aGUgY2hpbGRyZW4gb2YgdGhlIHZub2RlIHRvIGEgdHJ1c3RlZCB2ZXJzaW9uIG9mIHRoZSBIVE1MIHN0cmluZ1xuICAgIHZub2RlLmNoaWxkcmVuID0gW3RydXN0KGh0bWwpXTtcbiAgfSxcblxuICAvLyBUaGUgXCJ2LW1vZGVsXCIgZGlyZWN0aXZlIGJpbmRzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dCBlbGVtZW50IHRvIGEgbW9kZWwgcHJvcGVydHlcbiAgXCJ2LW1vZGVsXCI6IChbbW9kZWwsIHByb3BlcnR5LCBldmVudF06IGFueVtdLCB2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIGxldCB2YWx1ZTtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIG1vZGVsIHByb3BlcnR5IHdoZW4gdGhlIGlucHV0IGVsZW1lbnQncyB2YWx1ZSBjaGFuZ2VzXG4gICAgbGV0IGhhbmRsZXIgPSAoZTogRXZlbnQpID0+IChtb2RlbFtwcm9wZXJ0eV0gPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlKTtcbiAgICBpZiAodm5vZGUudGFnID09PSBcImlucHV0XCIpIHtcbiAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGFuIGlucHV0LCB1c2UgdGhlIFwiaW5wdXRcIiBldmVudCBieSBkZWZhdWx0XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25pbnB1dFwiO1xuICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGlucHV0IGVsZW1lbnQsIHVzZSBhIGRpZmZlcmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICBzd2l0Y2ggKHZub2RlLnByb3BzLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6IHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eV0pKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbW9kZWwgcHJvcGVydHkgaXMgYW4gYXJyYXksIGFkZCBvciByZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIGFycmF5IHdoZW4gdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQgb3IgdW5jaGVja2VkXG4gICAgICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGxldCB2YWwgPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlO1xuICAgICAgICAgICAgICBsZXQgaWR4ID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsKTtcbiAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBpbiB0aGUgYXJyYXksIHNldCB0aGUgY2hlY2tib3ggdG8gYmUgY2hlY2tlZFxuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2bm9kZS5kb20udmFsdWUpICE9PSAtMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiB2bm9kZS5wcm9wcykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGlucHV0IGVsZW1lbnQgaGFzIGEgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSwgdXNlIGl0IHRvIGRldGVybWluZSB0aGUgY2hlY2tlZCBzdGF0ZVxuICAgICAgICAgICAgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUucHJvcHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XSA9IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBcInZhbHVlXCIgYXR0cmlidXRlLCB1c2UgYSBib29sZWFuIHZhbHVlIGZvciB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoKSA9PiAobW9kZWxbcHJvcGVydHldID0gIW1vZGVsW3Byb3BlcnR5XSk7XG4gICAgICAgICAgICB2YWx1ZSA9IG1vZGVsW3Byb3BlcnR5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU2V0IHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUgb24gdGhlIGlucHV0IGVsZW1lbnRcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHZhbHVlLCB2bm9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJhZGlvXCI6IHtcbiAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhIHJhZGlvIGJ1dHRvbiwgc2V0IHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBwcm9wZXJ0eVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgIHNoYXJlZFNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgbW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5kb20udmFsdWUsIHZub2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBpbnB1dCB0eXBlcywgc2V0IHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBtb2RlbFtwcm9wZXJ0eV0sIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSBcInNlbGVjdFwiKSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhIHNlbGVjdCBlbGVtZW50LCB1c2UgdGhlIFwiY2xpY2tcIiBldmVudCBieSBkZWZhdWx0XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25jbGlja1wiO1xuICAgICAgaWYgKHZub2RlLnByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3QgZWxlbWVudCBhbGxvd3MgbXVsdGlwbGUgc2VsZWN0aW9ucywgdXBkYXRlIHRoZSBtb2RlbCBwcm9wZXJ0eSB3aXRoIGFuIGFycmF5IG9mIHNlbGVjdGVkIHZhbHVlc1xuICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikgPT4ge1xuICAgICAgICAgIGxldCB2YWwgPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlO1xuICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDdHJsIGtleSBpcyBwcmVzc2VkLCBhZGQgb3IgcmVtb3ZlIHRoZSB2YWx1ZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgbGV0IGlkeCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbCk7XG4gICAgICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgQ3RybCBrZXkgaXMgbm90IHByZXNzZWQsIHNldCB0aGUgbW9kZWwgcHJvcGVydHkgdG8gYW4gYXJyYXkgd2l0aCB0aGUgc2VsZWN0ZWQgdmFsdWVcbiAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoMCwgbW9kZWxbcHJvcGVydHldLmxlbmd0aCk7XG4gICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gU2V0IHRoZSBcInNlbGVjdGVkXCIgYXR0cmlidXRlIG9uIHRoZSBvcHRpb25zIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBhcmUgaW4gdGhlIG1vZGVsIHByb3BlcnR5IGFycmF5XG4gICAgICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBWbm9kZUludGVyZmFjZSkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IFwidmFsdWVcIiBpbiBjaGlsZC5wcm9wcyA/IGNoaWxkLnByb3BzLnZhbHVlIDogY2hpbGQuY2hpbGRyZW4uam9pbihcIlwiKS50cmltKCk7XG4gICAgICAgICAgICBjaGlsZC5wcm9wcy5zZWxlY3RlZCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbHVlKSAhPT0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3QgZWxlbWVudCBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb25zLCBzZXQgdGhlIFwic2VsZWN0ZWRcIiBhdHRyaWJ1dGUgb24gdGhlIG9wdGlvbnMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBwcm9wZXJ0eVxuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogVm5vZGVJbnRlcmZhY2UpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBcInZhbHVlXCIgaW4gY2hpbGQucHJvcHMgPyBjaGlsZC5wcm9wcy52YWx1ZSA6IGNoaWxkLmNoaWxkcmVuLmpvaW4oXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuc2VsZWN0ZWQgPSB2YWx1ZSA9PT0gbW9kZWxbcHJvcGVydHldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2bm9kZS50YWcgPT09IFwidGV4dGFyZWFcIikge1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSB0ZXh0YXJlYSwgdXNlIHRoZSBcImlucHV0XCIgZXZlbnQgYnkgZGVmYXVsdFxuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uaW5wdXRcIjtcbiAgICAgIC8vIFNldCB0aGUgdGV4dGFyZWEncyBjb250ZW50IHRvIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgIHZub2RlLmNoaWxkcmVuID0gW21vZGVsW3Byb3BlcnR5XV07XG4gICAgfVxuXG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIHByZXYgaGFuZGxlciBpZiBhbnkgd2lsbCBub3QgYmUgY2hhbmdlZCBieSB0aGUgdXNlciBhY3Jvc3MgcGF0Y2hzXG4gICAgbGV0IHByZXZIYW5kbGVyID0gdm5vZGUucHJvcHNbZXZlbnRdO1xuXG4gICAgLy8gU2V0IHRoZSBldmVudCBoYW5kbGVyIG9uIHRoZSBlbGVtZW50XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgc2hhcmVkU2V0QXR0cmlidXRlKFxuICAgICAgZXZlbnQsXG4gICAgICAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgaGFuZGxlcihlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgaGFuZGxlciBpcyBkZWZpbmVkLCBjYWxsIGl0IGFmdGVyIHRoZSBtb2RlbCBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICAgIGlmIChwcmV2SGFuZGxlcikge1xuICAgICAgICAgIHByZXZIYW5kbGVyKGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdm5vZGUsXG4gICAgICBvbGRWbm9kZVxuICAgICk7XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1jcmVhdGVcIiBkaXJlY3RpdmUgaXMgY2FsbGVkIHdoZW4gYSBuZXcgdmlydHVhbCBub2RlIGlzIGNyZWF0ZWQuXG4gIC8vIFRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgbmV3IHZpcnR1YWwgbm9kZSBhcyBhbiBhcmd1bWVudC5cbiAgLy8gVGhpcyBkaXJlY3RpdmUgaXMgb25seSBjYWxsZWQgb25jZSBwZXIgdmlydHVhbCBub2RlLCB3aGVuIGl0IGlzIGZpcnN0IGNyZWF0ZWQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBcInYtY3JlYXRlXCI6IChjYWxsYmFjazogKHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHZvaWQsIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgLy8gSWYgdGhpcyBpcyBub3QgYW4gdXBkYXRlLCBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHRoZSBuZXcgdmlydHVhbCBub2RlXG4gICAgaWYgKCFvbGRWbm9kZSkge1xuICAgICAgbGV0IGNsZWFudXAgPSBjYWxsYmFjayh2bm9kZSk7XG5cbiAgICAgIC8vIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGEgZnVuY3Rpb24sIGNhbGwgaXQgd2hlbiB0aGUgdXBkYXRlIGlzIGdvbm5hIGJlIGNsZWFuZWQgdXBcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9uQ2xlYW51cChjbGVhbnVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gVGhlIFwidi11cGRhdGVcIiBkaXJlY3RpdmUgaXMgY2FsbGVkIHdoZW4gYW4gZXhpc3RpbmcgdmlydHVhbCBub2RlIGlzIHVwZGF0ZWQuXG4gIC8vIFRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgbmV3IGFuZCBvbGQgdmlydHVhbCBub2RlcyBhcyBhcmd1bWVudHMuXG4gIC8vIFRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgY2FsbGVkIG9uY2UgcGVyIHZpcnR1YWwgbm9kZSB1cGRhdGUuXG4gIFwidi11cGRhdGVcIjogKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGNhbGxiYWNrOiAodm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU6IFZub2RlV2l0aERvbSkgPT4gdm9pZCxcbiAgICB2bm9kZTogVm5vZGVXaXRoRG9tLFxuICAgIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tXG4gICkgPT4ge1xuICAgIC8vIElmIHRoaXMgaXMgYW4gdXBkYXRlLCBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHRoZSBuZXcgYW5kIG9sZCB2aXJ0dWFsIG5vZGVzXG4gICAgaWYgKG9sZFZub2RlKSB7XG4gICAgICBsZXQgY2xlYW51cCA9IGNhbGxiYWNrKHZub2RlLCBvbGRWbm9kZSk7XG5cbiAgICAgIC8vIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGEgZnVuY3Rpb24sIGNhbGwgaXQgd2hlbiB0aGUgdXBkYXRlIGlzIGdvbm5hIGJlIGNsZWFuZWQgdXBcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9uQ2xlYW51cChjbGVhbnVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1jbGVhbnVwXCIgZGlyZWN0aXZlIGlzIGNhbGxlZCB3aGVuIHRoZSB1cGRhdGUgaXMgY2xlYW5lZCB1cC5cbiAgLy8gVGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBvbGQgdmlydHVhbCBub2RlIGFzIGFuIGFyZ3VtZW50LlxuICAvLyBUaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IGNhbGxlZCBvbmNlIHBlciB2aXJ0dWFsIG5vZGUsIHdoZW4gdGhlIHVwZGF0ZSBpcyBjbGVhbmVkIHVwLlxuICBcInYtY2xlYW51cFwiOiAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY2FsbGJhY2s6ICh2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkgPT4gdm9pZCxcbiAgICB2bm9kZTogVm5vZGVXaXRoRG9tLFxuICAgIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tXG4gICkgPT4ge1xuICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gdGhlIGxpc3Qgb2YgY2xlYW51cCBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHVwZGF0ZSBpcyBjbGVhbmVkIHVwXG4gICAgb25DbGVhbnVwKCgpID0+IGNhbGxiYWNrKHZub2RlLCBvbGRWbm9kZSkpO1xuICB9XG59O1xuLy8gQWRkIGEgZGlyZWN0aXZlIHRvIHRoZSBnbG9iYWwgZGlyZWN0aXZlcyBvYmplY3QsIHdpdGggdGhlIGtleSBiZWluZyB0aGUgbmFtZVxuLy8gcHJlY2VkZWQgYnkgXCJ2LVwiLiBBbHNvIGFkZCB0aGUgbmFtZSB0byB0aGUgZ2xvYmFsIHJlc2VydmVkUHJvcHMgb2JqZWN0LlxuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdGl2ZShuYW1lOiBzdHJpbmcsIGRpcmVjdGl2ZTogRGlyZWN0aXZlKSB7XG4gIGxldCBkaXJlY3RpdmVOYW1lID0gYHYtJHtuYW1lfWA7XG4gIGRpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0gPSBkaXJlY3RpdmU7XG4gIHJlc2VydmVkUHJvcHNbZGlyZWN0aXZlTmFtZV0gPSB0cnVlO1xufVxuXG4vLyBTZXQgYW4gYXR0cmlidXRlIG9uIGEgdmlydHVhbCBET00gbm9kZSBhbmQgdXBkYXRlIHRoZSBhY3R1YWwgRE9NIGVsZW1lbnQuXG4vLyBJZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIGF0dHJpYnV0ZVxuLy8gbmFtZSB0byB0aGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgbWFpblZub2RlLlxuLy8gSWYgb2xkVm5vZGUgaXMgcHJvdmlkZWQsIGNvbXBhcmUgdGhlIG5ldyBhdHRyaWJ1dGUgdmFsdWUgdG8gdGhlIG9sZCB2YWx1ZVxuLy8gYW5kIG9ubHkgdXBkYXRlIHRoZSBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LlxuZnVuY3Rpb24gc2hhcmVkU2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgbmV3Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pOiB2b2lkIHwgYm9vbGVhbiB7XG4gIC8vIElmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgYSBmdW5jdGlvbiwgYWRkIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgYXR0cmlidXRlXG4gIC8vIG5hbWUgdG8gdGhlIERPTSBlbGVtZW50IHJlcHJlc2VudGVkIGJ5IG1haW5Wbm9kZS5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgLy8gT25seSBhZGQgdGhlIGV2ZW50IGxpc3RlbmVyIGlmIGl0IGhhc24ndCBiZWVuIGFkZGVkIHlldC5cbiAgICBpZiAobmFtZSBpbiBldmVudExpc3RlbmVyTmFtZXMgPT09IGZhbHNlKSB7XG4gICAgICAobWFpblZub2RlIGFzIFZub2RlV2l0aERvbSkuZG9tLmFkZEV2ZW50TGlzdGVuZXIobmFtZS5zbGljZSgyKSwgZXZlbnRMaXN0ZW5lcik7XG4gICAgICBldmVudExpc3RlbmVyTmFtZXNbbmFtZV0gPSB0cnVlO1xuICAgIH1cbiAgICBuZXdWbm9kZS5kb21bYHYtJHtuYW1lfWBdID0gdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50IG9uIHRoZSBET00gZWxlbWVudCBhbmQgbmV3Vm5vZGUgaXMgbm90IGFuIFNWRyxcbiAgLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLlxuICBpZiAobmFtZSBpbiBuZXdWbm9kZS5kb20gJiYgbmV3Vm5vZGUuaXNTVkcgPT09IGZhbHNlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgIGlmIChuZXdWbm9kZS5kb21bbmFtZV0gIT0gdmFsdWUpIHtcbiAgICAgIG5ld1Zub2RlLmRvbVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiBvbGRWbm9kZSBpcyBub3QgcHJvdmlkZWQgb3IgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZCwgdXBkYXRlIHRoZVxuICAvLyBhdHRyaWJ1dGUgb24gdGhlIERPTSBlbGVtZW50LlxuICBpZiAoIW9sZFZub2RlIHx8IHZhbHVlICE9PSBvbGRWbm9kZS5wcm9wc1tuYW1lXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIG5ld1Zub2RlLmRvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1Zub2RlLmRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBTZXQgYW4gYXR0cmlidXRlIG9uIGEgdmlydHVhbCBET00gbm9kZSBhbmQgdXBkYXRlIHRoZSBhY3R1YWwgRE9NIGVsZW1lbnQuXG4vLyBTa2lwIHRoZSBhdHRyaWJ1dGUgaWYgaXQgaXMgaW4gdGhlIHJlc2VydmVkUHJvcHMgb2JqZWN0LlxuZXhwb3J0IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIGlmIChuYW1lIGluIHJlc2VydmVkUHJvcHMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbmV3Vm5vZGUucHJvcHNbbmFtZV0gPSB2YWx1ZTtcbiAgc2hhcmVkU2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlLCBuZXdWbm9kZSBhcyBWbm9kZVdpdGhEb20sIG9sZFZub2RlKTtcbn1cblxuLy8gVXBkYXRlIHRoZSBhdHRyaWJ1dGVzIG9uIGEgdmlydHVhbCBET00gbm9kZS4gSWYgb2xkVm5vZGUgaXMgcHJvdmlkZWQsIHJlbW92ZVxuLy8gYXR0cmlidXRlcyBmcm9tIHRoZSBET00gZWxlbWVudCB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiBuZXdWbm9kZS5wcm9wcyBidXQgYXJlXG4vLyBwcmVzZW50IGluIG9sZFZub2RlLnByb3BzLiBUaGVuLCBpdGVyYXRlIG92ZXIgdGhlIGF0dHJpYnV0ZXMgaW4gbmV3Vm5vZGUucHJvcHNcbi8vIGFuZCB1cGRhdGUgdGhlIERPTSBlbGVtZW50IHdpdGggdGhlIGF0dHJpYnV0ZXMgdXNpbmcgdGhlIHNoYXJlZFNldEF0dHJpYnV0ZVxuLy8gZnVuY3Rpb24uIElmIGFuIGF0dHJpYnV0ZSBpcyBpbiB0aGUgcmVzZXJ2ZWRQcm9wcyBvYmplY3QgYW5kIGhhcyBhIGNvcnJlc3BvbmRpbmdcbi8vIGRpcmVjdGl2ZSBpbiB0aGUgZGlyZWN0aXZlcyBvYmplY3QsIGNhbGwgdGhlIGRpcmVjdGl2ZSB3aXRoIHRoZSBhdHRyaWJ1dGUgdmFsdWVcbi8vIGFuZCB0aGUgdHdvIHZpcnR1YWwgRE9NIG5vZGVzIGFzIGFyZ3VtZW50cy4gSWYgdGhlIGRpcmVjdGl2ZSByZXR1cm5zIGZhbHNlLCBleGl0XG4vLyB0aGUgbG9vcC5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGVzKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIC8vIElmIG9sZFZub2RlIGlzIHByb3ZpZGVkLCByZW1vdmUgYXR0cmlidXRlcyBmcm9tIHRoZSBET00gZWxlbWVudCB0aGF0IGFyZSBub3RcbiAgLy8gcHJlc2VudCBpbiBuZXdWbm9kZS5wcm9wcyBidXQgYXJlIHByZXNlbnQgaW4gb2xkVm5vZGUucHJvcHMuXG4gIGlmIChvbGRWbm9kZSkge1xuICAgIGZvciAobGV0IG5hbWUgaW4gb2xkVm5vZGUucHJvcHMpIHtcbiAgICAgIGlmIChuYW1lIGluIG5ld1Zub2RlLnByb3BzID09PSBmYWxzZSAmJiBuYW1lIGluIGV2ZW50TGlzdGVuZXJOYW1lcyA9PT0gZmFsc2UgJiYgbmFtZSBpbiByZXNlcnZlZFByb3BzID09PSBmYWxzZSkge1xuICAgICAgICBpZiAobmFtZSBpbiBuZXdWbm9kZS5kb20gJiYgbmV3Vm5vZGUuaXNTVkcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgbmV3Vm5vZGUuZG9tW25hbWVdID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWbm9kZS5kb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBhdHRyaWJ1dGVzIGluIG5ld1Zub2RlLnByb3BzIGFuZCB1cGRhdGUgdGhlIERPTSBlbGVtZW50IHdpdGhcbiAgLy8gdGhlIGF0dHJpYnV0ZXMgdXNpbmcgdGhlIHNoYXJlZFNldEF0dHJpYnV0ZSBmdW5jdGlvbi5cbiAgZm9yIChsZXQgbmFtZSBpbiBuZXdWbm9kZS5wcm9wcykge1xuICAgIGlmIChuYW1lIGluIHJlc2VydmVkUHJvcHMpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIGEgZGlyZWN0aXZlIGZvciB0aGUgYXR0cmlidXRlLCBjYWxsIGl0IHdpdGggdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICAgICAgLy8gYW5kIHRoZSB0d28gdmlydHVhbCBET00gbm9kZXMgYXMgYXJndW1lbnRzLiBJZiB0aGUgZGlyZWN0aXZlIHJldHVybnMgZmFsc2UsXG4gICAgICAvLyBleGl0IHRoZSBsb29wLlxuICAgICAgaWYgKG5hbWUgaW4gZGlyZWN0aXZlcyAmJiBkaXJlY3RpdmVzW25hbWVdKG5ld1Zub2RlLnByb3BzW25hbWVdLCBuZXdWbm9kZSwgb2xkVm5vZGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBzaGFyZWRTZXRBdHRyaWJ1dGUobmFtZSwgbmV3Vm5vZGUucHJvcHNbbmFtZV0sIG5ld1Zub2RlLCBvbGRWbm9kZSk7XG4gIH1cbn1cblxuLyogcGF0Y2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBQYXRjaCBhIERPTSBub2RlIHdpdGggYSBuZXcgVk5vZGUgdHJlZVxuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIC8vIElmIHRoZSBuZXcgdHJlZSBoYXMgbm8gY2hpbGRyZW4sIHNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgRE9NIGVsZW1lbnQgdG8gYW4gZW1wdHkgc3RyaW5nXG4gIGlmIChuZXdWbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICBuZXdWbm9kZS5kb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5ldyBhbmQgb2xkIHZpcnR1YWwgRE9NIG5vZGVzXG4gIGxldCBuZXdUcmVlID0gbmV3Vm5vZGUuY2hpbGRyZW47XG4gIGxldCBvbGRUcmVlID0gb2xkVm5vZGU/LmNoaWxkcmVuIHx8IFtdO1xuICAvLyBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgb2xkIHRyZWVcbiAgbGV0IG9sZFRyZWVMZW5ndGggPSBvbGRUcmVlLmxlbmd0aDtcblxuICAvLyBJZiB0aGUgb2xkIHRyZWUgaGFzIGNoaWxkcmVuIGFuZCB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIG5ldyB0cmVlIGlzIGEgVk5vZGUgd2l0aCBhIFwia2V5XCJcbiAgLy8gYXR0cmlidXRlIGFuZCB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIG9sZCB0cmVlIGlzIGEgVk5vZGUgd2l0aCBhIFwia2V5XCIgYXR0cmlidXRlLCB1cGRhdGVcbiAgLy8gdGhlIERPTSBlbGVtZW50IGluIHBsYWNlIGJ5IGNvbXBhcmluZyB0aGUga2V5cyBvZiB0aGUgbm9kZXMgaW4gdGhlIHRyZWVzLlxuICBpZiAob2xkVHJlZUxlbmd0aCAmJiBuZXdUcmVlWzBdIGluc3RhbmNlb2YgVm5vZGUgJiYgXCJrZXlcIiBpbiBuZXdUcmVlWzBdLnByb3BzICYmIFwia2V5XCIgaW4gb2xkVHJlZVswXS5wcm9wcykge1xuICAgIC8vIEdldCB0aGUgbGVuZ3RocyBvZiB0aGUgbmV3IGFuZCBvbGQgdHJlZXNcbiAgICBsZXQgbmV3VHJlZUxlbmd0aCA9IG5ld1RyZWUubGVuZ3RoO1xuXG4gICAgLy8gQ3JlYXRlIGFuIG9iamVjdCB0aGF0IG1hcHMga2V5cyB0byBpbmRpY2VzIGluIHRoZSBvbGQgdHJlZVxuICAgIGxldCBvbGRLZXllZExpc3Q6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZFRyZWVMZW5ndGg7IGkrKykge1xuICAgICAgb2xkS2V5ZWRMaXN0W29sZFRyZWVbaV0ucHJvcHMua2V5XSA9IGk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFuIG9iamVjdCB0aGF0IG1hcHMga2V5cyB0byBpbmRpY2VzIGluIHRoZSBuZXcgdHJlZVxuICAgIGxldCBuZXdLZXllZExpc3Q6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWVMZW5ndGg7IGkrKykge1xuICAgICAgbmV3S2V5ZWRMaXN0W25ld1RyZWVbaV0ucHJvcHMua2V5XSA9IGk7XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBuZXcgdHJlZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZUxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbmV3IGNoaWxkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBvbGQgY2hpbGRcbiAgICAgIGxldCBuZXdDaGlsZCA9IG5ld1RyZWVbaV07XG4gICAgICBsZXQgb2xkQ2hpbGQgPSBvbGRUcmVlW29sZEtleWVkTGlzdFtuZXdDaGlsZC5wcm9wcy5rZXldXTtcbiAgICAgIC8vIEluaXRpYWxpemUgYSBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHBhdGNoIHRoZSBjaGlsZFxuICAgICAgbGV0IHNob3VsZFBhdGNoID0gdHJ1ZTtcblxuICAgICAgLy8gSWYgdGhlIG9sZCBjaGlsZCBleGlzdHMsIHVwZGF0ZSB0aGUgRE9NIGVsZW1lbnQgb2YgdGhlIG5ldyBjaGlsZCB0byBtYXRjaCB0aGUgb2xkIGNoaWxkJ3MgRE9NIGVsZW1lbnRcbiAgICAgIGlmIChvbGRDaGlsZCkge1xuICAgICAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZC5kb207XG4gICAgICAgIC8vIElmIHRoZSBuZXcgYW5kIG9sZCBjaGlsZHJlbiBoYXZlIHRoZSBzYW1lIFwidi1rZWVwXCIgYXR0cmlidXRlIHZhbHVlLCB1cGRhdGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBuZXcgY2hpbGQgdG8gbWF0Y2ggdGhlIG9sZCBjaGlsZCdzIGNoaWxkcmVuXG4gICAgICAgIGlmIChcInYta2VlcFwiIGluIG5ld0NoaWxkLnByb3BzICYmIG5ld0NoaWxkLnByb3BzW1widi1rZWVwXCJdID09PSBvbGRDaGlsZC5wcm9wc1tcInYta2VlcFwiXSkge1xuICAgICAgICAgIG5ld0NoaWxkLmNoaWxkcmVuID0gb2xkQ2hpbGQuY2hpbGRyZW47XG4gICAgICAgICAgLy8gU2V0IHRoZSBzaG91bGRQYXRjaCBmbGFnIHRvIGZhbHNlXG4gICAgICAgICAgc2hvdWxkUGF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkLCBvbGRDaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgb2xkIGNoaWxkIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgYSBuZXcgRE9NIGVsZW1lbnQgZm9yIHRoZSBuZXcgY2hpbGQgYW5kIHVwZGF0ZSBpdHMgYXR0cmlidXRlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3Q2hpbGQuZG9tID0gY3JlYXRlRG9tRWxlbWVudChuZXdDaGlsZC50YWcsIG5ld0NoaWxkLmlzU1ZHKTtcbiAgICAgICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBuZXcgY2hpbGQncyBET00gZWxlbWVudCBpcyBub3QgdGhlIGktdGggY2hpbGQgb2YgdGhlIHBhcmVudCBET00gZWxlbWVudCwgaW5zZXJ0IGl0XG4gICAgICBpZiAoIW5ld1Zub2RlLmRvbS5jaGlsZE5vZGVzW2ldKSB7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5hcHBlbmRDaGlsZChuZXdDaGlsZC5kb20pO1xuXG4gICAgICAgIC8vIElmIHRoZSBuZXcgY2hpbGQncyBET00gZWxlbWVudCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGktdGggY2hpbGQgb2YgdGhlIHBhcmVudCBET00gZWxlbWVudCwgcmVwbGFjZSB0aGUgaS10aCBjaGlsZCB3aXRoIHRoZSBuZXcgY2hpbGQncyBET00gZWxlbWVudFxuICAgICAgfSBlbHNlIGlmIChuZXdWbm9kZS5kb20uY2hpbGROb2Rlc1tpXSAhPT0gbmV3Q2hpbGQuZG9tKSB7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuZG9tLCBuZXdWbm9kZS5kb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBzaG91bGRQYXRjaCBmbGFnIGlzIHRydWUsIHJlY3Vyc2l2ZWx5IGNhbGwgdGhlIHBhdGNoIGZ1bmN0aW9uIG9uIHRoZSBuZXcgY2hpbGQsIHBhc3NpbmcgaW4gdGhlIG9sZCBjaGlsZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG4gICAgICBzaG91bGRQYXRjaCAmJiBwYXRjaChuZXdDaGlsZCwgb2xkQ2hpbGQpO1xuICAgIH1cblxuICAgIC8vIEZvciB0aGUgcmVzdCBvZiB0aGUgY2hpbGRyZW4sIHdlIHNob3VsZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBET01cbiAgICBmb3IgKGxldCBpID0gbmV3VHJlZUxlbmd0aDsgaSA8IG9sZFRyZWVMZW5ndGg7IGkrKykge1xuICAgICAgLy8gSWYgdGhlIGktdGggY2hpbGQgb2YgdGhlIG9sZCB0cmVlIGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIGtleSBpbiB0aGUgbmV3IHRyZWUsIHJlbW92ZSBpdHMgRE9NIGVsZW1lbnQgZnJvbSB0aGUgcGFyZW50IERPTSBlbGVtZW50XG4gICAgICBpZiAoIW5ld0tleWVkTGlzdFtvbGRUcmVlW2ldLnByb3BzLmtleV0pIHtcbiAgICAgICAgb2xkVHJlZVtpXS5kb20ucGFyZW50Tm9kZSAmJiBvbGRUcmVlW2ldLmRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9sZFRyZWVbaV0uZG9tKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgdGhlIG5ldyB0cmVlIGhhcyBubyBjaGlsZHJlbiwgc2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHBhcmVudCBET00gZWxlbWVudCB0byBhbiBlbXB0eSBzdHJpbmdcbiAgaWYgKG5ld1RyZWUubGVuZ3RoID09PSAwKSB7XG4gICAgbmV3Vm5vZGUuZG9tLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBTZXQgdGhlIGdsb2JhbCBjdXJyZW50IG9iamVjdCB0byB0aGUgbmV3IGFuZCBvbGQgdmlydHVhbCBET00gbm9kZXNcbiAgY3VycmVudC52bm9kZSA9IG5ld1Zub2RlO1xuICBjdXJyZW50Lm9sZFZub2RlID0gb2xkVm5vZGU7XG5cbiAgLy8gRmxhdHRlbiB0aGUgbmV3IHRyZWVcbiAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhhdCBpcyBuZWNlc3NhcnkgdG8gZmxhdHRlbiB0aGUgdHJlZSBiZWZvcmUgdGhlIHBhdGNoIHByb2Nlc3NcbiAgLy8gdG8gbGV0IHRoZSBob29rcyBhbmQgc2lnbmFscyB3b3JrIHByb3Blcmx5XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZS5sZW5ndGg7IGkrKykge1xuICAgIGxldCBuZXdDaGlsZCA9IG5ld1RyZWVbaV07XG5cbiAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIGlzIGEgVm5vZGUgYW5kIGlzIG5vdCBhIHRleHQgbm9kZVxuICAgIGlmIChuZXdDaGlsZCBpbnN0YW5jZW9mIFZub2RlKSB7XG4gICAgICAvLyBJZiB0aGUgdGFnIG9mIHRoZSBuZXcgY2hpbGQgaXMgbm90IGEgc3RyaW5nLCBpdCBpcyBhIGNvbXBvbmVudFxuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZC50YWcgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gU2V0IHRoZSBjdXJyZW50IGNvbXBvbmVudCB0byB0aGUgdGFnIG9mIHRoZSBuZXcgY2hpbGRcbiAgICAgICAgY3VycmVudC5jb21wb25lbnQgPSBuZXdDaGlsZC50YWc7XG4gICAgICAgIC8vIFJlcGxhY2UgdGhlIG5ldyBjaGlsZCB3aXRoIHRoZSByZXN1bHQgb2YgY2FsbGluZyBpdHMgdmlldyBvciBiaW5kIG1ldGhvZCwgcGFzc2luZyBpbiB0aGUgcHJvcHMgYW5kIGNoaWxkcmVuIGFzIGFyZ3VtZW50c1xuICAgICAgICBuZXdUcmVlLnNwbGljZShcbiAgICAgICAgICBpLS0sXG4gICAgICAgICAgMSxcbiAgICAgICAgICAoXCJ2aWV3XCIgaW4gbmV3Q2hpbGQudGFnID8gbmV3Q2hpbGQudGFnLnZpZXcuYmluZChuZXdDaGlsZC50YWcpIDogbmV3Q2hpbGQudGFnLmJpbmQobmV3Q2hpbGQudGFnKSkoXG4gICAgICAgICAgICBuZXdDaGlsZC5wcm9wcyxcbiAgICAgICAgICAgIC4uLm5ld0NoaWxkLmNoaWxkcmVuXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIGlzIGFuIGFycmF5LCBmbGF0dGVuIGl0IGFuZCBjb250aW51ZSB0aGUgbG9vcFxuICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgbmV3VHJlZS5zcGxpY2UoaS0tLCAxLCAuLi5uZXdDaGlsZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIGlzIG51bGwgb3IgdW5kZWZpbmVkLCByZW1vdmUgaXQgZnJvbSB0aGUgbmV3IHRyZWUgYW5kIGNvbnRpbnVlIHRoZSBsb29wXG4gICAgaWYgKG5ld0NoaWxkID09PSBudWxsIHx8IG5ld0NoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ld1RyZWUuc3BsaWNlKGktLSwgMSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIGlzIGEgVm5vZGUsIHNldCB0aGUgdGV4dCBvZiB0aGUgVm5vZGUgdG8gdGhlIHRleHQgY29udGVudCBvZiBpdHMgZG9tIHByb3BlcnR5XG4gICAgbmV3VHJlZVtpXSA9IG5ldyBWbm9kZSh0ZXh0VGFnLCB7fSwgW25ld0NoaWxkXSk7XG4gIH1cblxuICAvLyBQYXRjaCB0aGUgdGhlIG9sZCB0cmVlXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZS5sZW5ndGg7IGkrKykge1xuICAgIGxldCBuZXdDaGlsZCA9IG5ld1RyZWVbaV07XG5cbiAgICBpZiAobmV3Q2hpbGQudGFnID09PSB0ZXh0VGFnKSB7XG4gICAgICAvLyBJZiBubyBvbGQgY2hpbGQgZXhpc3RzIGF0IHRoZSBzYW1lIGluZGV4XG4gICAgICBpZiAoaSA+PSBvbGRUcmVlTGVuZ3RoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyB0ZXh0IG5vZGUgZm9yIHRoZSBuZXcgY2hpbGRcbiAgICAgICAgbmV3Q2hpbGQuZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQuY2hpbGRyZW5bMF0pO1xuICAgICAgICAvLyBBcHBlbmQgdGhlIG5ldyB0ZXh0IG5vZGUgdG8gdGhlIGRvbVxuICAgICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQobmV3Q2hpbGQuZG9tKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZXJlIGlzIGFuIG9sZCBjaGlsZCBhdCB0aGUgc2FtZSBpbmRleFxuICAgICAgbGV0IG9sZENoaWxkID0gb2xkVHJlZVtpXTtcblxuICAgICAgLy8gSWYgdGhlIG9sZCBjaGlsZCBpcyBub3QgYSB0ZXh0IG5vZGVcbiAgICAgIGlmIChvbGRDaGlsZC50YWcgIT09IHRleHRUYWcpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHRleHQgbm9kZSBmb3IgdGhlIG5ldyBjaGlsZFxuICAgICAgICBuZXdDaGlsZC5kb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdDaGlsZC5jaGlsZHJlblswXSk7XG4gICAgICAgIC8vIFJlcGxhY2UgdGhlIG9sZCBjaGlsZCBpbiB0aGUgZG9tIHdpdGggdGhlIG5ldyB0ZXh0IG5vZGVcbiAgICAgICAgbmV3Vm5vZGUuZG9tLnJlcGxhY2VDaGlsZChuZXdDaGlsZC5kb20sIG9sZENoaWxkLmRvbSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgb2xkIGNoaWxkIGlzIGEgdGV4dCBub2RlXG4gICAgICAvLyBTZXQgdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgdGV4dCBWbm9kZSB0byB0aGUgZG9tIHByb3BlcnR5IG9mIHRoZSBvbGQgY2hpbGRcbiAgICAgIG5ld0NoaWxkLmRvbSA9IG9sZENoaWxkLmRvbTtcbiAgICAgIC8vIElmIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIG9sZCBjaGlsZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbmV3IGNoaWxkLCB1cGRhdGUgdGhlIHRleHQgY29udGVudCBvZiB0aGUgb2xkIGNoaWxkXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgICBpZiAobmV3Q2hpbGQuY2hpbGRyZW5bMF0gIT0gb2xkQ2hpbGQuZG9tLnRleHRDb250ZW50KSB7XG4gICAgICAgIG9sZENoaWxkLmRvbS50ZXh0Q29udGVudCA9IG5ld0NoaWxkLmNoaWxkcmVuWzBdO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyBub3QgYSB0ZXh0IG5vZGVcbiAgICAvLyBTZXQgdGhlIGlzU1ZHIGZsYWcgZm9yIHRoZSBuZXcgY2hpbGQgaWYgaXQgaXMgYW4gU1ZHIGVsZW1lbnQgb3IgaWYgdGhlIHBhcmVudCBpcyBhbiBTVkcgZWxlbWVudFxuICAgIG5ld0NoaWxkLmlzU1ZHID0gbmV3Vm5vZGUuaXNTVkcgfHwgbmV3Q2hpbGQudGFnID09PSBcInN2Z1wiO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gb2xkIGNoaWxkIGF0IHRoZSBzYW1lIGluZGV4XG4gICAgaWYgKGkgPj0gb2xkVHJlZUxlbmd0aCkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRvbSBlbGVtZW50IGZvciB0aGUgbmV3IGNoaWxkXG4gICAgICBuZXdDaGlsZC5kb20gPSBjcmVhdGVEb21FbGVtZW50KG5ld0NoaWxkLnRhZyBhcyBzdHJpbmcsIG5ld0NoaWxkLmlzU1ZHKTtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmV3IGNoaWxkXG4gICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICAvLyBBcHBlbmQgdGhlIG5ldyBjaGlsZCB0byB0aGUgZG9tXG4gICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQobmV3Q2hpbGQuZG9tKTtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBhdGNoIHRoZSBuZXcgY2hpbGRcbiAgICAgIHBhdGNoKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBvbGQgY2hpbGQgYXQgdGhlIHNhbWUgaW5kZXhcbiAgICBsZXQgb2xkQ2hpbGQgPSBvbGRUcmVlW2ldO1xuXG4gICAgLy8gSWYgdGhlIHRhZyBvZiB0aGUgbmV3IGNoaWxkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB0YWcgb2YgdGhlIG9sZCBjaGlsZFxuICAgIGlmIChuZXdDaGlsZC50YWcgIT09IG9sZENoaWxkLnRhZykge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRvbSBlbGVtZW50IGZvciB0aGUgbmV3IGNoaWxkXG4gICAgICBuZXdDaGlsZC5kb20gPSBjcmVhdGVEb21FbGVtZW50KG5ld0NoaWxkLnRhZyBhcyBzdHJpbmcsIG5ld0NoaWxkLmlzU1ZHKTtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmV3IGNoaWxkXG4gICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICAvLyBSZXBsYWNlIHRoZSBvbGQgY2hpbGQgaW4gdGhlIGRvbSB3aXRoIHRoZSBuZXcgY2hpbGRcbiAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuZG9tLCBvbGRDaGlsZC5kb20pO1xuICAgICAgLy8gUmVjdXJzaXZlbHkgcGF0Y2ggdGhlIG5ldyBjaGlsZFxuICAgICAgcGF0Y2gobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB0YWcgb2YgdGhlIG5ldyBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgdGFnIG9mIHRoZSBvbGQgY2hpbGRcbiAgICAvLyBTZXQgdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgbmV3IGNoaWxkIHRvIHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIG9sZCBjaGlsZFxuICAgIG5ld0NoaWxkLmRvbSA9IG9sZENoaWxkLmRvbTtcbiAgICAvLyBJZiB0aGUgdi1rZWVwIHByb3AgaXMgdGhlIHNhbWUgZm9yIGJvdGggdGhlIG5ldyBhbmQgb2xkIGNoaWxkLCBzZXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBuZXcgY2hpbGQgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBvbGQgY2hpbGRcbiAgICBpZiAoXCJ2LWtlZXBcIiBpbiBuZXdDaGlsZC5wcm9wcyAmJiBuZXdDaGlsZC5wcm9wc1tcInYta2VlcFwiXSA9PT0gb2xkQ2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgIG5ld0NoaWxkLmNoaWxkcmVuID0gb2xkQ2hpbGQuY2hpbGRyZW47XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5ldyBjaGlsZCBiYXNlZCBvbiB0aGUgb2xkIGNoaWxkXG4gICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20sIG9sZENoaWxkKTtcbiAgICAvLyBSZWN1cnNpdmVseSBwYXRjaCB0aGUgbmV3IGFuZCBvbGQgY2hpbGRyZW5cbiAgICBwYXRjaChuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20sIG9sZENoaWxkKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBhbnkgb2xkIGNoaWxkcmVuIHRoYXQgYXJlIG5vIGxvbmdlciBwcmVzZW50IGluIHRoZSBuZXcgdHJlZVxuICBmb3IgKGxldCBpID0gbmV3VHJlZS5sZW5ndGg7IGkgPCBvbGRUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICBuZXdWbm9kZS5kb20ucmVtb3ZlQ2hpbGQob2xkVHJlZVtpXS5kb20pO1xuICB9XG59XG5cbi8vIFVwZGF0ZSB0aGUgbWFpbiBWbm9kZVxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZSgpOiB2b2lkIHwgc3RyaW5nIHtcbiAgLy8gSWYgdGhlIG1haW4gVm5vZGUgZXhpc3RzXG4gIGlmIChtYWluVm5vZGUpIHtcbiAgICAvLyBDYWxsIGFueSBjbGVhbnVwIGZ1bmN0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIG9uQ2xlYW51cFNldCBzZXRcbiAgICBjYWxsU2V0KG9uQ2xlYW51cFNldCk7XG4gICAgLy8gU3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIG9sZCBtYWluIFZub2RlXG4gICAgbGV0IG9sZE1haW5Wbm9kZSA9IG1haW5Wbm9kZTtcbiAgICAvLyBDcmVhdGUgYSBuZXcgbWFpbiBWbm9kZSB3aXRoIHRoZSBtYWluIGNvbXBvbmVudCBhcyBpdHMgb25seSBjaGlsZFxuICAgIG1haW5Wbm9kZSA9IG5ldyBWbm9kZShvbGRNYWluVm5vZGUudGFnLCBvbGRNYWluVm5vZGUucHJvcHMsIFttYWluQ29tcG9uZW50XSkgYXMgVm5vZGVXaXRoRG9tO1xuICAgIG1haW5Wbm9kZS5kb20gPSBvbGRNYWluVm5vZGUuZG9tO1xuICAgIG1haW5Wbm9kZS5pc1NWRyA9IG9sZE1haW5Wbm9kZS5pc1NWRztcblxuICAgIC8vIFJlY3Vyc2l2ZWx5IHBhdGNoIHRoZSBuZXcgYW5kIG9sZCBtYWluIFZub2Rlc1xuICAgIHBhdGNoKG1haW5Wbm9kZSwgb2xkTWFpblZub2RlKTtcblxuICAgIC8vIENhbGwgYW55IHVwZGF0ZSBvciBtb3VudCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBvblVwZGF0ZVNldCBvciBvbk1vdW50U2V0IHNldFxuICAgIGNhbGxTZXQoaXNNb3VudGVkID8gb25VcGRhdGVTZXQgOiBvbk1vdW50U2V0KTtcblxuICAgIC8vIFNldCB0aGUgaXNNb3VudGVkIGZsYWcgdG8gdHJ1ZVxuICAgIGlzTW91bnRlZCA9IHRydWU7XG5cbiAgICAvLyBSZXNldCB0aGUgY3VycmVudCB2bm9kZSwgb2xkVm5vZGUsIGFuZCBjb21wb25lbnQgcHJvcGVydGllc1xuICAgIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQub2xkVm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcblxuICAgIC8vIElmIHRoZSBjb2RlIGlzIHJ1bm5pbmcgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LCByZXR1cm4gdGhlIGlubmVyIEhUTUwgb2YgdGhlIG1haW4gVm5vZGUncyBkb20gZWxlbWVudFxuICAgIGlmIChpc05vZGVKcykge1xuICAgICAgcmV0dXJuIG1haW5Wbm9kZS5kb20uaW5uZXJIVE1MO1xuICAgIH1cbiAgfVxufVxuXG4vLyBVcGRhdGUgY3VzdG9tIFZub2RlXG4vLyBJdCBpcyBhc3N1bWVkIHRoYXQgYSBmaXJzdCBtb3VudCBoYXMgYWxyZWFkeSBvY2N1cnJlZCwgc28sXG4vLyB0aGUgb2xkVm5vZGUgaXMgbm90IG51bGwgYW5kIHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIG9sZFZub2RlIGlzIG5vdCBudWxsXG4vLyBZb3UgbmVlZCB0byBzZXQgdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgbmV3Vm5vZGUgdG8gdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgb2xkVm5vZGVcbi8vIFRoZSBzYW1lIHdpdGggdGhlIGlzU1ZHIHByb3BlcnR5XG4vLyBQcmVmZXIgdGhpcyBmdW5jdGlvbiBvdmVyIHBhdGNoIHRvIGFsbG93IGZvciBjbGVhbnVwLCBvblVwZGF0ZSBhbmQgb25Nb3VudCBzZXRzIHRvIGJlIGNhbGxlZFxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZub2RlKHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlOiBWbm9kZVdpdGhEb20pOiBzdHJpbmcgfCB2b2lkIHtcbiAgLy8gQ2FsbCBhbnkgY2xlYW51cCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBvbkNsZWFudXBTZXQgc2V0XG4gIGNhbGxTZXQob25DbGVhbnVwU2V0KTtcblxuICAvLyBSZWN1cnNpdmVseSBwYXRjaCB0aGUgbmV3IGFuZCBvbGQgbWFpbiBWbm9kZXNcbiAgcGF0Y2godm5vZGUsIG9sZFZub2RlKTtcblxuICAvLyBTZXQgdGhlIG9sZFZub2RlJ3MgdGFnLCBwcm9wcywgY2hpbGRyZW4sIGRvbSwgYW5kIGlzU1ZHIHByb3BlcnRpZXMgdG8gdGhlIG5ld1Zub2RlJ3MgdGFnLCBwcm9wcywgY2hpbGRyZW4sIGRvbSwgYW5kIGlzU1ZHIHByb3BlcnRpZXNcbiAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgZm9yIHRoZSBvbGRWbm9kZSB0byBiZSB1c2VkIGFzIHRoZSBuZXdWbm9kZSBpbiB0aGUgbmV4dCB1cGRhdGUgd2l0aCB0aGUgbm9ybWFsIHVwZGF0ZSBmdW5jdGlvblxuICBvbGRWbm9kZS50YWcgPSB2bm9kZS50YWc7XG4gIG9sZFZub2RlLnByb3BzID0geyAuLi52bm9kZS5wcm9wcyB9O1xuICBvbGRWbm9kZS5jaGlsZHJlbiA9IFsuLi52bm9kZS5jaGlsZHJlbl07XG4gIG9sZFZub2RlLmRvbSA9IHZub2RlLmRvbTtcbiAgb2xkVm5vZGUuaXNTVkcgPSB2bm9kZS5pc1NWRztcblxuICAvLyBDYWxsIGFueSB1cGRhdGUgb3IgbW91bnQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgb25VcGRhdGVTZXQgb3Igb25Nb3VudFNldCBzZXRcbiAgY2FsbFNldChpc01vdW50ZWQgPyBvblVwZGF0ZVNldCA6IG9uTW91bnRTZXQpO1xuXG4gIC8vIFNldCB0aGUgaXNNb3VudGVkIGZsYWcgdG8gdHJ1ZVxuICBpc01vdW50ZWQgPSB0cnVlO1xuXG4gIC8vIFJlc2V0IHRoZSBjdXJyZW50IHZub2RlLCBvbGRWbm9kZSwgYW5kIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICBjdXJyZW50Lm9sZFZub2RlID0gbnVsbDtcbiAgY3VycmVudC5jb21wb25lbnQgPSBudWxsO1xuXG4gIGlmIChpc05vZGVKcykge1xuICAgIHJldHVybiB2bm9kZS5kb20uaW5uZXJIVE1MO1xuICB9XG59XG5cbi8vIFVubW91bnQgdGhlIG1haW4gVm5vZGVcbmV4cG9ydCBmdW5jdGlvbiB1bm1vdW50KCkge1xuICAvLyBJZiB0aGUgbWFpbiBWbm9kZSBleGlzdHNcbiAgaWYgKG1haW5Wbm9kZSkge1xuICAgIC8vIFNldCB0aGUgbWFpbiBjb21wb25lbnQgdG8gYSBudWxsIFZub2RlXG4gICAgbWFpbkNvbXBvbmVudCA9IG5ldyBWbm9kZSgoKSA9PiBudWxsLCB7fSwgW10pIGFzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIC8vIFVwZGF0ZSB0aGUgbWFpbiBWbm9kZVxuICAgIGxldCByZXN1bHQgPSB1cGRhdGUoKTtcbiAgICAvLyBDYWxsIGFueSB1bm1vdW50IGZ1bmN0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIG9uVW5tb3VudFNldCBzZXRcbiAgICBjYWxsU2V0KG9uVW5tb3VudFNldCk7XG5cbiAgICAvLyBSZW1vdmUgYW55IGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIG1haW4gVm5vZGUncyBkb20gZWxlbWVudFxuICAgIGZvciAobGV0IG5hbWUgaW4gZXZlbnRMaXN0ZW5lck5hbWVzKSB7XG4gICAgICBtYWluVm5vZGUuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCBldmVudExpc3RlbmVyKTtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoZXZlbnRMaXN0ZW5lck5hbWVzLCBuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCB0aGUgbWFpbiBjb21wb25lbnQgYW5kIG1haW4gVm5vZGVcbiAgICBtYWluQ29tcG9uZW50ID0gbnVsbDtcbiAgICBtYWluVm5vZGUgPSBudWxsO1xuICAgIC8vIFNldCB0aGUgaXNNb3VudGVkIGZsYWcgdG8gZmFsc2VcbiAgICBpc01vdW50ZWQgPSBmYWxzZTtcbiAgICAvLyBSZXNldCB0aGUgY3VycmVudCB2bm9kZSwgb2xkVm5vZGUsIGFuZCBjb21wb25lbnQgcHJvcGVydGllc1xuICAgIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQub2xkVm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBvZiB1cGRhdGluZyB0aGUgbWFpbiBWbm9kZVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gYSBET00gZWxlbWVudCBvciBhIERPTSBlbGVtZW50IHNlbGVjdG9yIGFuZCBhIGNvbXBvbmVudCB0byBiZSBtb3VudGVkIG9uIGl0LlxuZXhwb3J0IGZ1bmN0aW9uIG1vdW50KGRvbSwgY29tcG9uZW50KSB7XG4gIC8vIENoZWNrIGlmIHRoZSAnZG9tJyBhcmd1bWVudCBpcyBhIHN0cmluZy4gSWYgaXQgaXMsIHNlbGVjdCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgJ2RvbScgYXJndW1lbnQgYXMgdGhlIGNvbnRhaW5lci5cbiAgbGV0IGNvbnRhaW5lciA9XG4gICAgdHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBpc05vZGVKc1xuICAgICAgICA/IGNyZWF0ZURvbUVsZW1lbnQoZG9tLCBkb20gPT09IFwic3ZnXCIpXG4gICAgICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChkb20pWzBdXG4gICAgICA6IGRvbTtcblxuICAvLyBDaGVjayBpZiB0aGUgJ2NvbXBvbmVudCcgYXJndW1lbnQgaXMgYSBWbm9kZSBjb21wb25lbnQgb3IgYSByZWd1bGFyIGNvbXBvbmVudC5cbiAgLy8gSWYgaXQncyBhIHJlZ3VsYXIgY29tcG9uZW50LCBjcmVhdGUgYSBuZXcgVm5vZGUgY29tcG9uZW50IHVzaW5nIHRoZSAnY29tcG9uZW50JyBhcmd1bWVudCBhcyB0aGUgdGFnLlxuICAvLyBJZiBpdCdzIG5vdCBhIGNvbXBvbmVudCBhdCBhbGwsIGNyZWF0ZSBhIG5ldyBWbm9kZSBjb21wb25lbnQgd2l0aCB0aGUgJ2NvbXBvbmVudCcgYXJndW1lbnQgYXMgdGhlIHJlbmRlcmluZyBmdW5jdGlvbi5cbiAgbGV0IHZub2RlQ29tcG9uZW50ID0gaXNWbm9kZUNvbXBvbmVudChjb21wb25lbnQpXG4gICAgPyBjb21wb25lbnRcbiAgICA6IGlzQ29tcG9uZW50KGNvbXBvbmVudClcbiAgICA/IG5ldyBWbm9kZShjb21wb25lbnQsIHt9LCBbXSlcbiAgICA6IG5ldyBWbm9kZSgoKSA9PiBjb21wb25lbnQsIHt9LCBbXSk7XG5cbiAgLy8gSWYgYSBtYWluIGNvbXBvbmVudCBhbHJlYWR5IGV4aXN0cyBhbmQgaXQncyBub3QgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgJ3Zub2RlQ29tcG9uZW50JywgdW5tb3VudCBpdC5cbiAgaWYgKG1haW5Db21wb25lbnQgJiYgbWFpbkNvbXBvbmVudC50YWcgIT09IHZub2RlQ29tcG9uZW50LnRhZykge1xuICAgIHVubW91bnQoKTtcbiAgfVxuXG4gIC8vIFNldCB0aGUgJ3Zub2RlQ29tcG9uZW50JyBhcyB0aGUgbWFpbiBjb21wb25lbnQuXG4gIG1haW5Db21wb25lbnQgPSB2bm9kZUNvbXBvbmVudCBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgLy8gQ29udmVydCB0aGUgY29udGFpbmVyIGVsZW1lbnQgdG8gYSBWbm9kZS5cbiAgbWFpblZub2RlID0gZG9tVG9Wbm9kZShjb250YWluZXIpO1xuICAvLyBVcGRhdGUgdGhlIERPTSB3aXRoIHRoZSBuZXcgY29tcG9uZW50LlxuICByZXR1cm4gdXBkYXRlKCk7XG59XG5cbi8vIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBWbm9kZSBvYmplY3RzLlxuLy8gSXQgdGFrZXMgaW4gYSB0YWcgb3IgY29tcG9uZW50LCBhbmQgb3B0aW9uYWwgcHJvcHMgYW5kIGNoaWxkcmVuIGFyZ3VtZW50cy5cbmV4cG9ydCBjb25zdCB2OiBWID0gKHRhZ09yQ29tcG9uZW50LCBwcm9wcyA9IHt9LCAuLi5jaGlsZHJlbikgPT4ge1xuICAvLyBSZXR1cm4gYSBuZXcgVm5vZGUgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gIHJldHVybiBuZXcgVm5vZGUodGFnT3JDb21wb25lbnQsIHByb3BzIHx8IHt9LCBjaGlsZHJlbik7XG59O1xuXG4vLyBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY3JlYXRlcyBhIGZyYWdtZW50IFZub2RlLlxuLy8gSXQgdGFrZXMgaW4gYSBwbGFjZWhvbGRlciBhbmQgdGhlIGNoaWxkcmVuIGFyZ3VtZW50cywgcmV0dXJucyBvbmx5IHRoZSBjaGlsZHJlbi5cbnYuZnJhZ21lbnQgPSAoXzogVm5vZGVQcm9wZXJ0aWVzLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pID0+IGNoaWxkcmVuO1xuIl0sIm1hcHBpbmdzIjoiTUFrSUEsSUFBTUEsRUFBVSxRQUlMQyxFQUFXQyxRQUEyQixvQkFBWkMsU0FBMkJBLFFBQVFDLFVBQVlELFFBQVFDLFNBQVNDLE1BSTlGLFNBQVNDLEVBQWlCQyxFQUFhQyxHQUFpQixHQUM3RCxPQUFPQSxFQUFRQyxTQUFTQyxnQkFBZ0IsNkJBQThCSCxHQUFPRSxTQUFTRSxjQUFjSixFQUN0RyxDQU1PLElBQU1LLEVBQVEsU0FBcUNMLEVBQWFNLEVBQXdCQyxHQUU3RkMsS0FBS1IsSUFBTUEsRUFDWFEsS0FBS0YsTUFBUUEsRUFDYkUsS0FBS0QsU0FBV0EsQ0FDbEIsRUFJTyxTQUFTRSxFQUFZQyxHQUMxQixPQUFPQSxJQUFtQyxtQkFBZEEsR0FBa0QsaUJBQWRBLEdBQTBCLFNBQVVBLEVBQ3RHLENBR08sSUFBTUMsRUFBV0MsR0FFZkEsYUFBa0JQLEVBS2RRLEVBQW9CRCxHQUV4QkQsRUFBUUMsSUFBV0gsRUFBWUcsRUFBT1osS0FJeEMsU0FBU2MsRUFBV0MsR0FJekIsR0FBcUIsSUFBakJBLEVBQUlDLFNBQWdCLENBQ3RCLElBQUlDLEVBQVEsSUFBSVosRUFBTVosRUFBUyxDQUFDLEVBQUcsQ0FBQ3NCLEVBQUlHLFlBRXhDLE9BREFELEVBQU1GLElBQU1BLEVBQ0xFLENBQ1QsQ0FFQSxJQUFJVixFQUEyQixHQUUvQixRQUFTWSxFQUFJLEVBQUdDLEVBQUlMLEVBQUlNLFdBQVdDLE9BQVFILEVBQUlDLEVBQUdELElBQUssQ0FDckQsSUFBSUksRUFBV1IsRUFBSU0sV0FBV0YsR0FHSixJQUF0QkksRUFBU1AsVUFBd0MsSUFBdEJPLEVBQVNQLFVBQ3RDVCxFQUFTaUIsS0FBS1YsRUFBV1MsR0FFN0IsQ0FFQSxJQUFJakIsRUFBeUIsQ0FBQyxFQUU5QixRQUFTYSxFQUFJLEVBQUdDLEVBQUlMLEVBQUlVLFdBQVdILE9BQVFILEVBQUlDLEVBQUdELElBQUssQ0FDckQsSUFBSU8sRUFBT1gsRUFBSVUsV0FBV04sR0FFMUJiLEVBQU1vQixFQUFLQyxVQUFZRCxFQUFLUixTQUM5QixDQUtBLElBQUlELEVBQVEsSUFBSVosRUFBTVUsRUFBSWEsUUFBUUMsY0FBZXZCLEVBQU9DLEdBRXhELE9BREFVLEVBQU1GLElBQU1BLEVBQ0xFLENBQ1QsQ0FPTyxTQUFTYSxFQUFNQyxHQUNwQixJQUFJQyxFQUFNakMsRUFBaUIsT0FHM0IsT0FGQWlDLEVBQUlDLFVBQVlGLEVBQVdHLE9BRXBCLEdBQUdDLElBQUlDLEtBQUtKLEVBQUlYLFdBQWFnQixHQUFTdkIsRUFBV3VCLEdBQzFELENBUUEsSUFBSUMsRUFBZ0QsS0FDaERDLEVBQWlDLEtBQ2pDQyxHQUFZLEVBR0hDLEVBQW1CLENBQzlCeEIsTUFBTyxLQUNQeUIsU0FBVSxLQUNWaEMsVUFBVyxLQUNYaUMsTUFBTyxNQU1JQyxFQUFzQyxDQUNqREMsS0FBSyxFQUNMQyxPQUFPLEVBQ1AsVUFBVSxFQUdWLFFBQVEsRUFDUixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osWUFBWSxFQUNaLGFBQWEsR0FNVEMsRUFBOEIsSUFBSUMsSUFDbENDLEVBQTRCLElBQUlELElBQ2hDRSxFQUE2QixJQUFJRixJQUNqQ0csRUFBOEIsSUFBSUgsSUFhakMsU0FBU0ksRUFBVUMsR0FDeEJOLEVBQWFPLElBQUlELEVBQ25CLENBU0EsU0FBU0UsRUFBUUMsR0FDZixRQUFTSCxLQUFZRyxFQUNuQkgsSUFHRkcsRUFBSUMsT0FDTixDQUtBLElBQU1DLEVBQTJDLENBQUMsRUFHbEQsU0FBU0MsRUFBY0MsR0FFckJuQixFQUFRRSxNQUFRaUIsRUFHaEIsSUFBSTdDLEVBQU02QyxFQUFFQyxPQUdSQyxFQUFPLE9BQU9GLEVBQUVHLE9BSXBCLEtBQU9oRCxHQUFLLENBQ1YsR0FBSUEsRUFBSStDLEdBUU4sT0FOQS9DLEVBQUkrQyxHQUFNRixFQUFHN0MsUUFHUjZDLEVBQUVJLGtCQUNMQyxLQUlKbEQsRUFBTUEsRUFBSW1ELFVBQ1osQ0FFQXpCLEVBQVFFLE1BQVEsSUFDbEIsQ0FLQSxJQUFJd0IsRUFBaUJDLEdBQWtCLENBQUNDLEVBQWVwRCxFQUF1QnFELEtBSzVFLEdBSFlGLEVBQU9DLEdBQVFBLEVBR2hCLENBQ1QsSUFBSUUsRUFBU3JFLFNBQVNzRSxlQUFlLElBUXJDLE9BUElGLEdBQVdBLEVBQVF2RCxLQUFPdUQsRUFBUXZELElBQUltRCxZQUN4Q0ksRUFBUXZELElBQUltRCxXQUFXTyxhQUFhRixFQUFRRCxFQUFRdkQsS0FFdERFLEVBQU1qQixJQUFNLFFBQ1ppQixFQUFNVixTQUFXLEdBQ2pCVSxFQUFNWCxNQUFRLENBQUMsRUFDZlcsRUFBTUYsSUFBTXdELEdBQ0wsQ0FDVCxHQUlXRyxFQUF5QixDQUVwQyxPQUFRUCxHQUFjLEdBR3RCLFdBQVlBLEdBQWMsR0FHMUIsUUFBUyxDQUFDWCxFQUFnQnZDLEtBQ3hCLElBQUkwRCxFQUFnQyxHQUNoQ3RCLEVBQVdwQyxFQUFNVixTQUFTLEdBQzlCLFFBQVNZLEVBQUksRUFBR0MsRUFBSW9DLEVBQUlsQyxPQUFRSCxFQUFJQyxFQUFHRCxJQUNyQ3dELEVBQVluRCxLQUFLNkIsRUFBU0csRUFBSXJDLEdBQUlBLElBRXBDRixFQUFNVixTQUFXb0UsQ0FBQSxFQUluQixTQUFVLENBQUNOLEVBQWVwRCxLQUV0QkEsRUFBTUYsSUFHTjZELE1BQU1DLFFBQVVSLEVBQU8sR0FBSyxRQUloQyxVQUFXLENBQUNTLEVBQW1DN0QsS0FFN0MsUUFBUzZDLEtBQVFnQixFQUVkN0QsRUFBTUYsSUFBbUJnRSxVQUFVQyxPQUFPbEIsRUFBTWdCLEVBQVFoQixHQUMzRCxFQUlGLFNBQVUsQ0FBQ21CLEVBQWNoRSxLQUV2QkEsRUFBTVYsU0FBVyxDQUFDdUIsRUFBTW1ELEdBQUssRUFJL0IsVUFBVyxFQUFFQyxFQUFPQyxFQUFVeEMsR0FBZTFCLEVBQXFCeUIsS0FDaEUsSUFBSTBDLEVBRUFDLEVBQVd6QixHQUFjc0IsRUFBTUMsR0FBYXZCLEVBQUVDLE9BQTRDdUIsTUFDOUYsR0FBa0IsVUFBZG5FLEVBQU1qQixJQUlSLE9BRkEyQyxFQUFRQSxHQUFTLFVBRVQxQixFQUFNWCxNQUFNeUQsTUFDbEIsSUFBSyxXQUNDdUIsTUFBTUMsUUFBUUwsRUFBTUMsS0FFdEJFLEVBQVd6QixJQUNULElBQUk0QixFQUFPNUIsRUFBRUMsT0FBNEN1QixNQUNyREssRUFBTVAsRUFBTUMsR0FBVU8sUUFBUUYsSUFDdEIsSUFBUkMsRUFDRlAsRUFBTUMsR0FBVTNELEtBQUtnRSxHQUVyQk4sRUFBTUMsR0FBVVEsT0FBT0YsRUFBSyxFQUM5QixFQUdGTCxHQUFxRCxJQUE3Q0YsRUFBTUMsR0FBVU8sUUFBUXpFLEVBQU1GLElBQUlxRSxRQUNqQyxVQUFXbkUsRUFBTVgsT0FFMUIrRSxFQUFVLEtBQ0pILEVBQU1DLEtBQWNsRSxFQUFNWCxNQUFNOEUsTUFDbENGLEVBQU1DLEdBQVksS0FFbEJELEVBQU1DLEdBQVlsRSxFQUFNWCxNQUFNOEUsS0FDaEMsRUFFRkEsRUFBUUYsRUFBTUMsS0FBY2xFLEVBQU1YLE1BQU04RSxRQUd4Q0MsRUFBVSxJQUFPSCxFQUFNQyxJQUFhRCxFQUFNQyxHQUMxQ0MsRUFBUUYsRUFBTUMsSUFJaEJTLEVBQW1CLFVBQVdSLEVBQU9uRSxHQUNyQyxNQUVGLElBQUssUUFHSDJFLEVBQW1CLFVBQVdWLEVBQU1DLEtBQWNsRSxFQUFNRixJQUFJcUUsTUFBT25FLEdBQ25FLE1BRUYsUUFHRTJFLEVBQW1CLFFBQVNWLEVBQU1DLEdBQVdsRSxPQUcxQixXQUFkQSxFQUFNakIsS0FFZjJDLEVBQVFBLEdBQVMsVUFDYjFCLEVBQU1YLE1BQU11RixVQUVkUixFQUFXekIsSUFDVCxJQUFJNEIsRUFBTzVCLEVBQUVDLE9BQTRDdUIsTUFDekQsR0FBSXhCLEVBQUVrQyxRQUFTLENBRWIsSUFBSUwsRUFBTVAsRUFBTUMsR0FBVU8sUUFBUUYsSUFDdEIsSUFBUkMsRUFDRlAsRUFBTUMsR0FBVTNELEtBQUtnRSxHQUVyQk4sRUFBTUMsR0FBVVEsT0FBT0YsRUFBSyxFQUVoQyxNQUVFUCxFQUFNQyxHQUFVUSxPQUFPLEVBQUdULEVBQU1DLEdBQVU3RCxRQUMxQzRELEVBQU1DLEdBQVUzRCxLQUFLZ0UsRUFDdkIsRUFHRnZFLEVBQU1WLFNBQVN3RixRQUFTQyxJQUN0QixHQUFrQixXQUFkQSxFQUFNaEcsSUFBa0IsQ0FDMUIsSUFBSW9GLEVBQVEsVUFBV1ksRUFBTTFGLE1BQVEwRixFQUFNMUYsTUFBTThFLE1BQVFZLEVBQU16RixTQUFTMEYsS0FBSyxJQUFJL0QsT0FDakY4RCxFQUFNMUYsTUFBTTRGLFVBQThDLElBQW5DaEIsRUFBTUMsR0FBVU8sUUFBUU4sRUFDakQsS0FJRm5FLEVBQU1WLFNBQVN3RixRQUFTQyxJQUN0QixHQUFrQixXQUFkQSxFQUFNaEcsSUFBa0IsQ0FDMUIsSUFBSW9GLEVBQVEsVUFBV1ksRUFBTTFGLE1BQVEwRixFQUFNMUYsTUFBTThFLE1BQVFZLEVBQU16RixTQUFTMEYsS0FBSyxJQUFJL0QsT0FDakY4RCxFQUFNMUYsTUFBTTRGLFNBQVdkLElBQVVGLEVBQU1DLEVBQ3pDLEtBR21CLGFBQWRsRSxFQUFNakIsTUFFZjJDLEVBQVFBLEdBQVMsVUFFakIxQixFQUFNVixTQUFXLENBQUMyRSxFQUFNQyxLQUkxQixJQUFJZ0IsRUFBY2xGLEVBQU1YLE1BQU1xQyxHQUk5QmlELEVBQ0VqRCxFQUNDaUIsSUFDQ3lCLEVBQVF6QixHQUdKdUMsR0FDRkEsRUFBWXZDLEVBQ2QsRUFFRjNDLEVBQ0F5QixFQUNGLEVBT0YsV0FBWSxDQUFDVyxFQUF5Q3BDLEVBQXFCeUIsS0FFekUsSUFBS0EsRUFBVSxDQUNiLElBQUkwRCxFQUFVL0MsRUFBU3BDLEdBR0EsbUJBQVptRixHQUNUaEQsRUFBVWdELEVBRWQsR0FNRixXQUFZLENBRVYvQyxFQUNBcEMsRUFDQXlCLEtBR0EsR0FBSUEsRUFBVSxDQUNaLElBQUkwRCxFQUFVL0MsRUFBU3BDLEVBQU95QixHQUdQLG1CQUFaMEQsR0FDVGhELEVBQVVnRCxFQUVkLEdBTUYsWUFBYSxDQUVYL0MsRUFDQXBDLEVBQ0F5QixLQUdBVSxFQUFVLElBQU1DLEVBQVNwQyxFQUFPeUIsR0FBUyxHQWdCN0MsU0FBU2tELEVBQW1COUIsRUFBY3NCLEVBQVlpQixFQUF3QjNELEdBRzVFLEdBQXFCLG1CQUFWMEMsRUFPVCxPQUxJdEIsS0FBUUosSUFBdUIsSUFDaENuQixFQUEyQnhCLElBQUl1RixpQkFBaUJ4QyxFQUFLeUMsTUFBTSxHQUFJNUMsR0FDaEVELEVBQW1CSSxJQUFRLFFBRTdCdUMsRUFBU3RGLElBQUksS0FBSytDLEtBQVVzQixHQU0xQnRCLEtBQVF1QyxFQUFTdEYsTUFBMEIsSUFBbkJzRixFQUFTcEcsTUFFL0JvRyxFQUFTdEYsSUFBSStDLElBQVNzQixJQUN4QmlCLEVBQVN0RixJQUFJK0MsR0FBUXNCLEdBT3BCMUMsR0FBWTBDLElBQVUxQyxFQUFTcEMsTUFBTXdELE1BQzFCLElBQVZzQixFQUNGaUIsRUFBU3RGLElBQUl5RixnQkFBZ0IxQyxHQUU3QnVDLEVBQVN0RixJQUFJMEYsYUFBYTNDLEVBQU1zQixHQUd0QyxDQW9CTyxTQUFTc0IsRUFBaUJMLEVBQXdCM0QsR0FHdkQsR0FBSUEsRUFDRixRQUFTb0IsS0FBUXBCLEVBQVNwQyxNQUNwQndELEtBQVF1QyxFQUFTL0YsUUFBVSxHQUFTd0QsS0FBUUosSUFBdUIsR0FBU0ksS0FBUWxCLElBQWtCLElBQ3BHa0IsS0FBUXVDLEVBQVN0RixNQUEwQixJQUFuQnNGLEVBQVNwRyxNQUNuQ29HLEVBQVN0RixJQUFJK0MsR0FBUSxLQUVyQnVDLEVBQVN0RixJQUFJeUYsZ0JBQWdCMUMsSUFRckMsUUFBU0EsS0FBUXVDLEVBQVMvRixNQUN4QixHQUFJd0QsS0FBUWxCLEdBSVYsR0FBSWtCLEtBQVFZLElBQTZFLElBQS9EQSxFQUFXWixHQUFNdUMsRUFBUy9GLE1BQU13RCxHQUFPdUMsRUFBVTNELEdBQ3pFLFdBSUprRCxFQUFtQjlCLEVBQU11QyxFQUFTL0YsTUFBTXdELEdBQU91QyxFQUFVM0QsRUFFN0QsQ0FLTyxTQUFTaUUsRUFBTU4sRUFBd0IzRCxHQUU1QyxHQUFpQyxJQUE3QjJELEVBQVM5RixTQUFTZSxPQUVwQixZQURBK0UsRUFBU3RGLElBQUk2RixZQUFjLElBSzdCLElBQUlDLEVBQVVSLEVBQVM5RixTQUNuQnVHLEVBQVVwRSxHQUFVbkMsVUFBWSxHQUVoQ3dHLEVBQWdCRCxFQUFReEYsT0FLNUIsR0FBSXlGLEdBQWlCRixFQUFRLGFBQWN4RyxHQUFTLFFBQVN3RyxFQUFRLEdBQUd2RyxPQUFTLFFBQVN3RyxFQUFRLEdBQUd4RyxNQUFyRyxDQUVFLElBQUkwRyxFQUFnQkgsRUFBUXZGLE9BR3hCMkYsRUFBMEMsQ0FBQyxFQUMvQyxRQUFTOUYsRUFBSSxFQUFHQSxFQUFJNEYsRUFBZTVGLElBQ2pDOEYsRUFBYUgsRUFBUTNGLEdBQUdiLE1BQU11QyxLQUFPMUIsRUFJdkMsSUFBSStGLEVBQTBDLENBQUMsRUFDL0MsUUFBUy9GLEVBQUksRUFBR0EsRUFBSTZGLEVBQWU3RixJQUNqQytGLEVBQWFMLEVBQVExRixHQUFHYixNQUFNdUMsS0FBTzFCLEVBSXZDLFFBQVNBLEVBQUksRUFBR0EsRUFBSTZGLEVBQWU3RixJQUFLLENBRXRDLElBQUlnRyxFQUFXTixFQUFRMUYsR0FDbkJpRyxFQUFXTixFQUFRRyxFQUFhRSxFQUFTN0csTUFBTXVDLE1BRS9Dd0UsR0FBYyxFQUdkRCxHQUNGRCxFQUFTcEcsSUFBTXFHLEVBQVNyRyxJQUVwQixXQUFZb0csRUFBUzdHLE9BQVM2RyxFQUFTN0csTUFBTSxZQUFjOEcsRUFBUzlHLE1BQU0sV0FDNUU2RyxFQUFTNUcsU0FBVzZHLEVBQVM3RyxTQUU3QjhHLEdBQWMsR0FFZFgsRUFBaUJTLEVBQVVDLEtBSzdCRCxFQUFTcEcsSUFBTWhCLEVBQWlCb0gsRUFBU25ILElBQUttSCxFQUFTbEgsT0FDdkR5RyxFQUFpQlMsSUFJZGQsRUFBU3RGLElBQUlNLFdBQVdGLEdBSWxCa0YsRUFBU3RGLElBQUlNLFdBQVdGLEtBQU9nRyxFQUFTcEcsS0FDakRzRixFQUFTdEYsSUFBSTBELGFBQWEwQyxFQUFTcEcsSUFBS3NGLEVBQVN0RixJQUFJTSxXQUFXRixJQUpoRWtGLEVBQVN0RixJQUFJdUcsWUFBWUgsRUFBU3BHLEtBUXBDc0csR0FBZVYsRUFBTVEsRUFBVUMsRUFDakMsQ0FHQSxRQUFTakcsRUFBSTZGLEVBQWU3RixFQUFJNEYsRUFBZTVGLElBRXhDK0YsRUFBYUosRUFBUTNGLEdBQUdiLE1BQU11QyxNQUNqQ2lFLEVBQVEzRixHQUFHSixJQUFJbUQsWUFBYzRDLEVBQVEzRixHQUFHSixJQUFJbUQsV0FBV3FELFlBQVlULEVBQVEzRixHQUFHSixJQUlwRixNQUdBLEdBQXVCLElBQW5COEYsRUFBUXZGLE9BQVosQ0FNQW1CLEVBQVF4QixNQUFRb0YsRUFDaEI1RCxFQUFRQyxTQUFXQSxFQUtuQixRQUFTdkIsRUFBSSxFQUFHQSxFQUFJMEYsRUFBUXZGLE9BQVFILElBQUssQ0FDdkMsSUFBSWdHLEVBQVdOLEVBQVExRixHQUduQmdHLGFBQW9COUcsRUFFTSxpQkFBakI4RyxFQUFTbkgsTUFFbEJ5QyxFQUFRL0IsVUFBWXlHLEVBQVNuSCxJQUU3QjZHLEVBQVFsQixPQUNOeEUsSUFDQSxHQUNDLFNBQVVnRyxFQUFTbkgsSUFBTW1ILEVBQVNuSCxJQUFJd0gsS0FBS0MsS0FBS04sRUFBU25ILEtBQU9tSCxFQUFTbkgsSUFBSXlILEtBQUtOLEVBQVNuSCxNQUMxRm1ILEVBQVM3RyxTQUNONkcsRUFBUzVHLFlBU2hCK0UsTUFBTUMsUUFBUTRCLEdBQ2hCTixFQUFRbEIsT0FBT3hFLElBQUssS0FBTWdHLEdBS3hCQSxRQU1KTixFQUFRMUYsR0FBSyxJQUFJZCxFQUFNWixFQUFTLENBQUMsRUFBRyxDQUFDMEgsSUFMbkNOLEVBQVFsQixPQUFPeEUsSUFBSyxFQU14QixDQUdBLFFBQVNBLEVBQUksRUFBR0EsRUFBSTBGLEVBQVF2RixPQUFRSCxJQUFLLENBQ3ZDLElBQUlnRyxFQUFXTixFQUFRMUYsR0FFdkIsR0FBSWdHLEVBQVNuSCxNQUFRUCxFQUFTLENBRTVCLEdBQUkwQixHQUFLNEYsRUFBZSxDQUV0QkksRUFBU3BHLElBQU1iLFNBQVNzRSxlQUFlMkMsRUFBUzVHLFNBQVMsSUFFekQ4RixFQUFTdEYsSUFBSXVHLFlBQVlILEVBQVNwRyxLQUNsQyxRQUNGLENBR0EsSUFBSXFHLEVBQVdOLEVBQVEzRixHQUd2QixHQUFJaUcsRUFBU3BILE1BQVFQLEVBQVMsQ0FFNUIwSCxFQUFTcEcsSUFBTWIsU0FBU3NFLGVBQWUyQyxFQUFTNUcsU0FBUyxJQUV6RDhGLEVBQVN0RixJQUFJMEQsYUFBYTBDLEVBQVNwRyxJQUFLcUcsRUFBU3JHLEtBQ2pELFFBQ0YsQ0FJQW9HLEVBQVNwRyxJQUFNcUcsRUFBU3JHLElBR3BCb0csRUFBUzVHLFNBQVMsSUFBTTZHLEVBQVNyRyxJQUFJNkYsY0FDdkNRLEVBQVNyRyxJQUFJNkYsWUFBY08sRUFBUzVHLFNBQVMsSUFFL0MsUUFDRixDQU9BLEdBSEE0RyxFQUFTbEgsTUFBUW9HLEVBQVNwRyxPQUEwQixRQUFqQmtILEVBQVNuSCxJQUd4Q21CLEdBQUs0RixFQUFlLENBRXRCSSxFQUFTcEcsSUFBTWhCLEVBQWlCb0gsRUFBU25ILElBQWVtSCxFQUFTbEgsT0FFakV5RyxFQUFpQlMsR0FFakJkLEVBQVN0RixJQUFJdUcsWUFBWUgsRUFBU3BHLEtBRWxDNEYsRUFBTVEsR0FDTixRQUNGLENBR0EsSUFBSUMsRUFBV04sRUFBUTNGLEdBR25CZ0csRUFBU25ILE1BQVFvSCxFQUFTcEgsS0FjOUJtSCxFQUFTcEcsSUFBTXFHLEVBQVNyRyxJQUVwQixXQUFZb0csRUFBUzdHLE9BQVM2RyxFQUFTN0csTUFBTSxZQUFjOEcsRUFBUzlHLE1BQU0sVUFDNUU2RyxFQUFTNUcsU0FBVzZHLEVBQVM3RyxVQUsvQm1HLEVBQWlCUyxFQUEwQkMsR0FFM0NULEVBQU1RLEVBQTBCQyxNQXRCOUJELEVBQVNwRyxJQUFNaEIsRUFBaUJvSCxFQUFTbkgsSUFBZW1ILEVBQVNsSCxPQUVqRXlHLEVBQWlCUyxHQUVqQmQsRUFBU3RGLElBQUkwRCxhQUFhMEMsRUFBU3BHLElBQUtxRyxFQUFTckcsS0FFakQ0RixFQUFNUSxHQWlCVixDQUdBLFFBQVNoRyxFQUFJMEYsRUFBUXZGLE9BQVFILEVBQUk0RixFQUFlNUYsSUFDOUNrRixFQUFTdEYsSUFBSXdHLFlBQVlULEVBQVEzRixHQUFHSixJQXZJdEMsTUFGRXNGLEVBQVN0RixJQUFJNkYsWUFBYyxFQTJJL0IsQ0FHTyxTQUFTM0MsSUFFZCxHQUFJMUIsRUFBVyxDQUViZ0IsRUFBUVIsR0FFUixJQUFJMkUsRUFBZW5GLEVBcUJuQixJQW5CQUEsRUFBWSxJQUFJbEMsRUFBTXFILEVBQWExSCxJQUFLMEgsRUFBYXBILE1BQU8sQ0FBQ2dDLEtBQ25EdkIsSUFBTTJHLEVBQWEzRyxJQUM3QndCLEVBQVV0QyxNQUFReUgsRUFBYXpILE1BRy9CMEcsRUFBTXBFLEVBQVdtRixHQUdqQm5FLEVBQVFmLEVBQVlVLEVBQWNELEdBR2xDVCxHQUFZLEVBR1pDLEVBQVF4QixNQUFRLEtBQ2hCd0IsRUFBUUMsU0FBVyxLQUNuQkQsRUFBUS9CLFVBQVksS0FHaEJoQixFQUNGLE9BQU82QyxFQUFVeEIsSUFBSWtCLFNBRXpCLENBQ0YsQ0F3Q08sU0FBUzBGLElBRWQsR0FBSXBGLEVBQVcsQ0FFYkQsRUFBZ0IsSUFBSWpDLEVBQU0sSUFBTSxLQUFNLENBQUMsRUFBRyxJQUUxQyxJQUFJdUgsRUFBUzNELElBRWJWLEVBQVFKLEdBR1IsUUFBU1csS0FBUUosRUFDZm5CLEVBQVV4QixJQUFJOEcsb0JBQW9CL0QsRUFBS3lDLE1BQU0sR0FBRzFFLGNBQWU4QixHQUMvRG1FLFFBQVFDLGVBQWVyRSxFQUFvQkksR0FhN0MsT0FUQXhCLEVBQWdCLEtBQ2hCQyxFQUFZLEtBRVpDLEdBQVksRUFFWkMsRUFBUXhCLE1BQVEsS0FDaEJ3QixFQUFRQyxTQUFXLEtBQ25CRCxFQUFRL0IsVUFBWSxLQUVia0gsQ0FDVCxDQUNGLENBb0NPLElBQU1JLEVBQU8sQ0FBQ0MsRUFBZ0IzSCxFQUFRLENBQUMsS0FBTUMsSUFFM0MsSUFBSUYsRUFBTTRILEVBQWdCM0gsR0FBUyxDQUFDLEVBQUdDLEdBS2hEeUgsRUFBRUUsU0FBVyxDQUFDQyxLQUF1QjVILElBQXVCQSxFLHNEQWhkckQsU0FBbUJ1RCxFQUFjc0UsR0FDdEMsSUFBSUMsRUFBZ0IsS0FBS3ZFLElBQ3pCWSxFQUFXMkQsR0FBaUJELEVBQzVCeEYsRUFBY3lGLElBQWlCLENBQ2pDLEUsc0ZBbWFPLFNBQWV0SCxFQUFLTCxHQUd6QixJQUFJNEgsRUFDYSxpQkFBUnZILEVBQ0hyQixFQUNFSyxFQUFpQmdCLEVBQWEsUUFBUkEsR0FDdEJiLFNBQVNxSSxpQkFBaUJ4SCxHQUFLLEdBQ2pDQSxFQUtGeUgsRUFBaUIzSCxFQUFpQkgsR0FDbENBLEVBQ0FELEVBQVlDLEdBQ1osSUFBSUwsRUFBTUssRUFBVyxDQUFDLEVBQUcsSUFDekIsSUFBSUwsRUFBTSxJQUFNSyxFQUFXLENBQUMsRUFBRyxJQVluQyxPQVRJNEIsR0FBaUJBLEVBQWN0QyxNQUFRd0ksRUFBZXhJLEtBQ3hEMkgsSUFJRnJGLEVBQWdCa0csRUFFaEJqRyxFQUFZekIsRUFBV3dILEdBRWhCckUsR0FDVCxFLG9CQS91Qk8sU0FBaUJaLEdBQ2pCYixHQUNIUyxFQUFXSyxJQUFJRCxFQUVuQixFLFVBVU8sU0FBbUJBLEdBQ25CYixHQUNIVyxFQUFhRyxJQUFJRCxFQUVyQixFLFNBWk8sU0FBa0JBLEdBQ3ZCSCxFQUFZSSxJQUFJRCxFQUNsQixFLHFDQWlWTyxTQUFzQlMsRUFBY3NCLEVBQVlpQixFQUF3QjNELEdBQ3pFb0IsS0FBUWxCLElBR1p5RCxFQUFTL0YsTUFBTXdELEdBQVFzQixFQUN2QlEsRUFBbUI5QixFQUFNc0IsRUFBT2lCLEVBQTBCM0QsR0FDNUQsRSwwREFvVE8sU0FBcUJ6QixFQUFxQnlCLEdBMEIvQyxHQXhCQWEsRUFBUVIsR0FHUjRELEVBQU0xRixFQUFPeUIsR0FJYkEsRUFBUzFDLElBQU1pQixFQUFNakIsSUFDckIwQyxFQUFTcEMsTUFBUSxJQUFLVyxFQUFNWCxPQUM1Qm9DLEVBQVNuQyxTQUFXLElBQUlVLEVBQU1WLFVBQzlCbUMsRUFBUzNCLElBQU1FLEVBQU1GLElBQ3JCMkIsRUFBU3pDLE1BQVFnQixFQUFNaEIsTUFHdkJzRCxFQUFRZixFQUFZVSxFQUFjRCxHQUdsQ1QsR0FBWSxFQUdaQyxFQUFReEIsTUFBUSxLQUNoQndCLEVBQVFDLFNBQVcsS0FDbkJELEVBQVEvQixVQUFZLEtBRWhCaEIsRUFDRixPQUFPdUIsRUFBTUYsSUFBSWtCLFNBRXJCLEUifQ==
package/dist/index.mjs CHANGED
@@ -58,6 +58,7 @@ var reservedProps = {
58
58
  key: true,
59
59
  state: true,
60
60
  "v-keep": true,
61
+ // Built in directives
61
62
  "v-if": true,
62
63
  "v-unless": true,
63
64
  "v-for": true,
@@ -127,8 +128,11 @@ var hideDirective = (test) => (bool, vnode, oldnode) => {
127
128
  }
128
129
  };
129
130
  var directives = {
131
+ // The "v-if" directive hides an element if the given condition is false
130
132
  "v-if": hideDirective(false),
133
+ // The "v-unless" directive hides an element if the given condition is true
131
134
  "v-unless": hideDirective(true),
135
+ // The "v-for" directive creates a loop and applies a callback function to each item in the loop
132
136
  "v-for": (set, vnode) => {
133
137
  let newChildren = [];
134
138
  let callback = vnode.children[0];
@@ -137,17 +141,21 @@ var directives = {
137
141
  }
138
142
  vnode.children = newChildren;
139
143
  },
144
+ // The "v-show" directive shows or hides an element by setting the "display" style property
140
145
  "v-show": (bool, vnode) => {
141
146
  vnode.dom.style.display = bool ? "" : "none";
142
147
  },
148
+ // The "v-class" directive adds or removes class names from an element based on a condition
143
149
  "v-class": (classes, vnode) => {
144
150
  for (let name in classes) {
145
151
  vnode.dom.classList.toggle(name, classes[name]);
146
152
  }
147
153
  },
154
+ // The "v-html" directive sets the inner HTML of an element to the given HTML string
148
155
  "v-html": (html, vnode) => {
149
156
  vnode.children = [trust(html)];
150
157
  },
158
+ // The "v-model" directive binds the value of an input element to a model property
151
159
  "v-model": ([model, property, event], vnode, oldVnode) => {
152
160
  let value;
153
161
  let handler = (e) => model[property] = e.target.value;
@@ -238,6 +246,10 @@ var directives = {
238
246
  oldVnode
239
247
  );
240
248
  },
249
+ // The "v-create" directive is called when a new virtual node is created.
250
+ // The provided callback function is called with the new virtual node as an argument.
251
+ // This directive is only called once per virtual node, when it is first created.
252
+ // eslint-disable-next-line no-unused-vars
241
253
  "v-create": (callback, vnode, oldVnode) => {
242
254
  if (!oldVnode) {
243
255
  let cleanup = callback(vnode);
@@ -246,6 +258,9 @@ var directives = {
246
258
  }
247
259
  }
248
260
  },
261
+ // The "v-update" directive is called when an existing virtual node is updated.
262
+ // The provided callback function is called with the new and old virtual nodes as arguments.
263
+ // This directive is only called once per virtual node update.
249
264
  "v-update": (callback, vnode, oldVnode) => {
250
265
  if (oldVnode) {
251
266
  let cleanup = callback(vnode, oldVnode);
@@ -254,6 +269,9 @@ var directives = {
254
269
  }
255
270
  }
256
271
  },
272
+ // The "v-cleanup" directive is called when the update is cleaned up.
273
+ // The provided callback function is called with the old virtual node as an argument.
274
+ // This directive is only called once per virtual node, when the update is cleaned up.
257
275
  "v-cleanup": (callback, vnode, oldVnode) => {
258
276
  onCleanup(() => callback(vnode, oldVnode));
259
277
  }
@@ -17,6 +17,10 @@ var __copyProps = (to, from, except, desc) => {
17
17
  return to;
18
18
  };
19
19
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
24
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
25
  mod
22
26
  ));
@@ -37,7 +41,8 @@ __export(node_exports, {
37
41
  module.exports = __toCommonJS(node_exports);
38
42
 
39
43
  // lib/node/utils/tree-adapter.ts
40
- var Node = class {
44
+ var Node = class _Node {
45
+ // eslint-disable-next-line no-use-before-define
41
46
  childNodes = [];
42
47
  baseURI = "";
43
48
  tag_name;
@@ -74,6 +79,7 @@ var Node = class {
74
79
  get nodeValue() {
75
80
  return this.node_value;
76
81
  }
82
+ // eslint-disable-next-line no-use-before-define
77
83
  parent_node = null;
78
84
  get parentNode() {
79
85
  return this.parent_node;
@@ -135,7 +141,7 @@ var Node = class {
135
141
  }
136
142
  return node2;
137
143
  }
138
- let node = new Node();
144
+ let node = new _Node();
139
145
  node.nodeType = this.nodeType;
140
146
  node.nodeName = this.nodeName;
141
147
  return node;
@@ -189,8 +195,67 @@ var Node = class {
189
195
  }
190
196
  return elementFound || null;
191
197
  }
198
+ // Not implemented
199
+ // firstChild!: ChildNode | null;
200
+ // isConnected!: boolean;
201
+ // lastChild!: ChildNode | null;
202
+ // nextSibling!: ChildNode | null;
203
+ // ownerDocument!: Document | null;
204
+ // parentElement!: HTMLElement | null;
205
+ // previousSibling!: ChildNode | null;
206
+ // compareDocumentPosition(other: Node): number {
207
+ // throw new Error("Method not implemented.");
208
+ // }
209
+ // contains(other: Node | null): boolean {
210
+ // throw new Error("Method not implemented.");
211
+ // }
212
+ // getRootNode(options?: GetRootNodeOptions | undefined): Node {
213
+ // throw new Error("Method not implemented.");
214
+ // }
215
+ // hasChildNodes(): boolean {
216
+ // throw new Error("Method not implemented.");
217
+ // }
218
+ // isDefaultNamespace(namespace: string | null): boolean {
219
+ // throw new Error("Method not implemented.");
220
+ // }
221
+ // isEqualNode(otherNode: Node | null): boolean {
222
+ // throw new Error("Method not implemented.");
223
+ // }
224
+ // isSameNode(otherNode: Node | null): boolean {
225
+ // throw new Error("Method not implemented.");
226
+ // }
227
+ // lookupNamespaceURI(prefix: string | null): string | null {
228
+ // throw new Error("Method not implemented.");
229
+ // }
230
+ // lookupPrefix(namespace: string | null): string | null {
231
+ // throw new Error("Method not implemented.");
232
+ // }
233
+ // normalize(): void {
234
+ // throw new Error("Method not implemented.");
235
+ // }
236
+ // ATTRIBUTE_NODE!: number;
237
+ // CDATA_SECTION_NODE!: number;
238
+ // COMMENT_NODE!: number;
239
+ // DOCUMENT_FRAGMENT_NODE!: number;
240
+ // DOCUMENT_NODE!: number;
241
+ // DOCUMENT_POSITION_CONTAINED_BY!: number;
242
+ // DOCUMENT_POSITION_CONTAINS!: number;
243
+ // DOCUMENT_POSITION_DISCONNECTED!: number;
244
+ // DOCUMENT_POSITION_FOLLOWING!: number;
245
+ // DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC!: number;
246
+ // DOCUMENT_POSITION_PRECEDING!: number;
247
+ // DOCUMENT_TYPE_NODE!: number;
248
+ // ELEMENT_NODE!: number;
249
+ // ENTITY_NODE!: number;
250
+ // ENTITY_REFERENCE_NODE!: number;
251
+ // NOTATION_NODE!: number;
252
+ // PROCESSING_INSTRUCTION_NODE!: number;
253
+ // TEXT_NODE!: number;
192
254
  addEventListener(type, callback, options) {
193
255
  }
256
+ // dispatchEvent(event: Event): boolean {
257
+ // throw new Error("Method not implemented.");
258
+ // }
194
259
  removeEventListener(type, callback, options) {
195
260
  }
196
261
  };
@@ -223,7 +288,7 @@ var Element = class extends Node {
223
288
  this.attributes = [];
224
289
  this.childNodes = [];
225
290
  }
226
- style = new Proxy(
291
+ _style = new Proxy(
227
292
  {},
228
293
  {
229
294
  get: (state, prop) => state[prop],
@@ -239,6 +304,20 @@ var Element = class extends Node {
239
304
  }
240
305
  }
241
306
  );
307
+ get style() {
308
+ return this._style;
309
+ }
310
+ set style(value) {
311
+ if (typeof value === "string") {
312
+ const regex = /([^:\s]+):\s*((url\([^)]+\))|[^;]+(?=(;|$)))/g;
313
+ let match;
314
+ while ((match = regex.exec(value)) !== null) {
315
+ this._style[match[1]] = match[2].trim();
316
+ }
317
+ return;
318
+ }
319
+ throw new Error("Cannot set style");
320
+ }
242
321
  classList = {
243
322
  toggle: (item, force) => {
244
323
  if (item) {
@@ -523,20 +602,20 @@ function getObjectIndexTree(html) {
523
602
  let attributesWithValues = string.match(/\S+="[^"]+"/g);
524
603
  if (attributesWithValues) {
525
604
  for (let attribute of attributesWithValues) {
526
- const [name, value] = attribute.trim().split("=");
605
+ const [name, ...value] = attribute.trim().split("=");
527
606
  string = string.replace(attribute, "");
528
607
  if (value) {
529
- element.attributes[name] = value.replace(/(^"|"$)/g, "");
608
+ element.attributes[name] = value.join("=").replace(/(^"|"$)/g, "");
530
609
  }
531
610
  }
532
611
  }
533
612
  let attributesWithBooleanValues = string.match(/\s\S+=[^"]+/g);
534
613
  if (attributesWithBooleanValues) {
535
614
  for (let attribute of attributesWithBooleanValues) {
536
- const [name, value] = attribute.trim().split("=");
615
+ const [name, ...value] = attribute.trim().split("=");
537
616
  string = string.replace(attribute, "");
538
617
  if (value) {
539
- element.attributes[name] = value;
618
+ element.attributes[name] = value.join("=").replace(/(^"|"$)/g, "");
540
619
  }
541
620
  }
542
621
  }
@@ -641,6 +720,7 @@ async function icons(source, configuration) {
641
720
  icons.options = {
642
721
  iconsPath: null,
643
722
  linksViewPath: null,
723
+ // favicons options
644
724
  path: "",
645
725
  appName: null,
646
726
  appDescription: null,
@@ -664,6 +744,7 @@ icons.options = {
664
744
  firefox: false,
665
745
  windows: true,
666
746
  yandex: false
747
+ // Create Yandex browser icon. `boolean`
667
748
  }
668
749
  };
669
750
 
@@ -682,7 +763,9 @@ async function inline(file, options = {}) {
682
763
  let emitDeclaration = !!declarationDir;
683
764
  let tscProgOptions = {
684
765
  basePath: process.cwd(),
766
+ // always required, used for relative paths
685
767
  configFilePath: "tsconfig.json",
768
+ // config to inherit from (optional)
686
769
  files: [file],
687
770
  include: ["**/*.ts", "**/*.js", "**/*.tsx", "**/*.jsx", "**/*.mjs"],
688
771
  exclude: ["test*/**/*", "**/*.test.ts", "**/*.spec.ts", "dist/**"],
@@ -762,6 +845,7 @@ async function inline(file, options = {}) {
762
845
  },
763
846
  2: {
764
847
  restructureRules: true
848
+ // controls rule restructuring; defaults to false
765
849
  }
766
850
  },
767
851
  ...options.cleanCss || {}
@@ -800,6 +884,7 @@ inline.uncss = async function(renderedHtml, css, options = {}) {
800
884
  },
801
885
  2: {
802
886
  restructureRules: true
887
+ // controls rule restructuring; defaults to false
803
888
  }
804
889
  },
805
890
  ...options.cleanCss || {}
@@ -1,5 +1,6 @@
1
1
  import { fileURLToPath } from 'url';const __filename = fileURLToPath(import.meta.url);const __dirname = path.dirname(__filename);// lib/node/utils/tree-adapter.ts
2
- var Node = class {
2
+ var Node = class _Node {
3
+ // eslint-disable-next-line no-use-before-define
3
4
  childNodes = [];
4
5
  baseURI = "";
5
6
  tag_name;
@@ -36,6 +37,7 @@ var Node = class {
36
37
  get nodeValue() {
37
38
  return this.node_value;
38
39
  }
40
+ // eslint-disable-next-line no-use-before-define
39
41
  parent_node = null;
40
42
  get parentNode() {
41
43
  return this.parent_node;
@@ -97,7 +99,7 @@ var Node = class {
97
99
  }
98
100
  return node2;
99
101
  }
100
- let node = new Node();
102
+ let node = new _Node();
101
103
  node.nodeType = this.nodeType;
102
104
  node.nodeName = this.nodeName;
103
105
  return node;
@@ -151,8 +153,67 @@ var Node = class {
151
153
  }
152
154
  return elementFound || null;
153
155
  }
156
+ // Not implemented
157
+ // firstChild!: ChildNode | null;
158
+ // isConnected!: boolean;
159
+ // lastChild!: ChildNode | null;
160
+ // nextSibling!: ChildNode | null;
161
+ // ownerDocument!: Document | null;
162
+ // parentElement!: HTMLElement | null;
163
+ // previousSibling!: ChildNode | null;
164
+ // compareDocumentPosition(other: Node): number {
165
+ // throw new Error("Method not implemented.");
166
+ // }
167
+ // contains(other: Node | null): boolean {
168
+ // throw new Error("Method not implemented.");
169
+ // }
170
+ // getRootNode(options?: GetRootNodeOptions | undefined): Node {
171
+ // throw new Error("Method not implemented.");
172
+ // }
173
+ // hasChildNodes(): boolean {
174
+ // throw new Error("Method not implemented.");
175
+ // }
176
+ // isDefaultNamespace(namespace: string | null): boolean {
177
+ // throw new Error("Method not implemented.");
178
+ // }
179
+ // isEqualNode(otherNode: Node | null): boolean {
180
+ // throw new Error("Method not implemented.");
181
+ // }
182
+ // isSameNode(otherNode: Node | null): boolean {
183
+ // throw new Error("Method not implemented.");
184
+ // }
185
+ // lookupNamespaceURI(prefix: string | null): string | null {
186
+ // throw new Error("Method not implemented.");
187
+ // }
188
+ // lookupPrefix(namespace: string | null): string | null {
189
+ // throw new Error("Method not implemented.");
190
+ // }
191
+ // normalize(): void {
192
+ // throw new Error("Method not implemented.");
193
+ // }
194
+ // ATTRIBUTE_NODE!: number;
195
+ // CDATA_SECTION_NODE!: number;
196
+ // COMMENT_NODE!: number;
197
+ // DOCUMENT_FRAGMENT_NODE!: number;
198
+ // DOCUMENT_NODE!: number;
199
+ // DOCUMENT_POSITION_CONTAINED_BY!: number;
200
+ // DOCUMENT_POSITION_CONTAINS!: number;
201
+ // DOCUMENT_POSITION_DISCONNECTED!: number;
202
+ // DOCUMENT_POSITION_FOLLOWING!: number;
203
+ // DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC!: number;
204
+ // DOCUMENT_POSITION_PRECEDING!: number;
205
+ // DOCUMENT_TYPE_NODE!: number;
206
+ // ELEMENT_NODE!: number;
207
+ // ENTITY_NODE!: number;
208
+ // ENTITY_REFERENCE_NODE!: number;
209
+ // NOTATION_NODE!: number;
210
+ // PROCESSING_INSTRUCTION_NODE!: number;
211
+ // TEXT_NODE!: number;
154
212
  addEventListener(type, callback, options) {
155
213
  }
214
+ // dispatchEvent(event: Event): boolean {
215
+ // throw new Error("Method not implemented.");
216
+ // }
156
217
  removeEventListener(type, callback, options) {
157
218
  }
158
219
  };
@@ -185,7 +246,7 @@ var Element = class extends Node {
185
246
  this.attributes = [];
186
247
  this.childNodes = [];
187
248
  }
188
- style = new Proxy(
249
+ _style = new Proxy(
189
250
  {},
190
251
  {
191
252
  get: (state, prop) => state[prop],
@@ -201,6 +262,20 @@ var Element = class extends Node {
201
262
  }
202
263
  }
203
264
  );
265
+ get style() {
266
+ return this._style;
267
+ }
268
+ set style(value) {
269
+ if (typeof value === "string") {
270
+ const regex = /([^:\s]+):\s*((url\([^)]+\))|[^;]+(?=(;|$)))/g;
271
+ let match;
272
+ while ((match = regex.exec(value)) !== null) {
273
+ this._style[match[1]] = match[2].trim();
274
+ }
275
+ return;
276
+ }
277
+ throw new Error("Cannot set style");
278
+ }
204
279
  classList = {
205
280
  toggle: (item, force) => {
206
281
  if (item) {
@@ -485,20 +560,20 @@ function getObjectIndexTree(html) {
485
560
  let attributesWithValues = string.match(/\S+="[^"]+"/g);
486
561
  if (attributesWithValues) {
487
562
  for (let attribute of attributesWithValues) {
488
- const [name, value] = attribute.trim().split("=");
563
+ const [name, ...value] = attribute.trim().split("=");
489
564
  string = string.replace(attribute, "");
490
565
  if (value) {
491
- element.attributes[name] = value.replace(/(^"|"$)/g, "");
566
+ element.attributes[name] = value.join("=").replace(/(^"|"$)/g, "");
492
567
  }
493
568
  }
494
569
  }
495
570
  let attributesWithBooleanValues = string.match(/\s\S+=[^"]+/g);
496
571
  if (attributesWithBooleanValues) {
497
572
  for (let attribute of attributesWithBooleanValues) {
498
- const [name, value] = attribute.trim().split("=");
573
+ const [name, ...value] = attribute.trim().split("=");
499
574
  string = string.replace(attribute, "");
500
575
  if (value) {
501
- element.attributes[name] = value;
576
+ element.attributes[name] = value.join("=").replace(/(^"|"$)/g, "");
502
577
  }
503
578
  }
504
579
  }
@@ -603,6 +678,7 @@ async function icons(source, configuration) {
603
678
  icons.options = {
604
679
  iconsPath: null,
605
680
  linksViewPath: null,
681
+ // favicons options
606
682
  path: "",
607
683
  appName: null,
608
684
  appDescription: null,
@@ -626,6 +702,7 @@ icons.options = {
626
702
  firefox: false,
627
703
  windows: true,
628
704
  yandex: false
705
+ // Create Yandex browser icon. `boolean`
629
706
  }
630
707
  };
631
708
 
@@ -644,7 +721,9 @@ async function inline(file, options = {}) {
644
721
  let emitDeclaration = !!declarationDir;
645
722
  let tscProgOptions = {
646
723
  basePath: process.cwd(),
724
+ // always required, used for relative paths
647
725
  configFilePath: "tsconfig.json",
726
+ // config to inherit from (optional)
648
727
  files: [file],
649
728
  include: ["**/*.ts", "**/*.js", "**/*.tsx", "**/*.jsx", "**/*.mjs"],
650
729
  exclude: ["test*/**/*", "**/*.test.ts", "**/*.spec.ts", "dist/**"],
@@ -724,6 +803,7 @@ async function inline(file, options = {}) {
724
803
  },
725
804
  2: {
726
805
  restructureRules: true
806
+ // controls rule restructuring; defaults to false
727
807
  }
728
808
  },
729
809
  ...options.cleanCss || {}
@@ -762,6 +842,7 @@ inline.uncss = async function(renderedHtml, css, options = {}) {
762
842
  },
763
843
  2: {
764
844
  restructureRules: true
845
+ // controls rule restructuring; defaults to false
765
846
  }
766
847
  },
767
848
  ...options.cleanCss || {}
@@ -38,7 +38,9 @@ export declare class Text extends Node {
38
38
  }
39
39
  export declare class Element extends Node {
40
40
  constructor();
41
- style: Record<string, any>;
41
+ _style: Record<string, any>;
42
+ get style(): string;
43
+ set style(value: string);
42
44
  classList: {
43
45
  toggle: (item: any, force: any) => void;
44
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tree-adapter.d.ts","sourceRoot":"","sources":["../../../lib/node/utils/tree-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tree-adapter.d.ts","sourceRoot":"","sources":["../../../lib/node/utils/tree-adapter.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,7 @@ function ProxySignal(value) {
51
51
  let getters = {};
52
52
  let forceUpdate = false;
53
53
  let signal = new Proxy(
54
+ // eslint-disable-next-line no-unused-vars
54
55
  function(valOrPath, handler) {
55
56
  if (typeof valOrPath === "undefined") {
56
57
  return signal.value;
@@ -28,6 +28,7 @@ function ProxySignal(value) {
28
28
  let getters = {};
29
29
  let forceUpdate = false;
30
30
  let signal = new Proxy(
31
+ // eslint-disable-next-line no-unused-vars
31
32
  function(valOrPath, handler) {
32
33
  if (typeof valOrPath === "undefined") {
33
34
  return signal.value;
@@ -113,7 +113,7 @@ async function searchComponent(router, middlewares) {
113
113
  }
114
114
  }
115
115
  }
116
- var Router = class {
116
+ var Router = class _Router {
117
117
  paths = [];
118
118
  container = null;
119
119
  query = {};
@@ -136,7 +136,7 @@ var Router = class {
136
136
  `${this.pathPrefix}${typeof middlewares[0] === "string" ? middlewares.shift() : "/"}`
137
137
  );
138
138
  for (const item of middlewares) {
139
- if (item instanceof Router) {
139
+ if (item instanceof _Router) {
140
140
  const subrouter = item;
141
141
  for (const subpath of subrouter.paths) {
142
142
  addPath({
@@ -96,7 +96,7 @@ async function searchComponent(router, middlewares) {
96
96
  }
97
97
  }
98
98
  }
99
- var Router = class {
99
+ var Router = class _Router {
100
100
  paths = [];
101
101
  container = null;
102
102
  query = {};
@@ -119,7 +119,7 @@ var Router = class {
119
119
  `${this.pathPrefix}${typeof middlewares[0] === "string" ? middlewares.shift() : "/"}`
120
120
  );
121
121
  for (const item of middlewares) {
122
- if (item instanceof Router) {
122
+ if (item instanceof _Router) {
123
123
  const subrouter = item;
124
124
  for (const subpath of subrouter.paths) {
125
125
  addPath({
@@ -283,7 +283,7 @@ export class Element extends Node {
283
283
  this.childNodes = [];
284
284
  }
285
285
 
286
- style = new Proxy(
286
+ _style = new Proxy(
287
287
  {},
288
288
  {
289
289
  get: (state: Record<string, any>, prop: string) => state[prop],
@@ -300,6 +300,26 @@ export class Element extends Node {
300
300
  }
301
301
  );
302
302
 
303
+ get style() {
304
+ return this._style as any;
305
+ }
306
+
307
+ set style(value: string) {
308
+ if (typeof value === "string") {
309
+ // should match pairs like "color: red; font-size: 12px; background: url(http://example.com/image.png?s=1024x1024&amp;w=is&amp;k=20&amp;c=ASa_AG8uP5Di7azXgJraSA6ME7fbLB0GX4YT_OzCARI=);"
310
+ const regex = /([^:\s]+):\s*((url\([^)]+\))|[^;]+(?=(;|$)))/g;
311
+ let match;
312
+
313
+ while ((match = regex.exec(value)) !== null) {
314
+ this._style[match[1]] = match[2].trim();
315
+ }
316
+
317
+ return;
318
+ }
319
+
320
+ throw new Error("Cannot set style");
321
+ }
322
+
303
323
  classList = {
304
324
  toggle: (item: any, force: any) => {
305
325
  if (item) {
@@ -342,6 +362,7 @@ export class Element extends Node {
342
362
  get innerHTML() {
343
363
  let str = "";
344
364
  for (let i = 0, l = this.childNodes.length; i < l; i++) {
365
+ // console.log("domToHtml", this.childNodes[i], domToHtml(this.childNodes[i] as Element));
345
366
  str += domToHtml(this.childNodes[i] as Element);
346
367
  }
347
368
  return str;
@@ -679,10 +700,10 @@ function getObjectIndexTree(html: string): DocumentFragment {
679
700
 
680
701
  if (attributesWithValues) {
681
702
  for (let attribute of attributesWithValues) {
682
- const [name, value] = attribute.trim().split("=");
703
+ const [name, ...value] = attribute.trim().split("=");
683
704
  string = string.replace(attribute, "");
684
705
  if (value) {
685
- element.attributes[name] = value.replace(/(^"|"$)/g, "");
706
+ element.attributes[name] = value.join("=").replace(/(^"|"$)/g, "");
686
707
  }
687
708
  }
688
709
  }
@@ -690,10 +711,10 @@ function getObjectIndexTree(html: string): DocumentFragment {
690
711
  let attributesWithBooleanValues = string.match(/\s\S+=[^"]+/g);
691
712
  if (attributesWithBooleanValues) {
692
713
  for (let attribute of attributesWithBooleanValues) {
693
- const [name, value] = attribute.trim().split("=");
714
+ const [name, ...value] = attribute.trim().split("=");
694
715
  string = string.replace(attribute, "");
695
716
  if (value) {
696
- element.attributes[name] = value;
717
+ element.attributes[name] = value.join("=").replace(/(^"|"$)/g, "");
697
718
  }
698
719
  }
699
720
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valyrian.js",
3
- "version": "7.2.6",
3
+ "version": "7.2.8",
4
4
  "description": "Lightweight steel to forge PWAs. (Minimal Frontend Framework with server side rendering and other capabilities)",
5
5
  "repository": "git@github.com:Masquerade-Circus/valyrian.js.git",
6
6
  "author": "Masquerade <christian@masquerade-circus.net>",
@@ -74,46 +74,48 @@
74
74
  "bench": "nodemon -e js,ts,json,css,tsx -w ./bench -w ./lib -w ./plugins --exec 'NODE_OPTIONS=--enable-source-maps buffalo-test --require ./register'"
75
75
  },
76
76
  "dependencies": {
77
- "clean-css": "^5.2.4",
78
- "esbuild": "^0.15.7",
79
- "favicons": "^7.0.0",
77
+ "clean-css": "^5.3.2",
78
+ "esbuild": "^0.19.3",
79
+ "favicons": "^7.1.4",
80
80
  "form-data": "^4.0.0",
81
- "purgecss": "4.1.3",
82
- "terser": "^5.15.0",
81
+ "purgecss": "^5.0.0",
82
+ "remark": "^15.0.1",
83
+ "terser": "^5.20.0",
83
84
  "ts-node": "^10.9.1",
84
- "tsc-prog": "^2.2.1",
85
- "tslib": "^2.4.0",
86
- "typescript": "^4.8.3"
85
+ "tsc-prog": "^2.3.0",
86
+ "tslib": "^2.6.2",
87
+ "typescript": "^5.2.2"
87
88
  },
88
89
  "devDependencies": {
89
- "@release-it/conventional-changelog": "^5.1.1",
90
- "@types/clean-css": "^4.2.5",
91
- "@types/node": "^18.7.16",
92
- "@types/node-fetch": "^2.6.2",
93
- "@types/sharp": "^0.30.5",
90
+ "@release-it/conventional-changelog": "^7.0.2",
91
+ "@types/clean-css": "^4.2.7",
92
+ "@types/node": "^20.7.0",
93
+ "@types/node-fetch": "^2.6.6",
94
+ "@types/sharp": "^0.32.0",
94
95
  "@types/source-map": "^0.5.7",
95
- "@typescript-eslint/eslint-plugin": "^5.36.2",
96
- "@typescript-eslint/parser": "^5.36.2",
96
+ "@typescript-eslint/eslint-plugin": "^6.7.3",
97
+ "@typescript-eslint/parser": "^6.7.3",
97
98
  "buffalo-test": "^2.0.0",
98
99
  "compression": "^1.7.4",
99
100
  "cross-env": "^7.0.3",
100
101
  "cz-conventional-changelog": "^3.3.0",
101
- "dayjs": "^1.11.5",
102
- "eslint": "^8.23.1",
103
- "eslint-plugin-sonarjs": "^0.15.0",
104
- "expect": "^29.0.3",
105
- "fastify": "^4.10.2",
102
+ "dayjs": "^1.11.10",
103
+ "eslint": "^8.50.0",
104
+ "eslint-plugin-sonarjs": "^0.21.0",
105
+ "expect": "^29.7.0",
106
+ "fastify": "^4.23.2",
106
107
  "gzip-size": "^7.0.0",
107
- "mocha": "^10.0.0",
108
- "nodemon": "^2.0.19",
108
+ "mocha": "^10.2.0",
109
+ "nodemon": "^3.0.1",
109
110
  "nyc": "^15.1.0",
110
- "pirates": "^4.0.5",
111
- "release-it": "^15.4.1",
111
+ "pirates": "^4.0.6",
112
+ "release-it": "^16.2.1",
112
113
  "remark-cli": "^11.0.0",
113
- "remark-toc": "^8.0.1"
114
+ "remark-toc": "^9.0.0"
114
115
  },
115
116
  "overrides": {
116
- "minimist": "^1.2.6"
117
+ "minimist": "^1.2.8",
118
+ "source-map-support": "^0.5.21"
117
119
  },
118
120
  "nyc": {
119
121
  "exclude": [