@decaf-ts/for-fabric 0.13.31-experimental.2 → 0.13.31-experimental.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.
@@ -2482,7 +2482,8 @@
2482
2482
  const keys = Object.getOwnPropertySymbols(privateKey);
2483
2483
  k = privateKey[keys[0]];
2484
2484
  } else {
2485
- k = crypto$1.createPrivateKey(privateKeyPem);
2485
+ const {createPrivateKey: createPrivateKey} = await import("crypto");
2486
+ k = createPrivateKey(privateKeyPem);
2486
2487
  }
2487
2488
  return fabricGateway.signers.newPrivateKeySigner(k);
2488
2489
  }
@@ -3897,9 +3898,9 @@
3897
3898
  }
3898
3899
  }
3899
3900
  if (FabricClientAdapter) FabricClientAdapter["_baseDispatch"] = FabricClientDispatch;
3900
- const VERSION = "0.13.31-experimental.1";
3901
+ const VERSION = "0.13.31-experimental.2";
3901
3902
  const COMMIT = "b1b62a8";
3902
- const FULL_VERSION = "0.13.31-experimental.1-b1b62a8";
3903
+ const FULL_VERSION = "0.13.31-experimental.2-b1b62a8";
3903
3904
  const PACKAGE_NAME = "@decaf-ts/for-fabric";
3904
3905
  decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
3905
3906
  exports.AllowanceError = AllowanceError;
@@ -3997,4 +3998,4 @@
3997
3998
  exports.writeDesignDocs = writeDesignDocs;
3998
3999
  exports.writeIndexes = writeIndexes;
3999
4000
  });
4000
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQvaW5kZXhlcy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9jb2xsZWN0aW9ucy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRQYWdpbmF0b3IudHMiLCIuLi9zcmMvc2hhcmVkL2Vycm9ycy50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9jb250cmFjdHMvZXJjMjAvbW9kZWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2NsaWVudC9lcmMyMC9GYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvY2xpZW50L2lkcy9pZC1leHRyYWN0aW9uLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9JZGVudGl0eUNyZWRlbnRpYWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9jb25zdGFudHMudHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0lkZW50aXR5LnRzIiwiLi4vc3JjL2NsaWVudC91dGlscy50cyIsIi4uL3NyYy9jbGllbnQvY3J5cHRvLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GYWJyaWNFbnJvbGxtZW50U2VydmljZS50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIudHMiLCIuLi9zcmMvc2hhcmVkL292ZXJyaWRlcy9vdmVycmlkZXMudHMiLCIuLi9zcmMvc2hhcmVkL2VyYzIwL2VyYzIwLWNvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvRmFicmljQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9GYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9zaGFyZWQvZXZlbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tYXRoLnRzIiwiLi4vc3JjL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvRmFicmljSWRlbnRpdHlTZXJ2aWNlLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9jb25zdGFudHMudHMiLCIuLi9zcmMvY2xpZW50L2NvbnN0YW50cy50cyIsIi4uL3NyYy9jbGllbnQvZmFicmljLWZzLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRDb250ZXh0LnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRTdGF0ZW1lbnQudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudEFkYXB0ZXIudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIiwiLi4vc3JjL3ZlcnNpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgQ291Y2hEQkRlc2lnbkRvYyxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBnZW5lcmF0ZVZpZXdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCB0eXBlIEluZGV4ID0gQ3JlYXRlSW5kZXhSZXF1ZXN0O1xuXG5mdW5jdGlvbiByZXNvbHZlUHJpbWFyeUtleUZpZWxkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBsb2c6IExvZ2dlclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gU3RyaW5nKE1vZGVsLnBrKG0pKTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBTa2lwcGluZyAke20ubmFtZX0gd2hpbGUgZXh0cmFjdGluZyBpbmRleGVzOiBubyBwcmltYXJ5IGtleSBpcyBkZWZpbmVkYDtcbiAgICBsb2cudmVyYm9zZShtZXNzYWdlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0UXVlcnlQa1RpZUJyZWFrZXIoXG4gIGluZGV4ZXM6IEluZGV4W10sXG4gIHBrRmllbGQ6IHN0cmluZ1xuKTogSW5kZXhbXSB7XG4gIGlmICghcGtGaWVsZCkge1xuICAgIHJldHVybiBpbmRleGVzO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXMubWFwKChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9IChpbmRleCBhcyBhbnkpPy5pbmRleD8uZmllbGRzO1xuICAgIGlmIChcbiAgICAgICFpbmRleD8ubmFtZSB8fFxuICAgICAgdHlwZW9mIGluZGV4Lm5hbWUgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICFpbmRleC5uYW1lLmluY2x1ZGVzKFwiZGVmYXVsdFF1ZXJ5XCIpIHx8XG4gICAgICAhQXJyYXkuaXNBcnJheShmaWVsZHMpIHx8XG4gICAgICBmaWVsZHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkRmllbGRzID0gZmllbGRzLmZpbHRlcihcbiAgICAgIChmaWVsZDogYW55KSA9PiB0eXBlb2YgZmllbGQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZmllbGQpXG4gICAgKTtcbiAgICBpZiAoc29ydGVkRmllbGRzLmxlbmd0aCAhPT0gZmllbGRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGNvbnN0IGhhc1BrID0gZmllbGRzLnNvbWUoKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgIGlmICghZmllbGQgfHwgdHlwZW9mIGZpZWxkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGQsIHBrRmllbGQpO1xuICAgIH0pO1xuXG4gICAgaWYgKGhhc1BrKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEZpZWxkID0gZmllbGRzW2ZpZWxkcy5sZW5ndGggLSAxXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IGxhc3REaXJlY3Rpb24gPSBTdHJpbmcoXG4gICAgICBPYmplY3QudmFsdWVzKGxhc3RGaWVsZCB8fCB7fSlbMF0gfHwgXCJhc2NcIlxuICAgICkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBsYXN0RGlyZWN0aW9uID09PSBcImRlc2NcIiA/IFwiZGVzY1wiIDogXCJhc2NcIjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpbmRleCwge1xuICAgICAgaW5kZXg6IE9iamVjdC5hc3NpZ24oe30sIChpbmRleCBhcyBhbnkpLmluZGV4LCB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBbcGtGaWVsZF06IGRpcmVjdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZVBhdGg6IHN0cmluZykge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICBjb25zdCBkaXJuYW1lOiBzdHJpbmcgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhkaXJuYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShkaXJuYW1lKTtcbiAgZnMubWtkaXJTeW5jKGRpcm5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbEluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGxvZzogTG9nZ2VyXG4pOiBJbmRleFtdIHtcbiAgY29uc3QgaW5kZXhlcyA9IGdlbmVyYXRlSW5kZXhlcyhbbV0pO1xuICBjb25zdCBwa0ZpZWxkID0gcmVzb2x2ZVByaW1hcnlLZXlGaWVsZChtLCBsb2cpO1xuICByZXR1cm4gd2l0aERlZmF1bHRRdWVyeVBrVGllQnJlYWtlcihpbmRleGVzLCBwa0ZpZWxkIHx8IFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3M8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGFjY3VtPzogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz5cbik6IENvdWNoREJEZXNpZ25Eb2NbXSB7XG4gIGNvbnN0IHZpZXdzID0gZ2VuZXJhdGVWaWV3cyhbbV0pO1xuICBjb25zdCBzdG9yYWdlOiBSZWNvcmQ8c3RyaW5nLCBDb3VjaERCRGVzaWduRG9jPiA9IGFjY3VtIHx8IHt9O1xuICB2aWV3cy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBzdG9yYWdlW2RvYy5faWRdID0gZG9jO1xuICB9KTtcbiAgcmV0dXJuIHZpZXdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE1vZGVsRmlsZShmaWxlOiBhbnkpIHtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlLnBhcmVudFBhdGgsIGZpbGUubmFtZSk7XG4gIGNvbnN0IGV4cG9ydHMgPSByZXF1aXJlKGZpbGVQYXRoKTtcblxuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGV4cG9ydHMpLmZpbHRlcigoZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtID0gbmV3IChlIGFzIENvbnN0cnVjdG9yKSgpO1xuICAgICAgcmV0dXJuIG0gaW5zdGFuY2VvZiBNb2RlbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PltdO1xuICByZXR1cm4gdmFsdWVzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1vZGVsRm9sZGVycyhcbiAgLi4uZm9sZGVyczogc3RyaW5nW11cbik6IFByb21pc2U8TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W10+IHtcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBjb25zdCByZXN1bHQ6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gW107XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGNvbnN0IHJlc29sdmVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKGZvbGRlcik7XG4gICAgY29uc3QgZmlsZXMgPSBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHJlc29sdmVkRm9sZGVyLCB7XG4gICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmOiBhbnkpID0+IGYuaXNGaWxlKCkgJiYgZi5uYW1lLmVuZHNXaXRoKFwianNcIikpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgcmVzdWx0LnB1c2goLi4ucmVhZE1vZGVsRmlsZShmaWxlKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUluZGV4ZXMoXG4gIGluZGV4ZXM6IEluZGV4W10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGluZGV4ZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBwLFxuICAgICAgICBgLi9NRVRBLUlORi9zdGF0ZWRiL2NvdWNoZGIvJHtjb2xsZWN0aW9uID8gYGNvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbn0vYCA6IFwiXCJ9aW5kZXhlcy8ke2luZGV4Lm5hbWV9Lmpzb25gXG4gICAgICApXG4gICAgKTtcbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShpbmRleCwgdW5kZWZpbmVkLCAyKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEZXNpZ25Eb2NzKFxuICBkZXNpZ25Eb2NzOiBDb3VjaERCRGVzaWduRG9jW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBpZiAoIWRlc2lnbkRvY3MubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgZGVzaWduRG9jcy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBjb25zdCBkb2NJZCA9IGRvYy5faWQucmVwbGFjZSgvXl9kZXNpZ25cXC8vLCBcIlwiKTtcbiAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBwLFxuICAgICAgICBgLi9NRVRBLUlORi9zdGF0ZWRiL2NvdWNoZGIvJHtjb2xsZWN0aW9uID8gYGNvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbn0vYCA6IFwiXCJ9ZGVzaWduX2RvY3MvJHtkb2NJZH0uanNvbmBcbiAgICAgIClcbiAgICApO1xuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgICBjb25zdCBwYXlsb2FkID0geyAuLi5kb2MgfTtcbiAgICBkZWxldGUgcGF5bG9hZC5fcmV2O1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgdW5kZWZpbmVkLCAyKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJEZXNpZ25Eb2MgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbGxlY3Rpb25SZXNvbHZlciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvaW5kZXhcIjtcbmltcG9ydCB7IHdyaXRlRGVzaWduRG9jcyB9IGZyb20gXCIuLi9pbmRleGVzL2dlbmVyYXRpb25cIjtcblxuLy9cbi8vIGV4cG9ydCB0eXBlIEZhYnJpY0NvbGxlY3Rpb24gPSB7XG4vLyAgIG5hbWU6IFwiY29sbGVjdGlvbk1hcmJsZXNcIjtcbi8vICAgcG9saWN5OiBcIk9SKCdPcmcxTVNQLm1lbWJlcicsICdPcmcyTVNQLm1lbWJlcicpXCI7XG4vLyAgIHJlcXVpcmVkUGVlckNvdW50OiAwO1xuLy8gICBtYXhQZWVyQ291bnQ6IDM7XG4vLyAgIGJsb2NrVG9MaXZlOiAwO1xuLy8gICBtZW1iZXJPbmx5UmVhZDogdHJ1ZTtcbi8vICAgbWVtYmVyT25seVdyaXRlOiB0cnVlO1xuLy8gICBlbmRvcnNlbWVudFBvbGljeToge1xuLy8gICAgIGlkZW50aXRpZXM6IFtcbi8vICAgICAgIHsgcm9sZTogeyBuYW1lOiBcIm1lbWJlclwiOyBtc3BJZDogXCJPcmcxTVNQXCIgfSB9LFxuLy8gICAgICAgeyByb2xlOiB7IG5hbWU6IFwibWVtYmVyXCI7IG1zcElkOiBcIk9yZzJNU1BcIiB9IH0sXG4vLyAgICAgXTtcbi8vICAgICBydWxlOiBcIk9SKCdPcmcxTVNQLm1lbWJlcicsICdPcmcyTVNQLm1lbWJlcicpXCI7XG4vLyAgIH07XG4vLyB9O1xuXG5leHBvcnQgdHlwZSBGYWJyaWNQb2xpY3lJZGVudGl0eSA9IHtcbiAgcm9sZToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtc3BJZDogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgRmFicmljQ29sbGVjdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwb2xpY3k6IHN0cmluZztcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcjtcbiAgbWF4UGVlckNvdW50OiBudW1iZXI7XG4gIGJsb2NrVG9MaXZlOiBudW1iZXI7XG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuO1xuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW47XG4gIGVuZG9yc2VtZW50UG9saWN5OiB7XG4gICAgaWRlbnRpdGllczogRmFicmljUG9saWN5SWRlbnRpdHlbXTtcbiAgICBydWxlOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQcml2YXRlQ29sbGVjdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwb2xpY3k6IHN0cmluZztcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcjtcbiAgbWF4UGVlckNvdW50OiBudW1iZXI7XG4gIGJsb2NrVG9MaXZlOiBudW1iZXI7XG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuO1xuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW47XG4gIGVuZG9yc2VtZW50UG9saWN5Pzoge1xuICAgIHNpZ25hdHVyZVBvbGljeTogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3Rpb25Gb3IoXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHBvbGljeTogc3RyaW5nLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlcixcbiAgYmxvY2tUb0xpdmU6IG51bWJlcixcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4sXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhblxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGNvbGxlY3Rpb25OYW1lLFxuICAgIHBvbGljeTogcG9saWN5LFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyA9IGAke21zcElkfVByaXZhdGVgLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyID0gMCxcbiAgbWF4UGVlckNvdW50OiBudW1iZXIgPSAwLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyID0gMCxcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4gPSB0cnVlLFxuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW4gPSB0cnVlXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIGNvbnN0IGMgPSBjb2xsZWN0aW9uRm9yKFxuICAgIGNvbGxlY3Rpb25OYW1lLFxuICAgIGBPUignJHttc3BJZH0ubWVtYmVyJylgLFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGVcbiAgKTtcblxuICBjLmVuZG9yc2VtZW50UG9saWN5ID0ge1xuICAgIHNpZ25hdHVyZVBvbGljeTogYE9SKCcke21zcElkfS5wZWVyJylgLFxuICB9O1xuICByZXR1cm4gYztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZENvbGxlY3Rpb25Gb3IoXG4gIG1zcElkczogc3RyaW5nW10sXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIgPSAxLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlciA9IDIsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIgPSAwLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbiA9IHRydWUsXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbiA9IHRydWVcbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgY29uc3QgYyA9IGNvbGxlY3Rpb25Gb3IoXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgYE9SKCR7bXNwSWRzLm1hcCgobSkgPT4gYCcke219Lm1lbWJlcidgKS5qb2luKFwiLFwiKX0pYCxcbiAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICBtYXhQZWVyQ291bnQsXG4gICAgYmxvY2tUb0xpdmUsXG4gICAgbWVtYmVyT25seVJlYWQsXG4gICAgbWVtYmVyT25seVdyaXRlXG4gICk7XG4gIGMuZW5kb3JzZW1lbnRQb2xpY3kgPSB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBgQU5EKCR7bXNwSWRzLm1hcCgobSkgPT4gYCcke219LnBlZXInYCkuam9pbihcIixcIil9KWAsXG4gIH07XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdENvbGxlY3Rpb25zPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZHM6IHN0cmluZ1tdLFxuICBvdmVycmlkZXM6IHtcbiAgICBwcml2YXRlQ29scz86IFBhcnRpYWw8UHJpdmF0ZUNvbGxlY3Rpb24+O1xuICAgIHNoYXJlZENvbHM/OiBQYXJ0aWFsPFByaXZhdGVDb2xsZWN0aW9uPjtcbiAgfSA9IHt9LFxuICBtaXJyb3I6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIGxldCB7IHByaXZhdGVDb2xzLCBzaGFyZWRDb2xzIH0gPSBNb2RlbC5jb2xsZWN0aW9uc0ZvcihtKTtcblxuICBmdW5jdGlvbiByZXNvbHZlQ29sbGVjdGlvbihhcmc6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcik6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJnO1xuICAgICAgcmV0dXJuIGFyZyhtLCBtc3BJZHNbMF0pIGFzIHN0cmluZztcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlQ29scyA9IHByaXZhdGVDb2xzLm1hcChyZXNvbHZlQ29sbGVjdGlvbik7XG4gIHNoYXJlZENvbHMgPSBzaGFyZWRDb2xzLm1hcChyZXNvbHZlQ29sbGVjdGlvbik7XG5cbiAgY29uc3QgcHJpdmF0ZURlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudDogMCxcbiAgICAgIG1heFBlZXJDb3VudDogMCxcbiAgICAgIGJsb2NrVG9MaXZlOiAwLFxuICAgICAgbWVtYmVyT25seVJlYWQ6IHRydWUsXG4gICAgICBtZW1iZXJPbmx5V3JpdGU6IHRydWUsXG4gICAgfSxcbiAgICBvdmVycmlkZXM/LnByaXZhdGVDb2xzIHx8IHt9XG4gICk7XG4gIGNvbnN0IHNoYXJlZERlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudDogMSxcbiAgICAgIG1heFBlZXJDb3VudDogMixcbiAgICAgIGJsb2NrVG9MaXZlOiAwLFxuICAgICAgbWVtYmVyT25seVJlYWQ6IHRydWUsXG4gICAgICBtZW1iZXJPbmx5V3JpdGU6IHRydWUsXG4gICAgfSxcbiAgICBvdmVycmlkZXM/LnNoYXJlZENvbHMgfHwge31cbiAgKTtcblxuICBjb25zdCBtaXJyb3JNZXRhID0gbWlycm9yID8gTW9kZWwubWlycm9yZWRBdChtKSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBwcml2YXRlcyA9IG1zcElkc1xuICAgIC5tYXAoKG1zcElkKSA9PlxuICAgICAgKHByaXZhdGVDb2xzIGFzIHN0cmluZ1tdKS5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgeyByZXF1aXJlZFBlZXJDb3VudCwgbWF4UGVlckNvdW50LCBibG9ja1RvTGl2ZSwgbWVtYmVyT25seVJlYWQgfSA9XG4gICAgICAgICAgcHJpdmF0ZURlZmF1bHRzO1xuICAgICAgICByZXR1cm4gcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gICAgICAgICAgbXNwSWQsXG4gICAgICAgICAgcCxcbiAgICAgICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgICAgICBtYXhQZWVyQ291bnQsXG4gICAgICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKVxuICAgIC5mbGF0KCk7XG5cbiAgaWYgKG1pcnJvck1ldGEgJiYgbWlycm9yTWV0YS5tc3BJZCkge1xuICAgIGNvbnN0IHJlc29sdmVkID1cbiAgICAgIHR5cGVvZiBtaXJyb3JNZXRhLnJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWlycm9yTWV0YS5yZXNvbHZlclxuICAgICAgICA6IG1pcnJvck1ldGEucmVzb2x2ZXIobSwgbWlycm9yTWV0YS5tc3BJZCk7XG4gICAgaWYgKFxuICAgICAgcmVzb2x2ZWQgJiZcbiAgICAgICFwcml2YXRlcy5zb21lKFxuICAgICAgICAocCkgPT4gcC5uYW1lID09PSByZXNvbHZlZCAmJiBwLnBvbGljeS5pbmNsdWRlcyhtaXJyb3JNZXRhLm1zcElkKVxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc3QgeyByZXF1aXJlZFBlZXJDb3VudCwgbWF4UGVlckNvdW50LCBibG9ja1RvTGl2ZSwgbWVtYmVyT25seVJlYWQgfSA9XG4gICAgICAgIHByaXZhdGVEZWZhdWx0cztcbiAgICAgIHByaXZhdGVzLnB1c2goXG4gICAgICAgIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICAgICAgICAgIG1pcnJvck1ldGEubXNwSWQsXG4gICAgICAgICAgcmVzb2x2ZWQsXG4gICAgICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2hhcmVkID0gKHNoYXJlZENvbHMgYXMgc3RyaW5nW10pLm1hcCgocCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgIG1lbWJlck9ubHlXcml0ZSxcbiAgICB9ID0gc2hhcmVkRGVmYXVsdHM7XG4gICAgcmV0dXJuIHNoYXJlZENvbGxlY3Rpb25Gb3IoXG4gICAgICBtc3BJZHMsXG4gICAgICBwLFxuICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICBtYXhQZWVyQ291bnQsXG4gICAgICBibG9ja1RvTGl2ZSxcbiAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgbWVtYmVyT25seVdyaXRlXG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcml2YXRlcyxcbiAgICBzaGFyZWQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25zKFxuICBjb2xzOiBQcml2YXRlQ29sbGVjdGlvbltdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBmaWxlTmFtZSA9IFwiY29sbGVjdGlvbnNfY29uZmlnXCJcbikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgZGlybmFtZTogc3RyaW5nID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSBhcyBzdHJpbmc7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlybmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZGlybmFtZSk7XG4gICAgZnMubWtkaXJTeW5jKGRpcm5hbWUpO1xuICB9XG5cbiAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4ocCwgYC4vTUVUQS1JTkYvJHtmaWxlTmFtZX0uanNvbmApKTtcbiAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KGNvbHMsIHVuZGVmaW5lZCwgMikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyhcbiAgZG9jczogQ291Y2hEQkRlc2lnbkRvY1tdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBjb2xsZWN0aW9uPzogc3RyaW5nXG4pIHtcbiAgaWYgKCFkb2NzPy5sZW5ndGgpIHJldHVybjtcbiAgd3JpdGVEZXNpZ25Eb2NzKGRvY3MsIHAsIGNvbGxlY3Rpb24pO1xufVxuIiwiaW1wb3J0IHtcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQYWdpbmF0b3IsXG4gIFByZXBhcmVkU3RhdGVtZW50LFxuICBTZXJpYWxpemVkUGFnZSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUGFnaW5hdG9yPFxuICBNLFxuICBNW10sXG4gIE1hbmdvUXVlcnlcbj4ge1xuICBib29rbWFyaz86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICAgIHF1ZXJ5OiBNYW5nb1F1ZXJ5IHwgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgYFJhdyBxdWVyeSBhY2Nlc3MgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLiBvbmx5IHByZXBhcmVkIHN0YXRlbWVudHMgYXJlIG5hdGl2ZWx5IGF2YWlsYWJsZWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcGFnZShcbiAgICBwYWdlOiBudW1iZXIgPSAxLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHN1cGVyLnBhZ2UocGFnZSwgLi4uYXJncyk7IC8vIHRoaXMgd2lsbCBmYWlsIGZvciBub24tcHJlcGFyZWQgc3RhdGVtZW50c1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGlzU2VyaWFsaXplZFBhZ2Uob2JqOiBTZXJpYWxpemVkUGFnZTxhbnk+IHwgYW55KSB7XG4gICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIEFycmF5LmlzQXJyYXkob2JqLmRhdGEpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuLy8gaW1wb3J0IHsgTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRSB9IGZyb20gXCIuLi9jb250cmFjdHMvcHJpdmF0ZS1kYXRhXCI7XG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gb3ZlcmZsb3cgZXJyb3IgaW4gYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgT3ZlcmZsb3dFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJmbG93RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgT3ZlcmZsb3dFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQmFsYW5jZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEJhbGFuY2VFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQWxsb3dhbmNlRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSByZWdpc3RyYXRpbmcgbmV3IGVudGl0aWVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBSZWdpc3RyYXRpb25FcnJvclxuICpcbiAqIEBjYXRlZ29ydCBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbkVycm9yIGV4dGVuZHMgQXV0aG9yaXphdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUmVnaXN0cmF0aW9uRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZFxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudFxuICogcGVyc2lzdGVuY2UgYWRhcHRlciBvciBjb25maWd1cmF0aW9uLiBJdCBleHRlbmRzIHRoZSBCYXNlRXJyb3IgY2xhc3MgYW5kIHNldHMgYSA1MDAgc3RhdHVzIGNvZGUuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXBcbiAqIEBjbGFzcyBVbnN1cHBvcnRlZEVycm9yXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVGhyb3dpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogaWYgKCFhZGFwdGVyLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpIHtcbiAqICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGFkYXB0ZXInKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBhZGFwdGVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gbm90IHN1cHBvcnRlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgTWlzc2luZ0NvbnRleHRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBNaXNzaW5nQ29udGV4dEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciA9IFwiTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRVwiKSB7XG4gICAgc3VwZXIoVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MubmFtZSwgbXNnLCA0MDMpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycyB3aGVuIGEgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gc3RlcCBpcyBub3QgcGVyZm9ybWVkLlxuICpcbiAqIEBjbGFzcyBOb3RJbml0aWFsaXplZEVycm9yXG4gKiBAZXh0ZW5kcyBCYXNlRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXAuXG4gKlxuICogQHRocm93cyB7Tm90SW5pdGlhbGl6ZWRFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbm90IHBlcmZvcm1lZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqIGlmICghaXNJbml0aWFsaXplZCkge1xuICogICB0aHJvdyBuZXcgTm90SW5pdGlhbGl6ZWRFcnJvcignQXBwbGljYXRpb24gaXMgbm90IGluaXRpYWxpemVkJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gTm90SW5pdGlhbGl6ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90SW5pdGlhbGl6ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ0luaXRpYWxpemF0aW9uIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEluaXRpYWxpemVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoTm90SW5pdGlhbGl6ZWRFcnJvci5uYW1lLCBtc2csIDQwOSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdQS0NTUzExTGliIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE1pc3NpbmdQS0NTUzExTGliLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZG9yc2VtZW50RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFbmRvcnNlbWVudEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE12Y2NSZWFkQ29uZmxpY3RFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE12Y2NSZWFkQ29uZmxpY3RFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kb3JzZW1lbnRQb2xpY3lFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVuZG9yc2VtZW50UG9saWN5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25MaW1pdHNFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcixcbiAgICBuYW1lOiBzdHJpbmcgPSBUcmFuc2FjdGlvbkxpbWl0c0Vycm9yLm5hbWUsXG4gICAgY29kZSA9IDU5MFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBUcmFuc2FjdGlvblRpbWVvdXRFcnJvci5uYW1lLCA1OTEpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yLm5hbWUsIDU5Mik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciBleHRlbmRzIFRyYW5zYWN0aW9uTGltaXRzRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvci5uYW1lLCA1OTMpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlQ29udGV4dHVhbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dE9mLFxuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgRmxhZ3NPZixcbiAgT2JzZXJ2ZXJIYW5kbGVyLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIFJlcG9zaXRvcnksXG4gIFNlcmlhbGl6ZWRQYWdlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICByZWR1Y2VFcnJvcnNUb1ByaW50LFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciB9IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gZm9yIEZhYnJpYyBjbGllbnQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgZ2VuZXJpYyBSZXBvc2l0b3J5IHRvIHByZXBhcmUgY29udGV4dCBhbmQgYXJndW1lbnRzIGZvciBDUlVEIG9wZXJhdGlvbnMgZXhlY3V0ZWQgdmlhIGEgRmFicmljIGNsaWVudCBBZGFwdGVyLCB3aXJpbmcgUmVwb3NpdG9yeUZsYWdzIGFuZCBGYWJyaWMtc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyByZXBvc2l0b3J5XG4gKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBNYW5nb1F1ZXJ5LCBGYWJyaWNGbGFncywgQ29udGV4dDxGYWJyaWNGbGFncz4+fSBbYWRhcHRlcl0gLSBPcHRpb25hbCBhZGFwdGVyIGluc3RhbmNlIHVzZWQgdG8gZXhlY3V0ZSBvcGVyYXRpb25zXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBbY2xhenpdIC0gT3B0aW9uYWwgbW9kZWwgY29uc3RydWN0b3IgdXNlZCBieSB0aGUgcmVwb3NpdG9yeVxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuICogaW1wb3J0IHsgRmFicmljQ2xpZW50UmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWZhYnJpY1wiO1xuICpcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBNb2RlbCB7IGlkITogc3RyaW5nOyBuYW1lITogc3RyaW5nOyB9XG4gKiBjb25zdCByZXBvID0gbmV3IEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8VXNlcj4oKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHJlcG8ucmVhZChcIjFcIik7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgQXBwLT4+UmVwbzogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvLT4+UmVwbzogY3JlYXRlUHJlZml4KG1vZGVsLCAuLi5hcmdzKVxuICogICBSZXBvLT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlLCBpZCwgbW9kZWwsIGZsYWdzKVxuICogICBBZGFwdGVyLS0+PlJlcG86IHJlc3VsdFxuICogICBSZXBvLS0+PkFwcDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgQSBleHRlbmRzIEZhYnJpY0NsaWVudEFkYXB0ZXIgPSBGYWJyaWNDbGllbnRBZGFwdGVyLFxuPiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgQT4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX292ZXJyaWRlcyA9IE9iamVjdC5hc3NpZ24oe30sIHN1cGVyW1wiX292ZXJyaWRlc1wiXSwge1xuICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgYWxsb3dSYXdTdGF0ZW1lbnRzOiBmYWxzZSxcbiAgICBmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzOiB0cnVlLFxuICAgIGZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzOiB0cnVlLFxuICAgIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiBmYWxzZSxcbiAgICByZWJ1aWxkV2l0aFRyYW5zaWVudDogZmFsc2UsXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI/OiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+LCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgY2xhenosIGZvcmNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG92ZXJyaWRlKGZsYWdzOiBQYXJ0aWFsPEZsYWdzT2Y8Q29udGV4dE9mPEE+Pj4pOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXJcbiAgICAgIC5vdmVycmlkZShPYmplY3QuYXNzaWduKHt9LCBmbGFncywgdGhpcy5fb3ZlcnJpZGVzKSlcbiAgICAgIC5mb3IoZmxhZ3MgYXMgYW55KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gc3VwZXIuT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdpbmF0ZUJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgcmVmOiBPbWl0PERpcmVjdGlvbkxpbWl0T2Zmc2V0LCBcImRpcmVjdGlvblwiPiA9IHtcbiAgICAgIG9mZnNldDogMSxcbiAgICAgIGxpbWl0OiAxMCxcbiAgICB9LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZFBhZ2U8TT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5wYWdpbmF0ZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBwYWdpbmF0aW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIHBhZ2Ugc2l6ZSAke3JlZi5saW1pdH1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLnBhZ2luYXRlQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIG9yZGVyLFxuICAgICAgeyBsaW1pdDogcmVmLmxpbWl0LCBvZmZzZXQ6IHJlZi5vZmZzZXQsIGJvb2ttYXJrOiByZWYuYm9va21hcmsgfSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdEJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5saXN0QnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGxpc3RpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ30gJHtvcmRlcn1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgICAgdGhpcy5saXN0QnkubmFtZSxcbiAgICAgICAga2V5LFxuICAgICAgICBvcmRlcixcbiAgICAgICAgLi4uY3R4QXJnc1xuICAgICAgKSkgYXMgYW55O1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgUXVlcnlSZXN1bHRUb29MYXJnZUVycm9yKSB7XG4gICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgIGBsaXN0QnkgcmVzdWx0IHNldCB0b28gbGFyZ2UgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBrZXk9JHtTdHJpbmcoa2V5KX0gb3JkZXI9JHtvcmRlcn0uIFJldHVybmluZyBlbXB0eSBsaXN0LiBVc2UgcGFnaW5hdGVCeSBmb3IgbGFyZ2UgZGF0YXNldHMuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW10gYXMgTVtdO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5maW5kQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgYWxsICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoICR7a2V5IGFzIHN0cmluZ30gJHt2YWx1ZX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5maW5kQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRPbmVCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgdmFsdWU6IGFueSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZE9uZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIE9uZSAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCAke2tleSBhcyBzdHJpbmd9ICR7dmFsdWV9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZE9uZUJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZC5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBvcmRlcixcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdlKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICByZWY6IE9taXQ8RGlyZWN0aW9uTGltaXRPZmZzZXQsIFwiZGlyZWN0aW9uXCI+ID0ge1xuICAgICAgb2Zmc2V0OiAxLFxuICAgICAgbGltaXQ6IDEwLFxuICAgIH0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxTZXJpYWxpemVkUGFnZTxNPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnBhZ2UpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYHBhZ2luZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMucGFnZS5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICByZWYsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc3RhdGVtZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdGF0ZW1lbnQpO1xuICAgIGxvZy52ZXJib3NlKGBFeGVjdXRpbmcgcHJlcGFyZWQgc3RhdGVtZW50ICR7bmFtZX1gKTtcbiAgICBjb25zdCBjYWxsQXJncyA9IGN0eEFyZ3Muc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoXG4gICAgICB0aGlzLmFkYXB0ZXIuZGVjb2RlKFxuICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCxcbiAgICAgICAgICBbbmFtZSwgSlNPTi5zdHJpbmdpZnkoY2FsbEFyZ3MpXSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaXMuY2xhc3NcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBsZXQgaHlkcmF0ZWQ6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBoeWRyYXRlZCA9IHJlc3VsdC5tYXAoKHI6IGFueSkgPT5cbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICAgICAgID8gKG5ldyB0aGlzLmNsYXNzKHIpIGFzIE0pXG4gICAgICAgICAgOiByXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdICYmXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdID09PSBNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcylcbiAgICApIHtcbiAgICAgIGh5ZHJhdGVkID0gbmV3IHRoaXMuY2xhc3MocmVzdWx0KSBhcyBNO1xuICAgIH0gZWxzZSBpZiAoRmFicmljQ2xpZW50UGFnaW5hdG9yLmlzU2VyaWFsaXplZFBhZ2UocmVzdWx0KSkge1xuICAgICAgaHlkcmF0ZWQgPSBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGQ6IGFueSkgPT4gbmV3IHRoaXMuY2xhc3MoZCkgYXMgTSksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHlkcmF0ZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlBZnRlclJlYWQoaHlkcmF0ZWQsIGN0eCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFwcGx5QWZ0ZXJSZWFkKHZhbHVlOiBhbnksIGN0eDogQ29udGV4dE9mPEE+KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIWN0eC5nZXRPclVuZGVmaW5lZChcImFmdGVyUXVlcnlIYW5kbGVyc1wiKSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIFJlcG9zaXRvcnk8TSwgQT4sIGFueT4oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGN0eCxcbiAgICAgICAgdmFsdWUgYXMgTSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZhbHVlLm1hcCgoZW50cnkpID0+IHRoaXMuYXBwbHlBZnRlclJlYWQoZW50cnksIGN0eCkpKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKEZhYnJpY0NsaWVudFBhZ2luYXRvci5pc1NlcmlhbGl6ZWRQYWdlKHZhbHVlKSkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseUFmdGVyUmVhZCh2YWx1ZS5kYXRhLCBjdHgpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb3VudE9mKFxuICAgIGtleT86IGtleW9mIE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY291bnRPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY291bnRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9JHtrZXkgPyBgIGJ5ICR7a2V5IGFzIHN0cmluZ31gIDogXCJcIn1gXG4gICAgKTtcbiAgICBjb25zdCBzdG10QXJncyA9IGtleSA/IFtrZXksIC4uLmN0eEFyZ3NdIDogY3R4QXJncztcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCAuLi5zdG10QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtYXhPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWF4T2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWF4IG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtaW5PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWluT2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWluIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBhdmdPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5hdmdPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgYXZnIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzdW1PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdW1PZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgc3VtIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkaXN0aW5jdE9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW0tdW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZGlzdGluY3RPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBkaXN0aW5jdCB2YWx1ZXMgb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZ3JvdXBPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTVtdPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5ncm91cE9mKTtcbiAgICBsb2cudmVyYm9zZShgZ3JvdXBpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ31gKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgaGVhbHRoY2hlY2soLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuaGVhbHRoY2hlY2spO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmhlYWx0aGNoZWNrKHRoaXMuY2xhc3MsIC4uLmN0eEFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgdGhpcy5lbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eCwgbW9kZWwpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIGN0eCk7XG4gICAgY29uc3QgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHByZXBhcmVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgaWQsXG4gICAgICByZWNvcmQsXG4gICAgICB0cmFuc2llbnQsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZXN1bHQsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnQsIGN0eCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgeyBjdHhBcmdzLCBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGUpO1xuICAgIHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCBjdHgpO1xuICAgIGNvbnN0IHsgaWQsIHRyYW5zaWVudCB9ID0gcHJlcGFyZWQ7XG4gICAgbGV0IHJlY29yZCA9IHByZXBhcmVkLnJlY29yZDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgdXBkYXRpbmcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIGlkICR7aWR9YFxuICAgICk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZCxcbiAgICAgIHJlY29yZCxcbiAgICAgIHRyYW5zaWVudCxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgaWQsIHRyYW5zaWVudCwgY3R4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxbTVtdLCAuLi5hbnlbXSwgQ29udGV4dE9mPEE+XT4ge1xuICAgIGNvbnN0IHsgY3R4LCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNyZWF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgaWdub3JlSGFuZGxlcnMgPSBjdHguZ2V0KFwiaWdub3JlSGFuZGxlcnNcIik7XG4gICAgY29uc3QgaWdub3JlVmFsaWRhdGUgPSBjdHguZ2V0KFwiaWdub3JlVmFsaWRhdGlvblwiKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG5cbiAgICBtb2RlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBpZiAoIWlnbm9yZUhhbmRsZXJzKVxuICAgICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgUmVwb3NpdG9yeTxNLCBBPiwgYW55PihcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBpZiAoIWlnbm9yZVZhbGlkYXRlKSB7XG4gICAgICBjb25zdCBpZ25vcmVkUHJvcHMgPSBjdHguZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gUHJvbWlzZS5yZXNvbHZlKG0uaGFzRXJyb3JzKC4uLmlnbm9yZWRQcm9wcykpKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IHJlZHVjZUVycm9yc1RvUHJpbnQoZXJyb3JzKTtcblxuICAgICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG4gICAgfVxuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyAke21vZGVscy5sZW5ndGh9IG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobW9kZWwpID0+IHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKSk7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCBjdHgpKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGNvbnN0IHBheWxvYWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgY29uc3QgdHJhbnNpZW50cyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC50cmFuc2llbnQpO1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGlkcyBhcyBQcmltYXJ5S2V5VHlwZVtdLFxuICAgICAgcGF5bG9hZHMsXG4gICAgICB0cmFuc2llbnRzLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgY3JlYXRlZC5tYXAoYXN5bmMgKHIsIGkpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBpZHNbaV07XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHIsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnRzW2ldLCBjdHgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICkge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYHJlYWRpbmcgJHtrZXlzLmxlbmd0aH0gJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLmNsYXNzLCBrZXlzLCAuLi5jdHhBcmdzKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIGtleXNbaV0sIHt9LCBjdHgpXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgVXBkYXRpbmcgJHttb2RlbHMubGVuZ3RofSBuZXcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuXG4gICAgbW9kZWxzLmZvckVhY2goKG1vZGVsKSA9PiB0aGlzLmVuc3VyZUxlZ2FjeU1pcnJvckZsYWcoY3R4LCBtb2RlbCkpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgY3R4KSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZHMgYXMgUHJpbWFyeUtleVR5cGVbXSxcbiAgICAgIHByZXBhcmVkLm1hcCgocikgPT4gci5yZWNvcmQpLFxuICAgICAgcHJlcGFyZWQubWFwKChyKSA9PiByLnRyYW5zaWVudCksXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICB1cGRhdGVkLm1hcChhc3luYyAodSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGlkc1tpXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICAgICAgdSxcbiAgICAgICAgICB0aGlzLmNsYXNzLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIHByZXBhcmVkW2ldLnRyYW5zaWVudCxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHg6IENvbnRleHRPZjxBPiwgbW9kZWw6IE0pOiB2b2lkIHtcbiAgICBpZiAoTW9kZWwubWlycm9yZWRBdChtb2RlbCkpIHtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHsgbGVnYWN5OiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsLCBjb2x1bW4sIHBrLCB0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCB0b2tlbiBtZXRhZGF0YSBtb2RlbFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBFUkMyMCB0b2tlbiBkZWZpbml0aW9uIHdpdGhpbiB0aGUgRmFicmljIEVSQzIwIHNhbXBsZSwgaW5jbHVkaW5nIG5hbWUsIHN5bWJvbCwgZGVjaW1hbHMsIGFuZCB0aGUgb3duaW5nIGlkZW50aXR5LiBVc2VkIHRvIGRlZmluZSB0aGUgdW5pcXVlIHRva2VuIG1hbmFnZWQgYnkgdGhlIGNvbnRyYWN0LlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFRva2VuPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRVJDMjBUb2tlblxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRva2VuID0gbmV3IEVSQzIwVG9rZW4oeyBuYW1lOiBcIk15VG9rZW5cIiwgc3ltYm9sOiBcIk1US1wiLCBkZWNpbWFsczogMTgsIG93bmVyOiBcIng1MDk6Oi4uLlwiIH0pO1xuICogLy8gUGVyc2lzdCB0aHJvdWdoIGEgcmVwb3NpdG9yeTogYXdhaXQgcmVwby5jcmVhdGUodG9rZW4sIGN0eClcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9cbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobmV3IEVSQzIwVG9rZW4oey4uLn0pLCBjdHgpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkPW5hbWUsIHJlY29yZCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogc3RvcmVkXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdGFibGUoXCJlcmMyMF90b2tlbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRVJDMjBUb2tlbiBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHVuaXF1ZSBuYW1lXG4gICAqIEBzdW1tYXJ5IFNlcnZlcyBhcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBFUkMyMCB0b2tlbiBkZWZpbml0aW9uOyB0eXBpY2FsbHkgYSBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVyXG4gICAqL1xuICBuYW1lITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmluZyBpZGVudGl0eSBvZiB0aGUgdG9rZW5cbiAgICogQHN1bW1hcnkgWC41MDkgc3ViamVjdCBvciBNU1AgaWRlbnRpdHkgc3RyaW5nIHRoYXQgZGVub3RlcyB3aG8gb3ducy9jb250cm9scyB0aGUgdG9rZW4gZGVmaW5pdGlvblxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHN5bWJvbFxuICAgKiBAc3VtbWFyeSBTaG9ydCB0aWNrZXItbGlrZSBzeW1ib2wgdXNlZCB0byByZXByZXNlbnQgdGhlIHRva2VuIChlLmcuLCBNVEspXG4gICAqL1xuICBzeW1ib2whOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY2ltYWwgcHJlY2lzaW9uIGZvciB0b2tlbiBhbW91bnRzXG4gICAqIEBzdW1tYXJ5IE51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRva2VuIGJhbGFuY2VzXG4gICAqL1xuICBkZWNpbWFscyE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgd2FsbGV0IG1vZGVsXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgaG9sZGVyIGFjY291bnQgZm9yIGFuIEVSQzIwIHRva2VuIHdpdGhpbiB0aGUgRmFicmljIG5ldHdvcmssIHRyYWNraW5nIGJhbGFuY2UgYW5kIHRva2VuIGFzc29jaWF0aW9uLlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFdhbGxldD59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEVSQzIwV2FsbGV0XG4gKiBAZXhhbXBsZVxuICogY29uc3Qgd2FsbGV0ID0gbmV3IEVSQzIwV2FsbGV0KHsgaWQ6IFwiYWNjdDFcIiwgdG9rZW46IFwiTXlUb2tlblwiLCBiYWxhbmNlOiAxMDAwIH0pO1xuICogLy8gVXBkYXRlIGJhbGFuY2UgdmlhIHJlcG9zaXRvcnk6IGF3YWl0IHJlcG8udXBkYXRlKHdhbGxldCwgY3R4KVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwb1xuICogICBBcHAtPj5SZXBvOiByZWFkKFwiYWNjdDFcIiwgY3R4KVxuICogICBSZXBvLS0+PkFwcDogRVJDMjBXYWxsZXRcbiAqL1xuQHRhYmxlKFwiZXJjMjBfd2FsbGV0c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFUkMyMFdhbGxldCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdhbGxldCB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIHdhbGxldDsgY29tbW9ubHkgcmVmZXJlbmNlcyBhbiBhY2NvdW50IG9yIGlkZW50aXR5XG4gICAqL1xuICBpZCE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc3NvY2lhdGVkIHRva2VuIG5hbWVcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgRVJDMjBUb2tlbiB0aGlzIHdhbGxldCBob2xkczsgbWFpbnRhaW5lZCBhcyBhIHJlbGF0aW9uc2hpcCBmb3IgY2FzY2FkaW5nIHVwZGF0ZXMvZGVsZXRlc1xuICAgKi9cbiAgdG9rZW4hOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVG9rZW4gYmFsYW5jZSBmb3IgdGhpcyB3YWxsZXRcbiAgICogQHN1bW1hcnkgQ3VycmVudCBhbW91bnQgb2YgdGhlIGFzc29jaWF0ZWQgdG9rZW4gaGVsZCBieSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSE6IG51bWJlcjtcblxuICBAY29sdW1uKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYXB0aXZlIGZsYWcgb3IgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBPcHRpb25hbCBmaWVsZCB1c2VkIGJ5IHNvbWUgZmxvd3MgdG8gbWFyayBub24tdHJhbnNmZXJhYmxlIGZ1bmRzIG9yIG1hbmFnZWQgY3VzdG9keVxuICAgKi9cbiAgY2FwdGl2ZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgYWxsb3dhbmNlIG1vZGVsXG4gKiBAc3VtbWFyeSBDYXB0dXJlcyBhbiBhcHByb3ZhbCByZWxhdGlvbnNoaXAgd2hlcmUgYW4gb3duZXIgYWxsb3dzIGEgc3BlbmRlciB0byB0cmFuc2ZlciB1cCB0byBhIGNlcnRhaW4gdmFsdWUgZnJvbSB0aGUgb3duZXIncyB3YWxsZXQuXG4gKiBAcGFyYW0ge01vZGVsQXJnPEFsbG93YW5jZT59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEFsbG93YW5jZVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFsbG93YW5jZSA9IG5ldyBBbGxvd2FuY2UoeyBvd25lcjogXCJhY2N0MVwiLCBzcGVuZGVyOiBcImFjY3QyXCIsIHZhbHVlOiA1MCB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIEFwcC0+PkFwcDogbmV3IEFsbG93YW5jZSh7IG93bmVyLCBzcGVuZGVyLCB2YWx1ZSB9KVxuICovXG5AdGFibGUoXCJlcmMyMF9hbGxvd2FuY2VzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEFsbG93YW5jZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsbG93YW5jZSB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIGFsbG93YW5jZTsgdHlwaWNhbGx5IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhcHByb3ZhbCByZWxhdGlvbnNoaXBcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmVyIHdhbGxldCBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFdhbGxldCB0aGF0IGF1dGhvcml6ZXMgdGhlIGFsbG93YW5jZVxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3BlbmRlciB3YWxsZXQgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBXYWxsZXQgYWxsb3dlZCB0byBzcGVuZCB1cCB0byB0aGUgYXBwcm92ZWQgdmFsdWUgZnJvbSB0aGUgb3duZXJcbiAgICovXG4gIHNwZW5kZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwcm92ZWQgdmFsdWVcbiAgICogQHN1bW1hcnkgTWF4aW11bSB0b2tlbiBhbW91bnQgdGhlIHNwZW5kZXIgbWF5IHRyYW5zZmVyIG9uIGJlaGFsZiBvZiB0aGUgb3duZXJcbiAgICovXG4gIHZhbHVlITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxBbGxvd2FuY2U+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDbGllbnQtc2lkZSBKU09OIHNlcmlhbGl6ZXIgZm9yIERlY2FmIG1vZGVscyB0YXJnZXRpbmcgSHlwZXJsZWRnZXIgRmFicmljXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIEpTT05TZXJpYWxpemVyIHRvIGVtYmVkIG1vZGVsIG1ldGFkYXRhIChhbmNob3IpIHJlcXVpcmVkIHRvIHJlY29uc3RydWN0IGluc3RhbmNlcyBvbiB0aGUgY2xpZW50LCBhbmQgdG8gc2FmZWx5IHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBGYWJyaWMtYm91bmQgbW9kZWxzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBEZWNhZiBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyBzZXJpYWxpemVyXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50czsgcHJvdmlkZWQgZm9yIGRvY3VtZW50YXRpb24gY29tcGxldGVuZXNzXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIENsaWVudFNlcmlhbGl6ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZXJpYWxpemVyID0gbmV3IENsaWVudFNlcmlhbGl6ZXI8VXNlcj4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IHVzZXIgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGpzb24pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU2VyaWFsaXplciBhcyBDbGllbnRTZXJpYWxpemVyXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IHNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0+PlNlcmlhbGl6ZXI6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0tPj5BcHA6IEpTT04gc3RyaW5nXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IGRlc2VyaWFsaXplKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5TZXJpYWxpemVyOiBKU09OLnBhcnNlKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5Nb2RlbDogTW9kZWwuYnVpbGQocGFyc2VkLCBhbmNob3IpXG4gKiAgIE1vZGVsLS0+PkFwcDogaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudFNlcmlhbGl6ZXI8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmUgYSBtb2RlbCBmb3IgSlNPTiBzZXJpYWxpemF0aW9uIGVtYmVkZGluZyBjbGFzcyBhbmNob3JcbiAgICogQHN1bW1hcnkgQ2xvbmVzIHRoZSBtb2RlbCBhbmQgaW5qZWN0cyB0aGUgY2xhc3MgbWV0YWRhdGEgYW5jaG9yIHNvIGl0IGNhbiBiZSByZWNvbnN0cnVjdGVkIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIEZhbGxzIGJhY2sgdG8gcHJvdmlkZWQgdGFibGUgbmFtZSBpZiBtZXRhZGF0YSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHNlcmlhbGl6ZXJcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttb2RlbE5hbWVdIC0gT3B0aW9uYWwgdGFibGUgbmFtZSB0byB1c2Ugd2hlbiBtZXRhZGF0YSBjYW5ub3QgYmUgZGVyaXZlZFxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBBIHBsYWluIG9iamVjdCByZWFkeSB0byBiZSBKU09OLnN0cmluZ2lmeSdkXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGxldCBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgICBpZiAoIW1ldGFkYXRhIHx8IG1ldGFkYXRhID09PSBcIk9iamVjdFwiKVxuICAgICAgaWYgKG1vZGVsTmFtZSkgbWV0YWRhdGEgPSBtb2RlbE5hbWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICApO1xuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGE7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gaXRzIEpTT04gc2VyaWFsaXphdGlvblxuICAgKiBAc3VtbWFyeSBQYXJzZXMgdGhlIEpTT04gc3RyaW5nLCByZXRyaWV2ZXMgdGhlIGVtYmVkZGVkIG1vZGVsIGFuY2hvciwgYW5kIHVzZXMgTW9kZWwuYnVpbGQgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgSlNPTiBzdHJpbmcgcHJldmlvdXNseSBwcm9kdWNlZCBieSBzZXJpYWxpemVcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZXMgYSBtb2RlbCB0byBhIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB2aWEgcHJlU2VyaWFsaXplLCBlbWJlZGRpbmcgbWV0YWRhdGEgbmVlZGVkIGZvciByZWNvbnN0cnVjdGlvbiwgYW5kIHJldHVybnMgYSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhYmxlXSAtIE9wdGlvbmFsIHRhYmxlIG5hbWUgdG8gaW5jbHVkZSBhcyBhbmNob3Igd2hlbiBtZXRhZGF0YSBpcyB1bmF2YWlsYWJsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCBtb2RlbCB3aXRoIGFuY2hvciBtZXRhZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCwgbW9kZWxOYW1lKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRVJDMjBUb2tlbiwgRVJDMjBXYWxsZXQgfSBmcm9tIFwiLi4vLi4vY29udHJhY3RzL2VyYzIwL21vZGVsc1wiO1xuaW1wb3J0IHsgTW9kZWwsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4uL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IENsaWVudFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIENvbnRleHRPZixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIEV2ZW50SWRzLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFNlcXVlbmNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuLyoqXG4gKiBSZXBvc2l0b3J5IGZvciBpbnRlcmFjdGluZyB3aXRoIEVSQzIwIGNvbnRyYWN0cyBvbiBhIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3JrLlxuICogRXh0ZW5kcyB0aGUgYmFzZSBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGNsYXNzIGFuZCB1dGlsaXplcyB0aGUgQ2xpZW50U2VyaWFsaXplciBmb3IgZGF0YSBzZXJpYWxpemF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5PFxuICBBIGV4dGVuZHMgRmFicmljQ2xpZW50QWRhcHRlcixcbj4gZXh0ZW5kcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PEVSQzIwV2FsbGV0LCBBPiB7XG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemVyPGFueT4gPVxuICAgIEZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeS5zZXJpYWxpemVyO1xuXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIG9ic2VydmVycyBvZiBhbiBldmVudC5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBhIGRhdGFiYXNlIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUgbmFtZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIElEIG9yIElEcyBvZiB0aGUgYWZmZWN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnM8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8TT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yICR7dGhpc31gXG4gICAgKTtcblxuICAgIHRhYmxlID0gKFxuICAgICAgdHlwZW9mIHRhYmxlID09PSBcInN0cmluZ1wiID8gTW9kZWwuZ2V0KHRhYmxlKSA6IHRhYmxlXG4gICAgKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBsZXQgcGFyc2VkSWQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlZElkID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICAgIHBhcnNlZElkID0gaWQubWFwKFxuICAgICAgICAoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZShNb2RlbC5zZXF1ZW5jZUZvcih0YWJsZSkudHlwZSwgaSkgYXMgc3RyaW5nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRJZCA9IFNlcXVlbmNlLnBhcnNlVmFsdWUoXG4gICAgICAgIE1vZGVsLnNlcXVlbmNlRm9yKHRhYmxlKS50eXBlLFxuICAgICAgICBpZFxuICAgICAgKSBhcyBzdHJpbmc7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBwYXJzZWRJZCEsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgVWludDhBcnJheSBpbnRvIGEgc3RyaW5nIHVzaW5nIHRoZSBUZXh0RGVjb2Rlci5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgVWludDhBcnJheSB0byBkZWNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIHN0cmluZy5cbiAgICovXG4gIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LmRlY29kZXIuZGVjb2RlKGRhdGEpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEpIHtcbiAgICBzdXBlcihhZGFwdGVyLCBFUkMyMFdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlRva2VuTmFtZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b2tlbk5hbWUoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b2tlbk5hbWVcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudG9rZW5OYW1lXG4gICAgKTtcbiAgICBjb25zdCBuYW1lID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIlRva2VuTmFtZVwiKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzeW1ib2wgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIHN5bWJvbCBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlN5bWJvbFwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc3ltYm9sIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHN5bWJvbCguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+Pik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInN5bWJvbFwiLCB0cnVlKSkuZm9yKHRoaXMuc3ltYm9sKTtcbiAgICBjb25zdCBzeW1ib2wgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiU3ltYm9sXCIpO1xuICAgIHJldHVybiB0aGlzLmRlY29kZShzeW1ib2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIkRlY2ltYWxzXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IGFuZCBkZWNvZGVzIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGRlY2ltYWxzKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZGVjaW1hbHNcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZGVjaW1hbHNcbiAgICApO1xuICAgIGNvbnN0IGRlY2ltYWxzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIkRlY2ltYWxzXCIpO1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoZGVjaW1hbHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiVG90YWxTdXBwbHlcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QgYW5kIGRlY29kZXMgdGhlIHJldHVybmVkIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b3RhbFN1cHBseShcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b3RhbFN1cHBseVwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy50b3RhbFN1cHBseVxuICAgICk7XG4gICAgY29uc3QgdG90YWwgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiVG90YWxTdXBwbHlcIik7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZSh0b3RhbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIGEgc3BlY2lmaWVkIG93bmVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIHRoZSBFUkMyMCB0b2tlbiBmb3IgYSBnaXZlbiBvd25lci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQmFsYW5jZU9mXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHByb3ZpZGVkIG93bmVyJ3MgYWRkcmVzcyBhcyBhIHBhcmFtZXRlci5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCBjb252ZXJ0ZWQgdG8gYSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBFUkMyMCB0b2tlbiBvd25lci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIHRoZSBzcGVjaWZpZWQgb3duZXIuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBiYWxhbmNlT2YoXG4gICAgb3duZXI6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJiYWxhbmNlXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmJhbGFuY2VPZlxuICAgICk7XG4gICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJCYWxhbmNlT2ZcIiwgW1xuICAgICAgb3duZXIsXG4gICAgXSk7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZShiYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYSByZWNpcGllbnQuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gdHJhbnNmZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBhIHJlY2lwaWVudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgcmVjaXBpZW50J3MgYWRkcmVzcyBhbmQgdGhlIHRyYW5zZmVyIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gdHJhbnNmZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyKFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwidHJhbnNmZXJcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudHJhbnNmZXJcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZmVycmVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKGN0eCwgXCJUcmFuc2ZlclwiLCBbXG4gICAgICB0byxcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKHRyYW5zZmVycmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHRyYW5zZmVyIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKiBGb3IgdGhpcyB0cmFuc2ZlciB0byB3b3JrIHRoZSBzcGVuZGVyICggYWNjb3VudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGlzIGZ1bmN0aW9uICkgbmVlZCB0byBoYXZlIHRoZSB2YWx1ZSBhcHByb3ZlZCBhcyBhbiBhbGxvd2FuY2UgYnkgdGhlIHNlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJGcm9tXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHNlbmRlcidzIGFkZHJlc3MsIHJlY2lwaWVudCdzIGFkZHJlc3MsIGFuZCB0aGUgdHJhbnNmZXIgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIuXG4gICAqIEBwYXJhbSB0byAtIFRoZSBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIHRyYW5zZmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckZyb20oXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwidHJhbnNmZXJGcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLnRyYW5zZmVyRnJvbSk7XG4gICAgY29uc3QgdHJhbnNmZXJyZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIlRyYW5zZmVyRnJvbVwiLFxuICAgICAgW2Zyb20sIHRvLCB2YWx1ZS50b1N0cmluZygpXVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGUodHJhbnNmZXJyZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJlIHNwZW50IGJ5IGEgc3BlY2lmaWVkIHNwZW5kZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBhcHByb3ZlIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYmUgc3BlbnQgYnkgYSBzcGVjaWZpZWQgc3BlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQXBwcm92ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhbmQgdGhlIGFwcHJvdmFsIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhcHByb3ZhbCB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHNwZW5kZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3BlbmRlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYXBwcm92ZSBmb3IgdGhlIHNwZW5kZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgYXBwcm92YWwgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGFwcHJvdmUoc3BlbmRlcjogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFwcHJvdmVcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuYXBwcm92ZSk7XG4gICAgY29uc3QgYXBwcm92ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkFwcHJvdmVcIiwgW1xuICAgICAgc3BlbmRlcixcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGFwcHJvdmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIGEgc3BlbmRlci5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgYWxsb3dhbmNlIG9mIEVSQzIwIHRva2VucyB0aGF0IHRoZSBzcGVjaWZpZWQgb3duZXIgaGFzIGFwcHJvdmVkIGZvciBhIHNwZW5kZXIuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkFsbG93YW5jZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBvd25lcidzIGFkZHJlc3MgYW5kIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIEVSQzIwIHRva2VuIG93bmVyLlxuICAgKiBAcGFyYW0gc3BlbmRlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYWxsb3dhbmNlKG93bmVyOiBzdHJpbmcsIHNwZW5kZXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFsbG93YW5jZVwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5hbGxvd2FuY2UpO1xuICAgIGNvbnN0IGFsbG93YW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQWxsb3dhbmNlXCIsIFtcbiAgICAgIG93bmVyLFxuICAgICAgc3BlbmRlcixcbiAgICBdKTtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZGVjb2RlKGFsbG93YW5jZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBwcm92aWRlZCB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBpbml0aWFsaXplIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBnaXZlbiB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiSW5pdGlhbGl6ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzZXJpYWxpemVkIHRva2VuIGRhdGEgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgRVJDMjAgdG9rZW4gaW5mb3JtYXRpb24gdG8gaW5pdGlhbGl6ZSB0aGUgY29udHJhY3Qgd2l0aC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSh0b2tlbjogRVJDMjBUb2tlbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJpbml0aWFsaXplXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IGluaXRpbGlhemVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJJbml0aWFsaXplXCIsXG4gICAgICBbRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHRva2VuKV1cbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGluaXRpbGlhemVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBFUkMyMCBjb250cmFjdCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHZlcmlmeSBpZiB0aGUgRVJDMjAgY29udHJhY3QgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNoZWNrSW5pdGlhbGl6ZWRcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBpbml0aWFsaXphdGlvbiBjaGVjayBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBjaGVja0luaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJjaGVja0luaXRpYWxpemVkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNoZWNrSW5pdGlhbGl6ZWQpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJDaGVja0luaXRpYWxpemVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbnRzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gbWludCBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJNaW50XCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIG1pbnRpbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IHVwZGF0ZXMgdGhlIG1pbnRlcidzIG51bWJlciBvZiB0b2tlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBtaW50LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWludGluZyBwcm9jZXNzIGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAgICovXG4gIGFzeW5jIG1pbnQoYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwibWludFwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5taW50KTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIk1pbnRcIiwgW2Ftb3VudC50b1N0cmluZygpXSk7XG4gIH1cblxuICAvKipcbiAgICogQnVybnMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIHRoZSBtaW50ZXIncyBhY2NvdW50LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gYnVybiBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJCdXJuXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIGJ1cm5pbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgbWludGVyJ3MgbnVtYmVyIG9mIHRva2Vucy5cbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJ1cm4uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBidXJuaW5nIHByb2Nlc3MgaXMgY29tcGxldGVkLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYnVybihhbW91bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJidXJuXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm4pO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQnVyblwiLCBbYW1vdW50LnRvU3RyaW5nKCldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJucyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIGZyb20gYSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGJ1cm4gYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIGEgZ2l2ZW4gYWNjb3VudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiQnVybkZyb21cIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgYWNjb3VudCdzIGFkZHJlc3MgYW5kIHRoZSBidXJuaW5nIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgc3BlY2lmaWVkIGFjY291bnQncyBudW1iZXIgb2YgdG9rZW5zLlxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIFRoZSBhZGRyZXNzIG9mIHRoZSBhY2NvdW50IGZyb20gd2hpY2ggdG8gYnVybiB0aGUgRVJDMjAgdG9rZW5zLlxuICAgKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYnVybi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1cm5pbmcgcHJvY2VzcyBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBidXJuRnJvbShhY2NvdW50OiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImJ1cm5Gcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm5Gcm9tKTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkJ1cm5Gcm9tXCIsIFtcbiAgICAgIGFjY291bnQsXG4gICAgICBhbW91bnQudG9TdHJpbmcoKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGJhbGFuY2Ugb2YgRVJDMjAgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50J3MgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIEVSQzIwIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNsaWVudEFjY291bnRCYWxhbmNlXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0LCB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGFueSBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiBFUkMyMCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQncyBhY2NvdW50LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgY2xpZW50QWNjb3VudEJhbGFuY2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudEJhbGFuY2VcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuY2xpZW50QWNjb3VudEJhbGFuY2UpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJDbGllbnRBY2NvdW50QmFsYW5jZVwiXG4gICAgKTtcblxuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoc2VyaWFsaXplZEFjY291bnRCYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjbGllbnQncyBhY2NvdW50IElEIGZyb20gdGhlIGJsb2NrY2hhaW4gbmV0d29yay5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBjbGllbnQncyBhY2NvdW50IElELlxuICAgKiBJdCBjYWxscyB0aGUgXCJDbGllbnRBY2NvdW50SURcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgcmV0dXJuZWQgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQgSUQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBjbGllbnRBY2NvdW50SUQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudElkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNsaWVudEFjY291bnRJRCk7XG4gICAgY29uc3QgY2xpZW50QWNjb3VudElEID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIkNsaWVudEFjY291bnRJRFwiXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmRlY29kZShjbGllbnRBY2NvdW50SUQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIFByaW1hcnlLZXlUeXBlIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBjb21wb3NlQXR0cmlidXRlVmFsdWUgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJZHM8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtb2RlbHM6IE0gfCBNW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdLFxuICBpZHM6IFByaW1hcnlLZXlUeXBlIHwgUHJpbWFyeUtleVR5cGVbXVxuKSB7XG4gIGxldCBwazoga2V5b2YgTTtcbiAgbGV0IGNvbXBvc2VkOiBhbnk7XG4gIGxldCBwa1Byb3BzOiBTZXF1ZW5jZU9wdGlvbnM7XG5cbiAgZnVuY3Rpb24gZXh0cmFjdElkKG06IE0gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpZHM6IFByaW1hcnlLZXlUeXBlKSB7XG4gICAgcGsgPSBwayB8fCBNb2RlbC5wayhjbGF6eik7XG4gICAgcGtQcm9wcyA9IHBrUHJvcHMgfHwgTW9kZWwuc2VxdWVuY2VGb3IoY2xhenopO1xuICAgIGNvbXBvc2VkID0gY29tcG9zZWQgfHwgTW9kZWwuY29tcG9zZWQoY2xhenosIHBrKTtcblxuICAgIGlmIChjb21wb3NlZCkge1xuICAgICAgcmV0dXJuIGNvbXBvc2VBdHRyaWJ1dGVWYWx1ZShtIGFzIGFueSwgY29tcG9zZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gKG0gYXMgYW55KVtwa10gfHwgaWRzO1xuICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgY291bGQgbm90IHJlYnVpbGQgaWQgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZGVscykpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRzKSB8fCBpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiaW5jb25zaXN0ZW50IHBhcmFtZXRlcnMuIGJvdGggbXVzdCBiZSBhcnJheXMgb2YgZXF1YWwgbGVuZ3RoXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIG1vZGVscy5tYXAoKG0sIGkpID0+IGV4dHJhY3RJZChtLCBpZHNbaV0pKTtcbiAgfVxuICByZXR1cm4gZXh0cmFjdElkKG1vZGVscywgaWRzIGFzIFByaW1hcnlLZXlUeXBlKTtcbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbCwgY29sdW1uLCBwayB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVzY3JpcHRpb24gfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSWRlbnRpdHkgY3JlZGVudGlhbCBtb2RlbCBzdG9yaW5nIGNyeXB0b2dyYXBoaWMgbWF0ZXJpYWxzXG4gKiBAc3VtbWFyeSBIb2xkcyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQgcHJpdmF0ZSBrZXkgaW5mb3JtYXRpb24gZm9yIGEgRmFicmljIGlkZW50aXR5LCBtYW5hZ2VkIGFzIGEgc2VwYXJhdGUgZW50aXR5IGxpbmtlZCBmcm9tIElkZW50aXR5XG4gKiBAcGFyYW0ge01vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+fSBbYXJnXSAtIE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIG9iamVjdCB1c2VkIHRvIHBvcHVsYXRlIG1vZGVsIGZpZWxkc1xuICogQGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgY3JlZGVudGlhbHMgZW50cnlcbiAqIGNvbnN0IGNyZWRzID0gbmV3IElkZW50aXR5Q3JlZGVudGlhbHMoeyBpZDogXCJjcmVkczFcIiwgY2VydGlmaWNhdGU6IFwiLi4uXCIsIHJvb3RDZXJ0aWZpY2F0ZTogXCIuLi5cIiwgcHJpdmF0ZUtleTogXCIuLi5cIiB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqICAgQXBwLT4+TW9kZWw6IG5ldyBJZGVudGl0eUNyZWRlbnRpYWxzKHsgaWQsIGNlcnRpZmljYXRlLCByb290Q2VydGlmaWNhdGUsIHByaXZhdGVLZXkgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICogQHNlZSBtb2RlbFxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHMgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcbiAgICogQHN1bW1hcnkgUHJpbWFyeSBrZXkgZm9yIHJlZmVyZW5jaW5nIHRoaXMgY3JlZGVudGlhbHMgZW50cnlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcIilcbiAgQGNvbHVtbigpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGUgZm9yIHRoZSBpZGVudGl0eVxuICAgKiBAc3VtbWFyeSBMZWFmIGNlcnRpZmljYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaWRlbnRpdHlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIFguNTA5IGNlcnRpZmljYXRlIGZvciB0aGUgaWRlbnRpdHlcIilcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIGNlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcm9vdCBvciBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUm9vdCBvZiB0cnVzdCB1c2VkIHRvIHZhbGlkYXRlIHRoZSBsZWFmIGNlcnRpZmljYXRlXG4gICAqL1xuICBAZGVzY3JpcHRpb24oXCJQRU0tZW5jb2RlZCByb290IG9yIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZVwiKVxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgcm9vdENlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgbWF0ZXJpYWxcbiAgICogQHN1bW1hcnkgUHJpdmF0ZSBrZXkgY29ycmVzcG9uZGluZyB0byB0aGUgaWRlbnRpdHkgY2VydGlmaWNhdGVcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIHByaXZhdGUga2V5XCIpXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBwcml2YXRlS2V5ITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5cyB1c2VkIHRvIG1hcmsgRmFicmljLXNwZWNpZmljIG1vZGVsIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBzcGVjaWFsIGtleXMgdXNlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBsYXllciB0byBwZXJzaXN0IEZhYnJpYy1yZWxhdGVkIGZsYWdzIG9uIG1vZGVsc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBGYWJyaWNNb2RlbEtleXMge1xuICAvKiogUHJpdmF0ZSBkYXRhIG1hcmtlciB1c2VkIHRvIHRhZyBwcm9wZXJ0aWVzIG9yIG1vZGVscyBmb3IgRmFicmljIHByaXZhdGUgY29sbGVjdGlvbnMgKi9cbiAgUFJJVkFURSA9IFwicHJpdmF0ZVwiLFxuICBTSEFSRUQgPSBcInNoYXJlZFwiLFxuICAvKiogTmFtZXNwYWNlIHByZWZpeCB1c2VkIGZvciBGYWJyaWMtc3BlY2lmaWMgbWV0YWRhdGEga2V5cyAqL1xuICBGQUJSSUMgPSBcImZhYnJpY1wiLFxuICBPV05FRF9CWSA9IFwib3duZWQtYnlcIixcbiAgVFJBTlNBQ1RJT05fSUQgPSBcInRyYW5zYWN0aW9uLWlkXCIsXG4gIE1JUlJPUiA9IFwibWlycm9yXCIsXG4gIENPTlRSQUNUID0gYCR7RmFicmljTW9kZWxLZXlzLkZBQlJJQ30uY29udHJhY3RgLFxuICBDSEFJTkNPREUgPSBgJHtGYWJyaWNNb2RlbEtleXMuRkFCUklDfS5jaGFpbmNvZGVgLFxuICBDSEFOTkVMID0gYCR7RmFicmljTW9kZWxLZXlzLkZBQlJJQ30uY2hhbm5lbGAsXG4gIE9WRVJSSURFUyA9IGBfX292ZXJyaWRlc2AsXG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgZm9yIEZhYnJpYyBjcmVkZW50aWFsc1xuICogQHN1bW1hcnkgRW51bWVyYXRpb24gb2YgaWRlbnRpdHkgZm9ybWF0cyByZWNvZ25pemVkIGJ5IHRoaXMgbGlicmFyeVxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVR5cGUge1xuICAvKiogU3RhbmRhcmQgWC41MDkgaWRlbnRpdHkgZm9ybWF0IHVzZWQgYnkgSHlwZXJsZWRnZXIgRmFicmljICovXG4gIFg1MDkgPSBcIlguNTA5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgRmFicmljIGFkYXB0ZXIgZmxhdm91clxuICogQHN1bW1hcnkgVXNlZCB0byB0YWcgYWRhcHRlcnMvcmVwb3NpdG9yaWVzIHRoYXQgb3BlcmF0ZSBhZ2FpbnN0IEh5cGVybGVkZ2VyIEZhYnJpY1xuICogQGNvbnN0IEZhYnJpY0ZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEZhYnJpY0ZsYXZvdXIgPSBcImhsZi1mYWJyaWNcIjtcbiIsImltcG9ydCB7XG4gIEJhc2VNb2RlbCxcbiAgQ2FzY2FkZSxcbiAgY29sdW1uLFxuICBpbmRleCxcbiAgb25lVG9PbmUsXG4gIHBrLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCB0eXBlIE1vZGVsQXJnLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IElkZW50aXR5Q3JlZGVudGlhbHMgfSBmcm9tIFwiLi9JZGVudGl0eUNyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGl0eSBtb2RlbCByZXByZXNlbnRpbmcgYSBGYWJyaWMgd2FsbGV0IGVudHJ5XG4gKiBAc3VtbWFyeSBFbmNhcHN1bGF0ZXMgYW4gaWRlbnRpdHkgc3RvcmVkIGluIGEgRmFicmljIHdhbGxldCwgaW5jbHVkaW5nIGl0cyBNU1AgaWRlbnRpZmllciwgY3JlZGVudGlhbCBsaW5rYWdlLCBhbmQgdHlwZSBpbmZvcm1hdGlvbi4gQnVpbHQgb24gQmFzZU1vZGVsIGZvciBpbnRlZ3JhdGlvbiB3aXRoIERlY2FmIHZhbGlkYXRpb24gYW5kIHBlcnNpc3RlbmNlLlxuICogQHBhcmFtIHtNb2RlbEFyZzxJZGVudGl0eT59IFthcmddIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgbW9kZWwgZmllbGRzXG4gKiBAY2xhc3MgSWRlbnRpdHlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgaWRlbnRpdHkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAqIGNvbnN0IGlkID0gbmV3IElkZW50aXR5KHsgaWQ6IFwidXNlcjFcIiwgbXNwSWQ6IFwiT3JnMU1TUFwiLCB0eXBlOiBJZGVudGl0eVR5cGUuWDUwOSB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5XG4gKiAgIEFwcC0+Pk1vZGVsOiBuZXcgSWRlbnRpdHkoeyBpZCwgbXNwSWQsIHR5cGUgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpdHkgaW4gdGhlIHdhbGxldFxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGlkZW50aXR5IHJlY29yZFxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlkZW50aXR5XCIpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGluayB0byB0aGUgaWRlbnRpdHkgY3JlZGVudGlhbHMgc3RvcmVkIHNlcGFyYXRlbHlcbiAgICogQHN1bW1hcnkgT25lLXRvLW9uZSByZWxhdGlvbnNoaXAgdG8gdGhlIGNyZWRlbnRpYWxzIGVudGl0eTsgY2FzY2FkZXMgb24gdXBkYXRlIGFuZCBkZWxldGVcbiAgICovXG4gIEBvbmVUb09uZShJZGVudGl0eUNyZWRlbnRpYWxzLCB7XG4gICAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gICAgZGVsZXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIH0pXG4gIGNyZWRlbnRpYWxzITogSWRlbnRpdHlDcmVkZW50aWFscztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFRoZSBNU1AgSUQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JnYW5pemF0aW9uIHRoYXQgaXNzdWVkIHRoaXMgaWRlbnRpdHlcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBtc3BJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgb2YgaWRlbnRpdHlcbiAgICogQHN1bW1hcnkgSW5kaWNhdGVzIHRoZSBpZGVudGl0eSBlbmNvZGluZy9mb3JtYXQ7IGRlZmF1bHRzIHRvIFguNTA5XG4gICAqL1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgdHlwZTogSWRlbnRpdHlUeXBlID0gSWRlbnRpdHlUeXBlLlg1MDk7XG5cbiAgY29uc3RydWN0b3IoYXJnOiBNb2RlbEFyZzxJZGVudGl0eT4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBDcnlwdG9TZXR0aW5nLCBJQ3J5cHRvU3VpdGUsIFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSFNNT3B0aW9ucyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IGNyeXB0bywgeyBYNTA5Q2VydGlmaWNhdGUgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBYNTA5Q2VydGlmaWNhdGUgYXMgWDUwOUNlcnQgfSBmcm9tIFwiQHBlY3VsaWFyL3g1MDlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSB1dGlsaXRpZXMgZm9yIGludGVyYWN0aW5nIHdpdGggZmlsZXMsIGNyeXB0byBpZGVudGl0aWVzLCBhbmQgRmFicmljIFNESyBoZWxwZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBzdGF0aWMgaGVscGVyIG1ldGhvZHMgdG8gcmVhZCBjcmVkZW50aWFscyBhbmQga2V5cyBmcm9tIGRpc2sgb3IgcmF3IGNvbnRlbnQsIGNvbnN0cnVjdCBGYWJyaWMgZ2F0ZXdheSBJZGVudGl0aWVzIGFuZCBTaWduZXJzLCBhbmQgcGVyZm9ybSBjb21tb24gZmlsZXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIEZhYnJpYyBjbGllbnQgdG9vbGluZy5cbiAqIEBjbGFzcyBDb3JlVXRpbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWFkIGFuIGlkZW50aXR5IGFuZCBzaWduZXIgZnJvbSBkaXJlY3Rvcmllc1xuICogY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0SWRlbnRpdHkoJ09yZzFNU1AnLCAnL21zcC9zaWduY2VydHMnKTtcbiAqIGNvbnN0IHNpZ25lciA9IGF3YWl0IENvcmVVdGlscy5nZXRTaWduZXIoJy9tc3Ava2V5c3RvcmUnKTtcbiAqIC8vIEJ1aWxkIGEgQ0EgdXNlclxuICogY29uc3QgdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoJ2FwcFVzZXInLCBwZW1LZXksIHBlbUNlcnQsICdPcmcxTVNQJyk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyBsb2dnZXI6IExvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENvcmVVdGlscy5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyBjcnlwdG9TdWl0ZTogSUNyeXB0b1N1aXRlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZSBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIHJhdyBjb250ZW50XG4gICAqIEBzdW1tYXJ5IElmIHRoZSBpbnB1dCBpcyBhIFVpbnQ4QXJyYXkgb3IgUEVNIGNvbnRlbnQsIHJldHVybnMgaXQgYXMtaXM7IG90aGVyd2lzZSB1c2VzIGEgcHJvdmlkZWQgYXN5bmMgZmlsZVJlYWRlciB0byBsb2FkIHRoZSBjb250ZW50IGZyb20gZGlzay5cbiAgICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIEVpdGhlciBhIHJhdyBjb250ZW50IGJ1ZmZlci9zdHJpbmcgb3IgYSBmaWxlc3lzdGVtIHBhdGhcbiAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiBQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IGZpbGVSZWFkZXIgLSBBc3luYyBmdW5jdGlvbiB0byByZWFkIGZpbGUgY29udGVudCB3aGVuIGEgcGF0aCBpcyBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBjb250ZW50IHRvIGJlIHVzZWQgZG93bnN0cmVhbVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4gICkge1xuICAgIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gICAgaWYgKFxuICAgICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIEJ1ZmZlclxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIHRoYXQgbG9hZHMgYSBmaWxlIHVzaW5nIGZzLnByb21pc2VzIHdoZW4gYSBwYXRoIHN0cmluZyBpcyBwcm92aWRlZDsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGdpdmVuIEJ1ZmZlciBkaXJlY3RseS5cbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBjb250ZW50T3JQYXRoIC0gUGF0aCB0byBhIGZpbGUgb24gZGlzayBvciBhbiBhbHJlYWR5LWxvYWRlZCBCdWZmZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmd8VWludDhBcnJheXxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyL3N0cmluZyBkZXBlbmRpbmcgb24gcmVhZGVyXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgRmFicmljIENBIFVzZXIgb2JqZWN0IHdpdGggZW5yb2xsbWVudFxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZmFicmljLWNvbW1vbiBVc2VyLCBzZXRzIGEgY3J5cHRvIHN1aXRlLCBpbXBvcnRzIHRoZSBwcm92aWRlZCBwcml2YXRlIGtleSwgYW5kIHNldHMgZW5yb2xsbWVudCB3aXRoIGNlcnRpZmljYXRlIGFuZCBNU1AgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWUgZm9yIHRoZSBDQSB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gVGhlIGVucm9sbGVkIEZhYnJpYyBVc2VyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q0FVc2VyKFxuICAgIHVzZXJOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBoc20/OiBIU01PcHRpb25zIH1cbiAgKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBzdHJpbmdGb3JtYXQoXG4gICAgICAgIFwiQ3JlYXRpbmcgQ0EgezB9IHVzZXIgezF9IHdpdGggY2VydGlmaWNhdGUgezJ9XCIsXG4gICAgICAgIG1zcElkLFxuICAgICAgICB1c2VyTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGVcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IHtcbiAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgbGliOiBvcHRpb25zLmhzbS5saWJyYXJ5LFxuICAgICAgICAgIHNsb3Q6IG9wdGlvbnMuaHNtLnNsb3QsXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbnMuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgcGluOiBTdHJpbmcob3B0aW9ucy5oc20ucGluKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3J5cHRvU3VpdGUgPSB0aGlzLmdldENyeXB0b1N1aXRlKGNvbmZpZyk7XG5cbiAgICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgICBjb25zdCBlbnJvbGxtZW50S2V5ID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SFNNRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgY2VydGlmaWNhdGUsIG9wdGlvbnMuaHNtKVxuICAgICAgOiB0aGlzLmdldFNvZnR3YXJlRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgcHJpdmF0ZUtleSk7XG4gICAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGVucm9sbG1lbnRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q3J5cHRvU3VpdGUob3B0aW9ucz86IENyeXB0b1NldHRpbmcpOiBJQ3J5cHRvU3VpdGUge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgICBpZiAoQ29yZVV0aWxzLmNyeXB0b1N1aXRlKSByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuXG4gICAgQ29yZVV0aWxzLmNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZShvcHRpb25zKTtcbiAgICByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5KFxuICAgIGNyeXB0b1N1aXRlOiBhbnksXG4gICAgcHJpdmF0ZUtleT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQcml2YXRlIGtleSBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gSFNNIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBsaWVkXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2V0SFNNRW5yb2xsbWVudEtleShcbiAgICBjcnlwdG9TdWl0ZTogYW55LFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgaHNtOiBIU01PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHNraSA9XG4gICAgICBoc20ua2V5SWRIZXggJiYgaHNtLmtleUlkSGV4LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gQnVmZmVyLmZyb20oaHNtLmtleUlkSGV4LCBcImhleFwiKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2VydGlmaWNhdGVTS0koY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1aXRlLmdldEtleShza2kpO1xuICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5LmlzUHJpdmF0ZSA9PT0gXCJmdW5jdGlvblwiICYmICFrZXkuaXNQcml2YXRlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmVzb2x2ZSBwcml2YXRlIGtleSBmcm9tIEhTTVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRDZXJ0aWZpY2F0ZVNLSShjZXJ0aWZpY2F0ZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCB4NTA5ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgandrID0geDUwOS5wdWJsaWNLZXkuZXhwb3J0KHsgZm9ybWF0OiBcImp3a1wiIH0pO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDA0XSk7XG4gICAgY29uc3QgeCA9IEJ1ZmZlci5mcm9tKGp3ay54IHx8IFwiXCIsIFwiYmFzZTY0dXJsXCIpO1xuICAgIGNvbnN0IHkgPSBCdWZmZXIuZnJvbShqd2sueSB8fCBcIlwiLCBcImJhc2U2NHVybFwiKTtcbiAgICByZXR1cm4gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtwcmVmaXgsIHgsIHldKSlcbiAgICAgIC5kaWdlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgYSBGYWJyaWMgR2F0ZXdheSBJZGVudGl0eSBmcm9tIGFuIE1TUCBJRCBhbmQgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUmVhZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IHBhdGggb3IgYWNjZXB0cyByYXcgY29udGVudCBhbmQgcmV0dXJucyBhbiBJZGVudGl0eSBvYmplY3Qgc3VpdGFibGUgZm9yIHRoZSBGYWJyaWMgR2F0ZXdheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUgZmlsZSwgb3IgUEVNIGNvbnRlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBpZGVudGl0eSBjb250YWluaW5nIG1zcElkIGFuZCBjZXJ0aWZpY2F0ZSBjcmVkZW50aWFsc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldElkZW50aXR5KFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgdGhpcy5nZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IHRoaXMuY29udGVudE9mTG9hZEZpbGUoXG4gICAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCB0aGlzLmdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgdGhpcy5jb250ZW50T2ZMb2FkRmlsZShcbiAgICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgICBzaWduZXJGaWxlUmVhZGVyXG4gICAgKSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLmV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGNvbnN0IGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICAgIC8vIC0tXG5cbiAgICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gICAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gICAgbGV0IHN1YnRsZTogYW55O1xuICAgIGlmIChcbiAgICAgIChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93ICYmXG4gICAgICAoKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cgYXMgeyBDcnlwdG86IGFueSB9KS5DcnlwdG9cbiAgICApIHtcbiAgICAgIHN1YnRsZSA9ICgoZ2xvYmFsVGhpcyBhcyBhbnkpLkNyeXB0byBhcyBhbnkpLnN1YnRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICAgIH1cblxuICAgIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gICAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHIgPSBwZW1cbiAgICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGNlcnRpZmljYXRlIFNlcmlhbCBOdW1iZXIgYW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcilcbiAqIGluIHRoZSBmb3JtYXQgRmFicmljIENBIGV4cGVjdHMgKHBsYWluIGhleCwgbm8gY29sb25zKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGNlcnQ6IHN0cmluZyk6IHtcbiAgYWtpOiBzdHJpbmc7XG4gIHNlcmlhbDogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHg1MDlDZXJ0aWZpY2F0ZSA9IG5ldyBYNTA5Q2VydChjZXJ0KTtcblxuICAvLyBGaW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcikgZXh0ZW5zaW9uIGJ5IGl0cyBPSUQ6IDIuNS4yOS4zNVxuICBjb25zdCBha2lFeHQgPSB4NTA5Q2VydGlmaWNhdGUuZXh0ZW5zaW9ucz8uZmluZChcbiAgICAoZSkgPT4gZS50eXBlID09PSBcIjIuNS4yOS4zNVwiXG4gICk7XG4gIGlmICghYWtpRXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdXRob3JpdHkgS2V5IElkZW50aWZpZXIgKEFLSSkgZXh0ZW5zaW9uIG5vdCBmb3VuZCBpbiBjZXJ0aWZpY2F0ZS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBha2lFeHQudmFsdWUgaXMgdGhlIGV4dGVuc2lvbiBjb250ZW50IGluIERFUiBieXRlcy4gQ29udmVydCBpdCB0byBhIGhleCBzdHJpbmcuXG4gIGxldCBha2kgPSBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShha2lFeHQudmFsdWUpKVxuICAgIC50b1N0cmluZyhcImhleFwiKVxuICAgIC50b1VwcGVyQ2FzZSgpO1xuXG4gIC8qKlxuICAgKiBDb21tb24gY2FzZTpcbiAgICogVGhlIERFUi1lbmNvZGVkIEFLSSBleHRlbnNpb24gb2Z0ZW4gc3RhcnRzIHdpdGg6XG4gICAqICAgMzAgMTYgODAgMTQgPDIwLWJ5dGUga2V5SWRlbnRpZmllcj5cbiAgICogSW4gaGV4LCB0aGF0J3MgXCIzMDE2ODAxNFwiICsgNDAgaGV4IGNoYXJzICgyMCBieXRlcykuXG4gICAqXG4gICAqIEZhYnJpYyBDQSBleHBlY3RzIE9OTFkgdGhlIDIwLWJ5dGUga2V5SWRlbnRpZmllciAoNDAgaGV4IGNoYXJzKSxcbiAgICogc28gd2Ugc3RyaXAgdGhlIFwiMzAxNjgwMTRcIiBwcmVmaXggd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgaWYgKGFraS5zdGFydHNXaXRoKFwiMzAxNjgwMTRcIikgJiYgYWtpLmxlbmd0aCA+PSA4ICsgNDApXG4gICAgYWtpID0gYWtpLnNsaWNlKDgsIDggKyA0MCk7XG5cbiAgcmV0dXJuIHsgYWtpLCBzZXJpYWw6IHg1MDlDZXJ0aWZpY2F0ZS5zZXJpYWxOdW1iZXIgfTtcbn1cbiIsImltcG9ydCAqIGFzIHg1MDkgZnJvbSBcIkBwZWN1bGlhci94NTA5XCI7XG5pbXBvcnQgeyBDcnlwdG8sIENyeXB0b0tleSB9IGZyb20gXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCI7XG5pbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3QgY3J5cHRvID0gbmV3IENyeXB0bygpO1xueDUwOS5jcnlwdG9Qcm92aWRlci5zZXQoY3J5cHRvKTtcblxuZXhwb3J0IGVudW0gQkFTRV9BTFBIQUJFVCB7XG4gIEJBU0UyID0gXCIwMVwiLFxuICBCQVNFOCA9IFwiMDEyMzQ1NjdcIixcbiAgQkFTRTExID0gXCIwMTIzNDU2Nzg5YVwiLFxuICBCQVNFMTYgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIixcbiAgQkFTRTMyID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWlwiLFxuICBCQVNFMzJfWiA9IFwieWJuZHJmZzhlamttY3BxeG90MXV3aXN6YTM0NWg3NjlcIixcbiAgQkFTRTM2ID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIixcbiAgQkFTRTU4ID0gXCIxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6XCIsXG4gIEJBU0U2MiA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcIixcbiAgQkFTRTY0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsXG4gIEJBU0U2NyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXy4hflwiLFxufVxuXG5leHBvcnQgdHlwZSBrZXlPYmplY3QgPSB7XG4gIGl2OiBBcnJheUJ1ZmZlcjtcbiAga2V5OiBDcnlwdG9LZXk7XG59O1xuXG5leHBvcnQgZW51bSBDUllQVE8ge1xuICBIQVNIID0gXCJTSEEtMjU2XCIsXG4gIElURVJBVElPTlMgPSAxMDAwLFxuICBLRVlMRU5HVEggPSA0OCxcbiAgREVSSVZFRF9JVl9MRU5HVEggPSAxNixcbiAgREVSSVZFRF9LRVlfTEVOR1RIID0gMzIsIC8vIEJlY2F1c2UgU0hBLTI1NiB1c2VkIGhhcyBhIG5hdGl2ZSBzaXplIG9mIDMyIGJ5dGVzXG4gIEFMR09SWVRITSA9IFwiQUVTLUdDTVwiLFxuICBLRVlfQUxHT1JZVEhNID0gXCJQQktERjJcIixcbn1cblxuZXhwb3J0IGNsYXNzIEJhc2VFbmNvZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlTWFwOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaUZhY3RvcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWxwaGFiZXQ6IEJBU0VfQUxQSEFCRVQpIHtcbiAgICBpZiAodGhpcy5hbHBoYWJldC5sZW5ndGggPj0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoXCJBbHBoYWJldCB0b28gbG9uZ1wiKTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5iYXNlTWFwLmxlbmd0aDsgaisrKSB0aGlzLmJhc2VNYXBbal0gPSAyNTU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gYWxwaGFiZXQuY2hhckF0KGkpO1xuICAgICAgY29uc3QgeGMgPSB4LmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAodGhpcy5iYXNlTWFwW3hjXSAhPT0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoeCArIFwiIGlzIGFtYmlndW91c1wiKTtcblxuICAgICAgdGhpcy5iYXNlTWFwW3hjXSA9IGk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXNlID0gdGhpcy5hbHBoYWJldC5sZW5ndGg7XG4gICAgdGhpcy5sZWFkZXIgPSB0aGlzLmFscGhhYmV0LmNoYXJBdCgwKTtcbiAgICB0aGlzLmZhY3RvciA9IE1hdGgubG9nKHRoaXMuYmFzZSkgLyBNYXRoLmxvZygyNTYpOyAvLyBsb2coQkFTRSkgLyBsb2coMjU2KSwgcm91bmRlZCB1cFxuICAgIHRoaXMuaUZhY3RvciA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyh0aGlzLmJhc2UpOyAvLyBsb2coMjU2KSAvIGxvZyhCQVNFKSwgcm91bmRlZCB1cFxuICB9XG5cbiAgZW5jb2RlKHNvdXJjZTogVWludDhBcnJheSB8IERhdGFWaWV3IHwgYW55W10gfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgc291cmNlID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBuZXcgVWludDhBcnJheShcbiAgICAgICAgc291cmNlLmJ1ZmZlcixcbiAgICAgICAgc291cmNlLmJ5dGVPZmZzZXQsXG4gICAgICAgIHNvdXJjZS5ieXRlTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBVaW50OEFycmF5LmZyb20oc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAvLyBTa2lwICYgY291bnQgbGVhZGluZyB6ZXJvZXMuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IHBiZWdpbiA9IDA7XG4gICAgY29uc3QgcGVuZCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCAmJiBzb3VyY2VbcGJlZ2luXSA9PT0gMCkge1xuICAgICAgcGJlZ2luKys7XG4gICAgICB6ZXJvZXMrKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTU4IHJlcHJlc2VudGF0aW9uLlxuICAgIGNvbnN0IHNpemUgPSAoKHBlbmQgLSBwYmVnaW4pICogdGhpcy5pRmFjdG9yICsgMSkgPj4+IDA7XG4gICAgY29uc3QgYjU4ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgYnl0ZXMuXG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCkge1xuICAgICAgbGV0IGNhcnJ5ID0gc291cmNlW3BiZWdpbl07XG4gICAgICAvLyBBcHBseSBcImI1OCA9IGI1OCAqIDI1NiArIGNoXCIuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQxID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDEgIT09IC0xO1xuICAgICAgICBpdDEtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKDI1NiAqIGI1OFtpdDFdKSA+Pj4gMDtcbiAgICAgICAgYjU4W2l0MV0gPSBjYXJyeSAlIHRoaXMuYmFzZSA+Pj4gMDtcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyB0aGlzLmJhc2UpID4+PiAwO1xuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJOb24temVybyBjYXJyeVwiKTtcblxuICAgICAgbGVuZ3RoID0gaTtcbiAgICAgIHBiZWdpbisrO1xuICAgIH1cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzIGluIGJhc2U1OCByZXN1bHQuXG4gICAgbGV0IGl0MiA9IHNpemUgLSBsZW5ndGg7XG4gICAgd2hpbGUgKGl0MiAhPT0gc2l6ZSAmJiBiNThbaXQyXSA9PT0gMCkgaXQyKys7XG5cbiAgICAvLyBUcmFuc2xhdGUgdGhlIHJlc3VsdCBpbnRvIGEgc3RyaW5nLlxuICAgIGxldCBzdHIgPSB0aGlzLmxlYWRlci5yZXBlYXQoemVyb2VzKTtcbiAgICBmb3IgKDsgaXQyIDwgc2l6ZTsgKytpdDIpIHtcbiAgICAgIHN0ciArPSB0aGlzLmFscGhhYmV0LmNoYXJBdChiNThbaXQyXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZVVuc2FmZShzb3VyY2U6IHN0cmluZyk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICBsZXQgcHN6ID0gMDtcbiAgICAvLyBTa2lwIGFuZCBjb3VudCBsZWFkaW5nICcxJ3MuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKHNvdXJjZVtwc3pdID09PSB0aGlzLmxlYWRlcikge1xuICAgICAgemVyb2VzKys7XG4gICAgICBwc3orKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTI1NiByZXByZXNlbnRhdGlvbi5cbiAgICBjb25zdCBzaXplID0gKChzb3VyY2UubGVuZ3RoIC0gcHN6KSAqIHRoaXMuZmFjdG9yICsgMSkgPj4+IDA7IC8vIGxvZyg1OCkgLyBsb2coMjU2KSwgcm91bmRlZCB1cC5cbiAgICBjb25zdCBiMjU2ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgY2hhcmFjdGVycy5cbiAgICB3aGlsZSAoc291cmNlW3Bzel0pIHtcbiAgICAgIC8vIERlY29kZSBjaGFyYWN0ZXJcbiAgICAgIGxldCBjYXJyeSA9IHRoaXMuYmFzZU1hcFtzb3VyY2UuY2hhckNvZGVBdChwc3opXTtcbiAgICAgIC8vIEludmFsaWQgY2hhcmFjdGVyXG4gICAgICBpZiAoY2FycnkgPT09IDI1NSkgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQzID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDMgIT09IC0xO1xuICAgICAgICBpdDMtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKHRoaXMuYmFzZSAqIGIyNTZbaXQzXSkgPj4+IDA7XG4gICAgICAgIGIyNTZbaXQzXSA9IGNhcnJ5ICUgMjU2ID4+PiAwO1xuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIDI1NikgPj4+IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuXG4gICAgICBsZW5ndGggPSBpO1xuICAgICAgcHN6Kys7XG4gICAgfVxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYjI1Ni5cbiAgICBsZXQgaXQ0ID0gc2l6ZSAtIGxlbmd0aDtcbiAgICB3aGlsZSAoaXQ0ICE9PSBzaXplICYmIGIyNTZbaXQ0XSA9PT0gMCkgaXQ0Kys7XG5cbiAgICBjb25zdCB2Y2ggPSBuZXcgVWludDhBcnJheSh6ZXJvZXMgKyAoc2l6ZSAtIGl0NCkpO1xuICAgIGxldCBqID0gemVyb2VzO1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUpIHZjaFtqKytdID0gYjI1NltpdDQrK107XG5cbiAgICByZXR1cm4gdmNoO1xuICB9XG5cbiAgZGVjb2RlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5kZWNvZGVVbnNhZmUoc291cmNlKTtcbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gYnVmZmVyO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi1iYXNlXCIgKyB0aGlzLmJhc2UgKyBcIiBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyeXB0b1V0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYjU4ZW5jb2RlciA9IG5ldyBCYXNlRW5jb2RlcihCQVNFX0FMUEhBQkVULkJBU0U1OCk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENyeXB0b1V0aWxzLm5hbWUpO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGU6IHN0cmluZykge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKHN0cmluZ0Zvcm1hdChcIlBhcnNpbmcgY2VydGlmaWNhdGU6IHswfVwiLCBjZXJ0aWZpY2F0ZSkpO1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IHsgc3ViamVjdCwgaXNzdWVyIH0gPSBjZXJ0O1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgc3RyaW5nRm9ybWF0KFxuICAgICAgICBcIkNlcnRpZmljYXRlIHBhcnNlZCB3aXRoIHN1YmplY3QgezB9IGFuZCBpc3N1ZXIgezF9XCIsXG4gICAgICAgIHN1YmplY3QsXG4gICAgICAgIGlzc3VlclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGB4NTA5OjovJHtzdWJqZWN0LnJlcGxhY2VBbGwoXCIsIFwiLCBcIi9cIil9OjovJHtpc3N1ZXIucmVwbGFjZUFsbChcIiwgXCIsIFwiL1wiKX1gO1xuICB9XG5cbiAgc3RhdGljIGVuY29kZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYjU4ZW5jb2Rlci5lbmNvZGUoc3RyKTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5iNThlbmNvZGVyLmRlY29kZShzdHIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkZWNvZGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZXh0cmFjdEtleShcbiAgICB0eXBlOiBcInByaXZhdGVcIiB8IFwicHVibGljXCIsXG4gICAgcGVtOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgdXNhZ2VzPzogYW55W11cbiAgKSB7XG4gICAgY29uc3Qgc3VidGxlID0gY3J5cHRvLnN1YnRsZTtcblxuICAgIGNvbnN0IHN0ciA9IHBlbVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYC0tLS0tQkVHSU4gKCR7dHlwZS50b1VwcGVyQ2FzZSgpfSBLRVl8Q0VSVElGSUNBVEUpLS0tLS1gKSxcbiAgICAgICAgXCJcIlxuICAgICAgKVxuICAgICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICBuZXcgUmVnRXhwKGAtLS0tLUVORCAoJHt0eXBlLnRvVXBwZXJDYXNlKCl9IEtFWXxDRVJUSUZJQ0FURSktLS0tLWApLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHRoaXMuc3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgdXNhZ2VzID8gdXNhZ2VzIDogW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwcml2YXRlXCIsIHBlbSwgdXNhZ2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBleHRyYWN0UHVibGljS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwdWJsaWNcIiwgcGVtLCB1c2FnZXMpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNpZ24ocHJpdmF0ZUtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgYnVmZiA9IChhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24oXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgaGFzaDogXCJTSEEtMjU2XCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApKSBhcyBBcnJheUJ1ZmZlcjtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdmVyaWZ5KFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgZGF0YTogQnVmZmVyIHwgc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNlcnQucHVibGljS2V5LmV4cG9ydCgpO1xuICAgIHNpZ25hdHVyZSA9IChcbiAgICAgIHR5cGVvZiBzaWduYXR1cmUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShzaWduYXR1cmUsIFwiaGV4XCIpIDogc2lnbmF0dXJlXG4gICAgKSBhcyBCdWZmZXI7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIHJldHVybiBjcnlwdG8uc3VidGxlLnZlcmlmeShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBoYXNoOiBcIlNIQS0yNTZcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBzaWduYXR1cmUgYXMgYW55LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHQoY2VydGlmaWNhdGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2VydC5wdWJsaWNLZXkuZXhwb3J0KCk7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IGJ1ZmYgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmVuY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRTdWJ0bGVDcnlwdG8oKSB7XG4gICAgcmV0dXJuIGlzQnJvd3NlcigpXG4gICAgICA/IChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93LmNyeXB0by5zdWJ0bGVcbiAgICAgIDogY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWNyeXB0KHByaXZhdGVLZXk6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICBkYXRhID0gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLCBcImhleFwiKSA6IGRhdGFcbiAgICApIGFzIEJ1ZmZlcjtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZWNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgYSByYW5kb20gbWFzdGVyIGtleVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb24gSWYgZGF0YSBpcyBub3QgcGFzc2VkLCBhIHJhbmRvbSBBcnJheUJ1ZmZlciB3aWxsIGJlIGdlbmVyYXRlZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBkYXRhIGVuY3J5dGlvbiBkYXRhXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRNYXN0ZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRNYXN0ZXIoZGF0YT86IEFycmF5QnVmZmVyKTogUHJvbWlzZTxrZXlPYmplY3Q+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGdlbkdlbmVzaXMgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgZGF0YSA9IHRleHRFbmNvZGVyLmVuY29kZShnZW5HZW5lc2lzKS5idWZmZXI7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkYXRhLFxuICAgICAgQ1JZUFRPLktFWV9BTEdPUllUSE0gYXMgc3RyaW5nLFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJkZXJpdmVCaXRzXCJdXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGltcG9ydGVkS2V5LFxuICAgICAgaXY6IGRhdGEhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBrZXkgZnJvbSBhbm90aGVyIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2FsdFxuICAgKiBAcGFyYW0ge0NyeXB0b0tleX0ga2V5IE9yaWdpbmFsIGtleVxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0RGVyaXZhdGlvbktleVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldERlcml2YXRpb25LZXkoc2FsdDogc3RyaW5nLCBrZXk6IENyeXB0b0tleSkge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3Qgc2FsdEJ1ZmZlciA9IHRleHRFbmNvZGVyLmVuY29kZShzYWx0KTtcbiAgICBjb25zdCBzYWx0SGFzaGVkID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kaWdlc3QoXG4gICAgICBcIlNIQS0yNTZcIixcbiAgICAgIHNhbHRCdWZmZXJcbiAgICApO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG5hbWU6IENSWVBUTy5LRVlfQUxHT1JZVEhNIGFzIHN0cmluZyxcbiAgICAgIGhhc2g6IENSWVBUTy5IQVNILFxuICAgICAgc2FsdDogc2FsdEhhc2hlZCxcbiAgICAgIGl0ZXJhdGlvbnM6IENSWVBUTy5JVEVSQVRJT05TLFxuICAgIH07XG4gICAgY29uc3QgZGVyaXZhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVyaXZlQml0cyhcbiAgICAgIHBhcmFtcyxcbiAgICAgIGtleSxcbiAgICAgIENSWVBUTy5LRVlMRU5HVEggKiA4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRLZXkoZGVyaXZhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgdGhlIGtleSBhbmQgSVYgZnJvbSB0aGUgQ3J5dG9LZXkgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gZGVyaXZhdGlvblxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0S2V5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0S2V5KGRlcml2YXRpb246IEFycmF5QnVmZmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IGl2bGVuID0gMTY7XG4gICAgY29uc3Qga2V5bGVuID0gMzI7XG4gICAgY29uc3QgZGVyaXZlZEtleSA9IGRlcml2YXRpb24uc2xpY2UoMCwga2V5bGVuKTtcbiAgICBjb25zdCBpdiA9IGRlcml2YXRpb24uc2xpY2Uoa2V5bGVuKTtcbiAgICBjb25zdCBpbXBvcnRlZEVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkZXJpdmVkS2V5LFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZyB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaW1wb3J0ZWRFbmNyeXB0aW9uS2V5LFxuICAgICAgaXY6IGl2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZWNyeXB0IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHBhcmFtIHtrZXlPYmplY3R9IGtleU9iamVjdFxuICAgKlxuICAgKiBAZnVuY3Rpb24gZW5jcnlwdFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHRQaW4oXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtleU9iamVjdDoga2V5T2JqZWN0XG4gICk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IHRleHRCdWZmZXIgPSB0ZXh0RW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gICAgY29uc3QgZW5jcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICB0ZXh0QnVmZmVyXG4gICAgKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkVGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlY3J5cHQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlclNvdXJjZX0gZW5jcnlwdGVkVGV4dFxuICAgKiBAcGFyYW0ge2tleU9iamVjdH0ga2V5T2JqZWN0XG4gICAqXG4gICAqIEBmdW5jdGlvbiBkZWNyeXB0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVjcnlwdFBpbihcbiAgICBlbmNyeXB0ZWRUZXh0OiBBcnJheUJ1ZmZlcixcbiAgICBrZXlPYmplY3Q6IGtleU9iamVjdFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgZGVjcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICBlbmNyeXB0ZWRUZXh0XG4gICAgKTtcbiAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZFRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgRmFicmljQ0FTZXJ2aWNlcyBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJZGVudGl0eVNlcnZpY2UsXG4gIElFbnJvbGxSZXNwb25zZSxcbiAgSVJlZ2lzdGVyUmVxdWVzdCxcbiAgSVNlcnZpY2VSZXNwb25zZSxcbiAgVExTT3B0aW9ucyxcbn0gZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL21vZGVsL0lkZW50aXR5XCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29yZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDQV9ST0xFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuLi9jcnlwdG9cIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlUmVzcG9uc2UsXG4gIEZhYnJpY0lkZW50aXR5LFxuICBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICBJZGVudGl0eVJlc3BvbnNlLFxufSBmcm9tIFwiLi4vLi4vc2hhcmVkL2ZhYnJpYy10eXBlc1wiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSHlwZXJsZWRnZXIgRmFicmljIENBIGlkZW50aXR5IHR5cGVzLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUgc3VwcG9ydGVkIGlkZW50aXR5IHR5cGVzIHJlY29nbml6ZWQgYnkgRmFicmljIENBIGZvciByZWdpc3RyYXRpb24gYW5kIGlkZW50aXR5IG1hbmFnZW1lbnQuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIEhGQ0FJZGVudGl0eVR5cGUge1xuICBQRUVSID0gXCJwZWVyXCIsXG4gIE9SREVSRVIgPSBcIm9yZGVyZXJcIixcbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbiAgVVNFUiA9IFwidXNlclwiLFxuICBBRE1JTiA9IFwiYWRtaW5cIixcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleS92YWx1ZSBhdHRyaWJ1dGUgdXNlZCBkdXJpbmcgQ0EgcmVnaXN0cmF0aW9uLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBhdHRyaWJ1dGUgZW50cnkgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBGYWJyaWMgQ0EgaWRlbnRpdHkgZHVyaW5nIHJlZ2lzdHJhdGlvbiwgb3B0aW9uYWxseSBtYXJraW5nIGl0IGZvciBpbmNsdXNpb24gaW4gZWNlcnQuXG4gKiBAaW50ZXJmYWNlIElLZXlWYWx1ZUF0dHJpYnV0ZVxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBBdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtlY2VydF0gLSBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBlbnJvbGxtZW50IGNlcnRpZmljYXRlIChFQ2VydCkuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUtleVZhbHVlQXR0cmlidXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBlY2VydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YW5kYXJkIEZhYnJpYyBDQSBpZGVudGl0eSBhdHRyaWJ1dGUga2V5cy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0ZXMgd2VsbC1rbm93biBGYWJyaWMgQ0EgYXR0cmlidXRlIGtleXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyBmb3IgZGVsZWdhdGlvbnMgYW5kIHBlcm1pc3Npb25zLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgZW51bSBIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIHtcbiAgSEZSRUdJU1RSQVJST0xFUyA9IFwiaGYuUmVnaXN0cmFyLlJvbGVzXCIsXG4gIEhGUkVHSVNUUkFSREVMRUdBVEVST0xFUyA9IFwiaGYuUmVnaXN0cmFyLkRlbGVnYXRlUm9sZXNcIixcbiAgSEZSRUdJU1RSQVJBVFRSSUJVVEVTID0gXCJoZi5SZWdpc3RyYXIuQXR0cmlidXRlc1wiLFxuICBIRklOVEVSTUVESUFURUNBID0gXCJoZi5JbnRlcm1lZGlhdGVDQVwiLFxuICBIRlJFVk9LRVIgPSBcImhmLlJldm9rZXJcIixcbiAgSEZBRkZJTElBVElPTk1HUiA9IFwiaGYuQWZmaWxpYXRpb25NZ3JcIixcbiAgSEZHRU5DUkwgPSBcImhmLkdlbkNSTFwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXJ2aWNlIHdyYXBwZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBGYWJyaWMgQ0EuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBoaWdoLWxldmVsIG9wZXJhdGlvbnMgZm9yIG1hbmFnaW5nIGlkZW50aXRpZXMgYWdhaW5zdCBhIEh5cGVybGVkZ2VyIEZhYnJpYyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHksIGluY2x1ZGluZyByZWdpc3RyYXRpb24sIGVucm9sbG1lbnQsIHJldm9jYXRpb24sIGFuZCBhZG1pbmlzdHJhdGl2ZSBxdWVyaWVzLiBFbmNhcHN1bGF0ZXMgbG93ZXItbGV2ZWwgRmFicmljIENBIGNsaWVudCBjYWxscyB3aXRoIGNvbnNpc3RlbnQgbG9nZ2luZyBhbmQgZXJyb3IgbWFwcGluZy5cbiAqIEBwYXJhbSB7Q0FDb25maWd9IGNhQ29uZmlnIC0gQ29ubmVjdGlvbiBhbmQgVExTIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0YXJnZXQgQ0EuXG4gKiBAY2xhc3MgRmFicmljRW5yb2xsbWVudFNlcnZpY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlciBhbmQgZW5yb2xsIGEgbmV3IHVzZXJcbiAqIGNvbnN0IHN2YyA9IG5ldyBGYWJyaWNFbnJvbGxtZW50U2VydmljZSh7XG4gKiAgIHVybDogJ2h0dHBzOi8vbG9jYWxob3N0OjcwNTQnLFxuICogICBjYU5hbWU6ICdPcmcxQ0EnLFxuICogICB0bHM6IHsgdHJ1c3RlZFJvb3RzOiBbJy9wYXRoL3RvL2NhLnBlbSddLCB2ZXJpZnk6IGZhbHNlIH0sXG4gKiAgIGNhQ2VydDogJy9wYXRoL3RvL2FkbWluL2NlcnREaXInLFxuICogICBjYUtleTogJy9wYXRoL3RvL2FkbWluL2tleURpcidcbiAqIH0pO1xuICogYXdhaXQgc3ZjLnJlZ2lzdGVyKHsgdXNlck5hbWU6ICdhbGljZScsIHBhc3N3b3JkOiAnczNjcjN0JyB9LCBmYWxzZSwgJ29yZzEuZGVwYXJ0bWVudDEnLCBDQV9ST0xFLlVTRVIpO1xuICogY29uc3QgaWQgPSBhd2FpdCBzdmMuZW5yb2xsKCdhbGljZScsICdzM2NyM3QnKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgYXV0b251bWJlclxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU3ZjIGFzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlXG4gKiAgIHBhcnRpY2lwYW50IENBIGFzIEZhYnJpYyBDQVxuICogICBBcHAtPj5TdmM6IHJlZ2lzdGVyKGNyZWRlbnRpYWxzLCAuLi4pXG4gKiAgIFN2Yy0+PkNBOiByZWdpc3RlcihyZXF1ZXN0LCBhZG1pblVzZXIpXG4gKiAgIENBLS0+PlN2YzogZW5yb2xsbWVudFNlY3JldFxuICogICBTdmMtLT4+QXBwOiBzZWNyZXRcbiAqICAgQXBwLT4+U3ZjOiBlbnJvbGwoZW5yb2xsbWVudElkLCBzZWNyZXQpXG4gKiAgIFN2Yy0+PkNBOiBlbnJvbGwoe2Vucm9sbG1lbnRJRCwgc2VjcmV0fSlcbiAqICAgQ0EtLT4+U3ZjOiBjZXJ0aWZpY2F0ZXNcbiAqICAgU3ZjLS0+PkFwcDogSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICBwcml2YXRlIGNhPzogRmFicmljQ0FTZXJ2aWNlcztcblxuICBwcml2YXRlIGNlcnRpZmljYXRlU2VydmljZT86IGFueTtcblxuICBwcml2YXRlIGFmZmlsaWF0aW9uU2VydmljZT86IEFmZmlsaWF0aW9uU2VydmljZTtcblxuICBwcml2YXRlIGlkZW50aXR5U2VydmljZT86IElkZW50aXR5U2VydmljZTtcblxuICBwcml2YXRlIGNsaWVudD86IGFueTtcblxuICBwcml2YXRlIHVzZXI/OiBVc2VyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FDb25maWc6IENBQ29uZmlnKSB7XG4gICAgQ29yZVV0aWxzLmdldENyeXB0b1N1aXRlKFxuICAgICAgY2FDb25maWcuaHNtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc29mdHdhcmU6IGZhbHNlLFxuICAgICAgICAgICAgbGliOiBjYUNvbmZpZy5oc20ubGlicmFyeSxcbiAgICAgICAgICAgIHNsb3Q6IGNhQ29uZmlnLmhzbS5zbG90LFxuICAgICAgICAgICAgbGFiZWw6IGNhQ29uZmlnLmhzbS50b2tlbkxhYmVsLFxuICAgICAgICAgICAgcGluOiBTdHJpbmcoY2FDb25maWcuaHNtLnBpbiksXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBVc2VyKCk6IFByb21pc2U8VXNlcj4ge1xuICAgIGlmICh0aGlzLnVzZXIpIHJldHVybiB0aGlzLnVzZXI7XG4gICAgY29uc3QgeyBjYU5hbWUsIGNhQ2VydCwgY2FLZXksIHVybCwgaHNtIH0gPSB0aGlzLmNhQ29uZmlnO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLlVzZXIpO1xuICAgIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgQ0EgdXNlciBmb3IgJHtjYU5hbWV9IGF0ICR7dXJsfWApO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy51c2VyID0gYXdhaXQgQ29yZVV0aWxzLmdldENBVXNlcihcImFkbWluXCIsIGtleSwgY2VydGlmaWNhdGUsIGNhTmFtZSwge1xuICAgICAgaHNtLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnVzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ0EoKTogUHJvbWlzZTxGYWJyaWNDQVNlcnZpY2VzPiB7XG4gICAgaWYgKHRoaXMuY2EpIHJldHVybiB0aGlzLmNhO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLkNBKTtcbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IHRoaXMuY2FDb25maWc7XG5cbiAgICAvLyBGT1IgU29tZSBSZWFzb24gdGhlIHZlcmlmaWNhdGlvbiBmYWlscyBuZWVkIHRvIGludmVzdGlnYXRlIHRoaXMgd29ya3MgZm9yIG5vd1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBDQSBDbGllbnQgZm9yIENBICR7Y2FOYW1lfSB1bmRlciAke3VybH1gKTtcbiAgICB0aGlzLmNhID0gbmV3IEZhYnJpY0NBU2VydmljZXMoXG4gICAgICB1cmwsXG4gICAgICB7XG4gICAgICAgIHRydXN0ZWRSb290czogQnVmZmVyLmZyb20oY2VydGlmaWNhdGUpLFxuICAgICAgICB2ZXJpZnksXG4gICAgICB9IGFzIFRMU09wdGlvbnMsXG4gICAgICBjYU5hbWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmNhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIENsaWVudCgpOiBQcm9taXNlPHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfT4ge1xuICAgIGlmICh0aGlzLmNsaWVudCkgcmV0dXJuIHRoaXMuY2xpZW50O1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIHRoaXMuY2xpZW50ID0gKGNhIGFzIGFueSlbXCJfRmFicmljQ0FTZXJ2aWNlc1wiXTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ2VydGlmaWNhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmNlcnRpZmljYXRlU2VydmljZSlcbiAgICAgIHRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ2xpZW50KCkpLm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICAgIHJldHVybiB0aGlzLmNlcnRpZmljYXRlU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBBZmZpbGlhdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLmFmZmlsaWF0aW9uU2VydmljZSlcbiAgICAgIHRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ0EoKSkubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIElkZW50aXRpZXMoKSB7XG4gICAgaWYgKCF0aGlzLmlkZW50aXR5U2VydmljZSlcbiAgICAgIHRoaXMuaWRlbnRpdHlTZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ0EoKSkubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlTZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBjZXJ0aWZpY2F0ZXMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IENhbGxzIHRoZSBDQSBjZXJ0aWZpY2F0ZSBzZXJ2aWNlIHRvIGxpc3QgY2VydGlmaWNhdGVzLCBvcHRpb25hbGx5IG1hcHBpbmcgdG8gUEVNIHN0cmluZ3Mgb25seS5cbiAgICogQHBhcmFtIHtHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0fSBbcmVxdWVzdF0gLSBPcHRpb25hbCBmaWx0ZXIgcmVxdWVzdCBmb3IgY2VydGlmaWNhdGUgbG9va3VwLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkb01hcD10cnVlXSAtIFdoZW4gdHJ1ZSwgcmV0dXJucyBhcnJheSBvZiBQRU0gc3RyaW5nczsgb3RoZXJ3aXNlIHJldHVybnMgZnVsbCByZXNwb25zZSBvYmplY3QuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nW10gfCBDZXJ0aWZpY2F0ZVJlc3BvbnNlPn0gQXJyYXkgb2YgUEVNIHN0cmluZ3Mgb3IgdGhlIGZ1bGwgY2VydGlmaWNhdGUgcmVzcG9uc2UuXG4gICAqL1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdD86IEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gICAgZG9NYXAgPSB0cnVlXG4gICk6IFByb21pc2U8c3RyaW5nW10gfCBDZXJ0aWZpY2F0ZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2VydGlmaWNhdGVTZXJ2aWNlID0gYXdhaXQgdGhpcy5DZXJ0aWZpY2F0ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDZXJ0aWZpY2F0ZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2U6IENlcnRpZmljYXRlUmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCBjZXJ0aWZpY2F0ZVNlcnZpY2UuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHVzZXIpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuY2VydHMubGVuZ3RofSBjZXJ0aWZpY2F0ZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiBkb01hcCA/IHJlc3BvbnNlLmNlcnRzLm1hcCgoYykgPT4gYy5QRU0pIDogcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3QgaWRlbnRpdGllcyByZWdpc3RlcmVkIGluIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgUXVlcmllcyB0aGUgQ0EgaWRlbnRpdHkgc2VydmljZSB0byBmZXRjaCBhbGwgaWRlbnRpdGllcyBhbmQgcmV0dXJucyB0aGUgbGlzdCBhcyBGYWJyaWNJZGVudGl0eSBvYmplY3RzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+fSBUaGUgbGlzdCBvZiBpZGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgZ2V0SWRlbnRpdGllcygpOiBQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+IHtcbiAgICBjb25zdCBpZGVudGl0aWVzU2VydmljZSA9IGF3YWl0IHRoaXMuSWRlbnRpdGllcygpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldElkZW50aXRpZXMpO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBJZGVudGl0aWVzIHVuZGVyIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElkZW50aXR5UmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCBpZGVudGl0aWVzU2VydmljZS5nZXRBbGwoYXdhaXQgdGhpcy5Vc2VyKCkpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuaWRlbnRpdGllcy5sZW5ndGh9IElkZW50aXRpZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlRXJyb3IoZTogRXJyb3IpIHtcbiAgICBjb25zdCByZWdleHAgPSAvLipjb2RlOlxccyhcXGQrKS4qP21lc3NhZ2U6XFxzW1wiJ10oLispW1wiJ10vZ3M7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhlLm1lc3NhZ2UpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IoZSk7XG4gICAgY29uc3QgWywgY29kZSwgbWVzc2FnZV0gPSBtYXRjaDtcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgXCI3NFwiOlxuICAgICAgY2FzZSBcIjcxXCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgXCIyMFwiOlxuICAgICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoKSB7XG4gICAgY29uc3QgYWZmaWxpYXRpb25TZXJ2aWNlID0gYXdhaXQgdGhpcy5BZmZpbGlhdGlvbnMoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBBZmZpbGlhdGlvbnMgdW5kZXIgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCBhZmZpbGlhdGlvblNlcnZpY2UuZ2V0QWxsKGF3YWl0IHRoaXMuVXNlcigpKSlcbiAgICAgIC5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuYS5sZW5ndGh9IEFmZmlsaWF0aW9uczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkIGlkZW50aXR5IGRldGFpbHMgZnJvbSB0aGUgQ0EgYnkgZW5yb2xsbWVudCBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuZCB2YWxpZGF0ZXMgYSBzaW5nbGUgaWRlbnRpdHksIHRocm93aW5nIE5vdEZvdW5kRXJyb3Igd2hlbiBtaXNzaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBsb29rdXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHk+fSBUaGUgaWRlbnRpdHkgZGV0YWlscyBzdG9yZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgcmVhZChlbnJvbGxtZW50SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjYS5uZXdJZGVudGl0eVNlcnZpY2UoKS5nZXRPbmUoZW5yb2xsbWVudElkLCB1c2VyKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCBhcyBGYWJyaWNJZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgaWRlbnRpdHkgd2l0aCB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSByZWdpc3RyYXRpb24gcmVxdWVzdCBmb3IgYSBuZXcgZW5yb2xsbWVudCBJRCwgcmV0dXJuaW5nIHRoZSBlbnJvbGxtZW50IHNlY3JldCB1cG9uIHN1Y2Nlc3MuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQgZm9yIHRoZSBuZXcgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFRoZSBlbnJvbGxtZW50IHNlY3JldCBmb3IgdGhlIHJlZ2lzdGVyZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlcihcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmVnaXN0ZXIpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHVzZXJOYW1lLCBwYXNzd29yZCB9ID0gbW9kZWw7XG4gICAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IGNhLnJlZ2lzdGVyKHByb3BzLCB1c2VyKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgUmVnaXN0cmF0aW9uIGZvciAke3VzZXJOYW1lfSBjcmVhdGVkIHdpdGggdXNlciB0eXBlICR7dXNlclJvbGUgPz8gXCJVbmRlZmluZWQgUm9sZVwifSAke2lzU3VwZXJVc2VyID8gXCJhcyBzdXBlciB1c2VyXCIgOiBcIlwifWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlLFxuICAgIG1zcElkOiBzdHJpbmdcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IHsgY2VydGlmaWNhdGUsIGtleSwgcm9vdENlcnRpZmljYXRlIH0gPSBlbnJvbGxtZW50O1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlLCB7fSkuZm9yKFxuICAgICAgdGhpcy5pZGVudGl0eUZyb21FbnJvbGxtZW50XG4gICAgKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHkoe1xuICAgICAgaWQ6IGlkLFxuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjZXJ0aWZpY2F0ZTogY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGtleS50b0J5dGVzKCksXG4gICAgICAgIHJvb3RDZXJ0aWZpY2F0ZTogcm9vdENlcnRpZmljYXRlLFxuICAgICAgICBjcmVhdGVkT246IG5vdyxcbiAgICAgICAgdXBkYXRlZE9uOiBub3csXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgICAgY3JlYXRlZE9uOiBub3csXG4gICAgICB1cGRhdGVkT246IG5vdyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW5yb2xsIGFuIGlkZW50aXR5IHdpdGggdGhlIENBIHVzaW5nIGEgcmVnaXN0cmF0aW9uIHNlY3JldC5cbiAgICogQHN1bW1hcnkgRXhjaGFuZ2VzIHRoZSBlbnJvbGxtZW50IElEIGFuZCBzZWNyZXQgZm9yIGNlcnRpZmljYXRlcywgcmV0dXJuaW5nIGEgY29uc3RydWN0ZWQgSWRlbnRpdHkgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGVucm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbiAtIEVucm9sbG1lbnQgc2VjcmV0IHJldHVybmVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5IG9iamVjdCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgYXN5bmMgZW5yb2xsKGVucm9sbG1lbnRJZDogc3RyaW5nLCByZWdpc3RyYXRpb246IHN0cmluZykge1xuICAgIGxldCBpZGVudGl0eTogSWRlbnRpdHk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZW5yb2xsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgICBsb2cuZGVidWcoYEVucm9sbGluZyAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IGVucm9sbG1lbnQ6IElFbnJvbGxSZXNwb25zZSA9IGF3YWl0IGNhLmVucm9sbCh7XG4gICAgICAgIGVucm9sbG1lbnRJRDogZW5yb2xsbWVudElkLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiByZWdpc3RyYXRpb24sXG4gICAgICB9KTtcbiAgICAgIGlkZW50aXR5ID0gRmFicmljRW5yb2xsbWVudFNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jYUNvbmZpZy5jYU5hbWVcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSBlbnJvbGxlZCAke2Vucm9sbG1lbnRJZH0gdW5kZXIgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHNcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlcyB0aGUgZW5yb2xsbWVudCBvZiBhbiBpZGVudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgZW5yb2xsbWVudCBJRC5cbiAgICpcbiAgICogQHBhcmFtIGVucm9sbG1lbnRJZCAtIFRoZSBlbnJvbGxtZW50IElEIG9mIHRoZSBpZGVudGl0eSB0byBiZSByZXZva2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzdWx0IG9mIHRoZSByZXZvY2F0aW9uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHRocm93cyB7Tm90Rm91bmRFcnJvcn0gSWYgdGhlIGVucm9sbG1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGRvZXMgbm90IGV4aXN0LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgdGhlIHJldm9jYXRpb24gcHJvY2Vzcy5cbiAgICovXG4gIGFzeW5jIHJldm9rZShlbnJvbGxtZW50SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMucmVhZChlbnJvbGxtZW50SWQpO1xuICAgIGlmICghaWRlbnRpdHkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH1gXG4gICAgICApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNhLnJldm9rZShcbiAgICAgICAgeyBlbnJvbGxtZW50SUQ6IGlkZW50aXR5LmlkLCByZWFzb246IFwiVXNlciBEZWxldGF0aW9uXCIgfSxcbiAgICAgICAgdXNlclxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJUmVnaXN0ZXJSZXF1ZXN0LCBJS2V5VmFsdWVBdHRyaWJ1dGUgfSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgbWluLFxuICBtaW5sZW5ndGgsXG4gIE1vZGVsLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlciBleHRlbmRzIE1vZGVsIHtcbiAgQHJlcXVpcmVkKClcbiAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCI7XG4gIEBtaW5sZW5ndGgoMSlcbiAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGVbXTtcbiAgQHJlcXVpcmVkKClcbiAgZW5yb2xsbWVudElEITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKVxuICBlbnJvbGxtZW50U2VjcmV0ITogc3RyaW5nO1xuICBAbWluKDApXG4gIG1heEVucm9sbG1lbnRzPzogbnVtYmVyO1xuICBAcmVxdWlyZWQoKVxuICByb2xlITogc3RyaW5nO1xuXG4gIGJ1aWxkKCk6IElSZWdpc3RlclJlcXVlc3Qge1xuICAgIGNvbnN0IGVycnMgPSB0aGlzLmhhc0Vycm9ycygpO1xuICAgIGlmIChlcnJzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycnMudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElSZWdpc3RlclJlcXVlc3QgPSB7XG4gICAgICBlbnJvbGxtZW50SUQ6IHRoaXMuZW5yb2xsbWVudElELFxuICAgICAgZW5yb2xsbWVudFNlY3JldDogdGhpcy5lbnJvbGxtZW50U2VjcmV0LFxuICAgICAgcm9sZTogdGhpcy5yb2xlLFxuICAgICAgYWZmaWxpYXRpb246IHRoaXMuYWZmaWxpYXRpb24sXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHRoaXMubWF4RW5yb2xsbWVudHMgIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXNwb25zZS5tYXhFbnJvbGxtZW50cyA9IHRoaXMubWF4RW5yb2xsbWVudHM7XG4gICAgaWYgKHRoaXMuYXR0cnMpIHJlc3BvbnNlLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBzZXRBZmZpbGlhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5hZmZpbGlhdGlvbiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQXR0cihhdHRyOiBJS2V5VmFsdWVBdHRyaWJ1dGUpIHtcbiAgICB0aGlzLmF0dHJzID0gdGhpcy5hdHRycyB8fCBbXTtcbiAgICB0aGlzLmF0dHJzLnB1c2goYXR0cik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBdHRycyh2YWx1ZTogSUtleVZhbHVlQXR0cmlidXRlW10pIHtcbiAgICB0aGlzLmF0dHJzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFbnJvbGxtZW50SUQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZW5yb2xsbWVudElEID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFbnJvbGxtZW50U2VjcmV0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVucm9sbG1lbnRTZWNyZXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE1heEVucm9sbG1lbnRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLm1heEVucm9sbG1lbnRzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRSb2xlKHZhbHVlOiBDQV9ST0xFIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5yb2xlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTZWdyZWdhdGVkTW9kZWwgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERCS2V5cywgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlTWV0YWRhdGEsXG4gIENvbGxlY3Rpb25SZXNvbHZlcixcbiAgTWlycm9yTWV0YWRhdGEsXG59IGZyb20gXCIuLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBDb250ZXh0dWFsQXJncyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5Nb2RlbC5wcm90b3R5cGUuaXNTaGFyZWQgPSBmdW5jdGlvbiBpc1NoYXJlZDxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1vZGVsLmlzU2hhcmVkKHRoaXMuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xufTtcblxuTW9kZWwucHJvdG90eXBlLmlzUHJpdmF0ZSA9IGZ1bmN0aW9uIGlzUHJpdmF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1vZGVsLmlzUHJpdmF0ZSh0aGlzLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcbn07XG5cbk1vZGVsLnByb3RvdHlwZS5zZWdyZWdhdGUgPSBmdW5jdGlvbiBzZWdyZWdhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogTVxuKTogU2VncmVnYXRlZE1vZGVsPE0+IHtcbiAgcmV0dXJuIE1vZGVsLnNlZ3JlZ2F0ZSh0aGlzKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnNlZ3JlZ2F0ZSA9IGZ1bmN0aW9uIHNlZ3JlZ2F0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTVxuKTogU2VncmVnYXRlZE1vZGVsPE0+IHtcbiAgaWYgKCFNb2RlbC5pc1RyYW5zaWVudChtb2RlbCkpIHJldHVybiB7IG1vZGVsOiBtb2RlbCB9O1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzID1cbiAgICBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgfHwgW107XG5cbiAgY29uc3QgdHJhbnNpZW50UHJvcHMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIERCS2V5cy5UUkFOU0lFTlRcbiAgKTtcbiAgY29uc3QgcHJpdmF0ZVByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFXG4gICk7XG4gIGNvbnN0IHNoYXJlZFByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5TSEFSRURcbiAgKTtcblxuICBjb25zdCByZXN1bHQ6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiA9IHtcbiAgICBtb2RlbDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgcHVibGljOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICB0cmFuc2llbnQ6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHByaXZhdGVzOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICBzaGFyZWQ6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICB9O1xuXG4gIGNvbnN0IHRyYW5zaWVudEtleXMgPSBPYmplY3Qua2V5cyh0cmFuc2llbnRQcm9wcyB8fCB7fSk7XG4gIGNvbnN0IHByaXZhdGVLZXlzID0gT2JqZWN0LmtleXMocHJpdmF0ZVByb3BlcnRpZXMgfHwge30pO1xuICBjb25zdCBzaGFyZWRLZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkUHJvcGVydGllcyB8fCB7fSk7XG5cbiAgLy8gY29uc3QgcGtLZXkgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZWNvcmF0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtb2RlbFtrZXkgYXMga2V5b2YgTV07XG4gICAgY29uc3QgaXNUcmFuc2llbnQgPSB0cmFuc2llbnRLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgY29uc3QgaXNQdWJsaWMgPSAhaXNUcmFuc2llbnQ7XG4gICAgY29uc3QgaXNQcml2YXRlID0gcHJpdmF0ZUtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBpc1NoYXJlZCA9IHNoYXJlZEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICAvLyBjb25zdCBpc1ByaW1hcnlLZXkgPSBrZXkgPT09IHBrS2V5O1xuXG4gICAgaWYgKGlzVHJhbnNpZW50IHx8IGlzUHJpdmF0ZSB8fCBpc1NoYXJlZCkge1xuICAgICAgcmVzdWx0LnRyYW5zaWVudCA9IHJlc3VsdC50cmFuc2llbnQgfHwgKHt9IGFzIGFueSk7XG4gICAgICAocmVzdWx0LnRyYW5zaWVudCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzUHJpdmF0ZSkge1xuICAgICAgcmVzdWx0LnByaXZhdGVzID0gcmVzdWx0LnByaXZhdGVzIHx8ICh7fSBhcyBhbnkpO1xuICAgICAgKHJlc3VsdC5wcml2YXRlcyBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzU2hhcmVkKSB7XG4gICAgICByZXN1bHQuc2hhcmVkID0gcmVzdWx0LnNoYXJlZCB8fCAoe30gYXMgYW55KTtcbiAgICAgIChyZXN1bHQuc2hhcmVkIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgIHJlc3VsdC5wdWJsaWMgPSAocmVzdWx0LnB1YmxpYyB8fCB7fSkgYXMgYW55O1xuICAgICAgKHJlc3VsdC5wdWJsaWMgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmVzdWx0Lm1vZGVsID0gTW9kZWwuYnVpbGQocmVzdWx0LnB1YmxpYywgbW9kZWwuY29uc3RydWN0b3IubmFtZSk7XG4gIHJldHVybiByZXN1bHQgYXMgU2VncmVnYXRlZE1vZGVsPE0+O1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuaXNQcml2YXRlID0gZnVuY3Rpb24gaXNQcml2YXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5pc1NoYXJlZCA9IGZ1bmN0aW9uIGlzU2hhcmVkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIEZhYnJpY01vZGVsS2V5cy5TSEFSRURcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLm1pcnJvcmVkID0gZnVuY3Rpb24gbWlycm9yZWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKVxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkub3duZXJPZiA9IGZ1bmN0aW9uIG93bmVyT2Y8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE1cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG1vZGVsW21ldGEgYXMga2V5b2YgTV0gYXMgc3RyaW5nO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkubWlycm9yZWRBdCA9IGZ1bmN0aW9uIG1pcnJvcmVkQXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogTWlycm9yTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICBtb2RlbCA9IHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbDtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChcbiAgICBtb2RlbCBhcyBhbnksXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5jb2xsZWN0aW9uc0ZvciA9IGZ1bmN0aW9uIGNvbGxlY3Rpb25zRm9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IHtcbiAgcHJpdmF0ZUNvbHM6IChzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpW107XG4gIHNoYXJlZENvbHM6IChzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpW107XG59IHtcbiAgY29uc3QgcHJpdmF0ZUtleXM6IHN0cmluZ1tdID0gW0ZhYnJpY01vZGVsS2V5cy5QUklWQVRFXSBhcyBzdHJpbmdbXTtcbiAgY29uc3Qgc2hhcmVkS2V5czogc3RyaW5nW10gPSBbRmFicmljTW9kZWxLZXlzLlNIQVJFRF0gYXMgc3RyaW5nW107XG5cbiAgY29uc3QgcHJpdmF0ZUtleSA9IE1ldGFkYXRhLmtleSguLi5wcml2YXRlS2V5cyk7XG4gIGNvbnN0IHNoYXJlZEtleSA9IE1ldGFkYXRhLmtleSguLi5zaGFyZWRLZXlzKTtcblxuICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG5cbiAgY29uc3QgcHJpdmF0ZU1ldGE6IHsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gPSBNZXRhZGF0YS5nZXQoXG4gICAgY29uc3RyIGFzIGFueSxcbiAgICBwcml2YXRlS2V5XG4gICk7XG4gIGNvbnN0IHNoYXJlZE1ldGE6IHsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gPSBNZXRhZGF0YS5nZXQoXG4gICAgY29uc3RyIGFzIGFueSxcbiAgICBzaGFyZWRLZXlcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVDb2xzOiBwcml2YXRlTWV0YT8uY29sbGVjdGlvbnMgfHwgW10sXG4gICAgc2hhcmVkQ29sczogc2hhcmVkTWV0YT8uY29sbGVjdGlvbnMgfHwgW10sXG4gIH07XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5jaGFpbmNvZGVPZiA9IGZ1bmN0aW9uIGNoYWluY29kZU9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DSEFJTkNPREVcbiAgKTtcbiAgaWYgKCFtIHx8ICFtLnJlc29sdmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIG0ucmVzb2x2ZXIgPT09IFwic3RyaW5nXCIpIHJldHVybiBtLnJlc29sdmVyO1xuICBjb25zdCBjdHggPSBhcmdzLnBvcCgpO1xuICBpZiAoIWN0eCB8fCAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBjb250ZXh0IHByb3ZpZGVkIGZvciBjaGFpbmNvZGUgcmVzb2x1dGlvbmApO1xuICByZXR1cm4gbS5yZXNvbHZlcihtb2RlbCwgLi4uYXJncywgY3R4KTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmNvbnRyYWN0T2YgPSBmdW5jdGlvbiBjb250cmFjdE9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DT05UUkFDVFxuICApO1xuICBpZiAoIW0gfHwgIW0ucmVzb2x2ZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbS5yZXNvbHZlciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG0ucmVzb2x2ZXI7XG4gIGNvbnN0IGN0eCA9IGFyZ3MucG9wKCk7XG4gIGlmICghY3R4IHx8ICEoY3R4IGluc3RhbmNlb2YgQ29udGV4dCkpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGNvbnRleHQgcHJvdmlkZWQgZm9yIGNoYWluY29kZSByZXNvbHV0aW9uYCk7XG4gIHJldHVybiBtLnJlc29sdmVyKG1vZGVsLCAuLi5hcmdzLCBjdHgpO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuY2hhbm5lbE9mID0gZnVuY3Rpb24gY2hhbm5lbE9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DSEFOTkVMXG4gICk7XG4gIGlmICghbSB8fCAhbS5yZXNvbHZlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBtLnJlc29sdmVyID09PSBcInN0cmluZ1wiKSByZXR1cm4gbS5yZXNvbHZlcjtcbiAgY29uc3QgY3R4ID0gYXJncy5wb3AoKTtcbiAgaWYgKCFjdHggfHwgIShjdHggaW5zdGFuY2VvZiBDb250ZXh0KSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gY29udGV4dCBwcm92aWRlZCBmb3IgY2hhaW5jb2RlIHJlc29sdXRpb25gKTtcbiAgcmV0dXJuIG0ucmVzb2x2ZXIobW9kZWwsIC4uLmFyZ3MsIGN0eCk7XG59LmJpbmQoTW9kZWwpO1xuIiwiLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZXZlbnRzIGVtaXR0ZWQgYnkgYW4gRVJDMjAgY29udHJhY3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBldmVudHMgdGhhdCBjYW4gYmUgZW1pdHRlZCBieSBhbiBFUkMyMCBjb250cmFjdC5cbiAqIFRoZSBldmVudHMgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGUgRUlQLTIwIHN0YW5kYXJkLlxuICovXG5leHBvcnQgZW51bSBFUkMyMEV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBgdHJhbnNmZXJgIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdHJhbnNmZXJyZWQuXG4gICAqL1xuICBUUkFOU0ZFUiA9IFwiVHJhbnNmZXJcIixcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGBhcHByb3ZlYCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3duZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgdG9rZW4gb3duZXIuXG4gICAqIEBwYXJhbSBzcGVuZGVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvdmVkIHNwZW5kZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIGFwcHJvdmVkIGZvciB0aGUgc3BlbmRlci5cbiAgICovXG4gIEFQUFJPVkFMID0gXCJBcHByb3ZhbFwiLFxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgdXBkYXRlZEF0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQHVzZXMoRmFicmljRmxhdm91cilcbmV4cG9ydCBjbGFzcyBGYWJyaWNCYXNlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgb3JpZ2luYWwgdGltZXN0YW1wIG9mIGNyZWF0aW9uXCIpXG4gIEBjb2x1bW4oKVxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCB1cGRhdGVcIilcbiAgQGNvbHVtbigpXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kZWxcIilcbiAgQGNvbHVtbigpXG4gIEB2ZXJzaW9uKClcbiAgdmVyc2lvbiE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEJ5LCB1cGRhdGVkQnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uLCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRmFicmljQmFzZU1vZGVsIH0gZnJvbSBcIi4vRmFicmljQmFzZU1vZGVsXCI7XG5cbkB1c2VzKEZhYnJpY0ZsYXZvdXIpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCBleHRlbmRzIEZhYnJpY0Jhc2VNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgY3JlYXRvclwiKVxuICBAY29sdW1uKClcbiAgQGNyZWF0ZWRCeSgpXG4gIGNyZWF0ZWRCeSE6IHN0cmluZztcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHVzZXIgdGhhdCBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsXCIpXG4gIEBjb2x1bW4oKVxuICBAdXBkYXRlZEJ5KClcbiAgdXBkYXRlZEJ5ITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgUmVwbyxcbiAgQ29udGV4dCxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgQ29udGV4dE9mLFxuICBDb250ZXh0dWFsQXJncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBnZW5lcmF0ZWQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25SZWFkLFxuICBvblVwZGF0ZSxcbiAgcmVhZG9ubHksXG4gIHRyYW5zaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEQktleXMsXG4gIERCT3BlcmF0aW9ucyxcbiAgb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuaW1wb3J0IHsgRmFicmljRVJDMjBDb250cmFjdCB9IGZyb20gXCIuLi9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdFwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbiAgTWV0YWRhdGEsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RmxhZ3MgfSBmcm9tIFwiLi4vY29udHJhY3RzL3R5cGVzXCI7XG5pbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9jb250cmFjdHMvQ29udHJhY3RDb250ZXh0XCI7XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVyRnVuY3Rpb248VD4gPSAoXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKSA9PiBQcm9taXNlPFQ+IHwgVDtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRDb250cmFjdFJlc29sdmVyID0gKFxuICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKSA9PiB7XG4gIHJldHVybiBtb2RlbC5uYW1lICsgXCJDb250cmFjdFwiO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhaW5jb2RlTWV0YWRhdGEgPSB7XG4gIHJlc29sdmVyOiBzdHJpbmcgfCBSZXNvbHZlckZ1bmN0aW9uPHN0cmluZz47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29udHJhY3QocmVzb2x2ZXI6IGFueSkge1xuICBjb25zdCBtZXRhOiBDaGFpbmNvZGVNZXRhZGF0YSA9IHsgcmVzb2x2ZXIgfTtcbiAgcmV0dXJuIG1ldGFkYXRhKEZhYnJpY01vZGVsS2V5cy5DT05UUkFDVCwgbWV0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbmNvZGUocmVzb2x2ZXI6IGFueSkge1xuICBjb25zdCBtZXRhOiBDaGFpbmNvZGVNZXRhZGF0YSA9IHsgcmVzb2x2ZXIgfTtcbiAgcmV0dXJuIG1ldGFkYXRhKEZhYnJpY01vZGVsS2V5cy5DSEFJTkNPREUsIG1ldGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbChyZXNvbHZlcjogYW55KSB7XG4gIGNvbnN0IG1ldGE6IENoYWluY29kZU1ldGFkYXRhID0geyByZXNvbHZlciB9O1xuICByZXR1cm4gbWV0YWRhdGEoRmFicmljTW9kZWxLZXlzLkNIQU5ORUwsIG1ldGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyB0aGUgTVNQIElEIGZyb20gZWl0aGVyIGEgc3RyaW5nIG9yIENsaWVudElkZW50aXR5IG9iamVjdFxuICogQHBhcmFtIGlkZW50aXR5IC0gVGhlIGlkZW50aXR5IHZhbHVlIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBNU1AgSUQgb3IgQ2xpZW50SWRlbnRpdHkgb2JqZWN0XG4gKiBAcmV0dXJucyBUaGUgTVNQIElEIGFzIGEgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1zcElkKFxuICBpZGVudGl0eTogc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaWRlbnRpdHkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaWRlbnRpdHkgPT09IFwic3RyaW5nXCIpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIGlkZW50aXR5LmdldE1TUElEKCk7XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBtYXJraW5nIG1ldGhvZHMgdGhhdCByZXF1aXJlIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICogQ2hlY2tzIHRoZSBvd25lciBvZiB0aGUgdG9rZW4gYmVmb3JlIGFsbG93aW5nIHRoZSBtZXRob2QgdG8gYmUgZXhlY3V0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFRva2VuQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7XG4gKiAgIEBPd25lcigpXG4gKiAgIGFzeW5jIE1pbnQoY3R4OiBDb250ZXh0LCBhbW91bnQ6IG51bWJlcikge1xuICogICAgIC8vIE1pbnQgdG9rZW4gbG9naWNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybnMge01ldGhvZERlY29yYXRvcn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgY2hlY2tzIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT3duZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgIHRoaXM6IEZhYnJpY0VSQzIwQ29udHJhY3QsXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICkge1xuICAgICAgY29uc3QgY3R4OiBITENvbnRleHQgPSBhcmdzWzBdO1xuICAgICAgY29uc3QgYWNvdW50SWQgPSBjdHguY2xpZW50SWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gYXdhaXQgKHRoaXMgYXMgRmFicmljRVJDMjBDb250cmFjdClbXG4gICAgICAgIFwidG9rZW5SZXBvc2l0b3J5XCJcbiAgICAgIF0uc2VsZWN0KCk7XG5cbiAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IHNlbGVjdC5leGVjdXRlKGN0eCk7XG5cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXCJObyB0b2tlbnMgYXZhaWFsYmxlXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRvIG1hbnkgdG9rZW4gYXZhaWxhYmxlIDogJHt0b2tlbnMubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zWzBdLm93bmVyICE9IGFjb3VudElkKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYFVzZXIgbm90IGF1dGhvcml6ZWQgdG8gcnVuICR7cHJvcGVydHlLZXl9IG9uIHRoZSB0b2tlbmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG93bmVkQnlPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBSIGV4dGVuZHMgUmVwbzxNPixcbiAgVixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc3R1YiB9ID0gY29udGV4dCBhcyBhbnk7XG5cbiAgY29uc3QgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUgPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZTtcblxuICBjb25zdCBjcmVhdG9yID0gYXdhaXQgc3R1Yi5nZXRDcmVhdG9yKCk7XG4gIGxldCBvd25lciA9IGNyZWF0b3IubXNwaWQ7XG4gIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgYEV4cGVjdGVkIG1zcGlkIHRvIGJlICR7bW9kZWxba2V5XX0gfCAke293bmVyfS4gXFxuIFVzaW5nIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiAke2FsbG93R2VuZXJhdGlvbk92ZXJyaWRlfWBcbiAgKTtcblxuICBpZiAoYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUpIG93bmVyID0gbW9kZWxba2V5XSA/IG1vZGVsW2tleV0gOiBvd25lcjtcblxuICBjb25zdCBzZXRPd25lZEJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldE93bmVkQnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgb3duZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgZ2VuZXJhdGVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIG9uQ3JlYXRlKG93bmVkQnlPbkNyZWF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKSxcbiAgICAgICAgICBhdHRyaWJ1dGVcbiAgICAgICAgKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG93bmVkQnksXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZE9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcbiAgbW9kZWxba2V5XSA9IHN0dWIuZ2V0VHhJRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgb25VcGRhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsXG4gICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICBGYWJyaWNNb2RlbEtleXMuVFJBTlNBQ1RJT05fSURcbiAgICAgICAgICApLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCB0eXBlIE1pcnJvckNvbmRpdGlvbiA9IChtc3A6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTWlycm9yTWV0YWRhdGEgPSB7XG4gIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvbjtcbiAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZztcbiAgbXNwSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsTWlycm9yTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHJlc29sdmVyOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIGN0eDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPlxuKSB7XG4gIGxldCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgPSByZXNvbHZlcjtcbiAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgY3R4LmdldChcInN0dWJcIikuZ2V0Q3JlYXRvcigpLnRvU3RyaW5nKCk7XG4gICAgICBpZiAocmVzb2x2ZXIgJiYgdHlwZW9mIHJlc29sdmVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGNvbGxlY3Rpb24gPSBhd2FpdCByZXNvbHZlcihtb2RlbCwgb3duZXIsIGN0eCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIGNvbGxlY3Rpb24gbWlycm9yIG5hbWU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbGxlY3Rpb24gfHwgdHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTm8gY29sbGVjdGlvbiBmb3VuZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIC8vIFB1dCBtaXJyb3IgZmxhZ3MgZGlyZWN0bHkgb24gY29udGV4dCBzbyBhZGFwdGVyLnByZXBhcmUoKSBhbmQgYWRhcHRlci5jcmVhdGUoKSBjYW4gc2VlIHRoZW1cbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBjb25zdCBtaXJyb3IgPSBhd2FpdCByZXBvLmNyZWF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBjcmVhdGVkIHdpdGggJHtNb2RlbC5wayhtb2RlbCkgYXMgc3RyaW5nfTogJHttaXJyb3JbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhbiB1cCBtaXJyb3IgZmxhZ3MgZnJvbSBjb250ZXh0XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBtaXJyb3JDb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgICAgYXBwbHlVcGRhdGVWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VGb3JVcGRhdGU6IGZhbHNlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBhd2FpdCByZXBvLnVwZGF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB1cGRhdGVkOiAkeyhtb2RlbCBhcyBhbnkpW01vZGVsLnBrKG1vZGVsKV19YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGZhYnJpY0N0eC5wdXQoXCJzZWdyZWdhdGVkXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3AgPSBNb2RlbC5wayhtb2RlbCkgYXMga2V5b2YgTTtcbiAgICBjb25zdCBpZCA9IG1vZGVsW3BrUHJvcF07XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgc2VncmVnYXRlZDogY29sbGVjdGlvbixcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkIGFzIGFueSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNYXkgYWxyZWFkeSBiZSBkZWxldGVkIGJ5IGFkYXB0ZXIuZGVsZXRlU2VncmVnYXRlZENvbGxlY3Rpb25zXG4gICAgfVxuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gZGVsZXRlZDogJHtTdHJpbmcoaWQpfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pcnJvcldyaXRlR3VhcmQ8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG4gIGlmICghbXNwKSByZXR1cm47XG4gIGlmIChtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgIGBPcmdhbml6YXRpb24gJHttc3B9IGlzIG5vdCBhdXRob3JpemVkIHRvIG1vZGlmeSBtaXJyb3JlZCBkYXRhYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG5cbiAgaWYgKCFtc3ApIHJldHVybjtcblxuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IG1hdGNoZXMgPSBtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgcmVhZDogTVNQICR7bXNwfSBtYXRjaGVzLCByb3V0aW5nIHJlYWRzIHRvIG1pcnJvciBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn1gXG4gICAgKTtcbiAgICAvLyBSb3V0ZSByZWFkcyBleGNsdXNpdmVseSB0aHJvdWdoIHRoZSBtaXJyb3IgY29sbGVjdGlvblxuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgICBmYWJyaWNDdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICAgIGZhYnJpY0N0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbiAgfVxuICAvLyBXaGVuIE1TUCBkb2VzIE5PVCBtYXRjaCwgbm9ybWFsIHJlYWQgZmxvdyDigJQgYWxsIGRhdGEgaXMgaW4gcHVibGljIHN0YXRlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXJyb3IoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgbXNwSWRPckNvbmRpdGlvbj86IHN0cmluZyB8IE1pcnJvckNvbmRpdGlvbixcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uXG4pIHtcbiAgY29uc3QgaXNDb25kaXRpb25Pbmx5ID1cbiAgICB0eXBlb2YgbXNwSWRPckNvbmRpdGlvbiAhPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1zcElkT3JDb25kaXRpb24pO1xuICBjb25zdCBtc3BJZCA9IGlzQ29uZGl0aW9uT25seVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAobXNwSWRPckNvbmRpdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICBjb25zdCBjb25kID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyAobXNwSWRPckNvbmRpdGlvbiBhcyBNaXJyb3JDb25kaXRpb24pXG4gICAgOiBjb25kaXRpb247XG5cbiAgZnVuY3Rpb24gbWlycm9yKFxuICAgIHJlc29sdmVyOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogTWlycm9yTWV0YWRhdGEgPSB7XG4gICAgICBjb25kaXRpb246IGNvbmRpdGlvbixcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICAgIHJlc29sdmVyOiByZXNvbHZlcixcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUiksXG4gICAgICAgIG1ldGFcbiAgICAgICksXG4gICAgICAvLyBSZWFkIGhhbmRsZXIgcnVucyBlYXJseSAocHJpb3JpdHkgMzApIHRvIHNldCB1cCBjb250ZXh0IGJlZm9yZSBhbnkgcmVhZHNcbiAgICAgIG9uUmVhZChyZWFkTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDMwIH0pLFxuICAgICAgLy8gV3JpdGUgZ3VhcmRzIOKAlCByZWplY3QgbWF0Y2hpbmcgTVNQcyBiZWZvcmUgYW55IHByb2Nlc3NpbmdcbiAgICAgIG9uQ3JlYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uVXBkYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uRGVsZXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIC8vIE1pcnJvciBzeW5jIGhhbmRsZXJzIOKAlCB3cml0ZSBmdWxsIG1vZGVsIGFmdGVyIG90aGVyIGhhbmRsZXJzIChwcmlvcml0eSAxMDApXG4gICAgICBvbkNyZWF0ZShjcmVhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25VcGRhdGUodXBkYXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KSxcbiAgICAgIG9uRGVsZXRlKGRlbGV0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1pcnJvcixcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uLCBtc3BJZCwgY29uZF0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcD86IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbikgPT4gc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTW9kZWxDb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWQ/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBvcmdOYW1lID1cbiAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgKTtcbiAgcmV0dXJuIGAke3RvUGFzY2FsQ2FzZShjb25zdHIubmFtZSl9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5hbWVzcGFjZUNvbGxlY3Rpb24obmFtZXNwYWNlOiBzdHJpbmcpOiBDb2xsZWN0aW9uUmVzb2x2ZXIge1xuICByZXR1cm4gPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPiwgbXNwSWQ/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBvcmdOYW1lID1cbiAgICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG4gICAgaWYgKCFvcmdOYW1lKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke2NvbnN0ci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICAgKTtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfSR7b3JnTmFtZSA/IHRvUGFzY2FsQ2FzZShvcmdOYW1lKSA6IFwiXCJ9YDtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYF9fJHt0b1Bhc2NhbENhc2Uob3JnTmFtZSl9UHJpdmF0ZUNvbGxlY3Rpb25gO1xufTtcblxuZXhwb3J0IHR5cGUgU2VncmVnYXRlZERhdGFNZXRhZGF0YSA9IHtcbiAgY29sbGVjdGlvbnM6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW9yaXR5IGZvciBlYXJseSBjb2xsZWN0aW9uIGV4dHJhY3Rpb24gKGJlZm9yZSBwayBnZW5lcmF0aW9uIGF0IHByaW9yaXR5IDYwKVxuICogQHN1bW1hcnkgVGhpcyBwcmlvcml0eSBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgYmVmb3JlIGFueSBzZXF1ZW5jZVxuICogb3BlcmF0aW9ucyBvY2N1ciwgYWxsb3dpbmcgc2VxdWVuY2VzIHRvIGJlIHJlcGxpY2F0ZWQgdG8gcHJpdmF0ZS9zaGFyZWQgY29sbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSA9IDM1O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZWdyZWdhdGlvbkZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBNLFxuICBjb2xsZWN0aW9uczogc3RyaW5nW10sXG4gIGN0eDogYW55XG4pIHtcbiAgLy8gUmVnaXN0ZXIgY29sbGVjdGlvbnMgZWFybHkgdXNpbmcgcmVhZEZyb20gLSB0aGlzIGFsbG93cyBzZXF1ZW5jZSBjb2RlXG4gIC8vIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvIGR1cmluZyBwayBnZW5lcmF0aW9uXG4gIGlmIChjb2xsZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgKGN0eCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb25zKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG1vZGVsIGlzIGZ1bGx5IHNlZ3JlZ2F0ZWQgKGFsbCBub24tcGsgcHJvcGVydGllcyBhcmUgcHJpdmF0ZS9zaGFyZWQvdHJhbnNpZW50KS5cbiAgLy8gVXNlIE1vZGVsLnNlZ3JlZ2F0ZSgpIHdoaWNoIGlzIHRoZSBjYW5vbmljYWwgd2F5IHRvIGRldGVybWluZSB3aGF0J3MgdHJhbnNpZW50LFxuICAvLyByYXRoZXIgdGhhbiByZWFkaW5nIERCS2V5cy5UUkFOU0lFTlQgbWV0YWRhdGEgd2hpY2ggbWF5IG5vdCBhY2N1bXVsYXRlIGNvcnJlY3RseVxuICAvLyB3aGVuIGNsYXNzLWxldmVsIEBwcml2YXRlRGF0YSBhcHBsaWVzIGRlY29yYXRvcnMgaXRlcmF0aXZlbHkuXG4gIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgIGlmICghaGFzUHVibGljUHJvcGVydGllcyhjbGF6ei5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPikpIHtcbiAgICAgIGN0eC5tYXJrRnVsbHlTZWdyZWdhdGVkKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU1pcnJvckZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4pIHtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQoY2xhenopO1xuICBpZiAoIW1pcnJvck1ldGEpIHJldHVybjtcbiAgY29uc3QgbWF0Y2hlcyA9XG4gICAgbXNwID09PSBtaXJyb3JNZXRhLm1zcElkIHx8XG4gICAgKG1pcnJvck1ldGEuY29uZGl0aW9uICYmIG1pcnJvck1ldGEuY29uZGl0aW9uKG1zcCkpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybjtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShcbiAgICBuZXcgY2xhenooKSxcbiAgICBtaXJyb3JNZXRhLnJlc29sdmVyLFxuICAgIGN0eFxuICApO1xuICAvLyBNaXJyb3IgTVNQIG1hdGNoZXMg4oCUIHJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvclxuICAvLyBjb2xsZWN0aW9uLiBDbGVhciBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkIGNvbGxlY3Rpb25zIHNvIHF1ZXJpZXNcbiAgLy8gZ28gT05MWSB0byB0aGUgbWlycm9yLCBub3QgdG8gdGhlIHJlZ3VsYXIgcHJpdmF0ZS9zaGFyZWQgb25lcy5cbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRcIiwgdW5kZWZpbmVkKTtcbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgY3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICBjdHgucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGhhc1B1YmxpY1Byb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihjbGF6ejogQ29uc3RydWN0b3I8TT4pOiBib29sZWFuIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMoY2xhenopIHx8IFtdO1xuICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgY29uc3QgdHJhbnNpZW50TWV0YSA9IE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICBjb25zdCBwcml2YXRlTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKSkgfHwge307XG4gIGNvbnN0IHNoYXJlZE1ldGEgPVxuICAgIE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuU0hBUkVEKSkgfHwge307XG5cbiAgcmV0dXJuIGF0dHJpYnV0ZXMuc29tZSgoYXR0cikgPT4ge1xuICAgIGlmIChhdHRyID09PSBwaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHRyYW5zaWVudE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiBwcml2YXRlTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHNoYXJlZE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVhcmx5IGhhbmRsZXIgdG8gZXh0cmFjdCBhbmQgcmVnaXN0ZXIgY29sbGVjdGlvbnMgaW4gY29udGV4dFxuICogQHN1bW1hcnkgUnVucyB3aXRoIHByaW9yaXR5IDwgNDAgdG8gZXh0cmFjdCBjb2xsZWN0aW9uIG5hbWVzIGJlZm9yZSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MCkuXG4gKiBUaGlzIGFsbG93cyBGYWJyaWNDb250cmFjdFNlcXVlbmNlIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvLlxuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtDb250ZXh0T2Y8UmVwb3NpdG9yeTxNLCBhbnk+Pn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdfSBkYXRhIC0gVGhlIHNlZ3JlZ2F0ZWQgZGF0YSBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0ga2V5cyAtIFRoZSBwcm9wZXJ0eSBrZXkocykgYmVpbmcgc2VncmVnYXRlZFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuXG4gIGNvbnN0IG0gPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZVxuICAgICAgPyBjb250ZXh0LmdldE9yVW5kZWZpbmVkKFwib3duZXJPdmVycmlkZVwiKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbXNwID1cbiAgICBtIHx8IE1vZGVsLm93bmVyT2YobW9kZWwpIHx8IGV4dHJhY3RNc3BJZChjb250ZXh0LmdldChcImlkZW50aXR5XCIpKTtcblxuICBpZiAoIW1zcCkge1xuICAgIC8vIENhbid0IGV4dHJhY3QgY29sbGVjdGlvbnMgd2l0aG91dCBNU1AsIHdpbGwgYmUgY2F1Z2h0IGJ5IGxhdGVyIGhhbmRsZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgZGF0YUFycmF5KSB7XG4gICAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gbWV0YWRhdGEuY29sbGVjdGlvbnM7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjb2xsZWN0aW9uICYmICFjb2xsZWN0aW9ucy5pbmNsdWRlcyhjb2xsZWN0aW9uKSkge1xuICAgICAgY29sbGVjdGlvbnMucHVzaChjb2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgYXBwbHlTZWdyZWdhdGlvbkZsYWdzKG1vZGVsLCBjb2xsZWN0aW9ucywgY29udGV4dCk7XG5cbiAgLy8gU3RvcmUgc2VncmVnYXRpb24gbWV0YWRhdGEgcGVyLXNlcXVlbmNlIHNvIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgY2FuIGRlY2lkZVxuICAvLyB3aGVyZSB0byBzdG9yZS9yZXBsaWNhdGUgc2VxdWVuY2UgcmVjb3JkcyAocHVibGljIHZzIHByaXZhdGUvc2hhcmVkKS5cbiAgLy9cbiAgLy8gLSBgQHBrKClgIHNlcXVlbmNlcyB1c2UgdGhlIHNoYXJlZCBuYW1lIGAke3RhYmxlfV9wa2AgKG5vIGlkIGNvbXBvbmVudCkuXG4gIC8vIC0gYEBzZXF1ZW5jZSgpYCAvIHBlcnNpc3RlbnQgYEB2ZXJzaW9uKHRydWUpYCBzZXF1ZW5jZXMgYXJlIHBlci1tb2RlbC1pbnN0YW5jZTpcbiAgLy8gICBgJHt0YWJsZX1fJHtpZH1fJHtwcm9wZXJ0eX1gLlxuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGNvbnN0IHBrS2V5ID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSBhcyBrZXlvZiBNO1xuICBjb25zdCBwa1NlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG5cbiAgY29uc3QgaWRWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3BrS2V5IGFzIGFueV07XG4gIGNvbnN0IGNhbkJ1aWxkUGVySW5zdGFuY2UgPVxuICAgIHR5cGVvZiBpZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmIGlkVmFsdWUgIT09IG51bGw7XG5cbiAgLy8gQWx3YXlzIHVuaW9uIGNvbGxlY3Rpb25zIGZvciB0aGUgcGsgc2VxdWVuY2Ugd2hlbiB0aGUgbW9kZWwgdXNlcyBzZWdyZWdhdGVkIGRhdGEuXG4gIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICBwa1NlcU5hbWUsXG4gICAgKGNvbnRleHQgYXMgYW55KS5pc0Z1bGx5U2VncmVnYXRlZCxcbiAgICBjb2xsZWN0aW9uc1xuICApO1xuXG4gIC8vIEZvciBwZXItcHJvcGVydHkgc2VxdWVuY2VzLCBvbmx5IHJlZ2lzdGVyIHdoZW4gd2UgY2FuIGNvbXB1dGUgYW4gaWQtc2NvcGVkIG5hbWUuXG4gIC8vIFRoaXMga2VlcHMgc2VxdWVuY2VzIGNvbnN0cmFpbmVkIHRvIHRoZSBjb2xsZWN0aW9ucyB0aGUgYXR0cmlidXRlIGV4aXN0cyBpbi5cbiAgaWYgKGNhbkJ1aWxkUGVySW5zdGFuY2UpIHtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5QXJyYXkpIHtcbiAgICAgIGNvbnN0IHByb3BTZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKG1vZGVsLCBTdHJpbmcoaWRWYWx1ZSksIFN0cmluZyhrKSk7XG4gICAgICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgICAgIHByb3BTZXFOYW1lLFxuICAgICAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgICAgICBjb2xsZWN0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIC8vIFZhbGlkYXRlIGFsbCBrZXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sbGVjdGlvblxuICBrZXlBcnJheS5mb3JFYWNoKChfaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSBrZXlBcnJheS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgc2VncmVnYXRlZCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHwgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgZXh0cmFjdE1zcElkKGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikpO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBhd2FpdCBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb2xkTW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAga2V5QXJyYXkuZm9yRWFjaCgoaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSAoa2V5QXJyYXkgYXMgKGtleW9mIE0pW10pLm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55PixcbiAgViBleHRlbmRzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYgfCBWW10sXG4gIGtleTogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdKSBhcyBWW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHxcbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gc2VncmVnYXRlZChcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyLFxuICB0eXBlOiBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSB8IEZhYnJpY01vZGVsS2V5cy5TSEFSRUQsXG4gIGZpbHRlcj86IChwcm9wTmFtZTogc3RyaW5nKSA9PiBib29sZWFuXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyU2VncmVnYXRlZCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBzZWdyZWdhdGVkRGVjKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgICAgY29uc3Qga2V5ID0gTWV0YWRhdGEua2V5KHR5cGUsIHByb3BlcnR5S2V5KTtcbiAgICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3IgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I7XG5cbiAgICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXkpIHx8IHt9O1xuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBuZXcgU2V0KG1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgbWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXksIG1ldGEpO1xuXG4gICAgICBjb25zdCBjb25zdHJNZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSkgfHwge307XG4gICAgICBjb25zdCBjb25zdHJDb2xsZWN0aW9ucyA9IG5ldyBTZXQoY29uc3RyTWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdHJDb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBjb25zdHJNZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbnN0ckNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUsIGNvbnN0ck1ldGEpO1xuXG4gICAgICBjb25zdCB0cmFuc2llbnRNZXRhID1cbiAgICAgICAgTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gICAgICBjb25zdCB1cGRhdGVkVHJhbnNpZW50TWV0YSA9IHtcbiAgICAgICAgLi4udHJhbnNpZW50TWV0YSxcbiAgICAgICAgW3Byb3BlcnR5S2V5IGFzIGFueV06IHt9LFxuICAgICAgfTtcbiAgICAgIE1ldGFkYXRhLnNldChcbiAgICAgICAgY29uc3RyIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBEQktleXMuVFJBTlNJRU5ULFxuICAgICAgICB1cGRhdGVkVHJhbnNpZW50TWV0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNzOiBhbnlbXSA9IFtdO1xuICAgIGlmICghcHJvcGVydHlLZXkpIHtcbiAgICAgIC8vIGRlY29yYXRlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKHRhcmdldCBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICBwcm9wZXJ0aWVzPy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihwKSkge1xuICAgICAgICAgIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgdHlwZSkoKHRhcmdldCBhcyBhbnkpLnByb3RvdHlwZSwgcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JvdXBOYW1lID1cbiAgICAgICAgdHlwZW9mIGNvbGxlY3Rpb24gPT09IFwic3RyaW5nXCIgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi50b1N0cmluZygpO1xuICAgICAgLy8gVXNlIGRpZmZlcmVudCBncm91cCBuYW1lcyBmb3IgZXh0cmFjdGlvbiB2cyBkYXRhIGhhbmRsZXJzIHRvIHByZXZlbnQgbWVyZ2luZ1xuICAgICAgY29uc3QgZXh0cmFjdEdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZXh0cmFjdGA7XG4gICAgICBjb25zdCBkYXRhR3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpkYXRhYDtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbk1ldGEgPSB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH07XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQgPSB7XG4gICAgICAgIHByaW9yaXR5OiBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSxcbiAgICAgICAgZ3JvdXA6IGV4dHJhY3RHcm91cE5hbWUsXG4gICAgICB9O1xuICAgICAgZGVjcy5wdXNoKFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHRyYW5zaWVudCgpLFxuICAgICAgICBzZWdyZWdhdGVkRGVjLFxuICAgICAgICAvLyBFYXJseSBleHRyYWN0aW9uIGhhbmRsZXJzIC0gcnVuIEJFRk9SRSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MClcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgZm9yIHNlcXVlbmNlIHJlcGxpY2F0aW9uXG4gICAgICAgIC8vIFdlIHJlZ2lzdGVyIGZvciBlYWNoIG9wZXJhdGlvbiBleHBsaWNpdGx5IHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxlciBsb29rdXBcbiAgICAgICAgb24oXG4gICAgICAgICAgREJPcGVyYXRpb25zLkFMTCxcbiAgICAgICAgICBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIGFzIGFueSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25NZXRhLFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydFxuICAgICAgICApLFxuICAgICAgICAvLyBNYWluIGhhbmRsZXJzIGZvciBzZWdyZWdhdGVkIGRhdGEgb3BlcmF0aW9ucyAocHJpb3JpdHkgOTUpXG4gICAgICAgIG9uQ3JlYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUsXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25SZWFkKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25SZWFkIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblVwZGF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvbkRlbGV0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHkoLi4uZGVjcykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRGF0YShcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyID0gSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvblxuKSB7XG4gIGZ1bmN0aW9uIHByaXZhdGVEYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuUFJJVkFURSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogcHJpdmF0ZURhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gIGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlNIQVJFRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogc2hhcmVkRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBKU09OU2VyaWFsaXplcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzb3J0cyBvYmplY3Qga2V5cyB3aXRob3V0IHJlb3JkZXJpbmcgYXJyYXlzXG4gKiBAcGFyYW0ge2FueX0gb2JqIC0gVGhlIHZhbHVlIHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge2FueX0gQSBjb3B5IHdpdGggc29ydGVkIG9iamVjdCBrZXlzIGJ1dCBwcmVzZXJ2ZWQgYXJyYXkgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzT25seVJlY3Vyc2l2ZShvYmo6IGFueSk6IGFueSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoc29ydEtleXNPbmx5UmVjdXJzaXZlKTtcbiAgaWYgKG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSByZXR1cm4gb2JqO1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICAgIC5zb3J0KClcbiAgICAucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqW2tleV0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluaXN0aWMgSlNPTiBzZXJpYWxpemVyIGZvciBGYWJyaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBFbnN1cmVzIHN0YWJsZSwgZGV0ZXJtaW5pc3RpYyBKU09OIG91dHB1dCBieSBzb3J0aW5nIG9iamVjdCBrZXlzIHJlY3Vyc2l2ZWx5IGJlZm9yZSBzdHJpbmdpZmljYXRpb24sIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgRmFicmljIGVuZG9yc2VtZW50IGFuZCBoYXNoaW5nLiBFeHRlbmRzIEpTT05TZXJpYWxpemVyIHRvIHBsdWcgaW50byBleGlzdGluZyBEZWNhZiBtb2RlbCBzZXJpYWxpemF0aW9uIGZsb3cuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBEZWNhZiBNb2RlbCBzdWJ0eXBlIHNlcmlhbGl6ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICogQHBhcmFtIHt2b2lkfSBbY29uc3RydWN0b3JdIE5vIHB1YmxpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAqIEBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8TXlNb2RlbD4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCk7XG4gKiBjb25zdCByZWJ1aWx0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShqc29uKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IERTIGFzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiAgIENhbGxlci0+PkRTOiBzZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogc29ydC1rZXlzLXJlY3Vyc2l2ZVxuICogICBEUy0+PkRTOiBqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXG4gKiAgIERTLS0+PkNhbGxlcjogc3RyaW5nXG4gKiAgIENhbGxlci0+PkRTOiBkZXNlcmlhbGl6ZShzdHJpbmcpXG4gKiAgIERTLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0pIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGNvbnN0IHByZVNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHByZVNlcmlhbGl6ZShcbiAgICAgIHRoaXM6IERldGVybWluaXN0aWNTZXJpYWxpemVyPGFueT4sXG4gICAgICBvYmo6IGFueVxuICAgICk6IGFueSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcCgobykgPT4gcHJlU2VyaWFsaXplLmNhbGwoc2VsZiwgbykpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplLmNhbGwodGhpcywgb2JqKTtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplKHRvU2VyaWFsaXplW3JdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVidWlsZHMgYSBtb2RlbCBmcm9tIGEgc2VyaWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlscyB0byBwYXJzZSB0aGUgc3RyaW5nLCBvciB0byBidWlsZCB0aGUgbW9kZWxcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZSBhIG1vZGVsIGludG8gYSBkZXRlcm1pbmlzdGljIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB3aXRoIHByZVNlcmlhbGl6ZSwgc29ydHMga2V5cyByZWN1cnNpdmVseSwgYW5kIHN0cmluZ2lmaWVzIGRldGVybWluaXN0aWNhbGx5IGZvciBzdGFibGUgb3JkZXJpbmdcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZXRlcm1pbmlzdGljIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgRmFicmljIGV2ZW50IG5hbWUgZnJvbSBjb21wb25lbnRzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IG5hbWUgYnkgam9pbmluZyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lciB3aXRoIHVuZGVyc2NvcmVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvY29sbGVjdGlvbiBuYW1lXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3duZXJdIC0gT3B0aW9uYWwgb3duZXIgaWRlbnRpZmllclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGV2ZW50IG5hbWUgaW4gZm9ybWF0IFwidGFibGVfZXZlbnRcIiBvciBcInRhYmxlX2V2ZW50X293bmVyXCJcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICBvd25lcj86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0YWJsZSwgZXZlbnRdO1xuICBpZiAob3duZXIpIHBhcmFtcy5wdXNoKG93bmVyKTtcbiAgcmV0dXJuIHBhcmFtcy5qb2luKFwiX1wiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgRmFicmljIGV2ZW50IG5hbWUgaW50byBpdHMgY29tcG9uZW50c1xuICogQHN1bW1hcnkgU3BsaXRzIGFuIGV2ZW50IG5hbWUgYnkgdW5kZXJzY29yZXMgYW5kIGV4dHJhY3RzIHRhYmxlLCBldmVudCwgYW5kIG9wdGlvbmFsIG93bmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBldmVudCBuYW1lIHRvIHBhcnNlXG4gKiBAcmV0dXJuIHt7dGFibGU6IHN0cmluZywgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsIG93bmVyOiBzdHJpbmd9fSBUaGUgcGFyc2VkIGNvbXBvbmVudHMgYXMgYSBzdHJ1Y3R1cmVkIG9iamVjdFxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIGV2ZW50IG5hbWUgZm9ybWF0IGlzIGludmFsaWRcbiAqIEBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIHBhcnNlRXZlbnROYW1lXG4gKiAgIENhbGxlci0+PlBhcnNlcjogcGFyc2VFdmVudE5hbWUobmFtZSlcbiAqICAgUGFyc2VyLT4+UGFyc2VyOiBzcGxpdCBuYW1lIGJ5IFwiX1wiXG4gKiAgIGFsdCBwYXJ0cyBsZW5ndGggaW52YWxpZFxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAqICAgZWxzZVxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHsgdGFibGUsIGV2ZW50LCBvd25lcj8gfVxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKG5hbWU6IHN0cmluZyk6IHtcbiAgdGFibGU/OiBzdHJpbmc7XG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICBvd25lcj86IHN0cmluZztcbn0ge1xuICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoXCJfXCIpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKVxuICAgIHJldHVybiB7IHRhYmxlOiB1bmRlZmluZWQsIGV2ZW50OiBuYW1lLCBvd25lcjogdW5kZWZpbmVkIH07XG4gIHJldHVybiB7XG4gICAgdGFibGU6IHBhcnRzWzBdLFxuICAgIGV2ZW50OiBwYXJ0c1sxXSxcbiAgICBvd25lcjogcGFydHNbMl0sXG4gIH0gYXMge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc7XG4gICAgb3duZXI/OiBzdHJpbmc7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBhZGRpdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IEFkZHMgdHdvIG51bWJlcnMgYW5kIHZlcmlmaWVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIEZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBhZGRpdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgKyBiO1xuICBpZiAoYSAhPT0gYyAtIGIgfHwgYiAhPT0gYyAtIGEpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgQWRkaXRpb24gb3ZlcmZsb3c6ICR7YX0gKyAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgc3VidHJhY3Rpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdHMgYiBmcm9tIGEgYW5kIHZhbGlkYXRlcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNaW51ZW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFN1YnRyYWhlbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpZmZlcmVuY2UgYSAtIGJcbiAqIEBmdW5jdGlvbiBzdWJcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIHN1YnRhY3Rpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhIC0gYjtcbiAgaWYgKGEgIT09IGMgKyBiIHx8IGIgIT09IGEgLSBjKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYFN1YnRyYWN0aW9uIG92ZXJmbG93OiAke2F9IC0gJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNhZmUgSW50ZWdlciBQYXJzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2FmZVBhcnNlSW50XG4gKlxuICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBpZiBwYXJzZUludCByZXR1cm5zIE5hTlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZUludChzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBzdHJpbmcgb25seSBoYXZlIGRpZ2l0c1xuICBjb25zdCBkaWdpdFJlZ2V4ID0gL15cXGQrJC87XG4gIGlmICghZGlnaXRSZWdleC50ZXN0KHN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgY29udGFpbnMgZGlnaXRzXCIpXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXJzZWRpbnQgPSBwYXJzZUludChzdHJpbmcpO1xuICBpZiAoaXNOYU4ocGFyc2VkaW50KSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBpcyBub3QgYSBwYXJzYWJsZSBpbnRlZ2VyXCIpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkaW50O1xufVxuIiwiaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgc29ydEtleXNPbmx5UmVjdXJzaXZlIH0gZnJvbSBcIi4vRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZywgdGFibGVOYW1lPzogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIC8vIGNvbnN0IGNsYXNzTmFtZSA9IHRhYmxlTmFtZTtcbiAgICAvLyBpZiAoIWNsYXNzTmFtZSlcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuXG4gICAgLy8gLy8gdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWQgdmFsdWVzXG4gICAgLy8gY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gLy8gUG9wdWxhdGUgTW9kZWxcbiAgICAvLyBjb25zdCBwcm9jZXNzZWREZXNlYWxpemF0aW9uID0gT2JqZWN0LmtleXMobW9kZWwpLnJlZHVjZShcbiAgICAvLyAgIChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgLy8gICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAvLyAgICAgICBkZXNlcmlhbGl6YXRpb25bUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgIC8vICAgICByZXR1cm4gYWNjdW07XG4gICAgLy8gICB9LFxuICAgIC8vICAgbW9kZWxcbiAgICAvLyApO1xuXG4gICAgLy8gY29uc3QgcmVzdWx0ID0gTW9kZWwuYnVpbGQoXG4gICAgLy8gICBwcm9jZXNzZWREZXNlYWxpemF0aW9uLFxuICAgIC8vICAgY2xhc3NOYW1lXG4gICAgLy8gKSBhcyB1bmtub3duIGFzIE07XG5cbiAgICAvLyByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBkZXNlcmlhbGl6YXRpb247XG4gIH1cblxuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvciA9IHRydWUpOiBzdHJpbmcge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZShcImpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcIik7XG4gICAgY29uc3QgcHJlU2VyaWFsaXphdGlvbiA9IHRoaXMucHJlU2VyaWFsaXplKG1vZGVsLCBwdXRBbmNob3IpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHByZVNlcmlhbGl6YXRpb24pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwdXRBbmNob3IpXG4gICAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcChwcmVTZXJpYWxpemUpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplKG9iaik7XG4gICAgfVxuICAgIE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdG9TZXJpYWxpemVbcl0gPSBwcmVTZXJpYWxpemUuY2FsbCh0aGlzLCB0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENsaWVudEJhc2VkU2VydmljZSxcbiAgQ29udGV4dCxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IEZhYnJpY0NBU2VydmljZXMsIHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJQXR0cmlidXRlUmVxdWVzdCxcbiAgSWRlbnRpdHlTZXJ2aWNlLFxuICBJRW5yb2xsUmVzcG9uc2UsXG4gIElJZGVudGl0eVJlcXVlc3QsXG4gIElSZWdpc3RlclJlcXVlc3QsXG4gIElSZXZva2VSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMsIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZVJlc3BvbnNlLFxuICBGYWJyaWNJZGVudGl0eSxcbiAgR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgSWRlbnRpdHlSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9mYWJyaWMtdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSUtleVZhbHVlQXR0cmlidXRlIH0gZnJvbSBcIi4vRmFicmljRW5yb2xsbWVudFNlcnZpY2VcIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi4vY3J5cHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNJZGVudGl0eVNlcnZpY2UgZXh0ZW5kcyBDbGllbnRCYXNlZFNlcnZpY2U8XG4gIEZhYnJpY0NBU2VydmljZXMsXG4gIENBQ29uZmlnXG4+IHtcbiAgcHJvdGVjdGVkIF91c2VyITogVXNlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByb290Q2xpZW50KCk6IHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfSB7XG4gICAgcmV0dXJuICh0aGlzLmNsaWVudCBhcyBhbnkpW1wiX0ZhYnJpY0NhU2VydmljZXNcIl0gYXMgYW55O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1c2VyKCk6IFVzZXIge1xuICAgIGlmICghdGhpcy5fdXNlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIkZhYnJpYyBpZGVudGl0eSBzZXJ2aWNlIG5vdCBwcm9wZXJseSBzZXR1cDogbWlzc2luZyB1c2VyXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNlcnRpZmljYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q2xpZW50Lm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhZmZpbGlhdGlvbnMoKTogQWZmaWxpYXRpb25TZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlkZW50aXRpZXMoKTogSWRlbnRpdHlTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VXNlcihjZmc6IENBQ29uZmlnLCBjdHg6IENvbnRleHQpIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldFVzZXIpO1xuICAgIGNvbnN0IHsgY2FOYW1lLCBjYUNlcnQsIGNhS2V5LCB1cmwsIGhzbSB9ID0gY2ZnO1xuXG4gICAgbG9nLmluZm8oYENyZWF0aW5nIENBIHVzZXIgZm9yICR7Y2FOYW1lfSBhdCAke3VybH1gKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy5fdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoXCJhZG1pblwiLCBrZXksIGNlcnRpZmljYXRlLCBjYU5hbWUsIHtcbiAgICAgIGhzbSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTx7IGNvbmZpZzogQ0FDb25maWc7IGNsaWVudDogRmFicmljQ0FTZXJ2aWNlcyB9PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLklOSVRJQUxJWkFUSU9OLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3QgW2NvbmZpZ10gPSBhcmdzO1xuICAgIGlmICghY29uZmlnKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgRmFicmljIENBIGNvbmZpZ3VyYXRpb25cIik7XG5cbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IGNvbmZpZztcbiAgICBsb2cuaW5mbyhgSW5pdGlhbGl6aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjb25maWcuY2FOYW1lfSBhdCAke2NvbmZpZy51cmx9YCk7XG4gICAgY29uc3QgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG5cbiAgICBsb2cuZGVidWcoYENBIENlcnRpZmljYXRlOiAke2NlcnRpZmljYXRlLnRvU3RyaW5nKCl9YCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyKGNvbmZpZywgY3R4KTtcbiAgICBsb2cuZGVidWcoYENBIHVzZXIgbG9hZGVkOiAke3VzZXIuZ2V0TmFtZSgpfWApO1xuICAgIHJldHVybiB7XG4gICAgICBjb25maWcsXG4gICAgICBjbGllbnQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55Pik6IFByb21pc2U8c3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCB8IE1BUCxcbiAgICBkb01hcDogTUFQID0gdHJ1ZSBhcyBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT4ge1xuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgYXJncyA9IFtyZXF1ZXN0XTtcbiAgICAgIGRvTWFwID0gdHJ1ZSBhcyBNQVA7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBkb01hcCA9IHJlcXVlc3Q7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvTWFwICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgYXJncyA9IFtkb01hcCBhcyBNYXliZUNvbnRleHR1YWxBcmc8YW55PiwgLi4uYXJnc107XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5nZXRDZXJ0aWZpY2F0ZXNcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWBcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBDZXJ0aWZpY2F0ZVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgdGhpcy5jZXJ0aWZpY2F0ZXMuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHRoaXMudXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5jZXJ0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZVxuICAgICkgYXMgTUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW107XG4gIH1cblxuICBhc3luYyBnZXRJZGVudGl0aWVzKGN0eDogQ29udGV4dCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgSWRlbnRpdGllcyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0QWxsKHRoaXMudXNlcikpXG4gICAgICAucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmlkZW50aXRpZXMubGVuZ3RofSBJZGVudGl0aWVzYCk7XG4gICAgbG9nLmRlYnVnKHJlc3BvbnNlLmlkZW50aXRpZXMpO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCB0aGlzLmFmZmlsaWF0aW9ucy5nZXRBbGwodGhpcy51c2VyKSkucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmEubGVuZ3RofSBBZmZpbGlhdGlvbnNgKTtcbiAgICBsb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8RmFicmljSWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVhZFxuICAgICk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuaWRlbnRpdGllcy5nZXRPbmUoZW5yb2xsbWVudElkLCB0aGlzLnVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3RlclwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWdpc3RlclxuICAgICk7XG5cbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZ2lzdGVyKHByb3BzLCB0aGlzLnVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjdHg6IENvbnRleHRcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuaWRlbnRpdHlGcm9tRW5yb2xsbWVudCk7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5KHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXkudG9CeXRlcygpLFxuICAgICAgICByb290Q2VydGlmaWNhdGU6IHJvb3RDZXJ0aWZpY2F0ZSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVucm9sbCBhbiBpZGVudGl0eSB3aXRoIHRoZSBDQSB1c2luZyBhIHJlZ2lzdHJhdGlvbiBzZWNyZXQuXG4gICAqIEBzdW1tYXJ5IEV4Y2hhbmdlcyB0aGUgZW5yb2xsbWVudCBJRCBhbmQgc2VjcmV0IGZvciBjZXJ0aWZpY2F0ZXMsIHJldHVybmluZyBhIGNvbnN0cnVjdGVkIElkZW50aXR5IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBlbnJvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb24gLSBFbnJvbGxtZW50IHNlY3JldCByZXR1cm5lZCBhdCByZWdpc3RyYXRpb24gdGltZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIGVucm9sbChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICByZWdpc3RyYXRpb246IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmVucm9sbFxuICAgICk7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBFbnJvbGxpbmcgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5lbnJvbGwoe1xuICAgICAgICBlbnJvbGxtZW50SUQ6IGVucm9sbG1lbnRJZCxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcmVnaXN0cmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBpZGVudGl0eSA9IEZhYnJpY0lkZW50aXR5U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNvbmZpZy5jYU5hbWUsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3Rlci1lbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJBbmRFbnJvbGxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbiwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmUtZW5yb2xsIGFuIGV4aXN0aW5nIGlkZW50aXR5IHVzaW5nIGl0cyBjdXJyZW50IGVucm9sbG1lbnQuXG4gICAqIEBzdW1tYXJ5IFJlbmV3cyB0aGUgZW5yb2xsbWVudCBjZXJ0aWZpY2F0ZSBieSBjYWxsaW5nIHRoZSBDQSByZWVucm9sbC5cbiAgICogQHBhcmFtIHtVc2VyfSBjdXJyZW50VXNlciAtIEFscmVhZHkgZW5yb2xsZWQgdXNlciwgbXVzdCBoYXZlIGEgc2lnbmluZyBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSByZW5ld2VkIGlkZW50aXR5IG9iamVjdCB3aXRoIG5ldyBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUlkZW50aXR5KFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIGlkZW50aXR5OiB7IGNlcnRpZmljYXRlOiBzdHJpbmc7IHByaXZhdGVLZXk6IHN0cmluZyB9LFxuICAgIGlkZW50aXR5UmVxdWVzdDogSUlkZW50aXR5UmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVlbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudXBkYXRlSWRlbnRpdHlcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBSZW5ld2luZyBpZGVudGl0eSBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhdHRyaWJ1dGVzIGluIHRoZSBDQSByZWdpc3RyeSAoYWRtaW4gb3BlcmF0aW9uKS4gVGhpcyBjaGFuZ2VzIHRoZSBcInNvdXJjZSBvZiB0cnV0aFwiLlxuICAgICAgY29uc3QgaWRlbnRpdHlTZXJ2aWNlID0gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG5cbiAgICAgIGNvbnN0IGNhVXNlcklkZW50aXR5ID0gKGF3YWl0IGlkZW50aXR5U2VydmljZS5nZXRPbmUoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgdGhpcy51c2VyXG4gICAgICApKSBhcyB7IHJlc3VsdDogeyBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdIH0gfTtcblxuICAgICAgYXdhaXQgaWRlbnRpdHlTZXJ2aWNlLnVwZGF0ZShlbnJvbGxtZW50SWQsIGlkZW50aXR5UmVxdWVzdCwgdGhpcy51c2VyKTsgLy8gYXMgSVNlcnZpY2VSZXNwb25zZSAmIHsgcmVzdWx0OiBJSWRlbnRpdHlSZXF1ZXN0IH07XG5cbiAgICAgIC8vIFJlZW5yb2xsIGFzIHRoZSB1c2VyLiBSZXF1ZXN0IG11c3QgYmUgc2lnbmVkIHVzaW5nIHRoZSBleGlzdGluZyBjZXJ0aWZpY2F0ZS5cbiAgICAgIGNvbnN0IHJlZW5yb2xsVXNlciA9IFVzZXIuY3JlYXRlVXNlcihcbiAgICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgICBcIlwiLCAvLyBlbnJvbGxtZW50U2VjcmV0IG5vdCByZXF1aXJlZCBmb3IgcmVlbnJvbGxcbiAgICAgICAgdGhpcy51c2VyLmdldE1zcGlkKCksXG4gICAgICAgIGlkZW50aXR5LmNlcnRpZmljYXRlLFxuICAgICAgICBpZGVudGl0eS5wcml2YXRlS2V5XG4gICAgICApO1xuICAgICAgcmVlbnJvbGxVc2VyLnNldENyeXB0b1N1aXRlKHRoaXMudXNlci5nZXRDcnlwdG9TdWl0ZSgpKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudEF0dHJzOiBJQXR0cmlidXRlUmVxdWVzdFtdID0gKFxuICAgICAgICBjYVVzZXJJZGVudGl0eS5yZXN1bHQuYXR0cnMgfHwgW11cbiAgICAgICkubWFwKCh7IG5hbWUgfSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBlbnJvbGxtZW50ID0gYXdhaXQgdGhpcy5jbGllbnQucmVlbnJvbGwoXG4gICAgICAgIHJlZW5yb2xsVXNlcixcbiAgICAgICAgZW5yb2xsbWVudEF0dHJzXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZW5ld2VkSWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldm9rZSB0aGUgcHJldmlvdXMgY2VydGlmaWNhdGUgb25seSwgc28gdGhlIG9sZCBjZXJ0IGJlY29tZXMgaW52YWxpZC5cbiAgICAgIGxvZy5kZWJ1ZyhgUmV2b2tpbmcgcHJldmlvdXMgY2VydGlmaWNhdGVzIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IHsgYWtpLCBzZXJpYWwgfSA9IGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGlkZW50aXR5LmNlcnRpZmljYXRlKTtcbiAgICAgIGF3YWl0IHRoaXMucmV2b2tlKGVucm9sbG1lbnRJZCwgeyBha2ksIHNlcmlhbCB9LCBhcmdzKTtcblxuICAgICAgbG9nLmRlYnVnKGBSZW5ldyBpZGVudGl0eSBzdWNjZXNzZnVsIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIHJldHVybiByZW5ld2VkSWRlbnRpdHk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZXMgdGhlIGVucm9sbG1lbnQgb2YgYW4gaWRlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGVucm9sbG1lbnQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgLSBUaGUgZW5yb2xsbWVudCBJRCBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgcmV2b2tlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcmV2b2NhdGlvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEB0aHJvd3Mge05vdEZvdW5kRXJyb3J9IElmIHRoZSBlbnJvbGxtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSByZXZvY2F0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBhc3luYyByZXZva2UoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmV2b2tlT3B0aW9uczogT21pdDxJUmV2b2tlUmVxdWVzdCwgXCJlbnJvbGxtZW50SURcIj4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJU2VydmljZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJldm9rZVwiLCB0cnVlKSkuZm9yKHRoaXMucmV2b2tlKTtcbiAgICBsb2cudmVyYm9zZShgUmV2b2tpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgQm9vbGVhbihyZXZva2VPcHRpb25zLnNlcmlhbCkgfHwgQm9vbGVhbihyZXZva2VPcHRpb25zLmFraSlcbiAgICAgICAgICA/IFwiUmV2b2tlIFVzZXIgQ2VydGlmaWNhdGVcIlxuICAgICAgICAgIDogXCJVc2VyIERlbGV0aW9uXCI7XG5cbiAgICAgIGNvbnN0IHJldm9rZVJlcXVlc3Q6IElSZXZva2VSZXF1ZXN0ID0ge1xuICAgICAgICByZWFzb24sXG4gICAgICAgIC4uLnJldm9rZU9wdGlvbnMsXG4gICAgICAgIGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXZva2UocmV2b2tlUmVxdWVzdCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcm9sZSB0eXBlcyB1c2VkIGR1cmluZyBlbnJvbGxtZW50IGFuZCByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdGFuZGFyZCBIeXBlcmxlZGdlciBGYWJyaWMgQ0Egcm9sZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyB3aGVuIHJlZ2lzdGVyaW5nIHdpdGggdGhlIENBIHNlcnZpY2UuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIENBX1JPTEUge1xuICAvKiogQWRtaW5pc3RyYXRvciByb2xlIHdpdGggZWxldmF0ZWQgcHJpdmlsZWdlcyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhbmQgYWZmaWxpYXRpb25zICovXG4gIEFETUlOID0gXCJhZG1pblwiLFxuICAvKiogU3RhbmRhcmQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiBjbGllbnRzIGludGVyYWN0aW5nIHdpdGggdGhlIG5ldHdvcmsgKi9cbiAgVVNFUiA9IFwidXNlclwiLFxuICAvKiogQ2xpZW50IHJvbGUgdHlwaWNhbGx5IHVzZWQgZm9yIFNESy1iYXNlZCBpbnRlcmFjdGlvbnMgYW5kIHNlcnZpY2UgYWNjb3VudHMgKi9cbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRGYWJyaWNDbGllbnRGbGFnczogRmFicmljQ2xpZW50RmxhZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgZXZhbHVhdGVUaW1lb3V0OiA1LFxuICBlbmRvcnNlVGltZW91dDogMTUsXG4gIHN1Ym1pdFRpbWVvdXQ6IDUsXG4gIGNvbW1pdFRpbWVvdXQ6IDYwLFxuICBsZWdhY3k6IGZhbHNlLFxuICBhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3M6IGZhbHNlLFxuICBhbGxvd0dhdGV3YXlPdmVycmlkZTogZmFsc2UsXG4gIGFsbG93Q29udGV4dFRyYW5zaWVudE1hcDogZmFsc2UsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxuICBlbmNyeXB0VHJhbnNpZW50OiBmYWxzZSxcbiAgc3ludGhldGljRXZlbnRzOiB0cnVlLFxufSkgYXMgYW55O1xuIiwiaW1wb3J0IHsgaXNCcm93c2VyLCBNaW5pTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVJbXBvcnQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGNyZWF0ZVByaXZhdGVLZXkgfSBmcm9tIFwiY3J5cHRvXCI7XG5cbmNvbnN0IGxvZyA9IG5ldyBNaW5pTG9nZ2VyKFwiZmFicmljLWZzXCIpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMb2FkcyBjb250ZW50IGZyb20gYSBmaWxlIG9yIHJldHVybnMgdGhlIGNvbnRlbnQgaWYgYWxyZWFkeSBsb2FkZWRcbiAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgdGhlIGlucHV0IGlzIGFscmVhZHkgY29udGVudCBvciBhIHBhdGggdG8gYSBmaWxlLCBhbmQgbG9hZHMgdGhlIGZpbGUgaWYgbmVlZGVkXG4gKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnRPclBhdGggLSBUaGUgY29udGVudCBvciBwYXRoIHRvIGxvYWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbGVSZWFkZXIgLSBGdW5jdGlvbiB0byByZWFkIHRoZSBmaWxlIGlmIGNvbnRlbnRPclBhdGggaXMgYSBwYXRoXG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+fSBUaGUgY29udGVudFxuICogQGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb250ZW50T2ZMb2FkRmlsZShcbiAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgZmlsZVJlYWRlcjogKHBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCBVaW50OEFycmF5IHwgQnVmZmVyPlxuKSB7XG4gIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gIGlmIChcbiAgICBjb250ZW50T3JQYXRoLm1hdGNoKFxuICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICApXG4gIClcbiAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbVxuICogQHN1bW1hcnkgTG9hZHMgYSBmaWxlIHVzaW5nIHRoZSBOb2RlLmpzIGZpbGUgc3lzdGVtIG1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXJ9IGNvbnRlbnRPclBhdGggLSBUaGUgY29udGVudCBvciBwYXRoIHRvIGxvYWRcbiAqIEByZXR1cm4ge1Byb21pc2U8QnVmZmVyPn0gVGhlIGZpbGUgY29udGVudCBhcyBhIEJ1ZmZlclxuICogQGZ1bmN0aW9uIHJlYWRGaWxlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlsZShjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICBjb25zdCBmaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICB9O1xuXG4gIHJldHVybiBhd2FpdCBmaWxlUmVhZGVyKGNvbnRlbnRPclBhdGgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHVzZXJcbiAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgdXNlciB3aXRoIHRoZSBnaXZlbiBjcmVkZW50aWFscyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIEZhYnJpYyBDQVxuICogQHBhcmFtIHtzdHJpbmd9IHVzZXJOYW1lIC0gVGhlIHVzZXIgbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHByaXZhdGVLZXkgLSBUaGUgcHJpdmF0ZSBrZXkgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0aWZpY2F0ZSAtIFRoZSBjZXJ0aWZpY2F0ZSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gVGhlIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBJRFxuICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgdXNlclxuICogQGZ1bmN0aW9uIGdldENBVXNlclxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q0FVc2VyKFxuICB1c2VyTmFtZTogc3RyaW5nLFxuICBwcml2YXRlS2V5OiBzdHJpbmcsXG4gIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gIG1zcElkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlcj4ge1xuICBsb2cuZGVidWcoXG4gICAgYENyZWF0aW5nIGEgQ0EgJHttc3BJZH0gdXNlciAke3VzZXJOYW1lfSB3aXRoIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9YFxuICApO1xuICBjb25zdCB1c2VyID0gbmV3IFVzZXIodXNlck5hbWUpO1xuICBjb25zdCBjcnlwdG9TdWl0ZSA9IFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgdXNlci5zZXRDcnlwdG9TdWl0ZShjcnlwdG9TdWl0ZSk7XG4gIGNvbnN0IGltcG9ydGVkS2V5ID0gY3J5cHRvU3VpdGUuY3JlYXRlS2V5RnJvbVJhdyhwcml2YXRlS2V5KTtcbiAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGltcG9ydGVkS2V5LCBjZXJ0aWZpY2F0ZSwgbXNwSWQpO1xuICByZXR1cm4gdXNlcjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyBhbiBpZGVudGl0eSBmcm9tIGEgY2VydGlmaWNhdGUgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIGNlcnRpZmljYXRlIGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYW4gSWRlbnRpdHkgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcGFyYW0ge3N0cmluZ30gY2VydERpcmVjdG9yeVBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGVcbiAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgaWRlbnRpdHlcbiAqIEBmdW5jdGlvbiBnZXRJZGVudGl0eVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SWRlbnRpdHkoXG4gIG1zcElkOiBzdHJpbmcsXG4gIGNlcnREaXJlY3RvcnlQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8SWRlbnRpdHk+IHtcbiAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3QgY2VydFBhdGggPSBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoY2VydFBhdGgpO1xuICAgIHJldHVybiBjcmVkZW50aWFscztcbiAgfTtcblxuICBjb25zdCBjcmVkZW50aWFsczogVWludDhBcnJheSA9IChhd2FpdCBjb250ZW50T2ZMb2FkRmlsZShcbiAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICBpZGVudGl0eUZpbGVSZWFkZXJcbiAgKSkgYXMgVWludDhBcnJheTtcblxuICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlIGluIGEgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBSZWFkcyBhIGRpcmVjdG9yeSBhbmQgcmV0dXJucyB0aGUgcGF0aCB0byB0aGUgZmlyc3QgZmlsZSBmb3VuZFxuICogQHBhcmFtIHtzdHJpbmd9IGRpclBhdGggLSBQYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlyc3QgZmlsZVxuICogQGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWUoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgY29uc3QgeyBqb2luIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwicGF0aFwiKSk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvbWlzZXMucmVhZGRpcihkaXJQYXRoKTtcbiAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlIGluIGEgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBSZWFkcyBhIGRpcmVjdG9yeSwgZmluZHMgdGhlIGZpcnN0IGZpbGUsIGFuZCByZXR1cm5zIGl0cyBjb250ZW50IGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29udGVudCBvZiB0aGUgZmlyc3QgZmlsZVxuICogQGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChcbiAgZGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pKSkudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyBhIHNpZ25lciBmcm9tIGEga2V5IGRpcmVjdG9yeVxuICogQHN1bW1hcnkgTG9hZHMgYSBwcml2YXRlIGtleSBmcm9tIGEgZGlyZWN0b3J5IGFuZCBjcmVhdGVzIGEgU2lnbmVyIGZvciBGYWJyaWMgdHJhbnNhY3Rpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleVxuICogQHJldHVybiB7UHJvbWlzZTxTaWduZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgc2lnbmVyXG4gKiBAZnVuY3Rpb24gZ2V0U2lnbmVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgY29uc3Qgc2lnbmVyRmlsZVJlYWRlciA9IGFzeW5jIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShrZXlQYXRoKTtcbiAgfTtcblxuICBjb25zdCBwcml2YXRlS2V5UGVtID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgc2lnbmVyRmlsZVJlYWRlclxuICApKSBhcyBCdWZmZXI7XG5cbiAgbGV0IGs7XG4gIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgIC8vIHdlYiBiYXNlZCBpbXBsZW1lbnRhdGlvblxuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCBleHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhwcml2YXRlS2V5KTtcbiAgICBrID0gKHByaXZhdGVLZXkgYXMgYW55KVtrZXlzWzBdXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBOb2RlIGJhc2VkIGltcGxlbWVudGF0aW9uXG4gICAgayA9IGNyZWF0ZVByaXZhdGVLZXkocHJpdmF0ZUtleVBlbSk7XG4gIH1cblxuICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0cmFjdHMgYSBwcml2YXRlIGtleSBmcm9tIGEgUEVNIGJ1ZmZlclxuICogQHN1bW1hcnkgQ29udmVydHMgYSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleSB0byBhIENyeXB0b0tleSBvYmplY3RcbiAqIEBwYXJhbSB7QnVmZmVyfSBwZW0gLSBUaGUgUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAqIEByZXR1cm4ge1Byb21pc2U8Q3J5cHRvS2V5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIENyeXB0b0tleVxuICogQGZ1bmN0aW9uIGV4dHJhY3RQcml2YXRlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBFeHRyYWN0UHJpdmF0ZUtleVxuICogICBwYXJ0aWNpcGFudCBTdWJ0bGVDcnlwdG9cbiAqXG4gKiAgIENhbGxlci0+PkV4dHJhY3RQcml2YXRlS2V5OiBleHRyYWN0UHJpdmF0ZUtleShwZW0pXG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IEdldCBTdWJ0bGVDcnlwdG8gaW1wbGVtZW50YXRpb25cbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogUGFyc2UgUEVNIGZvcm1hdFxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBDb252ZXJ0IHRvIGJpbmFyeSBERVJcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5TdWJ0bGVDcnlwdG86IGltcG9ydEtleShwa2NzOCwgYmluYXJ5RGVyLCBvcHRpb25zKVxuICogICBTdWJ0bGVDcnlwdG8tLT4+RXh0cmFjdFByaXZhdGVLZXk6IENyeXB0b0tleVxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0tPj5DYWxsZXI6IENyeXB0b0tleVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFByaXZhdGVLZXkocGVtOiBCdWZmZXIpIHtcbiAgLy8gY29uc3QgbGliTmFtZSA9IFwibm9kZTpjcnlwdG9cIjtcbiAgbGV0IHN1YnRsZTtcbiAgLy8gaWYgKGlzQnJvd3NlcigpKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgc3VidGxlID0gKGdsb2JhbFRoaXMgYXMgYW55KS5jcnlwdG8uc3VidGxlO1xuICAvLyB9IGVsc2Uge1xuICAvLyAgIGNvbnN0IGxpYiA9IChhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KGxpYk5hbWUpKSkgYXMgYW55O1xuICAvLyAgIHN1YnRsZSA9IGxpYi5zdWJ0bGUgfHwgbGliLndlYmNyeXB0by5zdWJ0bGU7XG4gIC8vIH1cblxuICBpZiAoIXN1YnRsZSkgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGxvYWQgU3VidGxlQ3J5cHRvIG1vZHVsZVwiKTtcblxuICBmdW5jdGlvbiBzdHIyYWIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgY29uc3Qgc3RyID0gcGVtXG4gICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAucmVwbGFjZShcIi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIik7XG4gIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICBjb25zdCBiaW5hcnlEZXIgPSBzdHIyYWIoZGVjb2RlZCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBDTElFTlRfT1ZFUlJJREVfS0VZUzogKGtleW9mIEZhYnJpY0NsaWVudEZsYWdzKVtdID0gW1xuICBcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIsXG5dO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGYWJyaWMgY2xpZW50IGNvbnRleHQgd2l0aCBhIGNvbnN0cmFpbmVkIG92ZXJyaWRlIHN1cmZhY2VcbiAqIEBzdW1tYXJ5IFJlc3RyaWN0cyB3aGljaCBjYWNoZWQgdmFsdWVzIGFyZSBwcm9wYWdhdGVkIHRvIGNoaWxkIGNvbnRleHRzIG9yIHNlbnRcbiAqIGJhY2sgYXMgb3ZlcnJpZGVzIHNvIG9ubHkgaW50ZW50aW9uYWwgY2xpZW50IGZsYWdzIGFyZSBmb3J3YXJkZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnRDb250ZXh0IGV4dGVuZHMgQ29udGV4dDxGYWJyaWNDbGllbnRGbGFncz4ge1xuICBjb25zdHJ1Y3RvcihjdHg/OiBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPikge1xuICAgIHN1cGVyKGN0eCk7XG4gIH1cblxuICBvdmVycmlkZSB0b092ZXJyaWRlcygpOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPiB7XG4gICAgY29uc3Qgb3ZlcnJpZGVzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIENMSUVOVF9PVkVSUklERV9LRVlTKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0T3JVbmRlZmluZWQoa2V5KTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgb3ZlcnJpZGVzW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG92ZXJyaWRlcztcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQWRhcHRlckZsYWdzLFxuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgT3BlcmF0b3IsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFByZXBhcmVkU3RhdGVtZW50LFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIFF1ZXJ5Q2xhdXNlLFxuICBRdWVyeUVycm9yLFxuICBSZXBvc2l0b3J5LFxuICBTZWxlY3RTZWxlY3RvcixcbiAgU2VxdWVuY2UsXG4gIFN0YXRlbWVudCxcbiAgU3RhdGVtZW50RXhlY3V0b3IsXG4gIFZpZXdLaW5kLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudENvbnRleHQgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQge1xuICBDb3VjaERCS2V5cyxcbiAgQ291Y2hEQk9wZXJhdG9yLFxuICBDb3VjaERCR3JvdXBPcGVyYXRvcixcbiAgQ291Y2hEQlF1ZXJ5TGltaXQsXG4gIE1hbmdvUXVlcnksXG4gIE1hbmdvT3BlcmF0b3IsXG4gIE1hbmdvU2VsZWN0b3IsXG4gIHRyYW5zbGF0ZU9wZXJhdG9ycyxcbiAgZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lLFxuICBnZW5lcmF0ZVZpZXdOYW1lLFxuICBmaW5kVmlld01ldGFkYXRhLFxuICBDb3VjaERCVmlld01ldGFkYXRhLFxuICBWaWV3UmVzcG9uc2UsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcbmltcG9ydCB7IHRvQ2FtZWxDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBEQktleXMsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbnR5cGUgRmFicmljVmlld0Rlc2NyaXB0b3IgPSB7XG4gIGRkb2M6IHN0cmluZztcbiAgdmlldzogc3RyaW5nO1xuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufTtcblxudHlwZSBGYWJyaWNBZ2dyZWdhdGVJbmZvID1cbiAgfCB7XG4gICAgICBraW5kOiBWaWV3S2luZDtcbiAgICAgIG1ldGE6IENvdWNoREJWaWV3TWV0YWRhdGE7XG4gICAgICBkZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICAgIGNvdW50RGlzdGluY3Q/OiBib29sZWFuO1xuICAgIH1cbiAgfCB7XG4gICAgICBraW5kOiBcImF2Z1wiO1xuICAgICAgYXR0cmlidXRlOiBzdHJpbmc7XG4gICAgICBzdW1EZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICAgIGNvdW50RGVzY3JpcHRvcjogRmFicmljVmlld0Rlc2NyaXB0b3I7XG4gICAgfTtcblxuY29uc3QgZXNjYXBlUmVnRXhwID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpO1xuXG5mdW5jdGlvbiBuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXFx1MDAwMFwiO1xuICBjb25zdCBjaGFycyA9IEFycmF5LmZyb20odmFsdWUpO1xuICBmb3IgKGxldCBpID0gY2hhcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhcnNbaV0uY29kZVBvaW50QXQoMCk7XG4gICAgaWYgKGNvZGUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKGNvZGUgPCAweDEwZmZmZikge1xuICAgICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlICsgMSk7XG4gICAgICByZXR1cm4gY2hhcnMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCJcIik7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHt2YWx1ZX1cXHUwMDAwYDtcbn1cblxuZnVuY3Rpb24gcHJlZml4UmFuZ2UocHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogcHJlZml4LFxuICAgIGVuZDogbmV4dExleGljb2dyYXBoaWNTdHJpbmcocHJlZml4KSxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBNLFxuICBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICBSLFxuICBNYW5nb1F1ZXJ5XG4+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogRmFicmljQ2xpZW50QWRhcHRlciwgb3ZlcnJpZGVzPzogUGFydGlhbDxBZGFwdGVyRmxhZ3M+KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzcXVhc2goXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNxdWFzaGVkOiBQcmVwYXJlZFN0YXRlbWVudDxNPiB8IHVuZGVmaW5lZCA9IHN1cGVyLnNxdWFzaChcbiAgICAgIGN0eCBhcyBuZXZlclxuICAgICk7XG4gICAgaWYgKCFzcXVhc2hlZCkgcmV0dXJuIHNxdWFzaGVkO1xuXG4gICAgY29uc3QgeyBtZXRob2QsIHBhcmFtcywgYXJncyB9ID0gc3F1YXNoZWQ7XG4gICAgY29uc3QgeyBkaXJlY3Rpb24sIGxpbWl0IH0gPSBwYXJhbXM7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQ6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRTpcbiAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbiwgbGltaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlk6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWTpcbiAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWTpcbiAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbiwgbGltaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBVbnN1cHBvcnRlZCBtZXRob2QgJHttZXRob2R9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNxdWFzaGVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGV4ZWN1dGVQcmVwYXJlZChcbiAgICAuLi5hcmd6OiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwodGhpcy5mcm9tU2VsZWN0b3IsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgY29uc3QgeyBtZXRob2QsIGFyZ3MgfSA9IHRoaXMucHJlcGFyZWQgYXMgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PjtcbiAgICByZXR1cm4gcmVwby5zdGF0ZW1lbnQobWV0aG9kLCAuLi5hcmdzLCAuLi5hcmd6KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHByZXBhcmUoXG4gICAgY3R4PzogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBQcm9taXNlPFN0YXRlbWVudEV4ZWN1dG9yPE0sIFI+PiB7XG4gICAgY3R4ID1cbiAgICAgIGN0eCB8fFxuICAgICAgKGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgICAgICBQZXJzaXN0ZW5jZUtleXMuUVVFUlksXG4gICAgICAgIHRoaXMub3ZlcnJpZGVzIHx8IHt9LFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgKSk7XG5cbiAgICBpZiAoIWN0eCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJObyBjb250ZXh0IGF2YWlsYWJsZSBmb3Igc3RhdGVtZW50XCIpO1xuXG4gICAgaWYgKHRoaXMuaXNTaW1wbGVRdWVyeSgpICYmIGN0eC5nZXQoXCJmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzXCIpKSB7XG4gICAgICBjb25zdCBzcXVhc2hlZCA9IHRoaXMuc3F1YXNoKGN0eCk7XG4gICAgICBpZiAoc3F1YXNoZWQpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlZCA9IHNxdWFzaGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJnczogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdO1xuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge30gYXMgYW55O1xuXG4gICAgY29uc3QgcHJlcGFyZWQ6IFByZXBhcmVkU3RhdGVtZW50PGFueT4gPSB7XG4gICAgICBjbGFzczogdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBhcmdzLFxuICAgICAgcGFyYW1zLFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgbWV0aG9kOiBzdHJpbmdbXSA9IFtRdWVyeUNsYXVzZS5GSU5EX0JZXTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnByZXBhcmVDb25kaXRpb24odGhpcy53aGVyZUNvbmRpdGlvbiwgY3R4IGFzIG5ldmVyKTtcbiAgICAgIG1ldGhvZC5wdXNoKHBhcnNlZC5tZXRob2QpO1xuICAgICAgaWYgKHBhcnNlZC5hcmdzICYmIHBhcnNlZC5hcmdzLmxlbmd0aClcbiAgICAgICAgYXJncy5wdXNoKC4uLihwYXJzZWQuYXJncyBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKVxuICAgICAgbWV0aG9kLnB1c2goXG4gICAgICAgIFF1ZXJ5Q2xhdXNlLlNFTEVDVCxcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5qb2luKGAgJHtRdWVyeUNsYXVzZS5BTkQudG9Mb3dlckNhc2UoKX0gYClcbiAgICAgICk7XG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9ycz8ubGVuZ3RoKSB7XG4gICAgICBtZXRob2QucHVzaChRdWVyeUNsYXVzZS5PUkRFUl9CWSwgdGhpcy5vcmRlckJ5U2VsZWN0b3JzWzBdWzBdIGFzIHN0cmluZyk7XG4gICAgICBhcmdzLnB1c2godGhpcy5vcmRlckJ5U2VsZWN0b3JzWzBdWzFdIGFzIGFueSk7XG4gICAgfVxuICAgIHByZXBhcmVkLm1ldGhvZCA9IHRvQ2FtZWxDYXNlKG1ldGhvZC5qb2luKFwiIFwiKSk7XG4gICAgcHJlcGFyZWQucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMucHJlcGFyZWQgPSBwcmVwYXJlZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGEgcmVjb3JkIGZyb20gQ291Y2hEQi9GYWJyaWNcbiAgICogQHN1bW1hcnkgRXh0cmFjdHMgdGhlIElEIGZyb20gYSBDb3VjaERCIGRvY3VtZW50IGFuZCByZXZlcnRzIGl0IHRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcm9jZXNzUmVjb3JkKFxuICAgIHJlY29yZDogYW55LFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBNIHtcbiAgICBjb25zdCBwa0F0dHIgPSBNb2RlbC5wayh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLmdldChcbiAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5JRCwgcGtBdHRyIGFzIHN0cmluZylcbiAgICApPy50eXBlO1xuXG4gICAgaWYgKHJlY29yZFtDb3VjaERCS2V5cy5JRF0pIHtcbiAgICAgIGNvbnN0IFssIC4uLmtleUFyZ3NdID0gcmVjb3JkW0NvdWNoREJLZXlzLklEXS5zcGxpdChDb3VjaERCS2V5cy5TRVBBUkFUT1IpO1xuICAgICAgY29uc3QgaWQgPSBrZXlBcmdzLmpvaW4oXCJfXCIpO1xuICAgICAgcmVjb3JkW3BrQXR0cl0gPSBTZXF1ZW5jZS5wYXJzZVZhbHVlKHR5cGUgYXMgYW55LCBpZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NSZWNvcmQocmVjb3JkLCBjdHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBNYW5nbyBxdWVyeVxuICAgKiBAc3VtbWFyeSBTZW5kcyBhIHJhdyBNYW5nbyBxdWVyeSB0byBGYWJyaWMgYW5kIHByb2Nlc3NlcyB0aGUgcmVzdWx0c1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG4gICAgY29uc3QgYWdncmVnYXRvciA9IChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGVJbmZvO1xuICAgIGlmICgocmF3SW5wdXQgYXMgYW55KT8uYWdncmVnYXRlICYmIGFnZ3JlZ2F0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBZ2dyZWdhdGU8Uj4oYWdncmVnYXRvciwgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KFxuICAgICAgcmF3SW5wdXQsXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBjdHhcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBwcm9jZXNzZWQgPSByZXN1bHRzLm1hcCgocikgPT4gdGhpcy5wcm9jZXNzUmVjb3JkKHIsIGN0eCkpO1xuICAgICAgaWYgKCFjdHguZ2V0T3JVbmRlZmluZWQoXCJhZnRlclF1ZXJ5SGFuZGxlcnNcIikpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZCBhcyB1bmtub3duIGFzIFI7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQocHJvY2Vzc2VkLCBjdHgpKSBhcyBSO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cyBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IGZyb20gdGhlIHN0YXRlbWVudFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3MgY29uZGl0aW9ucywgc2VsZWN0b3JzLCBhbmQgb3B0aW9ucyBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkKCk6IE1hbmdvUXVlcnkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCBhZ2dyZWdhdGVRdWVyeSA9IHRoaXMuYnVpbGRBZ2dyZWdhdGVRdWVyeSgpO1xuICAgIGlmIChhZ2dyZWdhdGVRdWVyeSkgcmV0dXJuIGFnZ3JlZ2F0ZVF1ZXJ5O1xuICAgIGNvbnN0IHNlbGVjdG9yczogTWFuZ29TZWxlY3RvciA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBxdWVyeTogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHNlbGVjdG9ycyB9O1xuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKSBxdWVyeS5maWVsZHMgPSB0aGlzLnNlbGVjdFNlbGVjdG9yIGFzIHN0cmluZ1tdO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbjogTWFuZ29TZWxlY3RvciA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIENvbmRpdGlvbi5hbmQoXG4gICAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgICBDb25kaXRpb24uYXR0cmlidXRlPE0+KENvdWNoREJLZXlzLlRBQkxFIGFzIGtleW9mIE0pLmVxKFxuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3JbQ291Y2hEQktleXMuVEFCTEVdXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgc2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uKSBhcyBNYW5nb09wZXJhdG9yW107XG4gICAgICBpZiAoXG4gICAgICAgIHNlbGVjdG9yS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhDb3VjaERCR3JvdXBPcGVyYXRvcikuaW5kZXhPZihzZWxlY3RvcktleXNbMF0pICE9PSAtMVxuICAgICAgKVxuICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yS2V5c1swXSkge1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIC4uLk9iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gYXMgTWFuZ29TZWxlY3RvclxuICAgICAgICAgICAgICApLnJlZHVjZSgoYWNjdW06IE1hbmdvU2VsZWN0b3JbXSwgdmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiVG9vIG1hbnkga2V5cyBpbiBxdWVyeSBzZWxlY3Rvci4gc2hvdWxkIGJlIG9uZVwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQpXG4gICAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKC4uLih2YWxba10gYXMgYW55W10pKTtcbiAgICAgICAgICAgICAgICBlbHNlIGFjY3VtLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICAgIH0sIFtdKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IGNvbmRpdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuT1I6IHtcbiAgICAgICAgICAgIGNvbnN0IHM6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgIHNbQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhxdWVyeS5zZWxlY3RvcikubWFwKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKHF1ZXJ5LnNlbGVjdG9yW2tleV0pXG4gICAgICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAgICAgYEEgJHtrZXl9IHF1ZXJ5IHBhcmFtIGlzIGFib3V0IHRvIGJlIG92ZXJyaWRkZW46ICR7cXVlcnkuc2VsZWN0b3Jba2V5XX0gYnkgJHt2YWx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldID0gdmFsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIHF1ZXJ5LnNvcnQgPSBxdWVyeS5zb3J0IHx8IFtdO1xuICAgICAgcXVlcnkuc2VsZWN0b3IgPSBxdWVyeS5zZWxlY3RvciB8fCAoe30gYXMgTWFuZ29TZWxlY3Rvcik7XG4gICAgICBmb3IgKGNvbnN0IFtzZWxlY3RvcktleSwgZGlyZWN0aW9uXSBvZiB0aGlzLm9yZGVyQnlTZWxlY3RvcnMpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RvcktleSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHJlYzogUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+ID0ge307XG4gICAgICAgIHJlY1tzZWxlY3Rvcl0gPSBkaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb247XG4gICAgICAgIChxdWVyeS5zb3J0IGFzIFJlY29yZDxzdHJpbmcsIE9yZGVyRGlyZWN0aW9uPltdKS5wdXNoKHJlYyk7XG4gICAgICAgIGlmICghcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdKSB7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgICAgICAocXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJdID1cbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxdWVyeS5saW1pdCA9IHRoaXMubGltaXRTZWxlY3RvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBObyBsaW1pdCBzZWxlY3RvciBkZWZpbmVkLiBVc2luZyBkZWZhdWx0IGNvdWNoZGIgbGltaXQgb2YgJHtDb3VjaERCUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcXVlcnkubGltaXQgPSBDb3VjaERCUXVlcnlMaW1pdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vZmZzZXRTZWxlY3RvcikgcXVlcnkuc2tpcCA9IHRoaXMub2Zmc2V0U2VsZWN0b3I7XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBhIENvdWNoREIgTWFuZ28gcXVlcnkgc2VsZWN0b3Igc3RydWN0dXJlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBNYW5nb1F1ZXJ5IHtcbiAgICBmdW5jdGlvbiBtZXJnZShcbiAgICAgIG9wOiBNYW5nb09wZXJhdG9yLFxuICAgICAgb2JqMTogTWFuZ29TZWxlY3RvcixcbiAgICAgIG9iajI6IE1hbmdvU2VsZWN0b3JcbiAgICApOiBNYW5nb1F1ZXJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHt9IGFzIE1hbmdvU2VsZWN0b3IgfTtcbiAgICAgIHJlc3VsdC5zZWxlY3RvcltvcF0gPSBbb2JqMSwgb2JqMl07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5TVEFSVFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIGlmICh0eXBlb2YgY29tcGFyaXNvbiAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJTVEFSVFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgcmFuZ2UgPSBwcmVmaXhSYW5nZShjb21wYXJpc29uKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHNlbGVjdG9yW2F0dHIxXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJfRVFdID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAoc2VsZWN0b3JbYXR0cjFdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5TTUFMTEVSXSA9IHJhbmdlLmVuZDtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5FTkRTX1dJVEgpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cjEgIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkVORFNfV0lUSCByZXF1aXJlcyBhIHN0cmluZyBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge1xuICAgICAgICBbQ291Y2hEQk9wZXJhdG9yLlJFR0VYUF06IGAke2VzY2FwZVJlZ0V4cChjb21wYXJpc29uKX0kYCxcbiAgICAgIH0gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIHJldHVybiB7IHNlbGVjdG9yIH07XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5CRVRXRUVOKSB7XG4gICAgICBjb25zdCBhdHRyID0gYXR0cjEgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbXBhcmlzb24pIHx8IGNvbXBhcmlzb24ubGVuZ3RoICE9PSAyKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkJFVFdFRU4gb3BlcmF0b3IgcmVxdWlyZXMgW21pbiwgbWF4XSBjb21wYXJpc29uXCIpO1xuICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGNvbXBhcmlzb247XG4gICAgICBjb25zdCBvcEJldHdlZW46IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BCZXR3ZWVuW2F0dHJdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcEJldHdlZW5bYXR0cl0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5CSUdHRVJfRVEpXG4gICAgICBdID0gbWluO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLlNNQUxMRVJfRVEpXG4gICAgICBdID0gbWF4O1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wQmV0d2VlbiB9O1xuICAgIH1cblxuICAgIGxldCBvcDogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICBvcFthdHRyMSBhcyBzdHJpbmddID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFthdHRyMSBhcyBzdHJpbmddIGFzIE1hbmdvU2VsZWN0b3IpW3RyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcildID1cbiAgICAgICAgY29tcGFyaXNvbjtcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIG9wID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yIGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgKGF0dHIxIGFzIHVua25vd24gYXMgeyBhdHRyMTogc3RyaW5nIH0pLmF0dHIxXG4gICAgICBdID0gY29tcGFyaXNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3AxOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBjb25zdCBvcDI6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oY29tcGFyaXNvbiBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgb3AgPSBtZXJnZSh0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpLCBvcDEsIG9wMikuc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhbiBhZ2dyZWdhdGUgcXVlcnkgaWYgYWdncmVnYXRpb24gaXMgcmVxdWVzdGVkXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBmb3IgYWdncmVnYXRlIG9wZXJhdGlvbnMgYW5kIHJldHVybnMgYSBzcGVjaWFsIE1hbmdvUXVlcnkgZm9yIHRoZW1cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBZ2dyZWdhdGVRdWVyeSgpOiBNYW5nb1F1ZXJ5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmF2Z1NlbGVjdG9yKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBTdHJpbmcodGhpcy5hdmdTZWxlY3Rvcik7XG4gICAgICBjb25zdCBzdW1JbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwic3VtXCIsIGF0dHJpYnV0ZSk7XG4gICAgICBjb25zdCBjb3VudEluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJjb3VudFwiLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKCFzdW1JbmZvIHx8ICFjb3VudEluZm8pXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICAgIGBBdmcgb3BlcmF0aW9uIHJlcXVpcmVzIHN1bSBhbmQgY291bnQgdmlld3MgZm9yIGF0dHJpYnV0ZSAke2F0dHJpYnV0ZX1gXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeSh7XG4gICAgICAgIGtpbmQ6IFwiYXZnXCIsXG4gICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgc3VtRGVzY3JpcHRvcjogc3VtSW5mby5kZXNjcmlwdG9yLFxuICAgICAgICBjb3VudERlc2NyaXB0b3I6IGNvdW50SW5mby5kZXNjcmlwdG9yLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgYXR0cmlidXRlID1cbiAgICAgICAgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgPT0gbnVsbFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBTdHJpbmcodGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IpO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImRpc3RpbmN0XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbmZvLmNvdW50RGlzdGluY3QgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZ2dyZWdhdGVRdWVyeShpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yVXNlZCA9XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICB0eXBlb2YgdGhpcy5jb3VudERpc3RpbmN0U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICEhdGhpcy5taW5TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLm1heFNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMuc3VtU2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5kaXN0aW5jdFNlbGVjdG9yO1xuXG4gICAgY29uc3QgYWdncmVnYXRvckNoZWNrczogQXJyYXk8W1ZpZXdLaW5kLCBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZF0+ID0gW1xuICAgICAgW1xuICAgICAgICBcImNvdW50XCIsXG4gICAgICAgICh0aGlzLmNvdW50U2VsZWN0b3IgPz8gdW5kZWZpbmVkKSBhcyBTZWxlY3RTZWxlY3RvcjxNPiB8IHVuZGVmaW5lZCxcbiAgICAgIF0sXG4gICAgICBbXCJtYXhcIiwgdGhpcy5tYXhTZWxlY3Rvcl0sXG4gICAgICBbXCJtaW5cIiwgdGhpcy5taW5TZWxlY3Rvcl0sXG4gICAgICBbXCJzdW1cIiwgdGhpcy5zdW1TZWxlY3Rvcl0sXG4gICAgICBbXCJkaXN0aW5jdFwiLCB0aGlzLmRpc3RpbmN0U2VsZWN0b3JdLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IFtraW5kLCBzZWxlY3Rvcl0gb2YgYWdncmVnYXRvckNoZWNrcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gc2VsZWN0b3IgPyBTdHJpbmcoc2VsZWN0b3IpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihraW5kLCBhdHRyaWJ1dGUpO1xuICAgICAgaWYgKGluZm8pIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgIH1cblxuICAgIGlmIChhZ2dyZWdhdG9yVXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgIGBObyBDb3VjaERCIHZpZXcgbWV0YWRhdGEgZm91bmQgZm9yIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKFxuICAgICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICAgICl9IGFnZ3JlZ2F0b3JgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yIGZvciBhIHZpZXctYmFzZWQgYWdncmVnYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcbiAgICBraW5kOiBWaWV3S2luZCxcbiAgICBhdHRyaWJ1dGU/OiBzdHJpbmdcbiAgKTogRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuZnJvbVNlbGVjdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGFzID0gZmluZFZpZXdNZXRhZGF0YSh0aGlzLmZyb21TZWxlY3Rvciwga2luZCwgYXR0cmlidXRlKTtcbiAgICBpZiAoIW1ldGFzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhID0gbWV0YXNbMF07XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCB2aWV3TmFtZSA9IGdlbmVyYXRlVmlld05hbWUodGFibGVOYW1lLCBtZXRhLmF0dHJpYnV0ZSwga2luZCwgbWV0YSk7XG4gICAgY29uc3QgZGRvYyA9IG1ldGEuZGRvYyB8fCBnZW5lcmF0ZURlc2lnbkRvY05hbWUodGFibGVOYW1lLCB2aWV3TmFtZSk7XG4gICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIHJlZHVjZTogbWV0YS5yZWR1Y2UgIT09IHVuZGVmaW5lZCA/IHRydWUgOiAhbWV0YS5yZXR1cm5Eb2NzLFxuICAgIH07XG4gICAgaWYgKGtpbmQgPT09IFwiZGlzdGluY3RcIiB8fCBraW5kID09PSBcImdyb3VwQnlcIikgb3B0aW9ucy5ncm91cCA9IHRydWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQsXG4gICAgICBtZXRhLFxuICAgICAgZGVzY3JpcHRvcjoge1xuICAgICAgICBkZG9jLFxuICAgICAgICB2aWV3OiB2aWV3TmFtZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgc3BlY2lhbCBhZ2dyZWdhdGUgTWFuZ29RdWVyeSBtYXJrZXJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQWdncmVnYXRlUXVlcnkoXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mb1xuICApOiBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdG9yOiB7fSxcbiAgICAgIGFnZ3JlZ2F0ZTogdHJ1ZSxcbiAgICAgIGFnZ3JlZ2F0ZUluZm86IGluZm8sXG4gICAgfSBhcyBNYW5nb1F1ZXJ5ICYgeyBhZ2dyZWdhdGU6IHRydWU7IGFnZ3JlZ2F0ZUluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlciBjYXN0IHRvIEZhYnJpY0NsaWVudEFkYXB0ZXIgZm9yIHZpZXcgYWNjZXNzXG4gICAqL1xuICBwcml2YXRlIGdldEZhYnJpY0FkYXB0ZXIoKTogRmFicmljQ2xpZW50QWRhcHRlciB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlciBhcyBGYWJyaWNDbGllbnRBZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhbiBhZ2dyZWdhdGUgcXVlcnkgdmlhIGFkYXB0ZXIncyB2aWV3IG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQWdncmVnYXRlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmICghdGhpcy5pc1ZpZXdBZ2dyZWdhdGUoaW5mbykpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUF2ZXJhZ2U8Uj4oaW5mbywgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IHZpZXdJbmZvID0gaW5mbyBhcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT47XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3IuZGRvYyxcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3IudmlldyxcbiAgICAgIHZpZXdJbmZvLmRlc2NyaXB0b3Iub3B0aW9ucyxcbiAgICAgIGN0eFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihpbmZvLCByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgYXZlcmFnZSBjYWxjdWxhdGlvbiBmcm9tIHN1bSBhbmQgY291bnQgdmlld3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQXZlcmFnZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBQcm9taXNlPFI+IHtcbiAgICBpZiAoaW5mby5raW5kICE9PSBcImF2Z1wiKVxuICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJBdmVyYWdlIGRlc2NyaXB0b3IgaXMgbm90IHZhbGlkXCIpO1xuICAgIGNvbnN0IGZhYnJpY0FkYXB0ZXIgPSB0aGlzLmdldEZhYnJpY0FkYXB0ZXIoKTtcbiAgICBjb25zdCBbc3VtRGVzYywgY291bnREZXNjXSA9IFtpbmZvLnN1bURlc2NyaXB0b3IsIGluZm8uY291bnREZXNjcmlwdG9yXTtcbiAgICBjb25zdCBbc3VtUmVzcG9uc2UsIGNvdW50UmVzcG9uc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIHN1bURlc2MuZGRvYyxcbiAgICAgICAgc3VtRGVzYy52aWV3LFxuICAgICAgICBzdW1EZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICAgIGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgICBjb3VudERlc2MuZGRvYyxcbiAgICAgICAgY291bnREZXNjLnZpZXcsXG4gICAgICAgIGNvdW50RGVzYy5vcHRpb25zLFxuICAgICAgICBjdHhcbiAgICAgICksXG4gICAgXSk7XG4gICAgY29uc3Qgc3VtID0gc3VtUmVzcG9uc2Uucm93cz8uWzBdPy52YWx1ZSA/PyAwO1xuICAgIGNvbnN0IGNvdW50ID0gY291bnRSZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgaWYgKCFjb3VudCkgcmV0dXJuIDAgYXMgdW5rbm93biBhcyBSO1xuICAgIHJldHVybiAoc3VtIC8gY291bnQpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIHRoZSB2aWV3IHJlc3BvbnNlIGJhc2VkIG9uIGFnZ3JlZ2F0ZSBraW5kXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NWaWV3UmVzcG9uc2U8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICByZXNwb25zZTogVmlld1Jlc3BvbnNlXG4gICk6IFIge1xuICAgIGlmIChpbmZvLmtpbmQgPT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgXCJBdmVyYWdlIHJlc3VsdHMgc2hvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIHByb2Nlc3Npbmcgcm93c1wiXG4gICAgICApO1xuICAgIGNvbnN0IHJvd3MgPSByZXNwb25zZS5yb3dzIHx8IFtdO1xuICAgIGNvbnN0IHZpZXdJbmZvID0gaW5mbyBhcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT47XG4gICAgY29uc3QgbWV0YSA9IHZpZXdJbmZvLm1ldGE7XG4gICAgaWYgKHZpZXdJbmZvLmNvdW50RGlzdGluY3QpIHtcbiAgICAgIHJldHVybiAocm93cy5sZW5ndGggfHwgMCkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAodmlld0luZm8ua2luZCA9PT0gXCJkaXN0aW5jdFwiIHx8IHZpZXdJbmZvLmtpbmQgPT09IFwiZ3JvdXBCeVwiKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LmtleSA/PyByb3cudmFsdWUpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgaWYgKG1ldGEucmV0dXJuRG9jcykge1xuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy52YWx1ZSA/PyByb3cuZG9jID8/IHJvdykgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAoIXJvd3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gKHZpZXdJbmZvLmtpbmQgPT09IFwiY291bnRcIiA/IDAgOiBudWxsKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIHJldHVybiAocm93c1swXS52YWx1ZSA/PyByb3dzWzBdLmtleSA/PyBudWxsKSBhcyB1bmtub3duIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgaW5mbyBpcyBhIHZpZXctYmFzZWQgYWdncmVnYXRlXG4gICAqL1xuICBwcml2YXRlIGlzVmlld0FnZ3JlZ2F0ZShcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvXG4gICk6IGluZm8gaXMgRXh0cmFjdDxGYWJyaWNBZ2dyZWdhdGVJbmZvLCB7IGtpbmQ6IFZpZXdLaW5kIH0+IHtcbiAgICByZXR1cm4gaW5mby5raW5kICE9PSBcImF2Z1wiO1xuICB9XG59XG4iLCJpbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQge1xuICBDb3VjaERCS2V5cyxcbiAgdHlwZSBNYW5nb1F1ZXJ5LFxuICB0eXBlIFZpZXdSZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCAqIGFzIGdycGMgZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCB7XG4gIE1vZGVsLFxuICB0eXBlIE1vZGVsQ29uc3RydWN0b3IsXG4gIHR5cGUgU2VyaWFsaXplcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVidWcsIGZpbmFsLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICB0eXBlIFBlZXJDb25maWcsXG4gIHR5cGUgU2VncmVnYXRlZE1vZGVsLFxuICB0eXBlIE1zcERldGFpbHMsXG59IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGNvbm5lY3QsXG4gIHR5cGUgQ29ubmVjdE9wdGlvbnMsXG4gIEdhdGV3YXksXG4gIE5ldHdvcmssXG4gIFByb3Bvc2FsT3B0aW9ucyxcbiAgQ29udHJhY3QgYXMgQ29udHJha3QsXG4gIHR5cGUgU2lnbmVyLFxuICBHYXRld2F5RXJyb3IsXG4gIEVuZG9yc2VFcnJvcixcbn0gZnJvbSBcIkBoeXBlcmxlZGdlci9mYWJyaWMtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgR2F0ZXdheSBhcyBMZWdhY3lHYXRld2F5LCBXYWxsZXRzIH0gZnJvbSBcImZhYnJpYy1uZXR3b3JrXCI7XG5pbXBvcnQgdHlwZSB7IEVuZG9yc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7XG4gIGdldElkZW50aXR5LFxuICBnZXRTaWduZXIsXG4gIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50LFxuICByZWFkRmlsZSBhcyByZWFkRnNGaWxlLFxufSBmcm9tIFwiLi9mYWJyaWMtZnNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgdHlwZSBQcmltYXJ5S2V5VHlwZSxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIEFkYXB0ZXIsXG4gIHR5cGUgQWRhcHRlckZsYWdzLFxuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE1pZ3JhdGlvbkVycm9yLFxuICBPYnNlcnZlckVycm9yLFxuICBQYWdpbmdFcnJvcixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBRdWVyeUVycm9yLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBTdGF0ZW1lbnQsXG4gIHR5cGUgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFBhZ2luYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBDb250ZXh0dWFsQXJncyxcbiAgdHlwZSBQcmVwYXJlZE1vZGVsLFxuICBBbGxPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEZhYnJpY0ZsYXZvdXIsIEZhYnJpY01vZGVsS2V5cyB9IGZyb20gXCIuLi9zaGFyZWQvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDbGllbnRTZXJpYWxpemVyIH0gZnJvbSBcIi4uL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50RGlzcGF0Y2ggfSBmcm9tIFwiLi9GYWJyaWNDbGllbnREaXNwYXRjaFwiO1xuLy8gaW1wb3J0IHsgSFNNU2lnbmVyRmFjdG9yeUN1c3RvbSB9IGZyb20gXCIuL2ZhYnJpYy1oc21cIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFN0YXRlbWVudCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudFN0YXRlbWVudFwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50UGFnaW5hdG9yIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50UGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgRW5kb3JzZW1lbnRFcnJvcixcbiAgRW5kb3JzZW1lbnRQb2xpY3lFcnJvcixcbiAgTXZjY1JlYWRDb25mbGljdEVycm9yLFxuICBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IsXG4gIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvcixcbiAgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IsXG59IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0RmFicmljQ2xpZW50RmxhZ3MgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IENyeXB0b1V0aWxzIH0gZnJvbSBcIi4vY3J5cHRvXCI7XG5pbXBvcnQgeyBleHRyYWN0SWRzIH0gZnJvbSBcIi4vaWRzL2lkLWV4dHJhY3Rpb25cIjtcbmltcG9ydCB7IERlZmF1bHRDb250cmFjdFJlc29sdmVyLCBJZGVudGl0eSB9IGZyb20gXCIuLi9zaGFyZWQvaW5kZXhcIjtcblxudHlwZSBMZWdhY3lQZWVyVGFyZ2V0ID0ge1xuICBtc3BJZDogc3RyaW5nO1xuICBwZWVyRW5kcG9pbnQ6IHN0cmluZztcbiAgcGVlckhvc3RBbGlhcz86IHN0cmluZztcbiAgdGxzQ2VydD86IHN0cmluZyB8IEJ1ZmZlcjtcbn07XG5cbnR5cGUgTGVnYWN5UGVlcldpdGhOYW1lID0gTGVnYWN5UGVlclRhcmdldCAmIHsgbmFtZTogc3RyaW5nIH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtzXG4gKiBAc3VtbWFyeSBUaGUgRmFicmljQWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyIHRvIHByb3ZpZGUgYSBzZWFtbGVzcyBpbnRlcmZhY2UgZm9yIGludGVyYWN0aW5nIHdpdGggSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtzLlxuICogSXQgaGFuZGxlcyBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIHRyYW5zYWN0aW9uIHN1Ym1pc3Npb24sIGFuZCBDUlVEIG9wZXJhdGlvbnMgYWdhaW5zdCBGYWJyaWMgY2hhaW5jb2RlLlxuICogQHRlbXBsYXRlIFBlZXJDb25maWcgLSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHRlbXBsYXRlIEZhYnJpY0ZsYWdzIC0gRmxhZ3Mgc3BlY2lmaWMgdG8gRmFicmljIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBDb250ZXh0PEZhYnJpY0ZsYWdzPiAtIENvbnRleHQgdHlwZSBjb250YWluaW5nIEZhYnJpYy1zcGVjaWZpYyBmbGFnc1xuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHBhcmFtIGFsaWFzIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gKiBAY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gKiBjb25zdCBjb25maWc6IFBlZXJDb25maWcgPSB7XG4gKiAgIG1zcElkOiAnT3JnMU1TUCcsXG4gKiAgIHBlZXJFbmRwb2ludDogJ2xvY2FsaG9zdDo3MDUxJyxcbiAqICAgY2hhbm5lbE5hbWU6ICdteWNoYW5uZWwnLFxuICogICBjaGFpbmNvZGVOYW1lOiAnbXljYycsXG4gKiAgIGNvbnRyYWN0TmFtZTogJ215Y29udHJhY3QnLFxuICogICB0bHNDZXJ0UGF0aDogJy9wYXRoL3RvL3Rscy9jZXJ0JyxcbiAqICAgY2VydERpcmVjdG9yeVBhdGg6ICcvcGF0aC90by9jZXJ0L2RpcicsXG4gKiAgIGtleURpcmVjdG9yeVBhdGg6ICcvcGF0aC90by9rZXkvZGlyJ1xuICogfTtcbiAqXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IEZhYnJpY0FkYXB0ZXIoY29uZmlnLCAnb3JnMS1hZGFwdGVyJyk7XG4gKlxuICogLy8gVXNlIHRoZSBhZGFwdGVyIHRvIGludGVyYWN0IHdpdGggdGhlIEZhYnJpYyBuZXR3b3JrXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGFwdGVyLnJlYWQoJ3VzZXJzJywgJ3VzZXIxJywgbXlTZXJpYWxpemVyKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gKiAgIHBhcnRpY2lwYW50IE5ldHdvcmtcbiAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAqICAgcGFydGljaXBhbnQgQ2hhaW5jb2RlXG4gKlxuICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwsIHRyYW5zaWVudCwgc2VyaWFsaXplcilcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IHN1Ym1pdFRyYW5zYWN0aW9uKE9wZXJhdGlvbktleXMuQ1JFQVRFLCBbc2VyaWFsaXplZE1vZGVsXSwgdHJhbnNpZW50KVxuICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdCgpXG4gKiAgIEdhdGV3YXktPj5OZXR3b3JrOiBnZXROZXR3b3JrKGNoYW5uZWxOYW1lKVxuICogICBOZXR3b3JrLT4+Q29udHJhY3Q6IGdldENvbnRyYWN0KGNoYWluY29kZU5hbWUsIGNvbnRyYWN0TmFtZSlcbiAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBzdWJtaXQoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICogICBDb250cmFjdC0tPj5GYWJyaWNBZGFwdGVyOiByZXN1bHRcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IGRlY29kZShyZXN1bHQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRlY29kZWRSZXN1bHQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2xpZW50OiBkZXNlcmlhbGl6ZWRSZXN1bHRcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudEFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPFxuICBQZWVyQ29uZmlnLFxuICBDbGllbnQsXG4gIE1hbmdvUXVlcnksXG4gIEZhYnJpY0NsaWVudENvbnRleHRcbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyB0ZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgVWludDhBcnJheSB0byBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgbG9nID0gTG9nZ2luZy5mb3IoRmFicmljQ2xpZW50QWRhcHRlcik7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI8YW55PiA9XG4gICAgRmFicmljQ2xpZW50QWRhcHRlci5zZXJpYWxpemVyO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXQgQ29udGV4dCgpOiBDb25zdHJ1Y3RvcjxGYWJyaWNDbGllbnRDb250ZXh0PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudENvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljQWRhcHRlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBhZGFwdGVyIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgSHlwZXJsZWRnZXIgRmFicmljIG5ldHdvcmtcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBDb25maWd1cmF0aW9uIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGVlckNvbmZpZywgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRGYWJyaWNDbGllbnRGbGFncywgY29uZmlnKSxcbiAgICAgIEZhYnJpY0ZsYXZvdXIsXG4gICAgICBhbGlhc1xuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hhaW5jb2RlRm9yKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5jaGFpbmNvZGVGb3IobW9kZWwsIHRoaXMuY29uZmlnLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGFubmVsRm9yKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5jaGFubmVsRm9yKG1vZGVsLCB0aGlzLmNvbmZpZywgLi4uYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29udHJhY3RGb3IoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmNvbnRyYWN0Rm9yKG1vZGVsLCB0aGlzLmNvbmZpZywgLi4uYXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEFkYXB0ZXJGbGFncz5cbiAgKTogU3RhdGVtZW50PE0sIEZhYnJpY0NsaWVudEFkYXB0ZXIsIGFueSwgTWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50U3RhdGVtZW50KHRoaXMsIG92ZXJyaWRlcyk7XG4gIH1cblxuICBQYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsPihcbiAgICBxdWVyeTogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiB8IE1hbmdvUXVlcnksXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQYWdpbmF0b3I8TSwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRQYWdpbmF0b3IodGhpcywgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZhYnJpY0NsaWVudEZsYWdzPiB7XG4gICAgY29uc3QgbWVyZ2VkRmxhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbmZpZywgZmxhZ3MpO1xuICAgIGNvbnN0IGYgPSBPYmplY3QuYXNzaWduKFxuICAgICAgYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgbWVyZ2VkRmxhZ3MsIC4uLmFyZ3MpXG4gICAgKTtcbiAgICByZXR1cm4gZjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNvbnRleHQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBBbGxPcGVyYXRpb25LZXlzLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGYWJyaWNDbGllbnRGbGFncz4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgQ29uc3RydWN0b3I8TT5bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxGYWJyaWNDbGllbnRDb250ZXh0PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY29udGV4dCk7XG4gICAgbG9nLnNpbGx5KFxuICAgICAgYGNyZWF0aW5nIG5ldyBjb250ZXh0IGZvciAke29wZXJhdGlvbn0gb3BlcmF0aW9uIG9uICR7bW9kZWwgPyAoQXJyYXkuaXNBcnJheShtb2RlbCkgPyBtb2RlbC5tYXAoKG0pID0+IE1vZGVsLnRhYmxlTmFtZShtKSkgOiBNb2RlbC50YWJsZU5hbWUobW9kZWwpKSA6IFwibm9cIn0gdGFibGUgJHtvdmVycmlkZXMgJiYgT2JqZWN0LmtleXMob3ZlcnJpZGVzKSA/IE9iamVjdC5rZXlzKG92ZXJyaWRlcykubGVuZ3RoIDogXCJub1wifSB3aXRoIGZsYWcgb3ZlcnJpZGVzYFxuICAgICk7XG4gICAgbGV0IGN0eCA9IGFyZ3MucG9wKCk7XG4gICAgaWYgKHR5cGVvZiBjdHggIT09IFwidW5kZWZpbmVkXCIgJiYgIShjdHggaW5zdGFuY2VvZiBDb250ZXh0KSkge1xuICAgICAgYXJncy5wdXNoKGN0eCk7XG4gICAgICBjdHggPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGVzID0gY3R4XG4gICAgICA/IE9iamVjdC5hc3NpZ24oe30sIGN0eC50b092ZXJyaWRlcygpLCBvdmVycmlkZXMpXG4gICAgICA6IG92ZXJyaWRlcztcbiAgICBjb25zdCBmbGFncyA9IGF3YWl0IHRoaXMuZmxhZ3MoXG4gICAgICB0eXBlb2Ygb3BlcmF0aW9uID09PSBcInN0cmluZ1wiID8gb3BlcmF0aW9uIDogb3BlcmF0aW9uLm5hbWUsXG4gICAgICBtb2RlbCxcbiAgICAgIG92ZXJyaWRlcyBhcyBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICAgIC4uLlsuLi5hcmdzLCBjdHhdLmZpbHRlcihCb29sZWFuKVxuICAgICk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBpZiAoIShjdHggaW5zdGFuY2VvZiB0aGlzLkNvbnRleHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgICAgICAuLi5jdHhbXCJjYWNoZVwiXSxcbiAgICAgICAgICAuLi5mbGFncyxcbiAgICAgICAgICBwYXJlbnRDb250ZXh0OiBjdHgsXG4gICAgICAgIH0pIGFzIGFueTtcbiAgICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICAgIGNoaWxkQ29udGV4dHM6IFtcbiAgICAgICAgICAgIC4uLihjdHguZ2V0T3JVbmRlZmluZWQoXCJjaGlsZENvbnRleHRzXCIpIHx8IFtdKSxcbiAgICAgICAgICAgIG5ld0N0eCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0N0eDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRPcCA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm9wZXJhdGlvblwiKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IGN0eC5nZXRPclVuZGVmaW5lZChcImFmZmVjdGVkVGFibGVzXCIpO1xuICAgICAgaWYgKFxuICAgICAgICAhY3VycmVudE9wIHx8XG4gICAgICAgIGN1cnJlbnRPcCAhPT0gb3BlcmF0aW9uIHx8XG4gICAgICAgIChtb2RlbCAmJiBtb2RlbCAhPT0gY3VycmVudE1vZGVsKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgICAgICAuLi5jdHhbXCJjYWNoZVwiXSxcbiAgICAgICAgICAuLi5mbGFncyxcbiAgICAgICAgICBwYXJlbnRDb250ZXh0OiBjdHgsXG4gICAgICAgIH0pIGFzIGFueTtcblxuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN0eC5hY2N1bXVsYXRlKGZsYWdzKSBhcyBhbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgIC4uLmZsYWdzLFxuICAgIH0pIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVjb2RlcyBhIFVpbnQ4QXJyYXkgdG8gYSBzdHJpbmdcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYmluYXJ5IGRhdGEgcmVjZWl2ZWQgZnJvbSBGYWJyaWMgdG8gYSBzdHJpbmcgdXNpbmcgVVRGLTggZW5jb2RpbmdcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhIC0gVGhlIGJpbmFyeSBkYXRhIHRvIGRlY29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkZWNvZGVkIHN0cmluZ1xuICAgKi9cbiAgZGVjb2RlKGRhdGE6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmRlY29kZXIuZGVjb2RlKGRhdGEpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxcbiAgICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxcbiAgICAgIGFueSxcbiAgICAgIEFkYXB0ZXI8UGVlckNvbmZpZywgQ2xpZW50LCBNYW5nb1F1ZXJ5LCBGYWJyaWNDbGllbnRDb250ZXh0PlxuICAgID4sXG4gID4oKTogQ29uc3RydWN0b3I8Uj4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogW1xuICAgIENvbnN0cnVjdG9yPE0+LFxuICAgIFByaW1hcnlLZXlUeXBlLFxuICAgIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYW55W10sXG4gICAgRmFicmljQ2xpZW50Q29udGV4dCxcbiAgXSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZVByZWZpeCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIHJlY29yZHMgZm9yIGNyZWF0aW9uXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmVjZXNzYXJ5IENvdWNoREIgZmllbGRzIHRvIG11bHRpcGxlIHJlY29yZHMgYmVmb3JlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWRzIC0gVGhlIElEcyBvZiB0aGUgcmVjb3Jkc1xuICAgKiBAcGFyYW0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBwcmVwYXJlXG4gICAqIEByZXR1cm4gQSB0dXBsZSBjb250YWluaW5nIHRoZSB0YWJsZU5hbWUsIGlkcywgYW5kIHByZXBhcmVkIHJlY29yZHNcbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgaWRzIGFuZCBtb2RlbHMgYXJyYXlzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGxQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbHNbY291bnRdKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWRzLCByZWNvcmRzLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVBbGxQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWRzLCByZWNvcmRzLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBjcmVhdGUgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gbW9kZWxzIC0gQXJyYXkgb2YgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgLy9IRVJFIVxuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHRyYW5zaWVudCA9IGN0eEFyZ3Muc2hpZnQoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PixcbiAgICAgIHRoaXMuY3JlYXRlQWxsXG4gICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLmluZm8oYGFkZGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRNb2RlbHMgPSBtb2RlbHMubWFwKChtKSA9PlxuICAgICAgdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtLCBjbGF6ei5uYW1lKVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICBbSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZE1vZGVscyldLFxuICAgICAgaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6XG4gICAgKTtcblxuICAgIGxldCByZXM6IFJlY29yZDxzdHJpbmcsIGFueT5bXTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgY3R4LFxuICAgICAgICBuZWVkc0Z1bGxQYXlsb2FkLFxuICAgICAgICByZXNbMF1bTW9kZWwucGsoY2xhenopIGFzIHN0cmluZ10gfHwgaWRzWzBdXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgTW9kZWwubWVyZ2UoXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG0gYXMgYW55LCB0cmFuc2llbnQ/LltpXSB8fCB7fSksXG4gICAgICAgICAgICAgIHJlc1tpXVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgaWRzXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byByZWFkIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnMgdG8gcmVhZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuaW5mbyhgcmVhZGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KGlkcyldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXN1bHQpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdXBkYXRlIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzXG4gICAqIEBwYXJhbSB7QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj59IG1vZGVscyAtIEFycmF5IG9mIHVwZGF0ZWQgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdXBkYXRlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgdHJhbnNpZW50ID0gY3R4QXJncy5zaGlmdCgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+LFxuICAgICAgdGhpcy51cGRhdGVBbGxcbiAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLmluZm8oYHVwZGF0aW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZE1vZGVscyA9IG1vZGVscy5tYXAoKG0pID0+XG4gICAgICB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG0sIGNsYXp6Lm5hbWUpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkTW9kZWxzKV0sXG4gICAgICBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenpcbiAgICApO1xuXG4gICAgbGV0IHJlczogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKGNsYXp6LCBjdHgsIG5lZWRzRnVsbFBheWxvYWQsIGlkc1swXSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRBbGwoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgbSBhcyBhbnksIHRyYW5zaWVudD8uW2ldIHx8IHt9KSxcbiAgICAgICAgICAgICAgcmVzW2ldXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50Pn0gaWRzIC0gQXJyYXkgb2YgcmVjb3JkIGlkZW50aWZpZXJzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0ge1NlcmlhbGl6ZXI8YW55Pn0gc2VyaWFsaXplciAtIFNlcmlhbGl6ZXIgZm9yIHRoZSBtb2RlbCBkYXRhXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCwgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGVBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIE1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCBzaG91bGRIeWRyYXRlID0gdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgIGNsYXp6LFxuICAgICAgY3R4LFxuICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgIGlkc1swXVxuICAgICk7XG4gICAgaWYgKHNob3VsZEh5ZHJhdGUpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVhZEFsbChjbGF6eiwgaWRzLCAuLi5jdHhBcmdzKTtcbiAgICB9XG5cbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShpZHMpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc2hvdWxkSHlkcmF0ZVxuICAgICAgICA/IHJlc3VsdFxuICAgICAgICA6IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzKSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBwZXJzaXN0ZW5jZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIG1vZGVsIGluc3RhbmNlIGludG8gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRhdGFiYXNlIHN0b3JhZ2UsXG4gICAqIGhhbmRsaW5nIGNvbHVtbiBtYXBwaW5nIGFuZCBzZXBhcmF0aW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcmVwYXJlXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIGRhdGFcbiAgICovXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBTZWdyZWdhdGVkTW9kZWw8TT4gJiBQcmVwYXJlZE1vZGVsIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gTW9kZWwuc2VncmVnYXRlKG1vZGVsKTtcbiAgICBpZiAoKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHsobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3BsaXQubW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQobW9kZWwpO1xuICAgIGlmIChtaXJyb3JNZXRhKSB7XG4gICAgICBjb25zdCBtaXJyb3JNc3AgPSBtaXJyb3JNZXRhLm1zcElkO1xuICAgICAgaWYgKCFtaXJyb3JNc3ApIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBtaXJyb3IgTVNQIGNvdWxkIGJlIGZvdW5kYCk7XG4gICAgICBsZXQgbXNwcyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgICAgbXNwcyA9IEFycmF5LmlzQXJyYXkobXNwcykgPyBtc3BzIDogW21zcHNdO1xuICAgICAgY29uc3QgbWVyZ2VkID0gWy4uLm5ldyBTZXQoWy4uLm1zcHMsIG1pcnJvck1zcF0pXTtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgZW5kb3JzaW5nT3JnczogbWVyZ2VkLFxuICAgICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zOiBtZXJnZWQsXG4gICAgICAgIGxlZ2FjeTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNvcmQ6IHNwbGl0Lm1vZGVsLFxuICAgICAgbW9kZWw6IHNwbGl0Lm1vZGVsLFxuICAgICAgaWQ6IG1vZGVsW01vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KV0gYXMgc3RyaW5nLFxuICAgICAgdHJhbnNpZW50OiBzcGxpdC50cmFuc2llbnQsXG4gICAgICBwcml2YXRlczogc3BsaXQucHJpdmF0ZXMsXG4gICAgICBzaGFyZWQ6IHNwbGl0LnNoYXJlZCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBNIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJldmVydCk7XG4gICAgaWYgKFxuICAgICAgdHJhbnNpZW50ICYmXG4gICAgICB0aGlzLnNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50KFxuICAgICAgICBjdHgsXG4gICAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcIm9wZXJhdGlvblwiKSBhcyBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgcmUtYWRkaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZW50cmllcyh0cmFuc2llbnQgYXMgUmVjb3JkPHN0cmluZywgYW55PilcbiAgICAgICAgLmZpbHRlcigoWywgdl0pID0+IHR5cGVvZiB2ICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgaW4gb2JqICYmIChvYmogYXMgYW55KVtrZXldICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBsb2cud2FybihcbiAgICAgICAgICAgICAgYG92ZXJ3cml0aW5nIGV4aXN0aW5nICR7a2V5fS4gaWYgdGhpcyBpcyBub3QgYSBkZWZhdWx0IHZhbHVlLCB0aGlzIG1heSBwb3NlIGEgcHJvYmxlbWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgKG9iaiBhcyBNKVtrZXkgYXMga2V5b2YgTV0gPSB2YWw7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pKG9iaik7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgb3BlcmF0aW9uPzogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghY3R4KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGN0eC5nZXRPclVuZGVmaW5lZChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBjaGlsZFJlYnVpbGQgPVxuICAgICAgdHlwZW9mIChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4oXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoY2hpbGRSZWJ1aWxkKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCByZXNvbHZlZE9wID0gdGhpcy5yZXNvbHZlT3BlcmF0aW9uKGN0eCwgb3BlcmF0aW9uKTtcbiAgICBpZiAoIXJlc29sdmVkT3ApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBvcCA9IHJlc29sdmVkT3AudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoXG4gICAgICBvcC5pbmNsdWRlcyhcInJlYWRcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwiZmluZFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJxdWVyeVwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJzdGF0ZW1lbnRcIikgfHxcbiAgICAgIG9wLmluY2x1ZGVzKFwicGFnZVwiKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVPcGVyYXRpb24oXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIG9wZXJhdGlvbj86IHN0cmluZ1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChvcGVyYXRpb24pIHJldHVybiBvcGVyYXRpb247XG4gICAgaWYgKHR5cGVvZiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAoY3R4IGFzIGFueSkuZ2V0RnJvbUNoaWxkcmVuKFwib3BlcmF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgaGFzVHJhbnNpZW50OiBib29sZWFuLFxuICAgIGlkPzogUHJpbWFyeUtleVR5cGVcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFoYXNUcmFuc2llbnQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgICBjb25zdCBjb21wb3NlZCA9IE1vZGVsLmNvbXBvc2VkKGNsYXp6LCBwayk7XG4gICAgY29uc3QgZ2VuZXJhdGVkID0gTW9kZWwuZ2VuZXJhdGVkKGNsYXp6LCBwayk7XG4gICAgY29uc3QgaGFzSWQgPSBpZCAhPT0gdW5kZWZpbmVkICYmIGlkICE9PSBudWxsO1xuICAgIGlmICghaGFzSWQgJiYgY29tcG9zZWQpIHJldHVybiB0cnVlO1xuICAgIGlmICghaGFzSWQgJiYgZ2VuZXJhdGVkKSB7XG4gICAgICBjdHgubG9nZ2VyLndhcm4oXG4gICAgICAgIGBDYW5ub3QgcmVmcmVzaCByZWNvcmQgd2l0aCBwcml2YXRlIGdlbmVyYXRlZCBwcmltYXJ5IGtleWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBoYXNJZDtcbiAgfVxuXG4gIHByaXZhdGUgaW5qZWN0VHJhbnNpZW50T3ZlcnJpZGVzKFxuICAgIHRyYW5zaWVudERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQsXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudERhdGEgPSB0aGlzLmhhc01lYW5pbmdmdWxUcmFuc2llbnREYXRhKHRyYW5zaWVudERhdGEpO1xuICAgIGNvbnN0IHNob3VsZEluamVjdCA9ICEhY3R4LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dDb250ZXh0VHJhbnNpZW50TWFwXCIpO1xuICAgIGlmICghaGFzVHJhbnNpZW50RGF0YSAmJiAhc2hvdWxkSW5qZWN0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG92ZXJyaWRlcyA9IGN0eC50b092ZXJyaWRlcygpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBoYXNUcmFuc2llbnREYXRhID8gT2JqZWN0LmFzc2lnbih7fSwgdHJhbnNpZW50RGF0YSkgOiB7fTtcbiAgICBpZiAoc2hvdWxkSW5qZWN0ICYmIE9iamVjdC5rZXlzKG92ZXJyaWRlcykubGVuZ3RoKSB7XG4gICAgICBwYXlsb2FkW0ZhYnJpY01vZGVsS2V5cy5PVkVSUklERVNdID0gb3ZlcnJpZGVzO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocGF5bG9hZCkubGVuZ3RoID8gcGF5bG9hZCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzTWVhbmluZ2Z1bFRyYW5zaWVudERhdGEodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgIHJldHVybiB2YWx1ZS5zb21lKChpdGVtKSA9PiB0aGlzLmhhc01lYW5pbmdmdWxUcmFuc2llbnREYXRhKGl0ZW0pKTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGlmICghZW50cmllcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gZW50cmllcy5zb21lKChbLCBlbnRyeV0pID0+IHRoaXMuaGFzTWVhbmluZ2Z1bFRyYW5zaWVudERhdGEoZW50cnkpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRpcmVjdCA9XG4gICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJlbmRvcnNpbmdPcmdzXCIpIHx8XG4gICAgICAoY3R4LmdldE9yVW5kZWZpbmVkKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCk7XG4gICAgaWYgKGRpcmVjdCAmJiBkaXJlY3QubGVuZ3RoKSByZXR1cm4gZGlyZWN0O1xuICAgIHJldHVybiAoXG4gICAgICAoY3R4LmdldEZyb21DaGlsZHJlbihcImVuZG9yc2luZ09yZ3NcIikgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpIHx8XG4gICAgICAoY3R4LmdldEZyb21DaGlsZHJlbihcImVuZG9yc2luZ09yZ3NcIikgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWcuYWxsb3dHYXRld2F5T3ZlcnJpZGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byBjcmVhdGUgYSByZWNvcmQgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdHJhbnNpZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+LFxuICAgICAgdGhpcy5jcmVhdGVcbiAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLnZlcmJvc2UoYGFkZGluZyBlbnRyeSB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICBbdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCwgY2xhenoubmFtZSldLFxuICAgICAgaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1vZGVsLCB0cmFuc2llbnQgfHwge30pLFxuICAgICAgICAgICAgZGVzZXJpYWxpemVkLFxuICAgICAgICAgICAgY2xhenpcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgfVxuXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIGFzeW5jIGhlYWx0aGNoZWNrPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuaGVhbHRoY2hlY2spO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBsb2cudmVyYm9zZShgcmVhZGluZyBlbnRyeSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIFwiaGVhbHRoY2hlY2tcIixcbiAgICAgIFtdLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcmVhZCBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRcbiAgICovXG4gIEBkZWJ1ZygpXG4gIEBmaW5hbCgpXG4gIGFzeW5jIHJlYWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy52ZXJib3NlKGByZWFkaW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwazogJHtpZH1gKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICBbaWQudG9TdHJpbmcoKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgfVxuXG4gIHVwZGF0ZVByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZVByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAvLyByZWNvcmRbQ291Y2hEQktleXMuSURdID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgcmV0dXJuIFtjbGF6eiwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSBzaW5nbGUgcmVjb3JkXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgYSByZWNvcmQgaW4gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHVwZGF0ZWQgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgYXN5bmMgdXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICB0cmFuc2llbnQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD4sXG4gICAgICB0aGlzLnVwZGF0ZVxuICAgICk7XG4gICAgbG9nLmluZm8oYENMSUVOVCBVUERBVEUgY2xhc3MgOiAke3R5cGVvZiBjbGF6en1gKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy52ZXJib3NlKGB1cGRhdGluZyBlbnRyeSB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBbdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCwgY2xhenoubmFtZSldLFxuICAgICAgaGFzVHJhbnNpZW50ID8geyBbdGFibGVOYW1lXTogdHJhbnNpZW50IH0gOiB1bmRlZmluZWQsXG4gICAgICB0aGlzLmdldEVuZG9yc2luZ09yZ2FuaXphdGlvbnMoY3R4KSxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgZXh0cmFjdElkcyhcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIG1vZGVsLCB0cmFuc2llbnQgfHwge30pLFxuICAgICAgICAgICAgZGVzZXJpYWxpemVkLFxuICAgICAgICAgICAgY2xhenpcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkXG4gICAgICAgICksXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXIgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmRlbGV0ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIE1vZGVsLmlzVHJhbnNpZW50KGNsYXp6KSB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCBzaG91bGRIeWRyYXRlID0gdGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShcbiAgICAgIGNsYXp6LFxuICAgICAgY3R4LFxuICAgICAgbmVlZHNGdWxsUGF5bG9hZCxcbiAgICAgIGlkXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkSHlkcmF0ZSkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZWFkKGNsYXp6LCBpZCwgY3R4KTtcbiAgICB9XG5cbiAgICBsb2cudmVyYm9zZShgZGVsZXRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIFtpZC50b1N0cmluZygpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICA/IHJlc3VsdFxuICAgICAgOiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGhpcy5kZWNvZGUocmVzKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcGVyZm9ybSBhIHF1ZXJ5IHVzaW5nIE1hbmdvIFF1ZXJ5IHN5bnRheFxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIFF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwcm9jZXNzIC0gV2hldGhlciB0byBwcm9jZXNzIHRoZSByZXN1bHRcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBDbGllbnQtPj5GYWJyaWNBZGFwdGVyOiByYXcocmF3SW5wdXQsIHByb2Nlc3MpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5GYWJyaWNBZGFwdGVyOiBldmFsdWF0ZVRyYW5zYWN0aW9uKFwicXVlcnlcIiwgW2lucHV0XSlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGV2YWx1YXRlKFwicXVlcnlcIiwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAgICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gICAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IEpTT04ucGFyc2UoZGVjb2RlKHJlc3VsdCkpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IFByb2Nlc3MgcmVzdWx0IGJhc2VkIG9uIHR5cGVcbiAgICogICBGYWJyaWNBZGFwdGVyLS0+PkNsaWVudDogcHJvY2Vzc2VkIHJlc3VsdFxuICAgKi9cbiAgQGRlYnVnKClcbiAgYXN5bmMgcmF3PFYsIEQgZXh0ZW5kcyBib29sZWFuPihcbiAgICByYXdJbnB1dDogTWFuZ29RdWVyeSxcbiAgICBkb2NzT25seTogRCA9IHRydWUgYXMgRCxcbiAgICBjbGF6ejogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8Vj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmF3KTtcbiAgICBsb2cuaW5mbyhgUGVyZm9ybWluZyByYXcgc3RhdGVtZW50IG9uIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKGNsYXp6KX1gKTtcbiAgICBsZXQgdHJhbnNhY3Rpb25SZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIGN0eCxcbiAgICAgICAgXCJyYXdcIixcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHJhd0lucHV0KSwgZG9jc09ubHldLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgY2xhenpcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUodHJhbnNhY3Rpb25SZXN1bHQpKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIHJlc3VsdDogJHtlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlUmVjb3JkID0gKHJlY29yZDogUmVjb3JkPGFueSwgYW55PikgPT4ge1xuICAgICAgaWYgKE1vZGVsLmlzTW9kZWwocmVjb3JkKSkgcmV0dXJuIE1vZGVsLmJ1aWxkKHJlY29yZCk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH07XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHJldHVybiByZXN1bHQgYXMgVjtcbiAgICAgIGNvbnN0IGVsID0gcmVzdWx0WzBdO1xuICAgICAgaWYgKE1vZGVsLmlzTW9kZWwoZWwpKVxuICAgICAgICAvLyBpZiB0aGUgZmlyc3Qgb25lIGlzIGEgbW9kZWwsIGFsbCBhcmUgbW9kZWxzXG4gICAgICAgIHJldHVybiByZXN1bHQubWFwKChlbCkgPT4gTW9kZWwuYnVpbGQoZWwpKSBhcyBWO1xuICAgICAgcmV0dXJuIHJlc3VsdCBhcyBWO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZVJlY29yZChyZXN1bHQgYXMgYW55KSBhcyBWO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIENvdWNoREIgdmlldyBxdWVyeSBhZ2FpbnN0IHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBzdW1tYXJ5IEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIHRvIHF1ZXJ5IGEgZGVzaWduIGRvY3VtZW50IHZpZXdcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgdmlldyByZXNwb25zZSB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZG9jIC0gRGVzaWduIGRvY3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZpZXdOYW1lIC0gVmlldyBuYW1lXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb3B0aW9ucyAtIFZpZXcgcXVlcnkgb3B0aW9uc1xuICAgKiBAcGFyYW0gey4uLkNvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+fSBhcmdzIC0gT3B0aW9uYWwgY29udGV4dHVhbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxWaWV3UmVzcG9uc2U8Uj4+fSBUaGUgdmlldyByZXNwb25zZVxuICAgKi9cbiAgQGRlYnVnKClcbiAgYXN5bmMgdmlldzxSPihcbiAgICBkZG9jOiBzdHJpbmcsXG4gICAgdmlld05hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8Vmlld1Jlc3BvbnNlPFI+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy52aWV3KTtcbiAgICBsb2cuaW5mbyhgUXVlcnlpbmcgdmlldyAke2Rkb2N9LyR7dmlld05hbWV9YCk7XG4gICAgbGV0IHRyYW5zYWN0aW9uUmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICBjdHgsXG4gICAgICAgIFwidmlld1wiLFxuICAgICAgICBbZGRvYywgdmlld05hbWUsIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpXSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IFZpZXdSZXNwb25zZTxSPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZSh0cmFuc2FjdGlvblJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgdmlldyByZXN1bHQ6ICR7ZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBvciBjcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIHRoZSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY2FjaGVkIGNsaWVudCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBub25lIGV4aXN0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPENsaWVudD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBnUlBDIGNsaWVudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0Q2xpZW50KCk6IENsaWVudCB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpXG4gICAgICB0aGlzLl9jbGllbnQgPSBGYWJyaWNDbGllbnRBZGFwdGVyLmdldENsaWVudCh0aGlzLmNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IEdhdGV3YXkgaW5zdGFuY2UgdXNpbmcgdGhlIGN1cnJlbnQgY2xpZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgR2F0ZXdheShjdHg6IEZhYnJpY0NsaWVudENvbnRleHQpOiBQcm9taXNlPEdhdGV3YXk+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50QWRhcHRlci5nZXRHYXRld2F5KGN0eCwgdGhpcy5jb25maWcsIHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNoYWluY29kZVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IENvbnRyYWN0IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IEdhdGV3YXlcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb250cmFrdD59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIENvbnRyYWN0KFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBjbGF6ek9yQ29udHJhY3ROYW1lPzogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxDb250cmFrdD4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmdldENvbnRyYWN0KFxuICAgICAgYXdhaXQgdGhpcy5HYXRld2F5KGN0eCksXG4gICAgICB0aGlzLmNvbmZpZyxcbiAgICAgIGNsYXp6T3JDb250cmFjdE5hbWUsXG4gICAgICBjdHhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBTdWJtaXRzIG9yIGV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWJtaXQgLSBXaGV0aGVyIHRvIHN1Ym1pdCAodHJ1ZSkgb3IgZXZhbHVhdGUgKGZhbHNlKSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gICAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAgICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAgICpcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+R2F0ZXdheTogY29ubmVjdCgpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBnZXRDb250cmFjdCgpXG4gICAqICAgYWx0IHN1Ym1pdCB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBzdWJtaXQoYXBpLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgZWxzZSBldmFsdWF0ZSB0cmFuc2FjdGlvblxuICAgKiAgICAgRmFicmljQWRhcHRlci0+PkNvbnRyYWN0OiBldmFsdWF0ZShhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBlbmRcbiAgICogICBDb250cmFjdC0+PkNoYWluY29kZTogaW52b2tlXG4gICAqICAgQ2hhaW5jb2RlLS0+PkNvbnRyYWN0OiByZXNwb25zZVxuICAgKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjbG9zZSgpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNhY3Rpb24oXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIHN1Ym1pdCA9IHRydWUsXG4gICAgYXJncz86IGFueVtdLFxuICAgIHRyYW5zaWVudERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQgPSB7fSxcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogc3RyaW5nW10sXG4gICAgY2xhenpPckNvbnRyYWN0TmFtZT86IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+IHwgc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnRyYW5zYWN0aW9uKTtcbiAgICB0cmFuc2llbnREYXRhID0gdGhpcy5pbmplY3RUcmFuc2llbnRPdmVycmlkZXModHJhbnNpZW50RGF0YSwgY3R4KTtcbiAgICBpZiAoc3VibWl0ICYmIHRoaXMuc2hvdWxkVXNlTGVnYWN5R2F0ZXdheShjdHgpKSB7XG4gICAgICBjb25zdCBsZWdhY3lBcmdzID0gdGhpcy5wcmVwYXJlTGVnYWN5QXJncyhhcmdzKTtcbiAgICAgIGNvbnN0IHRyYW5zaWVudE1hcCA9IHRoaXMuYnVpbGRMZWdhY3lUcmFuc2llbnQodHJhbnNpZW50RGF0YSk7XG4gICAgICBjb25zdCBwZWVyQ29uZmlncyA9IHRoaXMuYnVpbGRMZWdhY3lQZWVyQ29uZmlncyhjdHgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzKFxuICAgICAgICBjdHgsXG4gICAgICAgIGFwaSxcbiAgICAgICAgbGVnYWN5QXJncyxcbiAgICAgICAgdHJhbnNpZW50TWFwLFxuICAgICAgICBwZWVyQ29uZmlncyxcbiAgICAgICAgY2xhenpPckNvbnRyYWN0TmFtZVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IHRoaXMuR2F0ZXdheShjdHgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250cmFjdCA9IGF3YWl0IHRoaXMuQ29udHJhY3QoY3R4LCBjbGF6ek9yQ29udHJhY3ROYW1lKTtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgJHtzdWJtaXQgPyBcIlN1Ym1pdFwiIDogXCJFdmFsdWF0ZVwifXRpbmcgdHJhbnNhY3Rpb24gJHtjb250cmFjdC5nZXRDb250cmFjdE5hbWUoKX0uJHthcGl9YFxuICAgICAgKTtcbiAgICAgIGxvZy5kZWJ1ZyhgYXJnczogJHthcmdzPy5tYXAoKGEpID0+IGEudG9TdHJpbmcoKSkuam9pbihcIlxcblwiKSB8fCBcIm5vbmVcIn1gKTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHN1Ym1pdCA/IGNvbnRyYWN0LnN1Ym1pdCA6IGNvbnRyYWN0LmV2YWx1YXRlO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEFyZ3MgPSAoYXJncyB8fCBbXSkubWFwKChhcmcpID0+XG4gICAgICAgIHRoaXMubm9ybWFsaXplVHJhbnNhY3Rpb25Bcmd1bWVudChhcmcpXG4gICAgICApO1xuICAgICAgY29uc3QgdHJhbnNpZW50RW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudERhdGEgfHwge30pO1xuXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zID0gZW5kb3JzaW5nT3JnYW5pemF0aW9ucz8ubGVuZ3RoXG4gICAgICAgID8gZW5kb3JzaW5nT3JnYW5pemF0aW9uc1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHByb3Bvc2FsT3B0aW9uczogUHJvcG9zYWxPcHRpb25zID0ge1xuICAgICAgICBhcmd1bWVudHM6IG5vcm1hbGl6ZWRBcmdzLFxuICAgICAgICB0cmFuc2llbnREYXRhOiB0cmFuc2llbnRFbnRyaWVzLmxlbmd0aFxuICAgICAgICAgID8gdHJhbnNpZW50RW50cmllcy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oXG4gICAgICAgICAgICAgIChhY2MsIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBhY2Nba2V5XSA9IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge31cbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9uczogY3R4LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dNYW51YWxFbmRvcnNpbmdPcmdzXCIpXG4gICAgICAgICAgPyBlbmRvcnNpbmdPcmdhbml6YXRpb25zIHx8IHVuZGVmaW5lZFxuICAgICAgICAgIDogdW5kZWZpbmVkLCAvLyBtc3BJZCBsaXN0XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgbWV0aG9kLmNhbGwoY29udHJhY3QsIGFwaSwgcHJvcG9zYWxPcHRpb25zKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsb3NpbmcgJHt0aGlzLmNvbmZpZy5tc3BJZH0gZ2F0ZXdheSBjb25uZWN0aW9uYCk7XG4gICAgICBnYXRld2F5LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVUcmFuc2FjdGlvbkFyZ3VtZW50KGFyZzogYW55KTogYW55IHtcbiAgICBpZiAoYXJnID09PSBudWxsIHx8IGFyZyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYXJnO1xuICAgIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJnO1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSBcIm9iamVjdFwiKSByZXR1cm4gYXJnO1xuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gYXJnO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eDogRmFicmljQ2xpZW50Q29udGV4dCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWN0eC5nZXRPclVuZGVmaW5lZChcImxlZ2FjeVwiKSAmJiAhIXRoaXMuY29uZmlnLmFsbG93R2F0ZXdheU92ZXJyaWRlO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlTGVnYWN5QXJncyhhcmdzPzogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIChhcmdzIHx8IFtdKS5tYXAoKGFyZykgPT5cbiAgICAgIHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIgPyBhcmcgOiBKU09OLnN0cmluZ2lmeShhcmcpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMZWdhY3lUcmFuc2llbnQoXG4gICAgdHJhbnNpZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0cmFuc2llbnREYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0cmFuc2llbnREYXRhKTtcbiAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgQnVmZmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgIG1hcFtrZXldID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUxlZ2FjeU1zcENvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgY29uZmlndXJlZCA9IHRoaXMuY29uZmlnLmxlZ2FjeU1zcENvdW50ID8/IDE7XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKGNvbmZpZ3VyZWQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgfHwgcGFyc2VkIDwgMSkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IocGFyc2VkKTtcbiAgfVxuXG4gIHByaXZhdGUgcGlja0xlZ2FjeUNhbmRpZGF0ZXMoXG4gICAgY2FuZGlkYXRlczogTXNwRGV0YWlsc1tdLFxuICAgIGxpbWl0OiBudW1iZXJcbiAgKTogTXNwRGV0YWlsc1tdIHtcbiAgICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoIHx8IGxpbWl0IDw9IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBbLi4uY2FuZGlkYXRlc107XG4gICAgY29uc3QgdGFyZ2V0ID0gTWF0aC5taW4obGltaXQsIGF2YWlsYWJsZS5sZW5ndGgpO1xuICAgIGNvbnN0IHBpY2tlZDogTXNwRGV0YWlsc1tdID0gW107XG4gICAgd2hpbGUgKHBpY2tlZC5sZW5ndGggPCB0YXJnZXQgJiYgYXZhaWxhYmxlLmxlbmd0aCkge1xuICAgICAgY29uc3QgaWR4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXZhaWxhYmxlLmxlbmd0aCk7XG4gICAgICBjb25zdCBbc2VsZWN0aW9uXSA9IGF2YWlsYWJsZS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgcGlja2VkLnB1c2goc2VsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBpY2tlZDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRMZWdhY3lQZWVyQ29uZmlncyhjdHg6IEZhYnJpY0NsaWVudENvbnRleHQpOiBMZWdhY3lQZWVyVGFyZ2V0W10ge1xuICAgIGNvbnN0IHBlZXJzOiBMZWdhY3lQZWVyVGFyZ2V0W10gPSBbXG4gICAgICB7XG4gICAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgICAgcGVlckVuZHBvaW50OiB0aGlzLmNvbmZpZy5wZWVyRW5kcG9pbnQsXG4gICAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgICAgIHRsc0NlcnQ6IHRoaXMuY29uZmlnLnRsc0NlcnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBsZXQgZW5kb3JzaW5nT3JncyA9IHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpIHx8IFtdO1xuICAgIGVuZG9yc2luZ09yZ3MgPSBBcnJheS5pc0FycmF5KGVuZG9yc2luZ09yZ3MpXG4gICAgICA/IGVuZG9yc2luZ09yZ3NcbiAgICAgIDogW2VuZG9yc2luZ09yZ3NdO1xuICAgIGNvbnN0IGVuZG9yc2VycyA9XG4gICAgICBlbmRvcnNpbmdPcmdzLmZpbHRlcigob3JnKTogb3JnIGlzIHN0cmluZyA9PiBCb29sZWFuKG9yZykpIHx8IFtdO1xuICAgIGNvbnN0IGV4dHJhcyA9IGVuZG9yc2Vycy5maWx0ZXIoKG9yZykgPT4gb3JnICE9PSB0aGlzLmNvbmZpZy5tc3BJZCk7XG4gICAgaWYgKCFleHRyYXMubGVuZ3RoKSByZXR1cm4gcGVlcnM7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLmNvbmZpZy5tc3BNYXA7XG4gICAgY29uc3QgbGVnYWN5Q291bnQgPSB0aGlzLnJlc29sdmVMZWdhY3lNc3BDb3VudCgpO1xuICAgIGZvciAoY29uc3QgbXNwIG9mIGV4dHJhcykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG1hcD8uW21zcF07XG4gICAgICBpZiAoIWNhbmRpZGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgTm8gcGVlciBtYXBwaW5nIGF2YWlsYWJsZSBmb3IgTVNQICR7bXNwfS4gUHJvdmlkZSBpdCB2aWEgY29uZmlnLm1zcE1hcGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnBpY2tMZWdhY3lDYW5kaWRhdGVzKGNhbmRpZGF0ZXMsIGxlZ2FjeUNvdW50KTtcbiAgICAgIGlmICghc2VsZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYE5vIHZhbGlkIHBlZXIgbWFwcGluZyBhdmFpbGFibGUgZm9yIE1TUCAke21zcH0uIFByb3ZpZGUgaXQgdmlhIGNvbmZpZy5tc3BNYXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNob2ljZSBvZiBzZWxlY3Rpb25zKSB7XG4gICAgICAgIGlmICghY2hvaWNlLmVuZHBvaW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBwZWVyIG1hcHBpbmcgZm9yIE1TUCAke21zcH06IG1pc3NpbmcgZW5kcG9pbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwZWVycy5wdXNoKHtcbiAgICAgICAgICBtc3BJZDogbXNwLFxuICAgICAgICAgIHBlZXJFbmRwb2ludDogY2hvaWNlLmVuZHBvaW50LFxuICAgICAgICAgIHBlZXJIb3N0QWxpYXM6IGNob2ljZS5hbGlhcyxcbiAgICAgICAgICB0bHNDZXJ0OiBjaG9pY2UudGxzQ2VydCB8fCB0aGlzLmNvbmZpZy50bHNDZXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGVlcnM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyhcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgZmNuOiBzdHJpbmcsXG4gICAgYXJnczogc3RyaW5nW10sXG4gICAgdHJhbnNpZW50TWFwOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+IHwgdW5kZWZpbmVkLFxuICAgIHBlZXJDb25maWdzOiBMZWdhY3lQZWVyVGFyZ2V0W10sXG4gICAgY2xhenpPckNvbnRyYWN0TmFtZT86IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+IHwgc3RyaW5nXG4gICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2Vycyk7XG4gICAgY29uc3QgcGVlcnMgPSB0aGlzLm5vcm1hbGl6ZUxlZ2FjeVBlZXJzKHBlZXJDb25maWdzKTtcbiAgICBjb25zdCBpZGVudGl0eU1hdGVyaWFsID0gYXdhaXQgdGhpcy5yZXNvbHZlTGVnYWN5SWRlbnRpdHlNYXRlcmlhbCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IGF3YWl0IFdhbGxldHMubmV3SW5NZW1vcnlXYWxsZXQoKTtcbiAgICBjb25zdCBpZGVudGl0eUxhYmVsID0gYCR7dGhpcy5jb25maWcubXNwSWR9LWxlZ2FjeWA7XG4gICAgYXdhaXQgd2FsbGV0LnB1dChpZGVudGl0eUxhYmVsLCB7XG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBjZXJ0aWZpY2F0ZTogaWRlbnRpdHlNYXRlcmlhbC5jZXJ0aWZpY2F0ZSxcbiAgICAgICAgcHJpdmF0ZUtleTogaWRlbnRpdHlNYXRlcmlhbC5wcml2YXRlS2V5LFxuICAgICAgfSxcbiAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIHR5cGU6IFwiWC41MDlcIixcbiAgICB9IGFzIElkZW50aXR5KTtcblxuICAgIGNvbnN0IGNvbm5lY3Rpb25Qcm9maWxlID0gYXdhaXQgdGhpcy5idWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlKHBlZXJzKTtcbiAgICBjb25zdCBnYXRld2F5ID0gbmV3IExlZ2FjeUdhdGV3YXkoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBnYXRld2F5LmNvbm5lY3QoY29ubmVjdGlvblByb2ZpbGUsIHtcbiAgICAgICAgaWRlbnRpdHk6IGlkZW50aXR5TGFiZWwsXG4gICAgICAgIHdhbGxldCxcbiAgICAgICAgZGlzY292ZXJ5OiB7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBhc0xvY2FsaG9zdDogdGhpcy5zaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QocGVlcnMpLFxuICAgICAgICB9LFxuICAgICAgICB0bHNJbmZvOiB7XG4gICAgICAgICAgY2VydGlmaWNhdGU6IGlkZW50aXR5TWF0ZXJpYWwuY2VydGlmaWNhdGUsXG4gICAgICAgICAga2V5OiBpZGVudGl0eU1hdGVyaWFsLnByaXZhdGVLZXksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNvbmZpZy5jaGFubmVsO1xuICAgICAgbGV0IGNoYWluY29kZSA9IHRoaXMuY29uZmlnLmNoYWluY29kZU5hbWU7XG4gICAgICBsZXQgY29udHJhY3ROYW1lID0gdGhpcy5jb25maWcuY29udHJhY3ROYW1lO1xuXG4gICAgICBpZiAoY2xhenpPckNvbnRyYWN0TmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIGNsYXp6T3JDb250cmFjdE5hbWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgY29udHJhY3ROYW1lID0gY2xhenpPckNvbnRyYWN0TmFtZTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgYE5vIGNvbnRleHQgcmVjZWl2ZWQgdG8gZGV0ZXJtaW5lIGNoYWluY29kZSBjb25maWdgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNoYW5uZWwgPVxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuY2hhbm5lbEZvcihjbGF6ek9yQ29udHJhY3ROYW1lLCBjdHgpKSB8fCBjaGFubmVsO1xuICAgICAgICAgIGNoYWluY29kZSA9XG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5jaGFpbmNvZGVGb3IoY2xhenpPckNvbnRyYWN0TmFtZSwgY3R4KSkgfHwgY2hhaW5jb2RlO1xuICAgICAgICAgIGNvbnRyYWN0TmFtZSA9IGF3YWl0IHRoaXMuY29udHJhY3RGb3IoY2xhenpPckNvbnRyYWN0TmFtZSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXR3b3JrID0gYXdhaXQgZ2F0ZXdheS5nZXROZXR3b3JrKGNoYW5uZWwpO1xuICAgICAgY29uc3QgY29udHJhY3QgPSBuZXR3b3JrLmdldENvbnRyYWN0KGNoYWluY29kZSwgY29udHJhY3ROYW1lKTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gY29udHJhY3QuY3JlYXRlVHJhbnNhY3Rpb24oZmNuKTtcblxuICAgICAgaWYgKHRyYW5zaWVudE1hcCkge1xuICAgICAgICB0cmFuc2FjdGlvbi5zZXRUcmFuc2llbnQodHJhbnNpZW50TWFwKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kb3JzZXJzID0gcGVlcnNcbiAgICAgICAgLm1hcCgocGVlcikgPT4gbmV0d29yay5nZXRDaGFubmVsKCkuZ2V0RW5kb3JzZXIocGVlci5uYW1lKSlcbiAgICAgICAgLmZpbHRlcigoZW5kb3JzZXIpOiBlbmRvcnNlciBpcyBFbmRvcnNlciA9PiBCb29sZWFuKGVuZG9yc2VyKSk7XG4gICAgICBpZiAoZW5kb3JzZXJzLmxlbmd0aCkge1xuICAgICAgICB0cmFuc2FjdGlvbi5zZXRFbmRvcnNpbmdQZWVycyhlbmRvcnNlcnMpO1xuICAgICAgfVxuXG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYExlZ2FjeSBzdWJtaXR0aW5nICR7Y29udHJhY3ROYW1lfS4ke2Zjbn0gdmlhIHBlZXJzICR7cGVlcnMubWFwKChwKSA9PiBwLnBlZXJFbmRwb2ludCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uLnN1Ym1pdCguLi5hcmdzKTtcbiAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20ocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZ2F0ZXdheS5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMZWdhY3lQZWVycyhcbiAgICBwZWVyczogTGVnYWN5UGVlclRhcmdldFtdXG4gICk6IExlZ2FjeVBlZXJXaXRoTmFtZVtdIHtcbiAgICBjb25zdCBkZWR1cGVkID0gbmV3IE1hcDxzdHJpbmcsIExlZ2FjeVBlZXJXaXRoTmFtZT4oKTtcbiAgICBjb25zdCBhZGRQZWVyID0gKHBlZXI6IExlZ2FjeVBlZXJUYXJnZXQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BlZXIucGVlckVuZHBvaW50fXwke3BlZXIucGVlckhvc3RBbGlhcyB8fCBcIlwifWA7XG4gICAgICBpZiAoZGVkdXBlZC5oYXMoa2V5KSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmFtZSA9IGBwZWVyLSR7cGVlci5tc3BJZH0tJHtkZWR1cGVkLnNpemV9YDtcbiAgICAgIGRlZHVwZWQuc2V0KGtleSwge1xuICAgICAgICAuLi5wZWVyLFxuICAgICAgICBuYW1lLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHBlZXJzLmZvckVhY2goYWRkUGVlcik7XG4gICAgYWRkUGVlcih7XG4gICAgICBtc3BJZDogdGhpcy5jb25maWcubXNwSWQsXG4gICAgICBwZWVyRW5kcG9pbnQ6IHRoaXMuY29uZmlnLnBlZXJFbmRwb2ludCxcbiAgICAgIHBlZXJIb3N0QWxpYXM6IHRoaXMuY29uZmlnLnBlZXJIb3N0QWxpYXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShkZWR1cGVkLnZhbHVlcygpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwoKTogUHJvbWlzZTx7XG4gICAgY2VydGlmaWNhdGU6IHN0cmluZztcbiAgICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgdGhpcy5jb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgIHRoaXMuY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGhcbiAgICApO1xuICAgIHJldHVybiB7IGNlcnRpZmljYXRlLCBwcml2YXRlS2V5IH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUocGVlcnM6IExlZ2FjeVBlZXJXaXRoTmFtZVtdKSB7XG4gICAgY29uc3QgcGVlckVudHJpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBjaGFubmVsUGVlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBvcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBwZWVyIG9mIHBlZXJzKSB7XG4gICAgICBjb25zdCB0bHNQZW0gPSBhd2FpdCB0aGlzLnJlYWRQZW1JbnB1dChcbiAgICAgICAgcGVlci50bHNDZXJ0IHx8IHRoaXMuY29uZmlnLnRsc0NlcnRcbiAgICAgICk7XG4gICAgICBjb25zdCBob3N0bmFtZSA9XG4gICAgICAgIHBlZXIucGVlckhvc3RBbGlhcyB8fCB0aGlzLmV4dHJhY3RIb3N0KHBlZXIucGVlckVuZHBvaW50KTtcbiAgICAgIHBlZXJFbnRyaWVzW3BlZXIubmFtZV0gPSB7XG4gICAgICAgIHVybDogdGhpcy5lbnN1cmVHcnBjVXJsKHBlZXIucGVlckVuZHBvaW50KSxcbiAgICAgICAgdGxzQ0FDZXJ0czogeyBwZW06IHRsc1BlbSB9LFxuICAgICAgICBncnBjT3B0aW9uczoge1xuICAgICAgICAgIFwic3NsLXRhcmdldC1uYW1lLW92ZXJyaWRlXCI6IGhvc3RuYW1lLFxuICAgICAgICAgIGhvc3RuYW1lT3ZlcnJpZGU6IGhvc3RuYW1lLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNoYW5uZWxQZWVyc1twZWVyLm5hbWVdID0ge1xuICAgICAgICBlbmRvcnNpbmdQZWVyOiB0cnVlLFxuICAgICAgICBjaGFpbmNvZGVRdWVyeTogdHJ1ZSxcbiAgICAgICAgbGVkZ2VyUXVlcnk6IHRydWUsXG4gICAgICAgIGV2ZW50U291cmNlOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIG9yZ3NbcGVlci5tc3BJZF0gPSBvcmdzW3BlZXIubXNwSWRdIHx8IHtcbiAgICAgICAgbXNwaWQ6IHBlZXIubXNwSWQsXG4gICAgICAgIHBlZXJzOiBbXSxcbiAgICAgIH07XG4gICAgICBvcmdzW3BlZXIubXNwSWRdLnBlZXJzLnB1c2gocGVlci5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogXCJsZWdhY3ktbWFudWFsXCIsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICBjbGllbnQ6IHtcbiAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIH0sXG4gICAgICBvcmdhbml6YXRpb25zOiBvcmdzLFxuICAgICAgcGVlcnM6IHBlZXJFbnRyaWVzLFxuICAgICAgb3JkZXJlcnM6IHt9LFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgW3RoaXMuY29uZmlnLmNoYW5uZWxdOiB7XG4gICAgICAgICAgcGVlcnM6IGNoYW5uZWxQZWVycyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVHJlYXRQZWVyc0FzTG9jYWxob3N0KHBlZXJzOiBMZWdhY3lQZWVyV2l0aE5hbWVbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwZWVycy5ldmVyeSgocGVlcikgPT4gdGhpcy5pc0xvY2FsRW5kcG9pbnQocGVlci5wZWVyRW5kcG9pbnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMb2NhbEVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5leHRyYWN0SG9zdChlbmRwb2ludCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gaG9zdCA9PT0gXCJsb2NhbGhvc3RcIiB8fCBob3N0ID09PSBcIjEyNy4wLjAuMVwiO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG9zdChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBlbmRwb2ludC5yZXBsYWNlKC9eZ3JwY3M/OlxcL1xcLy8sIFwiXCIpO1xuICAgIHJldHVybiBzYW5pdGl6ZWQuc3BsaXQoXCI6XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVHcnBjVXJsKGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICgvXmdycGNzPzpcXC9cXC8vaS50ZXN0KGVuZHBvaW50KSkgcmV0dXJuIGVuZHBvaW50O1xuICAgIHJldHVybiBgZ3JwY3M6Ly8ke2VuZHBvaW50fWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRQZW1JbnB1dChzb3VyY2U/OiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgY2VydGlmaWNhdGUgb3Iga2V5IG1hdGVyaWFsXCIpO1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoc291cmNlKSkgcmV0dXJuIHNvdXJjZS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgY29uc3QgdHJpbW1lZCA9IHNvdXJjZS50cmltKCk7XG4gICAgaWYgKC8tLS0tLUJFR0lOIFtBLVogXSstLS0tLS8udGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQ7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHNvdXJjZSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBpZiAoc3RhdHM/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiBhd2FpdCBnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudChzb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gKGF3YWl0IHJlYWRGc0ZpbGUoc291cmNlKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGludG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW55IGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgQmFzZUVycm9yXG4gICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3JcbiAgICovXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvciB8IHN0cmluZyk6IEUge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLnBhcnNlRXJyb3I8RT4oZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgbW9kaWZpZXMgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogQXJyYXk8c3RyaW5nPixcbiAgICBjbGF6ek9yQ29udHJhY3ROYW1lPzogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICB0cnVlLFxuICAgICAgYXJncyxcbiAgICAgIHRyYW5zaWVudERhdGEsXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zLFxuICAgICAgY2xhenpPckNvbnRyYWN0TmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2YWx1YXRlcyBhIHRyYW5zYWN0aW9uIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhIHRyYW5zYWN0aW9uIHRoYXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBsZWRnZXIgc3RhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIGV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGFwaTogc3RyaW5nLFxuICAgIGFyZ3M/OiBhbnlbXSxcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zPzogQXJyYXk8c3RyaW5nPixcbiAgICBjbGF6ek9yQ29udHJhY3ROYW1lPzogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBhcGksXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3MsXG4gICAgICB0cmFuc2llbnREYXRhLFxuICAgICAgZW5kb3JzaW5nT3JnYW5pemF0aW9ucyxcbiAgICAgIGNsYXp6T3JDb250cmFjdE5hbWVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbWlncmF0ZShcbiAgICByZWZlcmVuY2U6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgbGFzdCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBwcm92aWRlZEN0eCA9XG4gICAgICBsYXN0IGluc3RhbmNlb2YgQ29udGV4dCA/IChsYXN0IGFzIEZhYnJpY0NsaWVudENvbnRleHQpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1pZ3JhdGlvbkFyZ3MgPSBwcm92aWRlZEN0eCA/IGFyZ3Muc2xpY2UoMCwgLTEpIDogYXJncztcbiAgICBjb25zdCBjdHggPVxuICAgICAgcHJvdmlkZWRDdHggfHxcbiAgICAgIChhd2FpdCB0aGlzLmNvbnRleHQoXG4gICAgICAgIFBlcnNpc3RlbmNlS2V5cy5NSUdSQVRJT04sXG4gICAgICAgIHt9LFxuICAgICAgICB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PlxuICAgICAgKSk7XG4gICAgcmV0dXJuIHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIm1pZ3JhdGVcIixcbiAgICAgIFtyZWZlcmVuY2UsIG1pZ3JhdGlvbkFyZ3NdLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgXCJNaWdyYXRpb25Db250cmFjdFwiXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2h1dHMgZG93biB0aGUgY29ubmVjdGlvbiB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ2xvc2VzIHRoZSBhY3RpdmUgZGlzcGF0Y2ggKHdoaWNoIGluIHR1cm4gY2xvc2VzIGFueSBnYXRld2F5XG4gICAqIGV2ZW50IHN1YnNjcmlwdGlvbikgdmlhIHRoZSBiYXNlIGNsYXNzLCB0aGVuIGNsb3NlcyB0aGUgZ1JQQyBjbGllbnQuXG4gICAqIFdvcmtzIGNvcnJlY3RseSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYHN5bnRoZXRpY0V2ZW50c2AgaXMgZW5hYmxlZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNodXRkb3duKFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBCYXNlIGNsYXNzIGhhbmRsZXMgZGlzcGF0Y2guY2xvc2UoKSBpbnRlcm5hbGx5LlxuICAgIGF3YWl0IHN1cGVyLnNodXRkb3duKC4uLmFyZ3MpO1xuICAgIGlmICh0aGlzLmNsaWVudCkge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgQ2xvc2luZyAke3RoaXMuY29uZmlnLm1zcElkfSBnYXRld2F5IGNsaWVudGApO1xuICAgICAgdGhpcy5jbGllbnQuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBDb250cmFjdCBpbnN0YW5jZSBmcm9tIGEgR2F0ZXdheVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBjaGFpbmNvZGUgY29udHJhY3QgZnJvbSB0aGUgc3BlY2lmaWVkIG5ldHdvcmtcbiAgICogQHBhcmFtIHtHYXRld2F5fSBnYXRld2F5IC0gVGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NvbnRyYWt0fSBUaGUgQ29udHJhY3QgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDb250cmFjdChcbiAgICBnYXRld2F5OiBHYXRld2F5LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjbGF6ek9yQ29udHJhY3ROYW1lPzogc3RyaW5nIHwgQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgY3R4PzogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBQcm9taXNlPENvbnRyYWt0PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q29udHJhY3QpO1xuXG4gICAgbGV0IGNoYW5uZWwgPSBjb25maWcuY2hhbm5lbDtcbiAgICBsZXQgY2hhaW5jb2RlID0gY29uZmlnLmNoYWluY29kZU5hbWU7XG4gICAgbGV0IGNvbnRyYWN0TmFtZSA9IGNvbmZpZy5jb250cmFjdE5hbWU7XG5cbiAgICBpZiAoY2xhenpPckNvbnRyYWN0TmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBjbGF6ek9yQ29udHJhY3ROYW1lID09PSBcInN0cmluZ1wiKVxuICAgICAgICBjb250cmFjdE5hbWUgPSBjbGF6ek9yQ29udHJhY3ROYW1lO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYE5vIGNvbnRleHQgcmVjZWl2ZWQgdG8gZGV0ZXJtaW5lIGNoYWluY29kZSBjb25maWdgXG4gICAgICAgICAgKTtcbiAgICAgICAgY2hhbm5lbCA9XG4gICAgICAgICAgKGF3YWl0IHRoaXMuY2hhbm5lbEZvcihjbGF6ek9yQ29udHJhY3ROYW1lLCBjb25maWcsIGN0eCkpIHx8IGNoYW5uZWw7XG4gICAgICAgIGNoYWluY29kZSA9XG4gICAgICAgICAgKGF3YWl0IHRoaXMuY2hhaW5jb2RlRm9yKGNsYXp6T3JDb250cmFjdE5hbWUsIGNvbmZpZywgY3R4KSkgfHxcbiAgICAgICAgICBjaGFpbmNvZGU7XG4gICAgICAgIGNvbnRyYWN0TmFtZSA9IGF3YWl0IHRoaXMuY29udHJhY3RGb3IoY2xhenpPckNvbnRyYWN0TmFtZSwgY29uZmlnLCBjdHgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5ldHdvcmsgPSB0aGlzLmdldE5ldHdvcmsoZ2F0ZXdheSwgY2hhbm5lbCk7XG4gICAgbGV0IGNvbnRyYWN0OiBDb250cmFrdDtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgUmV0cmlldmluZyBjaGFpbmNvZGUgJHtjaGFpbmNvZGV9IGNvbnRyYWN0ICR7Y29udHJhY3ROYW1lfSBmcm9tIG5ldHdvcmsgJHtjaGFubmVsfWBcbiAgICAgICk7XG4gICAgICBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoY2hhaW5jb2RlLCBjb250cmFjdE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJhY3Q7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBOZXR3b3JrIGluc3RhbmNlIGZyb20gYSBHYXRld2F5XG4gICAqIEBzdW1tYXJ5IENvbm5lY3RzIHRvIGEgc3BlY2lmaWMgY2hhbm5lbCBvbiB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHBhcmFtIHtHYXRld2F5fSBnYXRld2F5IC0gVGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgKiBAcmV0dXJuIHtOZXR3b3JrfSBUaGUgTmV0d29yayBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldE5ldHdvcmsoZ2F0ZXdheTogR2F0ZXdheSwgY2hhbm5lbE5hbWU6IHN0cmluZyk6IE5ldHdvcmsge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuZ2V0TmV0d29yayk7XG4gICAgbGV0IG5ldHdvcms6IE5ldHdvcms7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ29ubmVjdGluZyB0byBjaGFubmVsICR7Y2hhbm5lbE5hbWV9YCk7XG4gICAgICBuZXR3b3JrID0gZ2F0ZXdheS5nZXROZXR3b3JrKGNoYW5uZWxOYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV0d29yaztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIEdhdGV3YXkgaW5zdGFuY2UgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBHYXRld2F5IHVzaW5nIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBbY2xpZW50XSAtIE9wdGlvbmFsIGdSUEMgY2xpZW50LCB3aWxsIGJlIGNyZWF0ZWQgaWYgbm90IHByb3ZpZGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBHYXRld2F5IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0R2F0ZXdheShcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNsaWVudD86IENsaWVudFxuICApIHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvbihcbiAgICAgIGNsaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRDbGllbnQoY29uZmlnKSksXG4gICAgICBjb25maWcsXG4gICAgICBjdHhcbiAgICApKSBhcyBHYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGNsaWVudCB3aXRoIFRMUyBjcmVkZW50aWFscyBmb3Igc2VjdXJlIGNvbW11bmljYXRpb25cbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0NsaWVudH0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBzdGF0aWMgZ2V0Q2xpZW50KGNvbmZpZzogUGVlckNvbmZpZyk6IENsaWVudCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0Q2xpZW50KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgVExTIGNyZWRlbnRpYWxzIGZvciBtc3AgJHtjb25maWcubXNwSWR9YCk7XG4gICAgbGV0IHBhdGhPckNlcnQ6IHN0cmluZyB8IEJ1ZmZlciA9IGNvbmZpZy50bHNDZXJ0IGFzIHN0cmluZyB8IEJ1ZmZlcjtcblxuICAgIGlmICh0eXBlb2YgcGF0aE9yQ2VydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKFxuICAgICAgICBwYXRoT3JDZXJ0Lm1hdGNoKFxuICAgICAgICAgIC8tLS0tLUJFR0lOIChDRVJUSUZJQ0FURXxLRVl8UFJJVkFURSBLRVkpLS0tLS0uKz8tLS0tLUVORCBcXDEtLS0tLSQvZ21zXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20ocGF0aE9yQ2VydCwgXCJ1dGY4XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXRoT3JDZXJ0ID0gQnVmZmVyLmZyb20oZnMucmVhZEZpbGVTeW5jKHBhdGhPckNlcnQsIFwidXRmOFwiKSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCB0aGUgdGxzIGNlcnRpZmljYXRlIGZyb20gJHtwYXRoT3JDZXJ0fTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGxzQ3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbChwYXRoT3JDZXJ0KTtcbiAgICBsb2cuZGVidWcoYGdlbmVyYXRpbmcgR2F0ZXdheSBDbGllbnQgZm9yIHVybCAke2NvbmZpZy5wZWVyRW5kcG9pbnR9YCk7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoY29uZmlnLnBlZXJFbmRwb2ludCwgdGxzQ3JlZGVudGlhbHMsIHtcbiAgICAgIFwiZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICAgIFwiZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aFwiOiAoY29uZmlnLnNpemVMaW1pdCB8fCAxNSkgKiAxMDI0ICogMTAyNCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgR2F0ZXdheSBjb25uZWN0aW9uIHdpdGggaWRlbnRpdHkgYW5kIHNpZ25lclxuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gVGhlIGdSUEMgY2xpZW50XG4gICAqIEBwYXJhbSB7UGVlckNvbmZpZ30gY29uZmlnIC0gVGhlIHBlZXIgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdhdGV3YXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY29ubmVjdGVkIEdhdGV3YXlcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IElkZW50aXR5XG4gICAqICAgcGFydGljaXBhbnQgU2lnbmVyXG4gICAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICAgKlxuICAgKiAgIENhbGxlci0+PkZhYnJpY0FkYXB0ZXI6IGdldENvbm5lY3Rpb24oY2xpZW50LCBjb25maWcpXG4gICAqICAgRmFicmljQWRhcHRlci0+PklkZW50aXR5OiBnZXRJZGVudGl0eShtc3BJZCwgY2VydERpcmVjdG9yeVBhdGgpXG4gICAqICAgSWRlbnRpdHktLT4+RmFicmljQWRhcHRlcjogaWRlbnRpdHlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+U2lnbmVyOiBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aClcbiAgICogICBTaWduZXItLT4+RmFicmljQWRhcHRlcjogc2lnbmVyXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IENyZWF0ZSBDb25uZWN0T3B0aW9uc1xuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KG9wdGlvbnMpXG4gICAqICAgR2F0ZXdheS0tPj5GYWJyaWNBZGFwdGVyOiBnYXRld2F5XG4gICAqICAgRmFicmljQWRhcHRlci0tPj5DYWxsZXI6IGdhdGV3YXlcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRDb25uZWN0aW9uKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKSB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXRDb25uZWN0aW9uKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgUmV0cmlldmluZyBQZWVyIElkZW50aXR5IGZvciAke2NvbmZpZy5tc3BJZH0gdW5kZXIgJHtjb25maWcuY2VydENlcnRPckRpcmVjdG9yeVBhdGh9YFxuICAgICk7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBnZXRJZGVudGl0eShcbiAgICAgIGNvbmZpZy5tc3BJZCxcbiAgICAgIGNvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnlcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBwcmVwYXJpbmcgdHJhbnNhY3Rpb24gc2lnbmVyIGZvciAke0NyeXB0b1V0aWxzLmZhYnJpY0lkRnJvbUNlcnRpZmljYXRlKGlkZW50aXR5LmNyZWRlbnRpYWxzLnRvU3RyaW5nKCkpfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCBGYWJyaWMgSUQgZnJvbSBjZXJ0aWZpY2F0ZWAsIGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBzaWduZXI6IFNpZ25lcjtcbiAgICBjb25zdCBjbG9zZSA9ICgpID0+IHt9O1xuICAgIGlmICghY29uZmlnLmhzbSkge1xuICAgICAgc2lnbmVyID0gYXdhaXQgZ2V0U2lnbmVyKGNvbmZpZy5rZXlDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnN0IGhzbSA9IG5ldyBIU01TaWduZXJGYWN0b3J5Q3VzdG9tKGNvbmZpZy5oc20ubGlicmFyeSk7XG4gICAgICAvLyBjb25zdCBpZGVudGlmaWVyID0gaHNtLmdldFNLSUZyb21DZXJ0aWZpY2F0ZVBhdGgoXG4gICAgICAvLyAgIGNvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aCBhcyBhbnlcbiAgICAgIC8vICk7XG4gICAgICAvLyBjb25zdCBwa2NzMTFTaWduZXIgPSBoc20ubmV3U2lnbmVyKHtcbiAgICAgIC8vICAgbGFiZWw6IGNvbmZpZy5oc20udG9rZW5MYWJlbCBhcyBzdHJpbmcsXG4gICAgICAvLyAgIHBpbjogU3RyaW5nKGNvbmZpZy5oc20ucGluKSBhcyBzdHJpbmcsXG4gICAgICAvLyAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAvLyAgIC8vIHVzZXJUeXBlOiAxIC8qQ0tVX1VTRVIgKi8sXG4gICAgICAvLyB9KTtcbiAgICAgIC8vIHNpZ25lciA9IHBrY3MxMVNpZ25lci5zaWduZXI7XG4gICAgICAvLyBjbG9zZSA9IHBrY3MxMVNpZ25lci5jbG9zZTtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFwiSFNNIE5PVCBJTVBMRU1FTlRFRFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgY2xpZW50LFxuICAgICAgaWRlbnRpdHk6IGlkZW50aXR5LFxuICAgICAgc2lnbmVyOiBzaWduZXIsXG4gICAgICAvLyBEZWZhdWx0IHRpbWVvdXRzIGZvciBkaWZmZXJlbnQgZ1JQQyBjYWxsc1xuICAgICAgZXZhbHVhdGVPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJldmFsdWF0ZVRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgZW5kb3JzZU9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImVuZG9yc2VUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDE1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBzdWJtaXRPcHRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGRlYWRsaW5lOiBEYXRlLm5vdygpICsgMTAwMCAqIGN0eC5nZXQoXCJzdWJtaXRUaW1lb3V0XCIpIH07IC8vIGRlZmF1bHRzIHRvIDUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIGNvbW1pdFN0YXR1c09wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImNvbW1pdFRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gMSBtaW51dGVcbiAgICAgIH0sXG4gICAgfSBhcyBDb25uZWN0T3B0aW9ucztcblxuICAgIGxvZy5kZWJ1ZyhgQ29ubmVjdGluZyB0byAke2NvbmZpZy5tc3BJZH1gKTtcbiAgICBjb25zdCBnYXRld2F5ID0gY29ubmVjdChvcHRpb25zKTtcblxuICAgIC8vIFRPRE86IHJlcGxhY2U/XG4gICAgaWYgKGNvbmZpZy5oc20pIHtcbiAgICAgIGdhdGV3YXkuY2xvc2UgPSBuZXcgUHJveHkoZ2F0ZXdheS5jbG9zZSwge1xuICAgICAgICBhcHBseSh0YXJnZXQ6ICgpID0+IHZvaWQsIHRoaXNBcmc6IGFueSwgYXJnQXJyYXk6IGFueVtdKTogYW55IHtcbiAgICAgICAgICBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJnQXJyYXkpO1xuICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2F0ZXdheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBEaXNwYXRjaCBpbnN0YW5jZSBmb3IgdGhlIEZhYnJpYyBjbGllbnQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgbmV3IEZhYnJpY0NsaWVudERpc3BhdGNoIGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRmFicmljIG5ldHdvcmsuXG4gICAqIEByZXR1cm5zIHtEaXNwYXRjaH0gQSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2UgY29uZmlndXJlZCBmb3IgdGhlIEZhYnJpYyBjbGllbnQuXG4gICAqIEByZW1hcmtzIFRoZSBEaXNwYXRjaCBpbnN0YW5jZSBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBsb2dpYyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgRmFicmljIG5ldHdvcmssIHN1Y2ggYXMgc3VibWl0dGluZyB0cmFuc2FjdGlvbnMgb3IgcXVlcnlpbmcgZGF0YS5cbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgZmFicmljRGlzcGF0Y2ggPSBmYWJyaWNDbGllbnRBZGFwdGVyLkRpc3BhdGNoKCk7XG4gICAqIGZhYnJpY0Rpc3BhdGNoLnN1Ym1pdFRyYW5zYWN0aW9uKCdjcmVhdGVQcm9kdWN0JywgeyBuYW1lOiAnUHJvZHVjdCBBJywgcHJpY2U6IDEwMCB9KTtcbiAgICovXG4gIG92ZXJyaWRlIERpc3BhdGNoKCk6IEZhYnJpY0NsaWVudERpc3BhdGNoIHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudEFkYXB0ZXJbXCJfYmFzZURpc3BhdGNoXCJdKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgY2hhaW5jb2RlRm9yKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgcmV0dXJuIE1vZGVsLmNoYWluY29kZU9mKG1vZGVsLCAuLi5hcmdzKSB8fCBjb25maWcuY2hhaW5jb2RlTmFtZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgY2hhbm5lbEZvcihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIHJldHVybiBNb2RlbC5jaGFubmVsT2YobW9kZWwsIC4uLmFyZ3MpIHx8IGNvbmZpZy5jaGFubmVsO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBjb250cmFjdEZvcihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICBNb2RlbC5jb250cmFjdE9mKG1vZGVsLCAuLi5hcmdzKSB8fFxuICAgICAgRGVmYXVsdENvbnRyYWN0UmVzb2x2ZXIobW9kZWwsIC4uLmFyZ3MpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGludG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW55IGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgQmFzZUVycm9yIHVzaW5nIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvclxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KFxuICAgIGVycjogRXJyb3IgfCBzdHJpbmcgfCBHYXRld2F5RXJyb3JcbiAgKTogRSB7XG4gICAgLy8gaWYgKFxuICAgIC8vICAgTUlTU0lOR19QUklWQVRFX0RBVEFfUkVHRVgudGVzdChcbiAgICAvLyAgICAgdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlXG4gICAgLy8gICApXG4gICAgLy8gKVxuICAgIC8vICAgcmV0dXJuIG5ldyBVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyhlcnIpIGFzIEU7XG5cbiAgICBsZXQgbXNnID0gdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlO1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBHYXRld2F5RXJyb3IgJiYgZXJyLmRldGFpbHMubGVuZ3RoICYmIGVyci5jb2RlID09PSAxMCkge1xuICAgICAgbXNnID0gYCR7ZXJyLmRldGFpbHNbMF0ubWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGVyciBpbnN0YW5jZW9mIEVuZG9yc2VFcnJvciAmJlxuICAgICAgZXJyLmRldGFpbHMubGVuZ3RoICYmXG4gICAgICBlcnIuY29kZSA9PT0gMTAgJiZcbiAgICAgIGVyci5kZXRhaWxzWzBdLm1lc3NhZ2U/LmluY2x1ZGVzKFVuc3VwcG9ydGVkRXJyb3IubmFtZSlcbiAgICApIHtcbiAgICAgIG1zZyA9IGAke2Vyci5kZXRhaWxzWzBdLm1lc3NhZ2V9YDtcbiAgICB9XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiTVZDQ19SRUFEX0NPTkZMSUNUXCIpKVxuICAgICAgcmV0dXJuIG5ldyBNdmNjUmVhZENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIkRFQURMSU5FX0VYQ0VFREVEXCIpKVxuICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvblRpbWVvdXRFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAoXG4gICAgICBtc2cuaW5jbHVkZXMoXCJjaGFpbmNvZGUgc3RyZWFtIHRlcm1pbmF0ZWRcIikgfHxcbiAgICAgIG1zZy5pbmNsdWRlcyhcIlJFU09VUkNFX0VYSEFVU1RFRFwiKSB8fFxuICAgICAgbXNnLmluY2x1ZGVzKFwicmVjZWl2ZWQgbWVzc2FnZSBsYXJnZXIgdGhhbiBtYXhcIikgfHxcbiAgICAgIG1zZy5pbmNsdWRlcyhcImdycGM6IHJlY2VpdmVkIG1lc3NhZ2UgbGFyZ2VyXCIpXG4gICAgKVxuICAgICAgcmV0dXJuIG5ldyBRdWVyeVJlc3VsdFRvb0xhcmdlRXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIkVORE9SU0VNRU5UX1BPTElDWV9GQUlMVVJFXCIpKVxuICAgICAgcmV0dXJuIG5ldyBFbmRvcnNlbWVudFBvbGljeUVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJQSEFOVE9NX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgIHN3aXRjaCAoKGVyciBhcyBhbnkpLmNvZGUpIHtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJldHVybiBuZXcgRW5kb3JzZW1lbnRFcnJvcihlcnIpIGFzIEU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhWYWxpZGF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhOb3RGb3VuZEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29uZmxpY3RFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEJhZFJlcXVlc3RFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFF1ZXJ5RXJyb3IubmFtZSkpIHJldHVybiBuZXcgUXVlcnlFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhQYWdpbmdFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBQYWdpbmdFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE1pZ3JhdGlvbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE1pZ3JhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE9ic2VydmVyRXJyb3IubmFtZSkpIHJldHVybiBuZXcgT2JzZXJ2ZXJFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhBdXRob3JpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhGb3JiaWRkZW5FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBGb3JiaWRkZW5FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25uZWN0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhTZXJpYWxpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgRTtcbiAgfVxufVxuXG5GYWJyaWNDbGllbnRBZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChGYWJyaWNGbGF2b3VyKTtcbiIsImltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIENvbnRleHR1YWxBcmdzLFxuICBEaXNwYXRjaCxcbiAgRXZlbnRJZHMsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBQZWVyQ29uZmlnIH0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSBcIkBncnBjL2dycGMtanNcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEFkYXB0ZXIgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRBZGFwdGVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENoYWluY29kZUV2ZW50LFxuICBDbG9zZWFibGVBc3luY0l0ZXJhYmxlLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBwYXJzZUV2ZW50TmFtZSB9IGZyb20gXCIuLi9zaGFyZWQvZXZlbnRzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV2ZW50IGRpc3BhdGNoZXIgZm9yIEh5cGVybGVkZ2VyIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBhbmQgcHJvY2Vzc2VzIGV2ZW50cyBlbWl0dGVkIGJ5IEZhYnJpYyBjaGFpbmNvZGUsIGRpc3BhdGNoaW5nIHRoZW0gdG8gcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAqIEB0ZW1wbGF0ZSBQZWVyQ29uZmlnIC0gQ29uZmlndXJhdGlvbiB0eXBlIGZvciBjb25uZWN0aW5nIHRvIGEgRmFicmljIHBlZXJcbiAqIEBwYXJhbSBjbGllbnQgLSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnREaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBGYWJyaWNEaXNwYXRjaCBpbnN0YW5jZVxuICogY29uc3QgY2xpZW50ID0gYXdhaXQgRmFicmljQWRhcHRlci5nZXRDbGllbnQocGVlckNvbmZpZyk7XG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBGYWJyaWNEaXNwYXRjaChjbGllbnQpO1xuICpcbiAqIC8vIENvbmZpZ3VyZSB0aGUgZGlzcGF0Y2ggd2l0aCBwZWVyIGNvbmZpZ3VyYXRpb25cbiAqIGRpc3BhdGNoLmNvbmZpZ3VyZShwZWVyQ29uZmlnKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhbiBvYnNlcnZlciBmb3IgYSBzcGVjaWZpYyB0YWJsZSBhbmQgZXZlbnRcbiAqIGRpc3BhdGNoLm9ic2VydmUoJ3VzZXJzJywgJ2NyZWF0ZScsIChpZCkgPT4ge1xuICogICBjb25zb2xlLmxvZyhgVXNlciBjcmVhdGVkOiAke2lkfWApO1xuICogfSk7XG4gKlxuICogLy8gU3RhcnQgbGlzdGVuaW5nIGZvciBldmVudHNcbiAqIGF3YWl0IGRpc3BhdGNoLnN0YXJ0KCk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0Rpc3BhdGNoXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBuZXcgRmFicmljRGlzcGF0Y2goY2xpZW50KVxuICogICBDbGllbnQtPj5GYWJyaWNEaXNwYXRjaDogY29uZmlndXJlKHBlZXJDb25maWcpXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBvYnNlcnZlKHRhYmxlLCBldmVudCwgY2FsbGJhY2spXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBzdGFydCgpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGluaXRpYWxpemUoKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkdhdGV3YXk6IGdldEdhdGV3YXkoY29uZmlnLCBjbGllbnQpXG4gKiAgIEdhdGV3YXktPj5OZXR3b3JrOiBnZXROZXR3b3JrKGNoYW5uZWwpXG4gKiAgIE5ldHdvcmstPj5OZXR3b3JrOiBnZXRDaGFpbmNvZGVFdmVudHMoY2hhaW5jb2RlTmFtZSlcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaGFuZGxlRXZlbnRzKClcbiAqICAgbG9vcCBGb3IgZWFjaCBldmVudFxuICogICAgIENoYWluY29kZS0tPj5GYWJyaWNEaXNwYXRjaDogQ2hhaW5jb2RlRXZlbnRcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZUV2ZW50TmFtZShldmVudE5hbWUpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VQYXlsb2FkKHBheWxvYWQpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgICAgRmFicmljRGlzcGF0Y2gtLT4+Q2xpZW50OiBjYWxsYmFjayhpZClcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDbGllbnREaXNwYXRjaCBleHRlbmRzIERpc3BhdGNoPEZhYnJpY0NsaWVudEFkYXB0ZXI+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBsaXN0ZW5pbmcgc3RhY2sgZm9yIGNoYWluY29kZSBldmVudHNcbiAgICovXG4gIHByaXZhdGUgbGlzdGVuaW5nU3RhY2s/OiBDbG9zZWFibGVBc3luY0l0ZXJhYmxlPENoYWluY29kZUV2ZW50PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRleHQgZGVjb2RlciBmb3IgY29udmVydGluZyBldmVudCBwYXlsb2FkcyBmcm9tIGJ5dGVzIHRvIHN0cmluZ3NcbiAgICovXG4gIHByaXZhdGUgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0Rpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgZGlzcGF0Y2hlciBmb3IgRmFicmljIGNoYWluY29kZSBldmVudHNcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCAtIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNsaWVudDogQ2xpZW50KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xvc2VzIHRoZSBldmVudCBsaXN0ZW5pbmcgY29ubmVjdGlvblxuICAgKiBAc3VtbWFyeSBTdG9wcyBsaXN0ZW5pbmcgZm9yIGNoYWluY29kZSBldmVudHMgYW5kIHJlbGVhc2VzIHJlc291cmNlc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNsb3NlKFxuICAgIC4uLmN0eEFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzOiBsb2dnZWRBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChjdHhBcmdzLCBQZXJzaXN0ZW5jZUtleXMuU0hVVERPV04sIHRydWUpXG4gICAgKS5mb3IodGhpcy5jbG9zZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN1cGVyLmNsb3NlKC4uLmxvZ2dlZEFyZ3MpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNsb3NlIEZhYnJpYyBwcm94aWVzIGV2ZW50IGxpc3RlbmVyYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGlmICh0aGlzLmxpc3RlbmluZ1N0YWNrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmxpc3RlbmluZ1N0YWNrLmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNsb3NlIEZhYnJpYyBldmVudCBsaXN0ZW5lcmAsIGUgYXMgRXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBldmVudCBwYXlsb2FkIGZyb20gYmluYXJ5IGZvcm1hdFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgY29udGFpbmluZyBKU09OIHRvIGFuIG9iamVjdCB3aXRoIGFuIGlkIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ganNvbkJ5dGVzIC0gVGhlIGJpbmFyeSBwYXlsb2FkIGZyb20gdGhlIGNoYWluY29kZSBldmVudFxuICAgKiBAcmV0dXJuIHt7IGlkOiBzdHJpbmcgfX0gVGhlIHBhcnNlZCBwYXlsb2FkIGNvbnRhaW5pbmcgdGhlIHJlY29yZCBJRFxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVBheWxvYWQoanNvbkJ5dGVzOiBVaW50OEFycmF5KTogeyBpZDogc3RyaW5nOyByZXN1bHQ/OiBhbnkgfSB7XG4gICAgY29uc3QganNvbiA9IHRoaXMuZGVjb2Rlci5kZWNvZGUoanNvbkJ5dGVzKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIG9ic2VydmluZyBhbiBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IENvbm5lY3RzIHRoaXMgZGlzcGF0Y2ggdG8gYW4gYWRhcHRlciB0byBtb25pdG9yIGl0cyBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+fSBvYnNlcnZlciAtIFRoZSBhZGFwdGVyIHRvIG9ic2VydmVcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIG92ZXJyaWRlIG9ic2VydmUob2JzZXJ2ZXI6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pik6ICgpID0+IHZvaWQge1xuICAgIGlmICghKG9ic2VydmVyIGluc3RhbmNlb2YgRmFicmljQ2xpZW50QWRhcHRlcikpXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgXCJPbmx5IEZhYnJpY0NsaWVudEFkYXB0ZXIgY2FuIGJlIG9ic2VydmVkIGJ5IGRpc3BhdGNoXCJcbiAgICAgICk7XG4gICAgc3VwZXIub2JzZXJ2ZShvYnNlcnZlciBhcyBGYWJyaWNDbGllbnRBZGFwdGVyKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG9ic2VydmVycyBhYm91dCBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHthbnl9IHBheWxvYWQgLSBUaGUgZXZlbnQgcGF5bG9hZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBBZGFwdGVyLmxvZ0N0eDxGYWJyaWNDbGllbnRDb250ZXh0PihcbiAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzLFxuICAgICAgZXZlbnQsXG4gICAgICBmYWxzZSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoOyBza2lwcGluZyBvYnNlcnZlciB1cGRhdGUgZm9yICR7dHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiBNb2RlbC50YWJsZU5hbWUobW9kZWwpfToke2V2ZW50fWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIucmVmcmVzaChtb2RlbCwgZXZlbnQsIGlkLCAuLi5jdHhBcmdzKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggZGlzcGF0Y2g6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBpbmNvbWluZyBjaGFpbmNvZGUgZXZlbnRzXG4gICAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGV2ZW50cyBmcm9tIHRoZSBjaGFpbmNvZGUgYW5kIGRpc3BhdGNoZXMgdGhlbSB0byByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVudCBoYW5kbGluZyBzdG9wc1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEV2ZW50U3RhY2tcbiAgICogICBwYXJ0aWNpcGFudCBFdmVudFBhcnNlclxuICAgKiAgIHBhcnRpY2lwYW50IE9ic2VydmVyc1xuICAgKlxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IGhhbmRsZUV2ZW50cygpXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5FdmVudFN0YWNrOiBmb3IgYXdhaXQgKGNvbnN0IGV2dCBvZiBsaXN0ZW5pbmdTdGFjaylcbiAgICogICBFdmVudFN0YWNrLS0+PkZhYnJpY0Rpc3BhdGNoOiBDaGFpbmNvZGVFdmVudFxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+RXZlbnRQYXJzZXI6IHBhcnNlRXZlbnROYW1lKGV2dC5ldmVudE5hbWUpXG4gICAqICAgRXZlbnRQYXJzZXItLT4+RmFicmljRGlzcGF0Y2g6IHsgdGFibGUsIGV2ZW50LCBvd25lciB9XG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogQ2hlY2sgaWYgZXZlbnQgaXMgZm9yIHRoaXMgTVNQXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogcGFyc2VQYXlsb2FkKGV2dC5wYXlsb2FkKVxuICAgKiAgIEZhYnJpY0Rpc3BhdGNoLT4+T2JzZXJ2ZXJzOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBwYXlsb2FkLmlkKVxuICAgKiAgIE9ic2VydmVycy0tPj5GYWJyaWNEaXNwYXRjaDogQ2FsbGJhY2tzIGV4ZWN1dGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRXZlbnRzKFxuICAgIGN0eEFyZz86IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmxpc3RlbmluZ1N0YWNrKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBFdmVudCBzdGFjayBub3QgaW5pdGlhbGl6ZWQuIEVuc3VyZSB0aGF0IFwic3RhcnRMaXN0ZW5pbmdcIiBpcyBjYWxsZWQgYmVmb3JlIGF0dGVtcHRpbmcgdGhpcyBvcGVyYXRpb24uYFxuICAgICAgKTtcblxuICAgIGlmICghdGhpcy5hZGFwdGVyIHx8ICF0aGlzLmFkYXB0ZXIuY29uZmlnKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIgZm91bmQuIHNob3VsZCBiZSBpbXBvc3NpYmxlYCk7XG5cbiAgICBjb25zdCBjdHggPVxuICAgICAgY3R4QXJnIHx8XG4gICAgICAoYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgICAge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgKHRoaXMubW9kZWxzICYmIHRoaXMubW9kZWxzWzBdKSB8fCAoTW9kZWwgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcilcbiAgICAgICkpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmhhbmRsZUV2ZW50cyk7XG5cbiAgICBsb2cuaW5mbyhcbiAgICAgIGBMaXN0ZW5pbmcgZm9yIGluY29taW5nIGV2ZW50cyBvbiBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCIuLi5gXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2dCBvZiB0aGlzLmxpc3RlbmluZ1N0YWNrKSB7XG4gICAgICAgIGNvbnN0IHsgdGFibGUsIGV2ZW50LCBvd25lciB9ID0gcGFyc2VFdmVudE5hbWUoZXZ0LmV2ZW50TmFtZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnPy5tc3BFdmVudE9ubHkgJiZcbiAgICAgICAgICBvd25lciAmJlxuICAgICAgICAgIG93bmVyICE9PSB0aGlzLmFkYXB0ZXIuY29uZmlnPy5tc3BJZFxuICAgICAgICApXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IHsgaWQ6IHN0cmluZzsgcmVzdWx0PzogYW55IH0gPSB0aGlzLnBhcnNlUGF5bG9hZChcbiAgICAgICAgICBldnQucGF5bG9hZFxuICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldE1vZGVsID0gdGFibGVcbiAgICAgICAgICAgID8gTW9kZWwuZ2V0KHRhYmxlKVxuICAgICAgICAgICAgOiBNb2RlbC5nZXQodGhpcy5tb2RlbHNbMF0ubmFtZSk7XG4gICAgICAgICAgY29uc3QgbW9kZWxSZWYgPSB0YXJnZXRNb2RlbCA/PyAodGFibGUgfHwgdGhpcy5tb2RlbHNbMF0/Lm5hbWUpO1xuICAgICAgICAgIGNvbnN0IG9ic2VydmVyQXJncyA9IHBheWxvYWQucmVzdWx0ID8gW3BheWxvYWQucmVzdWx0LCBjdHhdIDogW2N0eF07XG4gICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVPYnNlcnZlcnMoXG4gICAgICAgICAgICBtb2RlbFJlZiBhcyBDb25zdHJ1Y3RvciB8IHN0cmluZyxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgcGF5bG9hZC5pZCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAuLi4ob2JzZXJ2ZXJBcmdzIGFzIENvbnRleHR1YWxBcmdzPGFueT4pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdXBkYXRlIG9ic2VydmFibGVzIGZvciB0YWJsZSAke3RhYmxlfSBldmVudCAke2V2ZW50fSBpZDogJHtwYXlsb2FkLmlkfTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBsb2cuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBldmVudCBmb3IgY2hhaW5jb2RlIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWV9XCIgb24gY2hhbm5lbCBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsfVwiOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoY3R4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lclxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIGV2ZW50IGRpc3BhdGNoaW5nIGZvciB0aGUgb2JzZXJ2ZWQgYWRhcHRlci4gV2hlblxuICAgKiBgc3ludGhldGljRXZlbnRzYCBpcyB0cnVlICh0aGUgZGVmYXVsdCkgbm8gZ2F0ZXdheSBjb25uZWN0aW9uIGlzIG9wZW5lZDtcbiAgICogaW5zdGVhZCBldmVyeSBDUlVEIG9wZXJhdGlvbiBpcyB3cmFwcGVkIHdpdGggYSBQcm94eSB0aGF0IGZpcmVzXG4gICAqIGB1cGRhdGVPYnNlcnZlcnNgIGZvciAqKmFsbCoqIG1vZGVscy4gV2hlbiBgc3ludGhldGljRXZlbnRzYCBpcyBmYWxzZSB0aGVcbiAgICogZXhpc3RpbmcgZ2F0ZXdheS1iYXNlZCBjaGFpbmNvZGUtZXZlbnQgc3Vic2NyaXB0aW9uIGlzIGVzdGFibGlzaGVkIGFuZCB0aGVcbiAgICogbG9jYWwgUHJveHkgZmFsbGJhY2sgaXMgbGltaXRlZCB0byBmdWxseS1zZWdyZWdhdGVkICh0cmFuc2llbnQpIG1vZGVscyBvbmx5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvciBjb25maWcgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG5cbiAgICBjb25zdCBzeW50aGV0aWNFdmVudHMgPSB0aGlzLmFkYXB0ZXIuY29uZmlnLnN5bnRoZXRpY0V2ZW50cyAhPT0gZmFsc2U7XG5cbiAgICBpZiAoIXN5bnRoZXRpY0V2ZW50cykge1xuICAgICAgLy8gR2F0ZXdheS1iYXNlZCBjaGFpbmNvZGUtZXZlbnQgc3Vic2NyaXB0aW9uIChub24tc3ludGhldGljIHBhdGgpXG4gICAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIFwiZGlzcGF0Y2hcIixcbiAgICAgICAge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgTW9kZWwgYXMgYW55XG4gICAgICApO1xuICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5pbml0aWFsaXplKTtcbiAgICAgIGNvbnN0IGdhdGV3YXkgPSBhd2FpdCBGYWJyaWNDbGllbnRBZGFwdGVyLmdldEdhdGV3YXkoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZyBhcyBQZWVyQ29uZmlnLFxuICAgICAgICB0aGlzLmNsaWVudFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsodGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFubmVsKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcbiAgICAgIHRoaXMubGlzdGVuaW5nU3RhY2sgPSBhd2FpdCBuZXR3b3JrLmdldENoYWluY29kZUV2ZW50cyhcbiAgICAgICAgdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lXG4gICAgICApO1xuICAgICAgdGhpcy5oYW5kbGVFdmVudHMoY3R4KTtcbiAgICB9XG5cbiAgICAvLyBQcm94eSBDUlVEIG1ldGhvZHMuXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IHRydWUgIOKGkiBub3RpZnkgZm9yIEFMTCBtb2RlbHMgKHJlcGxhY2VzIGdhdGV3YXkgZXZlbnRzIGVudGlyZWx5KVxuICAgIC8vIOKAoiBzeW50aGV0aWNFdmVudHMgPSBmYWxzZSDihpIgbm90aWZ5IG9ubHkgZm9yIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzXG4gICAgLy8gICAodGhlIGdhdGV3YXkgc3Vic2NyaXB0aW9uIGhhbmRsZXMgcHVibGljIG1vZGVscylcbiAgICAoXG4gICAgICBbXG4gICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBdIGFzIChrZXlvZiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pW11cbiAgICApLmZvckVhY2goKHRvV3JhcCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBObyBhZGFwdGVyIHByb3ZpZGVkIGZvciB0aGUgZmFsbGJhY2sgb2YgZnVsbHkgc2VncmVnYXRlZCBtb2RlbHNgXG4gICAgICAgICk7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlclt0b1dyYXBdKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWV0aG9kICR7dG9XcmFwfSBub3QgZm91bmQgaW4gJHt0aGlzLmFkYXB0ZXIuYWxpYXN9IGFkYXB0ZXIgdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcblxuICAgICAgbGV0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMuYWRhcHRlciwgdG9XcmFwKTtcbiAgICAgIGxldCBwcm90bzogYW55ID0gdGhpcy5hZGFwdGVyO1xuICAgICAgd2hpbGUgKCFkZXNjcmlwdG9yICYmIHByb3RvICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgICAgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHRvV3JhcCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGVzY3JpcHRvciB8fCAhZGVzY3JpcHRvci53cml0YWJsZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgbWV0aG9kICR7dG9XcmFwfSB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBidWxrVG9TaW5nbGUobWV0aG9kOiBzdHJpbmcpIHtcbiAgICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuQ1JFQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5VUERBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkRFTEVURTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgYXJlIHJlYWQgb25seSBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLmFkYXB0ZXJbdG9XcmFwXSA9IG5ldyBQcm94eSh0aGlzLmFkYXB0ZXJbdG9XcmFwXSwge1xuICAgICAgICBhcHBseTogYXN5bmMgKFxuICAgICAgICAgIHRhcmdldDogYW55LFxuICAgICAgICAgIHRoaXNBcmc6IEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gICAgICAgICAgYXJnQXJyYXk6IGFueVtdXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIC8vIFJ1biB0aGUgb3JpZ2luYWwgbWV0aG9kIHVuY2hhbmdlZCBzbyB0cmFuc2llbnQgZGF0YSBpcyBwcmVzZXJ2ZWRcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXJnZXQuYXBwbHkodGhpc0FyZywgYXJnQXJyYXkpO1xuXG4gICAgICAgICAgY29uc3QgY2xheno6IENvbnN0cnVjdG9yPGFueT4gPSBhcmdBcnJheVswXTtcbiAgICAgICAgICAvLyBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyBmYWxzZSwgcHVibGljIG1vZGVscyBlbWl0IGEgY2hhaW5jb2RlIGV2ZW50XG4gICAgICAgICAgLy8gb24gdGhlIGNvbnRyYWN0IHNpZGU7IHNraXAgdGhlIGxvY2FsIGZhbGxiYWNrIHRvIGF2b2lkXG4gICAgICAgICAgLy8gZG91YmxlLW5vdGlmaWNhdGlvbi4gV2hlbiBzeW50aGV0aWNFdmVudHMgaXMgdHJ1ZSB3ZSBoYW5kbGUgYWxsIG1vZGVscy5cbiAgICAgICAgICBpZiAoIXN5bnRoZXRpY0V2ZW50cyAmJiAhTW9kZWwuaXNUcmFuc2llbnQoY2xhenopKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgICAgLy8gQ29udGV4dCBpcyBhbHdheXMgdGhlIGxhc3QgZWxlbWVudCBvZiBhcmdBcnJheVxuICAgICAgICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzLCBjdHggfSA9IHRoaXNBcmdbXCJsb2dDdHhcIl0oXG4gICAgICAgICAgICBhcmdBcnJheS5zbGljZShhcmdBcnJheS5sZW5ndGggLSAxKSxcbiAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaWRzID0gYXJnQXJyYXlbMV07XG4gICAgICAgICAgY29uc3QgcmVzdWx0QXJnczogYW55W10gPSBbY2xhenosIGJ1bGtUb1NpbmdsZSh0b1dyYXApLCBpZHNdO1xuXG4gICAgICAgICAgaWYgKGN0eC5nZXRPclVuZGVmaW5lZChcIm9ic2VydmVGdWxsUmVzdWx0XCIpKSB7XG4gICAgICAgICAgICByZXN1bHRBcmdzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMoXG4gICAgICAgICAgICByZXN1bHRBcmdzWzBdLFxuICAgICAgICAgICAgcmVzdWx0QXJnc1sxXSxcbiAgICAgICAgICAgIHJlc3VsdEFyZ3NbMl0sXG4gICAgICAgICAgICAuLi5yZXN1bHRBcmdzLnNsaWNlKDMpLFxuICAgICAgICAgICAgLi4uKGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD4pXG4gICAgICAgICAgKS5jYXRjaCgoZTogdW5rbm93bikgPT5cbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke3RvV3JhcH0gb24gJHtjbGF6ei5uYW1lIHx8IGNsYXp6fSBmb3IgJHtpZHN9OiAke2V9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmlmIChGYWJyaWNDbGllbnRBZGFwdGVyKVxuICBGYWJyaWNDbGllbnRBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSA9IEZhYnJpY0NsaWVudERpc3BhdGNoO1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29tbWl0IGhhc2ggb2YgdGhlIG1vZHVsZSBidWlsZC5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBnaXQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLiBUaGUgYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgY29tbWl0IGhhc2ggYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IENPTU1JVFxuICovXG5leHBvcnQgY29uc3QgQ09NTUlUID0gXCIjI0NPTU1JVCMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtdmVyIHZlcnNpb24gYW5kIGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS5cbiAqIFRoZSBidWlsZCByZXBsYWNlcyB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGA8dmVyc2lvbj4tPGNvbW1pdD5gIHZhbHVlIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBGVUxMX1ZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbiJdLCJuYW1lcyI6WyJyZXNvbHZlUHJpbWFyeUtleUZpZWxkIiwibSIsImxvZyIsIlN0cmluZyIsIk1vZGVsIiwicGsiLCJtZXNzYWdlIiwibmFtZSIsInZlcmJvc2UiLCJ1bmRlZmluZWQiLCJ3aXRoRGVmYXVsdFF1ZXJ5UGtUaWVCcmVha2VyIiwiaW5kZXhlcyIsInBrRmllbGQiLCJtYXAiLCJpbmRleCIsImZpZWxkcyIsImluY2x1ZGVzIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwic29ydGVkRmllbGRzIiwiZmlsdGVyIiwiZmllbGQiLCJoYXNQayIsInNvbWUiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJsYXN0RmllbGQiLCJsYXN0RGlyZWN0aW9uIiwidmFsdWVzIiwidG9Mb3dlckNhc2UiLCJkaXJlY3Rpb24iLCJhc3NpZ24iLCJlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UiLCJmaWxlUGF0aCIsImZzIiwicmVxdWlyZSIsInBhdGgiLCJkaXJuYW1lIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsImdlbmVyYXRlTW9kZWxJbmRleGVzIiwiZ2VuZXJhdGVJbmRleGVzIiwiZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3MiLCJhY2N1bSIsInZpZXdzIiwiZ2VuZXJhdGVWaWV3cyIsInN0b3JhZ2UiLCJmb3JFYWNoIiwiZG9jIiwiX2lkIiwicmVhZE1vZGVsRmlsZSIsImZpbGUiLCJyZXNvbHZlIiwicGFyZW50UGF0aCIsImV4cG9ydHMiLCJlIiwiYXN5bmMiLCJyZWFkTW9kZWxGb2xkZXJzIiwiZm9sZGVycyIsInJlc3VsdCIsImZvbGRlciIsInJlc29sdmVkRm9sZGVyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJyZWN1cnNpdmUiLCJmIiwiaXNGaWxlIiwiZW5kc1dpdGgiLCJwdXNoIiwid3JpdGVJbmRleGVzIiwicCIsInByb2Nlc3MiLCJjd2QiLCJjb2xsZWN0aW9uIiwiam9pbiIsIndyaXRlRmlsZVN5bmMiLCJKU09OIiwic3RyaW5naWZ5Iiwid3JpdGVEZXNpZ25Eb2NzIiwiZGVzaWduRG9jcyIsImRvY0lkIiwicmVwbGFjZSIsInBheWxvYWQiLCJfcmV2IiwiY29sbGVjdGlvbkZvciIsImNvbGxlY3Rpb25OYW1lIiwicG9saWN5IiwicmVxdWlyZWRQZWVyQ291bnQiLCJtYXhQZWVyQ291bnQiLCJibG9ja1RvTGl2ZSIsIm1lbWJlck9ubHlSZWFkIiwibWVtYmVyT25seVdyaXRlIiwicHJpdmF0ZUNvbGxlY3Rpb25Gb3IiLCJtc3BJZCIsImMiLCJlbmRvcnNlbWVudFBvbGljeSIsInNpZ25hdHVyZVBvbGljeSIsInNoYXJlZENvbGxlY3Rpb25Gb3IiLCJtc3BJZHMiLCJleHRyYWN0Q29sbGVjdGlvbnMiLCJvdmVycmlkZXMiLCJtaXJyb3IiLCJwcml2YXRlQ29scyIsInNoYXJlZENvbHMiLCJjb2xsZWN0aW9uc0ZvciIsInJlc29sdmVDb2xsZWN0aW9uIiwiYXJnIiwiSW50ZXJuYWxFcnJvciIsInByaXZhdGVEZWZhdWx0cyIsInNoYXJlZERlZmF1bHRzIiwibWlycm9yTWV0YSIsIm1pcnJvcmVkQXQiLCJwcml2YXRlcyIsImZsYXQiLCJyZXNvbHZlZCIsInJlc29sdmVyIiwic2hhcmVkIiwid3JpdGVDb2xsZWN0aW9ucyIsImNvbHMiLCJmaWxlTmFtZSIsIndyaXRlQ29sbGVjdGlvbkRlc2lnbkRvY3MiLCJkb2NzIiwiRmFicmljQ2xpZW50UGFnaW5hdG9yIiwiUGFnaW5hdG9yIiwiY29uc3RydWN0b3IiLCJhZGFwdGVyIiwicXVlcnkiLCJzaXplIiwiY2xhenoiLCJzdXBlciIsInByZXBhcmUiLCJyYXdTdGF0ZW1lbnQiLCJVbnN1cHBvcnRlZEVycm9yIiwicGFnZSIsImFyZ3MiLCJpc1NlcmlhbGl6ZWRQYWdlIiwib2JqIiwiZGF0YSIsIk92ZXJmbG93RXJyb3IiLCJtc2ciLCJCYWxhbmNlRXJyb3IiLCJBbGxvd2FuY2VFcnJvciIsIlJlZ2lzdHJhdGlvbkVycm9yIiwiQXV0aG9yaXphdGlvbkVycm9yIiwiTWlzc2luZ0NvbnRleHRFcnJvciIsIlVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIiwiQmFzZUVycm9yIiwiTm90SW5pdGlhbGl6ZWRFcnJvciIsIk1pc3NpbmdQS0NTUzExTGliIiwiRW5kb3JzZW1lbnRFcnJvciIsIk12Y2NSZWFkQ29uZmxpY3RFcnJvciIsIlBoYW50b21SZWFkQ29uZmxpY3RFcnJvciIsIkVuZG9yc2VtZW50UG9saWN5RXJyb3IiLCJUcmFuc2FjdGlvbkxpbWl0c0Vycm9yIiwiY29kZSIsIlRyYW5zYWN0aW9uVGltZW91dEVycm9yIiwiVHJhbnNhY3Rpb25CdWZmZXJTaXplRXJyb3IiLCJRdWVyeVJlc3VsdFRvb0xhcmdlRXJyb3IiLCJGYWJyaWNDbGllbnRSZXBvc2l0b3J5IiwiUmVwb3NpdG9yeSIsImZvcmNlIiwidGhpcyIsIl9vdmVycmlkZXMiLCJpZ25vcmVWYWxpZGF0aW9uIiwiaWdub3JlSGFuZGxlcnMiLCJhbGxvd1Jhd1N0YXRlbWVudHMiLCJmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzIiwiZm9yY2VQcmVwYXJlQ29tcGxleFF1ZXJpZXMiLCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZSIsInJlYnVpbGRXaXRoVHJhbnNpZW50Iiwib3ZlcnJpZGUiLCJmbGFncyIsImZvciIsIk9ic2VydmVySGFuZGxlciIsInBhZ2luYXRlQnkiLCJrZXkiLCJvcmRlciIsInJlZiIsIm9mZnNldCIsImxpbWl0IiwiY3R4QXJncyIsImxvZ0N0eCIsIlByZXBhcmVkU3RhdGVtZW50S2V5cyIsIlBBR0VfQlkiLCJ0YWJsZU5hbWUiLCJjbGFzcyIsInN0YXRlbWVudCIsImJvb2ttYXJrIiwibGlzdEJ5IiwiTElTVF9CWSIsIndhcm4iLCJmaW5kQnkiLCJ2YWx1ZSIsIkZJTkRfQlkiLCJmaW5kT25lQnkiLCJGSU5EX09ORV9CWSIsImZpbmQiLCJPcmRlckRpcmVjdGlvbiIsIkFTQyIsIkZJTkQiLCJQQUdFIiwiY3R4IiwiUGVyc2lzdGVuY2VLZXlzIiwiU1RBVEVNRU5UIiwiY2FsbEFyZ3MiLCJzbGljZSIsInBhcnNlIiwiZGVjb2RlIiwiZXZhbHVhdGVUcmFuc2FjdGlvbiIsImh5ZHJhdGVkIiwiciIsIkNvdWNoREJLZXlzIiwiVEFCTEUiLCJkIiwiYXBwbHlBZnRlclJlYWQiLCJnZXRPclVuZGVmaW5lZCIsImVuZm9yY2VEQkRlY29yYXRvcnMiLCJPcGVyYXRpb25LZXlzIiwiUkVBRCIsIkFGVEVSIiwiUHJvbWlzZSIsImFsbCIsImVudHJ5IiwiY291bnRPZiIsIkNPVU5UX09GIiwic3RtdEFyZ3MiLCJtYXhPZiIsIk1BWF9PRiIsIm1pbk9mIiwiTUlOX09GIiwiYXZnT2YiLCJBVkdfT0YiLCJzdW1PZiIsIlNVTV9PRiIsImRpc3RpbmN0T2YiLCJESVNUSU5DVF9PRiIsImdyb3VwT2YiLCJHUk9VUF9PRiIsImhlYWx0aGNoZWNrIiwiY3JlYXRlIiwibW9kZWwiLCJkZWJ1ZyIsImVuc3VyZUxlZ2FjeU1pcnJvckZsYWciLCJwcmVwYXJlZCIsInJlY29yZCIsImlkIiwidHJhbnNpZW50IiwicmV2ZXJ0IiwidXBkYXRlIiwiY3JlYXRlQWxsUHJlZml4IiwibW9kZWxzIiwiQ1JFQVRFIiwiZ2V0IiwiaWdub3JlVmFsaWRhdGUiLCJPTiIsImlnbm9yZWRQcm9wcyIsImVycm9ycyIsImhhc0Vycm9ycyIsImVycm9yTWVzc2FnZXMiLCJyZWR1Y2VFcnJvcnNUb1ByaW50IiwiVmFsaWRhdGlvbkVycm9yIiwiY3JlYXRlQWxsIiwiaWRzIiwicGF5bG9hZHMiLCJ0cmFuc2llbnRzIiwiY3JlYXRlZCIsImkiLCJyZWFkQWxsIiwia2V5cyIsInJlY29yZHMiLCJ1cGRhdGVBbGwiLCJ1cGRhdGVkIiwidSIsImFjY3VtdWxhdGUiLCJsZWdhY3kiLCJFUkMyMFRva2VuIiwiQmFzZU1vZGVsIiwiX19kZWNvcmF0ZSIsInR5cGUiLCJjb2x1bW4iLCJyZXF1aXJlZCIsInRhYmxlIiwiRVJDMjBXYWxsZXQiLCJBbGxvd2FuY2UiLCJDbGllbnRTZXJpYWxpemVyIiwiSlNPTlNlcmlhbGl6ZXIiLCJwcmVTZXJpYWxpemUiLCJtb2RlbE5hbWUiLCJ0b1NlcmlhbGl6ZSIsIm1ldGFkYXRhIiwiTWV0YWRhdGEiLCJTZXJpYWxpemF0aW9uRXJyb3IiLCJNb2RlbEtleXMiLCJBTkNIT1IiLCJkZXNlcmlhbGl6ZSIsInN0ciIsImRlc2VyaWFsaXphdGlvbiIsImNsYXNzTmFtZSIsIkVycm9yIiwiYnVpbGQiLCJzZXJpYWxpemUiLCJGYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkiLCJzZXJpYWxpemVyIiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwidXBkYXRlT2JzZXJ2ZXJzIiwiZXZlbnQiLCJvYnNlcnZlckhhbmRsZXIiLCJjb3VudCIsInBhcnNlZElkIiwiU2VxdWVuY2UiLCJwYXJzZVZhbHVlIiwic2VxdWVuY2VGb3IiLCJ0b2tlbk5hbWUiLCJzeW1ib2wiLCJkZWNpbWFscyIsIk51bWJlciIsInRvdGFsU3VwcGx5IiwidG90YWwiLCJiYWxhbmNlT2YiLCJvd25lciIsImJhbGFuY2UiLCJ0cmFuc2ZlciIsInRvIiwidHJhbnNmZXJyZWQiLCJzdWJtaXRUcmFuc2FjdGlvbiIsInRvU3RyaW5nIiwidHJhbnNmZXJGcm9tIiwiZnJvbSIsImNvbnRleHRBcmdzIiwiQ29udGV4dCIsImFwcHJvdmUiLCJzcGVuZGVyIiwiYXBwcm92ZWQiLCJhbGxvd2FuY2UiLCJpbml0aWFsaXplIiwidG9rZW4iLCJpbml0aWxpYXplZCIsImNoZWNrSW5pdGlhbGl6ZWQiLCJtaW50IiwiYW1vdW50IiwiYnVybiIsImJ1cm5Gcm9tIiwiYWNjb3VudCIsImNsaWVudEFjY291bnRCYWxhbmNlIiwic2VyaWFsaXplZEFjY291bnRCYWxhbmNlIiwiY2xpZW50QWNjb3VudElEIiwiZXh0cmFjdElkcyIsImNvbXBvc2VkIiwicGtQcm9wcyIsImV4dHJhY3RJZCIsImNvbXBvc2VBdHRyaWJ1dGVWYWx1ZSIsIklkZW50aXR5Q3JlZGVudGlhbHMiLCJkZXNjcmlwdGlvbiIsIkZhYnJpY01vZGVsS2V5cyIsIklkZW50aXR5VHlwZSIsIkZhYnJpY0ZsYXZvdXIiLCJJZGVudGl0eSIsIlg1MDkiLCJvbmVUb09uZSIsIkNhc2NhZGUiLCJDQVNDQURFIiwiZGVsZXRlIiwiQ29yZVV0aWxzIiwibG9nZ2VyIiwiTWluaUxvZ2dlciIsImNvbnRlbnRPZkxvYWRGaWxlIiwiY29udGVudE9yUGF0aCIsImZpbGVSZWFkZXIiLCJVaW50OEFycmF5IiwibWF0Y2giLCJyZWFkRmlsZSIsInByb21pc2VzIiwibm9ybWFsaXplSW1wb3J0IiwiaW1wb3J0IiwiZ2V0Q0FVc2VyIiwidXNlck5hbWUiLCJwcml2YXRlS2V5IiwiY2VydGlmaWNhdGUiLCJvcHRpb25zIiwic3RyaW5nRm9ybWF0IiwidXNlciIsIlVzZXIiLCJjb25maWciLCJoc20iLCJzb2Z0d2FyZSIsImxpYiIsImxpYnJhcnkiLCJzbG90IiwibGFiZWwiLCJ0b2tlbkxhYmVsIiwicGluIiwiY3J5cHRvU3VpdGUiLCJnZXRDcnlwdG9TdWl0ZSIsInNldENyeXB0b1N1aXRlIiwiZW5yb2xsbWVudEtleSIsImdldEhTTUVucm9sbG1lbnRLZXkiLCJnZXRTb2Z0d2FyZUVucm9sbG1lbnRLZXkiLCJzZXRFbnJvbGxtZW50IiwibmV3Q3J5cHRvU3VpdGUiLCJjcmVhdGVLZXlGcm9tUmF3Iiwic2tpIiwia2V5SWRIZXgiLCJ0cmltIiwiQnVmZmVyIiwiZ2V0Q2VydGlmaWNhdGVTS0kiLCJnZXRLZXkiLCJpc1ByaXZhdGUiLCJ4NTA5IiwiWDUwOUNlcnRpZmljYXRlIiwiandrIiwicHVibGljS2V5IiwiZXhwb3J0IiwiZm9ybWF0IiwicHJlZml4IiwieCIsInkiLCJjcnlwdG8iLCJjcmVhdGVIYXNoIiwiY29uY2F0IiwiZGlnZXN0IiwiZ2V0SWRlbnRpdHkiLCJjZXJ0RGlyZWN0b3J5UGF0aCIsImlkZW50aXR5RmlsZVJlYWRlciIsImNlcnRQYXRoIiwiZ2V0Rmlyc3REaXJGaWxlTmFtZSIsImNyZWRlbnRpYWxzIiwiZGlyUGF0aCIsInJlYWRkaXIiLCJnZXRGaXJzdERpckZpbGVOYW1lQ29udGVudCIsImdldEZpbGVDb250ZW50IiwiZ2V0U2lnbmVyIiwia2V5RGlyZWN0b3J5UGF0aCIsInNpZ25lckZpbGVSZWFkZXIiLCJrZXlQYXRoIiwicHJpdmF0ZUtleVBlbSIsImV4dHJhY3RQcml2YXRlS2V5IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiayIsInNpZ25lcnMiLCJuZXdQcml2YXRlS2V5U2lnbmVyIiwicGVtIiwibGliTmFtZSIsInN1YnRsZSIsImdsb2JhbFRoaXMiLCJ3aW5kb3ciLCJDcnlwdG8iLCJ3ZWJjcnlwdG8iLCJzdHIyYWIiLCJidWYiLCJBcnJheUJ1ZmZlciIsImJ1ZlZpZXciLCJzdHJMZW4iLCJjaGFyQ29kZUF0IiwicmVwbGFjZUFsbCIsImRlY29kZWQiLCJiaW5hcnlEZXIiLCJpbXBvcnRLZXkiLCJuYW1lZEN1cnZlIiwiZ2V0QWtpQW5kU2VyaWFsRnJvbUNlcnQiLCJjZXJ0IiwieDUwOUNlcnRpZmljYXRlIiwiWDUwOUNlcnQiLCJha2lFeHQiLCJleHRlbnNpb25zIiwiYWtpIiwidG9VcHBlckNhc2UiLCJzdGFydHNXaXRoIiwic2VyaWFsIiwic2VyaWFsTnVtYmVyIiwiY3J5cHRvUHJvdmlkZXIiLCJzZXQiLCJCQVNFX0FMUEhBQkVUIiwiQ1JZUFRPIiwiQmFzZUVuY29kZXIiLCJhbHBoYWJldCIsImJhc2VNYXAiLCJqIiwiY2hhckF0IiwieGMiLCJiYXNlIiwibGVhZGVyIiwiZmFjdG9yIiwiTWF0aCIsImlGYWN0b3IiLCJlbmNvZGUiLCJzb3VyY2UiLCJpc1ZpZXciLCJidWZmZXIiLCJieXRlT2Zmc2V0IiwiYnl0ZUxlbmd0aCIsInplcm9lcyIsInBiZWdpbiIsInBlbmQiLCJiNTgiLCJjYXJyeSIsIml0MSIsIml0MiIsInJlcGVhdCIsImRlY29kZVVuc2FmZSIsInBzeiIsImIyNTYiLCJpdDMiLCJpdDQiLCJ2Y2giLCJDcnlwdG9VdGlscyIsImI1OGVuY29kZXIiLCJCQVNFNTgiLCJmYWJyaWNJZEZyb21DZXJ0aWZpY2F0ZSIsInN1YmplY3QiLCJpc3N1ZXIiLCJzdHJpbmdUb0FycmF5QnVmZmVyIiwiZXh0cmFjdEtleSIsInVzYWdlcyIsIlJlZ0V4cCIsImV4dHJhY3RQdWJsaWNLZXkiLCJzaWduIiwiYnVmZiIsImhhc2giLCJiIiwicGFkU3RhcnQiLCJ2ZXJpZnkiLCJzaWduYXR1cmUiLCJlbmNyeXB0IiwiZ2V0U3VidGxlQ3J5cHRvIiwiaXNCcm93c2VyIiwiZGVjcnlwdCIsImdldE1hc3RlciIsInRleHRFbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJnZW5HZW5lc2lzIiwicmFuZG9tVVVJRCIsImltcG9ydGVkS2V5IiwiS0VZX0FMR09SWVRITSIsIml2IiwiZ2V0RGVyaXZhdGlvbktleSIsInNhbHQiLCJzYWx0QnVmZmVyIiwic2FsdEhhc2hlZCIsInBhcmFtcyIsIkhBU0giLCJpdGVyYXRpb25zIiwiSVRFUkFUSU9OUyIsImRlcml2YXRpb24iLCJkZXJpdmVCaXRzIiwiS0VZTEVOR1RIIiwiaXZsZW4iLCJrZXlsZW4iLCJkZXJpdmVkS2V5IiwiaW1wb3J0ZWRFbmNyeXB0aW9uS2V5IiwiQUxHT1JZVEhNIiwiZW5jcnlwdFBpbiIsInRleHQiLCJrZXlPYmplY3QiLCJ0ZXh0QnVmZmVyIiwiZW5jcnlwdGVkVGV4dCIsImRlY3J5cHRQaW4iLCJ0ZXh0RGVjb2RlciIsImRlY3J5cHRlZFRleHQiLCJIRkNBSWRlbnRpdHlUeXBlIiwiSEZDQUlkZW50aXR5QXR0cmlidXRlcyIsIkZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlIiwiTG9nZ2VkQ2xhc3MiLCJjYUNvbmZpZyIsImNhTmFtZSIsImNhQ2VydCIsImNhS2V5IiwidXJsIiwiQ0EiLCJjYSIsInRscyIsInRydXN0ZWRSb290cyIsInJvb3QiLCJGYWJyaWNDQVNlcnZpY2VzIiwiQ2xpZW50IiwiY2xpZW50IiwiQ2VydGlmaWNhdGUiLCJjZXJ0aWZpY2F0ZVNlcnZpY2UiLCJuZXdDZXJ0aWZpY2F0ZVNlcnZpY2UiLCJBZmZpbGlhdGlvbnMiLCJhZmZpbGlhdGlvblNlcnZpY2UiLCJuZXdBZmZpbGlhdGlvblNlcnZpY2UiLCJJZGVudGl0aWVzIiwiaWRlbnRpdHlTZXJ2aWNlIiwibmV3SWRlbnRpdHlTZXJ2aWNlIiwiZ2V0Q2VydGlmaWNhdGVzIiwicmVxdWVzdCIsImRvTWFwIiwicmVzcG9uc2UiLCJjZXJ0cyIsIlBFTSIsImdldElkZW50aXRpZXMiLCJpZGVudGl0aWVzU2VydmljZSIsImdldEFsbCIsImlkZW50aXRpZXMiLCJwYXJzZUVycm9yIiwicmVnZXhwIiwiZXhlYyIsIkNvbmZsaWN0RXJyb3IiLCJnZXRBZmZpbGlhdGlvbnMiLCJhIiwicmVhZCIsImVucm9sbG1lbnRJZCIsImdldE9uZSIsIk5vdEZvdW5kRXJyb3IiLCJzdWNjZXNzIiwicmVnaXN0ZXIiLCJpc1N1cGVyVXNlciIsImFmZmlsaWF0aW9uIiwidXNlclJvbGUiLCJhdHRycyIsIm1heEVucm9sbG1lbnRzIiwicmVnaXN0cmF0aW9uIiwicGFzc3dvcmQiLCJwcm9wcyIsImVucm9sbG1lbnRJRCIsImVucm9sbG1lbnRTZWNyZXQiLCJpbmZvIiwiaWRlbnRpdHlGcm9tRW5yb2xsbWVudCIsImVucm9sbG1lbnQiLCJyb290Q2VydGlmaWNhdGUiLCJMb2dnaW5nIiwiY2xpZW50SWQiLCJub3ciLCJEYXRlIiwidG9CeXRlcyIsImNyZWF0ZWRPbiIsInVwZGF0ZWRPbiIsImVucm9sbCIsImlkZW50aXR5IiwicmVnaXN0ZXJBbmRFbnJvbGwiLCJyZXZva2UiLCJyZWFzb24iLCJSZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlciIsImVycnMiLCJyb2xlIiwic2V0QWZmaWxpYXRpb24iLCJhZGRBdHRyIiwiYXR0ciIsInNldEF0dHJzIiwic2V0RW5yb2xsbWVudElEIiwic2V0RW5yb2xsbWVudFNlY3JldCIsInNldE1heEVucm9sbG1lbnRzIiwic2V0Um9sZSIsIm1pbmxlbmd0aCIsIm1pbiIsImlzU2hhcmVkIiwic2VncmVnYXRlIiwiaXNUcmFuc2llbnQiLCJkZWNvcmF0ZWRQcm9wZXJ0aWVzIiwiZ2V0QXR0cmlidXRlcyIsInRyYW5zaWVudFByb3BzIiwiREJLZXlzIiwiVFJBTlNJRU5UIiwicHJpdmF0ZVByb3BlcnRpZXMiLCJQUklWQVRFIiwic2hhcmVkUHJvcGVydGllcyIsIlNIQVJFRCIsInB1YmxpYyIsInRyYW5zaWVudEtleXMiLCJwcml2YXRlS2V5cyIsInNoYXJlZEtleXMiLCJpc1B1YmxpYyIsImJpbmQiLCJtaXJyb3JlZCIsIkZBQlJJQyIsIk1JUlJPUiIsIm93bmVyT2YiLCJtZXRhIiwiT1dORURfQlkiLCJzaGFyZWRLZXkiLCJjb25zdHIiLCJwcml2YXRlTWV0YSIsInNoYXJlZE1ldGEiLCJjb2xsZWN0aW9ucyIsImNoYWluY29kZU9mIiwiQ0hBSU5DT0RFIiwicG9wIiwiY29udHJhY3RPZiIsIkNPTlRSQUNUIiwiY2hhbm5lbE9mIiwiQ0hBTk5FTCIsIkVSQzIwRXZlbnRzIiwiRmFicmljQmFzZU1vZGVsIiwiY3JlYXRlZEF0IiwidXBkYXRlZEF0IiwidmVyc2lvbiIsInVzZXMiLCJGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsIiwiY3JlYXRlZEJ5IiwidXBkYXRlZEJ5IiwiRGVmYXVsdENvbnRyYWN0UmVzb2x2ZXIiLCJjb250cmFjdCIsImNoYWluY29kZSIsImNoYW5uZWwiLCJleHRyYWN0TXNwSWQiLCJnZXRNU1BJRCIsIk93bmVyIiwidGFyZ2V0IiwicHJvcGVydHlLZXkiLCJkZXNjcmlwdG9yIiwib3JpZ2luYWxNZXRob2QiLCJhY291bnRJZCIsImNsaWVudElkZW50aXR5IiwiZ2V0SUQiLCJzZWxlY3QiLCJ0b2tlbnMiLCJleGVjdXRlIiwiYXBwbHkiLCJvd25lZEJ5T25DcmVhdGUiLCJjb250ZXh0Iiwic3R1YiIsImNyZWF0b3IiLCJnZXRDcmVhdG9yIiwibXNwaWQiLCJzZXRPd25lZEJ5S2V5VmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIm93bmVkQnkiLCJhdHRyaWJ1dGUiLCJnZW5lcmF0ZWQiLCJyZWFkb25seSIsIm9uQ3JlYXRlIiwicHJvcE1ldGFkYXRhIiwiRGVjb3JhdGlvbiIsImRlZmluZSIsImRlY29yYXRvciIsInRyYW5zYWN0aW9uSWRPbkNyZWF0ZSIsImdldFR4SUQiLCJ0cmFuc2FjdGlvbklkIiwib25VcGRhdGUiLCJUUkFOU0FDVElPTl9JRCIsImV2YWxNaXJyb3JNZXRhZGF0YSIsImNyZWF0ZU1pcnJvckhhbmRsZXIiLCJmYWJyaWNDdHgiLCJzb3VyY2VNb2RlbCIsInB1dCIsInJlcG8iLCJtaXJyb3JDb2xsZWN0aW9uIiwidXBkYXRlTWlycm9ySGFuZGxlciIsImFwcGx5VXBkYXRlVmFsaWRhdGlvbiIsIm1lcmdlRm9yVXBkYXRlIiwiZGVsZXRlTWlycm9ySGFuZGxlciIsInBrUHJvcCIsInNlZ3JlZ2F0ZWQiLCJtaXJyb3JXcml0ZUd1YXJkIiwibXNwIiwiY29uZGl0aW9uIiwicmVhZE1pcnJvckhhbmRsZXIiLCJtYXRjaGVzIiwicmVhZEZyb20iLCJtc3BJZE9yQ29uZGl0aW9uIiwiaXNDb25kaXRpb25Pbmx5IiwiQm9vbGVhbiIsImNvbmQiLCJvblJlYWQiLCJwcmlvcml0eSIsIm9uRGVsZXRlIiwiTW9kZWxDb2xsZWN0aW9uIiwib3JnTmFtZSIsInRvUGFzY2FsQ2FzZSIsIk5hbWVzcGFjZUNvbGxlY3Rpb24iLCJuYW1lc3BhY2UiLCJJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uIiwiU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFkiLCJhcHBseVNlZ3JlZ2F0aW9uRmxhZ3MiLCJpc0Z1bGx5U2VncmVnYXRlZCIsImhhc1B1YmxpY1Byb3BlcnRpZXMiLCJtYXJrRnVsbHlTZWdyZWdhdGVkIiwiYXBwbHlNaXJyb3JGbGFncyIsImF0dHJpYnV0ZXMiLCJ0cmFuc2llbnRNZXRhIiwiZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9ucyIsImRhdGFBcnJheSIsImNvbGxlY3Rpb25SZXNvbHZlciIsImtleUFycmF5IiwicGtLZXkiLCJwa1NlcU5hbWUiLCJzZXF1ZW5jZU5hbWUiLCJpZFZhbHVlIiwiY2FuQnVpbGRQZXJJbnN0YW5jZSIsInNldFNlcXVlbmNlU2VncmVnYXRpb24iLCJwcm9wU2VxTmFtZSIsInNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUiLCJfayIsImtleVN0cmluZ3MiLCJ3cml0ZVRvIiwic2VncmVnYXRlZERhdGFPblJlYWQiLCJzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIiwib2xkTW9kZWwiLCJzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIiwiaW5uZXJTZWdyZWdhdGVkIiwic2VncmVnYXRlZERlYyIsIlNldCIsImFkZCIsImNvbnN0ck1ldGEiLCJjb25zdHJDb2xsZWN0aW9ucyIsInVwZGF0ZWRUcmFuc2llbnRNZXRhIiwiZGVjcyIsInByb3BlcnRpZXMiLCJncm91cE5hbWUiLCJleHRyYWN0R3JvdXBOYW1lIiwiZGF0YUdyb3VwTmFtZSIsImVhcmx5RXh0cmFjdGlvbk1ldGEiLCJlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQiLCJncm91cCIsInByb3AiLCJvbiIsIkRCT3BlcmF0aW9ucyIsIkFMTCIsInByaXZhdGVEYXRhIiwic2hhcmVkRGF0YSIsInNvcnRLZXlzT25seVJlY3Vyc2l2ZSIsInNvcnQiLCJyZWR1Y2UiLCJhY2MiLCJEZXRlcm1pbmlzdGljU2VyaWFsaXplciIsImVycm9yIiwic2VsZiIsIm8iLCJyZWxhdGlvbnMiLCJnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZSIsInBhcnNlRXZlbnROYW1lIiwicGFydHMiLCJzcGxpdCIsInN1YiIsInNhZmVQYXJzZUludCIsInN0cmluZyIsImRpZ2l0UmVnZXgiLCJ0ZXN0IiwicGFyc2VkaW50IiwicGFyc2VJbnQiLCJpc05hTiIsIlNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyIiwicHV0QW5jaG9yIiwicHJlU2VyaWFsaXphdGlvbiIsIkZhYnJpY0lkZW50aXR5U2VydmljZSIsIkNsaWVudEJhc2VkU2VydmljZSIsInJvb3RDbGllbnQiLCJfdXNlciIsImNlcnRpZmljYXRlcyIsImFmZmlsaWF0aW9ucyIsImdldFVzZXIiLCJjZmciLCJJTklUSUFMSVpBVElPTiIsImdldE5hbWUiLCJ1cGRhdGVJZGVudGl0eSIsImlkZW50aXR5UmVxdWVzdCIsImNhVXNlcklkZW50aXR5IiwicmVlbnJvbGxVc2VyIiwiY3JlYXRlVXNlciIsImdldE1zcGlkIiwiZW5yb2xsbWVudEF0dHJzIiwib3B0aW9uYWwiLCJyZWVucm9sbCIsInJlbmV3ZWRJZGVudGl0eSIsInJldm9rZU9wdGlvbnMiLCJyZXZva2VSZXF1ZXN0IiwiQ0FfUk9MRSIsIkRlZmF1bHRGYWJyaWNDbGllbnRGbGFncyIsImV2YWx1YXRlVGltZW91dCIsImVuZG9yc2VUaW1lb3V0Iiwic3VibWl0VGltZW91dCIsImNvbW1pdFRpbWVvdXQiLCJhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3MiLCJhbGxvd0dhdGV3YXlPdmVycmlkZSIsImFsbG93Q29udGV4dFRyYW5zaWVudE1hcCIsImVuY3J5cHRUcmFuc2llbnQiLCJzeW50aGV0aWNFdmVudHMiLCJjcmVhdGVQcml2YXRlS2V5IiwiQ0xJRU5UX09WRVJSSURFX0tFWVMiLCJGYWJyaWNDbGllbnRDb250ZXh0IiwidG9PdmVycmlkZXMiLCJlc2NhcGVSZWdFeHAiLCJuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyIsImNoYXJzIiwiY29kZVBvaW50QXQiLCJmcm9tQ29kZVBvaW50IiwicHJlZml4UmFuZ2UiLCJzdGFydCIsImVuZCIsIkZhYnJpY0NsaWVudFN0YXRlbWVudCIsIlN0YXRlbWVudCIsInNxdWFzaCIsInNxdWFzaGVkIiwibWV0aG9kIiwiZXhlY3V0ZVByZXBhcmVkIiwiYXJneiIsImZvck1vZGVsIiwiZnJvbVNlbGVjdG9yIiwiYWxpYXMiLCJRVUVSWSIsImlzU2ltcGxlUXVlcnkiLCJRdWVyeUNsYXVzZSIsIndoZXJlQ29uZGl0aW9uIiwicGFyc2VkIiwicHJlcGFyZUNvbmRpdGlvbiIsInNlbGVjdFNlbGVjdG9yIiwiU0VMRUNUIiwiQU5EIiwib3JkZXJCeVNlbGVjdG9ycyIsIk9SREVSX0JZIiwidG9DYW1lbENhc2UiLCJwcm9jZXNzUmVjb3JkIiwicGtBdHRyIiwiSUQiLCJrZXlBcmdzIiwiU0VQQVJBVE9SIiwicmF3IiwicmF3SW5wdXQiLCJhZ2dyZWdhdG9yIiwiYWdncmVnYXRlSW5mbyIsImFnZ3JlZ2F0ZSIsImV4ZWN1dGVBZ2dyZWdhdGUiLCJyZXN1bHRzIiwicHJvY2Vzc2VkIiwiYXBwbHlBZnRlckhhbmRsZXJzVG9SZXN1bHQiLCJhZ2dyZWdhdGVRdWVyeSIsImJ1aWxkQWdncmVnYXRlUXVlcnkiLCJzZWxlY3RvcnMiLCJzZWxlY3RvciIsInBhcnNlQ29uZGl0aW9uIiwiQ29uZGl0aW9uIiwiYW5kIiwiZXEiLCJzZWxlY3RvcktleXMiLCJDb3VjaERCR3JvdXBPcGVyYXRvciIsImluZGV4T2YiLCJ2YWwiLCJPUiIsInMiLCJlbnRyaWVzIiwic2VsZWN0b3JLZXkiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwiQ291Y2hEQlF1ZXJ5TGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJtZXJnZSIsIm9wIiwib2JqMSIsIm9iajIiLCJhdHRyMSIsIm9wZXJhdG9yIiwiY29tcGFyaXNvbiIsIk9wZXJhdG9yIiwiU1RBUlRTX1dJVEgiLCJRdWVyeUVycm9yIiwicmFuZ2UiLCJCSUdHRVJfRVEiLCJTTUFMTEVSIiwiRU5EU19XSVRIIiwiUkVHRVhQIiwiQkVUV0VFTiIsIm1heCIsIm9wQmV0d2VlbiIsInRyYW5zbGF0ZU9wZXJhdG9ycyIsIlNNQUxMRVJfRVEiLCJHcm91cE9wZXJhdG9yIiwiTk9UIiwib3AxIiwib3AyIiwiYXZnU2VsZWN0b3IiLCJzdW1JbmZvIiwiY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvciIsImNvdW50SW5mbyIsImNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5Iiwia2luZCIsInN1bURlc2NyaXB0b3IiLCJjb3VudERlc2NyaXB0b3IiLCJjb3VudERpc3RpbmN0U2VsZWN0b3IiLCJjb3VudERpc3RpbmN0IiwiYWdncmVnYXRvclVzZWQiLCJjb3VudFNlbGVjdG9yIiwibWluU2VsZWN0b3IiLCJtYXhTZWxlY3RvciIsInN1bVNlbGVjdG9yIiwiZGlzdGluY3RTZWxlY3RvciIsImFnZ3JlZ2F0b3JDaGVja3MiLCJtZXRhcyIsImZpbmRWaWV3TWV0YWRhdGEiLCJ2aWV3TmFtZSIsImdlbmVyYXRlVmlld05hbWUiLCJkZG9jIiwiZ2VuZXJhdGVEZXNpZ25Eb2NOYW1lIiwicmV0dXJuRG9jcyIsInZpZXciLCJnZXRGYWJyaWNBZGFwdGVyIiwiaXNWaWV3QWdncmVnYXRlIiwiaGFuZGxlQXZlcmFnZSIsImZhYnJpY0FkYXB0ZXIiLCJ2aWV3SW5mbyIsInByb2Nlc3NWaWV3UmVzcG9uc2UiLCJzdW1EZXNjIiwiY291bnREZXNjIiwic3VtUmVzcG9uc2UiLCJjb3VudFJlc3BvbnNlIiwic3VtIiwicm93cyIsInJvdyIsIkZhYnJpY0NsaWVudEFkYXB0ZXIiLCJBZGFwdGVyIiwiY2hhaW5jb2RlRm9yIiwiY2hhbm5lbEZvciIsImNvbnRyYWN0Rm9yIiwib3BlcmF0aW9uIiwibWVyZ2VkRmxhZ3MiLCJzaWxseSIsIm5ld0N0eCIsInBhcmVudENvbnRleHQiLCJjaGlsZENvbnRleHRzIiwiY3VycmVudE9wIiwiY3VycmVudE1vZGVsIiwicmVwb3NpdG9yeSIsImNyZWF0ZVByZWZpeCIsInVwZGF0ZUFsbFByZWZpeCIsInNoaWZ0IiwiaGFzVHJhbnNpZW50IiwibmVlZHNGdWxsUGF5bG9hZCIsInNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbiIsInNlcmlhbGl6ZWRNb2RlbHMiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJDUkVBVEVfQUxMIiwiZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInJlcyIsInNob3VsZFJlZnJlc2hBZnRlcldyaXRlIiwiUkVBRF9BTEwiLCJVUERBVEVfQUxMIiwiZGVsZXRlQWxsIiwic2hvdWxkSHlkcmF0ZSIsIkRFTEVURV9BTEwiLCJNRVRBREFUQSIsIm1pcnJvck1zcCIsIm1zcHMiLCJtZXJnZWQiLCJlbmRvcnNpbmdPcmdzIiwiZW5kb3JzaW5nT3JnYW5pemF0aW9ucyIsInNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50IiwidiIsImNoaWxkUmVidWlsZCIsImdldEZyb21DaGlsZHJlbiIsInJlc29sdmVkT3AiLCJyZXNvbHZlT3BlcmF0aW9uIiwiaGFzSWQiLCJpbmplY3RUcmFuc2llbnRPdmVycmlkZXMiLCJ0cmFuc2llbnREYXRhIiwiaGFzVHJhbnNpZW50RGF0YSIsImhhc01lYW5pbmdmdWxUcmFuc2llbnREYXRhIiwic2hvdWxkSW5qZWN0IiwiT1ZFUlJJREVTIiwiaXRlbSIsImRpcmVjdCIsImRlc2VyaWFsaXplZCIsInVwZGF0ZVByZWZpeCIsIlVQREFURSIsIkRFTEVURSIsImRvY3NPbmx5IiwidHJhbnNhY3Rpb25SZXN1bHQiLCJwYXJzZVJlY29yZCIsImlzTW9kZWwiLCJlbCIsImdldENsaWVudCIsIl9jbGllbnQiLCJHYXRld2F5IiwiZ2V0R2F0ZXdheSIsIkNvbnRyYWN0IiwiY2xhenpPckNvbnRyYWN0TmFtZSIsImdldENvbnRyYWN0IiwidHJhbnNhY3Rpb24iLCJhcGkiLCJzdWJtaXQiLCJzaG91bGRVc2VMZWdhY3lHYXRld2F5IiwibGVnYWN5QXJncyIsInByZXBhcmVMZWdhY3lBcmdzIiwidHJhbnNpZW50TWFwIiwiYnVpbGRMZWdhY3lUcmFuc2llbnQiLCJwZWVyQ29uZmlncyIsImJ1aWxkTGVnYWN5UGVlckNvbmZpZ3MiLCJzdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMiLCJnYXRld2F5IiwiZ2V0Q29udHJhY3ROYW1lIiwiZXZhbHVhdGUiLCJub3JtYWxpemVkQXJncyIsIm5vcm1hbGl6ZVRyYW5zYWN0aW9uQXJndW1lbnQiLCJ0cmFuc2llbnRFbnRyaWVzIiwicHJvcG9zYWxPcHRpb25zIiwiYXJndW1lbnRzIiwiY2xvc2UiLCJyZXNvbHZlTGVnYWN5TXNwQ291bnQiLCJjb25maWd1cmVkIiwibGVnYWN5TXNwQ291bnQiLCJpc0Zpbml0ZSIsImZsb29yIiwicGlja0xlZ2FjeUNhbmRpZGF0ZXMiLCJjYW5kaWRhdGVzIiwiYXZhaWxhYmxlIiwicGlja2VkIiwiaWR4IiwicmFuZG9tIiwic2VsZWN0aW9uIiwic3BsaWNlIiwicGVlcnMiLCJwZWVyRW5kcG9pbnQiLCJwZWVySG9zdEFsaWFzIiwidGxzQ2VydCIsImVuZG9yc2VycyIsIm9yZyIsImV4dHJhcyIsIm1zcE1hcCIsImxlZ2FjeUNvdW50Iiwic2VsZWN0aW9ucyIsImNob2ljZSIsImVuZHBvaW50IiwiZmNuIiwibm9ybWFsaXplTGVnYWN5UGVlcnMiLCJpZGVudGl0eU1hdGVyaWFsIiwicmVzb2x2ZUxlZ2FjeUlkZW50aXR5TWF0ZXJpYWwiLCJ3YWxsZXQiLCJXYWxsZXRzIiwibmV3SW5NZW1vcnlXYWxsZXQiLCJpZGVudGl0eUxhYmVsIiwiY29ubmVjdGlvblByb2ZpbGUiLCJidWlsZExlZ2FjeUNvbm5lY3Rpb25Qcm9maWxlIiwiTGVnYWN5R2F0ZXdheSIsImNvbm5lY3QiLCJkaXNjb3ZlcnkiLCJlbmFibGVkIiwiYXNMb2NhbGhvc3QiLCJzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QiLCJ0bHNJbmZvIiwiY2hhaW5jb2RlTmFtZSIsImNvbnRyYWN0TmFtZSIsIm5ldHdvcmsiLCJnZXROZXR3b3JrIiwiY3JlYXRlVHJhbnNhY3Rpb24iLCJzZXRUcmFuc2llbnQiLCJwZWVyIiwiZ2V0Q2hhbm5lbCIsImdldEVuZG9yc2VyIiwiZW5kb3JzZXIiLCJzZXRFbmRvcnNpbmdQZWVycyIsImRpc2Nvbm5lY3QiLCJkZWR1cGVkIiwiTWFwIiwiYWRkUGVlciIsImhhcyIsInJlYWRQZW1JbnB1dCIsImNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIiwia2V5Q2VydE9yRGlyZWN0b3J5UGF0aCIsInBlZXJFbnRyaWVzIiwiY2hhbm5lbFBlZXJzIiwib3JncyIsInRsc1BlbSIsImhvc3RuYW1lIiwiZXh0cmFjdEhvc3QiLCJlbnN1cmVHcnBjVXJsIiwidGxzQ0FDZXJ0cyIsImdycGNPcHRpb25zIiwiaG9zdG5hbWVPdmVycmlkZSIsImVuZG9yc2luZ1BlZXIiLCJjaGFpbmNvZGVRdWVyeSIsImxlZGdlclF1ZXJ5IiwiZXZlbnRTb3VyY2UiLCJvcmdhbml6YXRpb24iLCJvcmdhbml6YXRpb25zIiwib3JkZXJlcnMiLCJjaGFubmVscyIsImV2ZXJ5IiwiaXNMb2NhbEVuZHBvaW50IiwiaG9zdCIsInNhbml0aXplZCIsImlzQnVmZmVyIiwidHJpbW1lZCIsInN0YXRzIiwic3RhdCIsImNhdGNoIiwiaXNEaXJlY3RvcnkiLCJyZWFkRnNGaWxlIiwiZXJyIiwibWlncmF0ZSIsInJlZmVyZW5jZSIsImxhc3QiLCJwcm92aWRlZEN0eCIsIm1pZ3JhdGlvbkFyZ3MiLCJNSUdSQVRJT04iLCJzaHV0ZG93biIsImNoYW5uZWxOYW1lIiwiZ2V0Q29ubmVjdGlvbiIsInBhdGhPckNlcnQiLCJyZWFkRmlsZVN5bmMiLCJ0bHNDcmVkZW50aWFscyIsImdycGMiLCJjcmVhdGVTc2wiLCJzaXplTGltaXQiLCJzaWduZXIiLCJldmFsdWF0ZU9wdGlvbnMiLCJkZWFkbGluZSIsImVuZG9yc2VPcHRpb25zIiwic3VibWl0T3B0aW9ucyIsImNvbW1pdFN0YXR1c09wdGlvbnMiLCJQcm94eSIsInRoaXNBcmciLCJhcmdBcnJheSIsIlJlZmxlY3QiLCJEaXNwYXRjaCIsIkdhdGV3YXlFcnJvciIsImRldGFpbHMiLCJFbmRvcnNlRXJyb3IiLCJCYWRSZXF1ZXN0RXJyb3IiLCJQYWdpbmdFcnJvciIsIk1pZ3JhdGlvbkVycm9yIiwiT2JzZXJ2ZXJFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiZmluYWwiLCJEIiwiX2EiLCJkZWNvcmF0aW9uIiwic2V0Q3VycmVudCIsIkZhYnJpY0NsaWVudERpc3BhdGNoIiwibG9nZ2VkQXJncyIsIlNIVVRET1dOIiwibGlzdGVuaW5nU3RhY2siLCJwYXJzZVBheWxvYWQiLCJqc29uQnl0ZXMiLCJqc29uIiwib2JzZXJ2ZSIsIm9ic2VydmVyIiwidW5PYnNlcnZlIiwicmVmcmVzaCIsImhhbmRsZUV2ZW50cyIsImN0eEFyZyIsImNvcnJlbGF0aW9uSWQiLCJldnQiLCJldmVudE5hbWUiLCJtc3BFdmVudE9ubHkiLCJ0YXJnZXRNb2RlbCIsIm1vZGVsUmVmIiwib2JzZXJ2ZXJBcmdzIiwiZ2V0Q2hhaW5jb2RlRXZlbnRzIiwidG9XcmFwIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsImJ1bGtUb1NpbmdsZSIsInJlc3VsdEFyZ3MiLCJWRVJTSU9OIiwiQ09NTUlUIiwiRlVMTF9WRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
4001
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQvaW5kZXhlcy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9jb2xsZWN0aW9ucy9nZW5lcmF0aW9uLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRQYWdpbmF0b3IudHMiLCIuLi9zcmMvc2hhcmVkL2Vycm9ycy50cyIsIi4uL3NyYy9jbGllbnQvRmFicmljQ2xpZW50UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9jb250cmFjdHMvZXJjMjAvbW9kZWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9DbGllbnRTZXJpYWxpemVyLnRzIiwiLi4vc3JjL2NsaWVudC9lcmMyMC9GYWJyaWNFUkMyMENsaWVudFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvY2xpZW50L2lkcy9pZC1leHRyYWN0aW9uLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9JZGVudGl0eUNyZWRlbnRpYWxzLnRzIiwiLi4vc3JjL3NoYXJlZC9jb25zdGFudHMudHMiLCIuLi9zcmMvc2hhcmVkL21vZGVsL0lkZW50aXR5LnRzIiwiLi4vc3JjL2NsaWVudC91dGlscy50cyIsIi4uL3NyYy9jbGllbnQvY3J5cHRvLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GYWJyaWNFbnJvbGxtZW50U2VydmljZS50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvUmVnaXN0cmF0aW9uUmVxdWVzdEJ1aWxkZXIudHMiLCIuLi9zcmMvc2hhcmVkL292ZXJyaWRlcy9vdmVycmlkZXMudHMiLCIuLi9zcmMvc2hhcmVkL2VyYzIwL2VyYzIwLWNvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvbW9kZWwvRmFicmljQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9tb2RlbC9GYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsLnRzIiwiLi4vc3JjL3NoYXJlZC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9zaGFyZWQvZXZlbnRzLnRzIiwiLi4vc3JjL3NoYXJlZC9tYXRoLnRzIiwiLi4vc3JjL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9jbGllbnQvc2VydmljZXMvRmFicmljSWRlbnRpdHlTZXJ2aWNlLnRzIiwiLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9jb25zdGFudHMudHMiLCIuLi9zcmMvY2xpZW50L2NvbnN0YW50cy50cyIsIi4uL3NyYy9jbGllbnQvZmFicmljLWZzLnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRDb250ZXh0LnRzIiwiLi4vc3JjL2NsaWVudC9GYWJyaWNDbGllbnRTdGF0ZW1lbnQudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudEFkYXB0ZXIudHMiLCIuLi9zcmMvY2xpZW50L0ZhYnJpY0NsaWVudERpc3BhdGNoLnRzIiwiLi4vc3JjL3ZlcnNpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgQ291Y2hEQkRlc2lnbkRvYyxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBnZW5lcmF0ZVZpZXdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCB0eXBlIEluZGV4ID0gQ3JlYXRlSW5kZXhSZXF1ZXN0O1xuXG5mdW5jdGlvbiByZXNvbHZlUHJpbWFyeUtleUZpZWxkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBsb2c6IExvZ2dlclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gU3RyaW5nKE1vZGVsLnBrKG0pKTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBTa2lwcGluZyAke20ubmFtZX0gd2hpbGUgZXh0cmFjdGluZyBpbmRleGVzOiBubyBwcmltYXJ5IGtleSBpcyBkZWZpbmVkYDtcbiAgICBsb2cudmVyYm9zZShtZXNzYWdlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0UXVlcnlQa1RpZUJyZWFrZXIoXG4gIGluZGV4ZXM6IEluZGV4W10sXG4gIHBrRmllbGQ6IHN0cmluZ1xuKTogSW5kZXhbXSB7XG4gIGlmICghcGtGaWVsZCkge1xuICAgIHJldHVybiBpbmRleGVzO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXMubWFwKChpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9IChpbmRleCBhcyBhbnkpPy5pbmRleD8uZmllbGRzO1xuICAgIGlmIChcbiAgICAgICFpbmRleD8ubmFtZSB8fFxuICAgICAgdHlwZW9mIGluZGV4Lm5hbWUgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICFpbmRleC5uYW1lLmluY2x1ZGVzKFwiZGVmYXVsdFF1ZXJ5XCIpIHx8XG4gICAgICAhQXJyYXkuaXNBcnJheShmaWVsZHMpIHx8XG4gICAgICBmaWVsZHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkRmllbGRzID0gZmllbGRzLmZpbHRlcihcbiAgICAgIChmaWVsZDogYW55KSA9PiB0eXBlb2YgZmllbGQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZmllbGQpXG4gICAgKTtcbiAgICBpZiAoc29ydGVkRmllbGRzLmxlbmd0aCAhPT0gZmllbGRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGNvbnN0IGhhc1BrID0gZmllbGRzLnNvbWUoKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgIGlmICghZmllbGQgfHwgdHlwZW9mIGZpZWxkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZmllbGQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGQsIHBrRmllbGQpO1xuICAgIH0pO1xuXG4gICAgaWYgKGhhc1BrKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEZpZWxkID0gZmllbGRzW2ZpZWxkcy5sZW5ndGggLSAxXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IGxhc3REaXJlY3Rpb24gPSBTdHJpbmcoXG4gICAgICBPYmplY3QudmFsdWVzKGxhc3RGaWVsZCB8fCB7fSlbMF0gfHwgXCJhc2NcIlxuICAgICkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBsYXN0RGlyZWN0aW9uID09PSBcImRlc2NcIiA/IFwiZGVzY1wiIDogXCJhc2NcIjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpbmRleCwge1xuICAgICAgaW5kZXg6IE9iamVjdC5hc3NpZ24oe30sIChpbmRleCBhcyBhbnkpLmluZGV4LCB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBbcGtGaWVsZF06IGRpcmVjdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZVBhdGg6IHN0cmluZykge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICBjb25zdCBkaXJuYW1lOiBzdHJpbmcgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhkaXJuYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShkaXJuYW1lKTtcbiAgZnMubWtkaXJTeW5jKGRpcm5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbEluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGxvZzogTG9nZ2VyXG4pOiBJbmRleFtdIHtcbiAgY29uc3QgaW5kZXhlcyA9IGdlbmVyYXRlSW5kZXhlcyhbbV0pO1xuICBjb25zdCBwa0ZpZWxkID0gcmVzb2x2ZVByaW1hcnlLZXlGaWVsZChtLCBsb2cpO1xuICByZXR1cm4gd2l0aERlZmF1bHRRdWVyeVBrVGllQnJlYWtlcihpbmRleGVzLCBwa0ZpZWxkIHx8IFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3M8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGFjY3VtPzogUmVjb3JkPHN0cmluZywgQ291Y2hEQkRlc2lnbkRvYz5cbik6IENvdWNoREJEZXNpZ25Eb2NbXSB7XG4gIGNvbnN0IHZpZXdzID0gZ2VuZXJhdGVWaWV3cyhbbV0pO1xuICBjb25zdCBzdG9yYWdlOiBSZWNvcmQ8c3RyaW5nLCBDb3VjaERCRGVzaWduRG9jPiA9IGFjY3VtIHx8IHt9O1xuICB2aWV3cy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBzdG9yYWdlW2RvYy5faWRdID0gZG9jO1xuICB9KTtcbiAgcmV0dXJuIHZpZXdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE1vZGVsRmlsZShmaWxlOiBhbnkpIHtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlLnBhcmVudFBhdGgsIGZpbGUubmFtZSk7XG4gIGNvbnN0IGV4cG9ydHMgPSByZXF1aXJlKGZpbGVQYXRoKTtcblxuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGV4cG9ydHMpLmZpbHRlcigoZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtID0gbmV3IChlIGFzIENvbnN0cnVjdG9yKSgpO1xuICAgICAgcmV0dXJuIG0gaW5zdGFuY2VvZiBNb2RlbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PltdO1xuICByZXR1cm4gdmFsdWVzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1vZGVsRm9sZGVycyhcbiAgLi4uZm9sZGVyczogc3RyaW5nW11cbik6IFByb21pc2U8TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W10+IHtcbiAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuICBjb25zdCByZXN1bHQ6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gW107XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGNvbnN0IHJlc29sdmVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKGZvbGRlcik7XG4gICAgY29uc3QgZmlsZXMgPSBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHJlc29sdmVkRm9sZGVyLCB7XG4gICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmOiBhbnkpID0+IGYuaXNGaWxlKCkgJiYgZi5uYW1lLmVuZHNXaXRoKFwianNcIikpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgcmVzdWx0LnB1c2goLi4ucmVhZE1vZGVsRmlsZShmaWxlKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUluZGV4ZXMoXG4gIGluZGV4ZXM6IEluZGV4W10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGluZGV4ZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBwLFxuICAgICAgICBgLi9NRVRBLUlORi9zdGF0ZWRiL2NvdWNoZGIvJHtjb2xsZWN0aW9uID8gYGNvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbn0vYCA6IFwiXCJ9aW5kZXhlcy8ke2luZGV4Lm5hbWV9Lmpzb25gXG4gICAgICApXG4gICAgKTtcbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZmlsZSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShpbmRleCwgdW5kZWZpbmVkLCAyKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEZXNpZ25Eb2NzKFxuICBkZXNpZ25Eb2NzOiBDb3VjaERCRGVzaWduRG9jW10sXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIGNvbGxlY3Rpb24/OiBzdHJpbmdcbikge1xuICBpZiAoIWRlc2lnbkRvY3MubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbiAgZGVzaWduRG9jcy5mb3JFYWNoKChkb2MpID0+IHtcbiAgICBjb25zdCBkb2NJZCA9IGRvYy5faWQucmVwbGFjZSgvXl9kZXNpZ25cXC8vLCBcIlwiKTtcbiAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBwLFxuICAgICAgICBgLi9NRVRBLUlORi9zdGF0ZWRiL2NvdWNoZGIvJHtjb2xsZWN0aW9uID8gYGNvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbn0vYCA6IFwiXCJ9ZGVzaWduX2RvY3MvJHtkb2NJZH0uanNvbmBcbiAgICAgIClcbiAgICApO1xuICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlKTtcbiAgICBjb25zdCBwYXlsb2FkID0geyAuLi5kb2MgfTtcbiAgICBkZWxldGUgcGF5bG9hZC5fcmV2O1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgdW5kZWZpbmVkLCAyKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJEZXNpZ25Eb2MgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbGxlY3Rpb25SZXNvbHZlciB9IGZyb20gXCIuLi8uLi9zaGFyZWQvaW5kZXhcIjtcbmltcG9ydCB7IHdyaXRlRGVzaWduRG9jcyB9IGZyb20gXCIuLi9pbmRleGVzL2dlbmVyYXRpb25cIjtcblxuLy9cbi8vIGV4cG9ydCB0eXBlIEZhYnJpY0NvbGxlY3Rpb24gPSB7XG4vLyAgIG5hbWU6IFwiY29sbGVjdGlvbk1hcmJsZXNcIjtcbi8vICAgcG9saWN5OiBcIk9SKCdPcmcxTVNQLm1lbWJlcicsICdPcmcyTVNQLm1lbWJlcicpXCI7XG4vLyAgIHJlcXVpcmVkUGVlckNvdW50OiAwO1xuLy8gICBtYXhQZWVyQ291bnQ6IDM7XG4vLyAgIGJsb2NrVG9MaXZlOiAwO1xuLy8gICBtZW1iZXJPbmx5UmVhZDogdHJ1ZTtcbi8vICAgbWVtYmVyT25seVdyaXRlOiB0cnVlO1xuLy8gICBlbmRvcnNlbWVudFBvbGljeToge1xuLy8gICAgIGlkZW50aXRpZXM6IFtcbi8vICAgICAgIHsgcm9sZTogeyBuYW1lOiBcIm1lbWJlclwiOyBtc3BJZDogXCJPcmcxTVNQXCIgfSB9LFxuLy8gICAgICAgeyByb2xlOiB7IG5hbWU6IFwibWVtYmVyXCI7IG1zcElkOiBcIk9yZzJNU1BcIiB9IH0sXG4vLyAgICAgXTtcbi8vICAgICBydWxlOiBcIk9SKCdPcmcxTVNQLm1lbWJlcicsICdPcmcyTVNQLm1lbWJlcicpXCI7XG4vLyAgIH07XG4vLyB9O1xuXG5leHBvcnQgdHlwZSBGYWJyaWNQb2xpY3lJZGVudGl0eSA9IHtcbiAgcm9sZToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtc3BJZDogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgRmFicmljQ29sbGVjdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwb2xpY3k6IHN0cmluZztcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcjtcbiAgbWF4UGVlckNvdW50OiBudW1iZXI7XG4gIGJsb2NrVG9MaXZlOiBudW1iZXI7XG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuO1xuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW47XG4gIGVuZG9yc2VtZW50UG9saWN5OiB7XG4gICAgaWRlbnRpdGllczogRmFicmljUG9saWN5SWRlbnRpdHlbXTtcbiAgICBydWxlOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQcml2YXRlQ29sbGVjdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwb2xpY3k6IHN0cmluZztcbiAgcmVxdWlyZWRQZWVyQ291bnQ6IG51bWJlcjtcbiAgbWF4UGVlckNvdW50OiBudW1iZXI7XG4gIGJsb2NrVG9MaXZlOiBudW1iZXI7XG4gIG1lbWJlck9ubHlSZWFkOiBib29sZWFuO1xuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW47XG4gIGVuZG9yc2VtZW50UG9saWN5Pzoge1xuICAgIHNpZ25hdHVyZVBvbGljeTogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3Rpb25Gb3IoXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHBvbGljeTogc3RyaW5nLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlcixcbiAgYmxvY2tUb0xpdmU6IG51bWJlcixcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4sXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhblxuKTogUHJpdmF0ZUNvbGxlY3Rpb24ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGNvbGxlY3Rpb25OYW1lLFxuICAgIHBvbGljeTogcG9saWN5LFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQ29sbGVjdGlvbkZvcihcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZyA9IGAke21zcElkfVByaXZhdGVgLFxuICByZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyID0gMCxcbiAgbWF4UGVlckNvdW50OiBudW1iZXIgPSAwLFxuICBibG9ja1RvTGl2ZTogbnVtYmVyID0gMCxcbiAgbWVtYmVyT25seVJlYWQ6IGJvb2xlYW4gPSB0cnVlLFxuICBtZW1iZXJPbmx5V3JpdGU6IGJvb2xlYW4gPSB0cnVlXG4pOiBQcml2YXRlQ29sbGVjdGlvbiB7XG4gIGNvbnN0IGMgPSBjb2xsZWN0aW9uRm9yKFxuICAgIGNvbGxlY3Rpb25OYW1lLFxuICAgIGBPUignJHttc3BJZH0ubWVtYmVyJylgLFxuICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgIG1heFBlZXJDb3VudCxcbiAgICBibG9ja1RvTGl2ZSxcbiAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICBtZW1iZXJPbmx5V3JpdGVcbiAgKTtcblxuICBjLmVuZG9yc2VtZW50UG9saWN5ID0ge1xuICAgIHNpZ25hdHVyZVBvbGljeTogYE9SKCcke21zcElkfS5wZWVyJylgLFxuICB9O1xuICByZXR1cm4gYztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZENvbGxlY3Rpb25Gb3IoXG4gIG1zcElkczogc3RyaW5nW10sXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHJlcXVpcmVkUGVlckNvdW50OiBudW1iZXIgPSAxLFxuICBtYXhQZWVyQ291bnQ6IG51bWJlciA9IDIsXG4gIGJsb2NrVG9MaXZlOiBudW1iZXIgPSAwLFxuICBtZW1iZXJPbmx5UmVhZDogYm9vbGVhbiA9IHRydWUsXG4gIG1lbWJlck9ubHlXcml0ZTogYm9vbGVhbiA9IHRydWVcbik6IFByaXZhdGVDb2xsZWN0aW9uIHtcbiAgY29uc3QgYyA9IGNvbGxlY3Rpb25Gb3IoXG4gICAgY29sbGVjdGlvbk5hbWUsXG4gICAgYE9SKCR7bXNwSWRzLm1hcCgobSkgPT4gYCcke219Lm1lbWJlcidgKS5qb2luKFwiLFwiKX0pYCxcbiAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICBtYXhQZWVyQ291bnQsXG4gICAgYmxvY2tUb0xpdmUsXG4gICAgbWVtYmVyT25seVJlYWQsXG4gICAgbWVtYmVyT25seVdyaXRlXG4gICk7XG4gIGMuZW5kb3JzZW1lbnRQb2xpY3kgPSB7XG4gICAgc2lnbmF0dXJlUG9saWN5OiBgQU5EKCR7bXNwSWRzLm1hcCgobSkgPT4gYCcke219LnBlZXInYCkuam9pbihcIixcIil9KWAsXG4gIH07XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdENvbGxlY3Rpb25zPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG06IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZHM6IHN0cmluZ1tdLFxuICBvdmVycmlkZXM6IHtcbiAgICBwcml2YXRlQ29scz86IFBhcnRpYWw8UHJpdmF0ZUNvbGxlY3Rpb24+O1xuICAgIHNoYXJlZENvbHM/OiBQYXJ0aWFsPFByaXZhdGVDb2xsZWN0aW9uPjtcbiAgfSA9IHt9LFxuICBtaXJyb3I6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIGxldCB7IHByaXZhdGVDb2xzLCBzaGFyZWRDb2xzIH0gPSBNb2RlbC5jb2xsZWN0aW9uc0ZvcihtKTtcblxuICBmdW5jdGlvbiByZXNvbHZlQ29sbGVjdGlvbihhcmc6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcik6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJnO1xuICAgICAgcmV0dXJuIGFyZyhtLCBtc3BJZHNbMF0pIGFzIHN0cmluZztcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlQ29scyA9IHByaXZhdGVDb2xzLm1hcChyZXNvbHZlQ29sbGVjdGlvbik7XG4gIHNoYXJlZENvbHMgPSBzaGFyZWRDb2xzLm1hcChyZXNvbHZlQ29sbGVjdGlvbik7XG5cbiAgY29uc3QgcHJpdmF0ZURlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudDogMCxcbiAgICAgIG1heFBlZXJDb3VudDogMCxcbiAgICAgIGJsb2NrVG9MaXZlOiAwLFxuICAgICAgbWVtYmVyT25seVJlYWQ6IHRydWUsXG4gICAgICBtZW1iZXJPbmx5V3JpdGU6IHRydWUsXG4gICAgfSxcbiAgICBvdmVycmlkZXM/LnByaXZhdGVDb2xzIHx8IHt9XG4gICk7XG4gIGNvbnN0IHNoYXJlZERlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICB7XG4gICAgICByZXF1aXJlZFBlZXJDb3VudDogMSxcbiAgICAgIG1heFBlZXJDb3VudDogMixcbiAgICAgIGJsb2NrVG9MaXZlOiAwLFxuICAgICAgbWVtYmVyT25seVJlYWQ6IHRydWUsXG4gICAgICBtZW1iZXJPbmx5V3JpdGU6IHRydWUsXG4gICAgfSxcbiAgICBvdmVycmlkZXM/LnNoYXJlZENvbHMgfHwge31cbiAgKTtcblxuICBjb25zdCBtaXJyb3JNZXRhID0gbWlycm9yID8gTW9kZWwubWlycm9yZWRBdChtKSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBwcml2YXRlcyA9IG1zcElkc1xuICAgIC5tYXAoKG1zcElkKSA9PlxuICAgICAgKHByaXZhdGVDb2xzIGFzIHN0cmluZ1tdKS5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgeyByZXF1aXJlZFBlZXJDb3VudCwgbWF4UGVlckNvdW50LCBibG9ja1RvTGl2ZSwgbWVtYmVyT25seVJlYWQgfSA9XG4gICAgICAgICAgcHJpdmF0ZURlZmF1bHRzO1xuICAgICAgICByZXR1cm4gcHJpdmF0ZUNvbGxlY3Rpb25Gb3IoXG4gICAgICAgICAgbXNwSWQsXG4gICAgICAgICAgcCxcbiAgICAgICAgICByZXF1aXJlZFBlZXJDb3VudCxcbiAgICAgICAgICBtYXhQZWVyQ291bnQsXG4gICAgICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICAgICAgbWVtYmVyT25seVJlYWQsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKVxuICAgIC5mbGF0KCk7XG5cbiAgaWYgKG1pcnJvck1ldGEgJiYgbWlycm9yTWV0YS5tc3BJZCkge1xuICAgIGNvbnN0IHJlc29sdmVkID1cbiAgICAgIHR5cGVvZiBtaXJyb3JNZXRhLnJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWlycm9yTWV0YS5yZXNvbHZlclxuICAgICAgICA6IG1pcnJvck1ldGEucmVzb2x2ZXIobSwgbWlycm9yTWV0YS5tc3BJZCk7XG4gICAgaWYgKFxuICAgICAgcmVzb2x2ZWQgJiZcbiAgICAgICFwcml2YXRlcy5zb21lKFxuICAgICAgICAocCkgPT4gcC5uYW1lID09PSByZXNvbHZlZCAmJiBwLnBvbGljeS5pbmNsdWRlcyhtaXJyb3JNZXRhLm1zcElkKVxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc3QgeyByZXF1aXJlZFBlZXJDb3VudCwgbWF4UGVlckNvdW50LCBibG9ja1RvTGl2ZSwgbWVtYmVyT25seVJlYWQgfSA9XG4gICAgICAgIHByaXZhdGVEZWZhdWx0cztcbiAgICAgIHByaXZhdGVzLnB1c2goXG4gICAgICAgIHByaXZhdGVDb2xsZWN0aW9uRm9yKFxuICAgICAgICAgIG1pcnJvck1ldGEubXNwSWQsXG4gICAgICAgICAgcmVzb2x2ZWQsXG4gICAgICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgICAgIGJsb2NrVG9MaXZlLFxuICAgICAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2hhcmVkID0gKHNoYXJlZENvbHMgYXMgc3RyaW5nW10pLm1hcCgocCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVpcmVkUGVlckNvdW50LFxuICAgICAgbWF4UGVlckNvdW50LFxuICAgICAgYmxvY2tUb0xpdmUsXG4gICAgICBtZW1iZXJPbmx5UmVhZCxcbiAgICAgIG1lbWJlck9ubHlXcml0ZSxcbiAgICB9ID0gc2hhcmVkRGVmYXVsdHM7XG4gICAgcmV0dXJuIHNoYXJlZENvbGxlY3Rpb25Gb3IoXG4gICAgICBtc3BJZHMsXG4gICAgICBwLFxuICAgICAgcmVxdWlyZWRQZWVyQ291bnQsXG4gICAgICBtYXhQZWVyQ291bnQsXG4gICAgICBibG9ja1RvTGl2ZSxcbiAgICAgIG1lbWJlck9ubHlSZWFkLFxuICAgICAgbWVtYmVyT25seVdyaXRlXG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcml2YXRlcyxcbiAgICBzaGFyZWQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25zKFxuICBjb2xzOiBQcml2YXRlQ29sbGVjdGlvbltdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBmaWxlTmFtZSA9IFwiY29sbGVjdGlvbnNfY29uZmlnXCJcbikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4gIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgZGlybmFtZTogc3RyaW5nID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSBhcyBzdHJpbmc7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlybmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbnN1cmVEaXJlY3RvcnlFeGlzdGVuY2UoZGlybmFtZSk7XG4gICAgZnMubWtkaXJTeW5jKGRpcm5hbWUpO1xuICB9XG5cbiAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4ocCwgYC4vTUVUQS1JTkYvJHtmaWxlTmFtZX0uanNvbmApKTtcbiAgZW5zdXJlRGlyZWN0b3J5RXhpc3RlbmNlKGZpbGUpO1xuICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIEpTT04uc3RyaW5naWZ5KGNvbHMsIHVuZGVmaW5lZCwgMikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyhcbiAgZG9jczogQ291Y2hEQkRlc2lnbkRvY1tdLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBjb2xsZWN0aW9uPzogc3RyaW5nXG4pIHtcbiAgaWYgKCFkb2NzPy5sZW5ndGgpIHJldHVybjtcbiAgd3JpdGVEZXNpZ25Eb2NzKGRvY3MsIHAsIGNvbGxlY3Rpb24pO1xufVxuIiwiaW1wb3J0IHtcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQYWdpbmF0b3IsXG4gIFByZXBhcmVkU3RhdGVtZW50LFxuICBTZXJpYWxpemVkUGFnZSxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgTWFuZ29RdWVyeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWNvdWNoZGJcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUGFnaW5hdG9yPFxuICBNLFxuICBNW10sXG4gIE1hbmdvUXVlcnlcbj4ge1xuICBib29rbWFyaz86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBGYWJyaWNDbGllbnRBZGFwdGVyLFxuICAgIHF1ZXJ5OiBNYW5nb1F1ZXJ5IHwgUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgYFJhdyBxdWVyeSBhY2Nlc3MgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLiBvbmx5IHByZXBhcmVkIHN0YXRlbWVudHMgYXJlIG5hdGl2ZWx5IGF2YWlsYWJsZWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcGFnZShcbiAgICBwYWdlOiBudW1iZXIgPSAxLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHN1cGVyLnBhZ2UocGFnZSwgLi4uYXJncyk7IC8vIHRoaXMgd2lsbCBmYWlsIGZvciBub24tcHJlcGFyZWQgc3RhdGVtZW50c1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGlzU2VyaWFsaXplZFBhZ2Uob2JqOiBTZXJpYWxpemVkUGFnZTxhbnk+IHwgYW55KSB7XG4gICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIEFycmF5LmlzQXJyYXkob2JqLmRhdGEpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuLy8gaW1wb3J0IHsgTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRSB9IGZyb20gXCIuLi9jb250cmFjdHMvcHJpdmF0ZS1kYXRhXCI7XG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gb3ZlcmZsb3cgZXJyb3IgaW4gYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgT3ZlcmZsb3dFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJmbG93RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgT3ZlcmZsb3dFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQmFsYW5jZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEJhbGFuY2VFcnJvci5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGJhbGFuY2UgdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIGluIFNtYXJ0IENvbnRyYWN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgQmFsYW5jZUVycm9yXG4gKiBAZXh0ZW5kcyBJbnRlcm5hbEVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQWxsb3dhbmNlRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSByZWdpc3RyYXRpbmcgbmV3IGVudGl0aWVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0aGUgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjbGFzcyBSZWdpc3RyYXRpb25FcnJvclxuICpcbiAqIEBjYXRlZ29ydCBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbkVycm9yIGV4dGVuZHMgQXV0aG9yaXphdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUmVnaXN0cmF0aW9uRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZFxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudFxuICogcGVyc2lzdGVuY2UgYWRhcHRlciBvciBjb25maWd1cmF0aW9uLiBJdCBleHRlbmRzIHRoZSBCYXNlRXJyb3IgY2xhc3MgYW5kIHNldHMgYSA1MDAgc3RhdHVzIGNvZGUuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXBcbiAqIEBjbGFzcyBVbnN1cHBvcnRlZEVycm9yXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVGhyb3dpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogaWYgKCFhZGFwdGVyLnN1cHBvcnRzVHJhbnNhY3Rpb25zKCkpIHtcbiAqICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGFkYXB0ZXInKTtcbiAqIH1cbiAqXG4gKiAvLyBDYXRjaGluZyBhbiBVbnN1cHBvcnRlZEVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBhZGFwdGVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPcGVyYXRpb24gbm90IHN1cHBvcnRlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgTWlzc2luZ0NvbnRleHRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBNaXNzaW5nQ29udGV4dEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciA9IFwiTUlTU0lOR19QUklWQVRFX0RBVEFfRVJST1JfTUVTU0FHRVwiKSB7XG4gICAgc3VwZXIoVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MubmFtZSwgbXNnLCA0MDMpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycyB3aGVuIGEgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gc3RlcCBpcyBub3QgcGVyZm9ybWVkLlxuICpcbiAqIEBjbGFzcyBOb3RJbml0aWFsaXplZEVycm9yXG4gKiBAZXh0ZW5kcyBCYXNlRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgYW4gRXJyb3Igb2JqZWN0IHRvIHdyYXAuXG4gKlxuICogQHRocm93cyB7Tm90SW5pdGlhbGl6ZWRFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbm90IHBlcmZvcm1lZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqIGlmICghaXNJbml0aWFsaXplZCkge1xuICogICB0aHJvdyBuZXcgTm90SW5pdGlhbGl6ZWRFcnJvcignQXBwbGljYXRpb24gaXMgbm90IGluaXRpYWxpemVkJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gTm90SW5pdGlhbGl6ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90SW5pdGlhbGl6ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ0luaXRpYWxpemF0aW9uIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEluaXRpYWxpemVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoTm90SW5pdGlhbGl6ZWRFcnJvci5uYW1lLCBtc2csIDQwOSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdQS0NTUzExTGliIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE1pc3NpbmdQS0NTUzExTGliLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZG9yc2VtZW50RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFbmRvcnNlbWVudEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE12Y2NSZWFkQ29uZmxpY3RFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE12Y2NSZWFkQ29uZmxpY3RFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBQaGFudG9tUmVhZENvbmZsaWN0RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kb3JzZW1lbnRQb2xpY3lFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVuZG9yc2VtZW50UG9saWN5RXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25MaW1pdHNFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcixcbiAgICBuYW1lOiBzdHJpbmcgPSBUcmFuc2FjdGlvbkxpbWl0c0Vycm9yLm5hbWUsXG4gICAgY29kZSA9IDU5MFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBuYW1lLCBjb2RlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBUcmFuc2FjdGlvblRpbWVvdXRFcnJvci5uYW1lLCA1OTEpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFRyYW5zYWN0aW9uQnVmZmVyU2l6ZUVycm9yLm5hbWUsIDU5Mik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciBleHRlbmRzIFRyYW5zYWN0aW9uTGltaXRzRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvci5uYW1lLCA1OTMpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlQ29udGV4dHVhbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dE9mLFxuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgRmxhZ3NPZixcbiAgT2JzZXJ2ZXJIYW5kbGVyLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIFJlcG9zaXRvcnksXG4gIFNlcmlhbGl6ZWRQYWdlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICByZWR1Y2VFcnJvcnNUb1ByaW50LFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciB9IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gZm9yIEZhYnJpYyBjbGllbnQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgZ2VuZXJpYyBSZXBvc2l0b3J5IHRvIHByZXBhcmUgY29udGV4dCBhbmQgYXJndW1lbnRzIGZvciBDUlVEIG9wZXJhdGlvbnMgZXhlY3V0ZWQgdmlhIGEgRmFicmljIGNsaWVudCBBZGFwdGVyLCB3aXJpbmcgUmVwb3NpdG9yeUZsYWdzIGFuZCBGYWJyaWMtc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyByZXBvc2l0b3J5XG4gKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBNYW5nb1F1ZXJ5LCBGYWJyaWNGbGFncywgQ29udGV4dDxGYWJyaWNGbGFncz4+fSBbYWRhcHRlcl0gLSBPcHRpb25hbCBhZGFwdGVyIGluc3RhbmNlIHVzZWQgdG8gZXhlY3V0ZSBvcGVyYXRpb25zXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBbY2xhenpdIC0gT3B0aW9uYWwgbW9kZWwgY29uc3RydWN0b3IgdXNlZCBieSB0aGUgcmVwb3NpdG9yeVxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuICogaW1wb3J0IHsgRmFicmljQ2xpZW50UmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWZhYnJpY1wiO1xuICpcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBNb2RlbCB7IGlkITogc3RyaW5nOyBuYW1lITogc3RyaW5nOyB9XG4gKiBjb25zdCByZXBvID0gbmV3IEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8VXNlcj4oKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHJlcG8ucmVhZChcIjFcIik7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgQXBwLT4+UmVwbzogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvLT4+UmVwbzogY3JlYXRlUHJlZml4KG1vZGVsLCAuLi5hcmdzKVxuICogICBSZXBvLT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlLCBpZCwgbW9kZWwsIGZsYWdzKVxuICogICBBZGFwdGVyLS0+PlJlcG86IHJlc3VsdFxuICogICBSZXBvLS0+PkFwcDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudFJlcG9zaXRvcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgQSBleHRlbmRzIEZhYnJpY0NsaWVudEFkYXB0ZXIgPSBGYWJyaWNDbGllbnRBZGFwdGVyLFxuPiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgQT4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX292ZXJyaWRlcyA9IE9iamVjdC5hc3NpZ24oe30sIHN1cGVyW1wiX292ZXJyaWRlc1wiXSwge1xuICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgYWxsb3dSYXdTdGF0ZW1lbnRzOiBmYWxzZSxcbiAgICBmb3JjZVByZXBhcmVTaW1wbGVRdWVyaWVzOiB0cnVlLFxuICAgIGZvcmNlUHJlcGFyZUNvbXBsZXhRdWVyaWVzOiB0cnVlLFxuICAgIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiBmYWxzZSxcbiAgICByZWJ1aWxkV2l0aFRyYW5zaWVudDogZmFsc2UsXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI/OiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+LCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgY2xhenosIGZvcmNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG92ZXJyaWRlKGZsYWdzOiBQYXJ0aWFsPEZsYWdzT2Y8Q29udGV4dE9mPEE+Pj4pOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXJcbiAgICAgIC5vdmVycmlkZShPYmplY3QuYXNzaWduKHt9LCBmbGFncywgdGhpcy5fb3ZlcnJpZGVzKSlcbiAgICAgIC5mb3IoZmxhZ3MgYXMgYW55KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gc3VwZXIuT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdpbmF0ZUJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgcmVmOiBPbWl0PERpcmVjdGlvbkxpbWl0T2Zmc2V0LCBcImRpcmVjdGlvblwiPiA9IHtcbiAgICAgIG9mZnNldDogMSxcbiAgICAgIGxpbWl0OiAxMCxcbiAgICB9LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8U2VyaWFsaXplZFBhZ2U8TT4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5wYWdpbmF0ZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBwYWdpbmF0aW5nICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIHBhZ2Ugc2l6ZSAke3JlZi5saW1pdH1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoXG4gICAgICB0aGlzLnBhZ2luYXRlQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIG9yZGVyLFxuICAgICAgeyBsaW1pdDogcmVmLmxpbWl0LCBvZmZzZXQ6IHJlZi5vZmZzZXQsIGJvb2ttYXJrOiByZWYuYm9va21hcmsgfSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdEJ5KFxuICAgIGtleToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5saXN0QnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGxpc3RpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ30gJHtvcmRlcn1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgICAgdGhpcy5saXN0QnkubmFtZSxcbiAgICAgICAga2V5LFxuICAgICAgICBvcmRlcixcbiAgICAgICAgLi4uY3R4QXJnc1xuICAgICAgKSkgYXMgYW55O1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgUXVlcnlSZXN1bHRUb29MYXJnZUVycm9yKSB7XG4gICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgIGBsaXN0QnkgcmVzdWx0IHNldCB0b28gbGFyZ2UgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBrZXk9JHtTdHJpbmcoa2V5KX0gb3JkZXI9JHtvcmRlcn0uIFJldHVybmluZyBlbXB0eSBsaXN0LiBVc2UgcGFnaW5hdGVCeSBmb3IgbGFyZ2UgZGF0YXNldHMuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW10gYXMgTVtdO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kQnkoXG4gICAga2V5OiBrZXlvZiBNLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksIHRydWUpXG4gICAgKS5mb3IodGhpcy5maW5kQnkpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgYWxsICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoICR7a2V5IGFzIHN0cmluZ30gJHt2YWx1ZX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc3RhdGVtZW50KFxuICAgICAgdGhpcy5maW5kQnkubmFtZSxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICkpIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRPbmVCeShcbiAgICBrZXk6IGtleW9mIE0sXG4gICAgdmFsdWU6IGFueSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZE9uZUJ5KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBmaW5kaW5nIE9uZSAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gd2l0aCAke2tleSBhcyBzdHJpbmd9ICR7dmFsdWV9YFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZE9uZUJ5Lm5hbWUsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZmluZCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMuZmluZC5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBvcmRlcixcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApKSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBwYWdlKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICByZWY6IE9taXQ8RGlyZWN0aW9uTGltaXRPZmZzZXQsIFwiZGlyZWN0aW9uXCI+ID0ge1xuICAgICAgb2Zmc2V0OiAxLFxuICAgICAgbGltaXQ6IDEwLFxuICAgIH0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxTZXJpYWxpemVkUGFnZTxNPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLnBhZ2UpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYHBhZ2luZyAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gYnkgZGVmYXVsdCBxdWVyeSBhdHRyaWJ1dGVzYFxuICAgICk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnN0YXRlbWVudChcbiAgICAgIHRoaXMucGFnZS5uYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICByZWYsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc3RhdGVtZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdGF0ZW1lbnQpO1xuICAgIGxvZy52ZXJib3NlKGBFeGVjdXRpbmcgcHJlcGFyZWQgc3RhdGVtZW50ICR7bmFtZX1gKTtcbiAgICBjb25zdCBjYWxsQXJncyA9IGN0eEFyZ3Muc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoXG4gICAgICB0aGlzLmFkYXB0ZXIuZGVjb2RlKFxuICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCxcbiAgICAgICAgICBbbmFtZSwgSlNPTi5zdHJpbmdpZnkoY2FsbEFyZ3MpXSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaXMuY2xhc3NcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBsZXQgaHlkcmF0ZWQ6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBoeWRyYXRlZCA9IHJlc3VsdC5tYXAoKHI6IGFueSkgPT5cbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gJiZcbiAgICAgICAgKHIgYXMgYW55KVtDb3VjaERCS2V5cy5UQUJMRV0gPT09IE1vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKVxuICAgICAgICAgID8gKG5ldyB0aGlzLmNsYXNzKHIpIGFzIE0pXG4gICAgICAgICAgOiByXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdICYmXG4gICAgICAocmVzdWx0IGFzIGFueSlbQ291Y2hEQktleXMuVEFCTEVdID09PSBNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcylcbiAgICApIHtcbiAgICAgIGh5ZHJhdGVkID0gbmV3IHRoaXMuY2xhc3MocmVzdWx0KSBhcyBNO1xuICAgIH0gZWxzZSBpZiAoRmFicmljQ2xpZW50UGFnaW5hdG9yLmlzU2VyaWFsaXplZFBhZ2UocmVzdWx0KSkge1xuICAgICAgaHlkcmF0ZWQgPSBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGQ6IGFueSkgPT4gbmV3IHRoaXMuY2xhc3MoZCkgYXMgTSksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHlkcmF0ZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlBZnRlclJlYWQoaHlkcmF0ZWQsIGN0eCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFwcGx5QWZ0ZXJSZWFkKHZhbHVlOiBhbnksIGN0eDogQ29udGV4dE9mPEE+KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIWN0eC5nZXRPclVuZGVmaW5lZChcImFmdGVyUXVlcnlIYW5kbGVyc1wiKSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIFJlcG9zaXRvcnk8TSwgQT4sIGFueT4oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGN0eCxcbiAgICAgICAgdmFsdWUgYXMgTSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZhbHVlLm1hcCgoZW50cnkpID0+IHRoaXMuYXBwbHlBZnRlclJlYWQoZW50cnksIGN0eCkpKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKEZhYnJpY0NsaWVudFBhZ2luYXRvci5pc1NlcmlhbGl6ZWRQYWdlKHZhbHVlKSkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseUFmdGVyUmVhZCh2YWx1ZS5kYXRhLCBjdHgpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb3VudE9mKFxuICAgIGtleT86IGtleW9mIE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuY291bnRPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY291bnRpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9JHtrZXkgPyBgIGJ5ICR7a2V5IGFzIHN0cmluZ31gIDogXCJcIn1gXG4gICAgKTtcbiAgICBjb25zdCBzdG10QXJncyA9IGtleSA/IFtrZXksIC4uLmN0eEFyZ3NdIDogY3R4QXJncztcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLCAuLi5zdG10QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtYXhPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWF4T2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWF4IG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBtaW5PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8TVtLXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMubWluT2YpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYGZpbmRpbmcgbWluIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBhdmdPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5hdmdPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgYXZnIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzdW1PZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5zdW1PZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgY2FsY3VsYXRpbmcgc3VtIG9mICR7a2V5IGFzIHN0cmluZ30gaW4gJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsIGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkaXN0aW5jdE9mPEsgZXh0ZW5kcyBrZXlvZiBNPihcbiAgICBrZXk6IEssXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW0tdW10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuZGlzdGluY3RPZik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgZmluZGluZyBkaXN0aW5jdCB2YWx1ZXMgb2YgJHtrZXkgYXMgc3RyaW5nfSBpbiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZ3JvdXBPZjxLIGV4dGVuZHMga2V5b2YgTT4oXG4gICAga2V5OiBLLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTVtdPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsIHRydWUpXG4gICAgKS5mb3IodGhpcy5ncm91cE9mKTtcbiAgICBsb2cudmVyYm9zZShgZ3JvdXBpbmcgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGJ5ICR7a2V5IGFzIHN0cmluZ31gKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLCBrZXksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgaGVhbHRoY2hlY2soLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuaGVhbHRoY2hlY2spO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLmhlYWx0aGNoZWNrKHRoaXMuY2xhc3MsIC4uLmN0eEFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG4gICAgdGhpcy5lbnN1cmVMZWdhY3lNaXJyb3JGbGFnKGN0eCwgbW9kZWwpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIGN0eCk7XG4gICAgY29uc3QgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHByZXBhcmVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgaWQsXG4gICAgICByZWNvcmQsXG4gICAgICB0cmFuc2llbnQsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZXN1bHQsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnQsIGN0eCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgeyBjdHhBcmdzLCBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGUpO1xuICAgIHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCBjdHgpO1xuICAgIGNvbnN0IHsgaWQsIHRyYW5zaWVudCB9ID0gcHJlcGFyZWQ7XG4gICAgbGV0IHJlY29yZCA9IHByZXBhcmVkLnJlY29yZDtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgdXBkYXRpbmcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB3aXRoIGlkICR7aWR9YFxuICAgICk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZCxcbiAgICAgIHJlY29yZCxcbiAgICAgIHRyYW5zaWVudCxcbiAgICAgIC4uLmN0eEFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgaWQsIHRyYW5zaWVudCwgY3R4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxbTVtdLCAuLi5hbnlbXSwgQ29udGV4dE9mPEE+XT4ge1xuICAgIGNvbnN0IHsgY3R4LCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNyZWF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgaWdub3JlSGFuZGxlcnMgPSBjdHguZ2V0KFwiaWdub3JlSGFuZGxlcnNcIik7XG4gICAgY29uc3QgaWdub3JlVmFsaWRhdGUgPSBjdHguZ2V0KFwiaWdub3JlVmFsaWRhdGlvblwiKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG5cbiAgICBtb2RlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBpZiAoIWlnbm9yZUhhbmRsZXJzKVxuICAgICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgUmVwb3NpdG9yeTxNLCBBPiwgYW55PihcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBpZiAoIWlnbm9yZVZhbGlkYXRlKSB7XG4gICAgICBjb25zdCBpZ25vcmVkUHJvcHMgPSBjdHguZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbW9kZWxzLm1hcCgobSkgPT4gUHJvbWlzZS5yZXNvbHZlKG0uaGFzRXJyb3JzKC4uLmlnbm9yZWRQcm9wcykpKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IHJlZHVjZUVycm9yc1RvUHJpbnQoZXJyb3JzKTtcblxuICAgICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG4gICAgfVxuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jdHhBcmdzXSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyAke21vZGVscy5sZW5ndGh9IG5ldyAke3RoaXMuY2xhc3MubmFtZX0gaW4gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9YFxuICAgICk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobW9kZWwpID0+IHRoaXMuZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHgsIG1vZGVsKSk7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCBjdHgpKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGNvbnN0IHBheWxvYWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgY29uc3QgdHJhbnNpZW50cyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC50cmFuc2llbnQpO1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGlkcyBhcyBQcmltYXJ5S2V5VHlwZVtdLFxuICAgICAgcGF5bG9hZHMsXG4gICAgICB0cmFuc2llbnRzLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgY3JlYXRlZC5tYXAoYXN5bmMgKHIsIGkpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBpZHNbaV07XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHIsIHRoaXMuY2xhc3MsIGlkLCB0cmFuc2llbnRzW2ldLCBjdHgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+XG4gICkge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYHJlYWRpbmcgJHtrZXlzLmxlbmd0aH0gJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLmNsYXNzLCBrZXlzLCAuLi5jdHhBcmdzKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIGtleXNbaV0sIHt9LCBjdHgpXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICBtb2RlbHM6IE1bXSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgVXBkYXRpbmcgJHttb2RlbHMubGVuZ3RofSBuZXcgJHt0aGlzLmNsYXNzLm5hbWV9IGluIHRhYmxlICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfWBcbiAgICApO1xuXG4gICAgbW9kZWxzLmZvckVhY2goKG1vZGVsKSA9PiB0aGlzLmVuc3VyZUxlZ2FjeU1pcnJvckZsYWcoY3R4LCBtb2RlbCkpO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgY3R4KSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBpZHMgYXMgUHJpbWFyeUtleVR5cGVbXSxcbiAgICAgIHByZXBhcmVkLm1hcCgocikgPT4gci5yZWNvcmQpLFxuICAgICAgcHJlcGFyZWQubWFwKChyKSA9PiByLnRyYW5zaWVudCksXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICB1cGRhdGVkLm1hcChhc3luYyAodSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGlkc1tpXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICAgICAgdSxcbiAgICAgICAgICB0aGlzLmNsYXNzLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIHByZXBhcmVkW2ldLnRyYW5zaWVudCxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTGVnYWN5TWlycm9yRmxhZyhjdHg6IENvbnRleHRPZjxBPiwgbW9kZWw6IE0pOiB2b2lkIHtcbiAgICBpZiAoTW9kZWwubWlycm9yZWRBdChtb2RlbCkpIHtcbiAgICAgIGN0eC5hY2N1bXVsYXRlKHsgbGVnYWN5OiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsLCBjb2x1bW4sIHBrLCB0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCB0b2tlbiBtZXRhZGF0YSBtb2RlbFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBFUkMyMCB0b2tlbiBkZWZpbml0aW9uIHdpdGhpbiB0aGUgRmFicmljIEVSQzIwIHNhbXBsZSwgaW5jbHVkaW5nIG5hbWUsIHN5bWJvbCwgZGVjaW1hbHMsIGFuZCB0aGUgb3duaW5nIGlkZW50aXR5LiBVc2VkIHRvIGRlZmluZSB0aGUgdW5pcXVlIHRva2VuIG1hbmFnZWQgYnkgdGhlIGNvbnRyYWN0LlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFRva2VuPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRVJDMjBUb2tlblxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRva2VuID0gbmV3IEVSQzIwVG9rZW4oeyBuYW1lOiBcIk15VG9rZW5cIiwgc3ltYm9sOiBcIk1US1wiLCBkZWNpbWFsczogMTgsIG93bmVyOiBcIng1MDk6Oi4uLlwiIH0pO1xuICogLy8gUGVyc2lzdCB0aHJvdWdoIGEgcmVwb3NpdG9yeTogYXdhaXQgcmVwby5jcmVhdGUodG9rZW4sIGN0eClcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9cbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobmV3IEVSQzIwVG9rZW4oey4uLn0pLCBjdHgpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkPW5hbWUsIHJlY29yZCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogc3RvcmVkXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdGFibGUoXCJlcmMyMF90b2tlbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRVJDMjBUb2tlbiBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHVuaXF1ZSBuYW1lXG4gICAqIEBzdW1tYXJ5IFNlcnZlcyBhcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBFUkMyMCB0b2tlbiBkZWZpbml0aW9uOyB0eXBpY2FsbHkgYSBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVyXG4gICAqL1xuICBuYW1lITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmluZyBpZGVudGl0eSBvZiB0aGUgdG9rZW5cbiAgICogQHN1bW1hcnkgWC41MDkgc3ViamVjdCBvciBNU1AgaWRlbnRpdHkgc3RyaW5nIHRoYXQgZGVub3RlcyB3aG8gb3ducy9jb250cm9scyB0aGUgdG9rZW4gZGVmaW5pdGlvblxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRva2VuIHN5bWJvbFxuICAgKiBAc3VtbWFyeSBTaG9ydCB0aWNrZXItbGlrZSBzeW1ib2wgdXNlZCB0byByZXByZXNlbnQgdGhlIHRva2VuIChlLmcuLCBNVEspXG4gICAqL1xuICBzeW1ib2whOiBzdHJpbmc7XG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY2ltYWwgcHJlY2lzaW9uIGZvciB0b2tlbiBhbW91bnRzXG4gICAqIEBzdW1tYXJ5IE51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRva2VuIGJhbGFuY2VzXG4gICAqL1xuICBkZWNpbWFscyE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgd2FsbGV0IG1vZGVsXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgaG9sZGVyIGFjY291bnQgZm9yIGFuIEVSQzIwIHRva2VuIHdpdGhpbiB0aGUgRmFicmljIG5ldHdvcmssIHRyYWNraW5nIGJhbGFuY2UgYW5kIHRva2VuIGFzc29jaWF0aW9uLlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFdhbGxldD59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEVSQzIwV2FsbGV0XG4gKiBAZXhhbXBsZVxuICogY29uc3Qgd2FsbGV0ID0gbmV3IEVSQzIwV2FsbGV0KHsgaWQ6IFwiYWNjdDFcIiwgdG9rZW46IFwiTXlUb2tlblwiLCBiYWxhbmNlOiAxMDAwIH0pO1xuICogLy8gVXBkYXRlIGJhbGFuY2UgdmlhIHJlcG9zaXRvcnk6IGF3YWl0IHJlcG8udXBkYXRlKHdhbGxldCwgY3R4KVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwb1xuICogICBBcHAtPj5SZXBvOiByZWFkKFwiYWNjdDFcIiwgY3R4KVxuICogICBSZXBvLS0+PkFwcDogRVJDMjBXYWxsZXRcbiAqL1xuQHRhYmxlKFwiZXJjMjBfd2FsbGV0c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFUkMyMFdhbGxldCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdhbGxldCB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIHdhbGxldDsgY29tbW9ubHkgcmVmZXJlbmNlcyBhbiBhY2NvdW50IG9yIGlkZW50aXR5XG4gICAqL1xuICBpZCE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc3NvY2lhdGVkIHRva2VuIG5hbWVcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgRVJDMjBUb2tlbiB0aGlzIHdhbGxldCBob2xkczsgbWFpbnRhaW5lZCBhcyBhIHJlbGF0aW9uc2hpcCBmb3IgY2FzY2FkaW5nIHVwZGF0ZXMvZGVsZXRlc1xuICAgKi9cbiAgdG9rZW4hOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVG9rZW4gYmFsYW5jZSBmb3IgdGhpcyB3YWxsZXRcbiAgICogQHN1bW1hcnkgQ3VycmVudCBhbW91bnQgb2YgdGhlIGFzc29jaWF0ZWQgdG9rZW4gaGVsZCBieSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSE6IG51bWJlcjtcblxuICBAY29sdW1uKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYXB0aXZlIGZsYWcgb3IgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBPcHRpb25hbCBmaWVsZCB1c2VkIGJ5IHNvbWUgZmxvd3MgdG8gbWFyayBub24tdHJhbnNmZXJhYmxlIGZ1bmRzIG9yIG1hbmFnZWQgY3VzdG9keVxuICAgKi9cbiAgY2FwdGl2ZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtPzogTW9kZWxBcmc8RVJDMjBXYWxsZXQ+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRVJDMjAgYWxsb3dhbmNlIG1vZGVsXG4gKiBAc3VtbWFyeSBDYXB0dXJlcyBhbiBhcHByb3ZhbCByZWxhdGlvbnNoaXAgd2hlcmUgYW4gb3duZXIgYWxsb3dzIGEgc3BlbmRlciB0byB0cmFuc2ZlciB1cCB0byBhIGNlcnRhaW4gdmFsdWUgZnJvbSB0aGUgb3duZXIncyB3YWxsZXQuXG4gKiBAcGFyYW0ge01vZGVsQXJnPEFsbG93YW5jZT59IFttXSAtIE9wdGlvbmFsIHBhcnRpYWwgZGF0YSBvciBhbm90aGVyIGluc3RhbmNlIHRvIGluaXRpYWxpemUgdGhlIG1vZGVsXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEFsbG93YW5jZVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFsbG93YW5jZSA9IG5ldyBBbGxvd2FuY2UoeyBvd25lcjogXCJhY2N0MVwiLCBzcGVuZGVyOiBcImFjY3QyXCIsIHZhbHVlOiA1MCB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIEFwcC0+PkFwcDogbmV3IEFsbG93YW5jZSh7IG93bmVyLCBzcGVuZGVyLCB2YWx1ZSB9KVxuICovXG5AdGFibGUoXCJlcmMyMF9hbGxvd2FuY2VzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEFsbG93YW5jZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsbG93YW5jZSB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIGFsbG93YW5jZTsgdHlwaWNhbGx5IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhcHByb3ZhbCByZWxhdGlvbnNoaXBcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmVyIHdhbGxldCBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFdhbGxldCB0aGF0IGF1dGhvcml6ZXMgdGhlIGFsbG93YW5jZVxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3BlbmRlciB3YWxsZXQgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBXYWxsZXQgYWxsb3dlZCB0byBzcGVuZCB1cCB0byB0aGUgYXBwcm92ZWQgdmFsdWUgZnJvbSB0aGUgb3duZXJcbiAgICovXG4gIHNwZW5kZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwcm92ZWQgdmFsdWVcbiAgICogQHN1bW1hcnkgTWF4aW11bSB0b2tlbiBhbW91bnQgdGhlIHNwZW5kZXIgbWF5IHRyYW5zZmVyIG9uIGJlaGFsZiBvZiB0aGUgb3duZXJcbiAgICovXG4gIHZhbHVlITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxBbGxvd2FuY2U+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEpTT05TZXJpYWxpemVyLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDbGllbnQtc2lkZSBKU09OIHNlcmlhbGl6ZXIgZm9yIERlY2FmIG1vZGVscyB0YXJnZXRpbmcgSHlwZXJsZWRnZXIgRmFicmljXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIEpTT05TZXJpYWxpemVyIHRvIGVtYmVkIG1vZGVsIG1ldGFkYXRhIChhbmNob3IpIHJlcXVpcmVkIHRvIHJlY29uc3RydWN0IGluc3RhbmNlcyBvbiB0aGUgY2xpZW50LCBhbmQgdG8gc2FmZWx5IHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBGYWJyaWMtYm91bmQgbW9kZWxzLlxuICogQHRlbXBsYXRlIE0gZXh0ZW5kcyBNb2RlbCAtIFRoZSBEZWNhZiBtb2RlbCB0eXBlIGhhbmRsZWQgYnkgdGhpcyBzZXJpYWxpemVyXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50czsgcHJvdmlkZWQgZm9yIGRvY3VtZW50YXRpb24gY29tcGxldGVuZXNzXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIENsaWVudFNlcmlhbGl6ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZXJpYWxpemVyID0gbmV3IENsaWVudFNlcmlhbGl6ZXI8VXNlcj4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgVXNlcih7IGlkOiBcIjFcIiwgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IHVzZXIgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGpzb24pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU2VyaWFsaXplciBhcyBDbGllbnRTZXJpYWxpemVyXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IHNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0+PlNlcmlhbGl6ZXI6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgU2VyaWFsaXplci0tPj5BcHA6IEpTT04gc3RyaW5nXG4gKiAgIEFwcC0+PlNlcmlhbGl6ZXI6IGRlc2VyaWFsaXplKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5TZXJpYWxpemVyOiBKU09OLnBhcnNlKGpzb24pXG4gKiAgIFNlcmlhbGl6ZXItPj5Nb2RlbDogTW9kZWwuYnVpbGQocGFyc2VkLCBhbmNob3IpXG4gKiAgIE1vZGVsLS0+PkFwcDogaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudFNlcmlhbGl6ZXI8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmUgYSBtb2RlbCBmb3IgSlNPTiBzZXJpYWxpemF0aW9uIGVtYmVkZGluZyBjbGFzcyBhbmNob3JcbiAgICogQHN1bW1hcnkgQ2xvbmVzIHRoZSBtb2RlbCBhbmQgaW5qZWN0cyB0aGUgY2xhc3MgbWV0YWRhdGEgYW5jaG9yIHNvIGl0IGNhbiBiZSByZWNvbnN0cnVjdGVkIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIEZhbGxzIGJhY2sgdG8gcHJvdmlkZWQgdGFibGUgbmFtZSBpZiBtZXRhZGF0YSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIHNlcmlhbGl6ZXJcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttb2RlbE5hbWVdIC0gT3B0aW9uYWwgdGFibGUgbmFtZSB0byB1c2Ugd2hlbiBtZXRhZGF0YSBjYW5ub3QgYmUgZGVyaXZlZFxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBBIHBsYWluIG9iamVjdCByZWFkeSB0byBiZSBKU09OLnN0cmluZ2lmeSdkXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGxldCBtZXRhZGF0YSA9IE1ldGFkYXRhLm1vZGVsTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgICBpZiAoIW1ldGFkYXRhIHx8IG1ldGFkYXRhID09PSBcIk9iamVjdFwiKVxuICAgICAgaWYgKG1vZGVsTmFtZSkgbWV0YWRhdGEgPSBtb2RlbE5hbWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICApO1xuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGE7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gaXRzIEpTT04gc2VyaWFsaXphdGlvblxuICAgKiBAc3VtbWFyeSBQYXJzZXMgdGhlIEpTT04gc3RyaW5nLCByZXRyaWV2ZXMgdGhlIGVtYmVkZGVkIG1vZGVsIGFuY2hvciwgYW5kIHVzZXMgTW9kZWwuYnVpbGQgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgSlNPTiBzdHJpbmcgcHJldmlvdXNseSBwcm9kdWNlZCBieSBzZXJpYWxpemVcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZXMgYSBtb2RlbCB0byBhIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB2aWEgcHJlU2VyaWFsaXplLCBlbWJlZGRpbmcgbWV0YWRhdGEgbmVlZGVkIGZvciByZWNvbnN0cnVjdGlvbiwgYW5kIHJldHVybnMgYSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhYmxlXSAtIE9wdGlvbmFsIHRhYmxlIG5hbWUgdG8gaW5jbHVkZSBhcyBhbmNob3Igd2hlbiBtZXRhZGF0YSBpcyB1bmF2YWlsYWJsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCBtb2RlbCB3aXRoIGFuY2hvciBtZXRhZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNLCBtb2RlbE5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCwgbW9kZWxOYW1lKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vRmFicmljQ2xpZW50UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRVJDMjBUb2tlbiwgRVJDMjBXYWxsZXQgfSBmcm9tIFwiLi4vLi4vY29udHJhY3RzL2VyYzIwL21vZGVsc1wiO1xuaW1wb3J0IHsgTW9kZWwsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4uL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IENsaWVudFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIENvbnRleHRPZixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIEV2ZW50SWRzLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFNlcXVlbmNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuLyoqXG4gKiBSZXBvc2l0b3J5IGZvciBpbnRlcmFjdGluZyB3aXRoIEVSQzIwIGNvbnRyYWN0cyBvbiBhIEh5cGVybGVkZ2VyIEZhYnJpYyBuZXR3b3JrLlxuICogRXh0ZW5kcyB0aGUgYmFzZSBGYWJyaWNDbGllbnRSZXBvc2l0b3J5IGNsYXNzIGFuZCB1dGlsaXplcyB0aGUgQ2xpZW50U2VyaWFsaXplciBmb3IgZGF0YSBzZXJpYWxpemF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5PFxuICBBIGV4dGVuZHMgRmFicmljQ2xpZW50QWRhcHRlcixcbj4gZXh0ZW5kcyBGYWJyaWNDbGllbnRSZXBvc2l0b3J5PEVSQzIwV2FsbGV0LCBBPiB7XG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZXIgPSBuZXcgQ2xpZW50U2VyaWFsaXplcigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemVyPGFueT4gPVxuICAgIEZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeS5zZXJpYWxpemVyO1xuXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIG9ic2VydmVycyBvZiBhbiBldmVudC5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBhIGRhdGFiYXNlIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUgbmFtZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIElEIG9yIElEcyBvZiB0aGUgYWZmZWN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnM8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8TT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yICR7dGhpc31gXG4gICAgKTtcblxuICAgIHRhYmxlID0gKFxuICAgICAgdHlwZW9mIHRhYmxlID09PSBcInN0cmluZ1wiID8gTW9kZWwuZ2V0KHRhYmxlKSA6IHRhYmxlXG4gICAgKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBsZXQgcGFyc2VkSWQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlZElkID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICAgIHBhcnNlZElkID0gaWQubWFwKFxuICAgICAgICAoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZShNb2RlbC5zZXF1ZW5jZUZvcih0YWJsZSkudHlwZSwgaSkgYXMgc3RyaW5nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRJZCA9IFNlcXVlbmNlLnBhcnNlVmFsdWUoXG4gICAgICAgIE1vZGVsLnNlcXVlbmNlRm9yKHRhYmxlKS50eXBlLFxuICAgICAgICBpZFxuICAgICAgKSBhcyBzdHJpbmc7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBwYXJzZWRJZCEsXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgVWludDhBcnJheSBpbnRvIGEgc3RyaW5nIHVzaW5nIHRoZSBUZXh0RGVjb2Rlci5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgVWludDhBcnJheSB0byBkZWNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIHN0cmluZy5cbiAgICovXG4gIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LmRlY29kZXIuZGVjb2RlKGRhdGEpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEpIHtcbiAgICBzdXBlcihhZGFwdGVyLCBFUkMyMFdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlRva2VuTmFtZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b2tlbk5hbWUoLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPj4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b2tlbk5hbWVcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudG9rZW5OYW1lXG4gICAgKTtcbiAgICBjb25zdCBuYW1lID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIlRva2VuTmFtZVwiKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzeW1ib2wgb2YgdGhlIEVSQzIwIHRva2VuLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gZmV0Y2ggdGhlIHN5bWJvbCBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIlN5bWJvbFwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCBhbmQgZGVjb2RlcyB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc3ltYm9sIG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHN5bWJvbCguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+Pik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInN5bWJvbFwiLCB0cnVlKSkuZm9yKHRoaXMuc3ltYm9sKTtcbiAgICBjb25zdCBzeW1ib2wgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiU3ltYm9sXCIpO1xuICAgIHJldHVybiB0aGlzLmRlY29kZShzeW1ib2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGZvciB0aGUgRVJDMjAgdG9rZW4uXG4gICAqIEl0IGNhbGxzIHRoZSBcIkRlY2ltYWxzXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IGFuZCBkZWNvZGVzIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIHRoZSBFUkMyMCB0b2tlbi5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGRlY2ltYWxzKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZGVjaW1hbHNcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMuZGVjaW1hbHNcbiAgICApO1xuICAgIGNvbnN0IGRlY2ltYWxzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oY3R4LCBcIkRlY2ltYWxzXCIpO1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoZGVjaW1hbHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgdG90YWwgc3VwcGx5IG9mIHRoZSBFUkMyMCB0b2tlbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiVG90YWxTdXBwbHlcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QgYW5kIGRlY29kZXMgdGhlIHJldHVybmVkIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRvdGFsIHN1cHBseSBvZiB0aGUgRVJDMjAgdG9rZW4uXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0b3RhbFN1cHBseShcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJ0b3RhbFN1cHBseVwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy50b3RhbFN1cHBseVxuICAgICk7XG4gICAgY29uc3QgdG90YWwgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZXZhbHVhdGVUcmFuc2FjdGlvbihjdHgsIFwiVG90YWxTdXBwbHlcIik7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZSh0b3RhbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIGEgc3BlY2lmaWVkIG93bmVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIHRoZSBFUkMyMCB0b2tlbiBmb3IgYSBnaXZlbiBvd25lci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQmFsYW5jZU9mXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHByb3ZpZGVkIG93bmVyJ3MgYWRkcmVzcyBhcyBhIHBhcmFtZXRlci5cbiAgICogVGhlIHJldHVybmVkIGRhdGEgaXMgdGhlbiBkZWNvZGVkIGFuZCBjb252ZXJ0ZWQgdG8gYSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBFUkMyMCB0b2tlbiBvd25lci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiB0aGUgRVJDMjAgdG9rZW4gZm9yIHRoZSBzcGVjaWZpZWQgb3duZXIuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBiYWxhbmNlT2YoXG4gICAgb3duZXI6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJiYWxhbmNlXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmJhbGFuY2VPZlxuICAgICk7XG4gICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJCYWxhbmNlT2ZcIiwgW1xuICAgICAgb3duZXIsXG4gICAgXSk7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmRlY29kZShiYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYSByZWNpcGllbnQuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gdHJhbnNmZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBhIHJlY2lwaWVudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgcmVjaXBpZW50J3MgYWRkcmVzcyBhbmQgdGhlIHRyYW5zZmVyIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gdHJhbnNmZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyKFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwidHJhbnNmZXJcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudHJhbnNmZXJcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZmVycmVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKGN0eCwgXCJUcmFuc2ZlclwiLCBbXG4gICAgICB0byxcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKHRyYW5zZmVycmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmZXJzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHRyYW5zZmVyIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgZnJvbSBvbmUgYWNjb3VudCB0byBhbm90aGVyLlxuICAgKiBGb3IgdGhpcyB0cmFuc2ZlciB0byB3b3JrIHRoZSBzcGVuZGVyICggYWNjb3VudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGlzIGZ1bmN0aW9uICkgbmVlZCB0byBoYXZlIHRoZSB2YWx1ZSBhcHByb3ZlZCBhcyBhbiBhbGxvd2FuY2UgYnkgdGhlIHNlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiVHJhbnNmZXJGcm9tXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIHNlbmRlcidzIGFkZHJlc3MsIHJlY2lwaWVudCdzIGFkZHJlc3MsIGFuZCB0aGUgdHJhbnNmZXIgYW1vdW50IGFzIHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIuXG4gICAqIEBwYXJhbSB0byAtIFRoZSBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIHRyYW5zZmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckZyb20oXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwidHJhbnNmZXJGcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLnRyYW5zZmVyRnJvbSk7XG4gICAgY29uc3QgdHJhbnNmZXJyZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIlRyYW5zZmVyRnJvbVwiLFxuICAgICAgW2Zyb20sIHRvLCB2YWx1ZS50b1N0cmluZygpXVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGUodHJhbnNmZXJyZWQpID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJlIHNwZW50IGJ5IGEgc3BlY2lmaWVkIHNwZW5kZXIuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBhcHByb3ZlIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYmUgc3BlbnQgYnkgYSBzcGVjaWZpZWQgc3BlbmRlci5cbiAgICogSXQgY2FsbHMgdGhlIFwiQXBwcm92ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhbmQgdGhlIGFwcHJvdmFsIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhcHByb3ZhbCB3YXMgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIHNwZW5kZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgc3BlbmRlci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYXBwcm92ZSBmb3IgdGhlIHNwZW5kZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgYXBwcm92YWwgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscyBvciB0aGUgZGVjb2RpbmcgcHJvY2VzcyBmYWlscy5cbiAgICovXG4gIGFzeW5jIGFwcHJvdmUoc3BlbmRlcjogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFwcHJvdmVcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuYXBwcm92ZSk7XG4gICAgY29uc3QgYXBwcm92ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkFwcHJvdmVcIiwgW1xuICAgICAgc3BlbmRlcixcbiAgICAgIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGFwcHJvdmVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIGEgc3BlbmRlci5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBmZXRjaCB0aGUgYWxsb3dhbmNlIG9mIEVSQzIwIHRva2VucyB0aGF0IHRoZSBzcGVjaWZpZWQgb3duZXIgaGFzIGFwcHJvdmVkIGZvciBhIHNwZW5kZXIuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkFsbG93YW5jZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBvd25lcidzIGFkZHJlc3MgYW5kIHRoZSBzcGVuZGVyJ3MgYWRkcmVzcyBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIEVSQzIwIHRva2VuIG93bmVyLlxuICAgKiBAcGFyYW0gc3BlbmRlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhbGxvd2FuY2Ugb2YgRVJDMjAgdG9rZW5zIHRoYXQgdGhlIHNwZWNpZmllZCBvd25lciBoYXMgYXBwcm92ZWQgZm9yIHRoZSBzcGVuZGVyLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYWxsb3dhbmNlKG93bmVyOiBzdHJpbmcsIHNwZW5kZXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImFsbG93YW5jZVwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5hbGxvd2FuY2UpO1xuICAgIGNvbnN0IGFsbG93YW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQWxsb3dhbmNlXCIsIFtcbiAgICAgIG93bmVyLFxuICAgICAgc3BlbmRlcixcbiAgICBdKTtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZGVjb2RlKGFsbG93YW5jZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBwcm92aWRlZCB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGJsb2NrY2hhaW4gbmV0d29yayB0byBpbml0aWFsaXplIHRoZSBFUkMyMCBjb250cmFjdCB3aXRoIHRoZSBnaXZlbiB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICogSXQgY2FsbHMgdGhlIFwiSW5pdGlhbGl6ZVwiIHRyYW5zYWN0aW9uIG9uIHRoZSBzbWFydCBjb250cmFjdCB3aXRoIHRoZSBzZXJpYWxpemVkIHRva2VuIGRhdGEgYXMgYSBwYXJhbWV0ZXIuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgY2hlY2tlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgRVJDMjAgdG9rZW4gaW5mb3JtYXRpb24gdG8gaW5pdGlhbGl6ZSB0aGUgY29udHJhY3Qgd2l0aC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSh0b2tlbjogRVJDMjBUb2tlbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJpbml0aWFsaXplXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IGluaXRpbGlhemVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnN1Ym1pdFRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJJbml0aWFsaXplXCIsXG4gICAgICBbRmFicmljRVJDMjBDbGllbnRSZXBvc2l0b3J5LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHRva2VuKV1cbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlKGluaXRpbGlhemVkKSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBFUkMyMCBjb250cmFjdCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIHZlcmlmeSBpZiB0aGUgRVJDMjAgY29udHJhY3QgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNoZWNrSW5pdGlhbGl6ZWRcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBpbml0aWFsaXphdGlvbiBjaGVjayBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBjaGVja0luaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJjaGVja0luaXRpYWxpemVkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNoZWNrSW5pdGlhbGl6ZWQpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKGN0eCwgXCJDaGVja0luaXRpYWxpemVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbnRzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gbWludCBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJNaW50XCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIG1pbnRpbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IHVwZGF0ZXMgdGhlIG1pbnRlcidzIG51bWJlciBvZiB0b2tlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIEVSQzIwIHRva2VucyB0byBtaW50LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWludGluZyBwcm9jZXNzIGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAgICovXG4gIGFzeW5jIG1pbnQoYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwibWludFwiLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoY29udGV4dEFyZ3MuYXJncywgdGhpcy5taW50KTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIk1pbnRcIiwgW2Ftb3VudC50b1N0cmluZygpXSk7XG4gIH1cblxuICAvKipcbiAgICogQnVybnMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIHRoZSBtaW50ZXIncyBhY2NvdW50LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBibG9ja2NoYWluIG5ldHdvcmsgdG8gYnVybiBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zLlxuICAgKiBJdCBjYWxscyB0aGUgXCJCdXJuXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0IHdpdGggdGhlIGJ1cm5pbmcgYW1vdW50IGFzIGEgcGFyYW1ldGVyLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgbWludGVyJ3MgbnVtYmVyIG9mIHRva2Vucy5cbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIHRvIGJ1cm4uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBidXJuaW5nIHByb2Nlc3MgaXMgY29tcGxldGVkLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgYnVybihhbW91bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgXCJidXJuXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm4pO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5zdWJtaXRUcmFuc2FjdGlvbihjdHgsIFwiQnVyblwiLCBbYW1vdW50LnRvU3RyaW5nKCldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJucyBhIHNwZWNpZmllZCBhbW91bnQgb2YgRVJDMjAgdG9rZW5zIGZyb20gYSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGJ1cm4gYSBzcGVjaWZpZWQgYW1vdW50IG9mIEVSQzIwIHRva2VucyBmcm9tIGEgZ2l2ZW4gYWNjb3VudC5cbiAgICogSXQgY2FsbHMgdGhlIFwiQnVybkZyb21cIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3Qgd2l0aCB0aGUgYWNjb3VudCdzIGFkZHJlc3MgYW5kIHRoZSBidXJuaW5nIGFtb3VudCBhcyBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZSwgYnV0IGl0IGRlY3JlYXNlcyB0aGUgc3BlY2lmaWVkIGFjY291bnQncyBudW1iZXIgb2YgdG9rZW5zLlxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIFRoZSBhZGRyZXNzIG9mIHRoZSBhY2NvdW50IGZyb20gd2hpY2ggdG8gYnVybiB0aGUgRVJDMjAgdG9rZW5zLlxuICAgKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBFUkMyMCB0b2tlbnMgdG8gYnVybi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1cm5pbmcgcHJvY2VzcyBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gICAqL1xuICBhc3luYyBidXJuRnJvbShhY2NvdW50OiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBcImJ1cm5Gcm9tXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmJ1cm5Gcm9tKTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuc3VibWl0VHJhbnNhY3Rpb24oY3R4LCBcIkJ1cm5Gcm9tXCIsIFtcbiAgICAgIGFjY291bnQsXG4gICAgICBhbW91bnQudG9TdHJpbmcoKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGJhbGFuY2Ugb2YgRVJDMjAgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50J3MgYWNjb3VudC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBiYWxhbmNlIG9mIEVSQzIwIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQuXG4gICAqIEl0IGNhbGxzIHRoZSBcIkNsaWVudEFjY291bnRCYWxhbmNlXCIgdHJhbnNhY3Rpb24gb24gdGhlIHNtYXJ0IGNvbnRyYWN0LCB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGFueSBwYXJhbWV0ZXJzLlxuICAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyB0aGVuIGRlY29kZWQgYW5kIGNvbnZlcnRlZCB0byBhIG51bWJlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmFsYW5jZSBvZiBFUkMyMCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQncyBhY2NvdW50LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzIG9yIHRoZSBkZWNvZGluZyBwcm9jZXNzIGZhaWxzLlxuICAgKi9cbiAgYXN5bmMgY2xpZW50QWNjb3VudEJhbGFuY2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudEJhbGFuY2VcIixcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGNvbnRleHRBcmdzLmFyZ3MsIHRoaXMuY2xpZW50QWNjb3VudEJhbGFuY2UpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRBY2NvdW50QmFsYW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJDbGllbnRBY2NvdW50QmFsYW5jZVwiXG4gICAgKTtcblxuICAgIHJldHVybiBOdW1iZXIodGhpcy5kZWNvZGUoc2VyaWFsaXplZEFjY291bnRCYWxhbmNlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjbGllbnQncyBhY2NvdW50IElEIGZyb20gdGhlIGJsb2NrY2hhaW4gbmV0d29yay5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgYmxvY2tjaGFpbiBuZXR3b3JrIHRvIGZldGNoIHRoZSBjbGllbnQncyBhY2NvdW50IElELlxuICAgKiBJdCBjYWxscyB0aGUgXCJDbGllbnRBY2NvdW50SURcIiB0cmFuc2FjdGlvbiBvbiB0aGUgc21hcnQgY29udHJhY3QsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMuXG4gICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIHRoZW4gZGVjb2RlZCBhbmQgcmV0dXJuZWQgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNsaWVudCdzIGFjY291bnQgSUQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMgb3IgdGhlIGRlY29kaW5nIHByb2Nlc3MgZmFpbHMuXG4gICAqL1xuICBhc3luYyBjbGllbnRBY2NvdW50SUQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIFwiYWNjb3VudElkXCIsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgW10sXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLmxvZ0N0eChjb250ZXh0QXJncy5hcmdzLCB0aGlzLmNsaWVudEFjY291bnRJRCk7XG4gICAgY29uc3QgY2xpZW50QWNjb3VudElEID0gYXdhaXQgdGhpcy5hZGFwdGVyLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBcIkNsaWVudEFjY291bnRJRFwiXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmRlY29kZShjbGllbnRBY2NvdW50SUQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIFByaW1hcnlLZXlUeXBlIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBjb21wb3NlQXR0cmlidXRlVmFsdWUgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJZHM8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtb2RlbHM6IE0gfCBNW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdLFxuICBpZHM6IFByaW1hcnlLZXlUeXBlIHwgUHJpbWFyeUtleVR5cGVbXVxuKSB7XG4gIGxldCBwazoga2V5b2YgTTtcbiAgbGV0IGNvbXBvc2VkOiBhbnk7XG4gIGxldCBwa1Byb3BzOiBTZXF1ZW5jZU9wdGlvbnM7XG5cbiAgZnVuY3Rpb24gZXh0cmFjdElkKG06IE0gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpZHM6IFByaW1hcnlLZXlUeXBlKSB7XG4gICAgcGsgPSBwayB8fCBNb2RlbC5wayhjbGF6eik7XG4gICAgcGtQcm9wcyA9IHBrUHJvcHMgfHwgTW9kZWwuc2VxdWVuY2VGb3IoY2xhenopO1xuICAgIGNvbXBvc2VkID0gY29tcG9zZWQgfHwgTW9kZWwuY29tcG9zZWQoY2xhenosIHBrKTtcblxuICAgIGlmIChjb21wb3NlZCkge1xuICAgICAgcmV0dXJuIGNvbXBvc2VBdHRyaWJ1dGVWYWx1ZShtIGFzIGFueSwgY29tcG9zZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gKG0gYXMgYW55KVtwa10gfHwgaWRzO1xuICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgY291bGQgbm90IHJlYnVpbGQgaWQgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG1vZGVscykpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRzKSB8fCBpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiaW5jb25zaXN0ZW50IHBhcmFtZXRlcnMuIGJvdGggbXVzdCBiZSBhcnJheXMgb2YgZXF1YWwgbGVuZ3RoXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIG1vZGVscy5tYXAoKG0sIGkpID0+IGV4dHJhY3RJZChtLCBpZHNbaV0pKTtcbiAgfVxuICByZXR1cm4gZXh0cmFjdElkKG1vZGVscywgaWRzIGFzIFByaW1hcnlLZXlUeXBlKTtcbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbCwgY29sdW1uLCBwayB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZGVzY3JpcHRpb24gfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSWRlbnRpdHkgY3JlZGVudGlhbCBtb2RlbCBzdG9yaW5nIGNyeXB0b2dyYXBoaWMgbWF0ZXJpYWxzXG4gKiBAc3VtbWFyeSBIb2xkcyBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQgcHJpdmF0ZSBrZXkgaW5mb3JtYXRpb24gZm9yIGEgRmFicmljIGlkZW50aXR5LCBtYW5hZ2VkIGFzIGEgc2VwYXJhdGUgZW50aXR5IGxpbmtlZCBmcm9tIElkZW50aXR5XG4gKiBAcGFyYW0ge01vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+fSBbYXJnXSAtIE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIG9iamVjdCB1c2VkIHRvIHBvcHVsYXRlIG1vZGVsIGZpZWxkc1xuICogQGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgY3JlZGVudGlhbHMgZW50cnlcbiAqIGNvbnN0IGNyZWRzID0gbmV3IElkZW50aXR5Q3JlZGVudGlhbHMoeyBpZDogXCJjcmVkczFcIiwgY2VydGlmaWNhdGU6IFwiLi4uXCIsIHJvb3RDZXJ0aWZpY2F0ZTogXCIuLi5cIiwgcHJpdmF0ZUtleTogXCIuLi5cIiB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5Q3JlZGVudGlhbHNcbiAqICAgQXBwLT4+TW9kZWw6IG5ldyBJZGVudGl0eUNyZWRlbnRpYWxzKHsgaWQsIGNlcnRpZmljYXRlLCByb290Q2VydGlmaWNhdGUsIHByaXZhdGVLZXkgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICogQHNlZSBtb2RlbFxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5Q3JlZGVudGlhbHMgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcbiAgICogQHN1bW1hcnkgUHJpbWFyeSBrZXkgZm9yIHJlZmVyZW5jaW5nIHRoaXMgY3JlZGVudGlhbHMgZW50cnlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjcmVkZW50aWFscyByZWNvcmRcIilcbiAgQGNvbHVtbigpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGUgZm9yIHRoZSBpZGVudGl0eVxuICAgKiBAc3VtbWFyeSBMZWFmIGNlcnRpZmljYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaWRlbnRpdHlcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIFguNTA5IGNlcnRpZmljYXRlIGZvciB0aGUgaWRlbnRpdHlcIilcbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIGNlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcm9vdCBvciBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUm9vdCBvZiB0cnVzdCB1c2VkIHRvIHZhbGlkYXRlIHRoZSBsZWFmIGNlcnRpZmljYXRlXG4gICAqL1xuICBAZGVzY3JpcHRpb24oXCJQRU0tZW5jb2RlZCByb290IG9yIGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZVwiKVxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgcm9vdENlcnRpZmljYXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXkgbWF0ZXJpYWxcbiAgICogQHN1bW1hcnkgUHJpdmF0ZSBrZXkgY29ycmVzcG9uZGluZyB0byB0aGUgaWRlbnRpdHkgY2VydGlmaWNhdGVcbiAgICovXG4gIEBkZXNjcmlwdGlvbihcIlBFTS1lbmNvZGVkIHByaXZhdGUga2V5XCIpXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBwcml2YXRlS2V5ITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPElkZW50aXR5Q3JlZGVudGlhbHM+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5cyB1c2VkIHRvIG1hcmsgRmFicmljLXNwZWNpZmljIG1vZGVsIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBzcGVjaWFsIGtleXMgdXNlZCBieSB0aGUgc2VyaWFsaXphdGlvbiBsYXllciB0byBwZXJzaXN0IEZhYnJpYy1yZWxhdGVkIGZsYWdzIG9uIG1vZGVsc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBGYWJyaWNNb2RlbEtleXMge1xuICAvKiogUHJpdmF0ZSBkYXRhIG1hcmtlciB1c2VkIHRvIHRhZyBwcm9wZXJ0aWVzIG9yIG1vZGVscyBmb3IgRmFicmljIHByaXZhdGUgY29sbGVjdGlvbnMgKi9cbiAgUFJJVkFURSA9IFwicHJpdmF0ZVwiLFxuICBTSEFSRUQgPSBcInNoYXJlZFwiLFxuICAvKiogTmFtZXNwYWNlIHByZWZpeCB1c2VkIGZvciBGYWJyaWMtc3BlY2lmaWMgbWV0YWRhdGEga2V5cyAqL1xuICBGQUJSSUMgPSBcImZhYnJpY1wiLFxuICBPV05FRF9CWSA9IFwib3duZWQtYnlcIixcbiAgVFJBTlNBQ1RJT05fSUQgPSBcInRyYW5zYWN0aW9uLWlkXCIsXG4gIE1JUlJPUiA9IFwibWlycm9yXCIsXG4gIENPTlRSQUNUID0gYCR7RmFicmljTW9kZWxLZXlzLkZBQlJJQ30uY29udHJhY3RgLFxuICBDSEFJTkNPREUgPSBgJHtGYWJyaWNNb2RlbEtleXMuRkFCUklDfS5jaGFpbmNvZGVgLFxuICBDSEFOTkVMID0gYCR7RmFicmljTW9kZWxLZXlzLkZBQlJJQ30uY2hhbm5lbGAsXG4gIE9WRVJSSURFUyA9IGBfX292ZXJyaWRlc2AsXG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0ZWQgaWRlbnRpdHkgdHlwZXMgZm9yIEZhYnJpYyBjcmVkZW50aWFsc1xuICogQHN1bW1hcnkgRW51bWVyYXRpb24gb2YgaWRlbnRpdHkgZm9ybWF0cyByZWNvZ25pemVkIGJ5IHRoaXMgbGlicmFyeVxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVR5cGUge1xuICAvKiogU3RhbmRhcmQgWC41MDkgaWRlbnRpdHkgZm9ybWF0IHVzZWQgYnkgSHlwZXJsZWRnZXIgRmFicmljICovXG4gIFg1MDkgPSBcIlguNTA5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgRmFicmljIGFkYXB0ZXIgZmxhdm91clxuICogQHN1bW1hcnkgVXNlZCB0byB0YWcgYWRhcHRlcnMvcmVwb3NpdG9yaWVzIHRoYXQgb3BlcmF0ZSBhZ2FpbnN0IEh5cGVybGVkZ2VyIEZhYnJpY1xuICogQGNvbnN0IEZhYnJpY0ZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEZhYnJpY0ZsYXZvdXIgPSBcImhsZi1mYWJyaWNcIjtcbiIsImltcG9ydCB7XG4gIEJhc2VNb2RlbCxcbiAgQ2FzY2FkZSxcbiAgY29sdW1uLFxuICBpbmRleCxcbiAgb25lVG9PbmUsXG4gIHBrLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCB0eXBlIE1vZGVsQXJnLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IElkZW50aXR5Q3JlZGVudGlhbHMgfSBmcm9tIFwiLi9JZGVudGl0eUNyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBJZGVudGl0eVR5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGl0eSBtb2RlbCByZXByZXNlbnRpbmcgYSBGYWJyaWMgd2FsbGV0IGVudHJ5XG4gKiBAc3VtbWFyeSBFbmNhcHN1bGF0ZXMgYW4gaWRlbnRpdHkgc3RvcmVkIGluIGEgRmFicmljIHdhbGxldCwgaW5jbHVkaW5nIGl0cyBNU1AgaWRlbnRpZmllciwgY3JlZGVudGlhbCBsaW5rYWdlLCBhbmQgdHlwZSBpbmZvcm1hdGlvbi4gQnVpbHQgb24gQmFzZU1vZGVsIGZvciBpbnRlZ3JhdGlvbiB3aXRoIERlY2FmIHZhbGlkYXRpb24gYW5kIHBlcnNpc3RlbmNlLlxuICogQHBhcmFtIHtNb2RlbEFyZzxJZGVudGl0eT59IFthcmddIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgbW9kZWwgZmllbGRzXG4gKiBAY2xhc3MgSWRlbnRpdHlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgaWRlbnRpdHkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAqIGNvbnN0IGlkID0gbmV3IElkZW50aXR5KHsgaWQ6IFwidXNlcjFcIiwgbXNwSWQ6IFwiT3JnMU1TUFwiLCB0eXBlOiBJZGVudGl0eVR5cGUuWDUwOSB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIElkZW50aXR5XG4gKiAgIEFwcC0+Pk1vZGVsOiBuZXcgSWRlbnRpdHkoeyBpZCwgbXNwSWQsIHR5cGUgfSlcbiAqICAgTW9kZWwtLT4+QXBwOiBpbnN0YW5jZVxuICovXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaWRlbnRpdHkgaW4gdGhlIHdhbGxldFxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGlkZW50aXR5IHJlY29yZFxuICAgKi9cbiAgQGRlc2NyaXB0aW9uKFwiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlkZW50aXR5XCIpXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGluayB0byB0aGUgaWRlbnRpdHkgY3JlZGVudGlhbHMgc3RvcmVkIHNlcGFyYXRlbHlcbiAgICogQHN1bW1hcnkgT25lLXRvLW9uZSByZWxhdGlvbnNoaXAgdG8gdGhlIGNyZWRlbnRpYWxzIGVudGl0eTsgY2FzY2FkZXMgb24gdXBkYXRlIGFuZCBkZWxldGVcbiAgICovXG4gIEBvbmVUb09uZShJZGVudGl0eUNyZWRlbnRpYWxzLCB7XG4gICAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gICAgZGVsZXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIH0pXG4gIGNyZWRlbnRpYWxzITogSWRlbnRpdHlDcmVkZW50aWFscztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lbWJlcnNoaXAgU2VydmljZSBQcm92aWRlciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFRoZSBNU1AgSUQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JnYW5pemF0aW9uIHRoYXQgaXNzdWVkIHRoaXMgaWRlbnRpdHlcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBtc3BJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFR5cGUgb2YgaWRlbnRpdHlcbiAgICogQHN1bW1hcnkgSW5kaWNhdGVzIHRoZSBpZGVudGl0eSBlbmNvZGluZy9mb3JtYXQ7IGRlZmF1bHRzIHRvIFguNTA5XG4gICAqL1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgdHlwZTogSWRlbnRpdHlUeXBlID0gSWRlbnRpdHlUeXBlLlg1MDk7XG5cbiAgY29uc3RydWN0b3IoYXJnOiBNb2RlbEFyZzxJZGVudGl0eT4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBDcnlwdG9TZXR0aW5nLCBJQ3J5cHRvU3VpdGUsIFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgSFNNT3B0aW9ucyB9IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUltcG9ydCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IGNyeXB0bywgeyBYNTA5Q2VydGlmaWNhdGUgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBYNTA5Q2VydGlmaWNhdGUgYXMgWDUwOUNlcnQgfSBmcm9tIFwiQHBlY3VsaWFyL3g1MDlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSB1dGlsaXRpZXMgZm9yIGludGVyYWN0aW5nIHdpdGggZmlsZXMsIGNyeXB0byBpZGVudGl0aWVzLCBhbmQgRmFicmljIFNESyBoZWxwZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBzdGF0aWMgaGVscGVyIG1ldGhvZHMgdG8gcmVhZCBjcmVkZW50aWFscyBhbmQga2V5cyBmcm9tIGRpc2sgb3IgcmF3IGNvbnRlbnQsIGNvbnN0cnVjdCBGYWJyaWMgZ2F0ZXdheSBJZGVudGl0aWVzIGFuZCBTaWduZXJzLCBhbmQgcGVyZm9ybSBjb21tb24gZmlsZXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIEZhYnJpYyBjbGllbnQgdG9vbGluZy5cbiAqIEBjbGFzcyBDb3JlVXRpbHNcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWFkIGFuIGlkZW50aXR5IGFuZCBzaWduZXIgZnJvbSBkaXJlY3Rvcmllc1xuICogY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0SWRlbnRpdHkoJ09yZzFNU1AnLCAnL21zcC9zaWduY2VydHMnKTtcbiAqIGNvbnN0IHNpZ25lciA9IGF3YWl0IENvcmVVdGlscy5nZXRTaWduZXIoJy9tc3Ava2V5c3RvcmUnKTtcbiAqIC8vIEJ1aWxkIGEgQ0EgdXNlclxuICogY29uc3QgdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoJ2FwcFVzZXInLCBwZW1LZXksIHBlbUNlcnQsICdPcmcxTVNQJyk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyBsb2dnZXI6IExvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENvcmVVdGlscy5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyBjcnlwdG9TdWl0ZTogSUNyeXB0b1N1aXRlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZSBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIHJhdyBjb250ZW50XG4gICAqIEBzdW1tYXJ5IElmIHRoZSBpbnB1dCBpcyBhIFVpbnQ4QXJyYXkgb3IgUEVNIGNvbnRlbnQsIHJldHVybnMgaXQgYXMtaXM7IG90aGVyd2lzZSB1c2VzIGEgcHJvdmlkZWQgYXN5bmMgZmlsZVJlYWRlciB0byBsb2FkIHRoZSBjb250ZW50IGZyb20gZGlzay5cbiAgICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIEVpdGhlciBhIHJhdyBjb250ZW50IGJ1ZmZlci9zdHJpbmcgb3IgYSBmaWxlc3lzdGVtIHBhdGhcbiAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiBQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IGZpbGVSZWFkZXIgLSBBc3luYyBmdW5jdGlvbiB0byByZWFkIGZpbGUgY29udGVudCB3aGVuIGEgcGF0aCBpcyBwcm92aWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcj59IFRoZSBjb250ZW50IHRvIGJlIHVzZWQgZG93bnN0cmVhbVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY29udGVudE9mTG9hZEZpbGUoXG4gICAgY29udGVudE9yUGF0aDogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4gICkge1xuICAgIGlmIChjb250ZW50T3JQYXRoIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIGNvbnRlbnRPclBhdGg7XG4gICAgaWYgKFxuICAgICAgY29udGVudE9yUGF0aC5tYXRjaChcbiAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZCBmaWxlIGNvbnRlbnQgZnJvbSBhIHBhdGggb3IgcmV0dXJuIHByb3ZpZGVkIEJ1ZmZlclxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIHRoYXQgbG9hZHMgYSBmaWxlIHVzaW5nIGZzLnByb21pc2VzIHdoZW4gYSBwYXRoIHN0cmluZyBpcyBwcm92aWRlZDsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGdpdmVuIEJ1ZmZlciBkaXJlY3RseS5cbiAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBjb250ZW50T3JQYXRoIC0gUGF0aCB0byBhIGZpbGUgb24gZGlzayBvciBhbiBhbHJlYWR5LWxvYWRlZCBCdWZmZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmd8VWludDhBcnJheXxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyL3N0cmluZyBkZXBlbmRpbmcgb24gcmVhZGVyXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVhZEZpbGUoY29udGVudE9yUGF0aDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50T3JQYXRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudE9yUGF0aDtcblxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKHBhdGgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgRmFicmljIENBIFVzZXIgb2JqZWN0IHdpdGggZW5yb2xsbWVudFxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZmFicmljLWNvbW1vbiBVc2VyLCBzZXRzIGEgY3J5cHRvIHN1aXRlLCBpbXBvcnRzIHRoZSBwcm92aWRlZCBwcml2YXRlIGtleSwgYW5kIHNldHMgZW5yb2xsbWVudCB3aXRoIGNlcnRpZmljYXRlIGFuZCBNU1AgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZSAtIFRoZSB1c2VyIG5hbWUgZm9yIHRoZSBDQSB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IC0gUEVNLWVuY29kZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gUEVNLWVuY29kZWQgWC41MDkgY2VydGlmaWNhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VyPn0gVGhlIGVucm9sbGVkIEZhYnJpYyBVc2VyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0Q0FVc2VyKFxuICAgIHVzZXJOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBoc20/OiBIU01PcHRpb25zIH1cbiAgKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBzdHJpbmdGb3JtYXQoXG4gICAgICAgIFwiQ3JlYXRpbmcgQ0EgezB9IHVzZXIgezF9IHdpdGggY2VydGlmaWNhdGUgezJ9XCIsXG4gICAgICAgIG1zcElkLFxuICAgICAgICB1c2VyTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGVcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IHtcbiAgICAgICAgICBzb2Z0d2FyZTogZmFsc2UsXG4gICAgICAgICAgbGliOiBvcHRpb25zLmhzbS5saWJyYXJ5LFxuICAgICAgICAgIHNsb3Q6IG9wdGlvbnMuaHNtLnNsb3QsXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbnMuaHNtLnRva2VuTGFiZWwsXG4gICAgICAgICAgcGluOiBTdHJpbmcob3B0aW9ucy5oc20ucGluKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3J5cHRvU3VpdGUgPSB0aGlzLmdldENyeXB0b1N1aXRlKGNvbmZpZyk7XG5cbiAgICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgICBjb25zdCBlbnJvbGxtZW50S2V5ID0gb3B0aW9ucz8uaHNtXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0SFNNRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgY2VydGlmaWNhdGUsIG9wdGlvbnMuaHNtKVxuICAgICAgOiB0aGlzLmdldFNvZnR3YXJlRW5yb2xsbWVudEtleShjcnlwdG9TdWl0ZSwgcHJpdmF0ZUtleSk7XG4gICAgYXdhaXQgdXNlci5zZXRFbnJvbGxtZW50KGVucm9sbG1lbnRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q3J5cHRvU3VpdGUob3B0aW9ucz86IENyeXB0b1NldHRpbmcpOiBJQ3J5cHRvU3VpdGUge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFVzZXIubmV3Q3J5cHRvU3VpdGUoKTtcbiAgICBpZiAoQ29yZVV0aWxzLmNyeXB0b1N1aXRlKSByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuXG4gICAgQ29yZVV0aWxzLmNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZShvcHRpb25zKTtcbiAgICByZXR1cm4gQ29yZVV0aWxzLmNyeXB0b1N1aXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U29mdHdhcmVFbnJvbGxtZW50S2V5KFxuICAgIGNyeXB0b1N1aXRlOiBhbnksXG4gICAgcHJpdmF0ZUtleT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQcml2YXRlIGtleSBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gSFNNIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBsaWVkXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2V0SFNNRW5yb2xsbWVudEtleShcbiAgICBjcnlwdG9TdWl0ZTogYW55LFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgaHNtOiBIU01PcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHNraSA9XG4gICAgICBoc20ua2V5SWRIZXggJiYgaHNtLmtleUlkSGV4LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgID8gQnVmZmVyLmZyb20oaHNtLmtleUlkSGV4LCBcImhleFwiKVxuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2VydGlmaWNhdGVTS0koY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0b1N1aXRlLmdldEtleShza2kpO1xuICAgIGlmICgha2V5IHx8ICh0eXBlb2Yga2V5LmlzUHJpdmF0ZSA9PT0gXCJmdW5jdGlvblwiICYmICFrZXkuaXNQcml2YXRlKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmVzb2x2ZSBwcml2YXRlIGtleSBmcm9tIEhTTVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRDZXJ0aWZpY2F0ZVNLSShjZXJ0aWZpY2F0ZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCB4NTA5ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3QgandrID0geDUwOS5wdWJsaWNLZXkuZXhwb3J0KHsgZm9ybWF0OiBcImp3a1wiIH0pO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDA0XSk7XG4gICAgY29uc3QgeCA9IEJ1ZmZlci5mcm9tKGp3ay54IHx8IFwiXCIsIFwiYmFzZTY0dXJsXCIpO1xuICAgIGNvbnN0IHkgPSBCdWZmZXIuZnJvbShqd2sueSB8fCBcIlwiLCBcImJhc2U2NHVybFwiKTtcbiAgICByZXR1cm4gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtwcmVmaXgsIHgsIHldKSlcbiAgICAgIC5kaWdlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgYSBGYWJyaWMgR2F0ZXdheSBJZGVudGl0eSBmcm9tIGFuIE1TUCBJRCBhbmQgY2VydGlmaWNhdGVcbiAgICogQHN1bW1hcnkgUmVhZHMgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZGlyZWN0b3J5IHBhdGggb3IgYWNjZXB0cyByYXcgY29udGVudCBhbmQgcmV0dXJucyBhbiBJZGVudGl0eSBvYmplY3Qgc3VpdGFibGUgZm9yIHRoZSBGYWJyaWMgR2F0ZXdheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zcElkIC0gTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUgZmlsZSwgb3IgUEVNIGNvbnRlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBpZGVudGl0eSBjb250YWluaW5nIG1zcElkIGFuZCBjZXJ0aWZpY2F0ZSBjcmVkZW50aWFsc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldElkZW50aXR5KFxuICAgIG1zcElkOiBzdHJpbmcsXG4gICAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgaWRlbnRpdHlGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGNlcnRQYXRoID0gYXdhaXQgdGhpcy5nZXRGaXJzdERpckZpbGVOYW1lKHBhdGgpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IHRoaXMuY29udGVudE9mTG9hZEZpbGUoXG4gICAgICBjZXJ0RGlyZWN0b3J5UGF0aCxcbiAgICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG5cbiAgICByZXR1cm4geyBtc3BJZCwgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaXJzdERpckZpbGVOYW1lKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGpvaW4oZGlyUGF0aCwgZmlsZXNbMF0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIChhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShqb2luKGRpclBhdGgsIGZpbGVzWzBdKSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gKGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRTaWduZXIoa2V5RGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaWduZXI+IHtcbiAgICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICAgIGNvbnN0IGtleVBhdGggPSBhd2FpdCB0aGlzLmdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoa2V5UGF0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgdGhpcy5jb250ZW50T2ZMb2FkRmlsZShcbiAgICAgIGtleURpcmVjdG9yeVBhdGgsXG4gICAgICBzaWduZXJGaWxlUmVhZGVyXG4gICAgKSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLmV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGNvbnN0IGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICAgIC8vIC0tXG5cbiAgICByZXR1cm4gc2lnbmVycy5uZXdQcml2YXRlS2V5U2lnbmVyKGsgYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyKSB7XG4gICAgY29uc3QgbGliTmFtZSA9IFwiY3J5cHRvXCI7XG4gICAgbGV0IHN1YnRsZTogYW55O1xuICAgIGlmIChcbiAgICAgIChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93ICYmXG4gICAgICAoKGdsb2JhbFRoaXMgYXMgYW55KS53aW5kb3cgYXMgeyBDcnlwdG86IGFueSB9KS5DcnlwdG9cbiAgICApIHtcbiAgICAgIHN1YnRsZSA9ICgoZ2xvYmFsVGhpcyBhcyBhbnkpLkNyeXB0byBhcyBhbnkpLnN1YnRsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gICAgICBzdWJ0bGUgPSBsaWIuc3VidGxlIHx8IGxpYi53ZWJjcnlwdG8uc3VidGxlO1xuICAgIH1cblxuICAgIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gICAgZnVuY3Rpb24gc3RyMmFiKHN0cjogc3RyaW5nKSB7XG4gICAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBzdHJMZW4gPSBzdHIubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHIgPSBwZW1cbiAgICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpXG4gICAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoXCItLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXCIsIFwiXCIpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGNlcnRpZmljYXRlIFNlcmlhbCBOdW1iZXIgYW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcilcbiAqIGluIHRoZSBmb3JtYXQgRmFicmljIENBIGV4cGVjdHMgKHBsYWluIGhleCwgbm8gY29sb25zKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGNlcnQ6IHN0cmluZyk6IHtcbiAgYWtpOiBzdHJpbmc7XG4gIHNlcmlhbDogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHg1MDlDZXJ0aWZpY2F0ZSA9IG5ldyBYNTA5Q2VydChjZXJ0KTtcblxuICAvLyBGaW5kIHRoZSBBS0kgKEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcikgZXh0ZW5zaW9uIGJ5IGl0cyBPSUQ6IDIuNS4yOS4zNVxuICBjb25zdCBha2lFeHQgPSB4NTA5Q2VydGlmaWNhdGUuZXh0ZW5zaW9ucz8uZmluZChcbiAgICAoZSkgPT4gZS50eXBlID09PSBcIjIuNS4yOS4zNVwiXG4gICk7XG4gIGlmICghYWtpRXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBdXRob3JpdHkgS2V5IElkZW50aWZpZXIgKEFLSSkgZXh0ZW5zaW9uIG5vdCBmb3VuZCBpbiBjZXJ0aWZpY2F0ZS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBha2lFeHQudmFsdWUgaXMgdGhlIGV4dGVuc2lvbiBjb250ZW50IGluIERFUiBieXRlcy4gQ29udmVydCBpdCB0byBhIGhleCBzdHJpbmcuXG4gIGxldCBha2kgPSBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShha2lFeHQudmFsdWUpKVxuICAgIC50b1N0cmluZyhcImhleFwiKVxuICAgIC50b1VwcGVyQ2FzZSgpO1xuXG4gIC8qKlxuICAgKiBDb21tb24gY2FzZTpcbiAgICogVGhlIERFUi1lbmNvZGVkIEFLSSBleHRlbnNpb24gb2Z0ZW4gc3RhcnRzIHdpdGg6XG4gICAqICAgMzAgMTYgODAgMTQgPDIwLWJ5dGUga2V5SWRlbnRpZmllcj5cbiAgICogSW4gaGV4LCB0aGF0J3MgXCIzMDE2ODAxNFwiICsgNDAgaGV4IGNoYXJzICgyMCBieXRlcykuXG4gICAqXG4gICAqIEZhYnJpYyBDQSBleHBlY3RzIE9OTFkgdGhlIDIwLWJ5dGUga2V5SWRlbnRpZmllciAoNDAgaGV4IGNoYXJzKSxcbiAgICogc28gd2Ugc3RyaXAgdGhlIFwiMzAxNjgwMTRcIiBwcmVmaXggd2hlbiBwcmVzZW50LlxuICAgKi9cbiAgaWYgKGFraS5zdGFydHNXaXRoKFwiMzAxNjgwMTRcIikgJiYgYWtpLmxlbmd0aCA+PSA4ICsgNDApXG4gICAgYWtpID0gYWtpLnNsaWNlKDgsIDggKyA0MCk7XG5cbiAgcmV0dXJuIHsgYWtpLCBzZXJpYWw6IHg1MDlDZXJ0aWZpY2F0ZS5zZXJpYWxOdW1iZXIgfTtcbn1cbiIsImltcG9ydCAqIGFzIHg1MDkgZnJvbSBcIkBwZWN1bGlhci94NTA5XCI7XG5pbXBvcnQgeyBDcnlwdG8sIENyeXB0b0tleSB9IGZyb20gXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCI7XG5pbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIE1pbmlMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3QgY3J5cHRvID0gbmV3IENyeXB0bygpO1xueDUwOS5jcnlwdG9Qcm92aWRlci5zZXQoY3J5cHRvKTtcblxuZXhwb3J0IGVudW0gQkFTRV9BTFBIQUJFVCB7XG4gIEJBU0UyID0gXCIwMVwiLFxuICBCQVNFOCA9IFwiMDEyMzQ1NjdcIixcbiAgQkFTRTExID0gXCIwMTIzNDU2Nzg5YVwiLFxuICBCQVNFMTYgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIixcbiAgQkFTRTMyID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWlwiLFxuICBCQVNFMzJfWiA9IFwieWJuZHJmZzhlamttY3BxeG90MXV3aXN6YTM0NWg3NjlcIixcbiAgQkFTRTM2ID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIixcbiAgQkFTRTU4ID0gXCIxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6XCIsXG4gIEJBU0U2MiA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcIixcbiAgQkFTRTY0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsXG4gIEJBU0U2NyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXy4hflwiLFxufVxuXG5leHBvcnQgdHlwZSBrZXlPYmplY3QgPSB7XG4gIGl2OiBBcnJheUJ1ZmZlcjtcbiAga2V5OiBDcnlwdG9LZXk7XG59O1xuXG5leHBvcnQgZW51bSBDUllQVE8ge1xuICBIQVNIID0gXCJTSEEtMjU2XCIsXG4gIElURVJBVElPTlMgPSAxMDAwLFxuICBLRVlMRU5HVEggPSA0OCxcbiAgREVSSVZFRF9JVl9MRU5HVEggPSAxNixcbiAgREVSSVZFRF9LRVlfTEVOR1RIID0gMzIsIC8vIEJlY2F1c2UgU0hBLTI1NiB1c2VkIGhhcyBhIG5hdGl2ZSBzaXplIG9mIDMyIGJ5dGVzXG4gIEFMR09SWVRITSA9IFwiQUVTLUdDTVwiLFxuICBLRVlfQUxHT1JZVEhNID0gXCJQQktERjJcIixcbn1cblxuZXhwb3J0IGNsYXNzIEJhc2VFbmNvZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlTWFwOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVhZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaUZhY3RvcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWxwaGFiZXQ6IEJBU0VfQUxQSEFCRVQpIHtcbiAgICBpZiAodGhpcy5hbHBoYWJldC5sZW5ndGggPj0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoXCJBbHBoYWJldCB0b28gbG9uZ1wiKTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5iYXNlTWFwLmxlbmd0aDsgaisrKSB0aGlzLmJhc2VNYXBbal0gPSAyNTU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gYWxwaGFiZXQuY2hhckF0KGkpO1xuICAgICAgY29uc3QgeGMgPSB4LmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAodGhpcy5iYXNlTWFwW3hjXSAhPT0gMjU1KSB0aHJvdyBuZXcgRXJyb3IoeCArIFwiIGlzIGFtYmlndW91c1wiKTtcblxuICAgICAgdGhpcy5iYXNlTWFwW3hjXSA9IGk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXNlID0gdGhpcy5hbHBoYWJldC5sZW5ndGg7XG4gICAgdGhpcy5sZWFkZXIgPSB0aGlzLmFscGhhYmV0LmNoYXJBdCgwKTtcbiAgICB0aGlzLmZhY3RvciA9IE1hdGgubG9nKHRoaXMuYmFzZSkgLyBNYXRoLmxvZygyNTYpOyAvLyBsb2coQkFTRSkgLyBsb2coMjU2KSwgcm91bmRlZCB1cFxuICAgIHRoaXMuaUZhY3RvciA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyh0aGlzLmJhc2UpOyAvLyBsb2coMjU2KSAvIGxvZyhCQVNFKSwgcm91bmRlZCB1cFxuICB9XG5cbiAgZW5jb2RlKHNvdXJjZTogVWludDhBcnJheSB8IERhdGFWaWV3IHwgYW55W10gfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgc291cmNlID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBuZXcgVWludDhBcnJheShcbiAgICAgICAgc291cmNlLmJ1ZmZlcixcbiAgICAgICAgc291cmNlLmJ5dGVPZmZzZXQsXG4gICAgICAgIHNvdXJjZS5ieXRlTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICBzb3VyY2UgPSBVaW50OEFycmF5LmZyb20oc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgICAvLyBTa2lwICYgY291bnQgbGVhZGluZyB6ZXJvZXMuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IHBiZWdpbiA9IDA7XG4gICAgY29uc3QgcGVuZCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCAmJiBzb3VyY2VbcGJlZ2luXSA9PT0gMCkge1xuICAgICAgcGJlZ2luKys7XG4gICAgICB6ZXJvZXMrKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTU4IHJlcHJlc2VudGF0aW9uLlxuICAgIGNvbnN0IHNpemUgPSAoKHBlbmQgLSBwYmVnaW4pICogdGhpcy5pRmFjdG9yICsgMSkgPj4+IDA7XG4gICAgY29uc3QgYjU4ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgYnl0ZXMuXG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCkge1xuICAgICAgbGV0IGNhcnJ5ID0gc291cmNlW3BiZWdpbl07XG4gICAgICAvLyBBcHBseSBcImI1OCA9IGI1OCAqIDI1NiArIGNoXCIuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQxID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDEgIT09IC0xO1xuICAgICAgICBpdDEtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKDI1NiAqIGI1OFtpdDFdKSA+Pj4gMDtcbiAgICAgICAgYjU4W2l0MV0gPSBjYXJyeSAlIHRoaXMuYmFzZSA+Pj4gMDtcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyB0aGlzLmJhc2UpID4+PiAwO1xuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJOb24temVybyBjYXJyeVwiKTtcblxuICAgICAgbGVuZ3RoID0gaTtcbiAgICAgIHBiZWdpbisrO1xuICAgIH1cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzIGluIGJhc2U1OCByZXN1bHQuXG4gICAgbGV0IGl0MiA9IHNpemUgLSBsZW5ndGg7XG4gICAgd2hpbGUgKGl0MiAhPT0gc2l6ZSAmJiBiNThbaXQyXSA9PT0gMCkgaXQyKys7XG5cbiAgICAvLyBUcmFuc2xhdGUgdGhlIHJlc3VsdCBpbnRvIGEgc3RyaW5nLlxuICAgIGxldCBzdHIgPSB0aGlzLmxlYWRlci5yZXBlYXQoemVyb2VzKTtcbiAgICBmb3IgKDsgaXQyIDwgc2l6ZTsgKytpdDIpIHtcbiAgICAgIHN0ciArPSB0aGlzLmFscGhhYmV0LmNoYXJBdChiNThbaXQyXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZVVuc2FmZShzb3VyY2U6IHN0cmluZyk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICBsZXQgcHN6ID0gMDtcbiAgICAvLyBTa2lwIGFuZCBjb3VudCBsZWFkaW5nICcxJ3MuXG4gICAgbGV0IHplcm9lcyA9IDA7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKHNvdXJjZVtwc3pdID09PSB0aGlzLmxlYWRlcikge1xuICAgICAgemVyb2VzKys7XG4gICAgICBwc3orKztcbiAgICB9XG4gICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTI1NiByZXByZXNlbnRhdGlvbi5cbiAgICBjb25zdCBzaXplID0gKChzb3VyY2UubGVuZ3RoIC0gcHN6KSAqIHRoaXMuZmFjdG9yICsgMSkgPj4+IDA7IC8vIGxvZyg1OCkgLyBsb2coMjU2KSwgcm91bmRlZCB1cC5cbiAgICBjb25zdCBiMjU2ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgLy8gUHJvY2VzcyB0aGUgY2hhcmFjdGVycy5cbiAgICB3aGlsZSAoc291cmNlW3Bzel0pIHtcbiAgICAgIC8vIERlY29kZSBjaGFyYWN0ZXJcbiAgICAgIGxldCBjYXJyeSA9IHRoaXMuYmFzZU1hcFtzb3VyY2UuY2hhckNvZGVBdChwc3opXTtcbiAgICAgIC8vIEludmFsaWQgY2hhcmFjdGVyXG4gICAgICBpZiAoY2FycnkgPT09IDI1NSkgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXQzID0gc2l6ZSAtIDE7XG4gICAgICAgIChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiBpdDMgIT09IC0xO1xuICAgICAgICBpdDMtLSwgaSsrXG4gICAgICApIHtcbiAgICAgICAgY2FycnkgKz0gKHRoaXMuYmFzZSAqIGIyNTZbaXQzXSkgPj4+IDA7XG4gICAgICAgIGIyNTZbaXQzXSA9IGNhcnJ5ICUgMjU2ID4+PiAwO1xuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIDI1NikgPj4+IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuXG4gICAgICBsZW5ndGggPSBpO1xuICAgICAgcHN6Kys7XG4gICAgfVxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYjI1Ni5cbiAgICBsZXQgaXQ0ID0gc2l6ZSAtIGxlbmd0aDtcbiAgICB3aGlsZSAoaXQ0ICE9PSBzaXplICYmIGIyNTZbaXQ0XSA9PT0gMCkgaXQ0Kys7XG5cbiAgICBjb25zdCB2Y2ggPSBuZXcgVWludDhBcnJheSh6ZXJvZXMgKyAoc2l6ZSAtIGl0NCkpO1xuICAgIGxldCBqID0gemVyb2VzO1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUpIHZjaFtqKytdID0gYjI1NltpdDQrK107XG5cbiAgICByZXR1cm4gdmNoO1xuICB9XG5cbiAgZGVjb2RlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5kZWNvZGVVbnNhZmUoc291cmNlKTtcbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gYnVmZmVyO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi1iYXNlXCIgKyB0aGlzLmJhc2UgKyBcIiBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyeXB0b1V0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYjU4ZW5jb2RlciA9IG5ldyBCYXNlRW5jb2RlcihCQVNFX0FMUEhBQkVULkJBU0U1OCk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBNaW5pTG9nZ2VyKENyeXB0b1V0aWxzLm5hbWUpO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGU6IHN0cmluZykge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKHN0cmluZ0Zvcm1hdChcIlBhcnNpbmcgY2VydGlmaWNhdGU6IHswfVwiLCBjZXJ0aWZpY2F0ZSkpO1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IHsgc3ViamVjdCwgaXNzdWVyIH0gPSBjZXJ0O1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgc3RyaW5nRm9ybWF0KFxuICAgICAgICBcIkNlcnRpZmljYXRlIHBhcnNlZCB3aXRoIHN1YmplY3QgezB9IGFuZCBpc3N1ZXIgezF9XCIsXG4gICAgICAgIHN1YmplY3QsXG4gICAgICAgIGlzc3VlclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGB4NTA5OjovJHtzdWJqZWN0LnJlcGxhY2VBbGwoXCIsIFwiLCBcIi9cIil9OjovJHtpc3N1ZXIucmVwbGFjZUFsbChcIiwgXCIsIFwiL1wiKX1gO1xuICB9XG5cbiAgc3RhdGljIGVuY29kZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYjU4ZW5jb2Rlci5lbmNvZGUoc3RyKTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5iNThlbmNvZGVyLmRlY29kZShzdHIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkZWNvZGVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XG4gICAgY29uc3QgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xuICAgICAgYnVmVmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZXh0cmFjdEtleShcbiAgICB0eXBlOiBcInByaXZhdGVcIiB8IFwicHVibGljXCIsXG4gICAgcGVtOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgdXNhZ2VzPzogYW55W11cbiAgKSB7XG4gICAgY29uc3Qgc3VidGxlID0gY3J5cHRvLnN1YnRsZTtcblxuICAgIGNvbnN0IHN0ciA9IHBlbVxuICAgICAgLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYC0tLS0tQkVHSU4gKCR7dHlwZS50b1VwcGVyQ2FzZSgpfSBLRVl8Q0VSVElGSUNBVEUpLS0tLS1gKSxcbiAgICAgICAgXCJcIlxuICAgICAgKVxuICAgICAgLnJlcGxhY2VBbGwoXCJcXG5cIiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICBuZXcgUmVnRXhwKGAtLS0tLUVORCAoJHt0eXBlLnRvVXBwZXJDYXNlKCl9IEtFWXxDRVJUSUZJQ0FURSktLS0tLWApLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwiYmluYXJ5XCIpO1xuICAgIGNvbnN0IGJpbmFyeURlciA9IHRoaXMuc3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgXCJwa2NzOFwiLFxuICAgICAgYmluYXJ5RGVyLFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIixcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgICAgdXNhZ2VzID8gdXNhZ2VzIDogW1wic2lnblwiXVxuICAgICk7XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGV4dHJhY3RQcml2YXRlS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwcml2YXRlXCIsIHBlbSwgdXNhZ2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBleHRyYWN0UHVibGljS2V5KHBlbTogQnVmZmVyIHwgc3RyaW5nLCB1c2FnZXM/OiBhbnlbXSkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RLZXkoXCJwdWJsaWNcIiwgcGVtLCB1c2FnZXMpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNpZ24ocHJpdmF0ZUtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZXh0cmFjdFByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgYnVmZiA9IChhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24oXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgaGFzaDogXCJTSEEtMjU2XCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApKSBhcyBBcnJheUJ1ZmZlcjtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdmVyaWZ5KFxuICAgIGNlcnRpZmljYXRlOiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlOiBCdWZmZXIgfCBzdHJpbmcsXG4gICAgZGF0YTogQnVmZmVyIHwgc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNlcnQgPSBuZXcgeDUwOS5YNTA5Q2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNlcnQucHVibGljS2V5LmV4cG9ydCgpO1xuICAgIHNpZ25hdHVyZSA9IChcbiAgICAgIHR5cGVvZiBzaWduYXR1cmUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShzaWduYXR1cmUsIFwiaGV4XCIpIDogc2lnbmF0dXJlXG4gICAgKSBhcyBCdWZmZXI7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIHJldHVybiBjcnlwdG8uc3VidGxlLnZlcmlmeShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJFQ0RTQVwiLFxuICAgICAgICBoYXNoOiBcIlNIQS0yNTZcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBzaWduYXR1cmUgYXMgYW55LFxuICAgICAgZGF0YSBhcyBhbnlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHQoY2VydGlmaWNhdGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3QgY2VydCA9IG5ldyB4NTA5Llg1MDlDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2VydC5wdWJsaWNLZXkuZXhwb3J0KCk7XG4gICAgZGF0YSA9ICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEpIDogZGF0YSkgYXMgQnVmZmVyO1xuICAgIGNvbnN0IGJ1ZmYgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmVuY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgIH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZmYpKVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRTdWJ0bGVDcnlwdG8oKSB7XG4gICAgcmV0dXJuIGlzQnJvd3NlcigpXG4gICAgICA/IChnbG9iYWxUaGlzIGFzIGFueSkud2luZG93LmNyeXB0by5zdWJ0bGVcbiAgICAgIDogY3J5cHRvLnN1YnRsZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWNyeXB0KHByaXZhdGVLZXk6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5leHRyYWN0UHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICBkYXRhID0gKFxuICAgICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLCBcImhleFwiKSA6IGRhdGFcbiAgICApIGFzIEJ1ZmZlcjtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kZWNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkVDRFNBXCIsXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgYSByYW5kb20gbWFzdGVyIGtleVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb24gSWYgZGF0YSBpcyBub3QgcGFzc2VkLCBhIHJhbmRvbSBBcnJheUJ1ZmZlciB3aWxsIGJlIGdlbmVyYXRlZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBkYXRhIGVuY3J5dGlvbiBkYXRhXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRNYXN0ZXJcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRNYXN0ZXIoZGF0YT86IEFycmF5QnVmZmVyKTogUHJvbWlzZTxrZXlPYmplY3Q+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGdlbkdlbmVzaXMgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgZGF0YSA9IHRleHRFbmNvZGVyLmVuY29kZShnZW5HZW5lc2lzKS5idWZmZXI7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkYXRhLFxuICAgICAgQ1JZUFRPLktFWV9BTEdPUllUSE0gYXMgc3RyaW5nLFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJkZXJpdmVCaXRzXCJdXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGltcG9ydGVkS2V5LFxuICAgICAgaXY6IGRhdGEhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBrZXkgZnJvbSBhbm90aGVyIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2FsdFxuICAgKiBAcGFyYW0ge0NyeXB0b0tleX0ga2V5IE9yaWdpbmFsIGtleVxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0RGVyaXZhdGlvbktleVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldERlcml2YXRpb25LZXkoc2FsdDogc3RyaW5nLCBrZXk6IENyeXB0b0tleSkge1xuICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3Qgc2FsdEJ1ZmZlciA9IHRleHRFbmNvZGVyLmVuY29kZShzYWx0KTtcbiAgICBjb25zdCBzYWx0SGFzaGVkID0gYXdhaXQgdGhpcy5nZXRTdWJ0bGVDcnlwdG8oKS5kaWdlc3QoXG4gICAgICBcIlNIQS0yNTZcIixcbiAgICAgIHNhbHRCdWZmZXJcbiAgICApO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG5hbWU6IENSWVBUTy5LRVlfQUxHT1JZVEhNIGFzIHN0cmluZyxcbiAgICAgIGhhc2g6IENSWVBUTy5IQVNILFxuICAgICAgc2FsdDogc2FsdEhhc2hlZCxcbiAgICAgIGl0ZXJhdGlvbnM6IENSWVBUTy5JVEVSQVRJT05TLFxuICAgIH07XG4gICAgY29uc3QgZGVyaXZhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVyaXZlQml0cyhcbiAgICAgIHBhcmFtcyxcbiAgICAgIGtleSxcbiAgICAgIENSWVBUTy5LRVlMRU5HVEggKiA4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRLZXkoZGVyaXZhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBnZXQgdGhlIGtleSBhbmQgSVYgZnJvbSB0aGUgQ3J5dG9LZXkgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gZGVyaXZhdGlvblxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0S2V5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0S2V5KGRlcml2YXRpb246IEFycmF5QnVmZmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IGl2bGVuID0gMTY7XG4gICAgY29uc3Qga2V5bGVuID0gMzI7XG4gICAgY29uc3QgZGVyaXZlZEtleSA9IGRlcml2YXRpb24uc2xpY2UoMCwga2V5bGVuKTtcbiAgICBjb25zdCBpdiA9IGRlcml2YXRpb24uc2xpY2Uoa2V5bGVuKTtcbiAgICBjb25zdCBpbXBvcnRlZEVuY3J5cHRpb25LZXkgPSBhd2FpdCB0aGlzLmdldFN1YnRsZUNyeXB0bygpLmltcG9ydEtleShcbiAgICAgIFwicmF3XCIsXG4gICAgICBkZXJpdmVkS2V5LFxuICAgICAgeyBuYW1lOiBDUllQVE8uQUxHT1JZVEhNIGFzIHN0cmluZyB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaW1wb3J0ZWRFbmNyeXB0aW9uS2V5LFxuICAgICAgaXY6IGl2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBkZWNyeXB0IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHBhcmFtIHtrZXlPYmplY3R9IGtleU9iamVjdFxuICAgKlxuICAgKiBAZnVuY3Rpb24gZW5jcnlwdFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVuY3J5cHRQaW4oXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtleU9iamVjdDoga2V5T2JqZWN0XG4gICk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IHRleHRCdWZmZXIgPSB0ZXh0RW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gICAgY29uc3QgZW5jcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICB0ZXh0QnVmZmVyXG4gICAgKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkVGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGRlY3J5cHQgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlclNvdXJjZX0gZW5jcnlwdGVkVGV4dFxuICAgKiBAcGFyYW0ge2tleU9iamVjdH0ga2V5T2JqZWN0XG4gICAqXG4gICAqIEBmdW5jdGlvbiBkZWNyeXB0XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVjcnlwdFBpbihcbiAgICBlbmNyeXB0ZWRUZXh0OiBBcnJheUJ1ZmZlcixcbiAgICBrZXlPYmplY3Q6IGtleU9iamVjdFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgZGVjcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMuZ2V0U3VidGxlQ3J5cHRvKCkuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogQ1JZUFRPLkFMR09SWVRITSBhcyBzdHJpbmcsIGl2OiBrZXlPYmplY3QuaXYgfSxcbiAgICAgIGtleU9iamVjdC5rZXksXG4gICAgICBlbmNyeXB0ZWRUZXh0XG4gICAgKTtcbiAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZFRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQgRmFicmljQ0FTZXJ2aWNlcyBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJZGVudGl0eVNlcnZpY2UsXG4gIElFbnJvbGxSZXNwb25zZSxcbiAgSVJlZ2lzdGVyUmVxdWVzdCxcbiAgSVNlcnZpY2VSZXNwb25zZSxcbiAgVExTT3B0aW9ucyxcbn0gZnJvbSBcImZhYnJpYy1jYS1jbGllbnRcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL21vZGVsL0lkZW50aXR5XCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29yZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDQV9ST0xFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDcnlwdG9VdGlscyB9IGZyb20gXCIuLi9jcnlwdG9cIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlUmVzcG9uc2UsXG4gIEZhYnJpY0lkZW50aXR5LFxuICBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICBJZGVudGl0eVJlc3BvbnNlLFxufSBmcm9tIFwiLi4vLi4vc2hhcmVkL2ZhYnJpYy10eXBlc1wiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSHlwZXJsZWRnZXIgRmFicmljIENBIGlkZW50aXR5IHR5cGVzLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUgc3VwcG9ydGVkIGlkZW50aXR5IHR5cGVzIHJlY29nbml6ZWQgYnkgRmFicmljIENBIGZvciByZWdpc3RyYXRpb24gYW5kIGlkZW50aXR5IG1hbmFnZW1lbnQuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIEhGQ0FJZGVudGl0eVR5cGUge1xuICBQRUVSID0gXCJwZWVyXCIsXG4gIE9SREVSRVIgPSBcIm9yZGVyZXJcIixcbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbiAgVVNFUiA9IFwidXNlclwiLFxuICBBRE1JTiA9IFwiYWRtaW5cIixcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleS92YWx1ZSBhdHRyaWJ1dGUgdXNlZCBkdXJpbmcgQ0EgcmVnaXN0cmF0aW9uLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBhdHRyaWJ1dGUgZW50cnkgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBGYWJyaWMgQ0EgaWRlbnRpdHkgZHVyaW5nIHJlZ2lzdHJhdGlvbiwgb3B0aW9uYWxseSBtYXJraW5nIGl0IGZvciBpbmNsdXNpb24gaW4gZWNlcnQuXG4gKiBAaW50ZXJmYWNlIElLZXlWYWx1ZUF0dHJpYnV0ZVxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBBdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtlY2VydF0gLSBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBlbnJvbGxtZW50IGNlcnRpZmljYXRlIChFQ2VydCkuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUtleVZhbHVlQXR0cmlidXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBlY2VydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YW5kYXJkIEZhYnJpYyBDQSBpZGVudGl0eSBhdHRyaWJ1dGUga2V5cy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0ZXMgd2VsbC1rbm93biBGYWJyaWMgQ0EgYXR0cmlidXRlIGtleXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyBmb3IgZGVsZWdhdGlvbnMgYW5kIHBlcm1pc3Npb25zLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgZW51bSBIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIHtcbiAgSEZSRUdJU1RSQVJST0xFUyA9IFwiaGYuUmVnaXN0cmFyLlJvbGVzXCIsXG4gIEhGUkVHSVNUUkFSREVMRUdBVEVST0xFUyA9IFwiaGYuUmVnaXN0cmFyLkRlbGVnYXRlUm9sZXNcIixcbiAgSEZSRUdJU1RSQVJBVFRSSUJVVEVTID0gXCJoZi5SZWdpc3RyYXIuQXR0cmlidXRlc1wiLFxuICBIRklOVEVSTUVESUFURUNBID0gXCJoZi5JbnRlcm1lZGlhdGVDQVwiLFxuICBIRlJFVk9LRVIgPSBcImhmLlJldm9rZXJcIixcbiAgSEZBRkZJTElBVElPTk1HUiA9IFwiaGYuQWZmaWxpYXRpb25NZ3JcIixcbiAgSEZHRU5DUkwgPSBcImhmLkdlbkNSTFwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXJ2aWNlIHdyYXBwZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBGYWJyaWMgQ0EuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBoaWdoLWxldmVsIG9wZXJhdGlvbnMgZm9yIG1hbmFnaW5nIGlkZW50aXRpZXMgYWdhaW5zdCBhIEh5cGVybGVkZ2VyIEZhYnJpYyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHksIGluY2x1ZGluZyByZWdpc3RyYXRpb24sIGVucm9sbG1lbnQsIHJldm9jYXRpb24sIGFuZCBhZG1pbmlzdHJhdGl2ZSBxdWVyaWVzLiBFbmNhcHN1bGF0ZXMgbG93ZXItbGV2ZWwgRmFicmljIENBIGNsaWVudCBjYWxscyB3aXRoIGNvbnNpc3RlbnQgbG9nZ2luZyBhbmQgZXJyb3IgbWFwcGluZy5cbiAqIEBwYXJhbSB7Q0FDb25maWd9IGNhQ29uZmlnIC0gQ29ubmVjdGlvbiBhbmQgVExTIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0YXJnZXQgQ0EuXG4gKiBAY2xhc3MgRmFicmljRW5yb2xsbWVudFNlcnZpY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlciBhbmQgZW5yb2xsIGEgbmV3IHVzZXJcbiAqIGNvbnN0IHN2YyA9IG5ldyBGYWJyaWNFbnJvbGxtZW50U2VydmljZSh7XG4gKiAgIHVybDogJ2h0dHBzOi8vbG9jYWxob3N0OjcwNTQnLFxuICogICBjYU5hbWU6ICdPcmcxQ0EnLFxuICogICB0bHM6IHsgdHJ1c3RlZFJvb3RzOiBbJy9wYXRoL3RvL2NhLnBlbSddLCB2ZXJpZnk6IGZhbHNlIH0sXG4gKiAgIGNhQ2VydDogJy9wYXRoL3RvL2FkbWluL2NlcnREaXInLFxuICogICBjYUtleTogJy9wYXRoL3RvL2FkbWluL2tleURpcidcbiAqIH0pO1xuICogYXdhaXQgc3ZjLnJlZ2lzdGVyKHsgdXNlck5hbWU6ICdhbGljZScsIHBhc3N3b3JkOiAnczNjcjN0JyB9LCBmYWxzZSwgJ29yZzEuZGVwYXJ0bWVudDEnLCBDQV9ST0xFLlVTRVIpO1xuICogY29uc3QgaWQgPSBhd2FpdCBzdmMuZW5yb2xsKCdhbGljZScsICdzM2NyM3QnKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgYXV0b251bWJlclxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU3ZjIGFzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlXG4gKiAgIHBhcnRpY2lwYW50IENBIGFzIEZhYnJpYyBDQVxuICogICBBcHAtPj5TdmM6IHJlZ2lzdGVyKGNyZWRlbnRpYWxzLCAuLi4pXG4gKiAgIFN2Yy0+PkNBOiByZWdpc3RlcihyZXF1ZXN0LCBhZG1pblVzZXIpXG4gKiAgIENBLS0+PlN2YzogZW5yb2xsbWVudFNlY3JldFxuICogICBTdmMtLT4+QXBwOiBzZWNyZXRcbiAqICAgQXBwLT4+U3ZjOiBlbnJvbGwoZW5yb2xsbWVudElkLCBzZWNyZXQpXG4gKiAgIFN2Yy0+PkNBOiBlbnJvbGwoe2Vucm9sbG1lbnRJRCwgc2VjcmV0fSlcbiAqICAgQ0EtLT4+U3ZjOiBjZXJ0aWZpY2F0ZXNcbiAqICAgU3ZjLS0+PkFwcDogSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICBwcml2YXRlIGNhPzogRmFicmljQ0FTZXJ2aWNlcztcblxuICBwcml2YXRlIGNlcnRpZmljYXRlU2VydmljZT86IGFueTtcblxuICBwcml2YXRlIGFmZmlsaWF0aW9uU2VydmljZT86IEFmZmlsaWF0aW9uU2VydmljZTtcblxuICBwcml2YXRlIGlkZW50aXR5U2VydmljZT86IElkZW50aXR5U2VydmljZTtcblxuICBwcml2YXRlIGNsaWVudD86IGFueTtcblxuICBwcml2YXRlIHVzZXI/OiBVc2VyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FDb25maWc6IENBQ29uZmlnKSB7XG4gICAgQ29yZVV0aWxzLmdldENyeXB0b1N1aXRlKFxuICAgICAgY2FDb25maWcuaHNtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc29mdHdhcmU6IGZhbHNlLFxuICAgICAgICAgICAgbGliOiBjYUNvbmZpZy5oc20ubGlicmFyeSxcbiAgICAgICAgICAgIHNsb3Q6IGNhQ29uZmlnLmhzbS5zbG90LFxuICAgICAgICAgICAgbGFiZWw6IGNhQ29uZmlnLmhzbS50b2tlbkxhYmVsLFxuICAgICAgICAgICAgcGluOiBTdHJpbmcoY2FDb25maWcuaHNtLnBpbiksXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBVc2VyKCk6IFByb21pc2U8VXNlcj4ge1xuICAgIGlmICh0aGlzLnVzZXIpIHJldHVybiB0aGlzLnVzZXI7XG4gICAgY29uc3QgeyBjYU5hbWUsIGNhQ2VydCwgY2FLZXksIHVybCwgaHNtIH0gPSB0aGlzLmNhQ29uZmlnO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLlVzZXIpO1xuICAgIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgQ0EgdXNlciBmb3IgJHtjYU5hbWV9IGF0ICR7dXJsfWApO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy51c2VyID0gYXdhaXQgQ29yZVV0aWxzLmdldENBVXNlcihcImFkbWluXCIsIGtleSwgY2VydGlmaWNhdGUsIGNhTmFtZSwge1xuICAgICAgaHNtLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnVzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ0EoKTogUHJvbWlzZTxGYWJyaWNDQVNlcnZpY2VzPiB7XG4gICAgaWYgKHRoaXMuY2EpIHJldHVybiB0aGlzLmNhO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLkNBKTtcbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IHRoaXMuY2FDb25maWc7XG5cbiAgICAvLyBGT1IgU29tZSBSZWFzb24gdGhlIHZlcmlmaWNhdGlvbiBmYWlscyBuZWVkIHRvIGludmVzdGlnYXRlIHRoaXMgd29ya3MgZm9yIG5vd1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBDQSBDbGllbnQgZm9yIENBICR7Y2FOYW1lfSB1bmRlciAke3VybH1gKTtcbiAgICB0aGlzLmNhID0gbmV3IEZhYnJpY0NBU2VydmljZXMoXG4gICAgICB1cmwsXG4gICAgICB7XG4gICAgICAgIHRydXN0ZWRSb290czogQnVmZmVyLmZyb20oY2VydGlmaWNhdGUpLFxuICAgICAgICB2ZXJpZnksXG4gICAgICB9IGFzIFRMU09wdGlvbnMsXG4gICAgICBjYU5hbWVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmNhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIENsaWVudCgpOiBQcm9taXNlPHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfT4ge1xuICAgIGlmICh0aGlzLmNsaWVudCkgcmV0dXJuIHRoaXMuY2xpZW50O1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIHRoaXMuY2xpZW50ID0gKGNhIGFzIGFueSlbXCJfRmFicmljQ0FTZXJ2aWNlc1wiXTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgQ2VydGlmaWNhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmNlcnRpZmljYXRlU2VydmljZSlcbiAgICAgIHRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ2xpZW50KCkpLm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICAgIHJldHVybiB0aGlzLmNlcnRpZmljYXRlU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBBZmZpbGlhdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLmFmZmlsaWF0aW9uU2VydmljZSlcbiAgICAgIHRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ0EoKSkubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuYWZmaWxpYXRpb25TZXJ2aWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIElkZW50aXRpZXMoKSB7XG4gICAgaWYgKCF0aGlzLmlkZW50aXR5U2VydmljZSlcbiAgICAgIHRoaXMuaWRlbnRpdHlTZXJ2aWNlID0gKGF3YWl0IHRoaXMuQ0EoKSkubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlTZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBjZXJ0aWZpY2F0ZXMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IENhbGxzIHRoZSBDQSBjZXJ0aWZpY2F0ZSBzZXJ2aWNlIHRvIGxpc3QgY2VydGlmaWNhdGVzLCBvcHRpb25hbGx5IG1hcHBpbmcgdG8gUEVNIHN0cmluZ3Mgb25seS5cbiAgICogQHBhcmFtIHtHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0fSBbcmVxdWVzdF0gLSBPcHRpb25hbCBmaWx0ZXIgcmVxdWVzdCBmb3IgY2VydGlmaWNhdGUgbG9va3VwLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkb01hcD10cnVlXSAtIFdoZW4gdHJ1ZSwgcmV0dXJucyBhcnJheSBvZiBQRU0gc3RyaW5nczsgb3RoZXJ3aXNlIHJldHVybnMgZnVsbCByZXNwb25zZSBvYmplY3QuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nW10gfCBDZXJ0aWZpY2F0ZVJlc3BvbnNlPn0gQXJyYXkgb2YgUEVNIHN0cmluZ3Mgb3IgdGhlIGZ1bGwgY2VydGlmaWNhdGUgcmVzcG9uc2UuXG4gICAqL1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdD86IEdldENlcnRpZmljYXRlc1JlcXVlc3QsXG4gICAgZG9NYXAgPSB0cnVlXG4gICk6IFByb21pc2U8c3RyaW5nW10gfCBDZXJ0aWZpY2F0ZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2VydGlmaWNhdGVTZXJ2aWNlID0gYXdhaXQgdGhpcy5DZXJ0aWZpY2F0ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDZXJ0aWZpY2F0ZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2U6IENlcnRpZmljYXRlUmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCBjZXJ0aWZpY2F0ZVNlcnZpY2UuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHVzZXIpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuY2VydHMubGVuZ3RofSBjZXJ0aWZpY2F0ZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiBkb01hcCA/IHJlc3BvbnNlLmNlcnRzLm1hcCgoYykgPT4gYy5QRU0pIDogcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3QgaWRlbnRpdGllcyByZWdpc3RlcmVkIGluIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgUXVlcmllcyB0aGUgQ0EgaWRlbnRpdHkgc2VydmljZSB0byBmZXRjaCBhbGwgaWRlbnRpdGllcyBhbmQgcmV0dXJucyB0aGUgbGlzdCBhcyBGYWJyaWNJZGVudGl0eSBvYmplY3RzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+fSBUaGUgbGlzdCBvZiBpZGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgZ2V0SWRlbnRpdGllcygpOiBQcm9taXNlPEZhYnJpY0lkZW50aXR5W10+IHtcbiAgICBjb25zdCBpZGVudGl0aWVzU2VydmljZSA9IGF3YWl0IHRoaXMuSWRlbnRpdGllcygpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmdldElkZW50aXRpZXMpO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBJZGVudGl0aWVzIHVuZGVyIENBICR7dGhpcy5jYUNvbmZpZy5jYU5hbWV9YCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElkZW50aXR5UmVzcG9uc2UgPSAoXG4gICAgICBhd2FpdCBpZGVudGl0aWVzU2VydmljZS5nZXRBbGwoYXdhaXQgdGhpcy5Vc2VyKCkpXG4gICAgKS5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuaWRlbnRpdGllcy5sZW5ndGh9IElkZW50aXRpZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfWBcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlRXJyb3IoZTogRXJyb3IpIHtcbiAgICBjb25zdCByZWdleHAgPSAvLipjb2RlOlxccyhcXGQrKS4qP21lc3NhZ2U6XFxzW1wiJ10oLispW1wiJ10vZ3M7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhlLm1lc3NhZ2UpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IoZSk7XG4gICAgY29uc3QgWywgY29kZSwgbWVzc2FnZV0gPSBtYXRjaDtcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgXCI3NFwiOlxuICAgICAgY2FzZSBcIjcxXCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgXCIyMFwiOlxuICAgICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoKSB7XG4gICAgY29uc3QgYWZmaWxpYXRpb25TZXJ2aWNlID0gYXdhaXQgdGhpcy5BZmZpbGlhdGlvbnMoKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBBZmZpbGlhdGlvbnMgdW5kZXIgQ0EgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCBhZmZpbGlhdGlvblNlcnZpY2UuZ2V0QWxsKGF3YWl0IHRoaXMuVXNlcigpKSlcbiAgICAgIC5yZXN1bHQ7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEZvdW5kICR7cmVzcG9uc2UuYS5sZW5ndGh9IEFmZmlsaWF0aW9uczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSl9YFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkIGlkZW50aXR5IGRldGFpbHMgZnJvbSB0aGUgQ0EgYnkgZW5yb2xsbWVudCBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuZCB2YWxpZGF0ZXMgYSBzaW5nbGUgaWRlbnRpdHksIHRocm93aW5nIE5vdEZvdW5kRXJyb3Igd2hlbiBtaXNzaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBsb29rdXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmFicmljSWRlbnRpdHk+fSBUaGUgaWRlbnRpdHkgZGV0YWlscyBzdG9yZWQgaW4gdGhlIENBLlxuICAgKi9cbiAgYXN5bmMgcmVhZChlbnJvbGxtZW50SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBsZXQgcmVzdWx0OiBJU2VydmljZVJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjYS5uZXdJZGVudGl0eVNlcnZpY2UoKS5nZXRPbmUoZW5yb2xsbWVudElkLCB1c2VyKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGRuJ3QgZmluZCBlbnJvbGxtZW50IHdpdGggaWQgJHtlbnJvbGxtZW50SWR9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7cmVzdWx0LmVycm9ycy5qb2luKFwiXFxuXCIpfWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCBhcyBGYWJyaWNJZGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgaWRlbnRpdHkgd2l0aCB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSByZWdpc3RyYXRpb24gcmVxdWVzdCBmb3IgYSBuZXcgZW5yb2xsbWVudCBJRCwgcmV0dXJuaW5nIHRoZSBlbnJvbGxtZW50IHNlY3JldCB1cG9uIHN1Y2Nlc3MuXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IG1vZGVsIC0gQ3JlZGVudGlhbHMgY29udGFpbmluZyB1c2VyTmFtZSBhbmQgcGFzc3dvcmQgZm9yIHRoZSBuZXcgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3VwZXJVc2VyPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmVnaXN0ZXIgdGhlIGlkZW50aXR5IGFzIGEgc3VwZXIgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthZmZpbGlhdGlvbj1cIlwiXSAtIEFmZmlsaWF0aW9uIHN0cmluZyAoZS5nLiwgb3JnMS5kZXBhcnRtZW50MSkuXG4gICAqIEBwYXJhbSB7Q0FfUk9MRSB8IHN0cmluZ30gW3VzZXJSb2xlXSAtIFJvbGUgdG8gYXNzaWduIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtJS2V5VmFsdWVBdHRyaWJ1dGV9IFthdHRyc10gLSBPcHRpb25hbCBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byB0aGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4RW5yb2xsbWVudHNdIC0gTWF4aW11bSBudW1iZXIgb2YgZW5yb2xsbWVudHMgYWxsb3dlZCBmb3IgdGhlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFRoZSBlbnJvbGxtZW50IHNlY3JldCBmb3IgdGhlIHJlZ2lzdGVyZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlcihcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmVnaXN0ZXIpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHVzZXJOYW1lLCBwYXNzd29yZCB9ID0gbW9kZWw7XG4gICAgICBjb25zdCBjYSA9IGF3YWl0IHRoaXMuQ0EoKTtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IGNhLnJlZ2lzdGVyKHByb3BzLCB1c2VyKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgUmVnaXN0cmF0aW9uIGZvciAke3VzZXJOYW1lfSBjcmVhdGVkIHdpdGggdXNlciB0eXBlICR7dXNlclJvbGUgPz8gXCJVbmRlZmluZWQgUm9sZVwifSAke2lzU3VwZXJVc2VyID8gXCJhcyBzdXBlciB1c2VyXCIgOiBcIlwifWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGlkZW50aXR5RnJvbUVucm9sbG1lbnQoXG4gICAgZW5yb2xsbWVudDogSUVucm9sbFJlc3BvbnNlLFxuICAgIG1zcElkOiBzdHJpbmdcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IHsgY2VydGlmaWNhdGUsIGtleSwgcm9vdENlcnRpZmljYXRlIH0gPSBlbnJvbGxtZW50O1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY0Vucm9sbG1lbnRTZXJ2aWNlLCB7fSkuZm9yKFxuICAgICAgdGhpcy5pZGVudGl0eUZyb21FbnJvbGxtZW50XG4gICAgKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHkoe1xuICAgICAgaWQ6IGlkLFxuICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjZXJ0aWZpY2F0ZTogY2VydGlmaWNhdGUsXG4gICAgICAgIHByaXZhdGVLZXk6IGtleS50b0J5dGVzKCksXG4gICAgICAgIHJvb3RDZXJ0aWZpY2F0ZTogcm9vdENlcnRpZmljYXRlLFxuICAgICAgICBjcmVhdGVkT246IG5vdyxcbiAgICAgICAgdXBkYXRlZE9uOiBub3csXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgICAgY3JlYXRlZE9uOiBub3csXG4gICAgICB1cGRhdGVkT246IG5vdyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW5yb2xsIGFuIGlkZW50aXR5IHdpdGggdGhlIENBIHVzaW5nIGEgcmVnaXN0cmF0aW9uIHNlY3JldC5cbiAgICogQHN1bW1hcnkgRXhjaGFuZ2VzIHRoZSBlbnJvbGxtZW50IElEIGFuZCBzZWNyZXQgZm9yIGNlcnRpZmljYXRlcywgcmV0dXJuaW5nIGEgY29uc3RydWN0ZWQgSWRlbnRpdHkgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGVucm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbiAtIEVucm9sbG1lbnQgc2VjcmV0IHJldHVybmVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPElkZW50aXR5Pn0gVGhlIGVucm9sbGVkIGlkZW50aXR5IG9iamVjdCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgYXN5bmMgZW5yb2xsKGVucm9sbG1lbnRJZDogc3RyaW5nLCByZWdpc3RyYXRpb246IHN0cmluZykge1xuICAgIGxldCBpZGVudGl0eTogSWRlbnRpdHk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZW5yb2xsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2EgPSBhd2FpdCB0aGlzLkNBKCk7XG4gICAgICBsb2cuZGVidWcoYEVucm9sbGluZyAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IGVucm9sbG1lbnQ6IElFbnJvbGxSZXNwb25zZSA9IGF3YWl0IGNhLmVucm9sbCh7XG4gICAgICAgIGVucm9sbG1lbnRJRDogZW5yb2xsbWVudElkLFxuICAgICAgICBlbnJvbGxtZW50U2VjcmV0OiByZWdpc3RyYXRpb24sXG4gICAgICB9KTtcbiAgICAgIGlkZW50aXR5ID0gRmFicmljRW5yb2xsbWVudFNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jYUNvbmZpZy5jYU5hbWVcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSBlbnJvbGxlZCAke2Vucm9sbG1lbnRJZH0gdW5kZXIgJHt0aGlzLmNhQ29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHNcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlcyB0aGUgZW5yb2xsbWVudCBvZiBhbiBpZGVudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgZW5yb2xsbWVudCBJRC5cbiAgICpcbiAgICogQHBhcmFtIGVucm9sbG1lbnRJZCAtIFRoZSBlbnJvbGxtZW50IElEIG9mIHRoZSBpZGVudGl0eSB0byBiZSByZXZva2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzdWx0IG9mIHRoZSByZXZvY2F0aW9uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHRocm93cyB7Tm90Rm91bmRFcnJvcn0gSWYgdGhlIGVucm9sbG1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGRvZXMgbm90IGV4aXN0LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgdGhlIHJldm9jYXRpb24gcHJvY2Vzcy5cbiAgICovXG4gIGFzeW5jIHJldm9rZShlbnJvbGxtZW50SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNhID0gYXdhaXQgdGhpcy5DQSgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLlVzZXIoKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMucmVhZChlbnJvbGxtZW50SWQpO1xuICAgIGlmICghaWRlbnRpdHkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH1gXG4gICAgICApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNhLnJldm9rZShcbiAgICAgICAgeyBlbnJvbGxtZW50SUQ6IGlkZW50aXR5LmlkLCByZWFzb246IFwiVXNlciBEZWxldGF0aW9uXCIgfSxcbiAgICAgICAgdXNlclxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJUmVnaXN0ZXJSZXF1ZXN0LCBJS2V5VmFsdWVBdHRyaWJ1dGUgfSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgbWluLFxuICBtaW5sZW5ndGgsXG4gIE1vZGVsLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyYXRpb25SZXF1ZXN0QnVpbGRlciBleHRlbmRzIE1vZGVsIHtcbiAgQHJlcXVpcmVkKClcbiAgYWZmaWxpYXRpb246IHN0cmluZyA9IFwiXCI7XG4gIEBtaW5sZW5ndGgoMSlcbiAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGVbXTtcbiAgQHJlcXVpcmVkKClcbiAgZW5yb2xsbWVudElEITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKVxuICBlbnJvbGxtZW50U2VjcmV0ITogc3RyaW5nO1xuICBAbWluKDApXG4gIG1heEVucm9sbG1lbnRzPzogbnVtYmVyO1xuICBAcmVxdWlyZWQoKVxuICByb2xlITogc3RyaW5nO1xuXG4gIGJ1aWxkKCk6IElSZWdpc3RlclJlcXVlc3Qge1xuICAgIGNvbnN0IGVycnMgPSB0aGlzLmhhc0Vycm9ycygpO1xuICAgIGlmIChlcnJzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycnMudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgcmVzcG9uc2U6IElSZWdpc3RlclJlcXVlc3QgPSB7XG4gICAgICBlbnJvbGxtZW50SUQ6IHRoaXMuZW5yb2xsbWVudElELFxuICAgICAgZW5yb2xsbWVudFNlY3JldDogdGhpcy5lbnJvbGxtZW50U2VjcmV0LFxuICAgICAgcm9sZTogdGhpcy5yb2xlLFxuICAgICAgYWZmaWxpYXRpb246IHRoaXMuYWZmaWxpYXRpb24sXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHRoaXMubWF4RW5yb2xsbWVudHMgIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXNwb25zZS5tYXhFbnJvbGxtZW50cyA9IHRoaXMubWF4RW5yb2xsbWVudHM7XG4gICAgaWYgKHRoaXMuYXR0cnMpIHJlc3BvbnNlLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBzZXRBZmZpbGlhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5hZmZpbGlhdGlvbiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQXR0cihhdHRyOiBJS2V5VmFsdWVBdHRyaWJ1dGUpIHtcbiAgICB0aGlzLmF0dHJzID0gdGhpcy5hdHRycyB8fCBbXTtcbiAgICB0aGlzLmF0dHJzLnB1c2goYXR0cik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBdHRycyh2YWx1ZTogSUtleVZhbHVlQXR0cmlidXRlW10pIHtcbiAgICB0aGlzLmF0dHJzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFbnJvbGxtZW50SUQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZW5yb2xsbWVudElEID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRFbnJvbGxtZW50U2VjcmV0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVucm9sbG1lbnRTZWNyZXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE1heEVucm9sbG1lbnRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLm1heEVucm9sbG1lbnRzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRSb2xlKHZhbHVlOiBDQV9ST0xFIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5yb2xlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNNb2RlbEtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTZWdyZWdhdGVkTW9kZWwgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERCS2V5cywgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlTWV0YWRhdGEsXG4gIENvbGxlY3Rpb25SZXNvbHZlcixcbiAgTWlycm9yTWV0YWRhdGEsXG59IGZyb20gXCIuLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBDb250ZXh0dWFsQXJncyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5Nb2RlbC5wcm90b3R5cGUuaXNTaGFyZWQgPSBmdW5jdGlvbiBpc1NoYXJlZDxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1vZGVsLmlzU2hhcmVkKHRoaXMuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xufTtcblxuTW9kZWwucHJvdG90eXBlLmlzUHJpdmF0ZSA9IGZ1bmN0aW9uIGlzUHJpdmF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE1vZGVsLmlzUHJpdmF0ZSh0aGlzLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcbn07XG5cbk1vZGVsLnByb3RvdHlwZS5zZWdyZWdhdGUgPSBmdW5jdGlvbiBzZWdyZWdhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogTVxuKTogU2VncmVnYXRlZE1vZGVsPE0+IHtcbiAgcmV0dXJuIE1vZGVsLnNlZ3JlZ2F0ZSh0aGlzKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnNlZ3JlZ2F0ZSA9IGZ1bmN0aW9uIHNlZ3JlZ2F0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTVxuKTogU2VncmVnYXRlZE1vZGVsPE0+IHtcbiAgaWYgKCFNb2RlbC5pc1RyYW5zaWVudChtb2RlbCkpIHJldHVybiB7IG1vZGVsOiBtb2RlbCB9O1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzID1cbiAgICBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgfHwgW107XG5cbiAgY29uc3QgdHJhbnNpZW50UHJvcHMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIERCS2V5cy5UUkFOU0lFTlRcbiAgKTtcbiAgY29uc3QgcHJpdmF0ZVByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFXG4gICk7XG4gIGNvbnN0IHNoYXJlZFByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5TSEFSRURcbiAgKTtcblxuICBjb25zdCByZXN1bHQ6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiA9IHtcbiAgICBtb2RlbDoge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT4sXG4gICAgcHVibGljOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICB0cmFuc2llbnQ6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICAgIHByaXZhdGVzOiB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PixcbiAgICBzaGFyZWQ6IHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+LFxuICB9O1xuXG4gIGNvbnN0IHRyYW5zaWVudEtleXMgPSBPYmplY3Qua2V5cyh0cmFuc2llbnRQcm9wcyB8fCB7fSk7XG4gIGNvbnN0IHByaXZhdGVLZXlzID0gT2JqZWN0LmtleXMocHJpdmF0ZVByb3BlcnRpZXMgfHwge30pO1xuICBjb25zdCBzaGFyZWRLZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkUHJvcGVydGllcyB8fCB7fSk7XG5cbiAgLy8gY29uc3QgcGtLZXkgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZWNvcmF0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtb2RlbFtrZXkgYXMga2V5b2YgTV07XG4gICAgY29uc3QgaXNUcmFuc2llbnQgPSB0cmFuc2llbnRLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgY29uc3QgaXNQdWJsaWMgPSAhaXNUcmFuc2llbnQ7XG4gICAgY29uc3QgaXNQcml2YXRlID0gcHJpdmF0ZUtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBpc1NoYXJlZCA9IHNoYXJlZEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICAvLyBjb25zdCBpc1ByaW1hcnlLZXkgPSBrZXkgPT09IHBrS2V5O1xuXG4gICAgaWYgKGlzVHJhbnNpZW50IHx8IGlzUHJpdmF0ZSB8fCBpc1NoYXJlZCkge1xuICAgICAgcmVzdWx0LnRyYW5zaWVudCA9IHJlc3VsdC50cmFuc2llbnQgfHwgKHt9IGFzIGFueSk7XG4gICAgICAocmVzdWx0LnRyYW5zaWVudCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzUHJpdmF0ZSkge1xuICAgICAgcmVzdWx0LnByaXZhdGVzID0gcmVzdWx0LnByaXZhdGVzIHx8ICh7fSBhcyBhbnkpO1xuICAgICAgKHJlc3VsdC5wcml2YXRlcyBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzU2hhcmVkKSB7XG4gICAgICByZXN1bHQuc2hhcmVkID0gcmVzdWx0LnNoYXJlZCB8fCAoe30gYXMgYW55KTtcbiAgICAgIChyZXN1bHQuc2hhcmVkIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgIHJlc3VsdC5wdWJsaWMgPSAocmVzdWx0LnB1YmxpYyB8fCB7fSkgYXMgYW55O1xuICAgICAgKHJlc3VsdC5wdWJsaWMgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmVzdWx0Lm1vZGVsID0gTW9kZWwuYnVpbGQocmVzdWx0LnB1YmxpYywgbW9kZWwuY29uc3RydWN0b3IubmFtZSk7XG4gIHJldHVybiByZXN1bHQgYXMgU2VncmVnYXRlZE1vZGVsPE0+O1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuaXNQcml2YXRlID0gZnVuY3Rpb24gaXNQcml2YXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5pc1NoYXJlZCA9IGZ1bmN0aW9uIGlzU2hhcmVkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIEZhYnJpY01vZGVsS2V5cy5TSEFSRURcbiAgKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLm1pcnJvcmVkID0gZnVuY3Rpb24gbWlycm9yZWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKVxuICApO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkub3duZXJPZiA9IGZ1bmN0aW9uIG93bmVyT2Y8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE1cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwuY29uc3RydWN0b3IgYXMgYW55LFxuICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG1vZGVsW21ldGEgYXMga2V5b2YgTV0gYXMgc3RyaW5nO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkubWlycm9yZWRBdCA9IGZ1bmN0aW9uIG1pcnJvcmVkQXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogTWlycm9yTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICBtb2RlbCA9IHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbDtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChcbiAgICBtb2RlbCBhcyBhbnksXG4gICAgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsIEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5jb2xsZWN0aW9uc0ZvciA9IGZ1bmN0aW9uIGNvbGxlY3Rpb25zRm9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IHtcbiAgcHJpdmF0ZUNvbHM6IChzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpW107XG4gIHNoYXJlZENvbHM6IChzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpW107XG59IHtcbiAgY29uc3QgcHJpdmF0ZUtleXM6IHN0cmluZ1tdID0gW0ZhYnJpY01vZGVsS2V5cy5QUklWQVRFXSBhcyBzdHJpbmdbXTtcbiAgY29uc3Qgc2hhcmVkS2V5czogc3RyaW5nW10gPSBbRmFicmljTW9kZWxLZXlzLlNIQVJFRF0gYXMgc3RyaW5nW107XG5cbiAgY29uc3QgcHJpdmF0ZUtleSA9IE1ldGFkYXRhLmtleSguLi5wcml2YXRlS2V5cyk7XG4gIGNvbnN0IHNoYXJlZEtleSA9IE1ldGFkYXRhLmtleSguLi5zaGFyZWRLZXlzKTtcblxuICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG5cbiAgY29uc3QgcHJpdmF0ZU1ldGE6IHsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gPSBNZXRhZGF0YS5nZXQoXG4gICAgY29uc3RyIGFzIGFueSxcbiAgICBwcml2YXRlS2V5XG4gICk7XG4gIGNvbnN0IHNoYXJlZE1ldGE6IHsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gPSBNZXRhZGF0YS5nZXQoXG4gICAgY29uc3RyIGFzIGFueSxcbiAgICBzaGFyZWRLZXlcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHByaXZhdGVDb2xzOiBwcml2YXRlTWV0YT8uY29sbGVjdGlvbnMgfHwgW10sXG4gICAgc2hhcmVkQ29sczogc2hhcmVkTWV0YT8uY29sbGVjdGlvbnMgfHwgW10sXG4gIH07XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS5jaGFpbmNvZGVPZiA9IGZ1bmN0aW9uIGNoYWluY29kZU9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DSEFJTkNPREVcbiAgKTtcbiAgaWYgKCFtIHx8ICFtLnJlc29sdmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIG0ucmVzb2x2ZXIgPT09IFwic3RyaW5nXCIpIHJldHVybiBtLnJlc29sdmVyO1xuICBjb25zdCBjdHggPSBhcmdzLnBvcCgpO1xuICBpZiAoIWN0eCB8fCAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBjb250ZXh0IHByb3ZpZGVkIGZvciBjaGFpbmNvZGUgcmVzb2x1dGlvbmApO1xuICByZXR1cm4gbS5yZXNvbHZlcihtb2RlbCwgLi4uYXJncywgY3R4KTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmNvbnRyYWN0T2YgPSBmdW5jdGlvbiBjb250cmFjdE9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DT05UUkFDVFxuICApO1xuICBpZiAoIW0gfHwgIW0ucmVzb2x2ZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbS5yZXNvbHZlciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG0ucmVzb2x2ZXI7XG4gIGNvbnN0IGN0eCA9IGFyZ3MucG9wKCk7XG4gIGlmICghY3R4IHx8ICEoY3R4IGluc3RhbmNlb2YgQ29udGV4dCkpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGNvbnRleHQgcHJvdmlkZWQgZm9yIGNoYWluY29kZSByZXNvbHV0aW9uYCk7XG4gIHJldHVybiBtLnJlc29sdmVyKG1vZGVsLCAuLi5hcmdzLCBjdHgpO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuY2hhbm5lbE9mID0gZnVuY3Rpb24gY2hhbm5lbE9mPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbTogQ2hhaW5jb2RlTWV0YWRhdGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwgYXMgYW55LFxuICAgIEZhYnJpY01vZGVsS2V5cy5DSEFOTkVMXG4gICk7XG4gIGlmICghbSB8fCAhbS5yZXNvbHZlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBtLnJlc29sdmVyID09PSBcInN0cmluZ1wiKSByZXR1cm4gbS5yZXNvbHZlcjtcbiAgY29uc3QgY3R4ID0gYXJncy5wb3AoKTtcbiAgaWYgKCFjdHggfHwgIShjdHggaW5zdGFuY2VvZiBDb250ZXh0KSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gY29udGV4dCBwcm92aWRlZCBmb3IgY2hhaW5jb2RlIHJlc29sdXRpb25gKTtcbiAgcmV0dXJuIG0ucmVzb2x2ZXIobW9kZWwsIC4uLmFyZ3MsIGN0eCk7XG59LmJpbmQoTW9kZWwpO1xuIiwiLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZXZlbnRzIGVtaXR0ZWQgYnkgYW4gRVJDMjAgY29udHJhY3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBldmVudHMgdGhhdCBjYW4gYmUgZW1pdHRlZCBieSBhbiBFUkMyMCBjb250cmFjdC5cbiAqIFRoZSBldmVudHMgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGUgRUlQLTIwIHN0YW5kYXJkLlxuICovXG5leHBvcnQgZW51bSBFUkMyMEV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBgdHJhbnNmZXJgIGZ1bmN0aW9uIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHRvIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdHJhbnNmZXJyZWQuXG4gICAqL1xuICBUUkFOU0ZFUiA9IFwiVHJhbnNmZXJcIixcblxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGBhcHByb3ZlYCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBAcGFyYW0gb3duZXIgLSBUaGUgYWRkcmVzcyBvZiB0aGUgdG9rZW4gb3duZXIuXG4gICAqIEBwYXJhbSBzcGVuZGVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvdmVkIHNwZW5kZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIGFwcHJvdmVkIGZvciB0aGUgc3BlbmRlci5cbiAgICovXG4gIEFQUFJPVkFMID0gXCJBcHByb3ZhbFwiLFxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgdXBkYXRlZEF0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBkZXNjcmlwdGlvbiwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQHVzZXMoRmFicmljRmxhdm91cilcbmV4cG9ydCBjbGFzcyBGYWJyaWNCYXNlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgb3JpZ2luYWwgdGltZXN0YW1wIG9mIGNyZWF0aW9uXCIpXG4gIEBjb2x1bW4oKVxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCB1cGRhdGVcIilcbiAgQGNvbHVtbigpXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kZWxcIilcbiAgQGNvbHVtbigpXG4gIEB2ZXJzaW9uKClcbiAgdmVyc2lvbiE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNCYXNlTW9kZWw+KSB7XG4gICAgc3VwZXIoYXJnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEJ5LCB1cGRhdGVkQnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGRlc2NyaXB0aW9uLCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRmFicmljQmFzZU1vZGVsIH0gZnJvbSBcIi4vRmFicmljQmFzZU1vZGVsXCI7XG5cbkB1c2VzKEZhYnJpY0ZsYXZvdXIpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmFicmljSWRlbnRpZmllZEJhc2VNb2RlbCBleHRlbmRzIEZhYnJpY0Jhc2VNb2RlbCB7XG4gIEBkZXNjcmlwdGlvbihcIlN0b3JlcyB0aGUgY3JlYXRvclwiKVxuICBAY29sdW1uKClcbiAgQGNyZWF0ZWRCeSgpXG4gIGNyZWF0ZWRCeSE6IHN0cmluZztcblxuICBAZGVzY3JpcHRpb24oXCJTdG9yZXMgdGhlIHVzZXIgdGhhdCBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsXCIpXG4gIEBjb2x1bW4oKVxuICBAdXBkYXRlZEJ5KClcbiAgdXBkYXRlZEJ5ITogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc/OiBNb2RlbEFyZzxGYWJyaWNJZGVudGlmaWVkQmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgUmVwbyxcbiAgQ29udGV4dCxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgQ29udGV4dE9mLFxuICBDb250ZXh0dWFsQXJncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBnZW5lcmF0ZWQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25SZWFkLFxuICBvblVwZGF0ZSxcbiAgcmVhZG9ubHksXG4gIHRyYW5zaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEQktleXMsXG4gIERCT3BlcmF0aW9ucyxcbiAgb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuaW1wb3J0IHsgRmFicmljRVJDMjBDb250cmFjdCB9IGZyb20gXCIuLi9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdFwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbiAgTWV0YWRhdGEsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RmxhZ3MgfSBmcm9tIFwiLi4vY29udHJhY3RzL3R5cGVzXCI7XG5pbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9jb250cmFjdHMvQ29udHJhY3RDb250ZXh0XCI7XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVyRnVuY3Rpb248VD4gPSAoXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKSA9PiBQcm9taXNlPFQ+IHwgVDtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRDb250cmFjdFJlc29sdmVyID0gKFxuICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55PlxuKSA9PiB7XG4gIHJldHVybiBtb2RlbC5uYW1lICsgXCJDb250cmFjdFwiO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhaW5jb2RlTWV0YWRhdGEgPSB7XG4gIHJlc29sdmVyOiBzdHJpbmcgfCBSZXNvbHZlckZ1bmN0aW9uPHN0cmluZz47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29udHJhY3QocmVzb2x2ZXI6IGFueSkge1xuICBjb25zdCBtZXRhOiBDaGFpbmNvZGVNZXRhZGF0YSA9IHsgcmVzb2x2ZXIgfTtcbiAgcmV0dXJuIG1ldGFkYXRhKEZhYnJpY01vZGVsS2V5cy5DT05UUkFDVCwgbWV0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbmNvZGUocmVzb2x2ZXI6IGFueSkge1xuICBjb25zdCBtZXRhOiBDaGFpbmNvZGVNZXRhZGF0YSA9IHsgcmVzb2x2ZXIgfTtcbiAgcmV0dXJuIG1ldGFkYXRhKEZhYnJpY01vZGVsS2V5cy5DSEFJTkNPREUsIG1ldGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbChyZXNvbHZlcjogYW55KSB7XG4gIGNvbnN0IG1ldGE6IENoYWluY29kZU1ldGFkYXRhID0geyByZXNvbHZlciB9O1xuICByZXR1cm4gbWV0YWRhdGEoRmFicmljTW9kZWxLZXlzLkNIQU5ORUwsIG1ldGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyB0aGUgTVNQIElEIGZyb20gZWl0aGVyIGEgc3RyaW5nIG9yIENsaWVudElkZW50aXR5IG9iamVjdFxuICogQHBhcmFtIGlkZW50aXR5IC0gVGhlIGlkZW50aXR5IHZhbHVlIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBNU1AgSUQgb3IgQ2xpZW50SWRlbnRpdHkgb2JqZWN0XG4gKiBAcmV0dXJucyBUaGUgTVNQIElEIGFzIGEgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1zcElkKFxuICBpZGVudGl0eTogc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaWRlbnRpdHkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaWRlbnRpdHkgPT09IFwic3RyaW5nXCIpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIGlkZW50aXR5LmdldE1TUElEKCk7XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBtYXJraW5nIG1ldGhvZHMgdGhhdCByZXF1aXJlIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICogQ2hlY2tzIHRoZSBvd25lciBvZiB0aGUgdG9rZW4gYmVmb3JlIGFsbG93aW5nIHRoZSBtZXRob2QgdG8gYmUgZXhlY3V0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFRva2VuQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7XG4gKiAgIEBPd25lcigpXG4gKiAgIGFzeW5jIE1pbnQoY3R4OiBDb250ZXh0LCBhbW91bnQ6IG51bWJlcikge1xuICogICAgIC8vIE1pbnQgdG9rZW4gbG9naWNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybnMge01ldGhvZERlY29yYXRvcn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgY2hlY2tzIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT3duZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgIHRoaXM6IEZhYnJpY0VSQzIwQ29udHJhY3QsXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICkge1xuICAgICAgY29uc3QgY3R4OiBITENvbnRleHQgPSBhcmdzWzBdO1xuICAgICAgY29uc3QgYWNvdW50SWQgPSBjdHguY2xpZW50SWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gYXdhaXQgKHRoaXMgYXMgRmFicmljRVJDMjBDb250cmFjdClbXG4gICAgICAgIFwidG9rZW5SZXBvc2l0b3J5XCJcbiAgICAgIF0uc2VsZWN0KCk7XG5cbiAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IHNlbGVjdC5leGVjdXRlKGN0eCk7XG5cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXCJObyB0b2tlbnMgYXZhaWFsYmxlXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRvIG1hbnkgdG9rZW4gYXZhaWxhYmxlIDogJHt0b2tlbnMubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zWzBdLm93bmVyICE9IGFjb3VudElkKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYFVzZXIgbm90IGF1dGhvcml6ZWQgdG8gcnVuICR7cHJvcGVydHlLZXl9IG9uIHRoZSB0b2tlbmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG93bmVkQnlPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBSIGV4dGVuZHMgUmVwbzxNPixcbiAgVixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc3R1YiB9ID0gY29udGV4dCBhcyBhbnk7XG5cbiAgY29uc3QgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUgPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZTtcblxuICBjb25zdCBjcmVhdG9yID0gYXdhaXQgc3R1Yi5nZXRDcmVhdG9yKCk7XG4gIGxldCBvd25lciA9IGNyZWF0b3IubXNwaWQ7XG4gIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgYEV4cGVjdGVkIG1zcGlkIHRvIGJlICR7bW9kZWxba2V5XX0gfCAke293bmVyfS4gXFxuIFVzaW5nIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiAke2FsbG93R2VuZXJhdGlvbk92ZXJyaWRlfWBcbiAgKTtcblxuICBpZiAoYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUpIG93bmVyID0gbW9kZWxba2V5XSA/IG1vZGVsW2tleV0gOiBvd25lcjtcblxuICBjb25zdCBzZXRPd25lZEJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldE93bmVkQnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgb3duZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgZ2VuZXJhdGVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIG9uQ3JlYXRlKG93bmVkQnlPbkNyZWF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKSxcbiAgICAgICAgICBhdHRyaWJ1dGVcbiAgICAgICAgKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG93bmVkQnksXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZE9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcbiAgbW9kZWxba2V5XSA9IHN0dWIuZ2V0VHhJRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgb25VcGRhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsXG4gICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICBGYWJyaWNNb2RlbEtleXMuVFJBTlNBQ1RJT05fSURcbiAgICAgICAgICApLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCB0eXBlIE1pcnJvckNvbmRpdGlvbiA9IChtc3A6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTWlycm9yTWV0YWRhdGEgPSB7XG4gIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvbjtcbiAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZztcbiAgbXNwSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsTWlycm9yTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHJlc29sdmVyOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIGN0eDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPlxuKSB7XG4gIGxldCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgPSByZXNvbHZlcjtcbiAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgY3R4LmdldChcInN0dWJcIikuZ2V0Q3JlYXRvcigpLnRvU3RyaW5nKCk7XG4gICAgICBpZiAocmVzb2x2ZXIgJiYgdHlwZW9mIHJlc29sdmVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGNvbGxlY3Rpb24gPSBhd2FpdCByZXNvbHZlcihtb2RlbCwgb3duZXIsIGN0eCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIGNvbGxlY3Rpb24gbWlycm9yIG5hbWU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbGxlY3Rpb24gfHwgdHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTm8gY29sbGVjdGlvbiBmb3VuZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIC8vIFB1dCBtaXJyb3IgZmxhZ3MgZGlyZWN0bHkgb24gY29udGV4dCBzbyBhZGFwdGVyLnByZXBhcmUoKSBhbmQgYWRhcHRlci5jcmVhdGUoKSBjYW4gc2VlIHRoZW1cbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBjb25zdCBtaXJyb3IgPSBhd2FpdCByZXBvLmNyZWF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBjcmVhdGVkIHdpdGggJHtNb2RlbC5wayhtb2RlbCkgYXMgc3RyaW5nfTogJHttaXJyb3JbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhbiB1cCBtaXJyb3IgZmxhZ3MgZnJvbSBjb250ZXh0XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBtaXJyb3JDb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgICAgYXBwbHlVcGRhdGVWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VGb3JVcGRhdGU6IGZhbHNlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBhd2FpdCByZXBvLnVwZGF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB1cGRhdGVkOiAkeyhtb2RlbCBhcyBhbnkpW01vZGVsLnBrKG1vZGVsKV19YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGZhYnJpY0N0eC5wdXQoXCJzZWdyZWdhdGVkXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3AgPSBNb2RlbC5wayhtb2RlbCkgYXMga2V5b2YgTTtcbiAgICBjb25zdCBpZCA9IG1vZGVsW3BrUHJvcF07XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgc2VncmVnYXRlZDogY29sbGVjdGlvbixcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkIGFzIGFueSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNYXkgYWxyZWFkeSBiZSBkZWxldGVkIGJ5IGFkYXB0ZXIuZGVsZXRlU2VncmVnYXRlZENvbGxlY3Rpb25zXG4gICAgfVxuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gZGVsZXRlZDogJHtTdHJpbmcoaWQpfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pcnJvcldyaXRlR3VhcmQ8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG4gIGlmICghbXNwKSByZXR1cm47XG4gIGlmIChtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgIGBPcmdhbml6YXRpb24gJHttc3B9IGlzIG5vdCBhdXRob3JpemVkIHRvIG1vZGlmeSBtaXJyb3JlZCBkYXRhYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG5cbiAgaWYgKCFtc3ApIHJldHVybjtcblxuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IG1hdGNoZXMgPSBtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgcmVhZDogTVNQICR7bXNwfSBtYXRjaGVzLCByb3V0aW5nIHJlYWRzIHRvIG1pcnJvciBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn1gXG4gICAgKTtcbiAgICAvLyBSb3V0ZSByZWFkcyBleGNsdXNpdmVseSB0aHJvdWdoIHRoZSBtaXJyb3IgY29sbGVjdGlvblxuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgICBmYWJyaWNDdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICAgIGZhYnJpY0N0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbiAgfVxuICAvLyBXaGVuIE1TUCBkb2VzIE5PVCBtYXRjaCwgbm9ybWFsIHJlYWQgZmxvdyDigJQgYWxsIGRhdGEgaXMgaW4gcHVibGljIHN0YXRlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXJyb3IoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgbXNwSWRPckNvbmRpdGlvbj86IHN0cmluZyB8IE1pcnJvckNvbmRpdGlvbixcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uXG4pIHtcbiAgY29uc3QgaXNDb25kaXRpb25Pbmx5ID1cbiAgICB0eXBlb2YgbXNwSWRPckNvbmRpdGlvbiAhPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1zcElkT3JDb25kaXRpb24pO1xuICBjb25zdCBtc3BJZCA9IGlzQ29uZGl0aW9uT25seVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAobXNwSWRPckNvbmRpdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICBjb25zdCBjb25kID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyAobXNwSWRPckNvbmRpdGlvbiBhcyBNaXJyb3JDb25kaXRpb24pXG4gICAgOiBjb25kaXRpb247XG5cbiAgZnVuY3Rpb24gbWlycm9yKFxuICAgIHJlc29sdmVyOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogTWlycm9yTWV0YWRhdGEgPSB7XG4gICAgICBjb25kaXRpb246IGNvbmRpdGlvbixcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICAgIHJlc29sdmVyOiByZXNvbHZlcixcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUiksXG4gICAgICAgIG1ldGFcbiAgICAgICksXG4gICAgICAvLyBSZWFkIGhhbmRsZXIgcnVucyBlYXJseSAocHJpb3JpdHkgMzApIHRvIHNldCB1cCBjb250ZXh0IGJlZm9yZSBhbnkgcmVhZHNcbiAgICAgIG9uUmVhZChyZWFkTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDMwIH0pLFxuICAgICAgLy8gV3JpdGUgZ3VhcmRzIOKAlCByZWplY3QgbWF0Y2hpbmcgTVNQcyBiZWZvcmUgYW55IHByb2Nlc3NpbmdcbiAgICAgIG9uQ3JlYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uVXBkYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uRGVsZXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIC8vIE1pcnJvciBzeW5jIGhhbmRsZXJzIOKAlCB3cml0ZSBmdWxsIG1vZGVsIGFmdGVyIG90aGVyIGhhbmRsZXJzIChwcmlvcml0eSAxMDApXG4gICAgICBvbkNyZWF0ZShjcmVhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25VcGRhdGUodXBkYXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KSxcbiAgICAgIG9uRGVsZXRlKGRlbGV0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1pcnJvcixcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uLCBtc3BJZCwgY29uZF0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcD86IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbikgPT4gc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTW9kZWxDb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWQ/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBvcmdOYW1lID1cbiAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgKTtcbiAgcmV0dXJuIGAke3RvUGFzY2FsQ2FzZShjb25zdHIubmFtZSl9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5hbWVzcGFjZUNvbGxlY3Rpb24obmFtZXNwYWNlOiBzdHJpbmcpOiBDb2xsZWN0aW9uUmVzb2x2ZXIge1xuICByZXR1cm4gPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPiwgbXNwSWQ/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBvcmdOYW1lID1cbiAgICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG4gICAgaWYgKCFvcmdOYW1lKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke2NvbnN0ci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICAgKTtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfSR7b3JnTmFtZSA/IHRvUGFzY2FsQ2FzZShvcmdOYW1lKSA6IFwiXCJ9YDtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYF9fJHt0b1Bhc2NhbENhc2Uob3JnTmFtZSl9UHJpdmF0ZUNvbGxlY3Rpb25gO1xufTtcblxuZXhwb3J0IHR5cGUgU2VncmVnYXRlZERhdGFNZXRhZGF0YSA9IHtcbiAgY29sbGVjdGlvbnM6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW9yaXR5IGZvciBlYXJseSBjb2xsZWN0aW9uIGV4dHJhY3Rpb24gKGJlZm9yZSBwayBnZW5lcmF0aW9uIGF0IHByaW9yaXR5IDYwKVxuICogQHN1bW1hcnkgVGhpcyBwcmlvcml0eSBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgYmVmb3JlIGFueSBzZXF1ZW5jZVxuICogb3BlcmF0aW9ucyBvY2N1ciwgYWxsb3dpbmcgc2VxdWVuY2VzIHRvIGJlIHJlcGxpY2F0ZWQgdG8gcHJpdmF0ZS9zaGFyZWQgY29sbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSA9IDM1O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZWdyZWdhdGlvbkZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBNLFxuICBjb2xsZWN0aW9uczogc3RyaW5nW10sXG4gIGN0eDogYW55XG4pIHtcbiAgLy8gUmVnaXN0ZXIgY29sbGVjdGlvbnMgZWFybHkgdXNpbmcgcmVhZEZyb20gLSB0aGlzIGFsbG93cyBzZXF1ZW5jZSBjb2RlXG4gIC8vIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvIGR1cmluZyBwayBnZW5lcmF0aW9uXG4gIGlmIChjb2xsZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgKGN0eCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb25zKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG1vZGVsIGlzIGZ1bGx5IHNlZ3JlZ2F0ZWQgKGFsbCBub24tcGsgcHJvcGVydGllcyBhcmUgcHJpdmF0ZS9zaGFyZWQvdHJhbnNpZW50KS5cbiAgLy8gVXNlIE1vZGVsLnNlZ3JlZ2F0ZSgpIHdoaWNoIGlzIHRoZSBjYW5vbmljYWwgd2F5IHRvIGRldGVybWluZSB3aGF0J3MgdHJhbnNpZW50LFxuICAvLyByYXRoZXIgdGhhbiByZWFkaW5nIERCS2V5cy5UUkFOU0lFTlQgbWV0YWRhdGEgd2hpY2ggbWF5IG5vdCBhY2N1bXVsYXRlIGNvcnJlY3RseVxuICAvLyB3aGVuIGNsYXNzLWxldmVsIEBwcml2YXRlRGF0YSBhcHBsaWVzIGRlY29yYXRvcnMgaXRlcmF0aXZlbHkuXG4gIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgIGlmICghaGFzUHVibGljUHJvcGVydGllcyhjbGF6ei5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPikpIHtcbiAgICAgIGN0eC5tYXJrRnVsbHlTZWdyZWdhdGVkKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU1pcnJvckZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4pIHtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQoY2xhenopO1xuICBpZiAoIW1pcnJvck1ldGEpIHJldHVybjtcbiAgY29uc3QgbWF0Y2hlcyA9XG4gICAgbXNwID09PSBtaXJyb3JNZXRhLm1zcElkIHx8XG4gICAgKG1pcnJvck1ldGEuY29uZGl0aW9uICYmIG1pcnJvck1ldGEuY29uZGl0aW9uKG1zcCkpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybjtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShcbiAgICBuZXcgY2xhenooKSxcbiAgICBtaXJyb3JNZXRhLnJlc29sdmVyLFxuICAgIGN0eFxuICApO1xuICAvLyBNaXJyb3IgTVNQIG1hdGNoZXMg4oCUIHJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvclxuICAvLyBjb2xsZWN0aW9uLiBDbGVhciBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkIGNvbGxlY3Rpb25zIHNvIHF1ZXJpZXNcbiAgLy8gZ28gT05MWSB0byB0aGUgbWlycm9yLCBub3QgdG8gdGhlIHJlZ3VsYXIgcHJpdmF0ZS9zaGFyZWQgb25lcy5cbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRcIiwgdW5kZWZpbmVkKTtcbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgY3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICBjdHgucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGhhc1B1YmxpY1Byb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihjbGF6ejogQ29uc3RydWN0b3I8TT4pOiBib29sZWFuIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMoY2xhenopIHx8IFtdO1xuICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgY29uc3QgdHJhbnNpZW50TWV0YSA9IE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICBjb25zdCBwcml2YXRlTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKSkgfHwge307XG4gIGNvbnN0IHNoYXJlZE1ldGEgPVxuICAgIE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuU0hBUkVEKSkgfHwge307XG5cbiAgcmV0dXJuIGF0dHJpYnV0ZXMuc29tZSgoYXR0cikgPT4ge1xuICAgIGlmIChhdHRyID09PSBwaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHRyYW5zaWVudE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiBwcml2YXRlTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHNoYXJlZE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVhcmx5IGhhbmRsZXIgdG8gZXh0cmFjdCBhbmQgcmVnaXN0ZXIgY29sbGVjdGlvbnMgaW4gY29udGV4dFxuICogQHN1bW1hcnkgUnVucyB3aXRoIHByaW9yaXR5IDwgNDAgdG8gZXh0cmFjdCBjb2xsZWN0aW9uIG5hbWVzIGJlZm9yZSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MCkuXG4gKiBUaGlzIGFsbG93cyBGYWJyaWNDb250cmFjdFNlcXVlbmNlIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvLlxuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtDb250ZXh0T2Y8UmVwb3NpdG9yeTxNLCBhbnk+Pn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdfSBkYXRhIC0gVGhlIHNlZ3JlZ2F0ZWQgZGF0YSBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0ga2V5cyAtIFRoZSBwcm9wZXJ0eSBrZXkocykgYmVpbmcgc2VncmVnYXRlZFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuXG4gIGNvbnN0IG0gPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZVxuICAgICAgPyBjb250ZXh0LmdldE9yVW5kZWZpbmVkKFwib3duZXJPdmVycmlkZVwiKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbXNwID1cbiAgICBtIHx8IE1vZGVsLm93bmVyT2YobW9kZWwpIHx8IGV4dHJhY3RNc3BJZChjb250ZXh0LmdldChcImlkZW50aXR5XCIpKTtcblxuICBpZiAoIW1zcCkge1xuICAgIC8vIENhbid0IGV4dHJhY3QgY29sbGVjdGlvbnMgd2l0aG91dCBNU1AsIHdpbGwgYmUgY2F1Z2h0IGJ5IGxhdGVyIGhhbmRsZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgZGF0YUFycmF5KSB7XG4gICAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gbWV0YWRhdGEuY29sbGVjdGlvbnM7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjb2xsZWN0aW9uICYmICFjb2xsZWN0aW9ucy5pbmNsdWRlcyhjb2xsZWN0aW9uKSkge1xuICAgICAgY29sbGVjdGlvbnMucHVzaChjb2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgYXBwbHlTZWdyZWdhdGlvbkZsYWdzKG1vZGVsLCBjb2xsZWN0aW9ucywgY29udGV4dCk7XG5cbiAgLy8gU3RvcmUgc2VncmVnYXRpb24gbWV0YWRhdGEgcGVyLXNlcXVlbmNlIHNvIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgY2FuIGRlY2lkZVxuICAvLyB3aGVyZSB0byBzdG9yZS9yZXBsaWNhdGUgc2VxdWVuY2UgcmVjb3JkcyAocHVibGljIHZzIHByaXZhdGUvc2hhcmVkKS5cbiAgLy9cbiAgLy8gLSBgQHBrKClgIHNlcXVlbmNlcyB1c2UgdGhlIHNoYXJlZCBuYW1lIGAke3RhYmxlfV9wa2AgKG5vIGlkIGNvbXBvbmVudCkuXG4gIC8vIC0gYEBzZXF1ZW5jZSgpYCAvIHBlcnNpc3RlbnQgYEB2ZXJzaW9uKHRydWUpYCBzZXF1ZW5jZXMgYXJlIHBlci1tb2RlbC1pbnN0YW5jZTpcbiAgLy8gICBgJHt0YWJsZX1fJHtpZH1fJHtwcm9wZXJ0eX1gLlxuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGNvbnN0IHBrS2V5ID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSBhcyBrZXlvZiBNO1xuICBjb25zdCBwa1NlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG5cbiAgY29uc3QgaWRWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3BrS2V5IGFzIGFueV07XG4gIGNvbnN0IGNhbkJ1aWxkUGVySW5zdGFuY2UgPVxuICAgIHR5cGVvZiBpZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmIGlkVmFsdWUgIT09IG51bGw7XG5cbiAgLy8gQWx3YXlzIHVuaW9uIGNvbGxlY3Rpb25zIGZvciB0aGUgcGsgc2VxdWVuY2Ugd2hlbiB0aGUgbW9kZWwgdXNlcyBzZWdyZWdhdGVkIGRhdGEuXG4gIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICBwa1NlcU5hbWUsXG4gICAgKGNvbnRleHQgYXMgYW55KS5pc0Z1bGx5U2VncmVnYXRlZCxcbiAgICBjb2xsZWN0aW9uc1xuICApO1xuXG4gIC8vIEZvciBwZXItcHJvcGVydHkgc2VxdWVuY2VzLCBvbmx5IHJlZ2lzdGVyIHdoZW4gd2UgY2FuIGNvbXB1dGUgYW4gaWQtc2NvcGVkIG5hbWUuXG4gIC8vIFRoaXMga2VlcHMgc2VxdWVuY2VzIGNvbnN0cmFpbmVkIHRvIHRoZSBjb2xsZWN0aW9ucyB0aGUgYXR0cmlidXRlIGV4aXN0cyBpbi5cbiAgaWYgKGNhbkJ1aWxkUGVySW5zdGFuY2UpIHtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5QXJyYXkpIHtcbiAgICAgIGNvbnN0IHByb3BTZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKG1vZGVsLCBTdHJpbmcoaWRWYWx1ZSksIFN0cmluZyhrKSk7XG4gICAgICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgICAgIHByb3BTZXFOYW1lLFxuICAgICAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgICAgICBjb2xsZWN0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIC8vIFZhbGlkYXRlIGFsbCBrZXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sbGVjdGlvblxuICBrZXlBcnJheS5mb3JFYWNoKChfaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSBrZXlBcnJheS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgc2VncmVnYXRlZCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHwgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgZXh0cmFjdE1zcElkKGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikpO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBhd2FpdCBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb2xkTW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAga2V5QXJyYXkuZm9yRWFjaCgoaywgaSkgPT4ge1xuICAgIGNvbnN0IGMgPVxuICAgICAgdHlwZW9mIGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICA6IGRhdGFBcnJheVtpXS5jb2xsZWN0aW9ucyhtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBgU2VncmVnYXRlZCBkYXRhIGNvbGxlY3Rpb24gbWlzbWF0Y2g6ICR7Y30gdnMgJHtjb2xsZWN0aW9ufWBcbiAgICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGtleVN0cmluZ3MgPSAoa2V5QXJyYXkgYXMgKGtleW9mIE0pW10pLm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlbCDigJQgcHJlcGFyZSgpIHdpbGwgZmlsdGVyIHRvIGNvbGxlY3Rpb24tc3BlY2lmaWMgZmllbGRzXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkud3JpdGVUbyhjb2xsZWN0aW9uLCBrZXlTdHJpbmdzKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55PixcbiAgViBleHRlbmRzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYgfCBWW10sXG4gIGtleTogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdKSBhcyBWW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleSA6IFtrZXldKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHxcbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gc2VncmVnYXRlZChcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyLFxuICB0eXBlOiBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSB8IEZhYnJpY01vZGVsS2V5cy5TSEFSRUQsXG4gIGZpbHRlcj86IChwcm9wTmFtZTogc3RyaW5nKSA9PiBib29sZWFuXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyU2VncmVnYXRlZCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBzZWdyZWdhdGVkRGVjKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgICAgY29uc3Qga2V5ID0gTWV0YWRhdGEua2V5KHR5cGUsIHByb3BlcnR5S2V5KTtcbiAgICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3IgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I7XG5cbiAgICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXkpIHx8IHt9O1xuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBuZXcgU2V0KG1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgbWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBrZXksIG1ldGEpO1xuXG4gICAgICBjb25zdCBjb25zdHJNZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSkgfHwge307XG4gICAgICBjb25zdCBjb25zdHJDb2xsZWN0aW9ucyA9IG5ldyBTZXQoY29uc3RyTWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb25zdHJDb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBjb25zdHJNZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbnN0ckNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUsIGNvbnN0ck1ldGEpO1xuXG4gICAgICBjb25zdCB0cmFuc2llbnRNZXRhID1cbiAgICAgICAgTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gICAgICBjb25zdCB1cGRhdGVkVHJhbnNpZW50TWV0YSA9IHtcbiAgICAgICAgLi4udHJhbnNpZW50TWV0YSxcbiAgICAgICAgW3Byb3BlcnR5S2V5IGFzIGFueV06IHt9LFxuICAgICAgfTtcbiAgICAgIE1ldGFkYXRhLnNldChcbiAgICAgICAgY29uc3RyIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBEQktleXMuVFJBTlNJRU5ULFxuICAgICAgICB1cGRhdGVkVHJhbnNpZW50TWV0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNzOiBhbnlbXSA9IFtdO1xuICAgIGlmICghcHJvcGVydHlLZXkpIHtcbiAgICAgIC8vIGRlY29yYXRlZCBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBNZXRhZGF0YS5nZXRBdHRyaWJ1dGVzKHRhcmdldCBhcyBDb25zdHJ1Y3Rvcik7XG4gICAgICBwcm9wZXJ0aWVzPy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihwKSkge1xuICAgICAgICAgIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgdHlwZSkoKHRhcmdldCBhcyBhbnkpLnByb3RvdHlwZSwgcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JvdXBOYW1lID1cbiAgICAgICAgdHlwZW9mIGNvbGxlY3Rpb24gPT09IFwic3RyaW5nXCIgPyBjb2xsZWN0aW9uIDogY29sbGVjdGlvbi50b1N0cmluZygpO1xuICAgICAgLy8gVXNlIGRpZmZlcmVudCBncm91cCBuYW1lcyBmb3IgZXh0cmFjdGlvbiB2cyBkYXRhIGhhbmRsZXJzIHRvIHByZXZlbnQgbWVyZ2luZ1xuICAgICAgY29uc3QgZXh0cmFjdEdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZXh0cmFjdGA7XG4gICAgICBjb25zdCBkYXRhR3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpkYXRhYDtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbk1ldGEgPSB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH07XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnQgPSB7XG4gICAgICAgIHByaW9yaXR5OiBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSxcbiAgICAgICAgZ3JvdXA6IGV4dHJhY3RHcm91cE5hbWUsXG4gICAgICB9O1xuICAgICAgZGVjcy5wdXNoKFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHRyYW5zaWVudCgpLFxuICAgICAgICBzZWdyZWdhdGVkRGVjLFxuICAgICAgICAvLyBFYXJseSBleHRyYWN0aW9uIGhhbmRsZXJzIC0gcnVuIEJFRk9SRSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MClcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgZm9yIHNlcXVlbmNlIHJlcGxpY2F0aW9uXG4gICAgICAgIC8vIFdlIHJlZ2lzdGVyIGZvciBlYWNoIG9wZXJhdGlvbiBleHBsaWNpdGx5IHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxlciBsb29rdXBcbiAgICAgICAgb24oXG4gICAgICAgICAgREJPcGVyYXRpb25zLkFMTCxcbiAgICAgICAgICBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIGFzIGFueSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25NZXRhLFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydFxuICAgICAgICApLFxuICAgICAgICAvLyBNYWluIGhhbmRsZXJzIGZvciBzZWdyZWdhdGVkIGRhdGEgb3BlcmF0aW9ucyAocHJpb3JpdHkgOTUpXG4gICAgICAgIG9uQ3JlYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUsXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25SZWFkKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25SZWFkIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblVwZGF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvbkRlbGV0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIGFzIGFueSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHkoLi4uZGVjcykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRGF0YShcbiAgY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyID0gSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvblxuKSB7XG4gIGZ1bmN0aW9uIHByaXZhdGVEYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuUFJJVkFURSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogcHJpdmF0ZURhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gIGZ1bmN0aW9uIHNoYXJlZERhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlNIQVJFRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogc2hhcmVkRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBKU09OU2VyaWFsaXplcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzb3J0cyBvYmplY3Qga2V5cyB3aXRob3V0IHJlb3JkZXJpbmcgYXJyYXlzXG4gKiBAcGFyYW0ge2FueX0gb2JqIC0gVGhlIHZhbHVlIHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge2FueX0gQSBjb3B5IHdpdGggc29ydGVkIG9iamVjdCBrZXlzIGJ1dCBwcmVzZXJ2ZWQgYXJyYXkgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzT25seVJlY3Vyc2l2ZShvYmo6IGFueSk6IGFueSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoc29ydEtleXNPbmx5UmVjdXJzaXZlKTtcbiAgaWYgKG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSByZXR1cm4gb2JqO1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICAgIC5zb3J0KClcbiAgICAucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBzb3J0S2V5c09ubHlSZWN1cnNpdmUob2JqW2tleV0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluaXN0aWMgSlNPTiBzZXJpYWxpemVyIGZvciBGYWJyaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBFbnN1cmVzIHN0YWJsZSwgZGV0ZXJtaW5pc3RpYyBKU09OIG91dHB1dCBieSBzb3J0aW5nIG9iamVjdCBrZXlzIHJlY3Vyc2l2ZWx5IGJlZm9yZSBzdHJpbmdpZmljYXRpb24sIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgRmFicmljIGVuZG9yc2VtZW50IGFuZCBoYXNoaW5nLiBFeHRlbmRzIEpTT05TZXJpYWxpemVyIHRvIHBsdWcgaW50byBleGlzdGluZyBEZWNhZiBtb2RlbCBzZXJpYWxpemF0aW9uIGZsb3cuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBEZWNhZiBNb2RlbCBzdWJ0eXBlIHNlcmlhbGl6ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICogQHBhcmFtIHt2b2lkfSBbY29uc3RydWN0b3JdIE5vIHB1YmxpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAqIEBjbGFzcyBEZXRlcm1pbmlzdGljU2VyaWFsaXplclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8TXlNb2RlbD4oKTtcbiAqIGNvbnN0IGpzb24gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCk7XG4gKiBjb25zdCByZWJ1aWx0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShqc29uKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IERTIGFzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiAgIENhbGxlci0+PkRTOiBzZXJpYWxpemUobW9kZWwpXG4gKiAgIERTLT4+RFM6IHByZVNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogc29ydC1rZXlzLXJlY3Vyc2l2ZVxuICogICBEUy0+PkRTOiBqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXG4gKiAgIERTLS0+PkNhbGxlcjogc3RyaW5nXG4gKiAgIENhbGxlci0+PkRTOiBkZXNlcmlhbGl6ZShzdHJpbmcpXG4gKiAgIERTLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0pIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGNvbnN0IHByZVNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHByZVNlcmlhbGl6ZShcbiAgICAgIHRoaXM6IERldGVybWluaXN0aWNTZXJpYWxpemVyPGFueT4sXG4gICAgICBvYmo6IGFueVxuICAgICk6IGFueSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcCgobykgPT4gcHJlU2VyaWFsaXplLmNhbGwoc2VsZiwgbykpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplLmNhbGwodGhpcywgb2JqKTtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBNb2RlbC5yZWxhdGlvbnMobW9kZWwpLmZvckVhY2goKHIpID0+IHtcbiAgICAgIHRvU2VyaWFsaXplW3JdID0gcHJlU2VyaWFsaXplKHRvU2VyaWFsaXplW3JdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVidWlsZHMgYSBtb2RlbCBmcm9tIGEgc2VyaWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlscyB0byBwYXJzZSB0aGUgc3RyaW5nLCBvciB0byBidWlsZCB0aGUgbW9kZWxcbiAgICovXG4gIG92ZXJyaWRlIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcmlhbGl6ZSBhIG1vZGVsIGludG8gYSBkZXRlcm1pbmlzdGljIEpTT04gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCB3aXRoIHByZVNlcmlhbGl6ZSwgc29ydHMga2V5cyByZWN1cnNpdmVseSwgYW5kIHN0cmluZ2lmaWVzIGRldGVybWluaXN0aWNhbGx5IGZvciBzdGFibGUgb3JkZXJpbmdcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSBEZXRlcm1pbmlzdGljIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqL1xuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgRmFicmljIGV2ZW50IG5hbWUgZnJvbSBjb21wb25lbnRzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IG5hbWUgYnkgam9pbmluZyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lciB3aXRoIHVuZGVyc2NvcmVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvY29sbGVjdGlvbiBuYW1lXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3duZXJdIC0gT3B0aW9uYWwgb3duZXIgaWRlbnRpZmllclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGV2ZW50IG5hbWUgaW4gZm9ybWF0IFwidGFibGVfZXZlbnRcIiBvciBcInRhYmxlX2V2ZW50X293bmVyXCJcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICBvd25lcj86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0YWJsZSwgZXZlbnRdO1xuICBpZiAob3duZXIpIHBhcmFtcy5wdXNoKG93bmVyKTtcbiAgcmV0dXJuIHBhcmFtcy5qb2luKFwiX1wiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgRmFicmljIGV2ZW50IG5hbWUgaW50byBpdHMgY29tcG9uZW50c1xuICogQHN1bW1hcnkgU3BsaXRzIGFuIGV2ZW50IG5hbWUgYnkgdW5kZXJzY29yZXMgYW5kIGV4dHJhY3RzIHRhYmxlLCBldmVudCwgYW5kIG9wdGlvbmFsIG93bmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBldmVudCBuYW1lIHRvIHBhcnNlXG4gKiBAcmV0dXJuIHt7dGFibGU6IHN0cmluZywgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsIG93bmVyOiBzdHJpbmd9fSBUaGUgcGFyc2VkIGNvbXBvbmVudHMgYXMgYSBzdHJ1Y3R1cmVkIG9iamVjdFxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIGV2ZW50IG5hbWUgZm9ybWF0IGlzIGludmFsaWRcbiAqIEBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIHBhcnNlRXZlbnROYW1lXG4gKiAgIENhbGxlci0+PlBhcnNlcjogcGFyc2VFdmVudE5hbWUobmFtZSlcbiAqICAgUGFyc2VyLT4+UGFyc2VyOiBzcGxpdCBuYW1lIGJ5IFwiX1wiXG4gKiAgIGFsdCBwYXJ0cyBsZW5ndGggaW52YWxpZFxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAqICAgZWxzZVxuICogICAgIFBhcnNlci0tPj5DYWxsZXI6IHsgdGFibGUsIGV2ZW50LCBvd25lcj8gfVxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXZlbnROYW1lKG5hbWU6IHN0cmluZyk6IHtcbiAgdGFibGU/OiBzdHJpbmc7XG4gIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICBvd25lcj86IHN0cmluZztcbn0ge1xuICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoXCJfXCIpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKVxuICAgIHJldHVybiB7IHRhYmxlOiB1bmRlZmluZWQsIGV2ZW50OiBuYW1lLCBvd25lcjogdW5kZWZpbmVkIH07XG4gIHJldHVybiB7XG4gICAgdGFibGU6IHBhcnRzWzBdLFxuICAgIGV2ZW50OiBwYXJ0c1sxXSxcbiAgICBvd25lcjogcGFydHNbMl0sXG4gIH0gYXMge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc7XG4gICAgb3duZXI/OiBzdHJpbmc7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBhZGRpdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IEFkZHMgdHdvIG51bWJlcnMgYW5kIHZlcmlmaWVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIEZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBhZGRpdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgKyBiO1xuICBpZiAoYSAhPT0gYyAtIGIgfHwgYiAhPT0gYyAtIGEpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgQWRkaXRpb24gb3ZlcmZsb3c6ICR7YX0gKyAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgc3VidHJhY3Rpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdHMgYiBmcm9tIGEgYW5kIHZhbGlkYXRlcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNaW51ZW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFN1YnRyYWhlbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpZmZlcmVuY2UgYSAtIGJcbiAqIEBmdW5jdGlvbiBzdWJcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIHN1YnRhY3Rpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhIC0gYjtcbiAgaWYgKGEgIT09IGMgKyBiIHx8IGIgIT09IGEgLSBjKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYFN1YnRyYWN0aW9uIG92ZXJmbG93OiAke2F9IC0gJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNhZmUgSW50ZWdlciBQYXJzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2FmZVBhcnNlSW50XG4gKlxuICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBpZiBwYXJzZUludCByZXR1cm5zIE5hTlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZUludChzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBzdHJpbmcgb25seSBoYXZlIGRpZ2l0c1xuICBjb25zdCBkaWdpdFJlZ2V4ID0gL15cXGQrJC87XG4gIGlmICghZGlnaXRSZWdleC50ZXN0KHN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgY29udGFpbnMgZGlnaXRzXCIpXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXJzZWRpbnQgPSBwYXJzZUludChzdHJpbmcpO1xuICBpZiAoaXNOYU4ocGFyc2VkaW50KSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBpcyBub3QgYSBwYXJzYWJsZSBpbnRlZ2VyXCIpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkaW50O1xufVxuIiwiaW1wb3J0IHtcbiAgSlNPTlNlcmlhbGl6ZXIsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgc29ydEtleXNPbmx5UmVjdXJzaXZlIH0gZnJvbSBcIi4vRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4+IGV4dGVuZHMgSlNPTlNlcmlhbGl6ZXI8TT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZywgdGFibGVOYW1lPzogc3RyaW5nKTogTSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIC8vIGNvbnN0IGNsYXNzTmFtZSA9IHRhYmxlTmFtZTtcbiAgICAvLyBpZiAoIWNsYXNzTmFtZSlcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuXG4gICAgLy8gLy8gdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWQgdmFsdWVzXG4gICAgLy8gY29uc3QgbW9kZWw6IE0gPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gLy8gUG9wdWxhdGUgTW9kZWxcbiAgICAvLyBjb25zdCBwcm9jZXNzZWREZXNlYWxpemF0aW9uID0gT2JqZWN0LmtleXMobW9kZWwpLnJlZHVjZShcbiAgICAvLyAgIChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgLy8gICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAvLyAgICAgICBkZXNlcmlhbGl6YXRpb25bUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgIC8vICAgICByZXR1cm4gYWNjdW07XG4gICAgLy8gICB9LFxuICAgIC8vICAgbW9kZWxcbiAgICAvLyApO1xuXG4gICAgLy8gY29uc3QgcmVzdWx0ID0gTW9kZWwuYnVpbGQoXG4gICAgLy8gICBwcm9jZXNzZWREZXNlYWxpemF0aW9uLFxuICAgIC8vICAgY2xhc3NOYW1lXG4gICAgLy8gKSBhcyB1bmtub3duIGFzIE07XG5cbiAgICAvLyByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBkZXNlcmlhbGl6YXRpb247XG4gIH1cblxuICBvdmVycmlkZSBzZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvciA9IHRydWUpOiBzdHJpbmcge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZShcImpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcIik7XG4gICAgY29uc3QgcHJlU2VyaWFsaXphdGlvbiA9IHRoaXMucHJlU2VyaWFsaXplKG1vZGVsLCBwdXRBbmNob3IpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNPbmx5UmVjdXJzaXZlKHByZVNlcmlhbGl6YXRpb24pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVTZXJpYWxpemUobW9kZWw6IE0sIHB1dEFuY2hvcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIC8vIFRPRE86IFZlcmlmeSB3aHkgdGhlcmUgaXMgbm8gbWV0YWRhdGFcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBsZXQgbWV0YWRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEubW9kZWxOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwdXRBbmNob3IpXG4gICAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBmdW5jdGlvbiBwcmVTZXJpYWxpemUoXG4gICAgICB0aGlzOiBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxhbnk+LFxuICAgICAgb2JqOiBhbnlcbiAgICApOiBhbnkge1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLm1hcChwcmVTZXJpYWxpemUpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlU2VyaWFsaXplKG9iaik7XG4gICAgfVxuICAgIE1vZGVsLnJlbGF0aW9ucyhtb2RlbCkuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdG9TZXJpYWxpemVbcl0gPSBwcmVTZXJpYWxpemUuY2FsbCh0aGlzLCB0b1NlcmlhbGl6ZVtyXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIENsaWVudEJhc2VkU2VydmljZSxcbiAgQ29udGV4dCxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBQZXJzaXN0ZW5jZUtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IEZhYnJpY0NBU2VydmljZXMsIHtcbiAgQWZmaWxpYXRpb25TZXJ2aWNlLFxuICBJQXR0cmlidXRlUmVxdWVzdCxcbiAgSWRlbnRpdHlTZXJ2aWNlLFxuICBJRW5yb2xsUmVzcG9uc2UsXG4gIElJZGVudGl0eVJlcXVlc3QsXG4gIElSZWdpc3RlclJlcXVlc3QsXG4gIElSZXZva2VSZXF1ZXN0LFxuICBJU2VydmljZVJlc3BvbnNlLFxuICBUTFNPcHRpb25zLFxufSBmcm9tIFwiZmFicmljLWNhLWNsaWVudFwiO1xuaW1wb3J0IHsgQ0FDb25maWcsIENyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb3JlVXRpbHMsIGdldEFraUFuZFNlcmlhbEZyb21DZXJ0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBDZXJ0aWZpY2F0ZVJlc3BvbnNlLFxuICBGYWJyaWNJZGVudGl0eSxcbiAgR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgSWRlbnRpdHlSZXNwb25zZSxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9mYWJyaWMtdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgQ0FfUk9MRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSUtleVZhbHVlQXR0cmlidXRlIH0gZnJvbSBcIi4vRmFicmljRW5yb2xsbWVudFNlcnZpY2VcIjtcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi4vY3J5cHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNJZGVudGl0eVNlcnZpY2UgZXh0ZW5kcyBDbGllbnRCYXNlZFNlcnZpY2U8XG4gIEZhYnJpY0NBU2VydmljZXMsXG4gIENBQ29uZmlnXG4+IHtcbiAgcHJvdGVjdGVkIF91c2VyITogVXNlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByb290Q2xpZW50KCk6IHsgbmV3Q2VydGlmaWNhdGVTZXJ2aWNlOiBhbnkgfSB7XG4gICAgcmV0dXJuICh0aGlzLmNsaWVudCBhcyBhbnkpW1wiX0ZhYnJpY0NhU2VydmljZXNcIl0gYXMgYW55O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1c2VyKCk6IFVzZXIge1xuICAgIGlmICghdGhpcy5fdXNlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIkZhYnJpYyBpZGVudGl0eSBzZXJ2aWNlIG5vdCBwcm9wZXJseSBzZXR1cDogbWlzc2luZyB1c2VyXCJcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNlcnRpZmljYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q2xpZW50Lm5ld0NlcnRpZmljYXRlU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhZmZpbGlhdGlvbnMoKTogQWZmaWxpYXRpb25TZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3QWZmaWxpYXRpb25TZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlkZW50aXRpZXMoKTogSWRlbnRpdHlTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VXNlcihjZmc6IENBQ29uZmlnLCBjdHg6IENvbnRleHQpIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcih0aGlzLmdldFVzZXIpO1xuICAgIGNvbnN0IHsgY2FOYW1lLCBjYUNlcnQsIGNhS2V5LCB1cmwsIGhzbSB9ID0gY2ZnO1xuXG4gICAgbG9nLmluZm8oYENyZWF0aW5nIENBIHVzZXIgZm9yICR7Y2FOYW1lfSBhdCAke3VybH1gKTtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7Y2FDZXJ0fWApO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhQ2VydCk7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaHNtKSB7XG4gICAgICBpZiAoIWNhS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIGNhS2V5IGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfS4gUHJvdmlkZSBhIGtleSBkaXJlY3Rvcnkgb3IgY29uZmlndXJlIEhTTSBzdXBwb3J0LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBrZXkgZnJvbSAke2NhS2V5fWApO1xuICAgICAga2V5ID0gYXdhaXQgQ29yZVV0aWxzLmdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KGNhS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgVXNpbmcgSFNNIGNvbmZpZ3VyYXRpb24gZm9yIENBICR7Y2FOYW1lfSB3aXRoIGxpYnJhcnkgJHtoc20ubGlicmFyeX1gXG4gICAgICApO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYExvYWRpbmcgQWRtaW4gdXNlciBmb3IgY2EgJHtjYU5hbWV9YCk7XG4gICAgdGhpcy5fdXNlciA9IGF3YWl0IENvcmVVdGlscy5nZXRDQVVzZXIoXCJhZG1pblwiLCBrZXksIGNlcnRpZmljYXRlLCBjYU5hbWUsIHtcbiAgICAgIGhzbSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTx7IGNvbmZpZzogQ0FDb25maWc7IGNsaWVudDogRmFicmljQ0FTZXJ2aWNlcyB9PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKFxuICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLklOSVRJQUxJWkFUSU9OLCB0cnVlKVxuICAgICkuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3QgW2NvbmZpZ10gPSBhcmdzO1xuICAgIGlmICghY29uZmlnKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgRmFicmljIENBIGNvbmZpZ3VyYXRpb25cIik7XG5cbiAgICBjb25zdCB7IHVybCwgdGxzLCBjYU5hbWUgfSA9IGNvbmZpZztcbiAgICBsb2cuaW5mbyhgSW5pdGlhbGl6aW5nIENBIENsaWVudCBmb3IgQ0EgJHtjb25maWcuY2FOYW1lfSBhdCAke2NvbmZpZy51cmx9YCk7XG4gICAgY29uc3QgeyB0cnVzdGVkUm9vdHMsIHZlcmlmeSB9ID0gdGxzIGFzIFRMU09wdGlvbnM7XG5cbiAgICBjb25zdCByb290ID0gKHRydXN0ZWRSb290cyBhcyBzdHJpbmdbXSlbMF0gYXMgc3RyaW5nO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyBDQSBjZXJ0aWZpY2F0ZSBmcm9tICR7cm9vdH0uIGN3ZDogJHtwcm9jZXNzLmN3ZCgpfWApO1xuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCBDb3JlVXRpbHMuZ2V0RmlsZUNvbnRlbnQocm9vdCk7XG5cbiAgICBsb2cuZGVidWcoYENBIENlcnRpZmljYXRlOiAke2NlcnRpZmljYXRlLnRvU3RyaW5nKCl9YCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgRmFicmljQ0FTZXJ2aWNlcyhcbiAgICAgIHVybCxcbiAgICAgIHtcbiAgICAgICAgdHJ1c3RlZFJvb3RzOiBCdWZmZXIuZnJvbShjZXJ0aWZpY2F0ZSksXG4gICAgICAgIHZlcmlmeSxcbiAgICAgIH0gYXMgVExTT3B0aW9ucyxcbiAgICAgIGNhTmFtZVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyKGNvbmZpZywgY3R4KTtcbiAgICBsb2cuZGVidWcoYENBIHVzZXIgbG9hZGVkOiAke3VzZXIuZ2V0TmFtZSgpfWApO1xuICAgIHJldHVybiB7XG4gICAgICBjb25maWcsXG4gICAgICBjbGllbnQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldENlcnRpZmljYXRlcyguLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55Pik6IFByb21pc2U8c3RyaW5nW10+O1xuICBhc3luYyBnZXRDZXJ0aWZpY2F0ZXMoXG4gICAgcmVxdWVzdDogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgYXN5bmMgZ2V0Q2VydGlmaWNhdGVzPE1BUCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0OiBHZXRDZXJ0aWZpY2F0ZXNSZXF1ZXN0LFxuICAgIGRvTWFwOiBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT47XG4gIGFzeW5jIGdldENlcnRpZmljYXRlczxNQVAgZXh0ZW5kcyBib29sZWFuPihcbiAgICByZXF1ZXN0PzogR2V0Q2VydGlmaWNhdGVzUmVxdWVzdCB8IE1BUCxcbiAgICBkb01hcDogTUFQID0gdHJ1ZSBhcyBNQVAsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxNQVAgZXh0ZW5kcyBmYWxzZSA/IENlcnRpZmljYXRlUmVzcG9uc2UgOiBzdHJpbmdbXT4ge1xuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgYXJncyA9IFtyZXF1ZXN0XTtcbiAgICAgIGRvTWFwID0gdHJ1ZSBhcyBNQVA7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBkb01hcCA9IHJlcXVlc3Q7XG4gICAgICByZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvTWFwICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgYXJncyA9IFtkb01hcCBhcyBNYXliZUNvbnRleHR1YWxBcmc8YW55PiwgLi4uYXJnc107XG4gICAgICBkb01hcCA9IHRydWUgYXMgTUFQO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5nZXRDZXJ0aWZpY2F0ZXNcbiAgICApO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIGNlcnRpZmljYXRlcyR7cmVxdWVzdCA/IGAgZm9yICR7cmVxdWVzdC5pZH1gIDogXCJcIn0gZm9yIENBICR7dGhpcy5jb25maWcuY2FOYW1lfWBcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBDZXJ0aWZpY2F0ZVJlc3BvbnNlID0gKFxuICAgICAgYXdhaXQgdGhpcy5jZXJ0aWZpY2F0ZXMuZ2V0Q2VydGlmaWNhdGVzKHJlcXVlc3QgfHwge30sIHRoaXMudXNlcilcbiAgICApLnJlc3VsdDtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtyZXNwb25zZS5jZXJ0cy5sZW5ndGh9IGNlcnRpZmljYXRlc2ApO1xuICAgIGxvZy5kZWJ1ZyhyZXNwb25zZS5jZXJ0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIGRvTWFwID8gcmVzcG9uc2UuY2VydHMubWFwKChjKSA9PiBjLlBFTSkgOiByZXNwb25zZVxuICAgICkgYXMgTUFQIGV4dGVuZHMgZmFsc2UgPyBDZXJ0aWZpY2F0ZVJlc3BvbnNlIDogc3RyaW5nW107XG4gIH1cblxuICBhc3luYyBnZXRJZGVudGl0aWVzKGN0eDogQ29udGV4dCk6IFByb21pc2U8RmFicmljSWRlbnRpdHlbXT4ge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuZ2V0SWRlbnRpdGllcyk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgSWRlbnRpdGllcyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZTogSWRlbnRpdHlSZXNwb25zZSA9IChhd2FpdCB0aGlzLmlkZW50aXRpZXMuZ2V0QWxsKHRoaXMudXNlcikpXG4gICAgICAucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmlkZW50aXRpZXMubGVuZ3RofSBJZGVudGl0aWVzYCk7XG4gICAgbG9nLmRlYnVnKHJlc3BvbnNlLmlkZW50aXRpZXMpO1xuICAgIHJldHVybiByZXNwb25zZS5pZGVudGl0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhZmZpbGlhdGlvbnMgZnJvbSB0aGUgQ0EuXG4gICAqIEBzdW1tYXJ5IFF1ZXJpZXMgdGhlIENBIGZvciB0aGUgbGlzdCBvZiBhZmZpbGlhdGlvbnMgYXZhaWxhYmxlIHVuZGVyIHRoZSBjb25maWd1cmVkIENBLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZmZpbGlhdGlvbnMgcmVzdWx0IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBnZXRBZmZpbGlhdGlvbnMoY3R4OiBDb250ZXh0KSB7XG4gICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IodGhpcy5nZXRBZmZpbGlhdGlvbnMpO1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIEFmZmlsaWF0aW9ucyB1bmRlciBDQSAke3RoaXMuY29uZmlnLmNhTmFtZX1gKTtcbiAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCB0aGlzLmFmZmlsaWF0aW9ucy5nZXRBbGwodGhpcy51c2VyKSkucmVzdWx0O1xuICAgIGxvZy52ZXJib3NlKGBGb3VuZCAke3Jlc3BvbnNlLmEubGVuZ3RofSBBZmZpbGlhdGlvbnNgKTtcbiAgICBsb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlOiBFcnJvcikge1xuICAgIGNvbnN0IHJlZ2V4cCA9IC8uKmNvZGU6XFxzKFxcZCspLio/bWVzc2FnZTpcXHNbXCInXSguKylbXCInXS9ncztcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGUubWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihlKTtcbiAgICBjb25zdCBbLCBjb2RlLCBtZXNzYWdlXSA9IG1hdGNoO1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBcIjc0XCI6XG4gICAgICBjYXNlIFwiNzFcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKG1lc3NhZ2UpO1xuICAgICAgY2FzZSBcIjIwXCI6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1lc3NhZ2UpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWQgaWRlbnRpdHkgZGV0YWlscyBmcm9tIHRoZSBDQSBieSBlbnJvbGxtZW50IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIHZhbGlkYXRlcyBhIHNpbmdsZSBpZGVudGl0eSwgdGhyb3dpbmcgTm90Rm91bmRFcnJvciB3aGVuIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnJvbGxtZW50SWQgLSBFbnJvbGxtZW50IElEIHRvIGxvb2t1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGYWJyaWNJZGVudGl0eT59IFRoZSBpZGVudGl0eSBkZXRhaWxzIHN0b3JlZCBpbiB0aGUgQ0EuXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxhbnk+XG4gICk6IFByb21pc2U8RmFicmljSWRlbnRpdHk+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVhZFxuICAgICk7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGxldCByZXN1bHQ6IElTZXJ2aWNlUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuaWRlbnRpdGllcy5nZXRPbmUoZW5yb2xsbWVudElkLCB0aGlzLnVzZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBDb3VsZG4ndCBmaW5kIGVucm9sbG1lbnQgd2l0aCBpZCAke2Vucm9sbG1lbnRJZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYENvdWxkbid0IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucmVzdWx0IGFzIEZhYnJpY0lkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBpZGVudGl0eSB3aXRoIHRoZSBDQS5cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciBhIG5ldyBlbnJvbGxtZW50IElELCByZXR1cm5pbmcgdGhlIGVucm9sbG1lbnQgc2VjcmV0IHVwb24gc3VjY2Vzcy5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZCBmb3IgdGhlIG5ldyBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gVGhlIGVucm9sbG1lbnQgc2VjcmV0IGZvciB0aGUgcmVnaXN0ZXJlZCBpZGVudGl0eS5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIG1vZGVsOiBDcmVkZW50aWFscyxcbiAgICBpc1N1cGVyVXNlcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFmZmlsaWF0aW9uOiBzdHJpbmcgPSBcIlwiLFxuICAgIHVzZXJSb2xlPzogQ0FfUk9MRSB8IHN0cmluZyxcbiAgICBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZSxcbiAgICBtYXhFbnJvbGxtZW50cz86IG51bWJlcixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3RlclwiLCB0cnVlKSkuZm9yKFxuICAgICAgdGhpcy5yZWdpc3RlclxuICAgICk7XG5cbiAgICBsZXQgcmVnaXN0cmF0aW9uOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlck5hbWUsIHBhc3N3b3JkIH0gPSBtb2RlbDtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBlbnJvbGxtZW50SUQ6IHVzZXJOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcGFzc3dvcmQsXG4gICAgICAgIGFmZmlsaWF0aW9uOiBhZmZpbGlhdGlvbixcbiAgICAgICAgdXNlclJvbGU6IHVzZXJSb2xlLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG1heEVucm9sbG1lbnRzOiBtYXhFbnJvbGxtZW50cyxcbiAgICAgIH0gYXMgSVJlZ2lzdGVyUmVxdWVzdDtcbiAgICAgIHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMuY2xpZW50LnJlZ2lzdGVyKHByb3BzLCB0aGlzLnVzZXIpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBSZWdpc3RyYXRpb24gZm9yICR7dXNlck5hbWV9IGNyZWF0ZWQgd2l0aCB1c2VyIHR5cGUgJHt1c2VyUm9sZSA/PyBcIlVuZGVmaW5lZCBSb2xlXCJ9ICR7aXNTdXBlclVzZXIgPyBcImFzIHN1cGVyIHVzZXJcIiA6IFwiXCJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjdHg6IENvbnRleHRcbiAgKTogSWRlbnRpdHkge1xuICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHRoaXMuaWRlbnRpdHlGcm9tRW5yb2xsbWVudCk7XG4gICAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwga2V5LCByb290Q2VydGlmaWNhdGUgfSA9IGVucm9sbG1lbnQ7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgR2VuZXJhdGluZyBJZGVudGl0eSBmcm9tIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGV9IGluIG1zcCAke21zcElkfWBcbiAgICApO1xuICAgIGNvbnN0IGNsaWVudElkID0gQ3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpO1xuICAgIGNvbnN0IGlkID0gQ3J5cHRvVXRpbHMuZW5jb2RlKGNsaWVudElkKTtcbiAgICBsb2cuZGVidWcoYElkZW50aXR5ICR7Y2xpZW50SWR9IGFuZCBlbmNvZGVkSWQgJHtpZH1gKTtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5KHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXkudG9CeXRlcygpLFxuICAgICAgICByb290Q2VydGlmaWNhdGU6IHJvb3RDZXJ0aWZpY2F0ZSxcbiAgICAgIH0sXG4gICAgICBtc3BJZDogbXNwSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVucm9sbCBhbiBpZGVudGl0eSB3aXRoIHRoZSBDQSB1c2luZyBhIHJlZ2lzdHJhdGlvbiBzZWNyZXQuXG4gICAqIEBzdW1tYXJ5IEV4Y2hhbmdlcyB0aGUgZW5yb2xsbWVudCBJRCBhbmQgc2VjcmV0IGZvciBjZXJ0aWZpY2F0ZXMsIHJldHVybmluZyBhIGNvbnN0cnVjdGVkIElkZW50aXR5IG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5yb2xsbWVudElkIC0gRW5yb2xsbWVudCBJRCB0byBlbnJvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb24gLSBFbnJvbGxtZW50IHNlY3JldCByZXR1cm5lZCBhdCByZWdpc3RyYXRpb24gdGltZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSBlbnJvbGxlZCBpZGVudGl0eSBvYmplY3Qgd2l0aCBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIGVucm9sbChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICByZWdpc3RyYXRpb246IHN0cmluZyxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwiZW5yb2xsXCIsIHRydWUpKS5mb3IoXG4gICAgICB0aGlzLmVucm9sbFxuICAgICk7XG4gICAgbGV0IGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBFbnJvbGxpbmcgJHtlbnJvbGxtZW50SWR9YCk7XG4gICAgICBjb25zdCBlbnJvbGxtZW50OiBJRW5yb2xsUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5lbnJvbGwoe1xuICAgICAgICBlbnJvbGxtZW50SUQ6IGVucm9sbG1lbnRJZCxcbiAgICAgICAgZW5yb2xsbWVudFNlY3JldDogcmVnaXN0cmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBpZGVudGl0eSA9IEZhYnJpY0lkZW50aXR5U2VydmljZS5pZGVudGl0eUZyb21FbnJvbGxtZW50KFxuICAgICAgICBlbnJvbGxtZW50LFxuICAgICAgICB0aGlzLmNvbmZpZy5jYU5hbWUsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgU3VjY2Vzc2Z1bGx5IGVucm9sbGVkICR7ZW5yb2xsbWVudElkfSB1bmRlciAke3RoaXMuY29uZmlnLmNhTmFtZX0gYXMgJHtpZGVudGl0eS5pZH1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGFuZCBlbnJvbGwgYSBuZXcgaWRlbnRpdHkgaW4gb25lIHN0ZXAuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIG5ldyBlbnJvbGxtZW50IElEIHdpdGggdGhlIENBIGFuZCBpbW1lZGlhdGVseSBleGNoYW5nZXMgdGhlIHNlY3JldCB0byBlbnJvbGwsIHJldHVybmluZyB0aGUgY3JlYXRlZCBJZGVudGl0eS5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gbW9kZWwgLSBDcmVkZW50aWFscyBmb3IgdGhlIG5ldyBpZGVudGl0eSBjb250YWluaW5nIHVzZXJOYW1lIGFuZCBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdXBlclVzZXI9ZmFsc2VdIC0gV2hldGhlciB0byByZWdpc3RlciB0aGUgaWRlbnRpdHkgYXMgYSBzdXBlciB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FmZmlsaWF0aW9uPVwiXCJdIC0gQWZmaWxpYXRpb24gc3RyaW5nIChlLmcuLCBvcmcxLmRlcGFydG1lbnQxKS5cbiAgICogQHBhcmFtIHtDQV9ST0xFIHwgc3RyaW5nfSBbdXNlclJvbGVdIC0gUm9sZSB0byBhc3NpZ24gdG8gdGhlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge0lLZXlWYWx1ZUF0dHJpYnV0ZX0gW2F0dHJzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhFbnJvbGxtZW50c10gLSBNYXhpbXVtIG51bWJlciBvZiBlbnJvbGxtZW50cyBhbGxvd2VkIGZvciB0aGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SWRlbnRpdHk+fSBUaGUgZW5yb2xsZWQgaWRlbnRpdHkuXG4gICAqL1xuICBhc3luYyByZWdpc3RlckFuZEVucm9sbChcbiAgICBtb2RlbDogQ3JlZGVudGlhbHMsXG4gICAgaXNTdXBlclVzZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhZmZpbGlhdGlvbjogc3RyaW5nID0gXCJcIixcbiAgICB1c2VyUm9sZT86IENBX1JPTEUgfCBzdHJpbmcsXG4gICAgYXR0cnM/OiBJS2V5VmFsdWVBdHRyaWJ1dGUsXG4gICAgbWF4RW5yb2xsbWVudHM/OiBudW1iZXIsXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgXCJyZWdpc3Rlci1lbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMucmVnaXN0ZXJBbmRFbnJvbGxcbiAgICApO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHRoaXMucmVnaXN0ZXIoXG4gICAgICBtb2RlbCxcbiAgICAgIGlzU3VwZXJVc2VyLFxuICAgICAgYWZmaWxpYXRpb24sXG4gICAgICB1c2VyUm9sZSxcbiAgICAgIGF0dHJzLFxuICAgICAgbWF4RW5yb2xsbWVudHMsXG4gICAgICBjdHhcbiAgICApO1xuICAgIGNvbnN0IHsgdXNlck5hbWUgfSA9IG1vZGVsO1xuICAgIHJldHVybiB0aGlzLmVucm9sbCh1c2VyTmFtZSBhcyBzdHJpbmcsIHJlZ2lzdHJhdGlvbiwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmUtZW5yb2xsIGFuIGV4aXN0aW5nIGlkZW50aXR5IHVzaW5nIGl0cyBjdXJyZW50IGVucm9sbG1lbnQuXG4gICAqIEBzdW1tYXJ5IFJlbmV3cyB0aGUgZW5yb2xsbWVudCBjZXJ0aWZpY2F0ZSBieSBjYWxsaW5nIHRoZSBDQSByZWVucm9sbC5cbiAgICogQHBhcmFtIHtVc2VyfSBjdXJyZW50VXNlciAtIEFscmVhZHkgZW5yb2xsZWQgdXNlciwgbXVzdCBoYXZlIGEgc2lnbmluZyBpZGVudGl0eS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFRoZSByZW5ld2VkIGlkZW50aXR5IG9iamVjdCB3aXRoIG5ldyBjcmVkZW50aWFscy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUlkZW50aXR5KFxuICAgIGVucm9sbG1lbnRJZDogc3RyaW5nLFxuICAgIGlkZW50aXR5OiB7IGNlcnRpZmljYXRlOiBzdHJpbmc7IHByaXZhdGVLZXk6IHN0cmluZyB9LFxuICAgIGlkZW50aXR5UmVxdWVzdDogSUlkZW50aXR5UmVxdWVzdCxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPElkZW50aXR5PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gKGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFwicmVlbnJvbGxcIiwgdHJ1ZSkpLmZvcihcbiAgICAgIHRoaXMudXBkYXRlSWRlbnRpdHlcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBSZW5ld2luZyBpZGVudGl0eSBmb3IgJHtlbnJvbGxtZW50SWR9YCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhdHRyaWJ1dGVzIGluIHRoZSBDQSByZWdpc3RyeSAoYWRtaW4gb3BlcmF0aW9uKS4gVGhpcyBjaGFuZ2VzIHRoZSBcInNvdXJjZSBvZiB0cnV0aFwiLlxuICAgICAgY29uc3QgaWRlbnRpdHlTZXJ2aWNlID0gdGhpcy5jbGllbnQubmV3SWRlbnRpdHlTZXJ2aWNlKCk7XG5cbiAgICAgIGNvbnN0IGNhVXNlcklkZW50aXR5ID0gKGF3YWl0IGlkZW50aXR5U2VydmljZS5nZXRPbmUoXG4gICAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgICAgdGhpcy51c2VyXG4gICAgICApKSBhcyB7IHJlc3VsdDogeyBhdHRycz86IElLZXlWYWx1ZUF0dHJpYnV0ZVtdIH0gfTtcblxuICAgICAgYXdhaXQgaWRlbnRpdHlTZXJ2aWNlLnVwZGF0ZShlbnJvbGxtZW50SWQsIGlkZW50aXR5UmVxdWVzdCwgdGhpcy51c2VyKTsgLy8gYXMgSVNlcnZpY2VSZXNwb25zZSAmIHsgcmVzdWx0OiBJSWRlbnRpdHlSZXF1ZXN0IH07XG5cbiAgICAgIC8vIFJlZW5yb2xsIGFzIHRoZSB1c2VyLiBSZXF1ZXN0IG11c3QgYmUgc2lnbmVkIHVzaW5nIHRoZSBleGlzdGluZyBjZXJ0aWZpY2F0ZS5cbiAgICAgIGNvbnN0IHJlZW5yb2xsVXNlciA9IFVzZXIuY3JlYXRlVXNlcihcbiAgICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgICBcIlwiLCAvLyBlbnJvbGxtZW50U2VjcmV0IG5vdCByZXF1aXJlZCBmb3IgcmVlbnJvbGxcbiAgICAgICAgdGhpcy51c2VyLmdldE1zcGlkKCksXG4gICAgICAgIGlkZW50aXR5LmNlcnRpZmljYXRlLFxuICAgICAgICBpZGVudGl0eS5wcml2YXRlS2V5XG4gICAgICApO1xuICAgICAgcmVlbnJvbGxVc2VyLnNldENyeXB0b1N1aXRlKHRoaXMudXNlci5nZXRDcnlwdG9TdWl0ZSgpKTtcblxuICAgICAgY29uc3QgZW5yb2xsbWVudEF0dHJzOiBJQXR0cmlidXRlUmVxdWVzdFtdID0gKFxuICAgICAgICBjYVVzZXJJZGVudGl0eS5yZXN1bHQuYXR0cnMgfHwgW11cbiAgICAgICkubWFwKCh7IG5hbWUgfSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBlbnJvbGxtZW50ID0gYXdhaXQgdGhpcy5jbGllbnQucmVlbnJvbGwoXG4gICAgICAgIHJlZW5yb2xsVXNlcixcbiAgICAgICAgZW5yb2xsbWVudEF0dHJzXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZW5ld2VkSWRlbnRpdHkgPSBGYWJyaWNJZGVudGl0eVNlcnZpY2UuaWRlbnRpdHlGcm9tRW5yb2xsbWVudChcbiAgICAgICAgZW5yb2xsbWVudCxcbiAgICAgICAgdGhpcy5jb25maWcuY2FOYW1lLFxuICAgICAgICBjdHhcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldm9rZSB0aGUgcHJldmlvdXMgY2VydGlmaWNhdGUgb25seSwgc28gdGhlIG9sZCBjZXJ0IGJlY29tZXMgaW52YWxpZC5cbiAgICAgIGxvZy5kZWJ1ZyhgUmV2b2tpbmcgcHJldmlvdXMgY2VydGlmaWNhdGVzIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIGNvbnN0IHsgYWtpLCBzZXJpYWwgfSA9IGdldEFraUFuZFNlcmlhbEZyb21DZXJ0KGlkZW50aXR5LmNlcnRpZmljYXRlKTtcbiAgICAgIGF3YWl0IHRoaXMucmV2b2tlKGVucm9sbG1lbnRJZCwgeyBha2ksIHNlcmlhbCB9LCBhcmdzKTtcblxuICAgICAgbG9nLmRlYnVnKGBSZW5ldyBpZGVudGl0eSBzdWNjZXNzZnVsIGZvciAke2Vucm9sbG1lbnRJZH1gKTtcbiAgICAgIHJldHVybiByZW5ld2VkSWRlbnRpdHk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldm9rZXMgdGhlIGVucm9sbG1lbnQgb2YgYW4gaWRlbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGVucm9sbG1lbnQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgLSBUaGUgZW5yb2xsbWVudCBJRCBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgcmV2b2tlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcmV2b2NhdGlvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEB0aHJvd3Mge05vdEZvdW5kRXJyb3J9IElmIHRoZSBlbnJvbGxtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBkb2VzIG5vdCBleGlzdC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSByZXZvY2F0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBhc3luYyByZXZva2UoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgcmV2b2tlT3B0aW9uczogT21pdDxJUmV2b2tlUmVxdWVzdCwgXCJlbnJvbGxtZW50SURcIj4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPGFueT5cbiAgKTogUHJvbWlzZTxJU2VydmljZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBcInJldm9rZVwiLCB0cnVlKSkuZm9yKHRoaXMucmV2b2tlKTtcbiAgICBsb2cudmVyYm9zZShgUmV2b2tpbmcgaWRlbnRpdHkgd2l0aCBlbnJvbGxtZW50IElEICR7ZW5yb2xsbWVudElkfWApO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5yZWFkKGVucm9sbG1lbnRJZCk7XG4gICAgaWYgKCFpZGVudGl0eSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfWBcbiAgICAgICk7XG4gICAgbGV0IHJlc3VsdDogSVNlcnZpY2VSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgQm9vbGVhbihyZXZva2VPcHRpb25zLnNlcmlhbCkgfHwgQm9vbGVhbihyZXZva2VPcHRpb25zLmFraSlcbiAgICAgICAgICA/IFwiUmV2b2tlIFVzZXIgQ2VydGlmaWNhdGVcIlxuICAgICAgICAgIDogXCJVc2VyIERlbGV0aW9uXCI7XG5cbiAgICAgIGNvbnN0IHJldm9rZVJlcXVlc3Q6IElSZXZva2VSZXF1ZXN0ID0ge1xuICAgICAgICByZWFzb24sXG4gICAgICAgIC4uLnJldm9rZU9wdGlvbnMsXG4gICAgICAgIGVucm9sbG1lbnRJRDogaWRlbnRpdHkuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXZva2UocmV2b2tlUmVxdWVzdCwgdGhpcy51c2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXZva2UgZW5yb2xsbWVudCB3aXRoIGlkICR7ZW5yb2xsbWVudElkfTogJHtyZXN1bHQuZXJyb3JzLmpvaW4oXCJcXG5cIil9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcm9sZSB0eXBlcyB1c2VkIGR1cmluZyBlbnJvbGxtZW50IGFuZCByZWdpc3RyYXRpb24uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdGFuZGFyZCBIeXBlcmxlZGdlciBGYWJyaWMgQ0Egcm9sZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaWRlbnRpdGllcyB3aGVuIHJlZ2lzdGVyaW5nIHdpdGggdGhlIENBIHNlcnZpY2UuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBlbnVtIENBX1JPTEUge1xuICAvKiogQWRtaW5pc3RyYXRvciByb2xlIHdpdGggZWxldmF0ZWQgcHJpdmlsZWdlcyBmb3IgbWFuYWdpbmcgaWRlbnRpdGllcyBhbmQgYWZmaWxpYXRpb25zICovXG4gIEFETUlOID0gXCJhZG1pblwiLFxuICAvKiogU3RhbmRhcmQgdXNlciByb2xlIGZvciBhcHBsaWNhdGlvbiBjbGllbnRzIGludGVyYWN0aW5nIHdpdGggdGhlIG5ldHdvcmsgKi9cbiAgVVNFUiA9IFwidXNlclwiLFxuICAvKiogQ2xpZW50IHJvbGUgdHlwaWNhbGx5IHVzZWQgZm9yIFNESy1iYXNlZCBpbnRlcmFjdGlvbnMgYW5kIHNlcnZpY2UgYWNjb3VudHMgKi9cbiAgQ0xJRU5UID0gXCJjbGllbnRcIixcbn1cbiIsImltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRGYWJyaWNDbGllbnRGbGFnczogRmFicmljQ2xpZW50RmxhZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgZXZhbHVhdGVUaW1lb3V0OiA1LFxuICBlbmRvcnNlVGltZW91dDogMTUsXG4gIHN1Ym1pdFRpbWVvdXQ6IDUsXG4gIGNvbW1pdFRpbWVvdXQ6IDYwLFxuICBsZWdhY3k6IGZhbHNlLFxuICBhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3M6IGZhbHNlLFxuICBhbGxvd0dhdGV3YXlPdmVycmlkZTogZmFsc2UsXG4gIGFsbG93Q29udGV4dFRyYW5zaWVudE1hcDogZmFsc2UsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxuICBlbmNyeXB0VHJhbnNpZW50OiBmYWxzZSxcbiAgc3ludGhldGljRXZlbnRzOiB0cnVlLFxufSkgYXMgYW55O1xuIiwiaW1wb3J0IHsgaXNCcm93c2VyLCBNaW5pTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcImZhYnJpYy1jb21tb25cIjtcbmltcG9ydCB7IElkZW50aXR5LCBTaWduZXIsIHNpZ25lcnMgfSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVJbXBvcnQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuY29uc3QgbG9nID0gbmV3IE1pbmlMb2dnZXIoXCJmYWJyaWMtZnNcIik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExvYWRzIGNvbnRlbnQgZnJvbSBhIGZpbGUgb3IgcmV0dXJucyB0aGUgY29udGVudCBpZiBhbHJlYWR5IGxvYWRlZFxuICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBjb250ZW50IG9yIGEgcGF0aCB0byBhIGZpbGUsIGFuZCBsb2FkcyB0aGUgZmlsZSBpZiBuZWVkZWRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsZVJlYWRlciAtIEZ1bmN0aW9uIHRvIHJlYWQgdGhlIGZpbGUgaWYgY29udGVudE9yUGF0aCBpcyBhIHBhdGhcbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nIHwgVWludDhBcnJheSB8IEJ1ZmZlcj59IFRoZSBjb250ZW50XG4gKiBAZnVuY3Rpb24gY29udGVudE9mTG9hZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnRlbnRPZkxvYWRGaWxlKFxuICBjb250ZW50T3JQYXRoOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICBmaWxlUmVhZGVyOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBCdWZmZXI+XG4pIHtcbiAgaWYgKGNvbnRlbnRPclBhdGggaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gY29udGVudE9yUGF0aDtcbiAgaWYgKFxuICAgIGNvbnRlbnRPclBhdGgubWF0Y2goXG4gICAgICAvLS0tLS1CRUdJTiAoQ0VSVElGSUNBVEV8S0VZfFBSSVZBVEUgS0VZKS0tLS0tLis/LS0tLS1FTkQgXFwxLS0tLS0kL2dtc1xuICAgIClcbiAgKVxuICAgIHJldHVybiBjb250ZW50T3JQYXRoO1xuICByZXR1cm4gYXdhaXQgZmlsZVJlYWRlcihjb250ZW50T3JQYXRoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gKiBAc3VtbWFyeSBMb2FkcyBhIGZpbGUgdXNpbmcgdGhlIE5vZGUuanMgZmlsZSBzeXN0ZW0gbW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZyB8IEJ1ZmZlcn0gY29udGVudE9yUGF0aCAtIFRoZSBjb250ZW50IG9yIHBhdGggdG8gbG9hZFxuICogQHJldHVybiB7UHJvbWlzZTxCdWZmZXI+fSBUaGUgZmlsZSBjb250ZW50IGFzIGEgQnVmZmVyXG4gKiBAZnVuY3Rpb24gcmVhZEZpbGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlKGNvbnRlbnRPclBhdGg6IHN0cmluZyB8IEJ1ZmZlcikge1xuICBpZiAodHlwZW9mIGNvbnRlbnRPclBhdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50T3JQYXRoO1xuXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUocGF0aCk7XG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IGZpbGVSZWFkZXIoY29udGVudE9yUGF0aCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgdXNlclxuICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSB1c2VyIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgRmFicmljIENBXG4gKiBAcGFyYW0ge3N0cmluZ30gdXNlck5hbWUgLSBUaGUgdXNlciBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJpdmF0ZUtleSAtIFRoZSBwcml2YXRlIGtleSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGNlcnRpZmljYXRlIC0gVGhlIGNlcnRpZmljYXRlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNwSWQgLSBUaGUgTWVtYmVyc2hpcCBTZXJ2aWNlIFByb3ZpZGVyIElEXG4gKiBAcmV0dXJuIHtQcm9taXNlPFVzZXI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCB1c2VyXG4gKiBAZnVuY3Rpb24gZ2V0Q0FVc2VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDQVVzZXIoXG4gIHVzZXJOYW1lOiBzdHJpbmcsXG4gIHByaXZhdGVLZXk6IHN0cmluZyxcbiAgY2VydGlmaWNhdGU6IHN0cmluZyxcbiAgbXNwSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyPiB7XG4gIGxvZy5kZWJ1ZyhcbiAgICBgQ3JlYXRpbmcgYSBDQSAke21zcElkfSB1c2VyICR7dXNlck5hbWV9IHdpdGggY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZX1gXG4gICk7XG4gIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih1c2VyTmFtZSk7XG4gIGNvbnN0IGNyeXB0b1N1aXRlID0gVXNlci5uZXdDcnlwdG9TdWl0ZSgpO1xuICB1c2VyLnNldENyeXB0b1N1aXRlKGNyeXB0b1N1aXRlKTtcbiAgY29uc3QgaW1wb3J0ZWRLZXkgPSBjcnlwdG9TdWl0ZS5jcmVhdGVLZXlGcm9tUmF3KHByaXZhdGVLZXkpO1xuICBhd2FpdCB1c2VyLnNldEVucm9sbG1lbnQoaW1wb3J0ZWRLZXksIGNlcnRpZmljYXRlLCBtc3BJZCk7XG4gIHJldHVybiB1c2VyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGlkZW50aXR5IGZyb20gYSBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IExvYWRzIGEgY2VydGlmaWNhdGUgZnJvbSBhIGRpcmVjdG9yeSBhbmQgY3JlYXRlcyBhbiBJZGVudGl0eSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc3BJZCAtIFRoZSBNZW1iZXJzaGlwIFNlcnZpY2UgUHJvdmlkZXIgSURcbiAqIEBwYXJhbSB7c3RyaW5nfSBjZXJ0RGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuICogQHJldHVybiB7UHJvbWlzZTxJZGVudGl0eT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBpZGVudGl0eVxuICogQGZ1bmN0aW9uIGdldElkZW50aXR5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRJZGVudGl0eShcbiAgbXNwSWQ6IHN0cmluZyxcbiAgY2VydERpcmVjdG9yeVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxJZGVudGl0eT4ge1xuICBjb25zdCBpZGVudGl0eUZpbGVSZWFkZXIgPSBhc3luYyAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBwcm9taXNlcyB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcImZzXCIpKTtcbiAgICBjb25zdCBjZXJ0UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBwcm9taXNlcy5yZWFkRmlsZShjZXJ0UGF0aCk7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICB9O1xuXG4gIGNvbnN0IGNyZWRlbnRpYWxzOiBVaW50OEFycmF5ID0gKGF3YWl0IGNvbnRlbnRPZkxvYWRGaWxlKFxuICAgIGNlcnREaXJlY3RvcnlQYXRoLFxuICAgIGlkZW50aXR5RmlsZVJlYWRlclxuICApKSBhcyBVaW50OEFycmF5O1xuXG4gIHJldHVybiB7IG1zcElkLCBjcmVkZW50aWFscyB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBmaXJzdCBmaWxlIGZvdW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyUGF0aCAtIFBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHByb21pc2VzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoaW1wb3J0KFwiZnNcIikpO1xuICBjb25zdCB7IGpvaW4gfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJwYXRoXCIpKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpclBhdGgpO1xuICByZXR1cm4gam9pbihkaXJQYXRoLCBmaWxlc1swXSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpcnN0IGZpbGUgaW4gYSBkaXJlY3RvcnlcbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZGlyZWN0b3J5LCBmaW5kcyB0aGUgZmlyc3QgZmlsZSwgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmaXJzdCBmaWxlXG4gKiBAZnVuY3Rpb24gZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChcInBhdGhcIikpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCk7XG4gIHJldHVybiAoYXdhaXQgcHJvbWlzZXMucmVhZEZpbGUoam9pbihkaXJQYXRoLCBmaWxlc1swXSkpKS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgc2lnbmVyIGZyb20gYSBrZXkgZGlyZWN0b3J5XG4gKiBAc3VtbWFyeSBMb2FkcyBhIHByaXZhdGUga2V5IGZyb20gYSBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYSBTaWduZXIgZm9yIEZhYnJpYyB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlEaXJlY3RvcnlQYXRoIC0gUGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHByaXZhdGUga2V5XG4gKiBAcmV0dXJuIHtQcm9taXNlPFNpZ25lcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzaWduZXJcbiAqIEBmdW5jdGlvbiBnZXRTaWduZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25lcj4ge1xuICBjb25zdCBzaWduZXJGaWxlUmVhZGVyID0gYXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZXMgfSA9IGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQoXCJmc1wiKSk7XG4gICAgY29uc3Qga2V5UGF0aCA9IGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWUocGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2VzLnJlYWRGaWxlKGtleVBhdGgpO1xuICB9O1xuXG4gIGNvbnN0IHByaXZhdGVLZXlQZW0gPSAoYXdhaXQgY29udGVudE9mTG9hZEZpbGUoXG4gICAga2V5RGlyZWN0b3J5UGF0aCxcbiAgICBzaWduZXJGaWxlUmVhZGVyXG4gICkpIGFzIEJ1ZmZlcjtcblxuICBsZXQgaztcbiAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgLy8gd2ViIGJhc2VkIGltcGxlbWVudGF0aW9uXG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IGV4dHJhY3RQcml2YXRlS2V5KHByaXZhdGVLZXlQZW0pO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByaXZhdGVLZXkpO1xuICAgIGsgPSAocHJpdmF0ZUtleSBhcyBhbnkpW2tleXNbMF1dO1xuICB9IGVsc2Uge1xuICAgIC8vIE5vZGUgYmFzZWQgaW1wbGVtZW50YXRpb25cbiAgICBjb25zdCB7IGNyZWF0ZVByaXZhdGVLZXkgfSA9IGF3YWl0IGltcG9ydChcImNyeXB0b1wiKTtcbiAgICBrID0gY3JlYXRlUHJpdmF0ZUtleShwcml2YXRlS2V5UGVtKTtcbiAgfVxuXG4gIHJldHVybiBzaWduZXJzLm5ld1ByaXZhdGVLZXlTaWduZXIoayBhcyBhbnkpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyBhIHByaXZhdGUga2V5IGZyb20gYSBQRU0gYnVmZmVyXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBhIFBFTS1lbmNvZGVkIHByaXZhdGUga2V5IHRvIGEgQ3J5cHRvS2V5IG9iamVjdFxuICogQHBhcmFtIHtCdWZmZXJ9IHBlbSAtIFRoZSBQRU0tZW5jb2RlZCBwcml2YXRlIGtleVxuICogQHJldHVybiB7UHJvbWlzZTxDcnlwdG9LZXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgQ3J5cHRvS2V5XG4gKiBAZnVuY3Rpb24gZXh0cmFjdFByaXZhdGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5jbGllbnRcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEV4dHJhY3RQcml2YXRlS2V5XG4gKiAgIHBhcnRpY2lwYW50IFN1YnRsZUNyeXB0b1xuICpcbiAqICAgQ2FsbGVyLT4+RXh0cmFjdFByaXZhdGVLZXk6IGV4dHJhY3RQcml2YXRlS2V5KHBlbSlcbiAqICAgRXh0cmFjdFByaXZhdGVLZXktPj5FeHRyYWN0UHJpdmF0ZUtleTogR2V0IFN1YnRsZUNyeXB0byBpbXBsZW1lbnRhdGlvblxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PkV4dHJhY3RQcml2YXRlS2V5OiBQYXJzZSBQRU0gZm9ybWF0XG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LT4+RXh0cmFjdFByaXZhdGVLZXk6IENvbnZlcnQgdG8gYmluYXJ5IERFUlxuICogICBFeHRyYWN0UHJpdmF0ZUtleS0+PlN1YnRsZUNyeXB0bzogaW1wb3J0S2V5KHBrY3M4LCBiaW5hcnlEZXIsIG9wdGlvbnMpXG4gKiAgIFN1YnRsZUNyeXB0by0tPj5FeHRyYWN0UHJpdmF0ZUtleTogQ3J5cHRvS2V5XG4gKiAgIEV4dHJhY3RQcml2YXRlS2V5LS0+PkNhbGxlcjogQ3J5cHRvS2V5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHRyYWN0UHJpdmF0ZUtleShwZW06IEJ1ZmZlcikge1xuICAvLyBjb25zdCBsaWJOYW1lID0gXCJub2RlOmNyeXB0b1wiO1xuICBsZXQgc3VidGxlO1xuICAvLyBpZiAoaXNCcm93c2VyKCkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBzdWJ0bGUgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNyeXB0by5zdWJ0bGU7XG4gIC8vIH0gZWxzZSB7XG4gIC8vICAgY29uc3QgbGliID0gKGF3YWl0IG5vcm1hbGl6ZUltcG9ydChpbXBvcnQobGliTmFtZSkpKSBhcyBhbnk7XG4gIC8vICAgc3VidGxlID0gbGliLnN1YnRsZSB8fCBsaWIud2ViY3J5cHRvLnN1YnRsZTtcbiAgLy8gfVxuXG4gIGlmICghc3VidGxlKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgbG9hZCBTdWJ0bGVDcnlwdG8gbW9kdWxlXCIpO1xuXG4gIGZ1bmN0aW9uIHN0cjJhYihzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihzdHIubGVuZ3RoKTtcbiAgICBjb25zdCBidWZWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICBmb3IgKGxldCBpID0gMCwgc3RyTGVuID0gc3RyLmxlbmd0aDsgaSA8IHN0ckxlbjsgaSsrKSB7XG4gICAgICBidWZWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBjb25zdCBzdHIgPSBwZW1cbiAgICAudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgLnJlcGxhY2UoXCItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cIiwgXCJcIilcbiAgICAucmVwbGFjZUFsbChcIlxcblwiLCBcIlwiKVxuICAgIC5yZXBsYWNlKFwiLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLVwiLCBcIlwiKTtcbiAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJiaW5hcnlcIik7XG4gIGNvbnN0IGJpbmFyeURlciA9IHN0cjJhYihkZWNvZGVkKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICBcInBrY3M4XCIsXG4gICAgICBiaW5hcnlEZXIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiRUNEU0FcIixcbiAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgICBbXCJzaWduXCJdXG4gICAgKTtcblxuICAgIHJldHVybiBrZXk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IENMSUVOVF9PVkVSUklERV9LRVlTOiAoa2V5b2YgRmFicmljQ2xpZW50RmxhZ3MpW10gPSBbXG4gIFwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGVcIixcbl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZhYnJpYyBjbGllbnQgY29udGV4dCB3aXRoIGEgY29uc3RyYWluZWQgb3ZlcnJpZGUgc3VyZmFjZVxuICogQHN1bW1hcnkgUmVzdHJpY3RzIHdoaWNoIGNhY2hlZCB2YWx1ZXMgYXJlIHByb3BhZ2F0ZWQgdG8gY2hpbGQgY29udGV4dHMgb3Igc2VudFxuICogYmFjayBhcyBvdmVycmlkZXMgc28gb25seSBpbnRlbnRpb25hbCBjbGllbnQgZmxhZ3MgYXJlIGZvcndhcmRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudENvbnRleHQgZXh0ZW5kcyBDb250ZXh0PEZhYnJpY0NsaWVudEZsYWdzPiB7XG4gIGNvbnN0cnVjdG9yKGN0eD86IENvbnRleHQ8RmFicmljQ2xpZW50RmxhZ3M+KSB7XG4gICAgc3VwZXIoY3R4KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRvT3ZlcnJpZGVzKCk6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+IHtcbiAgICBjb25zdCBvdmVycmlkZXM6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ0xJRU5UX09WRVJSSURFX0tFWVMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRPclVuZGVmaW5lZChrZXkpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBvdmVycmlkZXNba2V5XSA9IHZhbHVlIGFzIG5ldmVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3ZlcnJpZGVzO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyRmxhZ3MsXG4gIENvbmRpdGlvbixcbiAgR3JvdXBPcGVyYXRvcixcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBPcGVyYXRvcixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnQsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgUXVlcnlDbGF1c2UsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFNlbGVjdFNlbGVjdG9yLFxuICBTZXF1ZW5jZSxcbiAgU3RhdGVtZW50LFxuICBTdGF0ZW1lbnRFeGVjdXRvcixcbiAgVmlld0tpbmQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRBZGFwdGVyIH0gZnJvbSBcIi4vRmFicmljQ2xpZW50QWRhcHRlclwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50Q29udGV4dCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudENvbnRleHRcIjtcbmltcG9ydCB7XG4gIENvdWNoREJLZXlzLFxuICBDb3VjaERCT3BlcmF0b3IsXG4gIENvdWNoREJHcm91cE9wZXJhdG9yLFxuICBDb3VjaERCUXVlcnlMaW1pdCxcbiAgTWFuZ29RdWVyeSxcbiAgTWFuZ29PcGVyYXRvcixcbiAgTWFuZ29TZWxlY3RvcixcbiAgdHJhbnNsYXRlT3BlcmF0b3JzLFxuICBnZW5lcmF0ZURlc2lnbkRvY05hbWUsXG4gIGdlbmVyYXRlVmlld05hbWUsXG4gIGZpbmRWaWV3TWV0YWRhdGEsXG4gIENvdWNoREJWaWV3TWV0YWRhdGEsXG4gIFZpZXdSZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgdG9DYW1lbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IERCS2V5cywgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxudHlwZSBGYWJyaWNWaWV3RGVzY3JpcHRvciA9IHtcbiAgZGRvYzogc3RyaW5nO1xuICB2aWV3OiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG59O1xuXG50eXBlIEZhYnJpY0FnZ3JlZ2F0ZUluZm8gPVxuICB8IHtcbiAgICAgIGtpbmQ6IFZpZXdLaW5kO1xuICAgICAgbWV0YTogQ291Y2hEQlZpZXdNZXRhZGF0YTtcbiAgICAgIGRlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgICAgY291bnREaXN0aW5jdD86IGJvb2xlYW47XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IFwiYXZnXCI7XG4gICAgICBhdHRyaWJ1dGU6IHN0cmluZztcbiAgICAgIHN1bURlc2NyaXB0b3I6IEZhYnJpY1ZpZXdEZXNjcmlwdG9yO1xuICAgICAgY291bnREZXNjcmlwdG9yOiBGYWJyaWNWaWV3RGVzY3JpcHRvcjtcbiAgICB9O1xuXG5jb25zdCBlc2NhcGVSZWdFeHAgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICB2YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG5cbmZ1bmN0aW9uIG5leHRMZXhpY29ncmFwaGljU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcXHUwMDAwXCI7XG4gIGNvbnN0IGNoYXJzID0gQXJyYXkuZnJvbSh2YWx1ZSk7XG4gIGZvciAobGV0IGkgPSBjaGFycy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyc1tpXS5jb2RlUG9pbnRBdCgwKTtcbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAoY29kZSA8IDB4MTBmZmZmKSB7XG4gICAgICBjaGFyc1tpXSA9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUgKyAxKTtcbiAgICAgIHJldHVybiBjaGFycy5zbGljZSgwLCBpICsgMSkuam9pbihcIlwiKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3ZhbHVlfVxcdTAwMDBgO1xufVxuXG5mdW5jdGlvbiBwcmVmaXhSYW5nZShwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBwcmVmaXgsXG4gICAgZW5kOiBuZXh0TGV4aWNvZ3JhcGhpY1N0cmluZyhwcmVmaXgpLFxuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50U3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBTdGF0ZW1lbnQ8XG4gIE0sXG4gIEZhYnJpY0NsaWVudEFkYXB0ZXIsXG4gIFIsXG4gIE1hbmdvUXVlcnlcbj4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBGYWJyaWNDbGllbnRBZGFwdGVyLCBvdmVycmlkZXM/OiBQYXJ0aWFsPEFkYXB0ZXJGbGFncz4pIHtcbiAgICBzdXBlcihhZGFwdGVyLCBvdmVycmlkZXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNxdWFzaChcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3F1YXNoZWQ6IFByZXBhcmVkU3RhdGVtZW50PE0+IHwgdW5kZWZpbmVkID0gc3VwZXIuc3F1YXNoKFxuICAgICAgY3R4IGFzIG5ldmVyXG4gICAgKTtcbiAgICBpZiAoIXNxdWFzaGVkKSByZXR1cm4gc3F1YXNoZWQ7XG5cbiAgICBjb25zdCB7IG1ldGhvZCwgcGFyYW1zLCBhcmdzIH0gPSBzcXVhc2hlZDtcbiAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQgfSA9IHBhcmFtcztcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZOlxuICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uLCBsaW1pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG1ldGhvZCAke21ldGhvZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3F1YXNoZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZVByZXBhcmVkKFxuICAgIC4uLmFyZ3o6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCByZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbCh0aGlzLmZyb21TZWxlY3RvciwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgICBjb25zdCB7IG1ldGhvZCwgYXJncyB9ID0gdGhpcy5wcmVwYXJlZCBhcyBQcmVwYXJlZFN0YXRlbWVudDxhbnk+O1xuICAgIHJldHVybiByZXBvLnN0YXRlbWVudChtZXRob2QsIC4uLmFyZ3MsIC4uLmFyZ3opO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcHJlcGFyZShcbiAgICBjdHg/OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFByb21pc2U8U3RhdGVtZW50RXhlY3V0b3I8TSwgUj4+IHtcbiAgICBjdHggPVxuICAgICAgY3R4IHx8XG4gICAgICAoYXdhaXQgdGhpcy5hZGFwdGVyLmNvbnRleHQoXG4gICAgICAgIFBlcnNpc3RlbmNlS2V5cy5RVUVSWSxcbiAgICAgICAgdGhpcy5vdmVycmlkZXMgfHwge30sXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICApKTtcblxuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vIGNvbnRleHQgYXZhaWxhYmxlIGZvciBzdGF0ZW1lbnRcIik7XG5cbiAgICBpZiAodGhpcy5pc1NpbXBsZVF1ZXJ5KCkgJiYgY3R4LmdldChcImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXNcIikpIHtcbiAgICAgIGNvbnN0IHNxdWFzaGVkID0gdGhpcy5zcXVhc2goY3R4KTtcbiAgICAgIGlmIChzcXVhc2hlZCkge1xuICAgICAgICB0aGlzLnByZXBhcmVkID0gc3F1YXNoZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG4gICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7fSBhcyBhbnk7XG5cbiAgICBjb25zdCBwcmVwYXJlZDogUHJlcGFyZWRTdGF0ZW1lbnQ8YW55PiA9IHtcbiAgICAgIGNsYXNzOiB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIGFyZ3MsXG4gICAgICBwYXJhbXMsXG4gICAgfSBhcyBhbnk7XG5cbiAgICBjb25zdCBtZXRob2Q6IHN0cmluZ1tdID0gW1F1ZXJ5Q2xhdXNlLkZJTkRfQlldO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucHJlcGFyZUNvbmRpdGlvbih0aGlzLndoZXJlQ29uZGl0aW9uLCBjdHggYXMgbmV2ZXIpO1xuICAgICAgbWV0aG9kLnB1c2gocGFyc2VkLm1ldGhvZCk7XG4gICAgICBpZiAocGFyc2VkLmFyZ3MgJiYgcGFyc2VkLmFyZ3MubGVuZ3RoKVxuICAgICAgICBhcmdzLnB1c2goLi4uKHBhcnNlZC5hcmdzIGFzIChzdHJpbmcgfCBudW1iZXIpW10pKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpXG4gICAgICBtZXRob2QucHVzaChcbiAgICAgICAgUXVlcnlDbGF1c2UuU0VMRUNULFxuICAgICAgICB0aGlzLnNlbGVjdFNlbGVjdG9yLmpvaW4oYCAke1F1ZXJ5Q2xhdXNlLkFORC50b0xvd2VyQ2FzZSgpfSBgKVxuICAgICAgKTtcbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3JzPy5sZW5ndGgpIHtcbiAgICAgIG1ldGhvZC5wdXNoKFF1ZXJ5Q2xhdXNlLk9SREVSX0JZLCB0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMF0gYXMgc3RyaW5nKTtcbiAgICAgIGFyZ3MucHVzaCh0aGlzLm9yZGVyQnlTZWxlY3RvcnNbMF1bMV0gYXMgYW55KTtcbiAgICB9XG4gICAgcHJlcGFyZWQubWV0aG9kID0gdG9DYW1lbENhc2UobWV0aG9kLmpvaW4oXCIgXCIpKTtcbiAgICBwcmVwYXJlZC5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5wcmVwYXJlZCA9IHByZXBhcmVkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSByZWNvcmQgZnJvbSBDb3VjaERCL0ZhYnJpY1xuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyB0aGUgSUQgZnJvbSBhIENvdWNoREIgZG9jdW1lbnQgYW5kIHJldmVydHMgaXQgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHByb2Nlc3NSZWNvcmQoXG4gICAgcmVjb3JkOiBhbnksXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IE0ge1xuICAgIGNvbnN0IHBrQXR0ciA9IE1vZGVsLnBrKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCB0eXBlID0gTWV0YWRhdGEuZ2V0KFxuICAgICAgdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICBNZXRhZGF0YS5rZXkoREJLZXlzLklELCBwa0F0dHIgYXMgc3RyaW5nKVxuICAgICk/LnR5cGU7XG5cbiAgICBpZiAocmVjb3JkW0NvdWNoREJLZXlzLklEXSkge1xuICAgICAgY29uc3QgWywgLi4ua2V5QXJnc10gPSByZWNvcmRbQ291Y2hEQktleXMuSURdLnNwbGl0KENvdWNoREJLZXlzLlNFUEFSQVRPUik7XG4gICAgICBjb25zdCBpZCA9IGtleUFyZ3Muam9pbihcIl9cIik7XG4gICAgICByZWNvcmRbcGtBdHRyXSA9IFNlcXVlbmNlLnBhcnNlVmFsdWUodHlwZSBhcyBhbnksIGlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIucHJvY2Vzc1JlY29yZChyZWNvcmQsIGN0eCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IE1hbmdvIHF1ZXJ5XG4gICAqIEBzdW1tYXJ5IFNlbmRzIGEgcmF3IE1hbmdvIHF1ZXJ5IHRvIEZhYnJpYyBhbmQgcHJvY2Vzc2VzIHRoZSByZXN1bHRzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IE1hbmdvUXVlcnksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmF3KTtcbiAgICBjb25zdCBhZ2dyZWdhdG9yID0gKHJhd0lucHV0IGFzIGFueSk/LmFnZ3JlZ2F0ZUluZm87XG4gICAgaWYgKChyYXdJbnB1dCBhcyBhbnkpPy5hZ2dyZWdhdGUgJiYgYWdncmVnYXRvcikge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFnZ3JlZ2F0ZTxSPihhZ2dyZWdhdG9yLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzOiBhbnlbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoXG4gICAgICByYXdJbnB1dCxcbiAgICAgIHRydWUsXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIGN0eFxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0U2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IHJlc3VsdHMubWFwKChyKSA9PiB0aGlzLnByb2Nlc3NSZWNvcmQociwgY3R4KSk7XG4gICAgICBpZiAoIWN0eC5nZXRPclVuZGVmaW5lZChcImFmdGVyUXVlcnlIYW5kbGVyc1wiKSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzc2VkIGFzIHVua25vd24gYXMgUjtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5hcHBseUFmdGVySGFuZGxlcnNUb1Jlc3VsdChwcm9jZXNzZWQsIGN0eCkpIGFzIFI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIENvdWNoREIgTWFuZ28gcXVlcnkgZnJvbSB0aGUgc3RhdGVtZW50XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHRoZSBzdGF0ZW1lbnQncyBjb25kaXRpb25zLCBzZWxlY3RvcnMsIGFuZCBvcHRpb25zIGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5XG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGQoKTogTWFuZ29RdWVyeSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuYnVpbGQpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZVF1ZXJ5ID0gdGhpcy5idWlsZEFnZ3JlZ2F0ZVF1ZXJ5KCk7XG4gICAgaWYgKGFnZ3JlZ2F0ZVF1ZXJ5KSByZXR1cm4gYWdncmVnYXRlUXVlcnk7XG4gICAgY29uc3Qgc2VsZWN0b3JzOiBNYW5nb1NlbGVjdG9yID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHF1ZXJ5OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjogc2VsZWN0b3JzIH07XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpIHF1ZXJ5LmZpZWxkcyA9IHRoaXMuc2VsZWN0U2VsZWN0b3IgYXMgc3RyaW5nW107XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgY29uZGl0aW9uOiBNYW5nb1NlbGVjdG9yID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGU8TT4oQ291Y2hEQktleXMuVEFCTEUgYXMga2V5b2YgTSkuZXEoXG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvcltDb3VjaERCS2V5cy5UQUJMRV1cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICkuc2VsZWN0b3I7XG4gICAgICBjb25zdCBzZWxlY3RvcktleXMgPSBPYmplY3Qua2V5cyhjb25kaXRpb24pIGFzIE1hbmdvT3BlcmF0b3JbXTtcbiAgICAgIGlmIChcbiAgICAgICAgc2VsZWN0b3JLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBPYmplY3QudmFsdWVzKENvdWNoREJHcm91cE9wZXJhdG9yKS5pbmRleE9mKHNlbGVjdG9yS2V5c1swXSkgIT09IC0xXG4gICAgICApXG4gICAgICAgIHN3aXRjaCAoc2VsZWN0b3JLZXlzWzBdKSB7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSBhcyBNYW5nb1NlbGVjdG9yXG4gICAgICAgICAgICAgICkucmVkdWNlKChhY2N1bTogTWFuZ29TZWxlY3RvcltdLCB2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJUb28gbWFueSBrZXlzIGluIHF1ZXJ5IHNlbGVjdG9yLiBzaG91bGQgYmUgb25lXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IGtleXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGsgPT09IENvdWNoREJHcm91cE9wZXJhdG9yLkFORClcbiAgICAgICAgICAgICAgICAgIGFjY3VtLnB1c2goLi4uKHZhbFtrXSBhcyBhbnlbXSkpO1xuICAgICAgICAgICAgICAgIGVsc2UgYWNjdW0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgICAgfSwgW10pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gY29uZGl0aW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5PUjoge1xuICAgICAgICAgICAgY29uc3QgczogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgc1tDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHF1ZXJ5LnNlbGVjdG9yKS5tYXAoKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IHM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgc2hvdWxkIGJlIGltcG9zc2libGVcIik7XG4gICAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBPYmplY3QuZW50cmllcyhjb25kaXRpb24pLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAocXVlcnkuc2VsZWN0b3Jba2V5XSlcbiAgICAgICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICAgICBgQSAke2tleX0gcXVlcnkgcGFyYW0gaXMgYWJvdXQgdG8gYmUgb3ZlcnJpZGRlbjogJHtxdWVyeS5zZWxlY3RvcltrZXldfSBieSAke3ZhbH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yW2tleV0gPSB2YWw7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcnM/Lmxlbmd0aCkge1xuICAgICAgcXVlcnkuc29ydCA9IHF1ZXJ5LnNvcnQgfHwgW107XG4gICAgICBxdWVyeS5zZWxlY3RvciA9IHF1ZXJ5LnNlbGVjdG9yIHx8ICh7fSBhcyBNYW5nb1NlbGVjdG9yKTtcbiAgICAgIGZvciAoY29uc3QgW3NlbGVjdG9yS2V5LCBkaXJlY3Rpb25dIG9mIHRoaXMub3JkZXJCeVNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9IHNlbGVjdG9yS2V5IGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcmVjOiBSZWNvcmQ8c3RyaW5nLCBPcmRlckRpcmVjdGlvbj4gPSB7fTtcbiAgICAgICAgcmVjW3NlbGVjdG9yXSA9IGRpcmVjdGlvbiBhcyBPcmRlckRpcmVjdGlvbjtcbiAgICAgICAgKHF1ZXJ5LnNvcnQgYXMgUmVjb3JkPHN0cmluZywgT3JkZXJEaXJlY3Rpb24+W10pLnB1c2gocmVjKTtcbiAgICAgICAgaWYgKCFxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0pIHtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgICAgIChxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLkJJR0dFUl0gPVxuICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmxpbWl0U2VsZWN0b3IpIHtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gdGhpcy5saW1pdFNlbGVjdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2FybihcbiAgICAgICAgYE5vIGxpbWl0IHNlbGVjdG9yIGRlZmluZWQuIFVzaW5nIGRlZmF1bHQgY291Y2hkYiBsaW1pdCBvZiAke0NvdWNoREJRdWVyeUxpbWl0fWBcbiAgICAgICk7XG4gICAgICBxdWVyeS5saW1pdCA9IENvdWNoREJRdWVyeUxpbWl0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9mZnNldFNlbGVjdG9yKSBxdWVyeS5za2lwID0gdGhpcy5vZmZzZXRTZWxlY3RvcjtcblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29uZGl0aW9uIGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IHNlbGVjdG9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgQ29uZGl0aW9uIG9iamVjdCBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvciBzdHJ1Y3R1cmVcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwYXJzZUNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbjxNPik6IE1hbmdvUXVlcnkge1xuICAgIGZ1bmN0aW9uIG1lcmdlKFxuICAgICAgb3A6IE1hbmdvT3BlcmF0b3IsXG4gICAgICBvYmoxOiBNYW5nb1NlbGVjdG9yLFxuICAgICAgb2JqMjogTWFuZ29TZWxlY3RvclxuICAgICk6IE1hbmdvUXVlcnkge1xuICAgICAgY29uc3QgcmVzdWx0OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjoge30gYXMgTWFuZ29TZWxlY3RvciB9O1xuICAgICAgcmVzdWx0LnNlbGVjdG9yW29wXSA9IFtvYmoxLCBvYmoyXTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb248TT47XG4gICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgIH07XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLlNUQVJUU19XSVRIKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHIxICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIlNUQVJUU19XSVRIIHJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBuYW1lXCIpO1xuICAgICAgaWYgKHR5cGVvZiBjb21wYXJpc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIlNUQVJUU19XSVRIIHJlcXVpcmVzIGEgc3RyaW5nIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCByYW5nZSA9IHByZWZpeFJhbmdlKGNvbXBhcmlzb24pO1xuICAgICAgY29uc3Qgc2VsZWN0b3I6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgc2VsZWN0b3JbYXR0cjFdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChzZWxlY3RvclthdHRyMV0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLkJJR0dFUl9FUV0gPSByYW5nZS5zdGFydDtcbiAgICAgIChzZWxlY3RvclthdHRyMV0gYXMgTWFuZ29TZWxlY3RvcilbQ291Y2hEQk9wZXJhdG9yLlNNQUxMRVJdID0gcmFuZ2UuZW5kO1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLkVORFNfV0lUSCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyMSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXCJFTkRTX1dJVEggcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIik7XG4gICAgICBpZiAodHlwZW9mIGNvbXBhcmlzb24gIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiRU5EU19XSVRIIHJlcXVpcmVzIGEgc3RyaW5nIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCBzZWxlY3RvcjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBzZWxlY3RvclthdHRyMV0gPSB7XG4gICAgICAgIFtDb3VjaERCT3BlcmF0b3IuUkVHRVhQXTogYCR7ZXNjYXBlUmVnRXhwKGNvbXBhcmlzb24pfSRgLFxuICAgICAgfSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IgfTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLkJFVFdFRU4pIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBhdHRyMSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29tcGFyaXNvbikgfHwgY29tcGFyaXNvbi5sZW5ndGggIT09IDIpXG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFwiQkVUV0VFTiBvcGVyYXRvciByZXF1aXJlcyBbbWluLCBtYXhdIGNvbXBhcmlzb25cIik7XG4gICAgICBjb25zdCBbbWluLCBtYXhdID0gY29tcGFyaXNvbjtcbiAgICAgIGNvbnN0IG9wQmV0d2VlbjogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcEJldHdlZW5bYXR0cl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wQmV0d2VlblthdHRyXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLkJJR0dFUl9FUSlcbiAgICAgIF0gPSBtaW47XG4gICAgICAob3BCZXR3ZWVuW2F0dHJdIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuU01BTExFUl9FUSlcbiAgICAgIF0gPSBtYXg7XG4gICAgICByZXR1cm4geyBzZWxlY3Rvcjogb3BCZXR3ZWVuIH07XG4gICAgfVxuXG4gICAgbGV0IG9wOiBNYW5nb1NlbGVjdG9yID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICBpZiAoXG4gICAgICBbR3JvdXBPcGVyYXRvci5BTkQsIEdyb3VwT3BlcmF0b3IuT1IsIE9wZXJhdG9yLk5PVF0uaW5kZXhPZihcbiAgICAgICAgb3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIG9wW2F0dHIxIGFzIHN0cmluZ10gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW2F0dHIxIGFzIHN0cmluZ10gYXMgTWFuZ29TZWxlY3RvcilbdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKV0gPVxuICAgICAgICBjb21wYXJpc29uO1xuICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLk5PVCkge1xuICAgICAgb3AgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3IgYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldIGFzIE1hbmdvU2VsZWN0b3IpW1xuICAgICAgICAoYXR0cjEgYXMgdW5rbm93biBhcyB7IGF0dHIxOiBzdHJpbmcgfSkuYXR0cjFcbiAgICAgIF0gPSBjb21wYXJpc29uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcDE6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+KS5zZWxlY3RvcjtcbiAgICAgIGNvbnN0IG9wMjogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihjb21wYXJpc29uIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBvcCA9IG1lcmdlKHRyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvciksIG9wMSwgb3AyKS5zZWxlY3RvcjtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzZWxlY3Rvcjogb3AgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGFuIGFnZ3JlZ2F0ZSBxdWVyeSBpZiBhZ2dyZWdhdGlvbiBpcyByZXF1ZXN0ZWRcbiAgICogQHN1bW1hcnkgQ2hlY2tzIGZvciBhZ2dyZWdhdGUgb3BlcmF0aW9ucyBhbmQgcmV0dXJucyBhIHNwZWNpYWwgTWFuZ29RdWVyeSBmb3IgdGhlbVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFnZ3JlZ2F0ZVF1ZXJ5KCk6IE1hbmdvUXVlcnkgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuYXZnU2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IFN0cmluZyh0aGlzLmF2Z1NlbGVjdG9yKTtcbiAgICAgIGNvbnN0IHN1bUluZm8gPSB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZURlc2NyaXB0b3IoXCJzdW1cIiwgYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IGNvdW50SW5mbyA9IHRoaXMuY3JlYXRlQWdncmVnYXRlRGVzY3JpcHRvcihcImNvdW50XCIsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoIXN1bUluZm8gfHwgIWNvdW50SW5mbylcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgICAgYEF2ZyBvcGVyYXRpb24gcmVxdWlyZXMgc3VtIGFuZCBjb3VudCB2aWV3cyBmb3IgYXR0cmlidXRlICR7YXR0cmlidXRlfWBcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KHtcbiAgICAgICAga2luZDogXCJhdmdcIixcbiAgICAgICAgYXR0cmlidXRlLFxuICAgICAgICBzdW1EZXNjcmlwdG9yOiBzdW1JbmZvLmRlc2NyaXB0b3IsXG4gICAgICAgIGNvdW50RGVzY3JpcHRvcjogY291bnRJbmZvLmRlc2NyaXB0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuY291bnREaXN0aW5jdFNlbGVjdG9yICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPVxuICAgICAgICB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciA9PSBudWxsXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IFN0cmluZyh0aGlzLmNvdW50RGlzdGluY3RTZWxlY3Rvcik7XG4gICAgICBjb25zdCBpbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFwiZGlzdGluY3RcIiwgYXR0cmlidXRlKTtcbiAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgIGluZm8uY291bnREaXN0aW5jdCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFnZ3JlZ2F0ZVF1ZXJ5KGluZm8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFnZ3JlZ2F0b3JVc2VkID1cbiAgICAgIHR5cGVvZiB0aGlzLmNvdW50U2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIHR5cGVvZiB0aGlzLmNvdW50RGlzdGluY3RTZWxlY3RvciAhPT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgISF0aGlzLm1pblNlbGVjdG9yIHx8XG4gICAgICAhIXRoaXMubWF4U2VsZWN0b3IgfHxcbiAgICAgICEhdGhpcy5zdW1TZWxlY3RvciB8fFxuICAgICAgISF0aGlzLmRpc3RpbmN0U2VsZWN0b3I7XG5cbiAgICBjb25zdCBhZ2dyZWdhdG9yQ2hlY2tzOiBBcnJheTxbVmlld0tpbmQsIFNlbGVjdFNlbGVjdG9yPE0+IHwgdW5kZWZpbmVkXT4gPSBbXG4gICAgICBbXG4gICAgICAgIFwiY291bnRcIixcbiAgICAgICAgKHRoaXMuY291bnRTZWxlY3RvciA/PyB1bmRlZmluZWQpIGFzIFNlbGVjdFNlbGVjdG9yPE0+IHwgdW5kZWZpbmVkLFxuICAgICAgXSxcbiAgICAgIFtcIm1heFwiLCB0aGlzLm1heFNlbGVjdG9yXSxcbiAgICAgIFtcIm1pblwiLCB0aGlzLm1pblNlbGVjdG9yXSxcbiAgICAgIFtcInN1bVwiLCB0aGlzLnN1bVNlbGVjdG9yXSxcbiAgICAgIFtcImRpc3RpbmN0XCIsIHRoaXMuZGlzdGluY3RTZWxlY3Rvcl0sXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgW2tpbmQsIHNlbGVjdG9yXSBvZiBhZ2dyZWdhdG9yQ2hlY2tzKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBzZWxlY3RvciA/IFN0cmluZyhzZWxlY3RvcikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpbmZvID0gdGhpcy5jcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKGtpbmQsIGF0dHJpYnV0ZSk7XG4gICAgICBpZiAoaW5mbykgcmV0dXJuIHRoaXMuY3JlYXRlQWdncmVnYXRlUXVlcnkoaW5mbyk7XG4gICAgfVxuXG4gICAgaWYgKGFnZ3JlZ2F0b3JVc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgYE5vIENvdWNoREIgdmlldyBtZXRhZGF0YSBmb3VuZCBmb3IgdGFibGUgJHtNb2RlbC50YWJsZU5hbWUoXG4gICAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICAgKX0gYWdncmVnYXRvcmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gYWdncmVnYXRlIGRlc2NyaXB0b3IgZm9yIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yKFxuICAgIGtpbmQ6IFZpZXdLaW5kLFxuICAgIGF0dHJpYnV0ZT86IHN0cmluZ1xuICApOiBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YXMgPSBmaW5kVmlld01ldGFkYXRhKHRoaXMuZnJvbVNlbGVjdG9yLCBraW5kLCBhdHRyaWJ1dGUpO1xuICAgIGlmICghbWV0YXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1ldGEgPSBtZXRhc1swXTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHZpZXdOYW1lID0gZ2VuZXJhdGVWaWV3TmFtZSh0YWJsZU5hbWUsIG1ldGEuYXR0cmlidXRlLCBraW5kLCBtZXRhKTtcbiAgICBjb25zdCBkZG9jID0gbWV0YS5kZG9jIHx8IGdlbmVyYXRlRGVzaWduRG9jTmFtZSh0YWJsZU5hbWUsIHZpZXdOYW1lKTtcbiAgICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgcmVkdWNlOiBtZXRhLnJlZHVjZSAhPT0gdW5kZWZpbmVkID8gdHJ1ZSA6ICFtZXRhLnJldHVybkRvY3MsXG4gICAgfTtcbiAgICBpZiAoa2luZCA9PT0gXCJkaXN0aW5jdFwiIHx8IGtpbmQgPT09IFwiZ3JvdXBCeVwiKSBvcHRpb25zLmdyb3VwID0gdHJ1ZTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZCxcbiAgICAgIG1ldGEsXG4gICAgICBkZXNjcmlwdG9yOiB7XG4gICAgICAgIGRkb2MsXG4gICAgICAgIHZpZXc6IHZpZXdOYW1lLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHRoZSBzcGVjaWFsIGFnZ3JlZ2F0ZSBNYW5nb1F1ZXJ5IG1hcmtlclxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBZ2dyZWdhdGVRdWVyeShcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvXG4gICk6IE1hbmdvUXVlcnkgJiB7IGFnZ3JlZ2F0ZTogdHJ1ZTsgYWdncmVnYXRlSW5mbzogRmFicmljQWdncmVnYXRlSW5mbyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3I6IHt9LFxuICAgICAgYWdncmVnYXRlOiB0cnVlLFxuICAgICAgYWdncmVnYXRlSW5mbzogaW5mbyxcbiAgICB9IGFzIE1hbmdvUXVlcnkgJiB7IGFnZ3JlZ2F0ZTogdHJ1ZTsgYWdncmVnYXRlSW5mbzogRmFicmljQWdncmVnYXRlSW5mbyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhZGFwdGVyIGNhc3QgdG8gRmFicmljQ2xpZW50QWRhcHRlciBmb3IgdmlldyBhY2Nlc3NcbiAgICovXG4gIHByaXZhdGUgZ2V0RmFicmljQWRhcHRlcigpOiBGYWJyaWNDbGllbnRBZGFwdGVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGFuIGFnZ3JlZ2F0ZSBxdWVyeSB2aWEgYWRhcHRlcidzIHZpZXcgbWV0aG9kXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVBZ2dyZWdhdGU8Uj4oXG4gICAgaW5mbzogRmFicmljQWdncmVnYXRlSW5mbyxcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUHJvbWlzZTxSPiB7XG4gICAgaWYgKCF0aGlzLmlzVmlld0FnZ3JlZ2F0ZShpbmZvKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQXZlcmFnZTxSPihpbmZvLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCBmYWJyaWNBZGFwdGVyID0gdGhpcy5nZXRGYWJyaWNBZGFwdGVyKCk7XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZhYnJpY0FkYXB0ZXIudmlldzxWaWV3UmVzcG9uc2U+KFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci5kZG9jLFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci52aWV3LFxuICAgICAgdmlld0luZm8uZGVzY3JpcHRvci5vcHRpb25zLFxuICAgICAgY3R4XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVmlld1Jlc3BvbnNlPFI+KGluZm8sIHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBhdmVyYWdlIGNhbGN1bGF0aW9uIGZyb20gc3VtIGFuZCBjb3VudCB2aWV3c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVBdmVyYWdlPFI+KFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm8sXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFByb21pc2U8Uj4ge1xuICAgIGlmIChpbmZvLmtpbmQgIT09IFwiYXZnXCIpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkF2ZXJhZ2UgZGVzY3JpcHRvciBpcyBub3QgdmFsaWRcIik7XG4gICAgY29uc3QgZmFicmljQWRhcHRlciA9IHRoaXMuZ2V0RmFicmljQWRhcHRlcigpO1xuICAgIGNvbnN0IFtzdW1EZXNjLCBjb3VudERlc2NdID0gW2luZm8uc3VtRGVzY3JpcHRvciwgaW5mby5jb3VudERlc2NyaXB0b3JdO1xuICAgIGNvbnN0IFtzdW1SZXNwb25zZSwgY291bnRSZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmYWJyaWNBZGFwdGVyLnZpZXc8Vmlld1Jlc3BvbnNlPihcbiAgICAgICAgc3VtRGVzYy5kZG9jLFxuICAgICAgICBzdW1EZXNjLnZpZXcsXG4gICAgICAgIHN1bURlc2Mub3B0aW9ucyxcbiAgICAgICAgY3R4XG4gICAgICApLFxuICAgICAgZmFicmljQWRhcHRlci52aWV3PFZpZXdSZXNwb25zZT4oXG4gICAgICAgIGNvdW50RGVzYy5kZG9jLFxuICAgICAgICBjb3VudERlc2MudmlldyxcbiAgICAgICAgY291bnREZXNjLm9wdGlvbnMsXG4gICAgICAgIGN0eFxuICAgICAgKSxcbiAgICBdKTtcbiAgICBjb25zdCBzdW0gPSBzdW1SZXNwb25zZS5yb3dzPy5bMF0/LnZhbHVlID8/IDA7XG4gICAgY29uc3QgY291bnQgPSBjb3VudFJlc3BvbnNlLnJvd3M/LlswXT8udmFsdWUgPz8gMDtcbiAgICBpZiAoIWNvdW50KSByZXR1cm4gMCBhcyB1bmtub3duIGFzIFI7XG4gICAgcmV0dXJuIChzdW0gLyBjb3VudCkgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgdGhlIHZpZXcgcmVzcG9uc2UgYmFzZWQgb24gYWdncmVnYXRlIGtpbmRcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1ZpZXdSZXNwb25zZTxSPihcbiAgICBpbmZvOiBGYWJyaWNBZ2dyZWdhdGVJbmZvLFxuICAgIHJlc3BvbnNlOiBWaWV3UmVzcG9uc2VcbiAgKTogUiB7XG4gICAgaWYgKGluZm8ua2luZCA9PT0gXCJhdmdcIilcbiAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICBcIkF2ZXJhZ2UgcmVzdWx0cyBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUgcHJvY2Vzc2luZyByb3dzXCJcbiAgICAgICk7XG4gICAgY29uc3Qgcm93cyA9IHJlc3BvbnNlLnJvd3MgfHwgW107XG4gICAgY29uc3Qgdmlld0luZm8gPSBpbmZvIGFzIEV4dHJhY3Q8RmFicmljQWdncmVnYXRlSW5mbywgeyBraW5kOiBWaWV3S2luZCB9PjtcbiAgICBjb25zdCBtZXRhID0gdmlld0luZm8ubWV0YTtcbiAgICBpZiAodmlld0luZm8uY291bnREaXN0aW5jdCkge1xuICAgICAgcmV0dXJuIChyb3dzLmxlbmd0aCB8fCAwKSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICh2aWV3SW5mby5raW5kID09PSBcImRpc3RpbmN0XCIgfHwgdmlld0luZm8ua2luZCA9PT0gXCJncm91cEJ5XCIpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cua2V5ID8/IHJvdy52YWx1ZSkgYXMgdW5rbm93biBhcyBSO1xuICAgIH1cbiAgICBpZiAobWV0YS5yZXR1cm5Eb2NzKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gcm93LnZhbHVlID8/IHJvdy5kb2MgPz8gcm93KSBhcyB1bmtub3duIGFzIFI7XG4gICAgfVxuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAodmlld0luZm8ua2luZCA9PT0gXCJjb3VudFwiID8gMCA6IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgICB9XG4gICAgcmV0dXJuIChyb3dzWzBdLnZhbHVlID8/IHJvd3NbMF0ua2V5ID8/IG51bGwpIGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHlwZSBndWFyZCB0byBjaGVjayBpZiBpbmZvIGlzIGEgdmlldy1iYXNlZCBhZ2dyZWdhdGVcbiAgICovXG4gIHByaXZhdGUgaXNWaWV3QWdncmVnYXRlKFxuICAgIGluZm86IEZhYnJpY0FnZ3JlZ2F0ZUluZm9cbiAgKTogaW5mbyBpcyBFeHRyYWN0PEZhYnJpY0FnZ3JlZ2F0ZUluZm8sIHsga2luZDogVmlld0tpbmQgfT4ge1xuICAgIHJldHVybiBpbmZvLmtpbmQgIT09IFwiYXZnXCI7XG4gIH1cbn1cbiIsImltcG9ydCBcIi4uL3NoYXJlZC9vdmVycmlkZXNcIjtcbmltcG9ydCB7XG4gIENvdWNoREJLZXlzLFxuICB0eXBlIE1hbmdvUXVlcnksXG4gIHR5cGUgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0ICogYXMgZ3JwYyBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIHR5cGUgTW9kZWxDb25zdHJ1Y3RvcixcbiAgdHlwZSBTZXJpYWxpemVyLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBkZWJ1ZywgZmluYWwsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIHR5cGUgUGVlckNvbmZpZyxcbiAgdHlwZSBTZWdyZWdhdGVkTW9kZWwsXG4gIHR5cGUgTXNwRGV0YWlscyxcbn0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgY29ubmVjdCxcbiAgdHlwZSBDb25uZWN0T3B0aW9ucyxcbiAgR2F0ZXdheSxcbiAgTmV0d29yayxcbiAgUHJvcG9zYWxPcHRpb25zLFxuICBDb250cmFjdCBhcyBDb250cmFrdCxcbiAgdHlwZSBTaWduZXIsXG4gIEdhdGV3YXlFcnJvcixcbiAgRW5kb3JzZUVycm9yLFxufSBmcm9tIFwiQGh5cGVybGVkZ2VyL2ZhYnJpYy1nYXRld2F5XCI7XG5pbXBvcnQgeyBHYXRld2F5IGFzIExlZ2FjeUdhdGV3YXksIFdhbGxldHMgfSBmcm9tIFwiZmFicmljLW5ldHdvcmtcIjtcbmltcG9ydCB0eXBlIHsgRW5kb3JzZXIgfSBmcm9tIFwiZmFicmljLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgZ2V0SWRlbnRpdHksXG4gIGdldFNpZ25lcixcbiAgZ2V0Rmlyc3REaXJGaWxlTmFtZUNvbnRlbnQsXG4gIHJlYWRGaWxlIGFzIHJlYWRGc0ZpbGUsXG59IGZyb20gXCIuL2ZhYnJpYy1mc1wiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgTm90Rm91bmRFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQmFkUmVxdWVzdEVycm9yLFxuICB0eXBlIFByaW1hcnlLZXlUeXBlLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgQWRhcHRlcixcbiAgdHlwZSBBZGFwdGVyRmxhZ3MsXG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBGb3JiaWRkZW5FcnJvcixcbiAgTWlncmF0aW9uRXJyb3IsXG4gIE9ic2VydmVyRXJyb3IsXG4gIFBhZ2luZ0Vycm9yLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFF1ZXJ5RXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFN0YXRlbWVudCxcbiAgdHlwZSBQcmVwYXJlZFN0YXRlbWVudCxcbiAgUGFnaW5hdG9yLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIENvbnRleHR1YWxBcmdzLFxuICB0eXBlIFByZXBhcmVkTW9kZWwsXG4gIEFsbE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciwgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4uL3NoYXJlZC9jb25zdGFudHNcIjtcbmltcG9ydCB7IENsaWVudFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vc2hhcmVkL0NsaWVudFNlcmlhbGl6ZXJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudENvbnRleHQgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnREaXNwYXRjaCB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudERpc3BhdGNoXCI7XG4vLyBpbXBvcnQgeyBIU01TaWduZXJGYWN0b3J5Q3VzdG9tIH0gZnJvbSBcIi4vZmFicmljLWhzbVwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50U3RhdGVtZW50IH0gZnJvbSBcIi4vRmFicmljQ2xpZW50U3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWJyaWNDbGllbnRQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRQYWdpbmF0b3JcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRSZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBFbmRvcnNlbWVudEVycm9yLFxuICBFbmRvcnNlbWVudFBvbGljeUVycm9yLFxuICBNdmNjUmVhZENvbmZsaWN0RXJyb3IsXG4gIFBoYW50b21SZWFkQ29uZmxpY3RFcnJvcixcbiAgUXVlcnlSZXN1bHRUb29MYXJnZUVycm9yLFxuICBUcmFuc2FjdGlvblRpbWVvdXRFcnJvcixcbn0gZnJvbSBcIi4uL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlZmF1bHRGYWJyaWNDbGllbnRGbGFncyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgQ3J5cHRvVXRpbHMgfSBmcm9tIFwiLi9jcnlwdG9cIjtcbmltcG9ydCB7IGV4dHJhY3RJZHMgfSBmcm9tIFwiLi9pZHMvaWQtZXh0cmFjdGlvblwiO1xuaW1wb3J0IHsgRGVmYXVsdENvbnRyYWN0UmVzb2x2ZXIsIElkZW50aXR5IH0gZnJvbSBcIi4uL3NoYXJlZC9pbmRleFwiO1xuXG50eXBlIExlZ2FjeVBlZXJUYXJnZXQgPSB7XG4gIG1zcElkOiBzdHJpbmc7XG4gIHBlZXJFbmRwb2ludDogc3RyaW5nO1xuICBwZWVySG9zdEFsaWFzPzogc3RyaW5nO1xuICB0bHNDZXJ0Pzogc3RyaW5nIHwgQnVmZmVyO1xufTtcblxudHlwZSBMZWdhY3lQZWVyV2l0aE5hbWUgPSBMZWdhY3lQZWVyVGFyZ2V0ICYgeyBuYW1lOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3NcbiAqIEBzdW1tYXJ5IFRoZSBGYWJyaWNBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXIgdG8gcHJvdmlkZSBhIHNlYW1sZXNzIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya3MuXG4gKiBJdCBoYW5kbGVzIGNvbm5lY3Rpb24gbWFuYWdlbWVudCwgdHJhbnNhY3Rpb24gc3VibWlzc2lvbiwgYW5kIENSVUQgb3BlcmF0aW9ucyBhZ2FpbnN0IEZhYnJpYyBjaGFpbmNvZGUuXG4gKiBAdGVtcGxhdGUgUGVlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdHlwZSBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAdGVtcGxhdGUgRmFicmljRmxhZ3MgLSBGbGFncyBzcGVjaWZpYyB0byBGYWJyaWMgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIENvbnRleHQ8RmFicmljRmxhZ3M+IC0gQ29udGV4dCB0eXBlIGNvbnRhaW5pbmcgRmFicmljLXNwZWNpZmljIGZsYWdzXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gKiBAcGFyYW0gYWxpYXMgLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAqIEBjbGFzcyBGYWJyaWNDbGllbnRBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0FkYXB0ZXIgaW5zdGFuY2VcbiAqIGNvbnN0IGNvbmZpZzogUGVlckNvbmZpZyA9IHtcbiAqICAgbXNwSWQ6ICdPcmcxTVNQJyxcbiAqICAgcGVlckVuZHBvaW50OiAnbG9jYWxob3N0OjcwNTEnLFxuICogICBjaGFubmVsTmFtZTogJ215Y2hhbm5lbCcsXG4gKiAgIGNoYWluY29kZU5hbWU6ICdteWNjJyxcbiAqICAgY29udHJhY3ROYW1lOiAnbXljb250cmFjdCcsXG4gKiAgIHRsc0NlcnRQYXRoOiAnL3BhdGgvdG8vdGxzL2NlcnQnLFxuICogICBjZXJ0RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2NlcnQvZGlyJyxcbiAqICAga2V5RGlyZWN0b3J5UGF0aDogJy9wYXRoL3RvL2tleS9kaXInXG4gKiB9O1xuICpcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgRmFicmljQWRhcHRlcihjb25maWcsICdvcmcxLWFkYXB0ZXInKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRmFicmljIG5ldHdvcmtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkYXB0ZXIucmVhZCgndXNlcnMnLCAndXNlcjEnLCBteVNlcmlhbGl6ZXIpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAqICAgcGFydGljaXBhbnQgTmV0d29ya1xuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBDaGFpbmNvZGVcbiAqXG4gKiAgIENsaWVudC0+PkZhYnJpY0FkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbCwgdHJhbnNpZW50LCBzZXJpYWxpemVyKVxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogc3VibWl0VHJhbnNhY3Rpb24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFtzZXJpYWxpemVkTW9kZWxdLCB0cmFuc2llbnQpXG4gKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KClcbiAqICAgR2F0ZXdheS0+Pk5ldHdvcms6IGdldE5ldHdvcmsoY2hhbm5lbE5hbWUpXG4gKiAgIE5ldHdvcmstPj5Db250cmFjdDogZ2V0Q29udHJhY3QoY2hhaW5jb2RlTmFtZSwgY29udHJhY3ROYW1lKVxuICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IHN1Ym1pdChhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gKiAgIENvbnRyYWN0LS0+PkZhYnJpY0FkYXB0ZXI6IHJlc3VsdFxuICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogZGVjb2RlKHJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVjb2RlZFJlc3VsdClcbiAqICAgRmFicmljQWRhcHRlci0tPj5DbGllbnQ6IGRlc2VyaWFsaXplZFJlc3VsdFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ2xpZW50QWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8XG4gIFBlZXJDb25maWcsXG4gIENsaWVudCxcbiAgTWFuZ29RdWVyeSxcbiAgRmFicmljQ2xpZW50Q29udGV4dFxuPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIHRleHQgZGVjb2RlciBmb3IgY29udmVydGluZyBVaW50OEFycmF5IHRvIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2VyaWFsaXplciA9IG5ldyBDbGllbnRTZXJpYWxpemVyKCk7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBsb2cgPSBMb2dnaW5nLmZvcihGYWJyaWNDbGllbnRBZGFwdGVyKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXplcjxhbnk+ID1cbiAgICBGYWJyaWNDbGllbnRBZGFwdGVyLnNlcmlhbGl6ZXI7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBDb250ZXh0KCk6IENvbnN0cnVjdG9yPEZhYnJpY0NsaWVudENvbnRleHQ+IHtcbiAgICByZXR1cm4gRmFicmljQ2xpZW50Q29udGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNBZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IGFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggYSBIeXBlcmxlZGdlciBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQZWVyQ29uZmlnLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzLCBjb25maWcpLFxuICAgICAgRmFicmljRmxhdm91cixcbiAgICAgIGFsaWFzXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGFpbmNvZGVGb3IoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmNoYWluY29kZUZvcihtb2RlbCwgdGhpcy5jb25maWcsIC4uLmFyZ3MpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoYW5uZWxGb3IoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmNoYW5uZWxGb3IobW9kZWwsIHRoaXMuY29uZmlnLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb250cmFjdEZvcihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuY29udHJhY3RGb3IobW9kZWwsIHRoaXMuY29uZmlnLCAuLi5hcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPlxuICApOiBTdGF0ZW1lbnQ8TSwgRmFicmljQ2xpZW50QWRhcHRlciwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDbGllbnRTdGF0ZW1lbnQodGhpcywgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHF1ZXJ5OiBQcmVwYXJlZFN0YXRlbWVudDxhbnk+IHwgTWFuZ29RdWVyeSxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICk6IFBhZ2luYXRvcjxNLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NsaWVudFBhZ2luYXRvcih0aGlzLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IENvbnN0cnVjdG9yPE0+W10gfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmFicmljQ2xpZW50RmxhZ3M+IHtcbiAgICBjb25zdCBtZXJnZWRGbGFncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCBmbGFncyk7XG4gICAgY29uc3QgZiA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBtZXJnZWRGbGFncywgLi4uYXJncylcbiAgICApO1xuICAgIHJldHVybiBmO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY29udGV4dDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IEFsbE9wZXJhdGlvbktleXMsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEZhYnJpY0NsaWVudEZsYWdzPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPEZhYnJpY0NsaWVudENvbnRleHQ+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb250ZXh0KTtcbiAgICBsb2cuc2lsbHkoXG4gICAgICBgY3JlYXRpbmcgbmV3IGNvbnRleHQgZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb24gb24gJHttb2RlbCA/IChBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsLm1hcCgobSkgPT4gTW9kZWwudGFibGVOYW1lKG0pKSA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCkpIDogXCJub1wifSB0YWJsZSAke292ZXJyaWRlcyAmJiBPYmplY3Qua2V5cyhvdmVycmlkZXMpID8gT2JqZWN0LmtleXMob3ZlcnJpZGVzKS5sZW5ndGggOiBcIm5vXCJ9IHdpdGggZmxhZyBvdmVycmlkZXNgXG4gICAgKTtcbiAgICBsZXQgY3R4ID0gYXJncy5wb3AoKTtcbiAgICBpZiAodHlwZW9mIGN0eCAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKSB7XG4gICAgICBhcmdzLnB1c2goY3R4KTtcbiAgICAgIGN0eCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBvdmVycmlkZXMgPSBjdHhcbiAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgY3R4LnRvT3ZlcnJpZGVzKCksIG92ZXJyaWRlcylcbiAgICAgIDogb3ZlcnJpZGVzO1xuICAgIGNvbnN0IGZsYWdzID0gYXdhaXQgdGhpcy5mbGFncyhcbiAgICAgIHR5cGVvZiBvcGVyYXRpb24gPT09IFwic3RyaW5nXCIgPyBvcGVyYXRpb24gOiBvcGVyYXRpb24ubmFtZSxcbiAgICAgIG1vZGVsLFxuICAgICAgb3ZlcnJpZGVzIGFzIFBhcnRpYWw8RmFicmljQ2xpZW50RmxhZ3M+LFxuICAgICAgLi4uWy4uLmFyZ3MsIGN0eF0uZmlsdGVyKEJvb2xlYW4pXG4gICAgKTtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGlmICghKGN0eCBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE9wID0gY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpO1xuICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gY3R4LmdldE9yVW5kZWZpbmVkKFwiYWZmZWN0ZWRUYWJsZXNcIik7XG4gICAgICBpZiAoXG4gICAgICAgICFjdXJyZW50T3AgfHxcbiAgICAgICAgY3VycmVudE9wICE9PSBvcGVyYXRpb24gfHxcbiAgICAgICAgKG1vZGVsICYmIG1vZGVsICE9PSBjdXJyZW50TW9kZWwpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgICAgIC4uLmN0eFtcImNhY2hlXCJdLFxuICAgICAgICAgIC4uLmZsYWdzLFxuICAgICAgICAgIHBhcmVudENvbnRleHQ6IGN0eCxcbiAgICAgICAgfSkgYXMgYW55O1xuXG4gICAgICAgIGN0eC5hY2N1bXVsYXRlKHtcbiAgICAgICAgICBjaGlsZENvbnRleHRzOiBbXG4gICAgICAgICAgICAuLi4oY3R4LmdldE9yVW5kZWZpbmVkKFwiY2hpbGRDb250ZXh0c1wiKSB8fCBbXSksXG4gICAgICAgICAgICBuZXdDdHgsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdDdHg7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3R4LmFjY3VtdWxhdGUoZmxhZ3MpIGFzIGFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoe1xuICAgICAgLi4uZmxhZ3MsXG4gICAgfSkgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWNvZGVzIGEgVWludDhBcnJheSB0byBhIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBiaW5hcnkgZGF0YSByZWNlaXZlZCBmcm9tIEZhYnJpYyB0byBhIHN0cmluZyB1c2luZyBVVEYtOCBlbmNvZGluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGEgLSBUaGUgYmluYXJ5IGRhdGEgdG8gZGVjb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nXG4gICAqL1xuICBkZWNvZGUoZGF0YTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gIH1cblxuICBvdmVycmlkZSByZXBvc2l0b3J5PFxuICAgIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICAgICAgYW55LFxuICAgICAgQWRhcHRlcjxQZWVyQ29uZmlnLCBDbGllbnQsIE1hbmdvUXVlcnksIEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICAgPixcbiAgPigpOiBDb25zdHJ1Y3RvcjxSPiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudFJlcG9zaXRvcnkgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxSPjtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBbXG4gICAgQ29uc3RydWN0b3I8TT4sXG4gICAgUHJpbWFyeUtleVR5cGUsXG4gICAgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hbnlbXSxcbiAgICBGYWJyaWNDbGllbnRDb250ZXh0LFxuICBdIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlUHJlZml4KTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgcmVjb3JkcyBmb3IgY3JlYXRpb25cbiAgICogQHN1bW1hcnkgQWRkcyBuZWNlc3NhcnkgQ291Y2hEQiBmaWVsZHMgdG8gbXVsdGlwbGUgcmVjb3JkcyBiZWZvcmUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZHMgLSBUaGUgSURzIG9mIHRoZSByZWNvcmRzXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHByZXBhcmVcbiAgICogQHJldHVybiBBIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHRhYmxlTmFtZSwgaWRzLCBhbmQgcHJlcGFyZWQgcmVjb3Jkc1xuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBpZHMgYW5kIG1vZGVscyBhcnJheXMgaGF2ZSBkaWZmZXJlbnQgbGVuZ3Roc1xuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUFsbFByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKGlkLCBjb3VudCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsc1tjb3VudF0pO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZHMsIHJlY29yZHMsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUFsbFByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZUFsbFByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZHMsIHJlY29yZHMsIC4uLmN0eEFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge0FycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+fSBtb2RlbHMgLSBBcnJheSBvZiByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICAvL0hFUkUhXG4gICAgY29uc3QgY3R4QXJncyA9IFsuLi4oYXJncyBhcyB1bmtub3duIGFzIGFueVtdKV07XG4gICAgY29uc3QgdHJhbnNpZW50ID0gY3R4QXJncy5zaGlmdCgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoXG4gICAgICBjdHhBcmdzIGFzIENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+LFxuICAgICAgdGhpcy5jcmVhdGVBbGxcbiAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBsb2cuaW5mbyhgYWRkaW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCBoYXNUcmFuc2llbnQgPSB0cmFuc2llbnQgJiYgT2JqZWN0LmtleXModHJhbnNpZW50KS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgaGFzVHJhbnNpZW50IHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZE1vZGVscyA9IG1vZGVscy5tYXAoKG0pID0+XG4gICAgICB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG0sIGNsYXp6Lm5hbWUpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgIFtKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkTW9kZWxzKV0sXG4gICAgICBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenpcbiAgICApO1xuXG4gICAgbGV0IHJlczogUmVjb3JkPHN0cmluZywgYW55PltdO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBjdHgsXG4gICAgICAgIG5lZWRzRnVsbFBheWxvYWQsXG4gICAgICAgIHJlc1swXVtNb2RlbC5wayhjbGF6eikgYXMgc3RyaW5nXSB8fCBpZHNbMF1cbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRBbGwoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgICBNb2RlbC5tZXJnZShcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgbSBhcyBhbnksIHRyYW5zaWVudD8uW2ldIHx8IHt9KSxcbiAgICAgICAgICAgICAgcmVzW2ldXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIHJlY29yZHMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHJlYWQgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBGYWJyaWMgbGVkZ2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIHJlY29yZCBpZGVudGlmaWVycyB0byByZWFkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkQWxsKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5pbmZvKGByZWFkaW5nICR7aWRzLmxlbmd0aH0gZW50cmllcyB0byAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cudmVyYm9zZShgcGtzOiAke2lkc31gKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsXG4gICAgICBbSlNPTi5zdHJpbmdpZnkoaWRzKV0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHJlc3VsdCkpLm1hcCgocjogYW55KSA9PiBKU09OLnBhcnNlKHIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gbW9kZWxzIC0gQXJyYXkgb2YgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB0cmFuc2llbnQgPSBjdHhBcmdzLnNoaWZ0KCkgYXMgUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD4sXG4gICAgICB0aGlzLnVwZGF0ZUFsbFxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuaW5mbyhgdXBkYXRpbmcgJHtpZHMubGVuZ3RofSBlbnRyaWVzIHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy52ZXJib3NlKGBwa3M6ICR7aWRzfWApO1xuICAgIGNvbnN0IGhhc1RyYW5zaWVudCA9IHRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyh0cmFuc2llbnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbmVlZHNGdWxsUGF5bG9hZCA9XG4gICAgICBoYXNUcmFuc2llbnQgfHwgdGhpcy5zaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oY3R4KTtcbiAgICBjb25zdCBzZXJpYWxpemVkTW9kZWxzID0gbW9kZWxzLm1hcCgobSkgPT5cbiAgICAgIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUobSwgY2xhenoubmFtZSlcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWRNb2RlbHMpXSxcbiAgICAgIGhhc1RyYW5zaWVudCA/IHsgW3RhYmxlTmFtZV06IHRyYW5zaWVudCB9IDogdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6elxuICAgICk7XG5cbiAgICBsZXQgcmVzOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSkubWFwKChyOiBhbnkpID0+IEpTT04ucGFyc2UocikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUoY2xhenosIGN0eCwgbmVlZHNGdWxsUGF5bG9hZCwgaWRzWzBdKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgY2xhenosXG4gICAgICAgIGV4dHJhY3RJZHMoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICAgIE1vZGVsLm1lcmdlKFxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBtIGFzIGFueSwgdHJhbnNpZW50Py5baV0gfHwge30pLFxuICAgICAgICAgICAgICByZXNbaV1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIGlkc1xuICAgICAgICApLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvblxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gZGVsZXRlIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+fSBpZHMgLSBBcnJheSBvZiByZWNvcmQgaWRlbnRpZmllcnMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7U2VyaWFsaXplcjxhbnk+fSBzZXJpYWxpemVyIC0gU2VyaWFsaXplciBmb3IgdGhlIG1vZGVsIGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4LCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmRlbGV0ZUFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgTW9kZWwuaXNUcmFuc2llbnQoY2xhenopIHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIGNvbnN0IHNob3VsZEh5ZHJhdGUgPSB0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKFxuICAgICAgY2xhenosXG4gICAgICBjdHgsXG4gICAgICBuZWVkc0Z1bGxQYXlsb2FkLFxuICAgICAgaWRzWzBdXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkSHlkcmF0ZSkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZWFkQWxsKGNsYXp6LCBpZHMsIC4uLmN0eEFyZ3MpO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBkZWxldGluZyAke2lkcy5sZW5ndGh9IGVudHJpZXMgdG8gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLnZlcmJvc2UoYHBrczogJHtpZHN9YCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLFxuICAgICAgW0pTT04uc3RyaW5naWZ5KGlkcyldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzaG91bGRIeWRyYXRlXG4gICAgICAgID8gcmVzdWx0XG4gICAgICAgIDogSlNPTi5wYXJzZSh0aGlzLmRlY29kZShyZXMpKS5tYXAoKHI6IGFueSkgPT4gSlNPTi5wYXJzZShyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHBlcnNpc3RlbmNlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YWJhc2Ugc3RvcmFnZSxcbiAgICogaGFuZGxpbmcgY29sdW1uIG1hcHBpbmcgYW5kIHNlcGFyYXRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgZGF0YVxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiAmIFByZXBhcmVkTW9kZWwge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucHJlcGFyZSk7XG4gICAgY29uc3Qgc3BsaXQgPSBNb2RlbC5zZWdyZWdhdGUobW9kZWwpO1xuICAgIGlmICgobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdKSB7XG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nIHBlcnNpc3RlbmNlIG1ldGFkYXRhIGZvciAkeyhtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV19YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzcGxpdC5tb2RlbCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBtaXJyb3JNZXRhID0gTW9kZWwubWlycm9yZWRBdChtb2RlbCk7XG4gICAgaWYgKG1pcnJvck1ldGEpIHtcbiAgICAgIGNvbnN0IG1pcnJvck1zcCA9IG1pcnJvck1ldGEubXNwSWQ7XG4gICAgICBpZiAoIW1pcnJvck1zcCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIG1pcnJvciBNU1AgY291bGQgYmUgZm91bmRgKTtcbiAgICAgIGxldCBtc3BzID0gdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCkgfHwgW107XG4gICAgICBtc3BzID0gQXJyYXkuaXNBcnJheShtc3BzKSA/IG1zcHMgOiBbbXNwc107XG4gICAgICBjb25zdCBtZXJnZWQgPSBbLi4ubmV3IFNldChbLi4ubXNwcywgbWlycm9yTXNwXSldO1xuICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICBlbmRvcnNpbmdPcmdzOiBtZXJnZWQsXG4gICAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM6IG1lcmdlZCxcbiAgICAgICAgbGVnYWN5OiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZDogc3BsaXQubW9kZWwsXG4gICAgICBtb2RlbDogc3BsaXQubW9kZWwsXG4gICAgICBpZDogbW9kZWxbTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6IHNwbGl0LnRyYW5zaWVudCxcbiAgICAgIHByaXZhdGVzOiBzcGxpdC5wcml2YXRlcyxcbiAgICAgIHNoYXJlZDogc3BsaXQuc2hhcmVkLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IE0ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmV2ZXJ0KTtcbiAgICBpZiAoXG4gICAgICB0cmFuc2llbnQgJiZcbiAgICAgIHRoaXMuc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoXG4gICAgICAgIGN0eCxcbiAgICAgICAgY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGByZS1hZGRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgICAuZmlsdGVyKChbLCB2XSkgPT4gdHlwZW9mIHYgIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIC5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKGtleSBpbiBvYmogJiYgKG9iaiBhcyBhbnkpW2tleV0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICAgICBgb3ZlcndyaXRpbmcgZXhpc3RpbmcgJHtrZXl9LiBpZiB0aGlzIGlzIG5vdCBhIGRlZmF1bHQgdmFsdWUsIHRoaXMgbWF5IHBvc2UgYSBwcm9ibGVtYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAob2JqIGFzIE0pW2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IChjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPikob2JqKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50KFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBvcGVyYXRpb24/OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjdHgpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGNoaWxkUmVidWlsZCA9XG4gICAgICB0eXBlb2YgKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gKGN0eCBhcyBhbnkpLmdldEZyb21DaGlsZHJlbihcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChjaGlsZFJlYnVpbGQpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlc29sdmVkT3AgPSB0aGlzLnJlc29sdmVPcGVyYXRpb24oY3R4LCBvcGVyYXRpb24pO1xuICAgIGlmICghcmVzb2x2ZWRPcCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG9wID0gcmVzb2x2ZWRPcC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIG9wLmluY2x1ZGVzKFwicmVhZFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJmaW5kXCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInF1ZXJ5XCIpIHx8XG4gICAgICBvcC5pbmNsdWRlcyhcInN0YXRlbWVudFwiKSB8fFxuICAgICAgb3AuaW5jbHVkZXMoXCJwYWdlXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZU9wZXJhdGlvbihcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgb3BlcmF0aW9uPzogc3RyaW5nXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG9wZXJhdGlvbikgcmV0dXJuIG9wZXJhdGlvbjtcbiAgICBpZiAodHlwZW9mIChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIChjdHggYXMgYW55KS5nZXRGcm9tQ2hpbGRyZW4oXCJvcGVyYXRpb25cIik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlZnJlc2hBZnRlcldyaXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBoYXNUcmFuc2llbnQ6IGJvb2xlYW4sXG4gICAgaWQ/OiBQcmltYXJ5S2V5VHlwZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWhhc1RyYW5zaWVudCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsoY2xhenopO1xuICAgIGNvbnN0IGNvbXBvc2VkID0gTW9kZWwuY29tcG9zZWQoY2xhenosIHBrKTtcbiAgICBjb25zdCBnZW5lcmF0ZWQgPSBNb2RlbC5nZW5lcmF0ZWQoY2xhenosIHBrKTtcbiAgICBjb25zdCBoYXNJZCA9IGlkICE9PSB1bmRlZmluZWQgJiYgaWQgIT09IG51bGw7XG4gICAgaWYgKCFoYXNJZCAmJiBjb21wb3NlZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFoYXNJZCAmJiBnZW5lcmF0ZWQpIHtcbiAgICAgIGN0eC5sb2dnZXIud2FybihcbiAgICAgICAgYENhbm5vdCByZWZyZXNoIHJlY29yZCB3aXRoIHByaXZhdGUgZ2VuZXJhdGVkIHByaW1hcnkga2V5YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0lkO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmplY3RUcmFuc2llbnRPdmVycmlkZXMoXG4gICAgdHJhbnNpZW50RGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCxcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHRcbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50RGF0YSA9IHRoaXMuaGFzTWVhbmluZ2Z1bFRyYW5zaWVudERhdGEodHJhbnNpZW50RGF0YSk7XG4gICAgY29uc3Qgc2hvdWxkSW5qZWN0ID0gISFjdHguZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0NvbnRleHRUcmFuc2llbnRNYXBcIik7XG4gICAgaWYgKCFoYXNUcmFuc2llbnREYXRhICYmICFzaG91bGRJbmplY3QpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3ZlcnJpZGVzID0gY3R4LnRvT3ZlcnJpZGVzKCk7XG4gICAgY29uc3QgcGF5bG9hZCA9IGhhc1RyYW5zaWVudERhdGEgPyBPYmplY3QuYXNzaWduKHt9LCB0cmFuc2llbnREYXRhKSA6IHt9O1xuICAgIGlmIChzaG91bGRJbmplY3QgJiYgT2JqZWN0LmtleXMob3ZlcnJpZGVzKS5sZW5ndGgpIHtcbiAgICAgIHBheWxvYWRbRmFicmljTW9kZWxLZXlzLk9WRVJSSURFU10gPSBvdmVycmlkZXM7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhwYXlsb2FkKS5sZW5ndGggPyBwYXlsb2FkIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNNZWFuaW5nZnVsVHJhbnNpZW50RGF0YSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgcmV0dXJuIHZhbHVlLnNvbWUoKGl0ZW0pID0+IHRoaXMuaGFzTWVhbmluZ2Z1bFRyYW5zaWVudERhdGEoaXRlbSkpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBlbnRyaWVzLnNvbWUoKFssIGVudHJ5XSkgPT4gdGhpcy5oYXNNZWFuaW5nZnVsVHJhbnNpZW50RGF0YShlbnRyeSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGlyZWN0ID1cbiAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcImVuZG9yc2luZ09yZ3NcIikgfHxcbiAgICAgIChjdHguZ2V0T3JVbmRlZmluZWQoXCJlbmRvcnNpbmdPcmdzXCIpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZGlyZWN0ICYmIGRpcmVjdC5sZW5ndGgpIHJldHVybiBkaXJlY3Q7XG4gICAgcmV0dXJuIChcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgfHxcbiAgICAgIChjdHguZ2V0RnJvbUNoaWxkcmVuKFwiZW5kb3JzaW5nT3Jnc1wiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRGb3JjZUdhdGV3YXlIeWRyYXRpb24oXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbmZpZy5hbGxvd0dhdGV3YXlPdmVycmlkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBhIHJlY29yZCBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICB0cmFuc2llbnQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBjdHhBcmdzID0gWy4uLihhcmdzIGFzIHVua25vd24gYXMgYW55W10pXTtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChcbiAgICAgIGN0eEFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD4sXG4gICAgICB0aGlzLmNyZWF0ZVxuICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cudmVyYm9zZShgYWRkaW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIFt0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsLCBjbGF6ei5uYW1lKV0sXG4gICAgICBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIE1vZGVsLm1lcmdlKFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwsIHRyYW5zaWVudCB8fCB7fSksXG4gICAgICAgICAgICBkZXNlcmlhbGl6ZWQsXG4gICAgICAgICAgICBjbGF6elxuICAgICAgICAgICksXG4gICAgICAgICAgaWRcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZGVzZXJpYWxpemVkO1xuICB9XG5cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgYXN5bmMgaGVhbHRoY2hlY2s8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5oZWFsdGhjaGVjayk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxvZy52ZXJib3NlKGByZWFkaW5nIGVudHJ5IGZyb20gJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVRyYW5zYWN0aW9uKFxuICAgICAgY3R4LFxuICAgICAgXCJoZWFsdGhjaGVja1wiLFxuICAgICAgW10sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5kZWNvZGUocmVzdWx0KSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byByZWFkIGEgcmVjb3JkIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKi9cbiAgQGRlYnVnKClcbiAgQGZpbmFsKClcbiAgYXN5bmMgcmVhZDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgbG9nLnZlcmJvc2UoYHJlYWRpbmcgZW50cnkgZnJvbSAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrOiAke2lkfWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIFtpZC50b1N0cmluZygpXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsYXp6XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRoaXMuZGVjb2RlKHJlc3VsdCkpO1xuICB9XG5cbiAgdXBkYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgIC8vIHJlY29yZFtDb3VjaERCS2V5cy5JRF0gPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcbiAgICByZXR1cm4gW2NsYXp6LCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHNpbmdsZSByZWNvcmRcbiAgICogQHN1bW1hcnkgU3VibWl0cyBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBhIHJlY29yZCBpbiB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBhc3luYyB1cGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRyYW5zaWVudDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGN0eEFyZ3MgPSBbLi4uKGFyZ3MgYXMgdW5rbm93biBhcyBhbnlbXSldO1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KFxuICAgICAgY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PixcbiAgICAgIHRoaXMudXBkYXRlXG4gICAgKTtcbiAgICBsb2cuaW5mbyhgQ0xJRU5UIFVQREFURSBjbGFzcyA6ICR7dHlwZW9mIGNsYXp6fWApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLnZlcmJvc2UoYHVwZGF0aW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgaGFzVHJhbnNpZW50ID0gdHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHRyYW5zaWVudCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBuZWVkc0Z1bGxQYXlsb2FkID1cbiAgICAgIGhhc1RyYW5zaWVudCB8fCB0aGlzLnNob3VsZEZvcmNlR2F0ZXdheUh5ZHJhdGlvbihjdHgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oXG4gICAgICBjdHgsXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIFt0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsLCBjbGF6ei5uYW1lKV0sXG4gICAgICBoYXNUcmFuc2llbnQgPyB7IFt0YWJsZU5hbWVdOiB0cmFuc2llbnQgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHRoaXMuZ2V0RW5kb3JzaW5nT3JnYW5pemF0aW9ucyhjdHgpLFxuICAgICAgY2xhenpcbiAgICApO1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXN1bHQpKTtcbiAgICBpZiAodGhpcy5zaG91bGRSZWZyZXNoQWZ0ZXJXcml0ZShjbGF6eiwgY3R4LCBuZWVkc0Z1bGxQYXlsb2FkLCBpZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoXG4gICAgICAgIGNsYXp6LFxuICAgICAgICBleHRyYWN0SWRzKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIE1vZGVsLm1lcmdlKFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwsIHRyYW5zaWVudCB8fCB7fSksXG4gICAgICAgICAgICBkZXNlcmlhbGl6ZWQsXG4gICAgICAgICAgICBjbGF6elxuICAgICAgICAgICksXG4gICAgICAgICAgaWRcbiAgICAgICAgKSxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZGVzZXJpYWxpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgc2luZ2xlIHJlY29yZFxuICAgKiBAc3VtbWFyeSBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gZGVsZXRlIGEgcmVjb3JkIGZyb20gdGhlIEZhYnJpYyBsZWRnZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllciB0byBkZWxldGVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBAZGVidWcoKVxuICBAZmluYWwoKVxuICBvdmVycmlkZSBhc3luYyBkZWxldGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuZGVsZXRlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IG5lZWRzRnVsbFBheWxvYWQgPVxuICAgICAgTW9kZWwuaXNUcmFuc2llbnQoY2xhenopIHx8IHRoaXMuc2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uKGN0eCk7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIGNvbnN0IHNob3VsZEh5ZHJhdGUgPSB0aGlzLnNob3VsZFJlZnJlc2hBZnRlcldyaXRlKFxuICAgICAgY2xhenosXG4gICAgICBjdHgsXG4gICAgICBuZWVkc0Z1bGxQYXlsb2FkLFxuICAgICAgaWRcbiAgICApO1xuICAgIGlmIChzaG91bGRIeWRyYXRlKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJlYWQoY2xhenosIGlkLCBjdHgpO1xuICAgIH1cblxuICAgIGxvZy52ZXJib3NlKGBkZWxldGluZyBlbnRyeSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGs6ICR7aWR9YCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgW2lkLnRvU3RyaW5nKCldLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCksXG4gICAgICBjbGF6elxuICAgICk7XG4gICAgcmV0dXJuIHNob3VsZEh5ZHJhdGVcbiAgICAgID8gcmVzdWx0XG4gICAgICA6IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0aGlzLmRlY29kZShyZXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgRmFicmljIGxlZGdlclxuICAgKiBAc3VtbWFyeSBFdmFsdWF0ZXMgYSB0cmFuc2FjdGlvbiB0byBwZXJmb3JtIGEgcXVlcnkgdXNpbmcgTWFuZ28gUXVlcnkgc3ludGF4XG4gICAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJldHVybiB0eXBlXG4gICAqIEBwYXJhbSB7TWFuZ29RdWVyeX0gcmF3SW5wdXQgLSBUaGUgTWFuZ28gUXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHByb2Nlc3MgLSBXaGV0aGVyIHRvIHByb2Nlc3MgdGhlIHJlc3VsdFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFY+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcXVlcnkgcmVzdWx0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICAgKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICAgKlxuICAgKiAgIENsaWVudC0+PkZhYnJpY0FkYXB0ZXI6IHJhdyhyYXdJbnB1dCwgcHJvY2VzcylcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpXG4gICAqICAgRmFicmljQWRhcHRlci0+PkZhYnJpY0FkYXB0ZXI6IGV2YWx1YXRlVHJhbnNhY3Rpb24oXCJxdWVyeVwiLCBbaW5wdXRdKVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5Db250cmFjdDogZXZhbHVhdGUoXCJxdWVyeVwiLCBwcm9wb3NhbE9wdGlvbnMpXG4gICAqICAgQ29udHJhY3QtPj5DaGFpbmNvZGU6IGludm9rZVxuICAgKiAgIENoYWluY29kZS0tPj5Db250cmFjdDogcmVzcG9uc2VcbiAgICogICBDb250cmFjdC0tPj5GYWJyaWNBZGFwdGVyOiByZXN1bHRcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogSlNPTi5wYXJzZShkZWNvZGUocmVzdWx0KSlcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogUHJvY2VzcyByZXN1bHQgYmFzZWQgb24gdHlwZVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItLT4+Q2xpZW50OiBwcm9jZXNzZWQgcmVzdWx0XG4gICAqL1xuICBAZGVidWcoKVxuICBhc3luYyByYXc8ViwgRCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIHJhd0lucHV0OiBNYW5nb1F1ZXJ5LFxuICAgIGRvY3NPbmx5OiBEID0gdHJ1ZSBhcyBELFxuICAgIGNsYXp6OiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxWPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yYXcpO1xuICAgIGxvZy5pbmZvKGBQZXJmb3JtaW5nIHJhdyBzdGF0ZW1lbnQgb24gdGFibGUgJHtNb2RlbC50YWJsZU5hbWUoY2xhenopfWApO1xuICAgIGxldCB0cmFuc2FjdGlvblJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgY3R4LFxuICAgICAgICBcInJhd1wiLFxuICAgICAgICBbSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpLCBkb2NzT25seV0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBjbGF6elxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmRlY29kZSh0cmFuc2FjdGlvblJlc3VsdCkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgcmVzdWx0OiAke2V9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VSZWNvcmQgPSAocmVjb3JkOiBSZWNvcmQ8YW55LCBhbnk+KSA9PiB7XG4gICAgICBpZiAoTW9kZWwuaXNNb2RlbChyZWNvcmQpKSByZXR1cm4gTW9kZWwuYnVpbGQocmVjb3JkKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkgcmV0dXJuIHJlc3VsdCBhcyBWO1xuICAgICAgY29uc3QgZWwgPSByZXN1bHRbMF07XG4gICAgICBpZiAoTW9kZWwuaXNNb2RlbChlbCkpXG4gICAgICAgIC8vIGlmIHRoZSBmaXJzdCBvbmUgaXMgYSBtb2RlbCwgYWxsIGFyZSBtb2RlbHNcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoKGVsKSA9PiBNb2RlbC5idWlsZChlbCkpIGFzIFY7XG4gICAgICByZXR1cm4gcmVzdWx0IGFzIFY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlUmVjb3JkKHJlc3VsdCBhcyBhbnkpIGFzIFY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgQ291Y2hEQiB2aWV3IHF1ZXJ5IGFnYWluc3QgdGhlIEZhYnJpYyBjaGFpbmNvZGVcbiAgICogQHN1bW1hcnkgRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gdG8gcXVlcnkgYSBkZXNpZ24gZG9jdW1lbnQgdmlld1xuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB2aWV3IHJlc3BvbnNlIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRkb2MgLSBEZXNpZ24gZG9jdW1lbnQgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmlld05hbWUgLSBWaWV3IG5hbWVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvcHRpb25zIC0gVmlldyBxdWVyeSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Li4uQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD59IGFyZ3MgLSBPcHRpb25hbCBjb250ZXh0dWFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFZpZXdSZXNwb25zZTxSPj59IFRoZSB2aWV3IHJlc3BvbnNlXG4gICAqL1xuICBAZGVidWcoKVxuICBhc3luYyB2aWV3PFI+KFxuICAgIGRkb2M6IHN0cmluZyxcbiAgICB2aWV3TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTxWaWV3UmVzcG9uc2U8Uj4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnZpZXcpO1xuICAgIGxvZy5pbmZvKGBRdWVyeWluZyB2aWV3ICR7ZGRvY30vJHt2aWV3TmFtZX1gKTtcbiAgICBsZXQgdHJhbnNhY3Rpb25SZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIGN0eCxcbiAgICAgICAgXCJ2aWV3XCIsXG4gICAgICAgIFtkZG9jLCB2aWV3TmFtZSwgSlNPTi5zdHJpbmdpZnkob3B0aW9ucyldLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogVmlld1Jlc3BvbnNlPFI+O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHRoaXMuZGVjb2RlKHRyYW5zYWN0aW9uUmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyB2aWV3IHJlc3VsdDogJHtlfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG9yIGNyZWF0ZXMgYSBnUlBDIGNsaWVudCBmb3IgdGhlIEZhYnJpYyBwZWVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBjYWNoZWQgY2xpZW50IG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIG5vbmUgZXhpc3RzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q2xpZW50Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGdSUEMgY2xpZW50XG4gICAqL1xuICBvdmVycmlkZSBnZXRDbGllbnQoKTogQ2xpZW50IHtcbiAgICBpZiAoIXRoaXMuX2NsaWVudClcbiAgICAgIHRoaXMuX2NsaWVudCA9IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0Q2xpZW50KHRoaXMuY29uZmlnKTtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgR2F0ZXdheSBpbnN0YW5jZSB1c2luZyB0aGUgY3VycmVudCBjbGllbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBHYXRld2F5KGN0eDogRmFicmljQ2xpZW50Q29udGV4dCk6IFByb21pc2U8R2F0ZXdheT4ge1xuICAgIHJldHVybiBGYWJyaWNDbGllbnRBZGFwdGVyLmdldEdhdGV3YXkoY3R4LCB0aGlzLmNvbmZpZywgdGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgQ29udHJhY3QgaW5zdGFuY2UgZm9yIHRoZSBGYWJyaWMgY2hhaW5jb2RlXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgQ29udHJhY3QgaW5zdGFuY2UgdXNpbmcgdGhlIGN1cnJlbnQgR2F0ZXdheVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENvbnRyYWt0Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIENvbnRyYWN0IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgQ29udHJhY3QoXG4gICAgY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0LFxuICAgIGNsYXp6T3JDb250cmFjdE5hbWU/OiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PiB8IHN0cmluZ1xuICApOiBQcm9taXNlPENvbnRyYWt0PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0Q29udHJhY3QoXG4gICAgICBhd2FpdCB0aGlzLkdhdGV3YXkoY3R4KSxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgY2xhenpPckNvbnRyYWN0TmFtZSxcbiAgICAgIGN0eFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgb3IgZXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBjaGFpbmNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaSAtIFRoZSBjaGFpbmNvZGUgZnVuY3Rpb24gdG8gY2FsbFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Ym1pdCAtIFdoZXRoZXIgdG8gc3VibWl0ICh0cnVlKSBvciBldmFsdWF0ZSAoZmFsc2UpIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2hhaW5jb2RlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3RyYW5zaWVudERhdGFdIC0gVHJhbnNpZW50IGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtlbmRvcnNpbmdPcmdhbml6YXRpb25zXSAtIE9yZ2FuaXphdGlvbnMgdGhhdCBtdXN0IGVuZG9yc2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VWludDhBcnJheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0cmFuc2FjdGlvbiByZXN1bHRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IEdhdGV3YXlcbiAgICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICAgKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICAgKlxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5HYXRld2F5OiBjb25uZWN0KClcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGdldENvbnRyYWN0KClcbiAgICogICBhbHQgc3VibWl0IHRyYW5zYWN0aW9uXG4gICAqICAgICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IHN1Ym1pdChhcGksIHByb3Bvc2FsT3B0aW9ucylcbiAgICogICBlbHNlIGV2YWx1YXRlIHRyYW5zYWN0aW9uXG4gICAqICAgICBGYWJyaWNBZGFwdGVyLT4+Q29udHJhY3Q6IGV2YWx1YXRlKGFwaSwgcHJvcG9zYWxPcHRpb25zKVxuICAgKiAgIGVuZFxuICAgKiAgIENvbnRyYWN0LT4+Q2hhaW5jb2RlOiBpbnZva2VcbiAgICogICBDaGFpbmNvZGUtLT4+Q29udHJhY3Q6IHJlc3BvbnNlXG4gICAqICAgQ29udHJhY3QtLT4+RmFicmljQWRhcHRlcjogcmVzdWx0XG4gICAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNsb3NlKClcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB0cmFuc2FjdGlvbihcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgYXBpOiBzdHJpbmcsXG4gICAgc3VibWl0ID0gdHJ1ZSxcbiAgICBhcmdzPzogYW55W10sXG4gICAgdHJhbnNpZW50RGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCA9IHt9LFxuICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/OiBzdHJpbmdbXSxcbiAgICBjbGF6ek9yQ29udHJhY3ROYW1lPzogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMudHJhbnNhY3Rpb24pO1xuICAgIHRyYW5zaWVudERhdGEgPSB0aGlzLmluamVjdFRyYW5zaWVudE92ZXJyaWRlcyh0cmFuc2llbnREYXRhLCBjdHgpO1xuICAgIGlmIChzdWJtaXQgJiYgdGhpcy5zaG91bGRVc2VMZWdhY3lHYXRld2F5KGN0eCkpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeUFyZ3MgPSB0aGlzLnByZXBhcmVMZWdhY3lBcmdzKGFyZ3MpO1xuICAgICAgY29uc3QgdHJhbnNpZW50TWFwID0gdGhpcy5idWlsZExlZ2FjeVRyYW5zaWVudCh0cmFuc2llbnREYXRhKTtcbiAgICAgIGNvbnN0IHBlZXJDb25maWdzID0gdGhpcy5idWlsZExlZ2FjeVBlZXJDb25maWdzKGN0eCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRMZWdhY3lXaXRoRXhwbGljaXRFbmRvcnNlcnMoXG4gICAgICAgIGN0eCxcbiAgICAgICAgYXBpLFxuICAgICAgICBsZWdhY3lBcmdzLFxuICAgICAgICB0cmFuc2llbnRNYXAsXG4gICAgICAgIHBlZXJDb25maWdzLFxuICAgICAgICBjbGF6ek9yQ29udHJhY3ROYW1lXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBnYXRld2F5ID0gYXdhaXQgdGhpcy5HYXRld2F5KGN0eCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gYXdhaXQgdGhpcy5Db250cmFjdChjdHgsIGNsYXp6T3JDb250cmFjdE5hbWUpO1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGAke3N1Ym1pdCA/IFwiU3VibWl0XCIgOiBcIkV2YWx1YXRlXCJ9dGluZyB0cmFuc2FjdGlvbiAke2NvbnRyYWN0LmdldENvbnRyYWN0TmFtZSgpfS4ke2FwaX1gXG4gICAgICApO1xuICAgICAgbG9nLmRlYnVnKGBhcmdzOiAke2FyZ3M/Lm1hcCgoYSkgPT4gYS50b1N0cmluZygpKS5qb2luKFwiXFxuXCIpIHx8IFwibm9uZVwifWApO1xuICAgICAgY29uc3QgbWV0aG9kID0gc3VibWl0ID8gY29udHJhY3Quc3VibWl0IDogY29udHJhY3QuZXZhbHVhdGU7XG4gICAgICBjb25zdCBub3JtYWxpemVkQXJncyA9IChhcmdzIHx8IFtdKS5tYXAoKGFyZykgPT5cbiAgICAgICAgdGhpcy5ub3JtYWxpemVUcmFuc2FjdGlvbkFyZ3VtZW50KGFyZylcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFuc2llbnRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXModHJhbnNpZW50RGF0YSB8fCB7fSk7XG5cbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMgPSBlbmRvcnNpbmdPcmdhbml6YXRpb25zPy5sZW5ndGhcbiAgICAgICAgPyBlbmRvcnNpbmdPcmdhbml6YXRpb25zXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcHJvcG9zYWxPcHRpb25zOiBQcm9wb3NhbE9wdGlvbnMgPSB7XG4gICAgICAgIGFyZ3VtZW50czogbm9ybWFsaXplZEFyZ3MsXG4gICAgICAgIHRyYW5zaWVudERhdGE6IHRyYW5zaWVudEVudHJpZXMubGVuZ3RoXG4gICAgICAgICAgPyB0cmFuc2llbnRFbnRyaWVzLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PihcbiAgICAgICAgICAgICAgKGFjYywgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgICAgICAgIGFjY1trZXldID0gSlNPTi5zdHJpbmdpZnkodmFsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zOiBjdHguZ2V0T3JVbmRlZmluZWQoXCJhbGxvd01hbnVhbEVuZG9yc2luZ09yZ3NcIilcbiAgICAgICAgICA/IGVuZG9yc2luZ09yZ2FuaXphdGlvbnMgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgOiB1bmRlZmluZWQsIC8vIG1zcElkIGxpc3RcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBtZXRob2QuY2FsbChjb250cmFjdCwgYXBpLCBwcm9wb3NhbE9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQ2xvc2luZyAke3RoaXMuY29uZmlnLm1zcElkfSBnYXRld2F5IGNvbm5lY3Rpb25gKTtcbiAgICAgIGdhdGV3YXkuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVRyYW5zYWN0aW9uQXJndW1lbnQoYXJnOiBhbnkpOiBhbnkge1xuICAgIGlmIChhcmcgPT09IG51bGwgfHwgYXJnID09PSB1bmRlZmluZWQpIHJldHVybiBhcmc7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHJldHVybiBhcmc7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09IFwib2JqZWN0XCIpIHJldHVybiBhcmc7XG4gICAgaWYgKGFyZyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBhcmc7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZyk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFVzZUxlZ2FjeUdhdGV3YXkoY3R4OiBGYWJyaWNDbGllbnRDb250ZXh0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhY3R4LmdldE9yVW5kZWZpbmVkKFwibGVnYWN5XCIpICYmICEhdGhpcy5jb25maWcuYWxsb3dHYXRld2F5T3ZlcnJpZGU7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVMZWdhY3lBcmdzKGFyZ3M/OiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKGFyZ3MgfHwgW10pLm1hcCgoYXJnKSA9PlxuICAgICAgdHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIiA/IGFyZyA6IEpTT04uc3RyaW5naWZ5KGFyZylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExlZ2FjeVRyYW5zaWVudChcbiAgICB0cmFuc2llbnREYXRhPzogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRyYW5zaWVudERhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudERhdGEpO1xuICAgIGlmICghZW50cmllcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgbWFwW2tleV0gPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlTGVnYWN5TXNwQ291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb25maWd1cmVkID0gdGhpcy5jb25maWcubGVnYWN5TXNwQ291bnQgPz8gMTtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIoY29uZmlndXJlZCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSB8fCBwYXJzZWQgPCAxKSByZXR1cm4gMTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihwYXJzZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwaWNrTGVnYWN5Q2FuZGlkYXRlcyhcbiAgICBjYW5kaWRhdGVzOiBNc3BEZXRhaWxzW10sXG4gICAgbGltaXQ6IG51bWJlclxuICApOiBNc3BEZXRhaWxzW10ge1xuICAgIGlmICghY2FuZGlkYXRlcy5sZW5ndGggfHwgbGltaXQgPD0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IFsuLi5jYW5kaWRhdGVzXTtcbiAgICBjb25zdCB0YXJnZXQgPSBNYXRoLm1pbihsaW1pdCwgYXZhaWxhYmxlLmxlbmd0aCk7XG4gICAgY29uc3QgcGlja2VkOiBNc3BEZXRhaWxzW10gPSBbXTtcbiAgICB3aGlsZSAocGlja2VkLmxlbmd0aCA8IHRhcmdldCAmJiBhdmFpbGFibGUubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpZHggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhdmFpbGFibGUubGVuZ3RoKTtcbiAgICAgIGNvbnN0IFtzZWxlY3Rpb25dID0gYXZhaWxhYmxlLnNwbGljZShpZHgsIDEpO1xuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBwaWNrZWQucHVzaChzZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGlja2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExlZ2FjeVBlZXJDb25maWdzKGN0eDogRmFicmljQ2xpZW50Q29udGV4dCk6IExlZ2FjeVBlZXJUYXJnZXRbXSB7XG4gICAgY29uc3QgcGVlcnM6IExlZ2FjeVBlZXJUYXJnZXRbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgbXNwSWQ6IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgICBwZWVyRW5kcG9pbnQ6IHRoaXMuY29uZmlnLnBlZXJFbmRwb2ludCxcbiAgICAgICAgcGVlckhvc3RBbGlhczogdGhpcy5jb25maWcucGVlckhvc3RBbGlhcyxcbiAgICAgICAgdGxzQ2VydDogdGhpcy5jb25maWcudGxzQ2VydCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGxldCBlbmRvcnNpbmdPcmdzID0gdGhpcy5nZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zKGN0eCkgfHwgW107XG4gICAgZW5kb3JzaW5nT3JncyA9IEFycmF5LmlzQXJyYXkoZW5kb3JzaW5nT3JncylcbiAgICAgID8gZW5kb3JzaW5nT3Jnc1xuICAgICAgOiBbZW5kb3JzaW5nT3Jnc107XG4gICAgY29uc3QgZW5kb3JzZXJzID1cbiAgICAgIGVuZG9yc2luZ09yZ3MuZmlsdGVyKChvcmcpOiBvcmcgaXMgc3RyaW5nID0+IEJvb2xlYW4ob3JnKSkgfHwgW107XG4gICAgY29uc3QgZXh0cmFzID0gZW5kb3JzZXJzLmZpbHRlcigob3JnKSA9PiBvcmcgIT09IHRoaXMuY29uZmlnLm1zcElkKTtcbiAgICBpZiAoIWV4dHJhcy5sZW5ndGgpIHJldHVybiBwZWVycztcblxuICAgIGNvbnN0IG1hcCA9IHRoaXMuY29uZmlnLm1zcE1hcDtcbiAgICBjb25zdCBsZWdhY3lDb3VudCA9IHRoaXMucmVzb2x2ZUxlZ2FjeU1zcENvdW50KCk7XG4gICAgZm9yIChjb25zdCBtc3Agb2YgZXh0cmFzKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gbWFwPy5bbXNwXTtcbiAgICAgIGlmICghY2FuZGlkYXRlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgIGBObyBwZWVyIG1hcHBpbmcgYXZhaWxhYmxlIGZvciBNU1AgJHttc3B9LiBQcm92aWRlIGl0IHZpYSBjb25maWcubXNwTWFwYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMucGlja0xlZ2FjeUNhbmRpZGF0ZXMoY2FuZGlkYXRlcywgbGVnYWN5Q291bnQpO1xuICAgICAgaWYgKCFzZWxlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgTm8gdmFsaWQgcGVlciBtYXBwaW5nIGF2YWlsYWJsZSBmb3IgTVNQICR7bXNwfS4gUHJvdmlkZSBpdCB2aWEgY29uZmlnLm1zcE1hcGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2hvaWNlIG9mIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgaWYgKCFjaG9pY2UuZW5kcG9pbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIHBlZXIgbWFwcGluZyBmb3IgTVNQICR7bXNwfTogbWlzc2luZyBlbmRwb2ludGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHBlZXJzLnB1c2goe1xuICAgICAgICAgIG1zcElkOiBtc3AsXG4gICAgICAgICAgcGVlckVuZHBvaW50OiBjaG9pY2UuZW5kcG9pbnQsXG4gICAgICAgICAgcGVlckhvc3RBbGlhczogY2hvaWNlLmFsaWFzLFxuICAgICAgICAgIHRsc0NlcnQ6IGNob2ljZS50bHNDZXJ0IHx8IHRoaXMuY29uZmlnLnRsc0NlcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwZWVycztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzKFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBmY246IHN0cmluZyxcbiAgICBhcmdzOiBzdHJpbmdbXSxcbiAgICB0cmFuc2llbnRNYXA6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfCB1bmRlZmluZWQsXG4gICAgcGVlckNvbmZpZ3M6IExlZ2FjeVBlZXJUYXJnZXRbXSxcbiAgICBjbGF6ek9yQ29udHJhY3ROYW1lPzogQ29uc3RydWN0b3I8TW9kZWw8YW55Pj4gfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuc3VibWl0TGVnYWN5V2l0aEV4cGxpY2l0RW5kb3JzZXJzKTtcbiAgICBjb25zdCBwZWVycyA9IHRoaXMubm9ybWFsaXplTGVnYWN5UGVlcnMocGVlckNvbmZpZ3MpO1xuICAgIGNvbnN0IGlkZW50aXR5TWF0ZXJpYWwgPSBhd2FpdCB0aGlzLnJlc29sdmVMZWdhY3lJZGVudGl0eU1hdGVyaWFsKCk7XG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgV2FsbGV0cy5uZXdJbk1lbW9yeVdhbGxldCgpO1xuICAgIGNvbnN0IGlkZW50aXR5TGFiZWwgPSBgJHt0aGlzLmNvbmZpZy5tc3BJZH0tbGVnYWN5YDtcbiAgICBhd2FpdCB3YWxsZXQucHV0KGlkZW50aXR5TGFiZWwsIHtcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGNlcnRpZmljYXRlOiBpZGVudGl0eU1hdGVyaWFsLmNlcnRpZmljYXRlLFxuICAgICAgICBwcml2YXRlS2V5OiBpZGVudGl0eU1hdGVyaWFsLnByaXZhdGVLZXksXG4gICAgICB9LFxuICAgICAgbXNwSWQ6IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgdHlwZTogXCJYLjUwOVwiLFxuICAgIH0gYXMgSWRlbnRpdHkpO1xuXG4gICAgY29uc3QgY29ubmVjdGlvblByb2ZpbGUgPSBhd2FpdCB0aGlzLmJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUocGVlcnMpO1xuICAgIGNvbnN0IGdhdGV3YXkgPSBuZXcgTGVnYWN5R2F0ZXdheSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGdhdGV3YXkuY29ubmVjdChjb25uZWN0aW9uUHJvZmlsZSwge1xuICAgICAgICBpZGVudGl0eTogaWRlbnRpdHlMYWJlbCxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICBkaXNjb3Zlcnk6IHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGFzTG9jYWxob3N0OiB0aGlzLnNob3VsZFRyZWF0UGVlcnNBc0xvY2FsaG9zdChwZWVycyksXG4gICAgICAgIH0sXG4gICAgICAgIHRsc0luZm86IHtcbiAgICAgICAgICBjZXJ0aWZpY2F0ZTogaWRlbnRpdHlNYXRlcmlhbC5jZXJ0aWZpY2F0ZSxcbiAgICAgICAgICBrZXk6IGlkZW50aXR5TWF0ZXJpYWwucHJpdmF0ZUtleSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgY2hhbm5lbCA9IHRoaXMuY29uZmlnLmNoYW5uZWw7XG4gICAgICBsZXQgY2hhaW5jb2RlID0gdGhpcy5jb25maWcuY2hhaW5jb2RlTmFtZTtcbiAgICAgIGxldCBjb250cmFjdE5hbWUgPSB0aGlzLmNvbmZpZy5jb250cmFjdE5hbWU7XG5cbiAgICAgIGlmIChjbGF6ek9yQ29udHJhY3ROYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xhenpPckNvbnRyYWN0TmFtZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICBjb250cmFjdE5hbWUgPSBjbGF6ek9yQ29udHJhY3ROYW1lO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICBgTm8gY29udGV4dCByZWNlaXZlZCB0byBkZXRlcm1pbmUgY2hhaW5jb2RlIGNvbmZpZ2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2hhbm5lbCA9XG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5jaGFubmVsRm9yKGNsYXp6T3JDb250cmFjdE5hbWUsIGN0eCkpIHx8IGNoYW5uZWw7XG4gICAgICAgICAgY2hhaW5jb2RlID1cbiAgICAgICAgICAgIChhd2FpdCB0aGlzLmNoYWluY29kZUZvcihjbGF6ek9yQ29udHJhY3ROYW1lLCBjdHgpKSB8fCBjaGFpbmNvZGU7XG4gICAgICAgICAgY29udHJhY3ROYW1lID0gYXdhaXQgdGhpcy5jb250cmFjdEZvcihjbGF6ek9yQ29udHJhY3ROYW1lLCBjdHgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBhd2FpdCBnYXRld2F5LmdldE5ldHdvcmsoY2hhbm5lbCk7XG4gICAgICBjb25zdCBjb250cmFjdCA9IG5ldHdvcmsuZ2V0Q29udHJhY3QoY2hhaW5jb2RlLCBjb250cmFjdE5hbWUpO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBjb250cmFjdC5jcmVhdGVUcmFuc2FjdGlvbihmY24pO1xuXG4gICAgICBpZiAodHJhbnNpZW50TWFwKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zaWVudCh0cmFuc2llbnRNYXApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRvcnNlcnMgPSBwZWVyc1xuICAgICAgICAubWFwKChwZWVyKSA9PiBuZXR3b3JrLmdldENoYW5uZWwoKS5nZXRFbmRvcnNlcihwZWVyLm5hbWUpKVxuICAgICAgICAuZmlsdGVyKChlbmRvcnNlcik6IGVuZG9yc2VyIGlzIEVuZG9yc2VyID0+IEJvb2xlYW4oZW5kb3JzZXIpKTtcbiAgICAgIGlmIChlbmRvcnNlcnMubGVuZ3RoKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldEVuZG9yc2luZ1BlZXJzKGVuZG9yc2Vycyk7XG4gICAgICB9XG5cbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgTGVnYWN5IHN1Ym1pdHRpbmcgJHtjb250cmFjdE5hbWV9LiR7ZmNufSB2aWEgcGVlcnMgJHtwZWVycy5tYXAoKHApID0+IHAucGVlckVuZHBvaW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNhY3Rpb24uc3VibWl0KC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShyZXN1bHQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBnYXRld2F5LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUxlZ2FjeVBlZXJzKFxuICAgIHBlZXJzOiBMZWdhY3lQZWVyVGFyZ2V0W11cbiAgKTogTGVnYWN5UGVlcldpdGhOYW1lW10ge1xuICAgIGNvbnN0IGRlZHVwZWQgPSBuZXcgTWFwPHN0cmluZywgTGVnYWN5UGVlcldpdGhOYW1lPigpO1xuICAgIGNvbnN0IGFkZFBlZXIgPSAocGVlcjogTGVnYWN5UGVlclRhcmdldCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7cGVlci5wZWVyRW5kcG9pbnR9fCR7cGVlci5wZWVySG9zdEFsaWFzIHx8IFwiXCJ9YDtcbiAgICAgIGlmIChkZWR1cGVkLmhhcyhrZXkpKSByZXR1cm47XG4gICAgICBjb25zdCBuYW1lID0gYHBlZXItJHtwZWVyLm1zcElkfS0ke2RlZHVwZWQuc2l6ZX1gO1xuICAgICAgZGVkdXBlZC5zZXQoa2V5LCB7XG4gICAgICAgIC4uLnBlZXIsXG4gICAgICAgIG5hbWUsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcGVlcnMuZm9yRWFjaChhZGRQZWVyKTtcbiAgICBhZGRQZWVyKHtcbiAgICAgIG1zcElkOiB0aGlzLmNvbmZpZy5tc3BJZCxcbiAgICAgIHBlZXJFbmRwb2ludDogdGhpcy5jb25maWcucGVlckVuZHBvaW50LFxuICAgICAgcGVlckhvc3RBbGlhczogdGhpcy5jb25maWcucGVlckhvc3RBbGlhcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKGRlZHVwZWQudmFsdWVzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlTGVnYWN5SWRlbnRpdHlNYXRlcmlhbCgpOiBQcm9taXNlPHtcbiAgICBjZXJ0aWZpY2F0ZTogc3RyaW5nO1xuICAgIHByaXZhdGVLZXk6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgdGhpcy5yZWFkUGVtSW5wdXQoXG4gICAgICB0aGlzLmNvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aFxuICAgICk7XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgdGhpcy5jb25maWcua2V5Q2VydE9yRGlyZWN0b3J5UGF0aFxuICAgICk7XG4gICAgcmV0dXJuIHsgY2VydGlmaWNhdGUsIHByaXZhdGVLZXkgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRMZWdhY3lDb25uZWN0aW9uUHJvZmlsZShwZWVyczogTGVnYWN5UGVlcldpdGhOYW1lW10pIHtcbiAgICBjb25zdCBwZWVyRW50cmllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IGNoYW5uZWxQZWVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IG9yZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHBlZXIgb2YgcGVlcnMpIHtcbiAgICAgIGNvbnN0IHRsc1BlbSA9IGF3YWl0IHRoaXMucmVhZFBlbUlucHV0KFxuICAgICAgICBwZWVyLnRsc0NlcnQgfHwgdGhpcy5jb25maWcudGxzQ2VydFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhvc3RuYW1lID1cbiAgICAgICAgcGVlci5wZWVySG9zdEFsaWFzIHx8IHRoaXMuZXh0cmFjdEhvc3QocGVlci5wZWVyRW5kcG9pbnQpO1xuICAgICAgcGVlckVudHJpZXNbcGVlci5uYW1lXSA9IHtcbiAgICAgICAgdXJsOiB0aGlzLmVuc3VyZUdycGNVcmwocGVlci5wZWVyRW5kcG9pbnQpLFxuICAgICAgICB0bHNDQUNlcnRzOiB7IHBlbTogdGxzUGVtIH0sXG4gICAgICAgIGdycGNPcHRpb25zOiB7XG4gICAgICAgICAgXCJzc2wtdGFyZ2V0LW5hbWUtb3ZlcnJpZGVcIjogaG9zdG5hbWUsXG4gICAgICAgICAgaG9zdG5hbWVPdmVycmlkZTogaG9zdG5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY2hhbm5lbFBlZXJzW3BlZXIubmFtZV0gPSB7XG4gICAgICAgIGVuZG9yc2luZ1BlZXI6IHRydWUsXG4gICAgICAgIGNoYWluY29kZVF1ZXJ5OiB0cnVlLFxuICAgICAgICBsZWRnZXJRdWVyeTogdHJ1ZSxcbiAgICAgICAgZXZlbnRTb3VyY2U6IHRydWUsXG4gICAgICB9O1xuICAgICAgb3Jnc1twZWVyLm1zcElkXSA9IG9yZ3NbcGVlci5tc3BJZF0gfHwge1xuICAgICAgICBtc3BpZDogcGVlci5tc3BJZCxcbiAgICAgICAgcGVlcnM6IFtdLFxuICAgICAgfTtcbiAgICAgIG9yZ3NbcGVlci5tc3BJZF0ucGVlcnMucHVzaChwZWVyLm5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBcImxlZ2FjeS1tYW51YWxcIixcbiAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICAgIGNsaWVudDoge1xuICAgICAgICBvcmdhbml6YXRpb246IHRoaXMuY29uZmlnLm1zcElkLFxuICAgICAgfSxcbiAgICAgIG9yZ2FuaXphdGlvbnM6IG9yZ3MsXG4gICAgICBwZWVyczogcGVlckVudHJpZXMsXG4gICAgICBvcmRlcmVyczoge30sXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICBbdGhpcy5jb25maWcuY2hhbm5lbF06IHtcbiAgICAgICAgICBwZWVyczogY2hhbm5lbFBlZXJzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRUcmVhdFBlZXJzQXNMb2NhbGhvc3QocGVlcnM6IExlZ2FjeVBlZXJXaXRoTmFtZVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBlZXJzLmV2ZXJ5KChwZWVyKSA9PiB0aGlzLmlzTG9jYWxFbmRwb2ludChwZWVyLnBlZXJFbmRwb2ludCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xvY2FsRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmV4dHJhY3RIb3N0KGVuZHBvaW50KS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBob3N0ID09PSBcImxvY2FsaG9zdFwiIHx8IGhvc3QgPT09IFwiMTI3LjAuMC4xXCI7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RIb3N0KGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNhbml0aXplZCA9IGVuZHBvaW50LnJlcGxhY2UoL15ncnBjcz86XFwvXFwvLywgXCJcIik7XG4gICAgcmV0dXJuIHNhbml0aXplZC5zcGxpdChcIjpcIilbMF07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUdycGNVcmwoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKC9eZ3JwY3M/OlxcL1xcLy9pLnRlc3QoZW5kcG9pbnQpKSByZXR1cm4gZW5kcG9pbnQ7XG4gICAgcmV0dXJuIGBncnBjczovLyR7ZW5kcG9pbnR9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZFBlbUlucHV0KHNvdXJjZT86IHN0cmluZyB8IEJ1ZmZlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzc2luZyBjZXJ0aWZpY2F0ZSBvciBrZXkgbWF0ZXJpYWxcIik7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzb3VyY2UpKSByZXR1cm4gc291cmNlLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICBjb25zdCB0cmltbWVkID0gc291cmNlLnRyaW0oKTtcbiAgICBpZiAoLy0tLS0tQkVHSU4gW0EtWiBdKy0tLS0tLy50ZXN0KHRyaW1tZWQpKSByZXR1cm4gdHJpbW1lZDtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoc291cmNlKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGlmIChzdGF0cz8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcmV0dXJuIGF3YWl0IGdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50KHNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiAoYXdhaXQgcmVhZEZzRmlsZShzb3VyY2UpKS50b1N0cmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW4gZXJyb3IgaW50byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhbnkgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBCYXNlRXJyb3JcbiAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvclxuICAgKi9cbiAgb3ZlcnJpZGUgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihlcnI6IEVycm9yIHwgc3RyaW5nKTogRSB7XG4gICAgcmV0dXJuIEZhYnJpY0NsaWVudEFkYXB0ZXIucGFyc2VFcnJvcjxFPihlcnIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdWJtaXRzIGEgdHJhbnNhY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gdGhhdCBtb2RpZmllcyB0aGUgbGVkZ2VyIHN0YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGkgLSBUaGUgY2hhaW5jb2RlIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNoYWluY29kZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFt0cmFuc2llbnREYXRhXSAtIFRyYW5zaWVudCBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbZW5kb3JzaW5nT3JnYW5pemF0aW9uc10gLSBPcmdhbml6YXRpb25zIHRoYXQgbXVzdCBlbmRvcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFVpbnQ4QXJyYXk+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0XG4gICAqL1xuICBhc3luYyBzdWJtaXRUcmFuc2FjdGlvbihcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgYXBpOiBzdHJpbmcsXG4gICAgYXJncz86IGFueVtdLFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/OiBBcnJheTxzdHJpbmc+LFxuICAgIGNsYXp6T3JDb250cmFjdE5hbWU/OiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PiB8IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIGFwaSxcbiAgICAgIHRydWUsXG4gICAgICBhcmdzLFxuICAgICAgdHJhbnNpZW50RGF0YSxcbiAgICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnMsXG4gICAgICBjbGF6ek9yQ29udHJhY3ROYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZhbHVhdGVzIGEgdHJhbnNhY3Rpb24gb24gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGEgdHJhbnNhY3Rpb24gdGhhdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGxlZGdlciBzdGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIGNoYWluY29kZSBmdW5jdGlvbiB0byBjYWxsXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjaGFpbmNvZGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbdHJhbnNpZW50RGF0YV0gLSBUcmFuc2llbnQgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2VuZG9yc2luZ09yZ2FuaXphdGlvbnNdIC0gT3JnYW5pemF0aW9ucyB0aGF0IG11c3QgZW5kb3JzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxVaW50OEFycmF5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRyYW5zYWN0aW9uIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGVUcmFuc2FjdGlvbihcbiAgICBjdHg6IEZhYnJpY0NsaWVudENvbnRleHQsXG4gICAgYXBpOiBzdHJpbmcsXG4gICAgYXJncz86IGFueVtdLFxuICAgIHRyYW5zaWVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGVuZG9yc2luZ09yZ2FuaXphdGlvbnM/OiBBcnJheTxzdHJpbmc+LFxuICAgIGNsYXp6T3JDb250cmFjdE5hbWU/OiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PiB8IHN0cmluZ1xuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIGFwaSxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJncyxcbiAgICAgIHRyYW5zaWVudERhdGEsXG4gICAgICBlbmRvcnNpbmdPcmdhbml6YXRpb25zLFxuICAgICAgY2xhenpPckNvbnRyYWN0TmFtZVxuICAgICk7XG4gIH1cblxuICBhc3luYyBtaWdyYXRlKFxuICAgIHJlZmVyZW5jZTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBsYXN0ID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHByb3ZpZGVkQ3R4ID1cbiAgICAgIGxhc3QgaW5zdGFuY2VvZiBDb250ZXh0ID8gKGxhc3QgYXMgRmFicmljQ2xpZW50Q29udGV4dCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWlncmF0aW9uQXJncyA9IHByb3ZpZGVkQ3R4ID8gYXJncy5zbGljZSgwLCAtMSkgOiBhcmdzO1xuICAgIGNvbnN0IGN0eCA9XG4gICAgICBwcm92aWRlZEN0eCB8fFxuICAgICAgKGF3YWl0IHRoaXMuY29udGV4dChcbiAgICAgICAgUGVyc2lzdGVuY2VLZXlzLk1JR1JBVElPTixcbiAgICAgICAge30sXG4gICAgICAgIHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPGFueT4+XG4gICAgICApKTtcbiAgICByZXR1cm4gdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihcbiAgICAgIGN0eCxcbiAgICAgIFwibWlncmF0ZVwiLFxuICAgICAgW3JlZmVyZW5jZSwgbWlncmF0aW9uQXJnc10sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBcIk1pZ3JhdGlvbkNvbnRyYWN0XCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTaHV0cyBkb3duIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAc3VtbWFyeSBDbG9zZXMgdGhlIGFjdGl2ZSBkaXNwYXRjaCAod2hpY2ggaW4gdHVybiBjbG9zZXMgYW55IGdhdGV3YXlcbiAgICogZXZlbnQgc3Vic2NyaXB0aW9uKSB2aWEgdGhlIGJhc2UgY2xhc3MsIHRoZW4gY2xvc2VzIHRoZSBnUlBDIGNsaWVudC5cbiAgICogV29ya3MgY29ycmVjdGx5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBgc3ludGhldGljRXZlbnRzYCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgY29ubmVjdGlvbnMgYXJlIGNsb3NlZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2h1dGRvd24oXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NsaWVudENvbnRleHQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJhc2UgY2xhc3MgaGFuZGxlcyBkaXNwYXRjaC5jbG9zZSgpIGludGVybmFsbHkuXG4gICAgYXdhaXQgc3VwZXIuc2h1dGRvd24oLi4uYXJncyk7XG4gICAgaWYgKHRoaXMuY2xpZW50KSB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBDbG9zaW5nICR7dGhpcy5jb25maWcubXNwSWR9IGdhdGV3YXkgY2xpZW50YCk7XG4gICAgICB0aGlzLmNsaWVudC5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIENvbnRyYWN0IGluc3RhbmNlIGZyb20gYSBHYXRld2F5XG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIGNoYWluY29kZSBjb250cmFjdCBmcm9tIHRoZSBzcGVjaWZpZWQgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7Q29udHJha3R9IFRoZSBDb250cmFjdCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldENvbnRyYWN0KFxuICAgIGdhdGV3YXk6IEdhdGV3YXksXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGNsYXp6T3JDb250cmFjdE5hbWU/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICBjdHg/OiBGYWJyaWNDbGllbnRDb250ZXh0XG4gICk6IFByb21pc2U8Q29udHJha3Q+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDb250cmFjdCk7XG5cbiAgICBsZXQgY2hhbm5lbCA9IGNvbmZpZy5jaGFubmVsO1xuICAgIGxldCBjaGFpbmNvZGUgPSBjb25maWcuY2hhaW5jb2RlTmFtZTtcbiAgICBsZXQgY29udHJhY3ROYW1lID0gY29uZmlnLmNvbnRyYWN0TmFtZTtcblxuICAgIGlmIChjbGF6ek9yQ29udHJhY3ROYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIGNsYXp6T3JDb250cmFjdE5hbWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgIGNvbnRyYWN0TmFtZSA9IGNsYXp6T3JDb250cmFjdE5hbWU7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgTm8gY29udGV4dCByZWNlaXZlZCB0byBkZXRlcm1pbmUgY2hhaW5jb2RlIGNvbmZpZ2BcbiAgICAgICAgICApO1xuICAgICAgICBjaGFubmVsID1cbiAgICAgICAgICAoYXdhaXQgdGhpcy5jaGFubmVsRm9yKGNsYXp6T3JDb250cmFjdE5hbWUsIGNvbmZpZywgY3R4KSkgfHwgY2hhbm5lbDtcbiAgICAgICAgY2hhaW5jb2RlID1cbiAgICAgICAgICAoYXdhaXQgdGhpcy5jaGFpbmNvZGVGb3IoY2xhenpPckNvbnRyYWN0TmFtZSwgY29uZmlnLCBjdHgpKSB8fFxuICAgICAgICAgIGNoYWluY29kZTtcbiAgICAgICAgY29udHJhY3ROYW1lID0gYXdhaXQgdGhpcy5jb250cmFjdEZvcihjbGF6ek9yQ29udHJhY3ROYW1lLCBjb25maWcsIGN0eCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yayhnYXRld2F5LCBjaGFubmVsKTtcbiAgICBsZXQgY29udHJhY3Q6IENvbnRyYWt0O1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBSZXRyaWV2aW5nIGNoYWluY29kZSAke2NoYWluY29kZX0gY29udHJhY3QgJHtjb250cmFjdE5hbWV9IGZyb20gbmV0d29yayAke2NoYW5uZWx9YFxuICAgICAgKTtcbiAgICAgIGNvbnRyYWN0ID0gbmV0d29yay5nZXRDb250cmFjdChjaGFpbmNvZGUsIGNvbnRyYWN0TmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIE5ldHdvcmsgaW5zdGFuY2UgZnJvbSBhIEdhdGV3YXlcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdG8gYSBzcGVjaWZpYyBjaGFubmVsIG9uIHRoZSBGYWJyaWMgbmV0d29ya1xuICAgKiBAcGFyYW0ge0dhdGV3YXl9IGdhdGV3YXkgLSBUaGUgR2F0ZXdheSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAqIEByZXR1cm4ge05ldHdvcmt9IFRoZSBOZXR3b3JrIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0TmV0d29yayhnYXRld2F5OiBHYXRld2F5LCBjaGFubmVsTmFtZTogc3RyaW5nKTogTmV0d29yayB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5nZXROZXR3b3JrKTtcbiAgICBsZXQgbmV0d29yazogTmV0d29yaztcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNoYW5uZWwgJHtjaGFubmVsTmFtZX1gKTtcbiAgICAgIG5ldHdvcmsgPSBnYXRld2F5LmdldE5ldHdvcmsoY2hhbm5lbE5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXR3b3JrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgR2F0ZXdheSBpbnN0YW5jZSBmb3IgY29ubmVjdGluZyB0byB0aGUgRmFicmljIG5ldHdvcmtcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIEdhdGV3YXkgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtDbGllbnR9IFtjbGllbnRdIC0gT3B0aW9uYWwgZ1JQQyBjbGllbnQsIHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxHYXRld2F5Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIEdhdGV3YXkgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRHYXRld2F5KFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dCxcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgY2xpZW50PzogQ2xpZW50XG4gICkge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRDb25uZWN0aW9uKFxuICAgICAgY2xpZW50IHx8IChhd2FpdCB0aGlzLmdldENsaWVudChjb25maWcpKSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGN0eFxuICAgICkpIGFzIEdhdGV3YXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBnUlBDIGNsaWVudCBmb3IgY29ubmVjdGluZyB0byBhIEZhYnJpYyBwZWVyXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgY2xpZW50IHdpdGggVExTIGNyZWRlbnRpYWxzIGZvciBzZWN1cmUgY29tbXVuaWNhdGlvblxuICAgKiBAcGFyYW0ge1BlZXJDb25maWd9IGNvbmZpZyAtIFRoZSBwZWVyIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybiB7Q2xpZW50fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZ1JQQyBjbGllbnRcbiAgICovXG4gIHN0YXRpYyBnZXRDbGllbnQoY29uZmlnOiBQZWVyQ29uZmlnKTogQ2xpZW50IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXRDbGllbnQpO1xuICAgIGxvZy5kZWJ1ZyhgZ2VuZXJhdGluZyBUTFMgY3JlZGVudGlhbHMgZm9yIG1zcCAke2NvbmZpZy5tc3BJZH1gKTtcbiAgICBsZXQgcGF0aE9yQ2VydDogc3RyaW5nIHwgQnVmZmVyID0gY29uZmlnLnRsc0NlcnQgYXMgc3RyaW5nIHwgQnVmZmVyO1xuXG4gICAgaWYgKHR5cGVvZiBwYXRoT3JDZXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhdGhPckNlcnQubWF0Y2goXG4gICAgICAgICAgLy0tLS0tQkVHSU4gKENFUlRJRklDQVRFfEtFWXxQUklWQVRFIEtFWSktLS0tLS4rPy0tLS0tRU5EIFxcMS0tLS0tJC9nbXNcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHBhdGhPckNlcnQgPSBCdWZmZXIuZnJvbShwYXRoT3JDZXJ0LCBcInV0ZjhcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhdGhPckNlcnQgPSBCdWZmZXIuZnJvbShmcy5yZWFkRmlsZVN5bmMocGF0aE9yQ2VydCwgXCJ1dGY4XCIpKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWFkIHRoZSB0bHMgY2VydGlmaWNhdGUgZnJvbSAke3BhdGhPckNlcnR9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0bHNDcmVkZW50aWFscyA9IGdycGMuY3JlZGVudGlhbHMuY3JlYXRlU3NsKHBhdGhPckNlcnQpO1xuICAgIGxvZy5kZWJ1ZyhgZ2VuZXJhdGluZyBHYXRld2F5IENsaWVudCBmb3IgdXJsICR7Y29uZmlnLnBlZXJFbmRwb2ludH1gKTtcbiAgICByZXR1cm4gbmV3IENsaWVudChjb25maWcucGVlckVuZHBvaW50LCB0bHNDcmVkZW50aWFscywge1xuICAgICAgXCJncnBjLm1heF9yZWNlaXZlX21lc3NhZ2VfbGVuZ3RoXCI6IChjb25maWcuc2l6ZUxpbWl0IHx8IDE1KSAqIDEwMjQgKiAxMDI0LFxuICAgICAgXCJncnBjLm1heF9zZW5kX21lc3NhZ2VfbGVuZ3RoXCI6IChjb25maWcuc2l6ZUxpbWl0IHx8IDE1KSAqIDEwMjQgKiAxMDI0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBHYXRld2F5IGNvbm5lY3Rpb24gd2l0aCBpZGVudGl0eSBhbmQgc2lnbmVyXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgLSBUaGUgZ1JQQyBjbGllbnRcbiAgICogQHBhcmFtIHtQZWVyQ29uZmlnfSBjb25maWcgLSBUaGUgcGVlciBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8R2F0ZXdheT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb25uZWN0ZWQgR2F0ZXdheVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgSWRlbnRpdHlcbiAgICogICBwYXJ0aWNpcGFudCBTaWduZXJcbiAgICogICBwYXJ0aWNpcGFudCBHYXRld2F5XG4gICAqXG4gICAqICAgQ2FsbGVyLT4+RmFicmljQWRhcHRlcjogZ2V0Q29ubmVjdGlvbihjbGllbnQsIGNvbmZpZylcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+SWRlbnRpdHk6IGdldElkZW50aXR5KG1zcElkLCBjZXJ0RGlyZWN0b3J5UGF0aClcbiAgICogICBJZGVudGl0eS0tPj5GYWJyaWNBZGFwdGVyOiBpZGVudGl0eVxuICAgKiAgIEZhYnJpY0FkYXB0ZXItPj5TaWduZXI6IGdldFNpZ25lcihrZXlEaXJlY3RvcnlQYXRoKVxuICAgKiAgIFNpZ25lci0tPj5GYWJyaWNBZGFwdGVyOiBzaWduZXJcbiAgICogICBGYWJyaWNBZGFwdGVyLT4+RmFicmljQWRhcHRlcjogQ3JlYXRlIENvbm5lY3RPcHRpb25zXG4gICAqICAgRmFicmljQWRhcHRlci0+PkdhdGV3YXk6IGNvbm5lY3Qob3B0aW9ucylcbiAgICogICBHYXRld2F5LS0+PkZhYnJpY0FkYXB0ZXI6IGdhdGV3YXlcbiAgICogICBGYWJyaWNBZGFwdGVyLS0+PkNhbGxlcjogZ2F0ZXdheVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldENvbm5lY3Rpb24oXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgY29uZmlnOiBQZWVyQ29uZmlnLFxuICAgIGN0eDogRmFicmljQ2xpZW50Q29udGV4dFxuICApIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmdldENvbm5lY3Rpb24pO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBSZXRyaWV2aW5nIFBlZXIgSWRlbnRpdHkgZm9yICR7Y29uZmlnLm1zcElkfSB1bmRlciAke2NvbmZpZy5jZXJ0Q2VydE9yRGlyZWN0b3J5UGF0aH1gXG4gICAgKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IGdldElkZW50aXR5KFxuICAgICAgY29uZmlnLm1zcElkLFxuICAgICAgY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYHByZXBhcmluZyB0cmFuc2FjdGlvbiBzaWduZXIgZm9yICR7Q3J5cHRvVXRpbHMuZmFicmljSWRGcm9tQ2VydGlmaWNhdGUoaWRlbnRpdHkuY3JlZGVudGlhbHMudG9TdHJpbmcoKSl9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBleHRyYWN0IEZhYnJpYyBJRCBmcm9tIGNlcnRpZmljYXRlYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25lcjogU2lnbmVyO1xuICAgIGNvbnN0IGNsb3NlID0gKCkgPT4ge307XG4gICAgaWYgKCFjb25maWcuaHNtKSB7XG4gICAgICBzaWduZXIgPSBhd2FpdCBnZXRTaWduZXIoY29uZmlnLmtleUNlcnRPckRpcmVjdG9yeVBhdGggYXMgYW55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29uc3QgaHNtID0gbmV3IEhTTVNpZ25lckZhY3RvcnlDdXN0b20oY29uZmlnLmhzbS5saWJyYXJ5KTtcbiAgICAgIC8vIGNvbnN0IGlkZW50aWZpZXIgPSBoc20uZ2V0U0tJRnJvbUNlcnRpZmljYXRlUGF0aChcbiAgICAgIC8vICAgY29uZmlnLmNlcnRDZXJ0T3JEaXJlY3RvcnlQYXRoIGFzIGFueVxuICAgICAgLy8gKTtcbiAgICAgIC8vIGNvbnN0IHBrY3MxMVNpZ25lciA9IGhzbS5uZXdTaWduZXIoe1xuICAgICAgLy8gICBsYWJlbDogY29uZmlnLmhzbS50b2tlbkxhYmVsIGFzIHN0cmluZyxcbiAgICAgIC8vICAgcGluOiBTdHJpbmcoY29uZmlnLmhzbS5waW4pIGFzIHN0cmluZyxcbiAgICAgIC8vICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIC8vICAgLy8gdXNlclR5cGU6IDEgLypDS1VfVVNFUiAqLyxcbiAgICAgIC8vIH0pO1xuICAgICAgLy8gc2lnbmVyID0gcGtjczExU2lnbmVyLnNpZ25lcjtcbiAgICAgIC8vIGNsb3NlID0gcGtjczExU2lnbmVyLmNsb3NlO1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJIU00gTk9UIElNUExFTUVOVEVEXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBjbGllbnQsXG4gICAgICBpZGVudGl0eTogaWRlbnRpdHksXG4gICAgICBzaWduZXI6IHNpZ25lcixcbiAgICAgIC8vIERlZmF1bHQgdGltZW91dHMgZm9yIGRpZmZlcmVudCBnUlBDIGNhbGxzXG4gICAgICBldmFsdWF0ZU9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcImV2YWx1YXRlVGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byA1IHNlY29uZHNcbiAgICAgIH0sXG4gICAgICBlbmRvcnNlT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiZW5kb3JzZVRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gMTUgc2Vjb25kc1xuICAgICAgfSxcbiAgICAgIHN1Ym1pdE9wdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZGVhZGxpbmU6IERhdGUubm93KCkgKyAxMDAwICogY3R4LmdldChcInN1Ym1pdFRpbWVvdXRcIikgfTsgLy8gZGVmYXVsdHMgdG8gNSBzZWNvbmRzXG4gICAgICB9LFxuICAgICAgY29tbWl0U3RhdHVzT3B0aW9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm4geyBkZWFkbGluZTogRGF0ZS5ub3coKSArIDEwMDAgKiBjdHguZ2V0KFwiY29tbWl0VGltZW91dFwiKSB9OyAvLyBkZWZhdWx0cyB0byAxIG1pbnV0ZVxuICAgICAgfSxcbiAgICB9IGFzIENvbm5lY3RPcHRpb25zO1xuXG4gICAgbG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvICR7Y29uZmlnLm1zcElkfWApO1xuICAgIGNvbnN0IGdhdGV3YXkgPSBjb25uZWN0KG9wdGlvbnMpO1xuXG4gICAgLy8gVE9ETzogcmVwbGFjZT9cbiAgICBpZiAoY29uZmlnLmhzbSkge1xuICAgICAgZ2F0ZXdheS5jbG9zZSA9IG5ldyBQcm94eShnYXRld2F5LmNsb3NlLCB7XG4gICAgICAgIGFwcGx5KHRhcmdldDogKCkgPT4gdm9pZCwgdGhpc0FyZzogYW55LCBhcmdBcnJheTogYW55W10pOiBhbnkge1xuICAgICAgICAgIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdBcnJheSk7XG4gICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBnYXRld2F5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IERpc3BhdGNoIGluc3RhbmNlIGZvciB0aGUgRmFicmljIGNsaWVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYSBuZXcgRmFicmljQ2xpZW50RGlzcGF0Y2ggaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBGYWJyaWMgbmV0d29yay5cbiAgICogQHJldHVybnMge0Rpc3BhdGNofSBBIG5ldyBEaXNwYXRjaCBpbnN0YW5jZSBjb25maWd1cmVkIGZvciB0aGUgRmFicmljIGNsaWVudC5cbiAgICogQHJlbWFya3MgVGhlIERpc3BhdGNoIGluc3RhbmNlIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGxvZ2ljIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBGYWJyaWMgbmV0d29yaywgc3VjaCBhcyBzdWJtaXR0aW5nIHRyYW5zYWN0aW9ucyBvciBxdWVyeWluZyBkYXRhLlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBmYWJyaWNEaXNwYXRjaCA9IGZhYnJpY0NsaWVudEFkYXB0ZXIuRGlzcGF0Y2goKTtcbiAgICogZmFicmljRGlzcGF0Y2guc3VibWl0VHJhbnNhY3Rpb24oJ2NyZWF0ZVByb2R1Y3QnLCB7IG5hbWU6ICdQcm9kdWN0IEEnLCBwcmljZTogMTAwIH0pO1xuICAgKi9cbiAgb3ZlcnJpZGUgRGlzcGF0Y2goKTogRmFicmljQ2xpZW50RGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgRmFicmljQ2xpZW50QWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0odGhpcy5jbGllbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBjaGFpbmNvZGVGb3IoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPGFueT4+LFxuICAgIGNvbmZpZzogUGVlckNvbmZpZyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PlxuICApIHtcbiAgICByZXR1cm4gTW9kZWwuY2hhaW5jb2RlT2YobW9kZWwsIC4uLmFyZ3MpIHx8IGNvbmZpZy5jaGFpbmNvZGVOYW1lO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBjaGFubmVsRm9yKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgcmV0dXJuIE1vZGVsLmNoYW5uZWxPZihtb2RlbCwgLi4uYXJncykgfHwgY29uZmlnLmNoYW5uZWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNvbnRyYWN0Rm9yKFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbDxhbnk+PixcbiAgICBjb25maWc6IFBlZXJDb25maWcsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIE1vZGVsLmNvbnRyYWN0T2YobW9kZWwsIC4uLmFyZ3MpIHx8XG4gICAgICBEZWZhdWx0Q29udHJhY3RSZXNvbHZlcihtb2RlbCwgLi4uYXJncylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW4gZXJyb3IgaW50byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhbnkgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBCYXNlRXJyb3IgdXNpbmcgdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge0Vycm9yIHwgc3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oXG4gICAgZXJyOiBFcnJvciB8IHN0cmluZyB8IEdhdGV3YXlFcnJvclxuICApOiBFIHtcbiAgICAvLyBpZiAoXG4gICAgLy8gICBNSVNTSU5HX1BSSVZBVEVfREFUQV9SRUdFWC50ZXN0KFxuICAgIC8vICAgICB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2VcbiAgICAvLyAgIClcbiAgICAvLyApXG4gICAgLy8gICByZXR1cm4gbmV3IFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzKGVycikgYXMgRTtcblxuICAgIGxldCBtc2cgPSB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2U7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEdhdGV3YXlFcnJvciAmJiBlcnIuZGV0YWlscy5sZW5ndGggJiYgZXJyLmNvZGUgPT09IDEwKSB7XG4gICAgICBtc2cgPSBgJHtlcnIuZGV0YWlsc1swXS5tZXNzYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZXJyIGluc3RhbmNlb2YgRW5kb3JzZUVycm9yICYmXG4gICAgICBlcnIuZGV0YWlscy5sZW5ndGggJiZcbiAgICAgIGVyci5jb2RlID09PSAxMCAmJlxuICAgICAgZXJyLmRldGFpbHNbMF0ubWVzc2FnZT8uaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKVxuICAgICkge1xuICAgICAgbXNnID0gYCR7ZXJyLmRldGFpbHNbMF0ubWVzc2FnZX1gO1xuICAgIH1cblxuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJNVkNDX1JFQURfQ09ORkxJQ1RcIikpXG4gICAgICByZXR1cm4gbmV3IE12Y2NSZWFkQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiREVBRExJTkVfRVhDRUVERURcIikpXG4gICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uVGltZW91dEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChcbiAgICAgIG1zZy5pbmNsdWRlcyhcImNoYWluY29kZSBzdHJlYW0gdGVybWluYXRlZFwiKSB8fFxuICAgICAgbXNnLmluY2x1ZGVzKFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCIpIHx8XG4gICAgICBtc2cuaW5jbHVkZXMoXCJyZWNlaXZlZCBtZXNzYWdlIGxhcmdlciB0aGFuIG1heFwiKSB8fFxuICAgICAgbXNnLmluY2x1ZGVzKFwiZ3JwYzogcmVjZWl2ZWQgbWVzc2FnZSBsYXJnZXJcIilcbiAgICApXG4gICAgICByZXR1cm4gbmV3IFF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvcihlcnIpIGFzIEU7XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFwiRU5ET1JTRU1FTlRfUE9MSUNZX0ZBSUxVUkVcIikpXG4gICAgICByZXR1cm4gbmV3IEVuZG9yc2VtZW50UG9saWN5RXJyb3IoZXJyKSBhcyBFO1xuXG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIlBIQU5UT01fUkVBRF9DT05GTElDVFwiKSlcbiAgICAgIHJldHVybiBuZXcgUGhhbnRvbVJlYWRDb25mbGljdEVycm9yKGVycikgYXMgRTtcblxuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiAoZXJyIGFzIGFueSkuY29kZSkge1xuICAgICAgc3dpdGNoICgoZXJyIGFzIGFueSkuY29kZSkge1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgcmV0dXJuIG5ldyBFbmRvcnNlbWVudEVycm9yKGVycikgYXMgRTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobXNnLmluY2x1ZGVzKFZhbGlkYXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE5vdEZvdW5kRXJyb3IubmFtZSkpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25mbGljdEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQmFkUmVxdWVzdEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBCYWRSZXF1ZXN0RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUXVlcnlFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBRdWVyeUVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFBhZ2luZ0Vycm9yLm5hbWUpKSByZXR1cm4gbmV3IFBhZ2luZ0Vycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFVuc3VwcG9ydGVkRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFVuc3VwcG9ydGVkRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTWlncmF0aW9uRXJyb3IubmFtZSkpIHJldHVybiBuZXcgTWlncmF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoT2JzZXJ2ZXJFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBPYnNlcnZlckVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEF1dGhvcml6YXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEZvcmJpZGRlbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IEZvcmJpZGRlbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbm5lY3Rpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFNlcmlhbGl6YXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKSBhcyBFO1xuICB9XG59XG5cbkZhYnJpY0NsaWVudEFkYXB0ZXIuZGVjb3JhdGlvbigpO1xuQWRhcHRlci5zZXRDdXJyZW50KEZhYnJpY0ZsYXZvdXIpO1xuIiwiaW1wb3J0IHtcbiAgQWRhcHRlcixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIERpc3BhdGNoLFxuICBFdmVudElkcyxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgUGVyc2lzdGVuY2VLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFBlZXJDb25maWcgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgRmFicmljQ2xpZW50QWRhcHRlciB9IGZyb20gXCIuL0ZhYnJpY0NsaWVudEFkYXB0ZXJcIjtcbmltcG9ydCB7IEZhYnJpY0NsaWVudENvbnRleHQgfSBmcm9tIFwiLi9GYWJyaWNDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlRXZlbnQsXG4gIENsb3NlYWJsZUFzeW5jSXRlcmFibGUsXG59IGZyb20gXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIjtcbmltcG9ydCB7IHBhcnNlRXZlbnROYW1lIH0gZnJvbSBcIi4uL3NoYXJlZC9ldmVudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXZlbnQgZGlzcGF0Y2hlciBmb3IgSHlwZXJsZWRnZXIgRmFicmljIGNoYWluY29kZSBldmVudHNcbiAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGFuZCBwcm9jZXNzZXMgZXZlbnRzIGVtaXR0ZWQgYnkgRmFicmljIGNoYWluY29kZSwgZGlzcGF0Y2hpbmcgdGhlbSB0byByZWdpc3RlcmVkIG9ic2VydmVyc1xuICogQHRlbXBsYXRlIFBlZXJDb25maWcgLSBDb25maWd1cmF0aW9uIHR5cGUgZm9yIGNvbm5lY3RpbmcgdG8gYSBGYWJyaWMgcGVlclxuICogQHBhcmFtIGNsaWVudCAtIGdSUEMgY2xpZW50IGZvciBjb25uZWN0aW5nIHRvIHRoZSBGYWJyaWMgbmV0d29ya1xuICogQGNsYXNzIEZhYnJpY0NsaWVudERpc3BhdGNoXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IEZhYnJpY0Rpc3BhdGNoIGluc3RhbmNlXG4gKiBjb25zdCBjbGllbnQgPSBhd2FpdCBGYWJyaWNBZGFwdGVyLmdldENsaWVudChwZWVyQ29uZmlnKTtcbiAqIGNvbnN0IGRpc3BhdGNoID0gbmV3IEZhYnJpY0Rpc3BhdGNoKGNsaWVudCk7XG4gKlxuICogLy8gQ29uZmlndXJlIHRoZSBkaXNwYXRjaCB3aXRoIHBlZXIgY29uZmlndXJhdGlvblxuICogZGlzcGF0Y2guY29uZmlndXJlKHBlZXJDb25maWcpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGFuIG9ic2VydmVyIGZvciBhIHNwZWNpZmljIHRhYmxlIGFuZCBldmVudFxuICogZGlzcGF0Y2gub2JzZXJ2ZSgndXNlcnMnLCAnY3JlYXRlJywgKGlkKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBVc2VyIGNyZWF0ZWQ6ICR7aWR9YCk7XG4gKiB9KTtcbiAqXG4gKiAvLyBTdGFydCBsaXN0ZW5pbmcgZm9yIGV2ZW50c1xuICogYXdhaXQgZGlzcGF0Y2guc3RhcnQoKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRmFicmljRGlzcGF0Y2hcbiAqICAgcGFydGljaXBhbnQgR2F0ZXdheVxuICogICBwYXJ0aWNpcGFudCBOZXR3b3JrXG4gKiAgIHBhcnRpY2lwYW50IENoYWluY29kZVxuICpcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IG5ldyBGYWJyaWNEaXNwYXRjaChjbGllbnQpXG4gKiAgIENsaWVudC0+PkZhYnJpY0Rpc3BhdGNoOiBjb25maWd1cmUocGVlckNvbmZpZylcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IG9ic2VydmUodGFibGUsIGV2ZW50LCBjYWxsYmFjaylcbiAqICAgQ2xpZW50LT4+RmFicmljRGlzcGF0Y2g6IHN0YXJ0KClcbiAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaW5pdGlhbGl6ZSgpXG4gKiAgIEZhYnJpY0Rpc3BhdGNoLT4+R2F0ZXdheTogZ2V0R2F0ZXdheShjb25maWcsIGNsaWVudClcbiAqICAgR2F0ZXdheS0+Pk5ldHdvcms6IGdldE5ldHdvcmsoY2hhbm5lbClcbiAqICAgTmV0d29yay0+Pk5ldHdvcms6IGdldENoYWluY29kZUV2ZW50cyhjaGFpbmNvZGVOYW1lKVxuICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBoYW5kbGVFdmVudHMoKVxuICogICBsb29wIEZvciBlYWNoIGV2ZW50XG4gKiAgICAgQ2hhaW5jb2RlLS0+PkZhYnJpY0Rpc3BhdGNoOiBDaGFpbmNvZGVFdmVudFxuICogICAgIEZhYnJpY0Rpc3BhdGNoLT4+RmFicmljRGlzcGF0Y2g6IHBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZVBheWxvYWQocGF5bG9hZClcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZClcbiAqICAgICBGYWJyaWNEaXNwYXRjaC0tPj5DbGllbnQ6IGNhbGxiYWNrKGlkKVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NsaWVudERpc3BhdGNoIGV4dGVuZHMgRGlzcGF0Y2g8RmFicmljQ2xpZW50QWRhcHRlcj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGxpc3RlbmluZyBzdGFjayBmb3IgY2hhaW5jb2RlIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBsaXN0ZW5pbmdTdGFjaz86IENsb3NlYWJsZUFzeW5jSXRlcmFibGU8Q2hhaW5jb2RlRXZlbnQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGV4dCBkZWNvZGVyIGZvciBjb252ZXJ0aW5nIGV2ZW50IHBheWxvYWRzIGZyb20gYnl0ZXMgdG8gc3RyaW5nc1xuICAgKi9cbiAgcHJpdmF0ZSBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljRGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBkaXNwYXRjaGVyIGZvciBGYWJyaWMgY2hhaW5jb2RlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IC0gZ1JQQyBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIEZhYnJpYyBuZXR3b3JrXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2xpZW50OiBDbGllbnQpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbG9zZXMgdGhlIGV2ZW50IGxpc3RlbmluZyBjb25uZWN0aW9uXG4gICAqIEBzdW1tYXJ5IFN0b3BzIGxpc3RlbmluZyBmb3IgY2hhaW5jb2RlIGV2ZW50cyBhbmQgcmVsZWFzZXMgcmVzb3VyY2VzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY2xvc2UoXG4gICAgLi4uY3R4QXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3M6IGxvZ2dlZEFyZ3MgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGN0eEFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5TSFVURE9XTiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmNsb3NlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuY2xvc2UoLi4ubG9nZ2VkQXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIHByb3hpZXMgZXZlbnQgbGlzdGVuZXJgLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlzdGVuaW5nU3RhY2suY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY2xvc2UgRmFicmljIGV2ZW50IGxpc3RlbmVyYCwgZSBhcyBFcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmxpc3RlbmluZ1N0YWNrID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGV2ZW50IHBheWxvYWQgZnJvbSBiaW5hcnkgZm9ybWF0XG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgVWludDhBcnJheSBjb250YWluaW5nIEpTT04gdG8gYW4gb2JqZWN0IHdpdGggYW4gaWQgcHJvcGVydHlcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBqc29uQnl0ZXMgLSBUaGUgYmluYXJ5IHBheWxvYWQgZnJvbSB0aGUgY2hhaW5jb2RlIGV2ZW50XG4gICAqIEByZXR1cm4ge3sgaWQ6IHN0cmluZyB9fSBUaGUgcGFyc2VkIHBheWxvYWQgY29udGFpbmluZyB0aGUgcmVjb3JkIElEXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUGF5bG9hZChqc29uQnl0ZXM6IFVpbnQ4QXJyYXkpOiB7IGlkOiBzdHJpbmc7IHJlc3VsdD86IGFueSB9IHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5kZWNvZGVyLmRlY29kZShqc29uQnl0ZXMpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdGhpcyBkaXNwYXRjaCB0byBhbiBhZGFwdGVyIHRvIG1vbml0b3IgaXRzIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb3ZlcnJpZGUgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KTogKCkgPT4gdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBGYWJyaWNDbGllbnRBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgRmFicmljQ2xpZW50QWRhcHRlciBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIlxuICAgICAgKTtcbiAgICBzdXBlci5vYnNlcnZlKG9ic2VydmVyIGFzIEZhYnJpY0NsaWVudEFkYXB0ZXIpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge2FueX0gcGF5bG9hZCAtIFRoZSBldmVudCBwYXlsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8YW55PiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ2xpZW50Q29udGV4dD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IEFkYXB0ZXIubG9nQ3R4PEZhYnJpY0NsaWVudENvbnRleHQ+KFxuICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMsXG4gICAgICBldmVudCxcbiAgICAgIGZhbHNlLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2g7IHNraXBwaW5nIG9ic2VydmVyIHVwZGF0ZSBmb3IgJHt0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyBtb2RlbCA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCl9OiR7ZXZlbnR9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZWZyZXNoKG1vZGVsLCBldmVudCwgaWQsIC4uLmN0eEFyZ3MpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBkaXNwYXRjaDogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGluY29taW5nIGNoYWluY29kZSBldmVudHNcbiAgICogQHN1bW1hcnkgTGlzdGVucyBmb3IgZXZlbnRzIGZyb20gdGhlIGNoYWluY29kZSBhbmQgZGlzcGF0Y2hlcyB0aGVtIHRvIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGV2ZW50IGhhbmRsaW5nIHN0b3BzXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0Rpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgRXZlbnRTdGFja1xuICAgKiAgIHBhcnRpY2lwYW50IEV2ZW50UGFyc2VyXG4gICAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJzXG4gICAqXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5GYWJyaWNEaXNwYXRjaDogaGFuZGxlRXZlbnRzKClcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkV2ZW50U3RhY2s6IGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIGxpc3RlbmluZ1N0YWNrKVxuICAgKiAgIEV2ZW50U3RhY2stLT4+RmFicmljRGlzcGF0Y2g6IENoYWluY29kZUV2ZW50XG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5FdmVudFBhcnNlcjogcGFyc2VFdmVudE5hbWUoZXZ0LmV2ZW50TmFtZSlcbiAgICogICBFdmVudFBhcnNlci0tPj5GYWJyaWNEaXNwYXRjaDogeyB0YWJsZSwgZXZlbnQsIG93bmVyIH1cbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBDaGVjayBpZiBldmVudCBpcyBmb3IgdGhpcyBNU1BcbiAgICogICBGYWJyaWNEaXNwYXRjaC0+PkZhYnJpY0Rpc3BhdGNoOiBwYXJzZVBheWxvYWQoZXZ0LnBheWxvYWQpXG4gICAqICAgRmFicmljRGlzcGF0Y2gtPj5PYnNlcnZlcnM6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIHBheWxvYWQuaWQpXG4gICAqICAgT2JzZXJ2ZXJzLS0+PkZhYnJpY0Rpc3BhdGNoOiBDYWxsYmFja3MgZXhlY3V0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVFdmVudHMoXG4gICAgY3R4QXJnPzogRmFicmljQ2xpZW50Q29udGV4dFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubGlzdGVuaW5nU3RhY2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEV2ZW50IHN0YWNrIG5vdCBpbml0aWFsaXplZC4gRW5zdXJlIHRoYXQgXCJzdGFydExpc3RlbmluZ1wiIGlzIGNhbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0aGlzIG9wZXJhdGlvbi5gXG4gICAgICApO1xuXG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIgfHwgIXRoaXMuYWRhcHRlci5jb25maWcpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBmb3VuZC4gc2hvdWxkIGJlIGltcG9zc2libGVgKTtcblxuICAgIGNvbnN0IGN0eCA9XG4gICAgICBjdHhBcmcgfHxcbiAgICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICAodGhpcy5tb2RlbHMgJiYgdGhpcy5tb2RlbHNbMF0pIHx8IChNb2RlbCBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yKVxuICAgICAgKSk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaGFuZGxlRXZlbnRzKTtcblxuICAgIGxvZy5pbmZvKFxuICAgICAgYExpc3RlbmluZyBmb3IgaW5jb21pbmcgZXZlbnRzIG9uIGNoYWluY29kZSBcIiR7dGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lfVwiIG9uIGNoYW5uZWwgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhbm5lbH1cIi4uLmBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIHRoaXMubGlzdGVuaW5nU3RhY2spIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZSwgZXZlbnQsIG93bmVyIH0gPSBwYXJzZUV2ZW50TmFtZShldnQuZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcEV2ZW50T25seSAmJlxuICAgICAgICAgIG93bmVyICYmXG4gICAgICAgICAgb3duZXIgIT09IHRoaXMuYWRhcHRlci5jb25maWc/Lm1zcElkXG4gICAgICAgIClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogeyBpZDogc3RyaW5nOyByZXN1bHQ/OiBhbnkgfSA9IHRoaXMucGFyc2VQYXlsb2FkKFxuICAgICAgICAgIGV2dC5wYXlsb2FkXG4gICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWwgPSB0YWJsZVxuICAgICAgICAgICAgPyBNb2RlbC5nZXQodGFibGUpXG4gICAgICAgICAgICA6IE1vZGVsLmdldCh0aGlzLm1vZGVsc1swXS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBtb2RlbFJlZiA9IHRhcmdldE1vZGVsID8/ICh0YWJsZSB8fCB0aGlzLm1vZGVsc1swXT8ubmFtZSk7XG4gICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJBcmdzID0gcGF5bG9hZC5yZXN1bHQgPyBbcGF5bG9hZC5yZXN1bHQsIGN0eF0gOiBbY3R4XTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIG1vZGVsUmVmIGFzIENvbnN0cnVjdG9yIHwgc3RyaW5nLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkLmlkIGFzIHN0cmluZyxcbiAgICAgICAgICAgIC4uLihvYnNlcnZlckFyZ3MgYXMgQ29udGV4dHVhbEFyZ3M8YW55PilcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB1cGRhdGUgb2JzZXJ2YWJsZXMgZm9yIHRhYmxlICR7dGFibGV9IGV2ZW50ICR7ZXZlbnR9IGlkOiAke3BheWxvYWQuaWR9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZWFkIGV2ZW50IGZvciBjaGFpbmNvZGUgXCIke3RoaXMuYWRhcHRlci5jb25maWcuY2hhaW5jb2RlTmFtZX1cIiBvbiBjaGFubmVsIFwiJHt0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWx9XCI6ICR7ZX1gXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZShjdHgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgZXZlbnQgZGlzcGF0Y2hpbmcgZm9yIHRoZSBvYnNlcnZlZCBhZGFwdGVyLiBXaGVuXG4gICAqIGBzeW50aGV0aWNFdmVudHNgIGlzIHRydWUgKHRoZSBkZWZhdWx0KSBubyBnYXRld2F5IGNvbm5lY3Rpb24gaXMgb3BlbmVkO1xuICAgKiBpbnN0ZWFkIGV2ZXJ5IENSVUQgb3BlcmF0aW9uIGlzIHdyYXBwZWQgd2l0aCBhIFByb3h5IHRoYXQgZmlyZXNcbiAgICogYHVwZGF0ZU9ic2VydmVyc2AgZm9yICoqYWxsKiogbW9kZWxzLiBXaGVuIGBzeW50aGV0aWNFdmVudHNgIGlzIGZhbHNlIHRoZVxuICAgKiBleGlzdGluZyBnYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQgYW5kIHRoZVxuICAgKiBsb2NhbCBQcm94eSBmYWxsYmFjayBpcyBsaW1pdGVkIHRvIGZ1bGx5LXNlZ3JlZ2F0ZWQgKHRyYW5zaWVudCkgbW9kZWxzIG9ubHkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9yIGNvbmZpZyBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcblxuICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50cyA9IHRoaXMuYWRhcHRlci5jb25maWcuc3ludGhldGljRXZlbnRzICE9PSBmYWxzZTtcblxuICAgIGlmICghc3ludGhldGljRXZlbnRzKSB7XG4gICAgICAvLyBHYXRld2F5LWJhc2VkIGNoYWluY29kZS1ldmVudCBzdWJzY3JpcHRpb24gKG5vbi1zeW50aGV0aWMgcGF0aClcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICAgICAgXCJkaXNwYXRjaFwiLFxuICAgICAgICB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5hZGFwdGVyLmNvbmZpZy5jaGFpbmNvZGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBNb2RlbCBhcyBhbnlcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmluaXRpYWxpemUpO1xuICAgICAgY29uc3QgZ2F0ZXdheSA9IGF3YWl0IEZhYnJpY0NsaWVudEFkYXB0ZXIuZ2V0R2F0ZXdheShcbiAgICAgICAgY3R4LFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnIGFzIFBlZXJDb25maWcsXG4gICAgICAgIHRoaXMuY2xpZW50XG4gICAgICApO1xuICAgICAgY29uc3QgbmV0d29yayA9IGdhdGV3YXkuZ2V0TmV0d29yayh0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYW5uZWwpO1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgdGhpcy5saXN0ZW5pbmdTdGFjayA9IGF3YWl0IG5ldHdvcmsuZ2V0Q2hhaW5jb2RlRXZlbnRzKFxuICAgICAgICB0aGlzLmFkYXB0ZXIuY29uZmlnLmNoYWluY29kZU5hbWVcbiAgICAgICk7XG4gICAgICB0aGlzLmhhbmRsZUV2ZW50cyhjdHgpO1xuICAgIH1cblxuICAgIC8vIFByb3h5IENSVUQgbWV0aG9kcy5cbiAgICAvLyDigKIgc3ludGhldGljRXZlbnRzID0gdHJ1ZSAg4oaSIG5vdGlmeSBmb3IgQUxMIG1vZGVscyAocmVwbGFjZXMgZ2F0ZXdheSBldmVudHMgZW50aXJlbHkpXG4gICAgLy8g4oCiIHN5bnRoZXRpY0V2ZW50cyA9IGZhbHNlIOKGkiBub3RpZnkgb25seSBmb3IgZnVsbHktc2VncmVnYXRlZCAodHJhbnNpZW50KSBtb2RlbHNcbiAgICAvLyAgICh0aGUgZ2F0ZXdheSBzdWJzY3JpcHRpb24gaGFuZGxlcyBwdWJsaWMgbW9kZWxzKVxuICAgIChcbiAgICAgIFtcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIF0gYXMgKGtleW9mIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PilbXVxuICAgICkuZm9yRWFjaCgodG9XcmFwKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE5vIGFkYXB0ZXIgcHJvdmlkZWQgZm9yIHRoZSBmYWxsYmFjayBvZiBmdWxseSBzZWdyZWdhdGVkIG1vZGVsc2BcbiAgICAgICAgKTtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyW3RvV3JhcF0pXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNZXRob2QgJHt0b1dyYXB9IG5vdCBmb3VuZCBpbiAke3RoaXMuYWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5hZGFwdGVyLCB0b1dyYXApO1xuICAgICAgbGV0IHByb3RvOiBhbnkgPSB0aGlzLmFkYXB0ZXI7XG4gICAgICB3aGlsZSAoIWRlc2NyaXB0b3IgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgdG9XcmFwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRob2QgJHt0b1dyYXB9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBhcmUgcmVhZCBvbmx5IHByb3BlcnRpZXNcbiAgICAgIHRoaXMuYWRhcHRlclt0b1dyYXBdID0gbmV3IFByb3h5KHRoaXMuYWRhcHRlclt0b1dyYXBdLCB7XG4gICAgICAgIGFwcGx5OiBhc3luYyAoXG4gICAgICAgICAgdGFyZ2V0OiBhbnksXG4gICAgICAgICAgdGhpc0FyZzogRmFicmljQ2xpZW50QWRhcHRlcixcbiAgICAgICAgICBhcmdBcnJheTogYW55W11cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgLy8gUnVuIHRoZSBvcmlnaW5hbCBtZXRob2QgdW5jaGFuZ2VkIHNvIHRyYW5zaWVudCBkYXRhIGlzIHByZXNlcnZlZFxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBhcmdBcnJheSk7XG5cbiAgICAgICAgICBjb25zdCBjbGF6ejogQ29uc3RydWN0b3I8YW55PiA9IGFyZ0FycmF5WzBdO1xuICAgICAgICAgIC8vIFdoZW4gc3ludGhldGljRXZlbnRzIGlzIGZhbHNlLCBwdWJsaWMgbW9kZWxzIGVtaXQgYSBjaGFpbmNvZGUgZXZlbnRcbiAgICAgICAgICAvLyBvbiB0aGUgY29udHJhY3Qgc2lkZTsgc2tpcCB0aGUgbG9jYWwgZmFsbGJhY2sgdG8gYXZvaWRcbiAgICAgICAgICAvLyBkb3VibGUtbm90aWZpY2F0aW9uLiBXaGVuIHN5bnRoZXRpY0V2ZW50cyBpcyB0cnVlIHdlIGhhbmRsZSBhbGwgbW9kZWxzLlxuICAgICAgICAgIGlmICghc3ludGhldGljRXZlbnRzICYmICFNb2RlbC5pc1RyYW5zaWVudChjbGF6eikpIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgICAvLyBDb250ZXh0IGlzIGFsd2F5cyB0aGUgbGFzdCBlbGVtZW50IG9mIGFyZ0FycmF5XG4gICAgICAgICAgY29uc3QgeyBsb2csIGN0eEFyZ3MsIGN0eCB9ID0gdGhpc0FyZ1tcImxvZ0N0eFwiXShcbiAgICAgICAgICAgIGFyZ0FycmF5LnNsaWNlKGFyZ0FycmF5Lmxlbmd0aCAtIDEpLFxuICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpZHMgPSBhcmdBcnJheVsxXTtcbiAgICAgICAgICBjb25zdCByZXN1bHRBcmdzOiBhbnlbXSA9IFtjbGF6eiwgYnVsa1RvU2luZ2xlKHRvV3JhcCksIGlkc107XG5cbiAgICAgICAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwib2JzZXJ2ZUZ1bGxSZXN1bHRcIikpIHtcbiAgICAgICAgICAgIHJlc3VsdEFyZ3MucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICAgIHJlc3VsdEFyZ3NbMF0sXG4gICAgICAgICAgICByZXN1bHRBcmdzWzFdLFxuICAgICAgICAgICAgcmVzdWx0QXJnc1syXSxcbiAgICAgICAgICAgIC4uLnJlc3VsdEFyZ3Muc2xpY2UoMyksXG4gICAgICAgICAgICAuLi4oY3R4QXJncyBhcyBDb250ZXh0dWFsQXJnczxGYWJyaWNDbGllbnRDb250ZXh0PilcbiAgICAgICAgICApLmNhdGNoKChlOiB1bmtub3duKSA9PlxuICAgICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRpc3BhdGNoIG9ic2VydmVyIHJlZnJlc2ggZm9yICR7dG9XcmFwfSBvbiAke2NsYXp6Lm5hbWUgfHwgY2xhenp9IGZvciAke2lkc306ICR7ZX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuaWYgKEZhYnJpY0NsaWVudEFkYXB0ZXIpXG4gIEZhYnJpY0NsaWVudEFkYXB0ZXJbXCJfYmFzZURpc3BhdGNoXCJdID0gRmFicmljQ2xpZW50RGlzcGF0Y2g7XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgY3VycmVudCBjb21taXQgaGFzaCBvZiB0aGUgbW9kdWxlIGJ1aWxkLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IGdpdCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuIFRoZSBidWlsZCByZXBsYWNlc1xuICogdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBjb21taXQgaGFzaCBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgQ09NTUlUXG4gKi9cbmV4cG9ydCBjb25zdCBDT01NSVQgPSBcIiMjQ09NTUlUIyNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgZnVsbCB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgbW9kdWxlLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZW12ZXIgdmVyc2lvbiBhbmQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLlxuICogVGhlIGJ1aWxkIHJlcGxhY2VzIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgYDx2ZXJzaW9uPi08Y29tbWl0PmAgdmFsdWUgYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IEZVTExfVkVSU0lPTlxuICovXG5leHBvcnQgY29uc3QgRlVMTF9WRVJTSU9OID0gXCIjI0ZVTExfVkVSU0lPTiMjXCI7XG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRSMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbInJlc29sdmVQcmltYXJ5S2V5RmllbGQiLCJtIiwibG9nIiwiU3RyaW5nIiwiTW9kZWwiLCJwayIsIm1lc3NhZ2UiLCJuYW1lIiwidmVyYm9zZSIsInVuZGVmaW5lZCIsIndpdGhEZWZhdWx0UXVlcnlQa1RpZUJyZWFrZXIiLCJpbmRleGVzIiwicGtGaWVsZCIsIm1hcCIsImluZGV4IiwiZmllbGRzIiwiaW5jbHVkZXMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJzb3J0ZWRGaWVsZHMiLCJmaWx0ZXIiLCJmaWVsZCIsImhhc1BrIiwic29tZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImxhc3RGaWVsZCIsImxhc3REaXJlY3Rpb24iLCJ2YWx1ZXMiLCJ0b0xvd2VyQ2FzZSIsImRpcmVjdGlvbiIsImFzc2lnbiIsImVuc3VyZURpcmVjdG9yeUV4aXN0ZW5jZSIsImZpbGVQYXRoIiwiZnMiLCJyZXF1aXJlIiwicGF0aCIsImRpcm5hbWUiLCJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwiZ2VuZXJhdGVNb2RlbEluZGV4ZXMiLCJnZW5lcmF0ZUluZGV4ZXMiLCJnZW5lcmF0ZU1vZGVsRGVzaWduRG9jcyIsImFjY3VtIiwidmlld3MiLCJnZW5lcmF0ZVZpZXdzIiwic3RvcmFnZSIsImZvckVhY2giLCJkb2MiLCJfaWQiLCJyZWFkTW9kZWxGaWxlIiwiZmlsZSIsInJlc29sdmUiLCJwYXJlbnRQYXRoIiwiZXhwb3J0cyIsImUiLCJhc3luYyIsInJlYWRNb2RlbEZvbGRlcnMiLCJmb2xkZXJzIiwicmVzdWx0IiwiZm9sZGVyIiwicmVzb2x2ZWRGb2xkZXIiLCJmaWxlcyIsInJlYWRkaXJTeW5jIiwid2l0aEZpbGVUeXBlcyIsInJlY3Vyc2l2ZSIsImYiLCJpc0ZpbGUiLCJlbmRzV2l0aCIsInB1c2giLCJ3cml0ZUluZGV4ZXMiLCJwIiwicHJvY2VzcyIsImN3ZCIsImNvbGxlY3Rpb24iLCJqb2luIiwid3JpdGVGaWxlU3luYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3cml0ZURlc2lnbkRvY3MiLCJkZXNpZ25Eb2NzIiwiZG9jSWQiLCJyZXBsYWNlIiwicGF5bG9hZCIsIl9yZXYiLCJjb2xsZWN0aW9uRm9yIiwiY29sbGVjdGlvbk5hbWUiLCJwb2xpY3kiLCJyZXF1aXJlZFBlZXJDb3VudCIsIm1heFBlZXJDb3VudCIsImJsb2NrVG9MaXZlIiwibWVtYmVyT25seVJlYWQiLCJtZW1iZXJPbmx5V3JpdGUiLCJwcml2YXRlQ29sbGVjdGlvbkZvciIsIm1zcElkIiwiYyIsImVuZG9yc2VtZW50UG9saWN5Iiwic2lnbmF0dXJlUG9saWN5Iiwic2hhcmVkQ29sbGVjdGlvbkZvciIsIm1zcElkcyIsImV4dHJhY3RDb2xsZWN0aW9ucyIsIm92ZXJyaWRlcyIsIm1pcnJvciIsInByaXZhdGVDb2xzIiwic2hhcmVkQ29scyIsImNvbGxlY3Rpb25zRm9yIiwicmVzb2x2ZUNvbGxlY3Rpb24iLCJhcmciLCJJbnRlcm5hbEVycm9yIiwicHJpdmF0ZURlZmF1bHRzIiwic2hhcmVkRGVmYXVsdHMiLCJtaXJyb3JNZXRhIiwibWlycm9yZWRBdCIsInByaXZhdGVzIiwiZmxhdCIsInJlc29sdmVkIiwicmVzb2x2ZXIiLCJzaGFyZWQiLCJ3cml0ZUNvbGxlY3Rpb25zIiwiY29scyIsImZpbGVOYW1lIiwid3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyIsImRvY3MiLCJGYWJyaWNDbGllbnRQYWdpbmF0b3IiLCJQYWdpbmF0b3IiLCJjb25zdHJ1Y3RvciIsImFkYXB0ZXIiLCJxdWVyeSIsInNpemUiLCJjbGF6eiIsInN1cGVyIiwicHJlcGFyZSIsInJhd1N0YXRlbWVudCIsIlVuc3VwcG9ydGVkRXJyb3IiLCJwYWdlIiwiYXJncyIsImlzU2VyaWFsaXplZFBhZ2UiLCJvYmoiLCJkYXRhIiwiT3ZlcmZsb3dFcnJvciIsIm1zZyIsIkJhbGFuY2VFcnJvciIsIkFsbG93YW5jZUVycm9yIiwiUmVnaXN0cmF0aW9uRXJyb3IiLCJBdXRob3JpemF0aW9uRXJyb3IiLCJNaXNzaW5nQ29udGV4dEVycm9yIiwiVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MiLCJCYXNlRXJyb3IiLCJOb3RJbml0aWFsaXplZEVycm9yIiwiTWlzc2luZ1BLQ1NTMTFMaWIiLCJFbmRvcnNlbWVudEVycm9yIiwiTXZjY1JlYWRDb25mbGljdEVycm9yIiwiUGhhbnRvbVJlYWRDb25mbGljdEVycm9yIiwiRW5kb3JzZW1lbnRQb2xpY3lFcnJvciIsIlRyYW5zYWN0aW9uTGltaXRzRXJyb3IiLCJjb2RlIiwiVHJhbnNhY3Rpb25UaW1lb3V0RXJyb3IiLCJUcmFuc2FjdGlvbkJ1ZmZlclNpemVFcnJvciIsIlF1ZXJ5UmVzdWx0VG9vTGFyZ2VFcnJvciIsIkZhYnJpY0NsaWVudFJlcG9zaXRvcnkiLCJSZXBvc2l0b3J5IiwiZm9yY2UiLCJ0aGlzIiwiX292ZXJyaWRlcyIsImlnbm9yZVZhbGlkYXRpb24iLCJpZ25vcmVIYW5kbGVycyIsImFsbG93UmF3U3RhdGVtZW50cyIsImZvcmNlUHJlcGFyZVNpbXBsZVF1ZXJpZXMiLCJmb3JjZVByZXBhcmVDb21wbGV4UXVlcmllcyIsImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlIiwicmVidWlsZFdpdGhUcmFuc2llbnQiLCJvdmVycmlkZSIsImZsYWdzIiwiZm9yIiwiT2JzZXJ2ZXJIYW5kbGVyIiwicGFnaW5hdGVCeSIsImtleSIsIm9yZGVyIiwicmVmIiwib2Zmc2V0IiwibGltaXQiLCJjdHhBcmdzIiwibG9nQ3R4IiwiUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIiwiUEFHRV9CWSIsInRhYmxlTmFtZSIsImNsYXNzIiwic3RhdGVtZW50IiwiYm9va21hcmsiLCJsaXN0QnkiLCJMSVNUX0JZIiwid2FybiIsImZpbmRCeSIsInZhbHVlIiwiRklORF9CWSIsImZpbmRPbmVCeSIsIkZJTkRfT05FX0JZIiwiZmluZCIsIk9yZGVyRGlyZWN0aW9uIiwiQVNDIiwiRklORCIsIlBBR0UiLCJjdHgiLCJQZXJzaXN0ZW5jZUtleXMiLCJTVEFURU1FTlQiLCJjYWxsQXJncyIsInNsaWNlIiwicGFyc2UiLCJkZWNvZGUiLCJldmFsdWF0ZVRyYW5zYWN0aW9uIiwiaHlkcmF0ZWQiLCJyIiwiQ291Y2hEQktleXMiLCJUQUJMRSIsImQiLCJhcHBseUFmdGVyUmVhZCIsImdldE9yVW5kZWZpbmVkIiwiZW5mb3JjZURCRGVjb3JhdG9ycyIsIk9wZXJhdGlvbktleXMiLCJSRUFEIiwiQUZURVIiLCJQcm9taXNlIiwiYWxsIiwiZW50cnkiLCJjb3VudE9mIiwiQ09VTlRfT0YiLCJzdG10QXJncyIsIm1heE9mIiwiTUFYX09GIiwibWluT2YiLCJNSU5fT0YiLCJhdmdPZiIsIkFWR19PRiIsInN1bU9mIiwiU1VNX09GIiwiZGlzdGluY3RPZiIsIkRJU1RJTkNUX09GIiwiZ3JvdXBPZiIsIkdST1VQX09GIiwiaGVhbHRoY2hlY2siLCJjcmVhdGUiLCJtb2RlbCIsImRlYnVnIiwiZW5zdXJlTGVnYWN5TWlycm9yRmxhZyIsInByZXBhcmVkIiwicmVjb3JkIiwiaWQiLCJ0cmFuc2llbnQiLCJyZXZlcnQiLCJ1cGRhdGUiLCJjcmVhdGVBbGxQcmVmaXgiLCJtb2RlbHMiLCJDUkVBVEUiLCJnZXQiLCJpZ25vcmVWYWxpZGF0ZSIsIk9OIiwiaWdub3JlZFByb3BzIiwiZXJyb3JzIiwiaGFzRXJyb3JzIiwiZXJyb3JNZXNzYWdlcyIsInJlZHVjZUVycm9yc1RvUHJpbnQiLCJWYWxpZGF0aW9uRXJyb3IiLCJjcmVhdGVBbGwiLCJpZHMiLCJwYXlsb2FkcyIsInRyYW5zaWVudHMiLCJjcmVhdGVkIiwiaSIsInJlYWRBbGwiLCJrZXlzIiwicmVjb3JkcyIsInVwZGF0ZUFsbCIsInVwZGF0ZWQiLCJ1IiwiYWNjdW11bGF0ZSIsImxlZ2FjeSIsIkVSQzIwVG9rZW4iLCJCYXNlTW9kZWwiLCJfX2RlY29yYXRlIiwidHlwZSIsImNvbHVtbiIsInJlcXVpcmVkIiwidGFibGUiLCJFUkMyMFdhbGxldCIsIkFsbG93YW5jZSIsIkNsaWVudFNlcmlhbGl6ZXIiLCJKU09OU2VyaWFsaXplciIsInByZVNlcmlhbGl6ZSIsIm1vZGVsTmFtZSIsInRvU2VyaWFsaXplIiwibWV0YWRhdGEiLCJNZXRhZGF0YSIsIlNlcmlhbGl6YXRpb25FcnJvciIsIk1vZGVsS2V5cyIsIkFOQ0hPUiIsImRlc2VyaWFsaXplIiwic3RyIiwiZGVzZXJpYWxpemF0aW9uIiwiY2xhc3NOYW1lIiwiRXJyb3IiLCJidWlsZCIsInNlcmlhbGl6ZSIsIkZhYnJpY0VSQzIwQ2xpZW50UmVwb3NpdG9yeSIsInNlcmlhbGl6ZXIiLCJkZWNvZGVyIiwiVGV4dERlY29kZXIiLCJ1cGRhdGVPYnNlcnZlcnMiLCJldmVudCIsIm9ic2VydmVySGFuZGxlciIsImNvdW50IiwicGFyc2VkSWQiLCJTZXF1ZW5jZSIsInBhcnNlVmFsdWUiLCJzZXF1ZW5jZUZvciIsInRva2VuTmFtZSIsInN5bWJvbCIsImRlY2ltYWxzIiwiTnVtYmVyIiwidG90YWxTdXBwbHkiLCJ0b3RhbCIsImJhbGFuY2VPZiIsIm93bmVyIiwiYmFsYW5jZSIsInRyYW5zZmVyIiwidG8iLCJ0cmFuc2ZlcnJlZCIsInN1Ym1pdFRyYW5zYWN0aW9uIiwidG9TdHJpbmciLCJ0cmFuc2ZlckZyb20iLCJmcm9tIiwiY29udGV4dEFyZ3MiLCJDb250ZXh0IiwiYXBwcm92ZSIsInNwZW5kZXIiLCJhcHByb3ZlZCIsImFsbG93YW5jZSIsImluaXRpYWxpemUiLCJ0b2tlbiIsImluaXRpbGlhemVkIiwiY2hlY2tJbml0aWFsaXplZCIsIm1pbnQiLCJhbW91bnQiLCJidXJuIiwiYnVybkZyb20iLCJhY2NvdW50IiwiY2xpZW50QWNjb3VudEJhbGFuY2UiLCJzZXJpYWxpemVkQWNjb3VudEJhbGFuY2UiLCJjbGllbnRBY2NvdW50SUQiLCJleHRyYWN0SWRzIiwiY29tcG9zZWQiLCJwa1Byb3BzIiwiZXh0cmFjdElkIiwiY29tcG9zZUF0dHJpYnV0ZVZhbHVlIiwiSWRlbnRpdHlDcmVkZW50aWFscyIsImRlc2NyaXB0aW9uIiwiRmFicmljTW9kZWxLZXlzIiwiSWRlbnRpdHlUeXBlIiwiRmFicmljRmxhdm91ciIsIklkZW50aXR5IiwiWDUwOSIsIm9uZVRvT25lIiwiQ2FzY2FkZSIsIkNBU0NBREUiLCJkZWxldGUiLCJDb3JlVXRpbHMiLCJsb2dnZXIiLCJNaW5pTG9nZ2VyIiwiY29udGVudE9mTG9hZEZpbGUiLCJjb250ZW50T3JQYXRoIiwiZmlsZVJlYWRlciIsIlVpbnQ4QXJyYXkiLCJtYXRjaCIsInJlYWRGaWxlIiwicHJvbWlzZXMiLCJub3JtYWxpemVJbXBvcnQiLCJpbXBvcnQiLCJnZXRDQVVzZXIiLCJ1c2VyTmFtZSIsInByaXZhdGVLZXkiLCJjZXJ0aWZpY2F0ZSIsIm9wdGlvbnMiLCJzdHJpbmdGb3JtYXQiLCJ1c2VyIiwiVXNlciIsImNvbmZpZyIsImhzbSIsInNvZnR3YXJlIiwibGliIiwibGlicmFyeSIsInNsb3QiLCJsYWJlbCIsInRva2VuTGFiZWwiLCJwaW4iLCJjcnlwdG9TdWl0ZSIsImdldENyeXB0b1N1aXRlIiwic2V0Q3J5cHRvU3VpdGUiLCJlbnJvbGxtZW50S2V5IiwiZ2V0SFNNRW5yb2xsbWVudEtleSIsImdldFNvZnR3YXJlRW5yb2xsbWVudEtleSIsInNldEVucm9sbG1lbnQiLCJuZXdDcnlwdG9TdWl0ZSIsImNyZWF0ZUtleUZyb21SYXciLCJza2kiLCJrZXlJZEhleCIsInRyaW0iLCJCdWZmZXIiLCJnZXRDZXJ0aWZpY2F0ZVNLSSIsImdldEtleSIsImlzUHJpdmF0ZSIsIng1MDkiLCJYNTA5Q2VydGlmaWNhdGUiLCJqd2siLCJwdWJsaWNLZXkiLCJleHBvcnQiLCJmb3JtYXQiLCJwcmVmaXgiLCJ4IiwieSIsImNyeXB0byIsImNyZWF0ZUhhc2giLCJjb25jYXQiLCJkaWdlc3QiLCJnZXRJZGVudGl0eSIsImNlcnREaXJlY3RvcnlQYXRoIiwiaWRlbnRpdHlGaWxlUmVhZGVyIiwiY2VydFBhdGgiLCJnZXRGaXJzdERpckZpbGVOYW1lIiwiY3JlZGVudGlhbHMiLCJkaXJQYXRoIiwicmVhZGRpciIsImdldEZpcnN0RGlyRmlsZU5hbWVDb250ZW50IiwiZ2V0RmlsZUNvbnRlbnQiLCJnZXRTaWduZXIiLCJrZXlEaXJlY3RvcnlQYXRoIiwic2lnbmVyRmlsZVJlYWRlciIsImtleVBhdGgiLCJwcml2YXRlS2V5UGVtIiwiZXh0cmFjdFByaXZhdGVLZXkiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJrIiwic2lnbmVycyIsIm5ld1ByaXZhdGVLZXlTaWduZXIiLCJwZW0iLCJsaWJOYW1lIiwic3VidGxlIiwiZ2xvYmFsVGhpcyIsIndpbmRvdyIsIkNyeXB0byIsIndlYmNyeXB0byIsInN0cjJhYiIsImJ1ZiIsIkFycmF5QnVmZmVyIiwiYnVmVmlldyIsInN0ckxlbiIsImNoYXJDb2RlQXQiLCJyZXBsYWNlQWxsIiwiZGVjb2RlZCIsImJpbmFyeURlciIsImltcG9ydEtleSIsIm5hbWVkQ3VydmUiLCJnZXRBa2lBbmRTZXJpYWxGcm9tQ2VydCIsImNlcnQiLCJ4NTA5Q2VydGlmaWNhdGUiLCJYNTA5Q2VydCIsImFraUV4dCIsImV4dGVuc2lvbnMiLCJha2kiLCJ0b1VwcGVyQ2FzZSIsInN0YXJ0c1dpdGgiLCJzZXJpYWwiLCJzZXJpYWxOdW1iZXIiLCJjcnlwdG9Qcm92aWRlciIsInNldCIsIkJBU0VfQUxQSEFCRVQiLCJDUllQVE8iLCJCYXNlRW5jb2RlciIsImFscGhhYmV0IiwiYmFzZU1hcCIsImoiLCJjaGFyQXQiLCJ4YyIsImJhc2UiLCJsZWFkZXIiLCJmYWN0b3IiLCJNYXRoIiwiaUZhY3RvciIsImVuY29kZSIsInNvdXJjZSIsImlzVmlldyIsImJ1ZmZlciIsImJ5dGVPZmZzZXQiLCJieXRlTGVuZ3RoIiwiemVyb2VzIiwicGJlZ2luIiwicGVuZCIsImI1OCIsImNhcnJ5IiwiaXQxIiwiaXQyIiwicmVwZWF0IiwiZGVjb2RlVW5zYWZlIiwicHN6IiwiYjI1NiIsIml0MyIsIml0NCIsInZjaCIsIkNyeXB0b1V0aWxzIiwiYjU4ZW5jb2RlciIsIkJBU0U1OCIsImZhYnJpY0lkRnJvbUNlcnRpZmljYXRlIiwic3ViamVjdCIsImlzc3VlciIsInN0cmluZ1RvQXJyYXlCdWZmZXIiLCJleHRyYWN0S2V5IiwidXNhZ2VzIiwiUmVnRXhwIiwiZXh0cmFjdFB1YmxpY0tleSIsInNpZ24iLCJidWZmIiwiaGFzaCIsImIiLCJwYWRTdGFydCIsInZlcmlmeSIsInNpZ25hdHVyZSIsImVuY3J5cHQiLCJnZXRTdWJ0bGVDcnlwdG8iLCJpc0Jyb3dzZXIiLCJkZWNyeXB0IiwiZ2V0TWFzdGVyIiwidGV4dEVuY29kZXIiLCJUZXh0RW5jb2RlciIsImdlbkdlbmVzaXMiLCJyYW5kb21VVUlEIiwiaW1wb3J0ZWRLZXkiLCJLRVlfQUxHT1JZVEhNIiwiaXYiLCJnZXREZXJpdmF0aW9uS2V5Iiwic2FsdCIsInNhbHRCdWZmZXIiLCJzYWx0SGFzaGVkIiwicGFyYW1zIiwiSEFTSCIsIml0ZXJhdGlvbnMiLCJJVEVSQVRJT05TIiwiZGVyaXZhdGlvbiIsImRlcml2ZUJpdHMiLCJLRVlMRU5HVEgiLCJpdmxlbiIsImtleWxlbiIsImRlcml2ZWRLZXkiLCJpbXBvcnRlZEVuY3J5cHRpb25LZXkiLCJBTEdPUllUSE0iLCJlbmNyeXB0UGluIiwidGV4dCIsImtleU9iamVjdCIsInRleHRCdWZmZXIiLCJlbmNyeXB0ZWRUZXh0IiwiZGVjcnlwdFBpbiIsInRleHREZWNvZGVyIiwiZGVjcnlwdGVkVGV4dCIsIkhGQ0FJZGVudGl0eVR5cGUiLCJIRkNBSWRlbnRpdHlBdHRyaWJ1dGVzIiwiRmFicmljRW5yb2xsbWVudFNlcnZpY2UiLCJMb2dnZWRDbGFzcyIsImNhQ29uZmlnIiwiY2FOYW1lIiwiY2FDZXJ0IiwiY2FLZXkiLCJ1cmwiLCJDQSIsImNhIiwidGxzIiwidHJ1c3RlZFJvb3RzIiwicm9vdCIsIkZhYnJpY0NBU2VydmljZXMiLCJDbGllbnQiLCJjbGllbnQiLCJDZXJ0aWZpY2F0ZSIsImNlcnRpZmljYXRlU2VydmljZSIsIm5ld0NlcnRpZmljYXRlU2VydmljZSIsIkFmZmlsaWF0aW9ucyIsImFmZmlsaWF0aW9uU2VydmljZSIsIm5ld0FmZmlsaWF0aW9uU2VydmljZSIsIklkZW50aXRpZXMiLCJpZGVudGl0eVNlcnZpY2UiLCJuZXdJZGVudGl0eVNlcnZpY2UiLCJnZXRDZXJ0aWZpY2F0ZXMiLCJyZXF1ZXN0IiwiZG9NYXAiLCJyZXNwb25zZSIsImNlcnRzIiwiUEVNIiwiZ2V0SWRlbnRpdGllcyIsImlkZW50aXRpZXNTZXJ2aWNlIiwiZ2V0QWxsIiwiaWRlbnRpdGllcyIsInBhcnNlRXJyb3IiLCJyZWdleHAiLCJleGVjIiwiQ29uZmxpY3RFcnJvciIsImdldEFmZmlsaWF0aW9ucyIsImEiLCJyZWFkIiwiZW5yb2xsbWVudElkIiwiZ2V0T25lIiwiTm90Rm91bmRFcnJvciIsInN1Y2Nlc3MiLCJyZWdpc3RlciIsImlzU3VwZXJVc2VyIiwiYWZmaWxpYXRpb24iLCJ1c2VyUm9sZSIsImF0dHJzIiwibWF4RW5yb2xsbWVudHMiLCJyZWdpc3RyYXRpb24iLCJwYXNzd29yZCIsInByb3BzIiwiZW5yb2xsbWVudElEIiwiZW5yb2xsbWVudFNlY3JldCIsImluZm8iLCJpZGVudGl0eUZyb21FbnJvbGxtZW50IiwiZW5yb2xsbWVudCIsInJvb3RDZXJ0aWZpY2F0ZSIsIkxvZ2dpbmciLCJjbGllbnRJZCIsIm5vdyIsIkRhdGUiLCJ0b0J5dGVzIiwiY3JlYXRlZE9uIiwidXBkYXRlZE9uIiwiZW5yb2xsIiwiaWRlbnRpdHkiLCJyZWdpc3RlckFuZEVucm9sbCIsInJldm9rZSIsInJlYXNvbiIsIlJlZ2lzdHJhdGlvblJlcXVlc3RCdWlsZGVyIiwiZXJycyIsInJvbGUiLCJzZXRBZmZpbGlhdGlvbiIsImFkZEF0dHIiLCJhdHRyIiwic2V0QXR0cnMiLCJzZXRFbnJvbGxtZW50SUQiLCJzZXRFbnJvbGxtZW50U2VjcmV0Iiwic2V0TWF4RW5yb2xsbWVudHMiLCJzZXRSb2xlIiwibWlubGVuZ3RoIiwibWluIiwiaXNTaGFyZWQiLCJzZWdyZWdhdGUiLCJpc1RyYW5zaWVudCIsImRlY29yYXRlZFByb3BlcnRpZXMiLCJnZXRBdHRyaWJ1dGVzIiwidHJhbnNpZW50UHJvcHMiLCJEQktleXMiLCJUUkFOU0lFTlQiLCJwcml2YXRlUHJvcGVydGllcyIsIlBSSVZBVEUiLCJzaGFyZWRQcm9wZXJ0aWVzIiwiU0hBUkVEIiwicHVibGljIiwidHJhbnNpZW50S2V5cyIsInByaXZhdGVLZXlzIiwic2hhcmVkS2V5cyIsImlzUHVibGljIiwiYmluZCIsIm1pcnJvcmVkIiwiRkFCUklDIiwiTUlSUk9SIiwib3duZXJPZiIsIm1ldGEiLCJPV05FRF9CWSIsInNoYXJlZEtleSIsImNvbnN0ciIsInByaXZhdGVNZXRhIiwic2hhcmVkTWV0YSIsImNvbGxlY3Rpb25zIiwiY2hhaW5jb2RlT2YiLCJDSEFJTkNPREUiLCJwb3AiLCJjb250cmFjdE9mIiwiQ09OVFJBQ1QiLCJjaGFubmVsT2YiLCJDSEFOTkVMIiwiRVJDMjBFdmVudHMiLCJGYWJyaWNCYXNlTW9kZWwiLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJ2ZXJzaW9uIiwidXNlcyIsIkZhYnJpY0lkZW50aWZpZWRCYXNlTW9kZWwiLCJjcmVhdGVkQnkiLCJ1cGRhdGVkQnkiLCJEZWZhdWx0Q29udHJhY3RSZXNvbHZlciIsImNvbnRyYWN0IiwiY2hhaW5jb2RlIiwiY2hhbm5lbCIsImV4dHJhY3RNc3BJZCIsImdldE1TUElEIiwiT3duZXIiLCJ0YXJnZXQiLCJwcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJvcmlnaW5hbE1ldGhvZCIsImFjb3VudElkIiwiY2xpZW50SWRlbnRpdHkiLCJnZXRJRCIsInNlbGVjdCIsInRva2VucyIsImV4ZWN1dGUiLCJhcHBseSIsIm93bmVkQnlPbkNyZWF0ZSIsImNvbnRleHQiLCJzdHViIiwiY3JlYXRvciIsImdldENyZWF0b3IiLCJtc3BpZCIsInNldE93bmVkQnlLZXlWYWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwib3duZWRCeSIsImF0dHJpYnV0ZSIsImdlbmVyYXRlZCIsInJlYWRvbmx5Iiwib25DcmVhdGUiLCJwcm9wTWV0YWRhdGEiLCJEZWNvcmF0aW9uIiwiZGVmaW5lIiwiZGVjb3JhdG9yIiwidHJhbnNhY3Rpb25JZE9uQ3JlYXRlIiwiZ2V0VHhJRCIsInRyYW5zYWN0aW9uSWQiLCJvblVwZGF0ZSIsIlRSQU5TQUNUSU9OX0lEIiwiZXZhbE1pcnJvck1ldGFkYXRhIiwiY3JlYXRlTWlycm9ySGFuZGxlciIsImZhYnJpY0N0eCIsInNvdXJjZU1vZGVsIiwicHV0IiwicmVwbyIsIm1pcnJvckNvbGxlY3Rpb24iLCJ1cGRhdGVNaXJyb3JIYW5kbGVyIiwiYXBwbHlVcGRhdGVWYWxpZGF0aW9uIiwibWVyZ2VGb3JVcGRhdGUiLCJkZWxldGVNaXJyb3JIYW5kbGVyIiwicGtQcm9wIiwic2VncmVnYXRlZCIsIm1pcnJvcldyaXRlR3VhcmQiLCJtc3AiLCJjb25kaXRpb24iLCJyZWFkTWlycm9ySGFuZGxlciIsIm1hdGNoZXMiLCJyZWFkRnJvbSIsIm1zcElkT3JDb25kaXRpb24iLCJpc0NvbmRpdGlvbk9ubHkiLCJCb29sZWFuIiwiY29uZCIsIm9uUmVhZCIsInByaW9yaXR5Iiwib25EZWxldGUiLCJNb2RlbENvbGxlY3Rpb24iLCJvcmdOYW1lIiwidG9QYXNjYWxDYXNlIiwiTmFtZXNwYWNlQ29sbGVjdGlvbiIsIm5hbWVzcGFjZSIsIkltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb24iLCJTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSIsImFwcGx5U2VncmVnYXRpb25GbGFncyIsImlzRnVsbHlTZWdyZWdhdGVkIiwiaGFzUHVibGljUHJvcGVydGllcyIsIm1hcmtGdWxseVNlZ3JlZ2F0ZWQiLCJhcHBseU1pcnJvckZsYWdzIiwiYXR0cmlidXRlcyIsInRyYW5zaWVudE1ldGEiLCJleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIiwiZGF0YUFycmF5IiwiY29sbGVjdGlvblJlc29sdmVyIiwia2V5QXJyYXkiLCJwa0tleSIsInBrU2VxTmFtZSIsInNlcXVlbmNlTmFtZSIsImlkVmFsdWUiLCJjYW5CdWlsZFBlckluc3RhbmNlIiwic2V0U2VxdWVuY2VTZWdyZWdhdGlvbiIsInByb3BTZXFOYW1lIiwic2VncmVnYXRlZERhdGFPbkNyZWF0ZSIsIl9rIiwia2V5U3RyaW5ncyIsIndyaXRlVG8iLCJzZWdyZWdhdGVkRGF0YU9uUmVhZCIsInNlZ3JlZ2F0ZWREYXRhT25VcGRhdGUiLCJvbGRNb2RlbCIsInNlZ3JlZ2F0ZWREYXRhT25EZWxldGUiLCJpbm5lclNlZ3JlZ2F0ZWQiLCJzZWdyZWdhdGVkRGVjIiwiU2V0IiwiYWRkIiwiY29uc3RyTWV0YSIsImNvbnN0ckNvbGxlY3Rpb25zIiwidXBkYXRlZFRyYW5zaWVudE1ldGEiLCJkZWNzIiwicHJvcGVydGllcyIsImdyb3VwTmFtZSIsImV4dHJhY3RHcm91cE5hbWUiLCJkYXRhR3JvdXBOYW1lIiwiZWFybHlFeHRyYWN0aW9uTWV0YSIsImVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydCIsImdyb3VwIiwicHJvcCIsIm9uIiwiREJPcGVyYXRpb25zIiwiQUxMIiwicHJpdmF0ZURhdGEiLCJzaGFyZWREYXRhIiwic29ydEtleXNPbmx5UmVjdXJzaXZlIiwic29ydCIsInJlZHVjZSIsImFjYyIsIkRldGVybWluaXN0aWNTZXJpYWxpemVyIiwiZXJyb3IiLCJzZWxmIiwibyIsInJlbGF0aW9ucyIsImdlbmVyYXRlRmFicmljRXZlbnROYW1lIiwicGFyc2VFdmVudE5hbWUiLCJwYXJ0cyIsInNwbGl0Iiwic3ViIiwic2FmZVBhcnNlSW50Iiwic3RyaW5nIiwiZGlnaXRSZWdleCIsInRlc3QiLCJwYXJzZWRpbnQiLCJwYXJzZUludCIsImlzTmFOIiwiU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIiLCJwdXRBbmNob3IiLCJwcmVTZXJpYWxpemF0aW9uIiwiRmFicmljSWRlbnRpdHlTZXJ2aWNlIiwiQ2xpZW50QmFzZWRTZXJ2aWNlIiwicm9vdENsaWVudCIsIl91c2VyIiwiY2VydGlmaWNhdGVzIiwiYWZmaWxpYXRpb25zIiwiZ2V0VXNlciIsImNmZyIsIklOSVRJQUxJWkFUSU9OIiwiZ2V0TmFtZSIsInVwZGF0ZUlkZW50aXR5IiwiaWRlbnRpdHlSZXF1ZXN0IiwiY2FVc2VySWRlbnRpdHkiLCJyZWVucm9sbFVzZXIiLCJjcmVhdGVVc2VyIiwiZ2V0TXNwaWQiLCJlbnJvbGxtZW50QXR0cnMiLCJvcHRpb25hbCIsInJlZW5yb2xsIiwicmVuZXdlZElkZW50aXR5IiwicmV2b2tlT3B0aW9ucyIsInJldm9rZVJlcXVlc3QiLCJDQV9ST0xFIiwiRGVmYXVsdEZhYnJpY0NsaWVudEZsYWdzIiwiZXZhbHVhdGVUaW1lb3V0IiwiZW5kb3JzZVRpbWVvdXQiLCJzdWJtaXRUaW1lb3V0IiwiY29tbWl0VGltZW91dCIsImFsbG93TWFudWFsRW5kb3JzaW5nT3JncyIsImFsbG93R2F0ZXdheU92ZXJyaWRlIiwiYWxsb3dDb250ZXh0VHJhbnNpZW50TWFwIiwiZW5jcnlwdFRyYW5zaWVudCIsInN5bnRoZXRpY0V2ZW50cyIsImNyZWF0ZVByaXZhdGVLZXkiLCJDTElFTlRfT1ZFUlJJREVfS0VZUyIsIkZhYnJpY0NsaWVudENvbnRleHQiLCJ0b092ZXJyaWRlcyIsImVzY2FwZVJlZ0V4cCIsIm5leHRMZXhpY29ncmFwaGljU3RyaW5nIiwiY2hhcnMiLCJjb2RlUG9pbnRBdCIsImZyb21Db2RlUG9pbnQiLCJwcmVmaXhSYW5nZSIsInN0YXJ0IiwiZW5kIiwiRmFicmljQ2xpZW50U3RhdGVtZW50IiwiU3RhdGVtZW50Iiwic3F1YXNoIiwic3F1YXNoZWQiLCJtZXRob2QiLCJleGVjdXRlUHJlcGFyZWQiLCJhcmd6IiwiZm9yTW9kZWwiLCJmcm9tU2VsZWN0b3IiLCJhbGlhcyIsIlFVRVJZIiwiaXNTaW1wbGVRdWVyeSIsIlF1ZXJ5Q2xhdXNlIiwid2hlcmVDb25kaXRpb24iLCJwYXJzZWQiLCJwcmVwYXJlQ29uZGl0aW9uIiwic2VsZWN0U2VsZWN0b3IiLCJTRUxFQ1QiLCJBTkQiLCJvcmRlckJ5U2VsZWN0b3JzIiwiT1JERVJfQlkiLCJ0b0NhbWVsQ2FzZSIsInByb2Nlc3NSZWNvcmQiLCJwa0F0dHIiLCJJRCIsImtleUFyZ3MiLCJTRVBBUkFUT1IiLCJyYXciLCJyYXdJbnB1dCIsImFnZ3JlZ2F0b3IiLCJhZ2dyZWdhdGVJbmZvIiwiYWdncmVnYXRlIiwiZXhlY3V0ZUFnZ3JlZ2F0ZSIsInJlc3VsdHMiLCJwcm9jZXNzZWQiLCJhcHBseUFmdGVySGFuZGxlcnNUb1Jlc3VsdCIsImFnZ3JlZ2F0ZVF1ZXJ5IiwiYnVpbGRBZ2dyZWdhdGVRdWVyeSIsInNlbGVjdG9ycyIsInNlbGVjdG9yIiwicGFyc2VDb25kaXRpb24iLCJDb25kaXRpb24iLCJhbmQiLCJlcSIsInNlbGVjdG9yS2V5cyIsIkNvdWNoREJHcm91cE9wZXJhdG9yIiwiaW5kZXhPZiIsInZhbCIsIk9SIiwicyIsImVudHJpZXMiLCJzZWxlY3RvcktleSIsInJlYyIsIkNvdWNoREJPcGVyYXRvciIsIkJJR0dFUiIsImxpbWl0U2VsZWN0b3IiLCJDb3VjaERCUXVlcnlMaW1pdCIsIm9mZnNldFNlbGVjdG9yIiwic2tpcCIsIm1lcmdlIiwib3AiLCJvYmoxIiwib2JqMiIsImF0dHIxIiwib3BlcmF0b3IiLCJjb21wYXJpc29uIiwiT3BlcmF0b3IiLCJTVEFSVFNfV0lUSCIsIlF1ZXJ5RXJyb3IiLCJyYW5nZSIsIkJJR0dFUl9FUSIsIlNNQUxMRVIiLCJFTkRTX1dJVEgiLCJSRUdFWFAiLCJCRVRXRUVOIiwibWF4Iiwib3BCZXR3ZWVuIiwidHJhbnNsYXRlT3BlcmF0b3JzIiwiU01BTExFUl9FUSIsIkdyb3VwT3BlcmF0b3IiLCJOT1QiLCJvcDEiLCJvcDIiLCJhdmdTZWxlY3RvciIsInN1bUluZm8iLCJjcmVhdGVBZ2dyZWdhdGVEZXNjcmlwdG9yIiwiY291bnRJbmZvIiwiY3JlYXRlQWdncmVnYXRlUXVlcnkiLCJraW5kIiwic3VtRGVzY3JpcHRvciIsImNvdW50RGVzY3JpcHRvciIsImNvdW50RGlzdGluY3RTZWxlY3RvciIsImNvdW50RGlzdGluY3QiLCJhZ2dyZWdhdG9yVXNlZCIsImNvdW50U2VsZWN0b3IiLCJtaW5TZWxlY3RvciIsIm1heFNlbGVjdG9yIiwic3VtU2VsZWN0b3IiLCJkaXN0aW5jdFNlbGVjdG9yIiwiYWdncmVnYXRvckNoZWNrcyIsIm1ldGFzIiwiZmluZFZpZXdNZXRhZGF0YSIsInZpZXdOYW1lIiwiZ2VuZXJhdGVWaWV3TmFtZSIsImRkb2MiLCJnZW5lcmF0ZURlc2lnbkRvY05hbWUiLCJyZXR1cm5Eb2NzIiwidmlldyIsImdldEZhYnJpY0FkYXB0ZXIiLCJpc1ZpZXdBZ2dyZWdhdGUiLCJoYW5kbGVBdmVyYWdlIiwiZmFicmljQWRhcHRlciIsInZpZXdJbmZvIiwicHJvY2Vzc1ZpZXdSZXNwb25zZSIsInN1bURlc2MiLCJjb3VudERlc2MiLCJzdW1SZXNwb25zZSIsImNvdW50UmVzcG9uc2UiLCJzdW0iLCJyb3dzIiwicm93IiwiRmFicmljQ2xpZW50QWRhcHRlciIsIkFkYXB0ZXIiLCJjaGFpbmNvZGVGb3IiLCJjaGFubmVsRm9yIiwiY29udHJhY3RGb3IiLCJvcGVyYXRpb24iLCJtZXJnZWRGbGFncyIsInNpbGx5IiwibmV3Q3R4IiwicGFyZW50Q29udGV4dCIsImNoaWxkQ29udGV4dHMiLCJjdXJyZW50T3AiLCJjdXJyZW50TW9kZWwiLCJyZXBvc2l0b3J5IiwiY3JlYXRlUHJlZml4IiwidXBkYXRlQWxsUHJlZml4Iiwic2hpZnQiLCJoYXNUcmFuc2llbnQiLCJuZWVkc0Z1bGxQYXlsb2FkIiwic2hvdWxkRm9yY2VHYXRld2F5SHlkcmF0aW9uIiwic2VyaWFsaXplZE1vZGVscyIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIkNSRUFURV9BTEwiLCJnZXRFbmRvcnNpbmdPcmdhbml6YXRpb25zIiwicmVzIiwic2hvdWxkUmVmcmVzaEFmdGVyV3JpdGUiLCJSRUFEX0FMTCIsIlVQREFURV9BTEwiLCJkZWxldGVBbGwiLCJzaG91bGRIeWRyYXRlIiwiREVMRVRFX0FMTCIsIk1FVEFEQVRBIiwibWlycm9yTXNwIiwibXNwcyIsIm1lcmdlZCIsImVuZG9yc2luZ09yZ3MiLCJlbmRvcnNpbmdPcmdhbml6YXRpb25zIiwic2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQiLCJ2IiwiY2hpbGRSZWJ1aWxkIiwiZ2V0RnJvbUNoaWxkcmVuIiwicmVzb2x2ZWRPcCIsInJlc29sdmVPcGVyYXRpb24iLCJoYXNJZCIsImluamVjdFRyYW5zaWVudE92ZXJyaWRlcyIsInRyYW5zaWVudERhdGEiLCJoYXNUcmFuc2llbnREYXRhIiwiaGFzTWVhbmluZ2Z1bFRyYW5zaWVudERhdGEiLCJzaG91bGRJbmplY3QiLCJPVkVSUklERVMiLCJpdGVtIiwiZGlyZWN0IiwiZGVzZXJpYWxpemVkIiwidXBkYXRlUHJlZml4IiwiVVBEQVRFIiwiREVMRVRFIiwiZG9jc09ubHkiLCJ0cmFuc2FjdGlvblJlc3VsdCIsInBhcnNlUmVjb3JkIiwiaXNNb2RlbCIsImVsIiwiZ2V0Q2xpZW50IiwiX2NsaWVudCIsIkdhdGV3YXkiLCJnZXRHYXRld2F5IiwiQ29udHJhY3QiLCJjbGF6ek9yQ29udHJhY3ROYW1lIiwiZ2V0Q29udHJhY3QiLCJ0cmFuc2FjdGlvbiIsImFwaSIsInN1Ym1pdCIsInNob3VsZFVzZUxlZ2FjeUdhdGV3YXkiLCJsZWdhY3lBcmdzIiwicHJlcGFyZUxlZ2FjeUFyZ3MiLCJ0cmFuc2llbnRNYXAiLCJidWlsZExlZ2FjeVRyYW5zaWVudCIsInBlZXJDb25maWdzIiwiYnVpbGRMZWdhY3lQZWVyQ29uZmlncyIsInN1Ym1pdExlZ2FjeVdpdGhFeHBsaWNpdEVuZG9yc2VycyIsImdhdGV3YXkiLCJnZXRDb250cmFjdE5hbWUiLCJldmFsdWF0ZSIsIm5vcm1hbGl6ZWRBcmdzIiwibm9ybWFsaXplVHJhbnNhY3Rpb25Bcmd1bWVudCIsInRyYW5zaWVudEVudHJpZXMiLCJwcm9wb3NhbE9wdGlvbnMiLCJhcmd1bWVudHMiLCJjbG9zZSIsInJlc29sdmVMZWdhY3lNc3BDb3VudCIsImNvbmZpZ3VyZWQiLCJsZWdhY3lNc3BDb3VudCIsImlzRmluaXRlIiwiZmxvb3IiLCJwaWNrTGVnYWN5Q2FuZGlkYXRlcyIsImNhbmRpZGF0ZXMiLCJhdmFpbGFibGUiLCJwaWNrZWQiLCJpZHgiLCJyYW5kb20iLCJzZWxlY3Rpb24iLCJzcGxpY2UiLCJwZWVycyIsInBlZXJFbmRwb2ludCIsInBlZXJIb3N0QWxpYXMiLCJ0bHNDZXJ0IiwiZW5kb3JzZXJzIiwib3JnIiwiZXh0cmFzIiwibXNwTWFwIiwibGVnYWN5Q291bnQiLCJzZWxlY3Rpb25zIiwiY2hvaWNlIiwiZW5kcG9pbnQiLCJmY24iLCJub3JtYWxpemVMZWdhY3lQZWVycyIsImlkZW50aXR5TWF0ZXJpYWwiLCJyZXNvbHZlTGVnYWN5SWRlbnRpdHlNYXRlcmlhbCIsIndhbGxldCIsIldhbGxldHMiLCJuZXdJbk1lbW9yeVdhbGxldCIsImlkZW50aXR5TGFiZWwiLCJjb25uZWN0aW9uUHJvZmlsZSIsImJ1aWxkTGVnYWN5Q29ubmVjdGlvblByb2ZpbGUiLCJMZWdhY3lHYXRld2F5IiwiY29ubmVjdCIsImRpc2NvdmVyeSIsImVuYWJsZWQiLCJhc0xvY2FsaG9zdCIsInNob3VsZFRyZWF0UGVlcnNBc0xvY2FsaG9zdCIsInRsc0luZm8iLCJjaGFpbmNvZGVOYW1lIiwiY29udHJhY3ROYW1lIiwibmV0d29yayIsImdldE5ldHdvcmsiLCJjcmVhdGVUcmFuc2FjdGlvbiIsInNldFRyYW5zaWVudCIsInBlZXIiLCJnZXRDaGFubmVsIiwiZ2V0RW5kb3JzZXIiLCJlbmRvcnNlciIsInNldEVuZG9yc2luZ1BlZXJzIiwiZGlzY29ubmVjdCIsImRlZHVwZWQiLCJNYXAiLCJhZGRQZWVyIiwiaGFzIiwicmVhZFBlbUlucHV0IiwiY2VydENlcnRPckRpcmVjdG9yeVBhdGgiLCJrZXlDZXJ0T3JEaXJlY3RvcnlQYXRoIiwicGVlckVudHJpZXMiLCJjaGFubmVsUGVlcnMiLCJvcmdzIiwidGxzUGVtIiwiaG9zdG5hbWUiLCJleHRyYWN0SG9zdCIsImVuc3VyZUdycGNVcmwiLCJ0bHNDQUNlcnRzIiwiZ3JwY09wdGlvbnMiLCJob3N0bmFtZU92ZXJyaWRlIiwiZW5kb3JzaW5nUGVlciIsImNoYWluY29kZVF1ZXJ5IiwibGVkZ2VyUXVlcnkiLCJldmVudFNvdXJjZSIsIm9yZ2FuaXphdGlvbiIsIm9yZ2FuaXphdGlvbnMiLCJvcmRlcmVycyIsImNoYW5uZWxzIiwiZXZlcnkiLCJpc0xvY2FsRW5kcG9pbnQiLCJob3N0Iiwic2FuaXRpemVkIiwiaXNCdWZmZXIiLCJ0cmltbWVkIiwic3RhdHMiLCJzdGF0IiwiY2F0Y2giLCJpc0RpcmVjdG9yeSIsInJlYWRGc0ZpbGUiLCJlcnIiLCJtaWdyYXRlIiwicmVmZXJlbmNlIiwibGFzdCIsInByb3ZpZGVkQ3R4IiwibWlncmF0aW9uQXJncyIsIk1JR1JBVElPTiIsInNodXRkb3duIiwiY2hhbm5lbE5hbWUiLCJnZXRDb25uZWN0aW9uIiwicGF0aE9yQ2VydCIsInJlYWRGaWxlU3luYyIsInRsc0NyZWRlbnRpYWxzIiwiZ3JwYyIsImNyZWF0ZVNzbCIsInNpemVMaW1pdCIsInNpZ25lciIsImV2YWx1YXRlT3B0aW9ucyIsImRlYWRsaW5lIiwiZW5kb3JzZU9wdGlvbnMiLCJzdWJtaXRPcHRpb25zIiwiY29tbWl0U3RhdHVzT3B0aW9ucyIsIlByb3h5IiwidGhpc0FyZyIsImFyZ0FycmF5IiwiUmVmbGVjdCIsIkRpc3BhdGNoIiwiR2F0ZXdheUVycm9yIiwiZGV0YWlscyIsIkVuZG9yc2VFcnJvciIsIkJhZFJlcXVlc3RFcnJvciIsIlBhZ2luZ0Vycm9yIiwiTWlncmF0aW9uRXJyb3IiLCJPYnNlcnZlckVycm9yIiwiRm9yYmlkZGVuRXJyb3IiLCJDb25uZWN0aW9uRXJyb3IiLCJmaW5hbCIsIkQiLCJfYSIsImRlY29yYXRpb24iLCJzZXRDdXJyZW50IiwiRmFicmljQ2xpZW50RGlzcGF0Y2giLCJsb2dnZWRBcmdzIiwiU0hVVERPV04iLCJsaXN0ZW5pbmdTdGFjayIsInBhcnNlUGF5bG9hZCIsImpzb25CeXRlcyIsImpzb24iLCJvYnNlcnZlIiwib2JzZXJ2ZXIiLCJ1bk9ic2VydmUiLCJyZWZyZXNoIiwiaGFuZGxlRXZlbnRzIiwiY3R4QXJnIiwiY29ycmVsYXRpb25JZCIsImV2dCIsImV2ZW50TmFtZSIsIm1zcEV2ZW50T25seSIsInRhcmdldE1vZGVsIiwibW9kZWxSZWYiLCJvYnNlcnZlckFyZ3MiLCJnZXRDaGFpbmNvZGVFdmVudHMiLCJ0b1dyYXAiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwcm90byIsImdldFByb3RvdHlwZU9mIiwiYnVsa1RvU2luZ2xlIiwicmVzdWx0QXJncyIsIlZFUlNJT04iLCJDT01NSVQiLCJGVUxMX1ZFUlNJT04iLCJQQUNLQUdFX05BTUUiLCJyZWdpc3RlckxpYnJhcnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7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