obsidian-dev-utils 84.1.0 → 84.3.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.
@@ -377,7 +377,7 @@ async function updateChangelog(newVersion, options = {}) {
377
377
  });
378
378
  const commitRange = lastTag ? `${lastTag}..HEAD` : "HEAD";
379
379
  const commitMessagesStr = await (0, import_root.execFromRoot)(`git log ${commitRange} --format=%B --first-parent -z`, { isQuiet: true });
380
- const commitMessages = commitMessagesStr.split("\0").filter(Boolean).map(toSingleLine);
380
+ const commitMessages = commitMessagesStr.split("\0").filter(Boolean).map(toFirstLine);
381
381
  let newChangeLog = `# CHANGELOG
382
382
 
383
383
  ## ${newVersion}
@@ -500,9 +500,8 @@ async function getLatestObsidianVersion() {
500
500
  function isPreRelease(version) {
501
501
  return (0, import_semver.prerelease)(version) !== null;
502
502
  }
503
- function toSingleLine(str) {
504
- const lines = str.split(/\r?\n/).filter(Boolean);
505
- return lines.join(" ");
503
+ function toFirstLine(str) {
504
+ return str.split(/\r?\n/).filter(Boolean).slice(0, 1).join("");
506
505
  }
507
506
  async function updateVersionInFilesForPlugin(newVersion) {
508
507
  const manifestBetaJsonPath = (0, import_root.resolvePathFromRootSafe)({ path: import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.ManifestBetaJson });
@@ -559,4 +558,4 @@ async function updateVersionInFilesForPlugin(newVersion) {
559
558
  updateVersionInFiles,
560
559
  validate
561
560
  });
562
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy92ZXJzaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyB2ZXJzaW9uIHVwZGF0ZXMgaW4gYSBwcm9qZWN0LlxuICogSXQgaW5jbHVkZXMgdGFza3Mgc3VjaCBhcyB2YWxpZGF0aW5nIHZlcnNpb24gdXBkYXRlIHR5cGVzLCBjaGVja2luZyB0aGUgc3RhdGVcbiAqIG9mIEdpdCBhbmQgR2l0SHViIENMSSwgdXBkYXRpbmcgdmVyc2lvbiBudW1iZXJzIGluIGZpbGVzLCBhbmQgcGVyZm9ybWluZ1xuICogR2l0IG9wZXJhdGlvbnMgc3VjaCBhcyB0YWdnaW5nIGFuZCBwdXNoaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVsZWFzZVR5cGUgfSBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgcmVhZEZpbGUsXG4gIHJtLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tICdub2RlOnJlYWRsaW5lL3Byb21pc2VzJztcbmltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBpbmMsXG4gIHByZXJlbGVhc2Vcbn0gZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlTG9ja0pzb24gfSBmcm9tICcuL25wbS50cyc7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgZXJyb3JUb1N0cmluZyB9IGZyb20gJy4uL2Vycm9yLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4vcGx1Z2luL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUsXG4gIGVuc3VyZU5vbk51bGxhYmxlXG59IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHJlYWRkaXJQb3NpeCB9IGZyb20gJy4vZnMudHMnO1xuaW1wb3J0IHsgZWRpdEpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHtcbiAgbnBtUnVuLFxuICBucG1SdW5PcHRpb25hbFxufSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHtcbiAgZWRpdE5wbVNocmlua1dyYXBKc29uLFxuICBlZGl0UGFja2FnZUpzb24sXG4gIGVkaXRQYWNrYWdlTG9ja0pzb24sXG4gIHJlYWRQYWNrYWdlSnNvblxufSBmcm9tICcuL25wbS50cyc7XG5pbXBvcnQgeyBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIH0gZnJvbSAnLi9vYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBleGVjRnJvbVJvb3QsXG4gIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlXG59IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGFkZFVwZGF0ZWRGaWxlc1RvR2l0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRVcGRhdGVkRmlsZXNUb0dpdE9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIHByZS1jb21taXQgaG9vayB3aGVuIGNyZWF0aW5nIHRoZSByZWxlYXNlIGNvbW1pdC4gV2hlbiBgZmFsc2VgLCBgLS1uby12ZXJpZnlgXG4gICAqIGlzIHBhc3NlZCB0byB0aGUgcmVsZWFzZSBjb21taXQgdG8gc2tpcCB0aGUgaG9vay5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRWZXJpZnlDb21taXQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgcGFyc2luZyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgYSB2ZXJzaW9uIHVwZGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRWZXJzaW9uQXJncyB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBwYXJzZWQgZnJvbSB0aGUgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uYWwgdmVyc2lvbiB1cGRhdGUgdHlwZSBhcmd1bWVudCwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVDaGFuZ2Vsb2d9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBvcGVuIHRoZSBnZW5lcmF0ZWQgY2hhbmdlbG9nIGluIHRoZSBlZGl0b3IgZm9yIGFuIGludGVyYWN0aXZlIHJldmlldy4gV2hlbiBgZmFsc2VgLFxuICAgKiB0aGUgY2hhbmdlbG9nIGlzIHN0aWxsIGdlbmVyYXRlZCBmcm9tIGNvbW1pdCBtZXNzYWdlcywgYnV0IGl0IGlzIG5vdCBvcGVuZWQgaW4gdGhlIGVkaXRvciBmb3JcbiAgICogbWFudWFsIHJldmlldy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0Q2hhbmdlbG9nPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdXBkYXRlVmVyc2lvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlVmVyc2lvbk9wdGlvbnMge1xuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAgICpcbiAgICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB0aGUgcmVsZWFzZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBHaXRIdWIgcmVsZWFzZSBoYXMgYmVlbiBwcmVwYXJlZC5cbiAgICovXG4gIHByZXBhcmVHaXRIdWJSZWxlYXNlPyh0aGlzOiB2b2lkLCBuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgYnVpbGQgc3RlcC4gVGhlIGJ1aWxkIGlzIGEgcHVibGlzaGluZyBwcmVyZXF1aXNpdGUsIG5vdCBhIHZlcmlmaWNhdGlvbiBjaGVjayxcbiAgICogc28gaXQgaXMgZ292ZXJuZWQgYnkgdGhpcyBmbGFnIGluZGVwZW5kZW50bHkgb2Yge0BsaW5rIHNob3VsZFJ1bkNoZWNrc30gXHUyMDE0IGl0IHJ1bnMgZXZlbiB3aGVuIHRoZVxuICAgKiBjaGVja3MgYXJlIHNraXBwZWQsIHNvIGEgZmFzdCByZWxlYXNlIHN0aWxsIHNoaXBzIGZyZXNoIGFydGlmYWN0cy4gU2V0IHRvIGBmYWxzZWAgb25seSB3aGVuIHRoZVxuICAgKiBidWlsZCBvdXRwdXQgaXMga25vd24gdG8gYWxyZWFkeSBtYXRjaCB0aGUgY3VycmVudCBjb2RlOyBvdGhlcndpc2UgdGhlIHJlbGVhc2Ugd291bGQgcHVibGlzaFxuICAgKiBzdGFsZSBhcnRpZmFjdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaW4gdGhlIGVkaXRvciBmb3IgYW4gaW50ZXJhY3RpdmUgcmV2aWV3LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHB1Ymxpc2ggdGhlIHJlbGVhc2UuIFdoZW4gYGZhbHNlYCwgYWxsIGxvY2FsIHN0ZXBzIGFyZSBleGVjdXRlZCAodmVyc2lvbiBidW1wLFxuICAgKiBjaGFuZ2Vsb2csIGNvbW1pdCwgdGFnKSwgYnV0IHRoZSBjaGFuZ2VzIGFyZSBub3QgcHVzaGVkIGFuZCBubyBHaXRIdWIgcmVsZWFzZSBpcyBwdWJsaXNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmVmbGlnaHQgdmVyaWZpY2F0aW9uIGNoZWNrcyAoY2xlYW4tcmVwbyBjaGVjaywgZm9ybWF0LCBzcGVsbGNoZWNrLCBsaW50LFxuICAgKiBvdmVyLWV4cG9zdXJlIGFuYWx5c2lzLCBhbmQgdGVzdHMpLiBUaGUgYnVpbGQgc3RlcCBpcyBub3Qgb25lIG9mIHRoZXNlIGNoZWNrcyBcdTIwMTQgaXQgaXMgZ292ZXJuZWRcbiAgICogc2VwYXJhdGVseSBieSB7QGxpbmsgc2hvdWxkQnVpbGR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJ1bkNoZWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE5wbVBhY2tSZXN1bHQge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHByZS1yZWxlYXNlIGlkZW50aWZpZXIgdXNlZCBmb3IgcHJlLXJlbGVhc2UgdmVyc2lvbnMuXG4gKi9cbmNvbnN0IERFRkFVTFRfUFJFSUQgPSAnYmV0YSc7XG5cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgZGlmZmVyZW50IHR5cGVzIG9mIHZlcnNpb24gdXBkYXRlcy5cbiAqXG4gKiBBbGlnbnMgd2l0aCBucG0ncyBgbnBtIHZlcnNpb25gIGluY3JlbWVudCB0eXBlcyBwbHVzIGBNYW51YWxgIGZvciBleHBsaWNpdCB2ZXJzaW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gVmVyc2lvblVwZGF0ZVR5cGUge1xuICBJbnZhbGlkID0gJ2ludmFsaWQnLFxuICBNYWpvciA9ICdtYWpvcicsXG4gIE1hbnVhbCA9ICdtYW51YWwnLFxuICBNaW5vciA9ICdtaW5vcicsXG4gIFBhdGNoID0gJ3BhdGNoJyxcbiAgUHJlTWFqb3IgPSAncHJlbWFqb3InLFxuICBQcmVNaW5vciA9ICdwcmVtaW5vcicsXG4gIFByZVBhdGNoID0gJ3ByZXBhdGNoJyxcbiAgUHJlUmVsZWFzZSA9ICdwcmVyZWxlYXNlJ1xufVxuXG4vKipcbiAqIFR5cGUgcmVwcmVzZW50aW5nIHRoZSBtYW5pZmVzdCBmaWxlIGZvcm1hdCBmb3IgT2JzaWRpYW4gcGx1Z2lucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBBIG1pbmltdW0gT2JzaWRpYW4gdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIG1pbkFwcFZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHlwZSByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSBvZiBPYnNpZGlhbiByZWxlYXNlcyBKU09OLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuUmVsZWFzZXNKc29uIHtcbiAgLyoqXG4gICAqIEEgbmFtZSBvZiB0aGUgT2JzaWRpYW4gcmVsZWFzZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgR2l0IHRhZyBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0byB1c2UgZm9yIHRoZSB0YWcuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRhZyBoYXMgYmVlbiBjcmVhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkR2l0VGFnKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCB0YWcgLWEgJHtuZXdWZXJzaW9ufSAtbSAke25ld1ZlcnNpb259IC0tZm9yY2VgLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG59XG5cbi8qKlxuICogQWRkcyB1cGRhdGVkIGZpbGVzIHRvIHRoZSBHaXQgc3RhZ2luZyBhcmVhIGFuZCBjb21taXRzIHRoZW0gd2l0aCB0aGUgbmV3IHZlcnNpb24gbWVzc2FnZS5cbiAqXG4gKiBJZiB0aGUgY29tbWl0IGZhaWxzIChmb3IgZXhhbXBsZSwgdGhlIHByZS1jb21taXQgaG9vayByZWplY3RzIGEgbmV3IHdvcmQgaW4gdGhlIGNoYW5nZWxvZykgYW5kIHRoZVxuICogcHJvY2VzcyBpcyBhdHRhY2hlZCB0byBhbiBpbnRlcmFjdGl2ZSB0ZXJtaW5hbCwgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gZml4IHRoZSBpc3N1ZSAoZm9yIGV4YW1wbGUsXG4gKiBhZGQgdGhlIG1pc3Npbmcgd29yZCB0byBgY3NwZWxsLmpzb25gKSBhbmQgcHJlc3MgRW50ZXIgdG8gcmV0cnkuIFRoZSByZXRyeSByZS1zdGFnZXMgYWxsIGZpbGVzLCBzbyB0aGVcbiAqIGZpeCBpcyBwaWNrZWQgdXAgd2l0aG91dCByZXN0YXJ0aW5nIHRoZSB3aG9sZSByZWxlYXNlIGxpZmVjeWNsZS4gSW4gYSBub24taW50ZXJhY3RpdmUgZW52aXJvbm1lbnQgKG5vXG4gKiBUVFksIHN1Y2ggYXMgQ0kpLCB0aGUgZXJyb3IgaXMgcmUtdGhyb3duIGluc3RlYWQgb2YgcHJvbXB0aW5nLCBzbyB0aGUgc2NyaXB0IGZhaWxzIGZhc3QgcmF0aGVyIHRoYW5cbiAqIGhhbmdpbmcuIFBhc3MgYHNob3VsZFZlcmlmeUNvbW1pdDogZmFsc2VgIHRvIHNraXAgdGhlIHByZS1jb21taXQgaG9vayBlbnRpcmVseSBpbiBzdWNoIGNhc2VzLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB1c2VkIGFzIHRoZSBjb21taXQgbWVzc2FnZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBBZGRVcGRhdGVkRmlsZXNUb0dpdE9wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSBjb21taXQgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpbGVzIGhhdmUgYmVlbiBhZGRlZCBhbmQgY29tbWl0dGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkVXBkYXRlZEZpbGVzVG9HaXQobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBBZGRVcGRhdGVkRmlsZXNUb0dpdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHNob3VsZFZlcmlmeUNvbW1pdCA9IHRydWUgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHZlcnNpb25EZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJyk7XG5cbiAgY29uc3QgY29tbWl0QXJncyA9IFsnZ2l0JywgJ2NvbW1pdCcsICctbScsIGBjaG9yZTogcmVsZWFzZSAke25ld1ZlcnNpb259YCwgJy0tYWxsb3ctZW1wdHknXTtcbiAgaWYgKCFzaG91bGRWZXJpZnlDb21taXQpIHtcbiAgICBjb21taXRBcmdzLnB1c2goJy0tbm8tdmVyaWZ5Jyk7XG4gIH1cblxuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdhZGQnLCAnLS1hbGwnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlY0Zyb21Sb290KGNvbW1pdEFyZ3MsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2ZXJzaW9uRGVidWdnZXIoXG4gICAgICAgIGBGYWlsZWQgdG8gY29tbWl0IHRoZSByZWxlYXNlLlxcbiR7ZXJyb3JUb1N0cmluZyhlcnJvcil9XFxuYFxuICAgICAgICAgICsgJ0ZpeCB0aGUgaXNzdWVzIChmb3IgZXhhbXBsZSwgYWRkIHRoZSBtaXNzaW5nIHdvcmQgdG8gY3NwZWxsLmpzb24pIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeSB0aGUgY29tbWl0LCBvciBDdHJsK0MgdG8gYWJvcnQuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCkucXVlc3Rpb24oJ1ByZXNzIEVudGVyIHRvIHJldHJ5IHRoZSBjb21taXQuLi4nKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIEdpdEh1YiBDTEkgaXMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tHaXRIdWJDbGlJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaCAtLXZlcnNpb24nLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLiBQbGVhc2UgaW5zdGFsbCBpdCBmcm9tIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgR2l0IGlzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIEdpdCBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tHaXRJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgLS12ZXJzaW9uJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdCBpcyBub3QgaW5zdGFsbGVkLiBQbGVhc2UgaW5zdGFsbCBpdCBmcm9tIGh0dHBzOi8vZ2l0LXNjbS5jb20vJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIGNsZWFuLCBtZWFuaW5nIHRoZXJlIGFyZSBubyB1bmNvbW1pdHRlZCBjaGFuZ2VzLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLlxuICpcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrR2l0UmVwb0NsZWFuKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbiAtLXVudHJhY2tlZC1maWxlcz1hbGwnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgaWYgKHN0ZG91dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi4gUGxlYXNlIGNvbW1pdCBvciBzdGFzaCB5b3VyIGNoYW5nZXMgYmVmb3JlIHJlbGVhc2luZyBhIG5ldyB2ZXJzaW9uLicpO1xuICB9XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSB1cGRhdGVkIG1hbmlmZXN0IGZpbGUgdG8gdGhlIGRpc3RyaWJ1dGlvbiBidWlsZCBmb2xkZXIuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb3B5IG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlVcGRhdGVkTWFuaWZlc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGNwKFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uIH0pLFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogam9pbihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbikgfSksXG4gICAgeyBmb3JjZTogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbmV3IHZlcnNpb24gc3RyaW5nIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZlcnNpb24gYW5kIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVXNlcyB0aGUgYHNlbXZlcmAgcGFja2FnZSB0byBjb21wdXRlIHRoZSBuZXh0IHZlcnNpb24sIHN1cHBvcnRpbmcgYWxsIG5wbSBpbmNyZW1lbnQgdHlwZXM6XG4gKiBgbWFqb3JgLCBgbWlub3JgLCBgcGF0Y2hgLCBgcHJlbWFqb3JgLCBgcHJlbWlub3JgLCBgcHJlcGF0Y2hgLCBhbmQgYHByZXJlbGVhc2VgLlxuICogUHJlLXJlbGVhc2UgdmVyc2lvbnMgdXNlIHRoZSBgYmV0YWAgaWRlbnRpZmllciBieSBkZWZhdWx0IChlLmcuLCBgMS4yLjQtYmV0YS4wYCkuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgb3IgYW4gZXhwbGljaXQgdmVyc2lvbiBzdHJpbmcuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgdmVyc2lvbiBzdHJpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjdXJyZW50IHZlcnNpb24gaXMgaW52YWxpZCBvciB0aGUgaW5jcmVtZW50IGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdmVyc2lvblR5cGUgPSBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGlmICh2ZXJzaW9uVHlwZSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsKSB7XG4gICAgcmV0dXJuIHZlcnNpb25VcGRhdGVUeXBlO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcbiAgY29uc3QgY3VycmVudFZlcnNpb24gPSBwYWNrYWdlSnNvbi52ZXJzaW9uID8/ICcnO1xuXG4gIGNvbnN0IHJlbGVhc2VUeXBlID0gdmVyc2lvblR5cGUgYXMgUmVsZWFzZVR5cGU7XG4gIGNvbnN0IGlzUHJlUmVsZWFzZVR5cGUgPSByZWxlYXNlVHlwZS5zdGFydHNXaXRoKCdwcmUnKTtcbiAgY29uc3QgbmV3VmVyc2lvbiA9IGlzUHJlUmVsZWFzZVR5cGVcbiAgICA/IGluYyhjdXJyZW50VmVyc2lvbiwgcmVsZWFzZVR5cGUsIERFRkFVTFRfUFJFSUQpXG4gICAgOiBpbmMoY3VycmVudFZlcnNpb24sIHJlbGVhc2VUeXBlKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3VmVyc2lvbiwgYEZhaWxlZCB0byBpbmNyZW1lbnQgdmVyc2lvbiBmcm9tICcke2N1cnJlbnRWZXJzaW9ufScgd2l0aCB0eXBlICcke3ZlcnNpb25UeXBlfSdgKTtcblxuICByZXR1cm4gbmV3VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIGEgc3BlY2lmaWMgdmVyc2lvbiBmcm9tIHRoZSBjaGFuZ2Vsb2cuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB3aGljaCB0byBnZXQgdGhlIHJlbGVhc2Ugbm90ZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZWxlYXNlIG5vdGVzIGZvciB0aGUgc3BlY2lmaWVkIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWxlYXNlTm90ZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2hhbmdlbG9nUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgbmV3VmVyc2lvbkVzY2FwZWQgPSByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogJ1xcXFwuJyxcbiAgICBzZWFyY2hWYWx1ZTogJy4nLFxuICAgIHN0cjogbmV3VmVyc2lvblxuICB9KTtcbiAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKGBcXG4jIyAke25ld1ZlcnNpb25Fc2NhcGVkfVxcblxcbigoLnxcXG4pKz8pXFxuXFxuIyNgKS5leGVjKGNvbnRlbnQpO1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gdjggdHJhY2tzIG9wdGlvbmFsIGNoYWluaW5nIGFuZCB0ZXJuYXJ5IGFzIHNlcGFyYXRlIGJyYW5jaGVzOyBib3RoIHBhdGhzIGFyZSB0ZXN0ZWQuICovXG4gIGxldCByZWxlYXNlTm90ZXMgPSBtYXRjaD8uWzFdID8gYCR7bWF0Y2hbMV19XFxuXFxuYCA6ICcnO1xuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gIGNvbnN0IHRhZ3MgPSAoYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgdGFnIC0tc29ydD0tY3JlYXRvcmRhdGUnLCB7IGlzUXVpZXQ6IHRydWUgfSkpLnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IHRhZ3NbMV07XG4gIGxldCBjaGFuZ2VzVXJsOiBzdHJpbmc7XG5cbiAgY29uc3QgcmVwb1VybCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2ggcmVwbyB2aWV3IC0tanNvbiB1cmwgLXEgLnVybCcsIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICBpZiAocHJldmlvdXNWZXJzaW9uKSB7XG4gICAgY2hhbmdlc1VybCA9IGAke3JlcG9Vcmx9L2NvbXBhcmUvJHtwcmV2aW91c1ZlcnNpb259Li4uJHtuZXdWZXJzaW9ufWA7XG4gIH0gZWxzZSB7XG4gICAgY2hhbmdlc1VybCA9IGAke3JlcG9Vcmx9L2NvbW1pdHMvJHtuZXdWZXJzaW9ufWA7XG4gIH1cblxuICByZWxlYXNlTm90ZXMgKz0gYCoqRnVsbCBDaGFuZ2Vsb2cqKjogJHtjaGFuZ2VzVXJsfWA7XG4gIHJldHVybiByZWxlYXNlTm90ZXM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSBiYXNlZCBvbiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSBpbnB1dCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgYFZlcnNpb25VcGRhdGVUeXBlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIGNvbnN0IHZlcnNpb25VcGRhdGVUeXBlRW51bSA9IHZlcnNpb25VcGRhdGVUeXBlIGFzIFZlcnNpb25VcGRhdGVUeXBlO1xuICBzd2l0Y2ggKHZlcnNpb25VcGRhdGVUeXBlRW51bSkge1xuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vcjpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWFqb3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QcmVNaW5vcjpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZVBhdGNoOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuUHJlUmVsZWFzZTpcbiAgICAgIHJldHVybiB2ZXJzaW9uVXBkYXRlVHlwZUVudW07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKC9eXFxkK1xcLlxcZCtcXC5cXGQrKD86LVtcXHdcXGQuLV0rKT8kLy50ZXN0KHZlcnNpb25VcGRhdGVUeXBlKSkge1xuICAgICAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZDtcbiAgfVxufVxuXG4vKipcbiAqIFB1c2hlcyBjb21taXRzIGFuZCB0YWdzIHRvIHRoZSByZW1vdGUgR2l0IHJlcG9zaXRvcnkuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwdXNoIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdpdFB1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHB1c2ggLS1mb2xsb3ctdGFncyAtLWZvcmNlJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgYSB2ZXJzaW9uIHVwZGF0ZSBpbnRvIGEgdmVyc2lvbiB1cGRhdGUgdHlwZSBhbmRcbiAqIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9uc30uXG4gKlxuICogRWFjaCBiZWhhdmlvciBpcyBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRoZSBjb3JyZXNwb25kaW5nIGAtLW5vLSpgIGZsYWcgdHVybnMgaXQgb2ZmLiBSZWNvZ25pemVkIGZsYWdzOlxuICogLSBgLS1uby1idWlsZGAgXHUyMDE0IHNraXAgdGhlIGJ1aWxkIHN0ZXAgKG9ubHkgc2FmZSB3aGVuIHRoZSBidWlsZCBvdXRwdXQgYWxyZWFkeSBtYXRjaGVzIHRoZSBjdXJyZW50IGNvZGUpLlxuICogLSBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2AgXHUyMDE0IGdlbmVyYXRlIHRoZSBjaGFuZ2Vsb2cgd2l0aG91dCBvcGVuaW5nIGl0IGZvciBtYW51YWwgcmV2aWV3LlxuICogLSBgLS1uby1jaGVja3NgIFx1MjAxNCBza2lwIHRoZSBjbGVhbi1yZXBvIGNoZWNrLCBmb3JtYXQsIHNwZWxsY2hlY2ssIGxpbnQsIG92ZXItZXhwb3N1cmUgYW5hbHlzaXMsIGFuZCB0ZXN0cyAodGhlIGJ1aWxkIHN0aWxsIHJ1bnMpLlxuICogLSBgLS1uby1jb21taXQtdmVyaWZpY2F0aW9uYCBcdTIwMTQgcGFzcyBgLS1uby12ZXJpZnlgIHRvIHRoZSByZWxlYXNlIGNvbW1pdCwgc2tpcHBpbmcgdGhlIHByZS1jb21taXQgaG9vay5cbiAqIC0gYC0tbm8tcmVsZWFzZWAgXHUyMDE0IHJ1biBhbGwgbG9jYWwgc3RlcHMgYnV0IHNraXAgdGhlIHB1c2ggYW5kIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHBhcnNlICh0eXBpY2FsbHkgYHByb2Nlc3MuYXJndi5zbGljZSgyKWApLlxuICogQHJldHVybnMgVGhlIHtAbGluayBQYXJzZWRWZXJzaW9uQXJnc30gY29udGFpbmluZyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSBhbmQgdGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZlcnNpb25BcmdzKGFyZ3M6IHN0cmluZ1tdKTogUGFyc2VkVmVyc2lvbkFyZ3Mge1xuICBjb25zdCB7IHBvc2l0aW9uYWxzLCB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICBhcmdzLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgICduby1idWlsZCc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnbm8tY2hhbmdlbG9nLWVkaXRpbmcnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWNoZWNrcyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnbm8tY29tbWl0LXZlcmlmaWNhdGlvbic6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnbm8tcmVsZWFzZSc6IHsgdHlwZTogJ2Jvb2xlYW4nIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgb3B0aW9uczoge1xuICAgICAgc2hvdWxkQnVpbGQ6ICEodmFsdWVzWyduby1idWlsZCddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2c6ICEodmFsdWVzWyduby1jaGFuZ2Vsb2ctZWRpdGluZyddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZFJlbGVhc2U6ICEodmFsdWVzWyduby1yZWxlYXNlJ10gPz8gZmFsc2UpLFxuICAgICAgc2hvdWxkUnVuQ2hlY2tzOiAhKHZhbHVlc1snbm8tY2hlY2tzJ10gPz8gZmFsc2UpLFxuICAgICAgc2hvdWxkVmVyaWZ5Q29tbWl0OiAhKHZhbHVlc1snbm8tY29tbWl0LXZlcmlmaWNhdGlvbiddID8/IGZhbHNlKVxuICAgIH0sXG4gICAgdmVyc2lvblVwZGF0ZVR5cGU6IHBvc2l0aW9uYWxzWzBdXG4gIH07XG59XG5cbi8qKlxuICogUHVibGlzaGVzIGEgR2l0SHViIHJlbGVhc2UgZm9yIHRoZSBuZXcgdmVyc2lvbi5cbiAqXG4gKiBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBhIHJlbGVhc2UgYW5kIHVwbG9hZGluZyBmaWxlcyBmb3IgZWl0aGVyIGFuIE9ic2lkaWFuIHBsdWdpbiBvciBhbm90aGVyIHByb2plY3QuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB0aGUgcmVsZWFzZS5cbiAqIEBwYXJhbSBpc09ic2lkaWFuUGx1Z2luIC0gQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHByb2plY3QgaXMgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWxlYXNlIGhhcyBiZWVuIHB1Ymxpc2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb246IHN0cmluZywgaXNPYnNpZGlhblBsdWdpbjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgZmlsZVBhdGhzOiBzdHJpbmdbXTtcblxuICBpZiAoaXNPYnNpZGlhblBsdWdpbikge1xuICAgIGNvbnN0IGJ1aWxkRm9sZGVyID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQgfSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gYXdhaXQgcmVhZGRpclBvc2l4KGJ1aWxkRm9sZGVyKTtcbiAgICBmaWxlUGF0aHMgPSBmaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gam9pbihidWlsZEZvbGRlciwgZmlsZU5hbWUpKTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgcmVzdWx0T3V0cHV0ID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnbnBtJywgJ3BhY2snLCAnLS1wYWNrLWRlc3RpbmF0aW9uJywgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0LCAnLS1qc29uJ10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBjb25zdCBpbmRleCA9IHJlc3VsdE91dHB1dC5pbmRleE9mKCdbXFxuICB7Jyk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmluZCB0aGUgc3RhcnQgb2YgdGhlIEpTT04gYXJyYXkgaW4gdGhlIHJlc3VsdCBvdXRwdXQnKTtcbiAgICB9XG4gICAgcmVzdWx0T3V0cHV0ID0gcmVzdWx0T3V0cHV0LnNsaWNlKGluZGV4KTtcbiAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdE91dHB1dCkgYXMgW05wbVBhY2tSZXN1bHRdO1xuICAgIGZpbGVQYXRocyA9IFtcbiAgICAgIGpvaW4oT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0LCByZXN1bHRbMF0uZmlsZW5hbWUpLFxuICAgICAgam9pbihPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkRpc3QsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuU3R5bGVzQ3NzKVxuICAgIF07XG4gIH1cblxuICBmaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKChmaWxlUGF0aCkgPT4gZXhpc3RzU3luYyhyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IGZpbGVQYXRoIH0pKSk7XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFtcbiAgICAnZ2gnLFxuICAgICdyZWxlYXNlJyxcbiAgICAnY3JlYXRlJyxcbiAgICBuZXdWZXJzaW9uLFxuICAgIC4uLmZpbGVQYXRocyxcbiAgICAnLS10aXRsZScsXG4gICAgYHYke25ld1ZlcnNpb259YCxcbiAgICAuLi4oaXNQcmVSZWxlYXNlKG5ld1ZlcnNpb24pID8gWyctLXByZXJlbGVhc2UnXSA6IFtdKSxcbiAgICAnLS1ub3Rlcy1maWxlJyxcbiAgICAnLSdcbiAgXSwge1xuICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgc3RkaW46IGF3YWl0IGdldFJlbGVhc2VOb3RlcyhuZXdWZXJzaW9uKVxuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBjaGFuZ2Vsb2cgZmlsZSB3aXRoIG5ldyB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBjb21taXQgbWVzc2FnZXMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgY3VycmVudCBjaGFuZ2Vsb2csIGFwcGVuZHMgbmV3IGVudHJpZXMgZm9yIHRoZSBsYXRlc3QgdmVyc2lvbixcbiAqIGFuZCBwcm9tcHRzIHRoZSB1c2VyIHRvIHJldmlldyB0aGUgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdG8gYmUgYWRkZWQgdG8gdGhlIGNoYW5nZWxvZy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zfSBjb250cm9sbGluZyB0aGUgY2hhbmdlbG9nIHJldmlldyBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2hhbmdlbG9nIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNoYW5nZWxvZyhuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHNob3VsZEVkaXRDaGFuZ2Vsb2cgPSB0cnVlIH0gPSBvcHRpb25zO1xuICBjb25zdCBIRUFERVJfTElORVNfQ09VTlQgPSAyO1xuICBjb25zdCBjaGFuZ2Vsb2dQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgbGV0IHByZXZpb3VzQ2hhbmdlbG9nTGluZXM6IHN0cmluZ1tdO1xuICBpZiAoZXhpc3RzU3luYyhjaGFuZ2Vsb2dQYXRoKSkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgICBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJykuc2xpY2UoSEVBREVSX0xJTkVTX0NPVU5UKTtcbiAgICBpZiAocHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5hdCgtMSkgPT09ICcnKSB7XG4gICAgICBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzLnBvcCgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gW107XG4gIH1cblxuICBjb25zdCBsYXN0VGFnID0gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICcnLFxuICAgIHNlYXJjaFZhbHVlOiAnIyMgJyxcbiAgICBzdHI6IHByZXZpb3VzQ2hhbmdlbG9nTGluZXNbMF0gPz8gJydcbiAgfSk7XG4gIGNvbnN0IGNvbW1pdFJhbmdlID0gbGFzdFRhZyA/IGAke2xhc3RUYWd9Li5IRUFEYCA6ICdIRUFEJztcbiAgY29uc3QgY29tbWl0TWVzc2FnZXNTdHIgPSBhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCBsb2cgJHtjb21taXRSYW5nZX0gLS1mb3JtYXQ9JUIgLS1maXJzdC1wYXJlbnQgLXpgLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IGNvbW1pdE1lc3NhZ2VzID0gY29tbWl0TWVzc2FnZXNTdHIuc3BsaXQoJ1xcMCcpLmZpbHRlcihCb29sZWFuKS5tYXAodG9TaW5nbGVMaW5lKTtcblxuICBsZXQgbmV3Q2hhbmdlTG9nID0gYCMgQ0hBTkdFTE9HXFxuXFxuIyMgJHtuZXdWZXJzaW9ufVxcblxcbmA7XG5cbiAgZm9yIChjb25zdCBtZXNzYWdlIG9mIGNvbW1pdE1lc3NhZ2VzKSB7XG4gICAgbmV3Q2hhbmdlTG9nICs9IGAtICR7bWVzc2FnZX1cXG5gO1xuICB9XG5cbiAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMubGVuZ3RoID4gMCkge1xuICAgIG5ld0NoYW5nZUxvZyArPSAnXFxuJztcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcykge1xuICAgICAgbmV3Q2hhbmdlTG9nICs9IGAke2xpbmV9XFxuYDtcbiAgICB9XG4gIH1cblxuICBhd2FpdCB3cml0ZUZpbGUoY2hhbmdlbG9nUGF0aCwgbmV3Q2hhbmdlTG9nLCAndXRmLTgnKTtcblxuICBpZiAoIXNob3VsZEVkaXRDaGFuZ2Vsb2cpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb2RlVmVyc2lvbiA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnY29kZSAtLXZlcnNpb24nLCB7XG4gICAgaXNRdWlldDogdHJ1ZSxcbiAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZVxuICB9KTtcbiAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcbiAgaWYgKGNvZGVWZXJzaW9uKSB7XG4gICAgdmVyc2lvbkRlYnVnZ2VyKGBQbGVhc2UgdXBkYXRlIHRoZSAke09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBmaWxlLiBDbG9zZSBWaXN1YWwgU3R1ZGlvIENvZGUgd2hlbiB5b3UgYXJlIGRvbmUuLi5gKTtcbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydjb2RlJywgJy13JywgY2hhbmdlbG9nUGF0aF0sIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHZlcnNpb25EZWJ1Z2dlcignQ291bGQgbm90IGZpbmQgVmlzdWFsIFN0dWRpbyBDb2RlIGluIHlvdXIgUEFUSC4gVXNpbmcgY29uc29sZSBtb2RlIGluc3RlYWQuJyk7XG4gICAgYXdhaXQgY3JlYXRlSW50ZXJmYWNlKHByb2Nlc3Muc3RkaW4sIHByb2Nlc3Muc3Rkb3V0KS5xdWVzdGlvbihcbiAgICAgIGBQbGVhc2UgdXBkYXRlIHRoZSAke09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBmaWxlLiBQcmVzcyBFbnRlciB3aGVuIHlvdSBhcmUgZG9uZS4uLmBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHVwZGF0ZSB0eXBlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBzZXJpZXMgb2YgdGFza3MgdG8gaGFuZGxlIHZlcnNpb24gdXBkYXRlczpcbiAqIDEuIFZhbGlkYXRlcyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZS5cbiAqIDIuIENoZWNrcyBpZiBHaXQgYW5kIEdpdEh1YiBDTEkgYXJlIGluc3RhbGxlZC5cbiAqIDMuIFZlcmlmaWVzIHRoYXQgdGhlIEdpdCByZXBvc2l0b3J5IGlzIGNsZWFuLlxuICogNC4gUnVucyBzcGVsbGNoZWNrIGFuZCBsaW50aW5nLlxuICogNS4gQnVpbGRzIHRoZSBwcm9qZWN0LlxuICogNi4gVXBkYXRlcyB2ZXJzaW9uIGluIGZpbGVzIGFuZCBjaGFuZ2Vsb2cuXG4gKiA3LiBBZGRzIHVwZGF0ZWQgZmlsZXMgdG8gR2l0LCB0YWdzIHRoZSBjb21taXQsIGFuZCBwdXNoZXMgdG8gdGhlIHJlcG9zaXRvcnkuXG4gKiA4LiBJZiBhbiBPYnNpZGlhbiBwbHVnaW4sIGNvcGllcyB0aGUgdXBkYXRlZCBtYW5pZmVzdCBhbmQgcHVibGlzaGVzIGEgR2l0SHViIHJlbGVhc2UuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgdG8gcGVyZm9ybSAobWFqb3IsIG1pbm9yLCBwYXRjaCwgcHJlbWFqb3IsIHByZW1pbm9yLCBwcmVwYXRjaCwgcHJlcmVsZWFzZSwgb3IgeC55LnpbLXN1ZmZpeF0pLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBjb250cm9sbGluZyB0aGUgcmVsZWFzZSBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdmVyc2lvbiB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlPzogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBwcmVwYXJlR2l0SHViUmVsZWFzZSxcbiAgICBzaG91bGRCdWlsZCA9IHRydWUsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZyA9IHRydWUsXG4gICAgc2hvdWxkUmVsZWFzZSA9IHRydWUsXG4gICAgc2hvdWxkUnVuQ2hlY2tzID0gdHJ1ZSxcbiAgICBzaG91bGRWZXJpZnlDb21taXQgPSB0cnVlXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmICghdmVyc2lvblVwZGF0ZVR5cGUpIHtcbiAgICBjb25zdCBucG1PbGRWZXJzaW9uID0gcHJvY2Vzcy5lbnZbJ25wbV9vbGRfdmVyc2lvbiddO1xuICAgIGNvbnN0IG5wbU5ld1ZlcnNpb24gPSBwcm9jZXNzLmVudlsnbnBtX25ld192ZXJzaW9uJ107XG5cbiAgICBpZiAobnBtT2xkVmVyc2lvbiAmJiBucG1OZXdWZXJzaW9uKSB7XG4gICAgICBhd2FpdCB1cGRhdGVWZXJzaW9uSW5GaWxlcyhucG1PbGRWZXJzaW9uKTtcbiAgICAgIGF3YWl0IHVwZGF0ZVZlcnNpb24obnBtTmV3VmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHByb3ZpZGVkJyk7XG4gIH1cblxuICBjb25zdCBpc09ic2lkaWFuUGx1Z2luID0gZXhpc3RzU3luYyhyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbiB9KSkgJiYgKGF3YWl0IHJlYWRQYWNrYWdlSnNvbigpKS5uYW1lICE9PSAnb2JzaWRpYW4tZGV2LXV0aWxzJztcblxuICB2YWxpZGF0ZSh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGF3YWl0IGNoZWNrR2l0SW5zdGFsbGVkKCk7XG4gIGF3YWl0IGNoZWNrR2l0SHViQ2xpSW5zdGFsbGVkKCk7XG5cbiAgaWYgKHNob3VsZFJ1bkNoZWNrcykge1xuICAgIGF3YWl0IGNoZWNrR2l0UmVwb0NsZWFuKCk7XG4gICAgYXdhaXQgbnBtUnVuKCdmb3JtYXQ6Y2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ3NwZWxsY2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ2xpbnQ6bWQnKTtcbiAgfVxuXG4gIC8vIFRoZSBidWlsZCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgcHVibGlzaGluZywgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLCBzbyBpdCBydW5zIHVubGVzcyBgc2hvdWxkQnVpbGRgIGlzIGBmYWxzZWAgXHUyMDE0IHRoaXMga2VlcHMgdGhlIHJlbGVhc2VkIGFydGlmYWN0cyBpbiBzeW5jIHdpdGggdGhlIGN1cnJlbnQgY29kZSBldmVuIG9uIGEgZmFzdCByZWxlYXNlLlxuICBpZiAoc2hvdWxkQnVpbGQpIHtcbiAgICBhd2FpdCBucG1SdW4oJ2J1aWxkJyk7XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuQ2hlY2tzKSB7XG4gICAgYXdhaXQgbnBtUnVuKCdsaW50Jyk7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2ZpbmQtb3ZlcmV4cG9zZWQnKTtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbCgndGVzdCcpO1xuICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0OmludGVncmF0aW9uJyk7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ3Rlc3Q6Y292ZXJhZ2UnKTtcbiAgfVxuXG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCBnZXROZXdWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobmV3VmVyc2lvbik7XG4gIGlmIChpc09ic2lkaWFuUGx1Z2luKSB7XG4gICAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXNGb3JQbHVnaW4obmV3VmVyc2lvbik7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVDaGFuZ2Vsb2cobmV3VmVyc2lvbiwgeyBzaG91bGRFZGl0Q2hhbmdlbG9nIH0pO1xuICBhd2FpdCBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uLCB7IHNob3VsZFZlcmlmeUNvbW1pdCB9KTtcbiAgYXdhaXQgYWRkR2l0VGFnKG5ld1ZlcnNpb24pO1xuXG4gIGlmICghc2hvdWxkUmVsZWFzZSkge1xuICAgIGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJykoJ1NraXBwaW5nIGdpdCBwdXNoIGFuZCBHaXRIdWIgcmVsZWFzZSAoLS1uby1yZWxlYXNlKS4gVGhlIHZlcnNpb24gYnVtcCwgY2hhbmdlbG9nLCBjb21taXQsIGFuZCB0YWcgaGF2ZSBiZWVuIGNyZWF0ZWQgbG9jYWxseS4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBnaXRQdXNoKCk7XG4gIGF3YWl0IHByZXBhcmVHaXRIdWJSZWxlYXNlPy4obmV3VmVyc2lvbik7XG4gIGF3YWl0IHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb24sIGlzT2JzaWRpYW5QbHVnaW4pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHZlcnNpb24gaW4gdmFyaW91cyBmaWxlcywgaW5jbHVkaW5nIGBwYWNrYWdlLmpzb25gLCBgcGFja2FnZS1sb2NrLmpzb25gLFxuICogYW5kIE9ic2lkaWFuIHBsdWdpbiBtYW5pZmVzdHMgaWYgYXBwbGljYWJsZS5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBzdHJpbmcgdG8gdXBkYXRlIGluIHRoZSBmaWxlcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlVmVyc2lvbkluRmlsZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGVkaXRQYWNrYWdlSnNvbigocGFja2FnZUpzb24pID0+IHtcbiAgICBwYWNrYWdlSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgfSk7XG5cbiAgYXdhaXQgZWRpdFBhY2thZ2VMb2NrSnNvbih1cGRhdGUsIHsgc2hvdWxkU2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbiAgYXdhaXQgZWRpdE5wbVNocmlua1dyYXBKc29uKHVwZGF0ZSwgeyBzaG91bGRTa2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZShwYWNrYWdlTG9ja0pzb246IFBhY2thZ2VMb2NrSnNvbik6IHZvaWQge1xuICAgIHBhY2thZ2VMb2NrSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICBjb25zdCBkZWZhdWx0UGFja2FnZSA9IHBhY2thZ2VMb2NrSnNvbi5wYWNrYWdlcz8uWycnXTtcbiAgICBpZiAoZGVmYXVsdFBhY2thZ2UpIHtcbiAgICAgIGRlZmF1bHRQYWNrYWdlLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byBlbnN1cmUgaXQgaXMgZWl0aGVyIGEgcmVjb2duaXplZCB0eXBlXG4gKiBvciBhIHZhbGlkIG1hbnVhbCB2ZXJzaW9uIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byB2YWxpZGF0ZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgaXMgaW52YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlKSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdJbnZhbGlkIHZlcnNpb24gdXBkYXRlIHR5cGUuIFBsZWFzZSB1c2UgXFwnbWFqb3JcXCcsIFxcJ21pbm9yXFwnLCBcXCdwYXRjaFxcJywgXFwncHJlbWFqb3JcXCcsIFxcJ3ByZW1pbm9yXFwnLCBcXCdwcmVwYXRjaFxcJywgXFwncHJlcmVsZWFzZVxcJywgb3IgXFwneC55LnpbLXN1ZmZpeF1cXCcgZm9ybWF0LidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgT2JzaWRpYW4gZnJvbSB0aGUgR2l0SHViIHJlbGVhc2VzIEFQSS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBPYnNpZGlhbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0T2JzaWRpYW5WZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gV2UgcnVuIHRoaXMgb3V0c2lkZSBvZiBPYnNpZGlhbiwgc28gd2UgZG9uJ3QgaGF2ZSBgcmVxdWVzdFVybCgpYC5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2xhdGVzdCcpO1xuICBjb25zdCBvYnNpZGlhblJlbGVhc2VzSnNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBQYXJ0aWFsPE9ic2lkaWFuUmVsZWFzZXNKc29uPjtcbiAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKG9ic2lkaWFuUmVsZWFzZXNKc29uLm5hbWUsICdDb3VsZCBub3QgZmluZCB0aGUgbmFtZSBvZiB0aGUgbGF0ZXN0IE9ic2lkaWFuIHJlbGVhc2UnKTtcbn1cblxuZnVuY3Rpb24gaXNQcmVSZWxlYXNlKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJlcmVsZWFzZSh2ZXJzaW9uKSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gdG9TaW5nbGVMaW5lKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSBzdHIuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoQm9vbGVhbik7XG4gIHJldHVybiBsaW5lcy5qb2luKCcgJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb25JbkZpbGVzRm9yUGx1Z2luKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtYW5pZmVzdEJldGFKc29uUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RCZXRhSnNvbiB9KTtcbiAgaWYgKGlzUHJlUmVsZWFzZShuZXdWZXJzaW9uKSkge1xuICAgIGF3YWl0IGNwKFxuICAgICAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSksXG4gICAgICBtYW5pZmVzdEJldGFKc29uUGF0aCxcbiAgICAgIHsgZm9yY2U6IHRydWUgfVxuICAgICk7XG4gICAgYXdhaXQgZWRpdEpzb248TWFuaWZlc3Q+KHtcbiAgICAgIGVkaXRGbjogKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIG1hbmlmZXN0LnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0QmV0YUpzb25cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsYXRlc3RPYnNpZGlhblZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RPYnNpZGlhblZlcnNpb24oKTtcblxuICAgIGF3YWl0IGVkaXRKc29uPE1hbmlmZXN0Pih7XG4gICAgICBlZGl0Rm46IChtYW5pZmVzdCkgPT4ge1xuICAgICAgICBtYW5pZmVzdC5taW5BcHBWZXJzaW9uID0gbGF0ZXN0T2JzaWRpYW5WZXJzaW9uO1xuICAgICAgICBtYW5pZmVzdC52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICAgIH0sXG4gICAgICBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb25cbiAgICB9KTtcblxuICAgIGF3YWl0IGVkaXRKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHtcbiAgICAgIGVkaXRGbjogKHZlcnNpb25zKSA9PiB7XG4gICAgICAgIHZlcnNpb25zW25ld1ZlcnNpb25dID0gbGF0ZXN0T2JzaWRpYW5WZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlZlcnNpb25zSnNvblxuICAgIH0pO1xuXG4gICAgaWYgKGV4aXN0c1N5bmMobWFuaWZlc3RCZXRhSnNvblBhdGgpKSB7XG4gICAgICBhd2FpdCBybShtYW5pZmVzdEJldGFKc29uUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgY29weVVwZGF0ZWRNYW5pZmVzdCgpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQSxxQkFBMkI7QUFDM0Isc0JBS087QUFDUCxJQUFBQSxtQkFBZ0M7QUFDaEMsdUJBQTBCO0FBQzFCLG9CQUdPO0FBSVAsbUJBQStCO0FBQy9CLG1CQUE4QjtBQUM5Qix3Q0FBd0M7QUFDeEMsa0JBQXFCO0FBQ3JCLG9CQUEyQjtBQUMzQix5QkFHTztBQUNQLGdCQUE2QjtBQUM3QixrQkFBeUI7QUFDekIscUJBR087QUFDUCxpQkFLTztBQUNQLDJDQUEwQztBQUMxQyxrQkFHTztBQTJHUCxNQUFNLGdCQUFnQjtBQU9mLElBQUssb0JBQUwsa0JBQUtDLHVCQUFMO0FBQ0wsRUFBQUEsbUJBQUEsYUFBVTtBQUNWLEVBQUFBLG1CQUFBLFdBQVE7QUFDUixFQUFBQSxtQkFBQSxZQUFTO0FBQ1QsRUFBQUEsbUJBQUEsV0FBUTtBQUNSLEVBQUFBLG1CQUFBLFdBQVE7QUFDUixFQUFBQSxtQkFBQSxjQUFXO0FBQ1gsRUFBQUEsbUJBQUEsY0FBVztBQUNYLEVBQUFBLG1CQUFBLGNBQVc7QUFDWCxFQUFBQSxtQkFBQSxnQkFBYTtBQVRILFNBQUFBO0FBQUEsR0FBQTtBQTJDWixlQUFzQixVQUFVLFlBQW1DO0FBQ2pFLFlBQU0sMEJBQWEsY0FBYyxVQUFVLE9BQU8sVUFBVSxZQUFZLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDM0Y7QUFnQkEsZUFBc0IscUJBQXFCLFlBQW9CLFVBQXVDLENBQUMsR0FBa0I7QUFDdkgsUUFBTSxFQUFFLHFCQUFxQixLQUFLLElBQUk7QUFDdEMsUUFBTSxzQkFBa0IsNkJBQWUsU0FBUztBQUVoRCxRQUFNLGFBQWEsQ0FBQyxPQUFPLFVBQVUsTUFBTSxrQkFBa0IsVUFBVSxJQUFJLGVBQWU7QUFDMUYsTUFBSSxDQUFDLG9CQUFvQjtBQUN2QixlQUFXLEtBQUssYUFBYTtBQUFBLEVBQy9CO0FBRUEsYUFBUztBQUNQLFFBQUk7QUFDRixnQkFBTSwwQkFBYSxDQUFDLE9BQU8sT0FBTyxPQUFPLEdBQUcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUM3RCxnQkFBTSwwQkFBYSxZQUFZLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDaEQ7QUFBQSxJQUNGLFNBQVMsT0FBTztBQUNkLFVBQUksQ0FBQyxRQUFRLE1BQU0sT0FBTztBQUN4QixjQUFNO0FBQUEsTUFDUjtBQUVBO0FBQUEsUUFDRTtBQUFBLE1BQWtDLDRCQUFjLEtBQUssQ0FBQztBQUFBO0FBQUEsTUFFeEQ7QUFDQSxnQkFBTSxrQ0FBZ0IsUUFBUSxPQUFPLFFBQVEsTUFBTSxFQUFFLFNBQVMsb0NBQW9DO0FBQUEsSUFDcEc7QUFBQSxFQUNGO0FBQ0Y7QUFTQSxlQUFzQiwwQkFBeUM7QUFDN0QsTUFBSTtBQUNGLGNBQU0sMEJBQWEsZ0JBQWdCLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFBQSxFQUN0RCxRQUFRO0FBQ04sVUFBTSxJQUFJLE1BQU0sNkVBQTZFO0FBQUEsRUFDL0Y7QUFDRjtBQVNBLGVBQXNCLG9CQUFtQztBQUN2RCxNQUFJO0FBQ0YsY0FBTSwwQkFBYSxpQkFBaUIsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUFBLEVBQ3ZELFFBQVE7QUFDTixVQUFNLElBQUksTUFBTSxtRUFBbUU7QUFBQSxFQUNyRjtBQUNGO0FBU0EsZUFBc0Isb0JBQW1DO0FBQ3ZELE1BQUk7QUFDRixVQUFNLFNBQVMsVUFBTSwwQkFBYSxnREFBZ0QsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUNuRyxRQUFJLFFBQVE7QUFDVixZQUFNLElBQUksTUFBTTtBQUFBLElBQ2xCO0FBQUEsRUFDRixRQUFRO0FBQ04sVUFBTSxJQUFJLE1BQU0sa0dBQWtHO0FBQUEsRUFDcEg7QUFDRjtBQU9BLGVBQXNCLHNCQUFxQztBQUN6RCxZQUFNO0FBQUEsUUFDSixxQ0FBd0IsRUFBRSxNQUFNLDBEQUF3QixhQUFhLENBQUM7QUFBQSxRQUN0RSxxQ0FBd0IsRUFBRSxVQUFNLGtCQUFLLDBEQUF3QixXQUFXLDBEQUF3QixZQUFZLEVBQUUsQ0FBQztBQUFBLElBQy9HLEVBQUUsT0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFDRjtBQWFBLGVBQXNCLGNBQWMsbUJBQTRDO0FBQzlFLFFBQU0sY0FBYyxxQkFBcUIsaUJBQWlCO0FBQzFELE1BQUksZ0JBQWdCLHVCQUEwQjtBQUM1QyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sY0FBYyxVQUFNLDRCQUFnQjtBQUMxQyxRQUFNLGlCQUFpQixZQUFZLFdBQVc7QUFFOUMsUUFBTSxjQUFjO0FBQ3BCLFFBQU0sbUJBQW1CLFlBQVksV0FBVyxLQUFLO0FBQ3JELFFBQU0sYUFBYSx1QkFDZixtQkFBSSxnQkFBZ0IsYUFBYSxhQUFhLFFBQzlDLG1CQUFJLGdCQUFnQixXQUFXO0FBQ25DLDRDQUFrQixZQUFZLHFDQUFxQyxjQUFjLGdCQUFnQixXQUFXLEdBQUc7QUFFL0csU0FBTztBQUNUO0FBUUEsZUFBc0IsZ0JBQWdCLFlBQXFDO0FBQ3pFLFFBQU0sb0JBQWdCLHFDQUF3QixFQUFFLE1BQU0sMERBQXdCLFlBQVksQ0FBQztBQUMzRixRQUFNLFVBQVUsVUFBTSwwQkFBUyxlQUFlLE9BQU87QUFDckQsUUFBTSx3QkFBb0IsMEJBQVc7QUFBQSxJQUNuQyxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUCxDQUFDO0FBQ0QsUUFBTSxRQUFRLElBQUksT0FBTztBQUFBLEtBQVEsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFzQixFQUFFLEtBQUssT0FBTztBQUV0RixNQUFJLGVBQWUsUUFBUSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQztBQUFBO0FBQUEsSUFBUztBQUdwRCxRQUFNLFFBQVEsVUFBTSwwQkFBYSwrQkFBK0IsRUFBRSxTQUFTLEtBQUssQ0FBQyxHQUFHLE1BQU0sT0FBTztBQUNqRyxRQUFNLGtCQUFrQixLQUFLLENBQUM7QUFDOUIsTUFBSTtBQUVKLFFBQU0sVUFBVSxVQUFNLDBCQUFhLG1DQUFtQyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBRXZGLE1BQUksaUJBQWlCO0FBQ25CLGlCQUFhLEdBQUcsT0FBTyxZQUFZLGVBQWUsTUFBTSxVQUFVO0FBQUEsRUFDcEUsT0FBTztBQUNMLGlCQUFhLEdBQUcsT0FBTyxZQUFZLFVBQVU7QUFBQSxFQUMvQztBQUVBLGtCQUFnQix1QkFBdUIsVUFBVTtBQUNqRCxTQUFPO0FBQ1Q7QUFRTyxTQUFTLHFCQUFxQixtQkFBOEM7QUFDakYsUUFBTSx3QkFBd0I7QUFDOUIsVUFBUSx1QkFBdUI7QUFBQSxJQUM3QixLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQ0gsYUFBTztBQUFBLElBRVQ7QUFDRSxVQUFJLGlDQUFpQyxLQUFLLGlCQUFpQixHQUFHO0FBQzVELGVBQU87QUFBQSxNQUNUO0FBRUEsYUFBTztBQUFBLEVBQ1g7QUFDRjtBQU9BLGVBQXNCLFVBQXlCO0FBQzdDLFlBQU0sMEJBQWEsa0NBQWtDLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDeEU7QUFnQk8sU0FBUyxpQkFBaUIsTUFBbUM7QUFDbEUsUUFBTSxFQUFFLGFBQWEsT0FBTyxRQUFJLDRCQUFVO0FBQUEsSUFDeEMsa0JBQWtCO0FBQUEsSUFDbEI7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLFlBQVksRUFBRSxNQUFNLFVBQVU7QUFBQSxNQUM5Qix3QkFBd0IsRUFBRSxNQUFNLFVBQVU7QUFBQSxNQUMxQyxhQUFhLEVBQUUsTUFBTSxVQUFVO0FBQUEsTUFDL0IsMEJBQTBCLEVBQUUsTUFBTSxVQUFVO0FBQUEsTUFDNUMsY0FBYyxFQUFFLE1BQU0sVUFBVTtBQUFBLElBQ2xDO0FBQUEsRUFDRixDQUFDO0FBRUQsU0FBTztBQUFBLElBQ0wsU0FBUztBQUFBLE1BQ1AsYUFBYSxFQUFFLE9BQU8sVUFBVSxLQUFLO0FBQUEsTUFDckMscUJBQXFCLEVBQUUsT0FBTyxzQkFBc0IsS0FBSztBQUFBLE1BQ3pELGVBQWUsRUFBRSxPQUFPLFlBQVksS0FBSztBQUFBLE1BQ3pDLGlCQUFpQixFQUFFLE9BQU8sV0FBVyxLQUFLO0FBQUEsTUFDMUMsb0JBQW9CLEVBQUUsT0FBTyx3QkFBd0IsS0FBSztBQUFBLElBQzVEO0FBQUEsSUFDQSxtQkFBbUIsWUFBWSxDQUFDO0FBQUEsRUFDbEM7QUFDRjtBQVdBLGVBQXNCLHFCQUFxQixZQUFvQixrQkFBMEM7QUFDdkcsTUFBSTtBQUVKLE1BQUksa0JBQWtCO0FBQ3BCLFVBQU0sa0JBQWMscUNBQXdCLEVBQUUsTUFBTSwwREFBd0IsVUFBVSxDQUFDO0FBQ3ZGLFVBQU0sWUFBWSxVQUFNLHdCQUFhLFdBQVc7QUFDaEQsZ0JBQVksVUFBVSxJQUFJLENBQUMsaUJBQWEsa0JBQUssYUFBYSxRQUFRLENBQUM7QUFBQSxFQUNyRSxPQUFPO0FBQ0wsUUFBSSxlQUFlLFVBQU0sMEJBQWEsQ0FBQyxPQUFPLFFBQVEsc0JBQXNCLCtEQUEwQixNQUFNLFFBQVEsR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ3hJLFVBQU0sUUFBUSxhQUFhLFFBQVEsUUFBUTtBQUMzQyxRQUFJLFVBQVUsSUFBSTtBQUNoQixZQUFNLElBQUksTUFBTSxpRUFBaUU7QUFBQSxJQUNuRjtBQUNBLG1CQUFlLGFBQWEsTUFBTSxLQUFLO0FBQ3ZDLFVBQU0sU0FBUyxLQUFLLE1BQU0sWUFBWTtBQUN0QyxnQkFBWTtBQUFBLFVBQ1Ysa0JBQUssK0RBQTBCLE1BQU0sT0FBTyxDQUFDLEVBQUUsUUFBUTtBQUFBLFVBQ3ZELGtCQUFLLCtEQUEwQixNQUFNLCtEQUEwQixTQUFTO0FBQUEsSUFDMUU7QUFBQSxFQUNGO0FBRUEsY0FBWSxVQUFVLE9BQU8sQ0FBQyxpQkFBYSwrQkFBVyxxQ0FBd0IsRUFBRSxNQUFNLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFFbEcsWUFBTSwwQkFBYTtBQUFBLElBQ2pCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxHQUFHO0FBQUEsSUFDSDtBQUFBLElBQ0EsSUFBSSxVQUFVO0FBQUEsSUFDZCxHQUFJLGFBQWEsVUFBVSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUM7QUFBQSxJQUNuRDtBQUFBLElBQ0E7QUFBQSxFQUNGLEdBQUc7QUFBQSxJQUNELFNBQVM7QUFBQSxJQUNULE9BQU8sTUFBTSxnQkFBZ0IsVUFBVTtBQUFBLEVBQ3pDLENBQUM7QUFDSDtBQVlBLGVBQXNCLGdCQUFnQixZQUFvQixVQUFrQyxDQUFDLEdBQWtCO0FBQzdHLFFBQU0sRUFBRSxzQkFBc0IsS0FBSyxJQUFJO0FBQ3ZDLFFBQU0scUJBQXFCO0FBQzNCLFFBQU0sb0JBQWdCLHFDQUF3QixFQUFFLE1BQU0sMERBQXdCLFlBQVksQ0FBQztBQUMzRixNQUFJO0FBQ0osVUFBSSwyQkFBVyxhQUFhLEdBQUc7QUFDN0IsVUFBTSxVQUFVLFVBQU0sMEJBQVMsZUFBZSxPQUFPO0FBQ3JELDZCQUF5QixRQUFRLE1BQU0sSUFBSSxFQUFFLE1BQU0sa0JBQWtCO0FBQ3JFLFFBQUksdUJBQXVCLEdBQUcsRUFBRSxNQUFNLElBQUk7QUFDeEMsNkJBQXVCLElBQUk7QUFBQSxJQUM3QjtBQUFBLEVBQ0YsT0FBTztBQUNMLDZCQUF5QixDQUFDO0FBQUEsRUFDNUI7QUFFQSxRQUFNLGNBQVUsMEJBQVc7QUFBQSxJQUN6QixVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsSUFDYixLQUFLLHVCQUF1QixDQUFDLEtBQUs7QUFBQSxFQUNwQyxDQUFDO0FBQ0QsUUFBTSxjQUFjLFVBQVUsR0FBRyxPQUFPLFdBQVc7QUFDbkQsUUFBTSxvQkFBb0IsVUFBTSwwQkFBYSxXQUFXLFdBQVcsa0NBQWtDLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDdEgsUUFBTSxpQkFBaUIsa0JBQWtCLE1BQU0sSUFBSSxFQUFFLE9BQU8sT0FBTyxFQUFFLElBQUksWUFBWTtBQUVyRixNQUFJLGVBQWU7QUFBQTtBQUFBLEtBQXFCLFVBQVU7QUFBQTtBQUFBO0FBRWxELGFBQVcsV0FBVyxnQkFBZ0I7QUFDcEMsb0JBQWdCLEtBQUssT0FBTztBQUFBO0FBQUEsRUFDOUI7QUFFQSxNQUFJLHVCQUF1QixTQUFTLEdBQUc7QUFDckMsb0JBQWdCO0FBQ2hCLGVBQVcsUUFBUSx3QkFBd0I7QUFDekMsc0JBQWdCLEdBQUcsSUFBSTtBQUFBO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBRUEsWUFBTSwyQkFBVSxlQUFlLGNBQWMsT0FBTztBQUVwRCxNQUFJLENBQUMscUJBQXFCO0FBQ3hCO0FBQUEsRUFDRjtBQUVBLFFBQU0sY0FBYyxVQUFNLDBCQUFhLGtCQUFrQjtBQUFBLElBQ3ZELFNBQVM7QUFBQSxJQUNULHNCQUFzQjtBQUFBLEVBQ3hCLENBQUM7QUFDRCxRQUFNLHNCQUFrQiw2QkFBZSxTQUFTO0FBQ2hELE1BQUksYUFBYTtBQUNmLG9CQUFnQixxQkFBcUIsMERBQXdCLFdBQVcsc0RBQXNEO0FBQzlILGNBQU0sMEJBQWEsQ0FBQyxRQUFRLE1BQU0sYUFBYSxHQUFHO0FBQUEsTUFDaEQsU0FBUztBQUFBLE1BQ1Qsc0JBQXNCO0FBQUEsSUFDeEIsQ0FBQztBQUFBLEVBQ0gsT0FBTztBQUNMLG9CQUFnQiw2RUFBNkU7QUFDN0YsY0FBTSxrQ0FBZ0IsUUFBUSxPQUFPLFFBQVEsTUFBTSxFQUFFO0FBQUEsTUFDbkQscUJBQXFCLDBEQUF3QixXQUFXO0FBQUEsSUFDMUQ7QUFBQSxFQUNGO0FBQ0Y7QUFtQkEsZUFBc0IsY0FBYyxtQkFBNEIsVUFBZ0MsQ0FBQyxHQUFrQjtBQUNqSCxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0EsY0FBYztBQUFBLElBQ2Qsc0JBQXNCO0FBQUEsSUFDdEIsZ0JBQWdCO0FBQUEsSUFDaEIsa0JBQWtCO0FBQUEsSUFDbEIscUJBQXFCO0FBQUEsRUFDdkIsSUFBSTtBQUVKLE1BQUksQ0FBQyxtQkFBbUI7QUFDdEIsVUFBTSxnQkFBZ0IsUUFBUSxJQUFJLGlCQUFpQjtBQUNuRCxVQUFNLGdCQUFnQixRQUFRLElBQUksaUJBQWlCO0FBRW5ELFFBQUksaUJBQWlCLGVBQWU7QUFDbEMsWUFBTSxxQkFBcUIsYUFBYTtBQUN4QyxZQUFNLGNBQWMsZUFBZSxPQUFPO0FBQzFDO0FBQUEsSUFDRjtBQUVBLFVBQU0sSUFBSSxNQUFNLGlDQUFpQztBQUFBLEVBQ25EO0FBRUEsUUFBTSx1QkFBbUIsK0JBQVcscUNBQXdCLEVBQUUsTUFBTSwwREFBd0IsYUFBYSxDQUFDLENBQUMsTUFBTSxVQUFNLDRCQUFnQixHQUFHLFNBQVM7QUFFbkosV0FBUyxpQkFBaUI7QUFDMUIsUUFBTSxrQkFBa0I7QUFDeEIsUUFBTSx3QkFBd0I7QUFFOUIsTUFBSSxpQkFBaUI7QUFDbkIsVUFBTSxrQkFBa0I7QUFDeEIsY0FBTSx1QkFBTyxjQUFjO0FBQzNCLGNBQU0sdUJBQU8sWUFBWTtBQUN6QixjQUFNLHVCQUFPLFNBQVM7QUFBQSxFQUN4QjtBQUdBLE1BQUksYUFBYTtBQUNmLGNBQU0sdUJBQU8sT0FBTztBQUFBLEVBQ3RCO0FBRUEsTUFBSSxpQkFBaUI7QUFDbkIsY0FBTSx1QkFBTyxNQUFNO0FBQ25CLGNBQU0sK0JBQWUsa0JBQWtCO0FBQ3ZDLGNBQU0sK0JBQWUsTUFBTTtBQUMzQixjQUFNLCtCQUFlLGtCQUFrQjtBQUN2QyxjQUFNLCtCQUFlLGVBQWU7QUFBQSxFQUN0QztBQUVBLFFBQU0sYUFBYSxNQUFNLGNBQWMsaUJBQWlCO0FBQ3hELFFBQU0scUJBQXFCLFVBQVU7QUFDckMsTUFBSSxrQkFBa0I7QUFDcEIsVUFBTSw4QkFBOEIsVUFBVTtBQUFBLEVBQ2hEO0FBRUEsUUFBTSxnQkFBZ0IsWUFBWSxFQUFFLG9CQUFvQixDQUFDO0FBQ3pELFFBQU0scUJBQXFCLFlBQVksRUFBRSxtQkFBbUIsQ0FBQztBQUM3RCxRQUFNLFVBQVUsVUFBVTtBQUUxQixNQUFJLENBQUMsZUFBZTtBQUNsQixxQ0FBZSxTQUFTLEVBQUUsOEhBQThIO0FBQ3hKO0FBQUEsRUFDRjtBQUVBLFFBQU0sUUFBUTtBQUNkLFFBQU0sdUJBQXVCLFVBQVU7QUFDdkMsUUFBTSxxQkFBcUIsWUFBWSxnQkFBZ0I7QUFDekQ7QUFTQSxlQUFzQixxQkFBcUIsWUFBbUM7QUFDNUUsWUFBTSw0QkFBZ0IsQ0FBQyxnQkFBZ0I7QUFDckMsZ0JBQVksVUFBVTtBQUFBLEVBQ3hCLENBQUM7QUFFRCxZQUFNLGdDQUFvQixRQUFRLEVBQUUscUJBQXFCLEtBQUssQ0FBQztBQUMvRCxZQUFNLGtDQUFzQixRQUFRLEVBQUUscUJBQXFCLEtBQUssQ0FBQztBQUVqRSxXQUFTLE9BQU8saUJBQXdDO0FBQ3RELG9CQUFnQixVQUFVO0FBQzFCLFVBQU0saUJBQWlCLGdCQUFnQixXQUFXLEVBQUU7QUFDcEQsUUFBSSxnQkFBZ0I7QUFDbEIscUJBQWUsVUFBVTtBQUFBLElBQzNCO0FBQUEsRUFDRjtBQUNGO0FBU08sU0FBUyxTQUFTLG1CQUFpQztBQUN4RCxNQUFJLHFCQUFxQixpQkFBaUIsTUFBTSx5QkFBMkI7QUFDekUsVUFBTSxJQUFJO0FBQUEsTUFDUjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFPQSxlQUFlLDJCQUE0QztBQUV6RCxRQUFNLFdBQVcsTUFBTSxNQUFNLDJFQUEyRTtBQUN4RyxRQUFNLHVCQUF1QixNQUFNLFNBQVMsS0FBSztBQUNqRCxhQUFPLHNDQUFrQixxQkFBcUIsTUFBTSx3REFBd0Q7QUFDOUc7QUFFQSxTQUFTLGFBQWEsU0FBMEI7QUFDOUMsYUFBTywwQkFBVyxPQUFPLE1BQU07QUFDakM7QUFFQSxTQUFTLGFBQWEsS0FBcUI7QUFDekMsUUFBTSxRQUFRLElBQUksTUFBTSxPQUFPLEVBQUUsT0FBTyxPQUFPO0FBQy9DLFNBQU8sTUFBTSxLQUFLLEdBQUc7QUFDdkI7QUFFQSxlQUFlLDhCQUE4QixZQUFtQztBQUM5RSxRQUFNLDJCQUF1QixxQ0FBd0IsRUFBRSxNQUFNLDBEQUF3QixpQkFBaUIsQ0FBQztBQUN2RyxNQUFJLGFBQWEsVUFBVSxHQUFHO0FBQzVCLGNBQU07QUFBQSxVQUNKLHFDQUF3QixFQUFFLE1BQU0sMERBQXdCLGFBQWEsQ0FBQztBQUFBLE1BQ3RFO0FBQUEsTUFDQSxFQUFFLE9BQU8sS0FBSztBQUFBLElBQ2hCO0FBQ0EsY0FBTSxzQkFBbUI7QUFBQSxNQUN2QixRQUFRLENBQUMsYUFBYTtBQUNwQixpQkFBUyxVQUFVO0FBQUEsTUFDckI7QUFBQSxNQUNBLE1BQU0sMERBQXdCO0FBQUEsSUFDaEMsQ0FBQztBQUFBLEVBQ0gsT0FBTztBQUNMLFVBQU0sd0JBQXdCLE1BQU0seUJBQXlCO0FBRTdELGNBQU0sc0JBQW1CO0FBQUEsTUFDdkIsUUFBUSxDQUFDLGFBQWE7QUFDcEIsaUJBQVMsZ0JBQWdCO0FBQ3pCLGlCQUFTLFVBQVU7QUFBQSxNQUNyQjtBQUFBLE1BQ0EsTUFBTSwwREFBd0I7QUFBQSxJQUNoQyxDQUFDO0FBRUQsY0FBTSxzQkFBaUM7QUFBQSxNQUNyQyxRQUFRLENBQUMsYUFBYTtBQUNwQixpQkFBUyxVQUFVLElBQUk7QUFBQSxNQUN6QjtBQUFBLE1BQ0EsTUFBTSwwREFBd0I7QUFBQSxJQUNoQyxDQUFDO0FBRUQsWUFBSSwyQkFBVyxvQkFBb0IsR0FBRztBQUNwQyxnQkFBTSxvQkFBRyxvQkFBb0I7QUFBQSxJQUMvQjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLG9CQUFvQjtBQUM1QjsiLAogICJuYW1lcyI6IFsiaW1wb3J0X3Byb21pc2VzIiwgIlZlcnNpb25VcGRhdGVUeXBlIl0KfQo=
561
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy92ZXJzaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyB2ZXJzaW9uIHVwZGF0ZXMgaW4gYSBwcm9qZWN0LlxuICogSXQgaW5jbHVkZXMgdGFza3Mgc3VjaCBhcyB2YWxpZGF0aW5nIHZlcnNpb24gdXBkYXRlIHR5cGVzLCBjaGVja2luZyB0aGUgc3RhdGVcbiAqIG9mIEdpdCBhbmQgR2l0SHViIENMSSwgdXBkYXRpbmcgdmVyc2lvbiBudW1iZXJzIGluIGZpbGVzLCBhbmQgcGVyZm9ybWluZ1xuICogR2l0IG9wZXJhdGlvbnMgc3VjaCBhcyB0YWdnaW5nIGFuZCBwdXNoaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVsZWFzZVR5cGUgfSBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgcmVhZEZpbGUsXG4gIHJtLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tICdub2RlOnJlYWRsaW5lL3Byb21pc2VzJztcbmltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBpbmMsXG4gIHByZXJlbGVhc2Vcbn0gZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlTG9ja0pzb24gfSBmcm9tICcuL25wbS50cyc7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgZXJyb3JUb1N0cmluZyB9IGZyb20gJy4uL2Vycm9yLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4vcGx1Z2luL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUsXG4gIGVuc3VyZU5vbk51bGxhYmxlXG59IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHJlYWRkaXJQb3NpeCB9IGZyb20gJy4vZnMudHMnO1xuaW1wb3J0IHsgZWRpdEpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHtcbiAgbnBtUnVuLFxuICBucG1SdW5PcHRpb25hbFxufSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHtcbiAgZWRpdE5wbVNocmlua1dyYXBKc29uLFxuICBlZGl0UGFja2FnZUpzb24sXG4gIGVkaXRQYWNrYWdlTG9ja0pzb24sXG4gIHJlYWRQYWNrYWdlSnNvblxufSBmcm9tICcuL25wbS50cyc7XG5pbXBvcnQgeyBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIH0gZnJvbSAnLi9vYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBleGVjRnJvbVJvb3QsXG4gIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlXG59IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGFkZFVwZGF0ZWRGaWxlc1RvR2l0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRVcGRhdGVkRmlsZXNUb0dpdE9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIHByZS1jb21taXQgaG9vayB3aGVuIGNyZWF0aW5nIHRoZSByZWxlYXNlIGNvbW1pdC4gV2hlbiBgZmFsc2VgLCBgLS1uby12ZXJpZnlgXG4gICAqIGlzIHBhc3NlZCB0byB0aGUgcmVsZWFzZSBjb21taXQgdG8gc2tpcCB0aGUgaG9vay5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRWZXJpZnlDb21taXQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgcGFyc2luZyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgYSB2ZXJzaW9uIHVwZGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRWZXJzaW9uQXJncyB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBwYXJzZWQgZnJvbSB0aGUgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uYWwgdmVyc2lvbiB1cGRhdGUgdHlwZSBhcmd1bWVudCwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVDaGFuZ2Vsb2d9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBvcGVuIHRoZSBnZW5lcmF0ZWQgY2hhbmdlbG9nIGluIHRoZSBlZGl0b3IgZm9yIGFuIGludGVyYWN0aXZlIHJldmlldy4gV2hlbiBgZmFsc2VgLFxuICAgKiB0aGUgY2hhbmdlbG9nIGlzIHN0aWxsIGdlbmVyYXRlZCBmcm9tIGNvbW1pdCBtZXNzYWdlcywgYnV0IGl0IGlzIG5vdCBvcGVuZWQgaW4gdGhlIGVkaXRvciBmb3JcbiAgICogbWFudWFsIHJldmlldy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0Q2hhbmdlbG9nPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdXBkYXRlVmVyc2lvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlVmVyc2lvbk9wdGlvbnMge1xuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAgICpcbiAgICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB0aGUgcmVsZWFzZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBHaXRIdWIgcmVsZWFzZSBoYXMgYmVlbiBwcmVwYXJlZC5cbiAgICovXG4gIHByZXBhcmVHaXRIdWJSZWxlYXNlPyh0aGlzOiB2b2lkLCBuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgYnVpbGQgc3RlcC4gVGhlIGJ1aWxkIGlzIGEgcHVibGlzaGluZyBwcmVyZXF1aXNpdGUsIG5vdCBhIHZlcmlmaWNhdGlvbiBjaGVjayxcbiAgICogc28gaXQgaXMgZ292ZXJuZWQgYnkgdGhpcyBmbGFnIGluZGVwZW5kZW50bHkgb2Yge0BsaW5rIHNob3VsZFJ1bkNoZWNrc30gXHUyMDE0IGl0IHJ1bnMgZXZlbiB3aGVuIHRoZVxuICAgKiBjaGVja3MgYXJlIHNraXBwZWQsIHNvIGEgZmFzdCByZWxlYXNlIHN0aWxsIHNoaXBzIGZyZXNoIGFydGlmYWN0cy4gU2V0IHRvIGBmYWxzZWAgb25seSB3aGVuIHRoZVxuICAgKiBidWlsZCBvdXRwdXQgaXMga25vd24gdG8gYWxyZWFkeSBtYXRjaCB0aGUgY3VycmVudCBjb2RlOyBvdGhlcndpc2UgdGhlIHJlbGVhc2Ugd291bGQgcHVibGlzaFxuICAgKiBzdGFsZSBhcnRpZmFjdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaW4gdGhlIGVkaXRvciBmb3IgYW4gaW50ZXJhY3RpdmUgcmV2aWV3LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHB1Ymxpc2ggdGhlIHJlbGVhc2UuIFdoZW4gYGZhbHNlYCwgYWxsIGxvY2FsIHN0ZXBzIGFyZSBleGVjdXRlZCAodmVyc2lvbiBidW1wLFxuICAgKiBjaGFuZ2Vsb2csIGNvbW1pdCwgdGFnKSwgYnV0IHRoZSBjaGFuZ2VzIGFyZSBub3QgcHVzaGVkIGFuZCBubyBHaXRIdWIgcmVsZWFzZSBpcyBwdWJsaXNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmVmbGlnaHQgdmVyaWZpY2F0aW9uIGNoZWNrcyAoY2xlYW4tcmVwbyBjaGVjaywgZm9ybWF0LCBzcGVsbGNoZWNrLCBsaW50LFxuICAgKiBvdmVyLWV4cG9zdXJlIGFuYWx5c2lzLCBhbmQgdGVzdHMpLiBUaGUgYnVpbGQgc3RlcCBpcyBub3Qgb25lIG9mIHRoZXNlIGNoZWNrcyBcdTIwMTQgaXQgaXMgZ292ZXJuZWRcbiAgICogc2VwYXJhdGVseSBieSB7QGxpbmsgc2hvdWxkQnVpbGR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJ1bkNoZWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE5wbVBhY2tSZXN1bHQge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHByZS1yZWxlYXNlIGlkZW50aWZpZXIgdXNlZCBmb3IgcHJlLXJlbGVhc2UgdmVyc2lvbnMuXG4gKi9cbmNvbnN0IERFRkFVTFRfUFJFSUQgPSAnYmV0YSc7XG5cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgZGlmZmVyZW50IHR5cGVzIG9mIHZlcnNpb24gdXBkYXRlcy5cbiAqXG4gKiBBbGlnbnMgd2l0aCBucG0ncyBgbnBtIHZlcnNpb25gIGluY3JlbWVudCB0eXBlcyBwbHVzIGBNYW51YWxgIGZvciBleHBsaWNpdCB2ZXJzaW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gVmVyc2lvblVwZGF0ZVR5cGUge1xuICBJbnZhbGlkID0gJ2ludmFsaWQnLFxuICBNYWpvciA9ICdtYWpvcicsXG4gIE1hbnVhbCA9ICdtYW51YWwnLFxuICBNaW5vciA9ICdtaW5vcicsXG4gIFBhdGNoID0gJ3BhdGNoJyxcbiAgUHJlTWFqb3IgPSAncHJlbWFqb3InLFxuICBQcmVNaW5vciA9ICdwcmVtaW5vcicsXG4gIFByZVBhdGNoID0gJ3ByZXBhdGNoJyxcbiAgUHJlUmVsZWFzZSA9ICdwcmVyZWxlYXNlJ1xufVxuXG4vKipcbiAqIFR5cGUgcmVwcmVzZW50aW5nIHRoZSBtYW5pZmVzdCBmaWxlIGZvcm1hdCBmb3IgT2JzaWRpYW4gcGx1Z2lucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBBIG1pbmltdW0gT2JzaWRpYW4gdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIG1pbkFwcFZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHlwZSByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSBvZiBPYnNpZGlhbiByZWxlYXNlcyBKU09OLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuUmVsZWFzZXNKc29uIHtcbiAgLyoqXG4gICAqIEEgbmFtZSBvZiB0aGUgT2JzaWRpYW4gcmVsZWFzZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgR2l0IHRhZyBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0byB1c2UgZm9yIHRoZSB0YWcuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRhZyBoYXMgYmVlbiBjcmVhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkR2l0VGFnKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCB0YWcgLWEgJHtuZXdWZXJzaW9ufSAtbSAke25ld1ZlcnNpb259IC0tZm9yY2VgLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG59XG5cbi8qKlxuICogQWRkcyB1cGRhdGVkIGZpbGVzIHRvIHRoZSBHaXQgc3RhZ2luZyBhcmVhIGFuZCBjb21taXRzIHRoZW0gd2l0aCB0aGUgbmV3IHZlcnNpb24gbWVzc2FnZS5cbiAqXG4gKiBJZiB0aGUgY29tbWl0IGZhaWxzIChmb3IgZXhhbXBsZSwgdGhlIHByZS1jb21taXQgaG9vayByZWplY3RzIGEgbmV3IHdvcmQgaW4gdGhlIGNoYW5nZWxvZykgYW5kIHRoZVxuICogcHJvY2VzcyBpcyBhdHRhY2hlZCB0byBhbiBpbnRlcmFjdGl2ZSB0ZXJtaW5hbCwgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gZml4IHRoZSBpc3N1ZSAoZm9yIGV4YW1wbGUsXG4gKiBhZGQgdGhlIG1pc3Npbmcgd29yZCB0byBgY3NwZWxsLmpzb25gKSBhbmQgcHJlc3MgRW50ZXIgdG8gcmV0cnkuIFRoZSByZXRyeSByZS1zdGFnZXMgYWxsIGZpbGVzLCBzbyB0aGVcbiAqIGZpeCBpcyBwaWNrZWQgdXAgd2l0aG91dCByZXN0YXJ0aW5nIHRoZSB3aG9sZSByZWxlYXNlIGxpZmVjeWNsZS4gSW4gYSBub24taW50ZXJhY3RpdmUgZW52aXJvbm1lbnQgKG5vXG4gKiBUVFksIHN1Y2ggYXMgQ0kpLCB0aGUgZXJyb3IgaXMgcmUtdGhyb3duIGluc3RlYWQgb2YgcHJvbXB0aW5nLCBzbyB0aGUgc2NyaXB0IGZhaWxzIGZhc3QgcmF0aGVyIHRoYW5cbiAqIGhhbmdpbmcuIFBhc3MgYHNob3VsZFZlcmlmeUNvbW1pdDogZmFsc2VgIHRvIHNraXAgdGhlIHByZS1jb21taXQgaG9vayBlbnRpcmVseSBpbiBzdWNoIGNhc2VzLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB1c2VkIGFzIHRoZSBjb21taXQgbWVzc2FnZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBBZGRVcGRhdGVkRmlsZXNUb0dpdE9wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSBjb21taXQgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpbGVzIGhhdmUgYmVlbiBhZGRlZCBhbmQgY29tbWl0dGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkVXBkYXRlZEZpbGVzVG9HaXQobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBBZGRVcGRhdGVkRmlsZXNUb0dpdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHNob3VsZFZlcmlmeUNvbW1pdCA9IHRydWUgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHZlcnNpb25EZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJyk7XG5cbiAgY29uc3QgY29tbWl0QXJncyA9IFsnZ2l0JywgJ2NvbW1pdCcsICctbScsIGBjaG9yZTogcmVsZWFzZSAke25ld1ZlcnNpb259YCwgJy0tYWxsb3ctZW1wdHknXTtcbiAgaWYgKCFzaG91bGRWZXJpZnlDb21taXQpIHtcbiAgICBjb21taXRBcmdzLnB1c2goJy0tbm8tdmVyaWZ5Jyk7XG4gIH1cblxuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdhZGQnLCAnLS1hbGwnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlY0Zyb21Sb290KGNvbW1pdEFyZ3MsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2ZXJzaW9uRGVidWdnZXIoXG4gICAgICAgIGBGYWlsZWQgdG8gY29tbWl0IHRoZSByZWxlYXNlLlxcbiR7ZXJyb3JUb1N0cmluZyhlcnJvcil9XFxuYFxuICAgICAgICAgICsgJ0ZpeCB0aGUgaXNzdWVzIChmb3IgZXhhbXBsZSwgYWRkIHRoZSBtaXNzaW5nIHdvcmQgdG8gY3NwZWxsLmpzb24pIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeSB0aGUgY29tbWl0LCBvciBDdHJsK0MgdG8gYWJvcnQuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCkucXVlc3Rpb24oJ1ByZXNzIEVudGVyIHRvIHJldHJ5IHRoZSBjb21taXQuLi4nKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIEdpdEh1YiBDTEkgaXMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tHaXRIdWJDbGlJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaCAtLXZlcnNpb24nLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLiBQbGVhc2UgaW5zdGFsbCBpdCBmcm9tIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgR2l0IGlzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIEdpdCBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tHaXRJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgLS12ZXJzaW9uJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdCBpcyBub3QgaW5zdGFsbGVkLiBQbGVhc2UgaW5zdGFsbCBpdCBmcm9tIGh0dHBzOi8vZ2l0LXNjbS5jb20vJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIGNsZWFuLCBtZWFuaW5nIHRoZXJlIGFyZSBubyB1bmNvbW1pdHRlZCBjaGFuZ2VzLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLlxuICpcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrR2l0UmVwb0NsZWFuKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbiAtLXVudHJhY2tlZC1maWxlcz1hbGwnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgaWYgKHN0ZG91dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi4gUGxlYXNlIGNvbW1pdCBvciBzdGFzaCB5b3VyIGNoYW5nZXMgYmVmb3JlIHJlbGVhc2luZyBhIG5ldyB2ZXJzaW9uLicpO1xuICB9XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSB1cGRhdGVkIG1hbmlmZXN0IGZpbGUgdG8gdGhlIGRpc3RyaWJ1dGlvbiBidWlsZCBmb2xkZXIuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb3B5IG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlVcGRhdGVkTWFuaWZlc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGNwKFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uIH0pLFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogam9pbihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbikgfSksXG4gICAgeyBmb3JjZTogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbmV3IHZlcnNpb24gc3RyaW5nIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZlcnNpb24gYW5kIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVXNlcyB0aGUgYHNlbXZlcmAgcGFja2FnZSB0byBjb21wdXRlIHRoZSBuZXh0IHZlcnNpb24sIHN1cHBvcnRpbmcgYWxsIG5wbSBpbmNyZW1lbnQgdHlwZXM6XG4gKiBgbWFqb3JgLCBgbWlub3JgLCBgcGF0Y2hgLCBgcHJlbWFqb3JgLCBgcHJlbWlub3JgLCBgcHJlcGF0Y2hgLCBhbmQgYHByZXJlbGVhc2VgLlxuICogUHJlLXJlbGVhc2UgdmVyc2lvbnMgdXNlIHRoZSBgYmV0YWAgaWRlbnRpZmllciBieSBkZWZhdWx0IChlLmcuLCBgMS4yLjQtYmV0YS4wYCkuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgb3IgYW4gZXhwbGljaXQgdmVyc2lvbiBzdHJpbmcuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgdmVyc2lvbiBzdHJpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjdXJyZW50IHZlcnNpb24gaXMgaW52YWxpZCBvciB0aGUgaW5jcmVtZW50IGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdmVyc2lvblR5cGUgPSBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGlmICh2ZXJzaW9uVHlwZSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsKSB7XG4gICAgcmV0dXJuIHZlcnNpb25VcGRhdGVUeXBlO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcbiAgY29uc3QgY3VycmVudFZlcnNpb24gPSBwYWNrYWdlSnNvbi52ZXJzaW9uID8/ICcnO1xuXG4gIGNvbnN0IHJlbGVhc2VUeXBlID0gdmVyc2lvblR5cGUgYXMgUmVsZWFzZVR5cGU7XG4gIGNvbnN0IGlzUHJlUmVsZWFzZVR5cGUgPSByZWxlYXNlVHlwZS5zdGFydHNXaXRoKCdwcmUnKTtcbiAgY29uc3QgbmV3VmVyc2lvbiA9IGlzUHJlUmVsZWFzZVR5cGVcbiAgICA/IGluYyhjdXJyZW50VmVyc2lvbiwgcmVsZWFzZVR5cGUsIERFRkFVTFRfUFJFSUQpXG4gICAgOiBpbmMoY3VycmVudFZlcnNpb24sIHJlbGVhc2VUeXBlKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3VmVyc2lvbiwgYEZhaWxlZCB0byBpbmNyZW1lbnQgdmVyc2lvbiBmcm9tICcke2N1cnJlbnRWZXJzaW9ufScgd2l0aCB0eXBlICcke3ZlcnNpb25UeXBlfSdgKTtcblxuICByZXR1cm4gbmV3VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIGEgc3BlY2lmaWMgdmVyc2lvbiBmcm9tIHRoZSBjaGFuZ2Vsb2cuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB3aGljaCB0byBnZXQgdGhlIHJlbGVhc2Ugbm90ZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZWxlYXNlIG5vdGVzIGZvciB0aGUgc3BlY2lmaWVkIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWxlYXNlTm90ZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2hhbmdlbG9nUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgbmV3VmVyc2lvbkVzY2FwZWQgPSByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogJ1xcXFwuJyxcbiAgICBzZWFyY2hWYWx1ZTogJy4nLFxuICAgIHN0cjogbmV3VmVyc2lvblxuICB9KTtcbiAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKGBcXG4jIyAke25ld1ZlcnNpb25Fc2NhcGVkfVxcblxcbigoLnxcXG4pKz8pXFxuXFxuIyNgKS5leGVjKGNvbnRlbnQpO1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gdjggdHJhY2tzIG9wdGlvbmFsIGNoYWluaW5nIGFuZCB0ZXJuYXJ5IGFzIHNlcGFyYXRlIGJyYW5jaGVzOyBib3RoIHBhdGhzIGFyZSB0ZXN0ZWQuICovXG4gIGxldCByZWxlYXNlTm90ZXMgPSBtYXRjaD8uWzFdID8gYCR7bWF0Y2hbMV19XFxuXFxuYCA6ICcnO1xuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gIGNvbnN0IHRhZ3MgPSAoYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgdGFnIC0tc29ydD0tY3JlYXRvcmRhdGUnLCB7IGlzUXVpZXQ6IHRydWUgfSkpLnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IHRhZ3NbMV07XG4gIGxldCBjaGFuZ2VzVXJsOiBzdHJpbmc7XG5cbiAgY29uc3QgcmVwb1VybCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2ggcmVwbyB2aWV3IC0tanNvbiB1cmwgLXEgLnVybCcsIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICBpZiAocHJldmlvdXNWZXJzaW9uKSB7XG4gICAgY2hhbmdlc1VybCA9IGAke3JlcG9Vcmx9L2NvbXBhcmUvJHtwcmV2aW91c1ZlcnNpb259Li4uJHtuZXdWZXJzaW9ufWA7XG4gIH0gZWxzZSB7XG4gICAgY2hhbmdlc1VybCA9IGAke3JlcG9Vcmx9L2NvbW1pdHMvJHtuZXdWZXJzaW9ufWA7XG4gIH1cblxuICByZWxlYXNlTm90ZXMgKz0gYCoqRnVsbCBDaGFuZ2Vsb2cqKjogJHtjaGFuZ2VzVXJsfWA7XG4gIHJldHVybiByZWxlYXNlTm90ZXM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSBiYXNlZCBvbiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSBpbnB1dCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgYFZlcnNpb25VcGRhdGVUeXBlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIGNvbnN0IHZlcnNpb25VcGRhdGVUeXBlRW51bSA9IHZlcnNpb25VcGRhdGVUeXBlIGFzIFZlcnNpb25VcGRhdGVUeXBlO1xuICBzd2l0Y2ggKHZlcnNpb25VcGRhdGVUeXBlRW51bSkge1xuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vcjpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWFqb3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QcmVNaW5vcjpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZVBhdGNoOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuUHJlUmVsZWFzZTpcbiAgICAgIHJldHVybiB2ZXJzaW9uVXBkYXRlVHlwZUVudW07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKC9eXFxkK1xcLlxcZCtcXC5cXGQrKD86LVtcXHdcXGQuLV0rKT8kLy50ZXN0KHZlcnNpb25VcGRhdGVUeXBlKSkge1xuICAgICAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZDtcbiAgfVxufVxuXG4vKipcbiAqIFB1c2hlcyBjb21taXRzIGFuZCB0YWdzIHRvIHRoZSByZW1vdGUgR2l0IHJlcG9zaXRvcnkuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwdXNoIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdpdFB1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHB1c2ggLS1mb2xsb3ctdGFncyAtLWZvcmNlJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgYSB2ZXJzaW9uIHVwZGF0ZSBpbnRvIGEgdmVyc2lvbiB1cGRhdGUgdHlwZSBhbmRcbiAqIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9uc30uXG4gKlxuICogRWFjaCBiZWhhdmlvciBpcyBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRoZSBjb3JyZXNwb25kaW5nIGAtLW5vLSpgIGZsYWcgdHVybnMgaXQgb2ZmLiBSZWNvZ25pemVkIGZsYWdzOlxuICogLSBgLS1uby1idWlsZGAgXHUyMDE0IHNraXAgdGhlIGJ1aWxkIHN0ZXAgKG9ubHkgc2FmZSB3aGVuIHRoZSBidWlsZCBvdXRwdXQgYWxyZWFkeSBtYXRjaGVzIHRoZSBjdXJyZW50IGNvZGUpLlxuICogLSBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2AgXHUyMDE0IGdlbmVyYXRlIHRoZSBjaGFuZ2Vsb2cgd2l0aG91dCBvcGVuaW5nIGl0IGZvciBtYW51YWwgcmV2aWV3LlxuICogLSBgLS1uby1jaGVja3NgIFx1MjAxNCBza2lwIHRoZSBjbGVhbi1yZXBvIGNoZWNrLCBmb3JtYXQsIHNwZWxsY2hlY2ssIGxpbnQsIG92ZXItZXhwb3N1cmUgYW5hbHlzaXMsIGFuZCB0ZXN0cyAodGhlIGJ1aWxkIHN0aWxsIHJ1bnMpLlxuICogLSBgLS1uby1jb21taXQtdmVyaWZpY2F0aW9uYCBcdTIwMTQgcGFzcyBgLS1uby12ZXJpZnlgIHRvIHRoZSByZWxlYXNlIGNvbW1pdCwgc2tpcHBpbmcgdGhlIHByZS1jb21taXQgaG9vay5cbiAqIC0gYC0tbm8tcmVsZWFzZWAgXHUyMDE0IHJ1biBhbGwgbG9jYWwgc3RlcHMgYnV0IHNraXAgdGhlIHB1c2ggYW5kIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHBhcnNlICh0eXBpY2FsbHkgYHByb2Nlc3MuYXJndi5zbGljZSgyKWApLlxuICogQHJldHVybnMgVGhlIHtAbGluayBQYXJzZWRWZXJzaW9uQXJnc30gY29udGFpbmluZyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSBhbmQgdGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZlcnNpb25BcmdzKGFyZ3M6IHN0cmluZ1tdKTogUGFyc2VkVmVyc2lvbkFyZ3Mge1xuICBjb25zdCB7IHBvc2l0aW9uYWxzLCB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICBhcmdzLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgICduby1idWlsZCc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnbm8tY2hhbmdlbG9nLWVkaXRpbmcnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWNoZWNrcyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnbm8tY29tbWl0LXZlcmlmaWNhdGlvbic6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnbm8tcmVsZWFzZSc6IHsgdHlwZTogJ2Jvb2xlYW4nIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgb3B0aW9uczoge1xuICAgICAgc2hvdWxkQnVpbGQ6ICEodmFsdWVzWyduby1idWlsZCddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2c6ICEodmFsdWVzWyduby1jaGFuZ2Vsb2ctZWRpdGluZyddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZFJlbGVhc2U6ICEodmFsdWVzWyduby1yZWxlYXNlJ10gPz8gZmFsc2UpLFxuICAgICAgc2hvdWxkUnVuQ2hlY2tzOiAhKHZhbHVlc1snbm8tY2hlY2tzJ10gPz8gZmFsc2UpLFxuICAgICAgc2hvdWxkVmVyaWZ5Q29tbWl0OiAhKHZhbHVlc1snbm8tY29tbWl0LXZlcmlmaWNhdGlvbiddID8/IGZhbHNlKVxuICAgIH0sXG4gICAgdmVyc2lvblVwZGF0ZVR5cGU6IHBvc2l0aW9uYWxzWzBdXG4gIH07XG59XG5cbi8qKlxuICogUHVibGlzaGVzIGEgR2l0SHViIHJlbGVhc2UgZm9yIHRoZSBuZXcgdmVyc2lvbi5cbiAqXG4gKiBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBhIHJlbGVhc2UgYW5kIHVwbG9hZGluZyBmaWxlcyBmb3IgZWl0aGVyIGFuIE9ic2lkaWFuIHBsdWdpbiBvciBhbm90aGVyIHByb2plY3QuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB0aGUgcmVsZWFzZS5cbiAqIEBwYXJhbSBpc09ic2lkaWFuUGx1Z2luIC0gQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHByb2plY3QgaXMgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWxlYXNlIGhhcyBiZWVuIHB1Ymxpc2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb246IHN0cmluZywgaXNPYnNpZGlhblBsdWdpbjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgZmlsZVBhdGhzOiBzdHJpbmdbXTtcblxuICBpZiAoaXNPYnNpZGlhblBsdWdpbikge1xuICAgIGNvbnN0IGJ1aWxkRm9sZGVyID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQgfSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gYXdhaXQgcmVhZGRpclBvc2l4KGJ1aWxkRm9sZGVyKTtcbiAgICBmaWxlUGF0aHMgPSBmaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gam9pbihidWlsZEZvbGRlciwgZmlsZU5hbWUpKTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgcmVzdWx0T3V0cHV0ID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnbnBtJywgJ3BhY2snLCAnLS1wYWNrLWRlc3RpbmF0aW9uJywgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0LCAnLS1qc29uJ10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBjb25zdCBpbmRleCA9IHJlc3VsdE91dHB1dC5pbmRleE9mKCdbXFxuICB7Jyk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmluZCB0aGUgc3RhcnQgb2YgdGhlIEpTT04gYXJyYXkgaW4gdGhlIHJlc3VsdCBvdXRwdXQnKTtcbiAgICB9XG4gICAgcmVzdWx0T3V0cHV0ID0gcmVzdWx0T3V0cHV0LnNsaWNlKGluZGV4KTtcbiAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdE91dHB1dCkgYXMgW05wbVBhY2tSZXN1bHRdO1xuICAgIGZpbGVQYXRocyA9IFtcbiAgICAgIGpvaW4oT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0LCByZXN1bHRbMF0uZmlsZW5hbWUpLFxuICAgICAgam9pbihPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkRpc3QsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuU3R5bGVzQ3NzKVxuICAgIF07XG4gIH1cblxuICBmaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKChmaWxlUGF0aCkgPT4gZXhpc3RzU3luYyhyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IGZpbGVQYXRoIH0pKSk7XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFtcbiAgICAnZ2gnLFxuICAgICdyZWxlYXNlJyxcbiAgICAnY3JlYXRlJyxcbiAgICBuZXdWZXJzaW9uLFxuICAgIC4uLmZpbGVQYXRocyxcbiAgICAnLS10aXRsZScsXG4gICAgYHYke25ld1ZlcnNpb259YCxcbiAgICAuLi4oaXNQcmVSZWxlYXNlKG5ld1ZlcnNpb24pID8gWyctLXByZXJlbGVhc2UnXSA6IFtdKSxcbiAgICAnLS1ub3Rlcy1maWxlJyxcbiAgICAnLSdcbiAgXSwge1xuICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgc3RkaW46IGF3YWl0IGdldFJlbGVhc2VOb3RlcyhuZXdWZXJzaW9uKVxuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBjaGFuZ2Vsb2cgZmlsZSB3aXRoIG5ldyB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBjb21taXQgbWVzc2FnZXMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgY3VycmVudCBjaGFuZ2Vsb2csIGFwcGVuZHMgbmV3IGVudHJpZXMgZm9yIHRoZSBsYXRlc3QgdmVyc2lvbixcbiAqIGFuZCBwcm9tcHRzIHRoZSB1c2VyIHRvIHJldmlldyB0aGUgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdG8gYmUgYWRkZWQgdG8gdGhlIGNoYW5nZWxvZy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zfSBjb250cm9sbGluZyB0aGUgY2hhbmdlbG9nIHJldmlldyBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2hhbmdlbG9nIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNoYW5nZWxvZyhuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHNob3VsZEVkaXRDaGFuZ2Vsb2cgPSB0cnVlIH0gPSBvcHRpb25zO1xuICBjb25zdCBIRUFERVJfTElORVNfQ09VTlQgPSAyO1xuICBjb25zdCBjaGFuZ2Vsb2dQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgbGV0IHByZXZpb3VzQ2hhbmdlbG9nTGluZXM6IHN0cmluZ1tdO1xuICBpZiAoZXhpc3RzU3luYyhjaGFuZ2Vsb2dQYXRoKSkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgICBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJykuc2xpY2UoSEVBREVSX0xJTkVTX0NPVU5UKTtcbiAgICBpZiAocHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5hdCgtMSkgPT09ICcnKSB7XG4gICAgICBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzLnBvcCgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gW107XG4gIH1cblxuICBjb25zdCBsYXN0VGFnID0gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICcnLFxuICAgIHNlYXJjaFZhbHVlOiAnIyMgJyxcbiAgICBzdHI6IHByZXZpb3VzQ2hhbmdlbG9nTGluZXNbMF0gPz8gJydcbiAgfSk7XG4gIGNvbnN0IGNvbW1pdFJhbmdlID0gbGFzdFRhZyA/IGAke2xhc3RUYWd9Li5IRUFEYCA6ICdIRUFEJztcbiAgY29uc3QgY29tbWl0TWVzc2FnZXNTdHIgPSBhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCBsb2cgJHtjb21taXRSYW5nZX0gLS1mb3JtYXQ9JUIgLS1maXJzdC1wYXJlbnQgLXpgLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IGNvbW1pdE1lc3NhZ2VzID0gY29tbWl0TWVzc2FnZXNTdHIuc3BsaXQoJ1xcMCcpLmZpbHRlcihCb29sZWFuKS5tYXAodG9GaXJzdExpbmUpO1xuXG4gIGxldCBuZXdDaGFuZ2VMb2cgPSBgIyBDSEFOR0VMT0dcXG5cXG4jIyAke25ld1ZlcnNpb259XFxuXFxuYDtcblxuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgY29tbWl0TWVzc2FnZXMpIHtcbiAgICBuZXdDaGFuZ2VMb2cgKz0gYC0gJHttZXNzYWdlfVxcbmA7XG4gIH1cblxuICBpZiAocHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgbmV3Q2hhbmdlTG9nICs9ICdcXG4nO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzKSB7XG4gICAgICBuZXdDaGFuZ2VMb2cgKz0gYCR7bGluZX1cXG5gO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IHdyaXRlRmlsZShjaGFuZ2Vsb2dQYXRoLCBuZXdDaGFuZ2VMb2csICd1dGYtOCcpO1xuXG4gIGlmICghc2hvdWxkRWRpdENoYW5nZWxvZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvZGVWZXJzaW9uID0gYXdhaXQgZXhlY0Zyb21Sb290KCdjb2RlIC0tdmVyc2lvbicsIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gIH0pO1xuICBjb25zdCB2ZXJzaW9uRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpO1xuICBpZiAoY29kZVZlcnNpb24pIHtcbiAgICB2ZXJzaW9uRGVidWdnZXIoYFBsZWFzZSB1cGRhdGUgdGhlICR7T2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IGZpbGUuIENsb3NlIFZpc3VhbCBTdHVkaW8gQ29kZSB3aGVuIHlvdSBhcmUgZG9uZS4uLmApO1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2NvZGUnLCAnLXcnLCBjaGFuZ2Vsb2dQYXRoXSwge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdmVyc2lvbkRlYnVnZ2VyKCdDb3VsZCBub3QgZmluZCBWaXN1YWwgU3R1ZGlvIENvZGUgaW4geW91ciBQQVRILiBVc2luZyBjb25zb2xlIG1vZGUgaW5zdGVhZC4nKTtcbiAgICBhd2FpdCBjcmVhdGVJbnRlcmZhY2UocHJvY2Vzcy5zdGRpbiwgcHJvY2Vzcy5zdGRvdXQpLnF1ZXN0aW9uKFxuICAgICAgYFBsZWFzZSB1cGRhdGUgdGhlICR7T2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IGZpbGUuIFByZXNzIEVudGVyIHdoZW4geW91IGFyZSBkb25lLi4uYFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIHNlcmllcyBvZiB0YXNrcyB0byBoYW5kbGUgdmVyc2lvbiB1cGRhdGVzOlxuICogMS4gVmFsaWRhdGVzIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogMi4gQ2hlY2tzIGlmIEdpdCBhbmQgR2l0SHViIENMSSBhcmUgaW5zdGFsbGVkLlxuICogMy4gVmVyaWZpZXMgdGhhdCB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgY2xlYW4uXG4gKiA0LiBSdW5zIHNwZWxsY2hlY2sgYW5kIGxpbnRpbmcuXG4gKiA1LiBCdWlsZHMgdGhlIHByb2plY3QuXG4gKiA2LiBVcGRhdGVzIHZlcnNpb24gaW4gZmlsZXMgYW5kIGNoYW5nZWxvZy5cbiAqIDcuIEFkZHMgdXBkYXRlZCBmaWxlcyB0byBHaXQsIHRhZ3MgdGhlIGNvbW1pdCwgYW5kIHB1c2hlcyB0byB0aGUgcmVwb3NpdG9yeS5cbiAqIDguIElmIGFuIE9ic2lkaWFuIHBsdWdpbiwgY29waWVzIHRoZSB1cGRhdGVkIG1hbmlmZXN0IGFuZCBwdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSB0byBwZXJmb3JtIChtYWpvciwgbWlub3IsIHBhdGNoLCBwcmVtYWpvciwgcHJlbWlub3IsIHByZXBhdGNoLCBwcmVyZWxlYXNlLCBvciB4Lnkuelstc3VmZml4XSkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSByZWxlYXNlIGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB2ZXJzaW9uIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGU/OiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZVZlcnNpb25PcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHByZXBhcmVHaXRIdWJSZWxlYXNlLFxuICAgIHNob3VsZEJ1aWxkID0gdHJ1ZSxcbiAgICBzaG91bGRFZGl0Q2hhbmdlbG9nID0gdHJ1ZSxcbiAgICBzaG91bGRSZWxlYXNlID0gdHJ1ZSxcbiAgICBzaG91bGRSdW5DaGVja3MgPSB0cnVlLFxuICAgIHNob3VsZFZlcmlmeUNvbW1pdCA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKCF2ZXJzaW9uVXBkYXRlVHlwZSkge1xuICAgIGNvbnN0IG5wbU9sZFZlcnNpb24gPSBwcm9jZXNzLmVudlsnbnBtX29sZF92ZXJzaW9uJ107XG4gICAgY29uc3QgbnBtTmV3VmVyc2lvbiA9IHByb2Nlc3MuZW52WyducG1fbmV3X3ZlcnNpb24nXTtcblxuICAgIGlmIChucG1PbGRWZXJzaW9uICYmIG5wbU5ld1ZlcnNpb24pIHtcbiAgICAgIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzKG5wbU9sZFZlcnNpb24pO1xuICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbihucG1OZXdWZXJzaW9uLCBvcHRpb25zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHZlcnNpb24gdXBkYXRlIHR5cGUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGNvbnN0IGlzT2JzaWRpYW5QbHVnaW4gPSBleGlzdHNTeW5jKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uIH0pKSAmJiAoYXdhaXQgcmVhZFBhY2thZ2VKc29uKCkpLm5hbWUgIT09ICdvYnNpZGlhbi1kZXYtdXRpbHMnO1xuXG4gIHZhbGlkYXRlKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgYXdhaXQgY2hlY2tHaXRJbnN0YWxsZWQoKTtcbiAgYXdhaXQgY2hlY2tHaXRIdWJDbGlJbnN0YWxsZWQoKTtcblxuICBpZiAoc2hvdWxkUnVuQ2hlY2tzKSB7XG4gICAgYXdhaXQgY2hlY2tHaXRSZXBvQ2xlYW4oKTtcbiAgICBhd2FpdCBucG1SdW4oJ2Zvcm1hdDpjaGVjaycpO1xuICAgIGF3YWl0IG5wbVJ1bignc3BlbGxjaGVjaycpO1xuICAgIGF3YWl0IG5wbVJ1bignbGludDptZCcpO1xuICB9XG5cbiAgLy8gVGhlIGJ1aWxkIGlzIGEgcHJlcmVxdWlzaXRlIGZvciBwdWJsaXNoaW5nLCBub3QgYSB2ZXJpZmljYXRpb24gY2hlY2ssIHNvIGl0IHJ1bnMgdW5sZXNzIGBzaG91bGRCdWlsZGAgaXMgYGZhbHNlYCBcdTIwMTQgdGhpcyBrZWVwcyB0aGUgcmVsZWFzZWQgYXJ0aWZhY3RzIGluIHN5bmMgd2l0aCB0aGUgY3VycmVudCBjb2RlIGV2ZW4gb24gYSBmYXN0IHJlbGVhc2UuXG4gIGlmIChzaG91bGRCdWlsZCkge1xuICAgIGF3YWl0IG5wbVJ1bignYnVpbGQnKTtcbiAgfVxuXG4gIGlmIChzaG91bGRSdW5DaGVja3MpIHtcbiAgICBhd2FpdCBucG1SdW4oJ2xpbnQnKTtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbCgnZmluZC1vdmVyZXhwb3NlZCcpO1xuICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0Jyk7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ3Rlc3Q6aW50ZWdyYXRpb24nKTtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbCgndGVzdDpjb3ZlcmFnZScpO1xuICB9XG5cbiAgY29uc3QgbmV3VmVyc2lvbiA9IGF3YWl0IGdldE5ld1ZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGUpO1xuICBhd2FpdCB1cGRhdGVWZXJzaW9uSW5GaWxlcyhuZXdWZXJzaW9uKTtcbiAgaWYgKGlzT2JzaWRpYW5QbHVnaW4pIHtcbiAgICBhd2FpdCB1cGRhdGVWZXJzaW9uSW5GaWxlc0ZvclBsdWdpbihuZXdWZXJzaW9uKTtcbiAgfVxuXG4gIGF3YWl0IHVwZGF0ZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCB7IHNob3VsZEVkaXRDaGFuZ2Vsb2cgfSk7XG4gIGF3YWl0IGFkZFVwZGF0ZWRGaWxlc1RvR2l0KG5ld1ZlcnNpb24sIHsgc2hvdWxkVmVyaWZ5Q29tbWl0IH0pO1xuICBhd2FpdCBhZGRHaXRUYWcobmV3VmVyc2lvbik7XG5cbiAgaWYgKCFzaG91bGRSZWxlYXNlKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKSgnU2tpcHBpbmcgZ2l0IHB1c2ggYW5kIEdpdEh1YiByZWxlYXNlICgtLW5vLXJlbGVhc2UpLiBUaGUgdmVyc2lvbiBidW1wLCBjaGFuZ2Vsb2csIGNvbW1pdCwgYW5kIHRhZyBoYXZlIGJlZW4gY3JlYXRlZCBsb2NhbGx5LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGdpdFB1c2goKTtcbiAgYXdhaXQgcHJlcGFyZUdpdEh1YlJlbGVhc2U/LihuZXdWZXJzaW9uKTtcbiAgYXdhaXQgcHVibGlzaEdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbiwgaXNPYnNpZGlhblBsdWdpbik7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmVyc2lvbiBpbiB2YXJpb3VzIGZpbGVzLCBpbmNsdWRpbmcgYHBhY2thZ2UuanNvbmAsIGBwYWNrYWdlLWxvY2suanNvbmAsXG4gKiBhbmQgT2JzaWRpYW4gcGx1Z2luIG1hbmlmZXN0cyBpZiBhcHBsaWNhYmxlLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIHN0cmluZyB0byB1cGRhdGUgaW4gdGhlIGZpbGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uSW5GaWxlcyhuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZWRpdFBhY2thZ2VKc29uKChwYWNrYWdlSnNvbikgPT4ge1xuICAgIHBhY2thZ2VKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICB9KTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUxvY2tKc29uKHVwZGF0ZSwgeyBzaG91bGRTa2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xuICBhd2FpdCBlZGl0TnBtU2hyaW5rV3JhcEpzb24odXBkYXRlLCB7IHNob3VsZFNraXBJZk1pc3Npbmc6IHRydWUgfSk7XG5cbiAgZnVuY3Rpb24gdXBkYXRlKHBhY2thZ2VMb2NrSnNvbjogUGFja2FnZUxvY2tKc29uKTogdm9pZCB7XG4gICAgcGFja2FnZUxvY2tKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIGNvbnN0IGRlZmF1bHRQYWNrYWdlID0gcGFja2FnZUxvY2tKc29uLnBhY2thZ2VzPy5bJyddO1xuICAgIGlmIChkZWZhdWx0UGFja2FnZSkge1xuICAgICAgZGVmYXVsdFBhY2thZ2UudmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRvIGVuc3VyZSBpdCBpcyBlaXRoZXIgYSByZWNvZ25pemVkIHR5cGVcbiAqIG9yIGEgdmFsaWQgbWFudWFsIHZlcnNpb24gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRvIHZhbGlkYXRlLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSBpcyBpbnZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGUodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZ2V0VmVyc2lvblVwZGF0ZVR5cGUodmVyc2lvblVwZGF0ZVR5cGUpID09PSBWZXJzaW9uVXBkYXRlVHlwZS5JbnZhbGlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0ludmFsaWQgdmVyc2lvbiB1cGRhdGUgdHlwZS4gUGxlYXNlIHVzZSBcXCdtYWpvclxcJywgXFwnbWlub3JcXCcsIFxcJ3BhdGNoXFwnLCBcXCdwcmVtYWpvclxcJywgXFwncHJlbWlub3JcXCcsIFxcJ3ByZXBhdGNoXFwnLCBcXCdwcmVyZWxlYXNlXFwnLCBvciBcXCd4Lnkuelstc3VmZml4XVxcJyBmb3JtYXQuJ1xuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBGZXRjaGVzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBPYnNpZGlhbiBmcm9tIHRoZSBHaXRIdWIgcmVsZWFzZXMgQVBJLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE9ic2lkaWFuLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RPYnNpZGlhblZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyAtLSBXZSBydW4gdGhpcyBvdXRzaWRlIG9mIE9ic2lkaWFuLCBzbyB3ZSBkb24ndCBoYXZlIGByZXF1ZXN0VXJsKClgLlxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL29ic2lkaWFubWQvb2JzaWRpYW4tcmVsZWFzZXMvcmVsZWFzZXMvbGF0ZXN0Jyk7XG4gIGNvbnN0IG9ic2lkaWFuUmVsZWFzZXNKc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIFBhcnRpYWw8T2JzaWRpYW5SZWxlYXNlc0pzb24+O1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUob2JzaWRpYW5SZWxlYXNlc0pzb24ubmFtZSwgJ0NvdWxkIG5vdCBmaW5kIHRoZSBuYW1lIG9mIHRoZSBsYXRlc3QgT2JzaWRpYW4gcmVsZWFzZScpO1xufVxuXG5mdW5jdGlvbiBpc1ByZVJlbGVhc2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcmVyZWxlYXNlKHZlcnNpb24pICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB0b0ZpcnN0TGluZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdHIuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoQm9vbGVhbikuc2xpY2UoMCwgMSkuam9pbignJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb25JbkZpbGVzRm9yUGx1Z2luKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtYW5pZmVzdEJldGFKc29uUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RCZXRhSnNvbiB9KTtcbiAgaWYgKGlzUHJlUmVsZWFzZShuZXdWZXJzaW9uKSkge1xuICAgIGF3YWl0IGNwKFxuICAgICAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSksXG4gICAgICBtYW5pZmVzdEJldGFKc29uUGF0aCxcbiAgICAgIHsgZm9yY2U6IHRydWUgfVxuICAgICk7XG4gICAgYXdhaXQgZWRpdEpzb248TWFuaWZlc3Q+KHtcbiAgICAgIGVkaXRGbjogKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIG1hbmlmZXN0LnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0QmV0YUpzb25cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsYXRlc3RPYnNpZGlhblZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RPYnNpZGlhblZlcnNpb24oKTtcblxuICAgIGF3YWl0IGVkaXRKc29uPE1hbmlmZXN0Pih7XG4gICAgICBlZGl0Rm46IChtYW5pZmVzdCkgPT4ge1xuICAgICAgICBtYW5pZmVzdC5taW5BcHBWZXJzaW9uID0gbGF0ZXN0T2JzaWRpYW5WZXJzaW9uO1xuICAgICAgICBtYW5pZmVzdC52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICAgIH0sXG4gICAgICBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb25cbiAgICB9KTtcblxuICAgIGF3YWl0IGVkaXRKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHtcbiAgICAgIGVkaXRGbjogKHZlcnNpb25zKSA9PiB7XG4gICAgICAgIHZlcnNpb25zW25ld1ZlcnNpb25dID0gbGF0ZXN0T2JzaWRpYW5WZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlZlcnNpb25zSnNvblxuICAgIH0pO1xuXG4gICAgaWYgKGV4aXN0c1N5bmMobWFuaWZlc3RCZXRhSnNvblBhdGgpKSB7XG4gICAgICBhd2FpdCBybShtYW5pZmVzdEJldGFKc29uUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgY29weVVwZGF0ZWRNYW5pZmVzdCgpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQSxxQkFBMkI7QUFDM0Isc0JBS087QUFDUCxJQUFBQSxtQkFBZ0M7QUFDaEMsdUJBQTBCO0FBQzFCLG9CQUdPO0FBSVAsbUJBQStCO0FBQy9CLG1CQUE4QjtBQUM5Qix3Q0FBd0M7QUFDeEMsa0JBQXFCO0FBQ3JCLG9CQUEyQjtBQUMzQix5QkFHTztBQUNQLGdCQUE2QjtBQUM3QixrQkFBeUI7QUFDekIscUJBR087QUFDUCxpQkFLTztBQUNQLDJDQUEwQztBQUMxQyxrQkFHTztBQTJHUCxNQUFNLGdCQUFnQjtBQU9mLElBQUssb0JBQUwsa0JBQUtDLHVCQUFMO0FBQ0wsRUFBQUEsbUJBQUEsYUFBVTtBQUNWLEVBQUFBLG1CQUFBLFdBQVE7QUFDUixFQUFBQSxtQkFBQSxZQUFTO0FBQ1QsRUFBQUEsbUJBQUEsV0FBUTtBQUNSLEVBQUFBLG1CQUFBLFdBQVE7QUFDUixFQUFBQSxtQkFBQSxjQUFXO0FBQ1gsRUFBQUEsbUJBQUEsY0FBVztBQUNYLEVBQUFBLG1CQUFBLGNBQVc7QUFDWCxFQUFBQSxtQkFBQSxnQkFB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
@@ -342,7 +342,7 @@ async function runWithTimeout(params) {
342
342
  const runWithTimeoutDebugger = getLibDebugger("Async:runWithTimeout");
343
343
  const onTimeout = params.onTimeout ?? defaultOnTimeout;
344
344
  await Promise.race([run(), innerTimeout()]);
345
- if (hasResult) {
345
+ if (hasResult && !runAbortController.signal.aborted) {
346
346
  return result;
347
347
  }
348
348
  throw new CustomStackTraceError({
@@ -482,4 +482,4 @@ export {
482
482
  toArray,
483
483
  waitForAllAsyncOperations
484
484
  };
485
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgR2VuZXJpY0FzeW5jRnVuY3Rpb24sXG4gIEdlbmVyaWNGdW5jdGlvbixcbiAgR2VuZXJpY1ZvaWRGdW5jdGlvblxufSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcblxuaW1wb3J0IHtcbiAgYWJvcnRTaWduYWxBbnksXG4gIGFib3J0U2lnbmFsTmV2ZXIsXG4gIGFib3J0U2lnbmFsVGltZW91dCxcbiAgd2FpdEZvckFib3J0XG59IGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5pbXBvcnQge1xuICBnZXRMaWJEZWJ1Z2dlcixcbiAgcHJpbnRXaXRoU3RhY2tUcmFjZVxufSBmcm9tICcuL2RlYnVnLnRzJztcbmltcG9ydCB7IENhbGxiYWNrRGlzcG9zYWJsZSB9IGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQge1xuICBBU1lOQ19XUkFQUEVSX0VSUk9SX01FU1NBR0UsXG4gIEN1c3RvbVN0YWNrVHJhY2VFcnJvcixcbiAgZW1pdEFzeW5jRXJyb3JFdmVudCxcbiAgZ2V0U3RhY2tUcmFjZSxcbiAgcHJpbnRFcnJvcixcbiAgU2lsZW50RXJyb3Jcbn0gZnJvbSAnLi9lcnJvci50cyc7XG5pbXBvcnQge1xuICBub29wLFxuICBub29wQXN5bmNcbn0gZnJvbSAnLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGFzc2VydE5vbk51bGxhYmxlXG59IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuXG4vKipcbiAqIEEgdHlwZSByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHJvbWlzZVJlc29sdmU8VD4gPSB1bmRlZmluZWQgZXh0ZW5kcyBUID8gKHZhbHVlPzogUHJvbWlzZUxpa2U8VD4gfCBUKSA9PiB2b2lkXG4gIDogKHZhbHVlOiBQcm9taXNlTGlrZTxUPiB8IFQpID0+IHZvaWQ7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJldHJ5V2l0aFRpbWVvdXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGFib3J0IHNpZ25hbCB0byBjYW5jZWwgdGhlIHJldHJ5IG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIEEgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcmV0cnkgYXR0ZW1wdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDBgXG4gICAqL1xuICByZWFkb25seSByZXRyeURlbGF5SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmV0cnkgdGhlIGZ1bmN0aW9uIG9uIGVycm9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXRyeU9uRXJyb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIG9uIHJldHJ5aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTAwMGBcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBZGRzIGFuIGVycm9yIGhhbmRsZXIgdG8gYSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBjYXRjaGVzIGFueSBlcnJvcnMgYW5kIGVtaXRzIGFuIGFzeW5jIGVycm9yIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBhc3luY0ZuIC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhZGQgYW4gZXJyb3IgaGFuZGxlciB0by5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjb21wbGV0ZXMgb3IgZW1pdHMgYXN5bmMgZXJyb3IgZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRFcnJvckhhbmRsZXIoYXN5bmNGbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICB0cnkge1xuICAgIGF3YWl0IGFzeW5jRm4oKTtcbiAgfSBjYXRjaCAoYXN5bmNFcnJvcikge1xuICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBDdXN0b21TdGFja1RyYWNlRXJyb3Ioe1xuICAgICAgY2F1c2U6IGFzeW5jRXJyb3IsXG4gICAgICBtZXNzYWdlOiBBU1lOQ19XUkFQUEVSX0VSUk9SX01FU1NBR0UsXG4gICAgICBzdGFja1RyYWNlXG4gICAgfSk7XG4gICAgaWYgKGhhbmRsZVNpbGVudEVycm9yKHdyYXBwZWRFcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW1pdEFzeW5jRXJyb3JFdmVudCh3cmFwcGVkRXJyb3IpO1xuICB9XG59XG5cbi8qKlxuICogRmlsdGVycyBhbiBhcnJheSBhc3luY2hyb25vdXNseSwga2VlcGluZyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByb3ZpZGVkIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyIC0gVGhlIGFycmF5IHRvIGZpbHRlci5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgLSBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaWx0ZXI8VD4oYXJyOiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPGJvb2xlYW4+KTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgYW5zOiBUW10gPSBbXTtcblxuICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGFyciwgaSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW0gPSBhcnJbaV0gYXMgVDtcbiAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0sIGksIGFycikpIHtcbiAgICAgIGFucy5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbnM7XG59XG5cbi8qKlxuICogRmlsdGVycyBhbiBhcnJheSBhc3luY2hyb25vdXNseSBpbiBwbGFjZSwga2VlcGluZyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByb3ZpZGVkIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyIC0gVGhlIGFycmF5IHRvIGZpbHRlci5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgLSBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhcnJheSBpcyBmaWx0ZXJlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmlsdGVySW5QbGFjZTxUPihhcnI6IFRbXSwgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2FibGU8Ym9vbGVhbj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgbGV0IHdyaXRlSW5kZXggPSAwO1xuICBmb3IgKGxldCByZWFkSW5kZXggPSAwOyByZWFkSW5kZXggPCBsZW5ndGg7IHJlYWRJbmRleCsrKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGFyciwgcmVhZEluZGV4KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IGFycltyZWFkSW5kZXhdIGFzIFQ7XG4gICAgaWYgKGF3YWl0IHByZWRpY2F0ZShjdXJyZW50LCByZWFkSW5kZXgsIGFycikpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFllcywgaXQgaXMgYSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24sIGJ1dCBJIGRvbid0IGFuIGVsZWdhbnQgd2F5IHRvIGZpeCBpdC5cbiAgICAgIGFyclt3cml0ZUluZGV4KytdID0gY3VycmVudDtcbiAgICB9XG4gIH1cbiAgYXJyLmxlbmd0aCA9IHdyaXRlSW5kZXg7XG59XG5cbi8qKlxuICogTWFwcyBvdmVyIGFuIGFycmF5IGFzeW5jaHJvbm91c2x5LCBhcHBseWluZyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZWFjaCBlbGVtZW50LCBhbmQgdGhlbiBmbGF0dGVucyB0aGUgcmVzdWx0cyBpbnRvIGEgc2luZ2xlIGFycmF5LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheS5cbiAqIEB0eXBlUGFyYW0gVSAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBvdXRwdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyIC0gVGhlIGFycmF5IHRvIG1hcCBvdmVyIGFuZCBmbGF0dGVuLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhIGZsYXR0ZW5lZCBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY0ZsYXRNYXA8VCwgVT4oYXJyOiBUW10sIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2FibGU8VVtdPik6IFByb21pc2U8VVtdPiB7XG4gIHJldHVybiAoYXdhaXQgYXN5bmNNYXAoYXJyLCBjYWxsYmFjaykpLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBNYXBzIG92ZXIgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGFwcGx5aW5nIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHR5cGVQYXJhbSBVIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBhcnJheS5cbiAqIEBwYXJhbSBhcnIgLSBUaGUgYXJyYXkgdG8gbWFwIG92ZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jTWFwPFQsIFU+KGFycjogVFtdLCBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPFU+KTogUHJvbWlzZTxVW10+IHtcbiAgcmV0dXJuIGF3YWl0IHByb21pc2VBbGxTZXF1ZW50aWFsbHkoYXJyLm1hcChjYWxsYmFjaykpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhIHN5bmNocm9ub3VzIG9uZSBieSBhdXRvbWF0aWNhbGx5IGhhbmRsaW5nIHRoZSBQcm9taXNlIHJlamVjdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAqIEBwYXJhbSBhc3luY0Z1bmMgLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gaW4gYSBzeW5jaHJvbm91cyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0QXN5bmNUb1N5bmM8QXJncyBleHRlbmRzIHVua25vd25bXT4oYXN5bmNGdW5jOiBHZW5lcmljQXN5bmNGdW5jdGlvbjxBcmdzPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IEdlbmVyaWNWb2lkRnVuY3Rpb248QXJncz4ge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICByZXR1cm4gKC4uLmFyZ3M6IEFyZ3MpOiB2b2lkID0+IHtcbiAgICBhc3NlcnROb25OdWxsYWJsZShzdGFja1RyYWNlKTtcbiAgICBjb25zdCBpbm5lclN0YWNrVHJhY2UgPSBnZXRTdGFja1RyYWNlKDEpO1xuICAgIHN0YWNrVHJhY2UgPSBgJHtzdGFja1RyYWNlfVxcbiAgICBhdCAtLS0gY29udmVydEFzeW5jVG9TeW5jIC0tLSAoMClcXG4ke2lubmVyU3RhY2tUcmFjZX1gO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IGFzeW5jRnVuYyguLi5hcmdzKSwgc3RhY2tUcmFjZSk7XG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhbiBhc3luY2hyb25vdXMgb25lIGJ5IHdyYXBwaW5nIGl0IGluIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHR5cGVQYXJhbSBSZXN1bHQgLSBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuXG4gKiBAcGFyYW0gc3luY0ZuIC0gVGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIGluIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U3luY1RvQXN5bmM8QXJncyBleHRlbmRzIHVua25vd25bXSwgUmVzdWx0PihzeW5jRm46IEdlbmVyaWNGdW5jdGlvbjxBcmdzLCBSZXN1bHQ+KTogR2VuZXJpY0FzeW5jRnVuY3Rpb248QXJncywgUmVzdWx0PiB7XG4gIHJldHVybiBhc3luYyAoLi4uYXJnczogQXJncyk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gICAgcmV0dXJuIHN5bmNGbiguLi5hcmdzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGEgc2lsZW50IGVycm9yLlxuICpcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBoYW5kbGUuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBlcnJvciBpcyBhIHNpbGVudCBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVNpbGVudEVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGxldCBjYXVzZSA9IGVycm9yO1xuICB3aGlsZSAoIShjYXVzZSBpbnN0YW5jZW9mIFNpbGVudEVycm9yKSkge1xuICAgIGlmICghKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY2F1c2UgPSBjYXVzZS5jYXVzZTtcbiAgfVxuXG4gIGdldExpYkRlYnVnZ2VyKCdBc3luYzpoYW5kbGVTaWxlbnRFcnJvcicpKGVycm9yKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogSWdub3JlcyBhbiBlcnJvciB0aGF0IGlzIHRocm93biBieSBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0byBpZ25vcmUgdGhlIGVycm9yIG9mLlxuICogQHBhcmFtIGZhbGxiYWNrVmFsdWUgLSBBbHdheXMgYHVuZGVmaW5lZGAuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjb21wbGV0ZXMgb3IgZmFpbHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcihwcm9taXNlOiBQcm9taXNlPHVua25vd24+LCBmYWxsYmFja1ZhbHVlPzogdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPjtcbi8qKlxuICogSW52b2tlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHRoZSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBmYWxsYmFja1ZhbHVlOiBUKTogUHJvbWlzZTxUPjtcbi8qKlxuICogSWdub3JlcyBhbiBlcnJvciB0aGF0IGlzIHRocm93biBieSBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHRoZSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBmYWxsYmFja1ZhbHVlPzogVCk6IFByb21pc2U8VCB8IHZvaWQ+IHtcbiAgY29uc3QgaWdub3JlRXJyb3JEZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzppZ25vcmVFcnJvcicpO1xuICBjb25zdCBzdGFja1RyYWNlID0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlnbm9yZUVycm9yRGVidWdnZXIoXG4gICAgICAnSWdub3JlZCBlcnJvcicsXG4gICAgICBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKHtcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICAgIG1lc3NhZ2U6ICdJZ25vcmVkIGVycm9yJyxcbiAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBmYWxsYmFja1ZhbHVlO1xuICB9XG59XG5cbmNvbnN0IHBlbmRpbmdBc3luY09wZXJhdGlvbnMgPSBuZXcgU2V0PFByb21pc2U8dm9pZD4+KCk7XG5sZXQgaXNBc3luY09wZXJhdGlvblRyYWNraW5nRW5hYmxlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbnZva2VBc3luY1NhZmVseUFmdGVyRGVsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgKlxuICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIGFzeW5jRm4odGhpczogdm9pZCwgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDBgXG4gICAqL1xuICByZWFkb25seSBkZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrVHJhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGlzYWJsZXMgdHJhY2tpbmcgcHJldmlvdXNseSBlbmFibGVkIHZpYSB7QGxpbmsgZW5hYmxlQXN5bmNPcGVyYXRpb25UcmFja2luZ30gYW5kIGZvcmdldHMgYW55IGN1cnJlbnRseS10cmFja2VkIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNhYmxlQXN5bmNPcGVyYXRpb25UcmFja2luZygpOiB2b2lkIHtcbiAgaXNBc3luY09wZXJhdGlvblRyYWNraW5nRW5hYmxlZCA9IGZhbHNlO1xuICBwZW5kaW5nQXN5bmNPcGVyYXRpb25zLmNsZWFyKCk7XG59XG5cbi8qKlxuICogRW5hYmxlcyB0cmFja2luZyBvZiBmaXJlLWFuZC1mb3JnZXQgb3BlcmF0aW9ucyBzY2hlZHVsZWQgdmlhIHtAbGluayBpbnZva2VBc3luY1NhZmVseX0gKGFuZCB0aGVyZWZvcmUge0BsaW5rIGNvbnZlcnRBc3luY1RvU3luY30pLlxuICpcbiAqIFdoaWxlIGVuYWJsZWQsIGVhY2ggc2NoZWR1bGVkIG9wZXJhdGlvbiBpcyByZWNvcmRlZCB1bnRpbCBpdCBzZXR0bGVzIHNvIHRoYXQgdGVzdHMgY2FuIGF3YWl0IHRoZW0gYWxsIHZpYSB7QGxpbmsgd2FpdEZvckFsbEFzeW5jT3BlcmF0aW9uc30sIHJlbW92aW5nIHRoZSBuZWVkIHRvIG92ZXJyaWRlIHtAbGluayBpbnZva2VBc3luY1NhZmVseX0gLyB7QGxpbmsgY29udmVydEFzeW5jVG9TeW5jfSBpbiB0ZXN0cy5cbiAqXG4gKiBUcmFja2luZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBzbyBwcm9kdWN0aW9uIGNvZGUgY2FycmllcyBubyBib29ra2VlcGluZyBvdmVyaGVhZC4gSW50ZW5kZWQgdG8gYmUgZW5hYmxlZCBpbiB0ZXN0IGVudmlyb25tZW50cyBvbmx5LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgZGlzYWJsZXMgdHJhY2tpbmcgYWdhaW4gKHZpYSB7QGxpbmsgZGlzYWJsZUFzeW5jT3BlcmF0aW9uVHJhY2tpbmd9KSB3aGVuIGRpc3Bvc2VkLCBmb3IgdXNlIHdpdGggYHVzaW5nYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZUFzeW5jT3BlcmF0aW9uVHJhY2tpbmcoKTogRGlzcG9zYWJsZSB7XG4gIGlzQXN5bmNPcGVyYXRpb25UcmFja2luZ0VuYWJsZWQgPSB0cnVlO1xuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6IGRpc2FibGVBc3luY09wZXJhdGlvblRyYWNraW5nXG4gIH0pO1xufVxuXG4vKipcbiAqIEludm9rZXMgYSB7QGxpbmsgUHJvbWlzZX0gYW5kIHNhZmVseSBoYW5kbGVzIGFueSBlcnJvcnMgYnkgY2F0Y2hpbmcgdGhlbSBhbmQgZW1pdHRpbmcgYW4gYXN5bmMgZXJyb3IgZXZlbnQuXG4gKlxuICogQHBhcmFtIGFzeW5jRm4gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGludm9rZSBzYWZlbHkuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlQXN5bmNTYWZlbHkoYXN5bmNGbjogKCkgPT4gUHJvbWlzYWJsZTx1bmtub3duPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IHZvaWQge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuXG4gIGxldCByZXN1bHQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gYXN5bmNGbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9ycyAtLSBSZS1yZWplY3RpbmcgdGhlIG9yaWdpbmFsIGNhdWdodCBlcnJvciBhcy1pcy5cbiAgICB0cmFja0FzeW5jT3BlcmF0aW9uKGFkZEVycm9ySGFuZGxlcigoKSA9PiBQcm9taXNlLnJlamVjdChlcnJvciksIHN0YWNrVHJhY2UpKTtcbiAgfVxuICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgIHRyYWNrQXN5bmNPcGVyYXRpb24oYWRkRXJyb3JIYW5kbGVyKCgpID0+IHJlc3VsdCwgc3RhY2tUcmFjZSkpO1xuICB9XG59XG5cbi8qKlxuICogSW52b2tlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYWZ0ZXIgYSBkZWxheS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheShwYXJhbXM6IEludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheVBhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7XG4gICAgYXN5bmNGbixcbiAgICBkZWxheUluTWlsbGlzZWNvbmRzID0gMFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBhYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbCA/PyBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGNvbnN0IHN0YWNrVHJhY2UgPSBwYXJhbXMuc3RhY2tUcmFjZSA/PyBnZXRTdGFja1RyYWNlKDEpO1xuICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgc2xlZXAoeyBhYm9ydFNpZ25hbCwgbWlsbGlzZWNvbmRzOiBkZWxheUluTWlsbGlzZWNvbmRzLCBzaG91bGRUaHJvd09uQWJvcnQ6IHRydWUgfSk7XG4gICAgYXdhaXQgYXN5bmNGbihhYm9ydFNpZ25hbCk7XG4gIH0sIHN0YWNrVHJhY2UpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGFzeW5jIGZ1bmN0aW9ucyBzZXF1ZW50aWFsbHkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIGFzeW5jRm5zIC0gVGhlIGFzeW5jIGZ1bmN0aW9ucyB0byBleGVjdXRlIHNlcXVlbnRpYWxseS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgYXN5bmMgZnVuY3Rpb25zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvbWlzZUFsbEFzeW5jRm5zU2VxdWVudGlhbGx5PFQ+KGFzeW5jRm5zOiAoKCkgPT4gUHJvbWlzYWJsZTxUPilbXSk6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IHJlc3VsdHM6IFRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGFzeW5jRm4gb2YgYXN5bmNGbnMpIHtcbiAgICByZXN1bHRzLnB1c2goYXdhaXQgYXN5bmNGbigpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBwcm9taXNlcyBzZXF1ZW50aWFsbHkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIHByb21pc2VzIC0gVGhlIHByb21pc2VzIHRvIGV4ZWN1dGUgc2VxdWVudGlhbGx5LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBwcm9taXNlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb21pc2VBbGxTZXF1ZW50aWFsbHk8VD4ocHJvbWlzZXM6IFByb21pc2FibGU8VD5bXSk6IFByb21pc2U8VFtdPiB7XG4gIHJldHVybiBhd2FpdCBwcm9taXNlQWxsQXN5bmNGbnNTZXF1ZW50aWFsbHkocHJvbWlzZXMubWFwKChwcm9taXNlKSA9PiAoKSA9PiBwcm9taXNlKSk7XG59XG5cbi8qKlxuICogV2FpdHMgZm9yIGFsbCBmaXJlLWFuZC1mb3JnZXQgb3BlcmF0aW9ucyB0cmFja2VkIHNpbmNlIHtAbGluayBlbmFibGVBc3luY09wZXJhdGlvblRyYWNraW5nfSB3YXMgY2FsbGVkIHRvIHNldHRsZS5cbiAqXG4gKiBPcGVyYXRpb25zIHNjaGVkdWxlZCB3aGlsZSBhd2FpdGluZyBhcmUgYWxzbyBhd2FpdGVkLCBzbyBjYXNjYWRpbmcgZmlyZS1hbmQtZm9yZ2V0IGNoYWlucyBhcmUgZnVsbHkgZHJhaW5lZC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2Ugbm8gdHJhY2tlZCBvcGVyYXRpb25zIHJlbWFpbiBwZW5kaW5nLlxuICogQHRocm93cyBJZiB0cmFja2luZyBpcyBub3QgZW5hYmxlZC4gT3RoZXJ3aXNlIHRoaXMgd291bGQgc2lsZW50bHkgcmVzb2x2ZSBhcyBpZiBhbGwgb3BlcmF0aW9ucyB3ZXJlIGZpbmlzaGVkLCBtYXNraW5nIGEgbWlzc2luZyB7QGxpbmsgZW5hYmxlQXN5bmNPcGVyYXRpb25UcmFja2luZ30gY2FsbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBbGxBc3luY09wZXJhdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNBc3luY09wZXJhdGlvblRyYWNraW5nRW5hYmxlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQXN5bmMgb3BlcmF0aW9uIHRyYWNraW5nIGlzIG5vdCBlbmFibGVkLiBDYWxsIGVuYWJsZUFzeW5jT3BlcmF0aW9uVHJhY2tpbmcoKSBiZWZvcmUgd2FpdEZvckFsbEFzeW5jT3BlcmF0aW9ucygpLicpO1xuICB9XG5cbiAgd2hpbGUgKHBlbmRpbmdBc3luY09wZXJhdGlvbnMuc2l6ZSA+IDApIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoWy4uLnBlbmRpbmdBc3luY09wZXJhdGlvbnNdKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFja0FzeW5jT3BlcmF0aW9uKG9wZXJhdGlvbjogUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICBpZiAoIWlzQXN5bmNPcGVyYXRpb25UcmFja2luZ0VuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwZW5kaW5nQXN5bmNPcGVyYXRpb25zLmFkZChvcGVyYXRpb24pO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdm9pZCAtLSBGaXJlLWFuZC1mb3JnZXQgY2xlYW51cCBvZiB0aGUgc2V0dGxlZCBvcGVyYXRpb24uXG4gIHZvaWQgb3BlcmF0aW9uLmZpbmFsbHkoKCkgPT4ge1xuICAgIHBlbmRpbmdBc3luY09wZXJhdGlvbnMuZGVsZXRlKG9wZXJhdGlvbik7XG4gIH0pO1xufVxuXG5jb25zdCB0ZXJtaW5hdGVSZXRyeUVycm9ycyA9IG5ldyBXZWFrU2V0PEVycm9yPigpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayByZXRyeVdpdGhUaW1lb3V0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeVdpdGhUaW1lb3V0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHRpbWVvdXQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHRpbWVvdXQgY29udGV4dC5cbiAgICovXG4gIG9uVGltZW91dD8odGhpczogdm9pZCwgY29udGV4dDogVGltZW91dENvbnRleHQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAgICpcbiAgICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgb3BlcmF0aW9uRm4odGhpczogdm9pZCwgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzYWJsZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJldHJ5IG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSByZXRyeU9wdGlvbnM/OiBSZXRyeU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tUcmFjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcnVuV2l0aFRpbWVvdXR9LlxuICpcbiAqIEB0eXBlUGFyYW0gUmVzdWx0IC0gVGhlIHR5cGUgb2YgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bldpdGhUaW1lb3V0UGFyYW1zPFJlc3VsdD4ge1xuICAvKipcbiAgICogVGhlIGNvbnRleHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dD86IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHRpbWVvdXQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHRpbWVvdXQgY29udGV4dC5cbiAgICovXG4gIG9uVGltZW91dD8odGhpczogdm9pZCwgY29udGV4dDogVGltZW91dENvbnRleHQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gICAqXG4gICAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIFRoZSBhYm9ydCBzaWduYWwgdG8gbGlzdGVuIHRvLlxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIG9wZXJhdGlvbkZuKHRoaXM6IHZvaWQsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2FibGU8UmVzdWx0PjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBzdGFja1RyYWNlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNsZWVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGVlcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGFib3J0IHNpZ25hbCBpcyBhYm9ydGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd09uQWJvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnRleHQgcHJvdmlkZWQgdG8gdGhlIHRpbWVvdXQgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lb3V0Q29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBvcGVyYXRpb24gc3RhcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uOiBudW1iZXI7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAqL1xuICBvbk9wZXJhdGlvbkNvbXBsZXRlZChjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGVybWluYXRlcyB0aGUgb3BlcmF0aW9uIHRoYXQgdGltZWQgb3V0LlxuICAgKi9cbiAgdGVybWluYXRlT3BlcmF0aW9uKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRpbWVvdXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVvdXRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSBhYm9ydCBzaWduYWwgaXMgYWJvcnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkFib3J0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRpbWVvdXQgcGVyaW9kIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIENoYWlucyBhIHByb21pc2Ugd2l0aCBhbm90aGVyIHByb21pc2UuXG4gKlxuICogQHBhcmFtIGNoYWluUHJvbWlzZSAtIFJlcHJlc2VudHMgdGhlIGNoYWluZWQgcHJvbWlzZS5cbiAqIEBwYXJhbSBwcm9taXNhYmxlRm4gLSBUaGUgZnVuY3Rpb24gdG8gY2hhaW4uXG4gKiBAcmV0dXJucyBDaGFpbmVkIHByb21pc2Ugb3IgYG51bGxgIGlmIG5vIGFzeW5jIGxvZ2ljIGlzIGNoYWluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbihjaGFpblByb21pc2U6IG51bGwgfCBQcm9taXNlPHZvaWQ+LCBwcm9taXNhYmxlRm46ICgpID0+IG51bGwgfCBQcm9taXNhYmxlPHZvaWQ+KTogbnVsbCB8IFByb21pc2U8dm9pZD4ge1xuICBsZXQgbmV4dENoYWluUHJvbWlzZSA9IGNoYWluUHJvbWlzZTtcbiAgaWYgKGNoYWluUHJvbWlzZSkge1xuICAgIG5leHRDaGFpblByb21pc2UgPSBjaGFpblByb21pc2UudGhlbigoKSA9PiBwcm9taXNhYmxlRm4oKSA/PyB1bmRlZmluZWQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByb21pc2FibGUgPSBwcm9taXNhYmxlRm4oKTtcbiAgICBpZiAocHJvbWlzYWJsZSkge1xuICAgICAgbmV4dENoYWluUHJvbWlzZSA9IHByb21pc2FibGUgaW5zdGFuY2VvZiBQcm9taXNlID8gcHJvbWlzYWJsZSBhcyBQcm9taXNlPHZvaWQ+IDogUHJvbWlzZS5yZXNvbHZlKHByb21pc2FibGUpO1xuICAgIH1cbiAgfVxuXG4gIG5leHRDaGFpblByb21pc2U/LmNhdGNoKG5vb3ApO1xuICByZXR1cm4gbmV4dENoYWluUHJvbWlzZTtcbn1cblxuLyoqXG4gKiBNYXJrcyBhbiBlcnJvciB0byB0ZXJtaW5hdGUgcmV0cnkgbG9naWMuXG4gKlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIG1hcmsgdG8gdGVybWluYXRlIHJldHJ5IGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya3NBc1Rlcm1pbmF0ZVJldHJ5KGVycm9yOiBFcnJvcik6IHZvaWQge1xuICB0ZXJtaW5hdGVSZXRyeUVycm9ycy5hZGQoZXJyb3IpO1xufVxuXG4vKipcbiAqIEFuIGFzeW5jIGZ1bmN0aW9uIHRoYXQgbmV2ZXIgZW5kcy5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IG5ldmVyIHJlc29sdmVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV2ZXJFbmRzKCk6IFByb21pc2U8bmV2ZXI+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKCkgPT4ge1xuICAgIG5vb3AoKTtcbiAgfSk7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFeGhhdXN0aXZlIHN3aXRjaCBndWFyZDsgdGhlIGF3YWl0IGFib3ZlIG5ldmVyIHJlc29sdmVzLiAqL1xuICBhc3NlcnQoZmFsc2UsICdTaG91bGQgbmV2ZXIgaGFwcGVuJyk7XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCB0aWNrLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgdGljayBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuZXh0VGlja0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgdG8gbmF0aXZlIHByb21pc2FibGUsIGNvbnZlcnRpbmcge0BsaW5rIFByb21pc2VMaWtlfSAoYWthIFRoZW5hYmxlKSB0byBhIG5hdGl2ZSB7QGxpbmsgUHJvbWlzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIHByb21pc2FibGUgLSBUaGUgcHJvbWlzYWJsZSB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgdmFsdWUgaXRzZWxmIG9yIGEgbmF0aXZlIHtAbGluayBQcm9taXNlfSBpZiB0aGUgdmFsdWUgaXMgYSB7QGxpbmsgUHJvbWlzZUxpa2V9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUHJvbWlzYWJsZTxUPihwcm9taXNhYmxlOiBQcm9taXNhYmxlPFQ+KTogUHJvbWlzZTxUPiB8IFQge1xuICBpZiAoIXByb21pc2FibGUpIHtcbiAgICByZXR1cm4gcHJvbWlzYWJsZTtcbiAgfVxuXG4gIGlmIChwcm9taXNhYmxlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgIHJldHVybiBwcm9taXNhYmxlIGFzIFByb21pc2U8VD47XG4gIH1cblxuICBpZiAoKHByb21pc2FibGUgYXMgUGFydGlhbDxQcm9taXNlTGlrZTxUPj4pLnRoZW4pIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb21pc2FibGUpO1xuICB9XG5cbiAgcmV0dXJuIHByb21pc2FibGUgYXMgVDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHF1ZXVlIG1pY3JvdGFzay5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IHF1ZXVlIG1pY3JvdGFzayBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBxdWV1ZU1pY3JvdGFza0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgcmVxdWVzdCBhbmltYXRpb24gZnJhbWUuXG4gKlxuICogQHBhcmFtIGZhbGxiYWNrVGltZW91dEluTWlsbGlzZWNvbmRzIC0gVGhlIGZhbGxiYWNrIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHJlc29sdmUgdGhlIHByb21pc2UgaWYgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgZG9lcyBub3QgZmlyZSAoZS5nLiB0aGUgd2luZG93IGlzIG5vdCBhY3RpdmUpLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gYDEwMGAgbWlsbGlzZWNvbmRzLiBVc2UgYDBgIHRvIGRpc2FibGUgdGhlIGZhbGxiYWNrLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCByZXF1ZXN0IGFuaW1hdGlvbiBmcmFtZSBpcyBhdmFpbGFibGUgKG9yIHdoZW4gdGhlIGZhbGxiYWNrIHRpbWUgaXMgcmVhY2hlZCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWVBc3luYyhmYWxsYmFja1RpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXF1ZXN0QW5pbWF0aW9uRnJhbWVBc3luY1Byb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBERUZBVUxUX0ZBTExCQUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTAwO1xuICBmYWxsYmFja1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA/Pz0gREVGQVVMVF9GQUxMQkFDS19USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtyZXF1ZXN0QW5pbWF0aW9uRnJhbWVBc3luY1Byb21pc2UsIGZhbGxiYWNrVGltZW91dEluTWlsbGlzZWNvbmRzID4gMCA/IHNsZWVwKHsgbWlsbGlzZWNvbmRzOiBmYWxsYmFja1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSA6IG5ldmVyRW5kcygpXSk7XG59XG5cbi8qKlxuICogUmV0cmllcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdW50aWwgaXQgcmV0dXJucyBgdHJ1ZWAgb3IgdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgb3IgcmVqZWN0cyB3aGVuIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXRyeVdpdGhUaW1lb3V0KHBhcmFtczogUmV0cnlXaXRoVGltZW91dFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXRyeVdpdGhUaW1lb3V0RGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6cmV0cnlXaXRoVGltZW91dCcpO1xuICBjb25zdCBzdGFja1RyYWNlID0gcGFyYW1zLnN0YWNrVHJhY2UgPz8gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgY29uc3QgREVGQVVMVF9SRVRSWV9PUFRJT05TID0ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzIC0tIEV4dHJhY3RpbmcgbWFnaWMgbnVtYmVyIGFzIGEgY29uc3RhbnQgd291bGQgYmUgcmVwZXRpdGl2ZSwgYXMgdGhlIHZhbHVlIGlzIHVzZWQgb25seSBvbmNlIGFuZCBpdHMgbmFtZSB3b3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJvcGVydHkuXG4gICAgcmV0cnlEZWxheUluTWlsbGlzZWNvbmRzOiAxMDAsXG4gICAgc2hvdWxkUmV0cnlPbkVycm9yOiBmYWxzZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBFeHRyYWN0aW5nIG1hZ2ljIG51bWJlciBhcyBhIGNvbnN0YW50IHdvdWxkIGJlIHJlcGV0aXRpdmUsIGFzIHRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgb25jZSBhbmQgaXRzIG5hbWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHByb3BlcnR5LlxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogNTAwMFxuICB9O1xuICBjb25zdCBmdWxsT3B0aW9ucyA9IHsgLi4uREVGQVVMVF9SRVRSWV9PUFRJT05TLCAuLi5wYXJhbXMucmV0cnlPcHRpb25zIH07XG4gIGZ1bGxPcHRpb25zLmFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGF3YWl0IHJ1bldpdGhUaW1lb3V0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxSdW5XaXRoVGltZW91dFBhcmFtczx2b2lkPj4oe1xuICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJycsIHJldHJ5Rm46IHBhcmFtcy5vcGVyYXRpb25GbiB9LFxuICAgIG9uVGltZW91dDogcGFyYW1zLm9uVGltZW91dCxcbiAgICBhc3luYyBvcGVyYXRpb25GbihhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkQWJvcnRTaWduYWwgPSBhYm9ydFNpZ25hbEFueShmdWxsT3B0aW9ucy5hYm9ydFNpZ25hbCwgYWJvcnRTaWduYWwpO1xuICAgICAgY29tYmluZWRBYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgICAgd2hpbGUgKCFjb21iaW5lZEFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICBsZXQgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlzU3VjY2VzcyA9IGF3YWl0IHBhcmFtcy5vcGVyYXRpb25Gbihjb21iaW5lZEFib3J0U2lnbmFsKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBtaWdodCBjaGFuZ2VkIGluc2lkZSBgZm4oKWAuIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgICAgICAgICBpZiAoY29tYmluZWRBYm9ydFNpZ25hbC5hYm9ydGVkIHx8ICFmdWxsT3B0aW9ucy5zaG91bGRSZXRyeU9uRXJyb3IgfHwgdGVybWluYXRlUmV0cnlFcnJvcnMuaGFzKGVycm9yIGFzIEVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcih7XG4gICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ3JldHJ5V2l0aFRpbWVvdXQgZmFpbGVkJyxcbiAgICAgICAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByaW50RXJyb3IoZXJyb3IpO1xuICAgICAgICAgIGlzU3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N1Y2Nlc3MpIHtcbiAgICAgICAgICBwcmludFdpdGhTdGFja1RyYWNlKHtcbiAgICAgICAgICAgIGFyZ3M6IFt7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbkZuOiBwYXJhbXMub3BlcmF0aW9uRm4sXG4gICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlYnVnZ2VySW5zdGFuY2U6IHJldHJ5V2l0aFRpbWVvdXREZWJ1Z2dlcixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBSZXRyeSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFmdGVyICR7U3RyaW5nKGF0dGVtcHQpfSBhdHRlbXB0c2AsXG4gICAgICAgICAgICBzdGFja1RyYWNlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRXaXRoU3RhY2tUcmFjZSh7XG4gICAgICAgICAgYXJnczogW3tcbiAgICAgICAgICAgIG9wZXJhdGlvbkZuOiBwYXJhbXMub3BlcmF0aW9uRm4sXG4gICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJ1xuICAgICAgICAgIH1dLFxuICAgICAgICAgIGRlYnVnZ2VySW5zdGFuY2U6IHJldHJ5V2l0aFRpbWVvdXREZWJ1Z2dlcixcbiAgICAgICAgICBtZXNzYWdlOiBgUmV0cnkgYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0gY29tcGxldGVkIHVuc3VjY2Vzc2Z1bGx5LiBUcnlpbmcgYWdhaW4gaW4gJHtTdHJpbmcoZnVsbE9wdGlvbnMucmV0cnlEZWxheUluTWlsbGlzZWNvbmRzKX0gbWlsbGlzZWNvbmRzYCxcbiAgICAgICAgICBzdGFja1RyYWNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHNsZWVwKHsgYWJvcnRTaWduYWwsIG1pbGxpc2Vjb25kczogZnVsbE9wdGlvbnMucmV0cnlEZWxheUluTWlsbGlzZWNvbmRzIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJycsXG4gICAgc3RhY2tUcmFjZSxcbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IGZ1bGxPcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICB9KSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBmdW5jdGlvbiB3aXRoIGEgdGltZW91dC4gSWYgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNvbXBsZXRlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUsIGl0IGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSB0aW1lZCBvdXQuXG4gKlxuICogSWYgYERFQlVHPW9ic2lkaWFuLWRldi11dGlsczpBc3luYzpydW5XaXRoVGltZW91dGAgaXMgc2V0LCB0aGUgZXhlY3V0aW9uIGlzIG5vdCB0ZXJtaW5hdGVkIGFmdGVyIHRoZSB0aW1lb3V0IGFuZCB0aGUgZnVuY3Rpb24gaXMgYWxsb3dlZCB0byBydW4gaW5kZWZpbml0ZWx5LlxuICpcbiAqIEB0eXBlUGFyYW0gUmVzdWx0IC0gVGhlIHR5cGUgb2YgdGhlIHJlc3VsdCBmcm9tIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gb3IgcmVqZWN0cyBpZiBpdCB0aW1lcyBvdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoVGltZW91dDxSZXN1bHQ+KHBhcmFtczogUnVuV2l0aFRpbWVvdXRQYXJhbXM8UmVzdWx0Pik6IFByb21pc2U8UmVzdWx0PiB7XG4gIGNvbnN0IHN0YWNrVHJhY2UgPSBwYXJhbXMuc3RhY2tUcmFjZSA/PyBnZXRTdGFja1RyYWNlKDEpO1xuICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICBjb25zdCBydW5BYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHRpbWVvdXRBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgbGV0IHJlc3VsdDogbnVsbCB8IFJlc3VsdCA9IG51bGw7XG4gIGxldCBoYXNSZXN1bHQgPSBmYWxzZTtcbiAgbGV0IGlzQ29tcGxldGVkID0gZmFsc2U7XG4gIGNvbnN0IHJ1bldpdGhUaW1lb3V0RGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6cnVuV2l0aFRpbWVvdXQnKTtcbiAgY29uc3Qgb25UaW1lb3V0ID0gcGFyYW1zLm9uVGltZW91dCA/PyBkZWZhdWx0T25UaW1lb3V0O1xuXG4gIGF3YWl0IFByb21pc2UucmFjZShbcnVuKCksIGlubmVyVGltZW91dCgpXSk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IG1pZ2h0IGNoYW5nZWQgaW5zaWRlIGBydW4oKWAuIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgaWYgKGhhc1Jlc3VsdCkge1xuICAgIHJldHVybiByZXN1bHQgYXMgUmVzdWx0O1xuICB9XG5cbiAgdGhyb3cgbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcih7XG4gICAgY2F1c2U6IHJ1bkFib3J0Q29udHJvbGxlci5zaWduYWwucmVhc29uLFxuICAgIG1lc3NhZ2U6ICdSdW4gd2l0aCB0aW1lb3V0IGZhaWxlZCcsXG4gICAgc3RhY2tUcmFjZVxuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHBhcmFtcy5vcGVyYXRpb25GbihydW5BYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gTWF0aC50cnVuYyhwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZSk7XG4gICAgICBwcmludFdpdGhTdGFja1RyYWNlKHtcbiAgICAgICAgYXJnczogW3tcbiAgICAgICAgICBjb250ZXh0OiBwYXJhbXMuY29udGV4dCxcbiAgICAgICAgICBvcGVyYXRpb25GbjogcGFyYW1zLm9wZXJhdGlvbkZuLFxuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnXG4gICAgICAgIH1dLFxuICAgICAgICBkZWJ1Z2dlckluc3RhbmNlOiBydW5XaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgICBtZXNzYWdlOiBgRXhlY3V0aW9uIHRpbWU6ICR7U3RyaW5nKGR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYCxcbiAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgfSk7XG4gICAgICBoYXNSZXN1bHQgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJ1bkFib3J0Q29udHJvbGxlci5hYm9ydChlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgdGltZW91dEFib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ0NvbXBsZXRlZCcpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBpbm5lclRpbWVvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc2xlZXAoeyBhYm9ydFNpZ25hbDogdGltZW91dEFib3J0Q29udHJvbGxlci5zaWduYWwsIG1pbGxpc2Vjb25kczogcGFyYW1zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KTtcblxuICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkdXJhdGlvbiA9IE1hdGgudHJ1bmMocGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWUpO1xuICAgIHByaW50V2l0aFN0YWNrVHJhY2Uoe1xuICAgICAgYXJnczogW3tcbiAgICAgICAgY29udGV4dDogcGFyYW1zLmNvbnRleHQsXG4gICAgICAgIG9wZXJhdGlvbkZuOiBwYXJhbXMub3BlcmF0aW9uRm4sXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnXG4gICAgICB9XSxcbiAgICAgIGRlYnVnZ2VySW5zdGFuY2U6IHJ1bldpdGhUaW1lb3V0RGVidWdnZXIsXG4gICAgICBtZXNzYWdlOiBgVGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKGR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYCxcbiAgICAgIHN0YWNrVHJhY2VcbiAgICB9KTtcblxuICAgIGNvbnN0IHRpbWVvdXRDb250ZXh0OiBUaW1lb3V0Q29udGV4dCA9IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxUaW1lb3V0Q29udGV4dD4oe1xuICAgICAgZHVyYXRpb24sXG4gICAgICBvbk9wZXJhdGlvbkNvbXBsZXRlZChjYWxsYmFjaykge1xuICAgICAgICB0aW1lb3V0QWJvcnRDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGNhbGxiYWNrKTtcbiAgICAgIH0sXG4gICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJyxcbiAgICAgIHRlcm1pbmF0ZU9wZXJhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYFRpbWVkIG91dCBhZnRlciAke1N0cmluZyhkdXJhdGlvbil9IG1pbGxpc2Vjb25kc2ApO1xuICAgICAgICBydW5BYm9ydENvbnRyb2xsZXIuYWJvcnQoZXJyb3IpO1xuICAgICAgICB0aW1lb3V0QWJvcnRDb250cm9sbGVyLmFib3J0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG9uVGltZW91dCh0aW1lb3V0Q29udGV4dCk7XG4gICAgYXdhaXQgd2FpdEZvckFib3J0KHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZmF1bHRPblRpbWVvdXQoY3R4OiBUaW1lb3V0Q29udGV4dCk6IHZvaWQge1xuICAgIGN0eC50ZXJtaW5hdGVPcGVyYXRpb24oKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgc2V0IGltbWVkaWF0ZS5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IHNldCBpbW1lZGlhdGUgaXMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0SW1tZWRpYXRlQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGF5cyBleGVjdXRpb24gZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIGRlbGF5IC0gVGhlIHRpbWUgdG8gd2FpdCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRUaW1lb3V0QXN5bmMoZGVsYXk/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICB3aW5kb3cuc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGF5cyBleGVjdXRpb24gZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChwYXJhbXM6IFNsZWVwUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBtaWxsaXNlY29uZHMsXG4gICAgc2hvdWxkVGhyb3dPbkFib3J0XG4gIH0gPSBwYXJhbXM7XG4gIGF3YWl0IHdhaXRGb3JBYm9ydChhYm9ydFNpZ25hbEFueShhYm9ydFNpZ25hbCwgYWJvcnRTaWduYWxUaW1lb3V0KG1pbGxpc2Vjb25kcykpKTtcbiAgaWYgKHNob3VsZFRocm93T25BYm9ydCkge1xuICAgIGFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHtAbGluayBQcm9taXNlfSB0aGF0IHJlamVjdHMgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lb3V0IHBlcmlvZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgYWx3YXlzIHJlamVjdHMgd2l0aCBhIHRpbWVvdXQgZXJyb3IuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aW1lb3V0KHBhcmFtczogVGltZW91dFBhcmFtcyk6IFByb21pc2U8bmV2ZXI+IHtcbiAgY29uc3Qge1xuICAgIGFib3J0U2lnbmFsLFxuICAgIHNob3VsZFRocm93T25BYm9ydCxcbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgc2xlZXAobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNsZWVwUGFyYW1zPih7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgbWlsbGlzZWNvbmRzOiB0aW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgc2hvdWxkVGhyb3dPbkFib3J0XG4gIH0pKTtcbiAgdGhyb3cgbmV3IEVycm9yKGBUaW1lZCBvdXQgaW4gJHtTdHJpbmcodGltZW91dEluTWlsbGlzZWNvbmRzKX0gbWlsbGlzZWNvbmRzYCk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRvIGFuIGFycmF5IGJ5IGNvbnN1bWluZyBhbGwgaXRzIGVsZW1lbnRzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIHByb2R1Y2VkIGJ5IHRoZSBBc3luY0l0ZXJhYmxlSXRlcmF0b3IuXG4gKiBAcGFyYW0gaXRlciAtIFRoZSBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBBc3luY0l0ZXJhYmxlSXRlcmF0b3IuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0b0FycmF5PFQ+KGl0ZXI6IEFzeW5jSXRlcmFibGVJdGVyYXRvcjxUPik6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IGFycjogVFtdID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBpdGVyKSB7XG4gICAgYXJyLnB1c2goaXRlbSk7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUywwQkFBMEI7QUFDbkM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7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
485
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgR2VuZXJpY0FzeW5jRnVuY3Rpb24sXG4gIEdlbmVyaWNGdW5jdGlvbixcbiAgR2VuZXJpY1ZvaWRGdW5jdGlvblxufSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcblxuaW1wb3J0IHtcbiAgYWJvcnRTaWduYWxBbnksXG4gIGFib3J0U2lnbmFsTmV2ZXIsXG4gIGFib3J0U2lnbmFsVGltZW91dCxcbiAgd2FpdEZvckFib3J0XG59IGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5pbXBvcnQge1xuICBnZXRMaWJEZWJ1Z2dlcixcbiAgcHJpbnRXaXRoU3RhY2tUcmFjZVxufSBmcm9tICcuL2RlYnVnLnRzJztcbmltcG9ydCB7IENhbGxiYWNrRGlzcG9zYWJsZSB9IGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQge1xuICBBU1lOQ19XUkFQUEVSX0VSUk9SX01FU1NBR0UsXG4gIEN1c3RvbVN0YWNrVHJhY2VFcnJvcixcbiAgZW1pdEFzeW5jRXJyb3JFdmVudCxcbiAgZ2V0U3RhY2tUcmFjZSxcbiAgcHJpbnRFcnJvcixcbiAgU2lsZW50RXJyb3Jcbn0gZnJvbSAnLi9lcnJvci50cyc7XG5pbXBvcnQge1xuICBub29wLFxuICBub29wQXN5bmNcbn0gZnJvbSAnLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGFzc2VydE5vbk51bGxhYmxlXG59IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuXG4vKipcbiAqIEEgdHlwZSByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHJvbWlzZVJlc29sdmU8VD4gPSB1bmRlZmluZWQgZXh0ZW5kcyBUID8gKHZhbHVlPzogUHJvbWlzZUxpa2U8VD4gfCBUKSA9PiB2b2lkXG4gIDogKHZhbHVlOiBQcm9taXNlTGlrZTxUPiB8IFQpID0+IHZvaWQ7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJldHJ5V2l0aFRpbWVvdXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGFib3J0IHNpZ25hbCB0byBjYW5jZWwgdGhlIHJldHJ5IG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIEEgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcmV0cnkgYXR0ZW1wdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDBgXG4gICAqL1xuICByZWFkb25seSByZXRyeURlbGF5SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmV0cnkgdGhlIGZ1bmN0aW9uIG9uIGVycm9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXRyeU9uRXJyb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIG9uIHJldHJ5aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTAwMGBcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBZGRzIGFuIGVycm9yIGhhbmRsZXIgdG8gYSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBjYXRjaGVzIGFueSBlcnJvcnMgYW5kIGVtaXRzIGFuIGFzeW5jIGVycm9yIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBhc3luY0ZuIC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhZGQgYW4gZXJyb3IgaGFuZGxlciB0by5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjb21wbGV0ZXMgb3IgZW1pdHMgYXN5bmMgZXJyb3IgZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRFcnJvckhhbmRsZXIoYXN5bmNGbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICB0cnkge1xuICAgIGF3YWl0IGFzeW5jRm4oKTtcbiAgfSBjYXRjaCAoYXN5bmNFcnJvcikge1xuICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBDdXN0b21TdGFja1RyYWNlRXJyb3Ioe1xuICAgICAgY2F1c2U6IGFzeW5jRXJyb3IsXG4gICAgICBtZXNzYWdlOiBBU1lOQ19XUkFQUEVSX0VSUk9SX01FU1NBR0UsXG4gICAgICBzdGFja1RyYWNlXG4gICAgfSk7XG4gICAgaWYgKGhhbmRsZVNpbGVudEVycm9yKHdyYXBwZWRFcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW1pdEFzeW5jRXJyb3JFdmVudCh3cmFwcGVkRXJyb3IpO1xuICB9XG59XG5cbi8qKlxuICogRmlsdGVycyBhbiBhcnJheSBhc3luY2hyb25vdXNseSwga2VlcGluZyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByb3ZpZGVkIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyIC0gVGhlIGFycmF5IHRvIGZpbHRlci5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgLSBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaWx0ZXI8VD4oYXJyOiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPGJvb2xlYW4+KTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgYW5zOiBUW10gPSBbXTtcblxuICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGFyciwgaSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW0gPSBhcnJbaV0gYXMgVDtcbiAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0sIGksIGFycikpIHtcbiAgICAgIGFucy5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbnM7XG59XG5cbi8qKlxuICogRmlsdGVycyBhbiBhcnJheSBhc3luY2hyb25vdXNseSBpbiBwbGFjZSwga2VlcGluZyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByb3ZpZGVkIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyIC0gVGhlIGFycmF5IHRvIGZpbHRlci5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgLSBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhcnJheSBpcyBmaWx0ZXJlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmlsdGVySW5QbGFjZTxUPihhcnI6IFRbXSwgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2FibGU8Ym9vbGVhbj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgbGV0IHdyaXRlSW5kZXggPSAwO1xuICBmb3IgKGxldCByZWFkSW5kZXggPSAwOyByZWFkSW5kZXggPCBsZW5ndGg7IHJlYWRJbmRleCsrKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGFyciwgcmVhZEluZGV4KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IGFycltyZWFkSW5kZXhdIGFzIFQ7XG4gICAgaWYgKGF3YWl0IHByZWRpY2F0ZShjdXJyZW50LCByZWFkSW5kZXgsIGFycikpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFllcywgaXQgaXMgYSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24sIGJ1dCBJIGRvbid0IGFuIGVsZWdhbnQgd2F5IHRvIGZpeCBpdC5cbiAgICAgIGFyclt3cml0ZUluZGV4KytdID0gY3VycmVudDtcbiAgICB9XG4gIH1cbiAgYXJyLmxlbmd0aCA9IHdyaXRlSW5kZXg7XG59XG5cbi8qKlxuICogTWFwcyBvdmVyIGFuIGFycmF5IGFzeW5jaHJvbm91c2x5LCBhcHBseWluZyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZWFjaCBlbGVtZW50LCBhbmQgdGhlbiBmbGF0dGVucyB0aGUgcmVzdWx0cyBpbnRvIGEgc2luZ2xlIGFycmF5LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheS5cbiAqIEB0eXBlUGFyYW0gVSAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBvdXRwdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyIC0gVGhlIGFycmF5IHRvIG1hcCBvdmVyIGFuZCBmbGF0dGVuLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhIGZsYXR0ZW5lZCBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY0ZsYXRNYXA8VCwgVT4oYXJyOiBUW10sIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2FibGU8VVtdPik6IFByb21pc2U8VVtdPiB7XG4gIHJldHVybiAoYXdhaXQgYXN5bmNNYXAoYXJyLCBjYWxsYmFjaykpLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBNYXBzIG92ZXIgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGFwcGx5aW5nIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHR5cGVQYXJhbSBVIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBhcnJheS5cbiAqIEBwYXJhbSBhcnIgLSBUaGUgYXJyYXkgdG8gbWFwIG92ZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jTWFwPFQsIFU+KGFycjogVFtdLCBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPFU+KTogUHJvbWlzZTxVW10+IHtcbiAgcmV0dXJuIGF3YWl0IHByb21pc2VBbGxTZXF1ZW50aWFsbHkoYXJyLm1hcChjYWxsYmFjaykpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhIHN5bmNocm9ub3VzIG9uZSBieSBhdXRvbWF0aWNhbGx5IGhhbmRsaW5nIHRoZSBQcm9taXNlIHJlamVjdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAqIEBwYXJhbSBhc3luY0Z1bmMgLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gaW4gYSBzeW5jaHJvbm91cyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0QXN5bmNUb1N5bmM8QXJncyBleHRlbmRzIHVua25vd25bXT4oYXN5bmNGdW5jOiBHZW5lcmljQXN5bmNGdW5jdGlvbjxBcmdzPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IEdlbmVyaWNWb2lkRnVuY3Rpb248QXJncz4ge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICByZXR1cm4gKC4uLmFyZ3M6IEFyZ3MpOiB2b2lkID0+IHtcbiAgICBhc3NlcnROb25OdWxsYWJsZShzdGFja1RyYWNlKTtcbiAgICBjb25zdCBpbm5lclN0YWNrVHJhY2UgPSBnZXRTdGFja1RyYWNlKDEpO1xuICAgIHN0YWNrVHJhY2UgPSBgJHtzdGFja1RyYWNlfVxcbiAgICBhdCAtLS0gY29udmVydEFzeW5jVG9TeW5jIC0tLSAoMClcXG4ke2lubmVyU3RhY2tUcmFjZX1gO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IGFzeW5jRnVuYyguLi5hcmdzKSwgc3RhY2tUcmFjZSk7XG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhbiBhc3luY2hyb25vdXMgb25lIGJ5IHdyYXBwaW5nIGl0IGluIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHR5cGVQYXJhbSBSZXN1bHQgLSBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuXG4gKiBAcGFyYW0gc3luY0ZuIC0gVGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIGluIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U3luY1RvQXN5bmM8QXJncyBleHRlbmRzIHVua25vd25bXSwgUmVzdWx0PihzeW5jRm46IEdlbmVyaWNGdW5jdGlvbjxBcmdzLCBSZXN1bHQ+KTogR2VuZXJpY0FzeW5jRnVuY3Rpb248QXJncywgUmVzdWx0PiB7XG4gIHJldHVybiBhc3luYyAoLi4uYXJnczogQXJncyk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gICAgcmV0dXJuIHN5bmNGbiguLi5hcmdzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGEgc2lsZW50IGVycm9yLlxuICpcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBoYW5kbGUuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBlcnJvciBpcyBhIHNpbGVudCBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVNpbGVudEVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGxldCBjYXVzZSA9IGVycm9yO1xuICB3aGlsZSAoIShjYXVzZSBpbnN0YW5jZW9mIFNpbGVudEVycm9yKSkge1xuICAgIGlmICghKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY2F1c2UgPSBjYXVzZS5jYXVzZTtcbiAgfVxuXG4gIGdldExpYkRlYnVnZ2VyKCdBc3luYzpoYW5kbGVTaWxlbnRFcnJvcicpKGVycm9yKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogSWdub3JlcyBhbiBlcnJvciB0aGF0IGlzIHRocm93biBieSBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0byBpZ25vcmUgdGhlIGVycm9yIG9mLlxuICogQHBhcmFtIGZhbGxiYWNrVmFsdWUgLSBBbHdheXMgYHVuZGVmaW5lZGAuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjb21wbGV0ZXMgb3IgZmFpbHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcihwcm9taXNlOiBQcm9taXNlPHVua25vd24+LCBmYWxsYmFja1ZhbHVlPzogdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPjtcbi8qKlxuICogSW52b2tlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHRoZSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBmYWxsYmFja1ZhbHVlOiBUKTogUHJvbWlzZTxUPjtcbi8qKlxuICogSWdub3JlcyBhbiBlcnJvciB0aGF0IGlzIHRocm93biBieSBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHRoZSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBmYWxsYmFja1ZhbHVlPzogVCk6IFByb21pc2U8VCB8IHZvaWQ+IHtcbiAgY29uc3QgaWdub3JlRXJyb3JEZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzppZ25vcmVFcnJvcicpO1xuICBjb25zdCBzdGFja1RyYWNlID0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlnbm9yZUVycm9yRGVidWdnZXIoXG4gICAgICAnSWdub3JlZCBlcnJvcicsXG4gICAgICBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKHtcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICAgIG1lc3NhZ2U6ICdJZ25vcmVkIGVycm9yJyxcbiAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBmYWxsYmFja1ZhbHVlO1xuICB9XG59XG5cbmNvbnN0IHBlbmRpbmdBc3luY09wZXJhdGlvbnMgPSBuZXcgU2V0PFByb21pc2U8dm9pZD4+KCk7XG5sZXQgaXNBc3luY09wZXJhdGlvblRyYWNraW5nRW5hYmxlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbnZva2VBc3luY1NhZmVseUFmdGVyRGVsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgKlxuICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIGFzeW5jRm4odGhpczogdm9pZCwgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDBgXG4gICAqL1xuICByZWFkb25seSBkZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrVHJhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGlzYWJsZXMgdHJhY2tpbmcgcHJldmlvdXNseSBlbmFibGVkIHZpYSB7QGxpbmsgZW5hYmxlQXN5bmNPcGVyYXRpb25UcmFja2luZ30gYW5kIGZvcmdldHMgYW55IGN1cnJlbnRseS10cmFja2VkIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNhYmxlQXN5bmNPcGVyYXRpb25UcmFja2luZygpOiB2b2lkIHtcbiAgaXNBc3luY09wZXJhdGlvblRyYWNraW5nRW5hYmxlZCA9IGZhbHNlO1xuICBwZW5kaW5nQXN5bmNPcGVyYXRpb25zLmNsZWFyKCk7XG59XG5cbi8qKlxuICogRW5hYmxlcyB0cmFja2luZyBvZiBmaXJlLWFuZC1mb3JnZXQgb3BlcmF0aW9ucyBzY2hlZHVsZWQgdmlhIHtAbGluayBpbnZva2VBc3luY1NhZmVseX0gKGFuZCB0aGVyZWZvcmUge0BsaW5rIGNvbnZlcnRBc3luY1RvU3luY30pLlxuICpcbiAqIFdoaWxlIGVuYWJsZWQsIGVhY2ggc2NoZWR1bGVkIG9wZXJhdGlvbiBpcyByZWNvcmRlZCB1bnRpbCBpdCBzZXR0bGVzIHNvIHRoYXQgdGVzdHMgY2FuIGF3YWl0IHRoZW0gYWxsIHZpYSB7QGxpbmsgd2FpdEZvckFsbEFzeW5jT3BlcmF0aW9uc30sIHJlbW92aW5nIHRoZSBuZWVkIHRvIG92ZXJyaWRlIHtAbGluayBpbnZva2VBc3luY1NhZmVseX0gLyB7QGxpbmsgY29udmVydEFzeW5jVG9TeW5jfSBpbiB0ZXN0cy5cbiAqXG4gKiBUcmFja2luZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBzbyBwcm9kdWN0aW9uIGNvZGUgY2FycmllcyBubyBib29ra2VlcGluZyBvdmVyaGVhZC4gSW50ZW5kZWQgdG8gYmUgZW5hYmxlZCBpbiB0ZXN0IGVudmlyb25tZW50cyBvbmx5LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgZGlzYWJsZXMgdHJhY2tpbmcgYWdhaW4gKHZpYSB7QGxpbmsgZGlzYWJsZUFzeW5jT3BlcmF0aW9uVHJhY2tpbmd9KSB3aGVuIGRpc3Bvc2VkLCBmb3IgdXNlIHdpdGggYHVzaW5nYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZUFzeW5jT3BlcmF0aW9uVHJhY2tpbmcoKTogRGlzcG9zYWJsZSB7XG4gIGlzQXN5bmNPcGVyYXRpb25UcmFja2luZ0VuYWJsZWQgPSB0cnVlO1xuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6IGRpc2FibGVBc3luY09wZXJhdGlvblRyYWNraW5nXG4gIH0pO1xufVxuXG4vKipcbiAqIEludm9rZXMgYSB7QGxpbmsgUHJvbWlzZX0gYW5kIHNhZmVseSBoYW5kbGVzIGFueSBlcnJvcnMgYnkgY2F0Y2hpbmcgdGhlbSBhbmQgZW1pdHRpbmcgYW4gYXN5bmMgZXJyb3IgZXZlbnQuXG4gKlxuICogQHBhcmFtIGFzeW5jRm4gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGludm9rZSBzYWZlbHkuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlQXN5bmNTYWZlbHkoYXN5bmNGbjogKCkgPT4gUHJvbWlzYWJsZTx1bmtub3duPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IHZvaWQge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuXG4gIGxldCByZXN1bHQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gYXN5bmNGbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9ycyAtLSBSZS1yZWplY3RpbmcgdGhlIG9yaWdpbmFsIGNhdWdodCBlcnJvciBhcy1pcy5cbiAgICB0cmFja0FzeW5jT3BlcmF0aW9uKGFkZEVycm9ySGFuZGxlcigoKSA9PiBQcm9taXNlLnJlamVjdChlcnJvciksIHN0YWNrVHJhY2UpKTtcbiAgfVxuICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgIHRyYWNrQXN5bmNPcGVyYXRpb24oYWRkRXJyb3JIYW5kbGVyKCgpID0+IHJlc3VsdCwgc3RhY2tUcmFjZSkpO1xuICB9XG59XG5cbi8qKlxuICogSW52b2tlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYWZ0ZXIgYSBkZWxheS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheShwYXJhbXM6IEludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheVBhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7XG4gICAgYXN5bmNGbixcbiAgICBkZWxheUluTWlsbGlzZWNvbmRzID0gMFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBhYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbCA/PyBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGNvbnN0IHN0YWNrVHJhY2UgPSBwYXJhbXMuc3RhY2tUcmFjZSA/PyBnZXRTdGFja1RyYWNlKDEpO1xuICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgc2xlZXAoeyBhYm9ydFNpZ25hbCwgbWlsbGlzZWNvbmRzOiBkZWxheUluTWlsbGlzZWNvbmRzLCBzaG91bGRUaHJvd09uQWJvcnQ6IHRydWUgfSk7XG4gICAgYXdhaXQgYXN5bmNGbihhYm9ydFNpZ25hbCk7XG4gIH0sIHN0YWNrVHJhY2UpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGFzeW5jIGZ1bmN0aW9ucyBzZXF1ZW50aWFsbHkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIGFzeW5jRm5zIC0gVGhlIGFzeW5jIGZ1bmN0aW9ucyB0byBleGVjdXRlIHNlcXVlbnRpYWxseS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgYXN5bmMgZnVuY3Rpb25zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvbWlzZUFsbEFzeW5jRm5zU2VxdWVudGlhbGx5PFQ+KGFzeW5jRm5zOiAoKCkgPT4gUHJvbWlzYWJsZTxUPilbXSk6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IHJlc3VsdHM6IFRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGFzeW5jRm4gb2YgYXN5bmNGbnMpIHtcbiAgICByZXN1bHRzLnB1c2goYXdhaXQgYXN5bmNGbigpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBwcm9taXNlcyBzZXF1ZW50aWFsbHkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIHByb21pc2VzIC0gVGhlIHByb21pc2VzIHRvIGV4ZWN1dGUgc2VxdWVudGlhbGx5LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBwcm9taXNlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb21pc2VBbGxTZXF1ZW50aWFsbHk8VD4ocHJvbWlzZXM6IFByb21pc2FibGU8VD5bXSk6IFByb21pc2U8VFtdPiB7XG4gIHJldHVybiBhd2FpdCBwcm9taXNlQWxsQXN5bmNGbnNTZXF1ZW50aWFsbHkocHJvbWlzZXMubWFwKChwcm9taXNlKSA9PiAoKSA9PiBwcm9taXNlKSk7XG59XG5cbi8qKlxuICogV2FpdHMgZm9yIGFsbCBmaXJlLWFuZC1mb3JnZXQgb3BlcmF0aW9ucyB0cmFja2VkIHNpbmNlIHtAbGluayBlbmFibGVBc3luY09wZXJhdGlvblRyYWNraW5nfSB3YXMgY2FsbGVkIHRvIHNldHRsZS5cbiAqXG4gKiBPcGVyYXRpb25zIHNjaGVkdWxlZCB3aGlsZSBhd2FpdGluZyBhcmUgYWxzbyBhd2FpdGVkLCBzbyBjYXNjYWRpbmcgZmlyZS1hbmQtZm9yZ2V0IGNoYWlucyBhcmUgZnVsbHkgZHJhaW5lZC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2Ugbm8gdHJhY2tlZCBvcGVyYXRpb25zIHJlbWFpbiBwZW5kaW5nLlxuICogQHRocm93cyBJZiB0cmFja2luZyBpcyBub3QgZW5hYmxlZC4gT3RoZXJ3aXNlIHRoaXMgd291bGQgc2lsZW50bHkgcmVzb2x2ZSBhcyBpZiBhbGwgb3BlcmF0aW9ucyB3ZXJlIGZpbmlzaGVkLCBtYXNraW5nIGEgbWlzc2luZyB7QGxpbmsgZW5hYmxlQXN5bmNPcGVyYXRpb25UcmFja2luZ30gY2FsbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBbGxBc3luY09wZXJhdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNBc3luY09wZXJhdGlvblRyYWNraW5nRW5hYmxlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQXN5bmMgb3BlcmF0aW9uIHRyYWNraW5nIGlzIG5vdCBlbmFibGVkLiBDYWxsIGVuYWJsZUFzeW5jT3BlcmF0aW9uVHJhY2tpbmcoKSBiZWZvcmUgd2FpdEZvckFsbEFzeW5jT3BlcmF0aW9ucygpLicpO1xuICB9XG5cbiAgd2hpbGUgKHBlbmRpbmdBc3luY09wZXJhdGlvbnMuc2l6ZSA+IDApIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoWy4uLnBlbmRpbmdBc3luY09wZXJhdGlvbnNdKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFja0FzeW5jT3BlcmF0aW9uKG9wZXJhdGlvbjogUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICBpZiAoIWlzQXN5bmNPcGVyYXRpb25UcmFja2luZ0VuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwZW5kaW5nQXN5bmNPcGVyYXRpb25zLmFkZChvcGVyYXRpb24pO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdm9pZCAtLSBGaXJlLWFuZC1mb3JnZXQgY2xlYW51cCBvZiB0aGUgc2V0dGxlZCBvcGVyYXRpb24uXG4gIHZvaWQgb3BlcmF0aW9uLmZpbmFsbHkoKCkgPT4ge1xuICAgIHBlbmRpbmdBc3luY09wZXJhdGlvbnMuZGVsZXRlKG9wZXJhdGlvbik7XG4gIH0pO1xufVxuXG5jb25zdCB0ZXJtaW5hdGVSZXRyeUVycm9ycyA9IG5ldyBXZWFrU2V0PEVycm9yPigpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayByZXRyeVdpdGhUaW1lb3V0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeVdpdGhUaW1lb3V0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHRpbWVvdXQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHRpbWVvdXQgY29udGV4dC5cbiAgICovXG4gIG9uVGltZW91dD8odGhpczogdm9pZCwgY29udGV4dDogVGltZW91dENvbnRleHQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAgICpcbiAgICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgb3BlcmF0aW9uRm4odGhpczogdm9pZCwgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzYWJsZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJldHJ5IG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSByZXRyeU9wdGlvbnM/OiBSZXRyeU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tUcmFjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcnVuV2l0aFRpbWVvdXR9LlxuICpcbiAqIEB0eXBlUGFyYW0gUmVzdWx0IC0gVGhlIHR5cGUgb2YgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bldpdGhUaW1lb3V0UGFyYW1zPFJlc3VsdD4ge1xuICAvKipcbiAgICogVGhlIGNvbnRleHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dD86IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHRpbWVvdXQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHRpbWVvdXQgY29udGV4dC5cbiAgICovXG4gIG9uVGltZW91dD8odGhpczogdm9pZCwgY29udGV4dDogVGltZW91dENvbnRleHQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gICAqXG4gICAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIFRoZSBhYm9ydCBzaWduYWwgdG8gbGlzdGVuIHRvLlxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIG9wZXJhdGlvbkZuKHRoaXM6IHZvaWQsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2FibGU8UmVzdWx0PjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBzdGFja1RyYWNlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNsZWVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGVlcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGFib3J0IHNpZ25hbCBpcyBhYm9ydGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd09uQWJvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnRleHQgcHJvdmlkZWQgdG8gdGhlIHRpbWVvdXQgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lb3V0Q29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBvcGVyYXRpb24gc3RhcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uOiBudW1iZXI7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAqL1xuICBvbk9wZXJhdGlvbkNvbXBsZXRlZChjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGVybWluYXRlcyB0aGUgb3BlcmF0aW9uIHRoYXQgdGltZWQgb3V0LlxuICAgKi9cbiAgdGVybWluYXRlT3BlcmF0aW9uKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRpbWVvdXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVvdXRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSBhYm9ydCBzaWduYWwgaXMgYWJvcnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkFib3J0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRpbWVvdXQgcGVyaW9kIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIENoYWlucyBhIHByb21pc2Ugd2l0aCBhbm90aGVyIHByb21pc2UuXG4gKlxuICogQHBhcmFtIGNoYWluUHJvbWlzZSAtIFJlcHJlc2VudHMgdGhlIGNoYWluZWQgcHJvbWlzZS5cbiAqIEBwYXJhbSBwcm9taXNhYmxlRm4gLSBUaGUgZnVuY3Rpb24gdG8gY2hhaW4uXG4gKiBAcmV0dXJucyBDaGFpbmVkIHByb21pc2Ugb3IgYG51bGxgIGlmIG5vIGFzeW5jIGxvZ2ljIGlzIGNoYWluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbihjaGFpblByb21pc2U6IG51bGwgfCBQcm9taXNlPHZvaWQ+LCBwcm9taXNhYmxlRm46ICgpID0+IG51bGwgfCBQcm9taXNhYmxlPHZvaWQ+KTogbnVsbCB8IFByb21pc2U8dm9pZD4ge1xuICBsZXQgbmV4dENoYWluUHJvbWlzZSA9IGNoYWluUHJvbWlzZTtcbiAgaWYgKGNoYWluUHJvbWlzZSkge1xuICAgIG5leHRDaGFpblByb21pc2UgPSBjaGFpblByb21pc2UudGhlbigoKSA9PiBwcm9taXNhYmxlRm4oKSA/PyB1bmRlZmluZWQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByb21pc2FibGUgPSBwcm9taXNhYmxlRm4oKTtcbiAgICBpZiAocHJvbWlzYWJsZSkge1xuICAgICAgbmV4dENoYWluUHJvbWlzZSA9IHByb21pc2FibGUgaW5zdGFuY2VvZiBQcm9taXNlID8gcHJvbWlzYWJsZSBhcyBQcm9taXNlPHZvaWQ+IDogUHJvbWlzZS5yZXNvbHZlKHByb21pc2FibGUpO1xuICAgIH1cbiAgfVxuXG4gIG5leHRDaGFpblByb21pc2U/LmNhdGNoKG5vb3ApO1xuICByZXR1cm4gbmV4dENoYWluUHJvbWlzZTtcbn1cblxuLyoqXG4gKiBNYXJrcyBhbiBlcnJvciB0byB0ZXJtaW5hdGUgcmV0cnkgbG9naWMuXG4gKlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIG1hcmsgdG8gdGVybWluYXRlIHJldHJ5IGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya3NBc1Rlcm1pbmF0ZVJldHJ5KGVycm9yOiBFcnJvcik6IHZvaWQge1xuICB0ZXJtaW5hdGVSZXRyeUVycm9ycy5hZGQoZXJyb3IpO1xufVxuXG4vKipcbiAqIEFuIGFzeW5jIGZ1bmN0aW9uIHRoYXQgbmV2ZXIgZW5kcy5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IG5ldmVyIHJlc29sdmVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV2ZXJFbmRzKCk6IFByb21pc2U8bmV2ZXI+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKCkgPT4ge1xuICAgIG5vb3AoKTtcbiAgfSk7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFeGhhdXN0aXZlIHN3aXRjaCBndWFyZDsgdGhlIGF3YWl0IGFib3ZlIG5ldmVyIHJlc29sdmVzLiAqL1xuICBhc3NlcnQoZmFsc2UsICdTaG91bGQgbmV2ZXIgaGFwcGVuJyk7XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCB0aWNrLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgdGljayBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuZXh0VGlja0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgdG8gbmF0aXZlIHByb21pc2FibGUsIGNvbnZlcnRpbmcge0BsaW5rIFByb21pc2VMaWtlfSAoYWthIFRoZW5hYmxlKSB0byBhIG5hdGl2ZSB7QGxpbmsgUHJvbWlzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIHByb21pc2FibGUgLSBUaGUgcHJvbWlzYWJsZSB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgdmFsdWUgaXRzZWxmIG9yIGEgbmF0aXZlIHtAbGluayBQcm9taXNlfSBpZiB0aGUgdmFsdWUgaXMgYSB7QGxpbmsgUHJvbWlzZUxpa2V9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUHJvbWlzYWJsZTxUPihwcm9taXNhYmxlOiBQcm9taXNhYmxlPFQ+KTogUHJvbWlzZTxUPiB8IFQge1xuICBpZiAoIXByb21pc2FibGUpIHtcbiAgICByZXR1cm4gcHJvbWlzYWJsZTtcbiAgfVxuXG4gIGlmIChwcm9taXNhYmxlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgIHJldHVybiBwcm9taXNhYmxlIGFzIFByb21pc2U8VD47XG4gIH1cblxuICBpZiAoKHByb21pc2FibGUgYXMgUGFydGlhbDxQcm9taXNlTGlrZTxUPj4pLnRoZW4pIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb21pc2FibGUpO1xuICB9XG5cbiAgcmV0dXJuIHByb21pc2FibGUgYXMgVDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHF1ZXVlIG1pY3JvdGFzay5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IHF1ZXVlIG1pY3JvdGFzayBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBxdWV1ZU1pY3JvdGFza0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgcmVxdWVzdCBhbmltYXRpb24gZnJhbWUuXG4gKlxuICogQHBhcmFtIGZhbGxiYWNrVGltZW91dEluTWlsbGlzZWNvbmRzIC0gVGhlIGZhbGxiYWNrIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHJlc29sdmUgdGhlIHByb21pc2UgaWYgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgZG9lcyBub3QgZmlyZSAoZS5nLiB0aGUgd2luZG93IGlzIG5vdCBhY3RpdmUpLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gYDEwMGAgbWlsbGlzZWNvbmRzLiBVc2UgYDBgIHRvIGRpc2FibGUgdGhlIGZhbGxiYWNrLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCByZXF1ZXN0IGFuaW1hdGlvbiBmcmFtZSBpcyBhdmFpbGFibGUgKG9yIHdoZW4gdGhlIGZhbGxiYWNrIHRpbWUgaXMgcmVhY2hlZCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWVBc3luYyhmYWxsYmFja1RpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXF1ZXN0QW5pbWF0aW9uRnJhbWVBc3luY1Byb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBERUZBVUxUX0ZBTExCQUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTAwO1xuICBmYWxsYmFja1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA/Pz0gREVGQVVMVF9GQUxMQkFDS19USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtyZXF1ZXN0QW5pbWF0aW9uRnJhbWVBc3luY1Byb21pc2UsIGZhbGxiYWNrVGltZW91dEluTWlsbGlzZWNvbmRzID4gMCA/IHNsZWVwKHsgbWlsbGlzZWNvbmRzOiBmYWxsYmFja1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSA6IG5ldmVyRW5kcygpXSk7XG59XG5cbi8qKlxuICogUmV0cmllcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdW50aWwgaXQgcmV0dXJucyBgdHJ1ZWAgb3IgdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgb3IgcmVqZWN0cyB3aGVuIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXRyeVdpdGhUaW1lb3V0KHBhcmFtczogUmV0cnlXaXRoVGltZW91dFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXRyeVdpdGhUaW1lb3V0RGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6cmV0cnlXaXRoVGltZW91dCcpO1xuICBjb25zdCBzdGFja1RyYWNlID0gcGFyYW1zLnN0YWNrVHJhY2UgPz8gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgY29uc3QgREVGQVVMVF9SRVRSWV9PUFRJT05TID0ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzIC0tIEV4dHJhY3RpbmcgbWFnaWMgbnVtYmVyIGFzIGEgY29uc3RhbnQgd291bGQgYmUgcmVwZXRpdGl2ZSwgYXMgdGhlIHZhbHVlIGlzIHVzZWQgb25seSBvbmNlIGFuZCBpdHMgbmFtZSB3b3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJvcGVydHkuXG4gICAgcmV0cnlEZWxheUluTWlsbGlzZWNvbmRzOiAxMDAsXG4gICAgc2hvdWxkUmV0cnlPbkVycm9yOiBmYWxzZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBFeHRyYWN0aW5nIG1hZ2ljIG51bWJlciBhcyBhIGNvbnN0YW50IHdvdWxkIGJlIHJlcGV0aXRpdmUsIGFzIHRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgb25jZSBhbmQgaXRzIG5hbWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHByb3BlcnR5LlxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogNTAwMFxuICB9O1xuICBjb25zdCBmdWxsT3B0aW9ucyA9IHsgLi4uREVGQVVMVF9SRVRSWV9PUFRJT05TLCAuLi5wYXJhbXMucmV0cnlPcHRpb25zIH07XG4gIGZ1bGxPcHRpb25zLmFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGF3YWl0IHJ1bldpdGhUaW1lb3V0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxSdW5XaXRoVGltZW91dFBhcmFtczx2b2lkPj4oe1xuICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJycsIHJldHJ5Rm46IHBhcmFtcy5vcGVyYXRpb25GbiB9LFxuICAgIG9uVGltZW91dDogcGFyYW1zLm9uVGltZW91dCxcbiAgICBhc3luYyBvcGVyYXRpb25GbihhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkQWJvcnRTaWduYWwgPSBhYm9ydFNpZ25hbEFueShmdWxsT3B0aW9ucy5hYm9ydFNpZ25hbCwgYWJvcnRTaWduYWwpO1xuICAgICAgY29tYmluZWRBYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgICAgd2hpbGUgKCFjb21iaW5lZEFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICBsZXQgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlzU3VjY2VzcyA9IGF3YWl0IHBhcmFtcy5vcGVyYXRpb25Gbihjb21iaW5lZEFib3J0U2lnbmFsKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBtaWdodCBjaGFuZ2VkIGluc2lkZSBgZm4oKWAuIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgICAgICAgICBpZiAoY29tYmluZWRBYm9ydFNpZ25hbC5hYm9ydGVkIHx8ICFmdWxsT3B0aW9ucy5zaG91bGRSZXRyeU9uRXJyb3IgfHwgdGVybWluYXRlUmV0cnlFcnJvcnMuaGFzKGVycm9yIGFzIEVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcih7XG4gICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ3JldHJ5V2l0aFRpbWVvdXQgZmFpbGVkJyxcbiAgICAgICAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByaW50RXJyb3IoZXJyb3IpO1xuICAgICAgICAgIGlzU3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N1Y2Nlc3MpIHtcbiAgICAgICAgICBwcmludFdpdGhTdGFja1RyYWNlKHtcbiAgICAgICAgICAgIGFyZ3M6IFt7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbkZuOiBwYXJhbXMub3BlcmF0aW9uRm4sXG4gICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlYnVnZ2VySW5zdGFuY2U6IHJldHJ5V2l0aFRpbWVvdXREZWJ1Z2dlcixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBSZXRyeSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFmdGVyICR7U3RyaW5nKGF0dGVtcHQpfSBhdHRlbXB0c2AsXG4gICAgICAgICAgICBzdGFja1RyYWNlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRXaXRoU3RhY2tUcmFjZSh7XG4gICAgICAgICAgYXJnczogW3tcbiAgICAgICAgICAgIG9wZXJhdGlvbkZuOiBwYXJhbXMub3BlcmF0aW9uRm4sXG4gICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJ1xuICAgICAgICAgIH1dLFxuICAgICAgICAgIGRlYnVnZ2VySW5zdGFuY2U6IHJldHJ5V2l0aFRpbWVvdXREZWJ1Z2dlcixcbiAgICAgICAgICBtZXNzYWdlOiBgUmV0cnkgYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0gY29tcGxldGVkIHVuc3VjY2Vzc2Z1bGx5LiBUcnlpbmcgYWdhaW4gaW4gJHtTdHJpbmcoZnVsbE9wdGlvbnMucmV0cnlEZWxheUluTWlsbGlzZWNvbmRzKX0gbWlsbGlzZWNvbmRzYCxcbiAgICAgICAgICBzdGFja1RyYWNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHNsZWVwKHsgYWJvcnRTaWduYWwsIG1pbGxpc2Vjb25kczogZnVsbE9wdGlvbnMucmV0cnlEZWxheUluTWlsbGlzZWNvbmRzIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJycsXG4gICAgc3RhY2tUcmFjZSxcbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IGZ1bGxPcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICB9KSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBmdW5jdGlvbiB3aXRoIGEgdGltZW91dC4gSWYgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNvbXBsZXRlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUsIGl0IGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSB0aW1lZCBvdXQuXG4gKlxuICogSWYgYERFQlVHPW9ic2lkaWFuLWRldi11dGlsczpBc3luYzpydW5XaXRoVGltZW91dGAgaXMgc2V0LCB0aGUgZXhlY3V0aW9uIGlzIG5vdCB0ZXJtaW5hdGVkIGFmdGVyIHRoZSB0aW1lb3V0IGFuZCB0aGUgZnVuY3Rpb24gaXMgYWxsb3dlZCB0byBydW4gaW5kZWZpbml0ZWx5LlxuICpcbiAqIEB0eXBlUGFyYW0gUmVzdWx0IC0gVGhlIHR5cGUgb2YgdGhlIHJlc3VsdCBmcm9tIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gb3IgcmVqZWN0cyBpZiBpdCB0aW1lcyBvdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoVGltZW91dDxSZXN1bHQ+KHBhcmFtczogUnVuV2l0aFRpbWVvdXRQYXJhbXM8UmVzdWx0Pik6IFByb21pc2U8UmVzdWx0PiB7XG4gIGNvbnN0IHN0YWNrVHJhY2UgPSBwYXJhbXMuc3RhY2tUcmFjZSA/PyBnZXRTdGFja1RyYWNlKDEpO1xuICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICBjb25zdCBydW5BYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHRpbWVvdXRBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgbGV0IHJlc3VsdDogbnVsbCB8IFJlc3VsdCA9IG51bGw7XG4gIGxldCBoYXNSZXN1bHQgPSBmYWxzZTtcbiAgbGV0IGlzQ29tcGxldGVkID0gZmFsc2U7XG4gIGNvbnN0IHJ1bldpdGhUaW1lb3V0RGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6cnVuV2l0aFRpbWVvdXQnKTtcbiAgY29uc3Qgb25UaW1lb3V0ID0gcGFyYW1zLm9uVGltZW91dCA/PyBkZWZhdWx0T25UaW1lb3V0O1xuXG4gIGF3YWl0IFByb21pc2UucmFjZShbcnVuKCksIGlubmVyVGltZW91dCgpXSk7XG4gIC8vIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZCBpZiB0aGUgcnVuIGZpbmlzaGVkIG9uIGl0cyBvd24uIFdoZW4gdGhlIHRpbWVvdXQgdGVybWluYXRlZCBpdCwgdGhlXG4gIC8vIE9wZXJhdGlvbiBtaWdodCBzdGlsbCByZXNvbHZlIGFmdGVyd2FyZHMgKGUuZy4gYSByZXRyeSBsb29wIHRoYXQgZXhpdHMgb24gYWJvcnQpLCBidXQgdGhhdCB2YWx1ZVxuICAvLyBJcyBwYXN0IHRoZSBkZWFkbGluZSBhbmQgbXVzdCBiZSB0cmVhdGVkIGFzIGEgZmFpbHVyZSwgbm90IGEgc3VjY2Vzcy5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gQm90aCBtaWdodCBjaGFuZ2UgaW5zaWRlIGBydW4oKWAvYGlubmVyVGltZW91dCgpYC4gRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICBpZiAoaGFzUmVzdWx0ICYmICFydW5BYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICByZXR1cm4gcmVzdWx0IGFzIFJlc3VsdDtcbiAgfVxuXG4gIHRocm93IG5ldyBDdXN0b21TdGFja1RyYWNlRXJyb3Ioe1xuICAgIGNhdXNlOiBydW5BYm9ydENvbnRyb2xsZXIuc2lnbmFsLnJlYXNvbixcbiAgICBtZXNzYWdlOiAnUnVuIHdpdGggdGltZW91dCBmYWlsZWQnLFxuICAgIHN0YWNrVHJhY2VcbiAgfSk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBwYXJhbXMub3BlcmF0aW9uRm4ocnVuQWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IE1hdGgudHJ1bmMocGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWUpO1xuICAgICAgcHJpbnRXaXRoU3RhY2tUcmFjZSh7XG4gICAgICAgIGFyZ3M6IFt7XG4gICAgICAgICAgY29udGV4dDogcGFyYW1zLmNvbnRleHQsXG4gICAgICAgICAgb3BlcmF0aW9uRm46IHBhcmFtcy5vcGVyYXRpb25GbixcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJ1xuICAgICAgICB9XSxcbiAgICAgICAgZGVidWdnZXJJbnN0YW5jZTogcnVuV2l0aFRpbWVvdXREZWJ1Z2dlcixcbiAgICAgICAgbWVzc2FnZTogYEV4ZWN1dGlvbiB0aW1lOiAke1N0cmluZyhkdXJhdGlvbil9IG1pbGxpc2Vjb25kc2AsXG4gICAgICAgIHN0YWNrVHJhY2VcbiAgICAgIH0pO1xuICAgICAgaGFzUmVzdWx0ID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBydW5BYm9ydENvbnRyb2xsZXIuYWJvcnQoZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgIHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdDb21wbGV0ZWQnKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW5uZXJUaW1lb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHNsZWVwKHsgYWJvcnRTaWduYWw6IHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuc2lnbmFsLCBtaWxsaXNlY29uZHM6IHBhcmFtcy50aW1lb3V0SW5NaWxsaXNlY29uZHMgfSk7XG5cbiAgICBpZiAoaXNDb21wbGV0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb24gPSBNYXRoLnRydW5jKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lKTtcbiAgICBwcmludFdpdGhTdGFja1RyYWNlKHtcbiAgICAgIGFyZ3M6IFt7XG4gICAgICAgIGNvbnRleHQ6IHBhcmFtcy5jb250ZXh0LFxuICAgICAgICBvcGVyYXRpb25GbjogcGFyYW1zLm9wZXJhdGlvbkZuLFxuICAgICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJ1xuICAgICAgfV0sXG4gICAgICBkZWJ1Z2dlckluc3RhbmNlOiBydW5XaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgbWVzc2FnZTogYFRpbWVkIG91dCBhZnRlciAke1N0cmluZyhkdXJhdGlvbil9IG1pbGxpc2Vjb25kc2AsXG4gICAgICBzdGFja1RyYWNlXG4gICAgfSk7XG5cbiAgICBjb25zdCB0aW1lb3V0Q29udGV4dDogVGltZW91dENvbnRleHQgPSBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VGltZW91dENvbnRleHQ+KHtcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgb25PcGVyYXRpb25Db21wbGV0ZWQoY2FsbGJhY2spIHtcbiAgICAgICAgdGltZW91dEFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBjYWxsYmFjayk7XG4gICAgICB9LFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJycsXG4gICAgICB0ZXJtaW5hdGVPcGVyYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBUaW1lZCBvdXQgYWZ0ZXIgJHtTdHJpbmcoZHVyYXRpb24pfSBtaWxsaXNlY29uZHNgKTtcbiAgICAgICAgcnVuQWJvcnRDb250cm9sbGVyLmFib3J0KGVycm9yKTtcbiAgICAgICAgdGltZW91dEFib3J0Q29udHJvbGxlci5hYm9ydChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBvblRpbWVvdXQodGltZW91dENvbnRleHQpO1xuICAgIGF3YWl0IHdhaXRGb3JBYm9ydCh0aW1lb3V0QWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0T25UaW1lb3V0KGN0eDogVGltZW91dENvbnRleHQpOiB2b2lkIHtcbiAgICBjdHgudGVybWluYXRlT3BlcmF0aW9uKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHNldCBpbW1lZGlhdGUuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCBzZXQgaW1tZWRpYXRlIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldEltbWVkaWF0ZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxheXMgZXhlY3V0aW9uIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSBkZWxheSAtIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0VGltZW91dEFzeW5jKGRlbGF5PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgd2luZG93LnNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxheXMgZXhlY3V0aW9uIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAocGFyYW1zOiBTbGVlcFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgbWlsbGlzZWNvbmRzLFxuICAgIHNob3VsZFRocm93T25BYm9ydFxuICB9ID0gcGFyYW1zO1xuICBhd2FpdCB3YWl0Rm9yQWJvcnQoYWJvcnRTaWduYWxBbnkoYWJvcnRTaWduYWwsIGFib3J0U2lnbmFsVGltZW91dChtaWxsaXNlY29uZHMpKSk7XG4gIGlmIChzaG91bGRUaHJvd09uQWJvcnQpIHtcbiAgICBhYm9ydFNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZWplY3RzIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZW91dCBwZXJpb2QuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IGFsd2F5cyByZWplY3RzIHdpdGggYSB0aW1lb3V0IGVycm9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGltZW91dChwYXJhbXM6IFRpbWVvdXRQYXJhbXMpOiBQcm9taXNlPG5ldmVyPiB7XG4gIGNvbnN0IHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBzaG91bGRUaHJvd09uQWJvcnQsXG4gICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gIH0gPSBwYXJhbXM7XG4gIGF3YWl0IHNsZWVwKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTbGVlcFBhcmFtcz4oe1xuICAgIGFib3J0U2lnbmFsLFxuICAgIG1pbGxpc2Vjb25kczogdGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIHNob3VsZFRocm93T25BYm9ydFxuICB9KSk7XG4gIHRocm93IG5ldyBFcnJvcihgVGltZWQgb3V0IGluICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kc2ApO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBhbiBhcnJheSBieSBjb25zdW1pbmcgYWxsIGl0cyBlbGVtZW50cy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBwcm9kdWNlZCBieSB0aGUgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yLlxuICogQHBhcmFtIGl0ZXIgLSBUaGUgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdG9BcnJheTxUPihpdGVyOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VD4pOiBQcm9taXNlPFRbXT4ge1xuICBjb25zdCBhcnI6IFRbXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgaXRlcikge1xuICAgIGFyci5wdXNoKGl0ZW0pO1xuICB9XG4gIHJldHVybiBhcnI7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMEJBQTBCO0FBQ25DO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQ0FBbUM7QUFDNUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFnRFAsZUFBc0IsZ0JBQWdCLFNBQWlDLFlBQW9DO0FBQ3pHLGlCQUFlLGNBQWMsQ0FBQztBQUM5QixNQUFJO0FBQ0YsVUFBTSxRQUFRO0FBQUEsRUFDaEIsU0FBUyxZQUFZO0FBQ25CLFVBQU0sZUFBZSxJQUFJLHNCQUFzQjtBQUFBLE1BQzdDLE9BQU87QUFBQSxNQUNQLFNBQVM7QUFBQSxNQUNUO0FBQUEsSUFDRixDQUFDO0FBQ0QsUUFBSSxrQkFBa0IsWUFBWSxHQUFHO0FBQ25DO0FBQUEsSUFDRjtBQUNBLHdCQUFvQixZQUFZO0FBQUEsRUFDbEM7QUFDRjtBQVVBLGVBQXNCLFlBQWUsS0FBVSxXQUF1RjtBQUNwSSxRQUFNLE1BQVcsQ0FBQztBQUVsQixRQUFNLFNBQVMsSUFBSTtBQUNuQixXQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsS0FBSztBQUMvQixRQUFJLENBQUMsT0FBTyxPQUFPLEtBQUssQ0FBQyxHQUFHO0FBQzFCO0FBQUEsSUFDRjtBQUVBLFVBQU0sT0FBTyxJ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