obsidian-integration-testing 17.0.1 → 17.1.0

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.
@@ -262,10 +262,20 @@ function bootstrapNamespace(bootstrapParams) {
262
262
  return typeof document.getAnimations === "function" ? document.getAnimations().filter((animation) => {
263
263
  const effect = animation.effect;
264
264
  const isActive = animation.playState === "running" || animation.pending;
265
- const isOnElementOrAncestor = effect instanceof KeyframeEffect && effect.target instanceof Element && effect.target.contains(element);
265
+ const isOnElementOrAncestor = effect instanceof KeyframeEffect && effect.target instanceof Element && checkIsShadowIncludingInclusiveAncestor(effect.target, element);
266
266
  return isActive && isOnElementOrAncestor && effect.getComputedTiming().endTime !== Infinity;
267
267
  }) : [];
268
268
  }
269
+ function checkIsShadowIncludingInclusiveAncestor(ancestor, node) {
270
+ let current = node;
271
+ while (current) {
272
+ if (current === ancestor) {
273
+ return true;
274
+ }
275
+ current = current instanceof ShadowRoot ? current.host : current.parentNode;
276
+ }
277
+ return false;
278
+ }
269
279
  async function waitForElementToSettle(element) {
270
280
  const startTime = Date.now();
271
281
  let previousRectKey = "";
@@ -300,7 +310,8 @@ function bootstrapNamespace(bootstrapParams) {
300
310
  const CENTER_DIVISOR = 2;
301
311
  const x = rect.left + rect.width / CENTER_DIVISOR;
302
312
  const y = rect.top + rect.height / CENTER_DIVISOR;
303
- const hitElement = document.elementFromPoint(x, y);
313
+ const root = element.getRootNode();
314
+ const hitElement = (root instanceof ShadowRoot ? root : document).elementFromPoint(x, y);
304
315
  if (hitElement && element.contains(hitElement)) {
305
316
  return;
306
317
  }
@@ -543,4 +554,4 @@ ${generateStackTraceLine(line)}`;
543
554
  export {
544
555
  ensureNamespaceBootstrapped
545
556
  };
546
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVGdW5jdGlvbkNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB7XG4gIGdldEJvb3RzdHJhcFZlcnNpb24sXG4gIGdldFJlZ2lzdGVyZWRMaWJSZXNvbHZlcnNcbn0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmltcG9ydCB7XG4gIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUsXG4gIE1PQklMRV9JTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xufSBmcm9tICcuL21vYmlsZS1pbnB1dC5tanMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBob3N0LWluc3RhbGxlZCBgUnVudGltZS5hZGRCaW5kaW5nYCBmdW5jdGlvbiB0aGUgbW9iaWxlIHRydXN0ZWQtaW5wdXQgcGF0aCBjYWxscy5cbiAgICpcbiAgICogUGFzc2VkIGluIGFzIGRhdGEgYmVjYXVzZSB0aGUgYm9vdHN0cmFwIGNsb3N1cmUgbWF5IG5vdCByZWFkIG91dGVyIHNjb3BlICgqKkwxNSoqKSwgc28gaXQgY2Fubm90XG4gICAqIGltcG9ydCB7QGxpbmsgTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRX0gZGlyZWN0bHkuXG4gICAqL1xuICByZWFkb25seSBpbnB1dEJpbmRpbmdOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBwYXRoIHdhaXRzIGZvciB0aGUgaG9zdCB0byBhbnN3ZXIgb25lIHJlcXVlc3QuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGxpYlJlc29sdmVyczogTGliUmVzb2x2ZXJbXTtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIGlzIGJvb3RzdHJhcHBlZFxuICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3Mgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUGVyZm9ybXMgYSBsaWdodHdlaWdodCB2ZXJzaW9uIGNoZWNrIHZpYSB0aGUgdHJhbnNwb3J0LiBJZiB0aGUgbmFtZXNwYWNlXG4gKiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uLCBzZW5kcyB0aGUgZnVsbCBib290c3RyYXAgZXhwcmVzc2lvblxuICogdG8gcmVnaXN0ZXIgYWxsIGhlbHBlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkuXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gT3B0aW9uYWwgcGVyLWV2YWwgdGltZW91dC4gRm9yd2FyZGVkIHRvIGJvdGhcbiAqICAgdGhlIHZlcnNpb24gY2hlY2sgYW5kIHRoZSBib290c3RyYXAgZXZhbCBzbyBhIGh1bmcgYG9ic2lkaWFuIGV2YWxgIHJlamVjdHNcbiAqICAgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgY2FsbGVyIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0LCBjd2Q6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV2YWxPcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyA9IHtcbiAgICBjd2QsXG4gICAgLi4uKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gIH07XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBnZXRCb290c3RyYXBWZXJzaW9uKCk7XG4gIGNvbnN0IHZlcnNpb25Kc29uID0gSlNPTi5zdHJpbmdpZnkoYm9vdHN0cmFwVmVyc2lvbik7XG4gIGNvbnN0IHZlcnNpb25NYXRjaEpzb24gPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKHZlcnNpb25NYXRjaEpzb24gPT09ICd0cnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcEV4cHJlc3Npb24gPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChib290c3RyYXBOYW1lc3BhY2UsIHtcbiAgICBpbnB1dEJpbmRpbmdOYW1lOiBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICAgIGlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzOiBNT0JJTEVfSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwcmVzc2lvbiwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzIHRoZSByZW5kZXJlciBoYWxmIG9mXG4gICAgICogdGhlIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwncyAqKmV4YWN0bHktb25jZSoqIGd1YXJhbnRlZSAoKipMMzkqKikuXG4gICAgICpcbiAgICAgKiBDRFAgYnJvYWRjYXN0cyBgUnVudGltZS5iaW5kaW5nQ2FsbGVkYCB0byAqKmV2ZXJ5KiogYXR0YWNoZWQgc2Vzc2lvbiwgc28gZXZlcnkgTm9kZSBwcm9jZXNzXG4gICAgICogaG9sZGluZyBhbiBpbnB1dCBjaGFubmVsIHRvIHRoaXMgV2ViVmlldyBzZXJ2aWNlcyB0aGUgc2FtZSByZXF1ZXN0IFx1MjAxNCBhbmQgZWFjaCBvbmUgaW5qZWN0cyB0aGVcbiAgICAgKiBmdWxsIGdlc3R1cmUuIFdpdGggdHdvIHByb2Nlc3NlcyBhdHRhY2hlZCAoYSBWaXRlc3QgbWFpbiBwcm9jZXNzIGFuZCBpdHMgd29ya2VyLCB3aGljaCBpcyB0aGVcbiAgICAgKiBvcmRpbmFyeSBjb25zdW1lciBzaGFwZSkgb25lIGBjbGlja0VsZW1lbnRgIHRoZXJlZm9yZSBhcnJpdmVkIGFzIFRXTyB0YXBzLCBhbmQgb25lIGBwcmVzc0tleWAgYXNcbiAgICAgKiB0d28ga2V5IHByZXNzZXMuIE1lYXN1cmVkIDIwMjYtMDktMTA6IHR3byBwaWRzIHNlcnZpY2luZyByZXF1ZXN0IGBpZD0xYCBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZC5cbiAgICAgKlxuICAgICAqIFRoZSBjbGFpbSBpcyBtYWRlIGluIHRoZSBQQUdFIHJhdGhlciB0aGFuIGluIGFueSBob3N0IGJlY2F1c2UgdGhlIHBhZ2UgaXMgdGhlIG9ubHkgdGhpbmcgYWxsIHRoZVxuICAgICAqIGhvc3RzIHNoYXJlLiBKYXZhU2NyaXB0IGlzIHNpbmdsZS10aHJlYWRlZCwgc28gdHdvIGBSdW50aW1lLmV2YWx1YXRlYCBjYWxscyByYWNpbmcgZm9yIHRoZSBzYW1lXG4gICAgICogaWQgYXJlIHNlcmlhbGl6ZWQgYW5kIGV4YWN0bHkgb25lIHNlZXMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgdG8gY2xhaW0uXG4gICAgICogQHJldHVybnMgYHRydWVgIGZvciB0aGUgZmlyc3QgY2FsbGVyIHRvIGNsYWltIHRoaXMgaWQsIGBmYWxzZWAgZm9yIGV2ZXJ5IGxhdGVyIG9uZS5cbiAgICAgKi9cbiAgICBjbGFpbUlucHV0OiAoaWQ6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXRcbiAgICAgKiBvd25zIHRoZSBoYXJuZXNzIHRlc3Qgd2luZG93J3MgbGlmZWN5Y2xlIHZpYSBFbGVjdHJvbiAoYHdpbmRvdy5lbGVjdHJvbldpbmRvd2ApLFxuICAgICAqIHdoaWNoIGlzIHRoZSBoYXJuZXNzJ3MgY29uY2Vybiwgbm90IGEgZ2VuZXJhbCB1dGlsaXR5LlxuICAgICAqL1xuICAgIGRlc3Ryb3lDdXJyZW50V2luZG93OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHk6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBTeW5jZWQgd2l0aCBgb2JzaWRpYW4tZGV2LXV0aWxzYCAobWlycm9yIGBlcnJvci50c2ApIFx1MjAxNCBzZWUgTDE3LlxuICAgICAqL1xuICAgIGVycm9yVG9TdHJpbmc6IChlcnJvcjogdW5rbm93bikgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBUaGlzXG4gICAgICogaXMgdGhlIGhhcm5lc3MncyBvd24gZXZhbCBwbHVtYmluZyAoYnVpbGRzIHRoZSBgbGliYCBiYWcsIHJlc29sdmVzIHRoZVxuICAgICAqIG1vZHVsZSwgaW52b2tlcyB0aGUgY2xvc3VyZSwgZW52ZWxvcGVzIHRoZSByZXN1bHQpIFx1MjAxNCBtZWFuaW5nbGVzcyBvdXRzaWRlXG4gICAgICogdGhlIGhhcm5lc3MuXG4gICAgICovXG4gICAgZXZhbFdyYXBwZXI6IChuc1BhcmFtczogRXZhbFdyYXBwZXJQYXJhbXMpID0+IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gUmF3XG4gICAgICogRWxlY3Ryb24gSVBDIChgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jYCkgaXMgYSBoYXJuZXNzL3RyYW5zcG9ydFxuICAgICAqIHByaW1pdGl2ZSwgbm90IGEgZ2VuZXJhbC1wdXJwb3NlIGhlbHBlci5cbiAgICAgKi9cbiAgICBpcGNTZW5kU3luYzogKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiBwYXJ0IG9mIHRoZSBoYXJuZXNzJ3MgdmF1bHQtcGF0aCBoYW5kc2hha2Ugd2l0aCB0aGUgTm9kZSBzaWRlLCBub3QgYVxuICAgICAqIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBwb2xsVmF1bHRCYXNlUGF0aDogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdCBpcyB0aGUgcmVuZGVyZXIgZW5kIG9mIHRoZVxuICAgICAqIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwgKCoqTDM5KiopIFx1MjAxNCB0aGUgaG9zdCBjYWxscyBpdCBvdmVyIENEUCB0byBhbnN3ZXIgYSByZXF1ZXN0IHRoaXNcbiAgICAgKiBjbG9zdXJlIGlzIGF3YWl0aW5nLCBzbyBpdCBpcyBtZWFuaW5nbGVzcyBvdXRzaWRlIHRoZSBoYXJuZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgYmVpbmcgYW5zd2VyZWQuXG4gICAgICogQHBhcmFtIGVycm9yTWVzc2FnZSAtIFdoeSB0aGUgaW5qZWN0aW9uIGZhaWxlZCwgb3IgYG51bGxgIG9uIHN1Y2Nlc3MuXG4gICAgICovXG4gICAgcmVzb2x2ZUlucHV0OiAoaWQ6IHN0cmluZywgZXJyb3JNZXNzYWdlOiBudWxsIHwgc3RyaW5nKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW06IChuc1BhcmFtczogU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWxpYmVyYXRlIHNlYW0gYG9ic2lkaWFuLWRldi11dGlsc2AgcmVhZHMgb24gbW9iaWxlIFx1MjAxNCB0aGUgb25lIG5hbWVzcGFjZSBtZW1iZXIgdGhhdCBleGlzdHMgZm9yXG4gICAgICogYW5vdGhlciBwYWNrYWdlIHJhdGhlciB0aGFuIGZvciB0aGUgaGFybmVzcy4gSXRzICoqTDE3KiogbWlycm9yIChgZGVza3RvcC10cnVzdGVkLWlucHV0LnRzYCkgY2FuXG4gICAgICogcmVhY2ggYSB0cnVzdGVkIGV2ZW50IG9uIGRlc2t0b3AgYnkgaXRzZWxmLCBidXQgb24gbW9iaWxlIHRoZSBpbmplY3Rpb24gaGFzIHRvIGNvbWUgZnJvbSB0aGUgTm9kZVxuICAgICAqIHNpZGUgb3ZlciB0aGUgaGFybmVzcydzIENEUCBjaGFubmVsICgqKkwzOSoqKSwgYW5kIGBvYnNpZGlhbi1kZXYtdXRpbHNgIG11c3QgbmV2ZXIgaW1wb3J0IHRoaXNcbiAgICAgKiBwYWNrYWdlIGF0IHJ1bnRpbWUgKGl0cyBvd24gcGVlci1kZXBlbmRlbmN5IHJ1bGUpLiBTbyBpdCByZWFkcyB0aGVzZSBvZmZcbiAgICAgKiBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGluc3RlYWQsIGRlY2xhcmluZyB0aGUgc2hhcGUgbG9jYWxseS5cbiAgICAgKlxuICAgICAqIFRoZXNlIGFyZSB0aGUgKipzYW1lIGZ1bmN0aW9uIG9iamVjdHMqKiBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnLCBub3Qgd3JhcHBlcnM6XG4gICAgICogZWFjaCBhbHJlYWR5IGJyYW5jaGVzIG9uIGBQbGF0Zm9ybS5pc01vYmlsZWAgaW50ZXJuYWxseSwgc28gdGhlIG1vYmlsZSBzZW1hbnRpY3MgbGl2ZSBpbiBleGFjdGx5IG9uZVxuICAgICAqIHBsYWNlIGFuZCBvbmUgc2VhbSBzZXJ2ZXMgYm90aCBwbGF0Zm9ybXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHJ1c3RlZElucHV0OiBUcnVzdGVkSW5wdXRIZWxwZXJzO1xuICB9XG5cbiAgaW50ZXJmYWNlIEV2YWxXcmFwcGVyUGFyYW1zIHtcbiAgICByZWFkb25seSBjYWxsYmFjazogKGZ1bmN0aW9uQXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgICByZWFkb25seSBjb250ZXh0SWQ/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZSB7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgZ2V0QmFzZVBhdGg/OiAoKSA9PiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSXBjU2VuZFN5bmNQYXJhbXMge1xuICAgIHJlYWRvbmx5IGNoYW5uZWw6IHN0cmluZztcbiAgICByZWFkb25seSBjaGFubmVsQXJndW1lbnRzOiB1bmtub3duW107XG4gIH1cblxuICAvLyBDb21tdW5pdHktcGx1Z2luIEFQSSBtZW1iZXJzIHRoYXQgb2xkIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuNi54KSBsYWNrLlxuICAvLyBgb2JzaWRpYW4tdHlwaW5nc2AgZGVjbGFyZXMgdGhlbSBhcyBhbHdheXMtcHJlc2VudCwgc28gcHJvYmUgdGhyb3VnaCB0aGlzXG4gIC8vIG9wdGlvbmFsLW1lbWJlciB2aWV3IHRvIGRldGVjdCB0aGVpciBydW50aW1lIGFic2VuY2Ugd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgUGx1Z2luc0xpa2Uge1xuICAgIGlzRW5hYmxlZD86ICgpID0+IGJvb2xlYW47XG4gICAgbG9hZFBsdWdpbj86IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIG1hbmlmZXN0cz86IHVua25vd247XG4gICAgdW5pbnN0YWxsUGx1Z2luPzogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gIH1cblxuICBpbnRlcmZhY2UgU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgfVxuXG4gIC8vIFRoZSBzaGFwZSBvZiB0aGUgYHRydXN0ZWRJbnB1dGAgc2VhbS4gRXZlcnkgbWVtYmVyIGlzIG9uZSBvZiB0aGUgTDE3LXN5bmNlZCBoZWxwZXJzLCBleHBvc2VkIGFzIHRoZVxuICAvLyBzYW1lIGZ1bmN0aW9uIG9iamVjdCBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnLlxuICBpbnRlcmZhY2UgVHJ1c3RlZElucHV0SGVscGVycyB7XG4gICAgY2xpY2tFbGVtZW50OiAoY2xpY2tQYXJhbXM6IENsaWNrRWxlbWVudFBhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBjbGlja01vdXNlOiAoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpID0+IFByb21pc2U8dm9pZD47XG4gICAgaG92ZXJFbGVtZW50OiAoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBtb3ZlTW91c2U6IChtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpID0+IFByb21pc2U8dm9pZD47XG4gICAgcHJlc3NLZXk6IChwcmVzc1BhcmFtczogUHJlc3NLZXlQYXJhbXMpID0+IFByb21pc2U8dm9pZD47XG4gICAgdHlwZUludG9FZGl0b3I6ICh0eXBlUGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICB1bmhvdmVyRWxlbWVudDogKHVuaG92ZXJQYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgLy8gYFZhdWx0LmNvbmZpZ0RpcmAgaXMgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQgYnkgYG9ic2lkaWFuLXR5cGluZ3NgLCBidXQgb2xkXG4gIC8vIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgaXQgdW5kZWZpbmVkIGF0IHJ1bnRpbWUuIFByb2JlIHRocm91Z2hcbiAgLy8gdGhpcyBvcHRpb25hbC1tZW1iZXIgdmlldyBzbyBhIGA/PyAnLm9ic2lkaWFuJ2AgZGVmYXVsdCBpcyBub3QgZmxhZ2dlZCBhcyBhblxuICAvLyB1bm5lY2Vzc2FyeSBjb25kaXRpb24uXG4gIGludGVyZmFjZSBWYXVsdExpa2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIFN0cnVjdHVyYWwgbWlycm9yIG9mIE9ic2lkaWFuJ3Mgb3duIGBWYXVsdC5jb25maWdEaXJgOyB0aGUgbmFtZSBoYXMgdG8gbWF0Y2ggZm9yIHRoZSBwcm9iZSB0byByZWFkIGl0LlxuICAgIGNvbmZpZ0Rpcj86IHN0cmluZztcbiAgfVxuXG4gIC8vIGB3aW5kb3cuYXBwYCAvIGBhcHAud29ya3NwYWNlYCBhcmUgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQsIGJ1dCBhcmUgdHJhbnNpZW50bHlcbiAgLy8gdW5kZWZpbmVkIGR1cmluZyBib290IGFuZCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLiBQcm9iZSB0aHJvdWdoIHRoZXNlXG4gIC8vIG9wdGlvbmFsLW1lbWJlciB2aWV3cyBzbyB0aGUgcmVhZGluZXNzIGNoZWNrIGNhbiBndWFyZCB0aGVtIHdpdGhvdXQgYSBmYWxzZVxuICAvLyBgbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uYC5cbiAgaW50ZXJmYWNlIFdvcmtzcGFjZUxpa2Uge1xuICAgIGxheW91dFJlYWR5PzogYm9vbGVhbjtcbiAgfVxuXG4gIGludGVyZmFjZSBBcHBMaWtlIHtcbiAgICB3b3Jrc3BhY2U/OiBXb3Jrc3BhY2VMaWtlO1xuICB9XG5cbiAgdHlwZSBDdXJyZW50V2ViQ29udGVudHMgPSBSZXR1cm5UeXBlPFdpbmRvd1snZWxlY3Ryb24nXVsncmVtb3RlJ11bJ2dldEN1cnJlbnRXZWJDb250ZW50cyddPjtcblxuICAvLyBUaGUgRWxlY3Ryb24gbW9kaWZpZXIta2V5IG5hbWVzIGBzZW5kSW5wdXRFdmVudGAgYWNjZXB0cyAoZS5nLiAnbWV0YScsICdjb250cm9sJywgJ3NoaWZ0JywgJ2FsdCcpLlxuICAvLyBEZXJpdmVkIGZyb20gdGhlIHdlYi1jb250ZW50cyB0eXBlIHNvIGl0IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgRWxlY3Ryb24gdHlwaW5ncy5cbiAgdHlwZSBFbGVjdHJvbk1vZGlmaWVyID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczxDdXJyZW50V2ViQ29udGVudHNbJ3NlbmRJbnB1dEV2ZW50J10+WzBdWydtb2RpZmllcnMnXT5bbnVtYmVyXTtcblxuICBpbnRlcmZhY2UgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0ge1xuICAgIFBsYXRmb3JtOiBPYnNpZGlhblBsYXRmb3JtO1xuICB9XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuUGxhdGZvcm0ge1xuICAgIGlzTWFjT1M6IGJvb2xlYW47XG4gICAgaXNNb2JpbGU6IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogQSB0cnVzdGVkLWlucHV0IHJlcXVlc3QgaGFuZGVkIHRvIHRoZSBob3N0IG92ZXIgdGhlIGBSdW50aW1lLmFkZEJpbmRpbmdgIGNoYW5uZWwuXG4gICAqXG4gICAqIFN0cnVjdHVyYWxseSBpZGVudGljYWwgdG8gYE1vYmlsZUlucHV0UmVxdWVzdGAgaW4gYG1vYmlsZS1pbnB1dC50c2AsIHJlZGVjbGFyZWQgaGVyZSBiZWNhdXNlIHRoaXNcbiAgICogY2xvc3VyZSBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGNhbm5vdCBpbXBvcnQgKCoqTDE1KiopLiBUaGUgdHdvIGFyZSBvbmUgd2lyZSBmb3JtYXQ7IGNoYW5nZVxuICAgKiB0aGVtIHRvZ2V0aGVyLlxuICAgKi9cbiAgdHlwZSBNb2JpbGVJbnB1dFJlcXVlc3QgPSBNb2JpbGVLZXlJbnB1dFJlcXVlc3QgfCBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0O1xuXG4gIGludGVyZmFjZSBNb2JpbGVLZXlJbnB1dFJlcXVlc3Qge1xuICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGtpbmQ6ICdrZXknO1xuICAgIHJlYWRvbmx5IG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW107XG4gIH1cblxuICBpbnRlcmZhY2UgTW9iaWxlUG9pbnRlcklucHV0UmVxdWVzdCB7XG4gICAgcmVhZG9ubHkga2luZDogJ2xvbmdQcmVzcycgfCAndGFwJztcbiAgICByZWFkb25seSBtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIHJlYWRvbmx5IHg6IG51bWJlcjtcbiAgICByZWFkb25seSB5OiBudW1iZXI7XG4gIH1cblxuICBpbnRlcmZhY2UgUGVuZGluZ0lucHV0IHtcbiAgICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gICAgcmVzb2x2ZTogKCkgPT4gdm9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxheSAoaW4gbXMpIGJlZm9yZSBpbnZva2luZyBgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpYCBzbyB0aGUgZXZhbCB0aGF0XG4gICAqIHRyaWdnZXJlZCB0aGUgY2FsbCBoYXMgdGltZSB0byByZXR1cm4gaXRzIHJlc3VsdCB0byB0aGUgY2FsbGVyLiBXaXRob3V0XG4gICAqIGl0IHRoZSByZW5kZXJlciBkaWVzIGJlZm9yZSB0aGUgSVBDIHJlcGx5IHNoaXBzLCB0aGUgY2FsbGVyIHdhaXRzIGZvciB0aGVcbiAgICogZnVsbCBldmFsIHRpbWVvdXQsIGFuZCBzdGFsZSBgQnJvd3NlcldpbmRvd2AgZW50cmllcyBwaWxlIHVwLlxuICAgKi9cbiAgY29uc3QgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHBvbGxzIHdoaWxlIHdhaXRpbmcgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0b1xuICAgKiB0YWtlIGVmZmVjdCAodGhlIGVkaXRvciBkb2N1bWVudCB1cGRhdGVzLCBvciBhbiBlbGVtZW50J3MgYDpob3ZlcmAgc3RhdGVcbiAgICogZmxpcHMpLiBTaGFyZWQgYnkgZXZlcnkgdHJ1c3RlZC1pbnB1dCBoZWxwZXIuXG4gICAqL1xuICBjb25zdCBJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgKGluIG1zKSB0byB3YWl0IGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG8gdGFrZSBlZmZlY3RcbiAgICogYmVmb3JlIGdpdmluZyB1cCAodGhlIGV4cGVjdGVkIG91dGNvbWUgd2hlbiB0aGUgaW5wdXQgaXMgcmVqZWN0ZWQgXHUyMDE0IGUuZy4gYVxuICAgKiByZWFkLW9ubHkgZWRpdG9yLCBvciBhIHBvaW50ZXIgbW92ZSB0aGF0IG5ldmVyIGxhbmRzIG9uIHRoZSBlbGVtZW50KS5cbiAgICovXG4gIGNvbnN0IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgb3BlblNldHRpbmdzVGFifSB3YWl0cyBmb3IgdGhlIHNldHRpbmdzXG4gICAqIG1vZGFsIHRvIG9wZW4gYW5kIGZvciB0aGUgcmVxdWVzdGVkIHRhYiB0byByZW5kZXIsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdFxuICAgKiBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFNFVFRJTkdTX1RBQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHtAbGluayB3YWl0VW50aWx9IHByZWRpY2F0ZSBjaGVja3Mgd2hlbiB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayB3YWl0VW50aWx9IHdhaXRzIGZvciBpdHMgcHJlZGljYXRlIHRvXG4gICAqIGJlY29tZSB0cnV0aHkgYmVmb3JlIHJlamVjdGluZywgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRpbWVzIHtAbGluayBjcmVhdGVOb3RlfSByZXdyaXRlcyBhIG5vdGUgd2hvc2UgY29udGVudCBkaWQgbm90XG4gICAqIHJlYWNoIHRoZSBmaWxlc3lzdGVtIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIFRoZSBBbmRyb2lkIGVtdWxhdG9yIGxvc2VzIHJvdWdobHkgMSB3cml0ZSBpbiAxMTAsIHNvIGEgc2luZ2xlIHJlcGFpclxuICAgKiBhbHJlYWR5IG1ha2VzIGEgbG9zdCBub3RlIGFzdHJvbm9taWNhbGx5IHVubGlrZWx5OyB0aGUgZXh0cmEgYXR0ZW1wdHMgY29zdFxuICAgKiBub3RoaW5nIHdoZW4gbm90aGluZyBpcyBsb3N0LCBhbmQgdGhlIGNhcCBpcyB3aGF0IGtlZXBzIGEgZ2VudWluZWx5IGJyb2tlblxuICAgKiB3cml0ZSBmcm9tIGJlaW5nIHJldHJpZWQgZm9yZXZlciBpbnN0ZWFkIG9mIGZhaWxpbmcgd2l0aCBhIHJlYWRhYmxlIGVycm9yLlxuICAgKi9cbiAgY29uc3QgQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQgPSAzO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPjtcbiAgY29uc3QgZXhpc3RpbmdDb250ZXh0cyA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5jb250ZXh0cyA/PyB7fTtcbiAgY29uc3QgZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5vYnNpZGlhbk1vZHVsZTtcbiAgLy8gV2FybiBhdCBtb3N0IG9uY2UgcGVyIGJvb3RzdHJhcCB0aGF0IGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgIG9uIHRoaXMgdmVyc2lvbi5cbiAgbGV0IGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IGZhbHNlO1xuXG4gIC8vIEluLWZsaWdodCBtb2JpbGUgaW5wdXQgcmVxdWVzdHMsIGtleWVkIGJ5IHJlcXVlc3QgaWQsIGF3YWl0aW5nIHRoZSBob3N0J3MgYW5zd2VyIHZpYSBgcmVzb2x2ZUlucHV0YC5cbiAgY29uc3QgcGVuZGluZ0lucHV0cyA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nSW5wdXQ+KCk7XG4gIGxldCBuZXh0SW5wdXRJZCA9IDA7XG5cbiAgLy8gUmVxdWVzdCBpZHMgYWxyZWFkeSBjbGFpbWVkIGJ5IHNvbWUgaG9zdCwgc28gYSBzZWNvbmQgYXR0YWNoZWQgaG9zdCBkb2VzIG5vdCBpbmplY3QgdGhlIGdlc3R1cmUgYVxuICAvLyBzZWNvbmQgdGltZSBcdTIwMTQgc2VlIGBjbGFpbUlucHV0YC4gSWRzIGFyZSBtb25vdG9uaWMgd2l0aGluIGEgcGFnZSwgc28gdGhpcyBvbmx5IGdyb3dzIGFzIGZhc3QgYXMgdGhlXG4gIC8vIHJ1biBkcml2ZXMgaW5wdXQsIGFuZCBpdCBkaWVzIHdpdGggdGhlIHBhZ2UuXG4gIGNvbnN0IGNsYWltZWRJbnB1dElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IG5zOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UgPSB7XG4gICAgZ2V0IGFwcCgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBgYXBwYCBnZXR0ZXIgcmVhZHMgYHdpbmRvdy5hcHBgIHdoaWNoIGlzIHNldCBieSBPYnNpZGlhbi5cbiAgICAgIHJldHVybiBnbG9iYWxUaGlzLmFwcDtcbiAgICB9LFxuXG4gICAgY2xhaW1JbnB1dCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIGlmIChjbGFpbWVkSW5wdXRJZHMuaGFzKGlkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNsYWltZWRJbnB1dElkcy5hZGQoaWQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIGNvbnRleHRzOiBleGlzdGluZ0NvbnRleHRzLFxuXG4gICAgYXN5bmMgZGVzdHJveUN1cnJlbnRXaW5kb3codGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgIGNvbnN0IGVsZWN0cm9uV2luZG93ID0gZ2xvYmFsVGhpcy5lbGVjdHJvbldpbmRvdztcbiAgICAgIGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKTtcbiAgICAgIH0sIERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZW5zdXJlTGF5b3V0UmVhZHkodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBlcnJvclRvU3RyaW5nKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbFdyYXBwZXIodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gT2xkIE9ic2lkaWFuIChlLmcuIDAuNi54KSBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEk6IGBwbHVnaW5zYFxuICAgICAgLy8gZXhpc3RzIGJ1dCBoYXMgbm8gYGlzRW5hYmxlZGAvYHNldEVuYWJsZWAsIGFuZCB0aGVyZSBhcmUgbm8gdGhpcmQtcGFydHlcbiAgICAgIC8vIHBsdWdpbnMgdG8gZW5hYmxlLCBzbyBza2lwIHRoaXMgc3RlcCB3aGVuIHRoZSBBUEkgaXMgYWJzZW50LlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zLmlzRW5hYmxlZCAmJiAhcGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2lkaWFuTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRPYnNpZGlhbk1vZHVsZSgpO1xuICAgICAgLy8gQXZvaWQgYD8/PWA6IG9sZCBPYnNpZGlhbidzIENocm9taXVtIChlLmcuIDAuNi54IG9uIENocm9taXVtIDgwKSBwcmVkYXRlc1xuICAgICAgLy8gRVMyMDIxIGxvZ2ljYWwtYXNzaWdubWVudCBhbmQgY2Fubm90IHBhcnNlIGl0IGluIHRoaXMgc2VyaWFsaXplZCBib290c3RyYXAuXG4gICAgICBsZXQgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGlmIChwYXJhbXMuY29udGV4dElkKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGV4dCA9IHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF07XG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBjb250ZXh0ID0gZXhpc3RpbmdDb250ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPSBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5qZWN0ZWQgYGxpYmAgYmFnOiBiYXNlIGhlbHBlcnMgZnJvbSB0aGUgaGFybmVzcywgdGhlbiBwcm92aWRlcnMgb24gdG9wLlxuICAgICAgLy8gUmVzb2x2ZXJzIHJ1biBpbi1yZW5kZXJlciAodGhleSByZWFkIHJlbmRlcmVyIGdsb2JhbHMgYSBwcm92aWRlciBwdWJsaXNoZWQpLlxuICAgICAgLy8gUmVidWlsZGluZyBwZXIgZXZhbCBrZWVwcyBgbGliYCBmcmVzaCBhbmQgdG9sZXJhbnQgb2YgYSBsYXRlLWxvYWRlZCBwcm92aWRlci5cbiAgICAgIGNvbnN0IGxpYiA9IHtcbiAgICAgICAgY2xpY2tFbGVtZW50LFxuICAgICAgICBjbGlja01vdXNlLFxuICAgICAgICBjcmVhdGVOb3RlLFxuICAgICAgICBob3ZlckVsZW1lbnQsXG4gICAgICAgIG1vdmVNb3VzZSxcbiAgICAgICAgb3BlblNldHRpbmdzVGFiLFxuICAgICAgICBwcmVzc0tleSxcbiAgICAgICAgdHlwZUludG9FZGl0b3IsXG4gICAgICAgIHVuaG92ZXJFbGVtZW50LFxuICAgICAgICB3YWl0VW50aWxcbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IHJlc29sdmVMaWIgb2YgdGhpcy5saWJSZXNvbHZlcnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihsaWIsIHJlc29sdmVMaWIoKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmdWxsQXJndW1lbnRzID0geyAuLi5wYXJhbXMuaW5wdXQsIGFwcDogdGhpcy5hcHAsIGNvbnRleHQsIGxpYiwgb2JzaWRpYW5Nb2R1bGUgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhcmFtcy5jYWxsYmFjayhmdWxsQXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAndW5kZWZpbmVkJyB9KSA6IEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHJlc3VsdCB9KTtcbiAgICAgIH0gY2F0Y2ggKGV2YWxFcnJvcikge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXJyb3InLCB2YWx1ZTogdGhpcy5lcnJvclRvU3RyaW5nKGV2YWxFcnJvcikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9ic2lkaWFuTW9kdWxlKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgaWYgKHRoaXMub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5Nb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSB0ZW1wLXBsdWdpbiB0cmljayBiZWxvdyByZXNvbHZlcyBgcmVxdWlyZSgnb2JzaWRpYW4nKWAsIHdoaWNoIG9ubHlcbiAgICAgIC8vIHdvcmtzIGluc2lkZSBhIHBsdWdpbi1sb2FkIGNvbnRleHQuIEl0IG5lZWRzIHRoZSBjb21tdW5pdHktcGx1Z2luIHJlZ2lzdHJ5XG4gICAgICAvLyAoYGxvYWRQbHVnaW5gICsgYG1hbmlmZXN0c2ApLCB3aGljaCBGSVJTVCBhcHBlYXJzIGluIE9ic2lkaWFuIDAuOS43OyB0aGVcbiAgICAgIC8vIDAuNi40LTAuOS42IGJhbmQgaGFzIG5vIHJlZ2lzdHJ5IGFuZCBjYW5ub3QgcnVuIGl0LCBzbyByZXR1cm4gYG51bGxgIChub3RcbiAgICAgIC8vIGB1bmRlZmluZWRgKSAtIGFwcC1vbmx5IGNsb3N1cmVzIChgY2FsbGJhY2soeyBhcHAgfSlgKSBzdGlsbCBydW4uXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gcHJvYmUgdGhlIHJ1bnRpbWUtb3B0aW9uYWwgY29tbXVuaXR5LXBsdWdpbiBBUEkuXG4gICAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5hcHAucGx1Z2lucyBhcyB1bmtub3duIGFzIFBsdWdpbnNMaWtlO1xuICAgICAgaWYgKCFwbHVnaW5zLmxvYWRQbHVnaW4gfHwgIXBsdWdpbnMubWFuaWZlc3RzKSB7XG4gICAgICAgIGlmICghaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgICAgaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nXSBgb2JzaWRpYW5Nb2R1bGVgIGlzIGBudWxsYDogdGhpcyBPYnNpZGlhbiB2ZXJzaW9uIHByZWRhdGVzIHRoZSBjb21tdW5pdHktcGx1Z2luIEFQSSAoYWRkZWQgaW4gMC45LjcpLCBzbyB0aGUgYG9ic2lkaWFuYCBtb2R1bGUgY2Fubm90IGJlIHJlc29sdmVkLiBBcHAtb25seSBjbG9zdXJlcyAoYGNhbGxiYWNrKHsgYXBwIH0pYCkgc3RpbGwgd29yay4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgU0xJQ0VfU1RBUlQgPSAyO1xuICAgICAgY29uc3QgcmFuZG9tU3VmZml4ID0gU3RyaW5nKE1hdGgucmFuZG9tKCkpLnNsaWNlKFNMSUNFX1NUQVJUKTtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeU1vZHVsZU5hbWUgPSBgZ2V0LW9ic2lkaWFuLW1vZHVsZS0ke3JhbmRvbVN1ZmZpeH1gO1xuICAgICAgLy8gT2xkIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgYHZhdWx0LmNvbmZpZ0RpcmAgdW5kZWZpbmVkOyBmYWxsIGJhY2sgdG9cbiAgICAgIC8vIE9ic2lkaWFuJ3MgZGVmYXVsdCBjb25maWcgZGlyIHNvIHRoZSB0ZW1wIHBsdWdpbiBzdGlsbCBnZXRzIGEgdmFsaWQgcGF0aCxcbiAgICAgIC8vIGxvYWRzLCBhbmQgaXRzIGByZXF1aXJlKCdvYnNpZGlhbicpYCByZXNvbHZlcyB0aGUgbW9kdWxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIGNvbmZpZ0RpciBpcyBydW50aW1lLW9wdGlvbmFsIG9uIG9sZCB2ZXJzaW9ucy5cbiAgICAgIGNvbnN0IGNvbmZpZ0RpcmVjdG9yeSA9ICh0aGlzLmFwcC52YXVsdCBhcyB1bmtub3duIGFzIFZhdWx0TGlrZSkuY29uZmlnRGlyID8/ICcub2JzaWRpYW4nO1xuICAgICAgY29uc3QgcGx1Z2luc0RpcmVjdG9yeSA9IGAke2NvbmZpZ0RpcmVjdG9yeX0vcGx1Z2luc2A7XG4gICAgICBjb25zdCBkaXJlY3RvcnkgPSBgJHtwbHVnaW5zRGlyZWN0b3J5fS8ke3RlbXBvcmFyeU1vZHVsZU5hbWV9YDtcbiAgICAgIHRoaXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzW3RlbXBvcmFyeU1vZHVsZU5hbWVdID0ge1xuICAgICAgICBhdXRob3I6ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBkaXJgIGlzIE9ic2lkaWFuJ3Mgb3duIGBQbHVnaW5NYW5pZmVzdGAgbWVtYmVyIG5hbWUuXG4gICAgICAgIGRpcjogZGlyZWN0b3J5LFxuICAgICAgICBpZDogdGVtcG9yYXJ5TW9kdWxlTmFtZSxcbiAgICAgICAgaXNEZXNrdG9wT25seTogZmFsc2UsXG4gICAgICAgIG1pbkFwcFZlcnNpb246ICcnLFxuICAgICAgICBuYW1lOiB0ZW1wb3JhcnlNb2R1bGVOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnJ1xuICAgICAgfTtcbiAgICAgIC8vIGBhZGFwdGVyLm1rZGlyYCBpcyBub3QgcmVjdXJzaXZlLCBhbmQgYW4gb2xkIHZlcnNpb24gb24gYSBmcmVzaCB2YXVsdCBtYXkgbm90XG4gICAgICAvLyBoYXZlIHRoZSBjb25maWcvcGx1Z2lucyBkaXJzIHlldCBcdTIwMTQgY3JlYXRlIHRoZSBjaGFpbiBzbyBgbG9hZFBsdWdpbmAgZmluZHMgdGhlXG4gICAgICAvLyB0ZW1wIHBsdWdpbiBhdCBgPGNvbmZpZ0Rpcj4vcGx1Z2lucy88aWQ+YC5cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGNvbmZpZ0RpcmVjdG9yeSkpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoY29uZmlnRGlyZWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBsdWdpbnNEaXJlY3RvcnkpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKHBsdWdpbnNEaXJlY3RvcnkpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2RpcihkaXJlY3RvcnkpO1xuXG4gICAgICBjb25zdCBwbHVnaW5GdW5jdGlvbkJvZHkgPSAnY29uc3Qgcj1yZXF1aXJlLGU9ZXhwb3J0cztjb25zdCBtPXIoXFwnb2JzaWRpYW5cXCcpO3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLm9ic2lkaWFuTW9kdWxlPW07ZS5kZWZhdWx0PW0uUGx1Z2luOyc7XG4gICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLndyaXRlKGAke2RpcmVjdG9yeX0vbWFpbi5qc2AsIHBsdWdpbkZ1bmN0aW9uQm9keSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMubG9hZFBsdWdpbih0ZW1wb3JhcnlNb2R1bGVOYW1lKTtcbiAgICAgIC8vIGB1bmluc3RhbGxQbHVnaW5gIGFycml2ZWQgYWZ0ZXIgdGhlIHBsdWdpbiBBUEkgaXRzZWxmLCBzbyBpdCBpcyBhYnNlbnQgb25cbiAgICAgIC8vIDAuOS43IC0gdGhlIEZJUlNUIHZlcnNpb24gdG8gZXhwb3NlIGBsb2FkUGx1Z2luYC9gbWFuaWZlc3RzYCAoMC45LjYgYW5kIGJlbG93XG4gICAgICAvLyBoYXZlIG5laXRoZXIsIGFuZCByZXR1cm4gYHVuZGVmaW5lZGAgYWJvdmUpLiBUaGUgbW9kdWxlIGlzIGFscmVhZHkgY2FwdHVyZWQgYnlcbiAgICAgIC8vIHRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgYXQgdGhpcyBwb2ludCwgc28gb25seSB1bmluc3RhbGwgd2hlbiB0aGUgbWV0aG9kIGV4aXN0cztcbiAgICAgIC8vIE9uIDAuOS43IHRoZSB0ZW1wIHBsdWdpbiBsaW5nZXJzIGhhcm1sZXNzbHkgaW4gdGhlIGVwaGVtZXJhbCBvd25lZCB2YXVsdC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB1bmluc3RhbGxQbHVnaW4gaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBwbHVnaW5zRm9yQ2xlYW51cCA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zRm9yQ2xlYW51cC51bmluc3RhbGxQbHVnaW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcG9yYXJ5TW9kdWxlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIG9ic2lkaWFuIG1vZHVsZScpO1xuICAgIH0sXG5cbiAgICBhc3luYyBpcGNTZW5kU3luYyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgZ2xvYmFsVGhpcy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmNoYW5uZWxBcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAvLyBgd2luZG93LmFwcGAsIGl0cyBgd29ya3NwYWNlYCwgYW5kIGxheW91dCBjYW4gYWxsIGJlIHRyYW5zaWVudGx5XG4gICAgICAvLyB1bmF2YWlsYWJsZSBkdXJpbmcgYm9vdCBvciByaWdodCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLCBhbmQgb2xkXG4gICAgICAvLyBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgLiBUaGlzIHJ1bnMgaW5zaWRlIHRoZSB0cmFuc3BvcnQnc1xuICAgICAgLy8gcmVhZGluZXNzIHBvbGwsIHdoaWNoIHJldHJpZXMgb24gdGhyb3csIHNvIGNoZWNrIGB3aW5kb3cuYXBwYCBGSVJTVCBhbmQgYmFpbFxuICAgICAgLy8gY2xlYW5seSB1bnRpbCBpdCwgaXRzIHdvcmtzcGFjZSwgYW5kIGxheW91dCBhcmUgYWxsIHJlYWR5IFx1MjAxNCBuZXZlciBkZXJlZmVyZW5jZVxuICAgICAgLy8gYW4gdW5kZWZpbmVkIGB3aW5kb3cuYXBwYC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB3aW5kb3cuYXBwL3dvcmtzcGFjZSBhcmUgcnVudGltZS1vcHRpb25hbCBkdXJpbmcgYm9vdC5cbiAgICAgIGNvbnN0IGFwcCA9IHRoaXMuYXBwIGFzIHVua25vd24gYXMgQXBwTGlrZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYXBwPy53b3Jrc3BhY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPd25lZCB2YXVsdCBpcyBub3QgcmVhZHkgeWV0ICh3aW5kb3cuYXBwL3dvcmtzcGFjZSBub3QgaW5pdGlhbGl6ZWQpLicpO1xuICAgICAgfVxuICAgICAgLy8gT2xkIE9ic2lkaWFuIHByZWRhdGVzIGBXb3Jrc3BhY2Uub25MYXlvdXRSZWFkeWAgYnV0IGhhcyBgbGF5b3V0UmVhZHkgPT09IHRydWVgXG4gICAgICAvLyBieSB0aGUgdGltZSBhIHdpbmRvdyBpcyB1cDsgb25seSB3YWl0IHZpYSBgZW5zdXJlTGF5b3V0UmVhZHlgIHdoZW4gaXQgaXMgbm90XG4gICAgICAvLyB5ZXQgcmVhZHkgKG1vZGVybiB2ZXJzaW9ucyBlYXJseSBpbiBib290KSwgc28gdGhlIG1pc3NpbmcgbWV0aG9kIGlzIG5ldmVyIGhpdC5cbiAgICAgIGlmICghYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyB1bmtub3duIGFzIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZTtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgcHJlZGF0ZSB0aGUgYGdldEJhc2VQYXRoKClgIG1ldGhvZCBidXRcbiAgICAgIC8vIGV4cG9zZSB0aGUgYGJhc2VQYXRoYCBwcm9wZXJ0eTsgdGhlIG1ldGhvZCBleGlzdHMgZnJvbSB+MC45LjIwIG9ud2FyZC5cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gYWRhcHRlci5nZXRCYXNlUGF0aCA/IGFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSA6IChhZGFwdGVyLmJhc2VQYXRoID8/ICcnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShiYXNlUGF0aCk7XG4gICAgfSxcblxuICAgIHJlc29sdmVJbnB1dCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogbnVsbCB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHBlbmRpbmdJbnB1dHMuZ2V0KGlkKTtcbiAgICAgIGlmICghcGVuZGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmdJbnB1dHMuZGVsZXRlKGlkKTtcbiAgICAgIGlmIChlcnJvck1lc3NhZ2UgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZy5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGVuZGluZy5yZWplY3QobmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBzZXRMb2NhbFN0b3JhZ2VJdGVtKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXJhbXMua2V5LCBwYXJhbXMudmFsdWUpO1xuICAgIH0sXG5cbiAgICAvLyBUaGUgc2FtZSBmdW5jdGlvbiBvYmplY3RzIGBldmFsV3JhcHBlcmAgcHV0cyBpbiBhIGNsb3N1cmUncyBgbGliYCBiYWcgXHUyMDE0IGRlbGliZXJhdGVseSBub3QgcmUtZGVyaXZlZFxuICAgIC8vIGFuZCBub3Qgd3JhcHBlZCwgc28gYG9ic2lkaWFuLWRldi11dGlsc2AgZ2V0cyBleGFjdGx5IHRoZSBoYXJuZXNzJ3MgYmVoYXZpb3Igb24gYm90aCBwbGF0Zm9ybXMuXG4gICAgdHJ1c3RlZElucHV0OiB7XG4gICAgICBjbGlja0VsZW1lbnQsXG4gICAgICBjbGlja01vdXNlLFxuICAgICAgaG92ZXJFbGVtZW50LFxuICAgICAgbW92ZU1vdXNlLFxuICAgICAgcHJlc3NLZXksXG4gICAgICB0eXBlSW50b0VkaXRvcixcbiAgICAgIHVuaG92ZXJFbGVtZW50XG4gICAgfSxcblxuICAgIHZlcnNpb246IGJvb3RzdHJhcFBhcmFtcy52ZXJzaW9uXG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gIChnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+KS5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nID0gbnM7XG5cbiAgYXN5bmMgZnVuY3Rpb24gdHlwZUludG9FZGl0b3IodHlwZVBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuXG4gICAgY29uc3QgeyBlZGl0b3IsIHRleHQgfSA9IHR5cGVQYXJhbXM7XG4gICAgY29uc3QgdmFsdWVCZWZvcmVUeXBpbmcgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblxuICAgIC8vIEZvY3VzIHRoZSBlZGl0b3IgYW5kIHBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICBjb25zdCBsYXN0TGluZSA9IGVkaXRvci5sYXN0TGluZSgpO1xuICAgIGVkaXRvci5zZXRDdXJzb3IobGFzdExpbmUsIGVkaXRvci5nZXRMaW5lKGxhc3RMaW5lKS5sZW5ndGgpO1xuXG4gICAgLy8gTGV0IGFueSBmb2N1cyB0cmFwIChhIGBzZXRUaW1lb3V0KDApYCByZS1mb2N1cykgZmlyZSBiZWZvcmUgdHlwaW5nLCBzbyBzdG9sZW4gZm9jdXMgaXMgZGV0ZWN0ZWQuXG4gICAgYXdhaXQgc2xlZXAoRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAvLyBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IGBwcmVzc0tleWAgaW5qZWN0cyB0aGUgc2FtZSB0cnVzdGVkXG4gICAgLy8gYGtleURvd25gIC0+IGBjaGFyYCAtPiBga2V5VXBgIGEgcmVhbCB1c2VyIHByb2R1Y2VzIFx1MjAxNCB0ZXh0IGxhbmRzIG9ubHkgaWYgdGhlIGVkaXRvciBob2xkcyBmb2N1cy5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dCkge1xuICAgICAgYXdhaXQgcHJlc3NLZXkoeyBrZXk6IGNoYXIgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlIGlucHV0IG9yIHRoZSB0aW1lb3V0IGVsYXBzZXMsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWRpdG9yLmdldFZhbHVlKCkgPT09IHZhbHVlQmVmb3JlVHlwaW5nICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRydWUgd2hlbiB0aGlzIGNsb3N1cmUgaXMgcnVubmluZyBpbiBPYnNpZGlhbiBNb2JpbGUgcmF0aGVyIHRoYW4gdGhlIEVsZWN0cm9uIGRlc2t0b3AgYXBwLlxuICAvLyBSZWFkaW5nIGBQbGF0Zm9ybWAgb2ZmIHRoZSByZXNvbHZlZCBvYnNpZGlhbiBtb2R1bGUgaXMgc2FmZSBoZXJlOiBgZXZhbFdyYXBwZXJgIGFsd2F5cyByZXNvbHZlcyB0aGF0XG4gIC8vIG1vZHVsZSBiZWZvcmUgYW55IGNhbGxiYWNrIGNhbiBydW4sIHdoaWNoIGlzIHRoZSBzYW1lIGd1YXJhbnRlZSBgdG9FbGVjdHJvbk1vZGlmaWVyc2AgcmVsaWVzIG9uLlxuICBmdW5jdGlvbiBjaGVja0lzTW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTW9iaWxlO1xuICB9XG5cbiAgLy8gSGFuZHMgb25lIHRydXN0ZWQtaW5wdXQgcmVxdWVzdCB0byB0aGUgaG9zdCBhbmQgd2FpdHMgZm9yIGl0IHRvIGJlIGluamVjdGVkLlxuICAvL1xuICAvLyBNb2JpbGUgaGFzIG5vIGluLXJlbmRlcmVyIHJvdXRlIHRvIGEgdHJ1c3RlZCBldmVudCBhdCBhbGwgXHUyMDE0IGBkaXNwYXRjaEV2ZW50YCBhbmQgYGVsZW1lbnQuY2xpY2soKWAgYXJlXG4gIC8vIGBpc1RydXN0ZWQgPT09IGZhbHNlYCBieSBzcGVjIFx1MjAxNCBzbyB0aGUgaW5qZWN0aW9uIGhhcyB0byBoYXBwZW4gZnJvbSB0aGUgTm9kZSBzaWRlLCBvdmVyIGEgQ0RQXG4gIC8vIGNvbm5lY3Rpb24gaW5kZXBlbmRlbnQgb2YgdGhlIEFwcGl1bSBzZXNzaW9uIHRoYXQgaXMgY3VycmVudGx5IGJsb2NrZWQgYXdhaXRpbmcgdGhpcyB2ZXJ5IGNsb3N1cmVcbiAgLy8gKHNlZSBMMzkpLiBgYmluZGluZ05hbWVgIGlzIGEgaG9zdC1pbnN0YWxsZWQgZ2xvYmFsOyBjYWxsaW5nIGl0IGRlbGl2ZXJzIHRoZSByZXF1ZXN0LCBhbmQgdGhlIGhvc3RcbiAgLy8gYW5zd2VycyBieSBjYWxsaW5nIGBucy5yZXNvbHZlSW5wdXRgLlxuICBhc3luYyBmdW5jdGlvbiByZXF1ZXN0SG9zdElucHV0KHJlcXVlc3Q6IE1vYmlsZUlucHV0UmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJpbmRpbmdOYW1lID0gYm9vdHN0cmFwUGFyYW1zLmlucHV0QmluZGluZ05hbWU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGNhc3Q6IHRoZSBiaW5kaW5nIGlzIGluc3RhbGxlZCBieSB0aGUgaG9zdCBhdCBydW50aW1lIHZpYSBgUnVudGltZS5hZGRCaW5kaW5nYCwgc28gaXQgY2Fubm90IGJlIGRlY2xhcmVkIG9uIGBXaW5kb3dgLlxuICAgIGNvbnN0IGJpbmRpbmcgPSAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtiaW5kaW5nTmFtZV0gYXMgKChwYXlsb2FkOiBzdHJpbmcpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgYmluZGluZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYFRydXN0ZWQgaW5wdXQgaXMgdW5hdmFpbGFibGU6IHRoZSBob3N0IGhhcyBub3QgaW5zdGFsbGVkIHRoZSBcXGAke2JpbmRpbmdOYW1lfVxcYCBjaGFubmVsLiBgXG4gICAgICAgICAgKyAnT24gbW9iaWxlIHRoZXNlIGhlbHBlcnMgcmVxdWlyZSB0aGUgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyBBcHBpdW0gdHJhbnNwb3J0LidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbmV4dElucHV0SWQrKztcbiAgICBjb25zdCBpZCA9IFN0cmluZyhuZXh0SW5wdXRJZCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBwZW5kaW5nSW5wdXRzLnNldChpZCwgeyByZWplY3QsIHJlc29sdmUgfSk7XG4gICAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIXBlbmRpbmdJbnB1dHMuaGFzKGlkKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBlbmRpbmdJbnB1dHMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGhlIGhvc3QgZGlkIG5vdCBzZXJ2aWNlIHRoZSB0cnVzdGVkIGlucHV0IHJlcXVlc3Qgd2l0aGluICR7U3RyaW5nKGJvb3RzdHJhcFBhcmFtcy5pbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuYCkpO1xuICAgICAgfSwgYm9vdHN0cmFwUGFyYW1zLmlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzKTtcblxuICAgICAgYmluZGluZyhKU09OLnN0cmluZ2lmeSh7IGlkLCByZXF1ZXN0IH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEEgcG9pbnRlciBoZWxwZXIgdGhhdCBoYXMgbm8gdG91Y2ggYW5hbG9nIGlzIGEgaGFyZCBlcnJvciwgbmV2ZXIgYSBzaWxlbnQgbm8tb3A6IGA6aG92ZXJgIGRvZXMgbm90XG4gIC8vIGV4aXN0IG9uIHRvdWNoLCBzbyBhIHRlc3QgdGhhdCBcImhvdmVyZWRcIiBhbmQgdGhlbiBhc3NlcnRlZCB3b3VsZCBwYXNzIHdoaWxlIGV4ZXJjaXNpbmcgbm90aGluZyBcdTIwMTRcbiAgLy8gZXhhY3RseSB0aGUgZmFsc2UtY29uZmlkZW5jZSBmYWlsdXJlIHRoZSB0cnVzdGVkLWlucHV0IHdvcmsgZXhpc3RzIHRvIGVuZC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIEl0IGNhbm5vdCBtb3ZlIHRvIHRoZSBvdXRlciBzY29wZTogdGhpcyB3aG9sZSBmdW5jdGlvbiBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIG1heSBub3QgcmVmZXJlbmNlIGFueXRoaW5nIG91dHNpZGUgaXRzZWxmIChMMTUpLlxuICBmdW5jdGlvbiB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoaGVscGVyTmFtZTogc3RyaW5nKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBcXGAke2hlbHBlck5hbWV9XFxgIGhhcyBubyBtZWFuaW5nIG9uIG1vYmlsZTogdG91Y2ggaW5wdXQgaGFzIG5vIGhvdmVyIHN0YXRlLiBgXG4gICAgICAgICsgJ0JyYW5jaCBvbiBgUGxhdGZvcm0uaXNEZXNrdG9wQXBwYCwgb3IgZHJpdmUgdGhlIGVsZW1lbnQgd2l0aCBgY2xpY2tFbGVtZW50YCBpbnN0ZWFkLidcbiAgICApO1xuICB9XG5cbiAgLy8gRGVzY3JpYmVzIGFuIGVsZW1lbnQgZm9yIGFuIGVycm9yIG1lc3NhZ2U6IGl0cyB0YWcgYW5kIGNsYXNzZXMsIHdoaWNoIGlzIHdoYXQgYSByZWFkZXIgZ3JlcHMgZm9yLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWZ1bmN0aW9uLXNjb3BpbmcgLS0gSXQgY2Fubm90IG1vdmUgdG8gdGhlIG91dGVyIHNjb3BlOiB0aGlzIHdob2xlIGZ1bmN0aW9uIGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgbWF5IG5vdCByZWZlcmVuY2UgYW55dGhpbmcgb3V0c2lkZSBpdHNlbGYgKEwxNSkuXG4gIGZ1bmN0aW9uIGRlc2NyaWJlRWxlbWVudChlbGVtZW50OiBFbGVtZW50IHwgbnVsbCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IFsuLi4oZWxlbWVudD8uY2xhc3NMaXN0ID8/IFtdKV0ubWFwKChjbGFzc05hbWUpID0+IGAuJHtjbGFzc05hbWV9YCkuam9pbignJyk7XG4gICAgY29uc3Qgc3VmZml4ID0gY2xhc3NOYW1lcyA/IGAgJHtjbGFzc05hbWVzfWAgOiAnJztcbiAgICByZXR1cm4gZWxlbWVudCA/IGA8JHtlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKX0ke3N1ZmZpeH0+YCA6ICdub3RoaW5nJztcbiAgfVxuXG4gIC8vIFRoZSBmaW5pdGUgYW5pbWF0aW9ucyBhbmQgdHJhbnNpdGlvbnMgbm93IG1vdmluZyB0aGUgZWxlbWVudCBvciBhbnkgYW5jZXN0b3Igb2YgaXQuIEFuIGluZmluaXRlIG9uZSAoYVxuICAvLyBzcGlubmVyKSBuZXZlciBlbmRzLCBzbyB3YWl0aW5nIG9uIGl0IHdvdWxkIG9ubHkgZXZlciB0aW1lIG91dCwgYW5kIGl0IGlzIGxlZnQgb3V0LlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWZ1bmN0aW9uLXNjb3BpbmcgLS0gSXQgY2Fubm90IG1vdmUgdG8gdGhlIG91dGVyIHNjb3BlOiB0aGlzIHdob2xlIGZ1bmN0aW9uIGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgbWF5IG5vdCByZWZlcmVuY2UgYW55dGhpbmcgb3V0c2lkZSBpdHNlbGYgKEwxNSkuXG4gIGZ1bmN0aW9uIGdldE1vdmluZ0FuaW1hdGlvbnMoZWxlbWVudDogRWxlbWVudCk6IEFuaW1hdGlvbltdIHtcbiAgICByZXR1cm4gdHlwZW9mIGRvY3VtZW50LmdldEFuaW1hdGlvbnMgPT09ICdmdW5jdGlvbidcbiAgICAgID8gZG9jdW1lbnQuZ2V0QW5pbWF0aW9ucygpLmZpbHRlcigoYW5pbWF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGVmZmVjdCA9IGFuaW1hdGlvbi5lZmZlY3Q7XG4gICAgICAgIGNvbnN0IGlzQWN0aXZlID0gYW5pbWF0aW9uLnBsYXlTdGF0ZSA9PT0gJ3J1bm5pbmcnIHx8IGFuaW1hdGlvbi5wZW5kaW5nO1xuICAgICAgICBjb25zdCBpc09uRWxlbWVudE9yQW5jZXN0b3IgPSBlZmZlY3QgaW5zdGFuY2VvZiBLZXlmcmFtZUVmZmVjdCAmJiBlZmZlY3QudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlZmZlY3QudGFyZ2V0LmNvbnRhaW5zKGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gaXNBY3RpdmUgJiYgaXNPbkVsZW1lbnRPckFuY2VzdG9yICYmIGVmZmVjdC5nZXRDb21wdXRlZFRpbWluZygpLmVuZFRpbWUgIT09IEluZmluaXR5O1xuICAgICAgfSlcbiAgICAgIDogW107XG4gIH1cblxuICAvKlxuICAgKiBXYWl0cyB1bnRpbCBub3RoaW5nIGlzIG1vdmluZyB0aGUgZWxlbWVudCwgc28gYSBtb2JpbGUgdGFwIGxhbmRzIHdoZXJlIHRoZSBlbGVtZW50IHdpbGwgYmUgcmF0aGVyIHRoYW5cbiAgICogd2hlcmUgaXQgd2FzLiBUaGUgdGFwIGlzIGluamVjdGVkIGZyb20gdGhlIGhvc3QgYW5kIHJlYWNoZXMgdGhlIHBhZ2UgfjEgcyBhZnRlciB0aGlzIHJldHVybnMsIHdoaWNoIGlzXG4gICAqIGxvbmcgZW5vdWdoIGZvciBhIHNsaWRpbmcgbW9kYWwgdG8gY2FycnkgaXRzIGNvbnRyb2xzIGF3YXkgZnJvbSB0aGUgcG9pbnQgdGhhdCB3YXMgcmVhZC5cbiAgICpcbiAgICogVGhlIHNpZ25hbCBpcyB0aGUgQU5JTUFUSU9OUywgbm90IHRoZSByZWN0LiBNZWFzdXJlZCBvbiB0aGUgYG9ic2lkaWFuX3Rlc3RgIGVtdWxhdG9yICgyMDI2LTA5LTI0KTpcbiAgICogT2JzaWRpYW4gTW9iaWxlIG9wZW5zIGEgbW9kYWwgYXQgYHRyYW5zbGF0ZVkoMTE1cHgpYCB3aXRoIGEgYHRyYW5zZm9ybWAgdHJhbnNpdGlvbiB0aGF0IHJlcG9ydHNcbiAgICogYHJ1bm5pbmdgIHdoaWxlIHRoZSBib3ggZG9lcyBub3QgbW92ZSBhdCBhbGwgXHUyMDE0IGZvciB+MTAwIG1zIG5vcm1hbGx5LCBhbmQgZm9yIG92ZXIgMS41IHMgb24gdGhlIGZpcnN0XG4gICAqIG1vZGFsIGFmdGVyIGEgYm9vdC4gQSBydWxlIG9mIFwidGhlIHJlY3QgaGFzIGhlbGQgc3RpbGxcIiBpcyBzYXRpc2ZpZWQgdGhyb3VnaG91dCB0aGF0IGhvbGQsIGF0IHRoZSB3cm9uZ1xuICAgKiBwb2ludC4gVGhlIHJlY3QgaXMgc3RpbGwgcmVxdWlyZWQgdG8gaG9sZCBhY3Jvc3MgdHdvIHJlYWRzLCBmb3IgbGF5b3V0IHRoYXQgbW92ZXMgd2l0aG91dCBhbmltYXRpbmcuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yRWxlbWVudFRvU2V0dGxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgcHJldmlvdXNSZWN0S2V5ID0gJyc7XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHJlY3RLZXkgPSBgJHtTdHJpbmcocmVjdC5sZWZ0KX0sJHtTdHJpbmcocmVjdC50b3ApfSwke1N0cmluZyhyZWN0LndpZHRoKX0sJHtTdHJpbmcocmVjdC5oZWlnaHQpfWA7XG4gICAgICBjb25zdCBtb3ZpbmdBbmltYXRpb25zID0gZ2V0TW92aW5nQW5pbWF0aW9ucyhlbGVtZW50KTtcblxuICAgICAgaWYgKG1vdmluZ0FuaW1hdGlvbnMubGVuZ3RoID09PSAwICYmIHJlY3RLZXkgPT09IHByZXZpb3VzUmVjdEtleSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID49IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbnMgPSBtb3ZpbmdBbmltYXRpb25zLm1hcCgoYW5pbWF0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWZmZWN0ID0gYW5pbWF0aW9uLmVmZmVjdCBhcyBLZXlmcmFtZUVmZmVjdDtcbiAgICAgICAgICBsZXQgbmFtZSA9ICdhbmltYXRpb24nO1xuICAgICAgICAgIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBDU1NUcmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBuYW1lID0gYHRyYW5zaXRpb24gb2YgXFxgJHthbmltYXRpb24udHJhbnNpdGlvblByb3BlcnR5fVxcYGA7XG4gICAgICAgICAgfSBlbHNlIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBDU1NBbmltYXRpb24pIHtcbiAgICAgICAgICAgIG5hbWUgPSBgYW5pbWF0aW9uIFxcYCR7YW5pbWF0aW9uLmFuaW1hdGlvbk5hbWV9XFxgYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGBhICR7bmFtZX0gb24gJHtkZXNjcmliZUVsZW1lbnQoZWZmZWN0LnRhcmdldCl9YDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gcmVhc29ucy5sZW5ndGggPiAwID8gYCR7cmVhc29ucy5qb2luKCcsICcpfSB3YXMgcnVubmluZ2AgOiAnaXRzIGJveCBrZXB0IGNoYW5naW5nJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBcXGBjbGlja0VsZW1lbnRcXGAgZGlkIG5vdCB0YXAgJHtkZXNjcmliZUVsZW1lbnQoZWxlbWVudCl9OiBpdCB3YXMgc3RpbGwgbW92aW5nIGFmdGVyICR7U3RyaW5nKElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcyAoJHtjYXVzZX0pLiBgXG4gICAgICAgICAgICArICdBIHRhcCBhaW1lZCBhdCBpdCBub3cgd291bGQgbGFuZCB3aGVyZSBpdCB1c2VkIHRvIGJlLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNSZWN0S2V5ID0gcmVjdEtleTtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgKiBSZWZ1c2VzIHRvIHRhcCBhIHBvaW50IHRoYXQgYmVsb25ncyB0byBzb21ldGhpbmcgZWxzZS4gQSB0cnVzdGVkIHRhcCBnb2VzIHRvIHdoYXRldmVyIGlzIG9uIHRvcCwgc28gYVxuICAgKiBjb3ZlcmVkIGVsZW1lbnQgd291bGQgb3RoZXJ3aXNlIGhhdmUgaXRzIGNvdmVyIHRhcHBlZCBpbnN0ZWFkIFx1MjAxNCBgLm1vZGFsLWJnYCwgc2F5LCB3aGljaCBjbG9zZXMgdGhlXG4gICAqIG1vZGFsIFx1MjAxNCB3aGlsZSBgY2xpY2tFbGVtZW50YCByZXNvbHZlZCBhcyB0aG91Z2ggaXQgaGFkIGNsaWNrZWQuXG4gICAqL1xuICBmdW5jdGlvbiBhc3NlcnRDZW50ZXJIaXRzRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgcmVjdDogRE9NUmVjdCk6IHZvaWQge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcbiAgICBjb25zdCB4ID0gcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SO1xuICAgIGNvbnN0IHkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1I7XG4gICAgY29uc3QgaGl0RWxlbWVudCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgaWYgKGhpdEVsZW1lbnQgJiYgZWxlbWVudC5jb250YWlucyhoaXRFbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBcXGBjbGlja0VsZW1lbnRcXGAgZGlkIG5vdCB0YXAgJHtkZXNjcmliZUVsZW1lbnQoZWxlbWVudCl9OiB0aGUgcG9pbnQgYXQgaXRzIGNlbnRlciAoJHtTdHJpbmcoTWF0aC5yb3VuZCh4KSl9LCAke1N0cmluZyhNYXRoLnJvdW5kKHkpKX0pIGJlbG9uZ3MgdG8gYFxuICAgICAgICArIGAke2Rlc2NyaWJlRWxlbWVudChoaXRFbGVtZW50KX0sIHNvIHRoZSB0YXAgd291bGQgbGFuZCB0aGVyZSBpbnN0ZWFkLiBgXG4gICAgICAgICsgJ1dhaXQgdW50aWwgdGhlIGVsZW1lbnQgaXMgb24gdG9wLCBvciB1c2UgYGNsaWNrTW91c2VgIHRvIHRhcCB0aGF0IHBvaW50IGRlbGliZXJhdGVseS4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1hcHMgT2JzaWRpYW4ncyBgTW9kaWZpZXJgIG5hbWVzIHRvIEVsZWN0cm9uJ3MgbG93ZXJjYXNlIGBzZW5kSW5wdXRFdmVudGAgbW9kaWZpZXIgbmFtZXMuXG4gIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gIC8vIFNoYXJlZCBieSBldmVyeSB0cnVzdGVkLWlucHV0IGhlbHBlciwgc28gYSBrZXkgcHJlc3MgYW5kIGEgY2xpY2sgY2Fubm90IGRpc2FncmVlIG9uIGAnTW9kJ2AuXG4gIGZ1bmN0aW9uIHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzOiByZWFkb25seSBNb2RpZmllcltdKTogRWxlY3Ryb25Nb2RpZmllcltdIHtcbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayBjYW4gcnVuLlxuICAgIGNvbnN0IGlzTWFjT1MgPSAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTWFjT1M7XG5cbiAgICByZXR1cm4gbW9kaWZpZXJzLm1hcCgobW9kaWZpZXIpOiBFbGVjdHJvbk1vZGlmaWVyID0+IHtcbiAgICAgIHN3aXRjaCAobW9kaWZpZXIpIHtcbiAgICAgICAgY2FzZSAnQWx0Jzoge1xuICAgICAgICAgIHJldHVybiAnYWx0JztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDdHJsJzoge1xuICAgICAgICAgIHJldHVybiAnY29udHJvbCc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWV0YSc6IHtcbiAgICAgICAgICByZXR1cm4gJ21ldGEnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ01vZCc6IHtcbiAgICAgICAgICByZXR1cm4gaXNNYWNPUyA/ICdtZXRhJyA6ICdjb250cm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTaGlmdCc6IHtcbiAgICAgICAgICByZXR1cm4gJ3NoaWZ0JztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRXhoYXVzdGl2ZW5lc3MgZ3VhcmQ6IGFkZGluZyBhIGBNb2RpZmllcmAgbWVtYmVyIHdpdGhvdXQgYSBjYXNlIGFib3ZlIGJlY29tZXMgYSBjb21waWxlIGVycm9yLlxuICAgICAgICAgIGNvbnN0IHVua25vd25Nb2RpZmllcjogbmV2ZXIgPSBtb2RpZmllcjtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbW9kaWZpZXI6ICR7U3RyaW5nKHVua25vd25Nb2RpZmllcil9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsaWNrTW91c2UoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBTSU5HTEVfQ0xJQ0tfQ09VTlQgPSAxO1xuXG4gICAgY29uc3QgeyBidXR0b24gPSAnbGVmdCcsIG1vZGlmaWVycyA9IFtdLCB4LCB5IH0gPSBjbGlja1BhcmFtcztcblxuICAgIGNvbnN0IGVsZWN0cm9uTW9kaWZpZXJzID0gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnMpO1xuICAgIGNvbnN0IHJvdW5kZWRYID0gTWF0aC5yb3VuZCh4KTtcbiAgICBjb25zdCByb3VuZGVkWSA9IE1hdGgucm91bmQoeSk7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICAvLyBUb3VjaCBoYXMgbm8gYnV0dG9ucy4gQSBsZWZ0IGNsaWNrIGlzIGEgdGFwOyBhIHJpZ2h0IGNsaWNrIGlzIHRoZSBsb25nLXByZXNzIHRoYXQgb3BlbnMgT2JzaWRpYW5cbiAgICAgIC8vIE1vYmlsZSdzIGNvbnRleHQgbWVudSwgc28gaXQgaXMgaGlkZGVuIGJlaGluZCB0aGUgc2FtZSBuYW1lIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgaGVscGVyLiBBXG4gICAgICAvLyBtaWRkbGUgY2xpY2sgaGFzIG5vIGdlc3R1cmUgYXQgYWxsLCBhbmQgaW52ZW50aW5nIG9uZSB3b3VsZCBiZSB3b3JzZSB0aGFuIHNheWluZyBzby5cbiAgICAgIGlmIChidXR0b24gPT09ICdtaWRkbGUnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGNsaWNrTW91c2UoeyBidXR0b246IFxcJ21pZGRsZVxcJyB9KWAgaGFzIG5vIG1lYW5pbmcgb24gbW9iaWxlOiB0b3VjaCBpbnB1dCBoYXMgbm8gbWlkZGxlIGJ1dHRvbi4nKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgcmVxdWVzdEhvc3RJbnB1dCh7XG4gICAgICAgIGtpbmQ6IGJ1dHRvbiA9PT0gJ3JpZ2h0JyA/ICdsb25nUHJlc3MnIDogJ3RhcCcsXG4gICAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgICB5OiByb3VuZGVkWVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBjbGljayBpcyBtb3VzZU1vdmUgLT4gbW91c2VEb3duIC0+IG1vdXNlVXAgYXQgb25lIHBvaW50LlxuICAgIC8vIENocm9taXVtIHN5bnRoZXNpemVzIHRoZSBgY2xpY2tgIChvciBgY29udGV4dG1lbnVgKSBET00gZXZlbnQgZnJvbSB0aGF0IHNlcXVlbmNlLlxuICAgIC8vIFRoZSBsZWFkaW5nIG1vdmUgaXMgd2hhdCBwdXRzIHRoZSBwb2ludGVyIG92ZXIgdGhlIGhpdC10ZXN0IHRhcmdldCBiZWZvcmUgdGhlIGJ1dHRvbiBnb2VzIGRvd24uXG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnbW91c2VNb3ZlJywgeDogcm91bmRlZFgsIHk6IHJvdW5kZWRZIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGNsaWNrQ291bnQ6IFNJTkdMRV9DTElDS19DT1VOVCxcbiAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICB0eXBlOiAnbW91c2VEb3duJyxcbiAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgeTogcm91bmRlZFlcbiAgICB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7XG4gICAgICBidXR0b24sXG4gICAgICBjbGlja0NvdW50OiBTSU5HTEVfQ0xJQ0tfQ09VTlQsXG4gICAgICBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLFxuICAgICAgdHlwZTogJ21vdXNlVXAnLFxuICAgICAgeDogcm91bmRlZFgsXG4gICAgICB5OiByb3VuZGVkWVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xpY2tFbGVtZW50KGNsaWNrUGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG5cbiAgICBjb25zdCB7IGJ1dHRvbiA9ICdsZWZ0JywgZWxlbWVudCwgbW9kaWZpZXJzID0gW10gfSA9IGNsaWNrUGFyYW1zO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgYXdhaXQgd2FpdEZvckVsZW1lbnRUb1NldHRsZShlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AsIGFuZCBlcXVhbCBDRFAnc1xuICAgIC8vIHBhZ2UgY29vcmRpbmF0ZXMgaW4gdGhlIG1vYmlsZSBXZWJWaWV3IFx1MjAxNCBzbyBuZWl0aGVyIHBhdGggbmVlZHMgYSBkZXZpY2UtcGl4ZWwgY29udmVyc2lvbi5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIGFzc2VydENlbnRlckhpdHNFbGVtZW50KGVsZW1lbnQsIHJlY3QpO1xuICAgIH1cblxuICAgIGF3YWl0IGNsaWNrTW91c2Uoe1xuICAgICAgYnV0dG9uLFxuICAgICAgbW9kaWZpZXJzLFxuICAgICAgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SLFxuICAgICAgeTogcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIENFTlRFUl9ESVZJU09SXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBwcmVzc0tleShwcmVzc1BhcmFtczogUHJlc3NLZXlQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGtleSwgbW9kaWZpZXJzID0gW10gfSA9IHByZXNzUGFyYW1zO1xuXG4gICAgY29uc3QgZWxlY3Ryb25Nb2RpZmllcnMgPSB0b0VsZWN0cm9uTW9kaWZpZXJzKG1vZGlmaWVycyk7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICBhd2FpdCByZXF1ZXN0SG9zdElucHV0KHsga2V5LCBraW5kOiAna2V5JywgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IGdsb2JhbFRoaXMuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuXG4gICAgLy8gQSB0cnVzdGVkIGtleSBwcmVzcyBpcyBrZXlEb3duIC0+IGNoYXIgLT4ga2V5VXA6IGtleURvd24gZmlyZXMgYGtleWRvd25gLCBjaGFyIGZpcmVzXG4gICAgLy8gYGtleXByZXNzYC9gYmVmb3JlaW5wdXRgL2BpbnB1dGAsIGtleVVwIGZpcmVzIGBrZXl1cGAgXHUyMDE0IHRoZSBmdWxsIHJlYWwga2V5IHBpcGVsaW5lLlxuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAna2V5RG93bicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdjaGFyJyB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleVVwJyB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGhvdmVyRWxlbWVudChob3ZlclBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSBob3ZlclBhcmFtcztcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIHRocm93VW5zdXBwb3J0ZWRPbk1vYmlsZSgnaG92ZXJFbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gVmlld3BvcnQgY29vcmRzIGVxdWFsIHdlYi1jb250ZW50cyBESVAgY29vcmRzIGZvciB0aGUgZnVsbC13aW5kb3cgYEJyb3dzZXJXaW5kb3dgLlxuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGF3YWl0IG1vdmVNb3VzZSh7IHg6IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyBDRU5URVJfRElWSVNPUiwgeTogcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIENFTlRFUl9ESVZJU09SIH0pO1xuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgcmVhbCBgOmhvdmVyYCBzdGF0ZSBoYXMgYWN0dWFsbHkgdGFrZW4sIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoIWVsZW1lbnQubWF0Y2hlcygnOmhvdmVyJykgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICBhd2FpdCBzbGVlcChJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgcG9pbnRlciB3YXMgbW92ZWQgdG8gdGhlIGNlbnRlciBvZiB0aGUgZWxlbWVudCwgYnV0IGl0IG5ldmVyIG1hdGNoZWQgXFxgOmhvdmVyXFxgIHdpdGhpbiAke1N0cmluZyhJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIGBcbiAgICAgICAgICArICdNb3N0IG9mdGVuIHRoZSBjZW50ZXIgYmVsb25ncyB0byBzb21ldGhpbmcgb24gdG9wIG9mIHRoZSBlbGVtZW50LCBvciB0aGUgZWxlbWVudCBtb3ZlZCBhZnRlciBpdHMgYm94IHdhcyByZWFkLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXF1aXJlLWF3YWl0IC0tIEFzeW5jIHRvIG1hdGNoIGl0cyBtb2JpbGUtY2FwYWJsZSBzaWJsaW5ncyBhbmQgdG8ga2VlcCBvbmUgYFByb21pc2U8dm9pZD5gIHNoYXBlIGFjcm9zcyB0aGUgdHJ1c3RlZC1pbnB1dCBzZXQ7IHRoZSBkZXNrdG9wIGJvZHkgaXMgZ2VudWluZWx5IHN5bmNocm9ub3VzLlxuICBhc3luYyBmdW5jdGlvbiBtb3ZlTW91c2UobW92ZVBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKCdtb3ZlTW91c2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IGdsb2JhbFRoaXMuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsgdHlwZTogJ21vdXNlTW92ZScsIHg6IE1hdGgucm91bmQobW92ZVBhcmFtcy54KSwgeTogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLnkpIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdW5ob3ZlckVsZW1lbnQodW5ob3ZlclBhcmFtczogVW5ob3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG4gICAgY29uc3QgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTID0gMTtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gdW5ob3ZlclBhcmFtcztcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIHRocm93VW5zdXBwb3J0ZWRPbk1vYmlsZSgndW5ob3ZlckVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIE1vdmUgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgdGhlIGVsZW1lbnQncyBib3guIFdoZW4gZmx1c2ggYWdhaW5zdCB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UsIHVzZSBqdXN0XG4gICAgICogcGFzdCB0aGUgcmlnaHQgZWRnZS4gQSBmdWxsLXZpZXdwb3J0LXdpZHRoIGVsZW1lbnQgc2hvdWxkIHVzZSBgbW92ZU1vdXNlYCBkaXJlY3RseSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogVGhlIGVkZ2UgaXMgU05BUFBFRCBhd2F5IGZyb20gdGhlIGJveCBiZWZvcmUgdGhlIG9mZnNldCBpcyBhcHBsaWVkLCBhbmQgdGhhdCBpcyB0aGUgd2hvbGUgY29ycmVjdG5lc3NcbiAgICAgKiBvZiB0aGlzIGZ1bmN0aW9uLiBBIGxheW91dCBib3ggcmFyZWx5IGxhbmRzIG9uIGEgd2hvbGUgcGl4ZWwsIGFuZCBgbW92ZU1vdXNlYCByb3VuZHMgXHUyMDE0IHNvIHN1YnRyYWN0aW5nXG4gICAgICogb25lIGZyb20gYSBmcmFjdGlvbmFsIGxlZnQgZWRnZSByb3VuZHMgc3RyYWlnaHQgYmFjayBvbnRvIHRoZSBlbGVtZW50J3Mgb3duIHBpeGVsIGNvbHVtbiBhbmQgdGhlXG4gICAgICogcG9pbnRlciBuZXZlciBsZWF2ZXMuIE1lYXN1cmVkIG9uIGEgYmFyIHdob3NlIGBsZWZ0YCB3YXMgODU5Ljc5Njg3NTogdGhlIHBsYWluIGBsZWZ0IC0gMWAgYmVjb21lcyA4NTlcbiAgICAgKiBhbmQgYDpob3ZlcmAgbmV2ZXIgY2xlYXJzLCB3aGlsZSBgTWF0aC5mbG9vcihsZWZ0KSAtIDFgIGJlY29tZXMgODU4IGFuZCBpdCBjbGVhcnMgaW4gMjYgbXMuIFNuYXBwaW5nXG4gICAgICogZmlyc3QgbWVhbnMgdGhlIG9mZnNldCBpcyBhIHdob2xlIHBpeGVsIG9mIHJlYWwgY2xlYXJhbmNlIGluc3RlYWQgb2Ygd2hhdGV2ZXIgdGhlIGZyYWN0aW9uIGxlYXZlcy5cbiAgICAgKi9cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gcmVjdC5sZWZ0ID49IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMU1xuICAgICAgPyBNYXRoLmZsb29yKHJlY3QubGVmdCkgLSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFNcbiAgICAgIDogTWF0aC5jZWlsKHJlY3QucmlnaHQpICsgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTO1xuICAgIGNvbnN0IHkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1I7XG4gICAgYXdhaXQgbW92ZU1vdXNlKHsgeCwgeSB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IGNsZWFyZWQsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHBvaW50ZXIgd2FzIG1vdmVkIG91dHNpZGUgdGhlIGVsZW1lbnQncyBib3gsIGJ1dCBpdCBzdGlsbCBtYXRjaGVkIFxcYDpob3ZlclxcYCBhZnRlciAke1N0cmluZyhJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIGBcbiAgICAgICAgICArICdBbiBlbGVtZW50IHRoYXQgc3BhbnMgdGhlIGZ1bGwgdmlld3BvcnQgaGFzIG5vIHBvaW50IG91dHNpZGUgaXRzIGJveCB0byBtb3ZlIHRvIFx1MjAxNCB1c2UgYG1vdmVNb3VzZWAgdG8gYSBrbm93biBlbXB0eSBjb29yZGluYXRlIGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb3RlKG5vdGVQYXJhbXM6IENyZWF0ZU5vdGVQYXJhbXMpOiBQcm9taXNlPFRGaWxlPiB7XG4gICAgY29uc3QgeyBjb250ZW50LCBwYXRoIH0gPSBub3RlUGFyYW1zO1xuXG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IG5zLmFwcC52YXVsdC5jcmVhdGUocGF0aCwgY29udGVudCk7XG5cbiAgICAvLyBSZWFkIHRoZSBmaWxlIGJhY2sgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYGZpbGUuc3RhdGAuIGBzdGF0YCBpcyBwcmVjaXNlbHlcbiAgICAvLyB0aGUgZmllbGQgdGhhdCBsaWVzIGhlcmU6IG9uIGEgbG9zdCB3cml0ZSBpdCByZXBvcnRzIHRoZSBmdWxsIGJ5dGUgY291bnRcbiAgICAvLyB3aGlsZSB0aGUgZmlsZXN5c3RlbSBob2xkcyB6ZXJvIGJ5dGVzLlxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBhd2FpdCBucy5hcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgIGlmIChhY3R1YWxDb250ZW50ID09PSBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0ZW1wdCA9PT0gQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBjcmVhdGVOb3RlIGNvdWxkIG5vdCB3cml0ZSBcIiR7cGF0aH1cIjogZXhwZWN0ZWQgJHtTdHJpbmcoY29udGVudC5sZW5ndGgpfSBjaGFyYWN0ZXJzLCBgXG4gICAgICAgICAgICArIGB0aGUgdmF1bHQgaG9sZHMgJHtTdHJpbmcoYWN0dWFsQ29udGVudC5sZW5ndGgpfSBhZnRlciAke1N0cmluZyhDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVCl9IHJlcGFpciBhdHRlbXB0cy5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgcmV3cml0ZSBvZiB0aGUgc2FtZSBjb250ZW50IGxhbmRzIGNvcnJlY3RseSBcdTIwMTQgbWVhc3VyZWQuIFRoaXMgaXMgdGhlXG4gICAgICAvLyB3aG9sZSB3b3JrYXJvdW5kLlxuICAgICAgYXdhaXQgbnMuYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBVbnJlYWNoYWJsZTogdGhlIGxvb3AgZWl0aGVyIHJldHVybnMgb3IgdGhyb3dzIG9uIGl0cyBsYXN0IGl0ZXJhdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZU5vdGUgY291bGQgbm90IHdyaXRlIFwiJHtwYXRofVwiLmApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gb3BlblNldHRpbmdzVGFiKG9wZW5QYXJhbXM6IE9wZW5TZXR0aW5nc1RhYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhYklkLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBTRVRUSU5HU19UQUJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSA9IG9wZW5QYXJhbXM7XG5cbiAgICBjb25zdCBzZXR0aW5nID0gbnMuYXBwLnNldHRpbmc7XG5cbiAgICAvKlxuICAgICAqIEEgRkFMTEJBQ0sgZm9yIGEgdmF1bHQgdGhhdCBkb2VzIG5vdCBjYXJyeSB0aGUgaGFybmVzcydzIGBzZXR0aW5nc1BvcG91dFdpbmRvdzogZmFsc2VgIGRlZmF1bHQgXHUyMDE0XG4gICAgICogQW5kIGl0IE1VU1QgaGFwcGVuIGJlZm9yZSBgb3BlbigpYC5cbiAgICAgKlxuICAgICAqIFdpdGggdGhlIGRlZmF1bHQgaW4gcGxhY2UgYG9wZW4oKWAgYXR0YWNoZXMgYGNvbnRhaW5lckVsYCB0byB0aGlzIGRvY3VtZW50IGl0c2VsZiwgYW5kIHRoaXMgYnJhbmNoXG4gICAgICogTmV2ZXIgZmlyZXMgKG1lYXN1cmVkLCBgb3duZWQtaW5zdGFuY2Utd29ya2VyLWF0dGFjaC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCkuIFdpdGhvdXQgaXQgT2JzaWRpYW5cbiAgICAgKiBTaGlwcyB0aGUga2V5IGB0cnVlYCwgYHNob3VsZFVzZVBvcG91dCgpYCByZXR1cm5zIGl0LCBhbmQgYG9wZW4oKWAgcHV0cyB0aGUgbW9kYWwgaW4gYSBTRUNPTkRcbiAgICAgKiBFbGVjdHJvbiB3aW5kb3cgaW5zdGVhZCBcdTIwMTQgbGVhdmluZyB0aGlzIGRvY3VtZW50IHdpdGggbm90aGluZyB3aGlsZSByZXR1cm5pbmcgd2l0aG91dCB0aHJvd2luZy5cbiAgICAgKiBQcmUtYXR0YWNoaW5nIGtlZXBzIGBjb250YWluZXJFbGAgcmVhY2hhYmxlIGhlcmUsIHdoaWNoIGlzIGVub3VnaCBmb3IgYSBjYWxsZXIgdGhhdCByZWFkcyByb3dzIG9mZlxuICAgICAqIFRoZSB0YWI7IGl0IGlzIE5PVCBlbm91Z2ggZm9yIGEgc2NyZWVuc2hvdCwgd2hvc2UgZnJhbWUgaXMgb2YgdGhpcyB3aW5kb3cuIE9ubHkgdGhlIHZhdWx0LWxldmVsXG4gICAgICogRGVmYXVsdCBmaXhlcyB0aGF0LCBzbyB0aGlzIGlzIGEgZmxvb3IgcmF0aGVyIHRoYW4gdGhlIGZpeC5cbiAgICAgKlxuICAgICAqIEF0dGFjaGluZyBBRlRFUldBUkRTIGlzIHVzZWxlc3MgZWl0aGVyIHdheTogd2hhdGV2ZXIgdGhlIG1vZGFsIHJlbmRlcmVkIG9uIG9wZW4gaGFzIGFscmVhZHkgZ29uZVxuICAgICAqIFdoZXJlIGl0IHdlbnQuXG4gICAgICovXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHNldHRpbmcuY29udGFpbmVyRWwpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChzZXR0aW5nLmNvbnRhaW5lckVsKTtcbiAgICB9XG5cbiAgICAvLyBCb3RoIGxpc3RzIGFyZSBwb3B1bGF0ZWQgYmVmb3JlIGBvcGVuKClgLCBzbyBhbiB1bmtub3duIGlkIGNhbiBiZSByZWplY3RlZCB1cCBmcm9udCBcdTIwMTQgd2l0aCB0aGVcbiAgICAvLyBpZHMgdGhhdCBETyBleGlzdCBcdTIwMTQgaW5zdGVhZCBvZiBzcGVuZGluZyB0aGUgd2hvbGUgdGltZW91dCBsb29raW5nIGV4YWN0bHkgbGlrZSB0aGUgbW9kYWwtZG9lcy1cbiAgICAvLyBub3QtcmVuZGVyIHN5bXB0b20gdGhpcyBoZWxwZXIgZXhpc3RzIHRvIHJ1bGUgb3V0LiBQbHVnaW4gdGFicyBsaXZlIGluIGBwbHVnaW5UYWJzYCwgbm90XG4gICAgLy8gYHNldHRpbmdUYWJzYCwgc28gYm90aCBhcmUgc2VhcmNoZWQuXG4gICAgY29uc3Qga25vd25UYWJzID0gWy4uLnNldHRpbmcuc2V0dGluZ1RhYnMsIC4uLnNldHRpbmcucGx1Z2luVGFic107XG4gICAgaWYgKGtub3duVGFicy5ldmVyeSgodGFiKSA9PiB0YWIuaWQgIT09IHRhYklkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgb3BlblNldHRpbmdzVGFiOiBubyBzZXR0aW5ncyB0YWIgd2l0aCBpZCBcIiR7dGFiSWR9XCIuIEF2YWlsYWJsZSBpZHM6ICR7a25vd25UYWJzLm1hcCgodGFiKSA9PiB0YWIuaWQpLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dGluZy5vcGVuKCk7XG4gICAgc2V0dGluZy5vcGVuVGFiQnlJZCh0YWJJZCk7XG5cbiAgICAvLyBQb2xsIHRoZSBtb2RhbCdzIG93biBzdGF0ZSByYXRoZXIgdGhhbiBzbGVlcGluZzogYSBmaXhlZCBkZWxheSBpcyBlaXRoZXIgdG9vIHNob3J0IG9uIGEgbG9hZGVkXG4gICAgLy8gbWFjaGluZSBvciB3YXN0ZWQgdGltZS4gQSByZW5kZXJlZCB0YWIgaXMgdGhlIHJlcXVlc3RlZCBvbmUgQU5EIGhhcyBjb250ZW50LlxuICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICBtZXNzYWdlOiBgdGhlIFwiJHt0YWJJZH1cIiBzZXR0aW5ncyB0YWIgdG8gcmVuZGVyYCxcbiAgICAgIHByZWRpY2F0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFiID0gc2V0dGluZy5hY3RpdmVUYWI7XG4gICAgICAgIHJldHVybiAhIWN1cnJlbnRUYWIgJiYgY3VycmVudFRhYi5pZCA9PT0gdGFiSWQgJiYgY3VycmVudFRhYi5jb250YWluZXJFbC5jaGlsZEVsZW1lbnRDb3VudCA+IDA7XG4gICAgICB9LFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG5cbiAgICBjb25zdCBhY3RpdmVUYWIgPSBzZXR0aW5nLmFjdGl2ZVRhYjtcbiAgICBpZiAoIWFjdGl2ZVRhYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcGVuU2V0dGluZ3NUYWI6IHRoZSBzZXR0aW5ncyBtb2RhbCByZXBvcnRlZCBubyBhY3RpdmUgdGFiIGFmdGVyIGl0IHJlbmRlcmVkLicpO1xuICAgIH1cblxuICAgIC8vIE5vdCBldmVyeSB0YWIgcmVuZGVycyBgLnNldHRpbmctaXRlbS1uYW1lYCByb3dzIChIb3RrZXlzIGRvZXMgbm90KSwgc28gYW4gZW1wdHkgYXJyYXkgaXMgYSB2YWxpZFxuICAgIC8vIGFuc3dlciBoZXJlIFx1MjAxNCB0aGUgcmVuZGVyIGl0c2VsZiB3YXMgYWxyZWFkeSBwcm92ZW4gYnkgdGhlIHBvbGwgYWJvdmUuXG4gICAgcmV0dXJuIFsuLi5hY3RpdmVUYWIuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbCgnLnNldHRpbmctaXRlbS1uYW1lJyldLm1hcCgobmFtZUVsKSA9PiBuYW1lRWwudGV4dENvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FpdFVudGlsKHdhaXRQYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9ID0gd2FpdFBhcmFtcztcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCEoYXdhaXQgcHJlZGljYXRlKCkpKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSB0aW1lb3V0SW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgOiAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YWl0VW50aWwgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kcyR7c3VmZml4fWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2xlZXAoaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLnN0YWNrID8/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBpZiAoZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGVycm9yLmNhdXNlLCAnQ2F1c2VkIGJ5OicpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgICAgY29uc3QgYWdncmVnYXRlZEVycm9yczogcmVhZG9ubHkgdW5rbm93bltdID0gZXJyb3IuZXJyb3JzO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFnZ3JlZ2F0ZWRFcnJvcl0gb2YgYWdncmVnYXRlZEVycm9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGFnZ3JlZ2F0ZWRFcnJvciwgYEFnZ3JlZ2F0ZWQgZXJyb3IgIyR7U3RyaW5nKGluZGV4ICsgMSl9OmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2U6IHN0cmluZywgbmVzdGVkRXJyb3I6IHVua25vd24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBgJHttZXNzYWdlfVxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZSl9YDtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXJyb3JUb1N0cmluZ0ltcGwobmVzdGVkRXJyb3IpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgaWYgKCFsaW5lLnRyaW0oKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBsaW5lLnN0YXJ0c1dpdGgoU1RBQ0tfVFJBQ0VfUFJFRklYKVxuICAgICAgICA/IGBcXG4ke2xpbmV9YFxuICAgICAgICA6IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUobGluZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1NUQUNLX1RSQUNFX1BSRUZJWH0gLS0tICR7dGl0bGV9IC0tLSAoMClgO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFpQ0EsU0FBUyw0QkFBNEI7QUFDckM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWtDUCxlQUFzQiw0QkFBNEIsV0FBOEIsS0FBYSx1QkFBK0M7QUFDMUksUUFBTSxjQUFvQztBQUFBLElBQ3hDO0FBQUEsSUFDQSxHQUFJLDBCQUEwQixVQUFhLEVBQUUsc0JBQXNCO0FBQUEsRUFDckU7QUFDQSxRQUFNLG1CQUFtQixvQkFBb0I7QUFDN0MsUUFBTSxjQUFjLEtBQUssVUFBVSxnQkFBZ0I7QUFDbkQsUUFBTSxtQkFBbUIsTUFBTSxVQUFVO0FBQUEsSUFDdkMsbUVBQW1FLFdBQVc7QUFBQSxJQUM5RTtBQUFBLEVBQ0Y7QUFFQSxNQUFJLHFCQUFxQixRQUFRO0FBQy9CO0FBQUEsRUFDRjtBQUVBLFFBQU0sc0JBQXNCLHFCQUFxQixvQkFBb0I7QUFBQSxJQUNuRSxrQkFBa0I7QUFBQSxJQUNsQiw0QkFBNEI7QUFBQSxJQUM1QixjQUFjLENBQUMsR0FBRywwQkFBMEIsQ0FBQztBQUFBLElBQzdDLFNBQVM7QUFBQSxFQUNYLENBQUM7QUFDRCxRQUFNLFVBQVUsU0FBUyxxQkFBcUIsV0FBVztBQUMzRDtBQWdCQSxTQUFTLG1CQUFtQixpQkFBNkU7QUFxT3ZHLFFBQU0sZ0NBQWdDO0FBT3RDLFFBQU0s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
557
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVGdW5jdGlvbkNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB7XG4gIGdldEJvb3RzdHJhcFZlcnNpb24sXG4gIGdldFJlZ2lzdGVyZWRMaWJSZXNvbHZlcnNcbn0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmltcG9ydCB7XG4gIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUsXG4gIE1PQklMRV9JTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xufSBmcm9tICcuL21vYmlsZS1pbnB1dC5tanMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBob3N0LWluc3RhbGxlZCBgUnVudGltZS5hZGRCaW5kaW5nYCBmdW5jdGlvbiB0aGUgbW9iaWxlIHRydXN0ZWQtaW5wdXQgcGF0aCBjYWxscy5cbiAgICpcbiAgICogUGFzc2VkIGluIGFzIGRhdGEgYmVjYXVzZSB0aGUgYm9vdHN0cmFwIGNsb3N1cmUgbWF5IG5vdCByZWFkIG91dGVyIHNjb3BlICgqKkwxNSoqKSwgc28gaXQgY2Fubm90XG4gICAqIGltcG9ydCB7QGxpbmsgTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRX0gZGlyZWN0bHkuXG4gICAqL1xuICByZWFkb25seSBpbnB1dEJpbmRpbmdOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBwYXRoIHdhaXRzIGZvciB0aGUgaG9zdCB0byBhbnN3ZXIgb25lIHJlcXVlc3QuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGxpYlJlc29sdmVyczogTGliUmVzb2x2ZXJbXTtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIGlzIGJvb3RzdHJhcHBlZFxuICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3Mgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUGVyZm9ybXMgYSBsaWdodHdlaWdodCB2ZXJzaW9uIGNoZWNrIHZpYSB0aGUgdHJhbnNwb3J0LiBJZiB0aGUgbmFtZXNwYWNlXG4gKiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uLCBzZW5kcyB0aGUgZnVsbCBib290c3RyYXAgZXhwcmVzc2lvblxuICogdG8gcmVnaXN0ZXIgYWxsIGhlbHBlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkuXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gT3B0aW9uYWwgcGVyLWV2YWwgdGltZW91dC4gRm9yd2FyZGVkIHRvIGJvdGhcbiAqICAgdGhlIHZlcnNpb24gY2hlY2sgYW5kIHRoZSBib290c3RyYXAgZXZhbCBzbyBhIGh1bmcgYG9ic2lkaWFuIGV2YWxgIHJlamVjdHNcbiAqICAgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgY2FsbGVyIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0LCBjd2Q6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV2YWxPcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyA9IHtcbiAgICBjd2QsXG4gICAgLi4uKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gIH07XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBnZXRCb290c3RyYXBWZXJzaW9uKCk7XG4gIGNvbnN0IHZlcnNpb25Kc29uID0gSlNPTi5zdHJpbmdpZnkoYm9vdHN0cmFwVmVyc2lvbik7XG4gIGNvbnN0IHZlcnNpb25NYXRjaEpzb24gPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKHZlcnNpb25NYXRjaEpzb24gPT09ICd0cnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcEV4cHJlc3Npb24gPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChib290c3RyYXBOYW1lc3BhY2UsIHtcbiAgICBpbnB1dEJpbmRpbmdOYW1lOiBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICAgIGlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzOiBNT0JJTEVfSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwcmVzc2lvbiwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzIHRoZSByZW5kZXJlciBoYWxmIG9mXG4gICAgICogdGhlIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwncyAqKmV4YWN0bHktb25jZSoqIGd1YXJhbnRlZSAoKipMMzkqKikuXG4gICAgICpcbiAgICAgKiBDRFAgYnJvYWRjYXN0cyBgUnVudGltZS5iaW5kaW5nQ2FsbGVkYCB0byAqKmV2ZXJ5KiogYXR0YWNoZWQgc2Vzc2lvbiwgc28gZXZlcnkgTm9kZSBwcm9jZXNzXG4gICAgICogaG9sZGluZyBhbiBpbnB1dCBjaGFubmVsIHRvIHRoaXMgV2ViVmlldyBzZXJ2aWNlcyB0aGUgc2FtZSByZXF1ZXN0IFx1MjAxNCBhbmQgZWFjaCBvbmUgaW5qZWN0cyB0aGVcbiAgICAgKiBmdWxsIGdlc3R1cmUuIFdpdGggdHdvIHByb2Nlc3NlcyBhdHRhY2hlZCAoYSBWaXRlc3QgbWFpbiBwcm9jZXNzIGFuZCBpdHMgd29ya2VyLCB3aGljaCBpcyB0aGVcbiAgICAgKiBvcmRpbmFyeSBjb25zdW1lciBzaGFwZSkgb25lIGBjbGlja0VsZW1lbnRgIHRoZXJlZm9yZSBhcnJpdmVkIGFzIFRXTyB0YXBzLCBhbmQgb25lIGBwcmVzc0tleWAgYXNcbiAgICAgKiB0d28ga2V5IHByZXNzZXMuIE1lYXN1cmVkIDIwMjYtMDktMTA6IHR3byBwaWRzIHNlcnZpY2luZyByZXF1ZXN0IGBpZD0xYCBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZC5cbiAgICAgKlxuICAgICAqIFRoZSBjbGFpbSBpcyBtYWRlIGluIHRoZSBQQUdFIHJhdGhlciB0aGFuIGluIGFueSBob3N0IGJlY2F1c2UgdGhlIHBhZ2UgaXMgdGhlIG9ubHkgdGhpbmcgYWxsIHRoZVxuICAgICAqIGhvc3RzIHNoYXJlLiBKYXZhU2NyaXB0IGlzIHNpbmdsZS10aHJlYWRlZCwgc28gdHdvIGBSdW50aW1lLmV2YWx1YXRlYCBjYWxscyByYWNpbmcgZm9yIHRoZSBzYW1lXG4gICAgICogaWQgYXJlIHNlcmlhbGl6ZWQgYW5kIGV4YWN0bHkgb25lIHNlZXMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgdG8gY2xhaW0uXG4gICAgICogQHJldHVybnMgYHRydWVgIGZvciB0aGUgZmlyc3QgY2FsbGVyIHRvIGNsYWltIHRoaXMgaWQsIGBmYWxzZWAgZm9yIGV2ZXJ5IGxhdGVyIG9uZS5cbiAgICAgKi9cbiAgICBjbGFpbUlucHV0OiAoaWQ6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXRcbiAgICAgKiBvd25zIHRoZSBoYXJuZXNzIHRlc3Qgd2luZG93J3MgbGlmZWN5Y2xlIHZpYSBFbGVjdHJvbiAoYHdpbmRvdy5lbGVjdHJvbldpbmRvd2ApLFxuICAgICAqIHdoaWNoIGlzIHRoZSBoYXJuZXNzJ3MgY29uY2Vybiwgbm90IGEgZ2VuZXJhbCB1dGlsaXR5LlxuICAgICAqL1xuICAgIGRlc3Ryb3lDdXJyZW50V2luZG93OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHk6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBTeW5jZWQgd2l0aCBgb2JzaWRpYW4tZGV2LXV0aWxzYCAobWlycm9yIGBlcnJvci50c2ApIFx1MjAxNCBzZWUgTDE3LlxuICAgICAqL1xuICAgIGVycm9yVG9TdHJpbmc6IChlcnJvcjogdW5rbm93bikgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBUaGlzXG4gICAgICogaXMgdGhlIGhhcm5lc3MncyBvd24gZXZhbCBwbHVtYmluZyAoYnVpbGRzIHRoZSBgbGliYCBiYWcsIHJlc29sdmVzIHRoZVxuICAgICAqIG1vZHVsZSwgaW52b2tlcyB0aGUgY2xvc3VyZSwgZW52ZWxvcGVzIHRoZSByZXN1bHQpIFx1MjAxNCBtZWFuaW5nbGVzcyBvdXRzaWRlXG4gICAgICogdGhlIGhhcm5lc3MuXG4gICAgICovXG4gICAgZXZhbFdyYXBwZXI6IChuc1BhcmFtczogRXZhbFdyYXBwZXJQYXJhbXMpID0+IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gUmF3XG4gICAgICogRWxlY3Ryb24gSVBDIChgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jYCkgaXMgYSBoYXJuZXNzL3RyYW5zcG9ydFxuICAgICAqIHByaW1pdGl2ZSwgbm90IGEgZ2VuZXJhbC1wdXJwb3NlIGhlbHBlci5cbiAgICAgKi9cbiAgICBpcGNTZW5kU3luYzogKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiBwYXJ0IG9mIHRoZSBoYXJuZXNzJ3MgdmF1bHQtcGF0aCBoYW5kc2hha2Ugd2l0aCB0aGUgTm9kZSBzaWRlLCBub3QgYVxuICAgICAqIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBwb2xsVmF1bHRCYXNlUGF0aDogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdCBpcyB0aGUgcmVuZGVyZXIgZW5kIG9mIHRoZVxuICAgICAqIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwgKCoqTDM5KiopIFx1MjAxNCB0aGUgaG9zdCBjYWxscyBpdCBvdmVyIENEUCB0byBhbnN3ZXIgYSByZXF1ZXN0IHRoaXNcbiAgICAgKiBjbG9zdXJlIGlzIGF3YWl0aW5nLCBzbyBpdCBpcyBtZWFuaW5nbGVzcyBvdXRzaWRlIHRoZSBoYXJuZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgYmVpbmcgYW5zd2VyZWQuXG4gICAgICogQHBhcmFtIGVycm9yTWVzc2FnZSAtIFdoeSB0aGUgaW5qZWN0aW9uIGZhaWxlZCwgb3IgYG51bGxgIG9uIHN1Y2Nlc3MuXG4gICAgICovXG4gICAgcmVzb2x2ZUlucHV0OiAoaWQ6IHN0cmluZywgZXJyb3JNZXNzYWdlOiBudWxsIHwgc3RyaW5nKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW06IChuc1BhcmFtczogU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWxpYmVyYXRlIHNlYW0gYG9ic2lkaWFuLWRldi11dGlsc2AgcmVhZHMgb24gbW9iaWxlIFx1MjAxNCB0aGUgb25lIG5hbWVzcGFjZSBtZW1iZXIgdGhhdCBleGlzdHMgZm9yXG4gICAgICogYW5vdGhlciBwYWNrYWdlIHJhdGhlciB0aGFuIGZvciB0aGUgaGFybmVzcy4gSXRzICoqTDE3KiogbWlycm9yIChgZGVza3RvcC10cnVzdGVkLWlucHV0LnRzYCkgY2FuXG4gICAgICogcmVhY2ggYSB0cnVzdGVkIGV2ZW50IG9uIGRlc2t0b3AgYnkgaXRzZWxmLCBidXQgb24gbW9iaWxlIHRoZSBpbmplY3Rpb24gaGFzIHRvIGNvbWUgZnJvbSB0aGUgTm9kZVxuICAgICAqIHNpZGUgb3ZlciB0aGUgaGFybmVzcydzIENEUCBjaGFubmVsICgqKkwzOSoqKSwgYW5kIGBvYnNpZGlhbi1kZXYtdXRpbHNgIG11c3QgbmV2ZXIgaW1wb3J0IHRoaXNcbiAgICAgKiBwYWNrYWdlIGF0IHJ1bnRpbWUgKGl0cyBvd24gcGVlci1kZXBlbmRlbmN5IHJ1bGUpLiBTbyBpdCByZWFkcyB0aGVzZSBvZmZcbiAgICAgKiBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGluc3RlYWQsIGRlY2xhcmluZyB0aGUgc2hhcGUgbG9jYWxseS5cbiAgICAgKlxuICAgICAqIFRoZXNlIGFyZSB0aGUgKipzYW1lIGZ1bmN0aW9uIG9iamVjdHMqKiBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnLCBub3Qgd3JhcHBlcnM6XG4gICAgICogZWFjaCBhbHJlYWR5IGJyYW5jaGVzIG9uIGBQbGF0Zm9ybS5pc01vYmlsZWAgaW50ZXJuYWxseSwgc28gdGhlIG1vYmlsZSBzZW1hbnRpY3MgbGl2ZSBpbiBleGFjdGx5IG9uZVxuICAgICAqIHBsYWNlIGFuZCBvbmUgc2VhbSBzZXJ2ZXMgYm90aCBwbGF0Zm9ybXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHJ1c3RlZElucHV0OiBUcnVzdGVkSW5wdXRIZWxwZXJzO1xuICB9XG5cbiAgaW50ZXJmYWNlIEV2YWxXcmFwcGVyUGFyYW1zIHtcbiAgICByZWFkb25seSBjYWxsYmFjazogKGZ1bmN0aW9uQXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgICByZWFkb25seSBjb250ZXh0SWQ/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZSB7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgZ2V0QmFzZVBhdGg/OiAoKSA9PiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSXBjU2VuZFN5bmNQYXJhbXMge1xuICAgIHJlYWRvbmx5IGNoYW5uZWw6IHN0cmluZztcbiAgICByZWFkb25seSBjaGFubmVsQXJndW1lbnRzOiB1bmtub3duW107XG4gIH1cblxuICAvLyBDb21tdW5pdHktcGx1Z2luIEFQSSBtZW1iZXJzIHRoYXQgb2xkIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuNi54KSBsYWNrLlxuICAvLyBgb2JzaWRpYW4tdHlwaW5nc2AgZGVjbGFyZXMgdGhlbSBhcyBhbHdheXMtcHJlc2VudCwgc28gcHJvYmUgdGhyb3VnaCB0aGlzXG4gIC8vIG9wdGlvbmFsLW1lbWJlciB2aWV3IHRvIGRldGVjdCB0aGVpciBydW50aW1lIGFic2VuY2Ugd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgUGx1Z2luc0xpa2Uge1xuICAgIGlzRW5hYmxlZD86ICgpID0+IGJvb2xlYW47XG4gICAgbG9hZFBsdWdpbj86IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIG1hbmlmZXN0cz86IHVua25vd247XG4gICAgdW5pbnN0YWxsUGx1Z2luPzogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gIH1cblxuICBpbnRlcmZhY2UgU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgfVxuXG4gIC8vIFRoZSBzaGFwZSBvZiB0aGUgYHRydXN0ZWRJbnB1dGAgc2VhbS4gRXZlcnkgbWVtYmVyIGlzIG9uZSBvZiB0aGUgTDE3LXN5bmNlZCBoZWxwZXJzLCBleHBvc2VkIGFzIHRoZVxuICAvLyBzYW1lIGZ1bmN0aW9uIG9iamVjdCBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnLlxuICBpbnRlcmZhY2UgVHJ1c3RlZElucHV0SGVscGVycyB7XG4gICAgY2xpY2tFbGVtZW50OiAoY2xpY2tQYXJhbXM6IENsaWNrRWxlbWVudFBhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBjbGlja01vdXNlOiAoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpID0+IFByb21pc2U8dm9pZD47XG4gICAgaG92ZXJFbGVtZW50OiAoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBtb3ZlTW91c2U6IChtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpID0+IFByb21pc2U8dm9pZD47XG4gICAgcHJlc3NLZXk6IChwcmVzc1BhcmFtczogUHJlc3NLZXlQYXJhbXMpID0+IFByb21pc2U8dm9pZD47XG4gICAgdHlwZUludG9FZGl0b3I6ICh0eXBlUGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICB1bmhvdmVyRWxlbWVudDogKHVuaG92ZXJQYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgLy8gYFZhdWx0LmNvbmZpZ0RpcmAgaXMgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQgYnkgYG9ic2lkaWFuLXR5cGluZ3NgLCBidXQgb2xkXG4gIC8vIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgaXQgdW5kZWZpbmVkIGF0IHJ1bnRpbWUuIFByb2JlIHRocm91Z2hcbiAgLy8gdGhpcyBvcHRpb25hbC1tZW1iZXIgdmlldyBzbyBhIGA/PyAnLm9ic2lkaWFuJ2AgZGVmYXVsdCBpcyBub3QgZmxhZ2dlZCBhcyBhblxuICAvLyB1bm5lY2Vzc2FyeSBjb25kaXRpb24uXG4gIGludGVyZmFjZSBWYXVsdExpa2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIFN0cnVjdHVyYWwgbWlycm9yIG9mIE9ic2lkaWFuJ3Mgb3duIGBWYXVsdC5jb25maWdEaXJgOyB0aGUgbmFtZSBoYXMgdG8gbWF0Y2ggZm9yIHRoZSBwcm9iZSB0byByZWFkIGl0LlxuICAgIGNvbmZpZ0Rpcj86IHN0cmluZztcbiAgfVxuXG4gIC8vIGB3aW5kb3cuYXBwYCAvIGBhcHAud29ya3NwYWNlYCBhcmUgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQsIGJ1dCBhcmUgdHJhbnNpZW50bHlcbiAgLy8gdW5kZWZpbmVkIGR1cmluZyBib290IGFuZCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLiBQcm9iZSB0aHJvdWdoIHRoZXNlXG4gIC8vIG9wdGlvbmFsLW1lbWJlciB2aWV3cyBzbyB0aGUgcmVhZGluZXNzIGNoZWNrIGNhbiBndWFyZCB0aGVtIHdpdGhvdXQgYSBmYWxzZVxuICAvLyBgbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uYC5cbiAgaW50ZXJmYWNlIFdvcmtzcGFjZUxpa2Uge1xuICAgIGxheW91dFJlYWR5PzogYm9vbGVhbjtcbiAgfVxuXG4gIGludGVyZmFjZSBBcHBMaWtlIHtcbiAgICB3b3Jrc3BhY2U/OiBXb3Jrc3BhY2VMaWtlO1xuICB9XG5cbiAgdHlwZSBDdXJyZW50V2ViQ29udGVudHMgPSBSZXR1cm5UeXBlPFdpbmRvd1snZWxlY3Ryb24nXVsncmVtb3RlJ11bJ2dldEN1cnJlbnRXZWJDb250ZW50cyddPjtcblxuICAvLyBUaGUgRWxlY3Ryb24gbW9kaWZpZXIta2V5IG5hbWVzIGBzZW5kSW5wdXRFdmVudGAgYWNjZXB0cyAoZS5nLiAnbWV0YScsICdjb250cm9sJywgJ3NoaWZ0JywgJ2FsdCcpLlxuICAvLyBEZXJpdmVkIGZyb20gdGhlIHdlYi1jb250ZW50cyB0eXBlIHNvIGl0IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgRWxlY3Ryb24gdHlwaW5ncy5cbiAgdHlwZSBFbGVjdHJvbk1vZGlmaWVyID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczxDdXJyZW50V2ViQ29udGVudHNbJ3NlbmRJbnB1dEV2ZW50J10+WzBdWydtb2RpZmllcnMnXT5bbnVtYmVyXTtcblxuICBpbnRlcmZhY2UgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0ge1xuICAgIFBsYXRmb3JtOiBPYnNpZGlhblBsYXRmb3JtO1xuICB9XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuUGxhdGZvcm0ge1xuICAgIGlzTWFjT1M6IGJvb2xlYW47XG4gICAgaXNNb2JpbGU6IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogQSB0cnVzdGVkLWlucHV0IHJlcXVlc3QgaGFuZGVkIHRvIHRoZSBob3N0IG92ZXIgdGhlIGBSdW50aW1lLmFkZEJpbmRpbmdgIGNoYW5uZWwuXG4gICAqXG4gICAqIFN0cnVjdHVyYWxseSBpZGVudGljYWwgdG8gYE1vYmlsZUlucHV0UmVxdWVzdGAgaW4gYG1vYmlsZS1pbnB1dC50c2AsIHJlZGVjbGFyZWQgaGVyZSBiZWNhdXNlIHRoaXNcbiAgICogY2xvc3VyZSBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGNhbm5vdCBpbXBvcnQgKCoqTDE1KiopLiBUaGUgdHdvIGFyZSBvbmUgd2lyZSBmb3JtYXQ7IGNoYW5nZVxuICAgKiB0aGVtIHRvZ2V0aGVyLlxuICAgKi9cbiAgdHlwZSBNb2JpbGVJbnB1dFJlcXVlc3QgPSBNb2JpbGVLZXlJbnB1dFJlcXVlc3QgfCBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0O1xuXG4gIGludGVyZmFjZSBNb2JpbGVLZXlJbnB1dFJlcXVlc3Qge1xuICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGtpbmQ6ICdrZXknO1xuICAgIHJlYWRvbmx5IG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW107XG4gIH1cblxuICBpbnRlcmZhY2UgTW9iaWxlUG9pbnRlcklucHV0UmVxdWVzdCB7XG4gICAgcmVhZG9ubHkga2luZDogJ2xvbmdQcmVzcycgfCAndGFwJztcbiAgICByZWFkb25seSBtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIHJlYWRvbmx5IHg6IG51bWJlcjtcbiAgICByZWFkb25seSB5OiBudW1iZXI7XG4gIH1cblxuICBpbnRlcmZhY2UgUGVuZGluZ0lucHV0IHtcbiAgICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gICAgcmVzb2x2ZTogKCkgPT4gdm9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxheSAoaW4gbXMpIGJlZm9yZSBpbnZva2luZyBgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpYCBzbyB0aGUgZXZhbCB0aGF0XG4gICAqIHRyaWdnZXJlZCB0aGUgY2FsbCBoYXMgdGltZSB0byByZXR1cm4gaXRzIHJlc3VsdCB0byB0aGUgY2FsbGVyLiBXaXRob3V0XG4gICAqIGl0IHRoZSByZW5kZXJlciBkaWVzIGJlZm9yZSB0aGUgSVBDIHJlcGx5IHNoaXBzLCB0aGUgY2FsbGVyIHdhaXRzIGZvciB0aGVcbiAgICogZnVsbCBldmFsIHRpbWVvdXQsIGFuZCBzdGFsZSBgQnJvd3NlcldpbmRvd2AgZW50cmllcyBwaWxlIHVwLlxuICAgKi9cbiAgY29uc3QgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHBvbGxzIHdoaWxlIHdhaXRpbmcgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0b1xuICAgKiB0YWtlIGVmZmVjdCAodGhlIGVkaXRvciBkb2N1bWVudCB1cGRhdGVzLCBvciBhbiBlbGVtZW50J3MgYDpob3ZlcmAgc3RhdGVcbiAgICogZmxpcHMpLiBTaGFyZWQgYnkgZXZlcnkgdHJ1c3RlZC1pbnB1dCBoZWxwZXIuXG4gICAqL1xuICBjb25zdCBJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgKGluIG1zKSB0byB3YWl0IGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG8gdGFrZSBlZmZlY3RcbiAgICogYmVmb3JlIGdpdmluZyB1cCAodGhlIGV4cGVjdGVkIG91dGNvbWUgd2hlbiB0aGUgaW5wdXQgaXMgcmVqZWN0ZWQgXHUyMDE0IGUuZy4gYVxuICAgKiByZWFkLW9ubHkgZWRpdG9yLCBvciBhIHBvaW50ZXIgbW92ZSB0aGF0IG5ldmVyIGxhbmRzIG9uIHRoZSBlbGVtZW50KS5cbiAgICovXG4gIGNvbnN0IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgb3BlblNldHRpbmdzVGFifSB3YWl0cyBmb3IgdGhlIHNldHRpbmdzXG4gICAqIG1vZGFsIHRvIG9wZW4gYW5kIGZvciB0aGUgcmVxdWVzdGVkIHRhYiB0byByZW5kZXIsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdFxuICAgKiBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFNFVFRJTkdTX1RBQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHtAbGluayB3YWl0VW50aWx9IHByZWRpY2F0ZSBjaGVja3Mgd2hlbiB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayB3YWl0VW50aWx9IHdhaXRzIGZvciBpdHMgcHJlZGljYXRlIHRvXG4gICAqIGJlY29tZSB0cnV0aHkgYmVmb3JlIHJlamVjdGluZywgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRpbWVzIHtAbGluayBjcmVhdGVOb3RlfSByZXdyaXRlcyBhIG5vdGUgd2hvc2UgY29udGVudCBkaWQgbm90XG4gICAqIHJlYWNoIHRoZSBmaWxlc3lzdGVtIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIFRoZSBBbmRyb2lkIGVtdWxhdG9yIGxvc2VzIHJvdWdobHkgMSB3cml0ZSBpbiAxMTAsIHNvIGEgc2luZ2xlIHJlcGFpclxuICAgKiBhbHJlYWR5IG1ha2VzIGEgbG9zdCBub3RlIGFzdHJvbm9taWNhbGx5IHVubGlrZWx5OyB0aGUgZXh0cmEgYXR0ZW1wdHMgY29zdFxuICAgKiBub3RoaW5nIHdoZW4gbm90aGluZyBpcyBsb3N0LCBhbmQgdGhlIGNhcCBpcyB3aGF0IGtlZXBzIGEgZ2VudWluZWx5IGJyb2tlblxuICAgKiB3cml0ZSBmcm9tIGJlaW5nIHJldHJpZWQgZm9yZXZlciBpbnN0ZWFkIG9mIGZhaWxpbmcgd2l0aCBhIHJlYWRhYmxlIGVycm9yLlxuICAgKi9cbiAgY29uc3QgQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQgPSAzO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPjtcbiAgY29uc3QgZXhpc3RpbmdDb250ZXh0cyA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5jb250ZXh0cyA/PyB7fTtcbiAgY29uc3QgZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5vYnNpZGlhbk1vZHVsZTtcbiAgLy8gV2FybiBhdCBtb3N0IG9uY2UgcGVyIGJvb3RzdHJhcCB0aGF0IGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgIG9uIHRoaXMgdmVyc2lvbi5cbiAgbGV0IGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IGZhbHNlO1xuXG4gIC8vIEluLWZsaWdodCBtb2JpbGUgaW5wdXQgcmVxdWVzdHMsIGtleWVkIGJ5IHJlcXVlc3QgaWQsIGF3YWl0aW5nIHRoZSBob3N0J3MgYW5zd2VyIHZpYSBgcmVzb2x2ZUlucHV0YC5cbiAgY29uc3QgcGVuZGluZ0lucHV0cyA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nSW5wdXQ+KCk7XG4gIGxldCBuZXh0SW5wdXRJZCA9IDA7XG5cbiAgLy8gUmVxdWVzdCBpZHMgYWxyZWFkeSBjbGFpbWVkIGJ5IHNvbWUgaG9zdCwgc28gYSBzZWNvbmQgYXR0YWNoZWQgaG9zdCBkb2VzIG5vdCBpbmplY3QgdGhlIGdlc3R1cmUgYVxuICAvLyBzZWNvbmQgdGltZSBcdTIwMTQgc2VlIGBjbGFpbUlucHV0YC4gSWRzIGFyZSBtb25vdG9uaWMgd2l0aGluIGEgcGFnZSwgc28gdGhpcyBvbmx5IGdyb3dzIGFzIGZhc3QgYXMgdGhlXG4gIC8vIHJ1biBkcml2ZXMgaW5wdXQsIGFuZCBpdCBkaWVzIHdpdGggdGhlIHBhZ2UuXG4gIGNvbnN0IGNsYWltZWRJbnB1dElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IG5zOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UgPSB7XG4gICAgZ2V0IGFwcCgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBgYXBwYCBnZXR0ZXIgcmVhZHMgYHdpbmRvdy5hcHBgIHdoaWNoIGlzIHNldCBieSBPYnNpZGlhbi5cbiAgICAgIHJldHVybiBnbG9iYWxUaGlzLmFwcDtcbiAgICB9LFxuXG4gICAgY2xhaW1JbnB1dCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIGlmIChjbGFpbWVkSW5wdXRJZHMuaGFzKGlkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNsYWltZWRJbnB1dElkcy5hZGQoaWQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIGNvbnRleHRzOiBleGlzdGluZ0NvbnRleHRzLFxuXG4gICAgYXN5bmMgZGVzdHJveUN1cnJlbnRXaW5kb3codGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgIGNvbnN0IGVsZWN0cm9uV2luZG93ID0gZ2xvYmFsVGhpcy5lbGVjdHJvbldpbmRvdztcbiAgICAgIGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKTtcbiAgICAgIH0sIERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZW5zdXJlTGF5b3V0UmVhZHkodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBlcnJvclRvU3RyaW5nKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbFdyYXBwZXIodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gT2xkIE9ic2lkaWFuIChlLmcuIDAuNi54KSBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEk6IGBwbHVnaW5zYFxuICAgICAgLy8gZXhpc3RzIGJ1dCBoYXMgbm8gYGlzRW5hYmxlZGAvYHNldEVuYWJsZWAsIGFuZCB0aGVyZSBhcmUgbm8gdGhpcmQtcGFydHlcbiAgICAgIC8vIHBsdWdpbnMgdG8gZW5hYmxlLCBzbyBza2lwIHRoaXMgc3RlcCB3aGVuIHRoZSBBUEkgaXMgYWJzZW50LlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zLmlzRW5hYmxlZCAmJiAhcGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2lkaWFuTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRPYnNpZGlhbk1vZHVsZSgpO1xuICAgICAgLy8gQXZvaWQgYD8/PWA6IG9sZCBPYnNpZGlhbidzIENocm9taXVtIChlLmcuIDAuNi54IG9uIENocm9taXVtIDgwKSBwcmVkYXRlc1xuICAgICAgLy8gRVMyMDIxIGxvZ2ljYWwtYXNzaWdubWVudCBhbmQgY2Fubm90IHBhcnNlIGl0IGluIHRoaXMgc2VyaWFsaXplZCBib290c3RyYXAuXG4gICAgICBsZXQgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGlmIChwYXJhbXMuY29udGV4dElkKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGV4dCA9IHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF07XG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBjb250ZXh0ID0gZXhpc3RpbmdDb250ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPSBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5qZWN0ZWQgYGxpYmAgYmFnOiBiYXNlIGhlbHBlcnMgZnJvbSB0aGUgaGFybmVzcywgdGhlbiBwcm92aWRlcnMgb24gdG9wLlxuICAgICAgLy8gUmVzb2x2ZXJzIHJ1biBpbi1yZW5kZXJlciAodGhleSByZWFkIHJlbmRlcmVyIGdsb2JhbHMgYSBwcm92aWRlciBwdWJsaXNoZWQpLlxuICAgICAgLy8gUmVidWlsZGluZyBwZXIgZXZhbCBrZWVwcyBgbGliYCBmcmVzaCBhbmQgdG9sZXJhbnQgb2YgYSBsYXRlLWxvYWRlZCBwcm92aWRlci5cbiAgICAgIGNvbnN0IGxpYiA9IHtcbiAgICAgICAgY2xpY2tFbGVtZW50LFxuICAgICAgICBjbGlja01vdXNlLFxuICAgICAgICBjcmVhdGVOb3RlLFxuICAgICAgICBob3ZlckVsZW1lbnQsXG4gICAgICAgIG1vdmVNb3VzZSxcbiAgICAgICAgb3BlblNldHRpbmdzVGFiLFxuICAgICAgICBwcmVzc0tleSxcbiAgICAgICAgdHlwZUludG9FZGl0b3IsXG4gICAgICAgIHVuaG92ZXJFbGVtZW50LFxuICAgICAgICB3YWl0VW50aWxcbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IHJlc29sdmVMaWIgb2YgdGhpcy5saWJSZXNvbHZlcnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihsaWIsIHJlc29sdmVMaWIoKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmdWxsQXJndW1lbnRzID0geyAuLi5wYXJhbXMuaW5wdXQsIGFwcDogdGhpcy5hcHAsIGNvbnRleHQsIGxpYiwgb2JzaWRpYW5Nb2R1bGUgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhcmFtcy5jYWxsYmFjayhmdWxsQXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAndW5kZWZpbmVkJyB9KSA6IEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHJlc3VsdCB9KTtcbiAgICAgIH0gY2F0Y2ggKGV2YWxFcnJvcikge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXJyb3InLCB2YWx1ZTogdGhpcy5lcnJvclRvU3RyaW5nKGV2YWxFcnJvcikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9ic2lkaWFuTW9kdWxlKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgaWYgKHRoaXMub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5Nb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSB0ZW1wLXBsdWdpbiB0cmljayBiZWxvdyByZXNvbHZlcyBgcmVxdWlyZSgnb2JzaWRpYW4nKWAsIHdoaWNoIG9ubHlcbiAgICAgIC8vIHdvcmtzIGluc2lkZSBhIHBsdWdpbi1sb2FkIGNvbnRleHQuIEl0IG5lZWRzIHRoZSBjb21tdW5pdHktcGx1Z2luIHJlZ2lzdHJ5XG4gICAgICAvLyAoYGxvYWRQbHVnaW5gICsgYG1hbmlmZXN0c2ApLCB3aGljaCBGSVJTVCBhcHBlYXJzIGluIE9ic2lkaWFuIDAuOS43OyB0aGVcbiAgICAgIC8vIDAuNi40LTAuOS42IGJhbmQgaGFzIG5vIHJlZ2lzdHJ5IGFuZCBjYW5ub3QgcnVuIGl0LCBzbyByZXR1cm4gYG51bGxgIChub3RcbiAgICAgIC8vIGB1bmRlZmluZWRgKSAtIGFwcC1vbmx5IGNsb3N1cmVzIChgY2FsbGJhY2soeyBhcHAgfSlgKSBzdGlsbCBydW4uXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gcHJvYmUgdGhlIHJ1bnRpbWUtb3B0aW9uYWwgY29tbXVuaXR5LXBsdWdpbiBBUEkuXG4gICAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5hcHAucGx1Z2lucyBhcyB1bmtub3duIGFzIFBsdWdpbnNMaWtlO1xuICAgICAgaWYgKCFwbHVnaW5zLmxvYWRQbHVnaW4gfHwgIXBsdWdpbnMubWFuaWZlc3RzKSB7XG4gICAgICAgIGlmICghaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgICAgaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nXSBgb2JzaWRpYW5Nb2R1bGVgIGlzIGBudWxsYDogdGhpcyBPYnNpZGlhbiB2ZXJzaW9uIHByZWRhdGVzIHRoZSBjb21tdW5pdHktcGx1Z2luIEFQSSAoYWRkZWQgaW4gMC45LjcpLCBzbyB0aGUgYG9ic2lkaWFuYCBtb2R1bGUgY2Fubm90IGJlIHJlc29sdmVkLiBBcHAtb25seSBjbG9zdXJlcyAoYGNhbGxiYWNrKHsgYXBwIH0pYCkgc3RpbGwgd29yay4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgU0xJQ0VfU1RBUlQgPSAyO1xuICAgICAgY29uc3QgcmFuZG9tU3VmZml4ID0gU3RyaW5nKE1hdGgucmFuZG9tKCkpLnNsaWNlKFNMSUNFX1NUQVJUKTtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeU1vZHVsZU5hbWUgPSBgZ2V0LW9ic2lkaWFuLW1vZHVsZS0ke3JhbmRvbVN1ZmZpeH1gO1xuICAgICAgLy8gT2xkIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgYHZhdWx0LmNvbmZpZ0RpcmAgdW5kZWZpbmVkOyBmYWxsIGJhY2sgdG9cbiAgICAgIC8vIE9ic2lkaWFuJ3MgZGVmYXVsdCBjb25maWcgZGlyIHNvIHRoZSB0ZW1wIHBsdWdpbiBzdGlsbCBnZXRzIGEgdmFsaWQgcGF0aCxcbiAgICAgIC8vIGxvYWRzLCBhbmQgaXRzIGByZXF1aXJlKCdvYnNpZGlhbicpYCByZXNvbHZlcyB0aGUgbW9kdWxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIGNvbmZpZ0RpciBpcyBydW50aW1lLW9wdGlvbmFsIG9uIG9sZCB2ZXJzaW9ucy5cbiAgICAgIGNvbnN0IGNvbmZpZ0RpcmVjdG9yeSA9ICh0aGlzLmFwcC52YXVsdCBhcyB1bmtub3duIGFzIFZhdWx0TGlrZSkuY29uZmlnRGlyID8/ICcub2JzaWRpYW4nO1xuICAgICAgY29uc3QgcGx1Z2luc0RpcmVjdG9yeSA9IGAke2NvbmZpZ0RpcmVjdG9yeX0vcGx1Z2luc2A7XG4gICAgICBjb25zdCBkaXJlY3RvcnkgPSBgJHtwbHVnaW5zRGlyZWN0b3J5fS8ke3RlbXBvcmFyeU1vZHVsZU5hbWV9YDtcbiAgICAgIHRoaXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzW3RlbXBvcmFyeU1vZHVsZU5hbWVdID0ge1xuICAgICAgICBhdXRob3I6ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBkaXJgIGlzIE9ic2lkaWFuJ3Mgb3duIGBQbHVnaW5NYW5pZmVzdGAgbWVtYmVyIG5hbWUuXG4gICAgICAgIGRpcjogZGlyZWN0b3J5LFxuICAgICAgICBpZDogdGVtcG9yYXJ5TW9kdWxlTmFtZSxcbiAgICAgICAgaXNEZXNrdG9wT25seTogZmFsc2UsXG4gICAgICAgIG1pbkFwcFZlcnNpb246ICcnLFxuICAgICAgICBuYW1lOiB0ZW1wb3JhcnlNb2R1bGVOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnJ1xuICAgICAgfTtcbiAgICAgIC8vIGBhZGFwdGVyLm1rZGlyYCBpcyBub3QgcmVjdXJzaXZlLCBhbmQgYW4gb2xkIHZlcnNpb24gb24gYSBmcmVzaCB2YXVsdCBtYXkgbm90XG4gICAgICAvLyBoYXZlIHRoZSBjb25maWcvcGx1Z2lucyBkaXJzIHlldCBcdTIwMTQgY3JlYXRlIHRoZSBjaGFpbiBzbyBgbG9hZFBsdWdpbmAgZmluZHMgdGhlXG4gICAgICAvLyB0ZW1wIHBsdWdpbiBhdCBgPGNvbmZpZ0Rpcj4vcGx1Z2lucy88aWQ+YC5cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGNvbmZpZ0RpcmVjdG9yeSkpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoY29uZmlnRGlyZWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBsdWdpbnNEaXJlY3RvcnkpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKHBsdWdpbnNEaXJlY3RvcnkpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2RpcihkaXJlY3RvcnkpO1xuXG4gICAgICBjb25zdCBwbHVnaW5GdW5jdGlvbkJvZHkgPSAnY29uc3Qgcj1yZXF1aXJlLGU9ZXhwb3J0cztjb25zdCBtPXIoXFwnb2JzaWRpYW5cXCcpO3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLm9ic2lkaWFuTW9kdWxlPW07ZS5kZWZhdWx0PW0uUGx1Z2luOyc7XG4gICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLndyaXRlKGAke2RpcmVjdG9yeX0vbWFpbi5qc2AsIHBsdWdpbkZ1bmN0aW9uQm9keSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMubG9hZFBsdWdpbih0ZW1wb3JhcnlNb2R1bGVOYW1lKTtcbiAgICAgIC8vIGB1bmluc3RhbGxQbHVnaW5gIGFycml2ZWQgYWZ0ZXIgdGhlIHBsdWdpbiBBUEkgaXRzZWxmLCBzbyBpdCBpcyBhYnNlbnQgb25cbiAgICAgIC8vIDAuOS43IC0gdGhlIEZJUlNUIHZlcnNpb24gdG8gZXhwb3NlIGBsb2FkUGx1Z2luYC9gbWFuaWZlc3RzYCAoMC45LjYgYW5kIGJlbG93XG4gICAgICAvLyBoYXZlIG5laXRoZXIsIGFuZCByZXR1cm4gYHVuZGVmaW5lZGAgYWJvdmUpLiBUaGUgbW9kdWxlIGlzIGFscmVhZHkgY2FwdHVyZWQgYnlcbiAgICAgIC8vIHRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgYXQgdGhpcyBwb2ludCwgc28gb25seSB1bmluc3RhbGwgd2hlbiB0aGUgbWV0aG9kIGV4aXN0cztcbiAgICAgIC8vIE9uIDAuOS43IHRoZSB0ZW1wIHBsdWdpbiBsaW5nZXJzIGhhcm1sZXNzbHkgaW4gdGhlIGVwaGVtZXJhbCBvd25lZCB2YXVsdC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB1bmluc3RhbGxQbHVnaW4gaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBwbHVnaW5zRm9yQ2xlYW51cCA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zRm9yQ2xlYW51cC51bmluc3RhbGxQbHVnaW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcG9yYXJ5TW9kdWxlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIG9ic2lkaWFuIG1vZHVsZScpO1xuICAgIH0sXG5cbiAgICBhc3luYyBpcGNTZW5kU3luYyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgZ2xvYmFsVGhpcy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmNoYW5uZWxBcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAvLyBgd2luZG93LmFwcGAsIGl0cyBgd29ya3NwYWNlYCwgYW5kIGxheW91dCBjYW4gYWxsIGJlIHRyYW5zaWVudGx5XG4gICAgICAvLyB1bmF2YWlsYWJsZSBkdXJpbmcgYm9vdCBvciByaWdodCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLCBhbmQgb2xkXG4gICAgICAvLyBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgLiBUaGlzIHJ1bnMgaW5zaWRlIHRoZSB0cmFuc3BvcnQnc1xuICAgICAgLy8gcmVhZGluZXNzIHBvbGwsIHdoaWNoIHJldHJpZXMgb24gdGhyb3csIHNvIGNoZWNrIGB3aW5kb3cuYXBwYCBGSVJTVCBhbmQgYmFpbFxuICAgICAgLy8gY2xlYW5seSB1bnRpbCBpdCwgaXRzIHdvcmtzcGFjZSwgYW5kIGxheW91dCBhcmUgYWxsIHJlYWR5IFx1MjAxNCBuZXZlciBkZXJlZmVyZW5jZVxuICAgICAgLy8gYW4gdW5kZWZpbmVkIGB3aW5kb3cuYXBwYC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB3aW5kb3cuYXBwL3dvcmtzcGFjZSBhcmUgcnVudGltZS1vcHRpb25hbCBkdXJpbmcgYm9vdC5cbiAgICAgIGNvbnN0IGFwcCA9IHRoaXMuYXBwIGFzIHVua25vd24gYXMgQXBwTGlrZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYXBwPy53b3Jrc3BhY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPd25lZCB2YXVsdCBpcyBub3QgcmVhZHkgeWV0ICh3aW5kb3cuYXBwL3dvcmtzcGFjZSBub3QgaW5pdGlhbGl6ZWQpLicpO1xuICAgICAgfVxuICAgICAgLy8gT2xkIE9ic2lkaWFuIHByZWRhdGVzIGBXb3Jrc3BhY2Uub25MYXlvdXRSZWFkeWAgYnV0IGhhcyBgbGF5b3V0UmVhZHkgPT09IHRydWVgXG4gICAgICAvLyBieSB0aGUgdGltZSBhIHdpbmRvdyBpcyB1cDsgb25seSB3YWl0IHZpYSBgZW5zdXJlTGF5b3V0UmVhZHlgIHdoZW4gaXQgaXMgbm90XG4gICAgICAvLyB5ZXQgcmVhZHkgKG1vZGVybiB2ZXJzaW9ucyBlYXJseSBpbiBib290KSwgc28gdGhlIG1pc3NpbmcgbWV0aG9kIGlzIG5ldmVyIGhpdC5cbiAgICAgIGlmICghYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyB1bmtub3duIGFzIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZTtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgcHJlZGF0ZSB0aGUgYGdldEJhc2VQYXRoKClgIG1ldGhvZCBidXRcbiAgICAgIC8vIGV4cG9zZSB0aGUgYGJhc2VQYXRoYCBwcm9wZXJ0eTsgdGhlIG1ldGhvZCBleGlzdHMgZnJvbSB+MC45LjIwIG9ud2FyZC5cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gYWRhcHRlci5nZXRCYXNlUGF0aCA/IGFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSA6IChhZGFwdGVyLmJhc2VQYXRoID8/ICcnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShiYXNlUGF0aCk7XG4gICAgfSxcblxuICAgIHJlc29sdmVJbnB1dCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogbnVsbCB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHBlbmRpbmdJbnB1dHMuZ2V0KGlkKTtcbiAgICAgIGlmICghcGVuZGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmdJbnB1dHMuZGVsZXRlKGlkKTtcbiAgICAgIGlmIChlcnJvck1lc3NhZ2UgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZy5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGVuZGluZy5yZWplY3QobmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBzZXRMb2NhbFN0b3JhZ2VJdGVtKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXJhbXMua2V5LCBwYXJhbXMudmFsdWUpO1xuICAgIH0sXG5cbiAgICAvLyBUaGUgc2FtZSBmdW5jdGlvbiBvYmplY3RzIGBldmFsV3JhcHBlcmAgcHV0cyBpbiBhIGNsb3N1cmUncyBgbGliYCBiYWcgXHUyMDE0IGRlbGliZXJhdGVseSBub3QgcmUtZGVyaXZlZFxuICAgIC8vIGFuZCBub3Qgd3JhcHBlZCwgc28gYG9ic2lkaWFuLWRldi11dGlsc2AgZ2V0cyBleGFjdGx5IHRoZSBoYXJuZXNzJ3MgYmVoYXZpb3Igb24gYm90aCBwbGF0Zm9ybXMuXG4gICAgdHJ1c3RlZElucHV0OiB7XG4gICAgICBjbGlja0VsZW1lbnQsXG4gICAgICBjbGlja01vdXNlLFxuICAgICAgaG92ZXJFbGVtZW50LFxuICAgICAgbW92ZU1vdXNlLFxuICAgICAgcHJlc3NLZXksXG4gICAgICB0eXBlSW50b0VkaXRvcixcbiAgICAgIHVuaG92ZXJFbGVtZW50XG4gICAgfSxcblxuICAgIHZlcnNpb246IGJvb3RzdHJhcFBhcmFtcy52ZXJzaW9uXG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gIChnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+KS5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nID0gbnM7XG5cbiAgYXN5bmMgZnVuY3Rpb24gdHlwZUludG9FZGl0b3IodHlwZVBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuXG4gICAgY29uc3QgeyBlZGl0b3IsIHRleHQgfSA9IHR5cGVQYXJhbXM7XG4gICAgY29uc3QgdmFsdWVCZWZvcmVUeXBpbmcgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblxuICAgIC8vIEZvY3VzIHRoZSBlZGl0b3IgYW5kIHBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICBjb25zdCBsYXN0TGluZSA9IGVkaXRvci5sYXN0TGluZSgpO1xuICAgIGVkaXRvci5zZXRDdXJzb3IobGFzdExpbmUsIGVkaXRvci5nZXRMaW5lKGxhc3RMaW5lKS5sZW5ndGgpO1xuXG4gICAgLy8gTGV0IGFueSBmb2N1cyB0cmFwIChhIGBzZXRUaW1lb3V0KDApYCByZS1mb2N1cykgZmlyZSBiZWZvcmUgdHlwaW5nLCBzbyBzdG9sZW4gZm9jdXMgaXMgZGV0ZWN0ZWQuXG4gICAgYXdhaXQgc2xlZXAoRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAvLyBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IGBwcmVzc0tleWAgaW5qZWN0cyB0aGUgc2FtZSB0cnVzdGVkXG4gICAgLy8gYGtleURvd25gIC0+IGBjaGFyYCAtPiBga2V5VXBgIGEgcmVhbCB1c2VyIHByb2R1Y2VzIFx1MjAxNCB0ZXh0IGxhbmRzIG9ubHkgaWYgdGhlIGVkaXRvciBob2xkcyBmb2N1cy5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dCkge1xuICAgICAgYXdhaXQgcHJlc3NLZXkoeyBrZXk6IGNoYXIgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlIGlucHV0IG9yIHRoZSB0aW1lb3V0IGVsYXBzZXMsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWRpdG9yLmdldFZhbHVlKCkgPT09IHZhbHVlQmVmb3JlVHlwaW5nICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRydWUgd2hlbiB0aGlzIGNsb3N1cmUgaXMgcnVubmluZyBpbiBPYnNpZGlhbiBNb2JpbGUgcmF0aGVyIHRoYW4gdGhlIEVsZWN0cm9uIGRlc2t0b3AgYXBwLlxuICAvLyBSZWFkaW5nIGBQbGF0Zm9ybWAgb2ZmIHRoZSByZXNvbHZlZCBvYnNpZGlhbiBtb2R1bGUgaXMgc2FmZSBoZXJlOiBgZXZhbFdyYXBwZXJgIGFsd2F5cyByZXNvbHZlcyB0aGF0XG4gIC8vIG1vZHVsZSBiZWZvcmUgYW55IGNhbGxiYWNrIGNhbiBydW4sIHdoaWNoIGlzIHRoZSBzYW1lIGd1YXJhbnRlZSBgdG9FbGVjdHJvbk1vZGlmaWVyc2AgcmVsaWVzIG9uLlxuICBmdW5jdGlvbiBjaGVja0lzTW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTW9iaWxlO1xuICB9XG5cbiAgLy8gSGFuZHMgb25lIHRydXN0ZWQtaW5wdXQgcmVxdWVzdCB0byB0aGUgaG9zdCBhbmQgd2FpdHMgZm9yIGl0IHRvIGJlIGluamVjdGVkLlxuICAvL1xuICAvLyBNb2JpbGUgaGFzIG5vIGluLXJlbmRlcmVyIHJvdXRlIHRvIGEgdHJ1c3RlZCBldmVudCBhdCBhbGwgXHUyMDE0IGBkaXNwYXRjaEV2ZW50YCBhbmQgYGVsZW1lbnQuY2xpY2soKWAgYXJlXG4gIC8vIGBpc1RydXN0ZWQgPT09IGZhbHNlYCBieSBzcGVjIFx1MjAxNCBzbyB0aGUgaW5qZWN0aW9uIGhhcyB0byBoYXBwZW4gZnJvbSB0aGUgTm9kZSBzaWRlLCBvdmVyIGEgQ0RQXG4gIC8vIGNvbm5lY3Rpb24gaW5kZXBlbmRlbnQgb2YgdGhlIEFwcGl1bSBzZXNzaW9uIHRoYXQgaXMgY3VycmVudGx5IGJsb2NrZWQgYXdhaXRpbmcgdGhpcyB2ZXJ5IGNsb3N1cmVcbiAgLy8gKHNlZSBMMzkpLiBgYmluZGluZ05hbWVgIGlzIGEgaG9zdC1pbnN0YWxsZWQgZ2xvYmFsOyBjYWxsaW5nIGl0IGRlbGl2ZXJzIHRoZSByZXF1ZXN0LCBhbmQgdGhlIGhvc3RcbiAgLy8gYW5zd2VycyBieSBjYWxsaW5nIGBucy5yZXNvbHZlSW5wdXRgLlxuICBhc3luYyBmdW5jdGlvbiByZXF1ZXN0SG9zdElucHV0KHJlcXVlc3Q6IE1vYmlsZUlucHV0UmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJpbmRpbmdOYW1lID0gYm9vdHN0cmFwUGFyYW1zLmlucHV0QmluZGluZ05hbWU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGNhc3Q6IHRoZSBiaW5kaW5nIGlzIGluc3RhbGxlZCBieSB0aGUgaG9zdCBhdCBydW50aW1lIHZpYSBgUnVudGltZS5hZGRCaW5kaW5nYCwgc28gaXQgY2Fubm90IGJlIGRlY2xhcmVkIG9uIGBXaW5kb3dgLlxuICAgIGNvbnN0IGJpbmRpbmcgPSAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtiaW5kaW5nTmFtZV0gYXMgKChwYXlsb2FkOiBzdHJpbmcpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgYmluZGluZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYFRydXN0ZWQgaW5wdXQgaXMgdW5hdmFpbGFibGU6IHRoZSBob3N0IGhhcyBub3QgaW5zdGFsbGVkIHRoZSBcXGAke2JpbmRpbmdOYW1lfVxcYCBjaGFubmVsLiBgXG4gICAgICAgICAgKyAnT24gbW9iaWxlIHRoZXNlIGhlbHBlcnMgcmVxdWlyZSB0aGUgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyBBcHBpdW0gdHJhbnNwb3J0LidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbmV4dElucHV0SWQrKztcbiAgICBjb25zdCBpZCA9IFN0cmluZyhuZXh0SW5wdXRJZCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBwZW5kaW5nSW5wdXRzLnNldChpZCwgeyByZWplY3QsIHJlc29sdmUgfSk7XG4gICAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIXBlbmRpbmdJbnB1dHMuaGFzKGlkKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBlbmRpbmdJbnB1dHMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGhlIGhvc3QgZGlkIG5vdCBzZXJ2aWNlIHRoZSB0cnVzdGVkIGlucHV0IHJlcXVlc3Qgd2l0aGluICR7U3RyaW5nKGJvb3RzdHJhcFBhcmFtcy5pbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuYCkpO1xuICAgICAgfSwgYm9vdHN0cmFwUGFyYW1zLmlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzKTtcblxuICAgICAgYmluZGluZyhKU09OLnN0cmluZ2lmeSh7IGlkLCByZXF1ZXN0IH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEEgcG9pbnRlciBoZWxwZXIgdGhhdCBoYXMgbm8gdG91Y2ggYW5hbG9nIGlzIGEgaGFyZCBlcnJvciwgbmV2ZXIgYSBzaWxlbnQgbm8tb3A6IGA6aG92ZXJgIGRvZXMgbm90XG4gIC8vIGV4aXN0IG9uIHRvdWNoLCBzbyBhIHRlc3QgdGhhdCBcImhvdmVyZWRcIiBhbmQgdGhlbiBhc3NlcnRlZCB3b3VsZCBwYXNzIHdoaWxlIGV4ZXJjaXNpbmcgbm90aGluZyBcdTIwMTRcbiAgLy8gZXhhY3RseSB0aGUgZmFsc2UtY29uZmlkZW5jZSBmYWlsdXJlIHRoZSB0cnVzdGVkLWlucHV0IHdvcmsgZXhpc3RzIHRvIGVuZC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIEl0IGNhbm5vdCBtb3ZlIHRvIHRoZSBvdXRlciBzY29wZTogdGhpcyB3aG9sZSBmdW5jdGlvbiBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIG1heSBub3QgcmVmZXJlbmNlIGFueXRoaW5nIG91dHNpZGUgaXRzZWxmIChMMTUpLlxuICBmdW5jdGlvbiB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoaGVscGVyTmFtZTogc3RyaW5nKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBcXGAke2hlbHBlck5hbWV9XFxgIGhhcyBubyBtZWFuaW5nIG9uIG1vYmlsZTogdG91Y2ggaW5wdXQgaGFzIG5vIGhvdmVyIHN0YXRlLiBgXG4gICAgICAgICsgJ0JyYW5jaCBvbiBgUGxhdGZvcm0uaXNEZXNrdG9wQXBwYCwgb3IgZHJpdmUgdGhlIGVsZW1lbnQgd2l0aCBgY2xpY2tFbGVtZW50YCBpbnN0ZWFkLidcbiAgICApO1xuICB9XG5cbiAgLy8gRGVzY3JpYmVzIGFuIGVsZW1lbnQgZm9yIGFuIGVycm9yIG1lc3NhZ2U6IGl0cyB0YWcgYW5kIGNsYXNzZXMsIHdoaWNoIGlzIHdoYXQgYSByZWFkZXIgZ3JlcHMgZm9yLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWZ1bmN0aW9uLXNjb3BpbmcgLS0gSXQgY2Fubm90IG1vdmUgdG8gdGhlIG91dGVyIHNjb3BlOiB0aGlzIHdob2xlIGZ1bmN0aW9uIGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgbWF5IG5vdCByZWZlcmVuY2UgYW55dGhpbmcgb3V0c2lkZSBpdHNlbGYgKEwxNSkuXG4gIGZ1bmN0aW9uIGRlc2NyaWJlRWxlbWVudChlbGVtZW50OiBFbGVtZW50IHwgbnVsbCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IFsuLi4oZWxlbWVudD8uY2xhc3NMaXN0ID8/IFtdKV0ubWFwKChjbGFzc05hbWUpID0+IGAuJHtjbGFzc05hbWV9YCkuam9pbignJyk7XG4gICAgY29uc3Qgc3VmZml4ID0gY2xhc3NOYW1lcyA/IGAgJHtjbGFzc05hbWVzfWAgOiAnJztcbiAgICByZXR1cm4gZWxlbWVudCA/IGA8JHtlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKX0ke3N1ZmZpeH0+YCA6ICdub3RoaW5nJztcbiAgfVxuXG4gIC8vIFRoZSBmaW5pdGUgYW5pbWF0aW9ucyBhbmQgdHJhbnNpdGlvbnMgbm93IG1vdmluZyB0aGUgZWxlbWVudCBvciBhbnkgYW5jZXN0b3Igb2YgaXQuIEFuIGluZmluaXRlIG9uZSAoYVxuICAvLyBzcGlubmVyKSBuZXZlciBlbmRzLCBzbyB3YWl0aW5nIG9uIGl0IHdvdWxkIG9ubHkgZXZlciB0aW1lIG91dCwgYW5kIGl0IGlzIGxlZnQgb3V0LlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWZ1bmN0aW9uLXNjb3BpbmcgLS0gSXQgY2Fubm90IG1vdmUgdG8gdGhlIG91dGVyIHNjb3BlOiB0aGlzIHdob2xlIGZ1bmN0aW9uIGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgbWF5IG5vdCByZWZlcmVuY2UgYW55dGhpbmcgb3V0c2lkZSBpdHNlbGYgKEwxNSkuXG4gIGZ1bmN0aW9uIGdldE1vdmluZ0FuaW1hdGlvbnMoZWxlbWVudDogRWxlbWVudCk6IEFuaW1hdGlvbltdIHtcbiAgICByZXR1cm4gdHlwZW9mIGRvY3VtZW50LmdldEFuaW1hdGlvbnMgPT09ICdmdW5jdGlvbidcbiAgICAgID8gZG9jdW1lbnQuZ2V0QW5pbWF0aW9ucygpLmZpbHRlcigoYW5pbWF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGVmZmVjdCA9IGFuaW1hdGlvbi5lZmZlY3Q7XG4gICAgICAgIGNvbnN0IGlzQWN0aXZlID0gYW5pbWF0aW9uLnBsYXlTdGF0ZSA9PT0gJ3J1bm5pbmcnIHx8IGFuaW1hdGlvbi5wZW5kaW5nO1xuICAgICAgICBjb25zdCBpc09uRWxlbWVudE9yQW5jZXN0b3IgPSBlZmZlY3QgaW5zdGFuY2VvZiBLZXlmcmFtZUVmZmVjdCAmJiBlZmZlY3QudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudFxuICAgICAgICAgICYmIGNoZWNrSXNTaGFkb3dJbmNsdWRpbmdJbmNsdXNpdmVBbmNlc3RvcihlZmZlY3QudGFyZ2V0LCBlbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIGlzQWN0aXZlICYmIGlzT25FbGVtZW50T3JBbmNlc3RvciAmJiBlZmZlY3QuZ2V0Q29tcHV0ZWRUaW1pbmcoKS5lbmRUaW1lICE9PSBJbmZpbml0eTtcbiAgICAgIH0pXG4gICAgICA6IFtdO1xuICB9XG5cbiAgLy8gYE5vZGUuY29udGFpbnNgIHN0b3BzIGF0IGEgc2hhZG93IHJvb3QsIHNvIGEgaG9zdCBzbGlkaW5nIGluIHdvdWxkIG5vdCBjb3VudCBhcyBtb3ZpbmcgYW4gZWxlbWVudCBpbnNpZGVcbiAgLy8gaXRzIHNoYWRvdyB0cmVlLiBUaGlzIHdhbGtzIHVwIHRocm91Z2ggZWFjaCBzaGFkb3cgcm9vdCB0byBpdHMgaG9zdCwgdGhlIGFuY2VzdHJ5IHRoZSBsYXlvdXQgZm9sbG93cy5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIEl0IGNhbm5vdCBtb3ZlIHRvIHRoZSBvdXRlciBzY29wZTogdGhpcyB3aG9sZSBmdW5jdGlvbiBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIG1heSBub3QgcmVmZXJlbmNlIGFueXRoaW5nIG91dHNpZGUgaXRzZWxmIChMMTUpLlxuICBmdW5jdGlvbiBjaGVja0lzU2hhZG93SW5jbHVkaW5nSW5jbHVzaXZlQW5jZXN0b3IoYW5jZXN0b3I6IE5vZGUsIG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICBsZXQgY3VycmVudDogTm9kZSB8IG51bGwgPSBub2RlO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBpZiAoY3VycmVudCA9PT0gYW5jZXN0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50IGluc3RhbmNlb2YgU2hhZG93Um9vdCA/IGN1cnJlbnQuaG9zdCA6IGN1cnJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKlxuICAgKiBXYWl0cyB1bnRpbCBub3RoaW5nIGlzIG1vdmluZyB0aGUgZWxlbWVudCwgc28gYSBtb2JpbGUgdGFwIGxhbmRzIHdoZXJlIHRoZSBlbGVtZW50IHdpbGwgYmUgcmF0aGVyIHRoYW5cbiAgICogd2hlcmUgaXQgd2FzLiBUaGUgdGFwIGlzIGluamVjdGVkIGZyb20gdGhlIGhvc3QgYW5kIHJlYWNoZXMgdGhlIHBhZ2UgfjEgcyBhZnRlciB0aGlzIHJldHVybnMsIHdoaWNoIGlzXG4gICAqIGxvbmcgZW5vdWdoIGZvciBhIHNsaWRpbmcgbW9kYWwgdG8gY2FycnkgaXRzIGNvbnRyb2xzIGF3YXkgZnJvbSB0aGUgcG9pbnQgdGhhdCB3YXMgcmVhZC5cbiAgICpcbiAgICogVGhlIHNpZ25hbCBpcyB0aGUgQU5JTUFUSU9OUywgbm90IHRoZSByZWN0LiBNZWFzdXJlZCBvbiB0aGUgYG9ic2lkaWFuX3Rlc3RgIGVtdWxhdG9yICgyMDI2LTA5LTI0KTpcbiAgICogT2JzaWRpYW4gTW9iaWxlIG9wZW5zIGEgbW9kYWwgYXQgYHRyYW5zbGF0ZVkoMTE1cHgpYCB3aXRoIGEgYHRyYW5zZm9ybWAgdHJhbnNpdGlvbiB0aGF0IHJlcG9ydHNcbiAgICogYHJ1bm5pbmdgIHdoaWxlIHRoZSBib3ggZG9lcyBub3QgbW92ZSBhdCBhbGwgXHUyMDE0IGZvciB+MTAwIG1zIG5vcm1hbGx5LCBhbmQgZm9yIG92ZXIgMS41IHMgb24gdGhlIGZpcnN0XG4gICAqIG1vZGFsIGFmdGVyIGEgYm9vdC4gQSBydWxlIG9mIFwidGhlIHJlY3QgaGFzIGhlbGQgc3RpbGxcIiBpcyBzYXRpc2ZpZWQgdGhyb3VnaG91dCB0aGF0IGhvbGQsIGF0IHRoZSB3cm9uZ1xuICAgKiBwb2ludC4gVGhlIHJlY3QgaXMgc3RpbGwgcmVxdWlyZWQgdG8gaG9sZCBhY3Jvc3MgdHdvIHJlYWRzLCBmb3IgbGF5b3V0IHRoYXQgbW92ZXMgd2l0aG91dCBhbmltYXRpbmcuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yRWxlbWVudFRvU2V0dGxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgcHJldmlvdXNSZWN0S2V5ID0gJyc7XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHJlY3RLZXkgPSBgJHtTdHJpbmcocmVjdC5sZWZ0KX0sJHtTdHJpbmcocmVjdC50b3ApfSwke1N0cmluZyhyZWN0LndpZHRoKX0sJHtTdHJpbmcocmVjdC5oZWlnaHQpfWA7XG4gICAgICBjb25zdCBtb3ZpbmdBbmltYXRpb25zID0gZ2V0TW92aW5nQW5pbWF0aW9ucyhlbGVtZW50KTtcblxuICAgICAgaWYgKG1vdmluZ0FuaW1hdGlvbnMubGVuZ3RoID09PSAwICYmIHJlY3RLZXkgPT09IHByZXZpb3VzUmVjdEtleSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID49IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbnMgPSBtb3ZpbmdBbmltYXRpb25zLm1hcCgoYW5pbWF0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWZmZWN0ID0gYW5pbWF0aW9uLmVmZmVjdCBhcyBLZXlmcmFtZUVmZmVjdDtcbiAgICAgICAgICBsZXQgbmFtZSA9ICdhbmltYXRpb24nO1xuICAgICAgICAgIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBDU1NUcmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBuYW1lID0gYHRyYW5zaXRpb24gb2YgXFxgJHthbmltYXRpb24udHJhbnNpdGlvblByb3BlcnR5fVxcYGA7XG4gICAgICAgICAgfSBlbHNlIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBDU1NBbmltYXRpb24pIHtcbiAgICAgICAgICAgIG5hbWUgPSBgYW5pbWF0aW9uIFxcYCR7YW5pbWF0aW9uLmFuaW1hdGlvbk5hbWV9XFxgYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGBhICR7bmFtZX0gb24gJHtkZXNjcmliZUVsZW1lbnQoZWZmZWN0LnRhcmdldCl9YDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gcmVhc29ucy5sZW5ndGggPiAwID8gYCR7cmVhc29ucy5qb2luKCcsICcpfSB3YXMgcnVubmluZ2AgOiAnaXRzIGJveCBrZXB0IGNoYW5naW5nJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBcXGBjbGlja0VsZW1lbnRcXGAgZGlkIG5vdCB0YXAgJHtkZXNjcmliZUVsZW1lbnQoZWxlbWVudCl9OiBpdCB3YXMgc3RpbGwgbW92aW5nIGFmdGVyICR7U3RyaW5nKElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcyAoJHtjYXVzZX0pLiBgXG4gICAgICAgICAgICArICdBIHRhcCBhaW1lZCBhdCBpdCBub3cgd291bGQgbGFuZCB3aGVyZSBpdCB1c2VkIHRvIGJlLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNSZWN0S2V5ID0gcmVjdEtleTtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgKiBSZWZ1c2VzIHRvIHRhcCBhIHBvaW50IHRoYXQgYmVsb25ncyB0byBzb21ldGhpbmcgZWxzZS4gQSB0cnVzdGVkIHRhcCBnb2VzIHRvIHdoYXRldmVyIGlzIG9uIHRvcCwgc28gYVxuICAgKiBjb3ZlcmVkIGVsZW1lbnQgd291bGQgb3RoZXJ3aXNlIGhhdmUgaXRzIGNvdmVyIHRhcHBlZCBpbnN0ZWFkIFx1MjAxNCBgLm1vZGFsLWJnYCwgc2F5LCB3aGljaCBjbG9zZXMgdGhlXG4gICAqIG1vZGFsIFx1MjAxNCB3aGlsZSBgY2xpY2tFbGVtZW50YCByZXNvbHZlZCBhcyB0aG91Z2ggaXQgaGFkIGNsaWNrZWQuXG4gICAqXG4gICAqIFRoZSBoaXQgdGVzdCBpcyBhc2tlZCBvZiB0aGUgZWxlbWVudCdzIE9XTiB0cmVlLiBgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludGAgcmV0YXJnZXRzIGEgaGl0IGluc2lkZSBhXG4gICAqIHNoYWRvdyByb290IHRvIHRoZSBzaGFkb3cgaG9zdCwgd2hpY2ggdGhlIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiwgc28gZXZlcnkgc2hhZG93LURPTSB0YXJnZXQgdXNlZCB0b1xuICAgKiBiZSByZWZ1c2VkIGhvd2V2ZXIgdW5vYnN0cnVjdGVkIGl0IHdhcy4gQSBgU2hhZG93Um9vdGAgYW5zd2VycyBgZWxlbWVudEZyb21Qb2ludGAgcmV0YXJnZXRlZCB0byBpdHMgb3duXG4gICAqIHRyZWUgaW5zdGVhZCwgYW5kIGEgbGlnaHQtRE9NIGNvdmVyIG92ZXIgdGhlIGhvc3QgaXMgc3RpbGwgbm90IGluc2lkZSB0aGUgZWxlbWVudCwgc28gaXQgc3RpbGwgcmVmdXNlcy5cbiAgICovXG4gIGZ1bmN0aW9uIGFzc2VydENlbnRlckhpdHNFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCByZWN0OiBET01SZWN0KTogdm9pZCB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuICAgIGNvbnN0IHggPSByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1I7XG4gICAgY29uc3QgeSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUjtcbiAgICBjb25zdCByb290ID0gZWxlbWVudC5nZXRSb290Tm9kZSgpO1xuICAgIGNvbnN0IGhpdEVsZW1lbnQgPSAocm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QgPyByb290IDogZG9jdW1lbnQpLmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgaWYgKGhpdEVsZW1lbnQgJiYgZWxlbWVudC5jb250YWlucyhoaXRFbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBcXGBjbGlja0VsZW1lbnRcXGAgZGlkIG5vdCB0YXAgJHtkZXNjcmliZUVsZW1lbnQoZWxlbWVudCl9OiB0aGUgcG9pbnQgYXQgaXRzIGNlbnRlciAoJHtTdHJpbmcoTWF0aC5yb3VuZCh4KSl9LCAke1N0cmluZyhNYXRoLnJvdW5kKHkpKX0pIGJlbG9uZ3MgdG8gYFxuICAgICAgICArIGAke2Rlc2NyaWJlRWxlbWVudChoaXRFbGVtZW50KX0sIHNvIHRoZSB0YXAgd291bGQgbGFuZCB0aGVyZSBpbnN0ZWFkLiBgXG4gICAgICAgICsgJ1dhaXQgdW50aWwgdGhlIGVsZW1lbnQgaXMgb24gdG9wLCBvciB1c2UgYGNsaWNrTW91c2VgIHRvIHRhcCB0aGF0IHBvaW50IGRlbGliZXJhdGVseS4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1hcHMgT2JzaWRpYW4ncyBgTW9kaWZpZXJgIG5hbWVzIHRvIEVsZWN0cm9uJ3MgbG93ZXJjYXNlIGBzZW5kSW5wdXRFdmVudGAgbW9kaWZpZXIgbmFtZXMuXG4gIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gIC8vIFNoYXJlZCBieSBldmVyeSB0cnVzdGVkLWlucHV0IGhlbHBlciwgc28gYSBrZXkgcHJlc3MgYW5kIGEgY2xpY2sgY2Fubm90IGRpc2FncmVlIG9uIGAnTW9kJ2AuXG4gIGZ1bmN0aW9uIHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzOiByZWFkb25seSBNb2RpZmllcltdKTogRWxlY3Ryb25Nb2RpZmllcltdIHtcbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayBjYW4gcnVuLlxuICAgIGNvbnN0IGlzTWFjT1MgPSAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTWFjT1M7XG5cbiAgICByZXR1cm4gbW9kaWZpZXJzLm1hcCgobW9kaWZpZXIpOiBFbGVjdHJvbk1vZGlmaWVyID0+IHtcbiAgICAgIHN3aXRjaCAobW9kaWZpZXIpIHtcbiAgICAgICAgY2FzZSAnQWx0Jzoge1xuICAgICAgICAgIHJldHVybiAnYWx0JztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDdHJsJzoge1xuICAgICAgICAgIHJldHVybiAnY29udHJvbCc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWV0YSc6IHtcbiAgICAgICAgICByZXR1cm4gJ21ldGEnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ01vZCc6IHtcbiAgICAgICAgICByZXR1cm4gaXNNYWNPUyA/ICdtZXRhJyA6ICdjb250cm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTaGlmdCc6IHtcbiAgICAgICAgICByZXR1cm4gJ3NoaWZ0JztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRXhoYXVzdGl2ZW5lc3MgZ3VhcmQ6IGFkZGluZyBhIGBNb2RpZmllcmAgbWVtYmVyIHdpdGhvdXQgYSBjYXNlIGFib3ZlIGJlY29tZXMgYSBjb21waWxlIGVycm9yLlxuICAgICAgICAgIGNvbnN0IHVua25vd25Nb2RpZmllcjogbmV2ZXIgPSBtb2RpZmllcjtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbW9kaWZpZXI6ICR7U3RyaW5nKHVua25vd25Nb2RpZmllcil9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsaWNrTW91c2UoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBTSU5HTEVfQ0xJQ0tfQ09VTlQgPSAxO1xuXG4gICAgY29uc3QgeyBidXR0b24gPSAnbGVmdCcsIG1vZGlmaWVycyA9IFtdLCB4LCB5IH0gPSBjbGlja1BhcmFtcztcblxuICAgIGNvbnN0IGVsZWN0cm9uTW9kaWZpZXJzID0gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnMpO1xuICAgIGNvbnN0IHJvdW5kZWRYID0gTWF0aC5yb3VuZCh4KTtcbiAgICBjb25zdCByb3VuZGVkWSA9IE1hdGgucm91bmQoeSk7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICAvLyBUb3VjaCBoYXMgbm8gYnV0dG9ucy4gQSBsZWZ0IGNsaWNrIGlzIGEgdGFwOyBhIHJpZ2h0IGNsaWNrIGlzIHRoZSBsb25nLXByZXNzIHRoYXQgb3BlbnMgT2JzaWRpYW5cbiAgICAgIC8vIE1vYmlsZSdzIGNvbnRleHQgbWVudSwgc28gaXQgaXMgaGlkZGVuIGJlaGluZCB0aGUgc2FtZSBuYW1lIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgaGVscGVyLiBBXG4gICAgICAvLyBtaWRkbGUgY2xpY2sgaGFzIG5vIGdlc3R1cmUgYXQgYWxsLCBhbmQgaW52ZW50aW5nIG9uZSB3b3VsZCBiZSB3b3JzZSB0aGFuIHNheWluZyBzby5cbiAgICAgIGlmIChidXR0b24gPT09ICdtaWRkbGUnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGNsaWNrTW91c2UoeyBidXR0b246IFxcJ21pZGRsZVxcJyB9KWAgaGFzIG5vIG1lYW5pbmcgb24gbW9iaWxlOiB0b3VjaCBpbnB1dCBoYXMgbm8gbWlkZGxlIGJ1dHRvbi4nKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgcmVxdWVzdEhvc3RJbnB1dCh7XG4gICAgICAgIGtpbmQ6IGJ1dHRvbiA9PT0gJ3JpZ2h0JyA/ICdsb25nUHJlc3MnIDogJ3RhcCcsXG4gICAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgICB5OiByb3VuZGVkWVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBjbGljayBpcyBtb3VzZU1vdmUgLT4gbW91c2VEb3duIC0+IG1vdXNlVXAgYXQgb25lIHBvaW50LlxuICAgIC8vIENocm9taXVtIHN5bnRoZXNpemVzIHRoZSBgY2xpY2tgIChvciBgY29udGV4dG1lbnVgKSBET00gZXZlbnQgZnJvbSB0aGF0IHNlcXVlbmNlLlxuICAgIC8vIFRoZSBsZWFkaW5nIG1vdmUgaXMgd2hhdCBwdXRzIHRoZSBwb2ludGVyIG92ZXIgdGhlIGhpdC10ZXN0IHRhcmdldCBiZWZvcmUgdGhlIGJ1dHRvbiBnb2VzIGRvd24uXG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnbW91c2VNb3ZlJywgeDogcm91bmRlZFgsIHk6IHJvdW5kZWRZIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGNsaWNrQ291bnQ6IFNJTkdMRV9DTElDS19DT1VOVCxcbiAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICB0eXBlOiAnbW91c2VEb3duJyxcbiAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgeTogcm91bmRlZFlcbiAgICB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7XG4gICAgICBidXR0b24sXG4gICAgICBjbGlja0NvdW50OiBTSU5HTEVfQ0xJQ0tfQ09VTlQsXG4gICAgICBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLFxuICAgICAgdHlwZTogJ21vdXNlVXAnLFxuICAgICAgeDogcm91bmRlZFgsXG4gICAgICB5OiByb3VuZGVkWVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xpY2tFbGVtZW50KGNsaWNrUGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG5cbiAgICBjb25zdCB7IGJ1dHRvbiA9ICdsZWZ0JywgZWxlbWVudCwgbW9kaWZpZXJzID0gW10gfSA9IGNsaWNrUGFyYW1zO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgYXdhaXQgd2FpdEZvckVsZW1lbnRUb1NldHRsZShlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AsIGFuZCBlcXVhbCBDRFAnc1xuICAgIC8vIHBhZ2UgY29vcmRpbmF0ZXMgaW4gdGhlIG1vYmlsZSBXZWJWaWV3IFx1MjAxNCBzbyBuZWl0aGVyIHBhdGggbmVlZHMgYSBkZXZpY2UtcGl4ZWwgY29udmVyc2lvbi5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIGFzc2VydENlbnRlckhpdHNFbGVtZW50KGVsZW1lbnQsIHJlY3QpO1xuICAgIH1cblxuICAgIGF3YWl0IGNsaWNrTW91c2Uoe1xuICAgICAgYnV0dG9uLFxuICAgICAgbW9kaWZpZXJzLFxuICAgICAgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SLFxuICAgICAgeTogcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIENFTlRFUl9ESVZJU09SXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBwcmVzc0tleShwcmVzc1BhcmFtczogUHJlc3NLZXlQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGtleSwgbW9kaWZpZXJzID0gW10gfSA9IHByZXNzUGFyYW1zO1xuXG4gICAgY29uc3QgZWxlY3Ryb25Nb2RpZmllcnMgPSB0b0VsZWN0cm9uTW9kaWZpZXJzKG1vZGlmaWVycyk7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICBhd2FpdCByZXF1ZXN0SG9zdElucHV0KHsga2V5LCBraW5kOiAna2V5JywgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IGdsb2JhbFRoaXMuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuXG4gICAgLy8gQSB0cnVzdGVkIGtleSBwcmVzcyBpcyBrZXlEb3duIC0+IGNoYXIgLT4ga2V5VXA6IGtleURvd24gZmlyZXMgYGtleWRvd25gLCBjaGFyIGZpcmVzXG4gICAgLy8gYGtleXByZXNzYC9gYmVmb3JlaW5wdXRgL2BpbnB1dGAsIGtleVVwIGZpcmVzIGBrZXl1cGAgXHUyMDE0IHRoZSBmdWxsIHJlYWwga2V5IHBpcGVsaW5lLlxuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAna2V5RG93bicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdjaGFyJyB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleVVwJyB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGhvdmVyRWxlbWVudChob3ZlclBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSBob3ZlclBhcmFtcztcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIHRocm93VW5zdXBwb3J0ZWRPbk1vYmlsZSgnaG92ZXJFbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gVmlld3BvcnQgY29vcmRzIGVxdWFsIHdlYi1jb250ZW50cyBESVAgY29vcmRzIGZvciB0aGUgZnVsbC13aW5kb3cgYEJyb3dzZXJXaW5kb3dgLlxuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGF3YWl0IG1vdmVNb3VzZSh7IHg6IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyBDRU5URVJfRElWSVNPUiwgeTogcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIENFTlRFUl9ESVZJU09SIH0pO1xuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgcmVhbCBgOmhvdmVyYCBzdGF0ZSBoYXMgYWN0dWFsbHkgdGFrZW4sIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoIWVsZW1lbnQubWF0Y2hlcygnOmhvdmVyJykgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICBhd2FpdCBzbGVlcChJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgcG9pbnRlciB3YXMgbW92ZWQgdG8gdGhlIGNlbnRlciBvZiB0aGUgZWxlbWVudCwgYnV0IGl0IG5ldmVyIG1hdGNoZWQgXFxgOmhvdmVyXFxgIHdpdGhpbiAke1N0cmluZyhJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIGBcbiAgICAgICAgICArICdNb3N0IG9mdGVuIHRoZSBjZW50ZXIgYmVsb25ncyB0byBzb21ldGhpbmcgb24gdG9wIG9mIHRoZSBlbGVtZW50LCBvciB0aGUgZWxlbWVudCBtb3ZlZCBhZnRlciBpdHMgYm94IHdhcyByZWFkLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXF1aXJlLWF3YWl0IC0tIEFzeW5jIHRvIG1hdGNoIGl0cyBtb2JpbGUtY2FwYWJsZSBzaWJsaW5ncyBhbmQgdG8ga2VlcCBvbmUgYFByb21pc2U8dm9pZD5gIHNoYXBlIGFjcm9zcyB0aGUgdHJ1c3RlZC1pbnB1dCBzZXQ7IHRoZSBkZXNrdG9wIGJvZHkgaXMgZ2VudWluZWx5IHN5bmNocm9ub3VzLlxuICBhc3luYyBmdW5jdGlvbiBtb3ZlTW91c2UobW92ZVBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKCdtb3ZlTW91c2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IGdsb2JhbFRoaXMuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsgdHlwZTogJ21vdXNlTW92ZScsIHg6IE1hdGgucm91bmQobW92ZVBhcmFtcy54KSwgeTogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLnkpIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdW5ob3ZlckVsZW1lbnQodW5ob3ZlclBhcmFtczogVW5ob3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG4gICAgY29uc3QgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTID0gMTtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gdW5ob3ZlclBhcmFtcztcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIHRocm93VW5zdXBwb3J0ZWRPbk1vYmlsZSgndW5ob3ZlckVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIE1vdmUgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgdGhlIGVsZW1lbnQncyBib3guIFdoZW4gZmx1c2ggYWdhaW5zdCB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UsIHVzZSBqdXN0XG4gICAgICogcGFzdCB0aGUgcmlnaHQgZWRnZS4gQSBmdWxsLXZpZXdwb3J0LXdpZHRoIGVsZW1lbnQgc2hvdWxkIHVzZSBgbW92ZU1vdXNlYCBkaXJlY3RseSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogVGhlIGVkZ2UgaXMgU05BUFBFRCBhd2F5IGZyb20gdGhlIGJveCBiZWZvcmUgdGhlIG9mZnNldCBpcyBhcHBsaWVkLCBhbmQgdGhhdCBpcyB0aGUgd2hvbGUgY29ycmVjdG5lc3NcbiAgICAgKiBvZiB0aGlzIGZ1bmN0aW9uLiBBIGxheW91dCBib3ggcmFyZWx5IGxhbmRzIG9uIGEgd2hvbGUgcGl4ZWwsIGFuZCBgbW92ZU1vdXNlYCByb3VuZHMgXHUyMDE0IHNvIHN1YnRyYWN0aW5nXG4gICAgICogb25lIGZyb20gYSBmcmFjdGlvbmFsIGxlZnQgZWRnZSByb3VuZHMgc3RyYWlnaHQgYmFjayBvbnRvIHRoZSBlbGVtZW50J3Mgb3duIHBpeGVsIGNvbHVtbiBhbmQgdGhlXG4gICAgICogcG9pbnRlciBuZXZlciBsZWF2ZXMuIE1lYXN1cmVkIG9uIGEgYmFyIHdob3NlIGBsZWZ0YCB3YXMgODU5Ljc5Njg3NTogdGhlIHBsYWluIGBsZWZ0IC0gMWAgYmVjb21lcyA4NTlcbiAgICAgKiBhbmQgYDpob3ZlcmAgbmV2ZXIgY2xlYXJzLCB3aGlsZSBgTWF0aC5mbG9vcihsZWZ0KSAtIDFgIGJlY29tZXMgODU4IGFuZCBpdCBjbGVhcnMgaW4gMjYgbXMuIFNuYXBwaW5nXG4gICAgICogZmlyc3QgbWVhbnMgdGhlIG9mZnNldCBpcyBhIHdob2xlIHBpeGVsIG9mIHJlYWwgY2xlYXJhbmNlIGluc3RlYWQgb2Ygd2hhdGV2ZXIgdGhlIGZyYWN0aW9uIGxlYXZlcy5cbiAgICAgKi9cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gcmVjdC5sZWZ0ID49IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMU1xuICAgICAgPyBNYXRoLmZsb29yKHJlY3QubGVmdCkgLSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFNcbiAgICAgIDogTWF0aC5jZWlsKHJlY3QucmlnaHQpICsgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTO1xuICAgIGNvbnN0IHkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1I7XG4gICAgYXdhaXQgbW92ZU1vdXNlKHsgeCwgeSB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IGNsZWFyZWQsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHBvaW50ZXIgd2FzIG1vdmVkIG91dHNpZGUgdGhlIGVsZW1lbnQncyBib3gsIGJ1dCBpdCBzdGlsbCBtYXRjaGVkIFxcYDpob3ZlclxcYCBhZnRlciAke1N0cmluZyhJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIGBcbiAgICAgICAgICArICdBbiBlbGVtZW50IHRoYXQgc3BhbnMgdGhlIGZ1bGwgdmlld3BvcnQgaGFzIG5vIHBvaW50IG91dHNpZGUgaXRzIGJveCB0byBtb3ZlIHRvIFx1MjAxNCB1c2UgYG1vdmVNb3VzZWAgdG8gYSBrbm93biBlbXB0eSBjb29yZGluYXRlIGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb3RlKG5vdGVQYXJhbXM6IENyZWF0ZU5vdGVQYXJhbXMpOiBQcm9taXNlPFRGaWxlPiB7XG4gICAgY29uc3QgeyBjb250ZW50LCBwYXRoIH0gPSBub3RlUGFyYW1zO1xuXG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IG5zLmFwcC52YXVsdC5jcmVhdGUocGF0aCwgY29udGVudCk7XG5cbiAgICAvLyBSZWFkIHRoZSBmaWxlIGJhY2sgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYGZpbGUuc3RhdGAuIGBzdGF0YCBpcyBwcmVjaXNlbHlcbiAgICAvLyB0aGUgZmllbGQgdGhhdCBsaWVzIGhlcmU6IG9uIGEgbG9zdCB3cml0ZSBpdCByZXBvcnRzIHRoZSBmdWxsIGJ5dGUgY291bnRcbiAgICAvLyB3aGlsZSB0aGUgZmlsZXN5c3RlbSBob2xkcyB6ZXJvIGJ5dGVzLlxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBhd2FpdCBucy5hcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgIGlmIChhY3R1YWxDb250ZW50ID09PSBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0ZW1wdCA9PT0gQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBjcmVhdGVOb3RlIGNvdWxkIG5vdCB3cml0ZSBcIiR7cGF0aH1cIjogZXhwZWN0ZWQgJHtTdHJpbmcoY29udGVudC5sZW5ndGgpfSBjaGFyYWN0ZXJzLCBgXG4gICAgICAgICAgICArIGB0aGUgdmF1bHQgaG9sZHMgJHtTdHJpbmcoYWN0dWFsQ29udGVudC5sZW5ndGgpfSBhZnRlciAke1N0cmluZyhDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVCl9IHJlcGFpciBhdHRlbXB0cy5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgcmV3cml0ZSBvZiB0aGUgc2FtZSBjb250ZW50IGxhbmRzIGNvcnJlY3RseSBcdTIwMTQgbWVhc3VyZWQuIFRoaXMgaXMgdGhlXG4gICAgICAvLyB3aG9sZSB3b3JrYXJvdW5kLlxuICAgICAgYXdhaXQgbnMuYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBVbnJlYWNoYWJsZTogdGhlIGxvb3AgZWl0aGVyIHJldHVybnMgb3IgdGhyb3dzIG9uIGl0cyBsYXN0IGl0ZXJhdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZU5vdGUgY291bGQgbm90IHdyaXRlIFwiJHtwYXRofVwiLmApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gb3BlblNldHRpbmdzVGFiKG9wZW5QYXJhbXM6IE9wZW5TZXR0aW5nc1RhYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhYklkLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBTRVRUSU5HU19UQUJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSA9IG9wZW5QYXJhbXM7XG5cbiAgICBjb25zdCBzZXR0aW5nID0gbnMuYXBwLnNldHRpbmc7XG5cbiAgICAvKlxuICAgICAqIEEgRkFMTEJBQ0sgZm9yIGEgdmF1bHQgdGhhdCBkb2VzIG5vdCBjYXJyeSB0aGUgaGFybmVzcydzIGBzZXR0aW5nc1BvcG91dFdpbmRvdzogZmFsc2VgIGRlZmF1bHQgXHUyMDE0XG4gICAgICogQW5kIGl0IE1VU1QgaGFwcGVuIGJlZm9yZSBgb3BlbigpYC5cbiAgICAgKlxuICAgICAqIFdpdGggdGhlIGRlZmF1bHQgaW4gcGxhY2UgYG9wZW4oKWAgYXR0YWNoZXMgYGNvbnRhaW5lckVsYCB0byB0aGlzIGRvY3VtZW50IGl0c2VsZiwgYW5kIHRoaXMgYnJhbmNoXG4gICAgICogTmV2ZXIgZmlyZXMgKG1lYXN1cmVkLCBgb3duZWQtaW5zdGFuY2Utd29ya2VyLWF0dGFjaC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCkuIFdpdGhvdXQgaXQgT2JzaWRpYW5cbiAgICAgKiBTaGlwcyB0aGUga2V5IGB0cnVlYCwgYHNob3VsZFVzZVBvcG91dCgpYCByZXR1cm5zIGl0LCBhbmQgYG9wZW4oKWAgcHV0cyB0aGUgbW9kYWwgaW4gYSBTRUNPTkRcbiAgICAgKiBFbGVjdHJvbiB3aW5kb3cgaW5zdGVhZCBcdTIwMTQgbGVhdmluZyB0aGlzIGRvY3VtZW50IHdpdGggbm90aGluZyB3aGlsZSByZXR1cm5pbmcgd2l0aG91dCB0aHJvd2luZy5cbiAgICAgKiBQcmUtYXR0YWNoaW5nIGtlZXBzIGBjb250YWluZXJFbGAgcmVhY2hhYmxlIGhlcmUsIHdoaWNoIGlzIGVub3VnaCBmb3IgYSBjYWxsZXIgdGhhdCByZWFkcyByb3dzIG9mZlxuICAgICAqIFRoZSB0YWI7IGl0IGlzIE5PVCBlbm91Z2ggZm9yIGEgc2NyZWVuc2hvdCwgd2hvc2UgZnJhbWUgaXMgb2YgdGhpcyB3aW5kb3cuIE9ubHkgdGhlIHZhdWx0LWxldmVsXG4gICAgICogRGVmYXVsdCBmaXhlcyB0aGF0LCBzbyB0aGlzIGlzIGEgZmxvb3IgcmF0aGVyIHRoYW4gdGhlIGZpeC5cbiAgICAgKlxuICAgICAqIEF0dGFjaGluZyBBRlRFUldBUkRTIGlzIHVzZWxlc3MgZWl0aGVyIHdheTogd2hhdGV2ZXIgdGhlIG1vZGFsIHJlbmRlcmVkIG9uIG9wZW4gaGFzIGFscmVhZHkgZ29uZVxuICAgICAqIFdoZXJlIGl0IHdlbnQuXG4gICAgICovXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHNldHRpbmcuY29udGFpbmVyRWwpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChzZXR0aW5nLmNvbnRhaW5lckVsKTtcbiAgICB9XG5cbiAgICAvLyBCb3RoIGxpc3RzIGFyZSBwb3B1bGF0ZWQgYmVmb3JlIGBvcGVuKClgLCBzbyBhbiB1bmtub3duIGlkIGNhbiBiZSByZWplY3RlZCB1cCBmcm9udCBcdTIwMTQgd2l0aCB0aGVcbiAgICAvLyBpZHMgdGhhdCBETyBleGlzdCBcdTIwMTQgaW5zdGVhZCBvZiBzcGVuZGluZyB0aGUgd2hvbGUgdGltZW91dCBsb29raW5nIGV4YWN0bHkgbGlrZSB0aGUgbW9kYWwtZG9lcy1cbiAgICAvLyBub3QtcmVuZGVyIHN5bXB0b20gdGhpcyBoZWxwZXIgZXhpc3RzIHRvIHJ1bGUgb3V0LiBQbHVnaW4gdGFicyBsaXZlIGluIGBwbHVnaW5UYWJzYCwgbm90XG4gICAgLy8gYHNldHRpbmdUYWJzYCwgc28gYm90aCBhcmUgc2VhcmNoZWQuXG4gICAgY29uc3Qga25vd25UYWJzID0gWy4uLnNldHRpbmcuc2V0dGluZ1RhYnMsIC4uLnNldHRpbmcucGx1Z2luVGFic107XG4gICAgaWYgKGtub3duVGFicy5ldmVyeSgodGFiKSA9PiB0YWIuaWQgIT09IHRhYklkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgb3BlblNldHRpbmdzVGFiOiBubyBzZXR0aW5ncyB0YWIgd2l0aCBpZCBcIiR7dGFiSWR9XCIuIEF2YWlsYWJsZSBpZHM6ICR7a25vd25UYWJzLm1hcCgodGFiKSA9PiB0YWIuaWQpLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dGluZy5vcGVuKCk7XG4gICAgc2V0dGluZy5vcGVuVGFiQnlJZCh0YWJJZCk7XG5cbiAgICAvLyBQb2xsIHRoZSBtb2RhbCdzIG93biBzdGF0ZSByYXRoZXIgdGhhbiBzbGVlcGluZzogYSBmaXhlZCBkZWxheSBpcyBlaXRoZXIgdG9vIHNob3J0IG9uIGEgbG9hZGVkXG4gICAgLy8gbWFjaGluZSBvciB3YXN0ZWQgdGltZS4gQSByZW5kZXJlZCB0YWIgaXMgdGhlIHJlcXVlc3RlZCBvbmUgQU5EIGhhcyBjb250ZW50LlxuICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICBtZXNzYWdlOiBgdGhlIFwiJHt0YWJJZH1cIiBzZXR0aW5ncyB0YWIgdG8gcmVuZGVyYCxcbiAgICAgIHByZWRpY2F0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFiID0gc2V0dGluZy5hY3RpdmVUYWI7XG4gICAgICAgIHJldHVybiAhIWN1cnJlbnRUYWIgJiYgY3VycmVudFRhYi5pZCA9PT0gdGFiSWQgJiYgY3VycmVudFRhYi5jb250YWluZXJFbC5jaGlsZEVsZW1lbnRDb3VudCA+IDA7XG4gICAgICB9LFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG5cbiAgICBjb25zdCBhY3RpdmVUYWIgPSBzZXR0aW5nLmFjdGl2ZVRhYjtcbiAgICBpZiAoIWFjdGl2ZVRhYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcGVuU2V0dGluZ3NUYWI6IHRoZSBzZXR0aW5ncyBtb2RhbCByZXBvcnRlZCBubyBhY3RpdmUgdGFiIGFmdGVyIGl0IHJlbmRlcmVkLicpO1xuICAgIH1cblxuICAgIC8vIE5vdCBldmVyeSB0YWIgcmVuZGVycyBgLnNldHRpbmctaXRlbS1uYW1lYCByb3dzIChIb3RrZXlzIGRvZXMgbm90KSwgc28gYW4gZW1wdHkgYXJyYXkgaXMgYSB2YWxpZFxuICAgIC8vIGFuc3dlciBoZXJlIFx1MjAxNCB0aGUgcmVuZGVyIGl0c2VsZiB3YXMgYWxyZWFkeSBwcm92ZW4gYnkgdGhlIHBvbGwgYWJvdmUuXG4gICAgcmV0dXJuIFsuLi5hY3RpdmVUYWIuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbCgnLnNldHRpbmctaXRlbS1uYW1lJyldLm1hcCgobmFtZUVsKSA9PiBuYW1lRWwudGV4dENvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FpdFVudGlsKHdhaXRQYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9ID0gd2FpdFBhcmFtcztcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCEoYXdhaXQgcHJlZGljYXRlKCkpKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSB0aW1lb3V0SW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgOiAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YWl0VW50aWwgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kcyR7c3VmZml4fWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2xlZXAoaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLnN0YWNrID8/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBpZiAoZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGVycm9yLmNhdXNlLCAnQ2F1c2VkIGJ5OicpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgICAgY29uc3QgYWdncmVnYXRlZEVycm9yczogcmVhZG9ubHkgdW5rbm93bltdID0gZXJyb3IuZXJyb3JzO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFnZ3JlZ2F0ZWRFcnJvcl0gb2YgYWdncmVnYXRlZEVycm9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGFnZ3JlZ2F0ZWRFcnJvciwgYEFnZ3JlZ2F0ZWQgZXJyb3IgIyR7U3RyaW5nKGluZGV4ICsgMSl9OmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2U6IHN0cmluZywgbmVzdGVkRXJyb3I6IHVua25vd24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBgJHttZXNzYWdlfVxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZSl9YDtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXJyb3JUb1N0cmluZ0ltcGwobmVzdGVkRXJyb3IpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgaWYgKCFsaW5lLnRyaW0oKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBsaW5lLnN0YXJ0c1dpdGgoU1RBQ0tfVFJBQ0VfUFJFRklYKVxuICAgICAgICA/IGBcXG4ke2xpbmV9YFxuICAgICAgICA6IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUobGluZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1NUQUNLX1RSQUNFX1BSRUZJWH0gLS0tICR7dGl0bGV9IC0tLSAoMClgO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFpQ0EsU0FBUyw0QkFBNEI7QUFDckM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWtDUCxlQUFzQiw0QkFBNEIsV0FBOEIsS0FBYSx1QkFBK0M7QUFDMUksUUFBTSxjQUFvQztBQUFBLElBQ3hDO0FBQUEsSUFDQSxHQUFJ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LE1BQ0oseUJBQXlCO0FBQUEsTUFDekI7QUFBQSxNQUNBO0FBQUEsTUFDQSx3QkFBd0I7QUFBQSxJQUMxQixJQUFJO0FBRUosVUFBTSxZQUFZLEtBQUssSUFBSTtBQUMzQixXQUFPLENBQUUsTUFBTSxVQUFVLEdBQUk7QUFDM0IsVUFBSSxLQUFLLElBQUksSUFBSSxhQUFhLHVCQUF1QjtBQUNuRCxjQUFNLFNBQVMsWUFBWSxTQUFZLEtBQUssS0FBSyxPQUFPO0FBQ3hELGNBQU0sSUFBSSxNQUFNLDZCQUE2QixPQUFPLHFCQUFxQixDQUFDLGdCQUFnQixNQUFNLEVBQUU7QUFBQSxNQUNwRztBQUNBLFlBQU0sTUFBTSxzQkFBc0I7QUFBQSxJQUNwQztBQUFBLEVBQ0Y7QUFFQSxXQUFTLGtCQUFrQixPQUF3QjtBQUNqRCxRQUFJLEVBQUUsaUJBQWlCLFFBQVE7QUFDN0IsYUFBTyxPQUFPLEtBQUs7QUFBQSxJQUNyQjtBQUVBLFFBQUksVUFBVSxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksS0FBSyxNQUFNLE9BQU87QUFDNUQsUUFBSSxNQUFNLFVBQVUsUUFBVztBQUM3QixnQkFBVSxrQkFBa0IsU0FBUyxNQUFNLE9BQU8sWUFBWTtBQUFBLElBQ2hFO0FBQ0EsUUFBSSxpQkFBaUIsZ0JBQWdCO0FBQ25DLFlBQU0sbUJBQXVDLE1BQU07QUFDbkQsaUJBQVcsQ0FBQyxPQUFPLGVBQWUsS0FBSyxpQkFBaUIsUUFBUSxHQUFHO0FBQ2pFLGtCQUFVLGtCQUFrQixTQUFTLGlCQUFpQixxQkFBcUIsT0FBTyxRQUFRLENBQUMsQ0FBQyxHQUFHO0FBQUEsTUFDakc7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFFQSxXQUFTLGtCQUFrQixTQUFpQixhQUFzQixPQUF1QjtBQUN2RixRQUFJLFNBQVMsR0FBRyxPQUFPO0FBQUEsRUFBSyx1QkFBdUIsS0FBSyxDQUFDO0FBQ3pELGVBQVcsUUFBUSxrQkFBa0IsV0FBVyxFQUFFLE1BQU0sSUFBSSxHQUFHO0FBQzdELFVBQUksQ0FBQyxLQUFLLEtBQUssR0FBRztBQUNoQjtBQUFBLE1BQ0Y7QUFDQSxnQkFBVSxLQUFLLFdBQVcsa0JBQWtCLElBQ3hDO0FBQUEsRUFBSyxJQUFJLEtBQ1Q7QUFBQSxFQUFLLHVCQUF1QixJQUFJLENBQUM7QUFBQSxJQUN2QztBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsV0FBUyx1QkFBdUIsT0FBdUI7QUFDckQsV0FBTyxHQUFHLGtCQUFrQixRQUFRLEtBQUs7QUFBQSxFQUMzQztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import type { ObsidianTransport } from './transport.mjs';
7
7
  /**
8
- * Content value for a single entry in a {@link PopulateFiles} map.
8
+ * Content value for a single entry in a {@link PopulateFilesParams} map.
9
9
  *
10
10
  * - `string` — text file (written as UTF-8).
11
11
  * - `Uint8Array` — binary file (written as raw bytes; `Buffer` is accepted
@@ -190,4 +190,4 @@ async function retryRm(path) {
190
190
  export {
191
191
  TemporaryVault
192
192
  };
193
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlbXBvcmFyeS12YXVsdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1hbmFnZXMgdGVtcG9yYXJ5IHZhdWx0IGxpZmVjeWNsZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBta2R0ZW1wU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlLFxuICBybVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5cbmltcG9ydCB7IGdldFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmltcG9ydCB7IFRFTVBfVkFVTFRfRElSX1BSRUZJWCB9IGZyb20gJy4vbGVmdG92ZXItY2xlYW51cC5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGdldE9yQ3JlYXRlVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5tanMnO1xuaW1wb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkubWpzJztcblxuLyoqXG4gKiBDb250ZW50IHZhbHVlIGZvciBhIHNpbmdsZSBlbnRyeSBpbiBhIHtAbGluayBQb3B1bGF0ZUZpbGVzfSBtYXAuXG4gKlxuICogLSBgc3RyaW5nYCBcdTIwMTQgdGV4dCBmaWxlICh3cml0dGVuIGFzIFVURi04KS5cbiAqIC0gYFVpbnQ4QXJyYXlgIFx1MjAxNCBiaW5hcnkgZmlsZSAod3JpdHRlbiBhcyByYXcgYnl0ZXM7IGBCdWZmZXJgIGlzIGFjY2VwdGVkXG4gKiAgIGJlY2F1c2UgYEJ1ZmZlciBleHRlbmRzIFVpbnQ4QXJyYXlgKS5cbiAqIC0gYHVuZGVmaW5lZGAgXHUyMDE0IGVtcHR5IGZvbGRlciAodGhlIGtleSAqKm11c3QqKiBlbmQgd2l0aCBgL2ApLlxuICovXG5leHBvcnQgdHlwZSBQb3B1bGF0ZUZpbGVDb250ZW50ID0gc3RyaW5nIHwgVWludDhBcnJheSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIG1hcCBvZiB2YXVsdC1yZWxhdGl2ZSBwYXRocyB0byB0aGVpciBjb250ZW50LCB1c2VkIGJ5XG4gKiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucG9wdWxhdGV9LlxuICpcbiAqIFBhdGhzIGVuZGluZyB3aXRoIGAvYCBkZW5vdGUgZm9sZGVycyBhbmQgKiptdXN0KiogaGF2ZSBhbiBgdW5kZWZpbmVkYCB2YWx1ZS5cbiAqIEFsbCBvdGhlciBwYXRocyBhcmUgd3JpdHRlbiBhcyBmaWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUG9wdWxhdGVGaWxlc1BhcmFtcyA9IFJlY29yZDxzdHJpbmcsIFBvcHVsYXRlRmlsZUNvbnRlbnQ+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgVGVtcG9yYXJ5VmF1bHR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBvcmFyeVZhdWx0Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIge0BsaW5rIFRlbXBvcmFyeVZhdWx0LmRpc3Bvc2V9IHJlbW92ZXMgdGhlIHZhdWx0ICoqZGlyZWN0b3J5KiouXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gd2hldGhlciB0aGlzIGluc3RhbmNlIGNyZWF0ZWQgdGhhdCBkaXJlY3RvcnkgXHUyMDE0IGB0cnVlYCBmb3IgYSB0ZW1wXG4gICAqIGRpcmVjdG9yeSB0aGUgY29uc3RydWN0b3IgbWFkZSAobm8gYHBhdGhgIGFyZ3VtZW50KSwgYGZhbHNlYCBmb3IgYSBkaXJlY3RvcnkgaGFuZGVkIHRvIGl0IGFzIGFuXG4gICAqIGV4cGxpY2l0IGBwYXRoYC4gQSBoYW5kbGUgb3ZlciBzb21lYm9keSBlbHNlJ3MgZGlyZWN0b3J5IHVucmVnaXN0ZXJzIHRoZSB2YXVsdCBidXQgbGVhdmVzIHRoZVxuICAgKiBmaWxlcyBhbG9uZSwgc28gd3JhcHBpbmcgYSBkaXJlY3RvcnkgY2Fubm90IGRlc3Ryb3kgaXQuIFNldCBleHBsaWNpdGx5IHRvIG92ZXJyaWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVtb3ZlRGlyZWN0b3J5T25EaXNwb3NlPzogYm9vbGVhbjtcbn1cblxuY29uc3QgUk1fUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgUk1fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMF8wMDA7XG5cbi8qKlxuICogQSB0ZW1wb3JhcnkgT2JzaWRpYW4gdmF1bHQgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIENyZWF0ZXMgYSB0ZW1wIGRpcmVjdG9yeSBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlXG4gKiBzbyB0aGF0IHRoZSBPYnNpZGlhbiBDTEkgY2FuIHRhcmdldCBpdCB2aWEgYGN3ZGAuXG4gKlxuICogQSBoYW5kbGUgKipvd25zKiogdGhlIGRpcmVjdG9yeSBvbmx5IHdoZW4gaXQgY3JlYXRlZCBpdC4ge0BsaW5rIFRlbXBvcmFyeVZhdWx0LmRpc3Bvc2V9IGRlbGV0ZXMgYW5cbiAqIG93bmVkIGRpcmVjdG9yeSBhbmQgbGVhdmVzIGEgYm9ycm93ZWQgb25lIGluIHBsYWNlIFx1MjAxNCBzZWVcbiAqIHtAbGluayBUZW1wb3JhcnlWYXVsdENvbnN0cnVjdG9yT3B0aW9ucy5zaG91bGRSZW1vdmVEaXJlY3RvcnlPbkRpc3Bvc2V9LCB3aGljaCBvdmVycmlkZXMgdGhhdCBkZWZhdWx0LlxuICovXG5leHBvcnQgY2xhc3MgVGVtcG9yYXJ5VmF1bHQge1xuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHRlbXBvcmFyeSB2YXVsdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIge0BsaW5rIFRlbXBvcmFyeVZhdWx0LmRpc3Bvc2V9IHJlbW92ZXMge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnBhdGh9IGZyb20gZGlzay5cbiAgICovXG4gIHJlYWRvbmx5ICNzaG91bGRSZW1vdmVEaXJlY3RvcnlPbkRpc3Bvc2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdGVtcCB2YXVsdC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBBbiBleHBsaWNpdCB2YXVsdCBwYXRoLiBJZiBvbWl0dGVkLCBhIHRlbXAgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVmF1bHQgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoPzogc3RyaW5nLCBvcHRpb25zPzogVGVtcG9yYXJ5VmF1bHRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLnBhdGggPSBwYXRoID8/IG1rZHRlbXBTeW5jKGpvaW4odG1wZGlyKCksIFRFTVBfVkFVTFRfRElSX1BSRUZJWCkpO1xuICAgIHRoaXMuI3Nob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSA9IG9wdGlvbnM/LnNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSA/PyBwYXRoID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIHZhdWx0IGZyb20gT2JzaWRpYW4gYW5kLCB3aGVuIHRoaXMgaGFuZGxlIG93bnMgdGhlIGRpcmVjdG9yeSwgZGVsZXRlcyBpdC5cbiAgICpcbiAgICogVGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIG9ubHkgd2hlbiB0aGlzIGluc3RhbmNlIGNyZWF0ZWQgaXQsIG9yIHdoZW5cbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0Q29uc3RydWN0b3JPcHRpb25zLnNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZX0gc2FpZCBzbyBleHBsaWNpdGx5LiBUaGF0IGlzIHdoYXRcbiAgICogbWFrZXMgYSBoYW5kbGUgb3ZlciBhIGRpcmVjdG9yeSBzb21lYm9keSBlbHNlIG93bnMgXHUyMDE0IHRoZSBydW4ncyBzaGFyZWQgc2V0dXAgdmF1bHQsIHNheSwgd2hpY2hcbiAgICogYGdldFRlbXBvcmFyeVZhdWx0KClgIHdyYXBzIFx1MjAxNCBzYWZlIHRvIGRpc3Bvc2UgZnJvbSBhIGNvbnN1bWVyJ3MgYGFmdGVyQWxsYC5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zcG9ydE92ZXJyaWRlIC0gQW4gZXhwbGljaXQgdHJhbnNwb3J0IHRvIHVzZSB3aGVuIHVucmVnaXN0ZXJpbmcuXG4gICAqICAgV2hlbiBvbWl0dGVkLCBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSh0cmFuc3BvcnRPdmVycmlkZT86IE9ic2lkaWFuVHJhbnNwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVucmVnaXN0ZXJWYXVsdCh0aGlzLnBhdGgsIHRyYW5zcG9ydE92ZXJyaWRlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuI3Nob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSkge1xuICAgICAgICBhd2FpdCByZXRyeVJtKHRoaXMucGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFt0ZW1wb3JhcnktdmF1bHRdIFVucmVnaXN0ZXJlZCBidXQga2VwdCB0aGUgdmF1bHQgZGlyZWN0b3J5LCB3aGljaCB0aGlzIGhhbmRsZSBkb2VzIG5vdCBvd246ICR7dGhpcy5wYXRofWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgZmlsZXMgYW5kIGZvbGRlcnMgaW50byB0aGUgdmF1bHQgZGlyZWN0b3J5ICoqb24gdGhlIGhvc3QqKi5cbiAgICogUGFyZW50IGRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIC0gYHN0cmluZ2AgdmFsdWVzIGFyZSB3cml0dGVuIGFzIFVURi04IHRleHQgZmlsZXMuXG4gICAqIC0gYFVpbnQ4QXJyYXlgIHZhbHVlcyAoaW5jbHVkaW5nIGBCdWZmZXJgKSBhcmUgd3JpdHRlbiBhcyBiaW5hcnkgZmlsZXMuXG4gICAqIC0gUGF0aHMgZW5kaW5nIHdpdGggYC9gIGFyZSB0cmVhdGVkIGFzIGVtcHR5IGZvbGRlcnMgKHZhbHVlIG11c3QgYmUgYHVuZGVmaW5lZGApLlxuICAgKlxuICAgKiBUaGUgd3JpdGUgaXMgYWx3YXlzIGhvc3QtbG9jYWwgXHUyMDE0IHtAbGluayBUZW1wb3JhcnlWYXVsdC5wYXRofSBpcyBhIGhvc3QgcGF0aCwgYW5kIG9uIGEgbW9iaWxlXG4gICAqIHRyYW5zcG9ydCB0aGUgdmF1bHQgdGhlIGFwcCBvcGVucyBsaXZlcyBvbiB0aGUgZGV2aWNlIGluc3RlYWQuIHtAbGluayBUZW1wb3JhcnlWYXVsdC5yZWdpc3Rlcn1cbiAgICogY2FycmllcyB0aGUgZGlyZWN0b3J5IGFjcm9zcyBiZWZvcmUgaXQgcmVnaXN0ZXJzLCBzbyBwb3B1bGF0ZS10aGVuLXJlZ2lzdGVyIGlzIGFsbCBhIGNhbGxlclxuICAgKiBuZWVkczsge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnN5bmNUb0RldmljZX0gaXMgdGhlIHNlYW0gdGhhdCBkb2VzIHRoZSBjYXJyeWluZy5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVzIC0gTWFwIG9mIGZpbGUvZm9sZGVyIHBhdGhzIHRvIGNvbnRlbnQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW4tZGV2LXV0aWxzL3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2ggLS0gUGVybWFuZW50OiBgUG9wdWxhdGVGaWxlc1BhcmFtc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgdGhpcyBtZXRob2QgYW5kIHRoZSBjb25maWctZGlyZWN0b3J5IHJlbWFwIGluIGBnbG9iYWwtc2V0dXAtY29yZS50c2AsIHNvIG5vIHBlci1vd25lciBuYW1lIGNhbiBzYXRpc2Z5IGJvdGguXG4gIHB1YmxpYyBwb3B1bGF0ZShmaWxlczogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhmaWxlcykpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbih0aGlzLnBhdGgsIGZpbGVQYXRoKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvbGRlciBwYXRoIFwiJHtmaWxlUGF0aH1cIiBtdXN0IGhhdmUgdW5kZWZpbmVkIGNvbnRlbnRgKTtcbiAgICAgICAgfVxuICAgICAgICBta2RpclN5bmMoZnVsbFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBwYXRoIFwiJHtmaWxlUGF0aH1cIiBtdXN0IGhhdmUgZGVmaW5lZCBjb250ZW50OyB1c2UgYSB0cmFpbGluZyBcIi9cIiBmb3IgZm9sZGVyc2ApO1xuICAgICAgICB9XG4gICAgICAgIG1rZGlyU3luYyhkaXJuYW1lKGZ1bGxQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHdyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhpcyB2YXVsdCBpbiB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZSBzbyB0aGUgQ0xJIGNhbiB0YXJnZXQgaXQuXG4gICAqXG4gICAqIFB1c2hlcyB0aGUgdmF1bHQgZGlyZWN0b3J5IHRvIHRoZSB0YXJnZXQgZGV2aWNlIGZpcnN0LCB2aWFcbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnN5bmNUb0RldmljZX0gXHUyMDE0IGEgbm8tb3Agb24gYSB0cmFuc3BvcnQgd2hvc2UgYXBwIGFscmVhZHkgcmVhZHMgdGhlIGhvc3RcbiAgICogZmlsZXN5c3RlbS4gVGhhdCBvcmRlcmluZyB1c2VkIHRvIGJlIHRoZSBjYWxsZXIncyB0byByZW1lbWJlciwgYW5kIGEgY2FsbGVyIHdobyBmb3Jnb3QgZ290IGFcbiAgICogc2lsZW50bHkgKiplbXB0eSoqIHZhdWx0IHJhdGhlciB0aGFuIGFuIGVycm9yOiBldmVyeSBwcmUtcmVnaXN0cmF0aW9uXG4gICAqIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0gd3JpdGUgc3RheWVkIG9uIHRoZSBob3N0IHdoaWxlIHRoZSBhcHAgb3BlbmVkIHRoZSBkZXZpY2UncyBjb3B5LlxuICAgKiBGb2xkaW5nIGl0IGluIGhlcmUgbWFrZXMgcG9wdWxhdGUtdGhlbi1yZWdpc3RlciBjb3JyZWN0IG9uIGV2ZXJ5IHRyYW5zcG9ydC5cbiAgICpcbiAgICogVGhlIHRyYW5zcG9ydCBpcyByZXNvbHZlZCBvbmNlIGFuZCBoYW5kZWQgdG8gYm90aCBzdGVwcywgc28gYSBwdXNoIGFuZCB0aGUgcmVnaXN0cmF0aW9uIHRoYXRcbiAgICogZm9sbG93cyBpdCBjYW4gbmV2ZXIgbGFuZCBvbiB0d28gZGlmZmVyZW50IHRyYW5zcG9ydHMuXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc3BvcnRPdmVycmlkZSAtIEFuIGV4cGxpY2l0IHRyYW5zcG9ydCB0byB1c2UuIFdoZW4gb21pdHRlZCxcbiAgICogICBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIodHJhbnNwb3J0T3ZlcnJpZGU/OiBPYnNpZGlhblRyYW5zcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHRyYW5zcG9ydE92ZXJyaWRlID8/IGF3YWl0IGdldE9yQ3JlYXRlVHJhbnNwb3J0KGdldFRyYW5zcG9ydE9wdGlvbnMoKSk7XG4gICAgYXdhaXQgdGhpcy5zeW5jVG9EZXZpY2UodHJhbnNwb3J0KTtcbiAgICBhd2FpdCByZWdpc3RlclZhdWx0KHRoaXMucGF0aCwgdHJhbnNwb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luYyBkaXNwb3NhYmxlIHN1cHBvcnQgZm9yIGBhd2FpdCB1c2luZ2AuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHZhdWx0IGlzIGRpc3Bvc2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNwb3NlKCk7XG4gIH1cblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIHRoYXQgcmVxdWlyZXMgYSBydW5uaW5nIHRyYW5zcG9ydC4gKi9cblxuICAvKipcbiAgICogUHVzaGVzIGFsbCBmaWxlcyBmcm9tIHRoZSBsb2NhbCBzdGFnaW5nIGRpcmVjdG9yeSB0byB0aGUgdGFyZ2V0IGRldmljZVxuICAgKiB2aWEgdGhlIGFjdGl2ZSB0cmFuc3BvcnQncyBgcHVzaEZpbGVzKClgLlxuICAgKlxuICAgKiBPbiBkZXNrdG9wIHRyYW5zcG9ydHMgdGhpcyBpcyBhIG5vLW9wIChmaWxlcyBhcmUgYWxyZWFkeSBsb2NhbCkuXG4gICAqIE9uIG1vYmlsZSB0cmFuc3BvcnRzIChBcHBpdW0pIHRoaXMgcHVzaGVzIGZpbGVzIHRvIHRoZSBkZXZpY2UuXG4gICAqXG4gICAqIHtAbGluayBUZW1wb3JhcnlWYXVsdC5yZWdpc3Rlcn0gY2FsbHMgdGhpcyBpdHNlbGYsIHNvIGEgcG9wdWxhdGUtdGhlbi1yZWdpc3RlciBzZXF1ZW5jZSBuZWVkc1xuICAgKiBub3RoaW5nIGV4dHJhLiBDYWxsIGl0IGRpcmVjdGx5IG9ubHkgdG8gY2FycnkgYWNyb3NzIGZpbGVzIHdyaXR0ZW4gKiphZnRlcioqIHJlZ2lzdHJhdGlvbjogdGhlXG4gICAqIGhvc3QgZGlyZWN0b3J5IGlzIG5vdCBtaXJyb3JlZCwgc28gYSBsYXRlciB3cml0ZSBpbnRvIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wYXRofSBzdGF5cyBvbiB0aGVcbiAgICogaG9zdCB1bnRpbCB0aGlzIHJ1bnMgYWdhaW4uXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc3BvcnRPdmVycmlkZSAtIEFuIGV4cGxpY2l0IHRyYW5zcG9ydCB0byB1c2UuIFdoZW4gb21pdHRlZCxcbiAgICogICBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3luY1RvRGV2aWNlKHRyYW5zcG9ydE92ZXJyaWRlPzogT2JzaWRpYW5UcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0cmFuc3BvcnQgPSB0cmFuc3BvcnRPdmVycmlkZSA/PyBhd2FpdCBnZXRPckNyZWF0ZVRyYW5zcG9ydChnZXRUcmFuc3BvcnRPcHRpb25zKCkpO1xuICAgIGlmICghdHJhbnNwb3J0LnB1c2hGaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5jb2xsZWN0RmlsZXModGhpcy5wYXRoKTtcbiAgICBhd2FpdCB0cmFuc3BvcnQucHVzaEZpbGVzKHRoaXMucGF0aCwgZmlsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IHJlYWRzIGFsbCBmaWxlcyBmcm9tIGEgZGlyZWN0b3J5IGludG8gYSBmbGF0IG1hcC5cbiAgICpcbiAgICogQHBhcmFtIGRpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gcmVhZC5cbiAgICogQHJldHVybnMgQSBtYXAgb2YgcmVsYXRpdmUgZmlsZSBwYXRocyB0byBjb250ZW50IGJ1ZmZlcnMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbGxlY3RGaWxlcyhkaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgVWludDhBcnJheT4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+ID0ge307XG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUodGhpcy5wYXRoLCBmdWxsUGF0aCk7XG5cbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyhmdWxsUGF0aCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3JlbGF0aXZlUGF0aF0gPSBhd2FpdCByZWFkRmlsZShmdWxsUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xufVxuXG4vKipcbiAqIFJldHJpZXMgYHJtYCB1bnRpbCBpdCBzdWNjZWVkcyBvciB0aW1lcyBvdXQuXG4gKiBPYnNpZGlhbiBtYXkgaG9sZCBmaWxlIGxvY2tzIGJyaWVmbHkgYWZ0ZXIgYSB3aW5kb3cgaXMgZGVzdHJveWVkLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkaXJlY3RvcnkgaXMgcmVtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmV0cnlSbShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgUk1fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBSTV9SRVRSWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8vIEZpbmFsIGF0dGVtcHQgXHUyMDE0IGxldCBpdCB0aHJvdy5cbiAgYXdhaXQgcm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBTUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUlQLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsV0FBVztBQUNwQixTQUFTLDRC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
193
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlbXBvcmFyeS12YXVsdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1hbmFnZXMgdGVtcG9yYXJ5IHZhdWx0IGxpZmVjeWNsZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBta2R0ZW1wU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlLFxuICBybVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5cbmltcG9ydCB7IGdldFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmltcG9ydCB7IFRFTVBfVkFVTFRfRElSX1BSRUZJWCB9IGZyb20gJy4vbGVmdG92ZXItY2xlYW51cC5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGdldE9yQ3JlYXRlVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5tanMnO1xuaW1wb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkubWpzJztcblxuLyoqXG4gKiBDb250ZW50IHZhbHVlIGZvciBhIHNpbmdsZSBlbnRyeSBpbiBhIHtAbGluayBQb3B1bGF0ZUZpbGVzUGFyYW1zfSBtYXAuXG4gKlxuICogLSBgc3RyaW5nYCBcdTIwMTQgdGV4dCBmaWxlICh3cml0dGVuIGFzIFVURi04KS5cbiAqIC0gYFVpbnQ4QXJyYXlgIFx1MjAxNCBiaW5hcnkgZmlsZSAod3JpdHRlbiBhcyByYXcgYnl0ZXM7IGBCdWZmZXJgIGlzIGFjY2VwdGVkXG4gKiAgIGJlY2F1c2UgYEJ1ZmZlciBleHRlbmRzIFVpbnQ4QXJyYXlgKS5cbiAqIC0gYHVuZGVmaW5lZGAgXHUyMDE0IGVtcHR5IGZvbGRlciAodGhlIGtleSAqKm11c3QqKiBlbmQgd2l0aCBgL2ApLlxuICovXG5leHBvcnQgdHlwZSBQb3B1bGF0ZUZpbGVDb250ZW50ID0gc3RyaW5nIHwgVWludDhBcnJheSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIG1hcCBvZiB2YXVsdC1yZWxhdGl2ZSBwYXRocyB0byB0aGVpciBjb250ZW50LCB1c2VkIGJ5XG4gKiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucG9wdWxhdGV9LlxuICpcbiAqIFBhdGhzIGVuZGluZyB3aXRoIGAvYCBkZW5vdGUgZm9sZGVycyBhbmQgKiptdXN0KiogaGF2ZSBhbiBgdW5kZWZpbmVkYCB2YWx1ZS5cbiAqIEFsbCBvdGhlciBwYXRocyBhcmUgd3JpdHRlbiBhcyBmaWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUG9wdWxhdGVGaWxlc1BhcmFtcyA9IFJlY29yZDxzdHJpbmcsIFBvcHVsYXRlRmlsZUNvbnRlbnQ+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgVGVtcG9yYXJ5VmF1bHR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBvcmFyeVZhdWx0Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIge0BsaW5rIFRlbXBvcmFyeVZhdWx0LmRpc3Bvc2V9IHJlbW92ZXMgdGhlIHZhdWx0ICoqZGlyZWN0b3J5KiouXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gd2hldGhlciB0aGlzIGluc3RhbmNlIGNyZWF0ZWQgdGhhdCBkaXJlY3RvcnkgXHUyMDE0IGB0cnVlYCBmb3IgYSB0ZW1wXG4gICAqIGRpcmVjdG9yeSB0aGUgY29uc3RydWN0b3IgbWFkZSAobm8gYHBhdGhgIGFyZ3VtZW50KSwgYGZhbHNlYCBmb3IgYSBkaXJlY3RvcnkgaGFuZGVkIHRvIGl0IGFzIGFuXG4gICAqIGV4cGxpY2l0IGBwYXRoYC4gQSBoYW5kbGUgb3ZlciBzb21lYm9keSBlbHNlJ3MgZGlyZWN0b3J5IHVucmVnaXN0ZXJzIHRoZSB2YXVsdCBidXQgbGVhdmVzIHRoZVxuICAgKiBmaWxlcyBhbG9uZSwgc28gd3JhcHBpbmcgYSBkaXJlY3RvcnkgY2Fubm90IGRlc3Ryb3kgaXQuIFNldCBleHBsaWNpdGx5IHRvIG92ZXJyaWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVtb3ZlRGlyZWN0b3J5T25EaXNwb3NlPzogYm9vbGVhbjtcbn1cblxuY29uc3QgUk1fUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgUk1fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMF8wMDA7XG5cbi8qKlxuICogQSB0ZW1wb3JhcnkgT2JzaWRpYW4gdmF1bHQgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIENyZWF0ZXMgYSB0ZW1wIGRpcmVjdG9yeSBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlXG4gKiBzbyB0aGF0IHRoZSBPYnNpZGlhbiBDTEkgY2FuIHRhcmdldCBpdCB2aWEgYGN3ZGAuXG4gKlxuICogQSBoYW5kbGUgKipvd25zKiogdGhlIGRpcmVjdG9yeSBvbmx5IHdoZW4gaXQgY3JlYXRlZCBpdC4ge0BsaW5rIFRlbXBvcmFyeVZhdWx0LmRpc3Bvc2V9IGRlbGV0ZXMgYW5cbiAqIG93bmVkIGRpcmVjdG9yeSBhbmQgbGVhdmVzIGEgYm9ycm93ZWQgb25lIGluIHBsYWNlIFx1MjAxNCBzZWVcbiAqIHtAbGluayBUZW1wb3JhcnlWYXVsdENvbnN0cnVjdG9yT3B0aW9ucy5zaG91bGRSZW1vdmVEaXJlY3RvcnlPbkRpc3Bvc2V9LCB3aGljaCBvdmVycmlkZXMgdGhhdCBkZWZhdWx0LlxuICovXG5leHBvcnQgY2xhc3MgVGVtcG9yYXJ5VmF1bHQge1xuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHRlbXBvcmFyeSB2YXVsdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIge0BsaW5rIFRlbXBvcmFyeVZhdWx0LmRpc3Bvc2V9IHJlbW92ZXMge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnBhdGh9IGZyb20gZGlzay5cbiAgICovXG4gIHJlYWRvbmx5ICNzaG91bGRSZW1vdmVEaXJlY3RvcnlPbkRpc3Bvc2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdGVtcCB2YXVsdC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBBbiBleHBsaWNpdCB2YXVsdCBwYXRoLiBJZiBvbWl0dGVkLCBhIHRlbXAgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVmF1bHQgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoPzogc3RyaW5nLCBvcHRpb25zPzogVGVtcG9yYXJ5VmF1bHRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLnBhdGggPSBwYXRoID8/IG1rZHRlbXBTeW5jKGpvaW4odG1wZGlyKCksIFRFTVBfVkFVTFRfRElSX1BSRUZJWCkpO1xuICAgIHRoaXMuI3Nob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSA9IG9wdGlvbnM/LnNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSA/PyBwYXRoID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIHZhdWx0IGZyb20gT2JzaWRpYW4gYW5kLCB3aGVuIHRoaXMgaGFuZGxlIG93bnMgdGhlIGRpcmVjdG9yeSwgZGVsZXRlcyBpdC5cbiAgICpcbiAgICogVGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIG9ubHkgd2hlbiB0aGlzIGluc3RhbmNlIGNyZWF0ZWQgaXQsIG9yIHdoZW5cbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0Q29uc3RydWN0b3JPcHRpb25zLnNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZX0gc2FpZCBzbyBleHBsaWNpdGx5LiBUaGF0IGlzIHdoYXRcbiAgICogbWFrZXMgYSBoYW5kbGUgb3ZlciBhIGRpcmVjdG9yeSBzb21lYm9keSBlbHNlIG93bnMgXHUyMDE0IHRoZSBydW4ncyBzaGFyZWQgc2V0dXAgdmF1bHQsIHNheSwgd2hpY2hcbiAgICogYGdldFRlbXBvcmFyeVZhdWx0KClgIHdyYXBzIFx1MjAxNCBzYWZlIHRvIGRpc3Bvc2UgZnJvbSBhIGNvbnN1bWVyJ3MgYGFmdGVyQWxsYC5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zcG9ydE92ZXJyaWRlIC0gQW4gZXhwbGljaXQgdHJhbnNwb3J0IHRvIHVzZSB3aGVuIHVucmVnaXN0ZXJpbmcuXG4gICAqICAgV2hlbiBvbWl0dGVkLCBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSh0cmFuc3BvcnRPdmVycmlkZT86IE9ic2lkaWFuVHJhbnNwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVucmVnaXN0ZXJWYXVsdCh0aGlzLnBhdGgsIHRyYW5zcG9ydE92ZXJyaWRlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuI3Nob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSkge1xuICAgICAgICBhd2FpdCByZXRyeVJtKHRoaXMucGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFt0ZW1wb3JhcnktdmF1bHRdIFVucmVnaXN0ZXJlZCBidXQga2VwdCB0aGUgdmF1bHQgZGlyZWN0b3J5LCB3aGljaCB0aGlzIGhhbmRsZSBkb2VzIG5vdCBvd246ICR7dGhpcy5wYXRofWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgZmlsZXMgYW5kIGZvbGRlcnMgaW50byB0aGUgdmF1bHQgZGlyZWN0b3J5ICoqb24gdGhlIGhvc3QqKi5cbiAgICogUGFyZW50IGRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIC0gYHN0cmluZ2AgdmFsdWVzIGFyZSB3cml0dGVuIGFzIFVURi04IHRleHQgZmlsZXMuXG4gICAqIC0gYFVpbnQ4QXJyYXlgIHZhbHVlcyAoaW5jbHVkaW5nIGBCdWZmZXJgKSBhcmUgd3JpdHRlbiBhcyBiaW5hcnkgZmlsZXMuXG4gICAqIC0gUGF0aHMgZW5kaW5nIHdpdGggYC9gIGFyZSB0cmVhdGVkIGFzIGVtcHR5IGZvbGRlcnMgKHZhbHVlIG11c3QgYmUgYHVuZGVmaW5lZGApLlxuICAgKlxuICAgKiBUaGUgd3JpdGUgaXMgYWx3YXlzIGhvc3QtbG9jYWwgXHUyMDE0IHtAbGluayBUZW1wb3JhcnlWYXVsdC5wYXRofSBpcyBhIGhvc3QgcGF0aCwgYW5kIG9uIGEgbW9iaWxlXG4gICAqIHRyYW5zcG9ydCB0aGUgdmF1bHQgdGhlIGFwcCBvcGVucyBsaXZlcyBvbiB0aGUgZGV2aWNlIGluc3RlYWQuIHtAbGluayBUZW1wb3JhcnlWYXVsdC5yZWdpc3Rlcn1cbiAgICogY2FycmllcyB0aGUgZGlyZWN0b3J5IGFjcm9zcyBiZWZvcmUgaXQgcmVnaXN0ZXJzLCBzbyBwb3B1bGF0ZS10aGVuLXJlZ2lzdGVyIGlzIGFsbCBhIGNhbGxlclxuICAgKiBuZWVkczsge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnN5bmNUb0RldmljZX0gaXMgdGhlIHNlYW0gdGhhdCBkb2VzIHRoZSBjYXJyeWluZy5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVzIC0gTWFwIG9mIGZpbGUvZm9sZGVyIHBhdGhzIHRvIGNvbnRlbnQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW4tZGV2LXV0aWxzL3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2ggLS0gUGVybWFuZW50OiBgUG9wdWxhdGVGaWxlc1BhcmFtc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgdGhpcyBtZXRob2QgYW5kIHRoZSBjb25maWctZGlyZWN0b3J5IHJlbWFwIGluIGBnbG9iYWwtc2V0dXAtY29yZS50c2AsIHNvIG5vIHBlci1vd25lciBuYW1lIGNhbiBzYXRpc2Z5IGJvdGguXG4gIHB1YmxpYyBwb3B1bGF0ZShmaWxlczogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhmaWxlcykpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbih0aGlzLnBhdGgsIGZpbGVQYXRoKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvbGRlciBwYXRoIFwiJHtmaWxlUGF0aH1cIiBtdXN0IGhhdmUgdW5kZWZpbmVkIGNvbnRlbnRgKTtcbiAgICAgICAgfVxuICAgICAgICBta2RpclN5bmMoZnVsbFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBwYXRoIFwiJHtmaWxlUGF0aH1cIiBtdXN0IGhhdmUgZGVmaW5lZCBjb250ZW50OyB1c2UgYSB0cmFpbGluZyBcIi9cIiBmb3IgZm9sZGVyc2ApO1xuICAgICAgICB9XG4gICAgICAgIG1rZGlyU3luYyhkaXJuYW1lKGZ1bGxQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHdyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhpcyB2YXVsdCBpbiB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZSBzbyB0aGUgQ0xJIGNhbiB0YXJnZXQgaXQuXG4gICAqXG4gICAqIFB1c2hlcyB0aGUgdmF1bHQgZGlyZWN0b3J5IHRvIHRoZSB0YXJnZXQgZGV2aWNlIGZpcnN0LCB2aWFcbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnN5bmNUb0RldmljZX0gXHUyMDE0IGEgbm8tb3Agb24gYSB0cmFuc3BvcnQgd2hvc2UgYXBwIGFscmVhZHkgcmVhZHMgdGhlIGhvc3RcbiAgICogZmlsZXN5c3RlbS4gVGhhdCBvcmRlcmluZyB1c2VkIHRvIGJlIHRoZSBjYWxsZXIncyB0byByZW1lbWJlciwgYW5kIGEgY2FsbGVyIHdobyBmb3Jnb3QgZ290IGFcbiAgICogc2lsZW50bHkgKiplbXB0eSoqIHZhdWx0IHJhdGhlciB0aGFuIGFuIGVycm9yOiBldmVyeSBwcmUtcmVnaXN0cmF0aW9uXG4gICAqIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0gd3JpdGUgc3RheWVkIG9uIHRoZSBob3N0IHdoaWxlIHRoZSBhcHAgb3BlbmVkIHRoZSBkZXZpY2UncyBjb3B5LlxuICAgKiBGb2xkaW5nIGl0IGluIGhlcmUgbWFrZXMgcG9wdWxhdGUtdGhlbi1yZWdpc3RlciBjb3JyZWN0IG9uIGV2ZXJ5IHRyYW5zcG9ydC5cbiAgICpcbiAgICogVGhlIHRyYW5zcG9ydCBpcyByZXNvbHZlZCBvbmNlIGFuZCBoYW5kZWQgdG8gYm90aCBzdGVwcywgc28gYSBwdXNoIGFuZCB0aGUgcmVnaXN0cmF0aW9uIHRoYXRcbiAgICogZm9sbG93cyBpdCBjYW4gbmV2ZXIgbGFuZCBvbiB0d28gZGlmZmVyZW50IHRyYW5zcG9ydHMuXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc3BvcnRPdmVycmlkZSAtIEFuIGV4cGxpY2l0IHRyYW5zcG9ydCB0byB1c2UuIFdoZW4gb21pdHRlZCxcbiAgICogICBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIodHJhbnNwb3J0T3ZlcnJpZGU/OiBPYnNpZGlhblRyYW5zcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHRyYW5zcG9ydE92ZXJyaWRlID8/IGF3YWl0IGdldE9yQ3JlYXRlVHJhbnNwb3J0KGdldFRyYW5zcG9ydE9wdGlvbnMoKSk7XG4gICAgYXdhaXQgdGhpcy5zeW5jVG9EZXZpY2UodHJhbnNwb3J0KTtcbiAgICBhd2FpdCByZWdpc3RlclZhdWx0KHRoaXMucGF0aCwgdHJhbnNwb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luYyBkaXNwb3NhYmxlIHN1cHBvcnQgZm9yIGBhd2FpdCB1c2luZ2AuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHZhdWx0IGlzIGRpc3Bvc2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNwb3NlKCk7XG4gIH1cblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIHRoYXQgcmVxdWlyZXMgYSBydW5uaW5nIHRyYW5zcG9ydC4gKi9cblxuICAvKipcbiAgICogUHVzaGVzIGFsbCBmaWxlcyBmcm9tIHRoZSBsb2NhbCBzdGFnaW5nIGRpcmVjdG9yeSB0byB0aGUgdGFyZ2V0IGRldmljZVxuICAgKiB2aWEgdGhlIGFjdGl2ZSB0cmFuc3BvcnQncyBgcHVzaEZpbGVzKClgLlxuICAgKlxuICAgKiBPbiBkZXNrdG9wIHRyYW5zcG9ydHMgdGhpcyBpcyBhIG5vLW9wIChmaWxlcyBhcmUgYWxyZWFkeSBsb2NhbCkuXG4gICAqIE9uIG1vYmlsZSB0cmFuc3BvcnRzIChBcHBpdW0pIHRoaXMgcHVzaGVzIGZpbGVzIHRvIHRoZSBkZXZpY2UuXG4gICAqXG4gICAqIHtAbGluayBUZW1wb3JhcnlWYXVsdC5yZWdpc3Rlcn0gY2FsbHMgdGhpcyBpdHNlbGYsIHNvIGEgcG9wdWxhdGUtdGhlbi1yZWdpc3RlciBzZXF1ZW5jZSBuZWVkc1xuICAgKiBub3RoaW5nIGV4dHJhLiBDYWxsIGl0IGRpcmVjdGx5IG9ubHkgdG8gY2FycnkgYWNyb3NzIGZpbGVzIHdyaXR0ZW4gKiphZnRlcioqIHJlZ2lzdHJhdGlvbjogdGhlXG4gICAqIGhvc3QgZGlyZWN0b3J5IGlzIG5vdCBtaXJyb3JlZCwgc28gYSBsYXRlciB3cml0ZSBpbnRvIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wYXRofSBzdGF5cyBvbiB0aGVcbiAgICogaG9zdCB1bnRpbCB0aGlzIHJ1bnMgYWdhaW4uXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc3BvcnRPdmVycmlkZSAtIEFuIGV4cGxpY2l0IHRyYW5zcG9ydCB0byB1c2UuIFdoZW4gb21pdHRlZCxcbiAgICogICBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3luY1RvRGV2aWNlKHRyYW5zcG9ydE92ZXJyaWRlPzogT2JzaWRpYW5UcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0cmFuc3BvcnQgPSB0cmFuc3BvcnRPdmVycmlkZSA/PyBhd2FpdCBnZXRPckNyZWF0ZVRyYW5zcG9ydChnZXRUcmFuc3BvcnRPcHRpb25zKCkpO1xuICAgIGlmICghdHJhbnNwb3J0LnB1c2hGaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5jb2xsZWN0RmlsZXModGhpcy5wYXRoKTtcbiAgICBhd2FpdCB0cmFuc3BvcnQucHVzaEZpbGVzKHRoaXMucGF0aCwgZmlsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IHJlYWRzIGFsbCBmaWxlcyBmcm9tIGEgZGlyZWN0b3J5IGludG8gYSBmbGF0IG1hcC5cbiAgICpcbiAgICogQHBhcmFtIGRpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gcmVhZC5cbiAgICogQHJldHVybnMgQSBtYXAgb2YgcmVsYXRpdmUgZmlsZSBwYXRocyB0byBjb250ZW50IGJ1ZmZlcnMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbGxlY3RGaWxlcyhkaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgVWludDhBcnJheT4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+ID0ge307XG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUodGhpcy5wYXRoLCBmdWxsUGF0aCk7XG5cbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyhmdWxsUGF0aCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3JlbGF0aXZlUGF0aF0gPSBhd2FpdCByZWFkRmlsZShmdWxsUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xufVxuXG4vKipcbiAqIFJldHJpZXMgYHJtYCB1bnRpbCBpdCBzdWNjZWVkcyBvciB0aW1lcyBvdXQuXG4gKiBPYnNpZGlhbiBtYXkgaG9sZCBmaWxlIGxvY2tzIGJyaWVmbHkgYWZ0ZXIgYSB3aW5kb3cgaXMgZGVzdHJveWVkLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkaXJlY3RvcnkgaXMgcmVtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmV0cnlSbShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgUk1fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBSTV9SRVRSWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8vIEZpbmFsIGF0dGVtcHQgXHUyMDE0IGxldCBpdCB0aHJvdy5cbiAgYXdhaXQgcm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBTUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUlQLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsV0FBVztBQUNwQixT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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-integration-testing",
3
- "version": "17.0.1",
3
+ "version": "17.1.0",
4
4
  "description": "Simplifies integration testing of Obsidian plugins.",
5
5
  "keywords": [
6
6
  "obsidian",