@omujs/omu 0.9.33 → 0.9.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -1076,7 +1076,7 @@ class EventEmitter {
1076
1076
  }
1077
1077
 
1078
1078
  // src/version.ts
1079
- var VERSION = "0.9.32";
1079
+ var VERSION = "0.9.40";
1080
1080
 
1081
1081
  // src/network/connection.ts
1082
1082
  class PacketMapper {
@@ -1715,7 +1715,7 @@ var FILE_ARRAY_SERIALIZER = new Serializer((files) => {
1715
1715
  reader.finish();
1716
1716
  return files;
1717
1717
  });
1718
- var ASSET_PERMISSION_ID = ASSET_EXTENSION_TYPE;
1718
+ var ASSET_PERMISSION_ID = ASSET_EXTENSION_TYPE.join("permission");
1719
1719
  var ASSET_UPLOAD_ENDPOINT = EndpointType.createSerialized(ASSET_EXTENSION_TYPE, {
1720
1720
  name: "upload",
1721
1721
  requestSerializer: FILE_SERIALIZER,
@@ -1759,9 +1759,9 @@ class AssetExtension {
1759
1759
  omu.network.event.disconnected.listen(() => {
1760
1760
  this.assetToken = undefined;
1761
1761
  });
1762
- omu.network.addTask(async () => {
1762
+ omu.onReady(async () => {
1763
1763
  if (omu.permissions.required(ASSET_PERMISSION_ID)) {
1764
- this.requestGenerateAssetToken();
1764
+ await this.requestGenerateAssetToken();
1765
1765
  }
1766
1766
  });
1767
1767
  }
@@ -4999,5 +4999,5 @@ export {
4999
4999
  App
5000
5000
  };
5001
5001
 
5002
- //# debugId=F212AAA16C9219A364756E2164756E21
5003
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2lkZW50aWZpZXIudHMiLCAiLi4vLi4vc3JjL2FwcC50cyIsICIuLi8uLi9zcmMvY29uc3QudHMiLCAiLi4vLi4vc3JjL3NlcmlhbGl6ZS9zZXJpYWxpemVyLnRzIiwgIi4uLy4uL3NyYy9zZXJpYWxpemUvYnl0ZWJ1ZmZlci50cyIsICIuLi8uLi9zcmMvbmV0d29yay9wYWNrZXQvcGFja2V0LnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMudHMiLCAiLi4vLi4vc3JjL2Vycm9ycy50cyIsICIuLi8uLi9zcmMvbmV0d29yay9mcmFtZS10cmFuc3BvcnQudHMiLCAiLi4vLi4vc3JjL2V2ZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy92ZXJzaW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL2Nvbm5lY3Rpb24udHMiLCAiLi4vLi4vc3JjL25ldHdvcmsvZW5jcnlwdGlvbi50cyIsICIuLi8uLi9zcmMvbmV0d29yay9uZXR3b3JrLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3dlYnNvY2tldC10cmFuc3BvcnQudHMiLCAiLi4vLi4vc3JjL2FwaS9leHRlbnNpb24tcmVnaXN0cnkudHMiLCAiLi4vLi4vc3JjL2FwaS9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9lbmRwb2ludC9lbmRwb2ludC50cyIsICIuLi8uLi9zcmMvYXBpL2Fzc2V0L2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3JlZ2lzdHJ5L3JlZ2lzdHJ5LnRzIiwgIi4uLy4uL3NyYy9hcGkvdGFibGUvdGFibGUudHMiLCAiLi4vLi4vc3JjL2FwaS9kYXNoYm9hcmQvcGFja2V0cy50cyIsICIuLi8uLi9zcmMvYXBpL2Rhc2hib2FyZC9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9lbmRwb2ludC9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvZW5kcG9pbnQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvaHR0cC9odHRwLnRzIiwgIi4uLy4uL3NyYy9hcGkvaHR0cC93ZWJzb2NrZXQudHMiLCAiLi4vLi4vc3JjL2FwaS9odHRwL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvbG9jay50cyIsICIuLi8uLi9zcmMvYXBpL3JlZ2lzdHJ5L3BhY2tldHMudHMiLCAiLi4vLi4vc3JjL2FwaS9yZWdpc3RyeS9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9pMThuL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL2xvZ2dlci9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvbG9nZ2VyL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3Blcm1pc3Npb24vcGVybWlzc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3Blcm1pc3Npb24vZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvcGx1Z2luL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3RhYmxlL3BhY2tldHMudHMiLCAiLi4vLi4vc3JjL2FwaS90YWJsZS9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9zZXJ2ZXIvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvc2Vzc2lvbi9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9zaWduYWwvcGFja2V0cy50cyIsICIuLi8uLi9zcmMvYXBpL3NpZ25hbC9zaWduYWwudHMiLCAiLi4vLi4vc3JjL2FwaS9zaWduYWwvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9oZWxwZXIudHMiLCAiLi4vLi4vc3JjL3Rva2VuLnRzIiwgIi4uLy4uL3NyYy9vbXUudHMiLCAiLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4vYXBwJztcblxuY29uc3QgTkFNRVNQQUNFX1JFR0VYID0gL14oXFwuW14vOi5dfFtcXHctXSkrJC87XG5jb25zdCBOQU1FX1JFR0VYID0gL15bXi86XSskLztcblxuZXhwb3J0IHR5cGUgSW50b0lkID0gSWRlbnRpZmllciB8IHN0cmluZyB8IEV4dGVuc2lvblR5cGUgfCBBcHA7XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZ1tdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgICAgICAuLi5wYXRoOiBzdHJpbmdbXVxuICAgICkge1xuICAgICAgICBJZGVudGlmaWVyLnZhbGlkYXRlKG5hbWVzcGFjZSwgcGF0aCk7XG4gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllci5rZXkoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGpzb246IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tSnNvbihqc29uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb20oaWQ6IEludG9JZCk6IElkZW50aWZpZXIge1xuICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQgaW5zdGFuY2VvZiBBcHApIHtcbiAgICAgICAgICAgIHJldHVybiBpZC5pZDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tS2V5KGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBpbmZlclxuICAgICAgICAgICAgLy8gVml0ZSBkb2VzIG5vdCBwcmVzZXJ2ZSBjbGFzcyBpbmZvcm1hdGlvbiB3aGVuIGltcG9ydGluZyBmcm9tIGRpZmZlcmVudCBwYWNrYWdlc1xuICAgICAgICAgICAgY29uc3QgaWRDYXN0ZWQgPSBpZCBhcyB7IG5hbWVzcGFjZTogc3RyaW5nOyBwYXRoOiBzdHJpbmdbXSB9O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiBpZENhc3RlZC5uYW1lc3BhY2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpZENhc3RlZC5wYXRoKSAmJlxuICAgICAgICAgICAgICAgIGlkQ2FzdGVkLnBhdGguZXZlcnkoKHApID0+IHR5cGVvZiBwID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihpZENhc3RlZC5uYW1lc3BhY2UsIC4uLmlkQ2FzdGVkLnBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaWRXaXRoSWQgPSBpZCBhcyB7IGlkOiBJbnRvSWQgfCB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWRXaXRoSWQuaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbShpZFdpdGhJZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IHRvIElkZW50aWZpZXI6ICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21PcHRpb25hbChpZDogSW50b0lkIHwgdW5kZWZpbmVkIHwgbnVsbCk6IElkZW50aWZpZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tKGlkKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGUobmFtZXNwYWNlOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbmFtZXNwYWNlOiBOYW1lc3BhY2UgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGF0aDogUGF0aCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5hbWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU5BTUVTUEFDRV9SRUdFWC50ZXN0KG5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuYW1lc3BhY2U6IE5hbWVzcGFjZSBtdXN0IG1hdGNoICR7TkFNRVNQQUNFX1JFR0VYfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBwYXRoKSB7XG4gICAgICAgICAgICBpZiAoIU5BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXRoOiBOYW1lIG11c3QgbWF0Y2ggJHtOQU1FX1JFR0VYfSBidXQgZ290ICR7bmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmb3JtYXQobmFtZXNwYWNlOiBzdHJpbmcsIC4uLnBhdGg6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgSWRlbnRpZmllci52YWxpZGF0ZShuYW1lc3BhY2UsIHBhdGgpO1xuICAgICAgICByZXR1cm4gYCR7bmFtZXNwYWNlfToke3BhdGguam9pbignLycpfWA7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21LZXkoa2V5OiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0ga2V5LmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKHNlcGFyYXRvciA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXk6IE5vIHNlcGFyYXRvciBmb3VuZCBpbiAke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoJzonLCBzZXBhcmF0b3IgKyAxKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXk6IE11bHRpcGxlIHNlcGFyYXRvcnMgZm91bmQgaW4gJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID0ga2V5LnNsaWNlKDAsIHNlcGFyYXRvcik7XG4gICAgICAgIGNvbnN0IHBhdGggPSBrZXkuc2xpY2Uoc2VwYXJhdG9yICsgMSk7XG4gICAgICAgIGlmICghbmFtZXNwYWNlIHx8ICFwYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5OiBOYW1lc3BhY2UgYW5kIHBhdGggY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKG5hbWVzcGFjZSwgLi4ucGF0aC5zcGxpdCgnLycpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICBjb25zdCBuYW1lc3BhY2UgPSBJZGVudGlmaWVyLm5hbWVzcGFjZUZyb21VcmwocGFyc2VkVXJsLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXRoID0gcGFyc2VkVXJsLnBhdGhuYW1lLnNsaWNlKDEpLnNwbGl0KCcvJyk7XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihuYW1lc3BhY2UsIC4uLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbmFtZXNwYWNlRnJvbVVybCh1cmw6IHN0cmluZyB8IFVSTCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlZC5ob3N0bmFtZS5zcGxpdCgnLicpLnJldmVyc2UoKS5qb2luKCcuJyk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXkoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpzb24oanNvbjogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb21LZXkoanNvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGtleSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mb3JtYXQodGhpcy5uYW1lc3BhY2UsIC4uLnRoaXMucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWwob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5KCkgPT09IG90aGVyLmtleSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc05hbWVzcGFjZUVxdWFsKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZSA9PT0gb3RoZXIubmFtZXNwYWNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1N1YnBhdGhPZihvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5uYW1lc3BhY2UgIT09IG90aGVyLm5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhdGgubGVuZ3RoIDwgb3RoZXIucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG90aGVyLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhdGhbaV0gIT09IG90aGVyLnBhdGhbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW4oLi4ucGF0aDogc3RyaW5nW10pOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKHRoaXMubmFtZXNwYWNlLCAuLi50aGlzLnBhdGgsIC4uLnBhdGgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJNYXA8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFwOiBNYXA8c3RyaW5nLCBUPiA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZW50cmllcz86IEl0ZXJhYmxlPFtJZGVudGlmaWVyLCBUXT4sXG4gICAgKSB7XG4gICAgICAgIGlmICghZW50cmllcykgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChpZC5rZXkoKSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoaWRlbnRpZmllcjogSWRlbnRpZmllciwgdmFsdWU6IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0KGlkZW50aWZpZXIua2V5KCksIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmhhcyhpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuZGVsZXRlKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMubWFwLmtleXMoKSkge1xuICAgICAgICAgICAgeWllbGQgSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHVibGljICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIFRdPiB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMubWFwLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW0lkZW50aWZpZXIuZnJvbUtleShrZXkpLCB2YWx1ZV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgVF0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJTZXQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuYWRkKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQuaGFzKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5kZWxldGUoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqa2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPElkZW50aWZpZXI+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5zZXQua2V5cygpKSB7XG4gICAgICAgICAgICB5aWVsZCBJZGVudGlmaWVyLmZyb21LZXkoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgSWRlbnRpZmllcl0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5zZXQua2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgICAgICB5aWVsZCBbaWRlbnRpZmllciwgaWRlbnRpZmllcl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgSWRlbnRpZmllcl0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgTG9jYWxlIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vbG9jYWxlLmpzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxpemVkVGV4dCB9IGZyb20gJy4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5cbmV4cG9ydCB0eXBlIEFwcE1ldGFkYXRhID0ge1xuICAgIGxvY2FsZTogTG9jYWxlO1xuICAgIG5hbWU/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGljb24/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGRlc2NyaXB0aW9uPzogTG9jYWxpemVkVGV4dDtcbiAgICBpbWFnZT86IExvY2FsaXplZFRleHQ7XG4gICAgc2l0ZT86IExvY2FsaXplZFRleHQ7XG4gICAgcmVwb3NpdG9yeT86IExvY2FsaXplZFRleHQ7XG4gICAgYXV0aG9ycz86IExvY2FsaXplZFRleHQ7XG4gICAgbGljZW5zZT86IExvY2FsaXplZFRleHQ7XG4gICAgdGFncz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgQXBwVHlwZSA9ICdhcHAnIHwgJ3NlcnZpY2UnIHwgJ3JlbW90ZScgfCAncGx1Z2luJyB8ICdkYXNoYm9hcmQnO1xuXG5leHBvcnQgdHlwZSBEZXBlbmRlbmN5U3BlY2lmaWVyID0ge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBpbmRleD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFwcEpzb24gPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBBcHBUeXBlO1xuICAgIHBhcmVudF9pZD86IHN0cmluZztcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xufTtcblxuZXhwb3J0IGNsYXNzIEFwcCB7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyO1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBBcHBUeXBlO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXJlbnRJZD86IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHVybD86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBEZXBlbmRlbmN5U3BlY2lmaWVyIHwgc3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBJbnRvSWQsIG9wdGlvbnM6IHtcbiAgICAgICAgdHlwZT86IEFwcFR5cGU7XG4gICAgICAgIHBhcmVudElkPzogSW50b0lkO1xuICAgICAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgICAgICB1cmw/OiBzdHJpbmc7XG4gICAgICAgIG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgICAgIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5pZCA9IElkZW50aWZpZXIuZnJvbShpZCk7XG4gICAgICAgIHRoaXMucGFyZW50SWQgPSBJZGVudGlmaWVyLmZyb21PcHRpb25hbChvcHRpb25zLnBhcmVudElkKTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uO1xuICAgICAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICAgICAgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlID8/ICdhcHAnO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG9wdGlvbnMuZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaW5mbzogQXBwSnNvbik6IEFwcCB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGluZm8uaWQpO1xuICAgICAgICByZXR1cm4gbmV3IEFwcChpZCwge1xuICAgICAgICAgICAgcGFyZW50SWQ6IElkZW50aWZpZXIuZnJvbU9wdGlvbmFsKGluZm8ucGFyZW50X2lkKSxcbiAgICAgICAgICAgIHZlcnNpb246IGluZm8udmVyc2lvbixcbiAgICAgICAgICAgIHVybDogaW5mby51cmwsXG4gICAgICAgICAgICB0eXBlOiBpbmZvLnR5cGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogaW5mby5tZXRhZGF0YSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogaW5mby5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IEFwcCk6IEFwcEpzb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGRhdGEuaWQua2V5KCksXG4gICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICBwYXJlbnRfaWQ6IGRhdGEucGFyZW50SWQ/LmtleSgpLFxuICAgICAgICAgICAgdmVyc2lvbjogZGF0YS52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBkYXRhLnVybCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBkYXRhLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBkYXRhLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgam9pbiguLi5wYXRoczogc3RyaW5nW10pOiBBcHAge1xuICAgICAgICByZXR1cm4gbmV3IEFwcCh0aGlzLmlkLmpvaW4oLi4ucGF0aHMpLCB7XG4gICAgICAgICAgICBwYXJlbnRJZDogdGhpcy5wYXJlbnRJZCxcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogdGhpcy5kZXBlbmRlbmNpZXMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IGNvbnN0IHRleHRFbmNvZGVyOiBUZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuZXhwb3J0IGNvbnN0IHRleHREZWNvZGVyOiBUZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi9jb25zdC5qcyc7XG5cbmV4cG9ydCB0eXBlIEpzb25UeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQgfCB7IFtrZXkgaW4gbmV2ZXJdPzogSnNvblR5cGUgfSB8IEpzb25UeXBlW107XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICBzZXJpYWxpemUoZGF0YTogVCk6IEQ7XG4gICAgZGVzZXJpYWxpemUoZGF0YTogRCk6IFQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHNlcmlhbGl6ZTogKGRhdGE6IFQpID0+IEQsXG4gICAgICAgIHB1YmxpYyBkZXNlcmlhbGl6ZTogKGRhdGE6IEQpID0+IFQsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgb2Y8VCwgRD4oc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIEQ+KTogU2VyaWFsaXplcjxULCBEPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBEPihzZXJpYWxpemVyLnNlcmlhbGl6ZSwgc2VyaWFsaXplci5kZXNlcmlhbGl6ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwaXBlPFQsIFIsIEQ+KHNlcjE6IFNlcmlhbGl6YWJsZTxULCBSPiwgc2VyMjogU2VyaWFsaXphYmxlPFIsIEQ+KTogU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcjIuc2VyaWFsaXplKHNlcjEuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXIxLmRlc2VyaWFsaXplKHNlcjIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdHJhbnNmb3JtPFQ+KGZ1bmM6ICh2YWx1ZTogVCkgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgVD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVD4oXG4gICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vb3A8VD4oKTogU2VyaWFsaXplcjxULCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBUPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkPFxuICAgICAgICBLIGV4dGVuZHMga2V5b2YgRCxcbiAgICAgICAgUixcbiAgICA+KFxuICAgICAgICBrZXk6IEssXG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxEW0tdLCBSPixcbiAgICApOiBTZXJpYWxpemVyPFxuICAgICAgICBULFxuICAgICAgICB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH1cbiAgICA+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFxuICAgICAgICAgICAgVCxcbiAgICAgICAgICAgIHsgW1AgaW4ga2V5b2YgRF06IFAgZXh0ZW5kcyBLID8gUiA6IERbUF0gfVxuICAgICAgICA+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemUoZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2VyaWFsaXplZCxcbiAgICAgICAgICAgICAgICAgICAgW2tleV06IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHNlcmlhbGl6ZWRba2V5XSksXG4gICAgICAgICAgICAgICAgfSBhcyB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGFba2V5XSBhcyBSKSxcbiAgICAgICAgICAgICAgICB9IGFzIEQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMganNvbjxUIGV4dGVuZHMgSnNvblR5cGU+KCk6IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGV4dEVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeSh0aGlzLnNlcmlhbGl6ZShkYXRhKSkpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BcnJheSgpOiBTZXJpYWxpemVyPFRbXSwgRFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxUW10sIERbXT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuc2VyaWFsaXplKGl0ZW0pKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLm1hcCgoaXRlbSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShpdGVtKSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvTWFwKCk6IFNlcmlhbGl6ZXI8TWFwPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIEQ+PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxNYXA8c3RyaW5nLCBUPiwgTWFwPHN0cmluZywgRD4+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgRD4oKTtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHRoaXMuc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgdGhpcy5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmYWxsYmFjayhmYWxsYmFjazogVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFsbGJhY2tNYXAoZmFsbGJhY2s6IChkYXRhOiBELCBlcnJvcjogdW5rbm93bikgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjayhkYXRhLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGlwZTxFPihzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8RCwgRT4pOiBTZXJpYWxpemVyPFQsIEU+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEU+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB0aGlzLmRlc2VyaWFsaXplKHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIsIHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vY29uc3QuanMnO1xuaW1wb3J0IHsgSnNvblR5cGUgfSBmcm9tICcuL3NlcmlhbGl6ZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgRmxhZ3Mge1xuICAgIHByaXZhdGUgdmFsdWU6IG51bWJlcjtcbiAgICBwcml2YXRlIGxlbmd0aDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogeyB2YWx1ZT86IG51bWJlcjsgbGVuZ3RoPzogbnVtYmVyIH0pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9wdGlvbnMudmFsdWUgPz8gMDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRpb25zLmxlbmd0aCA/PyAzMjtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBvc2l0aW9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlICYgKDEgPDwgcG9zaXRpb24pKSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KHBvc2l0aW9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlICYgKDEgPDwgcG9zaXRpb24pKSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaWZTZXQ8VD4ocG9zaXRpb246IG51bWJlciwgY2FsbGJhY2s6ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KHBvc2l0aW9uOiBudW1iZXIsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSB8PSAxIDw8IHBvc2l0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSAmPSB+KDEgPDwgcG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKHdyaXRlcjogQnl0ZVdyaXRlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBiaXRzID0gbmV3IFVpbnQ4QXJyYXkoKHRoaXMubGVuZ3RoICsgNykgLyA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBiaXRzW2ldID0gKHRoaXMudmFsdWUgPj4gKGkgKiA4KSkgJiAweGZmO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci53cml0ZShiaXRzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWQocmVhZGVyOiBCeXRlUmVhZGVyLCBsZW5ndGg6IG51bWJlcik6IEZsYWdzIHtcbiAgICAgICAgbGV0IHZhbHVlID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAobGVuZ3RoICsgNykgLyA4OyBpKyspIHtcbiAgICAgICAgICAgIHZhbHVlIHw9IHJlYWRlci5yZWFkVWludDgoKSA8PCAoaSAqIDgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRmxhZ3MoeyB2YWx1ZSwgbGVuZ3RoIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVhZEZsb2F0MTYoZGF0YVZpZXc6IERhdGFWaWV3LCBvZmZzZXQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc2lnbiA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4ODAwMCkgPyAtMSA6IDE7XG4gICAgY29uc3QgZXhwb25lbnQgPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDdjMDApID4+IDEwO1xuICAgIGNvbnN0IG1hbnRpc3NhID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHgwM2ZmKTtcbiAgICBpZiAoZXhwb25lbnQgPT09IDAgJiYgbWFudGlzc2EgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChleHBvbmVudCA9PT0gMHgxZikge1xuICAgICAgICByZXR1cm4gbWFudGlzc2EgPT09IDAgPyBJbmZpbml0eSAqIHNpZ24gOiBOYU47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEV4cG9uZW50ID0gZXhwb25lbnQgLSAxNTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE1hbnRpc3NhID0gbWFudGlzc2EgLyAxMDI0O1xuICAgICAgICByZXR1cm4gc2lnbiAqIE1hdGgucG93KDIsIG5vcm1hbGl6ZWRFeHBvbmVudCkgKiAoMSArIG5vcm1hbGl6ZWRNYW50aXNzYSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0MTYoZGF0YVZpZXc6IERhdGFWaWV3LCBvZmZzZXQ6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaWduID0gdmFsdWUgPCAwID8gMSA6IDA7XG4gICAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSk7XG4gICAgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMHg3YzAwIHwgKHNpZ24gPDwgMTUpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHBvbmVudCA9IE1hdGguZmxvb3IoTWF0aC5sb2cyKHZhbHVlKSk7XG4gICAgY29uc3QgbWFudGlzc2EgPSB2YWx1ZSAvIE1hdGgucG93KDIsIGV4cG9uZW50KSAtIDE7XG4gICAgY29uc3Qgbm9ybWFsaXplZEV4cG9uZW50ID0gZXhwb25lbnQgKyAxNTtcbiAgICBjb25zdCBub3JtYWxpemVkTWFudGlzc2EgPSBNYXRoLnJvdW5kKG1hbnRpc3NhICogMTAyNCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRFeHBvbmVudCA8PSAwKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIHNpZ24gPDwgMTUpO1xuICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZEV4cG9uZW50ID49IDB4MWYpIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMHg3YzAwIHwgKHNpZ24gPDwgMTUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAoc2lnbiA8PCAxNSkgfCAobm9ybWFsaXplZEV4cG9uZW50IDw8IDEwKSB8IG5vcm1hbGl6ZWRNYW50aXNzYSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQnl0ZVdyaXRlciB7XG4gICAgcHJpdmF0ZSBkYXRhVmlldzogRGF0YVZpZXc7XG4gICAgcHJpdmF0ZSBidWZmZXI6IEFycmF5QnVmZmVyO1xuICAgIHByaXZhdGUgb2Zmc2V0ID0gMDtcbiAgICBwcml2YXRlIGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihpbml0PzogQXJyYXlCdWZmZXIsIG9mZnNldD86IG51bWJlcikge1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldCA/PyAwO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGluaXQgPz8gbmV3IEFycmF5QnVmZmVyKDEwMjQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmZmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VaW50OEFycmF5KGJ1ZmZlcjogVWludDhBcnJheSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgIHVpbnQ4QXJyYXkuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVXcml0ZXIoYXJyYXlCdWZmZXIsIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFsbG9jYXRlKGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIGxlbmd0aCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0J5dGVMZW5ndGggPSBNYXRoLm1heCh0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoICogMiwgdGhpcy5vZmZzZXQgKyBsZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgbmV3QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKG5ld0J5dGVMZW5ndGgpO1xuICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkobmV3QnVmZmVyKS5zZXQobmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIpKTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3QnVmZmVyO1xuICAgICAgICAgICAgdGhpcy5kYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUoZGF0YTogVWludDhBcnJheSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoZGF0YS5sZW5ndGgpO1xuICAgICAgICBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlcikuc2V0KGRhdGEsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUJvb2xlYW4odmFsdWU6IGJvb2xlYW4pOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSA/IDEgOiAwKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50OCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50OCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50OCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDE2KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQxNih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMik7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDE2KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50MzIodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQ2NCh2YWx1ZTogYmlnaW50KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoOCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0QmlnSW50NjQodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDY0KHZhbHVlOiBiaWdpbnQpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg4KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRCaWdVaW50NjQodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVUxFQjEyOCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExFQjEyOFxuICAgICAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHZhbHVlID4gMHg3Zikge1xuICAgICAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsICh2YWx1ZSAmIDB4N2YpIHwgMHg4MCk7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICAgICAgdmFsdWUgPj49IDc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50OCh0aGlzLm9mZnNldCwgdmFsdWUgJiAweDdmKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQxNih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMik7XG4gICAgICAgIHdyaXRlRmxvYXQxNih0aGlzLmRhdGFWaWV3LCB0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRGbG9hdDMyKHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0NjQodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEZsb2F0NjQodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDhBcnJheSh2YWx1ZTogVWludDhBcnJheSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlVUxFQjEyOCh2YWx1ZS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgdGhpcy53cml0ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVN0cmluZyh2YWx1ZTogc3RyaW5nKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMud3JpdGVVaW50OEFycmF5KHRleHRFbmNvZGVyLmVuY29kZSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVKU09OKHZhbHVlOiBKc29uVHlwZSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsYWdzKGZsYWdzOiBGbGFncyk6IEJ5dGVXcml0ZXIge1xuICAgICAgICBmbGFncy53cml0ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmlzaCgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLCAwLCB0aGlzLm9mZnNldCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQnl0ZVJlYWRlciB7XG4gICAgcHJpdmF0ZSBkYXRhVmlldzogRGF0YVZpZXc7XG4gICAgcHJpdmF0ZSBvZmZzZXQ6IG51bWJlcjtcbiAgICBwcml2YXRlIGZpbmlzaGVkOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihkYXRhOiBEYXRhVmlldykge1xuICAgICAgICB0aGlzLmRhdGFWaWV3ID0gZGF0YTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVWludDhBcnJheShidWZmZXI6IFVpbnQ4QXJyYXkpOiBCeXRlUmVhZGVyIHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICB1aW50OEFycmF5LnNldChuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVSZWFkZXIoZGF0YVZpZXcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUFycmF5QnVmZmVyKGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBCeXRlUmVhZGVyIHtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGZyb21CbG9iKGJsb2I6IEJsb2IpOiBQcm9taXNlPEJ5dGVSZWFkZXI+IHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBibG9iLmFycmF5QnVmZmVyKCk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZChzaXplOiBudW1iZXIpOiBVaW50OEFycmF5IHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2l6ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2l6ZSBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0ICsgc2l6ZSA+IHRoaXMuZGF0YVZpZXcuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YVZpZXcuYnVmZmVyLCB0aGlzLm9mZnNldCwgc2l6ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IHNpemU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEJvb2xlYW4oKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50OCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQ4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRVaW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDE2KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDE2KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRVaW50MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQ2NCgpOiBiaWdpbnQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0QmlnSW50NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50NjQoKTogYmlnaW50IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEJpZ1VpbnQ2NCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVMRUIxMjgoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gVW5zaWduZWQgTEVCMTI4XG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICAgIGxldCBzaGlmdCA9IDA7XG4gICAgICAgIGxldCBieXRlOiBudW1iZXI7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCA+PSB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnl0ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgICAgIHZhbHVlIHw9IChieXRlICYgMGIwMTExMTExMSkgPDwgc2hpZnQ7XG4gICAgICAgICAgICBzaGlmdCArPSA3O1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICgoYnl0ZSAmIDBiMTAwMDAwMDApICE9PSAwKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRmxvYXQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYWRGbG9hdDE2KHRoaXMuZGF0YVZpZXcsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRmxvYXQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0RmxvYXQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0NjQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEZsb2F0NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50OEFycmF5KCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWQobGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFN0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBieXRlQXJyYXkgPSB0aGlzLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZUFycmF5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEpTT048VCBleHRlbmRzIEpzb25UeXBlPigpOiBUIHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5yZWFkU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRmxhZ3MobGVuZ3RoOiBudW1iZXIpOiBGbGFncyB7XG4gICAgICAgIHJldHVybiBGbGFncy5yZWFkKHRoaXMsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmlzaCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0ICE9PSB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSnNvblR5cGUsIHR5cGUgU2VyaWFsaXphYmxlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgUGFja2V0RGF0YSA9IHtcbiAgICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZGF0YTogVWludDhBcnJheTtcbn07XG5cbmV4cG9ydCB0eXBlIFBhY2tldDxUID0gdW5rbm93bj4gPSB7XG4gICAgcmVhZG9ubHkgdHlwZTogUGFja2V0VHlwZTxUPjtcbiAgICByZWFkb25seSBkYXRhOiBUO1xufTtcblxuZXhwb3J0IGNsYXNzIFBhY2tldFR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBuZXcoZGF0YTogVCk6IFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIG1hdGNoKHBhY2tldDogUGFja2V0KTogcGFja2V0IGlzIFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiBwYWNrZXQudHlwZSA9PT0gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oaWRlbnRpZmllcjogSWRlbnRpZmllciwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+O1xuICAgIH0pOiBQYWNrZXRUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWNrZXRUeXBlPFQ+KFxuICAgICAgICAgICAgaWRlbnRpZmllci5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyOiBJZGVudGlmaWVyLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICB9KTogUGFja2V0VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFja2V0VHlwZShcbiAgICAgICAgICAgIGlkZW50aWZpZXIuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFwcEpzb24gfSBmcm9tICcuLi8uLi9hcHAuanMnO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSAnLi4vLi4vYXBwLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUvc2VyaWFsaXplci5qcyc7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi9wYWNrZXQuanMnO1xuXG5jb25zdCBJREVOVElGSUVSID0gbmV3IElkZW50aWZpZXIoJ2NvcmUnLCAncGFja2V0Jyk7XG5cbnR5cGUgUHJvdG9jb2xJbmZvID0ge1xuICAgIHZlcnNpb246IHN0cmluZztcbn07XG5cbnR5cGUgUlNBTnVtYmVycyA9IHtcbiAgICBlOiBzdHJpbmc7XG4gICAgbjogc3RyaW5nO1xufTtcblxudHlwZSBFbmNyeXB0aW9uUmVxdWVzdCA9IHtcbiAgICBraW5kOiAndjEnO1xuICAgIHJzYTogUlNBTnVtYmVycztcbn07XG5cbnR5cGUgRW5jcnlwdGlvblJlc3BvbnNlID0ge1xuICAgIGtpbmQ6ICd2MSc7XG4gICAgcnNhOiBSU0FOdW1iZXJzO1xuICAgIGFlczogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2VydmVyTWV0YSA9IHtcbiAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgIGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXF1ZXN0IHwgbnVsbDtcbiAgICBoYXNoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59O1xuXG50eXBlIENvbm5lY3RQYWNrZXRKc29uID0ge1xuICAgIHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gICAgZW5jcnlwdGlvbjogRW5jcnlwdGlvblJlc3BvbnNlIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25uZWN0UGFja2V0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXBwOiBBcHA7XG4gICAgcHVibGljIHJlYWRvbmx5IHRva2VuOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7XG4gICAgICAgIHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgICAgIGFwcDogQXBwO1xuICAgICAgICB0b2tlbjogc3RyaW5nO1xuICAgICAgICBlbmNyeXB0aW9uPzogRW5jcnlwdGlvblJlc3BvbnNlIHwgbnVsbDtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMucHJvdG9jb2wgPSBvcHRpb25zLnByb3RvY29sO1xuICAgICAgICB0aGlzLmFwcCA9IG9wdGlvbnMuYXBwO1xuICAgICAgICB0aGlzLnRva2VuID0gb3B0aW9ucy50b2tlbjtcbiAgICAgICAgdGhpcy5lbmNyeXB0aW9uID0gb3B0aW9ucy5lbmNyeXB0aW9uID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBDb25uZWN0UGFja2V0SnNvbik6IENvbm5lY3RQYWNrZXQge1xuICAgICAgICByZXR1cm4gbmV3IENvbm5lY3RQYWNrZXQoe1xuICAgICAgICAgICAgcHJvdG9jb2w6IGRhdGEucHJvdG9jb2wsXG4gICAgICAgICAgICBhcHA6IEFwcC5kZXNlcmlhbGl6ZShkYXRhLmFwcCksXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBkYXRhLmVuY3J5cHRpb24sXG4gICAgICAgICAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogQ29ubmVjdFBhY2tldCk6IENvbm5lY3RQYWNrZXRKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByb3RvY29sOiBkYXRhLnByb3RvY29sLFxuICAgICAgICAgICAgYXBwOiBBcHAuc2VyaWFsaXplKGRhdGEuYXBwKSxcbiAgICAgICAgICAgIGVuY3J5cHRpb246IGRhdGEuZW5jcnlwdGlvbixcbiAgICAgICAgICAgIHRva2VuOiBkYXRhLnRva2VuLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gRGlzY29ubmVjdFR5cGUge1xuICAgIElOVkFMSURfVE9LRU4gPSAnaW52YWxpZF90b2tlbicsXG4gICAgSU5WQUxJRF9PUklHSU4gPSAnaW52YWxpZF9vcmlnaW4nLFxuICAgIElOVkFMSURfVkVSU0lPTiA9ICdpbnZhbGlkX3ZlcnNpb24nLFxuICAgIElOVkFMSURfUEFDS0VUX1RZUEUgPSAnaW52YWxpZF9wYWNrZXRfdHlwZScsXG4gICAgSU5WQUxJRF9QQUNLRVRfREFUQSA9ICdpbnZhbGlkX3BhY2tldF9kYXRhJyxcbiAgICBJTlZBTElEX1BBQ0tFVCA9ICdpbnZhbGlkX3BhY2tldCcsXG4gICAgSU5URVJOQUxfRVJST1IgPSAnaW50ZXJuYWxfZXJyb3InLFxuICAgIEFOT1RIRVJfQ09OTkVDVElPTiA9ICdhbm90aGVyX2Nvbm5lY3Rpb24nLFxuICAgIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb25fZGVuaWVkJyxcbiAgICBBUFBfUkVNT1ZFRCA9ICdhcHBfcmVtb3ZlZCcsXG4gICAgU0VSVkVSX1JFU1RBUlQgPSAnc2VydmVyX3Jlc3RhcnQnLFxuICAgIFNIVVRET1dOID0gJ3NodXRkb3duJyxcbiAgICBDTE9TRSA9ICdjbG9zZScsXG59XG5cbnR5cGUgRGlzY29ubmVjdFBhY2tldEpzb24gPSB7XG4gICAgdHlwZTogRGlzY29ubmVjdFR5cGU7XG4gICAgbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBEaXNjb25uZWN0UGFja2V0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRGlzY29ubmVjdFR5cGU7XG4gICAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7XG4gICAgICAgIHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgICAgICBtZXNzYWdlPzogc3RyaW5nIHwgbnVsbDtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogRGlzY29ubmVjdFBhY2tldCk6IERpc2Nvbm5lY3RQYWNrZXRKc29uIHtcbiAgICAgICAgcmV0dXJuIGRhdGEudG9Kc29uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBEaXNjb25uZWN0UGFja2V0SnNvbik6IERpc2Nvbm5lY3RQYWNrZXQge1xuICAgICAgICByZXR1cm4gRGlzY29ubmVjdFBhY2tldC5mcm9tSnNvbihkYXRhKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpzb24oZGF0YTogRGlzY29ubmVjdFBhY2tldEpzb24pOiBEaXNjb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBEaXNjb25uZWN0UGFja2V0KHtcbiAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdG9Kc29uKCk6IERpc2Nvbm5lY3RQYWNrZXRKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBQQUNLRVRfVFlQRVM6IHtcbiAgICBTRVJWRVJfTUVUQTogUGFja2V0VHlwZTxTZXJ2ZXJNZXRhPjtcbiAgICBDT05ORUNUOiBQYWNrZXRUeXBlPENvbm5lY3RQYWNrZXQ+O1xuICAgIERJU0NPTk5FQ1Q6IFBhY2tldFR5cGU8RGlzY29ubmVjdFBhY2tldD47XG4gICAgVE9LRU46IFBhY2tldFR5cGU8c3RyaW5nPjtcbiAgICBSRUFEWTogUGFja2V0VHlwZTx1bmRlZmluZWQ+O1xuICAgIEVOQ1JZUFRFRF9QQUNLRVQ6IFBhY2tldFR5cGU8VWludDhBcnJheT47XG59ID0ge1xuICAgIFNFUlZFUl9NRVRBOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248U2VydmVyTWV0YT4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnc2VydmVyX21ldGEnLFxuICAgIH0pLFxuICAgIENPTk5FQ1Q6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxDb25uZWN0UGFja2V0PihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdjb25uZWN0JyxcbiAgICAgICAgc2VyaWFsaXplcjogQ29ubmVjdFBhY2tldCxcbiAgICB9KSxcbiAgICBESVNDT05ORUNUOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248RGlzY29ubmVjdFBhY2tldD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnZGlzY29ubmVjdCcsXG4gICAgICAgIHNlcmlhbGl6ZXI6IERpc2Nvbm5lY3RQYWNrZXQsXG4gICAgfSksXG4gICAgVE9LRU46IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxzdHJpbmc+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3Rva2VuJyxcbiAgICB9KSxcbiAgICBSRUFEWTogUGFja2V0VHlwZS5jcmVhdGVKc29uPHVuZGVmaW5lZD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAncmVhZHknLFxuICAgIH0pLFxuICAgIEVOQ1JZUFRFRF9QQUNLRVQ6IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxVaW50OEFycmF5PihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdlJyxcbiAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wKCksXG4gICAgfSksXG59O1xuIiwKICAgICJpbXBvcnQgeyBEaXNjb25uZWN0VHlwZSB9IGZyb20gJy4vbmV0d29yay9wYWNrZXQvcGFja2V0LXR5cGVzLmpzJztcbmV4cG9ydCBjbGFzcyBPbXVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UgPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc2Nvbm5lY3RSZWFzb24gZXh0ZW5kcyBPbXVFcnJvciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyB0eXBlOiBEaXNjb25uZWN0VHlwZSxcbiAgICAgICAgcHVibGljIG1lc3NhZ2UgPSAnJyxcbiAgICApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2VydmVyUmVzdGFydCBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5TRVJWRVJfUkVTVEFSVCwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQW5vdGhlckNvbm5lY3Rpb24gZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuQU5PVEhFUl9DT05ORUNUSU9OLCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uRGVuaWVkIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLlBFUk1JU1NJT05fREVOSUVELCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBcHBSZW1vdmVkIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLkFQUF9SRU1PVkVELCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVG9rZW4gZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9UT0tFTiwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZE9yaWdpbiBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5JTlZBTElEX09SSUdJTiwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFZlcnNpb24gZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9WRVJTSU9OLCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUGFja2V0IGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLklOVkFMSURfUEFDS0VULCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEVycm9yIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLklOVEVSTkFMX0VSUk9SLCBtZXNzYWdlKTtcbiAgICB9XG59XG4iLAogICAgIlxuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5cbmltcG9ydCB0eXBlIHsgQ29ubmVjdGlvbiwgVHJhbnNwb3J0IH0gZnJvbSAnLi9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2V0LCBQYWNrZXREYXRhIH0gZnJvbSAnLi9wYWNrZXQvcGFja2V0LmpzJztcblxuY29uc3QgRlJBTUVfVFlQRV9LRVkgPSAnb211YXBwcy1mcmFtZSc7XG5cbnR5cGUgQ29tbWFuZCA9ICh7XG4gICAgdHlwZTogJ3N5bic7XG4gICAgcGF5bG9hZDoge1xuICAgICAgICBvcmlnaW46IHN0cmluZztcbiAgICB9O1xufSB8IHtcbiAgICB0eXBlOiAnY29ubmVjdCc7XG4gICAgcGF5bG9hZDogb2JqZWN0O1xufSB8IHtcbiAgICB0eXBlOiAnZGlzY29ubmVjdCc7XG4gICAgcGF5bG9hZDogb2JqZWN0O1xufSB8IHtcbiAgICB0eXBlOiAnc2VuZCc7XG4gICAgcGF5bG9hZDogVWludDhBcnJheTtcbn0gfCB7XG4gICAgdHlwZTogJ3JlY2VpdmUnO1xuICAgIHBheWxvYWQ6IFVpbnQ4QXJyYXk7XG59IHwge1xuICAgIHR5cGU6ICdlcnJvcic7XG4gICAgcGF5bG9hZDogc3RyaW5nO1xufSkgJiB7XG4gICAgdHlwZV9rZXk/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgRnJhbWVUcmFuc3BvcnQgaW1wbGVtZW50cyBUcmFuc3BvcnQge1xuICAgIHB1YmxpYyBjb25uZWN0KCk6IFByb21pc2U8RnJhbWVDb25uZWN0aW9uPiB7XG4gICAgICAgIHJldHVybiBGcmFtZUNvbm5lY3Rpb24uY3JlYXRlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRnJhbWVDb25uZWN0aW9uIGltcGxlbWVudHMgQ29ubmVjdGlvbiB7XG4gICAgcHVibGljIGNvbm5lY3RlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIG9yaWdpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRRdWV1ZTogQXJyYXk8UGFja2V0RGF0YT4gPSBbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlbmRRdWV1ZTogQXJyYXk8Q29tbWFuZD4gPSBbXTtcbiAgICBwcml2YXRlIHJlY2VpdmVXYWl0ZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY29ubmVjdGVkV2FpdGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsLFxuICAgICkge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEgPT09IG51bGwgfHwgdHlwZW9mIGV2ZW50LmRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoJ3R5cGVfa2V5JyBpbiBldmVudC5kYXRhKSB8fCBldmVudC5kYXRhLnR5cGVfa2V5ICE9PSBGUkFNRV9UWVBFX0tFWSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBldmVudC5kYXRhIGFzIENvbW1hbmQ7XG4gICAgICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSAnc3luJykge1xuICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luID0gZXZlbnQub3JpZ2luO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gdGhpcy5vcmlnaW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKCk6IFByb21pc2U8RnJhbWVDb25uZWN0aW9uPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxGcmFtZUNvbm5lY3Rpb24+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IEZyYW1lQ29ubmVjdGlvbigoKTogdm9pZCA9PiByZXNvbHZlKGNvbm5lY3Rpb24pKTtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ucG9zdENvbW1hbmQoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb25uZWN0JyxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7fSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUNvbW1hbmQoY29tbWFuZDogQ29tbWFuZCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IHR5cGUsIHBheWxvYWQgfSA9IGNvbW1hbmQ7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3luJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9yaWdpbiA9IHBheWxvYWQub3JpZ2luO1xuICAgICAgICAgICAgICAgIHRoaXMucG9zdENvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3luJyxcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiB3aW5kb3cub3JpZ2luLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29ubmVjdCc6XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3RlZFdhaXRlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RlZFdhaXRlcigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RlZFdhaXRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGlzY29ubmVjdCc6XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlY2VpdmUnOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhY2tldFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiByZWFkZXIucmVhZFN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZWFkZXIuZmluaXNoKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVdhaXRlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHBheWxvYWQpO1xuICAgICAgICAgICAgY2FzZSAnc2VuZCc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcG9zdENvbW1hbmQoY29tbWFuZDogQ29tbWFuZCk6IHZvaWQge1xuICAgICAgICBjb21tYW5kLnR5cGVfa2V5ID0gRlJBTUVfVFlQRV9LRVk7XG4gICAgICAgIGlmICghdGhpcy5vcmlnaW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZFF1ZXVlLnB1c2goY29tbWFuZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBxdWV1ZWRDb21tYW5kIG9mIHRoaXMuc2VuZFF1ZXVlKSB7XG4gICAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHF1ZXVlZENvbW1hbmQsIHRoaXMub3JpZ2luKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbmRRdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKGNvbW1hbmQsIHRoaXMub3JpZ2luKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVjZWl2ZShzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UGFja2V0PHVua25vd24+LCBQYWNrZXREYXRhPik6IFByb21pc2U8UGFja2V0IHwgbnVsbD4ge1xuICAgICAgICBpZiAodGhpcy5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FscmVhZHkgcmVjZWl2aW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMucGFja2V0UXVldWUubGVuZ3RoID09PSAwICYmIHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlciA9ICgpOiB2b2lkID0+IHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5wYWNrZXRRdWV1ZS5zaGlmdCgpISk7XG4gICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlciA9IG51bGw7XG4gICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgfVxuXG4gICAgZ2V0IGNsb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbm5lY3RlZDtcbiAgICB9XG5cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RDb21tYW5kKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGlzY29ubmVjdCcsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDoge30sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIoKTtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZW5kKHBhY2tldDogUGFja2V0LCBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UGFja2V0PHVua25vd24+LCBQYWNrZXREYXRhPik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBjb25uZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXREYXRhID0gc2VyaWFsaXplci5zZXJpYWxpemUocGFja2V0KTtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldERhdGEudHlwZSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkocGFja2V0RGF0YS5kYXRhKTtcbiAgICAgICAgdGhpcy5wb3N0Q29tbWFuZCh7XG4gICAgICAgICAgICB0eXBlOiAnc2VuZCcsXG4gICAgICAgICAgICBwYXlsb2FkOiB3cml0ZXIuZmluaXNoKCksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgVW5saXN0ZW4gPSAoKSA9PiB2b2lkO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFAgZXh0ZW5kcyBBcnJheTxhbnk+PiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnM6IEFycmF5PCguLi5hcmdzOiBQKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4gPSBbXTtcblxuICAgIHB1YmxpYyBsaXN0ZW4obGlzdGVuZXI6ICguLi5hcmdzOiBQKSA9PiBhbnkpOiBVbmxpc3RlbiB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKHRoaXMubGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdCguLi5hcmdzOiBQKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgWy4uLnRoaXMubGlzdGVuZXJzXSkge1xuICAgICAgICAgICAgYXdhaXQgbGlzdGVuZXIoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLAogICAgImV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzAuOS4zMic7XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vc2VyaWFsaXplJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrZXQsIFBhY2tldERhdGEsIFBhY2tldFR5cGUgfSBmcm9tICcuL3BhY2tldCc7XG5cbmV4cG9ydCBjbGFzcyBQYWNrZXRNYXBwZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGU8UGFja2V0LCBQYWNrZXREYXRhPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRNYXAgPSBuZXcgSWRlbnRpZmllck1hcDxQYWNrZXRUeXBlPHVua25vd24+PigpO1xuXG4gICAgcHVibGljIHJlZ2lzdGVyKC4uLnBhY2tldFR5cGVzOiBQYWNrZXRUeXBlPHVua25vd24+W10pOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHBhY2tldFR5cGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWNrZXRNYXAuaGFzKHR5cGUuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYWNrZXQgaWQgJHt0eXBlLmlkLmtleSgpfSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGFja2V0TWFwLnNldCh0eXBlLmlkLCB0eXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlcmlhbGl6ZShwYWNrZXQ6IFBhY2tldCk6IFBhY2tldERhdGEge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogcGFja2V0LnR5cGUuaWQua2V5KCksXG4gICAgICAgICAgICBkYXRhOiBwYWNrZXQudHlwZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShwYWNrZXQuZGF0YSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZGVzZXJpYWxpemUoZGF0YTogUGFja2V0RGF0YSk6IFBhY2tldCB7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBJZGVudGlmaWVyLmZyb21LZXkoZGF0YS50eXBlKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMucGFja2V0TWFwLmdldChpZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKCF0eXBlKSB0aHJvdyBuZXcgRXJyb3IoYFBhY2tldCB0eXBlICR7ZGF0YS50eXBlfSBub3QgcmVnaXN0ZXJlZGApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGRhdGE6IHR5cGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkYXRhLmRhdGEpLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BvcnQge1xuICAgIGNvbm5lY3QoKTogUHJvbWlzZTxDb25uZWN0aW9uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uIHtcbiAgICBzZW5kKHBhY2tldDogUGFja2V0LCBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UGFja2V0LCBQYWNrZXREYXRhPik6IHZvaWQ7XG4gICAgcmVjZWl2ZShzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UGFja2V0LCBQYWNrZXREYXRhPik6IFByb21pc2U8UGFja2V0IHwgbnVsbD47XG4gICAgY2xvc2UoKTogdm9pZDtcbiAgICBjbG9zZWQ6IGJvb2xlYW47XG59XG4iLAogICAgImltcG9ydCB7IHRleHREZWNvZGVyLCB0ZXh0RW5jb2RlciB9IGZyb20gJy4uL2NvbnN0JztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgUGFja2V0LCBQYWNrZXREYXRhIH0gZnJvbSAnLi9wYWNrZXQnO1xuaW1wb3J0IHsgUEFDS0VUX1RZUEVTIH0gZnJvbSAnLi9wYWNrZXQvcGFja2V0LXR5cGVzJztcblxuZnVuY3Rpb24gYmFzZTY0VXJsRW5jb2RlKGJ1ZmZlcjogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJ1ZmZlclxuICAgICAgICAudG9CYXNlNjQoKVxuICAgICAgICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnXycpXG4gICAgICAgIC5yZXBsYWNlKC89L2csICcnKTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0VXJsRGVjb2RlKGRhdGE6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XG4gICAgd2hpbGUgKGRhdGEubGVuZ3RoICUgNCkge1xuICAgICAgICBkYXRhICs9ICc9JztcbiAgICB9XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbUJhc2U2NChkYXRhKTtcbn1cblxuZnVuY3Rpb24gY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKHU4OiBVaW50OEFycmF5KTogQXJyYXlCdWZmZXIge1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcih1OC5sZW5ndGgpO1xuICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgIHZpZXcuc2V0KHU4KTtcbiAgICByZXR1cm4gYnVmO1xufVxuXG50eXBlIFJTQU51bWJlcnMgPSB7XG4gICAgZTogc3RyaW5nO1xuICAgIG46IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEVuY3J5cHRpb25SZXNwb25zZSA9IHtcbiAgICBraW5kOiAndjEnO1xuICAgIHJzYTogUlNBTnVtYmVycztcbiAgICBhZXM6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBFTkNSWVBUSU9OX0FWQUlMQUJMRTogYm9vbGVhbiA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmICEhY3J5cHRvLnN1YnRsZTtcblxuZXhwb3J0IGNsYXNzIERlY3J5cHRvciB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwcml2YXRlS2V5OiBDcnlwdG9LZXksXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHVibGljS2V5OiBDcnlwdG9LZXksXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBuZXcoKTogUHJvbWlzZTxEZWNyeXB0b3I+IHtcbiAgICAgICAgY29uc3QgeyBwcml2YXRlS2V5LCBwdWJsaWNLZXkgfSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgICAgICBtb2R1bHVzTGVuZ3RoOiA0MDk2LFxuICAgICAgICAgICAgICAgIHB1YmxpY0V4cG9uZW50OiBuZXcgVWludDhBcnJheShbMSwgMCwgMV0pLFxuICAgICAgICAgICAgICAgIGhhc2g6ICdTSEEtMjU2JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gbmV3IERlY3J5cHRvcihwcml2YXRlS2V5LCBwdWJsaWNLZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB0b1JlcXVlc3QoKTogUHJvbWlzZTxSU0FOdW1iZXJzPiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdqd2snLCB0aGlzLnB1YmxpY0tleSk7XG4gICAgICAgIGlmICgha2V5LmUpIHRocm93IG5ldyBFcnJvcignS2V5IGV4cG9ydCBmYWlsZWQ6IG1pc3NpbmcgZXhwb25lbnQnKTtcbiAgICAgICAgaWYgKCFrZXkubikgdGhyb3cgbmV3IEVycm9yKCdLZXkgZXhwb3J0IGZhaWxlZDogbWlzc2luZyBtb2R1bHVzJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlOiBrZXkuZSxcbiAgICAgICAgICAgIG46IGtleS5uLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWNyeXB0KGRhdGE6IEFycmF5QnVmZmVyKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xuICAgICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAgICB7IG5hbWU6ICdSU0EtT0FFUCcgfSxcbiAgICAgICAgICAgIHRoaXMucHJpdmF0ZUtleSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBkZWNyeXB0ZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlY3J5cHRTdHJpbmcoZGF0YTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICAgICAgeyBuYW1lOiAnUlNBLU9BRVAnIH0sXG4gICAgICAgICAgICB0aGlzLnByaXZhdGVLZXksXG4gICAgICAgICAgICBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIoYmFzZTY0VXJsRGVjb2RlKGRhdGEpKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRleHREZWNvZGVyLmRlY29kZShkZWNyeXB0ZWQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuY3J5cHRvciB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwdWJsaWNLZXk6IENyeXB0b0tleSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIG5ldyhyZXF1ZXN0OiBSU0FOdW1iZXJzKTogUHJvbWlzZTxFbmNyeXB0b3I+IHtcbiAgICAgICAgY29uc3QgcHVibGljS2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICAgICAgICAnandrJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGc6ICdSU0EtT0FFUC0yNTYnLFxuICAgICAgICAgICAgICAgIGV4dDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBrZXlfb3BzOiBbJ2VuY3J5cHQnXSxcbiAgICAgICAgICAgICAgICBrdHk6ICdSU0EnLFxuICAgICAgICAgICAgICAgIGU6IHJlcXVlc3QuZS5yZXBsYWNlKC89KyQvLCAnJyksXG4gICAgICAgICAgICAgICAgbjogcmVxdWVzdC5uLnJlcGxhY2UoLz0rJC8sICcnKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgICAgICBoYXNoOiAnU0hBLTI1NicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIFsnZW5jcnlwdCddLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IEVuY3J5cHRvcihwdWJsaWNLZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbmNyeXB0KGRhdGE6IEFycmF5QnVmZmVyKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSU0EtT0FFUCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5wdWJsaWNLZXksXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbmNyeXB0U3RyaW5nKGRhdGE6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUlNBLU9BRVAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMucHVibGljS2V5LFxuICAgICAgICAgICAgdGV4dEVuY29kZXIuZW5jb2RlKGRhdGEpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZCkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFFUyB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBrZXk6IENyeXB0b0tleSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpdjogQXJyYXlCdWZmZXIsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBuZXcoKTogUHJvbWlzZTxBRVM+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxMjgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIFsnZW5jcnlwdCcsICdkZWNyeXB0J10sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGl2ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpO1xuICAgICAgICByZXR1cm4gbmV3IEFFUyhrZXksIGl2LmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBkZXNlcmlhbGl6ZShhZXM6IHN0cmluZywgZGVjcnlwdG9yOiBEZWNyeXB0b3IpOiBQcm9taXNlPEFFUz4ge1xuICAgICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNyeXB0b3IuZGVjcnlwdChjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIoYmFzZTY0VXJsRGVjb2RlKGFlcykpKTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tQXJyYXlCdWZmZXIoZGVjcnlwdGVkKTtcbiAgICAgICAgY29uc3Qga2V5ID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIGNvbnN0IGl2ID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG5cbiAgICAgICAgY29uc3Qga2V5X2VuY29kZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAgICAgICAgICdyYXcnLFxuICAgICAgICAgICAgY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKGtleSksXG4gICAgICAgICAgICAnQUVTLUNCQycsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFsnZW5jcnlwdCcsICdkZWNyeXB0J10sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgQUVTKFxuICAgICAgICAgICAga2V5X2VuY29kZWQsXG4gICAgICAgICAgICBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIoaXYpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXJpYWxpemUoZW5jcnlwdG9yOiBFbmNyeXB0b3IpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICBjb25zdCByYXdLZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmV4cG9ydEtleSgncmF3JywgdGhpcy5rZXkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KG5ldyBVaW50OEFycmF5KHJhd0tleSkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KG5ldyBVaW50OEFycmF5KHRoaXMuaXYpKTtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgZW5jcnlwdG9yLmVuY3J5cHQoY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKHdyaXRlci5maW5pc2goKSkpO1xuICAgICAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbmNyeXB0KGRhdGE6IFBhY2tldERhdGEpOiBQcm9taXNlPFBhY2tldD4ge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoZGF0YS50eXBlKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShkYXRhLmRhdGEpO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DQkMnLFxuICAgICAgICAgICAgICAgIGl2OiB0aGlzLml2LFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMTYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5rZXksXG4gICAgICAgICAgICBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIod3JpdGVyLmZpbmlzaCgpKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFBBQ0tFVF9UWVBFUy5FTkNSWVBURURfUEFDS0VULm5ldyhuZXcgVWludDhBcnJheShlbmNyeXB0ZWQpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVjcnlwdChwYWNrZXQ6IFBhY2tldDxVaW50OEFycmF5Pik6IFByb21pc2U8UGFja2V0RGF0YT4ge1xuICAgICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DQkMnLFxuICAgICAgICAgICAgICAgIGl2OiB0aGlzLml2LFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMTYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5rZXksXG4gICAgICAgICAgICBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIocGFja2V0LmRhdGEpLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21BcnJheUJ1ZmZlcihkZWNyeXB0ZWQpO1xuICAgICAgICBjb25zdCB0eXBlID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFkZHJlc3MgfSBmcm9tICcuLi9hZGRyZXNzLmpzJztcbmltcG9ydCB7XG4gICAgQW5vdGhlckNvbm5lY3Rpb24sIEFwcFJlbW92ZWQsIERpc2Nvbm5lY3RSZWFzb24sIEludGVybmFsRXJyb3IsXG4gICAgSW52YWxpZE9yaWdpbixcbiAgICBJbnZhbGlkUGFja2V0LFxuICAgIEludmFsaWRUb2tlbixcbiAgICBJbnZhbGlkVmVyc2lvbixcbiAgICBQZXJtaXNzaW9uRGVuaWVkLFxuICAgIFNlcnZlclJlc3RhcnQsXG59IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi9vbXUuanMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlblByb3ZpZGVyIH0gZnJvbSAnLi4vdG9rZW4uanMnO1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuXG5pbXBvcnQgdHlwZSB7IENvbm5lY3Rpb24sIFRyYW5zcG9ydCB9IGZyb20gJy4vY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBQYWNrZXRNYXBwZXIgfSBmcm9tICcuL2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHsgQUVTLCBEZWNyeXB0b3IsIEVOQ1JZUFRJT05fQVZBSUxBQkxFLCBFbmNyeXB0aW9uUmVzcG9uc2UsIEVuY3J5cHRvciB9IGZyb20gJy4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBDb25uZWN0UGFja2V0LCBEaXNjb25uZWN0VHlwZSwgUEFDS0VUX1RZUEVTIH0gZnJvbSAnLi9wYWNrZXQvcGFja2V0LXR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2V0LCBQYWNrZXRUeXBlIH0gZnJvbSAnLi9wYWNrZXQvcGFja2V0LmpzJztcblxudHlwZSBQYWNrZXRIYW5kbGVyPFQ+ID0ge1xuICAgIHJlYWRvbmx5IHR5cGU6IFBhY2tldFR5cGU8VD47XG4gICAgZXZlbnQ6IEV2ZW50RW1pdHRlcjxbVF0+O1xufTtcblxudHlwZSBTdGF0dXNUeXBlPFQ+ID0ge1xuICAgIHR5cGU6IFQ7XG59O1xuXG5leHBvcnQgdHlwZSBOZXR3b3JrU3RhdHVzID0gU3RhdHVzVHlwZTwnY29ubmVjdGluZyc+IHwgU3RhdHVzVHlwZTwnY29ubmVjdGVkJz4gfCBTdGF0dXNUeXBlPCdyZWFkeSc+IHwge1xuICAgIHR5cGU6ICdkaXNjb25uZWN0ZWQnO1xuICAgIGF0dGVtcHQ/OiBudW1iZXI7XG4gICAgcmVhc29uPzogRGlzY29ubmVjdFJlYXNvbjtcbn0gfCB7XG4gICAgdHlwZTogJ3JlY29ubmVjdGluZyc7XG4gICAgYXR0ZW1wdDogbnVtYmVyO1xuICAgIHRpbWVvdXQ6IG51bWJlcjtcbiAgICBkYXRlOiBEYXRlO1xuICAgIGNhbmNlbDogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBjbGFzcyBOZXR3b3JrIHtcbiAgICBwdWJsaWMgc3RhdHVzOiBOZXR3b3JrU3RhdHVzID0geyB0eXBlOiAnZGlzY29ubmVjdGVkJyB9O1xuICAgIHB1YmxpYyByZWFkb25seSBldmVudDogeyBjb25uZWN0ZWQ6IEV2ZW50RW1pdHRlcjxbXT47IGRpc2Nvbm5lY3RlZDogRXZlbnRFbWl0dGVyPFtEaXNjb25uZWN0UmVhc29uIHwgdW5kZWZpbmVkXT47IHBhY2tldDogRXZlbnRFbWl0dGVyPFtQYWNrZXQ8dW5rbm93bj5dPjsgc3RhdHVzOiBFdmVudEVtaXR0ZXI8W05ldHdvcmtTdGF0dXNdPiB9ID0ge1xuICAgICAgICBjb25uZWN0ZWQ6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICAgICAgZGlzY29ubmVjdGVkOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICAgIHBhY2tldDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICBzdGF0dXM6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICB9O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFza3M6IEFycmF5PCgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkPiA9IFtdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0TWFwcGVyID0gbmV3IFBhY2tldE1hcHBlcigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0SGFuZGxlcnMgPSBuZXcgSWRlbnRpZmllck1hcDxQYWNrZXRIYW5kbGVyPHVua25vd24+PigpO1xuICAgIHByaXZhdGUgbGlzdGVuVGFzazogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBwdWJsaWMgcmVhc29uOiBEaXNjb25uZWN0UmVhc29uIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgYXR0ZW1wdCA9IDA7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSxcbiAgICAgICAgcHVibGljIGFkZHJlc3M6IEFkZHJlc3MsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdG9rZW5Qcm92aWRlcjogVG9rZW5Qcm92aWRlcixcbiAgICAgICAgcHJpdmF0ZSB0cmFuc3BvcnQ6IFRyYW5zcG9ydCxcbiAgICAgICAgcHJpdmF0ZSBjb25uZWN0aW9uPzogQ29ubmVjdGlvbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgcHJpdmF0ZSBhZXM/OiBBRVMgfCB1bmRlZmluZWQsXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBQQUNLRVRfVFlQRVMuU0VSVkVSX01FVEEsXG4gICAgICAgICAgICBQQUNLRVRfVFlQRVMuQ09OTkVDVCxcbiAgICAgICAgICAgIFBBQ0tFVF9UWVBFUy5ESVNDT05ORUNULFxuICAgICAgICAgICAgUEFDS0VUX1RZUEVTLlRPS0VOLFxuICAgICAgICAgICAgUEFDS0VUX1RZUEVTLlJFQURZLFxuICAgICAgICAgICAgUEFDS0VUX1RZUEVTLkVOQ1JZUFRFRF9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWRkUGFja2V0SGFuZGxlcihQQUNLRVRfVFlQRVMuRElTQ09OTkVDVCwgYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKHJlYXNvbi50eXBlID09PSBEaXNjb25uZWN0VHlwZS5TSFVURE9XTlxuICAgICAgICAgICAgICAgIHx8IHJlYXNvbi50eXBlID09PSBEaXNjb25uZWN0VHlwZS5DTE9TRSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzKHsgdHlwZTogJ2Rpc2Nvbm5lY3RlZCcgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgRVJST1JfTUFQID0ge1xuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5BTk9USEVSX0NPTk5FQ1RJT05dOiBBbm90aGVyQ29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuUEVSTUlTU0lPTl9ERU5JRURdOiBQZXJtaXNzaW9uRGVuaWVkLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5BUFBfUkVNT1ZFRF06IEFwcFJlbW92ZWQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVkFMSURfVE9LRU5dOiBJbnZhbGlkVG9rZW4sXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVkFMSURfT1JJR0lOXTogSW52YWxpZE9yaWdpbixcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9WRVJTSU9OXTogSW52YWxpZFZlcnNpb24sXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVEVSTkFMX0VSUk9SXTogSW50ZXJuYWxFcnJvcixcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9QQUNLRVRdOiBJbnZhbGlkUGFja2V0LFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlZBTElEX1BBQ0tFVF9UWVBFXTogSW52YWxpZFBhY2tldCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9QQUNLRVRfREFUQV06IEludmFsaWRQYWNrZXQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLlNFUlZFUl9SRVNUQVJUXTogU2VydmVyUmVzdGFydCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuQ0xPU0VdOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLlNIVVRET1dOXTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gRVJST1JfTUFQW3JlYXNvbi50eXBlXTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhc29uID0gbmV3IGVycm9yKHJlYXNvbi5tZXNzYWdlID8/ICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWRkUGFja2V0SGFuZGxlcihQQUNLRVRfVFlQRVMuUkVBRFksICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cy50eXBlID09PSAncmVhZHknKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBSRUFEWSBwYWNrZXQgd2hlbiBhbHJlYWR5IHJlYWR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFN0YXR1cyh7IHR5cGU6ICdyZWFkeScgfSk7XG4gICAgICAgICAgICB0aGlzLmF0dGVtcHQgPSAwO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29ubmVjdGlvbihjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cy50eXBlICE9PSAnZGlzY29ubmVjdGVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2hhbmdlIGNvbm5lY3Rpb24gd2hpbGUgY29ubmVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJQYWNrZXQoLi4ucGFja2V0VHlwZXM6IFBhY2tldFR5cGU8dW5rbm93bj5bXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhY2tldE1hcHBlci5yZWdpc3RlciguLi5wYWNrZXRUeXBlcyk7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBwYWNrZXRUeXBlcykge1xuICAgICAgICAgICAgdGhpcy5wYWNrZXRIYW5kbGVycy5zZXQodHlwZS5pZCwge1xuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFBhY2tldEhhbmRsZXI8VD4odHlwZTogUGFja2V0VHlwZTxUPiwgaGFuZGxlcjogKHBhY2tldDogVCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLnBhY2tldEhhbmRsZXJzLmdldCh0eXBlLmlkKSBhcyBQYWNrZXRIYW5kbGVyPHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIWxpc3RlbmVycykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYWNrZXQgdHlwZSAke3R5cGUuaWQua2V5KCl9IG5vdCByZWdpc3RlcmVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdGVuZXJzLmV2ZW50Lmxpc3RlbihoYW5kbGVyIGFzIChwYWNrZXQ6IHVua25vd24pID0+IHZvaWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2NoZWR1bGVSZWNvbm5lY3QoYXR0ZW1wdDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBNYXRoLm1pbigzMDAwMCwgMjAwMCAqIChNYXRoLnBvdygxLjUsIGF0dGVtcHQpIC0gMSkgKyAyMDAwKTtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc3RhdHVzOiBFeHRyYWN0PE5ldHdvcmtTdGF0dXMsIHsgdHlwZTogJ3JlY29ubmVjdGluZycgfT4gPSB7XG4gICAgICAgICAgICB0eXBlOiAncmVjb25uZWN0aW5nJyxcbiAgICAgICAgICAgIGF0dGVtcHQsXG4gICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGNhbmNlbDogKCkgPT4ge2NhbmNlbGxlZCA9IHRydWU7fSxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRTdGF0dXMoc3RhdHVzKTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHN0YXR1cy50aW1lb3V0IC0gKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gZGF0ZS5nZXRUaW1lKCkpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCByZW1haW5pbmcpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QocmVjb25uZWN0ID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdGF0ZSgnZGlzY29ubmVjdGVkJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbm5lY3Qgd2hpbGUgJHt0aGlzLnN0YXR1cy50eXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpc3RlblRhc2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbm5lY3Qgd2hpbGUgYWxyZWFkeSBjb25uZWN0aW5nJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF0dGVtcHQgPSAwO1xuICAgICAgICB3aGlsZSAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhpcy5hdHRlbXB0Kys7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LmNvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldFN0YXR1cyh7IHR5cGU6ICdjb25uZWN0aW5nJyB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhUmVjZWl2ZWQgPSBhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucmVjZWl2ZSh0aGlzLnBhY2tldE1hcHBlcik7XG4gICAgICAgICAgICAgICAgaWYgKCFtZXRhUmVjZWl2ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgcmVjZWl2aW5nIHNlcnZlciBtZXRhJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghUEFDS0VUX1RZUEVTLlNFUlZFUl9NRVRBLm1hdGNoKG1ldGFSZWNlaXZlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBwYWNrZXQgcmVjZWl2ZWQgd2FzIG5vdCBzZXJ2ZXIgbWV0YScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IG1ldGEgfSA9IG1ldGFSZWNlaXZlZDtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3MuaGFzaCA9IG1ldGEuaGFzaDtcbiAgICAgICAgICAgICAgICBsZXQgdG9rZW4gPSBhd2FpdCB0aGlzLnRva2VuUHJvdmlkZXIuZ2V0KHRoaXMuYWRkcmVzcywgdGhpcy5vbXUuYXBwKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW4oYE5vIHRva2VuIGF2YWlsYWJsZSBmb3IgYXBwICR7dGhpcy5vbXUuYXBwLmlkLmtleSgpfSBhdCAke3RoaXMuYWRkcmVzcy5ob3N0fToke3RoaXMuYWRkcmVzcy5wb3J0fToke3RoaXMuYWRkcmVzcy5oYXNofWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZW5jcnlwdGlvblJlc3A6IEVuY3J5cHRpb25SZXNwb25zZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbXUuYXBwLnR5cGUgPT09ICdyZW1vdGUnICYmIEVOQ1JZUFRJT05fQVZBSUxBQkxFICYmIG1ldGEuZW5jcnlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNyeXB0b3IgPSBhd2FpdCBEZWNyeXB0b3IubmV3KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY3J5cHRvciA9IGF3YWl0IEVuY3J5cHRvci5uZXcobWV0YS5lbmNyeXB0aW9uLnJzYSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBhd2FpdCBlbmNyeXB0b3IuZW5jcnlwdFN0cmluZyh0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZXMgPSBhd2FpdCBBRVMubmV3KCk7XG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25SZXNwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ3YxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJzYTogYXdhaXQgZGVjcnlwdG9yLnRvUmVxdWVzdCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWVzOiBhd2FpdCB0aGlzLmFlcy5zZXJpYWxpemUoZW5jcnlwdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnNlbmQoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBQQUNLRVRfVFlQRVMuQ09OTkVDVCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogbmV3IENvbm5lY3RQYWNrZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiB0aGlzLm9tdS5hcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbDogeyB2ZXJzaW9uOiBWRVJTSU9OIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uOiBlbmNyeXB0aW9uUmVzcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LCB0aGlzLnBhY2tldE1hcHBlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5UYXNrID0gdGhpcy5saXN0ZW4oKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldFN0YXR1cyh7IHR5cGU6ICdjb25uZWN0ZWQnIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXZlbnQuY29ubmVjdGVkLmVtaXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoVGFza3MoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFBBQ0tFVF9UWVBFUy5SRUFEWSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubGlzdGVuVGFzaztcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRGlzY29ubmVjdFJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYXNvbiA9IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlY29ubmVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnQuZGlzY29ubmVjdGVkLmVtaXQodGhpcy5yZWFzb24pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cy50eXBlICE9PSAnZGlzY29ubmVjdGVkJyAmJiB0aGlzLnN0YXR1cy50eXBlICE9PSAncmVjb25uZWN0aW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXR1cyh7IHR5cGU6ICdkaXNjb25uZWN0ZWQnLCBhdHRlbXB0OiB0aGlzLmF0dGVtcHQsIHJlYXNvbjogdGhpcy5yZWFzb24gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbj8uY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5UYXNrID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucmVhc29uICYmICFbXG4gICAgICAgICAgICAgICAgRGlzY29ubmVjdFR5cGUuU0hVVERPV04sXG4gICAgICAgICAgICAgICAgRGlzY29ubmVjdFR5cGUuU0VSVkVSX1JFU1RBUlQsXG4gICAgICAgICAgICBdLmluY2x1ZGVzKHRoaXMucmVhc29uLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghcmVjb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaG91bGRSZWNvbm5lY3QgPSBhd2FpdCB0aGlzLnNjaGVkdWxlUmVjb25uZWN0KHRoaXMuYXR0ZW1wdCk7XG4gICAgICAgICAgICBpZiAoIXNob3VsZFJlY29ubmVjdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0U3RhdHVzKHsgdHlwZTogJ2Rpc2Nvbm5lY3RlZCcsIHJlYXNvbjogdGhpcy5yZWFzb24gfSk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbj8uY2xvc2UoKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNTdGF0ZShzdGF0ZTogTmV0d29ya1N0YXR1c1sndHlwZSddKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXR1cy50eXBlID09PSBzdGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZChwYWNrZXQ6IFBhY2tldCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjb25uZWN0aW9uIGVzdGFibGlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWVzKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gdGhpcy5wYWNrZXRNYXBwZXIuc2VyaWFsaXplKHBhY2tldCk7XG4gICAgICAgICAgICBwYWNrZXQgPSBhd2FpdCB0aGlzLmFlcy5lbmNyeXB0KHNlcmlhbGl6ZWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5zZW5kKHBhY2tldCwgdGhpcy5wYWNrZXRNYXBwZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbGlzdGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB3aGlsZSAodGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBwYWNrZXQgPSBhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucmVjZWl2ZSh0aGlzLnBhY2tldE1hcHBlcik7XG4gICAgICAgICAgICBpZiAoIXBhY2tldCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaFBhY2tldChwYWNrZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFBhY2tldChwYWNrZXQ6IFBhY2tldCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoUEFDS0VUX1RZUEVTLkVOQ1JZUFRFRF9QQUNLRVQubWF0Y2gocGFja2V0KSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFlcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2ZWQgZW5jcnlwdGVkIHBhY2tldCBiZWZvcmUgZW5jcnlwdGlvbiB3YXMgZXN0YWJsaXNoZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHRoaXMuYWVzLmRlY3J5cHQocGFja2V0KTtcbiAgICAgICAgICAgIHBhY2tldCA9IHRoaXMucGFja2V0TWFwcGVyLmRlc2VyaWFsaXplKGRlY3J5cHRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5ldmVudC5wYWNrZXQuZW1pdChwYWNrZXQpO1xuICAgICAgICBjb25zdCBwYWNrZXRIYW5kbGVyID0gdGhpcy5wYWNrZXRIYW5kbGVycy5nZXQocGFja2V0LnR5cGUuaWQpO1xuICAgICAgICBpZiAoIXBhY2tldEhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBwYWNrZXRIYW5kbGVyLmV2ZW50LmVtaXQocGFja2V0LmRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRUYXNrKHRhc2s6ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgdGFzayBhZnRlciBjbGllbnQgaXMgcmVhZHknKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhc2tzLnB1c2godGFzayk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZVRhc2sodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrcy5zcGxpY2UodGhpcy50YXNrcy5pbmRleE9mKHRhc2spLCAxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoVGFza3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgdGFzayBvZiB0aGlzLnRhc2tzKSB7XG4gICAgICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNldFN0YXR1cyhzdGF0dXM6IE5ldHdvcmtTdGF0dXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSBzdGF0dXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCBzdGF0dXMgdG8gJHtzdGF0dXN9IHdoZW4gYWxyZWFkeSAke3N0YXR1c31gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgYXdhaXQgdGhpcy5ldmVudC5zdGF0dXMuZW1pdChzdGF0dXMpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBZGRyZXNzIH0gZnJvbSAnLi4vYWRkcmVzcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vc2VyaWFsaXplJztcblxuaW1wb3J0IHR5cGUgeyBDb25uZWN0aW9uLCBUcmFuc3BvcnQgfSBmcm9tICcuL2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrZXQsIFBhY2tldERhdGEgfSBmcm9tICcuL3BhY2tldC9wYWNrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2Vic29ja2V0VHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhZGRyZXNzOiBBZGRyZXNzLFxuICAgICkgeyB9XG5cbiAgICBwcml2YXRlIGdldCB3c0VuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5hZGRyZXNzLnNlY3VyZSA/ICd3c3MnIDogJ3dzJztcbiAgICAgICAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSB0aGlzLmFkZHJlc3M7XG4gICAgICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke2hvc3R9OiR7cG9ydH0vd3NgO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25uZWN0KCk6IFByb21pc2U8Q29ubmVjdGlvbj4ge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMud3NFbmRwb2ludCk7XG4gICAgICAgIHJldHVybiBXZWJzb2NrZXRDb25uZWN0aW9uLmZyb21Tb2NrZXQoc29ja2V0KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXZWJzb2NrZXRDb25uZWN0aW9uIGltcGxlbWVudHMgQ29ubmVjdGlvbiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRRdWV1ZTogQXJyYXk8UGFja2V0RGF0YT4gPSBbXTtcbiAgICBwcml2YXRlIHJlY2VpdmVXYWl0ZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVhZGluZ1Byb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGJlaW5nQ2xvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBzb2NrZXQ6IFdlYlNvY2tldCxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tU29ja2V0KHNvY2tldDogV2ViU29ja2V0KTogUHJvbWlzZTxXZWJzb2NrZXRDb25uZWN0aW9uPiB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgV2Vic29ja2V0Q29ubmVjdGlvbihzb2NrZXQpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc29ja2V0Lm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgICAgICBzb2NrZXQub25jbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmJlaW5nQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVjZWl2ZVdhaXRlcigpO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlY2VpdmVXYWl0ZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gKGV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWFkaW5nUHJvbWlzZSA9IGNvbm5lY3Rpb24ub25NZXNzYWdlKGV2ZW50KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWFkaW5nUHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc29ja2V0Lm9ub3BlbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvbk1lc3NhZ2UoZXZlbnQ6IE1lc3NhZ2VFdmVudDxzdHJpbmcgfCBCbG9iPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2VpdmVkIHN0cmluZyBkYXRhJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVhZGVyID0gYXdhaXQgQnl0ZVJlYWRlci5mcm9tQmxvYihldmVudC5kYXRhKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIHR5cGU6IHJlYWRlci5yZWFkU3RyaW5nKCksXG4gICAgICAgICAgICBkYXRhOiByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wYWNrZXRRdWV1ZS5wdXNoKGRhdGEpO1xuICAgICAgICByZWFkZXIuZmluaXNoKCk7XG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVXYWl0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlY2VpdmUoc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFBhY2tldDx1bmtub3duPiwgUGFja2V0RGF0YT4pOiBQcm9taXNlPFBhY2tldCB8IG51bGw+IHtcbiAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVdhaXRlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbHJlYWR5IHJlY2VpdmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0aGlzLnBhY2tldFF1ZXVlLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5iZWluZ0Nsb3NlZCkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIgPSByZXNvbHZlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhY2tldFF1ZXVlLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmJlaW5nQ2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXREYXRhID0gdGhpcy5wYWNrZXRRdWV1ZS5zaGlmdCgpITtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocGFja2V0RGF0YSk7XG4gICAgfVxuXG4gICAgZ2V0IGNsb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZGluZ1Byb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYWNrZXRRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVdhaXRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuQ0xPU0VEICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5DTE9TSU5HKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIoKTtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZW5kKHBhY2tldDogUGFja2V0LCBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UGFja2V0PHVua25vd24+LCBQYWNrZXREYXRhPik6IHZvaWQge1xuICAgICAgICBjb25zdCBwYWNrZXREYXRhID0gc2VyaWFsaXplci5zZXJpYWxpemUocGFja2V0KTtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldERhdGEudHlwZSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkocGFja2V0RGF0YS5kYXRhKTtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZCh3cml0ZXIuZmluaXNoKCkpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vb211LmpzJztcbmltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi9leHRlbnNpb24uanMnO1xuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uUmVnaXN0cnkge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXh0ZW5zaW9uTWFwOiBNYXA8c3RyaW5nLCBFeHRlbnNpb24+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge31cblxuICAgIHJlZ2lzdGVyPFQgZXh0ZW5kcyBFeHRlbnNpb24+KHR5cGU6IEV4dGVuc2lvblR5cGU8VD4pOiBUIHtcbiAgICAgICAgaWYgKHRoaXMuZXh0ZW5zaW9uTWFwLmhhcyh0eXBlLm5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVuc2lvbiB0eXBlICR7dHlwZS5uYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSB0eXBlLmNyZWF0ZSh0aGlzLm9tdSk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uTWFwLnNldCh0eXBlLm5hbWUsIGV4dGVuc2lvbik7XG4gICAgICAgIHJldHVybiBleHRlbnNpb247XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi9vbXUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuc2lvbiB7XG4gICAgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvblR5cGU8VCBleHRlbmRzIEV4dGVuc2lvbiA9IEV4dGVuc2lvbj4gZXh0ZW5kcyBJZGVudGlmaWVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZTogKG9tdTogT211KSA9PiBULFxuICAgICkge1xuICAgICAgICBzdXBlcignZXh0JywgbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGtleSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIoJ2V4dCcsIHRoaXMubmFtZSkua2V5KCk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEpzb25UeXBlLCB0eXBlIFNlcmlhbGl6YWJsZSwgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludFR5cGU8UmVxID0gdW5rbm93biwgUmVzID0gdW5rbm93bj4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFJlcSwgVWludDhBcnJheT4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxSZXMsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbklkPzogSWRlbnRpZmllciB8IHVuZGVmaW5lZCxcbiAgICApIHsgfVxuXG4gICAgc3RhdGljIGNyZWF0ZUpzb248UmVxLCBSZXMsIFJlcURhdGEgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlLCBSZXNEYXRhIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHJlcXVlc3RTZXJpYWxpemVyLFxuICAgICAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbklkLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxSZXEsIFJlcURhdGE+O1xuICAgICAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFJlcywgUmVzRGF0YT47XG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQ/OiBJbnRvSWQ7XG4gICAgICAgIH0sXG4gICAgKTogRW5kcG9pbnRUeXBlPFJlcSwgUmVzPiB7XG4gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRUeXBlPFJlcSwgUmVzPihcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFJlcSwgSnNvblR5cGUsIFVpbnQ4QXJyYXk+KHJlcXVlc3RTZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpLCBTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8UmVzLCBKc29uVHlwZSwgVWludDhBcnJheT4ocmVzcG9uc2VTZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpLCBTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQgPyBJZGVudGlmaWVyLmZyb20ocGVybWlzc2lvbklkKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxSZXEsIFJlcz4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHJlcXVlc3RTZXJpYWxpemVyLFxuICAgICAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbklkLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFJlcSwgVWludDhBcnJheT47XG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxSZXMsIFVpbnQ4QXJyYXk+O1xuICAgICAgICAgICAgcGVybWlzc2lvbklkPzogSW50b0lkO1xuICAgICAgICB9LFxuICAgICk6IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4ge1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4oXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHJlcXVlc3RTZXJpYWxpemVyLFxuICAgICAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbklkID8gSWRlbnRpZmllci5mcm9tKHBlcm1pc3Npb25JZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgfVxufVxuXG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIsIFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmV4cG9ydCBjb25zdCBBU1NFVF9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxBc3NldEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnYXNzZXQnLFxuICAgIChvbXU6IE9tdSkgPT4gbmV3IEFzc2V0RXh0ZW5zaW9uKG9tdSksXG4pO1xuXG5leHBvcnQgdHlwZSBBc3NldCA9IHtcbiAgICBpZGVudGlmaWVyOiBJZGVudGlmaWVyO1xuICAgIGJ1ZmZlcjogVWludDhBcnJheTtcbn07XG5cbmNvbnN0IEZJTEVfU0VSSUFMSVpFUiA9IG5ldyBTZXJpYWxpemVyPEFzc2V0LCBVaW50OEFycmF5PihcbiAgICAoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoZmlsZS5pZGVudGlmaWVyLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShmaWxlLmJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfSxcbiAgICAoZGF0YSkgPT4ge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmVhZGVyLmZpbmlzaCgpO1xuICAgICAgICByZXR1cm4geyBpZGVudGlmaWVyLCBidWZmZXIgfTtcbiAgICB9LFxuKTtcbmNvbnN0IEZJTEVfQVJSQVlfU0VSSUFMSVpFUiA9IG5ldyBTZXJpYWxpemVyPEFzc2V0W10sIFVpbnQ4QXJyYXk+KFxuICAgIChmaWxlcykgPT4ge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KGZpbGVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGZpbGUuaWRlbnRpZmllci5rZXkoKSk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGZpbGUuYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH0sXG4gICAgKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGZpbGVzOiBBc3NldFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBpZGVudGlmaWVyLCBidWZmZXIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZGVyLmZpbmlzaCgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfSxcbik7XG5cbmV4cG9ydCBjb25zdCBBU1NFVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gQVNTRVRfRVhURU5TSU9OX1RZUEU7XG5cbmNvbnN0IEFTU0VUX1VQTE9BRF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPEFzc2V0LCBJZGVudGlmaWVyPihcbiAgICBBU1NFVF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICd1cGxvYWQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogRklMRV9TRVJJQUxJWkVSLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9Kc29uKCksXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcbmNvbnN0IEFTU0VUX1VQTE9BRF9NQU5ZX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8QXNzZXRbXSwgSWRlbnRpZmllcltdPihcbiAgICBBU1NFVF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICd1cGxvYWRfbWFueScsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBGSUxFX0FSUkFZX1NFUklBTElaRVIsXG4gICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCkucGlwZShTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcbmNvbnN0IEFTU0VUX0RPV05MT0FEX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8SWRlbnRpZmllciwgQXNzZXQ+KFxuICAgIEFTU0VUX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2Rvd25sb2FkJyxcbiAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikucGlwZShTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgIHJlc3BvbnNlU2VyaWFsaXplcjogRklMRV9TRVJJQUxJWkVSLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5jb25zdCBBU1NFVF9ET1dOTE9BRF9NQU5ZX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8SWRlbnRpZmllcltdLCBBc3NldFtdPihcbiAgICBBU1NFVF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdkb3dubG9hZF9tYW55JyxcbiAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9BcnJheSgpLnBpcGUoU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IEZJTEVfQVJSQVlfU0VSSUFMSVpFUixcbiAgICAgICAgcGVybWlzc2lvbklkOiBBU1NFVF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuY29uc3QgQVNTRVRfREVMRVRFX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllciwgbnVsbD4oXG4gICAgQVNTRVRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAnZGVsZXRlJyxcbiAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcblxuY29uc3QgQVNTRVRfR0VORVJBVEVfVE9LRU5fRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxvYmplY3QsIHsgdG9rZW46IHN0cmluZyB9PihcbiAgICBBU1NFVF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICd0b2tlbl9nZW5lcmF0ZScsXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcblxuZXhwb3J0IGNsYXNzIEFzc2V0RXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxBc3NldEV4dGVuc2lvbj4gPSBBU1NFVF9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIGFzc2V0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsuZXZlbnQuZGlzY29ubmVjdGVkLmxpc3RlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFzc2V0VG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChvbXUucGVybWlzc2lvbnMucmVxdWlyZWQoQVNTRVRfUEVSTUlTU0lPTl9JRCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RHZW5lcmF0ZUFzc2V0VG9rZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwbG9hZChpZGVudGlmaWVyOiBJbnRvSWQsIGJ1ZmZlcjogVWludDhBcnJheSk6IFByb21pc2U8SWRlbnRpZmllcj4ge1xuICAgICAgICBjb25zdCBhc3NldElkZW50aWZpZXIgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9VUExPQURfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKSxcbiAgICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhc3NldElkZW50aWZpZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwbG9hZE1hbnkoLi4uZmlsZXM6IEFzc2V0W10pOiBQcm9taXNlPElkZW50aWZpZXJbXT4ge1xuICAgICAgICBjb25zdCB1cGxvYWRlZCA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKEFTU0VUX1VQTE9BRF9NQU5ZX0VORFBPSU5ULCBmaWxlcyk7XG4gICAgICAgIHJldHVybiB1cGxvYWRlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWQoaWRlbnRpZmllcjogSW50b0lkKTogUHJvbWlzZTxBc3NldD4ge1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKTtcbiAgICAgICAgY29uc3QgZG93bmxvYWRlZCA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKEFTU0VUX0RPV05MT0FEX0VORFBPSU5ULCBpZCk7XG4gICAgICAgIHJldHVybiBkb3dubG9hZGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3dubG9hZE1hbnkoLi4uaWRlbnRpZmllcnM6IEludG9JZFtdKTogUHJvbWlzZTxBc3NldFtdPiB7XG4gICAgICAgIGNvbnN0IGRvd25sb2FkZWQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgIEFTU0VUX0RPV05MT0FEX01BTllfRU5EUE9JTlQsXG4gICAgICAgICAgICBpZGVudGlmaWVycy5tYXAoKGlkKSA9PiBJZGVudGlmaWVyLmZyb20oaWQpKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGRvd25sb2FkZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbGV0ZShpZGVudGlmaWVyOiBJbnRvSWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcik7XG4gICAgICAgIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKEFTU0VUX0RFTEVURV9FTkRQT0lOVCwgaWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdEdlbmVyYXRlQXNzZXRUb2tlbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoQVNTRVRfR0VORVJBVEVfVE9LRU5fRU5EUE9JTlQsIHt9KTtcbiAgICAgICAgdGhpcy5hc3NldFRva2VuID0gcmVzdWx0LnRva2VuO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cmwoXG4gICAgICAgIGlkOiBJbnRvSWQsXG4gICAgICAgIG9wdGlvbnM/OiB7IGNhY2hlPzogJ25vLWNhY2hlJyB9LFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy5hc3NldFRva2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fzc2V0IHRva2VuIGlzIG5vdCBzZXQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSBJZGVudGlmaWVyLmZyb20oaWQpLmtleSgpO1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5vbXUubmV0d29yay5hZGRyZXNzO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IGFkZHJlc3Muc2VjdXJlID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChgJHtwcm90b2NvbH06Ly8ke2FkZHJlc3MuaG9zdH06JHthZGRyZXNzLnBvcnR9L2Fzc2V0YCk7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdhc3NldF90b2tlbicsIHRoaXMuYXNzZXRUb2tlbik7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdpZCcsIGtleSk7XG4gICAgICAgIGlmIChvcHRpb25zPy5jYWNoZSA9PT0gJ25vLWNhY2hlJykge1xuICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3QnLCBEYXRlLm5vdygpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJveHkodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuYXNzZXRUb2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3NldCB0b2tlbiBpcyBub3Qgc2V0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IHRoaXMub211Lm5ldHdvcmsuYWRkcmVzcztcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBhZGRyZXNzLnNlY3VyZSA/ICdodHRwcycgOiAnaHR0cCc7XG4gICAgICAgIGNvbnN0IHByb3h5VXJsID0gbmV3IFVSTChgJHtwcm90b2NvbH06Ly8ke2FkZHJlc3MuaG9zdH06JHthZGRyZXNzLnBvcnR9L3Byb3h5YCk7XG4gICAgICAgIHByb3h5VXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2Fzc2V0X3Rva2VuJywgdGhpcy5hc3NldFRva2VuKTtcbiAgICAgICAgcHJveHlVcmwuc2VhcmNoUGFyYW1zLnNldCgndXJsJywgdXJsKTtcbiAgICAgICAgcmV0dXJuIHByb3h5VXJsLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IEpzb25UeXBlLCBTZXJpYWxpemFibGUgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnlQZXJtaXNzaW9uc0pTT04ge1xuICAgIGFsbD86IHN0cmluZztcbiAgICByZWFkPzogc3RyaW5nO1xuICAgIHdyaXRlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJ5UGVybWlzc2lvbnMge1xuICAgIGFsbD86IEludG9JZDtcbiAgICByZWFkPzogSW50b0lkO1xuICAgIHdyaXRlPzogSW50b0lkO1xufVxuXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlUeXBlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFZhbHVlOiBULFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFJlZ2lzdHJ5UGVybWlzc2lvbnMsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oaWRlbnRpZmllcjogSW50b0lkLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogVDtcbiAgICAgICAgcGVybWlzc2lvbnM/OiBSZWdpc3RyeVBlcm1pc3Npb25zO1xuICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+O1xuICAgIH0pOiBSZWdpc3RyeVR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJ5VHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyOiBJbnRvSWQsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICB9OiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBUO1xuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgICAgIHBlcm1pc3Npb25zPzogUmVnaXN0cnlQZXJtaXNzaW9ucztcbiAgICB9KTogUmVnaXN0cnlUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeVR5cGUoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyA/PyB7fSxcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnk8VD4ge1xuICAgIHJlYWRvbmx5IHR5cGU6IFJlZ2lzdHJ5VHlwZTxUPjtcbiAgICByZWFkb25seSB2YWx1ZTogVDtcbiAgICBnZXQoKTogUHJvbWlzZTxUPjtcbiAgICBzZXQodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+O1xuICAgIG1vZGlmeShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+O1xuICAgIGxpc3RlbihmbjogKHZhbHVlOiBUKSA9PiB2b2lkKTogVW5saXN0ZW47XG5cbiAgICBjb21wYXRTdmVsdGUoKTogV3JpdGFibGU8VD47XG59XG5cbmV4cG9ydCB0eXBlIFN1YnNjcmliZXI8VD4gPSAodmFsdWU6IFQpID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIFVuc3Vic2NyaWJlciA9ICgpID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIFVwZGF0ZXI8VD4gPSAodmFsdWU6IFQpID0+IFQ7XG5cbmV4cG9ydCB0eXBlIFN0YXJ0U3RvcE5vdGlmaWVyPFQ+ID0gKFxuICAgIHNldDogKHZhbHVlOiBUKSA9PiB2b2lkLFxuICAgIHVwZGF0ZTogKGZuOiBVcGRhdGVyPFQ+KSA9PiB2b2lkXG4pID0+IHZvaWQgfCAoKCkgPT4gdm9pZCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZGFibGU8VD4ge1xuICAgIHN1YnNjcmliZSh0aGlzOiB2b2lkLCBydW46IFN1YnNjcmliZXI8VD4pOiBVbnN1YnNjcmliZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGFibGU8VD4gZXh0ZW5kcyBSZWFkYWJsZTxUPiB7XG4gICAgc2V0KHRoaXM6IHZvaWQsIHZhbHVlOiBUKTogdm9pZDtcbiAgICB1cGRhdGUodGhpczogdm9pZCwgdXBkYXRlcjogVXBkYXRlcjxUPik6IHZvaWQ7XG4gICAgd2FpdCgpOiBQcm9taXNlPFQ+O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEV2ZW50RW1pdHRlciwgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgVGFibGVDb25maWcgPSB7XG4gICAgY2FjaGVfc2l6ZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZTxUPiB7XG4gICAgcmVhZG9ubHkgY2FjaGU6IFJlYWRvbmx5TWFwPHN0cmluZywgVD47XG4gICAgcmVhZG9ubHkgZXZlbnQ6IFRhYmxlRXZlbnRzPFQ+O1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG4gICAgZ2V0TWFueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+O1xuICAgIGFkZCguLi5pdGVtOiBUW10pOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZSguLi5pdGVtOiBUW10pOiBQcm9taXNlPHZvaWQ+O1xuICAgIHJlbW92ZSguLi5pdGVtczogVFtdKTogUHJvbWlzZTx2b2lkPjtcbiAgICBjbGVhcigpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGhhcyhrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG4gICAgaGFzTWFueTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KC4uLmtleXM6IChrZXlvZiBUKVtdKTogUHJvbWlzZTx7IFtrZXkgaW4ga2V5b2YgVF06IGJvb2xlYW4gfT47XG4gICAgaGFzQWxsKC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICBoYXNBbnkoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gICAgZmV0Y2hJdGVtcyh7XG4gICAgICAgIGxpbWl0LFxuICAgICAgICBiYWNrd2FyZCxcbiAgICAgICAgY3Vyc29yLFxuICAgIH06IHtcbiAgICAgICAgbGltaXQ6IG51bWJlcjtcbiAgICAgICAgYmFja3dhcmQ/OiBib29sZWFuO1xuICAgICAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+O1xuICAgIGZldGNoUmFuZ2UoeyBzdGFydCwgZW5kIH06IHsgc3RhcnQ6IHN0cmluZzsgZW5kOiBzdHJpbmcgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+O1xuICAgIGZldGNoQWxsKCk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+O1xuICAgIGl0ZXJhdGUoeyBiYWNrd2FyZCwgY3Vyc29yIH06IHsgYmFja3dhcmQ/OiBib29sZWFuOyBjdXJzb3I/OiBzdHJpbmcgfSk6IEFzeW5jSXRlcmFibGU8VD47XG4gICAgc2l6ZSgpOiBQcm9taXNlPG51bWJlcj47XG5cbiAgICBwcm94eShwcm94eTogKGl0ZW06IFQpID0+IFQgfCB1bmRlZmluZWQpOiBVbmxpc3RlbjtcbiAgICBzZXRDYWNoZVNpemUoc2l6ZTogbnVtYmVyKTogdm9pZDtcbiAgICBzZXRDb25maWcoY29uZmlnOiBUYWJsZUNvbmZpZyk6IHZvaWQ7XG4gICAgc2V0UGVybWlzc2lvbnMocGVybWlzc2lvbnM6IFRhYmxlUGVybWlzc2lvbnMpOiB2b2lkO1xuXG4gICAgbGlzdGVuKGxpc3RlbmVyPzogKGl0ZW1zOiBNYXA8c3RyaW5nLCBUPikgPT4gdm9pZCk6IFVubGlzdGVuO1xufVxuXG5leHBvcnQgdHlwZSBUYWJsZUV2ZW50czxUPiA9IHtcbiAgICBhZGQ6IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPjtcbiAgICB1cGRhdGU6IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPjtcbiAgICByZW1vdmU6IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPjtcbiAgICBjbGVhcjogRXZlbnRFbWl0dGVyPFtdPjtcbiAgICBjYWNoZVVwZGF0ZTogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVQZXJtaXNzaW9ucyA9IHtcbiAgICBhbGw/OiBJZGVudGlmaWVyO1xuICAgIHJlYWQ/OiBJZGVudGlmaWVyO1xuICAgIHdyaXRlPzogSWRlbnRpZmllcjtcbiAgICByZW1vdmU/OiBJZGVudGlmaWVyO1xuICAgIHByb3h5PzogSWRlbnRpZmllcjtcbn07XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgICAgIHB1YmxpYyBrZXlGdW5jdGlvbjogKGl0ZW06IFQpID0+IHN0cmluZyxcbiAgICAgICAgcHVibGljIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucyB8IHVuZGVmaW5lZCxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGtleTogKGl0ZW06IFQpID0+IHN0cmluZztcbiAgICAgICAgICAgIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucztcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD47XG4gICAgICAgIH0sXG4gICAgKTogVGFibGVUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVR5cGU8VD4oXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxULCBELCBVaW50OEFycmF5PihzZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpLCBTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8VD4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAga2V5OiAoaXRlbTogVCkgPT4gc3RyaW5nO1xuICAgICAgICAgICAgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zO1xuICAgICAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgICAgICB9LFxuICAgICk6IFRhYmxlVHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVUeXBlPFQ+KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBBcHAsIEFwcEpzb24gfSBmcm9tICcuLi8uLi9hcHAuanMnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCB0eXBlIEFwcEluc3RhbGxSZXNwb25zZSA9IHtcbiAgICBhY2NlcHRlZDogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wRmlsZSA9IHtcbiAgICB0eXBlOiAnZmlsZScgfCAnZGlyZWN0b3J5JztcbiAgICBzaXplOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BQb3NpdGlvbiA9IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0VudGVyID0ge1xuICAgIHR5cGU6ICdlbnRlcic7XG4gICAgZHJhZ19pZDogc3RyaW5nO1xuICAgIGZpbGVzOiBEcmFnRHJvcEZpbGVbXTtcbiAgICBwb3NpdGlvbjogRHJhZ0Ryb3BQb3NpdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdPdmVyID0ge1xuICAgIHR5cGU6ICdvdmVyJztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG4gICAgcG9zaXRpb246IERyYWdEcm9wUG9zaXRpb247XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcCA9IHtcbiAgICB0eXBlOiAnZHJvcCc7XG4gICAgZHJhZ19pZDogc3RyaW5nO1xuICAgIHBvc2l0aW9uOiBEcmFnRHJvcFBvc2l0aW9uO1xuICAgIGZpbGVzOiBEcmFnRHJvcEZpbGVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdMZWF2ZSA9IHtcbiAgICB0eXBlOiAnbGVhdmUnO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdTdGF0ZSA9IERyYWdFbnRlciB8IERyYWdPdmVyIHwgRHJhZ0Ryb3AgfCBEcmFnTGVhdmU7XG5cbmV4cG9ydCB0eXBlIEZpbGVEcmFnUGFja2V0ID0ge1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbiAgICBhcHA6IEFwcDtcbiAgICBzdGF0ZTogRHJhZ1N0YXRlO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BSZWFkUmVxdWVzdCA9IHtcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlYWRSZXF1ZXN0RGFzaGJvYXJkID0ge1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlYWRNZXRhID0ge1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG4gICAgZmlsZXM6IHJlYWRvbmx5IERyYWdEcm9wRmlsZVtdO1xufTtcblxuZXhwb3J0IHR5cGUgRmlsZURhdGEgPSB7XG4gICAgZmlsZTogRHJhZ0Ryb3BGaWxlO1xuICAgIGJ1ZmZlcjogVWludDhBcnJheTtcbn07XG5cbmV4cG9ydCBjbGFzcyBEcmFnRHJvcFJlYWRSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBtZXRhOiBEcmFnRHJvcFJlYWRNZXRhLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZmlsZXM6IFJlY29yZDxzdHJpbmcsIEZpbGVEYXRhPixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IG51bWJlciA9IDEsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogRHJhZ0Ryb3BSZWFkUmVzcG9uc2UpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChkYXRhLnZlcnNpb24pO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkoZGF0YS5tZXRhKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVMRUIxMjgoT2JqZWN0LmtleXMoZGF0YS5maWxlcykubGVuZ3RoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHsgZmlsZSwgYnVmZmVyIH1dIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEuZmlsZXMpKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoa2V5KTtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeShmaWxlKSk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IERyYWdEcm9wUmVhZFJlc3BvbnNlIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBtZXRhOiBEcmFnRHJvcFJlYWRNZXRhID0gSlNPTi5wYXJzZShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG5cbiAgICAgICAgY29uc3QgZmlsZXM6IFJlY29yZDxzdHJpbmcsIEZpbGVEYXRhPiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgZmlsZTogRHJhZ0Ryb3BGaWxlID0gSlNPTi5wYXJzZShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICAgICAgZmlsZXNba2V5XSA9IHsgZmlsZSwgYnVmZmVyIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IERyYWdEcm9wUmVhZFJlc3BvbnNlKFxuICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICAgIGZpbGVzLFxuICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVxdWVzdCA9IG9iamVjdDtcblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BSZXF1ZXN0RGFzaGJvYXJkID0ge1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICBhcHA6IEFwcEpzb247XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlcXVlc3RSZXNwb25zZSA9IHtcbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgb2s6IGJvb2xlYW47XG59O1xuIiwKICAgICJpbXBvcnQgeyBBcHAsIEFwcEpzb24gfSBmcm9tICcuLi8uLi9hcHAuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludC9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IFBlcm1pc3Npb25UeXBlSnNvbiB9IGZyb20gJy4uL3Blcm1pc3Npb24vcGVybWlzc2lvbi5qcyc7XG5pbXBvcnQgeyBQYWNrYWdlSW5mbyB9IGZyb20gJy4uL3BsdWdpbi9wYWNrYWdlLWluZm8uanMnO1xuaW1wb3J0IHsgUmVnaXN0cnksIFJlZ2lzdHJ5VHlwZSB9IGZyb20gJy4uL3JlZ2lzdHJ5L3JlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IEFwcEluZGV4UmVnaXN0cnlNZXRhIH0gZnJvbSAnLi4vc2VydmVyL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSAnLi4vdGFibGUvdGFibGUuanMnO1xuaW1wb3J0IHsgVGFibGVUeXBlIH0gZnJvbSAnLi4vdGFibGUvdGFibGUuanMnO1xuXG5pbXBvcnQgdHlwZSB7IERhc2hib2FyZEhhbmRsZXIgfSBmcm9tICcuL2hhbmRsZXIuanMnO1xuaW1wb3J0IHsgQXBwSW5zdGFsbFJlc3BvbnNlLCBEcmFnRHJvcCwgRHJhZ0Ryb3BSZWFkUmVxdWVzdCwgRHJhZ0Ryb3BSZWFkUmVxdWVzdERhc2hib2FyZCwgRHJhZ0Ryb3BSZWFkUmVzcG9uc2UsIERyYWdEcm9wUmVxdWVzdCwgRHJhZ0Ryb3BSZXF1ZXN0RGFzaGJvYXJkLCBEcmFnRHJvcFJlcXVlc3RSZXNwb25zZSwgRHJhZ0VudGVyLCBEcmFnTGVhdmUsIERyYWdPdmVyLCBGaWxlRHJhZ1BhY2tldCB9IGZyb20gJy4vcGFja2V0cy5qcyc7XG5cbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8RGFzaGJvYXJkRXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKFxuICAgICdkYXNoYm9hcmQnLFxuICAgIChvbXU6IE9tdSkgPT4gbmV3IERhc2hib2FyZEV4dGVuc2lvbihvbXUpLFxuKTtcblxudHlwZSBEYXNoYm9hcmRTZXRSZXNwb25zZSA9IHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xufTtcbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignc2V0Jyk7XG5jb25zdCBEQVNIQk9BUkRfU0VUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllciwgRGFzaGJvYXJkU2V0UmVzcG9uc2U+KFxuICAgIERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdzZXQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogSWRlbnRpZmllcixcbiAgICAgICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5leHBvcnQgY29uc3QgREFTSEJPQVJEX09QRU5fQVBQX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignYXBwJywgJ29wZW4nKTtcbmNvbnN0IERBU0hCT0FSRF9PUEVOX0FQUF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPEFwcCwgdm9pZD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ29wZW5fYXBwJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogQXBwLFxuICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX09QRU5fQVBQX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IERBU0hCT0FSRF9PUEVOX0FQUF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248QXBwPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnb3Blbl9hcHAnLFxuICAgIHNlcmlhbGl6ZXI6IEFwcCxcbn0pO1xuZXhwb3J0IGNvbnN0IERBU0hPQkFSRF9BUFBfUkVBRF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2FwcCcsICdyZWFkJyk7XG5leHBvcnQgY29uc3QgREFTSE9CQVJEX0FQUF9FRElUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignYXBwJywgJ2VkaXQnKTtcbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfQVBQX0lOU1RBTExfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdhcHAnLCAnaW5zdGFsbCcpO1xuY29uc3QgREFTSEJPQVJEX0FQUF9JTlNUQUxMX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248QXBwLCBBcHBJbnN0YWxsUmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpbnN0YWxsX2FwcCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IEFwcCxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9BUFBfSU5TVEFMTF9QRVJNSVNTSU9OX0lELFxufSk7XG5leHBvcnQgY29uc3QgREFTaEJPQVJEX0RSQUdfRFJPUF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2RyYWdfZHJvcCcpO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248RmlsZURyYWdQYWNrZXQ+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3Bfc3RhdGUnLFxuICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcDxGaWxlRHJhZ1BhY2tldD4oKVxuICAgICAgICAuZmllbGQoJ2FwcCcsIEFwcCksXG59KTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfUkVBRF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPERyYWdEcm9wUmVhZFJlcXVlc3QsIERyYWdEcm9wUmVhZFJlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3JlYWQnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemVyLmpzb24oKSxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IERyYWdEcm9wUmVhZFJlc3BvbnNlLFxufSk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVRVUVTVF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248RHJhZ0Ryb3BSZWFkUmVxdWVzdERhc2hib2FyZD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9yZWFkX3JlcXVlc3QnLFxufSk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVTUE9OU0VfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPERyYWdEcm9wUmVhZFJlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3JlYWRfcmVzcG9uc2UnLFxuICAgIHNlcmlhbGl6ZXI6IERyYWdEcm9wUmVhZFJlc3BvbnNlLFxufSk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxEcmFnRHJvcFJlcXVlc3QsIERyYWdEcm9wUmVxdWVzdFJlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3JlcXVlc3QnLFxuICAgIHBlcm1pc3Npb25JZDogREFTaEJPQVJEX0RSQUdfRFJPUF9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPERyYWdEcm9wUmVxdWVzdERhc2hib2FyZD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9yZXF1ZXN0Jyxcbn0pO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX0FQUFJPVkFMX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxEcmFnRHJvcFJlcXVlc3RSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9yZXF1ZXN0X2FwcHJvdmFsJyxcbn0pO1xuXG50eXBlIERyYWdEcm9wSGFuZGxlciA9IHtcbiAgICBvbkVudGVyKGZuOiAoZXZlbnQ6IERyYWdFbnRlcikgPT4gdW5rbm93bik6IHZvaWQ7XG4gICAgb25PdmVyKGZuOiAoZXZlbnQ6IERyYWdPdmVyKSA9PiB1bmtub3duKTogdm9pZDtcbiAgICBvbkRyb3AoZm46IChldmVudDogRHJhZ0Ryb3ApID0+IHVua25vd24pOiB2b2lkO1xuICAgIG9uTGVhdmUoZm46IChldmVudDogRHJhZ0xlYXZlKSA9PiB1bmtub3duKTogdm9pZDtcbiAgICByZWFkKGlkOiBzdHJpbmcpOiBQcm9taXNlPERyYWdEcm9wUmVhZFJlc3BvbnNlPjtcbn07XG5cbmV4cG9ydCB0eXBlIENvb2tpZSA9IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdSZXF1ZXN0ID0ge1xuICAgIHVybDogc3RyaW5nO1xuICAgIHNjcmlwdDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld1BhY2tldCA9IHtcbiAgICBpZDogSWRlbnRpZmllcjtcbn07XG5cbmV4cG9ydCB0eXBlIFVzZXJSZXNwb25zZTxUID0gdW5kZWZpbmVkPiA9IHtcbiAgICB0eXBlOiAnb2snO1xuICAgIHZhbHVlOiBUO1xufSB8IHtcbiAgICB0eXBlOiAnYmxvY2tlZCc7XG59IHwge1xuICAgIHR5cGU6ICdjYW5jZWxsZWQnO1xufTtcbmV4cG9ydCBjbGFzcyBVc2VyUmVzdWx0PFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlc3VsdDoge1xuICAgICAgICAgICAgdHlwZTogJ29rJztcbiAgICAgICAgICAgIHZhbHVlOiBUO1xuICAgICAgICB9IHwge1xuICAgICAgICAgICAgdHlwZTogJ2Jsb2NrZWQnO1xuICAgICAgICB9IHwge1xuICAgICAgICAgICAgdHlwZTogJ2NhbmNlbGxlZCc7XG4gICAgICAgIH0sXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHVud3JhcCgpOiBUIHtcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0LnR5cGUgPT09ICdvaycpIHJldHVybiB0aGlzLnJlc3VsdC52YWx1ZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byB1bndyYXAgYSAke3RoaXMucmVzdWx0LnR5cGV9IHJlc3VsdGApO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgV2Vidmlld1Jlc3BvbnNlID0gVXNlclJlc3BvbnNlICYgV2Vidmlld1BhY2tldDtcblxuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9XRUJWSUVXX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignd2VidmlldycpO1xuXG5leHBvcnQgdHlwZSBIb3N0UmVxdWVzdCA9IHtcbiAgICBob3N0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBHZXRDb29raWVzUmVxdWVzdCA9IHtcbiAgICB1cmw6IHN0cmluZztcbn07XG5cbmNvbnN0IERBU0hCT0FSRF9DT09LSUVTX0dFVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPEdldENvb2tpZXNSZXF1ZXN0LCBVc2VyUmVzcG9uc2U8Q29va2llW10+PihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnY29va2llc19nZXQnLFxuICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX1dFQlZJRVdfUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5jb25zdCBEQVNIQk9BUkRfV0VCVklFV19SRVFVRVNUID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248V2Vidmlld1JlcXVlc3QsIFdlYnZpZXdSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dlYnZpZXdfcmVxdWVzdCcsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3A8V2Vidmlld1Jlc3BvbnNlPigpXG4gICAgICAgIC5maWVsZCgnaWQnLCBJZGVudGlmaWVyKSxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9XRUJWSUVXX1BFUk1JU1NJT05fSUQsXG59KTtcblxuY29uc3QgREFTSEJPQVJEX1dFQlZJRVdfQ0xPU0UgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxXZWJ2aWV3UGFja2V0LCBXZWJ2aWV3UmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3ZWJ2aWV3X2Nsb3NlJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wPFdlYnZpZXdQYWNrZXQ+KClcbiAgICAgICAgLmZpZWxkKCdpZCcsIElkZW50aWZpZXIpLFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wPFdlYnZpZXdSZXNwb25zZT4oKVxuICAgICAgICAuZmllbGQoJ2lkJywgSWRlbnRpZmllciksXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lELFxufSk7XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdFdmVudCA9IHtcbiAgICB0eXBlOiAnY2xvc2VkJztcbn0gfCB7XG4gICAgdHlwZTogJ3Jlc2l6ZSc7XG4gICAgZGltZW50aW9uczoge1xuICAgICAgICB4OiBudW1iZXI7XG4gICAgICAgIHk6IG51bWJlcjtcbiAgICB9O1xufSB8IHtcbiAgICB0eXBlOiAnY29va2llJztcbiAgICBjb29raWVzOiBDb29raWVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdFdmVudExpc3RlbmVycyA9IHtcbiAgICBbSyBpbiBXZWJ2aWV3RXZlbnRbJ3R5cGUnXV0/OiBBcnJheTwoZXZlbnQ6IEV4dHJhY3Q8V2Vidmlld0V2ZW50LCB7IHR5cGU6IEsgfT4pID0+IHZvaWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld0V2ZW50UGFja2V0ID0ge1xuICAgIGlkOiBJZGVudGlmaWVyO1xuICAgIHRhcmdldDogSWRlbnRpZmllcjtcbiAgICBldmVudDogV2Vidmlld0V2ZW50O1xufTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld0hhbmRsZSA9IHtcbiAgICByZWFkb25seSBpZDogSWRlbnRpZmllcjtcbiAgICByZWFkb25seSB1cmw6IHN0cmluZztcbiAgICBnZXRDb29raWVzKCk6IFByb21pc2U8Q29va2llW10+O1xuICAgIGNsb3NlKCk6IHZvaWQ7XG4gICAgb248VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihrZXk6IFQsIGNhbGxiYWNrOiAoZXZlbnQ6IEV4dHJhY3Q8V2Vidmlld0V2ZW50LCB7IHR5cGU6IFQgfT4pID0+IHZvaWQpOiB2b2lkO1xuICAgIGpvaW4oKTogUHJvbWlzZTx2b2lkPjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYnZpZXdFdmVudEVtaXQgPSA8VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihldmVudDogRXh0cmFjdDxXZWJ2aWV3RXZlbnQsIHsgdHlwZTogVCB9PikgPT4gdm9pZDtcblxuY29uc3QgREFTSEJPQVJEX1dFQlZJRVdfRVZFTlRfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFdlYnZpZXdFdmVudFBhY2tldD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dlYnZpZXdfZXZlbnQnLFxuICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcDxXZWJ2aWV3RXZlbnRQYWNrZXQ+KClcbiAgICAgICAgLmZpZWxkKCdpZCcsIElkZW50aWZpZXIpXG4gICAgICAgIC5maWVsZCgndGFyZ2V0JywgSWRlbnRpZmllciksXG59KTtcblxudHlwZSBBbGxvd2VkSG9zdCA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGhvc3RzOiBzdHJpbmdbXTtcbn07XG5cbmNvbnN0IERBU0hCT0FSRF9BTExPV0VEX1dFQlZJRVdfSE9TVFMgPSBUYWJsZVR5cGUuY3JlYXRlSnNvbjxBbGxvd2VkSG9zdD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2FsbG93ZWRfd2Vidmlld19ob3N0cycsXG4gICAga2V5OiAoZW50cnkpID0+IGVudHJ5LmlkLFxuICAgIHBlcm1pc3Npb25zOiB7IGFsbDogREFTSEJPQVJEX1NFVF9QRVJNSVNTSU9OX0lEIH0sXG59KTtcblxuY29uc3QgREFTSEJPQVJEX0hPU1RfUkVRVUVTVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPHtcbiAgICBob3N0OiBzdHJpbmc7XG59LCBVc2VyUmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdob3N0X3JlcXVlc3QnLFxuICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX1dFQlZJRVdfUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5leHBvcnQgY29uc3QgREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3NwZWVjaF9yZWNvZ25pdGlvbicpO1xuXG5leHBvcnQgdHlwZSBUcmFuc2NyaXB0U2VnbWVudCA9IHtcbiAgICBjb25maWRlbmNlOiBudW1iZXI7XG4gICAgdHJhbnNjcmlwdDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVHJhbnNjcmlwdFN0YXR1cyA9IHtcbiAgICB0eXBlOiAnaWRsZSc7XG59IHwge1xuICAgIHR5cGU6ICdyZXN1bHQnO1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgIHNlZ21lbnRzOiBUcmFuc2NyaXB0U2VnbWVudFtdO1xufSB8IHtcbiAgICB0eXBlOiAnZmluYWwnO1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgIHNlZ21lbnRzOiBUcmFuc2NyaXB0U2VnbWVudFtdO1xufSB8IHtcbiAgICB0eXBlOiAnYXVkaW9fc3RhcnRlZCc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG59IHwge1xuICAgIHR5cGU6ICdhdWRpb19lbmRlZCc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG59O1xuXG5jb25zdCBEQVNIQk9BUkRfU1BFRUNIX1JFQ09HTklUSU9OID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248VHJhbnNjcmlwdFN0YXR1cz4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NwZWVjaF9yZWNvZ25pdGlvbicsXG4gICAgZGVmYXVsdFZhbHVlOiB7IHR5cGU6ICdpZGxlJyB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIHJlYWQ6IERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fUEVSTUlTU0lPTl9JRCxcbiAgICAgICAgd3JpdGU6IERBU0hCT0FSRF9TRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCB0eXBlIFNwZWVjaFJlY29nbml0aW9uU3RhcnQgPSB7XG4gICAgdHlwZTogJ3N0YXJ0Jztcbn07XG5cbmNvbnN0IERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fU1RBUlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxTcGVlY2hSZWNvZ25pdGlvblN0YXJ0LCBVc2VyUmVzcG9uc2U8dW5kZWZpbmVkPj4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NwZWVjaF9yZWNvZ25pdGlvbl9zdGFydCcsXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfU1BFRUNIX1JFQ09HTklUSU9OX1BFUk1JU1NJT05fSUQsXG59KTtcblxuaW50ZXJmYWNlIFByb21wdFJlcXVlc3RCYXNlPFQgZXh0ZW5kcyBzdHJpbmc+IHtcbiAgICBraW5kOiBUO1xuICAgIGlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEFwcFBlcm1pc3Npb25zIGV4dGVuZHMgUHJvbXB0UmVxdWVzdEJhc2U8J2FwcC9wZXJtaXNzaW9ucyc+IHtcbiAgICBhcHA6IEFwcEpzb247XG4gICAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25UeXBlSnNvbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFJlcXVlc3RBcHBQbHVnaW5zIGV4dGVuZHMgUHJvbXB0UmVxdWVzdEJhc2U8J2FwcC9wbHVnaW5zJz4ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBwYWNrYWdlczogUGFja2FnZUluZm9bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRSZXF1ZXN0QXBwSW5zdGFsbCBleHRlbmRzIFByb21wdFJlcXVlc3RCYXNlPCdhcHAvaW5zdGFsbCc+IHtcbiAgICBhcHA6IEFwcEpzb247XG4gICAgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBBcHBKc29uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRSZXF1ZXN0QXBwVXBkYXRlIGV4dGVuZHMgUHJvbXB0UmVxdWVzdEJhc2U8J2FwcC91cGRhdGUnPiB7XG4gICAgb2xkX2FwcDogQXBwSnNvbjtcbiAgICBuZXdfYXBwOiBBcHBKc29uO1xuICAgIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgQXBwSnNvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEluZGV4SW5zdGFsbCBleHRlbmRzIFByb21wdFJlcXVlc3RCYXNlPCdpbmRleC9pbnN0YWxsJz4ge1xuICAgIGluZGV4X3VybDogc3RyaW5nO1xuICAgIG1ldGE/OiBBcHBJbmRleFJlZ2lzdHJ5TWV0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3J0UHJvY2VzcyB7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBleGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRSZXF1ZXN0SHR0cFBvcnQgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnaHR0cC9wb3J0Jz4ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBwcm9jZXNzZXM6IFBvcnRQcm9jZXNzW107XG59XG5cbmV4cG9ydCB0eXBlIFByb21wdFJlcXVlc3QgPSAoXG4gICAgUHJvbXB0UmVxdWVzdEFwcFBlcm1pc3Npb25zXG4gICAgfCBQcm9tcHRSZXF1ZXN0QXBwUGx1Z2luc1xuICAgIHwgUHJvbXB0UmVxdWVzdEFwcEluc3RhbGxcbiAgICB8IFByb21wdFJlcXVlc3RBcHBVcGRhdGVcbiAgICB8IFByb21wdFJlcXVlc3RJbmRleEluc3RhbGxcbiAgICB8IFByb21wdFJlcXVlc3RIdHRwUG9ydFxuKTtcblxuY29uc3QgREFTSEJPQVJEX1BST01QVF9SRVFVRVNUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFByb21wdFJlcXVlc3Q+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdwcm9tcHRfcmVxdWVzdCcsXG59KTtcblxuZXhwb3J0IHR5cGUgUHJvbXB0UmVzdWx0ID0gJ2FjY2VwdCcgfCAnZGVueScgfCAnYmxvY2snO1xuXG5pbnRlcmZhY2UgUHJvbXB0UmVzcG9uc2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAga2luZDogc3RyaW5nO1xuICAgIHJlc3VsdDogUHJvbXB0UmVzdWx0O1xufVxuXG5jb25zdCBEQVNIQk9BUkRfUFJPTVBUX1JFU1BPTlNFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFByb21wdFJlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJvbXB0X3Jlc3BvbnNlJyxcbn0pO1xuXG5jb25zdCBEQVNIQk9BUkRfUFJPTVBUX0NMRUFSX0JMT0NLRUQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxudWxsLCBudWxsPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJvbXB0X2NsZWFyX2Jsb2NrZWQnLFxufSk7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPERhc2hib2FyZEV4dGVuc2lvbj4gPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSBkYXNoYm9hcmQ6IERhc2hib2FyZEhhbmRsZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGRyYWdEcm9wSGFuZGxlcjogRHJhZ0Ryb3BIYW5kbGVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBkcmFnRHJvcExpc3RlbmVycyA9IHtcbiAgICAgICAgZW50ZXI6IFtdIGFzIEFycmF5PChzdGF0ZTogRHJhZ0VudGVyKSA9PiB1bmtub3duPixcbiAgICAgICAgb3ZlcjogW10gYXMgQXJyYXk8KHN0YXRlOiBEcmFnT3ZlcikgPT4gdW5rbm93bj4sXG4gICAgICAgIGRyb3A6IFtdIGFzIEFycmF5PChzdGF0ZTogRHJhZ0Ryb3ApID0+IHVua25vd24+LFxuICAgICAgICBsZWF2ZTogW10gYXMgQXJyYXk8KHN0YXRlOiBEcmFnTGVhdmUpID0+IHVua25vd24+LFxuICAgIH07XG4gICAgcHVibGljIHJlYWRvbmx5IGFsbG93ZWRIb3N0czogVGFibGU8QWxsb3dlZEhvc3Q+O1xuICAgIHB1YmxpYyByZWFkb25seSBzcGVlY2hSZWNvZ25pdGlvbjogUmVnaXN0cnk8VHJhbnNjcmlwdFN0YXR1cz47XG4gICAgcHJpdmF0ZSByZWFkb25seSB3ZWJ2aWV3SGFuZGxlczogSWRlbnRpZmllck1hcDx7IGhhbmRsZTogV2Vidmlld0hhbmRsZTsgZW1pdDogV2Vidmlld0V2ZW50RW1pdCB9PiA9IG5ldyBJZGVudGlmaWVyTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgREFTSEJPQVJEX09QRU5fQVBQX1BBQ0tFVCxcbiAgICAgICAgICAgIERBU0hCT0FSRF9EUkFHX0RST1BfU1RBVEVfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFUVVFU1RfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFU1BPTlNFX1BBQ0tFVCxcbiAgICAgICAgICAgIERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfQVBQUk9WQUxfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX1dFQlZJRVdfRVZFTlRfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX1BST01QVF9SRVFVRVNULFxuICAgICAgICAgICAgREFTSEJPQVJEX1BST01QVF9SRVNQT05TRSxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihEQVNIQk9BUkRfUFJPTVBUX1JFUVVFU1QsIChyZXF1ZXN0KSA9PlxuICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9tcHRSZXF1ZXN0KHJlcXVlc3QpLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9PUEVOX0FQUF9QQUNLRVQsIChhcHApID0+XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU9wZW5BcHAoYXBwKSxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfUEFDS0VULCAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEcmFnRHJvcFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9EUkFHX0RST1BfU1RBVEVfUEFDS0VULCAoeyBzdGF0ZSB9KSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdlbnRlcic6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRHJvcExpc3RlbmVycy5lbnRlci5mb3JFYWNoKChmbikgPT4gZm4oc3RhdGUpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ292ZXInOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BMaXN0ZW5lcnMub3Zlci5mb3JFYWNoKChmbikgPT4gZm4oc3RhdGUpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Ryb3AnOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BMaXN0ZW5lcnMuZHJvcC5mb3JFYWNoKChmbikgPT4gZm4oc3RhdGUpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2xlYXZlJzoge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdEcm9wTGlzdGVuZXJzLmxlYXZlLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9EUkFHX0RST1BfUkVBRF9SRVFVRVNUX1BBQ0tFVCwgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRHJhZ0Ryb3BSZWFkUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX1dFQlZJRVdfRVZFTlRfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndlYnZpZXdIYW5kbGVzLmdldChwYWNrZXQuaWQpO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHJldHVybjtcbiAgICAgICAgICAgIGhhbmRsZS5lbWl0KHBhY2tldC5ldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFsbG93ZWRIb3N0cyA9IG9tdS50YWJsZXMuZ2V0KERBU0hCT0FSRF9BTExPV0VEX1dFQlZJRVdfSE9TVFMpO1xuICAgICAgICB0aGlzLnNwZWVjaFJlY29nbml0aW9uID0gb211LnJlZ2lzdHJpZXMuZ2V0KERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT04pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVJlcXVlc3RGb3JEYXNoYm9hcmQocmVxdWVzdDogUHJvbXB0UmVxdWVzdCk6IFByb21pc2U8UHJvbXB0UmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIHN3aXRjaCAocmVxdWVzdC5raW5kKSB7XG4gICAgICAgICAgICBjYXNlICdhcHAvcGVybWlzc2lvbnMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlUGVybWlzc2lvblJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgICAgICBjYXNlICdhcHAvcGx1Z2lucyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVQbHVnaW5SZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICAgICAgY2FzZSAnYXBwL2luc3RhbGwnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlSW5zdGFsbEFwcChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGNhc2UgJ2FwcC91cGRhdGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlVXBkYXRlQXBwKHJlcXVlc3QpO1xuICAgICAgICAgICAgY2FzZSAnaW5kZXgvaW5zdGFsbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVJbmRleEluc3RhbGwocmVxdWVzdCk7XG4gICAgICAgICAgICBjYXNlICdodHRwL3BvcnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlSHR0cFBvcnRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcHJvbXB0IHJlcXVlc3RlZDogJHtKU09OLnN0cmluZ2lmeShyZXF1ZXN0KX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlUHJvbXB0UmVxdWVzdChyZXF1ZXN0OiBQcm9tcHRSZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdEZvckRhc2hib2FyZChyZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfUFJPTVBUX1JFU1BPTlNFLCB7XG4gICAgICAgICAgICBpZDogcmVxdWVzdC5pZCxcbiAgICAgICAgICAgIGtpbmQ6IHJlcXVlc3Qua2luZCxcbiAgICAgICAgICAgIHJlc3VsdDogcmVzcG9uc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlT3BlbkFwcChhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXNoYm9hcmQgPSB0aGlzLmdldERhc2hib2FyZCgpO1xuICAgICAgICBhd2FpdCBkYXNoYm9hcmQuaGFuZGxlT3BlbkFwcChhcHApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlRHJhZ0Ryb3BSZXF1ZXN0KHJlcXVlc3Q6IERyYWdEcm9wUmVxdWVzdERhc2hib2FyZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXNoYm9hcmQgPSB0aGlzLmdldERhc2hib2FyZCgpO1xuICAgICAgICBjb25zdCBhY2NlcHRlZCA9IGF3YWl0IGRhc2hib2FyZC5oYW5kbGVEcmFnRHJvcFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIHRoaXMub211LnNlbmQoREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX0FQUFJPVkFMX1BBQ0tFVCwge1xuICAgICAgICAgICAgb2s6IGFjY2VwdGVkLFxuICAgICAgICAgICAgcmVxdWVzdF9pZDogcmVxdWVzdC5yZXF1ZXN0X2lkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGhhbmRsZURyYWdEcm9wUmVhZFJlcXVlc3QocmVxdWVzdDogRHJhZ0Ryb3BSZWFkUmVxdWVzdERhc2hib2FyZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXNoYm9hcmQgPSB0aGlzLmdldERhc2hib2FyZCgpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGRhc2hib2FyZC5oYW5kbGVEcmFnRHJvcFJlYWRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKERBU0hCT0FSRF9EUkFHX0RST1BfUkVBRF9SRVNQT05TRV9QQUNLRVQsIHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERhc2hib2FyZCgpOiBEYXNoYm9hcmRIYW5kbGVyIHtcbiAgICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Rhc2hib2FyZCBub3Qgc2V0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGFzaGJvYXJkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoZGFzaGJvYXJkOiBEYXNoYm9hcmRIYW5kbGVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMub211LnBlcm1pc3Npb25zLnJlcXVpcmUoREFTSEJPQVJEX1NFVF9QRVJNSVNTSU9OX0lEKTtcbiAgICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Rhc2hib2FyZCBhbHJlYWR5IHNldCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkID0gZGFzaGJvYXJkO1xuICAgICAgICB0aGlzLm9tdS5lbmRwb2ludHMuYmluZChEQVNIQk9BUkRfQ09PS0lFU19HRVQsIGFzeW5jIChyZXF1ZXN0LCBwYXJhbXMpOiBQcm9taXNlPFVzZXJSZXNwb25zZTxDb29raWVbXT4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXJsIH0gPSByZXF1ZXN0O1xuICAgICAgICAgICAgY29uc3QgeyBob3N0bmFtZSB9ID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICAgICAgY29uc3QgaWQgPSBwYXJhbXMuY2FsbGVyLmtleSgpO1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZEhvc3Q6IEFsbG93ZWRIb3N0ID0gYXdhaXQgdGhpcy5hbGxvd2VkSG9zdHMuZ2V0KGlkKSA/PyB7IGlkLCBob3N0czogW10gfTtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSBhbGxvd2VkSG9zdC5ob3N0cy5pbmNsdWRlcyhob3N0bmFtZSk7XG4gICAgICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2FuY2VsbGVkJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5nZXRDb29raWVzKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX0hPU1RfUkVRVUVTVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPiA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGhvc3QgfSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHBhcmFtcy5jYWxsZXIua2V5KCk7XG4gICAgICAgICAgICBjb25zdCBob3N0RW50cnk6IEFsbG93ZWRIb3N0ID0gYXdhaXQgdGhpcy5hbGxvd2VkSG9zdHMuZ2V0KGlkKSA/PyB7IGlkLCBob3N0czogW10gfTtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSBob3N0RW50cnkuaG9zdHMuaW5jbHVkZXMoaG9zdCk7XG4gICAgICAgICAgICBpZiAoYWxsb3dlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvaycsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhc2hib2FyZC5ob3N0UmVxdWVzdGVkKHJlcXVlc3QsIHBhcmFtcyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnR5cGUgPT09ICdvaycpIHtcbiAgICAgICAgICAgICAgICBob3N0RW50cnkuaG9zdHMucHVzaChob3N0KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFsbG93ZWRIb3N0cy51cGRhdGUoaG9zdEVudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9tdS5lbmRwb2ludHMuYmluZChEQVNIQk9BUkRfV0VCVklFV19SRVFVRVNULCBhc3luYyAocmVxdWVzdCwgcGFyYW1zKTogUHJvbWlzZTxXZWJ2aWV3UmVzcG9uc2U+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVtaXQgPSBhc3luYyAoZXZlbnQ6IFdlYnZpZXdFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoREFTSEJPQVJEX1dFQlZJRVdfRVZFTlRfUEFDS0VULCB7XG4gICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHBhcmFtcy5jYWxsZXIsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gYXdhaXQgZGFzaGJvYXJkLmNyZWF0ZVdlYnZpZXcocmVxdWVzdCwgcGFyYW1zLCBlbWl0KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ29rJyxcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5iaW5kKERBU0hCT0FSRF9XRUJWSUVXX0NMT1NFLCBhc3luYyAocmVxdWVzdCwgcGFyYW1zKTogUHJvbWlzZTxXZWJ2aWV3UmVzcG9uc2U+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gYXdhaXQgZGFzaGJvYXJkLmdldFdlYnZpZXcocmVxdWVzdCwgcGFyYW1zKTtcbiAgICAgICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2FuY2VsbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3QuaWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGRhc2hib2FyZC5jbG9zZVdlYnZpZXcocmVxdWVzdCwgcGFyYW1zKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ29rJyxcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5iaW5kKERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fU1RBUlQsIGFzeW5jIChyZXF1ZXN0LCBwYXJhbXMpOiBQcm9taXNlPFVzZXJSZXNwb25zZTx1bmRlZmluZWQ+PiA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYXNoYm9hcmQuc3BlZWNoUmVjb2duaXRpb25TdGFydChyZXF1ZXN0LCBwYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub211Lm5ldHdvcmsuYWRkVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFxuICAgICAgICAgICAgICAgIERBU0hCT0FSRF9TRVRfRU5EUE9JTlQsXG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuYXBwLmlkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNldCBkYXNoYm9hcmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3RIb3N0KG9wdGlvbnM6IHsgaG9zdDogc3RyaW5nIH0pOiBQcm9taXNlPFVzZXJSZXNwb25zZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBEQVNIQk9BUkRfSE9TVF9SRVFVRVNULFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdFdlYnZpZXcob3B0aW9uczogV2Vidmlld1JlcXVlc3QpOiBQcm9taXNlPFVzZXJSZXN1bHQ8V2Vidmlld0hhbmRsZT4+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBEQVNIQk9BUkRfV0VCVklFV19SRVFVRVNULFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdC50eXBlICE9PSAnb2snKSByZXR1cm4gbmV3IFVzZXJSZXN1bHQocmVzdWx0KTtcbiAgICAgICAgY29uc3QgeyBpZCB9ID0gcmVzdWx0O1xuICAgICAgICBjb25zdCBldmVudExpc3RlbmVyczogV2Vidmlld0V2ZW50TGlzdGVuZXJzID0ge307XG4gICAgICAgIGNvbnN0IGhhbmRsZTogV2Vidmlld0hhbmRsZSA9IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgdXJsOiBvcHRpb25zLnVybCxcbiAgICAgICAgICAgIGNsb3NlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICAgICAgICAgIERBU0hCT0FSRF9XRUJWSUVXX0NMT1NFLFxuICAgICAgICAgICAgICAgICAgICB7IGlkIH0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRDb29raWVzOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29va2llcyA9IChhd2FpdCB0aGlzLmdldENvb2tpZXMoe1xuICAgICAgICAgICAgICAgICAgICB1cmw6IG9wdGlvbnMudXJsLFxuICAgICAgICAgICAgICAgIH0pKS51bndyYXAoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29va2llcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbjogZnVuY3Rpb24gPFQgZXh0ZW5kcyBXZWJ2aWV3RXZlbnRbJ3R5cGUnXT4oa2V5OiBULCBjYWxsYmFjazogKGV2ZW50OiBFeHRyYWN0PFdlYnZpZXdFdmVudCwgeyB0eXBlOiBUIH0+KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgaWYgKCFldmVudExpc3RlbmVyc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50TGlzdGVuZXJzW2tleV0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnNba2V5XSE7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGpvaW46IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGUub24oJ2Nsb3NlZCcsICgpID0+IHJlc29sdmUoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLndlYnZpZXdIYW5kbGVzLnNldChpZCwge1xuICAgICAgICAgICAgaGFuZGxlLFxuICAgICAgICAgICAgZW1pdDogZnVuY3Rpb24gPFQgZXh0ZW5kcyBXZWJ2aWV3RXZlbnRbJ3R5cGUnXT4oZXZlbnQ6IEV4dHJhY3Q8V2Vidmlld0V2ZW50LCB7IHR5cGU6IFQgfT4pOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVyc1tldmVudC50eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVycykgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyUmVzdWx0KHtcbiAgICAgICAgICAgIHR5cGU6ICdvaycsXG4gICAgICAgICAgICB2YWx1ZTogaGFuZGxlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29va2llcyhvcHRpb25zOiBHZXRDb29raWVzUmVxdWVzdCk6IFByb21pc2U8VXNlclJlc3VsdDxDb29raWVbXT4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyUmVzdWx0KGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFxuICAgICAgICAgICAgREFTSEJPQVJEX0NPT0tJRVNfR0VULFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9wZW5BcHAoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9PUEVOX0FQUF9FTkRQT0lOVCwgYXBwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaW5zdGFsbEFwcChhcHA6IEFwcCk6IFByb21pc2U8QXBwSW5zdGFsbFJlc3BvbnNlPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChEQVNIQk9BUkRfQVBQX0lOU1RBTExfRU5EUE9JTlQsIGFwcCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFyQmxvY2tlZFByb21wdHMoKTogUHJvbWlzZTxudWxsPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChEQVNIQk9BUkRfUFJPTVBUX0NMRUFSX0JMT0NLRUQsIG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1aXJlRHJhZ0Ryb3AoKTogUHJvbWlzZTxEcmFnRHJvcEhhbmRsZXI+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX0VORFBPSU5ULCB7fSk7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZHJhZ0Ryb3BMaXN0ZW5lcnM7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IHRoaXMub211O1xuICAgICAgICB0aGlzLmRyYWdEcm9wSGFuZGxlciA9IHtcbiAgICAgICAgICAgIG9uRW50ZXIoZm4pIHsgbGlzdGVuZXJzLmVudGVyLnB1c2goZm4pOyB9LFxuICAgICAgICAgICAgb25PdmVyKGZuKSB7IGxpc3RlbmVycy5vdmVyLnB1c2goZm4pOyB9LFxuICAgICAgICAgICAgb25Ecm9wKGZuKSB7IGxpc3RlbmVycy5kcm9wLnB1c2goZm4pOyB9LFxuICAgICAgICAgICAgb25MZWF2ZShmbikgeyBsaXN0ZW5lcnMubGVhdmUucHVzaChmbik7IH0sXG4gICAgICAgICAgICBhc3luYyByZWFkKGlkKSB7IHJldHVybiBhd2FpdCBjbGllbnQuZW5kcG9pbnRzLmNhbGwoREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX0VORFBPSU5ULCB7IGRyYWdfaWQ6IGlkIH0pOyB9LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5kcmFnRHJvcEhhbmRsZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG5vdGlmeURyb3BEcmFnU3RhdGUocGFja2V0OiBGaWxlRHJhZ1BhY2tldCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLm9tdS5zZW5kKERBU0hCT0FSRF9EUkFHX0RST1BfU1RBVEVfUEFDS0VULCBwYWNrZXQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzcGVlY2hSZWNvZ25pdGlvblN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChEQVNIQk9BUkRfU1BFRUNIX1JFQ09HTklUSU9OX1NUQVJULCB7IHR5cGU6ICdzdGFydCcgfSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGNsYXNzIEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZW5kcG9pbnRzOiBJZGVudGlmaWVyTWFwPElkZW50aWZpZXIgfCB1bmRlZmluZWQ+LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBFbmRwb2ludFJlZ2lzdGVyUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVVMRUIxMjgoaXRlbS5lbmRwb2ludHMuc2l6ZSk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGl0ZW0uZW5kcG9pbnRzKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoa2V5LmtleSgpKTtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyh2YWx1ZT8ua2V5KCkgPz8gJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBVaW50OEFycmF5KTogRW5kcG9pbnRSZWdpc3RlclBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGVuZHBvaW50cyA9IG5ldyBJZGVudGlmaWVyTWFwPElkZW50aWZpZXIgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgICAgICBlbmRwb2ludHMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRSZWdpc3RlclBhY2tldChlbmRwb2ludHMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludm9rZWRQYXJhbXMge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjYWxsZXI6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBrZXk6IG51bWJlcixcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaXRlbTogSW52b2tlZFBhcmFtcyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBpZDogaXRlbS5pZC5rZXkoKSxcbiAgICAgICAgICAgIGNhbGxlcjogaXRlbS5jYWxsZXIua2V5KCksXG4gICAgICAgICAgICBrZXk6IGl0ZW0ua2V5LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IHN0cmluZyk6IEludm9rZWRQYXJhbXMge1xuICAgICAgICBjb25zdCBkYXRhOiB7XG4gICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAgY2FsbGVyOiBzdHJpbmc7XG4gICAgICAgICAgICBrZXk6IG51bWJlcjtcbiAgICAgICAgfSA9IEpTT04ucGFyc2UoaXRlbSk7XG4gICAgICAgIHJldHVybiBuZXcgSW52b2tlZFBhcmFtcyhcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbUtleShkYXRhLmlkKSxcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbUtleShkYXRhLmNhbGxlciksXG4gICAgICAgICAgICBkYXRhLmtleSxcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRJbnZva2VkUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHBhcmFtczogSW52b2tlZFBhcmFtcyxcbiAgICAgICAgcHVibGljIGJ1ZmZlcjogVWludDhBcnJheSxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaXRlbTogRW5kcG9pbnRJbnZva2VkUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhJbnZva2VkUGFyYW1zLnNlcmlhbGl6ZShpdGVtLnBhcmFtcykpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGl0ZW0uYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IFVpbnQ4QXJyYXkpOiBFbmRwb2ludEludm9rZWRQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGl0ZW0pO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBJbnZva2VkUGFyYW1zLmRlc2VyaWFsaXplKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludEludm9rZWRQYWNrZXQocGFyYW1zLCBidWZmZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludm9rZVBhcmFtcyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogbnVtYmVyLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBJbnZva2VQYXJhbXMpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgaWQ6IGl0ZW0uaWQua2V5KCksXG4gICAgICAgICAgICBrZXk6IGl0ZW0ua2V5LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IHN0cmluZyk6IEludm9rZVBhcmFtcyB7XG4gICAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBrZXk6IG51bWJlcjtcbiAgICAgICAgfSA9IEpTT04ucGFyc2UoaXRlbSk7XG4gICAgICAgIHJldHVybiBuZXcgSW52b2tlUGFyYW1zKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tS2V5KGRhdGEuaWQpLFxuICAgICAgICAgICAgZGF0YS5rZXksXG4gICAgICAgICk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIEVuZHBvaW50SW52b2tlUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHBhcmFtczogSW52b2tlUGFyYW1zLFxuICAgICAgICBwdWJsaWMgYnVmZmVyOiBVaW50OEFycmF5LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBFbmRwb2ludEludm9rZVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoSW52b2tlUGFyYW1zLnNlcmlhbGl6ZShpdGVtLnBhcmFtcykpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGl0ZW0uYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IFVpbnQ4QXJyYXkpOiBFbmRwb2ludEludm9rZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IEludm9rZVBhcmFtcy5kZXNlcmlhbGl6ZShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRJbnZva2VQYWNrZXQocGFyYW1zLCBidWZmZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlc3BvbnNlUGFyYW1zIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBlcnJvcjogc3RyaW5nIHwgbnVsbCxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaXRlbTogUmVzcG9uc2VQYXJhbXMpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgaWQ6IGl0ZW0uaWQua2V5KCksXG4gICAgICAgICAgICBrZXk6IGl0ZW0ua2V5LFxuICAgICAgICAgICAgZXJyb3I6IGl0ZW0uZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogc3RyaW5nKTogUmVzcG9uc2VQYXJhbXMge1xuICAgICAgICBjb25zdCBkYXRhOiB7XG4gICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAga2V5OiBudW1iZXI7XG4gICAgICAgICAgICBlcnJvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgfSA9IEpTT04ucGFyc2UoaXRlbSk7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2VQYXJhbXMoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb21LZXkoZGF0YS5pZCksXG4gICAgICAgICAgICBkYXRhLmtleSxcbiAgICAgICAgICAgIGRhdGEuZXJyb3IsXG4gICAgICAgICk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIEVuZHBvaW50UmVzcG9uc2VQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcGFyYW1zOiBSZXNwb25zZVBhcmFtcyxcbiAgICAgICAgcHVibGljIGJ1ZmZlcjogVWludDhBcnJheSxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaXRlbTogRW5kcG9pbnRSZXNwb25zZVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoUmVzcG9uc2VQYXJhbXMuc2VyaWFsaXplKGl0ZW0ucGFyYW1zKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoaXRlbS5idWZmZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IEVuZHBvaW50UmVzcG9uc2VQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGl0ZW0pO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBSZXNwb25zZVBhcmFtcy5kZXNlcmlhbGl6ZShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRSZXNwb25zZVBhY2tldChwYXJhbXMsIGJ1ZmZlcik7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4vZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRW5kcG9pbnRJbnZva2VkUGFja2V0LCBFbmRwb2ludEludm9rZVBhY2tldCwgRW5kcG9pbnRSZWdpc3RlclBhY2tldCwgRW5kcG9pbnRSZXNwb25zZVBhY2tldCwgSW52b2tlZFBhcmFtcywgSW52b2tlUGFyYW1zLCBSZXNwb25zZVBhcmFtcyB9IGZyb20gJy4vcGFja2V0cy5qcyc7XG5cbmV4cG9ydCBjb25zdCBFTkRQT0lOVF9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxFbmRwb2ludEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnZW5kcG9pbnQnLFxuICAgIChvbXU6IE9tdSkgPT4gbmV3IEVuZHBvaW50RXh0ZW5zaW9uKG9tdSksXG4pO1xuXG50eXBlIENhbGxQcm9taXNlID0ge1xuICAgIHJlc29sdmU6IChkYXRhOiBVaW50OEFycmF5KSA9PiB2b2lkO1xuICAgIHJlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbn07XG5cbnR5cGUgRW5kcG9pbnRIYW5kbGVyID0ge1xuICAgIHR5cGU6IEVuZHBvaW50VHlwZTtcbiAgICBoYW5kbGVyOiAocGFja2V0OiBFbmRwb2ludEludm9rZWRQYWNrZXQpID0+IFByb21pc2U8VWludDhBcnJheT47XG59O1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPEVuZHBvaW50RXh0ZW5zaW9uPiA9IEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYm91bmRFbmRwb2ludHMgPSBuZXcgSWRlbnRpZmllck1hcDxFbmRwb2ludEhhbmRsZXI+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNwb25zZVByb21pc2VzOiBNYXA8bnVtYmVyLCBDYWxsUHJvbWlzZT4gPSBuZXcgTWFwKCk7XG4gICAgcHJpdmF0ZSBjYWxsSWQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgdGhpcy5jYWxsSWQgPSBNYXRoLmZsb29yKChwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgcGVyZm9ybWFuY2Uubm93KCkpICogMTAwMCk7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgRU5EUE9JTlRfUkVHSVNURVJfUEFDS0VULFxuICAgICAgICAgICAgRU5EUE9JTlRfSU5WT0tFX1BBQ0tFVCxcbiAgICAgICAgICAgIEVORFBPSU5UX0lOVk9LRURfUEFDS0VULFxuICAgICAgICAgICAgRU5EUE9JTlRfUkVTUE9OU0VfUEFDS0VULFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKEVORFBPSU5UX0lOVk9LRURfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUludm9rZWQocGFja2V0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoRU5EUE9JTlRfUkVTUE9OU0VfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5yZXNwb25zZVByb21pc2VzLmdldChwYWNrZXQucGFyYW1zLmtleSk7XG4gICAgICAgICAgICBpZiAoIXByb21pc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBrZXkgJHtwYWNrZXQucGFyYW1zLmtleX0gKCR7cGFja2V0LnBhcmFtcy5pZC5rZXkoKX0pYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXNwb25zZVByb21pc2VzLmRlbGV0ZShwYWNrZXQucGFyYW1zLmtleSk7XG4gICAgICAgICAgICBpZiAocGFja2V0LnBhcmFtcy5lcnJvcikge1xuICAgICAgICAgICAgICAgIHByb21pc2UucmVqZWN0KG5ldyBFcnJvcihwYWNrZXQucGFyYW1zLmVycm9yKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKHBhY2tldC5idWZmZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkVGFzaygoKSA9PiB0aGlzLm9uVGFzaygpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGhhbmRsZUludm9rZWQocGFja2V0OiBFbmRwb2ludEludm9rZWRQYWNrZXQpIHtcbiAgICAgICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmJvdW5kRW5kcG9pbnRzLmdldChwYWNrZXQucGFyYW1zLmlkKTtcbiAgICAgICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBpbnZvY2F0aW9uIGZvciB1bmtub3duIGVuZHBvaW50ICR7cGFja2V0LnBhcmFtcy5pZC5rZXkoKX0gKCR7cGFja2V0LnBhcmFtcy5rZXl9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbmRwb2ludC5oYW5kbGVyKHBhY2tldCk7XG4gICAgICAgICAgICB0aGlzLm9tdS5zZW5kKEVORFBPSU5UX1JFU1BPTlNFX1BBQ0tFVCwgbmV3IEVuZHBvaW50UmVzcG9uc2VQYWNrZXQoXG4gICAgICAgICAgICAgICAgbmV3IFJlc3BvbnNlUGFyYW1zKHBhY2tldC5wYXJhbXMuaWQsIHBhY2tldC5wYXJhbXMua2V5LCBudWxsKSxcbiAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoRU5EUE9JTlRfUkVTUE9OU0VfUEFDS0VULCBuZXcgRW5kcG9pbnRSZXNwb25zZVBhY2tldChcbiAgICAgICAgICAgICAgICBuZXcgUmVzcG9uc2VQYXJhbXMocGFja2V0LnBhcmFtcy5pZCwgcGFja2V0LnBhcmFtcy5rZXksIEpTT04uc3RyaW5naWZ5KGVycm9yKSksXG4gICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRhc2soKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVuZHBvaW50cyA9IG5ldyBJZGVudGlmaWVyTWFwPElkZW50aWZpZXIgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZW5kcG9pbnRdIG9mIHRoaXMuYm91bmRFbmRwb2ludHMpIHtcbiAgICAgICAgICAgIGVuZHBvaW50cy5zZXQoa2V5LCBlbmRwb2ludC50eXBlLnBlcm1pc3Npb25JZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3IEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQoZW5kcG9pbnRzKTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChFTkRQT0lOVF9SRUdJU1RFUl9QQUNLRVQsIHBhY2tldCk7XG4gICAgfVxuXG4gICAgcHVibGljIGJpbmQ8UmVxLCBSZXM+KFxuICAgICAgICB0eXBlOiBFbmRwb2ludFR5cGU8UmVxLCBSZXM+LFxuICAgICAgICBoYW5kbGVyOiAoZGF0YTogUmVxLCBwYXJhbXM6IEludm9rZWRQYXJhbXMpID0+IFByb21pc2U8UmVzPixcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZ2lzdGVyIGVuZHBvaW50cyBhZnRlciB0aGUgY2xpZW50IGhhcyBzdGFydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYm91bmRFbmRwb2ludHMuaGFzKHR5cGUuaWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVuZHBvaW50IHdpdGggaWQgJHt0eXBlLmlkLmtleSgpfSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvdW5kRW5kcG9pbnRzLnNldCh0eXBlLmlkLCB7IHR5cGUsIGhhbmRsZXI6IGFzeW5jICh7IGJ1ZmZlciwgcGFyYW1zIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IHR5cGUucmVxdWVzdFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIocmVxLCBwYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGUucmVzcG9uc2VTZXJpYWxpemVyLnNlcmlhbGl6ZShyZXN1bHQpO1xuICAgICAgICB9IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjYWxsPFJlcSwgUmVzPihlbmRwb2ludDogRW5kcG9pbnRUeXBlPFJlcSwgUmVzPiwgZGF0YTogUmVxKTogUHJvbWlzZTxSZXM+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jYWxsSWQrKztcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFVpbnQ4QXJyYXk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VQcm9taXNlcy5zZXQoa2V5LCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub211LnNlbmQoRU5EUE9JTlRfSU5WT0tFX1BBQ0tFVCwgbmV3IEVuZHBvaW50SW52b2tlUGFja2V0KFxuICAgICAgICAgICAgbmV3IEludm9rZVBhcmFtcyhlbmRwb2ludC5pZCwga2V5KSxcbiAgICAgICAgICAgIGVuZHBvaW50LnJlcXVlc3RTZXJpYWxpemVyLnNlcmlhbGl6ZShkYXRhKSxcbiAgICAgICAgKSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIGVuZHBvaW50LnJlc3BvbnNlU2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXNwb25zZSk7XG4gICAgfVxufVxuXG5jb25zdCBFTkRQT0lOVF9SRUdJU1RFUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RW5kcG9pbnRSZWdpc3RlclBhY2tldD4oRU5EUE9JTlRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVnaXN0ZXInLFxuICAgIHNlcmlhbGl6ZXI6IEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQsXG59KTtcbmNvbnN0IEVORFBPSU5UX0lOVk9LRV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RW5kcG9pbnRJbnZva2VQYWNrZXQ+KEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2ludm9rZScsXG4gICAgc2VyaWFsaXplcjogRW5kcG9pbnRJbnZva2VQYWNrZXQsXG59KTtcbmNvbnN0IEVORFBPSU5UX0lOVk9LRURfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPEVuZHBvaW50SW52b2tlZFBhY2tldD4oRU5EUE9JTlRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaW52b2tlZCcsXG4gICAgc2VyaWFsaXplcjogRW5kcG9pbnRJbnZva2VkUGFja2V0LFxufSk7XG5jb25zdCBFTkRQT0lOVF9SRVNQT05TRV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RW5kcG9pbnRSZXNwb25zZVBhY2tldD4oRU5EUE9JTlRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVzcG9uc2UnLFxuICAgIHNlcmlhbGl6ZXI6IEVuZHBvaW50UmVzcG9uc2VQYWNrZXQsXG59KTtcbiIsCiAgICAiaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciwgSnNvblR5cGUgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0SGFuZGxlID0ge1xuICAgIGlkOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBIdHRwUmVxdWVzdCA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgaGVhZGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIG1ldGhvZDogc3RyaW5nO1xuICAgIHJlZGlyZWN0OiBSZXF1ZXN0UmVkaXJlY3Q7XG4gICAgdXJsOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgRGF0YUNodW5rPFQgZXh0ZW5kcyBKc29uVHlwZT4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YTogVCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvZHk6IFVpbnQ4QXJyYXksXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplPFQgZXh0ZW5kcyBKc29uVHlwZT4oZGF0YTogRGF0YUNodW5rPFQ+KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZUpTT04oZGF0YS5tZXRhKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShkYXRhLmJvZHkpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemU8VCBleHRlbmRzIEpzb25UeXBlPihkYXRhOiBVaW50OEFycmF5KTogRGF0YUNodW5rPFQ+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgbWV0YSA9IHJlYWRlci5yZWFkSlNPTjxUPigpO1xuICAgICAgICBjb25zdCBib2R5ID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YUNodW5rKG1ldGEsIGJvZHkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9tdVJlc3BvbnNlIGltcGxlbWVudHMgUmVzcG9uc2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG9rOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVkaXJlY3RlZDogYm9vbGVhbixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzVGV4dDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogUmVzcG9uc2VUeXBlLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdXJsOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5OiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PEFycmF5QnVmZmVyPj4gfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYm9keVVzZWQ6IGJvb2xlYW4sXG4gICAgKSB7fVxuXG4gICAgY2xvbmUoKTogT211UmVzcG9uc2Uge1xuICAgICAgICByZXR1cm4gbmV3IE9tdVJlc3BvbnNlKFxuICAgICAgICAgICAgdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgdGhpcy5vayxcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RlZCxcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXNUZXh0LFxuICAgICAgICAgICAgdGhpcy50eXBlLFxuICAgICAgICAgICAgdGhpcy51cmwsXG4gICAgICAgICAgICB0aGlzLmJvZHksXG4gICAgICAgICAgICB0aGlzLmJvZHlVc2VkLFxuICAgICAgICApO1xuICAgIH1cbiAgICBhc3luYyBhcnJheUJ1ZmZlcigpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS5hcnJheUJ1ZmZlcigpO1xuICAgIH1cbiAgICBibG9iKCk6IFByb21pc2U8QmxvYj4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuYmxvYigpO1xuICAgIH1cbiAgICBieXRlcygpOiBQcm9taXNlPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+PiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS5hcnJheUJ1ZmZlcigpLnRoZW4oKGJ1ZikgPT4gbmV3IFVpbnQ4QXJyYXkoYnVmKSk7XG4gICAgfVxuICAgIGZvcm1EYXRhKCk6IFByb21pc2U8Rm9ybURhdGE+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmZvcm1EYXRhKCk7XG4gICAgfVxuICAgIGpzb24oKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmpzb24oKTtcbiAgICB9XG4gICAgdGV4dCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkudGV4dCgpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIgfSBmcm9tICcuLi8uLi9jb25zdCc7XG5pbXBvcnQgeyBEYXRhQ2h1bmssIFJlcXVlc3RIYW5kbGUgfSBmcm9tICcuL2h0dHAnO1xuXG5leHBvcnQgdHlwZSBXU0RhdGEgPSBzdHJpbmcgfCBBcnJheUJ1ZmZlckxpa2UgfCBCbG9iIHwgQXJyYXlCdWZmZXJWaWV3O1xuXG5leHBvcnQgY29uc3QgV1NNc2dUeXBlID0ge1xuICAgIENPTlRJTlVBVElPTjogMHgwLFxuICAgIFRFWFQ6IDB4MSxcbiAgICBCSU5BUlk6IDB4MixcbiAgICBQSU5HOiAweDksXG4gICAgUE9ORzogMHhBLFxuICAgIENMT1NFOiAweDgsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgV1NDbG9zZUNvZGUgPSB7XG4gICAgT0s6IDEwMDAsXG4gICAgR09JTkdfQVdBWTogMTAwMSxcbiAgICBQUk9UT0NPTF9FUlJPUjogMTAwMixcbiAgICBVTlNVUFBPUlRFRF9EQVRBOiAxMDAzLFxuICAgIEFCTk9STUFMX0NMT1NVUkU6IDEwMDYsXG4gICAgSU5WQUxJRF9URVhUOiAxMDA3LFxuICAgIFBPTElDWV9WSU9MQVRJT046IDEwMDgsXG4gICAgTUVTU0FHRV9UT09fQklHOiAxMDA5LFxuICAgIE1BTkRBVE9SWV9FWFRFTlNJT046IDEwMTAsXG4gICAgSU5URVJOQUxfRVJST1I6IDEwMTEsXG4gICAgU0VSVklDRV9SRVNUQVJUOiAxMDEyLFxuICAgIFRSWV9BR0FJTl9MQVRFUjogMTAxMyxcbiAgICBCQURfR0FURVdBWTogMTAxNCxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldE9wZW4gPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIHVybDogc3RyaW5nO1xuICAgIHByb3RvY29sPzogc3RyaW5nIHwgbnVsbDtcbn07XG5leHBvcnQgdHlwZSBXZWJTb2NrZXRDbG9zZSA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgY29kZT86IG51bWJlcjtcbiAgICByZWFzb24/OiBzdHJpbmcgfCBudWxsO1xufTtcbmV4cG9ydCB0eXBlIFdlYlNvY2tldEVycm9yID0gUmVxdWVzdEhhbmRsZSAmIHtcbiAgICB0eXBlOiAnQ29ubmVjdGlvblJlZnVzZWQnO1xuICAgIHJlYXNvbj86IHN0cmluZyB8IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBFdmVudExpc3RlbmVyTWFwPFQ+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiAoKGV2ZW50OiBUW0tdKSA9PiB1bmtub3duKVtdXG59O1xuXG5leHBvcnQgdHlwZSBXU01zZyA9IHtcbiAgICB0eXBlOiAnb3Blbic7XG4gICAgZGF0YTogV2ViU29ja2V0T3Blbjtcbn0gfCB7XG4gICAgdHlwZTogJ2Vycm9yJztcbiAgICBkYXRhOiBXZWJTb2NrZXRFcnJvcjtcbn0gfCB7XG4gICAgdHlwZTogJ3RleHQnO1xuICAgIGRhdGE6IHN0cmluZztcbn0gfCB7XG4gICAgdHlwZTogJ2JpbmFyeSc7XG4gICAgZGF0YTogVWludDhBcnJheTtcbn0gfCB7XG4gICAgdHlwZTogJ2Nsb3NlJztcbiAgICBkYXRhOiBXZWJTb2NrZXRDbG9zZTtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldEhhbmRsZSA9IHtcbiAgICB3czogT211V1M7XG4gICAgb3BlbjogKHJlc3BvbnNlOiBXZWJTb2NrZXRPcGVuKSA9PiB2b2lkO1xuICAgIGRpc3BhdGNoOiAoZGF0YTogRGF0YUNodW5rPFdTRGF0YU1ldGE+KSA9PiB2b2lkO1xuICAgIGNsb3NlOiAocmVzcG9uc2U6IFdlYlNvY2tldENsb3NlKSA9PiB2b2lkO1xuICAgIGVycm9yOiAocmVzcG9uc2U6IFdlYlNvY2tldEVycm9yKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgV1NEYXRhTWV0YSA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6XG4gICAgICAgIHwgdHlwZW9mIFdTTXNnVHlwZS5URVhUXG4gICAgICAgIHwgdHlwZW9mIFdTTXNnVHlwZS5CSU5BUllcbiAgICAgICAgfCB0eXBlb2YgV1NNc2dUeXBlLlBJTkdcbiAgICAgICAgfCB0eXBlb2YgV1NNc2dUeXBlLlBPTkc7XG59O1xuXG5leHBvcnQgdHlwZSBXU0hhbmRsZVN0YXRlID0ge1xuICAgIHR5cGU6ICdjcmVhdGVkJyB8ICdyZWNlaXZpbmcnO1xuICAgIGhhbmRsZTogV2ViU29ja2V0SGFuZGxlO1xufTtcblxudHlwZSBXU09wdGlvbnMgPSB7XG4gICAgYWRkUXVldWU6IChkYXRhOiBXU0RhdGEpID0+IHZvaWQ7XG4gICAgZGlzcG9zZShvcHRpb25zOiB7XG4gICAgICAgIGNvZGU/OiBudW1iZXI7XG4gICAgICAgIHJlYXNvbj86IHN0cmluZztcbiAgICB9KTogdm9pZDtcbn07XG5cbmV4cG9ydCBjbGFzcyBPbXVXUyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBhZGRRdWV1ZTogKGRhdGE6IFdTRGF0YSkgPT4gdm9pZCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2U6IChvcHRpb25zOiB7IGNvZGU/OiBudW1iZXI7IHJlYXNvbj86IHN0cmluZyB9KSA9PiB2b2lkLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVjZWl2ZVF1ZXVlOiBXU01zZ1tdID0gW10sXG4gICAgICAgIHByaXZhdGUgcmVjZWl2ZVJlc29sdmU6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgcHJpdmF0ZSBzdGF0dXM6ICdjb25uZWN0aW5nJyB8ICdvcGVuJyB8ICdjbG9zZWQnID0gJ2Nvbm5lY3RpbmcnLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgdG9XZWJTb2NrZXQoKTogT211V2ViU29ja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbXVXZWJTb2NrZXQodGhpcyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9uczogV1NPcHRpb25zKTogV2ViU29ja2V0SGFuZGxlIHtcbiAgICAgICAgY29uc3Qgd3MgPSBuZXcgT211V1Mob3B0aW9ucy5hZGRRdWV1ZSwgb3B0aW9ucy5kaXNwb3NlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdzLFxuICAgICAgICAgICAgb3BlbjogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnb3BlbicsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaXNwYXRjaDogKGRhdGE6IERhdGFDaHVuazxXU0RhdGFNZXRhPik6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLm1ldGEudHlwZSA9PT0gV1NNc2dUeXBlLkJJTkFSWSkge1xuICAgICAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmluYXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEuYm9keSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd3MucmVjZWl2ZVF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGV4dERlY29kZXIuZGVjb2RlKGRhdGEuYm9keSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xvc2U6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Nsb3NlJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVJlc29sdmU/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHNlbmQoZGF0YTogV1NEYXRhKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWRkUXVldWUoZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsb3NlKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3Bvc2UoeyBjb2RlLCByZWFzb24gfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlY2VpdmUoKTogUHJvbWlzZTxXU01zZz4ge1xuICAgICAgICBpZiAodGhpcy5yZWNlaXZlUmVzb2x2ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbHJlYWR5IHJlY2VpdmluZyBmcm9tIGFub3RoZXIgYXN5bmMgY2FsbCcpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0aGlzLnN0YXR1cyAhPT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlY2VpdmVRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHRoaXMucmVjZWl2ZVJlc29sdmUgPSByZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdjbG9zZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ29wZW4nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnb3Blbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVSZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZpbmcgb24gYWxyZWFkeSBjbG9zZWQgc29ja2V0Jyk7XG4gICAgfVxuXG4gICAgcHJvdG9jb2w6IHN0cmluZyA9ICcnO1xuICAgIHVybDogc3RyaW5nID0gJyc7XG59XG5cbmV4cG9ydCBjbGFzcyBPbXVXZWJTb2NrZXQgaW1wbGVtZW50cyBXZWJTb2NrZXQge1xuICAgIHB1YmxpYyBDT05ORUNUSU5HID0gMCBhcyBjb25zdDtcbiAgICBwdWJsaWMgT1BFTiA9IDEgYXMgY29uc3Q7XG4gICAgcHVibGljIENMT1NJTkcgPSAyIGFzIGNvbnN0O1xuICAgIHB1YmxpYyBDTE9TRUQgPSAzIGFzIGNvbnN0O1xuXG4gICAgYmluYXJ5VHlwZTogQmluYXJ5VHlwZSA9ICdibG9iJztcbiAgICBidWZmZXJlZEFtb3VudDogbnVtYmVyID0gMDtcbiAgICBleHRlbnNpb25zOiBzdHJpbmcgPSAnJztcbiAgICBvbmNsb3NlOiAoKHRoaXM6IFdlYlNvY2tldCwgZXY6IENsb3NlRXZlbnQpID0+IHVua25vd24pIHwgbnVsbCA9IG51bGw7XG4gICAgb25lcnJvcjogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBFdmVudCkgPT4gdW5rbm93bikgfCBudWxsID0gbnVsbDtcbiAgICBvbm1lc3NhZ2U6ICgodGhpczogV2ViU29ja2V0LCBldjogTWVzc2FnZUV2ZW50KSA9PiB1bmtub3duKSB8IG51bGwgPSBudWxsO1xuICAgIG9ub3BlbjogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBFdmVudCkgPT4gdW5rbm93bikgfCBudWxsID0gbnVsbDtcbiAgICBwcm90b2NvbDogc3RyaW5nID0gJyc7XG4gICAgcmVhZHlTdGF0ZTogMCB8IDIgfCAxIHwgMyA9IDA7XG4gICAgdXJsOiBzdHJpbmcgPSAnJztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd3M6IE9tdVdTLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50TGlzdGVuZXJzOiBFdmVudExpc3RlbmVyTWFwPFdlYlNvY2tldEV2ZW50TWFwPiA9IHtcbiAgICAgICAgICAgIGNsb3NlOiBbXSxcbiAgICAgICAgICAgIGVycm9yOiBbXSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IFtdLFxuICAgICAgICAgICAgb3BlbjogW10sXG4gICAgICAgIH0sXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVjZWl2ZUxvb3AoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlY2VpdmVMb29wKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ0xPU0VEKSB7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIHR5cGUgfSA9IGF3YWl0IHRoaXMud3MucmVjZWl2ZSgpO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IENsb3NlRXZlbnQoJ2Nsb3NlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogZGF0YS5jb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBkYXRhLnJlYXNvbiA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnb3Blbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBkYXRhLnByb3RvY29sID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdvcGVuJywge30pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEVycm9yRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEucmVhc29uID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgICAgICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IE1lc3NhZ2VFdmVudCgnbWVzc2FnZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50LnR5cGVdO1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnb3BlbicpIHtcbiAgICAgICAgICAgIHRoaXMub25vcGVuPy4oZXZlbnQgYXMgTWVzc2FnZUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGhpcy5vbmVycm9yPy4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgIHRoaXMub25tZXNzYWdlPy4oZXZlbnQgYXMgTWVzc2FnZUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgICAgICAgdGhpcy5vbmNsb3NlPy4oZXZlbnQgYXMgQ2xvc2VFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc2VuZChkYXRhOiBzdHJpbmcgfCBBcnJheUJ1ZmZlckxpa2UgfCBCbG9iIHwgQXJyYXlCdWZmZXJWaWV3KTogdm9pZCB7XG4gICAgICAgIHRoaXMud3Muc2VuZChkYXRhKTtcbiAgICB9XG5cbiAgICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cy5jbG9zZShjb2RlLCByZWFzb24pO1xuICAgIH1cblxuICAgIGFkZEV2ZW50TGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIFdlYlNvY2tldEV2ZW50TWFwPih0eXBlOiBLLCBsaXN0ZW5lcjogKHRoaXM6IFdlYlNvY2tldCwgZXY6IFdlYlNvY2tldEV2ZW50TWFwW0tdKSA9PiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0RXZlbnRNYXA+KHR5cGU6IEssIGxpc3RlbmVyOiAodGhpczogV2ViU29ja2V0LCBldjogV2ViU29ja2V0RXZlbnRNYXBbS10pID0+IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwKICAgICJcbmltcG9ydCB7IHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vLi4vY29uc3QnO1xuaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0JztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgeyBFeHRlbnNpb24sIEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24nO1xuaW1wb3J0IHsgRGF0YUNodW5rLCBIdHRwUmVxdWVzdCwgT211UmVzcG9uc2UsIFJlcXVlc3RIYW5kbGUgfSBmcm9tICcuL2h0dHAnO1xuaW1wb3J0IHsgT211V1MsIFdlYlNvY2tldENsb3NlLCBXZWJTb2NrZXRFcnJvciwgV2ViU29ja2V0T3BlbiwgV1NEYXRhLCBXU0RhdGFNZXRhLCBXU0hhbmRsZVN0YXRlLCBXU01zZ1R5cGUgfSBmcm9tICcuL3dlYnNvY2tldCc7XG5cbmV4cG9ydCBjb25zdCBIVFRQX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPEh0dHBFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ2h0dHAnLFxuICAgIChvbXU6IE9tdSkgPT4gbmV3IEh0dHBFeHRlbnNpb24ob211KSxcbik7XG5cbmV4cG9ydCBjb25zdCBIVFRQX1JFUVVFU1RfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IEhUVFBfRVhURU5TSU9OX1RZUEUuam9pbigncmVxdWVzdCcpO1xuXG5jb25zdCBSRVFVRVNUX0NSRUFURSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVxdWVzdD4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1ZXN0X2NyZWF0ZScsXG59KTtcblxuY29uc3QgUkVRVUVTVF9TRU5EID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPERhdGFDaHVuazxSZXF1ZXN0SGFuZGxlPj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1ZXN0X3NlbmQnLFxuICAgIHNlcmlhbGl6ZXI6IERhdGFDaHVuayxcbn0pO1xuXG50eXBlIEh0dHBSZXF1ZXN0Q2xvc2UgPSBSZXF1ZXN0SGFuZGxlO1xuXG5jb25zdCBSRVFVRVNUX0NMT1NFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXF1ZXN0Q2xvc2U+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVxdWVzdF9jbG9zZScsXG59KTtcblxudHlwZSBIdHRwUmVzcG9uc2UgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIGhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICBzdGF0dXNUZXh0OiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgaGlzdG9yeTogSHR0cFJlc3BvbnNlW107XG4gICAgcmVkaXJlY3RlZDogYm9vbGVhbjtcbn07XG5cbmNvbnN0IFJFU1BPTlNFX0NSRUFURSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVzcG9uc2U+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVzcG9uc2VfY3JlYXRlJyxcbn0pO1xuXG5jb25zdCBSRVNQT05TRV9DSFVOSyA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxEYXRhQ2h1bms8UmVxdWVzdEhhbmRsZT4+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVzcG9uc2VfY2h1bmsnLFxuICAgIHNlcmlhbGl6ZXI6IERhdGFDaHVuayxcbn0pO1xuXG5jb25zdCBSRVNQT05TRV9DTE9TRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxSZXF1ZXN0SGFuZGxlPihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Jlc3BvbnNlX2Nsb3NlJyxcbn0pO1xuXG50eXBlIEhhbmRsZVN0YXRlUmVjZWl2aW5nID0ge1xuICAgIHR5cGU6ICdyZWNlaXZpbmcnO1xuICAgIHJlY2VpdmUoZGF0YTogVWludDhBcnJheSk6IHZvaWQ7XG4gICAgY2xvc2UoKTogdm9pZDtcbn07XG5cbnR5cGUgSGFuZGxlU3RhdGVDcmVhdGVkID0ge1xuICAgIHR5cGU6ICdjcmVhdGVkJztcbiAgICBzZXRSZXNwb25zZShyZXNwb25zZTogSHR0cFJlc3BvbnNlKTogdm9pZDtcbn07XG5cbnR5cGUgSGFuZGxlU3RhdGUgPSBIYW5kbGVTdGF0ZUNyZWF0ZWQgfCBIYW5kbGVTdGF0ZVJlY2VpdmluZztcblxuY29uc3QgV0VCU09DS0VUX0NSRUFURSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVxdWVzdD4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19jcmVhdGUnLFxufSk7XG5cbmNvbnN0IFdFQlNPQ0tFVF9PUEVOID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFdlYlNvY2tldE9wZW4+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3Nfb3BlbicsXG59KTtcblxuY29uc3QgV0VCU09DS0VUX0RBVEEgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RGF0YUNodW5rPFdTRGF0YU1ldGE+PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dzX2RhdGEnLFxuICAgIHNlcmlhbGl6ZXI6IERhdGFDaHVuayxcbn0pO1xuXG5jb25zdCBXRUJTT0NLRVRfQ0xPU0UgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248V2ViU29ja2V0Q2xvc2U+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3NfY2xvc2UnLFxufSk7XG5cbmNvbnN0IFdFQlNPQ0tFVF9FUlJPUiA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxXZWJTb2NrZXRFcnJvcj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19lcnJvcicsXG59KTtcblxuZnVuY3Rpb24gY3JlYXRlRnV0dXJlPFQ+KCk6IHtcbiAgICBwcm9taXNlOiBQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgICByZWplY3Q6IChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkO1xufSB7XG4gICAgbGV0IHJlc29sdmU6ICgodmFsdWU6IFQpID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCByZWplY3Q6ICgocmVhc29uPzogdW5rbm93bikgPT4gdm9pZCkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXMsIHJlaikgPT4ge1xuICAgICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgICByZWplY3QgPSByZWo7XG4gICAgfSk7XG4gICAgaWYgKCFyZXNvbHZlIHx8ICFyZWplY3QpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBmdXR1cmUnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9taXNlLFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZWplY3QsXG4gICAgfTtcbn1cblxudHlwZSBXU1NlbmRUYXNrID0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZGF0YTogV1NEYXRhO1xufTtcblxuZXhwb3J0IGNsYXNzIEh0dHBFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPEV4dGVuc2lvbj4gPSBIVFRQX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVxdWVzdENvdW50OiBudW1iZXIgPSAwO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwSGFuZGxlczogUmVjb3JkPHN0cmluZywgSGFuZGxlU3RhdGUgfCB1bmRlZmluZWQ+ID0ge307XG4gICAgcHJpdmF0ZSByZWFkb25seSB3c0hhbmRsZXM6IFJlY29yZDxzdHJpbmcsIFdTSGFuZGxlU3RhdGU+ID0ge307XG4gICAgcHJpdmF0ZSByZWFkb25seSB3c1NlbmRRdWV1ZTogV1NTZW5kVGFza1tdID0gW107XG4gICAgcHJpdmF0ZSB3c1NlbmRXYWl0UmVzb2x2ZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgKSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgUkVRVUVTVF9DUkVBVEUsXG4gICAgICAgICAgICBSRVFVRVNUX1NFTkQsXG4gICAgICAgICAgICBSRVFVRVNUX0NMT1NFLFxuICAgICAgICAgICAgUkVTUE9OU0VfQ1JFQVRFLFxuICAgICAgICAgICAgUkVTUE9OU0VfQ0hVTkssXG4gICAgICAgICAgICBSRVNQT05TRV9DTE9TRSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9DTE9TRSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9DUkVBVEUsXG4gICAgICAgICAgICBXRUJTT0NLRVRfREFUQSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9PUEVOLFxuICAgICAgICAgICAgV0VCU09DS0VUX0VSUk9SLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFJFU1BPTlNFX0NSRUFURSwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5odHRwSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgYWxyZWFkeSBoYW5kbGVkIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5zZXRSZXNwb25zZShwYWNrZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRVNQT05TRV9DSFVOSywgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5odHRwSGFuZGxlc1twYWNrZXQubWV0YS5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gcmVxdWVzdCcsIHBhY2tldC5tZXRhLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdyZWNlaXZpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCBjaHVuayBmb3Igbm9uLXJlY2VpdmluZyByZXF1ZXN0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5yZWNlaXZlKHBhY2tldC5ib2R5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoUkVTUE9OU0VfQ0xPU0UsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biByZXF1ZXN0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdyZWNlaXZpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCBjaHVuayBmb3Igbm9uLXJlY2VpdmluZyByZXF1ZXN0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9PUEVOLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHNvY2tldCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhbmRsZS50eXBlICE9PSAnY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciBhbHJlYWR5IGhhbmRsZWQgc29ja2V0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuaGFuZGxlLm9wZW4ocGFja2V0KTtcbiAgICAgICAgICAgIGhhbmRsZS50eXBlID0gJ3JlY2VpdmluZyc7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9EQVRBLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQubWV0YS5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gc29ja2V0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ3JlY2VpdmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIGNodW5rIGZvciBub24tcmVjZWl2aW5nIHNvY2tldCcsIHBhY2tldC5tZXRhLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuaGFuZGxlLmRpc3BhdGNoKHBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9DTE9TRSwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy53c0hhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBzb2NrZXQnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUuY2xvc2UocGFja2V0KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9FUlJPUiwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy53c0hhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBzb2NrZXQnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUuZXJyb3IocGFja2V0KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUuZXZlbnQucmVhZHkubGlzdGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3NTZW5kTG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHdzU2VuZExvb3AoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBzZW5kID0gdGhpcy53c1NlbmRRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHNlbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheSA9IGF3YWl0IHRvVWludDhBcnJheShzZW5kLmRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2Ygc2VuZC5kYXRhID09PSAnc3RyaW5nJyA/IFdTTXNnVHlwZS5URVhUIDogV1NNc2dUeXBlLkJJTkFSWTtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFdFQlNPQ0tFVF9EQVRBLCBuZXcgRGF0YUNodW5rKHsgaWQ6IHNlbmQuaWQsIHR5cGUgfSwgYXJyYXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53c1NlbmRXYWl0UmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlSGVhZGVycyhyZXF1ZXN0OiBSZXF1ZXN0LCBpbml0PzogUmVxdWVzdEluaXQpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBjb25zdCBrZXlzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IHNldCA9IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG93ZXJLZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsS2V5ID0ga2V5c1tsb3dlcktleV07XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxLZXkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgaGVhZGVyc1tvcmlnaW5hbEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGtleXNbbG93ZXJLZXldID0ga2V5O1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGluaXQ/LmhlYWRlcnMpIHtcbiAgICAgICAgICAgIGlmIChpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaW5pdC5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGluaXQuaGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBpbml0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gaW5pdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaW5pdC5oZWFkZXJzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIHNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUlkKCk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5vbXUuYXBwLmlkLmpvaW4oYCR7cGVyZm9ybWFuY2UudGltZU9yaWdpbn0tJHt0aGlzLnJlcXVlc3RDb3VudCsrfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0KGlucHV0OiBzdHJpbmcgfCBVUkwgfCBnbG9iYWxUaGlzLlJlcXVlc3QsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8eyByZXNwb25zZTogSHR0cFJlc3BvbnNlOyBzdHJlYW06IFJlYWRhYmxlU3RyZWFtIH0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdlbmVyYXRlSWQoKS5rZXkoKTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVRVNUX0NSRUFURSwge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMuZ2VuZXJhdGVIZWFkZXJzKHJlcXVlc3QsIGluaXQpLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmJvZHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IHJlcXVlc3QuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVRVUVTVF9TRU5ELCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGE6IHsgaWQgfSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub211LnNlbmQoUkVRVUVTVF9DTE9TRSwgeyBpZCB9KTtcbiAgICAgICAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VGdXR1cmUgPSBjcmVhdGVGdXR1cmU8SHR0cFJlc3BvbnNlPigpO1xuICAgICAgICBsZXQgY2h1bmtFdmVudCA9IGNyZWF0ZUZ1dHVyZTxib29sZWFuPigpO1xuICAgICAgICBjb25zdCBzZXRSZXNwb25zZSA9IChyZXNwb25zZTogSHR0cFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMuaHR0cEhhbmRsZXNbaWRdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNlaXZpbmcnLFxuICAgICAgICAgICAgICAgIHJlY2VpdmUoZGF0YTogVWludDhBcnJheTxBcnJheUJ1ZmZlckxpa2U+KSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua0V2ZW50LnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rRXZlbnQgPSBjcmVhdGVGdXR1cmU8Ym9vbGVhbj4oKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNsb3NlKCkge1xuICAgICAgICAgICAgICAgICAgICBjaHVua0V2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmh0dHBIYW5kbGVzW2lkXSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGVkJyxcbiAgICAgICAgICAgIHNldFJlc3BvbnNlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlRnV0dXJlLnByb21pc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIHN0cmVhbTogbmV3IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+KHtcbiAgICAgICAgICAgICAgICBhc3luYyBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChhd2FpdCBjaHVua0V2ZW50LnByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gY2h1bmtzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNodW5rKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2goaW5wdXQ6IHN0cmluZyB8IFVSTCB8IGdsb2JhbFRoaXMuUmVxdWVzdCwgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxPbXVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCB7IHJlc3BvbnNlLCBzdHJlYW0gfSA9IGF3YWl0IHRoaXMucmVxdWVzdChpbnB1dCwgaW5pdCk7XG4gICAgICAgIHJldHVybiBuZXcgT211UmVzcG9uc2UoXG4gICAgICAgICAgICBuZXcgSGVhZGVycyhyZXNwb25zZS5oZWFkZXIpLFxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXMgPCAzMDAsXG4gICAgICAgICAgICByZXNwb25zZS5yZWRpcmVjdGVkLFxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICdiYXNpYycsXG4gICAgICAgICAgICByZXNwb25zZS51cmwsXG4gICAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd3MoaW5wdXQ6IHN0cmluZyB8IFVSTCB8IGdsb2JhbFRoaXMuUmVxdWVzdCwgb3B0aW9ucz86IHtcbiAgICAgICAgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgICBhdXRvY2xvc2U/OiBib29sZWFuO1xuICAgICAgICBhdXRvcGluZz86IGJvb2xlYW47XG4gICAgICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIH0pOiBQcm9taXNlPE9tdVdTPiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZW5lcmF0ZUlkKCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IE9tdVdTLmNyZWF0ZSh7XG4gICAgICAgICAgICBhZGRRdWV1ZTogKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndzU2VuZFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBpZDogaWQua2V5KCksXG4gICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy53c1NlbmRXYWl0UmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3Bvc2U6IChvcHRpb25zOiB7IGNvZGU/OiBudW1iZXI7IHJlYXNvbj86IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChXRUJTT0NLRVRfQ0xPU0UsIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLmtleSgpLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiBvcHRpb25zLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogb3B0aW9ucy5yZWFzb24sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMud3NIYW5kbGVzW2lkLmtleSgpXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLndzSGFuZGxlc1tpZC5rZXkoKV0gPSB7XG4gICAgICAgICAgICB0eXBlOiAnY3JlYXRlZCcsXG4gICAgICAgICAgICBoYW5kbGUsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub211LnNlbmQoV0VCU09DS0VUX0NSRUFURSwge1xuICAgICAgICAgICAgaWQ6IGlkLmtleSgpLFxuICAgICAgICAgICAgaGVhZGVyOiB0aGlzLmdlbmVyYXRlSGVhZGVycyhyZXF1ZXN0LCBvcHRpb25zKSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaGFuZGxlLndzO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdG9VaW50OEFycmF5KGRhdGE6IHN0cmluZyB8IEFycmF5QnVmZmVyTGlrZSB8IEJsb2IgfCBBcnJheUJ1ZmZlclZpZXcpOiBQcm9taXNlPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXJMaWtlPj4ge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRleHRFbmNvZGVyLmVuY29kZShkYXRhKTtcbiAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZGF0YS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhIGFzIEFycmF5QnVmZmVyTGlrZSk7XG4gICAgfVxufVxuIiwKICAgICJcbnR5cGUgVGFzayA9ICgpID0+IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBjbGFzcyBMb2NrIHtcbiAgICBwcml2YXRlIHRhc2tzOiAoVGFzaylbXSA9IFtdO1xuICAgIHByaXZhdGUgd2FpdGVyOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHdhaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLndhaXRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FpdGVyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud2FpdGVyID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJ1blRhc2tzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLnRhc2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHRoaXMudGFza3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRhc2soKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLndhaXRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJ1blRhc2tzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVzZTxUPihjYWxsYmFjazogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFzayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGF3YWl0IHByb21pc2UpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy50YXNrcy5wdXNoKHRhc2spO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0KCk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBSZWdpc3RyeVBlcm1pc3Npb25zLCBSZWdpc3RyeVBlcm1pc3Npb25zSlNPTiB9IGZyb20gJy4vcmVnaXN0cnknO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZTogVWludDhBcnJheSB8IG51bGwsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogUmVnaXN0cnlQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZUJvb2xlYW4ocGFja2V0LnZhbHVlICE9PSBudWxsKTtcbiAgICAgICAgaWYgKHBhY2tldC52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShwYWNrZXQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogUmVnaXN0cnlQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZWFkZXIucmVhZEJvb2xlYW4oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBleGlzdGluZyA/IHJlYWRlci5yZWFkVWludDhBcnJheSgpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeVBhY2tldChpZCwgdmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclBhY2tldEpTT04ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVybWlzc2lvbnM6IFJlZ2lzdHJ5UGVybWlzc2lvbnNKU09OO1xufVxuXG5leHBvcnQgY2xhc3MgUmVnaXN0ZXJQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uczogUmVnaXN0cnlQZXJtaXNzaW9ucyxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFJlZ2lzdGVyUGFja2V0KTogUmVnaXN0ZXJQYWNrZXRKU09OIHtcbiAgICAgICAgY29uc3QgeyBwZXJtaXNzaW9uczogcGVybXMgfSA9IHBhY2tldDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBwYWNrZXQuaWQua2V5KCksXG4gICAgICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgICAgICAgIGFsbDogcGVybXMuYWxsID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLmFsbCkua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVhZDogcGVybXMucmVhZCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5yZWFkKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB3cml0ZTogcGVybXMud3JpdGUgPyBJZGVudGlmaWVyLmZyb20ocGVybXMud3JpdGUpLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFJlZ2lzdGVyUGFja2V0SlNPTik6IFJlZ2lzdGVyUGFja2V0IHtcbiAgICAgICAgY29uc3QgeyBwZXJtaXNzaW9uczogcGVybXMgfSA9IGRhdGE7XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oZGF0YS5pZCksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWxsOiBwZXJtcy5hbGwgPyBJZGVudGlmaWVyLmZyb20ocGVybXMuYWxsKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWFkOiBwZXJtcy5yZWFkID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLnJlYWQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHdyaXRlOiBwZXJtcy53cml0ZSA/IElkZW50aWZpZXIuZnJvbShwZXJtcy53cml0ZSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IExvY2sgfSBmcm9tICcuLi8uLi9sb2NrLmpzJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgSnNvblR5cGUsIFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgdHlwZSBFeHRlbnNpb24sIEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQgeyBSZWdpc3RlclBhY2tldCwgUmVnaXN0cnlQYWNrZXQgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuaW1wb3J0IHsgdHlwZSBSZWdpc3RyeSwgUmVnaXN0cnlUeXBlLCBXcml0YWJsZSB9IGZyb20gJy4vcmVnaXN0cnkuanMnO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFJlZ2lzdHJ5RXh0ZW5zaW9uPiA9IFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmllcyA9IG5ldyBJZGVudGlmaWVyTWFwPFJlZ2lzdHJ5PHVua25vd24+PigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFJFR0lTVFJZX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgIFJFR0lTVFJZX1VQREFURV9QQUNLRVQsXG4gICAgICAgICAgICBSRUdJU1RSWV9MSVNURU5fUEFDS0VULFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUmVnaXN0cnk8VD4ocmVnaXN0cnlUeXBlOiBSZWdpc3RyeVR5cGU8VD4pOiBSZWdpc3RyeTxUPiB7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJpZXMuaGFzKHJlZ2lzdHJ5VHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnaXN0cnkgd2l0aCBpZGVudGlmaWVyICcke3JlZ2lzdHJ5VHlwZS5pZH0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyeUltcGwodGhpcy5vbXUsIHJlZ2lzdHJ5VHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUPihyZWdpc3RyeVR5cGU6IFJlZ2lzdHJ5VHlwZTxUPik6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHJlZ2lzdHJ5VHlwZS5pZDtcbiAgICAgICAgbGV0IHJlZ2lzdHJ5ID0gdGhpcy5yZWdpc3RyaWVzLmdldChpZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKHJlZ2lzdHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJ5ID0gdGhpcy5jcmVhdGVSZWdpc3RyeShyZWdpc3RyeVR5cGUpO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RyaWVzLnNldChpZGVudGlmaWVyLCByZWdpc3RyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5IGFzIFJlZ2lzdHJ5PFQ+O1xuICAgIH1cblxuICAgIHB1YmxpYyBqc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgZGVmYXVsdDogVDsgc2VyaWFsaXplcj86IFNlcmlhbGl6ZXI8VCwgRD4gfSk6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpO1xuICAgICAgICBpZiAodGhpcy5yZWdpc3RyaWVzLmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpc3RyeSB3aXRoIG5hbWUgJyR7bmFtZX0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGVUeXBlID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248VD4oaWRlbnRpZmllciwge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogb3B0aW9ucy5kZWZhdWx0LFxuICAgICAgICAgICAgc2VyaWFsaXplcjogb3B0aW9ucy5zZXJpYWxpemVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVnaXN0cnkodGFibGVUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VyaWFsaXplZDxUPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgZGVmYXVsdDogVDsgc2VyaWFsaXplcjogU2VyaWFsaXplcjxULCBVaW50OEFycmF5PiB9KTogUmVnaXN0cnk8VD4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJpZXMuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5IHdpdGggbmFtZSAnJHtuYW1lfScgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBSZWdpc3RyeVR5cGUuY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBvcHRpb25zLmRlZmF1bHQsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWdpc3RyeSh0YWJsZVR5cGUpO1xuICAgIH1cbn1cblxuY2xhc3MgUmVnaXN0cnlJbXBsPFQ+IGltcGxlbWVudHMgUmVnaXN0cnk8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8W1RdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2s6IExvY2sgPSBuZXcgTG9jaygpO1xuICAgIHByaXZhdGUgbGlzdGVuaW5nID0gZmFsc2U7XG4gICAgcHVibGljIHZhbHVlOiBUO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBSZWdpc3RyeVR5cGU8VD4sXG4gICAgKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0eXBlLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRUdJU1RSWV9VUERBVEVfUEFDS0VULCAocGFja2V0KSA9PlxuICAgICAgICAgICAgdGhpcy5oYW5kbGVVcGRhdGUocGFja2V0KSxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkVGFzaygoKSA9PiB0aGlzLm9uVGFzaygpKTtcbiAgICB9XG5cbiAgICBhc3luYyAjZ2V0KCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChSRUdJU1RSWV9HRVRfRU5EUE9JTlQsIHRoaXMudHlwZS5pZCk7XG4gICAgICAgIGlmIChyZXN1bHQudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXN1bHQudmFsdWUpO1xuICAgIH1cblxuICAgIGFzeW5jICNzZXQodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9VUERBVEVfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy50eXBlLmlkLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudHlwZS5zZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5sb2NrLnVzZShhc3luYyAoKSA9PiB0aGlzLiNnZXQoKSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldCh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHRoaXMuI3NldCh2YWx1ZSkpO1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMubG9jay51c2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLiNnZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYXdhaXQgZm4odmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jc2V0KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1vZGlmeShmbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlTGlrZTxUPiB8IFQpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy4jZ2V0KCk7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGF3YWl0IGZuKHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3NldChuZXdWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0ZW4oaGFuZGxlcjogKHZhbHVlOiBUKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZyAmJiB0aGlzLm9tdS5yZWFkeSkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9MSVNURU5fUEFDS0VULCB0aGlzLnR5cGUuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRFbWl0dGVyLmxpc3RlbihoYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVVwZGF0ZShkYXRhOiBSZWdpc3RyeVBhY2tldCk6IHZvaWQge1xuICAgICAgICBpZiAoIWRhdGEuaWQuaXNFcXVhbCh0aGlzLnR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnR5cGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkYXRhLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25UYXNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVHSVNUUllfTElTVEVOX1BBQ0tFVCwgdGhpcy50eXBlLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHlwZS5pZC5pc1N1YnBhdGhPZih0aGlzLm9tdS5hcHAuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9SRUdJU1RFUl9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy50eXBlLnBlcm1pc3Npb25zLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcGF0U3ZlbHRlKCk6IFdyaXRhYmxlPFQ+IHtcbiAgICAgICAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gICAgICAgIGxldCB2YWx1ZTogVCA9IHRoaXMudmFsdWU7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBTZXQ8KHZhbHVlOiBUKSA9PiB2b2lkPigpO1xuICAgICAgICB0aGlzLmxpc3RlbigobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgocnVuKSA9PiB7XG4gICAgICAgICAgICAgICAgcnVuKHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNldDogKHZhbHVlOiBUKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5ICR7dGhpcy50eXBlLmlkLmtleSgpfSBpcyBub3QgcmVhZHlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQodmFsdWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1YnNjcmliZTogKHJ1bikgPT4ge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5hZGQocnVuKTtcbiAgICAgICAgICAgICAgICBydW4odmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUocnVuKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZTogKGZuKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5ICR7dGhpcy50eXBlLmlkLmtleSgpfSBpcyBub3QgcmVhZHlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoZm4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhaXQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUkVHSVNUUllfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8UmVnaXN0cnlFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3JlZ2lzdHJ5JyxcbiAgICAob211OiBPbXUpID0+IG5ldyBSZWdpc3RyeUV4dGVuc2lvbihvbXUpLFxuKTtcbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUkVHSVNUUllfRVhURU5TSU9OX1RZUEUuam9pbigncGVybWlzc2lvbicpO1xuY29uc3QgUkVHSVNUUllfUkVHSVNURVJfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFJlZ2lzdGVyUGFja2V0PihSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWdpc3RlcicsXG4gICAgc2VyaWFsaXplcjogUmVnaXN0ZXJQYWNrZXQsXG59KTtcbmNvbnN0IFJFR0lTVFJZX1VQREFURV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8UmVnaXN0cnlQYWNrZXQ+KFxuICAgIFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ3VwZGF0ZScsXG4gICAgICAgIHNlcmlhbGl6ZXI6IFJlZ2lzdHJ5UGFja2V0LFxuICAgIH0sXG4pO1xuY29uc3QgUkVHSVNUUllfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFJFR0lTVFJZX0dFVF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPElkZW50aWZpZXIsIFJlZ2lzdHJ5UGFja2V0PihcbiAgICBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdnZXQnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0pzb24oKSxcbiAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyOiBSZWdpc3RyeVBhY2tldCxcbiAgICAgICAgcGVybWlzc2lvbklkOiBSRUdJU1RSWV9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IExvY2FsZSB9IGZyb20gJy4uLy4uL2xvY2FsaXphdGlvbi9sb2NhbGUuanMnO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHR5cGUgeyBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBSZWdpc3RyeVR5cGUsIHR5cGUgUmVnaXN0cnkgfSBmcm9tICcuLi9yZWdpc3RyeSc7XG5cbmV4cG9ydCBjb25zdCBJMThOX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPEkxOG5FeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoJ2kxOG4nLCAoY2xpZW50KSA9PiBuZXcgSTE4bkV4dGVuc2lvbihjbGllbnQpKTtcblxuZXhwb3J0IGNvbnN0IEkxOE5fU0VUX0xPQ0FMRVNfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IEkxOE5fRVhURU5TSU9OX1RZUEUuam9pbignbG9jYWxlcycsICdzZXQnKTtcbmV4cG9ydCBjb25zdCBJMThOX0dFVF9MT0NBTEVTX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBJMThOX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2xvY2FsZXMnLCAnZ2V0Jyk7XG5jb25zdCBJMThOX0xPQ0FMRVNfUkVHSVNUUllfVFlQRSA9IFJlZ2lzdHJ5VHlwZS5jcmVhdGVKc29uPExvY2FsZVtdPihJMThOX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2xvY2FsZXMnLFxuICAgIGRlZmF1bHRWYWx1ZTogdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBbXSA6IHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2VzIGFzIExvY2FsZVtdLFxufSk7XG5cbmV4cG9ydCBjbGFzcyBJMThuRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxJMThuRXh0ZW5zaW9uPiA9IEkxOE5fRVhURU5TSU9OX1RZUEU7XG4gICAgcHVibGljIHJlYWRvbmx5IGxvY2FsZXNSZWdpc3RyeTogUmVnaXN0cnk8TG9jYWxlW10+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICB0aGlzLmxvY2FsZXNSZWdpc3RyeSA9IG9tdS5yZWdpc3RyaWVzLmdldChJMThOX0xPQ0FMRVNfUkVHSVNUUllfVFlQRSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zbGF0ZShsb2NhbGl6ZWRUZXh0OiBMb2NhbGl6ZWRUZXh0KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbG9jYWxlcyA9IHRoaXMubG9jYWxlc1JlZ2lzdHJ5LnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsaXplZFRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxpemVkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRoaXMuc2VsZWN0QmVzdFRyYW5zbGF0aW9uKGxvY2FsZXMsIGxvY2FsaXplZFRleHQpO1xuICAgICAgICBpZiAoIXRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhsb2NhbGl6ZWRUZXh0KVswXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhbnNsYXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdEJlc3RUcmFuc2xhdGlvbihcbiAgICAgICAgbG9jYWxlczogcmVhZG9ubHkgTG9jYWxlW10sXG4gICAgICAgIGxvY2FsaXplZFRleHQ6IExvY2FsaXplZFRleHQsXG4gICAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGl6ZWRUZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zID0gbG9jYWxpemVkVGV4dDtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRMb2NhbGVzID0gbG9jYWxlcy5yZWR1Y2UoKGFjYywgbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBsLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgYWNjLnB1c2gocGFydHMuc2xpY2UoMCwgaSkuam9pbignLScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdIGFzIHN0cmluZ1tdKTtcbiAgICAgICAgZm9yIChjb25zdCBsIG9mIHRyYW5zZm9ybWVkTG9jYWxlcykge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbnNbbF07XG4gICAgICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TG9jYWxlKGxvY2FsZTogTG9jYWxlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlc1JlZ2lzdHJ5LnNldChsb2NhbGUpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCBlbnVtIExvZ1R5cGUge1xuICAgIEVSUk9SID0gJ2Vycm9yJyxcbiAgICBXQVJOSU5HID0gJ3dhcm5pbmcnLFxuICAgIElORk8gPSAnaW5mbycsXG4gICAgREVCVUcgPSAnZGVidWcnLFxufVxuXG5leHBvcnQgdHlwZSBMb2dNZXNzYWdlID0ge1xuICAgIHR5cGU6IExvZ1R5cGU7XG4gICAgdGV4dDogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIExvZ1BhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2U6IExvZ01lc3NhZ2UsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaXRlbTogTG9nUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhpdGVtLmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGl0ZW0ubWVzc2FnZS50eXBlKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGl0ZW0ubWVzc2FnZS50ZXh0KTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IFVpbnQ4QXJyYXkpOiBMb2dQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGl0ZW0pO1xuICAgICAgICBjb25zdCBpZCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSByZWFkZXIucmVhZFN0cmluZygpIGFzIExvZ1R5cGU7XG4gICAgICAgIGNvbnN0IHRleHQgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyB0eXBlLCB0ZXh0IH07XG4gICAgICAgIHJldHVybiBuZXcgTG9nUGFja2V0KElkZW50aWZpZXIuZnJvbUtleShpZCksIG1lc3NhZ2UpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQuanMnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQgdHlwZSB7IExvZ01lc3NhZ2UgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuaW1wb3J0IHsgTG9nUGFja2V0LCBMb2dUeXBlIH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcblxuZXhwb3J0IGNvbnN0IExPR0dFUl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxMb2dnZXJFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ2xvZ2dlcicsXG4gICAgKGNsaWVudCkgPT4gbmV3IExvZ2dlckV4dGVuc2lvbihjbGllbnQpLFxuKTtcblxuZXhwb3J0IGNvbnN0IExPR0dFUl9MT0dfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IExPR0dFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdsb2cnKTtcblxuZXhwb3J0IGNvbnN0IExPR0dFUl9MT0dfUEFDS0VUOiBQYWNrZXRUeXBlPExvZ1BhY2tldD4gPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8TG9nUGFja2V0PihMT0dHRVJfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnbG9nJyxcbiAgICBzZXJpYWxpemVyOiBMb2dQYWNrZXQsXG59KTtcbmV4cG9ydCBjb25zdCBMT0dHRVJfTElTVEVOX1BBQ0tFVDogUGFja2V0VHlwZTxJZGVudGlmaWVyPiA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihMT0dHRVJfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnbGlzdGVuJyxcbiAgICBzZXJpYWxpemVyOiBJZGVudGlmaWVyLFxufSk7XG5cbnR5cGUgTG9nTGlzdGVuZXIgPSAobWVzc2FnZTogTG9nTWVzc2FnZSkgPT4gdm9pZDtcbmV4cG9ydCBjbGFzcyBMb2dnZXJFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPExvZ2dlckV4dGVuc2lvbj4gPSBMT0dHRVJfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnM6IElkZW50aWZpZXJNYXA8TG9nTGlzdGVuZXJbXT4gPSBuZXcgSWRlbnRpZmllck1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChMT0dHRVJfTE9HX1BBQ0tFVCwgTE9HR0VSX0xJU1RFTl9QQUNLRVQpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKExPR0dFUl9MT0dfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMubGlzdGVuZXJzLmdldChwYWNrZXQuaWQpO1xuICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuZm9yRWFjaCgoaXQpID0+IGl0KHBhY2tldC5tZXNzYWdlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2cobWVzc2FnZTogTG9nTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgTG9nUGFja2V0KHRoaXMub211LmFwcC5pZCwgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMub211LnNlbmQoTE9HR0VSX0xPR19QQUNLRVQsIHBhY2tldCk7XG4gICAgfVxuXG4gICAgcHVibGljIGVycm9yKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZyh7IHR5cGU6IExvZ1R5cGUuRVJST1IsIHRleHQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdhcm5pbmcodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKHsgdHlwZTogTG9nVHlwZS5XQVJOSU5HLCB0ZXh0IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbmZvKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZyh7IHR5cGU6IExvZ1R5cGUuSU5GTywgdGV4dCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVidWcodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKHsgdHlwZTogTG9nVHlwZS5ERUJVRywgdGV4dCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdGVuKGlkOiBJZGVudGlmaWVyLCBsaXN0ZW5lcjogTG9nTGlzdGVuZXIpOiBVbmxpc3RlbiB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnMuaGFzKGlkKSkge1xuICAgICAgICAgICAgdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChMT0dHRVJfTElTVEVOX1BBQ0tFVCwgaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlzdCA9IHRoaXMubGlzdGVuZXJzLmdldChpZCkgPz8gW107XG4gICAgICAgIGxpc3QucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnNldChpZCwgbGlzdCk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBsaXN0LnNwbGljZShsaXN0LmluZGV4T2YobGlzdGVuZXIpLCAxKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25MZXZlbCA9ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCc7XG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25NZXRhZGF0YSA9IHtcbiAgICBuYW1lOiBMb2NhbGl6ZWRUZXh0O1xuICAgIG5vdGU/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGxldmVsOiBQZXJtaXNzaW9uTGV2ZWw7XG59O1xuXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uVHlwZUpzb24gPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtZXRhZGF0YTogUGVybWlzc2lvbk1ldGFkYXRhO1xufTtcblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25UeXBlIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGE7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IGlkOiBJZGVudGlmaWVyOyBtZXRhZGF0YTogUGVybWlzc2lvbk1ldGFkYXRhIH0pIHtcbiAgICAgICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQ7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBtZXRhZGF0YTogUGVybWlzc2lvbk1ldGFkYXRhO1xuICAgICAgICB9LFxuICAgICk6IFBlcm1pc3Npb25UeXBlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQZXJtaXNzaW9uVHlwZSh7XG4gICAgICAgICAgICBpZDogSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLFxuICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBQZXJtaXNzaW9uVHlwZSk6IFBlcm1pc3Npb25UeXBlSnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogZGF0YS5pZC5rZXkoKSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBkYXRhLm1ldGFkYXRhLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoanNvbjogUGVybWlzc2lvblR5cGVKc29uKTogUGVybWlzc2lvblR5cGUge1xuICAgICAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25UeXBlKHtcbiAgICAgICAgICAgIGlkOiBJZGVudGlmaWVyLmZyb21LZXkoanNvbi5pZCksXG4gICAgICAgICAgICBtZXRhZGF0YToganNvbi5tZXRhZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwLCBJZGVudGlmaWVyU2V0LCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQuanMnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmltcG9ydCB7IFBlcm1pc3Npb25UeXBlIH0gZnJvbSAnLi9wZXJtaXNzaW9uLmpzJztcblxuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8UGVybWlzc2lvbkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAncGVybWlzc2lvbicsXG4gICAgKGNsaWVudCkgPT4gbmV3IFBlcm1pc3Npb25FeHRlbnNpb24oY2xpZW50KSxcbik7XG5jb25zdCBQRVJNSVNTSU9OX1JFR0lTVEVSX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxQZXJtaXNzaW9uVHlwZVtdPihcbiAgICBQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ3JlZ2lzdGVyJyxcbiAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5vZihQZXJtaXNzaW9uVHlwZSkudG9BcnJheSgpLFxuICAgIH0sXG4pO1xuY29uc3QgUEVSTUlTU0lPTl9SRVFVSVJFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyW10+KFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVxdWlyZScsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCksXG59KTtcbmNvbnN0IFBFUk1JU1NJT05fUkVRVUVTVF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXJbXSwgdm9pZD4oXG4gICAgUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdyZXF1ZXN0JyxcbiAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9BcnJheSgpLFxuICAgIH0sXG4pO1xuY29uc3QgUEVSTUlTU0lPTl9HUkFOVF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UGVybWlzc2lvblR5cGVbXT4oUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdncmFudCcsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5vZihQZXJtaXNzaW9uVHlwZSkudG9BcnJheSgpLFxufSk7XG5cbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxQZXJtaXNzaW9uRXh0ZW5zaW9uPiA9IFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSBwZXJtaXNzaW9ucyA9IG5ldyBJZGVudGlmaWVyTWFwPFBlcm1pc3Npb25UeXBlPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0ZXJlZFBlcm1pc3Npb25zID0gbmV3IElkZW50aWZpZXJNYXA8UGVybWlzc2lvblR5cGU+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXF1aXJlZFBlcm1pc3Npb25zID0gbmV3IElkZW50aWZpZXJTZXQoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBQRVJNSVNTSU9OX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgIFBFUk1JU1NJT05fUkVRVUlSRV9QQUNLRVQsXG4gICAgICAgICAgICBQRVJNSVNTSU9OX0dSQU5UX1BBQ0tFVCxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihQRVJNSVNTSU9OX0dSQU5UX1BBQ0tFVCwgKHBlcm1pc3Npb25zKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgcGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zLnNldChwZXJtaXNzaW9uLmlkLCBwZXJtaXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFRhc2soKCkgPT4gdGhpcy5vblRhc2soKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRhc2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9tdS5hcHAudHlwZSA9PT0gJ3JlbW90ZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWdpc3RlcmVkUGVybWlzc2lvbnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoXG4gICAgICAgICAgICAgICAgUEVSTUlTU0lPTl9SRUdJU1RFUl9QQUNLRVQsXG4gICAgICAgICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLnJlZ2lzdGVyZWRQZXJtaXNzaW9ucy52YWx1ZXMoKSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkUGVybWlzc2lvbnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoXG4gICAgICAgICAgICAgICAgUEVSTUlTU0lPTl9SRVFVSVJFX1BBQ0tFVCxcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucy52YWx1ZXMoKSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyKHBlcm1pc3Npb246IFBlcm1pc3Npb25UeXBlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFBFUk1JU1NJT05fUkVHSVNURVJfUEFDS0VULCBbcGVybWlzc2lvbl0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVnaXN0ZXJlZFBlcm1pc3Npb25zLnNldChwZXJtaXNzaW9uLmlkLCBwZXJtaXNzaW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVxdWlyZSguLi5wZXJtaXNzaW9uSWRzOiBJbnRvSWRbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpZHMgPSBwZXJtaXNzaW9uSWRzLm1hcChJZGVudGlmaWVyLmZyb20pO1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gaWRzLmZpbHRlcigoaWQpID0+ICF0aGlzLnBlcm1pc3Npb25zLmhhcyhpZCkpO1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGVybWlzc2lvbnMgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2xpZW50IHN0YXJ0cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVpcmVkUGVybWlzc2lvbnMuYWRkKGlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0KC4uLnBlcm1pc3Npb25JZHM6IElkZW50aWZpZXJbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChQRVJNSVNTSU9OX1JFUVVFU1RfRU5EUE9JTlQsIHBlcm1pc3Npb25JZHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMocGVybWlzc2lvbklkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnMuaGFzKHBlcm1pc3Npb25JZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVxdWlyZWQocGVybWlzc2lvbklkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucy5oYXMocGVybWlzc2lvbklkZW50aWZpZXIpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBUYWJsZSwgVGFibGVUeXBlIH0gZnJvbSAnLi4vdGFibGUvdGFibGUuanMnO1xuXG5leHBvcnQgY29uc3QgUExVR0lOX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPFBsdWdpbkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAncGx1Z2luJyxcbiAgICAob211OiBPbXUpID0+IG5ldyBQbHVnaW5FeHRlbnNpb24ob211KSxcbik7XG5cbmV4cG9ydCBjbGFzcyBQbHVnaW5FeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFBsdWdpbkV4dGVuc2lvbj4gPSBQTFVHSU5fRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXF1aXJlZFBsdWdpbnM6IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChQTFVHSU5fUkVRVUlSRV9QQUNLRVQpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGxvd2VkUGFja2FnZXMoKTogVGFibGU8UGx1Z2luUGFja2FnZUluZm8+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub211LnRhYmxlcy5nZXQoUExVR0lOX0FMTE9XRURfUEFDS0FHRV9UQUJMRSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbG9hZChvcHRpb25zOiBSZWxvYWRPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5jYWxsKFBMVUdJTl9SRUxPQURfRU5EUE9JTlRfVFlQRSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblRhc2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub211LnNlbmQoUExVR0lOX1JFUVVJUkVfUEFDS0VULCBPYmplY3QuZnJvbUVudHJpZXModGhpcy5yZXF1aXJlZFBsdWdpbnMpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVxdWlyZShwbHVnaW5zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbHVnaW5zIG11c3QgYmUgcmVxdWlyZWQgYmVmb3JlIHRoZSBjbGllbnQgc3RhcnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGx1Z2lucykpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRQbHVnaW5zLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgUExVR0lOX1JFUVVJUkVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+PihcbiAgICBQTFVHSU5fRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAncmVxdWlyZScsXG4gICAgfSxcbik7XG5leHBvcnQgY2xhc3MgUGx1Z2luUGFja2FnZUluZm8ge1xuICAgIHB1YmxpYyBwYWNrYWdlOiBzdHJpbmc7XG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKF9wYWNrYWdlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgICAgICB0aGlzLnBhY2thZ2UgPSBfcGFja2FnZTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBQbHVnaW5QYWNrYWdlSW5mbyk6IHsgcGFja2FnZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSnNvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogeyBwYWNrYWdlOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9KTogUGx1Z2luUGFja2FnZUluZm8ge1xuICAgICAgICByZXR1cm4gUGx1Z2luUGFja2FnZUluZm8uZnJvbUpzb24oZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSnNvbihqc29uOiB7IHBhY2thZ2U6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0pOiBQbHVnaW5QYWNrYWdlSW5mbyB7XG4gICAgICAgIHJldHVybiBuZXcgUGx1Z2luUGFja2FnZUluZm8oanNvbi5wYWNrYWdlLCBqc29uLnZlcnNpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogeyBwYWNrYWdlOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHtcbiAgICAgICAgcmV0dXJuIHsgcGFja2FnZTogdGhpcy5wYWNrYWdlLCB2ZXJzaW9uOiB0aGlzLnZlcnNpb24gfTtcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhY2thZ2U7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUExVR0lOX1JFQURfUEFDS0FHRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUExVR0lOX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3BhY2thZ2UnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9NQU5BR0VfUEFDS0FHRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gUExVR0lOX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3BhY2thZ2UnLCAnbWFuYWdlJyk7XG5cbmNvbnN0IFBMVUdJTl9BTExPV0VEX1BBQ0tBR0VfVEFCTEUgPSBUYWJsZVR5cGUuY3JlYXRlSnNvbihQTFVHSU5fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnYWxsb3dlZF9wYWNrYWdlJyxcbiAgICBzZXJpYWxpemVyOiBQbHVnaW5QYWNrYWdlSW5mbyxcbiAgICBrZXk6IChpdGVtKSA9PiBpdGVtLmtleSgpLFxufSk7XG5cbnR5cGUgUmVsb2FkT3B0aW9ucyA9IHtcbiAgICBwYWNrYWdlczogc3RyaW5nW10gfCBudWxsO1xufTtcblxudHlwZSBSZWxvYWRSZXN1bHQgPSB7XG4gICAgcGFja2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5jb25zdCBQTFVHSU5fUkVMT0FEX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxSZWxvYWRPcHRpb25zLCBSZWxvYWRSZXN1bHQ+KFBMVUdJTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWxvYWQnLFxuICAgIHBlcm1pc3Npb25JZDogUExVR0lOX01BTkFHRV9QQUNLQUdFX1BFUk1JU1NJT05fSUQsXG59KTtcbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciwgRmxhZ3MgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgdHlwZSB7IFRhYmxlQ29uZmlnIH0gZnJvbSAnLi90YWJsZS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlUGFja2V0KGlkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUl0ZW1zUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaXRlbXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+LFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVJdGVtc1BhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhwYWNrZXQuaXRlbXMpLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2tldC5pdGVtcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZUl0ZW1zUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICAgICAgaXRlbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVJdGVtc1BhY2tldChpZCwgaXRlbXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlS2V5c1BhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleXM6IHN0cmluZ1tdLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVLZXlzUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KHBhY2tldC5rZXlzLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHBhY2tldC5rZXlzKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlS2V5c1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGtleXMucHVzaChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlS2V5c1BhY2tldChpZCwga2V5cyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVQcm94eVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogbnVtYmVyLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVQcm94eVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChwYWNrZXQua2V5KTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhwYWNrZXQuaXRlbXMpLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2tldC5pdGVtcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZVByb3h5UGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgIGl0ZW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRhYmxlUHJveHlQYWNrZXQoaWQsIGl0ZW1zLCBrZXkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUYWJsZUZldGNoUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbGltaXQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJhY2t3YXJkOiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVGZXRjaFBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChwYWNrZXQubGltaXQpO1xuICAgICAgICBjb25zdCBmbGFncyA9IG5ldyBGbGFncyh7IGxlbmd0aDogMiB9KTtcbiAgICAgICAgZmxhZ3Muc2V0KDAsIHBhY2tldC5iYWNrd2FyZCk7XG4gICAgICAgIGZsYWdzLnNldCgxLCBwYWNrZXQuY3Vyc29yICE9PSBudWxsKTtcbiAgICAgICAgd3JpdGVyLndyaXRlRmxhZ3MoZmxhZ3MpO1xuICAgICAgICBpZiAocGFja2V0LmN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5jdXJzb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogVGFibGVGZXRjaFBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlYWRlci5yZWFkVUxFQjEyOCgpO1xuICAgICAgICBjb25zdCBmbGFncyA9IHJlYWRlci5yZWFkRmxhZ3MoMik7XG4gICAgICAgIGNvbnN0IGJhY2t3YXJkID0gZmxhZ3MuZ2V0KDApO1xuICAgICAgICBjb25zdCBjdXJzb3IgPSBmbGFncy5pZlNldCgxLCAoKSA9PiByZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUZldGNoUGFja2V0KGlkLCBsaW1pdCwgYmFja3dhcmQsIGN1cnNvcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVGZXRjaFJhbmdlUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhcnQ6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVuZDogc3RyaW5nLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogVGFibGVGZXRjaFJhbmdlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnN0YXJ0KTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5lbmQpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlRmV0Y2hSYW5nZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVGZXRjaFJhbmdlUGFja2V0KGlkLCBzdGFydCwgZW5kKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRDb25maWdQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjb25maWc6IFRhYmxlQ29uZmlnLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogU2V0Q29uZmlnUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkocGFja2V0LmNvbmZpZykpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFNldENvbmZpZ1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFNldENvbmZpZ1BhY2tldChpZCwgY29uZmlnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXRQZXJtaXNzaW9uUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYWxsOiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlYWQ6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgd3JpdGU6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVtb3ZlOiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHByb3h5OiBJZGVudGlmaWVyIHwgbnVsbCxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFNldFBlcm1pc3Npb25QYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIGxldCBmbGFncyA9IDA7XG4gICAgICAgIGlmIChwYWNrZXQuYWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZWFkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQud3JpdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQucmVtb3ZlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5wcm94eSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZmxhZ3MgfD0gMGIxMDAwMDtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGVVaW50OChmbGFncyk7XG4gICAgICAgIGlmIChwYWNrZXQuYWxsKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmFsbC5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZWFkKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnJlYWQua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQud3JpdGUpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQud3JpdGUua2V5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWNrZXQucmVtb3ZlKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnJlbW92ZS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5wcm94eSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5wcm94eS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBTZXRQZXJtaXNzaW9uUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gcmVhZGVyLnJlYWRVaW50OCgpO1xuICAgICAgICBjb25zdCBhbGwgPSBmbGFncyAmIDBiMSA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJlYWQgPSBmbGFncyAmIDBiMTAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICBjb25zdCB3cml0ZSA9IGZsYWdzICYgMGIxMDAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICBjb25zdCByZW1vdmUgPSBmbGFncyAmIDBiMTAwMCA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gZmxhZ3MgJiAwYjEwMDAwID8gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXRQZXJtaXNzaW9uUGFja2V0KGlkLCBhbGwsIHJlYWQsIHdyaXRlLCByZW1vdmUsIHByb3h5KTtcbiAgICB9XG59XG5cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldC9wYWNrZXQuanMnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB0eXBlIHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuXG5pbXBvcnQge1xuICAgIFNldENvbmZpZ1BhY2tldCxcbiAgICBTZXRQZXJtaXNzaW9uUGFja2V0LFxuICAgIFRhYmxlRmV0Y2hQYWNrZXQsXG4gICAgVGFibGVGZXRjaFJhbmdlUGFja2V0LFxuICAgIFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgVGFibGVLZXlzUGFja2V0LFxuICAgIFRhYmxlUGFja2V0LFxuICAgIFRhYmxlUHJveHlQYWNrZXQsXG59IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFRhYmxlLCBUYWJsZUNvbmZpZywgVGFibGVFdmVudHMsIFRhYmxlUGVybWlzc2lvbnMgfSBmcm9tICcuL3RhYmxlLmpzJztcbmltcG9ydCB7IFRhYmxlVHlwZSB9IGZyb20gJy4vdGFibGUuanMnO1xuXG5leHBvcnQgY29uc3QgVEFCTEVfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8VGFibGVFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3RhYmxlJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgVGFibGVFeHRlbnNpb24oY2xpZW50KSxcbik7XG5leHBvcnQgY29uc3QgVEFCTEVfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFRBQkxFX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3Blcm1pc3Npb24nKTtcblxuY29uc3QgVEFCTEVfU0VUX1BFUk1JU1NJT05fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFNldFBlcm1pc3Npb25QYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NldF9wZXJtaXNzaW9uJyxcbiAgICBzZXJpYWxpemVyOiBTZXRQZXJtaXNzaW9uUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxTZXRDb25maWdQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NldF9jb25maWcnLFxuICAgIHNlcmlhbGl6ZXI6IFNldENvbmZpZ1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFRBQkxFX1BST1hZX0xJU1RFTl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllcj4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJveHlfbGlzdGVuJyxcbiAgICBzZXJpYWxpemVyOiBJZGVudGlmaWVyLFxufSk7XG5jb25zdCBUQUJMRV9QUk9YWV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQcm94eVBhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncHJveHknLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlUHJveHlQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fQUREX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2FkZCcsXG4gICAgc2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlSXRlbXNQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1fdXBkYXRlJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX1JFTU9WRV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaXRlbV9yZW1vdmUnLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fR0VUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2dldCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlS2V5c1BhY2tldCwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVLZXlzUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5qc29uKCksXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19BTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUtleXNQYWNrZXQsIGJvb2xlYW4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzX2FsbCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9IQVNfQU5ZX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBib29sZWFuPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX2hhc19hbnknLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUtleXNQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLmpzb24oKSxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVGZXRjaFBhY2tldCwgVGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZmV0Y2gnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUZldGNoUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX1JBTkdFX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVGZXRjaFJhbmdlUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdmZXRjaF9yYW5nZScsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlRmV0Y2hSYW5nZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9GRVRDSF9BTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZVBhY2tldCwgVGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZmV0Y2hfYWxsJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfU0laRV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlUGFja2V0LCBudW1iZXI+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3NpemUnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2NsZWFyJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbn0pO1xuXG5leHBvcnQgY2xhc3MgVGFibGVFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFRhYmxlRXh0ZW5zaW9uPiA9IFRBQkxFX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFibGVNYXAgPSBuZXcgSWRlbnRpZmllck1hcDxUYWJsZTx1bmtub3duPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBUQUJMRV9TRVRfUEVSTUlTU0lPTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCxcbiAgICAgICAgICAgIFRBQkxFX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9QUk9YWV9MSVNURU5fUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfUFJPWFlfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9BRERfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUYWJsZTxUPih0YWJsZVR5cGU6IFRhYmxlVHlwZTxUPik6IFRhYmxlPFQ+IHtcbiAgICAgICAgdGhpcy5vbXUucGVybWlzc2lvbnMucmVxdWlyZShUQUJMRV9QRVJNSVNTSU9OX0lEKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHRhYmxlVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFibGUgYWxyZWFkeSBleGlzdHMnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZUltcGw8VD4odGhpcy5vbXUsIHRhYmxlVHlwZSk7XG4gICAgICAgIHRoaXMudGFibGVNYXAuc2V0KHRhYmxlVHlwZS5pZCwgdGFibGUgYXMgVGFibGU8dW5rbm93bj4pO1xuICAgICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7IHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD4gfSk6IFRhYmxlPFQ+IHtcbiAgICAgICAgY29uc3QgdGFibGVUeXBlID0gbmV3IFRhYmxlVHlwZTxUPihcbiAgICAgICAgICAgIHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEpzb25UeXBlLCBVaW50OEFycmF5PihvcHRpb25zLnNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIG9wdGlvbnMua2V5LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUYWJsZSh0YWJsZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVkPFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7IHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PiB9KTogVGFibGU8VD4ge1xuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBuZXcgVGFibGVUeXBlPFQ+KFxuICAgICAgICAgICAgdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSksXG4gICAgICAgICAgICBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmtleSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGUodGFibGVUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHR5cGU6IFRhYmxlVHlwZTxUPik6IFRhYmxlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YWJsZU1hcC5nZXQodHlwZS5pZCkgYXMgVGFibGU8VD47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGUodHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlTWFwLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG59XG5cbmNsYXNzIFRhYmxlSW1wbDxUPiBpbXBsZW1lbnRzIFRhYmxlPFQ+IHtcbiAgICBwdWJsaWMgY2FjaGU6IE1hcDxzdHJpbmcsIFQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBldmVudDogVGFibGVFdmVudHM8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlTWFwOiBNYXA8c3RyaW5nLCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+PjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3hpZXM6IEFycmF5PChpdGVtOiBUKSA9PiBUIHwgdW5kZWZpbmVkPjtcbiAgICBwcml2YXRlIGlkOiBJZGVudGlmaWVyO1xuICAgIHByaXZhdGUgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgIHByaXZhdGUga2V5RnVuY3Rpb246IChpdGVtOiBUKSA9PiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBsaXN0ZW5pbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBjYWNoZVNpemU/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBjb25maWc/OiBUYWJsZUNvbmZpZztcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zPzogVGFibGVQZXJtaXNzaW9ucztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICB0YWJsZVR5cGU6IFRhYmxlVHlwZTxUPixcbiAgICApIHtcbiAgICAgICAgdGhpcy5pZCA9IHRhYmxlVHlwZS5pZDtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gdGFibGVUeXBlLnNlcmlhbGl6ZXI7XG4gICAgICAgIHRoaXMua2V5RnVuY3Rpb24gPSB0YWJsZVR5cGUua2V5RnVuY3Rpb247XG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZXZlbnQgPSB7XG4gICAgICAgICAgICBhZGQ6IG5ldyBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT4oKSxcbiAgICAgICAgICAgIHVwZGF0ZTogbmV3IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPigpLFxuICAgICAgICAgICAgcmVtb3ZlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgICAgICBjbGVhcjogbmV3IEV2ZW50RW1pdHRlcjxbXT4oKSxcbiAgICAgICAgICAgIGNhY2hlVXBkYXRlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvbWlzZU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5wcm94aWVzID0gW107XG4gICAgICAgIHRoaXMubGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9QUk9YWV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMucHJveGllcy5mb3JFYWNoKChwcm94eSkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW1zID0gbmV3IE1hcChcbiAgICAgICAgICAgICAgICAgICAgWy4uLml0ZW1zLmVudHJpZXMoKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJveHlJdGVtID0gcHJveHkoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3h5SXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCBwcm94eUl0ZW0gYXMgVF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgW3N0cmluZywgVF0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgaXRlbSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvbXUuc2VuZChUQUJMRV9QUk9YWV9QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBrZXk6IHBhY2tldC5rZXksXG4gICAgICAgICAgICAgICAgaXRlbXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAgICAgWy4uLml0ZW1zLmVudHJpZXMoKV0ubWFwKChba2V5LCBpdGVtXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoaXRlbSldO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFRBQkxFX0lURU1fQUREX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHBhY2tldC5pdGVtcyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuYWRkLmVtaXQoaXRlbXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX1VQREFURV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhwYWNrZXQuaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LnVwZGF0ZS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBhY2tldC5pZC5pc0VxdWFsKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQucmVtb3ZlLmVtaXQoaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5jYWNoZVVwZGF0ZS5lbWl0KHRoaXMuY2FjaGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX0NMRUFSX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LmNsZWFyLmVtaXQoKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUuZW1pdCh0aGlzLmNhY2hlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5ldmVudC5yZWFkeS5saXN0ZW4oKCkgPT4gdGhpcy5vblJlYWR5KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FjaGUoaXRlbXM6IE1hcDxzdHJpbmcsIFQ+KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBpdGVtcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IE1hcChbLi4udGhpcy5jYWNoZSwgLi4uaXRlbXNdLnNsaWNlKC10aGlzLmNhY2hlU2l6ZSkpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUuZW1pdCh0aGlzLmNhY2hlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdGVuKGxpc3RlbmVyPzogKGl0ZW1zOiBNYXA8c3RyaW5nLCBUPikgPT4gdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChUQUJMRV9MSVNURU5fUEFDS0VULCB0aGlzLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY2FjaGVVcGRhdGUubGlzdGVuKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgfVxuXG4gICAgcHVibGljIHByb3h5KGNhbGxiYWNrOiAoaXRlbTogVCkgPT4gVCB8IHVuZGVmaW5lZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKHRoaXMucHJveGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGxldCBjYW5jZWwgPSAoKTogdm9pZCA9PiB7fTtcbiAgICAgICAgICAgIGNhbmNlbCA9IHRoaXMub211Lm9uUmVhZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3hpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfUFJPWFlfTElTVEVOX1BBQ0tFVCwgdGhpcy5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3hpZXMucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb3hpZXMuc3BsaWNlKHRoaXMucHJveGllcy5pbmRleE9mKGNhbGxiYWNrKSwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblJlYWR5KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfU0VUX0NPTkZJR19QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9taXNlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9taXNlTWFwLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm9tdS5lbmRwb2ludHNcbiAgICAgICAgICAgIC5jYWxsKFRBQkxFX0lURU1fR0VUX0VORFBPSU5ULCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAga2V5czogW2tleV0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wcm9taXNlTWFwLnNldChrZXksIHByb21pc2UpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZS50aGVuKChpdGVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb21pc2VNYXAuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldE1hbnkoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkS2V5cyA9IGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gIXRoaXMuY2FjaGUuaGFzKGtleSkpXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+ICF0aGlzLnByb21pc2VNYXAuaGFzKGtleSkpO1xuICAgICAgICBpZiAoZmlsdGVyZWRLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXAoWy4uLnRoaXMuY2FjaGVdLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm9tdS5lbmRwb2ludHNcbiAgICAgICAgICAgIC5jYWxsKFRBQkxFX0lURU1fR0VUX0VORFBPSU5ULCB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAga2V5czogZmlsdGVyZWRLZXlzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWx0ZXJlZEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5zZXQoXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHByb21pc2UudGhlbigoaXRlbXMpID0+IGl0ZW1zLmdldChrZXkpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWx0ZXJlZEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1hcChbLi4udGhpcy5jYWNoZSwgLi4uaXRlbXNdLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGQoLi4uaXRlbXM6IFRbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZXJpYWxpemVJdGVtcyhpdGVtcyk7XG4gICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfSVRFTV9BRERfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGl0ZW1zOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKC4uLml0ZW1zOiBUW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2VyaWFsaXplSXRlbXMoaXRlbXMpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fVVBEQVRFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZSguLi5pdGVtczogVFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNlcmlhbGl6ZUl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IE1hcChbLi4udGhpcy5jYWNoZV0uZmlsdGVyKChba2V5XSkgPT4gIWtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fUkVNT1ZFX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0lURU1fQ0xFQVJfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhcyhrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfSVRFTV9IQVNfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5czogW2tleV0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzW2tleV0gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc01hbnk8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiguLi5rZXlzOiAoa2V5b2YgVClbXSk6IFByb21pc2U8eyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfSVRFTV9IQVNfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5czoga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXMgYXMgeyBba2V5IGluIGtleW9mIFRdOiBib29sZWFuIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc0FsbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19BTExfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc0FueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19BTllfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoSXRlbXMoe1xuICAgICAgICBsaW1pdCxcbiAgICAgICAgYmFja3dhcmQsXG4gICAgICAgIGN1cnNvcixcbiAgICB9OiB7XG4gICAgICAgIGxpbWl0OiBudW1iZXI7XG4gICAgICAgIGJhY2t3YXJkPzogYm9vbGVhbjtcbiAgICAgICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFxuICAgICAgICAgICAgVEFCTEVfRkVUQ0hfRU5EUE9JTlQsXG4gICAgICAgICAgICBuZXcgVGFibGVGZXRjaFBhY2tldCh0aGlzLmlkLCBsaW1pdCwgYmFja3dhcmQsIGN1cnNvciksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoUmFuZ2Uoe1xuICAgICAgICBzdGFydCxcbiAgICAgICAgZW5kLFxuICAgIH06IHtcbiAgICAgICAgc3RhcnQ6IHN0cmluZztcbiAgICAgICAgZW5kOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfRkVUQ0hfUkFOR0VfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaEFsbCgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFRBQkxFX0ZFVENIX0FMTF9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhyZXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyAqaXRlcmF0ZSh7XG4gICAgICAgIGJhY2t3YXJkLFxuICAgICAgICBjdXJzb3IsXG4gICAgfToge1xuICAgICAgICBiYWNrd2FyZD86IGJvb2xlYW47XG4gICAgICAgIGN1cnNvcj86IHN0cmluZztcbiAgICB9KTogQXN5bmNJdGVyYWJsZTxUPiB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHRoaXMuZmV0Y2hJdGVtcyh7XG4gICAgICAgICAgICAgICAgbGltaXQ6IHRoaXMuY2FjaGVTaXplID8/IDEwMCxcbiAgICAgICAgICAgICAgICBiYWNrd2FyZCxcbiAgICAgICAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpdGVtcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCogaXRlbXMudmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAoY3Vyc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5kZWxldGUoY3Vyc29yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN1cnNvckl0ZW0gPSBiYWNrd2FyZCA/IGl0ZW1zLnZhbHVlcygpLm5leHQoKS52YWx1ZSA6IFsuLi5pdGVtcy52YWx1ZXMoKV0ucG9wKCk7XG4gICAgICAgICAgICBpZiAoIWN1cnNvckl0ZW0pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnNvciA9IHRoaXMua2V5RnVuY3Rpb24oY3Vyc29ySXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2l6ZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfU0laRV9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzZXJpYWxpemVJdGVtcyhpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4pOiBNYXA8c3RyaW5nLCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaXRlbXMpLm1hcCgoW2tleSwgZGF0YV0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIGl0ZW1dO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXJpYWxpemVJdGVtcyhpdGVtczogVFtdKTogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmtleUZ1bmN0aW9uKGl0ZW0pLCB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGl0ZW0pXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDYWNoZVNpemUoc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FjaGVTaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29uZmlnKGNvbmZpZzogVGFibGVDb25maWcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNldCBjb25maWcgYWZ0ZXIgY2xpZW50IGhhcyBzdGFydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBUYWJsZVBlcm1pc3Npb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUuanMnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSwgdHlwZSBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgUmVnaXN0cnksIFJlZ2lzdHJ5VHlwZSB9IGZyb20gJy4uL3JlZ2lzdHJ5JztcbmltcG9ydCB7IFRhYmxlVHlwZSwgdHlwZSBUYWJsZSB9IGZyb20gJy4uL3RhYmxlJztcblxuZXhwb3J0IGNvbnN0IFNFUlZFUl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxTZXJ2ZXJFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3NlcnZlcicsXG4gICAgKG9tdTogT211KSA9PiBuZXcgU2VydmVyRXh0ZW5zaW9uKG9tdSksXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4RW50cnkge1xuICAgIHVybDogc3RyaW5nO1xuICAgIG1ldGE/OiBBcHBJbmRleFJlZ2lzdHJ5TWV0YTtcbiAgICBhZGRlZF9hdDogc3RyaW5nO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBcHBJbmRleCB7XG4gICAgaW5kZXhlczogUmVjb3JkPHN0cmluZywgQXBwSW5kZXhFbnRyeT47XG59O1xuXG5leHBvcnQgY29uc3QgU0VSVkVSX0FQUFNfUkVBRF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VSVkVSX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2FwcHMnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9BUFBTX1dSSVRFX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignYXBwcycsICd3cml0ZScpO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9JTkRFWF9SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignaW5kZXgnLCAncmVhZCcpO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9JTkRFWF9SRUdJU1RSWV9UWVBFOiBSZWdpc3RyeVR5cGU8QXBwSW5kZXg+ID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248QXBwSW5kZXg+KFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpbmRleCcsXG4gICAgZGVmYXVsdFZhbHVlOiB7ICdpbmRleGVzJzoge30gfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICB3cml0ZTogU0VSVkVSX0FQUFNfV1JJVEVfUEVSTUlTU0lPTl9JRCxcbiAgICAgICAgcmVhZDogU0VSVkVSX0lOREVYX1JFQURfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5jb25zdCBBUFBfVEFCTEVfVFlQRSA9IFRhYmxlVHlwZS5jcmVhdGVKc29uKFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdhcHBzJyxcbiAgICBzZXJpYWxpemVyOiBBcHAsXG4gICAga2V5OiAoYXBwKSA9PiBhcHAuaWQua2V5KCksXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgYWxsOiBTRVJWRVJfQVBQU19XUklURV9QRVJNSVNTSU9OX0lELFxuICAgICAgICByZWFkOiBTRVJWRVJfQVBQU19SRUFEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU0VSVkVSX1NIVVRET1dOX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignc2h1dGRvd24nKTtcbmNvbnN0IFNIVVRET1dOX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxib29sZWFuLCBib29sZWFuPihTRVJWRVJfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2h1dGRvd24nLFxuICAgIHBlcm1pc3Npb25JZDogU0VSVkVSX1NIVVRET1dOX1BFUk1JU1NJT05fSUQsXG59KTtcbmV4cG9ydCBjb25zdCBUUlVTVEVEX09SSUdJTlNfR0VUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbigndHJ1c3RlZF9vcmlnaW5zJywgJ2dldCcpO1xuZXhwb3J0IGNvbnN0IFRSVVNURURfT1JJR0lOU19TRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCd0cnVzdGVkX29yaWdpbnMnLCAnc2V0Jyk7XG5jb25zdCBUUlVTVEVEX0hPU1RTX1JFR0lTVFJZX1RZUEUgPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PihTRVJWRVJfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAndHJ1c3RlZF9ob3N0cycsXG4gICAgZGVmYXVsdFZhbHVlOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICByZWFkOiBUUlVTVEVEX09SSUdJTlNfR0VUX1BFUk1JU1NJT05fSUQsXG4gICAgICAgIHdyaXRlOiBUUlVTVEVEX09SSUdJTlNfU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbn0pO1xuXG5leHBvcnQgY2xhc3MgU2VydmVyRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxTZXJ2ZXJFeHRlbnNpb24+ID0gU0VSVkVSX0VYVEVOU0lPTl9UWVBFO1xuICAgIHB1YmxpYyByZWFkb25seSBhcHBzOiBUYWJsZTxBcHA+O1xuICAgIHB1YmxpYyByZWFkb25seSBpbmRleDogUmVnaXN0cnk8QXBwSW5kZXg+O1xuICAgIHB1YmxpYyByZWFkb25seSB0cnVzdGVkSG9zdHM6IFJlZ2lzdHJ5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICB0aGlzLmFwcHMgPSBvbXUudGFibGVzLmdldChBUFBfVEFCTEVfVFlQRSk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvbXUucmVnaXN0cmllcy5nZXQoU0VSVkVSX0lOREVYX1JFR0lTVFJZX1RZUEUpO1xuICAgICAgICB0aGlzLnRydXN0ZWRIb3N0cyA9IG9tdS5yZWdpc3RyaWVzLmdldChUUlVTVEVEX0hPU1RTX1JFR0lTVFJZX1RZUEUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihyZXN0YXJ0PzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChTSFVURE9XTl9FTkRQT0lOVF9UWVBFLCByZXN0YXJ0ID8/IGZhbHNlKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVubGlzdGVuID0gdGhpcy5vbXUubmV0d29yay5ldmVudC5kaXNjb25uZWN0ZWQubGlzdGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG9uQ29ubmVjdENhbGxiYWNrczogQXJyYXk8KGFwcDogQXBwKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBvbkRpc2Nvbm5lY3RDYWxsYmFja3M6IEFycmF5PChhcHA6IEFwcCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgb25Db25uZWN0KGNhbGxiYWNrOiAoYXBwOiBBcHApID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Db25uZWN0Q2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkRpc2Nvbm5lY3QoY2FsbGJhY2s6IChhcHA6IEFwcCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkRpc2Nvbm5lY3RDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBBcHBJbmRleFJlZ2lzdHJ5TWV0YSA9IHtcbiAgICBuYW1lOiBMb2NhbGl6ZWRUZXh0O1xuICAgIG5vdGU6IExvY2FsaXplZFRleHQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4UmVnaXN0cnlKU09OIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG1ldGE/OiBBcHBJbmRleFJlZ2lzdHJ5TWV0YTtcbiAgICBhcHBzOiBSZWNvcmQ8c3RyaW5nLCBBcHBKc29uPjtcbn1cblxuZXhwb3J0IGNsYXNzIEFwcEluZGV4UmVnaXN0cnkge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyBhcHBzOiBJZGVudGlmaWVyTWFwPEFwcD4sXG4gICAgICAgIHB1YmxpYyBtZXRhOiBBcHBJbmRleFJlZ2lzdHJ5TWV0YSB8IHVuZGVmaW5lZCxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSlNPTihqc29uOiBBcHBJbmRleFJlZ2lzdHJ5SlNPTik6IEFwcEluZGV4UmVnaXN0cnkge1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShqc29uWydpZCddKTtcbiAgICAgICAgY29uc3QgYXBwcyA9IG5ldyBJZGVudGlmaWVyTWFwPEFwcD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBbaWRTdHIsIGFwcEpTT05dIG9mIE9iamVjdC5lbnRyaWVzKGpzb25bJ2FwcHMnXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGlkU3RyKTtcbiAgICAgICAgICAgIGNvbnN0IGFwcCA9IEFwcC5kZXNlcmlhbGl6ZShhcHBKU09OKTtcbiAgICAgICAgICAgIGlmICghaWQuaXNOYW1lc3BhY2VFcXVhbChhcHAuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcHAgSUQgZG9lcyBub3QgbWF0Y2ggdGhlIElEIGluIHRoZSBpbmRleC4gJHthcHAuaWR9ICE9ICR7aWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcHBzLnNldChpZCwgYXBwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFwcEluZGV4UmVnaXN0cnkoXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGFwcHMsXG4gICAgICAgICAgICBqc29uLm1ldGEsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBBcHAsIEFwcEpzb24gfSBmcm9tICcuLi8uLi9hcHAnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCwgSWRlbnRpZmllclNldCwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uJztcbmltcG9ydCB7IFNlc3Npb25PYnNlcnZlciB9IGZyb20gJy4uL3NlcnZlci9leHRlbnNpb24nO1xuaW1wb3J0IHsgVGFibGUsIFRhYmxlVHlwZSB9IGZyb20gJy4uL3RhYmxlJztcblxuZXhwb3J0IGNvbnN0IFNFU1NJT05fRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8U2Vzc2lvbkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZSgnc2Vzc2lvbnMnLCAob211OiBPbXUpID0+IG5ldyBTZXNzaW9uRXh0ZW5zaW9uKG9tdSkpO1xuXG5leHBvcnQgY29uc3QgU0VTU0lPTlNfUkVBRF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VTU0lPTl9FWFRFTlNJT05fVFlQRS5qb2luKCdyZWFkJyk7XG5jb25zdCBTRVNTSU9OX1RBQkxFX1RZUEUgPSBUYWJsZVR5cGUuY3JlYXRlSnNvbihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Nlc3Npb25zJyxcbiAgICBzZXJpYWxpemVyOiBBcHAsXG4gICAga2V5OiAoYXBwKSA9PiBhcHAuaWQua2V5KCksXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVhZDogU0VTU0lPTlNfUkVBRF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG59KTtcbmNvbnN0IFJFUVVJUkVfQVBQU19QQUNLRVRfVFlQRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyW10+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVxdWlyZScsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCksXG59KTtcbmNvbnN0IFNFU1NJT05fT0JTRVJWRV9QQUNLRVRfVFlQRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyW10+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnb2JzZXJ2ZScsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCksXG59KTtcbmNvbnN0IFNFU1NJT05fQ09OTkVDVEVEX1BBQ0tFVF9UWVBFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEFwcD4oU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdzZXNzaW9uX2Nvbm5lY3RlZCcsXG4gICAgc2VyaWFsaXplcjogQXBwLFxufSk7XG5jb25zdCBTRVNTSU9OX0RJU0NPTk5FQ1RFRF9QQUNLRVRfVFlQRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxBcHA+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2Vzc2lvbl9kaXNjb25uZWN0ZWQnLFxuICAgIHNlcmlhbGl6ZXI6IEFwcCxcbn0pO1xuXG50eXBlIFJlbW90ZUFwcFJlcXVlc3RQYXlsb2FkID0ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBwZXJtaXNzaW9uczogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0UmVtb3RlQXBwUmVzcG9uc2UgPSB7XG4gICAgdHlwZTogJ3N1Y2Nlc3MnO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gICAgbGFuX2lwOiBzdHJpbmc7XG59IHwge1xuICAgIHR5cGU6ICdlcnJvcic7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IFJFTU9URV9BUFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VTU0lPTl9FWFRFTlNJT05fVFlQRS5qb2luKCdyZW1vdGVfYXBwJywgJ3JlcXVlc3QnKTtcblxuY29uc3QgUkVNT1RFX0FQUF9SRVFVRVNUX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxSZW1vdGVBcHBSZXF1ZXN0UGF5bG9hZCwgUmVxdWVzdFJlbW90ZUFwcFJlc3BvbnNlPihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlbW90ZV9hcHBfcmVxdWVzdCcsXG4gICAgcGVybWlzc2lvbklkOiBSRU1PVEVfQVBQX1JFUVVFU1RfUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0ZVRva2VuUmVzcG9uc2UgPSB7XG4gICAgdHlwZTogJ3N1Y2Nlc3MnO1xuICAgIHRva2VuOiBzdHJpbmc7XG59IHwge1xuICAgIHR5cGU6ICdlcnJvcic7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IEdFTkVSQVRFX1RPS0VOX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2dlbmVyYXRlX3Rva2VuJyk7XG5cbnR5cGUgR2VuZXJhdGVUb2tlblBheWxvYWQgPSB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHBlcm1pc3Npb25zOiBzdHJpbmdbXTtcbn07XG5cbmNvbnN0IEdFTkVSQVRFX1RPS0VOX0VORFBPSU5UX1RZUEUgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxHZW5lcmF0ZVRva2VuUGF5bG9hZCwgR2VuZXJhdGVUb2tlblJlc3BvbnNlPihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2dlbmVyYXRlX3Rva2VuJyxcbiAgICBwZXJtaXNzaW9uSWQ6IEdFTkVSQVRFX1RPS0VOX1BFUk1JU1NJT05fSUQsXG59KTtcblxuZXhwb3J0IGNsYXNzIFNlc3Npb25FeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFNlc3Npb25FeHRlbnNpb24+ID0gU0VTU0lPTl9FWFRFTlNJT05fVFlQRTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvbnM6IFRhYmxlPEFwcD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uT2JzZXJ2ZXJzID0gbmV3IElkZW50aWZpZXJNYXA8U2Vzc2lvbk9ic2VydmVyPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVxdWlyZWRBcHBzID0gbmV3IElkZW50aWZpZXJTZXQoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBSRVFVSVJFX0FQUFNfUEFDS0VUX1RZUEUsXG4gICAgICAgICAgICBTRVNTSU9OX09CU0VSVkVfUEFDS0VUX1RZUEUsXG4gICAgICAgICAgICBTRVNTSU9OX0NPTk5FQ1RFRF9QQUNLRVRfVFlQRSxcbiAgICAgICAgICAgIFNFU1NJT05fRElTQ09OTkVDVEVEX1BBQ0tFVF9UWVBFLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFxuICAgICAgICAgICAgU0VTU0lPTl9DT05ORUNURURfUEFDS0VUX1RZUEUsIChhcHApID0+IHRoaXMuaGFuZGxlU2Vzc2lvbkNvbm5lY3QoYXBwKSxcbiAgICAgICAgKTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihcbiAgICAgICAgICAgIFNFU1NJT05fRElTQ09OTkVDVEVEX1BBQ0tFVF9UWVBFLCAoYXBwKSA9PiB0aGlzLmhhbmRsZVNlc3Npb25EaXNjb25uZWN0KGFwcCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbnMgPSBvbXUudGFibGVzLmdldChTRVNTSU9OX1RBQkxFX1RZUEUpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgICAgICBvbXUub25SZWFkeSgoKSA9PiB0aGlzLm9uUmVhZHkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhcyhpZDogSW50b0lkKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlc3Npb25zLmhhcyhJZGVudGlmaWVyLmZyb20oaWQpLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb2JzZXJ2ZShhcHBJZDogSW50b0lkLCB7XG4gICAgICAgIG9uQ29ubmVjdCxcbiAgICAgICAgb25EaXNjb25uZWN0LFxuICAgIH06IHtcbiAgICAgICAgb25Db25uZWN0KGFwcDogQXBwKTogdm9pZDtcbiAgICAgICAgb25EaXNjb25uZWN0KGFwcDogQXBwKTogdm9pZDtcbiAgICB9KTogU2Vzc2lvbk9ic2VydmVyIHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb20oYXBwSWQpO1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChTRVNTSU9OX09CU0VSVkVfUEFDS0VUX1RZUEUsIFtpZF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gdGhpcy5zZXNzaW9uT2JzZXJ2ZXJzLmdldChpZCkgPz8gbmV3IFNlc3Npb25PYnNlcnZlcihbXSwgW10pO1xuICAgICAgICBvYnNlcnZlci5vbkNvbm5lY3Qob25Db25uZWN0KTtcbiAgICAgICAgb2JzZXJ2ZXIub25EaXNjb25uZWN0KG9uRGlzY29ubmVjdCk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbk9ic2VydmVycy5zZXQoaWQsIG9ic2VydmVyKTtcbiAgICAgICAgcmV0dXJuIG9ic2VydmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlU2Vzc2lvbkNvbm5lY3QoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLnNlc3Npb25PYnNlcnZlcnMuZ2V0KGFwcC5pZCk7XG4gICAgICAgIGlmICghb2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIG9ic2VydmVyLm9uQ29ubmVjdENhbGxiYWNrcykge1xuICAgICAgICAgICAgYXdhaXQgY2FsbGJhY2soYXBwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlU2Vzc2lvbkRpc2Nvbm5lY3QoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLnNlc3Npb25PYnNlcnZlcnMuZ2V0KGFwcC5pZCk7XG4gICAgICAgIGlmICghb2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIG9ic2VydmVyLm9uRGlzY29ubmVjdENhbGxiYWNrcykge1xuICAgICAgICAgICAgYXdhaXQgY2FsbGJhY2soYXBwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZXF1aXJlKC4uLmFwcElkczogSW50b0lkW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlcXVpcmUgYXBwcyBhZnRlciB0aGUgY2xpZW50IGhhcyBzdGFydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBhcHBJZCBvZiBhcHBJZHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRBcHBzLmFkZChJZGVudGlmaWVyLmZyb20oYXBwSWQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25UYXNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5yZXF1aXJlZEFwcHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVRVUlSRV9BUFBTX1BBQ0tFVF9UWVBFLCBBcnJheS5mcm9tKHRoaXMucmVxdWlyZWRBcHBzLnZhbHVlcygpKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25PYnNlcnZlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoU0VTU0lPTl9PQlNFUlZFX1BBQ0tFVF9UWVBFLCBBcnJheS5mcm9tKHRoaXMuc2Vzc2lvbk9ic2VydmVycy5rZXlzKCkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0UmVtb3RlQXBwKG9wdGlvbnM6IHtcbiAgICAgICAgYXBwOiBBcHA7XG4gICAgICAgIHBlcm1pc3Npb25zOiBJbnRvSWRbXTtcbiAgICB9KTogUHJvbWlzZTxSZXF1ZXN0UmVtb3RlQXBwUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgeyBhcHAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmICghYXBwLnVybCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHAgbXVzdCBoYXZlIGEgVVJMIHRvIHJlcXVlc3QgaXQgcmVtb3RlbHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXBwLnR5cGUgIT09ICdyZW1vdGUnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwcCBtdXN0IGJlIGEgcmVtb3RlIGFwcCB0byByZXF1ZXN0IGl0IHJlbW90ZWx5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcHAubWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwIG11c3QgaGF2ZSBtZXRhZGF0YSB0byByZXF1ZXN0IGl0IHJlbW90ZWx5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMub211LmVuZHBvaW50cy5jYWxsKFJFTU9URV9BUFBfUkVRVUVTVF9FTkRQT0lOVF9UWVBFLCB7XG4gICAgICAgICAgICBhcHA6IEFwcC5zZXJpYWxpemUob3B0aW9ucy5hcHApLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IG9wdGlvbnMucGVybWlzc2lvbnMubWFwKGlkID0+IElkZW50aWZpZXIuZnJvbShpZCkua2V5KCkpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVUb2tlbihvcHRpb25zOiB7XG4gICAgICAgIGFwcDogQXBwO1xuICAgICAgICBwZXJtaXNzaW9uczogSW50b0lkW107XG4gICAgfSk6IFByb21pc2U8R2VuZXJhdGVUb2tlblJlc3BvbnNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChHRU5FUkFURV9UT0tFTl9FTkRQT0lOVF9UWVBFLCB7XG4gICAgICAgICAgICBhcHA6IEFwcC5zZXJpYWxpemUob3B0aW9ucy5hcHApLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IG9wdGlvbnMucGVybWlzc2lvbnMubWFwKGlkID0+IElkZW50aWZpZXIuZnJvbShpZCkua2V5KCkpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5pbXBvcnQgeyBTaWduYWxQZXJtaXNzaW9ucywgU2lnbmFsUGVybWlzc2lvbnNKU09OIH0gZnJvbSAnLi9zaWduYWwuanMnO1xuXG5leHBvcnQgY2xhc3MgU2lnbmFsUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYm9keTogVWludDhBcnJheSxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBTaWduYWxQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkocGFja2V0LmJvZHkpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFNpZ25hbFBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBib2R5ID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmFsUGFja2V0KGlkLCBib2R5KTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBTaWduYWxSZWdpc3RlclBhY2tldEpTT04ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVybWlzc2lvbnM6IFNpZ25hbFBlcm1pc3Npb25zSlNPTjtcbn1cblxuZXhwb3J0IGNsYXNzIFNpZ25hbFJlZ2lzdGVyUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFNpZ25hbFBlcm1pc3Npb25zLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogU2lnbmFsUmVnaXN0ZXJQYWNrZXQpOiBTaWduYWxSZWdpc3RlclBhY2tldEpTT04ge1xuICAgICAgICBjb25zdCB7IHBlcm1pc3Npb25zOiBwZXJtcyB9ID0gcGFja2V0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHBhY2tldC5pZC5rZXkoKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgICAgICAgICAgYWxsOiBwZXJtcy5hbGwgPyBJZGVudGlmaWVyLmZyb20ocGVybXMuYWxsKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBsaXN0ZW46IHBlcm1zLmxpc3RlbiA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5saXN0ZW4pLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHNlbmQ6IHBlcm1zLnNlbmQgPyBJZGVudGlmaWVyLmZyb20ocGVybXMuc2VuZCkua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogU2lnbmFsUmVnaXN0ZXJQYWNrZXRKU09OKTogU2lnbmFsUmVnaXN0ZXJQYWNrZXQge1xuICAgICAgICBjb25zdCB7IHBlcm1pc3Npb25zOiBwZXJtcyB9ID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYWxSZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbUtleShkYXRhLmlkKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGw6IHBlcm1zLmFsbCA/IElkZW50aWZpZXIuZnJvbUtleShwZXJtcy5hbGwpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGxpc3RlbjogcGVybXMubGlzdGVuID8gSWRlbnRpZmllci5mcm9tS2V5KHBlcm1zLmxpc3RlbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2VuZDogcGVybXMuc2VuZCA/IElkZW50aWZpZXIuZnJvbUtleShwZXJtcy5zZW5kKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxQZXJtaXNzaW9uc0pTT04ge1xuICAgIGFsbD86IHN0cmluZztcbiAgICBsaXN0ZW4/OiBzdHJpbmc7XG4gICAgc2VuZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxQZXJtaXNzaW9ucyB7XG4gICAgYWxsPzogSW50b0lkIHwgdW5kZWZpbmVkO1xuICAgIGxpc3Rlbj86IEludG9JZCB8IHVuZGVmaW5lZDtcbiAgICBzZW5kPzogSW50b0lkIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgU2lnbmFsVHlwZTxUPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zOiBTaWduYWxQZXJtaXNzaW9ucyxcbiAgICApIHt9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxUPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIGFueT47XG4gICAgICAgICAgICBwZXJtaXNzaW9ucz86IFNpZ25hbFBlcm1pc3Npb25zO1xuICAgICAgICB9LFxuICAgICk6IFNpZ25hbFR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNpZ25hbFR5cGUoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIub2Y8VCwgYW55PihzZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpKS50b0pzb24oKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVTZXJpYWxpemVkPFQ+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zPzogU2lnbmFsUGVybWlzc2lvbnM7XG4gICAgICAgIH0sXG4gICAgKTogU2lnbmFsVHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmFsVHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWw8VD4ge1xuICAgIGxpc3RlbihoYW5kbGVyOiAodmFsdWU6IFQpID0+IHZvaWQpOiBVbmxpc3RlbjtcbiAgICBub3RpZnkoYm9keTogVCk6IHZvaWQ7XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEpzb25UeXBlLCBTZXJpYWxpemFibGUgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSwgdHlwZSBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgU2lnbmFsUGFja2V0LCBTaWduYWxSZWdpc3RlclBhY2tldCB9IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgeyBTaWduYWxUeXBlLCB0eXBlIFNpZ25hbCB9IGZyb20gJy4vc2lnbmFsLmpzJztcblxuZXhwb3J0IGNvbnN0IFNJR05BTF9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxTaWduYWxFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ3NpZ25hbCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgU2lnbmFsRXh0ZW5zaW9uKG9tdSksXG4pO1xuXG5jb25zdCBTSUdOQUxfUkVHSVNURVJfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFNpZ25hbFJlZ2lzdGVyUGFja2V0PihTSUdOQUxfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVnaXN0ZXInLFxuICAgIHNlcmlhbGl6ZXI6IFNpZ25hbFJlZ2lzdGVyUGFja2V0LFxufSk7XG5jb25zdCBTSUdOQUxfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihTSUdOQUxfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnbGlzdGVuJyxcbiAgICBzZXJpYWxpemVyOiBJZGVudGlmaWVyLFxufSk7XG5jb25zdCBTSUdOQUxfTk9USUZZX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxTaWduYWxQYWNrZXQ+KFNJR05BTF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdub3RpZnknLFxuICAgIHNlcmlhbGl6ZXI6IFNpZ25hbFBhY2tldCxcbn0pO1xuXG5leHBvcnQgY2xhc3MgU2lnbmFsRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTxTaWduYWxFeHRlbnNpb24+ID0gU0lHTkFMX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2lnbmFscyA9IG5ldyBJZGVudGlmaWVyTWFwPFNpZ25hbFR5cGU8dW5rbm93bj4+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgU0lHTkFMX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgIFNJR05BTF9MSVNURU5fUEFDS0VULFxuICAgICAgICAgICAgU0lHTkFMX05PVElGWV9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVTaWduYWw8VD4oc2lnbmFsVHlwZTogU2lnbmFsVHlwZTxUPik6IFNpZ25hbDxUPiB7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbHMuaGFzKHNpZ25hbFR5cGUuaWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ25hbCBmb3Iga2V5ICR7c2lnbmFsVHlwZS5pZH0gYWxyZWFkeSBjcmVhdGVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYWxJbXBsKHRoaXMub211LCBzaWduYWxUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMganNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4obmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+IH0pOiBTaWduYWw8VD4ge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpO1xuICAgICAgICBjb25zdCB0eXBlID0gU2lnbmFsVHlwZS5jcmVhdGVKc29uPFQ+KGlkLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2VyaWFsaXplcjogb3B0aW9ucz8uc2VyaWFsaXplcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25hbCh0eXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VyaWFsaXplZDxUPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+IH0pOiBTaWduYWw8VD4ge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMub211LmFwcC5pZC5qb2luKG5hbWUpO1xuICAgICAgICBjb25zdCB0eXBlID0gU2lnbmFsVHlwZS5jcmVhdGVTZXJpYWxpemVkPFQ+KGlkLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2VyaWFsaXplcjogb3B0aW9ucz8uc2VyaWFsaXplcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25hbCh0eXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHNpZ25hbFR5cGU6IFNpZ25hbFR5cGU8VD4pOiBTaWduYWw8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaWduYWwoc2lnbmFsVHlwZSk7XG4gICAgfVxufVxuXG5jbGFzcyBTaWduYWxJbXBsPFQ+IGltcGxlbWVudHMgU2lnbmFsPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogKCh2YWx1ZTogVCkgPT4gdm9pZClbXSA9IFtdO1xuICAgIHByaXZhdGUgbGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBTaWduYWxUeXBlPFQ+LFxuICAgICkge1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFNJR05BTF9OT1RJRllfUEFDS0VULCAoZGF0YSkgPT4gdGhpcy5oYW5kbGVCcm9hZGNhc3QoZGF0YSkpO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBub3RpZnkoYm9keTogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy50eXBlLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGJvZHkpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFNJR05BTF9OT1RJRllfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy50eXBlLmlkLFxuICAgICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGJvZHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3RlbihoYW5kbGVyOiAodmFsdWU6IFQpID0+IHZvaWQpOiBVbmxpc3RlbiB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMub211Lm9uUmVhZHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoU0lHTkFMX0xJU1RFTl9QQUNLRVQsIHRoaXMudHlwZS5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKHRoaXMubGlzdGVuZXJzLmluZGV4T2YoaGFuZGxlciksIDEpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQnJvYWRjYXN0KGRhdGE6IFNpZ25hbFBhY2tldCk6IHZvaWQge1xuICAgICAgICBpZiAoIWRhdGEuaWQuaXNFcXVhbCh0aGlzLnR5cGUuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYm9keSA9IHRoaXMudHlwZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEuYm9keSk7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGJvZHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRhc2soKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy50eXBlLmlkLmlzU3VicGF0aE9mKHRoaXMub211LmFwcC5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9tdS5zZW5kKFNJR05BTF9SRUdJU1RFUl9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy50eXBlLnBlcm1pc3Npb25zLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLAogICAgInR5cGUgT2s8VD4gPSB7XG4gICAgb2s6IHRydWU7XG4gICAgZGF0YTogVDtcbn07XG50eXBlIEVycjxFPiA9IHtcbiAgICBvazogZmFsc2U7XG4gICAgZGF0YTogRTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnlDYXRjaDxULCBFID0gRXJyb3I+KGZ1bmM6ICgpID0+IFQpOiBPazxUPiB8IEVycjxFPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGRhdGE6IGZ1bmMoKSB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBkYXRhOiBlIGFzIEUgfTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWRkcmVzcyB9IGZyb20gJy4vYWRkcmVzcy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnLi9hcHAuanMnO1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcuL2hlbHBlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5Qcm92aWRlciB7XG4gICAgZ2V0KHNlcnZlckFkZHJlc3M6IEFkZHJlc3MsIGFwcDogQXBwKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xufVxuXG5leHBvcnQgdHlwZSBTZXNzaW9uUGFyYW0gPSB7XG4gICAgYWRkcmVzczogQWRkcmVzcztcbiAgICB0b2tlbjogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIEJyb3dzZXJUb2tlblByb3ZpZGVyIGltcGxlbWVudHMgVG9rZW5Qcm92aWRlciB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBUT0tFTl9QQVJBTV9LRVkgPSAnX29tdV9zZXNzaW9uJztcblxuICAgIHByaXZhdGUgZ2V0S2V5KGFkZHJlc3M6IEFkZHJlc3MsIGFwcDogQXBwKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFthZGRyZXNzLmhvc3QsIGFkZHJlc3MucG9ydCwgYWRkcmVzcy5oYXNoID8/ICcnLCBhcHAuaWQua2V5KCldKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGFkZHJlc3M6IEFkZHJlc3MsIGFwcDogQXBwKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgZm91bmRUb2tlbiA9IHRoaXMucGFyc2VQYXJhbVNlc3Npb24oYWRkcmVzcyk7XG4gICAgICAgIGlmIChmb3VuZFRva2VuKSByZXR1cm4gZm91bmRUb2tlbjtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VQYXJhbVNlc3Npb24oYWRkcmVzczogQWRkcmVzcyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgY29uc3QgcGFyYW0gPSBzZWFyY2hQYXJhbXMuZ2V0KEJyb3dzZXJUb2tlblByb3ZpZGVyLlRPS0VOX1BBUkFNX0tFWSk7XG4gICAgICAgIGlmICghcGFyYW0pIHJldHVybjtcbiAgICAgICAgY29uc3QgeyBvaywgZGF0YTogc2Vzc2lvbiB9ID0gdHJ5Q2F0Y2g8U2Vzc2lvblBhcmFtPigoKSA9PiBKU09OLnBhcnNlKHBhcmFtKSk7XG4gICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHBhcnNlIHNlc3Npb24gZnJvbSBVUkwgcGFyYW1ldGVyOiAke3Nlc3Npb259YCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXNzaW9uLmFkZHJlc3MuaGFzaCAhPT0gYWRkcmVzcy5oYXNoKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFNlc3Npb24gYWRkcmVzcyBoYXNoIGRvZXMgbm90IG1hdGNoOiBleHBlY3RlZCAke2FkZHJlc3MuaGFzaH0sIGdvdCAke3Nlc3Npb24uYWRkcmVzcy5oYXNofWApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2Vzc2lvbi50b2tlbjtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEV4dGVuc2lvblJlZ2lzdHJ5IH0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgQVNTRVRfRVhURU5TSU9OX1RZUEUsIHR5cGUgQXNzZXRFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9hc3NldC9leHRlbnNpb24nO1xuaW1wb3J0IHsgREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB0eXBlIERhc2hib2FyZEV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL2Rhc2hib2FyZC9leHRlbnNpb24nO1xuaW1wb3J0IHsgRU5EUE9JTlRfRVhURU5TSU9OX1RZUEUsIHR5cGUgRW5kcG9pbnRFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9lbmRwb2ludC9leHRlbnNpb24nO1xuaW1wb3J0IHsgSFRUUF9FWFRFTlNJT05fVFlQRSwgSHR0cEV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL2h0dHAvZXh0ZW5zaW9uJztcbmltcG9ydCB7IEkxOE5fRVhURU5TSU9OX1RZUEUsIHR5cGUgSTE4bkV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL2kxOG4vZXh0ZW5zaW9uJztcbmltcG9ydCB7IExPR0dFUl9FWFRFTlNJT05fVFlQRSwgdHlwZSBMb2dnZXJFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9sb2dnZXIvZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEUsIHR5cGUgUGVybWlzc2lvbkV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL3Blcm1pc3Npb24vZXh0ZW5zaW9uJztcbmltcG9ydCB7IFBMVUdJTl9FWFRFTlNJT05fVFlQRSwgdHlwZSBQbHVnaW5FeHRlbnNpb24gfSBmcm9tICcuL2FwaS9wbHVnaW4vZXh0ZW5zaW9uJztcbmltcG9ydCB7IFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLCB0eXBlIFJlZ2lzdHJ5RXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvcmVnaXN0cnkvZXh0ZW5zaW9uJztcbmltcG9ydCB7IFNFUlZFUl9FWFRFTlNJT05fVFlQRSwgdHlwZSBTZXJ2ZXJFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9zZXJ2ZXIvZXh0ZW5zaW9uJztcbmltcG9ydCB7IFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIFNlc3Npb25FeHRlbnNpb24gfSBmcm9tICcuL2FwaS9zZXNzaW9uJztcbmltcG9ydCB7IFNJR05BTF9FWFRFTlNJT05fVFlQRSwgdHlwZSBTaWduYWxFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9zaWduYWwvZXh0ZW5zaW9uJztcbmltcG9ydCB7IFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB0eXBlIFRhYmxlRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvdGFibGUvZXh0ZW5zaW9uJztcbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnLi9hcHAuanMnO1xuaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4vZXZlbnQnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi9ldmVudCc7XG5pbXBvcnQgdHlwZSB7IEFkZHJlc3MsIENvbm5lY3Rpb24gfSBmcm9tICcuL25ldHdvcmsnO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gJy4vbmV0d29yayc7XG5pbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tICcuL25ldHdvcmsvY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBQQUNLRVRfVFlQRVMgfSBmcm9tICcuL25ldHdvcmsvcGFja2V0L3BhY2tldC10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2tldFR5cGUgfSBmcm9tICcuL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBXZWJzb2NrZXRUcmFuc3BvcnQgfSBmcm9tICcuL25ldHdvcmsvd2Vic29ja2V0LXRyYW5zcG9ydCc7XG5pbXBvcnQgeyBCcm93c2VyVG9rZW5Qcm92aWRlciwgdHlwZSBUb2tlblByb3ZpZGVyIH0gZnJvbSAnLi90b2tlbi5qcyc7XG5cbmV4cG9ydCB0eXBlIENsaWVudEV2ZW50cyA9IHtcbiAgICBzdGFydGVkOiBFdmVudEVtaXR0ZXI8W10+O1xuICAgIHN0b3BwZWQ6IEV2ZW50RW1pdHRlcjxbXT47XG4gICAgcmVhZHk6IEV2ZW50RW1pdHRlcjxbXT47XG59O1xuXG5leHBvcnQgY2xhc3MgT211IHtcbiAgICBwdWJsaWMgcmVhZHk6IGJvb2xlYW47XG4gICAgcHVibGljIHJ1bm5pbmc6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgZXZlbnQ6IENsaWVudEV2ZW50cyA9IHtcbiAgICAgICAgc3RhcnRlZDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICBzdG9wcGVkOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICAgIHJlYWR5OiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgfTtcbiAgICByZWFkb25seSB0b2tlbjogVG9rZW5Qcm92aWRlcjtcbiAgICByZWFkb25seSBhZGRyZXNzOiBBZGRyZXNzO1xuICAgIHJlYWRvbmx5IHNlc3Npb25zOiBTZXNzaW9uRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IG5ldHdvcms6IE5ldHdvcms7XG4gICAgcmVhZG9ubHkgZW5kcG9pbnRzOiBFbmRwb2ludEV4dGVuc2lvbjtcbiAgICByZWFkb25seSBwZXJtaXNzaW9uczogUGVybWlzc2lvbkV4dGVuc2lvbjtcbiAgICByZWFkb25seSBwbHVnaW5zOiBQbHVnaW5FeHRlbnNpb247XG4gICAgcmVhZG9ubHkgZGFzaGJvYXJkOiBEYXNoYm9hcmRFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgZXh0ZW5zaW9uczogRXh0ZW5zaW9uUmVnaXN0cnk7XG4gICAgcmVhZG9ubHkgdGFibGVzOiBUYWJsZUV4dGVuc2lvbjtcbiAgICByZWFkb25seSByZWdpc3RyaWVzOiBSZWdpc3RyeUV4dGVuc2lvbjtcbiAgICByZWFkb25seSBzaWduYWxzOiBTaWduYWxFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgYXNzZXRzOiBBc3NldEV4dGVuc2lvbjtcbiAgICByZWFkb25seSBpMThuOiBJMThuRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IHNlcnZlcjogU2VydmVyRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGh0dHA6IEh0dHBFeHRlbnNpb247XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwLFxuICAgICAgICBvcHRpb25zPzoge1xuICAgICAgICAgICAgYWRkcmVzcz86IEFkZHJlc3M7XG4gICAgICAgICAgICB0b2tlbj86IFRva2VuUHJvdmlkZXIgfCBzdHJpbmc7XG4gICAgICAgICAgICB0cmFuc3BvcnQ/OiBUcmFuc3BvcnQ7XG4gICAgICAgICAgICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbiAgICAgICAgfSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zPy50b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gb3B0aW9ucz8udG9rZW47XG4gICAgICAgICAgICB0aGlzLnRva2VuID0ge1xuICAgICAgICAgICAgICAgIGdldDogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRva2VuKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRva2VuID0gb3B0aW9ucz8udG9rZW4gPz8gbmV3IEJyb3dzZXJUb2tlblByb3ZpZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRyZXNzID0gb3B0aW9ucz8uYWRkcmVzcyA/PyB7XG4gICAgICAgICAgICBob3N0OiAnMTI3LjAuMC4xJyxcbiAgICAgICAgICAgIHBvcnQ6IDI2NDIzLFxuICAgICAgICAgICAgc2VjdXJlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5uZXR3b3JrID0gbmV3IE5ldHdvcmsoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzLFxuICAgICAgICAgICAgdGhpcy50b2tlbixcbiAgICAgICAgICAgIG9wdGlvbnM/LnRyYW5zcG9ydCA/PyBuZXcgV2Vic29ja2V0VHJhbnNwb3J0KHRoaXMuYWRkcmVzcyksXG4gICAgICAgICAgICBvcHRpb25zPy5jb25uZWN0aW9uLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm5ldHdvcmsuZXZlbnQuZGlzY29ubmVjdGVkLmxpc3RlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihQQUNLRVRfVFlQRVMuUkVBRFksICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBSRUFEWSBwYWNrZXQgd2hlbiBhbHJlYWR5IHJlYWR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQucmVhZHkuZW1pdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leHRlbnNpb25zID0gbmV3IEV4dGVuc2lvblJlZ2lzdHJ5KHRoaXMpO1xuICAgICAgICB0aGlzLmVuZHBvaW50cyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihQTFVHSU5fRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnRhYmxlcyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihUQUJMRV9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbnMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoU0VTU0lPTl9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMucmVnaXN0cmllcyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihSRUdJU1RSWV9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuc2lnbmFscyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihTSUdOQUxfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLmFzc2V0cyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihBU1NFVF9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuaTE4biA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihJMThOX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5zZXJ2ZXIgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoU0VSVkVSX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoTE9HR0VSX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5odHRwID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKEhUVFBfRVhURU5TSU9OX1RZUEUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kPFQ+KHBhY2tldFR5cGU6IFBhY2tldFR5cGU8VD4sIGRhdGE6IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZXR3b3JrLnNlbmQoe1xuICAgICAgICAgICAgdHlwZTogcGFja2V0VHlwZSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDbGllbnQgYWxyZWFkeSBydW5uaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgY29ubmVjdCA9IHRoaXMubmV0d29yay5jb25uZWN0KCk7XG4gICAgICAgIHRoaXMuZXZlbnQuc3RhcnRlZC5lbWl0KCk7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Q7XG4gICAgfVxuXG4gICAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZlbnQuc3RvcHBlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUmVhZHkoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiBVbmxpc3RlbiB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5KSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50LnJlYWR5Lmxpc3RlbihjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHdhaXRGb3JSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHkpIHJldHVybjtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBsZXQgdW5saXN0ZW4gPSAoKSA9PiB7fTtcbiAgICAgICAgICAgIHVubGlzdGVuID0gdGhpcy5ldmVudC5yZWFkeS5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHVubGlzdGVuKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IHsgQXBwLCBBcHBNZXRhZGF0YSB9IGZyb20gJy4vYXBwLmpzJztcbmV4cG9ydCB7IERpc2Nvbm5lY3RSZWFzb24gfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5leHBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwLCBJZGVudGlmaWVyU2V0LCBJbnRvSWQgfSBmcm9tICcuL2lkZW50aWZpZXInO1xuZXhwb3J0ICogYXMgbmV0d29yayBmcm9tICcuL25ldHdvcmsnO1xuZXhwb3J0IHsgT211IH0gZnJvbSAnLi9vbXUuanMnO1xuZXhwb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4vc2VyaWFsaXplJztcbmV4cG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi9zZXJpYWxpemUnO1xuZXhwb3J0IHsgQnJvd3NlclRva2VuUHJvdmlkZXIsIHR5cGUgU2Vzc2lvblBhcmFtLCB0eXBlIFRva2VuUHJvdmlkZXIgfSBmcm9tICcuL3Rva2VuJztcbmltcG9ydCB7IEFTU0VUX1BFUk1JU1NJT05fSUQgfSBmcm9tICcuL2FwaS9hc3NldCc7XG5pbXBvcnQge1xuICAgIERBU0hCT0FSRF9BUFBfSU5TVEFMTF9QRVJNSVNTSU9OX0lELFxuICAgIERBU2hCT0FSRF9EUkFHX0RST1BfUEVSTUlTU0lPTl9JRCxcbiAgICBEQVNIQk9BUkRfT1BFTl9BUFBfUEVSTUlTU0lPTl9JRCxcbiAgICBEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9QRVJNSVNTSU9OX0lELFxuICAgIERBU0hCT0FSRF9XRUJWSUVXX1BFUk1JU1NJT05fSUQsXG4gICAgREFTSE9CQVJEX0FQUF9FRElUX1BFUk1JU1NJT05fSUQsXG4gICAgREFTSE9CQVJEX0FQUF9SRUFEX1BFUk1JU1NJT05fSUQsXG59IGZyb20gJy4vYXBpL2Rhc2hib2FyZCc7XG5pbXBvcnQgeyBIVFRQX1JFUVVFU1RfUEVSTUlTU0lPTl9JRCB9IGZyb20gJy4vYXBpL2h0dHAnO1xuaW1wb3J0IHsgSTE4Tl9HRVRfTE9DQUxFU19QRVJNSVNTSU9OX0lELCBJMThOX1NFVF9MT0NBTEVTX1BFUk1JU1NJT05fSUQgfSBmcm9tICcuL2FwaS9pMThuJztcbmltcG9ydCB7IExPR0dFUl9MT0dfUEVSTUlTU0lPTl9JRCB9IGZyb20gJy4vYXBpL2xvZ2dlcic7XG5pbXBvcnQgeyBQTFVHSU5fTUFOQUdFX1BBQ0tBR0VfUEVSTUlTU0lPTl9JRCwgUExVR0lOX1JFQURfUEFDS0FHRV9QRVJNSVNTSU9OX0lEIH0gZnJvbSAnLi9hcGkvcGx1Z2luJztcbmltcG9ydCB7IFJFR0lTVFJZX1BFUk1JU1NJT05fSUQgfSBmcm9tICcuL2FwaS9yZWdpc3RyeSc7XG5pbXBvcnQgeyBTRVJWRVJfQVBQU19SRUFEX1BFUk1JU1NJT05fSUQsIFNFUlZFUl9TSFVURE9XTl9QRVJNSVNTSU9OX0lELCBUUlVTVEVEX09SSUdJTlNfR0VUX1BFUk1JU1NJT05fSUQsIFRSVVNURURfT1JJR0lOU19TRVRfUEVSTUlTU0lPTl9JRCB9IGZyb20gJy4vYXBpL3NlcnZlcic7XG5pbXBvcnQgeyBHRU5FUkFURV9UT0tFTl9QRVJNSVNTSU9OX0lELCBSRU1PVEVfQVBQX1JFUVVFU1RfUEVSTUlTU0lPTl9JRCwgU0VTU0lPTlNfUkVBRF9QRVJNSVNTSU9OX0lEIH0gZnJvbSAnLi9hcGkvc2Vzc2lvbic7XG5pbXBvcnQgeyBUQUJMRV9QRVJNSVNTSU9OX0lEIH0gZnJvbSAnLi9hcGkvdGFibGUnO1xuaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4vaWRlbnRpZmllcic7XG5cbmV4cG9ydCBjb25zdCBPbXVQZXJtaXNzaW9uczoge1xuICAgIC8vIEFzc2V0IEFQSVxuICAgIHJlYWRvbmx5IEFTU0VUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7XG4gICAgLy8gRGFzaGJvYXJkIEFQSVxuICAgIHJlYWRvbmx5IERBU0hCT0FSRF9BUFBfSU5TVEFMTF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyOyByZWFkb25seSBEQVNoQk9BUkRfRFJBR19EUk9QX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7IHJlYWRvbmx5IERBU0hCT0FSRF9PUEVOX0FQUF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyOyByZWFkb25seSBEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7IHJlYWRvbmx5IERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjsgcmVhZG9ubHkgREFTSEJPQVJEX1dFQlZJRVdfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjsgcmVhZG9ubHkgREFTSE9CQVJEX0FQUF9FRElUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7IHJlYWRvbmx5IERBU0hPQkFSRF9BUFBfUkVBRF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyO1xuICAgIC8vIEhUVFAgQVBJXG4gICAgcmVhZG9ubHkgSFRUUF9SRVFVRVNUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7XG4gICAgLy8gSTE4biBBUElcbiAgICByZWFkb25seSBJMThOX0dFVF9MT0NBTEVTX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7IHJlYWRvbmx5IEkxOE5fU0VUX0xPQ0FMRVNfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjtcbiAgICAvLyBMb2dnZXIgQVBJXG4gICAgcmVhZG9ubHkgTE9HR0VSX0xPR19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyO1xuICAgIC8vIFBsdWdpbiBBUElcbiAgICByZWFkb25seSBQTFVHSU5fTUFOQUdFX1BBQ0tBR0VfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjsgcmVhZG9ubHkgUExVR0lOX1JFQURfUEFDS0FHRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyO1xuICAgIC8vIFJlZ2lzdHJ5IEFQSVxuICAgIHJlYWRvbmx5IFJFR0lTVFJZX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7XG4gICAgLy8gU2VydmVyIEFQSVxuICAgIHJlYWRvbmx5IFNFUlZFUl9BUFBTX1JFQURfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjsgcmVhZG9ubHkgU0VSVkVSX1NIVVRET1dOX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7IHJlYWRvbmx5IFRSVVNURURfT1JJR0lOU19HRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjsgcmVhZG9ubHkgVFJVU1RFRF9PUklHSU5TX1NFVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyO1xuICAgIC8vIFNlc3Npb24gQVBJXG4gICAgcmVhZG9ubHkgR0VORVJBVEVfVE9LRU5fUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjsgcmVhZG9ubHkgUkVNT1RFX0FQUF9SRVFVRVNUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7IHJlYWRvbmx5IFNFU1NJT05TX1JFQURfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjtcbiAgICAvLyBUYWJsZSBBUElcbiAgICByZWFkb25seSBUQUJMRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyO1xufSA9IHtcbiAgICAvLyBBc3NldCBBUElcbiAgICBBU1NFVF9QRVJNSVNTSU9OX0lEOiBBU1NFVF9QRVJNSVNTSU9OX0lELFxuICAgIC8vIERhc2hib2FyZCBBUElcbiAgICBEQVNIQk9BUkRfQVBQX0lOU1RBTExfUEVSTUlTU0lPTl9JRCxcbiAgICBEQVNoQk9BUkRfRFJBR19EUk9QX1BFUk1JU1NJT05fSUQsXG4gICAgREFTSEJPQVJEX09QRU5fQVBQX1BFUk1JU1NJT05fSUQsXG4gICAgREFTSEJPQVJEX1NFVF9QRVJNSVNTSU9OX0lELFxuICAgIERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fUEVSTUlTU0lPTl9JRCxcbiAgICBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lELFxuICAgIERBU0hPQkFSRF9BUFBfRURJVF9QRVJNSVNTSU9OX0lELFxuICAgIERBU0hPQkFSRF9BUFBfUkVBRF9QRVJNSVNTSU9OX0lELFxuICAgIC8vIEhUVFAgQVBJXG4gICAgSFRUUF9SRVFVRVNUX1BFUk1JU1NJT05fSUQsXG4gICAgLy8gSTE4biBBUElcbiAgICBJMThOX0dFVF9MT0NBTEVTX1BFUk1JU1NJT05fSUQsXG4gICAgSTE4Tl9TRVRfTE9DQUxFU19QRVJNSVNTSU9OX0lELFxuICAgIC8vIExvZ2dlciBBUElcbiAgICBMT0dHRVJfTE9HX1BFUk1JU1NJT05fSUQsXG4gICAgLy8gUGx1Z2luIEFQSVxuICAgIFBMVUdJTl9NQU5BR0VfUEFDS0FHRV9QRVJNSVNTSU9OX0lELFxuICAgIFBMVUdJTl9SRUFEX1BBQ0tBR0VfUEVSTUlTU0lPTl9JRCxcbiAgICAvLyBSZWdpc3RyeSBBUElcbiAgICBSRUdJU1RSWV9QRVJNSVNTSU9OX0lELFxuICAgIC8vIFNlcnZlciBBUElcbiAgICBTRVJWRVJfQVBQU19SRUFEX1BFUk1JU1NJT05fSUQsXG4gICAgU0VSVkVSX1NIVVRET1dOX1BFUk1JU1NJT05fSUQsXG4gICAgVFJVU1RFRF9PUklHSU5TX0dFVF9QRVJNSVNTSU9OX0lELFxuICAgIFRSVVNURURfT1JJR0lOU19TRVRfUEVSTUlTU0lPTl9JRCxcbiAgICAvLyBTZXNzaW9uIEFQSVxuICAgIEdFTkVSQVRFX1RPS0VOX1BFUk1JU1NJT05fSUQsXG4gICAgUkVNT1RFX0FQUF9SRVFVRVNUX1BFUk1JU1NJT05fSUQsXG4gICAgU0VTU0lPTlNfUkVBRF9QRVJNSVNTSU9OX0lELFxuICAgIC8vIFRhYmxlIEFQSVxuICAgIFRBQkxFX1BFUk1JU1NJT05fSUQsXG59IGFzIGNvbnN0O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7OztBQUdBLElBQU0sa0JBQWtCO0FBQ3hCLElBQU0sYUFB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
5002
+ //# debugId=BAECDE7A259D3CD464756E2164756E21
5003
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2lkZW50aWZpZXIudHMiLCAiLi4vLi4vc3JjL2FwcC50cyIsICIuLi8uLi9zcmMvY29uc3QudHMiLCAiLi4vLi4vc3JjL3NlcmlhbGl6ZS9zZXJpYWxpemVyLnRzIiwgIi4uLy4uL3NyYy9zZXJpYWxpemUvYnl0ZWJ1ZmZlci50cyIsICIuLi8uLi9zcmMvbmV0d29yay9wYWNrZXQvcGFja2V0LnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMudHMiLCAiLi4vLi4vc3JjL2Vycm9ycy50cyIsICIuLi8uLi9zcmMvbmV0d29yay9mcmFtZS10cmFuc3BvcnQudHMiLCAiLi4vLi4vc3JjL2V2ZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy92ZXJzaW9uLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL2Nvbm5lY3Rpb24udHMiLCAiLi4vLi4vc3JjL25ldHdvcmsvZW5jcnlwdGlvbi50cyIsICIuLi8uLi9zcmMvbmV0d29yay9uZXR3b3JrLnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3dlYnNvY2tldC10cmFuc3BvcnQudHMiLCAiLi4vLi4vc3JjL2FwaS9leHRlbnNpb24tcmVnaXN0cnkudHMiLCAiLi4vLi4vc3JjL2FwaS9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9lbmRwb2ludC9lbmRwb2ludC50cyIsICIuLi8uLi9zcmMvYXBpL2Fzc2V0L2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3JlZ2lzdHJ5L3JlZ2lzdHJ5LnRzIiwgIi4uLy4uL3NyYy9hcGkvdGFibGUvdGFibGUudHMiLCAiLi4vLi4vc3JjL2FwaS9kYXNoYm9hcmQvcGFja2V0cy50cyIsICIuLi8uLi9zcmMvYXBpL2Rhc2hib2FyZC9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9lbmRwb2ludC9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvZW5kcG9pbnQvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvaHR0cC9odHRwLnRzIiwgIi4uLy4uL3NyYy9hcGkvaHR0cC93ZWJzb2NrZXQudHMiLCAiLi4vLi4vc3JjL2FwaS9odHRwL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvbG9jay50cyIsICIuLi8uLi9zcmMvYXBpL3JlZ2lzdHJ5L3BhY2tldHMudHMiLCAiLi4vLi4vc3JjL2FwaS9yZWdpc3RyeS9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9pMThuL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL2xvZ2dlci9wYWNrZXRzLnRzIiwgIi4uLy4uL3NyYy9hcGkvbG9nZ2VyL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3Blcm1pc3Npb24vcGVybWlzc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3Blcm1pc3Npb24vZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvcGx1Z2luL2V4dGVuc2lvbi50cyIsICIuLi8uLi9zcmMvYXBpL3RhYmxlL3BhY2tldHMudHMiLCAiLi4vLi4vc3JjL2FwaS90YWJsZS9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9zZXJ2ZXIvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9hcGkvc2Vzc2lvbi9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9zaWduYWwvcGFja2V0cy50cyIsICIuLi8uLi9zcmMvYXBpL3NpZ25hbC9zaWduYWwudHMiLCAiLi4vLi4vc3JjL2FwaS9zaWduYWwvZXh0ZW5zaW9uLnRzIiwgIi4uLy4uL3NyYy9oZWxwZXIudHMiLCAiLi4vLi4vc3JjL3Rva2VuLnRzIiwgIi4uLy4uL3NyYy9vbXUudHMiLCAiLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4vYXBwJztcblxuY29uc3QgTkFNRVNQQUNFX1JFR0VYID0gL14oXFwuW14vOi5dfFtcXHctXSkrJC87XG5jb25zdCBOQU1FX1JFR0VYID0gL15bXi86XSskLztcblxuZXhwb3J0IHR5cGUgSW50b0lkID0gSWRlbnRpZmllciB8IHN0cmluZyB8IEV4dGVuc2lvblR5cGUgfCBBcHA7XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZ1tdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgICAgICAuLi5wYXRoOiBzdHJpbmdbXVxuICAgICkge1xuICAgICAgICBJZGVudGlmaWVyLnZhbGlkYXRlKG5hbWVzcGFjZSwgcGF0aCk7XG4gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllci5rZXkoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGpzb246IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tSnNvbihqc29uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb20oaWQ6IEludG9JZCk6IElkZW50aWZpZXIge1xuICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQgaW5zdGFuY2VvZiBBcHApIHtcbiAgICAgICAgICAgIHJldHVybiBpZC5pZDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tS2V5KGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBpbmZlclxuICAgICAgICAgICAgLy8gVml0ZSBkb2VzIG5vdCBwcmVzZXJ2ZSBjbGFzcyBpbmZvcm1hdGlvbiB3aGVuIGltcG9ydGluZyBmcm9tIGRpZmZlcmVudCBwYWNrYWdlc1xuICAgICAgICAgICAgY29uc3QgaWRDYXN0ZWQgPSBpZCBhcyB7IG5hbWVzcGFjZTogc3RyaW5nOyBwYXRoOiBzdHJpbmdbXSB9O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiBpZENhc3RlZC5uYW1lc3BhY2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpZENhc3RlZC5wYXRoKSAmJlxuICAgICAgICAgICAgICAgIGlkQ2FzdGVkLnBhdGguZXZlcnkoKHApID0+IHR5cGVvZiBwID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihpZENhc3RlZC5uYW1lc3BhY2UsIC4uLmlkQ2FzdGVkLnBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaWRXaXRoSWQgPSBpZCBhcyB7IGlkOiBJbnRvSWQgfCB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWRXaXRoSWQuaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbShpZFdpdGhJZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IHRvIElkZW50aWZpZXI6ICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21PcHRpb25hbChpZDogSW50b0lkIHwgdW5kZWZpbmVkIHwgbnVsbCk6IElkZW50aWZpZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tKGlkKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGUobmFtZXNwYWNlOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbmFtZXNwYWNlOiBOYW1lc3BhY2UgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGF0aDogUGF0aCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5hbWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU5BTUVTUEFDRV9SRUdFWC50ZXN0KG5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuYW1lc3BhY2U6IE5hbWVzcGFjZSBtdXN0IG1hdGNoICR7TkFNRVNQQUNFX1JFR0VYfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBwYXRoKSB7XG4gICAgICAgICAgICBpZiAoIU5BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXRoOiBOYW1lIG11c3QgbWF0Y2ggJHtOQU1FX1JFR0VYfSBidXQgZ290ICR7bmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmb3JtYXQobmFtZXNwYWNlOiBzdHJpbmcsIC4uLnBhdGg6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgSWRlbnRpZmllci52YWxpZGF0ZShuYW1lc3BhY2UsIHBhdGgpO1xuICAgICAgICByZXR1cm4gYCR7bmFtZXNwYWNlfToke3BhdGguam9pbignLycpfWA7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21LZXkoa2V5OiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0ga2V5LmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKHNlcGFyYXRvciA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXk6IE5vIHNlcGFyYXRvciBmb3VuZCBpbiAke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoJzonLCBzZXBhcmF0b3IgKyAxKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXk6IE11bHRpcGxlIHNlcGFyYXRvcnMgZm91bmQgaW4gJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID0ga2V5LnNsaWNlKDAsIHNlcGFyYXRvcik7XG4gICAgICAgIGNvbnN0IHBhdGggPSBrZXkuc2xpY2Uoc2VwYXJhdG9yICsgMSk7XG4gICAgICAgIGlmICghbmFtZXNwYWNlIHx8ICFwYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5OiBOYW1lc3BhY2UgYW5kIHBhdGggY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKG5hbWVzcGFjZSwgLi4ucGF0aC5zcGxpdCgnLycpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICBjb25zdCBuYW1lc3BhY2UgPSBJZGVudGlmaWVyLm5hbWVzcGFjZUZyb21VcmwocGFyc2VkVXJsLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXRoID0gcGFyc2VkVXJsLnBhdGhuYW1lLnNsaWNlKDEpLnNwbGl0KCcvJyk7XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihuYW1lc3BhY2UsIC4uLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbmFtZXNwYWNlRnJvbVVybCh1cmw6IHN0cmluZyB8IFVSTCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlZC5ob3N0bmFtZS5zcGxpdCgnLicpLnJldmVyc2UoKS5qb2luKCcuJyk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXkoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpzb24oanNvbjogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb21LZXkoanNvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGtleSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mb3JtYXQodGhpcy5uYW1lc3BhY2UsIC4uLnRoaXMucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWwob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5KCkgPT09IG90aGVyLmtleSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc05hbWVzcGFjZUVxdWFsKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZSA9PT0gb3RoZXIubmFtZXNwYWNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1N1YnBhdGhPZihvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5uYW1lc3BhY2UgIT09IG90aGVyLm5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhdGgubGVuZ3RoIDwgb3RoZXIucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG90aGVyLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhdGhbaV0gIT09IG90aGVyLnBhdGhbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW4oLi4ucGF0aDogc3RyaW5nW10pOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKHRoaXMubmFtZXNwYWNlLCAuLi50aGlzLnBhdGgsIC4uLnBhdGgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJNYXA8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFwOiBNYXA8c3RyaW5nLCBUPiA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZW50cmllcz86IEl0ZXJhYmxlPFtJZGVudGlmaWVyLCBUXT4sXG4gICAgKSB7XG4gICAgICAgIGlmICghZW50cmllcykgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChpZC5rZXkoKSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoaWRlbnRpZmllcjogSWRlbnRpZmllciwgdmFsdWU6IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0KGlkZW50aWZpZXIua2V5KCksIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmhhcyhpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuZGVsZXRlKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMubWFwLmtleXMoKSkge1xuICAgICAgICAgICAgeWllbGQgSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHVibGljICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIFRdPiB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMubWFwLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW0lkZW50aWZpZXIuZnJvbUtleShrZXkpLCB2YWx1ZV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgVF0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJTZXQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuYWRkKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQuaGFzKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5kZWxldGUoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqa2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPElkZW50aWZpZXI+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5zZXQua2V5cygpKSB7XG4gICAgICAgICAgICB5aWVsZCBJZGVudGlmaWVyLmZyb21LZXkoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgSWRlbnRpZmllcl0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5zZXQua2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgICAgICB5aWVsZCBbaWRlbnRpZmllciwgaWRlbnRpZmllcl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgSWRlbnRpZmllcl0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgTG9jYWxlIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vbG9jYWxlLmpzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxpemVkVGV4dCB9IGZyb20gJy4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5cbmV4cG9ydCB0eXBlIEFwcE1ldGFkYXRhID0ge1xuICAgIGxvY2FsZTogTG9jYWxlO1xuICAgIG5hbWU/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGljb24/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGRlc2NyaXB0aW9uPzogTG9jYWxpemVkVGV4dDtcbiAgICBpbWFnZT86IExvY2FsaXplZFRleHQ7XG4gICAgc2l0ZT86IExvY2FsaXplZFRleHQ7XG4gICAgcmVwb3NpdG9yeT86IExvY2FsaXplZFRleHQ7XG4gICAgYXV0aG9ycz86IExvY2FsaXplZFRleHQ7XG4gICAgbGljZW5zZT86IExvY2FsaXplZFRleHQ7XG4gICAgdGFncz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgQXBwVHlwZSA9ICdhcHAnIHwgJ3NlcnZpY2UnIHwgJ3JlbW90ZScgfCAncGx1Z2luJyB8ICdkYXNoYm9hcmQnO1xuXG5leHBvcnQgdHlwZSBEZXBlbmRlbmN5U3BlY2lmaWVyID0ge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBpbmRleD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFwcEpzb24gPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBBcHBUeXBlO1xuICAgIHBhcmVudF9pZD86IHN0cmluZztcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xufTtcblxuZXhwb3J0IGNsYXNzIEFwcCB7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyO1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBBcHBUeXBlO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXJlbnRJZD86IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHVybD86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBEZXBlbmRlbmN5U3BlY2lmaWVyIHwgc3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBJbnRvSWQsIG9wdGlvbnM6IHtcbiAgICAgICAgdHlwZT86IEFwcFR5cGU7XG4gICAgICAgIHBhcmVudElkPzogSW50b0lkO1xuICAgICAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgICAgICB1cmw/OiBzdHJpbmc7XG4gICAgICAgIG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgICAgIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5pZCA9IElkZW50aWZpZXIuZnJvbShpZCk7XG4gICAgICAgIHRoaXMucGFyZW50SWQgPSBJZGVudGlmaWVyLmZyb21PcHRpb25hbChvcHRpb25zLnBhcmVudElkKTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uO1xuICAgICAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICAgICAgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlID8/ICdhcHAnO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG9wdGlvbnMuZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaW5mbzogQXBwSnNvbik6IEFwcCB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGluZm8uaWQpO1xuICAgICAgICByZXR1cm4gbmV3IEFwcChpZCwge1xuICAgICAgICAgICAgcGFyZW50SWQ6IElkZW50aWZpZXIuZnJvbU9wdGlvbmFsKGluZm8ucGFyZW50X2lkKSxcbiAgICAgICAgICAgIHZlcnNpb246IGluZm8udmVyc2lvbixcbiAgICAgICAgICAgIHVybDogaW5mby51cmwsXG4gICAgICAgICAgICB0eXBlOiBpbmZvLnR5cGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogaW5mby5tZXRhZGF0YSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogaW5mby5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IEFwcCk6IEFwcEpzb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGRhdGEuaWQua2V5KCksXG4gICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICBwYXJlbnRfaWQ6IGRhdGEucGFyZW50SWQ/LmtleSgpLFxuICAgICAgICAgICAgdmVyc2lvbjogZGF0YS52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBkYXRhLnVybCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBkYXRhLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBkYXRhLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgam9pbiguLi5wYXRoczogc3RyaW5nW10pOiBBcHAge1xuICAgICAgICByZXR1cm4gbmV3IEFwcCh0aGlzLmlkLmpvaW4oLi4ucGF0aHMpLCB7XG4gICAgICAgICAgICBwYXJlbnRJZDogdGhpcy5wYXJlbnRJZCxcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogdGhpcy5kZXBlbmRlbmNpZXMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IGNvbnN0IHRleHRFbmNvZGVyOiBUZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuZXhwb3J0IGNvbnN0IHRleHREZWNvZGVyOiBUZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi9jb25zdC5qcyc7XG5cbmV4cG9ydCB0eXBlIEpzb25UeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQgfCB7IFtrZXkgaW4gbmV2ZXJdPzogSnNvblR5cGUgfSB8IEpzb25UeXBlW107XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICBzZXJpYWxpemUoZGF0YTogVCk6IEQ7XG4gICAgZGVzZXJpYWxpemUoZGF0YTogRCk6IFQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHNlcmlhbGl6ZTogKGRhdGE6IFQpID0+IEQsXG4gICAgICAgIHB1YmxpYyBkZXNlcmlhbGl6ZTogKGRhdGE6IEQpID0+IFQsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgb2Y8VCwgRD4oc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIEQ+KTogU2VyaWFsaXplcjxULCBEPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBEPihzZXJpYWxpemVyLnNlcmlhbGl6ZSwgc2VyaWFsaXplci5kZXNlcmlhbGl6ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwaXBlPFQsIFIsIEQ+KHNlcjE6IFNlcmlhbGl6YWJsZTxULCBSPiwgc2VyMjogU2VyaWFsaXphYmxlPFIsIEQ+KTogU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcjIuc2VyaWFsaXplKHNlcjEuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXIxLmRlc2VyaWFsaXplKHNlcjIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdHJhbnNmb3JtPFQ+KGZ1bmM6ICh2YWx1ZTogVCkgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgVD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVD4oXG4gICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vb3A8VD4oKTogU2VyaWFsaXplcjxULCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBUPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkPFxuICAgICAgICBLIGV4dGVuZHMga2V5b2YgRCxcbiAgICAgICAgUixcbiAgICA+KFxuICAgICAgICBrZXk6IEssXG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxEW0tdLCBSPixcbiAgICApOiBTZXJpYWxpemVyPFxuICAgICAgICBULFxuICAgICAgICB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH1cbiAgICA+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFxuICAgICAgICAgICAgVCxcbiAgICAgICAgICAgIHsgW1AgaW4ga2V5b2YgRF06IFAgZXh0ZW5kcyBLID8gUiA6IERbUF0gfVxuICAgICAgICA+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemUoZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2VyaWFsaXplZCxcbiAgICAgICAgICAgICAgICAgICAgW2tleV06IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHNlcmlhbGl6ZWRba2V5XSksXG4gICAgICAgICAgICAgICAgfSBhcyB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGFba2V5XSBhcyBSKSxcbiAgICAgICAgICAgICAgICB9IGFzIEQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMganNvbjxUIGV4dGVuZHMgSnNvblR5cGU+KCk6IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGV4dEVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeSh0aGlzLnNlcmlhbGl6ZShkYXRhKSkpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BcnJheSgpOiBTZXJpYWxpemVyPFRbXSwgRFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxUW10sIERbXT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuc2VyaWFsaXplKGl0ZW0pKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLm1hcCgoaXRlbSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShpdGVtKSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvTWFwKCk6IFNlcmlhbGl6ZXI8TWFwPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIEQ+PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxNYXA8c3RyaW5nLCBUPiwgTWFwPHN0cmluZywgRD4+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgRD4oKTtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHRoaXMuc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgdGhpcy5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmYWxsYmFjayhmYWxsYmFjazogVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFsbGJhY2tNYXAoZmFsbGJhY2s6IChkYXRhOiBELCBlcnJvcjogdW5rbm93bikgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjayhkYXRhLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGlwZTxFPihzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8RCwgRT4pOiBTZXJpYWxpemVyPFQsIEU+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEU+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB0aGlzLmRlc2VyaWFsaXplKHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIsIHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vY29uc3QuanMnO1xuaW1wb3J0IHsgSnNvblR5cGUgfSBmcm9tICcuL3NlcmlhbGl6ZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgRmxhZ3Mge1xuICAgIHByaXZhdGUgdmFsdWU6IG51bWJlcjtcbiAgICBwcml2YXRlIGxlbmd0aDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogeyB2YWx1ZT86IG51bWJlcjsgbGVuZ3RoPzogbnVtYmVyIH0pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9wdGlvbnMudmFsdWUgPz8gMDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRpb25zLmxlbmd0aCA/PyAzMjtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBvc2l0aW9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlICYgKDEgPDwgcG9zaXRpb24pKSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KHBvc2l0aW9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlICYgKDEgPDwgcG9zaXRpb24pKSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaWZTZXQ8VD4ocG9zaXRpb246IG51bWJlciwgY2FsbGJhY2s6ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KHBvc2l0aW9uOiBudW1iZXIsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSB8PSAxIDw8IHBvc2l0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSAmPSB+KDEgPDwgcG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKHdyaXRlcjogQnl0ZVdyaXRlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBiaXRzID0gbmV3IFVpbnQ4QXJyYXkoKHRoaXMubGVuZ3RoICsgNykgLyA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBiaXRzW2ldID0gKHRoaXMudmFsdWUgPj4gKGkgKiA4KSkgJiAweGZmO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci53cml0ZShiaXRzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWQocmVhZGVyOiBCeXRlUmVhZGVyLCBsZW5ndGg6IG51bWJlcik6IEZsYWdzIHtcbiAgICAgICAgbGV0IHZhbHVlID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAobGVuZ3RoICsgNykgLyA4OyBpKyspIHtcbiAgICAgICAgICAgIHZhbHVlIHw9IHJlYWRlci5yZWFkVWludDgoKSA8PCAoaSAqIDgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRmxhZ3MoeyB2YWx1ZSwgbGVuZ3RoIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVhZEZsb2F0MTYoZGF0YVZpZXc6IERhdGFWaWV3LCBvZmZzZXQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc2lnbiA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4ODAwMCkgPyAtMSA6IDE7XG4gICAgY29uc3QgZXhwb25lbnQgPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDdjMDApID4+IDEwO1xuICAgIGNvbnN0IG1hbnRpc3NhID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHgwM2ZmKTtcbiAgICBpZiAoZXhwb25lbnQgPT09IDAgJiYgbWFudGlzc2EgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChleHBvbmVudCA9PT0gMHgxZikge1xuICAgICAgICByZXR1cm4gbWFudGlzc2EgPT09IDAgPyBJbmZpbml0eSAqIHNpZ24gOiBOYU47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEV4cG9uZW50ID0gZXhwb25lbnQgLSAxNTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE1hbnRpc3NhID0gbWFudGlzc2EgLyAxMDI0O1xuICAgICAgICByZXR1cm4gc2lnbiAqIE1hdGgucG93KDIsIG5vcm1hbGl6ZWRFeHBvbmVudCkgKiAoMSArIG5vcm1hbGl6ZWRNYW50aXNzYSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0MTYoZGF0YVZpZXc6IERhdGFWaWV3LCBvZmZzZXQ6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaWduID0gdmFsdWUgPCAwID8gMSA6IDA7XG4gICAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSk7XG4gICAgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMHg3YzAwIHwgKHNpZ24gPDwgMTUpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHBvbmVudCA9IE1hdGguZmxvb3IoTWF0aC5sb2cyKHZhbHVlKSk7XG4gICAgY29uc3QgbWFudGlzc2EgPSB2YWx1ZSAvIE1hdGgucG93KDIsIGV4cG9uZW50KSAtIDE7XG4gICAgY29uc3Qgbm9ybWFsaXplZEV4cG9uZW50ID0gZXhwb25lbnQgKyAxNTtcbiAgICBjb25zdCBub3JtYWxpemVkTWFudGlzc2EgPSBNYXRoLnJvdW5kKG1hbnRpc3NhICogMTAyNCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRFeHBvbmVudCA8PSAwKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIHNpZ24gPDwgMTUpO1xuICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZEV4cG9uZW50ID49IDB4MWYpIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMHg3YzAwIHwgKHNpZ24gPDwgMTUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAoc2lnbiA8PCAxNSkgfCAobm9ybWFsaXplZEV4cG9uZW50IDw8IDEwKSB8IG5vcm1hbGl6ZWRNYW50aXNzYSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQnl0ZVdyaXRlciB7XG4gICAgcHJpdmF0ZSBkYXRhVmlldzogRGF0YVZpZXc7XG4gICAgcHJpdmF0ZSBidWZmZXI6IEFycmF5QnVmZmVyO1xuICAgIHByaXZhdGUgb2Zmc2V0ID0gMDtcbiAgICBwcml2YXRlIGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihpbml0PzogQXJyYXlCdWZmZXIsIG9mZnNldD86IG51bWJlcikge1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldCA/PyAwO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGluaXQgPz8gbmV3IEFycmF5QnVmZmVyKDEwMjQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmZmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VaW50OEFycmF5KGJ1ZmZlcjogVWludDhBcnJheSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgIHVpbnQ4QXJyYXkuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVXcml0ZXIoYXJyYXlCdWZmZXIsIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFsbG9jYXRlKGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIGxlbmd0aCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0J5dGVMZW5ndGggPSBNYXRoLm1heCh0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoICogMiwgdGhpcy5vZmZzZXQgKyBsZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgbmV3QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKG5ld0J5dGVMZW5ndGgpO1xuICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkobmV3QnVmZmVyKS5zZXQobmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIpKTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3QnVmZmVyO1xuICAgICAgICAgICAgdGhpcy5kYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUoZGF0YTogVWludDhBcnJheSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoZGF0YS5sZW5ndGgpO1xuICAgICAgICBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlcikuc2V0KGRhdGEsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUJvb2xlYW4odmFsdWU6IGJvb2xlYW4pOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSA/IDEgOiAwKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50OCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50OCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50OCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDE2KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQxNih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMik7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDE2KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50MzIodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQ2NCh2YWx1ZTogYmlnaW50KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoOCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0QmlnSW50NjQodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDY0KHZhbHVlOiBiaWdpbnQpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg4KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRCaWdVaW50NjQodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVUxFQjEyOCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExFQjEyOFxuICAgICAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHZhbHVlID4gMHg3Zikge1xuICAgICAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsICh2YWx1ZSAmIDB4N2YpIHwgMHg4MCk7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICAgICAgdmFsdWUgPj49IDc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50OCh0aGlzLm9mZnNldCwgdmFsdWUgJiAweDdmKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQxNih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMik7XG4gICAgICAgIHdyaXRlRmxvYXQxNih0aGlzLmRhdGFWaWV3LCB0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRGbG9hdDMyKHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0NjQodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEZsb2F0NjQodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDhBcnJheSh2YWx1ZTogVWludDhBcnJheSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlVUxFQjEyOCh2YWx1ZS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgdGhpcy53cml0ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVN0cmluZyh2YWx1ZTogc3RyaW5nKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMud3JpdGVVaW50OEFycmF5KHRleHRFbmNvZGVyLmVuY29kZSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVKU09OKHZhbHVlOiBKc29uVHlwZSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsYWdzKGZsYWdzOiBGbGFncyk6IEJ5dGVXcml0ZXIge1xuICAgICAgICBmbGFncy53cml0ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmlzaCgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLCAwLCB0aGlzLm9mZnNldCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQnl0ZVJlYWRlciB7XG4gICAgcHJpdmF0ZSBkYXRhVmlldzogRGF0YVZpZXc7XG4gICAgcHJpdmF0ZSBvZmZzZXQ6IG51bWJlcjtcbiAgICBwcml2YXRlIGZpbmlzaGVkOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihkYXRhOiBEYXRhVmlldykge1xuICAgICAgICB0aGlzLmRhdGFWaWV3ID0gZGF0YTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVWludDhBcnJheShidWZmZXI6IFVpbnQ4QXJyYXkpOiBCeXRlUmVhZGVyIHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICB1aW50OEFycmF5LnNldChuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVSZWFkZXIoZGF0YVZpZXcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUFycmF5QnVmZmVyKGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBCeXRlUmVhZGVyIHtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGZyb21CbG9iKGJsb2I6IEJsb2IpOiBQcm9taXNlPEJ5dGVSZWFkZXI+IHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBibG9iLmFycmF5QnVmZmVyKCk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZChzaXplOiBudW1iZXIpOiBVaW50OEFycmF5IHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2l6ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2l6ZSBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0ICsgc2l6ZSA+IHRoaXMuZGF0YVZpZXcuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YVZpZXcuYnVmZmVyLCB0aGlzLm9mZnNldCwgc2l6ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IHNpemU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEJvb2xlYW4oKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50OCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQ4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRVaW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDE2KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDE2KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRVaW50MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQ2NCgpOiBiaWdpbnQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0QmlnSW50NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50NjQoKTogYmlnaW50IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEJpZ1VpbnQ2NCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVMRUIxMjgoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gVW5zaWduZWQgTEVCMTI4XG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICAgIGxldCBzaGlmdCA9IDA7XG4gICAgICAgIGxldCBieXRlOiBudW1iZXI7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCA+PSB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnl0ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgICAgIHZhbHVlIHw9IChieXRlICYgMGIwMTExMTExMSkgPDwgc2hpZnQ7XG4gICAgICAgICAgICBzaGlmdCArPSA3O1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICgoYnl0ZSAmIDBiMTAwMDAwMDApICE9PSAwKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRmxvYXQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYWRGbG9hdDE2KHRoaXMuZGF0YVZpZXcsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRmxvYXQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0RmxvYXQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0NjQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEZsb2F0NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50OEFycmF5KCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWQobGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFN0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBieXRlQXJyYXkgPSB0aGlzLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZUFycmF5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEpTT048VCBleHRlbmRzIEpzb25UeXBlPigpOiBUIHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5yZWFkU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRmxhZ3MobGVuZ3RoOiBudW1iZXIpOiBGbGFncyB7XG4gICAgICAgIHJldHVybiBGbGFncy5yZWFkKHRoaXMsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmlzaCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0ICE9PSB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSnNvblR5cGUsIHR5cGUgU2VyaWFsaXphYmxlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgUGFja2V0RGF0YSA9IHtcbiAgICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZGF0YTogVWludDhBcnJheTtcbn07XG5cbmV4cG9ydCB0eXBlIFBhY2tldDxUID0gdW5rbm93bj4gPSB7XG4gICAgcmVhZG9ubHkgdHlwZTogUGFja2V0VHlwZTxUPjtcbiAgICByZWFkb25seSBkYXRhOiBUO1xufTtcblxuZXhwb3J0IGNsYXNzIFBhY2tldFR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBuZXcoZGF0YTogVCk6IFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIG1hdGNoKHBhY2tldDogUGFja2V0KTogcGFja2V0IGlzIFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiBwYWNrZXQudHlwZSA9PT0gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oaWRlbnRpZmllcjogSWRlbnRpZmllciwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+O1xuICAgIH0pOiBQYWNrZXRUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWNrZXRUeXBlPFQ+KFxuICAgICAgICAgICAgaWRlbnRpZmllci5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyOiBJZGVudGlmaWVyLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICB9KTogUGFja2V0VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFja2V0VHlwZShcbiAgICAgICAgICAgIGlkZW50aWZpZXIuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFwcEpzb24gfSBmcm9tICcuLi8uLi9hcHAuanMnO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSAnLi4vLi4vYXBwLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUvc2VyaWFsaXplci5qcyc7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi9wYWNrZXQuanMnO1xuXG5jb25zdCBJREVOVElGSUVSID0gbmV3IElkZW50aWZpZXIoJ2NvcmUnLCAncGFja2V0Jyk7XG5cbnR5cGUgUHJvdG9jb2xJbmZvID0ge1xuICAgIHZlcnNpb246IHN0cmluZztcbn07XG5cbnR5cGUgUlNBTnVtYmVycyA9IHtcbiAgICBlOiBzdHJpbmc7XG4gICAgbjogc3RyaW5nO1xufTtcblxudHlwZSBFbmNyeXB0aW9uUmVxdWVzdCA9IHtcbiAgICBraW5kOiAndjEnO1xuICAgIHJzYTogUlNBTnVtYmVycztcbn07XG5cbnR5cGUgRW5jcnlwdGlvblJlc3BvbnNlID0ge1xuICAgIGtpbmQ6ICd2MSc7XG4gICAgcnNhOiBSU0FOdW1iZXJzO1xuICAgIGFlczogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2VydmVyTWV0YSA9IHtcbiAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgIGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXF1ZXN0IHwgbnVsbDtcbiAgICBoYXNoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59O1xuXG50eXBlIENvbm5lY3RQYWNrZXRKc29uID0ge1xuICAgIHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gICAgZW5jcnlwdGlvbjogRW5jcnlwdGlvblJlc3BvbnNlIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25uZWN0UGFja2V0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXBwOiBBcHA7XG4gICAgcHVibGljIHJlYWRvbmx5IHRva2VuOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7XG4gICAgICAgIHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgICAgIGFwcDogQXBwO1xuICAgICAgICB0b2tlbjogc3RyaW5nO1xuICAgICAgICBlbmNyeXB0aW9uPzogRW5jcnlwdGlvblJlc3BvbnNlIHwgbnVsbDtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMucHJvdG9jb2wgPSBvcHRpb25zLnByb3RvY29sO1xuICAgICAgICB0aGlzLmFwcCA9IG9wdGlvbnMuYXBwO1xuICAgICAgICB0aGlzLnRva2VuID0gb3B0aW9ucy50b2tlbjtcbiAgICAgICAgdGhpcy5lbmNyeXB0aW9uID0gb3B0aW9ucy5lbmNyeXB0aW9uID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBDb25uZWN0UGFja2V0SnNvbik6IENvbm5lY3RQYWNrZXQge1xuICAgICAgICByZXR1cm4gbmV3IENvbm5lY3RQYWNrZXQoe1xuICAgICAgICAgICAgcHJvdG9jb2w6IGRhdGEucHJvdG9jb2wsXG4gICAgICAgICAgICBhcHA6IEFwcC5kZXNlcmlhbGl6ZShkYXRhLmFwcCksXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBkYXRhLmVuY3J5cHRpb24sXG4gICAgICAgICAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogQ29ubmVjdFBhY2tldCk6IENvbm5lY3RQYWNrZXRKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByb3RvY29sOiBkYXRhLnByb3RvY29sLFxuICAgICAgICAgICAgYXBwOiBBcHAuc2VyaWFsaXplKGRhdGEuYXBwKSxcbiAgICAgICAgICAgIGVuY3J5cHRpb246IGRhdGEuZW5jcnlwdGlvbixcbiAgICAgICAgICAgIHRva2VuOiBkYXRhLnRva2VuLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gRGlzY29ubmVjdFR5cGUge1xuICAgIElOVkFMSURfVE9LRU4gPSAnaW52YWxpZF90b2tlbicsXG4gICAgSU5WQUxJRF9PUklHSU4gPSAnaW52YWxpZF9vcmlnaW4nLFxuICAgIElOVkFMSURfVkVSU0lPTiA9ICdpbnZhbGlkX3ZlcnNpb24nLFxuICAgIElOVkFMSURfUEFDS0VUX1RZUEUgPSAnaW52YWxpZF9wYWNrZXRfdHlwZScsXG4gICAgSU5WQUxJRF9QQUNLRVRfREFUQSA9ICdpbnZhbGlkX3BhY2tldF9kYXRhJyxcbiAgICBJTlZBTElEX1BBQ0tFVCA9ICdpbnZhbGlkX3BhY2tldCcsXG4gICAgSU5URVJOQUxfRVJST1IgPSAnaW50ZXJuYWxfZXJyb3InLFxuICAgIEFOT1RIRVJfQ09OTkVDVElPTiA9ICdhbm90aGVyX2Nvbm5lY3Rpb24nLFxuICAgIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb25fZGVuaWVkJyxcbiAgICBBUFBfUkVNT1ZFRCA9ICdhcHBfcmVtb3ZlZCcsXG4gICAgU0VSVkVSX1JFU1RBUlQgPSAnc2VydmVyX3Jlc3RhcnQnLFxuICAgIFNIVVRET1dOID0gJ3NodXRkb3duJyxcbiAgICBDTE9TRSA9ICdjbG9zZScsXG59XG5cbnR5cGUgRGlzY29ubmVjdFBhY2tldEpzb24gPSB7XG4gICAgdHlwZTogRGlzY29ubmVjdFR5cGU7XG4gICAgbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBEaXNjb25uZWN0UGFja2V0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRGlzY29ubmVjdFR5cGU7XG4gICAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7XG4gICAgICAgIHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgICAgICBtZXNzYWdlPzogc3RyaW5nIHwgbnVsbDtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogRGlzY29ubmVjdFBhY2tldCk6IERpc2Nvbm5lY3RQYWNrZXRKc29uIHtcbiAgICAgICAgcmV0dXJuIGRhdGEudG9Kc29uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBEaXNjb25uZWN0UGFja2V0SnNvbik6IERpc2Nvbm5lY3RQYWNrZXQge1xuICAgICAgICByZXR1cm4gRGlzY29ubmVjdFBhY2tldC5mcm9tSnNvbihkYXRhKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpzb24oZGF0YTogRGlzY29ubmVjdFBhY2tldEpzb24pOiBEaXNjb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBEaXNjb25uZWN0UGFja2V0KHtcbiAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdG9Kc29uKCk6IERpc2Nvbm5lY3RQYWNrZXRKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBQQUNLRVRfVFlQRVM6IHtcbiAgICBTRVJWRVJfTUVUQTogUGFja2V0VHlwZTxTZXJ2ZXJNZXRhPjtcbiAgICBDT05ORUNUOiBQYWNrZXRUeXBlPENvbm5lY3RQYWNrZXQ+O1xuICAgIERJU0NPTk5FQ1Q6IFBhY2tldFR5cGU8RGlzY29ubmVjdFBhY2tldD47XG4gICAgVE9LRU46IFBhY2tldFR5cGU8c3RyaW5nPjtcbiAgICBSRUFEWTogUGFja2V0VHlwZTx1bmRlZmluZWQ+O1xuICAgIEVOQ1JZUFRFRF9QQUNLRVQ6IFBhY2tldFR5cGU8VWludDhBcnJheT47XG59ID0ge1xuICAgIFNFUlZFUl9NRVRBOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248U2VydmVyTWV0YT4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnc2VydmVyX21ldGEnLFxuICAgIH0pLFxuICAgIENPTk5FQ1Q6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxDb25uZWN0UGFja2V0PihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdjb25uZWN0JyxcbiAgICAgICAgc2VyaWFsaXplcjogQ29ubmVjdFBhY2tldCxcbiAgICB9KSxcbiAgICBESVNDT05ORUNUOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248RGlzY29ubmVjdFBhY2tldD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnZGlzY29ubmVjdCcsXG4gICAgICAgIHNlcmlhbGl6ZXI6IERpc2Nvbm5lY3RQYWNrZXQsXG4gICAgfSksXG4gICAgVE9LRU46IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxzdHJpbmc+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3Rva2VuJyxcbiAgICB9KSxcbiAgICBSRUFEWTogUGFja2V0VHlwZS5jcmVhdGVKc29uPHVuZGVmaW5lZD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAncmVhZHknLFxuICAgIH0pLFxuICAgIEVOQ1JZUFRFRF9QQUNLRVQ6IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxVaW50OEFycmF5PihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdlJyxcbiAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wKCksXG4gICAgfSksXG59O1xuIiwKICAgICJpbXBvcnQgeyBEaXNjb25uZWN0VHlwZSB9IGZyb20gJy4vbmV0d29yay9wYWNrZXQvcGFja2V0LXR5cGVzLmpzJztcbmV4cG9ydCBjbGFzcyBPbXVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UgPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc2Nvbm5lY3RSZWFzb24gZXh0ZW5kcyBPbXVFcnJvciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyB0eXBlOiBEaXNjb25uZWN0VHlwZSxcbiAgICAgICAgcHVibGljIG1lc3NhZ2UgPSAnJyxcbiAgICApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2VydmVyUmVzdGFydCBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5TRVJWRVJfUkVTVEFSVCwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQW5vdGhlckNvbm5lY3Rpb24gZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuQU5PVEhFUl9DT05ORUNUSU9OLCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uRGVuaWVkIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLlBFUk1JU1NJT05fREVOSUVELCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBcHBSZW1vdmVkIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLkFQUF9SRU1PVkVELCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVG9rZW4gZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9UT0tFTiwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZE9yaWdpbiBleHRlbmRzIERpc2Nvbm5lY3RSZWFzb24ge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBzdXBlcihEaXNjb25uZWN0VHlwZS5JTlZBTElEX09SSUdJTiwgbWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFZlcnNpb24gZXh0ZW5kcyBEaXNjb25uZWN0UmVhc29uIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9WRVJTSU9OLCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUGFja2V0IGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLklOVkFMSURfUEFDS0VULCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEVycm9yIGV4dGVuZHMgRGlzY29ubmVjdFJlYXNvbiB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKERpc2Nvbm5lY3RUeXBlLklOVEVSTkFMX0VSUk9SLCBtZXNzYWdlKTtcbiAgICB9XG59XG4iLAogICAgIlxuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5cbmltcG9ydCB0eXBlIHsgQ29ubmVjdGlvbiwgVHJhbnNwb3J0IH0gZnJvbSAnLi9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2V0LCBQYWNrZXREYXRhIH0gZnJvbSAnLi9wYWNrZXQvcGFja2V0LmpzJztcblxuY29uc3QgRlJBTUVfVFlQRV9LRVkgPSAnb211YXBwcy1mcmFtZSc7XG5cbnR5cGUgQ29tbWFuZCA9ICh7XG4gICAgdHlwZTogJ3N5bic7XG4gICAgcGF5bG9hZDoge1xuICAgICAgICBvcmlnaW46IHN0cmluZztcbiAgICB9O1xufSB8IHtcbiAgICB0eXBlOiAnY29ubmVjdCc7XG4gICAgcGF5bG9hZDogb2JqZWN0O1xufSB8IHtcbiAgICB0eXBlOiAnZGlzY29ubmVjdCc7XG4gICAgcGF5bG9hZDogb2JqZWN0O1xufSB8IHtcbiAgICB0eXBlOiAnc2VuZCc7XG4gICAgcGF5bG9hZDogVWludDhBcnJheTtcbn0gfCB7XG4gICAgdHlwZTogJ3JlY2VpdmUnO1xuICAgIHBheWxvYWQ6IFVpbnQ4QXJyYXk7XG59IHwge1xuICAgIHR5cGU6ICdlcnJvcic7XG4gICAgcGF5bG9hZDogc3RyaW5nO1xufSkgJiB7XG4gICAgdHlwZV9rZXk/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgRnJhbWVUcmFuc3BvcnQgaW1wbGVtZW50cyBUcmFuc3BvcnQge1xuICAgIHB1YmxpYyBjb25uZWN0KCk6IFByb21pc2U8RnJhbWVDb25uZWN0aW9uPiB7XG4gICAgICAgIHJldHVybiBGcmFtZUNvbm5lY3Rpb24uY3JlYXRlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRnJhbWVDb25uZWN0aW9uIGltcGxlbWVudHMgQ29ubmVjdGlvbiB7XG4gICAgcHVibGljIGNvbm5lY3RlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIG9yaWdpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRRdWV1ZTogQXJyYXk8UGFja2V0RGF0YT4gPSBbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlbmRRdWV1ZTogQXJyYXk8Q29tbWFuZD4gPSBbXTtcbiAgICBwcml2YXRlIHJlY2VpdmVXYWl0ZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY29ubmVjdGVkV2FpdGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsLFxuICAgICkge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEgPT09IG51bGwgfHwgdHlwZW9mIGV2ZW50LmRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoJ3R5cGVfa2V5JyBpbiBldmVudC5kYXRhKSB8fCBldmVudC5kYXRhLnR5cGVfa2V5ICE9PSBGUkFNRV9UWVBFX0tFWSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBldmVudC5kYXRhIGFzIENvbW1hbmQ7XG4gICAgICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSAnc3luJykge1xuICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luID0gZXZlbnQub3JpZ2luO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gdGhpcy5vcmlnaW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKCk6IFByb21pc2U8RnJhbWVDb25uZWN0aW9uPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxGcmFtZUNvbm5lY3Rpb24+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IEZyYW1lQ29ubmVjdGlvbigoKTogdm9pZCA9PiByZXNvbHZlKGNvbm5lY3Rpb24pKTtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ucG9zdENvbW1hbmQoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb25uZWN0JyxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7fSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUNvbW1hbmQoY29tbWFuZDogQ29tbWFuZCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IHR5cGUsIHBheWxvYWQgfSA9IGNvbW1hbmQ7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3luJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9yaWdpbiA9IHBheWxvYWQub3JpZ2luO1xuICAgICAgICAgICAgICAgIHRoaXMucG9zdENvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3luJyxcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiB3aW5kb3cub3JpZ2luLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29ubmVjdCc6XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3RlZFdhaXRlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RlZFdhaXRlcigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RlZFdhaXRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGlzY29ubmVjdCc6XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlY2VpdmUnOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhY2tldFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiByZWFkZXIucmVhZFN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZWFkZXIuZmluaXNoKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVdhaXRlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHBheWxvYWQpO1xuICAgICAgICAgICAgY2FzZSAnc2VuZCc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcG9zdENvbW1hbmQoY29tbWFuZDogQ29tbWFuZCk6IHZvaWQge1xuICAgICAgICBjb21tYW5kLnR5cGVfa2V5ID0gRlJBTUVfVFlQRV9LRVk7XG4gICAgICAgIGlmICghdGhpcy5vcmlnaW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZFF1ZXVlLnB1c2goY29tbWFuZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBxdWV1ZWRDb21tYW5kIG9mIHRoaXMuc2VuZFF1ZXVlKSB7XG4gICAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHF1ZXVlZENvbW1hbmQsIHRoaXMub3JpZ2luKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbmRRdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKGNvbW1hbmQsIHRoaXMub3JpZ2luKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVjZWl2ZShzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UGFja2V0PHVua25vd24+LCBQYWNrZXREYXRhPik6IFByb21pc2U8UGFja2V0IHwgbnVsbD4ge1xuICAgICAgICBpZiAodGhpcy5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FscmVhZHkgcmVjZWl2aW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMucGFja2V0UXVldWUubGVuZ3RoID09PSAwICYmIHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlciA9ICgpOiB2b2lkID0+IHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5wYWNrZXRRdWV1ZS5zaGlmdCgpISk7XG4gICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlciA9IG51bGw7XG4gICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgfVxuXG4gICAgZ2V0IGNsb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbm5lY3RlZDtcbiAgICB9XG5cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RDb21tYW5kKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGlzY29ubmVjdCcsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDoge30sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIoKTtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZW5kKHBhY2tldDogUGFja2V0LCBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UGFja2V0PHVua25vd24+LCBQYWNrZXREYXRhPik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBjb25uZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXREYXRhID0gc2VyaWFsaXplci5zZXJpYWxpemUocGFja2V0KTtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldERhdGEudHlwZSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkocGFja2V0RGF0YS5kYXRhKTtcbiAgICAgICAgdGhpcy5wb3N0Q29tbWFuZCh7XG4gICAgICAgICAgICB0eXBlOiAnc2VuZCcsXG4gICAgICAgICAgICBwYXlsb2FkOiB3cml0ZXIuZmluaXNoKCksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgVW5saXN0ZW4gPSAoKSA9PiB2b2lkO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFAgZXh0ZW5kcyBBcnJheTxhbnk+PiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnM6IEFycmF5PCguLi5hcmdzOiBQKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4gPSBbXTtcblxuICAgIHB1YmxpYyBsaXN0ZW4obGlzdGVuZXI6ICguLi5hcmdzOiBQKSA9PiBhbnkpOiBVbmxpc3RlbiB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKHRoaXMubGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdCguLi5hcmdzOiBQKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgWy4uLnRoaXMubGlzdGVuZXJzXSkge1xuICAgICAgICAgICAgYXdhaXQgbGlzdGVuZXIoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLAogICAgImV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzAuOS40MCc7XG5leHBvcnQgY29uc3QgVkVSU0lPTl9NSU5PUiA9ICcwLjkuMCc7XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vc2VyaWFsaXplJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrZXQsIFBhY2tldERhdGEsIFBhY2tldFR5cGUgfSBmcm9tICcuL3BhY2tldCc7XG5cbmV4cG9ydCBjbGFzcyBQYWNrZXRNYXBwZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGU8UGFja2V0LCBQYWNrZXREYXRhPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRNYXAgPSBuZXcgSWRlbnRpZmllck1hcDxQYWNrZXRUeXBlPHVua25vd24+PigpO1xuXG4gICAgcHVibGljIHJlZ2lzdGVyKC4uLnBhY2tldFR5cGVzOiBQYWNrZXRUeXBlPHVua25vd24+W10pOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHBhY2tldFR5cGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWNrZXRNYXAuaGFzKHR5cGUuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYWNrZXQgaWQgJHt0eXBlLmlkLmtleSgpfSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGFja2V0TWFwLnNldCh0eXBlLmlkLCB0eXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlcmlhbGl6ZShwYWNrZXQ6IFBhY2tldCk6IFBhY2tldERhdGEge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogcGFja2V0LnR5cGUuaWQua2V5KCksXG4gICAgICAgICAgICBkYXRhOiBwYWNrZXQudHlwZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShwYWNrZXQuZGF0YSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZGVzZXJpYWxpemUoZGF0YTogUGFja2V0RGF0YSk6IFBhY2tldCB7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBJZGVudGlmaWVyLmZyb21LZXkoZGF0YS50eXBlKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMucGFja2V0TWFwLmdldChpZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKCF0eXBlKSB0aHJvdyBuZXcgRXJyb3IoYFBhY2tldCB0eXBlICR7ZGF0YS50eXBlfSBub3QgcmVnaXN0ZXJlZGApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGRhdGE6IHR5cGUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkYXRhLmRhdGEpLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BvcnQge1xuICAgIGNvbm5lY3QoKTogUHJvbWlzZTxDb25uZWN0aW9uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uIHtcbiAgICBzZW5kKHBhY2tldDogUGFja2V0LCBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UGFja2V0LCBQYWNrZXREYXRhPik6IHZvaWQ7XG4gICAgcmVjZWl2ZShzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UGFja2V0LCBQYWNrZXREYXRhPik6IFByb21pc2U8UGFja2V0IHwgbnVsbD47XG4gICAgY2xvc2UoKTogdm9pZDtcbiAgICBjbG9zZWQ6IGJvb2xlYW47XG59XG4iLAogICAgImltcG9ydCB7IHRleHREZWNvZGVyLCB0ZXh0RW5jb2RlciB9IGZyb20gJy4uL2NvbnN0JztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgUGFja2V0LCBQYWNrZXREYXRhIH0gZnJvbSAnLi9wYWNrZXQnO1xuaW1wb3J0IHsgUEFDS0VUX1RZUEVTIH0gZnJvbSAnLi9wYWNrZXQvcGFja2V0LXR5cGVzJztcblxuZnVuY3Rpb24gYmFzZTY0VXJsRW5jb2RlKGJ1ZmZlcjogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJ1ZmZlclxuICAgICAgICAudG9CYXNlNjQoKVxuICAgICAgICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnXycpXG4gICAgICAgIC5yZXBsYWNlKC89L2csICcnKTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0VXJsRGVjb2RlKGRhdGE6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XG4gICAgd2hpbGUgKGRhdGEubGVuZ3RoICUgNCkge1xuICAgICAgICBkYXRhICs9ICc9JztcbiAgICB9XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbUJhc2U2NChkYXRhKTtcbn1cblxuZnVuY3Rpb24gY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKHU4OiBVaW50OEFycmF5KTogQXJyYXlCdWZmZXIge1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcih1OC5sZW5ndGgpO1xuICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgIHZpZXcuc2V0KHU4KTtcbiAgICByZXR1cm4gYnVmO1xufVxuXG50eXBlIFJTQU51bWJlcnMgPSB7XG4gICAgZTogc3RyaW5nO1xuICAgIG46IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEVuY3J5cHRpb25SZXNwb25zZSA9IHtcbiAgICBraW5kOiAndjEnO1xuICAgIHJzYTogUlNBTnVtYmVycztcbiAgICBhZXM6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBFTkNSWVBUSU9OX0FWQUlMQUJMRTogYm9vbGVhbiA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmICEhY3J5cHRvLnN1YnRsZTtcblxuZXhwb3J0IGNsYXNzIERlY3J5cHRvciB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwcml2YXRlS2V5OiBDcnlwdG9LZXksXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHVibGljS2V5OiBDcnlwdG9LZXksXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBuZXcoKTogUHJvbWlzZTxEZWNyeXB0b3I+IHtcbiAgICAgICAgY29uc3QgeyBwcml2YXRlS2V5LCBwdWJsaWNLZXkgfSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgICAgICBtb2R1bHVzTGVuZ3RoOiA0MDk2LFxuICAgICAgICAgICAgICAgIHB1YmxpY0V4cG9uZW50OiBuZXcgVWludDhBcnJheShbMSwgMCwgMV0pLFxuICAgICAgICAgICAgICAgIGhhc2g6ICdTSEEtMjU2JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gbmV3IERlY3J5cHRvcihwcml2YXRlS2V5LCBwdWJsaWNLZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB0b1JlcXVlc3QoKTogUHJvbWlzZTxSU0FOdW1iZXJzPiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdqd2snLCB0aGlzLnB1YmxpY0tleSk7XG4gICAgICAgIGlmICgha2V5LmUpIHRocm93IG5ldyBFcnJvcignS2V5IGV4cG9ydCBmYWlsZWQ6IG1pc3NpbmcgZXhwb25lbnQnKTtcbiAgICAgICAgaWYgKCFrZXkubikgdGhyb3cgbmV3IEVycm9yKCdLZXkgZXhwb3J0IGZhaWxlZDogbWlzc2luZyBtb2R1bHVzJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlOiBrZXkuZSxcbiAgICAgICAgICAgIG46IGtleS5uLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWNyeXB0KGRhdGE6IEFycmF5QnVmZmVyKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xuICAgICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAgICB7IG5hbWU6ICdSU0EtT0FFUCcgfSxcbiAgICAgICAgICAgIHRoaXMucHJpdmF0ZUtleSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBkZWNyeXB0ZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlY3J5cHRTdHJpbmcoZGF0YTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICAgICAgeyBuYW1lOiAnUlNBLU9BRVAnIH0sXG4gICAgICAgICAgICB0aGlzLnByaXZhdGVLZXksXG4gICAgICAgICAgICBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIoYmFzZTY0VXJsRGVjb2RlKGRhdGEpKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRleHREZWNvZGVyLmRlY29kZShkZWNyeXB0ZWQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuY3J5cHRvciB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwdWJsaWNLZXk6IENyeXB0b0tleSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIG5ldyhyZXF1ZXN0OiBSU0FOdW1iZXJzKTogUHJvbWlzZTxFbmNyeXB0b3I+IHtcbiAgICAgICAgY29uc3QgcHVibGljS2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICAgICAgICAnandrJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGc6ICdSU0EtT0FFUC0yNTYnLFxuICAgICAgICAgICAgICAgIGV4dDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBrZXlfb3BzOiBbJ2VuY3J5cHQnXSxcbiAgICAgICAgICAgICAgICBrdHk6ICdSU0EnLFxuICAgICAgICAgICAgICAgIGU6IHJlcXVlc3QuZS5yZXBsYWNlKC89KyQvLCAnJyksXG4gICAgICAgICAgICAgICAgbjogcmVxdWVzdC5uLnJlcGxhY2UoLz0rJC8sICcnKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgICAgICBoYXNoOiAnU0hBLTI1NicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIFsnZW5jcnlwdCddLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IEVuY3J5cHRvcihwdWJsaWNLZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbmNyeXB0KGRhdGE6IEFycmF5QnVmZmVyKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSU0EtT0FFUCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5wdWJsaWNLZXksXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbmNyeXB0U3RyaW5nKGRhdGE6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUlNBLU9BRVAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMucHVibGljS2V5LFxuICAgICAgICAgICAgdGV4dEVuY29kZXIuZW5jb2RlKGRhdGEpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZCkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFFUyB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBrZXk6IENyeXB0b0tleSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpdjogQXJyYXlCdWZmZXIsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBuZXcoKTogUHJvbWlzZTxBRVM+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxMjgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIFsnZW5jcnlwdCcsICdkZWNyeXB0J10sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGl2ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpO1xuICAgICAgICByZXR1cm4gbmV3IEFFUyhrZXksIGl2LmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBkZXNlcmlhbGl6ZShhZXM6IHN0cmluZywgZGVjcnlwdG9yOiBEZWNyeXB0b3IpOiBQcm9taXNlPEFFUz4ge1xuICAgICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNyeXB0b3IuZGVjcnlwdChjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIoYmFzZTY0VXJsRGVjb2RlKGFlcykpKTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tQXJyYXlCdWZmZXIoZGVjcnlwdGVkKTtcbiAgICAgICAgY29uc3Qga2V5ID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIGNvbnN0IGl2ID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG5cbiAgICAgICAgY29uc3Qga2V5X2VuY29kZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAgICAgICAgICdyYXcnLFxuICAgICAgICAgICAgY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKGtleSksXG4gICAgICAgICAgICAnQUVTLUNCQycsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFsnZW5jcnlwdCcsICdkZWNyeXB0J10sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgQUVTKFxuICAgICAgICAgICAga2V5X2VuY29kZWQsXG4gICAgICAgICAgICBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIoaXYpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXJpYWxpemUoZW5jcnlwdG9yOiBFbmNyeXB0b3IpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICBjb25zdCByYXdLZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmV4cG9ydEtleSgncmF3JywgdGhpcy5rZXkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KG5ldyBVaW50OEFycmF5KHJhd0tleSkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KG5ldyBVaW50OEFycmF5KHRoaXMuaXYpKTtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgZW5jcnlwdG9yLmVuY3J5cHQoY29udmVydFVpbnQ4QXJyYXlUb0FycmF5QnVmZmVyKHdyaXRlci5maW5pc2goKSkpO1xuICAgICAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbmNyeXB0KGRhdGE6IFBhY2tldERhdGEpOiBQcm9taXNlPFBhY2tldD4ge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoZGF0YS50eXBlKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShkYXRhLmRhdGEpO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DQkMnLFxuICAgICAgICAgICAgICAgIGl2OiB0aGlzLml2LFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMTYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5rZXksXG4gICAgICAgICAgICBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIod3JpdGVyLmZpbmlzaCgpKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFBBQ0tFVF9UWVBFUy5FTkNSWVBURURfUEFDS0VULm5ldyhuZXcgVWludDhBcnJheShlbmNyeXB0ZWQpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVjcnlwdChwYWNrZXQ6IFBhY2tldDxVaW50OEFycmF5Pik6IFByb21pc2U8UGFja2V0RGF0YT4ge1xuICAgICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DQkMnLFxuICAgICAgICAgICAgICAgIGl2OiB0aGlzLml2LFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMTYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5rZXksXG4gICAgICAgICAgICBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIocGFja2V0LmRhdGEpLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21BcnJheUJ1ZmZlcihkZWNyeXB0ZWQpO1xuICAgICAgICBjb25zdCB0eXBlID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFkZHJlc3MgfSBmcm9tICcuLi9hZGRyZXNzLmpzJztcbmltcG9ydCB7XG4gICAgQW5vdGhlckNvbm5lY3Rpb24sIEFwcFJlbW92ZWQsIERpc2Nvbm5lY3RSZWFzb24sIEludGVybmFsRXJyb3IsXG4gICAgSW52YWxpZE9yaWdpbixcbiAgICBJbnZhbGlkUGFja2V0LFxuICAgIEludmFsaWRUb2tlbixcbiAgICBJbnZhbGlkVmVyc2lvbixcbiAgICBQZXJtaXNzaW9uRGVuaWVkLFxuICAgIFNlcnZlclJlc3RhcnQsXG59IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi9vbXUuanMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlblByb3ZpZGVyIH0gZnJvbSAnLi4vdG9rZW4uanMnO1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuXG5pbXBvcnQgdHlwZSB7IENvbm5lY3Rpb24sIFRyYW5zcG9ydCB9IGZyb20gJy4vY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBQYWNrZXRNYXBwZXIgfSBmcm9tICcuL2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHsgQUVTLCBEZWNyeXB0b3IsIEVOQ1JZUFRJT05fQVZBSUxBQkxFLCBFbmNyeXB0aW9uUmVzcG9uc2UsIEVuY3J5cHRvciB9IGZyb20gJy4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBDb25uZWN0UGFja2V0LCBEaXNjb25uZWN0VHlwZSwgUEFDS0VUX1RZUEVTIH0gZnJvbSAnLi9wYWNrZXQvcGFja2V0LXR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2V0LCBQYWNrZXRUeXBlIH0gZnJvbSAnLi9wYWNrZXQvcGFja2V0LmpzJztcblxudHlwZSBQYWNrZXRIYW5kbGVyPFQ+ID0ge1xuICAgIHJlYWRvbmx5IHR5cGU6IFBhY2tldFR5cGU8VD47XG4gICAgZXZlbnQ6IEV2ZW50RW1pdHRlcjxbVF0+O1xufTtcblxudHlwZSBTdGF0dXNUeXBlPFQ+ID0ge1xuICAgIHR5cGU6IFQ7XG59O1xuXG5leHBvcnQgdHlwZSBOZXR3b3JrU3RhdHVzID0gU3RhdHVzVHlwZTwnY29ubmVjdGluZyc+IHwgU3RhdHVzVHlwZTwnY29ubmVjdGVkJz4gfCBTdGF0dXNUeXBlPCdyZWFkeSc+IHwge1xuICAgIHR5cGU6ICdkaXNjb25uZWN0ZWQnO1xuICAgIGF0dGVtcHQ/OiBudW1iZXI7XG4gICAgcmVhc29uPzogRGlzY29ubmVjdFJlYXNvbjtcbn0gfCB7XG4gICAgdHlwZTogJ3JlY29ubmVjdGluZyc7XG4gICAgYXR0ZW1wdDogbnVtYmVyO1xuICAgIHRpbWVvdXQ6IG51bWJlcjtcbiAgICBkYXRlOiBEYXRlO1xuICAgIGNhbmNlbDogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBjbGFzcyBOZXR3b3JrIHtcbiAgICBwdWJsaWMgc3RhdHVzOiBOZXR3b3JrU3RhdHVzID0geyB0eXBlOiAnZGlzY29ubmVjdGVkJyB9O1xuICAgIHB1YmxpYyByZWFkb25seSBldmVudDogeyBjb25uZWN0ZWQ6IEV2ZW50RW1pdHRlcjxbXT47IGRpc2Nvbm5lY3RlZDogRXZlbnRFbWl0dGVyPFtEaXNjb25uZWN0UmVhc29uIHwgdW5kZWZpbmVkXT47IHBhY2tldDogRXZlbnRFbWl0dGVyPFtQYWNrZXQ8dW5rbm93bj5dPjsgc3RhdHVzOiBFdmVudEVtaXR0ZXI8W05ldHdvcmtTdGF0dXNdPiB9ID0ge1xuICAgICAgICBjb25uZWN0ZWQ6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICAgICAgZGlzY29ubmVjdGVkOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICAgIHBhY2tldDogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgICBzdGF0dXM6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICB9O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFza3M6IEFycmF5PCgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkPiA9IFtdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0TWFwcGVyID0gbmV3IFBhY2tldE1hcHBlcigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0SGFuZGxlcnMgPSBuZXcgSWRlbnRpZmllck1hcDxQYWNrZXRIYW5kbGVyPHVua25vd24+PigpO1xuICAgIHByaXZhdGUgbGlzdGVuVGFzazogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBwdWJsaWMgcmVhc29uOiBEaXNjb25uZWN0UmVhc29uIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgYXR0ZW1wdCA9IDA7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSxcbiAgICAgICAgcHVibGljIGFkZHJlc3M6IEFkZHJlc3MsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdG9rZW5Qcm92aWRlcjogVG9rZW5Qcm92aWRlcixcbiAgICAgICAgcHJpdmF0ZSB0cmFuc3BvcnQ6IFRyYW5zcG9ydCxcbiAgICAgICAgcHJpdmF0ZSBjb25uZWN0aW9uPzogQ29ubmVjdGlvbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgcHJpdmF0ZSBhZXM/OiBBRVMgfCB1bmRlZmluZWQsXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBQQUNLRVRfVFlQRVMuU0VSVkVSX01FVEEsXG4gICAgICAgICAgICBQQUNLRVRfVFlQRVMuQ09OTkVDVCxcbiAgICAgICAgICAgIFBBQ0tFVF9UWVBFUy5ESVNDT05ORUNULFxuICAgICAgICAgICAgUEFDS0VUX1RZUEVTLlRPS0VOLFxuICAgICAgICAgICAgUEFDS0VUX1RZUEVTLlJFQURZLFxuICAgICAgICAgICAgUEFDS0VUX1RZUEVTLkVOQ1JZUFRFRF9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWRkUGFja2V0SGFuZGxlcihQQUNLRVRfVFlQRVMuRElTQ09OTkVDVCwgYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKHJlYXNvbi50eXBlID09PSBEaXNjb25uZWN0VHlwZS5TSFVURE9XTlxuICAgICAgICAgICAgICAgIHx8IHJlYXNvbi50eXBlID09PSBEaXNjb25uZWN0VHlwZS5DTE9TRSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzKHsgdHlwZTogJ2Rpc2Nvbm5lY3RlZCcgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgRVJST1JfTUFQID0ge1xuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5BTk9USEVSX0NPTk5FQ1RJT05dOiBBbm90aGVyQ29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuUEVSTUlTU0lPTl9ERU5JRURdOiBQZXJtaXNzaW9uRGVuaWVkLFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5BUFBfUkVNT1ZFRF06IEFwcFJlbW92ZWQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVkFMSURfVE9LRU5dOiBJbnZhbGlkVG9rZW4sXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVkFMSURfT1JJR0lOXTogSW52YWxpZE9yaWdpbixcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9WRVJTSU9OXTogSW52YWxpZFZlcnNpb24sXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLklOVEVSTkFMX0VSUk9SXTogSW50ZXJuYWxFcnJvcixcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9QQUNLRVRdOiBJbnZhbGlkUGFja2V0LFxuICAgICAgICAgICAgICAgIFtEaXNjb25uZWN0VHlwZS5JTlZBTElEX1BBQ0tFVF9UWVBFXTogSW52YWxpZFBhY2tldCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuSU5WQUxJRF9QQUNLRVRfREFUQV06IEludmFsaWRQYWNrZXQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLlNFUlZFUl9SRVNUQVJUXTogU2VydmVyUmVzdGFydCxcbiAgICAgICAgICAgICAgICBbRGlzY29ubmVjdFR5cGUuQ0xPU0VdOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgW0Rpc2Nvbm5lY3RUeXBlLlNIVVRET1dOXTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gRVJST1JfTUFQW3JlYXNvbi50eXBlXTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhc29uID0gbmV3IGVycm9yKHJlYXNvbi5tZXNzYWdlID8/ICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWRkUGFja2V0SGFuZGxlcihQQUNLRVRfVFlQRVMuUkVBRFksICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cy50eXBlID09PSAncmVhZHknKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBSRUFEWSBwYWNrZXQgd2hlbiBhbHJlYWR5IHJlYWR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFN0YXR1cyh7IHR5cGU6ICdyZWFkeScgfSk7XG4gICAgICAgICAgICB0aGlzLmF0dGVtcHQgPSAwO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29ubmVjdGlvbihjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cy50eXBlICE9PSAnZGlzY29ubmVjdGVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2hhbmdlIGNvbm5lY3Rpb24gd2hpbGUgY29ubmVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJQYWNrZXQoLi4ucGFja2V0VHlwZXM6IFBhY2tldFR5cGU8dW5rbm93bj5bXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhY2tldE1hcHBlci5yZWdpc3RlciguLi5wYWNrZXRUeXBlcyk7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBwYWNrZXRUeXBlcykge1xuICAgICAgICAgICAgdGhpcy5wYWNrZXRIYW5kbGVycy5zZXQodHlwZS5pZCwge1xuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFBhY2tldEhhbmRsZXI8VD4odHlwZTogUGFja2V0VHlwZTxUPiwgaGFuZGxlcjogKHBhY2tldDogVCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLnBhY2tldEhhbmRsZXJzLmdldCh0eXBlLmlkKSBhcyBQYWNrZXRIYW5kbGVyPHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIWxpc3RlbmVycykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYWNrZXQgdHlwZSAke3R5cGUuaWQua2V5KCl9IG5vdCByZWdpc3RlcmVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdGVuZXJzLmV2ZW50Lmxpc3RlbihoYW5kbGVyIGFzIChwYWNrZXQ6IHVua25vd24pID0+IHZvaWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2NoZWR1bGVSZWNvbm5lY3QoYXR0ZW1wdDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBNYXRoLm1pbigzMDAwMCwgMjAwMCAqIChNYXRoLnBvdygxLjUsIGF0dGVtcHQpIC0gMSkgKyAyMDAwKTtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc3RhdHVzOiBFeHRyYWN0PE5ldHdvcmtTdGF0dXMsIHsgdHlwZTogJ3JlY29ubmVjdGluZycgfT4gPSB7XG4gICAgICAgICAgICB0eXBlOiAncmVjb25uZWN0aW5nJyxcbiAgICAgICAgICAgIGF0dGVtcHQsXG4gICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGNhbmNlbDogKCkgPT4ge2NhbmNlbGxlZCA9IHRydWU7fSxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRTdGF0dXMoc3RhdHVzKTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHN0YXR1cy50aW1lb3V0IC0gKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gZGF0ZS5nZXRUaW1lKCkpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCByZW1haW5pbmcpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QocmVjb25uZWN0ID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdGF0ZSgnZGlzY29ubmVjdGVkJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbm5lY3Qgd2hpbGUgJHt0aGlzLnN0YXR1cy50eXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpc3RlblRhc2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbm5lY3Qgd2hpbGUgYWxyZWFkeSBjb25uZWN0aW5nJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF0dGVtcHQgPSAwO1xuICAgICAgICB3aGlsZSAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhpcy5hdHRlbXB0Kys7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LmNvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldFN0YXR1cyh7IHR5cGU6ICdjb25uZWN0aW5nJyB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhUmVjZWl2ZWQgPSBhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucmVjZWl2ZSh0aGlzLnBhY2tldE1hcHBlcik7XG4gICAgICAgICAgICAgICAgaWYgKCFtZXRhUmVjZWl2ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgcmVjZWl2aW5nIHNlcnZlciBtZXRhJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghUEFDS0VUX1RZUEVTLlNFUlZFUl9NRVRBLm1hdGNoKG1ldGFSZWNlaXZlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBwYWNrZXQgcmVjZWl2ZWQgd2FzIG5vdCBzZXJ2ZXIgbWV0YScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IG1ldGEgfSA9IG1ldGFSZWNlaXZlZDtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3MuaGFzaCA9IG1ldGEuaGFzaDtcbiAgICAgICAgICAgICAgICBsZXQgdG9rZW4gPSBhd2FpdCB0aGlzLnRva2VuUHJvdmlkZXIuZ2V0KHRoaXMuYWRkcmVzcywgdGhpcy5vbXUuYXBwKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW4oYE5vIHRva2VuIGF2YWlsYWJsZSBmb3IgYXBwICR7dGhpcy5vbXUuYXBwLmlkLmtleSgpfSBhdCAke3RoaXMuYWRkcmVzcy5ob3N0fToke3RoaXMuYWRkcmVzcy5wb3J0fToke3RoaXMuYWRkcmVzcy5oYXNofWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZW5jcnlwdGlvblJlc3A6IEVuY3J5cHRpb25SZXNwb25zZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbXUuYXBwLnR5cGUgPT09ICdyZW1vdGUnICYmIEVOQ1JZUFRJT05fQVZBSUxBQkxFICYmIG1ldGEuZW5jcnlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNyeXB0b3IgPSBhd2FpdCBEZWNyeXB0b3IubmV3KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY3J5cHRvciA9IGF3YWl0IEVuY3J5cHRvci5uZXcobWV0YS5lbmNyeXB0aW9uLnJzYSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBhd2FpdCBlbmNyeXB0b3IuZW5jcnlwdFN0cmluZyh0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZXMgPSBhd2FpdCBBRVMubmV3KCk7XG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25SZXNwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ3YxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJzYTogYXdhaXQgZGVjcnlwdG9yLnRvUmVxdWVzdCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWVzOiBhd2FpdCB0aGlzLmFlcy5zZXJpYWxpemUoZW5jcnlwdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnNlbmQoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBQQUNLRVRfVFlQRVMuQ09OTkVDVCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogbmV3IENvbm5lY3RQYWNrZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiB0aGlzLm9tdS5hcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbDogeyB2ZXJzaW9uOiBWRVJTSU9OIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uOiBlbmNyeXB0aW9uUmVzcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LCB0aGlzLnBhY2tldE1hcHBlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5UYXNrID0gdGhpcy5saXN0ZW4oKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldFN0YXR1cyh7IHR5cGU6ICdjb25uZWN0ZWQnIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXZlbnQuY29ubmVjdGVkLmVtaXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoVGFza3MoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFBBQ0tFVF9UWVBFUy5SRUFEWSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubGlzdGVuVGFzaztcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRGlzY29ubmVjdFJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYXNvbiA9IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlY29ubmVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnQuZGlzY29ubmVjdGVkLmVtaXQodGhpcy5yZWFzb24pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cy50eXBlICE9PSAnZGlzY29ubmVjdGVkJyAmJiB0aGlzLnN0YXR1cy50eXBlICE9PSAncmVjb25uZWN0aW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXR1cyh7IHR5cGU6ICdkaXNjb25uZWN0ZWQnLCBhdHRlbXB0OiB0aGlzLmF0dGVtcHQsIHJlYXNvbjogdGhpcy5yZWFzb24gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbj8uY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5UYXNrID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucmVhc29uICYmICFbXG4gICAgICAgICAgICAgICAgRGlzY29ubmVjdFR5cGUuU0hVVERPV04sXG4gICAgICAgICAgICAgICAgRGlzY29ubmVjdFR5cGUuU0VSVkVSX1JFU1RBUlQsXG4gICAgICAgICAgICBdLmluY2x1ZGVzKHRoaXMucmVhc29uLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghcmVjb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaG91bGRSZWNvbm5lY3QgPSBhd2FpdCB0aGlzLnNjaGVkdWxlUmVjb25uZWN0KHRoaXMuYXR0ZW1wdCk7XG4gICAgICAgICAgICBpZiAoIXNob3VsZFJlY29ubmVjdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0U3RhdHVzKHsgdHlwZTogJ2Rpc2Nvbm5lY3RlZCcsIHJlYXNvbjogdGhpcy5yZWFzb24gfSk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbj8uY2xvc2UoKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNTdGF0ZShzdGF0ZTogTmV0d29ya1N0YXR1c1sndHlwZSddKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXR1cy50eXBlID09PSBzdGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZChwYWNrZXQ6IFBhY2tldCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjb25uZWN0aW9uIGVzdGFibGlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWVzKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gdGhpcy5wYWNrZXRNYXBwZXIuc2VyaWFsaXplKHBhY2tldCk7XG4gICAgICAgICAgICBwYWNrZXQgPSBhd2FpdCB0aGlzLmFlcy5lbmNyeXB0KHNlcmlhbGl6ZWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5zZW5kKHBhY2tldCwgdGhpcy5wYWNrZXRNYXBwZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbGlzdGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB3aGlsZSAodGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBwYWNrZXQgPSBhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucmVjZWl2ZSh0aGlzLnBhY2tldE1hcHBlcik7XG4gICAgICAgICAgICBpZiAoIXBhY2tldCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaFBhY2tldChwYWNrZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFBhY2tldChwYWNrZXQ6IFBhY2tldCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoUEFDS0VUX1RZUEVTLkVOQ1JZUFRFRF9QQUNLRVQubWF0Y2gocGFja2V0KSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFlcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2ZWQgZW5jcnlwdGVkIHBhY2tldCBiZWZvcmUgZW5jcnlwdGlvbiB3YXMgZXN0YWJsaXNoZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHRoaXMuYWVzLmRlY3J5cHQocGFja2V0KTtcbiAgICAgICAgICAgIHBhY2tldCA9IHRoaXMucGFja2V0TWFwcGVyLmRlc2VyaWFsaXplKGRlY3J5cHRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5ldmVudC5wYWNrZXQuZW1pdChwYWNrZXQpO1xuICAgICAgICBjb25zdCBwYWNrZXRIYW5kbGVyID0gdGhpcy5wYWNrZXRIYW5kbGVycy5nZXQocGFja2V0LnR5cGUuaWQpO1xuICAgICAgICBpZiAoIXBhY2tldEhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBwYWNrZXRIYW5kbGVyLmV2ZW50LmVtaXQocGFja2V0LmRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRUYXNrKHRhc2s6ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgdGFzayBhZnRlciBjbGllbnQgaXMgcmVhZHknKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhc2tzLnB1c2godGFzayk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZVRhc2sodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrcy5zcGxpY2UodGhpcy50YXNrcy5pbmRleE9mKHRhc2spLCAxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoVGFza3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgdGFzayBvZiB0aGlzLnRhc2tzKSB7XG4gICAgICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNldFN0YXR1cyhzdGF0dXM6IE5ldHdvcmtTdGF0dXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSBzdGF0dXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCBzdGF0dXMgdG8gJHtzdGF0dXN9IHdoZW4gYWxyZWFkeSAke3N0YXR1c31gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgYXdhaXQgdGhpcy5ldmVudC5zdGF0dXMuZW1pdChzdGF0dXMpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBZGRyZXNzIH0gZnJvbSAnLi4vYWRkcmVzcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vc2VyaWFsaXplJztcblxuaW1wb3J0IHR5cGUgeyBDb25uZWN0aW9uLCBUcmFuc3BvcnQgfSBmcm9tICcuL2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrZXQsIFBhY2tldERhdGEgfSBmcm9tICcuL3BhY2tldC9wYWNrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2Vic29ja2V0VHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhZGRyZXNzOiBBZGRyZXNzLFxuICAgICkgeyB9XG5cbiAgICBwcml2YXRlIGdldCB3c0VuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5hZGRyZXNzLnNlY3VyZSA/ICd3c3MnIDogJ3dzJztcbiAgICAgICAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSB0aGlzLmFkZHJlc3M7XG4gICAgICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke2hvc3R9OiR7cG9ydH0vd3NgO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25uZWN0KCk6IFByb21pc2U8Q29ubmVjdGlvbj4ge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMud3NFbmRwb2ludCk7XG4gICAgICAgIHJldHVybiBXZWJzb2NrZXRDb25uZWN0aW9uLmZyb21Tb2NrZXQoc29ja2V0KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXZWJzb2NrZXRDb25uZWN0aW9uIGltcGxlbWVudHMgQ29ubmVjdGlvbiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRRdWV1ZTogQXJyYXk8UGFja2V0RGF0YT4gPSBbXTtcbiAgICBwcml2YXRlIHJlY2VpdmVXYWl0ZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVhZGluZ1Byb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGJlaW5nQ2xvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBzb2NrZXQ6IFdlYlNvY2tldCxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tU29ja2V0KHNvY2tldDogV2ViU29ja2V0KTogUHJvbWlzZTxXZWJzb2NrZXRDb25uZWN0aW9uPiB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgV2Vic29ja2V0Q29ubmVjdGlvbihzb2NrZXQpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc29ja2V0Lm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgICAgICBzb2NrZXQub25jbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmJlaW5nQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVjZWl2ZVdhaXRlcigpO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlY2VpdmVXYWl0ZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gKGV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWFkaW5nUHJvbWlzZSA9IGNvbm5lY3Rpb24ub25NZXNzYWdlKGV2ZW50KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWFkaW5nUHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc29ja2V0Lm9ub3BlbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvbk1lc3NhZ2UoZXZlbnQ6IE1lc3NhZ2VFdmVudDxzdHJpbmcgfCBCbG9iPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2VpdmVkIHN0cmluZyBkYXRhJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVhZGVyID0gYXdhaXQgQnl0ZVJlYWRlci5mcm9tQmxvYihldmVudC5kYXRhKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIHR5cGU6IHJlYWRlci5yZWFkU3RyaW5nKCksXG4gICAgICAgICAgICBkYXRhOiByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wYWNrZXRRdWV1ZS5wdXNoKGRhdGEpO1xuICAgICAgICByZWFkZXIuZmluaXNoKCk7XG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVXYWl0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlY2VpdmUoc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFBhY2tldDx1bmtub3duPiwgUGFja2V0RGF0YT4pOiBQcm9taXNlPFBhY2tldCB8IG51bGw+IHtcbiAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVdhaXRlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbHJlYWR5IHJlY2VpdmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0aGlzLnBhY2tldFF1ZXVlLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5iZWluZ0Nsb3NlZCkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIgPSByZXNvbHZlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhY2tldFF1ZXVlLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmJlaW5nQ2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXREYXRhID0gdGhpcy5wYWNrZXRRdWV1ZS5zaGlmdCgpITtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocGFja2V0RGF0YSk7XG4gICAgfVxuXG4gICAgZ2V0IGNsb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZGluZ1Byb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYWNrZXRRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVdhaXRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuQ0xPU0VEICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5DTE9TSU5HKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWNlaXZlV2FpdGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVXYWl0ZXIoKTtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVdhaXRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZW5kKHBhY2tldDogUGFja2V0LCBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8UGFja2V0PHVua25vd24+LCBQYWNrZXREYXRhPik6IHZvaWQge1xuICAgICAgICBjb25zdCBwYWNrZXREYXRhID0gc2VyaWFsaXplci5zZXJpYWxpemUocGFja2V0KTtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldERhdGEudHlwZSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkocGFja2V0RGF0YS5kYXRhKTtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZCh3cml0ZXIuZmluaXNoKCkpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vb211LmpzJztcbmltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi9leHRlbnNpb24uanMnO1xuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uUmVnaXN0cnkge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXh0ZW5zaW9uTWFwOiBNYXA8c3RyaW5nLCBFeHRlbnNpb24+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge31cblxuICAgIHJlZ2lzdGVyPFQgZXh0ZW5kcyBFeHRlbnNpb24+KHR5cGU6IEV4dGVuc2lvblR5cGU8VD4pOiBUIHtcbiAgICAgICAgaWYgKHRoaXMuZXh0ZW5zaW9uTWFwLmhhcyh0eXBlLm5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVuc2lvbiB0eXBlICR7dHlwZS5uYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSB0eXBlLmNyZWF0ZSh0aGlzLm9tdSk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uTWFwLnNldCh0eXBlLm5hbWUsIGV4dGVuc2lvbik7XG4gICAgICAgIHJldHVybiBleHRlbnNpb247XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi9vbXUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuc2lvbiB7XG4gICAgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvblR5cGU8VCBleHRlbmRzIEV4dGVuc2lvbiA9IEV4dGVuc2lvbj4gZXh0ZW5kcyBJZGVudGlmaWVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZTogKG9tdTogT211KSA9PiBULFxuICAgICkge1xuICAgICAgICBzdXBlcignZXh0JywgbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGtleSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIoJ2V4dCcsIHRoaXMubmFtZSkua2V5KCk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEpzb25UeXBlLCB0eXBlIFNlcmlhbGl6YWJsZSwgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludFR5cGU8UmVxID0gdW5rbm93biwgUmVzID0gdW5rbm93bj4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFJlcSwgVWludDhBcnJheT4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxSZXMsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbklkPzogSWRlbnRpZmllciB8IHVuZGVmaW5lZCxcbiAgICApIHsgfVxuXG4gICAgc3RhdGljIGNyZWF0ZUpzb248UmVxLCBSZXMsIFJlcURhdGEgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlLCBSZXNEYXRhIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHJlcXVlc3RTZXJpYWxpemVyLFxuICAgICAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbklkLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxSZXEsIFJlcURhdGE+O1xuICAgICAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFJlcywgUmVzRGF0YT47XG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQ/OiBJbnRvSWQ7XG4gICAgICAgIH0sXG4gICAgKTogRW5kcG9pbnRUeXBlPFJlcSwgUmVzPiB7XG4gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRUeXBlPFJlcSwgUmVzPihcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFJlcSwgSnNvblR5cGUsIFVpbnQ4QXJyYXk+KHJlcXVlc3RTZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpLCBTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8UmVzLCBKc29uVHlwZSwgVWludDhBcnJheT4ocmVzcG9uc2VTZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpLCBTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgICAgICBwZXJtaXNzaW9uSWQgPyBJZGVudGlmaWVyLmZyb20ocGVybWlzc2lvbklkKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxSZXEsIFJlcz4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHJlcXVlc3RTZXJpYWxpemVyLFxuICAgICAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbklkLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFJlcSwgVWludDhBcnJheT47XG4gICAgICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxSZXMsIFVpbnQ4QXJyYXk+O1xuICAgICAgICAgICAgcGVybWlzc2lvbklkPzogSW50b0lkO1xuICAgICAgICB9LFxuICAgICk6IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4ge1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4oXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHJlcXVlc3RTZXJpYWxpemVyLFxuICAgICAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbklkID8gSWRlbnRpZmllci5mcm9tKHBlcm1pc3Npb25JZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgfVxufVxuXG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIsIFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmV4cG9ydCBjb25zdCBBU1NFVF9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxBc3NldEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnYXNzZXQnLFxuICAgIChvbXU6IE9tdSkgPT4gbmV3IEFzc2V0RXh0ZW5zaW9uKG9tdSksXG4pO1xuXG5leHBvcnQgdHlwZSBBc3NldCA9IHtcbiAgICBpZGVudGlmaWVyOiBJZGVudGlmaWVyO1xuICAgIGJ1ZmZlcjogVWludDhBcnJheTtcbn07XG5cbmNvbnN0IEZJTEVfU0VSSUFMSVpFUiA9IG5ldyBTZXJpYWxpemVyPEFzc2V0LCBVaW50OEFycmF5PihcbiAgICAoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoZmlsZS5pZGVudGlmaWVyLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShmaWxlLmJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfSxcbiAgICAoZGF0YSkgPT4ge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmVhZGVyLmZpbmlzaCgpO1xuICAgICAgICByZXR1cm4geyBpZGVudGlmaWVyLCBidWZmZXIgfTtcbiAgICB9LFxuKTtcbmNvbnN0IEZJTEVfQVJSQVlfU0VSSUFMSVpFUiA9IG5ldyBTZXJpYWxpemVyPEFzc2V0W10sIFVpbnQ4QXJyYXk+KFxuICAgIChmaWxlcykgPT4ge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KGZpbGVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGZpbGUuaWRlbnRpZmllci5rZXkoKSk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGZpbGUuYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH0sXG4gICAgKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGZpbGVzOiBBc3NldFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBpZGVudGlmaWVyLCBidWZmZXIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZGVyLmZpbmlzaCgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfSxcbik7XG5cbmV4cG9ydCBjb25zdCBBU1NFVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gQVNTRVRfRVhURU5TSU9OX1RZUEUuam9pbigncGVybWlzc2lvbicpO1xuXG5jb25zdCBBU1NFVF9VUExPQURfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxBc3NldCwgSWRlbnRpZmllcj4oXG4gICAgQVNTRVRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAndXBsb2FkJyxcbiAgICAgICAgcmVxdWVzdFNlcmlhbGl6ZXI6IEZJTEVfU0VSSUFMSVpFUixcbiAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvSnNvbigpLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5jb25zdCBBU1NFVF9VUExPQURfTUFOWV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPEFzc2V0W10sIElkZW50aWZpZXJbXT4oXG4gICAgQVNTRVRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAndXBsb2FkX21hbnknLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogRklMRV9BUlJBWV9TRVJJQUxJWkVSLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIub2YoSWRlbnRpZmllcikudG9BcnJheSgpLnBpcGUoU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5jb25zdCBBU1NFVF9ET1dOTE9BRF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPElkZW50aWZpZXIsIEFzc2V0PihcbiAgICBBU1NFVF9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdkb3dubG9hZCcsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnBpcGUoU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IEZJTEVfU0VSSUFMSVpFUixcbiAgICAgICAgcGVybWlzc2lvbklkOiBBU1NFVF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG4pO1xuY29uc3QgQVNTRVRfRE9XTkxPQURfTUFOWV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPElkZW50aWZpZXJbXSwgQXNzZXRbXT4oXG4gICAgQVNTRVRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAnZG93bmxvYWRfbWFueScsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvQXJyYXkoKS5waXBlKFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgcmVzcG9uc2VTZXJpYWxpemVyOiBGSUxFX0FSUkFZX1NFUklBTElaRVIsXG4gICAgICAgIHBlcm1pc3Npb25JZDogQVNTRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcbmNvbnN0IEFTU0VUX0RFTEVURV9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXIsIG51bGw+KFxuICAgIEFTU0VUX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2RlbGV0ZScsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBJZGVudGlmaWVyLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5cbmNvbnN0IEFTU0VUX0dFTkVSQVRFX1RPS0VOX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248b2JqZWN0LCB7IHRva2VuOiBzdHJpbmcgfT4oXG4gICAgQVNTRVRfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAndG9rZW5fZ2VuZXJhdGUnLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IEFTU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG5cbmV4cG9ydCBjbGFzcyBBc3NldEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8QXNzZXRFeHRlbnNpb24+ID0gQVNTRVRfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSBhc3NldFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLmV2ZW50LmRpc2Nvbm5lY3RlZC5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hc3NldFRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm9uUmVhZHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9tdS5wZXJtaXNzaW9ucy5yZXF1aXJlZChBU1NFVF9QRVJNSVNTSU9OX0lEKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdEdlbmVyYXRlQXNzZXRUb2tlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBsb2FkKGlkZW50aWZpZXI6IEludG9JZCwgYnVmZmVyOiBVaW50OEFycmF5KTogUHJvbWlzZTxJZGVudGlmaWVyPiB7XG4gICAgICAgIGNvbnN0IGFzc2V0SWRlbnRpZmllciA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKEFTU0VUX1VQTE9BRF9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLFxuICAgICAgICAgICAgYnVmZmVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGFzc2V0SWRlbnRpZmllcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBsb2FkTWFueSguLi5maWxlczogQXNzZXRbXSk6IFByb21pc2U8SWRlbnRpZmllcltdPiB7XG4gICAgICAgIGNvbnN0IHVwbG9hZGVkID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoQVNTRVRfVVBMT0FEX01BTllfRU5EUE9JTlQsIGZpbGVzKTtcbiAgICAgICAgcmV0dXJuIHVwbG9hZGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3dubG9hZChpZGVudGlmaWVyOiBJbnRvSWQpOiBQcm9taXNlPEFzc2V0PiB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpO1xuICAgICAgICBjb25zdCBkb3dubG9hZGVkID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoQVNTRVRfRE9XTkxPQURfRU5EUE9JTlQsIGlkKTtcbiAgICAgICAgcmV0dXJuIGRvd25sb2FkZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvd25sb2FkTWFueSguLi5pZGVudGlmaWVyczogSW50b0lkW10pOiBQcm9taXNlPEFzc2V0W10+IHtcbiAgICAgICAgY29uc3QgZG93bmxvYWRlZCA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFxuICAgICAgICAgICAgQVNTRVRfRE9XTkxPQURfTUFOWV9FTkRQT0lOVCxcbiAgICAgICAgICAgIGlkZW50aWZpZXJzLm1hcCgoaWQpID0+IElkZW50aWZpZXIuZnJvbShpZCkpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZG93bmxvYWRlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsZXRlKGlkZW50aWZpZXI6IEludG9JZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKTtcbiAgICAgICAgYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoQVNTRVRfREVMRVRFX0VORFBPSU5ULCBpZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXF1ZXN0R2VuZXJhdGVBc3NldFRva2VuKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChBU1NFVF9HRU5FUkFURV9UT0tFTl9FTkRQT0lOVCwge30pO1xuICAgICAgICB0aGlzLmFzc2V0VG9rZW4gPSByZXN1bHQudG9rZW47XG4gICAgfVxuXG4gICAgcHVibGljIHVybChcbiAgICAgICAgaWQ6IEludG9JZCxcbiAgICAgICAgb3B0aW9ucz86IHsgY2FjaGU/OiAnbm8tY2FjaGUnIH0sXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmFzc2V0VG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXNzZXQgdG9rZW4gaXMgbm90IHNldCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleSA9IElkZW50aWZpZXIuZnJvbShpZCkua2V5KCk7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLm9tdS5uZXR3b3JrLmFkZHJlc3M7XG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gYWRkcmVzcy5zZWN1cmUgPyAnaHR0cHMnIDogJ2h0dHAnO1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGAke3Byb3RvY29sfTovLyR7YWRkcmVzcy5ob3N0fToke2FkZHJlc3MucG9ydH0vYXNzZXRgKTtcbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2Fzc2V0X3Rva2VuJywgdGhpcy5hc3NldFRva2VuKTtcbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2lkJywga2V5KTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LmNhY2hlID09PSAnbm8tY2FjaGUnKSB7XG4gICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndCcsIERhdGUubm93KCkudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcm94eSh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy5hc3NldFRva2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fzc2V0IHRva2VuIGlzIG5vdCBzZXQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5vbXUubmV0d29yay5hZGRyZXNzO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IGFkZHJlc3Muc2VjdXJlID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgICAgICAgY29uc3QgcHJveHlVcmwgPSBuZXcgVVJMKGAke3Byb3RvY29sfTovLyR7YWRkcmVzcy5ob3N0fToke2FkZHJlc3MucG9ydH0vcHJveHlgKTtcbiAgICAgICAgcHJveHlVcmwuc2VhcmNoUGFyYW1zLnNldCgnYXNzZXRfdG9rZW4nLCB0aGlzLmFzc2V0VG9rZW4pO1xuICAgICAgICBwcm94eVVybC5zZWFyY2hQYXJhbXMuc2V0KCd1cmwnLCB1cmwpO1xuICAgICAgICByZXR1cm4gcHJveHlVcmwudG9TdHJpbmcoKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeVBlcm1pc3Npb25zSlNPTiB7XG4gICAgYWxsPzogc3RyaW5nO1xuICAgIHJlYWQ/OiBzdHJpbmc7XG4gICAgd3JpdGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnlQZXJtaXNzaW9ucyB7XG4gICAgYWxsPzogSW50b0lkO1xuICAgIHJlYWQ/OiBJbnRvSWQ7XG4gICAgd3JpdGU/OiBJbnRvSWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyeVR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VmFsdWU6IFQsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uczogUmVnaXN0cnlQZXJtaXNzaW9ucyxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVKc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihpZGVudGlmaWVyOiBJbnRvSWQsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgc2VyaWFsaXplcixcbiAgICB9OiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBUO1xuICAgICAgICBwZXJtaXNzaW9ucz86IFJlZ2lzdHJ5UGVybWlzc2lvbnM7XG4gICAgICAgIHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD47XG4gICAgfSk6IFJlZ2lzdHJ5VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cnlUeXBlKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8VCwgRCwgVWludDhBcnJheT4oc2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMgPz8ge30sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVTZXJpYWxpemVkPFQ+KGlkZW50aWZpZXI6IEludG9JZCwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgIHBlcm1pc3Npb25zLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFQ7XG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICAgICAgcGVybWlzc2lvbnM/OiBSZWdpc3RyeVBlcm1pc3Npb25zO1xuICAgIH0pOiBSZWdpc3RyeVR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJ5VHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zID8/IHt9LFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeTxUPiB7XG4gICAgcmVhZG9ubHkgdHlwZTogUmVnaXN0cnlUeXBlPFQ+O1xuICAgIHJlYWRvbmx5IHZhbHVlOiBUO1xuICAgIGdldCgpOiBQcm9taXNlPFQ+O1xuICAgIHNldCh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD47XG4gICAgdXBkYXRlKGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD47XG4gICAgbW9kaWZ5KGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD47XG4gICAgbGlzdGVuKGZuOiAodmFsdWU6IFQpID0+IHZvaWQpOiBVbmxpc3RlbjtcblxuICAgIGNvbXBhdFN2ZWx0ZSgpOiBXcml0YWJsZTxUPjtcbn1cblxuZXhwb3J0IHR5cGUgU3Vic2NyaWJlcjxUPiA9ICh2YWx1ZTogVCkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVW5zdWJzY3JpYmVyID0gKCkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBkYXRlcjxUPiA9ICh2YWx1ZTogVCkgPT4gVDtcblxuZXhwb3J0IHR5cGUgU3RhcnRTdG9wTm90aWZpZXI8VD4gPSAoXG4gICAgc2V0OiAodmFsdWU6IFQpID0+IHZvaWQsXG4gICAgdXBkYXRlOiAoZm46IFVwZGF0ZXI8VD4pID0+IHZvaWRcbikgPT4gdm9pZCB8ICgoKSA9PiB2b2lkKTtcblxuZXhwb3J0IGludGVyZmFjZSBSZWFkYWJsZTxUPiB7XG4gICAgc3Vic2NyaWJlKHRoaXM6IHZvaWQsIHJ1bjogU3Vic2NyaWJlcjxUPik6IFVuc3Vic2NyaWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXcml0YWJsZTxUPiBleHRlbmRzIFJlYWRhYmxlPFQ+IHtcbiAgICBzZXQodGhpczogdm9pZCwgdmFsdWU6IFQpOiB2b2lkO1xuICAgIHVwZGF0ZSh0aGlzOiB2b2lkLCB1cGRhdGVyOiBVcGRhdGVyPFQ+KTogdm9pZDtcbiAgICB3YWl0KCk6IFByb21pc2U8VD47XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgRXZlbnRFbWl0dGVyLCBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBKc29uVHlwZSwgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbmZpZyA9IHtcbiAgICBjYWNoZV9zaXplOiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlPFQ+IHtcbiAgICByZWFkb25seSBjYWNoZTogUmVhZG9ubHlNYXA8c3RyaW5nLCBUPjtcbiAgICByZWFkb25seSBldmVudDogVGFibGVFdmVudHM8VD47XG4gICAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgICBnZXRNYW55KC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgYWRkKC4uLml0ZW06IFRbXSk6IFByb21pc2U8dm9pZD47XG4gICAgdXBkYXRlKC4uLml0ZW06IFRbXSk6IFByb21pc2U8dm9pZD47XG4gICAgcmVtb3ZlKC4uLml0ZW1zOiBUW10pOiBQcm9taXNlPHZvaWQ+O1xuICAgIGNsZWFyKCk6IFByb21pc2U8dm9pZD47XG4gICAgaGFzKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICBoYXNNYW55PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oLi4ua2V5czogKGtleW9mIFQpW10pOiBQcm9taXNlPHsgW2tleSBpbiBrZXlvZiBUXTogYm9vbGVhbiB9PjtcbiAgICBoYXNBbGwoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGhhc0FueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgICBmZXRjaEl0ZW1zKHtcbiAgICAgICAgbGltaXQsXG4gICAgICAgIGJhY2t3YXJkLFxuICAgICAgICBjdXJzb3IsXG4gICAgfToge1xuICAgICAgICBsaW1pdDogbnVtYmVyO1xuICAgICAgICBiYWNrd2FyZD86IGJvb2xlYW47XG4gICAgICAgIGN1cnNvcj86IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgZmV0Y2hSYW5nZSh7IHN0YXJ0LCBlbmQgfTogeyBzdGFydDogc3RyaW5nOyBlbmQ6IHN0cmluZyB9KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgZmV0Y2hBbGwoKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj47XG4gICAgaXRlcmF0ZSh7IGJhY2t3YXJkLCBjdXJzb3IgfTogeyBiYWNrd2FyZD86IGJvb2xlYW47IGN1cnNvcj86IHN0cmluZyB9KTogQXN5bmNJdGVyYWJsZTxUPjtcbiAgICBzaXplKCk6IFByb21pc2U8bnVtYmVyPjtcblxuICAgIHByb3h5KHByb3h5OiAoaXRlbTogVCkgPT4gVCB8IHVuZGVmaW5lZCk6IFVubGlzdGVuO1xuICAgIHNldENhY2hlU2l6ZShzaXplOiBudW1iZXIpOiB2b2lkO1xuICAgIHNldENvbmZpZyhjb25maWc6IFRhYmxlQ29uZmlnKTogdm9pZDtcbiAgICBzZXRQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogVGFibGVQZXJtaXNzaW9ucyk6IHZvaWQ7XG5cbiAgICBsaXN0ZW4obGlzdGVuZXI/OiAoaXRlbXM6IE1hcDxzdHJpbmcsIFQ+KSA9PiB2b2lkKTogVW5saXN0ZW47XG59XG5cbmV4cG9ydCB0eXBlIFRhYmxlRXZlbnRzPFQ+ID0ge1xuICAgIGFkZDogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xuICAgIHVwZGF0ZTogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xuICAgIHJlbW92ZTogRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+O1xuICAgIGNsZWFyOiBFdmVudEVtaXR0ZXI8W10+O1xuICAgIGNhY2hlVXBkYXRlOiBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZVBlcm1pc3Npb25zID0ge1xuICAgIGFsbD86IElkZW50aWZpZXI7XG4gICAgcmVhZD86IElkZW50aWZpZXI7XG4gICAgd3JpdGU/OiBJZGVudGlmaWVyO1xuICAgIHJlbW92ZT86IElkZW50aWZpZXI7XG4gICAgcHJveHk/OiBJZGVudGlmaWVyO1xufTtcblxuZXhwb3J0IGNsYXNzIFRhYmxlVHlwZTxUPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PixcbiAgICAgICAgcHVibGljIGtleUZ1bmN0aW9uOiAoaXRlbTogVCkgPT4gc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zIHwgdW5kZWZpbmVkLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAga2V5OiAoaXRlbTogVCkgPT4gc3RyaW5nO1xuICAgICAgICAgICAgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zO1xuICAgICAgICAgICAgc2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxULCBEPjtcbiAgICAgICAgfSxcbiAgICApOiBUYWJsZVR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlVHlwZTxUPihcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihcbiAgICAgICAgaWRlbnRpZmllcjogSW50b0lkLFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBrZXk6IChpdGVtOiBUKSA9PiBzdHJpbmc7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucz86IFRhYmxlUGVybWlzc2lvbnM7XG4gICAgICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgICAgIH0sXG4gICAgKTogVGFibGVUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVR5cGU8VD4oXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllcikuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgQXBwSW5zdGFsbFJlc3BvbnNlID0ge1xuICAgIGFjY2VwdGVkOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BGaWxlID0ge1xuICAgIHR5cGU6ICdmaWxlJyB8ICdkaXJlY3RvcnknO1xuICAgIHNpemU6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFBvc2l0aW9uID0ge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRW50ZXIgPSB7XG4gICAgdHlwZTogJ2VudGVyJztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG4gICAgZmlsZXM6IERyYWdEcm9wRmlsZVtdO1xuICAgIHBvc2l0aW9uOiBEcmFnRHJvcFBvc2l0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ092ZXIgPSB7XG4gICAgdHlwZTogJ292ZXInO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbiAgICBwb3NpdGlvbjogRHJhZ0Ryb3BQb3NpdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wID0ge1xuICAgIHR5cGU6ICdkcm9wJztcbiAgICBkcmFnX2lkOiBzdHJpbmc7XG4gICAgcG9zaXRpb246IERyYWdEcm9wUG9zaXRpb247XG4gICAgZmlsZXM6IERyYWdEcm9wRmlsZVtdO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ0xlYXZlID0ge1xuICAgIHR5cGU6ICdsZWF2ZSc7XG4gICAgZHJhZ19pZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhZ1N0YXRlID0gRHJhZ0VudGVyIHwgRHJhZ092ZXIgfCBEcmFnRHJvcCB8IERyYWdMZWF2ZTtcblxuZXhwb3J0IHR5cGUgRmlsZURyYWdQYWNrZXQgPSB7XG4gICAgZHJhZ19pZDogc3RyaW5nO1xuICAgIGFwcDogQXBwO1xuICAgIHN0YXRlOiBEcmFnU3RhdGU7XG59O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlYWRSZXF1ZXN0ID0ge1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVhZFJlcXVlc3REYXNoYm9hcmQgPSB7XG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVhZE1ldGEgPSB7XG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIGRyYWdfaWQ6IHN0cmluZztcbiAgICBmaWxlczogcmVhZG9ubHkgRHJhZ0Ryb3BGaWxlW107XG59O1xuXG5leHBvcnQgdHlwZSBGaWxlRGF0YSA9IHtcbiAgICBmaWxlOiBEcmFnRHJvcEZpbGU7XG4gICAgYnVmZmVyOiBVaW50OEFycmF5O1xufTtcblxuZXhwb3J0IGNsYXNzIERyYWdEcm9wUmVhZFJlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG1ldGE6IERyYWdEcm9wUmVhZE1ldGEsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBmaWxlczogUmVjb3JkPHN0cmluZywgRmlsZURhdGE+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogbnVtYmVyID0gMSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShkYXRhOiBEcmFnRHJvcFJlYWRSZXNwb25zZSk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KGRhdGEudmVyc2lvbik7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeShkYXRhLm1ldGEpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChPYmplY3Qua2V5cyhkYXRhLmZpbGVzKS5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgeyBmaWxlLCBidWZmZXIgfV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YS5maWxlcykpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKEpTT04uc3RyaW5naWZ5KGZpbGUpKTtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogRHJhZ0Ryb3BSZWFkUmVzcG9uc2Uge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IG1ldGE6IERyYWdEcm9wUmVhZE1ldGEgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSByZWFkZXIucmVhZFVMRUIxMjgoKTtcblxuICAgICAgICBjb25zdCBmaWxlczogUmVjb3JkPHN0cmluZywgRmlsZURhdGE+ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCBmaWxlOiBEcmFnRHJvcEZpbGUgPSBKU09OLnBhcnNlKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgICAgICBmaWxlc1trZXldID0geyBmaWxlLCBidWZmZXIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRHJhZ0Ryb3BSZWFkUmVzcG9uc2UoXG4gICAgICAgICAgICBtZXRhLFxuICAgICAgICAgICAgZmlsZXMsXG4gICAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRHJhZ0Ryb3BSZXF1ZXN0ID0gb2JqZWN0O1xuXG5leHBvcnQgdHlwZSBEcmFnRHJvcFJlcXVlc3REYXNoYm9hcmQgPSB7XG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIGFwcDogQXBwSnNvbjtcbn07XG5cbmV4cG9ydCB0eXBlIERyYWdEcm9wUmVxdWVzdFJlc3BvbnNlID0ge1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICBvazogYm9vbGVhbjtcbn07XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQvcGFja2V0LmpzJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdS5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IEVuZHBvaW50VHlwZSB9IGZyb20gJy4uL2VuZHBvaW50L2VuZHBvaW50LmpzJztcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgUGVybWlzc2lvblR5cGVKc29uIH0gZnJvbSAnLi4vcGVybWlzc2lvbi9wZXJtaXNzaW9uLmpzJztcbmltcG9ydCB7IFBhY2thZ2VJbmZvIH0gZnJvbSAnLi4vcGx1Z2luL3BhY2thZ2UtaW5mby5qcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSwgUmVnaXN0cnlUeXBlIH0gZnJvbSAnLi4vcmVnaXN0cnkvcmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgQXBwSW5kZXhSZWdpc3RyeU1ldGEgfSBmcm9tICcuLi9zZXJ2ZXIvZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tICcuLi90YWJsZS90YWJsZS5qcyc7XG5pbXBvcnQgeyBUYWJsZVR5cGUgfSBmcm9tICcuLi90YWJsZS90YWJsZS5qcyc7XG5cbmltcG9ydCB0eXBlIHsgRGFzaGJvYXJkSGFuZGxlciB9IGZyb20gJy4vaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBBcHBJbnN0YWxsUmVzcG9uc2UsIERyYWdEcm9wLCBEcmFnRHJvcFJlYWRSZXF1ZXN0LCBEcmFnRHJvcFJlYWRSZXF1ZXN0RGFzaGJvYXJkLCBEcmFnRHJvcFJlYWRSZXNwb25zZSwgRHJhZ0Ryb3BSZXF1ZXN0LCBEcmFnRHJvcFJlcXVlc3REYXNoYm9hcmQsIERyYWdEcm9wUmVxdWVzdFJlc3BvbnNlLCBEcmFnRW50ZXIsIERyYWdMZWF2ZSwgRHJhZ092ZXIsIEZpbGVEcmFnUGFja2V0IH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcblxuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxEYXNoYm9hcmRFeHRlbnNpb24+ID0gbmV3IEV4dGVuc2lvblR5cGUoXG4gICAgJ2Rhc2hib2FyZCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgRGFzaGJvYXJkRXh0ZW5zaW9uKG9tdSksXG4pO1xuXG50eXBlIERhc2hib2FyZFNldFJlc3BvbnNlID0ge1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG59O1xuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9TRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdzZXQnKTtcbmNvbnN0IERBU0hCT0FSRF9TRVRfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyLCBEYXNoYm9hcmRTZXRSZXNwb25zZT4oXG4gICAgREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ3NldCcsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBJZGVudGlmaWVyLFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9TRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxuKTtcbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfT1BFTl9BUFBfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdhcHAnLCAnb3BlbicpO1xuY29uc3QgREFTSEJPQVJEX09QRU5fQVBQX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248QXBwLCB2b2lkPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnb3Blbl9hcHAnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBBcHAsXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfT1BFTl9BUFBfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgREFTSEJPQVJEX09QRU5fQVBQX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxBcHA+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdvcGVuX2FwcCcsXG4gICAgc2VyaWFsaXplcjogQXBwLFxufSk7XG5leHBvcnQgY29uc3QgREFTSE9CQVJEX0FQUF9SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignYXBwJywgJ3JlYWQnKTtcbmV4cG9ydCBjb25zdCBEQVNIT0JBUkRfQVBQX0VESVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCdhcHAnLCAnZWRpdCcpO1xuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9BUFBfSU5TVEFMTF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2FwcCcsICdpbnN0YWxsJyk7XG5jb25zdCBEQVNIQk9BUkRfQVBQX0lOU1RBTExfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxBcHAsIEFwcEluc3RhbGxSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2luc3RhbGxfYXBwJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogQXBwLFxuICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX0FQUF9JTlNUQUxMX1BFUk1JU1NJT05fSUQsXG59KTtcbmV4cG9ydCBjb25zdCBEQVNoQk9BUkRfRFJBR19EUk9QX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignZHJhZ19kcm9wJyk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1NUQVRFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxGaWxlRHJhZ1BhY2tldD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2RyYWdfZHJvcF9zdGF0ZScsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wPEZpbGVEcmFnUGFja2V0PigpXG4gICAgICAgIC5maWVsZCgnYXBwJywgQXBwKSxcbn0pO1xuY29uc3QgREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RHJhZ0Ryb3BSZWFkUmVxdWVzdCwgRHJhZ0Ryb3BSZWFkUmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3BfcmVhZCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogRHJhZ0Ryb3BSZWFkUmVzcG9uc2UsXG59KTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfUkVBRF9SRVFVRVNUX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxEcmFnRHJvcFJlYWRSZXF1ZXN0RGFzaGJvYXJkPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3JlYWRfcmVxdWVzdCcsXG59KTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfUkVBRF9SRVNQT05TRV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RHJhZ0Ryb3BSZWFkUmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3BfcmVhZF9yZXNwb25zZScsXG4gICAgc2VyaWFsaXplcjogRHJhZ0Ryb3BSZWFkUmVzcG9uc2UsXG59KTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPERyYWdEcm9wUmVxdWVzdCwgRHJhZ0Ryb3BSZXF1ZXN0UmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdkcmFnX2Ryb3BfcmVxdWVzdCcsXG4gICAgcGVybWlzc2lvbklkOiBEQVNoQk9BUkRfRFJBR19EUk9QX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248RHJhZ0Ryb3BSZXF1ZXN0RGFzaGJvYXJkPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3JlcXVlc3QnLFxufSk7XG5jb25zdCBEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfQVBQUk9WQUxfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPERyYWdEcm9wUmVxdWVzdFJlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZHJhZ19kcm9wX3JlcXVlc3RfYXBwcm92YWwnLFxufSk7XG5cbnR5cGUgRHJhZ0Ryb3BIYW5kbGVyID0ge1xuICAgIG9uRW50ZXIoZm46IChldmVudDogRHJhZ0VudGVyKSA9PiB1bmtub3duKTogdm9pZDtcbiAgICBvbk92ZXIoZm46IChldmVudDogRHJhZ092ZXIpID0+IHVua25vd24pOiB2b2lkO1xuICAgIG9uRHJvcChmbjogKGV2ZW50OiBEcmFnRHJvcCkgPT4gdW5rbm93bik6IHZvaWQ7XG4gICAgb25MZWF2ZShmbjogKGV2ZW50OiBEcmFnTGVhdmUpID0+IHVua25vd24pOiB2b2lkO1xuICAgIHJlYWQoaWQ6IHN0cmluZyk6IFByb21pc2U8RHJhZ0Ryb3BSZWFkUmVzcG9uc2U+O1xufTtcblxuZXhwb3J0IHR5cGUgQ29va2llID0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld1JlcXVlc3QgPSB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgc2NyaXB0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3UGFja2V0ID0ge1xuICAgIGlkOiBJZGVudGlmaWVyO1xufTtcblxuZXhwb3J0IHR5cGUgVXNlclJlc3BvbnNlPFQgPSB1bmRlZmluZWQ+ID0ge1xuICAgIHR5cGU6ICdvayc7XG4gICAgdmFsdWU6IFQ7XG59IHwge1xuICAgIHR5cGU6ICdibG9ja2VkJztcbn0gfCB7XG4gICAgdHlwZTogJ2NhbmNlbGxlZCc7XG59O1xuZXhwb3J0IGNsYXNzIFVzZXJSZXN1bHQ8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVzdWx0OiB7XG4gICAgICAgICAgICB0eXBlOiAnb2snO1xuICAgICAgICAgICAgdmFsdWU6IFQ7XG4gICAgICAgIH0gfCB7XG4gICAgICAgICAgICB0eXBlOiAnYmxvY2tlZCc7XG4gICAgICAgIH0gfCB7XG4gICAgICAgICAgICB0eXBlOiAnY2FuY2VsbGVkJztcbiAgICAgICAgfSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgdW53cmFwKCk6IFQge1xuICAgICAgICBpZiAodGhpcy5yZXN1bHQudHlwZSA9PT0gJ29rJykgcmV0dXJuIHRoaXMucmVzdWx0LnZhbHVlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyaWVkIHRvIHVud3JhcCBhICR7dGhpcy5yZXN1bHQudHlwZX0gcmVzdWx0YCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBXZWJ2aWV3UmVzcG9uc2UgPSBVc2VyUmVzcG9uc2UgJiBXZWJ2aWV3UGFja2V0O1xuXG5leHBvcnQgY29uc3QgREFTSEJPQVJEX1dFQlZJRVdfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRS5qb2luKCd3ZWJ2aWV3Jyk7XG5cbmV4cG9ydCB0eXBlIEhvc3RSZXF1ZXN0ID0ge1xuICAgIGhvc3Q6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEdldENvb2tpZXNSZXF1ZXN0ID0ge1xuICAgIHVybDogc3RyaW5nO1xufTtcblxuY29uc3QgREFTSEJPQVJEX0NPT0tJRVNfR0VUID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248R2V0Q29va2llc1JlcXVlc3QsIFVzZXJSZXNwb25zZTxDb29raWVbXT4+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdjb29raWVzX2dldCcsXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lELFxufSk7XG5cbmNvbnN0IERBU0hCT0FSRF9XRUJWSUVXX1JFUVVFU1QgPSBFbmRwb2ludFR5cGUuY3JlYXRlSnNvbjxXZWJ2aWV3UmVxdWVzdCwgV2Vidmlld1Jlc3BvbnNlPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd2Vidmlld19yZXF1ZXN0JyxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcDxXZWJ2aWV3UmVzcG9uc2U+KClcbiAgICAgICAgLmZpZWxkKCdpZCcsIElkZW50aWZpZXIpLFxuICAgIHBlcm1pc3Npb25JZDogREFTSEJPQVJEX1dFQlZJRVdfUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5jb25zdCBEQVNIQk9BUkRfV0VCVklFV19DTE9TRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPFdlYnZpZXdQYWNrZXQsIFdlYnZpZXdSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dlYnZpZXdfY2xvc2UnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3A8V2Vidmlld1BhY2tldD4oKVxuICAgICAgICAuZmllbGQoJ2lkJywgSWRlbnRpZmllciksXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLm5vb3A8V2Vidmlld1Jlc3BvbnNlPigpXG4gICAgICAgIC5maWVsZCgnaWQnLCBJZGVudGlmaWVyKSxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9XRUJWSUVXX1BFUk1JU1NJT05fSUQsXG59KTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld0V2ZW50ID0ge1xuICAgIHR5cGU6ICdjbG9zZWQnO1xufSB8IHtcbiAgICB0eXBlOiAncmVzaXplJztcbiAgICBkaW1lbnRpb25zOiB7XG4gICAgICAgIHg6IG51bWJlcjtcbiAgICAgICAgeTogbnVtYmVyO1xuICAgIH07XG59IHwge1xuICAgIHR5cGU6ICdjb29raWUnO1xuICAgIGNvb2tpZXM6IENvb2tpZVtdO1xufTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld0V2ZW50TGlzdGVuZXJzID0ge1xuICAgIFtLIGluIFdlYnZpZXdFdmVudFsndHlwZSddXT86IEFycmF5PChldmVudDogRXh0cmFjdDxXZWJ2aWV3RXZlbnQsIHsgdHlwZTogSyB9PikgPT4gdm9pZD47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3RXZlbnRQYWNrZXQgPSB7XG4gICAgaWQ6IElkZW50aWZpZXI7XG4gICAgdGFyZ2V0OiBJZGVudGlmaWVyO1xuICAgIGV2ZW50OiBXZWJ2aWV3RXZlbnQ7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJ2aWV3SGFuZGxlID0ge1xuICAgIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyO1xuICAgIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICAgIGdldENvb2tpZXMoKTogUHJvbWlzZTxDb29raWVbXT47XG4gICAgY2xvc2UoKTogdm9pZDtcbiAgICBvbjxUIGV4dGVuZHMgV2Vidmlld0V2ZW50Wyd0eXBlJ10+KGtleTogVCwgY2FsbGJhY2s6IChldmVudDogRXh0cmFjdDxXZWJ2aWV3RXZlbnQsIHsgdHlwZTogVCB9PikgPT4gdm9pZCk6IHZvaWQ7XG4gICAgam9pbigpOiBQcm9taXNlPHZvaWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgV2Vidmlld0V2ZW50RW1pdCA9IDxUIGV4dGVuZHMgV2Vidmlld0V2ZW50Wyd0eXBlJ10+KGV2ZW50OiBFeHRyYWN0PFdlYnZpZXdFdmVudCwgeyB0eXBlOiBUIH0+KSA9PiB2b2lkO1xuXG5jb25zdCBEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248V2Vidmlld0V2ZW50UGFja2V0PihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd2Vidmlld19ldmVudCcsXG4gICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wPFdlYnZpZXdFdmVudFBhY2tldD4oKVxuICAgICAgICAuZmllbGQoJ2lkJywgSWRlbnRpZmllcilcbiAgICAgICAgLmZpZWxkKCd0YXJnZXQnLCBJZGVudGlmaWVyKSxcbn0pO1xuXG50eXBlIEFsbG93ZWRIb3N0ID0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgaG9zdHM6IHN0cmluZ1tdO1xufTtcblxuY29uc3QgREFTSEJPQVJEX0FMTE9XRURfV0VCVklFV19IT1NUUyA9IFRhYmxlVHlwZS5jcmVhdGVKc29uPEFsbG93ZWRIb3N0PihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnYWxsb3dlZF93ZWJ2aWV3X2hvc3RzJyxcbiAgICBrZXk6IChlbnRyeSkgPT4gZW50cnkuaWQsXG4gICAgcGVybWlzc2lvbnM6IHsgYWxsOiBEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQgfSxcbn0pO1xuXG5jb25zdCBEQVNIQk9BUkRfSE9TVF9SRVFVRVNUID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248e1xuICAgIGhvc3Q6IHN0cmluZztcbn0sIFVzZXJSZXNwb25zZT4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2hvc3RfcmVxdWVzdCcsXG4gICAgcGVybWlzc2lvbklkOiBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lELFxufSk7XG5cbmV4cG9ydCBjb25zdCBEQVNIQk9BUkRfU1BFRUNIX1JFQ09HTklUSU9OX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUuam9pbignc3BlZWNoX3JlY29nbml0aW9uJyk7XG5cbmV4cG9ydCB0eXBlIFRyYW5zY3JpcHRTZWdtZW50ID0ge1xuICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICB0cmFuc2NyaXB0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUcmFuc2NyaXB0U3RhdHVzID0ge1xuICAgIHR5cGU6ICdpZGxlJztcbn0gfCB7XG4gICAgdHlwZTogJ3Jlc3VsdCc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgc2VnbWVudHM6IFRyYW5zY3JpcHRTZWdtZW50W107XG59IHwge1xuICAgIHR5cGU6ICdmaW5hbCc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgc2VnbWVudHM6IFRyYW5zY3JpcHRTZWdtZW50W107XG59IHwge1xuICAgIHR5cGU6ICdhdWRpb19zdGFydGVkJztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbn0gfCB7XG4gICAgdHlwZTogJ2F1ZGlvX2VuZGVkJztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbn07XG5cbmNvbnN0IERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT04gPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxUcmFuc2NyaXB0U3RhdHVzPihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc3BlZWNoX3JlY29nbml0aW9uJyxcbiAgICBkZWZhdWx0VmFsdWU6IHsgdHlwZTogJ2lkbGUnIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVhZDogREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9QRVJNSVNTSU9OX0lELFxuICAgICAgICB3cml0ZTogREFTSEJPQVJEX1NFVF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG59KTtcblxuZXhwb3J0IHR5cGUgU3BlZWNoUmVjb2duaXRpb25TdGFydCA9IHtcbiAgICB0eXBlOiAnc3RhcnQnO1xufTtcblxuY29uc3QgREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9TVEFSVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPFNwZWVjaFJlY29nbml0aW9uU3RhcnQsIFVzZXJSZXNwb25zZTx1bmRlZmluZWQ+PihEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc3BlZWNoX3JlY29nbml0aW9uX3N0YXJ0JyxcbiAgICBwZXJtaXNzaW9uSWQ6IERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5pbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEJhc2U8VCBleHRlbmRzIHN0cmluZz4ge1xuICAgIGtpbmQ6IFQ7XG4gICAgaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRSZXF1ZXN0QXBwUGVybWlzc2lvbnMgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL3Blcm1pc3Npb25zJz4ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBwZXJtaXNzaW9uczogUGVybWlzc2lvblR5cGVKc29uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0UmVxdWVzdEFwcFBsdWdpbnMgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL3BsdWdpbnMnPiB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHBhY2thZ2VzOiBQYWNrYWdlSW5mb1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFJlcXVlc3RBcHBJbnN0YWxsIGV4dGVuZHMgUHJvbXB0UmVxdWVzdEJhc2U8J2FwcC9pbnN0YWxsJz4ge1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIEFwcEpzb24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFJlcXVlc3RBcHBVcGRhdGUgZXh0ZW5kcyBQcm9tcHRSZXF1ZXN0QmFzZTwnYXBwL3VwZGF0ZSc+IHtcbiAgICBvbGRfYXBwOiBBcHBKc29uO1xuICAgIG5ld19hcHA6IEFwcEpzb247XG4gICAgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBBcHBKc29uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRSZXF1ZXN0SW5kZXhJbnN0YWxsIGV4dGVuZHMgUHJvbXB0UmVxdWVzdEJhc2U8J2luZGV4L2luc3RhbGwnPiB7XG4gICAgaW5kZXhfdXJsOiBzdHJpbmc7XG4gICAgbWV0YT86IEFwcEluZGV4UmVnaXN0cnlNZXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRQcm9jZXNzIHtcbiAgICBwb3J0OiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGV4ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFJlcXVlc3RIdHRwUG9ydCBleHRlbmRzIFByb21wdFJlcXVlc3RCYXNlPCdodHRwL3BvcnQnPiB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHByb2Nlc3NlczogUG9ydFByb2Nlc3NbXTtcbn1cblxuZXhwb3J0IHR5cGUgUHJvbXB0UmVxdWVzdCA9IChcbiAgICBQcm9tcHRSZXF1ZXN0QXBwUGVybWlzc2lvbnNcbiAgICB8IFByb21wdFJlcXVlc3RBcHBQbHVnaW5zXG4gICAgfCBQcm9tcHRSZXF1ZXN0QXBwSW5zdGFsbFxuICAgIHwgUHJvbXB0UmVxdWVzdEFwcFVwZGF0ZVxuICAgIHwgUHJvbXB0UmVxdWVzdEluZGV4SW5zdGFsbFxuICAgIHwgUHJvbXB0UmVxdWVzdEh0dHBQb3J0XG4pO1xuXG5jb25zdCBEQVNIQk9BUkRfUFJPTVBUX1JFUVVFU1QgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UHJvbXB0UmVxdWVzdD4oREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Byb21wdF9yZXF1ZXN0Jyxcbn0pO1xuXG5leHBvcnQgdHlwZSBQcm9tcHRSZXN1bHQgPSAnYWNjZXB0JyB8ICdkZW55JyB8ICdibG9jayc7XG5cbmludGVyZmFjZSBQcm9tcHRSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBraW5kOiBzdHJpbmc7XG4gICAgcmVzdWx0OiBQcm9tcHRSZXN1bHQ7XG59XG5cbmNvbnN0IERBU0hCT0FSRF9QUk9NUFRfUkVTUE9OU0UgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UHJvbXB0UmVzcG9uc2U+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdwcm9tcHRfcmVzcG9uc2UnLFxufSk7XG5cbmNvbnN0IERBU0hCT0FSRF9QUk9NUFRfQ0xFQVJfQkxPQ0tFRCA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPG51bGwsIG51bGw+KERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdwcm9tcHRfY2xlYXJfYmxvY2tlZCcsXG59KTtcblxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8RGFzaGJvYXJkRXh0ZW5zaW9uPiA9IERBU0hCT0FSRF9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIGRhc2hib2FyZDogRGFzaGJvYXJkSGFuZGxlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZHJhZ0Ryb3BIYW5kbGVyOiBEcmFnRHJvcEhhbmRsZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGRyYWdEcm9wTGlzdGVuZXJzID0ge1xuICAgICAgICBlbnRlcjogW10gYXMgQXJyYXk8KHN0YXRlOiBEcmFnRW50ZXIpID0+IHVua25vd24+LFxuICAgICAgICBvdmVyOiBbXSBhcyBBcnJheTwoc3RhdGU6IERyYWdPdmVyKSA9PiB1bmtub3duPixcbiAgICAgICAgZHJvcDogW10gYXMgQXJyYXk8KHN0YXRlOiBEcmFnRHJvcCkgPT4gdW5rbm93bj4sXG4gICAgICAgIGxlYXZlOiBbXSBhcyBBcnJheTwoc3RhdGU6IERyYWdMZWF2ZSkgPT4gdW5rbm93bj4sXG4gICAgfTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWxsb3dlZEhvc3RzOiBUYWJsZTxBbGxvd2VkSG9zdD47XG4gICAgcHVibGljIHJlYWRvbmx5IHNwZWVjaFJlY29nbml0aW9uOiBSZWdpc3RyeTxUcmFuc2NyaXB0U3RhdHVzPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdlYnZpZXdIYW5kbGVzOiBJZGVudGlmaWVyTWFwPHsgaGFuZGxlOiBXZWJ2aWV3SGFuZGxlOyBlbWl0OiBXZWJ2aWV3RXZlbnRFbWl0IH0+ID0gbmV3IElkZW50aWZpZXJNYXAoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBEQVNIQk9BUkRfT1BFTl9BUFBfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVRVUVTVF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfUkVTUE9OU0VfUEFDS0VULFxuICAgICAgICAgICAgREFTSEJPQVJEX0RSQUdfRFJPUF9SRVFVRVNUX1BBQ0tFVCxcbiAgICAgICAgICAgIERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9BUFBST1ZBTF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsXG4gICAgICAgICAgICBEQVNIQk9BUkRfUFJPTVBUX1JFUVVFU1QsXG4gICAgICAgICAgICBEQVNIQk9BUkRfUFJPTVBUX1JFU1BPTlNFLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9QUk9NUFRfUkVRVUVTVCwgKHJlcXVlc3QpID0+XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByb21wdFJlcXVlc3QocmVxdWVzdCksXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX09QRU5fQVBQX1BBQ0tFVCwgKGFwcCkgPT5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT3BlbkFwcChhcHApLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKERBU0hCT0FSRF9EUkFHX0RST1BfUkVRVUVTVF9QQUNLRVQsIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZURyYWdEcm9wUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsICh7IHN0YXRlIH0pID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VudGVyJzoge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdEcm9wTGlzdGVuZXJzLmVudGVyLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnb3Zlcic6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRHJvcExpc3RlbmVycy5vdmVyLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZHJvcCc6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRHJvcExpc3RlbmVycy5kcm9wLmZvckVhY2goKGZuKSA9PiBmbihzdGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnbGVhdmUnOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BMaXN0ZW5lcnMubGVhdmUuZm9yRWFjaCgoZm4pID0+IGZuKHN0YXRlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFUVVFU1RfUEFDS0VULCAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEcmFnRHJvcFJlYWRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud2Vidmlld0hhbmRsZXMuZ2V0KHBhY2tldC5pZCk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuO1xuICAgICAgICAgICAgaGFuZGxlLmVtaXQocGFja2V0LmV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWxsb3dlZEhvc3RzID0gb211LnRhYmxlcy5nZXQoREFTSEJPQVJEX0FMTE9XRURfV0VCVklFV19IT1NUUyk7XG4gICAgICAgIHRoaXMuc3BlZWNoUmVjb2duaXRpb24gPSBvbXUucmVnaXN0cmllcy5nZXQoREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBleGVjdXRlUmVxdWVzdEZvckRhc2hib2FyZChyZXF1ZXN0OiBQcm9tcHRSZXF1ZXN0KTogUHJvbWlzZTxQcm9tcHRSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgZGFzaGJvYXJkID0gdGhpcy5nZXREYXNoYm9hcmQoKTtcbiAgICAgICAgc3dpdGNoIChyZXF1ZXN0LmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ2FwcC9wZXJtaXNzaW9ucyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVQZXJtaXNzaW9uUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGNhc2UgJ2FwcC9wbHVnaW5zJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZVBsdWdpblJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgICAgICBjYXNlICdhcHAvaW5zdGFsbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVJbnN0YWxsQXBwKHJlcXVlc3QpO1xuICAgICAgICAgICAgY2FzZSAnYXBwL3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVVcGRhdGVBcHAocmVxdWVzdCk7XG4gICAgICAgICAgICBjYXNlICdpbmRleC9pbnN0YWxsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZUluZGV4SW5zdGFsbChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGNhc2UgJ2h0dHAvcG9ydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVIdHRwUG9ydFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm9tcHQgcmVxdWVzdGVkOiAke0pTT04uc3RyaW5naWZ5KHJlcXVlc3QpfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVQcm9tcHRSZXF1ZXN0KHJlcXVlc3Q6IFByb21wdFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGVSZXF1ZXN0Rm9yRGFzaGJvYXJkKHJlcXVlc3QpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKERBU0hCT0FSRF9QUk9NUFRfUkVTUE9OU0UsIHtcbiAgICAgICAgICAgIGlkOiByZXF1ZXN0LmlkLFxuICAgICAgICAgICAga2luZDogcmVxdWVzdC5raW5kLFxuICAgICAgICAgICAgcmVzdWx0OiByZXNwb25zZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVPcGVuQXBwKGFwcDogQXBwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGF3YWl0IGRhc2hib2FyZC5oYW5kbGVPcGVuQXBwKGFwcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEcmFnRHJvcFJlcXVlc3QocmVxdWVzdDogRHJhZ0Ryb3BSZXF1ZXN0RGFzaGJvYXJkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGNvbnN0IGFjY2VwdGVkID0gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZURyYWdEcm9wUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfQVBQUk9WQUxfUEFDS0VULCB7XG4gICAgICAgICAgICBvazogYWNjZXB0ZWQsXG4gICAgICAgICAgICByZXF1ZXN0X2lkOiByZXF1ZXN0LnJlcXVlc3RfaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlRHJhZ0Ryb3BSZWFkUmVxdWVzdChyZXF1ZXN0OiBEcmFnRHJvcFJlYWRSZXF1ZXN0RGFzaGJvYXJkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhc2hib2FyZCA9IHRoaXMuZ2V0RGFzaGJvYXJkKCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZGFzaGJvYXJkLmhhbmRsZURyYWdEcm9wUmVhZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIHRoaXMub211LnNlbmQoREFTSEJPQVJEX0RSQUdfRFJPUF9SRUFEX1JFU1BPTlNFX1BBQ0tFVCwgcmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGFzaGJvYXJkKCk6IERhc2hib2FyZEhhbmRsZXIge1xuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFzaGJvYXJkIG5vdCBzZXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXNoYm9hcmQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChkYXNoYm9hcmQ6IERhc2hib2FyZEhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbXUucGVybWlzc2lvbnMucmVxdWlyZShEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQpO1xuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFzaGJvYXJkIGFscmVhZHkgc2V0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXNoYm9hcmQgPSBkYXNoYm9hcmQ7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5iaW5kKERBU0hCT0FSRF9DT09LSUVTX0dFVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPENvb2tpZVtdPj4gPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB1cmwgfSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICBjb25zdCB7IGhvc3RuYW1lIH0gPSBuZXcgVVJMKHVybCk7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHBhcmFtcy5jYWxsZXIua2V5KCk7XG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkSG9zdDogQWxsb3dlZEhvc3QgPSBhd2FpdCB0aGlzLmFsbG93ZWRIb3N0cy5nZXQoaWQpID8/IHsgaWQsIGhvc3RzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IGFsbG93ZWRIb3N0Lmhvc3RzLmluY2x1ZGVzKGhvc3RuYW1lKTtcbiAgICAgICAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjYW5jZWxsZWQnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZGFzaGJvYXJkLmdldENvb2tpZXMocmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9tdS5lbmRwb2ludHMuYmluZChEQVNIQk9BUkRfSE9TVF9SRVFVRVNULCBhc3luYyAocmVxdWVzdCwgcGFyYW1zKTogUHJvbWlzZTxVc2VyUmVzcG9uc2U+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgaG9zdCB9ID0gcmVxdWVzdDtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gcGFyYW1zLmNhbGxlci5rZXkoKTtcbiAgICAgICAgICAgIGNvbnN0IGhvc3RFbnRyeTogQWxsb3dlZEhvc3QgPSBhd2FpdCB0aGlzLmFsbG93ZWRIb3N0cy5nZXQoaWQpID8/IHsgaWQsIGhvc3RzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IGhvc3RFbnRyeS5ob3N0cy5pbmNsdWRlcyhob3N0KTtcbiAgICAgICAgICAgIGlmIChhbGxvd2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29rJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGFzaGJvYXJkLmhvc3RSZXF1ZXN0ZWQocmVxdWVzdCwgcGFyYW1zKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQudHlwZSA9PT0gJ29rJykge1xuICAgICAgICAgICAgICAgIGhvc3RFbnRyeS5ob3N0cy5wdXNoKGhvc3QpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWxsb3dlZEhvc3RzLnVwZGF0ZShob3N0RW50cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5iaW5kKERBU0hCT0FSRF9XRUJWSUVXX1JFUVVFU1QsIGFzeW5jIChyZXF1ZXN0LCBwYXJhbXMpOiBQcm9taXNlPFdlYnZpZXdSZXNwb25zZT4gPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1pdCA9IGFzeW5jIChldmVudDogV2Vidmlld0V2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChEQVNIQk9BUkRfV0VCVklFV19FVkVOVF9QQUNLRVQsIHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogcGFyYW1zLmNhbGxlcixcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBkYXNoYm9hcmQuY3JlYXRlV2VidmlldyhyZXF1ZXN0LCBwYXJhbXMsIGVtaXQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2snLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX1dFQlZJRVdfQ0xPU0UsIGFzeW5jIChyZXF1ZXN0LCBwYXJhbXMpOiBQcm9taXNlPFdlYnZpZXdSZXNwb25zZT4gPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBkYXNoYm9hcmQuZ2V0V2VidmlldyhyZXF1ZXN0LCBwYXJhbXMpO1xuICAgICAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjYW5jZWxsZWQnLFxuICAgICAgICAgICAgICAgICAgICBpZDogcmVxdWVzdC5pZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZGFzaGJvYXJkLmNsb3NlV2VidmlldyhyZXF1ZXN0LCBwYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2snLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmJpbmQoREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9TVEFSVCwgYXN5bmMgKHJlcXVlc3QsIHBhcmFtcyk6IFByb21pc2U8VXNlclJlc3BvbnNlPHVuZGVmaW5lZD4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhc2hib2FyZC5zcGVlY2hSZWNvZ25pdGlvblN0YXJ0KHJlcXVlc3QsIHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUubmV0d29yay5hZGRUYXNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICAgICAgREFTSEJPQVJEX1NFVF9FTkRQT0lOVCxcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5hcHAuaWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2V0IGRhc2hib2FyZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdEhvc3Qob3B0aW9uczogeyBob3N0OiBzdHJpbmcgfSk6IFByb21pc2U8VXNlclJlc3BvbnNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgIERBU0hCT0FSRF9IT1NUX1JFUVVFU1QsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0V2VidmlldyhvcHRpb25zOiBXZWJ2aWV3UmVxdWVzdCk6IFByb21pc2U8VXNlclJlc3VsdDxXZWJ2aWV3SGFuZGxlPj4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgIERBU0hCT0FSRF9XRUJWSUVXX1JFUVVFU1QsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0LnR5cGUgIT09ICdvaycpIHJldHVybiBuZXcgVXNlclJlc3VsdChyZXN1bHQpO1xuICAgICAgICBjb25zdCB7IGlkIH0gPSByZXN1bHQ7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBXZWJ2aWV3RXZlbnRMaXN0ZW5lcnMgPSB7fTtcbiAgICAgICAgY29uc3QgaGFuZGxlOiBXZWJ2aWV3SGFuZGxlID0ge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB1cmw6IG9wdGlvbnMudXJsLFxuICAgICAgICAgICAgY2xvc2U6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgREFTSEJPQVJEX1dFQlZJRVdfQ0xPU0UsXG4gICAgICAgICAgICAgICAgICAgIHsgaWQgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldENvb2tpZXM6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb29raWVzID0gKGF3YWl0IHRoaXMuZ2V0Q29va2llcyh7XG4gICAgICAgICAgICAgICAgICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgICAgICAgICAgICAgfSkpLnVud3JhcCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb29raWVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uOiBmdW5jdGlvbiA8VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihrZXk6IFQsIGNhbGxiYWNrOiAoZXZlbnQ6IEV4dHJhY3Q8V2Vidmlld0V2ZW50LCB7IHR5cGU6IFQgfT4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50TGlzdGVuZXJzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRMaXN0ZW5lcnNba2V5XSA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVyc1trZXldITtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgam9pbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZS5vbignY2xvc2VkJywgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud2Vidmlld0hhbmRsZXMuc2V0KGlkLCB7XG4gICAgICAgICAgICBoYW5kbGUsXG4gICAgICAgICAgICBlbWl0OiBmdW5jdGlvbiA8VCBleHRlbmRzIFdlYnZpZXdFdmVudFsndHlwZSddPihldmVudDogRXh0cmFjdDxXZWJ2aWV3RXZlbnQsIHsgdHlwZTogVCB9Pik6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzW2V2ZW50LnR5cGVdO1xuICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJzKSByZXR1cm47XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJSZXN1bHQoe1xuICAgICAgICAgICAgdHlwZTogJ29rJyxcbiAgICAgICAgICAgIHZhbHVlOiBoYW5kbGUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDb29raWVzKG9wdGlvbnM6IEdldENvb2tpZXNSZXF1ZXN0KTogUHJvbWlzZTxVc2VyUmVzdWx0PENvb2tpZVtdPj4ge1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJSZXN1bHQoYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBEQVNIQk9BUkRfQ09PS0lFU19HRVQsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb3BlbkFwcChhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoREFTSEJPQVJEX09QRU5fQVBQX0VORFBPSU5ULCBhcHApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbnN0YWxsQXBwKGFwcDogQXBwKTogUHJvbWlzZTxBcHBJbnN0YWxsUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9BUFBfSU5TVEFMTF9FTkRQT0lOVCwgYXBwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYXJCbG9ja2VkUHJvbXB0cygpOiBQcm9taXNlPG51bGw+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9QUk9NUFRfQ0xFQVJfQkxPQ0tFRCwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVpcmVEcmFnRHJvcCgpOiBQcm9taXNlPERyYWdEcm9wSGFuZGxlcj4ge1xuICAgICAgICBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChEQVNIQk9BUkRfRFJBR19EUk9QX1JFUVVFU1RfRU5EUE9JTlQsIHt9KTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5kcmFnRHJvcExpc3RlbmVycztcbiAgICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5vbXU7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BIYW5kbGVyID0ge1xuICAgICAgICAgICAgb25FbnRlcihmbikgeyBsaXN0ZW5lcnMuZW50ZXIucHVzaChmbik7IH0sXG4gICAgICAgICAgICBvbk92ZXIoZm4pIHsgbGlzdGVuZXJzLm92ZXIucHVzaChmbik7IH0sXG4gICAgICAgICAgICBvbkRyb3AoZm4pIHsgbGlzdGVuZXJzLmRyb3AucHVzaChmbik7IH0sXG4gICAgICAgICAgICBvbkxlYXZlKGZuKSB7IGxpc3RlbmVycy5sZWF2ZS5wdXNoKGZuKTsgfSxcbiAgICAgICAgICAgIGFzeW5jIHJlYWQoaWQpIHsgcmV0dXJuIGF3YWl0IGNsaWVudC5lbmRwb2ludHMuY2FsbChEQVNIQk9BUkRfRFJBR19EUk9QX1JFQURfRU5EUE9JTlQsIHsgZHJhZ19pZDogaWQgfSk7IH0sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmRyYWdEcm9wSGFuZGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbm90aWZ5RHJvcERyYWdTdGF0ZShwYWNrZXQ6IEZpbGVEcmFnUGFja2V0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub211LnNlbmQoREFTSEJPQVJEX0RSQUdfRFJPUF9TVEFURV9QQUNLRVQsIHBhY2tldCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNwZWVjaFJlY29nbml0aW9uU3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKERBU0hCT0FSRF9TUEVFQ0hfUkVDT0dOSVRJT05fU1RBUlQsIHsgdHlwZTogJ3N0YXJ0JyB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEJ5dGVSZWFkZXIsIEJ5dGVXcml0ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRSZWdpc3RlclBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbmRwb2ludHM6IElkZW50aWZpZXJNYXA8SWRlbnRpZmllciB8IHVuZGVmaW5lZD4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEVuZHBvaW50UmVnaXN0ZXJQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVUxFQjEyOChpdGVtLmVuZHBvaW50cy5zaXplKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaXRlbS5lbmRwb2ludHMpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkua2V5KCkpO1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHZhbHVlPy5rZXkoKSA/PyAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGl0ZW06IFVpbnQ4QXJyYXkpOiBFbmRwb2ludFJlZ2lzdGVyUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShpdGVtKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWFkZXIucmVhZFVMRUIxMjgoKTtcbiAgICAgICAgY29uc3QgZW5kcG9pbnRzID0gbmV3IElkZW50aWZpZXJNYXA8SWRlbnRpZmllciB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgICAgIGVuZHBvaW50cy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFJlZ2lzdGVyUGFja2V0KGVuZHBvaW50cyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52b2tlZFBhcmFtcyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNhbGxlcjogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGtleTogbnVtYmVyLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBJbnZva2VkUGFyYW1zKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLmtleSgpLFxuICAgICAgICAgICAgY2FsbGVyOiBpdGVtLmNhbGxlci5rZXkoKSxcbiAgICAgICAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogc3RyaW5nKTogSW52b2tlZFBhcmFtcyB7XG4gICAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBjYWxsZXI6IHN0cmluZztcbiAgICAgICAgICAgIGtleTogbnVtYmVyO1xuICAgICAgICB9ID0gSlNPTi5wYXJzZShpdGVtKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnZva2VkUGFyYW1zKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tS2V5KGRhdGEuaWQpLFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tS2V5KGRhdGEuY2FsbGVyKSxcbiAgICAgICAgICAgIGRhdGEua2V5LFxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludEludm9rZWRQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcGFyYW1zOiBJbnZva2VkUGFyYW1zLFxuICAgICAgICBwdWJsaWMgYnVmZmVyOiBVaW50OEFycmF5LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBFbmRwb2ludEludm9rZWRQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKEludm9rZWRQYXJhbXMuc2VyaWFsaXplKGl0ZW0ucGFyYW1zKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoaXRlbS5idWZmZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IEVuZHBvaW50SW52b2tlZFBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IEludm9rZWRQYXJhbXMuZGVzZXJpYWxpemUocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50SW52b2tlZFBhY2tldChwYXJhbXMsIGJ1ZmZlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52b2tlUGFyYW1zIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBudW1iZXIsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEludm9rZVBhcmFtcyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBpZDogaXRlbS5pZC5rZXkoKSxcbiAgICAgICAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogc3RyaW5nKTogSW52b2tlUGFyYW1zIHtcbiAgICAgICAgY29uc3QgZGF0YToge1xuICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIGtleTogbnVtYmVyO1xuICAgICAgICB9ID0gSlNPTi5wYXJzZShpdGVtKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnZva2VQYXJhbXMoXG4gICAgICAgICAgICBJZGVudGlmaWVyLmZyb21LZXkoZGF0YS5pZCksXG4gICAgICAgICAgICBkYXRhLmtleSxcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRJbnZva2VQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcGFyYW1zOiBJbnZva2VQYXJhbXMsXG4gICAgICAgIHB1YmxpYyBidWZmZXI6IFVpbnQ4QXJyYXksXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGl0ZW06IEVuZHBvaW50SW52b2tlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhJbnZva2VQYXJhbXMuc2VyaWFsaXplKGl0ZW0ucGFyYW1zKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkoaXRlbS5idWZmZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IEVuZHBvaW50SW52b2tlUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShpdGVtKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gSW52b2tlUGFyYW1zLmRlc2VyaWFsaXplKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludEludm9rZVBhY2tldChwYXJhbXMsIGJ1ZmZlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVzcG9uc2VQYXJhbXMge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBrZXk6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVycm9yOiBzdHJpbmcgfCBudWxsLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBSZXNwb25zZVBhcmFtcyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBpZDogaXRlbS5pZC5rZXkoKSxcbiAgICAgICAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICAgICAgICBlcnJvcjogaXRlbS5lcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBzdHJpbmcpOiBSZXNwb25zZVBhcmFtcyB7XG4gICAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBrZXk6IG51bWJlcjtcbiAgICAgICAgICAgIGVycm9yOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICB9ID0gSlNPTi5wYXJzZShpdGVtKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZVBhcmFtcyhcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbUtleShkYXRhLmlkKSxcbiAgICAgICAgICAgIGRhdGEua2V5LFxuICAgICAgICAgICAgZGF0YS5lcnJvcixcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRSZXNwb25zZVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwYXJhbXM6IFJlc3BvbnNlUGFyYW1zLFxuICAgICAgICBwdWJsaWMgYnVmZmVyOiBVaW50OEFycmF5LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBFbmRwb2ludFJlc3BvbnNlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhSZXNwb25zZVBhcmFtcy5zZXJpYWxpemUoaXRlbS5wYXJhbXMpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShpdGVtLmJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpdGVtOiBVaW50OEFycmF5KTogRW5kcG9pbnRSZXNwb25zZVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFJlc3BvbnNlUGFyYW1zLmRlc2VyaWFsaXplKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFJlc3BvbnNlUGFja2V0KHBhcmFtcywgYnVmZmVyKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0JztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcblxuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFbmRwb2ludEludm9rZWRQYWNrZXQsIEVuZHBvaW50SW52b2tlUGFja2V0LCBFbmRwb2ludFJlZ2lzdGVyUGFja2V0LCBFbmRwb2ludFJlc3BvbnNlUGFja2V0LCBJbnZva2VkUGFyYW1zLCBJbnZva2VQYXJhbXMsIFJlc3BvbnNlUGFyYW1zIH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcblxuZXhwb3J0IGNvbnN0IEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPEVuZHBvaW50RXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKFxuICAgICdlbmRwb2ludCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgRW5kcG9pbnRFeHRlbnNpb24ob211KSxcbik7XG5cbnR5cGUgQ2FsbFByb21pc2UgPSB7XG4gICAgcmVzb2x2ZTogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IHZvaWQ7XG4gICAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcblxudHlwZSBFbmRwb2ludEhhbmRsZXIgPSB7XG4gICAgdHlwZTogRW5kcG9pbnRUeXBlO1xuICAgIGhhbmRsZXI6IChwYWNrZXQ6IEVuZHBvaW50SW52b2tlZFBhY2tldCkgPT4gUHJvbWlzZTxVaW50OEFycmF5Pjtcbn07XG5cbmV4cG9ydCBjbGFzcyBFbmRwb2ludEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8RW5kcG9pbnRFeHRlbnNpb24+ID0gRU5EUE9JTlRfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBib3VuZEVuZHBvaW50cyA9IG5ldyBJZGVudGlmaWVyTWFwPEVuZHBvaW50SGFuZGxlcj4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc3BvbnNlUHJvbWlzZXM6IE1hcDxudW1iZXIsIENhbGxQcm9taXNlPiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIGNhbGxJZDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICB0aGlzLmNhbGxJZCA9IE1hdGguZmxvb3IoKHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSkgKiAxMDAwKTtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBFTkRQT0lOVF9SRUdJU1RFUl9QQUNLRVQsXG4gICAgICAgICAgICBFTkRQT0lOVF9JTlZPS0VfUEFDS0VULFxuICAgICAgICAgICAgRU5EUE9JTlRfSU5WT0tFRF9QQUNLRVQsXG4gICAgICAgICAgICBFTkRQT0lOVF9SRVNQT05TRV9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoRU5EUE9JTlRfSU5WT0tFRF9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlSW52b2tlZChwYWNrZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihFTkRQT0lOVF9SRVNQT05TRV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnJlc3BvbnNlUHJvbWlzZXMuZ2V0KHBhY2tldC5wYXJhbXMua2V5KTtcbiAgICAgICAgICAgIGlmICghcHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFJlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIGtleSAke3BhY2tldC5wYXJhbXMua2V5fSAoJHtwYWNrZXQucGFyYW1zLmlkLmtleSgpfSlgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlUHJvbWlzZXMuZGVsZXRlKHBhY2tldC5wYXJhbXMua2V5KTtcbiAgICAgICAgICAgIGlmIChwYWNrZXQucGFyYW1zLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QobmV3IEVycm9yKHBhY2tldC5wYXJhbXMuZXJyb3IpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9taXNlLnJlc29sdmUocGFja2V0LmJ1ZmZlcik7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlSW52b2tlZChwYWNrZXQ6IEVuZHBvaW50SW52b2tlZFBhY2tldCkge1xuICAgICAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYm91bmRFbmRwb2ludHMuZ2V0KHBhY2tldC5wYXJhbXMuaWQpO1xuICAgICAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlY2VpdmVkIGludm9jYXRpb24gZm9yIHVua25vd24gZW5kcG9pbnQgJHtwYWNrZXQucGFyYW1zLmlkLmtleSgpfSAoJHtwYWNrZXQucGFyYW1zLmtleX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVuZHBvaW50LmhhbmRsZXIocGFja2V0KTtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoRU5EUE9JTlRfUkVTUE9OU0VfUEFDS0VULCBuZXcgRW5kcG9pbnRSZXNwb25zZVBhY2tldChcbiAgICAgICAgICAgICAgICBuZXcgUmVzcG9uc2VQYXJhbXMocGFja2V0LnBhcmFtcy5pZCwgcGFja2V0LnBhcmFtcy5rZXksIG51bGwpLFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChFTkRQT0lOVF9SRVNQT05TRV9QQUNLRVQsIG5ldyBFbmRwb2ludFJlc3BvbnNlUGFja2V0KFxuICAgICAgICAgICAgICAgIG5ldyBSZXNwb25zZVBhcmFtcyhwYWNrZXQucGFyYW1zLmlkLCBwYWNrZXQucGFyYW1zLmtleSwgSlNPTi5zdHJpbmdpZnkoZXJyb3IpKSxcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSgpLFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGFzaygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZW5kcG9pbnRzID0gbmV3IElkZW50aWZpZXJNYXA8SWRlbnRpZmllciB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbmRwb2ludF0gb2YgdGhpcy5ib3VuZEVuZHBvaW50cykge1xuICAgICAgICAgICAgZW5kcG9pbnRzLnNldChrZXksIGVuZHBvaW50LnR5cGUucGVybWlzc2lvbklkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgRW5kcG9pbnRSZWdpc3RlclBhY2tldChlbmRwb2ludHMpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKEVORFBPSU5UX1JFR0lTVEVSX1BBQ0tFVCwgcGFja2V0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYmluZDxSZXEsIFJlcz4oXG4gICAgICAgIHR5cGU6IEVuZHBvaW50VHlwZTxSZXEsIFJlcz4sXG4gICAgICAgIGhhbmRsZXI6IChkYXRhOiBSZXEsIHBhcmFtczogSW52b2tlZFBhcmFtcykgPT4gUHJvbWlzZTxSZXM+LFxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVnaXN0ZXIgZW5kcG9pbnRzIGFmdGVyIHRoZSBjbGllbnQgaGFzIHN0YXJ0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ib3VuZEVuZHBvaW50cy5oYXModHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRW5kcG9pbnQgd2l0aCBpZCAke3R5cGUuaWQua2V5KCl9IGlzIGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm91bmRFbmRwb2ludHMuc2V0KHR5cGUuaWQsIHsgdHlwZSwgaGFuZGxlcjogYXN5bmMgKHsgYnVmZmVyLCBwYXJhbXMgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxID0gdHlwZS5yZXF1ZXN0U2VyaWFsaXplci5kZXNlcmlhbGl6ZShidWZmZXIpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihyZXEsIHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS5yZXNwb25zZVNlcmlhbGl6ZXIuc2VyaWFsaXplKHJlc3VsdCk7XG4gICAgICAgIH0gfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhbGw8UmVxLCBSZXM+KGVuZHBvaW50OiBFbmRwb2ludFR5cGU8UmVxLCBSZXM+LCBkYXRhOiBSZXEpOiBQcm9taXNlPFJlcz4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNhbGxJZCsrO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VWludDhBcnJheT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zZVByb21pc2VzLnNldChrZXksIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChFTkRQT0lOVF9JTlZPS0VfUEFDS0VULCBuZXcgRW5kcG9pbnRJbnZva2VQYWNrZXQoXG4gICAgICAgICAgICBuZXcgSW52b2tlUGFyYW1zKGVuZHBvaW50LmlkLCBrZXkpLFxuICAgICAgICAgICAgZW5kcG9pbnQucmVxdWVzdFNlcmlhbGl6ZXIuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICApKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgICByZXR1cm4gZW5kcG9pbnQucmVzcG9uc2VTZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlc3BvbnNlKTtcbiAgICB9XG59XG5cbmNvbnN0IEVORFBPSU5UX1JFR0lTVEVSX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxFbmRwb2ludFJlZ2lzdGVyUGFja2V0PihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWdpc3RlcicsXG4gICAgc2VyaWFsaXplcjogRW5kcG9pbnRSZWdpc3RlclBhY2tldCxcbn0pO1xuY29uc3QgRU5EUE9JTlRfSU5WT0tFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxFbmRwb2ludEludm9rZVBhY2tldD4oRU5EUE9JTlRfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaW52b2tlJyxcbiAgICBzZXJpYWxpemVyOiBFbmRwb2ludEludm9rZVBhY2tldCxcbn0pO1xuY29uc3QgRU5EUE9JTlRfSU5WT0tFRF9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RW5kcG9pbnRJbnZva2VkUGFja2V0PihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpbnZva2VkJyxcbiAgICBzZXJpYWxpemVyOiBFbmRwb2ludEludm9rZWRQYWNrZXQsXG59KTtcbmNvbnN0IEVORFBPSU5UX1JFU1BPTlNFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxFbmRwb2ludFJlc3BvbnNlUGFja2V0PihFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXNwb25zZScsXG4gICAgc2VyaWFsaXplcjogRW5kcG9pbnRSZXNwb25zZVBhY2tldCxcbn0pO1xuIiwKICAgICJpbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyLCBKc29uVHlwZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RIYW5kbGUgPSB7XG4gICAgaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEh0dHBSZXF1ZXN0ID0gUmVxdWVzdEhhbmRsZSAmIHtcbiAgICBoZWFkZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgbWV0aG9kOiBzdHJpbmc7XG4gICAgcmVkaXJlY3Q6IFJlcXVlc3RSZWRpcmVjdDtcbiAgICB1cmw6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBEYXRhQ2h1bms8VCBleHRlbmRzIEpzb25UeXBlPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBtZXRhOiBULFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYm9keTogVWludDhBcnJheSxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemU8VCBleHRlbmRzIEpzb25UeXBlPihkYXRhOiBEYXRhQ2h1bms8VD4pOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlSlNPTihkYXRhLm1ldGEpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGRhdGEuYm9keSk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZTxUIGV4dGVuZHMgSnNvblR5cGU+KGRhdGE6IFVpbnQ4QXJyYXkpOiBEYXRhQ2h1bms8VD4ge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBtZXRhID0gcmVhZGVyLnJlYWRKU09OPFQ+KCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhQ2h1bmsobWV0YSwgYm9keSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgT211UmVzcG9uc2UgaW1wbGVtZW50cyBSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgb2s6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZWRpcmVjdGVkOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXNUZXh0OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBSZXNwb25zZVR5cGUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvZHk6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+PiB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5VXNlZDogYm9vbGVhbixcbiAgICApIHt9XG5cbiAgICBjbG9uZSgpOiBPbXVSZXNwb25zZSB7XG4gICAgICAgIHJldHVybiBuZXcgT211UmVzcG9uc2UoXG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICB0aGlzLm9rLFxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdGVkLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RleHQsXG4gICAgICAgICAgICB0aGlzLnR5cGUsXG4gICAgICAgICAgICB0aGlzLnVybCxcbiAgICAgICAgICAgIHRoaXMuYm9keSxcbiAgICAgICAgICAgIHRoaXMuYm9keVVzZWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIGFzeW5jIGFycmF5QnVmZmVyKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCk7XG4gICAgfVxuICAgIGJsb2IoKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS5ibG9iKCk7XG4gICAgfVxuICAgIGJ5dGVzKCk6IFByb21pc2U8VWludDhBcnJheTxBcnJheUJ1ZmZlcj4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCkudGhlbigoYnVmKSA9PiBuZXcgVWludDhBcnJheShidWYpKTtcbiAgICB9XG4gICAgZm9ybURhdGEoKTogUHJvbWlzZTxGb3JtRGF0YT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuZm9ybURhdGEoKTtcbiAgICB9XG4gICAganNvbigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuanNvbigpO1xuICAgIH1cbiAgICB0ZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS50ZXh0KCk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciB9IGZyb20gJy4uLy4uL2NvbnN0JztcbmltcG9ydCB7IERhdGFDaHVuaywgUmVxdWVzdEhhbmRsZSB9IGZyb20gJy4vaHR0cCc7XG5cbmV4cG9ydCB0eXBlIFdTRGF0YSA9IHN0cmluZyB8IEFycmF5QnVmZmVyTGlrZSB8IEJsb2IgfCBBcnJheUJ1ZmZlclZpZXc7XG5cbmV4cG9ydCBjb25zdCBXU01zZ1R5cGUgPSB7XG4gICAgQ09OVElOVUFUSU9OOiAweDAsXG4gICAgVEVYVDogMHgxLFxuICAgIEJJTkFSWTogMHgyLFxuICAgIFBJTkc6IDB4OSxcbiAgICBQT05HOiAweEEsXG4gICAgQ0xPU0U6IDB4OCxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBXU0Nsb3NlQ29kZSA9IHtcbiAgICBPSzogMTAwMCxcbiAgICBHT0lOR19BV0FZOiAxMDAxLFxuICAgIFBST1RPQ09MX0VSUk9SOiAxMDAyLFxuICAgIFVOU1VQUE9SVEVEX0RBVEE6IDEwMDMsXG4gICAgQUJOT1JNQUxfQ0xPU1VSRTogMTAwNixcbiAgICBJTlZBTElEX1RFWFQ6IDEwMDcsXG4gICAgUE9MSUNZX1ZJT0xBVElPTjogMTAwOCxcbiAgICBNRVNTQUdFX1RPT19CSUc6IDEwMDksXG4gICAgTUFOREFUT1JZX0VYVEVOU0lPTjogMTAxMCxcbiAgICBJTlRFUk5BTF9FUlJPUjogMTAxMSxcbiAgICBTRVJWSUNFX1JFU1RBUlQ6IDEwMTIsXG4gICAgVFJZX0FHQUlOX0xBVEVSOiAxMDEzLFxuICAgIEJBRF9HQVRFV0FZOiAxMDE0LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0T3BlbiA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsO1xufTtcbmV4cG9ydCB0eXBlIFdlYlNvY2tldENsb3NlID0gUmVxdWVzdEhhbmRsZSAmIHtcbiAgICBjb2RlPzogbnVtYmVyO1xuICAgIHJlYXNvbj86IHN0cmluZyB8IG51bGw7XG59O1xuZXhwb3J0IHR5cGUgV2ViU29ja2V0RXJyb3IgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIHR5cGU6ICdDb25uZWN0aW9uUmVmdXNlZCc7XG4gICAgcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIEV2ZW50TGlzdGVuZXJNYXA8VD4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06ICgoZXZlbnQ6IFRbS10pID0+IHVua25vd24pW11cbn07XG5cbmV4cG9ydCB0eXBlIFdTTXNnID0ge1xuICAgIHR5cGU6ICdvcGVuJztcbiAgICBkYXRhOiBXZWJTb2NrZXRPcGVuO1xufSB8IHtcbiAgICB0eXBlOiAnZXJyb3InO1xuICAgIGRhdGE6IFdlYlNvY2tldEVycm9yO1xufSB8IHtcbiAgICB0eXBlOiAndGV4dCc7XG4gICAgZGF0YTogc3RyaW5nO1xufSB8IHtcbiAgICB0eXBlOiAnYmluYXJ5JztcbiAgICBkYXRhOiBVaW50OEFycmF5O1xufSB8IHtcbiAgICB0eXBlOiAnY2xvc2UnO1xuICAgIGRhdGE6IFdlYlNvY2tldENsb3NlO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0SGFuZGxlID0ge1xuICAgIHdzOiBPbXVXUztcbiAgICBvcGVuOiAocmVzcG9uc2U6IFdlYlNvY2tldE9wZW4pID0+IHZvaWQ7XG4gICAgZGlzcGF0Y2g6IChkYXRhOiBEYXRhQ2h1bms8V1NEYXRhTWV0YT4pID0+IHZvaWQ7XG4gICAgY2xvc2U6IChyZXNwb25zZTogV2ViU29ja2V0Q2xvc2UpID0+IHZvaWQ7XG4gICAgZXJyb3I6IChyZXNwb25zZTogV2ViU29ja2V0RXJyb3IpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBXU0RhdGFNZXRhID0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTpcbiAgICAgICAgfCB0eXBlb2YgV1NNc2dUeXBlLlRFWFRcbiAgICAgICAgfCB0eXBlb2YgV1NNc2dUeXBlLkJJTkFSWVxuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuUElOR1xuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuUE9ORztcbn07XG5cbmV4cG9ydCB0eXBlIFdTSGFuZGxlU3RhdGUgPSB7XG4gICAgdHlwZTogJ2NyZWF0ZWQnIHwgJ3JlY2VpdmluZyc7XG4gICAgaGFuZGxlOiBXZWJTb2NrZXRIYW5kbGU7XG59O1xuXG50eXBlIFdTT3B0aW9ucyA9IHtcbiAgICBhZGRRdWV1ZTogKGRhdGE6IFdTRGF0YSkgPT4gdm9pZDtcbiAgICBkaXNwb3NlKG9wdGlvbnM6IHtcbiAgICAgICAgY29kZT86IG51bWJlcjtcbiAgICAgICAgcmVhc29uPzogc3RyaW5nO1xuICAgIH0pOiB2b2lkO1xufTtcblxuZXhwb3J0IGNsYXNzIE9tdVdTIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFkZFF1ZXVlOiAoZGF0YTogV1NEYXRhKSA9PiB2b2lkLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcG9zZTogKG9wdGlvbnM6IHsgY29kZT86IG51bWJlcjsgcmVhc29uPzogc3RyaW5nIH0pID0+IHZvaWQsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSByZWNlaXZlUXVldWU6IFdTTXNnW10gPSBbXSxcbiAgICAgICAgcHJpdmF0ZSByZWNlaXZlUmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgICAgICBwcml2YXRlIHN0YXR1czogJ2Nvbm5lY3RpbmcnIHwgJ29wZW4nIHwgJ2Nsb3NlZCcgPSAnY29ubmVjdGluZycsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyB0b1dlYlNvY2tldCgpOiBPbXVXZWJTb2NrZXQge1xuICAgICAgICByZXR1cm4gbmV3IE9tdVdlYlNvY2tldCh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBXU09wdGlvbnMpOiBXZWJTb2NrZXRIYW5kbGUge1xuICAgICAgICBjb25zdCB3cyA9IG5ldyBPbXVXUyhvcHRpb25zLmFkZFF1ZXVlLCBvcHRpb25zLmRpc3Bvc2UpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd3MsXG4gICAgICAgICAgICBvcGVuOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvcGVuJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVJlc29sdmU/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BhdGNoOiAoZGF0YTogRGF0YUNodW5rPFdTRGF0YU1ldGE+KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEubWV0YS50eXBlID09PSBXU01zZ1R5cGUuQklOQVJZKSB7XG4gICAgICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdiaW5hcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YS5ib2R5LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0ZXh0RGVjb2Rlci5kZWNvZGUoZGF0YS5ib2R5KSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZTogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2xvc2UnLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVJlc29sdmU/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZChkYXRhOiBXU0RhdGEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRRdWV1ZShkYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2UoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcG9zZSh7IGNvZGUsIHJlYXNvbiB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVjZWl2ZSgpOiBQcm9taXNlPFdTTXNnPiB7XG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVSZXNvbHZlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FscmVhZHkgcmVjZWl2aW5nIGZyb20gYW5vdGhlciBhc3luYyBjYWxsJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhdHVzICE9PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVjZWl2ZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gdGhpcy5yZWNlaXZlUmVzb2x2ZSA9IHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ2Nsb3NlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnb3BlbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdvcGVuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVJlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2VpdmluZyBvbiBhbHJlYWR5IGNsb3NlZCBzb2NrZXQnKTtcbiAgICB9XG5cbiAgICBwcm90b2NvbDogc3RyaW5nID0gJyc7XG4gICAgdXJsOiBzdHJpbmcgPSAnJztcbn1cblxuZXhwb3J0IGNsYXNzIE9tdVdlYlNvY2tldCBpbXBsZW1lbnRzIFdlYlNvY2tldCB7XG4gICAgcHVibGljIENPTk5FQ1RJTkcgPSAwIGFzIGNvbnN0O1xuICAgIHB1YmxpYyBPUEVOID0gMSBhcyBjb25zdDtcbiAgICBwdWJsaWMgQ0xPU0lORyA9IDIgYXMgY29uc3Q7XG4gICAgcHVibGljIENMT1NFRCA9IDMgYXMgY29uc3Q7XG5cbiAgICBiaW5hcnlUeXBlOiBCaW5hcnlUeXBlID0gJ2Jsb2InO1xuICAgIGJ1ZmZlcmVkQW1vdW50OiBudW1iZXIgPSAwO1xuICAgIGV4dGVuc2lvbnM6IHN0cmluZyA9ICcnO1xuICAgIG9uY2xvc2U6ICgodGhpczogV2ViU29ja2V0LCBldjogQ2xvc2VFdmVudCkgPT4gdW5rbm93bikgfCBudWxsID0gbnVsbDtcbiAgICBvbmVycm9yOiAoKHRoaXM6IFdlYlNvY2tldCwgZXY6IEV2ZW50KSA9PiB1bmtub3duKSB8IG51bGwgPSBudWxsO1xuICAgIG9ubWVzc2FnZTogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBNZXNzYWdlRXZlbnQpID0+IHVua25vd24pIHwgbnVsbCA9IG51bGw7XG4gICAgb25vcGVuOiAoKHRoaXM6IFdlYlNvY2tldCwgZXY6IEV2ZW50KSA9PiB1bmtub3duKSB8IG51bGwgPSBudWxsO1xuICAgIHByb3RvY29sOiBzdHJpbmcgPSAnJztcbiAgICByZWFkeVN0YXRlOiAwIHwgMiB8IDEgfCAzID0gMDtcbiAgICB1cmw6IHN0cmluZyA9ICcnO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSB3czogT211V1MsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRMaXN0ZW5lcnM6IEV2ZW50TGlzdGVuZXJNYXA8V2ViU29ja2V0RXZlbnRNYXA+ID0ge1xuICAgICAgICAgICAgY2xvc2U6IFtdLFxuICAgICAgICAgICAgZXJyb3I6IFtdLFxuICAgICAgICAgICAgbWVzc2FnZTogW10sXG4gICAgICAgICAgICBvcGVuOiBbXSxcbiAgICAgICAgfSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWNlaXZlTG9vcCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVjZWl2ZUxvb3AoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgdHlwZSB9ID0gYXdhaXQgdGhpcy53cy5yZWNlaXZlKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ2xvc2VFdmVudCgnY2xvc2UnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBkYXRhLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGRhdGEucmVhc29uID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cmwgPSBkYXRhLnVybDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IGRhdGEucHJvdG9jb2wgPz8gJyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ29wZW4nLCB7fSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXJyb3JFdmVudCgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZGF0YS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5yZWFzb24gPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgTWVzc2FnZUV2ZW50KCdtZXNzYWdlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZlbnQudHlwZV07XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdvcGVuJykge1xuICAgICAgICAgICAgdGhpcy5vbm9wZW4/LihldmVudCBhcyBNZXNzYWdlRXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICB0aGlzLm9uZXJyb3I/LihldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2U/LihldmVudCBhcyBNZXNzYWdlRXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgICAgICAgICB0aGlzLm9uY2xvc2U/LihldmVudCBhcyBDbG9zZUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZW5kKGRhdGE6IHN0cmluZyB8IEFycmF5QnVmZmVyTGlrZSB8IEJsb2IgfCBBcnJheUJ1ZmZlclZpZXcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cy5zZW5kKGRhdGEpO1xuICAgIH1cblxuICAgIGNsb3NlKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLndzLmNsb3NlKGNvZGUsIHJlYXNvbik7XG4gICAgfVxuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0RXZlbnRNYXA+KHR5cGU6IEssIGxpc3RlbmVyOiAodGhpczogV2ViU29ja2V0LCBldjogV2ViU29ja2V0RXZlbnRNYXBbS10pID0+IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyc1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICByZW1vdmVFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBXZWJTb2NrZXRFdmVudE1hcD4odHlwZTogSywgbGlzdGVuZXI6ICh0aGlzOiBXZWJTb2NrZXQsIGV2OiBXZWJTb2NrZXRFdmVudE1hcFtLXSkgPT4gdW5rbm93bik6IHZvaWQge1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW3R5cGVdO1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLAogICAgIlxuaW1wb3J0IHsgdGV4dEVuY29kZXIgfSBmcm9tICcuLi8uLi9jb25zdCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEV4dGVuc2lvbiwgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBEYXRhQ2h1bmssIEh0dHBSZXF1ZXN0LCBPbXVSZXNwb25zZSwgUmVxdWVzdEhhbmRsZSB9IGZyb20gJy4vaHR0cCc7XG5pbXBvcnQgeyBPbXVXUywgV2ViU29ja2V0Q2xvc2UsIFdlYlNvY2tldEVycm9yLCBXZWJTb2NrZXRPcGVuLCBXU0RhdGEsIFdTRGF0YU1ldGEsIFdTSGFuZGxlU3RhdGUsIFdTTXNnVHlwZSB9IGZyb20gJy4vd2Vic29ja2V0JztcblxuZXhwb3J0IGNvbnN0IEhUVFBfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8SHR0cEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnaHR0cCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgSHR0cEV4dGVuc2lvbihvbXUpLFxuKTtcblxuZXhwb3J0IGNvbnN0IEhUVFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gSFRUUF9FWFRFTlNJT05fVFlQRS5qb2luKCdyZXF1ZXN0Jyk7XG5cbmNvbnN0IFJFUVVFU1RfQ1JFQVRFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXF1ZXN0PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlcXVlc3RfY3JlYXRlJyxcbn0pO1xuXG5jb25zdCBSRVFVRVNUX1NFTkQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RGF0YUNodW5rPFJlcXVlc3RIYW5kbGU+PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlcXVlc3Rfc2VuZCcsXG4gICAgc2VyaWFsaXplcjogRGF0YUNodW5rLFxufSk7XG5cbnR5cGUgSHR0cFJlcXVlc3RDbG9zZSA9IFJlcXVlc3RIYW5kbGU7XG5cbmNvbnN0IFJFUVVFU1RfQ0xPU0UgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SHR0cFJlcXVlc3RDbG9zZT4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1ZXN0X2Nsb3NlJyxcbn0pO1xuXG50eXBlIEh0dHBSZXNwb25zZSA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgaGVhZGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHN0YXR1czogbnVtYmVyO1xuICAgIHN0YXR1c1RleHQ6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICBoaXN0b3J5OiBIdHRwUmVzcG9uc2VbXTtcbiAgICByZWRpcmVjdGVkOiBib29sZWFuO1xufTtcblxuY29uc3QgUkVTUE9OU0VfQ1JFQVRFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXNwb25zZT4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXNwb25zZV9jcmVhdGUnLFxufSk7XG5cbmNvbnN0IFJFU1BPTlNFX0NIVU5LID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPERhdGFDaHVuazxSZXF1ZXN0SGFuZGxlPj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXNwb25zZV9jaHVuaycsXG4gICAgc2VyaWFsaXplcjogRGF0YUNodW5rLFxufSk7XG5cbmNvbnN0IFJFU1BPTlNFX0NMT1NFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFJlcXVlc3RIYW5kbGU+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVzcG9uc2VfY2xvc2UnLFxufSk7XG5cbnR5cGUgSGFuZGxlU3RhdGVSZWNlaXZpbmcgPSB7XG4gICAgdHlwZTogJ3JlY2VpdmluZyc7XG4gICAgcmVjZWl2ZShkYXRhOiBVaW50OEFycmF5KTogdm9pZDtcbiAgICBjbG9zZSgpOiB2b2lkO1xufTtcblxudHlwZSBIYW5kbGVTdGF0ZUNyZWF0ZWQgPSB7XG4gICAgdHlwZTogJ2NyZWF0ZWQnO1xuICAgIHNldFJlc3BvbnNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpOiB2b2lkO1xufTtcblxudHlwZSBIYW5kbGVTdGF0ZSA9IEhhbmRsZVN0YXRlQ3JlYXRlZCB8IEhhbmRsZVN0YXRlUmVjZWl2aW5nO1xuXG5jb25zdCBXRUJTT0NLRVRfQ1JFQVRFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXF1ZXN0PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dzX2NyZWF0ZScsXG59KTtcblxuY29uc3QgV0VCU09DS0VUX09QRU4gPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248V2ViU29ja2V0T3Blbj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19vcGVuJyxcbn0pO1xuXG5jb25zdCBXRUJTT0NLRVRfREFUQSA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxEYXRhQ2h1bms8V1NEYXRhTWV0YT4+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3NfZGF0YScsXG4gICAgc2VyaWFsaXplcjogRGF0YUNodW5rLFxufSk7XG5cbmNvbnN0IFdFQlNPQ0tFVF9DTE9TRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxXZWJTb2NrZXRDbG9zZT4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19jbG9zZScsXG59KTtcblxuY29uc3QgV0VCU09DS0VUX0VSUk9SID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFdlYlNvY2tldEVycm9yPihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dzX2Vycm9yJyxcbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVGdXR1cmU8VD4oKToge1xuICAgIHByb21pc2U6IFByb21pc2U8VD47XG4gICAgcmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB2b2lkO1xuICAgIHJlamVjdDogKHJlYXNvbj86IHVua25vd24pID0+IHZvaWQ7XG59IHtcbiAgICBsZXQgcmVzb2x2ZTogKCh2YWx1ZTogVCkgPT4gdm9pZCkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHJlamVjdDogKChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlcywgcmVqKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSByZXM7XG4gICAgICAgIHJlamVjdCA9IHJlajtcbiAgICB9KTtcbiAgICBpZiAoIXJlc29sdmUgfHwgIXJlamVjdCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGZ1dHVyZScpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2UsXG4gICAgICAgIHJlc29sdmUsXG4gICAgICAgIHJlamVjdCxcbiAgICB9O1xufVxuXG50eXBlIFdTU2VuZFRhc2sgPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBkYXRhOiBXU0RhdGE7XG59O1xuXG5leHBvcnQgY2xhc3MgSHR0cEV4dGVuc2lvbiBpbXBsZW1lbnRzIEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8RXh0ZW5zaW9uPiA9IEhUVFBfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZXF1ZXN0Q291bnQ6IG51bWJlciA9IDA7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHBIYW5kbGVzOiBSZWNvcmQ8c3RyaW5nLCBIYW5kbGVTdGF0ZSB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdzSGFuZGxlczogUmVjb3JkPHN0cmluZywgV1NIYW5kbGVTdGF0ZT4gPSB7fTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdzU2VuZFF1ZXVlOiBXU1NlbmRUYXNrW10gPSBbXTtcbiAgICBwcml2YXRlIHdzU2VuZFdhaXRSZXNvbHZlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSxcbiAgICApIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBSRVFVRVNUX0NSRUFURSxcbiAgICAgICAgICAgIFJFUVVFU1RfU0VORCxcbiAgICAgICAgICAgIFJFUVVFU1RfQ0xPU0UsXG4gICAgICAgICAgICBSRVNQT05TRV9DUkVBVEUsXG4gICAgICAgICAgICBSRVNQT05TRV9DSFVOSyxcbiAgICAgICAgICAgIFJFU1BPTlNFX0NMT1NFLFxuICAgICAgICAgICAgV0VCU09DS0VUX0NMT1NFLFxuICAgICAgICAgICAgV0VCU09DS0VUX0NSRUFURSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9EQVRBLFxuICAgICAgICAgICAgV0VCU09DS0VUX09QRU4sXG4gICAgICAgICAgICBXRUJTT0NLRVRfRVJST1IsXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoUkVTUE9OU0VfQ1JFQVRFLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gcmVxdWVzdCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhbmRsZS50eXBlICE9PSAnY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciBhbHJlYWR5IGhhbmRsZWQgcmVxdWVzdCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLnNldFJlc3BvbnNlKHBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFJFU1BPTlNFX0NIVU5LLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5tZXRhLmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biByZXF1ZXN0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ3JlY2VpdmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIGNodW5rIGZvciBub24tcmVjZWl2aW5nIHJlcXVlc3QnLCBwYWNrZXQubWV0YS5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLnJlY2VpdmUocGFja2V0LmJvZHkpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRVNQT05TRV9DTE9TRSwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5odHRwSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ3JlY2VpdmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIGNodW5rIGZvciBub24tcmVjZWl2aW5nIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5jbG9zZSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoV0VCU09DS0VUX09QRU4sIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud3NIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gc29ja2V0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdjcmVhdGVkJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIGFscmVhZHkgaGFuZGxlZCBzb2NrZXQnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUub3BlbihwYWNrZXQpO1xuICAgICAgICAgICAgaGFuZGxlLnR5cGUgPSAncmVjZWl2aW5nJztcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoV0VCU09DS0VUX0RBVEEsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud3NIYW5kbGVzW3BhY2tldC5tZXRhLmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBzb2NrZXQnLCBwYWNrZXQubWV0YS5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhbmRsZS50eXBlICE9PSAncmVjZWl2aW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgY2h1bmsgZm9yIG5vbi1yZWNlaXZpbmcgc29ja2V0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUuZGlzcGF0Y2gocGFja2V0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoV0VCU09DS0VUX0NMT1NFLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHNvY2tldCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLmhhbmRsZS5jbG9zZShwYWNrZXQpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoV0VCU09DS0VUX0VSUk9SLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHNvY2tldCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLmhhbmRsZS5lcnJvcihwYWNrZXQpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5ldmVudC5yZWFkeS5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53c1NlbmRMb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgd3NTZW5kTG9vcCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbmQgPSB0aGlzLndzU2VuZFF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoc2VuZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5ID0gYXdhaXQgdG9VaW50OEFycmF5KHNlbmQuZGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiBzZW5kLmRhdGEgPT09ICdzdHJpbmcnID8gV1NNc2dUeXBlLlRFWFQgOiBXU01zZ1R5cGUuQklOQVJZO1xuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoV0VCU09DS0VUX0RBVEEsIG5ldyBEYXRhQ2h1bmsoeyBpZDogc2VuZC5pZCwgdHlwZSB9LCBhcnJheSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndzU2VuZFdhaXRSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVIZWFkZXJzKHJlcXVlc3Q6IFJlcXVlc3QsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IGtleXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgY29uc3Qgc2V0ID0gKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsb3dlcktleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxLZXkgPSBrZXlzW2xvd2VyS2V5XTtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbEtleSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzW29yaWdpbmFsS2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAga2V5c1tsb3dlcktleV0gPSBrZXk7XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW5pdD8uaGVhZGVycykge1xuICAgICAgICAgICAgaWYgKGluaXQuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBpbml0LmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5pdC5oZWFkZXJzKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGluaXQuaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBpbml0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbml0LmhlYWRlcnNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhZGVycztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlSWQoKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiB0aGlzLm9tdS5hcHAuaWQuam9pbihgJHtwZXJmb3JtYW5jZS50aW1lT3JpZ2lufS0ke3RoaXMucmVxdWVzdENvdW50Kyt9YCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3QoaW5wdXQ6IHN0cmluZyB8IFVSTCB8IGdsb2JhbFRoaXMuUmVxdWVzdCwgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTx7IHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U7IHN0cmVhbTogUmVhZGFibGVTdHJlYW0gfT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpO1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2VuZXJhdGVJZCgpLmtleSgpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFJFUVVFU1RfQ1JFQVRFLCB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGhlYWRlcjogdGhpcy5nZW5lcmF0ZUhlYWRlcnMocmVxdWVzdCwgaW5pdCksXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgICAgcmVkaXJlY3Q6IHJlcXVlc3QucmVkaXJlY3QsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcXVlc3QuYm9keSkge1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gcmVxdWVzdC5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVRVNUX1NFTkQsIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0YTogeyBpZCB9LFxuICAgICAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVRVNUX0NMT1NFLCB7IGlkIH0pO1xuICAgICAgICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgICAgICBjb25zdCByZXNwb25zZUZ1dHVyZSA9IGNyZWF0ZUZ1dHVyZTxIdHRwUmVzcG9uc2U+KCk7XG4gICAgICAgIGxldCBjaHVua0V2ZW50ID0gY3JlYXRlRnV0dXJlPGJvb2xlYW4+KCk7XG4gICAgICAgIGNvbnN0IHNldFJlc3BvbnNlID0gKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJlc3BvbnNlRnV0dXJlLnJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5odHRwSGFuZGxlc1tpZF0gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3JlY2VpdmluZycsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZShkYXRhOiBVaW50OEFycmF5PEFycmF5QnVmZmVyTGlrZT4pIHtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rRXZlbnQucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtFdmVudCA9IGNyZWF0ZUZ1dHVyZTxib29sZWFuPigpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xvc2UoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rRXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaHR0cEhhbmRsZXNbaWRdID0ge1xuICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZWQnLFxuICAgICAgICAgICAgc2V0UmVzcG9uc2UsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2VGdXR1cmUucHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgc3RyZWFtOiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgICAgICAgICAgICAgIGFzeW5jIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGF3YWl0IGNodW5rRXZlbnQucHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBjaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2h1bmspIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaChpbnB1dDogc3RyaW5nIHwgVVJMIHwgZ2xvYmFsVGhpcy5SZXF1ZXN0LCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPE9tdVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHsgcmVzcG9uc2UsIHN0cmVhbSB9ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBPbXVSZXNwb25zZShcbiAgICAgICAgICAgIG5ldyBIZWFkZXJzKHJlc3BvbnNlLmhlYWRlciksXG4gICAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCxcbiAgICAgICAgICAgIHJlc3BvbnNlLnJlZGlyZWN0ZWQsXG4gICAgICAgICAgICByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgICAgJ2Jhc2ljJyxcbiAgICAgICAgICAgIHJlc3BvbnNlLnVybCxcbiAgICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB3cyhpbnB1dDogc3RyaW5nIHwgVVJMIHwgZ2xvYmFsVGhpcy5SZXF1ZXN0LCBvcHRpb25zPzoge1xuICAgICAgICBtZXRob2Q/OiBzdHJpbmc7XG4gICAgICAgIGF1dG9jbG9zZT86IGJvb2xlYW47XG4gICAgICAgIGF1dG9waW5nPzogYm9vbGVhbjtcbiAgICAgICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgfSk6IFByb21pc2U8T211V1M+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdlbmVyYXRlSWQoKTtcbiAgICAgICAgY29uc3QgaGFuZGxlID0gT211V1MuY3JlYXRlKHtcbiAgICAgICAgICAgIGFkZFF1ZXVlOiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud3NTZW5kUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBpZC5rZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLndzU2VuZFdhaXRSZXNvbHZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcG9zZTogKG9wdGlvbnM6IHsgY29kZT86IG51bWJlcjsgcmVhc29uPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFdFQlNPQ0tFVF9DTE9TRSwge1xuICAgICAgICAgICAgICAgICAgICBpZDogaWQua2V5KCksXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IG9wdGlvbnMuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBvcHRpb25zLnJlYXNvbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy53c0hhbmRsZXNbaWQua2V5KCldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMud3NIYW5kbGVzW2lkLmtleSgpXSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGVkJyxcbiAgICAgICAgICAgIGhhbmRsZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChXRUJTT0NLRVRfQ1JFQVRFLCB7XG4gICAgICAgICAgICBpZDogaWQua2V5KCksXG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMuZ2VuZXJhdGVIZWFkZXJzKHJlcXVlc3QsIG9wdGlvbnMpLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBoYW5kbGUud3M7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0b1VpbnQ4QXJyYXkoZGF0YTogc3RyaW5nIHwgQXJyYXlCdWZmZXJMaWtlIHwgQmxvYiB8IEFycmF5QnVmZmVyVmlldyk6IFByb21pc2U8VWludDhBcnJheTxBcnJheUJ1ZmZlckxpa2U+PiB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdGV4dEVuY29kZXIuZW5jb2RlKGRhdGEpO1xuICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBkYXRhLmFycmF5QnVmZmVyKCk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEgYXMgQXJyYXlCdWZmZXJMaWtlKTtcbiAgICB9XG59XG4iLAogICAgIlxudHlwZSBUYXNrID0gKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGNsYXNzIExvY2sge1xuICAgIHByaXZhdGUgdGFza3M6IChUYXNrKVtdID0gW107XG4gICAgcHJpdmF0ZSB3YWl0ZXI6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgd2FpdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMud2FpdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWl0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53YWl0ZXIgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVuVGFza3MgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMudGFza3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gdGhpcy50YXNrcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGFzaygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMud2FpdGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcnVuVGFza3MoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXNlPFQ+KGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXNrID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYXdhaXQgcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnRhc2tzLnB1c2godGFzayk7XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXQoKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFJlZ2lzdHJ5UGVybWlzc2lvbnMsIFJlZ2lzdHJ5UGVybWlzc2lvbnNKU09OIH0gZnJvbSAnLi9yZWdpc3RyeSc7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyeVBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBVaW50OEFycmF5IHwgbnVsbCxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBSZWdpc3RyeVBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlQm9vbGVhbihwYWNrZXQudmFsdWUgIT09IG51bGwpO1xuICAgICAgICBpZiAocGFja2V0LnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KHBhY2tldC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBSZWdpc3RyeVBhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHJlYWRlci5yZWFkQm9vbGVhbigpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGV4aXN0aW5nID8gcmVhZGVyLnJlYWRVaW50OEFycmF5KCkgOiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJ5UGFja2V0KGlkLCB2YWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyUGFja2V0SlNPTiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uczogUmVnaXN0cnlQZXJtaXNzaW9uc0pTT047XG59XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RlclBhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zOiBSZWdpc3RyeVBlcm1pc3Npb25zLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogUmVnaXN0ZXJQYWNrZXQpOiBSZWdpc3RlclBhY2tldEpTT04ge1xuICAgICAgICBjb25zdCB7IHBlcm1pc3Npb25zOiBwZXJtcyB9ID0gcGFja2V0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHBhY2tldC5pZC5rZXkoKSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgICAgICAgICAgYWxsOiBwZXJtcy5hbGwgPyBJZGVudGlmaWVyLmZyb20ocGVybXMuYWxsKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWFkOiBwZXJtcy5yZWFkID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLnJlYWQpLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHdyaXRlOiBwZXJtcy53cml0ZSA/IElkZW50aWZpZXIuZnJvbShwZXJtcy53cml0ZSkua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogUmVnaXN0ZXJQYWNrZXRKU09OKTogUmVnaXN0ZXJQYWNrZXQge1xuICAgICAgICBjb25zdCB7IHBlcm1pc3Npb25zOiBwZXJtcyB9ID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShkYXRhLmlkKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGw6IHBlcm1zLmFsbCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5hbGwpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlYWQ6IHBlcm1zLnJlYWQgPyBJZGVudGlmaWVyLmZyb20ocGVybXMucmVhZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgd3JpdGU6IHBlcm1zLndyaXRlID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLndyaXRlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgTG9jayB9IGZyb20gJy4uLy4uL2xvY2suanMnO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0JztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgeyBKc29uVHlwZSwgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludC9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyB0eXBlIEV4dGVuc2lvbiwgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmltcG9ydCB7IFJlZ2lzdGVyUGFja2V0LCBSZWdpc3RyeVBhY2tldCB9IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlZ2lzdHJ5LCBSZWdpc3RyeVR5cGUsIFdyaXRhYmxlIH0gZnJvbSAnLi9yZWdpc3RyeS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyeUV4dGVuc2lvbiBpbXBsZW1lbnRzIEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8UmVnaXN0cnlFeHRlbnNpb24+ID0gUkVHSVNUUllfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyaWVzID0gbmV3IElkZW50aWZpZXJNYXA8UmVnaXN0cnk8dW5rbm93bj4+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgUkVHSVNUUllfUkVHSVNURVJfUEFDS0VULFxuICAgICAgICAgICAgUkVHSVNUUllfVVBEQVRFX1BBQ0tFVCxcbiAgICAgICAgICAgIFJFR0lTVFJZX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVSZWdpc3RyeTxUPihyZWdpc3RyeVR5cGU6IFJlZ2lzdHJ5VHlwZTxUPik6IFJlZ2lzdHJ5PFQ+IHtcbiAgICAgICAgaWYgKHRoaXMucmVnaXN0cmllcy5oYXMocmVnaXN0cnlUeXBlLmlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpc3RyeSB3aXRoIGlkZW50aWZpZXIgJyR7cmVnaXN0cnlUeXBlLmlkfScgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZ2lzdHJ5SW1wbCh0aGlzLm9tdSwgcmVnaXN0cnlUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHJlZ2lzdHJ5VHlwZTogUmVnaXN0cnlUeXBlPFQ+KTogUmVnaXN0cnk8VD4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gcmVnaXN0cnlUeXBlLmlkO1xuICAgICAgICBsZXQgcmVnaXN0cnkgPSB0aGlzLnJlZ2lzdHJpZXMuZ2V0KGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVnaXN0cnkgPSB0aGlzLmNyZWF0ZVJlZ2lzdHJ5KHJlZ2lzdHJ5VHlwZSk7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJpZXMuc2V0KGlkZW50aWZpZXIsIHJlZ2lzdHJ5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVnaXN0cnkgYXMgUmVnaXN0cnk8VD47XG4gICAgfVxuXG4gICAgcHVibGljIGpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBkZWZhdWx0OiBUOyBzZXJpYWxpemVyPzogU2VyaWFsaXplcjxULCBEPiB9KTogUmVnaXN0cnk8VD4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJpZXMuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lzdHJ5IHdpdGggbmFtZSAnJHtuYW1lfScgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxUPihpZGVudGlmaWVyLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBvcHRpb25zLmRlZmF1bHQsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zLnNlcmlhbGl6ZXIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWdpc3RyeSh0YWJsZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVkPFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBkZWZhdWx0OiBUOyBzZXJpYWxpemVyOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IH0pOiBSZWdpc3RyeTxUPiB7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLm9tdS5hcHAuaWQuam9pbihuYW1lKTtcbiAgICAgICAgaWYgKHRoaXMucmVnaXN0cmllcy5oYXMoaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnaXN0cnkgd2l0aCBuYW1lICcke25hbWV9JyBhbHJlYWR5IGV4aXN0c2ApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlVHlwZSA9IFJlZ2lzdHJ5VHlwZS5jcmVhdGVTZXJpYWxpemVkPFQ+KGlkZW50aWZpZXIsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IG9wdGlvbnMuZGVmYXVsdCxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI6IG9wdGlvbnMuc2VyaWFsaXplcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVJlZ2lzdHJ5KHRhYmxlVHlwZSk7XG4gICAgfVxufVxuXG5jbGFzcyBSZWdpc3RyeUltcGw8VD4gaW1wbGVtZW50cyBSZWdpc3RyeTxUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxbVF0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jazogTG9jayA9IG5ldyBMb2NrKCk7XG4gICAgcHJpdmF0ZSBsaXN0ZW5pbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgdmFsdWU6IFQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFJlZ2lzdHJ5VHlwZTxUPixcbiAgICApIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHR5cGUuZGVmYXVsdFZhbHVlO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFJFR0lTVFJZX1VQREFURV9QQUNLRVQsIChwYWNrZXQpID0+XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVVwZGF0ZShwYWNrZXQpLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRUYXNrKCgpID0+IHRoaXMub25UYXNrKCkpO1xuICAgIH1cblxuICAgIGFzeW5jICNnZXQoKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFJFR0lTVFJZX0dFVF9FTkRQT0lOVCwgdGhpcy50eXBlLmlkKTtcbiAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlc3VsdC52YWx1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgI3NldCh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFJFR0lTVFJZX1VQREFURV9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy50eXBlLnNlcmlhbGl6ZXIuc2VyaWFsaXplKHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldCgpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxvY2sudXNlKGFzeW5jICgpID0+IHRoaXMuI2dldCgpKTtcbiAgICAgICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0KHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9jay51c2UoYXN5bmMgKCkgPT4gdGhpcy4jc2V0KHZhbHVlKSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUoZm46ICh2YWx1ZTogVCkgPT4gUHJvbWlzZUxpa2U8VD4gfCBUKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5sb2NrLnVzZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuI2dldCgpO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhd2FpdCBmbih2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNzZXQobmV3VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbW9kaWZ5KGZuOiAodmFsdWU6IFQpID0+IFByb21pc2VMaWtlPFQ+IHwgVCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMubG9jay51c2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLiNnZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYXdhaXQgZm4odmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jc2V0KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3RlbihoYW5kbGVyOiAodmFsdWU6IFQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKTogVW5saXN0ZW4ge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVuaW5nICYmIHRoaXMub211LnJlYWR5KSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFJFR0lTVFJZX0xJU1RFTl9QQUNLRVQsIHRoaXMudHlwZS5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5ldmVudEVtaXR0ZXIubGlzdGVuKGhhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlVXBkYXRlKGRhdGE6IFJlZ2lzdHJ5UGFja2V0KTogdm9pZCB7XG4gICAgICAgIGlmICghZGF0YS5pZC5pc0VxdWFsKHRoaXMudHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudHlwZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRhc2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRUdJU1RSWV9MSVNURU5fUEFDS0VULCB0aGlzLnR5cGUuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy50eXBlLmlkLmlzU3VicGF0aE9mKHRoaXMub211LmFwcC5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9tdS5zZW5kKFJFR0lTVFJZX1JFR0lTVEVSX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMudHlwZS5pZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB0aGlzLnR5cGUucGVybWlzc2lvbnMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wYXRTdmVsdGUoKTogV3JpdGFibGU8VD4ge1xuICAgICAgICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgICAgICAgbGV0IHZhbHVlOiBUID0gdGhpcy52YWx1ZTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gbmV3IFNldDwodmFsdWU6IFQpID0+IHZvaWQ+KCk7XG4gICAgICAgIHRoaXMubGlzdGVuKChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChydW4pID0+IHtcbiAgICAgICAgICAgICAgICBydW4odmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0OiAodmFsdWU6IFQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnaXN0cnkgJHt0aGlzLnR5cGUuaWQua2V5KCl9IGlzIG5vdCByZWFkeWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3Vic2NyaWJlOiAocnVuKSA9PiB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChydW4pO1xuICAgICAgICAgICAgICAgIHJ1bih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShydW4pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlOiAoZm4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnaXN0cnkgJHt0aGlzLnR5cGUuaWQua2V5KCl9IGlzIG5vdCByZWFkeWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZShmbik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2FpdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxSZWdpc3RyeUV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAncmVnaXN0cnknLFxuICAgIChvbXU6IE9tdSkgPT4gbmV3IFJlZ2lzdHJ5RXh0ZW5zaW9uKG9tdSksXG4pO1xuZXhwb3J0IGNvbnN0IFJFR0lTVFJZX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBSRUdJU1RSWV9FWFRFTlNJT05fVFlQRS5qb2luKCdwZXJtaXNzaW9uJyk7XG5jb25zdCBSRUdJU1RSWV9SRUdJU1RFUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UmVnaXN0ZXJQYWNrZXQ+KFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlZ2lzdGVyJyxcbiAgICBzZXJpYWxpemVyOiBSZWdpc3RlclBhY2tldCxcbn0pO1xuY29uc3QgUkVHSVNUUllfVVBEQVRFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxSZWdpc3RyeVBhY2tldD4oXG4gICAgUkVHSVNUUllfRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAndXBkYXRlJyxcbiAgICAgICAgc2VyaWFsaXplcjogUmVnaXN0cnlQYWNrZXQsXG4gICAgfSxcbik7XG5jb25zdCBSRUdJU1RSWV9MSVNURU5fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2xpc3RlbicsXG4gICAgc2VyaWFsaXplcjogSWRlbnRpZmllcixcbn0pO1xuY29uc3QgUkVHSVNUUllfR0VUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8SWRlbnRpZmllciwgUmVnaXN0cnlQYWNrZXQ+KFxuICAgIFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2dldCcsXG4gICAgICAgIHJlcXVlc3RTZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvSnNvbigpLFxuICAgICAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFJlZ2lzdHJ5UGFja2V0LFxuICAgICAgICBwZXJtaXNzaW9uSWQ6IFJFR0lTVFJZX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbik7XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgTG9jYWxlIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2xvY2FsZS5qcyc7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFRleHQgfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgdHlwZSB7IEV4dGVuc2lvbiB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IFJlZ2lzdHJ5VHlwZSwgdHlwZSBSZWdpc3RyeSB9IGZyb20gJy4uL3JlZ2lzdHJ5JztcblxuZXhwb3J0IGNvbnN0IEkxOE5fRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8STE4bkV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZSgnaTE4bicsIChjbGllbnQpID0+IG5ldyBJMThuRXh0ZW5zaW9uKGNsaWVudCkpO1xuXG5leHBvcnQgY29uc3QgSTE4Tl9TRVRfTE9DQUxFU19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gSTE4Tl9FWFRFTlNJT05fVFlQRS5qb2luKCdsb2NhbGVzJywgJ3NldCcpO1xuZXhwb3J0IGNvbnN0IEkxOE5fR0VUX0xPQ0FMRVNfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IEkxOE5fRVhURU5TSU9OX1RZUEUuam9pbignbG9jYWxlcycsICdnZXQnKTtcbmNvbnN0IEkxOE5fTE9DQUxFU19SRUdJU1RSWV9UWVBFID0gUmVnaXN0cnlUeXBlLmNyZWF0ZUpzb248TG9jYWxlW10+KEkxOE5fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnbG9jYWxlcycsXG4gICAgZGVmYXVsdFZhbHVlOiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IFtdIDogd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXMgYXMgTG9jYWxlW10sXG59KTtcblxuZXhwb3J0IGNsYXNzIEkxOG5FeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPEkxOG5FeHRlbnNpb24+ID0gSTE4Tl9FWFRFTlNJT05fVFlQRTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbG9jYWxlc1JlZ2lzdHJ5OiBSZWdpc3RyeTxMb2NhbGVbXT47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIHRoaXMubG9jYWxlc1JlZ2lzdHJ5ID0gb211LnJlZ2lzdHJpZXMuZ2V0KEkxOE5fTE9DQUxFU19SRUdJU1RSWV9UWVBFKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJhbnNsYXRlKGxvY2FsaXplZFRleHQ6IExvY2FsaXplZFRleHQpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBsb2NhbGVzID0gdGhpcy5sb2NhbGVzUmVnaXN0cnkudmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYWxpemVkVGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5zZWxlY3RCZXN0VHJhbnNsYXRpb24obG9jYWxlcywgbG9jYWxpemVkVGV4dCk7XG4gICAgICAgIGlmICghdHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGxvY2FsaXplZFRleHQpWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0QmVzdFRyYW5zbGF0aW9uKFxuICAgICAgICBsb2NhbGVzOiByZWFkb25seSBMb2NhbGVbXSxcbiAgICAgICAgbG9jYWxpemVkVGV4dDogTG9jYWxpemVkVGV4dCxcbiAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsaXplZFRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxpemVkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBsb2NhbGl6ZWRUZXh0O1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZExvY2FsZXMgPSBsb2NhbGVzLnJlZHVjZSgoYWNjLCBsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGwuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBhY2MucHVzaChwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCctJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10gYXMgc3RyaW5nW10pO1xuICAgICAgICBmb3IgKGNvbnN0IGwgb2YgdHJhbnNmb3JtZWRMb2NhbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uc1tsXTtcbiAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2NhbGUobG9jYWxlOiBMb2NhbGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVzUmVnaXN0cnkuc2V0KGxvY2FsZSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IGVudW0gTG9nVHlwZSB7XG4gICAgRVJST1IgPSAnZXJyb3InLFxuICAgIFdBUk5JTkcgPSAnd2FybmluZycsXG4gICAgSU5GTyA9ICdpbmZvJyxcbiAgICBERUJVRyA9ICdkZWJ1ZycsXG59XG5cbmV4cG9ydCB0eXBlIExvZ01lc3NhZ2UgPSB7XG4gICAgdHlwZTogTG9nVHlwZTtcbiAgICB0ZXh0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgTG9nUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogTG9nTWVzc2FnZSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShpdGVtOiBMb2dQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGl0ZW0uaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoaXRlbS5tZXNzYWdlLnR5cGUpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcoaXRlbS5tZXNzYWdlLnRleHQpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaXRlbTogVWludDhBcnJheSk6IExvZ1BhY2tldCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbVVpbnQ4QXJyYXkoaXRlbSk7XG4gICAgICAgIGNvbnN0IGlkID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHJlYWRlci5yZWFkU3RyaW5nKCkgYXMgTG9nVHlwZTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHR5cGUsIHRleHQgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2dQYWNrZXQoSWRlbnRpZmllci5mcm9tS2V5KGlkKSwgbWVzc2FnZSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHsgTG9nTWVzc2FnZSB9IGZyb20gJy4vcGFja2V0cy5qcyc7XG5pbXBvcnQgeyBMb2dQYWNrZXQsIExvZ1R5cGUgfSBmcm9tICcuL3BhY2tldHMuanMnO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPExvZ2dlckV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnbG9nZ2VyJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgTG9nZ2VyRXh0ZW5zaW9uKGNsaWVudCksXG4pO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSX0xPR19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gTE9HR0VSX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ2xvZycpO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSX0xPR19QQUNLRVQ6IFBhY2tldFR5cGU8TG9nUGFja2V0PiA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxMb2dQYWNrZXQ+KExPR0dFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsb2cnLFxuICAgIHNlcmlhbGl6ZXI6IExvZ1BhY2tldCxcbn0pO1xuZXhwb3J0IGNvbnN0IExPR0dFUl9MSVNURU5fUEFDS0VUOiBQYWNrZXRUeXBlPElkZW50aWZpZXI+ID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KExPR0dFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcblxudHlwZSBMb2dMaXN0ZW5lciA9IChtZXNzYWdlOiBMb2dNZXNzYWdlKSA9PiB2b2lkO1xuZXhwb3J0IGNsYXNzIExvZ2dlckV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8TG9nZ2VyRXh0ZW5zaW9uPiA9IExPR0dFUl9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogSWRlbnRpZmllck1hcDxMb2dMaXN0ZW5lcltdPiA9IG5ldyBJZGVudGlmaWVyTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KExPR0dFUl9MT0dfUEFDS0VULCBMT0dHRVJfTElTVEVOX1BBQ0tFVCk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoTE9HR0VSX0xPR19QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpcy5saXN0ZW5lcnMuZ2V0KHBhY2tldC5pZCk7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5mb3JFYWNoKChpdCkgPT4gaXQocGFja2V0Lm1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvZyhtZXNzYWdlOiBMb2dNZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBMb2dQYWNrZXQodGhpcy5vbXUuYXBwLmlkLCBtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChMT0dHRVJfTE9HX1BBQ0tFVCwgcGFja2V0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXJyb3IodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKHsgdHlwZTogTG9nVHlwZS5FUlJPUiwgdGV4dCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2FybmluZyh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2coeyB0eXBlOiBMb2dUeXBlLldBUk5JTkcsIHRleHQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGluZm8odGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKHsgdHlwZTogTG9nVHlwZS5JTkZPLCB0ZXh0IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWJ1Zyh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2coeyB0eXBlOiBMb2dUeXBlLkRFQlVHLCB0ZXh0IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0ZW4oaWQ6IElkZW50aWZpZXIsIGxpc3RlbmVyOiBMb2dMaXN0ZW5lcik6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5vblJlYWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKExPR0dFUl9MSVNURU5fUEFDS0VULCBpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaXN0ID0gdGhpcy5saXN0ZW5lcnMuZ2V0KGlkKSA/PyBbXTtcbiAgICAgICAgbGlzdC5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuc2V0KGlkLCBsaXN0KTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGxpc3Quc3BsaWNlKGxpc3QuaW5kZXhPZihsaXN0ZW5lciksIDEpO1xuICAgICAgICB9O1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFRleHQgfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbkxldmVsID0gJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJztcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbk1ldGFkYXRhID0ge1xuICAgIG5hbWU6IExvY2FsaXplZFRleHQ7XG4gICAgbm90ZT86IExvY2FsaXplZFRleHQ7XG4gICAgbGV2ZWw6IFBlcm1pc3Npb25MZXZlbDtcbn07XG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25UeXBlSnNvbiA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGE7XG59O1xuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblR5cGUge1xuICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE6IFBlcm1pc3Npb25NZXRhZGF0YTtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgaWQ6IElkZW50aWZpZXI7IG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGEgfSkge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucy5pZDtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG9wdGlvbnMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG1ldGFkYXRhOiBQZXJtaXNzaW9uTWV0YWRhdGE7XG4gICAgICAgIH0sXG4gICAgKTogUGVybWlzc2lvblR5cGUge1xuICAgICAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25UeXBlKHtcbiAgICAgICAgICAgIGlkOiBJZGVudGlmaWVyLmZyb20oaWRlbnRpZmllciksXG4gICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IFBlcm1pc3Npb25UeXBlKTogUGVybWlzc2lvblR5cGVKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBkYXRhLmlkLmtleSgpLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uOiBQZXJtaXNzaW9uVHlwZUpzb24pOiBQZXJtaXNzaW9uVHlwZSB7XG4gICAgICAgIHJldHVybiBuZXcgUGVybWlzc2lvblR5cGUoe1xuICAgICAgICAgICAgaWQ6IElkZW50aWZpZXIuZnJvbUtleShqc29uLmlkKSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBqc29uLm1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAsIElkZW50aWZpZXJTZXQsIEludG9JZCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludC9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcblxuaW1wb3J0IHsgUGVybWlzc2lvblR5cGUgfSBmcm9tICcuL3Blcm1pc3Npb24uanMnO1xuXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxQZXJtaXNzaW9uRXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKFxuICAgICdwZXJtaXNzaW9uJyxcbiAgICAoY2xpZW50KSA9PiBuZXcgUGVybWlzc2lvbkV4dGVuc2lvbihjbGllbnQpLFxuKTtcbmNvbnN0IFBFUk1JU1NJT05fUkVHSVNURVJfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFBlcm1pc3Npb25UeXBlW10+KFxuICAgIFBFUk1JU1NJT05fRVhURU5TSU9OX1RZUEUsXG4gICAge1xuICAgICAgICBuYW1lOiAncmVnaXN0ZXInLFxuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKFBlcm1pc3Npb25UeXBlKS50b0FycmF5KCksXG4gICAgfSxcbik7XG5jb25zdCBQRVJNSVNTSU9OX1JFUVVJUkVfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXJbXT4oUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1aXJlJyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvQXJyYXkoKSxcbn0pO1xuY29uc3QgUEVSTUlTU0lPTl9SRVFVRVNUX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZUpzb248SWRlbnRpZmllcltdLCB2b2lkPihcbiAgICBQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFLFxuICAgIHtcbiAgICAgICAgbmFtZTogJ3JlcXVlc3QnLFxuICAgICAgICByZXF1ZXN0U2VyaWFsaXplcjogU2VyaWFsaXplci5vZihJZGVudGlmaWVyKS50b0FycmF5KCksXG4gICAgfSxcbik7XG5jb25zdCBQRVJNSVNTSU9OX0dSQU5UX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxQZXJtaXNzaW9uVHlwZVtdPihQRVJNSVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2dyYW50JyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKFBlcm1pc3Npb25UeXBlKS50b0FycmF5KCksXG59KTtcblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25FeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFBlcm1pc3Npb25FeHRlbnNpb24+ID0gUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zID0gbmV3IElkZW50aWZpZXJNYXA8UGVybWlzc2lvblR5cGU+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RlcmVkUGVybWlzc2lvbnMgPSBuZXcgSWRlbnRpZmllck1hcDxQZXJtaXNzaW9uVHlwZT4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcXVpcmVkUGVybWlzc2lvbnMgPSBuZXcgSWRlbnRpZmllclNldCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFBFUk1JU1NJT05fUkVHSVNURVJfUEFDS0VULFxuICAgICAgICAgICAgUEVSTUlTU0lPTl9SRVFVSVJFX1BBQ0tFVCxcbiAgICAgICAgICAgIFBFUk1JU1NJT05fR1JBTlRfUEFDS0VULFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFBFUk1JU1NJT05fR1JBTlRfUEFDS0VULCAocGVybWlzc2lvbnMpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiBwZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnMuc2V0KHBlcm1pc3Npb24uaWQsIHBlcm1pc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkVGFzaygoKSA9PiB0aGlzLm9uVGFzaygpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGFzaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LmFwcC50eXBlID09PSAncmVtb3RlJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdGVyZWRQZXJtaXNzaW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChcbiAgICAgICAgICAgICAgICBQRVJNSVNTSU9OX1JFR0lTVEVSX1BBQ0tFVCxcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMucmVnaXN0ZXJlZFBlcm1pc3Npb25zLnZhbHVlcygpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChcbiAgICAgICAgICAgICAgICBQRVJNSVNTSU9OX1JFUVVJUkVfUEFDS0VULFxuICAgICAgICAgICAgICAgIEFycmF5LmZyb20odGhpcy5yZXF1aXJlZFBlcm1pc3Npb25zLnZhbHVlcygpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXIocGVybWlzc2lvbjogUGVybWlzc2lvblR5cGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMub211LnNlbmQoUEVSTUlTU0lPTl9SRUdJU1RFUl9QQUNLRVQsIFtwZXJtaXNzaW9uXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkUGVybWlzc2lvbnMuc2V0KHBlcm1pc3Npb24uaWQsIHBlcm1pc3Npb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXF1aXJlKC4uLnBlcm1pc3Npb25JZHM6IEludG9JZFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlkcyA9IHBlcm1pc3Npb25JZHMubWFwKElkZW50aWZpZXIuZnJvbSk7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBpZHMuZmlsdGVyKChpZCkgPT4gIXRoaXMucGVybWlzc2lvbnMuaGFzKGlkKSk7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQZXJtaXNzaW9ucyBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjbGllbnQgc3RhcnRzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRQZXJtaXNzaW9ucy5hZGQoaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3QoLi4ucGVybWlzc2lvbklkczogSWRlbnRpZmllcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFBFUk1JU1NJT05fUkVRVUVTVF9FTkRQT0lOVCwgcGVybWlzc2lvbklkcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwZXJtaXNzaW9uSWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5oYXMocGVybWlzc2lvbklkZW50aWZpZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXF1aXJlZChwZXJtaXNzaW9uSWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1aXJlZFBlcm1pc3Npb25zLmhhcyhwZXJtaXNzaW9uSWRlbnRpZmllcik7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQvcGFja2V0LmpzJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludC9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLmpzJztcbmltcG9ydCB7IFRhYmxlLCBUYWJsZVR5cGUgfSBmcm9tICcuLi90YWJsZS90YWJsZS5qcyc7XG5cbmV4cG9ydCBjb25zdCBQTFVHSU5fRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8UGx1Z2luRXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKFxuICAgICdwbHVnaW4nLFxuICAgIChvbXU6IE9tdSkgPT4gbmV3IFBsdWdpbkV4dGVuc2lvbihvbXUpLFxuKTtcblxuZXhwb3J0IGNsYXNzIFBsdWdpbkV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8UGx1Z2luRXh0ZW5zaW9uPiA9IFBMVUdJTl9FWFRFTlNJT05fVFlQRTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcXVpcmVkUGx1Z2luczogTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KFBMVUdJTl9SRVFVSVJFX1BBQ0tFVCk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFRhc2soKCkgPT4gdGhpcy5vblRhc2soKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFsbG93ZWRQYWNrYWdlcygpOiBUYWJsZTxQbHVnaW5QYWNrYWdlSW5mbz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vbXUudGFibGVzLmdldChQTFVHSU5fQUxMT1dFRF9QQUNLQUdFX1RBQkxFKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVsb2FkKG9wdGlvbnM6IFJlbG9hZE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoUExVR0lOX1JFTE9BRF9FTkRQT0lOVF9UWVBFLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uVGFzaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChQTFVHSU5fUkVRVUlSRV9QQUNLRVQsIE9iamVjdC5mcm9tRW50cmllcyh0aGlzLnJlcXVpcmVkUGx1Z2lucykpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXF1aXJlKHBsdWdpbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsdWdpbnMgbXVzdCBiZSByZXF1aXJlZCBiZWZvcmUgdGhlIGNsaWVudCBzdGFydHMnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zKSkge1xuICAgICAgICAgICAgdGhpcy5yZXF1aXJlZFBsdWdpbnMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBQTFVHSU5fUkVRVUlSRV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4+KFxuICAgIFBMVUdJTl9FWFRFTlNJT05fVFlQRSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdyZXF1aXJlJyxcbiAgICB9LFxuKTtcbmV4cG9ydCBjbGFzcyBQbHVnaW5QYWNrYWdlSW5mbyB7XG4gICAgcHVibGljIHBhY2thZ2U6IHN0cmluZztcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoX3BhY2thZ2U6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucGFja2FnZSA9IF9wYWNrYWdlO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IFBsdWdpblBhY2thZ2VJbmZvKTogeyBwYWNrYWdlOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHtcbiAgICAgICAgcmV0dXJuIGRhdGEudG9Kc29uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiB7IHBhY2thZ2U6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0pOiBQbHVnaW5QYWNrYWdlSW5mbyB7XG4gICAgICAgIHJldHVybiBQbHVnaW5QYWNrYWdlSW5mby5mcm9tSnNvbihkYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21Kc29uKGpzb246IHsgcGFja2FnZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSk6IFBsdWdpblBhY2thZ2VJbmZvIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQbHVnaW5QYWNrYWdlSW5mbyhqc29uLnBhY2thZ2UsIGpzb24udmVyc2lvbik7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiB7IHBhY2thZ2U6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0ge1xuICAgICAgICByZXR1cm4geyBwYWNrYWdlOiB0aGlzLnBhY2thZ2UsIHZlcnNpb246IHRoaXMudmVyc2lvbiB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBrZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFja2FnZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBQTFVHSU5fUkVBRF9QQUNLQUdFX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBQTFVHSU5fRVhURU5TSU9OX1RZUEUuam9pbigncGFja2FnZScsICdyZWFkJyk7XG5leHBvcnQgY29uc3QgUExVR0lOX01BTkFHRV9QQUNLQUdFX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBQTFVHSU5fRVhURU5TSU9OX1RZUEUuam9pbigncGFja2FnZScsICdtYW5hZ2UnKTtcblxuY29uc3QgUExVR0lOX0FMTE9XRURfUEFDS0FHRV9UQUJMRSA9IFRhYmxlVHlwZS5jcmVhdGVKc29uKFBMVUdJTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdhbGxvd2VkX3BhY2thZ2UnLFxuICAgIHNlcmlhbGl6ZXI6IFBsdWdpblBhY2thZ2VJbmZvLFxuICAgIGtleTogKGl0ZW0pID0+IGl0ZW0ua2V5KCksXG59KTtcblxudHlwZSBSZWxvYWRPcHRpb25zID0ge1xuICAgIHBhY2thZ2VzOiBzdHJpbmdbXSB8IG51bGw7XG59O1xuXG50eXBlIFJlbG9hZFJlc3VsdCA9IHtcbiAgICBwYWNrYWdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmNvbnN0IFBMVUdJTl9SRUxPQURfRU5EUE9JTlRfVFlQRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPFJlbG9hZE9wdGlvbnMsIFJlbG9hZFJlc3VsdD4oUExVR0lOX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlbG9hZCcsXG4gICAgcGVybWlzc2lvbklkOiBQTFVHSU5fTUFOQUdFX1BBQ0tBR0VfUEVSTUlTU0lPTl9JRCxcbn0pO1xuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyLCBGbGFncyB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmltcG9ydCB0eXBlIHsgVGFibGVDb25maWcgfSBmcm9tICcuL3RhYmxlLmpzJztcblxuZXhwb3J0IGNsYXNzIFRhYmxlUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIpIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFRhYmxlUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVQYWNrZXQoaWQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlSXRlbXNQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpdGVtczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4sXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZUl0ZW1zUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KE9iamVjdC5rZXlzKHBhY2tldC5pdGVtcykubGVuZ3RoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFja2V0Lml0ZW1zKSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGtleSk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlSXRlbXNQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgY291bnQgPSByZWFkZXIucmVhZFVMRUIxMjgoKTtcbiAgICAgICAgY29uc3QgaXRlbXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgICAgICBpdGVtc1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUl0ZW1zUGFja2V0KGlkLCBpdGVtcyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVLZXlzUGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkga2V5czogc3RyaW5nW10sXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZUtleXNQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVMRUIxMjgocGFja2V0LmtleXMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcGFja2V0LmtleXMpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogVGFibGVLZXlzUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAga2V5cy5wdXNoKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVLZXlzUGFja2V0KGlkLCBrZXlzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVByb3h5UGFja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaXRlbXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBudW1iZXIsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZVByb3h5UGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KHBhY2tldC5rZXkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KE9iamVjdC5rZXlzKHBhY2tldC5pdGVtcykubGVuZ3RoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFja2V0Lml0ZW1zKSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKGtleSk7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFRhYmxlUHJveHlQYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3Qga2V5ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYWRlci5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICAgICAgaXRlbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVQcm94eVBhY2tldChpZCwgaXRlbXMsIGtleSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRhYmxlRmV0Y2hQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBsaW1pdDogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYmFja3dhcmQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZUZldGNoUGFja2V0KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuaWQua2V5KCkpO1xuICAgICAgICB3cml0ZXIud3JpdGVVTEVCMTI4KHBhY2tldC5saW1pdCk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gbmV3IEZsYWdzKHsgbGVuZ3RoOiAyIH0pO1xuICAgICAgICBmbGFncy5zZXQoMCwgcGFja2V0LmJhY2t3YXJkKTtcbiAgICAgICAgZmxhZ3Muc2V0KDEsIHBhY2tldC5jdXJzb3IgIT09IG51bGwpO1xuICAgICAgICB3cml0ZXIud3JpdGVGbGFncyhmbGFncyk7XG4gICAgICAgIGlmIChwYWNrZXQuY3Vyc29yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmN1cnNvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXkpOiBUYWJsZUZldGNoUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVhZGVyLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gcmVhZGVyLnJlYWRGbGFncygyKTtcbiAgICAgICAgY29uc3QgYmFja3dhcmQgPSBmbGFncy5nZXQoMCk7XG4gICAgICAgIGNvbnN0IGN1cnNvciA9IGZsYWdzLmlmU2V0KDEsICgpID0+IHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlRmV0Y2hQYWNrZXQoaWQsIGxpbWl0LCBiYWNrd2FyZCwgY3Vyc29yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUZldGNoUmFuZ2VQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGFydDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZW5kOiBzdHJpbmcsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBUYWJsZUZldGNoUmFuZ2VQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuc3RhcnQpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmVuZCk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogVGFibGVGZXRjaFJhbmdlUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZW5kID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUZldGNoUmFuZ2VQYWNrZXQoaWQsIHN0YXJ0LCBlbmQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldENvbmZpZ1BhY2tldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNvbmZpZzogVGFibGVDb25maWcsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBTZXRDb25maWdQYWNrZXQpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC5pZC5rZXkoKSk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeShwYWNrZXQuY29uZmlnKSk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogU2V0Q29uZmlnUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiBuZXcgU2V0Q29uZmlnUGFja2V0KGlkLCBjb25maWcpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldFBlcm1pc3Npb25QYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBhbGw6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVhZDogSWRlbnRpZmllciB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB3cml0ZTogSWRlbnRpZmllciB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZW1vdmU6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcHJveHk6IElkZW50aWZpZXIgfCBudWxsLFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKHBhY2tldDogU2V0UGVybWlzc2lvblBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgbGV0IGZsYWdzID0gMDtcbiAgICAgICAgaWYgKHBhY2tldC5hbGwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2V0LnJlYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC53cml0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZmxhZ3MgfD0gMGIxMDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZW1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDBiMTAwMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2V0LnByb3h5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAwYjEwMDAwO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4KGZsYWdzKTtcbiAgICAgICAgaWYgKHBhY2tldC5hbGwpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQuYWxsLmtleSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2V0LnJlYWQpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQucmVhZC5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC53cml0ZSkge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RyaW5nKHBhY2tldC53cml0ZS5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhY2tldC5yZW1vdmUpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhwYWNrZXQucmVtb3ZlLmtleSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2V0LnByb3h5KSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LnByb3h5LmtleSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogVWludDhBcnJheSk6IFNldFBlcm1pc3Npb25QYWNrZXQge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgY29uc3QgZmxhZ3MgPSByZWFkZXIucmVhZFVpbnQ4KCk7XG4gICAgICAgIGNvbnN0IGFsbCA9IGZsYWdzICYgMGIxID8gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmVhZCA9IGZsYWdzICYgMGIxMCA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHdyaXRlID0gZmxhZ3MgJiAwYjEwMCA/IElkZW50aWZpZXIuZnJvbUtleShyZWFkZXIucmVhZFN0cmluZygpKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IGZsYWdzICYgMGIxMDAwID8gSWRlbnRpZmllci5mcm9tS2V5KHJlYWRlci5yZWFkU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcHJveHkgPSBmbGFncyAmIDBiMTAwMDAgPyBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IFNldFBlcm1pc3Npb25QYWNrZXQoaWQsIGFsbCwgcmVhZCwgd3JpdGUsIHJlbW92ZSwgcHJveHkpO1xuICAgIH1cbn1cblxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vZXZlbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmllciwgSWRlbnRpZmllck1hcCB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4uLy4uL25ldHdvcmsvcGFja2V0L3BhY2tldC5qcyc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHR5cGUgeyBKc29uVHlwZSwgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi4vZW5kcG9pbnQvZW5kcG9pbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBFeHRlbnNpb24gfSBmcm9tICcuLi9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5cbmltcG9ydCB7XG4gICAgU2V0Q29uZmlnUGFja2V0LFxuICAgIFNldFBlcm1pc3Npb25QYWNrZXQsXG4gICAgVGFibGVGZXRjaFBhY2tldCxcbiAgICBUYWJsZUZldGNoUmFuZ2VQYWNrZXQsXG4gICAgVGFibGVJdGVtc1BhY2tldCxcbiAgICBUYWJsZUtleXNQYWNrZXQsXG4gICAgVGFibGVQYWNrZXQsXG4gICAgVGFibGVQcm94eVBhY2tldCxcbn0gZnJvbSAnLi9wYWNrZXRzLmpzJztcbmltcG9ydCB0eXBlIHsgVGFibGUsIFRhYmxlQ29uZmlnLCBUYWJsZUV2ZW50cywgVGFibGVQZXJtaXNzaW9ucyB9IGZyb20gJy4vdGFibGUuanMnO1xuaW1wb3J0IHsgVGFibGVUeXBlIH0gZnJvbSAnLi90YWJsZS5qcyc7XG5cbmV4cG9ydCBjb25zdCBUQUJMRV9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxUYWJsZUV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAndGFibGUnLFxuICAgIChjbGllbnQpID0+IG5ldyBUYWJsZUV4dGVuc2lvbihjbGllbnQpLFxuKTtcbmV4cG9ydCBjb25zdCBUQUJMRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gVEFCTEVfRVhURU5TSU9OX1RZUEUuam9pbigncGVybWlzc2lvbicpO1xuXG5jb25zdCBUQUJMRV9TRVRfUEVSTUlTU0lPTl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8U2V0UGVybWlzc2lvblBhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2V0X3Blcm1pc3Npb24nLFxuICAgIHNlcmlhbGl6ZXI6IFNldFBlcm1pc3Npb25QYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX1NFVF9DT05GSUdfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFNldENvbmZpZ1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2V0X2NvbmZpZycsXG4gICAgc2VyaWFsaXplcjogU2V0Q29uZmlnUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9MSVNURU5fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2xpc3RlbicsXG4gICAgc2VyaWFsaXplcjogSWRlbnRpZmllcixcbn0pO1xuY29uc3QgVEFCTEVfUFJPWFlfTElTVEVOX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxJZGVudGlmaWVyPihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdwcm94eV9saXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFRBQkxFX1BST1hZX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZVByb3h5UGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdwcm94eScsXG4gICAgc2VyaWFsaXplcjogVGFibGVQcm94eVBhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9BRERfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlSXRlbXNQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1fYWRkJyxcbiAgICBzZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX1VQREFURV9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVJdGVtc1BhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaXRlbV91cGRhdGUnLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fUkVNT1ZFX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdpdGVtX3JlbW92ZScsXG4gICAgc2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbn0pO1xuY29uc3QgVEFCTEVfSVRFTV9HRVRfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUtleXNQYWNrZXQsIFRhYmxlSXRlbXNQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1fZ2V0JyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVLZXlzUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fSEFTX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVLZXlzUGFja2V0LCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaXRlbV9oYXMnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZUtleXNQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBTZXJpYWxpemVyLmpzb24oKSxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0lURU1fSEFTX0FMTF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlS2V5c1BhY2tldCwgYm9vbGVhbj4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnaXRlbV9oYXNfYWxsJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVLZXlzUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5qc29uKCksXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0hBU19BTllfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUtleXNQYWNrZXQsIGJvb2xlYW4+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2l0ZW1faGFzX2FueScsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlS2V5c1BhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIuanNvbigpLFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfRkVUQ0hfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUZldGNoUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdmZXRjaCcsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlRmV0Y2hQYWNrZXQsXG4gICAgcmVzcG9uc2VTZXJpYWxpemVyOiBUYWJsZUl0ZW1zUGFja2V0LFxuICAgIHBlcm1pc3Npb25JZDogVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0pO1xuY29uc3QgVEFCTEVfRkVUQ0hfUkFOR0VfRU5EUE9JTlQgPSBFbmRwb2ludFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZUZldGNoUmFuZ2VQYWNrZXQsIFRhYmxlSXRlbXNQYWNrZXQ+KFRBQkxFX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2ZldGNoX3JhbmdlJyxcbiAgICByZXF1ZXN0U2VyaWFsaXplcjogVGFibGVGZXRjaFJhbmdlUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogVGFibGVJdGVtc1BhY2tldCxcbiAgICBwZXJtaXNzaW9uSWQ6IFRBQkxFX1BFUk1JU1NJT05fSUQsXG59KTtcbmNvbnN0IFRBQkxFX0ZFVENIX0FMTF9FTkRQT0lOVCA9IEVuZHBvaW50VHlwZS5jcmVhdGVTZXJpYWxpemVkPFRhYmxlUGFja2V0LCBUYWJsZUl0ZW1zUGFja2V0PihUQUJMRV9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdmZXRjaF9hbGwnLFxuICAgIHJlcXVlc3RTZXJpYWxpemVyOiBUYWJsZVBhY2tldCxcbiAgICByZXNwb25zZVNlcmlhbGl6ZXI6IFRhYmxlSXRlbXNQYWNrZXQsXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9TSVpFX0VORFBPSU5UID0gRW5kcG9pbnRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VGFibGVQYWNrZXQsIG51bWJlcj4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2l6ZScsXG4gICAgcmVxdWVzdFNlcmlhbGl6ZXI6IFRhYmxlUGFja2V0LFxuICAgIHJlc3BvbnNlU2VyaWFsaXplcjogU2VyaWFsaXplci5qc29uKCksXG4gICAgcGVybWlzc2lvbklkOiBUQUJMRV9QRVJNSVNTSU9OX0lELFxufSk7XG5jb25zdCBUQUJMRV9JVEVNX0NMRUFSX1BBQ0tFVCA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxUYWJsZVBhY2tldD4oVEFCTEVfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnY2xlYXInLFxuICAgIHNlcmlhbGl6ZXI6IFRhYmxlUGFja2V0LFxufSk7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUV4dGVuc2lvbiBpbXBsZW1lbnRzIEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8VGFibGVFeHRlbnNpb24+ID0gVEFCTEVfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0YWJsZU1hcCA9IG5ldyBJZGVudGlmaWVyTWFwPFRhYmxlPHVua25vd24+PigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFRBQkxFX1NFVF9QRVJNSVNTSU9OX1BBQ0tFVCxcbiAgICAgICAgICAgIFRBQkxFX1NFVF9DT05GSUdfUEFDS0VULFxuICAgICAgICAgICAgVEFCTEVfTElTVEVOX1BBQ0tFVCxcbiAgICAgICAgICAgIFRBQkxFX1BST1hZX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9QUk9YWV9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9JVEVNX0FERF9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9JVEVNX1VQREFURV9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9JVEVNX1JFTU9WRV9QQUNLRVQsXG4gICAgICAgICAgICBUQUJMRV9JVEVNX0NMRUFSX1BBQ0tFVCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRhYmxlPFQ+KHRhYmxlVHlwZTogVGFibGVUeXBlPFQ+KTogVGFibGU8VD4ge1xuICAgICAgICB0aGlzLm9tdS5wZXJtaXNzaW9ucy5yZXF1aXJlKFRBQkxFX1BFUk1JU1NJT05fSUQpO1xuICAgICAgICBpZiAodGhpcy5oYXModGFibGVUeXBlLmlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYWJsZSBhbHJlYWR5IGV4aXN0cycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlSW1wbDxUPih0aGlzLm9tdSwgdGFibGVUeXBlKTtcbiAgICAgICAgdGhpcy50YWJsZU1hcC5zZXQodGFibGVUeXBlLmlkLCB0YWJsZSBhcyBUYWJsZTx1bmtub3duPik7XG4gICAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMganNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4obmFtZTogc3RyaW5nLCBvcHRpb25zOiB7IGtleTogKGl0ZW06IFQpID0+IHN0cmluZzsgc2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxULCBEPiB9KTogVGFibGU8VD4ge1xuICAgICAgICBjb25zdCB0YWJsZVR5cGUgPSBuZXcgVGFibGVUeXBlPFQ+KFxuICAgICAgICAgICAgdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSksXG4gICAgICAgICAgICBTZXJpYWxpemVyLnBpcGU8VCwgSnNvblR5cGUsIFVpbnQ4QXJyYXk+KG9wdGlvbnMuc2VyaWFsaXplciA/PyBTZXJpYWxpemVyLm5vb3AoKSwgU2VyaWFsaXplci5qc29uKCkpLFxuICAgICAgICAgICAgb3B0aW9ucy5rZXksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRhYmxlKHRhYmxlVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlcmlhbGl6ZWQ8VD4obmFtZTogc3RyaW5nLCBvcHRpb25zOiB7IGtleTogKGl0ZW06IFQpID0+IHN0cmluZzsgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+IH0pOiBUYWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IHRhYmxlVHlwZSA9IG5ldyBUYWJsZVR5cGU8VD4oXG4gICAgICAgICAgICB0aGlzLm9tdS5hcHAuaWQuam9pbihuYW1lKSxcbiAgICAgICAgICAgIG9wdGlvbnMuc2VyaWFsaXplcixcbiAgICAgICAgICAgIG9wdGlvbnMua2V5LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUYWJsZSh0YWJsZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4odHlwZTogVGFibGVUeXBlPFQ+KTogVGFibGU8VD4ge1xuICAgICAgICBpZiAodGhpcy5oYXModHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhYmxlTWFwLmdldCh0eXBlLmlkKSBhcyBUYWJsZTxUPjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUYWJsZSh0eXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVNYXAuaGFzKGlkZW50aWZpZXIpO1xuICAgIH1cbn1cblxuY2xhc3MgVGFibGVJbXBsPFQ+IGltcGxlbWVudHMgVGFibGU8VD4ge1xuICAgIHB1YmxpYyBjYWNoZTogTWFwPHN0cmluZywgVD47XG4gICAgcHVibGljIHJlYWRvbmx5IGV2ZW50OiBUYWJsZUV2ZW50czxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb21pc2VNYXA6IE1hcDxzdHJpbmcsIFByb21pc2U8VCB8IHVuZGVmaW5lZD4+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJveGllczogQXJyYXk8KGl0ZW06IFQpID0+IFQgfCB1bmRlZmluZWQ+O1xuICAgIHByaXZhdGUgaWQ6IElkZW50aWZpZXI7XG4gICAgcHJpdmF0ZSBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgcHJpdmF0ZSBrZXlGdW5jdGlvbjogKGl0ZW06IFQpID0+IHN0cmluZztcbiAgICBwcml2YXRlIGxpc3RlbmluZzogYm9vbGVhbjtcbiAgICBwcml2YXRlIGNhY2hlU2l6ZT86IG51bWJlcjtcbiAgICBwcml2YXRlIGNvbmZpZz86IFRhYmxlQ29uZmlnO1xuICAgIHByaXZhdGUgcGVybWlzc2lvbnM/OiBUYWJsZVBlcm1pc3Npb25zO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgICAgIHRhYmxlVHlwZTogVGFibGVUeXBlPFQ+LFxuICAgICkge1xuICAgICAgICB0aGlzLmlkID0gdGFibGVUeXBlLmlkO1xuICAgICAgICB0aGlzLnNlcmlhbGl6ZXIgPSB0YWJsZVR5cGUuc2VyaWFsaXplcjtcbiAgICAgICAgdGhpcy5rZXlGdW5jdGlvbiA9IHRhYmxlVHlwZS5rZXlGdW5jdGlvbjtcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5ldmVudCA9IHtcbiAgICAgICAgICAgIGFkZDogbmV3IEV2ZW50RW1pdHRlcjxbTWFwPHN0cmluZywgVD5dPigpLFxuICAgICAgICAgICAgdXBkYXRlOiBuZXcgRXZlbnRFbWl0dGVyPFtNYXA8c3RyaW5nLCBUPl0+KCksXG4gICAgICAgICAgICByZW1vdmU6IG5ldyBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT4oKSxcbiAgICAgICAgICAgIGNsZWFyOiBuZXcgRXZlbnRFbWl0dGVyPFtdPigpLFxuICAgICAgICAgICAgY2FjaGVVcGRhdGU6IG5ldyBFdmVudEVtaXR0ZXI8W01hcDxzdHJpbmcsIFQ+XT4oKSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcm9taXNlTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnByb3hpZXMgPSBbXTtcbiAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSBmYWxzZTtcblxuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFRBQkxFX1BST1hZX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhwYWNrZXQuaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5wcm94aWVzLmZvckVhY2goKHByb3h5KSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbXMgPSBuZXcgTWFwKFxuICAgICAgICAgICAgICAgICAgICBbLi4uaXRlbXMuZW50cmllcygpXVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm94eUl0ZW0gPSBwcm94eShpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJveHlJdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIHByb3h5SXRlbSBhcyBUXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBbc3RyaW5nLCBUXSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBpdGVtICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9tdS5zZW5kKFRBQkxFX1BST1hZX1BBQ0tFVCwge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGtleTogcGFja2V0LmtleSxcbiAgICAgICAgICAgICAgICBpdGVtczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgICAgICBbLi4uaXRlbXMuZW50cmllcygpXS5tYXAoKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShpdGVtKV07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoVEFCTEVfSVRFTV9BRERfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBhY2tldC5pZC5pc0VxdWFsKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocGFja2V0Lml0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5hZGQuZW1pdChpdGVtcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFRBQkxFX0lURU1fVVBEQVRFX1BBQ0tFVCwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYWNrZXQuaWQuaXNFcXVhbCh0aGlzLmlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHBhY2tldC5pdGVtcyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQudXBkYXRlLmVtaXQoaXRlbXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihUQUJMRV9JVEVNX1JFTU9WRV9QQUNLRVQsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghcGFja2V0LmlkLmlzRXF1YWwodGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGVzZXJpYWxpemVJdGVtcyhwYWNrZXQuaXRlbXMpO1xuICAgICAgICAgICAgaXRlbXMuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5yZW1vdmUuZW1pdChpdGVtcyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50LmNhY2hlVXBkYXRlLmVtaXQodGhpcy5jYWNoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFRBQkxFX0lURU1fQ0xFQVJfUEFDS0VULCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBhY2tldC5pZC5pc0VxdWFsKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuY2xlYXIuZW1pdCgpO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5jYWNoZVVwZGF0ZS5lbWl0KHRoaXMuY2FjaGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211LmV2ZW50LnJlYWR5Lmxpc3RlbigoKSA9PiB0aGlzLm9uUmVhZHkoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDYWNoZShpdGVtczogTWFwPHN0cmluZywgVD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlU2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZSA9IGl0ZW1zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgTWFwKFsuLi50aGlzLmNhY2hlLCAuLi5pdGVtc10uc2xpY2UoLXRoaXMuY2FjaGVTaXplKSk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlID0gY2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudC5jYWNoZVVwZGF0ZS5lbWl0KHRoaXMuY2FjaGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0ZW4obGlzdGVuZXI/OiAoaXRlbXM6IE1hcDxzdHJpbmcsIFQ+KSA9PiB2b2lkKTogVW5saXN0ZW4ge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5vblJlYWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFRBQkxFX0xJU1RFTl9QQUNLRVQsIHRoaXMuaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ldmVudC5jYWNoZVVwZGF0ZS5saXN0ZW4obGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJveHkoY2FsbGJhY2s6IChpdGVtOiBUKSA9PiBUIHwgdW5kZWZpbmVkKTogVW5saXN0ZW4ge1xuICAgICAgICBpZiAodGhpcy5wcm94aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbGV0IGNhbmNlbCA9ICgpOiB2b2lkID0+IHt9O1xuICAgICAgICAgICAgY2FuY2VsID0gdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChUQUJMRV9QUk9YWV9MSVNURU5fUEFDS0VULCB0aGlzLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJveGllcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJveGllcy5zcGxpY2UodGhpcy5wcm94aWVzLmluZGV4T2YoY2FsbGJhY2spLCAxKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uUmVhZHkoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChUQUJMRV9TRVRfQ09ORklHX1BBQ0tFVCwge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb21pc2VNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnByb21pc2VNYXAuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMub211LmVuZHBvaW50c1xuICAgICAgICAgICAgLmNhbGwoVEFCTEVfSVRFTV9HRVRfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBrZXlzOiBba2V5XSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocmVzLml0ZW1zKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKGl0ZW1zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb21pc2VNYXAuc2V0KGtleSwgcHJvbWlzZSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlLnRoZW4oKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvbWlzZU1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0TWFueSguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRLZXlzID0ga2V5c1xuICAgICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiAhdGhpcy5jYWNoZS5oYXMoa2V5KSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gIXRoaXMucHJvbWlzZU1hcC5oYXMoa2V5KSk7XG4gICAgICAgIGlmIChmaWx0ZXJlZEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hcChbLi4udGhpcy5jYWNoZV0uZmlsdGVyKChba2V5XSkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMub211LmVuZHBvaW50c1xuICAgICAgICAgICAgLmNhbGwoVEFCTEVfSVRFTV9HRVRfRU5EUE9JTlQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBrZXlzOiBmaWx0ZXJlZEtleXMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGZpbHRlcmVkS2V5cykge1xuICAgICAgICAgICAgdGhpcy5wcm9taXNlTWFwLnNldChcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChpdGVtcykgPT4gaXRlbXMuZ2V0KGtleSkpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHByb21pc2U7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGZpbHRlcmVkS2V5cykge1xuICAgICAgICAgICAgdGhpcy5wcm9taXNlTWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTWFwKFsuLi50aGlzLmNhY2hlLCAuLi5pdGVtc10uZmlsdGVyKChba2V5XSkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFkZCguLi5pdGVtczogVFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNlcmlhbGl6ZUl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChUQUJMRV9JVEVNX0FERF9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgaXRlbXM6IGRhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUoLi4uaXRlbXM6IFRbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZXJpYWxpemVJdGVtcyhpdGVtcyk7XG4gICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfSVRFTV9VUERBVEVfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGl0ZW1zOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlKC4uLml0ZW1zOiBUW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2VyaWFsaXplSXRlbXMoaXRlbXMpO1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKFsuLi50aGlzLmNhY2hlXS5maWx0ZXIoKFtrZXldKSA9PiAha2V5cy5pbmNsdWRlcyhrZXkpKSk7XG4gICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfSVRFTV9SRU1PVkVfUEFDS0VULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGl0ZW1zOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMub211LnNlbmQoVEFCTEVfSVRFTV9DTEVBUl9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBrZXlzOiBba2V5XSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNba2V5XSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzTWFueTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KC4uLmtleXM6IChrZXlvZiBUKVtdKTogUHJvbWlzZTx7IFtrZXkgaW4ga2V5b2YgVF06IGJvb2xlYW4gfT4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9JVEVNX0hBU19FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBrZXlzOiBrZXlzLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcyBhcyB7IFtrZXkgaW4ga2V5b2YgVF06IGJvb2xlYW4gfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzQWxsKC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFRBQkxFX0lURU1fSEFTX0FMTF9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBrZXlzLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzQW55KC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub211LmVuZHBvaW50cy5jYWxsKFRBQkxFX0lURU1fSEFTX0FOWV9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBrZXlzLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2hJdGVtcyh7XG4gICAgICAgIGxpbWl0LFxuICAgICAgICBiYWNrd2FyZCxcbiAgICAgICAgY3Vyc29yLFxuICAgIH06IHtcbiAgICAgICAgbGltaXQ6IG51bWJlcjtcbiAgICAgICAgYmFja3dhcmQ/OiBib29sZWFuO1xuICAgICAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoXG4gICAgICAgICAgICBUQUJMRV9GRVRDSF9FTkRQT0lOVCxcbiAgICAgICAgICAgIG5ldyBUYWJsZUZldGNoUGFja2V0KHRoaXMuaWQsIGxpbWl0LCBiYWNrd2FyZCwgY3Vyc29yKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRlc2VyaWFsaXplSXRlbXMocmVzLml0ZW1zKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYWNoZShpdGVtcyk7XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2hSYW5nZSh7XG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBlbmQsXG4gICAgfToge1xuICAgICAgICBzdGFydDogc3RyaW5nO1xuICAgICAgICBlbmQ6IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUPj4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9GRVRDSF9SQU5HRV9FTkRQT0lOVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgIGVuZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoQWxsKCk6IFByb21pc2U8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoVEFCTEVfRkVUQ0hfQUxMX0VORFBPSU5ULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kZXNlcmlhbGl6ZUl0ZW1zKHJlcy5pdGVtcyk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoaXRlbXMpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jICppdGVyYXRlKHtcbiAgICAgICAgYmFja3dhcmQsXG4gICAgICAgIGN1cnNvcixcbiAgICB9OiB7XG4gICAgICAgIGJhY2t3YXJkPzogYm9vbGVhbjtcbiAgICAgICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIH0pOiBBc3luY0l0ZXJhYmxlPFQ+IHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5mZXRjaEl0ZW1zKHtcbiAgICAgICAgICAgICAgICBsaW1pdDogdGhpcy5jYWNoZVNpemUgPz8gMTAwLFxuICAgICAgICAgICAgICAgIGJhY2t3YXJkLFxuICAgICAgICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGl0ZW1zLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkKiBpdGVtcy52YWx1ZXMoKTtcbiAgICAgICAgICAgIGlmIChjdXJzb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGl0ZW1zLmRlbGV0ZShjdXJzb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY3Vyc29ySXRlbSA9IGJhY2t3YXJkID8gaXRlbXMudmFsdWVzKCkubmV4dCgpLnZhbHVlIDogWy4uLml0ZW1zLnZhbHVlcygpXS5wb3AoKTtcbiAgICAgICAgICAgIGlmICghY3Vyc29ySXRlbSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3Vyc29yID0gdGhpcy5rZXlGdW5jdGlvbihjdXJzb3JJdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaXplKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm9tdS5lbmRwb2ludHMuY2FsbChUQUJMRV9TSVpFX0VORFBPSU5ULCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXNlcmlhbGl6ZUl0ZW1zKGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5Pik6IE1hcDxzdHJpbmcsIFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhpdGVtcykubWFwKChba2V5LCBkYXRhXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgaXRlbV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlcmlhbGl6ZUl0ZW1zKGl0ZW1zOiBUW10pOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3RoaXMua2V5RnVuY3Rpb24oaXRlbSksIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoaXRlbSldO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENhY2hlU2l6ZShzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYWNoZVNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDb25maWcoY29uZmlnOiBUYWJsZUNvbmZpZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2V0IGNvbmZpZyBhZnRlciBjbGllbnQgaGFzIHN0YXJ0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UGVybWlzc2lvbnMocGVybWlzc2lvbnM6IFRhYmxlUGVybWlzc2lvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgQXBwLCBBcHBKc29uIH0gZnJvbSAnLi4vLi4vYXBwLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IExvY2FsaXplZFRleHQgfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IE9tdSB9IGZyb20gJy4uLy4uL29tdS5qcyc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludC9lbmRwb2ludC5qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlLCB0eXBlIEV4dGVuc2lvbiB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSwgUmVnaXN0cnlUeXBlIH0gZnJvbSAnLi4vcmVnaXN0cnknO1xuaW1wb3J0IHsgVGFibGVUeXBlLCB0eXBlIFRhYmxlIH0gZnJvbSAnLi4vdGFibGUnO1xuXG5leHBvcnQgY29uc3QgU0VSVkVSX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPFNlcnZlckV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnc2VydmVyJyxcbiAgICAob211OiBPbXUpID0+IG5ldyBTZXJ2ZXJFeHRlbnNpb24ob211KSxcbik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwSW5kZXhFbnRyeSB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgbWV0YT86IEFwcEluZGV4UmVnaXN0cnlNZXRhO1xuICAgIGFkZGVkX2F0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEluZGV4IHtcbiAgICBpbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBBcHBJbmRleEVudHJ5Pjtcbn07XG5cbmV4cG9ydCBjb25zdCBTRVJWRVJfQVBQU19SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVJWRVJfRVhURU5TSU9OX1RZUEUuam9pbignYXBwcycsICdyZWFkJyk7XG5leHBvcnQgY29uc3QgU0VSVkVSX0FQUFNfV1JJVEVfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdhcHBzJywgJ3dyaXRlJyk7XG5leHBvcnQgY29uc3QgU0VSVkVSX0lOREVYX1JFQURfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdpbmRleCcsICdyZWFkJyk7XG5leHBvcnQgY29uc3QgU0VSVkVSX0lOREVYX1JFR0lTVFJZX1RZUEU6IFJlZ2lzdHJ5VHlwZTxBcHBJbmRleD4gPSBSZWdpc3RyeVR5cGUuY3JlYXRlSnNvbjxBcHBJbmRleD4oU0VSVkVSX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2luZGV4JyxcbiAgICBkZWZhdWx0VmFsdWU6IHsgJ2luZGV4ZXMnOiB7fSB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIHdyaXRlOiBTRVJWRVJfQVBQU19XUklURV9QRVJNSVNTSU9OX0lELFxuICAgICAgICByZWFkOiBTRVJWRVJfSU5ERVhfUkVBRF9QRVJNSVNTSU9OX0lELFxuICAgIH0sXG59KTtcbmNvbnN0IEFQUF9UQUJMRV9UWVBFID0gVGFibGVUeXBlLmNyZWF0ZUpzb24oU0VSVkVSX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ2FwcHMnLFxuICAgIHNlcmlhbGl6ZXI6IEFwcCxcbiAgICBrZXk6IChhcHApID0+IGFwcC5pZC5rZXkoKSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICBhbGw6IFNFUlZFUl9BUFBTX1dSSVRFX1BFUk1JU1NJT05fSUQsXG4gICAgICAgIHJlYWQ6IFNFUlZFUl9BUFBTX1JFQURfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBTRVJWRVJfU0hVVERPV05fUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCdzaHV0ZG93bicpO1xuY29uc3QgU0hVVERPV05fRU5EUE9JTlRfVFlQRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPGJvb2xlYW4sIGJvb2xlYW4+KFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdzaHV0ZG93bicsXG4gICAgcGVybWlzc2lvbklkOiBTRVJWRVJfU0hVVERPV05fUEVSTUlTU0lPTl9JRCxcbn0pO1xuZXhwb3J0IGNvbnN0IFRSVVNURURfT1JJR0lOU19HRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFUlZFUl9FWFRFTlNJT05fVFlQRS5qb2luKCd0cnVzdGVkX29yaWdpbnMnLCAnZ2V0Jyk7XG5leHBvcnQgY29uc3QgVFJVU1RFRF9PUklHSU5TX1NFVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gU0VSVkVSX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3RydXN0ZWRfb3JpZ2lucycsICdzZXQnKTtcbmNvbnN0IFRSVVNURURfSE9TVFNfUkVHSVNUUllfVFlQRSA9IFJlZ2lzdHJ5VHlwZS5jcmVhdGVKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KFNFUlZFUl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd0cnVzdGVkX2hvc3RzJyxcbiAgICBkZWZhdWx0VmFsdWU6IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIHJlYWQ6IFRSVVNURURfT1JJR0lOU19HRVRfUEVSTUlTU0lPTl9JRCxcbiAgICAgICAgd3JpdGU6IFRSVVNURURfT1JJR0lOU19TRVRfUEVSTUlTU0lPTl9JRCxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFNlcnZlckV4dGVuc2lvbj4gPSBTRVJWRVJfRVhURU5TSU9OX1RZUEU7XG4gICAgcHVibGljIHJlYWRvbmx5IGFwcHM6IFRhYmxlPEFwcD47XG4gICAgcHVibGljIHJlYWRvbmx5IGluZGV4OiBSZWdpc3RyeTxBcHBJbmRleD47XG4gICAgcHVibGljIHJlYWRvbmx5IHRydXN0ZWRIb3N0czogUmVnaXN0cnk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9tdTogT211KSB7XG4gICAgICAgIHRoaXMuYXBwcyA9IG9tdS50YWJsZXMuZ2V0KEFQUF9UQUJMRV9UWVBFKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9tdS5yZWdpc3RyaWVzLmdldChTRVJWRVJfSU5ERVhfUkVHSVNUUllfVFlQRSk7XG4gICAgICAgIHRoaXMudHJ1c3RlZEhvc3RzID0gb211LnJlZ2lzdHJpZXMuZ2V0KFRSVVNURURfSE9TVFNfUkVHSVNUUllfVFlQRSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKHJlc3RhcnQ/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMub211LmVuZHBvaW50cy5jYWxsKFNIVVRET1dOX0VORFBPSU5UX1RZUEUsIHJlc3RhcnQgPz8gZmFsc2UpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5saXN0ZW4gPSB0aGlzLm9tdS5uZXR3b3JrLmV2ZW50LmRpc2Nvbm5lY3RlZC5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uT2JzZXJ2ZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgb25Db25uZWN0Q2FsbGJhY2tzOiBBcnJheTwoYXBwOiBBcHApID0+IFByb21pc2U8dm9pZD4gfCB2b2lkPixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG9uRGlzY29ubmVjdENhbGxiYWNrczogQXJyYXk8KGFwcDogQXBwKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBvbkNvbm5lY3QoY2FsbGJhY2s6IChhcHA6IEFwcCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNvbm5lY3RDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRGlzY29ubmVjdChjYWxsYmFjazogKGFwcDogQXBwKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uRGlzY29ubmVjdENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEFwcEluZGV4UmVnaXN0cnlNZXRhID0ge1xuICAgIG5hbWU6IExvY2FsaXplZFRleHQ7XG4gICAgbm90ZTogTG9jYWxpemVkVGV4dDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwSW5kZXhSZWdpc3RyeUpTT04ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWV0YT86IEFwcEluZGV4UmVnaXN0cnlNZXRhO1xuICAgIGFwcHM6IFJlY29yZDxzdHJpbmcsIEFwcEpzb24+O1xufVxuXG5leHBvcnQgY2xhc3MgQXBwSW5kZXhSZWdpc3RyeSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpZDogSWRlbnRpZmllcixcbiAgICAgICAgcHVibGljIGFwcHM6IElkZW50aWZpZXJNYXA8QXBwPixcbiAgICAgICAgcHVibGljIG1ldGE6IEFwcEluZGV4UmVnaXN0cnlNZXRhIHwgdW5kZWZpbmVkLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21KU09OKGpzb246IEFwcEluZGV4UmVnaXN0cnlKU09OKTogQXBwSW5kZXhSZWdpc3RyeSB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGpzb25bJ2lkJ10pO1xuICAgICAgICBjb25zdCBhcHBzID0gbmV3IElkZW50aWZpZXJNYXA8QXBwPigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtpZFN0ciwgYXBwSlNPTl0gb2YgT2JqZWN0LmVudHJpZXMoanNvblsnYXBwcyddKSkge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkoaWRTdHIpO1xuICAgICAgICAgICAgY29uc3QgYXBwID0gQXBwLmRlc2VyaWFsaXplKGFwcEpTT04pO1xuICAgICAgICAgICAgaWYgKCFpZC5pc05hbWVzcGFjZUVxdWFsKGFwcC5pZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFwcCBJRCBkb2VzIG5vdCBtYXRjaCB0aGUgSUQgaW4gdGhlIGluZGV4LiAke2FwcC5pZH0gIT0gJHtpZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcHMuc2V0KGlkLCBhcHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQXBwSW5kZXhSZWdpc3RyeShcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgYXBwcyxcbiAgICAgICAgICAgIGpzb24ubWV0YSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IEFwcCwgQXBwSnNvbiB9IGZyb20gJy4uLy4uL2FwcCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJZGVudGlmaWVyTWFwLCBJZGVudGlmaWVyU2V0LCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFbmRwb2ludFR5cGUgfSBmcm9tICcuLi9lbmRwb2ludCc7XG5pbXBvcnQgeyBFeHRlbnNpb24sIEV4dGVuc2lvblR5cGUgfSBmcm9tICcuLi9leHRlbnNpb24nO1xuaW1wb3J0IHsgU2Vzc2lvbk9ic2VydmVyIH0gZnJvbSAnLi4vc2VydmVyL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBUYWJsZSwgVGFibGVUeXBlIH0gZnJvbSAnLi4vdGFibGUnO1xuXG5leHBvcnQgY29uc3QgU0VTU0lPTl9FWFRFTlNJT05fVFlQRTogRXh0ZW5zaW9uVHlwZTxTZXNzaW9uRXh0ZW5zaW9uPiA9IG5ldyBFeHRlbnNpb25UeXBlKCdzZXNzaW9ucycsIChvbXU6IE9tdSkgPT4gbmV3IFNlc3Npb25FeHRlbnNpb24ob211KSk7XG5cbmV4cG9ydCBjb25zdCBTRVNTSU9OU19SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3JlYWQnKTtcbmNvbnN0IFNFU1NJT05fVEFCTEVfVFlQRSA9IFRhYmxlVHlwZS5jcmVhdGVKc29uKFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnc2Vzc2lvbnMnLFxuICAgIHNlcmlhbGl6ZXI6IEFwcCxcbiAgICBrZXk6IChhcHApID0+IGFwcC5pZC5rZXkoKSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICByZWFkOiBTRVNTSU9OU19SRUFEX1BFUk1JU1NJT05fSUQsXG4gICAgfSxcbn0pO1xuY29uc3QgUkVRVUlSRV9BUFBTX1BBQ0tFVF9UWVBFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXJbXT4oU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1aXJlJyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvQXJyYXkoKSxcbn0pO1xuY29uc3QgU0VTU0lPTl9PQlNFUlZFX1BBQ0tFVF9UWVBFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXJbXT4oU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdvYnNlcnZlJyxcbiAgICBzZXJpYWxpemVyOiBTZXJpYWxpemVyLm9mKElkZW50aWZpZXIpLnRvQXJyYXkoKSxcbn0pO1xuY29uc3QgU0VTU0lPTl9DT05ORUNURURfUEFDS0VUX1RZUEUgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248QXBwPihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Nlc3Npb25fY29ubmVjdGVkJyxcbiAgICBzZXJpYWxpemVyOiBBcHAsXG59KTtcbmNvbnN0IFNFU1NJT05fRElTQ09OTkVDVEVEX1BBQ0tFVF9UWVBFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEFwcD4oU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdzZXNzaW9uX2Rpc2Nvbm5lY3RlZCcsXG4gICAgc2VyaWFsaXplcjogQXBwLFxufSk7XG5cbnR5cGUgUmVtb3RlQXBwUmVxdWVzdFBheWxvYWQgPSB7XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHBlcm1pc3Npb25zOiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RSZW1vdGVBcHBSZXNwb25zZSA9IHtcbiAgICB0eXBlOiAnc3VjY2Vzcyc7XG4gICAgdG9rZW46IHN0cmluZztcbiAgICBsYW5faXA6IHN0cmluZztcbn0gfCB7XG4gICAgdHlwZTogJ2Vycm9yJztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgUkVNT1RFX0FQUF9SRVFVRVNUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXIgPSBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFLmpvaW4oJ3JlbW90ZV9hcHAnLCAncmVxdWVzdCcpO1xuXG5jb25zdCBSRU1PVEVfQVBQX1JFUVVFU1RfRU5EUE9JTlRfVFlQRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPFJlbW90ZUFwcFJlcXVlc3RQYXlsb2FkLCBSZXF1ZXN0UmVtb3RlQXBwUmVzcG9uc2U+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVtb3RlX2FwcF9yZXF1ZXN0JyxcbiAgICBwZXJtaXNzaW9uSWQ6IFJFTU9URV9BUFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lELFxufSk7XG5cbmV4cG9ydCB0eXBlIEdlbmVyYXRlVG9rZW5SZXNwb25zZSA9IHtcbiAgICB0eXBlOiAnc3VjY2Vzcyc7XG4gICAgdG9rZW46IHN0cmluZztcbn0gfCB7XG4gICAgdHlwZTogJ2Vycm9yJztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgR0VORVJBVEVfVE9LRU5fUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllciA9IFNFU1NJT05fRVhURU5TSU9OX1RZUEUuam9pbignZ2VuZXJhdGVfdG9rZW4nKTtcblxudHlwZSBHZW5lcmF0ZVRva2VuUGF5bG9hZCA9IHtcbiAgICBhcHA6IEFwcEpzb247XG4gICAgcGVybWlzc2lvbnM6IHN0cmluZ1tdO1xufTtcblxuY29uc3QgR0VORVJBVEVfVE9LRU5fRU5EUE9JTlRfVFlQRSA9IEVuZHBvaW50VHlwZS5jcmVhdGVKc29uPEdlbmVyYXRlVG9rZW5QYXlsb2FkLCBHZW5lcmF0ZVRva2VuUmVzcG9uc2U+KFNFU1NJT05fRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnZ2VuZXJhdGVfdG9rZW4nLFxuICAgIHBlcm1pc3Npb25JZDogR0VORVJBVEVfVE9LRU5fUEVSTUlTU0lPTl9JRCxcbn0pO1xuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkV4dGVuc2lvbiBpbXBsZW1lbnRzIEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8U2Vzc2lvbkV4dGVuc2lvbj4gPSBTRVNTSU9OX0VYVEVOU0lPTl9UWVBFO1xuICAgIHB1YmxpYyByZWFkb25seSBzZXNzaW9uczogVGFibGU8QXBwPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25PYnNlcnZlcnMgPSBuZXcgSWRlbnRpZmllck1hcDxTZXNzaW9uT2JzZXJ2ZXI+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXF1aXJlZEFwcHMgPSBuZXcgSWRlbnRpZmllclNldCgpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSkge1xuICAgICAgICBvbXUubmV0d29yay5yZWdpc3RlclBhY2tldChcbiAgICAgICAgICAgIFJFUVVJUkVfQVBQU19QQUNLRVRfVFlQRSxcbiAgICAgICAgICAgIFNFU1NJT05fT0JTRVJWRV9QQUNLRVRfVFlQRSxcbiAgICAgICAgICAgIFNFU1NJT05fQ09OTkVDVEVEX1BBQ0tFVF9UWVBFLFxuICAgICAgICAgICAgU0VTU0lPTl9ESVNDT05ORUNURURfUEFDS0VUX1RZUEUsXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoXG4gICAgICAgICAgICBTRVNTSU9OX0NPTk5FQ1RFRF9QQUNLRVRfVFlQRSwgKGFwcCkgPT4gdGhpcy5oYW5kbGVTZXNzaW9uQ29ubmVjdChhcHApLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFxuICAgICAgICAgICAgU0VTU0lPTl9ESVNDT05ORUNURURfUEFDS0VUX1RZUEUsIChhcHApID0+IHRoaXMuaGFuZGxlU2Vzc2lvbkRpc2Nvbm5lY3QoYXBwKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXNzaW9ucyA9IG9tdS50YWJsZXMuZ2V0KFNFU1NJT05fVEFCTEVfVFlQRSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFRhc2soKCkgPT4gdGhpcy5vblRhc2soKSk7XG4gICAgICAgIG9tdS5vblJlYWR5KCgpID0+IHRoaXMub25SZWFkeSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzKGlkOiBJbnRvSWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2Vzc2lvbnMuaGFzKElkZW50aWZpZXIuZnJvbShpZCkua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvYnNlcnZlKGFwcElkOiBJbnRvSWQsIHtcbiAgICAgICAgb25Db25uZWN0LFxuICAgICAgICBvbkRpc2Nvbm5lY3QsXG4gICAgfToge1xuICAgICAgICBvbkNvbm5lY3QoYXBwOiBBcHApOiB2b2lkO1xuICAgICAgICBvbkRpc2Nvbm5lY3QoYXBwOiBBcHApOiB2b2lkO1xuICAgIH0pOiBTZXNzaW9uT2JzZXJ2ZXIge1xuICAgICAgICBjb25zdCBpZCA9IElkZW50aWZpZXIuZnJvbShhcHBJZCk7XG4gICAgICAgIGlmICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFNFU1NJT05fT0JTRVJWRV9QQUNLRVRfVFlQRSwgW2lkXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLnNlc3Npb25PYnNlcnZlcnMuZ2V0KGlkKSA/PyBuZXcgU2Vzc2lvbk9ic2VydmVyKFtdLCBbXSk7XG4gICAgICAgIG9ic2VydmVyLm9uQ29ubmVjdChvbkNvbm5lY3QpO1xuICAgICAgICBvYnNlcnZlci5vbkRpc2Nvbm5lY3Qob25EaXNjb25uZWN0KTtcbiAgICAgICAgdGhpcy5zZXNzaW9uT2JzZXJ2ZXJzLnNldChpZCwgb2JzZXJ2ZXIpO1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTZXNzaW9uQ29ubmVjdChhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IHRoaXMuc2Vzc2lvbk9ic2VydmVycy5nZXQoYXBwLmlkKTtcbiAgICAgICAgaWYgKCFvYnNlcnZlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2Ygb2JzZXJ2ZXIub25Db25uZWN0Q2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBhd2FpdCBjYWxsYmFjayhhcHApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTZXNzaW9uRGlzY29ubmVjdChhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IHRoaXMuc2Vzc2lvbk9ic2VydmVycy5nZXQoYXBwLmlkKTtcbiAgICAgICAgaWYgKCFvYnNlcnZlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2Ygb2JzZXJ2ZXIub25EaXNjb25uZWN0Q2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBhd2FpdCBjYWxsYmFjayhhcHApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlcXVpcmUoLi4uYXBwSWRzOiBJbnRvSWRbXSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vbXUucnVubmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVxdWlyZSBhcHBzIGFmdGVyIHRoZSBjbGllbnQgaGFzIHN0YXJ0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGFwcElkIG9mIGFwcElkcykge1xuICAgICAgICAgICAgdGhpcy5yZXF1aXJlZEFwcHMuYWRkKElkZW50aWZpZXIuZnJvbShhcHBJZCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblRhc2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkQXBwcy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVSVJFX0FQUFNfUEFDS0VUX1RZUEUsIEFycmF5LmZyb20odGhpcy5yZXF1aXJlZEFwcHMudmFsdWVzKCkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25SZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbk9ic2VydmVycy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChTRVNTSU9OX09CU0VSVkVfUEFDS0VUX1RZUEUsIEFycmF5LmZyb20odGhpcy5zZXNzaW9uT2JzZXJ2ZXJzLmtleXMoKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3RSZW1vdGVBcHAob3B0aW9uczoge1xuICAgICAgICBhcHA6IEFwcDtcbiAgICAgICAgcGVybWlzc2lvbnM6IEludG9JZFtdO1xuICAgIH0pOiBQcm9taXNlPFJlcXVlc3RSZW1vdGVBcHBSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCB7IGFwcCB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKCFhcHAudXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwcCBtdXN0IGhhdmUgYSBVUkwgdG8gcmVxdWVzdCBpdCByZW1vdGVseScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcHAudHlwZSAhPT0gJ3JlbW90ZScpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwIG11c3QgYmUgYSByZW1vdGUgYXBwIHRvIHJlcXVlc3QgaXQgcmVtb3RlbHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFwcC5tZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHAgbXVzdCBoYXZlIG1ldGFkYXRhIHRvIHJlcXVlc3QgaXQgcmVtb3RlbHknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vbXUuZW5kcG9pbnRzLmNhbGwoUkVNT1RFX0FQUF9SRVFVRVNUX0VORFBPSU5UX1RZUEUsIHtcbiAgICAgICAgICAgIGFwcDogQXBwLnNlcmlhbGl6ZShvcHRpb25zLmFwcCksXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogb3B0aW9ucy5wZXJtaXNzaW9ucy5tYXAoaWQgPT4gSWRlbnRpZmllci5mcm9tKGlkKS5rZXkoKSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZVRva2VuKG9wdGlvbnM6IHtcbiAgICAgICAgYXBwOiBBcHA7XG4gICAgICAgIHBlcm1pc3Npb25zOiBJbnRvSWRbXTtcbiAgICB9KTogUHJvbWlzZTxHZW5lcmF0ZVRva2VuUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub211LmVuZHBvaW50cy5jYWxsKEdFTkVSQVRFX1RPS0VOX0VORFBPSU5UX1RZUEUsIHtcbiAgICAgICAgICAgIGFwcDogQXBwLnNlcmlhbGl6ZShvcHRpb25zLmFwcCksXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogb3B0aW9ucy5wZXJtaXNzaW9ucy5tYXAoaWQgPT4gSWRlbnRpZmllci5mcm9tKGlkKS5rZXkoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmltcG9ydCB7IFNpZ25hbFBlcm1pc3Npb25zLCBTaWduYWxQZXJtaXNzaW9uc0pTT04gfSBmcm9tICcuL3NpZ25hbC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaWduYWxQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5OiBVaW50OEFycmF5LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZShwYWNrZXQ6IFNpZ25hbFBhY2tldCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnl0ZVdyaXRlcigpO1xuICAgICAgICB3cml0ZXIud3JpdGVTdHJpbmcocGFja2V0LmlkLmtleSgpKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShwYWNrZXQuYm9keSk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBVaW50OEFycmF5KTogU2lnbmFsUGFja2V0IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYWxQYWNrZXQoaWQsIGJvZHkpO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIFNpZ25hbFJlZ2lzdGVyUGFja2V0SlNPTiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uczogU2lnbmFsUGVybWlzc2lvbnNKU09OO1xufVxuXG5leHBvcnQgY2xhc3MgU2lnbmFsUmVnaXN0ZXJQYWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uczogU2lnbmFsUGVybWlzc2lvbnMsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUocGFja2V0OiBTaWduYWxSZWdpc3RlclBhY2tldCk6IFNpZ25hbFJlZ2lzdGVyUGFja2V0SlNPTiB7XG4gICAgICAgIGNvbnN0IHsgcGVybWlzc2lvbnM6IHBlcm1zIH0gPSBwYWNrZXQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogcGFja2V0LmlkLmtleSgpLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBhbGw6IHBlcm1zLmFsbCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5hbGwpLmtleSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGxpc3RlbjogcGVybXMubGlzdGVuID8gSWRlbnRpZmllci5mcm9tKHBlcm1zLmxpc3Rlbikua2V5KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2VuZDogcGVybXMuc2VuZCA/IElkZW50aWZpZXIuZnJvbShwZXJtcy5zZW5kKS5rZXkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBTaWduYWxSZWdpc3RlclBhY2tldEpTT04pOiBTaWduYWxSZWdpc3RlclBhY2tldCB7XG4gICAgICAgIGNvbnN0IHsgcGVybWlzc2lvbnM6IHBlcm1zIH0gPSBkYXRhO1xuICAgICAgICByZXR1cm4gbmV3IFNpZ25hbFJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tS2V5KGRhdGEuaWQpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFsbDogcGVybXMuYWxsID8gSWRlbnRpZmllci5mcm9tS2V5KHBlcm1zLmFsbCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbGlzdGVuOiBwZXJtcy5saXN0ZW4gPyBJZGVudGlmaWVyLmZyb21LZXkocGVybXMubGlzdGVuKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzZW5kOiBwZXJtcy5zZW5kID8gSWRlbnRpZmllci5mcm9tS2V5KHBlcm1zLnNlbmQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVW5saXN0ZW4gfSBmcm9tICcuLi8uLi9ldmVudCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFBlcm1pc3Npb25zSlNPTiB7XG4gICAgYWxsPzogc3RyaW5nO1xuICAgIGxpc3Rlbj86IHN0cmluZztcbiAgICBzZW5kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFBlcm1pc3Npb25zIHtcbiAgICBhbGw/OiBJbnRvSWQgfCB1bmRlZmluZWQ7XG4gICAgbGlzdGVuPzogSW50b0lkIHwgdW5kZWZpbmVkO1xuICAgIHNlbmQ/OiBJbnRvSWQgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTaWduYWxUeXBlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnM6IFNpZ25hbFBlcm1pc3Npb25zLFxuICAgICkge31cblxuICAgIHN0YXRpYyBjcmVhdGVKc29uPFQ+KFxuICAgICAgICBpZGVudGlmaWVyOiBJbnRvSWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgYW55PjtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zPzogU2lnbmFsUGVybWlzc2lvbnM7XG4gICAgICAgIH0sXG4gICAgKTogU2lnbmFsVHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmFsVHlwZShcbiAgICAgICAgICAgIElkZW50aWZpZXIuZnJvbShpZGVudGlmaWVyKS5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5vZjxULCBhbnk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCkpLnRvSnNvbigpLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMgPz8ge30sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8VD4oXG4gICAgICAgIGlkZW50aWZpZXI6IEludG9JZCxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgfToge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+O1xuICAgICAgICAgICAgcGVybWlzc2lvbnM/OiBTaWduYWxQZXJtaXNzaW9ucztcbiAgICAgICAgfSxcbiAgICApOiBTaWduYWxUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYWxUeXBlKFxuICAgICAgICAgICAgSWRlbnRpZmllci5mcm9tKGlkZW50aWZpZXIpLmpvaW4obmFtZSksXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICAgICAgcGVybWlzc2lvbnMgPz8ge30sXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbDxUPiB7XG4gICAgbGlzdGVuKGhhbmRsZXI6ICh2YWx1ZTogVCkgPT4gdm9pZCk6IFVubGlzdGVuO1xuICAgIG5vdGlmeShib2R5OiBUKTogdm9pZDtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBVbmxpc3RlbiB9IGZyb20gJy4uLy4uL2V2ZW50JztcbmltcG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgSnNvblR5cGUsIFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBFeHRlbnNpb25UeXBlLCB0eXBlIEV4dGVuc2lvbiB9IGZyb20gJy4uL2V4dGVuc2lvbi5qcyc7XG5pbXBvcnQgeyBTaWduYWxQYWNrZXQsIFNpZ25hbFJlZ2lzdGVyUGFja2V0IH0gZnJvbSAnLi9wYWNrZXRzLmpzJztcbmltcG9ydCB7IFNpZ25hbFR5cGUsIHR5cGUgU2lnbmFsIH0gZnJvbSAnLi9zaWduYWwuanMnO1xuXG5leHBvcnQgY29uc3QgU0lHTkFMX0VYVEVOU0lPTl9UWVBFOiBFeHRlbnNpb25UeXBlPFNpZ25hbEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnc2lnbmFsJyxcbiAgICAob211OiBPbXUpID0+IG5ldyBTaWduYWxFeHRlbnNpb24ob211KSxcbik7XG5cbmNvbnN0IFNJR05BTF9SRUdJU1RFUl9QQUNLRVQgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248U2lnbmFsUmVnaXN0ZXJQYWNrZXQ+KFNJR05BTF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZWdpc3RlcicsXG4gICAgc2VyaWFsaXplcjogU2lnbmFsUmVnaXN0ZXJQYWNrZXQsXG59KTtcbmNvbnN0IFNJR05BTF9MSVNURU5fUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPElkZW50aWZpZXI+KFNJR05BTF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdsaXN0ZW4nLFxuICAgIHNlcmlhbGl6ZXI6IElkZW50aWZpZXIsXG59KTtcbmNvbnN0IFNJR05BTF9OT1RJRllfUEFDS0VUID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPFNpZ25hbFBhY2tldD4oU0lHTkFMX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ25vdGlmeScsXG4gICAgc2VyaWFsaXplcjogU2lnbmFsUGFja2V0LFxufSk7XG5cbmV4cG9ydCBjbGFzcyBTaWduYWxFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPFNpZ25hbEV4dGVuc2lvbj4gPSBTSUdOQUxfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzaWduYWxzID0gbmV3IElkZW50aWZpZXJNYXA8U2lnbmFsVHlwZTx1bmtub3duPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUpIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBTSUdOQUxfUkVHSVNURVJfUEFDS0VULFxuICAgICAgICAgICAgU0lHTkFMX0xJU1RFTl9QQUNLRVQsXG4gICAgICAgICAgICBTSUdOQUxfTk9USUZZX1BBQ0tFVCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVNpZ25hbDxUPihzaWduYWxUeXBlOiBTaWduYWxUeXBlPFQ+KTogU2lnbmFsPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmFscy5oYXMoc2lnbmFsVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2lnbmFsIGZvciBrZXkgJHtzaWduYWxUeXBlLmlkfSBhbHJlYWR5IGNyZWF0ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFNpZ25hbEltcGwodGhpcy5vbXUsIHNpZ25hbFR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBqc29uPFQsIEQgZXh0ZW5kcyBKc29uVHlwZSA9IEpzb25UeXBlPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHNlcmlhbGl6ZXI/OiBTZXJpYWxpemFibGU8VCwgRD4gfSk6IFNpZ25hbDxUPiB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBTaWduYWxUeXBlLmNyZWF0ZUpzb248VD4oaWQsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zPy5zZXJpYWxpemVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2lnbmFsKHR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVkPFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogeyBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4gfSk6IFNpZ25hbDxUPiB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5vbXUuYXBwLmlkLmpvaW4obmFtZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBTaWduYWxUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VD4oaWQsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzZXJpYWxpemVyOiBvcHRpb25zPy5zZXJpYWxpemVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2lnbmFsKHR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4oc2lnbmFsVHlwZTogU2lnbmFsVHlwZTxUPik6IFNpZ25hbDxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25hbChzaWduYWxUeXBlKTtcbiAgICB9XG59XG5cbmNsYXNzIFNpZ25hbEltcGw8VD4gaW1wbGVtZW50cyBTaWduYWw8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzOiAoKHZhbHVlOiBUKSA9PiB2b2lkKVtdID0gW107XG4gICAgcHJpdmF0ZSBsaXN0ZW5pbmcgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IFNpZ25hbFR5cGU8VD4sXG4gICAgKSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoU0lHTkFMX05PVElGWV9QQUNLRVQsIChkYXRhKSA9PiB0aGlzLmhhbmRsZUJyb2FkY2FzdChkYXRhKSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFRhc2soKCkgPT4gdGhpcy5vblRhc2soKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5vdGlmeShib2R5OiBUKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnR5cGUuc2VyaWFsaXplci5zZXJpYWxpemUoYm9keSk7XG4gICAgICAgIHRoaXMub211LnNlbmQoU0lHTkFMX05PVElGWV9QQUNLRVQsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnR5cGUuaWQsXG4gICAgICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgICAgICAgbGlzdGVuZXIoYm9keSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdGVuKGhhbmRsZXI6ICh2YWx1ZTogVCkgPT4gdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5vbXUub25SZWFkeSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChTSUdOQUxfTElTVEVOX1BBQ0tFVCwgdGhpcy50eXBlLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goaGFuZGxlcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UodGhpcy5saXN0ZW5lcnMuaW5kZXhPZihoYW5kbGVyKSwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVCcm9hZGNhc3QoZGF0YTogU2lnbmFsUGFja2V0KTogdm9pZCB7XG4gICAgICAgIGlmICghZGF0YS5pZC5pc0VxdWFsKHRoaXMudHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBib2R5ID0gdGhpcy50eXBlLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YS5ib2R5KTtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgICAgICAgbGlzdGVuZXIoYm9keSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGFzaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUuaWQuaXNTdWJwYXRoT2YodGhpcy5vbXUuYXBwLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub211LnNlbmQoU0lHTkFMX1JFR0lTVEVSX1BBQ0tFVCwge1xuICAgICAgICAgICAgaWQ6IHRoaXMudHlwZS5pZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB0aGlzLnR5cGUucGVybWlzc2lvbnMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAidHlwZSBPazxUPiA9IHtcbiAgICBvazogdHJ1ZTtcbiAgICBkYXRhOiBUO1xufTtcbnR5cGUgRXJyPEU+ID0ge1xuICAgIG9rOiBmYWxzZTtcbiAgICBkYXRhOiBFO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUNhdGNoPFQsIEUgPSBFcnJvcj4oZnVuYzogKCkgPT4gVCk6IE9rPFQ+IHwgRXJyPEU+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgZGF0YTogZnVuYygpIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGRhdGE6IGUgYXMgRSB9O1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBZGRyZXNzIH0gZnJvbSAnLi9hZGRyZXNzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICcuL2FwcC5qcyc7XG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJy4vaGVscGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblByb3ZpZGVyIHtcbiAgICBnZXQoc2VydmVyQWRkcmVzczogQWRkcmVzcywgYXBwOiBBcHApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG59XG5cbmV4cG9ydCB0eXBlIFNlc3Npb25QYXJhbSA9IHtcbiAgICBhZGRyZXNzOiBBZGRyZXNzO1xuICAgIHRva2VuOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgQnJvd3NlclRva2VuUHJvdmlkZXIgaW1wbGVtZW50cyBUb2tlblByb3ZpZGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRPS0VOX1BBUkFNX0tFWSA9ICdfb211X3Nlc3Npb24nO1xuXG4gICAgcHJpdmF0ZSBnZXRLZXkoYWRkcmVzczogQWRkcmVzcywgYXBwOiBBcHApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW2FkZHJlc3MuaG9zdCwgYWRkcmVzcy5wb3J0LCBhZGRyZXNzLmhhc2ggPz8gJycsIGFwcC5pZC5rZXkoKV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoYWRkcmVzczogQWRkcmVzcywgYXBwOiBBcHApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCBmb3VuZFRva2VuID0gdGhpcy5wYXJzZVBhcmFtU2Vzc2lvbihhZGRyZXNzKTtcbiAgICAgICAgaWYgKGZvdW5kVG9rZW4pIHJldHVybiBmb3VuZFRva2VuO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZVBhcmFtU2Vzc2lvbihhZGRyZXNzOiBBZGRyZXNzKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICBjb25zdCBwYXJhbSA9IHNlYXJjaFBhcmFtcy5nZXQoQnJvd3NlclRva2VuUHJvdmlkZXIuVE9LRU5fUEFSQU1fS0VZKTtcbiAgICAgICAgaWYgKCFwYXJhbSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB7IG9rLCBkYXRhOiBzZXNzaW9uIH0gPSB0cnlDYXRjaDxTZXNzaW9uUGFyYW0+KCgpID0+IEpTT04ucGFyc2UocGFyYW0pKTtcbiAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gcGFyc2Ugc2Vzc2lvbiBmcm9tIFVSTCBwYXJhbWV0ZXI6ICR7c2Vzc2lvbn1gKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlc3Npb24uYWRkcmVzcy5oYXNoICE9PSBhZGRyZXNzLmhhc2gpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU2Vzc2lvbiBhZGRyZXNzIGhhc2ggZG9lcyBub3QgbWF0Y2g6IGV4cGVjdGVkICR7YWRkcmVzcy5oYXNofSwgZ290ICR7c2Vzc2lvbi5hZGRyZXNzLmhhc2h9YCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXNzaW9uLnRva2VuO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgRXh0ZW5zaW9uUmVnaXN0cnkgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBBU1NFVF9FWFRFTlNJT05fVFlQRSwgdHlwZSBBc3NldEV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL2Fzc2V0L2V4dGVuc2lvbic7XG5pbXBvcnQgeyBEQVNIQk9BUkRfRVhURU5TSU9OX1RZUEUsIHR5cGUgRGFzaGJvYXJkRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvZGFzaGJvYXJkL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBFTkRQT0lOVF9FWFRFTlNJT05fVFlQRSwgdHlwZSBFbmRwb2ludEV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL2VuZHBvaW50L2V4dGVuc2lvbic7XG5pbXBvcnQgeyBIVFRQX0VYVEVOU0lPTl9UWVBFLCBIdHRwRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvaHR0cC9leHRlbnNpb24nO1xuaW1wb3J0IHsgSTE4Tl9FWFRFTlNJT05fVFlQRSwgdHlwZSBJMThuRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvaTE4bi9leHRlbnNpb24nO1xuaW1wb3J0IHsgTE9HR0VSX0VYVEVOU0lPTl9UWVBFLCB0eXBlIExvZ2dlckV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL2xvZ2dlci9leHRlbnNpb24uanMnO1xuaW1wb3J0IHsgUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRSwgdHlwZSBQZXJtaXNzaW9uRXh0ZW5zaW9uIH0gZnJvbSAnLi9hcGkvcGVybWlzc2lvbi9leHRlbnNpb24nO1xuaW1wb3J0IHsgUExVR0lOX0VYVEVOU0lPTl9UWVBFLCB0eXBlIFBsdWdpbkV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL3BsdWdpbi9leHRlbnNpb24nO1xuaW1wb3J0IHsgUkVHSVNUUllfRVhURU5TSU9OX1RZUEUsIHR5cGUgUmVnaXN0cnlFeHRlbnNpb24gfSBmcm9tICcuL2FwaS9yZWdpc3RyeS9leHRlbnNpb24nO1xuaW1wb3J0IHsgU0VSVkVSX0VYVEVOU0lPTl9UWVBFLCB0eXBlIFNlcnZlckV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL3NlcnZlci9leHRlbnNpb24nO1xuaW1wb3J0IHsgU0VTU0lPTl9FWFRFTlNJT05fVFlQRSwgU2Vzc2lvbkV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL3Nlc3Npb24nO1xuaW1wb3J0IHsgU0lHTkFMX0VYVEVOU0lPTl9UWVBFLCB0eXBlIFNpZ25hbEV4dGVuc2lvbiB9IGZyb20gJy4vYXBpL3NpZ25hbC9leHRlbnNpb24nO1xuaW1wb3J0IHsgVEFCTEVfRVhURU5TSU9OX1RZUEUsIHR5cGUgVGFibGVFeHRlbnNpb24gfSBmcm9tICcuL2FwaS90YWJsZS9leHRlbnNpb24nO1xuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICcuL2FwcC5qcyc7XG5pbXBvcnQgdHlwZSB7IFVubGlzdGVuIH0gZnJvbSAnLi9ldmVudCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL2V2ZW50JztcbmltcG9ydCB0eXBlIHsgQWRkcmVzcywgQ29ubmVjdGlvbiB9IGZyb20gJy4vbmV0d29yayc7XG5pbXBvcnQgeyBOZXR3b3JrIH0gZnJvbSAnLi9uZXR3b3JrJztcbmltcG9ydCB7IFRyYW5zcG9ydCB9IGZyb20gJy4vbmV0d29yay9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB7IFBBQ0tFVF9UWVBFUyB9IGZyb20gJy4vbmV0d29yay9wYWNrZXQvcGFja2V0LXR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2V0VHlwZSB9IGZyb20gJy4vbmV0d29yay9wYWNrZXQvcGFja2V0LmpzJztcbmltcG9ydCB7IFdlYnNvY2tldFRyYW5zcG9ydCB9IGZyb20gJy4vbmV0d29yay93ZWJzb2NrZXQtdHJhbnNwb3J0JztcbmltcG9ydCB7IEJyb3dzZXJUb2tlblByb3ZpZGVyLCB0eXBlIFRva2VuUHJvdmlkZXIgfSBmcm9tICcuL3Rva2VuLmpzJztcblxuZXhwb3J0IHR5cGUgQ2xpZW50RXZlbnRzID0ge1xuICAgIHN0YXJ0ZWQ6IEV2ZW50RW1pdHRlcjxbXT47XG4gICAgc3RvcHBlZDogRXZlbnRFbWl0dGVyPFtdPjtcbiAgICByZWFkeTogRXZlbnRFbWl0dGVyPFtdPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPbXUge1xuICAgIHB1YmxpYyByZWFkeTogYm9vbGVhbjtcbiAgICBwdWJsaWMgcnVubmluZzogYm9vbGVhbjtcbiAgICByZWFkb25seSBldmVudDogQ2xpZW50RXZlbnRzID0ge1xuICAgICAgICBzdGFydGVkOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICAgIHN0b3BwZWQ6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICAgICAgcmVhZHk6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICB9O1xuICAgIHJlYWRvbmx5IHRva2VuOiBUb2tlblByb3ZpZGVyO1xuICAgIHJlYWRvbmx5IGFkZHJlc3M6IEFkZHJlc3M7XG4gICAgcmVhZG9ubHkgc2Vzc2lvbnM6IFNlc3Npb25FeHRlbnNpb247XG4gICAgcmVhZG9ubHkgbmV0d29yazogTmV0d29yaztcbiAgICByZWFkb25seSBlbmRwb2ludHM6IEVuZHBvaW50RXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IHBsdWdpbnM6IFBsdWdpbkV4dGVuc2lvbjtcbiAgICByZWFkb25seSBkYXNoYm9hcmQ6IERhc2hib2FyZEV4dGVuc2lvbjtcbiAgICByZWFkb25seSBleHRlbnNpb25zOiBFeHRlbnNpb25SZWdpc3RyeTtcbiAgICByZWFkb25seSB0YWJsZXM6IFRhYmxlRXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IHJlZ2lzdHJpZXM6IFJlZ2lzdHJ5RXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IHNpZ25hbHM6IFNpZ25hbEV4dGVuc2lvbjtcbiAgICByZWFkb25seSBhc3NldHM6IEFzc2V0RXh0ZW5zaW9uO1xuICAgIHJlYWRvbmx5IGkxOG46IEkxOG5FeHRlbnNpb247XG4gICAgcmVhZG9ubHkgc2VydmVyOiBTZXJ2ZXJFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXJFeHRlbnNpb247XG4gICAgcmVhZG9ubHkgaHR0cDogSHR0cEV4dGVuc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYXBwOiBBcHAsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBhZGRyZXNzPzogQWRkcmVzcztcbiAgICAgICAgICAgIHRva2VuPzogVG9rZW5Qcm92aWRlciB8IHN0cmluZztcbiAgICAgICAgICAgIHRyYW5zcG9ydD86IFRyYW5zcG9ydDtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uO1xuICAgICAgICB9LFxuICAgICkge1xuICAgICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnM/LnRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBvcHRpb25zPy50b2tlbjtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSB7XG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiBQcm9taXNlLnJlc29sdmUodG9rZW4pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSBvcHRpb25zPy50b2tlbiA/PyBuZXcgQnJvd3NlclRva2VuUHJvdmlkZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZHJlc3MgPSBvcHRpb25zPy5hZGRyZXNzID8/IHtcbiAgICAgICAgICAgIGhvc3Q6ICcxMjcuMC4wLjEnLFxuICAgICAgICAgICAgcG9ydDogMjY0MjMsXG4gICAgICAgICAgICBzZWN1cmU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm5ldHdvcmsgPSBuZXcgTmV0d29yayhcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLmFkZHJlc3MsXG4gICAgICAgICAgICB0aGlzLnRva2VuLFxuICAgICAgICAgICAgb3B0aW9ucz8udHJhbnNwb3J0ID8/IG5ldyBXZWJzb2NrZXRUcmFuc3BvcnQodGhpcy5hZGRyZXNzKSxcbiAgICAgICAgICAgIG9wdGlvbnM/LmNvbm5lY3Rpb24sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubmV0d29yay5ldmVudC5kaXNjb25uZWN0ZWQubGlzdGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFBBQ0tFVF9UWVBFUy5SRUFEWSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZHkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2VpdmVkIFJFQURZIHBhY2tldCB3aGVuIGFscmVhZHkgcmVhZHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5ldmVudC5yZWFkeS5lbWl0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBuZXcgRXh0ZW5zaW9uUmVnaXN0cnkodGhpcyk7XG4gICAgICAgIHRoaXMuZW5kcG9pbnRzID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKEVORFBPSU5UX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKFBMVUdJTl9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoUEVSTUlTU0lPTl9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMudGFibGVzID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKFRBQkxFX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5zZXNzaW9ucyA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihTRVNTSU9OX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5yZWdpc3RyaWVzID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKFJFR0lTVFJZX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmQgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoREFTSEJPQVJEX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5zaWduYWxzID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKFNJR05BTF9FWFRFTlNJT05fVFlQRSk7XG4gICAgICAgIHRoaXMuYXNzZXRzID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKEFTU0VUX0VYVEVOU0lPTl9UWVBFKTtcbiAgICAgICAgdGhpcy5pMThuID0gdGhpcy5leHRlbnNpb25zLnJlZ2lzdGVyKEkxOE5fRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLnNlcnZlciA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihTRVJWRVJfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLmxvZ2dlciA9IHRoaXMuZXh0ZW5zaW9ucy5yZWdpc3RlcihMT0dHRVJfRVhURU5TSU9OX1RZUEUpO1xuICAgICAgICB0aGlzLmh0dHAgPSB0aGlzLmV4dGVuc2lvbnMucmVnaXN0ZXIoSFRUUF9FWFRFTlNJT05fVFlQRSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbmQ8VD4ocGFja2V0VHlwZTogUGFja2V0VHlwZTxUPiwgZGF0YTogVCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5ldHdvcmsuc2VuZCh7XG4gICAgICAgICAgICB0eXBlOiBwYWNrZXRUeXBlLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5ydW5uaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NsaWVudCBhbHJlYWR5IHJ1bm5pbmcnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBjb25uZWN0ID0gdGhpcy5uZXR3b3JrLmNvbm5lY3QoKTtcbiAgICAgICAgdGhpcy5ldmVudC5zdGFydGVkLmVtaXQoKTtcbiAgICAgICAgYXdhaXQgY29ubmVjdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmVudC5zdG9wcGVkLmVtaXQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25SZWFkeShjYWxsYmFjazogKCkgPT4gdm9pZCk6IFVubGlzdGVuIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHkpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQucmVhZHkubGlzdGVuKGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd2FpdEZvclJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkeSkgcmV0dXJuO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGxldCB1bmxpc3RlbiA9ICgpID0+IHt9O1xuICAgICAgICAgICAgdW5saXN0ZW4gPSB0aGlzLmV2ZW50LnJlYWR5Lmxpc3RlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwKICAgICJleHBvcnQgeyBBcHAsIEFwcE1ldGFkYXRhIH0gZnJvbSAnLi9hcHAuanMnO1xuZXhwb3J0IHsgRGlzY29ubmVjdFJlYXNvbiB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmV4cG9ydCB7IElkZW50aWZpZXIsIElkZW50aWZpZXJNYXAsIElkZW50aWZpZXJTZXQsIEludG9JZCB9IGZyb20gJy4vaWRlbnRpZmllcic7XG5leHBvcnQgKiBhcyBuZXR3b3JrIGZyb20gJy4vbmV0d29yayc7XG5leHBvcnQgeyBPbXUgfSBmcm9tICcuL29tdS5qcyc7XG5leHBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi9zZXJpYWxpemUnO1xuZXhwb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3NlcmlhbGl6ZSc7XG5leHBvcnQgeyBCcm93c2VyVG9rZW5Qcm92aWRlciwgdHlwZSBTZXNzaW9uUGFyYW0sIHR5cGUgVG9rZW5Qcm92aWRlciB9IGZyb20gJy4vdG9rZW4nO1xuaW1wb3J0IHsgQVNTRVRfUEVSTUlTU0lPTl9JRCB9IGZyb20gJy4vYXBpL2Fzc2V0JztcbmltcG9ydCB7XG4gICAgREFTSEJPQVJEX0FQUF9JTlNUQUxMX1BFUk1JU1NJT05fSUQsXG4gICAgREFTaEJPQVJEX0RSQUdfRFJPUF9QRVJNSVNTSU9OX0lELFxuICAgIERBU0hCT0FSRF9PUEVOX0FQUF9QRVJNSVNTSU9OX0lELFxuICAgIERBU0hCT0FSRF9TRVRfUEVSTUlTU0lPTl9JRCxcbiAgICBEQVNIQk9BUkRfU1BFRUNIX1JFQ09HTklUSU9OX1BFUk1JU1NJT05fSUQsXG4gICAgREFTSEJPQVJEX1dFQlZJRVdfUEVSTUlTU0lPTl9JRCxcbiAgICBEQVNIT0JBUkRfQVBQX0VESVRfUEVSTUlTU0lPTl9JRCxcbiAgICBEQVNIT0JBUkRfQVBQX1JFQURfUEVSTUlTU0lPTl9JRCxcbn0gZnJvbSAnLi9hcGkvZGFzaGJvYXJkJztcbmltcG9ydCB7IEhUVFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lEIH0gZnJvbSAnLi9hcGkvaHR0cCc7XG5pbXBvcnQgeyBJMThOX0dFVF9MT0NBTEVTX1BFUk1JU1NJT05fSUQsIEkxOE5fU0VUX0xPQ0FMRVNfUEVSTUlTU0lPTl9JRCB9IGZyb20gJy4vYXBpL2kxOG4nO1xuaW1wb3J0IHsgTE9HR0VSX0xPR19QRVJNSVNTSU9OX0lEIH0gZnJvbSAnLi9hcGkvbG9nZ2VyJztcbmltcG9ydCB7IFBMVUdJTl9NQU5BR0VfUEFDS0FHRV9QRVJNSVNTSU9OX0lELCBQTFVHSU5fUkVBRF9QQUNLQUdFX1BFUk1JU1NJT05fSUQgfSBmcm9tICcuL2FwaS9wbHVnaW4nO1xuaW1wb3J0IHsgUkVHSVNUUllfUEVSTUlTU0lPTl9JRCB9IGZyb20gJy4vYXBpL3JlZ2lzdHJ5JztcbmltcG9ydCB7IFNFUlZFUl9BUFBTX1JFQURfUEVSTUlTU0lPTl9JRCwgU0VSVkVSX1NIVVRET1dOX1BFUk1JU1NJT05fSUQsIFRSVVNURURfT1JJR0lOU19HRVRfUEVSTUlTU0lPTl9JRCwgVFJVU1RFRF9PUklHSU5TX1NFVF9QRVJNSVNTSU9OX0lEIH0gZnJvbSAnLi9hcGkvc2VydmVyJztcbmltcG9ydCB7IEdFTkVSQVRFX1RPS0VOX1BFUk1JU1NJT05fSUQsIFJFTU9URV9BUFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lELCBTRVNTSU9OU19SRUFEX1BFUk1JU1NJT05fSUQgfSBmcm9tICcuL2FwaS9zZXNzaW9uJztcbmltcG9ydCB7IFRBQkxFX1BFUk1JU1NJT05fSUQgfSBmcm9tICcuL2FwaS90YWJsZSc7XG5pbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi9pZGVudGlmaWVyJztcblxuZXhwb3J0IGNvbnN0IE9tdVBlcm1pc3Npb25zOiB7XG4gICAgLy8gQXNzZXQgQVBJXG4gICAgcmVhZG9ubHkgQVNTRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjtcbiAgICAvLyBEYXNoYm9hcmQgQVBJXG4gICAgcmVhZG9ubHkgREFTSEJPQVJEX0FQUF9JTlNUQUxMX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7IHJlYWRvbmx5IERBU2hCT0FSRF9EUkFHX0RST1BfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjsgcmVhZG9ubHkgREFTSEJPQVJEX09QRU5fQVBQX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7IHJlYWRvbmx5IERBU0hCT0FSRF9TRVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjsgcmVhZG9ubHkgREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyOyByZWFkb25seSBEQVNIQk9BUkRfV0VCVklFV19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyOyByZWFkb25seSBEQVNIT0JBUkRfQVBQX0VESVRfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjsgcmVhZG9ubHkgREFTSE9CQVJEX0FQUF9SRUFEX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7XG4gICAgLy8gSFRUUCBBUElcbiAgICByZWFkb25seSBIVFRQX1JFUVVFU1RfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjtcbiAgICAvLyBJMThuIEFQSVxuICAgIHJlYWRvbmx5IEkxOE5fR0VUX0xPQ0FMRVNfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjsgcmVhZG9ubHkgSTE4Tl9TRVRfTE9DQUxFU19QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyO1xuICAgIC8vIExvZ2dlciBBUElcbiAgICByZWFkb25seSBMT0dHRVJfTE9HX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7XG4gICAgLy8gUGx1Z2luIEFQSVxuICAgIHJlYWRvbmx5IFBMVUdJTl9NQU5BR0VfUEFDS0FHRV9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyOyByZWFkb25seSBQTFVHSU5fUkVBRF9QQUNLQUdFX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7XG4gICAgLy8gUmVnaXN0cnkgQVBJXG4gICAgcmVhZG9ubHkgUkVHSVNUUllfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjtcbiAgICAvLyBTZXJ2ZXIgQVBJXG4gICAgcmVhZG9ubHkgU0VSVkVSX0FQUFNfUkVBRF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyOyByZWFkb25seSBTRVJWRVJfU0hVVERPV05fUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjsgcmVhZG9ubHkgVFJVU1RFRF9PUklHSU5TX0dFVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyOyByZWFkb25seSBUUlVTVEVEX09SSUdJTlNfU0VUX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7XG4gICAgLy8gU2Vzc2lvbiBBUElcbiAgICByZWFkb25seSBHRU5FUkFURV9UT0tFTl9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyOyByZWFkb25seSBSRU1PVEVfQVBQX1JFUVVFU1RfUEVSTUlTU0lPTl9JRDogSWRlbnRpZmllcjsgcmVhZG9ubHkgU0VTU0lPTlNfUkVBRF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyO1xuICAgIC8vIFRhYmxlIEFQSVxuICAgIHJlYWRvbmx5IFRBQkxFX1BFUk1JU1NJT05fSUQ6IElkZW50aWZpZXI7XG59ID0ge1xuICAgIC8vIEFzc2V0IEFQSVxuICAgIEFTU0VUX1BFUk1JU1NJT05fSUQ6IEFTU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgLy8gRGFzaGJvYXJkIEFQSVxuICAgIERBU0hCT0FSRF9BUFBfSU5TVEFMTF9QRVJNSVNTSU9OX0lELFxuICAgIERBU2hCT0FSRF9EUkFHX0RST1BfUEVSTUlTU0lPTl9JRCxcbiAgICBEQVNIQk9BUkRfT1BFTl9BUFBfUEVSTUlTU0lPTl9JRCxcbiAgICBEQVNIQk9BUkRfU0VUX1BFUk1JU1NJT05fSUQsXG4gICAgREFTSEJPQVJEX1NQRUVDSF9SRUNPR05JVElPTl9QRVJNSVNTSU9OX0lELFxuICAgIERBU0hCT0FSRF9XRUJWSUVXX1BFUk1JU1NJT05fSUQsXG4gICAgREFTSE9CQVJEX0FQUF9FRElUX1BFUk1JU1NJT05fSUQsXG4gICAgREFTSE9CQVJEX0FQUF9SRUFEX1BFUk1JU1NJT05fSUQsXG4gICAgLy8gSFRUUCBBUElcbiAgICBIVFRQX1JFUVVFU1RfUEVSTUlTU0lPTl9JRCxcbiAgICAvLyBJMThuIEFQSVxuICAgIEkxOE5fR0VUX0xPQ0FMRVNfUEVSTUlTU0lPTl9JRCxcbiAgICBJMThOX1NFVF9MT0NBTEVTX1BFUk1JU1NJT05fSUQsXG4gICAgLy8gTG9nZ2VyIEFQSVxuICAgIExPR0dFUl9MT0dfUEVSTUlTU0lPTl9JRCxcbiAgICAvLyBQbHVnaW4gQVBJXG4gICAgUExVR0lOX01BTkFHRV9QQUNLQUdFX1BFUk1JU1NJT05fSUQsXG4gICAgUExVR0lOX1JFQURfUEFDS0FHRV9QRVJNSVNTSU9OX0lELFxuICAgIC8vIFJlZ2lzdHJ5IEFQSVxuICAgIFJFR0lTVFJZX1BFUk1JU1NJT05fSUQsXG4gICAgLy8gU2VydmVyIEFQSVxuICAgIFNFUlZFUl9BUFBTX1JFQURfUEVSTUlTU0lPTl9JRCxcbiAgICBTRVJWRVJfU0hVVERPV05fUEVSTUlTU0lPTl9JRCxcbiAgICBUUlVTVEVEX09SSUdJTlNfR0VUX1BFUk1JU1NJT05fSUQsXG4gICAgVFJVU1RFRF9PUklHSU5TX1NFVF9QRVJNSVNTSU9OX0lELFxuICAgIC8vIFNlc3Npb24gQVBJXG4gICAgR0VORVJBVEVfVE9LRU5fUEVSTUlTU0lPTl9JRCxcbiAgICBSRU1PVEVfQVBQX1JFUVVFU1RfUEVSTUlTU0lPTl9JRCxcbiAgICBTRVNTSU9OU19SRUFEX1BFUk1JU1NJT05fSUQsXG4gICAgLy8gVGFibGUgQVBJXG4gICAgVEFCTEVfUEVSTUlTU0lPTl9JRCxcbn0gYXMgY29uc3Q7XG4iCiAgXSwKICAi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