@fjall/components-infrastructure 0.88.1 → 0.88.3

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.
Files changed (33) hide show
  1. package/dist/lib/app.d.ts +1 -1
  2. package/dist/lib/app.js +5 -4
  3. package/dist/lib/config/aws/identityCenter.d.ts +4 -4
  4. package/dist/lib/config/aws/identityCenter.js +17 -62
  5. package/dist/lib/config/aws/identityCenterGroupMembership.js +27 -37
  6. package/dist/lib/config/aws/index.d.ts +0 -7
  7. package/dist/lib/config/aws/index.js +1 -8
  8. package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets +30 -0
  9. package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
  10. package/dist/lib/layers/secrets-resolver/bin/resolve-secrets +30 -0
  11. package/dist/lib/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
  12. package/dist/lib/patterns/aws/account.js +24 -10
  13. package/dist/lib/patterns/aws/database.d.ts +2 -2
  14. package/dist/lib/patterns/aws/database.js +3 -3
  15. package/dist/lib/patterns/aws/organisation.d.ts +4 -17
  16. package/dist/lib/patterns/aws/organisation.js +7 -65
  17. package/dist/lib/patterns/aws/payload.js +5 -5
  18. package/dist/lib/resources/aws/compute/lambda.d.ts +12 -1
  19. package/dist/lib/resources/aws/compute/lambda.js +37 -10
  20. package/dist/lib/resources/aws/database/rdsAurora.js +2 -2
  21. package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +0 -2
  22. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +9 -45
  23. package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -3
  24. package/dist/lib/resources/aws/iam/identityCenter/group.js +7 -82
  25. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -3
  26. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +9 -93
  27. package/dist/lib/resources/aws/networking/ipamPool.js +56 -3
  28. package/dist/lib/resources/aws/secrets/parameter.js +5 -3
  29. package/dist/lib/resources/aws/storage/ecr.js +2 -4
  30. package/dist/lib/utils/getConfig.d.ts +4 -1
  31. package/dist/lib/utils/getConfig.js +1 -1
  32. package/dist/lib/utils/resourceNaming.js +4 -7
  33. package/package.json +5 -5
