@napi-rs/cli 3.1.4 → 3.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -155,7 +155,7 @@ const debug$9 = debugFactory("utils");
155
155
  //#endregion
156
156
  //#region package.json
157
157
  var name = "@napi-rs/cli";
158
- var version$1 = "3.1.4";
158
+ var version$1 = "3.1.5";
159
159
  var description = "Cli tools for napi-rs";
160
160
  var author = "LongYinan <lynweklm@gmail.com>";
161
161
  var homepage = "https://github.com/napi-rs/napi-rs";
@@ -3813,10 +3813,19 @@ async function prePublish(userOptions) {
3813
3813
  debug$1.warn(`%s doesn't exist`, dstPath);
3814
3814
  continue;
3815
3815
  }
3816
- if (!options.skipOptionalPublish) execSync(`${npmClient} publish`, {
3817
- cwd: pkgDir,
3818
- env: process.env
3819
- });
3816
+ if (!options.skipOptionalPublish) try {
3817
+ const output = execSync(`${npmClient} publish`, {
3818
+ cwd: pkgDir,
3819
+ env: process.env,
3820
+ stdio: "pipe"
3821
+ });
3822
+ process.stdout.write(output);
3823
+ } catch (e) {
3824
+ if (e instanceof Error && e.message.includes("You cannot publish over the previously published versions")) {
3825
+ console.info(e.message);
3826
+ debug$1.warn(`${pkgDir} has been published, skipping`);
3827
+ } else throw e;
3828
+ }
3820
3829
  if (options.ghRelease && repo && owner) {
3821
3830
  debug$1.info(`Creating GitHub release ${pkgInfo.tag}`);
3822
3831
  try {
@@ -3989,4 +3998,4 @@ cli.register(HelpCommand);
3989
3998
  cli.runExit(process.argv.slice(2));
3990
3999
 
3991
4000
  //#endregion
3992
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwibmFtZXMiOlsiX3R5cGVvZiIsIm8iLCJfdHlwZW9mIiwidG9QcmltaXRpdmUiLCJ0b1Byb3BlcnR5S2V5IiwiX2RlZmluZVByb3BlcnR5Iiwib3B0aW9uczogQXJ0aWZhY3RzT3B0aW9ucyIsIm5hbWVzcGFjZTogc3RyaW5nIiwiZGVidWciLCJwYXRoOiBzdHJpbmciLCJwYXRoIiwicGljayIsIm86IE8iLCJwYXJ0aWFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IiwiZGVidWciLCJwa2dKc29uIiwiVEFSR0VUX0xJTktFUjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsIkNwdVRvTm9kZUFyY2g6IFJlY29yZDxzdHJpbmcsIE5vZGVKU0FyY2g+IiwiU3lzVG9Ob2RlUGxhdGZvcm06IFJlY29yZDxzdHJpbmcsIFBsYXRmb3JtPiIsIlVuaUFyY2hzQnlQbGF0Zm9ybTogUGFydGlhbDxSZWNvcmQ8UGxhdGZvcm0sIE5vZGVKU0FyY2hbXT4+IiwicmF3VHJpcGxlOiBzdHJpbmciLCJjcHU6IHN0cmluZyIsInN5czogc3RyaW5nIiwiYWJpOiBzdHJpbmcgfCBudWxsIiwidGFyZ2V0OiBzdHJpbmciLCJ2OiBzdHJpbmciLCJuYXBpVmVyc2lvbjogTmFwaVZlcnNpb24iLCJ2ZXJzaW9uczogTm9kZVZlcnNpb25bXSIsInJlcXVpcmVtZW50czogc3RyaW5nW10iLCJtYW5pZmVzdFBhdGg6IHN0cmluZyIsInJlc29sdmUiLCJwYXRoOiBzdHJpbmciLCJjb25maWdQYXRoPzogc3RyaW5nIiwicGF0aCIsInNlcGFyYXRlZENvbmZpZzogVXNlck5hcGlDb25maWcgfCB1bmRlZmluZWQiLCJuYXBpQ29uZmlnOiBOYXBpQ29uZmlnIiwidGFyZ2V0czogc3RyaW5nW10iLCJuYW1lOiBzdHJpbmciLCJiaW46IHN0cmluZyIsImJpbiIsImRlYnVnIiwibmFtZSIsImxpbmU6IFR5cGVEZWZMaW5lIiwiY29uc3RFbnVtOiBib29sZWFuIiwiaWRlbnQ6IG51bWJlciIsImFtYmllbnQ6IGJvb2xlYW4iLCJpbnRlcm1lZGlhdGVUeXBlRmlsZTogc3RyaW5nIiwiZXhwb3J0czogc3RyaW5nW10iLCJkZWZzIiwiZXhwb3J0cyIsImZpbGU6IHN0cmluZyIsImRlZnM6IFR5cGVEZWZMaW5lW10iLCJzcmM6IHN0cmluZyIsIm9wdGlvbnM6IE1pbmltYWxOYXBpT3B0aW9ucyIsImRlYnVnIiwidXNlck9wdGlvbnM6IEFydGlmYWN0c09wdGlvbnMiLCJkaXIiLCJyb290OiBzdHJpbmciLCJmaWxlcyIsImxvY2FsTmFtZTogc3RyaW5nIiwicGtnTmFtZTogc3RyaW5nIiwiaWRlbnRzOiBzdHJpbmdbXSIsInBhY2thZ2VWZXJzaW9uPzogc3RyaW5nIiwidHVwbGU6IHN0cmluZyIsIndhc2lGaWxlbmFtZTogc3RyaW5nIiwiZnMiLCJ3YXNtRmlsZU5hbWU6IHN0cmluZyIsInBhY2thZ2VOYW1lOiBzdHJpbmciLCJmczogYm9vbGVhbiIsImZzIiwiZGVidWciLCJyZXF1aXJlIiwicmF3T3B0aW9uczogQnVpbGRPcHRpb25zIiwib3B0aW9uczogUGFyc2VkQnVpbGRPcHRpb25zIiwibWV0YWRhdGE6IENhcmdvV29ya3NwYWNlTWV0YWRhdGEiLCJjcmF0ZTogQ3JhdGUiLCJjb25maWc6IE5hcGlDb25maWciLCJhbGlhczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsInZlcnNpb24iLCJyZXNvbHZlIiwiYWJpOiBzdHJpbmcgfCBudWxsIiwidHlwZURlZlRtcEZvbGRlcjogc3RyaW5nIiwiZXhwb3J0czogc3RyaW5nW10iLCJmaWxlcyIsImV4cG9ydHMiLCJpZGVudHM6IHN0cmluZ1tdIiwibmFtZSIsImRpc3RGaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCIsImVudjogc3RyaW5nIiwidmFsdWU6IHN0cmluZyIsInZhbHVlIiwiZGVidWciLCJvcHRpb25zOiBDcmVhdGVOcG1EaXJzT3B0aW9ucyIsImRlYnVnIiwidXNlck9wdGlvbnM6IENyZWF0ZU5wbURpcnNPcHRpb25zIiwibWtkaXJBc3luYyIsImRpcjogc3RyaW5nIiwicmF3TWtkaXJBc3luYyIsIndyaXRlRmlsZUFzeW5jIiwiZmlsZTogc3RyaW5nIiwiY29udGVudDogc3RyaW5nIiwicmF3V3JpdGVGaWxlQXN5bmMiLCJzY29wZWRQYWNrYWdlSnNvbjogQ29tbW9uUGFja2FnZUpzb25GaWVsZHMiLCJwaWNrIiwicGFyc2UiLCJwYWNrYWdlTmFtZTogc3RyaW5nIiwidGFyZ2V0OiBUYXJnZXQiLCJvcHRpb25zOiBOZXdPcHRpb25zIiwiY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbiIsIl9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyIsIl9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjIiwiX2Fzc2VydENsYXNzQnJhbmQiLCJhc3NlcnRDbGFzc0JyYW5kIiwidmFsdWUiLCJ0eXBlIiwidmFsdWUiLCJ2YWx1ZSIsInRhYmxlIiwicGFyc2UiLCJqb2luIiwibWVyZ2UiLCJmbG9hdCIsInBhaXIiLCJwYXJzZSIsIm9wdGlvbnM6IFJlbmFtZU9wdGlvbnMiLCJ1c2VyT3B0aW9uczogUmVuYW1lT3B0aW9ucyIsInBhcnNlVG9tbCIsInN0cmluZ2lmeVRvbWwiLCJ5YW1sUGFyc2UiLCJ5YW1sU3RyaW5naWZ5IiwiZGVidWciLCJyZXNvbHZlIiwicGFja2FnZU1hbmFnZXI6IFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2VyIiwiY2FjaGVEaXI6IHN0cmluZyIsInNyYzogc3RyaW5nIiwiZGVzdDogc3RyaW5nIiwiaW5jbHVkZVdhc2lCaW5kaW5nczogYm9vbGVhbiIsImZzIiwiZmlsZVBhdGg6IHN0cmluZyIsImVuYWJsZWRUYXJnZXRzOiBzdHJpbmdbXSIsInRhcmdldDogc3RyaW5nIiwieWFtbExvYWQiLCJzZXR0aW5nOiBhbnkiLCJqb2JzVG9SZW1vdmU6IHN0cmluZ1tdIiwibmVlZDogc3RyaW5nIiwieWFtbER1bXAiLCJvcHRpb25zOiBSYXdOZXdPcHRpb25zIiwidXNlck9wdGlvbnM6IFJhd05ld09wdGlvbnMiLCJwYXRoOiBzdHJpbmciLCJzdGF0IiwicGF0aCIsImZpbGVzIiwibmFtZTogc3RyaW5nIiwibmFtZSIsImRlYnVnIiwidGFyZ2V0UGF0aDogc3RyaW5nIiwiZGVmYXVsdE5hbWU6IHN0cmluZyIsInBhdGgiLCJvcHRpb25zOiBQcmVQdWJsaXNoT3B0aW9ucyIsIm9wdGlvbnM6IFZlcnNpb25PcHRpb25zIiwiZGVidWciLCJ1c2VyT3B0aW9uczogVmVyc2lvbk9wdGlvbnMiLCJkZWJ1ZyIsInVzZXJPcHRpb25zOiBQcmVQdWJsaXNoT3B0aW9ucyIsInBhY2thZ2VOYW1lOiBzdHJpbmciLCJ2ZXJzaW9uOiBzdHJpbmciLCJwYWNrYWdlTmFtZSIsInZlcnNpb24iLCJyZXBvIiwib3duZXIiLCJvY3Rva2l0IiwicGtnSW5mbyIsInBrZ0luZm86IFBhY2thZ2VJbmZvIHwgdW5kZWZpbmVkIiwidGFnOiBzdHJpbmciLCJuYW1lIiwibmFtZSIsIm9wdGlvbnM6IFVuaXZlcnNhbGl6ZU9wdGlvbnMiLCJ1bml2ZXJzYWxpemVyczogUGFydGlhbDxcbiAgUmVjb3JkPE5vZGVKUy5QbGF0Zm9ybSwgKGlucHV0czogc3RyaW5nW10sIG91dHB1dDogc3RyaW5nKSA9PiB2b2lkPlxuPiIsInVzZXJPcHRpb25zOiBVbml2ZXJzYWxpemVPcHRpb25zIl0sInNvdXJjZXMiOlsiLi4vLi4vbm9kZV9tb2R1bGVzL0BveGMtcHJvamVjdC9ydW50aW1lL3NyYy9oZWxwZXJzL3R5cGVvZi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9Ab3hjLXByb2plY3QvcnVudGltZS9zcmMvaGVscGVycy90b1ByaW1pdGl2ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9Ab3hjLXByb2plY3QvcnVudGltZS9zcmMvaGVscGVycy90b1Byb3BlcnR5S2V5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BveGMtcHJvamVjdC9ydW50aW1lL3NyYy9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwiLi4vc3JjL2RlZi9hcnRpZmFjdHMudHMiLCIuLi9zcmMvdXRpbHMvbG9nLnRzIiwiLi4vcGFja2FnZS5qc29uIiwiLi4vc3JjL3V0aWxzL21pc2MudHMiLCIuLi9zcmMvdXRpbHMvdGFyZ2V0LnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvbWV0YWRhdGEudHMiLCIuLi9zcmMvdXRpbHMvY29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2NhcmdvLnRzIiwiLi4vc3JjL3V0aWxzL3R5cGVnZW4udHMiLCIuLi9zcmMvdXRpbHMvcmVhZC1jb25maWcudHMiLCIuLi9zcmMvYXBpL2FydGlmYWN0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9hcnRpZmFjdHMudHMiLCIuLi9zcmMvYXBpL3RlbXBsYXRlcy9qcy1iaW5kaW5nLnRzIiwiLi4vc3JjL2FwaS90ZW1wbGF0ZXMvbG9hZC13YXNpLXRlbXBsYXRlLnRzIiwiLi4vc3JjL2FwaS90ZW1wbGF0ZXMvd2FzaS13b3JrZXItdGVtcGxhdGUudHMiLCIuLi9zcmMvYXBpL2J1aWxkLnRzIiwiLi4vc3JjL2RlZi9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC50cyIsIi4uL3NyYy9kZWYvY3JlYXRlLW5wbS1kaXJzLnRzIiwiLi4vc3JjL2FwaS9jcmVhdGUtbnBtLWRpcnMudHMiLCIuLi9zcmMvY29tbWFuZHMvY3JlYXRlLW5wbS1kaXJzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2hlbHAudHMiLCIuLi9zcmMvZGVmL25ldy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9Ab3hjLXByb2plY3QvcnVudGltZS9zcmMvaGVscGVycy9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BveGMtcHJvamVjdC9ydW50aW1lL3NyYy9oZWxwZXJzL2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BveGMtcHJvamVjdC9ydW50aW1lL3NyYy9oZWxwZXJzL2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQG94Yy1wcm9qZWN0L3J1bnRpbWUvc3JjL2hlbHBlcnMvYXNzZXJ0Q2xhc3NCcmFuZC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9Ab3hjLXByb2plY3QvcnVudGltZS9zcmMvaGVscGVycy9jbGFzc1ByaXZhdGVGaWVsZEdldDIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHN0ZC90b21sL3N0cmluZ2lmeS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AanNyL3N0ZF9fY29sbGVjdGlvbnMvX3V0aWxzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bqc3Ivc3RkX19jb2xsZWN0aW9ucy9kZWVwX21lcmdlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BveGMtcHJvamVjdC9ydW50aW1lL3NyYy9oZWxwZXJzL2NsYXNzUHJpdmF0ZUZpZWxkU2V0Mi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9Ac3RkL3RvbWwvX3BhcnNlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9Ac3RkL3RvbWwvcGFyc2UuanMiLCIuLi9zcmMvZGVmL3JlbmFtZS50cyIsIi4uL3NyYy9hcGkvcmVuYW1lLnRzIiwiLi4vc3JjL2FwaS9uZXcudHMiLCIuLi9zcmMvY29tbWFuZHMvbmV3LnRzIiwiLi4vc3JjL2RlZi9wcmUtcHVibGlzaC50cyIsIi4uL3NyYy9kZWYvdmVyc2lvbi50cyIsIi4uL3NyYy9hcGkvdmVyc2lvbi50cyIsIi4uL3NyYy9hcGkvcHJlLXB1Ymxpc2gudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJlLXB1Ymxpc2gudHMiLCIuLi9zcmMvY29tbWFuZHMvcmVuYW1lLnRzIiwiLi4vc3JjL2RlZi91bml2ZXJzYWxpemUudHMiLCIuLi9zcmMvYXBpL3VuaXZlcnNhbGl6ZS50cyIsIi4uL3NyYy9jb21tYW5kcy91bml2ZXJzYWxpemUudHMiLCIuLi9zcmMvY29tbWFuZHMvdmVyc2lvbi50cyIsIi4uL3NyYy9jbGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG87XG4gIH0gOiBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvO1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIF90eXBlb2Yobyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCIuL3R5cGVvZi5qc1wiKVtcImRlZmF1bHRcIl07XG5mdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkge1xuICAgIHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxubW9kdWxlLmV4cG9ydHMgPSB0b1ByaW1pdGl2ZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoXCIuL3RvUHJpbWl0aXZlLmpzXCIpO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHRvUHJvcGVydHlLZXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoXCIuL3RvUHJvcGVydHlLZXkuanNcIik7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkge1xuICByZXR1cm4gKHIgPSB0b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHtcbiAgICB2YWx1ZTogdCxcbiAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIHdyaXRhYmxlOiAhMFxuICB9KSA6IGVbcl0gPSB0LCBlO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUFydGlmYWN0c0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHtcbiAgc3RhdGljIHBhdGhzID0gW1snYXJ0aWZhY3RzJ11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnQ29weSBhcnRpZmFjdHMgZnJvbSBHaXRodWIgQWN0aW9ucyBpbnRvIG5wbSBwYWNrYWdlcyBhbmQgcmVhZHkgdG8gcHVibGlzaCcsXG4gIH0pXG5cbiAgY3dkID0gT3B0aW9uLlN0cmluZygnLS1jd2QnLCBwcm9jZXNzLmN3ZCgpLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoJyxcbiAgfSlcblxuICBjb25maWdQYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1jb25maWctcGF0aCwtYycsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGUnLFxuICB9KVxuXG4gIHBhY2thZ2VKc29uUGF0aCA9IE9wdGlvbi5TdHJpbmcoJy0tcGFja2FnZS1qc29uLXBhdGgnLCAncGFja2FnZS5qc29uJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgcGFja2FnZS5qc29uYCcsXG4gIH0pXG5cbiAgb3V0cHV0RGlyID0gT3B0aW9uLlN0cmluZygnLS1vdXRwdXQtZGlyLC1vLC1kJywgJy4vYXJ0aWZhY3RzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGggdG8gdGhlIGZvbGRlciB3aGVyZSBhbGwgYnVpbHQgYC5ub2RlYCBmaWxlcyBwdXQsIHNhbWUgYXMgYC0tb3V0cHV0LWRpcmAgb2YgYnVpbGQgY29tbWFuZCcsXG4gIH0pXG5cbiAgbnBtRGlyID0gT3B0aW9uLlN0cmluZygnLS1ucG0tZGlyJywgJ25wbScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gdGhlIGZvbGRlciB3aGVyZSB0aGUgbnBtIHBhY2thZ2VzIHB1dCcsXG4gIH0pXG5cbiAgYnVpbGRPdXRwdXREaXI/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWJ1aWxkLW91dHB1dC1kaXInLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGF0aCB0byB0aGUgYnVpbGQgb3V0cHV0IGRpciwgb25seSBuZWVkZWQgd2hlbiB0YXJnZXRzIGNvbnRhaW5zIGB3YXNtMzItd2FzaS0qYCcsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgIGNvbmZpZ1BhdGg6IHRoaXMuY29uZmlnUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uUGF0aDogdGhpcy5wYWNrYWdlSnNvblBhdGgsXG4gICAgICBvdXRwdXREaXI6IHRoaXMub3V0cHV0RGlyLFxuICAgICAgbnBtRGlyOiB0aGlzLm5wbURpcixcbiAgICAgIGJ1aWxkT3V0cHV0RGlyOiB0aGlzLmJ1aWxkT3V0cHV0RGlyLFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvcHkgYXJ0aWZhY3RzIGZyb20gR2l0aHViIEFjdGlvbnMgaW50byBucG0gcGFja2FnZXMgYW5kIHJlYWR5IHRvIHB1Ymxpc2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcnRpZmFjdHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aFxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9jZXNzLmN3ZCgpXG4gICAqL1xuICBjd2Q/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGVcbiAgICovXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYHBhY2thZ2UuanNvbmBcbiAgICpcbiAgICogQGRlZmF1bHQgJ3BhY2thZ2UuanNvbidcbiAgICovXG4gIHBhY2thZ2VKc29uUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIGFsbCBidWlsdCBgLm5vZGVgIGZpbGVzIHB1dCwgc2FtZSBhcyBgLS1vdXRwdXQtZGlyYCBvZiBidWlsZCBjb21tYW5kXG4gICAqXG4gICAqIEBkZWZhdWx0ICcuL2FydGlmYWN0cydcbiAgICovXG4gIG91dHB1dERpcj86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0XG4gICAqXG4gICAqIEBkZWZhdWx0ICducG0nXG4gICAqL1xuICBucG1EaXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIGJ1aWxkIG91dHB1dCBkaXIsIG9ubHkgbmVlZGVkIHdoZW4gdGFyZ2V0cyBjb250YWlucyBgd2FzbTMyLXdhc2ktKmBcbiAgICovXG4gIGJ1aWxkT3V0cHV0RGlyPzogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRBcnRpZmFjdHNPcHRpb25zKG9wdGlvbnM6IEFydGlmYWN0c09wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgcGFja2FnZUpzb25QYXRoOiAncGFja2FnZS5qc29uJyxcbiAgICBvdXRwdXREaXI6ICcuL2FydGlmYWN0cycsXG4gICAgbnBtRGlyOiAnbnBtJyxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBjb2xvcnMgZnJvbSAnY29sb3JldHRlJ1xuaW1wb3J0IHJhd0RlYnVnIGZyb20gJ2RlYnVnJ1xuXG4vLyBkZWJ1ZygnJWknLCAnVGhpcyBpcyBhbiBpbmZvJylcbnJhd0RlYnVnLmZvcm1hdHRlcnMuaSA9ICh2KSA9PiB7XG4gIHJldHVybiBjb2xvcnMuZ3JlZW4odilcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ2RlYnVnJyB7XG4gIGludGVyZmFjZSBEZWJ1Z2dlciB7XG4gICAgaW5mbzogdHlwZW9mIGNvbnNvbGUuZXJyb3JcbiAgICB3YXJuOiB0eXBlb2YgY29uc29sZS5lcnJvclxuICAgIGVycm9yOiB0eXBlb2YgY29uc29sZS5lcnJvclxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWJ1Z0ZhY3RvcnkgPSAobmFtZXNwYWNlOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgZGVidWcgPSByYXdEZWJ1ZyhgbmFwaToke25hbWVzcGFjZX1gKVxuXG4gIGRlYnVnLmluZm8gPSAoLi4uYXJnczogYW55W10pID0+XG4gICAgY29uc29sZS5lcnJvcihjb2xvcnMuYmxhY2soY29sb3JzLmJnR3JlZW4oJyBJTkZPICcpKSwgLi4uYXJncylcbiAgZGVidWcud2FybiA9ICguLi5hcmdzOiBhbnlbXSkgPT5cbiAgICBjb25zb2xlLmVycm9yKGNvbG9ycy5ibGFjayhjb2xvcnMuYmdZZWxsb3coJyBXQVJOSU5HICcpKSwgLi4uYXJncylcbiAgZGVidWcuZXJyb3IgPSAoLi4uYXJnczogYW55W10pID0+XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNvbG9ycy53aGl0ZShjb2xvcnMuYmdSZWQoJyBFUlJPUiAnKSksXG4gICAgICAuLi5hcmdzLm1hcCgoYXJnKSA9PlxuICAgICAgICBhcmcgaW5zdGFuY2VvZiBFcnJvciA/IChhcmcuc3RhY2sgPz8gYXJnLm1lc3NhZ2UpIDogYXJnLFxuICAgICAgKSxcbiAgICApXG5cbiAgcmV0dXJuIGRlYnVnXG59XG5leHBvcnQgY29uc3QgZGVidWcgPSBkZWJ1Z0ZhY3RvcnkoJ3V0aWxzJylcbiIsIntcbiAgXCJuYW1lXCI6IFwiQG5hcGktcnMvY2xpXCIsXG4gIFwidmVyc2lvblwiOiBcIjMuMS40XCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJDbGkgdG9vbHMgZm9yIG5hcGktcnNcIixcbiAgXCJhdXRob3JcIjogXCJMb25nWWluYW4gPGx5bndla2xtQGdtYWlsLmNvbT5cIixcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9uYXBpLXJzL25hcGktcnNcIixcbiAgXCJsaWNlbnNlXCI6IFwiTUlUXCIsXG4gIFwidHlwZVwiOiBcIm1vZHVsZVwiLFxuICBcImVuZ2luZXNcIjoge1xuICAgIFwibm9kZVwiOiBcIj49IDE2XCJcbiAgfSxcbiAgXCJiaW5cIjoge1xuICAgIFwibmFwaVwiOiBcIi4vZGlzdC9jbGkuanNcIixcbiAgICBcIm5hcGktcmF3XCI6IFwiLi9jbGkubWpzXCJcbiAgfSxcbiAgXCJtYWluXCI6IFwiLi9kaXN0L2luZGV4LmNqc1wiLFxuICBcIm1vZHVsZVwiOiBcIi4vZGlzdC9pbmRleC5qc1wiLFxuICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgXCJleHBvcnRzXCI6IHtcbiAgICBcIi5cIjoge1xuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9pbmRleC5janNcIlxuICAgIH0sXG4gICAgXCIuL3BhY2thZ2UuanNvblwiOiBcIi4vcGFja2FnZS5qc29uXCJcbiAgfSxcbiAgXCJmaWxlc1wiOiBbXG4gICAgXCJkaXN0XCIsXG4gICAgXCJzcmNcIlxuICBdLFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImNsaVwiLFxuICAgIFwicnVzdFwiLFxuICAgIFwibmFwaVwiLFxuICAgIFwibi1hcGlcIixcbiAgICBcIm5vZGUtYXBpXCIsXG4gICAgXCJub2RlLWFkZG9uXCIsXG4gICAgXCJuZW9uXCJcbiAgXSxcbiAgXCJtYWludGFpbmVyc1wiOiBbXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiTG9uZ1lpbmFuXCIsXG4gICAgICBcImVtYWlsXCI6IFwibHlud2VrbG1AZ21haWwuY29tXCIsXG4gICAgICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL0Jyb29vb29va2x5blwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJmb3JlaGFsb1wiLFxuICAgICAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9mb3JlaGFsb1wiXG4gICAgfVxuICBdLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9uYXBpLXJzL25hcGktcnMuZ2l0XCJcbiAgfSxcbiAgXCJwdWJsaXNoQ29uZmlnXCI6IHtcbiAgICBcInJlZ2lzdHJ5XCI6IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvXCIsXG4gICAgXCJhY2Nlc3NcIjogXCJwdWJsaWNcIlxuICB9LFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL25hcGktcnMvbmFwaS1ycy9pc3N1ZXNcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAaW5xdWlyZXIvcHJvbXB0c1wiOiBcIl43LjQuMFwiLFxuICAgIFwiQG5hcGktcnMvY3Jvc3MtdG9vbGNoYWluXCI6IFwiXjEuMC4wXCIsXG4gICAgXCJAbmFwaS1ycy93YXNtLXRvb2xzXCI6IFwiXjEuMC4wXCIsXG4gICAgXCJAb2N0b2tpdC9yZXN0XCI6IFwiXjIyLjAuMFwiLFxuICAgIFwiY2xpcGFuaW9uXCI6IFwiXjQuMC4wLXJjLjRcIixcbiAgICBcImNvbG9yZXR0ZVwiOiBcIl4yLjAuMjBcIixcbiAgICBcImRlYnVnXCI6IFwiXjQuNC4wXCIsXG4gICAgXCJlbW5hcGlcIjogXCJeMS40LjBcIixcbiAgICBcImVzLXRvb2xraXRcIjogXCJeMS4zOS44XCIsXG4gICAgXCJmaW5kLXVwXCI6IFwiXjcuMC4wXCIsXG4gICAgXCJqcy15YW1sXCI6IFwiXjQuMS4wXCIsXG4gICAgXCJzZW12ZXJcIjogXCJeNy43LjFcIixcbiAgICBcInR5cGFuaW9uXCI6IFwiXjMuMTQuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBlbW5hcGkvY29yZVwiOiBcIl4xLjQuMFwiLFxuICAgIFwiQGVtbmFwaS9ydW50aW1lXCI6IFwiXjEuNC4wXCIsXG4gICAgXCJAb3hjLW5vZGUvY29yZVwiOiBcIl4wLjAuMzJcIixcbiAgICBcIkBzdGQvdG9tbFwiOiBcIm5wbTpAanNyL3N0ZF9fdG9tbEBeMS4wLjhcIixcbiAgICBcIkB0eXBlcy9kZWJ1Z1wiOiBcIl40LjEuMTJcIixcbiAgICBcIkB0eXBlcy9pbnF1aXJlclwiOiBcIl45LjAuN1wiLFxuICAgIFwiQHR5cGVzL2pzLXlhbWxcIjogXCJeNC4wLjlcIixcbiAgICBcIkB0eXBlcy9ub2RlXCI6IFwiXjIyLjEzLjE2XCIsXG4gICAgXCJAdHlwZXMvc2VtdmVyXCI6IFwiXjcuNy4wXCIsXG4gICAgXCJhdmFcIjogXCJeNi4yLjBcIixcbiAgICBcImVudi1wYXRoc1wiOiBcIl4zLjAuMFwiLFxuICAgIFwicHJldHRpZXJcIjogXCJeMy41LjNcIixcbiAgICBcInRzZG93blwiOiBcIl4wLjE0LjBcIixcbiAgICBcInRzbGliXCI6IFwiXjIuOC4xXCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuOC4yXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBlbW5hcGkvcnVudGltZVwiOiBcIl4xLjEuMFwiLFxuICAgIFwiZW1uYXBpXCI6IFwiXjEuMS4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzTWV0YVwiOiB7XG4gICAgXCJAZW1uYXBpL3J1bnRpbWVcIjoge1xuICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgfSxcbiAgICBcImVtbmFwaVwiOiB7XG4gICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICB9XG4gIH0sXG4gIFwiZnVuZGluZ1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0aHViXCIsXG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvQnJvb29vb29rbHluXCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcImNvZGVnZW5cIjogXCJub2RlIC0taW1wb3J0IEBveGMtbm9kZS9jb3JlL3JlZ2lzdGVyIC4vY29kZWdlbi9pbmRleC50c1wiLFxuICAgIFwiYnVpbGRcIjogXCJ0c2Rvd25cIixcbiAgICBcInRlc3RcIjogXCJub2RlIC0taW1wb3J0IEBveGMtbm9kZS9jb3JlL3JlZ2lzdGVyIC4uL25vZGVfbW9kdWxlcy9hdmEvZW50cnlwb2ludHMvY2xpLm1qc1wiXG4gIH0sXG4gIFwiYXZhXCI6IHtcbiAgICBcImV4dGVuc2lvbnNcIjoge1xuICAgICAgXCJ0c1wiOiBcIm1vZHVsZVwiXG4gICAgfSxcbiAgICBcInRpbWVvdXRcIjogXCIxbVwiLFxuICAgIFwiZmlsZXNcIjogW1xuICAgICAgXCIqKi9fX3Rlc3RzX18vKiovKi5zcGVjLnRzXCIsXG4gICAgICBcImUyZS8qKi8qLnNwZWMudHNcIlxuICAgIF1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZSxcbiAgY29weUZpbGUsXG4gIG1rZGlyLFxuICB1bmxpbmssXG4gIHN0YXQsXG4gIHJlYWRkaXIsXG59IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5cbmltcG9ydCBwa2dKc29uIGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbicgd2l0aCB7IHR5cGU6ICdqc29uJyB9XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4vbG9nLmpzJ1xuXG5leHBvcnQgY29uc3QgcmVhZEZpbGVBc3luYyA9IHByb21pc2lmeShyZWFkRmlsZSlcbmV4cG9ydCBjb25zdCB3cml0ZUZpbGVBc3luYyA9IHByb21pc2lmeSh3cml0ZUZpbGUpXG5leHBvcnQgY29uc3QgdW5saW5rQXN5bmMgPSBwcm9taXNpZnkodW5saW5rKVxuZXhwb3J0IGNvbnN0IGNvcHlGaWxlQXN5bmMgPSBwcm9taXNpZnkoY29weUZpbGUpXG5leHBvcnQgY29uc3QgbWtkaXJBc3luYyA9IHByb21pc2lmeShta2RpcilcbmV4cG9ydCBjb25zdCBzdGF0QXN5bmMgPSBwcm9taXNpZnkoc3RhdClcbmV4cG9ydCBjb25zdCByZWFkZGlyQXN5bmMgPSBwcm9taXNpZnkocmVhZGRpcilcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbGVFeGlzdHMocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHN0YXRBc3luYyhwYXRoKVxuICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgLmNhdGNoKCgpID0+IGZhbHNlKVxuICByZXR1cm4gZXhpc3RzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXJFeGlzdHNBc3luYyhwYXRoOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHN0YXRBc3luYyhwYXRoKVxuICAgIHJldHVybiBzdGF0cy5pc0RpcmVjdG9yeSgpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrPE8sIEsgZXh0ZW5kcyBrZXlvZiBPPihvOiBPLCAuLi5rZXlzOiBLW10pOiBQaWNrPE8sIEs+IHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgIGFjY1trZXldID0gb1trZXldXG4gICAgcmV0dXJuIGFjY1xuICB9LCB7fSBhcyBPKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUGFja2FnZUpzb24oXG4gIHBhdGg6IHN0cmluZyxcbiAgcGFydGlhbDogUmVjb3JkPHN0cmluZywgYW55Pixcbikge1xuICBjb25zdCBleGlzdHMgPSBhd2FpdCBmaWxlRXhpc3RzKHBhdGgpXG4gIGlmICghZXhpc3RzKSB7XG4gICAgZGVidWcoYEZpbGUgbm90IGV4aXN0cyAke3BhdGh9YClcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBvbGQgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlQXN5bmMocGF0aCwgJ3V0ZjgnKSlcbiAgYXdhaXQgd3JpdGVGaWxlQXN5bmMocGF0aCwgSlNPTi5zdHJpbmdpZnkoeyAuLi5vbGQsIC4uLnBhcnRpYWwgfSwgbnVsbCwgMikpXG59XG5cbmV4cG9ydCBjb25zdCBDTElfVkVSU0lPTiA9IHBrZ0pzb24udmVyc2lvblxuIiwiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5cbmV4cG9ydCB0eXBlIFBsYXRmb3JtID0gTm9kZUpTLlBsYXRmb3JtIHwgJ3dhc20nIHwgJ3dhc2knIHwgJ29wZW5oYXJtb255J1xuXG5leHBvcnQgY29uc3QgVU5JVkVSU0FMX1RBUkdFVFMgPSB7XG4gICd1bml2ZXJzYWwtYXBwbGUtZGFyd2luJzogWydhYXJjaDY0LWFwcGxlLWRhcndpbicsICd4ODZfNjQtYXBwbGUtZGFyd2luJ10sXG59IGFzIGNvbnN0XG5cbmNvbnN0IFNVQl9TWVNURU1TID0gbmV3IFNldChbJ2FuZHJvaWQnLCAnb2hvcyddKVxuXG5leHBvcnQgY29uc3QgQVZBSUxBQkxFX1RBUkdFVFMgPSBbXG4gICdhYXJjaDY0LWFwcGxlLWRhcndpbicsXG4gICdhYXJjaDY0LWxpbnV4LWFuZHJvaWQnLFxuICAnYWFyY2g2NC11bmtub3duLWxpbnV4LWdudScsXG4gICdhYXJjaDY0LXVua25vd24tbGludXgtbXVzbCcsXG4gICdhYXJjaDY0LXVua25vd24tbGludXgtb2hvcycsXG4gICdhYXJjaDY0LXBjLXdpbmRvd3MtbXN2YycsXG4gICd4ODZfNjQtYXBwbGUtZGFyd2luJyxcbiAgJ3g4Nl82NC1wYy13aW5kb3dzLW1zdmMnLFxuICAneDg2XzY0LXVua25vd24tbGludXgtZ251JyxcbiAgJ3g4Nl82NC11bmtub3duLWxpbnV4LW11c2wnLFxuICAneDg2XzY0LXVua25vd24tbGludXgtb2hvcycsXG4gICd4ODZfNjQtdW5rbm93bi1mcmVlYnNkJyxcbiAgJ2k2ODYtcGMtd2luZG93cy1tc3ZjJyxcbiAgJ2FybXY3LXVua25vd24tbGludXgtZ251ZWFiaWhmJyxcbiAgJ2FybXY3LXVua25vd24tbGludXgtbXVzbGVhYmloZicsXG4gICdhcm12Ny1saW51eC1hbmRyb2lkZWFiaScsXG4gICd1bml2ZXJzYWwtYXBwbGUtZGFyd2luJyxcbiAgJ3Jpc2N2NjRnYy11bmtub3duLWxpbnV4LWdudScsXG4gICdwb3dlcnBjNjRsZS11bmtub3duLWxpbnV4LWdudScsXG4gICdzMzkweC11bmtub3duLWxpbnV4LWdudScsXG4gICd3YXNtMzItd2FzaS1wcmV2aWV3MS10aHJlYWRzJyxcbiAgJ3dhc20zMi13YXNpcDEtdGhyZWFkcycsXG5dIGFzIGNvbnN0XG5cbmV4cG9ydCB0eXBlIFRhcmdldFRyaXBsZSA9ICh0eXBlb2YgQVZBSUxBQkxFX1RBUkdFVFMpW251bWJlcl1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVEFSR0VUUyA9IFtcbiAgJ3g4Nl82NC1hcHBsZS1kYXJ3aW4nLFxuICAnYWFyY2g2NC1hcHBsZS1kYXJ3aW4nLFxuICAneDg2XzY0LXBjLXdpbmRvd3MtbXN2YycsXG4gICd4ODZfNjQtdW5rbm93bi1saW51eC1nbnUnLFxuXSBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgVEFSR0VUX0xJTktFUjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2FhcmNoNjQtdW5rbm93bi1saW51eC1tdXNsJzogJ2FhcmNoNjQtbGludXgtbXVzbC1nY2MnLFxuICAncmlzY3Y2NGdjLXVua25vd24tbGludXgtZ251JzogJ3Jpc2N2NjQtbGludXgtZ251LWdjYycsXG4gICdwb3dlcnBjNjRsZS11bmtub3duLWxpbnV4LWdudSc6ICdwb3dlcnBjNjRsZS1saW51eC1nbnUtZ2NjJyxcbiAgJ3MzOTB4LXVua25vd24tbGludXgtZ251JzogJ3MzOTB4LWxpbnV4LWdudS1nY2MnLFxufVxuXG4vLyBodHRwczovL25vZGVqcy5vcmcvYXBpL3Byb2Nlc3MuaHRtbCNwcm9jZXNzX3Byb2Nlc3NfYXJjaFxudHlwZSBOb2RlSlNBcmNoID1cbiAgfCAnYXJtJ1xuICB8ICdhcm02NCdcbiAgfCAnaWEzMidcbiAgfCAnbWlwcydcbiAgfCAnbWlwc2VsJ1xuICB8ICdwcGMnXG4gIHwgJ3BwYzY0J1xuICB8ICdyaXNjdjY0J1xuICB8ICdzMzkwJ1xuICB8ICdzMzkweCdcbiAgfCAneDMyJ1xuICB8ICd4NjQnXG4gIHwgJ3VuaXZlcnNhbCdcbiAgfCAnd2FzbTMyJ1xuXG5jb25zdCBDcHVUb05vZGVBcmNoOiBSZWNvcmQ8c3RyaW5nLCBOb2RlSlNBcmNoPiA9IHtcbiAgeDg2XzY0OiAneDY0JyxcbiAgYWFyY2g2NDogJ2FybTY0JyxcbiAgaTY4NjogJ2lhMzInLFxuICBhcm12NzogJ2FybScsXG4gIHJpc2N2NjRnYzogJ3Jpc2N2NjQnLFxuICBwb3dlcnBjNjRsZTogJ3BwYzY0Jyxcbn1cblxuZXhwb3J0IGNvbnN0IE5vZGVBcmNoVG9DcHU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIHg2NDogJ3g4Nl82NCcsXG4gIGFybTY0OiAnYWFyY2g2NCcsXG4gIGlhMzI6ICdpNjg2JyxcbiAgYXJtOiAnYXJtdjcnLFxuICByaXNjdjY0OiAncmlzY3Y2NGdjJyxcbiAgcHBjNjQ6ICdwb3dlcnBjNjRsZScsXG59XG5cbmNvbnN0IFN5c1RvTm9kZVBsYXRmb3JtOiBSZWNvcmQ8c3RyaW5nLCBQbGF0Zm9ybT4gPSB7XG4gIGxpbnV4OiAnbGludXgnLFxuICBmcmVlYnNkOiAnZnJlZWJzZCcsXG4gIGRhcndpbjogJ2RhcndpbicsXG4gIHdpbmRvd3M6ICd3aW4zMicsXG4gIG9ob3M6ICdvcGVuaGFybW9ueScsXG59XG5cbmV4cG9ydCBjb25zdCBVbmlBcmNoc0J5UGxhdGZvcm06IFBhcnRpYWw8UmVjb3JkPFBsYXRmb3JtLCBOb2RlSlNBcmNoW10+PiA9IHtcbiAgZGFyd2luOiBbJ3g2NCcsICdhcm02NCddLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldCB7XG4gIHRyaXBsZTogc3RyaW5nXG4gIHBsYXRmb3JtQXJjaEFCSTogc3RyaW5nXG4gIHBsYXRmb3JtOiBQbGF0Zm9ybVxuICBhcmNoOiBOb2RlSlNBcmNoXG4gIGFiaTogc3RyaW5nIHwgbnVsbFxufVxuXG4vKipcbiAqIEEgdHJpcGxlIGlzIGEgc3BlY2lmaWMgZm9ybWF0IGZvciBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cbiAqIFRyaXBsZXMgbWF5IGJlIHJlZmVycmVkIHRvIGFzIGEgdGFyZ2V0IHRyaXBsZSB3aGljaCBpcyB0aGUgYXJjaGl0ZWN0dXJlIGZvciB0aGUgYXJ0aWZhY3QgcHJvZHVjZWQsIGFuZCB0aGUgaG9zdCB0cmlwbGUgd2hpY2ggaXMgdGhlIGFyY2hpdGVjdHVyZSB0aGF0IHRoZSBjb21waWxlciBpcyBydW5uaW5nIG9uLlxuICogVGhlIGdlbmVyYWwgZm9ybWF0IG9mIHRoZSB0cmlwbGUgaXMgYDxhcmNoPjxzdWI+LTx2ZW5kb3I+LTxzeXM+LTxhYmk+YCB3aGVyZTpcbiAqICAgLSBgYXJjaGAgPSBUaGUgYmFzZSBDUFUgYXJjaGl0ZWN0dXJlLCBmb3IgZXhhbXBsZSBgeDg2XzY0YCwgYGk2ODZgLCBgYXJtYCwgYHRodW1iYCwgYG1pcHNgLCBldGMuXG4gKiAgIC0gYHN1YmAgPSBUaGUgQ1BVIHN1Yi1hcmNoaXRlY3R1cmUsIGZvciBleGFtcGxlIGBhcm1gIGhhcyBgdjdgLCBgdjdzYCwgYHY1dGVgLCBldGMuXG4gKiAgIC0gYHZlbmRvcmAgPSBUaGUgdmVuZG9yLCBmb3IgZXhhbXBsZSBgdW5rbm93bmAsIGBhcHBsZWAsIGBwY2AsIGBudmlkaWFgLCBldGMuXG4gKiAgIC0gYHN5c2AgPSBUaGUgc3lzdGVtIG5hbWUsIGZvciBleGFtcGxlIGBsaW51eGAsIGB3aW5kb3dzYCwgYGRhcndpbmAsIGV0Yy4gbm9uZSBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgYmFyZS1tZXRhbCB3aXRob3V0IGFuIE9TLlxuICogICAtIGBhYmlgID0gVGhlIEFCSSwgZm9yIGV4YW1wbGUgYGdudWAsIGBhbmRyb2lkYCwgYGVhYmlgLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRyaXBsZShyYXdUcmlwbGU6IHN0cmluZyk6IFRhcmdldCB7XG4gIGlmIChcbiAgICByYXdUcmlwbGUgPT09ICd3YXNtMzItd2FzaScgfHxcbiAgICByYXdUcmlwbGUgPT09ICd3YXNtMzItd2FzaS1wcmV2aWV3MS10aHJlYWRzJyB8fFxuICAgIHJhd1RyaXBsZS5zdGFydHNXaXRoKCd3YXNtMzItd2FzaXAnKVxuICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJpcGxlOiByYXdUcmlwbGUsXG4gICAgICBwbGF0Zm9ybUFyY2hBQkk6ICd3YXNtMzItd2FzaScsXG4gICAgICBwbGF0Zm9ybTogJ3dhc2knLFxuICAgICAgYXJjaDogJ3dhc20zMicsXG4gICAgICBhYmk6ICd3YXNpJyxcbiAgICB9XG4gIH1cbiAgY29uc3QgdHJpcGxlID0gcmF3VHJpcGxlLmVuZHNXaXRoKCdlYWJpJylcbiAgICA/IGAke3Jhd1RyaXBsZS5zbGljZSgwLCAtNCl9LWVhYmlgXG4gICAgOiByYXdUcmlwbGVcbiAgY29uc3QgdHJpcGxlcyA9IHRyaXBsZS5zcGxpdCgnLScpXG4gIGxldCBjcHU6IHN0cmluZ1xuICBsZXQgc3lzOiBzdHJpbmdcbiAgbGV0IGFiaTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgaWYgKHRyaXBsZXMubGVuZ3RoID09PSAyKSB7XG4gICAgLy8gYWFyY2g2NC1mdWNoc2lhXG4gICAgLy8gXiBjcHUgICBeIHN5c1xuICAgIDtbY3B1LCBzeXNdID0gdHJpcGxlc1xuICB9IGVsc2Uge1xuICAgIC8vIGFhcmNoNjQtdW5rbm93bi1saW51eC1tdXNsXG4gICAgLy8gXiBjcHUgICBedmVuZG9yIF4gc3lzIF4gYWJpXG4gICAgLy8gYWFyY2g2NC1hcHBsZS1kYXJ3aW5cbiAgICAvLyBeIGNwdSAgICAgICAgIF4gc3lzICAoYWJpIGlzIE5vbmUpXG4gICAgO1tjcHUsICwgc3lzLCBhYmkgPSBudWxsXSA9IHRyaXBsZXNcbiAgfVxuXG4gIGlmIChhYmkgJiYgU1VCX1NZU1RFTVMuaGFzKGFiaSkpIHtcbiAgICBzeXMgPSBhYmlcbiAgICBhYmkgPSBudWxsXG4gIH1cbiAgY29uc3QgcGxhdGZvcm0gPSBTeXNUb05vZGVQbGF0Zm9ybVtzeXNdID8/IChzeXMgYXMgUGxhdGZvcm0pXG4gIGNvbnN0IGFyY2ggPSBDcHVUb05vZGVBcmNoW2NwdV0gPz8gKGNwdSBhcyBOb2RlSlNBcmNoKVxuXG4gIHJldHVybiB7XG4gICAgdHJpcGxlOiByYXdUcmlwbGUsXG4gICAgcGxhdGZvcm1BcmNoQUJJOiBhYmkgPyBgJHtwbGF0Zm9ybX0tJHthcmNofS0ke2FiaX1gIDogYCR7cGxhdGZvcm19LSR7YXJjaH1gLFxuICAgIHBsYXRmb3JtLFxuICAgIGFyY2gsXG4gICAgYWJpLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTeXN0ZW1EZWZhdWx0VGFyZ2V0KCk6IFRhcmdldCB7XG4gIGNvbnN0IGhvc3QgPSBleGVjU3luYyhgcnVzdGMgLXZWYCwge1xuICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gIH0pXG4gICAgLnRvU3RyaW5nKCd1dGY4JylcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLmZpbmQoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aCgnaG9zdDogJykpXG4gIGNvbnN0IHRyaXBsZSA9IGhvc3Q/LnNsaWNlKCdob3N0OiAnLmxlbmd0aClcbiAgaWYgKCF0cmlwbGUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW4gbm90IHBhcnNlIHRhcmdldCB0cmlwbGUgZnJvbSBob3N0YClcbiAgfVxuICByZXR1cm4gcGFyc2VUcmlwbGUodHJpcGxlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0TGlua2VyKHRhcmdldDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFRBUkdFVF9MSU5LRVJbdGFyZ2V0XVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFyZ2V0VG9FbnZWYXIodGFyZ2V0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGFyZ2V0LnJlcGxhY2UoLy0vZywgJ18nKS50b1VwcGVyQ2FzZSgpXG59XG4iLCJleHBvcnQgZW51bSBOYXBpVmVyc2lvbiB7XG4gIE5hcGkxID0gMSxcbiAgTmFwaTIsXG4gIE5hcGkzLFxuICBOYXBpNCxcbiAgTmFwaTUsXG4gIE5hcGk2LFxuICBOYXBpNyxcbiAgTmFwaTgsXG4gIE5hcGk5LFxufVxuXG4vLy8gYmVjYXVzZSBub2RlIHN1cHBvcnQgbmV3IG5hcGkgdmVyc2lvbiBpbiBzb21lIG1pbm9yIHZlcnNpb24gdXBkYXRlcywgc28gd2UgbWlnaHQgbWVldCBzdWNoIHNpdHVhdGlvbjpcbi8vLyBgbm9kZSB2MTAuMjAuMGAgc3VwcG9ydHMgYG5hcGk1YCBhbmQgYG5hcGk2YCwgYnV0IGBub2RlIHYxMi4wLjBgIG9ubHkgc3VwcG9ydCBgbmFwaTRgLFxuLy8vIGJ5IHdoaWNoLCB3ZSBjYW4gbm90IHRlbGwgZGlyZWN0bHkgbmFwaSB2ZXJzaW9uIHN1cHBvcnRsZXNzIGZyb20gbm9kZSB2ZXJzaW9uIGRpcmVjdGx5LlxuY29uc3QgTkFQSV9WRVJTSU9OX01BVFJJWCA9IG5ldyBNYXA8TmFwaVZlcnNpb24sIHN0cmluZz4oW1xuICBbTmFwaVZlcnNpb24uTmFwaTEsICc4LjYuMCB8IDkuMC4wIHwgMTAuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpMiwgJzguMTAuMCB8IDkuMy4wIHwgMTAuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpMywgJzYuMTQuMiB8IDguMTEuMiB8IDkuMTEuMCB8IDEwLjAuMCddLFxuICBbTmFwaVZlcnNpb24uTmFwaTQsICcxMC4xNi4wIHwgMTEuOC4wIHwgMTIuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpNSwgJzEwLjE3LjAgfCAxMi4xMS4wIHwgMTMuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpNiwgJzEwLjIwLjAgfCAxMi4xNy4wIHwgMTQuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpNywgJzEwLjIzLjAgfCAxMi4xOS4wIHwgMTQuMTIuMCB8IDE1LjAuMCddLFxuICBbTmFwaVZlcnNpb24uTmFwaTgsICcxMi4yMi4wIHwgMTQuMTcuMCB8IDE1LjEyLjAgfCAxNi4wLjAnXSxcbiAgW05hcGlWZXJzaW9uLk5hcGk5LCAnMTguMTcuMCB8IDIwLjMuMCB8IDIxLjEuMCddLFxuXSlcblxuaW50ZXJmYWNlIE5vZGVWZXJzaW9uIHtcbiAgbWFqb3I6IG51bWJlclxuICBtaW5vcjogbnVtYmVyXG4gIHBhdGNoOiBudW1iZXJcbn1cblxuZnVuY3Rpb24gcGFyc2VOb2RlVmVyc2lvbih2OiBzdHJpbmcpOiBOb2RlVmVyc2lvbiB7XG4gIGNvbnN0IG1hdGNoZXMgPSB2Lm1hdGNoKC92PyhbMC05XSspXFwuKFswLTldKylcXC4oWzAtOV0rKS9pKVxuXG4gIGlmICghbWF0Y2hlcykge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBub2RlIHZlcnNpb24gbnVtYmVyOiAnICsgdilcbiAgfVxuXG4gIGNvbnN0IFssIG1ham9yLCBtaW5vciwgcGF0Y2hdID0gbWF0Y2hlc1xuXG4gIHJldHVybiB7XG4gICAgbWFqb3I6IHBhcnNlSW50KG1ham9yKSxcbiAgICBtaW5vcjogcGFyc2VJbnQobWlub3IpLFxuICAgIHBhdGNoOiBwYXJzZUludChwYXRjaCksXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWlyZWROb2RlVmVyc2lvbnMobmFwaVZlcnNpb246IE5hcGlWZXJzaW9uKTogTm9kZVZlcnNpb25bXSB7XG4gIGNvbnN0IHJlcXVpcmVtZW50ID0gTkFQSV9WRVJTSU9OX01BVFJJWC5nZXQobmFwaVZlcnNpb24pXG5cbiAgaWYgKCFyZXF1aXJlbWVudCkge1xuICAgIHJldHVybiBbcGFyc2VOb2RlVmVyc2lvbignMTAuMC4wJyldXG4gIH1cblxuICByZXR1cm4gcmVxdWlyZW1lbnQuc3BsaXQoJ3wnKS5tYXAocGFyc2VOb2RlVmVyc2lvbilcbn1cblxuZnVuY3Rpb24gdG9FbmdpbmVSZXF1aXJlbWVudCh2ZXJzaW9uczogTm9kZVZlcnNpb25bXSk6IHN0cmluZyB7XG4gIGNvbnN0IHJlcXVpcmVtZW50czogc3RyaW5nW10gPSBbXVxuICB2ZXJzaW9ucy5mb3JFYWNoKCh2LCBpKSA9PiB7XG4gICAgbGV0IHJlcSA9ICcnXG4gICAgaWYgKGkgIT09IDApIHtcbiAgICAgIGNvbnN0IGxhc3RWZXJzaW9uID0gdmVyc2lvbnNbaSAtIDFdXG4gICAgICByZXEgKz0gYDwgJHtsYXN0VmVyc2lvbi5tYWpvciArIDF9YFxuICAgIH1cblxuICAgIHJlcSArPSBgJHtpID09PSAwID8gJycgOiAnIHx8ICd9Pj0gJHt2Lm1ham9yfS4ke3YubWlub3J9LiR7di5wYXRjaH1gXG4gICAgcmVxdWlyZW1lbnRzLnB1c2gocmVxKVxuICB9KVxuXG4gIHJldHVybiByZXF1aXJlbWVudHMuam9pbignICcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuYXBpRW5naW5lUmVxdWlyZW1lbnQobmFwaVZlcnNpb246IE5hcGlWZXJzaW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvRW5naW5lUmVxdWlyZW1lbnQocmVxdWlyZWROb2RlVmVyc2lvbnMobmFwaVZlcnNpb24pKVxufVxuIiwiaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcblxuZXhwb3J0IHR5cGUgQ3JhdGVUYXJnZXRLaW5kID1cbiAgfCAnYmluJ1xuICB8ICdleGFtcGxlJ1xuICB8ICd0ZXN0J1xuICB8ICdiZW5jaCdcbiAgfCAnbGliJ1xuICB8ICdybGliJ1xuICB8ICdjZHlsaWInXG4gIHwgJ2N1c3RvbS1idWlsZCdcblxuZXhwb3J0IGludGVyZmFjZSBDcmF0ZVRhcmdldCB7XG4gIG5hbWU6IHN0cmluZ1xuICBraW5kOiBDcmF0ZVRhcmdldEtpbmRbXVxuICBjcmF0ZV90eXBlczogQ3JhdGVUYXJnZXRLaW5kW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmF0ZSB7XG4gIGlkOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIHNyY19wYXRoOiBzdHJpbmdcbiAgdmVyc2lvbjogc3RyaW5nXG4gIGVkaXRpb246IHN0cmluZ1xuICB0YXJnZXRzOiBDcmF0ZVRhcmdldFtdXG4gIGZlYXR1cmVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgbWFuaWZlc3RfcGF0aDogc3RyaW5nXG4gIGRlcGVuZGVuY2llczogQXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIHNvdXJjZTogc3RyaW5nXG4gICAgcmVxOiBzdHJpbmdcbiAgICBraW5kOiBzdHJpbmcgfCBudWxsXG4gICAgcmVuYW1lOiBzdHJpbmcgfCBudWxsXG4gICAgb3B0aW9uYWw6IGJvb2xlYW5cbiAgICB1c2VzX2RlZmF1bHRfZmVhdHVyZXM6IGJvb2xlYW5cbiAgICBmZWF0dXJlczogc3RyaW5nW11cbiAgICB0YXJnZXQ6IHN0cmluZyB8IG51bGxcbiAgICByZWdpc3RyeTogc3RyaW5nIHwgbnVsbFxuICB9PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhcmdvV29ya3NwYWNlTWV0YWRhdGEge1xuICB2ZXJzaW9uOiBudW1iZXJcbiAgcGFja2FnZXM6IENyYXRlW11cbiAgd29ya3NwYWNlX21lbWJlcnM6IHN0cmluZ1tdXG4gIHRhcmdldF9kaXJlY3Rvcnk6IHN0cmluZ1xuICB3b3Jrc3BhY2Vfcm9vdDogc3RyaW5nXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZU1ldGFkYXRhKG1hbmlmZXN0UGF0aDogc3RyaW5nKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBjcmF0ZSBmb3VuZCBpbiBtYW5pZmVzdDogJHttYW5pZmVzdFBhdGh9YClcbiAgfVxuXG4gIGNvbnN0IGNoaWxkUHJvY2VzcyA9IHNwYXduKFxuICAgICdjYXJnbycsXG4gICAgWydtZXRhZGF0YScsICctLW1hbmlmZXN0LXBhdGgnLCBtYW5pZmVzdFBhdGgsICctLWZvcm1hdC12ZXJzaW9uJywgJzEnXSxcbiAgICB7IHN0ZGlvOiAncGlwZScgfSxcbiAgKVxuXG4gIGxldCBzdGRvdXQgPSAnJ1xuICBsZXQgc3RkZXJyID0gJydcbiAgbGV0IHN0YXR1cyA9IDBcbiAgbGV0IGVycm9yID0gbnVsbFxuXG4gIGNoaWxkUHJvY2Vzcy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgIHN0ZG91dCArPSBkYXRhXG4gIH0pXG5cbiAgY2hpbGRQcm9jZXNzLnN0ZGVyci5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgc3RkZXJyICs9IGRhdGFcbiAgfSlcblxuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNoaWxkUHJvY2Vzcy5vbignY2xvc2UnLCAoY29kZSkgPT4ge1xuICAgICAgc3RhdHVzID0gY29kZSA/PyAwXG4gICAgICByZXNvbHZlKClcbiAgICB9KVxuICB9KVxuXG4gIGlmIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcignY2FyZ28gbWV0YWRhdGEgZmFpbGVkIHRvIHJ1bicsIHsgY2F1c2U6IGVycm9yIH0pXG4gIH1cbiAgaWYgKHN0YXR1cyAhPT0gMCkge1xuICAgIGNvbnN0IHNpbXBsZU1lc3NhZ2UgPSBgY2FyZ28gbWV0YWRhdGEgZXhpdGVkIHdpdGggY29kZSAke3N0YXR1c31gXG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3NpbXBsZU1lc3NhZ2V9IGFuZCBlcnJvciBtZXNzYWdlOlxcblxcbiR7c3RkZXJyfWAsIHtcbiAgICAgIGNhdXNlOiBuZXcgRXJyb3Ioc2ltcGxlTWVzc2FnZSksXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3Rkb3V0KSBhcyBDYXJnb1dvcmtzcGFjZU1ldGFkYXRhXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBjYXJnbyBtZXRhZGF0YSBKU09OJywgeyBjYXVzZTogZSB9KVxuICB9XG59XG4iLCJpbXBvcnQgeyB1bmRlcmxpbmUsIHllbGxvdyB9IGZyb20gJ2NvbG9yZXR0ZSdcbmltcG9ydCB7IG1lcmdlLCBvbWl0IH0gZnJvbSAnZXMtdG9vbGtpdCdcblxuaW1wb3J0IHsgZmlsZUV4aXN0cywgcmVhZEZpbGVBc3luYyB9IGZyb20gJy4vbWlzYy5qcydcbmltcG9ydCB7IERFRkFVTFRfVEFSR0VUUywgcGFyc2VUcmlwbGUsIFRhcmdldCB9IGZyb20gJy4vdGFyZ2V0LmpzJ1xuXG5leHBvcnQgdHlwZSBWYWx1ZU9mQ29uc3RBcnJheTxUPiA9IFRbRXhjbHVkZTxrZXlvZiBULCBrZXlvZiBBcnJheTxhbnk+Pl1cblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2VycyA9IFsneWFybicsICdwbnBtJ10gYXMgY29uc3RcbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRUZXN0RnJhbWV3b3JrcyA9IFsnYXZhJ10gYXMgY29uc3RcblxuZXhwb3J0IHR5cGUgU3VwcG9ydGVkUGFja2FnZU1hbmFnZXIgPSBWYWx1ZU9mQ29uc3RBcnJheTxcbiAgdHlwZW9mIFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2Vyc1xuPlxuZXhwb3J0IHR5cGUgU3VwcG9ydGVkVGVzdEZyYW1ld29yayA9IFZhbHVlT2ZDb25zdEFycmF5PFxuICB0eXBlb2YgU3VwcG9ydGVkVGVzdEZyYW1ld29ya3Ncbj5cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyTmFwaUNvbmZpZyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBiaW5hcnkgdG8gYmUgZ2VuZXJhdGVkLCBkZWZhdWx0IHRvIGBpbmRleGBcbiAgICovXG4gIGJpbmFyeU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIG5wbSBwYWNrYWdlLCBkZWZhdWx0IHRvIHRoZSBuYW1lIG9mIHJvb3QgcGFja2FnZS5qc29uIG5hbWVcbiAgICpcbiAgICogQWx3YXlzIGdpdmVuIGBAc2NvcGUvcGtnYCBhbmQgYXJjaCBzdWZmaXggd2lsbCBiZSBhcHBlbmRlZCBsaWtlIGBAc2NvcGUvcGtnLWxpbnV4LWdudS14NjRgXG4gICAqL1xuICBwYWNrYWdlTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogQWxsIHRhcmdldHMgdGhlIGNyYXRlIHdpbGwgYmUgY29tcGlsZWQgZm9yXG4gICAqL1xuICB0YXJnZXRzPzogc3RyaW5nW11cblxuICAvKipcbiAgICogVGhlIG5wbSBjbGllbnQgcHJvamVjdCB1c2VzLlxuICAgKi9cbiAgbnBtQ2xpZW50Pzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZ2VuZXJhdGUgY29uc3QgZW51bSBmb3IgdHlwZXNjcmlwdCBiaW5kaW5nc1xuICAgKi9cbiAgY29uc3RFbnVtPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBkdHMgaGVhZGVyIHByZXBlbmQgdG8gdGhlIGdlbmVyYXRlZCBkdHMgZmlsZVxuICAgKi9cbiAgZHRzSGVhZGVyPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIGR0cyBoZWFkZXIgZmlsZSBwYXRoIHRvIGJlIHByZXBlbmRlZCB0byB0aGUgZ2VuZXJhdGVkIGR0cyBmaWxlXG4gICAqIGlmIGJvdGggZHRzSGVhZGVyIGFuZCBkdHNIZWFkZXJGaWxlIGFyZSBwcm92aWRlZCwgZHRzSGVhZGVyRmlsZSB3aWxsIGJlIHVzZWRcbiAgICovXG4gIGR0c0hlYWRlckZpbGU/OiBzdHJpbmdcblxuICAvKipcbiAgICogd2FzbSBjb21waWxhdGlvbiBvcHRpb25zXG4gICAqL1xuICB3YXNtPzoge1xuICAgIC8qKlxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViQXNzZW1ibHkvSmF2YVNjcmlwdF9pbnRlcmZhY2UvTWVtb3J5XG4gICAgICogQGRlZmF1bHQgNDAwMCBwYWdlcyAoMjU2TWlCKVxuICAgICAqL1xuICAgIGluaXRpYWxNZW1vcnk/OiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBAZGVmYXVsdCA2NTUzNiBwYWdlcyAoNEdpQilcbiAgICAgKi9cbiAgICBtYXhpbXVtTWVtb3J5PzogbnVtYmVyXG5cbiAgICAvKipcbiAgICAgKiBCcm93c2VyIHdhc20gYmluZGluZyBjb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYnJvd3Nlcjoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBmcyBtb2R1bGUgaW4gYnJvd3NlclxuICAgICAgICovXG4gICAgICBmcz86IGJvb2xlYW5cbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBpbml0aWFsaXplIHdhc20gYXN5bmNocm9ub3VzbHlcbiAgICAgICAqL1xuICAgICAgYXN5bmNJbml0PzogYm9vbGVhblxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIGluamVjdCBgYnVmZmVyYCB0byBlbW5hcGkgY29udGV4dFxuICAgICAgICovXG4gICAgICBidWZmZXI/OiBib29sZWFuXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIGJpbmFyeU5hbWUgaW5zdGVhZFxuICAgKi9cbiAgbmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHBhY2thZ2VOYW1lIGluc3RlYWRcbiAgICovXG4gIHBhY2thZ2U/OiB7XG4gICAgbmFtZT86IHN0cmluZ1xuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgdGFyZ2V0cyBpbnN0ZWFkXG4gICAqL1xuICB0cmlwbGVzPzoge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgZW5hYmxlIGRlZmF1bHQgdGFyZ2V0c1xuICAgICAqL1xuICAgIGRlZmF1bHRzOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCB0YXJnZXRzIHRvIGJlIGNvbXBpbGVkIGZvclxuICAgICAqL1xuICAgIGFkZGl0aW9uYWw/OiBzdHJpbmdbXVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uUGFja2FnZUpzb25GaWVsZHMge1xuICBuYW1lOiBzdHJpbmdcbiAgdmVyc2lvbjogc3RyaW5nXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIGtleXdvcmRzPzogc3RyaW5nW11cbiAgYXV0aG9yPzogc3RyaW5nXG4gIGF1dGhvcnM/OiBzdHJpbmdbXVxuICBsaWNlbnNlPzogc3RyaW5nXG4gIGNwdT86IHN0cmluZ1tdXG4gIG9zPzogc3RyaW5nW11cbiAgbGliYz86IHN0cmluZ1tdXG4gIGZpbGVzPzogc3RyaW5nW11cbiAgcmVwb3NpdG9yeT86IGFueVxuICBob21lcGFnZT86IGFueVxuICBlbmdpbmVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBwdWJsaXNoQ29uZmlnPzogYW55XG4gIGJ1Z3M/OiBhbnlcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIG5hcGk/OiBVc2VyTmFwaUNvbmZpZ1xuICB0eXBlPzogJ21vZHVsZScgfCAnY29tbW9uanMnXG4gIHNjcmlwdHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbiAgLy8gbW9kdWxlc1xuICBtYWluPzogc3RyaW5nXG4gIG1vZHVsZT86IHN0cmluZ1xuICB0eXBlcz86IHN0cmluZ1xuICBicm93c2VyPzogc3RyaW5nXG4gIGV4cG9ydHM/OiBhbnlcblxuICBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGRldkRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICBhdmE/OiB7XG4gICAgdGltZW91dD86IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIE5hcGlDb25maWcgPSBSZXF1aXJlZDxcbiAgUGljazxVc2VyTmFwaUNvbmZpZywgJ2JpbmFyeU5hbWUnIHwgJ3BhY2thZ2VOYW1lJyB8ICducG1DbGllbnQnPlxuPiAmXG4gIFBpY2s8VXNlck5hcGlDb25maWcsICd3YXNtJyB8ICdkdHNIZWFkZXInIHwgJ2R0c0hlYWRlckZpbGUnIHwgJ2NvbnN0RW51bSc+ICYge1xuICAgIHRhcmdldHM6IFRhcmdldFtdXG4gICAgcGFja2FnZUpzb246IENvbW1vblBhY2thZ2VKc29uRmllbGRzXG4gIH1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWROYXBpQ29uZmlnKFxuICBwYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcsXG4pOiBQcm9taXNlPE5hcGlDb25maWc+IHtcbiAgaWYgKGNvbmZpZ1BhdGggJiYgIShhd2FpdCBmaWxlRXhpc3RzKGNvbmZpZ1BhdGgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTkFQSS1SUyBjb25maWcgbm90IGZvdW5kIGF0ICR7Y29uZmlnUGF0aH1gKVxuICB9XG4gIGlmICghKGF3YWl0IGZpbGVFeGlzdHMocGF0aCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBwYWNrYWdlLmpzb24gbm90IGZvdW5kIGF0ICR7cGF0aH1gKVxuICB9XG4gIC8vIE1heSBzdXBwb3J0IG11bHRpcGxlIGNvbmZpZyBzb3VyY2VzIGxhdGVyIG9uLlxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhwYXRoLCAndXRmOCcpXG4gIGxldCBwa2dKc29uXG4gIHRyeSB7XG4gICAgcGtnSnNvbiA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgQ29tbW9uUGFja2FnZUpzb25GaWVsZHNcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiBhdCAke3BhdGh9YCwge1xuICAgICAgY2F1c2U6IGUsXG4gICAgfSlcbiAgfVxuXG4gIGxldCBzZXBhcmF0ZWRDb25maWc6IFVzZXJOYXBpQ29uZmlnIHwgdW5kZWZpbmVkXG4gIGlmIChjb25maWdQYXRoKSB7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlQXN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKVxuICAgIHRyeSB7XG4gICAgICBzZXBhcmF0ZWRDb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpIGFzIFVzZXJOYXBpQ29uZmlnXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgTkFQSS1SUyBjb25maWcgYXQgJHtjb25maWdQYXRofWAsIHtcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVzZXJOYXBpQ29uZmlnID0gcGtnSnNvbi5uYXBpID8/IHt9XG4gIGlmIChwa2dKc29uLm5hcGkgJiYgc2VwYXJhdGVkQ29uZmlnKSB7XG4gICAgY29uc3QgcGtnSnNvblBhdGggPSB1bmRlcmxpbmUocGF0aClcbiAgICBjb25zdCBjb25maWdQYXRoVW5kZXJsaW5lID0gdW5kZXJsaW5lKGNvbmZpZ1BhdGghKVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIHllbGxvdyhcbiAgICAgICAgYEJvdGggbmFwaSBmaWVsZCBpbiAke3BrZ0pzb25QYXRofSBhbmQgW05BUEktUlMgY29uZmlnXSgke2NvbmZpZ1BhdGhVbmRlcmxpbmV9KSBmaWxlIGFyZSBmb3VuZCwgdGhlIE5BUEktUlMgY29uZmlnIGZpbGUgd2lsbCBiZSB1c2VkLmAsXG4gICAgICApLFxuICAgIClcbiAgICBPYmplY3QuYXNzaWduKHVzZXJOYXBpQ29uZmlnLCBzZXBhcmF0ZWRDb25maWcpXG4gIH1cbiAgY29uc3QgbmFwaUNvbmZpZzogTmFwaUNvbmZpZyA9IG1lcmdlKFxuICAgIHtcbiAgICAgIGJpbmFyeU5hbWU6ICdpbmRleCcsXG4gICAgICBwYWNrYWdlTmFtZTogcGtnSnNvbi5uYW1lLFxuICAgICAgdGFyZ2V0czogW10sXG4gICAgICBwYWNrYWdlSnNvbjogcGtnSnNvbixcbiAgICAgIG5wbUNsaWVudDogJ25wbScsXG4gICAgfSxcbiAgICBvbWl0KHVzZXJOYXBpQ29uZmlnLCBbJ3RhcmdldHMnXSksXG4gIClcblxuICBsZXQgdGFyZ2V0czogc3RyaW5nW10gPSB1c2VyTmFwaUNvbmZpZy50YXJnZXRzID8/IFtdXG5cbiAgLy8gY29tcGF0aWJsZSB3aXRoIG9sZCBjb25maWdcbiAgaWYgKHVzZXJOYXBpQ29uZmlnPy5uYW1lKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgeWVsbG93KFxuICAgICAgICBgW0RFUFJFQ0FURURdIG5hcGkubmFtZSBpcyBkZXByZWNhdGVkLCB1c2UgbmFwaS5iaW5hcnlOYW1lIGluc3RlYWQuYCxcbiAgICAgICksXG4gICAgKVxuICAgIG5hcGlDb25maWcuYmluYXJ5TmFtZSA9IHVzZXJOYXBpQ29uZmlnLm5hbWVcbiAgfVxuXG4gIGlmICghdGFyZ2V0cy5sZW5ndGgpIHtcbiAgICBsZXQgZGVwcmVjYXRlZFdhcm5lZCA9IGZhbHNlXG4gICAgY29uc3Qgd2FybmluZyA9IHllbGxvdyhcbiAgICAgIGBbREVQUkVDQVRFRF0gbmFwaS50cmlwbGVzIGlzIGRlcHJlY2F0ZWQsIHVzZSBuYXBpLnRhcmdldHMgaW5zdGVhZC5gLFxuICAgIClcbiAgICBpZiAodXNlck5hcGlDb25maWcudHJpcGxlcz8uZGVmYXVsdHMpIHtcbiAgICAgIGRlcHJlY2F0ZWRXYXJuZWQgPSB0cnVlXG4gICAgICBjb25zb2xlLndhcm4od2FybmluZylcbiAgICAgIHRhcmdldHMgPSB0YXJnZXRzLmNvbmNhdChERUZBVUxUX1RBUkdFVFMpXG4gICAgfVxuXG4gICAgaWYgKHVzZXJOYXBpQ29uZmlnLnRyaXBsZXM/LmFkZGl0aW9uYWw/Lmxlbmd0aCkge1xuICAgICAgdGFyZ2V0cyA9IHRhcmdldHMuY29uY2F0KHVzZXJOYXBpQ29uZmlnLnRyaXBsZXMuYWRkaXRpb25hbClcbiAgICAgIGlmICghZGVwcmVjYXRlZFdhcm5lZCkge1xuICAgICAgICBjb25zb2xlLndhcm4od2FybmluZylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBmaW5kIGR1cGxpY2F0ZSB0YXJnZXRzXG4gIGNvbnN0IHVuaXF1ZVRhcmdldHMgPSBuZXcgU2V0KHRhcmdldHMpXG4gIGlmICh1bmlxdWVUYXJnZXRzLnNpemUgIT09IHRhcmdldHMubGVuZ3RoKSB7XG4gICAgY29uc3QgZHVwbGljYXRlVGFyZ2V0ID0gdGFyZ2V0cy5maW5kKFxuICAgICAgKHRhcmdldCwgaW5kZXgpID0+IHRhcmdldHMuaW5kZXhPZih0YXJnZXQpICE9PSBpbmRleCxcbiAgICApXG4gICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgdGFyZ2V0cyBhcmUgbm90IGFsbG93ZWQ6ICR7ZHVwbGljYXRlVGFyZ2V0fWApXG4gIH1cblxuICBuYXBpQ29uZmlnLnRhcmdldHMgPSB0YXJnZXRzLm1hcChwYXJzZVRyaXBsZSlcblxuICByZXR1cm4gbmFwaUNvbmZpZ1xufVxuIiwiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5cbmltcG9ydCB7IGRlYnVnIH0gZnJvbSAnLi9sb2cuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiB0cnlJbnN0YWxsQ2FyZ29CaW5hcnkobmFtZTogc3RyaW5nLCBiaW46IHN0cmluZykge1xuICBpZiAoZGV0ZWN0Q2FyZ29CaW5hcnkoYmluKSkge1xuICAgIGRlYnVnKCdDYXJnbyBiaW5hcnkgYWxyZWFkeSBpbnN0YWxsZWQ6ICVzJywgbmFtZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgZGVidWcoJ0luc3RhbGxpbmcgY2FyZ28gYmluYXJ5OiAlcycsIG5hbWUpXG4gICAgZXhlY1N5bmMoYGNhcmdvIGluc3RhbGwgJHtuYW1lfWAsIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluc3RhbGwgY2FyZ28gYmluYXJ5OiAke25hbWV9YCwge1xuICAgICAgY2F1c2U6IGUsXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRlY3RDYXJnb0JpbmFyeShiaW46IHN0cmluZykge1xuICBkZWJ1ZygnRGV0ZWN0aW5nIGNhcmdvIGJpbmFyeTogJXMnLCBiaW4pXG4gIHRyeSB7XG4gICAgZXhlY1N5bmMoYGNhcmdvIGhlbHAgJHtiaW59YCwge1xuICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgIH0pXG4gICAgZGVidWcoJ0NhcmdvIGJpbmFyeSBkZXRlY3RlZDogJXMnLCBiaW4pXG4gICAgcmV0dXJuIHRydWVcbiAgfSBjYXRjaCB7XG4gICAgZGVidWcoJ0NhcmdvIGJpbmFyeSBub3QgZGV0ZWN0ZWQ6ICVzJywgYmluKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG4iLCJpbXBvcnQgeyBzb3J0QnkgfSBmcm9tICdlcy10b29sa2l0J1xuXG5pbXBvcnQgeyByZWFkRmlsZUFzeW5jIH0gZnJvbSAnLi9taXNjLmpzJ1xuXG5jb25zdCBUT1BfTEVWRUxfTkFNRVNQQUNFID0gJ19fVE9QX0xFVkVMX01PRFVMRV9fJ1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVFlQRV9ERUZfSEVBREVSID0gYC8qIGF1dG8tZ2VuZXJhdGVkIGJ5IE5BUEktUlMgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG5gXG5cbmVudW0gVHlwZURlZktpbmQge1xuICBDb25zdCA9ICdjb25zdCcsXG4gIEVudW0gPSAnZW51bScsXG4gIFN0cmluZ0VudW0gPSAnc3RyaW5nX2VudW0nLFxuICBJbnRlcmZhY2UgPSAnaW50ZXJmYWNlJyxcbiAgVHlwZSA9ICd0eXBlJyxcbiAgRm4gPSAnZm4nLFxuICBTdHJ1Y3QgPSAnc3RydWN0JyxcbiAgRXh0ZW5kcyA9ICdleHRlbmRzJyxcbiAgSW1wbCA9ICdpbXBsJyxcbn1cblxuaW50ZXJmYWNlIFR5cGVEZWZMaW5lIHtcbiAga2luZDogVHlwZURlZktpbmRcbiAgbmFtZTogc3RyaW5nXG4gIG9yaWdpbmFsX25hbWU/OiBzdHJpbmdcbiAgZGVmOiBzdHJpbmdcbiAgZXh0ZW5kcz86IHN0cmluZ1xuICBqc19kb2M/OiBzdHJpbmdcbiAganNfbW9kPzogc3RyaW5nXG59XG5cbmZ1bmN0aW9uIHByZXR0eVByaW50KFxuICBsaW5lOiBUeXBlRGVmTGluZSxcbiAgY29uc3RFbnVtOiBib29sZWFuLFxuICBpZGVudDogbnVtYmVyLFxuICBhbWJpZW50ID0gZmFsc2UsXG4pOiBzdHJpbmcge1xuICBsZXQgcyA9IGxpbmUuanNfZG9jID8/ICcnXG4gIHN3aXRjaCAobGluZS5raW5kKSB7XG4gICAgY2FzZSBUeXBlRGVmS2luZC5JbnRlcmZhY2U6XG4gICAgICBzICs9IGBleHBvcnQgaW50ZXJmYWNlICR7bGluZS5uYW1lfSB7XFxuJHtsaW5lLmRlZn1cXG59YFxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgVHlwZURlZktpbmQuVHlwZTpcbiAgICAgIHMgKz0gYGV4cG9ydCB0eXBlICR7bGluZS5uYW1lfSA9IFxcbiR7bGluZS5kZWZ9YFxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgVHlwZURlZktpbmQuRW51bTpcbiAgICAgIGNvbnN0IGVudW1OYW1lID0gY29uc3RFbnVtID8gJ2NvbnN0IGVudW0nIDogJ2VudW0nXG4gICAgICBzICs9IGAke2V4cG9ydERlY2xhcmUoYW1iaWVudCl9ICR7ZW51bU5hbWV9ICR7bGluZS5uYW1lfSB7XFxuJHtsaW5lLmRlZn1cXG59YFxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgVHlwZURlZktpbmQuU3RyaW5nRW51bTpcbiAgICAgIGlmIChjb25zdEVudW0pIHtcbiAgICAgICAgcyArPSBgJHtleHBvcnREZWNsYXJlKGFtYmllbnQpfSBjb25zdCBlbnVtICR7bGluZS5uYW1lfSB7XFxuJHtsaW5lLmRlZn1cXG59YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcyArPSBgZXhwb3J0IHR5cGUgJHtsaW5lLm5hbWV9ID0gJHtsaW5lLmRlZi5yZXBsYWNlQWxsKC8uKj0vZywgJycpLnJlcGxhY2VBbGwoJywnLCAnfCcpfTtgXG4gICAgICB9XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBUeXBlRGVmS2luZC5TdHJ1Y3Q6XG4gICAgICBjb25zdCBleHRlbmRzRGVmID0gbGluZS5leHRlbmRzID8gYCBleHRlbmRzICR7bGluZS5leHRlbmRzfWAgOiAnJ1xuICAgICAgaWYgKGxpbmUuZXh0ZW5kcykge1xuICAgICAgICAvLyBFeHRyYWN0IGdlbmVyaWMgcGFyYW1zIGZyb20gZXh0ZW5kcyB0eXBlIGxpa2UgSXRlcmF0b3I8VCwgVFJlc3VsdCwgVE5leHQ+XG4gICAgICAgIGNvbnN0IGdlbmVyaWNNYXRjaCA9IGxpbmUuZXh0ZW5kcy5tYXRjaCgvSXRlcmF0b3I8KC4rKT4kLylcbiAgICAgICAgaWYgKGdlbmVyaWNNYXRjaCkge1xuICAgICAgICAgIGNvbnN0IFtULCBUUmVzdWx0LCBUTmV4dF0gPSBnZW5lcmljTWF0Y2hbMV1cbiAgICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgICAubWFwKChwKSA9PiBwLnRyaW0oKSlcbiAgICAgICAgICBsaW5lLmRlZiA9XG4gICAgICAgICAgICBsaW5lLmRlZiArXG4gICAgICAgICAgICBgXFxubmV4dCh2YWx1ZT86ICR7VE5leHR9KTogSXRlcmF0b3JSZXN1bHQ8JHtUfSwgJHtUUmVzdWx0fT5gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHMgKz0gYCR7ZXhwb3J0RGVjbGFyZShhbWJpZW50KX0gY2xhc3MgJHtsaW5lLm5hbWV9JHtleHRlbmRzRGVmfSB7XFxuJHtsaW5lLmRlZn1cXG59YFxuICAgICAgaWYgKGxpbmUub3JpZ2luYWxfbmFtZSAmJiBsaW5lLm9yaWdpbmFsX25hbWUgIT09IGxpbmUubmFtZSkge1xuICAgICAgICBzICs9IGBcXG5leHBvcnQgdHlwZSAke2xpbmUub3JpZ2luYWxfbmFtZX0gPSAke2xpbmUubmFtZX1gXG4gICAgICB9XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBUeXBlRGVmS2luZC5GbjpcbiAgICAgIHMgKz0gYCR7ZXhwb3J0RGVjbGFyZShhbWJpZW50KX0gJHtsaW5lLmRlZn1gXG4gICAgICBicmVha1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHMgKz0gbGluZS5kZWZcbiAgfVxuXG4gIHJldHVybiBjb3JyZWN0U3RyaW5nSWRlbnQocywgaWRlbnQpXG59XG5cbmZ1bmN0aW9uIGV4cG9ydERlY2xhcmUoYW1iaWVudDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChhbWJpZW50KSB7XG4gICAgcmV0dXJuICdleHBvcnQnXG4gIH1cblxuICByZXR1cm4gJ2V4cG9ydCBkZWNsYXJlJ1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1R5cGVEZWYoXG4gIGludGVybWVkaWF0ZVR5cGVGaWxlOiBzdHJpbmcsXG4gIGNvbnN0RW51bTogYm9vbGVhbixcbikge1xuICBjb25zdCBleHBvcnRzOiBzdHJpbmdbXSA9IFtdXG4gIGNvbnN0IGRlZnMgPSBhd2FpdCByZWFkSW50ZXJtZWRpYXRlVHlwZUZpbGUoaW50ZXJtZWRpYXRlVHlwZUZpbGUpXG4gIGNvbnN0IGdyb3VwZWREZWZzID0gcHJlcHJvY2Vzc1R5cGVEZWYoZGVmcylcblxuICBjb25zdCBkdHMgPVxuICAgIHNvcnRCeShBcnJheS5mcm9tKGdyb3VwZWREZWZzKSwgWyhbbmFtZXNwYWNlXSkgPT4gbmFtZXNwYWNlXSlcbiAgICAgIC5tYXAoKFtuYW1lc3BhY2UsIGRlZnNdKSA9PiB7XG4gICAgICAgIGlmIChuYW1lc3BhY2UgPT09IFRPUF9MRVZFTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICByZXR1cm4gZGVmc1xuICAgICAgICAgICAgLm1hcCgoZGVmKSA9PiB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoZGVmLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFR5cGVEZWZLaW5kLkNvbnN0OlxuICAgICAgICAgICAgICAgIGNhc2UgVHlwZURlZktpbmQuRW51bTpcbiAgICAgICAgICAgICAgICBjYXNlIFR5cGVEZWZLaW5kLlN0cmluZ0VudW06XG4gICAgICAgICAgICAgICAgY2FzZSBUeXBlRGVmS2luZC5GbjpcbiAgICAgICAgICAgICAgICBjYXNlIFR5cGVEZWZLaW5kLlN0cnVjdDoge1xuICAgICAgICAgICAgICAgICAgZXhwb3J0cy5wdXNoKGRlZi5uYW1lKVxuICAgICAgICAgICAgICAgICAgaWYgKGRlZi5vcmlnaW5hbF9uYW1lICYmIGRlZi5vcmlnaW5hbF9uYW1lICE9PSBkZWYubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBleHBvcnRzLnB1c2goZGVmLm9yaWdpbmFsX25hbWUpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcHJldHR5UHJpbnQoZGVmLCBjb25zdEVudW0sIDApXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJ1xcblxcbicpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhwb3J0cy5wdXNoKG5hbWVzcGFjZSlcbiAgICAgICAgICBsZXQgZGVjbGFyYXRpb24gPSAnJ1xuICAgICAgICAgIGRlY2xhcmF0aW9uICs9IGBleHBvcnQgZGVjbGFyZSBuYW1lc3BhY2UgJHtuYW1lc3BhY2V9IHtcXG5gXG4gICAgICAgICAgZm9yIChjb25zdCBkZWYgb2YgZGVmcykge1xuICAgICAgICAgICAgZGVjbGFyYXRpb24gKz0gcHJldHR5UHJpbnQoZGVmLCBjb25zdEVudW0sIDIsIHRydWUpICsgJ1xcbidcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVjbGFyYXRpb24gKz0gJ30nXG4gICAgICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuam9pbignXFxuXFxuJykgKyAnXFxuJ1xuXG4gIHJldHVybiB7XG4gICAgZHRzLFxuICAgIGV4cG9ydHMsXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEludGVybWVkaWF0ZVR5cGVGaWxlKGZpbGU6IHN0cmluZykge1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlLCAndXRmOCcpXG5cbiAgY29uc3QgZGVmcyA9IGNvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKVxuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShsaW5lKSBhcyBUeXBlRGVmTGluZVxuICAgICAgLy8gQ29udmVydCBlc2NhcGVkIG5ld2xpbmVzIGJhY2sgdG8gYWN0dWFsIG5ld2xpbmVzIGluIGpzX2RvYyBmaWVsZHNcbiAgICAgIGlmIChwYXJzZWQuanNfZG9jKSB7XG4gICAgICAgIHBhcnNlZC5qc19kb2MgPSBwYXJzZWQuanNfZG9jLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKVxuICAgICAgfVxuICAgICAgLy8gQ29udmVydCBlc2NhcGVkIG5ld2xpbmVzIHRvIGFjdHVhbCBuZXdsaW5lcyBpbiBkZWYgZmllbGRzIGZvciBzdHJ1Y3QvY2xhc3MvaW50ZXJmYWNlL3R5cGUgdHlwZXNcbiAgICAgIC8vIHdoZXJlIFxcbiByZXByZXNlbnRzIG1ldGhvZC9maWVsZCBzZXBhcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFjdHVhbCBuZXdsaW5lc1xuICAgICAgaWYgKHBhcnNlZC5kZWYpIHtcbiAgICAgICAgcGFyc2VkLmRlZiA9IHBhcnNlZC5kZWYucmVwbGFjZSgvXFxcXG4vZywgJ1xcbicpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyc2VkXG4gICAgfSlcblxuICAvLyBtb3ZlIGFsbCBgc3RydWN0YCBkZWYgdG8gdGhlIHZlcnkgdG9wXG4gIC8vIGFuZCBvcmRlciB0aGUgcmVzdCBhbHBoYWJldGljYWxseS5cbiAgcmV0dXJuIGRlZnMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLmtpbmQgPT09IFR5cGVEZWZLaW5kLlN0cnVjdCkge1xuICAgICAgaWYgKGIua2luZCA9PT0gVHlwZURlZktpbmQuU3RydWN0KSB7XG4gICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpXG4gICAgICB9XG4gICAgICByZXR1cm4gLTFcbiAgICB9IGVsc2UgaWYgKGIua2luZCA9PT0gVHlwZURlZktpbmQuU3RydWN0KSB7XG4gICAgICByZXR1cm4gMVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc1R5cGVEZWYoZGVmczogVHlwZURlZkxpbmVbXSk6IE1hcDxzdHJpbmcsIFR5cGVEZWZMaW5lW10+IHtcbiAgY29uc3QgbmFtZXNwYWNlR3JvdXBlZCA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlRGVmTGluZVtdPigpXG4gIGNvbnN0IGNsYXNzRGVmcyA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlRGVmTGluZT4oKVxuXG4gIGZvciAoY29uc3QgZGVmIG9mIGRlZnMpIHtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBkZWYuanNfbW9kID8/IFRPUF9MRVZFTF9OQU1FU1BBQ0VcbiAgICBpZiAoIW5hbWVzcGFjZUdyb3VwZWQuaGFzKG5hbWVzcGFjZSkpIHtcbiAgICAgIG5hbWVzcGFjZUdyb3VwZWQuc2V0KG5hbWVzcGFjZSwgW10pXG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXAgPSBuYW1lc3BhY2VHcm91cGVkLmdldChuYW1lc3BhY2UpIVxuXG4gICAgaWYgKGRlZi5raW5kID09PSBUeXBlRGVmS2luZC5TdHJ1Y3QpIHtcbiAgICAgIGdyb3VwLnB1c2goZGVmKVxuICAgICAgY2xhc3NEZWZzLnNldChkZWYubmFtZSwgZGVmKVxuICAgIH0gZWxzZSBpZiAoZGVmLmtpbmQgPT09IFR5cGVEZWZLaW5kLkV4dGVuZHMpIHtcbiAgICAgIGNvbnN0IGNsYXNzRGVmID0gY2xhc3NEZWZzLmdldChkZWYubmFtZSlcbiAgICAgIGlmIChjbGFzc0RlZikge1xuICAgICAgICBjbGFzc0RlZi5leHRlbmRzID0gZGVmLmRlZlxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVmLmtpbmQgPT09IFR5cGVEZWZLaW5kLkltcGwpIHtcbiAgICAgIC8vIG1lcmdlIGBpbXBsYCBpbnRvIGNsYXNzIGRlZmluaXRpb25cbiAgICAgIGNvbnN0IGNsYXNzRGVmID0gY2xhc3NEZWZzLmdldChkZWYubmFtZSlcbiAgICAgIGlmIChjbGFzc0RlZikge1xuICAgICAgICBpZiAoY2xhc3NEZWYuZGVmKSB7XG4gICAgICAgICAgY2xhc3NEZWYuZGVmICs9ICdcXG4nXG4gICAgICAgIH1cblxuICAgICAgICBjbGFzc0RlZi5kZWYgKz0gZGVmLmRlZlxuICAgICAgICAvLyBDb252ZXJ0IGFueSByZW1haW5pbmcgXFxuIHNlcXVlbmNlcyBpbiB0aGUgbWVyZ2VkIGRlZiB0byBhY3R1YWwgbmV3bGluZXNcbiAgICAgICAgaWYgKGNsYXNzRGVmLmRlZikge1xuICAgICAgICAgIGNsYXNzRGVmLmRlZiA9IGNsYXNzRGVmLmRlZi5yZXBsYWNlKC9cXFxcbi9nLCAnXFxuJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBncm91cC5wdXNoKGRlZilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZXNwYWNlR3JvdXBlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29ycmVjdFN0cmluZ0lkZW50KHNyYzogc3RyaW5nLCBpZGVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IGJyYWNrZXREZXB0aCA9IDBcbiAgY29uc3QgcmVzdWx0ID0gc3JjXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKVxuICAgICAgaWYgKGxpbmUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiAnJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0luTXVsdGlsaW5lQ29tbWVudCA9IGxpbmUuc3RhcnRzV2l0aCgnKicpXG4gICAgICBjb25zdCBpc0Nsb3NpbmdCcmFja2V0ID0gbGluZS5lbmRzV2l0aCgnfScpXG4gICAgICBjb25zdCBpc09wZW5pbmdCcmFja2V0ID0gbGluZS5lbmRzV2l0aCgneycpXG4gICAgICBjb25zdCBpc1R5cGVEZWNsYXJhdGlvbiA9IGxpbmUuZW5kc1dpdGgoJz0nKVxuICAgICAgY29uc3QgaXNUeXBlVmFyaWFudCA9IGxpbmUuc3RhcnRzV2l0aCgnfCcpXG5cbiAgICAgIGxldCByaWdodEluZGVudCA9IGlkZW50XG4gICAgICBpZiAoKGlzT3BlbmluZ0JyYWNrZXQgfHwgaXNUeXBlRGVjbGFyYXRpb24pICYmICFpc0luTXVsdGlsaW5lQ29tbWVudCkge1xuICAgICAgICBicmFja2V0RGVwdGggKz0gMVxuICAgICAgICByaWdodEluZGVudCArPSAoYnJhY2tldERlcHRoIC0gMSkgKiAyXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDbG9zaW5nQnJhY2tldCAmJlxuICAgICAgICAgIGJyYWNrZXREZXB0aCA+IDAgJiZcbiAgICAgICAgICAhaXNJbk11bHRpbGluZUNvbW1lbnQgJiZcbiAgICAgICAgICAhaXNUeXBlVmFyaWFudFxuICAgICAgICApIHtcbiAgICAgICAgICBicmFja2V0RGVwdGggLT0gMVxuICAgICAgICB9XG4gICAgICAgIHJpZ2h0SW5kZW50ICs9IGJyYWNrZXREZXB0aCAqIDJcbiAgICAgIH1cblxuICAgICAgaWYgKGlzSW5NdWx0aWxpbmVDb21tZW50KSB7XG4gICAgICAgIHJpZ2h0SW5kZW50ICs9IDFcbiAgICAgIH1cblxuICAgICAgY29uc3QgcyA9IGAkeycgJy5yZXBlYXQocmlnaHRJbmRlbnQpfSR7bGluZX1gXG5cbiAgICAgIHJldHVybiBzXG4gICAgfSlcbiAgICAuam9pbignXFxuJylcblxuICByZXR1cm4gcmVzdWx0XG59XG4iLCJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgeyByZWFkTmFwaUNvbmZpZyB9IGZyb20gJy4vY29uZmlnLmpzJ1xuXG5pbnRlcmZhY2UgTWluaW1hbE5hcGlPcHRpb25zIHtcbiAgY3dkOiBzdHJpbmdcbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICBwYWNrYWdlSnNvblBhdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRDb25maWcob3B0aW9uczogTWluaW1hbE5hcGlPcHRpb25zKSB7XG4gIGNvbnN0IHJlc29sdmVQYXRoID0gKC4uLnBhdGhzOiBzdHJpbmdbXSkgPT4gcmVzb2x2ZShvcHRpb25zLmN3ZCwgLi4ucGF0aHMpXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlYWROYXBpQ29uZmlnKFxuICAgIHJlc29sdmVQYXRoKFxuICAgICAgb3B0aW9ucy5jb25maWdQYXRoID8/IG9wdGlvbnMucGFja2FnZUpzb25QYXRoID8/ICdwYWNrYWdlLmpzb24nLFxuICAgICksXG4gICAgb3B0aW9ucy5jb25maWdQYXRoID8gcmVzb2x2ZVBhdGgob3B0aW9ucy5jb25maWdQYXRoKSA6IHVuZGVmaW5lZCxcbiAgKVxuICByZXR1cm4gY29uZmlnXG59XG4iLCJpbXBvcnQgeyBqb2luLCBwYXJzZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0ICogYXMgY29sb3JzIGZyb20gJ2NvbG9yZXR0ZSdcblxuaW1wb3J0IHtcbiAgYXBwbHlEZWZhdWx0QXJ0aWZhY3RzT3B0aW9ucyxcbiAgQXJ0aWZhY3RzT3B0aW9ucyxcbn0gZnJvbSAnLi4vZGVmL2FydGlmYWN0cy5qcydcbmltcG9ydCB7XG4gIHJlYWROYXBpQ29uZmlnLFxuICBkZWJ1Z0ZhY3RvcnksXG4gIHJlYWRGaWxlQXN5bmMsXG4gIHdyaXRlRmlsZUFzeW5jLFxuICBVbmlBcmNoc0J5UGxhdGZvcm0sXG4gIHJlYWRkaXJBc3luYyxcbn0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCdhcnRpZmFjdHMnKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29sbGVjdEFydGlmYWN0cyh1c2VyT3B0aW9uczogQXJ0aWZhY3RzT3B0aW9ucykge1xuICBjb25zdCBvcHRpb25zID0gYXBwbHlEZWZhdWx0QXJ0aWZhY3RzT3B0aW9ucyh1c2VyT3B0aW9ucylcblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBqb2luKG9wdGlvbnMuY3dkLCBvcHRpb25zLnBhY2thZ2VKc29uUGF0aClcbiAgY29uc3QgeyB0YXJnZXRzLCBiaW5hcnlOYW1lLCBwYWNrYWdlTmFtZSB9ID1cbiAgICBhd2FpdCByZWFkTmFwaUNvbmZpZyhwYWNrYWdlSnNvblBhdGgpXG5cbiAgY29uc3QgZGlzdERpcnMgPSB0YXJnZXRzLm1hcCgocGxhdGZvcm0pID0+XG4gICAgam9pbihvcHRpb25zLmN3ZCwgb3B0aW9ucy5ucG1EaXIsIHBsYXRmb3JtLnBsYXRmb3JtQXJjaEFCSSksXG4gIClcblxuICBjb25zdCB1bml2ZXJzYWxTb3VyY2VCaW5zID0gbmV3IFNldChcbiAgICB0YXJnZXRzXG4gICAgICAuZmlsdGVyKChwbGF0Zm9ybSkgPT4gcGxhdGZvcm0uYXJjaCA9PT0gJ3VuaXZlcnNhbCcpXG4gICAgICAuZmxhdE1hcCgocCkgPT5cbiAgICAgICAgVW5pQXJjaHNCeVBsYXRmb3JtW3AucGxhdGZvcm1dPy5tYXAoKGEpID0+IGAke3AucGxhdGZvcm19LSR7YX1gKSxcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW10sXG4gIClcblxuICBhd2FpdCBjb2xsZWN0Tm9kZUJpbmFyaWVzKGpvaW4ob3B0aW9ucy5jd2QsIG9wdGlvbnMub3V0cHV0RGlyKSkudGhlbihcbiAgICAob3V0cHV0KSA9PlxuICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgIG91dHB1dC5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICAgICAgZGVidWcuaW5mbyhgUmVhZCBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KGZpbGVQYXRoKX1dYClcbiAgICAgICAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlUGF0aClcbiAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2UoZmlsZVBhdGgpXG4gICAgICAgICAgY29uc3QgdGVybXMgPSBwYXJzZWROYW1lLm5hbWUuc3BsaXQoJy4nKVxuICAgICAgICAgIGNvbnN0IHBsYXRmb3JtQXJjaEFCSSA9IHRlcm1zLnBvcCgpIVxuICAgICAgICAgIGNvbnN0IF9iaW5hcnlOYW1lID0gdGVybXMuam9pbignLicpXG5cbiAgICAgICAgICBpZiAoX2JpbmFyeU5hbWUgIT09IGJpbmFyeU5hbWUpIHtcbiAgICAgICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgICAgIGBbJHtfYmluYXJ5TmFtZX1dIGlzIG5vdCBtYXRjaGVkIHdpdGggWyR7YmluYXJ5TmFtZX1dLCBza2lwYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkaXIgPSBkaXN0RGlycy5maW5kKChkaXIpID0+IGRpci5pbmNsdWRlcyhwbGF0Zm9ybUFyY2hBQkkpKVxuICAgICAgICAgIGlmICghZGlyICYmIHVuaXZlcnNhbFNvdXJjZUJpbnMuaGFzKHBsYXRmb3JtQXJjaEFCSSkpIHtcbiAgICAgICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgICAgIGBbJHtwbGF0Zm9ybUFyY2hBQkl9XSBoYXMgbm8gZGlzdCBkaXIgYnV0IGl0IGlzIHNvdXJjZSBiaW4gZm9yIHVuaXZlcnNhbCBhcmNoLCBza2lwYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWRpcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBkaXN0IGRpciBmb3VuZCBmb3IgJHtmaWxlUGF0aH1gKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGRpc3RGaWxlUGF0aCA9IGpvaW4oZGlyLCBwYXJzZWROYW1lLmJhc2UpXG4gICAgICAgICAgZGVidWcuaW5mbyhcbiAgICAgICAgICAgIGBXcml0ZSBmaWxlIGNvbnRlbnQgdG8gWyR7Y29sb3JzLnllbGxvd0JyaWdodChkaXN0RmlsZVBhdGgpfV1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhkaXN0RmlsZVBhdGgsIHNvdXJjZUNvbnRlbnQpXG4gICAgICAgICAgY29uc3QgZGlzdEZpbGVQYXRoTG9jYWwgPSBqb2luKFxuICAgICAgICAgICAgcGFyc2UocGFja2FnZUpzb25QYXRoKS5kaXIsXG4gICAgICAgICAgICBwYXJzZWROYW1lLmJhc2UsXG4gICAgICAgICAgKVxuICAgICAgICAgIGRlYnVnLmluZm8oXG4gICAgICAgICAgICBgV3JpdGUgZmlsZSBjb250ZW50IHRvIFske2NvbG9ycy55ZWxsb3dCcmlnaHQoZGlzdEZpbGVQYXRoTG9jYWwpfV1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhkaXN0RmlsZVBhdGhMb2NhbCwgc291cmNlQ29udGVudClcbiAgICAgICAgfSksXG4gICAgICApLFxuICApXG5cbiAgY29uc3Qgd2FzaVRhcmdldCA9IHRhcmdldHMuZmluZCgodCkgPT4gdC5wbGF0Zm9ybSA9PT0gJ3dhc2knKVxuICBpZiAod2FzaVRhcmdldCkge1xuICAgIGNvbnN0IHdhc2lEaXIgPSBqb2luKFxuICAgICAgb3B0aW9ucy5jd2QsXG4gICAgICBvcHRpb25zLm5wbURpcixcbiAgICAgIHdhc2lUYXJnZXQucGxhdGZvcm1BcmNoQUJJLFxuICAgIClcbiAgICBjb25zdCBjanNGaWxlID0gam9pbihcbiAgICAgIG9wdGlvbnMuYnVpbGRPdXRwdXREaXIgPz8gb3B0aW9ucy5jd2QsXG4gICAgICBgJHtiaW5hcnlOYW1lfS53YXNpLmNqc2AsXG4gICAgKVxuICAgIGNvbnN0IHdvcmtlckZpbGUgPSBqb2luKFxuICAgICAgb3B0aW9ucy5idWlsZE91dHB1dERpciA/PyBvcHRpb25zLmN3ZCxcbiAgICAgIGB3YXNpLXdvcmtlci5tanNgLFxuICAgIClcbiAgICBjb25zdCBicm93c2VyRW50cnkgPSBqb2luKFxuICAgICAgb3B0aW9ucy5idWlsZE91dHB1dERpciA/PyBvcHRpb25zLmN3ZCxcbiAgICAgIGAke2JpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2AsXG4gICAgKVxuICAgIGNvbnN0IGJyb3dzZXJXb3JrZXJGaWxlID0gam9pbihcbiAgICAgIG9wdGlvbnMuYnVpbGRPdXRwdXREaXIgPz8gb3B0aW9ucy5jd2QsXG4gICAgICBgd2FzaS13b3JrZXItYnJvd3Nlci5tanNgLFxuICAgIClcbiAgICBkZWJ1Zy5pbmZvKFxuICAgICAgYE1vdmUgd2FzaSBiaW5kaW5nIGZpbGUgWyR7Y29sb3JzLnllbGxvd0JyaWdodChcbiAgICAgICAgY2pzRmlsZSxcbiAgICAgICl9XSB0byBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KHdhc2lEaXIpfV1gLFxuICAgIClcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgIGpvaW4od2FzaURpciwgYCR7YmluYXJ5TmFtZX0ud2FzaS5janNgKSxcbiAgICAgIGF3YWl0IHJlYWRGaWxlQXN5bmMoY2pzRmlsZSksXG4gICAgKVxuICAgIGRlYnVnLmluZm8oXG4gICAgICBgTW92ZSB3YXNpIHdvcmtlciBmaWxlIFske2NvbG9ycy55ZWxsb3dCcmlnaHQoXG4gICAgICAgIHdvcmtlckZpbGUsXG4gICAgICApfV0gdG8gWyR7Y29sb3JzLnllbGxvd0JyaWdodCh3YXNpRGlyKX1dYCxcbiAgICApXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICBqb2luKHdhc2lEaXIsIGB3YXNpLXdvcmtlci5tanNgKSxcbiAgICAgIGF3YWl0IHJlYWRGaWxlQXN5bmMod29ya2VyRmlsZSksXG4gICAgKVxuICAgIGRlYnVnLmluZm8oXG4gICAgICBgTW92ZSB3YXNpIGJyb3dzZXIgZW50cnkgZmlsZSBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KFxuICAgICAgICBicm93c2VyRW50cnksXG4gICAgICApfV0gdG8gWyR7Y29sb3JzLnllbGxvd0JyaWdodCh3YXNpRGlyKX1dYCxcbiAgICApXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICBqb2luKHdhc2lEaXIsIGAke2JpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2ApLFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVqcy92aXRlL2lzc3Vlcy84NDI3XG4gICAgICAoYXdhaXQgcmVhZEZpbGVBc3luYyhicm93c2VyRW50cnksICd1dGY4JykpLnJlcGxhY2UoXG4gICAgICAgIGBuZXcgVVJMKCcuL3dhc2ktd29ya2VyLWJyb3dzZXIubWpzJywgaW1wb3J0Lm1ldGEudXJsKWAsXG4gICAgICAgIGBuZXcgVVJMKCcke3BhY2thZ2VOYW1lfS13YXNtMzItd2FzaS93YXNpLXdvcmtlci1icm93c2VyLm1qcycsIGltcG9ydC5tZXRhLnVybClgLFxuICAgICAgKSxcbiAgICApXG4gICAgZGVidWcuaW5mbyhcbiAgICAgIGBNb3ZlIHdhc2kgYnJvd3NlciB3b3JrZXIgZmlsZSBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KFxuICAgICAgICBicm93c2VyV29ya2VyRmlsZSxcbiAgICAgICl9XSB0byBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KHdhc2lEaXIpfV1gLFxuICAgIClcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgIGpvaW4od2FzaURpciwgYHdhc2ktd29ya2VyLWJyb3dzZXIubWpzYCksXG4gICAgICBhd2FpdCByZWFkRmlsZUFzeW5jKGJyb3dzZXJXb3JrZXJGaWxlKSxcbiAgICApXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdE5vZGVCaW5hcmllcyhyb290OiBzdHJpbmcpIHtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyQXN5bmMocm9vdCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG4gIGNvbnN0IG5vZGVCaW5hcmllcyA9IGZpbGVzXG4gICAgLmZpbHRlcihcbiAgICAgIChmaWxlKSA9PlxuICAgICAgICBmaWxlLmlzRmlsZSgpICYmXG4gICAgICAgIChmaWxlLm5hbWUuZW5kc1dpdGgoJy5ub2RlJykgfHwgZmlsZS5uYW1lLmVuZHNXaXRoKCcud2FzbScpKSxcbiAgICApXG4gICAgLm1hcCgoZmlsZSkgPT4gam9pbihyb290LCBmaWxlLm5hbWUpKVxuXG4gIGNvbnN0IGRpcnMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUuaXNEaXJlY3RvcnkoKSlcbiAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgIGlmIChkaXIubmFtZSAhPT0gJ25vZGVfbW9kdWxlcycpIHtcbiAgICAgIG5vZGVCaW5hcmllcy5wdXNoKC4uLihhd2FpdCBjb2xsZWN0Tm9kZUJpbmFyaWVzKGpvaW4ocm9vdCwgZGlyLm5hbWUpKSkpXG4gICAgfVxuICB9XG4gIHJldHVybiBub2RlQmluYXJpZXNcbn1cbiIsImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjbGlwYW5pb24nXG5cbmltcG9ydCB7IGNvbGxlY3RBcnRpZmFjdHMgfSBmcm9tICcuLi9hcGkvYXJ0aWZhY3RzLmpzJ1xuaW1wb3J0IHsgQmFzZUFydGlmYWN0c0NvbW1hbmQgfSBmcm9tICcuLi9kZWYvYXJ0aWZhY3RzLmpzJ1xuXG5leHBvcnQgY2xhc3MgQXJ0aWZhY3RzQ29tbWFuZCBleHRlbmRzIEJhc2VBcnRpZmFjdHNDb21tYW5kIHtcbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246ICdDb3B5IGFydGlmYWN0cyBmcm9tIEdpdGh1YiBBY3Rpb25zIGludG8gc3BlY2lmaWVkIGRpcicsXG4gICAgZXhhbXBsZXM6IFtcbiAgICAgIFtcbiAgICAgICAgJyQwIGFydGlmYWN0cyAtLW91dHB1dC1kaXIgLi9hcnRpZmFjdHMgLS1kaXN0IC4vbnBtJyxcbiAgICAgICAgYENvcHkgW2JpbmFyeU5hbWVdLltwbGF0Zm9ybV0ubm9kZSB1bmRlciBjdXJyZW50IGRpciguKSBpbnRvIHBhY2thZ2VzIHVuZGVyIG5wbSBkaXIuXG5lLmc6IGluZGV4LmxpbnV4LXg2NC1nbnUubm9kZSAtLT4gLi9ucG0vbGludXgteDY0LWdudS9pbmRleC5saW51eC14NjQtZ251Lm5vZGVgLFxuICAgICAgXSxcbiAgICBdLFxuICB9KVxuXG4gIHN0YXRpYyBwYXRocyA9IFtbJ2FydGlmYWN0cyddXVxuXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgY29sbGVjdEFydGlmYWN0cyh0aGlzLmdldE9wdGlvbnMoKSlcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNqc0JpbmRpbmcoXG4gIGxvY2FsTmFtZTogc3RyaW5nLFxuICBwa2dOYW1lOiBzdHJpbmcsXG4gIGlkZW50czogc3RyaW5nW10sXG4gIHBhY2thZ2VWZXJzaW9uPzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2JpbmRpbmdIZWFkZXJ9XG5jb25zdCB7IGNyZWF0ZVJlcXVpcmUgfSA9IHJlcXVpcmUoJ25vZGU6bW9kdWxlJylcbnJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKF9fZmlsZW5hbWUpXG5cbiR7Y3JlYXRlQ29tbW9uQmluZGluZyhsb2NhbE5hbWUsIHBrZ05hbWUsIHBhY2thZ2VWZXJzaW9uKX1cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlQmluZGluZ1xuJHtpZGVudHNcbiAgLm1hcCgoaWRlbnQpID0+IGBtb2R1bGUuZXhwb3J0cy4ke2lkZW50fSA9IG5hdGl2ZUJpbmRpbmcuJHtpZGVudH1gKVxuICAuam9pbignXFxuJyl9XG5gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFc21CaW5kaW5nKFxuICBsb2NhbE5hbWU6IHN0cmluZyxcbiAgcGtnTmFtZTogc3RyaW5nLFxuICBpZGVudHM6IHN0cmluZ1tdLFxuICBwYWNrYWdlVmVyc2lvbj86IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtiaW5kaW5nSGVhZGVyfVxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuY29uc3QgX19kaXJuYW1lID0gbmV3IFVSTCgnLicsIGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWVcblxuJHtjcmVhdGVDb21tb25CaW5kaW5nKGxvY2FsTmFtZSwgcGtnTmFtZSwgcGFja2FnZVZlcnNpb24pfVxuY29uc3QgeyAke2lkZW50cy5qb2luKCcsICcpfSB9ID0gbmF0aXZlQmluZGluZ1xuJHtpZGVudHMubWFwKChpZGVudCkgPT4gYGV4cG9ydCB7ICR7aWRlbnR9IH1gKS5qb2luKCdcXG4nKX1cbmBcbn1cblxuY29uc3QgYmluZGluZ0hlYWRlciA9IGAvLyBwcmV0dGllci1pZ25vcmVcbi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBAdHMtbm9jaGVja1xuLyogYXV0by1nZW5lcmF0ZWQgYnkgTkFQSS1SUyAqL1xuYFxuXG5mdW5jdGlvbiBjcmVhdGVDb21tb25CaW5kaW5nKFxuICBsb2NhbE5hbWU6IHN0cmluZyxcbiAgcGtnTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlVmVyc2lvbj86IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGZ1bmN0aW9uIHJlcXVpcmVUdXBsZSh0dXBsZTogc3RyaW5nLCBpZGVudFNpemUgPSA4KSB7XG4gICAgY29uc3QgaWRlbnRMb3cgPSAnICcucmVwZWF0KGlkZW50U2l6ZSAtIDIpXG4gICAgY29uc3QgaWRlbnQgPSAnICcucmVwZWF0KGlkZW50U2l6ZSlcbiAgICBjb25zdCB2ZXJzaW9uQ2hlY2sgPSBwYWNrYWdlVmVyc2lvblxuICAgICAgPyBgXG4ke2lkZW50TG93fXRyeSB7XG4ke2lkZW50fWNvbnN0IGJpbmRpbmcgPSByZXF1aXJlKCcke3BrZ05hbWV9LSR7dHVwbGV9JylcbiR7aWRlbnR9Y29uc3QgYmluZGluZ1BhY2thZ2VWZXJzaW9uID0gcmVxdWlyZSgnJHtwa2dOYW1lfS0ke3R1cGxlfS9wYWNrYWdlLmpzb24nKS52ZXJzaW9uXG4ke2lkZW50fWlmIChiaW5kaW5nUGFja2FnZVZlcnNpb24gIT09ICcke3BhY2thZ2VWZXJzaW9ufScgJiYgcHJvY2Vzcy5lbnYuTkFQSV9SU19FTkZPUkNFX1ZFUlNJT05fQ0hFQ0sgJiYgcHJvY2Vzcy5lbnYuTkFQSV9SU19FTkZPUkNFX1ZFUlNJT05fQ0hFQ0sgIT09ICcwJykge1xuJHtpZGVudH0gIHRocm93IG5ldyBFcnJvcihcXGBOYXRpdmUgYmluZGluZyBwYWNrYWdlIHZlcnNpb24gbWlzbWF0Y2gsIGV4cGVjdGVkICR7cGFja2FnZVZlcnNpb259IGJ1dCBnb3QgXFwke2JpbmRpbmdQYWNrYWdlVmVyc2lvbn0uIFlvdSBjYW4gcmVpbnN0YWxsIGRlcGVuZGVuY2llcyB0byBmaXggdGhpcyBpc3N1ZS5cXGApXG4ke2lkZW50fX1cbiR7aWRlbnR9cmV0dXJuIGJpbmRpbmdcbiR7aWRlbnRMb3d9fSBjYXRjaCAoZSkge1xuJHtpZGVudH1sb2FkRXJyb3JzLnB1c2goZSlcbiR7aWRlbnRMb3d9fWBcbiAgICAgIDogYFxuJHtpZGVudExvd310cnkge1xuJHtpZGVudH1yZXR1cm4gcmVxdWlyZSgnJHtwa2dOYW1lfS0ke3R1cGxlfScpXG4ke2lkZW50TG93fX0gY2F0Y2ggKGUpIHtcbiR7aWRlbnR9bG9hZEVycm9ycy5wdXNoKGUpXG4ke2lkZW50TG93fX1gXG4gICAgcmV0dXJuIGB0cnkge1xuJHtpZGVudH1yZXR1cm4gcmVxdWlyZSgnLi8ke2xvY2FsTmFtZX0uJHt0dXBsZX0ubm9kZScpXG4ke2lkZW50TG93fX0gY2F0Y2ggKGUpIHtcbiR7aWRlbnR9bG9hZEVycm9ycy5wdXNoKGUpXG4ke2lkZW50TG93fX0ke3ZlcnNpb25DaGVja31gXG4gIH1cblxuICByZXR1cm4gYGNvbnN0IHsgcmVhZEZpbGVTeW5jIH0gPSByZXF1aXJlKCdub2RlOmZzJylcbmxldCBuYXRpdmVCaW5kaW5nID0gbnVsbFxuY29uc3QgbG9hZEVycm9ycyA9IFtdXG5cbmNvbnN0IGlzTXVzbCA9ICgpID0+IHtcbiAgbGV0IG11c2wgPSBmYWxzZVxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xuICAgIG11c2wgPSBpc011c2xGcm9tRmlsZXN5c3RlbSgpXG4gICAgaWYgKG11c2wgPT09IG51bGwpIHtcbiAgICAgIG11c2wgPSBpc011c2xGcm9tUmVwb3J0KClcbiAgICB9XG4gICAgaWYgKG11c2wgPT09IG51bGwpIHtcbiAgICAgIG11c2wgPSBpc011c2xGcm9tQ2hpbGRQcm9jZXNzKClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG11c2xcbn1cblxuY29uc3QgaXNGaWxlTXVzbCA9IChmKSA9PiBmLmluY2x1ZGVzKCdsaWJjLm11c2wtJykgfHwgZi5pbmNsdWRlcygnbGQtbXVzbC0nKVxuXG5jb25zdCBpc011c2xGcm9tRmlsZXN5c3RlbSA9ICgpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVhZEZpbGVTeW5jKCcvdXNyL2Jpbi9sZGQnLCAndXRmLTgnKS5pbmNsdWRlcygnbXVzbCcpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuY29uc3QgaXNNdXNsRnJvbVJlcG9ydCA9ICgpID0+IHtcbiAgbGV0IHJlcG9ydCA9IG51bGxcbiAgaWYgKHR5cGVvZiBwcm9jZXNzLnJlcG9ydD8uZ2V0UmVwb3J0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcHJvY2Vzcy5yZXBvcnQuZXhjbHVkZU5ldHdvcmsgPSB0cnVlXG4gICAgcmVwb3J0ID0gcHJvY2Vzcy5yZXBvcnQuZ2V0UmVwb3J0KClcbiAgfVxuICBpZiAoIXJlcG9ydCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgaWYgKHJlcG9ydC5oZWFkZXIgJiYgcmVwb3J0LmhlYWRlci5nbGliY1ZlcnNpb25SdW50aW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkocmVwb3J0LnNoYXJlZE9iamVjdHMpKSB7XG4gICAgaWYgKHJlcG9ydC5zaGFyZWRPYmplY3RzLnNvbWUoaXNGaWxlTXVzbCkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCBpc011c2xGcm9tQ2hpbGRQcm9jZXNzID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY1N5bmMoJ2xkZCAtLXZlcnNpb24nLCB7IGVuY29kaW5nOiAndXRmOCcgfSkuaW5jbHVkZXMoJ211c2wnKVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWYgd2UgcmVhY2ggdGhpcyBjYXNlLCB3ZSBkb24ndCBrbm93IGlmIHRoZSBzeXN0ZW0gaXMgbXVzbCBvciBub3QsIHNvIGlzIGJldHRlciB0byBqdXN0IGZhbGxiYWNrIHRvIGZhbHNlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWlyZU5hdGl2ZSgpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5BUElfUlNfTkFUSVZFX0xJQlJBUllfUEFUSCkge1xuICAgIHRyeSB7XG4gICAgICBuYXRpdmVCaW5kaW5nID0gcmVxdWlyZShwcm9jZXNzLmVudi5OQVBJX1JTX05BVElWRV9MSUJSQVJZX1BBVEgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKGVycilcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKSB7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybTY0Jykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ2FuZHJvaWQtYXJtNjQnKX1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybScpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdhbmRyb2lkLWFybS1lYWJpJyl9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRFcnJvcnMucHVzaChuZXcgRXJyb3IoXFxgVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIG9uIEFuZHJvaWQgXFwke3Byb2Nlc3MuYXJjaH1cXGApKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCd3aW4zMi14NjQtbXN2YycpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnaWEzMicpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCd3aW4zMi1pYTMyLW1zdmMnKX1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybTY0Jykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ3dpbjMyLWFybTY0LW1zdmMnKX1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgb24gV2luZG93czogXFwke3Byb2Nlc3MuYXJjaH1cXGApKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgICR7cmVxdWlyZVR1cGxlKCdkYXJ3aW4tdW5pdmVyc2FsJywgNil9XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdkYXJ3aW4teDY0Jyl9XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmFyY2ggPT09ICdhcm02NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdkYXJ3aW4tYXJtNjQnKX1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgb24gbWFjT1M6IFxcJHtwcm9jZXNzLmFyY2h9XFxgKSlcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2ZyZWVic2QnKSB7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdmcmVlYnNkLXg2NCcpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnZnJlZWJzZC1hcm02NCcpfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkRXJyb3JzLnB1c2gobmV3IEVycm9yKFxcYFVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSBvbiBGcmVlQlNEOiBcXCR7cHJvY2Vzcy5hcmNofVxcYCkpXG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdsaW51eCcpIHtcbiAgICBpZiAocHJvY2Vzcy5hcmNoID09PSAneDY0Jykge1xuICAgICAgaWYgKGlzTXVzbCgpKSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC14NjQtbXVzbCcsIDEwKX1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC14NjQtZ251JywgMTApfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnKSB7XG4gICAgICBpZiAoaXNNdXNsKCkpIHtcbiAgICAgICAgJHtyZXF1aXJlVHVwbGUoJ2xpbnV4LWFybTY0LW11c2wnLCAxMCl9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgtYXJtNjQtZ251JywgMTApfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtJykge1xuICAgICAgaWYgKGlzTXVzbCgpKSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC1hcm0tbXVzbGVhYmloZicsIDEwKX1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC1hcm0tZ251ZWFiaWhmJywgMTApfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAncmlzY3Y2NCcpIHtcbiAgICAgIGlmIChpc011c2woKSkge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgtcmlzY3Y2NC1tdXNsJywgMTApfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHtyZXF1aXJlVHVwbGUoJ2xpbnV4LXJpc2N2NjQtZ251JywgMTApfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAncHBjNjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgtcHBjNjQtZ251Jyl9XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmFyY2ggPT09ICdzMzkweCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC1zMzkweC1nbnUnKX1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgb24gTGludXg6IFxcJHtwcm9jZXNzLmFyY2h9XFxgKSlcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ29wZW5oYXJtb255Jykge1xuICAgIGlmIChwcm9jZXNzLmFyY2ggPT09ICdhcm02NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdvcGVuaGFybW9ueS1hcm02NCcpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAneDY0Jykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ29wZW5oYXJtb255LXg2NCcpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtJykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ29wZW5oYXJtb255LWFybScpfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkRXJyb3JzLnB1c2gobmV3IEVycm9yKFxcYFVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSBvbiBPcGVuSGFybW9ueTogXFwke3Byb2Nlc3MuYXJjaH1cXGApKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2FkRXJyb3JzLnB1c2gobmV3IEVycm9yKFxcYFVuc3VwcG9ydGVkIE9TOiBcXCR7cHJvY2Vzcy5wbGF0Zm9ybX0sIGFyY2hpdGVjdHVyZTogXFwke3Byb2Nlc3MuYXJjaH1cXGApKVxuICB9XG59XG5cbm5hdGl2ZUJpbmRpbmcgPSByZXF1aXJlTmF0aXZlKClcblxuaWYgKCFuYXRpdmVCaW5kaW5nIHx8IHByb2Nlc3MuZW52Lk5BUElfUlNfRk9SQ0VfV0FTSSkge1xuICB0cnkge1xuICAgIG5hdGl2ZUJpbmRpbmcgPSByZXF1aXJlKCcuLyR7bG9jYWxOYW1lfS53YXNpLmNqcycpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OQVBJX1JTX0ZPUkNFX1dBU0kpIHtcbiAgICAgIGxvYWRFcnJvcnMucHVzaChlcnIpXG4gICAgfVxuICB9XG4gIGlmICghbmF0aXZlQmluZGluZykge1xuICAgIHRyeSB7XG4gICAgICBuYXRpdmVCaW5kaW5nID0gcmVxdWlyZSgnJHtwa2dOYW1lfS13YXNtMzItd2FzaScpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTkFQSV9SU19GT1JDRV9XQVNJKSB7XG4gICAgICAgIGxvYWRFcnJvcnMucHVzaChlcnIpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmlmICghbmF0aXZlQmluZGluZykge1xuICBpZiAobG9hZEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXFxgQ2Fubm90IGZpbmQgbmF0aXZlIGJpbmRpbmcuIFxcYCArXG4gICAgICAgIFxcYG5wbSBoYXMgYSBidWcgcmVsYXRlZCB0byBvcHRpb25hbCBkZXBlbmRlbmNpZXMgKGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vY2xpL2lzc3Vlcy80ODI4KS4gXFxgICtcbiAgICAgICAgJ1BsZWFzZSB0cnkgXFxgbnBtIGlcXGAgYWdhaW4gYWZ0ZXIgcmVtb3ZpbmcgYm90aCBwYWNrYWdlLWxvY2suanNvbiBhbmQgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeS4nLFxuICAgICAgeyBjYXVzZTogbG9hZEVycm9ycyB9XG4gICAgKVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcXGBGYWlsZWQgdG8gbG9hZCBuYXRpdmUgYmluZGluZ1xcYClcbn1cbmBcbn1cbiIsImV4cG9ydCBjb25zdCBjcmVhdGVXYXNpQnJvd3NlckJpbmRpbmcgPSAoXG4gIHdhc2lGaWxlbmFtZTogc3RyaW5nLFxuICBpbml0aWFsTWVtb3J5ID0gNDAwMCxcbiAgbWF4aW11bU1lbW9yeSA9IDY1NTM2LFxuICBmcyA9IGZhbHNlLFxuICBhc3luY0luaXQgPSBmYWxzZSxcbiAgYnVmZmVyID0gZmFsc2UsXG4pID0+IHtcbiAgY29uc3QgZnNJbXBvcnQgPSBmc1xuICAgID8gYnVmZmVyXG4gICAgICA/IGBpbXBvcnQgeyBtZW1mcywgQnVmZmVyIH0gZnJvbSAnQG5hcGktcnMvd2FzbS1ydW50aW1lL2ZzJ2BcbiAgICAgIDogYGltcG9ydCB7IG1lbWZzIH0gZnJvbSAnQG5hcGktcnMvd2FzbS1ydW50aW1lL2ZzJ2BcbiAgICA6ICcnXG4gIGNvbnN0IGJ1ZmZlckltcG9ydCA9IGJ1ZmZlciAmJiAhZnMgPyBgaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJ2AgOiAnJ1xuICBjb25zdCB3YXNpQ3JlYXRpb24gPSBmc1xuICAgID8gYFxuZXhwb3J0IGNvbnN0IHsgZnM6IF9fZnMsIHZvbDogX192b2x1bWUgfSA9IG1lbWZzKClcblxuY29uc3QgX193YXNpID0gbmV3IF9fV0FTSSh7XG4gIHZlcnNpb246ICdwcmV2aWV3MScsXG4gIGZzOiBfX2ZzLFxuICBwcmVvcGVuczoge1xuICAgICcvJzogJy8nLFxuICB9LFxufSlgXG4gICAgOiBgXG5jb25zdCBfX3dhc2kgPSBuZXcgX19XQVNJKHtcbiAgdmVyc2lvbjogJ3ByZXZpZXcxJyxcbn0pYFxuXG4gIGNvbnN0IHdvcmtlckZzSGFuZGxlciA9IGZzXG4gICAgPyBgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgX193YXNtQ3JlYXRlT25NZXNzYWdlRm9yRnNQcm94eShfX2ZzKSlcXG5gXG4gICAgOiAnJ1xuXG4gIGNvbnN0IGVtbmFwaUluamVjdEJ1ZmZlciA9IGJ1ZmZlclxuICAgID8gJ19fZW1uYXBpQ29udGV4dC5mZWF0dXJlLkJ1ZmZlciA9IEJ1ZmZlcidcbiAgICA6ICcnXG4gIGNvbnN0IGVtbmFwaUluc3RhbnRpYXRlSW1wb3J0ID0gYXN5bmNJbml0XG4gICAgPyBgaW5zdGFudGlhdGVOYXBpTW9kdWxlIGFzIF9fZW1uYXBpSW5zdGFudGlhdGVOYXBpTW9kdWxlYFxuICAgIDogYGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMgYXMgX19lbW5hcGlJbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jYFxuICBjb25zdCBlbW5hcGlJbnN0YW50aWF0ZUNhbGwgPSBhc3luY0luaXRcbiAgICA/IGBhd2FpdCBfX2VtbmFwaUluc3RhbnRpYXRlTmFwaU1vZHVsZWBcbiAgICA6IGBfX2VtbmFwaUluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmNgXG5cbiAgcmV0dXJuIGBpbXBvcnQge1xuICBjcmVhdGVPbk1lc3NhZ2UgYXMgX193YXNtQ3JlYXRlT25NZXNzYWdlRm9yRnNQcm94eSxcbiAgZ2V0RGVmYXVsdENvbnRleHQgYXMgX19lbW5hcGlHZXREZWZhdWx0Q29udGV4dCxcbiAgJHtlbW5hcGlJbnN0YW50aWF0ZUltcG9ydH0sXG4gIFdBU0kgYXMgX19XQVNJLFxufSBmcm9tICdAbmFwaS1ycy93YXNtLXJ1bnRpbWUnXG4ke2ZzSW1wb3J0fVxuJHtidWZmZXJJbXBvcnR9XG4ke3dhc2lDcmVhdGlvbn1cblxuY29uc3QgX193YXNtVXJsID0gbmV3IFVSTCgnLi8ke3dhc2lGaWxlbmFtZX0ud2FzbScsIGltcG9ydC5tZXRhLnVybCkuaHJlZlxuY29uc3QgX19lbW5hcGlDb250ZXh0ID0gX19lbW5hcGlHZXREZWZhdWx0Q29udGV4dCgpXG4ke2VtbmFwaUluamVjdEJ1ZmZlcn1cblxuY29uc3QgX19zaGFyZWRNZW1vcnkgPSBuZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtcbiAgaW5pdGlhbDogJHtpbml0aWFsTWVtb3J5fSxcbiAgbWF4aW11bTogJHttYXhpbXVtTWVtb3J5fSxcbiAgc2hhcmVkOiB0cnVlLFxufSlcblxuY29uc3QgX193YXNtRmlsZSA9IGF3YWl0IGZldGNoKF9fd2FzbVVybCkudGhlbigocmVzKSA9PiByZXMuYXJyYXlCdWZmZXIoKSlcblxuY29uc3Qge1xuICBpbnN0YW5jZTogX19uYXBpSW5zdGFuY2UsXG4gIG1vZHVsZTogX193YXNpTW9kdWxlLFxuICBuYXBpTW9kdWxlOiBfX25hcGlNb2R1bGUsXG59ID0gJHtlbW5hcGlJbnN0YW50aWF0ZUNhbGx9KF9fd2FzbUZpbGUsIHtcbiAgY29udGV4dDogX19lbW5hcGlDb250ZXh0LFxuICBhc3luY1dvcmtQb29sU2l6ZTogNCxcbiAgd2FzaTogX193YXNpLFxuICBvbkNyZWF0ZVdvcmtlcigpIHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKG5ldyBVUkwoJy4vd2FzaS13b3JrZXItYnJvd3Nlci5tanMnLCBpbXBvcnQubWV0YS51cmwpLCB7XG4gICAgICB0eXBlOiAnbW9kdWxlJyxcbiAgICB9KVxuJHt3b3JrZXJGc0hhbmRsZXJ9XG4gICAgcmV0dXJuIHdvcmtlclxuICB9LFxuICBvdmVyd3JpdGVJbXBvcnRzKGltcG9ydE9iamVjdCkge1xuICAgIGltcG9ydE9iamVjdC5lbnYgPSB7XG4gICAgICAuLi5pbXBvcnRPYmplY3QuZW52LFxuICAgICAgLi4uaW1wb3J0T2JqZWN0Lm5hcGksXG4gICAgICAuLi5pbXBvcnRPYmplY3QuZW1uYXBpLFxuICAgICAgbWVtb3J5OiBfX3NoYXJlZE1lbW9yeSxcbiAgICB9XG4gICAgcmV0dXJuIGltcG9ydE9iamVjdFxuICB9LFxuICBiZWZvcmVJbml0KHsgaW5zdGFuY2UgfSkge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhpbnN0YW5jZS5leHBvcnRzKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnX19uYXBpX3JlZ2lzdGVyX18nKSkge1xuICAgICAgICBpbnN0YW5jZS5leHBvcnRzW25hbWVdKClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KVxuYFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlV2FzaUJpbmRpbmcgPSAoXG4gIHdhc21GaWxlTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBpbml0aWFsTWVtb3J5ID0gNDAwMCxcbiAgbWF4aW11bU1lbW9yeSA9IDY1NTM2LFxuKSA9PiBgLyogZXNsaW50LWRpc2FibGUgKi9cbi8qIHByZXR0aWVyLWlnbm9yZSAqL1xuXG4vKiBhdXRvLWdlbmVyYXRlZCBieSBOQVBJLVJTICovXG5cbmNvbnN0IF9fbm9kZUZzID0gcmVxdWlyZSgnbm9kZTpmcycpXG5jb25zdCBfX25vZGVQYXRoID0gcmVxdWlyZSgnbm9kZTpwYXRoJylcbmNvbnN0IHsgV0FTSTogX19ub2RlV0FTSSB9ID0gcmVxdWlyZSgnbm9kZTp3YXNpJylcbmNvbnN0IHsgV29ya2VyIH0gPSByZXF1aXJlKCdub2RlOndvcmtlcl90aHJlYWRzJylcblxuY29uc3Qge1xuICBjcmVhdGVPbk1lc3NhZ2U6IF9fd2FzbUNyZWF0ZU9uTWVzc2FnZUZvckZzUHJveHksXG4gIGdldERlZmF1bHRDb250ZXh0OiBfX2VtbmFwaUdldERlZmF1bHRDb250ZXh0LFxuICBpbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jOiBfX2VtbmFwaUluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMsXG59ID0gcmVxdWlyZSgnQG5hcGktcnMvd2FzbS1ydW50aW1lJylcblxuY29uc3QgX19yb290RGlyID0gX19ub2RlUGF0aC5wYXJzZShwcm9jZXNzLmN3ZCgpKS5yb290XG5cbmNvbnN0IF9fd2FzaSA9IG5ldyBfX25vZGVXQVNJKHtcbiAgdmVyc2lvbjogJ3ByZXZpZXcxJyxcbiAgZW52OiBwcm9jZXNzLmVudixcbiAgcHJlb3BlbnM6IHtcbiAgICBbX19yb290RGlyXTogX19yb290RGlyLFxuICB9XG59KVxuXG5jb25zdCBfX2VtbmFwaUNvbnRleHQgPSBfX2VtbmFwaUdldERlZmF1bHRDb250ZXh0KClcblxuY29uc3QgX19zaGFyZWRNZW1vcnkgPSBuZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtcbiAgaW5pdGlhbDogJHtpbml0aWFsTWVtb3J5fSxcbiAgbWF4aW11bTogJHttYXhpbXVtTWVtb3J5fSxcbiAgc2hhcmVkOiB0cnVlLFxufSlcblxubGV0IF9fd2FzbUZpbGVQYXRoID0gX19ub2RlUGF0aC5qb2luKF9fZGlybmFtZSwgJyR7d2FzbUZpbGVOYW1lfS53YXNtJylcbmNvbnN0IF9fd2FzbURlYnVnRmlsZVBhdGggPSBfX25vZGVQYXRoLmpvaW4oX19kaXJuYW1lLCAnJHt3YXNtRmlsZU5hbWV9LmRlYnVnLndhc20nKVxuXG5pZiAoX19ub2RlRnMuZXhpc3RzU3luYyhfX3dhc21EZWJ1Z0ZpbGVQYXRoKSkge1xuICBfX3dhc21GaWxlUGF0aCA9IF9fd2FzbURlYnVnRmlsZVBhdGhcbn0gZWxzZSBpZiAoIV9fbm9kZUZzLmV4aXN0c1N5bmMoX193YXNtRmlsZVBhdGgpKSB7XG4gIHRyeSB7XG4gICAgX193YXNtRmlsZVBhdGggPSBfX25vZGVQYXRoLnJlc29sdmUoJyR7cGFja2FnZU5hbWV9LXdhc20zMi13YXNpJylcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCAke3dhc21GaWxlTmFtZX0ud2FzbSBmaWxlLCBhbmQgJHtwYWNrYWdlTmFtZX0td2FzbTMyLXdhc2kgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkLicpXG4gIH1cbn1cblxuY29uc3QgeyBpbnN0YW5jZTogX19uYXBpSW5zdGFuY2UsIG1vZHVsZTogX193YXNpTW9kdWxlLCBuYXBpTW9kdWxlOiBfX25hcGlNb2R1bGUgfSA9IF9fZW1uYXBpSW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYyhfX25vZGVGcy5yZWFkRmlsZVN5bmMoX193YXNtRmlsZVBhdGgpLCB7XG4gIGNvbnRleHQ6IF9fZW1uYXBpQ29udGV4dCxcbiAgYXN5bmNXb3JrUG9vbFNpemU6IChmdW5jdGlvbigpIHtcbiAgICBjb25zdCB0aHJlYWRzU2l6ZUZyb21FbnYgPSBOdW1iZXIocHJvY2Vzcy5lbnYuTkFQSV9SU19BU1lOQ19XT1JLX1BPT0xfU0laRSA/PyBwcm9jZXNzLmVudi5VVl9USFJFQURQT09MX1NJWkUpXG4gICAgLy8gTmFOID4gMCBpcyBmYWxzZVxuICAgIGlmICh0aHJlYWRzU2l6ZUZyb21FbnYgPiAwKSB7XG4gICAgICByZXR1cm4gdGhyZWFkc1NpemVGcm9tRW52XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA0XG4gICAgfVxuICB9KSgpLFxuICByZXVzZVdvcmtlcjogdHJ1ZSxcbiAgd2FzaTogX193YXNpLFxuICBvbkNyZWF0ZVdvcmtlcigpIHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKF9fbm9kZVBhdGguam9pbihfX2Rpcm5hbWUsICd3YXNpLXdvcmtlci5tanMnKSwge1xuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICB9KVxuICAgIHdvcmtlci5vbm1lc3NhZ2UgPSAoeyBkYXRhIH0pID0+IHtcbiAgICAgIF9fd2FzbUNyZWF0ZU9uTWVzc2FnZUZvckZzUHJveHkoX19ub2RlRnMpKGRhdGEpXG4gICAgfVxuXG4gICAgLy8gVGhlIG1haW4gdGhyZWFkIG9mIE5vZGUuanMgd2FpdHMgZm9yIGFsbCB0aGUgYWN0aXZlIGhhbmRsZXMgYmVmb3JlIGV4aXRpbmcuXG4gICAgLy8gQnV0IFJ1c3QgdGhyZWFkcyBhcmUgbmV2ZXIgd2FpdGVkIHdpdGhvdXQgXFxgdGhyZWFkOjpqb2luXFxgLlxuICAgIC8vIFNvIGhlcmUgd2UgaGFjayB0aGUgY29kZSBvZiBOb2RlLmpzIHRvIHByZXZlbnQgdGhlIHdvcmtlcnMgZnJvbSBiZWluZyByZWZlcmVuY2VkIChhY3RpdmUpLlxuICAgIC8vIEFjY29yZGluZyB0byBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi8xOWUwZDQ3MjcyOGM3OWQ0MThiNzRiZGRmZjU4OGJlYTcwYTQwM2QwL2xpYi9pbnRlcm5hbC93b3JrZXIuanMjTDQxNSxcbiAgICAvLyBhIHdvcmtlciBpcyBjb25zaXN0IG9mIHR3byBoYW5kbGVzOiBrUHVibGljUG9ydCBhbmQga0hhbmRsZS5cbiAgICB7XG4gICAgICBjb25zdCBrUHVibGljUG9ydCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMod29ya2VyKS5maW5kKHMgPT5cbiAgICAgICAgcy50b1N0cmluZygpLmluY2x1ZGVzKFwia1B1YmxpY1BvcnRcIilcbiAgICAgICk7XG4gICAgICBpZiAoa1B1YmxpY1BvcnQpIHtcbiAgICAgICAgd29ya2VyW2tQdWJsaWNQb3J0XS5yZWYgPSAoKSA9PiB7fTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga0hhbmRsZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMod29ya2VyKS5maW5kKHMgPT5cbiAgICAgICAgcy50b1N0cmluZygpLmluY2x1ZGVzKFwia0hhbmRsZVwiKVxuICAgICAgKTtcbiAgICAgIGlmIChrSGFuZGxlKSB7XG4gICAgICAgIHdvcmtlcltrSGFuZGxlXS5yZWYgPSAoKSA9PiB7fTtcbiAgICAgIH1cblxuICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgfVxuICAgIHJldHVybiB3b3JrZXJcbiAgfSxcbiAgb3ZlcndyaXRlSW1wb3J0cyhpbXBvcnRPYmplY3QpIHtcbiAgICBpbXBvcnRPYmplY3QuZW52ID0ge1xuICAgICAgLi4uaW1wb3J0T2JqZWN0LmVudixcbiAgICAgIC4uLmltcG9ydE9iamVjdC5uYXBpLFxuICAgICAgLi4uaW1wb3J0T2JqZWN0LmVtbmFwaSxcbiAgICAgIG1lbW9yeTogX19zaGFyZWRNZW1vcnksXG4gICAgfVxuICAgIHJldHVybiBpbXBvcnRPYmplY3RcbiAgfSxcbiAgYmVmb3JlSW5pdCh7IGluc3RhbmNlIH0pIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoaW5zdGFuY2UuZXhwb3J0cykpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ19fbmFwaV9yZWdpc3Rlcl9fJykpIHtcbiAgICAgICAgaW5zdGFuY2UuZXhwb3J0c1tuYW1lXSgpXG4gICAgICB9XG4gICAgfVxuICB9LFxufSlcbmBcbiIsImV4cG9ydCBjb25zdCBXQVNJX1dPUktFUl9URU1QTEFURSA9IGBpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgV0FTSSB9IGZyb20gXCJub2RlOndhc2lcIjtcbmltcG9ydCB7IHBhcmVudFBvcnQsIFdvcmtlciB9IGZyb20gXCJub2RlOndvcmtlcl90aHJlYWRzXCI7XG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmNvbnN0IHsgaW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYywgTWVzc2FnZUhhbmRsZXIsIGdldERlZmF1bHRDb250ZXh0IH0gPSByZXF1aXJlKFwiQG5hcGktcnMvd2FzbS1ydW50aW1lXCIpO1xuXG5pZiAocGFyZW50UG9ydCkge1xuICBwYXJlbnRQb3J0Lm9uKFwibWVzc2FnZVwiLCAoZGF0YSkgPT4ge1xuICAgIGdsb2JhbFRoaXMub25tZXNzYWdlKHsgZGF0YSB9KTtcbiAgfSk7XG59XG5cbk9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge1xuICBzZWxmOiBnbG9iYWxUaGlzLFxuICByZXF1aXJlLFxuICBXb3JrZXIsXG4gIGltcG9ydFNjcmlwdHM6IGZ1bmN0aW9uIChmKSB7XG4gICAgOygwLCBldmFsKShmcy5yZWFkRmlsZVN5bmMoZiwgXCJ1dGY4XCIpICsgXCIvLyMgc291cmNlVVJMPVwiICsgZik7XG4gIH0sXG4gIHBvc3RNZXNzYWdlOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgaWYgKHBhcmVudFBvcnQpIHtcbiAgICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICB9XG4gIH0sXG59KTtcblxuY29uc3QgZW1uYXBpQ29udGV4dCA9IGdldERlZmF1bHRDb250ZXh0KCk7XG5cbmNvbnN0IF9fcm9vdERpciA9IHBhcnNlKHByb2Nlc3MuY3dkKCkpLnJvb3Q7XG5cbmNvbnN0IGhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoe1xuICBvbkxvYWQoeyB3YXNtTW9kdWxlLCB3YXNtTWVtb3J5IH0pIHtcbiAgICBjb25zdCB3YXNpID0gbmV3IFdBU0koe1xuICAgICAgdmVyc2lvbjogJ3ByZXZpZXcxJyxcbiAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICBwcmVvcGVuczoge1xuICAgICAgICBbX19yb290RGlyXTogX19yb290RGlyLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jKHdhc21Nb2R1bGUsIHtcbiAgICAgIGNoaWxkVGhyZWFkOiB0cnVlLFxuICAgICAgd2FzaSxcbiAgICAgIGNvbnRleHQ6IGVtbmFwaUNvbnRleHQsXG4gICAgICBvdmVyd3JpdGVJbXBvcnRzKGltcG9ydE9iamVjdCkge1xuICAgICAgICBpbXBvcnRPYmplY3QuZW52ID0ge1xuICAgICAgICAgIC4uLmltcG9ydE9iamVjdC5lbnYsXG4gICAgICAgICAgLi4uaW1wb3J0T2JqZWN0Lm5hcGksXG4gICAgICAgICAgLi4uaW1wb3J0T2JqZWN0LmVtbmFwaSxcbiAgICAgICAgICBtZW1vcnk6IHdhc21NZW1vcnlcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0sXG59KTtcblxuZ2xvYmFsVGhpcy5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICBoYW5kbGVyLmhhbmRsZShlKTtcbn07XG5gXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVXYXNpQnJvd3NlcldvcmtlckJpbmRpbmcgPSAoZnM6IGJvb2xlYW4pID0+IHtcbiAgY29uc3QgZnNJbXBvcnQgPSBmc1xuICAgID8gYGltcG9ydCB7IGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMsIE1lc3NhZ2VIYW5kbGVyLCBXQVNJLCBjcmVhdGVGc1Byb3h5IH0gZnJvbSAnQG5hcGktcnMvd2FzbS1ydW50aW1lJ1xuaW1wb3J0IHsgbWVtZnNFeHBvcnRlZCBhcyBfX21lbWZzRXhwb3J0ZWQgfSBmcm9tICdAbmFwaS1ycy93YXNtLXJ1bnRpbWUvZnMnXG5cbmNvbnN0IGZzID0gY3JlYXRlRnNQcm94eShfX21lbWZzRXhwb3J0ZWQpYFxuICAgIDogYGltcG9ydCB7IGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMsIE1lc3NhZ2VIYW5kbGVyLCBXQVNJIH0gZnJvbSAnQG5hcGktcnMvd2FzbS1ydW50aW1lJ2BcbiAgY29uc3Qgd2FzaUNyZWF0aW9uID0gZnNcbiAgICA/IGBjb25zdCB3YXNpID0gbmV3IFdBU0koe1xuICAgICAgZnMsXG4gICAgICBwcmVvcGVuczoge1xuICAgICAgICAnLyc6ICcvJyxcbiAgICAgIH0sXG4gICAgICBwcmludDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpXG4gICAgICB9LFxuICAgICAgcHJpbnRFcnI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cylcbiAgICAgIH0sXG4gICAgfSlgXG4gICAgOiBgY29uc3Qgd2FzaSA9IG5ldyBXQVNJKHtcbiAgICAgIHByaW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cylcbiAgICAgIH0sXG4gICAgICBwcmludEVycjogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKVxuICAgICAgfSxcbiAgICB9KWBcbiAgcmV0dXJuIGAke2ZzSW1wb3J0fVxuXG5jb25zdCBoYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKHtcbiAgb25Mb2FkKHsgd2FzbU1vZHVsZSwgd2FzbU1lbW9yeSB9KSB7XG4gICAgJHt3YXNpQ3JlYXRpb259XG4gICAgcmV0dXJuIGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMod2FzbU1vZHVsZSwge1xuICAgICAgY2hpbGRUaHJlYWQ6IHRydWUsXG4gICAgICB3YXNpLFxuICAgICAgb3ZlcndyaXRlSW1wb3J0cyhpbXBvcnRPYmplY3QpIHtcbiAgICAgICAgaW1wb3J0T2JqZWN0LmVudiA9IHtcbiAgICAgICAgICAuLi5pbXBvcnRPYmplY3QuZW52LFxuICAgICAgICAgIC4uLmltcG9ydE9iamVjdC5uYXBpLFxuICAgICAgICAgIC4uLmltcG9ydE9iamVjdC5lbW5hcGksXG4gICAgICAgICAgbWVtb3J5OiB3YXNtTWVtb3J5LFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pXG4gIH0sXG59KVxuXG5nbG9iYWxUaGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gIGhhbmRsZXIuaGFuZGxlKGUpXG59XG5gXG59XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2VzcydcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0bydcbmltcG9ydCB7IGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcm1TeW5jIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSdcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJ1xuaW1wb3J0IHsgcGFyc2UsIGpvaW4sIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCAqIGFzIGNvbG9ycyBmcm9tICdjb2xvcmV0dGUnXG5cbmltcG9ydCB7IEJ1aWxkT3B0aW9ucyBhcyBSYXdCdWlsZE9wdGlvbnMgfSBmcm9tICcuLi9kZWYvYnVpbGQuanMnXG5pbXBvcnQge1xuICBDTElfVkVSU0lPTixcbiAgY29weUZpbGVBc3luYyxcbiAgQ3JhdGUsXG4gIGRlYnVnRmFjdG9yeSxcbiAgREVGQVVMVF9UWVBFX0RFRl9IRUFERVIsXG4gIGZpbGVFeGlzdHMsXG4gIGdldFN5c3RlbURlZmF1bHRUYXJnZXQsXG4gIGdldFRhcmdldExpbmtlcixcbiAgbWtkaXJBc3luYyxcbiAgTmFwaUNvbmZpZyxcbiAgcGFyc2VNZXRhZGF0YSxcbiAgcGFyc2VUcmlwbGUsXG4gIHByb2Nlc3NUeXBlRGVmLFxuICByZWFkRmlsZUFzeW5jLFxuICByZWFkTmFwaUNvbmZpZyxcbiAgVGFyZ2V0LFxuICB0YXJnZXRUb0VudlZhcixcbiAgdHJ5SW5zdGFsbENhcmdvQmluYXJ5LFxuICB1bmxpbmtBc3luYyxcbiAgd3JpdGVGaWxlQXN5bmMsXG4gIGRpckV4aXN0c0FzeW5jLFxuICByZWFkZGlyQXN5bmMsXG4gIENhcmdvV29ya3NwYWNlTWV0YWRhdGEsXG59IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuXG5pbXBvcnQgeyBjcmVhdGVDanNCaW5kaW5nLCBjcmVhdGVFc21CaW5kaW5nIH0gZnJvbSAnLi90ZW1wbGF0ZXMvaW5kZXguanMnXG5pbXBvcnQge1xuICBjcmVhdGVXYXNpQmluZGluZyxcbiAgY3JlYXRlV2FzaUJyb3dzZXJCaW5kaW5nLFxufSBmcm9tICcuL3RlbXBsYXRlcy9sb2FkLXdhc2ktdGVtcGxhdGUuanMnXG5pbXBvcnQge1xuICBjcmVhdGVXYXNpQnJvd3NlcldvcmtlckJpbmRpbmcsXG4gIFdBU0lfV09SS0VSX1RFTVBMQVRFLFxufSBmcm9tICcuL3RlbXBsYXRlcy93YXNpLXdvcmtlci10ZW1wbGF0ZS5qcydcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0ZhY3RvcnkoJ2J1aWxkJylcbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcblxudHlwZSBPdXRwdXRLaW5kID0gJ2pzJyB8ICdkdHMnIHwgJ25vZGUnIHwgJ2V4ZScgfCAnd2FzbSdcbnR5cGUgT3V0cHV0ID0geyBraW5kOiBPdXRwdXRLaW5kOyBwYXRoOiBzdHJpbmcgfVxuXG50eXBlIEJ1aWxkT3B0aW9ucyA9IFJhd0J1aWxkT3B0aW9ucyAmIHsgY2FyZ29PcHRpb25zPzogc3RyaW5nW10gfVxudHlwZSBQYXJzZWRCdWlsZE9wdGlvbnMgPSBPbWl0PEJ1aWxkT3B0aW9ucywgJ2N3ZCc+ICYgeyBjd2Q6IHN0cmluZyB9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFByb2plY3QocmF3T3B0aW9uczogQnVpbGRPcHRpb25zKSB7XG4gIGRlYnVnKCduYXBpIGJ1aWxkIGNvbW1hbmQgcmVjZWl2ZSBvcHRpb25zOiAlTycsIHJhd09wdGlvbnMpXG5cbiAgY29uc3Qgb3B0aW9uczogUGFyc2VkQnVpbGRPcHRpb25zID0ge1xuICAgIGR0c0NhY2hlOiB0cnVlLFxuICAgIC4uLnJhd09wdGlvbnMsXG4gICAgY3dkOiByYXdPcHRpb25zLmN3ZCA/PyBwcm9jZXNzLmN3ZCgpLFxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZVBhdGggPSAoLi4ucGF0aHM6IHN0cmluZ1tdKSA9PiByZXNvbHZlKG9wdGlvbnMuY3dkLCAuLi5wYXRocylcblxuICBjb25zdCBtYW5pZmVzdFBhdGggPSByZXNvbHZlUGF0aChvcHRpb25zLm1hbmlmZXN0UGF0aCA/PyAnQ2FyZ28udG9tbCcpXG4gIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgcGFyc2VNZXRhZGF0YShtYW5pZmVzdFBhdGgpXG5cbiAgY29uc3QgY3JhdGUgPSBtZXRhZGF0YS5wYWNrYWdlcy5maW5kKChwKSA9PiB7XG4gICAgLy8gcGFja2FnZSB3aXRoIGdpdmVuIG5hbWVcbiAgICBpZiAob3B0aW9ucy5wYWNrYWdlKSB7XG4gICAgICByZXR1cm4gcC5uYW1lID09PSBvcHRpb25zLnBhY2thZ2VcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHAubWFuaWZlc3RfcGF0aCA9PT0gbWFuaWZlc3RQYXRoXG4gICAgfVxuICB9KVxuXG4gIGlmICghY3JhdGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgY3JhdGUgdG8gYnVpbGQuIEl0IHNlZW1zIHlvdSBhcmUgdHJ5aW5nIHRvIGJ1aWxkIGEgY3JhdGUgaW4gYSB3b3Jrc3BhY2UsIHRyeSB1c2luZyBgLS1wYWNrYWdlYCBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcGFja2FnZSB0byBidWlsZC4nLFxuICAgIClcbiAgfVxuICBjb25zdCBjb25maWcgPSBhd2FpdCByZWFkTmFwaUNvbmZpZyhcbiAgICByZXNvbHZlUGF0aChcbiAgICAgIG9wdGlvbnMuY29uZmlnUGF0aCA/PyBvcHRpb25zLnBhY2thZ2VKc29uUGF0aCA/PyAncGFja2FnZS5qc29uJyxcbiAgICApLFxuICAgIG9wdGlvbnMuY29uZmlnUGF0aCA/IHJlc29sdmVQYXRoKG9wdGlvbnMuY29uZmlnUGF0aCkgOiB1bmRlZmluZWQsXG4gIClcblxuICBjb25zdCBidWlsZGVyID0gbmV3IEJ1aWxkZXIobWV0YWRhdGEsIGNyYXRlLCBjb25maWcsIG9wdGlvbnMpXG5cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKVxufVxuXG5jbGFzcyBCdWlsZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcmdzOiBzdHJpbmdbXSA9IFtdXG4gIHByaXZhdGUgcmVhZG9ubHkgZW52czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0czogT3V0cHV0W10gPSBbXVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0OiBUYXJnZXRcbiAgcHJpdmF0ZSByZWFkb25seSBjcmF0ZURpcjogc3RyaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0RGlyOiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSB0YXJnZXREaXI6IHN0cmluZ1xuICBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZVR5cGVEZWY6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YWRhdGE6IENhcmdvV29ya3NwYWNlTWV0YWRhdGEsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjcmF0ZTogQ3JhdGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IE5hcGlDb25maWcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBQYXJzZWRCdWlsZE9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMudGFyZ2V0ID0gb3B0aW9ucy50YXJnZXRcbiAgICAgID8gcGFyc2VUcmlwbGUob3B0aW9ucy50YXJnZXQpXG4gICAgICA6IHByb2Nlc3MuZW52LkNBUkdPX0JVSUxEX1RBUkdFVFxuICAgICAgICA/IHBhcnNlVHJpcGxlKHByb2Nlc3MuZW52LkNBUkdPX0JVSUxEX1RBUkdFVClcbiAgICAgICAgOiBnZXRTeXN0ZW1EZWZhdWx0VGFyZ2V0KClcbiAgICB0aGlzLmNyYXRlRGlyID0gcGFyc2UoY3JhdGUubWFuaWZlc3RfcGF0aCkuZGlyXG4gICAgdGhpcy5vdXRwdXREaXIgPSByZXNvbHZlKFxuICAgICAgdGhpcy5vcHRpb25zLmN3ZCxcbiAgICAgIG9wdGlvbnMub3V0cHV0RGlyID8/IHRoaXMuY3JhdGVEaXIsXG4gICAgKVxuICAgIHRoaXMudGFyZ2V0RGlyID1cbiAgICAgIG9wdGlvbnMudGFyZ2V0RGlyID8/XG4gICAgICBwcm9jZXNzLmVudi5DQVJHT19CVUlMRF9UQVJHRVRfRElSID8/XG4gICAgICBtZXRhZGF0YS50YXJnZXRfZGlyZWN0b3J5XG4gICAgdGhpcy5lbmFibGVUeXBlRGVmID0gdGhpcy5jcmF0ZS5kZXBlbmRlbmNpZXMuc29tZShcbiAgICAgIChkZXApID0+XG4gICAgICAgIGRlcC5uYW1lID09PSAnbmFwaS1kZXJpdmUnICYmXG4gICAgICAgIChkZXAudXNlc19kZWZhdWx0X2ZlYXR1cmVzIHx8IGRlcC5mZWF0dXJlcy5pbmNsdWRlcygndHlwZS1kZWYnKSksXG4gICAgKVxuXG4gICAgaWYgKCF0aGlzLmVuYWJsZVR5cGVEZWYpIHtcbiAgICAgIGNvbnN0IHJlcXVpcmVtZW50V2FybmluZyA9XG4gICAgICAgICdgbmFwaS1kZXJpdmVgIGNyYXRlIGlzIG5vdCB1c2VkIG9yIGB0eXBlLWRlZmAgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCBmb3IgYG5hcGktZGVyaXZlYCBjcmF0ZSdcbiAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgIGAke3JlcXVpcmVtZW50V2FybmluZ30uIFdpbGwgc2tpcCBiaW5kaW5nIGdlbmVyYXRpb24gZm9yIFxcYC5ub2RlXFxgLCBcXGAud2FzaVxcYCBhbmQgXFxgLmQudHNcXGAgZmlsZXMuYCxcbiAgICAgIClcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm9wdGlvbnMuZHRzIHx8XG4gICAgICAgIHRoaXMub3B0aW9ucy5kdHNIZWFkZXIgfHxcbiAgICAgICAgdGhpcy5jb25maWcuZHRzSGVhZGVyIHx8XG4gICAgICAgIHRoaXMuY29uZmlnLmR0c0hlYWRlckZpbGVcbiAgICAgICkge1xuICAgICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAgIGAke3JlcXVpcmVtZW50V2FybmluZ30uIFxcYGR0c1xcYCByZWxhdGVkIG9wdGlvbnMgYXJlIGVuYWJsZWQgYnV0IHdpbGwgYmUgaWdub3JlZC5gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNkeUxpYk5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JhdGUudGFyZ2V0cy5maW5kKCh0KSA9PiB0LmNyYXRlX3R5cGVzLmluY2x1ZGVzKCdjZHlsaWInKSlcbiAgICAgID8ubmFtZVxuICB9XG5cbiAgZ2V0IGJpbk5hbWUoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMub3B0aW9ucy5iaW4gPz9cbiAgICAgIC8vIG9ubHkgYXZhaWxhYmxlIGlmIG5vdCBjZHlsaWIgb3IgYmluIG5hbWUgc3BlY2lmaWVkXG4gICAgICAodGhpcy5jZHlMaWJOYW1lXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMuY3JhdGUudGFyZ2V0cy5maW5kKCh0KSA9PiB0LmNyYXRlX3R5cGVzLmluY2x1ZGVzKCdiaW4nKSk/Lm5hbWUpXG4gICAgKVxuICB9XG5cbiAgYnVpbGQoKSB7XG4gICAgaWYgKCF0aGlzLmNkeUxpYk5hbWUpIHtcbiAgICAgIGNvbnN0IHdhcm5pbmcgPVxuICAgICAgICAnTWlzc2luZyBgY3JhdGUtdHlwZSA9IFtcImNkeWxpYlwiXWAgaW4gW2xpYl0gY29uZmlnLiBUaGUgYnVpbGQgcmVzdWx0IHdpbGwgbm90IGJlIGF2YWlsYWJsZSBhcyBub2RlIGFkZG9uLidcblxuICAgICAgaWYgKHRoaXMuYmluTmFtZSkge1xuICAgICAgICBkZWJ1Zy53YXJuKHdhcm5pbmcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3Iod2FybmluZylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5waWNrQmluYXJ5KClcbiAgICAgIC5zZXRQYWNrYWdlKClcbiAgICAgIC5zZXRGZWF0dXJlcygpXG4gICAgICAuc2V0VGFyZ2V0KClcbiAgICAgIC5waWNrQ3Jvc3NUb29sY2hhaW4oKVxuICAgICAgLnNldEVudnMoKVxuICAgICAgLnNldEJ5cGFzc0FyZ3MoKVxuICAgICAgLmV4ZWMoKVxuICB9XG5cbiAgcHJpdmF0ZSBwaWNrQ3Jvc3NUb29sY2hhaW4oKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMudXNlTmFwaUNyb3NzKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZUNyb3NzKSB7XG4gICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAnWW91IGFyZSB0cnlpbmcgdG8gdXNlIGJvdGggYC0tY3Jvc3NgIGFuZCBgLS11c2UtbmFwaS1jcm9zc2Agb3B0aW9ucywgYC0tdXNlLWNyb3NzYCB3aWxsIGJlIGlnbm9yZWQuJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNyb3NzQ29tcGlsZSkge1xuICAgICAgZGVidWcud2FybihcbiAgICAgICAgJ1lvdSBhcmUgdHJ5aW5nIHRvIHVzZSBib3RoIGAtLWNyb3NzLWNvbXBpbGVgIGFuZCBgLS11c2UtbmFwaS1jcm9zc2Agb3B0aW9ucywgYC0tY3Jvc3MtY29tcGlsZWAgd2lsbCBiZSBpZ25vcmVkLicsXG4gICAgICApXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdmVyc2lvbiwgZG93bmxvYWQgfSA9IHJlcXVpcmUoJ0BuYXBpLXJzL2Nyb3NzLXRvb2xjaGFpbicpXG5cbiAgICAgIGNvbnN0IGFsaWFzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnczM5MHgtdW5rbm93bi1saW51eC1nbnUnOiAnczM5MHgtaWJtLWxpbnV4LWdudScsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvb2xjaGFpblBhdGggPSBqb2luKFxuICAgICAgICBob21lZGlyKCksXG4gICAgICAgICcubmFwaS1ycycsXG4gICAgICAgICdjcm9zcy10b29sY2hhaW4nLFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICB0aGlzLnRhcmdldC50cmlwbGUsXG4gICAgICApXG4gICAgICBta2RpclN5bmModG9vbGNoYWluUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4odG9vbGNoYWluUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICBkZWJ1ZyhgVG9vbGNoYWluICR7dG9vbGNoYWluUGF0aH0gZXhpc3RzLCBza2lwIGV4dHJhY3RpbmdgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdGFyQXJjaGl2ZSA9IGRvd25sb2FkKHByb2Nlc3MuYXJjaCwgdGhpcy50YXJnZXQudHJpcGxlKVxuICAgICAgICB0YXJBcmNoaXZlLnVucGFjayh0b29sY2hhaW5QYXRoKVxuICAgICAgfVxuICAgICAgY29uc3QgdXBwZXJDYXNlVGFyZ2V0ID0gdGFyZ2V0VG9FbnZWYXIodGhpcy50YXJnZXQudHJpcGxlKVxuICAgICAgY29uc3QgY3Jvc3NUYXJnZXROYW1lID0gYWxpYXNbdGhpcy50YXJnZXQudHJpcGxlXSA/PyB0aGlzLnRhcmdldC50cmlwbGVcbiAgICAgIGNvbnN0IGxpbmtlckVudiA9IGBDQVJHT19UQVJHRVRfJHt1cHBlckNhc2VUYXJnZXR9X0xJTktFUmBcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgIGxpbmtlckVudixcbiAgICAgICAgam9pbih0b29sY2hhaW5QYXRoLCAnYmluJywgYCR7Y3Jvc3NUYXJnZXROYW1lfS1nY2NgKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfU1lTUk9PVCcsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgY3Jvc3NUYXJnZXROYW1lLCAnc3lzcm9vdCcpLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9BUicsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgJ2JpbicsIGAke2Nyb3NzVGFyZ2V0TmFtZX0tYXJgKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfUkFOTElCJyxcbiAgICAgICAgam9pbih0b29sY2hhaW5QYXRoLCAnYmluJywgYCR7Y3Jvc3NUYXJnZXROYW1lfS1yYW5saWJgKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfUkVBREVMRicsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgJ2JpbicsIGAke2Nyb3NzVGFyZ2V0TmFtZX0tcmVhZGVsZmApLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9DX0lOQ0xVREVfUEFUSCcsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgY3Jvc3NUYXJnZXROYW1lLCAnc3lzcm9vdCcsICd1c3InLCAnaW5jbHVkZS8nKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfQ0MnLFxuICAgICAgICBqb2luKHRvb2xjaGFpblBhdGgsICdiaW4nLCBgJHtjcm9zc1RhcmdldE5hbWV9LWdjY2ApLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9DWFgnLFxuICAgICAgICBqb2luKHRvb2xjaGFpblBhdGgsICdiaW4nLCBgJHtjcm9zc1RhcmdldE5hbWV9LWcrK2ApLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ0JJTkRHRU5fRVhUUkFfQ0xBTkdfQVJHUycsXG4gICAgICAgIGAtLXN5c3Jvb3Q9JHt0aGlzLmVudnMuVEFSR0VUX1NZU1JPT1R9fWAsXG4gICAgICApXG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvY2Vzcy5lbnYuVEFSR0VUX0NDPy5zdGFydHNXaXRoKCdjbGFuZycpIHx8XG4gICAgICAgIChwcm9jZXNzLmVudi5DQz8uc3RhcnRzV2l0aCgnY2xhbmcnKSAmJiAhcHJvY2Vzcy5lbnYuVEFSR0VUX0NDKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFRBUkdFVF9DRkxBR1MgPSBwcm9jZXNzLmVudi5UQVJHRVRfQ0ZMQUdTID8/ICcnXG4gICAgICAgIHRoaXMuZW52cy5UQVJHRVRfQ0ZMQUdTID0gYC0tc3lzcm9vdD0ke3RoaXMuZW52cy5UQVJHRVRfU1lTUk9PVH0gLS1nY2MtdG9vbGNoYWluPSR7dG9vbGNoYWluUGF0aH0gJHtUQVJHRVRfQ0ZMQUdTfWBcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgKHByb2Nlc3MuZW52LkNYWD8uc3RhcnRzV2l0aCgnY2xhbmcrKycpICYmICFwcm9jZXNzLmVudi5UQVJHRVRfQ1hYKSB8fFxuICAgICAgICBwcm9jZXNzLmVudi5UQVJHRVRfQ1hYPy5zdGFydHNXaXRoKCdjbGFuZysrJylcbiAgICAgICkge1xuICAgICAgICBjb25zdCBUQVJHRVRfQ1hYRkxBR1MgPSBwcm9jZXNzLmVudi5UQVJHRVRfQ1hYRkxBR1MgPz8gJydcbiAgICAgICAgdGhpcy5lbnZzLlRBUkdFVF9DWFhGTEFHUyA9IGAtLXN5c3Jvb3Q9JHt0aGlzLmVudnMuVEFSR0VUX1NZU1JPT1R9IC0tZ2NjLXRvb2xjaGFpbj0ke3Rvb2xjaGFpblBhdGh9ICR7VEFSR0VUX0NYWEZMQUdTfWBcbiAgICAgIH1cbiAgICAgIHRoaXMuZW52cy5QQVRIID0gdGhpcy5lbnZzLlBBVEhcbiAgICAgICAgPyBgJHt0b29sY2hhaW5QYXRofS9iaW46JHt0aGlzLmVudnMuUEFUSH06JHtwcm9jZXNzLmVudi5QQVRIfWBcbiAgICAgICAgOiBgJHt0b29sY2hhaW5QYXRofS9iaW46JHtwcm9jZXNzLmVudi5QQVRIfWBcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1Zy53YXJuKCdQaWNrIGNyb3NzIHRvb2xjaGFpbiBmYWlsZWQnLCBlIGFzIEVycm9yKVxuICAgICAgLy8gaWdub3JlLCBkbyBub3RoaW5nXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcml2YXRlIGV4ZWMoKSB7XG4gICAgZGVidWcoYFN0YXJ0IGJ1aWxkaW5nIGNyYXRlOiAke3RoaXMuY3JhdGUubmFtZX1gKVxuICAgIGRlYnVnKCcgICVpJywgYGNhcmdvICR7dGhpcy5hcmdzLmpvaW4oJyAnKX1gKVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuXG4gICAgY29uc3Qgd2F0Y2ggPSB0aGlzLm9wdGlvbnMud2F0Y2hcbiAgICBjb25zdCBidWlsZFRhc2sgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnVzZUNyb3NzICYmIHRoaXMub3B0aW9ucy5jcm9zc0NvbXBpbGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdgLS11c2UtY3Jvc3NgIGFuZCBgLS1jcm9zcy1jb21waWxlYCBjYW4gbm90IGJlIHVzZWQgdG9nZXRoZXInLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb21tYW5kID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuQ0FSR08gPz8gKHRoaXMub3B0aW9ucy51c2VDcm9zcyA/ICdjcm9zcycgOiAnY2FyZ28nKVxuICAgICAgY29uc3QgYnVpbGRQcm9jZXNzID0gc3Bhd24oY29tbWFuZCwgdGhpcy5hcmdzLCB7XG4gICAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4udGhpcy5lbnZzIH0sXG4gICAgICAgIHN0ZGlvOiB3YXRjaCA/IFsnaW5oZXJpdCcsICdpbmhlcml0JywgJ3BpcGUnXSA6ICdpbmhlcml0JyxcbiAgICAgICAgY3dkOiB0aGlzLm9wdGlvbnMuY3dkLFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSlcblxuICAgICAgYnVpbGRQcm9jZXNzLm9uY2UoJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICAgIGRlYnVnKCclaScsIGBCdWlsZCBjcmF0ZSAke3RoaXMuY3JhdGUubmFtZX0gc3VjY2Vzc2Z1bGx5IWApXG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQnVpbGQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7Y29kZX1gKSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgYnVpbGRQcm9jZXNzLm9uY2UoJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQnVpbGQgZmFpbGVkIHdpdGggZXJyb3I6ICR7ZS5tZXNzYWdlfWAsIHsgY2F1c2U6IGUgfSkpXG4gICAgICB9KVxuXG4gICAgICAvLyB3YXRjaCBtb2RlIG9ubHksIHRoZXkgYXJlIHBpcGVkIHRocm91Z2ggc3RkZXJyXG4gICAgICBidWlsZFByb2Nlc3Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKVxuICAgICAgICBjb25zb2xlLmVycm9yKG91dHB1dClcbiAgICAgICAgaWYgKC9GaW5pc2hlZFxccyhgZGV2YHxgcmVsZWFzZWApLy50ZXN0KG91dHB1dCkpIHtcbiAgICAgICAgICB0aGlzLnBvc3RCdWlsZCgpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFzazogYnVpbGRUYXNrLnRoZW4oKCkgPT4gdGhpcy5wb3N0QnVpbGQoKSksXG4gICAgICBhYm9ydDogKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGlja0JpbmFyeSgpIHtcbiAgICBsZXQgc2V0ID0gZmFsc2VcbiAgICBpZiAodGhpcy5vcHRpb25zLndhdGNoKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHtcbiAgICAgICAgZGVidWcud2FybignV2F0Y2ggbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGluIENJIGVudmlyb25tZW50JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYnVnKCdVc2UgJWknLCAnY2FyZ28td2F0Y2gnKVxuICAgICAgICB0cnlJbnN0YWxsQ2FyZ29CaW5hcnkoJ2NhcmdvLXdhdGNoJywgJ3dhdGNoJylcbiAgICAgICAgLy8geWFybiBuYXBpIHdhdGNoIC0tdGFyZ2V0IHg4Nl82NC11bmtub3duLWxpbnV4LWdudSBbLS1jcm9zcy1jb21waWxlXVxuICAgICAgICAvLyA9PT0+XG4gICAgICAgIC8vIGNhcmdvIHdhdGNoIFsuLi5dIC0tIGJ1aWxkIC0tdGFyZ2V0IHg4Nl82NC11bmtub3duLWxpbnV4LWdudVxuICAgICAgICAvLyBjYXJnbyB3YXRjaCBbLi4uXSAtLSB6aWdidWlsZCAtLXRhcmdldCB4ODZfNjQtdW5rbm93bi1saW51eC1nbnVcbiAgICAgICAgdGhpcy5hcmdzLnB1c2goXG4gICAgICAgICAgJ3dhdGNoJyxcbiAgICAgICAgICAnLS13aHknLFxuICAgICAgICAgICctaScsXG4gICAgICAgICAgJyoue2pzLHRzLG5vZGV9JyxcbiAgICAgICAgICAnLXcnLFxuICAgICAgICAgIHRoaXMuY3JhdGVEaXIsXG4gICAgICAgICAgJy0tJyxcbiAgICAgICAgICAnY2FyZ28nLFxuICAgICAgICAgICdidWlsZCcsXG4gICAgICAgIClcbiAgICAgICAgc2V0ID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3Jvc3NDb21waWxlKSB7XG4gICAgICBpZiAodGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAgICAgJ1lvdSBhcmUgdHJ5aW5nIHRvIGNyb3NzIGNvbXBpbGUgdG8gd2luMzIgcGxhdGZvcm0gb24gd2luMzIgcGxhdGZvcm0gd2hpY2ggaXMgdW5uZWNlc3NhcnkuJyxcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXNlIGNhcmdvLXh3aW4gdG8gY3Jvc3MgY29tcGlsZSB0byB3aW4zMiBwbGF0Zm9ybVxuICAgICAgICAgIGRlYnVnKCdVc2UgJWknLCAnY2FyZ28teHdpbicpXG4gICAgICAgICAgdHJ5SW5zdGFsbENhcmdvQmluYXJ5KCdjYXJnby14d2luJywgJ3h3aW4nKVxuICAgICAgICAgIHRoaXMuYXJncy5wdXNoKCd4d2luJywgJ2J1aWxkJylcbiAgICAgICAgICBpZiAodGhpcy50YXJnZXQuYXJjaCA9PT0gJ2lhMzInKSB7XG4gICAgICAgICAgICB0aGlzLmVudnMuWFdJTl9BUkNIID0gJ3g4NidcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0ID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICdsaW51eCcgJiZcbiAgICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnICYmXG4gICAgICAgICAgdGhpcy50YXJnZXQuYXJjaCA9PT0gcHJvY2Vzcy5hcmNoICYmXG4gICAgICAgICAgKGZ1bmN0aW9uIChhYmk6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGdsaWJjVmVyc2lvblJ1bnRpbWUgPVxuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgIHByb2Nlc3MucmVwb3J0Py5nZXRSZXBvcnQoKT8uaGVhZGVyPy5nbGliY1ZlcnNpb25SdW50aW1lXG4gICAgICAgICAgICBjb25zdCBsaWJjID0gZ2xpYmNWZXJzaW9uUnVudGltZSA/ICdnbnUnIDogJ211c2wnXG4gICAgICAgICAgICByZXR1cm4gYWJpID09PSBsaWJjXG4gICAgICAgICAgfSkodGhpcy50YXJnZXQuYWJpKVxuICAgICAgICApIHtcbiAgICAgICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAgICAgJ1lvdSBhcmUgdHJ5aW5nIHRvIGNyb3NzIGNvbXBpbGUgdG8gbGludXggdGFyZ2V0IG9uIGxpbnV4IHBsYXRmb3JtIHdoaWNoIGlzIHVubmVjZXNzYXJ5LicsXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnZGFyd2luJyAmJlxuICAgICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nXG4gICAgICAgICkge1xuICAgICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgICAnWW91IGFyZSB0cnlpbmcgdG8gY3Jvc3MgY29tcGlsZSB0byBkYXJ3aW4gdGFyZ2V0IG9uIGRhcndpbiBwbGF0Zm9ybSB3aGljaCBpcyB1bm5lY2Vzc2FyeS4nLFxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB1c2UgY2FyZ28temlnYnVpbGQgdG8gY3Jvc3MgY29tcGlsZSB0byBvdGhlciBwbGF0Zm9ybXNcbiAgICAgICAgICBkZWJ1ZygnVXNlICVpJywgJ2NhcmdvLXppZ2J1aWxkJylcbiAgICAgICAgICB0cnlJbnN0YWxsQ2FyZ29CaW5hcnkoJ2NhcmdvLXppZ2J1aWxkJywgJ3ppZ2J1aWxkJylcbiAgICAgICAgICB0aGlzLmFyZ3MucHVzaCgnemlnYnVpbGQnKVxuICAgICAgICAgIHNldCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghc2V0KSB7XG4gICAgICB0aGlzLmFyZ3MucHVzaCgnYnVpbGQnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQYWNrYWdlKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBbXVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYWNrYWdlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tcGFja2FnZScsIHRoaXMub3B0aW9ucy5wYWNrYWdlKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmJpbk5hbWUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1iaW4nLCB0aGlzLmJpbk5hbWUpXG4gICAgfVxuXG4gICAgaWYgKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBkZWJ1ZygnU2V0IHBhY2thZ2UgZmxhZ3M6ICcpXG4gICAgICBkZWJ1ZygnICAlTycsIGFyZ3MpXG4gICAgICB0aGlzLmFyZ3MucHVzaCguLi5hcmdzKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcml2YXRlIHNldFRhcmdldCgpIHtcbiAgICBkZWJ1ZygnU2V0IGNvbXBpbGluZyB0YXJnZXQgdG86ICcpXG4gICAgZGVidWcoJyAgJWknLCB0aGlzLnRhcmdldC50cmlwbGUpXG5cbiAgICB0aGlzLmFyZ3MucHVzaCgnLS10YXJnZXQnLCB0aGlzLnRhcmdldC50cmlwbGUpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbnZzKCkge1xuICAgIC8vIFRZUEUgREVGXG4gICAgaWYgKHRoaXMuZW5hYmxlVHlwZURlZikge1xuICAgICAgdGhpcy5lbnZzLk5BUElfVFlQRV9ERUZfVE1QX0ZPTERFUiA9XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVJbnRlcm1lZGlhdGVUeXBlRGVmRm9sZGVyKClcbiAgICAgIHRoaXMuc2V0Rm9yY2VCdWlsZEVudnModGhpcy5lbnZzLk5BUElfVFlQRV9ERUZfVE1QX0ZPTERFUilcbiAgICB9XG5cbiAgICAvLyBSVVNURkxBR1NcbiAgICBsZXQgcnVzdGZsYWdzID1cbiAgICAgIHByb2Nlc3MuZW52LlJVU1RGTEFHUyA/PyBwcm9jZXNzLmVudi5DQVJHT19CVUlMRF9SVVNURkxBR1MgPz8gJydcblxuICAgIGlmIChcbiAgICAgIHRoaXMudGFyZ2V0LmFiaT8uaW5jbHVkZXMoJ211c2wnKSAmJlxuICAgICAgIXJ1c3RmbGFncy5pbmNsdWRlcygndGFyZ2V0LWZlYXR1cmU9LWNydC1zdGF0aWMnKVxuICAgICkge1xuICAgICAgcnVzdGZsYWdzICs9ICcgLUMgdGFyZ2V0LWZlYXR1cmU9LWNydC1zdGF0aWMnXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpcCAmJiAhcnVzdGZsYWdzLmluY2x1ZGVzKCdsaW5rLWFyZz0tcycpKSB7XG4gICAgICBydXN0ZmxhZ3MgKz0gJyAtQyBsaW5rLWFyZz0tcydcbiAgICB9XG5cbiAgICBpZiAocnVzdGZsYWdzLmxlbmd0aCkge1xuICAgICAgdGhpcy5lbnZzLlJVU1RGTEFHUyA9IHJ1c3RmbGFnc1xuICAgIH1cbiAgICAvLyBFTkQgUlVTVEZMQUdTXG5cbiAgICAvLyBMSU5LRVJcbiAgICBjb25zdCBsaW5rZXIgPSB0aGlzLm9wdGlvbnMuY3Jvc3NDb21waWxlXG4gICAgICA/IHZvaWQgMFxuICAgICAgOiBnZXRUYXJnZXRMaW5rZXIodGhpcy50YXJnZXQudHJpcGxlKVxuICAgIC8vIFRPRE86XG4gICAgLy8gICBkaXJlY3RseSBzZXQgQ0FSR09fVEFSR0VUXzx0YXJnZXQ+X0xJTktFUiB3aWxsIGNvdmVyIC5jYXJnby9jb25maWcudG9tbFxuICAgIC8vICAgd2lsbCBkZXRlY3QgYnkgY2FyZ28gY29uZmlnIHdoZW4gaXQgYmVjb21lcyBzdGFibGVcbiAgICAvLyAgIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jYXJnby9pc3N1ZXMvOTMwMVxuICAgIGNvbnN0IGxpbmtlckVudiA9IGBDQVJHT19UQVJHRVRfJHt0YXJnZXRUb0VudlZhcihcbiAgICAgIHRoaXMudGFyZ2V0LnRyaXBsZSxcbiAgICApfV9MSU5LRVJgXG4gICAgaWYgKGxpbmtlciAmJiAhcHJvY2Vzcy5lbnZbbGlua2VyRW52XSAmJiAhdGhpcy5lbnZzW2xpbmtlckVudl0pIHtcbiAgICAgIHRoaXMuZW52c1tsaW5rZXJFbnZdID0gbGlua2VyXG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnYW5kcm9pZCcpIHtcbiAgICAgIHRoaXMuc2V0QW5kcm9pZEVudigpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnd2FzaScpIHtcbiAgICAgIHRoaXMuc2V0V2FzaUVudigpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnb3Blbmhhcm1vbnknKSB7XG4gICAgICB0aGlzLnNldE9wZW5IYXJtb255RW52KClcbiAgICB9XG5cbiAgICBkZWJ1ZygnU2V0IGVudnM6ICcpXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5lbnZzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIGRlYnVnKCcgICVpJywgYCR7a309JHt2fWApXG4gICAgfSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcml2YXRlIHNldEZvcmNlQnVpbGRFbnZzKHR5cGVEZWZUbXBGb2xkZXI6IHN0cmluZykge1xuICAgIC8vIGR5bmFtaWNhbGx5IGNoZWNrIGFsbCBuYXBpLXJzIGRlcHMgYW5kIHNldCBgTkFQSV9GT1JDRV9CVUlMRF97dXBwZXJjYXNlKHNuYWtlX2Nhc2UobmFtZSkpfSA9IHRpbWVzdGFtcGBcbiAgICB0aGlzLm1ldGFkYXRhLnBhY2thZ2VzLmZvckVhY2goKGNyYXRlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNyYXRlLmRlcGVuZGVuY2llcy5zb21lKChkKSA9PiBkLm5hbWUgPT09ICduYXBpLWRlcml2ZScpICYmXG4gICAgICAgICFleGlzdHNTeW5jKGpvaW4odHlwZURlZlRtcEZvbGRlciwgY3JhdGUubmFtZSkpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5lbnZzW1xuICAgICAgICAgIGBOQVBJX0ZPUkNFX0JVSUxEXyR7Y3JhdGUubmFtZS5yZXBsYWNlKC8tL2csICdfJykudG9VcHBlckNhc2UoKX1gXG4gICAgICAgIF0gPSBEYXRlLm5vdygpLnRvU3RyaW5nKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRBbmRyb2lkRW52KCkge1xuICAgIGNvbnN0IHsgQU5EUk9JRF9OREtfTEFURVNUX0hPTUUgfSA9IHByb2Nlc3MuZW52XG4gICAgaWYgKCFBTkRST0lEX05ES19MQVRFU1RfSE9NRSkge1xuICAgICAgZGVidWcud2FybihcbiAgICAgICAgYCR7Y29sb3JzLnJlZChcbiAgICAgICAgICAnQU5EUk9JRF9OREtfTEFURVNUX0hPTUUnLFxuICAgICAgICApfSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBtaXNzaW5nYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBza2lwIGNyb3NzIGNvbXBpbGUgc2V0dXAgaWYgaG9zdCBpcyBhbmRyb2lkXG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdhbmRyb2lkJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0QXJjaCA9IHRoaXMudGFyZ2V0LmFyY2ggPT09ICdhcm0nID8gJ2FybXY3YScgOiAnYWFyY2g2NCdcbiAgICBjb25zdCB0YXJnZXRQbGF0Zm9ybSA9XG4gICAgICB0aGlzLnRhcmdldC5hcmNoID09PSAnYXJtJyA/ICdhbmRyb2lkZWFiaTI0JyA6ICdhbmRyb2lkMjQnXG4gICAgY29uc3QgaG9zdFBsYXRmb3JtID1cbiAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nXG4gICAgICAgID8gJ2RhcndpbidcbiAgICAgICAgOiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gICAgICAgICAgPyAnd2luZG93cydcbiAgICAgICAgICA6ICdsaW51eCdcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuZW52cywge1xuICAgICAgQ0FSR09fVEFSR0VUX0FBUkNINjRfTElOVVhfQU5EUk9JRF9MSU5LRVI6IGAke0FORFJPSURfTkRLX0xBVEVTVF9IT01FfS90b29sY2hhaW5zL2xsdm0vcHJlYnVpbHQvJHtob3N0UGxhdGZvcm19LXg4Nl82NC9iaW4vJHt0YXJnZXRBcmNofS1saW51eC1hbmRyb2lkMjQtY2xhbmdgLFxuICAgICAgQ0FSR09fVEFSR0VUX0FSTVY3X0xJTlVYX0FORFJPSURFQUJJX0xJTktFUjogYCR7QU5EUk9JRF9OREtfTEFURVNUX0hPTUV9L3Rvb2xjaGFpbnMvbGx2bS9wcmVidWlsdC8ke2hvc3RQbGF0Zm9ybX0teDg2XzY0L2Jpbi8ke3RhcmdldEFyY2h9LWxpbnV4LWFuZHJvaWRlYWJpMjQtY2xhbmdgLFxuICAgICAgVEFSR0VUX0NDOiBgJHtBTkRST0lEX05ES19MQVRFU1RfSE9NRX0vdG9vbGNoYWlucy9sbHZtL3ByZWJ1aWx0LyR7aG9zdFBsYXRmb3JtfS14ODZfNjQvYmluLyR7dGFyZ2V0QXJjaH0tbGludXgtJHt0YXJnZXRQbGF0Zm9ybX0tY2xhbmdgLFxuICAgICAgVEFSR0VUX0NYWDogYCR7QU5EUk9JRF9OREtfTEFURVNUX0hPTUV9L3Rvb2xjaGFpbnMvbGx2bS9wcmVidWlsdC8ke2hvc3RQbGF0Zm9ybX0teDg2XzY0L2Jpbi8ke3RhcmdldEFyY2h9LWxpbnV4LSR7dGFyZ2V0UGxhdGZvcm19LWNsYW5nKytgLFxuICAgICAgVEFSR0VUX0FSOiBgJHtBTkRST0lEX05ES19MQVRFU1RfSE9NRX0vdG9vbGNoYWlucy9sbHZtL3ByZWJ1aWx0LyR7aG9zdFBsYXRmb3JtfS14ODZfNjQvYmluL2xsdm0tYXJgLFxuICAgICAgVEFSR0VUX1JBTkxJQjogYCR7QU5EUk9JRF9OREtfTEFURVNUX0hPTUV9L3Rvb2xjaGFpbnMvbGx2bS9wcmVidWlsdC8ke2hvc3RQbGF0Zm9ybX0teDg2XzY0L2Jpbi9sbHZtLXJhbmxpYmAsXG4gICAgICBBTkRST0lEX05ESzogQU5EUk9JRF9OREtfTEFURVNUX0hPTUUsXG4gICAgICBQQVRIOiBgJHtBTkRST0lEX05ES19MQVRFU1RfSE9NRX0vdG9vbGNoYWlucy9sbHZtL3ByZWJ1aWx0LyR7aG9zdFBsYXRmb3JtfS14ODZfNjQvYmluJHtwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJzsnIDogJzonfSR7cHJvY2Vzcy5lbnYuUEFUSH1gLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHNldFdhc2lFbnYoKSB7XG4gICAgY29uc3QgZW1uYXBpID0gam9pbihcbiAgICAgIHJlcXVpcmUucmVzb2x2ZSgnZW1uYXBpJyksXG4gICAgICAnLi4nLFxuICAgICAgJ2xpYicsXG4gICAgICAnd2FzbTMyLXdhc2ktdGhyZWFkcycsXG4gICAgKVxuICAgIHRoaXMuZW52cy5FTU5BUElfTElOS19ESVIgPSBlbW5hcGlcbiAgICBjb25zdCB7IFdBU0lfU0RLX1BBVEggfSA9IHByb2Nlc3MuZW52XG5cbiAgICBpZiAoV0FTSV9TREtfUEFUSCAmJiBleGlzdHNTeW5jKFdBU0lfU0RLX1BBVEgpKSB7XG4gICAgICB0aGlzLmVudnMuQ0FSR09fVEFSR0VUX1dBU00zMl9XQVNJX1BSRVZJRVcxX1RIUkVBRFNfTElOS0VSID0gam9pbihcbiAgICAgICAgV0FTSV9TREtfUEFUSCxcbiAgICAgICAgJ2JpbicsXG4gICAgICAgICd3YXNtLWxkJyxcbiAgICAgIClcbiAgICAgIHRoaXMuZW52cy5DQVJHT19UQVJHRVRfV0FTTTMyX1dBU0lQMV9MSU5LRVIgPSBqb2luKFxuICAgICAgICBXQVNJX1NES19QQVRILFxuICAgICAgICAnYmluJyxcbiAgICAgICAgJ3dhc20tbGQnLFxuICAgICAgKVxuICAgICAgdGhpcy5lbnZzLkNBUkdPX1RBUkdFVF9XQVNNMzJfV0FTSVAxX1RIUkVBRFNfTElOS0VSID0gam9pbihcbiAgICAgICAgV0FTSV9TREtfUEFUSCxcbiAgICAgICAgJ2JpbicsXG4gICAgICAgICd3YXNtLWxkJyxcbiAgICAgIClcbiAgICAgIHRoaXMuZW52cy5DQVJHT19UQVJHRVRfV0FTTTMyX1dBU0lQMl9MSU5LRVIgPSBqb2luKFxuICAgICAgICBXQVNJX1NES19QQVRILFxuICAgICAgICAnYmluJyxcbiAgICAgICAgJ3dhc20tbGQnLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX0NDJywgam9pbihXQVNJX1NES19QQVRILCAnYmluJywgJ2NsYW5nJykpXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKFxuICAgICAgICAnVEFSR0VUX0NYWCcsXG4gICAgICAgIGpvaW4oV0FTSV9TREtfUEFUSCwgJ2JpbicsICdjbGFuZysrJyksXG4gICAgICApXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfQVInLCBqb2luKFdBU0lfU0RLX1BBVEgsICdiaW4nLCAnYXInKSlcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfUkFOTElCJyxcbiAgICAgICAgam9pbihXQVNJX1NES19QQVRILCAnYmluJywgJ3JhbmxpYicpLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9DRkxBR1MnLFxuICAgICAgICBgLS10YXJnZXQ9d2FzbTMyLXdhc2ktdGhyZWFkcyAtLXN5c3Jvb3Q9JHtXQVNJX1NES19QQVRIfS9zaGFyZS93YXNpLXN5c3Jvb3QgLXB0aHJlYWQgLW1sbHZtIC13YXNtLWVuYWJsZS1zamxqYCxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfQ1hYRkxBR1MnLFxuICAgICAgICBgLS10YXJnZXQ9d2FzbTMyLXdhc2ktdGhyZWFkcyAtLXN5c3Jvb3Q9JHtXQVNJX1NES19QQVRIfS9zaGFyZS93YXNpLXN5c3Jvb3QgLXB0aHJlYWQgLW1sbHZtIC13YXNtLWVuYWJsZS1zamxqYCxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgIGBUQVJHRVRfTERGTEFHU2AsXG4gICAgICAgIGAtZnVzZS1sZD0ke1dBU0lfU0RLX1BBVEh9L2Jpbi93YXNtLWxkIC0tdGFyZ2V0PXdhc20zMi13YXNpLXRocmVhZHNgLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0T3Blbkhhcm1vbnlFbnYoKSB7XG4gICAgY29uc3QgeyBPSE9TX1NES19QQVRILCBPSE9TX1NES19OQVRJVkUgfSA9IHByb2Nlc3MuZW52XG4gICAgY29uc3QgbmRrUGF0aCA9IE9IT1NfU0RLX1BBVEhcbiAgICAgID8gYCR7T0hPU19TREtfTkFUSVZFfS9uYXRpdmVgXG4gICAgICA6IE9IT1NfU0RLX05BVElWRVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBpZiAoIW5ka1BhdGggJiYgcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ29wZW5oYXJtb255Jykge1xuICAgICAgZGVidWcud2FybihcbiAgICAgICAgYCR7Y29sb3JzLnJlZCgnT0hPU19TREtfUEFUSCcpfSBvciAke2NvbG9ycy5yZWQoJ09IT1NfU0RLX05BVElWRScpfSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBtaXNzaW5nYCxcbiAgICAgIClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBsaW5rZXJOYW1lID0gYENBUkdPX1RBUkdFVF8ke3RoaXMudGFyZ2V0LnRyaXBsZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoLy0vZywgJ18nKX1fTElOS0VSYFxuICAgIGNvbnN0IHJhblBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi9sbHZtLXJhbmxpYmBcbiAgICBjb25zdCBhclBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi9sbHZtLWFyYFxuICAgIGNvbnN0IGNjUGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluLyR7dGhpcy50YXJnZXQudHJpcGxlfS1jbGFuZ2BcbiAgICBjb25zdCBjeHhQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vJHt0aGlzLnRhcmdldC50cmlwbGV9LWNsYW5nKytgXG4gICAgY29uc3QgYXNQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vbGx2bS1hc2BcbiAgICBjb25zdCBsZFBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi9sZC5sbGRgXG4gICAgY29uc3Qgc3RyaXBQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vbGx2bS1zdHJpcGBcbiAgICBjb25zdCBvYmpEdW1wUGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluL2xsdm0tb2JqZHVtcGBcbiAgICBjb25zdCBvYmpDb3B5UGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluL2xsdm0tb2JqY29weWBcbiAgICBjb25zdCBubVBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi9sbHZtLW5tYFxuICAgIGNvbnN0IGJpblBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2JpbmBcbiAgICBjb25zdCBsaWJQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9saWJgXG5cbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdMSUJDTEFOR19QQVRIJywgbGliUGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdERVBfQVRPTUlDJywgJ2NsYW5nX3J0LmJ1aWx0aW5zJylcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKGxpbmtlck5hbWUsIGNjUGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfQ0MnLCBjY1BhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX0NYWCcsIGN4eFBhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX0FSJywgYXJQYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9SQU5MSUInLCByYW5QYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9BUycsIGFzUGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfTEQnLCBsZFBhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX1NUUklQJywgc3RyaXBQYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9PQkpEVU1QJywgb2JqRHVtcFBhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX09CSkNPUFknLCBvYmpDb3B5UGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfTk0nLCBubVBhdGgpXG4gICAgdGhpcy5lbnZzLlBBVEggPSBgJHtiaW5QYXRofSR7cHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICc7JyA6ICc6J30ke3Byb2Nlc3MuZW52LlBBVEh9YFxuICB9XG5cbiAgcHJpdmF0ZSBzZXRGZWF0dXJlcygpIHtcbiAgICBjb25zdCBhcmdzID0gW11cbiAgICBpZiAodGhpcy5vcHRpb25zLmFsbEZlYXR1cmVzICYmIHRoaXMub3B0aW9ucy5ub0RlZmF1bHRGZWF0dXJlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2Fubm90IHNwZWNpZnkgLS1hbGwtZmVhdHVyZXMgYW5kIC0tbm8tZGVmYXVsdC1mZWF0dXJlcyB0b2dldGhlcicsXG4gICAgICApXG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsRmVhdHVyZXMpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1hbGwtZmVhdHVyZXMnKVxuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLm5vRGVmYXVsdEZlYXR1cmVzKSB7XG4gICAgICBhcmdzLnB1c2goJy0tbm8tZGVmYXVsdC1mZWF0dXJlcycpXG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZmVhdHVyZXMpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1mZWF0dXJlcycsIC4uLnRoaXMub3B0aW9ucy5mZWF0dXJlcylcbiAgICB9XG5cbiAgICBkZWJ1ZygnU2V0IGZlYXR1cmVzIGZsYWdzOiAnKVxuICAgIGRlYnVnKCcgICVPJywgYXJncylcbiAgICB0aGlzLmFyZ3MucHVzaCguLi5hcmdzKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHByaXZhdGUgc2V0QnlwYXNzQXJncygpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnJlbGVhc2UpIHtcbiAgICAgIHRoaXMuYXJncy5wdXNoKCctLXJlbGVhc2UnKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgdGhpcy5hcmdzLnB1c2goJy0tdmVyYm9zZScpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50YXJnZXREaXIpIHtcbiAgICAgIHRoaXMuYXJncy5wdXNoKCctLXRhcmdldC1kaXInLCB0aGlzLm9wdGlvbnMudGFyZ2V0RGlyKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJvZmlsZSkge1xuICAgICAgdGhpcy5hcmdzLnB1c2goJy0tcHJvZmlsZScsIHRoaXMub3B0aW9ucy5wcm9maWxlKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubWFuaWZlc3RQYXRoKSB7XG4gICAgICB0aGlzLmFyZ3MucHVzaCgnLS1tYW5pZmVzdC1wYXRoJywgdGhpcy5vcHRpb25zLm1hbmlmZXN0UGF0aClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNhcmdvT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmFyZ3MucHVzaCguLi50aGlzLm9wdGlvbnMuY2FyZ29PcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlSW50ZXJtZWRpYXRlVHlwZURlZkZvbGRlcigpIHtcbiAgICBsZXQgZm9sZGVyID0gam9pbihcbiAgICAgIHRoaXMudGFyZ2V0RGlyLFxuICAgICAgJ25hcGktcnMnLFxuICAgICAgYCR7dGhpcy5jcmF0ZS5uYW1lfS0ke2NyZWF0ZUhhc2goJ3NoYTI1NicpXG4gICAgICAgIC51cGRhdGUodGhpcy5jcmF0ZS5tYW5pZmVzdF9wYXRoKVxuICAgICAgICAudXBkYXRlKENMSV9WRVJTSU9OKVxuICAgICAgICAuZGlnZXN0KCdoZXgnKVxuICAgICAgICAuc3Vic3RyaW5nKDAsIDgpfWAsXG4gICAgKVxuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZHRzQ2FjaGUpIHtcbiAgICAgIHJtU3luYyhmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgICAgZm9sZGVyICs9IGBfJHtEYXRlLm5vdygpfWBcbiAgICB9XG5cbiAgICBta2RpckFzeW5jKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgIHJldHVybiBmb2xkZXJcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcG9zdEJ1aWxkKCkge1xuICAgIHRyeSB7XG4gICAgICBkZWJ1ZyhgVHJ5IHRvIGNyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5OmApXG4gICAgICBkZWJ1ZygnICAlaScsIHRoaXMub3V0cHV0RGlyKVxuICAgICAgYXdhaXQgbWtkaXJBc3luYyh0aGlzLm91dHB1dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgIGRlYnVnKGBPdXRwdXQgZGlyZWN0b3J5IGNyZWF0ZWRgKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5ICR7dGhpcy5vdXRwdXREaXJ9YCwge1xuICAgICAgICBjYXVzZTogZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgd2FzbUJpbmFyeU5hbWUgPSBhd2FpdCB0aGlzLmNvcHlBcnRpZmFjdCgpXG5cbiAgICAvLyBvbmx5IGZvciBjZHlsaWJcbiAgICBpZiAodGhpcy5jZHlMaWJOYW1lKSB7XG4gICAgICBjb25zdCBpZGVudHMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlVHlwZURlZigpXG4gICAgICBjb25zdCBqc091dHB1dCA9IGF3YWl0IHRoaXMud3JpdGVKc0JpbmRpbmcoaWRlbnRzKVxuICAgICAgY29uc3Qgd2FzbUJpbmRpbmdzT3V0cHV0ID0gYXdhaXQgdGhpcy53cml0ZVdhc2lCaW5kaW5nKFxuICAgICAgICB3YXNtQmluYXJ5TmFtZSxcbiAgICAgICAgaWRlbnRzLFxuICAgICAgKVxuICAgICAgaWYgKGpzT3V0cHV0KSB7XG4gICAgICAgIHRoaXMub3V0cHV0cy5wdXNoKGpzT3V0cHV0KVxuICAgICAgfVxuICAgICAgaWYgKHdhc21CaW5kaW5nc091dHB1dCkge1xuICAgICAgICB0aGlzLm91dHB1dHMucHVzaCguLi53YXNtQmluZGluZ3NPdXRwdXQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMub3V0cHV0c1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb3B5QXJ0aWZhY3QoKSB7XG4gICAgY29uc3QgW3NyY05hbWUsIGRlc3ROYW1lLCB3YXNtQmluYXJ5TmFtZV0gPSB0aGlzLmdldEFydGlmYWN0TmFtZXMoKVxuICAgIGlmICghc3JjTmFtZSB8fCAhZGVzdE5hbWUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHByb2ZpbGUgPVxuICAgICAgdGhpcy5vcHRpb25zLnByb2ZpbGUgPz8gKHRoaXMub3B0aW9ucy5yZWxlYXNlID8gJ3JlbGVhc2UnIDogJ2RlYnVnJylcbiAgICBjb25zdCBzcmMgPSBqb2luKHRoaXMudGFyZ2V0RGlyLCB0aGlzLnRhcmdldC50cmlwbGUsIHByb2ZpbGUsIHNyY05hbWUpXG4gICAgZGVidWcoYENvcHkgYXJ0aWZhY3QgZnJvbTogWyR7c3JjfV1gKVxuICAgIGNvbnN0IGRlc3QgPSBqb2luKHRoaXMub3V0cHV0RGlyLCBkZXN0TmFtZSlcbiAgICBjb25zdCBpc1dhc20gPSBkZXN0LmVuZHNXaXRoKCcud2FzbScpXG5cbiAgICB0cnkge1xuICAgICAgaWYgKGF3YWl0IGZpbGVFeGlzdHMoZGVzdCkpIHtcbiAgICAgICAgZGVidWcoJ09sZCBhcnRpZmFjdCBmb3VuZCwgcmVtb3ZlIGl0IGZpcnN0JylcbiAgICAgICAgYXdhaXQgdW5saW5rQXN5bmMoZGVzdClcbiAgICAgIH1cbiAgICAgIGRlYnVnKCdDb3B5IGFydGlmYWN0IHRvOicpXG4gICAgICBkZWJ1ZygnICAlaScsIGRlc3QpXG4gICAgICBpZiAoaXNXYXNtKSB7XG4gICAgICAgIGNvbnN0IHsgTW9kdWxlQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoJ0BuYXBpLXJzL3dhc20tdG9vbHMnKVxuICAgICAgICBkZWJ1ZygnR2VuZXJhdGUgZGVidWcgd2FzbSBtb2R1bGUnKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRlYnVnV2FzbU1vZHVsZSA9IG5ldyBNb2R1bGVDb25maWcoKVxuICAgICAgICAgICAgLmdlbmVyYXRlRHdhcmYodHJ1ZSlcbiAgICAgICAgICAgIC5nZW5lcmF0ZU5hbWVTZWN0aW9uKHRydWUpXG4gICAgICAgICAgICAuZ2VuZXJhdGVQcm9kdWNlcnNTZWN0aW9uKHRydWUpXG4gICAgICAgICAgICAucHJlc2VydmVDb2RlVHJhbnNmb3JtKHRydWUpXG4gICAgICAgICAgICAuc3RyaWN0VmFsaWRhdGUoZmFsc2UpXG4gICAgICAgICAgICAucGFyc2UoYXdhaXQgcmVhZEZpbGVBc3luYyhzcmMpKVxuICAgICAgICAgIGNvbnN0IGRlYnVnV2FzbUJpbmFyeSA9IGRlYnVnV2FzbU1vZHVsZS5lbWl0V2FzbSh0cnVlKVxuICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKFxuICAgICAgICAgICAgZGVzdC5yZXBsYWNlKC9cXC53YXNtJC8sICcuZGVidWcud2FzbScpLFxuICAgICAgICAgICAgZGVidWdXYXNtQmluYXJ5LFxuICAgICAgICAgIClcbiAgICAgICAgICBkZWJ1ZygnR2VuZXJhdGUgcmVsZWFzZSB3YXNtIG1vZHVsZScpXG4gICAgICAgICAgY29uc3QgcmVsZWFzZVdhc21Nb2R1bGUgPSBuZXcgTW9kdWxlQ29uZmlnKClcbiAgICAgICAgICAgIC5nZW5lcmF0ZUR3YXJmKGZhbHNlKVxuICAgICAgICAgICAgLmdlbmVyYXRlTmFtZVNlY3Rpb24oZmFsc2UpXG4gICAgICAgICAgICAuZ2VuZXJhdGVQcm9kdWNlcnNTZWN0aW9uKGZhbHNlKVxuICAgICAgICAgICAgLnByZXNlcnZlQ29kZVRyYW5zZm9ybShmYWxzZSlcbiAgICAgICAgICAgIC5zdHJpY3RWYWxpZGF0ZShmYWxzZSlcbiAgICAgICAgICAgIC5vbmx5U3RhYmxlRmVhdHVyZXMoZmFsc2UpXG4gICAgICAgICAgICAucGFyc2UoZGVidWdXYXNtQmluYXJ5KVxuICAgICAgICAgIGNvbnN0IHJlbGVhc2VXYXNtQmluYXJ5ID0gcmVsZWFzZVdhc21Nb2R1bGUuZW1pdFdhc20oZmFsc2UpXG4gICAgICAgICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoZGVzdCwgcmVsZWFzZVdhc21CaW5hcnkpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBnZW5lcmF0ZSBkZWJ1ZyB3YXNtIG1vZHVsZTogJHsoZSBhcyBhbnkpLm1lc3NhZ2UgPz8gZX1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCBjb3B5RmlsZUFzeW5jKHNyYywgZGVzdClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgY29weUZpbGVBc3luYyhzcmMsIGRlc3QpXG4gICAgICB9XG4gICAgICB0aGlzLm91dHB1dHMucHVzaCh7XG4gICAgICAgIGtpbmQ6IGRlc3QuZW5kc1dpdGgoJy5ub2RlJykgPyAnbm9kZScgOiBpc1dhc20gPyAnd2FzbScgOiAnZXhlJyxcbiAgICAgICAgcGF0aDogZGVzdCxcbiAgICAgIH0pXG4gICAgICByZXR1cm4gd2FzbUJpbmFyeU5hbWUgPyBqb2luKHRoaXMub3V0cHV0RGlyLCB3YXNtQmluYXJ5TmFtZSkgOiBudWxsXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY29weSBhcnRpZmFjdCcsIHsgY2F1c2U6IGUgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEFydGlmYWN0TmFtZXMoKSB7XG4gICAgaWYgKHRoaXMuY2R5TGliTmFtZSkge1xuICAgICAgY29uc3QgY2R5TGliID0gdGhpcy5jZHlMaWJOYW1lLnJlcGxhY2UoLy0vZywgJ18nKVxuICAgICAgY29uc3Qgd2FzaVRhcmdldCA9IHRoaXMuY29uZmlnLnRhcmdldHMuZmluZCgodCkgPT4gdC5wbGF0Zm9ybSA9PT0gJ3dhc2knKVxuXG4gICAgICBjb25zdCBzcmNOYW1lID1cbiAgICAgICAgdGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICdkYXJ3aW4nXG4gICAgICAgICAgPyBgbGliJHtjZHlMaWJ9LmR5bGliYFxuICAgICAgICAgIDogdGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICd3aW4zMidcbiAgICAgICAgICAgID8gYCR7Y2R5TGlifS5kbGxgXG4gICAgICAgICAgICA6IHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnd2FzaScgfHwgdGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICd3YXNtJ1xuICAgICAgICAgICAgICA/IGAke2NkeUxpYn0ud2FzbWBcbiAgICAgICAgICAgICAgOiBgbGliJHtjZHlMaWJ9LnNvYFxuXG4gICAgICBsZXQgZGVzdE5hbWUgPSB0aGlzLmNvbmZpZy5iaW5hcnlOYW1lXG4gICAgICAvLyBhZGQgcGxhdGZvcm0gc3VmZml4IHRvIGJpbmFyeSBuYW1lXG4gICAgICAvLyBpbmRleFsubGludXgteDY0LWdudV0ubm9kZVxuICAgICAgLy8gICAgICAgXl5eXl5eXl5eXl5eXl5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucGxhdGZvcm0pIHtcbiAgICAgICAgZGVzdE5hbWUgKz0gYC4ke3RoaXMudGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX1gXG4gICAgICB9XG4gICAgICBpZiAoc3JjTmFtZS5lbmRzV2l0aCgnLndhc20nKSkge1xuICAgICAgICBkZXN0TmFtZSArPSAnLndhc20nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXN0TmFtZSArPSAnLm5vZGUnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHNyY05hbWUsXG4gICAgICAgIGRlc3ROYW1lLFxuICAgICAgICB3YXNpVGFyZ2V0XG4gICAgICAgICAgPyBgJHt0aGlzLmNvbmZpZy5iaW5hcnlOYW1lfS4ke3dhc2lUYXJnZXQucGxhdGZvcm1BcmNoQUJJfS53YXNtYFxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIF1cbiAgICB9IGVsc2UgaWYgKHRoaXMuYmluTmFtZSkge1xuICAgICAgY29uc3Qgc3JjTmFtZSA9XG4gICAgICAgIHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnd2luMzInID8gYCR7dGhpcy5iaW5OYW1lfS5leGVgIDogdGhpcy5iaW5OYW1lXG5cbiAgICAgIHJldHVybiBbc3JjTmFtZSwgc3JjTmFtZV1cbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVUeXBlRGVmKCkge1xuICAgIGNvbnN0IHR5cGVEZWZEaXIgPSB0aGlzLmVudnMuTkFQSV9UWVBFX0RFRl9UTVBfRk9MREVSXG4gICAgaWYgKCF0aGlzLmVuYWJsZVR5cGVEZWYgfHwgIShhd2FpdCBkaXJFeGlzdHNBc3luYyh0eXBlRGVmRGlyKSkpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGNvbnN0IGRlc3QgPSBqb2luKHRoaXMub3V0cHV0RGlyLCB0aGlzLm9wdGlvbnMuZHRzID8/ICdpbmRleC5kLnRzJylcblxuICAgIGxldCBoZWFkZXIgPSAnJ1xuICAgIGxldCBkdHMgPSAnJ1xuICAgIGxldCBleHBvcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ub0R0c0hlYWRlcikge1xuICAgICAgY29uc3QgZHRzSGVhZGVyID0gdGhpcy5vcHRpb25zLmR0c0hlYWRlciA/PyB0aGlzLmNvbmZpZy5kdHNIZWFkZXJcbiAgICAgIC8vIGBkdHNIZWFkZXJGaWxlYCBpbiBjb25maWcgPiBgZHRzSGVhZGVyYCBpbiBjbGkgZmxhZyA+IGBkdHNIZWFkZXJgIGluIGNvbmZpZ1xuICAgICAgaWYgKHRoaXMuY29uZmlnLmR0c0hlYWRlckZpbGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoZWFkZXIgPSBhd2FpdCByZWFkRmlsZUFzeW5jKFxuICAgICAgICAgICAgam9pbih0aGlzLm9wdGlvbnMuY3dkLCB0aGlzLmNvbmZpZy5kdHNIZWFkZXJGaWxlKSxcbiAgICAgICAgICAgICd1dGYtOCcsXG4gICAgICAgICAgKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZGVidWcud2FybihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCBkdHMgaGVhZGVyIGZpbGUgJHt0aGlzLmNvbmZpZy5kdHNIZWFkZXJGaWxlfWAsXG4gICAgICAgICAgICBlLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkdHNIZWFkZXIpIHtcbiAgICAgICAgaGVhZGVyID0gZHRzSGVhZGVyXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFkZXIgPSBERUZBVUxUX1RZUEVfREVGX0hFQURFUlxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcmVhZGRpckFzeW5jKHR5cGVEZWZEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuXG4gICAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICAgIGRlYnVnKCdObyB0eXBlIGRlZiBmaWxlcyBmb3VuZC4gU2tpcCBnZW5lcmF0aW5nIGR0cyBmaWxlLicpXG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGlmICghZmlsZS5pc0ZpbGUoKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGR0czogZmlsZUR0cywgZXhwb3J0czogZmlsZUV4cG9ydHMgfSA9IGF3YWl0IHByb2Nlc3NUeXBlRGVmKFxuICAgICAgICBqb2luKHR5cGVEZWZEaXIsIGZpbGUubmFtZSksXG4gICAgICAgIHRoaXMub3B0aW9ucy5jb25zdEVudW0gPz8gdGhpcy5jb25maWcuY29uc3RFbnVtID8/IHRydWUsXG4gICAgICApXG5cbiAgICAgIGR0cyArPSBmaWxlRHRzXG4gICAgICBleHBvcnRzLnB1c2goLi4uZmlsZUV4cG9ydHMpXG4gICAgfVxuXG4gICAgaWYgKGR0cy5pbmRleE9mKCdFeHRlcm5hbE9iamVjdDwnKSA+IC0xKSB7XG4gICAgICBoZWFkZXIgKz0gYFxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgRXh0ZXJuYWxPYmplY3Q8VD4ge1xuICByZWFkb25seSAnJzoge1xuICAgIHJlYWRvbmx5ICcnOiB1bmlxdWUgc3ltYm9sXG4gICAgW0s6IHN5bWJvbF06IFRcbiAgfVxufVxuYFxuICAgIH1cblxuICAgIGlmIChkdHMuaW5kZXhPZignVHlwZWRBcnJheScpID4gLTEpIHtcbiAgICAgIGhlYWRlciArPSBgXG5leHBvcnQgdHlwZSBUeXBlZEFycmF5ID0gSW50OEFycmF5IHwgVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5IHwgSW50MTZBcnJheSB8IFVpbnQxNkFycmF5IHwgSW50MzJBcnJheSB8IFVpbnQzMkFycmF5IHwgRmxvYXQzMkFycmF5IHwgRmxvYXQ2NEFycmF5IHwgQmlnSW50NjRBcnJheSB8IEJpZ1VpbnQ2NEFycmF5XG5gXG4gICAgfVxuXG4gICAgZHRzID0gaGVhZGVyICsgZHRzXG5cbiAgICB0cnkge1xuICAgICAgZGVidWcoJ1dyaXRpbmcgdHlwZSBkZWYgdG86JylcbiAgICAgIGRlYnVnKCcgICVpJywgZGVzdClcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKGRlc3QsIGR0cywgJ3V0Zi04JylcbiAgICAgIHRoaXMub3V0cHV0cy5wdXNoKHsga2luZDogJ2R0cycsIHBhdGg6IGRlc3QgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1Zy5lcnJvcignRmFpbGVkIHRvIHdyaXRlIHR5cGUgZGVmIGZpbGUnKVxuICAgICAgZGVidWcuZXJyb3IoZSBhcyBFcnJvcilcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwb3J0c1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUpzQmluZGluZyhpZGVudHM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMub3B0aW9ucy5wbGF0Zm9ybSB8fFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgICB0aGlzLm9wdGlvbnMubm9Kc0JpbmRpbmcgfHxcbiAgICAgIGlkZW50cy5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm9wdGlvbnMuanNCaW5kaW5nID8/ICdpbmRleC5qcydcblxuICAgIGNvbnN0IGNyZWF0ZUJpbmRpbmcgPSB0aGlzLm9wdGlvbnMuZXNtID8gY3JlYXRlRXNtQmluZGluZyA6IGNyZWF0ZUNqc0JpbmRpbmdcbiAgICBjb25zdCBiaW5kaW5nID0gY3JlYXRlQmluZGluZyhcbiAgICAgIHRoaXMuY29uZmlnLmJpbmFyeU5hbWUsXG4gICAgICB0aGlzLmNvbmZpZy5wYWNrYWdlTmFtZSxcbiAgICAgIGlkZW50cyxcbiAgICAgIC8vIGluIG5wbSBwcmV2ZXJzaW9uIGhvb2tcbiAgICAgIHByb2Nlc3MuZW52Lm5wbV9uZXdfdmVyc2lvbiA/PyB0aGlzLmNvbmZpZy5wYWNrYWdlSnNvbi52ZXJzaW9uLFxuICAgIClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXN0ID0gam9pbih0aGlzLm91dHB1dERpciwgbmFtZSlcbiAgICAgIGRlYnVnKCdXcml0aW5nIGpzIGJpbmRpbmcgdG86JylcbiAgICAgIGRlYnVnKCcgICVpJywgZGVzdClcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKGRlc3QsIGJpbmRpbmcsICd1dGYtOCcpXG4gICAgICByZXR1cm4geyBraW5kOiAnanMnLCBwYXRoOiBkZXN0IH0gc2F0aXNmaWVzIE91dHB1dFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHdyaXRlIGpzIGJpbmRpbmcgZmlsZScsIHsgY2F1c2U6IGUgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyaXRlV2FzaUJpbmRpbmcoXG4gICAgZGlzdEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIGlkZW50czogc3RyaW5nW10sXG4gICkge1xuICAgIGlmIChkaXN0RmlsZU5hbWUpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgZGlyIH0gPSBwYXJzZShkaXN0RmlsZU5hbWUpXG4gICAgICBjb25zdCBiaW5kaW5nUGF0aCA9IGpvaW4oZGlyLCBgJHt0aGlzLmNvbmZpZy5iaW5hcnlOYW1lfS53YXNpLmNqc2ApXG4gICAgICBjb25zdCBicm93c2VyQmluZGluZ1BhdGggPSBqb2luKFxuICAgICAgICBkaXIsXG4gICAgICAgIGAke3RoaXMuY29uZmlnLmJpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2AsXG4gICAgICApXG4gICAgICBjb25zdCB3b3JrZXJQYXRoID0gam9pbihkaXIsICd3YXNpLXdvcmtlci5tanMnKVxuICAgICAgY29uc3QgYnJvd3NlcldvcmtlclBhdGggPSBqb2luKGRpciwgJ3dhc2ktd29ya2VyLWJyb3dzZXIubWpzJylcbiAgICAgIGNvbnN0IGJyb3dzZXJFbnRyeVBhdGggPSBqb2luKGRpciwgJ2Jyb3dzZXIuanMnKVxuICAgICAgY29uc3QgZXhwb3J0c0NvZGUgPVxuICAgICAgICBgbW9kdWxlLmV4cG9ydHMgPSBfX25hcGlNb2R1bGUuZXhwb3J0c1xcbmAgK1xuICAgICAgICBpZGVudHNcbiAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgKGlkZW50KSA9PlxuICAgICAgICAgICAgICBgbW9kdWxlLmV4cG9ydHMuJHtpZGVudH0gPSBfX25hcGlNb2R1bGUuZXhwb3J0cy4ke2lkZW50fWAsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5qb2luKCdcXG4nKVxuICAgICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICAgIGJpbmRpbmdQYXRoLFxuICAgICAgICBjcmVhdGVXYXNpQmluZGluZyhcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHRoaXMuY29uZmlnLnBhY2thZ2VOYW1lLFxuICAgICAgICAgIHRoaXMuY29uZmlnLndhc20/LmluaXRpYWxNZW1vcnksXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8ubWF4aW11bU1lbW9yeSxcbiAgICAgICAgKSArXG4gICAgICAgICAgZXhwb3J0c0NvZGUgK1xuICAgICAgICAgICdcXG4nLFxuICAgICAgICAndXRmOCcsXG4gICAgICApXG4gICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgICAgYnJvd3NlckJpbmRpbmdQYXRoLFxuICAgICAgICBjcmVhdGVXYXNpQnJvd3NlckJpbmRpbmcoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB0aGlzLmNvbmZpZy53YXNtPy5pbml0aWFsTWVtb3J5LFxuICAgICAgICAgIHRoaXMuY29uZmlnLndhc20/Lm1heGltdW1NZW1vcnksXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8uYnJvd3Nlcj8uZnMsXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8uYnJvd3Nlcj8uYXN5bmNJbml0LFxuICAgICAgICAgIHRoaXMuY29uZmlnLndhc20/LmJyb3dzZXI/LmJ1ZmZlcixcbiAgICAgICAgKSArXG4gICAgICAgICAgYGV4cG9ydCBkZWZhdWx0IF9fbmFwaU1vZHVsZS5leHBvcnRzXFxuYCArXG4gICAgICAgICAgaWRlbnRzXG4gICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAoaWRlbnQpID0+XG4gICAgICAgICAgICAgICAgYGV4cG9ydCBjb25zdCAke2lkZW50fSA9IF9fbmFwaU1vZHVsZS5leHBvcnRzLiR7aWRlbnR9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKSArXG4gICAgICAgICAgJ1xcbicsXG4gICAgICAgICd1dGY4JyxcbiAgICAgIClcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKHdvcmtlclBhdGgsIFdBU0lfV09SS0VSX1RFTVBMQVRFLCAndXRmOCcpXG4gICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgICAgYnJvd3NlcldvcmtlclBhdGgsXG4gICAgICAgIGNyZWF0ZVdhc2lCcm93c2VyV29ya2VyQmluZGluZyh0aGlzLmNvbmZpZy53YXNtPy5icm93c2VyPy5mcyA/PyBmYWxzZSksXG4gICAgICAgICd1dGY4JyxcbiAgICAgIClcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKFxuICAgICAgICBicm93c2VyRW50cnlQYXRoLFxuICAgICAgICBgZXhwb3J0ICogZnJvbSAnJHt0aGlzLmNvbmZpZy5wYWNrYWdlTmFtZX0td2FzbTMyLXdhc2knXFxuYCxcbiAgICAgIClcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHsga2luZDogJ2pzJywgcGF0aDogYmluZGluZ1BhdGggfSxcbiAgICAgICAgeyBraW5kOiAnanMnLCBwYXRoOiBicm93c2VyQmluZGluZ1BhdGggfSxcbiAgICAgICAgeyBraW5kOiAnanMnLCBwYXRoOiB3b3JrZXJQYXRoIH0sXG4gICAgICAgIHsga2luZDogJ2pzJywgcGF0aDogYnJvd3NlcldvcmtlclBhdGggfSxcbiAgICAgICAgeyBraW5kOiAnanMnLCBwYXRoOiBicm93c2VyRW50cnlQYXRoIH0sXG4gICAgICBdIHNhdGlzZmllcyBPdXRwdXRbXVxuICAgIH1cbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHByaXZhdGUgc2V0RW52SWZOb3RFeGlzdHMoZW52OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXByb2Nlc3MuZW52W2Vudl0pIHtcbiAgICAgIHRoaXMuZW52c1tlbnZdID0gdmFsdWVcbiAgICB9XG4gIH1cbn1cbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgY29kZWdlbi9pbmRleC50c1xuLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlIG1hbnVhbGx5XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tICdjbGlwYW5pb24nXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQnVpbGRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBwYXRocyA9IFtbJ2J1aWxkJ11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246ICdCdWlsZCB0aGUgTkFQSS1SUyBwcm9qZWN0JyxcbiAgfSlcblxuICB0YXJnZXQ/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLXRhcmdldCwtdCcsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdCdWlsZCBmb3IgdGhlIHRhcmdldCB0cmlwbGUsIGJ5cGFzc2VkIHRvIGBjYXJnbyBidWlsZCAtLXRhcmdldGAnLFxuICB9KVxuXG4gIGN3ZD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tY3dkJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aCcsXG4gIH0pXG5cbiAgbWFuaWZlc3RQYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1tYW5pZmVzdC1wYXRoJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgQ2FyZ28udG9tbGAnLFxuICB9KVxuXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWNvbmZpZy1wYXRoLC1jJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZScsXG4gIH0pXG5cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLWpzb24tcGF0aCcsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYHBhY2thZ2UuanNvbmAnLFxuICB9KVxuXG4gIHRhcmdldERpcj86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tdGFyZ2V0LWRpcicsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdEaXJlY3RvcnkgZm9yIGFsbCBjcmF0ZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzLCBzZWUgYGNhcmdvIGJ1aWxkIC0tdGFyZ2V0LWRpcmAnLFxuICB9KVxuXG4gIG91dHB1dERpcj86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tb3V0cHV0LWRpciwtbycsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRoIHRvIHdoZXJlIGFsbCB0aGUgYnVpbHQgZmlsZXMgd291bGQgYmUgcHV0LiBEZWZhdWx0IHRvIHRoZSBjcmF0ZSBmb2xkZXInLFxuICB9KVxuXG4gIHBsYXRmb3JtPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLXBsYXRmb3JtJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0FkZCBwbGF0Zm9ybSB0cmlwbGUgdG8gdGhlIGdlbmVyYXRlZCBub2RlanMgYmluZGluZyBmaWxlLCBlZzogYFtuYW1lXS5saW51eC14NjQtZ251Lm5vZGVgJyxcbiAgfSlcblxuICBqc1BhY2thZ2VOYW1lPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1qcy1wYWNrYWdlLW5hbWUnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGFja2FnZSBuYW1lIGluIGdlbmVyYXRlZCBqcyBiaW5kaW5nIGZpbGUuIE9ubHkgd29ya3Mgd2l0aCBgLS1wbGF0Zm9ybWAgZmxhZycsXG4gIH0pXG5cbiAgY29uc3RFbnVtPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLWNvbnN0LWVudW0nLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIGdlbmVyYXRlIGNvbnN0IGVudW0gZm9yIHR5cGVzY3JpcHQgYmluZGluZ3MnLFxuICB9KVxuXG4gIGpzQmluZGluZz86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tanMnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGF0aCBhbmQgZmlsZW5hbWUgb2YgZ2VuZXJhdGVkIEpTIGJpbmRpbmcgZmlsZS4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLiBSZWxhdGl2ZSB0byBgLS1vdXRwdXQtZGlyYC4nLFxuICB9KVxuXG4gIG5vSnNCaW5kaW5nPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLW5vLWpzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1doZXRoZXIgdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBKUyBiaW5kaW5nIGZpbGUuIE9ubHkgd29ya3Mgd2l0aCBgLS1wbGF0Zm9ybWAgZmxhZy4nLFxuICB9KVxuXG4gIGR0cz86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tZHRzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGggYW5kIGZpbGVuYW1lIG9mIGdlbmVyYXRlZCB0eXBlIGRlZiBmaWxlLiBSZWxhdGl2ZSB0byBgLS1vdXRwdXQtZGlyYCcsXG4gIH0pXG5cbiAgZHRzSGVhZGVyPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1kdHMtaGVhZGVyJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0N1c3RvbSBmaWxlIGhlYWRlciBmb3IgZ2VuZXJhdGVkIHR5cGUgZGVmIGZpbGUuIE9ubHkgd29ya3Mgd2hlbiBgdHlwZWRlZmAgZmVhdHVyZSBlbmFibGVkLicsXG4gIH0pXG5cbiAgbm9EdHNIZWFkZXI/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tbm8tZHRzLWhlYWRlcicsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdXaGV0aGVyIHRvIGRpc2FibGUgdGhlIGRlZmF1bHQgZmlsZSBoZWFkZXIgZm9yIGdlbmVyYXRlZCB0eXBlIGRlZiBmaWxlLiBPbmx5IHdvcmtzIHdoZW4gYHR5cGVkZWZgIGZlYXR1cmUgZW5hYmxlZC4nLFxuICB9KVxuXG4gIGR0c0NhY2hlID0gT3B0aW9uLkJvb2xlYW4oJy0tZHRzLWNhY2hlJywgdHJ1ZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBlbmFibGUgdGhlIGR0cyBjYWNoZSwgZGVmYXVsdCB0byB0cnVlJyxcbiAgfSlcblxuICBlc20/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tZXNtJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1doZXRoZXIgdG8gZW1pdCBhbiBFU00gSlMgYmluZGluZyBmaWxlIGluc3RlYWQgb2YgQ0pTIGZvcm1hdC4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLicsXG4gIH0pXG5cbiAgc3RyaXA/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tc3RyaXAsLXMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHN0cmlwIHRoZSBsaWJyYXJ5IHRvIGFjaGlldmUgdGhlIG1pbmltdW0gZmlsZSBzaXplJyxcbiAgfSlcblxuICByZWxlYXNlPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLXJlbGVhc2UsLXInLCB7XG4gICAgZGVzY3JpcHRpb246ICdCdWlsZCBpbiByZWxlYXNlIG1vZGUnLFxuICB9KVxuXG4gIHZlcmJvc2U/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tdmVyYm9zZSwtdicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1ZlcmJvc2VseSBsb2cgYnVpbGQgY29tbWFuZCB0cmFjZScsXG4gIH0pXG5cbiAgYmluPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1iaW4nLCB7XG4gICAgZGVzY3JpcHRpb246ICdCdWlsZCBvbmx5IHRoZSBzcGVjaWZpZWQgYmluYXJ5JyxcbiAgfSlcblxuICBwYWNrYWdlPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLC1wJywge1xuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgdGhlIHNwZWNpZmllZCBsaWJyYXJ5IG9yIHRoZSBvbmUgYXQgY3dkJyxcbiAgfSlcblxuICBwcm9maWxlPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1wcm9maWxlJywge1xuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgYXJ0aWZhY3RzIHdpdGggdGhlIHNwZWNpZmllZCBwcm9maWxlJyxcbiAgfSlcblxuICBjcm9zc0NvbXBpbGU/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tY3Jvc3MtY29tcGlsZSwteCcsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdbZXhwZXJpbWVudGFsXSBjcm9zcy1jb21waWxlIGZvciB0aGUgc3BlY2lmaWVkIHRhcmdldCB3aXRoIGBjYXJnby14d2luYCBvbiB3aW5kb3dzIGFuZCBgY2FyZ28temlnYnVpbGRgIG9uIG90aGVyIHBsYXRmb3JtJyxcbiAgfSlcblxuICB1c2VDcm9zcz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS11c2UtY3Jvc3MnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnW2V4cGVyaW1lbnRhbF0gdXNlIFtjcm9zc10oaHR0cHM6Ly9naXRodWIuY29tL2Nyb3NzLXJzL2Nyb3NzKSBpbnN0ZWFkIG9mIGBjYXJnb2AnLFxuICB9KVxuXG4gIHVzZU5hcGlDcm9zcz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS11c2UtbmFwaS1jcm9zcycsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdbZXhwZXJpbWVudGFsXSB1c2UgQG5hcGktcnMvY3Jvc3MtdG9vbGNoYWluIHRvIGNyb3NzLWNvbXBpbGUgTGludXggYXJtL2FybTY0L3g2NCBnbnUgdGFyZ2V0cy4nLFxuICB9KVxuXG4gIHdhdGNoPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLXdhdGNoLC13Jywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ3dhdGNoIHRoZSBjcmF0ZSBjaGFuZ2VzIGFuZCBidWlsZCBjb250aW51b3VzbHkgd2l0aCBgY2FyZ28td2F0Y2hgIGNyYXRlcycsXG4gIH0pXG5cbiAgZmVhdHVyZXM/OiBzdHJpbmdbXSA9IE9wdGlvbi5BcnJheSgnLS1mZWF0dXJlcywtRicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1NwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGZlYXR1cmVzIHRvIGFjdGl2YXRlJyxcbiAgfSlcblxuICBhbGxGZWF0dXJlcz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS1hbGwtZmVhdHVyZXMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmF0ZSBhbGwgYXZhaWxhYmxlIGZlYXR1cmVzJyxcbiAgfSlcblxuICBub0RlZmF1bHRGZWF0dXJlcz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS1uby1kZWZhdWx0LWZlYXR1cmVzJywge1xuICAgIGRlc2NyaXB0aW9uOiAnRG8gbm90IGFjdGl2YXRlIHRoZSBgZGVmYXVsdGAgZmVhdHVyZScsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiB0aGlzLnRhcmdldCxcbiAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICBtYW5pZmVzdFBhdGg6IHRoaXMubWFuaWZlc3RQYXRoLFxuICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgcGFja2FnZUpzb25QYXRoOiB0aGlzLnBhY2thZ2VKc29uUGF0aCxcbiAgICAgIHRhcmdldERpcjogdGhpcy50YXJnZXREaXIsXG4gICAgICBvdXRwdXREaXI6IHRoaXMub3V0cHV0RGlyLFxuICAgICAgcGxhdGZvcm06IHRoaXMucGxhdGZvcm0sXG4gICAgICBqc1BhY2thZ2VOYW1lOiB0aGlzLmpzUGFja2FnZU5hbWUsXG4gICAgICBjb25zdEVudW06IHRoaXMuY29uc3RFbnVtLFxuICAgICAganNCaW5kaW5nOiB0aGlzLmpzQmluZGluZyxcbiAgICAgIG5vSnNCaW5kaW5nOiB0aGlzLm5vSnNCaW5kaW5nLFxuICAgICAgZHRzOiB0aGlzLmR0cyxcbiAgICAgIGR0c0hlYWRlcjogdGhpcy5kdHNIZWFkZXIsXG4gICAgICBub0R0c0hlYWRlcjogdGhpcy5ub0R0c0hlYWRlcixcbiAgICAgIGR0c0NhY2hlOiB0aGlzLmR0c0NhY2hlLFxuICAgICAgZXNtOiB0aGlzLmVzbSxcbiAgICAgIHN0cmlwOiB0aGlzLnN0cmlwLFxuICAgICAgcmVsZWFzZTogdGhpcy5yZWxlYXNlLFxuICAgICAgdmVyYm9zZTogdGhpcy52ZXJib3NlLFxuICAgICAgYmluOiB0aGlzLmJpbixcbiAgICAgIHBhY2thZ2U6IHRoaXMucGFja2FnZSxcbiAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgIGNyb3NzQ29tcGlsZTogdGhpcy5jcm9zc0NvbXBpbGUsXG4gICAgICB1c2VDcm9zczogdGhpcy51c2VDcm9zcyxcbiAgICAgIHVzZU5hcGlDcm9zczogdGhpcy51c2VOYXBpQ3Jvc3MsXG4gICAgICB3YXRjaDogdGhpcy53YXRjaCxcbiAgICAgIGZlYXR1cmVzOiB0aGlzLmZlYXR1cmVzLFxuICAgICAgYWxsRmVhdHVyZXM6IHRoaXMuYWxsRmVhdHVyZXMsXG4gICAgICBub0RlZmF1bHRGZWF0dXJlczogdGhpcy5ub0RlZmF1bHRGZWF0dXJlcyxcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgTkFQSS1SUyBwcm9qZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEJ1aWxkIGZvciB0aGUgdGFyZ2V0IHRyaXBsZSwgYnlwYXNzZWQgdG8gYGNhcmdvIGJ1aWxkIC0tdGFyZ2V0YFxuICAgKi9cbiAgdGFyZ2V0Pzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGhcbiAgICovXG4gIGN3ZD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgQ2FyZ28udG9tbGBcbiAgICovXG4gIG1hbmlmZXN0UGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZVxuICAgKi9cbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgcGFja2FnZS5qc29uYFxuICAgKi9cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgZm9yIGFsbCBjcmF0ZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzLCBzZWUgYGNhcmdvIGJ1aWxkIC0tdGFyZ2V0LWRpcmBcbiAgICovXG4gIHRhcmdldERpcj86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB3aGVyZSBhbGwgdGhlIGJ1aWx0IGZpbGVzIHdvdWxkIGJlIHB1dC4gRGVmYXVsdCB0byB0aGUgY3JhdGUgZm9sZGVyXG4gICAqL1xuICBvdXRwdXREaXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEFkZCBwbGF0Zm9ybSB0cmlwbGUgdG8gdGhlIGdlbmVyYXRlZCBub2RlanMgYmluZGluZyBmaWxlLCBlZzogYFtuYW1lXS5saW51eC14NjQtZ251Lm5vZGVgXG4gICAqL1xuICBwbGF0Zm9ybT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFBhY2thZ2UgbmFtZSBpbiBnZW5lcmF0ZWQganMgYmluZGluZyBmaWxlLiBPbmx5IHdvcmtzIHdpdGggYC0tcGxhdGZvcm1gIGZsYWdcbiAgICovXG4gIGpzUGFja2FnZU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFdoZXRoZXIgZ2VuZXJhdGUgY29uc3QgZW51bSBmb3IgdHlwZXNjcmlwdCBiaW5kaW5nc1xuICAgKi9cbiAgY29uc3RFbnVtPzogYm9vbGVhblxuICAvKipcbiAgICogUGF0aCBhbmQgZmlsZW5hbWUgb2YgZ2VuZXJhdGVkIEpTIGJpbmRpbmcgZmlsZS4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLiBSZWxhdGl2ZSB0byBgLS1vdXRwdXQtZGlyYC5cbiAgICovXG4gIGpzQmluZGluZz86IHN0cmluZ1xuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIEpTIGJpbmRpbmcgZmlsZS4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLlxuICAgKi9cbiAgbm9Kc0JpbmRpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBQYXRoIGFuZCBmaWxlbmFtZSBvZiBnZW5lcmF0ZWQgdHlwZSBkZWYgZmlsZS4gUmVsYXRpdmUgdG8gYC0tb3V0cHV0LWRpcmBcbiAgICovXG4gIGR0cz86IHN0cmluZ1xuICAvKipcbiAgICogQ3VzdG9tIGZpbGUgaGVhZGVyIGZvciBnZW5lcmF0ZWQgdHlwZSBkZWYgZmlsZS4gT25seSB3b3JrcyB3aGVuIGB0eXBlZGVmYCBmZWF0dXJlIGVuYWJsZWQuXG4gICAqL1xuICBkdHNIZWFkZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdCBmaWxlIGhlYWRlciBmb3IgZ2VuZXJhdGVkIHR5cGUgZGVmIGZpbGUuIE9ubHkgd29ya3Mgd2hlbiBgdHlwZWRlZmAgZmVhdHVyZSBlbmFibGVkLlxuICAgKi9cbiAgbm9EdHNIZWFkZXI/OiBib29sZWFuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSB0aGUgZHRzIGNhY2hlLCBkZWZhdWx0IHRvIHRydWVcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZHRzQ2FjaGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtaXQgYW4gRVNNIEpTIGJpbmRpbmcgZmlsZSBpbnN0ZWFkIG9mIENKUyBmb3JtYXQuIE9ubHkgd29ya3Mgd2l0aCBgLS1wbGF0Zm9ybWAgZmxhZy5cbiAgICovXG4gIGVzbT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc3RyaXAgdGhlIGxpYnJhcnkgdG8gYWNoaWV2ZSB0aGUgbWluaW11bSBmaWxlIHNpemVcbiAgICovXG4gIHN0cmlwPzogYm9vbGVhblxuICAvKipcbiAgICogQnVpbGQgaW4gcmVsZWFzZSBtb2RlXG4gICAqL1xuICByZWxlYXNlPzogYm9vbGVhblxuICAvKipcbiAgICogVmVyYm9zZWx5IGxvZyBidWlsZCBjb21tYW5kIHRyYWNlXG4gICAqL1xuICB2ZXJib3NlPzogYm9vbGVhblxuICAvKipcbiAgICogQnVpbGQgb25seSB0aGUgc3BlY2lmaWVkIGJpbmFyeVxuICAgKi9cbiAgYmluPzogc3RyaW5nXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgc3BlY2lmaWVkIGxpYnJhcnkgb3IgdGhlIG9uZSBhdCBjd2RcbiAgICovXG4gIHBhY2thZ2U/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEJ1aWxkIGFydGlmYWN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvZmlsZVxuICAgKi9cbiAgcHJvZmlsZT86IHN0cmluZ1xuICAvKipcbiAgICogW2V4cGVyaW1lbnRhbF0gY3Jvc3MtY29tcGlsZSBmb3IgdGhlIHNwZWNpZmllZCB0YXJnZXQgd2l0aCBgY2FyZ28teHdpbmAgb24gd2luZG93cyBhbmQgYGNhcmdvLXppZ2J1aWxkYCBvbiBvdGhlciBwbGF0Zm9ybVxuICAgKi9cbiAgY3Jvc3NDb21waWxlPzogYm9vbGVhblxuICAvKipcbiAgICogW2V4cGVyaW1lbnRhbF0gdXNlIFtjcm9zc10oaHR0cHM6Ly9naXRodWIuY29tL2Nyb3NzLXJzL2Nyb3NzKSBpbnN0ZWFkIG9mIGBjYXJnb2BcbiAgICovXG4gIHVzZUNyb3NzPzogYm9vbGVhblxuICAvKipcbiAgICogW2V4cGVyaW1lbnRhbF0gdXNlIEBuYXBpLXJzL2Nyb3NzLXRvb2xjaGFpbiB0byBjcm9zcy1jb21waWxlIExpbnV4IGFybS9hcm02NC94NjQgZ251IHRhcmdldHMuXG4gICAqL1xuICB1c2VOYXBpQ3Jvc3M/OiBib29sZWFuXG4gIC8qKlxuICAgKiB3YXRjaCB0aGUgY3JhdGUgY2hhbmdlcyBhbmQgYnVpbGQgY29udGludW91c2x5IHdpdGggYGNhcmdvLXdhdGNoYCBjcmF0ZXNcbiAgICovXG4gIHdhdGNoPzogYm9vbGVhblxuICAvKipcbiAgICogU3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgZmVhdHVyZXMgdG8gYWN0aXZhdGVcbiAgICovXG4gIGZlYXR1cmVzPzogc3RyaW5nW11cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGFsbCBhdmFpbGFibGUgZmVhdHVyZXNcbiAgICovXG4gIGFsbEZlYXR1cmVzPzogYm9vbGVhblxuICAvKipcbiAgICogRG8gbm90IGFjdGl2YXRlIHRoZSBgZGVmYXVsdGAgZmVhdHVyZVxuICAgKi9cbiAgbm9EZWZhdWx0RmVhdHVyZXM/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRCdWlsZE9wdGlvbnMob3B0aW9uczogQnVpbGRPcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgZHRzQ2FjaGU6IHRydWUsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxufVxuIiwiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5cbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJ2NsaXBhbmlvbidcblxuaW1wb3J0IHsgYnVpbGRQcm9qZWN0IH0gZnJvbSAnLi4vYXBpL2J1aWxkLmpzJ1xuaW1wb3J0IHsgQmFzZUJ1aWxkQ29tbWFuZCB9IGZyb20gJy4uL2RlZi9idWlsZC5qcydcbmltcG9ydCB7IGRlYnVnRmFjdG9yeSB9IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnRmFjdG9yeSgnYnVpbGQnKVxuXG5leHBvcnQgY2xhc3MgQnVpbGRDb21tYW5kIGV4dGVuZHMgQmFzZUJ1aWxkQ29tbWFuZCB7XG4gIHBpcGUgPSBPcHRpb24uU3RyaW5nKCctLXBpcGUnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGlwZSBhbGwgb3V0cHV0cyBmaWxlIHRvIGdpdmVuIGNvbW1hbmQuIGUuZy4gYG5hcGkgYnVpbGQgLS1waXBlIFwibnB4IHByZXR0aWVyIC0td3JpdGVcImAnLFxuICB9KVxuXG4gIGNhcmdvT3B0aW9ucyA9IE9wdGlvbi5SZXN0KClcblxuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGNvbnN0IHsgdGFzayB9ID0gYXdhaXQgYnVpbGRQcm9qZWN0KHtcbiAgICAgIC4uLnRoaXMuZ2V0T3B0aW9ucygpLFxuICAgICAgY2FyZ29PcHRpb25zOiB0aGlzLmNhcmdvT3B0aW9ucyxcbiAgICB9KVxuXG4gICAgY29uc3Qgb3V0cHV0cyA9IGF3YWl0IHRhc2tcblxuICAgIGlmICh0aGlzLnBpcGUpIHtcbiAgICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIG91dHB1dHMpIHtcbiAgICAgICAgZGVidWcoJ1BpcGluZyBvdXRwdXQgZmlsZSB0byBjb21tYW5kOiAlcycsIHRoaXMucGlwZSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBleGVjU3luYyhgJHt0aGlzLnBpcGV9ICR7b3V0cHV0LnBhdGh9YCwge1xuICAgICAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgICAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGRlYnVnLmVycm9yKGBGYWlsZWQgdG8gcGlwZSBvdXRwdXQgZmlsZSAke291dHB1dC5wYXRofSB0byBjb21tYW5kYClcbiAgICAgICAgICBkZWJ1Zy5lcnJvcihlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNyZWF0ZU5wbURpcnNDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBwYXRocyA9IFtbJ2NyZWF0ZS1ucG0tZGlycyddXVxuXG4gIHN0YXRpYyB1c2FnZSA9IENvbW1hbmQuVXNhZ2Uoe1xuICAgIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIG5wbSBwYWNrYWdlIGRpcnMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMnLFxuICB9KVxuXG4gIGN3ZCA9IE9wdGlvbi5TdHJpbmcoJy0tY3dkJywgcHJvY2Vzcy5jd2QoKSwge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aCcsXG4gIH0pXG5cbiAgY29uZmlnUGF0aD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tY29uZmlnLXBhdGgsLWMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlJyxcbiAgfSlcblxuICBwYWNrYWdlSnNvblBhdGggPSBPcHRpb24uU3RyaW5nKCctLXBhY2thZ2UtanNvbi1wYXRoJywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYHBhY2thZ2UuanNvbmAnLFxuICB9KVxuXG4gIG5wbURpciA9IE9wdGlvbi5TdHJpbmcoJy0tbnBtLWRpcicsICducG0nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXQnLFxuICB9KVxuXG4gIGRyeVJ1biA9IE9wdGlvbi5Cb29sZWFuKCctLWRyeS1ydW4nLCBmYWxzZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnRHJ5IHJ1biB3aXRob3V0IHRvdWNoaW5nIGZpbGUgc3lzdGVtJyxcbiAgfSlcblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgcGFja2FnZUpzb25QYXRoOiB0aGlzLnBhY2thZ2VKc29uUGF0aCxcbiAgICAgIG5wbURpcjogdGhpcy5ucG1EaXIsXG4gICAgICBkcnlSdW46IHRoaXMuZHJ5UnVuLFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBucG0gcGFja2FnZSBkaXJzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTnBtRGlyc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoXG4gICAqXG4gICAqIEBkZWZhdWx0IHByb2Nlc3MuY3dkKClcbiAgICovXG4gIGN3ZD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZVxuICAgKi9cbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgcGFja2FnZS5qc29uYFxuICAgKlxuICAgKiBAZGVmYXVsdCAncGFja2FnZS5qc29uJ1xuICAgKi9cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXRcbiAgICpcbiAgICogQGRlZmF1bHQgJ25wbSdcbiAgICovXG4gIG5wbURpcj86IHN0cmluZ1xuICAvKipcbiAgICogRHJ5IHJ1biB3aXRob3V0IHRvdWNoaW5nIGZpbGUgc3lzdGVtXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkcnlSdW4/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRDcmVhdGVOcG1EaXJzT3B0aW9ucyhcbiAgb3B0aW9uczogQ3JlYXRlTnBtRGlyc09wdGlvbnMsXG4pIHtcbiAgcmV0dXJuIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgcGFja2FnZUpzb25QYXRoOiAncGFja2FnZS5qc29uJyxcbiAgICBucG1EaXI6ICducG0nLFxuICAgIGRyeVJ1bjogZmFsc2UsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxufVxuIiwiaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdzZW12ZXInXG5cbmltcG9ydCB7XG4gIGFwcGx5RGVmYXVsdENyZWF0ZU5wbURpcnNPcHRpb25zLFxuICBDcmVhdGVOcG1EaXJzT3B0aW9ucyxcbn0gZnJvbSAnLi4vZGVmL2NyZWF0ZS1ucG0tZGlycy5qcydcbmltcG9ydCB7XG4gIGRlYnVnRmFjdG9yeSxcbiAgcmVhZE5hcGlDb25maWcsXG4gIG1rZGlyQXN5bmMgYXMgcmF3TWtkaXJBc3luYyxcbiAgcGljayxcbiAgd3JpdGVGaWxlQXN5bmMgYXMgcmF3V3JpdGVGaWxlQXN5bmMsXG4gIFRhcmdldCxcbiAgdHlwZSBDb21tb25QYWNrYWdlSnNvbkZpZWxkcyxcbn0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCdjcmVhdGUtbnBtLWRpcnMnKVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VNZXRhIHtcbiAgJ2Rpc3QtdGFncyc6IHsgW2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTnBtRGlycyh1c2VyT3B0aW9uczogQ3JlYXRlTnBtRGlyc09wdGlvbnMpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGFwcGx5RGVmYXVsdENyZWF0ZU5wbURpcnNPcHRpb25zKHVzZXJPcHRpb25zKVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG1rZGlyQXN5bmMoZGlyOiBzdHJpbmcpIHtcbiAgICBkZWJ1ZygnVHJ5IHRvIGNyZWF0ZSBkaXI6ICVpJywgZGlyKVxuICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgcmF3TWtkaXJBc3luYyhkaXIsIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlQXN5bmMoZmlsZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpIHtcbiAgICBkZWJ1ZygnV3JpdGluZyBmaWxlICVpJywgZmlsZSlcblxuICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgZGVidWcoY29udGVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHJhd1dyaXRlRmlsZUFzeW5jKGZpbGUsIGNvbnRlbnQpXG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLnBhY2thZ2VKc29uUGF0aClcbiAgY29uc3QgbnBtUGF0aCA9IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMubnBtRGlyKVxuXG4gIGRlYnVnKGBSZWFkIGNvbnRlbnQgZnJvbSBbJHtvcHRpb25zLmNvbmZpZ1BhdGggPz8gcGFja2FnZUpzb25QYXRofV1gKVxuXG4gIGNvbnN0IHsgdGFyZ2V0cywgYmluYXJ5TmFtZSwgcGFja2FnZU5hbWUsIHBhY2thZ2VKc29uIH0gPVxuICAgIGF3YWl0IHJlYWROYXBpQ29uZmlnKFxuICAgICAgcGFja2FnZUpzb25QYXRoLFxuICAgICAgb3B0aW9ucy5jb25maWdQYXRoID8gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5jb25maWdQYXRoKSA6IHVuZGVmaW5lZCxcbiAgICApXG5cbiAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IHRhcmdldERpciA9IGpvaW4obnBtUGF0aCwgYCR7dGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX1gKVxuICAgIGF3YWl0IG1rZGlyQXN5bmModGFyZ2V0RGlyKVxuXG4gICAgY29uc3QgYmluYXJ5RmlsZU5hbWUgPVxuICAgICAgdGFyZ2V0LmFyY2ggPT09ICd3YXNtMzInXG4gICAgICAgID8gYCR7YmluYXJ5TmFtZX0uJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfS53YXNtYFxuICAgICAgICA6IGAke2JpbmFyeU5hbWV9LiR7dGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX0ubm9kZWBcbiAgICBjb25zdCBzY29wZWRQYWNrYWdlSnNvbjogQ29tbW9uUGFja2FnZUpzb25GaWVsZHMgPSB7XG4gICAgICBuYW1lOiBgJHtwYWNrYWdlTmFtZX0tJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfWAsXG4gICAgICB2ZXJzaW9uOiBwYWNrYWdlSnNvbi52ZXJzaW9uLFxuICAgICAgY3B1OiB0YXJnZXQuYXJjaCAhPT0gJ3VuaXZlcnNhbCcgPyBbdGFyZ2V0LmFyY2hdIDogdW5kZWZpbmVkLFxuICAgICAgbWFpbjogYmluYXJ5RmlsZU5hbWUsXG4gICAgICBmaWxlczogW2JpbmFyeUZpbGVOYW1lXSxcbiAgICAgIC4uLnBpY2soXG4gICAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAna2V5d29yZHMnLFxuICAgICAgICAnYXV0aG9yJyxcbiAgICAgICAgJ2F1dGhvcnMnLFxuICAgICAgICAnaG9tZXBhZ2UnLFxuICAgICAgICAnbGljZW5zZScsXG4gICAgICAgICdlbmdpbmVzJyxcbiAgICAgICAgJ3JlcG9zaXRvcnknLFxuICAgICAgICAnYnVncycsXG4gICAgICApLFxuICAgIH1cbiAgICBpZiAocGFja2FnZUpzb24ucHVibGlzaENvbmZpZykge1xuICAgICAgc2NvcGVkUGFja2FnZUpzb24ucHVibGlzaENvbmZpZyA9IHBpY2soXG4gICAgICAgIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWcsXG4gICAgICAgICdyZWdpc3RyeScsXG4gICAgICAgICdhY2Nlc3MnLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAodGFyZ2V0LmFyY2ggIT09ICd3YXNtMzInKSB7XG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5vcyA9IFt0YXJnZXQucGxhdGZvcm1dXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gYCR7YmluYXJ5TmFtZX0ud2FzaS5janNgXG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5tYWluID0gZW50cnlcbiAgICAgIHNjb3BlZFBhY2thZ2VKc29uLmJyb3dzZXIgPSBgJHtiaW5hcnlOYW1lfS53YXNpLWJyb3dzZXIuanNgXG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5maWxlcz8ucHVzaChcbiAgICAgICAgZW50cnksXG4gICAgICAgIHNjb3BlZFBhY2thZ2VKc29uLmJyb3dzZXIsXG4gICAgICAgIGB3YXNpLXdvcmtlci5tanNgLFxuICAgICAgICBgd2FzaS13b3JrZXItYnJvd3Nlci5tanNgLFxuICAgICAgKVxuICAgICAgbGV0IG5lZWRSZXN0cmljdE5vZGVWZXJzaW9uID0gdHJ1ZVxuICAgICAgaWYgKHNjb3BlZFBhY2thZ2VKc29uLmVuZ2luZXM/Lm5vZGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IG1ham9yIH0gPSBwYXJzZShzY29wZWRQYWNrYWdlSnNvbi5lbmdpbmVzLm5vZGUpID8/IHtcbiAgICAgICAgICAgIG1ham9yOiAwLFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWFqb3IgPj0gMTQpIHtcbiAgICAgICAgICAgIG5lZWRSZXN0cmljdE5vZGVWZXJzaW9uID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobmVlZFJlc3RyaWN0Tm9kZVZlcnNpb24pIHtcbiAgICAgICAgc2NvcGVkUGFja2FnZUpzb24uZW5naW5lcyA9IHtcbiAgICAgICAgICBub2RlOiAnPj0xNC4wLjAnLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3YXNtUnVudGltZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQG5hcGktcnMvd2FzbS1ydW50aW1lYCxcbiAgICAgICkudGhlbigocmVzKSA9PiByZXMuanNvbigpIGFzIFByb21pc2U8UGFja2FnZU1ldGE+KVxuICAgICAgc2NvcGVkUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID0ge1xuICAgICAgICAnQG5hcGktcnMvd2FzbS1ydW50aW1lJzogYF4ke3dhc21SdW50aW1lWydkaXN0LXRhZ3MnXS5sYXRlc3R9YCxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0LmFiaSA9PT0gJ2dudScpIHtcbiAgICAgIHNjb3BlZFBhY2thZ2VKc29uLmxpYmMgPSBbJ2dsaWJjJ11cbiAgICB9IGVsc2UgaWYgKHRhcmdldC5hYmkgPT09ICdtdXNsJykge1xuICAgICAgc2NvcGVkUGFja2FnZUpzb24ubGliYyA9IFsnbXVzbCddXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0UGFja2FnZUpzb24gPSBqb2luKHRhcmdldERpciwgJ3BhY2thZ2UuanNvbicpXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICB0YXJnZXRQYWNrYWdlSnNvbixcbiAgICAgIEpTT04uc3RyaW5naWZ5KHNjb3BlZFBhY2thZ2VKc29uLCBudWxsLCAyKSArICdcXG4nLFxuICAgIClcbiAgICBjb25zdCB0YXJnZXRSZWFkbWUgPSBqb2luKHRhcmdldERpciwgJ1JFQURNRS5tZCcpXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmModGFyZ2V0UmVhZG1lLCByZWFkbWUocGFja2FnZU5hbWUsIHRhcmdldCkpXG5cbiAgICBkZWJ1Zy5pbmZvKGAke3BhY2thZ2VOYW1lfSAtJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfSBjcmVhdGVkYClcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkbWUocGFja2FnZU5hbWU6IHN0cmluZywgdGFyZ2V0OiBUYXJnZXQpIHtcbiAgcmV0dXJuIGAjIFxcYCR7cGFja2FnZU5hbWV9LSR7dGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX1cXGBcblxuVGhpcyBpcyB0aGUgKioke3RhcmdldC50cmlwbGV9KiogYmluYXJ5IGZvciBcXGAke3BhY2thZ2VOYW1lfVxcYFxuYFxufVxuIiwiaW1wb3J0IHsgY3JlYXRlTnBtRGlycyB9IGZyb20gJy4uL2FwaS9jcmVhdGUtbnBtLWRpcnMuanMnXG5pbXBvcnQgeyBCYXNlQ3JlYXRlTnBtRGlyc0NvbW1hbmQgfSBmcm9tICcuLi9kZWYvY3JlYXRlLW5wbS1kaXJzLmpzJ1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlTnBtRGlyc0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ3JlYXRlTnBtRGlyc0NvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGF3YWl0IGNyZWF0ZU5wbURpcnModGhpcy5nZXRPcHRpb25zKCkpXG4gIH1cbn1cbiIsImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjbGlwYW5pb24nXG5cbi8qKlxuICogQSBjb21tYW5kIHRoYXQgcHJpbnRzIHRoZSB1c2FnZSBvZiBhbGwgY29tbWFuZHMuXG4gKlxuICogUGF0aHM6IGAtaGAsIGAtLWhlbHBgXG4gKi9cbmV4cG9ydCBjbGFzcyBIZWxwQ29tbWFuZCBleHRlbmRzIENvbW1hbmQ8YW55PiB7XG4gIHN0YXRpYyBwYXRocyA9IFtbYC1oYF0sIFtgLS1oZWxwYF1dXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgdGhpcy5jb250ZXh0LnN0ZG91dC53cml0ZSh0aGlzLmNsaS51c2FnZSgpKVxuICB9XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuaW1wb3J0ICogYXMgdHlwYW5pb24gZnJvbSAndHlwYW5pb24nXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTmV3Q29tbWFuZCBleHRlbmRzIENvbW1hbmQge1xuICBzdGF0aWMgcGF0aHMgPSBbWyduZXcnXV1cblxuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhIG5ldyBwcm9qZWN0IHdpdGggcHJlLWNvbmZpZ3VyZWQgYm9pbGVycGxhdGUnLFxuICB9KVxuXG4gICQkcGF0aCA9IE9wdGlvbi5TdHJpbmcoeyByZXF1aXJlZDogZmFsc2UgfSlcblxuICAkJG5hbWU/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLW5hbWUsLW4nLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhlIG5hbWUgb2YgdGhlIHByb2plY3QsIGRlZmF1bHQgdG8gdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpZiBub3QgcHJvdmlkZWQnLFxuICB9KVxuXG4gIG1pbk5vZGVBcGlWZXJzaW9uID0gT3B0aW9uLlN0cmluZygnLS1taW4tbm9kZS1hcGksLXYnLCAnNCcsIHtcbiAgICB2YWxpZGF0b3I6IHR5cGFuaW9uLmlzTnVtYmVyKCksXG4gICAgZGVzY3JpcHRpb246ICdUaGUgbWluaW11bSBOb2RlLUFQSSB2ZXJzaW9uIHRvIHN1cHBvcnQnLFxuICB9KVxuXG4gIHBhY2thZ2VNYW5hZ2VyID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLW1hbmFnZXInLCAneWFybicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlLiBPbmx5IHN1cHBvcnQgeWFybiA0LnggZm9yIG5vdy4nLFxuICB9KVxuXG4gIGxpY2Vuc2UgPSBPcHRpb24uU3RyaW5nKCctLWxpY2Vuc2UsLWwnLCAnTUlUJywge1xuICAgIGRlc2NyaXB0aW9uOiAnTGljZW5zZSBmb3Igb3Blbi1zb3VyY2VkIHByb2plY3QnLFxuICB9KVxuXG4gIHRhcmdldHMgPSBPcHRpb24uQXJyYXkoJy0tdGFyZ2V0cywtdCcsIFtdLCB7XG4gICAgZGVzY3JpcHRpb246ICdBbGwgdGFyZ2V0cyB0aGUgY3JhdGUgd2lsbCBiZSBjb21waWxlZCBmb3IuJyxcbiAgfSlcblxuICBlbmFibGVEZWZhdWx0VGFyZ2V0cyA9IE9wdGlvbi5Cb29sZWFuKCctLWVuYWJsZS1kZWZhdWx0LXRhcmdldHMnLCB0cnVlLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIGVuYWJsZSBkZWZhdWx0IHRhcmdldHMnLFxuICB9KVxuXG4gIGVuYWJsZUFsbFRhcmdldHMgPSBPcHRpb24uQm9vbGVhbignLS1lbmFibGUtYWxsLXRhcmdldHMnLCBmYWxzZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBlbmFibGUgYWxsIHRhcmdldHMnLFxuICB9KVxuXG4gIGVuYWJsZVR5cGVEZWYgPSBPcHRpb24uQm9vbGVhbignLS1lbmFibGUtdHlwZS1kZWYnLCB0cnVlLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnV2hldGhlciBlbmFibGUgdGhlIGB0eXBlLWRlZmAgZmVhdHVyZSBmb3IgdHlwZXNjcmlwdCBkZWZpbml0aW9ucyBhdXRvLWdlbmVyYXRpb24nLFxuICB9KVxuXG4gIGVuYWJsZUdpdGh1YkFjdGlvbnMgPSBPcHRpb24uQm9vbGVhbignLS1lbmFibGUtZ2l0aHViLWFjdGlvbnMnLCB0cnVlLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIGdlbmVyYXRlIHByZWNvbmZpZ3VyZWQgR2l0SHViIEFjdGlvbnMgd29ya2Zsb3cnLFxuICB9KVxuXG4gIHRlc3RGcmFtZXdvcmsgPSBPcHRpb24uU3RyaW5nKCctLXRlc3QtZnJhbWV3b3JrJywgJ2F2YScsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgSmF2YVNjcmlwdCB0ZXN0IGZyYW1ld29yayB0byB1c2UsIG9ubHkgc3VwcG9ydCBgYXZhYCBmb3Igbm93JyxcbiAgfSlcblxuICBkcnlSdW4gPSBPcHRpb24uQm9vbGVhbignLS1kcnktcnVuJywgZmFsc2UsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHRoZSBjb21tYW5kIGluIGRyeS1ydW4gbW9kZScsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogdGhpcy4kJHBhdGgsXG4gICAgICBuYW1lOiB0aGlzLiQkbmFtZSxcbiAgICAgIG1pbk5vZGVBcGlWZXJzaW9uOiB0aGlzLm1pbk5vZGVBcGlWZXJzaW9uLFxuICAgICAgcGFja2FnZU1hbmFnZXI6IHRoaXMucGFja2FnZU1hbmFnZXIsXG4gICAgICBsaWNlbnNlOiB0aGlzLmxpY2Vuc2UsXG4gICAgICB0YXJnZXRzOiB0aGlzLnRhcmdldHMsXG4gICAgICBlbmFibGVEZWZhdWx0VGFyZ2V0czogdGhpcy5lbmFibGVEZWZhdWx0VGFyZ2V0cyxcbiAgICAgIGVuYWJsZUFsbFRhcmdldHM6IHRoaXMuZW5hYmxlQWxsVGFyZ2V0cyxcbiAgICAgIGVuYWJsZVR5cGVEZWY6IHRoaXMuZW5hYmxlVHlwZURlZixcbiAgICAgIGVuYWJsZUdpdGh1YkFjdGlvbnM6IHRoaXMuZW5hYmxlR2l0aHViQWN0aW9ucyxcbiAgICAgIHRlc3RGcmFtZXdvcms6IHRoaXMudGVzdEZyYW1ld29yayxcbiAgICAgIGRyeVJ1bjogdGhpcy5kcnlSdW4sXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IHByb2plY3Qgd2l0aCBwcmUtY29uZmlndXJlZCBib2lsZXJwbGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ld09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHBhdGggd2hlcmUgdGhlIE5BUEktUlMgcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICBwYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCwgZGVmYXVsdCB0byB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGlmIG5vdCBwcm92aWRlZFxuICAgKi9cbiAgbmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gTm9kZS1BUEkgdmVyc2lvbiB0byBzdXBwb3J0XG4gICAqXG4gICAqIEBkZWZhdWx0IDRcbiAgICovXG4gIG1pbk5vZGVBcGlWZXJzaW9uPzogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZS4gT25seSBzdXBwb3J0IHlhcm4gNC54IGZvciBub3cuXG4gICAqXG4gICAqIEBkZWZhdWx0ICd5YXJuJ1xuICAgKi9cbiAgcGFja2FnZU1hbmFnZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIExpY2Vuc2UgZm9yIG9wZW4tc291cmNlZCBwcm9qZWN0XG4gICAqXG4gICAqIEBkZWZhdWx0ICdNSVQnXG4gICAqL1xuICBsaWNlbnNlPzogc3RyaW5nXG4gIC8qKlxuICAgKiBBbGwgdGFyZ2V0cyB0aGUgY3JhdGUgd2lsbCBiZSBjb21waWxlZCBmb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICB0YXJnZXRzPzogc3RyaW5nW11cbiAgLyoqXG4gICAqIFdoZXRoZXIgZW5hYmxlIGRlZmF1bHQgdGFyZ2V0c1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVEZWZhdWx0VGFyZ2V0cz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZW5hYmxlIGFsbCB0YXJnZXRzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBlbmFibGVBbGxUYXJnZXRzPzogYm9vbGVhblxuICAvKipcbiAgICogV2hldGhlciBlbmFibGUgdGhlIGB0eXBlLWRlZmAgZmVhdHVyZSBmb3IgdHlwZXNjcmlwdCBkZWZpbml0aW9ucyBhdXRvLWdlbmVyYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlVHlwZURlZj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZ2VuZXJhdGUgcHJlY29uZmlndXJlZCBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVHaXRodWJBY3Rpb25zPzogYm9vbGVhblxuICAvKipcbiAgICogVGhlIEphdmFTY3JpcHQgdGVzdCBmcmFtZXdvcmsgdG8gdXNlLCBvbmx5IHN1cHBvcnQgYGF2YWAgZm9yIG5vd1xuICAgKlxuICAgKiBAZGVmYXVsdCAnYXZhJ1xuICAgKi9cbiAgdGVzdEZyYW1ld29yaz86IHN0cmluZ1xuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIGNvbW1hbmQgaW4gZHJ5LXJ1biBtb2RlXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkcnlSdW4/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHROZXdPcHRpb25zKG9wdGlvbnM6IE5ld09wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBtaW5Ob2RlQXBpVmVyc2lvbjogNCxcbiAgICBwYWNrYWdlTWFuYWdlcjogJ3lhcm4nLFxuICAgIGxpY2Vuc2U6ICdNSVQnLFxuICAgIHRhcmdldHM6IFtdLFxuICAgIGVuYWJsZURlZmF1bHRUYXJnZXRzOiB0cnVlLFxuICAgIGVuYWJsZUFsbFRhcmdldHM6IGZhbHNlLFxuICAgIGVuYWJsZVR5cGVEZWY6IHRydWUsXG4gICAgZW5hYmxlR2l0aHViQWN0aW9uczogdHJ1ZSxcbiAgICB0ZXN0RnJhbWV3b3JrOiAnYXZhJyxcbiAgICBkcnlSdW46IGZhbHNlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cbn1cbiIsImZ1bmN0aW9uIF9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uKGUsIHQpIHtcbiAgaWYgKHQuaGFzKGUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGluaXRpYWxpemUgdGhlIHNhbWUgcHJpdmF0ZSBlbGVtZW50cyB0d2ljZSBvbiBhbiBvYmplY3RcIik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGNoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24gPSByZXF1aXJlKFwiLi9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uLmpzXCIpO1xuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKGUsIGEpIHtcbiAgY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbihlLCBhKSwgYS5hZGQoZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBjaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uID0gcmVxdWlyZShcIi4vY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbi5qc1wiKTtcbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKGUsIHQsIGEpIHtcbiAgY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbihlLCB0KSwgdC5zZXQoZSwgYSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2Fzc2VydENsYXNzQnJhbmQoZSwgdCwgbikge1xuICBpZiAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBlID8gZSA9PT0gdCA6IGUuaGFzKHQpKSByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0IDogbjtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCBvbiB0aGlzIG9iamVjdFwiKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2Fzc2VydENsYXNzQnJhbmQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgYXNzZXJ0Q2xhc3NCcmFuZCA9IHJlcXVpcmUoXCIuL2Fzc2VydENsYXNzQnJhbmQuanNcIik7XG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRHZXQyKHMsIGEpIHtcbiAgcmV0dXJuIHMuZ2V0KGFzc2VydENsYXNzQnJhbmQocywgYSkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQyLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiLy8gQ29weXJpZ2h0IDIwMTgtMjAyNSB0aGUgRGVubyBhdXRob3JzLiBNSVQgbGljZW5zZS5cbi8vIFRoaXMgbW9kdWxlIGlzIGJyb3dzZXIgY29tcGF0aWJsZS5cbi8vIEJhcmUga2V5cyBtYXkgb25seSBjb250YWluIEFTQ0lJIGxldHRlcnMsXG4vLyBBU0NJSSBkaWdpdHMsIHVuZGVyc2NvcmVzLCBhbmQgZGFzaGVzIChBLVphLXowLTlfLSkuXG5mdW5jdGlvbiBqb2luS2V5cyhrZXlzKSB7XG4gIC8vIERvdHRlZCBrZXlzIGFyZSBhIHNlcXVlbmNlIG9mIGJhcmUgb3IgcXVvdGVkIGtleXMgam9pbmVkIHdpdGggYSBkb3QuXG4gIC8vIFRoaXMgYWxsb3dzIGZvciBncm91cGluZyBzaW1pbGFyIHByb3BlcnRpZXMgdG9nZXRoZXI6XG4gIHJldHVybiBrZXlzLm1hcCgoc3RyKT0+e1xuICAgIHJldHVybiBzdHIubGVuZ3RoID09PSAwIHx8IHN0ci5tYXRjaCgvW15BLVphLXowLTlfLV0vKSA/IEpTT04uc3RyaW5naWZ5KHN0cikgOiBzdHI7XG4gIH0pLmpvaW4oXCIuXCIpO1xufVxuY2xhc3MgRHVtcGVyIHtcbiAgbWF4UGFkID0gMDtcbiAgc3JjT2JqZWN0O1xuICBvdXRwdXQgPSBbXTtcbiAgI2FycmF5VHlwZUNhY2hlID0gbmV3IE1hcCgpO1xuICBjb25zdHJ1Y3RvcihzcmNPYmpjKXtcbiAgICB0aGlzLnNyY09iamVjdCA9IHNyY09iamM7XG4gIH1cbiAgZHVtcChmbXRPcHRpb25zID0ge30pIHtcbiAgICAvLyBkZW5vLWxpbnQtaWdub3JlIG5vLWV4cGxpY2l0LWFueVxuICAgIHRoaXMub3V0cHV0ID0gdGhpcy4jcHJpbnRPYmplY3QodGhpcy5zcmNPYmplY3QpO1xuICAgIHRoaXMub3V0cHV0ID0gdGhpcy4jZm9ybWF0KGZtdE9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLm91dHB1dDtcbiAgfVxuICAjcHJpbnRPYmplY3Qob2JqLCBrZXlzID0gW10pIHtcbiAgICBjb25zdCBvdXQgPSBbXTtcbiAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgY29uc3QgaW5saW5lUHJvcHMgPSBbXTtcbiAgICBjb25zdCBtdWx0aWxpbmVQcm9wcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcyl7XG4gICAgICBpZiAodGhpcy4jaXNTaW1wbHlTZXJpYWxpemFibGUob2JqW3Byb3BdKSkge1xuICAgICAgICBpbmxpbmVQcm9wcy5wdXNoKHByb3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXVsdGlsaW5lUHJvcHMucHVzaChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc29ydGVkUHJvcHMgPSBpbmxpbmVQcm9wcy5jb25jYXQobXVsdGlsaW5lUHJvcHMpO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBzb3J0ZWRQcm9wcyl7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9ialtwcm9wXTtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgb3V0LnB1c2godGhpcy4jZGF0ZURlY2xhcmF0aW9uKFtcbiAgICAgICAgICBwcm9wXG4gICAgICAgIF0sIHZhbHVlKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICBvdXQucHVzaCh0aGlzLiNzdHJEZWNsYXJhdGlvbihbXG4gICAgICAgICAgcHJvcFxuICAgICAgICBdLCB2YWx1ZS50b1N0cmluZygpKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBvdXQucHVzaCh0aGlzLiNudW1iZXJEZWNsYXJhdGlvbihbXG4gICAgICAgICAgcHJvcFxuICAgICAgICBdLCB2YWx1ZSkpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIG91dC5wdXNoKHRoaXMuI2Jvb2xEZWNsYXJhdGlvbihbXG4gICAgICAgICAgcHJvcFxuICAgICAgICBdLCB2YWx1ZSkpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGNvbnN0IGFycmF5VHlwZSA9IHRoaXMuI2dldFR5cGVPZkFycmF5KHZhbHVlKTtcbiAgICAgICAgaWYgKGFycmF5VHlwZSA9PT0gXCJPTkxZX1BSSU1JVElWRVwiKSB7XG4gICAgICAgICAgb3V0LnB1c2godGhpcy4jYXJyYXlEZWNsYXJhdGlvbihbXG4gICAgICAgICAgICBwcm9wXG4gICAgICAgICAgXSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheVR5cGUgPT09IFwiT05MWV9PQkpFQ1RfRVhDTFVESU5HX0FSUkFZXCIpIHtcbiAgICAgICAgICAvLyBhcnJheSBvZiBvYmplY3RzXG4gICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIG91dC5wdXNoKFwiXCIpO1xuICAgICAgICAgICAgb3V0LnB1c2godGhpcy4jaGVhZGVyR3JvdXAoW1xuICAgICAgICAgICAgICAuLi5rZXlzLFxuICAgICAgICAgICAgICBwcm9wXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICBvdXQucHVzaCguLi50aGlzLiNwcmludE9iamVjdCh2YWx1ZVtpXSwgW1xuICAgICAgICAgICAgICAuLi5rZXlzLFxuICAgICAgICAgICAgICBwcm9wXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMgaXMgYSBjb21wbGV4IGFycmF5LCB1c2UgdGhlIGlubGluZSBmb3JtYXQuXG4gICAgICAgICAgY29uc3Qgc3RyID0gdmFsdWUubWFwKCh4KT0+dGhpcy4jcHJpbnRBc0lubGluZVZhbHVlKHgpKS5qb2luKFwiLFwiKTtcbiAgICAgICAgICBvdXQucHVzaChgJHt0aGlzLiNkZWNsYXJhdGlvbihbXG4gICAgICAgICAgICBwcm9wXG4gICAgICAgICAgXSl9WyR7c3RyfV1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3V0LnB1c2goXCJcIik7XG4gICAgICAgIG91dC5wdXNoKHRoaXMuI2hlYWRlcihbXG4gICAgICAgICAgLi4ua2V5cyxcbiAgICAgICAgICBwcm9wXG4gICAgICAgIF0pKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgdG9QYXJzZSA9IHZhbHVlO1xuICAgICAgICAgIG91dC5wdXNoKC4uLnRoaXMuI3ByaW50T2JqZWN0KHRvUGFyc2UsIFtcbiAgICAgICAgICAgIC4uLmtleXMsXG4gICAgICAgICAgICBwcm9wXG4gICAgICAgICAgXSkpO1xuICAgICAgICB9XG4gICAgICAvLyBvdXQucHVzaCguLi50aGlzLl9wYXJzZSh2YWx1ZSwgYCR7cGF0aH0ke3Byb3B9LmApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgb3V0LnB1c2goXCJcIik7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICAjaXNQcmltaXRpdmUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8IFtcbiAgICAgIFwic3RyaW5nXCIsXG4gICAgICBcIm51bWJlclwiLFxuICAgICAgXCJib29sZWFuXCJcbiAgICBdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSk7XG4gIH1cbiAgI2dldFR5cGVPZkFycmF5KGFycikge1xuICAgIGlmICh0aGlzLiNhcnJheVR5cGVDYWNoZS5oYXMoYXJyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2FycmF5VHlwZUNhY2hlLmdldChhcnIpO1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gdGhpcy4jZG9HZXRUeXBlT2ZBcnJheShhcnIpO1xuICAgIHRoaXMuI2FycmF5VHlwZUNhY2hlLnNldChhcnIsIHR5cGUpO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG4gICNkb0dldFR5cGVPZkFycmF5KGFycikge1xuICAgIGlmICghYXJyLmxlbmd0aCkge1xuICAgICAgLy8gYW55IHR5cGUgc2hvdWxkIGJlIGZpbmVcbiAgICAgIHJldHVybiBcIk9OTFlfUFJJTUlUSVZFXCI7XG4gICAgfVxuICAgIGNvbnN0IG9ubHlQcmltaXRpdmUgPSB0aGlzLiNpc1ByaW1pdGl2ZShhcnJbMF0pO1xuICAgIGlmIChhcnJbMF0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgcmV0dXJuIFwiTUlYRURcIjtcbiAgICB9XG4gICAgZm9yKGxldCBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKyl7XG4gICAgICBpZiAob25seVByaW1pdGl2ZSAhPT0gdGhpcy4jaXNQcmltaXRpdmUoYXJyW2ldKSB8fCBhcnJbaV0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICByZXR1cm4gXCJNSVhFRFwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb25seVByaW1pdGl2ZSA/IFwiT05MWV9QUklNSVRJVkVcIiA6IFwiT05MWV9PQkpFQ1RfRVhDTFVESU5HX0FSUkFZXCI7XG4gIH1cbiAgI3ByaW50QXNJbmxpbmVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBgXCIke3RoaXMuI3ByaW50RGF0ZSh2YWx1ZSl9XCJgO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgY29uc3Qgc3RyID0gdmFsdWUubWFwKCh4KT0+dGhpcy4jcHJpbnRBc0lubGluZVZhbHVlKHgpKS5qb2luKFwiLFwiKTtcbiAgICAgIHJldHVybiBgWyR7c3RyfV1gO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNob3VsZCBuZXZlciByZWFjaFwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0ciA9IE9iamVjdC5rZXlzKHZhbHVlKS5tYXAoKGtleSk9PntcbiAgICAgICAgcmV0dXJuIGAke2pvaW5LZXlzKFtcbiAgICAgICAgICBrZXlcbiAgICAgICAgXSl9ID0gJHsvLyBkZW5vLWxpbnQtaWdub3JlIG5vLWV4cGxpY2l0LWFueVxuICAgICAgICB0aGlzLiNwcmludEFzSW5saW5lVmFsdWUodmFsdWVba2V5XSl9YDtcbiAgICAgIH0pLmpvaW4oXCIsXCIpO1xuICAgICAgcmV0dXJuIGB7JHtzdHJ9fWA7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlNob3VsZCBuZXZlciByZWFjaFwiKTtcbiAgfVxuICAjaXNTaW1wbHlTZXJpYWxpemFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIHRoaXMuI2dldFR5cGVPZkFycmF5KHZhbHVlKSAhPT0gXCJPTkxZX09CSkVDVF9FWENMVURJTkdfQVJSQVlcIjtcbiAgfVxuICAjaGVhZGVyKGtleXMpIHtcbiAgICByZXR1cm4gYFske2pvaW5LZXlzKGtleXMpfV1gO1xuICB9XG4gICNoZWFkZXJHcm91cChrZXlzKSB7XG4gICAgcmV0dXJuIGBbWyR7am9pbktleXMoa2V5cyl9XV1gO1xuICB9XG4gICNkZWNsYXJhdGlvbihrZXlzKSB7XG4gICAgY29uc3QgdGl0bGUgPSBqb2luS2V5cyhrZXlzKTtcbiAgICBpZiAodGl0bGUubGVuZ3RoID4gdGhpcy5tYXhQYWQpIHtcbiAgICAgIHRoaXMubWF4UGFkID0gdGl0bGUubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGl0bGV9ID0gYDtcbiAgfVxuICAjYXJyYXlEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gO1xuICB9XG4gICNzdHJEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gO1xuICB9XG4gICNudW1iZXJEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy4jZGVjbGFyYXRpb24oa2V5cyl9bmFuYDtcbiAgICB9XG4gICAgc3dpdGNoKHZhbHVlKXtcbiAgICAgIGNhc2UgSW5maW5pdHk6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX1pbmZgO1xuICAgICAgY2FzZSAtSW5maW5pdHk6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0taW5mYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke3ZhbHVlfWA7XG4gICAgfVxuICB9XG4gICNib29sRGVjbGFyYXRpb24oa2V5cywgdmFsdWUpIHtcbiAgICByZXR1cm4gYCR7dGhpcy4jZGVjbGFyYXRpb24oa2V5cyl9JHt2YWx1ZX1gO1xuICB9XG4gICNwcmludERhdGUodmFsdWUpIHtcbiAgICBmdW5jdGlvbiBkdFBhZCh2LCBsUGFkID0gMikge1xuICAgICAgcmV0dXJuIHYucGFkU3RhcnQobFBhZCwgXCIwXCIpO1xuICAgIH1cbiAgICBjb25zdCBtID0gZHRQYWQoKHZhbHVlLmdldFVUQ01vbnRoKCkgKyAxKS50b1N0cmluZygpKTtcbiAgICBjb25zdCBkID0gZHRQYWQodmFsdWUuZ2V0VVRDRGF0ZSgpLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IGggPSBkdFBhZCh2YWx1ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IG1pbiA9IGR0UGFkKHZhbHVlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpKTtcbiAgICBjb25zdCBzID0gZHRQYWQodmFsdWUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IG1zID0gZHRQYWQodmFsdWUuZ2V0VVRDTWlsbGlzZWNvbmRzKCkudG9TdHJpbmcoKSwgMyk7XG4gICAgLy8gZm9ybWF0dGVkIGRhdGVcbiAgICBjb25zdCBmRGF0YSA9IGAke3ZhbHVlLmdldFVUQ0Z1bGxZZWFyKCl9LSR7bX0tJHtkfVQke2h9OiR7bWlufToke3N9LiR7bXN9YDtcbiAgICByZXR1cm4gZkRhdGE7XG4gIH1cbiAgI2RhdGVEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke3RoaXMuI3ByaW50RGF0ZSh2YWx1ZSl9YDtcbiAgfVxuICAjZm9ybWF0KG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsga2V5QWxpZ25tZW50ID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgckRlY2xhcmF0aW9uID0gL14oXFxcIi4qXFxcInxbXj1dKilcXHM9LztcbiAgICBjb25zdCBvdXQgPSBbXTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5vdXRwdXQubGVuZ3RoOyBpKyspe1xuICAgICAgY29uc3QgbCA9IHRoaXMub3V0cHV0W2ldO1xuICAgICAgLy8gd2Uga2VlcCBlbXB0eSBlbnRyeSBmb3IgYXJyYXkgb2Ygb2JqZWN0c1xuICAgICAgaWYgKGxbMF0gPT09IFwiW1wiICYmIGxbMV0gIT09IFwiW1wiKSB7XG4gICAgICAgIC8vIG5vbi1lbXB0eSBvYmplY3Qgd2l0aCBvbmx5IHN1Ym9iamVjdHMgYXMgcHJvcGVydGllc1xuICAgICAgICBpZiAodGhpcy5vdXRwdXRbaSArIDFdID09PSBcIlwiICYmIHRoaXMub3V0cHV0W2kgKyAyXT8uc2xpY2UoMCwgbC5sZW5ndGgpID09PSBsLnNsaWNlKDAsIC0xKSArIFwiLlwiKSB7XG4gICAgICAgICAgaSArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG91dC5wdXNoKGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGtleUFsaWdubWVudCkge1xuICAgICAgICAgIGNvbnN0IG0gPSByRGVjbGFyYXRpb24uZXhlYyhsKTtcbiAgICAgICAgICBpZiAobSAmJiBtWzFdKSB7XG4gICAgICAgICAgICBvdXQucHVzaChsLnJlcGxhY2UobVsxXSwgbVsxXS5wYWRFbmQodGhpcy5tYXhQYWQpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dC5wdXNoKGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQucHVzaChsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhbmluZyBtdWx0aXBsZSBzcGFjZXNcbiAgICBjb25zdCBjbGVhbmVkT3V0cHV0ID0gW107XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkrKyl7XG4gICAgICBjb25zdCBsID0gb3V0W2ldO1xuICAgICAgaWYgKCEobCA9PT0gXCJcIiAmJiBvdXRbaSArIDFdID09PSBcIlwiKSkge1xuICAgICAgICBjbGVhbmVkT3V0cHV0LnB1c2gobCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGVhbmVkT3V0cHV0O1xuICB9XG59XG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCB0byBhIHtAbGluayBodHRwczovL3RvbWwuaW8gfCBUT01MfSBzdHJpbmcuXG4gKlxuICogQGV4YW1wbGUgVXNhZ2VcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tIFwiQHN0ZC90b21sL3N0cmluZ2lmeVwiO1xuICogaW1wb3J0IHsgYXNzZXJ0RXF1YWxzIH0gZnJvbSBcIkBzdGQvYXNzZXJ0XCI7XG4gKlxuICogY29uc3Qgb2JqID0ge1xuICogICB0aXRsZTogXCJUT01MIEV4YW1wbGVcIixcbiAqICAgb3duZXI6IHtcbiAqICAgICBuYW1lOiBcIkJvYlwiLFxuICogICAgIGJpbzogXCJCb2IgaXMgYSBjb29sIGd1eVwiLFxuICogIH1cbiAqIH07XG4gKiBjb25zdCB0b21sU3RyaW5nID0gc3RyaW5naWZ5KG9iaik7XG4gKiBhc3NlcnRFcXVhbHModG9tbFN0cmluZywgYHRpdGxlID0gXCJUT01MIEV4YW1wbGVcIlxcblxcbltvd25lcl1cXG5uYW1lID0gXCJCb2JcIlxcbmJpbyA9IFwiQm9iIGlzIGEgY29vbCBndXlcIlxcbmApO1xuICogYGBgXG4gKiBAcGFyYW0gb2JqIFNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHN0cmluZ2lmeWluZy5cbiAqIEByZXR1cm5zIFRPTUwgc3RyaW5nXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeShvYmosIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBEdW1wZXIob2JqKS5kdW1wKG9wdGlvbnMpLmpvaW4oXCJcXG5cIik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwIiwiLy8gQ29weXJpZ2h0IDIwMTgtMjAyNSB0aGUgRGVubyBhdXRob3JzLiBNSVQgbGljZW5zZS5cbi8vIFRoaXMgbW9kdWxlIGlzIGJyb3dzZXIgY29tcGF0aWJsZS5cbi8qKlxuICogRmlsdGVycyB0aGUgZ2l2ZW4gYXJyYXksIHJlbW92aW5nIGFsbCBlbGVtZW50cyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgZ2l2ZW4gcHJlZGljYXRlXG4gKiAqKmluIHBsYWNlLiBUaGlzIG1lYW5zIGBhcnJheWAgd2lsbCBiZSBtb2RpZmllZCEqKi5cbiAqLyBleHBvcnQgZnVuY3Rpb24gZmlsdGVySW5QbGFjZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIGxldCBvdXRwdXRJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgY3VyIG9mIGFycmF5KXtcbiAgICBpZiAoIXByZWRpY2F0ZShjdXIpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgYXJyYXlbb3V0cHV0SW5kZXhdID0gY3VyO1xuICAgIG91dHB1dEluZGV4ICs9IDE7XG4gIH1cbiAgYXJyYXkuc3BsaWNlKG91dHB1dEluZGV4KTtcbiAgcmV0dXJuIGFycmF5O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3V0aWxzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAyMDE4LTIwMjUgdGhlIERlbm8gYXV0aG9ycy4gTUlUIGxpY2Vuc2UuXG4vLyBUaGlzIG1vZHVsZSBpcyBicm93c2VyIGNvbXBhdGlibGUuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSBcIi4vX3V0aWxzLmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1lcmdlKHJlY29yZCwgb3RoZXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRlZXBNZXJnZUludGVybmFsKHJlY29yZCwgb3RoZXIsIG5ldyBTZXQoKSwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2VJbnRlcm5hbChyZWNvcmQsIG90aGVyLCBzZWVuLCBvcHRpb25zKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBjb25zdCBrZXlzID0gbmV3IFNldChbXG4gICAgLi4uZ2V0S2V5cyhyZWNvcmQpLFxuICAgIC4uLmdldEtleXMob3RoZXIpXG4gIF0pO1xuICAvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBrZXkgb2Ygb3RoZXIgb2JqZWN0IGFuZCB1c2UgY29ycmVjdCBtZXJnaW5nIHN0cmF0ZWd5XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpe1xuICAgIC8vIFNraXAgdG8gcHJldmVudCBPYmplY3QucHJvdG90eXBlLl9fcHJvdG9fXyBhY2Nlc3NvciBwcm9wZXJ0eSBjYWxscyBvbiBub24tRGVubyBwbGF0Zm9ybXNcbiAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYSA9IHJlY29yZFtrZXldO1xuICAgIGlmICghT2JqZWN0Lmhhc093bihvdGhlciwga2V5KSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBhO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGIgPSBvdGhlcltrZXldO1xuICAgIGlmIChpc05vbk51bGxPYmplY3QoYSkgJiYgaXNOb25OdWxsT2JqZWN0KGIpICYmICFzZWVuLmhhcyhhKSAmJiAhc2Vlbi5oYXMoYikpIHtcbiAgICAgIHNlZW4uYWRkKGEpO1xuICAgICAgc2Vlbi5hZGQoYik7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlT2JqZWN0cyhhLCBiLCBzZWVuLCBvcHRpb25zKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBPdmVycmlkZSB2YWx1ZVxuICAgIHJlc3VsdFtrZXldID0gYjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbWVyZ2VPYmplY3RzKGxlZnQsIHJpZ2h0LCBzZWVuLCBvcHRpb25zID0ge1xuICBhcnJheXM6IFwibWVyZ2VcIixcbiAgc2V0czogXCJtZXJnZVwiLFxuICBtYXBzOiBcIm1lcmdlXCJcbn0pIHtcbiAgLy8gUmVjdXJzaXZlbHkgbWVyZ2UgbWVyZ2VhYmxlIG9iamVjdHNcbiAgaWYgKGlzTWVyZ2VhYmxlKGxlZnQpICYmIGlzTWVyZ2VhYmxlKHJpZ2h0KSkge1xuICAgIHJldHVybiBkZWVwTWVyZ2VJbnRlcm5hbChsZWZ0LCByaWdodCwgc2Vlbiwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGlzSXRlcmFibGUobGVmdCkgJiYgaXNJdGVyYWJsZShyaWdodCkpIHtcbiAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGVmdCkgJiYgQXJyYXkuaXNBcnJheShyaWdodCkpIHtcbiAgICAgIGlmIChvcHRpb25zLmFycmF5cyA9PT0gXCJtZXJnZVwiKSB7XG4gICAgICAgIHJldHVybiBsZWZ0LmNvbmNhdChyaWdodCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmlnaHQ7XG4gICAgfVxuICAgIC8vIEhhbmRsZSBtYXBzXG4gICAgaWYgKGxlZnQgaW5zdGFuY2VvZiBNYXAgJiYgcmlnaHQgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgIGlmIChvcHRpb25zLm1hcHMgPT09IFwibWVyZ2VcIikge1xuICAgICAgICByZXR1cm4gbmV3IE1hcChbXG4gICAgICAgICAgLi4ubGVmdCxcbiAgICAgICAgICAuLi5yaWdodFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByaWdodDtcbiAgICB9XG4gICAgLy8gSGFuZGxlIHNldHNcbiAgICBpZiAobGVmdCBpbnN0YW5jZW9mIFNldCAmJiByaWdodCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgaWYgKG9wdGlvbnMuc2V0cyA9PT0gXCJtZXJnZVwiKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAuLi5sZWZ0LFxuICAgICAgICAgIC4uLnJpZ2h0XG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJpZ2h0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmlnaHQ7XG59XG4vKipcbiAqIFRlc3Qgd2hldGhlciBhIHZhbHVlIGlzIG1lcmdlYWJsZSBvciBub3RcbiAqIEJ1aWx0aW5zIHRoYXQgbG9vayBsaWtlIG9iamVjdHMsIG51bGwgYW5kIHVzZXIgZGVmaW5lZCBjbGFzc2VzXG4gKiBhcmUgbm90IGNvbnNpZGVyZWQgbWVyZ2VhYmxlIChpdCBtZWFucyB0aGF0IHJlZmVyZW5jZSB3aWxsIGJlIGNvcGllZClcbiAqLyBmdW5jdGlvbiBpc01lcmdlYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cbmZ1bmN0aW9uIGlzSXRlcmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBpc05vbk51bGxPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIjtcbn1cbmZ1bmN0aW9uIGdldEtleXMocmVjb3JkKSB7XG4gIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocmVjb3JkKTtcbiAgZmlsdGVySW5QbGFjZShyZXN1bHQsIChrZXkpPT5PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocmVjb3JkLCBrZXkpKTtcbiAgcmVzdWx0LnB1c2goLi4uT2JqZWN0LmtleXMocmVjb3JkKSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWVwX21lcmdlLmpzLm1hcCIsInZhciBhc3NlcnRDbGFzc0JyYW5kID0gcmVxdWlyZShcIi4vYXNzZXJ0Q2xhc3NCcmFuZC5qc1wiKTtcbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZFNldDIocywgYSwgcikge1xuICByZXR1cm4gcy5zZXQoYXNzZXJ0Q2xhc3NCcmFuZChzLCBhKSwgciksIHI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jbGFzc1ByaXZhdGVGaWVsZFNldDIsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCIvLyBDb3B5cmlnaHQgMjAxOC0yMDI1IHRoZSBEZW5vIGF1dGhvcnMuIE1JVCBsaWNlbnNlLlxuLy8gVGhpcyBtb2R1bGUgaXMgYnJvd3NlciBjb21wYXRpYmxlLlxuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSBcIkBqc3Ivc3RkX19jb2xsZWN0aW9ucy9kZWVwLW1lcmdlXCI7XG4vKipcbiAqIENvcHkgb2YgYGltcG9ydCB7IGlzTGVhcCB9IGZyb20gXCJAc3RkL2RhdGV0aW1lXCI7YCBiZWNhdXNlIGl0IGNhbm5vdCBiZSBpbXBvdGVkIGFzIGxvbmcgYXMgaXQgaXMgdW5zdGFibGUuXG4gKi8gZnVuY3Rpb24gaXNMZWFwKHllYXJOdW1iZXIpIHtcbiAgcmV0dXJuIHllYXJOdW1iZXIgJSA0ID09PSAwICYmIHllYXJOdW1iZXIgJSAxMDAgIT09IDAgfHwgeWVhck51bWJlciAlIDQwMCA9PT0gMDtcbn1cbmV4cG9ydCBjbGFzcyBTY2FubmVyIHtcbiAgI3doaXRlc3BhY2UgPSAvWyBcXHRdLztcbiAgI3Bvc2l0aW9uID0gMDtcbiAgI3NvdXJjZTtcbiAgY29uc3RydWN0b3Ioc291cmNlKXtcbiAgICB0aGlzLiNzb3VyY2UgPSBzb3VyY2U7XG4gIH1cbiAgZ2V0IHBvc2l0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbjtcbiAgfVxuICBnZXQgc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLiNzb3VyY2U7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGNoYXJhY3RlclxuICAgKiBAcGFyYW0gaW5kZXggLSByZWxhdGl2ZSBpbmRleCBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICovIGNoYXIoaW5kZXggPSAwKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NvdXJjZVt0aGlzLiNwb3NpdGlvbiArIGluZGV4XSA/PyBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgc2xpY2VkIHN0cmluZ1xuICAgKiBAcGFyYW0gc3RhcnQgLSBzdGFydCBwb3NpdGlvbiByZWxhdGl2ZSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICogQHBhcmFtIGVuZCAtIGVuZCBwb3NpdGlvbiByZWxhdGl2ZSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICovIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gdGhpcy4jc291cmNlLnNsaWNlKHRoaXMuI3Bvc2l0aW9uICsgc3RhcnQsIHRoaXMuI3Bvc2l0aW9uICsgZW5kKTtcbiAgfVxuICAvKipcbiAgICogTW92ZSBwb3NpdGlvbiB0byBuZXh0XG4gICAqLyBuZXh0KGNvdW50ID0gMSkge1xuICAgIHRoaXMuI3Bvc2l0aW9uICs9IGNvdW50O1xuICB9XG4gIHNraXBXaGl0ZXNwYWNlcygpIHtcbiAgICB3aGlsZSh0aGlzLiN3aGl0ZXNwYWNlLnRlc3QodGhpcy5jaGFyKCkpICYmICF0aGlzLmVvZigpKXtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICAvLyBJbnZhbGlkIGlmIGN1cnJlbnQgY2hhciBpcyBvdGhlciBraW5kcyBvZiB3aGl0ZXNwYWNlXG4gICAgaWYgKCF0aGlzLmlzQ3VycmVudENoYXJFT0woKSAmJiAvXFxzLy50ZXN0KHRoaXMuY2hhcigpKSkge1xuICAgICAgY29uc3QgZXNjYXBlZCA9IFwiXFxcXHVcIiArIHRoaXMuY2hhcigpLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLiNwb3NpdGlvbjtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSBUT01MOiBJdCBjb250YWlucyBpbnZhbGlkIHdoaXRlc3BhY2UgYXQgcG9zaXRpb24gJyR7cG9zaXRpb259JzogXFxgJHtlc2NhcGVkfVxcYGApO1xuICAgIH1cbiAgfVxuICBuZXh0VW50aWxDaGFyKG9wdGlvbnMgPSB7XG4gICAgc2tpcENvbW1lbnRzOiB0cnVlXG4gIH0pIHtcbiAgICB3aGlsZSghdGhpcy5lb2YoKSl7XG4gICAgICBjb25zdCBjaGFyID0gdGhpcy5jaGFyKCk7XG4gICAgICBpZiAodGhpcy4jd2hpdGVzcGFjZS50ZXN0KGNoYXIpIHx8IHRoaXMuaXNDdXJyZW50Q2hhckVPTCgpKSB7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnNraXBDb21tZW50cyAmJiB0aGlzLmNoYXIoKSA9PT0gXCIjXCIpIHtcbiAgICAgICAgLy8gZW50ZXJpbmcgY29tbWVudFxuICAgICAgICB3aGlsZSghdGhpcy5pc0N1cnJlbnRDaGFyRU9MKCkgJiYgIXRoaXMuZW9mKCkpe1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFBvc2l0aW9uIHJlYWNoZWQgRU9GIG9yIG5vdFxuICAgKi8gZW9mKCkge1xuICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbiA+PSB0aGlzLiNzb3VyY2UubGVuZ3RoO1xuICB9XG4gIGlzQ3VycmVudENoYXJFT0woKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcigpID09PSBcIlxcblwiIHx8IHRoaXMuc3RhcnRzV2l0aChcIlxcclxcblwiKTtcbiAgfVxuICBzdGFydHNXaXRoKHNlYXJjaFN0cmluZykge1xuICAgIHJldHVybiB0aGlzLiNzb3VyY2Uuc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcsIHRoaXMuI3Bvc2l0aW9uKTtcbiAgfVxuICBtYXRjaChyZWdFeHApIHtcbiAgICBpZiAoIXJlZ0V4cC5zdGlja3kpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnRXhwICR7cmVnRXhwfSBkb2VzIG5vdCBoYXZlIGEgc3RpY2t5ICd5JyBmbGFnYCk7XG4gICAgfVxuICAgIHJlZ0V4cC5sYXN0SW5kZXggPSB0aGlzLiNwb3NpdGlvbjtcbiAgICByZXR1cm4gdGhpcy4jc291cmNlLm1hdGNoKHJlZ0V4cCk7XG4gIH1cbn1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVdGlsaXRpZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdWNjZXNzKGJvZHkpIHtcbiAgcmV0dXJuIHtcbiAgICBvazogdHJ1ZSxcbiAgICBib2R5XG4gIH07XG59XG5mdW5jdGlvbiBmYWlsdXJlKCkge1xuICByZXR1cm4ge1xuICAgIG9rOiBmYWxzZVxuICB9O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmVzdGVkIG9iamVjdCBmcm9tIHRoZSBrZXlzIGFuZCB2YWx1ZXMuXG4gKlxuICogZS5nLiBgdW5mbGF0KFtcImFcIiwgXCJiXCIsIFwiY1wiXSwgMSlgIHJldHVybnMgYHsgYTogeyBiOiB7IGM6IDEgfSB9IH1gXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHVuZmxhdChrZXlzLCB2YWx1ZXMgPSB7fSkge1xuICByZXR1cm4ga2V5cy5yZWR1Y2VSaWdodCgoYWNjLCBrZXkpPT4oe1xuICAgICAgW2tleV06IGFjY1xuICAgIH0pLCB2YWx1ZXMpO1xufVxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldFRhcmdldFZhbHVlKHRhcmdldCwga2V5cykge1xuICBjb25zdCBrZXkgPSBrZXlzWzBdO1xuICBpZiAoIWtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBwYXJzZSB0aGUgVE9NTDoga2V5IGxlbmd0aCBpcyBub3QgYSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gIH1cbiAgcmV0dXJuIHRhcmdldFtrZXldO1xufVxuZnVuY3Rpb24gZGVlcEFzc2lnblRhYmxlKHRhcmdldCwgdGFibGUpIHtcbiAgY29uc3QgeyBrZXlzLCB0eXBlLCB2YWx1ZSB9ID0gdGFibGU7XG4gIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGdldFRhcmdldFZhbHVlKHRhcmdldCwga2V5cyk7XG4gIGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRhcmdldCwgdW5mbGF0KGtleXMsIHZhbHVlKSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudFZhbHVlKSkge1xuICAgIGNvbnN0IGxhc3QgPSBjdXJyZW50VmFsdWUuYXQoLTEpO1xuICAgIGRlZXBBc3NpZ24obGFzdCwge1xuICAgICAgdHlwZSxcbiAgICAgIGtleXM6IGtleXMuc2xpY2UoMSksXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICBkZWVwQXNzaWduKGN1cnJlbnRWYWx1ZSwge1xuICAgICAgdHlwZSxcbiAgICAgIGtleXM6IGtleXMuc2xpY2UoMSksXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBhc3NpZ25cIik7XG59XG5mdW5jdGlvbiBkZWVwQXNzaWduVGFibGVBcnJheSh0YXJnZXQsIHRhYmxlKSB7XG4gIGNvbnN0IHsgdHlwZSwga2V5cywgdmFsdWUgfSA9IHRhYmxlO1xuICBjb25zdCBjdXJyZW50VmFsdWUgPSBnZXRUYXJnZXRWYWx1ZSh0YXJnZXQsIGtleXMpO1xuICBpZiAoY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YXJnZXQsIHVuZmxhdChrZXlzLCBbXG4gICAgICB2YWx1ZVxuICAgIF0pKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpKSB7XG4gICAgY3VycmVudFZhbHVlLnB1c2godmFsdWUpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICBkZWVwQXNzaWduKGN1cnJlbnRWYWx1ZSwge1xuICAgICAgdHlwZSxcbiAgICAgIGtleXM6IGtleXMuc2xpY2UoMSksXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBhc3NpZ25cIik7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVlcEFzc2lnbih0YXJnZXQsIGJvZHkpIHtcbiAgc3dpdGNoKGJvZHkudHlwZSl7XG4gICAgY2FzZSBcIkJsb2NrXCI6XG4gICAgICByZXR1cm4gZGVlcE1lcmdlKHRhcmdldCwgYm9keS52YWx1ZSk7XG4gICAgY2FzZSBcIlRhYmxlXCI6XG4gICAgICByZXR1cm4gZGVlcEFzc2lnblRhYmxlKHRhcmdldCwgYm9keSk7XG4gICAgY2FzZSBcIlRhYmxlQXJyYXlcIjpcbiAgICAgIHJldHVybiBkZWVwQXNzaWduVGFibGVBcnJheSh0YXJnZXQsIGJvZHkpO1xuICB9XG59XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhcnNlciBjb21iaW5hdG9ycyBhbmQgZ2VuZXJhdG9yc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBkZW5vLWxpbnQtaWdub3JlIG5vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gb3IocGFyc2Vycykge1xuICByZXR1cm4gKHNjYW5uZXIpPT57XG4gICAgZm9yIChjb25zdCBwYXJzZSBvZiBwYXJzZXJzKXtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlKHNjYW5uZXIpO1xuICAgICAgaWYgKHJlc3VsdC5vaykgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIGZhaWx1cmUoKTtcbiAgfTtcbn1cbi8qKiBKb2luIHRoZSBwYXJzZSByZXN1bHRzIG9mIHRoZSBnaXZlbiBwYXJzZXIgaW50byBhbiBhcnJheS5cbiAqXG4gKiBJZiB0aGUgcGFyc2VyIGZhaWxzIGF0IHRoZSBmaXJzdCBhdHRlbXB0LCBpdCB3aWxsIHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAqLyBmdW5jdGlvbiBqb2luKHBhcnNlciwgc2VwYXJhdG9yKSB7XG4gIGNvbnN0IFNlcGFyYXRvciA9IGNoYXJhY3RlcihzZXBhcmF0b3IpO1xuICByZXR1cm4gKHNjYW5uZXIpPT57XG4gICAgY29uc3Qgb3V0ID0gW107XG4gICAgY29uc3QgZmlyc3QgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgaWYgKCFmaXJzdC5vaykgcmV0dXJuIHN1Y2Nlc3Mob3V0KTtcbiAgICBvdXQucHVzaChmaXJzdC5ib2R5KTtcbiAgICB3aGlsZSghc2Nhbm5lci5lb2YoKSl7XG4gICAgICBpZiAoIVNlcGFyYXRvcihzY2FubmVyKS5vaykgYnJlYWs7XG4gICAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYEludmFsaWQgdG9rZW4gYWZ0ZXIgXCIke3NlcGFyYXRvcn1cImApO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2gocmVzdWx0LmJvZHkpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcyhvdXQpO1xuICB9O1xufVxuLyoqIEpvaW4gdGhlIHBhcnNlIHJlc3VsdHMgb2YgdGhlIGdpdmVuIHBhcnNlciBpbnRvIGFuIGFycmF5LlxuICpcbiAqIFRoaXMgcmVxdWlyZXMgdGhlIHBhcnNlciB0byBzdWNjZWVkIGF0IGxlYXN0IG9uY2UuXG4gKi8gZnVuY3Rpb24gam9pbjEocGFyc2VyLCBzZXBhcmF0b3IpIHtcbiAgY29uc3QgU2VwYXJhdG9yID0gY2hhcmFjdGVyKHNlcGFyYXRvcik7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBjb25zdCBmaXJzdCA9IHBhcnNlcihzY2FubmVyKTtcbiAgICBpZiAoIWZpcnN0Lm9rKSByZXR1cm4gZmFpbHVyZSgpO1xuICAgIGNvbnN0IG91dCA9IFtcbiAgICAgIGZpcnN0LmJvZHlcbiAgICBdO1xuICAgIHdoaWxlKCFzY2FubmVyLmVvZigpKXtcbiAgICAgIGlmICghU2VwYXJhdG9yKHNjYW5uZXIpLm9rKSBicmVhaztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlcihzY2FubmVyKTtcbiAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCB0b2tlbiBhZnRlciBcIiR7c2VwYXJhdG9yfVwiYCk7XG4gICAgICB9XG4gICAgICBvdXQucHVzaChyZXN1bHQuYm9keSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzKG91dCk7XG4gIH07XG59XG5mdW5jdGlvbiBrdihrZXlQYXJzZXIsIHNlcGFyYXRvciwgdmFsdWVQYXJzZXIpIHtcbiAgY29uc3QgU2VwYXJhdG9yID0gY2hhcmFjdGVyKHNlcGFyYXRvcik7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBjb25zdCBwb3NpdGlvbiA9IHNjYW5uZXIucG9zaXRpb247XG4gICAgY29uc3Qga2V5ID0ga2V5UGFyc2VyKHNjYW5uZXIpO1xuICAgIGlmICgha2V5Lm9rKSByZXR1cm4gZmFpbHVyZSgpO1xuICAgIGNvbnN0IHNlcCA9IFNlcGFyYXRvcihzY2FubmVyKTtcbiAgICBpZiAoIXNlcC5vaykge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBrZXkvdmFsdWUgcGFpciBkb2Vzbid0IGhhdmUgXCIke3NlcGFyYXRvcn1cImApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHZhbHVlUGFyc2VyKHNjYW5uZXIpO1xuICAgIGlmICghdmFsdWUub2spIHtcbiAgICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IHNjYW5uZXIuc291cmNlLmluZGV4T2YoXCJcXG5cIiwgc2Nhbm5lci5wb3NpdGlvbik7XG4gICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IGxpbmVFbmRJbmRleCA+IDAgPyBsaW5lRW5kSW5kZXggOiBzY2FubmVyLnNvdXJjZS5sZW5ndGg7XG4gICAgICBjb25zdCBsaW5lID0gc2Nhbm5lci5zb3VyY2Uuc2xpY2UocG9zaXRpb24sIGVuZFBvc2l0aW9uKTtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIHZhbHVlIG9uIGxpbmUgJyR7bGluZX0nYCk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzKHVuZmxhdChrZXkuYm9keSwgdmFsdWUuYm9keSkpO1xuICB9O1xufVxuZnVuY3Rpb24gbWVyZ2UocGFyc2VyKSB7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgaWYgKCFyZXN1bHQub2spIHJldHVybiBmYWlsdXJlKCk7XG4gICAgbGV0IGJvZHkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZXN1bHQuYm9keSl7XG4gICAgICBpZiAodHlwZW9mIHJlY29yZCA9PT0gXCJvYmplY3RcIiAmJiByZWNvcmQgIT09IG51bGwpIHtcbiAgICAgICAgYm9keSA9IGRlZXBNZXJnZShib2R5LCByZWNvcmQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3VjY2Vzcyhib2R5KTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlcGVhdChwYXJzZXIpIHtcbiAgcmV0dXJuIChzY2FubmVyKT0+e1xuICAgIGNvbnN0IGJvZHkgPSBbXTtcbiAgICB3aGlsZSghc2Nhbm5lci5lb2YoKSl7XG4gICAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgICBpZiAoIXJlc3VsdC5vaykgYnJlYWs7XG4gICAgICBib2R5LnB1c2gocmVzdWx0LmJvZHkpO1xuICAgICAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gICAgfVxuICAgIGlmIChib2R5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgICByZXR1cm4gc3VjY2Vzcyhib2R5KTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHN1cnJvdW5kKGxlZnQsIHBhcnNlciwgcmlnaHQpIHtcbiAgY29uc3QgTGVmdCA9IGNoYXJhY3RlcihsZWZ0KTtcbiAgY29uc3QgUmlnaHQgPSBjaGFyYWN0ZXIocmlnaHQpO1xuICByZXR1cm4gKHNjYW5uZXIpPT57XG4gICAgaWYgKCFMZWZ0KHNjYW5uZXIpLm9rKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZSgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCB0b2tlbiBhZnRlciBcIiR7bGVmdH1cImApO1xuICAgIH1cbiAgICBpZiAoIVJpZ2h0KHNjYW5uZXIpLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYE5vdCBjbG9zZWQgYnkgXCIke3JpZ2h0fVwiIGFmdGVyIHN0YXJ0ZWQgd2l0aCBcIiR7bGVmdH1cImApO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcyhyZXN1bHQuYm9keSk7XG4gIH07XG59XG5mdW5jdGlvbiBjaGFyYWN0ZXIoc3RyKSB7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICAgIGlmICghc2Nhbm5lci5zdGFydHNXaXRoKHN0cikpIHJldHVybiBmYWlsdXJlKCk7XG4gICAgc2Nhbm5lci5uZXh0KHN0ci5sZW5ndGgpO1xuICAgIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gICAgcmV0dXJuIHN1Y2Nlc3ModW5kZWZpbmVkKTtcbiAgfTtcbn1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQYXJzZXIgY29tcG9uZW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IEJBUkVfS0VZX1JFR0VYUCA9IC9bQS1aYS16MC05Xy1dKy95O1xuZXhwb3J0IGZ1bmN0aW9uIGJhcmVLZXkoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBrZXkgPSBzY2FubmVyLm1hdGNoKEJBUkVfS0VZX1JFR0VYUCk/LlswXTtcbiAgaWYgKCFrZXkpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dChrZXkubGVuZ3RoKTtcbiAgcmV0dXJuIHN1Y2Nlc3Moa2V5KTtcbn1cbmZ1bmN0aW9uIGVzY2FwZVNlcXVlbmNlKHNjYW5uZXIpIHtcbiAgaWYgKHNjYW5uZXIuY2hhcigpICE9PSBcIlxcXFxcIikgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KCk7XG4gIC8vIFNlZSBodHRwczovL3RvbWwuaW8vZW4vdjEuMC4wLXJjLjMjc3RyaW5nXG4gIHN3aXRjaChzY2FubmVyLmNoYXIoKSl7XG4gICAgY2FzZSBcImJcIjpcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3MoXCJcXGJcIik7XG4gICAgY2FzZSBcInRcIjpcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3MoXCJcXHRcIik7XG4gICAgY2FzZSBcIm5cIjpcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3MoXCJcXG5cIik7XG4gICAgY2FzZSBcImZcIjpcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3MoXCJcXGZcIik7XG4gICAgY2FzZSBcInJcIjpcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3MoXCJcXHJcIik7XG4gICAgY2FzZSBcInVcIjpcbiAgICBjYXNlIFwiVVwiOlxuICAgICAge1xuICAgICAgICAvLyBVbmljb2RlIGNoYXJhY3RlclxuICAgICAgICBjb25zdCBjb2RlUG9pbnRMZW4gPSBzY2FubmVyLmNoYXIoKSA9PT0gXCJ1XCIgPyA0IDogNjtcbiAgICAgICAgY29uc3QgY29kZVBvaW50ID0gcGFyc2VJbnQoXCIweFwiICsgc2Nhbm5lci5zbGljZSgxLCAxICsgY29kZVBvaW50TGVuKSwgMTYpO1xuICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlUG9pbnQpO1xuICAgICAgICBzY2FubmVyLm5leHQoY29kZVBvaW50TGVuICsgMSk7XG4gICAgICAgIHJldHVybiBzdWNjZXNzKHN0cik7XG4gICAgICB9XG4gICAgY2FzZSAnXCInOlxuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICByZXR1cm4gc3VjY2VzcygnXCInKTtcbiAgICBjYXNlIFwiXFxcXFwiOlxuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICByZXR1cm4gc3VjY2VzcyhcIlxcXFxcIik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6IFxcXFwke3NjYW5uZXIuY2hhcigpfWApO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gYmFzaWNTdHJpbmcoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBpZiAoc2Nhbm5lci5jaGFyKCkgIT09ICdcIicpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dCgpO1xuICBjb25zdCBhY2MgPSBbXTtcbiAgd2hpbGUoc2Nhbm5lci5jaGFyKCkgIT09ICdcIicgJiYgIXNjYW5uZXIuZW9mKCkpe1xuICAgIGlmIChzY2FubmVyLmNoYXIoKSA9PT0gXCJcXG5cIikge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiU2luZ2xlLWxpbmUgc3RyaW5nIGNhbm5vdCBjb250YWluIEVPTFwiKTtcbiAgICB9XG4gICAgY29uc3QgZXNjYXBlZENoYXIgPSBlc2NhcGVTZXF1ZW5jZShzY2FubmVyKTtcbiAgICBpZiAoZXNjYXBlZENoYXIub2spIHtcbiAgICAgIGFjYy5wdXNoKGVzY2FwZWRDaGFyLmJvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2MucHVzaChzY2FubmVyLmNoYXIoKSk7XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNjYW5uZXIuZW9mKCkpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFNpbmdsZS1saW5lIHN0cmluZyBpcyBub3QgY2xvc2VkOlxcbiR7YWNjLmpvaW4oXCJcIil9YCk7XG4gIH1cbiAgc2Nhbm5lci5uZXh0KCk7IC8vIHNraXAgbGFzdCAnXCJcIlxuICByZXR1cm4gc3VjY2VzcyhhY2Muam9pbihcIlwiKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbFN0cmluZyhzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGlmIChzY2FubmVyLmNoYXIoKSAhPT0gXCInXCIpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dCgpO1xuICBjb25zdCBhY2MgPSBbXTtcbiAgd2hpbGUoc2Nhbm5lci5jaGFyKCkgIT09IFwiJ1wiICYmICFzY2FubmVyLmVvZigpKXtcbiAgICBpZiAoc2Nhbm5lci5jaGFyKCkgPT09IFwiXFxuXCIpIHtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIlNpbmdsZS1saW5lIHN0cmluZyBjYW5ub3QgY29udGFpbiBFT0xcIik7XG4gICAgfVxuICAgIGFjYy5wdXNoKHNjYW5uZXIuY2hhcigpKTtcbiAgICBzY2FubmVyLm5leHQoKTtcbiAgfVxuICBpZiAoc2Nhbm5lci5lb2YoKSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgU2luZ2xlLWxpbmUgc3RyaW5nIGlzIG5vdCBjbG9zZWQ6XFxuJHthY2Muam9pbihcIlwiKX1gKTtcbiAgfVxuICBzY2FubmVyLm5leHQoKTsgLy8gc2tpcCBsYXN0IFwiJ1wiXG4gIHJldHVybiBzdWNjZXNzKGFjYy5qb2luKFwiXCIpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aWxpbmVCYXNpY1N0cmluZyhzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGlmICghc2Nhbm5lci5zdGFydHNXaXRoKCdcIlwiXCInKSkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KDMpO1xuICBpZiAoc2Nhbm5lci5jaGFyKCkgPT09IFwiXFxuXCIpIHtcbiAgICAvLyBUaGUgZmlyc3QgbmV3bGluZSAoTEYpIGlzIHRyaW1tZWRcbiAgICBzY2FubmVyLm5leHQoKTtcbiAgfSBlbHNlIGlmIChzY2FubmVyLnN0YXJ0c1dpdGgoXCJcXHJcXG5cIikpIHtcbiAgICAvLyBUaGUgZmlyc3QgbmV3bGluZSAoQ1JMRikgaXMgdHJpbW1lZFxuICAgIHNjYW5uZXIubmV4dCgyKTtcbiAgfVxuICBjb25zdCBhY2MgPSBbXTtcbiAgd2hpbGUoIXNjYW5uZXIuc3RhcnRzV2l0aCgnXCJcIlwiJykgJiYgIXNjYW5uZXIuZW9mKCkpe1xuICAgIC8vIGxpbmUgZW5kaW5nIGJhY2tzbGFzaFxuICAgIGlmIChzY2FubmVyLnN0YXJ0c1dpdGgoXCJcXFxcXFxuXCIpKSB7XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgIHNjYW5uZXIubmV4dFVudGlsQ2hhcih7XG4gICAgICAgIHNraXBDb21tZW50czogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChzY2FubmVyLnN0YXJ0c1dpdGgoXCJcXFxcXFxyXFxuXCIpKSB7XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgIHNjYW5uZXIubmV4dFVudGlsQ2hhcih7XG4gICAgICAgIHNraXBDb21tZW50czogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGVzY2FwZWRDaGFyID0gZXNjYXBlU2VxdWVuY2Uoc2Nhbm5lcik7XG4gICAgaWYgKGVzY2FwZWRDaGFyLm9rKSB7XG4gICAgICBhY2MucHVzaChlc2NhcGVkQ2hhci5ib2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjLnB1c2goc2Nhbm5lci5jaGFyKCkpO1xuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgfVxuICB9XG4gIGlmIChzY2FubmVyLmVvZigpKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBNdWx0aS1saW5lIHN0cmluZyBpcyBub3QgY2xvc2VkOlxcbiR7YWNjLmpvaW4oXCJcIil9YCk7XG4gIH1cbiAgLy8gaWYgZW5kcyB3aXRoIDQgYFwiYCwgcHVzaCB0aGUgZmlzdCBgXCJgIHRvIHN0cmluZ1xuICBpZiAoc2Nhbm5lci5jaGFyKDMpID09PSAnXCInKSB7XG4gICAgYWNjLnB1c2goJ1wiJyk7XG4gICAgc2Nhbm5lci5uZXh0KCk7XG4gIH1cbiAgc2Nhbm5lci5uZXh0KDMpOyAvLyBza2lwIGxhc3QgJ1wiXCJcIlwiXG4gIHJldHVybiBzdWNjZXNzKGFjYy5qb2luKFwiXCIpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aWxpbmVMaXRlcmFsU3RyaW5nKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgaWYgKCFzY2FubmVyLnN0YXJ0c1dpdGgoXCInJydcIikpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dCgzKTtcbiAgaWYgKHNjYW5uZXIuY2hhcigpID09PSBcIlxcblwiKSB7XG4gICAgLy8gVGhlIGZpcnN0IG5ld2xpbmUgKExGKSBpcyB0cmltbWVkXG4gICAgc2Nhbm5lci5uZXh0KCk7XG4gIH0gZWxzZSBpZiAoc2Nhbm5lci5zdGFydHNXaXRoKFwiXFxyXFxuXCIpKSB7XG4gICAgLy8gVGhlIGZpcnN0IG5ld2xpbmUgKENSTEYpIGlzIHRyaW1tZWRcbiAgICBzY2FubmVyLm5leHQoMik7XG4gIH1cbiAgY29uc3QgYWNjID0gW107XG4gIHdoaWxlKCFzY2FubmVyLnN0YXJ0c1dpdGgoXCInJydcIikgJiYgIXNjYW5uZXIuZW9mKCkpe1xuICAgIGFjYy5wdXNoKHNjYW5uZXIuY2hhcigpKTtcbiAgICBzY2FubmVyLm5leHQoKTtcbiAgfVxuICBpZiAoc2Nhbm5lci5lb2YoKSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgTXVsdGktbGluZSBzdHJpbmcgaXMgbm90IGNsb3NlZDpcXG4ke2FjYy5qb2luKFwiXCIpfWApO1xuICB9XG4gIC8vIGlmIGVuZHMgd2l0aCA0IGAnYCwgcHVzaCB0aGUgZmlzdCBgJ2AgdG8gc3RyaW5nXG4gIGlmIChzY2FubmVyLmNoYXIoMykgPT09IFwiJ1wiKSB7XG4gICAgYWNjLnB1c2goXCInXCIpO1xuICAgIHNjYW5uZXIubmV4dCgpO1xuICB9XG4gIHNjYW5uZXIubmV4dCgzKTsgLy8gc2tpcCBsYXN0IFwiJycnXCJcbiAgcmV0dXJuIHN1Y2Nlc3MoYWNjLmpvaW4oXCJcIikpO1xufVxuY29uc3QgQk9PTEVBTl9SRUdFWFAgPSAvKD86dHJ1ZXxmYWxzZSlcXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBib29sZWFuKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3QgbWF0Y2ggPSBzY2FubmVyLm1hdGNoKEJPT0xFQU5fUkVHRVhQKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgY29uc3Qgc3RyaW5nID0gbWF0Y2hbMF07XG4gIHNjYW5uZXIubmV4dChzdHJpbmcubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWUgPSBzdHJpbmcgPT09IFwidHJ1ZVwiO1xuICByZXR1cm4gc3VjY2Vzcyh2YWx1ZSk7XG59XG5jb25zdCBJTkZJTklUWV9NQVAgPSBuZXcgTWFwKFtcbiAgW1xuICAgIFwiaW5mXCIsXG4gICAgSW5maW5pdHlcbiAgXSxcbiAgW1xuICAgIFwiK2luZlwiLFxuICAgIEluZmluaXR5XG4gIF0sXG4gIFtcbiAgICBcIi1pbmZcIixcbiAgICAtSW5maW5pdHlcbiAgXVxuXSk7XG5jb25zdCBJTkZJTklUWV9SRUdFWFAgPSAvWystXT9pbmZcXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBpbmZpbml0eShzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChJTkZJTklUWV9SRUdFWFApO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFpbHVyZSgpO1xuICBjb25zdCBzdHJpbmcgPSBtYXRjaFswXTtcbiAgc2Nhbm5lci5uZXh0KHN0cmluZy5sZW5ndGgpO1xuICBjb25zdCB2YWx1ZSA9IElORklOSVRZX01BUC5nZXQoc3RyaW5nKTtcbiAgcmV0dXJuIHN1Y2Nlc3ModmFsdWUpO1xufVxuY29uc3QgTkFOX1JFR0VYUCA9IC9bKy1dP25hblxcYi95O1xuZXhwb3J0IGZ1bmN0aW9uIG5hbihzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChOQU5fUkVHRVhQKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgY29uc3Qgc3RyaW5nID0gbWF0Y2hbMF07XG4gIHNjYW5uZXIubmV4dChzdHJpbmcubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWUgPSBOYU47XG4gIHJldHVybiBzdWNjZXNzKHZhbHVlKTtcbn1cbmV4cG9ydCBjb25zdCBkb3R0ZWRLZXkgPSBqb2luMShvcihbXG4gIGJhcmVLZXksXG4gIGJhc2ljU3RyaW5nLFxuICBsaXRlcmFsU3RyaW5nXG5dKSwgXCIuXCIpO1xuY29uc3QgQklOQVJZX1JFR0VYUCA9IC8wYlswMV0rKD86X1swMV0rKSpcXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnkoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goQklOQVJZX1JFR0VYUCk/LlswXTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KG1hdGNoLmxlbmd0aCk7XG4gIGNvbnN0IHZhbHVlID0gbWF0Y2guc2xpY2UoMikucmVwbGFjZUFsbChcIl9cIiwgXCJcIik7XG4gIGNvbnN0IG51bWJlciA9IHBhcnNlSW50KHZhbHVlLCAyKTtcbiAgcmV0dXJuIGlzTmFOKG51bWJlcikgPyBmYWlsdXJlKCkgOiBzdWNjZXNzKG51bWJlcik7XG59XG5jb25zdCBPQ1RBTF9SRUdFWFAgPSAvMG9bMC03XSsoPzpfWzAtN10rKSpcXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBvY3RhbChzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChPQ1RBTF9SRUdFWFApPy5bMF07XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dChtYXRjaC5sZW5ndGgpO1xuICBjb25zdCB2YWx1ZSA9IG1hdGNoLnNsaWNlKDIpLnJlcGxhY2VBbGwoXCJfXCIsIFwiXCIpO1xuICBjb25zdCBudW1iZXIgPSBwYXJzZUludCh2YWx1ZSwgOCk7XG4gIHJldHVybiBpc05hTihudW1iZXIpID8gZmFpbHVyZSgpIDogc3VjY2VzcyhudW1iZXIpO1xufVxuY29uc3QgSEVYX1JFR0VYUCA9IC8weFswLTlhLWZdKyg/Ol9bMC05YS1mXSspKlxcYi95aTtcbmV4cG9ydCBmdW5jdGlvbiBoZXgoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goSEVYX1JFR0VYUCk/LlswXTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KG1hdGNoLmxlbmd0aCk7XG4gIGNvbnN0IHZhbHVlID0gbWF0Y2guc2xpY2UoMikucmVwbGFjZUFsbChcIl9cIiwgXCJcIik7XG4gIGNvbnN0IG51bWJlciA9IHBhcnNlSW50KHZhbHVlLCAxNik7XG4gIHJldHVybiBpc05hTihudW1iZXIpID8gZmFpbHVyZSgpIDogc3VjY2VzcyhudW1iZXIpO1xufVxuY29uc3QgSU5URUdFUl9SRUdFWFAgPSAvWystXT8oPzowfFsxLTldWzAtOV0qKD86X1swLTldKykqKVxcYi95O1xuZXhwb3J0IGZ1bmN0aW9uIGludGVnZXIoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goSU5URUdFUl9SRUdFWFApPy5bMF07XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dChtYXRjaC5sZW5ndGgpO1xuICBjb25zdCB2YWx1ZSA9IG1hdGNoLnJlcGxhY2VBbGwoXCJfXCIsIFwiXCIpO1xuICBjb25zdCBpbnQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICByZXR1cm4gc3VjY2VzcyhpbnQpO1xufVxuY29uc3QgRkxPQVRfUkVHRVhQID0gL1srLV0/KD86MHxbMS05XVswLTldKig/Ol9bMC05XSspKikoPzpcXC5bMC05XSsoPzpfWzAtOV0rKSopPyg/OmVbKy1dP1swLTldKyg/Ol9bMC05XSspKik/XFxiL3lpO1xuZXhwb3J0IGZ1bmN0aW9uIGZsb2F0KHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3QgbWF0Y2ggPSBzY2FubmVyLm1hdGNoKEZMT0FUX1JFR0VYUCk/LlswXTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KG1hdGNoLmxlbmd0aCk7XG4gIGNvbnN0IHZhbHVlID0gbWF0Y2gucmVwbGFjZUFsbChcIl9cIiwgXCJcIik7XG4gIGNvbnN0IGZsb2F0ID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIGlmIChpc05hTihmbG9hdCkpIHJldHVybiBmYWlsdXJlKCk7XG4gIHJldHVybiBzdWNjZXNzKGZsb2F0KTtcbn1cbmNvbnN0IERBVEVfVElNRV9SRUdFWFAgPSAvKD88eWVhcj5cXGR7NH0pLSg/PG1vbnRoPlxcZHsyfSktKD88ZGF5PlxcZHsyfSkoPzpbIDAtOVRaLjorLV0rKT9cXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBkYXRlVGltZShzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChEQVRFX1RJTUVfUkVHRVhQKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgY29uc3Qgc3RyaW5nID0gbWF0Y2hbMF07XG4gIHNjYW5uZXIubmV4dChzdHJpbmcubGVuZ3RoKTtcbiAgY29uc3QgZ3JvdXBzID0gbWF0Y2guZ3JvdXBzO1xuICAvLyBzcGVjaWFsIGNhc2UgaWYgbW9udGggaXMgRmVicnVhcnlcbiAgaWYgKGdyb3Vwcy5tb250aCA9PSBcIjAyXCIpIHtcbiAgICBjb25zdCBkYXlzID0gcGFyc2VJbnQoZ3JvdXBzLmRheSk7XG4gICAgaWYgKGRheXMgPiAyOSkge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIGRhdGUgc3RyaW5nIFwiJHttYXRjaH1cImApO1xuICAgIH1cbiAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQoZ3JvdXBzLnllYXIpO1xuICAgIGlmIChkYXlzID4gMjggJiYgIWlzTGVhcCh5ZWFyKSkge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIGRhdGUgc3RyaW5nIFwiJHttYXRjaH1cImApO1xuICAgIH1cbiAgfVxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoc3RyaW5nLnRyaW0oKSk7XG4gIC8vIGludmFsaWQgZGF0ZVxuICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIGRhdGUgc3RyaW5nIFwiJHttYXRjaH1cImApO1xuICB9XG4gIHJldHVybiBzdWNjZXNzKGRhdGUpO1xufVxuY29uc3QgTE9DQUxfVElNRV9SRUdFWFAgPSAvKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSkoPzpcXC5bMC05XSspP1xcYi95O1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsVGltZShzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChMT0NBTF9USU1FX1JFR0VYUCk/LlswXTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KG1hdGNoLmxlbmd0aCk7XG4gIHJldHVybiBzdWNjZXNzKG1hdGNoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVZhbHVlKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgaWYgKHNjYW5uZXIuY2hhcigpICE9PSBcIltcIikgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KCk7XG4gIGNvbnN0IGFycmF5ID0gW107XG4gIHdoaWxlKCFzY2FubmVyLmVvZigpKXtcbiAgICBzY2FubmVyLm5leHRVbnRpbENoYXIoKTtcbiAgICBjb25zdCByZXN1bHQgPSB2YWx1ZShzY2FubmVyKTtcbiAgICBpZiAoIXJlc3VsdC5vaykgYnJlYWs7XG4gICAgYXJyYXkucHVzaChyZXN1bHQuYm9keSk7XG4gICAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgICAvLyBtYXkgaGF2ZSBhIG5leHQgaXRlbSwgYnV0IHRyYWlsaW5nIGNvbW1hIGlzIGFsbG93ZWQgYXQgYXJyYXlcbiAgICBpZiAoc2Nhbm5lci5jaGFyKCkgIT09IFwiLFwiKSBicmVhaztcbiAgICBzY2FubmVyLm5leHQoKTtcbiAgfVxuICBzY2FubmVyLm5leHRVbnRpbENoYXIoKTtcbiAgaWYgKHNjYW5uZXIuY2hhcigpICE9PSBcIl1cIikgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQXJyYXkgaXMgbm90IGNsb3NlZFwiKTtcbiAgc2Nhbm5lci5uZXh0KCk7XG4gIHJldHVybiBzdWNjZXNzKGFycmF5KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbmxpbmVUYWJsZShzY2FubmVyKSB7XG4gIHNjYW5uZXIubmV4dFVudGlsQ2hhcigpO1xuICBpZiAoc2Nhbm5lci5jaGFyKDEpID09PSBcIn1cIikge1xuICAgIHNjYW5uZXIubmV4dCgyKTtcbiAgICByZXR1cm4gc3VjY2Vzcyh7fSk7XG4gIH1cbiAgY29uc3QgcGFpcnMgPSBzdXJyb3VuZChcIntcIiwgam9pbihwYWlyLCBcIixcIiksIFwifVwiKShzY2FubmVyKTtcbiAgaWYgKCFwYWlycy5vaykgcmV0dXJuIGZhaWx1cmUoKTtcbiAgbGV0IHRhYmxlID0ge307XG4gIGZvciAoY29uc3QgcGFpciBvZiBwYWlycy5ib2R5KXtcbiAgICB0YWJsZSA9IGRlZXBNZXJnZSh0YWJsZSwgcGFpcik7XG4gIH1cbiAgcmV0dXJuIHN1Y2Nlc3ModGFibGUpO1xufVxuZXhwb3J0IGNvbnN0IHZhbHVlID0gb3IoW1xuICBtdWx0aWxpbmVCYXNpY1N0cmluZyxcbiAgbXVsdGlsaW5lTGl0ZXJhbFN0cmluZyxcbiAgYmFzaWNTdHJpbmcsXG4gIGxpdGVyYWxTdHJpbmcsXG4gIGJvb2xlYW4sXG4gIGluZmluaXR5LFxuICBuYW4sXG4gIGRhdGVUaW1lLFxuICBsb2NhbFRpbWUsXG4gIGJpbmFyeSxcbiAgb2N0YWwsXG4gIGhleCxcbiAgZmxvYXQsXG4gIGludGVnZXIsXG4gIGFycmF5VmFsdWUsXG4gIGlubGluZVRhYmxlXG5dKTtcbmV4cG9ydCBjb25zdCBwYWlyID0ga3YoZG90dGVkS2V5LCBcIj1cIiwgdmFsdWUpO1xuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gIGNvbnN0IHJlc3VsdCA9IG1lcmdlKHJlcGVhdChwYWlyKSkoc2Nhbm5lcik7XG4gIGlmIChyZXN1bHQub2spIHJldHVybiBzdWNjZXNzKHtcbiAgICB0eXBlOiBcIkJsb2NrXCIsXG4gICAgdmFsdWU6IHJlc3VsdC5ib2R5XG4gIH0pO1xuICByZXR1cm4gZmFpbHVyZSgpO1xufVxuZXhwb3J0IGNvbnN0IHRhYmxlSGVhZGVyID0gc3Vycm91bmQoXCJbXCIsIGRvdHRlZEtleSwgXCJdXCIpO1xuZXhwb3J0IGZ1bmN0aW9uIHRhYmxlKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gIGNvbnN0IGhlYWRlciA9IHRhYmxlSGVhZGVyKHNjYW5uZXIpO1xuICBpZiAoIWhlYWRlci5vaykgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gIGNvbnN0IGIgPSBibG9jayhzY2FubmVyKTtcbiAgcmV0dXJuIHN1Y2Nlc3Moe1xuICAgIHR5cGU6IFwiVGFibGVcIixcbiAgICBrZXlzOiBoZWFkZXIuYm9keSxcbiAgICB2YWx1ZTogYi5vayA/IGIuYm9keS52YWx1ZSA6IHt9XG4gIH0pO1xufVxuZXhwb3J0IGNvbnN0IHRhYmxlQXJyYXlIZWFkZXIgPSBzdXJyb3VuZChcIltbXCIsIGRvdHRlZEtleSwgXCJdXVwiKTtcbmV4cG9ydCBmdW5jdGlvbiB0YWJsZUFycmF5KHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gIGNvbnN0IGhlYWRlciA9IHRhYmxlQXJyYXlIZWFkZXIoc2Nhbm5lcik7XG4gIGlmICghaGVhZGVyLm9rKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHRVbnRpbENoYXIoKTtcbiAgY29uc3QgYiA9IGJsb2NrKHNjYW5uZXIpO1xuICByZXR1cm4gc3VjY2Vzcyh7XG4gICAgdHlwZTogXCJUYWJsZUFycmF5XCIsXG4gICAga2V5czogaGVhZGVyLmJvZHksXG4gICAgdmFsdWU6IGIub2sgPyBiLmJvZHkudmFsdWUgOiB7fVxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b21sKHNjYW5uZXIpIHtcbiAgY29uc3QgYmxvY2tzID0gcmVwZWF0KG9yKFtcbiAgICBibG9jayxcbiAgICB0YWJsZUFycmF5LFxuICAgIHRhYmxlXG4gIF0pKShzY2FubmVyKTtcbiAgaWYgKCFibG9ja3Mub2spIHJldHVybiBzdWNjZXNzKHt9KTtcbiAgY29uc3QgYm9keSA9IGJsb2Nrcy5ib2R5LnJlZHVjZShkZWVwQXNzaWduLCB7fSk7XG4gIHJldHVybiBzdWNjZXNzKGJvZHkpO1xufVxuZnVuY3Rpb24gY3JlYXRlUGFyc2VFcnJvck1lc3NhZ2Uoc2Nhbm5lciwgbWVzc2FnZSkge1xuICBjb25zdCBzdHJpbmcgPSBzY2FubmVyLnNvdXJjZS5zbGljZSgwLCBzY2FubmVyLnBvc2l0aW9uKTtcbiAgY29uc3QgbGluZXMgPSBzdHJpbmcuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IHJvdyA9IGxpbmVzLmxlbmd0aDtcbiAgY29uc3QgY29sdW1uID0gbGluZXMuYXQoLTEpPy5sZW5ndGggPz8gMDtcbiAgcmV0dXJuIGBQYXJzZSBlcnJvciBvbiBsaW5lICR7cm93fSwgY29sdW1uICR7Y29sdW1ufTogJHttZXNzYWdlfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VyRmFjdG9yeShwYXJzZXIpIHtcbiAgcmV0dXJuICh0b21sU3RyaW5nKT0+e1xuICAgIGNvbnN0IHNjYW5uZXIgPSBuZXcgU2Nhbm5lcih0b21sU3RyaW5nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyKHNjYW5uZXIpO1xuICAgICAgaWYgKHJlc3VsdC5vayAmJiBzY2FubmVyLmVvZigpKSByZXR1cm4gcmVzdWx0LmJvZHk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYFVuZXhwZWN0ZWQgY2hhcmFjdGVyOiBcIiR7c2Nhbm5lci5jaGFyKCl9XCJgO1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGNyZWF0ZVBhcnNlRXJyb3JNZXNzYWdlKHNjYW5uZXIsIG1lc3NhZ2UpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGNyZWF0ZVBhcnNlRXJyb3JNZXNzYWdlKHNjYW5uZXIsIGVycm9yLm1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBcIkludmFsaWQgZXJyb3IgdHlwZSBjYXVnaHRcIjtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihjcmVhdGVQYXJzZUVycm9yTWVzc2FnZShzY2FubmVyLCBtZXNzYWdlKSk7XG4gICAgfVxuICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3BhcnNlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgMjAxOC0yMDI1IHRoZSBEZW5vIGF1dGhvcnMuIE1JVCBsaWNlbnNlLlxuLy8gVGhpcyBtb2R1bGUgaXMgYnJvd3NlciBjb21wYXRpYmxlLlxuaW1wb3J0IHsgcGFyc2VyRmFjdG9yeSwgdG9tbCB9IGZyb20gXCIuL19wYXJzZXIuanNcIjtcbi8qKlxuICogUGFyc2VzIGEge0BsaW5rIGh0dHBzOi8vdG9tbC5pbyB8IFRPTUx9IHN0cmluZyBpbnRvIGFuIG9iamVjdC5cbiAqXG4gKiBAZXhhbXBsZSBVc2FnZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHBhcnNlIH0gZnJvbSBcIkBzdGQvdG9tbC9wYXJzZVwiO1xuICogaW1wb3J0IHsgYXNzZXJ0RXF1YWxzIH0gZnJvbSBcIkBzdGQvYXNzZXJ0XCI7XG4gKlxuICogY29uc3QgdG9tbFN0cmluZyA9IGB0aXRsZSA9IFwiVE9NTCBFeGFtcGxlXCJcbiAqIFtvd25lcl1cbiAqIG5hbWUgPSBcIkFsaWNlXCJcbiAqIGJpbyA9IFwiQWxpY2UgaXMgYSBwcm9ncmFtbWVyLlwiYDtcbiAqXG4gKiBjb25zdCBvYmogPSBwYXJzZSh0b21sU3RyaW5nKTtcbiAqIGFzc2VydEVxdWFscyhvYmosIHsgdGl0bGU6IFwiVE9NTCBFeGFtcGxlXCIsIG93bmVyOiB7IG5hbWU6IFwiQWxpY2VcIiwgYmlvOiBcIkFsaWNlIGlzIGEgcHJvZ3JhbW1lci5cIiB9IH0pO1xuICogYGBgXG4gKiBAcGFyYW0gdG9tbFN0cmluZyBUT01MIHN0cmluZyB0byBiZSBwYXJzZWQuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIEpTIG9iamVjdC5cbiAqLyBleHBvcnQgZnVuY3Rpb24gcGFyc2UodG9tbFN0cmluZykge1xuICByZXR1cm4gcGFyc2VyRmFjdG9yeSh0b21sKSh0b21sU3RyaW5nKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLmpzLm1hcCIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgY29kZWdlbi9pbmRleC50c1xuLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlIG1hbnVhbGx5XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tICdjbGlwYW5pb24nXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlUmVuYW1lQ29tbWFuZCBleHRlbmRzIENvbW1hbmQge1xuICBzdGF0aWMgcGF0aHMgPSBbWydyZW5hbWUnXV1cblxuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlbmFtZSB0aGUgTkFQSS1SUyBwcm9qZWN0JyxcbiAgfSlcblxuICBjd2QgPSBPcHRpb24uU3RyaW5nKCctLWN3ZCcsIHByb2Nlc3MuY3dkKCksIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGgnLFxuICB9KVxuXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWNvbmZpZy1wYXRoLC1jJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZScsXG4gIH0pXG5cbiAgcGFja2FnZUpzb25QYXRoID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLWpzb24tcGF0aCcsICdwYWNrYWdlLmpzb24nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBwYWNrYWdlLmpzb25gJyxcbiAgfSlcblxuICBucG1EaXIgPSBPcHRpb24uU3RyaW5nKCctLW5wbS1kaXInLCAnbnBtJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0JyxcbiAgfSlcblxuICAkJG5hbWU/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLW5hbWUsLW4nLCB7XG4gICAgZGVzY3JpcHRpb246ICdUaGUgbmV3IG5hbWUgb2YgdGhlIHByb2plY3QnLFxuICB9KVxuXG4gIGJpbmFyeU5hbWU/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWJpbmFyeS1uYW1lLC1iJywge1xuICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5ldyBiaW5hcnkgbmFtZSAqLm5vZGUgZmlsZXMnLFxuICB9KVxuXG4gIHBhY2thZ2VOYW1lPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLW5hbWUnLCB7XG4gICAgZGVzY3JpcHRpb246ICdUaGUgbmV3IHBhY2thZ2UgbmFtZSBvZiB0aGUgcHJvamVjdCcsXG4gIH0pXG5cbiAgbWFuaWZlc3RQYXRoID0gT3B0aW9uLlN0cmluZygnLS1tYW5pZmVzdC1wYXRoJywgJ0NhcmdvLnRvbWwnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBDYXJnby50b21sYCcsXG4gIH0pXG5cbiAgcmVwb3NpdG9yeT86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tcmVwb3NpdG9yeScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBuZXcgcmVwb3NpdG9yeSBvZiB0aGUgcHJvamVjdCcsXG4gIH0pXG5cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWRlc2NyaXB0aW9uJywge1xuICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5ldyBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvamVjdCcsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgIGNvbmZpZ1BhdGg6IHRoaXMuY29uZmlnUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uUGF0aDogdGhpcy5wYWNrYWdlSnNvblBhdGgsXG4gICAgICBucG1EaXI6IHRoaXMubnBtRGlyLFxuICAgICAgbmFtZTogdGhpcy4kJG5hbWUsXG4gICAgICBiaW5hcnlOYW1lOiB0aGlzLmJpbmFyeU5hbWUsXG4gICAgICBwYWNrYWdlTmFtZTogdGhpcy5wYWNrYWdlTmFtZSxcbiAgICAgIG1hbmlmZXN0UGF0aDogdGhpcy5tYW5pZmVzdFBhdGgsXG4gICAgICByZXBvc2l0b3J5OiB0aGlzLnJlcG9zaXRvcnksXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5hbWUgdGhlIE5BUEktUlMgcHJvamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoXG4gICAqXG4gICAqIEBkZWZhdWx0IHByb2Nlc3MuY3dkKClcbiAgICovXG4gIGN3ZD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZVxuICAgKi9cbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgcGFja2FnZS5qc29uYFxuICAgKlxuICAgKiBAZGVmYXVsdCAncGFja2FnZS5qc29uJ1xuICAgKi9cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXRcbiAgICpcbiAgICogQGRlZmF1bHQgJ25wbSdcbiAgICovXG4gIG5wbURpcj86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG5ldyBuYW1lIG9mIHRoZSBwcm9qZWN0XG4gICAqL1xuICBuYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmV3IGJpbmFyeSBuYW1lICoubm9kZSBmaWxlc1xuICAgKi9cbiAgYmluYXJ5TmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG5ldyBwYWNrYWdlIG5hbWUgb2YgdGhlIHByb2plY3RcbiAgICovXG4gIHBhY2thZ2VOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBDYXJnby50b21sYFxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ2FyZ28udG9tbCdcbiAgICovXG4gIG1hbmlmZXN0UGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG5ldyByZXBvc2l0b3J5IG9mIHRoZSBwcm9qZWN0XG4gICAqL1xuICByZXBvc2l0b3J5Pzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmV3IGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0XG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlEZWZhdWx0UmVuYW1lT3B0aW9ucyhvcHRpb25zOiBSZW5hbWVPcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIHBhY2thZ2VKc29uUGF0aDogJ3BhY2thZ2UuanNvbicsXG4gICAgbnBtRGlyOiAnbnBtJyxcbiAgICBtYW5pZmVzdFBhdGg6ICdDYXJnby50b21sJyxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IHJlbmFtZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyByZXNvbHZlLCBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVRvbWwsIHN0cmluZ2lmeSBhcyBzdHJpbmdpZnlUb21sIH0gZnJvbSAnQHN0ZC90b21sJ1xuaW1wb3J0IHsgbG9hZCBhcyB5YW1sUGFyc2UsIGR1bXAgYXMgeWFtbFN0cmluZ2lmeSB9IGZyb20gJ2pzLXlhbWwnXG5pbXBvcnQgeyBpc05pbCwgbWVyZ2UsIG9taXRCeSwgcGljayB9IGZyb20gJ2VzLXRvb2xraXQnXG5pbXBvcnQgeyBmaW5kVXAgfSBmcm9tICdmaW5kLXVwJ1xuXG5pbXBvcnQgeyBhcHBseURlZmF1bHRSZW5hbWVPcHRpb25zLCBSZW5hbWVPcHRpb25zIH0gZnJvbSAnLi4vZGVmL3JlbmFtZS5qcydcbmltcG9ydCB7IHJlYWRDb25maWcsIHJlYWRGaWxlQXN5bmMsIHdyaXRlRmlsZUFzeW5jIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5hbWVQcm9qZWN0KHVzZXJPcHRpb25zOiBSZW5hbWVPcHRpb25zKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcHBseURlZmF1bHRSZW5hbWVPcHRpb25zKHVzZXJPcHRpb25zKVxuICBjb25zdCBuYXBpQ29uZmlnID0gYXdhaXQgcmVhZENvbmZpZyhvcHRpb25zKVxuICBjb25zdCBvbGROYW1lID0gbmFwaUNvbmZpZy5iaW5hcnlOYW1lXG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5wYWNrYWdlSnNvblBhdGgpXG4gIGNvbnN0IGNhcmdvVG9tbFBhdGggPSByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLm1hbmlmZXN0UGF0aClcblxuICBjb25zdCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZUFzeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKVxuICBjb25zdCBwYWNrYWdlSnNvbkRhdGEgPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudClcblxuICBtZXJnZShcbiAgICBtZXJnZShcbiAgICAgIHBhY2thZ2VKc29uRGF0YSxcbiAgICAgIG9taXRCeShcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtaXNzaW5nIGZpZWxkczogYXV0aG9yIGFuZCBsaWNlbnNlXG4gICAgICAgIHBpY2sob3B0aW9ucywgWyduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ2F1dGhvcicsICdsaWNlbnNlJ10pLFxuICAgICAgICBpc05pbCxcbiAgICAgICksXG4gICAgKSxcbiAgICB7XG4gICAgICBuYXBpOiBvbWl0QnkoXG4gICAgICAgIHtcbiAgICAgICAgICBiaW5hcnlOYW1lOiBvcHRpb25zLmJpbmFyeU5hbWUsXG4gICAgICAgICAgcGFja2FnZU5hbWU6IG9wdGlvbnMucGFja2FnZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGlzTmlsLFxuICAgICAgKSxcbiAgICB9LFxuICApXG5cbiAgaWYgKG9wdGlvbnMuY29uZmlnUGF0aCkge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLmNvbmZpZ1BhdGgpXG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlQXN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKVxuICAgIGNvbnN0IGNvbmZpZ0RhdGEgPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpXG4gICAgY29uZmlnRGF0YS5iaW5hcnlOYW1lID0gb3B0aW9ucy5iaW5hcnlOYW1lXG4gICAgY29uZmlnRGF0YS5wYWNrYWdlTmFtZSA9IG9wdGlvbnMucGFja2FnZU5hbWVcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWdEYXRhLCBudWxsLCAyKSlcbiAgfVxuXG4gIGF3YWl0IHdyaXRlRmlsZUFzeW5jKFxuICAgIHBhY2thZ2VKc29uUGF0aCxcbiAgICBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbkRhdGEsIG51bGwsIDIpLFxuICApXG5cbiAgY29uc3QgdG9tbENvbnRlbnQgPSBhd2FpdCByZWFkRmlsZUFzeW5jKGNhcmdvVG9tbFBhdGgsICd1dGY4JylcbiAgY29uc3QgY2FyZ29Ub21sID0gcGFyc2VUb21sKHRvbWxDb250ZW50KSBhcyBhbnlcblxuICAvLyBVcGRhdGUgdGhlIHBhY2thZ2UgbmFtZVxuICBpZiAoY2FyZ29Ub21sLnBhY2thZ2UgJiYgb3B0aW9ucy5iaW5hcnlOYW1lKSB7XG4gICAgLy8gU2FuaXRpemUgdGhlIGJpbmFyeSBuYW1lIGZvciBSdXN0IHBhY2thZ2UgbmFtaW5nIGNvbnZlbnRpb25zXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IG9wdGlvbnMuYmluYXJ5TmFtZVxuICAgICAgLnJlcGxhY2UoJ0AnLCAnJylcbiAgICAgIC5yZXBsYWNlKCcvJywgJ18nKVxuICAgICAgLnJlcGxhY2UoLy0vZywgJ18nKVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICBjYXJnb1RvbWwucGFja2FnZS5uYW1lID0gc2FuaXRpemVkTmFtZVxuICB9XG5cbiAgLy8gU3RyaW5naWZ5IHRoZSB1cGRhdGVkIFRPTUxcbiAgY29uc3QgdXBkYXRlZFRvbWxDb250ZW50ID0gc3RyaW5naWZ5VG9tbChjYXJnb1RvbWwpXG5cbiAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoY2FyZ29Ub21sUGF0aCwgdXBkYXRlZFRvbWxDb250ZW50KVxuICBpZiAob2xkTmFtZSAhPT0gb3B0aW9ucy5iaW5hcnlOYW1lKSB7XG4gICAgY29uc3QgZ2l0aHViQWN0aW9uc1BhdGggPSBhd2FpdCBmaW5kVXAoJy5naXRodWInLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgdHlwZTogJ2RpcmVjdG9yeScsXG4gICAgfSlcbiAgICBpZiAoZ2l0aHViQWN0aW9uc1BhdGgpIHtcbiAgICAgIGNvbnN0IGdpdGh1YkFjdGlvbnNDSVltbFBhdGggPSBqb2luKFxuICAgICAgICBnaXRodWJBY3Rpb25zUGF0aCxcbiAgICAgICAgJ3dvcmtmbG93cycsXG4gICAgICAgICdDSS55bWwnLFxuICAgICAgKVxuICAgICAgaWYgKGV4aXN0c1N5bmMoZ2l0aHViQWN0aW9uc0NJWW1sUGF0aCkpIHtcbiAgICAgICAgY29uc3QgZ2l0aHViQWN0aW9uc0NvbnRlbnQgPSBhd2FpdCByZWFkRmlsZUFzeW5jKFxuICAgICAgICAgIGdpdGh1YkFjdGlvbnNDSVltbFBhdGgsXG4gICAgICAgICAgJ3V0ZjgnLFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGdpdGh1YkFjdGlvbnNEYXRhID0geWFtbFBhcnNlKGdpdGh1YkFjdGlvbnNDb250ZW50KSBhcyBhbnlcbiAgICAgICAgaWYgKGdpdGh1YkFjdGlvbnNEYXRhLmVudj8uQVBQX05BTUUpIHtcbiAgICAgICAgICBnaXRodWJBY3Rpb25zRGF0YS5lbnYuQVBQX05BTUUgPSBvcHRpb25zLmJpbmFyeU5hbWVcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgICAgICAgIGdpdGh1YkFjdGlvbnNDSVltbFBhdGgsXG4gICAgICAgICAgICB5YW1sU3RyaW5naWZ5KGdpdGh1YkFjdGlvbnNEYXRhLCB7XG4gICAgICAgICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgICAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgICAgICAgICAgc29ydEtleXM6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG9sZFdhc2lCcm93c2VyQmluZGluZ1BhdGggPSBqb2luKFxuICAgICAgb3B0aW9ucy5jd2QsXG4gICAgICBgJHtvbGROYW1lfS53YXNpLWJyb3dzZXIuanNgLFxuICAgIClcbiAgICBpZiAoZXhpc3RzU3luYyhvbGRXYXNpQnJvd3NlckJpbmRpbmdQYXRoKSkge1xuICAgICAgYXdhaXQgcmVuYW1lKFxuICAgICAgICBvbGRXYXNpQnJvd3NlckJpbmRpbmdQYXRoLFxuICAgICAgICBqb2luKG9wdGlvbnMuY3dkLCBgJHtvcHRpb25zLmJpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2ApLFxuICAgICAgKVxuICAgIH1cbiAgICBjb25zdCBvbGRXYXNpQmluZGluZ1BhdGggPSBqb2luKG9wdGlvbnMuY3dkLCBgJHtvbGROYW1lfS53YXNpLmNqc2ApXG4gICAgaWYgKGV4aXN0c1N5bmMob2xkV2FzaUJpbmRpbmdQYXRoKSkge1xuICAgICAgYXdhaXQgcmVuYW1lKFxuICAgICAgICBvbGRXYXNpQmluZGluZ1BhdGgsXG4gICAgICAgIGpvaW4ob3B0aW9ucy5jd2QsIGAke29wdGlvbnMuYmluYXJ5TmFtZX0ud2FzaS5janNgKSxcbiAgICAgIClcbiAgICB9XG4gICAgY29uc3QgZ2l0QXR0cmlidXRlc1BhdGggPSBqb2luKG9wdGlvbnMuY3dkLCAnLmdpdGF0dHJpYnV0ZXMnKVxuICAgIGlmIChleGlzdHNTeW5jKGdpdEF0dHJpYnV0ZXNQYXRoKSkge1xuICAgICAgY29uc3QgZ2l0QXR0cmlidXRlc0NvbnRlbnQgPSBhd2FpdCByZWFkRmlsZUFzeW5jKFxuICAgICAgICBnaXRBdHRyaWJ1dGVzUGF0aCxcbiAgICAgICAgJ3V0ZjgnLFxuICAgICAgKVxuICAgICAgY29uc3QgZ2l0QXR0cmlidXRlc0RhdGEgPSBnaXRBdHRyaWJ1dGVzQ29udGVudFxuICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgICByZXR1cm4gbGluZVxuICAgICAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgICAgIGAke29sZE5hbWV9Lndhc2ktYnJvd3Nlci5qc2AsXG4gICAgICAgICAgICAgIGAke29wdGlvbnMuYmluYXJ5TmFtZX0ud2FzaS1icm93c2VyLmpzYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZXBsYWNlKGAke29sZE5hbWV9Lndhc2kuY2pzYCwgYCR7b3B0aW9ucy5iaW5hcnlOYW1lfS53YXNpLmNqc2ApXG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoZ2l0QXR0cmlidXRlc1BhdGgsIGdpdEF0dHJpYnV0ZXNEYXRhKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZXhlYywgZXhlY1N5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuXG5pbXBvcnQgeyBsb2FkIGFzIHlhbWxMb2FkLCBkdW1wIGFzIHlhbWxEdW1wIH0gZnJvbSAnanMteWFtbCdcblxuaW1wb3J0IHtcbiAgYXBwbHlEZWZhdWx0TmV3T3B0aW9ucyxcbiAgTmV3T3B0aW9ucyBhcyBSYXdOZXdPcHRpb25zLFxufSBmcm9tICcuLi9kZWYvbmV3LmpzJ1xuaW1wb3J0IHtcbiAgQVZBSUxBQkxFX1RBUkdFVFMsXG4gIGRlYnVnRmFjdG9yeSxcbiAgREVGQVVMVF9UQVJHRVRTLFxuICBta2RpckFzeW5jLFxuICByZWFkZGlyQXN5bmMsXG4gIHN0YXRBc3luYyxcbiAgU3VwcG9ydGVkUGFja2FnZU1hbmFnZXIsXG59IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuaW1wb3J0IHsgbmFwaUVuZ2luZVJlcXVpcmVtZW50IH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcydcbmltcG9ydCB7IHJlbmFtZVByb2plY3QgfSBmcm9tICcuL3JlbmFtZS5qcydcblxuLy8gVGVtcGxhdGUgaW1wb3J0cyByZW1vdmVkIGFzIHdlJ3JlIG5vdyB1c2luZyBleHRlcm5hbCB0ZW1wbGF0ZXNcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0ZhY3RvcnkoJ25ldycpXG5cbnR5cGUgTmV3T3B0aW9ucyA9IFJlcXVpcmVkPFJhd05ld09wdGlvbnM+XG5cbmNvbnN0IFRFTVBMQVRFX1JFUE9TID0ge1xuICB5YXJuOiAnaHR0cHM6Ly9naXRodWIuY29tL25hcGktcnMvcGFja2FnZS10ZW1wbGF0ZScsXG4gIHBucG06ICdodHRwczovL2dpdGh1Yi5jb20vbmFwaS1ycy9wYWNrYWdlLXRlbXBsYXRlLXBucG0nLFxufSBhcyBjb25zdFxuXG5hc3luYyBmdW5jdGlvbiBjaGVja0dpdENvbW1hbmQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGNwID0gZXhlYygnZ2l0IC0tdmVyc2lvbicpXG4gICAgICBjcC5vbignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICB9KVxuICAgICAgY3Aub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgcmV0dXJuIHRydWVcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ2FjaGVEaXIoXG4gIHBhY2thZ2VNYW5hZ2VyOiBTdXBwb3J0ZWRQYWNrYWdlTWFuYWdlcixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlRGlyID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5uYXBpLXJzJywgJ3RlbXBsYXRlJywgcGFja2FnZU1hbmFnZXIpXG4gIGF3YWl0IG1rZGlyQXN5bmMoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gIHJldHVybiBjYWNoZURpclxufVxuXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZFRlbXBsYXRlKFxuICBwYWNrYWdlTWFuYWdlcjogU3VwcG9ydGVkUGFja2FnZU1hbmFnZXIsXG4gIGNhY2hlRGlyOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb1VybCA9IFRFTVBMQVRFX1JFUE9TW3BhY2thZ2VNYW5hZ2VyXVxuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4oY2FjaGVEaXIsICdyZXBvJylcblxuICBpZiAoZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgZGVidWcoYFRlbXBsYXRlIGNhY2hlIGZvdW5kIGF0ICR7dGVtcGxhdGVQYXRofSwgdXBkYXRpbmcuLi5gKVxuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBsYXRlc3QgY2hhbmdlcyBhbmQgcmVzZXQgdG8gcmVtb3RlXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNwID0gZXhlYygnZ2l0IGZldGNoIG9yaWdpbicsIHsgY3dkOiB0ZW1wbGF0ZVBhdGggfSlcbiAgICAgICAgY3Aub24oJ2Vycm9yJywgcmVqZWN0KVxuICAgICAgICBjcC5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGZldGNoIGxhdGVzdCBjaGFuZ2VzLCBnaXQgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICBleGVjU3luYygnZ2l0IHJlc2V0IC0taGFyZCBvcmlnaW4vbWFpbicsIHtcbiAgICAgICAgY3dkOiB0ZW1wbGF0ZVBhdGgsXG4gICAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICAgIH0pXG4gICAgICBkZWJ1ZygnVGVtcGxhdGUgdXBkYXRlZCBzdWNjZXNzZnVsbHknKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBkZWJ1ZyhgRmFpbGVkIHRvIHVwZGF0ZSB0ZW1wbGF0ZTogJHtlcnJvcn1gKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gdXBkYXRlIHRlbXBsYXRlIGZyb20gJHtyZXBvVXJsfTogJHtlcnJvcn1gKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWJ1ZyhgQ2xvbmluZyB0ZW1wbGF0ZSBmcm9tICR7cmVwb1VybH0uLi5gKVxuICAgIHRyeSB7XG4gICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7cmVwb1VybH0gcmVwb2AsIHsgY3dkOiBjYWNoZURpciwgc3RkaW86ICdpbmhlcml0JyB9KVxuICAgICAgZGVidWcoJ1RlbXBsYXRlIGNsb25lZCBzdWNjZXNzZnVsbHknKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjbG9uZSB0ZW1wbGF0ZSBmcm9tICR7cmVwb1VybH06ICR7ZXJyb3J9YClcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weURpcmVjdG9yeShcbiAgc3JjOiBzdHJpbmcsXG4gIGRlc3Q6IHN0cmluZyxcbiAgaW5jbHVkZVdhc2lCaW5kaW5nczogYm9vbGVhbixcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2RpckFzeW5jKGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHNyYywgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihzcmMsIGVudHJ5Lm5hbWUpXG4gICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdCwgZW50cnkubmFtZSlcblxuICAgIC8vIFNraXAgLmdpdCBkaXJlY3RvcnlcbiAgICBpZiAoZW50cnkubmFtZSA9PT0gJy5naXQnKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCBjb3B5RGlyZWN0b3J5KHNyY1BhdGgsIGRlc3RQYXRoLCBpbmNsdWRlV2FzaUJpbmRpbmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgICFpbmNsdWRlV2FzaUJpbmRpbmdzICYmXG4gICAgICAgIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcud2FzaS1icm93c2VyLmpzJykgfHxcbiAgICAgICAgICBlbnRyeS5uYW1lLmVuZHNXaXRoKCcud2FzaS5janMnKSB8fFxuICAgICAgICAgIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJ3dhc2ktd29ya2VyLmJyb3dzZXIubWpzICcpIHx8XG4gICAgICAgICAgZW50cnkubmFtZS5lbmRzV2l0aCgnd2FzaS13b3JrZXIubWpzJykgfHxcbiAgICAgICAgICBlbnRyeS5uYW1lLmVuZHNXaXRoKCdicm93c2VyLmpzJykpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKHNyY1BhdGgsIGRlc3RQYXRoKVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaWx0ZXJUYXJnZXRzSW5QYWNrYWdlSnNvbihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZW5hYmxlZFRhcmdldHM6IHN0cmluZ1tdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04JylcbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGNvbnRlbnQpXG5cbiAgLy8gRmlsdGVyIG5hcGkudGFyZ2V0c1xuICBpZiAocGFja2FnZUpzb24ubmFwaT8udGFyZ2V0cykge1xuICAgIHBhY2thZ2VKc29uLm5hcGkudGFyZ2V0cyA9IHBhY2thZ2VKc29uLm5hcGkudGFyZ2V0cy5maWx0ZXIoXG4gICAgICAodGFyZ2V0OiBzdHJpbmcpID0+IGVuYWJsZWRUYXJnZXRzLmluY2x1ZGVzKHRhcmdldCksXG4gICAgKVxuICB9XG5cbiAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgMikgKyAnXFxuJylcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmlsdGVyVGFyZ2V0c0luR2l0aHViQWN0aW9ucyhcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZW5hYmxlZFRhcmdldHM6IHN0cmluZ1tdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04JylcbiAgY29uc3QgeWFtbCA9IHlhbWxMb2FkKGNvbnRlbnQpIGFzIGFueVxuXG4gIGNvbnN0IG1hY09TQW5kV2luZG93c1RhcmdldHMgPSBuZXcgU2V0KFtcbiAgICAneDg2XzY0LXBjLXdpbmRvd3MtbXN2YycsXG4gICAgJ2FhcmNoNjQtcGMtd2luZG93cy1tc3ZjJyxcbiAgICAneDg2XzY0LWFwcGxlLWRhcndpbicsXG4gIF0pXG5cbiAgY29uc3QgbGludXhUYXJnZXRzID0gbmV3IFNldChbXG4gICAgJ3g4Nl82NC11bmtub3duLWxpbnV4LWdudScsXG4gICAgJ3g4Nl82NC11bmtub3duLWxpbnV4LW11c2wnLFxuICAgICdhYXJjaDY0LXVua25vd24tbGludXgtZ251JyxcbiAgICAnYWFyY2g2NC11bmtub3duLWxpbnV4LW11c2wnLFxuICAgICdhcm12Ny11bmtub3duLWxpbnV4LWdudWVhYmloZicsXG4gICAgJ2FybXY3LXVua25vd24tbGludXgtbXVzbGVhYmloZicsXG4gICAgJ3Jpc2N2NjRnYy11bmtub3duLWxpbnV4LWdudScsXG4gICAgJ3Bvd2VycGM2NGxlLXVua25vd24tbGludXgtZ251JyxcbiAgICAnczM5MHgtdW5rbm93bi1saW51eC1nbnUnLFxuICAgICdhYXJjaDY0LWxpbnV4LWFuZHJvaWQnLFxuICAgICdhcm12Ny1saW51eC1hbmRyb2lkZWFiaScsXG4gIF0pXG5cbiAgLy8gQ2hlY2sgaWYgYW55IExpbnV4IHRhcmdldHMgYXJlIGVuYWJsZWRcbiAgY29uc3QgaGFzTGludXhUYXJnZXRzID0gZW5hYmxlZFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PlxuICAgIGxpbnV4VGFyZ2V0cy5oYXModGFyZ2V0KSxcbiAgKVxuXG4gIC8vIEZpbHRlciB0aGUgbWF0cml4IGNvbmZpZ3VyYXRpb25zIGluIHRoZSBidWlsZCBqb2JcbiAgaWYgKHlhbWw/LmpvYnM/LmJ1aWxkPy5zdHJhdGVneT8ubWF0cml4Py5zZXR0aW5ncykge1xuICAgIHlhbWwuam9icy5idWlsZC5zdHJhdGVneS5tYXRyaXguc2V0dGluZ3MgPVxuICAgICAgeWFtbC5qb2JzLmJ1aWxkLnN0cmF0ZWd5Lm1hdHJpeC5zZXR0aW5ncy5maWx0ZXIoKHNldHRpbmc6IGFueSkgPT4ge1xuICAgICAgICBpZiAoc2V0dGluZy50YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gZW5hYmxlZFRhcmdldHMuaW5jbHVkZXMoc2V0dGluZy50YXJnZXQpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gIH1cblxuICBjb25zdCBqb2JzVG9SZW1vdmU6IHN0cmluZ1tdID0gW11cblxuICBpZiAoZW5hYmxlZFRhcmdldHMuZXZlcnkoKHRhcmdldCkgPT4gIW1hY09TQW5kV2luZG93c1RhcmdldHMuaGFzKHRhcmdldCkpKSB7XG4gICAgam9ic1RvUmVtb3ZlLnB1c2goJ3Rlc3QtbWFjT1Mtd2luZG93cy1iaW5kaW5nJylcbiAgfSBlbHNlIHtcbiAgICAvLyBGaWx0ZXIgdGhlIG1hdHJpeCBjb25maWd1cmF0aW9ucyBpbiB0aGUgdGVzdC1tYWNPUy13aW5kb3dzLWJpbmRpbmcgam9iXG4gICAgaWYgKFxuICAgICAgeWFtbD8uam9icz8uWyd0ZXN0LW1hY09TLXdpbmRvd3MtYmluZGluZyddPy5zdHJhdGVneT8ubWF0cml4Py5zZXR0aW5nc1xuICAgICkge1xuICAgICAgeWFtbC5qb2JzWyd0ZXN0LW1hY09TLXdpbmRvd3MtYmluZGluZyddLnN0cmF0ZWd5Lm1hdHJpeC5zZXR0aW5ncyA9XG4gICAgICAgIHlhbWwuam9ic1sndGVzdC1tYWNPUy13aW5kb3dzLWJpbmRpbmcnXS5zdHJhdGVneS5tYXRyaXguc2V0dGluZ3MuZmlsdGVyKFxuICAgICAgICAgIChzZXR0aW5nOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLnRhcmdldCkge1xuICAgICAgICAgICAgICByZXR1cm4gZW5hYmxlZFRhcmdldHMuaW5jbHVkZXMoc2V0dGluZy50YXJnZXQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICB9XG4gIH1cblxuICAvLyBJZiBubyBMaW51eCB0YXJnZXRzIGFyZSBlbmFibGVkLCByZW1vdmUgTGludXgtc3BlY2lmaWMgam9ic1xuICBpZiAoIWhhc0xpbnV4VGFyZ2V0cykge1xuICAgIC8vIFJlbW92ZSB0ZXN0LWxpbnV4LWJpbmRpbmcgam9iXG4gICAgaWYgKHlhbWw/LmpvYnM/LlsndGVzdC1saW51eC1iaW5kaW5nJ10pIHtcbiAgICAgIGpvYnNUb1JlbW92ZS5wdXNoKCd0ZXN0LWxpbnV4LWJpbmRpbmcnKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBGaWx0ZXIgdGhlIG1hdHJpeCBjb25maWd1cmF0aW9ucyBpbiB0aGUgdGVzdC1saW51eC14NjQtZ251LWJpbmRpbmcgam9iXG4gICAgaWYgKHlhbWw/LmpvYnM/LlsndGVzdC1saW51eC1iaW5kaW5nJ10/LnN0cmF0ZWd5Py5tYXRyaXg/LnRhcmdldCkge1xuICAgICAgeWFtbC5qb2JzWyd0ZXN0LWxpbnV4LWJpbmRpbmcnXS5zdHJhdGVneS5tYXRyaXgudGFyZ2V0ID0geWFtbC5qb2JzW1xuICAgICAgICAndGVzdC1saW51eC1iaW5kaW5nJ1xuICAgICAgXS5zdHJhdGVneS5tYXRyaXgudGFyZ2V0LmZpbHRlcigodGFyZ2V0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIHJldHVybiBlbmFibGVkVGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKCFlbmFibGVkVGFyZ2V0cy5pbmNsdWRlcygnd2FzbTMyLXdhc2lwMS10aHJlYWRzJykpIHtcbiAgICBqb2JzVG9SZW1vdmUucHVzaCgndGVzdC13YXNpJylcbiAgfVxuXG4gIGlmICghZW5hYmxlZFRhcmdldHMuaW5jbHVkZXMoJ3g4Nl82NC11bmtub3duLWZyZWVic2QnKSkge1xuICAgIGpvYnNUb1JlbW92ZS5wdXNoKCdidWlsZC1mcmVlYnNkJylcbiAgfVxuXG4gIC8vIEZpbHRlciBvdGhlciB0ZXN0IGpvYnMgYmFzZWQgb24gdGFyZ2V0XG4gIGZvciAoY29uc3QgW2pvYk5hbWUsIGpvYkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoeWFtbC5qb2JzIHx8IHt9KSkge1xuICAgIGlmIChcbiAgICAgIGpvYk5hbWUuc3RhcnRzV2l0aCgndGVzdC0nKSAmJlxuICAgICAgam9iTmFtZSAhPT0gJ3Rlc3QtbWFjT1Mtd2luZG93cy1iaW5kaW5nJyAmJlxuICAgICAgam9iTmFtZSAhPT0gJ3Rlc3QtbGludXgteDY0LWdudS1iaW5kaW5nJ1xuICAgICkge1xuICAgICAgLy8gRXh0cmFjdCB0YXJnZXQgZnJvbSBqb2IgbmFtZSBvciBjb25maWdcbiAgICAgIGNvbnN0IGpvYiA9IGpvYkNvbmZpZyBhcyBhbnlcbiAgICAgIGlmIChqb2Iuc3RyYXRlZ3k/Lm1hdHJpeD8uc2V0dGluZ3M/LlswXT8udGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGpvYi5zdHJhdGVneS5tYXRyaXguc2V0dGluZ3NbMF0udGFyZ2V0XG4gICAgICAgIGlmICghZW5hYmxlZFRhcmdldHMuaW5jbHVkZXModGFyZ2V0KSkge1xuICAgICAgICAgIGpvYnNUb1JlbW92ZS5wdXNoKGpvYk5hbWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgam9icyBmb3IgZGlzYWJsZWQgdGFyZ2V0c1xuICBmb3IgKGNvbnN0IGpvYk5hbWUgb2Ygam9ic1RvUmVtb3ZlKSB7XG4gICAgZGVsZXRlIHlhbWwuam9ic1tqb2JOYW1lXVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoeWFtbC5qb2JzPy5wdWJsaXNoPy5uZWVkcykpIHtcbiAgICB5YW1sLmpvYnMucHVibGlzaC5uZWVkcyA9IHlhbWwuam9icy5wdWJsaXNoLm5lZWRzLmZpbHRlcihcbiAgICAgIChuZWVkOiBzdHJpbmcpID0+ICFqb2JzVG9SZW1vdmUuaW5jbHVkZXMobmVlZCksXG4gICAgKVxuICB9XG5cbiAgLy8gV3JpdGUgYmFjayB0aGUgZmlsdGVyZWQgWUFNTFxuICBjb25zdCB1cGRhdGVkWWFtbCA9IHlhbWxEdW1wKHlhbWwsIHtcbiAgICBsaW5lV2lkdGg6IC0xLFxuICAgIG5vUmVmczogdHJ1ZSxcbiAgICBzb3J0S2V5czogZmFsc2UsXG4gIH0pXG4gIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgdXBkYXRlZFlhbWwpXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NPcHRpb25zKG9wdGlvbnM6IFJhd05ld09wdGlvbnMpIHtcbiAgZGVidWcoJ1Byb2Nlc3Npbmcgb3B0aW9ucy4uLicpXG4gIGlmICghb3B0aW9ucy5wYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSB0aGUgcGF0aCBhcyB0aGUgYXJndW1lbnQnKVxuICB9XG4gIG9wdGlvbnMucGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvcHRpb25zLnBhdGgpXG4gIGRlYnVnKGBSZXNvbHZlZCB0YXJnZXQgcGF0aCB0bzogJHtvcHRpb25zLnBhdGh9YClcblxuICBpZiAoIW9wdGlvbnMubmFtZSkge1xuICAgIG9wdGlvbnMubmFtZSA9IHBhdGgucGFyc2Uob3B0aW9ucy5wYXRoKS5iYXNlXG4gICAgZGVidWcoYE5vIHByb2plY3QgbmFtZSBwcm92aWRlZCwgZml4IGl0IHRvIGRpciBuYW1lOiAke29wdGlvbnMubmFtZX1gKVxuICB9XG5cbiAgaWYgKCFvcHRpb25zLnRhcmdldHM/Lmxlbmd0aCkge1xuICAgIGlmIChvcHRpb25zLmVuYWJsZUFsbFRhcmdldHMpIHtcbiAgICAgIG9wdGlvbnMudGFyZ2V0cyA9IEFWQUlMQUJMRV9UQVJHRVRTLmNvbmNhdCgpXG4gICAgICBkZWJ1ZygnRW5hYmxlIGFsbCB0YXJnZXRzJylcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZW5hYmxlRGVmYXVsdFRhcmdldHMpIHtcbiAgICAgIG9wdGlvbnMudGFyZ2V0cyA9IERFRkFVTFRfVEFSR0VUUy5jb25jYXQoKVxuICAgICAgZGVidWcoJ0VuYWJsZSBkZWZhdWx0IHRhcmdldHMnKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0IGxlYXN0IG9uZSB0YXJnZXQgbXVzdCBiZSBlbmFibGVkJylcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIG9wdGlvbnMudGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldCA9PT0gJ3dhc20zMi13YXNpLXByZXZpZXcxLXRocmVhZHMnKVxuICApIHtcbiAgICBjb25zdCBvdXQgPSBleGVjU3luYyhgcnVzdHVwIHRhcmdldCBsaXN0YCwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KVxuICAgIGlmIChvdXQuaW5jbHVkZXMoJ3dhc20zMi13YXNpcDEtdGhyZWFkcycpKSB7XG4gICAgICBvcHRpb25zLnRhcmdldHMgPSBvcHRpb25zLnRhcmdldHMubWFwKCh0YXJnZXQpID0+XG4gICAgICAgIHRhcmdldCA9PT0gJ3dhc20zMi13YXNpLXByZXZpZXcxLXRocmVhZHMnXG4gICAgICAgICAgPyAnd2FzbTMyLXdhc2lwMS10aHJlYWRzJ1xuICAgICAgICAgIDogdGFyZ2V0LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcHBseURlZmF1bHROZXdPcHRpb25zKG9wdGlvbnMpIGFzIE5ld09wdGlvbnNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5ld1Byb2plY3QodXNlck9wdGlvbnM6IFJhd05ld09wdGlvbnMpIHtcbiAgZGVidWcoJ1dpbGwgY3JlYXRlIG5hcGktcnMgcHJvamVjdCB3aXRoIGdpdmVuIG9wdGlvbnM6JylcbiAgZGVidWcodXNlck9wdGlvbnMpXG5cbiAgY29uc3Qgb3B0aW9ucyA9IHByb2Nlc3NPcHRpb25zKHVzZXJPcHRpb25zKVxuXG4gIGRlYnVnKCdUYXJnZXRzIHRvIGJlIGVuYWJsZWQ6JylcbiAgZGVidWcob3B0aW9ucy50YXJnZXRzKVxuXG4gIC8vIENoZWNrIGlmIGdpdCBpcyBhdmFpbGFibGVcbiAgaWYgKCEoYXdhaXQgY2hlY2tHaXRDb21tYW5kKCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0dpdCBpcyBub3QgaW5zdGFsbGVkIG9yIG5vdCBhdmFpbGFibGUgaW4gUEFUSC4gUGxlYXNlIGluc3RhbGwgR2l0IHRvIGNvbnRpbnVlLicsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBvcHRpb25zLnBhY2thZ2VNYW5hZ2VyIGFzIFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2VyXG5cbiAgLy8gRW5zdXJlIHRhcmdldCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBpcyBlbXB0eVxuICBhd2FpdCBlbnN1cmVQYXRoKG9wdGlvbnMucGF0aCwgb3B0aW9ucy5kcnlSdW4pXG5cbiAgaWYgKCFvcHRpb25zLmRyeVJ1bikge1xuICAgIHRyeSB7XG4gICAgICAvLyBEb3dubG9hZCBvciB1cGRhdGUgdGVtcGxhdGVcbiAgICAgIGNvbnN0IGNhY2hlRGlyID0gYXdhaXQgZW5zdXJlQ2FjaGVEaXIocGFja2FnZU1hbmFnZXIpXG4gICAgICBhd2FpdCBkb3dubG9hZFRlbXBsYXRlKHBhY2thZ2VNYW5hZ2VyLCBjYWNoZURpcilcblxuICAgICAgLy8gQ29weSB0ZW1wbGF0ZSBmaWxlcyB0byB0YXJnZXQgZGlyZWN0b3J5XG4gICAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4oY2FjaGVEaXIsICdyZXBvJylcbiAgICAgIGF3YWl0IGNvcHlEaXJlY3RvcnkoXG4gICAgICAgIHRlbXBsYXRlUGF0aCxcbiAgICAgICAgb3B0aW9ucy5wYXRoLFxuICAgICAgICBvcHRpb25zLnRhcmdldHMuaW5jbHVkZXMoJ3dhc20zMi13YXNpcDEtdGhyZWFkcycpLFxuICAgICAgKVxuXG4gICAgICAvLyBSZW5hbWUgcHJvamVjdCB1c2luZyB0aGUgcmVuYW1lIEFQSVxuICAgICAgYXdhaXQgcmVuYW1lUHJvamVjdCh7XG4gICAgICAgIGN3ZDogb3B0aW9ucy5wYXRoLFxuICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgIGJpbmFyeU5hbWU6IGdldEJpbmFyeU5hbWUob3B0aW9ucy5uYW1lKSxcbiAgICAgIH0pXG5cbiAgICAgIC8vIEZpbHRlciB0YXJnZXRzIGluIHBhY2thZ2UuanNvblxuICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKG9wdGlvbnMucGF0aCwgJ3BhY2thZ2UuanNvbicpXG4gICAgICBpZiAoZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICAgIGF3YWl0IGZpbHRlclRhcmdldHNJblBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCwgb3B0aW9ucy50YXJnZXRzKVxuICAgICAgfVxuXG4gICAgICAvLyBGaWx0ZXIgdGFyZ2V0cyBpbiBHaXRIdWIgQWN0aW9ucyBDSVxuICAgICAgY29uc3QgY2lQYXRoID0gcGF0aC5qb2luKG9wdGlvbnMucGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJywgJ0NJLnltbCcpXG4gICAgICBpZiAoZXhpc3RzU3luYyhjaVBhdGgpICYmIG9wdGlvbnMuZW5hYmxlR2l0aHViQWN0aW9ucykge1xuICAgICAgICBhd2FpdCBmaWx0ZXJUYXJnZXRzSW5HaXRodWJBY3Rpb25zKGNpUGF0aCwgb3B0aW9ucy50YXJnZXRzKVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIW9wdGlvbnMuZW5hYmxlR2l0aHViQWN0aW9ucyAmJlxuICAgICAgICBleGlzdHNTeW5jKHBhdGguam9pbihvcHRpb25zLnBhdGgsICcuZ2l0aHViJykpXG4gICAgICApIHtcbiAgICAgICAgLy8gUmVtb3ZlIC5naXRodWIgZGlyZWN0b3J5IGlmIEdpdEh1YiBBY3Rpb25zIGlzIG5vdCBlbmFibGVkXG4gICAgICAgIGF3YWl0IGZzLnJtKHBhdGguam9pbihvcHRpb25zLnBhdGgsICcuZ2l0aHViJyksIHtcbiAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBwYWNrYWdlLmpzb24gd2l0aCBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25zXG4gICAgICBjb25zdCBwa2dKc29uQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04JylcbiAgICAgIGNvbnN0IHBrZ0pzb24gPSBKU09OLnBhcnNlKHBrZ0pzb25Db250ZW50KVxuXG4gICAgICAvLyBVcGRhdGUgZW5naW5lIHJlcXVpcmVtZW50XG4gICAgICBpZiAoIXBrZ0pzb24uZW5naW5lcykge1xuICAgICAgICBwa2dKc29uLmVuZ2luZXMgPSB7fVxuICAgICAgfVxuICAgICAgcGtnSnNvbi5lbmdpbmVzLm5vZGUgPSBuYXBpRW5naW5lUmVxdWlyZW1lbnQob3B0aW9ucy5taW5Ob2RlQXBpVmVyc2lvbilcblxuICAgICAgLy8gVXBkYXRlIGxpY2Vuc2UgaWYgZGlmZmVyZW50IGZyb20gdGVtcGxhdGVcbiAgICAgIGlmIChvcHRpb25zLmxpY2Vuc2UgJiYgcGtnSnNvbi5saWNlbnNlICE9PSBvcHRpb25zLmxpY2Vuc2UpIHtcbiAgICAgICAgcGtnSnNvbi5saWNlbnNlID0gb3B0aW9ucy5saWNlbnNlXG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0ZXN0IGZyYW1ld29yayBpZiBuZWVkZWRcbiAgICAgIGlmIChvcHRpb25zLnRlc3RGcmFtZXdvcmsgIT09ICdhdmEnKSB7XG4gICAgICAgIC8vIFRoaXMgd291bGQgcmVxdWlyZSBtb3JlIGNvbXBsZXggbG9naWMgdG8gdXBkYXRlIHRlc3Qgc2NyaXB0cyBhbmQgZGVwZW5kZW5jaWVzXG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGBUZXN0IGZyYW1ld29yayAke29wdGlvbnMudGVzdEZyYW1ld29ya30gcmVxdWVzdGVkIGJ1dCBub3QgeWV0IGltcGxlbWVudGVkYCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgICAgIHBhY2thZ2VKc29uUGF0aCxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocGtnSnNvbiwgbnVsbCwgMikgKyAnXFxuJyxcbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHByb2plY3Q6ICR7ZXJyb3J9YClcbiAgICB9XG4gIH1cblxuICBkZWJ1ZyhgUHJvamVjdCBjcmVhdGVkIGF0OiAke29wdGlvbnMucGF0aH1gKVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVQYXRoKHBhdGg6IHN0cmluZywgZHJ5UnVuID0gZmFsc2UpIHtcbiAgY29uc3Qgc3RhdCA9IGF3YWl0IHN0YXRBc3luYyhwYXRoLCB7fSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKVxuXG4gIC8vIGZpbGUgZGVzY3JpcHRvciBleGlzdHNcbiAgaWYgKHN0YXQpIHtcbiAgICBpZiAoc3RhdC5pc0ZpbGUoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUGF0aCAke3BhdGh9IGZvciBjcmVhdGluZyBuZXcgbmFwaS1ycyBwcm9qZWN0IGFscmVhZHkgZXhpc3RzIGFuZCBpdCdzIG5vdCBhIGRpcmVjdG9yeS5gLFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlYWRkaXJBc3luYyhwYXRoKVxuICAgICAgaWYgKGZpbGVzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhdGggJHtwYXRofSBmb3IgY3JlYXRpbmcgbmV3IG5hcGktcnMgcHJvamVjdCBhbHJlYWR5IGV4aXN0cyBhbmQgaXQncyBub3QgZW1wdHkuYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghZHJ5UnVuKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRlYnVnKGBUcnkgdG8gY3JlYXRlIHRhcmdldCBkaXJlY3Rvcnk6ICR7cGF0aH1gKVxuICAgICAgaWYgKCFkcnlSdW4pIHtcbiAgICAgICAgYXdhaXQgbWtkaXJBc3luYyhwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSB0YXJnZXQgZGlyZWN0b3J5OiAke3BhdGh9YCwge1xuICAgICAgICBjYXVzZTogZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEJpbmFyeU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWUuc3BsaXQoJy8nKS5wb3AoKSFcbn1cblxuZXhwb3J0IHsgTmV3T3B0aW9ucyB9XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCB7IGlucHV0LCBzZWxlY3QsIGNoZWNrYm94LCBjb25maXJtIH0gZnJvbSAnQGlucXVpcmVyL3Byb21wdHMnXG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICdjbGlwYW5pb24nXG5cbmltcG9ydCB7IG5ld1Byb2plY3QgfSBmcm9tICcuLi9hcGkvbmV3LmpzJ1xuaW1wb3J0IHsgQmFzZU5ld0NvbW1hbmQgfSBmcm9tICcuLi9kZWYvbmV3LmpzJ1xuaW1wb3J0IHtcbiAgQVZBSUxBQkxFX1RBUkdFVFMsXG4gIGRlYnVnRmFjdG9yeSxcbiAgREVGQVVMVF9UQVJHRVRTLFxuICBUYXJnZXRUcmlwbGUsXG59IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuaW1wb3J0IHsgbmFwaUVuZ2luZVJlcXVpcmVtZW50IH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcydcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0ZhY3RvcnkoJ25ldycpXG5cbmV4cG9ydCBjbGFzcyBOZXdDb21tYW5kIGV4dGVuZHMgQmFzZU5ld0NvbW1hbmQge1xuICBpbnRlcmFjdGl2ZSA9IE9wdGlvbi5Cb29sZWFuKCctLWludGVyYWN0aXZlLC1pJywgdHJ1ZSwge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0FzayBwcm9qZWN0IGJhc2ljIGluZm9ybWF0aW9uIGludGVyYWN0aXZlbHkgd2l0aG91dCBqdXN0IHVzaW5nIHRoZSBkZWZhdWx0LicsXG4gIH0pXG5cbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuZmV0Y2hPcHRpb25zKClcbiAgICAgIGF3YWl0IG5ld1Byb2plY3Qob3B0aW9ucylcbiAgICAgIHJldHVybiAwXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGVidWcoJ0ZhaWxlZCB0byBjcmVhdGUgbmV3IHByb2plY3QnKVxuICAgICAgZGVidWcuZXJyb3IoZSlcbiAgICAgIHJldHVybiAxXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE9wdGlvbnMoKSB7XG4gICAgY29uc3QgY21kT3B0aW9ucyA9IHN1cGVyLmdldE9wdGlvbnMoKVxuXG4gICAgaWYgKHRoaXMuaW50ZXJhY3RpdmUpIHtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGg6IHN0cmluZyA9IGNtZE9wdGlvbnMucGF0aFxuICAgICAgICA/IGNtZE9wdGlvbnMucGF0aFxuICAgICAgICA6IGF3YWl0IGlucXVpcmVyUHJvamVjdFBhdGgoKVxuICAgICAgY21kT3B0aW9ucy5wYXRoID0gdGFyZ2V0UGF0aFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY21kT3B0aW9ucyxcbiAgICAgICAgbmFtZTogYXdhaXQgdGhpcy5mZXRjaE5hbWUocGF0aC5wYXJzZSh0YXJnZXRQYXRoKS5iYXNlKSxcbiAgICAgICAgbWluTm9kZUFwaVZlcnNpb246IGF3YWl0IHRoaXMuZmV0Y2hOYXBpVmVyc2lvbigpLFxuICAgICAgICB0YXJnZXRzOiBhd2FpdCB0aGlzLmZldGNoVGFyZ2V0cygpLFxuICAgICAgICBsaWNlbnNlOiBhd2FpdCB0aGlzLmZldGNoTGljZW5zZSgpLFxuICAgICAgICBlbmFibGVUeXBlRGVmOiBhd2FpdCB0aGlzLmZldGNoVHlwZURlZigpLFxuICAgICAgICBlbmFibGVHaXRodWJBY3Rpb25zOiBhd2FpdCB0aGlzLmZldGNoR2l0aHViQWN0aW9ucygpLFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbWRPcHRpb25zXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoTmFtZShkZWZhdWx0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy4kJG5hbWUgPz9cbiAgICAgIGlucHV0KHtcbiAgICAgICAgbWVzc2FnZTogJ1BhY2thZ2UgbmFtZSAodGhlIG5hbWUgZmllbGQgaW4geW91ciBwYWNrYWdlLmpzb24gZmlsZSknLFxuICAgICAgICBkZWZhdWx0OiBkZWZhdWx0TmFtZSxcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaExpY2Vuc2UoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gaW5wdXQoe1xuICAgICAgbWVzc2FnZTogJ0xpY2Vuc2UgZm9yIG9wZW4tc291cmNlZCBwcm9qZWN0JyxcbiAgICAgIGRlZmF1bHQ6IHRoaXMubGljZW5zZSxcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE5hcGlWZXJzaW9uKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHNlbGVjdCh7XG4gICAgICBtZXNzYWdlOiAnTWluaW11bSBub2RlLWFwaSB2ZXJzaW9uICh3aXRoIG5vZGUgdmVyc2lvbiByZXF1aXJlbWVudCknLFxuICAgICAgbG9vcDogZmFsc2UsXG4gICAgICBjaG9pY2VzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiA4IH0sIChfLCBpKSA9PiAoe1xuICAgICAgICBuYW1lOiBgbmFwaSR7aSArIDF9ICgke25hcGlFbmdpbmVSZXF1aXJlbWVudChpICsgMSl9KWAsXG4gICAgICAgIHZhbHVlOiBpICsgMSxcbiAgICAgIH0pKSxcbiAgICAgIC8vIGNob2ljZSBpbmRleFxuICAgICAgZGVmYXVsdDogdGhpcy5taW5Ob2RlQXBpVmVyc2lvbiAtIDEsXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hUYXJnZXRzKCk6IFByb21pc2U8VGFyZ2V0VHJpcGxlW10+IHtcbiAgICBpZiAodGhpcy5lbmFibGVBbGxUYXJnZXRzKSB7XG4gICAgICByZXR1cm4gQVZBSUxBQkxFX1RBUkdFVFMuY29uY2F0KClcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgY2hlY2tib3goe1xuICAgICAgbG9vcDogZmFsc2UsXG4gICAgICBtZXNzYWdlOiAnQ2hvb3NlIHRhcmdldChzKSB5b3VyIGNyYXRlIHdpbGwgYmUgY29tcGlsZWQgdG8nLFxuICAgICAgY2hvaWNlczogQVZBSUxBQkxFX1RBUkdFVFMubWFwKCh0YXJnZXQpID0+ICh7XG4gICAgICAgIG5hbWU6IHRhcmdldCxcbiAgICAgICAgdmFsdWU6IHRhcmdldCxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBjaGVja2VkOiBERUZBVUxUX1RBUkdFVFMuaW5jbHVkZXModGFyZ2V0KSxcbiAgICAgIH0pKSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRhcmdldHNcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hUeXBlRGVmKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGVuYWJsZVR5cGVEZWYgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgIG1lc3NhZ2U6ICdFbmFibGUgdHlwZSBkZWZpbml0aW9uIGF1dG8tZ2VuZXJhdGlvbicsXG4gICAgICBkZWZhdWx0OiB0aGlzLmVuYWJsZVR5cGVEZWYsXG4gICAgfSlcblxuICAgIHJldHVybiBlbmFibGVUeXBlRGVmXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoR2l0aHViQWN0aW9ucygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBlbmFibGVHaXRodWJBY3Rpb25zID0gYXdhaXQgY29uZmlybSh7XG4gICAgICBtZXNzYWdlOiAnRW5hYmxlIEdpdGh1YiBBY3Rpb25zIENJJyxcbiAgICAgIGRlZmF1bHQ6IHRoaXMuZW5hYmxlR2l0aHViQWN0aW9ucyxcbiAgICB9KVxuXG4gICAgcmV0dXJuIGVuYWJsZUdpdGh1YkFjdGlvbnNcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbnF1aXJlclByb2plY3RQYXRoKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBpbnB1dCh7XG4gICAgbWVzc2FnZTogJ1RhcmdldCBwYXRoIHRvIGNyZWF0ZSB0aGUgcHJvamVjdCwgcmVsYXRpdmUgdG8gY3dkLicsXG4gIH0pLnRoZW4oKHBhdGgpID0+IHtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHJldHVybiBpbnF1aXJlclByb2plY3RQYXRoKClcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhcbiAgfSlcbn1cbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgY29kZWdlbi9pbmRleC50c1xuLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlIG1hbnVhbGx5XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tICdjbGlwYW5pb24nXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlUHJlUHVibGlzaENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHtcbiAgc3RhdGljIHBhdGhzID0gW1sncHJlLXB1Ymxpc2gnXSwgWydwcmVwdWJsaXNoJ11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVXBkYXRlIHBhY2thZ2UuanNvbiBhbmQgY29weSBhZGRvbnMgaW50byBwZXIgcGxhdGZvcm0gcGFja2FnZXMnLFxuICB9KVxuXG4gIGN3ZCA9IE9wdGlvbi5TdHJpbmcoJy0tY3dkJywgcHJvY2Vzcy5jd2QoKSwge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aCcsXG4gIH0pXG5cbiAgY29uZmlnUGF0aD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tY29uZmlnLXBhdGgsLWMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlJyxcbiAgfSlcblxuICBwYWNrYWdlSnNvblBhdGggPSBPcHRpb24uU3RyaW5nKCctLXBhY2thZ2UtanNvbi1wYXRoJywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYHBhY2thZ2UuanNvbmAnLFxuICB9KVxuXG4gIG5wbURpciA9IE9wdGlvbi5TdHJpbmcoJy0tbnBtLWRpciwtcCcsICducG0nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXQnLFxuICB9KVxuXG4gIHRhZ1N0eWxlID0gT3B0aW9uLlN0cmluZygnLS10YWctc3R5bGUsLS10YWdzdHlsZSwtdCcsICdsZXJuYScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ2dpdCB0YWcgc3R5bGUsIGBucG1gIG9yIGBsZXJuYWAnLFxuICB9KVxuXG4gIGdoUmVsZWFzZSA9IE9wdGlvbi5Cb29sZWFuKCctLWdoLXJlbGVhc2UnLCB0cnVlLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIGNyZWF0ZSBHaXRIdWIgcmVsZWFzZScsXG4gIH0pXG5cbiAgZ2hSZWxlYXNlTmFtZT86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tZ2gtcmVsZWFzZS1uYW1lJywge1xuICAgIGRlc2NyaXB0aW9uOiAnR2l0SHViIHJlbGVhc2UgbmFtZScsXG4gIH0pXG5cbiAgZ2hSZWxlYXNlSWQ/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWdoLXJlbGVhc2UtaWQnLCB7XG4gICAgZGVzY3JpcHRpb246ICdFeGlzdGluZyBHaXRIdWIgcmVsZWFzZSBpZCcsXG4gIH0pXG5cbiAgc2tpcE9wdGlvbmFsUHVibGlzaCA9IE9wdGlvbi5Cb29sZWFuKCctLXNraXAtb3B0aW9uYWwtcHVibGlzaCcsIGZhbHNlLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHNraXAgb3B0aW9uYWxEZXBlbmRlbmNpZXMgcGFja2FnZXMgcHVibGlzaCcsXG4gIH0pXG5cbiAgZHJ5UnVuID0gT3B0aW9uLkJvb2xlYW4oJy0tZHJ5LXJ1bicsIGZhbHNlLCB7XG4gICAgZGVzY3JpcHRpb246ICdEcnkgcnVuIHdpdGhvdXQgdG91Y2hpbmcgZmlsZSBzeXN0ZW0nLFxuICB9KVxuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICBjb25maWdQYXRoOiB0aGlzLmNvbmZpZ1BhdGgsXG4gICAgICBwYWNrYWdlSnNvblBhdGg6IHRoaXMucGFja2FnZUpzb25QYXRoLFxuICAgICAgbnBtRGlyOiB0aGlzLm5wbURpcixcbiAgICAgIHRhZ1N0eWxlOiB0aGlzLnRhZ1N0eWxlLFxuICAgICAgZ2hSZWxlYXNlOiB0aGlzLmdoUmVsZWFzZSxcbiAgICAgIGdoUmVsZWFzZU5hbWU6IHRoaXMuZ2hSZWxlYXNlTmFtZSxcbiAgICAgIGdoUmVsZWFzZUlkOiB0aGlzLmdoUmVsZWFzZUlkLFxuICAgICAgc2tpcE9wdGlvbmFsUHVibGlzaDogdGhpcy5za2lwT3B0aW9uYWxQdWJsaXNoLFxuICAgICAgZHJ5UnVuOiB0aGlzLmRyeVJ1bixcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGUgcGFja2FnZS5qc29uIGFuZCBjb3B5IGFkZG9ucyBpbnRvIHBlciBwbGF0Zm9ybSBwYWNrYWdlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZVB1Ymxpc2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aFxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9jZXNzLmN3ZCgpXG4gICAqL1xuICBjd2Q/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGVcbiAgICovXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYHBhY2thZ2UuanNvbmBcbiAgICpcbiAgICogQGRlZmF1bHQgJ3BhY2thZ2UuanNvbidcbiAgICovXG4gIHBhY2thZ2VKc29uUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0XG4gICAqXG4gICAqIEBkZWZhdWx0ICducG0nXG4gICAqL1xuICBucG1EaXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIGdpdCB0YWcgc3R5bGUsIGBucG1gIG9yIGBsZXJuYWBcbiAgICpcbiAgICogQGRlZmF1bHQgJ2xlcm5hJ1xuICAgKi9cbiAgdGFnU3R5bGU/OiAnbnBtJyB8ICdsZXJuYSdcbiAgLyoqXG4gICAqIFdoZXRoZXIgY3JlYXRlIEdpdEh1YiByZWxlYXNlXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGdoUmVsZWFzZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIEdpdEh1YiByZWxlYXNlIG5hbWVcbiAgICovXG4gIGdoUmVsZWFzZU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEV4aXN0aW5nIEdpdEh1YiByZWxlYXNlIGlkXG4gICAqL1xuICBnaFJlbGVhc2VJZD86IHN0cmluZ1xuICAvKipcbiAgICogV2hldGhlciBza2lwIG9wdGlvbmFsRGVwZW5kZW5jaWVzIHBhY2thZ2VzIHB1Ymxpc2hcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHNraXBPcHRpb25hbFB1Ymxpc2g/OiBib29sZWFuXG4gIC8qKlxuICAgKiBEcnkgcnVuIHdpdGhvdXQgdG91Y2hpbmcgZmlsZSBzeXN0ZW1cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRyeVJ1bj86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVmYXVsdFByZVB1Ymxpc2hPcHRpb25zKG9wdGlvbnM6IFByZVB1Ymxpc2hPcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIHBhY2thZ2VKc29uUGF0aDogJ3BhY2thZ2UuanNvbicsXG4gICAgbnBtRGlyOiAnbnBtJyxcbiAgICB0YWdTdHlsZTogJ2xlcm5hJyxcbiAgICBnaFJlbGVhc2U6IHRydWUsXG4gICAgc2tpcE9wdGlvbmFsUHVibGlzaDogZmFsc2UsXG4gICAgZHJ5UnVuOiBmYWxzZSxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVZlcnNpb25Db21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBwYXRocyA9IFtbJ3ZlcnNpb24nXV1cblxuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogJ1VwZGF0ZSB2ZXJzaW9uIGluIGNyZWF0ZWQgbnBtIHBhY2thZ2VzJyxcbiAgfSlcblxuICBjd2QgPSBPcHRpb24uU3RyaW5nKCctLWN3ZCcsIHByb2Nlc3MuY3dkKCksIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGgnLFxuICB9KVxuXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWNvbmZpZy1wYXRoLC1jJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZScsXG4gIH0pXG5cbiAgcGFja2FnZUpzb25QYXRoID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLWpzb24tcGF0aCcsICdwYWNrYWdlLmpzb24nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBwYWNrYWdlLmpzb25gJyxcbiAgfSlcblxuICBucG1EaXIgPSBPcHRpb24uU3RyaW5nKCctLW5wbS1kaXInLCAnbnBtJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0JyxcbiAgfSlcblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgcGFja2FnZUpzb25QYXRoOiB0aGlzLnBhY2thZ2VKc29uUGF0aCxcbiAgICAgIG5wbURpcjogdGhpcy5ucG1EaXIsXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVXBkYXRlIHZlcnNpb24gaW4gY3JlYXRlZCBucG0gcGFja2FnZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJzaW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGhcbiAgICpcbiAgICogQGRlZmF1bHQgcHJvY2Vzcy5jd2QoKVxuICAgKi9cbiAgY3dkPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlXG4gICAqL1xuICBjb25maWdQYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBwYWNrYWdlLmpzb25gXG4gICAqXG4gICAqIEBkZWZhdWx0ICdwYWNrYWdlLmpzb24nXG4gICAqL1xuICBwYWNrYWdlSnNvblBhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIGZvbGRlciB3aGVyZSB0aGUgbnBtIHBhY2thZ2VzIHB1dFxuICAgKlxuICAgKiBAZGVmYXVsdCAnbnBtJ1xuICAgKi9cbiAgbnBtRGlyPzogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRWZXJzaW9uT3B0aW9ucyhvcHRpb25zOiBWZXJzaW9uT3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBwYWNrYWdlSnNvblBhdGg6ICdwYWNrYWdlLmpzb24nLFxuICAgIG5wbURpcjogJ25wbScsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxufVxuIiwiaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHsgYXBwbHlEZWZhdWx0VmVyc2lvbk9wdGlvbnMsIFZlcnNpb25PcHRpb25zIH0gZnJvbSAnLi4vZGVmL3ZlcnNpb24uanMnXG5pbXBvcnQge1xuICByZWFkTmFwaUNvbmZpZyxcbiAgZGVidWdGYWN0b3J5LFxuICB1cGRhdGVQYWNrYWdlSnNvbixcbn0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCd2ZXJzaW9uJylcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcnNpb24odXNlck9wdGlvbnM6IFZlcnNpb25PcHRpb25zKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcHBseURlZmF1bHRWZXJzaW9uT3B0aW9ucyh1c2VyT3B0aW9ucylcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5wYWNrYWdlSnNvblBhdGgpXG5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVhZE5hcGlDb25maWcoXG4gICAgcGFja2FnZUpzb25QYXRoLFxuICAgIG9wdGlvbnMuY29uZmlnUGF0aCA/IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMuY29uZmlnUGF0aCkgOiB1bmRlZmluZWQsXG4gIClcblxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiBjb25maWcudGFyZ2V0cykge1xuICAgIGNvbnN0IHBrZ0RpciA9IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMubnBtRGlyLCB0YXJnZXQucGxhdGZvcm1BcmNoQUJJKVxuXG4gICAgZGVidWcoYFVwZGF0ZSB2ZXJzaW9uIHRvICVpIGluIFslaV1gLCBjb25maWcucGFja2FnZUpzb24udmVyc2lvbiwgcGtnRGlyKVxuICAgIGF3YWl0IHVwZGF0ZVBhY2thZ2VKc29uKGpvaW4ocGtnRGlyLCAncGFja2FnZS5qc29uJyksIHtcbiAgICAgIHZlcnNpb246IGNvbmZpZy5wYWNrYWdlSnNvbi52ZXJzaW9uLFxuICAgIH0pXG4gIH1cbn1cbiIsImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IHsgZXhpc3RzU3luYywgc3RhdFN5bmMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L3Jlc3QnXG5cbmltcG9ydCB7XG4gIGFwcGx5RGVmYXVsdFByZVB1Ymxpc2hPcHRpb25zLFxuICBQcmVQdWJsaXNoT3B0aW9ucyxcbn0gZnJvbSAnLi4vZGVmL3ByZS1wdWJsaXNoLmpzJ1xuaW1wb3J0IHtcbiAgcmVhZEZpbGVBc3luYyxcbiAgcmVhZE5hcGlDb25maWcsXG4gIGRlYnVnRmFjdG9yeSxcbiAgdXBkYXRlUGFja2FnZUpzb24sXG59IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuXG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJ1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnRmFjdG9yeSgncHJlLXB1Ymxpc2gnKVxuXG5pbnRlcmZhY2UgUGFja2FnZUluZm8ge1xuICBuYW1lOiBzdHJpbmdcbiAgdmVyc2lvbjogc3RyaW5nXG4gIHRhZzogc3RyaW5nXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVQdWJsaXNoKHVzZXJPcHRpb25zOiBQcmVQdWJsaXNoT3B0aW9ucykge1xuICBkZWJ1ZygnUmVjZWl2ZSBwcmUtcHVibGlzaCBvcHRpb25zOicpXG4gIGRlYnVnKCcgICVPJywgdXNlck9wdGlvbnMpXG5cbiAgY29uc3Qgb3B0aW9ucyA9IGFwcGx5RGVmYXVsdFByZVB1Ymxpc2hPcHRpb25zKHVzZXJPcHRpb25zKVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMucGFja2FnZUpzb25QYXRoKVxuXG4gIGNvbnN0IHsgcGFja2FnZUpzb24sIHRhcmdldHMsIHBhY2thZ2VOYW1lLCBiaW5hcnlOYW1lLCBucG1DbGllbnQgfSA9XG4gICAgYXdhaXQgcmVhZE5hcGlDb25maWcoXG4gICAgICBwYWNrYWdlSnNvblBhdGgsXG4gICAgICBvcHRpb25zLmNvbmZpZ1BhdGggPyByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLmNvbmZpZ1BhdGgpIDogdW5kZWZpbmVkLFxuICAgIClcblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVHaFJlbGVhc2UocGFja2FnZU5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgaWYgKCFvcHRpb25zLmdoUmVsZWFzZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3duZXI6IG51bGwsXG4gICAgICAgIHJlcG86IG51bGwsXG4gICAgICAgIHBrZ0luZm86IHsgbmFtZTogbnVsbCwgdmVyc2lvbjogbnVsbCwgdGFnOiBudWxsIH0sXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHsgcmVwbywgb3duZXIsIHBrZ0luZm8sIG9jdG9raXQgfSA9IGdldFJlcG9JbmZvKHBhY2thZ2VOYW1lLCB2ZXJzaW9uKVxuXG4gICAgaWYgKCFyZXBvIHx8ICFvd25lcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3duZXI6IG51bGwsXG4gICAgICAgIHJlcG86IG51bGwsXG4gICAgICAgIHBrZ0luZm86IHsgbmFtZTogbnVsbCwgdmVyc2lvbjogbnVsbCwgdGFnOiBudWxsIH0sXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmRyeVJ1bikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXBvcy5jcmVhdGVSZWxlYXNlKHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHRhZ19uYW1lOiBwa2dJbmZvLnRhZyxcbiAgICAgICAgICBuYW1lOiBvcHRpb25zLmdoUmVsZWFzZU5hbWUsXG4gICAgICAgICAgcHJlcmVsZWFzZTpcbiAgICAgICAgICAgIHZlcnNpb24uaW5jbHVkZXMoJ2FscGhhJykgfHxcbiAgICAgICAgICAgIHZlcnNpb24uaW5jbHVkZXMoJ2JldGEnKSB8fFxuICAgICAgICAgICAgdmVyc2lvbi5pbmNsdWRlcygncmMnKSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgYFBhcmFtczogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHsgb3duZXIsIHJlcG8sIHRhZ19uYW1lOiBwa2dJbmZvLnRhZyB9LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgb3duZXIsIHJlcG8sIHBrZ0luZm8sIG9jdG9raXQgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UmVwb0luZm8ocGFja2FnZU5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgY29uc3QgaGVhZENvbW1pdCA9IGV4ZWNTeW5jKCdnaXQgbG9nIC0xIC0tcHJldHR5PSVCJywge1xuICAgICAgZW5jb2Rpbmc6ICd1dGYtOCcsXG4gICAgfSkudHJpbSgpXG5cbiAgICBjb25zdCB7IEdJVEhVQl9SRVBPU0lUT1JZIH0gPSBwcm9jZXNzLmVudlxuICAgIGlmICghR0lUSFVCX1JFUE9TSVRPUlkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG93bmVyOiBudWxsLFxuICAgICAgICByZXBvOiBudWxsLFxuICAgICAgICBwa2dJbmZvOiB7IG5hbWU6IG51bGwsIHZlcnNpb246IG51bGwsIHRhZzogbnVsbCB9LFxuICAgICAgfVxuICAgIH1cbiAgICBkZWJ1ZyhgR2l0aHViIHJlcG9zaXRvcnk6ICR7R0lUSFVCX1JFUE9TSVRPUll9YClcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gR0lUSFVCX1JFUE9TSVRPUlkuc3BsaXQoJy8nKVxuICAgIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgICBhdXRoOiBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4sXG4gICAgfSlcbiAgICBsZXQgcGtnSW5mbzogUGFja2FnZUluZm8gfCB1bmRlZmluZWRcbiAgICBpZiAob3B0aW9ucy50YWdTdHlsZSA9PT0gJ2xlcm5hJykge1xuICAgICAgY29uc3QgcGFja2FnZXNUb1B1Ymxpc2ggPSBoZWFkQ29tbWl0XG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAgIC5maWx0ZXIoKGxpbmUsIGluZGV4KSA9PiBsaW5lLmxlbmd0aCAmJiBpbmRleClcbiAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zdWJzdHJpbmcoMikpXG4gICAgICAgIC5tYXAocGFyc2VUYWcpXG5cbiAgICAgIHBrZ0luZm8gPSBwYWNrYWdlc1RvUHVibGlzaC5maW5kKFxuICAgICAgICAocGtnSW5mbykgPT4gcGtnSW5mby5uYW1lID09PSBwYWNrYWdlTmFtZSxcbiAgICAgIClcblxuICAgICAgaWYgKCFwa2dJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYE5vIHJlbGVhc2UgY29tbWl0IGZvdW5kIHdpdGggJHtwYWNrYWdlTmFtZX0sIG9yaWdpbmFsIGNvbW1pdCBpbmZvOiAke2hlYWRDb21taXR9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwa2dJbmZvID0ge1xuICAgICAgICB0YWc6IGB2JHt2ZXJzaW9ufWAsXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIG5hbWU6IHBhY2thZ2VOYW1lLFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBvd25lciwgcmVwbywgcGtnSW5mbywgb2N0b2tpdCB9XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgYXdhaXQgdmVyc2lvbih1c2VyT3B0aW9ucylcbiAgICBhd2FpdCB1cGRhdGVQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgsIHtcbiAgICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOiB0YXJnZXRzLnJlZHVjZShcbiAgICAgICAgKGRlcHMsIHRhcmdldCkgPT4ge1xuICAgICAgICAgIGRlcHNbYCR7cGFja2FnZU5hbWV9LSR7dGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX1gXSA9IHBhY2thZ2VKc29uLnZlcnNpb25cblxuICAgICAgICAgIHJldHVybiBkZXBzXG4gICAgICAgIH0sXG4gICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgICApLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCB7IG93bmVyLCByZXBvLCBwa2dJbmZvLCBvY3Rva2l0IH0gPSBvcHRpb25zLmdoUmVsZWFzZUlkXG4gICAgPyBnZXRSZXBvSW5mbyhwYWNrYWdlTmFtZSwgcGFja2FnZUpzb24udmVyc2lvbilcbiAgICA6IGF3YWl0IGNyZWF0ZUdoUmVsZWFzZShwYWNrYWdlTmFtZSwgcGFja2FnZUpzb24udmVyc2lvbilcblxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgY29uc3QgcGtnRGlyID0gcmVzb2x2ZShcbiAgICAgIG9wdGlvbnMuY3dkLFxuICAgICAgb3B0aW9ucy5ucG1EaXIsXG4gICAgICBgJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfWAsXG4gICAgKVxuICAgIGNvbnN0IGV4dCA9XG4gICAgICB0YXJnZXQucGxhdGZvcm0gPT09ICd3YXNpJyB8fCB0YXJnZXQucGxhdGZvcm0gPT09ICd3YXNtJyA/ICd3YXNtJyA6ICdub2RlJ1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7YmluYXJ5TmFtZX0uJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfS4ke2V4dH1gXG4gICAgY29uc3QgZHN0UGF0aCA9IGpvaW4ocGtnRGlyLCBmaWxlbmFtZSlcblxuICAgIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgIGlmICghZXhpc3RzU3luYyhkc3RQYXRoKSkge1xuICAgICAgICBkZWJ1Zy53YXJuKGAlcyBkb2Vzbid0IGV4aXN0YCwgZHN0UGF0aClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnNraXBPcHRpb25hbFB1Ymxpc2gpIHtcbiAgICAgICAgZXhlY1N5bmMoYCR7bnBtQ2xpZW50fSBwdWJsaXNoYCwge1xuICAgICAgICAgIGN3ZDogcGtnRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmdoUmVsZWFzZSAmJiByZXBvICYmIG93bmVyKSB7XG4gICAgICAgIGRlYnVnLmluZm8oYENyZWF0aW5nIEdpdEh1YiByZWxlYXNlICR7cGtnSW5mby50YWd9YClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZWxlYXNlSWQgPSBvcHRpb25zLmdoUmVsZWFzZUlkXG4gICAgICAgICAgICA/IE51bWJlcihvcHRpb25zLmdoUmVsZWFzZUlkKVxuICAgICAgICAgICAgOiAoXG4gICAgICAgICAgICAgICAgYXdhaXQgb2N0b2tpdCEucmVwb3MuZ2V0UmVsZWFzZUJ5VGFnKHtcbiAgICAgICAgICAgICAgICAgIHJlcG86IHJlcG8sXG4gICAgICAgICAgICAgICAgICBvd25lcjogb3duZXIsXG4gICAgICAgICAgICAgICAgICB0YWc6IHBrZ0luZm8udGFnLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICkuZGF0YS5pZFxuICAgICAgICAgIGNvbnN0IGRzdEZpbGVTdGF0cyA9IHN0YXRTeW5jKGRzdFBhdGgpXG4gICAgICAgICAgY29uc3QgYXNzZXRJbmZvID0gYXdhaXQgb2N0b2tpdCEucmVwb3MudXBsb2FkUmVsZWFzZUFzc2V0KHtcbiAgICAgICAgICAgIG93bmVyOiBvd25lcixcbiAgICAgICAgICAgIHJlcG86IHJlcG8sXG4gICAgICAgICAgICBuYW1lOiBmaWxlbmFtZSxcbiAgICAgICAgICAgIHJlbGVhc2VfaWQ6IHJlbGVhc2VJZCxcbiAgICAgICAgICAgIG1lZGlhVHlwZTogeyBmb3JtYXQ6ICdyYXcnIH0sXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdjb250ZW50LWxlbmd0aCc6IGRzdEZpbGVTdGF0cy5zaXplLFxuICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBvY3Rva2l0IHR5cGVzIGFyZSB3cm9uZ1xuICAgICAgICAgICAgZGF0YTogYXdhaXQgcmVhZEZpbGVBc3luYyhkc3RQYXRoKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGRlYnVnLmluZm8oYEdpdEh1YiByZWxlYXNlIGNyZWF0ZWRgKVxuICAgICAgICAgIGRlYnVnLmluZm8oYERvd25sb2FkIFVSTDogJXNgLCBhc3NldEluZm8uZGF0YS5icm93c2VyX2Rvd25sb2FkX3VybClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGRlYnVnLmVycm9yKFxuICAgICAgICAgICAgYFBhcmFtOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB7IG93bmVyLCByZXBvLCB0YWc6IHBrZ0luZm8udGFnLCBmaWxlbmFtZTogZHN0UGF0aCB9LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBkZWJ1Zy5lcnJvcihlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGFnKHRhZzogc3RyaW5nKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gdGFnLnNwbGl0KCdAJylcbiAgY29uc3QgdmVyc2lvbiA9IHNlZ21lbnRzLnBvcCgpIVxuICBjb25zdCBuYW1lID0gc2VnbWVudHMuam9pbignQCcpXG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHZlcnNpb24sXG4gICAgdGFnLFxuICB9XG59XG4iLCJpbXBvcnQgeyBwcmVQdWJsaXNoIH0gZnJvbSAnLi4vYXBpL3ByZS1wdWJsaXNoLmpzJ1xuaW1wb3J0IHsgQmFzZVByZVB1Ymxpc2hDb21tYW5kIH0gZnJvbSAnLi4vZGVmL3ByZS1wdWJsaXNoLmpzJ1xuXG5leHBvcnQgY2xhc3MgUHJlUHVibGlzaENvbW1hbmQgZXh0ZW5kcyBCYXNlUHJlUHVibGlzaENvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY29uc3QgJ25wbScgfCAnbGVybmEnIHRvIHN0cmluZ1xuICAgIGF3YWl0IHByZVB1Ymxpc2godGhpcy5nZXRPcHRpb25zKCkpXG4gIH1cbn1cbiIsImltcG9ydCB7IGlucHV0IH0gZnJvbSAnQGlucXVpcmVyL3Byb21wdHMnXG5cbmltcG9ydCB7IHJlbmFtZVByb2plY3QgfSBmcm9tICcuLi9hcGkvcmVuYW1lLmpzJ1xuaW1wb3J0IHsgQmFzZVJlbmFtZUNvbW1hbmQgfSBmcm9tICcuLi9kZWYvcmVuYW1lLmpzJ1xuXG5leHBvcnQgY2xhc3MgUmVuYW1lQ29tbWFuZCBleHRlbmRzIEJhc2VSZW5hbWVDb21tYW5kIHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRPcHRpb25zKClcbiAgICBpZiAoIW9wdGlvbnMubmFtZSkge1xuICAgICAgY29uc3QgbmFtZSA9IGF3YWl0IGlucHV0KHtcbiAgICAgICAgbWVzc2FnZTogYEVudGVyIHRoZSBuZXcgcGFja2FnZSBuYW1lIGluIHRoZSBwYWNrYWdlLmpzb25gLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBvcHRpb25zLm5hbWUgPSBuYW1lXG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5iaW5hcnlOYW1lKSB7XG4gICAgICBjb25zdCBiaW5hcnlOYW1lID0gYXdhaXQgaW5wdXQoe1xuICAgICAgICBtZXNzYWdlOiBgRW50ZXIgdGhlIG5ldyBiaW5hcnkgbmFtZWAsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIG9wdGlvbnMuYmluYXJ5TmFtZSA9IGJpbmFyeU5hbWVcbiAgICB9XG4gICAgYXdhaXQgcmVuYW1lUHJvamVjdChvcHRpb25zKVxuICB9XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVVuaXZlcnNhbGl6ZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHtcbiAgc3RhdGljIHBhdGhzID0gW1sndW5pdmVyc2FsaXplJ11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246ICdDb21iaWxlIGJ1aWx0IGJpbmFyaWVzIGludG8gb25lIHVuaXZlcnNhbCBiaW5hcnknLFxuICB9KVxuXG4gIGN3ZCA9IE9wdGlvbi5TdHJpbmcoJy0tY3dkJywgcHJvY2Vzcy5jd2QoKSwge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aCcsXG4gIH0pXG5cbiAgY29uZmlnUGF0aD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tY29uZmlnLXBhdGgsLWMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlJyxcbiAgfSlcblxuICBwYWNrYWdlSnNvblBhdGggPSBPcHRpb24uU3RyaW5nKCctLXBhY2thZ2UtanNvbi1wYXRoJywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYHBhY2thZ2UuanNvbmAnLFxuICB9KVxuXG4gIG91dHB1dERpciA9IE9wdGlvbi5TdHJpbmcoJy0tb3V0cHV0LWRpciwtbycsICcuLycsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgYWxsIGJ1aWx0IGAubm9kZWAgZmlsZXMgcHV0LCBzYW1lIGFzIGAtLW91dHB1dC1kaXJgIG9mIGJ1aWxkIGNvbW1hbmQnLFxuICB9KVxuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICBjb25maWdQYXRoOiB0aGlzLmNvbmZpZ1BhdGgsXG4gICAgICBwYWNrYWdlSnNvblBhdGg6IHRoaXMucGFja2FnZUpzb25QYXRoLFxuICAgICAgb3V0cHV0RGlyOiB0aGlzLm91dHB1dERpcixcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb21iaWxlIGJ1aWx0IGJpbmFyaWVzIGludG8gb25lIHVuaXZlcnNhbCBiaW5hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbml2ZXJzYWxpemVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aFxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9jZXNzLmN3ZCgpXG4gICAqL1xuICBjd2Q/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGVcbiAgICovXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYHBhY2thZ2UuanNvbmBcbiAgICpcbiAgICogQGRlZmF1bHQgJ3BhY2thZ2UuanNvbidcbiAgICovXG4gIHBhY2thZ2VKc29uUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIGFsbCBidWlsdCBgLm5vZGVgIGZpbGVzIHB1dCwgc2FtZSBhcyBgLS1vdXRwdXQtZGlyYCBvZiBidWlsZCBjb21tYW5kXG4gICAqXG4gICAqIEBkZWZhdWx0ICcuLydcbiAgICovXG4gIG91dHB1dERpcj86IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlEZWZhdWx0VW5pdmVyc2FsaXplT3B0aW9ucyhvcHRpb25zOiBVbml2ZXJzYWxpemVPcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIHBhY2thZ2VKc29uUGF0aDogJ3BhY2thZ2UuanNvbicsXG4gICAgb3V0cHV0RGlyOiAnLi8nLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2VzcydcbmltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCB7XG4gIGFwcGx5RGVmYXVsdFVuaXZlcnNhbGl6ZU9wdGlvbnMsXG4gIFVuaXZlcnNhbGl6ZU9wdGlvbnMsXG59IGZyb20gJy4uL2RlZi91bml2ZXJzYWxpemUuanMnXG5pbXBvcnQgeyByZWFkTmFwaUNvbmZpZyB9IGZyb20gJy4uL3V0aWxzL2NvbmZpZy5qcydcbmltcG9ydCB7IGRlYnVnRmFjdG9yeSB9IGZyb20gJy4uL3V0aWxzL2xvZy5qcydcbmltcG9ydCB7IGZpbGVFeGlzdHMgfSBmcm9tICcuLi91dGlscy9taXNjLmpzJ1xuaW1wb3J0IHsgVW5pQXJjaHNCeVBsYXRmb3JtIH0gZnJvbSAnLi4vdXRpbHMvdGFyZ2V0LmpzJ1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnRmFjdG9yeSgndW5pdmVyc2FsaXplJylcblxuY29uc3QgdW5pdmVyc2FsaXplcnM6IFBhcnRpYWw8XG4gIFJlY29yZDxOb2RlSlMuUGxhdGZvcm0sIChpbnB1dHM6IHN0cmluZ1tdLCBvdXRwdXQ6IHN0cmluZykgPT4gdm9pZD5cbj4gPSB7XG4gIGRhcndpbjogKGlucHV0cywgb3V0cHV0KSA9PiB7XG4gICAgc3Bhd25TeW5jKCdsaXBvJywgWyctY3JlYXRlJywgJy1vdXRwdXQnLCBvdXRwdXQsIC4uLmlucHV0c10sIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSlcbiAgfSxcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVuaXZlcnNhbGl6ZUJpbmFyaWVzKHVzZXJPcHRpb25zOiBVbml2ZXJzYWxpemVPcHRpb25zKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcHBseURlZmF1bHRVbml2ZXJzYWxpemVPcHRpb25zKHVzZXJPcHRpb25zKVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4ob3B0aW9ucy5jd2QsIG9wdGlvbnMucGFja2FnZUpzb25QYXRoKVxuXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlYWROYXBpQ29uZmlnKFxuICAgIHBhY2thZ2VKc29uUGF0aCxcbiAgICBvcHRpb25zLmNvbmZpZ1BhdGggPyByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLmNvbmZpZ1BhdGgpIDogdW5kZWZpbmVkLFxuICApXG5cbiAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldHMuZmluZChcbiAgICAodCkgPT4gdC5wbGF0Zm9ybSA9PT0gcHJvY2Vzcy5wbGF0Zm9ybSAmJiB0LmFyY2ggPT09ICd1bml2ZXJzYWwnLFxuICApXG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJ3VuaXZlcnNhbCcgYXJjaCBmb3IgcGxhdGZvcm0gJyR7cHJvY2Vzcy5wbGF0Zm9ybX0nIG5vdCBmb3VuZCBpbiBjb25maWchYCxcbiAgICApXG4gIH1cblxuICBjb25zdCBzcmNGaWxlcyA9IFVuaUFyY2hzQnlQbGF0Zm9ybVtwcm9jZXNzLnBsYXRmb3JtXT8ubWFwKChhcmNoKSA9PlxuICAgIHJlc29sdmUoXG4gICAgICBvcHRpb25zLmN3ZCxcbiAgICAgIG9wdGlvbnMub3V0cHV0RGlyLFxuICAgICAgYCR7Y29uZmlnLmJpbmFyeU5hbWV9LiR7cHJvY2Vzcy5wbGF0Zm9ybX0tJHthcmNofS5ub2RlYCxcbiAgICApLFxuICApXG5cbiAgaWYgKCFzcmNGaWxlcyB8fCAhdW5pdmVyc2FsaXplcnNbcHJvY2Vzcy5wbGF0Zm9ybV0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJ3VuaXZlcnNhbCcgYXJjaCBmb3IgcGxhdGZvcm0gJyR7cHJvY2Vzcy5wbGF0Zm9ybX0nIG5vdCBzdXBwb3J0ZWQuYCxcbiAgICApXG4gIH1cblxuICBkZWJ1ZyhgTG9va2luZyB1cCBzb3VyY2UgYmluYXJpZXMgdG8gY29tYmluZTogYClcbiAgZGVidWcoJyAgJU8nLCBzcmNGaWxlcylcblxuICBjb25zdCBzcmNGaWxlTG9va3VwID0gYXdhaXQgUHJvbWlzZS5hbGwoc3JjRmlsZXMubWFwKChmKSA9PiBmaWxlRXhpc3RzKGYpKSlcblxuICBjb25zdCBub3RGb3VuZEZpbGVzID0gc3JjRmlsZXMuZmlsdGVyKChfLCBpKSA9PiAhc3JjRmlsZUxvb2t1cFtpXSlcblxuICBpZiAobm90Rm91bmRGaWxlcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgU29tZSBiaW5hcnkgZmlsZXMgd2VyZSBub3QgZm91bmQ6ICR7SlNPTi5zdHJpbmdpZnkobm90Rm91bmRGaWxlcyl9YCxcbiAgICApXG4gIH1cblxuICBjb25zdCBvdXRwdXQgPSByZXNvbHZlKFxuICAgIG9wdGlvbnMuY3dkLFxuICAgIG9wdGlvbnMub3V0cHV0RGlyLFxuICAgIGAke2NvbmZpZy5iaW5hcnlOYW1lfS4ke3Byb2Nlc3MucGxhdGZvcm19LXVuaXZlcnNhbC5ub2RlYCxcbiAgKVxuXG4gIHVuaXZlcnNhbGl6ZXJzW3Byb2Nlc3MucGxhdGZvcm1dPy4oc3JjRmlsZXMsIG91dHB1dClcblxuICBkZWJ1ZyhgUHJvZHVjZWQgdW5pdmVyc2FsIGJpbmFyeTogJHtvdXRwdXR9YClcbn1cbiIsImltcG9ydCB7IHVuaXZlcnNhbGl6ZUJpbmFyaWVzIH0gZnJvbSAnLi4vYXBpL3VuaXZlcnNhbGl6ZS5qcydcbmltcG9ydCB7IEJhc2VVbml2ZXJzYWxpemVDb21tYW5kIH0gZnJvbSAnLi4vZGVmL3VuaXZlcnNhbGl6ZS5qcydcblxuZXhwb3J0IGNsYXNzIFVuaXZlcnNhbGl6ZUNvbW1hbmQgZXh0ZW5kcyBCYXNlVW5pdmVyc2FsaXplQ29tbWFuZCB7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgdW5pdmVyc2FsaXplQmluYXJpZXModGhpcy5nZXRPcHRpb25zKCkpXG4gIH1cbn1cbiIsImltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi9hcGkvdmVyc2lvbi5qcydcbmltcG9ydCB7IEJhc2VWZXJzaW9uQ29tbWFuZCB9IGZyb20gJy4uL2RlZi92ZXJzaW9uLmpzJ1xuXG5leHBvcnQgY2xhc3MgVmVyc2lvbkNvbW1hbmQgZXh0ZW5kcyBCYXNlVmVyc2lvbkNvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGF3YWl0IHZlcnNpb24odGhpcy5nZXRPcHRpb25zKCkpXG4gIH1cbn1cbiIsIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHsgQ2xpIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5pbXBvcnQgeyBBcnRpZmFjdHNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9hcnRpZmFjdHMuanMnXG5pbXBvcnQgeyBCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkLmpzJ1xuaW1wb3J0IHsgQ3JlYXRlTnBtRGlyc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NyZWF0ZS1ucG0tZGlycy5qcydcbmltcG9ydCB7IEhlbHBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9oZWxwLmpzJ1xuaW1wb3J0IHsgTmV3Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbmV3LmpzJ1xuaW1wb3J0IHsgUHJlUHVibGlzaENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByZS1wdWJsaXNoLmpzJ1xuaW1wb3J0IHsgUmVuYW1lQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmVuYW1lLmpzJ1xuaW1wb3J0IHsgVW5pdmVyc2FsaXplQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdW5pdmVyc2FsaXplLmpzJ1xuaW1wb3J0IHsgVmVyc2lvbkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcnNpb24uanMnXG5pbXBvcnQgeyBDTElfVkVSU0lPTiB9IGZyb20gJy4vdXRpbHMvbWlzYy5qcydcblxuY29uc3QgY2xpID0gbmV3IENsaSh7XG4gIGJpbmFyeU5hbWU6ICduYXBpJyxcbiAgYmluYXJ5VmVyc2lvbjogQ0xJX1ZFUlNJT04sXG59KVxuXG5jbGkucmVnaXN0ZXIoTmV3Q29tbWFuZClcbmNsaS5yZWdpc3RlcihCdWlsZENvbW1hbmQpXG5jbGkucmVnaXN0ZXIoQ3JlYXRlTnBtRGlyc0NvbW1hbmQpXG5jbGkucmVnaXN0ZXIoQXJ0aWZhY3RzQ29tbWFuZClcbmNsaS5yZWdpc3RlcihVbml2ZXJzYWxpemVDb21tYW5kKVxuY2xpLnJlZ2lzdGVyKFJlbmFtZUNvbW1hbmQpXG5jbGkucmVnaXN0ZXIoUHJlUHVibGlzaENvbW1hbmQpXG5jbGkucmVnaXN0ZXIoVmVyc2lvbkNvbW1hbmQpXG5jbGkucmVnaXN0ZXIoSGVscENvbW1hbmQpXG5cbnZvaWQgY2xpLnJ1bkV4aXQocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4XSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FBQSxTQUFTQSxVQUFRLEdBQUc7QUFDbEI7QUFFQSxTQUFPLE9BQU8sVUFBVUEsWUFBVSxjQUFjLE9BQU8sVUFBVSxZQUFZLE9BQU8sT0FBTyxXQUFXLFNBQVVDLEtBQUc7QUFDakgsVUFBTyxPQUFPQTtFQUNmLElBQUcsU0FBVUEsS0FBRztBQUNmLFVBQU9BLE9BQUssY0FBYyxPQUFPLFVBQVVBLElBQUUsZ0JBQWdCLFVBQVVBLFFBQU0sT0FBTyxZQUFZLFdBQVcsT0FBT0E7RUFDbkgsR0FBRSxPQUFPLFFBQVEsYUFBYSxNQUFNLE9BQU8sUUFBUSxhQUFhLE9BQU8sU0FBU0QsVUFBUSxFQUFFO0NBQzVGO0NBQ0QsT0FBTyxVQUFVQSxXQUFTLE9BQU8sUUFBUSxhQUFhLE1BQU0sT0FBTyxRQUFRLGFBQWEsT0FBTzs7Ozs7O0NDVC9GLElBQUlFLDZCQUFpQztDQUNyQyxTQUFTQyxjQUFZLEdBQUcsR0FBRztBQUN6QixNQUFJLFlBQVlELFVBQVEsRUFBRSxJQUFJLENBQUMsRUFBRyxRQUFPO0VBQ3pDLElBQUksSUFBSSxFQUFFLE9BQU87QUFDakIsTUFBSSxLQUFLLE1BQU0sR0FBRztHQUNoQixJQUFJLElBQUksRUFBRSxLQUFLLEdBQUcsS0FBSyxVQUFVO0FBQ2pDLE9BQUksWUFBWUEsVUFBUSxFQUFFLENBQUUsUUFBTztBQUNuQyxTQUFNLElBQUksVUFBVTtFQUNyQjtBQUNELFVBQVEsYUFBYSxJQUFJLFNBQVMsUUFBUSxFQUFFO0NBQzdDO0NBQ0QsT0FBTyxVQUFVQyxlQUFhLE9BQU8sUUFBUSxhQUFhLE1BQU0sT0FBTyxRQUFRLGFBQWEsT0FBTzs7Ozs7O0NDWG5HLElBQUksMkJBQWlDO0NBQ3JDLElBQUk7Q0FDSixTQUFTQyxnQkFBYyxHQUFHO0VB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
4001
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwibmFtZXMiOlsiX3R5cGVvZiIsIm8iLCJfdHlwZW9mIiwidG9QcmltaXRpdmUiLCJ0b1Byb3BlcnR5S2V5IiwiX2RlZmluZVByb3BlcnR5Iiwib3B0aW9uczogQXJ0aWZhY3RzT3B0aW9ucyIsIm5hbWVzcGFjZTogc3RyaW5nIiwiZGVidWciLCJwYXRoOiBzdHJpbmciLCJwYXRoIiwicGljayIsIm86IE8iLCJwYXJ0aWFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IiwiZGVidWciLCJwa2dKc29uIiwiVEFSR0VUX0xJTktFUjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsIkNwdVRvTm9kZUFyY2g6IFJlY29yZDxzdHJpbmcsIE5vZGVKU0FyY2g+IiwiU3lzVG9Ob2RlUGxhdGZvcm06IFJlY29yZDxzdHJpbmcsIFBsYXRmb3JtPiIsIlVuaUFyY2hzQnlQbGF0Zm9ybTogUGFydGlhbDxSZWNvcmQ8UGxhdGZvcm0sIE5vZGVKU0FyY2hbXT4+IiwicmF3VHJpcGxlOiBzdHJpbmciLCJjcHU6IHN0cmluZyIsInN5czogc3RyaW5nIiwiYWJpOiBzdHJpbmcgfCBudWxsIiwidGFyZ2V0OiBzdHJpbmciLCJ2OiBzdHJpbmciLCJuYXBpVmVyc2lvbjogTmFwaVZlcnNpb24iLCJ2ZXJzaW9uczogTm9kZVZlcnNpb25bXSIsInJlcXVpcmVtZW50czogc3RyaW5nW10iLCJtYW5pZmVzdFBhdGg6IHN0cmluZyIsInJlc29sdmUiLCJwYXRoOiBzdHJpbmciLCJjb25maWdQYXRoPzogc3RyaW5nIiwicGF0aCIsInNlcGFyYXRlZENvbmZpZzogVXNlck5hcGlDb25maWcgfCB1bmRlZmluZWQiLCJuYXBpQ29uZmlnOiBOYXBpQ29uZmlnIiwidGFyZ2V0czogc3RyaW5nW10iLCJuYW1lOiBzdHJpbmciLCJiaW46IHN0cmluZyIsImJpbiIsImRlYnVnIiwibmFtZSIsImxpbmU6IFR5cGVEZWZMaW5lIiwiY29uc3RFbnVtOiBib29sZWFuIiwiaWRlbnQ6IG51bWJlciIsImFtYmllbnQ6IGJvb2xlYW4iLCJpbnRlcm1lZGlhdGVUeXBlRmlsZTogc3RyaW5nIiwiZXhwb3J0czogc3RyaW5nW10iLCJkZWZzIiwiZXhwb3J0cyIsImZpbGU6IHN0cmluZyIsImRlZnM6IFR5cGVEZWZMaW5lW10iLCJzcmM6IHN0cmluZyIsIm9wdGlvbnM6IE1pbmltYWxOYXBpT3B0aW9ucyIsImRlYnVnIiwidXNlck9wdGlvbnM6IEFydGlmYWN0c09wdGlvbnMiLCJkaXIiLCJyb290OiBzdHJpbmciLCJmaWxlcyIsImxvY2FsTmFtZTogc3RyaW5nIiwicGtnTmFtZTogc3RyaW5nIiwiaWRlbnRzOiBzdHJpbmdbXSIsInBhY2thZ2VWZXJzaW9uPzogc3RyaW5nIiwidHVwbGU6IHN0cmluZyIsIndhc2lGaWxlbmFtZTogc3RyaW5nIiwiZnMiLCJ3YXNtRmlsZU5hbWU6IHN0cmluZyIsInBhY2thZ2VOYW1lOiBzdHJpbmciLCJmczogYm9vbGVhbiIsImZzIiwiZGVidWciLCJyZXF1aXJlIiwicmF3T3B0aW9uczogQnVpbGRPcHRpb25zIiwib3B0aW9uczogUGFyc2VkQnVpbGRPcHRpb25zIiwibWV0YWRhdGE6IENhcmdvV29ya3NwYWNlTWV0YWRhdGEiLCJjcmF0ZTogQ3JhdGUiLCJjb25maWc6IE5hcGlDb25maWciLCJhbGlhczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsInZlcnNpb24iLCJyZXNvbHZlIiwiYWJpOiBzdHJpbmcgfCBudWxsIiwidHlwZURlZlRtcEZvbGRlcjogc3RyaW5nIiwiZXhwb3J0czogc3RyaW5nW10iLCJmaWxlcyIsImV4cG9ydHMiLCJpZGVudHM6IHN0cmluZ1tdIiwibmFtZSIsImRpc3RGaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCIsImVudjogc3RyaW5nIiwidmFsdWU6IHN0cmluZyIsInZhbHVlIiwiZGVidWciLCJvcHRpb25zOiBDcmVhdGVOcG1EaXJzT3B0aW9ucyIsImRlYnVnIiwidXNlck9wdGlvbnM6IENyZWF0ZU5wbURpcnNPcHRpb25zIiwibWtkaXJBc3luYyIsImRpcjogc3RyaW5nIiwicmF3TWtkaXJBc3luYyIsIndyaXRlRmlsZUFzeW5jIiwiZmlsZTogc3RyaW5nIiwiY29udGVudDogc3RyaW5nIiwicmF3V3JpdGVGaWxlQXN5bmMiLCJzY29wZWRQYWNrYWdlSnNvbjogQ29tbW9uUGFja2FnZUpzb25GaWVsZHMiLCJwaWNrIiwicGFyc2UiLCJwYWNrYWdlTmFtZTogc3RyaW5nIiwidGFyZ2V0OiBUYXJnZXQiLCJvcHRpb25zOiBOZXdPcHRpb25zIiwiY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbiIsIl9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyIsIl9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjIiwiX2Fzc2VydENsYXNzQnJhbmQiLCJhc3NlcnRDbGFzc0JyYW5kIiwidmFsdWUiLCJ0eXBlIiwidmFsdWUiLCJ2YWx1ZSIsInRhYmxlIiwicGFyc2UiLCJqb2luIiwibWVyZ2UiLCJmbG9hdCIsInBhaXIiLCJwYXJzZSIsIm9wdGlvbnM6IFJlbmFtZU9wdGlvbnMiLCJ1c2VyT3B0aW9uczogUmVuYW1lT3B0aW9ucyIsInBhcnNlVG9tbCIsInN0cmluZ2lmeVRvbWwiLCJ5YW1sUGFyc2UiLCJ5YW1sU3RyaW5naWZ5IiwiZGVidWciLCJyZXNvbHZlIiwicGFja2FnZU1hbmFnZXI6IFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2VyIiwiY2FjaGVEaXI6IHN0cmluZyIsInNyYzogc3RyaW5nIiwiZGVzdDogc3RyaW5nIiwiaW5jbHVkZVdhc2lCaW5kaW5nczogYm9vbGVhbiIsImZzIiwiZmlsZVBhdGg6IHN0cmluZyIsImVuYWJsZWRUYXJnZXRzOiBzdHJpbmdbXSIsInRhcmdldDogc3RyaW5nIiwieWFtbExvYWQiLCJzZXR0aW5nOiBhbnkiLCJqb2JzVG9SZW1vdmU6IHN0cmluZ1tdIiwibmVlZDogc3RyaW5nIiwieWFtbER1bXAiLCJvcHRpb25zOiBSYXdOZXdPcHRpb25zIiwidXNlck9wdGlvbnM6IFJhd05ld09wdGlvbnMiLCJwYXRoOiBzdHJpbmciLCJzdGF0IiwicGF0aCIsImZpbGVzIiwibmFtZTogc3RyaW5nIiwibmFtZSIsImRlYnVnIiwidGFyZ2V0UGF0aDogc3RyaW5nIiwiZGVmYXVsdE5hbWU6IHN0cmluZyIsInBhdGgiLCJvcHRpb25zOiBQcmVQdWJsaXNoT3B0aW9ucyIsIm9wdGlvbnM6IFZlcnNpb25PcHRpb25zIiwiZGVidWciLCJ1c2VyT3B0aW9uczogVmVyc2lvbk9wdGlvbnMiLCJkZWJ1ZyIsInVzZXJPcHRpb25zOiBQcmVQdWJsaXNoT3B0aW9ucyIsInBhY2thZ2VOYW1lOiBzdHJpbmciLCJ2ZXJzaW9uOiBzdHJpbmciLCJwYWNrYWdlTmFtZSIsInZlcnNpb24iLCJyZXBvIiwib3duZXIiLCJvY3Rva2l0IiwicGtnSW5mbyIsInBrZ0luZm86IFBhY2thZ2VJbmZvIHwgdW5kZWZpbmVkIiwidGFnOiBzdHJpbmciLCJuYW1lIiwibmFtZSIsIm9wdGlvbnM6IFVuaXZlcnNhbGl6ZU9wdGlvbnMiLCJ1bml2ZXJzYWxpemVyczogUGFydGlhbDxcbiAgUmVjb3JkPE5vZGVKUy5QbGF0Zm9ybSwgKGlucHV0czogc3RyaW5nW10sIG91dHB1dDogc3RyaW5nKSA9PiB2b2lkPlxuPiIsInVzZXJPcHRpb25zOiBVbml2ZXJzYWxpemVPcHRpb25zIl0sInNvdXJjZXMiOlsiLi4vLi4vbm9kZV9tb2R1bGVzL0BveGMtcHJvamVjdC9ydW50aW1lL3NyYy9oZWxwZXJzL3R5cGVvZi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9Ab3hjLXByb2plY3QvcnVudGltZS9zcmMvaGVscGVycy90b1ByaW1pdGl2ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9Ab3hjLXByb2plY3QvcnVudGltZS9zcmMvaGVscGVycy90b1Byb3BlcnR5S2V5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BveGMtcHJvamVjdC9ydW50aW1lL3NyYy9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwiLi4vc3JjL2RlZi9hcnRpZmFjdHMudHMiLCIuLi9zcmMvdXRpbHMvbG9nLnRzIiwiLi4vcGFja2FnZS5qc29uIiwiLi4vc3JjL3V0aWxzL21pc2MudHMiLCIuLi9zcmMvdXRpbHMvdGFyZ2V0LnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvbWV0YWRhdGEudHMiLCIuLi9zcmMvdXRpbHMvY29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2NhcmdvLnRzIiwiLi4vc3JjL3V0aWxzL3R5cGVnZW4udHMiLCIuLi9zcmMvdXRpbHMvcmVhZC1jb25maWcudHMiLCIuLi9zcmMvYXBpL2FydGlmYWN0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9hcnRpZmFjdHMudHMiLCIuLi9zcmMvYXBpL3RlbXBsYXRlcy9qcy1iaW5kaW5nLnRzIiwiLi4vc3JjL2FwaS90ZW1wbGF0ZXMvbG9hZC13YXNpLXRlbXBsYXRlLnRzIiwiLi4vc3JjL2FwaS90ZW1wbGF0ZXMvd2FzaS13b3JrZXItdGVtcGxhdGUudHMiLCIuLi9zcmMvYXBpL2J1aWxkLnRzIiwiLi4vc3JjL2RlZi9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC50cyIsIi4uL3NyYy9kZWYvY3JlYXRlLW5wbS1kaXJzLnRzIiwiLi4vc3JjL2FwaS9jcmVhdGUtbnBtLWRpcnMudHMiLCIuLi9zcmMvY29tbWFuZHMvY3JlYXRlLW5wbS1kaXJzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2hlbHAudHMiLCIuLi9zcmMvZGVmL25ldy50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9Ab3hjLXByb2plY3QvcnVudGltZS9zcmMvaGVscGVycy9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BveGMtcHJvamVjdC9ydW50aW1lL3NyYy9oZWxwZXJzL2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BveGMtcHJvamVjdC9ydW50aW1lL3NyYy9oZWxwZXJzL2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQG94Yy1wcm9qZWN0L3J1bnRpbWUvc3JjL2hlbHBlcnMvYXNzZXJ0Q2xhc3NCcmFuZC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9Ab3hjLXByb2plY3QvcnVudGltZS9zcmMvaGVscGVycy9jbGFzc1ByaXZhdGVGaWVsZEdldDIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHN0ZC90b21sL3N0cmluZ2lmeS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AanNyL3N0ZF9fY29sbGVjdGlvbnMvX3V0aWxzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bqc3Ivc3RkX19jb2xsZWN0aW9ucy9kZWVwX21lcmdlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BveGMtcHJvamVjdC9ydW50aW1lL3NyYy9oZWxwZXJzL2NsYXNzUHJpdmF0ZUZpZWxkU2V0Mi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9Ac3RkL3RvbWwvX3BhcnNlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9Ac3RkL3RvbWwvcGFyc2UuanMiLCIuLi9zcmMvZGVmL3JlbmFtZS50cyIsIi4uL3NyYy9hcGkvcmVuYW1lLnRzIiwiLi4vc3JjL2FwaS9uZXcudHMiLCIuLi9zcmMvY29tbWFuZHMvbmV3LnRzIiwiLi4vc3JjL2RlZi9wcmUtcHVibGlzaC50cyIsIi4uL3NyYy9kZWYvdmVyc2lvbi50cyIsIi4uL3NyYy9hcGkvdmVyc2lvbi50cyIsIi4uL3NyYy9hcGkvcHJlLXB1Ymxpc2gudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJlLXB1Ymxpc2gudHMiLCIuLi9zcmMvY29tbWFuZHMvcmVuYW1lLnRzIiwiLi4vc3JjL2RlZi91bml2ZXJzYWxpemUudHMiLCIuLi9zcmMvYXBpL3VuaXZlcnNhbGl6ZS50cyIsIi4uL3NyYy9jb21tYW5kcy91bml2ZXJzYWxpemUudHMiLCIuLi9zcmMvY29tbWFuZHMvdmVyc2lvbi50cyIsIi4uL3NyYy9jbGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG87XG4gIH0gOiBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvO1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIF90eXBlb2Yobyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCIuL3R5cGVvZi5qc1wiKVtcImRlZmF1bHRcIl07XG5mdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkge1xuICAgIHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxubW9kdWxlLmV4cG9ydHMgPSB0b1ByaW1pdGl2ZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoXCIuL3RvUHJpbWl0aXZlLmpzXCIpO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHRvUHJvcGVydHlLZXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoXCIuL3RvUHJvcGVydHlLZXkuanNcIik7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkge1xuICByZXR1cm4gKHIgPSB0b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHtcbiAgICB2YWx1ZTogdCxcbiAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIHdyaXRhYmxlOiAhMFxuICB9KSA6IGVbcl0gPSB0LCBlO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUFydGlmYWN0c0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHtcbiAgc3RhdGljIHBhdGhzID0gW1snYXJ0aWZhY3RzJ11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnQ29weSBhcnRpZmFjdHMgZnJvbSBHaXRodWIgQWN0aW9ucyBpbnRvIG5wbSBwYWNrYWdlcyBhbmQgcmVhZHkgdG8gcHVibGlzaCcsXG4gIH0pXG5cbiAgY3dkID0gT3B0aW9uLlN0cmluZygnLS1jd2QnLCBwcm9jZXNzLmN3ZCgpLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoJyxcbiAgfSlcblxuICBjb25maWdQYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1jb25maWctcGF0aCwtYycsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGUnLFxuICB9KVxuXG4gIHBhY2thZ2VKc29uUGF0aCA9IE9wdGlvbi5TdHJpbmcoJy0tcGFja2FnZS1qc29uLXBhdGgnLCAncGFja2FnZS5qc29uJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgcGFja2FnZS5qc29uYCcsXG4gIH0pXG5cbiAgb3V0cHV0RGlyID0gT3B0aW9uLlN0cmluZygnLS1vdXRwdXQtZGlyLC1vLC1kJywgJy4vYXJ0aWZhY3RzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGggdG8gdGhlIGZvbGRlciB3aGVyZSBhbGwgYnVpbHQgYC5ub2RlYCBmaWxlcyBwdXQsIHNhbWUgYXMgYC0tb3V0cHV0LWRpcmAgb2YgYnVpbGQgY29tbWFuZCcsXG4gIH0pXG5cbiAgbnBtRGlyID0gT3B0aW9uLlN0cmluZygnLS1ucG0tZGlyJywgJ25wbScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gdGhlIGZvbGRlciB3aGVyZSB0aGUgbnBtIHBhY2thZ2VzIHB1dCcsXG4gIH0pXG5cbiAgYnVpbGRPdXRwdXREaXI/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWJ1aWxkLW91dHB1dC1kaXInLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGF0aCB0byB0aGUgYnVpbGQgb3V0cHV0IGRpciwgb25seSBuZWVkZWQgd2hlbiB0YXJnZXRzIGNvbnRhaW5zIGB3YXNtMzItd2FzaS0qYCcsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgIGNvbmZpZ1BhdGg6IHRoaXMuY29uZmlnUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uUGF0aDogdGhpcy5wYWNrYWdlSnNvblBhdGgsXG4gICAgICBvdXRwdXREaXI6IHRoaXMub3V0cHV0RGlyLFxuICAgICAgbnBtRGlyOiB0aGlzLm5wbURpcixcbiAgICAgIGJ1aWxkT3V0cHV0RGlyOiB0aGlzLmJ1aWxkT3V0cHV0RGlyLFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvcHkgYXJ0aWZhY3RzIGZyb20gR2l0aHViIEFjdGlvbnMgaW50byBucG0gcGFja2FnZXMgYW5kIHJlYWR5IHRvIHB1Ymxpc2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcnRpZmFjdHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aFxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9jZXNzLmN3ZCgpXG4gICAqL1xuICBjd2Q/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGVcbiAgICovXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYHBhY2thZ2UuanNvbmBcbiAgICpcbiAgICogQGRlZmF1bHQgJ3BhY2thZ2UuanNvbidcbiAgICovXG4gIHBhY2thZ2VKc29uUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIGFsbCBidWlsdCBgLm5vZGVgIGZpbGVzIHB1dCwgc2FtZSBhcyBgLS1vdXRwdXQtZGlyYCBvZiBidWlsZCBjb21tYW5kXG4gICAqXG4gICAqIEBkZWZhdWx0ICcuL2FydGlmYWN0cydcbiAgICovXG4gIG91dHB1dERpcj86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0XG4gICAqXG4gICAqIEBkZWZhdWx0ICducG0nXG4gICAqL1xuICBucG1EaXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIGJ1aWxkIG91dHB1dCBkaXIsIG9ubHkgbmVlZGVkIHdoZW4gdGFyZ2V0cyBjb250YWlucyBgd2FzbTMyLXdhc2ktKmBcbiAgICovXG4gIGJ1aWxkT3V0cHV0RGlyPzogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRBcnRpZmFjdHNPcHRpb25zKG9wdGlvbnM6IEFydGlmYWN0c09wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgcGFja2FnZUpzb25QYXRoOiAncGFja2FnZS5qc29uJyxcbiAgICBvdXRwdXREaXI6ICcuL2FydGlmYWN0cycsXG4gICAgbnBtRGlyOiAnbnBtJyxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBjb2xvcnMgZnJvbSAnY29sb3JldHRlJ1xuaW1wb3J0IHJhd0RlYnVnIGZyb20gJ2RlYnVnJ1xuXG4vLyBkZWJ1ZygnJWknLCAnVGhpcyBpcyBhbiBpbmZvJylcbnJhd0RlYnVnLmZvcm1hdHRlcnMuaSA9ICh2KSA9PiB7XG4gIHJldHVybiBjb2xvcnMuZ3JlZW4odilcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ2RlYnVnJyB7XG4gIGludGVyZmFjZSBEZWJ1Z2dlciB7XG4gICAgaW5mbzogdHlwZW9mIGNvbnNvbGUuZXJyb3JcbiAgICB3YXJuOiB0eXBlb2YgY29uc29sZS5lcnJvclxuICAgIGVycm9yOiB0eXBlb2YgY29uc29sZS5lcnJvclxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWJ1Z0ZhY3RvcnkgPSAobmFtZXNwYWNlOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgZGVidWcgPSByYXdEZWJ1ZyhgbmFwaToke25hbWVzcGFjZX1gKVxuXG4gIGRlYnVnLmluZm8gPSAoLi4uYXJnczogYW55W10pID0+XG4gICAgY29uc29sZS5lcnJvcihjb2xvcnMuYmxhY2soY29sb3JzLmJnR3JlZW4oJyBJTkZPICcpKSwgLi4uYXJncylcbiAgZGVidWcud2FybiA9ICguLi5hcmdzOiBhbnlbXSkgPT5cbiAgICBjb25zb2xlLmVycm9yKGNvbG9ycy5ibGFjayhjb2xvcnMuYmdZZWxsb3coJyBXQVJOSU5HICcpKSwgLi4uYXJncylcbiAgZGVidWcuZXJyb3IgPSAoLi4uYXJnczogYW55W10pID0+XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNvbG9ycy53aGl0ZShjb2xvcnMuYmdSZWQoJyBFUlJPUiAnKSksXG4gICAgICAuLi5hcmdzLm1hcCgoYXJnKSA9PlxuICAgICAgICBhcmcgaW5zdGFuY2VvZiBFcnJvciA/IChhcmcuc3RhY2sgPz8gYXJnLm1lc3NhZ2UpIDogYXJnLFxuICAgICAgKSxcbiAgICApXG5cbiAgcmV0dXJuIGRlYnVnXG59XG5leHBvcnQgY29uc3QgZGVidWcgPSBkZWJ1Z0ZhY3RvcnkoJ3V0aWxzJylcbiIsIntcbiAgXCJuYW1lXCI6IFwiQG5hcGktcnMvY2xpXCIsXG4gIFwidmVyc2lvblwiOiBcIjMuMS41XCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJDbGkgdG9vbHMgZm9yIG5hcGktcnNcIixcbiAgXCJhdXRob3JcIjogXCJMb25nWWluYW4gPGx5bndla2xtQGdtYWlsLmNvbT5cIixcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9uYXBpLXJzL25hcGktcnNcIixcbiAgXCJsaWNlbnNlXCI6IFwiTUlUXCIsXG4gIFwidHlwZVwiOiBcIm1vZHVsZVwiLFxuICBcImVuZ2luZXNcIjoge1xuICAgIFwibm9kZVwiOiBcIj49IDE2XCJcbiAgfSxcbiAgXCJiaW5cIjoge1xuICAgIFwibmFwaVwiOiBcIi4vZGlzdC9jbGkuanNcIixcbiAgICBcIm5hcGktcmF3XCI6IFwiLi9jbGkubWpzXCJcbiAgfSxcbiAgXCJtYWluXCI6IFwiLi9kaXN0L2luZGV4LmNqc1wiLFxuICBcIm1vZHVsZVwiOiBcIi4vZGlzdC9pbmRleC5qc1wiLFxuICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgXCJleHBvcnRzXCI6IHtcbiAgICBcIi5cIjoge1xuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9pbmRleC5janNcIlxuICAgIH0sXG4gICAgXCIuL3BhY2thZ2UuanNvblwiOiBcIi4vcGFja2FnZS5qc29uXCJcbiAgfSxcbiAgXCJmaWxlc1wiOiBbXG4gICAgXCJkaXN0XCIsXG4gICAgXCJzcmNcIlxuICBdLFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImNsaVwiLFxuICAgIFwicnVzdFwiLFxuICAgIFwibmFwaVwiLFxuICAgIFwibi1hcGlcIixcbiAgICBcIm5vZGUtYXBpXCIsXG4gICAgXCJub2RlLWFkZG9uXCIsXG4gICAgXCJuZW9uXCJcbiAgXSxcbiAgXCJtYWludGFpbmVyc1wiOiBbXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiTG9uZ1lpbmFuXCIsXG4gICAgICBcImVtYWlsXCI6IFwibHlud2VrbG1AZ21haWwuY29tXCIsXG4gICAgICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL0Jyb29vb29va2x5blwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJmb3JlaGFsb1wiLFxuICAgICAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9mb3JlaGFsb1wiXG4gICAgfVxuICBdLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9uYXBpLXJzL25hcGktcnMuZ2l0XCJcbiAgfSxcbiAgXCJwdWJsaXNoQ29uZmlnXCI6IHtcbiAgICBcInJlZ2lzdHJ5XCI6IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvXCIsXG4gICAgXCJhY2Nlc3NcIjogXCJwdWJsaWNcIlxuICB9LFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL25hcGktcnMvbmFwaS1ycy9pc3N1ZXNcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAaW5xdWlyZXIvcHJvbXB0c1wiOiBcIl43LjQuMFwiLFxuICAgIFwiQG5hcGktcnMvY3Jvc3MtdG9vbGNoYWluXCI6IFwiXjEuMC4wXCIsXG4gICAgXCJAbmFwaS1ycy93YXNtLXRvb2xzXCI6IFwiXjEuMC4wXCIsXG4gICAgXCJAb2N0b2tpdC9yZXN0XCI6IFwiXjIyLjAuMFwiLFxuICAgIFwiY2xpcGFuaW9uXCI6IFwiXjQuMC4wLXJjLjRcIixcbiAgICBcImNvbG9yZXR0ZVwiOiBcIl4yLjAuMjBcIixcbiAgICBcImRlYnVnXCI6IFwiXjQuNC4wXCIsXG4gICAgXCJlbW5hcGlcIjogXCJeMS40LjBcIixcbiAgICBcImVzLXRvb2xraXRcIjogXCJeMS4zOS44XCIsXG4gICAgXCJmaW5kLXVwXCI6IFwiXjcuMC4wXCIsXG4gICAgXCJqcy15YW1sXCI6IFwiXjQuMS4wXCIsXG4gICAgXCJzZW12ZXJcIjogXCJeNy43LjFcIixcbiAgICBcInR5cGFuaW9uXCI6IFwiXjMuMTQuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBlbW5hcGkvY29yZVwiOiBcIl4xLjQuMFwiLFxuICAgIFwiQGVtbmFwaS9ydW50aW1lXCI6IFwiXjEuNC4wXCIsXG4gICAgXCJAb3hjLW5vZGUvY29yZVwiOiBcIl4wLjAuMzJcIixcbiAgICBcIkBzdGQvdG9tbFwiOiBcIm5wbTpAanNyL3N0ZF9fdG9tbEBeMS4wLjhcIixcbiAgICBcIkB0eXBlcy9kZWJ1Z1wiOiBcIl40LjEuMTJcIixcbiAgICBcIkB0eXBlcy9pbnF1aXJlclwiOiBcIl45LjAuN1wiLFxuICAgIFwiQHR5cGVzL2pzLXlhbWxcIjogXCJeNC4wLjlcIixcbiAgICBcIkB0eXBlcy9ub2RlXCI6IFwiXjIyLjEzLjE2XCIsXG4gICAgXCJAdHlwZXMvc2VtdmVyXCI6IFwiXjcuNy4wXCIsXG4gICAgXCJhdmFcIjogXCJeNi4yLjBcIixcbiAgICBcImVudi1wYXRoc1wiOiBcIl4zLjAuMFwiLFxuICAgIFwicHJldHRpZXJcIjogXCJeMy41LjNcIixcbiAgICBcInRzZG93blwiOiBcIl4wLjE0LjBcIixcbiAgICBcInRzbGliXCI6IFwiXjIuOC4xXCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuOC4yXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBlbW5hcGkvcnVudGltZVwiOiBcIl4xLjEuMFwiLFxuICAgIFwiZW1uYXBpXCI6IFwiXjEuMS4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzTWV0YVwiOiB7XG4gICAgXCJAZW1uYXBpL3J1bnRpbWVcIjoge1xuICAgICAgXCJvcHRpb25hbFwiOiB0cnVlXG4gICAgfSxcbiAgICBcImVtbmFwaVwiOiB7XG4gICAgICBcIm9wdGlvbmFsXCI6IHRydWVcbiAgICB9XG4gIH0sXG4gIFwiZnVuZGluZ1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0aHViXCIsXG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvQnJvb29vb29rbHluXCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcImNvZGVnZW5cIjogXCJub2RlIC0taW1wb3J0IEBveGMtbm9kZS9jb3JlL3JlZ2lzdGVyIC4vY29kZWdlbi9pbmRleC50c1wiLFxuICAgIFwiYnVpbGRcIjogXCJ0c2Rvd25cIixcbiAgICBcInRlc3RcIjogXCJub2RlIC0taW1wb3J0IEBveGMtbm9kZS9jb3JlL3JlZ2lzdGVyIC4uL25vZGVfbW9kdWxlcy9hdmEvZW50cnlwb2ludHMvY2xpLm1qc1wiXG4gIH0sXG4gIFwiYXZhXCI6IHtcbiAgICBcImV4dGVuc2lvbnNcIjoge1xuICAgICAgXCJ0c1wiOiBcIm1vZHVsZVwiXG4gICAgfSxcbiAgICBcInRpbWVvdXRcIjogXCIxbVwiLFxuICAgIFwiZmlsZXNcIjogW1xuICAgICAgXCIqKi9fX3Rlc3RzX18vKiovKi5zcGVjLnRzXCIsXG4gICAgICBcImUyZS8qKi8qLnNwZWMudHNcIlxuICAgIF1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZSxcbiAgY29weUZpbGUsXG4gIG1rZGlyLFxuICB1bmxpbmssXG4gIHN0YXQsXG4gIHJlYWRkaXIsXG59IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5cbmltcG9ydCBwa2dKc29uIGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbicgd2l0aCB7IHR5cGU6ICdqc29uJyB9XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4vbG9nLmpzJ1xuXG5leHBvcnQgY29uc3QgcmVhZEZpbGVBc3luYyA9IHByb21pc2lmeShyZWFkRmlsZSlcbmV4cG9ydCBjb25zdCB3cml0ZUZpbGVBc3luYyA9IHByb21pc2lmeSh3cml0ZUZpbGUpXG5leHBvcnQgY29uc3QgdW5saW5rQXN5bmMgPSBwcm9taXNpZnkodW5saW5rKVxuZXhwb3J0IGNvbnN0IGNvcHlGaWxlQXN5bmMgPSBwcm9taXNpZnkoY29weUZpbGUpXG5leHBvcnQgY29uc3QgbWtkaXJBc3luYyA9IHByb21pc2lmeShta2RpcilcbmV4cG9ydCBjb25zdCBzdGF0QXN5bmMgPSBwcm9taXNpZnkoc3RhdClcbmV4cG9ydCBjb25zdCByZWFkZGlyQXN5bmMgPSBwcm9taXNpZnkocmVhZGRpcilcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbGVFeGlzdHMocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHN0YXRBc3luYyhwYXRoKVxuICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgLmNhdGNoKCgpID0+IGZhbHNlKVxuICByZXR1cm4gZXhpc3RzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXJFeGlzdHNBc3luYyhwYXRoOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHN0YXRBc3luYyhwYXRoKVxuICAgIHJldHVybiBzdGF0cy5pc0RpcmVjdG9yeSgpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrPE8sIEsgZXh0ZW5kcyBrZXlvZiBPPihvOiBPLCAuLi5rZXlzOiBLW10pOiBQaWNrPE8sIEs+IHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgIGFjY1trZXldID0gb1trZXldXG4gICAgcmV0dXJuIGFjY1xuICB9LCB7fSBhcyBPKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUGFja2FnZUpzb24oXG4gIHBhdGg6IHN0cmluZyxcbiAgcGFydGlhbDogUmVjb3JkPHN0cmluZywgYW55Pixcbikge1xuICBjb25zdCBleGlzdHMgPSBhd2FpdCBmaWxlRXhpc3RzKHBhdGgpXG4gIGlmICghZXhpc3RzKSB7XG4gICAgZGVidWcoYEZpbGUgbm90IGV4aXN0cyAke3BhdGh9YClcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBvbGQgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlQXN5bmMocGF0aCwgJ3V0ZjgnKSlcbiAgYXdhaXQgd3JpdGVGaWxlQXN5bmMocGF0aCwgSlNPTi5zdHJpbmdpZnkoeyAuLi5vbGQsIC4uLnBhcnRpYWwgfSwgbnVsbCwgMikpXG59XG5cbmV4cG9ydCBjb25zdCBDTElfVkVSU0lPTiA9IHBrZ0pzb24udmVyc2lvblxuIiwiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5cbmV4cG9ydCB0eXBlIFBsYXRmb3JtID0gTm9kZUpTLlBsYXRmb3JtIHwgJ3dhc20nIHwgJ3dhc2knIHwgJ29wZW5oYXJtb255J1xuXG5leHBvcnQgY29uc3QgVU5JVkVSU0FMX1RBUkdFVFMgPSB7XG4gICd1bml2ZXJzYWwtYXBwbGUtZGFyd2luJzogWydhYXJjaDY0LWFwcGxlLWRhcndpbicsICd4ODZfNjQtYXBwbGUtZGFyd2luJ10sXG59IGFzIGNvbnN0XG5cbmNvbnN0IFNVQl9TWVNURU1TID0gbmV3IFNldChbJ2FuZHJvaWQnLCAnb2hvcyddKVxuXG5leHBvcnQgY29uc3QgQVZBSUxBQkxFX1RBUkdFVFMgPSBbXG4gICdhYXJjaDY0LWFwcGxlLWRhcndpbicsXG4gICdhYXJjaDY0LWxpbnV4LWFuZHJvaWQnLFxuICAnYWFyY2g2NC11bmtub3duLWxpbnV4LWdudScsXG4gICdhYXJjaDY0LXVua25vd24tbGludXgtbXVzbCcsXG4gICdhYXJjaDY0LXVua25vd24tbGludXgtb2hvcycsXG4gICdhYXJjaDY0LXBjLXdpbmRvd3MtbXN2YycsXG4gICd4ODZfNjQtYXBwbGUtZGFyd2luJyxcbiAgJ3g4Nl82NC1wYy13aW5kb3dzLW1zdmMnLFxuICAneDg2XzY0LXVua25vd24tbGludXgtZ251JyxcbiAgJ3g4Nl82NC11bmtub3duLWxpbnV4LW11c2wnLFxuICAneDg2XzY0LXVua25vd24tbGludXgtb2hvcycsXG4gICd4ODZfNjQtdW5rbm93bi1mcmVlYnNkJyxcbiAgJ2k2ODYtcGMtd2luZG93cy1tc3ZjJyxcbiAgJ2FybXY3LXVua25vd24tbGludXgtZ251ZWFiaWhmJyxcbiAgJ2FybXY3LXVua25vd24tbGludXgtbXVzbGVhYmloZicsXG4gICdhcm12Ny1saW51eC1hbmRyb2lkZWFiaScsXG4gICd1bml2ZXJzYWwtYXBwbGUtZGFyd2luJyxcbiAgJ3Jpc2N2NjRnYy11bmtub3duLWxpbnV4LWdudScsXG4gICdwb3dlcnBjNjRsZS11bmtub3duLWxpbnV4LWdudScsXG4gICdzMzkweC11bmtub3duLWxpbnV4LWdudScsXG4gICd3YXNtMzItd2FzaS1wcmV2aWV3MS10aHJlYWRzJyxcbiAgJ3dhc20zMi13YXNpcDEtdGhyZWFkcycsXG5dIGFzIGNvbnN0XG5cbmV4cG9ydCB0eXBlIFRhcmdldFRyaXBsZSA9ICh0eXBlb2YgQVZBSUxBQkxFX1RBUkdFVFMpW251bWJlcl1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVEFSR0VUUyA9IFtcbiAgJ3g4Nl82NC1hcHBsZS1kYXJ3aW4nLFxuICAnYWFyY2g2NC1hcHBsZS1kYXJ3aW4nLFxuICAneDg2XzY0LXBjLXdpbmRvd3MtbXN2YycsXG4gICd4ODZfNjQtdW5rbm93bi1saW51eC1nbnUnLFxuXSBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgVEFSR0VUX0xJTktFUjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2FhcmNoNjQtdW5rbm93bi1saW51eC1tdXNsJzogJ2FhcmNoNjQtbGludXgtbXVzbC1nY2MnLFxuICAncmlzY3Y2NGdjLXVua25vd24tbGludXgtZ251JzogJ3Jpc2N2NjQtbGludXgtZ251LWdjYycsXG4gICdwb3dlcnBjNjRsZS11bmtub3duLWxpbnV4LWdudSc6ICdwb3dlcnBjNjRsZS1saW51eC1nbnUtZ2NjJyxcbiAgJ3MzOTB4LXVua25vd24tbGludXgtZ251JzogJ3MzOTB4LWxpbnV4LWdudS1nY2MnLFxufVxuXG4vLyBodHRwczovL25vZGVqcy5vcmcvYXBpL3Byb2Nlc3MuaHRtbCNwcm9jZXNzX3Byb2Nlc3NfYXJjaFxudHlwZSBOb2RlSlNBcmNoID1cbiAgfCAnYXJtJ1xuICB8ICdhcm02NCdcbiAgfCAnaWEzMidcbiAgfCAnbWlwcydcbiAgfCAnbWlwc2VsJ1xuICB8ICdwcGMnXG4gIHwgJ3BwYzY0J1xuICB8ICdyaXNjdjY0J1xuICB8ICdzMzkwJ1xuICB8ICdzMzkweCdcbiAgfCAneDMyJ1xuICB8ICd4NjQnXG4gIHwgJ3VuaXZlcnNhbCdcbiAgfCAnd2FzbTMyJ1xuXG5jb25zdCBDcHVUb05vZGVBcmNoOiBSZWNvcmQ8c3RyaW5nLCBOb2RlSlNBcmNoPiA9IHtcbiAgeDg2XzY0OiAneDY0JyxcbiAgYWFyY2g2NDogJ2FybTY0JyxcbiAgaTY4NjogJ2lhMzInLFxuICBhcm12NzogJ2FybScsXG4gIHJpc2N2NjRnYzogJ3Jpc2N2NjQnLFxuICBwb3dlcnBjNjRsZTogJ3BwYzY0Jyxcbn1cblxuZXhwb3J0IGNvbnN0IE5vZGVBcmNoVG9DcHU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIHg2NDogJ3g4Nl82NCcsXG4gIGFybTY0OiAnYWFyY2g2NCcsXG4gIGlhMzI6ICdpNjg2JyxcbiAgYXJtOiAnYXJtdjcnLFxuICByaXNjdjY0OiAncmlzY3Y2NGdjJyxcbiAgcHBjNjQ6ICdwb3dlcnBjNjRsZScsXG59XG5cbmNvbnN0IFN5c1RvTm9kZVBsYXRmb3JtOiBSZWNvcmQ8c3RyaW5nLCBQbGF0Zm9ybT4gPSB7XG4gIGxpbnV4OiAnbGludXgnLFxuICBmcmVlYnNkOiAnZnJlZWJzZCcsXG4gIGRhcndpbjogJ2RhcndpbicsXG4gIHdpbmRvd3M6ICd3aW4zMicsXG4gIG9ob3M6ICdvcGVuaGFybW9ueScsXG59XG5cbmV4cG9ydCBjb25zdCBVbmlBcmNoc0J5UGxhdGZvcm06IFBhcnRpYWw8UmVjb3JkPFBsYXRmb3JtLCBOb2RlSlNBcmNoW10+PiA9IHtcbiAgZGFyd2luOiBbJ3g2NCcsICdhcm02NCddLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldCB7XG4gIHRyaXBsZTogc3RyaW5nXG4gIHBsYXRmb3JtQXJjaEFCSTogc3RyaW5nXG4gIHBsYXRmb3JtOiBQbGF0Zm9ybVxuICBhcmNoOiBOb2RlSlNBcmNoXG4gIGFiaTogc3RyaW5nIHwgbnVsbFxufVxuXG4vKipcbiAqIEEgdHJpcGxlIGlzIGEgc3BlY2lmaWMgZm9ybWF0IGZvciBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cbiAqIFRyaXBsZXMgbWF5IGJlIHJlZmVycmVkIHRvIGFzIGEgdGFyZ2V0IHRyaXBsZSB3aGljaCBpcyB0aGUgYXJjaGl0ZWN0dXJlIGZvciB0aGUgYXJ0aWZhY3QgcHJvZHVjZWQsIGFuZCB0aGUgaG9zdCB0cmlwbGUgd2hpY2ggaXMgdGhlIGFyY2hpdGVjdHVyZSB0aGF0IHRoZSBjb21waWxlciBpcyBydW5uaW5nIG9uLlxuICogVGhlIGdlbmVyYWwgZm9ybWF0IG9mIHRoZSB0cmlwbGUgaXMgYDxhcmNoPjxzdWI+LTx2ZW5kb3I+LTxzeXM+LTxhYmk+YCB3aGVyZTpcbiAqICAgLSBgYXJjaGAgPSBUaGUgYmFzZSBDUFUgYXJjaGl0ZWN0dXJlLCBmb3IgZXhhbXBsZSBgeDg2XzY0YCwgYGk2ODZgLCBgYXJtYCwgYHRodW1iYCwgYG1pcHNgLCBldGMuXG4gKiAgIC0gYHN1YmAgPSBUaGUgQ1BVIHN1Yi1hcmNoaXRlY3R1cmUsIGZvciBleGFtcGxlIGBhcm1gIGhhcyBgdjdgLCBgdjdzYCwgYHY1dGVgLCBldGMuXG4gKiAgIC0gYHZlbmRvcmAgPSBUaGUgdmVuZG9yLCBmb3IgZXhhbXBsZSBgdW5rbm93bmAsIGBhcHBsZWAsIGBwY2AsIGBudmlkaWFgLCBldGMuXG4gKiAgIC0gYHN5c2AgPSBUaGUgc3lzdGVtIG5hbWUsIGZvciBleGFtcGxlIGBsaW51eGAsIGB3aW5kb3dzYCwgYGRhcndpbmAsIGV0Yy4gbm9uZSBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgYmFyZS1tZXRhbCB3aXRob3V0IGFuIE9TLlxuICogICAtIGBhYmlgID0gVGhlIEFCSSwgZm9yIGV4YW1wbGUgYGdudWAsIGBhbmRyb2lkYCwgYGVhYmlgLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRyaXBsZShyYXdUcmlwbGU6IHN0cmluZyk6IFRhcmdldCB7XG4gIGlmIChcbiAgICByYXdUcmlwbGUgPT09ICd3YXNtMzItd2FzaScgfHxcbiAgICByYXdUcmlwbGUgPT09ICd3YXNtMzItd2FzaS1wcmV2aWV3MS10aHJlYWRzJyB8fFxuICAgIHJhd1RyaXBsZS5zdGFydHNXaXRoKCd3YXNtMzItd2FzaXAnKVxuICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJpcGxlOiByYXdUcmlwbGUsXG4gICAgICBwbGF0Zm9ybUFyY2hBQkk6ICd3YXNtMzItd2FzaScsXG4gICAgICBwbGF0Zm9ybTogJ3dhc2knLFxuICAgICAgYXJjaDogJ3dhc20zMicsXG4gICAgICBhYmk6ICd3YXNpJyxcbiAgICB9XG4gIH1cbiAgY29uc3QgdHJpcGxlID0gcmF3VHJpcGxlLmVuZHNXaXRoKCdlYWJpJylcbiAgICA/IGAke3Jhd1RyaXBsZS5zbGljZSgwLCAtNCl9LWVhYmlgXG4gICAgOiByYXdUcmlwbGVcbiAgY29uc3QgdHJpcGxlcyA9IHRyaXBsZS5zcGxpdCgnLScpXG4gIGxldCBjcHU6IHN0cmluZ1xuICBsZXQgc3lzOiBzdHJpbmdcbiAgbGV0IGFiaTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgaWYgKHRyaXBsZXMubGVuZ3RoID09PSAyKSB7XG4gICAgLy8gYWFyY2g2NC1mdWNoc2lhXG4gICAgLy8gXiBjcHUgICBeIHN5c1xuICAgIDtbY3B1LCBzeXNdID0gdHJpcGxlc1xuICB9IGVsc2Uge1xuICAgIC8vIGFhcmNoNjQtdW5rbm93bi1saW51eC1tdXNsXG4gICAgLy8gXiBjcHUgICBedmVuZG9yIF4gc3lzIF4gYWJpXG4gICAgLy8gYWFyY2g2NC1hcHBsZS1kYXJ3aW5cbiAgICAvLyBeIGNwdSAgICAgICAgIF4gc3lzICAoYWJpIGlzIE5vbmUpXG4gICAgO1tjcHUsICwgc3lzLCBhYmkgPSBudWxsXSA9IHRyaXBsZXNcbiAgfVxuXG4gIGlmIChhYmkgJiYgU1VCX1NZU1RFTVMuaGFzKGFiaSkpIHtcbiAgICBzeXMgPSBhYmlcbiAgICBhYmkgPSBudWxsXG4gIH1cbiAgY29uc3QgcGxhdGZvcm0gPSBTeXNUb05vZGVQbGF0Zm9ybVtzeXNdID8/IChzeXMgYXMgUGxhdGZvcm0pXG4gIGNvbnN0IGFyY2ggPSBDcHVUb05vZGVBcmNoW2NwdV0gPz8gKGNwdSBhcyBOb2RlSlNBcmNoKVxuXG4gIHJldHVybiB7XG4gICAgdHJpcGxlOiByYXdUcmlwbGUsXG4gICAgcGxhdGZvcm1BcmNoQUJJOiBhYmkgPyBgJHtwbGF0Zm9ybX0tJHthcmNofS0ke2FiaX1gIDogYCR7cGxhdGZvcm19LSR7YXJjaH1gLFxuICAgIHBsYXRmb3JtLFxuICAgIGFyY2gsXG4gICAgYWJpLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTeXN0ZW1EZWZhdWx0VGFyZ2V0KCk6IFRhcmdldCB7XG4gIGNvbnN0IGhvc3QgPSBleGVjU3luYyhgcnVzdGMgLXZWYCwge1xuICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gIH0pXG4gICAgLnRvU3RyaW5nKCd1dGY4JylcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLmZpbmQoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aCgnaG9zdDogJykpXG4gIGNvbnN0IHRyaXBsZSA9IGhvc3Q/LnNsaWNlKCdob3N0OiAnLmxlbmd0aClcbiAgaWYgKCF0cmlwbGUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW4gbm90IHBhcnNlIHRhcmdldCB0cmlwbGUgZnJvbSBob3N0YClcbiAgfVxuICByZXR1cm4gcGFyc2VUcmlwbGUodHJpcGxlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0TGlua2VyKHRhcmdldDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFRBUkdFVF9MSU5LRVJbdGFyZ2V0XVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFyZ2V0VG9FbnZWYXIodGFyZ2V0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGFyZ2V0LnJlcGxhY2UoLy0vZywgJ18nKS50b1VwcGVyQ2FzZSgpXG59XG4iLCJleHBvcnQgZW51bSBOYXBpVmVyc2lvbiB7XG4gIE5hcGkxID0gMSxcbiAgTmFwaTIsXG4gIE5hcGkzLFxuICBOYXBpNCxcbiAgTmFwaTUsXG4gIE5hcGk2LFxuICBOYXBpNyxcbiAgTmFwaTgsXG4gIE5hcGk5LFxufVxuXG4vLy8gYmVjYXVzZSBub2RlIHN1cHBvcnQgbmV3IG5hcGkgdmVyc2lvbiBpbiBzb21lIG1pbm9yIHZlcnNpb24gdXBkYXRlcywgc28gd2UgbWlnaHQgbWVldCBzdWNoIHNpdHVhdGlvbjpcbi8vLyBgbm9kZSB2MTAuMjAuMGAgc3VwcG9ydHMgYG5hcGk1YCBhbmQgYG5hcGk2YCwgYnV0IGBub2RlIHYxMi4wLjBgIG9ubHkgc3VwcG9ydCBgbmFwaTRgLFxuLy8vIGJ5IHdoaWNoLCB3ZSBjYW4gbm90IHRlbGwgZGlyZWN0bHkgbmFwaSB2ZXJzaW9uIHN1cHBvcnRsZXNzIGZyb20gbm9kZSB2ZXJzaW9uIGRpcmVjdGx5LlxuY29uc3QgTkFQSV9WRVJTSU9OX01BVFJJWCA9IG5ldyBNYXA8TmFwaVZlcnNpb24sIHN0cmluZz4oW1xuICBbTmFwaVZlcnNpb24uTmFwaTEsICc4LjYuMCB8IDkuMC4wIHwgMTAuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpMiwgJzguMTAuMCB8IDkuMy4wIHwgMTAuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpMywgJzYuMTQuMiB8IDguMTEuMiB8IDkuMTEuMCB8IDEwLjAuMCddLFxuICBbTmFwaVZlcnNpb24uTmFwaTQsICcxMC4xNi4wIHwgMTEuOC4wIHwgMTIuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpNSwgJzEwLjE3LjAgfCAxMi4xMS4wIHwgMTMuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpNiwgJzEwLjIwLjAgfCAxMi4xNy4wIHwgMTQuMC4wJ10sXG4gIFtOYXBpVmVyc2lvbi5OYXBpNywgJzEwLjIzLjAgfCAxMi4xOS4wIHwgMTQuMTIuMCB8IDE1LjAuMCddLFxuICBbTmFwaVZlcnNpb24uTmFwaTgsICcxMi4yMi4wIHwgMTQuMTcuMCB8IDE1LjEyLjAgfCAxNi4wLjAnXSxcbiAgW05hcGlWZXJzaW9uLk5hcGk5LCAnMTguMTcuMCB8IDIwLjMuMCB8IDIxLjEuMCddLFxuXSlcblxuaW50ZXJmYWNlIE5vZGVWZXJzaW9uIHtcbiAgbWFqb3I6IG51bWJlclxuICBtaW5vcjogbnVtYmVyXG4gIHBhdGNoOiBudW1iZXJcbn1cblxuZnVuY3Rpb24gcGFyc2VOb2RlVmVyc2lvbih2OiBzdHJpbmcpOiBOb2RlVmVyc2lvbiB7XG4gIGNvbnN0IG1hdGNoZXMgPSB2Lm1hdGNoKC92PyhbMC05XSspXFwuKFswLTldKylcXC4oWzAtOV0rKS9pKVxuXG4gIGlmICghbWF0Y2hlcykge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBub2RlIHZlcnNpb24gbnVtYmVyOiAnICsgdilcbiAgfVxuXG4gIGNvbnN0IFssIG1ham9yLCBtaW5vciwgcGF0Y2hdID0gbWF0Y2hlc1xuXG4gIHJldHVybiB7XG4gICAgbWFqb3I6IHBhcnNlSW50KG1ham9yKSxcbiAgICBtaW5vcjogcGFyc2VJbnQobWlub3IpLFxuICAgIHBhdGNoOiBwYXJzZUludChwYXRjaCksXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWlyZWROb2RlVmVyc2lvbnMobmFwaVZlcnNpb246IE5hcGlWZXJzaW9uKTogTm9kZVZlcnNpb25bXSB7XG4gIGNvbnN0IHJlcXVpcmVtZW50ID0gTkFQSV9WRVJTSU9OX01BVFJJWC5nZXQobmFwaVZlcnNpb24pXG5cbiAgaWYgKCFyZXF1aXJlbWVudCkge1xuICAgIHJldHVybiBbcGFyc2VOb2RlVmVyc2lvbignMTAuMC4wJyldXG4gIH1cblxuICByZXR1cm4gcmVxdWlyZW1lbnQuc3BsaXQoJ3wnKS5tYXAocGFyc2VOb2RlVmVyc2lvbilcbn1cblxuZnVuY3Rpb24gdG9FbmdpbmVSZXF1aXJlbWVudCh2ZXJzaW9uczogTm9kZVZlcnNpb25bXSk6IHN0cmluZyB7XG4gIGNvbnN0IHJlcXVpcmVtZW50czogc3RyaW5nW10gPSBbXVxuICB2ZXJzaW9ucy5mb3JFYWNoKCh2LCBpKSA9PiB7XG4gICAgbGV0IHJlcSA9ICcnXG4gICAgaWYgKGkgIT09IDApIHtcbiAgICAgIGNvbnN0IGxhc3RWZXJzaW9uID0gdmVyc2lvbnNbaSAtIDFdXG4gICAgICByZXEgKz0gYDwgJHtsYXN0VmVyc2lvbi5tYWpvciArIDF9YFxuICAgIH1cblxuICAgIHJlcSArPSBgJHtpID09PSAwID8gJycgOiAnIHx8ICd9Pj0gJHt2Lm1ham9yfS4ke3YubWlub3J9LiR7di5wYXRjaH1gXG4gICAgcmVxdWlyZW1lbnRzLnB1c2gocmVxKVxuICB9KVxuXG4gIHJldHVybiByZXF1aXJlbWVudHMuam9pbignICcpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuYXBpRW5naW5lUmVxdWlyZW1lbnQobmFwaVZlcnNpb246IE5hcGlWZXJzaW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvRW5naW5lUmVxdWlyZW1lbnQocmVxdWlyZWROb2RlVmVyc2lvbnMobmFwaVZlcnNpb24pKVxufVxuIiwiaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcblxuZXhwb3J0IHR5cGUgQ3JhdGVUYXJnZXRLaW5kID1cbiAgfCAnYmluJ1xuICB8ICdleGFtcGxlJ1xuICB8ICd0ZXN0J1xuICB8ICdiZW5jaCdcbiAgfCAnbGliJ1xuICB8ICdybGliJ1xuICB8ICdjZHlsaWInXG4gIHwgJ2N1c3RvbS1idWlsZCdcblxuZXhwb3J0IGludGVyZmFjZSBDcmF0ZVRhcmdldCB7XG4gIG5hbWU6IHN0cmluZ1xuICBraW5kOiBDcmF0ZVRhcmdldEtpbmRbXVxuICBjcmF0ZV90eXBlczogQ3JhdGVUYXJnZXRLaW5kW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmF0ZSB7XG4gIGlkOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIHNyY19wYXRoOiBzdHJpbmdcbiAgdmVyc2lvbjogc3RyaW5nXG4gIGVkaXRpb246IHN0cmluZ1xuICB0YXJnZXRzOiBDcmF0ZVRhcmdldFtdXG4gIGZlYXR1cmVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgbWFuaWZlc3RfcGF0aDogc3RyaW5nXG4gIGRlcGVuZGVuY2llczogQXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIHNvdXJjZTogc3RyaW5nXG4gICAgcmVxOiBzdHJpbmdcbiAgICBraW5kOiBzdHJpbmcgfCBudWxsXG4gICAgcmVuYW1lOiBzdHJpbmcgfCBudWxsXG4gICAgb3B0aW9uYWw6IGJvb2xlYW5cbiAgICB1c2VzX2RlZmF1bHRfZmVhdHVyZXM6IGJvb2xlYW5cbiAgICBmZWF0dXJlczogc3RyaW5nW11cbiAgICB0YXJnZXQ6IHN0cmluZyB8IG51bGxcbiAgICByZWdpc3RyeTogc3RyaW5nIHwgbnVsbFxuICB9PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhcmdvV29ya3NwYWNlTWV0YWRhdGEge1xuICB2ZXJzaW9uOiBudW1iZXJcbiAgcGFja2FnZXM6IENyYXRlW11cbiAgd29ya3NwYWNlX21lbWJlcnM6IHN0cmluZ1tdXG4gIHRhcmdldF9kaXJlY3Rvcnk6IHN0cmluZ1xuICB3b3Jrc3BhY2Vfcm9vdDogc3RyaW5nXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZU1ldGFkYXRhKG1hbmlmZXN0UGF0aDogc3RyaW5nKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBjcmF0ZSBmb3VuZCBpbiBtYW5pZmVzdDogJHttYW5pZmVzdFBhdGh9YClcbiAgfVxuXG4gIGNvbnN0IGNoaWxkUHJvY2VzcyA9IHNwYXduKFxuICAgICdjYXJnbycsXG4gICAgWydtZXRhZGF0YScsICctLW1hbmlmZXN0LXBhdGgnLCBtYW5pZmVzdFBhdGgsICctLWZvcm1hdC12ZXJzaW9uJywgJzEnXSxcbiAgICB7IHN0ZGlvOiAncGlwZScgfSxcbiAgKVxuXG4gIGxldCBzdGRvdXQgPSAnJ1xuICBsZXQgc3RkZXJyID0gJydcbiAgbGV0IHN0YXR1cyA9IDBcbiAgbGV0IGVycm9yID0gbnVsbFxuXG4gIGNoaWxkUHJvY2Vzcy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgIHN0ZG91dCArPSBkYXRhXG4gIH0pXG5cbiAgY2hpbGRQcm9jZXNzLnN0ZGVyci5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgc3RkZXJyICs9IGRhdGFcbiAgfSlcblxuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNoaWxkUHJvY2Vzcy5vbignY2xvc2UnLCAoY29kZSkgPT4ge1xuICAgICAgc3RhdHVzID0gY29kZSA/PyAwXG4gICAgICByZXNvbHZlKClcbiAgICB9KVxuICB9KVxuXG4gIGlmIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcignY2FyZ28gbWV0YWRhdGEgZmFpbGVkIHRvIHJ1bicsIHsgY2F1c2U6IGVycm9yIH0pXG4gIH1cbiAgaWYgKHN0YXR1cyAhPT0gMCkge1xuICAgIGNvbnN0IHNpbXBsZU1lc3NhZ2UgPSBgY2FyZ28gbWV0YWRhdGEgZXhpdGVkIHdpdGggY29kZSAke3N0YXR1c31gXG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3NpbXBsZU1lc3NhZ2V9IGFuZCBlcnJvciBtZXNzYWdlOlxcblxcbiR7c3RkZXJyfWAsIHtcbiAgICAgIGNhdXNlOiBuZXcgRXJyb3Ioc2ltcGxlTWVzc2FnZSksXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3Rkb3V0KSBhcyBDYXJnb1dvcmtzcGFjZU1ldGFkYXRhXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBjYXJnbyBtZXRhZGF0YSBKU09OJywgeyBjYXVzZTogZSB9KVxuICB9XG59XG4iLCJpbXBvcnQgeyB1bmRlcmxpbmUsIHllbGxvdyB9IGZyb20gJ2NvbG9yZXR0ZSdcbmltcG9ydCB7IG1lcmdlLCBvbWl0IH0gZnJvbSAnZXMtdG9vbGtpdCdcblxuaW1wb3J0IHsgZmlsZUV4aXN0cywgcmVhZEZpbGVBc3luYyB9IGZyb20gJy4vbWlzYy5qcydcbmltcG9ydCB7IERFRkFVTFRfVEFSR0VUUywgcGFyc2VUcmlwbGUsIFRhcmdldCB9IGZyb20gJy4vdGFyZ2V0LmpzJ1xuXG5leHBvcnQgdHlwZSBWYWx1ZU9mQ29uc3RBcnJheTxUPiA9IFRbRXhjbHVkZTxrZXlvZiBULCBrZXlvZiBBcnJheTxhbnk+Pl1cblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2VycyA9IFsneWFybicsICdwbnBtJ10gYXMgY29uc3RcbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRUZXN0RnJhbWV3b3JrcyA9IFsnYXZhJ10gYXMgY29uc3RcblxuZXhwb3J0IHR5cGUgU3VwcG9ydGVkUGFja2FnZU1hbmFnZXIgPSBWYWx1ZU9mQ29uc3RBcnJheTxcbiAgdHlwZW9mIFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2Vyc1xuPlxuZXhwb3J0IHR5cGUgU3VwcG9ydGVkVGVzdEZyYW1ld29yayA9IFZhbHVlT2ZDb25zdEFycmF5PFxuICB0eXBlb2YgU3VwcG9ydGVkVGVzdEZyYW1ld29ya3Ncbj5cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyTmFwaUNvbmZpZyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBiaW5hcnkgdG8gYmUgZ2VuZXJhdGVkLCBkZWZhdWx0IHRvIGBpbmRleGBcbiAgICovXG4gIGJpbmFyeU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIG5wbSBwYWNrYWdlLCBkZWZhdWx0IHRvIHRoZSBuYW1lIG9mIHJvb3QgcGFja2FnZS5qc29uIG5hbWVcbiAgICpcbiAgICogQWx3YXlzIGdpdmVuIGBAc2NvcGUvcGtnYCBhbmQgYXJjaCBzdWZmaXggd2lsbCBiZSBhcHBlbmRlZCBsaWtlIGBAc2NvcGUvcGtnLWxpbnV4LWdudS14NjRgXG4gICAqL1xuICBwYWNrYWdlTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogQWxsIHRhcmdldHMgdGhlIGNyYXRlIHdpbGwgYmUgY29tcGlsZWQgZm9yXG4gICAqL1xuICB0YXJnZXRzPzogc3RyaW5nW11cblxuICAvKipcbiAgICogVGhlIG5wbSBjbGllbnQgcHJvamVjdCB1c2VzLlxuICAgKi9cbiAgbnBtQ2xpZW50Pzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZ2VuZXJhdGUgY29uc3QgZW51bSBmb3IgdHlwZXNjcmlwdCBiaW5kaW5nc1xuICAgKi9cbiAgY29uc3RFbnVtPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBkdHMgaGVhZGVyIHByZXBlbmQgdG8gdGhlIGdlbmVyYXRlZCBkdHMgZmlsZVxuICAgKi9cbiAgZHRzSGVhZGVyPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIGR0cyBoZWFkZXIgZmlsZSBwYXRoIHRvIGJlIHByZXBlbmRlZCB0byB0aGUgZ2VuZXJhdGVkIGR0cyBmaWxlXG4gICAqIGlmIGJvdGggZHRzSGVhZGVyIGFuZCBkdHNIZWFkZXJGaWxlIGFyZSBwcm92aWRlZCwgZHRzSGVhZGVyRmlsZSB3aWxsIGJlIHVzZWRcbiAgICovXG4gIGR0c0hlYWRlckZpbGU/OiBzdHJpbmdcblxuICAvKipcbiAgICogd2FzbSBjb21waWxhdGlvbiBvcHRpb25zXG4gICAqL1xuICB3YXNtPzoge1xuICAgIC8qKlxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViQXNzZW1ibHkvSmF2YVNjcmlwdF9pbnRlcmZhY2UvTWVtb3J5XG4gICAgICogQGRlZmF1bHQgNDAwMCBwYWdlcyAoMjU2TWlCKVxuICAgICAqL1xuICAgIGluaXRpYWxNZW1vcnk/OiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBAZGVmYXVsdCA2NTUzNiBwYWdlcyAoNEdpQilcbiAgICAgKi9cbiAgICBtYXhpbXVtTWVtb3J5PzogbnVtYmVyXG5cbiAgICAvKipcbiAgICAgKiBCcm93c2VyIHdhc20gYmluZGluZyBjb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYnJvd3Nlcjoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBmcyBtb2R1bGUgaW4gYnJvd3NlclxuICAgICAgICovXG4gICAgICBmcz86IGJvb2xlYW5cbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBpbml0aWFsaXplIHdhc20gYXN5bmNocm9ub3VzbHlcbiAgICAgICAqL1xuICAgICAgYXN5bmNJbml0PzogYm9vbGVhblxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIGluamVjdCBgYnVmZmVyYCB0byBlbW5hcGkgY29udGV4dFxuICAgICAgICovXG4gICAgICBidWZmZXI/OiBib29sZWFuXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIGJpbmFyeU5hbWUgaW5zdGVhZFxuICAgKi9cbiAgbmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHBhY2thZ2VOYW1lIGluc3RlYWRcbiAgICovXG4gIHBhY2thZ2U/OiB7XG4gICAgbmFtZT86IHN0cmluZ1xuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgdGFyZ2V0cyBpbnN0ZWFkXG4gICAqL1xuICB0cmlwbGVzPzoge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgZW5hYmxlIGRlZmF1bHQgdGFyZ2V0c1xuICAgICAqL1xuICAgIGRlZmF1bHRzOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCB0YXJnZXRzIHRvIGJlIGNvbXBpbGVkIGZvclxuICAgICAqL1xuICAgIGFkZGl0aW9uYWw/OiBzdHJpbmdbXVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uUGFja2FnZUpzb25GaWVsZHMge1xuICBuYW1lOiBzdHJpbmdcbiAgdmVyc2lvbjogc3RyaW5nXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIGtleXdvcmRzPzogc3RyaW5nW11cbiAgYXV0aG9yPzogc3RyaW5nXG4gIGF1dGhvcnM/OiBzdHJpbmdbXVxuICBsaWNlbnNlPzogc3RyaW5nXG4gIGNwdT86IHN0cmluZ1tdXG4gIG9zPzogc3RyaW5nW11cbiAgbGliYz86IHN0cmluZ1tdXG4gIGZpbGVzPzogc3RyaW5nW11cbiAgcmVwb3NpdG9yeT86IGFueVxuICBob21lcGFnZT86IGFueVxuICBlbmdpbmVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBwdWJsaXNoQ29uZmlnPzogYW55XG4gIGJ1Z3M/OiBhbnlcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIG5hcGk/OiBVc2VyTmFwaUNvbmZpZ1xuICB0eXBlPzogJ21vZHVsZScgfCAnY29tbW9uanMnXG4gIHNjcmlwdHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbiAgLy8gbW9kdWxlc1xuICBtYWluPzogc3RyaW5nXG4gIG1vZHVsZT86IHN0cmluZ1xuICB0eXBlcz86IHN0cmluZ1xuICBicm93c2VyPzogc3RyaW5nXG4gIGV4cG9ydHM/OiBhbnlcblxuICBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGRldkRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICBhdmE/OiB7XG4gICAgdGltZW91dD86IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIE5hcGlDb25maWcgPSBSZXF1aXJlZDxcbiAgUGljazxVc2VyTmFwaUNvbmZpZywgJ2JpbmFyeU5hbWUnIHwgJ3BhY2thZ2VOYW1lJyB8ICducG1DbGllbnQnPlxuPiAmXG4gIFBpY2s8VXNlck5hcGlDb25maWcsICd3YXNtJyB8ICdkdHNIZWFkZXInIHwgJ2R0c0hlYWRlckZpbGUnIHwgJ2NvbnN0RW51bSc+ICYge1xuICAgIHRhcmdldHM6IFRhcmdldFtdXG4gICAgcGFja2FnZUpzb246IENvbW1vblBhY2thZ2VKc29uRmllbGRzXG4gIH1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWROYXBpQ29uZmlnKFxuICBwYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcsXG4pOiBQcm9taXNlPE5hcGlDb25maWc+IHtcbiAgaWYgKGNvbmZpZ1BhdGggJiYgIShhd2FpdCBmaWxlRXhpc3RzKGNvbmZpZ1BhdGgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTkFQSS1SUyBjb25maWcgbm90IGZvdW5kIGF0ICR7Y29uZmlnUGF0aH1gKVxuICB9XG4gIGlmICghKGF3YWl0IGZpbGVFeGlzdHMocGF0aCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBwYWNrYWdlLmpzb24gbm90IGZvdW5kIGF0ICR7cGF0aH1gKVxuICB9XG4gIC8vIE1heSBzdXBwb3J0IG11bHRpcGxlIGNvbmZpZyBzb3VyY2VzIGxhdGVyIG9uLlxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhwYXRoLCAndXRmOCcpXG4gIGxldCBwa2dKc29uXG4gIHRyeSB7XG4gICAgcGtnSnNvbiA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgQ29tbW9uUGFja2FnZUpzb25GaWVsZHNcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiBhdCAke3BhdGh9YCwge1xuICAgICAgY2F1c2U6IGUsXG4gICAgfSlcbiAgfVxuXG4gIGxldCBzZXBhcmF0ZWRDb25maWc6IFVzZXJOYXBpQ29uZmlnIHwgdW5kZWZpbmVkXG4gIGlmIChjb25maWdQYXRoKSB7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlQXN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKVxuICAgIHRyeSB7XG4gICAgICBzZXBhcmF0ZWRDb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpIGFzIFVzZXJOYXBpQ29uZmlnXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgTkFQSS1SUyBjb25maWcgYXQgJHtjb25maWdQYXRofWAsIHtcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVzZXJOYXBpQ29uZmlnID0gcGtnSnNvbi5uYXBpID8/IHt9XG4gIGlmIChwa2dKc29uLm5hcGkgJiYgc2VwYXJhdGVkQ29uZmlnKSB7XG4gICAgY29uc3QgcGtnSnNvblBhdGggPSB1bmRlcmxpbmUocGF0aClcbiAgICBjb25zdCBjb25maWdQYXRoVW5kZXJsaW5lID0gdW5kZXJsaW5lKGNvbmZpZ1BhdGghKVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIHllbGxvdyhcbiAgICAgICAgYEJvdGggbmFwaSBmaWVsZCBpbiAke3BrZ0pzb25QYXRofSBhbmQgW05BUEktUlMgY29uZmlnXSgke2NvbmZpZ1BhdGhVbmRlcmxpbmV9KSBmaWxlIGFyZSBmb3VuZCwgdGhlIE5BUEktUlMgY29uZmlnIGZpbGUgd2lsbCBiZSB1c2VkLmAsXG4gICAgICApLFxuICAgIClcbiAgICBPYmplY3QuYXNzaWduKHVzZXJOYXBpQ29uZmlnLCBzZXBhcmF0ZWRDb25maWcpXG4gIH1cbiAgY29uc3QgbmFwaUNvbmZpZzogTmFwaUNvbmZpZyA9IG1lcmdlKFxuICAgIHtcbiAgICAgIGJpbmFyeU5hbWU6ICdpbmRleCcsXG4gICAgICBwYWNrYWdlTmFtZTogcGtnSnNvbi5uYW1lLFxuICAgICAgdGFyZ2V0czogW10sXG4gICAgICBwYWNrYWdlSnNvbjogcGtnSnNvbixcbiAgICAgIG5wbUNsaWVudDogJ25wbScsXG4gICAgfSxcbiAgICBvbWl0KHVzZXJOYXBpQ29uZmlnLCBbJ3RhcmdldHMnXSksXG4gIClcblxuICBsZXQgdGFyZ2V0czogc3RyaW5nW10gPSB1c2VyTmFwaUNvbmZpZy50YXJnZXRzID8/IFtdXG5cbiAgLy8gY29tcGF0aWJsZSB3aXRoIG9sZCBjb25maWdcbiAgaWYgKHVzZXJOYXBpQ29uZmlnPy5uYW1lKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgeWVsbG93KFxuICAgICAgICBgW0RFUFJFQ0FURURdIG5hcGkubmFtZSBpcyBkZXByZWNhdGVkLCB1c2UgbmFwaS5iaW5hcnlOYW1lIGluc3RlYWQuYCxcbiAgICAgICksXG4gICAgKVxuICAgIG5hcGlDb25maWcuYmluYXJ5TmFtZSA9IHVzZXJOYXBpQ29uZmlnLm5hbWVcbiAgfVxuXG4gIGlmICghdGFyZ2V0cy5sZW5ndGgpIHtcbiAgICBsZXQgZGVwcmVjYXRlZFdhcm5lZCA9IGZhbHNlXG4gICAgY29uc3Qgd2FybmluZyA9IHllbGxvdyhcbiAgICAgIGBbREVQUkVDQVRFRF0gbmFwaS50cmlwbGVzIGlzIGRlcHJlY2F0ZWQsIHVzZSBuYXBpLnRhcmdldHMgaW5zdGVhZC5gLFxuICAgIClcbiAgICBpZiAodXNlck5hcGlDb25maWcudHJpcGxlcz8uZGVmYXVsdHMpIHtcbiAgICAgIGRlcHJlY2F0ZWRXYXJuZWQgPSB0cnVlXG4gICAgICBjb25zb2xlLndhcm4od2FybmluZylcbiAgICAgIHRhcmdldHMgPSB0YXJnZXRzLmNvbmNhdChERUZBVUxUX1RBUkdFVFMpXG4gICAgfVxuXG4gICAgaWYgKHVzZXJOYXBpQ29uZmlnLnRyaXBsZXM/LmFkZGl0aW9uYWw/Lmxlbmd0aCkge1xuICAgICAgdGFyZ2V0cyA9IHRhcmdldHMuY29uY2F0KHVzZXJOYXBpQ29uZmlnLnRyaXBsZXMuYWRkaXRpb25hbClcbiAgICAgIGlmICghZGVwcmVjYXRlZFdhcm5lZCkge1xuICAgICAgICBjb25zb2xlLndhcm4od2FybmluZylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBmaW5kIGR1cGxpY2F0ZSB0YXJnZXRzXG4gIGNvbnN0IHVuaXF1ZVRhcmdldHMgPSBuZXcgU2V0KHRhcmdldHMpXG4gIGlmICh1bmlxdWVUYXJnZXRzLnNpemUgIT09IHRhcmdldHMubGVuZ3RoKSB7XG4gICAgY29uc3QgZHVwbGljYXRlVGFyZ2V0ID0gdGFyZ2V0cy5maW5kKFxuICAgICAgKHRhcmdldCwgaW5kZXgpID0+IHRhcmdldHMuaW5kZXhPZih0YXJnZXQpICE9PSBpbmRleCxcbiAgICApXG4gICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgdGFyZ2V0cyBhcmUgbm90IGFsbG93ZWQ6ICR7ZHVwbGljYXRlVGFyZ2V0fWApXG4gIH1cblxuICBuYXBpQ29uZmlnLnRhcmdldHMgPSB0YXJnZXRzLm1hcChwYXJzZVRyaXBsZSlcblxuICByZXR1cm4gbmFwaUNvbmZpZ1xufVxuIiwiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5cbmltcG9ydCB7IGRlYnVnIH0gZnJvbSAnLi9sb2cuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiB0cnlJbnN0YWxsQ2FyZ29CaW5hcnkobmFtZTogc3RyaW5nLCBiaW46IHN0cmluZykge1xuICBpZiAoZGV0ZWN0Q2FyZ29CaW5hcnkoYmluKSkge1xuICAgIGRlYnVnKCdDYXJnbyBiaW5hcnkgYWxyZWFkeSBpbnN0YWxsZWQ6ICVzJywgbmFtZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgZGVidWcoJ0luc3RhbGxpbmcgY2FyZ28gYmluYXJ5OiAlcycsIG5hbWUpXG4gICAgZXhlY1N5bmMoYGNhcmdvIGluc3RhbGwgJHtuYW1lfWAsIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluc3RhbGwgY2FyZ28gYmluYXJ5OiAke25hbWV9YCwge1xuICAgICAgY2F1c2U6IGUsXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRlY3RDYXJnb0JpbmFyeShiaW46IHN0cmluZykge1xuICBkZWJ1ZygnRGV0ZWN0aW5nIGNhcmdvIGJpbmFyeTogJXMnLCBiaW4pXG4gIHRyeSB7XG4gICAgZXhlY1N5bmMoYGNhcmdvIGhlbHAgJHtiaW59YCwge1xuICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgIH0pXG4gICAgZGVidWcoJ0NhcmdvIGJpbmFyeSBkZXRlY3RlZDogJXMnLCBiaW4pXG4gICAgcmV0dXJuIHRydWVcbiAgfSBjYXRjaCB7XG4gICAgZGVidWcoJ0NhcmdvIGJpbmFyeSBub3QgZGV0ZWN0ZWQ6ICVzJywgYmluKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG4iLCJpbXBvcnQgeyBzb3J0QnkgfSBmcm9tICdlcy10b29sa2l0J1xuXG5pbXBvcnQgeyByZWFkRmlsZUFzeW5jIH0gZnJvbSAnLi9taXNjLmpzJ1xuXG5jb25zdCBUT1BfTEVWRUxfTkFNRVNQQUNFID0gJ19fVE9QX0xFVkVMX01PRFVMRV9fJ1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVFlQRV9ERUZfSEVBREVSID0gYC8qIGF1dG8tZ2VuZXJhdGVkIGJ5IE5BUEktUlMgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG5gXG5cbmVudW0gVHlwZURlZktpbmQge1xuICBDb25zdCA9ICdjb25zdCcsXG4gIEVudW0gPSAnZW51bScsXG4gIFN0cmluZ0VudW0gPSAnc3RyaW5nX2VudW0nLFxuICBJbnRlcmZhY2UgPSAnaW50ZXJmYWNlJyxcbiAgVHlwZSA9ICd0eXBlJyxcbiAgRm4gPSAnZm4nLFxuICBTdHJ1Y3QgPSAnc3RydWN0JyxcbiAgRXh0ZW5kcyA9ICdleHRlbmRzJyxcbiAgSW1wbCA9ICdpbXBsJyxcbn1cblxuaW50ZXJmYWNlIFR5cGVEZWZMaW5lIHtcbiAga2luZDogVHlwZURlZktpbmRcbiAgbmFtZTogc3RyaW5nXG4gIG9yaWdpbmFsX25hbWU/OiBzdHJpbmdcbiAgZGVmOiBzdHJpbmdcbiAgZXh0ZW5kcz86IHN0cmluZ1xuICBqc19kb2M/OiBzdHJpbmdcbiAganNfbW9kPzogc3RyaW5nXG59XG5cbmZ1bmN0aW9uIHByZXR0eVByaW50KFxuICBsaW5lOiBUeXBlRGVmTGluZSxcbiAgY29uc3RFbnVtOiBib29sZWFuLFxuICBpZGVudDogbnVtYmVyLFxuICBhbWJpZW50ID0gZmFsc2UsXG4pOiBzdHJpbmcge1xuICBsZXQgcyA9IGxpbmUuanNfZG9jID8/ICcnXG4gIHN3aXRjaCAobGluZS5raW5kKSB7XG4gICAgY2FzZSBUeXBlRGVmS2luZC5JbnRlcmZhY2U6XG4gICAgICBzICs9IGBleHBvcnQgaW50ZXJmYWNlICR7bGluZS5uYW1lfSB7XFxuJHtsaW5lLmRlZn1cXG59YFxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgVHlwZURlZktpbmQuVHlwZTpcbiAgICAgIHMgKz0gYGV4cG9ydCB0eXBlICR7bGluZS5uYW1lfSA9IFxcbiR7bGluZS5kZWZ9YFxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgVHlwZURlZktpbmQuRW51bTpcbiAgICAgIGNvbnN0IGVudW1OYW1lID0gY29uc3RFbnVtID8gJ2NvbnN0IGVudW0nIDogJ2VudW0nXG4gICAgICBzICs9IGAke2V4cG9ydERlY2xhcmUoYW1iaWVudCl9ICR7ZW51bU5hbWV9ICR7bGluZS5uYW1lfSB7XFxuJHtsaW5lLmRlZn1cXG59YFxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgVHlwZURlZktpbmQuU3RyaW5nRW51bTpcbiAgICAgIGlmIChjb25zdEVudW0pIHtcbiAgICAgICAgcyArPSBgJHtleHBvcnREZWNsYXJlKGFtYmllbnQpfSBjb25zdCBlbnVtICR7bGluZS5uYW1lfSB7XFxuJHtsaW5lLmRlZn1cXG59YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcyArPSBgZXhwb3J0IHR5cGUgJHtsaW5lLm5hbWV9ID0gJHtsaW5lLmRlZi5yZXBsYWNlQWxsKC8uKj0vZywgJycpLnJlcGxhY2VBbGwoJywnLCAnfCcpfTtgXG4gICAgICB9XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBUeXBlRGVmS2luZC5TdHJ1Y3Q6XG4gICAgICBjb25zdCBleHRlbmRzRGVmID0gbGluZS5leHRlbmRzID8gYCBleHRlbmRzICR7bGluZS5leHRlbmRzfWAgOiAnJ1xuICAgICAgaWYgKGxpbmUuZXh0ZW5kcykge1xuICAgICAgICAvLyBFeHRyYWN0IGdlbmVyaWMgcGFyYW1zIGZyb20gZXh0ZW5kcyB0eXBlIGxpa2UgSXRlcmF0b3I8VCwgVFJlc3VsdCwgVE5leHQ+XG4gICAgICAgIGNvbnN0IGdlbmVyaWNNYXRjaCA9IGxpbmUuZXh0ZW5kcy5tYXRjaCgvSXRlcmF0b3I8KC4rKT4kLylcbiAgICAgICAgaWYgKGdlbmVyaWNNYXRjaCkge1xuICAgICAgICAgIGNvbnN0IFtULCBUUmVzdWx0LCBUTmV4dF0gPSBnZW5lcmljTWF0Y2hbMV1cbiAgICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgICAubWFwKChwKSA9PiBwLnRyaW0oKSlcbiAgICAgICAgICBsaW5lLmRlZiA9XG4gICAgICAgICAgICBsaW5lLmRlZiArXG4gICAgICAgICAgICBgXFxubmV4dCh2YWx1ZT86ICR7VE5leHR9KTogSXRlcmF0b3JSZXN1bHQ8JHtUfSwgJHtUUmVzdWx0fT5gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHMgKz0gYCR7ZXhwb3J0RGVjbGFyZShhbWJpZW50KX0gY2xhc3MgJHtsaW5lLm5hbWV9JHtleHRlbmRzRGVmfSB7XFxuJHtsaW5lLmRlZn1cXG59YFxuICAgICAgaWYgKGxpbmUub3JpZ2luYWxfbmFtZSAmJiBsaW5lLm9yaWdpbmFsX25hbWUgIT09IGxpbmUubmFtZSkge1xuICAgICAgICBzICs9IGBcXG5leHBvcnQgdHlwZSAke2xpbmUub3JpZ2luYWxfbmFtZX0gPSAke2xpbmUubmFtZX1gXG4gICAgICB9XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBUeXBlRGVmS2luZC5GbjpcbiAgICAgIHMgKz0gYCR7ZXhwb3J0RGVjbGFyZShhbWJpZW50KX0gJHtsaW5lLmRlZn1gXG4gICAgICBicmVha1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHMgKz0gbGluZS5kZWZcbiAgfVxuXG4gIHJldHVybiBjb3JyZWN0U3RyaW5nSWRlbnQocywgaWRlbnQpXG59XG5cbmZ1bmN0aW9uIGV4cG9ydERlY2xhcmUoYW1iaWVudDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChhbWJpZW50KSB7XG4gICAgcmV0dXJuICdleHBvcnQnXG4gIH1cblxuICByZXR1cm4gJ2V4cG9ydCBkZWNsYXJlJ1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1R5cGVEZWYoXG4gIGludGVybWVkaWF0ZVR5cGVGaWxlOiBzdHJpbmcsXG4gIGNvbnN0RW51bTogYm9vbGVhbixcbikge1xuICBjb25zdCBleHBvcnRzOiBzdHJpbmdbXSA9IFtdXG4gIGNvbnN0IGRlZnMgPSBhd2FpdCByZWFkSW50ZXJtZWRpYXRlVHlwZUZpbGUoaW50ZXJtZWRpYXRlVHlwZUZpbGUpXG4gIGNvbnN0IGdyb3VwZWREZWZzID0gcHJlcHJvY2Vzc1R5cGVEZWYoZGVmcylcblxuICBjb25zdCBkdHMgPVxuICAgIHNvcnRCeShBcnJheS5mcm9tKGdyb3VwZWREZWZzKSwgWyhbbmFtZXNwYWNlXSkgPT4gbmFtZXNwYWNlXSlcbiAgICAgIC5tYXAoKFtuYW1lc3BhY2UsIGRlZnNdKSA9PiB7XG4gICAgICAgIGlmIChuYW1lc3BhY2UgPT09IFRPUF9MRVZFTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICByZXR1cm4gZGVmc1xuICAgICAgICAgICAgLm1hcCgoZGVmKSA9PiB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoZGVmLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFR5cGVEZWZLaW5kLkNvbnN0OlxuICAgICAgICAgICAgICAgIGNhc2UgVHlwZURlZktpbmQuRW51bTpcbiAgICAgICAgICAgICAgICBjYXNlIFR5cGVEZWZLaW5kLlN0cmluZ0VudW06XG4gICAgICAgICAgICAgICAgY2FzZSBUeXBlRGVmS2luZC5GbjpcbiAgICAgICAgICAgICAgICBjYXNlIFR5cGVEZWZLaW5kLlN0cnVjdDoge1xuICAgICAgICAgICAgICAgICAgZXhwb3J0cy5wdXNoKGRlZi5uYW1lKVxuICAgICAgICAgICAgICAgICAgaWYgKGRlZi5vcmlnaW5hbF9uYW1lICYmIGRlZi5vcmlnaW5hbF9uYW1lICE9PSBkZWYubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBleHBvcnRzLnB1c2goZGVmLm9yaWdpbmFsX25hbWUpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcHJldHR5UHJpbnQoZGVmLCBjb25zdEVudW0sIDApXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJ1xcblxcbicpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhwb3J0cy5wdXNoKG5hbWVzcGFjZSlcbiAgICAgICAgICBsZXQgZGVjbGFyYXRpb24gPSAnJ1xuICAgICAgICAgIGRlY2xhcmF0aW9uICs9IGBleHBvcnQgZGVjbGFyZSBuYW1lc3BhY2UgJHtuYW1lc3BhY2V9IHtcXG5gXG4gICAgICAgICAgZm9yIChjb25zdCBkZWYgb2YgZGVmcykge1xuICAgICAgICAgICAgZGVjbGFyYXRpb24gKz0gcHJldHR5UHJpbnQoZGVmLCBjb25zdEVudW0sIDIsIHRydWUpICsgJ1xcbidcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVjbGFyYXRpb24gKz0gJ30nXG4gICAgICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuam9pbignXFxuXFxuJykgKyAnXFxuJ1xuXG4gIHJldHVybiB7XG4gICAgZHRzLFxuICAgIGV4cG9ydHMsXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEludGVybWVkaWF0ZVR5cGVGaWxlKGZpbGU6IHN0cmluZykge1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlLCAndXRmOCcpXG5cbiAgY29uc3QgZGVmcyA9IGNvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKVxuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShsaW5lKSBhcyBUeXBlRGVmTGluZVxuICAgICAgLy8gQ29udmVydCBlc2NhcGVkIG5ld2xpbmVzIGJhY2sgdG8gYWN0dWFsIG5ld2xpbmVzIGluIGpzX2RvYyBmaWVsZHNcbiAgICAgIGlmIChwYXJzZWQuanNfZG9jKSB7XG4gICAgICAgIHBhcnNlZC5qc19kb2MgPSBwYXJzZWQuanNfZG9jLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKVxuICAgICAgfVxuICAgICAgLy8gQ29udmVydCBlc2NhcGVkIG5ld2xpbmVzIHRvIGFjdHVhbCBuZXdsaW5lcyBpbiBkZWYgZmllbGRzIGZvciBzdHJ1Y3QvY2xhc3MvaW50ZXJmYWNlL3R5cGUgdHlwZXNcbiAgICAgIC8vIHdoZXJlIFxcbiByZXByZXNlbnRzIG1ldGhvZC9maWVsZCBzZXBhcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFjdHVhbCBuZXdsaW5lc1xuICAgICAgaWYgKHBhcnNlZC5kZWYpIHtcbiAgICAgICAgcGFyc2VkLmRlZiA9IHBhcnNlZC5kZWYucmVwbGFjZSgvXFxcXG4vZywgJ1xcbicpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyc2VkXG4gICAgfSlcblxuICAvLyBtb3ZlIGFsbCBgc3RydWN0YCBkZWYgdG8gdGhlIHZlcnkgdG9wXG4gIC8vIGFuZCBvcmRlciB0aGUgcmVzdCBhbHBoYWJldGljYWxseS5cbiAgcmV0dXJuIGRlZnMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLmtpbmQgPT09IFR5cGVEZWZLaW5kLlN0cnVjdCkge1xuICAgICAgaWYgKGIua2luZCA9PT0gVHlwZURlZktpbmQuU3RydWN0KSB7XG4gICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpXG4gICAgICB9XG4gICAgICByZXR1cm4gLTFcbiAgICB9IGVsc2UgaWYgKGIua2luZCA9PT0gVHlwZURlZktpbmQuU3RydWN0KSB7XG4gICAgICByZXR1cm4gMVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc1R5cGVEZWYoZGVmczogVHlwZURlZkxpbmVbXSk6IE1hcDxzdHJpbmcsIFR5cGVEZWZMaW5lW10+IHtcbiAgY29uc3QgbmFtZXNwYWNlR3JvdXBlZCA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlRGVmTGluZVtdPigpXG4gIGNvbnN0IGNsYXNzRGVmcyA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlRGVmTGluZT4oKVxuXG4gIGZvciAoY29uc3QgZGVmIG9mIGRlZnMpIHtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBkZWYuanNfbW9kID8/IFRPUF9MRVZFTF9OQU1FU1BBQ0VcbiAgICBpZiAoIW5hbWVzcGFjZUdyb3VwZWQuaGFzKG5hbWVzcGFjZSkpIHtcbiAgICAgIG5hbWVzcGFjZUdyb3VwZWQuc2V0KG5hbWVzcGFjZSwgW10pXG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXAgPSBuYW1lc3BhY2VHcm91cGVkLmdldChuYW1lc3BhY2UpIVxuXG4gICAgaWYgKGRlZi5raW5kID09PSBUeXBlRGVmS2luZC5TdHJ1Y3QpIHtcbiAgICAgIGdyb3VwLnB1c2goZGVmKVxuICAgICAgY2xhc3NEZWZzLnNldChkZWYubmFtZSwgZGVmKVxuICAgIH0gZWxzZSBpZiAoZGVmLmtpbmQgPT09IFR5cGVEZWZLaW5kLkV4dGVuZHMpIHtcbiAgICAgIGNvbnN0IGNsYXNzRGVmID0gY2xhc3NEZWZzLmdldChkZWYubmFtZSlcbiAgICAgIGlmIChjbGFzc0RlZikge1xuICAgICAgICBjbGFzc0RlZi5leHRlbmRzID0gZGVmLmRlZlxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVmLmtpbmQgPT09IFR5cGVEZWZLaW5kLkltcGwpIHtcbiAgICAgIC8vIG1lcmdlIGBpbXBsYCBpbnRvIGNsYXNzIGRlZmluaXRpb25cbiAgICAgIGNvbnN0IGNsYXNzRGVmID0gY2xhc3NEZWZzLmdldChkZWYubmFtZSlcbiAgICAgIGlmIChjbGFzc0RlZikge1xuICAgICAgICBpZiAoY2xhc3NEZWYuZGVmKSB7XG4gICAgICAgICAgY2xhc3NEZWYuZGVmICs9ICdcXG4nXG4gICAgICAgIH1cblxuICAgICAgICBjbGFzc0RlZi5kZWYgKz0gZGVmLmRlZlxuICAgICAgICAvLyBDb252ZXJ0IGFueSByZW1haW5pbmcgXFxuIHNlcXVlbmNlcyBpbiB0aGUgbWVyZ2VkIGRlZiB0byBhY3R1YWwgbmV3bGluZXNcbiAgICAgICAgaWYgKGNsYXNzRGVmLmRlZikge1xuICAgICAgICAgIGNsYXNzRGVmLmRlZiA9IGNsYXNzRGVmLmRlZi5yZXBsYWNlKC9cXFxcbi9nLCAnXFxuJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBncm91cC5wdXNoKGRlZilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZXNwYWNlR3JvdXBlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29ycmVjdFN0cmluZ0lkZW50KHNyYzogc3RyaW5nLCBpZGVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IGJyYWNrZXREZXB0aCA9IDBcbiAgY29uc3QgcmVzdWx0ID0gc3JjXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKVxuICAgICAgaWYgKGxpbmUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiAnJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0luTXVsdGlsaW5lQ29tbWVudCA9IGxpbmUuc3RhcnRzV2l0aCgnKicpXG4gICAgICBjb25zdCBpc0Nsb3NpbmdCcmFja2V0ID0gbGluZS5lbmRzV2l0aCgnfScpXG4gICAgICBjb25zdCBpc09wZW5pbmdCcmFja2V0ID0gbGluZS5lbmRzV2l0aCgneycpXG4gICAgICBjb25zdCBpc1R5cGVEZWNsYXJhdGlvbiA9IGxpbmUuZW5kc1dpdGgoJz0nKVxuICAgICAgY29uc3QgaXNUeXBlVmFyaWFudCA9IGxpbmUuc3RhcnRzV2l0aCgnfCcpXG5cbiAgICAgIGxldCByaWdodEluZGVudCA9IGlkZW50XG4gICAgICBpZiAoKGlzT3BlbmluZ0JyYWNrZXQgfHwgaXNUeXBlRGVjbGFyYXRpb24pICYmICFpc0luTXVsdGlsaW5lQ29tbWVudCkge1xuICAgICAgICBicmFja2V0RGVwdGggKz0gMVxuICAgICAgICByaWdodEluZGVudCArPSAoYnJhY2tldERlcHRoIC0gMSkgKiAyXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDbG9zaW5nQnJhY2tldCAmJlxuICAgICAgICAgIGJyYWNrZXREZXB0aCA+IDAgJiZcbiAgICAgICAgICAhaXNJbk11bHRpbGluZUNvbW1lbnQgJiZcbiAgICAgICAgICAhaXNUeXBlVmFyaWFudFxuICAgICAgICApIHtcbiAgICAgICAgICBicmFja2V0RGVwdGggLT0gMVxuICAgICAgICB9XG4gICAgICAgIHJpZ2h0SW5kZW50ICs9IGJyYWNrZXREZXB0aCAqIDJcbiAgICAgIH1cblxuICAgICAgaWYgKGlzSW5NdWx0aWxpbmVDb21tZW50KSB7XG4gICAgICAgIHJpZ2h0SW5kZW50ICs9IDFcbiAgICAgIH1cblxuICAgICAgY29uc3QgcyA9IGAkeycgJy5yZXBlYXQocmlnaHRJbmRlbnQpfSR7bGluZX1gXG5cbiAgICAgIHJldHVybiBzXG4gICAgfSlcbiAgICAuam9pbignXFxuJylcblxuICByZXR1cm4gcmVzdWx0XG59XG4iLCJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgeyByZWFkTmFwaUNvbmZpZyB9IGZyb20gJy4vY29uZmlnLmpzJ1xuXG5pbnRlcmZhY2UgTWluaW1hbE5hcGlPcHRpb25zIHtcbiAgY3dkOiBzdHJpbmdcbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICBwYWNrYWdlSnNvblBhdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRDb25maWcob3B0aW9uczogTWluaW1hbE5hcGlPcHRpb25zKSB7XG4gIGNvbnN0IHJlc29sdmVQYXRoID0gKC4uLnBhdGhzOiBzdHJpbmdbXSkgPT4gcmVzb2x2ZShvcHRpb25zLmN3ZCwgLi4ucGF0aHMpXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlYWROYXBpQ29uZmlnKFxuICAgIHJlc29sdmVQYXRoKFxuICAgICAgb3B0aW9ucy5jb25maWdQYXRoID8/IG9wdGlvbnMucGFja2FnZUpzb25QYXRoID8/ICdwYWNrYWdlLmpzb24nLFxuICAgICksXG4gICAgb3B0aW9ucy5jb25maWdQYXRoID8gcmVzb2x2ZVBhdGgob3B0aW9ucy5jb25maWdQYXRoKSA6IHVuZGVmaW5lZCxcbiAgKVxuICByZXR1cm4gY29uZmlnXG59XG4iLCJpbXBvcnQgeyBqb2luLCBwYXJzZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0ICogYXMgY29sb3JzIGZyb20gJ2NvbG9yZXR0ZSdcblxuaW1wb3J0IHtcbiAgYXBwbHlEZWZhdWx0QXJ0aWZhY3RzT3B0aW9ucyxcbiAgQXJ0aWZhY3RzT3B0aW9ucyxcbn0gZnJvbSAnLi4vZGVmL2FydGlmYWN0cy5qcydcbmltcG9ydCB7XG4gIHJlYWROYXBpQ29uZmlnLFxuICBkZWJ1Z0ZhY3RvcnksXG4gIHJlYWRGaWxlQXN5bmMsXG4gIHdyaXRlRmlsZUFzeW5jLFxuICBVbmlBcmNoc0J5UGxhdGZvcm0sXG4gIHJlYWRkaXJBc3luYyxcbn0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCdhcnRpZmFjdHMnKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29sbGVjdEFydGlmYWN0cyh1c2VyT3B0aW9uczogQXJ0aWZhY3RzT3B0aW9ucykge1xuICBjb25zdCBvcHRpb25zID0gYXBwbHlEZWZhdWx0QXJ0aWZhY3RzT3B0aW9ucyh1c2VyT3B0aW9ucylcblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBqb2luKG9wdGlvbnMuY3dkLCBvcHRpb25zLnBhY2thZ2VKc29uUGF0aClcbiAgY29uc3QgeyB0YXJnZXRzLCBiaW5hcnlOYW1lLCBwYWNrYWdlTmFtZSB9ID1cbiAgICBhd2FpdCByZWFkTmFwaUNvbmZpZyhwYWNrYWdlSnNvblBhdGgpXG5cbiAgY29uc3QgZGlzdERpcnMgPSB0YXJnZXRzLm1hcCgocGxhdGZvcm0pID0+XG4gICAgam9pbihvcHRpb25zLmN3ZCwgb3B0aW9ucy5ucG1EaXIsIHBsYXRmb3JtLnBsYXRmb3JtQXJjaEFCSSksXG4gIClcblxuICBjb25zdCB1bml2ZXJzYWxTb3VyY2VCaW5zID0gbmV3IFNldChcbiAgICB0YXJnZXRzXG4gICAgICAuZmlsdGVyKChwbGF0Zm9ybSkgPT4gcGxhdGZvcm0uYXJjaCA9PT0gJ3VuaXZlcnNhbCcpXG4gICAgICAuZmxhdE1hcCgocCkgPT5cbiAgICAgICAgVW5pQXJjaHNCeVBsYXRmb3JtW3AucGxhdGZvcm1dPy5tYXAoKGEpID0+IGAke3AucGxhdGZvcm19LSR7YX1gKSxcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW10sXG4gIClcblxuICBhd2FpdCBjb2xsZWN0Tm9kZUJpbmFyaWVzKGpvaW4ob3B0aW9ucy5jd2QsIG9wdGlvbnMub3V0cHV0RGlyKSkudGhlbihcbiAgICAob3V0cHV0KSA9PlxuICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgIG91dHB1dC5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICAgICAgZGVidWcuaW5mbyhgUmVhZCBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KGZpbGVQYXRoKX1dYClcbiAgICAgICAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlUGF0aClcbiAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2UoZmlsZVBhdGgpXG4gICAgICAgICAgY29uc3QgdGVybXMgPSBwYXJzZWROYW1lLm5hbWUuc3BsaXQoJy4nKVxuICAgICAgICAgIGNvbnN0IHBsYXRmb3JtQXJjaEFCSSA9IHRlcm1zLnBvcCgpIVxuICAgICAgICAgIGNvbnN0IF9iaW5hcnlOYW1lID0gdGVybXMuam9pbignLicpXG5cbiAgICAgICAgICBpZiAoX2JpbmFyeU5hbWUgIT09IGJpbmFyeU5hbWUpIHtcbiAgICAgICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgICAgIGBbJHtfYmluYXJ5TmFtZX1dIGlzIG5vdCBtYXRjaGVkIHdpdGggWyR7YmluYXJ5TmFtZX1dLCBza2lwYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkaXIgPSBkaXN0RGlycy5maW5kKChkaXIpID0+IGRpci5pbmNsdWRlcyhwbGF0Zm9ybUFyY2hBQkkpKVxuICAgICAgICAgIGlmICghZGlyICYmIHVuaXZlcnNhbFNvdXJjZUJpbnMuaGFzKHBsYXRmb3JtQXJjaEFCSSkpIHtcbiAgICAgICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgICAgIGBbJHtwbGF0Zm9ybUFyY2hBQkl9XSBoYXMgbm8gZGlzdCBkaXIgYnV0IGl0IGlzIHNvdXJjZSBiaW4gZm9yIHVuaXZlcnNhbCBhcmNoLCBza2lwYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWRpcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBkaXN0IGRpciBmb3VuZCBmb3IgJHtmaWxlUGF0aH1gKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGRpc3RGaWxlUGF0aCA9IGpvaW4oZGlyLCBwYXJzZWROYW1lLmJhc2UpXG4gICAgICAgICAgZGVidWcuaW5mbyhcbiAgICAgICAgICAgIGBXcml0ZSBmaWxlIGNvbnRlbnQgdG8gWyR7Y29sb3JzLnllbGxvd0JyaWdodChkaXN0RmlsZVBhdGgpfV1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhkaXN0RmlsZVBhdGgsIHNvdXJjZUNvbnRlbnQpXG4gICAgICAgICAgY29uc3QgZGlzdEZpbGVQYXRoTG9jYWwgPSBqb2luKFxuICAgICAgICAgICAgcGFyc2UocGFja2FnZUpzb25QYXRoKS5kaXIsXG4gICAgICAgICAgICBwYXJzZWROYW1lLmJhc2UsXG4gICAgICAgICAgKVxuICAgICAgICAgIGRlYnVnLmluZm8oXG4gICAgICAgICAgICBgV3JpdGUgZmlsZSBjb250ZW50IHRvIFske2NvbG9ycy55ZWxsb3dCcmlnaHQoZGlzdEZpbGVQYXRoTG9jYWwpfV1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhkaXN0RmlsZVBhdGhMb2NhbCwgc291cmNlQ29udGVudClcbiAgICAgICAgfSksXG4gICAgICApLFxuICApXG5cbiAgY29uc3Qgd2FzaVRhcmdldCA9IHRhcmdldHMuZmluZCgodCkgPT4gdC5wbGF0Zm9ybSA9PT0gJ3dhc2knKVxuICBpZiAod2FzaVRhcmdldCkge1xuICAgIGNvbnN0IHdhc2lEaXIgPSBqb2luKFxuICAgICAgb3B0aW9ucy5jd2QsXG4gICAgICBvcHRpb25zLm5wbURpcixcbiAgICAgIHdhc2lUYXJnZXQucGxhdGZvcm1BcmNoQUJJLFxuICAgIClcbiAgICBjb25zdCBjanNGaWxlID0gam9pbihcbiAgICAgIG9wdGlvbnMuYnVpbGRPdXRwdXREaXIgPz8gb3B0aW9ucy5jd2QsXG4gICAgICBgJHtiaW5hcnlOYW1lfS53YXNpLmNqc2AsXG4gICAgKVxuICAgIGNvbnN0IHdvcmtlckZpbGUgPSBqb2luKFxuICAgICAgb3B0aW9ucy5idWlsZE91dHB1dERpciA/PyBvcHRpb25zLmN3ZCxcbiAgICAgIGB3YXNpLXdvcmtlci5tanNgLFxuICAgIClcbiAgICBjb25zdCBicm93c2VyRW50cnkgPSBqb2luKFxuICAgICAgb3B0aW9ucy5idWlsZE91dHB1dERpciA/PyBvcHRpb25zLmN3ZCxcbiAgICAgIGAke2JpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2AsXG4gICAgKVxuICAgIGNvbnN0IGJyb3dzZXJXb3JrZXJGaWxlID0gam9pbihcbiAgICAgIG9wdGlvbnMuYnVpbGRPdXRwdXREaXIgPz8gb3B0aW9ucy5jd2QsXG4gICAgICBgd2FzaS13b3JrZXItYnJvd3Nlci5tanNgLFxuICAgIClcbiAgICBkZWJ1Zy5pbmZvKFxuICAgICAgYE1vdmUgd2FzaSBiaW5kaW5nIGZpbGUgWyR7Y29sb3JzLnllbGxvd0JyaWdodChcbiAgICAgICAgY2pzRmlsZSxcbiAgICAgICl9XSB0byBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KHdhc2lEaXIpfV1gLFxuICAgIClcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgIGpvaW4od2FzaURpciwgYCR7YmluYXJ5TmFtZX0ud2FzaS5janNgKSxcbiAgICAgIGF3YWl0IHJlYWRGaWxlQXN5bmMoY2pzRmlsZSksXG4gICAgKVxuICAgIGRlYnVnLmluZm8oXG4gICAgICBgTW92ZSB3YXNpIHdvcmtlciBmaWxlIFske2NvbG9ycy55ZWxsb3dCcmlnaHQoXG4gICAgICAgIHdvcmtlckZpbGUsXG4gICAgICApfV0gdG8gWyR7Y29sb3JzLnllbGxvd0JyaWdodCh3YXNpRGlyKX1dYCxcbiAgICApXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICBqb2luKHdhc2lEaXIsIGB3YXNpLXdvcmtlci5tanNgKSxcbiAgICAgIGF3YWl0IHJlYWRGaWxlQXN5bmMod29ya2VyRmlsZSksXG4gICAgKVxuICAgIGRlYnVnLmluZm8oXG4gICAgICBgTW92ZSB3YXNpIGJyb3dzZXIgZW50cnkgZmlsZSBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KFxuICAgICAgICBicm93c2VyRW50cnksXG4gICAgICApfV0gdG8gWyR7Y29sb3JzLnllbGxvd0JyaWdodCh3YXNpRGlyKX1dYCxcbiAgICApXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICBqb2luKHdhc2lEaXIsIGAke2JpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2ApLFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVqcy92aXRlL2lzc3Vlcy84NDI3XG4gICAgICAoYXdhaXQgcmVhZEZpbGVBc3luYyhicm93c2VyRW50cnksICd1dGY4JykpLnJlcGxhY2UoXG4gICAgICAgIGBuZXcgVVJMKCcuL3dhc2ktd29ya2VyLWJyb3dzZXIubWpzJywgaW1wb3J0Lm1ldGEudXJsKWAsXG4gICAgICAgIGBuZXcgVVJMKCcke3BhY2thZ2VOYW1lfS13YXNtMzItd2FzaS93YXNpLXdvcmtlci1icm93c2VyLm1qcycsIGltcG9ydC5tZXRhLnVybClgLFxuICAgICAgKSxcbiAgICApXG4gICAgZGVidWcuaW5mbyhcbiAgICAgIGBNb3ZlIHdhc2kgYnJvd3NlciB3b3JrZXIgZmlsZSBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KFxuICAgICAgICBicm93c2VyV29ya2VyRmlsZSxcbiAgICAgICl9XSB0byBbJHtjb2xvcnMueWVsbG93QnJpZ2h0KHdhc2lEaXIpfV1gLFxuICAgIClcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgIGpvaW4od2FzaURpciwgYHdhc2ktd29ya2VyLWJyb3dzZXIubWpzYCksXG4gICAgICBhd2FpdCByZWFkRmlsZUFzeW5jKGJyb3dzZXJXb3JrZXJGaWxlKSxcbiAgICApXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdE5vZGVCaW5hcmllcyhyb290OiBzdHJpbmcpIHtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyQXN5bmMocm9vdCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG4gIGNvbnN0IG5vZGVCaW5hcmllcyA9IGZpbGVzXG4gICAgLmZpbHRlcihcbiAgICAgIChmaWxlKSA9PlxuICAgICAgICBmaWxlLmlzRmlsZSgpICYmXG4gICAgICAgIChmaWxlLm5hbWUuZW5kc1dpdGgoJy5ub2RlJykgfHwgZmlsZS5uYW1lLmVuZHNXaXRoKCcud2FzbScpKSxcbiAgICApXG4gICAgLm1hcCgoZmlsZSkgPT4gam9pbihyb290LCBmaWxlLm5hbWUpKVxuXG4gIGNvbnN0IGRpcnMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUuaXNEaXJlY3RvcnkoKSlcbiAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgIGlmIChkaXIubmFtZSAhPT0gJ25vZGVfbW9kdWxlcycpIHtcbiAgICAgIG5vZGVCaW5hcmllcy5wdXNoKC4uLihhd2FpdCBjb2xsZWN0Tm9kZUJpbmFyaWVzKGpvaW4ocm9vdCwgZGlyLm5hbWUpKSkpXG4gICAgfVxuICB9XG4gIHJldHVybiBub2RlQmluYXJpZXNcbn1cbiIsImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjbGlwYW5pb24nXG5cbmltcG9ydCB7IGNvbGxlY3RBcnRpZmFjdHMgfSBmcm9tICcuLi9hcGkvYXJ0aWZhY3RzLmpzJ1xuaW1wb3J0IHsgQmFzZUFydGlmYWN0c0NvbW1hbmQgfSBmcm9tICcuLi9kZWYvYXJ0aWZhY3RzLmpzJ1xuXG5leHBvcnQgY2xhc3MgQXJ0aWZhY3RzQ29tbWFuZCBleHRlbmRzIEJhc2VBcnRpZmFjdHNDb21tYW5kIHtcbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246ICdDb3B5IGFydGlmYWN0cyBmcm9tIEdpdGh1YiBBY3Rpb25zIGludG8gc3BlY2lmaWVkIGRpcicsXG4gICAgZXhhbXBsZXM6IFtcbiAgICAgIFtcbiAgICAgICAgJyQwIGFydGlmYWN0cyAtLW91dHB1dC1kaXIgLi9hcnRpZmFjdHMgLS1kaXN0IC4vbnBtJyxcbiAgICAgICAgYENvcHkgW2JpbmFyeU5hbWVdLltwbGF0Zm9ybV0ubm9kZSB1bmRlciBjdXJyZW50IGRpciguKSBpbnRvIHBhY2thZ2VzIHVuZGVyIG5wbSBkaXIuXG5lLmc6IGluZGV4LmxpbnV4LXg2NC1nbnUubm9kZSAtLT4gLi9ucG0vbGludXgteDY0LWdudS9pbmRleC5saW51eC14NjQtZ251Lm5vZGVgLFxuICAgICAgXSxcbiAgICBdLFxuICB9KVxuXG4gIHN0YXRpYyBwYXRocyA9IFtbJ2FydGlmYWN0cyddXVxuXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgY29sbGVjdEFydGlmYWN0cyh0aGlzLmdldE9wdGlvbnMoKSlcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNqc0JpbmRpbmcoXG4gIGxvY2FsTmFtZTogc3RyaW5nLFxuICBwa2dOYW1lOiBzdHJpbmcsXG4gIGlkZW50czogc3RyaW5nW10sXG4gIHBhY2thZ2VWZXJzaW9uPzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2JpbmRpbmdIZWFkZXJ9XG5jb25zdCB7IGNyZWF0ZVJlcXVpcmUgfSA9IHJlcXVpcmUoJ25vZGU6bW9kdWxlJylcbnJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKF9fZmlsZW5hbWUpXG5cbiR7Y3JlYXRlQ29tbW9uQmluZGluZyhsb2NhbE5hbWUsIHBrZ05hbWUsIHBhY2thZ2VWZXJzaW9uKX1cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlQmluZGluZ1xuJHtpZGVudHNcbiAgLm1hcCgoaWRlbnQpID0+IGBtb2R1bGUuZXhwb3J0cy4ke2lkZW50fSA9IG5hdGl2ZUJpbmRpbmcuJHtpZGVudH1gKVxuICAuam9pbignXFxuJyl9XG5gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFc21CaW5kaW5nKFxuICBsb2NhbE5hbWU6IHN0cmluZyxcbiAgcGtnTmFtZTogc3RyaW5nLFxuICBpZGVudHM6IHN0cmluZ1tdLFxuICBwYWNrYWdlVmVyc2lvbj86IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtiaW5kaW5nSGVhZGVyfVxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuY29uc3QgX19kaXJuYW1lID0gbmV3IFVSTCgnLicsIGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWVcblxuJHtjcmVhdGVDb21tb25CaW5kaW5nKGxvY2FsTmFtZSwgcGtnTmFtZSwgcGFja2FnZVZlcnNpb24pfVxuY29uc3QgeyAke2lkZW50cy5qb2luKCcsICcpfSB9ID0gbmF0aXZlQmluZGluZ1xuJHtpZGVudHMubWFwKChpZGVudCkgPT4gYGV4cG9ydCB7ICR7aWRlbnR9IH1gKS5qb2luKCdcXG4nKX1cbmBcbn1cblxuY29uc3QgYmluZGluZ0hlYWRlciA9IGAvLyBwcmV0dGllci1pZ25vcmVcbi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBAdHMtbm9jaGVja1xuLyogYXV0by1nZW5lcmF0ZWQgYnkgTkFQSS1SUyAqL1xuYFxuXG5mdW5jdGlvbiBjcmVhdGVDb21tb25CaW5kaW5nKFxuICBsb2NhbE5hbWU6IHN0cmluZyxcbiAgcGtnTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlVmVyc2lvbj86IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGZ1bmN0aW9uIHJlcXVpcmVUdXBsZSh0dXBsZTogc3RyaW5nLCBpZGVudFNpemUgPSA4KSB7XG4gICAgY29uc3QgaWRlbnRMb3cgPSAnICcucmVwZWF0KGlkZW50U2l6ZSAtIDIpXG4gICAgY29uc3QgaWRlbnQgPSAnICcucmVwZWF0KGlkZW50U2l6ZSlcbiAgICBjb25zdCB2ZXJzaW9uQ2hlY2sgPSBwYWNrYWdlVmVyc2lvblxuICAgICAgPyBgXG4ke2lkZW50TG93fXRyeSB7XG4ke2lkZW50fWNvbnN0IGJpbmRpbmcgPSByZXF1aXJlKCcke3BrZ05hbWV9LSR7dHVwbGV9JylcbiR7aWRlbnR9Y29uc3QgYmluZGluZ1BhY2thZ2VWZXJzaW9uID0gcmVxdWlyZSgnJHtwa2dOYW1lfS0ke3R1cGxlfS9wYWNrYWdlLmpzb24nKS52ZXJzaW9uXG4ke2lkZW50fWlmIChiaW5kaW5nUGFja2FnZVZlcnNpb24gIT09ICcke3BhY2thZ2VWZXJzaW9ufScgJiYgcHJvY2Vzcy5lbnYuTkFQSV9SU19FTkZPUkNFX1ZFUlNJT05fQ0hFQ0sgJiYgcHJvY2Vzcy5lbnYuTkFQSV9SU19FTkZPUkNFX1ZFUlNJT05fQ0hFQ0sgIT09ICcwJykge1xuJHtpZGVudH0gIHRocm93IG5ldyBFcnJvcihcXGBOYXRpdmUgYmluZGluZyBwYWNrYWdlIHZlcnNpb24gbWlzbWF0Y2gsIGV4cGVjdGVkICR7cGFja2FnZVZlcnNpb259IGJ1dCBnb3QgXFwke2JpbmRpbmdQYWNrYWdlVmVyc2lvbn0uIFlvdSBjYW4gcmVpbnN0YWxsIGRlcGVuZGVuY2llcyB0byBmaXggdGhpcyBpc3N1ZS5cXGApXG4ke2lkZW50fX1cbiR7aWRlbnR9cmV0dXJuIGJpbmRpbmdcbiR7aWRlbnRMb3d9fSBjYXRjaCAoZSkge1xuJHtpZGVudH1sb2FkRXJyb3JzLnB1c2goZSlcbiR7aWRlbnRMb3d9fWBcbiAgICAgIDogYFxuJHtpZGVudExvd310cnkge1xuJHtpZGVudH1yZXR1cm4gcmVxdWlyZSgnJHtwa2dOYW1lfS0ke3R1cGxlfScpXG4ke2lkZW50TG93fX0gY2F0Y2ggKGUpIHtcbiR7aWRlbnR9bG9hZEVycm9ycy5wdXNoKGUpXG4ke2lkZW50TG93fX1gXG4gICAgcmV0dXJuIGB0cnkge1xuJHtpZGVudH1yZXR1cm4gcmVxdWlyZSgnLi8ke2xvY2FsTmFtZX0uJHt0dXBsZX0ubm9kZScpXG4ke2lkZW50TG93fX0gY2F0Y2ggKGUpIHtcbiR7aWRlbnR9bG9hZEVycm9ycy5wdXNoKGUpXG4ke2lkZW50TG93fX0ke3ZlcnNpb25DaGVja31gXG4gIH1cblxuICByZXR1cm4gYGNvbnN0IHsgcmVhZEZpbGVTeW5jIH0gPSByZXF1aXJlKCdub2RlOmZzJylcbmxldCBuYXRpdmVCaW5kaW5nID0gbnVsbFxuY29uc3QgbG9hZEVycm9ycyA9IFtdXG5cbmNvbnN0IGlzTXVzbCA9ICgpID0+IHtcbiAgbGV0IG11c2wgPSBmYWxzZVxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xuICAgIG11c2wgPSBpc011c2xGcm9tRmlsZXN5c3RlbSgpXG4gICAgaWYgKG11c2wgPT09IG51bGwpIHtcbiAgICAgIG11c2wgPSBpc011c2xGcm9tUmVwb3J0KClcbiAgICB9XG4gICAgaWYgKG11c2wgPT09IG51bGwpIHtcbiAgICAgIG11c2wgPSBpc011c2xGcm9tQ2hpbGRQcm9jZXNzKClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG11c2xcbn1cblxuY29uc3QgaXNGaWxlTXVzbCA9IChmKSA9PiBmLmluY2x1ZGVzKCdsaWJjLm11c2wtJykgfHwgZi5pbmNsdWRlcygnbGQtbXVzbC0nKVxuXG5jb25zdCBpc011c2xGcm9tRmlsZXN5c3RlbSA9ICgpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVhZEZpbGVTeW5jKCcvdXNyL2Jpbi9sZGQnLCAndXRmLTgnKS5pbmNsdWRlcygnbXVzbCcpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuY29uc3QgaXNNdXNsRnJvbVJlcG9ydCA9ICgpID0+IHtcbiAgbGV0IHJlcG9ydCA9IG51bGxcbiAgaWYgKHR5cGVvZiBwcm9jZXNzLnJlcG9ydD8uZ2V0UmVwb3J0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcHJvY2Vzcy5yZXBvcnQuZXhjbHVkZU5ldHdvcmsgPSB0cnVlXG4gICAgcmVwb3J0ID0gcHJvY2Vzcy5yZXBvcnQuZ2V0UmVwb3J0KClcbiAgfVxuICBpZiAoIXJlcG9ydCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgaWYgKHJlcG9ydC5oZWFkZXIgJiYgcmVwb3J0LmhlYWRlci5nbGliY1ZlcnNpb25SdW50aW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkocmVwb3J0LnNoYXJlZE9iamVjdHMpKSB7XG4gICAgaWYgKHJlcG9ydC5zaGFyZWRPYmplY3RzLnNvbWUoaXNGaWxlTXVzbCkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCBpc011c2xGcm9tQ2hpbGRQcm9jZXNzID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY1N5bmMoJ2xkZCAtLXZlcnNpb24nLCB7IGVuY29kaW5nOiAndXRmOCcgfSkuaW5jbHVkZXMoJ211c2wnKVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWYgd2UgcmVhY2ggdGhpcyBjYXNlLCB3ZSBkb24ndCBrbm93IGlmIHRoZSBzeXN0ZW0gaXMgbXVzbCBvciBub3QsIHNvIGlzIGJldHRlciB0byBqdXN0IGZhbGxiYWNrIHRvIGZhbHNlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWlyZU5hdGl2ZSgpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5BUElfUlNfTkFUSVZFX0xJQlJBUllfUEFUSCkge1xuICAgIHRyeSB7XG4gICAgICBuYXRpdmVCaW5kaW5nID0gcmVxdWlyZShwcm9jZXNzLmVudi5OQVBJX1JTX05BVElWRV9MSUJSQVJZX1BBVEgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKGVycilcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKSB7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybTY0Jykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ2FuZHJvaWQtYXJtNjQnKX1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybScpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdhbmRyb2lkLWFybS1lYWJpJyl9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRFcnJvcnMucHVzaChuZXcgRXJyb3IoXFxgVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIG9uIEFuZHJvaWQgXFwke3Byb2Nlc3MuYXJjaH1cXGApKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCd3aW4zMi14NjQtbXN2YycpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnaWEzMicpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCd3aW4zMi1pYTMyLW1zdmMnKX1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ2FybTY0Jykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ3dpbjMyLWFybTY0LW1zdmMnKX1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgb24gV2luZG93czogXFwke3Byb2Nlc3MuYXJjaH1cXGApKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgICR7cmVxdWlyZVR1cGxlKCdkYXJ3aW4tdW5pdmVyc2FsJywgNil9XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdkYXJ3aW4teDY0Jyl9XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmFyY2ggPT09ICdhcm02NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdkYXJ3aW4tYXJtNjQnKX1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgb24gbWFjT1M6IFxcJHtwcm9jZXNzLmFyY2h9XFxgKSlcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2ZyZWVic2QnKSB7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdmcmVlYnNkLXg2NCcpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnZnJlZWJzZC1hcm02NCcpfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkRXJyb3JzLnB1c2gobmV3IEVycm9yKFxcYFVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSBvbiBGcmVlQlNEOiBcXCR7cHJvY2Vzcy5hcmNofVxcYCkpXG4gICAgfVxuICB9IGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdsaW51eCcpIHtcbiAgICBpZiAocHJvY2Vzcy5hcmNoID09PSAneDY0Jykge1xuICAgICAgaWYgKGlzTXVzbCgpKSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC14NjQtbXVzbCcsIDEwKX1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC14NjQtZ251JywgMTApfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnKSB7XG4gICAgICBpZiAoaXNNdXNsKCkpIHtcbiAgICAgICAgJHtyZXF1aXJlVHVwbGUoJ2xpbnV4LWFybTY0LW11c2wnLCAxMCl9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgtYXJtNjQtZ251JywgMTApfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtJykge1xuICAgICAgaWYgKGlzTXVzbCgpKSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC1hcm0tbXVzbGVhYmloZicsIDEwKX1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC1hcm0tZ251ZWFiaWhmJywgMTApfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAncmlzY3Y2NCcpIHtcbiAgICAgIGlmIChpc011c2woKSkge1xuICAgICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgtcmlzY3Y2NC1tdXNsJywgMTApfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHtyZXF1aXJlVHVwbGUoJ2xpbnV4LXJpc2N2NjQtZ251JywgMTApfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAncHBjNjQnKSB7XG4gICAgICAke3JlcXVpcmVUdXBsZSgnbGludXgtcHBjNjQtZ251Jyl9XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmFyY2ggPT09ICdzMzkweCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdsaW51eC1zMzkweC1nbnUnKX1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZEVycm9ycy5wdXNoKG5ldyBFcnJvcihcXGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgb24gTGludXg6IFxcJHtwcm9jZXNzLmFyY2h9XFxgKSlcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ29wZW5oYXJtb255Jykge1xuICAgIGlmIChwcm9jZXNzLmFyY2ggPT09ICdhcm02NCcpIHtcbiAgICAgICR7cmVxdWlyZVR1cGxlKCdvcGVuaGFybW9ueS1hcm02NCcpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAneDY0Jykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ29wZW5oYXJtb255LXg2NCcpfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtJykge1xuICAgICAgJHtyZXF1aXJlVHVwbGUoJ29wZW5oYXJtb255LWFybScpfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkRXJyb3JzLnB1c2gobmV3IEVycm9yKFxcYFVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSBvbiBPcGVuSGFybW9ueTogXFwke3Byb2Nlc3MuYXJjaH1cXGApKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2FkRXJyb3JzLnB1c2gobmV3IEVycm9yKFxcYFVuc3VwcG9ydGVkIE9TOiBcXCR7cHJvY2Vzcy5wbGF0Zm9ybX0sIGFyY2hpdGVjdHVyZTogXFwke3Byb2Nlc3MuYXJjaH1cXGApKVxuICB9XG59XG5cbm5hdGl2ZUJpbmRpbmcgPSByZXF1aXJlTmF0aXZlKClcblxuaWYgKCFuYXRpdmVCaW5kaW5nIHx8IHByb2Nlc3MuZW52Lk5BUElfUlNfRk9SQ0VfV0FTSSkge1xuICB0cnkge1xuICAgIG5hdGl2ZUJpbmRpbmcgPSByZXF1aXJlKCcuLyR7bG9jYWxOYW1lfS53YXNpLmNqcycpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OQVBJX1JTX0ZPUkNFX1dBU0kpIHtcbiAgICAgIGxvYWRFcnJvcnMucHVzaChlcnIpXG4gICAgfVxuICB9XG4gIGlmICghbmF0aXZlQmluZGluZykge1xuICAgIHRyeSB7XG4gICAgICBuYXRpdmVCaW5kaW5nID0gcmVxdWlyZSgnJHtwa2dOYW1lfS13YXNtMzItd2FzaScpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTkFQSV9SU19GT1JDRV9XQVNJKSB7XG4gICAgICAgIGxvYWRFcnJvcnMucHVzaChlcnIpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmlmICghbmF0aXZlQmluZGluZykge1xuICBpZiAobG9hZEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXFxgQ2Fubm90IGZpbmQgbmF0aXZlIGJpbmRpbmcuIFxcYCArXG4gICAgICAgIFxcYG5wbSBoYXMgYSBidWcgcmVsYXRlZCB0byBvcHRpb25hbCBkZXBlbmRlbmNpZXMgKGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vY2xpL2lzc3Vlcy80ODI4KS4gXFxgICtcbiAgICAgICAgJ1BsZWFzZSB0cnkgXFxgbnBtIGlcXGAgYWdhaW4gYWZ0ZXIgcmVtb3ZpbmcgYm90aCBwYWNrYWdlLWxvY2suanNvbiBhbmQgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeS4nLFxuICAgICAgeyBjYXVzZTogbG9hZEVycm9ycyB9XG4gICAgKVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcXGBGYWlsZWQgdG8gbG9hZCBuYXRpdmUgYmluZGluZ1xcYClcbn1cbmBcbn1cbiIsImV4cG9ydCBjb25zdCBjcmVhdGVXYXNpQnJvd3NlckJpbmRpbmcgPSAoXG4gIHdhc2lGaWxlbmFtZTogc3RyaW5nLFxuICBpbml0aWFsTWVtb3J5ID0gNDAwMCxcbiAgbWF4aW11bU1lbW9yeSA9IDY1NTM2LFxuICBmcyA9IGZhbHNlLFxuICBhc3luY0luaXQgPSBmYWxzZSxcbiAgYnVmZmVyID0gZmFsc2UsXG4pID0+IHtcbiAgY29uc3QgZnNJbXBvcnQgPSBmc1xuICAgID8gYnVmZmVyXG4gICAgICA/IGBpbXBvcnQgeyBtZW1mcywgQnVmZmVyIH0gZnJvbSAnQG5hcGktcnMvd2FzbS1ydW50aW1lL2ZzJ2BcbiAgICAgIDogYGltcG9ydCB7IG1lbWZzIH0gZnJvbSAnQG5hcGktcnMvd2FzbS1ydW50aW1lL2ZzJ2BcbiAgICA6ICcnXG4gIGNvbnN0IGJ1ZmZlckltcG9ydCA9IGJ1ZmZlciAmJiAhZnMgPyBgaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJ2AgOiAnJ1xuICBjb25zdCB3YXNpQ3JlYXRpb24gPSBmc1xuICAgID8gYFxuZXhwb3J0IGNvbnN0IHsgZnM6IF9fZnMsIHZvbDogX192b2x1bWUgfSA9IG1lbWZzKClcblxuY29uc3QgX193YXNpID0gbmV3IF9fV0FTSSh7XG4gIHZlcnNpb246ICdwcmV2aWV3MScsXG4gIGZzOiBfX2ZzLFxuICBwcmVvcGVuczoge1xuICAgICcvJzogJy8nLFxuICB9LFxufSlgXG4gICAgOiBgXG5jb25zdCBfX3dhc2kgPSBuZXcgX19XQVNJKHtcbiAgdmVyc2lvbjogJ3ByZXZpZXcxJyxcbn0pYFxuXG4gIGNvbnN0IHdvcmtlckZzSGFuZGxlciA9IGZzXG4gICAgPyBgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgX193YXNtQ3JlYXRlT25NZXNzYWdlRm9yRnNQcm94eShfX2ZzKSlcXG5gXG4gICAgOiAnJ1xuXG4gIGNvbnN0IGVtbmFwaUluamVjdEJ1ZmZlciA9IGJ1ZmZlclxuICAgID8gJ19fZW1uYXBpQ29udGV4dC5mZWF0dXJlLkJ1ZmZlciA9IEJ1ZmZlcidcbiAgICA6ICcnXG4gIGNvbnN0IGVtbmFwaUluc3RhbnRpYXRlSW1wb3J0ID0gYXN5bmNJbml0XG4gICAgPyBgaW5zdGFudGlhdGVOYXBpTW9kdWxlIGFzIF9fZW1uYXBpSW5zdGFudGlhdGVOYXBpTW9kdWxlYFxuICAgIDogYGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMgYXMgX19lbW5hcGlJbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jYFxuICBjb25zdCBlbW5hcGlJbnN0YW50aWF0ZUNhbGwgPSBhc3luY0luaXRcbiAgICA/IGBhd2FpdCBfX2VtbmFwaUluc3RhbnRpYXRlTmFwaU1vZHVsZWBcbiAgICA6IGBfX2VtbmFwaUluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmNgXG5cbiAgcmV0dXJuIGBpbXBvcnQge1xuICBjcmVhdGVPbk1lc3NhZ2UgYXMgX193YXNtQ3JlYXRlT25NZXNzYWdlRm9yRnNQcm94eSxcbiAgZ2V0RGVmYXVsdENvbnRleHQgYXMgX19lbW5hcGlHZXREZWZhdWx0Q29udGV4dCxcbiAgJHtlbW5hcGlJbnN0YW50aWF0ZUltcG9ydH0sXG4gIFdBU0kgYXMgX19XQVNJLFxufSBmcm9tICdAbmFwaS1ycy93YXNtLXJ1bnRpbWUnXG4ke2ZzSW1wb3J0fVxuJHtidWZmZXJJbXBvcnR9XG4ke3dhc2lDcmVhdGlvbn1cblxuY29uc3QgX193YXNtVXJsID0gbmV3IFVSTCgnLi8ke3dhc2lGaWxlbmFtZX0ud2FzbScsIGltcG9ydC5tZXRhLnVybCkuaHJlZlxuY29uc3QgX19lbW5hcGlDb250ZXh0ID0gX19lbW5hcGlHZXREZWZhdWx0Q29udGV4dCgpXG4ke2VtbmFwaUluamVjdEJ1ZmZlcn1cblxuY29uc3QgX19zaGFyZWRNZW1vcnkgPSBuZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtcbiAgaW5pdGlhbDogJHtpbml0aWFsTWVtb3J5fSxcbiAgbWF4aW11bTogJHttYXhpbXVtTWVtb3J5fSxcbiAgc2hhcmVkOiB0cnVlLFxufSlcblxuY29uc3QgX193YXNtRmlsZSA9IGF3YWl0IGZldGNoKF9fd2FzbVVybCkudGhlbigocmVzKSA9PiByZXMuYXJyYXlCdWZmZXIoKSlcblxuY29uc3Qge1xuICBpbnN0YW5jZTogX19uYXBpSW5zdGFuY2UsXG4gIG1vZHVsZTogX193YXNpTW9kdWxlLFxuICBuYXBpTW9kdWxlOiBfX25hcGlNb2R1bGUsXG59ID0gJHtlbW5hcGlJbnN0YW50aWF0ZUNhbGx9KF9fd2FzbUZpbGUsIHtcbiAgY29udGV4dDogX19lbW5hcGlDb250ZXh0LFxuICBhc3luY1dvcmtQb29sU2l6ZTogNCxcbiAgd2FzaTogX193YXNpLFxuICBvbkNyZWF0ZVdvcmtlcigpIHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKG5ldyBVUkwoJy4vd2FzaS13b3JrZXItYnJvd3Nlci5tanMnLCBpbXBvcnQubWV0YS51cmwpLCB7XG4gICAgICB0eXBlOiAnbW9kdWxlJyxcbiAgICB9KVxuJHt3b3JrZXJGc0hhbmRsZXJ9XG4gICAgcmV0dXJuIHdvcmtlclxuICB9LFxuICBvdmVyd3JpdGVJbXBvcnRzKGltcG9ydE9iamVjdCkge1xuICAgIGltcG9ydE9iamVjdC5lbnYgPSB7XG4gICAgICAuLi5pbXBvcnRPYmplY3QuZW52LFxuICAgICAgLi4uaW1wb3J0T2JqZWN0Lm5hcGksXG4gICAgICAuLi5pbXBvcnRPYmplY3QuZW1uYXBpLFxuICAgICAgbWVtb3J5OiBfX3NoYXJlZE1lbW9yeSxcbiAgICB9XG4gICAgcmV0dXJuIGltcG9ydE9iamVjdFxuICB9LFxuICBiZWZvcmVJbml0KHsgaW5zdGFuY2UgfSkge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhpbnN0YW5jZS5leHBvcnRzKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnX19uYXBpX3JlZ2lzdGVyX18nKSkge1xuICAgICAgICBpbnN0YW5jZS5leHBvcnRzW25hbWVdKClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KVxuYFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlV2FzaUJpbmRpbmcgPSAoXG4gIHdhc21GaWxlTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBpbml0aWFsTWVtb3J5ID0gNDAwMCxcbiAgbWF4aW11bU1lbW9yeSA9IDY1NTM2LFxuKSA9PiBgLyogZXNsaW50LWRpc2FibGUgKi9cbi8qIHByZXR0aWVyLWlnbm9yZSAqL1xuXG4vKiBhdXRvLWdlbmVyYXRlZCBieSBOQVBJLVJTICovXG5cbmNvbnN0IF9fbm9kZUZzID0gcmVxdWlyZSgnbm9kZTpmcycpXG5jb25zdCBfX25vZGVQYXRoID0gcmVxdWlyZSgnbm9kZTpwYXRoJylcbmNvbnN0IHsgV0FTSTogX19ub2RlV0FTSSB9ID0gcmVxdWlyZSgnbm9kZTp3YXNpJylcbmNvbnN0IHsgV29ya2VyIH0gPSByZXF1aXJlKCdub2RlOndvcmtlcl90aHJlYWRzJylcblxuY29uc3Qge1xuICBjcmVhdGVPbk1lc3NhZ2U6IF9fd2FzbUNyZWF0ZU9uTWVzc2FnZUZvckZzUHJveHksXG4gIGdldERlZmF1bHRDb250ZXh0OiBfX2VtbmFwaUdldERlZmF1bHRDb250ZXh0LFxuICBpbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jOiBfX2VtbmFwaUluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMsXG59ID0gcmVxdWlyZSgnQG5hcGktcnMvd2FzbS1ydW50aW1lJylcblxuY29uc3QgX19yb290RGlyID0gX19ub2RlUGF0aC5wYXJzZShwcm9jZXNzLmN3ZCgpKS5yb290XG5cbmNvbnN0IF9fd2FzaSA9IG5ldyBfX25vZGVXQVNJKHtcbiAgdmVyc2lvbjogJ3ByZXZpZXcxJyxcbiAgZW52OiBwcm9jZXNzLmVudixcbiAgcHJlb3BlbnM6IHtcbiAgICBbX19yb290RGlyXTogX19yb290RGlyLFxuICB9XG59KVxuXG5jb25zdCBfX2VtbmFwaUNvbnRleHQgPSBfX2VtbmFwaUdldERlZmF1bHRDb250ZXh0KClcblxuY29uc3QgX19zaGFyZWRNZW1vcnkgPSBuZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtcbiAgaW5pdGlhbDogJHtpbml0aWFsTWVtb3J5fSxcbiAgbWF4aW11bTogJHttYXhpbXVtTWVtb3J5fSxcbiAgc2hhcmVkOiB0cnVlLFxufSlcblxubGV0IF9fd2FzbUZpbGVQYXRoID0gX19ub2RlUGF0aC5qb2luKF9fZGlybmFtZSwgJyR7d2FzbUZpbGVOYW1lfS53YXNtJylcbmNvbnN0IF9fd2FzbURlYnVnRmlsZVBhdGggPSBfX25vZGVQYXRoLmpvaW4oX19kaXJuYW1lLCAnJHt3YXNtRmlsZU5hbWV9LmRlYnVnLndhc20nKVxuXG5pZiAoX19ub2RlRnMuZXhpc3RzU3luYyhfX3dhc21EZWJ1Z0ZpbGVQYXRoKSkge1xuICBfX3dhc21GaWxlUGF0aCA9IF9fd2FzbURlYnVnRmlsZVBhdGhcbn0gZWxzZSBpZiAoIV9fbm9kZUZzLmV4aXN0c1N5bmMoX193YXNtRmlsZVBhdGgpKSB7XG4gIHRyeSB7XG4gICAgX193YXNtRmlsZVBhdGggPSBfX25vZGVQYXRoLnJlc29sdmUoJyR7cGFja2FnZU5hbWV9LXdhc20zMi13YXNpJylcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCAke3dhc21GaWxlTmFtZX0ud2FzbSBmaWxlLCBhbmQgJHtwYWNrYWdlTmFtZX0td2FzbTMyLXdhc2kgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkLicpXG4gIH1cbn1cblxuY29uc3QgeyBpbnN0YW5jZTogX19uYXBpSW5zdGFuY2UsIG1vZHVsZTogX193YXNpTW9kdWxlLCBuYXBpTW9kdWxlOiBfX25hcGlNb2R1bGUgfSA9IF9fZW1uYXBpSW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYyhfX25vZGVGcy5yZWFkRmlsZVN5bmMoX193YXNtRmlsZVBhdGgpLCB7XG4gIGNvbnRleHQ6IF9fZW1uYXBpQ29udGV4dCxcbiAgYXN5bmNXb3JrUG9vbFNpemU6IChmdW5jdGlvbigpIHtcbiAgICBjb25zdCB0aHJlYWRzU2l6ZUZyb21FbnYgPSBOdW1iZXIocHJvY2Vzcy5lbnYuTkFQSV9SU19BU1lOQ19XT1JLX1BPT0xfU0laRSA/PyBwcm9jZXNzLmVudi5VVl9USFJFQURQT09MX1NJWkUpXG4gICAgLy8gTmFOID4gMCBpcyBmYWxzZVxuICAgIGlmICh0aHJlYWRzU2l6ZUZyb21FbnYgPiAwKSB7XG4gICAgICByZXR1cm4gdGhyZWFkc1NpemVGcm9tRW52XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA0XG4gICAgfVxuICB9KSgpLFxuICByZXVzZVdvcmtlcjogdHJ1ZSxcbiAgd2FzaTogX193YXNpLFxuICBvbkNyZWF0ZVdvcmtlcigpIHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKF9fbm9kZVBhdGguam9pbihfX2Rpcm5hbWUsICd3YXNpLXdvcmtlci5tanMnKSwge1xuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICB9KVxuICAgIHdvcmtlci5vbm1lc3NhZ2UgPSAoeyBkYXRhIH0pID0+IHtcbiAgICAgIF9fd2FzbUNyZWF0ZU9uTWVzc2FnZUZvckZzUHJveHkoX19ub2RlRnMpKGRhdGEpXG4gICAgfVxuXG4gICAgLy8gVGhlIG1haW4gdGhyZWFkIG9mIE5vZGUuanMgd2FpdHMgZm9yIGFsbCB0aGUgYWN0aXZlIGhhbmRsZXMgYmVmb3JlIGV4aXRpbmcuXG4gICAgLy8gQnV0IFJ1c3QgdGhyZWFkcyBhcmUgbmV2ZXIgd2FpdGVkIHdpdGhvdXQgXFxgdGhyZWFkOjpqb2luXFxgLlxuICAgIC8vIFNvIGhlcmUgd2UgaGFjayB0aGUgY29kZSBvZiBOb2RlLmpzIHRvIHByZXZlbnQgdGhlIHdvcmtlcnMgZnJvbSBiZWluZyByZWZlcmVuY2VkIChhY3RpdmUpLlxuICAgIC8vIEFjY29yZGluZyB0byBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi8xOWUwZDQ3MjcyOGM3OWQ0MThiNzRiZGRmZjU4OGJlYTcwYTQwM2QwL2xpYi9pbnRlcm5hbC93b3JrZXIuanMjTDQxNSxcbiAgICAvLyBhIHdvcmtlciBpcyBjb25zaXN0IG9mIHR3byBoYW5kbGVzOiBrUHVibGljUG9ydCBhbmQga0hhbmRsZS5cbiAgICB7XG4gICAgICBjb25zdCBrUHVibGljUG9ydCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMod29ya2VyKS5maW5kKHMgPT5cbiAgICAgICAgcy50b1N0cmluZygpLmluY2x1ZGVzKFwia1B1YmxpY1BvcnRcIilcbiAgICAgICk7XG4gICAgICBpZiAoa1B1YmxpY1BvcnQpIHtcbiAgICAgICAgd29ya2VyW2tQdWJsaWNQb3J0XS5yZWYgPSAoKSA9PiB7fTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga0hhbmRsZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMod29ya2VyKS5maW5kKHMgPT5cbiAgICAgICAgcy50b1N0cmluZygpLmluY2x1ZGVzKFwia0hhbmRsZVwiKVxuICAgICAgKTtcbiAgICAgIGlmIChrSGFuZGxlKSB7XG4gICAgICAgIHdvcmtlcltrSGFuZGxlXS5yZWYgPSAoKSA9PiB7fTtcbiAgICAgIH1cblxuICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgfVxuICAgIHJldHVybiB3b3JrZXJcbiAgfSxcbiAgb3ZlcndyaXRlSW1wb3J0cyhpbXBvcnRPYmplY3QpIHtcbiAgICBpbXBvcnRPYmplY3QuZW52ID0ge1xuICAgICAgLi4uaW1wb3J0T2JqZWN0LmVudixcbiAgICAgIC4uLmltcG9ydE9iamVjdC5uYXBpLFxuICAgICAgLi4uaW1wb3J0T2JqZWN0LmVtbmFwaSxcbiAgICAgIG1lbW9yeTogX19zaGFyZWRNZW1vcnksXG4gICAgfVxuICAgIHJldHVybiBpbXBvcnRPYmplY3RcbiAgfSxcbiAgYmVmb3JlSW5pdCh7IGluc3RhbmNlIH0pIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoaW5zdGFuY2UuZXhwb3J0cykpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ19fbmFwaV9yZWdpc3Rlcl9fJykpIHtcbiAgICAgICAgaW5zdGFuY2UuZXhwb3J0c1tuYW1lXSgpXG4gICAgICB9XG4gICAgfVxuICB9LFxufSlcbmBcbiIsImV4cG9ydCBjb25zdCBXQVNJX1dPUktFUl9URU1QTEFURSA9IGBpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgV0FTSSB9IGZyb20gXCJub2RlOndhc2lcIjtcbmltcG9ydCB7IHBhcmVudFBvcnQsIFdvcmtlciB9IGZyb20gXCJub2RlOndvcmtlcl90aHJlYWRzXCI7XG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmNvbnN0IHsgaW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYywgTWVzc2FnZUhhbmRsZXIsIGdldERlZmF1bHRDb250ZXh0IH0gPSByZXF1aXJlKFwiQG5hcGktcnMvd2FzbS1ydW50aW1lXCIpO1xuXG5pZiAocGFyZW50UG9ydCkge1xuICBwYXJlbnRQb3J0Lm9uKFwibWVzc2FnZVwiLCAoZGF0YSkgPT4ge1xuICAgIGdsb2JhbFRoaXMub25tZXNzYWdlKHsgZGF0YSB9KTtcbiAgfSk7XG59XG5cbk9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge1xuICBzZWxmOiBnbG9iYWxUaGlzLFxuICByZXF1aXJlLFxuICBXb3JrZXIsXG4gIGltcG9ydFNjcmlwdHM6IGZ1bmN0aW9uIChmKSB7XG4gICAgOygwLCBldmFsKShmcy5yZWFkRmlsZVN5bmMoZiwgXCJ1dGY4XCIpICsgXCIvLyMgc291cmNlVVJMPVwiICsgZik7XG4gIH0sXG4gIHBvc3RNZXNzYWdlOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgaWYgKHBhcmVudFBvcnQpIHtcbiAgICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICB9XG4gIH0sXG59KTtcblxuY29uc3QgZW1uYXBpQ29udGV4dCA9IGdldERlZmF1bHRDb250ZXh0KCk7XG5cbmNvbnN0IF9fcm9vdERpciA9IHBhcnNlKHByb2Nlc3MuY3dkKCkpLnJvb3Q7XG5cbmNvbnN0IGhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoe1xuICBvbkxvYWQoeyB3YXNtTW9kdWxlLCB3YXNtTWVtb3J5IH0pIHtcbiAgICBjb25zdCB3YXNpID0gbmV3IFdBU0koe1xuICAgICAgdmVyc2lvbjogJ3ByZXZpZXcxJyxcbiAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICBwcmVvcGVuczoge1xuICAgICAgICBbX19yb290RGlyXTogX19yb290RGlyLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jKHdhc21Nb2R1bGUsIHtcbiAgICAgIGNoaWxkVGhyZWFkOiB0cnVlLFxuICAgICAgd2FzaSxcbiAgICAgIGNvbnRleHQ6IGVtbmFwaUNvbnRleHQsXG4gICAgICBvdmVyd3JpdGVJbXBvcnRzKGltcG9ydE9iamVjdCkge1xuICAgICAgICBpbXBvcnRPYmplY3QuZW52ID0ge1xuICAgICAgICAgIC4uLmltcG9ydE9iamVjdC5lbnYsXG4gICAgICAgICAgLi4uaW1wb3J0T2JqZWN0Lm5hcGksXG4gICAgICAgICAgLi4uaW1wb3J0T2JqZWN0LmVtbmFwaSxcbiAgICAgICAgICBtZW1vcnk6IHdhc21NZW1vcnlcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0sXG59KTtcblxuZ2xvYmFsVGhpcy5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICBoYW5kbGVyLmhhbmRsZShlKTtcbn07XG5gXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVXYXNpQnJvd3NlcldvcmtlckJpbmRpbmcgPSAoZnM6IGJvb2xlYW4pID0+IHtcbiAgY29uc3QgZnNJbXBvcnQgPSBmc1xuICAgID8gYGltcG9ydCB7IGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMsIE1lc3NhZ2VIYW5kbGVyLCBXQVNJLCBjcmVhdGVGc1Byb3h5IH0gZnJvbSAnQG5hcGktcnMvd2FzbS1ydW50aW1lJ1xuaW1wb3J0IHsgbWVtZnNFeHBvcnRlZCBhcyBfX21lbWZzRXhwb3J0ZWQgfSBmcm9tICdAbmFwaS1ycy93YXNtLXJ1bnRpbWUvZnMnXG5cbmNvbnN0IGZzID0gY3JlYXRlRnNQcm94eShfX21lbWZzRXhwb3J0ZWQpYFxuICAgIDogYGltcG9ydCB7IGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMsIE1lc3NhZ2VIYW5kbGVyLCBXQVNJIH0gZnJvbSAnQG5hcGktcnMvd2FzbS1ydW50aW1lJ2BcbiAgY29uc3Qgd2FzaUNyZWF0aW9uID0gZnNcbiAgICA/IGBjb25zdCB3YXNpID0gbmV3IFdBU0koe1xuICAgICAgZnMsXG4gICAgICBwcmVvcGVuczoge1xuICAgICAgICAnLyc6ICcvJyxcbiAgICAgIH0sXG4gICAgICBwcmludDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpXG4gICAgICB9LFxuICAgICAgcHJpbnRFcnI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cylcbiAgICAgIH0sXG4gICAgfSlgXG4gICAgOiBgY29uc3Qgd2FzaSA9IG5ldyBXQVNJKHtcbiAgICAgIHByaW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cylcbiAgICAgIH0sXG4gICAgICBwcmludEVycjogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKVxuICAgICAgfSxcbiAgICB9KWBcbiAgcmV0dXJuIGAke2ZzSW1wb3J0fVxuXG5jb25zdCBoYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKHtcbiAgb25Mb2FkKHsgd2FzbU1vZHVsZSwgd2FzbU1lbW9yeSB9KSB7XG4gICAgJHt3YXNpQ3JlYXRpb259XG4gICAgcmV0dXJuIGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMod2FzbU1vZHVsZSwge1xuICAgICAgY2hpbGRUaHJlYWQ6IHRydWUsXG4gICAgICB3YXNpLFxuICAgICAgb3ZlcndyaXRlSW1wb3J0cyhpbXBvcnRPYmplY3QpIHtcbiAgICAgICAgaW1wb3J0T2JqZWN0LmVudiA9IHtcbiAgICAgICAgICAuLi5pbXBvcnRPYmplY3QuZW52LFxuICAgICAgICAgIC4uLmltcG9ydE9iamVjdC5uYXBpLFxuICAgICAgICAgIC4uLmltcG9ydE9iamVjdC5lbW5hcGksXG4gICAgICAgICAgbWVtb3J5OiB3YXNtTWVtb3J5LFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pXG4gIH0sXG59KVxuXG5nbG9iYWxUaGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gIGhhbmRsZXIuaGFuZGxlKGUpXG59XG5gXG59XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2VzcydcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0bydcbmltcG9ydCB7IGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcm1TeW5jIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSdcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJ1xuaW1wb3J0IHsgcGFyc2UsIGpvaW4sIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCAqIGFzIGNvbG9ycyBmcm9tICdjb2xvcmV0dGUnXG5cbmltcG9ydCB7IEJ1aWxkT3B0aW9ucyBhcyBSYXdCdWlsZE9wdGlvbnMgfSBmcm9tICcuLi9kZWYvYnVpbGQuanMnXG5pbXBvcnQge1xuICBDTElfVkVSU0lPTixcbiAgY29weUZpbGVBc3luYyxcbiAgQ3JhdGUsXG4gIGRlYnVnRmFjdG9yeSxcbiAgREVGQVVMVF9UWVBFX0RFRl9IRUFERVIsXG4gIGZpbGVFeGlzdHMsXG4gIGdldFN5c3RlbURlZmF1bHRUYXJnZXQsXG4gIGdldFRhcmdldExpbmtlcixcbiAgbWtkaXJBc3luYyxcbiAgTmFwaUNvbmZpZyxcbiAgcGFyc2VNZXRhZGF0YSxcbiAgcGFyc2VUcmlwbGUsXG4gIHByb2Nlc3NUeXBlRGVmLFxuICByZWFkRmlsZUFzeW5jLFxuICByZWFkTmFwaUNvbmZpZyxcbiAgVGFyZ2V0LFxuICB0YXJnZXRUb0VudlZhcixcbiAgdHJ5SW5zdGFsbENhcmdvQmluYXJ5LFxuICB1bmxpbmtBc3luYyxcbiAgd3JpdGVGaWxlQXN5bmMsXG4gIGRpckV4aXN0c0FzeW5jLFxuICByZWFkZGlyQXN5bmMsXG4gIENhcmdvV29ya3NwYWNlTWV0YWRhdGEsXG59IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuXG5pbXBvcnQgeyBjcmVhdGVDanNCaW5kaW5nLCBjcmVhdGVFc21CaW5kaW5nIH0gZnJvbSAnLi90ZW1wbGF0ZXMvaW5kZXguanMnXG5pbXBvcnQge1xuICBjcmVhdGVXYXNpQmluZGluZyxcbiAgY3JlYXRlV2FzaUJyb3dzZXJCaW5kaW5nLFxufSBmcm9tICcuL3RlbXBsYXRlcy9sb2FkLXdhc2ktdGVtcGxhdGUuanMnXG5pbXBvcnQge1xuICBjcmVhdGVXYXNpQnJvd3NlcldvcmtlckJpbmRpbmcsXG4gIFdBU0lfV09SS0VSX1RFTVBMQVRFLFxufSBmcm9tICcuL3RlbXBsYXRlcy93YXNpLXdvcmtlci10ZW1wbGF0ZS5qcydcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0ZhY3RvcnkoJ2J1aWxkJylcbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcblxudHlwZSBPdXRwdXRLaW5kID0gJ2pzJyB8ICdkdHMnIHwgJ25vZGUnIHwgJ2V4ZScgfCAnd2FzbSdcbnR5cGUgT3V0cHV0ID0geyBraW5kOiBPdXRwdXRLaW5kOyBwYXRoOiBzdHJpbmcgfVxuXG50eXBlIEJ1aWxkT3B0aW9ucyA9IFJhd0J1aWxkT3B0aW9ucyAmIHsgY2FyZ29PcHRpb25zPzogc3RyaW5nW10gfVxudHlwZSBQYXJzZWRCdWlsZE9wdGlvbnMgPSBPbWl0PEJ1aWxkT3B0aW9ucywgJ2N3ZCc+ICYgeyBjd2Q6IHN0cmluZyB9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFByb2plY3QocmF3T3B0aW9uczogQnVpbGRPcHRpb25zKSB7XG4gIGRlYnVnKCduYXBpIGJ1aWxkIGNvbW1hbmQgcmVjZWl2ZSBvcHRpb25zOiAlTycsIHJhd09wdGlvbnMpXG5cbiAgY29uc3Qgb3B0aW9uczogUGFyc2VkQnVpbGRPcHRpb25zID0ge1xuICAgIGR0c0NhY2hlOiB0cnVlLFxuICAgIC4uLnJhd09wdGlvbnMsXG4gICAgY3dkOiByYXdPcHRpb25zLmN3ZCA/PyBwcm9jZXNzLmN3ZCgpLFxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZVBhdGggPSAoLi4ucGF0aHM6IHN0cmluZ1tdKSA9PiByZXNvbHZlKG9wdGlvbnMuY3dkLCAuLi5wYXRocylcblxuICBjb25zdCBtYW5pZmVzdFBhdGggPSByZXNvbHZlUGF0aChvcHRpb25zLm1hbmlmZXN0UGF0aCA/PyAnQ2FyZ28udG9tbCcpXG4gIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgcGFyc2VNZXRhZGF0YShtYW5pZmVzdFBhdGgpXG5cbiAgY29uc3QgY3JhdGUgPSBtZXRhZGF0YS5wYWNrYWdlcy5maW5kKChwKSA9PiB7XG4gICAgLy8gcGFja2FnZSB3aXRoIGdpdmVuIG5hbWVcbiAgICBpZiAob3B0aW9ucy5wYWNrYWdlKSB7XG4gICAgICByZXR1cm4gcC5uYW1lID09PSBvcHRpb25zLnBhY2thZ2VcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHAubWFuaWZlc3RfcGF0aCA9PT0gbWFuaWZlc3RQYXRoXG4gICAgfVxuICB9KVxuXG4gIGlmICghY3JhdGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgY3JhdGUgdG8gYnVpbGQuIEl0IHNlZW1zIHlvdSBhcmUgdHJ5aW5nIHRvIGJ1aWxkIGEgY3JhdGUgaW4gYSB3b3Jrc3BhY2UsIHRyeSB1c2luZyBgLS1wYWNrYWdlYCBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcGFja2FnZSB0byBidWlsZC4nLFxuICAgIClcbiAgfVxuICBjb25zdCBjb25maWcgPSBhd2FpdCByZWFkTmFwaUNvbmZpZyhcbiAgICByZXNvbHZlUGF0aChcbiAgICAgIG9wdGlvbnMuY29uZmlnUGF0aCA/PyBvcHRpb25zLnBhY2thZ2VKc29uUGF0aCA/PyAncGFja2FnZS5qc29uJyxcbiAgICApLFxuICAgIG9wdGlvbnMuY29uZmlnUGF0aCA/IHJlc29sdmVQYXRoKG9wdGlvbnMuY29uZmlnUGF0aCkgOiB1bmRlZmluZWQsXG4gIClcblxuICBjb25zdCBidWlsZGVyID0gbmV3IEJ1aWxkZXIobWV0YWRhdGEsIGNyYXRlLCBjb25maWcsIG9wdGlvbnMpXG5cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKVxufVxuXG5jbGFzcyBCdWlsZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcmdzOiBzdHJpbmdbXSA9IFtdXG4gIHByaXZhdGUgcmVhZG9ubHkgZW52czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0czogT3V0cHV0W10gPSBbXVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0OiBUYXJnZXRcbiAgcHJpdmF0ZSByZWFkb25seSBjcmF0ZURpcjogc3RyaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0RGlyOiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSB0YXJnZXREaXI6IHN0cmluZ1xuICBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZVR5cGVEZWY6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YWRhdGE6IENhcmdvV29ya3NwYWNlTWV0YWRhdGEsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjcmF0ZTogQ3JhdGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IE5hcGlDb25maWcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBQYXJzZWRCdWlsZE9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMudGFyZ2V0ID0gb3B0aW9ucy50YXJnZXRcbiAgICAgID8gcGFyc2VUcmlwbGUob3B0aW9ucy50YXJnZXQpXG4gICAgICA6IHByb2Nlc3MuZW52LkNBUkdPX0JVSUxEX1RBUkdFVFxuICAgICAgICA/IHBhcnNlVHJpcGxlKHByb2Nlc3MuZW52LkNBUkdPX0JVSUxEX1RBUkdFVClcbiAgICAgICAgOiBnZXRTeXN0ZW1EZWZhdWx0VGFyZ2V0KClcbiAgICB0aGlzLmNyYXRlRGlyID0gcGFyc2UoY3JhdGUubWFuaWZlc3RfcGF0aCkuZGlyXG4gICAgdGhpcy5vdXRwdXREaXIgPSByZXNvbHZlKFxuICAgICAgdGhpcy5vcHRpb25zLmN3ZCxcbiAgICAgIG9wdGlvbnMub3V0cHV0RGlyID8/IHRoaXMuY3JhdGVEaXIsXG4gICAgKVxuICAgIHRoaXMudGFyZ2V0RGlyID1cbiAgICAgIG9wdGlvbnMudGFyZ2V0RGlyID8/XG4gICAgICBwcm9jZXNzLmVudi5DQVJHT19CVUlMRF9UQVJHRVRfRElSID8/XG4gICAgICBtZXRhZGF0YS50YXJnZXRfZGlyZWN0b3J5XG4gICAgdGhpcy5lbmFibGVUeXBlRGVmID0gdGhpcy5jcmF0ZS5kZXBlbmRlbmNpZXMuc29tZShcbiAgICAgIChkZXApID0+XG4gICAgICAgIGRlcC5uYW1lID09PSAnbmFwaS1kZXJpdmUnICYmXG4gICAgICAgIChkZXAudXNlc19kZWZhdWx0X2ZlYXR1cmVzIHx8IGRlcC5mZWF0dXJlcy5pbmNsdWRlcygndHlwZS1kZWYnKSksXG4gICAgKVxuXG4gICAgaWYgKCF0aGlzLmVuYWJsZVR5cGVEZWYpIHtcbiAgICAgIGNvbnN0IHJlcXVpcmVtZW50V2FybmluZyA9XG4gICAgICAgICdgbmFwaS1kZXJpdmVgIGNyYXRlIGlzIG5vdCB1c2VkIG9yIGB0eXBlLWRlZmAgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCBmb3IgYG5hcGktZGVyaXZlYCBjcmF0ZSdcbiAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgIGAke3JlcXVpcmVtZW50V2FybmluZ30uIFdpbGwgc2tpcCBiaW5kaW5nIGdlbmVyYXRpb24gZm9yIFxcYC5ub2RlXFxgLCBcXGAud2FzaVxcYCBhbmQgXFxgLmQudHNcXGAgZmlsZXMuYCxcbiAgICAgIClcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm9wdGlvbnMuZHRzIHx8XG4gICAgICAgIHRoaXMub3B0aW9ucy5kdHNIZWFkZXIgfHxcbiAgICAgICAgdGhpcy5jb25maWcuZHRzSGVhZGVyIHx8XG4gICAgICAgIHRoaXMuY29uZmlnLmR0c0hlYWRlckZpbGVcbiAgICAgICkge1xuICAgICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAgIGAke3JlcXVpcmVtZW50V2FybmluZ30uIFxcYGR0c1xcYCByZWxhdGVkIG9wdGlvbnMgYXJlIGVuYWJsZWQgYnV0IHdpbGwgYmUgaWdub3JlZC5gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNkeUxpYk5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JhdGUudGFyZ2V0cy5maW5kKCh0KSA9PiB0LmNyYXRlX3R5cGVzLmluY2x1ZGVzKCdjZHlsaWInKSlcbiAgICAgID8ubmFtZVxuICB9XG5cbiAgZ2V0IGJpbk5hbWUoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMub3B0aW9ucy5iaW4gPz9cbiAgICAgIC8vIG9ubHkgYXZhaWxhYmxlIGlmIG5vdCBjZHlsaWIgb3IgYmluIG5hbWUgc3BlY2lmaWVkXG4gICAgICAodGhpcy5jZHlMaWJOYW1lXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMuY3JhdGUudGFyZ2V0cy5maW5kKCh0KSA9PiB0LmNyYXRlX3R5cGVzLmluY2x1ZGVzKCdiaW4nKSk/Lm5hbWUpXG4gICAgKVxuICB9XG5cbiAgYnVpbGQoKSB7XG4gICAgaWYgKCF0aGlzLmNkeUxpYk5hbWUpIHtcbiAgICAgIGNvbnN0IHdhcm5pbmcgPVxuICAgICAgICAnTWlzc2luZyBgY3JhdGUtdHlwZSA9IFtcImNkeWxpYlwiXWAgaW4gW2xpYl0gY29uZmlnLiBUaGUgYnVpbGQgcmVzdWx0IHdpbGwgbm90IGJlIGF2YWlsYWJsZSBhcyBub2RlIGFkZG9uLidcblxuICAgICAgaWYgKHRoaXMuYmluTmFtZSkge1xuICAgICAgICBkZWJ1Zy53YXJuKHdhcm5pbmcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3Iod2FybmluZylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5waWNrQmluYXJ5KClcbiAgICAgIC5zZXRQYWNrYWdlKClcbiAgICAgIC5zZXRGZWF0dXJlcygpXG4gICAgICAuc2V0VGFyZ2V0KClcbiAgICAgIC5waWNrQ3Jvc3NUb29sY2hhaW4oKVxuICAgICAgLnNldEVudnMoKVxuICAgICAgLnNldEJ5cGFzc0FyZ3MoKVxuICAgICAgLmV4ZWMoKVxuICB9XG5cbiAgcHJpdmF0ZSBwaWNrQ3Jvc3NUb29sY2hhaW4oKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMudXNlTmFwaUNyb3NzKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZUNyb3NzKSB7XG4gICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAnWW91IGFyZSB0cnlpbmcgdG8gdXNlIGJvdGggYC0tY3Jvc3NgIGFuZCBgLS11c2UtbmFwaS1jcm9zc2Agb3B0aW9ucywgYC0tdXNlLWNyb3NzYCB3aWxsIGJlIGlnbm9yZWQuJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNyb3NzQ29tcGlsZSkge1xuICAgICAgZGVidWcud2FybihcbiAgICAgICAgJ1lvdSBhcmUgdHJ5aW5nIHRvIHVzZSBib3RoIGAtLWNyb3NzLWNvbXBpbGVgIGFuZCBgLS11c2UtbmFwaS1jcm9zc2Agb3B0aW9ucywgYC0tY3Jvc3MtY29tcGlsZWAgd2lsbCBiZSBpZ25vcmVkLicsXG4gICAgICApXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdmVyc2lvbiwgZG93bmxvYWQgfSA9IHJlcXVpcmUoJ0BuYXBpLXJzL2Nyb3NzLXRvb2xjaGFpbicpXG5cbiAgICAgIGNvbnN0IGFsaWFzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnczM5MHgtdW5rbm93bi1saW51eC1nbnUnOiAnczM5MHgtaWJtLWxpbnV4LWdudScsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvb2xjaGFpblBhdGggPSBqb2luKFxuICAgICAgICBob21lZGlyKCksXG4gICAgICAgICcubmFwaS1ycycsXG4gICAgICAgICdjcm9zcy10b29sY2hhaW4nLFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICB0aGlzLnRhcmdldC50cmlwbGUsXG4gICAgICApXG4gICAgICBta2RpclN5bmModG9vbGNoYWluUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4odG9vbGNoYWluUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICBkZWJ1ZyhgVG9vbGNoYWluICR7dG9vbGNoYWluUGF0aH0gZXhpc3RzLCBza2lwIGV4dHJhY3RpbmdgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdGFyQXJjaGl2ZSA9IGRvd25sb2FkKHByb2Nlc3MuYXJjaCwgdGhpcy50YXJnZXQudHJpcGxlKVxuICAgICAgICB0YXJBcmNoaXZlLnVucGFjayh0b29sY2hhaW5QYXRoKVxuICAgICAgfVxuICAgICAgY29uc3QgdXBwZXJDYXNlVGFyZ2V0ID0gdGFyZ2V0VG9FbnZWYXIodGhpcy50YXJnZXQudHJpcGxlKVxuICAgICAgY29uc3QgY3Jvc3NUYXJnZXROYW1lID0gYWxpYXNbdGhpcy50YXJnZXQudHJpcGxlXSA/PyB0aGlzLnRhcmdldC50cmlwbGVcbiAgICAgIGNvbnN0IGxpbmtlckVudiA9IGBDQVJHT19UQVJHRVRfJHt1cHBlckNhc2VUYXJnZXR9X0xJTktFUmBcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgIGxpbmtlckVudixcbiAgICAgICAgam9pbih0b29sY2hhaW5QYXRoLCAnYmluJywgYCR7Y3Jvc3NUYXJnZXROYW1lfS1nY2NgKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfU1lTUk9PVCcsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgY3Jvc3NUYXJnZXROYW1lLCAnc3lzcm9vdCcpLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9BUicsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgJ2JpbicsIGAke2Nyb3NzVGFyZ2V0TmFtZX0tYXJgKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfUkFOTElCJyxcbiAgICAgICAgam9pbih0b29sY2hhaW5QYXRoLCAnYmluJywgYCR7Y3Jvc3NUYXJnZXROYW1lfS1yYW5saWJgKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfUkVBREVMRicsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgJ2JpbicsIGAke2Nyb3NzVGFyZ2V0TmFtZX0tcmVhZGVsZmApLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9DX0lOQ0xVREVfUEFUSCcsXG4gICAgICAgIGpvaW4odG9vbGNoYWluUGF0aCwgY3Jvc3NUYXJnZXROYW1lLCAnc3lzcm9vdCcsICd1c3InLCAnaW5jbHVkZS8nKSxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfQ0MnLFxuICAgICAgICBqb2luKHRvb2xjaGFpblBhdGgsICdiaW4nLCBgJHtjcm9zc1RhcmdldE5hbWV9LWdjY2ApLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9DWFgnLFxuICAgICAgICBqb2luKHRvb2xjaGFpblBhdGgsICdiaW4nLCBgJHtjcm9zc1RhcmdldE5hbWV9LWcrK2ApLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ0JJTkRHRU5fRVhUUkFfQ0xBTkdfQVJHUycsXG4gICAgICAgIGAtLXN5c3Jvb3Q9JHt0aGlzLmVudnMuVEFSR0VUX1NZU1JPT1R9fWAsXG4gICAgICApXG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvY2Vzcy5lbnYuVEFSR0VUX0NDPy5zdGFydHNXaXRoKCdjbGFuZycpIHx8XG4gICAgICAgIChwcm9jZXNzLmVudi5DQz8uc3RhcnRzV2l0aCgnY2xhbmcnKSAmJiAhcHJvY2Vzcy5lbnYuVEFSR0VUX0NDKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFRBUkdFVF9DRkxBR1MgPSBwcm9jZXNzLmVudi5UQVJHRVRfQ0ZMQUdTID8/ICcnXG4gICAgICAgIHRoaXMuZW52cy5UQVJHRVRfQ0ZMQUdTID0gYC0tc3lzcm9vdD0ke3RoaXMuZW52cy5UQVJHRVRfU1lTUk9PVH0gLS1nY2MtdG9vbGNoYWluPSR7dG9vbGNoYWluUGF0aH0gJHtUQVJHRVRfQ0ZMQUdTfWBcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgKHByb2Nlc3MuZW52LkNYWD8uc3RhcnRzV2l0aCgnY2xhbmcrKycpICYmICFwcm9jZXNzLmVudi5UQVJHRVRfQ1hYKSB8fFxuICAgICAgICBwcm9jZXNzLmVudi5UQVJHRVRfQ1hYPy5zdGFydHNXaXRoKCdjbGFuZysrJylcbiAgICAgICkge1xuICAgICAgICBjb25zdCBUQVJHRVRfQ1hYRkxBR1MgPSBwcm9jZXNzLmVudi5UQVJHRVRfQ1hYRkxBR1MgPz8gJydcbiAgICAgICAgdGhpcy5lbnZzLlRBUkdFVF9DWFhGTEFHUyA9IGAtLXN5c3Jvb3Q9JHt0aGlzLmVudnMuVEFSR0VUX1NZU1JPT1R9IC0tZ2NjLXRvb2xjaGFpbj0ke3Rvb2xjaGFpblBhdGh9ICR7VEFSR0VUX0NYWEZMQUdTfWBcbiAgICAgIH1cbiAgICAgIHRoaXMuZW52cy5QQVRIID0gdGhpcy5lbnZzLlBBVEhcbiAgICAgICAgPyBgJHt0b29sY2hhaW5QYXRofS9iaW46JHt0aGlzLmVudnMuUEFUSH06JHtwcm9jZXNzLmVudi5QQVRIfWBcbiAgICAgICAgOiBgJHt0b29sY2hhaW5QYXRofS9iaW46JHtwcm9jZXNzLmVudi5QQVRIfWBcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1Zy53YXJuKCdQaWNrIGNyb3NzIHRvb2xjaGFpbiBmYWlsZWQnLCBlIGFzIEVycm9yKVxuICAgICAgLy8gaWdub3JlLCBkbyBub3RoaW5nXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcml2YXRlIGV4ZWMoKSB7XG4gICAgZGVidWcoYFN0YXJ0IGJ1aWxkaW5nIGNyYXRlOiAke3RoaXMuY3JhdGUubmFtZX1gKVxuICAgIGRlYnVnKCcgICVpJywgYGNhcmdvICR7dGhpcy5hcmdzLmpvaW4oJyAnKX1gKVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuXG4gICAgY29uc3Qgd2F0Y2ggPSB0aGlzLm9wdGlvbnMud2F0Y2hcbiAgICBjb25zdCBidWlsZFRhc2sgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnVzZUNyb3NzICYmIHRoaXMub3B0aW9ucy5jcm9zc0NvbXBpbGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdgLS11c2UtY3Jvc3NgIGFuZCBgLS1jcm9zcy1jb21waWxlYCBjYW4gbm90IGJlIHVzZWQgdG9nZXRoZXInLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb21tYW5kID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuQ0FSR08gPz8gKHRoaXMub3B0aW9ucy51c2VDcm9zcyA/ICdjcm9zcycgOiAnY2FyZ28nKVxuICAgICAgY29uc3QgYnVpbGRQcm9jZXNzID0gc3Bhd24oY29tbWFuZCwgdGhpcy5hcmdzLCB7XG4gICAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4udGhpcy5lbnZzIH0sXG4gICAgICAgIHN0ZGlvOiB3YXRjaCA/IFsnaW5oZXJpdCcsICdpbmhlcml0JywgJ3BpcGUnXSA6ICdpbmhlcml0JyxcbiAgICAgICAgY3dkOiB0aGlzLm9wdGlvbnMuY3dkLFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSlcblxuICAgICAgYnVpbGRQcm9jZXNzLm9uY2UoJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICAgIGRlYnVnKCclaScsIGBCdWlsZCBjcmF0ZSAke3RoaXMuY3JhdGUubmFtZX0gc3VjY2Vzc2Z1bGx5IWApXG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQnVpbGQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7Y29kZX1gKSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgYnVpbGRQcm9jZXNzLm9uY2UoJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQnVpbGQgZmFpbGVkIHdpdGggZXJyb3I6ICR7ZS5tZXNzYWdlfWAsIHsgY2F1c2U6IGUgfSkpXG4gICAgICB9KVxuXG4gICAgICAvLyB3YXRjaCBtb2RlIG9ubHksIHRoZXkgYXJlIHBpcGVkIHRocm91Z2ggc3RkZXJyXG4gICAgICBidWlsZFByb2Nlc3Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKVxuICAgICAgICBjb25zb2xlLmVycm9yKG91dHB1dClcbiAgICAgICAgaWYgKC9GaW5pc2hlZFxccyhgZGV2YHxgcmVsZWFzZWApLy50ZXN0KG91dHB1dCkpIHtcbiAgICAgICAgICB0aGlzLnBvc3RCdWlsZCgpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFzazogYnVpbGRUYXNrLnRoZW4oKCkgPT4gdGhpcy5wb3N0QnVpbGQoKSksXG4gICAgICBhYm9ydDogKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGlja0JpbmFyeSgpIHtcbiAgICBsZXQgc2V0ID0gZmFsc2VcbiAgICBpZiAodGhpcy5vcHRpb25zLndhdGNoKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHtcbiAgICAgICAgZGVidWcud2FybignV2F0Y2ggbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGluIENJIGVudmlyb25tZW50JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYnVnKCdVc2UgJWknLCAnY2FyZ28td2F0Y2gnKVxuICAgICAgICB0cnlJbnN0YWxsQ2FyZ29CaW5hcnkoJ2NhcmdvLXdhdGNoJywgJ3dhdGNoJylcbiAgICAgICAgLy8geWFybiBuYXBpIHdhdGNoIC0tdGFyZ2V0IHg4Nl82NC11bmtub3duLWxpbnV4LWdudSBbLS1jcm9zcy1jb21waWxlXVxuICAgICAgICAvLyA9PT0+XG4gICAgICAgIC8vIGNhcmdvIHdhdGNoIFsuLi5dIC0tIGJ1aWxkIC0tdGFyZ2V0IHg4Nl82NC11bmtub3duLWxpbnV4LWdudVxuICAgICAgICAvLyBjYXJnbyB3YXRjaCBbLi4uXSAtLSB6aWdidWlsZCAtLXRhcmdldCB4ODZfNjQtdW5rbm93bi1saW51eC1nbnVcbiAgICAgICAgdGhpcy5hcmdzLnB1c2goXG4gICAgICAgICAgJ3dhdGNoJyxcbiAgICAgICAgICAnLS13aHknLFxuICAgICAgICAgICctaScsXG4gICAgICAgICAgJyoue2pzLHRzLG5vZGV9JyxcbiAgICAgICAgICAnLXcnLFxuICAgICAgICAgIHRoaXMuY3JhdGVEaXIsXG4gICAgICAgICAgJy0tJyxcbiAgICAgICAgICAnY2FyZ28nLFxuICAgICAgICAgICdidWlsZCcsXG4gICAgICAgIClcbiAgICAgICAgc2V0ID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3Jvc3NDb21waWxlKSB7XG4gICAgICBpZiAodGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAgICAgJ1lvdSBhcmUgdHJ5aW5nIHRvIGNyb3NzIGNvbXBpbGUgdG8gd2luMzIgcGxhdGZvcm0gb24gd2luMzIgcGxhdGZvcm0gd2hpY2ggaXMgdW5uZWNlc3NhcnkuJyxcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXNlIGNhcmdvLXh3aW4gdG8gY3Jvc3MgY29tcGlsZSB0byB3aW4zMiBwbGF0Zm9ybVxuICAgICAgICAgIGRlYnVnKCdVc2UgJWknLCAnY2FyZ28teHdpbicpXG4gICAgICAgICAgdHJ5SW5zdGFsbENhcmdvQmluYXJ5KCdjYXJnby14d2luJywgJ3h3aW4nKVxuICAgICAgICAgIHRoaXMuYXJncy5wdXNoKCd4d2luJywgJ2J1aWxkJylcbiAgICAgICAgICBpZiAodGhpcy50YXJnZXQuYXJjaCA9PT0gJ2lhMzInKSB7XG4gICAgICAgICAgICB0aGlzLmVudnMuWFdJTl9BUkNIID0gJ3g4NidcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0ID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICdsaW51eCcgJiZcbiAgICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnICYmXG4gICAgICAgICAgdGhpcy50YXJnZXQuYXJjaCA9PT0gcHJvY2Vzcy5hcmNoICYmXG4gICAgICAgICAgKGZ1bmN0aW9uIChhYmk6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGdsaWJjVmVyc2lvblJ1bnRpbWUgPVxuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgIHByb2Nlc3MucmVwb3J0Py5nZXRSZXBvcnQoKT8uaGVhZGVyPy5nbGliY1ZlcnNpb25SdW50aW1lXG4gICAgICAgICAgICBjb25zdCBsaWJjID0gZ2xpYmNWZXJzaW9uUnVudGltZSA/ICdnbnUnIDogJ211c2wnXG4gICAgICAgICAgICByZXR1cm4gYWJpID09PSBsaWJjXG4gICAgICAgICAgfSkodGhpcy50YXJnZXQuYWJpKVxuICAgICAgICApIHtcbiAgICAgICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAgICAgJ1lvdSBhcmUgdHJ5aW5nIHRvIGNyb3NzIGNvbXBpbGUgdG8gbGludXggdGFyZ2V0IG9uIGxpbnV4IHBsYXRmb3JtIHdoaWNoIGlzIHVubmVjZXNzYXJ5LicsXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnZGFyd2luJyAmJlxuICAgICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nXG4gICAgICAgICkge1xuICAgICAgICAgIGRlYnVnLndhcm4oXG4gICAgICAgICAgICAnWW91IGFyZSB0cnlpbmcgdG8gY3Jvc3MgY29tcGlsZSB0byBkYXJ3aW4gdGFyZ2V0IG9uIGRhcndpbiBwbGF0Zm9ybSB3aGljaCBpcyB1bm5lY2Vzc2FyeS4nLFxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB1c2UgY2FyZ28temlnYnVpbGQgdG8gY3Jvc3MgY29tcGlsZSB0byBvdGhlciBwbGF0Zm9ybXNcbiAgICAgICAgICBkZWJ1ZygnVXNlICVpJywgJ2NhcmdvLXppZ2J1aWxkJylcbiAgICAgICAgICB0cnlJbnN0YWxsQ2FyZ29CaW5hcnkoJ2NhcmdvLXppZ2J1aWxkJywgJ3ppZ2J1aWxkJylcbiAgICAgICAgICB0aGlzLmFyZ3MucHVzaCgnemlnYnVpbGQnKVxuICAgICAgICAgIHNldCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghc2V0KSB7XG4gICAgICB0aGlzLmFyZ3MucHVzaCgnYnVpbGQnKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQYWNrYWdlKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBbXVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYWNrYWdlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tcGFja2FnZScsIHRoaXMub3B0aW9ucy5wYWNrYWdlKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmJpbk5hbWUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1iaW4nLCB0aGlzLmJpbk5hbWUpXG4gICAgfVxuXG4gICAgaWYgKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBkZWJ1ZygnU2V0IHBhY2thZ2UgZmxhZ3M6ICcpXG4gICAgICBkZWJ1ZygnICAlTycsIGFyZ3MpXG4gICAgICB0aGlzLmFyZ3MucHVzaCguLi5hcmdzKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcml2YXRlIHNldFRhcmdldCgpIHtcbiAgICBkZWJ1ZygnU2V0IGNvbXBpbGluZyB0YXJnZXQgdG86ICcpXG4gICAgZGVidWcoJyAgJWknLCB0aGlzLnRhcmdldC50cmlwbGUpXG5cbiAgICB0aGlzLmFyZ3MucHVzaCgnLS10YXJnZXQnLCB0aGlzLnRhcmdldC50cmlwbGUpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbnZzKCkge1xuICAgIC8vIFRZUEUgREVGXG4gICAgaWYgKHRoaXMuZW5hYmxlVHlwZURlZikge1xuICAgICAgdGhpcy5lbnZzLk5BUElfVFlQRV9ERUZfVE1QX0ZPTERFUiA9XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVJbnRlcm1lZGlhdGVUeXBlRGVmRm9sZGVyKClcbiAgICAgIHRoaXMuc2V0Rm9yY2VCdWlsZEVudnModGhpcy5lbnZzLk5BUElfVFlQRV9ERUZfVE1QX0ZPTERFUilcbiAgICB9XG5cbiAgICAvLyBSVVNURkxBR1NcbiAgICBsZXQgcnVzdGZsYWdzID1cbiAgICAgIHByb2Nlc3MuZW52LlJVU1RGTEFHUyA/PyBwcm9jZXNzLmVudi5DQVJHT19CVUlMRF9SVVNURkxBR1MgPz8gJydcblxuICAgIGlmIChcbiAgICAgIHRoaXMudGFyZ2V0LmFiaT8uaW5jbHVkZXMoJ211c2wnKSAmJlxuICAgICAgIXJ1c3RmbGFncy5pbmNsdWRlcygndGFyZ2V0LWZlYXR1cmU9LWNydC1zdGF0aWMnKVxuICAgICkge1xuICAgICAgcnVzdGZsYWdzICs9ICcgLUMgdGFyZ2V0LWZlYXR1cmU9LWNydC1zdGF0aWMnXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpcCAmJiAhcnVzdGZsYWdzLmluY2x1ZGVzKCdsaW5rLWFyZz0tcycpKSB7XG4gICAgICBydXN0ZmxhZ3MgKz0gJyAtQyBsaW5rLWFyZz0tcydcbiAgICB9XG5cbiAgICBpZiAocnVzdGZsYWdzLmxlbmd0aCkge1xuICAgICAgdGhpcy5lbnZzLlJVU1RGTEFHUyA9IHJ1c3RmbGFnc1xuICAgIH1cbiAgICAvLyBFTkQgUlVTVEZMQUdTXG5cbiAgICAvLyBMSU5LRVJcbiAgICBjb25zdCBsaW5rZXIgPSB0aGlzLm9wdGlvbnMuY3Jvc3NDb21waWxlXG4gICAgICA/IHZvaWQgMFxuICAgICAgOiBnZXRUYXJnZXRMaW5rZXIodGhpcy50YXJnZXQudHJpcGxlKVxuICAgIC8vIFRPRE86XG4gICAgLy8gICBkaXJlY3RseSBzZXQgQ0FSR09fVEFSR0VUXzx0YXJnZXQ+X0xJTktFUiB3aWxsIGNvdmVyIC5jYXJnby9jb25maWcudG9tbFxuICAgIC8vICAgd2lsbCBkZXRlY3QgYnkgY2FyZ28gY29uZmlnIHdoZW4gaXQgYmVjb21lcyBzdGFibGVcbiAgICAvLyAgIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jYXJnby9pc3N1ZXMvOTMwMVxuICAgIGNvbnN0IGxpbmtlckVudiA9IGBDQVJHT19UQVJHRVRfJHt0YXJnZXRUb0VudlZhcihcbiAgICAgIHRoaXMudGFyZ2V0LnRyaXBsZSxcbiAgICApfV9MSU5LRVJgXG4gICAgaWYgKGxpbmtlciAmJiAhcHJvY2Vzcy5lbnZbbGlua2VyRW52XSAmJiAhdGhpcy5lbnZzW2xpbmtlckVudl0pIHtcbiAgICAgIHRoaXMuZW52c1tsaW5rZXJFbnZdID0gbGlua2VyXG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnYW5kcm9pZCcpIHtcbiAgICAgIHRoaXMuc2V0QW5kcm9pZEVudigpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnd2FzaScpIHtcbiAgICAgIHRoaXMuc2V0V2FzaUVudigpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnb3Blbmhhcm1vbnknKSB7XG4gICAgICB0aGlzLnNldE9wZW5IYXJtb255RW52KClcbiAgICB9XG5cbiAgICBkZWJ1ZygnU2V0IGVudnM6ICcpXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5lbnZzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIGRlYnVnKCcgICVpJywgYCR7a309JHt2fWApXG4gICAgfSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcml2YXRlIHNldEZvcmNlQnVpbGRFbnZzKHR5cGVEZWZUbXBGb2xkZXI6IHN0cmluZykge1xuICAgIC8vIGR5bmFtaWNhbGx5IGNoZWNrIGFsbCBuYXBpLXJzIGRlcHMgYW5kIHNldCBgTkFQSV9GT1JDRV9CVUlMRF97dXBwZXJjYXNlKHNuYWtlX2Nhc2UobmFtZSkpfSA9IHRpbWVzdGFtcGBcbiAgICB0aGlzLm1ldGFkYXRhLnBhY2thZ2VzLmZvckVhY2goKGNyYXRlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNyYXRlLmRlcGVuZGVuY2llcy5zb21lKChkKSA9PiBkLm5hbWUgPT09ICduYXBpLWRlcml2ZScpICYmXG4gICAgICAgICFleGlzdHNTeW5jKGpvaW4odHlwZURlZlRtcEZvbGRlciwgY3JhdGUubmFtZSkpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5lbnZzW1xuICAgICAgICAgIGBOQVBJX0ZPUkNFX0JVSUxEXyR7Y3JhdGUubmFtZS5yZXBsYWNlKC8tL2csICdfJykudG9VcHBlckNhc2UoKX1gXG4gICAgICAgIF0gPSBEYXRlLm5vdygpLnRvU3RyaW5nKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRBbmRyb2lkRW52KCkge1xuICAgIGNvbnN0IHsgQU5EUk9JRF9OREtfTEFURVNUX0hPTUUgfSA9IHByb2Nlc3MuZW52XG4gICAgaWYgKCFBTkRST0lEX05ES19MQVRFU1RfSE9NRSkge1xuICAgICAgZGVidWcud2FybihcbiAgICAgICAgYCR7Y29sb3JzLnJlZChcbiAgICAgICAgICAnQU5EUk9JRF9OREtfTEFURVNUX0hPTUUnLFxuICAgICAgICApfSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBtaXNzaW5nYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBza2lwIGNyb3NzIGNvbXBpbGUgc2V0dXAgaWYgaG9zdCBpcyBhbmRyb2lkXG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdhbmRyb2lkJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0QXJjaCA9IHRoaXMudGFyZ2V0LmFyY2ggPT09ICdhcm0nID8gJ2FybXY3YScgOiAnYWFyY2g2NCdcbiAgICBjb25zdCB0YXJnZXRQbGF0Zm9ybSA9XG4gICAgICB0aGlzLnRhcmdldC5hcmNoID09PSAnYXJtJyA/ICdhbmRyb2lkZWFiaTI0JyA6ICdhbmRyb2lkMjQnXG4gICAgY29uc3QgaG9zdFBsYXRmb3JtID1cbiAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nXG4gICAgICAgID8gJ2RhcndpbidcbiAgICAgICAgOiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gICAgICAgICAgPyAnd2luZG93cydcbiAgICAgICAgICA6ICdsaW51eCdcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuZW52cywge1xuICAgICAgQ0FSR09fVEFSR0VUX0FBUkNINjRfTElOVVhfQU5EUk9JRF9MSU5LRVI6IGAke0FORFJPSURfTkRLX0xBVEVTVF9IT01FfS90b29sY2hhaW5zL2xsdm0vcHJlYnVpbHQvJHtob3N0UGxhdGZvcm19LXg4Nl82NC9iaW4vJHt0YXJnZXRBcmNofS1saW51eC1hbmRyb2lkMjQtY2xhbmdgLFxuICAgICAgQ0FSR09fVEFSR0VUX0FSTVY3X0xJTlVYX0FORFJPSURFQUJJX0xJTktFUjogYCR7QU5EUk9JRF9OREtfTEFURVNUX0hPTUV9L3Rvb2xjaGFpbnMvbGx2bS9wcmVidWlsdC8ke2hvc3RQbGF0Zm9ybX0teDg2XzY0L2Jpbi8ke3RhcmdldEFyY2h9LWxpbnV4LWFuZHJvaWRlYWJpMjQtY2xhbmdgLFxuICAgICAgVEFSR0VUX0NDOiBgJHtBTkRST0lEX05ES19MQVRFU1RfSE9NRX0vdG9vbGNoYWlucy9sbHZtL3ByZWJ1aWx0LyR7aG9zdFBsYXRmb3JtfS14ODZfNjQvYmluLyR7dGFyZ2V0QXJjaH0tbGludXgtJHt0YXJnZXRQbGF0Zm9ybX0tY2xhbmdgLFxuICAgICAgVEFSR0VUX0NYWDogYCR7QU5EUk9JRF9OREtfTEFURVNUX0hPTUV9L3Rvb2xjaGFpbnMvbGx2bS9wcmVidWlsdC8ke2hvc3RQbGF0Zm9ybX0teDg2XzY0L2Jpbi8ke3RhcmdldEFyY2h9LWxpbnV4LSR7dGFyZ2V0UGxhdGZvcm19LWNsYW5nKytgLFxuICAgICAgVEFSR0VUX0FSOiBgJHtBTkRST0lEX05ES19MQVRFU1RfSE9NRX0vdG9vbGNoYWlucy9sbHZtL3ByZWJ1aWx0LyR7aG9zdFBsYXRmb3JtfS14ODZfNjQvYmluL2xsdm0tYXJgLFxuICAgICAgVEFSR0VUX1JBTkxJQjogYCR7QU5EUk9JRF9OREtfTEFURVNUX0hPTUV9L3Rvb2xjaGFpbnMvbGx2bS9wcmVidWlsdC8ke2hvc3RQbGF0Zm9ybX0teDg2XzY0L2Jpbi9sbHZtLXJhbmxpYmAsXG4gICAgICBBTkRST0lEX05ESzogQU5EUk9JRF9OREtfTEFURVNUX0hPTUUsXG4gICAgICBQQVRIOiBgJHtBTkRST0lEX05ES19MQVRFU1RfSE9NRX0vdG9vbGNoYWlucy9sbHZtL3ByZWJ1aWx0LyR7aG9zdFBsYXRmb3JtfS14ODZfNjQvYmluJHtwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJzsnIDogJzonfSR7cHJvY2Vzcy5lbnYuUEFUSH1gLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHNldFdhc2lFbnYoKSB7XG4gICAgY29uc3QgZW1uYXBpID0gam9pbihcbiAgICAgIHJlcXVpcmUucmVzb2x2ZSgnZW1uYXBpJyksXG4gICAgICAnLi4nLFxuICAgICAgJ2xpYicsXG4gICAgICAnd2FzbTMyLXdhc2ktdGhyZWFkcycsXG4gICAgKVxuICAgIHRoaXMuZW52cy5FTU5BUElfTElOS19ESVIgPSBlbW5hcGlcbiAgICBjb25zdCB7IFdBU0lfU0RLX1BBVEggfSA9IHByb2Nlc3MuZW52XG5cbiAgICBpZiAoV0FTSV9TREtfUEFUSCAmJiBleGlzdHNTeW5jKFdBU0lfU0RLX1BBVEgpKSB7XG4gICAgICB0aGlzLmVudnMuQ0FSR09fVEFSR0VUX1dBU00zMl9XQVNJX1BSRVZJRVcxX1RIUkVBRFNfTElOS0VSID0gam9pbihcbiAgICAgICAgV0FTSV9TREtfUEFUSCxcbiAgICAgICAgJ2JpbicsXG4gICAgICAgICd3YXNtLWxkJyxcbiAgICAgIClcbiAgICAgIHRoaXMuZW52cy5DQVJHT19UQVJHRVRfV0FTTTMyX1dBU0lQMV9MSU5LRVIgPSBqb2luKFxuICAgICAgICBXQVNJX1NES19QQVRILFxuICAgICAgICAnYmluJyxcbiAgICAgICAgJ3dhc20tbGQnLFxuICAgICAgKVxuICAgICAgdGhpcy5lbnZzLkNBUkdPX1RBUkdFVF9XQVNNMzJfV0FTSVAxX1RIUkVBRFNfTElOS0VSID0gam9pbihcbiAgICAgICAgV0FTSV9TREtfUEFUSCxcbiAgICAgICAgJ2JpbicsXG4gICAgICAgICd3YXNtLWxkJyxcbiAgICAgIClcbiAgICAgIHRoaXMuZW52cy5DQVJHT19UQVJHRVRfV0FTTTMyX1dBU0lQMl9MSU5LRVIgPSBqb2luKFxuICAgICAgICBXQVNJX1NES19QQVRILFxuICAgICAgICAnYmluJyxcbiAgICAgICAgJ3dhc20tbGQnLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX0NDJywgam9pbihXQVNJX1NES19QQVRILCAnYmluJywgJ2NsYW5nJykpXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKFxuICAgICAgICAnVEFSR0VUX0NYWCcsXG4gICAgICAgIGpvaW4oV0FTSV9TREtfUEFUSCwgJ2JpbicsICdjbGFuZysrJyksXG4gICAgICApXG4gICAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfQVInLCBqb2luKFdBU0lfU0RLX1BBVEgsICdiaW4nLCAnYXInKSlcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfUkFOTElCJyxcbiAgICAgICAgam9pbihXQVNJX1NES19QQVRILCAnYmluJywgJ3JhbmxpYicpLFxuICAgICAgKVxuICAgICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cyhcbiAgICAgICAgJ1RBUkdFVF9DRkxBR1MnLFxuICAgICAgICBgLS10YXJnZXQ9d2FzbTMyLXdhc2ktdGhyZWFkcyAtLXN5c3Jvb3Q9JHtXQVNJX1NES19QQVRIfS9zaGFyZS93YXNpLXN5c3Jvb3QgLXB0aHJlYWQgLW1sbHZtIC13YXNtLWVuYWJsZS1zamxqYCxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgICdUQVJHRVRfQ1hYRkxBR1MnLFxuICAgICAgICBgLS10YXJnZXQ9d2FzbTMyLXdhc2ktdGhyZWFkcyAtLXN5c3Jvb3Q9JHtXQVNJX1NES19QQVRIfS9zaGFyZS93YXNpLXN5c3Jvb3QgLXB0aHJlYWQgLW1sbHZtIC13YXNtLWVuYWJsZS1zamxqYCxcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoXG4gICAgICAgIGBUQVJHRVRfTERGTEFHU2AsXG4gICAgICAgIGAtZnVzZS1sZD0ke1dBU0lfU0RLX1BBVEh9L2Jpbi93YXNtLWxkIC0tdGFyZ2V0PXdhc20zMi13YXNpLXRocmVhZHNgLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0T3Blbkhhcm1vbnlFbnYoKSB7XG4gICAgY29uc3QgeyBPSE9TX1NES19QQVRILCBPSE9TX1NES19OQVRJVkUgfSA9IHByb2Nlc3MuZW52XG4gICAgY29uc3QgbmRrUGF0aCA9IE9IT1NfU0RLX1BBVEhcbiAgICAgID8gYCR7T0hPU19TREtfTkFUSVZFfS9uYXRpdmVgXG4gICAgICA6IE9IT1NfU0RLX05BVElWRVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBpZiAoIW5ka1BhdGggJiYgcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ29wZW5oYXJtb255Jykge1xuICAgICAgZGVidWcud2FybihcbiAgICAgICAgYCR7Y29sb3JzLnJlZCgnT0hPU19TREtfUEFUSCcpfSBvciAke2NvbG9ycy5yZWQoJ09IT1NfU0RLX05BVElWRScpfSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBtaXNzaW5nYCxcbiAgICAgIClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBsaW5rZXJOYW1lID0gYENBUkdPX1RBUkdFVF8ke3RoaXMudGFyZ2V0LnRyaXBsZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoLy0vZywgJ18nKX1fTElOS0VSYFxuICAgIGNvbnN0IHJhblBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi9sbHZtLXJhbmxpYmBcbiAgICBjb25zdCBhclBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi9sbHZtLWFyYFxuICAgIGNvbnN0IGNjUGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluLyR7dGhpcy50YXJnZXQudHJpcGxlfS1jbGFuZ2BcbiAgICBjb25zdCBjeHhQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vJHt0aGlzLnRhcmdldC50cmlwbGV9LWNsYW5nKytgXG4gICAgY29uc3QgYXNQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vbGx2bS1hc2BcbiAgICBjb25zdCBsZFBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi9sZC5sbGRgXG4gICAgY29uc3Qgc3RyaXBQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9iaW4vbGx2bS1zdHJpcGBcbiAgICBjb25zdCBvYmpEdW1wUGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluL2xsdm0tb2JqZHVtcGBcbiAgICBjb25zdCBvYmpDb3B5UGF0aCA9IGAke25ka1BhdGh9L2xsdm0vYmluL2xsdm0tb2JqY29weWBcbiAgICBjb25zdCBubVBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2Jpbi9sbHZtLW5tYFxuICAgIGNvbnN0IGJpblBhdGggPSBgJHtuZGtQYXRofS9sbHZtL2JpbmBcbiAgICBjb25zdCBsaWJQYXRoID0gYCR7bmRrUGF0aH0vbGx2bS9saWJgXG5cbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdMSUJDTEFOR19QQVRIJywgbGliUGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdERVBfQVRPTUlDJywgJ2NsYW5nX3J0LmJ1aWx0aW5zJylcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKGxpbmtlck5hbWUsIGNjUGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfQ0MnLCBjY1BhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX0NYWCcsIGN4eFBhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX0FSJywgYXJQYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9SQU5MSUInLCByYW5QYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9BUycsIGFzUGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfTEQnLCBsZFBhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX1NUUklQJywgc3RyaXBQYXRoKVxuICAgIHRoaXMuc2V0RW52SWZOb3RFeGlzdHMoJ1RBUkdFVF9PQkpEVU1QJywgb2JqRHVtcFBhdGgpXG4gICAgdGhpcy5zZXRFbnZJZk5vdEV4aXN0cygnVEFSR0VUX09CSkNPUFknLCBvYmpDb3B5UGF0aClcbiAgICB0aGlzLnNldEVudklmTm90RXhpc3RzKCdUQVJHRVRfTk0nLCBubVBhdGgpXG4gICAgdGhpcy5lbnZzLlBBVEggPSBgJHtiaW5QYXRofSR7cHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICc7JyA6ICc6J30ke3Byb2Nlc3MuZW52LlBBVEh9YFxuICB9XG5cbiAgcHJpdmF0ZSBzZXRGZWF0dXJlcygpIHtcbiAgICBjb25zdCBhcmdzID0gW11cbiAgICBpZiAodGhpcy5vcHRpb25zLmFsbEZlYXR1cmVzICYmIHRoaXMub3B0aW9ucy5ub0RlZmF1bHRGZWF0dXJlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2Fubm90IHNwZWNpZnkgLS1hbGwtZmVhdHVyZXMgYW5kIC0tbm8tZGVmYXVsdC1mZWF0dXJlcyB0b2dldGhlcicsXG4gICAgICApXG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsRmVhdHVyZXMpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1hbGwtZmVhdHVyZXMnKVxuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLm5vRGVmYXVsdEZlYXR1cmVzKSB7XG4gICAgICBhcmdzLnB1c2goJy0tbm8tZGVmYXVsdC1mZWF0dXJlcycpXG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZmVhdHVyZXMpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1mZWF0dXJlcycsIC4uLnRoaXMub3B0aW9ucy5mZWF0dXJlcylcbiAgICB9XG5cbiAgICBkZWJ1ZygnU2V0IGZlYXR1cmVzIGZsYWdzOiAnKVxuICAgIGRlYnVnKCcgICVPJywgYXJncylcbiAgICB0aGlzLmFyZ3MucHVzaCguLi5hcmdzKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHByaXZhdGUgc2V0QnlwYXNzQXJncygpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnJlbGVhc2UpIHtcbiAgICAgIHRoaXMuYXJncy5wdXNoKCctLXJlbGVhc2UnKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgdGhpcy5hcmdzLnB1c2goJy0tdmVyYm9zZScpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50YXJnZXREaXIpIHtcbiAgICAgIHRoaXMuYXJncy5wdXNoKCctLXRhcmdldC1kaXInLCB0aGlzLm9wdGlvbnMudGFyZ2V0RGlyKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJvZmlsZSkge1xuICAgICAgdGhpcy5hcmdzLnB1c2goJy0tcHJvZmlsZScsIHRoaXMub3B0aW9ucy5wcm9maWxlKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubWFuaWZlc3RQYXRoKSB7XG4gICAgICB0aGlzLmFyZ3MucHVzaCgnLS1tYW5pZmVzdC1wYXRoJywgdGhpcy5vcHRpb25zLm1hbmlmZXN0UGF0aClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNhcmdvT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmFyZ3MucHVzaCguLi50aGlzLm9wdGlvbnMuY2FyZ29PcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlSW50ZXJtZWRpYXRlVHlwZURlZkZvbGRlcigpIHtcbiAgICBsZXQgZm9sZGVyID0gam9pbihcbiAgICAgIHRoaXMudGFyZ2V0RGlyLFxuICAgICAgJ25hcGktcnMnLFxuICAgICAgYCR7dGhpcy5jcmF0ZS5uYW1lfS0ke2NyZWF0ZUhhc2goJ3NoYTI1NicpXG4gICAgICAgIC51cGRhdGUodGhpcy5jcmF0ZS5tYW5pZmVzdF9wYXRoKVxuICAgICAgICAudXBkYXRlKENMSV9WRVJTSU9OKVxuICAgICAgICAuZGlnZXN0KCdoZXgnKVxuICAgICAgICAuc3Vic3RyaW5nKDAsIDgpfWAsXG4gICAgKVxuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZHRzQ2FjaGUpIHtcbiAgICAgIHJtU3luYyhmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgICAgZm9sZGVyICs9IGBfJHtEYXRlLm5vdygpfWBcbiAgICB9XG5cbiAgICBta2RpckFzeW5jKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgIHJldHVybiBmb2xkZXJcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcG9zdEJ1aWxkKCkge1xuICAgIHRyeSB7XG4gICAgICBkZWJ1ZyhgVHJ5IHRvIGNyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5OmApXG4gICAgICBkZWJ1ZygnICAlaScsIHRoaXMub3V0cHV0RGlyKVxuICAgICAgYXdhaXQgbWtkaXJBc3luYyh0aGlzLm91dHB1dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgIGRlYnVnKGBPdXRwdXQgZGlyZWN0b3J5IGNyZWF0ZWRgKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5ICR7dGhpcy5vdXRwdXREaXJ9YCwge1xuICAgICAgICBjYXVzZTogZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgd2FzbUJpbmFyeU5hbWUgPSBhd2FpdCB0aGlzLmNvcHlBcnRpZmFjdCgpXG5cbiAgICAvLyBvbmx5IGZvciBjZHlsaWJcbiAgICBpZiAodGhpcy5jZHlMaWJOYW1lKSB7XG4gICAgICBjb25zdCBpZGVudHMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlVHlwZURlZigpXG4gICAgICBjb25zdCBqc091dHB1dCA9IGF3YWl0IHRoaXMud3JpdGVKc0JpbmRpbmcoaWRlbnRzKVxuICAgICAgY29uc3Qgd2FzbUJpbmRpbmdzT3V0cHV0ID0gYXdhaXQgdGhpcy53cml0ZVdhc2lCaW5kaW5nKFxuICAgICAgICB3YXNtQmluYXJ5TmFtZSxcbiAgICAgICAgaWRlbnRzLFxuICAgICAgKVxuICAgICAgaWYgKGpzT3V0cHV0KSB7XG4gICAgICAgIHRoaXMub3V0cHV0cy5wdXNoKGpzT3V0cHV0KVxuICAgICAgfVxuICAgICAgaWYgKHdhc21CaW5kaW5nc091dHB1dCkge1xuICAgICAgICB0aGlzLm91dHB1dHMucHVzaCguLi53YXNtQmluZGluZ3NPdXRwdXQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMub3V0cHV0c1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb3B5QXJ0aWZhY3QoKSB7XG4gICAgY29uc3QgW3NyY05hbWUsIGRlc3ROYW1lLCB3YXNtQmluYXJ5TmFtZV0gPSB0aGlzLmdldEFydGlmYWN0TmFtZXMoKVxuICAgIGlmICghc3JjTmFtZSB8fCAhZGVzdE5hbWUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHByb2ZpbGUgPVxuICAgICAgdGhpcy5vcHRpb25zLnByb2ZpbGUgPz8gKHRoaXMub3B0aW9ucy5yZWxlYXNlID8gJ3JlbGVhc2UnIDogJ2RlYnVnJylcbiAgICBjb25zdCBzcmMgPSBqb2luKHRoaXMudGFyZ2V0RGlyLCB0aGlzLnRhcmdldC50cmlwbGUsIHByb2ZpbGUsIHNyY05hbWUpXG4gICAgZGVidWcoYENvcHkgYXJ0aWZhY3QgZnJvbTogWyR7c3JjfV1gKVxuICAgIGNvbnN0IGRlc3QgPSBqb2luKHRoaXMub3V0cHV0RGlyLCBkZXN0TmFtZSlcbiAgICBjb25zdCBpc1dhc20gPSBkZXN0LmVuZHNXaXRoKCcud2FzbScpXG5cbiAgICB0cnkge1xuICAgICAgaWYgKGF3YWl0IGZpbGVFeGlzdHMoZGVzdCkpIHtcbiAgICAgICAgZGVidWcoJ09sZCBhcnRpZmFjdCBmb3VuZCwgcmVtb3ZlIGl0IGZpcnN0JylcbiAgICAgICAgYXdhaXQgdW5saW5rQXN5bmMoZGVzdClcbiAgICAgIH1cbiAgICAgIGRlYnVnKCdDb3B5IGFydGlmYWN0IHRvOicpXG4gICAgICBkZWJ1ZygnICAlaScsIGRlc3QpXG4gICAgICBpZiAoaXNXYXNtKSB7XG4gICAgICAgIGNvbnN0IHsgTW9kdWxlQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoJ0BuYXBpLXJzL3dhc20tdG9vbHMnKVxuICAgICAgICBkZWJ1ZygnR2VuZXJhdGUgZGVidWcgd2FzbSBtb2R1bGUnKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRlYnVnV2FzbU1vZHVsZSA9IG5ldyBNb2R1bGVDb25maWcoKVxuICAgICAgICAgICAgLmdlbmVyYXRlRHdhcmYodHJ1ZSlcbiAgICAgICAgICAgIC5nZW5lcmF0ZU5hbWVTZWN0aW9uKHRydWUpXG4gICAgICAgICAgICAuZ2VuZXJhdGVQcm9kdWNlcnNTZWN0aW9uKHRydWUpXG4gICAgICAgICAgICAucHJlc2VydmVDb2RlVHJhbnNmb3JtKHRydWUpXG4gICAgICAgICAgICAuc3RyaWN0VmFsaWRhdGUoZmFsc2UpXG4gICAgICAgICAgICAucGFyc2UoYXdhaXQgcmVhZEZpbGVBc3luYyhzcmMpKVxuICAgICAgICAgIGNvbnN0IGRlYnVnV2FzbUJpbmFyeSA9IGRlYnVnV2FzbU1vZHVsZS5lbWl0V2FzbSh0cnVlKVxuICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKFxuICAgICAgICAgICAgZGVzdC5yZXBsYWNlKC9cXC53YXNtJC8sICcuZGVidWcud2FzbScpLFxuICAgICAgICAgICAgZGVidWdXYXNtQmluYXJ5LFxuICAgICAgICAgIClcbiAgICAgICAgICBkZWJ1ZygnR2VuZXJhdGUgcmVsZWFzZSB3YXNtIG1vZHVsZScpXG4gICAgICAgICAgY29uc3QgcmVsZWFzZVdhc21Nb2R1bGUgPSBuZXcgTW9kdWxlQ29uZmlnKClcbiAgICAgICAgICAgIC5nZW5lcmF0ZUR3YXJmKGZhbHNlKVxuICAgICAgICAgICAgLmdlbmVyYXRlTmFtZVNlY3Rpb24oZmFsc2UpXG4gICAgICAgICAgICAuZ2VuZXJhdGVQcm9kdWNlcnNTZWN0aW9uKGZhbHNlKVxuICAgICAgICAgICAgLnByZXNlcnZlQ29kZVRyYW5zZm9ybShmYWxzZSlcbiAgICAgICAgICAgIC5zdHJpY3RWYWxpZGF0ZShmYWxzZSlcbiAgICAgICAgICAgIC5vbmx5U3RhYmxlRmVhdHVyZXMoZmFsc2UpXG4gICAgICAgICAgICAucGFyc2UoZGVidWdXYXNtQmluYXJ5KVxuICAgICAgICAgIGNvbnN0IHJlbGVhc2VXYXNtQmluYXJ5ID0gcmVsZWFzZVdhc21Nb2R1bGUuZW1pdFdhc20oZmFsc2UpXG4gICAgICAgICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoZGVzdCwgcmVsZWFzZVdhc21CaW5hcnkpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBkZWJ1Zy53YXJuKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBnZW5lcmF0ZSBkZWJ1ZyB3YXNtIG1vZHVsZTogJHsoZSBhcyBhbnkpLm1lc3NhZ2UgPz8gZX1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCBjb3B5RmlsZUFzeW5jKHNyYywgZGVzdClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgY29weUZpbGVBc3luYyhzcmMsIGRlc3QpXG4gICAgICB9XG4gICAgICB0aGlzLm91dHB1dHMucHVzaCh7XG4gICAgICAgIGtpbmQ6IGRlc3QuZW5kc1dpdGgoJy5ub2RlJykgPyAnbm9kZScgOiBpc1dhc20gPyAnd2FzbScgOiAnZXhlJyxcbiAgICAgICAgcGF0aDogZGVzdCxcbiAgICAgIH0pXG4gICAgICByZXR1cm4gd2FzbUJpbmFyeU5hbWUgPyBqb2luKHRoaXMub3V0cHV0RGlyLCB3YXNtQmluYXJ5TmFtZSkgOiBudWxsXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY29weSBhcnRpZmFjdCcsIHsgY2F1c2U6IGUgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEFydGlmYWN0TmFtZXMoKSB7XG4gICAgaWYgKHRoaXMuY2R5TGliTmFtZSkge1xuICAgICAgY29uc3QgY2R5TGliID0gdGhpcy5jZHlMaWJOYW1lLnJlcGxhY2UoLy0vZywgJ18nKVxuICAgICAgY29uc3Qgd2FzaVRhcmdldCA9IHRoaXMuY29uZmlnLnRhcmdldHMuZmluZCgodCkgPT4gdC5wbGF0Zm9ybSA9PT0gJ3dhc2knKVxuXG4gICAgICBjb25zdCBzcmNOYW1lID1cbiAgICAgICAgdGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICdkYXJ3aW4nXG4gICAgICAgICAgPyBgbGliJHtjZHlMaWJ9LmR5bGliYFxuICAgICAgICAgIDogdGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICd3aW4zMidcbiAgICAgICAgICAgID8gYCR7Y2R5TGlifS5kbGxgXG4gICAgICAgICAgICA6IHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnd2FzaScgfHwgdGhpcy50YXJnZXQucGxhdGZvcm0gPT09ICd3YXNtJ1xuICAgICAgICAgICAgICA/IGAke2NkeUxpYn0ud2FzbWBcbiAgICAgICAgICAgICAgOiBgbGliJHtjZHlMaWJ9LnNvYFxuXG4gICAgICBsZXQgZGVzdE5hbWUgPSB0aGlzLmNvbmZpZy5iaW5hcnlOYW1lXG4gICAgICAvLyBhZGQgcGxhdGZvcm0gc3VmZml4IHRvIGJpbmFyeSBuYW1lXG4gICAgICAvLyBpbmRleFsubGludXgteDY0LWdudV0ubm9kZVxuICAgICAgLy8gICAgICAgXl5eXl5eXl5eXl5eXl5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucGxhdGZvcm0pIHtcbiAgICAgICAgZGVzdE5hbWUgKz0gYC4ke3RoaXMudGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX1gXG4gICAgICB9XG4gICAgICBpZiAoc3JjTmFtZS5lbmRzV2l0aCgnLndhc20nKSkge1xuICAgICAgICBkZXN0TmFtZSArPSAnLndhc20nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXN0TmFtZSArPSAnLm5vZGUnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHNyY05hbWUsXG4gICAgICAgIGRlc3ROYW1lLFxuICAgICAgICB3YXNpVGFyZ2V0XG4gICAgICAgICAgPyBgJHt0aGlzLmNvbmZpZy5iaW5hcnlOYW1lfS4ke3dhc2lUYXJnZXQucGxhdGZvcm1BcmNoQUJJfS53YXNtYFxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIF1cbiAgICB9IGVsc2UgaWYgKHRoaXMuYmluTmFtZSkge1xuICAgICAgY29uc3Qgc3JjTmFtZSA9XG4gICAgICAgIHRoaXMudGFyZ2V0LnBsYXRmb3JtID09PSAnd2luMzInID8gYCR7dGhpcy5iaW5OYW1lfS5leGVgIDogdGhpcy5iaW5OYW1lXG5cbiAgICAgIHJldHVybiBbc3JjTmFtZSwgc3JjTmFtZV1cbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVUeXBlRGVmKCkge1xuICAgIGNvbnN0IHR5cGVEZWZEaXIgPSB0aGlzLmVudnMuTkFQSV9UWVBFX0RFRl9UTVBfRk9MREVSXG4gICAgaWYgKCF0aGlzLmVuYWJsZVR5cGVEZWYgfHwgIShhd2FpdCBkaXJFeGlzdHNBc3luYyh0eXBlRGVmRGlyKSkpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGNvbnN0IGRlc3QgPSBqb2luKHRoaXMub3V0cHV0RGlyLCB0aGlzLm9wdGlvbnMuZHRzID8/ICdpbmRleC5kLnRzJylcblxuICAgIGxldCBoZWFkZXIgPSAnJ1xuICAgIGxldCBkdHMgPSAnJ1xuICAgIGxldCBleHBvcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ub0R0c0hlYWRlcikge1xuICAgICAgY29uc3QgZHRzSGVhZGVyID0gdGhpcy5vcHRpb25zLmR0c0hlYWRlciA/PyB0aGlzLmNvbmZpZy5kdHNIZWFkZXJcbiAgICAgIC8vIGBkdHNIZWFkZXJGaWxlYCBpbiBjb25maWcgPiBgZHRzSGVhZGVyYCBpbiBjbGkgZmxhZyA+IGBkdHNIZWFkZXJgIGluIGNvbmZpZ1xuICAgICAgaWYgKHRoaXMuY29uZmlnLmR0c0hlYWRlckZpbGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoZWFkZXIgPSBhd2FpdCByZWFkRmlsZUFzeW5jKFxuICAgICAgICAgICAgam9pbih0aGlzLm9wdGlvbnMuY3dkLCB0aGlzLmNvbmZpZy5kdHNIZWFkZXJGaWxlKSxcbiAgICAgICAgICAgICd1dGYtOCcsXG4gICAgICAgICAgKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZGVidWcud2FybihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCBkdHMgaGVhZGVyIGZpbGUgJHt0aGlzLmNvbmZpZy5kdHNIZWFkZXJGaWxlfWAsXG4gICAgICAgICAgICBlLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkdHNIZWFkZXIpIHtcbiAgICAgICAgaGVhZGVyID0gZHRzSGVhZGVyXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFkZXIgPSBERUZBVUxUX1RZUEVfREVGX0hFQURFUlxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcmVhZGRpckFzeW5jKHR5cGVEZWZEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuXG4gICAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICAgIGRlYnVnKCdObyB0eXBlIGRlZiBmaWxlcyBmb3VuZC4gU2tpcCBnZW5lcmF0aW5nIGR0cyBmaWxlLicpXG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGlmICghZmlsZS5pc0ZpbGUoKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGR0czogZmlsZUR0cywgZXhwb3J0czogZmlsZUV4cG9ydHMgfSA9IGF3YWl0IHByb2Nlc3NUeXBlRGVmKFxuICAgICAgICBqb2luKHR5cGVEZWZEaXIsIGZpbGUubmFtZSksXG4gICAgICAgIHRoaXMub3B0aW9ucy5jb25zdEVudW0gPz8gdGhpcy5jb25maWcuY29uc3RFbnVtID8/IHRydWUsXG4gICAgICApXG5cbiAgICAgIGR0cyArPSBmaWxlRHRzXG4gICAgICBleHBvcnRzLnB1c2goLi4uZmlsZUV4cG9ydHMpXG4gICAgfVxuXG4gICAgaWYgKGR0cy5pbmRleE9mKCdFeHRlcm5hbE9iamVjdDwnKSA+IC0xKSB7XG4gICAgICBoZWFkZXIgKz0gYFxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgRXh0ZXJuYWxPYmplY3Q8VD4ge1xuICByZWFkb25seSAnJzoge1xuICAgIHJlYWRvbmx5ICcnOiB1bmlxdWUgc3ltYm9sXG4gICAgW0s6IHN5bWJvbF06IFRcbiAgfVxufVxuYFxuICAgIH1cblxuICAgIGlmIChkdHMuaW5kZXhPZignVHlwZWRBcnJheScpID4gLTEpIHtcbiAgICAgIGhlYWRlciArPSBgXG5leHBvcnQgdHlwZSBUeXBlZEFycmF5ID0gSW50OEFycmF5IHwgVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5IHwgSW50MTZBcnJheSB8IFVpbnQxNkFycmF5IHwgSW50MzJBcnJheSB8IFVpbnQzMkFycmF5IHwgRmxvYXQzMkFycmF5IHwgRmxvYXQ2NEFycmF5IHwgQmlnSW50NjRBcnJheSB8IEJpZ1VpbnQ2NEFycmF5XG5gXG4gICAgfVxuXG4gICAgZHRzID0gaGVhZGVyICsgZHRzXG5cbiAgICB0cnkge1xuICAgICAgZGVidWcoJ1dyaXRpbmcgdHlwZSBkZWYgdG86JylcbiAgICAgIGRlYnVnKCcgICVpJywgZGVzdClcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKGRlc3QsIGR0cywgJ3V0Zi04JylcbiAgICAgIHRoaXMub3V0cHV0cy5wdXNoKHsga2luZDogJ2R0cycsIHBhdGg6IGRlc3QgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1Zy5lcnJvcignRmFpbGVkIHRvIHdyaXRlIHR5cGUgZGVmIGZpbGUnKVxuICAgICAgZGVidWcuZXJyb3IoZSBhcyBFcnJvcilcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwb3J0c1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUpzQmluZGluZyhpZGVudHM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMub3B0aW9ucy5wbGF0Zm9ybSB8fFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgICB0aGlzLm9wdGlvbnMubm9Kc0JpbmRpbmcgfHxcbiAgICAgIGlkZW50cy5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm9wdGlvbnMuanNCaW5kaW5nID8/ICdpbmRleC5qcydcblxuICAgIGNvbnN0IGNyZWF0ZUJpbmRpbmcgPSB0aGlzLm9wdGlvbnMuZXNtID8gY3JlYXRlRXNtQmluZGluZyA6IGNyZWF0ZUNqc0JpbmRpbmdcbiAgICBjb25zdCBiaW5kaW5nID0gY3JlYXRlQmluZGluZyhcbiAgICAgIHRoaXMuY29uZmlnLmJpbmFyeU5hbWUsXG4gICAgICB0aGlzLmNvbmZpZy5wYWNrYWdlTmFtZSxcbiAgICAgIGlkZW50cyxcbiAgICAgIC8vIGluIG5wbSBwcmV2ZXJzaW9uIGhvb2tcbiAgICAgIHByb2Nlc3MuZW52Lm5wbV9uZXdfdmVyc2lvbiA/PyB0aGlzLmNvbmZpZy5wYWNrYWdlSnNvbi52ZXJzaW9uLFxuICAgIClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXN0ID0gam9pbih0aGlzLm91dHB1dERpciwgbmFtZSlcbiAgICAgIGRlYnVnKCdXcml0aW5nIGpzIGJpbmRpbmcgdG86JylcbiAgICAgIGRlYnVnKCcgICVpJywgZGVzdClcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKGRlc3QsIGJpbmRpbmcsICd1dGYtOCcpXG4gICAgICByZXR1cm4geyBraW5kOiAnanMnLCBwYXRoOiBkZXN0IH0gc2F0aXNmaWVzIE91dHB1dFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHdyaXRlIGpzIGJpbmRpbmcgZmlsZScsIHsgY2F1c2U6IGUgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyaXRlV2FzaUJpbmRpbmcoXG4gICAgZGlzdEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIGlkZW50czogc3RyaW5nW10sXG4gICkge1xuICAgIGlmIChkaXN0RmlsZU5hbWUpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgZGlyIH0gPSBwYXJzZShkaXN0RmlsZU5hbWUpXG4gICAgICBjb25zdCBiaW5kaW5nUGF0aCA9IGpvaW4oZGlyLCBgJHt0aGlzLmNvbmZpZy5iaW5hcnlOYW1lfS53YXNpLmNqc2ApXG4gICAgICBjb25zdCBicm93c2VyQmluZGluZ1BhdGggPSBqb2luKFxuICAgICAgICBkaXIsXG4gICAgICAgIGAke3RoaXMuY29uZmlnLmJpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2AsXG4gICAgICApXG4gICAgICBjb25zdCB3b3JrZXJQYXRoID0gam9pbihkaXIsICd3YXNpLXdvcmtlci5tanMnKVxuICAgICAgY29uc3QgYnJvd3NlcldvcmtlclBhdGggPSBqb2luKGRpciwgJ3dhc2ktd29ya2VyLWJyb3dzZXIubWpzJylcbiAgICAgIGNvbnN0IGJyb3dzZXJFbnRyeVBhdGggPSBqb2luKGRpciwgJ2Jyb3dzZXIuanMnKVxuICAgICAgY29uc3QgZXhwb3J0c0NvZGUgPVxuICAgICAgICBgbW9kdWxlLmV4cG9ydHMgPSBfX25hcGlNb2R1bGUuZXhwb3J0c1xcbmAgK1xuICAgICAgICBpZGVudHNcbiAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgKGlkZW50KSA9PlxuICAgICAgICAgICAgICBgbW9kdWxlLmV4cG9ydHMuJHtpZGVudH0gPSBfX25hcGlNb2R1bGUuZXhwb3J0cy4ke2lkZW50fWAsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5qb2luKCdcXG4nKVxuICAgICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICAgIGJpbmRpbmdQYXRoLFxuICAgICAgICBjcmVhdGVXYXNpQmluZGluZyhcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHRoaXMuY29uZmlnLnBhY2thZ2VOYW1lLFxuICAgICAgICAgIHRoaXMuY29uZmlnLndhc20/LmluaXRpYWxNZW1vcnksXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8ubWF4aW11bU1lbW9yeSxcbiAgICAgICAgKSArXG4gICAgICAgICAgZXhwb3J0c0NvZGUgK1xuICAgICAgICAgICdcXG4nLFxuICAgICAgICAndXRmOCcsXG4gICAgICApXG4gICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgICAgYnJvd3NlckJpbmRpbmdQYXRoLFxuICAgICAgICBjcmVhdGVXYXNpQnJvd3NlckJpbmRpbmcoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB0aGlzLmNvbmZpZy53YXNtPy5pbml0aWFsTWVtb3J5LFxuICAgICAgICAgIHRoaXMuY29uZmlnLndhc20/Lm1heGltdW1NZW1vcnksXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8uYnJvd3Nlcj8uZnMsXG4gICAgICAgICAgdGhpcy5jb25maWcud2FzbT8uYnJvd3Nlcj8uYXN5bmNJbml0LFxuICAgICAgICAgIHRoaXMuY29uZmlnLndhc20/LmJyb3dzZXI/LmJ1ZmZlcixcbiAgICAgICAgKSArXG4gICAgICAgICAgYGV4cG9ydCBkZWZhdWx0IF9fbmFwaU1vZHVsZS5leHBvcnRzXFxuYCArXG4gICAgICAgICAgaWRlbnRzXG4gICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAoaWRlbnQpID0+XG4gICAgICAgICAgICAgICAgYGV4cG9ydCBjb25zdCAke2lkZW50fSA9IF9fbmFwaU1vZHVsZS5leHBvcnRzLiR7aWRlbnR9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKSArXG4gICAgICAgICAgJ1xcbicsXG4gICAgICAgICd1dGY4JyxcbiAgICAgIClcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKHdvcmtlclBhdGgsIFdBU0lfV09SS0VSX1RFTVBMQVRFLCAndXRmOCcpXG4gICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgICAgYnJvd3NlcldvcmtlclBhdGgsXG4gICAgICAgIGNyZWF0ZVdhc2lCcm93c2VyV29ya2VyQmluZGluZyh0aGlzLmNvbmZpZy53YXNtPy5icm93c2VyPy5mcyA/PyBmYWxzZSksXG4gICAgICAgICd1dGY4JyxcbiAgICAgIClcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUFzeW5jKFxuICAgICAgICBicm93c2VyRW50cnlQYXRoLFxuICAgICAgICBgZXhwb3J0ICogZnJvbSAnJHt0aGlzLmNvbmZpZy5wYWNrYWdlTmFtZX0td2FzbTMyLXdhc2knXFxuYCxcbiAgICAgIClcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHsga2luZDogJ2pzJywgcGF0aDogYmluZGluZ1BhdGggfSxcbiAgICAgICAgeyBraW5kOiAnanMnLCBwYXRoOiBicm93c2VyQmluZGluZ1BhdGggfSxcbiAgICAgICAgeyBraW5kOiAnanMnLCBwYXRoOiB3b3JrZXJQYXRoIH0sXG4gICAgICAgIHsga2luZDogJ2pzJywgcGF0aDogYnJvd3NlcldvcmtlclBhdGggfSxcbiAgICAgICAgeyBraW5kOiAnanMnLCBwYXRoOiBicm93c2VyRW50cnlQYXRoIH0sXG4gICAgICBdIHNhdGlzZmllcyBPdXRwdXRbXVxuICAgIH1cbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHByaXZhdGUgc2V0RW52SWZOb3RFeGlzdHMoZW52OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXByb2Nlc3MuZW52W2Vudl0pIHtcbiAgICAgIHRoaXMuZW52c1tlbnZdID0gdmFsdWVcbiAgICB9XG4gIH1cbn1cbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgY29kZWdlbi9pbmRleC50c1xuLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlIG1hbnVhbGx5XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tICdjbGlwYW5pb24nXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQnVpbGRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBwYXRocyA9IFtbJ2J1aWxkJ11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246ICdCdWlsZCB0aGUgTkFQSS1SUyBwcm9qZWN0JyxcbiAgfSlcblxuICB0YXJnZXQ/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLXRhcmdldCwtdCcsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdCdWlsZCBmb3IgdGhlIHRhcmdldCB0cmlwbGUsIGJ5cGFzc2VkIHRvIGBjYXJnbyBidWlsZCAtLXRhcmdldGAnLFxuICB9KVxuXG4gIGN3ZD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tY3dkJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aCcsXG4gIH0pXG5cbiAgbWFuaWZlc3RQYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1tYW5pZmVzdC1wYXRoJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgQ2FyZ28udG9tbGAnLFxuICB9KVxuXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWNvbmZpZy1wYXRoLC1jJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZScsXG4gIH0pXG5cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLWpzb24tcGF0aCcsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYHBhY2thZ2UuanNvbmAnLFxuICB9KVxuXG4gIHRhcmdldERpcj86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tdGFyZ2V0LWRpcicsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdEaXJlY3RvcnkgZm9yIGFsbCBjcmF0ZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzLCBzZWUgYGNhcmdvIGJ1aWxkIC0tdGFyZ2V0LWRpcmAnLFxuICB9KVxuXG4gIG91dHB1dERpcj86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tb3V0cHV0LWRpciwtbycsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRoIHRvIHdoZXJlIGFsbCB0aGUgYnVpbHQgZmlsZXMgd291bGQgYmUgcHV0LiBEZWZhdWx0IHRvIHRoZSBjcmF0ZSBmb2xkZXInLFxuICB9KVxuXG4gIHBsYXRmb3JtPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLXBsYXRmb3JtJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0FkZCBwbGF0Zm9ybSB0cmlwbGUgdG8gdGhlIGdlbmVyYXRlZCBub2RlanMgYmluZGluZyBmaWxlLCBlZzogYFtuYW1lXS5saW51eC14NjQtZ251Lm5vZGVgJyxcbiAgfSlcblxuICBqc1BhY2thZ2VOYW1lPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1qcy1wYWNrYWdlLW5hbWUnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGFja2FnZSBuYW1lIGluIGdlbmVyYXRlZCBqcyBiaW5kaW5nIGZpbGUuIE9ubHkgd29ya3Mgd2l0aCBgLS1wbGF0Zm9ybWAgZmxhZycsXG4gIH0pXG5cbiAgY29uc3RFbnVtPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLWNvbnN0LWVudW0nLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIGdlbmVyYXRlIGNvbnN0IGVudW0gZm9yIHR5cGVzY3JpcHQgYmluZGluZ3MnLFxuICB9KVxuXG4gIGpzQmluZGluZz86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tanMnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGF0aCBhbmQgZmlsZW5hbWUgb2YgZ2VuZXJhdGVkIEpTIGJpbmRpbmcgZmlsZS4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLiBSZWxhdGl2ZSB0byBgLS1vdXRwdXQtZGlyYC4nLFxuICB9KVxuXG4gIG5vSnNCaW5kaW5nPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLW5vLWpzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1doZXRoZXIgdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBKUyBiaW5kaW5nIGZpbGUuIE9ubHkgd29ya3Mgd2l0aCBgLS1wbGF0Zm9ybWAgZmxhZy4nLFxuICB9KVxuXG4gIGR0cz86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tZHRzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGggYW5kIGZpbGVuYW1lIG9mIGdlbmVyYXRlZCB0eXBlIGRlZiBmaWxlLiBSZWxhdGl2ZSB0byBgLS1vdXRwdXQtZGlyYCcsXG4gIH0pXG5cbiAgZHRzSGVhZGVyPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1kdHMtaGVhZGVyJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0N1c3RvbSBmaWxlIGhlYWRlciBmb3IgZ2VuZXJhdGVkIHR5cGUgZGVmIGZpbGUuIE9ubHkgd29ya3Mgd2hlbiBgdHlwZWRlZmAgZmVhdHVyZSBlbmFibGVkLicsXG4gIH0pXG5cbiAgbm9EdHNIZWFkZXI/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tbm8tZHRzLWhlYWRlcicsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdXaGV0aGVyIHRvIGRpc2FibGUgdGhlIGRlZmF1bHQgZmlsZSBoZWFkZXIgZm9yIGdlbmVyYXRlZCB0eXBlIGRlZiBmaWxlLiBPbmx5IHdvcmtzIHdoZW4gYHR5cGVkZWZgIGZlYXR1cmUgZW5hYmxlZC4nLFxuICB9KVxuXG4gIGR0c0NhY2hlID0gT3B0aW9uLkJvb2xlYW4oJy0tZHRzLWNhY2hlJywgdHJ1ZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBlbmFibGUgdGhlIGR0cyBjYWNoZSwgZGVmYXVsdCB0byB0cnVlJyxcbiAgfSlcblxuICBlc20/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tZXNtJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1doZXRoZXIgdG8gZW1pdCBhbiBFU00gSlMgYmluZGluZyBmaWxlIGluc3RlYWQgb2YgQ0pTIGZvcm1hdC4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLicsXG4gIH0pXG5cbiAgc3RyaXA/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tc3RyaXAsLXMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHN0cmlwIHRoZSBsaWJyYXJ5IHRvIGFjaGlldmUgdGhlIG1pbmltdW0gZmlsZSBzaXplJyxcbiAgfSlcblxuICByZWxlYXNlPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLXJlbGVhc2UsLXInLCB7XG4gICAgZGVzY3JpcHRpb246ICdCdWlsZCBpbiByZWxlYXNlIG1vZGUnLFxuICB9KVxuXG4gIHZlcmJvc2U/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tdmVyYm9zZSwtdicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1ZlcmJvc2VseSBsb2cgYnVpbGQgY29tbWFuZCB0cmFjZScsXG4gIH0pXG5cbiAgYmluPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1iaW4nLCB7XG4gICAgZGVzY3JpcHRpb246ICdCdWlsZCBvbmx5IHRoZSBzcGVjaWZpZWQgYmluYXJ5JyxcbiAgfSlcblxuICBwYWNrYWdlPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLC1wJywge1xuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgdGhlIHNwZWNpZmllZCBsaWJyYXJ5IG9yIHRoZSBvbmUgYXQgY3dkJyxcbiAgfSlcblxuICBwcm9maWxlPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1wcm9maWxlJywge1xuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgYXJ0aWZhY3RzIHdpdGggdGhlIHNwZWNpZmllZCBwcm9maWxlJyxcbiAgfSlcblxuICBjcm9zc0NvbXBpbGU/OiBib29sZWFuID0gT3B0aW9uLkJvb2xlYW4oJy0tY3Jvc3MtY29tcGlsZSwteCcsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdbZXhwZXJpbWVudGFsXSBjcm9zcy1jb21waWxlIGZvciB0aGUgc3BlY2lmaWVkIHRhcmdldCB3aXRoIGBjYXJnby14d2luYCBvbiB3aW5kb3dzIGFuZCBgY2FyZ28temlnYnVpbGRgIG9uIG90aGVyIHBsYXRmb3JtJyxcbiAgfSlcblxuICB1c2VDcm9zcz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS11c2UtY3Jvc3MnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnW2V4cGVyaW1lbnRhbF0gdXNlIFtjcm9zc10oaHR0cHM6Ly9naXRodWIuY29tL2Nyb3NzLXJzL2Nyb3NzKSBpbnN0ZWFkIG9mIGBjYXJnb2AnLFxuICB9KVxuXG4gIHVzZU5hcGlDcm9zcz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS11c2UtbmFwaS1jcm9zcycsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdbZXhwZXJpbWVudGFsXSB1c2UgQG5hcGktcnMvY3Jvc3MtdG9vbGNoYWluIHRvIGNyb3NzLWNvbXBpbGUgTGludXggYXJtL2FybTY0L3g2NCBnbnUgdGFyZ2V0cy4nLFxuICB9KVxuXG4gIHdhdGNoPzogYm9vbGVhbiA9IE9wdGlvbi5Cb29sZWFuKCctLXdhdGNoLC13Jywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ3dhdGNoIHRoZSBjcmF0ZSBjaGFuZ2VzIGFuZCBidWlsZCBjb250aW51b3VzbHkgd2l0aCBgY2FyZ28td2F0Y2hgIGNyYXRlcycsXG4gIH0pXG5cbiAgZmVhdHVyZXM/OiBzdHJpbmdbXSA9IE9wdGlvbi5BcnJheSgnLS1mZWF0dXJlcywtRicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1NwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGZlYXR1cmVzIHRvIGFjdGl2YXRlJyxcbiAgfSlcblxuICBhbGxGZWF0dXJlcz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS1hbGwtZmVhdHVyZXMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmF0ZSBhbGwgYXZhaWxhYmxlIGZlYXR1cmVzJyxcbiAgfSlcblxuICBub0RlZmF1bHRGZWF0dXJlcz86IGJvb2xlYW4gPSBPcHRpb24uQm9vbGVhbignLS1uby1kZWZhdWx0LWZlYXR1cmVzJywge1xuICAgIGRlc2NyaXB0aW9uOiAnRG8gbm90IGFjdGl2YXRlIHRoZSBgZGVmYXVsdGAgZmVhdHVyZScsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiB0aGlzLnRhcmdldCxcbiAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICBtYW5pZmVzdFBhdGg6IHRoaXMubWFuaWZlc3RQYXRoLFxuICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgcGFja2FnZUpzb25QYXRoOiB0aGlzLnBhY2thZ2VKc29uUGF0aCxcbiAgICAgIHRhcmdldERpcjogdGhpcy50YXJnZXREaXIsXG4gICAgICBvdXRwdXREaXI6IHRoaXMub3V0cHV0RGlyLFxuICAgICAgcGxhdGZvcm06IHRoaXMucGxhdGZvcm0sXG4gICAgICBqc1BhY2thZ2VOYW1lOiB0aGlzLmpzUGFja2FnZU5hbWUsXG4gICAgICBjb25zdEVudW06IHRoaXMuY29uc3RFbnVtLFxuICAgICAganNCaW5kaW5nOiB0aGlzLmpzQmluZGluZyxcbiAgICAgIG5vSnNCaW5kaW5nOiB0aGlzLm5vSnNCaW5kaW5nLFxuICAgICAgZHRzOiB0aGlzLmR0cyxcbiAgICAgIGR0c0hlYWRlcjogdGhpcy5kdHNIZWFkZXIsXG4gICAgICBub0R0c0hlYWRlcjogdGhpcy5ub0R0c0hlYWRlcixcbiAgICAgIGR0c0NhY2hlOiB0aGlzLmR0c0NhY2hlLFxuICAgICAgZXNtOiB0aGlzLmVzbSxcbiAgICAgIHN0cmlwOiB0aGlzLnN0cmlwLFxuICAgICAgcmVsZWFzZTogdGhpcy5yZWxlYXNlLFxuICAgICAgdmVyYm9zZTogdGhpcy52ZXJib3NlLFxuICAgICAgYmluOiB0aGlzLmJpbixcbiAgICAgIHBhY2thZ2U6IHRoaXMucGFja2FnZSxcbiAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgIGNyb3NzQ29tcGlsZTogdGhpcy5jcm9zc0NvbXBpbGUsXG4gICAgICB1c2VDcm9zczogdGhpcy51c2VDcm9zcyxcbiAgICAgIHVzZU5hcGlDcm9zczogdGhpcy51c2VOYXBpQ3Jvc3MsXG4gICAgICB3YXRjaDogdGhpcy53YXRjaCxcbiAgICAgIGZlYXR1cmVzOiB0aGlzLmZlYXR1cmVzLFxuICAgICAgYWxsRmVhdHVyZXM6IHRoaXMuYWxsRmVhdHVyZXMsXG4gICAgICBub0RlZmF1bHRGZWF0dXJlczogdGhpcy5ub0RlZmF1bHRGZWF0dXJlcyxcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgTkFQSS1SUyBwcm9qZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEJ1aWxkIGZvciB0aGUgdGFyZ2V0IHRyaXBsZSwgYnlwYXNzZWQgdG8gYGNhcmdvIGJ1aWxkIC0tdGFyZ2V0YFxuICAgKi9cbiAgdGFyZ2V0Pzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGhcbiAgICovXG4gIGN3ZD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgQ2FyZ28udG9tbGBcbiAgICovXG4gIG1hbmlmZXN0UGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZVxuICAgKi9cbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgcGFja2FnZS5qc29uYFxuICAgKi9cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgZm9yIGFsbCBjcmF0ZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzLCBzZWUgYGNhcmdvIGJ1aWxkIC0tdGFyZ2V0LWRpcmBcbiAgICovXG4gIHRhcmdldERpcj86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB3aGVyZSBhbGwgdGhlIGJ1aWx0IGZpbGVzIHdvdWxkIGJlIHB1dC4gRGVmYXVsdCB0byB0aGUgY3JhdGUgZm9sZGVyXG4gICAqL1xuICBvdXRwdXREaXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEFkZCBwbGF0Zm9ybSB0cmlwbGUgdG8gdGhlIGdlbmVyYXRlZCBub2RlanMgYmluZGluZyBmaWxlLCBlZzogYFtuYW1lXS5saW51eC14NjQtZ251Lm5vZGVgXG4gICAqL1xuICBwbGF0Zm9ybT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFBhY2thZ2UgbmFtZSBpbiBnZW5lcmF0ZWQganMgYmluZGluZyBmaWxlLiBPbmx5IHdvcmtzIHdpdGggYC0tcGxhdGZvcm1gIGZsYWdcbiAgICovXG4gIGpzUGFja2FnZU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFdoZXRoZXIgZ2VuZXJhdGUgY29uc3QgZW51bSBmb3IgdHlwZXNjcmlwdCBiaW5kaW5nc1xuICAgKi9cbiAgY29uc3RFbnVtPzogYm9vbGVhblxuICAvKipcbiAgICogUGF0aCBhbmQgZmlsZW5hbWUgb2YgZ2VuZXJhdGVkIEpTIGJpbmRpbmcgZmlsZS4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLiBSZWxhdGl2ZSB0byBgLS1vdXRwdXQtZGlyYC5cbiAgICovXG4gIGpzQmluZGluZz86IHN0cmluZ1xuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIEpTIGJpbmRpbmcgZmlsZS4gT25seSB3b3JrcyB3aXRoIGAtLXBsYXRmb3JtYCBmbGFnLlxuICAgKi9cbiAgbm9Kc0JpbmRpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBQYXRoIGFuZCBmaWxlbmFtZSBvZiBnZW5lcmF0ZWQgdHlwZSBkZWYgZmlsZS4gUmVsYXRpdmUgdG8gYC0tb3V0cHV0LWRpcmBcbiAgICovXG4gIGR0cz86IHN0cmluZ1xuICAvKipcbiAgICogQ3VzdG9tIGZpbGUgaGVhZGVyIGZvciBnZW5lcmF0ZWQgdHlwZSBkZWYgZmlsZS4gT25seSB3b3JrcyB3aGVuIGB0eXBlZGVmYCBmZWF0dXJlIGVuYWJsZWQuXG4gICAqL1xuICBkdHNIZWFkZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdCBmaWxlIGhlYWRlciBmb3IgZ2VuZXJhdGVkIHR5cGUgZGVmIGZpbGUuIE9ubHkgd29ya3Mgd2hlbiBgdHlwZWRlZmAgZmVhdHVyZSBlbmFibGVkLlxuICAgKi9cbiAgbm9EdHNIZWFkZXI/OiBib29sZWFuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSB0aGUgZHRzIGNhY2hlLCBkZWZhdWx0IHRvIHRydWVcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZHRzQ2FjaGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtaXQgYW4gRVNNIEpTIGJpbmRpbmcgZmlsZSBpbnN0ZWFkIG9mIENKUyBmb3JtYXQuIE9ubHkgd29ya3Mgd2l0aCBgLS1wbGF0Zm9ybWAgZmxhZy5cbiAgICovXG4gIGVzbT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc3RyaXAgdGhlIGxpYnJhcnkgdG8gYWNoaWV2ZSB0aGUgbWluaW11bSBmaWxlIHNpemVcbiAgICovXG4gIHN0cmlwPzogYm9vbGVhblxuICAvKipcbiAgICogQnVpbGQgaW4gcmVsZWFzZSBtb2RlXG4gICAqL1xuICByZWxlYXNlPzogYm9vbGVhblxuICAvKipcbiAgICogVmVyYm9zZWx5IGxvZyBidWlsZCBjb21tYW5kIHRyYWNlXG4gICAqL1xuICB2ZXJib3NlPzogYm9vbGVhblxuICAvKipcbiAgICogQnVpbGQgb25seSB0aGUgc3BlY2lmaWVkIGJpbmFyeVxuICAgKi9cbiAgYmluPzogc3RyaW5nXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgc3BlY2lmaWVkIGxpYnJhcnkgb3IgdGhlIG9uZSBhdCBjd2RcbiAgICovXG4gIHBhY2thZ2U/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEJ1aWxkIGFydGlmYWN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvZmlsZVxuICAgKi9cbiAgcHJvZmlsZT86IHN0cmluZ1xuICAvKipcbiAgICogW2V4cGVyaW1lbnRhbF0gY3Jvc3MtY29tcGlsZSBmb3IgdGhlIHNwZWNpZmllZCB0YXJnZXQgd2l0aCBgY2FyZ28teHdpbmAgb24gd2luZG93cyBhbmQgYGNhcmdvLXppZ2J1aWxkYCBvbiBvdGhlciBwbGF0Zm9ybVxuICAgKi9cbiAgY3Jvc3NDb21waWxlPzogYm9vbGVhblxuICAvKipcbiAgICogW2V4cGVyaW1lbnRhbF0gdXNlIFtjcm9zc10oaHR0cHM6Ly9naXRodWIuY29tL2Nyb3NzLXJzL2Nyb3NzKSBpbnN0ZWFkIG9mIGBjYXJnb2BcbiAgICovXG4gIHVzZUNyb3NzPzogYm9vbGVhblxuICAvKipcbiAgICogW2V4cGVyaW1lbnRhbF0gdXNlIEBuYXBpLXJzL2Nyb3NzLXRvb2xjaGFpbiB0byBjcm9zcy1jb21waWxlIExpbnV4IGFybS9hcm02NC94NjQgZ251IHRhcmdldHMuXG4gICAqL1xuICB1c2VOYXBpQ3Jvc3M/OiBib29sZWFuXG4gIC8qKlxuICAgKiB3YXRjaCB0aGUgY3JhdGUgY2hhbmdlcyBhbmQgYnVpbGQgY29udGludW91c2x5IHdpdGggYGNhcmdvLXdhdGNoYCBjcmF0ZXNcbiAgICovXG4gIHdhdGNoPzogYm9vbGVhblxuICAvKipcbiAgICogU3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgZmVhdHVyZXMgdG8gYWN0aXZhdGVcbiAgICovXG4gIGZlYXR1cmVzPzogc3RyaW5nW11cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGFsbCBhdmFpbGFibGUgZmVhdHVyZXNcbiAgICovXG4gIGFsbEZlYXR1cmVzPzogYm9vbGVhblxuICAvKipcbiAgICogRG8gbm90IGFjdGl2YXRlIHRoZSBgZGVmYXVsdGAgZmVhdHVyZVxuICAgKi9cbiAgbm9EZWZhdWx0RmVhdHVyZXM/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRCdWlsZE9wdGlvbnMob3B0aW9uczogQnVpbGRPcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgZHRzQ2FjaGU6IHRydWUsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxufVxuIiwiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5cbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJ2NsaXBhbmlvbidcblxuaW1wb3J0IHsgYnVpbGRQcm9qZWN0IH0gZnJvbSAnLi4vYXBpL2J1aWxkLmpzJ1xuaW1wb3J0IHsgQmFzZUJ1aWxkQ29tbWFuZCB9IGZyb20gJy4uL2RlZi9idWlsZC5qcydcbmltcG9ydCB7IGRlYnVnRmFjdG9yeSB9IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnRmFjdG9yeSgnYnVpbGQnKVxuXG5leHBvcnQgY2xhc3MgQnVpbGRDb21tYW5kIGV4dGVuZHMgQmFzZUJ1aWxkQ29tbWFuZCB7XG4gIHBpcGUgPSBPcHRpb24uU3RyaW5nKCctLXBpcGUnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGlwZSBhbGwgb3V0cHV0cyBmaWxlIHRvIGdpdmVuIGNvbW1hbmQuIGUuZy4gYG5hcGkgYnVpbGQgLS1waXBlIFwibnB4IHByZXR0aWVyIC0td3JpdGVcImAnLFxuICB9KVxuXG4gIGNhcmdvT3B0aW9ucyA9IE9wdGlvbi5SZXN0KClcblxuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGNvbnN0IHsgdGFzayB9ID0gYXdhaXQgYnVpbGRQcm9qZWN0KHtcbiAgICAgIC4uLnRoaXMuZ2V0T3B0aW9ucygpLFxuICAgICAgY2FyZ29PcHRpb25zOiB0aGlzLmNhcmdvT3B0aW9ucyxcbiAgICB9KVxuXG4gICAgY29uc3Qgb3V0cHV0cyA9IGF3YWl0IHRhc2tcblxuICAgIGlmICh0aGlzLnBpcGUpIHtcbiAgICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIG91dHB1dHMpIHtcbiAgICAgICAgZGVidWcoJ1BpcGluZyBvdXRwdXQgZmlsZSB0byBjb21tYW5kOiAlcycsIHRoaXMucGlwZSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBleGVjU3luYyhgJHt0aGlzLnBpcGV9ICR7b3V0cHV0LnBhdGh9YCwge1xuICAgICAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgICAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGRlYnVnLmVycm9yKGBGYWlsZWQgdG8gcGlwZSBvdXRwdXQgZmlsZSAke291dHB1dC5wYXRofSB0byBjb21tYW5kYClcbiAgICAgICAgICBkZWJ1Zy5lcnJvcihlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNyZWF0ZU5wbURpcnNDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBwYXRocyA9IFtbJ2NyZWF0ZS1ucG0tZGlycyddXVxuXG4gIHN0YXRpYyB1c2FnZSA9IENvbW1hbmQuVXNhZ2Uoe1xuICAgIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIG5wbSBwYWNrYWdlIGRpcnMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMnLFxuICB9KVxuXG4gIGN3ZCA9IE9wdGlvbi5TdHJpbmcoJy0tY3dkJywgcHJvY2Vzcy5jd2QoKSwge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aCcsXG4gIH0pXG5cbiAgY29uZmlnUGF0aD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tY29uZmlnLXBhdGgsLWMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlJyxcbiAgfSlcblxuICBwYWNrYWdlSnNvblBhdGggPSBPcHRpb24uU3RyaW5nKCctLXBhY2thZ2UtanNvbi1wYXRoJywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYHBhY2thZ2UuanNvbmAnLFxuICB9KVxuXG4gIG5wbURpciA9IE9wdGlvbi5TdHJpbmcoJy0tbnBtLWRpcicsICducG0nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXQnLFxuICB9KVxuXG4gIGRyeVJ1biA9IE9wdGlvbi5Cb29sZWFuKCctLWRyeS1ydW4nLCBmYWxzZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnRHJ5IHJ1biB3aXRob3V0IHRvdWNoaW5nIGZpbGUgc3lzdGVtJyxcbiAgfSlcblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgcGFja2FnZUpzb25QYXRoOiB0aGlzLnBhY2thZ2VKc29uUGF0aCxcbiAgICAgIG5wbURpcjogdGhpcy5ucG1EaXIsXG4gICAgICBkcnlSdW46IHRoaXMuZHJ5UnVuLFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBucG0gcGFja2FnZSBkaXJzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTnBtRGlyc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoXG4gICAqXG4gICAqIEBkZWZhdWx0IHByb2Nlc3MuY3dkKClcbiAgICovXG4gIGN3ZD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZVxuICAgKi9cbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgcGFja2FnZS5qc29uYFxuICAgKlxuICAgKiBAZGVmYXVsdCAncGFja2FnZS5qc29uJ1xuICAgKi9cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXRcbiAgICpcbiAgICogQGRlZmF1bHQgJ25wbSdcbiAgICovXG4gIG5wbURpcj86IHN0cmluZ1xuICAvKipcbiAgICogRHJ5IHJ1biB3aXRob3V0IHRvdWNoaW5nIGZpbGUgc3lzdGVtXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkcnlSdW4/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRDcmVhdGVOcG1EaXJzT3B0aW9ucyhcbiAgb3B0aW9uczogQ3JlYXRlTnBtRGlyc09wdGlvbnMsXG4pIHtcbiAgcmV0dXJuIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgcGFja2FnZUpzb25QYXRoOiAncGFja2FnZS5qc29uJyxcbiAgICBucG1EaXI6ICducG0nLFxuICAgIGRyeVJ1bjogZmFsc2UsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxufVxuIiwiaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdzZW12ZXInXG5cbmltcG9ydCB7XG4gIGFwcGx5RGVmYXVsdENyZWF0ZU5wbURpcnNPcHRpb25zLFxuICBDcmVhdGVOcG1EaXJzT3B0aW9ucyxcbn0gZnJvbSAnLi4vZGVmL2NyZWF0ZS1ucG0tZGlycy5qcydcbmltcG9ydCB7XG4gIGRlYnVnRmFjdG9yeSxcbiAgcmVhZE5hcGlDb25maWcsXG4gIG1rZGlyQXN5bmMgYXMgcmF3TWtkaXJBc3luYyxcbiAgcGljayxcbiAgd3JpdGVGaWxlQXN5bmMgYXMgcmF3V3JpdGVGaWxlQXN5bmMsXG4gIFRhcmdldCxcbiAgdHlwZSBDb21tb25QYWNrYWdlSnNvbkZpZWxkcyxcbn0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCdjcmVhdGUtbnBtLWRpcnMnKVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VNZXRhIHtcbiAgJ2Rpc3QtdGFncyc6IHsgW2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTnBtRGlycyh1c2VyT3B0aW9uczogQ3JlYXRlTnBtRGlyc09wdGlvbnMpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGFwcGx5RGVmYXVsdENyZWF0ZU5wbURpcnNPcHRpb25zKHVzZXJPcHRpb25zKVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG1rZGlyQXN5bmMoZGlyOiBzdHJpbmcpIHtcbiAgICBkZWJ1ZygnVHJ5IHRvIGNyZWF0ZSBkaXI6ICVpJywgZGlyKVxuICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgcmF3TWtkaXJBc3luYyhkaXIsIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlQXN5bmMoZmlsZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpIHtcbiAgICBkZWJ1ZygnV3JpdGluZyBmaWxlICVpJywgZmlsZSlcblxuICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgZGVidWcoY29udGVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHJhd1dyaXRlRmlsZUFzeW5jKGZpbGUsIGNvbnRlbnQpXG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLnBhY2thZ2VKc29uUGF0aClcbiAgY29uc3QgbnBtUGF0aCA9IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMubnBtRGlyKVxuXG4gIGRlYnVnKGBSZWFkIGNvbnRlbnQgZnJvbSBbJHtvcHRpb25zLmNvbmZpZ1BhdGggPz8gcGFja2FnZUpzb25QYXRofV1gKVxuXG4gIGNvbnN0IHsgdGFyZ2V0cywgYmluYXJ5TmFtZSwgcGFja2FnZU5hbWUsIHBhY2thZ2VKc29uIH0gPVxuICAgIGF3YWl0IHJlYWROYXBpQ29uZmlnKFxuICAgICAgcGFja2FnZUpzb25QYXRoLFxuICAgICAgb3B0aW9ucy5jb25maWdQYXRoID8gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5jb25maWdQYXRoKSA6IHVuZGVmaW5lZCxcbiAgICApXG5cbiAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IHRhcmdldERpciA9IGpvaW4obnBtUGF0aCwgYCR7dGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX1gKVxuICAgIGF3YWl0IG1rZGlyQXN5bmModGFyZ2V0RGlyKVxuXG4gICAgY29uc3QgYmluYXJ5RmlsZU5hbWUgPVxuICAgICAgdGFyZ2V0LmFyY2ggPT09ICd3YXNtMzInXG4gICAgICAgID8gYCR7YmluYXJ5TmFtZX0uJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfS53YXNtYFxuICAgICAgICA6IGAke2JpbmFyeU5hbWV9LiR7dGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX0ubm9kZWBcbiAgICBjb25zdCBzY29wZWRQYWNrYWdlSnNvbjogQ29tbW9uUGFja2FnZUpzb25GaWVsZHMgPSB7XG4gICAgICBuYW1lOiBgJHtwYWNrYWdlTmFtZX0tJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfWAsXG4gICAgICB2ZXJzaW9uOiBwYWNrYWdlSnNvbi52ZXJzaW9uLFxuICAgICAgY3B1OiB0YXJnZXQuYXJjaCAhPT0gJ3VuaXZlcnNhbCcgPyBbdGFyZ2V0LmFyY2hdIDogdW5kZWZpbmVkLFxuICAgICAgbWFpbjogYmluYXJ5RmlsZU5hbWUsXG4gICAgICBmaWxlczogW2JpbmFyeUZpbGVOYW1lXSxcbiAgICAgIC4uLnBpY2soXG4gICAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAna2V5d29yZHMnLFxuICAgICAgICAnYXV0aG9yJyxcbiAgICAgICAgJ2F1dGhvcnMnLFxuICAgICAgICAnaG9tZXBhZ2UnLFxuICAgICAgICAnbGljZW5zZScsXG4gICAgICAgICdlbmdpbmVzJyxcbiAgICAgICAgJ3JlcG9zaXRvcnknLFxuICAgICAgICAnYnVncycsXG4gICAgICApLFxuICAgIH1cbiAgICBpZiAocGFja2FnZUpzb24ucHVibGlzaENvbmZpZykge1xuICAgICAgc2NvcGVkUGFja2FnZUpzb24ucHVibGlzaENvbmZpZyA9IHBpY2soXG4gICAgICAgIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWcsXG4gICAgICAgICdyZWdpc3RyeScsXG4gICAgICAgICdhY2Nlc3MnLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAodGFyZ2V0LmFyY2ggIT09ICd3YXNtMzInKSB7XG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5vcyA9IFt0YXJnZXQucGxhdGZvcm1dXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gYCR7YmluYXJ5TmFtZX0ud2FzaS5janNgXG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5tYWluID0gZW50cnlcbiAgICAgIHNjb3BlZFBhY2thZ2VKc29uLmJyb3dzZXIgPSBgJHtiaW5hcnlOYW1lfS53YXNpLWJyb3dzZXIuanNgXG4gICAgICBzY29wZWRQYWNrYWdlSnNvbi5maWxlcz8ucHVzaChcbiAgICAgICAgZW50cnksXG4gICAgICAgIHNjb3BlZFBhY2thZ2VKc29uLmJyb3dzZXIsXG4gICAgICAgIGB3YXNpLXdvcmtlci5tanNgLFxuICAgICAgICBgd2FzaS13b3JrZXItYnJvd3Nlci5tanNgLFxuICAgICAgKVxuICAgICAgbGV0IG5lZWRSZXN0cmljdE5vZGVWZXJzaW9uID0gdHJ1ZVxuICAgICAgaWYgKHNjb3BlZFBhY2thZ2VKc29uLmVuZ2luZXM/Lm5vZGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IG1ham9yIH0gPSBwYXJzZShzY29wZWRQYWNrYWdlSnNvbi5lbmdpbmVzLm5vZGUpID8/IHtcbiAgICAgICAgICAgIG1ham9yOiAwLFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWFqb3IgPj0gMTQpIHtcbiAgICAgICAgICAgIG5lZWRSZXN0cmljdE5vZGVWZXJzaW9uID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobmVlZFJlc3RyaWN0Tm9kZVZlcnNpb24pIHtcbiAgICAgICAgc2NvcGVkUGFja2FnZUpzb24uZW5naW5lcyA9IHtcbiAgICAgICAgICBub2RlOiAnPj0xNC4wLjAnLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3YXNtUnVudGltZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQG5hcGktcnMvd2FzbS1ydW50aW1lYCxcbiAgICAgICkudGhlbigocmVzKSA9PiByZXMuanNvbigpIGFzIFByb21pc2U8UGFja2FnZU1ldGE+KVxuICAgICAgc2NvcGVkUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID0ge1xuICAgICAgICAnQG5hcGktcnMvd2FzbS1ydW50aW1lJzogYF4ke3dhc21SdW50aW1lWydkaXN0LXRhZ3MnXS5sYXRlc3R9YCxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0LmFiaSA9PT0gJ2dudScpIHtcbiAgICAgIHNjb3BlZFBhY2thZ2VKc29uLmxpYmMgPSBbJ2dsaWJjJ11cbiAgICB9IGVsc2UgaWYgKHRhcmdldC5hYmkgPT09ICdtdXNsJykge1xuICAgICAgc2NvcGVkUGFja2FnZUpzb24ubGliYyA9IFsnbXVzbCddXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0UGFja2FnZUpzb24gPSBqb2luKHRhcmdldERpciwgJ3BhY2thZ2UuanNvbicpXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoXG4gICAgICB0YXJnZXRQYWNrYWdlSnNvbixcbiAgICAgIEpTT04uc3RyaW5naWZ5KHNjb3BlZFBhY2thZ2VKc29uLCBudWxsLCAyKSArICdcXG4nLFxuICAgIClcbiAgICBjb25zdCB0YXJnZXRSZWFkbWUgPSBqb2luKHRhcmdldERpciwgJ1JFQURNRS5tZCcpXG4gICAgYXdhaXQgd3JpdGVGaWxlQXN5bmModGFyZ2V0UmVhZG1lLCByZWFkbWUocGFja2FnZU5hbWUsIHRhcmdldCkpXG5cbiAgICBkZWJ1Zy5pbmZvKGAke3BhY2thZ2VOYW1lfSAtJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfSBjcmVhdGVkYClcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkbWUocGFja2FnZU5hbWU6IHN0cmluZywgdGFyZ2V0OiBUYXJnZXQpIHtcbiAgcmV0dXJuIGAjIFxcYCR7cGFja2FnZU5hbWV9LSR7dGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX1cXGBcblxuVGhpcyBpcyB0aGUgKioke3RhcmdldC50cmlwbGV9KiogYmluYXJ5IGZvciBcXGAke3BhY2thZ2VOYW1lfVxcYFxuYFxufVxuIiwiaW1wb3J0IHsgY3JlYXRlTnBtRGlycyB9IGZyb20gJy4uL2FwaS9jcmVhdGUtbnBtLWRpcnMuanMnXG5pbXBvcnQgeyBCYXNlQ3JlYXRlTnBtRGlyc0NvbW1hbmQgfSBmcm9tICcuLi9kZWYvY3JlYXRlLW5wbS1kaXJzLmpzJ1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlTnBtRGlyc0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ3JlYXRlTnBtRGlyc0NvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGF3YWl0IGNyZWF0ZU5wbURpcnModGhpcy5nZXRPcHRpb25zKCkpXG4gIH1cbn1cbiIsImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjbGlwYW5pb24nXG5cbi8qKlxuICogQSBjb21tYW5kIHRoYXQgcHJpbnRzIHRoZSB1c2FnZSBvZiBhbGwgY29tbWFuZHMuXG4gKlxuICogUGF0aHM6IGAtaGAsIGAtLWhlbHBgXG4gKi9cbmV4cG9ydCBjbGFzcyBIZWxwQ29tbWFuZCBleHRlbmRzIENvbW1hbmQ8YW55PiB7XG4gIHN0YXRpYyBwYXRocyA9IFtbYC1oYF0sIFtgLS1oZWxwYF1dXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgdGhpcy5jb250ZXh0LnN0ZG91dC53cml0ZSh0aGlzLmNsaS51c2FnZSgpKVxuICB9XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuaW1wb3J0ICogYXMgdHlwYW5pb24gZnJvbSAndHlwYW5pb24nXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTmV3Q29tbWFuZCBleHRlbmRzIENvbW1hbmQge1xuICBzdGF0aWMgcGF0aHMgPSBbWyduZXcnXV1cblxuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhIG5ldyBwcm9qZWN0IHdpdGggcHJlLWNvbmZpZ3VyZWQgYm9pbGVycGxhdGUnLFxuICB9KVxuXG4gICQkcGF0aCA9IE9wdGlvbi5TdHJpbmcoeyByZXF1aXJlZDogZmFsc2UgfSlcblxuICAkJG5hbWU/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLW5hbWUsLW4nLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhlIG5hbWUgb2YgdGhlIHByb2plY3QsIGRlZmF1bHQgdG8gdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpZiBub3QgcHJvdmlkZWQnLFxuICB9KVxuXG4gIG1pbk5vZGVBcGlWZXJzaW9uID0gT3B0aW9uLlN0cmluZygnLS1taW4tbm9kZS1hcGksLXYnLCAnNCcsIHtcbiAgICB2YWxpZGF0b3I6IHR5cGFuaW9uLmlzTnVtYmVyKCksXG4gICAgZGVzY3JpcHRpb246ICdUaGUgbWluaW11bSBOb2RlLUFQSSB2ZXJzaW9uIHRvIHN1cHBvcnQnLFxuICB9KVxuXG4gIHBhY2thZ2VNYW5hZ2VyID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLW1hbmFnZXInLCAneWFybicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlLiBPbmx5IHN1cHBvcnQgeWFybiA0LnggZm9yIG5vdy4nLFxuICB9KVxuXG4gIGxpY2Vuc2UgPSBPcHRpb24uU3RyaW5nKCctLWxpY2Vuc2UsLWwnLCAnTUlUJywge1xuICAgIGRlc2NyaXB0aW9uOiAnTGljZW5zZSBmb3Igb3Blbi1zb3VyY2VkIHByb2plY3QnLFxuICB9KVxuXG4gIHRhcmdldHMgPSBPcHRpb24uQXJyYXkoJy0tdGFyZ2V0cywtdCcsIFtdLCB7XG4gICAgZGVzY3JpcHRpb246ICdBbGwgdGFyZ2V0cyB0aGUgY3JhdGUgd2lsbCBiZSBjb21waWxlZCBmb3IuJyxcbiAgfSlcblxuICBlbmFibGVEZWZhdWx0VGFyZ2V0cyA9IE9wdGlvbi5Cb29sZWFuKCctLWVuYWJsZS1kZWZhdWx0LXRhcmdldHMnLCB0cnVlLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIGVuYWJsZSBkZWZhdWx0IHRhcmdldHMnLFxuICB9KVxuXG4gIGVuYWJsZUFsbFRhcmdldHMgPSBPcHRpb24uQm9vbGVhbignLS1lbmFibGUtYWxsLXRhcmdldHMnLCBmYWxzZSwge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBlbmFibGUgYWxsIHRhcmdldHMnLFxuICB9KVxuXG4gIGVuYWJsZVR5cGVEZWYgPSBPcHRpb24uQm9vbGVhbignLS1lbmFibGUtdHlwZS1kZWYnLCB0cnVlLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnV2hldGhlciBlbmFibGUgdGhlIGB0eXBlLWRlZmAgZmVhdHVyZSBmb3IgdHlwZXNjcmlwdCBkZWZpbml0aW9ucyBhdXRvLWdlbmVyYXRpb24nLFxuICB9KVxuXG4gIGVuYWJsZUdpdGh1YkFjdGlvbnMgPSBPcHRpb24uQm9vbGVhbignLS1lbmFibGUtZ2l0aHViLWFjdGlvbnMnLCB0cnVlLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIGdlbmVyYXRlIHByZWNvbmZpZ3VyZWQgR2l0SHViIEFjdGlvbnMgd29ya2Zsb3cnLFxuICB9KVxuXG4gIHRlc3RGcmFtZXdvcmsgPSBPcHRpb24uU3RyaW5nKCctLXRlc3QtZnJhbWV3b3JrJywgJ2F2YScsIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgSmF2YVNjcmlwdCB0ZXN0IGZyYW1ld29yayB0byB1c2UsIG9ubHkgc3VwcG9ydCBgYXZhYCBmb3Igbm93JyxcbiAgfSlcblxuICBkcnlSdW4gPSBPcHRpb24uQm9vbGVhbignLS1kcnktcnVuJywgZmFsc2UsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHRoZSBjb21tYW5kIGluIGRyeS1ydW4gbW9kZScsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogdGhpcy4kJHBhdGgsXG4gICAgICBuYW1lOiB0aGlzLiQkbmFtZSxcbiAgICAgIG1pbk5vZGVBcGlWZXJzaW9uOiB0aGlzLm1pbk5vZGVBcGlWZXJzaW9uLFxuICAgICAgcGFja2FnZU1hbmFnZXI6IHRoaXMucGFja2FnZU1hbmFnZXIsXG4gICAgICBsaWNlbnNlOiB0aGlzLmxpY2Vuc2UsXG4gICAgICB0YXJnZXRzOiB0aGlzLnRhcmdldHMsXG4gICAgICBlbmFibGVEZWZhdWx0VGFyZ2V0czogdGhpcy5lbmFibGVEZWZhdWx0VGFyZ2V0cyxcbiAgICAgIGVuYWJsZUFsbFRhcmdldHM6IHRoaXMuZW5hYmxlQWxsVGFyZ2V0cyxcbiAgICAgIGVuYWJsZVR5cGVEZWY6IHRoaXMuZW5hYmxlVHlwZURlZixcbiAgICAgIGVuYWJsZUdpdGh1YkFjdGlvbnM6IHRoaXMuZW5hYmxlR2l0aHViQWN0aW9ucyxcbiAgICAgIHRlc3RGcmFtZXdvcms6IHRoaXMudGVzdEZyYW1ld29yayxcbiAgICAgIGRyeVJ1bjogdGhpcy5kcnlSdW4sXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IHByb2plY3Qgd2l0aCBwcmUtY29uZmlndXJlZCBib2lsZXJwbGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ld09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHBhdGggd2hlcmUgdGhlIE5BUEktUlMgcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICBwYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCwgZGVmYXVsdCB0byB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGlmIG5vdCBwcm92aWRlZFxuICAgKi9cbiAgbmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gTm9kZS1BUEkgdmVyc2lvbiB0byBzdXBwb3J0XG4gICAqXG4gICAqIEBkZWZhdWx0IDRcbiAgICovXG4gIG1pbk5vZGVBcGlWZXJzaW9uPzogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZS4gT25seSBzdXBwb3J0IHlhcm4gNC54IGZvciBub3cuXG4gICAqXG4gICAqIEBkZWZhdWx0ICd5YXJuJ1xuICAgKi9cbiAgcGFja2FnZU1hbmFnZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIExpY2Vuc2UgZm9yIG9wZW4tc291cmNlZCBwcm9qZWN0XG4gICAqXG4gICAqIEBkZWZhdWx0ICdNSVQnXG4gICAqL1xuICBsaWNlbnNlPzogc3RyaW5nXG4gIC8qKlxuICAgKiBBbGwgdGFyZ2V0cyB0aGUgY3JhdGUgd2lsbCBiZSBjb21waWxlZCBmb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICB0YXJnZXRzPzogc3RyaW5nW11cbiAgLyoqXG4gICAqIFdoZXRoZXIgZW5hYmxlIGRlZmF1bHQgdGFyZ2V0c1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVEZWZhdWx0VGFyZ2V0cz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZW5hYmxlIGFsbCB0YXJnZXRzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBlbmFibGVBbGxUYXJnZXRzPzogYm9vbGVhblxuICAvKipcbiAgICogV2hldGhlciBlbmFibGUgdGhlIGB0eXBlLWRlZmAgZmVhdHVyZSBmb3IgdHlwZXNjcmlwdCBkZWZpbml0aW9ucyBhdXRvLWdlbmVyYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlVHlwZURlZj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZ2VuZXJhdGUgcHJlY29uZmlndXJlZCBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVHaXRodWJBY3Rpb25zPzogYm9vbGVhblxuICAvKipcbiAgICogVGhlIEphdmFTY3JpcHQgdGVzdCBmcmFtZXdvcmsgdG8gdXNlLCBvbmx5IHN1cHBvcnQgYGF2YWAgZm9yIG5vd1xuICAgKlxuICAgKiBAZGVmYXVsdCAnYXZhJ1xuICAgKi9cbiAgdGVzdEZyYW1ld29yaz86IHN0cmluZ1xuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIGNvbW1hbmQgaW4gZHJ5LXJ1biBtb2RlXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkcnlSdW4/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHROZXdPcHRpb25zKG9wdGlvbnM6IE5ld09wdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBtaW5Ob2RlQXBpVmVyc2lvbjogNCxcbiAgICBwYWNrYWdlTWFuYWdlcjogJ3lhcm4nLFxuICAgIGxpY2Vuc2U6ICdNSVQnLFxuICAgIHRhcmdldHM6IFtdLFxuICAgIGVuYWJsZURlZmF1bHRUYXJnZXRzOiB0cnVlLFxuICAgIGVuYWJsZUFsbFRhcmdldHM6IGZhbHNlLFxuICAgIGVuYWJsZVR5cGVEZWY6IHRydWUsXG4gICAgZW5hYmxlR2l0aHViQWN0aW9uczogdHJ1ZSxcbiAgICB0ZXN0RnJhbWV3b3JrOiAnYXZhJyxcbiAgICBkcnlSdW46IGZhbHNlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cbn1cbiIsImZ1bmN0aW9uIF9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uKGUsIHQpIHtcbiAgaWYgKHQuaGFzKGUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGluaXRpYWxpemUgdGhlIHNhbWUgcHJpdmF0ZSBlbGVtZW50cyB0d2ljZSBvbiBhbiBvYmplY3RcIik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGNoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24gPSByZXF1aXJlKFwiLi9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uLmpzXCIpO1xuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKGUsIGEpIHtcbiAgY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbihlLCBhKSwgYS5hZGQoZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBjaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uID0gcmVxdWlyZShcIi4vY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbi5qc1wiKTtcbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKGUsIHQsIGEpIHtcbiAgY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbihlLCB0KSwgdC5zZXQoZSwgYSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2Fzc2VydENsYXNzQnJhbmQoZSwgdCwgbikge1xuICBpZiAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBlID8gZSA9PT0gdCA6IGUuaGFzKHQpKSByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0IDogbjtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCBvbiB0aGlzIG9iamVjdFwiKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2Fzc2VydENsYXNzQnJhbmQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgYXNzZXJ0Q2xhc3NCcmFuZCA9IHJlcXVpcmUoXCIuL2Fzc2VydENsYXNzQnJhbmQuanNcIik7XG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRHZXQyKHMsIGEpIHtcbiAgcmV0dXJuIHMuZ2V0KGFzc2VydENsYXNzQnJhbmQocywgYSkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQyLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiLy8gQ29weXJpZ2h0IDIwMTgtMjAyNSB0aGUgRGVubyBhdXRob3JzLiBNSVQgbGljZW5zZS5cbi8vIFRoaXMgbW9kdWxlIGlzIGJyb3dzZXIgY29tcGF0aWJsZS5cbi8vIEJhcmUga2V5cyBtYXkgb25seSBjb250YWluIEFTQ0lJIGxldHRlcnMsXG4vLyBBU0NJSSBkaWdpdHMsIHVuZGVyc2NvcmVzLCBhbmQgZGFzaGVzIChBLVphLXowLTlfLSkuXG5mdW5jdGlvbiBqb2luS2V5cyhrZXlzKSB7XG4gIC8vIERvdHRlZCBrZXlzIGFyZSBhIHNlcXVlbmNlIG9mIGJhcmUgb3IgcXVvdGVkIGtleXMgam9pbmVkIHdpdGggYSBkb3QuXG4gIC8vIFRoaXMgYWxsb3dzIGZvciBncm91cGluZyBzaW1pbGFyIHByb3BlcnRpZXMgdG9nZXRoZXI6XG4gIHJldHVybiBrZXlzLm1hcCgoc3RyKT0+e1xuICAgIHJldHVybiBzdHIubGVuZ3RoID09PSAwIHx8IHN0ci5tYXRjaCgvW15BLVphLXowLTlfLV0vKSA/IEpTT04uc3RyaW5naWZ5KHN0cikgOiBzdHI7XG4gIH0pLmpvaW4oXCIuXCIpO1xufVxuY2xhc3MgRHVtcGVyIHtcbiAgbWF4UGFkID0gMDtcbiAgc3JjT2JqZWN0O1xuICBvdXRwdXQgPSBbXTtcbiAgI2FycmF5VHlwZUNhY2hlID0gbmV3IE1hcCgpO1xuICBjb25zdHJ1Y3RvcihzcmNPYmpjKXtcbiAgICB0aGlzLnNyY09iamVjdCA9IHNyY09iamM7XG4gIH1cbiAgZHVtcChmbXRPcHRpb25zID0ge30pIHtcbiAgICAvLyBkZW5vLWxpbnQtaWdub3JlIG5vLWV4cGxpY2l0LWFueVxuICAgIHRoaXMub3V0cHV0ID0gdGhpcy4jcHJpbnRPYmplY3QodGhpcy5zcmNPYmplY3QpO1xuICAgIHRoaXMub3V0cHV0ID0gdGhpcy4jZm9ybWF0KGZtdE9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLm91dHB1dDtcbiAgfVxuICAjcHJpbnRPYmplY3Qob2JqLCBrZXlzID0gW10pIHtcbiAgICBjb25zdCBvdXQgPSBbXTtcbiAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgY29uc3QgaW5saW5lUHJvcHMgPSBbXTtcbiAgICBjb25zdCBtdWx0aWxpbmVQcm9wcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcyl7XG4gICAgICBpZiAodGhpcy4jaXNTaW1wbHlTZXJpYWxpemFibGUob2JqW3Byb3BdKSkge1xuICAgICAgICBpbmxpbmVQcm9wcy5wdXNoKHByb3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXVsdGlsaW5lUHJvcHMucHVzaChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc29ydGVkUHJvcHMgPSBpbmxpbmVQcm9wcy5jb25jYXQobXVsdGlsaW5lUHJvcHMpO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBzb3J0ZWRQcm9wcyl7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9ialtwcm9wXTtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgb3V0LnB1c2godGhpcy4jZGF0ZURlY2xhcmF0aW9uKFtcbiAgICAgICAgICBwcm9wXG4gICAgICAgIF0sIHZhbHVlKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICBvdXQucHVzaCh0aGlzLiNzdHJEZWNsYXJhdGlvbihbXG4gICAgICAgICAgcHJvcFxuICAgICAgICBdLCB2YWx1ZS50b1N0cmluZygpKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBvdXQucHVzaCh0aGlzLiNudW1iZXJEZWNsYXJhdGlvbihbXG4gICAgICAgICAgcHJvcFxuICAgICAgICBdLCB2YWx1ZSkpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIG91dC5wdXNoKHRoaXMuI2Jvb2xEZWNsYXJhdGlvbihbXG4gICAgICAgICAgcHJvcFxuICAgICAgICBdLCB2YWx1ZSkpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGNvbnN0IGFycmF5VHlwZSA9IHRoaXMuI2dldFR5cGVPZkFycmF5KHZhbHVlKTtcbiAgICAgICAgaWYgKGFycmF5VHlwZSA9PT0gXCJPTkxZX1BSSU1JVElWRVwiKSB7XG4gICAgICAgICAgb3V0LnB1c2godGhpcy4jYXJyYXlEZWNsYXJhdGlvbihbXG4gICAgICAgICAgICBwcm9wXG4gICAgICAgICAgXSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheVR5cGUgPT09IFwiT05MWV9PQkpFQ1RfRVhDTFVESU5HX0FSUkFZXCIpIHtcbiAgICAgICAgICAvLyBhcnJheSBvZiBvYmplY3RzXG4gICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIG91dC5wdXNoKFwiXCIpO1xuICAgICAgICAgICAgb3V0LnB1c2godGhpcy4jaGVhZGVyR3JvdXAoW1xuICAgICAgICAgICAgICAuLi5rZXlzLFxuICAgICAgICAgICAgICBwcm9wXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICBvdXQucHVzaCguLi50aGlzLiNwcmludE9iamVjdCh2YWx1ZVtpXSwgW1xuICAgICAgICAgICAgICAuLi5rZXlzLFxuICAgICAgICAgICAgICBwcm9wXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMgaXMgYSBjb21wbGV4IGFycmF5LCB1c2UgdGhlIGlubGluZSBmb3JtYXQuXG4gICAgICAgICAgY29uc3Qgc3RyID0gdmFsdWUubWFwKCh4KT0+dGhpcy4jcHJpbnRBc0lubGluZVZhbHVlKHgpKS5qb2luKFwiLFwiKTtcbiAgICAgICAgICBvdXQucHVzaChgJHt0aGlzLiNkZWNsYXJhdGlvbihbXG4gICAgICAgICAgICBwcm9wXG4gICAgICAgICAgXSl9WyR7c3RyfV1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3V0LnB1c2goXCJcIik7XG4gICAgICAgIG91dC5wdXNoKHRoaXMuI2hlYWRlcihbXG4gICAgICAgICAgLi4ua2V5cyxcbiAgICAgICAgICBwcm9wXG4gICAgICAgIF0pKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgdG9QYXJzZSA9IHZhbHVlO1xuICAgICAgICAgIG91dC5wdXNoKC4uLnRoaXMuI3ByaW50T2JqZWN0KHRvUGFyc2UsIFtcbiAgICAgICAgICAgIC4uLmtleXMsXG4gICAgICAgICAgICBwcm9wXG4gICAgICAgICAgXSkpO1xuICAgICAgICB9XG4gICAgICAvLyBvdXQucHVzaCguLi50aGlzLl9wYXJzZSh2YWx1ZSwgYCR7cGF0aH0ke3Byb3B9LmApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgb3V0LnB1c2goXCJcIik7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICAjaXNQcmltaXRpdmUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8IFtcbiAgICAgIFwic3RyaW5nXCIsXG4gICAgICBcIm51bWJlclwiLFxuICAgICAgXCJib29sZWFuXCJcbiAgICBdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSk7XG4gIH1cbiAgI2dldFR5cGVPZkFycmF5KGFycikge1xuICAgIGlmICh0aGlzLiNhcnJheVR5cGVDYWNoZS5oYXMoYXJyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2FycmF5VHlwZUNhY2hlLmdldChhcnIpO1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gdGhpcy4jZG9HZXRUeXBlT2ZBcnJheShhcnIpO1xuICAgIHRoaXMuI2FycmF5VHlwZUNhY2hlLnNldChhcnIsIHR5cGUpO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG4gICNkb0dldFR5cGVPZkFycmF5KGFycikge1xuICAgIGlmICghYXJyLmxlbmd0aCkge1xuICAgICAgLy8gYW55IHR5cGUgc2hvdWxkIGJlIGZpbmVcbiAgICAgIHJldHVybiBcIk9OTFlfUFJJTUlUSVZFXCI7XG4gICAgfVxuICAgIGNvbnN0IG9ubHlQcmltaXRpdmUgPSB0aGlzLiNpc1ByaW1pdGl2ZShhcnJbMF0pO1xuICAgIGlmIChhcnJbMF0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgcmV0dXJuIFwiTUlYRURcIjtcbiAgICB9XG4gICAgZm9yKGxldCBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKyl7XG4gICAgICBpZiAob25seVByaW1pdGl2ZSAhPT0gdGhpcy4jaXNQcmltaXRpdmUoYXJyW2ldKSB8fCBhcnJbaV0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICByZXR1cm4gXCJNSVhFRFwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb25seVByaW1pdGl2ZSA/IFwiT05MWV9QUklNSVRJVkVcIiA6IFwiT05MWV9PQkpFQ1RfRVhDTFVESU5HX0FSUkFZXCI7XG4gIH1cbiAgI3ByaW50QXNJbmxpbmVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBgXCIke3RoaXMuI3ByaW50RGF0ZSh2YWx1ZSl9XCJgO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgY29uc3Qgc3RyID0gdmFsdWUubWFwKCh4KT0+dGhpcy4jcHJpbnRBc0lubGluZVZhbHVlKHgpKS5qb2luKFwiLFwiKTtcbiAgICAgIHJldHVybiBgWyR7c3RyfV1gO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNob3VsZCBuZXZlciByZWFjaFwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0ciA9IE9iamVjdC5rZXlzKHZhbHVlKS5tYXAoKGtleSk9PntcbiAgICAgICAgcmV0dXJuIGAke2pvaW5LZXlzKFtcbiAgICAgICAgICBrZXlcbiAgICAgICAgXSl9ID0gJHsvLyBkZW5vLWxpbnQtaWdub3JlIG5vLWV4cGxpY2l0LWFueVxuICAgICAgICB0aGlzLiNwcmludEFzSW5saW5lVmFsdWUodmFsdWVba2V5XSl9YDtcbiAgICAgIH0pLmpvaW4oXCIsXCIpO1xuICAgICAgcmV0dXJuIGB7JHtzdHJ9fWA7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlNob3VsZCBuZXZlciByZWFjaFwiKTtcbiAgfVxuICAjaXNTaW1wbHlTZXJpYWxpemFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIHRoaXMuI2dldFR5cGVPZkFycmF5KHZhbHVlKSAhPT0gXCJPTkxZX09CSkVDVF9FWENMVURJTkdfQVJSQVlcIjtcbiAgfVxuICAjaGVhZGVyKGtleXMpIHtcbiAgICByZXR1cm4gYFske2pvaW5LZXlzKGtleXMpfV1gO1xuICB9XG4gICNoZWFkZXJHcm91cChrZXlzKSB7XG4gICAgcmV0dXJuIGBbWyR7am9pbktleXMoa2V5cyl9XV1gO1xuICB9XG4gICNkZWNsYXJhdGlvbihrZXlzKSB7XG4gICAgY29uc3QgdGl0bGUgPSBqb2luS2V5cyhrZXlzKTtcbiAgICBpZiAodGl0bGUubGVuZ3RoID4gdGhpcy5tYXhQYWQpIHtcbiAgICAgIHRoaXMubWF4UGFkID0gdGl0bGUubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGl0bGV9ID0gYDtcbiAgfVxuICAjYXJyYXlEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gO1xuICB9XG4gICNzdHJEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gO1xuICB9XG4gICNudW1iZXJEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy4jZGVjbGFyYXRpb24oa2V5cyl9bmFuYDtcbiAgICB9XG4gICAgc3dpdGNoKHZhbHVlKXtcbiAgICAgIGNhc2UgSW5maW5pdHk6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX1pbmZgO1xuICAgICAgY2FzZSAtSW5maW5pdHk6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0taW5mYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke3ZhbHVlfWA7XG4gICAgfVxuICB9XG4gICNib29sRGVjbGFyYXRpb24oa2V5cywgdmFsdWUpIHtcbiAgICByZXR1cm4gYCR7dGhpcy4jZGVjbGFyYXRpb24oa2V5cyl9JHt2YWx1ZX1gO1xuICB9XG4gICNwcmludERhdGUodmFsdWUpIHtcbiAgICBmdW5jdGlvbiBkdFBhZCh2LCBsUGFkID0gMikge1xuICAgICAgcmV0dXJuIHYucGFkU3RhcnQobFBhZCwgXCIwXCIpO1xuICAgIH1cbiAgICBjb25zdCBtID0gZHRQYWQoKHZhbHVlLmdldFVUQ01vbnRoKCkgKyAxKS50b1N0cmluZygpKTtcbiAgICBjb25zdCBkID0gZHRQYWQodmFsdWUuZ2V0VVRDRGF0ZSgpLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IGggPSBkdFBhZCh2YWx1ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IG1pbiA9IGR0UGFkKHZhbHVlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpKTtcbiAgICBjb25zdCBzID0gZHRQYWQodmFsdWUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IG1zID0gZHRQYWQodmFsdWUuZ2V0VVRDTWlsbGlzZWNvbmRzKCkudG9TdHJpbmcoKSwgMyk7XG4gICAgLy8gZm9ybWF0dGVkIGRhdGVcbiAgICBjb25zdCBmRGF0YSA9IGAke3ZhbHVlLmdldFVUQ0Z1bGxZZWFyKCl9LSR7bX0tJHtkfVQke2h9OiR7bWlufToke3N9LiR7bXN9YDtcbiAgICByZXR1cm4gZkRhdGE7XG4gIH1cbiAgI2RhdGVEZWNsYXJhdGlvbihrZXlzLCB2YWx1ZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNkZWNsYXJhdGlvbihrZXlzKX0ke3RoaXMuI3ByaW50RGF0ZSh2YWx1ZSl9YDtcbiAgfVxuICAjZm9ybWF0KG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsga2V5QWxpZ25tZW50ID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgckRlY2xhcmF0aW9uID0gL14oXFxcIi4qXFxcInxbXj1dKilcXHM9LztcbiAgICBjb25zdCBvdXQgPSBbXTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5vdXRwdXQubGVuZ3RoOyBpKyspe1xuICAgICAgY29uc3QgbCA9IHRoaXMub3V0cHV0W2ldO1xuICAgICAgLy8gd2Uga2VlcCBlbXB0eSBlbnRyeSBmb3IgYXJyYXkgb2Ygb2JqZWN0c1xuICAgICAgaWYgKGxbMF0gPT09IFwiW1wiICYmIGxbMV0gIT09IFwiW1wiKSB7XG4gICAgICAgIC8vIG5vbi1lbXB0eSBvYmplY3Qgd2l0aCBvbmx5IHN1Ym9iamVjdHMgYXMgcHJvcGVydGllc1xuICAgICAgICBpZiAodGhpcy5vdXRwdXRbaSArIDFdID09PSBcIlwiICYmIHRoaXMub3V0cHV0W2kgKyAyXT8uc2xpY2UoMCwgbC5sZW5ndGgpID09PSBsLnNsaWNlKDAsIC0xKSArIFwiLlwiKSB7XG4gICAgICAgICAgaSArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG91dC5wdXNoKGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGtleUFsaWdubWVudCkge1xuICAgICAgICAgIGNvbnN0IG0gPSByRGVjbGFyYXRpb24uZXhlYyhsKTtcbiAgICAgICAgICBpZiAobSAmJiBtWzFdKSB7XG4gICAgICAgICAgICBvdXQucHVzaChsLnJlcGxhY2UobVsxXSwgbVsxXS5wYWRFbmQodGhpcy5tYXhQYWQpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dC5wdXNoKGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQucHVzaChsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhbmluZyBtdWx0aXBsZSBzcGFjZXNcbiAgICBjb25zdCBjbGVhbmVkT3V0cHV0ID0gW107XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkrKyl7XG4gICAgICBjb25zdCBsID0gb3V0W2ldO1xuICAgICAgaWYgKCEobCA9PT0gXCJcIiAmJiBvdXRbaSArIDFdID09PSBcIlwiKSkge1xuICAgICAgICBjbGVhbmVkT3V0cHV0LnB1c2gobCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGVhbmVkT3V0cHV0O1xuICB9XG59XG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCB0byBhIHtAbGluayBodHRwczovL3RvbWwuaW8gfCBUT01MfSBzdHJpbmcuXG4gKlxuICogQGV4YW1wbGUgVXNhZ2VcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tIFwiQHN0ZC90b21sL3N0cmluZ2lmeVwiO1xuICogaW1wb3J0IHsgYXNzZXJ0RXF1YWxzIH0gZnJvbSBcIkBzdGQvYXNzZXJ0XCI7XG4gKlxuICogY29uc3Qgb2JqID0ge1xuICogICB0aXRsZTogXCJUT01MIEV4YW1wbGVcIixcbiAqICAgb3duZXI6IHtcbiAqICAgICBuYW1lOiBcIkJvYlwiLFxuICogICAgIGJpbzogXCJCb2IgaXMgYSBjb29sIGd1eVwiLFxuICogIH1cbiAqIH07XG4gKiBjb25zdCB0b21sU3RyaW5nID0gc3RyaW5naWZ5KG9iaik7XG4gKiBhc3NlcnRFcXVhbHModG9tbFN0cmluZywgYHRpdGxlID0gXCJUT01MIEV4YW1wbGVcIlxcblxcbltvd25lcl1cXG5uYW1lID0gXCJCb2JcIlxcbmJpbyA9IFwiQm9iIGlzIGEgY29vbCBndXlcIlxcbmApO1xuICogYGBgXG4gKiBAcGFyYW0gb2JqIFNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHN0cmluZ2lmeWluZy5cbiAqIEByZXR1cm5zIFRPTUwgc3RyaW5nXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeShvYmosIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBEdW1wZXIob2JqKS5kdW1wKG9wdGlvbnMpLmpvaW4oXCJcXG5cIik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwIiwiLy8gQ29weXJpZ2h0IDIwMTgtMjAyNSB0aGUgRGVubyBhdXRob3JzLiBNSVQgbGljZW5zZS5cbi8vIFRoaXMgbW9kdWxlIGlzIGJyb3dzZXIgY29tcGF0aWJsZS5cbi8qKlxuICogRmlsdGVycyB0aGUgZ2l2ZW4gYXJyYXksIHJlbW92aW5nIGFsbCBlbGVtZW50cyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgZ2l2ZW4gcHJlZGljYXRlXG4gKiAqKmluIHBsYWNlLiBUaGlzIG1lYW5zIGBhcnJheWAgd2lsbCBiZSBtb2RpZmllZCEqKi5cbiAqLyBleHBvcnQgZnVuY3Rpb24gZmlsdGVySW5QbGFjZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIGxldCBvdXRwdXRJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgY3VyIG9mIGFycmF5KXtcbiAgICBpZiAoIXByZWRpY2F0ZShjdXIpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgYXJyYXlbb3V0cHV0SW5kZXhdID0gY3VyO1xuICAgIG91dHB1dEluZGV4ICs9IDE7XG4gIH1cbiAgYXJyYXkuc3BsaWNlKG91dHB1dEluZGV4KTtcbiAgcmV0dXJuIGFycmF5O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3V0aWxzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAyMDE4LTIwMjUgdGhlIERlbm8gYXV0aG9ycy4gTUlUIGxpY2Vuc2UuXG4vLyBUaGlzIG1vZHVsZSBpcyBicm93c2VyIGNvbXBhdGlibGUuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSBcIi4vX3V0aWxzLmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1lcmdlKHJlY29yZCwgb3RoZXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRlZXBNZXJnZUludGVybmFsKHJlY29yZCwgb3RoZXIsIG5ldyBTZXQoKSwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2VJbnRlcm5hbChyZWNvcmQsIG90aGVyLCBzZWVuLCBvcHRpb25zKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBjb25zdCBrZXlzID0gbmV3IFNldChbXG4gICAgLi4uZ2V0S2V5cyhyZWNvcmQpLFxuICAgIC4uLmdldEtleXMob3RoZXIpXG4gIF0pO1xuICAvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBrZXkgb2Ygb3RoZXIgb2JqZWN0IGFuZCB1c2UgY29ycmVjdCBtZXJnaW5nIHN0cmF0ZWd5XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpe1xuICAgIC8vIFNraXAgdG8gcHJldmVudCBPYmplY3QucHJvdG90eXBlLl9fcHJvdG9fXyBhY2Nlc3NvciBwcm9wZXJ0eSBjYWxscyBvbiBub24tRGVubyBwbGF0Zm9ybXNcbiAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYSA9IHJlY29yZFtrZXldO1xuICAgIGlmICghT2JqZWN0Lmhhc093bihvdGhlciwga2V5KSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBhO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGIgPSBvdGhlcltrZXldO1xuICAgIGlmIChpc05vbk51bGxPYmplY3QoYSkgJiYgaXNOb25OdWxsT2JqZWN0KGIpICYmICFzZWVuLmhhcyhhKSAmJiAhc2Vlbi5oYXMoYikpIHtcbiAgICAgIHNlZW4uYWRkKGEpO1xuICAgICAgc2Vlbi5hZGQoYik7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlT2JqZWN0cyhhLCBiLCBzZWVuLCBvcHRpb25zKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBPdmVycmlkZSB2YWx1ZVxuICAgIHJlc3VsdFtrZXldID0gYjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbWVyZ2VPYmplY3RzKGxlZnQsIHJpZ2h0LCBzZWVuLCBvcHRpb25zID0ge1xuICBhcnJheXM6IFwibWVyZ2VcIixcbiAgc2V0czogXCJtZXJnZVwiLFxuICBtYXBzOiBcIm1lcmdlXCJcbn0pIHtcbiAgLy8gUmVjdXJzaXZlbHkgbWVyZ2UgbWVyZ2VhYmxlIG9iamVjdHNcbiAgaWYgKGlzTWVyZ2VhYmxlKGxlZnQpICYmIGlzTWVyZ2VhYmxlKHJpZ2h0KSkge1xuICAgIHJldHVybiBkZWVwTWVyZ2VJbnRlcm5hbChsZWZ0LCByaWdodCwgc2Vlbiwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGlzSXRlcmFibGUobGVmdCkgJiYgaXNJdGVyYWJsZShyaWdodCkpIHtcbiAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGVmdCkgJiYgQXJyYXkuaXNBcnJheShyaWdodCkpIHtcbiAgICAgIGlmIChvcHRpb25zLmFycmF5cyA9PT0gXCJtZXJnZVwiKSB7XG4gICAgICAgIHJldHVybiBsZWZ0LmNvbmNhdChyaWdodCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmlnaHQ7XG4gICAgfVxuICAgIC8vIEhhbmRsZSBtYXBzXG4gICAgaWYgKGxlZnQgaW5zdGFuY2VvZiBNYXAgJiYgcmlnaHQgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgIGlmIChvcHRpb25zLm1hcHMgPT09IFwibWVyZ2VcIikge1xuICAgICAgICByZXR1cm4gbmV3IE1hcChbXG4gICAgICAgICAgLi4ubGVmdCxcbiAgICAgICAgICAuLi5yaWdodFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByaWdodDtcbiAgICB9XG4gICAgLy8gSGFuZGxlIHNldHNcbiAgICBpZiAobGVmdCBpbnN0YW5jZW9mIFNldCAmJiByaWdodCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgaWYgKG9wdGlvbnMuc2V0cyA9PT0gXCJtZXJnZVwiKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAuLi5sZWZ0LFxuICAgICAgICAgIC4uLnJpZ2h0XG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJpZ2h0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmlnaHQ7XG59XG4vKipcbiAqIFRlc3Qgd2hldGhlciBhIHZhbHVlIGlzIG1lcmdlYWJsZSBvciBub3RcbiAqIEJ1aWx0aW5zIHRoYXQgbG9vayBsaWtlIG9iamVjdHMsIG51bGwgYW5kIHVzZXIgZGVmaW5lZCBjbGFzc2VzXG4gKiBhcmUgbm90IGNvbnNpZGVyZWQgbWVyZ2VhYmxlIChpdCBtZWFucyB0aGF0IHJlZmVyZW5jZSB3aWxsIGJlIGNvcGllZClcbiAqLyBmdW5jdGlvbiBpc01lcmdlYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cbmZ1bmN0aW9uIGlzSXRlcmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBpc05vbk51bGxPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIjtcbn1cbmZ1bmN0aW9uIGdldEtleXMocmVjb3JkKSB7XG4gIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocmVjb3JkKTtcbiAgZmlsdGVySW5QbGFjZShyZXN1bHQsIChrZXkpPT5PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocmVjb3JkLCBrZXkpKTtcbiAgcmVzdWx0LnB1c2goLi4uT2JqZWN0LmtleXMocmVjb3JkKSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWVwX21lcmdlLmpzLm1hcCIsInZhciBhc3NlcnRDbGFzc0JyYW5kID0gcmVxdWlyZShcIi4vYXNzZXJ0Q2xhc3NCcmFuZC5qc1wiKTtcbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZFNldDIocywgYSwgcikge1xuICByZXR1cm4gcy5zZXQoYXNzZXJ0Q2xhc3NCcmFuZChzLCBhKSwgciksIHI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jbGFzc1ByaXZhdGVGaWVsZFNldDIsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCIvLyBDb3B5cmlnaHQgMjAxOC0yMDI1IHRoZSBEZW5vIGF1dGhvcnMuIE1JVCBsaWNlbnNlLlxuLy8gVGhpcyBtb2R1bGUgaXMgYnJvd3NlciBjb21wYXRpYmxlLlxuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSBcIkBqc3Ivc3RkX19jb2xsZWN0aW9ucy9kZWVwLW1lcmdlXCI7XG4vKipcbiAqIENvcHkgb2YgYGltcG9ydCB7IGlzTGVhcCB9IGZyb20gXCJAc3RkL2RhdGV0aW1lXCI7YCBiZWNhdXNlIGl0IGNhbm5vdCBiZSBpbXBvdGVkIGFzIGxvbmcgYXMgaXQgaXMgdW5zdGFibGUuXG4gKi8gZnVuY3Rpb24gaXNMZWFwKHllYXJOdW1iZXIpIHtcbiAgcmV0dXJuIHllYXJOdW1iZXIgJSA0ID09PSAwICYmIHllYXJOdW1iZXIgJSAxMDAgIT09IDAgfHwgeWVhck51bWJlciAlIDQwMCA9PT0gMDtcbn1cbmV4cG9ydCBjbGFzcyBTY2FubmVyIHtcbiAgI3doaXRlc3BhY2UgPSAvWyBcXHRdLztcbiAgI3Bvc2l0aW9uID0gMDtcbiAgI3NvdXJjZTtcbiAgY29uc3RydWN0b3Ioc291cmNlKXtcbiAgICB0aGlzLiNzb3VyY2UgPSBzb3VyY2U7XG4gIH1cbiAgZ2V0IHBvc2l0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbjtcbiAgfVxuICBnZXQgc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLiNzb3VyY2U7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGNoYXJhY3RlclxuICAgKiBAcGFyYW0gaW5kZXggLSByZWxhdGl2ZSBpbmRleCBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICovIGNoYXIoaW5kZXggPSAwKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NvdXJjZVt0aGlzLiNwb3NpdGlvbiArIGluZGV4XSA/PyBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgc2xpY2VkIHN0cmluZ1xuICAgKiBAcGFyYW0gc3RhcnQgLSBzdGFydCBwb3NpdGlvbiByZWxhdGl2ZSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICogQHBhcmFtIGVuZCAtIGVuZCBwb3NpdGlvbiByZWxhdGl2ZSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICovIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gdGhpcy4jc291cmNlLnNsaWNlKHRoaXMuI3Bvc2l0aW9uICsgc3RhcnQsIHRoaXMuI3Bvc2l0aW9uICsgZW5kKTtcbiAgfVxuICAvKipcbiAgICogTW92ZSBwb3NpdGlvbiB0byBuZXh0XG4gICAqLyBuZXh0KGNvdW50ID0gMSkge1xuICAgIHRoaXMuI3Bvc2l0aW9uICs9IGNvdW50O1xuICB9XG4gIHNraXBXaGl0ZXNwYWNlcygpIHtcbiAgICB3aGlsZSh0aGlzLiN3aGl0ZXNwYWNlLnRlc3QodGhpcy5jaGFyKCkpICYmICF0aGlzLmVvZigpKXtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICAvLyBJbnZhbGlkIGlmIGN1cnJlbnQgY2hhciBpcyBvdGhlciBraW5kcyBvZiB3aGl0ZXNwYWNlXG4gICAgaWYgKCF0aGlzLmlzQ3VycmVudENoYXJFT0woKSAmJiAvXFxzLy50ZXN0KHRoaXMuY2hhcigpKSkge1xuICAgICAgY29uc3QgZXNjYXBlZCA9IFwiXFxcXHVcIiArIHRoaXMuY2hhcigpLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLiNwb3NpdGlvbjtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSBUT01MOiBJdCBjb250YWlucyBpbnZhbGlkIHdoaXRlc3BhY2UgYXQgcG9zaXRpb24gJyR7cG9zaXRpb259JzogXFxgJHtlc2NhcGVkfVxcYGApO1xuICAgIH1cbiAgfVxuICBuZXh0VW50aWxDaGFyKG9wdGlvbnMgPSB7XG4gICAgc2tpcENvbW1lbnRzOiB0cnVlXG4gIH0pIHtcbiAgICB3aGlsZSghdGhpcy5lb2YoKSl7XG4gICAgICBjb25zdCBjaGFyID0gdGhpcy5jaGFyKCk7XG4gICAgICBpZiAodGhpcy4jd2hpdGVzcGFjZS50ZXN0KGNoYXIpIHx8IHRoaXMuaXNDdXJyZW50Q2hhckVPTCgpKSB7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnNraXBDb21tZW50cyAmJiB0aGlzLmNoYXIoKSA9PT0gXCIjXCIpIHtcbiAgICAgICAgLy8gZW50ZXJpbmcgY29tbWVudFxuICAgICAgICB3aGlsZSghdGhpcy5pc0N1cnJlbnRDaGFyRU9MKCkgJiYgIXRoaXMuZW9mKCkpe1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFBvc2l0aW9uIHJlYWNoZWQgRU9GIG9yIG5vdFxuICAgKi8gZW9mKCkge1xuICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbiA+PSB0aGlzLiNzb3VyY2UubGVuZ3RoO1xuICB9XG4gIGlzQ3VycmVudENoYXJFT0woKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcigpID09PSBcIlxcblwiIHx8IHRoaXMuc3RhcnRzV2l0aChcIlxcclxcblwiKTtcbiAgfVxuICBzdGFydHNXaXRoKHNlYXJjaFN0cmluZykge1xuICAgIHJldHVybiB0aGlzLiNzb3VyY2Uuc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcsIHRoaXMuI3Bvc2l0aW9uKTtcbiAgfVxuICBtYXRjaChyZWdFeHApIHtcbiAgICBpZiAoIXJlZ0V4cC5zdGlja3kpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVnRXhwICR7cmVnRXhwfSBkb2VzIG5vdCBoYXZlIGEgc3RpY2t5ICd5JyBmbGFnYCk7XG4gICAgfVxuICAgIHJlZ0V4cC5sYXN0SW5kZXggPSB0aGlzLiNwb3NpdGlvbjtcbiAgICByZXR1cm4gdGhpcy4jc291cmNlLm1hdGNoKHJlZ0V4cCk7XG4gIH1cbn1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVdGlsaXRpZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdWNjZXNzKGJvZHkpIHtcbiAgcmV0dXJuIHtcbiAgICBvazogdHJ1ZSxcbiAgICBib2R5XG4gIH07XG59XG5mdW5jdGlvbiBmYWlsdXJlKCkge1xuICByZXR1cm4ge1xuICAgIG9rOiBmYWxzZVxuICB9O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmVzdGVkIG9iamVjdCBmcm9tIHRoZSBrZXlzIGFuZCB2YWx1ZXMuXG4gKlxuICogZS5nLiBgdW5mbGF0KFtcImFcIiwgXCJiXCIsIFwiY1wiXSwgMSlgIHJldHVybnMgYHsgYTogeyBiOiB7IGM6IDEgfSB9IH1gXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHVuZmxhdChrZXlzLCB2YWx1ZXMgPSB7fSkge1xuICByZXR1cm4ga2V5cy5yZWR1Y2VSaWdodCgoYWNjLCBrZXkpPT4oe1xuICAgICAgW2tleV06IGFjY1xuICAgIH0pLCB2YWx1ZXMpO1xufVxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldFRhcmdldFZhbHVlKHRhcmdldCwga2V5cykge1xuICBjb25zdCBrZXkgPSBrZXlzWzBdO1xuICBpZiAoIWtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBwYXJzZSB0aGUgVE9NTDoga2V5IGxlbmd0aCBpcyBub3QgYSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gIH1cbiAgcmV0dXJuIHRhcmdldFtrZXldO1xufVxuZnVuY3Rpb24gZGVlcEFzc2lnblRhYmxlKHRhcmdldCwgdGFibGUpIHtcbiAgY29uc3QgeyBrZXlzLCB0eXBlLCB2YWx1ZSB9ID0gdGFibGU7XG4gIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGdldFRhcmdldFZhbHVlKHRhcmdldCwga2V5cyk7XG4gIGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRhcmdldCwgdW5mbGF0KGtleXMsIHZhbHVlKSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudFZhbHVlKSkge1xuICAgIGNvbnN0IGxhc3QgPSBjdXJyZW50VmFsdWUuYXQoLTEpO1xuICAgIGRlZXBBc3NpZ24obGFzdCwge1xuICAgICAgdHlwZSxcbiAgICAgIGtleXM6IGtleXMuc2xpY2UoMSksXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICBkZWVwQXNzaWduKGN1cnJlbnRWYWx1ZSwge1xuICAgICAgdHlwZSxcbiAgICAgIGtleXM6IGtleXMuc2xpY2UoMSksXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBhc3NpZ25cIik7XG59XG5mdW5jdGlvbiBkZWVwQXNzaWduVGFibGVBcnJheSh0YXJnZXQsIHRhYmxlKSB7XG4gIGNvbnN0IHsgdHlwZSwga2V5cywgdmFsdWUgfSA9IHRhYmxlO1xuICBjb25zdCBjdXJyZW50VmFsdWUgPSBnZXRUYXJnZXRWYWx1ZSh0YXJnZXQsIGtleXMpO1xuICBpZiAoY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YXJnZXQsIHVuZmxhdChrZXlzLCBbXG4gICAgICB2YWx1ZVxuICAgIF0pKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpKSB7XG4gICAgY3VycmVudFZhbHVlLnB1c2godmFsdWUpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICBkZWVwQXNzaWduKGN1cnJlbnRWYWx1ZSwge1xuICAgICAgdHlwZSxcbiAgICAgIGtleXM6IGtleXMuc2xpY2UoMSksXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBhc3NpZ25cIik7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVlcEFzc2lnbih0YXJnZXQsIGJvZHkpIHtcbiAgc3dpdGNoKGJvZHkudHlwZSl7XG4gICAgY2FzZSBcIkJsb2NrXCI6XG4gICAgICByZXR1cm4gZGVlcE1lcmdlKHRhcmdldCwgYm9keS52YWx1ZSk7XG4gICAgY2FzZSBcIlRhYmxlXCI6XG4gICAgICByZXR1cm4gZGVlcEFzc2lnblRhYmxlKHRhcmdldCwgYm9keSk7XG4gICAgY2FzZSBcIlRhYmxlQXJyYXlcIjpcbiAgICAgIHJldHVybiBkZWVwQXNzaWduVGFibGVBcnJheSh0YXJnZXQsIGJvZHkpO1xuICB9XG59XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhcnNlciBjb21iaW5hdG9ycyBhbmQgZ2VuZXJhdG9yc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBkZW5vLWxpbnQtaWdub3JlIG5vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gb3IocGFyc2Vycykge1xuICByZXR1cm4gKHNjYW5uZXIpPT57XG4gICAgZm9yIChjb25zdCBwYXJzZSBvZiBwYXJzZXJzKXtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlKHNjYW5uZXIpO1xuICAgICAgaWYgKHJlc3VsdC5vaykgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIGZhaWx1cmUoKTtcbiAgfTtcbn1cbi8qKiBKb2luIHRoZSBwYXJzZSByZXN1bHRzIG9mIHRoZSBnaXZlbiBwYXJzZXIgaW50byBhbiBhcnJheS5cbiAqXG4gKiBJZiB0aGUgcGFyc2VyIGZhaWxzIGF0IHRoZSBmaXJzdCBhdHRlbXB0LCBpdCB3aWxsIHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAqLyBmdW5jdGlvbiBqb2luKHBhcnNlciwgc2VwYXJhdG9yKSB7XG4gIGNvbnN0IFNlcGFyYXRvciA9IGNoYXJhY3RlcihzZXBhcmF0b3IpO1xuICByZXR1cm4gKHNjYW5uZXIpPT57XG4gICAgY29uc3Qgb3V0ID0gW107XG4gICAgY29uc3QgZmlyc3QgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgaWYgKCFmaXJzdC5vaykgcmV0dXJuIHN1Y2Nlc3Mob3V0KTtcbiAgICBvdXQucHVzaChmaXJzdC5ib2R5KTtcbiAgICB3aGlsZSghc2Nhbm5lci5lb2YoKSl7XG4gICAgICBpZiAoIVNlcGFyYXRvcihzY2FubmVyKS5vaykgYnJlYWs7XG4gICAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYEludmFsaWQgdG9rZW4gYWZ0ZXIgXCIke3NlcGFyYXRvcn1cImApO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2gocmVzdWx0LmJvZHkpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcyhvdXQpO1xuICB9O1xufVxuLyoqIEpvaW4gdGhlIHBhcnNlIHJlc3VsdHMgb2YgdGhlIGdpdmVuIHBhcnNlciBpbnRvIGFuIGFycmF5LlxuICpcbiAqIFRoaXMgcmVxdWlyZXMgdGhlIHBhcnNlciB0byBzdWNjZWVkIGF0IGxlYXN0IG9uY2UuXG4gKi8gZnVuY3Rpb24gam9pbjEocGFyc2VyLCBzZXBhcmF0b3IpIHtcbiAgY29uc3QgU2VwYXJhdG9yID0gY2hhcmFjdGVyKHNlcGFyYXRvcik7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBjb25zdCBmaXJzdCA9IHBhcnNlcihzY2FubmVyKTtcbiAgICBpZiAoIWZpcnN0Lm9rKSByZXR1cm4gZmFpbHVyZSgpO1xuICAgIGNvbnN0IG91dCA9IFtcbiAgICAgIGZpcnN0LmJvZHlcbiAgICBdO1xuICAgIHdoaWxlKCFzY2FubmVyLmVvZigpKXtcbiAgICAgIGlmICghU2VwYXJhdG9yKHNjYW5uZXIpLm9rKSBicmVhaztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlcihzY2FubmVyKTtcbiAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCB0b2tlbiBhZnRlciBcIiR7c2VwYXJhdG9yfVwiYCk7XG4gICAgICB9XG4gICAgICBvdXQucHVzaChyZXN1bHQuYm9keSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzKG91dCk7XG4gIH07XG59XG5mdW5jdGlvbiBrdihrZXlQYXJzZXIsIHNlcGFyYXRvciwgdmFsdWVQYXJzZXIpIHtcbiAgY29uc3QgU2VwYXJhdG9yID0gY2hhcmFjdGVyKHNlcGFyYXRvcik7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBjb25zdCBwb3NpdGlvbiA9IHNjYW5uZXIucG9zaXRpb247XG4gICAgY29uc3Qga2V5ID0ga2V5UGFyc2VyKHNjYW5uZXIpO1xuICAgIGlmICgha2V5Lm9rKSByZXR1cm4gZmFpbHVyZSgpO1xuICAgIGNvbnN0IHNlcCA9IFNlcGFyYXRvcihzY2FubmVyKTtcbiAgICBpZiAoIXNlcC5vaykge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBrZXkvdmFsdWUgcGFpciBkb2Vzbid0IGhhdmUgXCIke3NlcGFyYXRvcn1cImApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHZhbHVlUGFyc2VyKHNjYW5uZXIpO1xuICAgIGlmICghdmFsdWUub2spIHtcbiAgICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IHNjYW5uZXIuc291cmNlLmluZGV4T2YoXCJcXG5cIiwgc2Nhbm5lci5wb3NpdGlvbik7XG4gICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IGxpbmVFbmRJbmRleCA+IDAgPyBsaW5lRW5kSW5kZXggOiBzY2FubmVyLnNvdXJjZS5sZW5ndGg7XG4gICAgICBjb25zdCBsaW5lID0gc2Nhbm5lci5zb3VyY2Uuc2xpY2UocG9zaXRpb24sIGVuZFBvc2l0aW9uKTtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIHZhbHVlIG9uIGxpbmUgJyR7bGluZX0nYCk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzKHVuZmxhdChrZXkuYm9keSwgdmFsdWUuYm9keSkpO1xuICB9O1xufVxuZnVuY3Rpb24gbWVyZ2UocGFyc2VyKSB7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgaWYgKCFyZXN1bHQub2spIHJldHVybiBmYWlsdXJlKCk7XG4gICAgbGV0IGJvZHkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZXN1bHQuYm9keSl7XG4gICAgICBpZiAodHlwZW9mIHJlY29yZCA9PT0gXCJvYmplY3RcIiAmJiByZWNvcmQgIT09IG51bGwpIHtcbiAgICAgICAgYm9keSA9IGRlZXBNZXJnZShib2R5LCByZWNvcmQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3VjY2Vzcyhib2R5KTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlcGVhdChwYXJzZXIpIHtcbiAgcmV0dXJuIChzY2FubmVyKT0+e1xuICAgIGNvbnN0IGJvZHkgPSBbXTtcbiAgICB3aGlsZSghc2Nhbm5lci5lb2YoKSl7XG4gICAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgICBpZiAoIXJlc3VsdC5vaykgYnJlYWs7XG4gICAgICBib2R5LnB1c2gocmVzdWx0LmJvZHkpO1xuICAgICAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gICAgfVxuICAgIGlmIChib2R5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgICByZXR1cm4gc3VjY2Vzcyhib2R5KTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHN1cnJvdW5kKGxlZnQsIHBhcnNlciwgcmlnaHQpIHtcbiAgY29uc3QgTGVmdCA9IGNoYXJhY3RlcihsZWZ0KTtcbiAgY29uc3QgUmlnaHQgPSBjaGFyYWN0ZXIocmlnaHQpO1xuICByZXR1cm4gKHNjYW5uZXIpPT57XG4gICAgaWYgKCFMZWZ0KHNjYW5uZXIpLm9rKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZSgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIoc2Nhbm5lcik7XG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCB0b2tlbiBhZnRlciBcIiR7bGVmdH1cImApO1xuICAgIH1cbiAgICBpZiAoIVJpZ2h0KHNjYW5uZXIpLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYE5vdCBjbG9zZWQgYnkgXCIke3JpZ2h0fVwiIGFmdGVyIHN0YXJ0ZWQgd2l0aCBcIiR7bGVmdH1cImApO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcyhyZXN1bHQuYm9keSk7XG4gIH07XG59XG5mdW5jdGlvbiBjaGFyYWN0ZXIoc3RyKSB7XG4gIHJldHVybiAoc2Nhbm5lcik9PntcbiAgICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICAgIGlmICghc2Nhbm5lci5zdGFydHNXaXRoKHN0cikpIHJldHVybiBmYWlsdXJlKCk7XG4gICAgc2Nhbm5lci5uZXh0KHN0ci5sZW5ndGgpO1xuICAgIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gICAgcmV0dXJuIHN1Y2Nlc3ModW5kZWZpbmVkKTtcbiAgfTtcbn1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQYXJzZXIgY29tcG9uZW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IEJBUkVfS0VZX1JFR0VYUCA9IC9bQS1aYS16MC05Xy1dKy95O1xuZXhwb3J0IGZ1bmN0aW9uIGJhcmVLZXkoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBrZXkgPSBzY2FubmVyLm1hdGNoKEJBUkVfS0VZX1JFR0VYUCk/LlswXTtcbiAgaWYgKCFrZXkpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dChrZXkubGVuZ3RoKTtcbiAgcmV0dXJuIHN1Y2Nlc3Moa2V5KTtcbn1cbmZ1bmN0aW9uIGVzY2FwZVNlcXVlbmNlKHNjYW5uZXIpIHtcbiAgaWYgKHNjYW5uZXIuY2hhcigpICE9PSBcIlxcXFxcIikgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KCk7XG4gIC8vIFNlZSBodHRwczovL3RvbWwuaW8vZW4vdjEuMC4wLXJjLjMjc3RyaW5nXG4gIHN3aXRjaChzY2FubmVyLmNoYXIoKSl7XG4gICAgY2FzZSBcImJcIjpcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3MoXCJcXGJcIik7XG4gICAgY2FzZSBcInRcIjpcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3MoXCJcXHRcIik7XG4gICAgY2FzZSBcIm5cIjpcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3MoXCJcXG5cIik7XG4gICAgY2FzZSBcImZcIjpcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3MoXCJcXGZcIik7XG4gICAgY2FzZSBcInJcIjpcbiAgICAgIHNjYW5uZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3MoXCJcXHJcIik7XG4gICAgY2FzZSBcInVcIjpcbiAgICBjYXNlIFwiVVwiOlxuICAgICAge1xuICAgICAgICAvLyBVbmljb2RlIGNoYXJhY3RlclxuICAgICAgICBjb25zdCBjb2RlUG9pbnRMZW4gPSBzY2FubmVyLmNoYXIoKSA9PT0gXCJ1XCIgPyA0IDogNjtcbiAgICAgICAgY29uc3QgY29kZVBvaW50ID0gcGFyc2VJbnQoXCIweFwiICsgc2Nhbm5lci5zbGljZSgxLCAxICsgY29kZVBvaW50TGVuKSwgMTYpO1xuICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlUG9pbnQpO1xuICAgICAgICBzY2FubmVyLm5leHQoY29kZVBvaW50TGVuICsgMSk7XG4gICAgICAgIHJldHVybiBzdWNjZXNzKHN0cik7XG4gICAgICB9XG4gICAgY2FzZSAnXCInOlxuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICByZXR1cm4gc3VjY2VzcygnXCInKTtcbiAgICBjYXNlIFwiXFxcXFwiOlxuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICByZXR1cm4gc3VjY2VzcyhcIlxcXFxcIik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6IFxcXFwke3NjYW5uZXIuY2hhcigpfWApO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gYmFzaWNTdHJpbmcoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBpZiAoc2Nhbm5lci5jaGFyKCkgIT09ICdcIicpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dCgpO1xuICBjb25zdCBhY2MgPSBbXTtcbiAgd2hpbGUoc2Nhbm5lci5jaGFyKCkgIT09ICdcIicgJiYgIXNjYW5uZXIuZW9mKCkpe1xuICAgIGlmIChzY2FubmVyLmNoYXIoKSA9PT0gXCJcXG5cIikge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiU2luZ2xlLWxpbmUgc3RyaW5nIGNhbm5vdCBjb250YWluIEVPTFwiKTtcbiAgICB9XG4gICAgY29uc3QgZXNjYXBlZENoYXIgPSBlc2NhcGVTZXF1ZW5jZShzY2FubmVyKTtcbiAgICBpZiAoZXNjYXBlZENoYXIub2spIHtcbiAgICAgIGFjYy5wdXNoKGVzY2FwZWRDaGFyLmJvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2MucHVzaChzY2FubmVyLmNoYXIoKSk7XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNjYW5uZXIuZW9mKCkpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFNpbmdsZS1saW5lIHN0cmluZyBpcyBub3QgY2xvc2VkOlxcbiR7YWNjLmpvaW4oXCJcIil9YCk7XG4gIH1cbiAgc2Nhbm5lci5uZXh0KCk7IC8vIHNraXAgbGFzdCAnXCJcIlxuICByZXR1cm4gc3VjY2VzcyhhY2Muam9pbihcIlwiKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbFN0cmluZyhzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGlmIChzY2FubmVyLmNoYXIoKSAhPT0gXCInXCIpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dCgpO1xuICBjb25zdCBhY2MgPSBbXTtcbiAgd2hpbGUoc2Nhbm5lci5jaGFyKCkgIT09IFwiJ1wiICYmICFzY2FubmVyLmVvZigpKXtcbiAgICBpZiAoc2Nhbm5lci5jaGFyKCkgPT09IFwiXFxuXCIpIHtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIlNpbmdsZS1saW5lIHN0cmluZyBjYW5ub3QgY29udGFpbiBFT0xcIik7XG4gICAgfVxuICAgIGFjYy5wdXNoKHNjYW5uZXIuY2hhcigpKTtcbiAgICBzY2FubmVyLm5leHQoKTtcbiAgfVxuICBpZiAoc2Nhbm5lci5lb2YoKSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgU2luZ2xlLWxpbmUgc3RyaW5nIGlzIG5vdCBjbG9zZWQ6XFxuJHthY2Muam9pbihcIlwiKX1gKTtcbiAgfVxuICBzY2FubmVyLm5leHQoKTsgLy8gc2tpcCBsYXN0IFwiJ1wiXG4gIHJldHVybiBzdWNjZXNzKGFjYy5qb2luKFwiXCIpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aWxpbmVCYXNpY1N0cmluZyhzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGlmICghc2Nhbm5lci5zdGFydHNXaXRoKCdcIlwiXCInKSkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KDMpO1xuICBpZiAoc2Nhbm5lci5jaGFyKCkgPT09IFwiXFxuXCIpIHtcbiAgICAvLyBUaGUgZmlyc3QgbmV3bGluZSAoTEYpIGlzIHRyaW1tZWRcbiAgICBzY2FubmVyLm5leHQoKTtcbiAgfSBlbHNlIGlmIChzY2FubmVyLnN0YXJ0c1dpdGgoXCJcXHJcXG5cIikpIHtcbiAgICAvLyBUaGUgZmlyc3QgbmV3bGluZSAoQ1JMRikgaXMgdHJpbW1lZFxuICAgIHNjYW5uZXIubmV4dCgyKTtcbiAgfVxuICBjb25zdCBhY2MgPSBbXTtcbiAgd2hpbGUoIXNjYW5uZXIuc3RhcnRzV2l0aCgnXCJcIlwiJykgJiYgIXNjYW5uZXIuZW9mKCkpe1xuICAgIC8vIGxpbmUgZW5kaW5nIGJhY2tzbGFzaFxuICAgIGlmIChzY2FubmVyLnN0YXJ0c1dpdGgoXCJcXFxcXFxuXCIpKSB7XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgIHNjYW5uZXIubmV4dFVudGlsQ2hhcih7XG4gICAgICAgIHNraXBDb21tZW50czogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChzY2FubmVyLnN0YXJ0c1dpdGgoXCJcXFxcXFxyXFxuXCIpKSB7XG4gICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgIHNjYW5uZXIubmV4dFVudGlsQ2hhcih7XG4gICAgICAgIHNraXBDb21tZW50czogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGVzY2FwZWRDaGFyID0gZXNjYXBlU2VxdWVuY2Uoc2Nhbm5lcik7XG4gICAgaWYgKGVzY2FwZWRDaGFyLm9rKSB7XG4gICAgICBhY2MucHVzaChlc2NhcGVkQ2hhci5ib2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjLnB1c2goc2Nhbm5lci5jaGFyKCkpO1xuICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgfVxuICB9XG4gIGlmIChzY2FubmVyLmVvZigpKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBNdWx0aS1saW5lIHN0cmluZyBpcyBub3QgY2xvc2VkOlxcbiR7YWNjLmpvaW4oXCJcIil9YCk7XG4gIH1cbiAgLy8gaWYgZW5kcyB3aXRoIDQgYFwiYCwgcHVzaCB0aGUgZmlzdCBgXCJgIHRvIHN0cmluZ1xuICBpZiAoc2Nhbm5lci5jaGFyKDMpID09PSAnXCInKSB7XG4gICAgYWNjLnB1c2goJ1wiJyk7XG4gICAgc2Nhbm5lci5uZXh0KCk7XG4gIH1cbiAgc2Nhbm5lci5uZXh0KDMpOyAvLyBza2lwIGxhc3QgJ1wiXCJcIlwiXG4gIHJldHVybiBzdWNjZXNzKGFjYy5qb2luKFwiXCIpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aWxpbmVMaXRlcmFsU3RyaW5nKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgaWYgKCFzY2FubmVyLnN0YXJ0c1dpdGgoXCInJydcIikpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dCgzKTtcbiAgaWYgKHNjYW5uZXIuY2hhcigpID09PSBcIlxcblwiKSB7XG4gICAgLy8gVGhlIGZpcnN0IG5ld2xpbmUgKExGKSBpcyB0cmltbWVkXG4gICAgc2Nhbm5lci5uZXh0KCk7XG4gIH0gZWxzZSBpZiAoc2Nhbm5lci5zdGFydHNXaXRoKFwiXFxyXFxuXCIpKSB7XG4gICAgLy8gVGhlIGZpcnN0IG5ld2xpbmUgKENSTEYpIGlzIHRyaW1tZWRcbiAgICBzY2FubmVyLm5leHQoMik7XG4gIH1cbiAgY29uc3QgYWNjID0gW107XG4gIHdoaWxlKCFzY2FubmVyLnN0YXJ0c1dpdGgoXCInJydcIikgJiYgIXNjYW5uZXIuZW9mKCkpe1xuICAgIGFjYy5wdXNoKHNjYW5uZXIuY2hhcigpKTtcbiAgICBzY2FubmVyLm5leHQoKTtcbiAgfVxuICBpZiAoc2Nhbm5lci5lb2YoKSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgTXVsdGktbGluZSBzdHJpbmcgaXMgbm90IGNsb3NlZDpcXG4ke2FjYy5qb2luKFwiXCIpfWApO1xuICB9XG4gIC8vIGlmIGVuZHMgd2l0aCA0IGAnYCwgcHVzaCB0aGUgZmlzdCBgJ2AgdG8gc3RyaW5nXG4gIGlmIChzY2FubmVyLmNoYXIoMykgPT09IFwiJ1wiKSB7XG4gICAgYWNjLnB1c2goXCInXCIpO1xuICAgIHNjYW5uZXIubmV4dCgpO1xuICB9XG4gIHNjYW5uZXIubmV4dCgzKTsgLy8gc2tpcCBsYXN0IFwiJycnXCJcbiAgcmV0dXJuIHN1Y2Nlc3MoYWNjLmpvaW4oXCJcIikpO1xufVxuY29uc3QgQk9PTEVBTl9SRUdFWFAgPSAvKD86dHJ1ZXxmYWxzZSlcXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBib29sZWFuKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3QgbWF0Y2ggPSBzY2FubmVyLm1hdGNoKEJPT0xFQU5fUkVHRVhQKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgY29uc3Qgc3RyaW5nID0gbWF0Y2hbMF07XG4gIHNjYW5uZXIubmV4dChzdHJpbmcubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWUgPSBzdHJpbmcgPT09IFwidHJ1ZVwiO1xuICByZXR1cm4gc3VjY2Vzcyh2YWx1ZSk7XG59XG5jb25zdCBJTkZJTklUWV9NQVAgPSBuZXcgTWFwKFtcbiAgW1xuICAgIFwiaW5mXCIsXG4gICAgSW5maW5pdHlcbiAgXSxcbiAgW1xuICAgIFwiK2luZlwiLFxuICAgIEluZmluaXR5XG4gIF0sXG4gIFtcbiAgICBcIi1pbmZcIixcbiAgICAtSW5maW5pdHlcbiAgXVxuXSk7XG5jb25zdCBJTkZJTklUWV9SRUdFWFAgPSAvWystXT9pbmZcXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBpbmZpbml0eShzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChJTkZJTklUWV9SRUdFWFApO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFpbHVyZSgpO1xuICBjb25zdCBzdHJpbmcgPSBtYXRjaFswXTtcbiAgc2Nhbm5lci5uZXh0KHN0cmluZy5sZW5ndGgpO1xuICBjb25zdCB2YWx1ZSA9IElORklOSVRZX01BUC5nZXQoc3RyaW5nKTtcbiAgcmV0dXJuIHN1Y2Nlc3ModmFsdWUpO1xufVxuY29uc3QgTkFOX1JFR0VYUCA9IC9bKy1dP25hblxcYi95O1xuZXhwb3J0IGZ1bmN0aW9uIG5hbihzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChOQU5fUkVHRVhQKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgY29uc3Qgc3RyaW5nID0gbWF0Y2hbMF07XG4gIHNjYW5uZXIubmV4dChzdHJpbmcubGVuZ3RoKTtcbiAgY29uc3QgdmFsdWUgPSBOYU47XG4gIHJldHVybiBzdWNjZXNzKHZhbHVlKTtcbn1cbmV4cG9ydCBjb25zdCBkb3R0ZWRLZXkgPSBqb2luMShvcihbXG4gIGJhcmVLZXksXG4gIGJhc2ljU3RyaW5nLFxuICBsaXRlcmFsU3RyaW5nXG5dKSwgXCIuXCIpO1xuY29uc3QgQklOQVJZX1JFR0VYUCA9IC8wYlswMV0rKD86X1swMV0rKSpcXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnkoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goQklOQVJZX1JFR0VYUCk/LlswXTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KG1hdGNoLmxlbmd0aCk7XG4gIGNvbnN0IHZhbHVlID0gbWF0Y2guc2xpY2UoMikucmVwbGFjZUFsbChcIl9cIiwgXCJcIik7XG4gIGNvbnN0IG51bWJlciA9IHBhcnNlSW50KHZhbHVlLCAyKTtcbiAgcmV0dXJuIGlzTmFOKG51bWJlcikgPyBmYWlsdXJlKCkgOiBzdWNjZXNzKG51bWJlcik7XG59XG5jb25zdCBPQ1RBTF9SRUdFWFAgPSAvMG9bMC03XSsoPzpfWzAtN10rKSpcXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBvY3RhbChzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChPQ1RBTF9SRUdFWFApPy5bMF07XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dChtYXRjaC5sZW5ndGgpO1xuICBjb25zdCB2YWx1ZSA9IG1hdGNoLnNsaWNlKDIpLnJlcGxhY2VBbGwoXCJfXCIsIFwiXCIpO1xuICBjb25zdCBudW1iZXIgPSBwYXJzZUludCh2YWx1ZSwgOCk7XG4gIHJldHVybiBpc05hTihudW1iZXIpID8gZmFpbHVyZSgpIDogc3VjY2VzcyhudW1iZXIpO1xufVxuY29uc3QgSEVYX1JFR0VYUCA9IC8weFswLTlhLWZdKyg/Ol9bMC05YS1mXSspKlxcYi95aTtcbmV4cG9ydCBmdW5jdGlvbiBoZXgoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goSEVYX1JFR0VYUCk/LlswXTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KG1hdGNoLmxlbmd0aCk7XG4gIGNvbnN0IHZhbHVlID0gbWF0Y2guc2xpY2UoMikucmVwbGFjZUFsbChcIl9cIiwgXCJcIik7XG4gIGNvbnN0IG51bWJlciA9IHBhcnNlSW50KHZhbHVlLCAxNik7XG4gIHJldHVybiBpc05hTihudW1iZXIpID8gZmFpbHVyZSgpIDogc3VjY2VzcyhudW1iZXIpO1xufVxuY29uc3QgSU5URUdFUl9SRUdFWFAgPSAvWystXT8oPzowfFsxLTldWzAtOV0qKD86X1swLTldKykqKVxcYi95O1xuZXhwb3J0IGZ1bmN0aW9uIGludGVnZXIoc2Nhbm5lcikge1xuICBzY2FubmVyLnNraXBXaGl0ZXNwYWNlcygpO1xuICBjb25zdCBtYXRjaCA9IHNjYW5uZXIubWF0Y2goSU5URUdFUl9SRUdFWFApPy5bMF07XG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWlsdXJlKCk7XG4gIHNjYW5uZXIubmV4dChtYXRjaC5sZW5ndGgpO1xuICBjb25zdCB2YWx1ZSA9IG1hdGNoLnJlcGxhY2VBbGwoXCJfXCIsIFwiXCIpO1xuICBjb25zdCBpbnQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICByZXR1cm4gc3VjY2VzcyhpbnQpO1xufVxuY29uc3QgRkxPQVRfUkVHRVhQID0gL1srLV0/KD86MHxbMS05XVswLTldKig/Ol9bMC05XSspKikoPzpcXC5bMC05XSsoPzpfWzAtOV0rKSopPyg/OmVbKy1dP1swLTldKyg/Ol9bMC05XSspKik/XFxiL3lpO1xuZXhwb3J0IGZ1bmN0aW9uIGZsb2F0KHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgY29uc3QgbWF0Y2ggPSBzY2FubmVyLm1hdGNoKEZMT0FUX1JFR0VYUCk/LlswXTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KG1hdGNoLmxlbmd0aCk7XG4gIGNvbnN0IHZhbHVlID0gbWF0Y2gucmVwbGFjZUFsbChcIl9cIiwgXCJcIik7XG4gIGNvbnN0IGZsb2F0ID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIGlmIChpc05hTihmbG9hdCkpIHJldHVybiBmYWlsdXJlKCk7XG4gIHJldHVybiBzdWNjZXNzKGZsb2F0KTtcbn1cbmNvbnN0IERBVEVfVElNRV9SRUdFWFAgPSAvKD88eWVhcj5cXGR7NH0pLSg/PG1vbnRoPlxcZHsyfSktKD88ZGF5PlxcZHsyfSkoPzpbIDAtOVRaLjorLV0rKT9cXGIveTtcbmV4cG9ydCBmdW5jdGlvbiBkYXRlVGltZShzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChEQVRFX1RJTUVfUkVHRVhQKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgY29uc3Qgc3RyaW5nID0gbWF0Y2hbMF07XG4gIHNjYW5uZXIubmV4dChzdHJpbmcubGVuZ3RoKTtcbiAgY29uc3QgZ3JvdXBzID0gbWF0Y2guZ3JvdXBzO1xuICAvLyBzcGVjaWFsIGNhc2UgaWYgbW9udGggaXMgRmVicnVhcnlcbiAgaWYgKGdyb3Vwcy5tb250aCA9PSBcIjAyXCIpIHtcbiAgICBjb25zdCBkYXlzID0gcGFyc2VJbnQoZ3JvdXBzLmRheSk7XG4gICAgaWYgKGRheXMgPiAyOSkge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIGRhdGUgc3RyaW5nIFwiJHttYXRjaH1cImApO1xuICAgIH1cbiAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQoZ3JvdXBzLnllYXIpO1xuICAgIGlmIChkYXlzID4gMjggJiYgIWlzTGVhcCh5ZWFyKSkge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIGRhdGUgc3RyaW5nIFwiJHttYXRjaH1cImApO1xuICAgIH1cbiAgfVxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoc3RyaW5nLnRyaW0oKSk7XG4gIC8vIGludmFsaWQgZGF0ZVxuICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIGRhdGUgc3RyaW5nIFwiJHttYXRjaH1cImApO1xuICB9XG4gIHJldHVybiBzdWNjZXNzKGRhdGUpO1xufVxuY29uc3QgTE9DQUxfVElNRV9SRUdFWFAgPSAvKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSkoPzpcXC5bMC05XSspP1xcYi95O1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsVGltZShzY2FubmVyKSB7XG4gIHNjYW5uZXIuc2tpcFdoaXRlc3BhY2VzKCk7XG4gIGNvbnN0IG1hdGNoID0gc2Nhbm5lci5tYXRjaChMT0NBTF9USU1FX1JFR0VYUCk/LlswXTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KG1hdGNoLmxlbmd0aCk7XG4gIHJldHVybiBzdWNjZXNzKG1hdGNoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVZhbHVlKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgaWYgKHNjYW5uZXIuY2hhcigpICE9PSBcIltcIikgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0KCk7XG4gIGNvbnN0IGFycmF5ID0gW107XG4gIHdoaWxlKCFzY2FubmVyLmVvZigpKXtcbiAgICBzY2FubmVyLm5leHRVbnRpbENoYXIoKTtcbiAgICBjb25zdCByZXN1bHQgPSB2YWx1ZShzY2FubmVyKTtcbiAgICBpZiAoIXJlc3VsdC5vaykgYnJlYWs7XG4gICAgYXJyYXkucHVzaChyZXN1bHQuYm9keSk7XG4gICAgc2Nhbm5lci5za2lwV2hpdGVzcGFjZXMoKTtcbiAgICAvLyBtYXkgaGF2ZSBhIG5leHQgaXRlbSwgYnV0IHRyYWlsaW5nIGNvbW1hIGlzIGFsbG93ZWQgYXQgYXJyYXlcbiAgICBpZiAoc2Nhbm5lci5jaGFyKCkgIT09IFwiLFwiKSBicmVhaztcbiAgICBzY2FubmVyLm5leHQoKTtcbiAgfVxuICBzY2FubmVyLm5leHRVbnRpbENoYXIoKTtcbiAgaWYgKHNjYW5uZXIuY2hhcigpICE9PSBcIl1cIikgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQXJyYXkgaXMgbm90IGNsb3NlZFwiKTtcbiAgc2Nhbm5lci5uZXh0KCk7XG4gIHJldHVybiBzdWNjZXNzKGFycmF5KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbmxpbmVUYWJsZShzY2FubmVyKSB7XG4gIHNjYW5uZXIubmV4dFVudGlsQ2hhcigpO1xuICBpZiAoc2Nhbm5lci5jaGFyKDEpID09PSBcIn1cIikge1xuICAgIHNjYW5uZXIubmV4dCgyKTtcbiAgICByZXR1cm4gc3VjY2Vzcyh7fSk7XG4gIH1cbiAgY29uc3QgcGFpcnMgPSBzdXJyb3VuZChcIntcIiwgam9pbihwYWlyLCBcIixcIiksIFwifVwiKShzY2FubmVyKTtcbiAgaWYgKCFwYWlycy5vaykgcmV0dXJuIGZhaWx1cmUoKTtcbiAgbGV0IHRhYmxlID0ge307XG4gIGZvciAoY29uc3QgcGFpciBvZiBwYWlycy5ib2R5KXtcbiAgICB0YWJsZSA9IGRlZXBNZXJnZSh0YWJsZSwgcGFpcik7XG4gIH1cbiAgcmV0dXJuIHN1Y2Nlc3ModGFibGUpO1xufVxuZXhwb3J0IGNvbnN0IHZhbHVlID0gb3IoW1xuICBtdWx0aWxpbmVCYXNpY1N0cmluZyxcbiAgbXVsdGlsaW5lTGl0ZXJhbFN0cmluZyxcbiAgYmFzaWNTdHJpbmcsXG4gIGxpdGVyYWxTdHJpbmcsXG4gIGJvb2xlYW4sXG4gIGluZmluaXR5LFxuICBuYW4sXG4gIGRhdGVUaW1lLFxuICBsb2NhbFRpbWUsXG4gIGJpbmFyeSxcbiAgb2N0YWwsXG4gIGhleCxcbiAgZmxvYXQsXG4gIGludGVnZXIsXG4gIGFycmF5VmFsdWUsXG4gIGlubGluZVRhYmxlXG5dKTtcbmV4cG9ydCBjb25zdCBwYWlyID0ga3YoZG90dGVkS2V5LCBcIj1cIiwgdmFsdWUpO1xuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gIGNvbnN0IHJlc3VsdCA9IG1lcmdlKHJlcGVhdChwYWlyKSkoc2Nhbm5lcik7XG4gIGlmIChyZXN1bHQub2spIHJldHVybiBzdWNjZXNzKHtcbiAgICB0eXBlOiBcIkJsb2NrXCIsXG4gICAgdmFsdWU6IHJlc3VsdC5ib2R5XG4gIH0pO1xuICByZXR1cm4gZmFpbHVyZSgpO1xufVxuZXhwb3J0IGNvbnN0IHRhYmxlSGVhZGVyID0gc3Vycm91bmQoXCJbXCIsIGRvdHRlZEtleSwgXCJdXCIpO1xuZXhwb3J0IGZ1bmN0aW9uIHRhYmxlKHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gIGNvbnN0IGhlYWRlciA9IHRhYmxlSGVhZGVyKHNjYW5uZXIpO1xuICBpZiAoIWhlYWRlci5vaykgcmV0dXJuIGZhaWx1cmUoKTtcbiAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gIGNvbnN0IGIgPSBibG9jayhzY2FubmVyKTtcbiAgcmV0dXJuIHN1Y2Nlc3Moe1xuICAgIHR5cGU6IFwiVGFibGVcIixcbiAgICBrZXlzOiBoZWFkZXIuYm9keSxcbiAgICB2YWx1ZTogYi5vayA/IGIuYm9keS52YWx1ZSA6IHt9XG4gIH0pO1xufVxuZXhwb3J0IGNvbnN0IHRhYmxlQXJyYXlIZWFkZXIgPSBzdXJyb3VuZChcIltbXCIsIGRvdHRlZEtleSwgXCJdXVwiKTtcbmV4cG9ydCBmdW5jdGlvbiB0YWJsZUFycmF5KHNjYW5uZXIpIHtcbiAgc2Nhbm5lci5uZXh0VW50aWxDaGFyKCk7XG4gIGNvbnN0IGhlYWRlciA9IHRhYmxlQXJyYXlIZWFkZXIoc2Nhbm5lcik7XG4gIGlmICghaGVhZGVyLm9rKSByZXR1cm4gZmFpbHVyZSgpO1xuICBzY2FubmVyLm5leHRVbnRpbENoYXIoKTtcbiAgY29uc3QgYiA9IGJsb2NrKHNjYW5uZXIpO1xuICByZXR1cm4gc3VjY2Vzcyh7XG4gICAgdHlwZTogXCJUYWJsZUFycmF5XCIsXG4gICAga2V5czogaGVhZGVyLmJvZHksXG4gICAgdmFsdWU6IGIub2sgPyBiLmJvZHkudmFsdWUgOiB7fVxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b21sKHNjYW5uZXIpIHtcbiAgY29uc3QgYmxvY2tzID0gcmVwZWF0KG9yKFtcbiAgICBibG9jayxcbiAgICB0YWJsZUFycmF5LFxuICAgIHRhYmxlXG4gIF0pKShzY2FubmVyKTtcbiAgaWYgKCFibG9ja3Mub2spIHJldHVybiBzdWNjZXNzKHt9KTtcbiAgY29uc3QgYm9keSA9IGJsb2Nrcy5ib2R5LnJlZHVjZShkZWVwQXNzaWduLCB7fSk7XG4gIHJldHVybiBzdWNjZXNzKGJvZHkpO1xufVxuZnVuY3Rpb24gY3JlYXRlUGFyc2VFcnJvck1lc3NhZ2Uoc2Nhbm5lciwgbWVzc2FnZSkge1xuICBjb25zdCBzdHJpbmcgPSBzY2FubmVyLnNvdXJjZS5zbGljZSgwLCBzY2FubmVyLnBvc2l0aW9uKTtcbiAgY29uc3QgbGluZXMgPSBzdHJpbmcuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IHJvdyA9IGxpbmVzLmxlbmd0aDtcbiAgY29uc3QgY29sdW1uID0gbGluZXMuYXQoLTEpPy5sZW5ndGggPz8gMDtcbiAgcmV0dXJuIGBQYXJzZSBlcnJvciBvbiBsaW5lICR7cm93fSwgY29sdW1uICR7Y29sdW1ufTogJHttZXNzYWdlfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VyRmFjdG9yeShwYXJzZXIpIHtcbiAgcmV0dXJuICh0b21sU3RyaW5nKT0+e1xuICAgIGNvbnN0IHNjYW5uZXIgPSBuZXcgU2Nhbm5lcih0b21sU3RyaW5nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyKHNjYW5uZXIpO1xuICAgICAgaWYgKHJlc3VsdC5vayAmJiBzY2FubmVyLmVvZigpKSByZXR1cm4gcmVzdWx0LmJvZHk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYFVuZXhwZWN0ZWQgY2hhcmFjdGVyOiBcIiR7c2Nhbm5lci5jaGFyKCl9XCJgO1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGNyZWF0ZVBhcnNlRXJyb3JNZXNzYWdlKHNjYW5uZXIsIG1lc3NhZ2UpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGNyZWF0ZVBhcnNlRXJyb3JNZXNzYWdlKHNjYW5uZXIsIGVycm9yLm1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBcIkludmFsaWQgZXJyb3IgdHlwZSBjYXVnaHRcIjtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihjcmVhdGVQYXJzZUVycm9yTWVzc2FnZShzY2FubmVyLCBtZXNzYWdlKSk7XG4gICAgfVxuICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3BhcnNlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgMjAxOC0yMDI1IHRoZSBEZW5vIGF1dGhvcnMuIE1JVCBsaWNlbnNlLlxuLy8gVGhpcyBtb2R1bGUgaXMgYnJvd3NlciBjb21wYXRpYmxlLlxuaW1wb3J0IHsgcGFyc2VyRmFjdG9yeSwgdG9tbCB9IGZyb20gXCIuL19wYXJzZXIuanNcIjtcbi8qKlxuICogUGFyc2VzIGEge0BsaW5rIGh0dHBzOi8vdG9tbC5pbyB8IFRPTUx9IHN0cmluZyBpbnRvIGFuIG9iamVjdC5cbiAqXG4gKiBAZXhhbXBsZSBVc2FnZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHBhcnNlIH0gZnJvbSBcIkBzdGQvdG9tbC9wYXJzZVwiO1xuICogaW1wb3J0IHsgYXNzZXJ0RXF1YWxzIH0gZnJvbSBcIkBzdGQvYXNzZXJ0XCI7XG4gKlxuICogY29uc3QgdG9tbFN0cmluZyA9IGB0aXRsZSA9IFwiVE9NTCBFeGFtcGxlXCJcbiAqIFtvd25lcl1cbiAqIG5hbWUgPSBcIkFsaWNlXCJcbiAqIGJpbyA9IFwiQWxpY2UgaXMgYSBwcm9ncmFtbWVyLlwiYDtcbiAqXG4gKiBjb25zdCBvYmogPSBwYXJzZSh0b21sU3RyaW5nKTtcbiAqIGFzc2VydEVxdWFscyhvYmosIHsgdGl0bGU6IFwiVE9NTCBFeGFtcGxlXCIsIG93bmVyOiB7IG5hbWU6IFwiQWxpY2VcIiwgYmlvOiBcIkFsaWNlIGlzIGEgcHJvZ3JhbW1lci5cIiB9IH0pO1xuICogYGBgXG4gKiBAcGFyYW0gdG9tbFN0cmluZyBUT01MIHN0cmluZyB0byBiZSBwYXJzZWQuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIEpTIG9iamVjdC5cbiAqLyBleHBvcnQgZnVuY3Rpb24gcGFyc2UodG9tbFN0cmluZykge1xuICByZXR1cm4gcGFyc2VyRmFjdG9yeSh0b21sKSh0b21sU3RyaW5nKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLmpzLm1hcCIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgY29kZWdlbi9pbmRleC50c1xuLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlIG1hbnVhbGx5XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tICdjbGlwYW5pb24nXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlUmVuYW1lQ29tbWFuZCBleHRlbmRzIENvbW1hbmQge1xuICBzdGF0aWMgcGF0aHMgPSBbWydyZW5hbWUnXV1cblxuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlbmFtZSB0aGUgTkFQSS1SUyBwcm9qZWN0JyxcbiAgfSlcblxuICBjd2QgPSBPcHRpb24uU3RyaW5nKCctLWN3ZCcsIHByb2Nlc3MuY3dkKCksIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGgnLFxuICB9KVxuXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWNvbmZpZy1wYXRoLC1jJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZScsXG4gIH0pXG5cbiAgcGFja2FnZUpzb25QYXRoID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLWpzb24tcGF0aCcsICdwYWNrYWdlLmpzb24nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBwYWNrYWdlLmpzb25gJyxcbiAgfSlcblxuICBucG1EaXIgPSBPcHRpb24uU3RyaW5nKCctLW5wbS1kaXInLCAnbnBtJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0JyxcbiAgfSlcblxuICAkJG5hbWU/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLW5hbWUsLW4nLCB7XG4gICAgZGVzY3JpcHRpb246ICdUaGUgbmV3IG5hbWUgb2YgdGhlIHByb2plY3QnLFxuICB9KVxuXG4gIGJpbmFyeU5hbWU/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWJpbmFyeS1uYW1lLC1iJywge1xuICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5ldyBiaW5hcnkgbmFtZSAqLm5vZGUgZmlsZXMnLFxuICB9KVxuXG4gIHBhY2thZ2VOYW1lPzogc3RyaW5nID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLW5hbWUnLCB7XG4gICAgZGVzY3JpcHRpb246ICdUaGUgbmV3IHBhY2thZ2UgbmFtZSBvZiB0aGUgcHJvamVjdCcsXG4gIH0pXG5cbiAgbWFuaWZlc3RQYXRoID0gT3B0aW9uLlN0cmluZygnLS1tYW5pZmVzdC1wYXRoJywgJ0NhcmdvLnRvbWwnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBDYXJnby50b21sYCcsXG4gIH0pXG5cbiAgcmVwb3NpdG9yeT86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tcmVwb3NpdG9yeScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBuZXcgcmVwb3NpdG9yeSBvZiB0aGUgcHJvamVjdCcsXG4gIH0pXG5cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWRlc2NyaXB0aW9uJywge1xuICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5ldyBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvamVjdCcsXG4gIH0pXG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgIGNvbmZpZ1BhdGg6IHRoaXMuY29uZmlnUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uUGF0aDogdGhpcy5wYWNrYWdlSnNvblBhdGgsXG4gICAgICBucG1EaXI6IHRoaXMubnBtRGlyLFxuICAgICAgbmFtZTogdGhpcy4kJG5hbWUsXG4gICAgICBiaW5hcnlOYW1lOiB0aGlzLmJpbmFyeU5hbWUsXG4gICAgICBwYWNrYWdlTmFtZTogdGhpcy5wYWNrYWdlTmFtZSxcbiAgICAgIG1hbmlmZXN0UGF0aDogdGhpcy5tYW5pZmVzdFBhdGgsXG4gICAgICByZXBvc2l0b3J5OiB0aGlzLnJlcG9zaXRvcnksXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5hbWUgdGhlIE5BUEktUlMgcHJvamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHdoZXJlIG5hcGkgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluLCBhbGwgb3RoZXIgcGF0aHMgb3B0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoXG4gICAqXG4gICAqIEBkZWZhdWx0IHByb2Nlc3MuY3dkKClcbiAgICovXG4gIGN3ZD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZVxuICAgKi9cbiAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byBgcGFja2FnZS5qc29uYFxuICAgKlxuICAgKiBAZGVmYXVsdCAncGFja2FnZS5qc29uJ1xuICAgKi9cbiAgcGFja2FnZUpzb25QYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXRcbiAgICpcbiAgICogQGRlZmF1bHQgJ25wbSdcbiAgICovXG4gIG5wbURpcj86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG5ldyBuYW1lIG9mIHRoZSBwcm9qZWN0XG4gICAqL1xuICBuYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmV3IGJpbmFyeSBuYW1lICoubm9kZSBmaWxlc1xuICAgKi9cbiAgYmluYXJ5TmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG5ldyBwYWNrYWdlIG5hbWUgb2YgdGhlIHByb2plY3RcbiAgICovXG4gIHBhY2thZ2VOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBDYXJnby50b21sYFxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ2FyZ28udG9tbCdcbiAgICovXG4gIG1hbmlmZXN0UGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIG5ldyByZXBvc2l0b3J5IG9mIHRoZSBwcm9qZWN0XG4gICAqL1xuICByZXBvc2l0b3J5Pzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmV3IGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0XG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlEZWZhdWx0UmVuYW1lT3B0aW9ucyhvcHRpb25zOiBSZW5hbWVPcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIHBhY2thZ2VKc29uUGF0aDogJ3BhY2thZ2UuanNvbicsXG4gICAgbnBtRGlyOiAnbnBtJyxcbiAgICBtYW5pZmVzdFBhdGg6ICdDYXJnby50b21sJyxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IHJlbmFtZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyByZXNvbHZlLCBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVRvbWwsIHN0cmluZ2lmeSBhcyBzdHJpbmdpZnlUb21sIH0gZnJvbSAnQHN0ZC90b21sJ1xuaW1wb3J0IHsgbG9hZCBhcyB5YW1sUGFyc2UsIGR1bXAgYXMgeWFtbFN0cmluZ2lmeSB9IGZyb20gJ2pzLXlhbWwnXG5pbXBvcnQgeyBpc05pbCwgbWVyZ2UsIG9taXRCeSwgcGljayB9IGZyb20gJ2VzLXRvb2xraXQnXG5pbXBvcnQgeyBmaW5kVXAgfSBmcm9tICdmaW5kLXVwJ1xuXG5pbXBvcnQgeyBhcHBseURlZmF1bHRSZW5hbWVPcHRpb25zLCBSZW5hbWVPcHRpb25zIH0gZnJvbSAnLi4vZGVmL3JlbmFtZS5qcydcbmltcG9ydCB7IHJlYWRDb25maWcsIHJlYWRGaWxlQXN5bmMsIHdyaXRlRmlsZUFzeW5jIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5hbWVQcm9qZWN0KHVzZXJPcHRpb25zOiBSZW5hbWVPcHRpb25zKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcHBseURlZmF1bHRSZW5hbWVPcHRpb25zKHVzZXJPcHRpb25zKVxuICBjb25zdCBuYXBpQ29uZmlnID0gYXdhaXQgcmVhZENvbmZpZyhvcHRpb25zKVxuICBjb25zdCBvbGROYW1lID0gbmFwaUNvbmZpZy5iaW5hcnlOYW1lXG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5wYWNrYWdlSnNvblBhdGgpXG4gIGNvbnN0IGNhcmdvVG9tbFBhdGggPSByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLm1hbmlmZXN0UGF0aClcblxuICBjb25zdCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZUFzeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKVxuICBjb25zdCBwYWNrYWdlSnNvbkRhdGEgPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudClcblxuICBtZXJnZShcbiAgICBtZXJnZShcbiAgICAgIHBhY2thZ2VKc29uRGF0YSxcbiAgICAgIG9taXRCeShcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtaXNzaW5nIGZpZWxkczogYXV0aG9yIGFuZCBsaWNlbnNlXG4gICAgICAgIHBpY2sob3B0aW9ucywgWyduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ2F1dGhvcicsICdsaWNlbnNlJ10pLFxuICAgICAgICBpc05pbCxcbiAgICAgICksXG4gICAgKSxcbiAgICB7XG4gICAgICBuYXBpOiBvbWl0QnkoXG4gICAgICAgIHtcbiAgICAgICAgICBiaW5hcnlOYW1lOiBvcHRpb25zLmJpbmFyeU5hbWUsXG4gICAgICAgICAgcGFja2FnZU5hbWU6IG9wdGlvbnMucGFja2FnZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGlzTmlsLFxuICAgICAgKSxcbiAgICB9LFxuICApXG5cbiAgaWYgKG9wdGlvbnMuY29uZmlnUGF0aCkge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLmNvbmZpZ1BhdGgpXG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlQXN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKVxuICAgIGNvbnN0IGNvbmZpZ0RhdGEgPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpXG4gICAgY29uZmlnRGF0YS5iaW5hcnlOYW1lID0gb3B0aW9ucy5iaW5hcnlOYW1lXG4gICAgY29uZmlnRGF0YS5wYWNrYWdlTmFtZSA9IG9wdGlvbnMucGFja2FnZU5hbWVcbiAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWdEYXRhLCBudWxsLCAyKSlcbiAgfVxuXG4gIGF3YWl0IHdyaXRlRmlsZUFzeW5jKFxuICAgIHBhY2thZ2VKc29uUGF0aCxcbiAgICBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbkRhdGEsIG51bGwsIDIpLFxuICApXG5cbiAgY29uc3QgdG9tbENvbnRlbnQgPSBhd2FpdCByZWFkRmlsZUFzeW5jKGNhcmdvVG9tbFBhdGgsICd1dGY4JylcbiAgY29uc3QgY2FyZ29Ub21sID0gcGFyc2VUb21sKHRvbWxDb250ZW50KSBhcyBhbnlcblxuICAvLyBVcGRhdGUgdGhlIHBhY2thZ2UgbmFtZVxuICBpZiAoY2FyZ29Ub21sLnBhY2thZ2UgJiYgb3B0aW9ucy5iaW5hcnlOYW1lKSB7XG4gICAgLy8gU2FuaXRpemUgdGhlIGJpbmFyeSBuYW1lIGZvciBSdXN0IHBhY2thZ2UgbmFtaW5nIGNvbnZlbnRpb25zXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IG9wdGlvbnMuYmluYXJ5TmFtZVxuICAgICAgLnJlcGxhY2UoJ0AnLCAnJylcbiAgICAgIC5yZXBsYWNlKCcvJywgJ18nKVxuICAgICAgLnJlcGxhY2UoLy0vZywgJ18nKVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICBjYXJnb1RvbWwucGFja2FnZS5uYW1lID0gc2FuaXRpemVkTmFtZVxuICB9XG5cbiAgLy8gU3RyaW5naWZ5IHRoZSB1cGRhdGVkIFRPTUxcbiAgY29uc3QgdXBkYXRlZFRvbWxDb250ZW50ID0gc3RyaW5naWZ5VG9tbChjYXJnb1RvbWwpXG5cbiAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoY2FyZ29Ub21sUGF0aCwgdXBkYXRlZFRvbWxDb250ZW50KVxuICBpZiAob2xkTmFtZSAhPT0gb3B0aW9ucy5iaW5hcnlOYW1lKSB7XG4gICAgY29uc3QgZ2l0aHViQWN0aW9uc1BhdGggPSBhd2FpdCBmaW5kVXAoJy5naXRodWInLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgdHlwZTogJ2RpcmVjdG9yeScsXG4gICAgfSlcbiAgICBpZiAoZ2l0aHViQWN0aW9uc1BhdGgpIHtcbiAgICAgIGNvbnN0IGdpdGh1YkFjdGlvbnNDSVltbFBhdGggPSBqb2luKFxuICAgICAgICBnaXRodWJBY3Rpb25zUGF0aCxcbiAgICAgICAgJ3dvcmtmbG93cycsXG4gICAgICAgICdDSS55bWwnLFxuICAgICAgKVxuICAgICAgaWYgKGV4aXN0c1N5bmMoZ2l0aHViQWN0aW9uc0NJWW1sUGF0aCkpIHtcbiAgICAgICAgY29uc3QgZ2l0aHViQWN0aW9uc0NvbnRlbnQgPSBhd2FpdCByZWFkRmlsZUFzeW5jKFxuICAgICAgICAgIGdpdGh1YkFjdGlvbnNDSVltbFBhdGgsXG4gICAgICAgICAgJ3V0ZjgnLFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGdpdGh1YkFjdGlvbnNEYXRhID0geWFtbFBhcnNlKGdpdGh1YkFjdGlvbnNDb250ZW50KSBhcyBhbnlcbiAgICAgICAgaWYgKGdpdGh1YkFjdGlvbnNEYXRhLmVudj8uQVBQX05BTUUpIHtcbiAgICAgICAgICBnaXRodWJBY3Rpb25zRGF0YS5lbnYuQVBQX05BTUUgPSBvcHRpb25zLmJpbmFyeU5hbWVcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGVBc3luYyhcbiAgICAgICAgICAgIGdpdGh1YkFjdGlvbnNDSVltbFBhdGgsXG4gICAgICAgICAgICB5YW1sU3RyaW5naWZ5KGdpdGh1YkFjdGlvbnNEYXRhLCB7XG4gICAgICAgICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgICAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgICAgICAgICAgc29ydEtleXM6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG9sZFdhc2lCcm93c2VyQmluZGluZ1BhdGggPSBqb2luKFxuICAgICAgb3B0aW9ucy5jd2QsXG4gICAgICBgJHtvbGROYW1lfS53YXNpLWJyb3dzZXIuanNgLFxuICAgIClcbiAgICBpZiAoZXhpc3RzU3luYyhvbGRXYXNpQnJvd3NlckJpbmRpbmdQYXRoKSkge1xuICAgICAgYXdhaXQgcmVuYW1lKFxuICAgICAgICBvbGRXYXNpQnJvd3NlckJpbmRpbmdQYXRoLFxuICAgICAgICBqb2luKG9wdGlvbnMuY3dkLCBgJHtvcHRpb25zLmJpbmFyeU5hbWV9Lndhc2ktYnJvd3Nlci5qc2ApLFxuICAgICAgKVxuICAgIH1cbiAgICBjb25zdCBvbGRXYXNpQmluZGluZ1BhdGggPSBqb2luKG9wdGlvbnMuY3dkLCBgJHtvbGROYW1lfS53YXNpLmNqc2ApXG4gICAgaWYgKGV4aXN0c1N5bmMob2xkV2FzaUJpbmRpbmdQYXRoKSkge1xuICAgICAgYXdhaXQgcmVuYW1lKFxuICAgICAgICBvbGRXYXNpQmluZGluZ1BhdGgsXG4gICAgICAgIGpvaW4ob3B0aW9ucy5jd2QsIGAke29wdGlvbnMuYmluYXJ5TmFtZX0ud2FzaS5janNgKSxcbiAgICAgIClcbiAgICB9XG4gICAgY29uc3QgZ2l0QXR0cmlidXRlc1BhdGggPSBqb2luKG9wdGlvbnMuY3dkLCAnLmdpdGF0dHJpYnV0ZXMnKVxuICAgIGlmIChleGlzdHNTeW5jKGdpdEF0dHJpYnV0ZXNQYXRoKSkge1xuICAgICAgY29uc3QgZ2l0QXR0cmlidXRlc0NvbnRlbnQgPSBhd2FpdCByZWFkRmlsZUFzeW5jKFxuICAgICAgICBnaXRBdHRyaWJ1dGVzUGF0aCxcbiAgICAgICAgJ3V0ZjgnLFxuICAgICAgKVxuICAgICAgY29uc3QgZ2l0QXR0cmlidXRlc0RhdGEgPSBnaXRBdHRyaWJ1dGVzQ29udGVudFxuICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgICByZXR1cm4gbGluZVxuICAgICAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgICAgIGAke29sZE5hbWV9Lndhc2ktYnJvd3Nlci5qc2AsXG4gICAgICAgICAgICAgIGAke29wdGlvbnMuYmluYXJ5TmFtZX0ud2FzaS1icm93c2VyLmpzYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZXBsYWNlKGAke29sZE5hbWV9Lndhc2kuY2pzYCwgYCR7b3B0aW9ucy5iaW5hcnlOYW1lfS53YXNpLmNqc2ApXG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgICAgYXdhaXQgd3JpdGVGaWxlQXN5bmMoZ2l0QXR0cmlidXRlc1BhdGgsIGdpdEF0dHJpYnV0ZXNEYXRhKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZXhlYywgZXhlY1N5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuXG5pbXBvcnQgeyBsb2FkIGFzIHlhbWxMb2FkLCBkdW1wIGFzIHlhbWxEdW1wIH0gZnJvbSAnanMteWFtbCdcblxuaW1wb3J0IHtcbiAgYXBwbHlEZWZhdWx0TmV3T3B0aW9ucyxcbiAgTmV3T3B0aW9ucyBhcyBSYXdOZXdPcHRpb25zLFxufSBmcm9tICcuLi9kZWYvbmV3LmpzJ1xuaW1wb3J0IHtcbiAgQVZBSUxBQkxFX1RBUkdFVFMsXG4gIGRlYnVnRmFjdG9yeSxcbiAgREVGQVVMVF9UQVJHRVRTLFxuICBta2RpckFzeW5jLFxuICByZWFkZGlyQXN5bmMsXG4gIHN0YXRBc3luYyxcbiAgU3VwcG9ydGVkUGFja2FnZU1hbmFnZXIsXG59IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuaW1wb3J0IHsgbmFwaUVuZ2luZVJlcXVpcmVtZW50IH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcydcbmltcG9ydCB7IHJlbmFtZVByb2plY3QgfSBmcm9tICcuL3JlbmFtZS5qcydcblxuLy8gVGVtcGxhdGUgaW1wb3J0cyByZW1vdmVkIGFzIHdlJ3JlIG5vdyB1c2luZyBleHRlcm5hbCB0ZW1wbGF0ZXNcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0ZhY3RvcnkoJ25ldycpXG5cbnR5cGUgTmV3T3B0aW9ucyA9IFJlcXVpcmVkPFJhd05ld09wdGlvbnM+XG5cbmNvbnN0IFRFTVBMQVRFX1JFUE9TID0ge1xuICB5YXJuOiAnaHR0cHM6Ly9naXRodWIuY29tL25hcGktcnMvcGFja2FnZS10ZW1wbGF0ZScsXG4gIHBucG06ICdodHRwczovL2dpdGh1Yi5jb20vbmFwaS1ycy9wYWNrYWdlLXRlbXBsYXRlLXBucG0nLFxufSBhcyBjb25zdFxuXG5hc3luYyBmdW5jdGlvbiBjaGVja0dpdENvbW1hbmQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGNwID0gZXhlYygnZ2l0IC0tdmVyc2lvbicpXG4gICAgICBjcC5vbignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICB9KVxuICAgICAgY3Aub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgcmV0dXJuIHRydWVcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ2FjaGVEaXIoXG4gIHBhY2thZ2VNYW5hZ2VyOiBTdXBwb3J0ZWRQYWNrYWdlTWFuYWdlcixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlRGlyID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5uYXBpLXJzJywgJ3RlbXBsYXRlJywgcGFja2FnZU1hbmFnZXIpXG4gIGF3YWl0IG1rZGlyQXN5bmMoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gIHJldHVybiBjYWNoZURpclxufVxuXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZFRlbXBsYXRlKFxuICBwYWNrYWdlTWFuYWdlcjogU3VwcG9ydGVkUGFja2FnZU1hbmFnZXIsXG4gIGNhY2hlRGlyOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb1VybCA9IFRFTVBMQVRFX1JFUE9TW3BhY2thZ2VNYW5hZ2VyXVxuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4oY2FjaGVEaXIsICdyZXBvJylcblxuICBpZiAoZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgZGVidWcoYFRlbXBsYXRlIGNhY2hlIGZvdW5kIGF0ICR7dGVtcGxhdGVQYXRofSwgdXBkYXRpbmcuLi5gKVxuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBsYXRlc3QgY2hhbmdlcyBhbmQgcmVzZXQgdG8gcmVtb3RlXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNwID0gZXhlYygnZ2l0IGZldGNoIG9yaWdpbicsIHsgY3dkOiB0ZW1wbGF0ZVBhdGggfSlcbiAgICAgICAgY3Aub24oJ2Vycm9yJywgcmVqZWN0KVxuICAgICAgICBjcC5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGZldGNoIGxhdGVzdCBjaGFuZ2VzLCBnaXQgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICBleGVjU3luYygnZ2l0IHJlc2V0IC0taGFyZCBvcmlnaW4vbWFpbicsIHtcbiAgICAgICAgY3dkOiB0ZW1wbGF0ZVBhdGgsXG4gICAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICAgIH0pXG4gICAgICBkZWJ1ZygnVGVtcGxhdGUgdXBkYXRlZCBzdWNjZXNzZnVsbHknKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBkZWJ1ZyhgRmFpbGVkIHRvIHVwZGF0ZSB0ZW1wbGF0ZTogJHtlcnJvcn1gKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gdXBkYXRlIHRlbXBsYXRlIGZyb20gJHtyZXBvVXJsfTogJHtlcnJvcn1gKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWJ1ZyhgQ2xvbmluZyB0ZW1wbGF0ZSBmcm9tICR7cmVwb1VybH0uLi5gKVxuICAgIHRyeSB7XG4gICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7cmVwb1VybH0gcmVwb2AsIHsgY3dkOiBjYWNoZURpciwgc3RkaW86ICdpbmhlcml0JyB9KVxuICAgICAgZGVidWcoJ1RlbXBsYXRlIGNsb25lZCBzdWNjZXNzZnVsbHknKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjbG9uZSB0ZW1wbGF0ZSBmcm9tICR7cmVwb1VybH06ICR7ZXJyb3J9YClcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weURpcmVjdG9yeShcbiAgc3JjOiBzdHJpbmcsXG4gIGRlc3Q6IHN0cmluZyxcbiAgaW5jbHVkZVdhc2lCaW5kaW5nczogYm9vbGVhbixcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2RpckFzeW5jKGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHNyYywgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihzcmMsIGVudHJ5Lm5hbWUpXG4gICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdCwgZW50cnkubmFtZSlcblxuICAgIC8vIFNraXAgLmdpdCBkaXJlY3RvcnlcbiAgICBpZiAoZW50cnkubmFtZSA9PT0gJy5naXQnKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCBjb3B5RGlyZWN0b3J5KHNyY1BhdGgsIGRlc3RQYXRoLCBpbmNsdWRlV2FzaUJpbmRpbmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgICFpbmNsdWRlV2FzaUJpbmRpbmdzICYmXG4gICAgICAgIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcud2FzaS1icm93c2VyLmpzJykgfHxcbiAgICAgICAgICBlbnRyeS5uYW1lLmVuZHNXaXRoKCcud2FzaS5janMnKSB8fFxuICAgICAgICAgIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJ3dhc2ktd29ya2VyLmJyb3dzZXIubWpzICcpIHx8XG4gICAgICAgICAgZW50cnkubmFtZS5lbmRzV2l0aCgnd2FzaS13b3JrZXIubWpzJykgfHxcbiAgICAgICAgICBlbnRyeS5uYW1lLmVuZHNXaXRoKCdicm93c2VyLmpzJykpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKHNyY1BhdGgsIGRlc3RQYXRoKVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaWx0ZXJUYXJnZXRzSW5QYWNrYWdlSnNvbihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZW5hYmxlZFRhcmdldHM6IHN0cmluZ1tdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04JylcbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGNvbnRlbnQpXG5cbiAgLy8gRmlsdGVyIG5hcGkudGFyZ2V0c1xuICBpZiAocGFja2FnZUpzb24ubmFwaT8udGFyZ2V0cykge1xuICAgIHBhY2thZ2VKc29uLm5hcGkudGFyZ2V0cyA9IHBhY2thZ2VKc29uLm5hcGkudGFyZ2V0cy5maWx0ZXIoXG4gICAgICAodGFyZ2V0OiBzdHJpbmcpID0+IGVuYWJsZWRUYXJnZXRzLmluY2x1ZGVzKHRhcmdldCksXG4gICAgKVxuICB9XG5cbiAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgMikgKyAnXFxuJylcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmlsdGVyVGFyZ2V0c0luR2l0aHViQWN0aW9ucyhcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZW5hYmxlZFRhcmdldHM6IHN0cmluZ1tdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04JylcbiAgY29uc3QgeWFtbCA9IHlhbWxMb2FkKGNvbnRlbnQpIGFzIGFueVxuXG4gIGNvbnN0IG1hY09TQW5kV2luZG93c1RhcmdldHMgPSBuZXcgU2V0KFtcbiAgICAneDg2XzY0LXBjLXdpbmRvd3MtbXN2YycsXG4gICAgJ2FhcmNoNjQtcGMtd2luZG93cy1tc3ZjJyxcbiAgICAneDg2XzY0LWFwcGxlLWRhcndpbicsXG4gIF0pXG5cbiAgY29uc3QgbGludXhUYXJnZXRzID0gbmV3IFNldChbXG4gICAgJ3g4Nl82NC11bmtub3duLWxpbnV4LWdudScsXG4gICAgJ3g4Nl82NC11bmtub3duLWxpbnV4LW11c2wnLFxuICAgICdhYXJjaDY0LXVua25vd24tbGludXgtZ251JyxcbiAgICAnYWFyY2g2NC11bmtub3duLWxpbnV4LW11c2wnLFxuICAgICdhcm12Ny11bmtub3duLWxpbnV4LWdudWVhYmloZicsXG4gICAgJ2FybXY3LXVua25vd24tbGludXgtbXVzbGVhYmloZicsXG4gICAgJ3Jpc2N2NjRnYy11bmtub3duLWxpbnV4LWdudScsXG4gICAgJ3Bvd2VycGM2NGxlLXVua25vd24tbGludXgtZ251JyxcbiAgICAnczM5MHgtdW5rbm93bi1saW51eC1nbnUnLFxuICAgICdhYXJjaDY0LWxpbnV4LWFuZHJvaWQnLFxuICAgICdhcm12Ny1saW51eC1hbmRyb2lkZWFiaScsXG4gIF0pXG5cbiAgLy8gQ2hlY2sgaWYgYW55IExpbnV4IHRhcmdldHMgYXJlIGVuYWJsZWRcbiAgY29uc3QgaGFzTGludXhUYXJnZXRzID0gZW5hYmxlZFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PlxuICAgIGxpbnV4VGFyZ2V0cy5oYXModGFyZ2V0KSxcbiAgKVxuXG4gIC8vIEZpbHRlciB0aGUgbWF0cml4IGNvbmZpZ3VyYXRpb25zIGluIHRoZSBidWlsZCBqb2JcbiAgaWYgKHlhbWw/LmpvYnM/LmJ1aWxkPy5zdHJhdGVneT8ubWF0cml4Py5zZXR0aW5ncykge1xuICAgIHlhbWwuam9icy5idWlsZC5zdHJhdGVneS5tYXRyaXguc2V0dGluZ3MgPVxuICAgICAgeWFtbC5qb2JzLmJ1aWxkLnN0cmF0ZWd5Lm1hdHJpeC5zZXR0aW5ncy5maWx0ZXIoKHNldHRpbmc6IGFueSkgPT4ge1xuICAgICAgICBpZiAoc2V0dGluZy50YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gZW5hYmxlZFRhcmdldHMuaW5jbHVkZXMoc2V0dGluZy50YXJnZXQpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gIH1cblxuICBjb25zdCBqb2JzVG9SZW1vdmU6IHN0cmluZ1tdID0gW11cblxuICBpZiAoZW5hYmxlZFRhcmdldHMuZXZlcnkoKHRhcmdldCkgPT4gIW1hY09TQW5kV2luZG93c1RhcmdldHMuaGFzKHRhcmdldCkpKSB7XG4gICAgam9ic1RvUmVtb3ZlLnB1c2goJ3Rlc3QtbWFjT1Mtd2luZG93cy1iaW5kaW5nJylcbiAgfSBlbHNlIHtcbiAgICAvLyBGaWx0ZXIgdGhlIG1hdHJpeCBjb25maWd1cmF0aW9ucyBpbiB0aGUgdGVzdC1tYWNPUy13aW5kb3dzLWJpbmRpbmcgam9iXG4gICAgaWYgKFxuICAgICAgeWFtbD8uam9icz8uWyd0ZXN0LW1hY09TLXdpbmRvd3MtYmluZGluZyddPy5zdHJhdGVneT8ubWF0cml4Py5zZXR0aW5nc1xuICAgICkge1xuICAgICAgeWFtbC5qb2JzWyd0ZXN0LW1hY09TLXdpbmRvd3MtYmluZGluZyddLnN0cmF0ZWd5Lm1hdHJpeC5zZXR0aW5ncyA9XG4gICAgICAgIHlhbWwuam9ic1sndGVzdC1tYWNPUy13aW5kb3dzLWJpbmRpbmcnXS5zdHJhdGVneS5tYXRyaXguc2V0dGluZ3MuZmlsdGVyKFxuICAgICAgICAgIChzZXR0aW5nOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLnRhcmdldCkge1xuICAgICAgICAgICAgICByZXR1cm4gZW5hYmxlZFRhcmdldHMuaW5jbHVkZXMoc2V0dGluZy50YXJnZXQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICB9XG4gIH1cblxuICAvLyBJZiBubyBMaW51eCB0YXJnZXRzIGFyZSBlbmFibGVkLCByZW1vdmUgTGludXgtc3BlY2lmaWMgam9ic1xuICBpZiAoIWhhc0xpbnV4VGFyZ2V0cykge1xuICAgIC8vIFJlbW92ZSB0ZXN0LWxpbnV4LWJpbmRpbmcgam9iXG4gICAgaWYgKHlhbWw/LmpvYnM/LlsndGVzdC1saW51eC1iaW5kaW5nJ10pIHtcbiAgICAgIGpvYnNUb1JlbW92ZS5wdXNoKCd0ZXN0LWxpbnV4LWJpbmRpbmcnKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBGaWx0ZXIgdGhlIG1hdHJpeCBjb25maWd1cmF0aW9ucyBpbiB0aGUgdGVzdC1saW51eC14NjQtZ251LWJpbmRpbmcgam9iXG4gICAgaWYgKHlhbWw/LmpvYnM/LlsndGVzdC1saW51eC1iaW5kaW5nJ10/LnN0cmF0ZWd5Py5tYXRyaXg/LnRhcmdldCkge1xuICAgICAgeWFtbC5qb2JzWyd0ZXN0LWxpbnV4LWJpbmRpbmcnXS5zdHJhdGVneS5tYXRyaXgudGFyZ2V0ID0geWFtbC5qb2JzW1xuICAgICAgICAndGVzdC1saW51eC1iaW5kaW5nJ1xuICAgICAgXS5zdHJhdGVneS5tYXRyaXgudGFyZ2V0LmZpbHRlcigodGFyZ2V0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIHJldHVybiBlbmFibGVkVGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKCFlbmFibGVkVGFyZ2V0cy5pbmNsdWRlcygnd2FzbTMyLXdhc2lwMS10aHJlYWRzJykpIHtcbiAgICBqb2JzVG9SZW1vdmUucHVzaCgndGVzdC13YXNpJylcbiAgfVxuXG4gIGlmICghZW5hYmxlZFRhcmdldHMuaW5jbHVkZXMoJ3g4Nl82NC11bmtub3duLWZyZWVic2QnKSkge1xuICAgIGpvYnNUb1JlbW92ZS5wdXNoKCdidWlsZC1mcmVlYnNkJylcbiAgfVxuXG4gIC8vIEZpbHRlciBvdGhlciB0ZXN0IGpvYnMgYmFzZWQgb24gdGFyZ2V0XG4gIGZvciAoY29uc3QgW2pvYk5hbWUsIGpvYkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoeWFtbC5qb2JzIHx8IHt9KSkge1xuICAgIGlmIChcbiAgICAgIGpvYk5hbWUuc3RhcnRzV2l0aCgndGVzdC0nKSAmJlxuICAgICAgam9iTmFtZSAhPT0gJ3Rlc3QtbWFjT1Mtd2luZG93cy1iaW5kaW5nJyAmJlxuICAgICAgam9iTmFtZSAhPT0gJ3Rlc3QtbGludXgteDY0LWdudS1iaW5kaW5nJ1xuICAgICkge1xuICAgICAgLy8gRXh0cmFjdCB0YXJnZXQgZnJvbSBqb2IgbmFtZSBvciBjb25maWdcbiAgICAgIGNvbnN0IGpvYiA9IGpvYkNvbmZpZyBhcyBhbnlcbiAgICAgIGlmIChqb2Iuc3RyYXRlZ3k/Lm1hdHJpeD8uc2V0dGluZ3M/LlswXT8udGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGpvYi5zdHJhdGVneS5tYXRyaXguc2V0dGluZ3NbMF0udGFyZ2V0XG4gICAgICAgIGlmICghZW5hYmxlZFRhcmdldHMuaW5jbHVkZXModGFyZ2V0KSkge1xuICAgICAgICAgIGpvYnNUb1JlbW92ZS5wdXNoKGpvYk5hbWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgam9icyBmb3IgZGlzYWJsZWQgdGFyZ2V0c1xuICBmb3IgKGNvbnN0IGpvYk5hbWUgb2Ygam9ic1RvUmVtb3ZlKSB7XG4gICAgZGVsZXRlIHlhbWwuam9ic1tqb2JOYW1lXVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoeWFtbC5qb2JzPy5wdWJsaXNoPy5uZWVkcykpIHtcbiAgICB5YW1sLmpvYnMucHVibGlzaC5uZWVkcyA9IHlhbWwuam9icy5wdWJsaXNoLm5lZWRzLmZpbHRlcihcbiAgICAgIChuZWVkOiBzdHJpbmcpID0+ICFqb2JzVG9SZW1vdmUuaW5jbHVkZXMobmVlZCksXG4gICAgKVxuICB9XG5cbiAgLy8gV3JpdGUgYmFjayB0aGUgZmlsdGVyZWQgWUFNTFxuICBjb25zdCB1cGRhdGVkWWFtbCA9IHlhbWxEdW1wKHlhbWwsIHtcbiAgICBsaW5lV2lkdGg6IC0xLFxuICAgIG5vUmVmczogdHJ1ZSxcbiAgICBzb3J0S2V5czogZmFsc2UsXG4gIH0pXG4gIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgdXBkYXRlZFlhbWwpXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NPcHRpb25zKG9wdGlvbnM6IFJhd05ld09wdGlvbnMpIHtcbiAgZGVidWcoJ1Byb2Nlc3Npbmcgb3B0aW9ucy4uLicpXG4gIGlmICghb3B0aW9ucy5wYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSB0aGUgcGF0aCBhcyB0aGUgYXJndW1lbnQnKVxuICB9XG4gIG9wdGlvbnMucGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvcHRpb25zLnBhdGgpXG4gIGRlYnVnKGBSZXNvbHZlZCB0YXJnZXQgcGF0aCB0bzogJHtvcHRpb25zLnBhdGh9YClcblxuICBpZiAoIW9wdGlvbnMubmFtZSkge1xuICAgIG9wdGlvbnMubmFtZSA9IHBhdGgucGFyc2Uob3B0aW9ucy5wYXRoKS5iYXNlXG4gICAgZGVidWcoYE5vIHByb2plY3QgbmFtZSBwcm92aWRlZCwgZml4IGl0IHRvIGRpciBuYW1lOiAke29wdGlvbnMubmFtZX1gKVxuICB9XG5cbiAgaWYgKCFvcHRpb25zLnRhcmdldHM/Lmxlbmd0aCkge1xuICAgIGlmIChvcHRpb25zLmVuYWJsZUFsbFRhcmdldHMpIHtcbiAgICAgIG9wdGlvbnMudGFyZ2V0cyA9IEFWQUlMQUJMRV9UQVJHRVRTLmNvbmNhdCgpXG4gICAgICBkZWJ1ZygnRW5hYmxlIGFsbCB0YXJnZXRzJylcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZW5hYmxlRGVmYXVsdFRhcmdldHMpIHtcbiAgICAgIG9wdGlvbnMudGFyZ2V0cyA9IERFRkFVTFRfVEFSR0VUUy5jb25jYXQoKVxuICAgICAgZGVidWcoJ0VuYWJsZSBkZWZhdWx0IHRhcmdldHMnKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0IGxlYXN0IG9uZSB0YXJnZXQgbXVzdCBiZSBlbmFibGVkJylcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIG9wdGlvbnMudGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldCA9PT0gJ3dhc20zMi13YXNpLXByZXZpZXcxLXRocmVhZHMnKVxuICApIHtcbiAgICBjb25zdCBvdXQgPSBleGVjU3luYyhgcnVzdHVwIHRhcmdldCBsaXN0YCwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KVxuICAgIGlmIChvdXQuaW5jbHVkZXMoJ3dhc20zMi13YXNpcDEtdGhyZWFkcycpKSB7XG4gICAgICBvcHRpb25zLnRhcmdldHMgPSBvcHRpb25zLnRhcmdldHMubWFwKCh0YXJnZXQpID0+XG4gICAgICAgIHRhcmdldCA9PT0gJ3dhc20zMi13YXNpLXByZXZpZXcxLXRocmVhZHMnXG4gICAgICAgICAgPyAnd2FzbTMyLXdhc2lwMS10aHJlYWRzJ1xuICAgICAgICAgIDogdGFyZ2V0LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcHBseURlZmF1bHROZXdPcHRpb25zKG9wdGlvbnMpIGFzIE5ld09wdGlvbnNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5ld1Byb2plY3QodXNlck9wdGlvbnM6IFJhd05ld09wdGlvbnMpIHtcbiAgZGVidWcoJ1dpbGwgY3JlYXRlIG5hcGktcnMgcHJvamVjdCB3aXRoIGdpdmVuIG9wdGlvbnM6JylcbiAgZGVidWcodXNlck9wdGlvbnMpXG5cbiAgY29uc3Qgb3B0aW9ucyA9IHByb2Nlc3NPcHRpb25zKHVzZXJPcHRpb25zKVxuXG4gIGRlYnVnKCdUYXJnZXRzIHRvIGJlIGVuYWJsZWQ6JylcbiAgZGVidWcob3B0aW9ucy50YXJnZXRzKVxuXG4gIC8vIENoZWNrIGlmIGdpdCBpcyBhdmFpbGFibGVcbiAgaWYgKCEoYXdhaXQgY2hlY2tHaXRDb21tYW5kKCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0dpdCBpcyBub3QgaW5zdGFsbGVkIG9yIG5vdCBhdmFpbGFibGUgaW4gUEFUSC4gUGxlYXNlIGluc3RhbGwgR2l0IHRvIGNvbnRpbnVlLicsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBvcHRpb25zLnBhY2thZ2VNYW5hZ2VyIGFzIFN1cHBvcnRlZFBhY2thZ2VNYW5hZ2VyXG5cbiAgLy8gRW5zdXJlIHRhcmdldCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBpcyBlbXB0eVxuICBhd2FpdCBlbnN1cmVQYXRoKG9wdGlvbnMucGF0aCwgb3B0aW9ucy5kcnlSdW4pXG5cbiAgaWYgKCFvcHRpb25zLmRyeVJ1bikge1xuICAgIHRyeSB7XG4gICAgICAvLyBEb3dubG9hZCBvciB1cGRhdGUgdGVtcGxhdGVcbiAgICAgIGNvbnN0IGNhY2hlRGlyID0gYXdhaXQgZW5zdXJlQ2FjaGVEaXIocGFja2FnZU1hbmFnZXIpXG4gICAgICBhd2FpdCBkb3dubG9hZFRlbXBsYXRlKHBhY2thZ2VNYW5hZ2VyLCBjYWNoZURpcilcblxuICAgICAgLy8gQ29weSB0ZW1wbGF0ZSBmaWxlcyB0byB0YXJnZXQgZGlyZWN0b3J5XG4gICAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4oY2FjaGVEaXIsICdyZXBvJylcbiAgICAgIGF3YWl0IGNvcHlEaXJlY3RvcnkoXG4gICAgICAgIHRlbXBsYXRlUGF0aCxcbiAgICAgICAgb3B0aW9ucy5wYXRoLFxuICAgICAgICBvcHRpb25zLnRhcmdldHMuaW5jbHVkZXMoJ3dhc20zMi13YXNpcDEtdGhyZWFkcycpLFxuICAgICAgKVxuXG4gICAgICAvLyBSZW5hbWUgcHJvamVjdCB1c2luZyB0aGUgcmVuYW1lIEFQSVxuICAgICAgYXdhaXQgcmVuYW1lUHJvamVjdCh7XG4gICAgICAgIGN3ZDogb3B0aW9ucy5wYXRoLFxuICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgIGJpbmFyeU5hbWU6IGdldEJpbmFyeU5hbWUob3B0aW9ucy5uYW1lKSxcbiAgICAgIH0pXG5cbiAgICAgIC8vIEZpbHRlciB0YXJnZXRzIGluIHBhY2thZ2UuanNvblxuICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKG9wdGlvbnMucGF0aCwgJ3BhY2thZ2UuanNvbicpXG4gICAgICBpZiAoZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICAgIGF3YWl0IGZpbHRlclRhcmdldHNJblBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCwgb3B0aW9ucy50YXJnZXRzKVxuICAgICAgfVxuXG4gICAgICAvLyBGaWx0ZXIgdGFyZ2V0cyBpbiBHaXRIdWIgQWN0aW9ucyBDSVxuICAgICAgY29uc3QgY2lQYXRoID0gcGF0aC5qb2luKG9wdGlvbnMucGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJywgJ0NJLnltbCcpXG4gICAgICBpZiAoZXhpc3RzU3luYyhjaVBhdGgpICYmIG9wdGlvbnMuZW5hYmxlR2l0aHViQWN0aW9ucykge1xuICAgICAgICBhd2FpdCBmaWx0ZXJUYXJnZXRzSW5HaXRodWJBY3Rpb25zKGNpUGF0aCwgb3B0aW9ucy50YXJnZXRzKVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIW9wdGlvbnMuZW5hYmxlR2l0aHViQWN0aW9ucyAmJlxuICAgICAgICBleGlzdHNTeW5jKHBhdGguam9pbihvcHRpb25zLnBhdGgsICcuZ2l0aHViJykpXG4gICAgICApIHtcbiAgICAgICAgLy8gUmVtb3ZlIC5naXRodWIgZGlyZWN0b3J5IGlmIEdpdEh1YiBBY3Rpb25zIGlzIG5vdCBlbmFibGVkXG4gICAgICAgIGF3YWl0IGZzLnJtKHBhdGguam9pbihvcHRpb25zLnBhdGgsICcuZ2l0aHViJyksIHtcbiAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBwYWNrYWdlLmpzb24gd2l0aCBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25zXG4gICAgICBjb25zdCBwa2dKc29uQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04JylcbiAgICAgIGNvbnN0IHBrZ0pzb24gPSBKU09OLnBhcnNlKHBrZ0pzb25Db250ZW50KVxuXG4gICAgICAvLyBVcGRhdGUgZW5naW5lIHJlcXVpcmVtZW50XG4gICAgICBpZiAoIXBrZ0pzb24uZW5naW5lcykge1xuICAgICAgICBwa2dKc29uLmVuZ2luZXMgPSB7fVxuICAgICAgfVxuICAgICAgcGtnSnNvbi5lbmdpbmVzLm5vZGUgPSBuYXBpRW5naW5lUmVxdWlyZW1lbnQob3B0aW9ucy5taW5Ob2RlQXBpVmVyc2lvbilcblxuICAgICAgLy8gVXBkYXRlIGxpY2Vuc2UgaWYgZGlmZmVyZW50IGZyb20gdGVtcGxhdGVcbiAgICAgIGlmIChvcHRpb25zLmxpY2Vuc2UgJiYgcGtnSnNvbi5saWNlbnNlICE9PSBvcHRpb25zLmxpY2Vuc2UpIHtcbiAgICAgICAgcGtnSnNvbi5saWNlbnNlID0gb3B0aW9ucy5saWNlbnNlXG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0ZXN0IGZyYW1ld29yayBpZiBuZWVkZWRcbiAgICAgIGlmIChvcHRpb25zLnRlc3RGcmFtZXdvcmsgIT09ICdhdmEnKSB7XG4gICAgICAgIC8vIFRoaXMgd291bGQgcmVxdWlyZSBtb3JlIGNvbXBsZXggbG9naWMgdG8gdXBkYXRlIHRlc3Qgc2NyaXB0cyBhbmQgZGVwZW5kZW5jaWVzXG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGBUZXN0IGZyYW1ld29yayAke29wdGlvbnMudGVzdEZyYW1ld29ya30gcmVxdWVzdGVkIGJ1dCBub3QgeWV0IGltcGxlbWVudGVkYCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgICAgIHBhY2thZ2VKc29uUGF0aCxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocGtnSnNvbiwgbnVsbCwgMikgKyAnXFxuJyxcbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHByb2plY3Q6ICR7ZXJyb3J9YClcbiAgICB9XG4gIH1cblxuICBkZWJ1ZyhgUHJvamVjdCBjcmVhdGVkIGF0OiAke29wdGlvbnMucGF0aH1gKVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVQYXRoKHBhdGg6IHN0cmluZywgZHJ5UnVuID0gZmFsc2UpIHtcbiAgY29uc3Qgc3RhdCA9IGF3YWl0IHN0YXRBc3luYyhwYXRoLCB7fSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKVxuXG4gIC8vIGZpbGUgZGVzY3JpcHRvciBleGlzdHNcbiAgaWYgKHN0YXQpIHtcbiAgICBpZiAoc3RhdC5pc0ZpbGUoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUGF0aCAke3BhdGh9IGZvciBjcmVhdGluZyBuZXcgbmFwaS1ycyBwcm9qZWN0IGFscmVhZHkgZXhpc3RzIGFuZCBpdCdzIG5vdCBhIGRpcmVjdG9yeS5gLFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlYWRkaXJBc3luYyhwYXRoKVxuICAgICAgaWYgKGZpbGVzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhdGggJHtwYXRofSBmb3IgY3JlYXRpbmcgbmV3IG5hcGktcnMgcHJvamVjdCBhbHJlYWR5IGV4aXN0cyBhbmQgaXQncyBub3QgZW1wdHkuYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghZHJ5UnVuKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRlYnVnKGBUcnkgdG8gY3JlYXRlIHRhcmdldCBkaXJlY3Rvcnk6ICR7cGF0aH1gKVxuICAgICAgaWYgKCFkcnlSdW4pIHtcbiAgICAgICAgYXdhaXQgbWtkaXJBc3luYyhwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSB0YXJnZXQgZGlyZWN0b3J5OiAke3BhdGh9YCwge1xuICAgICAgICBjYXVzZTogZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEJpbmFyeU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWUuc3BsaXQoJy8nKS5wb3AoKSFcbn1cblxuZXhwb3J0IHsgTmV3T3B0aW9ucyB9XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCB7IGlucHV0LCBzZWxlY3QsIGNoZWNrYm94LCBjb25maXJtIH0gZnJvbSAnQGlucXVpcmVyL3Byb21wdHMnXG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICdjbGlwYW5pb24nXG5cbmltcG9ydCB7IG5ld1Byb2plY3QgfSBmcm9tICcuLi9hcGkvbmV3LmpzJ1xuaW1wb3J0IHsgQmFzZU5ld0NvbW1hbmQgfSBmcm9tICcuLi9kZWYvbmV3LmpzJ1xuaW1wb3J0IHtcbiAgQVZBSUxBQkxFX1RBUkdFVFMsXG4gIGRlYnVnRmFjdG9yeSxcbiAgREVGQVVMVF9UQVJHRVRTLFxuICBUYXJnZXRUcmlwbGUsXG59IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuaW1wb3J0IHsgbmFwaUVuZ2luZVJlcXVpcmVtZW50IH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcydcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0ZhY3RvcnkoJ25ldycpXG5cbmV4cG9ydCBjbGFzcyBOZXdDb21tYW5kIGV4dGVuZHMgQmFzZU5ld0NvbW1hbmQge1xuICBpbnRlcmFjdGl2ZSA9IE9wdGlvbi5Cb29sZWFuKCctLWludGVyYWN0aXZlLC1pJywgdHJ1ZSwge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0FzayBwcm9qZWN0IGJhc2ljIGluZm9ybWF0aW9uIGludGVyYWN0aXZlbHkgd2l0aG91dCBqdXN0IHVzaW5nIHRoZSBkZWZhdWx0LicsXG4gIH0pXG5cbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuZmV0Y2hPcHRpb25zKClcbiAgICAgIGF3YWl0IG5ld1Byb2plY3Qob3B0aW9ucylcbiAgICAgIHJldHVybiAwXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGVidWcoJ0ZhaWxlZCB0byBjcmVhdGUgbmV3IHByb2plY3QnKVxuICAgICAgZGVidWcuZXJyb3IoZSlcbiAgICAgIHJldHVybiAxXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE9wdGlvbnMoKSB7XG4gICAgY29uc3QgY21kT3B0aW9ucyA9IHN1cGVyLmdldE9wdGlvbnMoKVxuXG4gICAgaWYgKHRoaXMuaW50ZXJhY3RpdmUpIHtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGg6IHN0cmluZyA9IGNtZE9wdGlvbnMucGF0aFxuICAgICAgICA/IGNtZE9wdGlvbnMucGF0aFxuICAgICAgICA6IGF3YWl0IGlucXVpcmVyUHJvamVjdFBhdGgoKVxuICAgICAgY21kT3B0aW9ucy5wYXRoID0gdGFyZ2V0UGF0aFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY21kT3B0aW9ucyxcbiAgICAgICAgbmFtZTogYXdhaXQgdGhpcy5mZXRjaE5hbWUocGF0aC5wYXJzZSh0YXJnZXRQYXRoKS5iYXNlKSxcbiAgICAgICAgbWluTm9kZUFwaVZlcnNpb246IGF3YWl0IHRoaXMuZmV0Y2hOYXBpVmVyc2lvbigpLFxuICAgICAgICB0YXJnZXRzOiBhd2FpdCB0aGlzLmZldGNoVGFyZ2V0cygpLFxuICAgICAgICBsaWNlbnNlOiBhd2FpdCB0aGlzLmZldGNoTGljZW5zZSgpLFxuICAgICAgICBlbmFibGVUeXBlRGVmOiBhd2FpdCB0aGlzLmZldGNoVHlwZURlZigpLFxuICAgICAgICBlbmFibGVHaXRodWJBY3Rpb25zOiBhd2FpdCB0aGlzLmZldGNoR2l0aHViQWN0aW9ucygpLFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbWRPcHRpb25zXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoTmFtZShkZWZhdWx0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy4kJG5hbWUgPz9cbiAgICAgIGlucHV0KHtcbiAgICAgICAgbWVzc2FnZTogJ1BhY2thZ2UgbmFtZSAodGhlIG5hbWUgZmllbGQgaW4geW91ciBwYWNrYWdlLmpzb24gZmlsZSknLFxuICAgICAgICBkZWZhdWx0OiBkZWZhdWx0TmFtZSxcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaExpY2Vuc2UoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gaW5wdXQoe1xuICAgICAgbWVzc2FnZTogJ0xpY2Vuc2UgZm9yIG9wZW4tc291cmNlZCBwcm9qZWN0JyxcbiAgICAgIGRlZmF1bHQ6IHRoaXMubGljZW5zZSxcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE5hcGlWZXJzaW9uKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHNlbGVjdCh7XG4gICAgICBtZXNzYWdlOiAnTWluaW11bSBub2RlLWFwaSB2ZXJzaW9uICh3aXRoIG5vZGUgdmVyc2lvbiByZXF1aXJlbWVudCknLFxuICAgICAgbG9vcDogZmFsc2UsXG4gICAgICBjaG9pY2VzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiA4IH0sIChfLCBpKSA9PiAoe1xuICAgICAgICBuYW1lOiBgbmFwaSR7aSArIDF9ICgke25hcGlFbmdpbmVSZXF1aXJlbWVudChpICsgMSl9KWAsXG4gICAgICAgIHZhbHVlOiBpICsgMSxcbiAgICAgIH0pKSxcbiAgICAgIC8vIGNob2ljZSBpbmRleFxuICAgICAgZGVmYXVsdDogdGhpcy5taW5Ob2RlQXBpVmVyc2lvbiAtIDEsXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hUYXJnZXRzKCk6IFByb21pc2U8VGFyZ2V0VHJpcGxlW10+IHtcbiAgICBpZiAodGhpcy5lbmFibGVBbGxUYXJnZXRzKSB7XG4gICAgICByZXR1cm4gQVZBSUxBQkxFX1RBUkdFVFMuY29uY2F0KClcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgY2hlY2tib3goe1xuICAgICAgbG9vcDogZmFsc2UsXG4gICAgICBtZXNzYWdlOiAnQ2hvb3NlIHRhcmdldChzKSB5b3VyIGNyYXRlIHdpbGwgYmUgY29tcGlsZWQgdG8nLFxuICAgICAgY2hvaWNlczogQVZBSUxBQkxFX1RBUkdFVFMubWFwKCh0YXJnZXQpID0+ICh7XG4gICAgICAgIG5hbWU6IHRhcmdldCxcbiAgICAgICAgdmFsdWU6IHRhcmdldCxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBjaGVja2VkOiBERUZBVUxUX1RBUkdFVFMuaW5jbHVkZXModGFyZ2V0KSxcbiAgICAgIH0pKSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRhcmdldHNcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hUeXBlRGVmKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGVuYWJsZVR5cGVEZWYgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgIG1lc3NhZ2U6ICdFbmFibGUgdHlwZSBkZWZpbml0aW9uIGF1dG8tZ2VuZXJhdGlvbicsXG4gICAgICBkZWZhdWx0OiB0aGlzLmVuYWJsZVR5cGVEZWYsXG4gICAgfSlcblxuICAgIHJldHVybiBlbmFibGVUeXBlRGVmXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoR2l0aHViQWN0aW9ucygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBlbmFibGVHaXRodWJBY3Rpb25zID0gYXdhaXQgY29uZmlybSh7XG4gICAgICBtZXNzYWdlOiAnRW5hYmxlIEdpdGh1YiBBY3Rpb25zIENJJyxcbiAgICAgIGRlZmF1bHQ6IHRoaXMuZW5hYmxlR2l0aHViQWN0aW9ucyxcbiAgICB9KVxuXG4gICAgcmV0dXJuIGVuYWJsZUdpdGh1YkFjdGlvbnNcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbnF1aXJlclByb2plY3RQYXRoKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBpbnB1dCh7XG4gICAgbWVzc2FnZTogJ1RhcmdldCBwYXRoIHRvIGNyZWF0ZSB0aGUgcHJvamVjdCwgcmVsYXRpdmUgdG8gY3dkLicsXG4gIH0pLnRoZW4oKHBhdGgpID0+IHtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHJldHVybiBpbnF1aXJlclByb2plY3RQYXRoKClcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhcbiAgfSlcbn1cbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgY29kZWdlbi9pbmRleC50c1xuLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlIG1hbnVhbGx5XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tICdjbGlwYW5pb24nXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlUHJlUHVibGlzaENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHtcbiAgc3RhdGljIHBhdGhzID0gW1sncHJlLXB1Ymxpc2gnXSwgWydwcmVwdWJsaXNoJ11dXG5cbiAgc3RhdGljIHVzYWdlID0gQ29tbWFuZC5Vc2FnZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVXBkYXRlIHBhY2thZ2UuanNvbiBhbmQgY29weSBhZGRvbnMgaW50byBwZXIgcGxhdGZvcm0gcGFja2FnZXMnLFxuICB9KVxuXG4gIGN3ZCA9IE9wdGlvbi5TdHJpbmcoJy0tY3dkJywgcHJvY2Vzcy5jd2QoKSwge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aCcsXG4gIH0pXG5cbiAgY29uZmlnUGF0aD86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tY29uZmlnLXBhdGgsLWMnLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlJyxcbiAgfSlcblxuICBwYWNrYWdlSnNvblBhdGggPSBPcHRpb24uU3RyaW5nKCctLXBhY2thZ2UtanNvbi1wYXRoJywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYHBhY2thZ2UuanNvbmAnLFxuICB9KVxuXG4gIG5wbURpciA9IE9wdGlvbi5TdHJpbmcoJy0tbnBtLWRpciwtcCcsICducG0nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIG5wbSBwYWNrYWdlcyBwdXQnLFxuICB9KVxuXG4gIHRhZ1N0eWxlID0gT3B0aW9uLlN0cmluZygnLS10YWctc3R5bGUsLS10YWdzdHlsZSwtdCcsICdsZXJuYScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ2dpdCB0YWcgc3R5bGUsIGBucG1gIG9yIGBsZXJuYWAnLFxuICB9KVxuXG4gIGdoUmVsZWFzZSA9IE9wdGlvbi5Cb29sZWFuKCctLWdoLXJlbGVhc2UnLCB0cnVlLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIGNyZWF0ZSBHaXRIdWIgcmVsZWFzZScsXG4gIH0pXG5cbiAgZ2hSZWxlYXNlTmFtZT86IHN0cmluZyA9IE9wdGlvbi5TdHJpbmcoJy0tZ2gtcmVsZWFzZS1uYW1lJywge1xuICAgIGRlc2NyaXB0aW9uOiAnR2l0SHViIHJlbGVhc2UgbmFtZScsXG4gIH0pXG5cbiAgZ2hSZWxlYXNlSWQ/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWdoLXJlbGVhc2UtaWQnLCB7XG4gICAgZGVzY3JpcHRpb246ICdFeGlzdGluZyBHaXRIdWIgcmVsZWFzZSBpZCcsXG4gIH0pXG5cbiAgc2tpcE9wdGlvbmFsUHVibGlzaCA9IE9wdGlvbi5Cb29sZWFuKCctLXNraXAtb3B0aW9uYWwtcHVibGlzaCcsIGZhbHNlLCB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHNraXAgb3B0aW9uYWxEZXBlbmRlbmNpZXMgcGFja2FnZXMgcHVibGlzaCcsXG4gIH0pXG5cbiAgZHJ5UnVuID0gT3B0aW9uLkJvb2xlYW4oJy0tZHJ5LXJ1bicsIGZhbHNlLCB7XG4gICAgZGVzY3JpcHRpb246ICdEcnkgcnVuIHdpdGhvdXQgdG91Y2hpbmcgZmlsZSBzeXN0ZW0nLFxuICB9KVxuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgICBjb25maWdQYXRoOiB0aGlzLmNvbmZpZ1BhdGgsXG4gICAgICBwYWNrYWdlSnNvblBhdGg6IHRoaXMucGFja2FnZUpzb25QYXRoLFxuICAgICAgbnBtRGlyOiB0aGlzLm5wbURpcixcbiAgICAgIHRhZ1N0eWxlOiB0aGlzLnRhZ1N0eWxlLFxuICAgICAgZ2hSZWxlYXNlOiB0aGlzLmdoUmVsZWFzZSxcbiAgICAgIGdoUmVsZWFzZU5hbWU6IHRoaXMuZ2hSZWxlYXNlTmFtZSxcbiAgICAgIGdoUmVsZWFzZUlkOiB0aGlzLmdoUmVsZWFzZUlkLFxuICAgICAgc2tpcE9wdGlvbmFsUHVibGlzaDogdGhpcy5za2lwT3B0aW9uYWxQdWJsaXNoLFxuICAgICAgZHJ5UnVuOiB0aGlzLmRyeVJ1bixcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGUgcGFja2FnZS5qc29uIGFuZCBjb3B5IGFkZG9ucyBpbnRvIHBlciBwbGF0Zm9ybSBwYWNrYWdlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZVB1Ymxpc2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB3aGVyZSBuYXBpIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbiwgYWxsIG90aGVyIHBhdGhzIG9wdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aFxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9jZXNzLmN3ZCgpXG4gICAqL1xuICBjd2Q/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYG5hcGlgIGNvbmZpZyBqc29uIGZpbGVcbiAgICovXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gYHBhY2thZ2UuanNvbmBcbiAgICpcbiAgICogQGRlZmF1bHQgJ3BhY2thZ2UuanNvbidcbiAgICovXG4gIHBhY2thZ2VKc29uUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0XG4gICAqXG4gICAqIEBkZWZhdWx0ICducG0nXG4gICAqL1xuICBucG1EaXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIGdpdCB0YWcgc3R5bGUsIGBucG1gIG9yIGBsZXJuYWBcbiAgICpcbiAgICogQGRlZmF1bHQgJ2xlcm5hJ1xuICAgKi9cbiAgdGFnU3R5bGU/OiAnbnBtJyB8ICdsZXJuYSdcbiAgLyoqXG4gICAqIFdoZXRoZXIgY3JlYXRlIEdpdEh1YiByZWxlYXNlXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGdoUmVsZWFzZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIEdpdEh1YiByZWxlYXNlIG5hbWVcbiAgICovXG4gIGdoUmVsZWFzZU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEV4aXN0aW5nIEdpdEh1YiByZWxlYXNlIGlkXG4gICAqL1xuICBnaFJlbGVhc2VJZD86IHN0cmluZ1xuICAvKipcbiAgICogV2hldGhlciBza2lwIG9wdGlvbmFsRGVwZW5kZW5jaWVzIHBhY2thZ2VzIHB1Ymxpc2hcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHNraXBPcHRpb25hbFB1Ymxpc2g/OiBib29sZWFuXG4gIC8qKlxuICAgKiBEcnkgcnVuIHdpdGhvdXQgdG91Y2hpbmcgZmlsZSBzeXN0ZW1cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRyeVJ1bj86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVmYXVsdFByZVB1Ymxpc2hPcHRpb25zKG9wdGlvbnM6IFByZVB1Ymxpc2hPcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIHBhY2thZ2VKc29uUGF0aDogJ3BhY2thZ2UuanNvbicsXG4gICAgbnBtRGlyOiAnbnBtJyxcbiAgICB0YWdTdHlsZTogJ2xlcm5hJyxcbiAgICBnaFJlbGVhc2U6IHRydWUsXG4gICAgc2tpcE9wdGlvbmFsUHVibGlzaDogZmFsc2UsXG4gICAgZHJ5UnVuOiBmYWxzZSxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGNvZGVnZW4vaW5kZXgudHNcbi8vIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBtYW51YWxseVxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVZlcnNpb25Db21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBwYXRocyA9IFtbJ3ZlcnNpb24nXV1cblxuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogJ1VwZGF0ZSB2ZXJzaW9uIGluIGNyZWF0ZWQgbnBtIHBhY2thZ2VzJyxcbiAgfSlcblxuICBjd2QgPSBPcHRpb24uU3RyaW5nKCctLWN3ZCcsIHByb2Nlc3MuY3dkKCksIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGgnLFxuICB9KVxuXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWNvbmZpZy1wYXRoLC1jJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZScsXG4gIH0pXG5cbiAgcGFja2FnZUpzb25QYXRoID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLWpzb24tcGF0aCcsICdwYWNrYWdlLmpzb24nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBwYWNrYWdlLmpzb25gJyxcbiAgfSlcblxuICBucG1EaXIgPSBPcHRpb24uU3RyaW5nKCctLW5wbS1kaXInLCAnbnBtJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBucG0gcGFja2FnZXMgcHV0JyxcbiAgfSlcblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgcGFja2FnZUpzb25QYXRoOiB0aGlzLnBhY2thZ2VKc29uUGF0aCxcbiAgICAgIG5wbURpcjogdGhpcy5ucG1EaXIsXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVXBkYXRlIHZlcnNpb24gaW4gY3JlYXRlZCBucG0gcGFja2FnZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJzaW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGhcbiAgICpcbiAgICogQGRlZmF1bHQgcHJvY2Vzcy5jd2QoKVxuICAgKi9cbiAgY3dkPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlXG4gICAqL1xuICBjb25maWdQYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBwYWNrYWdlLmpzb25gXG4gICAqXG4gICAqIEBkZWZhdWx0ICdwYWNrYWdlLmpzb24nXG4gICAqL1xuICBwYWNrYWdlSnNvblBhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIGZvbGRlciB3aGVyZSB0aGUgbnBtIHBhY2thZ2VzIHB1dFxuICAgKlxuICAgKiBAZGVmYXVsdCAnbnBtJ1xuICAgKi9cbiAgbnBtRGlyPzogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHRWZXJzaW9uT3B0aW9ucyhvcHRpb25zOiBWZXJzaW9uT3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBwYWNrYWdlSnNvblBhdGg6ICdwYWNrYWdlLmpzb24nLFxuICAgIG5wbURpcjogJ25wbScsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxufVxuIiwiaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHsgYXBwbHlEZWZhdWx0VmVyc2lvbk9wdGlvbnMsIFZlcnNpb25PcHRpb25zIH0gZnJvbSAnLi4vZGVmL3ZlcnNpb24uanMnXG5pbXBvcnQge1xuICByZWFkTmFwaUNvbmZpZyxcbiAgZGVidWdGYWN0b3J5LFxuICB1cGRhdGVQYWNrYWdlSnNvbixcbn0gZnJvbSAnLi4vdXRpbHMvaW5kZXguanMnXG5cbmNvbnN0IGRlYnVnID0gZGVidWdGYWN0b3J5KCd2ZXJzaW9uJylcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcnNpb24odXNlck9wdGlvbnM6IFZlcnNpb25PcHRpb25zKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcHBseURlZmF1bHRWZXJzaW9uT3B0aW9ucyh1c2VyT3B0aW9ucylcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5wYWNrYWdlSnNvblBhdGgpXG5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVhZE5hcGlDb25maWcoXG4gICAgcGFja2FnZUpzb25QYXRoLFxuICAgIG9wdGlvbnMuY29uZmlnUGF0aCA/IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMuY29uZmlnUGF0aCkgOiB1bmRlZmluZWQsXG4gIClcblxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiBjb25maWcudGFyZ2V0cykge1xuICAgIGNvbnN0IHBrZ0RpciA9IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMubnBtRGlyLCB0YXJnZXQucGxhdGZvcm1BcmNoQUJJKVxuXG4gICAgZGVidWcoYFVwZGF0ZSB2ZXJzaW9uIHRvICVpIGluIFslaV1gLCBjb25maWcucGFja2FnZUpzb24udmVyc2lvbiwgcGtnRGlyKVxuICAgIGF3YWl0IHVwZGF0ZVBhY2thZ2VKc29uKGpvaW4ocGtnRGlyLCAncGFja2FnZS5qc29uJyksIHtcbiAgICAgIHZlcnNpb246IGNvbmZpZy5wYWNrYWdlSnNvbi52ZXJzaW9uLFxuICAgIH0pXG4gIH1cbn1cbiIsImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IHsgZXhpc3RzU3luYywgc3RhdFN5bmMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L3Jlc3QnXG5cbmltcG9ydCB7XG4gIGFwcGx5RGVmYXVsdFByZVB1Ymxpc2hPcHRpb25zLFxuICBQcmVQdWJsaXNoT3B0aW9ucyxcbn0gZnJvbSAnLi4vZGVmL3ByZS1wdWJsaXNoLmpzJ1xuaW1wb3J0IHtcbiAgcmVhZEZpbGVBc3luYyxcbiAgcmVhZE5hcGlDb25maWcsXG4gIGRlYnVnRmFjdG9yeSxcbiAgdXBkYXRlUGFja2FnZUpzb24sXG59IGZyb20gJy4uL3V0aWxzL2luZGV4LmpzJ1xuXG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJ1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnRmFjdG9yeSgncHJlLXB1Ymxpc2gnKVxuXG5pbnRlcmZhY2UgUGFja2FnZUluZm8ge1xuICBuYW1lOiBzdHJpbmdcbiAgdmVyc2lvbjogc3RyaW5nXG4gIHRhZzogc3RyaW5nXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVQdWJsaXNoKHVzZXJPcHRpb25zOiBQcmVQdWJsaXNoT3B0aW9ucykge1xuICBkZWJ1ZygnUmVjZWl2ZSBwcmUtcHVibGlzaCBvcHRpb25zOicpXG4gIGRlYnVnKCcgICVPJywgdXNlck9wdGlvbnMpXG5cbiAgY29uc3Qgb3B0aW9ucyA9IGFwcGx5RGVmYXVsdFByZVB1Ymxpc2hPcHRpb25zKHVzZXJPcHRpb25zKVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlc29sdmUob3B0aW9ucy5jd2QsIG9wdGlvbnMucGFja2FnZUpzb25QYXRoKVxuXG4gIGNvbnN0IHsgcGFja2FnZUpzb24sIHRhcmdldHMsIHBhY2thZ2VOYW1lLCBiaW5hcnlOYW1lLCBucG1DbGllbnQgfSA9XG4gICAgYXdhaXQgcmVhZE5hcGlDb25maWcoXG4gICAgICBwYWNrYWdlSnNvblBhdGgsXG4gICAgICBvcHRpb25zLmNvbmZpZ1BhdGggPyByZXNvbHZlKG9wdGlvbnMuY3dkLCBvcHRpb25zLmNvbmZpZ1BhdGgpIDogdW5kZWZpbmVkLFxuICAgIClcblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVHaFJlbGVhc2UocGFja2FnZU5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgaWYgKCFvcHRpb25zLmdoUmVsZWFzZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3duZXI6IG51bGwsXG4gICAgICAgIHJlcG86IG51bGwsXG4gICAgICAgIHBrZ0luZm86IHsgbmFtZTogbnVsbCwgdmVyc2lvbjogbnVsbCwgdGFnOiBudWxsIH0sXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHsgcmVwbywgb3duZXIsIHBrZ0luZm8sIG9jdG9raXQgfSA9IGdldFJlcG9JbmZvKHBhY2thZ2VOYW1lLCB2ZXJzaW9uKVxuXG4gICAgaWYgKCFyZXBvIHx8ICFvd25lcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3duZXI6IG51bGwsXG4gICAgICAgIHJlcG86IG51bGwsXG4gICAgICAgIHBrZ0luZm86IHsgbmFtZTogbnVsbCwgdmVyc2lvbjogbnVsbCwgdGFnOiBudWxsIH0sXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmRyeVJ1bikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXBvcy5jcmVhdGVSZWxlYXNlKHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHRhZ19uYW1lOiBwa2dJbmZvLnRhZyxcbiAgICAgICAgICBuYW1lOiBvcHRpb25zLmdoUmVsZWFzZU5hbWUsXG4gICAgICAgICAgcHJlcmVsZWFzZTpcbiAgICAgICAgICAgIHZlcnNpb24uaW5jbHVkZXMoJ2FscGhhJykgfHxcbiAgICAgICAgICAgIHZlcnNpb24uaW5jbHVkZXMoJ2JldGEnKSB8fFxuICAgICAgICAgICAgdmVyc2lvbi5pbmNsdWRlcygncmMnKSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgYFBhcmFtczogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHsgb3duZXIsIHJlcG8sIHRhZ19uYW1lOiBwa2dJbmZvLnRhZyB9LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgb3duZXIsIHJlcG8sIHBrZ0luZm8sIG9jdG9raXQgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UmVwb0luZm8ocGFja2FnZU5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgY29uc3QgaGVhZENvbW1pdCA9IGV4ZWNTeW5jKCdnaXQgbG9nIC0xIC0tcHJldHR5PSVCJywge1xuICAgICAgZW5jb2Rpbmc6ICd1dGYtOCcsXG4gICAgfSkudHJpbSgpXG5cbiAgICBjb25zdCB7IEdJVEhVQl9SRVBPU0lUT1JZIH0gPSBwcm9jZXNzLmVudlxuICAgIGlmICghR0lUSFVCX1JFUE9TSVRPUlkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG93bmVyOiBudWxsLFxuICAgICAgICByZXBvOiBudWxsLFxuICAgICAgICBwa2dJbmZvOiB7IG5hbWU6IG51bGwsIHZlcnNpb246IG51bGwsIHRhZzogbnVsbCB9LFxuICAgICAgfVxuICAgIH1cbiAgICBkZWJ1ZyhgR2l0aHViIHJlcG9zaXRvcnk6ICR7R0lUSFVCX1JFUE9TSVRPUll9YClcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gR0lUSFVCX1JFUE9TSVRPUlkuc3BsaXQoJy8nKVxuICAgIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgICBhdXRoOiBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4sXG4gICAgfSlcbiAgICBsZXQgcGtnSW5mbzogUGFja2FnZUluZm8gfCB1bmRlZmluZWRcbiAgICBpZiAob3B0aW9ucy50YWdTdHlsZSA9PT0gJ2xlcm5hJykge1xuICAgICAgY29uc3QgcGFja2FnZXNUb1B1Ymxpc2ggPSBoZWFkQ29tbWl0XG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAgIC5maWx0ZXIoKGxpbmUsIGluZGV4KSA9PiBsaW5lLmxlbmd0aCAmJiBpbmRleClcbiAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zdWJzdHJpbmcoMikpXG4gICAgICAgIC5tYXAocGFyc2VUYWcpXG5cbiAgICAgIHBrZ0luZm8gPSBwYWNrYWdlc1RvUHVibGlzaC5maW5kKFxuICAgICAgICAocGtnSW5mbykgPT4gcGtnSW5mby5uYW1lID09PSBwYWNrYWdlTmFtZSxcbiAgICAgIClcblxuICAgICAgaWYgKCFwa2dJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYE5vIHJlbGVhc2UgY29tbWl0IGZvdW5kIHdpdGggJHtwYWNrYWdlTmFtZX0sIG9yaWdpbmFsIGNvbW1pdCBpbmZvOiAke2hlYWRDb21taXR9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwa2dJbmZvID0ge1xuICAgICAgICB0YWc6IGB2JHt2ZXJzaW9ufWAsXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIG5hbWU6IHBhY2thZ2VOYW1lLFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBvd25lciwgcmVwbywgcGtnSW5mbywgb2N0b2tpdCB9XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgYXdhaXQgdmVyc2lvbih1c2VyT3B0aW9ucylcbiAgICBhd2FpdCB1cGRhdGVQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgsIHtcbiAgICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOiB0YXJnZXRzLnJlZHVjZShcbiAgICAgICAgKGRlcHMsIHRhcmdldCkgPT4ge1xuICAgICAgICAgIGRlcHNbYCR7cGFja2FnZU5hbWV9LSR7dGFyZ2V0LnBsYXRmb3JtQXJjaEFCSX1gXSA9IHBhY2thZ2VKc29uLnZlcnNpb25cblxuICAgICAgICAgIHJldHVybiBkZXBzXG4gICAgICAgIH0sXG4gICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgICApLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCB7IG93bmVyLCByZXBvLCBwa2dJbmZvLCBvY3Rva2l0IH0gPSBvcHRpb25zLmdoUmVsZWFzZUlkXG4gICAgPyBnZXRSZXBvSW5mbyhwYWNrYWdlTmFtZSwgcGFja2FnZUpzb24udmVyc2lvbilcbiAgICA6IGF3YWl0IGNyZWF0ZUdoUmVsZWFzZShwYWNrYWdlTmFtZSwgcGFja2FnZUpzb24udmVyc2lvbilcblxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgY29uc3QgcGtnRGlyID0gcmVzb2x2ZShcbiAgICAgIG9wdGlvbnMuY3dkLFxuICAgICAgb3B0aW9ucy5ucG1EaXIsXG4gICAgICBgJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfWAsXG4gICAgKVxuICAgIGNvbnN0IGV4dCA9XG4gICAgICB0YXJnZXQucGxhdGZvcm0gPT09ICd3YXNpJyB8fCB0YXJnZXQucGxhdGZvcm0gPT09ICd3YXNtJyA/ICd3YXNtJyA6ICdub2RlJ1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7YmluYXJ5TmFtZX0uJHt0YXJnZXQucGxhdGZvcm1BcmNoQUJJfS4ke2V4dH1gXG4gICAgY29uc3QgZHN0UGF0aCA9IGpvaW4ocGtnRGlyLCBmaWxlbmFtZSlcblxuICAgIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgIGlmICghZXhpc3RzU3luYyhkc3RQYXRoKSkge1xuICAgICAgICBkZWJ1Zy53YXJuKGAlcyBkb2Vzbid0IGV4aXN0YCwgZHN0UGF0aClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnNraXBPcHRpb25hbFB1Ymxpc2gpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvdXRwdXQgPSBleGVjU3luYyhgJHtucG1DbGllbnR9IHB1Ymxpc2hgLCB7XG4gICAgICAgICAgICBjd2Q6IHBrZ0RpcixcbiAgICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZSBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgICAgICBlLm1lc3NhZ2UuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICdZb3UgY2Fubm90IHB1Ymxpc2ggb3ZlciB0aGUgcHJldmlvdXNseSBwdWJsaXNoZWQgdmVyc2lvbnMnLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKGUubWVzc2FnZSlcbiAgICAgICAgICAgIGRlYnVnLndhcm4oYCR7cGtnRGlyfSBoYXMgYmVlbiBwdWJsaXNoZWQsIHNraXBwaW5nYClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5naFJlbGVhc2UgJiYgcmVwbyAmJiBvd25lcikge1xuICAgICAgICBkZWJ1Zy5pbmZvKGBDcmVhdGluZyBHaXRIdWIgcmVsZWFzZSAke3BrZ0luZm8udGFnfWApXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVsZWFzZUlkID0gb3B0aW9ucy5naFJlbGVhc2VJZFxuICAgICAgICAgICAgPyBOdW1iZXIob3B0aW9ucy5naFJlbGVhc2VJZClcbiAgICAgICAgICAgIDogKFxuICAgICAgICAgICAgICAgIGF3YWl0IG9jdG9raXQhLnJlcG9zLmdldFJlbGVhc2VCeVRhZyh7XG4gICAgICAgICAgICAgICAgICByZXBvOiByZXBvLFxuICAgICAgICAgICAgICAgICAgb3duZXI6IG93bmVyLFxuICAgICAgICAgICAgICAgICAgdGFnOiBwa2dJbmZvLnRhZyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApLmRhdGEuaWRcbiAgICAgICAgICBjb25zdCBkc3RGaWxlU3RhdHMgPSBzdGF0U3luYyhkc3RQYXRoKVxuICAgICAgICAgIGNvbnN0IGFzc2V0SW5mbyA9IGF3YWl0IG9jdG9raXQhLnJlcG9zLnVwbG9hZFJlbGVhc2VBc3NldCh7XG4gICAgICAgICAgICBvd25lcjogb3duZXIsXG4gICAgICAgICAgICByZXBvOiByZXBvLFxuICAgICAgICAgICAgbmFtZTogZmlsZW5hbWUsXG4gICAgICAgICAgICByZWxlYXNlX2lkOiByZWxlYXNlSWQsXG4gICAgICAgICAgICBtZWRpYVR5cGU6IHsgZm9ybWF0OiAncmF3JyB9LFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnY29udGVudC1sZW5ndGgnOiBkc3RGaWxlU3RhdHMuc2l6ZSxcbiAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igb2N0b2tpdCB0eXBlcyBhcmUgd3JvbmdcbiAgICAgICAgICAgIGRhdGE6IGF3YWl0IHJlYWRGaWxlQXN5bmMoZHN0UGF0aCksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBkZWJ1Zy5pbmZvKGBHaXRIdWIgcmVsZWFzZSBjcmVhdGVkYClcbiAgICAgICAgICBkZWJ1Zy5pbmZvKGBEb3dubG9hZCBVUkw6ICVzYCwgYXNzZXRJbmZvLmRhdGEuYnJvd3Nlcl9kb3dubG9hZF91cmwpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBkZWJ1Zy5lcnJvcihcbiAgICAgICAgICAgIGBQYXJhbTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgeyBvd25lciwgcmVwbywgdGFnOiBwa2dJbmZvLnRhZywgZmlsZW5hbWU6IGRzdFBhdGggfSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgZGVidWcuZXJyb3IoZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVRhZyh0YWc6IHN0cmluZykge1xuICBjb25zdCBzZWdtZW50cyA9IHRhZy5zcGxpdCgnQCcpXG4gIGNvbnN0IHZlcnNpb24gPSBzZWdtZW50cy5wb3AoKSFcbiAgY29uc3QgbmFtZSA9IHNlZ21lbnRzLmpvaW4oJ0AnKVxuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB2ZXJzaW9uLFxuICAgIHRhZyxcbiAgfVxufVxuIiwiaW1wb3J0IHsgcHJlUHVibGlzaCB9IGZyb20gJy4uL2FwaS9wcmUtcHVibGlzaC5qcydcbmltcG9ydCB7IEJhc2VQcmVQdWJsaXNoQ29tbWFuZCB9IGZyb20gJy4uL2RlZi9wcmUtcHVibGlzaC5qcydcblxuZXhwb3J0IGNsYXNzIFByZVB1Ymxpc2hDb21tYW5kIGV4dGVuZHMgQmFzZVByZVB1Ymxpc2hDb21tYW5kIHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNvbnN0ICducG0nIHwgJ2xlcm5hJyB0byBzdHJpbmdcbiAgICBhd2FpdCBwcmVQdWJsaXNoKHRoaXMuZ2V0T3B0aW9ucygpKVxuICB9XG59XG4iLCJpbXBvcnQgeyBpbnB1dCB9IGZyb20gJ0BpbnF1aXJlci9wcm9tcHRzJ1xuXG5pbXBvcnQgeyByZW5hbWVQcm9qZWN0IH0gZnJvbSAnLi4vYXBpL3JlbmFtZS5qcydcbmltcG9ydCB7IEJhc2VSZW5hbWVDb21tYW5kIH0gZnJvbSAnLi4vZGVmL3JlbmFtZS5qcydcblxuZXhwb3J0IGNsYXNzIFJlbmFtZUNvbW1hbmQgZXh0ZW5kcyBCYXNlUmVuYW1lQ29tbWFuZCB7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpXG4gICAgaWYgKCFvcHRpb25zLm5hbWUpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBhd2FpdCBpbnB1dCh7XG4gICAgICAgIG1lc3NhZ2U6IGBFbnRlciB0aGUgbmV3IHBhY2thZ2UgbmFtZSBpbiB0aGUgcGFja2FnZS5qc29uYCxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB9KVxuICAgICAgb3B0aW9ucy5uYW1lID0gbmFtZVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuYmluYXJ5TmFtZSkge1xuICAgICAgY29uc3QgYmluYXJ5TmFtZSA9IGF3YWl0IGlucHV0KHtcbiAgICAgICAgbWVzc2FnZTogYEVudGVyIHRoZSBuZXcgYmluYXJ5IG5hbWVgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBvcHRpb25zLmJpbmFyeU5hbWUgPSBiaW5hcnlOYW1lXG4gICAgfVxuICAgIGF3YWl0IHJlbmFtZVByb2plY3Qob3B0aW9ucylcbiAgfVxufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBjb2RlZ2VuL2luZGV4LnRzXG4vLyBEbyBub3QgZWRpdCB0aGlzIGZpbGUgbWFudWFsbHlcbmltcG9ydCB7IENvbW1hbmQsIE9wdGlvbiB9IGZyb20gJ2NsaXBhbmlvbidcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VVbml2ZXJzYWxpemVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBwYXRocyA9IFtbJ3VuaXZlcnNhbGl6ZSddXVxuXG4gIHN0YXRpYyB1c2FnZSA9IENvbW1hbmQuVXNhZ2Uoe1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tYmlsZSBidWlsdCBiaW5hcmllcyBpbnRvIG9uZSB1bml2ZXJzYWwgYmluYXJ5JyxcbiAgfSlcblxuICBjd2QgPSBPcHRpb24uU3RyaW5nKCctLWN3ZCcsIHByb2Nlc3MuY3dkKCksIHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGgnLFxuICB9KVxuXG4gIGNvbmZpZ1BhdGg/OiBzdHJpbmcgPSBPcHRpb24uU3RyaW5nKCctLWNvbmZpZy1wYXRoLC1jJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBgbmFwaWAgY29uZmlnIGpzb24gZmlsZScsXG4gIH0pXG5cbiAgcGFja2FnZUpzb25QYXRoID0gT3B0aW9uLlN0cmluZygnLS1wYWNrYWdlLWpzb24tcGF0aCcsICdwYWNrYWdlLmpzb24nLCB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGBwYWNrYWdlLmpzb25gJyxcbiAgfSlcblxuICBvdXRwdXREaXIgPSBPcHRpb24uU3RyaW5nKCctLW91dHB1dC1kaXIsLW8nLCAnLi8nLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIGFsbCBidWlsdCBgLm5vZGVgIGZpbGVzIHB1dCwgc2FtZSBhcyBgLS1vdXRwdXQtZGlyYCBvZiBidWlsZCBjb21tYW5kJyxcbiAgfSlcblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgcGFja2FnZUpzb25QYXRoOiB0aGlzLnBhY2thZ2VKc29uUGF0aCxcbiAgICAgIG91dHB1dERpcjogdGhpcy5vdXRwdXREaXIsXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29tYmlsZSBidWlsdCBiaW5hcmllcyBpbnRvIG9uZSB1bml2ZXJzYWwgYmluYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pdmVyc2FsaXplT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2Ygd2hlcmUgbmFwaSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW4sIGFsbCBvdGhlciBwYXRocyBvcHRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGlzIHBhdGhcbiAgICpcbiAgICogQGRlZmF1bHQgcHJvY2Vzcy5jd2QoKVxuICAgKi9cbiAgY3dkPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBuYXBpYCBjb25maWcganNvbiBmaWxlXG4gICAqL1xuICBjb25maWdQYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQYXRoIHRvIGBwYWNrYWdlLmpzb25gXG4gICAqXG4gICAqIEBkZWZhdWx0ICdwYWNrYWdlLmpzb24nXG4gICAqL1xuICBwYWNrYWdlSnNvblBhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIGZvbGRlciB3aGVyZSBhbGwgYnVpbHQgYC5ub2RlYCBmaWxlcyBwdXQsIHNhbWUgYXMgYC0tb3V0cHV0LWRpcmAgb2YgYnVpbGQgY29tbWFuZFxuICAgKlxuICAgKiBAZGVmYXVsdCAnLi8nXG4gICAqL1xuICBvdXRwdXREaXI/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVmYXVsdFVuaXZlcnNhbGl6ZU9wdGlvbnMob3B0aW9uczogVW5pdmVyc2FsaXplT3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBwYWNrYWdlSnNvblBhdGg6ICdwYWNrYWdlLmpzb24nLFxuICAgIG91dHB1dERpcjogJy4vJyxcbiAgICAuLi5vcHRpb25zLFxuICB9XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQge1xuICBhcHBseURlZmF1bHRVbml2ZXJzYWxpemVPcHRpb25zLFxuICBVbml2ZXJzYWxpemVPcHRpb25zLFxufSBmcm9tICcuLi9kZWYvdW5pdmVyc2FsaXplLmpzJ1xuaW1wb3J0IHsgcmVhZE5hcGlDb25maWcgfSBmcm9tICcuLi91dGlscy9jb25maWcuanMnXG5pbXBvcnQgeyBkZWJ1Z0ZhY3RvcnkgfSBmcm9tICcuLi91dGlscy9sb2cuanMnXG5pbXBvcnQgeyBmaWxlRXhpc3RzIH0gZnJvbSAnLi4vdXRpbHMvbWlzYy5qcydcbmltcG9ydCB7IFVuaUFyY2hzQnlQbGF0Zm9ybSB9IGZyb20gJy4uL3V0aWxzL3RhcmdldC5qcydcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0ZhY3RvcnkoJ3VuaXZlcnNhbGl6ZScpXG5cbmNvbnN0IHVuaXZlcnNhbGl6ZXJzOiBQYXJ0aWFsPFxuICBSZWNvcmQ8Tm9kZUpTLlBsYXRmb3JtLCAoaW5wdXRzOiBzdHJpbmdbXSwgb3V0cHV0OiBzdHJpbmcpID0+IHZvaWQ+XG4+ID0ge1xuICBkYXJ3aW46IChpbnB1dHMsIG91dHB1dCkgPT4ge1xuICAgIHNwYXduU3luYygnbGlwbycsIFsnLWNyZWF0ZScsICctb3V0cHV0Jywgb3V0cHV0LCAuLi5pbnB1dHNdLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pXG4gIH0sXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bml2ZXJzYWxpemVCaW5hcmllcyh1c2VyT3B0aW9uczogVW5pdmVyc2FsaXplT3B0aW9ucykge1xuICBjb25zdCBvcHRpb25zID0gYXBwbHlEZWZhdWx0VW5pdmVyc2FsaXplT3B0aW9ucyh1c2VyT3B0aW9ucylcblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBqb2luKG9wdGlvbnMuY3dkLCBvcHRpb25zLnBhY2thZ2VKc29uUGF0aClcblxuICBjb25zdCBjb25maWcgPSBhd2FpdCByZWFkTmFwaUNvbmZpZyhcbiAgICBwYWNrYWdlSnNvblBhdGgsXG4gICAgb3B0aW9ucy5jb25maWdQYXRoID8gcmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5jb25maWdQYXRoKSA6IHVuZGVmaW5lZCxcbiAgKVxuXG4gIGNvbnN0IHRhcmdldCA9IGNvbmZpZy50YXJnZXRzLmZpbmQoXG4gICAgKHQpID0+IHQucGxhdGZvcm0gPT09IHByb2Nlc3MucGxhdGZvcm0gJiYgdC5hcmNoID09PSAndW5pdmVyc2FsJyxcbiAgKVxuXG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCd1bml2ZXJzYWwnIGFyY2ggZm9yIHBsYXRmb3JtICcke3Byb2Nlc3MucGxhdGZvcm19JyBub3QgZm91bmQgaW4gY29uZmlnIWAsXG4gICAgKVxuICB9XG5cbiAgY29uc3Qgc3JjRmlsZXMgPSBVbmlBcmNoc0J5UGxhdGZvcm1bcHJvY2Vzcy5wbGF0Zm9ybV0/Lm1hcCgoYXJjaCkgPT5cbiAgICByZXNvbHZlKFxuICAgICAgb3B0aW9ucy5jd2QsXG4gICAgICBvcHRpb25zLm91dHB1dERpcixcbiAgICAgIGAke2NvbmZpZy5iaW5hcnlOYW1lfS4ke3Byb2Nlc3MucGxhdGZvcm19LSR7YXJjaH0ubm9kZWAsXG4gICAgKSxcbiAgKVxuXG4gIGlmICghc3JjRmlsZXMgfHwgIXVuaXZlcnNhbGl6ZXJzW3Byb2Nlc3MucGxhdGZvcm1dKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCd1bml2ZXJzYWwnIGFyY2ggZm9yIHBsYXRmb3JtICcke3Byb2Nlc3MucGxhdGZvcm19JyBub3Qgc3VwcG9ydGVkLmAsXG4gICAgKVxuICB9XG5cbiAgZGVidWcoYExvb2tpbmcgdXAgc291cmNlIGJpbmFyaWVzIHRvIGNvbWJpbmU6IGApXG4gIGRlYnVnKCcgICVPJywgc3JjRmlsZXMpXG5cbiAgY29uc3Qgc3JjRmlsZUxvb2t1cCA9IGF3YWl0IFByb21pc2UuYWxsKHNyY0ZpbGVzLm1hcCgoZikgPT4gZmlsZUV4aXN0cyhmKSkpXG5cbiAgY29uc3Qgbm90Rm91bmRGaWxlcyA9IHNyY0ZpbGVzLmZpbHRlcigoXywgaSkgPT4gIXNyY0ZpbGVMb29rdXBbaV0pXG5cbiAgaWYgKG5vdEZvdW5kRmlsZXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFNvbWUgYmluYXJ5IGZpbGVzIHdlcmUgbm90IGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KG5vdEZvdW5kRmlsZXMpfWAsXG4gICAgKVxuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gcmVzb2x2ZShcbiAgICBvcHRpb25zLmN3ZCxcbiAgICBvcHRpb25zLm91dHB1dERpcixcbiAgICBgJHtjb25maWcuYmluYXJ5TmFtZX0uJHtwcm9jZXNzLnBsYXRmb3JtfS11bml2ZXJzYWwubm9kZWAsXG4gIClcblxuICB1bml2ZXJzYWxpemVyc1twcm9jZXNzLnBsYXRmb3JtXT8uKHNyY0ZpbGVzLCBvdXRwdXQpXG5cbiAgZGVidWcoYFByb2R1Y2VkIHVuaXZlcnNhbCBiaW5hcnk6ICR7b3V0cHV0fWApXG59XG4iLCJpbXBvcnQgeyB1bml2ZXJzYWxpemVCaW5hcmllcyB9IGZyb20gJy4uL2FwaS91bml2ZXJzYWxpemUuanMnXG5pbXBvcnQgeyBCYXNlVW5pdmVyc2FsaXplQ29tbWFuZCB9IGZyb20gJy4uL2RlZi91bml2ZXJzYWxpemUuanMnXG5cbmV4cG9ydCBjbGFzcyBVbml2ZXJzYWxpemVDb21tYW5kIGV4dGVuZHMgQmFzZVVuaXZlcnNhbGl6ZUNvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGF3YWl0IHVuaXZlcnNhbGl6ZUJpbmFyaWVzKHRoaXMuZ2V0T3B0aW9ucygpKVxuICB9XG59XG4iLCJpbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vYXBpL3ZlcnNpb24uanMnXG5pbXBvcnQgeyBCYXNlVmVyc2lvbkNvbW1hbmQgfSBmcm9tICcuLi9kZWYvdmVyc2lvbi5qcydcblxuZXhwb3J0IGNsYXNzIFZlcnNpb25Db21tYW5kIGV4dGVuZHMgQmFzZVZlcnNpb25Db21tYW5kIHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBhd2FpdCB2ZXJzaW9uKHRoaXMuZ2V0T3B0aW9ucygpKVxuICB9XG59XG4iLCIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCB7IENsaSB9IGZyb20gJ2NsaXBhbmlvbidcblxuaW1wb3J0IHsgQXJ0aWZhY3RzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYXJ0aWZhY3RzLmpzJ1xuaW1wb3J0IHsgQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZC5qcydcbmltcG9ydCB7IENyZWF0ZU5wbURpcnNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jcmVhdGUtbnBtLWRpcnMuanMnXG5pbXBvcnQgeyBIZWxwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvaGVscC5qcydcbmltcG9ydCB7IE5ld0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL25ldy5qcydcbmltcG9ydCB7IFByZVB1Ymxpc2hDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmUtcHVibGlzaC5qcydcbmltcG9ydCB7IFJlbmFtZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JlbmFtZS5qcydcbmltcG9ydCB7IFVuaXZlcnNhbGl6ZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3VuaXZlcnNhbGl6ZS5qcydcbmltcG9ydCB7IFZlcnNpb25Db21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy92ZXJzaW9uLmpzJ1xuaW1wb3J0IHsgQ0xJX1ZFUlNJT04gfSBmcm9tICcuL3V0aWxzL21pc2MuanMnXG5cbmNvbnN0IGNsaSA9IG5ldyBDbGkoe1xuICBiaW5hcnlOYW1lOiAnbmFwaScsXG4gIGJpbmFyeVZlcnNpb246IENMSV9WRVJTSU9OLFxufSlcblxuY2xpLnJlZ2lzdGVyKE5ld0NvbW1hbmQpXG5jbGkucmVnaXN0ZXIoQnVpbGRDb21tYW5kKVxuY2xpLnJlZ2lzdGVyKENyZWF0ZU5wbURpcnNDb21tYW5kKVxuY2xpLnJlZ2lzdGVyKEFydGlmYWN0c0NvbW1hbmQpXG5jbGkucmVnaXN0ZXIoVW5pdmVyc2FsaXplQ29tbWFuZClcbmNsaS5yZWdpc3RlcihSZW5hbWVDb21tYW5kKVxuY2xpLnJlZ2lzdGVyKFByZVB1Ymxpc2hDb21tYW5kKVxuY2xpLnJlZ2lzdGVyKFZlcnNpb25Db21tYW5kKVxuY2xpLnJlZ2lzdGVyKEhlbHBDb21tYW5kKVxuXG52b2lkIGNsaS5ydW5FeGl0KHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOF0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBQUEsU0FBU0EsVUFBUSxHQUFHO0FBQ2xCO0FBRUEsU0FBTyxPQUFPLFVBQVVBLFlBQVUsY0FBYyxPQUFPLFVBQVUsWUFBWSxPQUFPLE9BQU8sV0FBVyxTQUFVQyxLQUFHO0FBQ2pILFVBQU8sT0FBT0E7RUFDZixJQUFHLFNBQVVBLEtBQUc7QUFDZixVQUFPQSxPQUFLLGNBQWMsT0FBTyxVQUFVQSxJQUFFLGdCQUFnQixVQUFVQSxRQUFNLE9BQU8sWUFBWSxXQUFXLE9BQU9BO0VBQ25ILEdBQUUsT0FBTyxRQUFRLGFBQWEsTUFBTSxPQUFPLFFBQVEsYUFBYSxPQUFPLFNBQVNELFVBQVEs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