package/dist/lib/app.d.ts CHANGED
@@ -249,7 +249,7 @@ export declare class App extends CdkApp {
249
249
  * // Aurora database - returns RelationalDatabase
250
250
  * const db = app.addDatabase(DatabaseFactory.build("Main", {
251
251
  * type: "Aurora",
252
- * databaseName: "myapp"
252
+ * databaseName: "my_app"
253
253
  * }));
254
254
  * db.getHostEndpoint(); // Available
255
255
  *
package/dist/lib/app.js CHANGED
@@ -258,8 +258,9 @@ class App extends aws_cdk_lib_1.App {
258
258
  getDefaultContainerRegistry() {
259
259
  if (!this.defaultEcr) {
260
260
  const networkStack = this.getDefaultNetworkStack();
261
- // TODO: revert to passing { repositoryName: toKebab(this.name) } after webapp redeploy (temp fix to prevent ECR replacement)
262
- const ecr = ecr_1.EcrFactory.build(`${this.stackPrefix}Ecr`)(this, networkStack.getStack());
261
+ const ecr = ecr_1.EcrFactory.build(`${this.stackPrefix}Ecr`, {
262
+ repositoryName: (0, capitaliseString_1.toKebab)(this.name)
263
+ })(this, networkStack.getStack());
263
264
  this.defaultEcr = ecr;
264
265
  return ecr;
265
266
  }
@@ -382,7 +383,7 @@ class App extends aws_cdk_lib_1.App {
382
383
  * // Aurora database - returns RelationalDatabase
383
384
  * const db = app.addDatabase(DatabaseFactory.build("Main", {
384
385
  * type: "Aurora",
385
- * databaseName: "myapp"
386
+ * databaseName: "my_app"
386
387
  * }));
387
388
  * db.getHostEndpoint(); // Available
388
389
  *
@@ -647,4 +648,4 @@ class App extends aws_cdk_lib_1.App {
647
648
  exports.App = App;
648
649
  App.instance = null;
649
650
  exports.default = App;
650
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FLcUI7QUFHckIsd0RBQXFEO0FBR3JELDJDQUF1QztBQUN2QyxxREFBbUU7QUFFbkUsb0RBSWdDO0FBTWhDLG1FQUFnRTtBQUNoRSxtQ0FBcUM7QUFLckMsaURBQThDO0FBQzlDLDhFQUE4RTtBQUM5RSxvREFBOEQ7QUFDOUQsK0RBQStEO0FBQy9ELDBDQUFvRDtBQUNwRCwrREFBdUQ7QUFDdkQsMkRBSWdDO0FBQ2hDLCtEQUFpRTtBQStCakU7Ozs7R0FJRztBQUNILE1BQWEsR0FBSSxTQUFRLGlCQUFNO0lBb0I3QixZQUFvQixJQUFhLEVBQUUsT0FBcUI7UUFDdEQsS0FBSyxFQUFFLENBQUM7UUFmRixXQUFNLEdBQWdDLEVBQUUsQ0FBQztRQUd6QyxtQkFBYyxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFDO1FBS3pDLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGVBQVUsR0FBOEIsRUFBRSxDQUFDO1FBQzNDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBTzVCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXBCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLFVBQVUsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUEsK0JBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0MsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFBLHFDQUFvQixFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5QiwrQ0FBK0M7UUFDL0MsSUFBSSxPQUFPLEVBQUUsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENB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LG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBK0I7UUFDMUMsMEJBQTBCO1FBQzFCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEMsbURBQW1EO1FBQ25ELElBQUksQ0FBQztZQUNILElBQUEsOEJBQWEsRUFBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZiw0Q0FBNEM7WUFDNUMsTUFBTSxZQUFZLEdBQ2hCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6RCw4QkFBVyxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzs7QUFodkJILGtCQWl2QkM7QUFodkJnQixZQUFRLEdBQWUsSUFBSSxBQUFuQixDQUFvQjtBQWt2QjdDLGtCQUFlLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFwcCBhcyBDZGtBcHAsXG4gIEFzcGVjdHMsXG4gIFRhZ3MsXG4gIHR5cGUgU3RhZ2VTeW50aGVzaXNPcHRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgdHlwZSBDbG91ZEFzc2VtYmx5IH0gZnJvbSBcImF3cy1jZGstbGliL2N4LWFwaVwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVnBjIH0gZnJvbSBcIi4vcmVzb3VyY2VzL2F3cy9uZXR3b3JraW5nL3ZwY1wiO1xuaW1wb3J0IHsgdHlwZSBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IHR5cGUgUm9sZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuL3Jlc291cmNlc1wiO1xuaW1wb3J0IHsgdHlwZSBFY3IsIEVjckZhY3RvcnkgfSBmcm9tIFwiLi9yZXNvdXJjZXMvYXdzL3N0b3JhZ2UvZWNyXCI7XG5pbXBvcnQgeyB0eXBlIEFueURhdGFiYXNlIH0gZnJvbSBcIi4vcGF0dGVybnMvYXdzL2RhdGFiYXNlXCI7XG5pbXBvcnQge1xuICB0eXBlIElOZXR3b3JrUHJvcHMsXG4gIE5ldHdvcmtGYWN0b3J5LFxuICB0eXBlIE5ldHdvcmtcbn0gZnJvbSBcIi4vcGF0dGVybnMvYXdzL25ldHdvcmtcIjtcbmltcG9ydCB7IHR5cGUgQ2RuIH0gZnJvbSBcIi4vcGF0dGVybnMvYXdzL2NkblwiO1xuaW1wb3J0IHsgdHlwZSBBbnlNZXNzYWdpbmcgfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvbWVzc2FnaW5nXCI7XG5pbXBvcnQgeyB0eXBlIEFueUNvbXB1dGUgfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvY29tcHV0ZVwiO1xuaW1wb3J0IHsgdHlwZSBTdG9yYWdlLCB0eXBlIFN0b3JhZ2VGYWN0b3J5Rm4gfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3Mvc3RvcmFnZVwiO1xuaW1wb3J0IHsgdHlwZSBBbnlQYXR0ZXJuIH0gZnJvbSBcIi4vcGF0dGVybnMvYXdzL3BhdHRlcm5cIjtcbmltcG9ydCB7IFN0YW5kYXJkVGFnc0FzcGVjdCB9IGZyb20gXCIuL3V0aWxzL3N0YW5kYXJkVGFnc0FzcGVjdFwiO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQge1xuICB0eXBlIFJlc291cmNlSW52ZW50b3J5QXNwZWN0LFxuICB0eXBlIFJlc291cmNlSW52ZW50b3J5XG59IGZyb20gXCIuL2FzcGVjdHMvcmVzb3VyY2VJbnZlbnRvcnlcIjtcbmltcG9ydCB7IGdldENvbmZpZyB9IGZyb20gXCIuL3V0aWxzL2dldENvbmZpZ1wiO1xuaW1wb3J0IE1vbml0b3JpbmdSb2xlRmFjdG9yeSBmcm9tIFwiLi9yZXNvdXJjZXMvYXdzL21vbml0b3JpbmcvbW9uaXRvcmluZ1JvbGVcIjtcbmltcG9ydCB7IEZKQUxMX01PTklUT1JJTkdfQ09ORklHIH0gZnJvbSBcIi4vY29uZmlnL21vbml0b3JpbmdcIjtcbmltcG9ydCBBdWRpdFJvbGVGYWN0b3J5IGZyb20gXCIuL3Jlc291cmNlcy9hd3MvYXVkaXQvYXVkaXRSb2xlXCI7XG5pbXBvcnQgeyBGSkFMTF9BVURJVF9DT05GSUcgfSBmcm9tIFwiLi9jb25maWcvYXVkaXRcIjtcbmltcG9ydCB7IEZqYWxsTG9nZ2VyIH0gZnJvbSBcIi4vdXRpbHMvdmFsaWRhdGlvbkxvZ2dlclwiO1xuaW1wb3J0IHtcbiAgZ2V0TWFuaWZlc3RDb2xsZWN0b3IsXG4gIHdyaXRlTWFuaWZlc3QsXG4gIHR5cGUgTWFuaWZlc3RDb2xsZWN0b3Jcbn0gZnJvbSBcIi4vdXRpbHMvbWFuaWZlc3RXcml0ZXJcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSwgdG9LZWJhYiB9IGZyb20gXCIuL3V0aWxzL2NhcGl0YWxpc2VTdHJpbmdcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIEFwcC5nZXRBcHAoKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFwcCB3aXRoIG5ldyBWUENcbiAqIGNvbnN0IGFwcCA9IEFwcC5nZXRBcHAoYXBwTmFtZSwge1xuICogICBuZXR3b3JrOiB7IG1heEF6czogMiwgbmF0R2F0ZXdheXM6IGZhbHNlIH1cbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYXBwIHVzaW5nIGV4aXN0aW5nIFZQQ1xuICogY29uc3QgYXBwID0gQXBwLmdldEFwcChhcHBOYW1lLCB7XG4gKiAgIG5ldHdvcms6IHsgdXNlRXhpc3Rpbmc6IFwidnBjLTEyMzQ1Njc4XCIgfVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhcHAgd2l0aG91dCBuZXR3b3JrIChTMy1vbmx5IGFwcHMpXG4gKiBjb25zdCBhcHAgPSBBcHAuZ2V0QXBwKGFwcE5hbWUsIHsgbmV0d29yazogZmFsc2UgfSk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUFwcE9wdGlvbnMge1xuICAvKipcbiAgICogTmV0d29yayBjb25maWd1cmF0aW9uLlxuICAgKiAtIE9iamVjdCB3aXRoIElOZXR3b3JrUHJvcHM6IENyZWF0ZSBuZXcgVlBDIHdpdGggY29uZmlnXG4gICAqIC0gZmFsc2U6IE5vIG5ldHdvcmsgKGZvciBTMy1vbmx5IGFwcHMpXG4gICAqIC0geyB1c2VFeGlzdGluZzogc3RyaW5nIH06IFVzZSBleGlzdGluZyBWUEMgYnkgSURcbiAgICovXG4gIG5ldHdvcms/OiBJTmV0d29ya1Byb3BzIHwgZmFsc2UgfCB7IHVzZUV4aXN0aW5nOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzaWMgY29ybmVyLXN0b25lIG9mIGFsbCBGamFsbC1ob3N0ZWQgYXBwbGljYXRpb25zLlxuICogIFRoaXMgY2xhc3MgaXMgYSBzaW5nbGV0b24gYW5kIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSBhbmQgbWFuYWdlXG4gKiAgIGFsbCByZXNvdXJjZXMgaW4gYSBGamFsbCBhcHBsaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcCBleHRlbmRzIENka0FwcCB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBBcHAgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgLyoqIFBhc2NhbENhc2UgZm9ybSBvZiBuYW1lLCB1c2VkIGFzIHN0YWNrLW5hbWUgcHJlZml4IGFuZCBjb25zdHJ1Y3QgSURzLiAqL1xuICBwcml2YXRlIHN0YWNrUHJlZml4OiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhY2tzOiB7IFtrZXk6IHN0cmluZ106IEF3c1N0YWNrIH0gPSB7fTtcblxuICBwcml2YXRlIHZwYz86IElWcGM7XG4gIHByaXZhdGUgYWRkaXRpb25hbFZwY3MgPSBuZXcgTWFwPHN0cmluZywgSVZwYz4oKTtcbiAgcHJpdmF0ZSBkZWZhdWx0RWNyOiBFY3IgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZGVmYXVsdE1vbml0b3JpbmdSb2xlOiBSb2xlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGRlZmF1bHRBdWRpdFJvbGU6IFJvbGUgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgYXVkaXRSb2xlRXh0ZXJuYWxJZD86IHN0cmluZztcbiAgcHJpdmF0ZSBuZXR3b3JrRGlzYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBnbG9iYWxUYWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gIHByaXZhdGUgYXNwZWN0QXBwbGllZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc291cmNlSW52ZW50b3J5PzogUmVzb3VyY2VJbnZlbnRvcnlBc3BlY3Q7XG4gIHByaXZhdGUgbWFuaWZlc3RDb2xsZWN0b3I6IE1hbmlmZXN0Q29sbGVjdG9yO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IobmFtZT86IHN0cmluZywgb3B0aW9ucz86IElBcHBPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIEFwcC5pbnN0YW5jZSA9IHRoaXM7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lID8/IFwiRmphbGxBcHBcIjtcbiAgICB0aGlzLnN0YWNrUHJlZml4ID0gdG9QYXNjYWxDYXNlKHRoaXMubmFtZSk7XG5cbiAgICAvLyBJbml0aWFsaXNlIG1hbmlmZXN0IGNvbGxlY3RvciBmb3IgYnVpbGQtdGltZSBzZXJ2aWNlIGRpc2NvdmVyeVxuICAgIHRoaXMubWFuaWZlc3RDb2xsZWN0b3IgPSBnZXRNYW5pZmVzdENvbGxlY3Rvcih0aGlzLm5hbWUpO1xuXG4gICAgdGhpcy5pbml0aWFsaXNlU3RhbmRhcmRUYWdzKCk7XG5cbiAgICAvLyBJbml0aWFsaXNlIG5ldHdvcmsgaW1tZWRpYXRlbHkgaWYgY29uZmlndXJlZFxuICAgIGlmIChvcHRpb25zPy5uZXR3b3JrID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5uZXR3b3JrRGlzYWJsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucz8ubmV0d29yaykge1xuICAgICAgdGhpcy5pbml0aWFsaXNlTmV0d29yayhvcHRpb25zLm5ldHdvcmspO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlIHRoZSBuZXR3b3JrIChWUEMpIGZvciB0aGlzIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXNlTmV0d29yayhcbiAgICBjb25maWc6IElOZXR3b3JrUHJvcHMgfCB7IHVzZUV4aXN0aW5nOiBzdHJpbmcgfVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuZXR3b3JrU3RhY2sgPSB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcblxuICAgIGlmIChcInVzZUV4aXN0aW5nXCIgaW4gY29uZmlnKSB7XG4gICAgICB0aGlzLnZwYyA9IFZwYy5mcm9tTG9va3VwKFxuICAgICAgICBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSxcbiAgICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1JbXBvcnRlZFZwY2AsXG4gICAgICAgIHtcbiAgICAgICAgICB2cGNJZDogY29uZmlnLnVzZUV4aXN0aW5nXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5ldHdvcmtDb25maWcgPSB7IC4uLmNvbmZpZywgdnBjTmFtZTogY29uZmlnLnZwY05hbWUgPz8gdGhpcy5uYW1lIH07XG4gICAgICBjb25zdCBuZXR3b3JrID0gTmV0d29ya0ZhY3RvcnkuYnVpbGQoXG4gICAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9VnBjYCxcbiAgICAgICAgbmV0d29ya0NvbmZpZ1xuICAgICAgKSh0aGlzLCBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgICB0aGlzLnZwYyA9IG5ldHdvcmsuZ2V0VnBjKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXBwbGljYXRpb24gbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGFwcGxpY2F0aW9uIG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQvQ3JlYXRlIGEgYmFzaWMgRmphbGwgQXBwbGljYXRpb24gd2l0aCBzdGFuZGFyZCB0YWdzIGFwcGxpZWQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIEFwcGxpY2F0aW9uIG5hbWVcbiAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBuZXR3b3JrIHNldHRpbmdzXG4gICAqIEByZXR1cm5zIHtBcHB9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENyZWF0ZSBhcHAgd2l0aCBuZXcgVlBDXG4gICAqIGNvbnN0IGFwcCA9IEFwcC5nZXRBcHAoYXBwTmFtZSwge1xuICAgKiAgIG5ldHdvcms6IHsgbWF4QXpzOiAyLCBuYXRHYXRld2F5czogZmFsc2UgfVxuICAgKiB9KTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQ3JlYXRlIGFwcCB1c2luZyBleGlzdGluZyBWUENcbiAgICogY29uc3QgYXBwID0gQXBwLmdldEFwcChhcHBOYW1lLCB7XG4gICAqICAgbmV0d29yazogeyB1c2VFeGlzdGluZzogXCJ2cGMtMTIzNDU2NzhcIiB9XG4gICAqIH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBDcmVhdGUgYXBwIHdpdGhvdXQgbmV0d29yayAoUzMtb25seSBhcHBzKVxuICAgKiBjb25zdCBhcHAgPSBBcHAuZ2V0QXBwKGFwcE5hbWUsIHsgbmV0d29yazogZmFsc2UgfSk7XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEFwcChuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogSUFwcE9wdGlvbnMpOiBBcHAge1xuICAgIGNvbnN0IGFwcCA9IEFwcC5nZXRJbnN0YW5jZShuYW1lLCBvcHRpb25zKTtcbiAgICBhcHAuaW5pdGlhbGlzZVN0YW5kYXJkVGFncygpO1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICAvKipcbiAgICogR2V0L0NyZWF0ZSB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBBcHBcbiAgICogQHBhcmFtIG5hbWUgQXBwbGljYXRpb24gbmFtZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIG5ldHdvcmsgc2V0dGluZ3NcbiAgICogQHJldHVybnMge0FwcH1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UobmFtZT86IHN0cmluZywgb3B0aW9ucz86IElBcHBPcHRpb25zKTogQXBwIHtcbiAgICAvLyBEZXNwaXRlIHN1cHBvcnRpbmcgbXVsdGlwbGUgc3RhY2tzIHlvdSBjYW4gc3RpbGwgb25seSBldmVyXG4gICAgLy8gaGF2ZSBhIHNpbmdsZSBBcHBsaWNhdGlvbiBwZXIgQ0RLIGRlcGxveW1lbnRcbiAgICBpZiAoIUFwcC5pbnN0YW5jZSkge1xuICAgICAgQXBwLmluc3RhbmNlID0gbmV3IEFwcChuYW1lLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgc2luZ2xldG9uIGV4aXN0cyBidXQgbmFtZSBkaWZmZXJzLCB1cGRhdGUgaXQgKGJlZm9yZSBhbnkgaW5mcmEgaXMgZGVmaW5lZClcbiAgICAgIGlmIChuYW1lICYmIEFwcC5pbnN0YW5jZS5uYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIC8vIFdhcm4gaWYgbmV0d29yayBhbHJlYWR5IGluaXRpYWxpc2VkIC0gY2hhbmdpbmcgbmFtZSBhZnRlciBuZXR3b3JrIGV4aXN0cyBjcmVhdGVzIGEgbWlzbWF0Y2hcbiAgICAgICAgaWYgKEFwcC5pbnN0YW5jZS52cGMpIHtcbiAgICAgICAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgICAgICAgYEFwcCBuYW1lIGNoYW5nZWQgZnJvbSBcIiR7QXBwLmluc3RhbmNlLm5hbWV9XCIgdG8gXCIke25hbWV9XCIgYWZ0ZXIgbmV0d29yayB3YXMgaW5pdGlhbGlzZWQuIGAgK1xuICAgICAgICAgICAgICBgVlBDIHdpbGwgaGF2ZSBuYW1lIFwiJHtBcHAuaW5zdGFuY2UubmFtZX1WcGNcIiBidXQgYXBwIG5hbWUgaXMgXCIke25hbWV9XCIuIGAgK1xuICAgICAgICAgICAgICBgRW5zdXJlIEFwcC5nZXRBcHAoKSBpcyBjYWxsZWQgd2l0aCB0aGUgZmluYWwgbmFtZSBiZWZvcmUgaW5pdGlhbGlzaW5nIG5ldHdvcmsuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgQXBwLmluc3RhbmNlLm5hbWUgPSBuYW1lO1xuICAgICAgICBBcHAuaW5zdGFuY2Uuc3RhY2tQcmVmaXggPSB0b1Bhc2NhbENhc2UobmFtZSk7XG4gICAgICAgIC8vIFJlaW5pdGlhbGlzZSBzdGFuZGFyZCB0YWdzIHdpdGggdGhlIG5ldyBuYW1lXG4gICAgICAgIEFwcC5pbnN0YW5jZS5pbml0aWFsaXNlU3RhbmRhcmRUYWdzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG9wdGlvbnMgcHJvdmlkZWQgYnV0IG5ldHdvcmsgbm90IHlldCBpbml0aWFsaXNlZCwgaW5pdGlhbGlzZSBpdCBub3dcbiAgICAgIGlmIChvcHRpb25zPy5uZXR3b3JrID09PSBmYWxzZSkge1xuICAgICAgICBBcHAuaW5zdGFuY2UubmV0d29ya0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIG9wdGlvbnM/Lm5ldHdvcmsgJiZcbiAgICAgICAgIUFwcC5pbnN0YW5jZS52cGMgJiZcbiAgICAgICAgIUFwcC5pbnN0YW5jZS5uZXR3b3JrRGlzYWJsZWRcbiAgICAgICkge1xuICAgICAgICBBcHAuaW5zdGFuY2UuaW5pdGlhbGlzZU5ldHdvcmsob3B0aW9ucy5uZXR3b3JrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXBwLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGEgc3RhY2sgYnkga2V5LiBJZiB0aGUgc3RhY2sgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICogIERlcGVuZGVuY2llcyBhcmUgb25seSBhcHBsaWVkIHRoZSBmaXJzdCB0aW1lIGEgc3RhY2sgaXMgY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgb2YgdGhlIHN0YWNrXG4gICAqIEBwYXJhbSBkZXBlbmRlbmNpZXMgLSBUaGUgc3RhY2socykgdGhhdCB0aGlzIHN0YWNrIGRlcGVuZHMgb25cbiAgICogQHJldHVybnMge0F3c1N0YWNrfVxuICAgKi9cbiAgcHVibGljIGdldFN0YWNrKGtleTogc3RyaW5nLCBkZXBlbmRlbmNpZXM/OiBBd3NTdGFjayB8IEF3c1N0YWNrW10pOiBBd3NTdGFjayB7XG4gICAgLy8gQXBwbHkgdGhlIGFzcGVjdCBvbmNlIGJlZm9yZSBjcmVhdGluZyB0aGUgZmlyc3Qgc3RhY2tcbiAgICBpZiAoXG4gICAgICAhdGhpcy5hc3BlY3RBcHBsaWVkICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnN0YWNrcykubGVuZ3RoID09PSAwICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbFRhZ3MpLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMuYXBwbHlUYWdzQXNwZWN0KCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YWNrc1trZXldKSB7XG4gICAgICB0aGlzLnN0YWNrc1trZXldID0gbmV3IEF3c1N0YWNrKGtleSwgZGVwZW5kZW5jaWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGFja3Nba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZWZhdWx0IGNvbXB1dGUgc3RhY2sgLSBuYW1lZCBhcyBgJHt0aGlzLm5hbWV9Q29tcHV0ZWBcbiAgICpcbiAgICogT25seSBkZXBlbmRzIG9uIE5ldHdvcmsuIERhdGFiYXNlIGRlcGVuZGVuY3kgaXMgYWRkZWQgYXV0b21hdGljYWxseVxuICAgKiBieSBDREsgd2hlbiBjb21wdXRlIHJlc291cmNlcyByZWZlcmVuY2UgZGF0YWJhc2UgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpOiBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soXG4gICAgICBgJHt0aGlzLnN0YWNrUHJlZml4fUNvbXB1dGVgLFxuICAgICAgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgbmV0d29yayBzdGFjayAtIG5hbWVkIGFzIGAke3RoaXMubmFtZX1OZXR3b3JrYFxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpOiBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soYCR7dGhpcy5zdGFja1ByZWZpeH1OZXR3b3JrYCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBkYXRhYmFzZSBzdGFjayAtIG5hbWVkIGFzIGAke3RoaXMubmFtZX1EYXRhYmFzZWBcbiAgICogQHJldHVybnMge0F3c1N0YWNrfVxuICAgKi9cbiAgcHVibGljIGdldERlZmF1bHREYXRhYmFzZVN0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhcbiAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9RGF0YWJhc2VgLFxuICAgICAgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgc3RvcmFnZSBzdGFjayAtIG5hbWVkIGFzIGAke3RoaXMubmFtZX1TdG9yYWdlYFxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdFN0b3JhZ2VTdGFjaygpOiBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soXG4gICAgICBgJHt0aGlzLnN0YWNrUHJlZml4fVN0b3JhZ2VgLFxuICAgICAgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgQ0ROIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfUNkbmBcbiAgICpcbiAgICogRGVwZW5kcyBvbiBOZXR3b3JrLiBDb21wdXRlL1N0b3JhZ2UgZGVwZW5kZW5jaWVzIGFyZSBhZGRlZCBhdXRvbWF0aWNhbGx5XG4gICAqIGJ5IENESyB3aGVuIENETiByZXNvdXJjZXMgcmVmZXJlbmNlIEFMQiBvciBTMyBidWNrZXQgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdENkblN0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhcbiAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9Q2RuYCxcbiAgICAgIHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZWZhdWx0IG1lc3NhZ2luZyBzdGFjayAtIG5hbWVkIGFzIGAke3RoaXMubmFtZX1NZXNzYWdpbmdgXG4gICAqXG4gICAqIFVzZWQgZm9yIFNRUyBxdWV1ZXMsIFNOUyB0b3BpY3MsIGFuZCBFdmVudEJyaWRnZSBldmVudCBidXNlcy5cbiAgICogRGVwZW5kcyBvbiBOZXR3b3JrIG9ubHkuIFRoZXNlIGFyZSByZWdpb25hbCBzZXJ2aWNlcyB0aGF0IGRvbid0XG4gICAqIHJlcXVpcmUgVlBDLCBidXQgd2UgbWFpbnRhaW4gY29uc2lzdGVudCBzdGFjayBkZXBlbmRlbmN5IHBhdHRlcm5zLlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdE1lc3NhZ2luZ1N0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhcbiAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9TWVzc2FnaW5nYCxcbiAgICAgIHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBWUEMgYnkgbmFtZS4gSWYgbm8gbmFtZSBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgZGVmYXVsdCBWUEMuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBwdXJlIGdldHRlciAtIGl0IG5ldmVyIGNyZWF0ZXMgaW5mcmFzdHJ1Y3R1cmUuXG4gICAqIE5ldHdvcmsgbXVzdCBiZSBjb25maWd1cmVkIHZpYSBBcHAuZ2V0QXBwKCkgb3B0aW9ucyBvciBhcHAuYWRkTmV0d29yaygpLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIE9wdGlvbmFsIG5hbWUgb2YgdGhlIFZQQyB0byByZXRyaWV2ZS4gSWYgbm90IHByb3ZpZGVkLCByZXR1cm5zIHRoZSBkZWZhdWx0IFZQQy5cbiAgICogQHJldHVybnMge0lWcGN9IFRoZSBjb25maWd1cmVkIFZQQ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgbmV0d29yayBpcyBkaXNhYmxlZCwgbm90IGNvbmZpZ3VyZWQsIG9yIG5hbWVkIFZQQyBub3QgZm91bmRcbiAgICovXG4gIHB1YmxpYyBnZXRWcGMobmFtZT86IHN0cmluZyk6IElWcGMge1xuICAgIGlmICh0aGlzLm5ldHdvcmtEaXNhYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk5ldHdvcmsgaXMgZGlzYWJsZWQgZm9yIHRoaXMgYXBwLiBDYW5ub3QgZ2V0IFZQQy4gXCIgK1xuICAgICAgICAgIFwiUGFzcyBuZXR3b3JrIGNvbmZpZyB0byBBcHAuZ2V0QXBwKCkgdG8gZW5hYmxlIG5ldHdvcmtpbmcuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSWYgbmFtZSBpcyBwcm92aWRlZCwgbG9vayBpbiBhZGRpdGlvbmFsIFZQQ3MgZmlyc3RcbiAgICBpZiAobmFtZSkge1xuICAgICAgY29uc3QgYWRkaXRpb25hbFZwYyA9IHRoaXMuYWRkaXRpb25hbFZwY3MuZ2V0KG5hbWUpO1xuICAgICAgaWYgKGFkZGl0aW9uYWxWcGMpIHtcbiAgICAgICAgcmV0dXJuIGFkZGl0aW9uYWxWcGM7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBWUEMgJyR7bmFtZX0nIG5vdCBmb3VuZC4gQXZhaWxhYmxlIFZQQ3M6ICR7dGhpcy5nZXRWcGNOYW1lcygpLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICAgIFwiQ3JlYXRlIGFkZGl0aW9uYWwgVlBDcyB1c2luZyBhcHAuYWRkTmV0d29yayhOZXR3b3JrRmFjdG9yeS5idWlsZCguLi4pKS5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gZGVmYXVsdCBWUENcbiAgICBpZiAoIXRoaXMudnBjKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTmV0d29yayBub3QgY29uZmlndXJlZC4gUGFzcyBuZXR3b3JrIGNvbmZpZyB0byBBcHAuZ2V0QXBwKCkuIFwiICtcbiAgICAgICAgICBcIkV4YW1wbGU6IEFwcC5nZXRBcHAoYXBwTmFtZSwgeyBuZXR3b3JrOiB7IG1heEF6czogMiB9IH0pXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZwYztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5hbWVzIG9mIGFsbCBhdmFpbGFibGUgVlBDcy5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ1tdfSBBcnJheSBvZiBWUEMgbmFtZXMuIEluY2x1ZGVzIFwiZGVmYXVsdFwiIGlmIHRoZSBkZWZhdWx0IFZQQyBpcyBjb25maWd1cmVkLlxuICAgKi9cbiAgcHVibGljIGdldFZwY05hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy52cGMpIHtcbiAgICAgIG5hbWVzLnB1c2goXCJkZWZhdWx0XCIpO1xuICAgIH1cbiAgICBuYW1lcy5wdXNoKC4uLnRoaXMuYWRkaXRpb25hbFZwY3Mua2V5cygpKTtcbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gY29udGFpbmVyIHJlZ2lzdHJ5LiBJZiB0aGUgcmVnaXN0cnkgZG9lcyBub3QgZXhpc3RcbiAgICogIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q29udGFpbmVyUmVnaXN0cnkoKTogRWNyIHtcbiAgICBpZiAoIXRoaXMuZGVmYXVsdEVjcikge1xuICAgICAgY29uc3QgbmV0d29ya1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKCk7XG5cbiAgICAgIC8vIFRPRE86IHJldmVydCB0byBwYXNzaW5nIHsgcmVwb3NpdG9yeU5hbWU6IHRvS2ViYWIodGhpcy5uYW1lKSB9IGFmdGVyIHdlYmFwcCByZWRlcGxveSAodGVtcCBmaXggdG8gcHJldmVudCBFQ1IgcmVwbGFjZW1lbnQpXG4gICAgICBjb25zdCBlY3IgPSBFY3JGYWN0b3J5LmJ1aWxkKGAke3RoaXMuc3RhY2tQcmVmaXh9RWNyYCkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG5ldHdvcmtTdGFjay5nZXRTdGFjaygpXG4gICAgICApO1xuICAgICAgdGhpcy5kZWZhdWx0RWNyID0gZWNyO1xuICAgICAgcmV0dXJuIGVjcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0RWNyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNyb3NzLWFjY291bnQgbW9uaXRvcmluZyByb2xlIGluIHRoZSBOZXR3b3JrIHN0YWNrIHRoYXQgYWxsb3dzXG4gICAqIHRoZSBGamFsbCB3ZWJhcHAgdG8gcXVlcnkgQ2xvdWRXYXRjaCBtZXRyaWNzIGFuZCBFQ1Mgc3RhdHVzLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViYXBwQWNjb3VudElkIC0gT3B0aW9uYWwgQVdTIGFjY291bnQgSUQgb2YgdGhlIEZqYWxsIHdlYmFwcC4gRGVmYXVsdHMgdG8gY29uZmlndXJlZCBwbGF0Zm9ybSBhY2NvdW50LlxuICAgKiBAcmV0dXJucyB7Um9sZX0gVGhlIGNyZWF0ZWQgbW9uaXRvcmluZyByb2xlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTW9uaXRvcmluZ1JvbGUod2ViYXBwQWNjb3VudElkPzogc3RyaW5nKTogUm9sZSB7XG4gICAgaWYgKCF0aGlzLmRlZmF1bHRNb25pdG9yaW5nUm9sZSkge1xuICAgICAgY29uc3QgbmV0d29ya1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKCk7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPVxuICAgICAgICB3ZWJhcHBBY2NvdW50SWQgfHwgRkpBTExfTU9OSVRPUklOR19DT05GSUcud2ViYXBwQXdzQWNjb3VudElkO1xuXG4gICAgICBjb25zdCByb2xlID0gTW9uaXRvcmluZ1JvbGVGYWN0b3J5LmJ1aWxkKFxuICAgICAgICBgJHt0aGlzLnN0YWNrUHJlZml4fU1vbml0b3JpbmdSb2xlYCxcbiAgICAgICAge1xuICAgICAgICAgIHdlYmFwcEFjY291bnRJZDogYWNjb3VudElkLFxuICAgICAgICAgIGFwcE5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICByb2xlTmFtZVByZWZpeDogRkpBTExfTU9OSVRPUklOR19DT05GSUcucm9sZU5hbWVQcmVmaXgsXG4gICAgICAgICAgcm9sZVBhdGg6IEZKQUxMX01PTklUT1JJTkdfQ09ORklHLnJvbGVQYXRoXG4gICAgICAgIH1cbiAgICAgICkodGhpcywgbmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuXG4gICAgICBuZXR3b3JrU3RhY2suYWRkQ29uc3RydWN0KHJvbGUpO1xuICAgICAgdGhpcy5kZWZhdWx0TW9uaXRvcmluZ1JvbGUgPSByb2xlO1xuICAgICAgcmV0dXJuIHJvbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdE1vbml0b3JpbmdSb2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNyb3NzLWFjY291bnQgYXVkaXQgcm9sZSBpbiB0aGUgTmV0d29yayBzdGFjayB0aGF0IGFsbG93c1xuICAgKiB0aGUgRmphbGwgcGxhdGZvcm0gdG8gdXNlIENsb3VkUXVlcnkgZm9yIGNvbXByZWhlbnNpdmUgQVdTIHJlc291cmNlIGF1ZGl0aW5nLlxuICAgKlxuICAgKiBUaGlzIGlzIGFuIGV4cGxpY2l0IG9wdC1pbiBmZWF0dXJlLiBDYWxsIHRoaXMgbWV0aG9kIHRvIGVuYWJsZSBDbG91ZFF1ZXJ5XG4gICAqIGF1ZGl0IGNhcGFiaWxpdGllcyBmb3IgeW91ciBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHdlYmFwcEFjY291bnRJZCAtIE9wdGlvbmFsIEFXUyBhY2NvdW50IElEIG9mIHRoZSBGamFsbCB3ZWJhcHAuIERlZmF1bHRzIHRvIGNvbmZpZ3VyZWQgcGxhdGZvcm0gYWNjb3VudC5cbiAgICogQHBhcmFtIGV4dGVybmFsSWQgLSBPcHRpb25hbCBleHRlcm5hbCBJRCBmb3IgYWRkaXRpb25hbCBzZWN1cml0eS4gSWYgbm90IHByb3ZpZGVkLCBhIHVuaXF1ZSBJRCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAgICogQHJldHVybnMge1JvbGV9IFRoZSBjcmVhdGVkIGF1ZGl0IHJvbGVcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVBdWRpdFJvbGUod2ViYXBwQWNjb3VudElkPzogc3RyaW5nLCBleHRlcm5hbElkPzogc3RyaW5nKTogUm9sZSB7XG4gICAgaWYgKCF0aGlzLmRlZmF1bHRBdWRpdFJvbGUpIHtcbiAgICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuICAgICAgY29uc3QgYWNjb3VudElkID1cbiAgICAgICAgd2ViYXBwQWNjb3VudElkIHx8IEZKQUxMX0FVRElUX0NPTkZJRy53ZWJhcHBBd3NBY2NvdW50SWQ7XG5cbiAgICAgIHRoaXMuYXVkaXRSb2xlRXh0ZXJuYWxJZCA9IGV4dGVybmFsSWQgfHwgdGhpcy5nZW5lcmF0ZUF1ZGl0RXh0ZXJuYWxJZCgpO1xuXG4gICAgICBjb25zdCByb2xlID0gQXVkaXRSb2xlRmFjdG9yeS5idWlsZChgJHt0aGlzLnN0YWNrUHJlZml4fUF1ZGl0Um9sZWAsIHtcbiAgICAgICAgd2ViYXBwQWNjb3VudElkOiBhY2NvdW50SWQsXG4gICAgICAgIGFwcE5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgZXh0ZXJuYWxJZDogdGhpcy5hdWRpdFJvbGVFeHRlcm5hbElkLFxuICAgICAgICByb2xlTmFtZVByZWZpeDogRkpBTExfQVVESVRfQ09ORklHLnJvbGVOYW1lUHJlZml4LFxuICAgICAgICByb2xlUGF0aDogRkpBTExfQVVESVRfQ09ORklHLnJvbGVQYXRoXG4gICAgICB9KSh0aGlzLCBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSk7XG5cbiAgICAgIG5ldHdvcmtTdGFjay5hZGRDb25zdHJ1Y3Qocm9sZSk7XG4gICAgICB0aGlzLmRlZmF1bHRBdWRpdFJvbGUgPSByb2xlO1xuICAgICAgcmV0dXJuIHJvbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdEF1ZGl0Um9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGV4dGVybmFsIElEIHVzZWQgZm9yIHRoZSBhdWRpdCByb2xlXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSBleHRlcm5hbCBJRCBpZiBhdWRpdCByb2xlIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIHB1YmxpYyBnZXRBdWRpdFJvbGVFeHRlcm5hbElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaXRSb2xlRXh0ZXJuYWxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBleHRlcm5hbCBJRCBmb3IgYXVkaXQgcm9sZVxuICAgKiBGb3JtYXQ6IGZqYWxsLWF1ZGl0LXthcHBOYW1lfS17dGltZXN0YW1wfVxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUF1ZGl0RXh0ZXJuYWxJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVuaXF1ZUlkID0gcmFuZG9tQnl0ZXMoOCkudG9TdHJpbmcoXCJoZXhcIik7XG4gICAgcmV0dXJuIGBmamFsbC1hdWRpdC0ke3RvS2ViYWIodGhpcy5uYW1lKX0tJHt1bmlxdWVJZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbXB1dGUgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgY29tcHV0ZSBzdGFjayB1c2luZyB0aGUgZmFjdG9yeSBwYXR0ZXJuLlxuICAgKiBBdXRvbWF0aWNhbGx5IGNyZWF0ZXMgbW9uaXRvcmluZyByb2xlIGlmIG5vdCBhbHJlYWR5IGNyZWF0ZWQuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGNvbXB1dGUgdHlwZSBiYXNlZCBvbiB0aGUgZmFjdG9yeSBjb25maWd1cmF0aW9uOlxuICAgKiAtIEVjc0NvbXB1dGUgZm9yIHR5cGU6IFwiZWNzXCJcbiAgICogLSBMYW1iZGFDb21wdXRlIGZvciB0eXBlOiBcImxhbWJkYVwiXG4gICAqIC0gRWMyQ29tcHV0ZSBmb3IgdHlwZTogXCJlYzJcIlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBFQ1MgY29tcHV0ZSAtIHJldHVybnMgRWNzQ29tcHV0ZVxuICAgKiBjb25zdCBhcGkgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaVwiLCB7XG4gICAqICAgdHlwZTogXCJlY3NcIixcbiAgICogICBzZXJ2aWNlczogW3sgbmFtZTogXCJhcGlcIiwgLi4uIH1dXG4gICAqIH0pKTtcbiAgICogYXBpLmdldExvYWRCYWxhbmNlcigpOyAvLyBBdmFpbGFibGUgb24gRWNzQ29tcHV0ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBMYW1iZGEgY29tcHV0ZSAtIHJldHVybnMgTGFtYmRhQ29tcHV0ZVxuICAgKiBjb25zdCB3b3JrZXIgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldvcmtlclwiLCB7XG4gICAqICAgdHlwZTogXCJsYW1iZGFcIixcbiAgICogICBmdW5jdGlvbnM6IFt7IG5hbWU6IFwicHJvY2Vzc1wiLCAuLi4gfV1cbiAgICogfSkpO1xuICAgKiB3b3JrZXIuZ2V0RnVuY3Rpb24oXCJwcm9jZXNzXCIpOyAvLyBBdmFpbGFibGUgb24gTGFtYmRhQ29tcHV0ZVxuICAgKi9cbiAgcHVibGljIGFkZENvbXB1dGU8VCBleHRlbmRzIEFueUNvbXB1dGU+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgLy8gQXV0by1jcmVhdGUgbW9uaXRvcmluZyByb2xlIHdoZW4gY29tcHV0ZSBpcyBhZGRlZFxuICAgIGlmICghdGhpcy5kZWZhdWx0TW9uaXRvcmluZ1JvbGUpIHtcbiAgICAgIHRoaXMuY3JlYXRlTW9uaXRvcmluZ1JvbGUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlU3RhY2sgPSB0aGlzLmdldERlZmF1bHRDb21wdXRlU3RhY2soKTtcbiAgICBjb25zdCBjb25zdHJ1Y3QgPSBmbih0aGlzLCBjb21wdXRlU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgY29tcHV0ZVN0YWNrLmFkZENvbnN0cnVjdChjb25zdHJ1Y3QpO1xuICAgIHJldHVybiBjb25zdHJ1Y3Q7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgYWRkIGEgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgY29tcHV0ZSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhZGRDb21wdXRlUmVzb3VyY2UocmVzb3VyY2U6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXB1dGVTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpO1xuICAgIGNvbXB1dGVTdGFjay5hZGRDb25zdHJ1Y3QocmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGRhdGFiYXNlIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IGRhdGFiYXNlIHN0YWNrIHVzaW5nIHRoZSBmYWN0b3J5IHBhdHRlcm4uXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGRhdGFiYXNlIHR5cGUgYmFzZWQgb24gdGhlIGZhY3RvcnkgdXNlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQXVyb3JhIGRhdGFiYXNlIC0gcmV0dXJucyBSZWxhdGlvbmFsRGF0YWJhc2VcbiAgICogY29uc3QgZGIgPSBhcHAuYWRkRGF0YWJhc2UoRGF0YWJhc2VGYWN0b3J5LmJ1aWxkKFwiTWFpblwiLCB7XG4gICAqICAgdHlwZTogXCJBdXJvcmFcIixcbiAgICogICBkYXRhYmFzZU5hbWU6IFwibXlhcHBcIlxuICAgKiB9KSk7XG4gICAqIGRiLmdldEhvc3RFbmRwb2ludCgpOyAvLyBBdmFpbGFibGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRHluYW1vREIgdGFibGUgLSByZXR1cm5zIER5bmFtb0RCRGF0YWJhc2VcbiAgICogY29uc3QgY2FjaGUgPSBhcHAuYWRkRGF0YWJhc2UoRGF0YWJhc2VGYWN0b3J5LmJ1aWxkKFwiQ2FjaGVcIiwge1xuICAgKiAgIHR5cGU6IFwiRHluYW1vREJcIixcbiAgICogICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIlNcIiB9XG4gICAqIH0pKTtcbiAgICogY2FjaGUuZ2V0VGFibGVOYW1lKCk7IC8vIEF2YWlsYWJsZVxuICAgKi9cbiAgcHVibGljIGFkZERhdGFiYXNlPFQgZXh0ZW5kcyBBbnlEYXRhYmFzZT4oXG4gICAgZm46IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gVFxuICApOiBUIHtcbiAgICBjb25zdCBkYXRhYmFzZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0RGF0YWJhc2VTdGFjaygpO1xuICAgIGNvbnN0IGRhdGFiYXNlQ29uc3RydWN0ID0gZm4odGhpcywgZGF0YWJhc2VTdGFjay5nZXRTdGFjaygpKTtcbiAgICBkYXRhYmFzZVN0YWNrLmFkZENvbnN0cnVjdChkYXRhYmFzZUNvbnN0cnVjdCk7XG5cbiAgICByZXR1cm4gZGF0YWJhc2VDb25zdHJ1Y3Q7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc3RvcmFnZSByZXNvdXJjZSAoUzMpIHRvIHRoZSBkZWZhdWx0IHN0b3JhZ2Ugc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUHJpdmF0ZSBidWNrZXQgKGRlZmF1bHQpXG4gICAqIGNvbnN0IGFzc2V0cyA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiQXNzZXRzXCIsIHtcbiAgICogICB2ZXJzaW9uZWQ6IHRydWVcbiAgICogfSkpO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBXZWJzaXRlIGJ1Y2tldFxuICAgKiBjb25zdCBzaXRlID0gYXBwLmFkZFN0b3JhZ2UoU3RvcmFnZUZhY3RvcnkuYnVpbGQoXCJTaXRlXCIsIHtcbiAgICogICB3ZWJzaXRlSG9zdGluZzogeyBpbmRleERvY3VtZW50OiBcImluZGV4Lmh0bWxcIiB9XG4gICAqIH0pKTtcbiAgICovXG4gIHB1YmxpYyBhZGRTdG9yYWdlKGZuOiBTdG9yYWdlRmFjdG9yeUZuKTogU3RvcmFnZSB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gZm4uc3RhY2tQbGFjZW1lbnQgPz8gXCJzdG9yYWdlXCI7XG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLnJlc29sdmVTdG9yYWdlU3RhY2socGxhY2VtZW50KTtcbiAgICBjb25zdCBzdG9yYWdlQ29uc3RydWN0ID0gZm4odGhpcywgc3RhY2suZ2V0U3RhY2soKSk7XG4gICAgc3RhY2suYWRkQ29uc3RydWN0KHN0b3JhZ2VDb25zdHJ1Y3QpO1xuICAgIHJldHVybiBzdG9yYWdlQ29uc3RydWN0O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlU3RvcmFnZVN0YWNrKHBsYWNlbWVudDogc3RyaW5nKTogQXdzU3RhY2sge1xuICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgICBjYXNlIFwiY2RuXCI6XG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRDZG5TdGFjaygpO1xuICAgICAgY2FzZSBcImNvbXB1dGVcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFN0b3JhZ2VTdGFjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBDRE4gcmVzb3VyY2UgKENsb3VkRnJvbnQpIHRvIHRoZSBkZWZhdWx0IENETiBzdGFjayB1c2luZyB0aGUgZmFjdG9yeSBwYXR0ZXJuLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBTMyBvcmlnaW5cbiAgICogY29uc3QgYXNzZXRzID0gYXBwLmFkZFN0b3JhZ2UoU3RvcmFnZUZhY3RvcnkuYnVpbGQoXCJBc3NldHNcIiwge30pKTtcbiAgICogYXBwLmFkZENkbihDZG5GYWN0b3J5LmJ1aWxkKFwiQXNzZXRzQ2RuXCIsIHtcbiAgICogICBvcmlnaW5UeXBlOiBcInMzXCIsXG4gICAqICAgYnVja2V0OiBhc3NldHNcbiAgICogfSkpO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBBTEIgb3JpZ2luIChFQ1MpXG4gICAqIGNvbnN0IGFwaSA9IGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiQXBpXCIsIHsgdHlwZTogXCJlY3NcIiwgLi4uIH0pKTtcbiAgICogYXBwLmFkZENkbihDZG5GYWN0b3J5LmJ1aWxkKFwiQXBpQ2RuXCIsIHtcbiAgICogICBvcmlnaW5UeXBlOiBcImFsYlwiLFxuICAgKiAgIGxvYWRCYWxhbmNlcjogYXBpXG4gICAqIH0pKTtcbiAgICovXG4gIHB1YmxpYyBhZGRDZG4oZm46IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gQ2RuKTogQ2RuIHtcbiAgICBjb25zdCBjZG5TdGFjayA9IHRoaXMuZ2V0RGVmYXVsdENkblN0YWNrKCk7XG4gICAgY29uc3QgY2RuID0gZm4odGhpcywgY2RuU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgY2RuU3RhY2suYWRkQ29uc3RydWN0KGNkbik7XG5cbiAgICByZXR1cm4gY2RuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG1lc3NhZ2luZyByZXNvdXJjZSB0byB0aGUgZGVmYXVsdCBxdWV1ZSBzdGFjayB1c2luZyB0aGUgZmFjdG9yeSBwYXR0ZXJuLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdpbmcgdHlwZSBiYXNlZCBvbiB0aGUgZmFjdG9yeSBjb25maWd1cmF0aW9uLlxuICAgKiBDdXJyZW50bHkgc3VwcG9ydHMgcXVldWUgKFNRUyksIHdpdGggZnV0dXJlIHN1cHBvcnQgcGxhbm5lZCBmb3JcbiAgICogdG9waWMgKFNOUyksIGV2ZW50YnVzIChFdmVudEJyaWRnZSksIGFuZCBzdHJlYW0gKEtpbmVzaXMpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBRdWV1ZSBtZXNzYWdpbmcgLSByZXR1cm5zIFF1ZXVlTWVzc2FnaW5nXG4gICAqIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSBhcHAuYWRkTWVzc2FnaW5nKE1lc3NhZ2luZ0ZhY3RvcnkuYnVpbGQoXCJOb3RpZmljYXRpb25zXCIsIHtcbiAgICogICB0eXBlOiBcInF1ZXVlXCIsXG4gICAqICAgcXVldWVUeXBlOiBcInN0YW5kYXJkXCIsXG4gICAqICAgZGVhZExldHRlclF1ZXVlOiB7IGVuYWJsZWQ6IHRydWUsIG1heFJlY2VpdmVDb3VudDogMyB9XG4gICAqIH0pKTtcbiAgICogbm90aWZpY2F0aW9ucy5ncmFudFNlbmRNZXNzYWdlcyhhcGlGdW5jdGlvbik7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEZJRk8gcXVldWUgZm9yIE9wZW5OZXh0IHJldmFsaWRhdGlvblxuICAgKiBjb25zdCByZXZhbGlkYXRpb24gPSBhcHAuYWRkTWVzc2FnaW5nKE1lc3NhZ2luZ0ZhY3RvcnkuYnVpbGQoXCJSZXZhbGlkYXRpb25cIiwge1xuICAgKiAgIHR5cGU6IFwicXVldWVcIixcbiAgICogICBxdWV1ZVR5cGU6IFwiZmlmb1wiLFxuICAgKiAgIHZpc2liaWxpdHlUaW1lb3V0OiAzMDAsXG4gICAqICAgY29udGVudEJhc2VkRGVkdXBsaWNhdGlvbjogdHJ1ZVxuICAgKiB9KSk7XG4gICAqL1xuICBwdWJsaWMgYWRkTWVzc2FnaW5nPFQgZXh0ZW5kcyBBbnlNZXNzYWdpbmc+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgY29uc3QgbWVzc2FnaW5nU3RhY2sgPSB0aGlzLmdldERlZmF1bHRNZXNzYWdpbmdTdGFjaygpO1xuICAgIGNvbnN0IG1lc3NhZ2luZyA9IGZuKHRoaXMsIG1lc3NhZ2luZ1N0YWNrLmdldFN0YWNrKCkpO1xuICAgIG1lc3NhZ2luZ1N0YWNrLmFkZENvbnN0cnVjdChtZXNzYWdpbmcpO1xuXG4gICAgcmV0dXJuIG1lc3NhZ2luZztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBoaWdoLWxldmVsIGluZnJhc3RydWN0dXJlIHBhdHRlcm4gdG8gdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBQYXR0ZXJucyBhcmUgY29tcG9zaXRlIGNvbnN0cnVjdHMgdGhhdCBjcmVhdGUgbXVsdGlwbGUgcmVsYXRlZCByZXNvdXJjZXNcbiAgICogYXMgYSBzaW5nbGUsIGNvaGVzaXZlIHVuaXQuIFRoZXkgZW5jYXBzdWxhdGUgYmVzdCBwcmFjdGljZXMgYW5kIHJlZHVjZVxuICAgKiBib2lsZXJwbGF0ZSBmb3IgY29tbW9uIGRlcGxveW1lbnQgc2NlbmFyaW9zLlxuICAgKlxuICAgKiBDdXJyZW50bHkgc3VwcG9ydGVkIHBhdHRlcm5zOlxuICAgKiAtIGBwYXlsb2FkYDogUGF5bG9hZCBDTVMgZGVwbG95bWVudCB3aXRoIE9wZW5OZXh0XG4gICAqXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHBhdHRlcm4gaW50ZXJmYWNlIGJhc2VkIG9uIHRoZSBmYWN0b3J5IGNvbmZpZ3VyYXRpb24sXG4gICAqIHByb3ZpZGluZyBhY2Nlc3MgdG8gYWxsIHVuZGVybHlpbmcgcmVzb3VyY2VzIHZpYSBlc2NhcGUgaGF0Y2hlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUGF5bG9hZCBDTVMgcGF0dGVybiAtIHJldHVybnMgUGF5bG9hZFxuICAgKiBjb25zdCBwYXlsb2FkID0gYXBwLmFkZFBhdHRlcm4oUGF0dGVybkZhY3RvcnkuYnVpbGQoXCJQYXlsb2FkQXBwXCIsIHtcbiAgICogICB0eXBlOiBcInBheWxvYWRcIixcbiAgICogICBuYW1lOiBcIm15LWNtc1wiLFxuICAgKiAgIHNvdXJjZTogXCIuLi8uLlwiXG4gICAqIH0pKTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRXNjYXBlIGhhdGNoZXMgLSBhY2Nlc3MgdW5kZXJseWluZyByZXNvdXJjZXNcbiAgICogcGF5bG9hZC5nZXREYXRhYmFzZSgpLmdyYW50Q29ubmVjdChvdGhlckxhbWJkYSk7XG4gICAqIHBheWxvYWQuZ2V0U2VydmVyKCkuZ2V0TGFtYmRhRnVuY3Rpb24oKS5hZGRFbnZpcm9ubWVudChcIkNVU1RPTVwiLCBcInZhbHVlXCIpO1xuICAgKiBwYXlsb2FkLmdldENkbigpLmdldERpc3RyaWJ1dGlvbigpLmFkZEJlaGF2aW9yKFwiL2N1c3RvbS8qXCIsIGN1c3RvbU9yaWdpbik7XG4gICAqL1xuICBwdWJsaWMgYWRkUGF0dGVybjxUIGV4dGVuZHMgQW55UGF0dGVybj4oXG4gICAgZm46IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gVFxuICApOiBUIHtcbiAgICBjb25zdCBjb21wdXRlU3RhY2sgPSB0aGlzLmdldERlZmF1bHRDb21wdXRlU3RhY2soKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gZm4odGhpcywgY29tcHV0ZVN0YWNrLmdldFN0YWNrKCkpO1xuICAgIGNvbXB1dGVTdGFjay5hZGRDb25zdHJ1Y3QocGF0dGVybik7XG4gICAgcmV0dXJuIHBhdHRlcm47XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGFkZGl0aW9uYWwgbmV0d29yayAoVlBDKSB0byB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIFVzZSB0aGlzIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIFZQQ3MgYmV5b25kIHRoZSBkZWZhdWx0IFZQQyBjb25maWd1cmVkIHZpYSBBcHAuZ2V0QXBwKCkuXG4gICAqIEFkZGl0aW9uYWwgVlBDcyBjYW4gYmUgcmV0cmlldmVkIGJ5IG5hbWUgdXNpbmcgYXBwLmdldFZwYyhuYW1lKS5cbiAgICpcbiAgICogQHBhcmFtIGZuIC0gRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIE5ldHdvcmsgY29uc3RydWN0XG4gICAqIEByZXR1cm5zIHtOZXR3b3JrfSBUaGUgY3JlYXRlZCBOZXR3b3JrIGNvbnN0cnVjdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBpc29sYXRlZFZwYyA9IGFwcC5hZGROZXR3b3JrKFxuICAgKiAgIE5ldHdvcmtGYWN0b3J5LmJ1aWxkKFwiSXNvbGF0ZWRWcGNcIiwgeyBtYXhBenM6IDIsIG5hdEdhdGV3YXlzOiBmYWxzZSB9KVxuICAgKiApO1xuICAgKi9cbiAgcHVibGljIGFkZE5ldHdvcmsoZm46IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gTmV0d29yayk6IE5ldHdvcmsge1xuICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuICAgIGNvbnN0IG5ldHdvcmsgPSBmbih0aGlzLCBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgY29uc3QgdnBjTmFtZSA9IG5ldHdvcmsubm9kZS5pZDtcblxuICAgIC8vIFN0b3JlIGluIGFkZGl0aW9uYWwgVlBDcyBtYXAgZm9yIHJldHJpZXZhbCB2aWEgZ2V0VnBjKG5hbWUpXG4gICAgdGhpcy5hZGRpdGlvbmFsVnBjcy5zZXQodnBjTmFtZSwgbmV0d29yay5nZXRWcGMoKSk7XG4gICAgbmV0d29ya1N0YWNrLmFkZENvbnN0cnVjdChuZXR3b3JrKTtcblxuICAgIHJldHVybiBuZXR3b3JrO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbnVhbGx5IGFkZCBhIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IGRhdGFiYXNlIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGFkZERhdGFiYXNlUmVzb3VyY2UocmVzb3VyY2U6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGFiYXNlU3RhY2sgPSB0aGlzLmdldERlZmF1bHREYXRhYmFzZVN0YWNrKCk7XG4gICAgZGF0YWJhc2VTdGFjay5hZGRDb25zdHJ1Y3QocmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbnVhbGx5IGFkZCBhIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IHN0b3JhZ2Ugc3RhY2suXG4gICAqL1xuICBwdWJsaWMgYWRkU3RvcmFnZVJlc291cmNlKHJlc291cmNlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBjb25zdCBzdG9yYWdlU3RhY2sgPSB0aGlzLmdldERlZmF1bHRTdG9yYWdlU3RhY2soKTtcbiAgICBzdG9yYWdlU3RhY2suYWRkQ29uc3RydWN0KHJlc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlIHN0YW5kYXJkIHRhZ3NcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGlzZVN0YW5kYXJkVGFncygpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTtcbiAgICB0aGlzLmdsb2JhbFRhZ3MgPSB7XG4gICAgICBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOmVudmlyb25tZW50XCI6IGNvbmZpZy5lbnZpcm9ubWVudCxcbiAgICAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246c2VydmljZVwiOiB0aGlzLm5hbWVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFsbCB0YWdzIHVzaW5nIENESydzIG5hdGl2ZSBUYWdzLm9mKCkuYWRkKCkgQVBJXG4gICAqL1xuICBwcml2YXRlIGFwcGx5VGFnc0FzcGVjdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXNwZWN0QXBwbGllZCAmJiBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbFRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEFwcGx5IHN0YW5kYXJkIHRhZ3MgdXNpbmcgVGFncy5vZih0aGlzKS5hZGQoKVxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5nbG9iYWxUYWdzKSkge1xuICAgICAgICBUYWdzLm9mKHRoaXMpLmFkZChrZXksIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgYXNwZWN0IGZvciByZXNvdXJjZS1zcGVjaWZpYyB0YWdzIChJUEFNIHBvb2wsIGJhY2t1cCB0aWVyKVxuICAgICAgQXNwZWN0cy5vZih0aGlzKS5hZGQobmV3IFN0YW5kYXJkVGFnc0FzcGVjdCgpKTtcblxuICAgICAgdGhpcy5hc3BlY3RBcHBsaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGN1c3RvbSB0YWdzIHRvIGFsbCByZXNvdXJjZXMgaW4gdGhlIGFwcC5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgQ3VzdG9tIHRhZ3MgdG8gYXBwbHkgdG8gYWxsIHJlc291cmNlc1xuICAgKiBAZXhhbXBsZVxuICAgKiBhcHAuYWRkVGFncyh7XG4gICAqICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjpvd25lclwiOiBcInBsYXRmb3JtLXRlYW1cIixcbiAgICogICBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOmNvc3QtY2VudGVyXCI6IFwiQ0MtMTIzXCIsXG4gICAqICAgXCJ0ZWFtOnNsYWNrLWNoYW5uZWxcIjogXCIjcGxhdGZvcm0tYWxlcnRzXCJcbiAgICogfSk7XG4gICAqL1xuICBwdWJsaWMgYWRkVGFncyh0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogQXBwIHtcbiAgICAvLyBNZXJnZSB0YWdzIGludG8gZ2xvYmFsVGFncyBmb3IgdHJhY2tpbmdcbiAgICB0aGlzLmdsb2JhbFRhZ3MgPSB7XG4gICAgICAuLi50aGlzLmdsb2JhbFRhZ3MsXG4gICAgICAuLi50YWdzXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YWdzKSkge1xuICAgICAgVGFncy5vZih0aGlzKS5hZGQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IHJlc291cmNlIGludmVudG9yeSBjb2xsZWN0ZWQgZHVyaW5nIHN5bnRoZXNpc1xuICAgKiBDYWxsIHRoaXMgYWZ0ZXIgYXBwLnN5bnRoKCkgdG8gZ2V0IGNvbXBsZXRlIHJlc291cmNlIGludmVudG9yeVxuICAgKiBAcmV0dXJucyB7UmVzb3VyY2VJbnZlbnRvcnl9IENvbXBsZXRlIGludmVudG9yeSBvZiBhbGwgcmVzb3VyY2VzIGluIHRoZSBhcHBcbiAgICovXG4gIHB1YmxpYyBleHBvcnRSZXNvdXJjZUludmVudG9yeSgpOiBSZXNvdXJjZUludmVudG9yeSB7XG4gICAgaWYgKCF0aGlzLnJlc291cmNlSW52ZW50b3J5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiUmVzb3VyY2UgaW52ZW50b3J5IG5vdCBhdmFpbGFibGUuIEVuc3VyZSBhIFJlc291cmNlSW52ZW50b3J5QXNwZWN0IGhhcyBiZWVuIGFkZGVkIGJlZm9yZSBjYWxsaW5nIGV4cG9ydFJlc291cmNlSW52ZW50b3J5KCkuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZXNvdXJjZXM6IHRoaXMucmVzb3VyY2VJbnZlbnRvcnkuZ2V0SW52ZW50b3J5KCksXG4gICAgICBnZW5lcmF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgYXBwTmFtZTogdGhpcy5uYW1lXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1hbmlmZXN0IGNvbGxlY3RvciBmb3IgcmVnaXN0ZXJpbmcgc2VydmljZXMgYW5kIHBhdHRlcm5zLlxuICAgKiBVc2VkIGJ5IENvbXB1dGVGYWN0b3J5IGFuZCBQYXR0ZXJuRmFjdG9yeSB0byByZWdpc3RlciB0aGVpciBjb25maWd1cmF0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBnZXRNYW5pZmVzdENvbGxlY3RvcigpOiBNYW5pZmVzdENvbGxlY3RvciB7XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3RDb2xsZWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgc3ludGggdG8gYXV0b21hdGljYWxseSBleHBvcnQgcmVzb3VyY2UgaW52ZW50b3J5IGFuZCBtYW5pZmVzdFxuICAgKi9cbiAgcHVibGljIHN5bnRoKG9wdGlvbnM/OiBTdGFnZVN5bnRoZXNpc09wdGlvbnMpOiBDbG91ZEFzc2VtYmx5IHtcbiAgICAvLyBDYWxsIHBhcmVudCBzeW50aCBmaXJzdFxuICAgIGNvbnN0IGFzc2VtYmx5ID0gc3VwZXIuc3ludGgob3B0aW9ucyk7XG5cbiAgICAvLyBBZnRlciBzeW50aGVzaXMsIHdyaXRlIEZqYWxsIG1hbmlmZXN0IHRvIGNkay5vdXRcbiAgICB0cnkge1xuICAgICAgd3JpdGVNYW5pZmVzdChhc3NlbWJseSwgdGhpcy5tYW5pZmVzdENvbGxlY3Rvcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvbid0IGZhaWwgc3ludGggaWYgbWFuaWZlc3QgZXhwb3J0IGZhaWxzXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBGamFsbExvZ2dlci53YXJuKGBGYWlsZWQgdG8gZXhwb3J0IEZqYWxsIG1hbmlmZXN0OiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzZW1ibHk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXBwO1xuIl19
651
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FLcUI7QUFHckIsd0RBQXFEO0FBR3JELDJDQUF1QztBQUN2QyxxREFBbUU7QUFFbkUsb0RBSWdDO0FBTWhDLG1FQUFnRTtBQUNoRSxtQ0FBcUM7QUFLckMsaURBQThDO0FBQzlDLDhFQUE4RTtBQUM5RSxvREFBOEQ7QUFDOUQsK0RBQStEO0FBQy9ELDBDQUFvRDtBQUNwRCwrREFBdUQ7QUFDdkQsMkRBSWdDO0FBQ2hDLCtEQUFpRTtBQStCakU7Ozs7R0FJRztBQUNILE1BQWEsR0FBSSxTQUFRLGlCQUFNO0lBb0I3QixZQUFvQixJQUFhLEVBQUUsT0FBcUI7UUFDdEQsS0FBSyxFQUFFLENBQUM7UUFmRixXQUFNLEdBQWdDLEVBQUUsQ0FBQztRQUd6QyxtQkFBYyxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFDO1FBS3pDLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGVBQVUsR0FBOEIsRUFBRSxDQUFDO1FBQzNDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBTzVCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXBCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLFVBQVUsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUEsK0JBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0MsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFBLHFDQUFvQixFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5QiwrQ0FBK0M7UUFDL0MsSUFBSSxPQUFPLEVBQUUsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENB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LElBQUksQ0FBQyxJQUFJO1NBQ25CLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxPQUErQjtRQUMxQywwQkFBMEI7UUFDMUIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV0QyxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDO1lBQ0gsSUFBQSw4QkFBYSxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLDRDQUE0QztZQUM1QyxNQUFNLFlBQVksR0FDaEIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pELDhCQUFXLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOztBQTl1Qkgsa0JBK3VCQztBQTl1QmdCLFlBQVEsR0FBZSxJQUFJLEFBQW5CLENBQW9CO0FBZ3ZCN0Msa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXBwIGFzIENka0FwcCxcbiAgQXNwZWN0cyxcbiAgVGFncyxcbiAgdHlwZSBTdGFnZVN5bnRoZXNpc09wdGlvbnNcbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0eXBlIENsb3VkQXNzZW1ibHkgfSBmcm9tIFwiYXdzLWNkay1saWIvY3gtYXBpXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBWcGMgfSBmcm9tIFwiLi9yZXNvdXJjZXMvYXdzL25ldHdvcmtpbmcvdnBjXCI7XG5pbXBvcnQgeyB0eXBlIElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgdHlwZSBSb2xlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEF3c1N0YWNrIH0gZnJvbSBcIi4vcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyB0eXBlIEVjciwgRWNyRmFjdG9yeSB9IGZyb20gXCIuL3Jlc291cmNlcy9hd3Mvc3RvcmFnZS9lY3JcIjtcbmltcG9ydCB7IHR5cGUgQW55RGF0YWJhc2UgfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvZGF0YWJhc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgSU5ldHdvcmtQcm9wcyxcbiAgTmV0d29ya0ZhY3RvcnksXG4gIHR5cGUgTmV0d29ya1xufSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvbmV0d29ya1wiO1xuaW1wb3J0IHsgdHlwZSBDZG4gfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvY2RuXCI7XG5pbXBvcnQgeyB0eXBlIEFueU1lc3NhZ2luZyB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9tZXNzYWdpbmdcIjtcbmltcG9ydCB7IHR5cGUgQW55Q29tcHV0ZSB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9jb21wdXRlXCI7XG5pbXBvcnQgeyB0eXBlIFN0b3JhZ2UsIHR5cGUgU3RvcmFnZUZhY3RvcnlGbiB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9zdG9yYWdlXCI7XG5pbXBvcnQgeyB0eXBlIEFueVBhdHRlcm4gfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvcGF0dGVyblwiO1xuaW1wb3J0IHsgU3RhbmRhcmRUYWdzQXNwZWN0IH0gZnJvbSBcIi4vdXRpbHMvc3RhbmRhcmRUYWdzQXNwZWN0XCI7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7XG4gIHR5cGUgUmVzb3VyY2VJbnZlbnRvcnlBc3BlY3QsXG4gIHR5cGUgUmVzb3VyY2VJbnZlbnRvcnlcbn0gZnJvbSBcIi4vYXNwZWN0cy9yZXNvdXJjZUludmVudG9yeVwiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSBcIi4vdXRpbHMvZ2V0Q29uZmlnXCI7XG5pbXBvcnQgTW9uaXRvcmluZ1JvbGVGYWN0b3J5IGZyb20gXCIuL3Jlc291cmNlcy9hd3MvbW9uaXRvcmluZy9tb25pdG9yaW5nUm9sZVwiO1xuaW1wb3J0IHsgRkpBTExfTU9OSVRPUklOR19DT05GSUcgfSBmcm9tIFwiLi9jb25maWcvbW9uaXRvcmluZ1wiO1xuaW1wb3J0IEF1ZGl0Um9sZUZhY3RvcnkgZnJvbSBcIi4vcmVzb3VyY2VzL2F3cy9hdWRpdC9hdWRpdFJvbGVcIjtcbmltcG9ydCB7IEZKQUxMX0FVRElUX0NPTkZJRyB9IGZyb20gXCIuL2NvbmZpZy9hdWRpdFwiO1xuaW1wb3J0IHsgRmphbGxMb2dnZXIgfSBmcm9tIFwiLi91dGlscy92YWxpZGF0aW9uTG9nZ2VyXCI7XG5pbXBvcnQge1xuICBnZXRNYW5pZmVzdENvbGxlY3RvcixcbiAgd3JpdGVNYW5pZmVzdCxcbiAgdHlwZSBNYW5pZmVzdENvbGxlY3RvclxufSBmcm9tIFwiLi91dGlscy9tYW5pZmVzdFdyaXRlclwiO1xuaW1wb3J0IHsgdG9QYXNjYWxDYXNlLCB0b0tlYmFiIH0gZnJvbSBcIi4vdXRpbHMvY2FwaXRhbGlzZVN0cmluZ1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgQXBwLmdldEFwcCgpLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYXBwIHdpdGggbmV3IFZQQ1xuICogY29uc3QgYXBwID0gQXBwLmdldEFwcChhcHBOYW1lLCB7XG4gKiAgIG5ldHdvcms6IHsgbWF4QXpzOiAyLCBuYXRHYXRld2F5czogZmFsc2UgfVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhcHAgdXNpbmcgZXhpc3RpbmcgVlBDXG4gKiBjb25zdCBhcHAgPSBBcHAuZ2V0QXBwKGFwcE5hbWUsIHtcbiAqICAgbmV0d29yazogeyB1c2VFeGlzdGluZzogXCJ2cGMtMTIzNDU2NzhcIiB9XG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFwcCB3aXRob3V0IG5ldHdvcmsgKFMzLW9ubHkgYXBwcylcbiAqIGNvbnN0IGFwcCA9IEFwcC5nZXRBcHAoYXBwTmFtZSwgeyBuZXR3b3JrOiBmYWxzZSB9KTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQXBwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBOZXR3b3JrIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT2JqZWN0IHdpdGggSU5ldHdvcmtQcm9wczogQ3JlYXRlIG5ldyBWUEMgd2l0aCBjb25maWdcbiAgICogLSBmYWxzZTogTm8gbmV0d29yayAoZm9yIFMzLW9ubHkgYXBwcylcbiAgICogLSB7IHVzZUV4aXN0aW5nOiBzdHJpbmcgfTogVXNlIGV4aXN0aW5nIFZQQyBieSBJRFxuICAgKi9cbiAgbmV0d29yaz86IElOZXR3b3JrUHJvcHMgfCBmYWxzZSB8IHsgdXNlRXhpc3Rpbmc6IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFRoZSBiYXNpYyBjb3JuZXItc3RvbmUgb2YgYWxsIEZqYWxsLWhvc3RlZCBhcHBsaWNhdGlvbnMuXG4gKiAgVGhpcyBjbGFzcyBpcyBhIHNpbmdsZXRvbiBhbmQgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGFuZCBtYW5hZ2VcbiAqICAgYWxsIHJlc291cmNlcyBpbiBhIEZqYWxsIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQXBwIGV4dGVuZHMgQ2RrQXBwIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEFwcCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAvKiogUGFzY2FsQ2FzZSBmb3JtIG9mIG5hbWUsIHVzZWQgYXMgc3RhY2stbmFtZSBwcmVmaXggYW5kIGNvbnN0cnVjdCBJRHMuICovXG4gIHByaXZhdGUgc3RhY2tQcmVmaXg6IHN0cmluZztcbiAgcHJpdmF0ZSBzdGFja3M6IHsgW2tleTogc3RyaW5nXTogQXdzU3RhY2sgfSA9IHt9O1xuXG4gIHByaXZhdGUgdnBjPzogSVZwYztcbiAgcHJpdmF0ZSBhZGRpdGlvbmFsVnBjcyA9IG5ldyBNYXA8c3RyaW5nLCBJVnBjPigpO1xuICBwcml2YXRlIGRlZmF1bHRFY3I6IEVjciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBkZWZhdWx0TW9uaXRvcmluZ1JvbGU6IFJvbGUgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZGVmYXVsdEF1ZGl0Um9sZTogUm9sZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBhdWRpdFJvbGVFeHRlcm5hbElkPzogc3RyaW5nO1xuICBwcml2YXRlIG5ldHdvcmtEaXNhYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIGdsb2JhbFRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgcHJpdmF0ZSBhc3BlY3RBcHBsaWVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb3VyY2VJbnZlbnRvcnk/OiBSZXNvdXJjZUludmVudG9yeUFzcGVjdDtcbiAgcHJpdmF0ZSBtYW5pZmVzdENvbGxlY3RvcjogTWFuaWZlc3RDb2xsZWN0b3I7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogSUFwcE9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgQXBwLmluc3RhbmNlID0gdGhpcztcblxuICAgIHRoaXMubmFtZSA9IG5hbWUgPz8gXCJGamFsbEFwcFwiO1xuICAgIHRoaXMuc3RhY2tQcmVmaXggPSB0b1Bhc2NhbENhc2UodGhpcy5uYW1lKTtcblxuICAgIC8vIEluaXRpYWxpc2UgbWFuaWZlc3QgY29sbGVjdG9yIGZvciBidWlsZC10aW1lIHNlcnZpY2UgZGlzY292ZXJ5XG4gICAgdGhpcy5tYW5pZmVzdENvbGxlY3RvciA9IGdldE1hbmlmZXN0Q29sbGVjdG9yKHRoaXMubmFtZSk7XG5cbiAgICB0aGlzLmluaXRpYWxpc2VTdGFuZGFyZFRhZ3MoKTtcblxuICAgIC8vIEluaXRpYWxpc2UgbmV0d29yayBpbW1lZGlhdGVseSBpZiBjb25maWd1cmVkXG4gICAgaWYgKG9wdGlvbnM/Lm5ldHdvcmsgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm5ldHdvcmtEaXNhYmxlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zPy5uZXR3b3JrKSB7XG4gICAgICB0aGlzLmluaXRpYWxpc2VOZXR3b3JrKG9wdGlvbnMubmV0d29yayk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2UgdGhlIG5ldHdvcmsgKFZQQykgZm9yIHRoaXMgYXBwbGljYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpc2VOZXR3b3JrKFxuICAgIGNvbmZpZzogSU5ldHdvcmtQcm9wcyB8IHsgdXNlRXhpc3Rpbmc6IHN0cmluZyB9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuXG4gICAgaWYgKFwidXNlRXhpc3RpbmdcIiBpbiBjb25maWcpIHtcbiAgICAgIHRoaXMudnBjID0gVnBjLmZyb21Mb29rdXAoXG4gICAgICAgIG5ldHdvcmtTdGFjay5nZXRTdGFjaygpLFxuICAgICAgICBgJHt0aGlzLnN0YWNrUHJlZml4fUltcG9ydGVkVnBjYCxcbiAgICAgICAge1xuICAgICAgICAgIHZwY0lkOiBjb25maWcudXNlRXhpc3RpbmdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV0d29ya0NvbmZpZyA9IHsgLi4uY29uZmlnLCB2cGNOYW1lOiBjb25maWcudnBjTmFtZSA/PyB0aGlzLm5hbWUgfTtcbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBOZXR3b3JrRmFjdG9yeS5idWlsZChcbiAgICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1WcGNgLFxuICAgICAgICBuZXR3b3JrQ29uZmlnXG4gICAgICApKHRoaXMsIG5ldHdvcmtTdGFjay5nZXRTdGFjaygpKTtcbiAgICAgIHRoaXMudnBjID0gbmV0d29yay5nZXRWcGMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYXBwbGljYXRpb24gbmFtZVxuICAgKi9cbiAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldC9DcmVhdGUgYSBiYXNpYyBGamFsbCBBcHBsaWNhdGlvbiB3aXRoIHN0YW5kYXJkIHRhZ3MgYXBwbGllZC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgQXBwbGljYXRpb24gbmFtZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIG5ldHdvcmsgc2V0dGluZ3NcbiAgICogQHJldHVybnMge0FwcH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQ3JlYXRlIGFwcCB3aXRoIG5ldyBWUENcbiAgICogY29uc3QgYXBwID0gQXBwLmdldEFwcChhcHBOYW1lLCB7XG4gICAqICAgbmV0d29yazogeyBtYXhBenM6IDIsIG5hdEdhdGV3YXlzOiBmYWxzZSB9XG4gICAqIH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBDcmVhdGUgYXBwIHVzaW5nIGV4aXN0aW5nIFZQQ1xuICAgKiBjb25zdCBhcHAgPSBBcHAuZ2V0QXBwKGFwcE5hbWUsIHtcbiAgICogICBuZXR3b3JrOiB7IHVzZUV4aXN0aW5nOiBcInZwYy0xMjM0NTY3OFwiIH1cbiAgICogfSk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENyZWF0ZSBhcHAgd2l0aG91dCBuZXR3b3JrIChTMy1vbmx5IGFwcHMpXG4gICAqIGNvbnN0IGFwcCA9IEFwcC5nZXRBcHAoYXBwTmFtZSwgeyBuZXR3b3JrOiBmYWxzZSB9KTtcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QXBwKG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBJQXBwT3B0aW9ucyk6IEFwcCB7XG4gICAgY29uc3QgYXBwID0gQXBwLmdldEluc3RhbmNlKG5hbWUsIG9wdGlvbnMpO1xuICAgIGFwcC5pbml0aWFsaXNlU3RhbmRhcmRUYWdzKCk7XG4gICAgcmV0dXJuIGFwcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQvQ3JlYXRlIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEFwcFxuICAgKiBAcGFyYW0gbmFtZSBBcHBsaWNhdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgbmV0d29yayBzZXR0aW5nc1xuICAgKiBAcmV0dXJucyB7QXBwfVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZShuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogSUFwcE9wdGlvbnMpOiBBcHAge1xuICAgIC8vIERlc3BpdGUgc3VwcG9ydGluZyBtdWx0aXBsZSBzdGFja3MgeW91IGNhbiBzdGlsbCBvbmx5IGV2ZXJcbiAgICAvLyBoYXZlIGEgc2luZ2xlIEFwcGxpY2F0aW9uIHBlciBDREsgZGVwbG95bWVudFxuICAgIGlmICghQXBwLmluc3RhbmNlKSB7XG4gICAgICBBcHAuaW5zdGFuY2UgPSBuZXcgQXBwKG5hbWUsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBzaW5nbGV0b24gZXhpc3RzIGJ1dCBuYW1lIGRpZmZlcnMsIHVwZGF0ZSBpdCAoYmVmb3JlIGFueSBpbmZyYSBpcyBkZWZpbmVkKVxuICAgICAgaWYgKG5hbWUgJiYgQXBwLmluc3RhbmNlLm5hbWUgIT09IG5hbWUpIHtcbiAgICAgICAgLy8gV2FybiBpZiBuZXR3b3JrIGFscmVhZHkgaW5pdGlhbGlzZWQgLSBjaGFuZ2luZyBuYW1lIGFmdGVyIG5ldHdvcmsgZXhpc3RzIGNyZWF0ZXMgYSBtaXNtYXRjaFxuICAgICAgICBpZiAoQXBwLmluc3RhbmNlLnZwYykge1xuICAgICAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgQXBwIG5hbWUgY2hhbmdlZCBmcm9tIFwiJHtBcHAuaW5zdGFuY2UubmFtZX1cIiB0byBcIiR7bmFtZX1cIiBhZnRlciBuZXR3b3JrIHdhcyBpbml0aWFsaXNlZC4gYCArXG4gICAgICAgICAgICAgIGBWUEMgd2lsbCBoYXZlIG5hbWUgXCIke0FwcC5pbnN0YW5jZS5uYW1lfVZwY1wiIGJ1dCBhcHAgbmFtZSBpcyBcIiR7bmFtZX1cIi4gYCArXG4gICAgICAgICAgICAgIGBFbnN1cmUgQXBwLmdldEFwcCgpIGlzIGNhbGxlZCB3aXRoIHRoZSBmaW5hbCBuYW1lIGJlZm9yZSBpbml0aWFsaXNpbmcgbmV0d29yay5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBBcHAuaW5zdGFuY2UubmFtZSA9IG5hbWU7XG4gICAgICAgIEFwcC5pbnN0YW5jZS5zdGFja1ByZWZpeCA9IHRvUGFzY2FsQ2FzZShuYW1lKTtcbiAgICAgICAgLy8gUmVpbml0aWFsaXNlIHN0YW5kYXJkIHRhZ3Mgd2l0aCB0aGUgbmV3IG5hbWVcbiAgICAgICAgQXBwLmluc3RhbmNlLmluaXRpYWxpc2VTdGFuZGFyZFRhZ3MoKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgb3B0aW9ucyBwcm92aWRlZCBidXQgbmV0d29yayBub3QgeWV0IGluaXRpYWxpc2VkLCBpbml0aWFsaXNlIGl0IG5vd1xuICAgICAgaWYgKG9wdGlvbnM/Lm5ldHdvcmsgPT09IGZhbHNlKSB7XG4gICAgICAgIEFwcC5pbnN0YW5jZS5uZXR3b3JrRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgb3B0aW9ucz8ubmV0d29yayAmJlxuICAgICAgICAhQXBwLmluc3RhbmNlLnZwYyAmJlxuICAgICAgICAhQXBwLmluc3RhbmNlLm5ldHdvcmtEaXNhYmxlZFxuICAgICAgKSB7XG4gICAgICAgIEFwcC5pbnN0YW5jZS5pbml0aWFsaXNlTmV0d29yayhvcHRpb25zLm5ldHdvcmspO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcHAuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgYSBzdGFjayBieSBrZXkuIElmIHRoZSBzdGFjayBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKiAgRGVwZW5kZW5jaWVzIGFyZSBvbmx5IGFwcGxpZWQgdGhlIGZpcnN0IHRpbWUgYSBzdGFjayBpcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSBvZiB0aGUgc3RhY2tcbiAgICogQHBhcmFtIGRlcGVuZGVuY2llcyAtIFRoZSBzdGFjayhzKSB0aGF0IHRoaXMgc3RhY2sgZGVwZW5kcyBvblxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhY2soa2V5OiBzdHJpbmcsIGRlcGVuZGVuY2llcz86IEF3c1N0YWNrIHwgQXdzU3RhY2tbXSk6IEF3c1N0YWNrIHtcbiAgICAvLyBBcHBseSB0aGUgYXNwZWN0IG9uY2UgYmVmb3JlIGNyZWF0aW5nIHRoZSBmaXJzdCBzdGFja1xuICAgIGlmIChcbiAgICAgICF0aGlzLmFzcGVjdEFwcGxpZWQgJiZcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3RhY2tzKS5sZW5ndGggPT09IDAgJiZcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZ2xvYmFsVGFncykubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5hcHBseVRhZ3NBc3BlY3QoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhY2tzW2tleV0pIHtcbiAgICAgIHRoaXMuc3RhY2tzW2tleV0gPSBuZXcgQXdzU3RhY2soa2V5LCBkZXBlbmRlbmNpZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YWNrc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgY29tcHV0ZSBzdGFjayAtIG5hbWVkIGFzIGAke3RoaXMubmFtZX1Db21wdXRlYFxuICAgKlxuICAgKiBPbmx5IGRlcGVuZHMgb24gTmV0d29yay4gRGF0YWJhc2UgZGVwZW5kZW5jeSBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5XG4gICAqIGJ5IENESyB3aGVuIGNvbXB1dGUgcmVzb3VyY2VzIHJlZmVyZW5jZSBkYXRhYmFzZSByZXNvdXJjZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q29tcHV0ZVN0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhcbiAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9Q29tcHV0ZWAsXG4gICAgICB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBuZXR3b3JrIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfU5ldHdvcmtgXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0TmV0d29ya1N0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhgJHt0aGlzLnN0YWNrUHJlZml4fU5ldHdvcmtgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZWZhdWx0IGRhdGFiYXNlIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfURhdGFiYXNlYFxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdERhdGFiYXNlU3RhY2soKTogQXdzU3RhY2sge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrKFxuICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1EYXRhYmFzZWAsXG4gICAgICB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBzdG9yYWdlIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfVN0b3JhZ2VgXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0U3RvcmFnZVN0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhcbiAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9U3RvcmFnZWAsXG4gICAgICB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBDRE4gc3RhY2sgLSBuYW1lZCBhcyBgJHt0aGlzLm5hbWV9Q2RuYFxuICAgKlxuICAgKiBEZXBlbmRzIG9uIE5ldHdvcmsuIENvbXB1dGUvU3RvcmFnZSBkZXBlbmRlbmNpZXMgYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHlcbiAgICogYnkgQ0RLIHdoZW4gQ0ROIHJlc291cmNlcyByZWZlcmVuY2UgQUxCIG9yIFMzIGJ1Y2tldCByZXNvdXJjZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q2RuU3RhY2soKTogQXdzU3RhY2sge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrKFxuICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1DZG5gLFxuICAgICAgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgbWVzc2FnaW5nIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfU1lc3NhZ2luZ2BcbiAgICpcbiAgICogVXNlZCBmb3IgU1FTIHF1ZXVlcywgU05TIHRvcGljcywgYW5kIEV2ZW50QnJpZGdlIGV2ZW50IGJ1c2VzLlxuICAgKiBEZXBlbmRzIG9uIE5ldHdvcmsgb25seS4gVGhlc2UgYXJlIHJlZ2lvbmFsIHNlcnZpY2VzIHRoYXQgZG9uJ3RcbiAgICogcmVxdWlyZSBWUEMsIGJ1dCB3ZSBtYWludGFpbiBjb25zaXN0ZW50IHN0YWNrIGRlcGVuZGVuY3kgcGF0dGVybnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0TWVzc2FnaW5nU3RhY2soKTogQXdzU3RhY2sge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrKFxuICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1NZXNzYWdpbmdgLFxuICAgICAgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIFZQQyBieSBuYW1lLiBJZiBubyBuYW1lIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSBkZWZhdWx0IFZQQy5cbiAgICpcbiAgICogVGhpcyBpcyBhIHB1cmUgZ2V0dGVyIC0gaXQgbmV2ZXIgY3JlYXRlcyBpbmZyYXN0cnVjdHVyZS5cbiAgICogTmV0d29yayBtdXN0IGJlIGNvbmZpZ3VyZWQgdmlhIEFwcC5nZXRBcHAoKSBvcHRpb25zIG9yIGFwcC5hZGROZXR3b3JrKCkuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgVlBDIHRvIHJldHJpZXZlLiBJZiBub3QgcHJvdmlkZWQsIHJldHVybnMgdGhlIGRlZmF1bHQgVlBDLlxuICAgKiBAcmV0dXJucyB7SVZwY30gVGhlIGNvbmZpZ3VyZWQgVlBDXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBuZXR3b3JrIGlzIGRpc2FibGVkLCBub3QgY29uZmlndXJlZCwgb3IgbmFtZWQgVlBDIG5vdCBmb3VuZFxuICAgKi9cbiAgcHVibGljIGdldFZwYyhuYW1lPzogc3RyaW5nKTogSVZwYyB7XG4gICAgaWYgKHRoaXMubmV0d29ya0Rpc2FibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTmV0d29yayBpcyBkaXNhYmxlZCBmb3IgdGhpcyBhcHAuIENhbm5vdCBnZXQgVlBDLiBcIiArXG4gICAgICAgICAgXCJQYXNzIG5ldHdvcmsgY29uZmlnIHRvIEFwcC5nZXRBcHAoKSB0byBlbmFibGUgbmV0d29ya2luZy5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBJZiBuYW1lIGlzIHByb3ZpZGVkLCBsb29rIGluIGFkZGl0aW9uYWwgVlBDcyBmaXJzdFxuICAgIGlmIChuYW1lKSB7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsVnBjID0gdGhpcy5hZGRpdGlvbmFsVnBjcy5nZXQobmFtZSk7XG4gICAgICBpZiAoYWRkaXRpb25hbFZwYykge1xuICAgICAgICByZXR1cm4gYWRkaXRpb25hbFZwYztcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZQQyAnJHtuYW1lfScgbm90IGZvdW5kLiBBdmFpbGFibGUgVlBDczogJHt0aGlzLmdldFZwY05hbWVzKCkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgXCJDcmVhdGUgYWRkaXRpb25hbCBWUENzIHVzaW5nIGFwcC5hZGROZXR3b3JrKE5ldHdvcmtGYWN0b3J5LmJ1aWxkKC4uLikpLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBkZWZhdWx0IFZQQ1xuICAgIGlmICghdGhpcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJOZXR3b3JrIG5vdCBjb25maWd1cmVkLiBQYXNzIG5ldHdvcmsgY29uZmlnIHRvIEFwcC5nZXRBcHAoKS4gXCIgK1xuICAgICAgICAgIFwiRXhhbXBsZTogQXBwLmdldEFwcChhcHBOYW1lLCB7IG5ldHdvcms6IHsgbWF4QXpzOiAyIH0gfSlcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudnBjO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmFtZXMgb2YgYWxsIGF2YWlsYWJsZSBWUENzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEFycmF5IG9mIFZQQyBuYW1lcy4gSW5jbHVkZXMgXCJkZWZhdWx0XCIgaWYgdGhlIGRlZmF1bHQgVlBDIGlzIGNvbmZpZ3VyZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0VnBjTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLnZwYykge1xuICAgICAgbmFtZXMucHVzaChcImRlZmF1bHRcIik7XG4gICAgfVxuICAgIG5hbWVzLnB1c2goLi4udGhpcy5hZGRpdGlvbmFsVnBjcy5rZXlzKCkpO1xuICAgIHJldHVybiBuYW1lcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiBjb250YWluZXIgcmVnaXN0cnkuIElmIHRoZSByZWdpc3RyeSBkb2VzIG5vdCBleGlzdFxuICAgKiAgaXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpOiBFY3Ige1xuICAgIGlmICghdGhpcy5kZWZhdWx0RWNyKSB7XG4gICAgICBjb25zdCBuZXR3b3JrU3RhY2sgPSB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcblxuICAgICAgY29uc3QgZWNyID0gRWNyRmFjdG9yeS5idWlsZChgJHt0aGlzLnN0YWNrUHJlZml4fUVjcmAsIHtcbiAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHRvS2ViYWIodGhpcy5uYW1lKVxuICAgICAgfSkodGhpcywgbmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuICAgICAgdGhpcy5kZWZhdWx0RWNyID0gZWNyO1xuICAgICAgcmV0dXJuIGVjcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0RWNyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNyb3NzLWFjY291bnQgbW9uaXRvcmluZyByb2xlIGluIHRoZSBOZXR3b3JrIHN0YWNrIHRoYXQgYWxsb3dzXG4gICAqIHRoZSBGamFsbCB3ZWJhcHAgdG8gcXVlcnkgQ2xvdWRXYXRjaCBtZXRyaWNzIGFuZCBFQ1Mgc3RhdHVzLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViYXBwQWNjb3VudElkIC0gT3B0aW9uYWwgQVdTIGFjY291bnQgSUQgb2YgdGhlIEZqYWxsIHdlYmFwcC4gRGVmYXVsdHMgdG8gY29uZmlndXJlZCBwbGF0Zm9ybSBhY2NvdW50LlxuICAgKiBAcmV0dXJucyB7Um9sZX0gVGhlIGNyZWF0ZWQgbW9uaXRvcmluZyByb2xlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTW9uaXRvcmluZ1JvbGUod2ViYXBwQWNjb3VudElkPzogc3RyaW5nKTogUm9sZSB7XG4gICAgaWYgKCF0aGlzLmRlZmF1bHRNb25pdG9yaW5nUm9sZSkge1xuICAgICAgY29uc3QgbmV0d29ya1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKCk7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPVxuICAgICAgICB3ZWJhcHBBY2NvdW50SWQgfHwgRkpBTExfTU9OSVRPUklOR19DT05GSUcud2ViYXBwQXdzQWNjb3VudElkO1xuXG4gICAgICBjb25zdCByb2xlID0gTW9uaXRvcmluZ1JvbGVGYWN0b3J5LmJ1aWxkKFxuICAgICAgICBgJHt0aGlzLnN0YWNrUHJlZml4fU1vbml0b3JpbmdSb2xlYCxcbiAgICAgICAge1xuICAgICAgICAgIHdlYmFwcEFjY291bnRJZDogYWNjb3VudElkLFxuICAgICAgICAgIGFwcE5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICByb2xlTmFtZVByZWZpeDogRkpBTExfTU9OSVRPUklOR19DT05GSUcucm9sZU5hbWVQcmVmaXgsXG4gICAgICAgICAgcm9sZVBhdGg6IEZKQUxMX01PTklUT1JJTkdfQ09ORklHLnJvbGVQYXRoXG4gICAgICAgIH1cbiAgICAgICkodGhpcywgbmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuXG4gICAgICBuZXR3b3JrU3RhY2suYWRkQ29uc3RydWN0KHJvbGUpO1xuICAgICAgdGhpcy5kZWZhdWx0TW9uaXRvcmluZ1JvbGUgPSByb2xlO1xuICAgICAgcmV0dXJuIHJvbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdE1vbml0b3JpbmdSb2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNyb3NzLWFjY291bnQgYXVkaXQgcm9sZSBpbiB0aGUgTmV0d29yayBzdGFjayB0aGF0IGFsbG93c1xuICAgKiB0aGUgRmphbGwgcGxhdGZvcm0gdG8gdXNlIENsb3VkUXVlcnkgZm9yIGNvbXByZWhlbnNpdmUgQVdTIHJlc291cmNlIGF1ZGl0aW5nLlxuICAgKlxuICAgKiBUaGlzIGlzIGFuIGV4cGxpY2l0IG9wdC1pbiBmZWF0dXJlLiBDYWxsIHRoaXMgbWV0aG9kIHRvIGVuYWJsZSBDbG91ZFF1ZXJ5XG4gICAqIGF1ZGl0IGNhcGFiaWxpdGllcyBmb3IgeW91ciBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHdlYmFwcEFjY291bnRJZCAtIE9wdGlvbmFsIEFXUyBhY2NvdW50IElEIG9mIHRoZSBGamFsbCB3ZWJhcHAuIERlZmF1bHRzIHRvIGNvbmZpZ3VyZWQgcGxhdGZvcm0gYWNjb3VudC5cbiAgICogQHBhcmFtIGV4dGVybmFsSWQgLSBPcHRpb25hbCBleHRlcm5hbCBJRCBmb3IgYWRkaXRpb25hbCBzZWN1cml0eS4gSWYgbm90IHByb3ZpZGVkLCBhIHVuaXF1ZSBJRCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAgICogQHJldHVybnMge1JvbGV9IFRoZSBjcmVhdGVkIGF1ZGl0IHJvbGVcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVBdWRpdFJvbGUod2ViYXBwQWNjb3VudElkPzogc3RyaW5nLCBleHRlcm5hbElkPzogc3RyaW5nKTogUm9sZSB7XG4gICAgaWYgKCF0aGlzLmRlZmF1bHRBdWRpdFJvbGUpIHtcbiAgICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuICAgICAgY29uc3QgYWNjb3VudElkID1cbiAgICAgICAgd2ViYXBwQWNjb3VudElkIHx8IEZKQUxMX0FVRElUX0NPTkZJRy53ZWJhcHBBd3NBY2NvdW50SWQ7XG5cbiAgICAgIHRoaXMuYXVkaXRSb2xlRXh0ZXJuYWxJZCA9IGV4dGVybmFsSWQgfHwgdGhpcy5nZW5lcmF0ZUF1ZGl0RXh0ZXJuYWxJZCgpO1xuXG4gICAgICBjb25zdCByb2xlID0gQXVkaXRSb2xlRmFjdG9yeS5idWlsZChgJHt0aGlzLnN0YWNrUHJlZml4fUF1ZGl0Um9sZWAsIHtcbiAgICAgICAgd2ViYXBwQWNjb3VudElkOiBhY2NvdW50SWQsXG4gICAgICAgIGFwcE5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgZXh0ZXJuYWxJZDogdGhpcy5hdWRpdFJvbGVFeHRlcm5hbElkLFxuICAgICAgICByb2xlTmFtZVByZWZpeDogRkpBTExfQVVESVRfQ09ORklHLnJvbGVOYW1lUHJlZml4LFxuICAgICAgICByb2xlUGF0aDogRkpBTExfQVVESVRfQ09ORklHLnJvbGVQYXRoXG4gICAgICB9KSh0aGlzLCBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSk7XG5cbiAgICAgIG5ldHdvcmtTdGFjay5hZGRDb25zdHJ1Y3Qocm9sZSk7XG4gICAgICB0aGlzLmRlZmF1bHRBdWRpdFJvbGUgPSByb2xlO1xuICAgICAgcmV0dXJuIHJvbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdEF1ZGl0Um9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGV4dGVybmFsIElEIHVzZWQgZm9yIHRoZSBhdWRpdCByb2xlXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSBleHRlcm5hbCBJRCBpZiBhdWRpdCByb2xlIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIHB1YmxpYyBnZXRBdWRpdFJvbGVFeHRlcm5hbElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaXRSb2xlRXh0ZXJuYWxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBleHRlcm5hbCBJRCBmb3IgYXVkaXQgcm9sZVxuICAgKiBGb3JtYXQ6IGZqYWxsLWF1ZGl0LXthcHBOYW1lfS17dGltZXN0YW1wfVxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUF1ZGl0RXh0ZXJuYWxJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVuaXF1ZUlkID0gcmFuZG9tQnl0ZXMoOCkudG9TdHJpbmcoXCJoZXhcIik7XG4gICAgcmV0dXJuIGBmamFsbC1hdWRpdC0ke3RvS2ViYWIodGhpcy5uYW1lKX0tJHt1bmlxdWVJZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbXB1dGUgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgY29tcHV0ZSBzdGFjayB1c2luZyB0aGUgZmFjdG9yeSBwYXR0ZXJuLlxuICAgKiBBdXRvbWF0aWNhbGx5IGNyZWF0ZXMgbW9uaXRvcmluZyByb2xlIGlmIG5vdCBhbHJlYWR5IGNyZWF0ZWQuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGNvbXB1dGUgdHlwZSBiYXNlZCBvbiB0aGUgZmFjdG9yeSBjb25maWd1cmF0aW9uOlxuICAgKiAtIEVjc0NvbXB1dGUgZm9yIHR5cGU6IFwiZWNzXCJcbiAgICogLSBMYW1iZGFDb21wdXRlIGZvciB0eXBlOiBcImxhbWJkYVwiXG4gICAqIC0gRWMyQ29tcHV0ZSBmb3IgdHlwZTogXCJlYzJcIlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBFQ1MgY29tcHV0ZSAtIHJldHVybnMgRWNzQ29tcHV0ZVxuICAgKiBjb25zdCBhcGkgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaVwiLCB7XG4gICAqICAgdHlwZTogXCJlY3NcIixcbiAgICogICBzZXJ2aWNlczogW3sgbmFtZTogXCJhcGlcIiwgLi4uIH1dXG4gICAqIH0pKTtcbiAgICogYXBpLmdldExvYWRCYWxhbmNlcigpOyAvLyBBdmFpbGFibGUgb24gRWNzQ29tcHV0ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBMYW1iZGEgY29tcHV0ZSAtIHJldHVybnMgTGFtYmRhQ29tcHV0ZVxuICAgKiBjb25zdCB3b3JrZXIgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldvcmtlclwiLCB7XG4gICAqICAgdHlwZTogXCJsYW1iZGFcIixcbiAgICogICBmdW5jdGlvbnM6IFt7IG5hbWU6IFwicHJvY2Vzc1wiLCAuLi4gfV1cbiAgICogfSkpO1xuICAgKiB3b3JrZXIuZ2V0RnVuY3Rpb24oXCJwcm9jZXNzXCIpOyAvLyBBdmFpbGFibGUgb24gTGFtYmRhQ29tcHV0ZVxuICAgKi9cbiAgcHVibGljIGFkZENvbXB1dGU8VCBleHRlbmRzIEFueUNvbXB1dGU+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgLy8gQXV0by1jcmVhdGUgbW9uaXRvcmluZyByb2xlIHdoZW4gY29tcHV0ZSBpcyBhZGRlZFxuICAgIGlmICghdGhpcy5kZWZhdWx0TW9uaXRvcmluZ1JvbGUpIHtcbiAgICAgIHRoaXMuY3JlYXRlTW9uaXRvcmluZ1JvbGUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlU3RhY2sgPSB0aGlzLmdldERlZmF1bHRDb21wdXRlU3RhY2soKTtcbiAgICBjb25zdCBjb25zdHJ1Y3QgPSBmbih0aGlzLCBjb21wdXRlU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgY29tcHV0ZVN0YWNrLmFkZENvbnN0cnVjdChjb25zdHJ1Y3QgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3QpO1xuICAgIHJldHVybiBjb25zdHJ1Y3Q7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgYWRkIGEgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgY29tcHV0ZSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhZGRDb21wdXRlUmVzb3VyY2UocmVzb3VyY2U6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXB1dGVTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpO1xuICAgIGNvbXB1dGVTdGFjay5hZGRDb25zdHJ1Y3QocmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGRhdGFiYXNlIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IGRhdGFiYXNlIHN0YWNrIHVzaW5nIHRoZSBmYWN0b3J5IHBhdHRlcm4uXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGRhdGFiYXNlIHR5cGUgYmFzZWQgb24gdGhlIGZhY3RvcnkgdXNlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQXVyb3JhIGRhdGFiYXNlIC0gcmV0dXJucyBSZWxhdGlvbmFsRGF0YWJhc2VcbiAgICogY29uc3QgZGIgPSBhcHAuYWRkRGF0YWJhc2UoRGF0YWJhc2VGYWN0b3J5LmJ1aWxkKFwiTWFpblwiLCB7XG4gICAqICAgdHlwZTogXCJBdXJvcmFcIixcbiAgICogICBkYXRhYmFzZU5hbWU6IFwibXlfYXBwXCJcbiAgICogfSkpO1xuICAgKiBkYi5nZXRIb3N0RW5kcG9pbnQoKTsgLy8gQXZhaWxhYmxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIER5bmFtb0RCIHRhYmxlIC0gcmV0dXJucyBEeW5hbW9EQkRhdGFiYXNlXG4gICAqIGNvbnN0IGNhY2hlID0gYXBwLmFkZERhdGFiYXNlKERhdGFiYXNlRmFjdG9yeS5idWlsZChcIkNhY2hlXCIsIHtcbiAgICogICB0eXBlOiBcIkR5bmFtb0RCXCIsXG4gICAqICAgcGFydGl0aW9uS2V5OiB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJTXCIgfVxuICAgKiB9KSk7XG4gICAqIGNhY2hlLmdldFRhYmxlTmFtZSgpOyAvLyBBdmFpbGFibGVcbiAgICovXG4gIHB1YmxpYyBhZGREYXRhYmFzZTxUIGV4dGVuZHMgQW55RGF0YWJhc2U+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgY29uc3QgZGF0YWJhc2VTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdERhdGFiYXNlU3RhY2soKTtcbiAgICBjb25zdCBkYXRhYmFzZUNvbnN0cnVjdCA9IGZuKHRoaXMsIGRhdGFiYXNlU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgZGF0YWJhc2VTdGFjay5hZGRDb25zdHJ1Y3QoZGF0YWJhc2VDb25zdHJ1Y3QgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3QpO1xuXG4gICAgcmV0dXJuIGRhdGFiYXNlQ29uc3RydWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHN0b3JhZ2UgcmVzb3VyY2UgKFMzKSB0byB0aGUgZGVmYXVsdCBzdG9yYWdlIHN0YWNrIHVzaW5nIHRoZSBmYWN0b3J5IHBhdHRlcm4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFByaXZhdGUgYnVja2V0IChkZWZhdWx0KVxuICAgKiBjb25zdCBhc3NldHMgPSBhcHAuYWRkU3RvcmFnZShTdG9yYWdlRmFjdG9yeS5idWlsZChcIkFzc2V0c1wiLCB7XG4gICAqICAgdmVyc2lvbmVkOiB0cnVlXG4gICAqIH0pKTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gV2Vic2l0ZSBidWNrZXRcbiAgICogY29uc3Qgc2l0ZSA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiU2l0ZVwiLCB7XG4gICAqICAgd2Vic2l0ZUhvc3Rpbmc6IHsgaW5kZXhEb2N1bWVudDogXCJpbmRleC5odG1sXCIgfVxuICAgKiB9KSk7XG4gICAqL1xuICBwdWJsaWMgYWRkU3RvcmFnZShmbjogU3RvcmFnZUZhY3RvcnlGbik6IFN0b3JhZ2Uge1xuICAgIGNvbnN0IHBsYWNlbWVudCA9IGZuLnN0YWNrUGxhY2VtZW50ID8/IFwic3RvcmFnZVwiO1xuICAgIGNvbnN0IHN0YWNrID0gdGhpcy5yZXNvbHZlU3RvcmFnZVN0YWNrKHBsYWNlbWVudCk7XG4gICAgY29uc3Qgc3RvcmFnZUNvbnN0cnVjdCA9IGZuKHRoaXMsIHN0YWNrLmdldFN0YWNrKCkpO1xuICAgIHN0YWNrLmFkZENvbnN0cnVjdChzdG9yYWdlQ29uc3RydWN0KTtcbiAgICByZXR1cm4gc3RvcmFnZUNvbnN0cnVjdDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVN0b3JhZ2VTdGFjayhwbGFjZW1lbnQ6IHN0cmluZyk6IEF3c1N0YWNrIHtcbiAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgICAgY2FzZSBcImNkblwiOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0Q2RuU3RhY2soKTtcbiAgICAgIGNhc2UgXCJjb21wdXRlXCI6XG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRDb21wdXRlU3RhY2soKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRTdG9yYWdlU3RhY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgQ0ROIHJlc291cmNlIChDbG91ZEZyb250KSB0byB0aGUgZGVmYXVsdCBDRE4gc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUzMgb3JpZ2luXG4gICAqIGNvbnN0IGFzc2V0cyA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiQXNzZXRzXCIsIHt9KSk7XG4gICAqIGFwcC5hZGRDZG4oQ2RuRmFjdG9yeS5idWlsZChcIkFzc2V0c0NkblwiLCB7XG4gICAqICAgb3JpZ2luVHlwZTogXCJzM1wiLFxuICAgKiAgIGJ1Y2tldDogYXNzZXRzXG4gICAqIH0pKTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQUxCIG9yaWdpbiAoRUNTKVxuICAgKiBjb25zdCBhcGkgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaVwiLCB7IHR5cGU6IFwiZWNzXCIsIC4uLiB9KSk7XG4gICAqIGFwcC5hZGRDZG4oQ2RuRmFjdG9yeS5idWlsZChcIkFwaUNkblwiLCB7XG4gICAqICAgb3JpZ2luVHlwZTogXCJhbGJcIixcbiAgICogICBsb2FkQmFsYW5jZXI6IGFwaVxuICAgKiB9KSk7XG4gICAqL1xuICBwdWJsaWMgYWRkQ2RuKGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IENkbik6IENkbiB7XG4gICAgY29uc3QgY2RuU3RhY2sgPSB0aGlzLmdldERlZmF1bHRDZG5TdGFjaygpO1xuICAgIGNvbnN0IGNkbiA9IGZuKHRoaXMsIGNkblN0YWNrLmdldFN0YWNrKCkpO1xuICAgIGNkblN0YWNrLmFkZENvbnN0cnVjdChjZG4pO1xuXG4gICAgcmV0dXJuIGNkbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBtZXNzYWdpbmcgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgcXVldWUgc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnaW5nIHR5cGUgYmFzZWQgb24gdGhlIGZhY3RvcnkgY29uZmlndXJhdGlvbi5cbiAgICogQ3VycmVudGx5IHN1cHBvcnRzIHF1ZXVlIChTUVMpLCB3aXRoIGZ1dHVyZSBzdXBwb3J0IHBsYW5uZWQgZm9yXG4gICAqIHRvcGljIChTTlMpLCBldmVudGJ1cyAoRXZlbnRCcmlkZ2UpLCBhbmQgc3RyZWFtIChLaW5lc2lzKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUXVldWUgbWVzc2FnaW5nIC0gcmV0dXJucyBRdWV1ZU1lc3NhZ2luZ1xuICAgKiBjb25zdCBub3RpZmljYXRpb25zID0gYXBwLmFkZE1lc3NhZ2luZyhNZXNzYWdpbmdGYWN0b3J5LmJ1aWxkKFwiTm90aWZpY2F0aW9uc1wiLCB7XG4gICAqICAgdHlwZTogXCJxdWV1ZVwiLFxuICAgKiAgIHF1ZXVlVHlwZTogXCJzdGFuZGFyZFwiLFxuICAgKiAgIGRlYWRMZXR0ZXJRdWV1ZTogeyBlbmFibGVkOiB0cnVlLCBtYXhSZWNlaXZlQ291bnQ6IDMgfVxuICAgKiB9KSk7XG4gICAqIG5vdGlmaWNhdGlvbnMuZ3JhbnRTZW5kTWVzc2FnZXMoYXBpRnVuY3Rpb24pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBGSUZPIHF1ZXVlIGZvciBPcGVuTmV4dCByZXZhbGlkYXRpb25cbiAgICogY29uc3QgcmV2YWxpZGF0aW9uID0gYXBwLmFkZE1lc3NhZ2luZyhNZXNzYWdpbmdGYWN0b3J5LmJ1aWxkKFwiUmV2YWxpZGF0aW9uXCIsIHtcbiAgICogICB0eXBlOiBcInF1ZXVlXCIsXG4gICAqICAgcXVldWVUeXBlOiBcImZpZm9cIixcbiAgICogICB2aXNpYmlsaXR5VGltZW91dDogMzAwLFxuICAgKiAgIGNvbnRlbnRCYXNlZERlZHVwbGljYXRpb246IHRydWVcbiAgICogfSkpO1xuICAgKi9cbiAgcHVibGljIGFkZE1lc3NhZ2luZzxUIGV4dGVuZHMgQW55TWVzc2FnaW5nPihcbiAgICBmbjogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBUXG4gICk6IFQge1xuICAgIGNvbnN0IG1lc3NhZ2luZ1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TWVzc2FnaW5nU3RhY2soKTtcbiAgICBjb25zdCBtZXNzYWdpbmcgPSBmbih0aGlzLCBtZXNzYWdpbmdTdGFjay5nZXRTdGFjaygpKTtcbiAgICBtZXNzYWdpbmdTdGFjay5hZGRDb25zdHJ1Y3QobWVzc2FnaW5nIGFzIHVua25vd24gYXMgQ29uc3RydWN0KTtcblxuICAgIHJldHVybiBtZXNzYWdpbmc7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgaGlnaC1sZXZlbCBpbmZyYXN0cnVjdHVyZSBwYXR0ZXJuIHRvIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogUGF0dGVybnMgYXJlIGNvbXBvc2l0ZSBjb25zdHJ1Y3RzIHRoYXQgY3JlYXRlIG11bHRpcGxlIHJlbGF0ZWQgcmVzb3VyY2VzXG4gICAqIGFzIGEgc2luZ2xlLCBjb2hlc2l2ZSB1bml0LiBUaGV5IGVuY2Fwc3VsYXRlIGJlc3QgcHJhY3RpY2VzIGFuZCByZWR1Y2VcbiAgICogYm9pbGVycGxhdGUgZm9yIGNvbW1vbiBkZXBsb3ltZW50IHNjZW5hcmlvcy5cbiAgICpcbiAgICogQ3VycmVudGx5IHN1cHBvcnRlZCBwYXR0ZXJuczpcbiAgICogLSBgcGF5bG9hZGA6IFBheWxvYWQgQ01TIGRlcGxveW1lbnQgd2l0aCBPcGVuTmV4dFxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBwYXR0ZXJuIGludGVyZmFjZSBiYXNlZCBvbiB0aGUgZmFjdG9yeSBjb25maWd1cmF0aW9uLFxuICAgKiBwcm92aWRpbmcgYWNjZXNzIHRvIGFsbCB1bmRlcmx5aW5nIHJlc291cmNlcyB2aWEgZXNjYXBlIGhhdGNoZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFBheWxvYWQgQ01TIHBhdHRlcm4gLSByZXR1cm5zIFBheWxvYWRcbiAgICogY29uc3QgcGF5bG9hZCA9IGFwcC5hZGRQYXR0ZXJuKFBhdHRlcm5GYWN0b3J5LmJ1aWxkKFwiUGF5bG9hZEFwcFwiLCB7XG4gICAqICAgdHlwZTogXCJwYXlsb2FkXCIsXG4gICAqICAgbmFtZTogXCJteS1jbXNcIixcbiAgICogICBzb3VyY2U6IFwiLi4vLi5cIlxuICAgKiB9KSk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEVzY2FwZSBoYXRjaGVzIC0gYWNjZXNzIHVuZGVybHlpbmcgcmVzb3VyY2VzXG4gICAqIHBheWxvYWQuZ2V0RGF0YWJhc2UoKS5ncmFudENvbm5lY3Qob3RoZXJMYW1iZGEpO1xuICAgKiBwYXlsb2FkLmdldFNlcnZlcigpLmdldExhbWJkYUZ1bmN0aW9uKCkuYWRkRW52aXJvbm1lbnQoXCJDVVNUT01cIiwgXCJ2YWx1ZVwiKTtcbiAgICogcGF5bG9hZC5nZXRDZG4oKS5nZXREaXN0cmlidXRpb24oKS5hZGRCZWhhdmlvcihcIi9jdXN0b20vKlwiLCBjdXN0b21PcmlnaW4pO1xuICAgKi9cbiAgcHVibGljIGFkZFBhdHRlcm48VCBleHRlbmRzIEFueVBhdHRlcm4+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgY29uc3QgY29tcHV0ZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0Q29tcHV0ZVN0YWNrKCk7XG4gICAgY29uc3QgcGF0dGVybiA9IGZuKHRoaXMsIGNvbXB1dGVTdGFjay5nZXRTdGFjaygpKTtcbiAgICBjb21wdXRlU3RhY2suYWRkQ29uc3RydWN0KHBhdHRlcm4gYXMgdW5rbm93biBhcyBDb25zdHJ1Y3QpO1xuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBhZGRpdGlvbmFsIG5ldHdvcmsgKFZQQykgdG8gdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBVc2UgdGhpcyB0byBjcmVhdGUgYWRkaXRpb25hbCBWUENzIGJleW9uZCB0aGUgZGVmYXVsdCBWUEMgY29uZmlndXJlZCB2aWEgQXBwLmdldEFwcCgpLlxuICAgKiBBZGRpdGlvbmFsIFZQQ3MgY2FuIGJlIHJldHJpZXZlZCBieSBuYW1lIHVzaW5nIGFwcC5nZXRWcGMobmFtZSkuXG4gICAqXG4gICAqIEBwYXJhbSBmbiAtIEZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZSBOZXR3b3JrIGNvbnN0cnVjdFxuICAgKiBAcmV0dXJucyB7TmV0d29ya30gVGhlIGNyZWF0ZWQgTmV0d29yayBjb25zdHJ1Y3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgaXNvbGF0ZWRWcGMgPSBhcHAuYWRkTmV0d29yayhcbiAgICogICBOZXR3b3JrRmFjdG9yeS5idWlsZChcIklzb2xhdGVkVnBjXCIsIHsgbWF4QXpzOiAyLCBuYXRHYXRld2F5czogZmFsc2UgfSlcbiAgICogKTtcbiAgICovXG4gIHB1YmxpYyBhZGROZXR3b3JrKGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IE5ldHdvcmspOiBOZXR3b3JrIHtcbiAgICBjb25zdCBuZXR3b3JrU3RhY2sgPSB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcbiAgICBjb25zdCBuZXR3b3JrID0gZm4odGhpcywgbmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuICAgIGNvbnN0IHZwY05hbWUgPSBuZXR3b3JrLm5vZGUuaWQ7XG5cbiAgICAvLyBTdG9yZSBpbiBhZGRpdGlvbmFsIFZQQ3MgbWFwIGZvciByZXRyaWV2YWwgdmlhIGdldFZwYyhuYW1lKVxuICAgIHRoaXMuYWRkaXRpb25hbFZwY3Muc2V0KHZwY05hbWUsIG5ldHdvcmsuZ2V0VnBjKCkpO1xuICAgIG5ldHdvcmtTdGFjay5hZGRDb25zdHJ1Y3QobmV0d29yayk7XG5cbiAgICByZXR1cm4gbmV0d29yaztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBhZGQgYSByZXNvdXJjZSB0byB0aGUgZGVmYXVsdCBkYXRhYmFzZSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhZGREYXRhYmFzZVJlc291cmNlKHJlc291cmNlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhYmFzZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0RGF0YWJhc2VTdGFjaygpO1xuICAgIGRhdGFiYXNlU3RhY2suYWRkQ29uc3RydWN0KHJlc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBhZGQgYSByZXNvdXJjZSB0byB0aGUgZGVmYXVsdCBzdG9yYWdlIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGFkZFN0b3JhZ2VSZXNvdXJjZShyZXNvdXJjZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgY29uc3Qgc3RvcmFnZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0U3RvcmFnZVN0YWNrKCk7XG4gICAgc3RvcmFnZVN0YWNrLmFkZENvbnN0cnVjdChyZXNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzZSBzdGFuZGFyZCB0YWdzXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpc2VTdGFuZGFyZFRhZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG4gICAgdGhpcy5nbG9iYWxUYWdzID0ge1xuICAgICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjplbnZpcm9ubWVudFwiOiBjb25maWcuZW52aXJvbm1lbnQsXG4gICAgICBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOnNlcnZpY2VcIjogdGhpcy5uYW1lXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhbGwgdGFncyB1c2luZyBDREsncyBuYXRpdmUgVGFncy5vZigpLmFkZCgpIEFQSVxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVRhZ3NBc3BlY3QoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFzcGVjdEFwcGxpZWQgJiYgT2JqZWN0LmtleXModGhpcy5nbG9iYWxUYWdzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBcHBseSBzdGFuZGFyZCB0YWdzIHVzaW5nIFRhZ3Mub2YodGhpcykuYWRkKClcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZ2xvYmFsVGFncykpIHtcbiAgICAgICAgVGFncy5vZih0aGlzKS5hZGQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IGFzcGVjdCBmb3IgcmVzb3VyY2Utc3BlY2lmaWMgdGFncyAoSVBBTSBwb29sLCBiYWNrdXAgdGllcilcbiAgICAgIEFzcGVjdHMub2YodGhpcykuYWRkKG5ldyBTdGFuZGFyZFRhZ3NBc3BlY3QoKSk7XG5cbiAgICAgIHRoaXMuYXNwZWN0QXBwbGllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBjdXN0b20gdGFncyB0byBhbGwgcmVzb3VyY2VzIGluIHRoZSBhcHAuXG4gICAqXG4gICAqIEBwYXJhbSB0YWdzIEN1c3RvbSB0YWdzIHRvIGFwcGx5IHRvIGFsbCByZXNvdXJjZXNcbiAgICogQGV4YW1wbGVcbiAgICogYXBwLmFkZFRhZ3Moe1xuICAgKiAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246b3duZXJcIjogXCJwbGF0Zm9ybS10ZWFtXCIsXG4gICAqICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjpjb3N0LWNlbnRlclwiOiBcIkNDLTEyM1wiLFxuICAgKiAgIFwidGVhbTpzbGFjay1jaGFubmVsXCI6IFwiI3BsYXRmb3JtLWFsZXJ0c1wiXG4gICAqIH0pO1xuICAgKi9cbiAgcHVibGljIGFkZFRhZ3ModGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IEFwcCB7XG4gICAgLy8gTWVyZ2UgdGFncyBpbnRvIGdsb2JhbFRhZ3MgZm9yIHRyYWNraW5nXG4gICAgdGhpcy5nbG9iYWxUYWdzID0ge1xuICAgICAgLi4udGhpcy5nbG9iYWxUYWdzLFxuICAgICAgLi4udGFnc1xuICAgIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncykpIHtcbiAgICAgIFRhZ3Mub2YodGhpcykuYWRkKGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCByZXNvdXJjZSBpbnZlbnRvcnkgY29sbGVjdGVkIGR1cmluZyBzeW50aGVzaXNcbiAgICogQ2FsbCB0aGlzIGFmdGVyIGFwcC5zeW50aCgpIHRvIGdldCBjb21wbGV0ZSByZXNvdXJjZSBpbnZlbnRvcnlcbiAgICogQHJldHVybnMge1Jlc291cmNlSW52ZW50b3J5fSBDb21wbGV0ZSBpbnZlbnRvcnkgb2YgYWxsIHJlc291cmNlcyBpbiB0aGUgYXBwXG4gICAqL1xuICBwdWJsaWMgZXhwb3J0UmVzb3VyY2VJbnZlbnRvcnkoKTogUmVzb3VyY2VJbnZlbnRvcnkge1xuICAgIGlmICghdGhpcy5yZXNvdXJjZUludmVudG9yeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlJlc291cmNlIGludmVudG9yeSBub3QgYXZhaWxhYmxlLiBFbnN1cmUgYSBSZXNvdXJjZUludmVudG9yeUFzcGVjdCBoYXMgYmVlbiBhZGRlZCBiZWZvcmUgY2FsbGluZyBleHBvcnRSZXNvdXJjZUludmVudG9yeSgpLlwiXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlSW52ZW50b3J5LmdldEludmVudG9yeSgpLFxuICAgICAgZ2VuZXJhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGFwcE5hbWU6IHRoaXMubmFtZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtYW5pZmVzdCBjb2xsZWN0b3IgZm9yIHJlZ2lzdGVyaW5nIHNlcnZpY2VzIGFuZCBwYXR0ZXJucy5cbiAgICogVXNlZCBieSBDb21wdXRlRmFjdG9yeSBhbmQgUGF0dGVybkZhY3RvcnkgdG8gcmVnaXN0ZXIgdGhlaXIgY29uZmlndXJhdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0TWFuaWZlc3RDb2xsZWN0b3IoKTogTWFuaWZlc3RDb2xsZWN0b3Ige1xuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0Q29sbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHN5bnRoIHRvIGF1dG9tYXRpY2FsbHkgZXhwb3J0IHJlc291cmNlIGludmVudG9yeSBhbmQgbWFuaWZlc3RcbiAgICovXG4gIHB1YmxpYyBzeW50aChvcHRpb25zPzogU3RhZ2VTeW50aGVzaXNPcHRpb25zKTogQ2xvdWRBc3NlbWJseSB7XG4gICAgLy8gQ2FsbCBwYXJlbnQgc3ludGggZmlyc3RcbiAgICBjb25zdCBhc3NlbWJseSA9IHN1cGVyLnN5bnRoKG9wdGlvbnMpO1xuXG4gICAgLy8gQWZ0ZXIgc3ludGhlc2lzLCB3cml0ZSBGamFsbCBtYW5pZmVzdCB0byBjZGsub3V0XG4gICAgdHJ5IHtcbiAgICAgIHdyaXRlTWFuaWZlc3QoYXNzZW1ibHksIHRoaXMubWFuaWZlc3RDb2xsZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBEb24ndCBmYWlsIHN5bnRoIGlmIG1hbmlmZXN0IGV4cG9ydCBmYWlsc1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgRmphbGxMb2dnZXIud2FybihgRmFpbGVkIHRvIGV4cG9ydCBGamFsbCBtYW5pZmVzdDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc2VtYmx5O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDtcbiJdfQ==
@@ -12,10 +12,10 @@ export interface PermissionSetConfig {
12
12
  export declare class IdentityCenter extends NestedStack {
13
13
  identityStoreId: string;
14
14
  identityCenterArn: string;
15
- private identityCenterIamRole;
15
+ private listInstancesRole;
16
16
  constructor(scope: Construct, id: string, props: IdentityCenterProps);
17
- createIdentityCenterIamRole(): void;
18
- listIdentityCenterInstance(): void;
19
- createPermissionSet(props: IdentityCenterProps): void;
17
+ private createListInstancesRole;
18
+ private listIdentityCenterInstance;
19
+ private createPermissionSets;
20
20
  }
21
21
  export {};
@@ -7,9 +7,6 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
7
  const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
8
8
  const stripAndCamelCase_1 = require("../../utils/stripAndCamelCase");
9
9
  const identityCenter_1 = require("../../resources/aws/iam/identityCenter");
10
- const attachManagedPolicy_1 = require("../../resources/aws/iam/identityCenter/attachManagedPolicy");
11
- const cdk_time_sleep_1 = require("cdk-time-sleep");
12
- const aws_cdk_lib_2 = require("aws-cdk-lib");
13
10
  const iam_1 = require("../../resources/aws/iam");
14
11
  const defaultPermissionSets = {
15
12
  AdministratorAccess: {
@@ -28,44 +25,28 @@ const defaultPermissionSets = {
28
25
  class IdentityCenter extends aws_cdk_lib_1.NestedStack {
29
26
  constructor(scope, id, props) {
30
27
  super(scope, id, props);
31
- this.createIdentityCenterIamRole();
28
+ this.createListInstancesRole();
32
29
  this.listIdentityCenterInstance();
33
- this.createPermissionSet(props);
30
+ this.createPermissionSets(props);
34
31
  }
35
- createIdentityCenterIamRole() {
36
- // Remove this role, or update permissions when we're ready to troubleshoot intermittent policy errors
37
- this.identityCenterIamRole = new iam_1.Role(this, "IdentityCenterCustomResourceRole", {
32
+ createListInstancesRole() {
33
+ this.listInstancesRole = new iam_1.Role(this, "IdentityCenterCustomResourceRole", {
38
34
  assumedBy: new aws_iam_1.ServicePrincipal("lambda.amazonaws.com"),
39
- description: "Shared role for all Identity Center AwsCustomResources",
35
+ description: "Role for Identity Centre ListInstances custom resource",
40
36
  managedPolicies: [
41
- iam_1.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaBasicExecutionRole"),
42
- iam_1.ManagedPolicy.fromAwsManagedPolicyName("AWSSSOMasterAccountAdministrator")
37
+ iam_1.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaBasicExecutionRole")
43
38
  ],
44
39
  inlinePolicies: {
45
- IdentityCenterCustomResourcePolicy: new aws_iam_1.PolicyDocument({
40
+ IdentityCenterListInstancesPolicy: new aws_iam_1.PolicyDocument({
46
41
  statements: [
47
42
  new aws_iam_1.PolicyStatement({
48
- actions: ["sso:*", "iam:*"],
43
+ actions: ["sso:ListInstances"],
49
44
  resources: ["*"]
50
45
  })
51
46
  ]
52
47
  })
53
48
  }
54
49
  });
55
- // Remove this role, or update permissions when we're ready to troubleshoot intermittent policy errors
56
- // const cfnRole = this.identityCenterIamRole.node.defaultChild as CfnRole;
57
- // cfnRole.addPropertyOverride("AssumeRolePolicyDocument", {
58
- // Version: "2012-10-17",
59
- // Statement: [
60
- // {
61
- // Effect: "Allow",
62
- // Principal: {
63
- // AWS: "*"
64
- // },
65
- // Action: "sts:AssumeRole"
66
- // }
67
- // ]
68
- // });
69
50
  }
70
51
  listIdentityCenterInstance() {
71
52
  const customResource = new awsCustomResource_1.AwsCustomResource(this, "ListIdentityCenterInstanceResource", {
@@ -77,17 +58,7 @@ class IdentityCenter extends aws_cdk_lib_1.NestedStack {
77
58
  },
78
59
  physicalResourceId: customResources.PhysicalResourceId.of("listIdentityCenterInstance")
79
60
  },
80
- role: this.identityCenterIamRole,
81
- // TODO: Lock down permissions, when we're ready to troubleshoot intermittent policy errors
82
- // policy: customResources.AwsCustomResourcePolicy.fromSdkCalls({
83
- // resources: ["*"]
84
- // }),
85
- // policy: customResources.AwsCustomResourcePolicy.fromStatements([
86
- // new PolicyStatement({
87
- // actions: ["sso:ListInstances"],
88
- // resources: ["*"]
89
- // })
90
- // ]),
61
+ role: this.listInstancesRole,
91
62
  resourceType: "Custom::IamIdentityCenter"
92
63
  });
93
64
  this.identityCenterArn = customResource.getResponseField("Instances.0.InstanceArn");
@@ -103,55 +74,39 @@ class IdentityCenter extends aws_cdk_lib_1.NestedStack {
103
74
  exportName: "identityStoreId"
104
75
  });
105
76
  }
106
- createPermissionSet(props) {
77
+ createPermissionSets(props) {
107
78
  for (const [name, config] of Object.entries(defaultPermissionSets)) {
108
79
  const group = new identityCenter_1.Group(this, `${name}Group`, {
109
80
  displayName: name,
110
81
  identityStoreId: this.identityStoreId,
111
- description: `Group for associated ${name} permission set`,
112
- role: this.identityCenterIamRole
82
+ description: `Group for associated ${name} permission set`
113
83
  });
114
84
  const permissionSet = new identityCenter_1.PermissionSet(this, `PermissionSet${name}`, {
115
85
  name: name,
116
86
  instanceArn: this.identityCenterArn,
117
87
  description: config.Description,
118
- role: this.identityCenterIamRole,
88
+ managedPolicies: [config.Policy],
119
89
  tags: props.tags
120
90
  });
121
91
  permissionSet.node.addDependency(group);
122
- const attachManagedPolicy = new attachManagedPolicy_1.AttachManagedPolicy(this, `AttachManagedPolicy${name}`, {
123
- instanceArn: this.identityCenterArn,
124
- permissionSet: name,
125
- permissionSetArn: permissionSet.getPermissionSetArn(),
126
- managedPolicyArn: config.Policy,
127
- role: this.identityCenterIamRole
128
- });
129
- attachManagedPolicy.node.addDependency(permissionSet);
130
92
  new aws_cdk_lib_1.CfnOutput(this, `${name}GroupId`, {
131
93
  key: `${name}GroupId`,
132
94
  value: group.getGroupId(),
133
95
  exportName: `${name}GroupId`
134
96
  });
135
97
  for (const [accountName, accountId] of Object.entries(props.accounts)) {
136
- const permissionSetArn = permissionSet.getPermissionSetArn();
137
- const groupId = group.getGroupId();
138
98
  const assignment = new identityCenter_1.Assignment(this, `${(0, stripAndCamelCase_1.stripAndCamelCase)(accountName)}${name}Assignment`, {
139
99
  instanceArn: this.identityCenterArn,
140
- permissionSetArn: permissionSetArn,
100
+ permissionSetArn: permissionSet.getPermissionSetArn(),
141
101
  principalType: "GROUP",
142
- principalId: groupId,
102
+ principalId: group.getGroupId(),
143
103
  targetType: "AWS_ACCOUNT",
144
- targetId: accountId,
145
- role: this.identityCenterIamRole
146
- });
147
- const sleep = new cdk_time_sleep_1.TimeSleep(this, `${(0, stripAndCamelCase_1.stripAndCamelCase)(accountName)}${name}AssignmentSleep`, {
148
- destroyDuration: aws_cdk_lib_2.Duration.seconds(60)
104
+ targetId: accountId
149
105
  });
150
- sleep.node.addDependency(attachManagedPolicy);
151
- assignment.node.addDependency(sleep);
106
+ assignment.node.addDependency(permissionSet);
152
107
  }
153
108
  }
154
109
  }
155
110
  }
156
111
  exports.IdentityCenter = IdentityCenter;
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHlDZW50ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9pZGVudGl0eUNlbnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnRUFBZ0U7QUFFaEUsaURBSTZCO0FBQzdCLDZDQUE0RTtBQUM1RSx1RkFBb0Y7QUFFcEYscUVBQWtFO0FBQ2xFLDJFQUlnRDtBQUNoRCxvR0FBaUc7QUFDakcsbURBQTJDO0FBQzNDLDZDQUF1QztBQUN2QyxpREFBOEQ7QUFZOUQsTUFBTSxxQkFBcUIsR0FBd0M7SUFDakUsbUJBQW1CLEVBQUU7UUFDbkIsTUFBTSxFQUFFLDZDQUE2QztRQUNyRCxXQUFXLEVBQUUsMERBQTBEO0tBQ3hFO0lBQ0QsY0FBYyxFQUFFO1FBQ2QsTUFBTSxFQUFFLHdDQUF3QztRQUNoRCxXQUFXLEVBQUUscURBQXFEO0tBQ25FO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsTUFBTSxFQUFFLGtEQUFrRDtRQUMxRCxXQUFXLEVBQUUsOENBQThDO0tBQzVEO0NBQ0YsQ0FBQztBQUVGLE1BQWEsY0FBZSxTQUFRLHlCQUFXO0lBSzdDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCwyQkFBMkI7UUFDekIsc0dBQXNHO1FBQ3RHLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLFVBQUksQ0FDbkMsSUFBSSxFQUNKLGtDQUFrQyxFQUNsQztZQUNFLFNBQVMsRUFBRSxJQUFJLDBCQUFnQixDQUFDLHNCQUFzQixDQUFDO1lBQ3ZELFdBQVcsRUFBRSx3REFBd0Q7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LENBQUMsR0FBRyxJQUFJLFlBQVksRUFDcEQ7b0JBQ0UsV0FBVyxFQUFFLElBQUksQ0FBQyxpQkFBaUI7b0JBQ25DLGdCQUFnQixFQUFFLGdCQUFnQjtvQkFDbEMsYUFBYSxFQUFFLE9BQU87b0JBQ3RCLFdBQVcsRUFBRSxPQUFPO29CQUNwQixVQUFVLEVBQUUsYUFBYTtvQkFDekIsUUFBUSxFQUFFLFNBQVM7b0JBQ25CLElBQUksRUFBRSxJQUFJLENBQUMscUJBQXFCO2lCQUNqQyxDQUNGLENBQUM7Z0JBRUYsTUFBTSxLQUFLLEdBQUcsSUFBSSwwQkFBUyxDQUN6QixJQUFJLEVBQ0osR0FBRyxJQUFBLHFDQUFpQixFQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksaUJBQWlCLEVBQ3pEO29CQUNFLGVBQWUsRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7aUJBQ3RDLENBQ0YsQ0FBQztnQkFDRixLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUM5QyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTNLRCx3Q0EyS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjdXN0b21SZXNvdXJjZXMgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIFBvbGljeURvY3VtZW50LFxuICBQb2xpY3lTdGF0ZW1lbnQsXG4gIFNlcnZpY2VQcmluY2lwYWxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IENmbk91dHB1dCwgTmVzdGVkU3RhY2ssIHR5cGUgTmVzdGVkU3RhY2tQcm9wcyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQXdzQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCB7IHR5cGUgS2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IHN0cmlwQW5kQ2FtZWxDYXNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3N0cmlwQW5kQ2FtZWxDYXNlXCI7XG5pbXBvcnQge1xuICBHcm91cCxcbiAgUGVybWlzc2lvblNldCxcbiAgQXNzaWdubWVudFxufSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9pYW0vaWRlbnRpdHlDZW50ZXJcIjtcbmltcG9ydCB7IEF0dGFjaE1hbmFnZWRQb2xpY3kgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9pYW0vaWRlbnRpdHlDZW50ZXIvYXR0YWNoTWFuYWdlZFBvbGljeVwiO1xuaW1wb3J0IHsgVGltZVNsZWVwIH0gZnJvbSBcImNkay10aW1lLXNsZWVwXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgTWFuYWdlZFBvbGljeSwgUm9sZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2lhbVwiO1xuXG5pbnRlcmZhY2UgSWRlbnRpdHlDZW50ZXJQcm9wcyBleHRlbmRzIE5lc3RlZFN0YWNrUHJvcHMge1xuICBhY2NvdW50czogS2V5VmFsdWU7XG4gIHRhZ3M/OiBLZXlWYWx1ZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25TZXRDb25maWcge1xuICBQb2xpY3k6IHN0cmluZztcbiAgRGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbmNvbnN0IGRlZmF1bHRQZXJtaXNzaW9uU2V0czogUmVjb3JkPHN0cmluZywgUGVybWlzc2lvblNldENvbmZpZz4gPSB7XG4gIEFkbWluaXN0cmF0b3JBY2Nlc3M6IHtcbiAgICBQb2xpY3k6IFwiYXJuOmF3czppYW06OmF3czpwb2xpY3kvQWRtaW5pc3RyYXRvckFjY2Vzc1wiLFxuICAgIERlc2NyaXB0aW9uOiBcIlBlcm1pc3Npb24gc2V0IGZvciBhc3NvY2lhdGVkIEFkbWluaXN0cmF0b3JBY2Nlc3MgcG9saWN5XCJcbiAgfSxcbiAgUmVhZE9ubHlBY2Nlc3M6IHtcbiAgICBQb2xpY3k6IFwiYXJuOmF3czppYW06OmF3czpwb2xpY3kvUmVhZE9ubHlBY2Nlc3NcIixcbiAgICBEZXNjcmlwdGlvbjogXCJQZXJtaXNzaW9uIHNldCBmb3IgYXNzb2NpYXRlZCBSZWFkT25seUFjY2VzcyBwb2xpY3lcIlxuICB9LFxuICBCaWxsaW5nOiB7XG4gICAgUG9saWN5OiBcImFybjphd3M6aWFtOjphd3M6cG9saWN5L0FXU0JpbGxpbmdSZWFkT25seUFjY2Vzc1wiLFxuICAgIERlc2NyaXB0aW9uOiBcIlBlcm1pc3Npb24gc2V0IGZvciBhc3NvY2lhdGVkIEJpbGxpbmcgcG9saWN5XCJcbiAgfVxufTtcblxuZXhwb3J0IGNsYXNzIElkZW50aXR5Q2VudGVyIGV4dGVuZHMgTmVzdGVkU3RhY2sge1xuICBwdWJsaWMgaWRlbnRpdHlTdG9yZUlkITogc3RyaW5nO1xuICBwdWJsaWMgaWRlbnRpdHlDZW50ZXJBcm4hOiBzdHJpbmc7XG4gIHByaXZhdGUgaWRlbnRpdHlDZW50ZXJJYW1Sb2xlITogUm9sZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSWRlbnRpdHlDZW50ZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5jcmVhdGVJZGVudGl0eUNlbnRlcklhbVJvbGUoKTtcbiAgICB0aGlzLmxpc3RJZGVudGl0eUNlbnRlckluc3RhbmNlKCk7XG4gICAgdGhpcy5jcmVhdGVQZXJtaXNzaW9uU2V0KHByb3BzKTtcbiAgfVxuXG4gIGNyZWF0ZUlkZW50aXR5Q2VudGVySWFtUm9sZSgpIHtcbiAgICAvLyBSZW1vdmUgdGhpcyByb2xlLCBvciB1cGRhdGUgcGVybWlzc2lvbnMgd2hlbiB3ZSdyZSByZWFkeSB0byB0cm91Ymxlc2hvb3QgaW50ZXJtaXR0ZW50IHBvbGljeSBlcnJvcnNcbiAgICB0aGlzLmlkZW50aXR5Q2VudGVySWFtUm9sZSA9IG5ldyBSb2xlKFxuICAgICAgdGhpcyxcbiAgICAgIFwiSWRlbnRpdHlDZW50ZXJDdXN0b21SZXNvdXJjZVJvbGVcIixcbiAgICAgIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbChcImxhbWJkYS5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJTaGFyZWQgcm9sZSBmb3IgYWxsIElkZW50aXR5IENlbnRlciBBd3NDdXN0b21SZXNvdXJjZXNcIixcbiAgICAgICAgbWFuYWdlZFBvbGljaWVzOiBbXG4gICAgICAgICAgTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgICBcInNlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGVcIlxuICAgICAgICAgICksXG4gICAgICAgICAgTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgICBcIkFXU1NTT01hc3RlckFjY291bnRBZG1pbmlzdHJhdG9yXCJcbiAgICAgICAgICApXG4gICAgICAgIF0sXG4gICAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgICAgSWRlbnRpdHlDZW50ZXJDdXN0b21SZXNvdXJjZVBvbGljeTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1wic3NvOipcIiwgXCJpYW06KlwiXSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgICAvLyBSZW1vdmUgdGhpcyByb2xlLCBvciB1cGRhdGUgcGVybWlzc2lvbnMgd2hlbiB3ZSdyZSByZWFkeSB0byB0cm91Ymxlc2hvb3QgaW50ZXJtaXR0ZW50IHBvbGljeSBlcnJvcnNcbiAgICAvLyBjb25zdCBjZm5Sb2xlID0gdGhpcy5pZGVudGl0eUNlbnRlcklhbVJvbGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuUm9sZTtcbiAgICAvLyBjZm5Sb2xlLmFkZFByb3BlcnR5T3ZlcnJpZGUoXCJBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnRcIiwge1xuICAgIC8vICAgVmVyc2lvbjogXCIyMDEyLTEwLTE3XCIsXG4gICAgLy8gICBTdGF0ZW1lbnQ6IFtcbiAgICAvLyAgICAge1xuICAgIC8vICAgICAgIEVmZmVjdDogXCJBbGxvd1wiLFxuICAgIC8vICAgICAgIFByaW5jaXBhbDoge1xuICAgIC8vICAgICAgICAgQVdTOiBcIipcIlxuICAgIC8vICAgICAgIH0sXG4gICAgLy8gICAgICAgQWN0aW9uOiBcInN0czpBc3N1bWVSb2xlXCJcbiAgICAvLyAgICAgfVxuICAgIC8vICAgXVxuICAgIC8vIH0pO1xuICB9XG5cbiAgbGlzdElkZW50aXR5Q2VudGVySW5zdGFuY2UoKSB7XG4gICAgY29uc3QgY3VzdG9tUmVzb3VyY2UgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UoXG4gICAgICB0aGlzLFxuICAgICAgXCJMaXN0SWRlbnRpdHlDZW50ZXJJbnN0YW5jZVJlc291cmNlXCIsXG4gICAgICB7XG4gICAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgICAgc2VydmljZTogXCJzc28tYWRtaW5cIixcbiAgICAgICAgICBhY3Rpb246IFwiTGlzdEluc3RhbmNlc0NvbW1hbmRcIixcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBNYXhSZXN1bHRzOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICBcImxpc3RJZGVudGl0eUNlbnRlckluc3RhbmNlXCJcbiAgICAgICAgICApXG4gICAgICAgIH0sXG4gICAgICAgIHJvbGU6IHRoaXMuaWRlbnRpdHlDZW50ZXJJYW1Sb2xlLFxuICAgICAgICAvLyBUT0RPOiBMb2NrIGRvd24gcGVybWlzc2lvbnMsIHdoZW4gd2UncmUgcmVhZHkgdG8gdHJvdWJsZXNob290IGludGVybWl0dGVudCBwb2xpY3kgZXJyb3JzXG4gICAgICAgIC8vIHBvbGljeTogY3VzdG9tUmVzb3VyY2VzLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TZGtDYWxscyh7XG4gICAgICAgIC8vICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgIC8vIH0pLFxuICAgICAgICAvLyBwb2xpY3k6IGN1c3RvbVJlc291cmNlcy5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU3RhdGVtZW50cyhbXG4gICAgICAgIC8vICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIC8vICAgICBhY3Rpb25zOiBbXCJzc286TGlzdEluc3RhbmNlc1wiXSxcbiAgICAgICAgLy8gICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgICAvLyAgIH0pXG4gICAgICAgIC8vIF0pLFxuICAgICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpJYW1JZGVudGl0eUNlbnRlclwiXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuaWRlbnRpdHlDZW50ZXJBcm4gPSBjdXN0b21SZXNvdXJjZS5nZXRSZXNwb25zZUZpZWxkKFxuICAgICAgXCJJbnN0YW5jZXMuMC5JbnN0YW5jZUFyblwiXG4gICAgKTtcbiAgICB0aGlzLmlkZW50aXR5U3RvcmVJZCA9IGN1c3RvbVJlc291cmNlLmdldFJlc3BvbnNlRmllbGQoXG4gICAgICBcIkluc3RhbmNlcy4wLklkZW50aXR5U3RvcmVJZFwiXG4gICAgKTtcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiSWRlbnRpdHlDZW50ZXJBcm5PdXRwdXRcIiwge1xuICAgICAga2V5OiBcImlkZW50aXR5Q2VudGVyQXJuXCIsXG4gICAgICB2YWx1ZTogdGhpcy5pZGVudGl0eUNlbnRlckFybixcbiAgICAgIGV4cG9ydE5hbWU6IFwiaWRlbnRpdHlDZW50ZXJBcm5cIlxuICAgIH0pO1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgXCJJZGVudGl0eVN0b3JlSWRPdXRwdXRcIiwge1xuICAgICAga2V5OiBcImlkZW50aXR5U3RvcmVJRFwiLFxuICAgICAgdmFsdWU6IHRoaXMuaWRlbnRpdHlTdG9yZUlkLFxuICAgICAgZXhwb3J0TmFtZTogXCJpZGVudGl0eVN0b3JlSWRcIlxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlUGVybWlzc2lvblNldChwcm9wczogSWRlbnRpdHlDZW50ZXJQcm9wcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoZGVmYXVsdFBlcm1pc3Npb25TZXRzKSkge1xuICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgR3JvdXAodGhpcywgYCR7bmFtZX1Hcm91cGAsIHtcbiAgICAgICAgZGlzcGxheU5hbWU6IG5hbWUsXG4gICAgICAgIGlkZW50aXR5U3RvcmVJZDogdGhpcy5pZGVudGl0eVN0b3JlSWQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgR3JvdXAgZm9yIGFzc29jaWF0ZWQgJHtuYW1lfSBwZXJtaXNzaW9uIHNldGAsXG4gICAgICAgIHJvbGU6IHRoaXMuaWRlbnRpdHlDZW50ZXJJYW1Sb2xlXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcGVybWlzc2lvblNldCA9IG5ldyBQZXJtaXNzaW9uU2V0KHRoaXMsIGBQZXJtaXNzaW9uU2V0JHtuYW1lfWAsIHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgaW5zdGFuY2VBcm46IHRoaXMuaWRlbnRpdHlDZW50ZXJBcm4sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBjb25maWcuRGVzY3JpcHRpb24sXG4gICAgICAgIHJvbGU6IHRoaXMuaWRlbnRpdHlDZW50ZXJJYW1Sb2xlLFxuICAgICAgICB0YWdzOiBwcm9wcy50YWdzXG4gICAgICB9KTtcbiAgICAgIHBlcm1pc3Npb25TZXQubm9kZS5hZGREZXBlbmRlbmN5KGdyb3VwKTtcblxuICAgICAgY29uc3QgYXR0YWNoTWFuYWdlZFBvbGljeSA9IG5ldyBBdHRhY2hNYW5hZ2VkUG9saWN5KFxuICAgICAgICB0aGlzLFxuICAgICAgICBgQXR0YWNoTWFuYWdlZFBvbGljeSR7bmFtZX1gLFxuICAgICAgICB7XG4gICAgICAgICAgaW5zdGFuY2VBcm46IHRoaXMuaWRlbnRpdHlDZW50ZXJBcm4sXG4gICAgICAgICAgcGVybWlzc2lvblNldDogbmFtZSxcbiAgICAgICAgICBwZXJtaXNzaW9uU2V0QXJuOiBwZXJtaXNzaW9uU2V0LmdldFBlcm1pc3Npb25TZXRBcm4oKSxcbiAgICAgICAgICBtYW5hZ2VkUG9saWN5QXJuOiBjb25maWcuUG9saWN5LFxuICAgICAgICAgIHJvbGU6IHRoaXMuaWRlbnRpdHlDZW50ZXJJYW1Sb2xlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhdHRhY2hNYW5hZ2VkUG9saWN5Lm5vZGUuYWRkRGVwZW5kZW5jeShwZXJtaXNzaW9uU2V0KTtcblxuICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtuYW1lfUdyb3VwSWRgLCB7XG4gICAgICAgIGtleTogYCR7bmFtZX1Hcm91cElkYCxcbiAgICAgICAgdmFsdWU6IGdyb3VwLmdldEdyb3VwSWQoKSxcbiAgICAgICAgZXhwb3J0TmFtZTogYCR7bmFtZX1Hcm91cElkYFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3QgW2FjY291bnROYW1lLCBhY2NvdW50SWRdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzLmFjY291bnRzKSkge1xuICAgICAgICBjb25zdCBwZXJtaXNzaW9uU2V0QXJuID0gcGVybWlzc2lvblNldC5nZXRQZXJtaXNzaW9uU2V0QXJuKCk7XG4gICAgICAgIGNvbnN0IGdyb3VwSWQgPSBncm91cC5nZXRHcm91cElkKCk7XG4gICAgICAgIGNvbnN0IGFzc2lnbm1lbnQgPSBuZXcgQXNzaWdubWVudChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke3N0cmlwQW5kQ2FtZWxDYXNlKGFjY291bnROYW1lKX0ke25hbWV9QXNzaWdubWVudGAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5zdGFuY2VBcm46IHRoaXMuaWRlbnRpdHlDZW50ZXJBcm4sXG4gICAgICAgICAgICBwZXJtaXNzaW9uU2V0QXJuOiBwZXJtaXNzaW9uU2V0QXJuLFxuICAgICAgICAgICAgcHJpbmNpcGFsVHlwZTogXCJHUk9VUFwiLFxuICAgICAgICAgICAgcHJpbmNpcGFsSWQ6IGdyb3VwSWQsXG4gICAgICAgICAgICB0YXJnZXRUeXBlOiBcIkFXU19BQ0NPVU5UXCIsXG4gICAgICAgICAgICB0YXJnZXRJZDogYWNjb3VudElkLFxuICAgICAgICAgICAgcm9sZTogdGhpcy5pZGVudGl0eUNlbnRlcklhbVJvbGVcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgc2xlZXAgPSBuZXcgVGltZVNsZWVwKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYCR7c3RyaXBBbmRDYW1lbENhc2UoYWNjb3VudE5hbWUpfSR7bmFtZX1Bc3NpZ25tZW50U2xlZXBgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlc3Ryb3lEdXJhdGlvbjogRHVyYXRpb24uc2Vjb25kcyg2MClcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHNsZWVwLm5vZGUuYWRkRGVwZW5kZW5jeShhdHRhY2hNYW5hZ2VkUG9saWN5KTtcbiAgICAgICAgYXNzaWdubWVudC5ub2RlLmFkZERlcGVuZGVuY3koc2xlZXApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHlDZW50ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9pZGVudGl0eUNlbnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnRUFBZ0U7QUFFaEUsaURBSTZCO0FBQzdCLDZDQUE0RTtBQUM1RSx1RkFBb0Y7QUFFcEYscUVBQWtFO0FBQ2xFLDJFQUlnRDtBQUNoRCxpREFBOEQ7QUFZOUQsTUFBTSxxQkFBcUIsR0FBd0M7SUFDakUsbUJBQW1CLEVBQUU7UUFDbkIsTUFBTSxFQUFFLDZDQUE2QztRQUNyRCxXQUFXLEVBQUUsMERBQTBEO0tBQ3hFO0lBQ0QsY0FBYyxFQUFFO1FBQ2QsTUFBTSxFQUFFLHdDQUF3QztRQUNoRCxXQUFXLEVBQUUscURBQXFEO0tBQ25FO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsTUFBTSxFQUFFLGtEQUFrRDtRQUMxRCxXQUFXLEVBQUUsOENBQThDO0tBQzVEO0NBQ0YsQ0FBQztBQUVGLE1BQWEsY0FBZSxTQUFRLHlCQUFXO0lBSzdDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksVUFBSSxDQUMvQixJQUFJLEVBQ0osa0NBQWtDLEVBQ2xDO1lBQ0UsU0FBUyxFQUFFLElBQUksMEJBQWdCLENBQUMsc0JBQXNCLENBQUM7WUFDdkQsV0FBVyxFQUFFLHdEQUF3RDtZQUNyRSxlQUFlLEVBQUU7Z0JBQ2YsbUJBQWEsQ0FBQyx3QkFBd0IsQ0FDcEMsMENBQTBD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QUFDO2dCQUN0RSxNQUFNLFVBQVUsR0FBRyxJQUFJLDJCQUFVLENBQy9CLElBQUksRUFDSixHQUFHLElBQUEscUNBQWlCLEVBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxZQUFZLEVBQ3BEO29CQUNFLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCO29CQUNuQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsbUJBQW1CLEVBQUU7b0JBQ3JELGFBQWEsRUFBRSxPQUFPO29CQUN0QixXQUFXLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRTtvQkFDL0IsVUFBVSxFQUFFLGFBQWE7b0JBQ3pCLFFBQVEsRUFBRSxTQUFTO2lCQUNwQixDQUNGLENBQUM7Z0JBQ0YsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFySEQsd0NBcUhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3VzdG9tUmVzb3VyY2VzIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBQb2xpY3lEb2N1bWVudCxcbiAgUG9saWN5U3RhdGVtZW50LFxuICBTZXJ2aWNlUHJpbmNpcGFsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIE5lc3RlZFN0YWNrLCB0eXBlIE5lc3RlZFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvdXRpbGl0aWVzL2F3c0N1c3RvbVJlc291cmNlXCI7XG5pbXBvcnQgeyB0eXBlIEtleVZhbHVlIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBzdHJpcEFuZENhbWVsQ2FzZSB9IGZyb20gXCIuLi8uLi91dGlscy9zdHJpcEFuZENhbWVsQ2FzZVwiO1xuaW1wb3J0IHtcbiAgR3JvdXAsXG4gIFBlcm1pc3Npb25TZXQsXG4gIEFzc2lnbm1lbnRcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvaWFtL2lkZW50aXR5Q2VudGVyXCI7XG5pbXBvcnQgeyBNYW5hZ2VkUG9saWN5LCBSb2xlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvaWFtXCI7XG5cbmludGVyZmFjZSBJZGVudGl0eUNlbnRlclByb3BzIGV4dGVuZHMgTmVzdGVkU3RhY2tQcm9wcyB7XG4gIGFjY291bnRzOiBLZXlWYWx1ZTtcbiAgdGFncz86IEtleVZhbHVlW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvblNldENvbmZpZyB7XG4gIFBvbGljeTogc3RyaW5nO1xuICBEZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuY29uc3QgZGVmYXVsdFBlcm1pc3Npb25TZXRzOiBSZWNvcmQ8c3RyaW5nLCBQZXJtaXNzaW9uU2V0Q29uZmlnPiA9IHtcbiAgQWRtaW5pc3RyYXRvckFjY2Vzczoge1xuICAgIFBvbGljeTogXCJhcm46YXdzOmlhbTo6YXdzOnBvbGljeS9BZG1pbmlzdHJhdG9yQWNjZXNzXCIsXG4gICAgRGVzY3JpcHRpb246IFwiUGVybWlzc2lvbiBzZXQgZm9yIGFzc29jaWF0ZWQgQWRtaW5pc3RyYXRvckFjY2VzcyBwb2xpY3lcIlxuICB9LFxuICBSZWFkT25seUFjY2Vzczoge1xuICAgIFBvbGljeTogXCJhcm46YXdzOmlhbTo6YXdzOnBvbGljeS9SZWFkT25seUFjY2Vzc1wiLFxuICAgIERlc2NyaXB0aW9uOiBcIlBlcm1pc3Npb24gc2V0IGZvciBhc3NvY2lhdGVkIFJlYWRPbmx5QWNjZXNzIHBvbGljeVwiXG4gIH0sXG4gIEJpbGxpbmc6IHtcbiAgICBQb2xpY3k6IFwiYXJuOmF3czppYW06OmF3czpwb2xpY3kvQVdTQmlsbGluZ1JlYWRPbmx5QWNjZXNzXCIsXG4gICAgRGVzY3JpcHRpb246IFwiUGVybWlzc2lvbiBzZXQgZm9yIGFzc29jaWF0ZWQgQmlsbGluZyBwb2xpY3lcIlxuICB9XG59O1xuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlDZW50ZXIgZXh0ZW5kcyBOZXN0ZWRTdGFjayB7XG4gIHB1YmxpYyBpZGVudGl0eVN0b3JlSWQhOiBzdHJpbmc7XG4gIHB1YmxpYyBpZGVudGl0eUNlbnRlckFybiE6IHN0cmluZztcbiAgcHJpdmF0ZSBsaXN0SW5zdGFuY2VzUm9sZSE6IFJvbGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElkZW50aXR5Q2VudGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMuY3JlYXRlTGlzdEluc3RhbmNlc1JvbGUoKTtcbiAgICB0aGlzLmxpc3RJZGVudGl0eUNlbnRlckluc3RhbmNlKCk7XG4gICAgdGhpcy5jcmVhdGVQZXJtaXNzaW9uU2V0cyhwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxpc3RJbnN0YW5jZXNSb2xlKCkge1xuICAgIHRoaXMubGlzdEluc3RhbmNlc1JvbGUgPSBuZXcgUm9sZShcbiAgICAgIHRoaXMsXG4gICAgICBcIklkZW50aXR5Q2VudGVyQ3VzdG9tUmVzb3VyY2VSb2xlXCIsXG4gICAgICB7XG4gICAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJsYW1iZGEuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUm9sZSBmb3IgSWRlbnRpdHkgQ2VudHJlIExpc3RJbnN0YW5jZXMgY3VzdG9tIHJlc291cmNlXCIsXG4gICAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICAgIE1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFxuICAgICAgICAgICAgXCJzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlXCJcbiAgICAgICAgICApXG4gICAgICAgIF0sXG4gICAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgICAgSWRlbnRpdHlDZW50ZXJMaXN0SW5zdGFuY2VzUG9saWN5OiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXCJzc286TGlzdEluc3RhbmNlc1wiXSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdElkZW50aXR5Q2VudGVySW5zdGFuY2UoKSB7XG4gICAgY29uc3QgY3VzdG9tUmVzb3VyY2UgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UoXG4gICAgICB0aGlzLFxuICAgICAgXCJMaXN0SWRlbnRpdHlDZW50ZXJJbnN0YW5jZVJlc291cmNlXCIsXG4gICAgICB7XG4gICAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgICAgc2VydmljZTogXCJzc28tYWRtaW5cIixcbiAgICAgICAgICBhY3Rpb246IFwiTGlzdEluc3RhbmNlc0NvbW1hbmRcIixcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBNYXhSZXN1bHRzOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICBcImxpc3RJZGVudGl0eUNlbnRlckluc3RhbmNlXCJcbiAgICAgICAgICApXG4gICAgICAgIH0sXG4gICAgICAgIHJvbGU6IHRoaXMubGlzdEluc3RhbmNlc1JvbGUsXG4gICAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OklhbUlkZW50aXR5Q2VudGVyXCJcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5pZGVudGl0eUNlbnRlckFybiA9IGN1c3RvbVJlc291cmNlLmdldFJlc3BvbnNlRmllbGQoXG4gICAgICBcIkluc3RhbmNlcy4wLkluc3RhbmNlQXJuXCJcbiAgICApO1xuICAgIHRoaXMuaWRlbnRpdHlTdG9yZUlkID0gY3VzdG9tUmVzb3VyY2UuZ2V0UmVzcG9uc2VGaWVsZChcbiAgICAgIFwiSW5zdGFuY2VzLjAuSWRlbnRpdHlTdG9yZUlkXCJcbiAgICApO1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgXCJJZGVudGl0eUNlbnRlckFybk91dHB1dFwiLCB7XG4gICAgICBrZXk6IFwiaWRlbnRpdHlDZW50ZXJBcm5cIixcbiAgICAgIHZhbHVlOiB0aGlzLmlkZW50aXR5Q2VudGVyQXJuLFxuICAgICAgZXhwb3J0TmFtZTogXCJpZGVudGl0eUNlbnRlckFyblwiXG4gICAgfSk7XG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBcIklkZW50aXR5U3RvcmVJZE91dHB1dFwiLCB7XG4gICAgICBrZXk6IFwiaWRlbnRpdHlTdG9yZUlEXCIsXG4gICAgICB2YWx1ZTogdGhpcy5pZGVudGl0eVN0b3JlSWQsXG4gICAgICBleHBvcnROYW1lOiBcImlkZW50aXR5U3RvcmVJZFwiXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVBlcm1pc3Npb25TZXRzKHByb3BzOiBJZGVudGl0eUNlbnRlclByb3BzKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhkZWZhdWx0UGVybWlzc2lvblNldHMpKSB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBHcm91cCh0aGlzLCBgJHtuYW1lfUdyb3VwYCwge1xuICAgICAgICBkaXNwbGF5TmFtZTogbmFtZSxcbiAgICAgICAgaWRlbnRpdHlTdG9yZUlkOiB0aGlzLmlkZW50aXR5U3RvcmVJZCxcbiAgICAgICAgZGVzY3JpcHRpb246IGBHcm91cCBmb3IgYXNzb2NpYXRlZCAke25hbWV9IHBlcm1pc3Npb24gc2V0YFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHBlcm1pc3Npb25TZXQgPSBuZXcgUGVybWlzc2lvblNldCh0aGlzLCBgUGVybWlzc2lvblNldCR7bmFtZX1gLCB7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIGluc3RhbmNlQXJuOiB0aGlzLmlkZW50aXR5Q2VudGVyQXJuLFxuICAgICAgICBkZXNjcmlwdGlvbjogY29uZmlnLkRlc2NyaXB0aW9uLFxuICAgICAgICBtYW5hZ2VkUG9saWNpZXM6IFtjb25maWcuUG9saWN5XSxcbiAgICAgICAgdGFnczogcHJvcHMudGFnc1xuICAgICAgfSk7XG4gICAgICBwZXJtaXNzaW9uU2V0Lm5vZGUuYWRkRGVwZW5kZW5jeShncm91cCk7XG5cbiAgICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7bmFtZX1Hcm91cElkYCwge1xuICAgICAgICBrZXk6IGAke25hbWV9R3JvdXBJZGAsXG4gICAgICAgIHZhbHVlOiBncm91cC5nZXRHcm91cElkKCksXG4gICAgICAgIGV4cG9ydE5hbWU6IGAke25hbWV9R3JvdXBJZGBcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IFthY2NvdW50TmFtZSwgYWNjb3VudElkXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcy5hY2NvdW50cykpIHtcbiAgICAgICAgY29uc3QgYXNzaWdubWVudCA9IG5ldyBBc3NpZ25tZW50KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYCR7c3RyaXBBbmRDYW1lbENhc2UoYWNjb3VudE5hbWUpfSR7bmFtZX1Bc3NpZ25tZW50YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpbnN0YW5jZUFybjogdGhpcy5pZGVudGl0eUNlbnRlckFybixcbiAgICAgICAgICAgIHBlcm1pc3Npb25TZXRBcm46IHBlcm1pc3Npb25TZXQuZ2V0UGVybWlzc2lvblNldEFybigpLFxuICAgICAgICAgICAgcHJpbmNpcGFsVHlwZTogXCJHUk9VUFwiLFxuICAgICAgICAgICAgcHJpbmNpcGFsSWQ6IGdyb3VwLmdldEdyb3VwSWQoKSxcbiAgICAgICAgICAgIHRhcmdldFR5cGU6IFwiQVdTX0FDQ09VTlRcIixcbiAgICAgICAgICAgIHRhcmdldElkOiBhY2NvdW50SWRcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGFzc2lnbm1lbnQubm9kZS5hZGREZXBlbmRlbmN5KHBlcm1pc3Npb25TZXQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19