From 70ee74cff40f0e3f943d8f0d2c6b631a25562583 Mon Sep 17 00:00:00 2001 From: hormelcookies Date: Sat, 5 Sep 2020 15:11:14 -0700 Subject: [PATCH] fix linux builds --- BetterDiscordApp/dist/index.js | 26 +++++++++---------- BetterDiscordApp/dist/index.min.js | 3 ++- BetterDiscordApp/dist/index.min.js.map | 2 +- LightcordApi/js/main.js | 3 ++- LightcordApi/js/main.min.js.map | 2 +- installSubModules.js | 2 -- .../core/app/mainScreen.js | 11 ++++++-- package-lock.json | 18 ------------- package.json | 2 +- 9 files changed, 29 insertions(+), 40 deletions(-) diff --git a/BetterDiscordApp/dist/index.js b/BetterDiscordApp/dist/index.js index 57e0640..9ad95ee 100644 --- a/BetterDiscordApp/dist/index.js +++ b/BetterDiscordApp/dist/index.js @@ -2808,18 +2808,18 @@ Core.prototype.updateInjector = async function () { const injectionPath = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].injectionPath; if (!injectionPath) return false; /* - const fs = require("fs"); + const fs = require("fs"); const path = require("path"); const rmrf = require("rimraf"); const yauzl = require("yauzl"); const mkdirp = require("mkdirp"); const request = require("request"); - const parentPath = path.resolve(injectionPath, ".."); + const parentPath = path.resolve(injectionPath, ".."); const folderName = path.basename(injectionPath); const zipLink = "https://github.com/rauenzi/BetterDiscordApp/archive/injector.zip"; const savedZip = path.resolve(parentPath, "injector.zip"); const extractedFolder = path.resolve(parentPath, "BetterDiscordApp-injector"); - // Download the injector zip file + // Download the injector zip file Utils.log("InjectorUpdate", "Downloading " + zipLink); let success = await new Promise(resolve => { request.get({url: zipLink, encoding: null}, async (error, response, body) => { @@ -2827,12 +2827,12 @@ Core.prototype.updateInjector = async function () { // Save a backup in case someone has their own copy const alreadyExists = await new Promise(res => fs.exists(savedZip, res)); if (alreadyExists) await new Promise(res => fs.rename(savedZip, `${savedZip}.bak${Math.round(performance.now())}`, res)); - Utils.log("InjectorUpdate", "Writing " + savedZip); + Utils.log("InjectorUpdate", "Writing " + savedZip); fs.writeFile(savedZip, body, err => resolve(!err)); }); }); if (!success) return success; - // Check and delete rename extraction + // Check and delete rename extraction const alreadyExists = await new Promise(res => fs.exists(extractedFolder, res)); if (alreadyExists) await new Promise(res => fs.rename(extractedFolder, `${extractedFolder}.bak${Math.round(performance.now())}`, res)); @@ -2841,7 +2841,7 @@ Core.prototype.updateInjector = async function () { zipfile.on("entry", function(entry) { // Skip directories, they are handled with mkdirp if (entry.fileName.endsWith("/")) return zipfile.readEntry(); - Utils.log("InjectorUpdate", "Extracting " + entry.fileName); + Utils.log("InjectorUpdate", "Extracting " + entry.fileName); // Make any needed parent directories const fullPath = path.resolve(parentPath, entry.fileName); mkdirp.sync(path.dirname(fullPath)); @@ -2852,30 +2852,30 @@ Core.prototype.updateInjector = async function () { }); }); zipfile.readEntry(); // Start reading - // Wait for the final file to finish + // Wait for the final file to finish await new Promise(resolve => zipfile.once("end", resolve)); - // Save a backup in case something goes wrong during final step + // Save a backup in case something goes wrong during final step const backupFolder = path.resolve(parentPath, `${folderName}.bak${Math.round(performance.now())}`); await new Promise(resolve => fs.rename(injectionPath, backupFolder, resolve)); - // Rename the extracted folder to what it should be + // Rename the extracted folder to what it should be Utils.log("InjectorUpdate", `Renaming ${path.basename(extractedFolder)} to ${folderName}`); success = await new Promise(resolve => fs.rename(extractedFolder, injectionPath, err => resolve(!err))); if (!success) { Utils.err("InjectorUpdate", "Failed to rename the final directory"); return success; } - // If rename had issues, delete what we tried to rename and restore backup + // If rename had issues, delete what we tried to rename and restore backup if (!success) { Utils.err("InjectorUpdate", "Something went wrong... restoring backups."); await new Promise(resolve => rmrf(extractedFolder, resolve)); await new Promise(resolve => fs.rename(backupFolder, injectionPath, resolve)); return success; } - // If we've gotten to this point, everything should have gone smoothly. + // If we've gotten to this point, everything should have gone smoothly. // Cleanup the backup folder then remove the zip await new Promise(resolve => rmrf(backupFolder, resolve)); await new Promise(resolve => fs.unlink(savedZip, resolve)); - Utils.log("InjectorUpdate", "Injector Updated!"); + Utils.log("InjectorUpdate", "Injector Updated!"); return success;*/ }; @@ -12073,4 +12073,4 @@ module.exports = require("path"); /***/ }) /******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0xheWVycy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wbHVnaW5Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3BvcG91dFdpbmRvdy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcHVibGljU2VydmVycy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvc2V0dGluZ3NQYW5lbC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvc2V0dGluZ3NQYW5lbFNpZGViYXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3RoZW1lTW9kdWxlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy91dGlscy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdjIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3ZvaWNlTW9kZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvd2VicGFja01vZHVsZXMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvTGlnaHRjb3JkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3N2Zy9idWdfaHVudGVyLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3N2Zy9jaXJjdXMuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvQWNjb3VudEluZm9zLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL0FwaVByZXZpZXcuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYWRkb25jYXJkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9ubGlzdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9iZExvZ28uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jaGVja2JveC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvZHJvcGRvd24uanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zd2l0Y2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29udGVudENvbHVtbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvckRldGFjaGVkLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvZXJyb3JCb3VuZGFyeS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2RlbGV0ZS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kb3duYXJyb3cuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZWRpdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9oaXN0b3J5LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL3NlYXJjaC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9tYXJnaW50b3AuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHJlc2VuY2VTZXR0aW5ncy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3NlcnZlckNhcmQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3NpZGViYXJWaWV3LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcmVsb2FkSWNvbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Njcm9sbGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzR3JvdXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZXR0aW5nc1RpdGxlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc3dpdGNoLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFySGVhZGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFySXRlbS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3RhYkJhclNlcGFyYXRvci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Rvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHRpcC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Rvb2x0aXBXcmFwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkveFN2Zy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiY3J5cHRvXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImVsZWN0cm9uXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImV2ZW50c1wiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJmc1wiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJtb2R1bGVcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwibm9kZS1mZXRjaFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJwYXRoXCIiXSwibmFtZXMiOlsibWluaW11bURpc2NvcmRWZXJzaW9uIiwiY3VycmVudERpc2NvcmRWZXJzaW9uIiwid2luZG93IiwiRGlzY29yZE5hdGl2ZSIsInJlbW90ZUFwcCIsImdldFZlcnNpb24iLCJtaW5TdXBwb3J0ZWRWZXJzaW9uIiwiYmJkVmVyc2lvbiIsImJiZENoYW5nZWxvZyIsImRlc2NyaXB0aW9uIiwiY2hhbmdlcyIsInRpdGxlIiwidHlwZSIsIml0ZW1zIiwic2V0dGluZ3MiLCJpZCIsImluZm8iLCJpbXBsZW1lbnRlZCIsImhpZGRlbiIsImNhdCIsImNhdGVnb3J5IiwiZXhwZXJpbWVudGFsIiwicHJvY2VzcyIsInBsYXRmb3JtIiwiZGVmYXVsdENvb2tpZSIsInNldHRpbmdzQ29va2llIiwic2V0dGluZ3NSUEMiLCJkZWZhdWx0UlBDIiwiRGF0ZSIsIm5vdyIsImJkcGx1Z2luRXJyb3JzIiwiYmR0aGVtZUVycm9ycyIsImJkQ29uZmlnIiwiT2JqZWN0IiwiY3JlYXRlIiwiQmV0dGVyRGlzY29yZENvbmZpZyIsImJkdGhlbWVzIiwiYmRwbHVnaW5zIiwicGx1Z2luQ29va2llIiwidGhlbWVDb29raWUiLCJsb2NhbFN0b3JhZ2VGaXgiLCJsb2FkaW5nSWNvbiIsImRlcHJlY2F0ZUdsb2JhbCIsImtleSIsInZhbHVlIiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJVdGlscyIsIndhcm4iLCJnbG9iYWxLZXlzIiwia2V5cyIsIkdsb2JhbHMiLCJCRFYyIiwicGx1Z2luTW9kdWxlIiwidGhlbWVNb2R1bGUiLCJCREV2ZW50cyIsInNldHRpbmdzUGFuZWwiLCJEYXRhU3RvcmUiLCJDb250ZW50TWFuYWdlciIsIkNsYXNzTm9ybWFsaXplciIsIkJkQXBpIiwiQ29yZSIsIkNvcmVXcmFwcGVyIiwiY29uc3RydWN0b3IiLCJtZXRob2RzIiwic2V0Q29uZmlnIiwic2V0TWV0aG9kcyIsImluaXQiLCJ2MkxvYWRlciIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNvbnRlbnRXaW5kb3dHZXR0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJIVE1MSUZyYW1lRWxlbWVudCIsInByb3RvdHlwZSIsImNvbnRlbnRXaW5kb3ciLCJSZWZsZWN0IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJQcm94eSIsIm9iaiIsInByb3AiLCJ1bmRlZmluZWQiLCJ2YWwiLCJiaW5kIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJGdW5jdGlvbiIsIm9PcGVuIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwidXJsIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsIlRGSG91ciIsImluamVjdDI0SG91ciIsImNhbmNlbDI0SG91ciIsInR3ZWx2ZUhvdXIiLCJSZWdFeHAiLCJjb252ZXJ0IiwiZGF0YSIsIm1hdGNoZWQiLCJyZXR1cm5WYWx1ZSIsIm1hdGNoIiwibGVuZ3RoIiwicmVwbGFjZSIsInBhZFN0YXJ0IiwicGFyc2VJbnQiLCJjYW5jZWxDb3p5IiwibW9ua2V5UGF0Y2giLCJUaW1lRm9ybWF0dGVyIiwiYWZ0ZXIiLCJjYW5jZWxDb21wYWN0IiwicmVtb3ZlMjRIb3VyIiwiZGlzcGF0Y2hlciIsIkxpZ2h0Y29yZCIsIkRpc2NvcmRNb2R1bGVzIiwiQ2hhbm5lbE1vZHVsZSIsIkJETW9kdWxlcyIsImUiLCJkZWZhdWx0IiwiZ2V0Q2hhbm5lbCIsImhhc0NoYW5uZWwiLCJyZWxhdGlvblNoaXBNb2R1bGUiLCJhZGRSZWxhdGlvbnNoaXAiLCJETU1vZHVsZSIsImNsb3NlUHJpdmF0ZUNoYW5uZWwiLCJibG9ja2VkIiwidXNlck1vZHVsZSIsImdldEN1cnJlbnRVc2VyIiwiQW50aUJvdERNIiwiYW50aURNIiwiZW5hYmxlZCIsImVuYWJsZSIsInN1YnNjcmliZSIsImRpc2FibGUiLCJ1bnN1YnNjcmliZSIsImV2IiwibWVzc2FnZSIsImF1dGhvciIsImJvdCIsImd1aWxkX2lkIiwiY2hhbm5lbCIsImNoYW5uZWxfaWQiLCJzY2FuTWVzc2FnZSIsInNob3dUb2FzdCIsInVzZXJuYW1lIiwiZGlzY3JpbWluYXRvciIsImxvY2F0aW9uIiwidGVzdCIsImNvbnRlbnQiLCJFbWJlZHNDb250YWlucyIsInNlYXJjaCIsImVtYmVkcyIsIm1hcCIsImVtYmVkIiwiZm9vdGVyIiwidGV4dCIsImZpZWxkcyIsIm5hbWUiLCJtIiwiRGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiQWN0aW9uVHlwZXMiLCJzb2NrZXRJZCIsInBpZCIsIkN1c3RvbVJpY2hQcmVzZW5jZSIsImdhbWUiLCJmb3JtYXRlZEdhbWUiLCJhcHBsaWNhdGlvbl9pZCIsImRldGFpbHMiLCJzdGF0ZSIsInRpbWVzdGFtcHMiLCJzdGFydCIsImFzc2V0cyIsImxhcmdlX2ltYWdlIiwic21hbGxfaW1hZ2UiLCJzZW5kR2FtZSIsIkxPQ0FMX0FDVElWSVRZX1VQREFURSIsImFjdGl2aXR5IiwiY29uc29sZSIsImxvZyIsInNldCIsImZldGNoQXNzZXRzIiwiYXBwbGljYXRpb25JZCIsImdldEFzc2V0cyIsIkVycm9yIiwiTGF5ZXJzIiwibGF5ZXJzIiwiQmV0dGVyRGlzY29yZCIsImlzSW5qZWN0ZWQiLCJxdWVyeVNlbGVjdG9yIiwiaW5qZWN0IiwiY2xhc3NOYW1lTGF5ZXJzIiwicmVtb3ZlRGEiLCJ2MiIsIldlYnBhY2tNb2R1bGVzIiwiZmluZCIsImxheWVyIiwiUmVhY3RJbnN0YW5jZSIsIkFwaSIsIkZpbmRSZWFjdCIsInJlbmRlciIsImNhbGwiLCJjbGFzc0xpc3QiLCJwcm9wcyIsImNoaWxkcmVuIiwic3BsaXQiLCJwdXNoIiwiam9pbiIsImZvckVhY2giLCJmb3JjZVVwZGF0ZSIsImNyZWF0ZUxheWVyIiwidXVpZHY0IiwibGF5IiwiaW5kZXgiLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJyZW1vdmUiLCJMYXllck1vZHVsZXMiLCJMYXllciIsIlJlYWN0IiwiQ29tcG9uZW50IiwiYW5pbWF0aW9uIiwibW9kdWxlcyIsIlZhbHVlIiwiZ2V0TGF5ZXIiLCJrZXlkb3duIiwid2hpY2giLCJkaXYiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJjb21wb25lbnREaWRNb3VudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJjb21wb25lbnRXaWxsRW50ZXIiLCJ0aW1pbmciLCJ0b1ZhbHVlIiwiZHVyYXRpb24iLCJjb21wb25lbnRXaWxsTGVhdmUiLCJpbnRlcnBvbGF0aW9uIiwiaW50ZXJwb2xhdGUiLCJpbnB1dFJhbmdlIiwib3V0cHV0UmFuZ2UiLCJzdHlsZSIsIm9wYWNpdHkiLCJ0cmFuc2Zvcm0iLCJzY2FsZSIsIkRpdiIsIl9fU0VDUkVUX0VNT1RJT05fXyIsImNzcyIsImJhY2tncm91bmRDb2xvciIsInBvc2l0aW9uIiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0IiwiZGlzcGxheSIsIm92ZXJmbG93IiwiV2Via2l0Qm94T3JpZW50IiwiV2Via2l0Qm94RGlyZWN0aW9uIiwibXNGbGV4RGlyZWN0aW9uIiwiZmxleERpcmVjdGlvbiIsInpJbmRleCIsInBhZGRpbmdUb3AiLCJmaWx0ZXIiLCJkZWZhdWx0UHJvcHMiLCJSZWFjdERPTSIsIlJlYWN0RG9tIiwiUmVhY3RDb21wb25lbnQiLCJXaW5kb3dDb25maWdGaWxlIiwiZW1vdGVzIiwic2NyZWVuV2lkdGgiLCJNYXRoIiwibWF4IiwiZG9jdW1lbnRFbGVtZW50IiwiY2xpZW50V2lkdGgiLCJpbm5lcldpZHRoIiwic2NyZWVuSGVpZ2h0IiwiY2xpZW50SGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJnZXRBbGxXaW5kb3dQcmVmZXJlbmNlcyIsImdldFdpbmRvd1ByZWZlcmVuY2UiLCJzZXRXaW5kb3dQcmVmZXJlbmNlIiwiaW5qZWN0Q1NTIiwiRE9NIiwiYWRkU3R5bGUiLCJlc2NhcGVJRCIsImNsZWFyQ1NTIiwicmVtb3ZlU3R5bGUiLCJsaW5rSlMiLCJhZGRTY3JpcHQiLCJ1bmxpbmtKUyIsInJlbW92ZVNjcmlwdCIsImdldFBsdWdpbiIsImhhc093blByb3BlcnR5IiwicGx1Z2luIiwiZ2V0Q29yZSIsIm1haW5Db3JlIiwiYWxlcnQiLCJzaG93Q29uZmlybWF0aW9uTW9kYWwiLCJjYW5jZWxUZXh0Iiwib3B0aW9ucyIsImZpbmRNb2R1bGUiLCJmaW5kQWxsTW9kdWxlcyIsImZpbmRBbGwiLCJmaW5kTW9kdWxlQnlQcm9wcyIsImZpbmRCeVVuaXF1ZVByb3BlcnRpZXMiLCJmaW5kTW9kdWxlQnlQcm90b3R5cGVzIiwicHJvdG9zIiwiZmluZEJ5UHJvdG90eXBlcyIsImZpbmRNb2R1bGVCeURpc3BsYXlOYW1lIiwiZmluZEJ5RGlzcGxheU5hbWUiLCJnZXRJbnRlcm5hbEluc3RhbmNlIiwibm9kZSIsImpRdWVyeSIsIkVsZW1lbnQiLCJsb2FkRGF0YSIsInBsdWdpbk5hbWUiLCJnZXRQbHVnaW5EYXRhIiwiZ2V0RGF0YSIsInNhdmVEYXRhIiwic2V0UGx1Z2luRGF0YSIsInNldERhdGEiLCJkZWxldGVEYXRhIiwiZGVsZXRlUGx1Z2luRGF0YSIsIndoYXQiLCJtZXRob2ROYW1lIiwib25SZW1vdmVkIiwiY2FsbGJhY2siLCJzdXBwcmVzc0Vycm9ycyIsIm1ldGhvZCIsInRlc3RKU09OIiwiaXNQbHVnaW5FbmFibGVkIiwiaXNUaGVtZUVuYWJsZWQiLCJpc1NldHRpbmdFbmFibGVkIiwiZW5hYmxlU2V0dGluZyIsIm9uQ2hhbmdlIiwiZGlzYWJsZVNldHRpbmciLCJ0b2dnbGVTZXR0aW5nIiwiZ2V0QkREYXRhIiwic2V0QkREYXRhIiwibWFrZUFkZG9uQVBJIiwiY29va2llIiwibGlzdCIsIm1hbmFnZXIiLCJBZGRvbkFQSSIsImZvbGRlciIsImlzRW5hYmxlZCIsInRvZ2dsZSIsInJlbG9hZCIsImdldEFsbCIsImsiLCJhIiwiUGx1Z2lucyIsIlRoZW1lcyIsIkV2ZW50RW1pdHRlciIsInJlcXVpcmUiLCJldmVudE5hbWUiLCJhcmdzIiwiZW1pdCIsIm9mZiIsImV2ZW50QWN0aW9uIiwicmVtb3ZlTGlzdGVuZXIiLCJzZWxlY3RvcnMiLCJnZXRTZWxlY3RvcnMiLCJzdGFuZGFyZFNpZGViYXJWaWV3IiwiZGVmYXVsdENsYXNzTmFtZSIsInNlbGVjdHMiLCJ1c2VyU2V0dGluZ3NBY2NvdW50IiwicGF5bWVudFNvdXJjZVJvdyIsInN1YlRleHQiLCJkZXNjcmlwdGlvbldyYXBwZXIiLCJ2aWV3Qm9keSIsInVzZXJTZXR0aW5nc1NlY3VyaXR5IiwiQmx1clByaXZhdGUiLCJlcnJvciIsIkRPTVRvb2xzIiwibm9ybWFsaXplZFByZWZpeCIsInJhbmRDbGFzcyIsInN0b3AiLCJoYXNQYXRjaGVkIiwidW5wYXRjaENsYXNzTW9kdWxlcyIsIm1vZHVsZUZpbHRlciIsInJldmVydEVsZW1lbnQiLCJwYXRjaENsYXNzTW9kdWxlcyIsIm5vcm1hbGl6ZUVsZW1lbnQiLCJwYXRjaERPTU1ldGhvZHMiLCJtb2R1bGUiLCJwYXRjaENsYXNzTW9kdWxlIiwidW5wYXRjaENsYXNzTW9kdWxlIiwic2hvdWxkSWdub3JlIiwiaXNOYU4iLCJlbmRzV2l0aCIsInN0YXJ0c1dpdGgiLCJBcnJheSIsImlzQXJyYXkiLCJfX2VzTW9kdWxlIiwiYmFzZUNsYXNzTmFtZSIsImNvbXBvbmVudE5hbWUiLCJjbGFzc05hbWVzIiwibm9ybWFsQ2xhc3MiLCJjYW1lbENhc2UiLCJzIiwiaSIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJuZXdTdHJpbmciLCJ0cmltIiwiZWxlbWVudCIsImNsYXNzZXMiLCJjIiwiY2xlbiIsIm5ld0NsYXNzIiwiYWRkIiwiY2hpbGQiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJ0b1JlbW92ZSIsImNvbnRhaW5zIiwiRE9NVG9rZW5MaXN0IiwidG9rZW4iLCJ0b2tlbnMiLCJ0IiwiQ29sb3JlZFRleHQiLCJpbmplY3RDb2xvcmVkVGV4dCIsImNhbmNlbENvbG9yZWRUZXh0IiwiTWVzc2FnZUNvbXBvbmVudCIsImJlZm9yZSIsIm1ldGhvZEFyZ3VtZW50cyIsImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQiLCJtZXNzYWdlQ29udGVudCIsImRpc3BsYXlOYW1lIiwib3JpZ2luYWxUeXBlIiwiX19vcmlnaW5hbE1ldGhvZCIsInJvbGVDb2xvciIsImNvbG9yU3RyaW5nIiwiY29sb3IiLCJhc3NpZ24iLCJyZW1vdmVDb2xvcmVkVGV4dCIsImNsYXNzTmFtZU1hcmt1cCIsIm1hcmt1cCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJlbGVtIiwic2V0UHJvcGVydHkiLCJwYXRoIiwiZnMiLCJNb2R1bGUiLCJnbG9iYWxQYXRocyIsInJlc29sdmUiLCJyZW1vdGUiLCJhcHAiLCJnZXRBcHBQYXRoIiwiTWV0YUVycm9yIiwib3JpZ2luYWxKU1JlcXVpcmUiLCJfZXh0ZW5zaW9ucyIsIm9yaWdpbmFsQ1NTUmVxdWlyZSIsInNwbGl0UmVnZXgiLCJlc2NhcGVkQXRSZWdleCIsImFkZG9uQ2FjaGUiLCJ0aW1lQ2FjaGUiLCJ3YXRjaGVycyIsInBhdGNoRXh0ZW5zaW9ucyIsImdldENvbnRlbnRSZXF1aXJlIiwicGx1Z2luc0ZvbGRlciIsIl9wbHVnaW5zRm9sZGVyIiwicmVhbHBhdGhTeW5jIiwiZGF0YVBhdGgiLCJ0aGVtZXNGb2xkZXIiLCJfdGhlbWVzRm9sZGVyIiwibG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUiLCJkYXRhU3RvcmUiLCJnZXRTZXR0aW5nR3JvdXAiLCJzZXRTZXR0aW5nR3JvdXAiLCJlbmNyeXB0U2V0dGluZ3NDYWNoZSIsIkpTT04iLCJwYXJzZSIsImRlY3J5cHRTZXR0aW5nc0NhY2hlIiwiaGFzaCIsInJlc3VsdCIsInN1c3BlY3QiLCJzYXZlQWRkb25DYWNoZSIsInN0cmluZ2lmeSIsIndhdGNoQ29udGVudCIsImNvbnRlbnRUeXBlIiwiaXNQbHVnaW4iLCJiYXNlRm9sZGVyIiwiZmlsZUVuZGluZyIsIndhdGNoIiwicGVyc2lzdGVudCIsImV2ZW50VHlwZSIsImZpbGVuYW1lIiwiUHJvbWlzZSIsInIiLCJzZXRUaW1lb3V0Iiwic3RhdFN5bmMiLCJlcnIiLCJjb2RlIiwidW5sb2FkUGx1Z2luIiwidW5sb2FkVGhlbWUiLCJpc0ZpbGUiLCJzdGF0cyIsIm10aW1lIiwiZ2V0VGltZSIsImxvYWRQbHVnaW4iLCJsb2FkVGhlbWUiLCJyZWxvYWRQbHVnaW4iLCJyZWxvYWRUaGVtZSIsInVud2F0Y2hDb250ZW50IiwiY2xvc2UiLCJleHRyYWN0TWV0YSIsImZpcnN0TGluZSIsImhhc09sZE1ldGEiLCJwYXJzZU9sZE1ldGEiLCJoYXNOZXdNZXRhIiwicGFyc2VOZXdNZXRhIiwibWV0YSIsInJhd01ldGEiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImluZGV4T2YiLCJwYXJzZWQiLCJmb3JtYXQiLCJibG9jayIsIm91dCIsImZpZWxkIiwiYWNjdW0iLCJsaW5lIiwiY2hhckF0IiwibCIsInN1YnN0ciIsInNlbGYiLCJvcmlnaW5hbFJlcXVpcmUiLCJwb3NzaWJsZVBhdGgiLCJiYXNlbmFtZSIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzdHJpcEJPTSIsImFkZGVkIiwiYXRpbWVNcyIsIm1vZGlmaWVkIiwibXRpbWVNcyIsInNpemUiLCJfY29tcGlsZSIsImRpZEV4cG9ydCIsImlzRW1wdHkiLCJleHBvcnRzIiwibWFrZVBsYWNlaG9sZGVyUGx1Z2luIiwiZ2V0TmFtZSIsImdldEF1dGhvciIsImdldERlc2NyaXB0aW9uIiwic291cmNlIiwid2Vic2l0ZSIsImxvYWRDb250ZW50IiwicHJvY2Vzc0ZpbGUiLCJ0aW1lc3RhbXAiLCJmaWxlIiwiaGFybSIsInN0YWNrIiwidW5sb2FkQ29udGVudCIsImNhY2hlIiwiaXNMb2FkZWQiLCJyZWxvYWRDb250ZW50IiwiY2FudFVubG9hZCIsImxvYWROZXdDb250ZW50IiwiYmFzZWRpciIsImZpbGVzIiwicmVhZGRpclN5bmMiLCJjb250ZW50TGlzdCIsInZhbHVlcyIsInJlbW92ZWQiLCJmIiwibG9hZEFsbENvbnRlbnQiLCJlcnJvcnMiLCJsb2FkUGx1Z2lucyIsImxvYWRUaGVtZXMiLCJjb25maWciLCJoYXNTdGFydGVkIiwiZmxhdCIsInZlcnNpb24iLCJFRCIsIldlYlNvY2tldCIsInBhdGNoQXR0cmlidXRlcyIsImluaXRTZXR0aW5ncyIsImNoZWNrRm9yR3VpbGRzIiwiaW5pdGlhbGl6ZSIsImluaXRpYWxpemVTZXR0aW5ncyIsImNvbnRlbnRNYW5hZ2VyIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwiY2xpY2siLCJQbHVnaW5DZXJ0aWZpZXIiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiaW5pdE9ic2VydmVyIiwic2hvd0NvbnRlbnRFcnJvcnMiLCJwbHVnaW5zIiwidGhlbWVzIiwicHJldmlvdXNWZXJzaW9uIiwic2hvd0NoYW5nZWxvZ01vZGFsIiwiRW1vamlNb2R1bGUiLCJwYXRjaFNvY2lhbCIsInBhdGNoR3VpbGRQaWxscyIsInBhdGNoR3VpbGRMaXN0SXRlbXMiLCJwYXRjaEd1aWxkU2VwYXJhdG9yIiwicGF0Y2hNZXNzYWdlSGVhZGVyIiwicGF0Y2hNZW1iZXJMaXN0IiwicGF0Y2hBdHRhY2htZW50IiwiaGF2ZUluc3RhbGxlZERlZmF1bHQiLCJvbkNsb3NlIiwibG9nbyIsImlubmVySFRNTCIsImF0dHJpYnNQYXRjaHMiLCJjYW5jZWxQYXRjaEF0dHJpYnV0ZXMiLCJBbmNob3IiLCJlbnN1cmVFeHBvcnRlZCIsInRoZW4iLCJEaXNjb3JkVGFnIiwiRGlzY29yZFRhZ0NvbXAiLCJiYWRnZURpdiIsIm1hcmdpblRvcCIsInVzZXIiLCJUb29sdGlwV3JhcCIsInNpZGUiLCJocmVmIiwidGFyZ2V0IiwiQkRMb2dvIiwiTGlnaHRjb3JkTG9nbyIsImFwcGx5QmFkZ2VzIiwidGltZXNDaGVja2VkIiwid3JhcHBlciIsImd1aWxkQ2xhc3NlcyIsImd1aWxkIiwibGlzdEl0ZW0iLCJibG9iIiwiYmxvYkNvbnRhaW5lciIsImRlZmVyTG9hZGVkIiwicmVhZHlTdGF0ZSIsImluamVjdEV4dGVybmFscyIsInNhdmVTZXR0aW5ncyIsImxvYWRTZXR0aW5ncyIsInNldHRpbmciLCJnZXRQcmVkaWNhdGVTZWN0aW9ucyIsInNldHRpbmdNb2R1bGUiLCJzZWN0aW9uIiwicG9wZWQiLCJwb3AiLCJyZW5kZXJTaWRlYmFyIiwiY2xhc3NOYW1lTGF5ZXIiLCJjbGFzc05hbWVTb2NpYWxMaW5rcyIsImNsYXNzTmFtZU1vZGFsIiwibWFpbk9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsIm1sZW4iLCJtdXRhdGlvbiIsInJhd09ic2VydmVyIiwiYWRkZWROb2RlcyIsImFuaW1hdGluZyIsInNvY2lhbExpbmtzIiwibW9kYWwiLCJpbm5lciIsInJlc3BvbnNpdmVXaWR0aE1vYmlsZSIsImdldEF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsInBhcmVudEVsZW1lbnQiLCJvYnNlcnZlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsInNvY2lhbFBhdGNoIiwiVGFiQmFyIiwic29jaWFsTW9kdWxlMSIsIm9yaWdpbmFsIiwibmV3T25lIiwicmV0dXJuVmFsIiwibGluayIsImNsYXNzTmFtZUNvbG9yTXV0ZWQiLCJzaXplcyIsImNsYXNzTmFtZVZlcnNpb25IYXNoIiwiY29sb3JNdXRlZCIsInNpemUzMiIsInZlcnNpb25IYXNoIiwiYnJhbmNoIiwiYWRkaXRpb25hbCIsInJlYWN0Iiwic2l6ZTEyIiwiZWxlY3Ryb24iLCJnZXRHbG9iYWwiLCJjb21taXQiLCJvcmlnaW5hbFZlcnNpb25zIiwiZ2V0R3VpbGRDbGFzc2VzIiwiZ3VpbGRzV3JhcHBlciIsImZpbmRCeVByb3BzIiwiZ3VpbGRzIiwicGlsbCIsImd1aWxkTGlzdEl0ZW1zUGF0Y2giLCJHdWlsZENsYXNzZXMiLCJsaXN0SXRlbUNsYXNzIiwiYmxvYkNsYXNzIiwicmVhY3RJbnN0YW5jZSIsIkd1aWxkQ29tcG9uZW50IiwicmV0dXJuIiwidGhpc09iamVjdCIsImd1aWxkRGF0YSIsInVucmVhZCIsInNlbGVjdGVkIiwiYXVkaW8iLCJ2aWRlbyIsImJhZGdlIiwiYW5pbWF0YWJsZSIsImd1aWxkUGlsbFBhdGNoIiwiZ3VpbGRQaWxsIiwiaG92ZXJlZCIsImd1aWxkU2VwYXJhdG9yUGF0Y2giLCJHdWlsZHMiLCJndWlsZENvbXBvbmVudHMiLCJHdWlsZFNlcGFyYXRvciIsIlNlcGFyYXRvciIsIkF0dGFjaG1lbnRQYXRjaCIsIkF0dGFjaG1lbnQiLCJhdHRhY2htZW50IiwiZ2V0TmVzdGVkUHJvcCIsInBhdGNoIiwibWVzc2FnZUhlYWRlclBhdGNoIiwiTWVzc2FnZUhlYWRlciIsImNoYXQiLCJuZXh0VGljayIsImdldEVsZW1lbnRCeUlkIiwiY2hpbGROb2RlcyIsImJsb2NrRGl2IiwiZGlzdGFudCIsImdldEJhZGdlcyIsImJhZGdlcyIsInN2ZyIsIndpZHRoIiwic2NvcGVzIiwic2NvcGUiLCJjb21wb25lbnQiLCJkaXYyIiwicmVhY3REb20iLCJtZW1iZXJMaXN0UGF0Y2giLCJNZW1iZXJMaXN0SXRlbSIsInJlbmRlckRlY29yYXRvcnMiLCJ1cGRhdGVJbmplY3RvciIsImluamVjdGlvblBhdGgiLCJfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyIsInJlbGVhc2VDaGFubmVsIiwiZ2xvYmFscyIsImdldFJlbGVhc2VDaGFubmVsIiwiZW52IiwiQVBQREFUQSIsIkhPTUUiLCJYREdfQ09ORklHX0hPTUUiLCJzdGFibGUiLCJjYW5hcnkiLCJwdGIiLCJwbHVnaW5EYXRhIiwiQkRGaWxlIiwid3JpdGVGaWxlU3luYyIsInNldHRpbmdzRmlsZSIsInVubGlua1N5bmMiLCJfaW5qZWN0aW9uUGF0aCIsImJhc2UiLCJyb2FtaW5nQmFzZSIsImdldFBhdGgiLCJyb2FtaW5nTG9jYXRpb24iLCJyZWFsTG9jYXRpb24iLCJjb25maWdGaWxlIiwiX2NvbmZpZ0ZpbGUiLCJfQkRGaWxlIiwiX3NldHRpbmdzRmlsZSIsImdldFBsdWdpbkZpbGUiLCJEZXZNb2RlIiwiZGVidWdMaXN0ZW5lciIsImNvcHlTZWxlY3Rvckxpc3RlbmVyIiwic3RhcnREZWJ1Z0xpc3RlbmVyIiwic3RhcnRDb3B5U2VsZWN0b3IiLCJzdG9wRGVidWdMaXN0ZW5lciIsInN0b3BDb3B5U2VsZWN0b3IiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInN0b3BQcm9wYWdhdGlvbiIsInNlbGVjdG9yIiwiZ2V0U2VsZWN0b3IiLCJjbGFzc0xheWVyIiwiY2xhc3NJdGVtcyIsImRpc2FibGVkUG9pbnRlckV2ZW50cyIsIm1lbnUiLCJhdHRhY2giLCJjbSIsInF1ZXJ5IiwiY29udGFpbmVyIiwibGF5ZXJDb250YWluZXIiLCJjbVdyYXAiLCJzdHlsZUZsZXhpYmxlIiwiYWNjb21tb2RhdGVTY3JvbGxiYXIiLCJhcHBlbmQiLCJjbGllbnRZIiwiY2xpZW50WCIsInNjcm9sbGVyQ2xhc3NlcyIsInNjcm9sbGVyV3JhcCIsInNjcm9sbGVyVGhlbWVkIiwidGhlbWVHaG9zdEhhaXJsaW5lIiwic2Nyb2xsZXIiLCJyZW1vdmVDTSIsImtleUNvZGUiLCJjbWciLCJjbWkiLCJpdGVtIiwibGFiZWxDb250YWluZXIiLCJjb2xvckRlZmF1bHQiLCJsYWJlbCIsIk5hdGl2ZU1vZHVsZSIsImNvcHkiLCJlbGVtZW50cyIsInF1ZXJ5QWxsIiwiZm9jdXNlZCIsInNlcGFyYXRvciIsInNjcm9sbEhlaWdodCIsImZ1bGxQYXRoIiwiZWwiLCJuYW1lcyIsInBhcmVudE5vZGUiLCJ1bnNoaWZ0Iiwib3duZXJEb2N1bWVudCIsInRhZ05hbWUiLCJlbnRyaWVzIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsIkRpc2FibGVUeXBpbmciLCJzdGFydFR5cGluZyIsInR5cGluZ01vZHVsZSIsImRpc2FibGVkIiwic3RvcFR5cGluZyIsInJhbmRvbSIsInYiLCJhd2FpdGluZ0JhZGdlc1Byb21pc2VzIiwiYmFkZ2VzVG9GZXRjaCIsIkRpc3RhbnRTZXJ2ZXIiLCJfY2FjaGUiLCJuZXdQcm9taXNlIiwicmVzIiwiQ29uc3RhbnRzIiwiZGVmYXVsdFVzZXJzIiwiZmV0Y2hlZEJhZGdlcyIsInVzZXJzIiwiaGFuZGxlUmVxdWVzdCIsIlJvdXRlcyIsInN0YXR1cyIsInJlc3BvbnNlQm9keSIsImpzb24iLCJwcm9taXNlIiwidXNlcl9pZCIsImNhdGNoIiwiTGlnaHRjb3JkRXJyb3IiLCJyb3V0ZSIsInJlamVjdCIsIm5vZGVGZXRjaCIsIlNFUlZFUl9VUkwiLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsIkJ1Z0h1bnRlckJhZGdlIiwiQ2lyY3VzIiwiaGVhZCIsInNjcmlwdCIsInNyYyIsIm9ubG9hZCIsImFuaW1hdGUiLCJfIiwidXBkYXRlIiwicGVyZm9ybWFuY2UiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ0aW1lIiwidGltZUZyYWN0aW9uIiwicHJvZ3Jlc3MiLCJRIiwicGFyc2VIVE1MIiwiaXNIVE1MIiwiTm9kZUxpc3QiLCJzb21lIiwibiIsIm5vZGVUeXBlIiwiYmFzZUVsZW1lbnQiLCJodG1sIiwiZnJhZ21lbnQiLCJ0ZW1wbGF0ZSIsImNsb25lTm9kZSIsImVzY2FwZUhUTUwiLCJ0ZXh0Tm9kZSIsImNyZWF0ZVRleHROb2RlIiwic3BhbkVsZW1lbnQiLCJub2RlVmFsdWUiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwidG9nZ2xlQ2xhc3MiLCJjbGFzc25hbWUiLCJpbmRpY2F0b3IiLCJoYXNDbGFzcyIsImV2ZXJ5IiwicmVwbGFjZUNsYXNzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJhcHBlbmRUbyIsInRoaXNOb2RlIiwidGhhdE5vZGUiLCJwcmVwZW5kVG8iLCJwcmVwZW5kIiwiaW5zZXJ0QWZ0ZXIiLCJ0YXJnZXROb2RlIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJuZXdOb2RlIiwibmV4dCIsIm5leHRBbGwiLCJuZXh0VW50aWwiLCJtYXRjaGVzIiwicHJldmlvdXMiLCJwcmV2aW91c0FsbCIsInByZXZpb3VzVW50aWwiLCJpbmRleEluUGFyZW50IiwibnVtIiwicGFyZW50IiwiZmluZENoaWxkIiwiZmluZENoaWxkcmVuIiwicGFyZW50cyIsImNsb3Nlc3QiLCJwYXJlbnRzVW50aWwiLCJzaWJsaW5ncyIsImF0dHJpYnV0ZSIsImdsb2JhbCIsImdldENvbXB1dGVkU3R5bGUiLCJoZWlnaHQiLCJ0ZXh0Q29udGVudCIsIm91dGVyV2lkdGgiLCJvZmZzZXRXaWR0aCIsIm91dGVySGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0Iiwib2Zmc2V0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibGlzdGVuZXJzIiwiX2xpc3RlbmVycyIsIm9uIiwiZXZlbnQiLCJkZWxlZ2F0ZSIsIm5hbWVzcGFjZSIsImhhc0RlbGVnYXRlIiwiZXZlbnRGdW5jIiwiY2FuY2VsIiwibmV3Q2FuY2VsIiwib25jZSIsIl9fb2ZmQWxsIiwibWF0Y2hGaWx0ZXIiLCJsaXN0ZW5lciIsImRlZmF1bHRGaWx0ZXIiLCJvbk1vdW50Q2hhbmdlIiwib25Nb3VudCIsIndyYXBwZWRDYWxsYmFjayIsIm9ic2VydmVyIiwibm9kZXMiLCJyZW1vdmVkTm9kZXMiLCJkaXJlY3RNYXRjaCIsInBhcmVudE1hdGNoIiwib25Vbm1vdW50Iiwib25BZGRlZCIsIndyYXAiLCJkb21XcmFwcGVyIiwicmVzb2x2ZUVsZW1lbnQiLCJFbW9qaVJlZ2V4IiwiQ3VzdG9tRW1vamlNb2R1bGUiLCJDdXN0b21FbW9qaSIsIkVtb2ppTW9kdWxlQXBpIiwiZ2V0Q3VzdG9tRW1vamlCeUlkIiwiQXV0b2NvbXBsZXRlTW9kdWxlIiwiQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMiLCJnZXRBdXRvY29tcGxldGVPcHRpb25zIiwiRW1vamlNb2R1bGVRdWVyeSIsInF1ZXJ5RW1vamlSZXN1bHRzIiwiTWVzc2FnZXMiLCJFTU9KSV9NQVRDSElORyIsImd1aWxkTW9kdWxlIiwiZ2V0R3VpbGQiLCJnZXRHdWlsZHMiLCJpc0ZldGNoaW5nIiwiZW1vamlTZWFyY2giLCJnZXREaXNhbWJpZ3VhdGVkRW1vamlDb250ZXh0IiwiTElHSFRDT1JEX0VNT0pJUyIsImFyZzEiLCJhcmcyIiwiY29uZGl0aW9uIiwic2V0RW1vamlVc2FibGUiLCJxdWVyeVJlc3VsdHMiLCJyZXN1bHRzIiwicmVuZGVyUmVzdWx0cyIsIkQiLCJlbW9qaXMiLCJFTU9KSSIsIkVtb2ppIiwiZW1vamkiLCJ1bmlxdWVOYW1lIiwic2VudGluZWwiLCJndWlsZElkIiwiZ2V0UGxhaW5UZXh0IiwiaXNBbmltYXRlZCIsImFuaW1hdGVkIiwibWFuYWdlZCIsIm9yaWdpbmFsTmFtZSIsImdldFJhd1RleHQiLCJjYW5jZWxFbW9qaVJlbmRlciIsImNhbmNlbEVtb3RlUmVuZGVyIiwibmV3Q29udGVudCIsImhhc1BhcnNlZCIsImV4ZWMiLCJyYXciLCJ3b3JkcyIsIndvcmQiLCJhcnIiLCJlbW9qaUlkIiwianVtYm9hYmxlIiwicmVkdWNlIiwiY3VycmVudCIsInNoaWZ0IiwibyIsInUiLCJkIiwib25DbGljayIsIm9uSG92ZXIiLCJSIiwicHJlZml4IiwiVGl0bGUiLCJFbW9qaUZpbHRlck1vZHVsZSIsImlzRW1vamlEaXNhYmxlZCIsImlzVXNhYmxlIiwidXNhYmxlIiwic3Vycm9nYXRlcyIsImRpdmVyc2l0eSIsImNhY2hlMiIsInByb2Nlc3NBdHRhY2htZW50IiwiaXNUcnVzdGVkIiwiY2hlY2tWaXJ1c2VzIiwicmVzdWx0Q2FsbGJhY2siLCJyZW1vdmVDYWxsYmFjayIsImlzSGFybWZ1bCIsImtleXdvcmQiLCJvb2YiLCJub19jb21tZW50cyIsInJlZ2V4cHMiLCJyZWdleCIsImhhc2hUb1VybCIsImNoZWNrSGFzaCIsImdldEN1cnJlbnRXZWJDb250ZW50cyIsInVzZXJBZ2VudCIsIl9fcGF0aCIsImlzRnJvbUxvYWRlciIsImNyeXB0byIsImFsbG9jIiwiY3JlYXRlUmVhZFN0cmVhbSIsImNodW5rIiwiY29uY2F0IiwiaGFzaFJlc3VsdCIsImRpZ2VzdCIsInJlbmRlclRvRWxlbWVudHMiLCJmbG93ZXJTdGFyTW9kdWxlIiwiZmxvd2VyU3RhckNvbnRhaW5lciIsImNoaWxkTW9kdWxlIiwiY2hpbGRDb250YWluZXIiLCJib3JkZXJDb2xvciIsIm5leHROb2RlIiwiY29uZmlybVRleHQiLCJkYW5nZXIiLCJvbkNhbmNlbCIsIm9uQ29uZmlybSIsInNoZWxsIiwib3BlbkV4dGVybmFsIiwidG9vbHRpcFdyYXAiLCJ2aWV3Qm94IiwieCIsInkiLCJtYXNrIiwiZmlsbCIsInBvaW50ZXJFdmVudHMiLCJvZmZpY2lhbCIsInNwYW4iLCJmbG9hdCIsImZsb3dlclN0YXIiLCJnZXRLZXllZEFycmF5IiwiYnVmZmVyIiwiaW5zdGFsbFBhdGgiLCJjdXJzb3IiLCJzdHJva2UiLCJzYXZlIiwiT2JqZWN0U3RvcmFnZSIsImxvY2FsU3RvcmFnZU1vZHVsZSIsImxvY2FsU3RvcmFnZSIsImltcGwiLCJidG9hIiwic2V0SW50ZXJ2YWwiLCJzYWZlSlNPTlBhcnNlIiwiYXRvYiIsImdlbmVyYXRlS2V5IiwiZGVjaXBoZXIiLCJkZWNyeXB0ZWQiLCJmaW5hbCIsImNpcGhlciIsImVuY3J5cHRlZCIsIlBsdWdpbk1vZHVsZSIsImxvYWRQbHVnaW5EYXRhIiwibG9hZCIsInNhdmVQbHVnaW5EYXRhIiwiY2hhbm5lbFN3aXRjaCIsInN0YXJ0UGx1Z2luIiwic3RvcFBsdWdpbiIsImVuYWJsZVBsdWdpbiIsImRpc2FibGVQbHVnaW4iLCJ0b2dnbGVQbHVnaW4iLCJwIiwiZmlsZW5hbWVPck5hbWUiLCJiZHBsdWdpbiIsImRlbGV0ZSIsImVkaXQiLCJvcGVuSXRlbSIsInVwZGF0ZVBsdWdpbkxpc3QiLCJzYXZlZCIsIm5ld01lc3NhZ2UiLCJvbk1lc3NhZ2UiLCJvblN3aXRjaCIsInBvcG91dFdpbmRvdyIsIndpbmRvd3MiLCJNYXAiLCJwb3BvdXRNb2R1bGUiLCJnZXRXaW5kb3ciLCJzZXRJbW1lZGlhdGUiLCJiZEV2ZW50cyIsInJlbW92ZVRoZW1lcyIsImFwcGx5VGhlbWVzIiwidGhlbWVOYW1lIiwidGhlbWUiLCJleGlzdGluZyIsInVuZXNjYXBlIiwicmVtb3ZlQXR0cmlidXRlIiwiVjJfUHVibGljU2VydmVycyIsIl9hcHBlbmRCdXR0b24iLCJWMkNfUHVibGljU2VydmVycyIsInJvb3RJZCIsImJ1dHRvbiIsImJ0biIsImNpcmNsZUJ1dHRvbk1hc2siLCJjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lciIsImRvd25sb2FkUHJvZ3Jlc3MiLCJ0dXRvcmlhbENvbnRhaW5lciIsImFkZEJ1dHRvbiIsImd1aWxkUGF0Y2giLCJHdWlsZExpc3QiLCJ3ZWJwYWNrTW9kdWxlcyIsIkd1aWxkTGlzdE9sZCIsInJlbW92ZUJ1dHRvbiIsIkJEU2lkZWJhckhlYWRlciIsIlB1cmVDb21wb25lbnQiLCJzaWRlYmFyQ29tcG9uZW50cyIsIkhlYWRlciIsIkl0ZW0iLCJjaGFuZ2Vsb2dCdXR0b24iLCJIaXN0b3J5IiwicmVuZGVyZWQiLCJpc0NsZWFyaW5nQ2FjaGUiLCJWMl9TZXR0aW5nc1BhbmVsIiwidXBkYXRlU2V0dGluZ3MiLCJzaWRlYmFyIiwiVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIiwicmVnaXN0ZXJDb21wb25lbnRzIiwicmVnaXN0ZXIiLCJtYWtlQ29tcG9uZW50IiwibGlnaHRjb3JkQ29tcG9uZW50IiwiUHJlc2VuY2VDb21wb25lbnQiLCJBY2NvdW50SW5mb3NDb21wb25lbnQiLCJBcGlQcmV2aWV3Q29tcG9uZW50IiwiY29yZUNvbXBvbmVudCIsImN1c3RvbUNzc0NvbXBvbmVudCIsInJlbmRlckFkZG9uUGFuZSIsImNvcmVTZXR0aW5ncyIsImdldFNldHRpbmdzIiwiY2F0ZWdvcmllcyIsIlNldCIsInNlY3Rpb25zIiwibGlnaHRjb3JkU2V0dGluZ3MiLCJQcmVzZW5jZVNldHRpbmdzIiwiY2hlY2tlZCIsInB1YmxpY1NlcnZlcnNNb2R1bGUiLCJ2b2ljZU1vZGUiLCJ0ZkhvdXIiLCJjb2xvcmVkVGV4dCIsImRNb2RlIiwiU2V0dGluZ3MiLCJkZXZNb2RlIiwiY2FsbFJpbmdpbmdCZWF0Iiwic2V0dGluZ3NTdG9yZSIsInNob3dDdXJyZW50R2FtZSIsInVwZGF0ZVJlbW90ZVNldHRpbmdzIiwiZ2V0Q3VycmVudFdpbmRvdyIsInNldEFsd2F5c09uVG9wIiwiQW50aUFkRE0iLCJibHVyUHJpdmF0ZSIsImRpc2FibGVUeXBpbmciLCJhcHBTZXR0aW5ncyIsInJlbGF1bmNoIiwiZXhpdCIsImNvcmUiLCJOb3RpZmljYXRpb25zVXNlU2hpbSIsIlNlY3Rpb25lZFNldHRpbmdzUGFuZWwiLCJNYXJnaW5Ub3AiLCJpc0NoZWNrZWQiLCJTd2l0Y2giLCJDb21wb25lbnRzIiwiaW5wdXRzIiwiQnV0dG9uIiwibG9vayIsImhvdmVyQ29sb3IiLCJpcGMiLCJzZW5kIiwiYXJndiIsInF1aXQiLCJzZXNzaW9uIiwiY2xlYXJDYWNoZSIsIlYyQ19QcmVzZW5jZVNldHRpbmdzIiwiVjJDX0FjY291bnRJbmZvcyIsIkFwaVByZXZpZXciLCJDc3NFZGl0b3IiLCJDb250ZW50TGlzdCIsIm9yaWdpbmFsUmVuZGVyIiwiZW51bWVyYWJsZSIsIkNhcmRMaXN0IiwiU2V0dGluZ0NvbXBvbmVudCIsInBhbmVscyIsInBhbmVsIiwiZ2V0Q29tcG9uZW50IiwiTENpdGVtcyIsIkxDRGV2SXRlbXMiLCJUaGVtZU1vZHVsZSIsImxvYWRUaGVtZURhdGEiLCJzYXZlVGhlbWVEYXRhIiwiZW5hYmxlVGhlbWUiLCJkaXNhYmxlVGhlbWUiLCJ0b2dnbGVUaGVtZSIsImJkdGhlbWUiLCJ1cGRhdGVUaGVtZUxpc3QiLCJfd2luZG93Q29uZmlnRmlsZSIsInRyYW5zcGFyZW50IiwiZnJhbWUiLCJjaGFyQ29kZUF0IiwiZ2V0VGV4dEFyZWEiLCJjaGFubmVsVGV4dEFyZWEiLCJ0aXRsZVdyYXBwZXIiLCJpbnNlcnRUZXh0IiwidGV4dGFyZWEiLCJmb2N1cyIsInNlbGVjdGlvblN0YXJ0Iiwic2VsZWN0aW9uRW5kIiwiZXhlY0NvbW1hbmQiLCJtb2R1bGVOYW1lIiwiZ3JvdXBDb2xsYXBzZWQiLCJncm91cEVuZCIsImZvcm1hdFN0cmluZyIsInN0cmluZyIsInJlcGxhY2VtZW50IiwiZXNjYXBlIiwicGFyYW1zIiwiaW5zdGVhZCIsInNpbGVudCIsImZvcmNlIiwib3JpZ01ldGhvZCIsImNhbmNlbGVkIiwiY2FuY2VsUGF0Y2giLCJvcmlnaW5hbE1ldGhvZCIsImNhbGxPcmlnaW5hbE1ldGhvZCIsInRlbXBSZXQiLCJfX21vbmtleVBhdGNoZWQiLCJkaXNjb25uZWN0IiwiaGFzTm90aWNlIiwiZm9ybSIsInRvYXN0V3JhcHBlciIsImljb24iLCJ0aW1lb3V0IiwidG9hc3RFbGVtIiwiaW5uZXJUZXh0IiwibW9kYWxNb2R1bGUiLCJoaWRlT25GdWxsc2NyZWVuIiwiaGVhZGVyTW9kdWxlIiwiaGVhZGVyIiwiZm9vdGVyMk1vZHVsZSIsImZvY3VzTG9jayIsImJhY2tkcm9wIiwiYmFja2Ryb3BXaXRoTGF5ZXIiLCJjbG9zaW5nTGlzdGVuZXJzIiwicGx1Z2luRXJyb3JzIiwidGhlbWVFcnJvcnMiLCJnZW5lcmF0ZVRhYiIsInRhYnMiLCJNb2RhbFN0YWNrIiwiQ2hhbmdlbG9nQ2xhc3NlcyIsIlRleHRFbGVtZW50IiwiRmxleENoaWxkIiwiVGl0bGVzIiwiQ2hhbmdlbG9nIiwic2VsZWN0YWJsZSIsIk1hcmtkb3duUGFyc2VyIiwiaW1hZ2UiLCJzdWJ0aXRsZSIsImNlIiwiY2hhbmdlbG9nSXRlbXMiLCJlbnRyeSIsIm1hcmdpbiIsInJlbmRlckhlYWRlciIsIkNoaWxkIiwiZ3JvdyIsInNocmluayIsInRhZyIsIlRhZ3MiLCJINCIsIlNpemVzIiwiU01BTEwiLCJDb2xvcnMiLCJTVEFOREFSRCIsImRhdGUiLCJyZW5kZXJGb290ZXIiLCJBbmNob3JDbGFzc2VzIiwiYW5jaG9yIiwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlciIsImpvaW5TdXBwb3J0U2VydmVyIiwiam9pbkJEMiIsInN1cHBvcnRMaW5rIiwiZGVmYXVsdEZvb3RlciIsIm9uU2Nyb2xsIiwiTW9kYWxBY3Rpb25zIiwiTWFya2Rvd24iLCJDb25maXJtYXRpb25Nb2RhbCIsImVtcHR5RnVuY3Rpb24iLCJvcGVuTW9kYWwiLCJyZWQiLCJtb2RhbEtleSIsIlYyIiwiZWRpdG9yRGV0YWNoZWQiLCJyZXEiLCJ3ZWJwYWNrSnNvbnAiLCJfX2V4dHJhX2lkX18iLCJzaG91bGRQcm90ZWN0IiwidGhlTW9kdWxlIiwiY2xlYXIiLCJzb3J0IiwiZ2V0VG9rZW4iLCJnZXRFbWFpbCIsInNob3dUb2tlbiIsInByb3RlY3QiLCJpc0RlZmF1bHQiLCJtb2QiLCJwcm94eSIsImZ1bmMiLCJfX3Byb3RvX18iLCJwcm9wTmFtZXMiLCJwcm90b05hbWVzIiwicHJvdG9Qcm9wIiwiaW50ZXJuYWwiLCJqb2luQkQxIiwiSW52aXRlQWN0aW9ucyIsImFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwiLCJsZWF2ZUJEMSIsIkd1aWxkQWN0aW9ucyIsImxlYXZlR3VpbGQiLCJsZWF2ZUJEMiIsImpvaW5MQyIsImxlYXZlTEMiLCJyZWFjdENvbXBvbmVudCIsImFuY2hvckNsYXNzZXMiLCJzbGF0ZUVkaXRvckNsYXNzZXMiLCJtZXNzYWdlQ2xhc3NlcyIsInVucmVhZE1lbnRpb25zQmFyIiwiZ3VpbGRzRXJyb3IiLCJNZXNzYWdlQ29udGVudENvbXBvbmVudCIsIlRvb2x0aXBXcmFwcGVyIiwiVG9vbHRpcHMiLCJoaWRlIiwic2hvdyIsInN1Ym1pdCIsImFjdGl2YXRlUmFnaW5nRGVtb24iLCJkaXNtaXNzIiwiS2V5R2VuZXJhdG9yIiwiTGF5ZXJTdGFjayIsIlVzZXJTdG9yZSIsIkNoYW5uZWxTdG9yZSIsIkNoYW5uZWxBY3Rpb25zIiwiUHJpdmF0ZUNoYW5uZWxBY3Rpb25zIiwib3BlbkRNIiwidXNlcklkIiwic2VsZklkIiwicHJpdmF0ZUNoYW5uZWxJZCIsImdldERNRnJvbVVzZXJJZCIsInNlbGVjdFByaXZhdGVDaGFubmVsIiwib3BlblByaXZhdGVDaGFubmVsIiwicGFyc2VTZXR0aW5ncyIsIlZvaWNlTW9kZSIsIm1hcmdpbk1vZHVsZTIiLCJkZWZhdWx0TWFyZ2luaDUiLCJjb2xvck1vZHVsZSIsImNvbG9yU3RhbmRhcmQiLCJzaXplTW9kdWxlIiwic2Nyb2xsYmFyTW9kdWxlMSIsInNjcm9sbGJhckdob3N0SGFpcmxpbmUiLCJHdWlsZE1vZHVsZSIsImdldFJlbGF0aW9uc2hpcHMiLCJzZXNzaW9uTW9kdWxlIiwiZ2V0U2Vzc2lvbnMiLCJzaXplMTQiLCJoNSIsImdldFByb2ZpbGVWYWx1ZSIsImdldFN0YXRpc3RpY3MiLCJnZXRTZXNzaW9uVmFsdWUiLCJtYXJnaW5Cb3R0b20yMCIsInNlc3Npb25zUmF3Iiwic2Vzc2lvbnMiLCJzZXNzaW9uSWQiLCJjbGllbnRJbmZvIiwib3MiLCJjbGllbnQiLCJhY3Rpdml0aWVzIiwicmVwZWF0IiwiY3JlYXRlZEF0IiwiYXZhdGFyVVJMIiwiYXZhdGFyIiwiZ2V0QXZhdGFyVVJMIiwiZ2V0RGF0ZSIsImdldE1vbnRoIiwiZ2V0RnVsbFllYXIiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZmxhZ3MiLCJoYXNQcmVtaXVtU3Vic2NyaXB0aW9uIiwiZW1haWwiLCJtZmFFbmFibGVkIiwibW9iaWxlIiwicGhvbmUiLCJ2ZXJpZmllZCIsIm5zZndBbGxvd2VkIiwicmVsYXRpb25zIiwiZnJpZW5kcyIsImlzRnJpZW5kIiwiaXNCbG9ja2VkIiwiaGlnaHRsaWdodEpTIiwiaGlnaGxpZ2h0IiwibWVzc2FnZU1vZHVsZTEiLCJtZXNzYWdlTW9kdWxlMiIsIkNvZGVDb250ZW50IiwibGlzdExhbmd1YWdlcyIsIl9faHRtbCIsImxhbmd1YWdlIiwibWFyZ2luQm90dG9tOCIsImZvcm1Nb2R1bGUiLCJzdGF0ZXMiLCJGb3JtU2VjdGlvbiIsImFsbENvbXBvbmVudHMiLCJjb21wIiwiY29tcE5hbWUiLCJjb21wUGF0aCIsInJlbmRlcnMiLCJDb21wb25lbnRQcmV2aWV3IiwidGFiIiwiQWxsUHJldmlld3MiLCJnZXRQcm9wcyIsInJlbmRlclByZXZpZXciLCJwYWRkaW5nIiwiYm9yZGVyUmFkaXVzIiwicmVuZGVyQ29kZSIsImdlbmVyYXRlQ29kZSIsImdldFN0ckZvclByb3AiLCJsYW5nIiwiU3RyaW5nIiwiJCR0eXBlb2YiLCJTeW1ib2wiLCJmb3IiLCJjb21wQ2F0ZWdvcnkiLCJwcm9wU3RyaW5ncyIsImNoaWxkcmVuUHJvcCIsInN0ciIsIm9wZW5UYWciLCJjbG9zZVRhZyIsInZpc2libGVLZXkiLCJwcm9wT2JqZWN0IiwiaXNMYXN0IiwiaXNGaXJzdCIsImNoaWxkcmVuRGF0YSIsImhlbHAiLCJzdWNjZXNzIiwic2V0U3RhdGUiLCJtYXJnaW5Cb3R0b20iLCJWMkNfUGx1Z2luQ2FyZCIsInNob3dTZXR0aW5ncyIsInNldEluaXRpYWxTdGF0ZSIsImhhc1NldHRpbmdzIiwiYWRkb24iLCJnZXRTZXR0aW5nc1BhbmVsIiwicmVsb2FkcyIsInRydXN0ZWQiLCJjbG9zZVNldHRpbmdzIiwicGFuZWxSZWYiLCJzZXR0aW5nc09wZW4iLCJjb21wb25lbnREaWRVcGRhdGUiLCJyZWZzIiwic2V0dGluZ3NwYW5lbCIsImlzSGlkZGVuIiwiY1RvcCIsInNjcm9sbFRvcCIsImNCb3R0b20iLCJlVG9wIiwib2Zmc2V0VG9wIiwiZUJvdHRvbSIsImNhcmROb2RlIiwidGhpc05vZGVPZmZzZXQiLCJjb250YWluZXJPZmZzZXQiLCJlbmRQb2ludCIsImdldFN0cmluZyIsInNldHRpbmdzQ29tcG9uZW50IiwicmVmIiwiWFN2ZyIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiYnVpbGRUaXRsZSIsIm5hbWVJbmRleCIsInZlcnNpb25JbmRleCIsImF1dGhvckluZGV4IiwicG9wTGF5ZXIiLCJtYWtlTGluayIsIm1ha2VCdXR0b24iLCJhY3Rpb24iLCJ1bm1vdW50ZWQiLCJsaW5rcyIsImludml0ZSIsInRlc3RlciIsImRvbmF0ZSIsInBhdHJlb24iLCJhdXRob3JJZCIsImF1dGhvckxpbmsiLCJpc1NjYW5uaW5nIiwiVG9vbHRpcCIsImFzY2VuZGluZyIsImlzUGx1Z2lucyIsInJldmVyc2UiLCJvbkFkZG9uQ2hhbmdlcyIsIm9wZW5Gb2xkZXIiLCJvcGVuUGF0aCIsInNob3VsZERlbGV0ZSIsImNvbmZpcm1EZWxldGUiLCJzb3J0T3B0aW9ucyIsImRpcmVjdGlvbnMiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsImdldEFkZG9ucyIsInNvcnRlZEFkZG9ucyIsImIiLCJjYXAiLCJmaXJzdCIsInNlY29uZCIsImxvY2FsZUNvbXBhcmUiLCJyZW5kZXJDaGVja1VwZGF0ZXMiLCJaZXJlc1BsdWdpbkxpYnJhcnkiLCJQbHVnaW5VcGRhdGVzIiwiY2hlY2tBbGwiLCJ0b29sdGlwSXNTaG93aW5nIiwidG9vbHRpcCIsIm1hcmdpbkxlZnQiLCJjaGVja1VwZGF0ZUJ1dHRvbiIsIkVtdWxhdGVkVG9vbHRpcCIsImF0dGFjaEV2ZW50cyIsInJlZnJlc2hJY29uIiwiYWRkb25DYXJkcyIsImZpbGxSdWxlIiwiY2xpcFJ1bGUiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJWMkNfQ2hlY2tib3giLCJjaGVja2JveEVsZW1lbnQiLCJjaGVja2JveCIsImNoZWNrYm94SW5uZXIiLCJTZWxlY3QiLCJkcm9wZG93biIsImNyZWF0ZVJlZiIsInNob3dNZW51IiwiaGlkZU1lbnUiLCJvcHQiLCJpc09wZW4iLCJTZWFyY2giLCJvbktleURvd24iLCJwbGFjZWhvbGRlciIsInN3aXRjaCIsIlYyQ19Db250ZW50Q29sdW1uIiwiY29udGVudE1vZHVsZSIsImNvbnRlbnRDb2x1bW4iLCJjb250ZW50Q29sdW1uRGVmYXVsdCIsIlYyQ19Dc3NFZGl0b3IiLCJsaW5lcyIsImRldGFjaGVkRWRpdG9yIiwiVjJDX0Nzc0VkaXRvckRldGFjaGVkIiwidXBkYXRlQ3NzIiwic2F2ZUNzcyIsImRldGFjaCIsImRldGFjaGVkIiwiZWRpdG9yIiwiYWNlIiwic2V0VGhlbWUiLCJzZXRNb2RlIiwic2V0U2hvd1ByaW50TWFyZ2luIiwic2V0Rm9udFNpemUiLCJkZXN0cm95IiwicHJldlByb3BzIiwicHJldlN0YXRlIiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsImRldGFjaGVkUm9vdCIsImNvZGVNaXJyb3IiLCJsaW5lTnVtYmVycyIsIm1vZGUiLCJpbmRlbnRVbml0Iiwic2Nyb2xsYmFyU3R5bGUiLCJfY2NzcyIsImNjc3MiLCJ1cGRhdGVMaW5lQ291bnQiLCJsaW5lQ291bnQiLCJTZXR0aW5nc1RpdGxlIiwiQ2hlY2tib3giLCJib3JkZXJSaWdodCIsImJvcmRlckxlZnQiLCJmb250U2l6ZSIsImFyZyIsImdldFZhbHVlIiwiZHJvb3QiLCJfcm9vdCIsImluamVjdERldGFjaGVkUm9vdCIsInJvb3QiLCJpbmplY3RSb290IiwiQkRFcnJvckJvdW5kYXJ5IiwiaGFzRXJyb3IiLCJjb21wb25lbnREaWRDYXRjaCIsIkRlbGV0ZSIsIkRvd25BcnJvdyIsIkVkaXQiLCJtYXJnaW5Nb2R1bGUiLCJtYXJnaW5Ub3A2MCIsIlYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyIsInByZXZpZXciLCJpc2ZldGNoaW5nIiwiYXNzZXRDb21wb25lbnRzIiwidXBkYXRlV2hlbkZldGNoZWQiLCJkZWZhdWx0U2V0dGluZyIsIlJQQ1Byb3BzIiwiYXNzZXQiLCJ1cGRhdGVQcmV2aWV3Iiwib3B0aW9uc0NvbXBvbmVudHMiLCJvaGdvZG9oZnVjayIsIl9vcHRpb25zQ29tcG9uZW50cyIsImFycmF5IiwiaW5wdXRUZXh0TW9kdWxlcyIsIklucHV0VGV4dCIsInJlbW92ZUtleWJpbmQiLCJfaG9yaXpvbnRhbCIsImlucHV0TWluaSIsInNpemUxNiIsInNpemUyMCIsImlucHV0IiwibGFzdEVkaXRlZCIsImlzVGltaW5nIiwicm93TW9kdWxlIiwiZmxleE1vZHVsZSIsImlucHV0TW9kdWxlIiwic2l6ZU1vZHVsZTIiLCJyb3ciLCJmbGV4Q2hpbGQiLCJJbnB1dE51bWJlck1vZHVsZXMiLCJJbnB1dE51bWJlciIsImNvbG9yVHJhbnNwYXJlbnQiLCJzZXRWYWx1ZSIsImNsaXBib2FyZCIsIklucHV0Q2hvaWNlTW9kdWxlcyIsIklucHV0Q2hvaWNlIiwiRGl2aWRlck1vZHVsZXMiLCJEaXZpZGVyIiwiZGl2aWRlciIsImRpdmlkZXJEZWZhdWx0IiwiRGlzY29yZEJ1dHRvbiIsIlJwY1ByZXZpZXciLCJhY3RpdmUiLCJjaGFuZ2VUYWIiLCJhbmNpZW50VGFiIiwic2V0QWN0aXZlIiwiZmxleCIsInJwYyIsImlzQWN0aXZlIiwiUHJvZmlsZSIsIlBvcG91dCIsIlRhYiIsImVtcHR5Q2xhc3NlcyIsIlByZXNlbmNlRXJyb3JDYXRjaGVyIiwiZXJySW5mbyIsImVtcHR5U3RhdGVJbWFnZSIsImVtcHR5U3RhdGUiLCJlbXB0eVN0YXRlSGVhZGVyIiwiZW1wdHlTdGF0ZVN1YnRleHQiLCJwb3BvdXRNb2R1bGVzIiwiVXNlclBvcG91dENvbXBvbmVudCIsIlBvcG91dFByb3BzIiwiVXNlclBvcG91dCIsInJlbmRlcjEiLCJjaGFubmVsSWQiLCJkaXNhYmxlVXNlclByb2ZpbGVMaW5rIiwiX1VzZXJQb3BvdXQiLCJwb3BvdXQiLCJleGNsdWRlUHJvcGVydGllcyIsInByb2ZpbGVNb2R1bGVzIiwiVXNlclByb2ZpbGVDb21wb25lbnQiLCJQcm9maWxlUHJvcHMiLCJjb25uZWN0ZWRQcm9maWxlU3RvcmUiLCJVc2VyUHJvZmlsZSIsInJlbmRlcjIiLCJyZW5kZXIzIiwicmVuZGVyNCIsInByb2ZpbGUiLCJjaGFuZ2VDYXRlZ29yeSIsInNlYXJjaEtleURvd24iLCJjaGVja0Nvbm5lY3Rpb24iLCJjb25uZWN0IiwiR3VpbGRTdG9yZSIsIkF2YXRhckRlZmF1bHRzIiwiU29ydGVkR3VpbGRTdG9yZSIsInNlbGVjdGVkQ2F0ZWdvcnkiLCJsb2FkaW5nIiwic2VydmVycyIsImNvbm5lY3Rpb24iLCJmZXRjaCIsInNlcnZlciIsImpvaW5lZCIsImVuZCIsInRlcm0iLCJjYXRlZ29yeUJ1dHRvbnMiLCJ0b3RhbCIsInNidiIsImNvbnRlbnRTY3JvbGxlciIsInNlcnZlckNhcmQiLCJwaW5uZWQiLCJhY2NlcHRJbnZpdGUiLCJpbnZpdGVfY29kZSIsImpvaW5FbmRQb2ludCIsImlkZW50aWZpZXIiLCJjcmVkZW50aWFscyIsIndpbmRvd09wdGlvbnMiLCJyb3VuZCIsInNjcmVlblgiLCJzY3JlZW5ZIiwiam9pbldpbmRvdyIsIkJyb3dzZXJXaW5kb3ciLCJ3ZWJDb250ZW50cyIsImxvYWRVUkwiLCJyZXNpemFibGUiLCJtYXhpbWl6YWJsZSIsIm1pbmltaXphYmxlIiwiYWx3YXlzT25Ub3AiLCJjZW50ZXIiLCJ3ZWJQcmVmZXJlbmNlcyIsIm5vZGVJbnRlZ3JhdGlvbiIsImJkU2VydmVyIiwib25saW5lIiwibWVtYmVycyIsImljb25VcmwiLCJuYXRpdmVqb2luIiwic2VydmVyMiIsImd1aWxkTGlzdCIsImdldEZsYXR0ZW5lZEd1aWxkSWRzIiwiZGVmYXVsdExpc3QiLCJERUZBVUxUX0FWQVRBUlMiLCJTZXJ2ZXJDYXJkIiwiZmFsbGJhY2siLCJmbG9vciIsImNvbm5lY3RFbmRQb2ludCIsInJlc3BvbnNlIiwiU2lkZWJhclZpZXciLCJ0b29scyIsIlRvb2xzIiwiVGFiQmFyU2VwYXJhdG9yIiwic2VhcmNoSW5wdXQiLCJUYWJCYXJIZWFkZXIiLCJUYWJCYXJJdGVtIiwibWF4TGVuZ3RoIiwic2VhcmNoaW5wdXQiLCJub3RDb25uZWN0ZWQiLCJjb2x1bW5Nb2R1bGUiLCJtaW5IZWlnaHQiLCJsaW5lSGVpZ2h0IiwiVjJDX1NlcnZlckNhcmQiLCJpbWFnZUVycm9yIiwiY2FyZE1vZHVsZSIsImNhcmQiLCJjYXJkUHJpbWFyeSIsIl9ob3Jpem9udGFsUmV2ZXJzZSIsIndyYXBNb2R1bGUiLCJub1dyYXAiLCJzdHJlYW1lck1vZGVFbmFibGVkIiwib25FcnJvciIsImhhbmRsZUVycm9yIiwiZHJhZ2dhYmxlIiwiaG9yaXpvbnRhbCIsIlYyQ19TaWRlYmFyVmlldyIsIlNjcm9sbGVyIiwiZmFkZSIsImRhcmsiLCJWMkNfUmVsb2FkSWNvbiIsInhtbG5zIiwiVjJDX1Njcm9sbGVyIiwic2Nyb2xsZXJNb2R1bGUxIiwic2Nyb2xsZXJIb3Jpem9udGFsIiwic2Nyb2xsZXJNb2R1bGUyIiwic2lkZWJhclJlZ2lvblNjcm9sbGVyIiwid3JhcHBlckNsYXNzIiwic2Nyb2xsZXJGYWRlIiwic2Nyb2xsZXJDbGFzcyIsImNvbnRlbnRSZWdpb25TY3JvbGxlciIsImNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXAiLCJ0aGVtZUdob3N0Iiwic2Nyb2xsZXJUcmFjayIsIlYyQ19TZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwiU2V0dGluZ3NHcm91cCIsIlYyQ19TZXR0aW5nc0dyb3VwIiwiYnV0dG9uQ29tcG9uZW50IiwiVjJDX1NldHRpbmdzVGl0bGUiLCJjbGFzc25hbWVzIiwiZ2V0Q2xhc3NOYW1lIiwiU3dpdGNoSXRlbSIsImJldGEiLCJ1c2VyU2V0dGluZ3NWb2ljZSIsIlYyQ19UYWJCYXJIZWFkZXIiLCJWMkNfVGFiQmFySXRlbSIsIlYyQ19UYWJCYXJTZXBhcmF0b3IiLCJWMkNfVG9vbHMiLCJ0b29sc01vZHVsZSIsInRvb2xzQ29udGFpbmVyIiwiY29udGFpbmVyTW9kdWxlIiwiY2xvc2VCdXR0b24iLCJjbG9zZUJ1dHRvbkJvbGQiLCJrZXliaW5kIiwia2V5YmluZEJvbGQiLCJUb29sdGlwQ2xhc3NlcyIsImdldFRvb2x0aXBDbGFzc2VzIiwiVG9vbHRpcExheWVycyIsImdldFRvb2x0aXBMYXllcnMiLCJnZXRDbGFzcyIsInNpZGVPckNvbG9yIiwidXBwZXJDYXNlIiwidG9vbHRpcENsYXNzIiwiY2xhc3NFeGlzdHMiLCJ0b1B4IiwicHJldmVudEZsaXAiLCJ0b29sdGlwRWxlbWVudCIsImxhYmVsRWxlbWVudCIsInRvb2x0aXBDb250ZW50IiwicG9pbnRlckVsZW1lbnQiLCJ0b29sdGlwUG9pbnRlciIsInBvcG91dHMiLCJjYW5TaG93QWJvdmUiLCJjYW5TaG93QmVsb3ciLCJjYW5TaG93TGVmdCIsImNhblNob3dSaWdodCIsIl9jbGFzc05hbWUiLCJzaG93QWJvdmUiLCJzaG93QmVsb3ciLCJzaG93TGVmdCIsInNob3dSaWdodCIsImNlbnRlckhvcml6b250YWxseSIsImNlbnRlclZlcnRpY2FsbHkiLCJub2RlY2VudGVyIiwiZmluZERPTU5vZGUiLCJWMkNfWFN2ZyJdLCJtYXBwaW5ncyI6Ijs7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNsRkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQU8sTUFBTUEscUJBQXFCLEdBQUcsU0FB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RUFBRTtBQUFDeWUsYUFBSyxFQUFFLE1BQVI7QUFBZ0JvTSxjQUFNLEVBQUU7QUFBeEI7QUFBbkUsS0FGRyxFQUdILzJCLG1EQUFJLENBQUN5bkIsS0FBTCxDQUFXdm1CLGFBQVgsQ0FDSSxHQURKLEVBRUk7QUFBQ0MsZUFBUyxFQUFFLFlBQVo7QUFBMEIrK0IsVUFBSSxFQUFFLE1BQWhDO0FBQXdDNGUsY0FBUSxFQUFFO0FBQWxELEtBRkosRUFHSTkrQyxtREFBSSxDQUFDeW5CLEtBQUwsQ0FBV3ZtQixhQUFYLENBQXlCLE1BQXpCLEVBQWlDO0FBQUN5N0IsT0FBQyxFQUFFO0FBQUosS0FBakMsQ0FISixFQUlJMzhCLG1EQUFJLENBQUN5bkIsS0FBTCxDQUFXdm1CLGFBQVgsQ0FBeUIsTUFBekIsRUFBaUM7QUFBQ0MsZUFBUyxFQUFFLE1BQVo7QUFBb0IrK0IsVUFBSSxFQUFFLFNBQTFCO0FBQXFDdkQsT0FBQyxFQUFFO0FBQXhDLEtBQWpDLENBSkosQ0FIRyxDQUFQO0FBVUg7O0FBaEJxRCxDOzs7Ozs7Ozs7OztBQ0YxRCxtQzs7Ozs7Ozs7Ozs7QUNBQSxxQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSwrQjs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSxpQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LmpzXCIpO1xuIiwiZXhwb3J0IGNvbnN0IG1pbmltdW1EaXNjb3JkVmVyc2lvbiA9IFwiMC4wLjMwN1wiO1xyXG5leHBvcnQgY29uc3QgY3VycmVudERpc2NvcmRWZXJzaW9uID0gKHdpbmRvdy5EaXNjb3JkTmF0aXZlICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcCAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAuZ2V0VmVyc2lvbiAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAuZ2V0VmVyc2lvbigpKSB8fCBcIjAuMC4zMDdcIjtcclxuZXhwb3J0IGNvbnN0IG1pblN1cHBvcnRlZFZlcnNpb24gPSBcIjAuMy4wXCI7XHJcbmV4cG9ydCBjb25zdCBiYmRWZXJzaW9uID0gXCIwLjMuNVwiO1xyXG5leHBvcnQgY29uc3QgYmJkQ2hhbmdlbG9nID0ge1xyXG4gICAgZGVzY3JpcHRpb246IFwiQmlnIHRoaW5ncyBhcmUgY29taW5nLlwiLFxyXG4gICAgY2hhbmdlczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGl0bGU6IFwiQnVnIEZpeGVzXCIsXHJcbiAgICAgICAgICAgIHR5cGU6IFwiZml4ZWRcIixcclxuICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIFwiU29tZSBmaXhlcyByZWxhdGVkIHRvIHNob3dpbmcgbW9kYWxzIGluIHRoZSBgQmRBcGlgLlwiLFxyXG4gICAgICAgICAgICAgICAgXCJGaXhlZCB0aGUgb3BlbiBmb2xkZXIgYnV0dG9ucyBmb3IgcGx1Z2lucyBhbmQgdGhlbWVzXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgIF1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXR0aW5ncyA9IHtcclxuICAgIFwiQ3VzdG9tIGNzcyBsaXZlIHVwZGF0ZVwiOiAgICAge2lkOiBcImJkYS1jc3MtMFwiLCBpbmZvOiBcIlwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IHRydWUsICBjYXQ6IFwiY29yZVwifSxcclxuICAgIFwiQ3VzdG9tIGNzcyBhdXRvIHVkcGF0ZVwiOiAgICAge2lkOiBcImJkYS1jc3MtMVwiLCBpbmZvOiBcIlwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IHRydWUsICBjYXQ6IFwiY29yZVwifSxcclxuICAgIFwiQmV0dGVyRGlzY29yZCBCbHVlXCI6ICAgICAgICAge2lkOiBcImJkYS1ncy1iXCIsICBpbmZvOiBcIlJlcGxhY2UgRGlzY29yZCBibHVlIHdpdGggQkQgQmx1ZVwiLCAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IGZhbHNlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIn0sXHJcblxyXG4gICAgLyogQ29yZSAqL1xyXG4gICAgLyogPT09PT09ICovXHJcbiAgICBcIlB1YmxpYyBTZXJ2ZXJzXCI6ICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtMVwiLCAgaW5mbzogXCJEaXNwbGF5IHB1YmxpYyBzZXJ2ZXJzIGJ1dHRvblwiLCAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiTWluaW1hbCBNb2RlXCI6ICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy0yXCIsICBpbmZvOiBcIkhpZGUgZWxlbWVudHMgYW5kIHJlZHVjZSB0aGUgc2l6ZSBvZiBlbGVtZW50cy5cIiwgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJWb2ljZSBNb2RlXCI6ICAgICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTRcIiwgIGluZm86IFwiT25seSBzaG93IHZvaWNlIGNoYXRcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIkhpZGUgQ2hhbm5lbHNcIjogICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtM1wiLCAgaW5mbzogXCJIaWRlIGNoYW5uZWxzIGluIG1pbmltYWwgbW9kZVwiLCAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiRGFyayBNb2RlXCI6ICAgICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy01XCIsICBpbmZvOiBcIk1ha2UgY2VydGFpbiBlbGVtZW50cyBkYXJrIGJ5IGRlZmF1bHQod2lwKVwiLCAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJWb2ljZSBEaXNjb25uZWN0XCI6ICAgICAgICAgICB7aWQ6IFwiYmRhLWRjLTBcIiwgIGluZm86IFwiRGlzY29ubmVjdCBmcm9tIHZvaWNlIHNlcnZlciB3aGVuIGNsb3NpbmcgRGlzY29yZFwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIjI0IEhvdXIgVGltZXN0YW1wc1wiOiAgICAgICAgIHtpZDogXCJiZGEtZ3MtNlwiLCAgaW5mbzogXCJSZXBsYWNlIDEyaHIgdGltZXN0YW1wcyB3aXRoIHByb3BlciBvbmVzXCIsICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiQ29sb3JlZCBUZXh0XCI6ICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy03XCIsICBpbmZvOiBcIk1ha2UgdGV4dCBjb2xvciB0aGUgc2FtZSBhcyByb2xlIGNvbG9yXCIsICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJOb3JtYWxpemUgQ2xhc3Nlc1wiOiAgICAgICAgICB7aWQ6IFwiZm9yay1wcy00XCIsIGluZm86IFwiQWRkcyBzdGFibGUgY2xhc3NlcyB0byBlbGVtZW50cyB0byBoZWxwIHRoZW1lcy4gKGUuZy4gYWRkcyAuZGEtY2hhbm5lbHMgdG8gLmNoYW5uZWxzLUllMmw2QSlcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG5cclxuICAgIC8qIENvbnRlbnQgKi9cclxuICAgIFwiQ29udGVudCBFcnJvciBNb2RhbFwiOiAgICAgICAge2lkOiBcImZvcmstcHMtMVwiLCBpbmZvOiBcIlNob3dzIGEgbW9kYWwgd2l0aCBwbHVnaW4vdGhlbWUgZXJyb3JzXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNjYW4gUGx1Z2luc1wiOiAgICAgICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTZcIiwgaW5mbzogXCJTY2FuIHBsdWdpbnMgZm9yIGFueSB0aHJlYXQgdGhhdCBjYW4gYmUgaGlkZGVuIGluc2lkZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiU2hvdyBUb2FzdHNcIjogICAgICAgICAgICAgICAge2lkOiBcImZvcmstcHMtMlwiLCBpbmZvOiBcIlNob3dzIGEgc21hbGwgbm90aWZpY2F0aW9uIGZvciBpbXBvcnRhbnQgaW5mb3JtYXRpb25cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiU2Nyb2xsIFRvIFNldHRpbmdzXCI6ICAgICAgICAge2lkOiBcImZvcmstcHMtM1wiLCBpbmZvOiBcIkF1dG8tc2Nyb2xscyB0byBhIHBsdWdpbidzIHNldHRpbmdzIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkIChvbmx5IGlmIG91dCBvZiB2aWV3KVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJBdXRvbWF0aWMgTG9hZGluZ1wiOiAgICAgICAgICB7aWQ6IFwiZm9yay1wcy01XCIsIGluZm86IFwiQXV0b21hdGljYWxseSBsb2FkcywgcmVsb2FkcywgYW5kIHVubG9hZHMgcGx1Z2lucyBhbmQgdGhlbWVzXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIkVuYWJsZSBFZGl0IEJ1dHRvblwiOiAgICAgICAgIHtpZDogXCJmb3JrLXBzLTdcIiwgaW5mbzogXCJFbmFibGUgYW4gRWRpdCBCdXR0b24gb24gdGhlIHBsdWdpbiBhbmQgdGhlbWUgcGFuZWwuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlRoZW1lcyBpbiBQb3BvdXQgV2luZG93XCI6ICAgIHtpZDogXCJsaWdodGNvcmQtOVwiLCBpbmZvOiBcIkVuYWJsZSB0aGVtZXMgaW4gUG9wb3V0IFdpbmRvdy4gKEZvciBleGFtcGxlLCB3aGVuIGRldGFjaGluZyBzY3JlZW5zaGFyZS4pXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIiwgZXhwZXJpbWVudGFsOiB0cnVlfSxcclxuXHJcbiAgICAvKiBEZXZlbG9wZXIgKi9cclxuICAgIFwiRGV2ZWxvcGVyIE1vZGVcIjogICAgICAgICBcdCAge2lkOiBcImJkYS1ncy04XCIsIGluZm86IFwiRGV2ZWxvcGVyIE1vZGUgVG9nZ2xlXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXHJcbiAgICBcIkNvcHkgU2VsZWN0b3JcIjpcdFx0XHQgIHtpZDogXCJmb3JrLWRtLTFcIiwgaW5mbzogXCJBZGRzIGEgXFxcIkNvcHkgU2VsZWN0b3JcXFwiIG9wdGlvbiB0byBjb250ZXh0IG1lbnVzIHdoZW4gZGV2ZWxvcGVyIG1vZGUgaXMgYWN0aXZlXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXHJcblxyXG4gICAgLyoqIExpZ2h0Y29yZCAqL1xyXG4gICAgXCJEaXNhYmxlIEJldHRlckRpc2NvcmRcIjogICAgICB7aWQ6IFwiYmQtZGlzYWJsZVwiLCAgaW5mbzogXCJEaXNhYmxlIEJldHRlcmRpc2NvcmQgKHBsdWdpbnMsIHRoZW1lcywgZXRjKSAoTm90IGltcGxlbWVudGVkKS5cIiwgaW1wbGVtZW50ZWQ6IGZhbHNlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQmx1ciBQZXJzb25hbCBJbmZvcm1hdGlvblwiOiAge2lkOiBcImxpZ2h0Y29yZC02XCIsIGluZm86IFwiQmx1ciBzZW5zaXRpdmUgaW5mb3JtYXRpb25zIGxpa2UgZW1haWwsIHBheW1lbnQgaW5mb3MgYW5kIG1vcmUuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQ2FsbGluZyBSaW5nIEJlYXRcIjogICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0yXCIsIGluZm86IFwiRW5hYmxlIERpc2NvcmQncyBzcGVjaWFsIGNhbGxpbmcgYmVhdC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJEZXZlbG9wZXIgT3B0aW9uc1wiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTFcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzICYgTGlnaHRjb3JkJ3MgSW50ZXJuYWwgRGV2ZWxvcGVyIE9wdGlvbnMuIFRoaXMgYWxsb3cgdGhlIFxcXCJFeHBlcmltZW50c1xcXCIgdGFiLCB0aGUgXFxcIkRldmVsb3BlciBPcHRpb25zXFxcIiB0YWIgYW5kIHRoZSBcXFwiTGlnaHRjb3JkIEFwaVxcXCIgc2VjdGlvbi5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJBZCBCbG9ja1wiOiAgICAgICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTRcIiwgaW5mbzogXCJCbG9jayBhbnkgQk9UIHRoYXQgZG1zIHlvdSB3aXRoIGFuIGludml0ZSBsaW5rLiBFdmVuIGluIGFuIGVtYmVkLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkVuYWJsZSBMaWdodGNvcmQgU2VydmVyc1wiOiAgIHtpZDogXCJsaWdodGNvcmQtNVwiLCBpbmZvOiBcIkVuYWJsZSBMaWdodGNvcmQncyBzZXJ2ZXJzLiBEaXNhYmxpbmcgdGhpcyB3aWxsIGRpc2FibGUgY3VzdG9tIGJhZGdlcy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJEaXNhYmxlIHR5cGluZ1wiOiAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTdcIiwgaW5mbzogXCJEb24ndCBsZXQgb3RoZXIgc2VlIHlvdSdyZSB0eXBpbmcuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiTGlnaHRjb3JkIFRhYnNcIjogICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC04XCIsIGluZm86IFwiQWxsb3dzIHlvdSB0byBsYXVuY2ggbXVsdGlwbGUgaW5zdGFuY2VzIG9mIExpZ2h0Y29yZCBpbiB0aGUgc2FtZSB3aW5kb3cuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwiLCBleHBlcmltZW50YWw6IHRydWV9LFxyXG4gICAgXCJVc2UgTm90aWZpY2F0aW9uIFNoaW1cIjogICAgICB7aWQ6IFwibGlnaHRjb3JkLTEwXCIsIGluZm86IFwiQmFzaWNhbGx5IGRvbid0IHVzZSBXaW5kb3dzJ3MgTm90aWZpY2F0aW9ucy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gXCJ3aW4zMlwiLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwiLCBleHBlcmltZW50YWw6IGZhbHNlfSxcclxuXHJcbiAgICAvKiogTGlnaHRjb3JkIFdpbmRvdyAqL1xyXG4gICAgXCJBbHdheXMtb24tVG9wXCI6ICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTNcIiwgaW5mbzogXCJFbmFibGUgdGhlIHdpbmRvdydzIEFsd2F5cy1vbi1Ub3AgbW9kZSwgd2hlcmUgTGlnaHRjb3JkIHN0YXlzIG9uIHRvcCBvZiBvdGhlciBhcHBsaWNhdGlvbnMuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcclxuICAgIFwiTm8gV2luZG93IEJvdW5kc1wiOiAgICAgICAgICAge2lkOiBcIm5vX3dpbmRvd19ib3VuZFwiLCBpbmZvOiBcIkRpc2FibGUgV2luZG93IEJvdW5kcy4gQ2FuIGJlIHVzZWZ1bCBpZiB5b3UgdXNlIGEgd2luZG93IG1hbmFnZXIuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IHByb2Nlc3MucGxhdGZvcm0gIT09IFwibGludXhcIiwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJXaW5kb3dcIn0sXHJcbiAgICBcIkVuYWJsZSBHbGFzc3Ryb25cIjogICAgICAgICAgIHtpZDogXCJlbmFibGVfZ2xhc3N0cm9uXCIsIGluZm86IFwiRW5hYmxlIEdsYXNzdHJvbi4gSWYgeW91J3JlIG5vdCB1c2luZyB0cmFuc3BhcmVudCB0aGVtZXMsIHRoaXMgY2FuIHJlZHVjZSBsYWcuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcclxuICAgIFxyXG4gICAgLyoqIFJpY2hQcmVzZW5jZSAqL1xyXG4gICAgXCJFbmFibGVcIjogICAgICAgICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIiwgaW5mbzogXCJFbmFibGUgUmljaFByZXNlbmNlIGJlbG93LlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcInN0YXR1c1wifVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb29raWUgPSB7XHJcbiAgICBcImJkYS1ncy0xXCI6IHRydWUsXHJcbiAgICBcImJkYS1ncy0yXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtM1wiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTRcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy01XCI6IHRydWUsXHJcbiAgICBcImJkYS1ncy02XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtN1wiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLThcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy0wXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0xXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0yXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy00XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtNlwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtN1wiOiB0cnVlLFxyXG4gICAgXCJiZGEtZ3MtYlwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLThcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWRjLTBcIjogZmFsc2UsXHJcbiAgICBcImJkYS1jc3MtMFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWNzcy0xXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtOVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLWRtLTFcIjogZmFsc2UsXHJcbiAgICBcImZvcmstcHMtMVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTJcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy0zXCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtNFwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTVcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy02XCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtN1wiOiBmYWxzZSxcclxuICAgIFwiZm9yay1lcy0yXCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLWVzLTNcIjogdHJ1ZSxcclxuICAgIFwiZm9yay13cC0xXCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLXdwLTJcIjogZmFsc2UsXHJcbiAgICBcImZvcmstYmV0YVwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtMVwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTJcIjogdHJ1ZSxcclxuICAgIFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC0zXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtNFwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTVcIjogdHJ1ZSxcclxuICAgIFwibGlnaHRjb3JkLTZcIjogdHJ1ZSxcclxuICAgIFwibGlnaHRjb3JkLTdcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC04XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtOVwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTEwXCI6IGZhbHNlLFxyXG4gICAgXCJub193aW5kb3dfYm91bmRcIjogZmFsc2UsXHJcbn07XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IHNldHRpbmdzQ29va2llID0ge307XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3NSUEMgPSB7fTtcclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRSUEMgPSB7XHJcbiAgICBcIm5hbWVcIjogXCJMaWdodGNvcmRcIixcclxuICAgIFwiYXBwbGljYXRpb25faWRcIjogXCI3MTE0MTY5NTc3MTg3NTc0MThcIixcclxuICAgIFwic3RhdGVcIjogXCJMaWdodGNvcmQgQ2xpZW50XCIsXHJcbiAgICBcImRldGFpbHNcIjogXCJCcm93c2luZyBEaXNjb3JkXCIsXHJcbiAgICBcInRpbWVzdGFtcHMuc3RhcnRcIjogRGF0ZS5ub3coKSxcclxuICAgIFwiYXNzZXRzLnNtYWxsXCI6IG51bGwsXHJcbiAgICBcImFzc2V0cy5sYXJnZVwiOiBcIjcxMjMyMzgyMTAzNzY4Mjc5MVwiXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBiZHBsdWdpbkVycm9ycyA9IFtdO1xyXG5leHBvcnQgY29uc3QgYmR0aGVtZUVycm9ycyA9IFtdOyAvLyBkZWZpbmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcblxyXG5leHBvcnQgY29uc3QgYmRDb25maWcgPSBPYmplY3QuY3JlYXRlKEJldHRlckRpc2NvcmRDb25maWcpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGJkdGhlbWVzID0ge307XHJcbmV4cG9ydCBjb25zdCBiZHBsdWdpbnMgPSB7fTtcclxuXHJcbmV4cG9ydCBjb25zdCBwbHVnaW5Db29raWUgPSB7fTtcclxuZXhwb3J0IGNvbnN0IHRoZW1lQ29va2llID0ge307IiwiaW1wb3J0IGxvY2FsU3RvcmFnZUZpeCBmcm9tIFwiLi9sb2NhbFN0b3JhZ2VGaXhcIjtcclxuaW1wb3J0IGxvYWRpbmdJY29uIGZyb20gXCIuL2xvYWRpbmdJY29uXCI7XHJcbmxvY2FsU3RvcmFnZUZpeCgpO1xyXG5sb2FkaW5nSWNvbigpO1xyXG5cclxuY29uc3QgZGVwcmVjYXRlR2xvYmFsID0gKGtleSwgdmFsdWUpID0+IHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIGtleSwge1xyXG4gICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgVXRpbHMud2FybihcIkRlcHJlY2F0ZWQgR2xvYmFsXCIsIGBcIiR7a2V5fVwiIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuIFBsZWFzZSBvbmx5IHVzZSBCZEFwaS5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH0pOyAgXHJcbn07XHJcblxyXG5cclxuaW1wb3J0ICogYXMgR2xvYmFscyBmcm9tIFwiLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgZ2xvYmFsS2V5cyA9IE9iamVjdC5rZXlzKEdsb2JhbHMpO1xyXG5mb3IgKGNvbnN0IGtleSBvZiBnbG9iYWxLZXlzKSBkZXByZWNhdGVHbG9iYWwoa2V5LCBHbG9iYWxzW2tleV0pO1xyXG5cclxuXHJcbmltcG9ydCBCZEFwaSBmcm9tIFwiLi9tb2R1bGVzL2JkQXBpXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vbW9kdWxlcy90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vbW9kdWxlcy9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgQ2xhc3NOb3JtYWxpemVyIGZyb20gXCIuL21vZHVsZXMvY2xhc3NOb3JtYWxpemVyXCI7XHJcblxyXG5kZXByZWNhdGVHbG9iYWwoXCJCRFYyXCIsIEJEVjIpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJwbHVnaW5Nb2R1bGVcIiwgcGx1Z2luTW9kdWxlKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwidGhlbWVNb2R1bGVcIiwgdGhlbWVNb2R1bGUpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJVdGlsc1wiLCBVdGlscyk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkJERXZlbnRzXCIsIEJERXZlbnRzKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwic2V0dGluZ3NQYW5lbFwiLCBzZXR0aW5nc1BhbmVsKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiRGF0YVN0b3JlXCIsIERhdGFTdG9yZSk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkNvbnRlbnRNYW5hZ2VyXCIsIENvbnRlbnRNYW5hZ2VyKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQ2xhc3NOb3JtYWxpemVyXCIsIENsYXNzTm9ybWFsaXplcik7XHJcblxyXG53aW5kb3cuQmRBcGkgPSBCZEFwaTtcclxuXHJcbmltcG9ydCBDb3JlIGZyb20gXCIuL21vZHVsZXMvY29yZVwiO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJtYWluQ29yZVwiLCBDb3JlKTtcclxuXHJcbi8vIFRPRE86IENoYW5nZSBJbml0IG1vZGUgYW5kIHN0b3AgdXNpbmcgQ29yZVdyYXBwZXIuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvcmVXcmFwcGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGJkQ29uZmlnLCBtZXRob2RzKSB7XHJcbiAgICAgICAgQ29yZS5zZXRDb25maWcoYmRDb25maWcpO1xyXG4gICAgICAgIENvcmUuc2V0TWV0aG9kcyhtZXRob2RzKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIC8vIGRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIHRoaXMubWFpbkNvcmUpO1xyXG4gICAgICAgIENvcmUuaW5pdCgpO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xuICAgIGNvbnN0IHYyTG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB2MkxvYWRlci5jbGFzc05hbWUgPSBcImJkLWxvYWRlcnYyXCI7XG4gICAgdjJMb2FkZXIudGl0bGUgPSBcIkJhbmRhZ2VkQkQgaXMgbG9hZGluZy4uLlwiO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodjJMb2FkZXIpO1xufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBjb250ZW50V2luZG93R2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiKS5nZXQ7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgXCJjb250ZW50V2luZG93XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gUmVmbGVjdC5hcHBseShjb250ZW50V2luZG93R2V0dGVyLCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm94eShjb250ZW50V2luZG93LCB7XG4gICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJsb2NhbFN0b3JhZ2VcIikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IG9ialtwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHZhbC5iaW5kKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFByZXZlbnQgaW50ZXJjZXB0aW9uIGJ5IHBhdGNoaW5nIFJlZmxlY3QuYXBwbHkgYW5kIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZmxlY3QsIFwiYXBwbHlcIiwge3ZhbHVlOiBSZWZsZWN0LmFwcGx5LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCBcImJpbmRcIiwge3ZhbHVlOiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlfSk7XG5cbiAgICBjb25zdCBvT3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuO1xuICAgIFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgaWYgKHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiYXBpL3dlYmhvb2tzXCIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkob09wZW4sIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFRGSG91ciB7XG4gICAgaW5qZWN0MjRIb3VyKCkge1xuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHJldHVybjtcblxuICAgICAgICBjb25zdCB0d2VsdmVIb3VyID0gbmV3IFJlZ0V4cChgKFswLTldezEsMn0pOihbMC05XXsxLDJ9KVxcXFxzKEFNfFBNKWApO1xuICAgICAgICBjb25zdCBjb252ZXJ0ID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IGRhdGEucmV0dXJuVmFsdWUubWF0Y2godHdlbHZlSG91cik7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZWQgfHwgbWF0Y2hlZC5sZW5ndGggIT09IDQpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkWzNdID09PSBcIkFNXCIpIHJldHVybiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZS5yZXBsYWNlKG1hdGNoZWRbMF0sIGAke21hdGNoZWRbMV0gPT09IFwiMTJcIiA/IFwiMDBcIiA6IG1hdGNoZWRbMV0ucGFkU3RhcnQoMiwgXCIwXCIpfToke21hdGNoZWRbMl19YCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWUucmVwbGFjZShtYXRjaGVkWzBdLCBgJHttYXRjaGVkWzFdID09PSBcIjEyXCIgPyBcIjEyXCIgOiBwYXJzZUludChtYXRjaGVkWzFdKSArIDEyfToke21hdGNoZWRbMl19YCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2FuY2VsQ296eSA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuVGltZUZvcm1hdHRlciwgXCJjYWxlbmRhckZvcm1hdFwiLCB7YWZ0ZXI6IGNvbnZlcnR9KTsgLy8gQ2FsbGVkIGluIENvenkgbW9kZVxuICAgICAgICBjb25zdCBjYW5jZWxDb21wYWN0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImRhdGVGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb21wYWN0IG1vZGVcbiAgICAgICAgdGhpcy5jYW5jZWwyNEhvdXIgPSAoKSA9PiB7Y2FuY2VsQ296eSgpOyBjYW5jZWxDb21wYWN0KCk7fTsgLy8gQ2FuY2VsIGJvdGhcbiAgICB9XG5cbiAgICByZW1vdmUyNEhvdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbmNlbDI0SG91cikgdGhpcy5jYW5jZWwyNEhvdXIoKTtcbiAgICB9XG59OyIsImltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG5jb25zdCBkaXNwYXRjaGVyID0gd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyXHJcbmNvbnN0IENoYW5uZWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDaGFubmVsICYmIGUuZGVmYXVsdC5oYXNDaGFubmVsKVswXS5kZWZhdWx0XHJcbmxldCByZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXApWzBdXHJcbmxldCBETU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmNsb3NlUHJpdmF0ZUNoYW5uZWwpWzBdXHJcblxyXG5jb25zdCBibG9ja2VkID0ge31cclxuXHJcbmxldCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdXHJcbmZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyKCl7XHJcbiAgICBpZih1c2VyTW9kdWxlKXJldHVybiB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgcmV0dXJuIG51bGxcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEFudGlCb3RETSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuYW50aURNID0gdGhpcy5hbnRpRE0uYmluZCh0aGlzKVxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuXHJcbiAgICAgICAgZGlzcGF0Y2hlci5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG5cclxuICAgICAgICBkaXNwYXRjaGVyLnVuc3Vic2NyaWJlKFwiTUVTU0FHRV9DUkVBVEVcIiwgdGhpcy5hbnRpRE0pXHJcbiAgICB9XHJcblxyXG4gICAgYW50aURNKGV2KXtcclxuICAgICAgICBpZighZXYubWVzc2FnZS5hdXRob3IuYm90KXJldHVyblxyXG4gICAgICAgIGlmKGV2Lm1lc3NhZ2UuYXV0aG9yLmlkID09PSBnZXRDdXJyZW50VXNlcigpLmlkKVxyXG4gICAgICAgIGlmKGV2Lm1lc3NhZ2UuZ3VpbGRfaWQpcmV0dXJuXHJcblxyXG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSBDaGFubmVsTW9kdWxlLmdldENoYW5uZWwoZXYubWVzc2FnZS5jaGFubmVsX2lkKVxyXG4gICAgICAgIGlmKCFjaGFubmVsKXJldHVybiAvLyBtaWdodCBiZSBicm9rZW5cclxuXHJcbiAgICAgICAgaWYoY2hhbm5lbC50eXBlICE9PSAxKXJldHVyblxyXG5cclxuICAgICAgICBpZihibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSlyZXR1cm4gLy8gSWYgdGhlIHVzZXIgdW5ibG9jayB0aGUgYm90LCBEb24ndCBibG9jayBpdCBhZ2Fpbi5cclxuXHJcbiAgICAgICAgaWYoc2Nhbk1lc3NhZ2UoZXYubWVzc2FnZSkpe1xyXG4gICAgICAgICAgICBibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSA9IHRydWVcclxuICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGBbQWRCbG9ja106IEJsb2NrZWQgJHtldi5tZXNzYWdlLmF1dGhvci51c2VybmFtZX0jJHtldi5tZXNzYWdlLmF1dGhvci5kaXNjcmltaW5hdG9yfWAsIHtcclxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIndhcm5pbmdcIlxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZighcmVsYXRpb25TaGlwTW9kdWxlKXJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmFkZFJlbGF0aW9uc2hpcClbMF1cclxuICAgICAgICAgICAgcmVsYXRpb25TaGlwTW9kdWxlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKGV2Lm1lc3NhZ2UuYXV0aG9yLmlkLCB7XHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogXCJDb250ZXh0TWVudVwiXHJcbiAgICAgICAgICAgIH0sIDIpXHJcbiAgICAgICAgICAgIGlmKCFETU1vZHVsZSlETU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmNsb3NlUHJpdmF0ZUNoYW5uZWwpWzBdXHJcbiAgICAgICAgICAgIERNTW9kdWxlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbChjaGFubmVsLmlkLCBmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNjYW5NZXNzYWdlKG1lc3NhZ2Upe1xyXG4gICAgaWYoLyhkaXNjb3JkXFwuZ2d8ZGlzY29yZFxcLmNvbVxcL2ludml0ZVxcL3xkaXNjb3JkYXBwXFwuY29tXFwvaW52aXRlXFwvKS9nLnRlc3QobWVzc2FnZS5jb250ZW50KSlyZXR1cm4gdHJ1ZVxyXG4gICAgaWYoRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgXCJkaXNjb3JkLmdnL1wiKSB8fCBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmQuY29tL2ludml0ZS9cIikgfHwgRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgXCJkaXNjb3JkYXBwLmNvbS9pbnZpdGUvXCIpKXJldHVybiB0cnVlXHJcblxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbn1cclxuZnVuY3Rpb24gRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgc2VhcmNoKXtcclxuICAgIGxldCBlbWJlZHMgPSBtZXNzYWdlLmVtYmVkcyB8fCBbXVxyXG4gICAgaWYoZW1iZWRzLmxlbmd0aCA9PT0gMClyZXR1cm4gZmFsc2VcclxuICAgIHJldHVybiBlbWJlZHMubWFwKGVtYmVkID0+IHtcclxuICAgICAgICBpZihlbWJlZC50eXBlICE9PSBcInJpY2hcIilyZXR1cm4gZmFsc2VcclxuICAgICAgICBpZigoZW1iZWQudGl0bGUgfHwgXCJcIikuaW5jbHVkZXMoc2VhcmNoKSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGlmKChlbWJlZC5kZXNjcmlwdGlvbiB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKChlbWJlZC5mb290ZXIgfHwgXCJcIikgJiYgZW1iZWQuZm9vdGVyLnRleHQgfHwgXCJcIikuaW5jbHVkZXMoc2VhcmNoKSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGlmKChlbWJlZC5maWVsZHMgfHwgW10pLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGUudmFsdWUuaW5jbHVkZXMoc2VhcmNoKSB8fCBlLm5hbWUuaW5jbHVkZXMoc2VhcmNoKVxyXG4gICAgICAgIH0pLmluY2x1ZGVzKHRydWUpKXJldHVybiB0cnVlXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgfSkuaW5jbHVkZXModHJ1ZSlcclxufSIsImltcG9ydCB7c2V0dGluZ3NSUEMsIGRlZmF1bHRSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuXG5jb25zdCBkaXNwYXRjaGVyID0gQkRNb2R1bGVzLmdldChtPT5tLkRpc3BhdGNoZXImJm0uZGVmYXVsdCYmbS5kZWZhdWx0LmRpc3BhdGNoKVswXS5kZWZhdWx0XG5jb25zdCBBY3Rpb25UeXBlcyA9IEJETW9kdWxlcy5nZXQobT0+bS5BY3Rpb25UeXBlcylbMF0uQWN0aW9uVHlwZXNcblxuY29uc3Qgc29ja2V0SWQgPSBcImxpZ2h0Y29yZC1zcG9vZi1zb2NrZXRcIlxuY29uc3QgcGlkID0gcHJvY2Vzcy5waWRcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEN1c3RvbVJpY2hQcmVzZW5jZSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcblxuICAgICAgICB0aGlzLmdhbWUgPSBzZXR0aW5nc1JQQ1xuICAgIH1cbiAgICBcbiAgICBnZXQgZm9ybWF0ZWRHYW1lKCl7XG4gICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcbiAgICAgICAgaWYodGhpcy5lbmFibGVkID09PSBmYWxzZSlyZXR1cm4gbnVsbFxuICAgICAgICBsZXQgZ2FtZSA9IHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2FtZS5uYW1lIHx8IGRlZmF1bHRSUEMubmFtZSxcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uX2lkOiB0aGlzLmdhbWUuYXBwbGljYXRpb25faWQgfHwgZGVmYXVsdFJQQy5hcHBsaWNhdGlvbl9pZCxcbiAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZ2FtZS5kZXRhaWxzIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLmdhbWUuc3RhdGUgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdGltZXN0YW1wczogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXSA/IHtcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXVxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFzc2V0czogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdID8ge1xuICAgICAgICAgICAgICAgIGxhcmdlX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0sXG4gICAgICAgICAgICAgICAgc21hbGxfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5zbWFsbFwiXSB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2FtZVxuICAgIH1cblxuICAgIHNlbmRHYW1lKCl7XG4gICAgICAgIGRpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogQWN0aW9uVHlwZXMuTE9DQUxfQUNUSVZJVFlfVVBEQVRFLFxuICAgICAgICAgICAgc29ja2V0SWQsXG4gICAgICAgICAgICBwaWQsXG4gICAgICAgICAgICBhY3Rpdml0eTogdGhpcy5mb3JtYXRlZEdhbWVcbiAgICAgICAgfSkgICBcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxuICAgICAgICBjb25zb2xlLmxvZyhcIkVuYWJsaW5nIGN1c3RvbSBSaWNoUHJlc2VuY2VcIilcblxuICAgICAgICB0aGlzLnNldChzZXR0aW5nc1JQQyB8fCBPYmplY3QuY3JlYXRlKGRlZmF1bHRSUEMpKVxuXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxuICAgIH1cblxuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRGlzYWJsaW5nIGN1c3RvbSBSaWNoUHJlc2VuY2VcIilcblxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEFzc2V0cyhhcHBsaWNhdGlvbklkKXtcbiAgICAgICAgbGV0IGFzc2V0cyA9IGF3YWl0IEJETW9kdWxlcy5nZXQoZSA9PiBlLmdldEFzc2V0cylbMF0uZ2V0QXNzZXRzKGFwcGxpY2F0aW9uSWQpXG4gICAgICAgIGlmKGFzc2V0cy51bmRlZmluZWQgJiYgdHlwZW9mIGFzc2V0cy51bmRlZmluZWQgPT09IFwibnVtYmVyXCIpe1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBBcHBsaWNhdGlvblwiKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3NldHNcbiAgICB9XG5cbiAgICBzZXQoYWN0aXZpdHkpe1xuICAgICAgICB0aGlzLmdhbWUgPSBhY3Rpdml0eVxuXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxuICAgIH1cbn0iLCJpbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IHYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL2Rpc3RhbnRcIjtcclxuaW1wb3J0IHsgdGltaW5nU2FmZUVxdWFsIH0gZnJvbSBcImNyeXB0b1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIExheWVycyB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMubGF5ZXJzID0gW11cclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuTGF5ZXJzID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0luamVjdGVkKCl7XHJcbiAgICAgICAgcmV0dXJuICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImRpdi5MYXllcnMuaW5qZWN0ZWRcIilcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3QoKXtcclxuICAgICAgICBpZih0aGlzLmlzSW5qZWN0ZWQpcmV0dXJuXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1lTGF5ZXJzXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgVXRpbHMucmVtb3ZlRGEodjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUubGF5ZXJzICYmIGUubGF5ZXIpLmxheWVycylcclxuICAgICAgICBdXHJcbiAgICAgICAgY29uc3QgbGF5ZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitjbGFzc05hbWVMYXllcnMpO1xyXG4gICAgICAgIGlmICghbGF5ZXJzKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgUmVhY3RJbnN0YW5jZSA9IExpZ2h0Y29yZC5BcGkuVXRpbHMuRmluZFJlYWN0KGxheWVycywgMSlcclxuICAgICAgICBpZighUmVhY3RJbnN0YW5jZSlyZXR1cm4gbGF5ZXJzXHJcbiAgICAgICAgdGhpcy5SZWFjdEluc3RhbmNlID0gUmVhY3RJbnN0YW5jZVxyXG4gICAgICAgIGxldCByZW5kZXIgPSBSZWFjdEluc3RhbmNlLnJlbmRlclxyXG4gICAgICAgIFJlYWN0SW5zdGFuY2UucmVuZGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSByZW5kZXIuY2FsbChSZWFjdEluc3RhbmNlKVxyXG4gICAgICAgICAgICBsZXQgY2xhc3NMaXN0ID0gcmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2xhc3NOYW1lLnNwbGl0KFwiIFwiKVxyXG4gICAgICAgICAgICBjbGFzc0xpc3QucHVzaChcIkxheWVyc1wiKVxyXG4gICAgICAgICAgICBjbGFzc0xpc3QucHVzaChcImluamVjdGVkXCIpXHJcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuWzFdLnByb3BzLmNsYXNzTmFtZSA9IGNsYXNzTGlzdC5qb2luKFwiIFwiKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5sYXllcnMuZm9yRWFjaChsYXllciA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlblsxXS5wcm9wcy5jaGlsZHJlbi5wdXNoKGxheWVyWzFdKVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFJlYWN0SW5zdGFuY2UuZm9yY2VVcGRhdGUoKVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUxheWVyKGNoaWxkcmVuLCBwcm9wcyA9IHt9KXtcclxuICAgICAgICBsZXQgaWQgPSB1dWlkdjQoKVxyXG4gICAgICAgIGxldCBsYXllciA9IG51bGxcclxuICAgICAgICB0aGlzLmxheWVycy5wdXNoKFtpZCwgPExheWVyIHsuLi5wcm9wc30gZ2V0TGF5ZXI9e2xheSA9PiB7XHJcbiAgICAgICAgICAgIGxheWVyID0gbGF5XHJcbiAgICAgICAgfX0ga2V5PXtpZH0gaWQ9e2lkfSByZW1vdmU9eygpID0+IHtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KGUgPT4gZVswXSA9PT0gaWQpXHJcbiAgICAgICAgICAgIGlmKGluZGV4ID09PSAtMSlyZXR1cm5cclxuICAgICAgICAgICAgdGhpcy5sYXllcnMuc3BsaWNlKGluZGV4LCAxKVxyXG4gICAgICAgICAgICBsYXllciA9IG51bGxcclxuICAgICAgICAgICAgaWYodGhpcy5SZWFjdEluc3RhbmNlKXRoaXMuUmVhY3RJbnN0YW5jZS5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0KClcclxuICAgICAgICB9fT57Y2hpbGRyZW59PC9MYXllcj5dKVxyXG4gICAgICAgIGlmKHRoaXMuUmVhY3RJbnN0YW5jZSl0aGlzLlJlYWN0SW5zdGFuY2UuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIHRoaXMuaW5qZWN0KClcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZW1vdmU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKCFsYXllcil7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KGUgPT4gZVswXSA9PT0gaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXggPT09IC0xKXJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5ZXJzLnNwbGljZShpbmRleCwgMSlcclxuICAgICAgICAgICAgICAgICAgICBsYXllciA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLlJlYWN0SW5zdGFuY2UpdGhpcy5SZWFjdEluc3RhbmNlLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluamVjdCgpXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBsYXllci5yZW1vdmUoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5cclxubGV0IExheWVyTW9kdWxlc1xyXG5leHBvcnQgY2xhc3MgTGF5ZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uOiBuZXcgdGhpcy5tb2R1bGVzWzBdLmRlZmF1bHQuVmFsdWUoMClcclxuICAgICAgICB9IFxyXG4gICAgICAgIHRoaXMucHJvcHMuZ2V0TGF5ZXIodGhpcylcclxuICAgICAgICB0aGlzLmtleWRvd24gPSB0aGlzLmtleWRvd24uYmluZCh0aGlzKVxyXG4gICAgfVxyXG5cclxuICAgIGtleWRvd24oZSl7XHJcbiAgICAgICAgaWYgKGUud2hpY2ggPT09IDI3KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gTGF5ZXJNb2R1bGVzIHx8IChMYXllck1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIHYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LlZhbHVlICYmIGUuZGVmYXVsdC5kaXYpXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmtleWRvd24pXHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoZXYpe1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmtleWRvd24pXHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlKCl7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5yZW1vdmUoKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxFbnRlcihldil7XHJcbiAgICAgICAgdGhpcy5tb2R1bGVzWzBdLmRlZmF1bHQudGltaW5nKHRoaXMuc3RhdGUuYW5pbWF0aW9uLCB7XHJcbiAgICAgICAgICAgIHRvVmFsdWU6IDEsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxMDBcclxuICAgICAgICB9KS5zdGFydChldilcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsTGVhdmUoZXYpe1xyXG4gICAgICAgIHRoaXMubW9kdWxlc1swXS5kZWZhdWx0LnRpbWluZyh0aGlzLnN0YXRlLmFuaW1hdGlvbiwge1xyXG4gICAgICAgICAgICB0b1ZhbHVlOiAwLFxyXG4gICAgICAgICAgICBkdXJhdGlvbjogMTAwXHJcbiAgICAgICAgfSkuc3RhcnQoZXYpXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IGludGVycG9sYXRpb24gPSB0aGlzLnN0YXRlLmFuaW1hdGlvbi5pbnRlcnBvbGF0ZSh7XHJcbiAgICAgICAgICAgIGlucHV0UmFuZ2U6IFswLCAxXSxcclxuICAgICAgICAgICAgb3V0cHV0UmFuZ2U6IFsxLjA3LCAxXVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgbGV0IHN0eWxlID0ge1xyXG4gICAgICAgICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmFuaW1hdGlvbixcclxuICAgICAgICAgICAgdHJhbnNmb3JtOiBbe1xyXG4gICAgICAgICAgICAgICAgc2NhbGU6IGludGVycG9sYXRpb25cclxuICAgICAgICAgICAgfV1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IERpdiA9IHRoaXMubW9kdWxlc1swXS5kZWZhdWx0LmRpdlxyXG4gICAgICAgIHJldHVybiA8RGl2IGNsYXNzTmFtZT17W19fU0VDUkVUX0VNT1RJT05fXy5jc3Moe1xyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XCJ2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpXCIsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXHJcbiAgICAgICAgICAgIHRvcDogMCxcclxuICAgICAgICAgICAgcmlnaHQ6IDAsXHJcbiAgICAgICAgICAgIGJvdHRvbTogMCxcclxuICAgICAgICAgICAgbGVmdDogMCxcclxuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXHJcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxyXG4gICAgICAgICAgICBXZWJraXRCb3hPcmllbnQ6IFwidmVydGljYWxcIixcclxuICAgICAgICAgICAgV2Via2l0Qm94RGlyZWN0aW9uOiBcIm5vcm1hbFwiLFxyXG4gICAgICAgICAgICBtc0ZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXHJcbiAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXHJcbiAgICAgICAgICAgIHpJbmRleDogMTAxXHJcbiAgICAgICAgfSkscHJvY2Vzcy5wbGF0Zm9ybT09PVwid2luMzJcIj9fX1NFQ1JFVF9FTU9USU9OX18uY3NzKHtcclxuICAgICAgICAgICAgdG9wOiBcIi0yMnB4XCIsXHJcbiAgICAgICAgICAgIHBhZGRpbmdUb3A6IFwiMjJweFwiXHJcbiAgICAgICAgfSk6bnVsbCwuLi4odGhpcy5wcm9wcy5jbGFzc05hbWU/dGhpcy5wcm9wcy5jbGFzc05hbWUuc3BsaXQoXCIgXCIpOltdKV0uZmlsdGVyKGU9PmUpLmpvaW4oXCIgXCIpIHx8IG51bGx9IHN0eWxlPXtzdHlsZX0+XHJcbiAgICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKClcclxuICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgPC9EaXY+XHJcbiAgICB9XHJcbn1cclxuTGF5ZXIuZGVmYXVsdFByb3BzID0ge1xyXG4gICAgaWQ6IG51bGwsXHJcbiAgICBjaGlsZHJlbjogbnVsbFxyXG59IiwiaW1wb3J0IHtwbHVnaW5Db29raWUsIHRoZW1lQ29va2llLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc0Nvb2tpZSwgc2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgbWFpbkNvcmUgZnJvbSBcIi4vY29yZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuY29uc3QgQmRBcGkgPSB7XHJcbiAgICBnZXQgUmVhY3QoKSB7IHJldHVybiBCRFYyLlJlYWN0OyB9LFxyXG4gICAgZ2V0IFJlYWN0RE9NKCkgeyByZXR1cm4gQkRWMi5SZWFjdERvbTsgfSxcclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gQkRWMi5SZWFjdENvbXBvbmVudDt9LFxyXG4gICAgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7cmV0dXJuIFV0aWxzLldpbmRvd0NvbmZpZ0ZpbGU7fSxcclxuICAgIGdldCBzZXR0aW5ncygpIHtyZXR1cm4gc2V0dGluZ3M7fSxcclxuICAgIGdldCBlbW90ZXMoKSB7cmV0dXJuIG51bGx9LCAvLyBkZXByZWNhdGVkLCBkZWxldGVkIGFsbCBlbW90ZXMgZnJvbSBiZXR0ZXJkaXNjb3JkLlxyXG4gICAgZ2V0IHNjcmVlbldpZHRoKCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTsgfSxcclxuICAgIGdldCBzY3JlZW5IZWlnaHQoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7IH1cclxufTtcclxuXHJcbkJkQXBpLmdldEFsbFdpbmRvd1ByZWZlcmVuY2VzID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gVXRpbHMuZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMoKTtcclxufTtcclxuXHJcbkJkQXBpLmdldFdpbmRvd1ByZWZlcmVuY2UgPSBmdW5jdGlvbihrZXkpIHtcclxuICAgIHJldHVybiBVdGlscy5nZXRXaW5kb3dQcmVmZXJlbmNlKGtleSk7XHJcbn07XHJcblxyXG5CZEFwaS5zZXRXaW5kb3dQcmVmZXJlbmNlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2Uoa2V5LCB2YWx1ZSk7XHJcbn07XHJcblxyXG4vL0luamVjdCBDU1MgdG8gZG9jdW1lbnQgaGVhZFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG4vL2NzcyA9IGN1c3RvbSBjc3NcclxuQmRBcGkuaW5qZWN0Q1NTID0gZnVuY3Rpb24gKGlkLCBjc3MpIHtcclxuICAgIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQoaWQpLCBjc3MpO1xyXG59O1xyXG5cclxuLy9DbGVhciBjc3MvcmVtb3ZlIGFueSBlbGVtZW50XHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbkJkQXBpLmNsZWFyQ1NTID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICBET00ucmVtb3ZlU3R5bGUoRE9NLmVzY2FwZUlEKGlkKSk7XHJcbn07XHJcblxyXG4vL0luamVjdCBDU1MgdG8gZG9jdW1lbnQgaGVhZFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG4vL2NzcyA9IGN1c3RvbSBjc3NcclxuQmRBcGkubGlua0pTID0gZnVuY3Rpb24gKGlkLCB1cmwpIHtcclxuICAgIERPTS5hZGRTY3JpcHQoRE9NLmVzY2FwZUlEKGlkKSwgdXJsKTtcclxufTtcclxuXHJcbi8vQ2xlYXIgY3NzL3JlbW92ZSBhbnkgZWxlbWVudFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG5CZEFwaS51bmxpbmtKUyA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgRE9NLnJlbW92ZVNjcmlwdChET00uZXNjYXBlSUQoaWQpKTtcclxufTtcclxuXHJcbi8vR2V0IGFub3RoZXIgcGx1Z2luXHJcbi8vbmFtZSA9IG5hbWUgb2YgcGx1Z2luXHJcbkJkQXBpLmdldFBsdWdpbiA9IGZ1bmN0aW9uIChuYW1lKSB7XHJcbiAgICBpZiAoYmRwbHVnaW5zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGJkcGx1Z2luc1tuYW1lXS5wbHVnaW47XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbi8vR2V0IEJldHRlckRpc2NvcmQgQ29yZVxyXG5CZEFwaS5nZXRDb3JlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgVXRpbHMud2FybihcIkRlcHJlY2F0aW9uIE5vdGljZVwiLCBgQmRBcGkuZ2V0Q29yZSgpIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuYCk7XHJcbiAgICByZXR1cm4gbWFpbkNvcmU7XHJcbn07XHJcblxyXG4vKipcclxuICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBtb2RhbC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gYSBzdHJpbmcgb2YgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBtb2RhbFxyXG4gKi9cclxuQmRBcGkuYWxlcnQgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQpIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIHtjYW5jZWxUZXh0OiBudWxsfSk7XHJcbn07XHJcblxyXG4vKipcclxuICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBjb25maXJtYXRpb24gbW9kYWwgd2l0aCBvcHRpb25hbCBjb25maXJtIGFuZCBjYW5jZWwgY2FsbGJhY2tzLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcclxuICogQHBhcmFtIHsoc3RyaW5nfFJlYWN0RWxlbWVudHxBcnJheTxzdHJpbmd8UmVhY3RFbGVtZW50Pil9IGNoaWxkcmVuIC0gYSBzaW5nbGUgb3IgbWl4ZWQgYXJyYXkgb2YgcmVhY3QgZWxlbWVudHMgYW5kIHN0cmluZ3MuIEV2ZXJ5IHN0cmluZyBpcyB3cmFwcGVkIGluIERpc2NvcmQncyBgTWFya2Rvd25gIGNvbXBvbmVudCBzbyBzdHJpbmdzIHdpbGwgc2hvdyBhbmQgcmVuZGVyIHByb3Blcmx5LlxyXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyB0byBtb2RpZnkgdGhlIG1vZGFsXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGFuZ2VyPWZhbHNlXSAtIHdoZXRoZXIgdGhlIG1haW4gYnV0dG9uIHNob3VsZCBiZSByZWQgb3Igbm90XHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb25maXJtVGV4dD1Pa2F5XSAtIHRleHQgZm9yIHRoZSBjb25maXJtYXRpb24vc3VibWl0IGJ1dHRvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2FuY2VsVGV4dD1DYW5jZWxdIC0gdGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b25cclxuICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25Db25maXJtPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgc3VibWl0IGJ1dHRvblxyXG4gKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNhbmNlbD1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIGNhbmNlbCBidXR0b25cclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmtleV0gLSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kYWwuIElmIG5vdCBwcm92aWRlZCwgb25lIGlzIGdlbmVyYXRlZCBhbmQgcmV0dXJuZWRcclxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUga2V5IHVzZWQgZm9yIHRoaXMgbW9kYWxcclxuICovXHJcbkJkQXBpLnNob3dDb25maXJtYXRpb25Nb2RhbCA9IGZ1bmN0aW9uICh0aXRsZSwgY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCBvcHRpb25zKTtcclxufTtcclxuXHJcbi8vU2hvdyB0b2FzdCBhbGVydFxyXG5CZEFwaS5zaG93VG9hc3QgPSBmdW5jdGlvbihjb250ZW50LCBvcHRpb25zID0ge30pIHtcclxuICAgIFV0aWxzLnNob3dUb2FzdChjb250ZW50LCBvcHRpb25zKTtcclxufTtcclxuXHJcbi8vIEZpbmRzIG1vZHVsZVxyXG5CZEFwaS5maW5kTW9kdWxlID0gZnVuY3Rpb24oZmlsdGVyKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGZpbHRlcik7XHJcbn07XHJcblxyXG4vLyBGaW5kcyBtb2R1bGVcclxuQmRBcGkuZmluZEFsbE1vZHVsZXMgPSBmdW5jdGlvbihmaWx0ZXIpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRBbGwoZmlsdGVyKTtcclxufTtcclxuXHJcbi8vIEZpbmRzIG1vZHVsZVxyXG5CZEFwaS5maW5kTW9kdWxlQnlQcm9wcyA9IGZ1bmN0aW9uKC4uLnByb3BzKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKHByb3BzKTtcclxufTtcclxuXHJcbkJkQXBpLmZpbmRNb2R1bGVCeVByb3RvdHlwZXMgPSBmdW5jdGlvbiguLi5wcm90b3MpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3RvdHlwZXMocHJvdG9zKTtcclxufTtcclxuXHJcbkJkQXBpLmZpbmRNb2R1bGVCeURpc3BsYXlOYW1lID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUobmFtZSk7XHJcbn07XHJcblxyXG4vLyBHZXRzIHJlYWN0IGluc3RhbmNlXHJcbkJkQXBpLmdldEludGVybmFsSW5zdGFuY2UgPSBmdW5jdGlvbihub2RlKSB7XHJcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2Ygd2luZG93LmpRdWVyeSkgJiYgIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGpRdWVyeSkgbm9kZSA9IG5vZGVbMF07XHJcbiAgICByZXR1cm4gQkRWMi5nZXRJbnRlcm5hbEluc3RhbmNlKG5vZGUpO1xyXG59O1xyXG5cclxuLy8gR2V0cyBkYXRhXHJcbkJkQXBpLmxvYWREYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLmdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KTtcclxufTtcclxuXHJcbkJkQXBpLmdldERhdGEgPSBCZEFwaS5sb2FkRGF0YTtcclxuXHJcbi8vIFNldHMgZGF0YVxyXG5CZEFwaS5zYXZlRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSwgZGF0YSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5zZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSwgZGF0YSk7XHJcbn07XHJcblxyXG5CZEFwaS5zZXREYXRhID0gQmRBcGkuc2F2ZURhdGE7XHJcblxyXG4vLyBEZWxldGVzIGRhdGFcclxuQmRBcGkuZGVsZXRlRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5kZWxldGVQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSk7XHJcbn07XHJcblxyXG4vLyBQYXRjaGVzIG90aGVyIGZ1bmN0aW9uc1xyXG5CZEFwaS5tb25rZXlQYXRjaCA9IGZ1bmN0aW9uKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcclxuICAgIHJldHVybiBVdGlscy5tb25rZXlQYXRjaCh3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKTtcclxufTtcclxuXHJcbi8vIEV2ZW50IHdoZW4gZWxlbWVudCBpcyByZW1vdmVkXHJcbkJkQXBpLm9uUmVtb3ZlZCA9IGZ1bmN0aW9uKG5vZGUsIGNhbGxiYWNrKSB7XHJcbiAgICByZXR1cm4gVXRpbHMub25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKTtcclxufTtcclxuXHJcbi8vIFdyYXBzIGZ1bmN0aW9uIGluIHRyeS4uY2F0Y2hcclxuQmRBcGkuc3VwcHJlc3NFcnJvcnMgPSBmdW5jdGlvbihtZXRob2QsIG1lc3NhZ2UpIHtcclxuICAgIHJldHVybiBVdGlscy5zdXBwcmVzc0Vycm9ycyhtZXRob2QsIG1lc3NhZ2UpO1xyXG59O1xyXG5cclxuLy8gVGVzdHMgZm9yIHZhbGlkIEpTT05cclxuQmRBcGkudGVzdEpTT04gPSBmdW5jdGlvbihkYXRhKSB7XHJcbiAgICByZXR1cm4gVXRpbHMudGVzdEpTT04oZGF0YSk7XHJcbn07XHJcblxyXG5CZEFwaS5pc1BsdWdpbkVuYWJsZWQgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gISFwbHVnaW5Db29raWVbbmFtZV07XHJcbn07XHJcblxyXG5CZEFwaS5pc1RoZW1lRW5hYmxlZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiAhIXRoZW1lQ29va2llW25hbWVdO1xyXG59O1xyXG5cclxuQmRBcGkuaXNTZXR0aW5nRW5hYmxlZCA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gISFzZXR0aW5nc0Nvb2tpZVtpZF07XHJcbn07XHJcblxyXG5CZEFwaS5lbmFibGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCB0cnVlKTtcclxufTtcclxuXHJcbkJkQXBpLmRpc2FibGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCBmYWxzZSk7XHJcbn07XHJcblxyXG5CZEFwaS50b2dnbGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCAhc2V0dGluZ3NDb29raWVbaWRdKTtcclxufTtcclxuXHJcbi8vIEdldHMgZGF0YVxyXG5CZEFwaS5nZXRCRERhdGEgPSBmdW5jdGlvbihrZXkpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuZ2V0QkREYXRhKGtleSk7XHJcbn07XHJcblxyXG4vLyBTZXRzIGRhdGFcclxuQmRBcGkuc2V0QkREYXRhID0gZnVuY3Rpb24oa2V5LCBkYXRhKSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLnNldEJERGF0YShrZXksIGRhdGEpO1xyXG59O1xyXG5cclxuXHJcblxyXG5jb25zdCBtYWtlQWRkb25BUEkgPSAoY29va2llLCBsaXN0LCBtYW5hZ2VyKSA9PiBuZXcgY2xhc3MgQWRkb25BUEkge1xyXG5cclxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIG1hbmFnZXIuZm9sZGVyO31cclxuXHJcbiAgICBpc0VuYWJsZWQobmFtZSkge1xyXG4gICAgICAgIHJldHVybiAhIWNvb2tpZVtuYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmVuYWJsZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWFuYWdlci5kaXNhYmxlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZShuYW1lKSB7XHJcbiAgICAgICAgaWYgKGNvb2tpZVtuYW1lXSkgdGhpcy5kaXNhYmxlKG5hbWUpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5lbmFibGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVsb2FkKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWFuYWdlci5yZWxvYWQobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KG5hbWUpIHtcclxuICAgICAgICBpZiAobGlzdC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG4gICAgICAgICAgICBpZiAobGlzdFtuYW1lXS5wbHVnaW4pIHJldHVybiBsaXN0W25hbWVdLnBsdWdpbjtcclxuICAgICAgICAgICAgcmV0dXJuIGxpc3RbbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFsbCgpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobGlzdCkubWFwKGsgPT4gdGhpcy5nZXQoaykpLmZpbHRlcihhID0+IGEpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuQmRBcGkuUGx1Z2lucyA9IG1ha2VBZGRvbkFQSShwbHVnaW5Db29raWUsIGJkcGx1Z2lucywgcGx1Z2luTW9kdWxlKTtcclxuQmRBcGkuVGhlbWVzID0gbWFrZUFkZG9uQVBJKHRoZW1lQ29va2llLCBiZHRoZW1lcywgdGhlbWVNb2R1bGUpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmRBcGk7XHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuQmRBcGkgPSBCZEFwaSIsIi8qIEJERXZlbnRzICovXHJcbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoXCJldmVudHNcIik7XHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCREV2ZW50cyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKClcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuQkRFdmVudHMgPSB0aGlzXHJcbiAgICB9XHJcbiAgICBkaXNwYXRjaChldmVudE5hbWUsIC4uLmFyZ3MpIHt0aGlzLmVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKTt9XHJcbiAgICBvZmYoZXZlbnROYW1lLCBldmVudEFjdGlvbikge3RoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEFjdGlvbik7fVxyXG59OyIsIi8qKlxyXG4gKiBDcmVkaXRzIHRvIEBoZWxsYm91bmQxMzM3IG9uIGdpdGh1YiBmb3IgdGhlIGNzc1xyXG4gKi9cclxuXHJcbmltcG9ydCBET01Ub29scyBmcm9tIFwiLi9kb210b29sc1wiXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG5sZXQgc2VsZWN0b3JzXHJcbmNvbnN0IHJlbW92ZURhID0gVXRpbHMucmVtb3ZlRGFcclxuZnVuY3Rpb24gZ2V0U2VsZWN0b3JzKCl7XHJcbiAgICBsZXQgc3RhbmRhcmRTaWRlYmFyVmlldyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnN0YW5kYXJkU2lkZWJhclZpZXcpWzBdXHJcbiAgICBpZighc3RhbmRhcmRTaWRlYmFyVmlldylyZXR1cm4gbnVsbFxyXG4gICAgbGV0IGRlZmF1bHRDbGFzc05hbWUgPSByZW1vdmVEYShzdGFuZGFyZFNpZGViYXJWaWV3LnN0YW5kYXJkU2lkZWJhclZpZXcpXHJcbiAgICBsZXQgc2VsZWN0cyA9IFtdXHJcbiAgICBsZXQgdXNlclNldHRpbmdzQWNjb3VudCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnVzZXJTZXR0aW5nc0FjY291bnQpWzBdXHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IEJETW9kdWxlcy5nZXQoZSA9PiB0eXBlb2YgZS5jaGlsZHJlbiA9PT0gXCJzdHJpbmdcIilbMF1cclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAucGF5bWVudC1pbmZvIC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlc2NyaXB0aW9uICYmIHR5cGVvZiBlLmRlc2NyaXB0aW9uID09PSBcInN0cmluZ1wiICYmIGUuZGVzY3JpcHRpb24uaW5jbHVkZXMoXCJmb3JtVGV4dFwiKSlbMF0uZGVzY3JpcHRpb24pfWApXHJcbiAgICBzZWxlY3RzLnB1c2goYCNhcHAtbW91bnQgLiR7ZGVmYXVsdENsYXNzTmFtZX0gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUucGF5bWVudFNvdXJjZVJvdylbMF0ucGF5bWVudFNvdXJjZVJvdyl9IC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnN1YlRleHQgJiYgZS5kZXNjcmlwdGlvbldyYXBwZXIpWzBdLnN1YlRleHQpfWApXHJcbiAgICBpZih1c2VyU2V0dGluZ3NBY2NvdW50KXtcclxuICAgICAgICBzZWxlY3RzLnB1c2goYCNhcHAtbW91bnQgLiR7ZGVmYXVsdENsYXNzTmFtZX0gLiR7cmVtb3ZlRGEodXNlclNldHRpbmdzQWNjb3VudC51c2VyU2V0dGluZ3NBY2NvdW50KX0gZGl2Om50aC1jaGlsZCgyKT5kaXY6bnRoLWNoaWxkKDIpPi4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnZpZXdCb2R5KVswXS52aWV3Qm9keSl9YClcclxuICAgICAgICBzZWxlY3RzLnB1c2goYC4ke3JlbW92ZURhKHVzZXJTZXR0aW5nc0FjY291bnQudXNlclNldHRpbmdzU2VjdXJpdHkpfSAuJHtyZW1vdmVEYShjaGlsZHJlbi5jaGlsZHJlbil9ID4gZGl2Om50aC1jaGlsZCgyKWApXHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhzZWxlY3RzKVxyXG4gICAgcmV0dXJuIHNlbGVjdHNcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEJsdXJQcml2YXRlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG4gICAgICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9ycyB8fCBnZXRTZWxlY3RvcnMoKVxyXG5cclxuICAgICAgICBpZighc2VsZWN0b3JzKWNvbnNvbGUuZXJyb3IobmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBzZWxlY3RvcnMgdG8gYmx1ciBwZXJzb25uYWwgaW5mb3JtYXRpb25zLlwiKSlcclxuICAgICAgICBET01Ub29scy5hZGRTdHlsZShcImJsdXJQcml2YXRlXCIsIGBcclxuJHtzZWxlY3RvcnMuam9pbihcIiwgXCIpfSB7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgY3ViaWMtYmV6aWVyKC41NSwuMDg1LC42OCwuNTMpO1xyXG4gICAgZmlsdGVyOiBibHVyKDRweCk7XHJcbiAgICBvcGFjaXR5OiAuODtcclxufVxyXG5cclxuJHtzZWxlY3RvcnMubWFwKGUgPT4gZStcIjpob3ZlclwiKS5qb2luKFwiLCBcIil9ICB7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgY3ViaWMtYmV6aWVyKC41NSwuMDksLjY4LC41Myk7XHJcbiAgICBmaWx0ZXI6IG5vbmU7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG59YClcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgIERPTVRvb2xzLnJlbW92ZVN0eWxlKFwiYmx1clByaXZhdGVcIilcclxuICAgIH1cclxufSIsImltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5cclxuY29uc3Qgbm9ybWFsaXplZFByZWZpeCA9IFwiZGFcIjtcclxuY29uc3QgcmFuZENsYXNzID0gbmV3IFJlZ0V4cChgXig/ISR7bm9ybWFsaXplZFByZWZpeH0tKSgoPzpbQS1aYS16XXxbMC05XXwtKSspLSg/OltBLVphLXpdfFswLTldfC18Xyl7Nn0kYCk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ2xhc3NOb3JtYWxpemVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkNsYXNzTm9ybWFsaXplciA9IHRoaXNcclxuICAgIH1cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1BhdGNoZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZXMoV2VicGFja01vZHVsZXMuZmluZEFsbCh0aGlzLm1vZHVsZUZpbHRlci5iaW5kKHRoaXMpKSk7XHJcbiAgICAgICAgdGhpcy5yZXZlcnRFbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpKTtcclxuICAgICAgICB0aGlzLmhhc1BhdGNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNQYXRjaGVkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wYXRjaENsYXNzTW9kdWxlcyhXZWJwYWNrTW9kdWxlcy5maW5kQWxsKHRoaXMubW9kdWxlRmlsdGVyLmJpbmQodGhpcykpKTtcclxuICAgICAgICB0aGlzLm5vcm1hbGl6ZUVsZW1lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnRcIikpO1xyXG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5wYXRjaERPTU1ldGhvZHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLnBhdGNoQ2xhc3NNb2R1bGUobm9ybWFsaXplZFByZWZpeCwgbW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5wYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG91bGRJZ25vcmUodmFsdWUpIHtcclxuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLmVuZHNXaXRoKFwicHhcIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJjaFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImVtXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwibXNcIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwibGF5ZXJDb250YWluZXItXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIiNcIikgJiYgKHZhbHVlLmxlbmd0aCA9PSA3IHx8IHZhbHVlLmxlbmd0aCA9PSA0KSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKFwiY2FsYyhcIikgfHwgdmFsdWUuaW5jbHVkZXMoXCJyZ2JhXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbW9kdWxlRmlsdGVyKG1vZHVsZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobW9kdWxlKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChtb2R1bGUuX19lc01vZHVsZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmICghT2JqZWN0LmtleXMobW9kdWxlKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gbW9kdWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbW9kdWxlW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZSh2YWx1ZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUuc3BsaXQoXCItXCIpLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIXJhbmRDbGFzcy50ZXN0KHZhbHVlLnNwbGl0KFwiIFwiKVswXSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbm9ybWFsQ2xhc3MubWF0Y2gocmFuZENsYXNzKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2ggfHwgIW1hdGNoLmxlbmd0aCB8fCBtYXRjaC5sZW5ndGggPCAyKSBjb250aW51ZTsgLy8gU2hvdWxkbid0IGV2ZXIgaGFwcGVuIHNpbmNlIHRoZXkgcGFzc2VkIHRoZSBtb2R1bGVGaWx0ZXIsIGJ1dCB5b3UgbmV2ZXIga25vd1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FtZWxDYXNlID0gbWF0Y2hbMV0uc3BsaXQoXCItXCIpLm1hcCgocywgaSkgPT4gaSA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzKS5qb2luKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSArPSBgICR7Y29tcG9uZW50TmFtZX0tJHtjYW1lbENhc2V9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bnBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGxldCBuZXdTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB2YWx1ZS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9ybWFsQ2xhc3Mgb2YgY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsQ2xhc3Muc3RhcnRzV2l0aChgJHtjb21wb25lbnROYW1lfS1gKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBuZXdTdHJpbmcgKz0gYCAke25vcm1hbENsYXNzfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSA9IG5ld1N0cmluZy50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZUVsZW1lbnQoZWxlbWVudCkge1xyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBlbGVtZW50LmNsYXNzTGlzdDtcclxuICAgICAgICBmb3IgKGxldCBjID0gMCwgY2xlbiA9IGNsYXNzZXMubGVuZ3RoOyBjIDwgY2xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgIGlmICghcmFuZENsYXNzLnRlc3QoY2xhc3Nlc1tjXSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNsYXNzZXNbY10ubWF0Y2gocmFuZENsYXNzKVsxXTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q2xhc3MgPSBtYXRjaC5zcGxpdChcIi1cIikubWFwKChzLCBpKSA9PiBpID8gc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6IHMpLmpvaW4oXCJcIik7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChgJHtub3JtYWxpemVkUHJlZml4fS0ke25ld0NsYXNzfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsZW1lbnQuY2hpbGRyZW4pIHRoaXMubm9ybWFsaXplRWxlbWVudChjaGlsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZXJ0RWxlbWVudChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4gJiYgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGgpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50LmNoaWxkcmVuWzBdKTtcclxuICAgICAgICBpZiAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xyXG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgIGlmIChjbGFzc2VzW2NdLnN0YXJ0c1dpdGgoYCR7bm9ybWFsaXplZFByZWZpeH0tYCkpIHRvUmVtb3ZlLnB1c2goY2xhc3Nlc1tjXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi50b1JlbW92ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hET01NZXRob2RzKCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5zID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5jb250YWlucztcclxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24odG9rZW4pIHtcclxuICAgICAgICAgICAgLy8gY29uc3QgdG9rZW5zID0gdG9rZW4uc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShjb250YWlucywgdGhpcywgW3Rva2VuLnNwbGl0KFwiIFwiKVswXV0pO1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gdG9rZW5zLmV2ZXJ5KHQgPT4gY29udGFpbnMuY2FsbCh0aGlzLCB0KSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYWRkID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQ7XHJcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiguLi50b2tlbnMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcclxuICAgICAgICAgICAgICAgIHRva2Vuc1t0XSA9IHRva2Vuc1t0XS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoYWRkLCB0aGlzLCB0b2tlbnMpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlO1xyXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oLi4udG9rZW5zKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG9rZW5zLmxlbmd0aDsgdCsrKSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbnNbdF0gPSB0b2tlbnNbdF0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHJlbW92ZSwgdGhpcywgdG9rZW5zKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENvbG9yZWRUZXh0IHtcbiAgICBpbmplY3RDb2xvcmVkVGV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsQ29sb3JlZFRleHQpIHJldHVybjtcbiAgICAgICAgaWYgKCFCRFYyLk1lc3NhZ2VDb21wb25lbnQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmNhbmNlbENvbG9yZWRUZXh0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2JlZm9yZTogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF07XG4gICAgICAgICAgICBpZiAoIXByb3BzIHx8ICFwcm9wcy5jaGlsZHJlbk1lc3NhZ2VDb250ZW50KSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlQ29udGVudCA9IHByb3BzLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICghbWVzc2FnZUNvbnRlbnQudHlwZSB8fCAhbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlIHx8IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZS5kaXNwbGF5TmFtZSAhPSBcIk1lc3NhZ2VDb250ZW50XCIpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVHlwZSA9IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZTtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFR5cGUuX19vcmlnaW5hbE1ldGhvZCkgcmV0dXJuOyAvLyBEb24ndCBwYXRjaCBhZ2FpblxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlID0gZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG9yaWdpbmFsVHlwZShwcm9wcyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZUNvbG9yID0gc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtN1wiXSA/IHByb3BzLm1lc3NhZ2UuY29sb3JTdHJpbmcgfHwgXCJcIiA6IFwiXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuc3R5bGUgPSB7Y29sb3I6IHJvbGVDb2xvcn07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbFR5cGU7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSwgb3JpZ2luYWxUeXBlKTtcbiAgICAgICAgfX0pO1xuICAgIH1cblxuICAgIHJlbW92ZUNvbG9yZWRUZXh0KCkge1xuICAgICAgICBsZXQgY2xhc3NOYW1lTWFya3VwID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXS5tYXJrdXBcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5cIitjbGFzc05hbWVNYXJrdXAuc3BsaXQoXCIgXCIpWzBdKS5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgICAgICAgZWxlbS5zdHlsZS5zZXRQcm9wZXJ0eShcImNvbG9yXCIsIFwiXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG59OyIsImltcG9ydCB7YmRDb25maWcsIGJkcGx1Z2lucywgYmR0aGVtZXMsIHNldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgZGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgeyBlbmNyeXB0U2V0dGluZ3NDYWNoZSwgZGVjcnlwdFNldHRpbmdzQ2FjaGUsIHByb2Nlc3NGaWxlIH0gZnJvbSBcIi4vcGx1Z2luQ2VydGlmaWVyXCI7XHJcblxyXG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xyXG5jb25zdCBNb2R1bGUgPSByZXF1aXJlKFwibW9kdWxlXCIpLk1vZHVsZTtcclxuTW9kdWxlLmdsb2JhbFBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwLmdldEFwcFBhdGgoKSwgXCJub2RlX21vZHVsZXNcIikpO1xyXG5jbGFzcyBNZXRhRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJNZXRhRXJyb3JcIjtcclxuICAgIH1cclxufVxyXG5jb25zdCBvcmlnaW5hbEpTUmVxdWlyZSA9IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5qc1wiXTtcclxuY29uc3Qgb3JpZ2luYWxDU1NSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA/IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gOiAoKSA9PiB7cmV0dXJuIG51bGw7fTtcclxuY29uc3Qgc3BsaXRSZWdleCA9IC9bXlxcU1xcclxcbl0qPyg/OlxcclxcbnxcXG4pW15cXFNcXHJcXG5dKj9cXCpbXlxcU1xcclxcbl0/LztcclxuY29uc3QgZXNjYXBlZEF0UmVnZXggPSAvXlxcXFxALztcclxuXHJcbmV4cG9ydCBsZXQgYWRkb25DYWNoZSA9IHt9XHJcblxyXG5sZXQgaGFzUGF0Y2hlZCA9IGZhbHNlXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDb250ZW50TWFuYWdlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50aW1lQ2FjaGUgPSB7fTtcclxuICAgICAgICB0aGlzLndhdGNoZXJzID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hFeHRlbnNpb25zKCl7XHJcbiAgICAgICAgaWYoaGFzUGF0Y2hlZClyZXR1cm5cclxuICAgICAgICBoYXNQYXRjaGVkID0gdHJ1ZVxyXG4gICAgICAgIE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5qc1wiXSA9IHRoaXMuZ2V0Q29udGVudFJlcXVpcmUoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA9IHRoaXMuZ2V0Q29udGVudFJlcXVpcmUoXCJ0aGVtZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGx1Z2luc0ZvbGRlcigpIHtyZXR1cm4gdGhpcy5fcGx1Z2luc0ZvbGRlciB8fCAodGhpcy5fcGx1Z2luc0ZvbGRlciA9IGZzLnJlYWxwYXRoU3luYyhwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGggKyBcInBsdWdpbnMvXCIpKSk7fVxyXG4gICAgZ2V0IHRoZW1lc0ZvbGRlcigpIHtyZXR1cm4gdGhpcy5fdGhlbWVzRm9sZGVyIHx8ICh0aGlzLl90aGVtZXNGb2xkZXIgPSBmcy5yZWFscGF0aFN5bmMocGF0aC5yZXNvbHZlKGJkQ29uZmlnLmRhdGFQYXRoICsgXCJ0aGVtZXMvXCIpKSk7fVxyXG5cclxuICAgIGxvYWRBZGRvbkNlcnRpZmllckNhY2hlKCl7XHJcbiAgICAgICAgaWYodHlwZW9mIGRhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIikgIT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKFwie31cIikpXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGUgPSBKU09OLnBhcnNlKGRlY3J5cHRTZXR0aW5nc0NhY2hlKGRhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIikpKVxyXG4gICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKFwie31cIikpXHJcbiAgICAgICAgICAgICAgICBhZGRvbkNhY2hlID0ge31cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBPYmplY3Qua2V5cyhhZGRvbkNhY2hlKVxyXG4gICAgICAgIC5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGFkZG9uQ2FjaGVba2V5XVxyXG4gICAgICAgICAgICBpZighdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKXJldHVybiBkZWxldGUgYWRkb25DYWNoZVtrZXldXHJcblxyXG4gICAgICAgICAgICBsZXQgcHJvcHMgPSBbe1xyXG4gICAgICAgICAgICAgICAga2V5OiBcInRpbWVzdGFtcFwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIlxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwicmVzdWx0XCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGtleTogXCJoYXNoXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXHJcbiAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICAgIGZvcihsZXQgcHJvcCBvZiBwcm9wcyl7XHJcbiAgICAgICAgICAgICAgICBpZighKHByb3Aua2V5IGluIHZhbHVlKSB8fCB0eXBlb2YgdmFsdWVbcHJvcC5rZXldICE9PSBwcm9wLnR5cGUpe1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih2YWx1ZS5oYXNoICE9PSBrZXkpe1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodmFsdWUucmVzdWx0LnN1c3BlY3QpeyAvLyByZWZldGNoIGZyb20gcmVtb3RlIHRvIGJlIHN1cmUgeW91J3JlIHVwIHRvIGRhdGUuXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtrZXldXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5zYXZlQWRkb25DYWNoZSgpXHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUFkZG9uQ2FjaGUoKXtcclxuICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKEpTT04uc3RyaW5naWZ5KGFkZG9uQ2FjaGUpKSlcclxuICAgIH1cclxuXHJcbiAgICB3YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcclxuICAgICAgICBpZiAodGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0pIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IGNvbnRlbnRUeXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0gPSBmcy53YXRjaChiYXNlRm9sZGVyLCB7cGVyc2lzdGVudDogZmFsc2V9LCBhc3luYyAoZXZlbnRUeXBlLCBmaWxlbmFtZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50VHlwZSB8fCAhZmlsZW5hbWUgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MCkpO1xyXG4gICAgICAgICAgICB0cnkge2ZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO31cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSBcIkVOT0VOVFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSByZXR1cm4gcGx1Z2luTW9kdWxlLnVubG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhlbWVNb2R1bGUudW5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTtcclxuICAgICAgICAgICAgaWYgKCFzdGF0cyB8fCAhc3RhdHMubXRpbWUgfHwgIXN0YXRzLm10aW1lLmdldFRpbWUoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKHN0YXRzLm10aW1lLmdldFRpbWUoKSkgIT09IFwibnVtYmVyXCIpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXSA9PSBzdGF0cy5tdGltZS5nZXRUaW1lKCkpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdID0gc3RhdHMubXRpbWUuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwicmVuYW1lXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgYXdhaXQgcGx1Z2luTW9kdWxlLmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gXCJjaGFuZ2VcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSBhd2FpdCBwbHVnaW5Nb2R1bGUucmVsb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhlbWVNb2R1bGUucmVsb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdW53YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0uY2xvc2UoKTtcclxuICAgICAgICBkZWxldGUgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV07XHJcbiAgICB9XHJcblxyXG4gICAgZXh0cmFjdE1ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0TGluZSA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIilbMF07XHJcbiAgICAgICAgY29uc3QgaGFzT2xkTWV0YSA9IGZpcnN0TGluZS5pbmNsdWRlcyhcIi8vTUVUQVwiKTtcclxuICAgICAgICBpZiAoaGFzT2xkTWV0YSkgcmV0dXJuIHRoaXMucGFyc2VPbGRNZXRhKGNvbnRlbnQpO1xyXG4gICAgICAgIGNvbnN0IGhhc05ld01ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvKipcIik7XHJcbiAgICAgICAgaWYgKGhhc05ld01ldGEpIHJldHVybiB0aGlzLnBhcnNlTmV3TWV0YShjb250ZW50KTtcclxuICAgICAgICB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSB3YXMgbm90IGZvdW5kLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZU9sZE1ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IG1ldGEgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xyXG4gICAgICAgIGNvbnN0IHJhd01ldGEgPSBtZXRhLnN1YnN0cmluZyhtZXRhLmxhc3RJbmRleE9mKFwiLy9NRVRBXCIpICsgNiwgbWV0YS5sYXN0SW5kZXhPZihcIiovL1wiKSk7XHJcbiAgICAgICAgaWYgKG1ldGEuaW5kZXhPZihcIk1FVEFcIikgPCAwKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSB3YXMgbm90IGZvdW5kLlwiKTtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBVdGlscy50ZXN0SlNPTihyYXdNZXRhKTtcclxuICAgICAgICBpZiAoIXBhcnNlZCkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgY291bGQgbm90IGJlIHBhcnNlZC5cIik7XHJcbiAgICAgICAgaWYgKCFwYXJzZWQubmFtZSkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgbWlzc2luZyBuYW1lIGRhdGEuXCIpO1xyXG4gICAgICAgIHBhcnNlZC5mb3JtYXQgPSBcImpzb25cIjtcclxuICAgICAgICByZXR1cm4gcGFyc2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlTmV3TWV0YShjb250ZW50KSB7XHJcbiAgICAgICAgY29uc3QgYmxvY2sgPSBjb250ZW50LnNwbGl0KFwiLyoqXCIsIDIpWzFdLnNwbGl0KFwiKi9cIiwgMSlbMF07XHJcbiAgICAgICAgY29uc3Qgb3V0ID0ge307XHJcbiAgICAgICAgbGV0IGZpZWxkID0gXCJcIjtcclxuICAgICAgICBsZXQgYWNjdW0gPSBcIlwiO1xyXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBibG9jay5zcGxpdChzcGxpdFJlZ2V4KSkge1xyXG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoMCkgPT09IFwiQFwiICYmIGxpbmUuY2hhckF0KDEpICE9PSBcIiBcIikge1xyXG4gICAgICAgICAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbCA9IGxpbmUuaW5kZXhPZihcIiBcIik7XHJcbiAgICAgICAgICAgICAgICBmaWVsZCA9IGxpbmUuc3Vic3RyKDEsIGwgLSAxKTtcclxuICAgICAgICAgICAgICAgIGFjY3VtID0gbGluZS5zdWJzdHIobCArIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWNjdW0gKz0gXCIgXCIgKyBsaW5lLnJlcGxhY2UoXCJcXFxcblwiLCBcIlxcblwiKS5yZXBsYWNlKGVzY2FwZWRBdFJlZ2V4LCBcIkBcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtLnRyaW0oKTtcclxuICAgICAgICBkZWxldGUgb3V0W1wiXCJdO1xyXG4gICAgICAgIG91dC5mb3JtYXQgPSBcImpzZG9jXCI7XHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250ZW50UmVxdWlyZSh0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVxdWlyZSA9IGlzUGx1Z2luID8gb3JpZ2luYWxKU1JlcXVpcmUgOiBvcmlnaW5hbENTU1JlcXVpcmU7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1vZHVsZSwgZmlsZW5hbWUpIHtcclxuICAgICAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gc2VsZi5wbHVnaW5zRm9sZGVyIDogc2VsZi50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc3NpYmxlUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSk7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwb3NzaWJsZVBhdGgpIHx8IGZpbGVuYW1lICE9PSBmcy5yZWFscGF0aFN5bmMocG9zc2libGVQYXRoKSkgcmV0dXJuIFJlZmxlY3QuYXBwbHkob3JpZ2luYWxSZXF1aXJlLCB0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgXCJ1dGY4XCIpO1xyXG4gICAgICAgICAgICBjb250ZW50ID0gVXRpbHMuc3RyaXBCT00oY29udGVudCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHNlbGYuZXh0cmFjdE1ldGEoY29udGVudCk7XHJcbiAgICAgICAgICAgIG1ldGEuZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgbWV0YS5hZGRlZCA9IHN0YXRzLmF0aW1lTXM7XHJcbiAgICAgICAgICAgIG1ldGEubW9kaWZpZWQgPSBzdGF0cy5tdGltZU1zO1xyXG4gICAgICAgICAgICBtZXRhLnNpemUgPSBzdGF0cy5zaXplO1xyXG4gICAgICAgICAgICBpZiAoIWlzUGx1Z2luKSB7XHJcbiAgICAgICAgICAgICAgICBtZXRhLmNzcyA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobWV0YS5mb3JtYXQgPT0gXCJqc29uXCIpIG1ldGEuY3NzID0gbWV0YS5jc3Muc3BsaXQoXCJcXG5cIikuc2xpY2UoMSkuam9pbihcIlxcblwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBgbW9kdWxlLmV4cG9ydHMgPSAke0pTT04uc3RyaW5naWZ5KG1ldGEpfTtgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpc1BsdWdpbikge1xyXG4gICAgICAgICAgICAgICAgbW9kdWxlLl9jb21waWxlKGNvbnRlbnQsIG1vZHVsZS5maWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRFeHBvcnQgPSAhVXRpbHMuaXNFbXB0eShtb2R1bGUuZXhwb3J0cyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlkRXhwb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YS50eXBlID0gbW9kdWxlLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBtZXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgVXRpbHMud2FybihcIk1vZHVsZSBOb3QgRXhwb3J0ZWRcIiwgYCR7bWV0YS5uYW1lfSwgcGxlYXNlIHN0YXJ0IHNldHRpbmcgbW9kdWxlLmV4cG9ydHNgKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGBcXG5tb2R1bGUuZXhwb3J0cyA9ICR7SlNPTi5zdHJpbmdpZnkobWV0YSl9O1xcbm1vZHVsZS5leHBvcnRzLnR5cGUgPSAke21ldGEuZXhwb3J0cyB8fCBtZXRhLm5hbWV9O2A7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbW9kdWxlLl9jb21waWxlKGNvbnRlbnQsIGZpbGVuYW1lKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VQbGFjZWhvbGRlclBsdWdpbihkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHtwbHVnaW46IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgIGdldE5hbWU6ICgpID0+IHtyZXR1cm4gZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWU7fSxcclxuICAgICAgICAgICAgICAgIGdldEF1dGhvcjogKCkgPT4ge3JldHVybiBcIj8/P1wiO30sXHJcbiAgICAgICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogKCkgPT4ge3JldHVybiBkYXRhLm1lc3NhZ2UgPyBkYXRhLm1lc3NhZ2UgOiBcIlRoaXMgcGx1Z2luIHdhcyB1bmFibGUgdG8gYmUgbG9hZGVkLiBDaGVjayB0aGUgYXV0aG9yJ3MgcGFnZSBmb3IgdXBkYXRlcy5cIjt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0VmVyc2lvbjogKCkgPT4ge3JldHVybiBcIj8/P1wiO31cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWUsXHJcbiAgICAgICAgICAgIGZpbGVuYW1lOiBkYXRhLmZpbGVuYW1lLFxyXG4gICAgICAgICAgICBzb3VyY2U6IGRhdGEuc291cmNlID8gZGF0YS5zb3VyY2UgOiBcIlwiLFxyXG4gICAgICAgICAgICB3ZWJzaXRlOiBkYXRhLndlYnNpdGUgPyBkYXRhLndlYnNpdGUgOiBcIlwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZmlsZW5hbWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZih0eXBlKSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuXHJcbiAgICAgICAgaWYoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTZcIl0pe1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpLCAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgfSwgKGhhc2gpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVjdDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g6IGhhc2gsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmlsZW5hbWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSwgdHJ1ZSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgaWYocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGVbcmVzdWx0Lmhhc2hdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgICAgICAgICBoYXNoOiByZXN1bHQuaGFzaCxcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQWRkb25DYWNoZSgpXHJcbiAgICAgICAgICAgICAgICBpZihyZXN1bHQuc3VzcGVjdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmlsZW5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGVuYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIlRoaXMgcGx1Z2luIG1pZ2h0IGJlIGRhbmdlcm91cyAoXCIrcmVzdWx0Lmhhcm0rXCIpLlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiVGhpcyBwbHVnaW4gbWlnaHQgYmUgZGFuZ2Vyb3VzIChcIityZXN1bHQuaGFybStcIikuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge3dpbmRvdy5yZXF1aXJlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO31cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgY29tcGlsZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07fVxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB3aW5kb3cucmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTtcclxuICAgICAgICBpZighY29udGVudC5uYW1lKXJldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNhbm5vdCBlc2NhcGUgdGhlIElELlwiLCBlcnJvcjogbmV3IEVycm9yKFwiQ2Fubm90IHJlYWQgcHJvcGVydHkgJ3JlcGxhY2UnIG9mIHVuZGVmaW5lZFwiKX1cclxuICAgICAgICBjb250ZW50LmlkID0gVXRpbHMuZXNjYXBlSUQoY29udGVudC5uYW1lKTtcclxuICAgICAgICAvL2lmKCFpZClyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJJbnZhbGlkIElEXCIsIGVycm9yOiBuZXcgRXJyb3IoXCJQbGVhc2UgZml4IHRoZSBuYW1lIG9mIFwiK2ZpbGVuYW1lK1wiLiBCZXR0ZXJEaXNjb3JkIGNhbid0IGVzY2FwZSBhbiBJRC5cIil9XHJcbiAgICAgICAgaWYgKGlzUGx1Z2luKSB7XHJcbiAgICAgICAgICAgIGlmICghY29udGVudC50eXBlKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50LnBsdWdpbiA9IG5ldyBjb250ZW50LnR5cGUoKTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBiZHBsdWdpbnNbY29udGVudC5wbHVnaW4uZ2V0TmFtZSgpXTtcclxuICAgICAgICAgICAgICAgIGJkcGx1Z2luc1tjb250ZW50LnBsdWdpbi5nZXROYW1lKCldID0gY29udGVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgY29uc3RydWN0ZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07fVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZGVsZXRlIGJkdGhlbWVzW2NvbnRlbnQubmFtZV07XHJcbiAgICAgICAgICAgIGJkdGhlbWVzW2NvbnRlbnQubmFtZV0gPSBjb250ZW50O1xyXG4gICAgICAgIH1cclxuICAgIH0gICBcclxuXHJcbiAgICB1bmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihmaWxlbmFtZSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mKHR5cGUpID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cucmVxdWlyZS5jYWNoZVt3aW5kb3cucmVxdWlyZS5yZXNvbHZlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSB1bmxvYWRlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFja319O31cclxuICAgIH1cclxuXHJcbiAgICBpc0xvYWRlZChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICB0cnkge3dpbmRvdy5yZXF1aXJlLmNhY2hlW3dpbmRvdy5yZXF1aXJlLnJlc29sdmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSldO31cclxuICAgICAgICBjYXRjaCAoZXJyKSB7cmV0dXJuIGZhbHNlO31cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZWxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgY2FudFVubG9hZCA9IHRoaXMudW5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICAgICAgaWYgKGNhbnRVbmxvYWQpIHJldHVybiBjYW50VW5sb2FkO1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkTmV3Q29udGVudCh0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhiYXNlZGlyKTtcclxuICAgICAgICBjb25zdCBjb250ZW50TGlzdCA9IE9iamVjdC52YWx1ZXMoaXNQbHVnaW4gPyBiZHBsdWdpbnMgOiBiZHRoZW1lcyk7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNvbnRlbnRMaXN0LmZpbHRlcih0ID0+ICFmaWxlcy5pbmNsdWRlcyh0LmZpbGVuYW1lKSkubWFwKGMgPT4gaXNQbHVnaW4gPyBjLnBsdWdpbi5nZXROYW1lKCkgOiBjLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGFkZGVkID0gZmlsZXMuZmlsdGVyKGYgPT4gIWNvbnRlbnRMaXN0LmZpbmQodCA9PiB0LmZpbGVuYW1lID09IGYpICYmIGYuZW5kc1dpdGgoZmlsZUVuZGluZykgJiYgZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGYpKS5pc0ZpbGUoKSk7XHJcbiAgICAgICAgcmV0dXJuIHthZGRlZCwgcmVtb3ZlZH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEFsbENvbnRlbnQodHlwZSkge1xyXG4gICAgICAgIHRoaXMucGF0Y2hFeHRlbnNpb25zKClcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcclxuICAgICAgICBjb25zdCBiYXNlZGlyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcclxuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCB0aGlzLmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgICAgICAgICAgaWYgKGVycm9yKSBlcnJvcnMucHVzaChlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXJyb3JzO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRQbHVnaW5zKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwicGx1Z2luXCIpO31cclxuICAgIGxvYWRUaGVtZXMoKSB7cmV0dXJuIHRoaXMubG9hZEFsbENvbnRlbnQoXCJ0aGVtZVwiKTt9XHJcbn07XHJcblxyXG4vKipcclxuICogRG9uJ3QgZXhwb3NlIGNvbnRlbnRNYW5hZ2VyIC0gY291bGQgYmUgZGFuZ2Vyb3VzIGZvciBub3dcclxuICovIiwiaW1wb3J0IHtiZENvbmZpZywgbWluU3VwcG9ydGVkVmVyc2lvbiwgYmJkVmVyc2lvbiwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luRXJyb3JzLCBiZHRoZW1lRXJyb3JzLCBiYmRDaGFuZ2Vsb2csIGRlZmF1bHRDb29raWUsIGN1cnJlbnREaXNjb3JkVmVyc2lvbiwgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgQkRMb2dvIGZyb20gXCIuLi91aS9iZExvZ29cIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgTGlnaHRjb3JkTG9nbyBmcm9tIFwiLi4vc3ZnL0xpZ2h0Y29yZFwiO1xyXG5pbXBvcnQgUGx1Z2luQ2VydGlmaWVyIGZyb20gXCIuL3BsdWdpbkNlcnRpZmllclwiO1xyXG5pbXBvcnQgZGlzdGFudCwgeyB1dWlkdjQgfSBmcm9tIFwiLi9kaXN0YW50XCI7XHJcbmltcG9ydCBFbW9qaU1vZHVsZSBmcm9tIFwiLi9lbW9qaU1vZHVsZVwiXHJcbmltcG9ydCB7cmVtb3RlIGFzIGVsZWN0cm9ufSBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgdjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IGNvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcblxyXG5sZXQgbWV0aG9kc1xyXG5mdW5jdGlvbiBDb3JlKCkge31cclxuXHJcblxyXG5Db3JlLnByb3RvdHlwZS5zZXRDb25maWcgPSBmdW5jdGlvbihjb25maWcpIHtcclxuICAgIGlmICh0aGlzLmhhc1N0YXJ0ZWQpIHJldHVybjtcclxuICAgIE9iamVjdC5hc3NpZ24oYmRDb25maWcsIGNvbmZpZyk7XHJcbn07XHJcblxyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ29yZS5wcm90b3R5cGUsIFwibWV0aG9kc1wiLCB7XHJcbiAgICBnZXQoKXtcclxuICAgICAgICByZXR1cm4gbWV0aG9kc1xyXG4gICAgfVxyXG59KVxyXG5cclxuQ29yZS5wcm90b3R5cGUuc2V0TWV0aG9kcyA9IGZ1bmN0aW9uKG0pIHtcclxuICAgIGlmICh0aGlzLmhhc1N0YXJ0ZWQpIHJldHVybjtcclxuICAgIG1ldGhvZHMgPSBtXHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbml0ID0gYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XHJcbiAgICB0aGlzLmhhc1N0YXJ0ZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmICghQXJyYXkucHJvdG90eXBlLmZsYXQpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCZXR0ZXJEaXNjb3JkIHZcIiArIGJiZFZlcnNpb24gKyBcIiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb2xkIHZlcnNpb24gKFwiICsgY3VycmVudERpc2NvcmRWZXJzaW9uICsgXCIpIG9mIERpc2NvcmQuIFBsZWFzZSB1cGRhdGUgeW91ciBEaXNjb3JkIGluc3RhbGxhdGlvbiBiZWZvcmUgcHJvY2VlZGluZy5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChiZENvbmZpZy52ZXJzaW9uIDwgbWluU3VwcG9ydGVkVmVyc2lvbikge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmRDb25maWcudmVyc2lvbiArIFwiICh5b3VyIHZlcnNpb24pXCIgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsYXRlc3QganMgKFwiICsgYmJkVmVyc2lvbiArIFwiKS48YnI+PGJyPiBQbGVhc2UgZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb20gPGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9yZWxlYXNlcy9sYXRlc3QnIHRhcmdldD0nX2JsYW5rJz5HaXRIdWI8L2E+XCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LkVEKSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmFuZGFnZWRCRCBkb2VzIG5vdCB3b3JrIHdpdGggRW5oYW5jZWREaXNjb3JkLiBQbGVhc2UgdW5pbnN0YWxsIG9uZSBvZiB0aGVtLlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvdy5XZWJTb2NrZXQgJiYgd2luZG93LldlYlNvY2tldC5uYW1lICYmIHdpbmRvdy5XZWJTb2NrZXQubmFtZS5pbmNsdWRlcyhcIlBhdGNoZWRcIikpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBQb3dlcmNvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoQXR0cmlidXRlcy5iaW5kKHRoaXMpLCBcIkxDIFBsdWdpbiBDZXJ0aWZpZXIgUGF0Y2hcIikoKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiSW5pdGlhbGl6aW5nIFNldHRpbmdzXCIpO1xyXG4gICAgdGhpcy5pbml0U2V0dGluZ3MoKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmNoZWNrRm9yR3VpbGRzKCk7XHJcbiAgICBCRFYyLmluaXRpYWxpemUoKTtcclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJVcGRhdGluZyBTZXR0aW5nc1wiKTtcclxuICAgIHNldHRpbmdzUGFuZWwuaW5pdGlhbGl6ZVNldHRpbmdzKCk7XHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgQWRkb25zIENhY2hlXCIpXHJcbiAgICBhd2FpdCBjb250ZW50TWFuYWdlci5sb2FkQWRkb25DZXJ0aWZpZXJDYWNoZSgpXHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgUGx1Z2luc1wiKTtcclxuICAgIGF3YWl0IHBsdWdpbk1vZHVsZS5sb2FkUGx1Z2lucygpO1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIFRoZW1lc1wiKTtcclxuICAgIGF3YWl0IHRoZW1lTW9kdWxlLmxvYWRUaGVtZXMoKTtcclxuXHJcbiAgICBET00uYWRkU3R5bGUoXCJjdXN0b21jc3NcIiwgQnVmZmVyLmZyb20oRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpLCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIikpO1xyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1kYy0wXCJdKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJ0bi5idG4tZGlzY29ubmVjdFwiKS5jbGljaygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgUGx1Z2luQ2VydGlmaWVyLnN0YXJ0KClcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiUmVtb3ZpbmcgTG9hZGluZyBJY29uXCIpO1xyXG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKS5sZW5ndGgpIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKVswXS5yZW1vdmUoKTtcclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJJbml0aWFsaXppbmcgTWFpbiBPYnNlcnZlclwiKTtcclxuICAgIHRoaXMuaW5pdE9ic2VydmVyKCk7XHJcblxyXG4gICAgLy8gU2hvdyBsb2FkaW5nIGVycm9yc1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSB7XHJcbiAgICAgICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkNvbGxlY3RpbmcgU3RhcnR1cCBFcnJvcnNcIik7XHJcbiAgICAgICAgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IGJkcGx1Z2luRXJyb3JzLCB0aGVtZXM6IGJkdGhlbWVFcnJvcnN9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwcmV2aW91c1ZlcnNpb24gPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwidmVyc2lvblwiKTtcclxuICAgIGlmIChiYmRWZXJzaW9uID4gcHJldmlvdXNWZXJzaW9uKSB7XHJcbiAgICAgICAgaWYgKGJiZENoYW5nZWxvZykgdGhpcy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwidmVyc2lvblwiLCBiYmRWZXJzaW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBFbW9qaU1vZHVsZS5zdGFydCgpXHJcblxyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaFNvY2lhbC5iaW5kKHRoaXMpLCBcIkJEIFNvY2lhbCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkUGlsbHMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBQaWxscyBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkTGlzdEl0ZW1zLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgTGlzdCBJdGVtcyBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkU2VwYXJhdG9yLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgU2VwYXJhdG9yIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoTWVzc2FnZUhlYWRlci5iaW5kKHRoaXMpLCBcIkJEIEJhZGdlIENoYXQgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hNZW1iZXJMaXN0LmJpbmQodGhpcyksIFwiQkQgQmFkZ2UgTWVtYmVyIExpc3QgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRhY2htZW50LmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xyXG5cclxuICAgIGlmKGJkQ29uZmlnLmhhdmVJbnN0YWxsZWREZWZhdWx0KXtcclxuICAgICAgICBsZXQgYWxlcnQgPSBVdGlscy5hbGVydChcIkZpcnN0IEluc3RhbGxhdGlvblwiLCBcIkFzIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBpbnN0YWxsIExpZ2h0Y29yZCwgV2UgYWRkZWQgdHdvIGRlZmF1bHQgdGhlbWVzIGFuZCBvbmUgZGVmYXVsdCBwbHVnaW4gaW4geW91ciBwbHVnaW4vdGhlbWUgZm9sZGVyLiBDaGVjayBpdCBpbiB0aGUgUGx1Z2luL1RoZW1lIHNldHRpbmdzLlwiKVxyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIGFsZXJ0Lm9uQ2xvc2UocmVzb2x2ZSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgY29uc3QgbG9nbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50ID4gZGl2LnR5cGVXaW5kb3dzLTF6YS1uNy53aXRoRnJhbWUtaGFZbHRJLnRpdGxlQmFyLUFDNHBHVi5ob3Jpem9udGFsUmV2ZXJzZS0zdFJqWTcuZmxleC0xTzFHS1kuZGlyZWN0aW9uUm93UmV2ZXJzZS1tOElqSXEuanVzdGlmeVN0YXJ0LTJOREZ6aS5hbGlnblN0cmV0Y2gtRHBHUGYzLmRhLXR5cGVXaW5kb3dzLmRhLXdpdGhGcmFtZS5kYS10aXRsZUJhci5kYS1ob3Jpem9udGFsUmV2ZXJzZS5kYS1mbGV4LmRhLWRpcmVjdGlvblJvd1JldmVyc2UuZGEtanVzdGlmeVN0YXJ0LmRhLWFsaWduU3RyZXRjaCA+IGRpdi53b3JkbWFya1dpbmRvd3MtMXYwbFlELndvcmRtYXJrLTJpRERmbS5kYS13b3JkbWFya1dpbmRvd3MuZGEtd29yZG1hcmtcIilcclxuICAgIGlmKGxvZ28pe1xyXG4gICAgICAgIGxvZ28uc3R5bGUudG9wID0gXCIzcHhcIlxyXG4gICAgICAgIGxvZ28uaW5uZXJIVE1MID0gYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjEwXCIgd2lkdGg9XCI3MFwiIHZpZXdCb3g9XCIwIDAgNzIuNTQgMTBcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAtNXB4LCBtYXJnaW4tdG9wOiAxMHB4XCI+XHJcbiAgICA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk00NC44MSw5LjY3VjYuMzNjMC0xLjIxLDIuMTMtMS40OSwyLjc4LS4yOGwyLS44MUEzLjUzLDMuNTMsMCwwLDAsNDYuMiwzYy0xLjkyLDAtMy44MSwxLjEzLTMuODEsMy4zM1Y5LjY3YzAsMi4yMSwxLjg5LDMuMzMsMy43NywzLjMzYTMuODcsMy44NywwLDAsMCwzLjQ1LTIuMThsLTIuMTItMUM0NywxMS4xNyw0NC44MSwxMC44NSw0NC44MSw5LjY3Wk0xMC42OCwxMi44OWgyLjQxVjMuMTdIMTAuNjhaTTcxLjc2LDMuMTRINjguMTlWNy4yM0w3MC41Nyw5LjR2LTRoMS4yN2MuODEsMCwxLjIxLjQxLDEuMjEsMXYzYzAsLjYzLS4zOCwxLjA1LTEuMjEsMS4wNUg2OC4xOHYyLjMxaDMuNTdjMS45MiwwLDMuNzItMSwzLjcyLTMuMlY2LjM5Qzc1LjQ4LDQuMTMsNzMuNjgsMy4xNCw3MS43NiwzLjE0Wk01NC4yMiwzYy0yLDAtNCwxLjEtNCwzLjM0VjkuNjZjMCwyLjIzLDIsMy4zNCw0LDMuMzRzMy45NS0xLjExLDMuOTUtMy4zNFY2LjM0QzU4LjE5LDQuMTEsNTYuMiwzLDU0LjIyLDNabTEuNTUsNi42NmMwLC43LS43OCwxLjA2LTEuNTQsMS4wNnMtMS41NS0uMzUtMS41NS0xLjA2VjYuMzRjMC0uNzIuNzUtMS4xLDEuNS0xLjFzMS41OS4zNSwxLjU5LDEuMVpNNjYuODQsNi4zNGMwLTIuMjktMS41OC0zLjItMy41NS0zLjJINTkuNDZ2OS43M2gyLjQ1VjkuNzdoLjQzbDIuMjIsMy4wOWgzTDY1LDkuNTJDNjYuMTMsOS4xNSw2Ni44NCw4LjE0LDY2Ljg0LDYuMzRaTTYzLjMzLDcuNjVINjEuOTFWNS40M2gxLjQyQTEuMTEsMS4xMSwwLDEsMSw2My4zMyw3LjY1Wk0yOS44MywxM2gyLjQyVjMuMDZIMjkuODNWNi43M2wtMywwVjMuMDlIMjQuN3Y5Ljc4aDIuMTRWOC42OGwzLDBaTTE3LjE2LDkuNzZWNi40MmMwLTEuMjEsMi4xMy0xLjQ5LDIuNzgtLjI4bDItLjgxYTMuNTUsMy41NSwwLDAsMC0zLjM2LTIuMjRjLTEuOTIsMC0zLjgxLDEuMTMtMy44MSwzLjMzVjkuNzZjMCwyLjIxLDIsMy4xNSwzLjksMy4xNXMzLjU4LTEsMy41OC0zVjcuNThIMTguNzlsMCwxLjM2SDIwLjN2Ljc3QzIwLjMsMTAuOTIsMTcuMTYsMTAuOTQsMTcuMTYsOS43NlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTIuOTMgLTMpXCIvPlxyXG4gICAgPHBvbHlnb24gZmlsbD1cImN1cnJlbnRDb2xvclwiIHBvaW50cz1cIjM1LjkxIDAuMDYgMzguNDMgMC4wNiAzOC40MyAxLjg0IDM1LjkyIDEuODEgMzUuOTcgMTAgMzMuNTUgMTAgMzMuNDkgMS43NSAzMC45OCAxLjc0IDMwLjk4IDAuMDYgMzMuNDkgMC4wNiAzNS45MSAwLjA2XCIvPlxyXG4gICAgPHBvbHlnb24gZmlsbD1cImN1cnJlbnRDb2xvclwiIHBvaW50cz1cIjAgOS45NyA2LjUgMTAgNi41IDcuNjMgMi40MSA3LjYzIDIuNDEgMC4yNiAwIDIuMjYgMCA5Ljk3XCIvPlxyXG48L3N2Zz5gXHJcbiAgICB9XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEF0dHJpYnV0ZXMgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGxldCBhdHRyaWJzUGF0Y2hzID0gW11cclxuICAgIHRoaXMuY2FuY2VsUGF0Y2hBdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgYXR0cmlic1BhdGNocy5mb3JFYWNoKGUgPT4gZSgpKVxyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlKCF2Mi5NZXNzYWdlQ29tcG9uZW50KWF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKVxyXG4gICAgXHJcbiAgICAvLyBUT0RPOiB0cnkgdG8gcGF0Y2ggY29ycmVjdGx5IHRoZSB1c2VyIHBvcG91dCBvbiBhIG5leHQgdXBkYXRlXHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJEaXNjb3JkVGFnXCIpXHJcbiAgICAudGhlbihEaXNjb3JkVGFnID0+IHtcclxuICAgICAgICBsZXQgRGlzY29yZFRhZ0NvbXAgPSBEaXNjb3JkVGFnLmRlZmF1bHRcclxuICAgICAgICBEaXNjb3JkVGFnLmRlZmF1bHQgPSBmdW5jdGlvbihwcm9wcyl7XHJcbiAgICAgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IERpc2NvcmRUYWdDb21wKHByb3BzKVxyXG5cclxuICAgICAgICAgICAgbGV0IGlkID0gdXVpZHY0KClcclxuXHJcbiAgICAgICAgICAgIGxldCBiYWRnZURpdiA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiBcIjVweFwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xyXG4gICAgICAgICAgICAgICAgaWQ6IFwiYmFkZ2VzLVwiK2lkLFxyXG4gICAgICAgICAgICAgICAga2V5OiBcImJhZGdlcy1cIitpZCxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmhlcml0XCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpXHJcblxyXG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBbcmV0dXJuVmFsdWVdXHJcblxyXG4gICAgICAgICAgICBpZiAocHJvcHMudXNlci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikgeyAvLyBSYXVlbnppOiBCYW5kYWdlZEJEIERldmVsb3BlclxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnVzZXIuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgcHJvcHMudXNlci5pZCA9PT0gXCI2OTYwMDM0NTY2MTEzODUzOTZcIil7IC8vIE5vdCBUaG9taXo6IExpZ2h0Y29yZCBEZXZlbG9wZXIsIFBob3JjeXM6IExpZ2h0Y29yZCBEZXZlbG9wZXJcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChiYWRnZURpdilcclxuICAgICAgICAgICAgbGV0IGRpdiA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBjaGlsZHJlbilcclxuICAgICAgICAgICAgYXBwbHlCYWRnZXMoaWQsIHByb3BzLnVzZXIsIGZhbHNlKVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGRpdlxyXG4gICAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgYXR0cmlic1BhdGNocy5wdXNoKFV0aWxzLm1vbmtleVBhdGNoKHYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlKXsgLy8gdGhpcyBjYW4gYmUgYSBibG9ja2VkIG1lc3NhZ2UgKG5vdCBvcGVuZWQpXHJcbiAgICAgICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHNbXCJkYXRhLW1lc3NhZ2UtaWRcIl0gPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UuaWRcclxuICAgICAgICB9XHJcbiAgICB9fSkpXHJcbiAgICAgICAgLypcclxuICAgIGF0dHJpYnNQYXRjaHMucHVzaChVdGlscy5tb25rZXlQYXRjaCh2Mi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHNbXCJtZXNzYWdlLWlkXCJdID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlLmlkXHJcbiAgICB9fSkpKi9cclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUuY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbigpIHtcclxuICAgIGxldCB0aW1lc0NoZWNrZWQgPSAwO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrRm9yR3VpbGRzID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXIgPSBCRFYyLmd1aWxkQ2xhc3Nlcy53cmFwcGVyLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9YCkubGVuZ3RoID4gMCkgdGltZXNDaGVja2VkKys7XHJcbiAgICAgICAgICAgIGNvbnN0IGd1aWxkID0gQkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICBjb25zdCBibG9iID0gQkRWMi5ndWlsZENsYXNzZXMuYmxvYkNvbnRhaW5lci5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAuJHt3cmFwcGVyfSAuJHtndWlsZH0gLiR7YmxvYn1gKS5sZW5ndGggPiAwKSByZXR1cm4gcmVzb2x2ZShiZENvbmZpZy5kZWZlckxvYWRlZCA9IHRydWUpO1xyXG4gICAgICAgICAgICBlbHNlIGlmICh0aW1lc0NoZWNrZWQgPj0gNTApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPSBcImxvYWRpbmdcIikgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiB7c2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTt9KTtcclxuICAgIH0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5qZWN0RXh0ZXJuYWxzID0gYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyBObyBleHRlcm5hbHNcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXRTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5pbml0aWFsaXplKCk7XHJcbiAgICBpZighRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpICYmICFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKXtcclxuICAgICAgICBpZiAoIURhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiKSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzQ29va2llLCBkZWZhdWx0Q29va2llKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIGRlZmF1bHRSUEMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBzZXR0aW5nc1BhbmVsLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBkZWZhdWx0Q29va2llKSB7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW3NldHRpbmddID0gZGVmYXVsdENvb2tpZVtzZXR0aW5nXTtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzUGFuZWwuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucHJvdG90eXBlICYmIGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnMpXHJcbiAgICAudGhlbihzZXR0aW5nTW9kdWxlID0+IHtcclxuXHJcbiAgICAgICAgbGV0IGdldFByZWRpY2F0ZVNlY3Rpb25zID0gc2V0dGluZ01vZHVsZS5kZWZhdWx0LnByb3RvdHlwZS5nZXRQcmVkaWNhdGVTZWN0aW9uc1xyXG4gICAgICAgIHNldHRpbmdNb2R1bGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnMgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZ2V0UHJlZGljYXRlU2VjdGlvbnMuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcblxyXG4gICAgICAgICAgICBpZighcmVzdWx0WzFdKXJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgaWYocmVzdWx0WzFdLnNlY3Rpb24gPT09IFwiTXkgQWNjb3VudFwiKXsgLy8gdXNlciBzZXR0aW5ncywgbm90IGd1aWxkIHNldHRpbmdzXHJcbiAgICAgICAgICAgICAgICBsZXQgcG9wZWQgPSBbXVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcclxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxyXG4gICAgICAgICAgICAgICAgcG9wZWQucHVzaChyZXN1bHQucG9wKCkpXHJcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcclxuXHJcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCguLi5zZXR0aW5nc1BhbmVsLnJlbmRlclNpZGViYXIodGhpcykpXHJcblxyXG4gICAgICAgICAgICAgICAgd2hpbGUocG9wZWRbMF0pe1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBvcGVkLnBvcCgpKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG59O1xyXG5cclxuXHJcbmxldCBjbGFzc05hbWVMYXllclxyXG5sZXQgY2xhc3NOYW1lU29jaWFsTGlua3NcclxubGV0IGNsYXNzTmFtZU1vZGFsXHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbml0T2JzZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25zdCBtYWluT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG1sZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbWxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG11dGF0aW9uID0gbXV0YXRpb25zW2ldO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbk1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIikgcGx1Z2luTW9kdWxlLnJhd09ic2VydmVyKG11dGF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdhcyBub3RoaW5nIGFkZGVkLCBza2lwXHJcbiAgICAgICAgICAgIGlmICghbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggfHwgIShtdXRhdGlvbi5hZGRlZE5vZGVzWzBdIGluc3RhbmNlb2YgRWxlbWVudCkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG11dGF0aW9uLmFkZGVkTm9kZXNbMF07XHJcblxyXG4gICAgICAgICAgICBpZighY2xhc3NOYW1lTGF5ZXIpY2xhc3NOYW1lTGF5ZXIgPSBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLmxheWVyICYmIHR5cGVvZiBlLmxheWVyID09PSBcInN0cmluZ1wiICYmIGUuYW5pbWF0aW5nKVswXS5sYXllclxyXG4gICAgICAgICAgICBpZighY2xhc3NOYW1lU29jaWFsTGlua3MpY2xhc3NOYW1lU29jaWFsTGlua3MgPSBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLnNvY2lhbExpbmtzICYmIHR5cGVvZiBlLnNvY2lhbExpbmtzID09PSBcInN0cmluZ1wiKVswXS5zb2NpYWxMaW5rc1xyXG4gICAgICAgICAgICBpZighY2xhc3NOYW1lTW9kYWwpY2xhc3NOYW1lTW9kYWwgPSBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLm1vZGFsICYmIHR5cGVvZiBlLm1vZGFsID09PSBcInN0cmluZ1wiICYmIGUuaW5uZXIgJiYgdHlwZW9mIGUuaW5uZXIgPT09IFwic3RyaW5nXCIgJiYgIWUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlKVswXS5tb2RhbFxyXG5cclxuICAgICAgICAgICAgaWYgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZUxheWVyKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSA9PT0gXCJHVUlMRF9TRVRUSU5HU1wiKXtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImxheWVyLWlkXCIsIFwic2VydmVyLXNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJzZXJ2ZXItc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVTb2NpYWxMaW5rcykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsYXllci1pZFwiLCBcInVzZXItc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInVzZXItc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudEVsZW1lbnQgPT0gZG9jdW1lbnQuYm9keSAmJiBub2RlLnF1ZXJ5U2VsZWN0b3IoXCIjYWNlX3NldHRpbmdzbWVudVwiKSkgbm9kZS5pZCA9IFwiYWNlX3NldHRpbmdzbWVudV9jb250YWluZXJcIjtcclxuXHJcbiAgICAgICAgICAgIC8vIEVtb2ppIFBpY2tlclxyXG4gICAgICAgICAgICAvL25vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImVtb2ppUGlja2VyLTNtMVMtalwiKS5sZW5ndGggJiYgIW5vZGUucXVlcnlTZWxlY3RvcihcIi5lbW9qaVBpY2tlci0zbTFTLWpcIikucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJhbmltYXRvckxlZnQtMUVReFUwXCIpXHJcbiAgICAgICAgICAgIC8vaWYgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZUxheWVyMikgJiYgbm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZUVtb2ppUGlja2VyKS5sZW5ndGggICYmICFub2RlLnF1ZXJ5U2VsZWN0b3IoXCIuXCIrY2xhc3NOYW1lRW1vamlQaWNrZXIpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZUFuaW1hdG9yTGVmdCkpIHF1aWNrRW1vdGVNZW51Lm9ic0NhbGxiYWNrKG5vZGUpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBtYWluT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwge1xyXG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcclxuICAgICAgICBzdWJ0cmVlOiB0cnVlXHJcbiAgICB9KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnNob3dDaGFuZ2Vsb2dNb2RhbCA9IGZ1bmN0aW9uKG9wdGlvbnMgPSB7fSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNob3dDaGFuZ2Vsb2dNb2RhbChvcHRpb25zKTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmFsZXJ0ID0gZnVuY3Rpb24odGl0bGUsIGNvbnRlbnQpIHtcclxuICAgIHJldHVybiBVdGlscy5hbGVydCh0aXRsZSwgY29udGVudCk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaFNvY2lhbCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuc29jaWFsUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IFRhYkJhciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiVGFiQmFyXCIpO1xyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICBpZiAoIVRhYkJhcikgcmV0dXJuO1xyXG4gICAgdGhpcy5zb2NpYWxQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKFRhYkJhci5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW47XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoIHx8IGNoaWxkcmVuLmxlbmd0aCA8IDMpIHJldHVybjtcclxuICAgICAgICBpZiAoY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gM10udHlwZS5kaXNwbGF5TmFtZSAhPT0gXCJTZXBhcmF0b3JcIikgcmV0dXJuO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMl0udHlwZS50b1N0cmluZygpLmluY2x1ZGVzKFwic29jaWFsTGlua3NcIikpIHJldHVybjtcclxuICAgICAgICBpZiAoQW5jaG9yKSB7XHJcbiAgICAgICAgICAgIGxldCBzb2NpYWxNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc29jaWFsTGlua3MpWzBdXHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMl0udHlwZTtcclxuICAgICAgICAgICAgY29uc3QgbmV3T25lID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5WYWwgPSBvcmlnaW5hbCguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxpbmsgXCIrc29jaWFsTW9kdWxlMS5saW5rLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLXNvY2lhbC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbC5wcm9wcy5jaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1zb2NpYWwtbGluayBcIitzb2NpYWxNb2R1bGUxLmxpbmssIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1zb2NpYWwtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlID0gbmV3T25lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1lQ29sb3JNdXRlZCxcclxuICAgICAgICAgICAgc2l6ZXMsXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZVZlcnNpb25IYXNoXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JNdXRlZClbMF0uY29sb3JNdXRlZCxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudmVyc2lvbkhhc2gpWzBdLnZlcnNpb25IYXNoXHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBjb25zdCB2ZXJzaW9uSGFzaCA9IGAoJHtiZENvbmZpZy5oYXNoID8gYmRDb25maWcuaGFzaC5zdWJzdHJpbmcoMCwgNykgOiBiZENvbmZpZy5icmFuY2h9KWA7XHJcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbCA9IFtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGAke2NsYXNzTmFtZUNvbG9yTXV0ZWR9ICR7c2l6ZXMuc2l6ZTEyfWB9LCBgTGlnaHRjb3JkICR7ZWxlY3Ryb24uZ2V0R2xvYmFsKFwiQnVpbGRJbmZvXCIpLnZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIGAoJHsoZWxlY3Ryb24uZ2V0R2xvYmFsKFwiQnVpbGRJbmZvXCIpLmNvbW1pdCB8fCBcIlVua25vd25cIikuc2xpY2UoMCwgNyl9KWApKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGAke2NsYXNzTmFtZUNvbG9yTXV0ZWR9ICR7c2l6ZXMuc2l6ZTEyfWB9LCBgQkJEICR7YmJkVmVyc2lvbn0gYCwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBjbGFzc05hbWVWZXJzaW9uSGFzaCtcIiBkYS12ZXJzaW9uSGFzaFwifSwgdmVyc2lvbkhhc2gpKVxyXG4gICAgICAgIF1cclxuICAgICAgICBcclxuXHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWZXJzaW9ucyA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnR5cGU7XHJcbiAgICAgICAgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udHlwZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXR1cm5WYWwgPSBvcmlnaW5hbFZlcnNpb25zKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIHJldHVyblZhbC5wcm9wcy5jaGlsZHJlbi5zcGxpY2UoMSwgMCwgYWRkaXRpb25hbCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7XHJcbiAgICAgICAgfTtcclxuICAgIH19KTtcclxufTtcclxuXHJcbmNvbnN0IGdldEd1aWxkQ2xhc3NlcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgZ3VpbGRzV3JhcHBlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwid3JhcHBlclwiLCBcInVucmVhZE1lbnRpb25zQmFyXCIpO1xyXG4gICAgY29uc3QgZ3VpbGRzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJndWlsZHNFcnJvclwiLCBcInNlbGVjdGVkXCIpO1xyXG4gICAgY29uc3QgcGlsbCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiYmxvYkNvbnRhaW5lclwiKTtcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBndWlsZHNXcmFwcGVyLCBndWlsZHMsIHBpbGwpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZExpc3RJdGVtcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuZ3VpbGRMaXN0SXRlbXNQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgR3VpbGRDbGFzc2VzID0gZ2V0R3VpbGRDbGFzc2VzKCk7XHJcbiAgICBjb25zdCBsaXN0SXRlbUNsYXNzID0gR3VpbGRDbGFzc2VzLmxpc3RJdGVtLnNwbGl0KFwiIFwiKVswXTtcclxuICAgIGNvbnN0IGJsb2JDbGFzcyA9IEd1aWxkQ2xhc3Nlcy5ibG9iQ29udGFpbmVyLnNwbGl0KFwiIFwiKVswXTtcclxuICAgIGNvbnN0IHJlYWN0SW5zdGFuY2UgPSBCRFYyLmdldEludGVybmFsSW5zdGFuY2UoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7bGlzdEl0ZW1DbGFzc30gLiR7YmxvYkNsYXNzfWApLnBhcmVudEVsZW1lbnQpO1xyXG4gICAgY29uc3QgR3VpbGRDb21wb25lbnQgPSByZWFjdEluc3RhbmNlLnJldHVybi50eXBlO1xyXG4gICAgaWYgKCFHdWlsZENvbXBvbmVudCkgcmV0dXJuO1xyXG4gICAgdGhpcy5ndWlsZExpc3RJdGVtc1BhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRDb21wb25lbnQucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEucmV0dXJuVmFsdWUgJiYgZGF0YS50aGlzT2JqZWN0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZTtcclxuICAgICAgICAgICAgY29uc3QgZ3VpbGREYXRhID0gZGF0YS50aGlzT2JqZWN0LnByb3BzO1xyXG4gICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSBcIiBiZC1ndWlsZFwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLnVucmVhZCkgY2xhc3NOYW1lICs9IFwiIGJkLXVucmVhZFwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLnNlbGVjdGVkKSBjbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS5hdWRpbykgY2xhc3NOYW1lICs9IFwiIGJkLWF1ZGlvXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEudmlkZW8pIGNsYXNzTmFtZSArPSBcIiBiZC12aWRlb1wiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmJhZGdlKSBjbGFzc05hbWUgKz0gXCIgYmQtYmFkZ2VcIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS5hbmltYXRhYmxlKSBjbGFzc05hbWUgKz0gXCIgYmQtYW5pbWF0YWJsZVwiO1xyXG4gICAgICAgICAgICByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgPSBjbGFzc05hbWVcclxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH19KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoR3VpbGRQaWxscyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuZ3VpbGRQaWxsUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IGd1aWxkUGlsbCA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHQgJiYgIW0uZGVmYXVsdC5kaXNwbGF5TmFtZSAmJiBtLmRlZmF1bHQudG9TdHJpbmcgJiYgbS5kZWZhdWx0LnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJ0cmFuc2xhdGUzZFwiKSk7XHJcbiAgICBpZiAoIWd1aWxkUGlsbCkgcmV0dXJuO1xyXG4gICAgdGhpcy5ndWlsZFBpbGxQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKGd1aWxkUGlsbCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdO1xyXG4gICAgICAgIGlmIChwcm9wcy51bnJlYWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLXVucmVhZFwiO1xyXG4gICAgICAgIGlmIChwcm9wcy5zZWxlY3RlZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcclxuICAgICAgICBpZiAocHJvcHMuaG92ZXJlZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtaG92ZXJlZFwiO1xyXG4gICAgICAgIHJldHVybiBkYXRhLnJldHVyblZhbHVlO1xyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuZ3VpbGRTZXBhcmF0b3JQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgR3VpbGRzID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJHdWlsZHNcIik7XHJcbiAgICBjb25zdCBndWlsZENvbXBvbmVudHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInJlbmRlckxpc3RJdGVtXCIpO1xyXG4gICAgaWYgKCFndWlsZENvbXBvbmVudHMgfHwgIUd1aWxkcykgcmV0dXJuO1xyXG4gICAgY29uc3QgR3VpbGRTZXBhcmF0b3IgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGd1aWxkQ29tcG9uZW50cy5TZXBhcmF0b3IoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtZ3VpbGQtc2VwYXJhdG9yXCI7XHJcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gICAgfTtcclxuICAgIHRoaXMuZ3VpbGRTZXBhcmF0b3JQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEd1aWxkcy5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuWzFdLnByb3BzLmNoaWxkcmVuWzNdLnR5cGUgPSBHdWlsZFNlcGFyYXRvcjtcclxuICAgIH19KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoQXR0YWNobWVudCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuQXR0YWNobWVudFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBBdHRhY2htZW50ID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiQXR0YWNobWVudFwiKVswXSAvLyB0ZW1wb3JhcnlcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFBbmNob3IgfHwgIUF0dGFjaG1lbnQgfHwgIUF0dGFjaG1lbnQuZGVmYXVsdCkgcmV0dXJuO1xyXG4gICAgdGhpcy5BdHRhY2htZW50UGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChBdHRhY2htZW50LCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSlyZXR1cm5cclxuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF0gfHwgbnVsbFxyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuXCIpO1xyXG5cclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFhdHRhY2htZW50IHx8ICFhdHRhY2htZW50LnVybClyZXR1cm5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xyXG4gICAgICAgICAgICBpZDogXCJjZXJ0aWZpZWQtXCIraWRcclxuICAgICAgICB9KSlcclxuICAgICAgICBQbHVnaW5DZXJ0aWZpZXIucGF0Y2goYXR0YWNobWVudCwgXCJjZXJ0aWZpZWQtXCIraWQpXHJcbiAgICB9fSlcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hNZXNzYWdlSGVhZGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5tZXNzYWdlSGVhZGVyUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IE1lc3NhZ2VIZWFkZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIk1lc3NhZ2VUaW1lc3RhbXBcIik7XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFNZXNzYWdlSGVhZGVyIHx8ICFNZXNzYWdlSGVhZGVyLmRlZmF1bHQpIHJldHVybjtcclxuICAgIHRoaXMubWVzc2FnZUhlYWRlclBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goTWVzc2FnZUhlYWRlciwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBhdXRob3IgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcIm1lc3NhZ2UuYXV0aG9yXCIpO1xyXG4gICAgICAgIC8vIGNvbnN0IGhlYWRlciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlbi4xLnByb3BzXCIpO1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuLjEucHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlblwiKTtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFhdXRob3IgfHwgIWF1dGhvci5pZClyZXR1cm5cclxuICAgICAgICAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGF1dGhvci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikgeyAvLyBSYXVlbnppOiBCYW5kYWdlZEJEIERldmVsb3BlclxyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhdXRob3IuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgYXV0aG9yLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXsgLy8gTm90IFRob21pejogTGlnaHRjb3JkIERldmVsb3BlciwgUGhvcmN5czogTGlnaHRjb3JkIERldmVsb3BlclxyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xyXG4gICAgICAgICAgICAgICAgaWQ6IFwiYmFkZ2VzLVwiK2lkLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImlubGluZVwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGFwcGx5QmFkZ2VzKGlkLCBhdXRob3IsIHRydWUpXHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBhcHBseUJhZGdlcyhpZCwgdXNlciwgY2hhdCl7XHJcbiAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJhZGdlcy1cIitpZClcclxuICAgICAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuXHJcbiAgICAgICAgaWYoZGl2LmNoaWxkTm9kZXMubGVuZ3RoKXJldHVyblxyXG4gICAgICAgIGxldCBibG9ja0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcclxuICAgICAgICBibG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcclxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoYmxvY2tEaXYpXHJcblxyXG4gICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG5cclxuICAgICAgICBkaXN0YW50LmdldEJhZGdlcyh1c2VyLmlkKVxyXG4gICAgICAgIC50aGVuKGJhZGdlcyA9PiB7XHJcbiAgICAgICAgICAgIGJhZGdlcy5mb3JFYWNoKGJhZGdlID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN2Zzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBcIjE2cHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1sb2dvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcIjE2cHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYmFkZ2Uuc2NvcGVzLmZvckVhY2goc2NvcGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHNjb3BlID09PSBcInVzZXJcIil7Ly8gcmVxdWlyZSB1c2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnVzZXIgPSB1c2VyXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkgXHJcbiAgICAgICAgICAgICAgICBpZighYmFkZ2UuaHJlZil7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuQW5jaG9yID0gQW5jaG9yXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuaHJlZiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjaGF0ID8gXCJiZC1jaGF0LWJhZGdlXCIgOiBcImJkLW1lbWJlci1iYWRnZVwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGJhZGdlLm5hbWUsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogYmFkZ2UubmFtZX0sXHJcbiAgICAgICAgICAgICAgICAgICAgYmFkZ2UuaHJlZiA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogYmFkZ2UuaHJlZixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjaGF0ID8gXCJiZC1jaGF0LWJhZGdlXCIgOiBcImJkLW1lbWJlci1iYWRnZVwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGJhZGdlLm5hbWUsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcclxuICAgICAgICAgICAgICAgICAgICB9LCBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoYmFkZ2UuY29tcG9uZW50LCBwcm9wcykpIDogQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KGJhZGdlLmNvbXBvbmVudCwgcHJvcHMpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoZWxlbWVudCwgZGl2MilcclxuICAgICAgICAgICAgICAgIGRpdjIuY2hpbGROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChub2RlKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfSlcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hNZW1iZXJMaXN0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5tZW1iZXJMaXN0UGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IE1lbWJlckxpc3RJdGVtID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNZW1iZXJMaXN0SXRlbVwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFBbmNob3IgfHwgIU1lbWJlckxpc3RJdGVtIHx8ICFNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUgfHwgIU1lbWJlckxpc3RJdGVtLnByb3RvdHlwZS5yZW5kZXJEZWNvcmF0b3JzKSByZXR1cm47XHJcbiAgICB0aGlzLm1lbWJlckxpc3RQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSwgXCJyZW5kZXJEZWNvcmF0b3JzXCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCB1c2VyID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnRoaXNPYmplY3QsIFwicHJvcHMudXNlclwiKTtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlblwiKTtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICF1c2VyIHx8ICF1c2VyLmlkKXJldHVyblxyXG4gICAgICAgIC8vIGlmIChoZWFkZXIgJiYgaGVhZGVyLmNsYXNzTmFtZSkgaGVhZGVyLmNsYXNzTmFtZSArPSBcIiBcIlxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcclxuICAgICAgICBpZiAodXNlci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikge1xyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHVzZXIuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgdXNlci5pZCA9PT0gXCI2OTYwMDM0NTY2MTEzODUzOTZcIil7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1tZW1iZXItYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiYWRnZXMtXCIraWR9KVxyXG4gICAgICAgIClcclxuICAgICAgICBhcHBseUJhZGdlcyhpZCwgdXNlciwgZmFsc2UpXHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS51cGRhdGVJbmplY3RvciA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gVGhlcmUgd2lsbCBuZXZlciBiZSBhbiBpbmplY3Rpb24gcGF0aCwgc28gd2UgZG8gbm90IG5lZWQgdGhlIGNvZGUgYmVsb3cuIFxyXG4gICAgLy8gSW5zZXJ0IGNvbW1lbnRzIHNvIGl0IHdpbGwgYmUgZXJhc2VkIHdoZW4gcHJvZHVjdGlvbi5cclxuICAgIFxyXG4gICAgY29uc3QgaW5qZWN0aW9uUGF0aCA9IERhdGFTdG9yZS5pbmplY3Rpb25QYXRoO1xyXG4gICAgaWYgKCFpbmplY3Rpb25QYXRoKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLypcclxuXHJcbiAgICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuICAgIGNvbnN0IHJtcmYgPSByZXF1aXJlKFwicmltcmFmXCIpO1xyXG4gICAgY29uc3QgeWF1emwgPSByZXF1aXJlKFwieWF1emxcIik7XHJcbiAgICBjb25zdCBta2RpcnAgPSByZXF1aXJlKFwibWtkaXJwXCIpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoXCJyZXF1ZXN0XCIpO1xyXG5cclxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLnJlc29sdmUoaW5qZWN0aW9uUGF0aCwgXCIuLlwiKTtcclxuICAgIGNvbnN0IGZvbGRlck5hbWUgPSBwYXRoLmJhc2VuYW1lKGluamVjdGlvblBhdGgpO1xyXG4gICAgY29uc3QgemlwTGluayA9IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9hcmNoaXZlL2luamVjdG9yLnppcFwiO1xyXG4gICAgY29uc3Qgc2F2ZWRaaXAgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgXCJpbmplY3Rvci56aXBcIik7XHJcbiAgICBjb25zdCBleHRyYWN0ZWRGb2xkZXIgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgXCJCZXR0ZXJEaXNjb3JkQXBwLWluamVjdG9yXCIpO1xyXG5cclxuICAgIC8vIERvd25sb2FkIHRoZSBpbmplY3RvciB6aXAgZmlsZVxyXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJEb3dubG9hZGluZyBcIiArIHppcExpbmspO1xyXG4gICAgbGV0IHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICByZXF1ZXN0LmdldCh7dXJsOiB6aXBMaW5rLCBlbmNvZGluZzogbnVsbH0sIGFzeW5jIChlcnJvciwgcmVzcG9uc2UsIGJvZHkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkgcmV0dXJuIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyBTYXZlIGEgYmFja3VwIGluIGNhc2Ugc29tZW9uZSBoYXMgdGhlaXIgb3duIGNvcHlcclxuICAgICAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5leGlzdHMoc2F2ZWRaaXAsIHJlcykpO1xyXG4gICAgICAgICAgICBpZiAoYWxyZWFkeUV4aXN0cykgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLnJlbmFtZShzYXZlZFppcCwgYCR7c2F2ZWRaaXB9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XHJcblxyXG4gICAgICAgICAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIldyaXRpbmcgXCIgKyBzYXZlZFppcCk7XHJcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZShzYXZlZFppcCwgYm9keSwgZXJyID0+IHJlc29sdmUoIWVycikpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBzdWNjZXNzO1xyXG5cclxuICAgIC8vIENoZWNrIGFuZCBkZWxldGUgcmVuYW1lIGV4dHJhY3Rpb25cclxuICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMuZXhpc3RzKGV4dHJhY3RlZEZvbGRlciwgcmVzKSk7XHJcbiAgICBpZiAoYWxyZWFkeUV4aXN0cykgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLnJlbmFtZShleHRyYWN0ZWRGb2xkZXIsIGAke2V4dHJhY3RlZEZvbGRlcn0uYmFrJHtNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpKX1gLCByZXMpKTtcclxuICAgIFxyXG4gICAgLy8gVW56aXAgdGhlIGRvd25sb2FkZWQgemlwIGZpbGVcclxuICAgIGNvbnN0IHppcGZpbGUgPSBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHlhdXpsLm9wZW4oc2F2ZWRaaXAsIHtsYXp5RW50cmllczogdHJ1ZX0sIChlcnIsIHppcCkgPT4gIHIoemlwKSkpO1xyXG4gICAgemlwZmlsZS5vbihcImVudHJ5XCIsIGZ1bmN0aW9uKGVudHJ5KSB7XHJcbiAgICAgICAgLy8gU2tpcCBkaXJlY3RvcmllcywgdGhleSBhcmUgaGFuZGxlZCB3aXRoIG1rZGlycFxyXG4gICAgICAgIGlmIChlbnRyeS5maWxlTmFtZS5lbmRzV2l0aChcIi9cIikpIHJldHVybiB6aXBmaWxlLnJlYWRFbnRyeSgpO1xyXG5cclxuICAgICAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkV4dHJhY3RpbmcgXCIgKyBlbnRyeS5maWxlTmFtZSk7XHJcbiAgICAgICAgLy8gTWFrZSBhbnkgbmVlZGVkIHBhcmVudCBkaXJlY3Rvcmllc1xyXG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIGVudHJ5LmZpbGVOYW1lKTtcclxuICAgICAgICBta2RpcnAuc3luYyhwYXRoLmRpcm5hbWUoZnVsbFBhdGgpKTtcclxuICAgICAgICB6aXBmaWxlLm9wZW5SZWFkU3RyZWFtKGVudHJ5LCBmdW5jdGlvbihlcnIsIHJlYWRTdHJlYW0pIHtcclxuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmVhZFN0cmVhbS5vbihcImVuZFwiLCBmdW5jdGlvbigpIHt6aXBmaWxlLnJlYWRFbnRyeSgpO30pOyAvLyBHbyB0byBuZXh0IGZpbGUgYWZ0ZXIgdGhpc1xyXG4gICAgICAgICAgICByZWFkU3RyZWFtLnBpcGUoZnMuY3JlYXRlV3JpdGVTdHJlYW0oZnVsbFBhdGgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgemlwZmlsZS5yZWFkRW50cnkoKTsgLy8gU3RhcnQgcmVhZGluZ1xyXG5cclxuICAgIC8vIFdhaXQgZm9yIHRoZSBmaW5hbCBmaWxlIHRvIGZpbmlzaFxyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB6aXBmaWxlLm9uY2UoXCJlbmRcIiwgcmVzb2x2ZSkpO1xyXG5cclxuICAgIC8vIFNhdmUgYSBiYWNrdXAgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgZmluYWwgc3RlcFxyXG4gICAgY29uc3QgYmFja3VwRm9sZGVyID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIGAke2ZvbGRlck5hbWV9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCk7XHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShpbmplY3Rpb25QYXRoLCBiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcclxuXHJcbiAgICAvLyBSZW5hbWUgdGhlIGV4dHJhY3RlZCBmb2xkZXIgdG8gd2hhdCBpdCBzaG91bGQgYmVcclxuICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIGBSZW5hbWluZyAke3BhdGguYmFzZW5hbWUoZXh0cmFjdGVkRm9sZGVyKX0gdG8gJHtmb2xkZXJOYW1lfWApO1xyXG4gICAgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGV4dHJhY3RlZEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgZXJyID0+IHJlc29sdmUoIWVycikpKTtcclxuICAgIGlmICghc3VjY2Vzcykge1xyXG4gICAgICAgIFV0aWxzLmVycihcIkluamVjdG9yVXBkYXRlXCIsIFwiRmFpbGVkIHRvIHJlbmFtZSB0aGUgZmluYWwgZGlyZWN0b3J5XCIpO1xyXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHJlbmFtZSBoYWQgaXNzdWVzLCBkZWxldGUgd2hhdCB3ZSB0cmllZCB0byByZW5hbWUgYW5kIHJlc3RvcmUgYmFja3VwXHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcclxuICAgICAgICBVdGlscy5lcnIoXCJJbmplY3RvclVwZGF0ZVwiLCBcIlNvbWV0aGluZyB3ZW50IHdyb25nLi4uIHJlc3RvcmluZyBiYWNrdXBzLlwiKTtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJtcmYoZXh0cmFjdGVkRm9sZGVyLCByZXNvbHZlKSk7XHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy5yZW5hbWUoYmFja3VwRm9sZGVyLCBpbmplY3Rpb25QYXRoLCByZXNvbHZlKSk7XHJcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgd2UndmUgZ290dGVuIHRvIHRoaXMgcG9pbnQsIGV2ZXJ5dGhpbmcgc2hvdWxkIGhhdmUgZ29uZSBzbW9vdGhseS5cclxuICAgIC8vIENsZWFudXAgdGhlIGJhY2t1cCBmb2xkZXIgdGhlbiByZW1vdmUgdGhlIHppcFxyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBybXJmKGJhY2t1cEZvbGRlciwgcmVzb2x2ZSkpO1xyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy51bmxpbmsoc2F2ZWRaaXAsIHJlc29sdmUpKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkluamVjdG9yIFVwZGF0ZWQhXCIpO1xyXG4gICAgcmV0dXJuIHN1Y2Nlc3M7Ki9cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBDb3JlKCk7XHJcblxyXG4vKipcclxuICogRG9uJ3QgZXhwb3NlIGNvcmUgLSBjb3VsZCBiZSBkYW5nZXJvdXMgZm9yIG5vd1xyXG4gKi8iLCJjb25zdCBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA9IHdpbmRvdy5yZXF1aXJlXHJcblxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcblxyXG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5jb25zdCByZWxlYXNlQ2hhbm5lbCA9IERpc2NvcmROYXRpdmUuZ2xvYmFscyA/IERpc2NvcmROYXRpdmUuZ2xvYmFscy5yZWxlYXNlQ2hhbm5lbCA6IERpc2NvcmROYXRpdmUuYXBwID8gRGlzY29yZE5hdGl2ZS5hcHAuZ2V0UmVsZWFzZUNoYW5uZWwoKSA6IFwic3RhYmxlXCI7XHJcblxyXG5sZXQgZGF0YVBhdGggPSBcIlwiO1xyXG5pZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSBkYXRhUGF0aCA9IHByb2Nlc3MuZW52LkFQUERBVEE7XHJcbmVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCIpIGRhdGFQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUsIFwiTGlicmFyeVwiLCBcIlByZWZlcmVuY2VzXCIpO1xyXG5lbHNlIGRhdGFQYXRoID0gcHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FID8gcHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FIDogcGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUsIFwiLmNvbmZpZ1wiKTtcclxuZGF0YVBhdGggPSBwYXRoLmpvaW4oZGF0YVBhdGgsIFwiQmV0dGVyRGlzY29yZFwiKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEYXRhU3RvcmUge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0ge3NldHRpbmdzOiB7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX19O1xyXG4gICAgICAgIHRoaXMucGx1Z2luRGF0YSA9IHt9O1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5EYXRhU3RvcmUgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5CREZpbGUpKSBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcInV0Zi04XCIpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5CREZpbGUsIFwidXRmLThcIikpXHJcbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KFwic2V0dGluZ3NcIikpIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLnNldHRpbmdzRmlsZSkpIHJldHVybjtcclxuICAgICAgICAgICAgbGV0IHNldHRpbmdzID0gX19ub25fd2VicGFja19yZXF1aXJlX18odGhpcy5zZXR0aW5nc0ZpbGUpO1xyXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHRoaXMuc2V0dGluZ3NGaWxlKTtcclxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLmhhc093blByb3BlcnR5KFwic2V0dGluZ3NcIikpIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX0sIHtbcmVsZWFzZUNoYW5uZWxdOiBzZXR0aW5nc30pO1xyXG4gICAgICAgICAgICBlbHNlIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX0sIHNldHRpbmdzKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRCRERhdGEoXCJzZXR0aW5nc1wiLCBzZXR0aW5ncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICBVdGlscy5hbGVydChcIkNvcnJ1cHQgU3RvcmFnZVwiLCBcIlRoZSBiZCBzdG9yYWdlIGhhcyBzb21laG93IGJlY29tZSBjb3JydXB0LiBZb3UgbWF5IGVpdGhlciB0cnkgdG8gc2FsdmFnZSB0aGUgZmlsZSBvciBkZWxldGUgaXQgdGhlbiByZWxvYWQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgaW5qZWN0aW9uUGF0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX2luamVjdGlvblBhdGgpIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoO1xyXG4gICAgICAgIGNvbnN0IGVsZWN0cm9uID0gcmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5hcHA7XHJcbiAgICAgICAgY29uc3QgYmFzZSA9IGVsZWN0cm9uLmdldEFwcFBhdGgoKTtcclxuICAgICAgICBjb25zdCByb2FtaW5nQmFzZSA9IGVsZWN0cm9uLmdldFBhdGgoXCJ1c2VyRGF0YVwiKTtcclxuICAgICAgICBjb25zdCByb2FtaW5nTG9jYXRpb24gPSBwYXRoLnJlc29sdmUocm9hbWluZ0Jhc2UsIGVsZWN0cm9uLmdldFZlcnNpb24oKSwgXCJtb2R1bGVzXCIsIFwiZGlzY29yZF9kZXNrdG9wX2NvcmVcIiwgXCJpbmplY3RvclwiKTtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHBhdGgucmVzb2x2ZShiYXNlLCBcIi4uXCIsIFwiYXBwXCIpO1xyXG4gICAgICAgIGNvbnN0IHJlYWxMb2NhdGlvbiA9IGZzLmV4aXN0c1N5bmMobG9jYXRpb24pID8gbG9jYXRpb24gOiBmcy5leGlzdHNTeW5jKHJvYW1pbmdMb2NhdGlvbikgPyByb2FtaW5nTG9jYXRpb24gOiBudWxsO1xyXG4gICAgICAgIGlmICghcmVhbExvY2F0aW9uKSByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSByZWFsTG9jYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbmZpZ0ZpbGUoKSB7cmV0dXJuIHRoaXMuX2NvbmZpZ0ZpbGUgfHwgKHRoaXMuX2NvbmZpZ0ZpbGUgPSBwYXRoLnJlc29sdmUodGhpcy5pbmplY3Rpb25QYXRoLCBcImJldHRlcmRpc2NvcmRcIiwgXCJjb25maWcuanNvblwiKSk7fVxyXG4gICAgZ2V0IEJERmlsZSgpIHtyZXR1cm4gdGhpcy5fQkRGaWxlIHx8ICh0aGlzLl9CREZpbGUgPSBwYXRoLnJlc29sdmUoZGF0YVBhdGgsIFwiYmRzdG9yYWdlLmpzb25cIikpO31cclxuICAgIGdldCBzZXR0aW5nc0ZpbGUoKSB7cmV0dXJuIHRoaXMuX3NldHRpbmdzRmlsZSB8fCAodGhpcy5fc2V0dGluZ3NGaWxlID0gcGF0aC5yZXNvbHZlKGRhdGFQYXRoLCBcImJkc2V0dGluZ3MuanNvblwiKSk7fVxyXG4gICAgZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSB7cmV0dXJuIHBhdGgucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBwbHVnaW5OYW1lICsgXCIuY29uZmlnLmpzb25cIik7fVxyXG5cclxuICAgIGdldFNldHRpbmdHcm91cChrZXkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnNldHRpbmdzW3JlbGVhc2VDaGFubmVsXVtrZXldIHx8IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2V0dGluZ0dyb3VwKGtleSwgZGF0YSkge1xyXG4gICAgICAgIHRoaXMuZGF0YS5zZXR0aW5nc1tyZWxlYXNlQ2hhbm5lbF1ba2V5XSA9IGRhdGE7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLkJERmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCA0KSwgXCJ1dGYtOFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCRERhdGEoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QkREYXRhKGtleSwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLmRhdGFba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwidXRmLThcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgICAgICBpZiAodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSkpKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID09PSB1bmRlZmluZWQpIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9IHt9O1xyXG4gICAgICAgIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSksIEpTT04uc3RyaW5naWZ5KHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSwgbnVsbCwgNCksIFwidXRmLThcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlUGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgICAgICBpZiAodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID09PSB1bmRlZmluZWQpIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9IHt9O1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdLCBudWxsLCA0KSwgXCJ1dGYtOFwiKTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEZXZNb2RlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuZGVidWdMaXN0ZW5lciA9IHRoaXMuZGVidWdMaXN0ZW5lci5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIgPSB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLWRtLTFcIl0pIHRoaXMuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgdGhpcy5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnREZWJ1Z0xpc3RlbmVyKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmRlYnVnTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3BEZWJ1Z0xpc3RlbmVyKCkge1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuZGVidWdMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRDb3B5U2VsZWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3BDb3B5U2VsZWN0b3IoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlYnVnTGlzdGVuZXIoZSkge1xyXG4gICAgICAgIGlmIChlLndoaWNoID09PSAxMTkgfHwgZS53aGljaCA9PSAxMTgpIHsvL0Y4XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiJWNbJWNEZXZNb2RlJWNdICVjQnJlYWsvUmVzdW1lXCIsIFwiY29sb3I6IHJlZDtcIiwgXCJjb2xvcjogIzMwMzAzMDsgZm9udC13ZWlnaHQ6NzAwO1wiLCBcImNvbG9yOnJlZDtcIiwgXCJcIik7XHJcbiAgICAgICAgICAgIGRlYnVnZ2VyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWRlYnVnZ2VyXHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvcHlTZWxlY3Rvckxpc3RlbmVyKGUpIHtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy5nZXRTZWxlY3RvcihlLnRhcmdldCk7XHJcbiAgICBcclxuICAgICAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgICAgIGNsYXNzTGF5ZXIsIFxyXG4gICAgICAgICAgICAgICAgY2xhc3NJdGVtc1xyXG4gICAgICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5sYXllciAmJiB0eXBlb2YgZS5sYXllciA9PT0gXCJzdHJpbmdcIiAmJiBlLmRpc2FibGVkUG9pbnRlckV2ZW50cylbMF0sXHJcbiAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLm1lbnUpWzBdXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGF0dGFjaCgpIHtcclxuICAgICAgICAgICAgICAgIGlmKCFjbGFzc0l0ZW1zIHx8ICFjbGFzc0xheWVyLmxheWVyKXJldHVybiBjb25zb2xlLmxvZyhjbGFzc0l0ZW1zLCBjbGFzc0xheWVyLmxheWVyKVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjbSA9IERPTS5xdWVyeShcIi5cIitVdGlscy5yZW1vdmVEYShjbGFzc0l0ZW1zLm1lbnUpKTtcclxuICAgICAgICAgICAgICAgIGlmICghY20pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBET00ucXVlcnkoXCIjYXBwLW1vdW50ID4gLlwiK1V0aWxzLnJlbW92ZURhKGNsYXNzTGF5ZXIubGF5ZXJDb250YWluZXIpKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbVdyYXAgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NMYXllci5sYXllcn1cIj5gKTtcclxuICAgICAgICAgICAgICAgICAgICBjbSA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLm1lbnV9ICR7Y2xhc3NJdGVtcy5zdHlsZUZsZXhpYmxlfSAke2NsYXNzSXRlbXMuYWNjb21tb2RhdGVTY3JvbGxiYXJ9IGJkLWNvbnRleHQtbWVudVwiIHN0eWxlPVwiXCI+PC9kaXY+YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLmFwcGVuZChjbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChjbVdyYXApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS50b3AgPSBlLmNsaWVudFkgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLmxlZnQgPSBlLmNsaWVudFggKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJtZW51XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIilcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuaWQgPSBcImJkLWNvcHktc2VsZWN0b3ItY29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJDb3B5IFNlbGVjdG9yIEFjdGlvbnNcIilcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXJDbGFzc2VzID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5zY3JvbGxlcldyYXApWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXJXcmFwID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke3Njcm9sbGVyQ2xhc3Nlcy5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJDbGFzc2VzLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyQ2xhc3Nlcy50aGVtZUdob3N0SGFpcmxpbmV9XCI+PC9kaXY+YClcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxlciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxlcilbMF0uc2Nyb2xsZXJ9ICR7Y2xhc3NJdGVtcy5zY3JvbGxlcn1cIj48L2Rpdj5gKVxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyV3JhcC5hcHBlbmQoc2Nyb2xsZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgY20uYXBwZW5kKHNjcm9sbGVyV3JhcClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlQ00gPSBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgJiYgZS5rZXlDb2RlICE9PSAyNykgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbVdyYXAucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtV3JhcCA9IGNtLnBhcmVudEVsZW1lbnRcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBjbS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtZyA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IHJvbGU9XCJncm91cFwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtaSA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLml0ZW19ICR7Y2xhc3NJdGVtcy5sYWJlbENvbnRhaW5lcn0gJHtjbGFzc0l0ZW1zLmNvbG9yRGVmYXVsdH1cIiByb2xlPVwibWVudWl0ZW1cIiBpZD1cImJkLWNvcHktc2VsZWN0b3ItaXRlbS1jbVwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgY21pLmFwcGVuZChET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5sYWJlbH1cIj5Db3B5IFNlbGVjdG9yPC9kaXY+YCkpO1xyXG4gICAgICAgICAgICAgICAgY21pLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5OYXRpdmVNb2R1bGUuY29weShzZWxlY3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBjbWkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50cyA9IERPTS5xdWVyeUFsbChcImRpdltyb2xlPW1lbnVpdGVtXS5cIitVdGlscy5yZW1vdmVEYShjbGFzc0l0ZW1zLmZvY3VzZWQpKVxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzICYmIGVsZW1lbnRzLmZvckVhY2goZWxlbSA9PiBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NJdGVtcy5mb2N1c2VkKSlcclxuICAgICAgICAgICAgICAgICAgICBjbWkuY2xhc3NMaXN0LmFkZChjbGFzc0l0ZW1zLmZvY3VzZWQpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgY21pLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNtaS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzSXRlbXMuZm9jdXNlZClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBjbWcuYXBwZW5kKGNtaSk7XHJcbiAgICAgICAgICAgICAgICBpZihzY3JvbGxlci5jaGlsZE5vZGVzLmxlbmd0aCl7IC8vIGFwZW5kIGEgc2VwYXJhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgcm9sZT1cInNlcGFyYXRvclwiIGNsYXNzPVwiJHtjbGFzc0l0ZW1zLnNlcGFyYXRvcn1cIj48L2Rpdj5gKVxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyLmFwcGVuZChzZXBhcmF0b3IpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQoY21nKTtcclxuICAgICAgICAgICAgICAgIGlmKGNtV3JhcC5jbGllbnRIZWlnaHQgPCBjbVdyYXAuc2Nyb2xsSGVpZ2h0KXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm92ZXJmbG93aW5nIFwiK2NtV3JhcC5zdHlsZS50b3ApXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLnRvcCA9IChjbVdyYXAuc3R5bGUudG9wIC0gY21nLmNsaWVudEhlaWdodCkgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvdmVyZmxvd2luZ1wiK2NtV3JhcC5zdHlsZS50b3ApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGF0dGFjaCwgMSk7XHJcbiAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNlbGVjdG9yKGVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5pZCkgcmV0dXJuIGAjJHtlbGVtZW50LmlkfWA7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZnVuY3Rpb24gZnVsbFBhdGgoZWwpe1xyXG4gICAgICAgICAgICB2YXIgbmFtZXMgPSBbXTtcclxuICAgICAgICAgICAgd2hpbGUgKGVsLnBhcmVudE5vZGUpe1xyXG4gICAgICAgICAgICAgIGlmIChlbC5pZCl7XHJcbiAgICAgICAgICAgICAgICBuYW1lcy51bnNoaWZ0KCcjJytlbC5pZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGlmIChlbD09ZWwub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIG5hbWVzLnVuc2hpZnQoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpK0FycmF5LmZyb20oZWwuY2xhc3NMaXN0LmVudHJpZXMoKSkubWFwKGUgPT4gXCIuXCIrZSkuam9pbihcIlwiKSk7XHJcbiAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTEsZT1lbDtlLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7ZT1lLnByZXZpb3VzRWxlbWVudFNpYmxpbmcsYysrKTtcclxuICAgICAgICAgICAgICAgICAgbmFtZXMudW5zaGlmdChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkrKCh0eXBlb2YgZWwuY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsLmNsYXNzTmFtZSkgfHwgXCJcIikuc3BsaXQoXCIgXCIpLmZpbHRlcihlID0+ICEhZSkubWFwKGUgPT4gXCIuXCIrZSkuam9pbihcIlwiKStcIjpudGgtY2hpbGQoXCIrYytcIilcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbD1lbC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmFtZXMuam9pbihcIiA+IFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZ1bGxQYXRoKGVsZW1lbnQpXHJcbiAgICB9XHJcbn07IiwiZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIERpc2FibGVUeXBpbmcge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5zdGFydFR5cGluZylcbiAgICAgICAgLnRoZW4odHlwaW5nTW9kdWxlID0+IHtcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUeXBpbmcgPSB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdGFydFR5cGluZ1xuICAgICAgICAgICAgdHlwaW5nTW9kdWxlLmRlZmF1bHQuc3RhcnRUeXBpbmcgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0YXJ0VHlwaW5nLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RvcFR5cGluZyA9IHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmdcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmcgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0b3BUeXBpbmcuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZVxuICAgICAgICB9KVxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRGlzYWJsZVR5cGluZyA9IHRoaXNcbiAgICB9XG5cbiAgICBkaXNhYmxlKCl7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgZW5hYmxlKCl7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZVxuICAgIH1cbn0iLCJpbXBvcnQgQnVnSHVudGVyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9idWdfaHVudGVyXCJcclxuaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiXHJcbmltcG9ydCB7IHNldHRpbmdzQ29va2llIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDaXJjdXMgZnJvbSBcIi4uL3N2Zy9jaXJjdXNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjQoKSB7IC8vIEdlbmVyYXRlIFVVSUQgKE5vIGNyeXB0byBybmcpXHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XHJcbiAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xyXG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG59ICBcclxuXHJcbmNvbnN0IGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXMgPSB7fVxyXG5sZXQgYmFkZ2VzVG9GZXRjaCA9IFtdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGlzdGFudFNlcnZlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuX2NhY2hlID0ge1xyXG4gICAgICAgICAgICBiYWRnZXM6IHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRpc3RhbnRTZXJ2ZXIgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhY2hlKCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlXHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNhY2hlKGRhdGEpe1xyXG4gICAgICAgIGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB0aGlzLl9jYWNoZSAhPT0gXCJvYmplY3RcIilyZXR1cm4gdGhpcy5fY2FjaGUgPSBkYXRhXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlID0gT2JqZWN0LmFzc2lnbih0aGlzLl9jYWNoZSwgZGF0YSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBjdXN0b20gYmFkZ2VzIGZyb20gdGhlIHVzZXIgSUQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlciBUaGUgdXNlciBJRCBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnN0YW50c1tcImJhZGdlc1wiXT59XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldEJhZGdlcyh1c2VyKXtcclxuICAgICAgICBpZih0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXSlyZXR1cm4gdGhpcy5jYWNoZS5iYWRnZXNbdXNlcl1cclxuICAgICAgICBpZihhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdKXJldHVybiBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdXHJcblxyXG4gICAgICAgIGxldCByZXNvbHZlXHJcbiAgICAgICAgY29uc3QgbmV3UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXMpID0+IChyZXNvbHZlID0gcmVzKSlcclxuICAgICAgICBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdID0gbmV3UHJvbWlzZVxyXG5cclxuICAgICAgICBjb25zdCBiYWRnZXMgPSBbXVxyXG4gICAgICAgIGZvcihsZXQgYmFkZ2Ugb2YgQ29uc3RhbnRzLmJhZGdlcyl7XHJcbiAgICAgICAgICAgIGlmKGJhZGdlLmRlZmF1bHRVc2Vycy5pbmNsdWRlcyh1c2VyKSliYWRnZXMucHVzaChiYWRnZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmV0Y2hlZEJhZGdlcyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC01XCJdKXJldHVybiByZXNvbHZlKFtdKVxyXG4gICAgICAgICAgICBiYWRnZXNUb0ZldGNoLnB1c2goW3VzZXIsIHJlc29sdmVdKVxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB1c2VycyA9IGJhZGdlc1RvRmV0Y2hcclxuICAgICAgICAgICAgICAgIGlmKHVzZXJzLmxlbmd0aCA9PT0gMClyZXR1cm5cclxuICAgICAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2ggPSBbXVxyXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChSb3V0ZXMuYmFkZ2VzLCBcIlBPU1RcIiwgSlNPTi5zdHJpbmdpZnkodXNlcnMubWFwKGUgPT4gZVswXSkpKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogc2VydmVyIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdKFtdKS8vIHJlc29sdmUgbm8gYmFkZ2UgZmV0Y2hlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCB1c2VyIG9mIHJlc3BvbnNlQm9keSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9taXNlID0gdXNlcnMuZmluZChwcm9taXNlID0+IHByb21pc2VbMF0gPT09IHVzZXIudXNlcl9pZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVsxXSh1c2VyLmJhZGdlcylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7Ly8gQ291bGRuJ3QgZmV0Y2ggYmFkZ2VzOiBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyIGluc3RhbmNlb2YgTGlnaHRjb3JkRXJyb3IpKWNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0oW10pLy8gcmVzb2x2ZSBubyBiYWRnZSBmZXRjaGVkXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIDApXHJcbiAgICAgICAgfSlcclxuICAgICAgICBmb3IobGV0IGJhZGdlIG9mIGZldGNoZWRCYWRnZXMpe1xyXG4gICAgICAgICAgICBpZighQ29uc3RhbnRzLmJhZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gYmFkZ2UpKWNvbnRpbnVlIC8vIFdlIGRvIG5vdCBoYXZlIHRoZSBDb21wb25lbnQsIHNraXAgaXQuXHJcbiAgICAgICAgICAgIGlmKGJhZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gYmFkZ2UpKWNvbnRpbnVlIC8vIEFscmVhZHkgaW5zZXJ0ZWQuXHJcbiAgICAgICAgICAgIGJhZGdlcy5wdXNoKENvbnN0YW50cy5iYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWNoZSA9IHtcclxuICAgICAgICAgICAgYmFkZ2VzOiBPYmplY3QuYXNzaWduKHRoaXMuY2FjaGUuYmFkZ2VzLCB7W3VzZXJdOiBiYWRnZXN9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdXHJcbiAgICAgICAgfSwgNjAwMDAwKTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZShiYWRnZXMpXHJcbiAgICAgICAgZGVsZXRlIGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl1cclxuICAgICAgICByZXR1cm4gYmFkZ2VzXHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZVJlcXVlc3QgPSBmdW5jdGlvbihyb3V0ZSwgbWV0aG9kLCBkYXRhKXtcclxuICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC01XCJdKXtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IExpZ2h0Y29yZEVycm9yKFwiVGhlIGN1cnJlbnQgc2V0dGluZ3MgYmxvY2tlZCB0aGUgcmVxdWVzdC5cIikpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm9kZUZldGNoKGAke0NvbnN0YW50cy5TRVJWRVJfVVJMfS9hcGkvdjEke3JvdXRlfWAsIHtcclxuICAgICAgICBtZXRob2QsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNMSUVOVFwiOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgICAgICAgICBcIkF1dGhvcml6YXRpb25cIjogd2luZG93LkxpZ2h0Y29yZC5BcGkuQXV0aG9yaXphdGlvbiB8fCBcIk5vbmU6OkFub255bW91c1wiXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi4oZGF0YSA/IHtcclxuICAgICAgICAgICAgYm9keTogZGF0YVxyXG4gICAgICAgIH0gOiB7fSlcclxuICAgIH0pXHJcbn1cclxuXHJcbmNsYXNzIExpZ2h0Y29yZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpXHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJMaWdodGNvcmRFcnJvclwiXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBDb25zdGFudHMgPSB7XHJcbiAgICBTRVJWRVJfVVJMOiBcImh0dHBzOi8vbGlnaHRjb3JkLmRlcm9rdS54eXpcIixcclxuICAgIGJhZGdlczogWyAvLyBUT0RPOiBBZGQgbW9yZSBiYWRnZXMgKyBzZXJ2ZXIgc2lkZSBzdmdcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkIEJ1ZyBIdW50ZXJcIixcclxuICAgICAgICAgICAgaWQ6IFwiZjA0Njk4ZjUtODE2Yi00MWUzLWJkMDEtOTIyOTExOTNkN2E1XCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW1xyXG4gICAgICAgICAgICAgICAgXCI2OTY0ODExOTQ0NDMwMTQxNzRcIixcclxuICAgICAgICAgICAgICAgIFwiNjk2MDAzNDU2NjExMzg1Mzk2XCJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcclxuICAgICAgICAgICAgY29tcG9uZW50OiBCdWdIdW50ZXJCYWRnZSxcclxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vbGlnaHRjb3JkL2xpZ2h0Y29yZC93aWtpL2JhZGdlcyNidWdfaHVudGVyXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiQnVmZm9vblwiLFxyXG4gICAgICAgICAgICBpZDogXCIwNjkwNGQzMS02NWI0LTQxZWMtYTUwYy04NjU4YmJkMWFmOTZcIixcclxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXHJcbiAgICAgICAgICAgICAgICBcIjM4OTAxNjg5NTU0MzcwNTYwMlwiLFxyXG4gICAgICAgICAgICAgICAgXCI2NjQ2MDAxMzQ1Mjg2NjM1NjVcIixcclxuICAgICAgICAgICAgICAgIFwiNjI1MzUwNjU3ODI5ODk2MjI0XCJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcclxuICAgICAgICAgICAgY29tcG9uZW50OiBDaXJjdXMsXHJcbiAgICAgICAgICAgIGhyZWY6IFwiaHR0cHM6Ly95b3V0dS5iZS9FSnRiNnotZGxUOD90PTE0NVwiXHJcbiAgICAgICAgfVxyXG4gICAgXVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUm91dGVzID0ge1xyXG4gICAgYmFkZ2VzOiBgL3VzZXJzL2JhZGdlc2BcclxufSIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggWmFjaGFyeSBSYXVlblxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xuICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksXG4gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWRcbiAqIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELFxuICogSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEFcbiAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFRcbiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRlxuICogQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFXG4gKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiAqIFxuICogRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQkRQbHVnaW5MaWJyYXJ5XG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlXG4gKiBAbmFtZSBPZmZzZXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3AgLSBUb3Agb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByaWdodCAtIFJpZ2h0IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYm90dG9tIC0gQm90dG9tIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVmdCAtIExlZnQgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBPdXRlciBoZWlnaHQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gT3V0ZXIgd2lkdGggb2YgdGhlIHRhcmdldCBlbGVtZW50LlxuICovXG5cbiAvKipcbiAqIEZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSByZW1vdmVzIGFkZGVkIGxpc3RlbmVyLlxuICogQGNhbGxiYWNrIG1vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lclxuICovXG4gXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01Ub29scyB7XG5cbiAgICBzdGF0aWMgZXNjYXBlSUQoaWQpIHtcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XG4gICAgfVxuXG4gICAgLyoqXG5cdCAqIEFkZHMgYSBzdHlsZSB0byB0aGUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGlkZW50aWZpZXIgdG8gdXNlIGFzIHRoZSBlbGVtZW50IGlkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjc3MgLSBjc3MgdG8gYWRkIHRvIHRoZSBkb2N1bWVudFxuXHQgKi9cblx0c3RhdGljIGFkZFN0eWxlKGlkLCBjc3MpIHtcblx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChET01Ub29scy5jcmVhdGVFbGVtZW50KGA8c3R5bGUgaWQ9XCIke2lkfVwiPiR7Y3NzfTwvc3R5bGU+YCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBzdHlsZSBmcm9tIHRoZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gb3JpZ2luYWwgaWRlbnRpZmllciB1c2VkXG5cdCAqL1xuXHRzdGF0aWMgcmVtb3ZlU3R5bGUoaWQpIHtcblx0XHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuXHRcdGlmIChlbGVtZW50KSBlbGVtZW50LnJlbW92ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMvcmVxdWlyZXMgYSByZW1vdGUgc2NyaXB0IHRvIGJlIGxvYWRlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBpZGVudGlmaWVyIHRvIHVzZSBmb3IgdGhpcyBzY3JpcHRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIHVybCBmcm9tIHdoaWNoIHRvIGxvYWQgdGhlIHNjcmlwdFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNjcmlwdCBpcyBsb2FkZWRcblx0ICovXG5cdHN0YXRpYyBhZGRTY3JpcHQoaWQsIHVybCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0XHRcdGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdFx0XHRzY3JpcHQuaWQgPSBpZDtcblx0XHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdFx0XHRzY3JpcHQudHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI7XG5cdFx0XHRzY3JpcHQub25sb2FkID0gcmVzb2x2ZTtcblx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kKHNjcmlwdCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhIHJlbW90ZSBzY3JpcHQgZnJvbSB0aGUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIG9yaWdpbmFsIGlkZW50aWZpZXIgdXNlZFxuXHQgKi9cblx0c3RhdGljIHJlbW92ZVNjcmlwdChpZCkge1xuICAgICAgICBpZCA9IHRoaXMuZXNjYXBlSUQoaWQpO1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG5cdFx0aWYgKGVsZW1lbnQpIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIGh0dHBzOi8vamF2YXNjcmlwdC5pbmZvL2pzLWFuaW1hdGlvblxuICAgIHN0YXRpYyBhbmltYXRlKHt0aW1pbmcgPSBfID0+IF8sIHVwZGF0ZSwgZHVyYXRpb259KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIGFuaW1hdGUodGltZSkge1xuICAgICAgICAgIC8vIHRpbWVGcmFjdGlvbiBnb2VzIGZyb20gMCB0byAxXG4gICAgICAgICAgbGV0IHRpbWVGcmFjdGlvbiA9ICh0aW1lIC0gc3RhcnQpIC8gZHVyYXRpb247XG4gICAgICAgICAgaWYgKHRpbWVGcmFjdGlvbiA+IDEpIHRpbWVGcmFjdGlvbiA9IDE7XG4gICAgICBcbiAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHN0YXRlXG4gICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aW1pbmcodGltZUZyYWN0aW9uKTtcbiAgICAgIFxuICAgICAgICAgIHVwZGF0ZShwcm9ncmVzcyk7IC8vIGRyYXcgaXRcbiAgICAgIFxuICAgICAgICAgIGlmICh0aW1lRnJhY3Rpb24gPCAxKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBteSBzaGl0IHZlcnNpb24gb2Ygbm90IGhhdmluZyB0byB1c2UgYCRgIGZyb20galF1ZXJ5LiBNZWFuaW5nXG4gICAgICogdGhhdCB5b3UgY2FuIHBhc3MgYSBzZWxlY3RvciBhbmQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHJ1biB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLnF1ZXJ5fS5cbiAgICAgKiBJdCBhbHNvIG1lYW5zIHRoYXQgeW91IGNhbiBwYXNzIGEgc3RyaW5nIG9mIGh0bWwgYW5kIGl0IHdpbGwgcGVyZm9ybSBhbmQgcmV0dXJuIGBwYXJzZUhUTUxgLlxuICAgICAqIEBzZWUgbW9kdWxlOkRPTVRvb2xzLnBhcnNlSFRNTFxuICAgICAqIEBzZWUgbW9kdWxlOkRPTVRvb2xzLnF1ZXJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnkgb3IgSFRNTCB0byBwYXJzZVxuICAgICAqIEByZXR1cm5zIHsoRG9jdW1lbnRGcmFnbWVudHxOb2RlTGlzdHxIVE1MRWxlbWVudCl9IC0gRWl0aGVyIHRoZSByZXN1bHQgb2YgYHBhcnNlSFRNTGAgb3IgYHF1ZXJ5YFxuICAgICAqL1xuICAgIHN0YXRpYyBRKHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnBhcnNlSFRNTChzZWxlY3Rvcik7XG4gICAgICAgIGNvbnN0IGlzSFRNTCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCA/IEFycmF5LmZyb20oZWxlbWVudCkuc29tZShuID0+IG4ubm9kZVR5cGUgPT09IDEpIDogZWxlbWVudC5ub2RlVHlwZSA9PT0gMTtcbiAgICAgICAgaWYgKGlzSFRNTCkgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3NlbnRpYWxseSBhIHNob3J0aGFuZCBmb3IgYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgLiBJZiB0aGUgYGJhc2VFbGVtZW50YCBpcyBub3QgcHJvdmlkZWRcbiAgICAgKiBgZG9jdW1lbnRgIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeVxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gW2Jhc2VFbGVtZW50XSAtIEVsZW1lbnQgdG8gYmFzZSB0aGUgcXVlcnkgZnJvbVxuICAgICAqIEByZXR1cm5zIHsoRWxlbWVudHxudWxsKX0gLSBUaGUgZm91bmQgZWxlbWVudCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBxdWVyeShzZWxlY3RvciwgYmFzZUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFiYXNlRWxlbWVudCkgYmFzZUVsZW1lbnQgPSBkb2N1bWVudDtcbiAgICAgICAgcmV0dXJuIGJhc2VFbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzc2VudGlhbGx5IGEgc2hvcnRoYW5kIGZvciBgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbGAuIElmIHRoZSBgYmFzZUVsZW1lbnRgIGlzIG5vdCBwcm92aWRlZFxuICAgICAqIGBkb2N1bWVudGAgaXMgdXNlZCBieSBkZWZhdWx0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHF1ZXJ5XG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBbYmFzZUVsZW1lbnRdIC0gRWxlbWVudCB0byBiYXNlIHRoZSBxdWVyeSBmcm9tXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIEFycmF5IG9mIGFsbCBmb3VuZCBlbGVtZW50c1xuICAgICAqL1xuICAgIHN0YXRpYyBxdWVyeUFsbChzZWxlY3RvciwgYmFzZUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFiYXNlRWxlbWVudCkgYmFzZUVsZW1lbnQgPSBkb2N1bWVudDtcbiAgICAgICAgcmV0dXJuIGJhc2VFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIHN0cmluZyBvZiBIVE1MIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzLiBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLFxuICAgICAqIHRoZSBwYXJzZWQgSFRNTCB3aWxsIGJlIHJldHVybmVkIGFzIGEgZG9jdW1lbnQgZnJhZ21lbnQge0BzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50RnJhZ21lbnR9LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIGxpc3Qgb2YgZWxlbWVudHMgYXQgdGhlIHRvcCBsZXZlbCwgdGhleSBjYW4gdGhlbiBiZSBhcHBlbmRlZCBhbGwgYXQgb25jZSB0byBhbm90aGVyIG5vZGUuXG4gICAgICogXG4gICAgICogSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoZW4gdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBsaXN0IG9mIHBhcnNlZFxuICAgICAqIG5vZGVzIGFuZCB0aGVyZSB3ZXJlIG11bHRpcGxlIHRvcCBsZXZlbCBub2Rlcywgb3RoZXJ3aXNlIHRoZSBzaW5nbGUgbm9kZSBpcyByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbCAtIEhUTUwgdG8gYmUgcGFyc2VkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJhZ21lbnQ9ZmFsc2VdIC0gV2hldGhlciBvciBub3QgdGhlIHJldHVybiBzaG91bGQgYmUgdGhlIHJhdyBgRG9jdW1lbnRGcmFnbWVudGBcbiAgICAgKiBAcmV0dXJucyB7KERvY3VtZW50RnJhZ21lbnR8Tm9kZUxpc3R8SFRNTEVsZW1lbnQpfSAtIFRoZSByZXN1bHQgb2YgSFRNTCBwYXJzaW5nXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlSFRNTChodG1sLCBmcmFnbWVudCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICBjb25zdCBub2RlID0gdGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgIGlmIChmcmFnbWVudCkgcmV0dXJuIG5vZGU7XG4gICAgICAgIHJldHVybiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID4gMSA/IG5vZGUuY2hpbGROb2RlcyA6IG5vZGUuY2hpbGROb2Rlc1swXTtcbiAgICB9XG5cbiAgICAvKiogQWx0ZXJuYXRlIG5hbWUgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMucGFyc2VIVE1MfSAqL1xuICAgIHN0YXRpYyBjcmVhdGVFbGVtZW50KGh0bWwsIGZyYWdtZW50ID0gZmFsc2UpIHtyZXR1cm4gdGhpcy5wYXJzZUhUTUwoaHRtbCwgZnJhZ21lbnQpO31cbiAgICBcbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIHN0cmluZyBvZiBodG1sIGFuZCBlc2NhcGVzIGl0IHVzaW5nIHRoZSBicm93ZXIncyBvd24gZXNjYXBpbmcgbWVjaGFuaXNtLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIC0gaHRtbCB0byBiZSBlc2NhcGVkXG4gICAgICovXG4gICAgc3RhdGljIGVzY2FwZUhUTUwoaHRtbCkge1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgICAgICBjb25zdCBzcGFuRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBzcGFuRWxlbWVudC5hcHBlbmQodGV4dE5vZGUpO1xuICAgICAgICB0ZXh0Tm9kZS5ub2RlVmFsdWUgPSBodG1sO1xuICAgICAgICByZXR1cm4gc3BhbkVsZW1lbnQuaW5uZXJIVE1MO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0IG9mIGNsYXNzZXMgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcbiAgICAgKiBAcGFyYW0gey4uLnN0cmluZ30gY2xhc3NlcyAtIE5hbWVzIG9mIGNsYXNzZXMgdG8gYWRkXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBhZGRDbGFzcyhlbGVtZW50LCAuLi5jbGFzc2VzKSB7XG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSBjbGFzc2VzW2NdID0gY2xhc3Nlc1tjXS50b1N0cmluZygpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmxhdCgpLmZpbHRlcihjID0+IGMpO1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4uY2xhc3Nlcyk7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBsaXN0IG9mIGNsYXNzZXMgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcbiAgICAgKiBAcGFyYW0gey4uLnN0cmluZ30gY2xhc3NlcyAtIE5hbWVzIG9mIGNsYXNzZXMgdG8gcmVtb3ZlXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyByZW1vdmVDbGFzcyhlbGVtZW50LCAuLi5jbGFzc2VzKSB7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykgY2xhc3Nlc1tjXSA9IGNsYXNzZXNbY10udG9TdHJpbmcoKS5zcGxpdChcIiBcIik7XG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLmNsYXNzZXMpO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByZXNlbnQ6IFRvZ2dsZSBjbGFzcyB2YWx1ZTtcbiAgICAgKiBpLmUuLCBpZiBjbGFzcyBleGlzdHMgdGhlbiByZW1vdmUgaXQgYW5kIHJldHVybiBmYWxzZSwgaWYgbm90LCB0aGVuIGFkZCBpdCBhbmQgcmV0dXJuIHRydWUuXG4gICAgICogV2hlbiBhIHNlY29uZCBhcmd1bWVudCBpcyBwcmVzZW50OlxuICAgICAqIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgZXZhbHVhdGVzIHRvIHRydWUsIGFkZCBzcGVjaWZpZWQgY2xhc3MgdmFsdWUsIGFuZCBpZiBpdCBldmFsdWF0ZXMgdG8gZmFsc2UsIHJlbW92ZSBpdC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc25hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIHRvZ2dsZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luZGljYXRvcl0gLSBPcHRpb25hbCBpbmRpY2F0b3IgZm9yIGlmIHRoZSBjbGFzcyBzaG91bGQgYmUgdG9nZ2xlZFxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgdG9nZ2xlQ2xhc3MoZWxlbWVudCwgY2xhc3NuYW1lLCBpbmRpY2F0b3IpIHtcbiAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpLmZpbHRlcihjID0+IGMpO1xuICAgICAgICBpZiAodHlwZW9mKGluZGljYXRvcikgIT09IFwidW5kZWZpbmVkXCIpIGNsYXNzbmFtZS5mb3JFYWNoKGMgPT4gZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGMsIGluZGljYXRvcikpO1xuICAgICAgICBlbHNlIGNsYXNzbmFtZS5mb3JFYWNoKGMgPT4gZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGMpKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgaGFzIGEgc3BlY2lmaWMgY2xhc3NcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc25hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gYHRydWVgIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgY2xhc3MsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc25hbWUpIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzbmFtZS50b1N0cmluZygpLnNwbGl0KFwiIFwiKS5maWx0ZXIoYyA9PiBjKS5ldmVyeShjID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBvbmUgY2xhc3Mgd2l0aCBhbm90aGVyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkTmFtZSAtIE5hbWUgb2YgY2xhc3MgdG8gcmVwbGFjZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdOYW1lIC0gTmV3IG5hbWUgZm9yIHRoZSBjbGFzc1xuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVwbGFjZUNsYXNzKGVsZW1lbnQsIG9sZE5hbWUsIG5ld05hbWUpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVwbGFjZShvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBgdGhpc05vZGVgIHRvIGB0aGF0Tm9kZWBcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gTm9kZSB0byBiZSBhcHBlbmRlZCB0byBhbm90aGVyIG5vZGVcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoYXROb2RlIC0gTm9kZSBmb3IgYHRoaXNOb2RlYCB0byBiZSBhcHBlbmRlZCB0b1xuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgc3RhdGljIGFwcGVuZFRvKHRoaXNOb2RlLCB0aGF0Tm9kZSkge1xuICAgICAgICBpZiAodHlwZW9mKHRoYXROb2RlKSA9PSBcInN0cmluZ1wiKSB0aGF0Tm9kZSA9IHRoaXMucXVlcnkodGhhdE5vZGUpO1xuICAgICAgICBpZiAoIXRoYXROb2RlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhhdE5vZGUuYXBwZW5kKHRoaXNOb2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXBlbmRzIGB0aGlzTm9kZWAgdG8gYHRoYXROb2RlYFxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBOb2RlIHRvIGJlIHByZXBlbmRlZCB0byBhbm90aGVyIG5vZGVcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoYXROb2RlIC0gTm9kZSBmb3IgYHRoaXNOb2RlYCB0byBiZSBwcmVwZW5kZWQgdG9cbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBwcmVwZW5kVG8odGhpc05vZGUsIHRoYXROb2RlKSB7XG4gICAgICAgIGlmICh0eXBlb2YodGhhdE5vZGUpID09IFwic3RyaW5nXCIpIHRoYXROb2RlID0gdGhpcy5xdWVyeSh0aGF0Tm9kZSk7XG4gICAgICAgIGlmICghdGhhdE5vZGUpIHJldHVybiBudWxsO1xuICAgICAgICB0aGF0Tm9kZS5wcmVwZW5kKHRoaXNOb2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBhZnRlciBhIHNwZWNpZmljIGVsZW1lbnQsIHNpbWlsYXIgdG8galF1ZXJ5J3MgYHRoaXNFbGVtZW50Lmluc2VydEFmdGVyKG90aGVyRWxlbWVudClgLlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBUaGUgbm9kZSB0byBpbnNlcnRcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldE5vZGUgLSBOb2RlIHRvIGluc2VydCBhZnRlciBpbiB0aGUgdHJlZVxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgc3RhdGljIGluc2VydEFmdGVyKHRoaXNOb2RlLCB0YXJnZXROb2RlKSB7XG4gICAgICAgIHRhcmdldE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpc05vZGUsIHRhcmdldE5vZGUubmV4dFNpYmxpbmcpO1xuICAgICAgICByZXR1cm4gdGhpc05vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0IGFmdGVyIGEgc3BlY2lmaWMgZWxlbWVudCwgc2ltaWxhciB0byBqUXVlcnkncyBgdGhpc0VsZW1lbnQuYWZ0ZXIobmV3RWxlbWVudClgLlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBUaGUgbm9kZSB0byBpbnNlcnRcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5ld05vZGUgLSBOb2RlIHRvIGluc2VydCBhZnRlciBpbiB0aGUgdHJlZVxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgc3RhdGljIGFmdGVyKHRoaXNOb2RlLCBuZXdOb2RlKSB7XG4gICAgICAgIHRoaXNOb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHRoaXNOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5leHQgc2libGluZyBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIG5leHQgc2libGluZyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBPcHRpb25hbCBzZWxlY3RvclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBzaWJsaW5nIGVsZW1lbnRcbiAgICAgKi9cbiAgICBzdGF0aWMgbmV4dChlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yID8gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiKyBcIiArIHNlbGVjdG9yKSA6IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHN1YnNlcXVlbnQgc2libGluZ3MuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgbmV4dCBzaWJsaW5ncyBvZlxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xuICAgICAqL1xuICAgIHN0YXRpYyBuZXh0QWxsKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIn4gKlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzZXF1ZW50IHNpYmxpbmdzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIGZvbGxvd2luZyBzaWJsaW5ncyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcbiAgICAgKi9cbiAgICBzdGF0aWMgbmV4dFVudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBbXTsgXG4gICAgICAgIHdoaWxlIChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyAmJiAhZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcubWF0Y2hlcyhzZWxlY3RvcikpIG5leHQucHVzaChlbGVtZW50ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpO1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcmV2aW91cyBzaWJsaW5nIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgcHJldmlvdXMgc2libGluZyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBPcHRpb25hbCBzZWxlY3RvclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBzaWJsaW5nIGVsZW1lbnRcbiAgICAgKi9cbiAgICBzdGF0aWMgcHJldmlvdXMoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICBpZiAoc2VsZWN0b3IpIHJldHVybiBwcmV2aW91cyAmJiBwcmV2aW91cy5tYXRjaGVzKHNlbGVjdG9yKSA/IHByZXZpb3VzIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHByZWNlZWRpbmcgc2libGluZ3MuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgcHJlY2VlZGluZyBzaWJsaW5ncyBvZlxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xuICAgICAqL1xuICAgIHN0YXRpYyBwcmV2aW91c0FsbChlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gW107XG4gICAgICAgIHdoaWxlIChlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHByZXZpb3VzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyk7XG4gICAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcmVjZWVkaW5nIHNpYmxpbmdzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIHByZWNlZWRpbmcgc2libGluZ3Mgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXG4gICAgICovXG4gICAgc3RhdGljIHByZXZpb3VzVW50aWwoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBbXTsgXG4gICAgICAgIHdoaWxlIChlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgJiYgIWVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZy5tYXRjaGVzKHNlbGVjdG9yKSkgcHJldmlvdXMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgd2hpY2ggaW5kZXggaW4gY2hpbGRyZW4gYSBjZXJ0YWluIG5vZGUgaXMuIFNpbWlsYXIgdG8galF1ZXJ5J3MgYCQuaW5kZXgoKWBcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gVGhlIG5vZGUgdG8gZmluZCBpdHMgaW5kZXggaW4gcGFyZW50XG4gICAgICogQHJldHVybnMge251bWJlcn0gSW5kZXggb2YgdGhlIG5vZGVcbiAgICAgKi9cbiAgICBzdGF0aWMgaW5kZXhJblBhcmVudChub2RlKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5wYXJlbnROb2RlLmNoaWxkTm9kZXM7XG4gICAgICAgIGxldCBudW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gPT0gbm9kZSkgcmV0dXJuIG51bTtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PSAxKSBudW0rKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5pbmRleEluUGFyZW50fSAqL1xuICAgIHN0YXRpYyBpbmRleChub2RlKSB7cmV0dXJuIHRoaXMuaW5kZXhJblBhcmVudChub2RlKTt9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQgaWYgaXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBwYXJlbnQgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggcGFyZW50XG4gICAgICogQHJldHVybnMgeyhFbGVtZW50fG51bGwpfSAtIFRoZSBzaWJsaW5nIGVsZW1lbnQgb3IgbnVsbFxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJlbnQoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XG4gICAgICAgIHJldHVybiAhc2VsZWN0b3IgfHwgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpID8gZWxlbWVudC5wYXJlbnRFbGVtZW50IDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBjaGlsZHJlbiBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBjaGlsZHJlbiBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBjaGlsZHJlbiB0b1xuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBjaGlsZHJlblxuICAgICAqL1xuICAgIHN0YXRpYyBmaW5kQ2hpbGQoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IFwiICsgc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIGNoaWxkcmVuIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIGNoaWxkcmVuIHRvXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIGNoaWxkcmVuXG4gICAgICovXG4gICAgc3RhdGljIGZpbmRDaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlID4gXCIgKyBzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYW5jZXN0b3JzIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIHBhcmVudHMgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIHBhcmVudHMgdG9cbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgcGFyZW50c1xuICAgICAqL1xuICAgIHN0YXRpYyBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xuICAgICAgICBjb25zdCBwYXJlbnRzID0gW107XG4gICAgICAgIGlmIChzZWxlY3Rvcikgd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBlbGVtZW50LnBhcmVudEVsZW1lbnQuY2xvc2VzdChzZWxlY3RvcikpIHBhcmVudHMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpKTtcbiAgICAgICAgZWxzZSB3aGlsZSAoZWxlbWVudC5wYXJlbnRFbGVtZW50KSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFuY2VzdG9ycyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBhbmNlc3RvcnMgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHBhcmVudHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyZW50c1VudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiAhZWxlbWVudC5wYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHNpYmxpbmdzIG9mIHRoZSBlbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBzaWJsaW5ncyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCIqXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIHNpYmxpbmdzIHRvXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXG4gICAgICovXG4gICAgc3RhdGljIHNpYmxpbmdzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCIqXCIpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5maWx0ZXIoZSA9PiBlICE9IGVsZW1lbnQgJiYgZS5tYXRjaGVzKHNlbGVjdG9yKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBnZXRzIGNzcyBzdHlsZXMgZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgc3R5bGUgYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nLFxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBzdHlsZS4gIFxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIC0gQXR0cmlidXRlIHRvIGdldCBvciBzZXRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIFZhbHVlIHRvIHNldCBmb3IgYXR0cmlidXRlXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3NzKGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGdsb2JhbC5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpW2F0dHJpYnV0ZV07XG4gICAgICAgIGVsZW1lbnQuc3R5bGVbYXR0cmlidXRlXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIHdpZHRoIGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIHdpZHRoIGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgd2lkdGguICBcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBXaWR0aCB0byBzZXRcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxuICAgICAqL1xuICAgIHN0YXRpYyB3aWR0aChlbGVtZW50LCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS53aWR0aCk7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBnZXRzIHRoZSBoZWlnaHQgZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgaGVpZ2h0IGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgaGVpZ2h0LiAgXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gSGVpZ2h0IHRvIHNldFxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXG4gICAgICovXG4gICAgc3RhdGljIGhlaWdodChlbGVtZW50LCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5oZWlnaHQpO1xuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBpbm5lciB0ZXh0IG9mIGFuIGVsZW1lbnQgaWYgZ2l2ZW4gYSB2YWx1ZSwgb3RoZXJ3aXNlIHJldHVybnMgaXQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIHRleHQgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RleHRdIC0gQ29udGVudCB0byBzZXRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEVpdGhlciB0aGUgc3RyaW5nIHNldCBieSB0aGlzIGNhbGwgb3IgdGhlIGN1cnJlbnQgdGV4dCBjb250ZW50IG9mIHRoZSBub2RlLlxuICAgICAqL1xuICAgIHN0YXRpYyB0ZXh0KGVsZW1lbnQsIHRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZih0ZXh0KSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlubmVyV2lkdGggb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBpbm5lciB3aWR0aCBvZlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgaW5uZXIgd2lkdGggb2YgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgc3RhdGljIGlubmVyV2lkdGgoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbm5lckhlaWdodCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIGlubmVyIGhlaWdodCBvZlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgaW5uZXIgaGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIHN0YXRpYyBpbm5lckhlaWdodChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBvdXRlcldpZHRoIG9mIHRoZSBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgb3V0ZXIgd2lkdGggb2ZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIG91dGVyIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIHN0YXRpYyBvdXRlcldpZHRoKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgb3V0ZXJIZWlnaHQgb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBvdXRlciBoZWlnaHQgb2ZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIG91dGVyIGhlaWdodCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBzdGF0aWMgb3V0ZXJIZWlnaHQoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBlbGVtZW50IGluIHRoZSBwYWdlLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IG9mZnNldCBvZlxuICAgICAqIEByZXR1cm4ge09mZnNldH0gLSBUaGUgb2Zmc2V0IG9mIHRoZSBlbGVtZW50XG4gICAgICovXG4gICAgc3RhdGljIG9mZnNldChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgbGlzdGVuZXJzKCkgeyByZXR1cm4gdGhpcy5fbGlzdGVuZXJzIHx8ICh0aGlzLl9saXN0ZW5lcnMgPSB7fSk7IH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byBqUXVlcnkncyBgb25gIGZ1bmN0aW9uIGFuZCBjYW4gKmhvcGVmdWxseSogYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkuXG4gICAgICogXG4gICAgICogUmF0aGVyIHRoYW4gYXR0ZW1wdCB0byBleHBsYWluLCBJJ2xsIHNob3cgc29tZSBleGFtcGxlIHVzYWdlcy5cbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgLlxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlcyB3aGVuIHRoZSB0YXJnZXQgaXMgYSBgLmJsb2NrYCBlbGVtZW50LlxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIFwiLmJsb2NrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAuXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxuICAgICAqIFxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZXMgb25jZS5cbiAgICAgKiBgY29uc3QgY2FuY2VsID0gRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGlja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJmaXJlZCFcIik7IGNhbmNlbCgpO30pO2BcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0b1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBkZWxlZ2F0ZSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XG4gICAgICogQHJldHVybnMge21vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lcn0gLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCB1bmRvIHRoZSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHN0YXRpYyBvbihlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xuICAgICAgICBjb25zdCBoYXNEZWxlZ2F0ZSA9IGRlbGVnYXRlICYmIGNhbGxiYWNrO1xuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xuICAgICAgICBjb25zdCBldmVudEZ1bmMgPSAhaGFzRGVsZWdhdGUgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdKSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdID0gW107XG4gICAgICAgICAgICBjb25zdCBuZXdDYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5zcGxpY2UodGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5maW5kSW5kZXgobCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQpLCAxKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnB1c2goe1xuICAgICAgICAgICAgICAgIGV2ZW50OiB0eXBlLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgY2FuY2VsOiBuZXdDYW5jZWxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NhbmNlbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FuY2VsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uYWxpdHkgZm9yIHRoaXMgbWV0aG9kIG1hdGNoZXMge0BsaW5rIG1vZHVsZTpET01Ub29scy5vbn0gYnV0IGF1dG9tYXRpY2FsbHkgY2FuY2VscyBpdHNlbGZcbiAgICAgKiBhbmQgcmVtb3ZlcyB0aGUgbGlzdGVuZXIgdXBvbiB0aGUgZmlyc3QgZmlyaW5nIG9mIHRoZSBkZXNpcmVkIGV2ZW50LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYWRkIGxpc3RlbmVyIHRvXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IGRlbGVnYXRlIC0gU2VsZWN0b3IgdG8gcnVuIG9uIGVsZW1lbnQgdG8gbGlzdGVuIHRvXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGZpcmUgb24gZXZlbnRcbiAgICAgKiBAcmV0dXJucyB7bW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyfSAtIEEgZnVuY3Rpb24gdGhhdCB3aWxsIHVuZG8gdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgc3RhdGljIG9uY2UoZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xuICAgICAgICB9IDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSByZXR1cm47XG4gICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSkgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbmV3Q2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uc3BsaWNlKHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uZmluZEluZGV4KGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50KSwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICBldmVudDogdHlwZSxcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICAgICAgICAgIGNhbmNlbDogbmV3Q2FuY2VsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXdDYW5jZWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgX19vZmZBbGwoZXZlbnQsIGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XG4gICAgICAgIGxldCBtYXRjaEZpbHRlciA9IGxpc3RlbmVyID0+IGxpc3RlbmVyLmV2ZW50ID09IHR5cGUsIGRlZmF1bHRGaWx0ZXIgPSBfID0+IF87XG4gICAgICAgIGlmIChlbGVtZW50KSBtYXRjaEZpbHRlciA9IGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50LCBkZWZhdWx0RmlsdGVyID0gbCA9PiBsLmVsZW1lbnQgPT0gZWxlbWVudDtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSB8fCBbXTtcbiAgICAgICAgY29uc3QgbGlzdCA9IHR5cGUgPyBsaXN0ZW5lcnMuZmlsdGVyKG1hdGNoRmlsdGVyKSA6IGxpc3RlbmVycy5maWx0ZXIoZGVmYXVsdEZpbHRlcik7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbGlzdC5sZW5ndGg7IGMrKykgbGlzdFtjXS5jYW5jZWwoKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGpRdWVyeSdzIGBvZmZgIGZ1bmN0aW9uIGFuZCBjYW4gKmhvcGVmdWxseSogYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkuXG4gICAgICogXG4gICAgICogUmF0aGVyIHRoYW4gYXR0ZW1wdCB0byBleHBsYWluLCBJJ2xsIHNob3cgc29tZSBleGFtcGxlIHVzYWdlcy5cbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgY2FsbGVkIGBvbkNsaWNrYCAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YC5cbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgb25DbGljayk7YFxuICAgICAqIFxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciBjYWxsZWQgYG9uQ2xpY2tgIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlZCB3aGVuIHRoZSB0YXJnZXQgaXMgYSBgLmJsb2NrYCBlbGVtZW50LlxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBcIi5ibG9ja1wiLCBvbkNsaWNrKTtgXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAuXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrXCIsIG9uQ2xpY2spO2BcbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSBgZWxlbWVudGAuXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcIi5teVBsdWdpblwiKTtgXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgY2xpY2sgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gKmFsbCBlbGVtZW50cyouXG4gICAgICogYERPTVRvb2xzLm9mZihcImNsaWNrLm15UGx1Z2luXCIpO2BcbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSAqYWxsIGVsZW1lbnRzKi5cbiAgICAgKiBgRE9NVG9vbHMub2ZmKFwiLm15UGx1Z2luXCIpO2BcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0geyhFbGVtZW50fHN0cmluZyl9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJlbW92ZSBsaXN0ZW5lciBmcm9tXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtldmVudF0gLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gW2RlbGVnYXRlXSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gVGhlIG9yaWdpbmFsIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgc3RhdGljIG9mZihlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YoZWxlbWVudCkgPT0gXCJzdHJpbmdcIikgcmV0dXJuIHRoaXMuX19vZmZBbGwoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xuICAgICAgICBpZiAobmFtZXNwYWNlKSByZXR1cm4gdGhpcy5fX29mZkFsbChldmVudCwgZWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gY2FsbGJhY2sgOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIGZvciB3aGVuIHRoZSBub2RlIGlzIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQgYm9keS5cbiAgICAgKiBUaGUgbGlzdGVuZXIgaXMgYXV0b21hdGljYWxseSByZW1vdmVkIHVwb24gZmlyaW5nLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBub2RlIHRvIHdhaXQgZm9yXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gY2FsbGJhY2sgLSBmdW5jdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZXZlbnRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9uTW91bnQgLSBkZXRlcm1pbmVzIGlmIGl0IHNob3VsZCBmaXJlIG9uIE1vdW50IG9yIG9uIFVubW91bnRcbiAgICAgKi9cbiAgICBzdGF0aWMgb25Nb3VudENoYW5nZShub2RlLCBjYWxsYmFjaywgb25Nb3VudCA9IHRydWUpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci51bnN1YnNjcmliZSh3cmFwcGVkQ2FsbGJhY2spO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5zdWJzY3JpYmUod3JhcHBlZENhbGxiYWNrLCBtdXRhdGlvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IEFycmF5LmZyb20ob25Nb3VudCA/IG11dGF0aW9uLmFkZGVkTm9kZXMgOiBtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuICAgICAgICAgICAgY29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKG5vZGUpID4gLTE7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyhub2RlKSk7XG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2g7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnRDaGFuZ2V9IHdpdGggdGhpcmQgcGFyYW1ldGVyIGB0cnVlYCAqL1xuICAgIHN0YXRpYyBvbk1vdW50KG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2spOyB9XG5cbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnRDaGFuZ2V9IHdpdGggdGhpcmQgcGFyYW1ldGVyIGBmYWxzZWAgKi9cbiAgICBzdGF0aWMgb25Vbm1vdW50KG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2ssIGZhbHNlKTsgfVxuXG4gICAgLyoqIEFsaWFzIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnR9ICovXG4gICAgc3RhdGljIG9uQWRkZWQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Nb3VudChub2RlLCBjYWxsYmFjayk7IH1cblxuICAgIC8qKiBBbGlhcyBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vblVubW91bnR9ICovXG4gICAgc3RhdGljIG9uUmVtb3ZlZChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vblVubW91bnQobm9kZSwgY2FsbGJhY2ssIGZhbHNlKTsgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNvbWJpbmVzIG11bHRpcGxlIGVsZW1lbnRzIGludG8gb25lIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtBcnJheTxIVE1MRWxlbWVudD59IGVsZW1lbnRzIC0gYXJyYXkgb2YgZWxlbWVudHMgdG8gcHV0IGludG8gYSBzaW5nbGUgcGFyZW50XG4gICAgICovXG4gICAgc3RhdGljIHdyYXAoZWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgZG9tV3JhcHBlciA9IHRoaXMucGFyc2VIVE1MKGA8ZGl2IGNsYXNzPVwiZG9tLXdyYXBwZXJcIj48L2Rpdj5gKTtcbiAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCBlbGVtZW50cy5sZW5ndGg7IGUrKykgZG9tV3JhcHBlci5hcHBlbmRDaGlsZChlbGVtZW50c1tlXSk7XG4gICAgICAgIHJldHVybiBkb21XcmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBub2RlIHRvIGFuIEhUTUxFbGVtZW50LiBUaGlzIGlzIG1haW5seSB1c2VkIGJ5IGxpYnJhcnkgbW9kdWxlcy5cbiAgICAgKiBAcGFyYW0geyhqUXVlcnl8RWxlbWVudCl9IG5vZGUgLSBub2RlIHRvIHJlc29sdmVcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZUVsZW1lbnQobm9kZSkge1xuICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgalF1ZXJ5KSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcbiAgICB9XG59XG5cbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5ET00gPSBET01Ub29scyIsImltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgQ29uc3RhbnRzID0ge1xuICAgIEVtb2ppUmVnZXg6IC88YT9cXC4oXFx3KylcXC4oXFxkKyk+L2dcbn1cblxubGV0IEN1c3RvbUVtb2ppTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuQ3VzdG9tRW1vamkpWzBdXG5sZXQgRW1vamlNb2R1bGVBcGkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQpWzBdXG5sZXQgQXV0b2NvbXBsZXRlTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiQXV0b2NvbXBsZXRlXCIpWzBdXG5sZXQgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5nZXRBdXRvY29tcGxldGVPcHRpb25zKVswXVxubGV0IEVtb2ppTW9kdWxlUXVlcnkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cylbMF1cbmxldCBNZXNzYWdlcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzICYmIGUuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORylbMF1cbmxldCBndWlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkICYmIGUuZGVmYXVsdC5nZXRHdWlsZHMgJiYgIWUuZGVmYXVsdC5pc0ZldGNoaW5nKVswXVxubGV0IGVtb2ppU2VhcmNoID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dClcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEVtb2ppTW9kdWxlIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLmluaXQoKS5jYXRjaChlcnIgPT4gVXRpbHMuZXJyKFwiRW1vamlNb2R1bGVcIiwgXCJBbiBlcnJvciBvY2N1cmVkXCIsIGVycikpIC8vIGJldHRlciBsb2dnaW5nXG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpe1xuICAgICAgICAvKiogRW1vamkgQXV0b0NvbXBsZXRlICovXG4gICAgICAgIGlmKCFBdXRvY29tcGxldGVNb2R1bGUpQXV0b2NvbXBsZXRlTW9kdWxlID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF1dG9jb21wbGV0ZVwiKVxuICAgICAgICBpZighQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMpQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucylcbiAgICAgICAgaWYoIUVtb2ppTW9kdWxlUXVlcnkpRW1vamlNb2R1bGVRdWVyeSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cylcbiAgICAgICAgaWYoIU1lc3NhZ2VzKU1lc3NhZ2VzID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzICYmIGUuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORylcbiAgICAgICAgaWYoIWd1aWxkTW9kdWxlKWd1aWxkTW9kdWxlID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkICYmIGUuZGVmYXVsdC5nZXRHdWlsZHMgJiYgIWUuZGVmYXVsdC5pc0ZldGNoaW5nKVxuICAgICAgICBpZighZW1vamlTZWFyY2gpZW1vamlTZWFyY2ggPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dClcblxuICAgICAgICBpZihBdXRvY29tcGxldGVNb2R1bGUgJiYgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMgJiYgRW1vamlNb2R1bGVRdWVyeSAmJiBNZXNzYWdlcyAmJiBndWlsZE1vZHVsZSAmJiBlbW9qaVNlYXJjaCl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUGF0Y2hpbmcgZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyBvZiBBdXRvQ29tcGxldGlvblRlbXBsYXRlc2AsIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzKVxuICAgICAgICAgICAgY29uc3QgZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyA9IEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzLmdldEF1dG9jb21wbGV0ZU9wdGlvbnNcbiAgICAgICAgICAgIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMgPSBmdW5jdGlvbihlLCB0LCBuLCByLCBhKXtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEF1dG9jb21wbGV0ZU9wdGlvbnMuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgdmFsdWUuTElHSFRDT1JEX0VNT0pJUyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyhhcmcxLCBhcmcyKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb24gPSBhcmcyLmxlbmd0aCA+IDEgJiYgXCIuXCIgPT09IGFyZzFcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVtb2ppVXNhYmxlKGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHRzKHQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBFbW9qaU1vZHVsZVF1ZXJ5LmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHModCwgZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclJlc3VsdHMoZSwgdCwgbiwgciwgYSl7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRChlLCB0LCBhLmVtb2ppcywgbiwgciwgTWVzc2FnZXMuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORywgTWVzc2FnZXMuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSSwgQXV0b2NvbXBsZXRlTW9kdWxlLmRlZmF1bHQuRW1vamksIChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamk6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZS5pZCB8fCBlLnVuaXF1ZU5hbWUgfHwgZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW5lbDogXCIuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWxkOiBudWxsICE9IGUuZ3VpbGRJZCA/IGd1aWxkTW9kdWxlLmRlZmF1bHQuZ2V0R3VpbGQoZS5ndWlsZElkKSA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIuXCIgKyBlICsgXCIuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBnZXRQbGFpblRleHQoaWQsIGd1aWxkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaXMgPSBndWlsZC5lbW9qaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlbW9qaXMgfHwgbnVsbCA9PSBlbW9qaXNbaWRdKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaSA9IGVtb2ppc1tpZF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbmltYXRlZCA9IGVtb2ppLmFuaW1hdGVkID8gXCJhXCIgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtb2ppLm1hbmFnZWQgfHwgbnVsbCA9PSBlbW9qaS5pZCA/IFwiLlwiICsgZW1vamkubmFtZSArIFwiLlwiIDogXCI8XCIgKyBpc0FuaW1hdGVkICsgXCIuXCIgKyAoZW1vamkub3JpZ2luYWxOYW1lIHx8IGVtb2ppLm5hbWUpICsgXCIuXCIgKyBlbW9qaS5pZCArIFwiPlwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGdldFJhd1RleHQoaWQsIGd1aWxkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaXMgPSBndWlsZC5lbW9qaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlbW9qaXMgfHwgbnVsbCA9PSBlbW9qaXNbaWRdKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaSA9IGVtb2ppc1tpZF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbmltYXRlZCA9IGVtb2ppLmFuaW1hdGVkID8gXCJhXCIgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtb2ppLm1hbmFnZWQgfHwgbnVsbCA9PSBlbW9qaS5pZCA/IFwiLlwiICsgZW1vamkubmFtZSArIFwiLlwiIDogXCI8XCIgKyBpc0FuaW1hdGVkICsgXCIuXCIgKyAoZW1vamkub3JpZ2luYWxOYW1lIHx8IGVtb2ppLm5hbWUpICsgXCIuXCIgKyBlbW9qaS5pZCArIFwiPlwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihuZXcgRXJyb3IoXCJDb3VsZG4ndCBzdGFydCBhdXRvY29tcGxldGlvbiBvZiBMaWdodGNvcmQncyBlbW9qaXMuXCIpKVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqIEVtb2ppIGRpc3BsYXkgKi9cbiAgICAgICAgd2hpbGUgKCFCRFYyLk1lc3NhZ2VDb21wb25lbnQpIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcblxuICAgICAgICBpZiAoIXRoaXMuY2FuY2VsRW1vamlSZW5kZXIpeyAvLyBUT0RPOiBQcm9wZXIgZW1vamkgZm9ybWF0dGluZyAvIHJlbmRlcmluZ1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlciA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHtiZWZvcmU6IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwiY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlXCIpXG4gICAgICAgICAgICAgICAgaWYoIW1lc3NhZ2UpcmV0dXJuXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwiY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50XCIpXG4gICAgICAgICAgICAgICAgaWYoIWNvbnRlbnQgfHwgIWNvbnRlbnQubGVuZ3RoKXJldHVyblxuICAgIFxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEB0eXBlIHt7XG4gICAgICAgICAgICAgICAgICogIHJhdzogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAqICBuYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICogIGlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICogIGFuaW1hdGVkOiBib29sZWFuXG4gICAgICAgICAgICAgICAgICogfVtdfVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGxldCBlbW9qaXMgPSBbXVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBbXVxuICAgICAgICAgICAgICAgIGZvcihsZXQgbm9kZSBvZiBjb250ZW50KXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihub2RlKSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKG5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGFzUGFyc2VkID0gZmFsc2VcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZCA9IENvbnN0YW50cy5FbW9qaVJlZ2V4LmV4ZWMobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGFyc2VkID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFFbW9qaU1vZHVsZUFwaSlFbW9qaU1vZHVsZUFwaSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1c3RvbUVtb2ppQnlJZClbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW9qaSA9IEVtb2ppTW9kdWxlQXBpLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKHBhcnNlZFsyXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbW9qaSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBlbW9qaS5hbmltYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVtb2ppLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZW1vamkuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHBhcnNlZFswXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogcGFyc2VkWzBdLnN0YXJ0c1dpdGgoXCI8YVwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcnNlZFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBwYXJzZWRbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHBhcnNlZFswXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAocGFyc2VkKTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYoaGFzUGFyc2VkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRzID0gbm9kZS5zcGxpdChcIiBcIikubWFwKCh3b3JkLCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXdvcmQpcmV0dXJuIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW9qaSA9IGVtb2ppcy5maW5kKGUgPT4gZS5yYXcgPT0gd29yZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZW1vamkpcmV0dXJuIHdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighQ3VzdG9tRW1vamlNb2R1bGUpQ3VzdG9tRW1vamlNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5DdXN0b21FbW9qaSlbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDdXN0b21FbW9qaU1vZHVsZS5DdXN0b21FbW9qaSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYC4ke2Vtb2ppLm5hbWV9LmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaUlkOiBlbW9qaS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBlbW9qaS5hbmltYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bWJvYWJsZTogYXJyLmxlbmd0aCA9PT0gMSAmJiBjb250ZW50Lmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwcmV2aW91cy5sZW5ndGggPT09IDApcmV0dXJuIFtjdXJyZW50XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBjdXJyZW50ID09PSBcInN0cmluZ1wiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdID09PSBcInN0cmluZ1wiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdICs9IGAgJHtjdXJyZW50fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLnB1c2goXCIgXCIrY3VycmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLnB1c2goXCIgXCIsIGN1cnJlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaCguLi53b3JkcylcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2gobm9kZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZShkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnRbMF0pe1xuICAgICAgICAgICAgICAgICAgICBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnQuc2hpZnQoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZShuZXdDb250ZW50WzBdKXtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50LnB1c2gobmV3Q29udGVudC5zaGlmdCgpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH19KTtcbiAgICAgICAgfS8qXG4gICAgICAgIGxldCB1c2VyTW9kdWxlXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJFbW9qaVBpY2tlckxpc3RSb3dcIilcbiAgICAgICAgLnRoZW4oRW1vamlQaWNrZXJMaXN0Um93ID0+IHtcbiAgICAgICAgICAgIGxldCBjbGFzc3MgPSBFbW9qaVBpY2tlckxpc3RSb3cuZGVmYXVsdFxuICAgICAgICAgICAgRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHQgPSBjbGFzcyBFbW9qaVBpY2tlckxpc3RSb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIocHJvcHMpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVuZGVyKCl7XG4gICAgICAgICAgICAgICAgICAgIGlmKCF1c2VyTW9kdWxlKXVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF1cbiAgICAgICAgICAgICAgICAgICAgaWYoIXVzZXJNb2R1bGUpcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY2xhc3NzLCB0aGlzLnByb3BzKVxuICAgICAgICAgICAgICAgICAgICBsZXQgdXNlciA9IHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXG4gICAgICAgICAgICAgICAgICAgIGlmKCF1c2VyLmhhc1ByZW1pdW1TdWJzY3JpcHRpb24pcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY2xhc3NzLCB0aGlzLnByb3BzKVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNsYXNzcywgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9wcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlEZXNjcmlwdG9yczogdGhpcy5wcm9wcy5lbW9qaURlc2NyaXB0b3JzLm1hcChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmlzRGlzYWJsZWQgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSkpICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBFbW9qaVBpY2tlckxpc3RSb3cuZGVmYXVsdC5kaXNwbGF5TmFtZSA9IFwiRW1vamlQaWNrZXJMaXN0Um93XCJcbiAgICAgICAgfSkqL1xuICAgIH1cblxuICAgIGRpc2FibGUoKXtcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbEVtb3RlUmVuZGVyKSByZXR1cm47XG4gICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIoKTtcbiAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlciA9IG51bGw7XG4gICAgfVxuXG4gICAgc3RhcnQoKXtcbiAgICAgICAgXG4gICAgfVxufVxuXG5mdW5jdGlvbiBEKGUsIHQsIG4sIHIsIG8sIGksIHMsIHUsIGwsIGMpIHtcbiAgICBpZiAobnVsbCA9PSBuIHx8IDAgPT09IG4ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgZCA9IG4ubWFwKChmdW5jdGlvbihlLCBuKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHUsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgb25DbGljazogbyxcbiAgICAgICAgICAgIG9uSG92ZXI6IHIsXG4gICAgICAgICAgICBzZWxlY3RlZDogdCA9PT0gbixcbiAgICAgICAgICAgIGluZGV4OiBuXG4gICAgICAgIH0sIGwoZSwgbikpKVxuICAgIH0pKTtcbiAgICByZXR1cm4gW1IoaSwgcywgZSwgYyksIGRdXG59XG5cbmZ1bmN0aW9uIFIoZSwgdCwgbiwgcikge1xuICAgIHZhciBhID0gKG4ubGVuZ3RoID4gMCA/IGUuZm9ybWF0KHtcbiAgICAgICAgcHJlZml4OiByKG4pXG4gICAgfSkgOiB0KVxuICAgIGlmKEFycmF5LmlzQXJyYXkoYSkpe1xuICAgICAgICBhLnVuc2hpZnQoUmVhY3QuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCB7fSwgXCJbTGlnaHRjb3JkXSBcIikpXG4gICAgfWVsc2V7XG4gICAgICAgIGEgPSBcIltMSUdIVENPUkRdIFwiK2FcbiAgICB9XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQXV0b2NvbXBsZXRlTW9kdWxlLmRlZmF1bHQuVGl0bGUsIHtcbiAgICAgICAgdGl0bGU6IGFcbiAgICB9LCBhKVxufVxuUi5kaXNwbGF5TmFtZSA9IFwicmVuZGVySGVhZGVyXCI7XG5cbmxldCBFbW9qaUZpbHRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZClbMF1cbmxldCBpc0Vtb2ppRGlzYWJsZWQgPSBFbW9qaUZpbHRlck1vZHVsZSAmJiBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZFxubGV0IGlzVXNhYmxlID0gZmFsc2VcbmxldCBoYXNQYXRjaGVkID0gZmFsc2VcblxuZnVuY3Rpb24gc2V0RW1vamlVc2FibGUodXNhYmxlKXtcbiAgICBpc1VzYWJsZSA9IHVzYWJsZVxuICAgIGlmKGhhc1BhdGNoZWQpcmV0dXJuXG4gICAgaWYoIUVtb2ppRmlsdGVyTW9kdWxlKUVtb2ppRmlsdGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkKVswXVxuICAgIGlmKCFFbW9qaUZpbHRlck1vZHVsZSlyZXR1cm5cbiAgICBpZighaXNFbW9qaURpc2FibGVkKWlzRW1vamlEaXNhYmxlZCA9IEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkXG5cbiAgICBoYXNQYXRjaGVkID0gdHJ1ZVxuICAgIEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkID0gZnVuY3Rpb24oZW1vamkpe1xuICAgICAgICBpZihpc1VzYWJsZSl7XG4gICAgICAgICAgICBpZihlbW9qaS5zdXJyb2dhdGVzIHx8IGVtb2ppLmRpdmVyc2l0eSlyZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRW1vamlEaXNhYmxlZC5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcbiAgICB9XG59IiwiaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiXHJcbmltcG9ydCAqIGFzIGVsZWN0cm9uIGZyb20gXCJlbGVjdHJvblwiXHJcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tIFwiY3J5cHRvXCJcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIlxyXG5pbXBvcnQgdG9vbHRpcFdyYXAgZnJvbSBcIi4uL3VpL3Rvb2x0aXBXcmFwXCJcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcclxuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiXHJcbmltcG9ydCB7IGJhc2VuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIlxyXG5pbXBvcnQgY29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIlxyXG5pbXBvcnQgeyBhZGRvbkNhY2hlIH0gZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIlxyXG5cclxuY29uc3QgY2FjaGUgPSB7fVxyXG5jb25zdCBjYWNoZTIgPSB7fVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFBsdWdpbkNlcnRpZmllciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5QbHVnaW5DZXJ0aWZpZXIgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2goYXR0YWNobWVudCwgaWQpe1xyXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50LCBpZClcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCl7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlzVHJ1c3RlZChoYXNoKXtcclxuICAgICAgICByZXR1cm4gY2FjaGVbaGFzaF0gJiYgIWNhY2hlW2hhc2hdLnN1c3BlY3RcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2ssIGZpbGVuYW1lKXtcclxuICAgIGRhdGEgPSBkYXRhLnRvU3RyaW5nKFwidXRmOFwiKVxyXG4gICAgbGV0IGlzSGFybWZ1bCA9IGZhbHNlXHJcbiAgICBmb3IobGV0IGtleXdvcmQgb2YgZGF0YS5zcGxpdCgvW15cXHdcXGRdKy9nKSl7XHJcbiAgICAgICAgZm9yKGxldCBvb2Ygb2YgW1xyXG4gICAgICAgICAgICBcInRva2VuXCIsXHJcbiAgICAgICAgICAgIFwiZW1haWxcIixcclxuICAgICAgICAgICAgXCJwaG9uZVwiLFxyXG4gICAgICAgICAgICBcIk1GQVwiLFxyXG4gICAgICAgICAgICBcIjJmYVwiLFxyXG4gICAgICAgICAgICBcImNoaWxkX3Byb2Nlc3NcIixcclxuICAgICAgICAgICAgXCJsb2NhbFN0b3JhZ2VcIixcclxuICAgICAgICAgICAgXCJldmFsXCIsXHJcbiAgICAgICAgICAgIFwiZ2V0R2xvYmFsXCIsXHJcbiAgICAgICAgICAgIFwiQnJvd3NlcldpbmRvd1wiXHJcbiAgICAgICAgXSl7XHJcbiAgICAgICAgICAgIGlmKGtleXdvcmQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhvb2YudG9Mb3dlckNhc2UoKSkgJiYgIWtleXdvcmQudG9Mb3dlckNhc2UoKSA9PT0gXCJkb210b2tlbmxpc3RcIil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvb2YsIGtleXdvcmQpXHJcbiAgICAgICAgICAgICAgICBpc0hhcm1mdWwgPSBcInRva2VuIHN0ZWFsZXIvdmlydXNcIlxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoaXNIYXJtZnVsKWJyZWFrXHJcbiAgICB9XHJcblxyXG4gICAgaWYoIWlzSGFybWZ1bCl7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBub19jb21tZW50cyA9IGRhdGEucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3woW15cXFxcOl18XilcXC9cXC8uKiQvZ20sIFwiXCIpLnRyaW0oKS8vIHJlbW92aW5nIHRoZSBNRVRBIGNvbW1lbnQgZnJvbSBwbHVnaW5zXHJcbiAgICAgICAgaWYoKC92YXIgW1xcd1xcZF8kXSs9XFxbXCIvZ2kpLnRlc3Qobm9fY29tbWVudHMpKXtcclxuICAgICAgICAgICAgaXNIYXJtZnVsID0gXCJvYmZ1c2NhdGlvbi9oaWRkZW4gY29kZVwiXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZighaXNIYXJtZnVsKXtcclxuICAgICAgICAgICAgY29uc3QgcmVnZXhwcyA9IFtcclxuICAgICAgICAgICAgICAgIC8qKiBoZXhhZGVjaW1hbCAqL1xyXG4gICAgICAgICAgICAgICAgL18weFxcd3s0fVxcKCcweFtcXGRhYmNkZWZdKydcXCkvZyxcclxuICAgICAgICAgICAgICAgIC9fMHhcXHd7NH1cXCgnMHhbXFxkYWJjZGVmXSsnWywgXSsnW14nXXs0fSdcXCkvZywgLy8gXzB4OGRiNygnMHgwJywgJ3gxXWYnKVxyXG4gICAgICAgICAgICAgICAgLyoqIG1hbmdsZWQgKi9cclxuICAgICAgICAgICAgICAgIC9cXHcrXFwoJzB4W1xcZGFiY2RlZl0rJ1xcKS9nLCAvLyBiKCcweDAnKVxyXG4gICAgICAgICAgICAgICAgL1xcdytcXCgnMHhbXFxkYWJjZGVmXSsnWywgXSsnW14nXXs0fSdcXCkvZywgLy8gYignMHgwJywgJ3gxXWYnKVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIGZvcihsZXQgcmVnZXggb2YgcmVnZXhwcyl7XHJcbiAgICAgICAgICAgICAgICBpZihpc0hhcm1mdWwpYnJlYWtcclxuICAgICAgICAgICAgICAgIGlmKHJlZ2V4LnRlc3Qobm9fY29tbWVudHMpKWlzSGFybWZ1bCA9IFwib2JmdXNjYXRpb24vaGlkZGVuIGNvZGVcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKCFpc0hhcm1mdWwpcmV0dXJuIHJlbW92ZUNhbGxiYWNrKGhhc2gpXHJcbiAgICBjYWNoZVtoYXNoXSA9IHtcclxuICAgICAgICBzdXNwZWN0OiB0cnVlLFxyXG4gICAgICAgIG5hbWU6IGhhc2hUb1VybFtoYXNoXS5zcGxpdChcIi9cIikucG9wKCksXHJcbiAgICAgICAgdHlwZTogaGFzaFRvVXJsW2hhc2hdLmVuZHNXaXRoKFwiLmpzXCIpID8gXCJQbHVnaW5cIiA6IFwiVGhlbWVcIixcclxuICAgICAgICBoYXJtOiBpc0hhcm1mdWwsXHJcbiAgICAgICAgaGFzaDogaGFzaCxcclxuICAgICAgICBmaWxlbmFtZVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zb2xlLmxvZyhgRm91bmQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzICR7Y2FjaGVbaGFzaF0udHlwZS50b0xvd2VyQ2FzZSgpfTogJHtjYWNoZVtoYXNoXS5uYW1lfWApXHJcblxyXG4gICAgcmVzdWx0Q2FsbGJhY2soY2FjaGVbaGFzaF0pXHJcbn1cclxuXHJcbmNvbnN0IGhhc2hUb1VybCA9IHt9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tIYXNoKGhhc2gsIGRhdGEsIGZpbGVuYW1lLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2spe1xyXG4gICAgY29uc29sZS5sb2coYEZpbGU6ICR7ZmlsZW5hbWV9IGhhc2g6ICR7aGFzaH1gKVxyXG4gICAgaWYoIWNhY2hlW2hhc2hdKXtcclxuICAgICAgICBub2RlRmV0Y2goXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvTGlnaHRjb3JkL2ZpbGVoYXNoZXNAbWFzdGVyL2hhc2hlcy9cIitoYXNoLCB7IC8vIFVzaW5nIG5vZGUtZmV0Y2ggdG8gYnlwYXNzIGNvcnNcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnQgLy8gaGF2ZSB0byBzZXQgdXNlci1hZ2VudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApe1xyXG4gICAgICAgICAgICAgICAgaWYoZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiByZW1vdmVDYWxsYmFjayhoYXNoKVxyXG4gICAgICAgICAgICAgICAgY2hlY2tWaXJ1c2VzKGhhc2gsIGRhdGEsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjaywgZmlsZW5hbWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgIHJlc3VsdC5oYXNoID0gaGFzaFxyXG4gICAgICAgICAgICByZXN1bHQuZmlsZW5hbWUgPSBmaWxlbmFtZVxyXG5cclxuICAgICAgICAgICAgY2FjaGVbaGFzaF0gPSByZXN1bHRcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKHJlc3VsdClcclxuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCByZWFkIGZyb20gZ2l0aHViLiAke2Vycn1gKVxyXG4gICAgICAgICAgICBpZihmaWxlbmFtZS5lbmRzV2l0aChcIi50aGVtZS5jc3NcIikpcmV0dXJuIHJlbW92ZUNhbGxiYWNrKGhhc2gpXHJcbiAgICAgICAgICAgIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2ssIGZpbGVuYW1lKVxyXG4gICAgICAgIH0pXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBjYWNoZVtoYXNoXVxyXG5cclxuICAgICAgICByZXN1bHRDYWxsYmFjayhyZXN1bHQpXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzRmlsZShfX3BhdGgsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjayA9IChoYXNoKSA9PiB7fSwgaXNGcm9tTG9hZGVyID0gZmFsc2UpeyAgICBcclxuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKVxyXG4gICAgbGV0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMClcclxuXHJcbiAgICBjcmVhdGVSZWFkU3RyZWFtKF9fcGF0aCkub24oXCJkYXRhXCIsIGNodW5rID0+IHtcclxuICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgY2h1bmtdKVxyXG4gICAgICAgIGhhc2gudXBkYXRlKGNodW5rKVxyXG4gICAgfSkub24oXCJlbmRcIiwgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGhhc2hSZXN1bHQgPSBoYXNoLmRpZ2VzdChcImhleFwiKVxyXG5cclxuICAgICAgICBoYXNoVG9VcmxbaGFzaFJlc3VsdF0gPSBfX3BhdGhcclxuXHJcbiAgICAgICAgaWYoaXNGcm9tTG9hZGVyICYmIGFkZG9uQ2FjaGVbaGFzaFJlc3VsdF0pe1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdXHJcbiAgICAgICAgICAgIGlmKHZhbHVlLnRpbWVzdGFtcCA8IChEYXRlLm5vdygpIC0gNi4wNDhlKzgpKXtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdXHJcbiAgICAgICAgICAgICAgICBjb250ZW50TWFuYWdlci5zYXZlQWRkb25DYWNoZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2sodmFsdWUucmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNoZWNrSGFzaChoYXNoUmVzdWx0LCBkYXRhLCBiYXNlbmFtZShfX3BhdGgpLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2spXHJcbiAgICB9KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudCwgaWQpe1xyXG4gICAgaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlyZXR1cm5cclxuICAgIGlmKCFhdHRhY2htZW50LnVybC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vXCIpKXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKClcclxuICAgIGlmKCFhdHRhY2htZW50LmZpbGVuYW1lLmVuZHNXaXRoKFwiLnBsdWdpbi5qc1wiKSAmJiAhYXR0YWNobWVudC5maWxlbmFtZS5lbmRzV2l0aChcIi50aGVtZS5jc3NcIikpcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKVxyXG5cclxuICAgIG5vZGVGZXRjaChhdHRhY2htZW50LnVybCwge1xyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnRcclxuICAgICAgICB9XHJcbiAgICB9KS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIkZpbGUgZG9lc24ndCBleGlzdC5cIilcclxuICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIilcclxuICAgICAgICBsZXQgZGF0YSA9IEJ1ZmZlci5hbGxvYygwKVxyXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZGF0YVwiLCBjaHVuayA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtkYXRhLCBjaHVua10pXHJcbiAgICAgICAgICAgIGhhc2gudXBkYXRlKGNodW5rKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmVzLmJvZHkub24oXCJlbmRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBoYXNoUmVzdWx0ID0gaGFzaC5kaWdlc3QoXCJoZXhcIilcclxuXHJcbiAgICAgICAgICAgIGNhY2hlMlthdHRhY2htZW50LnVybF0gPSBoYXNoUmVzdWx0XHJcbiAgICAgICAgICAgIGhhc2hUb1VybFtoYXNoUmVzdWx0XSA9IGF0dGFjaG1lbnQudXJsXHJcblxyXG4gICAgICAgICAgICBjaGVja0hhc2goaGFzaFJlc3VsdCwgZGF0YSwgYXR0YWNobWVudC5maWxlbmFtZSwgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVuZGVyVG9FbGVtZW50cyhpZCwgcmVzdWx0LCBhdHRhY2htZW50LmZpbGVuYW1lKVxyXG4gICAgICAgICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxyXG4gICAgICAgICAgICAgICAgaWYoZWxlbSllbGVtLnJlbW92ZSgpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH0pLmNhdGNoKCgpPT57fSlcclxufVxyXG5cclxubGV0IGZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxyXG5sZXQgY2hpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGlsZENvbnRhaW5lcilbMF1cclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudFtdfSBlbGVtZW50cyBcclxuICogQHBhcmFtIHt7dHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZywgb2ZmaWNpYWw/OiBib29sZWFufXx7c3VzcGVjdDp0cnVlLCB0eXBlOiBcIlRoZW1lXCJ8XCJQbHVnaW5cIiwgbmFtZTogc3RyaW5nLCBoYXJtOiBzdHJpbmd9fSByZXN1bHRcclxuICovXHJcbmZ1bmN0aW9uIHJlbmRlclRvRWxlbWVudHMoaWQsIHJlc3VsdCwgZmlsZW5hbWUpe1xyXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXHJcbiAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuIC8vIGFscmVhZHkgY2VydGlmaWVkL2RpdiBkb2VzIG5vdCBleGlzdCBhbnltb3JlLlxyXG5cclxuICAgIGlmKCFmbG93ZXJTdGFyTW9kdWxlKWZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxyXG4gICAgaWYoIWNoaWxkTW9kdWxlKWNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXHJcbiAgICBcclxuICAgIGlmKHJlc3VsdC5zdXNwZWN0KXtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCJyZ2IoMjQwLCA3MSwgNzEpXCJcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFxyXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IG5leHROb2RlID0gKG5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbil7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gXCJBXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkb3dubG9hZCB0aGlzID9cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJUaGUgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiAqKlwiK2ZpbGVuYW1lK1wiKiogbWlnaHQgYmUgZGFuZ2Vyb3VzICoqKFwiK3Jlc3VsdC5oYXJtK1wiKSoqLiBcXG5cXG4qKldlIGRvbid0IHJlY29tbWFuZCB0byBkb3dubG9hZCBpdCoqLiBIb3dldmVyLCB5b3UgY2FuIHN0aWxsIGRvIGl0IGJlbG93LlwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRvd25sb2FkIEFueXdheVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkRvbid0ICFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlY3Ryb24ucmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChjaGlsZC5ocmVmKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKFtcImRpdlwiXS5pbmNsdWRlcyhjaGlsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE5vZGUoY2hpbGQpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5leHROb2RlKGRpdi5wYXJlbnROb2RlKVxyXG4gICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiBpcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMuXCJ9LCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdmcpWzBdLnN2ZywgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCA0MCAzMlwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeDpcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgeTpcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6XCIzMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6XCIzMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTMyKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsOlwiI2YwNDc0N1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1zdGF0dXMtZG5kKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6QkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0ucG9pbnRlckV2ZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLCBkaXYpXHJcbiAgICB9ZWxzZSBpZighcmVzdWx0Lm9mZmljaWFsKXtcclxuICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXHJcbiAgICAgICAgbGV0IHNwYW4gPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtzdHlsZToge2Rpc3BsYXk6IFwiaW5oZXJpdFwifX0sIFtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgaXMgY2VydGlmaWVkIGJ5IExpZ2h0Y29yZC5cIn0sIFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCIsIGZsb2F0OiBcImxlZnRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcIiM0ZjU0NWNcIiwgXCJmaWxsLXJ1bGVcIjpcImV2ZW5vZGRcIixkOlwibTE2IDcuNmMwIC43OS0xLjI4IDEuMzgtMS41MiAyLjA5cy40NCAyIDAgMi41OS0xLjg0LjM1LTIuNDYuOC0uNzkgMS44NC0xLjU0IDIuMDktMS42Ny0uOC0yLjQ3LS44LTEuNzUgMS0yLjQ3LjgtLjkyLTEuNjQtMS41NC0yLjA5LTItLjE4LTIuNDYtLjguMjMtMS44NCAwLTIuNTktMS41NC0xLjMtMS41NC0yLjA5IDEuMjgtMS4zOCAxLjUyLTIuMDktLjQ0LTIgMC0yLjU5IDEuODUtLjM1IDIuNDgtLjguNzgtMS44NCAxLjUzLTIuMTIgMS42Ny44MyAyLjQ3LjgzIDEuNzUtMSAyLjQ3LS44LjkxIDEuNjQgMS41MyAyLjA5IDIgLjE4IDIuNDYuOC0uMjMgMS44NCAwIDIuNTkgMS41NCAxLjMgMS41NCAyLjA5elwifSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjaGlsZE1vZHVsZS5jaGlsZENvbnRhaW5lcn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1wiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwifSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiI2ZmZmZmZlwiLGQ6XCJNNy40LDExLjE3LDQsOC42Miw1LDcuMjZsMiwxLjUzTDEwLjY0LDRsMS4zNiwxWlwifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogXCJJbnN0YWxsIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiBvbiBMaWdodGNvcmQuXCJ9LCBcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifSwgb25DbGljaygpe1xyXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiID9cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTGlnaHRjb3JkIHdpbGwgYXV0b21hdGljYWxseSBpbnN0YWxsIGFuZCBsYXVuY2ggdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiLiBZb3UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBkby5cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRvd25sb2FkIGFuZCBJbnN0YWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkkndmUgY2hhbmdlZCBteSBtaW5kXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYW5nZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Db25maXJtOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBnZXRLZXllZEFycmF5KGNhY2hlMikuZmluZChlID0+IGVbMV0gPT09IHJlc3VsdC5oYXNoKVswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxpbmspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZldGNoKGxpbmspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIlN0YXR1cyB3YXMgbm90IDIwMFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGF3YWl0IHJlcy5idWZmZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zdGFsbFBhdGggPSBqb2luKHJlc3VsdC50eXBlID09PSBcIlBsdWdpblwiID8gY29udGVudE1hbmFnZXIuX3BsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci5fdGhlbWVzRm9sZGVyLCByZXN1bHQuZmlsZW5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGluc3RhbGxQYXRoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGluc3RhbGxQYXRoLCBjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QocmVzdWx0LnR5cGUrXCIgc3VjY2VzZnVsbHkgaW5zdGFsbGVkLlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGVyci5tZXNzYWdlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAyNCAyNFwiLHN0eWxlOntcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwicmdiKDY3LCAxODEsIDEyOSlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJmaWxsXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIF0pXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc3BhbiwgZGl2KVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgZGl2LnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgIGxldCBzcGFuID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7c3R5bGU6IHtkaXNwbGF5OiBcImluaGVyaXRcIn19LCBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIHdhcyBtYWRlIGJ5IHRoZSBkZXZlbG9wZXJzIG9mIExpZ2h0Y29yZC5cIiwgc3R5bGU6XCJicmFuZFwifSwgXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIiwgZmxvYXQ6IFwibGVmdFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCIsc3Ryb2tlOlwiIzM2MzkzZlwiLHN0eWxlOntjb2xvcjpcIiM0MDg3ZWRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiY3VycmVudENvbG9yXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJ9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcIiNmZmZmZmZcIixkOlwiTTEwLjcsNS4yOGEyLjksMi45LDAsMCwwLTIuMTEuODYuMTEuMTEsMCwwLDAsMCwuMTZsMS4wNS45NGEuMTEuMTEsMCwwLDAsLjE1LDAsMS4yNywxLjI3LDAsMCwxLC45LS4zM2MuNjUsMCwuNjUuNzMuNjUuNzNhLjY0LjY0LDAsMCwxLS42NS42NSwxLjczLDEuNzMsMCwwLDEtMS4xOC0uNTRjLS4zMS0uMjYtLjM2LS4zMi0uNzMtLjY2UzcuMDYsNS4yOCw1LjY1LDUuMjhBMi4yNiwyLjI2LDAsMCwwLDMuMzcsNy41NiwyLjU5LDIuNTksMCwwLDAsMy44Miw5YTIuMTgsMi4xOCwwLDAsMCwxLjgzLjg5LDIuOTQsMi45NCwwLDAsMCwyLjEtLjgxLjExLjExLDAsMCwwLDAtLjE2TDYuNzQsOEEuMTEuMTEsMCwwLDAsNi42LDhhMS41OCwxLjU4LDAsMCwxLS45NC4yOWgwQS43MS43MSwwLDAsMSw1LDcuNTZINWEuNjMuNjMsMCwwLDEsLjY1LS42NGMuNzEsMCwxLjQyLjc1LDEuOTQsMS4yNy43NS43NiwxLjY2LDEuNzksMy4xMSwxLjc0QTIuMjgsMi4yOCwwLDAsMCwxMyw3LjY0YTIuNTksMi41OSwwLDAsMC0uNDUtMS40N0EyLjE0LDIuMTQsMCwwLDAsMTAuNyw1LjI4WlwifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogXCJJbnN0YWxsIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiBvbiBMaWdodGNvcmQuXCJ9LCBcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifSwgb25DbGljaygpe1xyXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiID9cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTGlnaHRjb3JkIHdpbGwgYXV0b21hdGljYWxseSBkb3dubG9hZCBhbmQgbG9hZCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIuIFlvdSBtdXN0IGVuYWJsZSBpdCBpbiB0aGUgc2V0dGluZ3MuXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBhbmQgSW5zdGFsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJJJ3ZlIGNoYW5nZWQgbXkgbWluZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZ2V0S2V5ZWRBcnJheShjYWNoZTIpLmZpbmQoZSA9PiBlWzFdID09PSByZXN1bHQuaGFzaClbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlRmV0Y2gobGluaylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgbmV3IEVycm9yKFwiU3RhdHVzIHdhcyBub3QgMjAwXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgcmVzLmJ1ZmZlcigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnN0YWxsUGF0aCA9IGpvaW4ocmVzdWx0LnR5cGUgPT09IFwiUGx1Z2luXCIgPyBjb250ZW50TWFuYWdlci5fcGx1Z2luc0ZvbGRlciA6IGNvbnRlbnRNYW5hZ2VyLl90aGVtZXNGb2xkZXIsIHJlc3VsdC5maWxlbmFtZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZVN5bmMoaW5zdGFsbFBhdGgsIGNvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChyZXN1bHQudHlwZStcIiBzdWNjZXNmdWxseSBpbnN0YWxsZWQuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoZXJyLm1lc3NhZ2UsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDI0IDI0XCIsc3R5bGU6e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCJyZ2IoNjcsIDE4MSwgMTI5KVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz1cImZpbGxcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0xOSA5aC00VjNIOXY2SDVsNyA3IDctN3pNNSAxOHYyaDE0di0ySDV6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgXSlcclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihzcGFuLCBkaXYpXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEtleWVkQXJyYXkob2JqKXtcclxuICAgIGxldCBhcnIgPSBbXVxyXG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGsgPT4ge1xyXG4gICAgICAgIGFyci5wdXNoKFtrLCBvYmpba11dKVxyXG4gICAgfSlcclxuICAgIHJldHVybiBhcnJcclxufVxyXG5cclxubGV0IGtleSA9IG51bGxcclxubGV0IHNhdmUgPSBudWxsXHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChtPT5tLk9iamVjdFN0b3JhZ2UpXHJcbi50aGVuKGxvY2FsU3RvcmFnZU1vZHVsZSA9PiB7XHJcbiAgICBsZXQgbG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlTW9kdWxlLmltcGxcclxuICAgIHNhdmUgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXQoXCJQbHVnaW5DZXJ0aWZpZXJLZXlFbmNyeXB0aW9uX19cIiwgYnRvYShKU09OLnN0cmluZ2lmeShrZXkpKSlcclxuICAgIH1cclxuICAgIHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICBzYXZlKClcclxuICAgIH0sIDEwMDAwMCk7XHJcbiAgICB0cnl7XHJcbiAgICAgICAgbGV0IHZhbCA9IHNhZmVKU09OUGFyc2UoYXRvYihsb2NhbFN0b3JhZ2UuZ2V0KFwiUGx1Z2luQ2VydGlmaWVyS2V5RW5jcnlwdGlvbl9fXCIpKSlcclxuICAgICAgICBpZih2YWwgaW5zdGFuY2VvZiBFcnJvciB8fCAhQXJyYXkuaXNBcnJheSh2YWwpIHx8IHZhbC5sZW5ndGggIT09IDIgfHwgdmFsLmZpbmQoZSA9PiB0eXBlb2YgZSAhPT0gXCJzdHJpbmdcIikgfHwgQnVmZmVyLmZyb20odmFsWzBdLCBcImJhc2U2NFwiKS5sZW5ndGggIT09IDE2IHx8IEJ1ZmZlci5mcm9tKHZhbFsxXSwgXCJiYXNlNjRcIikubGVuZ3RoICE9PSAzMil7XHJcbiAgICAgICAgICAgIGdlbmVyYXRlS2V5KClcclxuICAgICAgICAgICAgc2F2ZSgpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBrZXkgPSB2YWxcclxuICAgIH1jYXRjaChlKXtcclxuICAgICAgICBnZW5lcmF0ZUtleSgpXHJcbiAgICAgICAgc2F2ZSgpXHJcbiAgICB9XHJcbn0pXHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZUtleSgpe1xyXG4gICAga2V5ID0gW2NyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJiYXNlNjRcIiksIGNyeXB0by5yYW5kb21CeXRlcygzMikudG9TdHJpbmcoXCJiYXNlNjRcIildXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNhZmVKU09OUGFyc2UoanNvbil7XHJcbiAgICB0cnl7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbilcclxuICAgIH1jYXRjaChlKXtcclxuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yID8gbmV3IEVycm9yKGUpIDogZVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVjcnlwdFNldHRpbmdzQ2FjaGUoZGF0YSl7XHJcbiAgICB0cnl7XHJcbiAgICAgICAgbGV0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoXCJhZXMtMjU2LWNiY1wiLCBCdWZmZXIuZnJvbShrZXlbMV0sIFwiYmFzZTY0XCIpLCBCdWZmZXIuZnJvbShrZXlbMF0sIFwiYmFzZTY0XCIpKVxyXG4gICAgICAgIGxldCBkZWNyeXB0ZWQgPSBkZWNpcGhlci51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSwgXCJiYXNlNjRcIikpO1xyXG4gICAgICAgIGRlY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW2RlY3J5cHRlZCwgZGVjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgICAgIHJldHVybiBkZWNyeXB0ZWQudG9TdHJpbmcoXCJ1dGY4XCIpXHJcbiAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgcmV0dXJuIFwie31cIlxyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBlbmNyeXB0U2V0dGluZ3NDYWNoZShkYXRhKXtcclxuICAgIGxldCBhcmdzID0gW0J1ZmZlci5mcm9tKGtleVsxXSwgXCJiYXNlNjRcIiksIEJ1ZmZlci5mcm9tKGtleVswXSwgXCJiYXNlNjRcIildXHJcbiAgICBcclxuICAgIGxldCBjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgLi4uYXJncyk7XHJcbiAgICBsZXQgZW5jcnlwdGVkID0gY2lwaGVyLnVwZGF0ZShCdWZmZXIuZnJvbShkYXRhLCBcInV0ZjhcIikpO1xyXG4gICAgZW5jcnlwdGVkID0gQnVmZmVyLmNvbmNhdChbZW5jcnlwdGVkLCBjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgcmV0dXJuIGVuY3J5cHRlZC50b1N0cmluZyhcImJhc2U2NFwiKVxyXG59IiwiaW1wb3J0IHtiZHBsdWdpbkVycm9ycywgcGx1Z2luQ29va2llLCBzZXR0aW5nc0Nvb2tpZSwgYmRwbHVnaW5zfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5cbmNsYXNzIFBsdWdpbk1vZHVsZSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlBsdWdpbk1vZHVsZSA9IHRoaXNcbiAgICB9XG4gICAgZ2V0IGZvbGRlcigpIHtyZXR1cm4gQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlcjt9XG59XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubG9hZFBsdWdpbnMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5sb2FkUGx1Z2luRGF0YSgpO1xuICAgIGJkcGx1Z2luRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFBsdWdpbnMoKSkpO1xuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgcGx1Z2luLCBuYW1lO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xuICAgICAgICAgICAgbmFtZSA9IHBsdWdpbi5nZXROYW1lKCk7XG4gICAgICAgICAgICBpZiAocGx1Z2luLmxvYWQgJiYgdHlwZW9mKHBsdWdpbi5sb2FkKSA9PSBcImZ1bmN0aW9uXCIpIHBsdWdpbi5sb2FkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcGx1Z2luQ29va2llW25hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIG5hbWUgKyBcIiBjb3VsZCBub3QgYmUgbG9hZGVkLlwiLCBlcnIpO1xuICAgICAgICAgICAgYmRwbHVnaW5FcnJvcnMucHVzaCh7bmFtZTogbmFtZSwgZmlsZTogYmRwbHVnaW5zW3BsdWdpbnNbaV1dLmZpbGVuYW1lLCBtZXNzYWdlOiBcImxvYWQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW25hbWVdKSBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcblxuICAgICAgICBpZiAocGx1Z2luQ29va2llW25hbWVdKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBsdWdpbi5zdGFydCgpO1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdGFydGVkLmApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luQ29va2llW25hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIHN0YXJ0ZWQuXCIsIGVycik7XG4gICAgICAgICAgICAgICAgYmRwbHVnaW5FcnJvcnMucHVzaCh7bmFtZTogbmFtZSwgZmlsZTogYmRwbHVnaW5zW3BsdWdpbnNbaV1dLmZpbGVuYW1lLCBtZXNzYWdlOiBcInN0YXJ0KCkgY291bGQgbm90IGJlIGZpcmVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTApKVxuICAgIH1cbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XG5cbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLm9uKFwiZGlkLW5hdmlnYXRlLWluLXBhZ2VcIiwgdGhpcy5jaGFubmVsU3dpdGNoLmJpbmQodGhpcykpO1xuICAgIC8vIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zdGFydFBsdWdpbiA9IGZ1bmN0aW9uKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICB0cnkge1xuICAgICAgICBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uc3RhcnQoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RhcnRlZC5gKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGNvdWxkIG5vdCBiZSBzdGFydGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgcGx1Z2luQ29va2llW3BsdWdpbl0gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIHBsdWdpbiArIFwiIGNvdWxkIG5vdCBiZSBzdGFydGVkLlwiLCBlcnIpO1xuICAgIH1cbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuc3RvcFBsdWdpbiA9IGZ1bmN0aW9uKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICB0cnkge1xuICAgICAgICBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uc3RvcCgpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdG9wcGVkLmApO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gY291bGQgbm90IGJlIHN0b3BwZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCkgKyBcIiBjb3VsZCBub3QgYmUgc3RvcHBlZC5cIiwgZXJyKTtcbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVuYWJsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSByZXR1cm47XG4gICAgcGx1Z2luQ29va2llW3BsdWdpbl0gPSB0cnVlO1xuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICB0aGlzLnN0YXJ0UGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5lbmFibGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW5dKSByZXR1cm47XG4gICAgcGx1Z2luQ29va2llW3BsdWdpbl0gPSBmYWxzZTtcbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgdGhpcy5zdG9wUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnRvZ2dsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHRoaXMuZGlzYWJsZVBsdWdpbihwbHVnaW4pO1xuICAgIGVsc2UgdGhpcy5lbmFibGVQbHVnaW4ocGx1Z2luKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2luID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRDb250ZW50KGZpbGVuYW1lLCBcInBsdWdpblwiKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycm9yXX0pO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCBlcnJvcik7XG4gICAgfVxuICAgIGNvbnN0IHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gKGNvbnNvbGUubG9nKHAuZmlsZW5hbWUsIGZpbGVuYW1lKSkgfHwgcC5maWxlbmFtZSA9PSBmaWxlbmFtZSkucGx1Z2luO1xuICAgIHRyeSB7IGlmIChwbHVnaW4ubG9hZCAmJiB0eXBlb2YocGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgcGx1Z2luLmxvYWQoKTt9XG4gICAgY2F0Y2ggKGVycikge2lmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJdfSk7fVxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyBsb2FkZWQuYCk7XG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2luLmdldE5hbWUoKX0gdiR7cGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIGxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInBsdWdpbi1sb2FkZWRcIiwgcGx1Z2luLmdldE5hbWUoKSk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnVubG9hZFBsdWdpbiA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xuICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luLnBsdWdpbi5nZXROYW1lKCk7XG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luLCB0cnVlKTtcbiAgICBjb25zdCBlcnJvciA9IENvbnRlbnRNYW5hZ2VyLnVubG9hZENvbnRlbnQoYmRwbHVnaW5zW3BsdWdpbl0uZmlsZW5hbWUsIFwicGx1Z2luXCIpO1xuICAgIGRlbGV0ZSBiZHBsdWdpbnNbcGx1Z2luXTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycm9yXX0pO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCBlcnJvcik7XG4gICAgfVxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gd2FzIHVubG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gd2FzIHVubG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLXVubG9hZGVkXCIsIHBsdWdpbik7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xuICAgIHRoaXMudW5sb2FkUGx1Z2luKGJkcGx1Z2luLmZpbGVuYW1lKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xuICAgIHJlcXVpcmUoXCJmc1wiKS51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmVsb2FkUGx1Z2luID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm4gdGhpcy5sb2FkUGx1Z2luKGZpbGVuYW1lT3JOYW1lKTtcbiAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbi5wbHVnaW4uZ2V0TmFtZSgpO1xuICAgIGNvbnN0IGVuYWJsZWQgPSBwbHVnaW5Db29raWVbcGx1Z2luXTtcbiAgICBpZiAoZW5hYmxlZCkgdGhpcy5zdG9wUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5yZWxvYWRDb250ZW50KGJkcGx1Z2luc1twbHVnaW5dLmZpbGVuYW1lLCBcInBsdWdpblwiKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycm9yXX0pO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCBlcnJvcik7XG4gICAgfVxuICAgIGlmIChiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4ubG9hZCAmJiB0eXBlb2YoYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQoKTtcbiAgICBpZiAoZW5hYmxlZCkgdGhpcy5zdGFydFBsdWdpbihwbHVnaW4sIHRydWUpO1xuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIHJlbG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIHJlbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLXJlbG9hZGVkXCIsIHBsdWdpbik7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWxvYWRQbHVnaW4obmFtZSk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVkaXQgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnNvbGUubG9nKFwiRWRpdCBcIiArIGZpbGVuYW1lT3JOYW1lKTtcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcbiAgICBjb25zb2xlLmxvZyhcIkVkaXQgXCIgKyBmdWxsUGF0aCk7XG4gICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnNoZWxsLm9wZW5JdGVtKGAke2Z1bGxQYXRofWApO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS51cGRhdGVQbHVnaW5MaXN0ID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IENvbnRlbnRNYW5hZ2VyLmxvYWROZXdDb250ZW50KFwicGx1Z2luXCIpO1xuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgcmVzdWx0cy5hZGRlZCkgdGhpcy5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcmVzdWx0cy5yZW1vdmVkKSB0aGlzLnVubG9hZFBsdWdpbihuYW1lKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubG9hZFBsdWdpbkRhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicGx1Z2luc1wiKTtcbiAgICBpZiAoc2F2ZWQpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwbHVnaW5Db29raWUsIHNhdmVkKTtcbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnNhdmVQbHVnaW5EYXRhID0gZnVuY3Rpb24gKCkge1xuICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJwbHVnaW5zXCIsIHBsdWdpbkNvb2tpZSk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLm5ld01lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbi5nZXROYW1lKCldKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4ub25NZXNzYWdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vbk1lc3NhZ2UoKTsgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb25NZXNzYWdlIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5jaGFubmVsU3dpdGNoID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9uU3dpdGNoID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vblN3aXRjaCgpOyB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZmlyZSBvblN3aXRjaCBmb3IgXCIgKyBwbHVnaW4uZ2V0TmFtZSgpICsgXCIuXCIsIGVycik7IH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmF3T2JzZXJ2ZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbi5nZXROYW1lKCldKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4ub2JzZXJ2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9ic2VydmVyKGUpOyB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZmlyZSBvYnNlcnZlciBmb3IgXCIgKyBwbHVnaW4uZ2V0TmFtZSgpICsgXCIuXCIsIGVycik7IH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBQbHVnaW5Nb2R1bGUoKTsiLCJpbXBvcnQgeyB0aGVtZUNvb2tpZSB9IGZyb20gXCIuLi8wZ2xvYmFsc1wiXHJcbmltcG9ydCBiZEV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiXHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIlxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIHBvcG91dFdpbmRvdyB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBXaW5kb3c+fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2luZG93cyA9IG5ldyBNYXAoKVxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgdGhpcy5pbml0KClcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KCl7XHJcbiAgICAgICAgbGV0IHBvcG91dE1vZHVsZSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRXaW5kb3cpXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyLnN1YnNjcmliZShcIlBPUE9VVF9XSU5ET1dfT1BFTlwiLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQHR5cGUge1dpbmRvd31cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gcG9wb3V0TW9kdWxlLmRlZmF1bHQuZ2V0V2luZG93KGV2LmtleSlcclxuICAgICAgICAgICAgICAgIHRoaXMud2luZG93cy5zZXQoZXYua2V5LCB3aW5kb3cpXHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGNsYXNzTGlzdCA9IHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdFxyXG4gICAgICAgICAgICAgICAgY2xhc3NMaXN0LmFkZChcIndpbmRvdy1wb3BvdXRcIilcclxuICAgICAgICAgICAgICAgIGNsYXNzTGlzdC5hZGQoXCJsaWdodGNvcmRcIilcclxuICAgICAgICAgICAgICAgIGNsYXNzTGlzdC5hZGQoXCJsaWdodGNvcmRcIilcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZShldi5rZXkpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmRpc3BhdGNoZXIuc3Vic2NyaWJlKFwiUE9QT1VUX1dJTkRPV19DTE9TRVwiLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMud2luZG93cy5kZWxldGUoZXYua2V5KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS1lbmFibGVkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS1kaXNhYmxlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKClcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJkRXZlbnRzLm9uKFwidGhlbWUtcmVsb2FkZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpXHJcbiAgICAgICAgfSlcclxuICAgICAgICBiZEV2ZW50cy5vbihcInRoZW1lLXVubG9hZGVkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS1sb2FkZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXHJcbiAgICAgICAgdGhpcy51cGRhdGUoKVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMudXBkYXRlKClcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGUoa2V5KXtcclxuICAgICAgICBpZighdGhpcy53aW5kb3dzLnNpemUpcmV0dXJuXHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZCl7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZVRoZW1lcyhrZXkpXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5VGhlbWVzKGtleSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlVGhlbWVzKGtleSl7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIGlmKGtleSl7XHJcbiAgICAgICAgICAgIGxldCB3aW5kb3cgPSB0aGlzLndpbmRvd3MuZ2V0KGtleSlcclxuICAgICAgICAgICAgaWYoIXdpbmRvdylyZXR1cm5cclxuICAgICAgICAgICAgbGV0IGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50XHJcblxyXG4gICAgICAgICAgICBmb3IobGV0IHN0eWxlIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzdHlsZVtkYXRhLWxpZ2h0Y29yZC10aGVtZT10cnVlXVwiKSl7XHJcbiAgICAgICAgICAgICAgICBzdHlsZS5yZW1vdmUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGZvcihsZXQga2V5IG9mIHRoaXMud2luZG93cy5rZXlzKCkpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVUaGVtZXMoa2V5KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5VGhlbWVzKGtleSl7XHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICBpZihrZXkpe1xyXG4gICAgICAgICAgICBsZXQgd2luZG93ID0gdGhpcy53aW5kb3dzLmdldChrZXkpXHJcbiAgICAgICAgICAgIGlmKCF3aW5kb3cpcmV0dXJuXHJcbiAgICAgICAgICAgIGxldCBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudFxyXG5cclxuICAgICAgICAgICAgZm9yKGxldCBzdHlsZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbZGF0YS1saWdodGNvcmQtdGhlbWU9dHJ1ZV1cIikpe1xyXG4gICAgICAgICAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKFwid2lsbC1yZW1vdmVcIiwgXCJ0cnVlXCIpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGJkdGhlbWVzKVxyXG4gICAgICAgICAgICAuZm9yRWFjaCh0aGVtZU5hbWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoIXRoZW1lQ29va2llW3RoZW1lTmFtZV0pcmV0dXJuIC8vIHRoZW1lIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW3RoZW1lTmFtZV1cclxuICAgICAgICAgICAgICAgIGlmKCF0aGVtZSlyZXR1cm4gLy86c2hydWc6XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcInN0eWxlW2RhdGEtbGlnaHRjb3JkLXRoZW1lPXRydWVdI1wiK0RPTS5lc2NhcGVJRCh0aGVtZS5pZCkpXHJcbiAgICAgICAgICAgICAgICBpZihleGlzdGluZyl7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuaW5uZXJIVE1MID0gdW5lc2NhcGUodGhlbWUuY3NzKVxyXG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnJlbW92ZUF0dHJpYnV0ZShcIndpbGwtcmVtb3ZlXCIpXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLmlkID0gRE9NLmVzY2FwZUlEKHRoZW1lLmlkKVxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLmlubmVySFRNTCA9IHVuZXNjYXBlKHRoZW1lLmNzcylcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWxpZ2h0Y29yZC10aGVtZVwiLCBcInRydWVcIilcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZChzdHlsZSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgIGZvcihsZXQgc3R5bGUgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcInN0eWxlW3dpbGwtcmVtb3ZlPXRydWVdXCIpKXtcclxuICAgICAgICAgICAgICAgIHN0eWxlLnJlbW92ZSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgZm9yKGxldCBrZXkgb2YgdGhpcy53aW5kb3dzLmtleXMoKSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5VGhlbWVzKGtleSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBWMkNfUHVibGljU2VydmVycyBmcm9tIFwiLi4vdWkvcHVibGljc2VydmVycy9wdWJsaWNTZXJ2ZXJzXCI7XHJcbmltcG9ydCBMYXllcnMgZnJvbSBcIi4vTGF5ZXJzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjJfUHVibGljU2VydmVycyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fYXBwZW5kQnV0dG9uID0gdGhpcy5fYXBwZW5kQnV0dG9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlYyX1B1YmxpY1NlcnZlcnMgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIExheWVycy5jcmVhdGVMYXllcigoY2xvc2UpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfUHVibGljU2VydmVycywge3Jvb3RJZDogXCJwdWJzbGF5ZXJyb290XCIsIGNsb3NlfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBidXR0b24oKSB7XHJcbiAgICAgICAgY29uc3QgYnRuID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItbGlcIiBjbGFzcz1cIiR7QkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW19XCI+YCk7XHJcbiAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0xXCJdKSBidG4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItYnV0dG9uXCIgY2xhc3M9XCIke1wid3JhcHBlci0yNWVWSW4gXCIgKyBCRFYyLmd1aWxkQ2xhc3Nlcy5jaXJjbGVCdXR0b25NYXNrfVwiPnB1YmxpYzwvZGl2PmApO1xyXG4gICAgICAgIGxhYmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7dGhpcy5yZW5kZXIoKTt9KTtcclxuICAgICAgICBidG4uYXBwZW5kKGxhYmVsKTtcclxuICAgICAgICByZXR1cm4gYnRuO1xyXG4gICAgfVxyXG5cclxuICAgIF9hcHBlbmRCdXR0b24oKSB7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1ldHV0b3JpYWxDb250YWluZXJcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBVdGlscy5yZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kb3dubG9hZFByb2dyZXNzICYmIGUudHV0b3JpYWxDb250YWluZXIpWzBdLnR1dG9yaWFsQ29udGFpbmVyKVxyXG4gICAgICAgIF1cclxuICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IERPTS5xdWVyeShgZGl2LiR7Y2xhc3NOYW1ldHV0b3JpYWxDb250YWluZXJ9ID4gZGl2YCk7XHJcbiAgICAgICAgRE9NLmFmdGVyKGd1aWxkcywgdGhpcy5idXR0b24pO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEJ1dHRvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5ndWlsZFBhdGNoKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgR3VpbGRMaXN0ID0gd2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgPT0gXCJOYXZpZ2FibGVHdWlsZHNcIik7XHJcbiAgICAgICAgY29uc3QgR3VpbGRMaXN0T2xkID0gd2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJHdWlsZHNcIik7XHJcbiAgICAgICAgaWYgKCFHdWlsZExpc3QgJiYgIUd1aWxkTGlzdE9sZCkgVXRpbHMud2FybihcIlB1YmxpY1NlcnZlclwiLCBcIkNhbid0IGZpbmQgR3VpbGRMaXN0IGNvbXBvbmVudFwiKTtcclxuICAgICAgICB0aGlzLmd1aWxkUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZExpc3QgPyBHdWlsZExpc3QgOiBHdWlsZExpc3RPbGQucHJvdG90eXBlLCBHdWlsZExpc3QgPyBcImRlZmF1bHRcIiA6IFwicmVuZGVyXCIsIHthZnRlcjogdGhpcy5fYXBwZW5kQnV0dG9ufSk7XHJcbiAgICAgICAgdGhpcy5fYXBwZW5kQnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQnV0dG9uKCkge1xyXG4gICAgICAgIHRoaXMuZ3VpbGRQYXRjaCgpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmd1aWxkUGF0Y2g7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uID0gRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKTtcclxuICAgICAgICBpZiAoYnV0dG9uKSBidXR0b24ucmVtb3ZlKCk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IHtzZXR0aW5ncywgc2V0dGluZ3NDb29raWUsIHNldHRpbmdzUlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsU2lkZWJhclwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBjb2xvcmVkVGV4dCBmcm9tIFwiLi9jb2xvcmVkVGV4dFwiO1xyXG5pbXBvcnQgdGZIb3VyIGZyb20gXCIuLzI0aG91clwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgcHVibGljU2VydmVyc01vZHVsZSBmcm9tIFwiLi9wdWJsaWNTZXJ2ZXJzXCI7XHJcbmltcG9ydCB2b2ljZU1vZGUgZnJvbSBcIi4vdm9pY2VNb2RlXCI7XHJcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vY2xhc3NOb3JtYWxpemVyXCI7XHJcbmltcG9ydCBkTW9kZSBmcm9tIFwiLi9kZXZNb2RlXCI7XHJcblxyXG5pbXBvcnQgU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBmcm9tIFwiLi4vdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQ3NzRWRpdG9yIGZyb20gXCIuLi91aS9jc3NFZGl0b3JcIjtcclxuaW1wb3J0IENhcmRMaXN0IGZyb20gXCIuLi91aS9hZGRvbmxpc3RcIjtcclxuaW1wb3J0IFYyQ19QcmVzZW5jZVNldHRpbmdzIGZyb20gXCIuLi91aS9wcmVzZW5jZVNldHRpbmdzXCI7XHJcbmltcG9ydCBDdXN0b21SaWNoUHJlc2VuY2UgZnJvbSBcIi4vQ3VzdG9tUmljaFByZXNlbmNlXCI7XHJcbmltcG9ydCBWMkNfQWNjb3VudEluZm9zIGZyb20gXCIuLi91aS9BY2NvdW50SW5mb3NcIjtcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XHJcbmltcG9ydCBBbnRpQWRETSBmcm9tIFwiLi9BbnRpQWRETVwiO1xyXG5pbXBvcnQgYmx1clByaXZhdGUgZnJvbSBcIi4vYmx1clByaXZhdGVcIjtcclxuaW1wb3J0IGRpc2FibGVUeXBpbmcgZnJvbSBcIi4vZGlzYWJsZVR5cGluZ1wiO1xyXG5pbXBvcnQgQXBpUHJldmlldyBmcm9tIFwiLi4vdWkvQXBpUHJldmlld1wiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuLi91aS9zd2l0Y2hcIjtcclxuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi4vdWkvbWFyZ2ludG9wXCI7XHJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgdG9vbHRpcFdyYXAgZnJvbSBcIi4uL3VpL3Rvb2x0aXBXcmFwXCI7XHJcbmltcG9ydCBIaXN0b3J5IGZyb20gXCIuLi91aS9pY29ucy9oaXN0b3J5XCI7XHJcbmltcG9ydCBjb3JlIGZyb20gXCIuL2NvcmVcIjtcclxuaW1wb3J0IHBvcG91dFdpbmRvdyBmcm9tIFwiLi9wb3BvdXRXaW5kb3dcIjtcclxuXHJcbmNsYXNzIEJEU2lkZWJhckhlYWRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNpZGViYXJDb21wb25lbnRzID0gd2VicGFja01vZHVsZXMuZmluZChlID0+IGUuU2VwYXJhdG9yICYmIGUuSGVhZGVyICYmIGUuSXRlbSlcclxuXHJcbiAgICAgICAgY29uc3QgY2hhbmdlbG9nQnV0dG9uID0gUmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQ2hhbmdlbG9nXCJ9LCBcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge3N0eWxlOiB7ZmxvYXQ6IFwicmlnaHRcIiwgY3Vyc29yOiBcInBvaW50ZXJcIn0sIGNsYXNzTmFtZTogXCJiZC1jaGFuZ2Vsb2ctYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTt9fSxcclxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSGlzdG9yeSwge2NsYXNzTmFtZTogXCJiZC1pY29uXCIsIHNpemU6IFwiMTZweFwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHJlbmRlcmVkID0gbmV3IHNpZGViYXJDb21wb25lbnRzLkhlYWRlcih7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBcIkJhbmRhZ2VkIEJEXCIsIGNoYW5nZWxvZ0J1dHRvbiksXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwiXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gcmVuZGVyZWRcclxuICAgIH1cclxufVxyXG5cclxubGV0IGlzQ2xlYXJpbmdDYWNoZSA9IGZhbHNlXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjJfU2V0dGluZ3NQYW5lbCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzID0gdGhpcy51cGRhdGVTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IG5ldyBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudHMoKVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50cygpe1xyXG4gICAgICAgIC8qKiBMaWdodGNvcmQgKi9cclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJsaWdodGNvcmRcIiwgbWFrZUNvbXBvbmVudCh0aGlzLmxpZ2h0Y29yZENvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJzdGF0dXNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLlByZXNlbmNlQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImFjY291bnRpbmZvXCIsIG1ha2VDb21wb25lbnQodGhpcy5BY2NvdW50SW5mb3NDb21wb25lbnQuYmluZCh0aGlzKSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwibGNhcGlwcmV2aWV3XCIsIG1ha2VDb21wb25lbnQodGhpcy5BcGlQcmV2aWV3Q29tcG9uZW50LmJpbmQodGhpcykpKVxyXG5cclxuICAgICAgICAvKiBCYW5kYWdlZCBCRCAqL1xyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcIkJEQ2hhbmdlbG9nVGl0bGVcIiwgbWFrZUNvbXBvbmVudCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQkRTaWRlYmFySGVhZGVyKCkucmVuZGVyKClcclxuICAgICAgICB9KSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJjb3JlXCIsIG1ha2VDb21wb25lbnQodGhpcy5jb3JlQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImN1c3RvbWNzc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuY3VzdG9tQ3NzQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcInBsdWdpbnNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLnJlbmRlckFkZG9uUGFuZShcInBsdWdpbnNcIikpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcInRoZW1lc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMucmVuZGVyQWRkb25QYW5lKFwidGhlbWVzXCIpKSlcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0IGNvcmVTZXR0aW5ncygpIHtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoXCJjb3JlXCIpO1xyXG4gICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbLi4ubmV3IFNldChzZXR0aW5ncy5tYXAocyA9PiBzLmNhdGVnb3J5KSldO1xyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2F0ZWdvcmllcy5tYXAoYyA9PiB7cmV0dXJuIHt0aXRsZTogYywgc2V0dGluZ3M6IHNldHRpbmdzLmZpbHRlcihzID0+IHMuY2F0ZWdvcnkgPT0gYyl9O30pO1xyXG4gICAgICAgIHJldHVybiBzZWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGlnaHRjb3JkU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKFwibGlnaHRjb3JkXCIpO1xyXG4gICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbLi4ubmV3IFNldChzZXR0aW5ncy5tYXAocyA9PiBzLmNhdGVnb3J5KSldO1xyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2F0ZWdvcmllcy5tYXAoYyA9PiB7cmV0dXJuIHt0aXRsZTogYywgc2V0dGluZ3M6IHNldHRpbmdzLmZpbHRlcihzID0+IHMuY2F0ZWdvcnkgPT0gYyl9O30pO1xyXG4gICAgICAgIHJldHVybiBzZWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgUHJlc2VuY2VTZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZXR0aW5ncyhcInN0YXR1c1wiKVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNldHRpbmdzKGNhdGVnb3J5KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSBzZXR0aW5nc1trZXldO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5jYXQgPT09IGNhdGVnb3J5ICYmIHNldHRpbmcuaW1wbGVtZW50ZWQgJiYgIXNldHRpbmcuaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nLnRleHQgPSBrZXk7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXR0aW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH0sIFtdKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQsIHNpZGViYXIpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKGlkLCBjaGVja2VkLCBzaWRlYmFyKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVTZXR0aW5ncyhpZCwgZW5hYmxlZCwgc2lkZWJhcikge1xyXG4gICAgICAgIGlmKCFbXCJsaWdodGNvcmQtOFwiLCBcIm5vX3dpbmRvd19ib3VuZFwiLCBcImVuYWJsZV9nbGFzc3Ryb25cIiwgXCJsaWdodGNvcmQtMTBcIl0uaW5jbHVkZXMoaWQpKXNldHRpbmdzQ29va2llW2lkXSA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy0yXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy0zXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWwtY2hhblwiKTtcclxuICAgICAgICAgICAgZWxzZSBET00ucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLmFkZEJ1dHRvbigpO1xyXG4gICAgICAgICAgICBlbHNlIHB1YmxpY1NlcnZlcnNNb2R1bGUucmVtb3ZlQnV0dG9uKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB2b2ljZU1vZGUuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSB2b2ljZU1vZGUuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTVcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW5hYmxlZCAmJiBpZCA9PSBcImJkYS1ncy02XCIpIHRmSG91ci5pbmplY3QyNEhvdXIoKTtcclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTdcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgY29sb3JlZFRleHQuaW5qZWN0Q29sb3JlZFRleHQoKTtcclxuICAgICAgICAgICAgZWxzZSBjb2xvcmVkVGV4dC5yZW1vdmVDb2xvcmVkVGV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy00XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIENsYXNzTm9ybWFsaXplci5zdGFydCgpO1xyXG4gICAgICAgICAgICBlbHNlIENsYXNzTm9ybWFsaXplci5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXBzLTVcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLnVud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstd3AtMVwiKSB7XHJcbiAgICAgICAgICAgIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJ0cmFuc3BhcmVudFwiLCBlbmFibGVkKTtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgbnVsbCk7XHJcbiAgICAgICAgICAgIGVsc2UgVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShcImJhY2tncm91bmRDb2xvclwiLCBcIiMyZjMxMzZcIik7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLThcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgICAgIGVsc2UgZE1vZGUuc3RvcERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstZG0tMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBkTW9kZS5zdGFydENvcHlTZWxlY3RvcigpO1xyXG4gICAgICAgICAgICBlbHNlIGRNb2RlLnN0b3BDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSB0cnVlXHJcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gZmFsc2VcclxuICAgICAgICAgICAgc2lkZWJhci5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IHRydWVcclxuICAgICAgICAgICAgZWxzZSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2UuZW5hYmxlKClcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzU3RvcmUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIHR5cGVvZiBlLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgJiYgXCJzaG93Q3VycmVudEdhbWVcIiBpbiBlLmRlZmF1bHQpWzBdXHJcbiAgICAgICAgICAgICAgICBpZihzZXR0aW5nc1N0b3JlICYmICFzZXR0aW5nc1N0b3JlLmRlZmF1bHQuc2hvd0N1cnJlbnRHYW1lKXtcclxuICAgICAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC51cGRhdGVSZW1vdGVTZXR0aW5ncylbMF0uZGVmYXVsdC51cGRhdGVSZW1vdGVTZXR0aW5ncyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDdXJyZW50R2FtZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBDdXN0b21SaWNoUHJlc2VuY2UuZGlzYWJsZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtM1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXHJcbiAgICAgICAgICAgIGVsc2UgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcChmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC00XCIpIHtcclxuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5lbmFibGUoKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIEFudGlBZERNLmRpc2FibGUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtNlwiKSB7XHJcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBibHVyUHJpdmF0ZS5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTdcIikge1xyXG4gICAgICAgICAgICBpZihlbmFibGVkKXtcclxuICAgICAgICAgICAgICAgIGRpc2FibGVUeXBpbmcuZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmRpc2FibGUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtOFwiKXtcclxuICAgICAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gcmVtb3RlLmdldEdsb2JhbChcImFwcFNldHRpbmdzXCIpXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNldChcImlzVGFic1wiLCBlbmFibGVkKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcclxuICAgICAgICAgICAgcmVtb3RlLmFwcC5yZWxhdW5jaCgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAuZXhpdCgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtOVwiKSB7XHJcbiAgICAgICAgICAgIHBvcG91dFdpbmRvd1tlbmFibGVkID8gXCJlbmFibGVcIiA6IFwiZGlzYWJsZVwiXSgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMTBcIil7XHJcbiAgICAgICAgICAgIGNvcmUubWV0aG9kcy5Ob3RpZmljYXRpb25zVXNlU2hpbShlbmFibGVkKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcIm5vX3dpbmRvd19ib3VuZFwiKXtcclxuICAgICAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gcmVtb3RlLmdldEdsb2JhbChcImFwcFNldHRpbmdzXCIpXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNldChcIk5PX1dJTkRPV1NfQk9VTkRcIiwgZW5hYmxlZClcclxuXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLmRlbGV0ZShcIklTX01BWElNSVpFRFwiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5kZWxldGUoXCJJU19NSU5JTUlaRURcIikgXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLmRlbGV0ZShcIldJTkRPV19CT1VORFNcIilcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNhdmUoKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLnJlbGF1bmNoKClcclxuICAgICAgICAgICAgcmVtb3RlLmFwcC5leGl0KClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImVuYWJsZV9nbGFzc3Ryb25cIil7XHJcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJHTEFTU1RST05cIiwgZW5hYmxlZClcclxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2F2ZSgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLmV4aXQoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0aWFsaXplU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTJcIl0pIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTNcIl0pIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWwtY2hhblwiKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMVwiXSkgcHVibGljU2VydmVyc01vZHVsZS5hZGRCdXR0b24oKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNFwiXSkgdm9pY2VNb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTVcIl0pIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy02XCJdKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTdcIl0pIGNvbG9yZWRUZXh0LmluamVjdENvbG9yZWRUZXh0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy00XCJdKSBDbGFzc05vcm1hbGl6ZXIuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtMVwiXSkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gdHJ1ZVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0yXCJdKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IHRydWVcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiXSkgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTNcIl0pIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0QWx3YXlzT25Ub3AodHJ1ZSlcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNFwiXSkgQW50aUFkRE0uZW5hYmxlKClcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNlwiXSkgYmx1clByaXZhdGUuZW5hYmxlKClcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtN1wiXSkgZGlzYWJsZVR5cGluZy5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC05XCJdKSBwb3BvdXRXaW5kb3cuZW5hYmxlKClcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSB7XHJcbiAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtOFwiXSkgZE1vZGUuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1kbS0xXCJdKSBkTW9kZS5zdGFydENvcHlTZWxlY3RvcigpO1xyXG5cclxuICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVTZXR0aW5ncygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIiwgc2V0dGluZ3NDb29raWUpO1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJycGNcIiwgc2V0dGluZ3NSUEMpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRTZXR0aW5ncygpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzQ29va2llLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIikpO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJycGNcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclNpZGViYXIoc2lkZWJhcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpZGViYXIucmVuZGVyKHNpZGViYXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvcmVDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZWN0aW9uZWRTZXR0aW5nc1BhbmVsLCB7a2V5OiBcImNzcGFuZWxcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIHNlY3Rpb25zOiB0aGlzLmNvcmVTZXR0aW5nc30pXHJcbiAgICB9XHJcblxyXG4gICAgbGlnaHRjb3JkQ29tcG9uZW50KHNpZGViYXIsIGZvcmNlVXBkYXRlKSB7XHJcbiAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gcmVtb3RlLmdldEdsb2JhbChcImFwcFNldHRpbmdzXCIpXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgdGhpcy5saWdodGNvcmRTZXR0aW5ncy5tYXAoKHNlY3Rpb24sIGkpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgPT09IDAgPyBudWxsIDogQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KE1hcmdpblRvcCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSwgc2VjdGlvbi50aXRsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5zZXR0aW5ncy5tYXAoc2V0dGluZyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc0NoZWNrZWQgPSBzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nLmlkXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09PSBcImxpZ2h0Y29yZC04XCIpaXNDaGVja2VkID0gYXBwU2V0dGluZ3MuZ2V0KFwiaXNUYWJzXCIsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJub193aW5kb3dfYm91bmRcIilpc0NoZWNrZWQgPSBhcHBTZXR0aW5ncy5nZXQoXCJOT19XSU5ET1dTX0JPVU5EXCIsIGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09PSBcImVuYWJsZV9nbGFzc3Ryb25cIilpc0NoZWNrZWQgPSBhcHBTZXR0aW5ncy5nZXQoXCJHTEFTU1RST05cIiwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJsaWdodGNvcmQtMTBcIilpc0NoZWNrZWQgPSAhYXBwU2V0dGluZ3MuZ2V0KFwiREVGQVVMVF9OT1RJRklDQVRJT05TXCIsIHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtpZDogc2V0dGluZy5pZCwga2V5OiBzZXR0aW5nLmlkLCBkYXRhOiBzZXR0aW5nLCBjaGVja2VkOiBpc0NoZWNrZWQsIG9uQ2hhbmdlOiAoaWQsIGNoZWNrZWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UoaWQsIGNoZWNrZWQsIHNpZGViYXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PSBcImxpZ2h0Y29yZC04XCIgJiYgaXNDaGVja2VkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCJncmVlblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rOiBcIm91dGxpbmVkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IFwic21hbGxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJDb2xvcjogXCJicmFuZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3JkTmF0aXZlLmlwYy5zZW5kKFwiTkVXX1RBQlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgXCJPcGVuIGEgbmV3IFRhYlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0pLCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xyXG4gICAgICAgICAgICAgICAgY29sb3I6IFwieWVsbG93XCIsXHJcbiAgICAgICAgICAgICAgICBsb29rOiBcImdob3N0XCIsXHJcbiAgICAgICAgICAgICAgICBzaXplOiBcIm1lZGl1bVwiLFxyXG4gICAgICAgICAgICAgICAgaG92ZXJDb2xvcjogXCJyZWRcIixcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2soKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlNob3VsZCByZWxhdW5jaFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiByZW1vdGUucHJvY2Vzcy5hcmd2LnNsaWNlKDEpLmNvbmNhdChbXCItLWRpc2FibGUtYmV0dGVyZGlzY29yZFwiXSlcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5hcHAucXVpdCgpXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgd3JhcHBlcjogdHJ1ZVxyXG4gICAgICAgICAgICB9LCBcIlJlbGF1bmNoIHdpdGhvdXQgQmV0dGVyRGlzY29yZFwiKSxcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xyXG4gICAgICAgICAgICAgICAgY29sb3I6IFwieWVsbG93XCIsXHJcbiAgICAgICAgICAgICAgICBsb29rOiBcImdob3N0XCIsXHJcbiAgICAgICAgICAgICAgICBzaXplOiBcIm1lZGl1bVwiLFxyXG4gICAgICAgICAgICAgICAgaG92ZXJDb2xvcjogXCJyZWRcIixcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihpc0NsZWFyaW5nQ2FjaGUpcmV0dXJuXHJcbiAgICAgICAgICAgICAgICAgICAgaXNDbGVhcmluZ0NhY2hlID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkNsZWFyaW5nIGNhY2hlLi4uXCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbmZvXCJcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkuc2Vzc2lvbi5jbGVhckNhY2hlKClcclxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkNhY2hlIGlzIGNsZWFyZWQgIVwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NsZWFyaW5nQ2FjaGUgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQuIENoZWNrIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb25zLlwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGVhcmluZ0NhY2hlID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgd3JhcHBlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBpc0NsZWFyaW5nQ2FjaGVcclxuICAgICAgICAgICAgfSwgXCJDbGVhciBjYWNoZVwiKVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBQcmVzZW5jZUNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19QcmVzZW5jZVNldHRpbmdzLCB7XHJcbiAgICAgICAgICAgIGtleTogXCJscHBhbm5lbFwiLFxyXG4gICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiB0aGlzLlByZXNlbmNlU2V0dGluZ3NcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIEFjY291bnRJbmZvc0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19BY2NvdW50SW5mb3MsIHtcclxuICAgICAgICAgICAga2V5OiBcImxhcGFubmVsXCJcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIEFwaVByZXZpZXdDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChBcGlQcmV2aWV3LCB7XHJcbiAgICAgICAgICAgIGtleTogXCJsYXBpcGFubmVsXCJcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGN1c3RvbUNzc0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENzc0VkaXRvciwge2tleTogXCJjc3NlZGl0b3JcIn0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyQWRkb25QYW5lKHR5cGUpIHtcclxuICAgICAgICAvLyBJIGtub3cgdGhpcyBzaG91bGRuJ3QgYmUgaGVyZSwgYnV0IHdoZW4gaXQgaXNuJ3QsXHJcbiAgICAgICAgLy8gUmVhY3QgcmVmdXNlcyB0byBjaGFuZ2UgdGhlIGJ1dHRvbiB3aGVuIGdvaW5nXHJcbiAgICAgICAgLy8gYmV0d2VlbiBwbHVnaW5zIGFuZCB0aGVtZXMgcGFnZS4uLiBzb21ldGhpbmdcclxuICAgICAgICAvLyB0byBkZWJ1ZyBsYXRlci5cclxuICAgICAgICBjbGFzcyBDb250ZW50TGlzdCBleHRlbmRzIEJEVjIucmVhY3QuQ29tcG9uZW50IHtcclxuICAgICAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJlZml4ID0gdGhpcy5wcm9wcy50eXBlLnJlcGxhY2UoXCJzXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLnR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHJlbmRlcigpIHtyZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQ29udGVudExpc3QucHJvdG90eXBlLnJlbmRlcjtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29udGVudExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgICAgICAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGVudExpc3QsIHt0eXBlfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENhcmRMaXN0LCB7dHlwZX0pKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBObyBuZWVkIHRvIGV4cG9ydCBzZXR0aW5nc1BhbmVsIG9uIHdpbmRvd1xyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG1ha2VDb21wb25lbnQoY2hpbGRyZW4pe1xyXG4gICAgY2xhc3MgU2V0dGluZ0NvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICAgICAgcmVuZGVyKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbihzaWRlYmFyLCAoKSA9PiB0aGlzLmZvcmNlVXBkYXRlKCkpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHNpZGViYXJcclxuICAgIHJldHVybiAocykgPT4ge1xyXG4gICAgICAgIHNpZGViYXIgPSBzXHJcbiAgICAgICAgcmV0dXJuIFNldHRpbmdDb21wb25lbnRcclxuICAgIH1cclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5wYW5lbHMgPSB7fVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyKHBhbmVsLCBjb21wb25lbnQpe1xyXG4gICAgICAgIHRoaXMucGFuZWxzW3BhbmVsXSA9IGNvbXBvbmVudFxyXG4gICAgfVxyXG5cclxuICAgIGdldENvbXBvbmVudChwYW5lbCwgc2lkZWJhcil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFuZWxzW3BhbmVsXShzaWRlYmFyKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBpdGVtcygpIHtcclxuICAgICAgICByZXR1cm4gW3tcclxuICAgICAgICAgICAgdGV4dDogXCJCZXR0ZXJEaXNjb3JkIFNldHRpbmdzXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJjb3JlXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwicGx1Z2luc1wiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIlRoZW1lc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwidGhlbWVzXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiQ3VzdG9tIENTU1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwiY3VzdG9tY3NzXCJcclxuICAgICAgICB9XTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgTENpdGVtcygpe1xyXG4gICAgICAgIGxldCBpdGVtcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJMaWdodGNvcmQgU2V0dGluZ3NcIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImxpZ2h0Y29yZFwiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IFwiUmljaFByZXNlbmNlXCIsIFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwic3RhdHVzXCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJBY2NvdW50IEluZm9cIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImFjY291bnRpbmZvXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgICByZXR1cm4gaXRlbXNcclxuICAgIH1cclxuXHJcbiAgICBnZXQgTENEZXZJdGVtcygpe1xyXG4gICAgICAgIGxldCBpdGVtcyA9IFtdXHJcbiAgICAgICAgaWYoIXdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSlyZXR1cm4gaXRlbXNcclxuICAgICAgICBpdGVtcy5wdXNoKC4uLltcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJIRUFERVJcIixcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIkxpZ2h0Y29yZCBBcGlcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIkNvbXBvbmVudHMgUHJldmlld1wiLFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwibGNhcGlwcmV2aWV3XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF0pXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKHNpZGViYXIpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkhFQURFUlwiLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiTGlnaHRjb3JkXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4udGhpcy5MQ2l0ZW1zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAuLi50aGlzLkxDRGV2SXRlbXMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoZS5zZWN0aW9uKXJldHVybiBlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkLCBzaWRlYmFyKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJDVVNUT01cIixcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KFwiQkRDaGFuZ2Vsb2dUaXRsZVwiKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAuLi50aGlzLml0ZW1zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogTm8gbmVlZCB0byBleHBvcnQgc2V0dGluZ3NQYW5lbFNpZGViYXIgb24gd2luZG93XHJcbiAqLyIsImltcG9ydCB7YmR0aGVtZUVycm9ycywgdGhlbWVDb29raWUsIHNldHRpbmdzQ29va2llLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuaW1wb3J0IGJkRXZlbnRzIGZyb20gXCIuL2JkRXZlbnRzXCI7XHJcblxyXG5jbGFzcyBUaGVtZU1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5UaGVtZU1vZHVsZSA9IHRoaXNcclxuICAgIH1cclxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlcjt9XHJcbn1cclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5sb2FkVGhlbWVEYXRhKCk7XHJcbiAgICBiZHRoZW1lRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFRoZW1lcygpKSk7XHJcbiAgICBjb25zdCB0aGVtZXMgPSBPYmplY3Qua2V5cyhiZHRoZW1lcyk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGVtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW3RoZW1lc1tpXV07XHJcbiAgICAgICAgaWYgKCF0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSkgdGhlbWVDb29raWVbdGhlbWUubmFtZV0gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhlbWVDb29raWVbdGhlbWUubmFtZV0pIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcclxuXHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTApKVxyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCB0aGVtZSBpbiB0aGVtZUNvb2tpZSkge1xyXG4gICAgICAgIGlmICghYmR0aGVtZXNbdGhlbWVdKSBkZWxldGUgdGhlbWVDb29raWVbdGhlbWVdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XHJcbiAgICAvLyBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0pIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVuYWJsZVRoZW1lID0gZnVuY3Rpb24obmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHRoZW1lQ29va2llW25hbWVdID0gdHJ1ZTtcclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1tuYW1lXTtcclxuICAgIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcclxuICAgIGJkRXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtZW5hYmxlZFwiKVxyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSBoYXMgYmVlbiBhcHBsaWVkLmApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlVGhlbWUobmFtZSwgcmVsb2FkKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdGhlbWVDb29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1tuYW1lXTtcclxuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpKTtcclxuICAgIGJkRXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtZGlzYWJsZWRcIilcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gaGFzIGJlZW4gZGlzYWJsZWQuYCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudG9nZ2xlVGhlbWUgPSBmdW5jdGlvbih0aGVtZSkge1xyXG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUpO1xyXG4gICAgZWxzZSB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlVGhlbWUobmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWUpIHtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZENvbnRlbnQoZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC4gSXQgbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZSk7XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSB3YXMgbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gd2FzIGxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtbG9hZGVkXCIsIHRoZW1lLm5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnVubG9hZFRoZW1lID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm47XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWUubmFtZTtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcclxuICAgIGNvbnN0IGVycm9yID0gQ29udGVudE1hbmFnZXIudW5sb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBkZWxldGUgYmR0aGVtZXNbdGhlbWVdO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IHdhcyB1bmxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB3YXMgdW5sb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLXVubG9hZGVkXCIsIHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybjtcclxuICAgIHRoaXMudW5sb2FkVGhlbWUoYmR0aGVtZS5maWxlbmFtZSk7XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyLCBiZHRoZW1lLmZpbGVuYW1lKTtcclxuICAgIHJlcXVpcmUoXCJmc1wiKS51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5yZWxvYWRUaGVtZSA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmR0aGVtZSkgcmV0dXJuIHRoaXMubG9hZFRoZW1lKGZpbGVuYW1lT3JOYW1lKTtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZS5uYW1lO1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5yZWxvYWRDb250ZW50KGJkdGhlbWVzW3RoZW1lXS5maWxlbmFtZSwgXCJ0aGVtZVwiKTtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lLCB0cnVlKSwgdGhpcy5lbmFibGVUaGVtZSh0aGVtZSwgdHJ1ZSk7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gdiR7YmR0aGVtZXNbdGhlbWVdLnZlcnNpb259IHdhcyByZWxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB2JHtiZHRoZW1lc1t0aGVtZV0udmVyc2lvbn0gd2FzIHJlbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS1yZWxvYWRlZFwiLCB0aGVtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVsb2FkVGhlbWUobmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZWRpdCA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0oYCR7ZnVsbFBhdGh9YCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudXBkYXRlVGhlbWVMaXN0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCByZXN1bHRzID0gQ29udGVudE1hbmFnZXIubG9hZE5ld0NvbnRlbnQoXCJ0aGVtZVwiKTtcclxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgcmVzdWx0cy5hZGRlZCkgdGhpcy5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRUaGVtZShuYW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVEYXRhID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBzYXZlZCA9IERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJ0aGVtZXNcIik7XHJcbiAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoZW1lQ29va2llLCBzYXZlZCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuc2F2ZVRoZW1lRGF0YSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJ0aGVtZXNcIiwgdGhlbWVDb29raWUpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IFRoZW1lTW9kdWxlKCk7IiwiaW1wb3J0IHtiYmRWZXJzaW9ufSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFV0aWxzIHtcbiAgICAvKiogRG9jdW1lbnQvd2luZG93IHdpZHRoICovXG4gICAgc3RhdGljIGdldCBzY3JlZW5XaWR0aCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IH1cbiAgICAvKiogRG9jdW1lbnQvd2luZG93IGhlaWdodCAqL1xuICAgIHN0YXRpYyBnZXQgc2NyZWVuSGVpZ2h0KCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApOyB9XG5cbiAgICBzdGF0aWMgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aW5kb3dDb25maWdGaWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgIGZyYW1lOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0V2luZG93UHJlZmVyZW5jZShrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJmcmFtZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChrZXkgPT09IFwiZnJhbWVcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgc3RyaXBCT00oY29udGVudCkge1xuICAgICAgICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRUZXh0QXJlYSgpIHtcbiAgICAgICAgcmV0dXJuIERPTS5xdWVyeShcIi5cIityZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGFubmVsVGV4dEFyZWEgJiYgZS50aXRsZVdyYXBwZXIpWzBdLmNoYW5uZWxUZXh0QXJlYSkrXCIgdGV4dGFyZWFcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIGluc2VydFRleHQodGV4dGFyZWEsIHRleHQpIHtcbiAgICAgICAgdGV4dGFyZWEuZm9jdXMoKTtcbiAgICAgICAgdGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQgPSAwO1xuICAgICAgICB0ZXh0YXJlYS5zZWxlY3Rpb25FbmQgPSB0ZXh0YXJlYS52YWx1ZS5sZW5ndGg7XG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5zZXJ0VGV4dFwiLCBmYWxzZSwgdGV4dCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGVzY2FwZUlEKGlkKSB7XG4gICAgICAgIHJldHVybiBpZC5yZXBsYWNlKC9eW15hLXpdK3xbXlxcdy1dKy9naSwgXCItXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBsb2cobW9kdWxlTmFtZSwgbWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogIzNhNzFjMTsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogIzNhNzFjMTtcIiwgXCJcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIHdhcm4obW9kdWxlTmFtZSwgbWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6ICNFOEE0MDA7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6ICNFOEE0MDA7XCIsIFwiXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBlcnIobW9kdWxlTmFtZSwgbWVzc2FnZSwgZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogcmVkO1wiLCBcIlwiKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFwiJWNFcnJvcjogXCIgKyBlcnJvci5tZXNzYWdlLCBcImNvbG9yOiByZWQ7XCIpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXQgc3RyaW5ncyB3aXRoIHBsYWNlaG9sZGVycyAoYHt7cGxhY2Vob2xkZXJ9fWApIGludG8gZnVsbCBzdHJpbmdzLlxuICAgICAqIFF1aWNrIGV4YW1wbGU6IGBQbHVnaW5VdGlsaXRpZXMuZm9ybWF0U3RyaW5nKFwiSGVsbG8sIHt7dXNlcn19XCIsIHt1c2VyOiBcIlplcmVib3NcIn0pYFxuICAgICAqIHdvdWxkIHJldHVybiBcIkhlbGxvLCBaZXJlYm9zXCIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIHN0cmluZyB0byBmb3JtYXRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIC0gb2JqZWN0IGxpdGVyYWwgb2YgcGxhY2Vob2xkZXJzIHRvIHJlcGxhY2VtZW50c1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBwcm9wZXJseSBmb3JtYXR0ZWQgc3RyaW5nXG4gICAgICovXG4gICAgc3RhdGljIGZvcm1hdFN0cmluZyhzdHJpbmcsIHZhbHVlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBpbiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIGxldCByZXBsYWNlbWVudCA9IHZhbHVlc1t2YWxdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVwbGFjZW1lbnQpKSByZXBsYWNlbWVudCA9IEpTT04uc3RyaW5naWZ5KHJlcGxhY2VtZW50KTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YocmVwbGFjZW1lbnQpID09PSBcIm9iamVjdFwiICYmIHJlcGxhY2VtZW50ICE9PSBudWxsKSByZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShuZXcgUmVnRXhwKGB7eyR7dmFsfX19YCwgXCJnXCIpLCByZXBsYWNlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICBzdGF0aWMgZXNjYXBlKHMpIHtcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy0vXFxcXF4kKis/LigpfFtcXF17fV0vZywgXCJcXFxcJCZcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIHRlc3RKU09OKGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBpc0VtcHR5KG9iaikge1xuICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqID09IHVuZGVmaW5lZCB8fCBvYmogPT0gXCJcIikgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLmxlbmd0aCA9PSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBzdXBwcmVzc0Vycm9ycyhtZXRob2QsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHtcbiAgICAgICAgICAgIHRyeSB7IHJldHVybiBtZXRob2QoLi4ucGFyYW1zKTtcdH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IHRoaXMuZXJyKFwiU3VwcHJlc3NlZEVycm9yXCIsIFwiRXJyb3Igb2NjdXJyZWQgaW4gXCIgKyBtZXNzYWdlLCBlKTsgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBtb25rZXlQYXRjaCh3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHtiZWZvcmUsIGFmdGVyLCBpbnN0ZWFkLCBvbmNlID0gZmFsc2UsIHNpbGVudCA9IGZhbHNlLCBmb3JjZSA9IGZhbHNlfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gb3B0aW9ucy5kaXNwbGF5TmFtZSB8fCB3aGF0LmRpc3BsYXlOYW1lIHx8IHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUgfHwgd2hhdC5uYW1lIHx8IHdoYXQuY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgd2hhdC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJwYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGlmICghd2hhdFttZXRob2ROYW1lXSkge1xuICAgICAgICAgICAgaWYgKGZvcmNlKSB3aGF0W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IobWV0aG9kTmFtZSwgXCJkb2VzIG5vdCBleGlzdCBmb3JcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnTWV0aG9kID0gd2hhdFttZXRob2ROYW1lXTtcbiAgICAgICAgbGV0IGNhbmNlbGVkID0gZmFsc2VcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUubG9nKFwidW5wYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAvL3doYXRbbWV0aG9kTmFtZV0gPSBvcmlnTWV0aG9kO1xuICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlIC8vIHRoaXMgYWxsb3cgdG8gbW9ua2V5cGF0Y2ggbW9yZSB0aGFuIG9uZSB0aW1lLlxuICAgICAgICB9O1xuICAgICAgICB3aGF0W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZihjYW5jZWxlZCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdNZXRob2QuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgICAgIHRoaXNPYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgbWV0aG9kQXJndW1lbnRzOiBhcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgY2FuY2VsUGF0Y2g6IGNhbmNlbCxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE1ldGhvZDogb3JpZ01ldGhvZCxcbiAgICAgICAgICAgICAgICBjYWxsT3JpZ2luYWxNZXRob2Q6ICgpID0+IGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLm9yaWdpbmFsTWV0aG9kLmFwcGx5KGRhdGEudGhpc09iamVjdCwgZGF0YS5tZXRob2RBcmd1bWVudHMpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGluc3RlYWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUmV0ID0gVXRpbHMuc3VwcHJlc3NFcnJvcnMoaW5zdGVhZCwgXCJgaW5zdGVhZGAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAodGVtcFJldCAhPT0gdW5kZWZpbmVkKSBkYXRhLnJldHVyblZhbHVlID0gdGVtcFJldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChiZWZvcmUpIFV0aWxzLnN1cHByZXNzRXJyb3JzKGJlZm9yZSwgXCJgYmVmb3JlYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xuICAgICAgICAgICAgICAgIGRhdGEuY2FsbE9yaWdpbmFsTWV0aG9kKCk7XG4gICAgICAgICAgICAgICAgaWYgKGFmdGVyKSBVdGlscy5zdXBwcmVzc0Vycm9ycyhhZnRlciwgXCJgYWZ0ZXJgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob25jZSkgY2FuY2VsKCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih3aGF0W21ldGhvZE5hbWVdLCBvcmlnTWV0aG9kKTtcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXS5fX21vbmtleVBhdGNoZWQgPSB0cnVlO1xuICAgICAgICB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgICAgIGlmICghd2hhdFttZXRob2ROYW1lXS5fX29yaWdpbmFsTWV0aG9kKSB7XG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnTWV0aG9kO1xuICAgICAgICAgICAgd2hhdFttZXRob2ROYW1lXS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge3JldHVybiBvcmlnTWV0aG9kLnRvU3RyaW5nKCk7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FuY2VsO1xuICAgIH1cblxuICAgIHN0YXRpYyBvblJlbW92ZWQobm9kZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IG11dGF0aW9ucy5sZW5ndGg7IG0rKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG11dGF0aW9uID0gbXV0YXRpb25zW21dO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZihub2RlKSA+IC0xO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKG5vZGUpKTtcbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7c3VidHJlZTogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE5lc3RlZFByb3Aob2JqLCBwYXRoKSB7XG4gICAgICAgIHJldHVybiBwYXRoLnNwbGl0KC9cXHM/XFwuXFxzPy8pLnJlZHVjZShmdW5jdGlvbihvYmosIHByb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqW3Byb3BdO1xuICAgICAgICB9LCBvYmopO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgc2hvd3MgYSB0b2FzdCBzaW1pbGFyIHRvIGFuZHJvaWQgdG93YXJkcyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCBUaGUgc3RyaW5nIHRvIHNob3cgaW4gdGhlIHRvYXN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LiBPcHRpb25hbCBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudHlwZSBDaGFuZ2VzIHRoZSB0eXBlIG9mIHRoZSB0b2FzdCBzdHlsaXN0aWNhbGx5IGFuZCBzZW1hbnRpY2FsbHkuIENob2ljZXM6IFwiXCIsIFwiaW5mb1wiLCBcInN1Y2Nlc3NcIiwgXCJkYW5nZXJcIi9cImVycm9yXCIsIFwid2FybmluZ1wiL1wid2FyblwiLiBEZWZhdWx0OiBcIlwiXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLmljb24gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBpY29uIHNob3VsZCBzaG93IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUuIEEgdG9hc3Qgd2l0aG91dCB0eXBlIHdpbGwgYWx3YXlzIGhhdmUgbm8gaWNvbi4gRGVmYXVsdDogdHJ1ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnRpbWVvdXQgQWRqdXN0cyB0aGUgdGltZSAoaW4gbXMpIHRoZSB0b2FzdCBzaG91bGQgYmUgc2hvd24gZm9yIGJlZm9yZSBkaXNhcHBlYXJpbmcgYXV0b21hdGljYWxseS4gRGVmYXVsdDogMzAwMFxuICAgICAqL1xuICAgIHN0YXRpYyBzaG93VG9hc3QoY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iZC10b2FzdHNcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrcmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuc2lkZWJhciAmJiBlLmhhc05vdGljZSlbMF0uc2lkZWJhcikrXCIgKyBkaXZcIikgfHwgbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBjb250YWluZXIgPyBjb250YWluZXIucXVlcnlTZWxlY3RvcihcImZvcm1cIikgOiBudWxsO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gZm9ybSA/IGZvcm0ub2Zmc2V0SGVpZ2h0IDogODA7XG4gICAgICAgICAgICBjb25zdCB0b2FzdFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJiZC10b2FzdHNcIik7XG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJib3R0b21cIiwgYm90dG9tK1wicHhcIik7XG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKS5hcHBlbmRDaGlsZCh0b2FzdFdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvYXN0V3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpXG4gICAgICAgIGNvbnN0IHt0eXBlID0gXCJcIiwgaWNvbiA9IHRydWUsIHRpbWVvdXQgPSAzMDAwfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHRvYXN0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiYmQtdG9hc3RcIik7XG4gICAgICAgIGlmICh0eXBlKSB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcInRvYXN0LVwiICsgdHlwZSk7XG4gICAgICAgIGlmICh0eXBlICYmIGljb24pIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiaWNvblwiKTtcbiAgICAgICAgdG9hc3RFbGVtLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgIHRvYXN0V3JhcHBlci5hcHBlbmRDaGlsZCh0b2FzdEVsZW0pO1xuICAgICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIGBjYWxjKDUwJSAtICR7dG9hc3RXcmFwcGVyLm9mZnNldFdpZHRoIC8gMn1weClgKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImNsb3NpbmdcIik7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0b2FzdEVsZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmJkLXRvYXN0cyAuYmQtdG9hc3RcIikubGVuZ3RoKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH1cblxuICAgIHN0YXRpYyBhbGVydCh0aXRsZSwgY29udGVudCkge1xuICAgICAgICBsZXQgbW9kYWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tb2RhbCAmJiBlLmlubmVyICYmICFlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXG4gICAgICAgIGxldCBoZWFkZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5oaWRlT25GdWxsc2NyZWVuKVswXVxuICAgICAgICBsZXQgZm9vdGVyMk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmZvY3VzTG9jaylbMF1cbiAgICAgICAgY29uc3QgbW9kYWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImJkLW1vZGFsLXdyYXBwZXIgdGhlbWUtZGFya1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLWJhY2tkcm9wICR7QkRNb2R1bGVzLmdldChlID0+IGUuYmFja2Ryb3AgJiYgZS5iYWNrZHJvcFdpdGhMYXllcilbMF0uYmFja2Ryb3B9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwgJHttb2RhbE1vZHVsZS5tb2RhbH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtaW5uZXIgJHttb2RhbE1vZHVsZS5pbm5lcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciAke2hlYWRlck1vZHVsZS5oZWFkZXJ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4ke3RpdGxlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlci13cmFwIGZhZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjb250ZW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyICR7aGVhZGVyTW9kdWxlLmZvb3Rlcn0gJHtmb290ZXIyTW9kdWxlLmZvb3Rlcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiPk9rYXk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7XG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuZm9vdGVyIGJ1dHRvblwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgXG4gICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuYmQtYmFja2Ryb3BcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxuICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcbiAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLmFwcGVuZChtb2RhbCk7XG4gICAgICAgIGNvbnN0IGNsb3NpbmdMaXN0ZW5lcnMgPSBbXVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgXG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcbiAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNsb3NlOiAobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IHBsdWdpbkVycm9ycyA9IFtdLCB0aGVtZXM6IHRoZW1lRXJyb3JzID0gW119KSB7XG4gICAgICAgIGlmICghcGx1Z2luRXJyb3JzIHx8ICF0aGVtZUVycm9ycykgcmV0dXJuO1xuICAgICAgICBpZiAoIXBsdWdpbkVycm9ycy5sZW5ndGggJiYgIXRoZW1lRXJyb3JzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgbW9kYWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tb2RhbCAmJiBlLmlubmVyICYmICFlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXG4gICAgICAgIGxldCBoZWFkZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5oaWRlT25GdWxsc2NyZWVuKVswXVxuICAgICAgICBsZXQgZm9vdGVyMk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmZvY3VzTG9jaylbMF1cbiAgICAgICAgY29uc3QgbW9kYWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImJkLW1vZGFsLXdyYXBwZXIgdGhlbWUtZGFya1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLWJhY2tkcm9wICR7QkRNb2R1bGVzLmdldChlID0+IGUuYmFja2Ryb3AgJiYgZS5iYWNrZHJvcFdpdGhMYXllcilbMF0uYmFja2Ryb3B9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwgYmQtY29udGVudC1tb2RhbCAke21vZGFsTW9kdWxlLm1vZGFsfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj48ZGl2IGNsYXNzPVwidGl0bGVcIj5Db250ZW50IEVycm9yczwvZGl2PjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXIgVE9QXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWl0ZW1cIj5QbHVnaW5zPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWl0ZW1cIj5UaGVtZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW5hbWVcIj5OYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbWVzc2FnZVwiPk1lc3NhZ2U8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1lcnJvclwiPkVycm9yPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlci13cmFwIGZhZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXJcIj5cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlciAke2hlYWRlck1vZHVsZS5mb290ZXJ9ICR7Zm9vdGVyMk1vZHVsZS5mb290ZXJ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIj5Pa2F5PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xuICAgIFxuICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVRhYihlcnJvcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiZXJyb3JzXCI+YCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVyciBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiZXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW5hbWVcIj4ke2Vyci5uYW1lID8gZXJyLm5hbWUgOiBlcnIuZmlsZX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW1lc3NhZ2VcIj4ke2Vyci5tZXNzYWdlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tZXJyb3JcIj48YSBjbGFzcz1cImVycm9yLWxpbmtcIiBocmVmPVwiXCI+JHtlcnIuZXJyb3IgPyBlcnIuZXJyb3IubWVzc2FnZSA6IFwiXCJ9PC9hPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kKGVycm9yKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnF1ZXJ5U2VsZWN0b3JBbGwoXCJhXCIpLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgRXJyb3IgZGV0YWlscyBmb3IgJHtlcnIubmFtZSA/IGVyci5uYW1lIDogZXJyLmZpbGV9LmAsIGVyci5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIGNvbnN0IHRhYnMgPSBbZ2VuZXJhdGVUYWIocGx1Z2luRXJyb3JzKSwgZ2VuZXJhdGVUYWIodGhlbWVFcnJvcnMpXTtcbiAgICBcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbChcIi50YWItYmFyLWl0ZW1cIikuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gbW9kYWwucXVlcnlTZWxlY3RvcihcIi50YWItYmFyLWl0ZW0uc2VsZWN0ZWRcIik7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIERPTS5yZW1vdmVDbGFzcyhzZWxlY3RlZCwgXCJzZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhlLnRhcmdldCwgXCJzZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyID0gbW9kYWwucXVlcnlTZWxlY3RvcihcIi5zY3JvbGxlclwiKTtcbiAgICAgICAgICAgIHNjcm9sbGVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQodGFic1tET00uaW5kZXgoZS50YXJnZXQpXSk7XG4gICAgICAgIH0pKTtcbiAgICBcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5mb290ZXIgYnV0dG9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBtb2RhbC5yZW1vdmUoKTsgfSwgMzAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuYmQtYmFja2Ryb3BcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IG1vZGFsLnJlbW92ZSgpOyB9LCAzMDApO1xuICAgICAgICB9KTtcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKS5hcHBlbmQobW9kYWwpO1xuICAgICAgICBpZiAocGx1Z2luRXJyb3JzLmxlbmd0aCkgbW9kYWwucXVlcnlTZWxlY3RvcihcIi50YWItYmFyLWl0ZW1cIikuY2xpY2soKTtcbiAgICAgICAgZWxzZSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKFwiLnRhYi1iYXItaXRlbVwiKVsxXS5jbGljaygpO1xuICAgIH1cblxuICAgIHN0YXRpYyBzaG93Q2hhbmdlbG9nTW9kYWwob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IE1vZGFsU3RhY2sgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInB1c2hcIiwgXCJ1cGRhdGVcIiwgXCJwb3BcIiwgXCJwb3BXaXRoS2V5XCIpO1xuICAgICAgICBjb25zdCBDaGFuZ2Vsb2dDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJmaXhlZFwiLCBcImltcHJvdmVkXCIpO1xuICAgICAgICBjb25zdCBUZXh0RWxlbWVudCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVGV4dFwiKTtcbiAgICAgICAgY29uc3QgRmxleENoaWxkID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJDaGlsZFwiKTtcbiAgICAgICAgY29uc3QgVGl0bGVzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJUYWdzXCIsIFwiZGVmYXVsdFwiKTtcbiAgICAgICAgY29uc3QgQ2hhbmdlbG9nID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdFByb3BzICYmIG0uZGVmYXVsdFByb3BzLnNlbGVjdGFibGUgPT0gZmFsc2UpO1xuICAgICAgICBjb25zdCBNYXJrZG93blBhcnNlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZGVmYXVsdFJ1bGVzXCIsIFwicGFyc2VcIik7XG4gICAgICAgIGlmICghQ2hhbmdlbG9nIHx8ICFNb2RhbFN0YWNrIHx8ICFDaGFuZ2Vsb2dDbGFzc2VzIHx8ICFUZXh0RWxlbWVudCB8fCAhRmxleENoaWxkIHx8ICFUaXRsZXMgfHwgIU1hcmtkb3duUGFyc2VyKSByZXR1cm47XG4gICAgXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGltYWdlID0gXCJodHRwczovL3JlcG9zaXRvcnktaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS8xMDU0NzM1MzcvOTU3YjU0ODAtN2MyNi0xMWU5LTg0MDEtNTBmYTgyMGNiYWU1XCIsIFxuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiLCBcbiAgICAgICAgICAgIGNoYW5nZXMgPSBbXSwgXG4gICAgICAgICAgICB0aXRsZSA9IFwiQmFuZGFnZWRCRFwiLCBcbiAgICAgICAgICAgIHN1YnRpdGxlID0gYHYke2JiZFZlcnNpb259YCwgXG4gICAgICAgICAgICBmb290ZXJcbiAgICAgICAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGNlID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50O1xuICAgICAgICBjb25zdCBjaGFuZ2Vsb2dJdGVtcyA9IFtjZShcImltZ1wiLCB7c3JjOiBpbWFnZX0pXTtcbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGNlKFwicFwiLCBudWxsLCBNYXJrZG93blBhcnNlci5wYXJzZShkZXNjcmlwdGlvbikpKTtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFuZ2VzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGNoYW5nZXNbY107XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gQ2hhbmdlbG9nQ2xhc3Nlc1tlbnRyeS50eXBlXSA/IENoYW5nZWxvZ0NsYXNzZXNbZW50cnkudHlwZV0gOiBDaGFuZ2Vsb2dDbGFzc2VzLmFkZGVkO1xuICAgICAgICAgICAgY29uc3QgbWFyZ2luID0gYyA9PSAwID8gQ2hhbmdlbG9nQ2xhc3Nlcy5tYXJnaW5Ub3AgOiBcIlwiO1xuICAgICAgICAgICAgY2hhbmdlbG9nSXRlbXMucHVzaChjZShcImgxXCIsIHtjbGFzc05hbWU6IGAke3R5cGV9ICR7bWFyZ2lufWAsfSwgZW50cnkudGl0bGUpKTtcbiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBjZShcInVsXCIsIG51bGwsIGVudHJ5Lml0ZW1zLm1hcChpID0+IGNlKFwibGlcIiwgbnVsbCwgTWFya2Rvd25QYXJzZXIucGFyc2UoaSkpKSk7XG4gICAgICAgICAgICBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGxpc3QpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbmRlckhlYWRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGNlKEZsZXhDaGlsZC5DaGlsZCwge2dyb3c6IDEsIHNocmluazogMX0sXG4gICAgICAgICAgICAgICAgY2UoVGl0bGVzLmRlZmF1bHQsIHt0YWc6IFRpdGxlcy5UYWdzLkg0fSwgdGl0bGUpLFxuICAgICAgICAgICAgICAgIGNlKFRleHRFbGVtZW50LHtzaXplOiBUZXh0RWxlbWVudC5TaXplcy5TTUFMTCwgY29sb3I6IFRleHRFbGVtZW50LkNvbG9ycy5TVEFOREFSRCwgY2xhc3NOYW1lOiBDaGFuZ2Vsb2dDbGFzc2VzLmRhdGV9LCBzdWJ0aXRsZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgXG4gICAgICAgIGNvbnN0IHJlbmRlckZvb3RlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xuICAgICAgICAgICAgY29uc3QgQW5jaG9yQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiKSB8fCB7YW5jaG9yOiBcImFuY2hvci0zWi04QmJcIiwgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwifTtcbiAgICAgICAgICAgIGNvbnN0IGpvaW5TdXBwb3J0U2VydmVyID0gKGNsaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpY2sucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBjbGljay5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBNb2RhbFN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIEJEVjIuam9pbkJEMigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHN1cHBvcnRMaW5rID0gQW5jaG9yID8gY2UoQW5jaG9yLCB7b25DbGljazogam9pblN1cHBvcnRTZXJ2ZXJ9LCBcIkpvaW4gb3VyIERpc2NvcmQgU2VydmVyLlwiKSA6IGNlKFwiYVwiLCB7Y2xhc3NOYW1lOiBgJHtBbmNob3JDbGFzc2VzLmFuY2hvcn0gJHtBbmNob3JDbGFzc2VzLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YCwgb25DbGljazogam9pblN1cHBvcnRTZXJ2ZXJ9LCBcIkpvaW4gb3VyIERpc2NvcmQgU2VydmVyLlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGb290ZXIgPSBjZShUZXh0RWxlbWVudCx7c2l6ZTogVGV4dEVsZW1lbnQuU2l6ZXMuU01BTEwsIGNvbG9yOiBUZXh0RWxlbWVudC5Db2xvcnMuU1RBTkRBUkR9LCBcIk5lZWQgc3VwcG9ydD8gXCIsIHN1cHBvcnRMaW5rKTtcbiAgICAgICAgICAgIHJldHVybiBjZShGbGV4Q2hpbGQuQ2hpbGQsIHtncm93OiAxLCBzaHJpbms6IDF9LCBmb290ZXIgPyBmb290ZXIgOiBkZWZhdWx0Rm9vdGVyKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gTW9kYWxTdGFjay5wdXNoKGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gY2UoQ2hhbmdlbG9nLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IENoYW5nZWxvZ0NsYXNzZXMuY29udGFpbmVyLFxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgb25TY3JvbGw6IF8gPT4gXyxcbiAgICAgICAgICAgICAgICBvbkNsb3NlOiBfID0+IF8sXG4gICAgICAgICAgICAgICAgcmVuZGVySGVhZGVyOiByZW5kZXJIZWFkZXIsXG4gICAgICAgICAgICAgICAgcmVuZGVyRm9vdGVyOiByZW5kZXJGb290ZXIsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGNoYW5nZWxvZ0l0ZW1zXG4gICAgICAgICAgICB9LCBwcm9wcykpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIGNvbmZpcm1hdGlvbiBtb2RhbCB3aXRoIG9wdGlvbmFsIGNvbmZpcm0gYW5kIGNhbmNlbCBjYWxsYmFja3MuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFJlYWN0RWxlbWVudHxBcnJheTxzdHJpbmd8UmVhY3RFbGVtZW50Pil9IGNoaWxkcmVuIC0gYSBzaW5nbGUgb3IgbWl4ZWQgYXJyYXkgb2YgcmVhY3QgZWxlbWVudHMgYW5kIHN0cmluZ3MuIEV2ZXJ5IHN0cmluZyBpcyB3cmFwcGVkIGluIERpc2NvcmQncyBgTWFya2Rvd25gIGNvbXBvbmVudCBzbyBzdHJpbmdzIHdpbGwgc2hvdyBhbmQgcmVuZGVyIHByb3Blcmx5LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBvcHRpb25zIHRvIG1vZGlmeSB0aGUgbW9kYWxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRhbmdlcj1mYWxzZV0gLSB3aGV0aGVyIHRoZSBtYWluIGJ1dHRvbiBzaG91bGQgYmUgcmVkIG9yIG5vdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb25maXJtVGV4dD1Pa2F5XSAtIHRleHQgZm9yIHRoZSBjb25maXJtYXRpb24vc3VibWl0IGJ1dHRvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jYW5jZWxUZXh0PUNhbmNlbF0gLSB0ZXh0IGZvciB0aGUgY2FuY2VsIGJ1dHRvblxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ29uZmlybT1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIHN1Ym1pdCBidXR0b25cbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNhbmNlbD1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIGNhbmNlbCBidXR0b25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2V5XSAtIGtleSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RhbC4gSWYgbm90IHByb3ZpZGVkLCBvbmUgaXMgZ2VuZXJhdGVkIGFuZCByZXR1cm5lZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGtleSB1c2VkIGZvciB0aGlzIG1vZGFsXG4gICAgICovXG4gICAgc3RhdGljIHNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IE1vZGFsQWN0aW9ucyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwib3Blbk1vZGFsXCIsIFwidXBkYXRlTW9kYWxcIik7XG4gICAgICAgIGNvbnN0IE1hcmtkb3duID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNYXJrZG93blwiKTtcbiAgICAgICAgY29uc3QgQ29uZmlybWF0aW9uTW9kYWwgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkNvbmZpcm1Nb2RhbFwiKTtcbiAgICAgICAgaWYgKCFNb2RhbEFjdGlvbnMgfHwgIUNvbmZpcm1hdGlvbk1vZGFsIHx8ICFNYXJrZG93bikgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcblxuICAgICAgICBjb25zdCBlbXB0eUZ1bmN0aW9uID0gKCkgPT4ge307XG4gICAgICAgIGNvbnN0IHtvbkNvbmZpcm0gPSBlbXB0eUZ1bmN0aW9uLCBvbkNhbmNlbCA9IGVtcHR5RnVuY3Rpb24sIGNvbmZpcm1UZXh0ID0gXCJPa2F5XCIsIGNhbmNlbFRleHQgPSBcIkNhbmNlbFwiLCBkYW5nZXIgPSBmYWxzZSwga2V5ID0gdW5kZWZpbmVkfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSBjb250ZW50ID0gW2NvbnRlbnRdO1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5tYXAoYyA9PiB0eXBlb2YoYykgPT09IFwic3RyaW5nXCIgPyBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFya2Rvd24sIG51bGwsIGMpIDogYyk7XG4gICAgICAgIHJldHVybiBNb2RhbEFjdGlvbnMub3Blbk1vZGFsKHByb3BzID0+IHtcbiAgICAgICAgICAgIHJldHVybiBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29uZmlybWF0aW9uTW9kYWwsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIGhlYWRlcjogdGl0bGUsXG4gICAgICAgICAgICAgICAgcmVkOiBkYW5nZXIsXG4gICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IGNvbmZpcm1UZXh0LFxuICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6IGNhbmNlbFRleHQsXG4gICAgICAgICAgICAgICAgb25Db25maXJtOiBvbkNvbmZpcm0sXG4gICAgICAgICAgICAgICAgb25DYW5jZWw6IG9uQ2FuY2VsXG4gICAgICAgICAgICB9LCBwcm9wcyksIGNvbnRlbnQpO1xuICAgICAgICB9LCB7bW9kYWxLZXk6IGtleX0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgcmVtb3ZlRGEoKXtcbiAgICAgICAgcmV0dXJuIHJlbW92ZURhXG4gICAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVEYShjbGFzc05hbWUpe1xuICAgIGlmKCFjbGFzc05hbWUpcmV0dXJuIGNsYXNzTmFtZVxuICAgIHJldHVybiBjbGFzc05hbWUuc3BsaXQoXCIgXCIpLmZpbHRlcihlID0+ICFlLnN0YXJ0c1dpdGgoXCJkYS1cIikpLmpvaW4oXCIgXCIpXG59XG5cblV0aWxzLnNob3dUb2FzdCA9IFV0aWxzLnN1cHByZXNzRXJyb3JzKFV0aWxzLnNob3dUb2FzdCwgXCJDb3VsZCBub3Qgc2hvdyB0b2FzdC5cIik7XG5cbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5VdGlscyA9IFV0aWxzIiwiaW1wb3J0IHtzZXR0aW5nc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmVkaXRvckRldGFjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5XZWJwYWNrTW9kdWxlcyA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSByZXEubS5fX2V4dHJhX2lkX187XHJcbiAgICAgICAgICAgIGRlbGV0ZSByZXEuYy5fX2V4dHJhX2lkX187XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzaG91bGRQcm90ZWN0ID0gdGhlTW9kdWxlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGVNb2R1bGUucmVtb3ZlICYmIHRoZU1vZHVsZS5zZXQgJiYgdGhlTW9kdWxlLmNsZWFyICYmIHRoZU1vZHVsZS5nZXQgJiYgIXRoZU1vZHVsZS5zb3J0KSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGVNb2R1bGUuZ2V0VG9rZW4gfHwgdGhlTW9kdWxlLmdldEVtYWlsIHx8IHRoZU1vZHVsZS5zaG93VG9rZW4pIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcHJvdGVjdCA9ICh0aGVNb2R1bGUsIGlzRGVmYXVsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1vZCA9ICFpc0RlZmF1bHQgPyB0aGVNb2R1bGUuZGVmYXVsdCA6IHRoZU1vZHVsZVxyXG4gICAgICAgICAgICAgICAgaWYoIW1vZClyZXR1cm4gdGhlTW9kdWxlXHJcbiAgICAgICAgICAgICAgICBpZiAobW9kLnJlbW92ZSAmJiBtb2Quc2V0ICYmIG1vZC5jbGVhciAmJiBtb2QuZ2V0ICYmICFtb2Quc29ydCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1vZC5nZXRUb2tlbiAmJiAhbW9kLmdldEVtYWlsICYmICFtb2Quc2hvd1Rva2VuKXJldHVybiB0aGVNb2R1bGVcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShtb2QsIHtcclxuICAgICAgICAgICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJnZXRUb2tlblwiIHx8IHByb3AgPT09IFwiZ2V0RW1haWxcIiB8fCBwcm9wID09PSBcInNob3dUb2tlblwiKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbihvYmosIGZ1bmMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJnZXRUb2tlblwiICYmIG9iai5nZXRUb2tlbikgcmV0dXJuICgpID0+IFwibWZhLlhDbmJLem8wQ0xJcWRKekJuTDBEOFBmRHJ1cWtKTkhqd0hYdHIzOVVVM0Y4aEh4NDNqb2pJU3lpNWpkak81MmU5X2U5TWptYWZaRkZwYy1zZU9NYVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcImdldEVtYWlsXCIgJiYgb2JqLmdldEVtYWlsKSByZXR1cm4gKCkgPT4gXCJwdXBwZXQxMTExMkBnbWFpbC5jb21cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJzaG93VG9rZW5cIiAmJiBvYmouc2hvd1Rva2VuKSByZXR1cm4gKCkgPT4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJfX3Byb3RvX19cIiAmJiBvYmouX19wcm90b19fKSByZXR1cm4gcHJveHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqW2Z1bmNdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKCFpc0RlZmF1bHQpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGVNb2R1bGUsIHtkZWZhdWx0OiBwcm94eX0pXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5O1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmluZCA9IChmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gcmVxLmNbaV0uZXhwb3J0cztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgcmV0dXJuIHByb3RlY3QobS5kZWZhdWx0LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgZmlsdGVyKG0pKVx0cmV0dXJuIHByb3RlY3QobSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIGxvYWRlZCBtb2R1bGUgaW4gY2FjaGVcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVzID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIG1vZHVsZXMucHVzaChwcm90ZWN0KG0uZGVmYXVsdCwgdHJ1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKHByb3RlY3QobSwgZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlcztcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeVVuaXF1ZVByb3BlcnRpZXMgPSAocHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5kQnlQcm90b3R5cGVzID0gKHByb3RvTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5wcm90b3R5cGUgJiYgcHJvdG9OYW1lcy5ldmVyeShwcm90b1Byb3AgPT4gbW9kdWxlLnByb3RvdHlwZVtwcm90b1Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuICAgICAgICAgICAgY29uc3QgZmluZEJ5RGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWUpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5kaXNwbGF5TmFtZSA9PT0gZGlzcGxheU5hbWUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtmaW5kLCBmaW5kQWxsLCBmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzLCBmaW5kQnlQcm90b3R5cGVzLCBmaW5kQnlEaXNwbGF5TmFtZX07XHJcbiAgICAgICAgfSkoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbCA9IHtcclxuICAgICAgICAgICAgcmVhY3Q6IHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJDb21wb25lbnRcIiwgXCJQdXJlQ29tcG9uZW50XCIsIFwiQ2hpbGRyZW5cIiwgXCJjcmVhdGVFbGVtZW50XCIsIFwiY2xvbmVFbGVtZW50XCJdKSxcclxuICAgICAgICAgICAgcmVhY3REb206IHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJmaW5kRE9NTm9kZVwiXSlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZ2V0SW50ZXJuYWxJbnN0YW5jZSA9IGUgPT4gZVtPYmplY3Qua2V5cyhlKS5maW5kKGsgPT4gay5zdGFydHNXaXRoKFwiX19yZWFjdEludGVybmFsSW5zdGFuY2VcIikpXTtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVjIgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgam9pbkJEMSgpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcIjBUbWZvNVpiT1JDUnFiQWRcIik7fVxyXG4gICAgbGVhdmVCRDEoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIpO31cclxuXHJcbiAgICBqb2luQkQyKCkge3RoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKFwiMkhTY204alwiKTt9XHJcbiAgICBsZWF2ZUJEMigpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiMjgwODA2NDcyOTI4MTk4NjU2XCIpO31cclxuXHJcbiAgICBqb2luTEMoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCI3ZUZmZjJBXCIpO31cclxuICAgIGxlYXZlTEMoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjcwNTkwODM1MDIxODY2NjExN1wiKTt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3QoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3Q7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhY3QoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3Q7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0LWRvbVwiKX1cclxuICAgICAqL1xyXG4gICAgZ2V0IHJlYWN0RG9tKCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0RG9tO31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdC1kb21cIil9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdERvbSgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdERvbTt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3RDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3QuQ29tcG9uZW50O31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdC5Db21wb25lbnR9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdC5Db21wb25lbnQ7fVxyXG5cclxuICAgIGdldCBhbmNob3JDbGFzc2VzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiXSkgfHwge2FuY2hvcjogXCJhbmNob3ItM1otOEJiXCIsIGFuY2hvclVuZGVybGluZU9uSG92ZXI6IFwiYW5jaG9yVW5kZXJsaW5lT25Ib3Zlci0yRVNIUUJcIn07fVxyXG4gICAgZ2V0IHNsYXRlRWRpdG9yQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNsYXRlVGV4dEFyZWFcIl0pO31cclxuICAgIGdldCBtZXNzYWdlQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIm1lc3NhZ2VcIiwgXCJjb250YWluZXJDb3p5XCJdKTt9XHJcbiAgICBnZXQgZ3VpbGRDbGFzc2VzKCkge1xyXG5cdFx0Y29uc3QgZ3VpbGRzV3JhcHBlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLndyYXBwZXIgJiYgZS51bnJlYWRNZW50aW9uc0JhcilbMF07XHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZ3VpbGRzRXJyb3IgJiYgZS5zZWxlY3RlZClbMF1cclxuICAgICAgICBjb25zdCBwaWxsID0gQkRNb2R1bGVzLmdldChlID0+IGUuYmxvYkNvbnRhaW5lcilbMF1cclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcclxuXHR9XHJcblxyXG4gICAgZ2V0IE1lc3NhZ2VDb250ZW50Q29tcG9uZW50KCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShcImRpc2FibGVCdXR0b25zXCIpKTt9XHJcbiAgICBnZXQgTWVzc2FnZUNvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmIG0uZGVmYXVsdC5kaXNwbGF5TmFtZSAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgPT0gXCJNZXNzYWdlXCIpO31cclxuICAgIGdldCBUaW1lRm9ybWF0dGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZGF0ZUZvcm1hdFwiXSk7fVxyXG4gICAgZ2V0IFRvb2x0aXBXcmFwcGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVG9vbHRpcFwiKTt9XHJcbiAgICBnZXQgTmF0aXZlTW9kdWxlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2V0QmFkZ2VcIl0pO31cclxuICAgIGdldCBJbnZpdGVBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYWNjZXB0SW52aXRlXCJdKTt9XHJcbiAgICBnZXQgR3VpbGRBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wibGVhdmVHdWlsZFwiXSk7fVxyXG4gICAgZ2V0IFRvb2x0aXBzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmhpZGUgJiYgbS5zaG93ICYmICFtLnNlYXJjaCAmJiAhbS5zdWJtaXQgJiYgIW0uc2VhcmNoICYmICFtLmFjdGl2YXRlUmFnaW5nRGVtb24gJiYgIW0uZGlzbWlzcyk7fVxyXG4gICAgZ2V0IEtleUdlbmVyYXRvcigpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS50b1N0cmluZyAmJiAvXCJiaW5hcnlcIi8udGVzdChtLnRvU3RyaW5nKCkpKTt9XHJcbiAgICBnZXQgTGF5ZXJTdGFjaygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInBvcExheWVyXCJdKTt9XHJcbiAgICBnZXQgVXNlclN0b3JlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0Q3VycmVudFVzZXJcIl0pO31cclxuICAgIGdldCBDaGFubmVsU3RvcmUoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRDaGFubmVsXCJdKTt9XHJcbiAgICBnZXQgQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJvcGVuUHJpdmF0ZUNoYW5uZWxcIl0pO31cclxuICAgIGdldCBQcml2YXRlQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJzZWxlY3RQcml2YXRlQ2hhbm5lbFwiXSk7fVxyXG5cclxuICAgIG9wZW5ETSh1c2VySWQpIHtcclxuICAgICAgICBjb25zdCBzZWxmSWQgPSB0aGlzLlVzZXJTdG9yZS5nZXRDdXJyZW50VXNlcigpLmlkO1xyXG4gICAgICAgIGlmIChzZWxmSWQgPT0gdXNlcklkKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgcHJpdmF0ZUNoYW5uZWxJZCA9IHRoaXMuQ2hhbm5lbFN0b3JlLmdldERNRnJvbVVzZXJJZCh1c2VySWQpO1xyXG4gICAgICAgIGlmIChwcml2YXRlQ2hhbm5lbElkKSByZXR1cm4gdGhpcy5Qcml2YXRlQ2hhbm5lbEFjdGlvbnMuc2VsZWN0UHJpdmF0ZUNoYW5uZWwocHJpdmF0ZUNoYW5uZWxJZCk7XHJcbiAgICAgICAgdGhpcy5DaGFubmVsQWN0aW9ucy5vcGVuUHJpdmF0ZUNoYW5uZWwoc2VsZklkLCB1c2VySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlU2V0dGluZ3MoY2F0KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSBzZXR0aW5nc1trZXldO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5jYXQgPT09IGNhdCAmJiBzZXR0aW5nLmltcGxlbWVudGVkICYmICFzZXR0aW5nLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2V0dGluZyk7XHJcbiAgICAgICAgICAgIH0gcmV0dXJuIGFycjtcclxuICAgICAgICB9LCBbXSk7XHJcbiAgICB9XHJcblxyXG59OyIsImltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcblxuY29uc3Qgc3R5bGUgPSBgXG4gICAgLmNvbnRhaW5lci0yUmwwMXUge1xuICAgICAgICBkaXNwbGF5OiBub25lIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAuY2hhdC0zYlJ4eHUge1xuICAgICAgICBkaXNwbGF5OiBub25lIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAuc2lkZWJhci0ySzhwRmgge1xuICAgICAgICBmbGV4LWdyb3c6IDEhaW1wb3J0YW50O1xuICAgIH1cbmA7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWb2ljZU1vZGUge1xuICAgIHN0YXJ0KCkge1xuICAgICAgICBET00uYWRkU3R5bGUoXCJWb2ljZU1vZGVcIiwgc3R5bGUpO1xuICAgIH1cblxuICAgIHN0b3AoKSB7XG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcIlZvaWNlTW9kZVwiKTtcbiAgICB9XG59OyIsImNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XG5kZWxldGUgcmVxLm0uX19leHRyYV9pZF9fO1xuZGVsZXRlIHJlcS5jLl9fZXh0cmFfaWRfXztcbmNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XG4gICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XG4gICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XG4gICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSByZXR1cm4gbS5kZWZhdWx0O1xuICAgICAgICAgICAgaWYgKG0gJiYgZmlsdGVyKG0pKVx0cmV0dXJuIG07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS53YXJuKFwiQ2Fubm90IGZpbmQgbG9hZGVkIG1vZHVsZSBpbiBjYWNoZVwiKTtcbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xuICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgbW9kdWxlcy5wdXNoKG0uZGVmYXVsdCk7XG4gICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKG0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtb2R1bGVzO1xufTtcblxuY29uc3QgZmluZEJ5UHJvcHMgPSAoLi4ucHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xuY29uc3QgZmluZEJ5UHJvdG90eXBlcyA9ICguLi5wcm90b05hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUucHJvdG90eXBlICYmIHByb3RvTmFtZXMuZXZlcnkocHJvdG9Qcm9wID0+IG1vZHVsZS5wcm90b3R5cGVbcHJvdG9Qcm9wXSAhPT0gdW5kZWZpbmVkKSk7XG5jb25zdCBmaW5kQnlEaXNwbGF5TmFtZSA9IChkaXNwbGF5TmFtZSkgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLmRpc3BsYXlOYW1lID09PSBkaXNwbGF5TmFtZSk7XG5cbmxldCBtb2QgPSAge2ZpbmQsIGZpbmRBbGwsIGZpbmRCeVByb3BzLCBmaW5kQnlQcm90b3R5cGVzLCBmaW5kQnlEaXNwbGF5TmFtZX07XG5leHBvcnQgZGVmYXVsdCBtb2Rcblxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLldlYnBhY2tNb2R1bGVzID0gbW9kIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHRjb3JkTG9nbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2OCAxNjguNjlcIiB7Li4ucHJvcHN9IGhlaWdodD1cIjEwMCVcIiB3aWR0aD17cHJvcHMuc2l6ZX0+XG4gICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInByZWZpeF9fYVwiIHgxPXs2Ni43fSB5MT17LTQ4Ny43fSB4Mj17NjYuN30geTI9ey01MDguNzN9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UzMDYxM1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2JcIiB4MT17MTAxLjd9IHkxPXstNDg3Ljd9IHgyPXsxMDEuN30geTI9ey01MDguNzN9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UyMDYxM1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2NcIiB4MT17ODR9IHkxPXstNDA4fSB4Mj17ODR9IHkyPXstNTc2LjY5fSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMzA2MTNcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXsxfSBzdG9wQ29sb3I9XCIjNzMxYTEzXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cbiAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIiNmZmZcIiBkPVwiTTE0LjkgMzUuM2gxMzkuMlYxMzNIMTQuOXpcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNjYuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19hKVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMDEuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19iKVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDB2MTY4bDE2OCAuNjlWMHptMTExLjMgMTI0LjFzLTMuNC00LjEtNi4zLTcuN2MxMi42LTMuNSAxNy40LTExLjMgMTcuNC0xMS4zYTUyLjUyIDUyLjUyIDAgMDEtMTEuMSA1LjYgNjguNjMgNjguNjMgMCAwMS0zOC45IDQgNzAuMTIgNzAuMTIgMCAwMS0xNC4xLTQuMSA0OC44OCA0OC44OCAwIDAxLTcuMS0zLjNjLS4zLS4yLS42LS4zLS45LS41YS43Ni43NiAwIDAwLS40LS4yYy0xLjctMS0yLjYtMS42LTIuNi0xLjZzNC42IDcuNiAxNi44IDExLjJjLTIuOSAzLjYtNi40IDcuOS02LjQgNy45LTIxLjItLjYtMjkuMy0xNC41LTI5LjMtMTQuNSAwLTMwLjYgMTMuOC01NS40IDEzLjgtNTUuNCAxMy44LTEwLjMgMjYuOS0xMCAyNi45LTEwbDEgMS4xQzUyLjggNTAuMyA0NSA1Ny45IDQ1IDU3LjlhNTYuMiA1Ni4yIDAgMDE1LjctMi43IDcyLjE5IDcyLjE5IDAgMDEyMS44LTYgOC43NSA4Ljc1IDAgMDExLjYtLjIgODkuMSA4OS4xIDAgMDExOS40LS4yIDc4LjQ1IDc4LjQ1IDAgMDEyOC45IDkuMXMtNy41LTcuMi0yMy45LTEyLjFsMS4zLTEuNXMxMy4xLS4zIDI2LjkgMTBjMCAwIDEzLjggMjQuOCAxMy44IDU1LjQuMS0uMS04IDEzLjgtMjkuMiAxNC40elwiIGZpbGw9XCJ1cmwoI3ByZWZpeF9fYylcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgIClcbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVnSHVudGVyQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpe1xuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDMxLjMgMjkuNVwiIHsuLi5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjggMXMxMiA4LjIgNy40IDE5LjdTMTYuNiAyOSAyMCAyNS42cy00LTUuNi04LjctMTBMMjIuOCAxXCIgZmlsbD1cInJnYmEoMjI3LDYsMTksLjYpXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjEgMTIuM2MtMi41IDMuMi02LjEgNC44LTguOSA0LjNMMy42IDI4LjhjLS43LjktMS45IDEtMi44LjMtLjktLjctMS0xLjktLjQtMi44TDEwIDE0LjFjLTEuMy0yLjUtLjYtNi40IDItOS43IDMuMi00IDgtNS41IDEwLjgtMy40czIuNCA3LjItLjcgMTEuM3pcIiBmaWxsPVwiI2UzMDYxM1wiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgKVxuICAgIH0gXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2lyY3VzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKXtcbiAgICAgICAgcmV0dXJuICg8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDM2IDM2XCIgIHsuLi50aGlzLnByb3BzLnN2Z30gaGVpZ2h0PVwiMTAwJVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjREQyRTQ0XCJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0zMyAzM2EyIDIgMCAwMS0yIDJINWEyIDIgMCAwMS0yLTJsMS0xMmgyOGwxIDEyelwiXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0VBNTk2RVwiXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTMgMzVjLS43OTItMS44NzUtMS43NS0zLjI5MS0zLjQxNy00LjY2NiAxLjc1LTEuNDU5IDQuNTQyLTUuNSA1LjI1LTguMjkyczIuNzUgOC4xMjUgMi4wNDIgMTAuNjI1UzEzIDM1IDEzIDM1em0xMC4zMDMgMGMuNzkxLTEuODc1IDEuNzUtMy4yOTEgMy40MTYtNC42NjYtMS43NS0xLjQ1OS00LjU0MS01LjUtNS4yNS04LjI5Mi0uNzA3LTIuNzkyLTIuNzUgOC4xMjUtMi4wNCAxMC42MjUuNzA4IDIuNSAzLjg3NCAyLjMzMyAzLjg3NCAyLjMzM3pcIlxuICAgICAgICAgICAgICAgID48L3BhdGg+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNCRTE5MzFcIlxuICAgICAgICAgICAgICAgICAgICBkPVwiTTMuNzI4IDI0LjI2M0EyLjUgMi41IDAgMDA4IDIyLjVjMC0uNTY1LS4xOTUtMS4wODEtLjUxMS0xLjVINGwtLjI3MiAzLjI2M3ptMjguNTQ0IDBMMzIgMjFoLTMuNDg5QTIuNDgyIDIuNDgyIDAgMDAyOCAyMi41YTIuNSAyLjUgMCAwMDQuMjcyIDEuNzYzelwiXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTRcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyMlwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjZcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjMgMzVIMTNzMi02IDItMTNoNmMwIDcgMiAxMyAyIDEzek0xNyAyaDJ2N2gtMnpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM1NUFDRUVcIlxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE4LjgzOC4yMDZDMTcuNjY3LjA0MiAxNyAuMzE4IDE3IDEuNDE4djFjMCAxLjEuODY1IDEuNzUzIDEuOTIzIDEuNDUxbDUuMTU0LS45MDFjMS43MTUtLjM0MyAxLjU0OC0xLjU5My4wODUtMS44ODRMMTguODM4LjIwNnpcIlxuICAgICAgICAgICAgICAgID48L3BhdGg+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNDQ0Q2RERcIlxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE4IDZsLS4wODEuMTIzQzEwLjkzOCAxNi45ODEgMyAxNS4wMTUgMyAxOXYyLjVhMi41IDIuNSAwIDAwNC45NS41SDEyYTIgMiAwIDAwNCAwaDRhMiAyIDAgMDA0IDBoNC4wNWEyLjUgMi41IDAgMDA0Ljk1LS41VjE5YzAtNC04LTItMTUtMTN6XCJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICAgICAgICAgIDxnIGZpbGw9XCIjRjVGOEZBXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuOTQ4IDYuMDc4bC0uMDMuMDQ1QzE3LjEzMiAxMS42MTkgMTAuODExIDE2LjEyNiA4IDE4djRhMiAyIDAgMDA0IDB2LTRjLjk4Mi0uOTgyIDUuODEzLTYuNzg3IDUuOTg0LTExLjczMi0uMDEtLjA2NC0uMDI3LS4xMjYtLjAzNi0uMTl6bS4wOC4zOThDMTguMzI0IDExLjM3NCAyMy4wMzEgMTcuMDMxIDI0IDE4djRhMiAyIDAgMDA0IDB2LTRjLTIuNzUtMS44MzMtOC45NTMtNi4xOS05Ljk3Mi0xMS41MjR6XCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3Ljk4NCA2LjI3QzE3LjkyMiA4LjM0NiAxNy42MDYgMTYuMzk0IDE2IDE4djRhMiAyIDAgMDA0IDB2LTRjLTEuNTY0LTEuNTY0LTEuOTA1LTkuMjQxLTEuOTc5LTExLjU1OS0uMDExLS4wNTctLjAyNy0uMTEzLS4wMzctLjE3MXpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgIClcbiAgICB9IFxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBWMkNfU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcblxyXG4vKipcclxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdFwiKX1cclxuICovXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmxldCBtYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXVxyXG5sZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxyXG5sZXQgc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cclxubGV0IHNjcm9sbGJhck1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXVxyXG5jb25zdCBHdWlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcylbMF0uZGVmYXVsdFxyXG5jb25zdCByZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRSZWxhdGlvbnNoaXBzKVswXS5kZWZhdWx0XHJcbmNvbnN0IHNlc3Npb25Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRTZXNzaW9ucylbMF0uZGVmYXVsdFxyXG5jb25zdCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19BY2NvdW50SW5mb3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGlmKCFtYXJnaW5Nb2R1bGUyKW1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdXHJcbiAgICAgICAgaWYoIWNvbG9yTW9kdWxlKWNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF1cclxuICAgICAgICBpZighc2l6ZU1vZHVsZSlzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXVxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiQWNjb3VudCBJbmZvc1wiLz4sXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIFByb2ZpbGVcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRQcm9maWxlVmFsdWUoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAgU3RhdGlzdGljc1xyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFN0YXRpc3RpY3MoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGVkIFNlc3Npb25zXHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0U2Vzc2lvblZhbHVlKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PixcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXS5tYXJnaW5Cb3R0b20yMH0+PC9kaXY+XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNlc3Npb25WYWx1ZSgpe1xyXG4gICAgICAgIGNvbnN0IHNlc3Npb25zUmF3ID0gc2Vzc2lvbk1vZHVsZS5nZXRTZXNzaW9ucygpXHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbnMgPSBPYmplY3Qua2V5cyhzZXNzaW9uc1JhdykuZmlsdGVyKGUgPT4gZSAhPT0gXCJhbGxcIikubWFwKGUgPT4gc2Vzc2lvbnNSYXdbZV0pXHJcblxyXG4gICAgICAgIGlmKHNlc3Npb25zLmxlbmd0aCA9PT0gMClyZXR1cm4gXCItIE5vIHNlc3Npb24gZGV0ZWN0ZWQuIFBsZWFzZSB0cnkgaW4gYSBmZXcgc2Vjb25kc1wiXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHNlc3Npb25zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGArIGlkOiAke2Uuc2Vzc2lvbklkfVxyXG4rIG9zOiAke2UuY2xpZW50SW5mby5vc1swXS50b1VwcGVyQ2FzZSgpK2UuY2xpZW50SW5mby5vcy5zbGljZSgxKX1cclxuKyBjbGllbnQ6ICR7ZS5jbGllbnRJbmZvLmNsaWVudH1cclxuKyBzdGF0dXM6ICR7ZS5zdGF0dXN9XHJcbisgQWN0aXZpdGllczogJHtlLmFjdGl2aXRpZXMubGVuZ3RofWBcclxuICAgICAgICB9KS5qb2luKFwiXFxuXCIrXCItXCIucmVwZWF0KDM4KStcIlxcblwiKVxyXG4gICAgfVxyXG5cclxuICAgIGdldFByb2ZpbGVWYWx1ZSgpe1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7RGF0ZX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSB1c2VyLmNyZWF0ZWRBdFxyXG5cclxuICAgICAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5hdmF0YXJVUkxcclxuICAgICAgICBpZih1c2VyLmF2YXRhciAmJiB1c2VyLmF2YXRhci5zdGFydHNXaXRoKFwiYV9cIikpe1xyXG4gICAgICAgICAgICBhdmF0YXJVUkwgPSB1c2VyLmdldEF2YXRhclVSTChcImdpZlwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoYXZhdGFyVVJMLnN0YXJ0c1dpdGgoXCIvXCIpKXtcclxuICAgICAgICAgICAgYXZhdGFyVVJMID0gXCJodHRwczovL2Rpc2NvcmQuY29tXCIrYXZhdGFyVVJMXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGF2YXRhclVSTC5lbmRzV2l0aChcIj9zaXplPTEyOFwiKSl7XHJcbiAgICAgICAgICAgIGF2YXRhclVSTCA9IGF2YXRhclVSTC5yZXBsYWNlKFwiP3NpemU9MTI4XCIsIFwiP3NpemU9NDA5NlwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGArIFVzZXJuYW1lOiAke3VzZXIudXNlcm5hbWV9XHJcbisgRGlzY3JpbWluYXRvcjogJHt1c2VyLmRpc2NyaW1pbmF0b3J9XHJcbisgVGFnOiAke3VzZXIudGFnfVxyXG4rIElEOiAke3VzZXIuaWR9XHJcbisgQXZhdGFyOiAke3VzZXIuYXZhdGFyfVxyXG4rIEF2YXRhciBVUkw6ICR7YXZhdGFyVVJMfVxyXG4rIENyZWF0aW9uIERhdGU6ICR7KGNyZWF0ZWRBdC5nZXREYXRlKCkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfS8keyhjcmVhdGVkQXQuZ2V0TW9udGgoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHsoY3JlYXRlZEF0LmdldEZ1bGxZZWFyKCkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfSAke2NyZWF0ZWRBdC5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfWggJHtjcmVhdGVkQXQuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfW1pbiAke2NyZWF0ZWRBdC5nZXRTZWNvbmRzKCl9c1xyXG4rIEZsYWdzOiAke3VzZXIuZmxhZ3N9XHJcbisgSGFzIE5pdHJvOiAke3VzZXIuaGFzUHJlbWl1bVN1YnNjcmlwdGlvbiA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbi0gRW1haWw6ICR7dXNlci5lbWFpbH1cclxuLSAyRkE6ICR7dXNlci5tZmFFbmFibGVkID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuLSBIYXMgQmVlbiBPbiBNb2JpbGU6ICR7dXNlci5tb2JpbGUgPyBcIlllc1wiIDogXCJOb1wifVxyXG4tIFBob25lOiAke3VzZXIucGhvbmUgfHwgXCJOb25lXCJ9XHJcbi0gVmVyaWZpZWQ6ICR7dXNlci52ZXJpZmllZH1cclxuLSBDYW4gU2VlIE5TRlcgQ2hhbm5lbHM6ICR7dXNlci5uc2Z3QWxsb3dlZH1gO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0YXRpc3RpY3MoKXtcclxuXHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gT2JqZWN0LnZhbHVlcyhHdWlsZE1vZHVsZS5nZXRHdWlsZHMoKSlcclxuICAgICAgICBjb25zdCByZWxhdGlvbnMgPSBPYmplY3Qua2V5cyhyZWxhdGlvblNoaXBNb2R1bGUuZ2V0UmVsYXRpb25zaGlwcygpKVxyXG4gICAgICAgIGNvbnN0IGZyaWVuZHMgPSByZWxhdGlvbnMuZmlsdGVyKGUgPT4gcmVsYXRpb25TaGlwTW9kdWxlLmlzRnJpZW5kKGUpKVxyXG4gICAgICAgIGNvbnN0IGJsb2NrZWQgPSByZWxhdGlvbnMuZmlsdGVyKGUgPT4gcmVsYXRpb25TaGlwTW9kdWxlLmlzQmxvY2tlZChlKSlcclxuXHJcbiAgICAgICAgcmV0dXJuIGArIFNlcnZlciBDb3VudDogJHtndWlsZHMubGVuZ3RofSBzZXJ2ZXJzXHJcbisgUmVsYXRpb25zOiAke3JlbGF0aW9ucy5sZW5ndGh9IHJlbGF0aW9uc1xyXG4rIEZyaWVuZHMgQ291bnQ6ICR7ZnJpZW5kcy5sZW5ndGh9IGZyaWVuZHNcclxuLSBCbG9ja2VkIFVzZXJzIENvdW50OiAke2Jsb2NrZWQubGVuZ3RofSBibG9ja2VkIHVzZXJzYFxyXG4gICAgfVxyXG59XHJcblxyXG5cclxubGV0IGhpZ2h0bGlnaHRKUyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhpZ2hsaWdodClbMF1cclxubGV0IG1lc3NhZ2VNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXVxyXG5sZXQgbWVzc2FnZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tZXNzYWdlQ29udGVudClbMF1cclxuXHJcbmNsYXNzIENvZGVDb250ZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGlmKCFtZXNzYWdlTW9kdWxlMSltZXNzYWdlTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmt1cClbMF1cclxuICAgICAgICBpZighbWVzc2FnZU1vZHVsZTIpbWVzc2FnZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tZXNzYWdlQ29udGVudClbMF1cclxuICAgICAgICBpZighc2Nyb2xsYmFyTW9kdWxlMSlzY3JvbGxiYXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF1cclxuICAgICAgICBpZighaGlnaHRsaWdodEpTKWhpZ2h0bGlnaHRKUyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmxpc3RMYW5ndWFnZXMpWzBdXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtgJHttZXNzYWdlTW9kdWxlMS5tYXJrdXB9ICR7bWVzc2FnZU1vZHVsZTIubWVzc2FnZUNvbnRlbnR9YH0+XHJcbiAgICAgICAgICAgIDxwcmU+XHJcbiAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz17YCR7c2Nyb2xsYmFyTW9kdWxlMS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lfSBobGpzYH0gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGhpZ2h0bGlnaHRKUy5oaWdobGlnaHQodGhpcy5wcm9wcy5sYW5ndWFnZSwgdGhpcy5wcm9wcy5jb250ZW50KS52YWx1ZX19PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvY29kZT5cclxuICAgICAgICAgICAgPC9wcmU+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b204KVswXS5tYXJnaW5Cb3R0b204fT48L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn0iLCIvLyBHb29kIGx1Y2sgdG8gcmVhZCBteSBjb2RlLCBFdmVuIG1lIGNhbid0IHJlYWQgaXQgcHJvcGVybHkuXHJcblxyXG5pbXBvcnQgeyBzdGF0IH0gZnJvbSBcImZzXCJcclxuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSBcIi4uL21vZHVsZXMvZGlzdGFudFwiXHJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiXHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiXHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCJcclxuXHJcbmxldCBmb3JtTW9kdWxlXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaVByZXZpZXcgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHN0YXRlczogW11cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIWZvcm1Nb2R1bGUpZm9ybU1vZHVsZSA9IHdlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLkZvcm1TZWN0aW9uKVxyXG4gICAgICAgIC8qKiBcclxuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb25bXX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBhbGxDb21wb25lbnRzID0gWy4uLm5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cykubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXSkubWFwKGsgPT4gd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXVtrXSlcclxuICAgICAgICB9KS5mbGF0KCkpXVxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxmb3JtTW9kdWxlLkZvcm1TZWN0aW9uIHRhZz1cImgyXCIgdGl0bGU9XCJMaWdodGNvcmQncyBBcGkgQXZhaWxsYWJsZSBjb21wb25lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICA8Zm9ybU1vZHVsZS5Gb3JtVGV4dCB0eXBlPVwiZGVzY3JpcHRpb25cIiBjbGFzc05hbWU9XCJcIiBzZWxlY3RhYmxlPXtmYWxzZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgVGhlc2UgY29tcG9uZW50cyBhcmUgaGVyZSBmb3IgdGhlIHBsdWdpbiBkZXZzLiBUaGV5IGNhbiBxdWlja2x5IGVtYmVkIGFueSBjb21wb25lbnQgYmVsb3cgd2l0aCB0aGlzIHBhbmVsLlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3ttYXJnaW5Ub3A6IFwiMjBweFwifX0+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJpbmZvXCI+QWxsIHRoZXNlIGNvbXBvbmVudHMgaGF2ZSBlcnJvciBoYW5kbGluZy4gSWYgeW91IHdhbnQgbm9uZSwgYWRkIGAub3JpZ2luYWxgIGFmdGVyIHRoZSBjb21wb25lbnQgcGF0aC48L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PlxyXG4gICAgICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwid2FyblwiPldlIGRvIG5vdCByZWNvbW1lbmQgbW9kaWZ5aW5nIHRoZXNlIGNvbXBvbmVudCB3aXRoIHBsdWdpbnMuIE9ubHkgZG8gdGhpcyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD5cclxuICAgICAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtVGV4dD5cclxuICAgICAgICAgICAgICAgIDxNYXJnaW5Ub3A+PC9NYXJnaW5Ub3A+XHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gY29sb3I9XCJicmFuZFwiIGxvb2s9XCJvdXRsaW5lZFwiIHNpemU9XCJtZWRpdW1cIiBob3ZlckNvbG9yPVwiZ3JlZW5cIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChcImh0dHBzOi8vbGlnaHRjb3JkLmRlcm9rdS54eXovTGlnaHRjb3JkQXBpL2RvY3NcIilcclxuICAgICAgICAgICAgICAgIH19IHdyYXBwZXI9e2ZhbHNlfT5cclxuICAgICAgICAgICAgICAgICAgICBEb2N1bWVudGF0aW9uXHJcbiAgICAgICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Zvcm1Nb2R1bGUuRm9ybVNlY3Rpb24+LFxyXG4gICAgICAgICAgICBhbGxDb21wb25lbnRzLm1hcChjb21wID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBOYW1lID0gY29tcC5kaXNwbGF5TmFtZSB8fCBjb21wLm5hbWVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBQYXRoID0gYExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy4ke09iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMpLmZpbmQoZSA9PiB3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzW2VdW2NvbXBOYW1lXSl9LiR7Y29tcE5hbWV9YFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxDb21wb25lbnRQcmV2aWV3IGtleT17Y29tcFBhdGh9IGNvbXA9e2NvbXB9IC8+XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZW5kZXJzKCl7XHJcblxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBDb21wb25lbnRQcmV2aWV3IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICB0YWI6IFwicHJldmlld1wiLFxyXG4gICAgICAgICAgICBlbGVtOiBwcm9wcy5jb21wLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7fVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBjb21wID0gdGhpcy5wcm9wcy5jb21wXHJcbiAgICAgICAgbGV0IEFsbFByZXZpZXdzID0gW11cclxuICAgICAgICBpZihjb21wLkFsbFByZXZpZXdzKUFsbFByZXZpZXdzID0gY29tcC5BbGxQcmV2aWV3c1xyXG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVcclxuICAgICAgICBsZXQgZ2V0UHJvcHMgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBmaW5hbCA9IHt9XHJcbiAgICAgICAgICAgIEFsbFByZXZpZXdzLmZvckVhY2goY2F0ZWdvcnkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZmluYWxbT2JqZWN0LmtleXMoY2F0ZWdvcnlbMF0pWzBdXSA9IGNhdGVnb3J5WzBdW09iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXV1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc3RhdGUub3B0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZmluYWxba2V5XSA9IEFsbFByZXZpZXdzLmZpbmQoZSA9PiBlLmZpbmQoZSA9PiBlW2tleV0pKVtzdGF0ZS5vcHRpb25zW2tleV1dW2tleV1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZW5kZXJQcmV2aWV3ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBzdHlsZT17e21hcmdpbjogXCIyMHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPVwibGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudChjb21wLCBnZXRQcm9wcygpKX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJlbmRlckNvZGUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IHN0eWxlPXt7bWFyZ2luOiBcIjIwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXHJcbiAgICAgICAgICAgICAgICB9fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBKU1hcclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzeFwiIGNvbnRlbnQ9e2dlbmVyYXRlQ29kZShcImpzeFwiKX0vPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+ICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3RcclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzXCIgY29udGVudD17Z2VuZXJhdGVDb2RlKFwicmVhY3RcIil9Lz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuRXJyb3JDYXRjaGVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZ2V0U3RyRm9yUHJvcCA9ICh2YWx1ZSwgY29tcFBhdGgsIGxhbmcpID0+IHtcclxuICAgICAgICAgICAgaWYodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIil7XHJcbiAgICAgICAgICAgICAgICBpZih2YWx1ZSAmJiB2YWx1ZS4kJHR5cGVvZiAmJiAodmFsdWUuJCR0eXBlb2YgPT09IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpIHx8IHZhbHVlLiQkdHlwZW9mID09PSAweGVhYzcpKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihjb21wUGF0aCA9PT0gXCJMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihsYW5nID09PSBcInJlYWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1xyXG5tYXJnaW5Ub3A6IFwiMjBweFwiLCBtYXJnaW5Cb3R0b206IFwiMjBweFwiXHJcbn19LFxyXG5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1xyXG5iYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsXHJcbnBhZGRpbmc6IFwiMzBweCAzMHB4XCIsXHJcbmJvcmRlclJhZGl1czogXCI4cHhcIlxyXG59LCBjbGFzc05hbWU6IFwibGMtdGFiLWJveC1zaGFkb3dcIiB9LFxyXG5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlLCBudWxsLCBcIlByZXZpZXcgdGFic1wiKVxyXG4pXHJcbilgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxhbmcgPT09IFwianN4XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPXt7XHJcbm1hcmdpblRvcDogXCIyMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIyMHB4XCJcclxufX0+XHJcbjxkaXYgc3R5bGU9e3tcclxuICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXHJcbiAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcclxuICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG59fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlPlByZXZpZXcgdGFiczwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuVGl0bGU+XHJcbjwvZGl2PlxyXG48L2Rpdj5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91ciBjb21wb25lbnRzIGhlcmUuXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgXCIgICAgXCIpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBnZW5lcmF0ZUNvZGUgPSBmdW5jdGlvbihsYW5nKXsgLy8gY29kZSBmb3JtYXR0aW5nIGlzIGhhcmRcclxuICAgICAgICAgICAgY29uc3QgY29tcE5hbWUgPSBjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZVxyXG4gICAgICAgICAgICBsZXQgY2F0ZWdvcmllcyA9IE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMpXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBDYXRlZ29yeSA9IGNhdGVnb3JpZXMuZmluZChlID0+IHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV1bY29tcE5hbWVdKVxyXG4gICAgICAgICAgICBjb25zdCBjb21wUGF0aCA9IGBMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuJHtjb21wQ2F0ZWdvcnl9LiR7Y29tcE5hbWV9YFxyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGdldFByb3BzKClcclxuXHJcbiAgICAgICAgICAgIGlmKGxhbmcgPT09IFwianN4XCIpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb3BTdHJpbmdzID0gW11cclxuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlblByb3AgPSBudWxsXHJcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGtleSA9PSBcImNoaWxkcmVuXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblByb3AgPSBnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0ga2V5K1wiPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9wc1trZXldID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBKU09OLnN0cmluZ2lmeShwcm9wc1trZXldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBgeyR7Z2V0U3RyRm9yUHJvcChwcm9wc1trZXldLCBjb21wUGF0aCwgbGFuZyl9fWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5wdXNoKHN0cilcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgbGV0IG9wZW5UYWdcclxuICAgICAgICAgICAgICAgIGlmKGNoaWxkcmVuUHJvcCl7XHJcbiAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0+YFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZVRhZyA9IGA8LyR7Y29tcFBhdGh9PmBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7b3BlblRhZ31cXG4gICAgJHtjaGlsZHJlblByb3B9XFxuJHtjbG9zZVRhZ31gXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBvcGVuVGFnID0gYDwke2NvbXBQYXRofSAke3Byb3BTdHJpbmdzLmpvaW4oXCIgXCIpfS8+YFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVuVGFnXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGxhbmcgPT09IFwicmVhY3RcIil7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbiB8fCBudWxsXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHMuY2hpbGRyZW5cclxuICAgICAgICAgICAgICAgIGlmKGNoaWxkcmVuICYmIGNoaWxkcmVuLiQkdHlwZW9mICYmIChjaGlsZHJlbi4kJHR5cGVvZiA9PT0gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIikgfHwgY2hpbGRyZW4uJCR0eXBlb2YgPT09IDB4ZWFjNykpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gZ2V0U3RyRm9yUHJvcChjaGlsZHJlbiwgY29tcFBhdGgsIGxhbmcpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcFN0cmluZ3MgPSBbXVxyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmlzaWJsZUtleSA9IC9bXlxcd1xcZF9dL2cudGVzdChrZXkpID8gSlNPTi5zdHJpbmdpZnkoa2V5KSA6IGtleVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSB2aXNpYmxlS2V5K1wiOiBcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9wc1trZXldID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KHByb3BzW2tleV0pXHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKS5zcGxpdChcIlxcblwiKS5tYXAoKHN0ciwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gMClyZXR1cm4gc3RyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgICAgXCIgKyBzdHJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIlxcblwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5wdXNoKHN0cilcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcE9iamVjdCA9IFwie1wiXHJcbiAgICAgICAgICAgICAgICBpZihwcm9wU3RyaW5ncy5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BTdHJpbmdzLmZvckVhY2goKHN0ciwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNMYXN0ID0gaSA9PT0gcHJvcFN0cmluZ3MubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXJzdCA9IGkgPT09IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzRmlyc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIixcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCJcXG4gICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBzdHJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNMYXN0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz1cIlxcbn1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCJ9XCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbkRhdGEgPSB0eXBlb2YgY2hpbGRyZW4gPT09IFwic3RyaW5nXCIgJiYgY2hpbGRyZW4uc3RhcnRzV2l0aChcIlJlYWN0LmNyZWF0ZUVsZW1lbnRcIikgPyBjaGlsZHJlbiA6IEpTT04uc3RyaW5naWZ5KGNoaWxkcmVuKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBSZWFjdC5jcmVhdGVFbGVtZW50KCR7Y29tcFBhdGh9LCAke3Byb3BPYmplY3R9LCAke2NoaWxkcmVuRGF0YX0pYFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBoZWxwID0gY29tcC5oZWxwIHx8IHt9XHJcbiAgICAgICAgbGV0IGluZm8gPSBoZWxwLmluZm8gPyA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJpbmZvXCI+XHJcbiAgICAgICAgICAgIHtoZWxwLmluZm99XHJcbiAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxyXG4gICAgICAgIGxldCB3YXJuID0gaGVscC53YXJuID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwid2FyblwiPlxyXG4gICAgICAgICAgICB7aGVscC53YXJufVxyXG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICBsZXQgZGFuZ2VyID0gaGVscC5kYW5nZXIgPyA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJkYW5nZXJcIj5cclxuICAgICAgICAgICAge2hlbHAuZGFuZ2VyfVxyXG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICBsZXQgZXJyb3IgPSBoZWxwLmVycm9yID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiZXJyb3JcIj5cclxuICAgICAgICAgICAge2hlbHAuZXJyb3J9XHJcbiAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxyXG4gICAgICAgIGxldCBzdWNjZXNzID0gaGVscC5zdWNjZXNzID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwic3VjY2Vzc1wiPlxyXG4gICAgICAgICAgICB7aGVscC5zdWNjZXNzfVxyXG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICByZXR1cm4gKDxkaXY+XHJcbiAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ3NUaXRsZT5cclxuICAgICAgICAgICAgICAgIHtjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZX1cclxuICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ3NUaXRsZT5cclxuICAgICAgICAgICAge2luZm99XHJcbiAgICAgICAgICAgIHtzdWNjZXNzfVxyXG4gICAgICAgICAgICB7d2Fybn1cclxuICAgICAgICAgICAge2Vycm9yfVxyXG4gICAgICAgICAgICB7ZGFuZ2VyfVxyXG4gICAgICAgICAgICB7QWxsUHJldmlld3MubWFwKGNhdGVnb3J5ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLm9uQ2xpY2spcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLnRleHQpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLmNoaWxkcmVuKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICBpZihjYXRlZ29yeS5sZW5ndGggPT09IDEpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAge2tleX1cclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+LFxyXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Ecm9wZG93biBvcHRpb25zPXtjYXRlZ29yeS5tYXAoKGUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJvcHQtXCIraW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogSlNPTi5zdHJpbmdpZnkoZVtPYmplY3Qua2V5cyhlKVswXV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KX0gdmFsdWU9e1wib3B0LVwiKyhzdGF0ZS5vcHRpb25zW2tleV0gfHwgXCIwXCIpfSBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUub3B0aW9ucywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtrZXldOiAodmFsdWUudmFsdWUgfHwgXCIwXCIpLnJlcGxhY2UoXCJvcHQtXCIsIFwiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH19IHNlYXJjaGFibGU9e3RydWV9Lz4sXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e21hcmdpbkJvdHRvbTogXCI4cHhcIn19PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzIHRhYnM9e1t7bGFiZWw6IFwiUHJldmlld1wiLCBpZDogXCJwcmV2aWV3XCJ9LCB7bGFiZWw6IFwiQ29kZVwiLCBpZDogXCJjb2RlXCJ9XX0gXHJcbiAgICAgICAgICAgICAgICBhY3RpdmU9e3N0YXRlLnRhYn0gY2hpbGRyZW49e3N0YXRlLnRhYiA9PT0gXCJwcmV2aWV3XCIgPyByZW5kZXJQcmV2aWV3KCkgOiByZW5kZXJDb2RlKCl9IG9uQ2hhbmdlPXsodGFiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYlxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9fS8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgWFN2ZyBmcm9tIFwiLi94U3ZnXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuL3JlbG9hZEljb25cIjtcclxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCIuL2ljb25zL2VkaXRcIjtcclxuaW1wb3J0IERlbGV0ZUljb24gZnJvbSBcIi4vaWNvbnMvZGVsZXRlXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vY29tcG9uZW50cy9zd2l0Y2hcIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XHJcbmltcG9ydCB7IHByb2Nlc3NGaWxlIH0gZnJvbSBcIi4uL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyXCI7XHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuY29uc3QgYW5jaG9yQ2xhc3NlcyA9IEJEVjIuYW5jaG9yQ2xhc3NlcztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QbHVnaW5DYXJkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNob3dTZXR0aW5ncyA9IHRoaXMuc2hvd1NldHRpbmdzLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLmhhc1NldHRpbmdzID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gJiYgdHlwZW9mKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwpID09PSBcImZ1bmN0aW9uXCI7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc1BhbmVsID0gXCJcIjtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0ID0gdGhpcy5lZGl0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5kZWxldGUgPSB0aGlzLmRlbGV0ZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVsb2FkID0gdGhpcy5yZWxvYWQuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5lbmFibGVkLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlbG9hZHM6IDAsXHJcbiAgICAgICAgICAgIHRydXN0ZWQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93U2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1NldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3M6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHRoaXMucGFuZWxSZWYuY3VycmVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzT3BlbjogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnNldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1BhbmVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTNcIl0pIHJldHVybjtcclxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpc0hpZGRlbiA9IChjb250YWluZXIsIGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKCFjb250YWluZXIpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobmV3IEVycm9yKGBDb250YWluZXIgaXMgdW5kZWZpbmVkLmApKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY1RvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjQm90dG9tID0gY1RvcCArIGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlVG9wID0gZWxlbWVudC5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlQm90dG9tID0gZVRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICAoZVRvcCA8IGNUb3AgfHwgZUJvdHRvbSA+IGNCb3R0b20pO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLnJlZnMuY2FyZE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXNOb2RlLmNsb3Nlc3QoXCJkaXZbY2xhc3MqPVxcXCJjb250ZW50UmVnaW9uU2Nyb2xsZXItXFxcIl1cIilcclxuICAgICAgICAgICAgaWYgKCFpc0hpZGRlbihjb250YWluZXIsIHRoaXNOb2RlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCB0aGlzTm9kZU9mZnNldCA9IERPTS5vZmZzZXQodGhpc05vZGUpO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJPZmZzZXQgPSBET00ub2Zmc2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsID0gY29udGFpbmVyLnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzTm9kZU9mZnNldC50b3AgLSBjb250YWluZXJPZmZzZXQudG9wICsgY29udGFpbmVyLnNjcm9sbFRvcCAtIDMwO1xyXG4gICAgICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmRQb2ludCA+IG9yaWdpbmFsKSBjb250YWluZXIuc2Nyb2xsVG9wID0gb3JpZ2luYWwgKyAocHJvZ3Jlc3MgKiAoZW5kUG9pbnQgLSBvcmlnaW5hbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgY29udGFpbmVyLnNjcm9sbFRvcCA9IG9yaWdpbmFsIC0gKHByb2dyZXNzICogKG9yaWdpbmFsIC0gZW5kUG9pbnQpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldFN0cmluZyh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBcIj8/P1wiO1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2V0dGluZ3NDb21wb25lbnQoKSB7XHJcbiAgICAgICAgdHJ5IHsgdGhpcy5zZXR0aW5nc1BhbmVsID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0U2V0dGluZ3NQYW5lbCgpOyB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGdldCBzZXR0aW5ncyBwYW5lbCBmb3IgXCIgKyB0aGlzLm5hbWUgKyBcIi5cIiwgZXJyKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZCBiZC1hZGRvbi1jYXJkIHNldHRpbmdzLW9wZW4gdWktc3dpdGNoLWl0ZW1cIiwgcmVmOiBcImNhcmROb2RlXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1wiZmxvYXRcIjogXCJyaWdodFwiLCBcImN1cnNvclwiOiBcInBvaW50ZXJcIn0sIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3M6IGZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoWFN2ZywgbnVsbClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIn0pLFxyXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zZXR0aW5nc1BhbmVsICE9PSBcIm9iamVjdFwiICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IGBwbHVnaW4tc2V0dGluZ3MtJHt0aGlzLm5hbWV9YCwgY2xhc3NOYW1lOiBcInBsdWdpbi1zZXR0aW5nc1wiLCByZWY6IFwic2V0dGluZ3NwYW5lbFwiLCBkYW5nZXJvdXNseVNldElubmVySFRNTDoge19faHRtbDogdGhpcy5zZXR0aW5nc1BhbmVsfX0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBidWlsZFRpdGxlKG5hbWUsIHZlcnNpb24sIGF1dGhvcikge1xyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gXCJ7e25hbWV9fSB2e3t2ZXJzaW9ufX0gYnkge3thdXRob3J9fVwiLnNwbGl0KC8oe3tbQS1aYS16XSt9fSkvKTtcclxuICAgICAgICBjb25zdCBuYW1lSW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3tuYW1lfX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkgdGl0bGVbbmFtZUluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwibmFtZSBiZGEtbmFtZVwifSwgbmFtZSk7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbkluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7dmVyc2lvbn19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHRpdGxlW3ZlcnNpb25JbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcInZlcnNpb24gYmRhLXZlcnNpb25cIn0sIHZlcnNpb24pO1xyXG4gICAgICAgIGNvbnN0IGF1dGhvckluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7YXV0aG9yfX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHtjbGFzc05hbWU6IFwiYXV0aG9yIGJkYS1hdXRob3JcIn07XHJcbiAgICAgICAgICAgIGlmIChhdXRob3IubGluayB8fCBhdXRob3IuaWQpIHtcclxuICAgICAgICAgICAgICAgIHByb3BzLmNsYXNzTmFtZSArPSBgICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWA7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy50YXJnZXQgPSBcIl9ibGFua1wiO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IubGluaykgcHJvcHMuaHJlZiA9IGF1dGhvci5saW5rO1xyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhvci5pZCkgcHJvcHMub25DbGljayA9ICgpID0+IHtCRFYyLkxheWVyU3RhY2sucG9wTGF5ZXIoKTsgQkRWMi5vcGVuRE0oYXV0aG9yLmlkKTt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRpdGxlW2F1dGhvckluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoYXV0aG9yLmxpbmsgfHwgYXV0aG9yLmlkID8gXCJhXCIgOiBcInNwYW5cIiwgcHJvcHMsIGF1dGhvci5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRpdGxlLmZsYXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlTGluayh0aXRsZSwgdXJsKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImJkYS1saW5rIGJkYS1saW5rLXdlYnNpdGVcIiwgdGFyZ2V0OiBcIl9ibGFua1wifTtcclxuICAgICAgICBpZiAodHlwZW9mKHVybCkgPT0gXCJzdHJpbmdcIikgcHJvcHMuaHJlZiA9IHVybDtcclxuICAgICAgICBpZiAodHlwZW9mKHVybCkgPT0gXCJmdW5jdGlvblwiKSBwcm9wcy5vbkNsaWNrID0gKGV2ZW50KSA9PiB7ZXZlbnQucHJldmVudERlZmF1bHQoKTsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHVybCgpO307XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgcHJvcHMsIHRpdGxlKTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlQnV0dG9uKHRpdGxlLCBjaGlsZHJlbiwgYWN0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIDxUb29sdGlwV3JhcCBjb2xvcj1cImJsYWNrXCIgc2lkZT1cInRvcFwiIHRleHQ9e3RpdGxlfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1hZGRvbi1idXR0b25cIiBvbkNsaWNrPXthY3Rpb259PntjaGlsZHJlbn08L2Rpdj5cclxuICAgICAgICA8L1Rvb2x0aXBXcmFwPjtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgIHRoaXMudW5tb3VudGVkID0gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaW5rcygpIHtcclxuICAgICAgICBjb25zdCBsaW5rcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGFkZG9uID0gdGhpcy5wcm9wcy5hZGRvbjtcclxuICAgICAgICBpZiAoYWRkb24ud2Vic2l0ZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiV2Vic2l0ZVwiLCBhZGRvbi53ZWJzaXRlKSk7XHJcbiAgICAgICAgaWYgKGFkZG9uLnNvdXJjZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiU291cmNlXCIsIGFkZG9uLnNvdXJjZSkpO1xyXG4gICAgICAgIGlmIChhZGRvbi5pbnZpdGUpIHtcclxuICAgICAgICAgICAgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiU3VwcG9ydCBTZXJ2ZXJcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdGVyID0gL1xcLmdnXFwvKC4qKSQvO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvZGUgPSBhZGRvbi5pbnZpdGU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVzdGVyLnRlc3QoY29kZSkpIGNvZGUgPSBjb2RlLm1hdGNoKHRlc3RlcilbMV07XHJcbiAgICAgICAgICAgICAgICBCRFYyLkxheWVyU3RhY2sucG9wTGF5ZXIoKTtcclxuICAgICAgICAgICAgICAgIEJEVjIuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKGNvZGUpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhZGRvbi5kb25hdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIkRvbmF0ZVwiLCBhZGRvbi5kb25hdGUpKTtcclxuICAgICAgICBpZiAoYWRkb24ucGF0cmVvbikgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiUGF0cmVvblwiLCBhZGRvbi5wYXRyZW9uKSk7XHJcbiAgICAgICAgcmV0dXJuIGxpbmtzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb290ZXIoKSB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSB0aGlzLmxpbmtzO1xyXG4gICAgICAgIHJldHVybiAobGlua3MubGVuZ3RoIHx8IHRoaXMuaGFzU2V0dGluZ3MpICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQtZm9vdGVyIGJkYS1mb290ZXJcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1saW5rcyBiZGEtbGlua3NcIn0sXHJcbiAgICAgICAgICAgICAgICAuLi4obGlua3MubWFwKChlbGVtZW50LCBpbmRleCkgPT4gaW5kZXggPCBsaW5rcy5sZW5ndGggLSAxID8gW2VsZW1lbnQsIFwiIHwgXCJdIDogZWxlbWVudCkuZmxhdCgpKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLmhhc1NldHRpbmdzICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7b25DbGljazogdGhpcy5zaG93U2V0dGluZ3MsIGNsYXNzTmFtZTogXCJiZC1idXR0b24gYmRhLXNldHRpbmdzLWJ1dHRvblwiLCBkaXNhYmxlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0sIFwiU2V0dGluZ3NcIilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMudG9nZ2xlICYmIHRoaXMucHJvcHMudG9nZ2xlKHRoaXMubmFtZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2hlY2tlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXQoKSB7dGhpcy5wcm9wcy5lZGl0KHRoaXMubmFtZSk7fVxyXG4gICAgZGVsZXRlKCkge3RoaXMucHJvcHMucmVtb3ZlKHRoaXMubmFtZSk7fVxyXG4gICAgcmVsb2FkKCkge3RoaXMucHJvcHMucmVsb2FkKHRoaXMubmFtZSk7fVxyXG5cclxuICAgIGdldCBuYW1lKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IHRoaXMucHJvcHMuYWRkb24ubmFtZSk7fVxyXG4gICAgZ2V0IGF1dGhvcigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRBdXRob3IoKSA6IHRoaXMucHJvcHMuYWRkb24uYXV0aG9yKTt9XHJcbiAgICBnZXQgZGVzY3JpcHRpb24oKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0RGVzY3JpcHRpb24oKSA6IHRoaXMucHJvcHMuYWRkb24uZGVzY3JpcHRpb24pO31cclxuICAgIGdldCB2ZXJzaW9uKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IHRoaXMucHJvcHMuYWRkb24udmVyc2lvbik7fVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuIHRoaXMuc2V0dGluZ3NDb21wb25lbnQ7XHJcbiAgICAgICAgY29uc3Qge2F1dGhvcklkLCBhdXRob3JMaW5rfSA9IHRoaXMucHJvcHMuYWRkb247XHJcblxyXG4gICAgICAgIGNvbnN0IHN0eWxlID0ge31cclxuICAgICAgICBpZihzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSl7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmlzU2Nhbm5pbmcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1NjYW5uaW5nID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUocmVzb2x2ZSh0aGlzLnByb3BzLmFkZG9uLmZpbGVuYW1lLmVuZHNXaXRoKFwiLnBsdWdpbi5qc1wiKSA/IGNvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIsIHRoaXMucHJvcHMuYWRkb24uZmlsZW5hbWUpLCAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy51bm1vdW50ZWQpcmV0dXJuXHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiByZXN1bHQuc3VzcGVjdCA/IFwic3VzcGVjdFwiIDogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9LCAoKSA9PiB7fSlcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmlzVHJ1c3RlZCA9PT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5pc1RydXN0ZWQgPT09IFwic3VzcGVjdFwiKXtcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5ib3JkZXJDb2xvciA9IFwicmdiKDI0MCwgNzEsIDcxKVwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQgYmQtYWRkb24tY2FyZCBzZXR0aW5ncy1jbG9zZWQgdWktc3dpdGNoLWl0ZW1cIiwgc3R5bGV9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1oZWFkZXIgYmRhLWhlYWRlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkLXRpdGxlIGJkYS1oZWFkZXItdGl0bGVcIn0sIHRoaXMuYnVpbGRUaXRsZSh0aGlzLm5hbWUsIHRoaXMudmVyc2lvbiwge25hbWU6IHRoaXMuYXV0aG9yLCBpZDogYXV0aG9ySWQsIGxpbms6IGF1dGhvckxpbmt9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24tY29udHJvbHMgYmRhLWNvbnRyb2xzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmVkaXQgJiYgdGhpcy5tYWtlQnV0dG9uKFwiRWRpdFwiLCA8RWRpdEljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLmVkaXQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJlbW92ZSAmJiB0aGlzLm1ha2VCdXR0b24oXCJEZWxldGVcIiwgPERlbGV0ZUljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLmRlbGV0ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVsb2FkICYmIHRoaXMubWFrZUJ1dHRvbihcIlJlbG9hZFwiLCA8UmVsb2FkSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMucmVsb2FkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogdGhpcy5zdGF0ZS5jaGVja2VkfSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLXNjcm9sbGVyLXdyYXAgYmRhLWRlc2NyaXB0aW9uLXdyYXAgc2Nyb2xsZXItd3JhcCBmYWRlXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtc2Nyb2xsZXIgYmQtYWRkb24tZGVzY3JpcHRpb24gYmRhLWRlc2NyaXB0aW9uIHNjcm9sbGVyXCJ9LCB0aGlzLmRlc2NyaXB0aW9uKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLmZvb3RlclxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gVjJDX1BsdWdpbkNhcmQucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFYyQ19QbHVnaW5DYXJkLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7IiwiaW1wb3J0IEVycm9yQm91bmRhcnkgZnJvbSBcIi4vZXJyb3JCb3VuZGFyeVwiO1xyXG5pbXBvcnQgQ29udGVudENvbHVtbiBmcm9tIFwiLi9jb250ZW50Q29sdW1uXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuL3JlbG9hZEljb25cIjtcclxuaW1wb3J0IEFkZG9uQ2FyZCBmcm9tIFwiLi9hZGRvbmNhcmRcIjtcclxuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIuL2NvbXBvbmVudHMvZHJvcGRvd25cIjtcclxuaW1wb3J0IFNlYXJjaCBmcm9tIFwiLi9jb21wb25lbnRzL3NlYXJjaFwiO1xyXG5cclxuaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZSwgcGx1Z2luQ29va2llLCB0aGVtZUNvb2tpZSwgYmRwbHVnaW5zLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuLi9tb2R1bGVzL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4uL21vZHVsZXMvdGhlbWVNb2R1bGVcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBCZEFwaSBmcm9tIFwiLi4vbW9kdWxlcy9iZEFwaVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XHJcbmltcG9ydCBiZEV2ZW50cyBmcm9tIFwiLi4vbW9kdWxlcy9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgRW11bGF0ZWRUb29sdGlwIGZyb20gXCIuL3Rvb2x0aXBcIjtcclxuXHJcbmNvbnN0IFRvb2x0aXAgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRvb2x0aXBcIik7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJkTGlzdCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtzb3J0OiBcIm5hbWVcIiwgYXNjZW5kaW5nOiB0cnVlLCBxdWVyeTogXCJcIn07XHJcbiAgICAgICAgdGhpcy5pc1BsdWdpbnMgPSB0aGlzLnByb3BzLnR5cGUgPT0gXCJwbHVnaW5zXCI7XHJcbiAgICAgICAgdGhpcy5jb29raWUgPSB0aGlzLmlzUGx1Z2lucyA/IHBsdWdpbkNvb2tpZSA6IHRoZW1lQ29va2llO1xyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IHRoaXMuaXNQbHVnaW5zID8gcGx1Z2luTW9kdWxlIDogdGhlbWVNb2R1bGU7XHJcblxyXG4gICAgICAgIHRoaXMuc29ydCA9IHRoaXMuc29ydC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmV2ZXJzZSA9IHRoaXMucmV2ZXJzZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5vbkFkZG9uQ2hhbmdlcyA9IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uQWRkb25DaGFuZ2VzID0gdGhpcy5vbkFkZG9uQ2hhbmdlcy5iaW5kKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKXtcclxuICAgICAgICBjb25zdCB0eXBlID0gKHRoaXMuaXNQbHVnaW5zID8gXCJwbHVnaW5cIiA6IFwidGhlbWVcIikgKyBcIi1cIlxyXG4gICAgICAgIGJkRXZlbnRzLm9uKGAke3R5cGV9bG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfXVubG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfXJlbG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSAodGhpcy5pc1BsdWdpbnMgPyBcInBsdWdpblwiIDogXCJ0aGVtZVwiKSArIFwiLVwiXHJcbiAgICAgICAgYmRFdmVudHMub2ZmKGAke3R5cGV9bG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgICAgICBiZEV2ZW50cy5vZmYoYCR7dHlwZX11bmxvYWRlZGAsIHRoaXMub25BZGRvbkNoYW5nZXMpXHJcbiAgICAgICAgYmRFdmVudHMub2ZmKGAke3R5cGV9cmVsb2FkZWRgLCB0aGlzLm9uQWRkb25DaGFuZ2VzKVxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Gb2xkZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2hlbGwgPSByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGw7XHJcbiAgICAgICAgY29uc3Qgb3BlbiA9IHNoZWxsLm9wZW5QYXRoIHx8IHNoZWxsLm9wZW5JdGVtO1xyXG4gICAgICAgIG9wZW4odGhpcy5pc1BsdWdpbnMgPyBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyIDogQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0KG5hbWUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhuYW1lKTtcclxuICAgICAgICB0aGlzLm1hbmFnZXIuZWRpdChuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGUobmFtZSkge1xyXG4gICAgICAgIGNvbnN0IHNob3VsZERlbGV0ZSA9IGF3YWl0IHRoaXMuY29uZmlybURlbGV0ZShuYW1lKTtcclxuICAgICAgICBpZiAoIXNob3VsZERlbGV0ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5kZWxldGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uZmlybURlbGV0ZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBCZEFwaS5zaG93Q29uZmlybWF0aW9uTW9kYWwoXCJBcmUgWW91IFN1cmU/XCIsIGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICR7bmFtZX0/YCwge1xyXG4gICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRGVsZXRlXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtyZXNvbHZlKHRydWUpO30sXHJcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge3Jlc29sdmUoZmFsc2UpO31cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvcnRPcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJOYW1lXCIsIHZhbHVlOiBcIm5hbWVcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJBdXRob3JcIiwgdmFsdWU6IFwiYXV0aG9yXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiVmVyc2lvblwiLCB2YWx1ZTogXCJ2ZXJzaW9uXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiUmVjZW50bHkgQWRkZWRcIiwgdmFsdWU6IFwiYWRkZWRcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJMYXN0IE1vZGlmaWVkXCIsIHZhbHVlOiBcIm1vZGlmaWVkXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiRmlsZSBTaXplXCIsIHZhbHVlOiBcInNpemVcIn0sXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlyZWN0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7bGFiZWw6IFwiQXNjZW5kaW5nXCIsIHZhbHVlOiB0cnVlfSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkRlc2NlbmRpbmdcIiwgdmFsdWU6IGZhbHNlfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZXJzZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2FzY2VuZGluZzogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzb3J0KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c29ydDogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2goZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtxdWVyeTogZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCl9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9wcyhhZGRvbikge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGtleTogdGhpcy5nZXROYW1lKGFkZG9uKSxcclxuICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5jb29raWVbdGhpcy5nZXROYW1lKGFkZG9uKV0sXHJcbiAgICAgICAgICAgIHRvZ2dsZTogdGhpcy5tYW5hZ2VyLnRvZ2dsZS5iaW5kKHRoaXMubWFuYWdlciksXHJcbiAgICAgICAgICAgIGVkaXQ6IHNldHRpbmdzQ29va2llW1wiZm9yay1wcy03XCJdID8gdGhpcy5lZGl0LmJpbmQodGhpcykgOiBudWxsLFxyXG4gICAgICAgICAgICByZW1vdmU6IHRoaXMuZGVsZXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIGFkZG9uOiBhZGRvbixcclxuICAgICAgICAgICAgaGFzaDogYWRkb24uaGFzaFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RyaW5nKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiPz8/XCI7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaXN0KCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMudHlwZSA9PT0gXCJwbHVnaW5zXCIgPyBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykgOiBPYmplY3QudmFsdWVzKGJkdGhlbWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBZGRvbnMoKSB7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkQWRkb25zID0gdGhpcy5saXN0LnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FwID0gdGhpcy5zdGF0ZS5zb3J0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5zdGF0ZS5zb3J0LnNsaWNlKDEpO1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGEucGx1Z2luICYmIGEucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGEucGx1Z2luW2BnZXQke2NhcH1gXSgpKSA6IHRoaXMuZ2V0U3RyaW5nKGFbdGhpcy5zdGF0ZS5zb3J0XSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IGIucGx1Z2luICYmIGIucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGIucGx1Z2luW2BnZXQke2NhcH1gXSgpKSAgOiB0aGlzLmdldFN0cmluZyhiW3RoaXMuc3RhdGUuc29ydF0pO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKGZpcnN0KSA9PSBcInN0cmluZ1wiKSByZXR1cm4gZmlyc3QudG9Mb2NhbGVMb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKHNlY29uZC50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgaWYgKGZpcnN0ID4gc2Vjb25kKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgaWYgKHNlY29uZCA+IGZpcnN0KSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5hc2NlbmRpbmcpIHNvcnRlZEFkZG9ucy5yZXZlcnNlKCk7XHJcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBhID0gMDsgYSA8IHNvcnRlZEFkZG9ucy5sZW5ndGg7IGErKykge1xyXG4gICAgICAgICAgICBjb25zdCBhZGRvbiA9IHNvcnRlZEFkZG9uc1thXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUucXVlcnkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBtYXRjaGVzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldE5hbWUoYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXV0aG9yID0gdGhpcy5nZXRBdXRob3IoYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLmdldERlc2NyaXB0aW9uKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24oYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIG1hdGNoZXMgPSBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aG9yKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCBhdXRob3IudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgZGVzY3JpcHRpb24udG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCB2ZXJzaW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5nZXRQcm9wcyhhZGRvbik7XHJcbiAgICAgICAgICAgIHJlbmRlcmVkLnB1c2goPEVycm9yQm91bmRhcnk+PEFkZG9uQ2FyZCB7Li4ucHJvcHN9IHJlbG9hZD17IXNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdICYmIHRoaXMubWFuYWdlci5yZWxvYWQuYmluZCh0aGlzLm1hbmFnZXIpfSAvPjwvRXJyb3JCb3VuZGFyeT4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVuZGVyZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmFtZShhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0TmFtZSgpIDogYWRkb24ubmFtZSk7fVxyXG4gICAgZ2V0QXV0aG9yKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXRBdXRob3IoKSA6IGFkZG9uLmF1dGhvcik7fVxyXG4gICAgZ2V0RGVzY3JpcHRpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldERlc2NyaXB0aW9uKCkgOiBhZGRvbi5kZXNjcmlwdGlvbik7fVxyXG4gICAgZ2V0VmVyc2lvbihhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0VmVyc2lvbigpIDogYWRkb24udmVyc2lvbik7fVxyXG5cclxuICAgIHJlbmRlckNoZWNrVXBkYXRlcygpe1xyXG4gICAgICAgIGlmKCF3aW5kb3cuWmVyZXNQbHVnaW5MaWJyYXJ5KXJldHVybiBudWxsXHJcbiAgICAgICAgaWYoIXdpbmRvdy5QbHVnaW5VcGRhdGVzKXJldHVybiBudWxsXHJcbiAgICAgICAgaWYodHlwZW9mIHdpbmRvdy5QbHVnaW5VcGRhdGVzLmNoZWNrQWxsICE9PSBcImZ1bmN0aW9uXCIpcmV0dXJuIG51bGxcclxuICAgICAgICBpZighdGhpcy5pc1BsdWdpbnMpcmV0dXJuIG51bGxcclxuXHJcbiAgICAgICAgbGV0IHRvb2x0aXBJc1Nob3dpbmcgPSBmYWxzZVxyXG4gICAgICAgIGxldCB0b29sdGlwXHJcbiAgICAgICAgcmV0dXJuIDxUb29sdGlwV3JhcCB0ZXh0PVwiQ2hlY2tzIGZvciB1cGRhdGVzIG9mIHBsdWdpbnMgdGhhdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4gUmlnaHQtY2xpY2sgZm9yIGEgbGlzdC5cIj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3ttYXJnaW5MZWZ0OiBcIjEwcHhcIn19IG9uTW91c2VMZWF2ZT17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBJc1Nob3dpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXAuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiByZWY9XCJjaGVja1VwZGF0ZUJ1dHRvblwiIGNvbG9yPVwiYnJhbmRcIiBsb29rPVwiZmlsbGVkXCIgc2l6ZT1cIm1pblwiIGhvdmVyQ29sb3I9XCJkZWZhdWx0XCIgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiUGx1Z2luIHVwZGF0ZSBjaGVjayBpbiBwcm9ncmVzcy5cIiwge3R5cGU6IFwiaW5mb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LlBsdWdpblVwZGF0ZXMuY2hlY2tBbGwoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJQbHVnaW4gdXBkYXRlIGNoZWNrIGNvbXBsZXRlLlwiLCB7dHlwZTogXCJzdWNjZXNzXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGNoZWNraW5nIHVwZGF0ZS5cIiwge3R5cGU6IFwiZXJyb3JcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgY2hlY2tpbmcgdXBkYXRlLlwiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9fSB3cmFwcGVyPXtmYWxzZX0gZGlzYWJsZWQ9e2ZhbHNlfSBvblJpZ2h0Q2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5yZWZzLmNoZWNrVXBkYXRlQnV0dG9uKXJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LlBsdWdpblVwZGF0ZXMgfHwgIXdpbmRvdy5QbHVnaW5VcGRhdGVzLnBsdWdpbnMpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBpZih0b29sdGlwSXNTaG93aW5nKXJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXAgPSBuZXcgRW11bGF0ZWRUb29sdGlwKHRoaXMucmVmcy5jaGVja1VwZGF0ZUJ1dHRvbi5yZWZzLm9yaWdpbmFsLnJlZnMuYnV0dG9uLCBPYmplY3QudmFsdWVzKHdpbmRvdy5QbHVnaW5VcGRhdGVzLnBsdWdpbnMpLm1hcChwID0+IHAubmFtZSkuam9pbihcIiwgXCIpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZGU6IFwiYm90dG9tXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaEV2ZW50czogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXAuc2hvdygpXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcElzU2hvd2luZyA9IHRydWVcclxuICAgICAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgICAgIENoZWNrIGZvciBVcGRhdGVzXHJcbiAgICAgICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9Ub29sdGlwV3JhcD5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3QgcmVmcmVzaEljb24gPSA8VG9vbHRpcCBjb2xvcj1cImJsYWNrXCIgcG9zaXRpb249XCJ0b3BcIiB0ZXh0PVwiUmVsb2FkIExpc3RcIj5cclxuICAgICAgICAgICAgeyhwcm9wcykgPT4gXHJcbiAgICAgICAgICAgIDxSZWxvYWRJY29uIHsuLi5wcm9wc30gY2xhc3NOYW1lPVwiYmQtaWNvbiBiZC1yZWxvYWQgYmQtcmVsb2FkLWhlYWRlclwiIHNpemU9XCIxOHB4XCIgb25DbGljaz17YXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbHVnaW5zKSBwbHVnaW5Nb2R1bGUudXBkYXRlUGx1Z2luTGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGVtZU1vZHVsZS51cGRhdGVUaGVtZUxpc3QoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcclxuICAgICAgICAgICAgfX0gLz5cclxuICAgICAgICAgICAgfTwvVG9vbHRpcD47XHJcbiAgICAgICAgY29uc3QgYWRkb25DYXJkcyA9IHRoaXMuZ2V0QWRkb25zKCk7XHJcblxyXG4gICAgICAgIHJldHVybiA8Q29udGVudENvbHVtbiB0aXRsZT17YCR7dGhpcy5wcm9wcy50eXBlLnRvVXBwZXJDYXNlKCl94oCUJHthZGRvbkNhcmRzLmxlbmd0aH1gfT5cclxuICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uIGtleT1cImZvbGRlci1idXR0b25cIiBjb2xvcj1cImJyYW5kXCIgXHJcbiAgICAgICAgICAgICAgICBsb29rPVwiZmlsbGVkXCIgc2l6ZT1cIm1pblwiIGhvdmVyQ29sb3I9XCJkZWZhdWx0XCIgb25DbGljaz17dGhpcy5vcGVuRm9sZGVyLmJpbmQodGhpcyl9IHdyYXBwZXI9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiBcIjEwcHhcIlxyXG4gICAgICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICBPcGVuIHt0aGlzLmlzUGx1Z2lucyA/IFwiUGx1Z2luXCIgOiBcIlRoZW1lXCJ9IEZvbGRlclxyXG4gICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICB7dGhpcy5yZW5kZXJDaGVja1VwZGF0ZXMoKX1cclxuICAgICAgICAgICAgeyFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSAmJiByZWZyZXNoSWNvbn1cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1jb250cm9scyBiZC1hZGRvbi1jb250cm9sc1wiPlxyXG4gICAgICAgICAgICAgICAgPFNlYXJjaCBvbkNoYW5nZT17dGhpcy5zZWFyY2h9IHBsYWNlaG9sZGVyPXtgU2VhcmNoICR7dGhpcy5wcm9wcy50eXBlfS4uLmB9IC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWFkZG9uLWRyb3Bkb3duc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+U29ydCBieTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd24gb3B0aW9ucz17dGhpcy5zb3J0T3B0aW9uc30gb25DaGFuZ2U9e3RoaXMuc29ydH0gc3R5bGU9XCJ0cmFuc3BhcmVudFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmQtbGFiZWxcIj5PcmRlcjo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd24gb3B0aW9ucz17dGhpcy5kaXJlY3Rpb25zfSBvbkNoYW5nZT17dGhpcy5yZXZlcnNlfSBzdHlsZT1cInRyYW5zcGFyZW50XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZGEtc2xpc3QgYmQtYWRkb24tbGlzdFwiPnthZGRvbkNhcmRzfTwvZGl2PlxyXG4gICAgICAgIDwvQ29udGVudENvbHVtbj5cclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBDYXJkTGlzdC5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ2FyZExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG59KTsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCRExvZ28gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcInN2Z1wiLFxuICAgICAgICAgICAge2hlaWdodDogXCIxMDAlXCIsIHdpZHRoOiB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHN0eWxlOiB7ZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLCBjbGlwUnVsZTogXCJldmVub2RkXCIsIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIn0sIHZpZXdCb3g6IFwiMCAwIDIwMDAgMjAwMFwifSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcIm1ldGFkYXRhXCIsIG51bGwpLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVmc1wiLCBudWxsLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MVwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMjBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MlwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMTVcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgyNTUsMjU1LDI1NSwwLjE1KVwifSkpLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93M1wifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMTBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MylcIn0sIGQ6IFwiTTExOTUuNDQrMTM1LjQ0MkwxMTk1LjQ0KzEzNS40NDJMOTk3LjYrMTM2LjQ0MkMxMDI0LjIrMTQ5Ljc0MisxMTcwLjM0KzE2My41NDIrMTE5My42NCsxNzkuNzQyQzEyNjQuMzQrMjI4Ljg0MisxMzE5Ljc0KzI5MS4yNDIrMTM1OC4yNCszNjUuMDQyQzEzOTguMTQrNDQxLjY0MisxNDE5Ljc0KzUzMC42NDIrMTQyMi41NCs2MjkuNjQyTDE0MjIuNTQrNjMwLjg0MkwxNDIyLjU0KzYzMi4wNDJDMTQyMi41NCs3NzMuMTQyKzE0MjIuNTQrMTIyOC4xNCsxNDIyLjU0KzEzNjkuMTRMMTQyMi41NCsxMzcwLjM0TDE0MjIuNTQrMTM3MS41NEMxNDE5Ljg0KzE0NzAuNTQrMTM5OC4yNCsxNTU5LjU0KzEzNTguMjQrMTYzNi4xNEMxMzE5Ljc0KzE3MDkuOTQrMTI2NC40NCsxNzcyLjM0KzExOTMuNjQrMTgyMS40NEMxMTcxLjA0KzE4MzcuMTQrMTAyNS43KzE4NTAuNTQrMTAwMCsxODYzLjU0TDExOTMuNTQrMTg2NC41NEMxNTM5Ljc0KzE4NjYuNDQrMTg2NC41NCsxNjkzLjM0KzE4NjQuNTQrMTI5Ni42NEwxODY0LjU0KzcxNi45NDJDMTg2Ni40NCszMTIuNDQyKzE1NDEuNjQrMTM1LjQ0MisxMTk1LjQ0KzEzNS40NDJaXCIsIGZpbGw6IFwiIzE3MTcxN1wiLCBvcGFjaXR5OiBcIjFcIn0pLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MilcIn0sIGQ6IFwiTTE2OTUuNTQrNjMxLjQ0MkMxNjg1Ljg0KzI3OC4wNDIrMTQwOS4zNCsxMzUuNDQyKzEwNTIuOTQrMTM1LjQ0MkwzNjEuNzQrMTM2LjQ0Mkw4MDMuNzQrNDkwLjQ0MkwxMDYwLjc0KzQ5MC40NDJDMTMzNS4yNCs0OTAuNDQyKzEzMzUuMjQrODM1LjM0MisxMDYwLjc0KzgzNS4zNDJMMTA2MC43NCsxMTY0Ljg0QzExNTAuMjIrMTE2NC44NCsxMjEwLjUzKzEyMDEuNDgrMTI0MS42OCsxMjUwLjg3QzEzMDYuMDcrMTM1MysxMjQ1Ljc2KzE1MDkuNjQrMTA2MC43NCsxNTA5LjY0TDM2MS43NCsxODYzLjU0TDEwNTIuOTQrMTg2NC41NEMxNDA5LjI0KzE4NjQuNTQrMTY4NS43NCsxNzIxLjk0KzE2OTUuNTQrMTM2OC41NEMxNjk1LjU0KzEyMDUuOTQrMTY1MS4wNCsxMDg0LjQ0KzE1NzIuNjQrOTk5Ljk0MkMxNjUxLjA0KzkxNS41NDIrMTY5NS41NCs3OTQuMDQyKzE2OTUuNTQrNjMxLjQ0MlpcIiwgZmlsbDogXCIjM0U4MkU1XCIsIG9wYWNpdHk6IFwiMVwifSksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7c3R5bGU6IHtmaWx0ZXI6IFwidXJsKCNzaGFkb3cxKVwifSwgZDogXCJNMTQ2OS4yNSs2MzEuNDQyQzE0NTkuNTUrMjc4LjA0MisxMTgzLjA1KzEzNS40NDIrODI2LjY1KzEzNS40NDJMMTM1LjQ1KzEzNS40NDJMMTM1LjQ1KzEwMDRDMTM1LjQ1KzEwMDQrMTM1LjQyNysxMjU1LjIxKzM1NS42MjYrMTI1NS4yMUM1NzUuODI1KzEyNTUuMjErNTc1Ljg0OCsxMDA0KzU3NS44NDgrMTAwNEw1NzcuNDUrNDkwLjQ0Mkw4MzQuNDUrNDkwLjQ0MkMxMTA4Ljk1KzQ5MC40NDIrMTEwOC45NSs4MzUuMzQyKzgzNC40NSs4MzUuMzQyTDY2NC42NSs4MzUuMzQyTDY2NC42NSsxMTY0Ljg0TDgzNC40NSsxMTY0Ljg0QzkyMy45MzIrMTE2NC44NCs5ODQuMjQ0KzEyMDEuNDgrMTAxNS4zOSsxMjUwLjg3QzEwNzkuNzgrMTM1MysxMDE5LjQ3KzE1MDkuNjQrODM0LjQ1KzE1MDkuNjRMMTM1LjQ1KzE1MDkuNjRMMTM1LjQ1KzE4NjQuNTRMODI2LjY1KzE4NjQuNTRDMTE4Mi45NSsxODY0LjU0KzE0NTkuNDUrMTcyMS45NCsxNDY5LjI1KzEzNjguNTRDMTQ2OS4yNSsxMjA1Ljk0KzE0MjQuNzUrMTA4NC40NCsxMzQ2LjM1Kzk5OS45NDJDMTQyNC43NSs5MTUuNTQyKzE0NjkuMjUrNzk0LjA0MisxNDY5LjI1KzYzMS40NDJaXCIsIGZpbGw6IFwiI0ZGRkZGRlwiLCBvcGFjaXR5OiBcIjFcIn0pXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19DaGVja2JveCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5jaGVja2VkIHx8IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJsaVwiLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3ggXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hFbGVtZW50KVswXS5jaGVja2JveCwgb25DbGljazogdGhpcy5vbkNsaWNrfSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtaW5uZXIgXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hJbm5lcilbMF0uY2hlY2tib3hJbm5lcn0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtjbGFzc05hbWU6IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3hFbGVtZW50LCBjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWQsIG9uQ2hhbmdlOiAoKSA9PiB7fSwgdHlwZTogXCJjaGVja2JveFwifSksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvbkNsaWNrKCkge1xuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMuaWQsICF0aGlzLnN0YXRlLmNoZWNrZWQpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGNoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWRcbiAgICAgICAgfSk7XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgQXJyb3cgZnJvbSBcIi4uL2ljb25zL2Rvd25hcnJvd1wiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7b3BlbjogZmFsc2UsIHZhbHVlOiB0aGlzLnByb3BzLnZhbHVlIHx8IHRoaXMucHJvcHMub3B0aW9uc1swXS52YWx1ZX07XG4gICAgICAgIHRoaXMuZHJvcGRvd24gPSBSZWFjdC5jcmVhdGVSZWYoKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zaG93TWVudSA9IHRoaXMuc2hvd01lbnUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oaWRlTWVudSA9IHRoaXMuaGlkZU1lbnUuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBzaG93TWVudShldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiB0cnVlfSwgKCkgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuaGlkZU1lbnUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoaWRlTWVudSgpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogZmFsc2V9LCAoKSA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oaWRlTWVudSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3ZhbHVlfSk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlKSB0aGlzLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0ZWQoKSB7cmV0dXJuIHRoaXMucHJvcHMub3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PSB0aGlzLnN0YXRlLnZhbHVlKTt9XG5cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtb3B0aW9uc1wiPlxuICAgICAgICAgICAge3RoaXMucHJvcHMub3B0aW9ucy5tYXAob3B0ID0+IFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0LW9wdGlvbiR7c2VsZWN0ZWQudmFsdWUgPT0gb3B0LnZhbHVlID8gXCIgc2VsZWN0ZWRcIiA6IFwiXCJ9YH0gb25DbGljaz17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMsIG9wdC52YWx1ZSl9PntvcHQubGFiZWx9PC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj47XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMucHJvcHMuc3R5bGUgPT0gXCJ0cmFuc3BhcmVudFwiID8gXCIgYmQtc2VsZWN0LXRyYW5zcGFyZW50XCIgOiBcIlwiO1xuICAgICAgICBjb25zdCBpc09wZW4gPSB0aGlzLnN0YXRlLm9wZW4gPyBcIiBtZW51LW9wZW5cIiA6IFwiXCI7XG4gICAgICAgIHJldHVybiAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxBcnJvdyBjbGFzc05hbWU9XCJiZC1zZWxlY3QtYXJyb3dcIiAvPlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cbiAgICAgICAgICAgICAgICA8L2Rpdj47XG4gICAgfVxufVxuXG4vLyByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcFwiPlxuLy8gPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+e3RoaXMucHJvcHMubGFiZWx9PC9sYWJlbD5cbi8vIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0JHtzdHlsZX0ke2lzT3Blbn1gfSBvbkNsaWNrPXt0aGlzLnNob3dNZW51fSByZWY9e3RoaXMuZHJvcGRvd259PlxuLy8gICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWNvbnRyb2xzXCI+XG4vLyAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XG4vLyAgICAgICAgIDxBcnJvdyBjbGFzc05hbWU9XCJiZC1zZWxlY3QtYXJyb3dcIiAvPlxuLy8gICAgIDwvZGl2PlxuLy8gPC9kaXY+XG4vLyB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cbi8vIDwvZGl2PjsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgU2VhcmNoSWNvbiBmcm9tIFwiLi4vaWNvbnMvc2VhcmNoXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGZvY3VzZWQ6IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IFtcImJkLXNlYXJjaC13cmFwcGVyXCJdXHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5mb2N1c2VkKWNsYXNzTmFtZS5wdXNoKFwiZm9jdXNlZFwiKVxyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lLmpvaW4oXCIgXCIpfT5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgb25DaGFuZ2U9e3RoaXMucHJvcHMub25DaGFuZ2V9IG9uS2V5RG93bj17dGhpcy5wcm9wcy5vbktleURvd259IHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmQtc2VhcmNoXCIgcGxhY2Vob2xkZXI9e3RoaXMucHJvcHMucGxhY2Vob2xkZXJ9IG1heExlbmd0aD1cIjUwXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgb25Gb2N1cz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtmb2N1c2VkOiB0cnVlfSlcclxuICAgICAgICAgICAgICAgICAgICB9fSBvbkJsdXI9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Zm9jdXNlZDogZmFsc2V9KVxyXG4gICAgICAgICAgICAgICAgICAgIH19Lz5cclxuICAgICAgICAgICAgICAgICAgICA8U2VhcmNoSWNvbiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge2NoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH07XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnN3aXRjaCA9IDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLlN3aXRjaCBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZX0gdmFsdWU9e3RoaXMuc3RhdGUuY2hlY2tlZH0gLz5cclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2hlY2tlZDogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3dpdGNoXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ29udGVudENvbHVtbiBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGRpc3BsYXlOYW1lKCkge3JldHVybiBcIkNvbnRlbnRDb2x1bW5cIjt9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIC8vbGV0IGNvbnRlbnRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uKVswXVxuICAgICAgICBsZXQgdGl0bGUgPSB0aGlzLnByb3BzLnRpdGxlID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaDJcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LCB0aGlzLnByb3BzLnRpdGxlKSA6IG51bGxcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxuICAgICAgICBdXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge2NsYXNzTmFtZTogY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uICsgXCIgXCIrY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uRGVmYXVsdCtcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCIsIHN0eWxlOiB7cGFkZGluZzogXCI2MHB4IDQwcHggMHB4XCJ9fSxcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxuICAgICAgICApO1xuICAgIH1cbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIlxyXG5cclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgQ2hlY2tib3ggZnJvbSBcIi4vY2hlY2tib3hcIjtcclxuaW1wb3J0IFYyQ19Dc3NFZGl0b3JEZXRhY2hlZCBmcm9tIFwiLi9jc3NFZGl0b3JEZXRhY2hlZFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0Nzc0VkaXRvciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYucHJvcHMubGluZXMgPSAwO1xyXG4gICAgICAgIHNlbGYuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgc2VsZi5hdHRhY2ggPSBzZWxmLmF0dGFjaC5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuZGV0YWNoZWRFZGl0b3IgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX0Nzc0VkaXRvckRldGFjaGVkLCB7YXR0YWNoOiBzZWxmLmF0dGFjaH0pO1xyXG4gICAgICAgIHNlbGYub25DbGljayA9IHNlbGYub25DbGljay5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYudXBkYXRlQ3NzID0gc2VsZi51cGRhdGVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnNhdmVDc3MgPSBzZWxmLnNhdmVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLmRldGFjaCA9IHNlbGYuZGV0YWNoLmJpbmQoc2VsZik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiB0aGlzLnByb3BzLmRldGFjaGVkIHx8IEJEVjIuZWRpdG9yRGV0YWNoZWRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIC8vIHRoaXMudXBkYXRlTGluZUNvdW50KCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3JcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VGhlbWUoXCJhY2UvdGhlbWUvZGlzY29yZFwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9jc3NcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRGb250U2l6ZSgxNCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAocHJldlN0YXRlLmRldGFjaGVkICYmICFzZWxmLnN0YXRlLmRldGFjaGVkKSB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShzZWxmLmRldGFjaGVkUm9vdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvZGVNaXJyb3IoKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY3NzXCIsXHJcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXHJcbiAgICAgICAgICAgIHRoZW1lOiBcIm1hdGVyaWFsXCIsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhclN0eWxlOiBcInNpbXBsZVwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3NzKCkge1xyXG4gICAgICAgIGNvbnN0IF9jY3NzID0gRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIGxldCBjY3NzID0gXCJcIjtcclxuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgY2NzcyA9IEJ1ZmZlci5mcm9tKF9jY3NzLCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjY3NzO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcclxuICAgICAgICBjb25zdCBsaW5lQ291bnQgPSB0aGlzLnJlZnMuZWRpdG9yLnZhbHVlLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcclxuICAgICAgICBpZiAobGluZUNvdW50ID09IHRoaXMucHJvcHMubGluZXMpIHJldHVybjtcclxuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5saW5lcyA9IGxpbmVDb3VudDtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIGNvbnN0IHtkZXRhY2hlZH0gPSBzZWxmLnN0YXRlO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIGRldGFjaGVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7aWQ6IFwiZWRpdG9yLWRldGFjaGVkXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBcIkN1c3RvbSBDU1MgRWRpdG9yXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImgzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBcIkVkaXRvciBEZXRhY2hlZFwiXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdHRhY2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgXCJBdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAhZGV0YWNoZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1hdHRhY2gtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtZ3JvdXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwidXBkYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzJkMmQyZFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzJkMmQyZFwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJkZXRhY2hcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkRldGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc2F2ZWQgY2hhbmdlcyBhcmUgbG9zdCBvbiBkZXRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJoZWxwLXRleHRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlByZXNzIFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiY29kZVwiLCB7Y2xhc3NOYW1lOiBcImlubGluZVwifSwgXCJjdHJsXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIrXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwiaW5saW5lXCJ9LCBcIixcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiB3aXRoIHRoZSBlZGl0b3IgZm9jdXNlZCB0byBhY2Nlc3MgdGhlIGVkaXRvcidzIHNldHRpbmdzLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljayhhcmcpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzd2l0Y2ggKGFyZykge1xyXG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzYXZlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZGV0YWNoXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLmRldGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkKSB7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwibGl2ZS11cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdID0gY2hlY2tlZDtcclxuICAgICAgICAgICAgICAgIFNldHRpbmdzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUNzcygpIHtcclxuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUNzcygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIiwgQnVmZmVyLmZyb20odGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpLCBcInV0Zi04XCIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXRhY2goKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgZHJvb3QgPSBzZWxmLmRldGFjaGVkUm9vdDtcclxuICAgICAgICBpZiAoIWRyb290KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRkFJTEVEIFRPIElOSkVDVCBST09UOiAuYXBwXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHNlbGYuZGV0YWNoZWRFZGl0b3IsIGRyb290KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGV0YWNoZWRSb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdERldGFjaGVkUm9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0RGV0YWNoZWRSb290KCkge1xyXG4gICAgICAgIGNvbnN0IGFwcCA9IERPTS5xdWVyeShcIi5hcHAsIC5cIitVdGlscy5yZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hcHAgJiYgZS5sYXllcnMpWzBdLmFwcCkpO1xyXG4gICAgICAgIGlmICghYXBwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIj5gKSwgYXBwKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2goKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi4vbW9kdWxlcy9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCJcclxuXHJcbmltcG9ydCBDaGVja2JveCBmcm9tIFwiLi9jaGVja2JveFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5vbkNsaWNrID0gc2VsZi5vbkNsaWNrLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuc2F2ZUNzcyA9IHNlbGYuc2F2ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYub25DaGFuZ2UgPSBzZWxmLm9uQ2hhbmdlLmJpbmQoc2VsZik7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmQtZGV0YWNoZWQtZWRpdG9yXCIpO1xyXG4gICAgICAgIEJEVjIuZWRpdG9yRGV0YWNoZWQgPSB0cnVlO1xyXG4gICAgICAgIC8vIHRoaXMudXBkYXRlTGluZUNvdW50KCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3ItZGV0YWNoZWRcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VGhlbWUoXCJhY2UvdGhlbWUvZGlzY29yZFwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9jc3NcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRGb250U2l6ZSgxNCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICBET00ucmVtb3ZlQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZC1kZXRhY2hlZC1lZGl0b3JcIik7XHJcbiAgICAgICAgQkRWMi5lZGl0b3JEZXRhY2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVMaW5lQ291bnQoKSB7XHJcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5yZWZzLmVkaXRvci52YWx1ZS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGxpbmVDb3VudCA9PSB0aGlzLnByb3BzLmxpbmVzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZWZzLmxpbmVzLnRleHRDb250ZW50ID0gQXJyYXkuZnJvbShuZXcgQXJyYXkobGluZUNvdW50KSwgKF8sIGkpID0+IGkgKyAxKS5qb2luKFwiLlxcblwiKSArIFwiLlwiO1xyXG4gICAgICAgIHRoaXMucHJvcHMubGluZXMgPSBsaW5lQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY3NzXCIsXHJcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXHJcbiAgICAgICAgICAgIHRoZW1lOiBcIm1hdGVyaWFsXCIsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhclN0eWxlOiBcInNpbXBsZVwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3NzKCkge1xyXG4gICAgICAgIGNvbnN0IF9jY3NzID0gRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIGxldCBjY3NzID0gXCJcIjtcclxuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgY2NzcyA9IEJ1ZmZlci5mcm9tKF9jY3NzLCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjY3NzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkUm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgYXBwID0gRE9NLnF1ZXJ5KFwiLmFwcCwgLlwiK1V0aWxzLnJlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmFwcCAmJiBlLmxheWVycylbMF0uYXBwKSk7XHJcbiAgICAgICAgaWYgKCFhcHApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBET00uaW5zZXJ0QWZ0ZXIoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiPmApLCBhcHApO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJkLWRldGFjaGVkLWNzcy1lZGl0b3JcIiwgaWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1lZGl0b3JcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWlubmVycGFuZVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImVkaXRvci13cmFwcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmQtY3VzdG9tY3NzLWVkaXRvci1kZXRhY2hlZFwiLCBjbGFzc05hbWU6IFwiZWRpdG9yXCIsIHJlZjogXCJlZGl0b3JcIn0sIHNlbGYuY3NzKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtYXR0YWNoLWNvbnRyb2xzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ1bFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWdyb3VwXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tib3gsIHtpZDogXCJsaXZlLXVwZGF0ZVwiLCB0ZXh0OiBcIkxpdmUgVXBkYXRlXCIsIG9uQ2hhbmdlOiBzZWxmLm9uQ2hhbmdlLCBjaGVja2VkOiBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXX0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRyb2xzLWJ1dHRvblwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIzcHggMCAwIDNweFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInVwZGF0ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVXBkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJzYXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTYXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwIDNweCAzcHggMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwiYXR0YWNoXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2ZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCI1cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVbnNhdmVkIGNoYW5nZXMgYXJlIGxvc3Qgb24gYXR0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQpIHtcclxuICAgICAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXZlLXVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0gPSBjaGVja2VkO1xyXG4gICAgICAgICAgICAgICAgU2V0dGluZ3Muc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljayhpZCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImF0dGFjaFwiOlxyXG4gICAgICAgICAgICAgICAgaWYgKERPTS5xdWVyeShcIiNlZGl0b3ItZGV0YWNoZWRcIikpIHNlbGYucHJvcHMuYXR0YWNoKCk7XHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUoc2VsZi5yb290KTtcclxuICAgICAgICAgICAgICAgIHNlbGYucm9vdC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzYXZlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDc3MoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCB0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVDc3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcImJkY3VzdG9tY3NzXCIsIEJ1ZmZlci5mcm9tKHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSwgXCJ1dGYtOFwiKS50b1N0cmluZyhcImJhc2U2NFwiKSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCREVycm9yQm91bmRhcnkgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgdGhpcy5zdGF0ZSA9IHtoYXNFcnJvcjogZmFsc2V9O1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZENhdGNoKCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7aGFzRXJyb3I6IHRydWV9KTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5oYXNFcnJvcikgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInJlYWN0LWVycm9yXCJ9LCBcIkNvbXBvbmVudCBFcnJvclwiKTsgIFxuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47IFxuICAgIH1cbn1cblxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBCREVycm9yQm91bmRhcnkucHJvdG90eXBlLnJlbmRlcjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCREVycm9yQm91bmRhcnkucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcbn0pOyAiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVsZXRlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMFYwelwiLz48cGF0aCBkPVwiTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnptMi40Ni03LjEybDEuNDEtMS40MUwxMiAxMi41OWwyLjEyLTIuMTIgMS40MSAxLjQxTDEzLjQxIDE0bDIuMTIgMi4xMi0xLjQxIDEuNDFMMTIgMTUuNDFsLTIuMTIgMi4xMi0xLjQxLTEuNDFMMTAuNTkgMTRsLTIuMTMtMi4xMnpNMTUuNSA0bC0xLTFoLTVsLTEgMUg1djJoMTRWNHpcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwelwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb3duQXJyb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwidmFyKC0tdGV4dC1ub3JtYWwpXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4xMiA5LjI5TDEyIDEzLjE3bDMuODgtMy44OGMuMzktLjM5IDEuMDItLjM5IDEuNDEgMCAuMzkuMzkuMzkgMS4wMiAwIDEuNDFsLTQuNTkgNC41OWMtLjM5LjM5LTEuMDIuMzktMS40MSAwTDYuNyAxMC43Yy0uMzktLjM5LS4zOS0xLjAyIDAtMS40MS4zOS0uMzggMS4wMy0uMzkgMS40MiAwelwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6XCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIiAvPlxyXG4gICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJ7LyogPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiIHdpZHRoPVwiMThweFwiIGhlaWdodD1cIjE4cHhcIj5cclxuICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XHJcbiAgICA8cGF0aCBkPVwiTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnpcIi8+XHJcbjwvc3ZnPiAqL31cclxuXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIaXN0b3J5IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMThweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwidmFyKC0tdGV4dC1ub3JtYWwpXCIgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnpcIi8+XHJcbiAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luVG9wNjApWzBdXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcmdpblRvcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGlmKCFtYXJnaW5Nb2R1bGUpbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luVG9wNjApWzBdXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17bWFyZ2luTW9kdWxlLm1hcmdpblRvcDYwfT48L2Rpdj5cbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc0dyb3VwIGZyb20gXCIuL3NldHRpbmdzR3JvdXBcIjtcclxuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHsgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEMgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEN1c3RvbVJpY2hQcmVzZW5jZSBmcm9tIFwiLi4vbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2VcIlxyXG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIjtcclxuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi9tYXJnaW50b3BcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5sZXQgVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QcmVzZW5jZVNldHRpbmdzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiBkYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpIHx8IGRlZmF1bHRSUEMsXHJcbiAgICAgICAgICAgIGFzc2V0czogW11cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJldmlldyA9IG51bGxcclxuICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCl7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMgPSBuZXcgU2V0KClcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVXaGVuRmV0Y2hlZChjb21wKXtcclxuICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5hZGQoY29tcClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtJbnB1dFRleHR9IHNldHRpbmcgXHJcbiAgICAgKi9cclxuICAgIG9uQ2hhbmdlKHNldHRpbmcsIHZhbHVlKXtcclxuICAgICAgICBsZXQgZGVmYXVsdFNldHRpbmcgPSBSUENQcm9wcy5maW5kKGUgPT4gZS5pZCA9PT0gc2V0dGluZy5wcm9wcy5pZClcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIHRoaXMuc3RhdGUuZGF0YSwge1xyXG4gICAgICAgICAgICAgICAgW2RlZmF1bHRTZXR0aW5nLmlkXTogISF2YWx1ZSA/IHZhbHVlIDogbnVsbFxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgYXNzZXRzOiB0aGlzLnN0YXRlLmFzc2V0c1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgaWYoc2V0dGluZy5wcm9wcy5pZCA9PT0gXCJhcHBsaWNhdGlvbl9pZFwiKXtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicnBjXCIsIHNldHRpbmdzUlBDKTtcclxuICAgICAgICB0aGlzLnByZXZpZXcuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIEN1c3RvbVJpY2hQcmVzZW5jZS5zZXQoc2V0dGluZ3NSUEMpXHJcbiAgICB9XHJcblxyXG4gICAgZmV0Y2hBc3NldHMoKXtcclxuICAgICAgICBpZih0aGlzLmlzZmV0Y2hpbmcgPT09IHRydWUpe1xyXG4gICAgICAgICAgICBsZXQgYXBwID0gdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkICE9PSBhcHApe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXHJcbiAgICAgICAgICAgIH0sIDUwMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKXtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gdHJ1ZVxyXG4gICAgICAgIEN1c3RvbVJpY2hQcmVzZW5jZS5mZXRjaEFzc2V0cyh0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpXHJcbiAgICAgICAgLnRoZW4oYXNzZXRzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IE9iamVjdC5rZXlzKGFzc2V0cykubWFwKGsgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhc3NldCA9IGFzc2V0c1trXVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBhc3NldC5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYXNzZXQubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYXNzZXQudHlwZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxyXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlUHJldmlldyhkYXRhKXtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGF0YVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzIHx8IChWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZVxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICA8VjJDX1NldHRpbmdzR3JvdXAgdGl0bGU9XCJSaWNoUHJlc2VuY2UgU2V0dGluZ3NcIiBzZXR0aW5ncz17dGhpcy5wcm9wcy5zZXR0aW5nc30gb25DaGFuZ2U9e3RoaXMucHJvcHMub25DaGFuZ2V9Lz4sXHJcbiAgICAgICAgICAgIDxNYXJnaW5Ub3AgLz4sXHJcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiUmljaFByZXNlbmNlXCIvPixcclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIHsvKiogb3B0aW9ucyAqL31cclxuICAgICAgICAgICAgICAgIHt0aGlzLm9wdGlvbnNDb21wb25lbnRzfVxyXG4gICAgICAgICAgICA8L2Rpdj4sXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8TWFyZ2luVG9wIC8+XHJcbiAgICAgICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIlByZXZpZXdcIi8+XHJcbiAgICAgICAgICAgICAgICB7LyoqIHByZXZpZXcgKi99XHJcbiAgICAgICAgICAgICAgICA8UnBjUHJldmlldyBzZXR0aW5ncz17dGhpc30vPlxyXG4gICAgICAgICAgICA8L2Rpdj4sXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXttYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PjwvZGl2PixcclxuICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT17e29wYWNpdHk6IDAuMDF9fSBvbkNsaWNrPXt3aW5kb3cub2hnb2RvaGZ1Y2t9PlxyXG4gICAgICAgICAgICAgICAgT2ggZ29kIE9oIGZ1Y2tcclxuICAgICAgICAgICAgPC9idXR0b24+LFxyXG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXt7b3BhY2l0eTogMC4wMX19IG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUxrWWE3cnBzX2c0XCIpXHJcbiAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgU2VlID8gSSBwdWxsZWQgYSBsaXRsZSBzbmVha3kgb24geWFcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBvcHRpb25zQ29tcG9uZW50cygpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zQ29tcG9uZW50cyB8fCAodGhpcy5fb3B0aW9uc0NvbXBvbmVudHMgPSBSUENQcm9wcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGUudHlwZSA9PT0gXCJ0ZXh0XCIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxJbnB1dFRleHQgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5cclxuICAgICAgICAgICAgfWVsc2UgaWYoZS50eXBlID09PSBcIm51bWJlclwiKXtcclxuICAgICAgICAgICAgICAgIGxldCBhcnJheSA9IFs8SW5wdXROdW1iZXIgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5dLypcclxuICAgICAgICAgICAgICAgIGlmKGUuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiKXtcclxuICAgICAgICAgICAgICAgICAgICBhcnJheS51bnNoaWZ0KDxEaXNjb3JkQnV0dG9uIHRpdGxlPVwiQ29weSBDdXJyZW50IFRpbWVzdGFtcFwiIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5jbGlwYm9hcmQuY29weShEYXRlLm5vdygpK1wiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgfX0gLz4pXHJcbiAgICAgICAgICAgICAgICB9Ki9cclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVxyXG4gICAgICAgICAgICB9ZWxzZSBpZihlLnR5cGUgPT09IFwiY2hvaWNlXCIpe1xyXG4gICAgICAgICAgICAgICAgaWYoW1wiYXNzZXRzLnNtYWxsXCIsIFwiYXNzZXRzLmxhcmdlXCJdLmluY2x1ZGVzKGUuaWQpKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPElucHV0Q2hvaWNlIHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfSBjaG9pY2VzPXtbe3ZhbHVlOiBcIm5vbmVcIiwgbGFiZWw6IFwiTm8gYXNzZXRzXCJ9XS5jb25jYXQodGhpcy5zdGF0ZS5hc3NldHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiYXNzZXQtXCIrZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pKX0vPlxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiVW5rbm93biBjaG9pY2UuXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKVxyXG4gICAgfVxyXG59XHJcbmNvbnN0IFJQQ1Byb3BzID0gW1xyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkFwcGxpY2F0aW9uIElEXCIsXHJcbiAgICAgICAgaWQ6IFwiYXBwbGljYXRpb25faWRcIixcclxuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIk5hbWVcIixcclxuICAgICAgICBpZDogXCJuYW1lXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiTGlnaHRjb3JkXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiRGV0YWlsc1wiLFxyXG4gICAgICAgIGlkOiBcImRldGFpbHNcIixcclxuICAgICAgICB0eXBlOiBcInRleHRcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCJCcm93c2luZyBEaXNjb3JkXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiU3RhdGVcIixcclxuICAgICAgICBpZDogXCJzdGF0ZVwiLFxyXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkxpZ2h0Y29yZCBDbGllbnRcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJUaW1lc3RhbXAgU3RhcnRcIixcclxuICAgICAgICBpZDogXCJ0aW1lc3RhbXBzLnN0YXJ0XCIsXHJcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcclxuICAgICAgICBnZXQgcGxhY2Vob2xkZXIoKXtcclxuICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KClcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkxhcmdlQXNzZXRcIixcclxuICAgICAgICBpZDogXCJhc3NldHMubGFyZ2VcIixcclxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlNtYWxsQXNzZXRcIixcclxuICAgICAgICBpZDogXCJhc3NldHMuc21hbGxcIixcclxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXHJcbiAgICB9LFxyXG5dXHJcblxyXG5sZXQgaW5wdXRUZXh0TW9kdWxlc1xyXG5jbGFzcyBJbnB1dFRleHQgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgaWYoaW5wdXRUZXh0TW9kdWxlcyAmJiBpbnB1dFRleHRNb2R1bGVzWzBdKXJldHVybiBpbnB1dFRleHRNb2R1bGVzXHJcbiAgICAgICAgcmV0dXJuIGlucHV0VGV4dE1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUxNiAmJiBlLnNpemUyMClbMF0sXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlucHV0ID0gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLlRleHRJbnB1dCBwbGFjZWhvbGRlcj17c2V0dGluZy5wbGFjZWhvbGRlcn0gbmFtZT17c2V0dGluZy5pZH0gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb25DaGFuZ2U9eyh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHZhbHVlXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmxhc3RFZGl0ZWQgfHwgdGhpcy5sYXN0RWRpdGVkIDwgRGF0ZS5ub3coKSAtIDUwMCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCF0aGlzLmlzVGltaW5nKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH19IHR5cGU9XCJ0ZXh0XCIvPlxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIHJvd01vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUyLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcclxuICAgICAgICAgICAgZmxleE1vZHVsZSxcclxuICAgICAgICAgICAgaW5wdXRNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUyLFxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIHt0aGlzLmlucHV0fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPERpdmlkZXIvPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IElucHV0TnVtYmVyTW9kdWxlc1xyXG5jbGFzcyBJbnB1dE51bWJlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gSW5wdXROdW1iZXJNb2R1bGVzIHx8IChJbnB1dE51bWJlck1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUxNiAmJiBlLnNpemUyMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yVHJhbnNwYXJlbnQpWzBdLFxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5wdXQgPSA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuVGV4dElucHV0IHBsYWNlaG9sZGVyPXtzZXR0aW5nLnBsYWNlaG9sZGVyfSBuYW1lPXtzZXR0aW5nLmlkfSB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSB0eXBlPVwibnVtYmVyXCIgb25DaGFuZ2U9eyh2YWx1ZSwgbmFtZSwgaW5wdXQpID0+IHtcclxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcZF0rL2csIFwiXCIpXHJcbiAgICAgICAgICAgIGlmKHZhbHVlID09IHRoaXMuc3RhdGUuZGF0YSl7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH19IHR5cGU9XCJ0ZXh0XCIvPlxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIHJvd01vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUyLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcclxuICAgICAgICAgICAgZmxleE1vZHVsZSxcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAge3RoaXMuaW5wdXR9XHJcbiAgICAgICAgICAgICAgICB7c2V0dGluZy5pZCA9PT0gXCJ0aW1lc3RhbXBzLnN0YXJ0XCIgPyBcclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5jbGlwYm9hcmQuY29weShEYXRlLm5vdygpK1wiXCIpXHJcbiAgICAgICAgICAgICAgICB9fSBjb2xvcj1cImJyYW5kXCI+Q29weSBjdXJyZW50IHRpbWVzdGFtcDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+IDogbnVsbH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxEaXZpZGVyLz5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBJbnB1dENob2ljZU1vZHVsZXNcclxuY2xhc3MgSW5wdXRDaG9pY2UgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdID8gXCJhc3NldC1cIit0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSA6IFwibm9uZVwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJvcHMubWFuYWdlci51cGRhdGVXaGVuRmV0Y2hlZCh0aGlzKVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGRhdGEpe1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IGRhdGEudmFsdWVcclxuXHJcbiAgICAgICAgaWYoIXRoaXMubGFzdEVkaXRlZCB8fCB0aGlzLmxhc3RFZGl0ZWQgPCBEYXRlLm5vdygpIC0gNTAwKXtcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlID09PSBcIm5vbmVcIiA/IG51bGwgOiB2YWx1ZS5yZXBsYWNlKFwiYXNzZXQtXCIsIFwiXCIpKVxyXG4gICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgfWVsc2UgaWYoIXRoaXMuaXNUaW1pbmcpe1xyXG4gICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhID09PSBcIm5vbmVcIiA/IG51bGwgOiB0aGlzLnN0YXRlLmRhdGEucmVwbGFjZShcImFzc2V0LVwiLCBcIlwiKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhOiB2YWx1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIElucHV0Q2hvaWNlTW9kdWxlcyB8fCAoSW5wdXRDaG9pY2VNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb3dNb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuYXNzZXRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBcImFzc2V0LVwiK2UuaWQsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogZS5uYW1lXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBvcHRpb25zLnVuc2hpZnQoe1xyXG4gICAgICAgICAgICB2YWx1ZTogXCJub25lXCIsXHJcbiAgICAgICAgICAgIGxhYmVsOiBcIk5vIGFzc2V0c1wiXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Ecm9wZG93biB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvcHRpb25zPXtvcHRpb25zfSBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpfSAvPlxyXG4gICAgICAgICAgICAgICAgey8qPFNlbGVjdCB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpfSBvcHRpb25zPXtvcHRpb25zfS8+Ki99XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8RGl2aWRlci8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgRGl2aWRlck1vZHVsZXMgPSBbXVxyXG5jbGFzcyBEaXZpZGVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBEaXZpZGVyTW9kdWxlcyYmRGl2aWRlck1vZHVsZXNbMF0gPyBEaXZpZGVyTW9kdWxlcyA6IChEaXZpZGVyTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGl2aWRlciAmJiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IDEpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF1cclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGRpdmlkZXIsXHJcbiAgICAgICAgICAgIGRpdmlkZXJEZWZhdWx0XHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YCR7ZGl2aWRlci5kaXZpZGVyfSAke2RpdmlkZXJEZWZhdWx0LmRpdmlkZXJEZWZhdWx0fWB9PjwvZGl2PlxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBEaXNjb3JkQnV0dG9uIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCByb3dNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXVxyXG4gICAgICAgIGxldCBtYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF1cclxuICAgICAgICBsZXQgZmxleE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9IGNvbG9yPVwiYnJhbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgUnBjUHJldmlldyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBhY3RpdmU6IFwicHJvZmlsZVwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGFicyA9IFtdXHJcblxyXG4gICAgICAgIHRoaXMucHJvcHMuc2V0dGluZ3MucHJldmlldyA9IHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VUYWIodGFiKXtcclxuICAgICAgICBsZXQgYW5jaWVudFRhYiA9IHRoaXMuc3RhdGUuYWN0aXZlXHJcbiAgICAgICAgaWYoYW5jaWVudFRhYiA9PT0gdGFiLnByb3BzLmlkKXJldHVyblxyXG5cclxuICAgICAgICB0aGlzLnRhYnMuZm9yRWFjaChlID0+IHtcclxuICAgICAgICAgICAgZS5zZXRBY3RpdmUoZmFsc2UpXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0YWIuc2V0QWN0aXZlKHRydWUpXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogdGFiLnByb3BzLmlkXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPVwibGMtdGFiV3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYm5hdlwiIHN0eWxlPXt7ZmxleDogXCIwIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICA8VGFiIHByZXZpZXc9e3RoaXN9IHRpdGxlPVwiRnVsbCBQcm9maWxlXCIgaWQ9XCJwcm9maWxlXCIvPlxyXG4gICAgICAgICAgICAgICAgPFRhYiBwcmV2aWV3PXt0aGlzfSB0aXRsZT1cIlVzZXIgUG9wb3V0XCIgaWQ9XCJwb3BvdXRcIi8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8UHJlc2VuY2VFcnJvckNhdGNoZXIgcHJldmlldz17dGhpcy5wcmV2aWV3fSBzdGF0ZT17dGhpcy5zdGF0ZS5ycGN9IHByb3BzPXt7cHJldmlldzogdGhpc319IGtleT17dGhpcy5zdGF0ZS5hY3RpdmV9IC8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfSAgIFxyXG5cclxuICAgIGlzQWN0aXZlKHRhYil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYWN0aXZlID09PSB0YWJcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcHJldmlldygpe1xyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuYWN0aXZlID09PSBcInByb2ZpbGVcIilyZXR1cm4gUHJvZmlsZVxyXG4gICAgICAgIHJldHVybiBQb3BvdXRcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgVGFiIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWN0aXZlOiBwcm9wcy5wcmV2aWV3LmlzQWN0aXZlKHByb3BzLmlkKVxyXG4gICAgICAgIH1cclxuICAgICAgICBwcm9wcy5wcmV2aWV3LnRhYnMucHVzaCh0aGlzKVxyXG4gICAgfVxyXG5cclxuICAgIHNldEFjdGl2ZShpc0FjdGl2ZSl7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogISFpc0FjdGl2ZVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IGNsYXNzTmFtZSA9IGBsYy1uYXZJdGVtYFxyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuYWN0aXZlKXtcclxuICAgICAgICAgICAgY2xhc3NOYW1lICs9IGAgbGMtbmF2SXRlbUFjdGl2ZWBcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY2xhc3NOYW1lICs9IGAgbGMtbmF2SXRlbUluYWN0aXZlYFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWV9IG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMucHJldmlldy5jaGFuZ2VUYWIodGhpcylcclxuICAgICAgICB9fT5cclxuICAgICAgICAgICAge3RoaXMucHJvcHMudGl0bGV9XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgZW1wdHlDbGFzc2VzXHJcbmNsYXNzIFByZXNlbmNlRXJyb3JDYXRjaGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbXBvbmVudERpZENhdGNoKGVyciwgZXJySW5mbyl7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIsIGVyckluZm8pXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGVycm9yOiB0cnVlXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGlmKCF0aGlzLnN0YXRlKXtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgIGVycm9yOiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCF0aGlzLnN0YXRlLmVycm9yKXtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlldyA9IG5ldyB0aGlzLnByb3BzLnByZXZpZXcodGhpcy5wcm9wcy5wcm9wcylcclxuICAgICAgICAgICAgICAgIHByZXZpZXcuc2V0U3RhdGUodGhpcy5wcm9wcy5zdGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aWV3LnJlbmRlcigpXHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVycm9yID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBlbXB0eUNsYXNzZXMgPSBlbXB0eUNsYXNzZXMgfHwgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5lbXB0eVN0YXRlSW1hZ2UgJiYgZS5lbXB0eVN0YXRlKVxyXG4gICAgICAgICAgICBpZighZW1wdHlDbGFzc2VzKXtcclxuICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQuIFBsZWFzZSBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbnMuXCIpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICBtYXJnaW46IFwiMjBweFwiXHJcbiAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPXtgbGMtdGFiLWJveC1zaGFkb3cgJHtlbXB0eUNsYXNzZXMuZW1wdHlTdGF0ZX1gfT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17ZW1wdHlDbGFzc2VzLmVtcHR5U3RhdGVJbWFnZX0gc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiBcIjIwcHhcIlxyXG4gICAgICAgICAgICAgICAgICAgIH19PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17ZW1wdHlDbGFzc2VzLmVtcHR5U3RhdGVIZWFkZXJ9PkFuIGVycm9yIG9jY3VyZWQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9e2VtcHR5Q2xhc3Nlcy5lbXB0eVN0YXRlU3VidGV4dH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbnMuIEpvaW4gb3VyIMKtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzTmFtZT17YCR7QkRWMi5hbmNob3JDbGFzc2VzLmFuY2hvcn0gJHtCRFYyLmFuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gfSByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9ezB9IG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuam9pbkxDKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHNlcnZlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIMKtIGZvciBoZWxwLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBwb3BvdXRNb2R1bGVzXHJcbmxldCBVc2VyUG9wb3V0Q29tcG9uZW50XHJcbmxldCBQb3BvdXRQcm9wc1xyXG5jbGFzcyBQb3BvdXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gcG9wb3V0TW9kdWxlcyB8fCAocG9wb3V0TW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJVc2VyUG9wb3V0XCIpLFxyXG4gICAgICAgICAgICBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29tcG9uZW50KCl7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgVXNlclBvcG91dCxcclxuICAgICAgICAgICAgdXNlck1vZHVsZVxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVuZGVyMSA9IFVzZXJQb3BvdXQuZGVmYXVsdCh7XHJcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHVzZXIuaWQsIFxyXG4gICAgICAgICAgICAgICAgZ3VpbGRJZDogbnVsbCwgXHJcbiAgICAgICAgICAgICAgICBjaGFubmVsSWQ6IG51bGwsIFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZVVzZXJQcm9maWxlTGluazogdHJ1ZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBVc2VyUG9wb3V0Q29tcG9uZW50ID0gcmVuZGVyMS50eXBlXHJcbiAgICAgICAgICAgIFBvcG91dFByb3BzID0gcmVuZGVyMS5wcm9wc1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIoKVxyXG4gICAgICAgIH0sIG51bGwpXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIVVzZXJQb3BvdXRDb21wb25lbnQpcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50KClcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBfVXNlclBvcG91dCxcclxuICAgICAgICAgICAgdXNlck1vZHVsZVxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJQQywgdGhpcy5wcm9wcy5wcmV2aWV3LnByb3BzLnNldHRpbmdzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgY29uc3QgYWN0aXZpdHkgPSAoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgaWYoIXRoaXMuZ2FtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICBsZXQgZ2FtZSA9IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2FtZS5uYW1lIHx8IGRlZmF1bHRSUEMubmFtZSxcclxuICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uX2lkOiB0aGlzLmdhbWUuYXBwbGljYXRpb25faWQgfHwgZGVmYXVsdFJQQy5hcHBsaWNhdGlvbl9pZCxcclxuICAgICAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZ2FtZS5kZXRhaWxzIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHN0YXRlOiB0aGlzLmdhbWUuc3RhdGUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wczogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXSA/IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdID8ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhcmdlX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0sXHJcbiAgICAgICAgICAgICAgICAgICAgc21hbGxfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5zbWFsbFwiXSB8fCB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGdhbWVcclxuICAgICAgICB9KS5jYWxsKHtcclxuICAgICAgICAgICAgZ2FtZTogZGF0YVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIGNvbnN0IHBvcG91dCA9IG5ldyBVc2VyUG9wb3V0Q29tcG9uZW50KE9iamVjdC5hc3NpZ24oe30sIFBvcG91dFByb3BzLCB7XHJcbiAgICAgICAgICAgIGFjdGl2aXR5OiBhY3Rpdml0eSxcclxuICAgICAgICAgICAgdXNlcklkOiB1c2VyLmlkXHJcbiAgICAgICAgfSkpLnJlbmRlcigpLnByb3BzLmNoaWxkcmVuIC8vIGJ5cGFzcyB0cmFja2luZ1xyXG5cclxuICAgICAgICAvLyByZW1vdmUgdGhlIHN0b3AgcHJvcGFnYXRpb24gc2hpdC5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSA8ZGl2IHsuLi53aW5kb3cuTGlnaHRjb3JkLkFwaS5fLmV4Y2x1ZGVQcm9wZXJ0aWVzKHBvcG91dC5wcm9wcywgW1wib25DbGlja1wiLCBcIm9uQ29udGV4dE1lbnVcIl0pfSAvPlxyXG5cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJsYy11c2VyUG9wb3V0IGxjLXRhYi1ib3gtc2hhZG93XCI+XHJcbiAgICAgICAgICAgIHtjb250YWluZXJ9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBwcm9maWxlTW9kdWxlc1xyXG5sZXQgVXNlclByb2ZpbGVDb21wb25lbnRcclxubGV0IFByb2ZpbGVQcm9wc1xyXG5sZXQgY29ubmVjdGVkUHJvZmlsZVN0b3JlXHJcbmNsYXNzIFByb2ZpbGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gcHJvZmlsZU1vZHVsZXMgfHwgKHByb2ZpbGVNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIlVzZXJQcm9maWxlXCIpLFxyXG4gICAgICAgICAgICBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgVXNlclByb2ZpbGUsXHJcbiAgICAgICAgICAgIHVzZXJNb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIGlmKCFVc2VyUHJvZmlsZUNvbXBvbmVudCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcjEgPSBuZXcgVXNlclByb2ZpbGUuZGVmYXVsdCh7XHJcbiAgICAgICAgICAgICAgICB1c2VyOiB1c2VyXHJcbiAgICAgICAgICAgIH0pLnJlbmRlcigpXHJcbiAgICAgICAgICAgIGNvbm5lY3RlZFByb2ZpbGVTdG9yZSA9IHJlbmRlcjEudHlwZVxyXG4gICAgICAgICAgICBjb25zdCByZW5kZXIyID0gbmV3IHJlbmRlcjEudHlwZShyZW5kZXIxLnByb3BzKS5yZW5kZXIoKVxyXG4gICAgICAgICAgICBjb25zdCByZW5kZXIzID0gcmVuZGVyMi50eXBlLnJlbmRlcihyZW5kZXIyLnByb3BzLCBudWxsKVxyXG4gICAgICAgICAgICBjb25zdCByZW5kZXI0ID0gbmV3IHJlbmRlcjMudHlwZShyZW5kZXIzLnByb3BzKS5yZW5kZXIoKVxyXG4gICAgICAgICAgICBVc2VyUHJvZmlsZUNvbXBvbmVudCA9IHJlbmRlcjQudHlwZVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZighVXNlclByb2ZpbGVDb21wb25lbnQpdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHRoZSBVc2VyUHJvZmlsZUNvbXBvbmVudCBjb21wb25lbnQuYClcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcclxuICAgICAgICBjb25zdCBhY3Rpdml0eSA9IChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBpZighdGhpcy5nYW1lKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgIGxldCBnYW1lID0ge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5nYW1lLm5hbWUgfHwgZGVmYXVsdFJQQy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6IHRoaXMuZ2FtZS5hcHBsaWNhdGlvbl9pZCB8fCBkZWZhdWx0UlBDLmFwcGxpY2F0aW9uX2lkLFxyXG4gICAgICAgICAgICAgICAgZGV0YWlsczogdGhpcy5nYW1lLmRldGFpbHMgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgc3RhdGU6IHRoaXMuZ2FtZS5zdGF0ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBzOiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdID8ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXHJcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFyZ2VfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSxcclxuICAgICAgICAgICAgICAgICAgICBzbWFsbF9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLnNtYWxsXCJdIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHR5cGU6IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZ2FtZVxyXG4gICAgICAgIH0pLmNhbGwoe1xyXG4gICAgICAgICAgICBnYW1lOiBkYXRhXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgUHJvZmlsZVByb3BzID0gbmV3IGNvbm5lY3RlZFByb2ZpbGVTdG9yZSh7XHJcbiAgICAgICAgICAgIHVzZXI6IHVzZXIsXHJcbiAgICAgICAgICAgIGNsb3NlOiAoKSA9PiB7fVxyXG4gICAgICAgIH0pLnJlbmRlcigpLnByb3BzXHJcbiAgICAgICAgY29uc3QgcHJvZmlsZSA9IG5ldyBVc2VyUHJvZmlsZUNvbXBvbmVudChPYmplY3QuYXNzaWduKHt9LCBQcm9maWxlUHJvcHMsIHtcclxuICAgICAgICAgICAgYWN0aXZpdHk6IGFjdGl2aXR5XHJcbiAgICAgICAgfSkpLnJlbmRlcigpLnByb3BzLmNoaWxkcmVuIC8vIGJ5cGFzcyB0cmFja2luZ1xyXG5cclxuICAgICAgICBwcm9maWxlLnByb3BzLnN0eWxlID0ge1xyXG4gICAgICAgICAgICB3aWR0aDogXCJhdXRvXCJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYiBsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICB7cHJvZmlsZX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgVG9vbHMgZnJvbSBcIi4uL3Rvb2xzXCI7XHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBUYWJCYXJTZXBhcmF0b3IgZnJvbSBcIi4uL3RhYkJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgVGFiQmFySGVhZGVyIGZyb20gXCIuLi90YWJCYXJIZWFkZXJcIjtcclxuaW1wb3J0IFRhYkJhckl0ZW0gZnJvbSBcIi4uL3RhYkJhckl0ZW1cIjtcclxuXHJcbmltcG9ydCBTZXJ2ZXJDYXJkIGZyb20gXCIuL3NlcnZlckNhcmRcIjtcclxuaW1wb3J0IFNpZGViYXJWaWV3IGZyb20gXCIuL3NpZGViYXJWaWV3XCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUHVibGljU2VydmVycyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5jbG9zZSA9IHRoaXMuY2xvc2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNoYW5nZUNhdGVnb3J5ID0gdGhpcy5jaGFuZ2VDYXRlZ29yeS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNlYXJjaEtleURvd24gPSB0aGlzLnNlYXJjaEtleURvd24uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNoZWNrQ29ubmVjdGlvbiA9IHRoaXMuY2hlY2tDb25uZWN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5qb2luID0gdGhpcy5qb2luLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ID0gdGhpcy5jb25uZWN0LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuR3VpbGRTdG9yZSA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRHdWlsZHNcIl0pO1xyXG4gICAgICAgIHRoaXMuQXZhdGFyRGVmYXVsdHMgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0VXNlckF2YXRhclVSTFwiLCBcIkRFRkFVTFRfQVZBVEFSU1wiXSk7XHJcbiAgICAgICAgdGhpcy5JbnZpdGVBY3Rpb25zID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImFjY2VwdEludml0ZVwiXSk7XHJcbiAgICAgICAgdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFNvcnRlZEd1aWxkc1wiXSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Nvbm5lY3Rpb24oKTtcclxuICAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxyXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHNlcnZlcnM6IFtdLFxyXG4gICAgICAgICAgICBuZXh0OiBudWxsLFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogMCxcclxuICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5jbG9zZSgpXHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoKHF1ZXJ5LCBjbGVhcikge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGZldGNoKGAke3NlbGYuZW5kUG9pbnR9JHtxdWVyeX0ke3F1ZXJ5ID8gXCImc2NoZW1hPW5ld1wiIDogXCI/c2NoZW1hPW5ld1wifWAsIHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcImdldFwiXHJcbiAgICAgICAgfSkudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgYXdhaXQgcmVzLnRleHQoKVxyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlcy5qc29uKClcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBzZXJ2ZXJzID0gZGF0YS5yZXN1bHRzLnJlZHVjZSgoYXJyLCBzZXJ2ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHNlcnZlci5qb2luZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNlcnZlcik7XHJcbiAgICAgICAgICAgICAgICAvLyBhcnIucHVzaCg8U2VydmVyQ2FyZCBzZXJ2ZXI9e3NlcnZlcn0gam9pbj17c2VsZi5qb2lufS8+KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnI7XHJcbiAgICAgICAgICAgIH0sIFtdKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghY2xlYXIpIHtcclxuICAgICAgICAgICAgICAgIHNlcnZlcnMgPSBzZWxmLnN0YXRlLnNlcnZlcnMuY29uY2F0KHNlcnZlcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9zZXJ2ZXJzLnVuc2hpZnQoc2VsZi5iZFNlcnZlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBlbmQgPSBkYXRhLnNpemUgKyBkYXRhLmZyb207XHJcbiAgICAgICAgICAgIGRhdGEubmV4dCA9IGA/ZnJvbT0ke2VuZH1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS50ZXJtKSBkYXRhLm5leHQgKz0gYCZ0ZXJtPSR7c2VsZi5zdGF0ZS50ZXJtfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkpIGRhdGEubmV4dCArPSBgJmNhdGVnb3J5PSR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xyXG4gICAgICAgICAgICBpZiAoZW5kID49IGRhdGEudG90YWwpIHtcclxuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEudG90YWw7XHJcbiAgICAgICAgICAgICAgICBkYXRhLm5leHQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBgU2hvd2luZyAxLSR7ZW5kfSBvZiAke2RhdGEudG90YWx9IHJlc3VsdHMgaW4gJHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnRlcm0pIHRpdGxlICs9IGAgZm9yICR7c2VsZi5zdGF0ZS50ZXJtfWA7XHJcblxyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICAgICAgc2VydmVyczogc2VydmVycyxcclxuICAgICAgICAgICAgICAgIG5leHQ6IGRhdGEubmV4dFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbGVhcikge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhzZWxmKTtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVmcy5zYnYucmVmcy5jb250ZW50U2Nyb2xsZXIuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiRmFpbGVkIHRvIGxvYWQgc2VydmVycy4gQ2hlY2sgY29uc29sZSBmb3IgZGV0YWlsc1wiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgam9pbihzZXJ2ZXJDYXJkKSB7XHJcbiAgICAgICAgaWYgKHNlcnZlckNhcmQucHJvcHMucGlubmVkKSByZXR1cm4gdGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZShzZXJ2ZXJDYXJkLnByb3BzLmludml0ZV9jb2RlKTtcclxuXHJcbiAgICAgICAgYXdhaXQgZmV0Y2goYCR7dGhpcy5qb2luRW5kUG9pbnR9LyR7c2VydmVyQ2FyZC5wcm9wcy5zZXJ2ZXIuaWRlbnRpZmllcn1gLHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc2VydmVyQ2FyZC5zZXRTdGF0ZSh7am9pbmVkOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29ubmVjdCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gc2VsZi53aW5kb3dPcHRpb25zO1xyXG4gICAgICAgIG9wdGlvbnMueCA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblggKyB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgLSBvcHRpb25zLndpZHRoIC8gMik7XHJcbiAgICAgICAgb3B0aW9ucy55ID0gTWF0aC5yb3VuZCh3aW5kb3cuc2NyZWVuWSArIHdpbmRvdy5pbm5lckhlaWdodCAvIDIgLSBvcHRpb25zLmhlaWdodCAvIDIpO1xyXG5cclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cgPSBuZXcgKHdpbmRvdy5yZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLkJyb3dzZXJXaW5kb3cpKG9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IFwiaHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9jb25uZWN0P3Njb3Blcz1ndWlsZHMuam9pbiZwcmV2aW91c1VybD1odHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9cIjtcclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cud2ViQ29udGVudHMub24oXCJkaWQtbmF2aWdhdGVcIiwgKGV2ZW50LCB1cmwpID0+IHtcclxuICAgICAgICAgICAgaWYgKHVybCAhPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb1wiKSByZXR1cm47XHJcbiAgICAgICAgICAgIHNlbGYuam9pbldpbmRvdy5jbG9zZSgpO1xyXG4gICAgICAgICAgICBzZWxmLmNoZWNrQ29ubmVjdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNlbGYuam9pbldpbmRvdy5sb2FkVVJMKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHdpbmRvd09wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6IDUwMCxcclxuICAgICAgICAgICAgaGVpZ2h0OiA1NTAsXHJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMjgyYjMwXCIsXHJcbiAgICAgICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIG1heGltaXphYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgbWluaW1pemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBhbHdheXNPblRvcDogdHJ1ZSxcclxuICAgICAgICAgICAgZnJhbWU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjZW50ZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICB3ZWJQcmVmZXJlbmNlczoge1xyXG4gICAgICAgICAgICAgICAgbm9kZUludGVncmF0aW9uOiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYmRTZXJ2ZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VydmVyID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkJldHRlckRpc2NvcmRcIixcclxuICAgICAgICAgICAgb25saW5lOiBcIjMwMDAwK1wiLFxyXG4gICAgICAgICAgICBtZW1iZXJzOiBcIjcwMDAwK1wiLFxyXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJjb21tdW5pdHlcIiwgXCJwcm9ncmFtbWluZ1wiLCBcInN1cHBvcnRcIl0sXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9mZmljaWFsIEJldHRlckRpc2NvcmQgc2VydmVyIGZvciBzdXBwb3J0IGV0Y1wiLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIsXHJcbiAgICAgICAgICAgIGljb25Vcmw6IFwiaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vaWNvbnMvODYwMDQ3NDQ5NjY5MTQwNDgvMjkyZTdmNmJmZmYyYjcxZGZkMTNlNTA4YTg1OWFlZGQud2VicFwiLFxyXG4gICAgICAgICAgICBuYXRpdmVqb2luOiB0cnVlLFxyXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCIwVG1mbzVaYk9SQ1JxYkFkXCIsXHJcbiAgICAgICAgICAgIHBpbm5lZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc2VydmVyMiA9IHtcclxuICAgICAgICAgICAgbmFtZTogXCJMaWdodGNvcmRcIixcclxuICAgICAgICAgICAgb25saW5lOiBcIjEwMCtcIixcclxuICAgICAgICAgICAgbWVtYmVyczogXCIzMDArXCIsXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IFtcImNvbW11bml0eVwiLCBcInByb2dyYW1taW5nXCIsIFwic3VwcG9ydFwiXSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT2ZmaWNpYWwgTGlnaHRjb3JkIHNlcnZlciBmb3Igc3VwcG9ydCBldGNcIixcclxuICAgICAgICAgICAgaWRlbnRpZmllcjogXCI3MDU5MDgzNTAyMTg2NjYxMTdcIixcclxuICAgICAgICAgICAgaWNvblVybDogXCJodHRwczovL2dpdGh1Yi5jb20vbGlnaHRjb3JkLnBuZ1wiLFxyXG4gICAgICAgICAgICBuYXRpdmVqb2luOiB0cnVlLFxyXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCI3ZUZmZjJBXCIsXHJcbiAgICAgICAgICAgIHBpbm5lZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgZ3VpbGRMaXN0ID0gdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlLmdldEZsYXR0ZW5lZEd1aWxkSWRzKCk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdExpc3QgPSB0aGlzLkF2YXRhckRlZmF1bHRzLkRFRkFVTFRfQVZBVEFSUztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyMiwgcGlubmVkOiB0cnVlLCBqb2luOiB0aGlzLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7c2VydmVyOiBzZXJ2ZXIsIHBpbm5lZDogdHJ1ZSwgam9pbjogdGhpcy5qb2luLCBndWlsZExpc3Q6IGd1aWxkTGlzdCwgZmFsbGJhY2s6IGRlZmF1bHRMaXN0W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDUpXX0pXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbmRQb2ludCgpIHtcclxuICAgICAgICByZXR1cm4gXCJodHRwczovL3NlYXJjaC5kaXNjb3Jkc2VydmVycy5jb21cIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgam9pbkVuZFBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vai5kaXNjb3Jkc2VydmVycy5jb21cIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29ubmVjdEVuZFBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vam9pbi5kaXNjb3Jkc2VydmVycy5jb20vY29ubmVjdFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNoZWNrQ29ubmVjdGlvbigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9gLHtcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcclxuICAgICAgICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXHJcbiAgICAgICAgICAgIGlmKCF0ZXh0KXtcclxuICAgICAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIk5vdCBjb25uZWN0ZWQgdG8gZGlzY29yZHNlcnZlcnMuY29tIVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogLTEsXHJcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcjogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UodGV4dClcclxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAwLFxyXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiAyLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IGRhdGFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHNlbGYuc2VhcmNoKFwiXCIsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJOb3QgY29ubmVjdGVkIHRvIGRpc2NvcmRzZXJ2ZXJzLmNvbSFcIixcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAtMSxcclxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMSxcclxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBudWxsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwicHVic2xheWVycm9vdFwifSwgXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwicHVic2xheWVyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2lkZWJhclZpZXcsIHtyZWY6IFwic2J2XCJ9LCB0aGlzLmNvbXBvbmVudCkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNpZGViYXI6IHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5zaWRlYmFyXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5jb250ZW50XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRvb2xzOiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUb29scywge2tleTogXCJwdFwiLCByZWY6IFwidG9vbHNcIiwgb25DbGljazogdGhpcy5jbG9zZX0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzaWRlYmFyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2lkZWJhclwiLCBrZXk6IFwicHNcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXIgU0lERVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIiwgc3R5bGU6IHtmb250U2l6ZTogXCIxNnB4XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICBcIlB1YmxpYyBTZXJ2ZXJzXCJcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJIZWFkZXIsIHt0ZXh0OiBcIkNhdGVnb3JpZXNcIn0pLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeUJ1dHRvbnMubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhckl0ZW0sIHtpZDogaW5kZXgsIG9uQ2xpY2s6IHRoaXMuY2hhbmdlQ2F0ZWdvcnksIGtleTogaW5kZXgsIHRleHQ6IHZhbHVlLCBzZWxlY3RlZDogdGhpcy5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5ID09PSBpbmRleH0pO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9vdGVyLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWFyY2hJbnB1dCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0taXRlbVwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGV4dC1pbnB1dCBmbGV4LXZlcnRpY2FsXCIsIHN0eWxlOiB7d2lkdGg6IFwiMTcycHhcIiwgbWFyZ2luTGVmdDogXCIxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtyZWY6IFwic2VhcmNoaW5wdXRcIiwgb25LZXlEb3duOiB0aGlzLnNlYXJjaEtleURvd24sIG9uQ2hhbmdlOiAoKSA9PiB7fSwgdHlwZTogXCJ0ZXh0XCIsIGNsYXNzTmFtZTogXCJpbnB1dCBkZWZhdWx0XCIsIHBsYWNlaG9sZGVyOiBcIlNlYXJjaC4uLlwiLCBtYXhMZW5ndGg6IFwiNTBcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaEtleURvd24oZSkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcgfHwgZS53aGljaCAhPT0gMTMpIHJldHVybjtcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxyXG4gICAgICAgICAgICB0ZXJtOiBlLnRhcmdldC52YWx1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBxdWVyeSA9IGA/dGVybT0ke2UudGFyZ2V0LnZhbHVlfWA7XHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeSAhPT0gMCkge1xyXG4gICAgICAgICAgICBxdWVyeSArPSBgJmNhdGVnb3J5PSR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxmLnNlYXJjaChxdWVyeSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhdGVnb3J5QnV0dG9ucygpIHtcclxuICAgICAgICByZXR1cm4gW1wiQWxsXCIsIFwiRlBTIEdhbWVzXCIsIFwiTU1PIEdhbWVzXCIsIFwiU3RyYXRlZ3kgR2FtZXNcIiwgXCJNT0JBIEdhbWVzXCIsIFwiUlBHIEdhbWVzXCIsIFwiVGFibGV0b3AgR2FtZXNcIiwgXCJTYW5kYm94IEdhbWVzXCIsIFwiU2ltdWxhdGlvbiBHYW1lc1wiLCBcIk11c2ljXCIsIFwiQ29tbXVuaXR5XCIsIFwiTGFuZ3VhZ2VcIiwgXCJQcm9ncmFtbWluZ1wiLCBcIk90aGVyXCJdO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZUNhdGVnb3J5KGlkKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO1xyXG4gICAgICAgIHNlbGYucmVmcy5zZWFyY2hpbnB1dC52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IGlkLFxyXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXHJcbiAgICAgICAgICAgIHRlcm06IG51bGxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaWQgPT09IDApIHtcclxuICAgICAgICAgICAgc2VsZi5zZWFyY2goXCJcIiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsZi5zZWFyY2goYD9jYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW2lkXX1gLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29udGVudCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBndWlsZExpc3QgPSB0aGlzLlNvcnRlZEd1aWxkU3RvcmUuZ2V0RmxhdHRlbmVkR3VpbGRJZHMoKTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0TGlzdCA9IHRoaXMuQXZhdGFyRGVmYXVsdHMuREVGQVVMVF9BVkFUQVJTO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmNvbm5lY3Rpb24uc3RhdGUgPT09IDEpIHJldHVybiBzZWxmLm5vdENvbm5lY3RlZDtcclxuICAgICAgICBsZXQgY29sdW1uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbkRlZmF1bHQpWzBdXHJcbiAgICAgICAgcmV0dXJuIFtCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtyZWY6IFwiY29udGVudFwiLCBrZXk6IFwicGNcIiwgY2xhc3NOYW1lOiBjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IHNlbGYuc3RhdGUudGl0bGV9KSxcclxuICAgICAgICAgICAgc2VsZi5iZFNlcnZlcixcclxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5zZXJ2ZXJzLm1hcCgoc2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlcnZlckNhcmQsIHtrZXk6IHNlcnZlci5pZGVudGlmaWVyLCBzZXJ2ZXI6IHNlcnZlciwgam9pbjogc2VsZi5qb2luLCBndWlsZExpc3Q6IGd1aWxkTGlzdCwgZmFsbGJhY2s6IGRlZmF1bHRMaXN0W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDUpXX0pO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5uZXh0ICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS5sb2FkaW5nKSByZXR1cm47c2VsZi5zZXRTdGF0ZSh7bG9hZGluZzogdHJ1ZX0pOyBzZWxmLnNlYXJjaChzZWxmLnN0YXRlLm5leHQsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCBjbGFzc05hbWU6IFwidWktYnV0dG9uIGZpbGxlZCBicmFuZCBzbWFsbCBncm93XCIsIHN0eWxlOiB7d2lkdGg6IFwiMTAwJVwiLCBtYXJnaW5Ub3A6IFwiMTBweFwiLCBtYXJnaW5Cb3R0b206IFwiMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlLmxvYWRpbmcgPyBcIkxvYWRpbmdcIiA6IFwiTG9hZCBNb3JlXCJcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5zZXJ2ZXJzLmxlbmd0aCA+IDAgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlfSlcclxuICAgICAgICApXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbm90Q29ubmVjdGVkKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7IHRleHQ6IHNlbGYuc3RhdGUudGl0bGUgfSk7XHJcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxyXG4gICAgICAgIHJldHVybiBbQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7a2V5OiBcIm5jY1wiLCByZWY6IFwiY29udGVudFwiLCBjbGFzc05hbWU6IGNvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIFwiK2NvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiaDJcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSxcclxuICAgICAgICAgICAgICAgIFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IHNlbGYuY29ubmVjdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogXCIxOHB4XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiBcIjEwcHhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IFwiMTRweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29ubmVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLCBzZWxmLmJkU2VydmVyXHJcbiAgICAgICAgKV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZvb3RlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImFcIixcclxuICAgICAgICAgICAgICAgIHtocmVmOiBcImh0dHBzOi8vZGlzY29yZHNlcnZlcnMuY29tXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICBcIkRpc2NvcmRzZXJ2ZXJzLmNvbVwiXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25uZWN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IHtjb25uZWN0aW9ufSA9IHNlbGYuc3RhdGU7XHJcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IDIpIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwpO1xyXG5cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAge3N0eWxlOiB7Y29sb3I6IFwiI2I5YmJiZVwiLCBmb250U2l6ZTogXCIxMHB4XCIsIG1hcmdpbkxlZnQ6IFwiMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBcIkNvbm5lY3RlZCBhczogXCIsXHJcbiAgICAgICAgICAgICAgICBgJHtjb25uZWN0aW9uLnVzZXIudXNlcm5hbWV9IyR7Y29ubmVjdGlvbi51c2VyLmRpc2NyaW1pbmF0b3J9YFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge3N0eWxlOiB7cGFkZGluZzogXCI1cHggMTBweCAwIDEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7d2lkdGg6IFwiMTAwJVwiLCBtaW5IZWlnaHQ6IFwiMjBweFwifSwgdHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCIsIG9uQ2xpY2s6IHNlbGYuY29ubmVjdH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUmVjb25uZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG59XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2VydmVyQ2FyZCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsKSB0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsID0gdGhpcy5wcm9wcy5mYWxsYmFjaztcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGltYWdlRXJyb3I6IGZhbHNlLFxuICAgICAgICAgICAgam9pbmVkOiB0aGlzLnByb3BzLmd1aWxkTGlzdC5pbmNsdWRlcyh0aGlzLnByb3BzLnNlcnZlci5pZGVudGlmaWVyKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge3NlcnZlcn0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgY2FyZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNhcmQgJiYgZS5jYXJkUHJpbWFyeSlbMF1cbiAgICAgICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbGV4Q2hpbGQgJiYgZS5faG9yaXpvbnRhbFJldmVyc2UpWzBdXG4gICAgICAgIGxldCB3cmFwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubm9XcmFwICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWQpWzBdXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcImRpdlwiLCAvLyBjYXJkUHJpbWFyeS0xSHYtdG9cbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGAke2NhcmRNb2R1bGUuY2FyZH0gJHtjYXJkTW9kdWxlLmNhcmRQcmltYXJ5fSAke0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTgpWzBdLm1hcmdpbkJvdHRvbTh9IGJkLXNlcnZlci1jYXJkJHtzZXJ2ZXIucGlubmVkID8gXCIgYmQtc2VydmVyLWNhcmQtcGlubmVkXCIgOiBcIlwifWB9LFxuICAgICAgICAgICAgLy8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgIC8vIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgLy8geyBjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZmxleC0xTzFHS1kgZGlyZWN0aW9uUm93LTN2M3RmRyBqdXN0aWZ5U3RhcnQtMnlJWm8wIGFsaWduU3RyZXRjaC0xaHd4TWEgbm9XcmFwLTNqeW52NlwiIH0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtyZWY6IFwiaW1nXCIsIGNsYXNzTmFtZTogXCJiZC1zZXJ2ZXItaW1hZ2VcIiwgc3JjOiBzZXJ2ZXIuaWNvblVybCwgb25FcnJvcjogdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpLCBkcmFnZ2FibGU6IGZhbHNlfSksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBmbGV4TW9kdWxlLmZsZXhDaGlsZCtcIiBiZC1zZXJ2ZXItY29udGVudFwifSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuaG9yaXpvbnRhbCtcIiBcIit3cmFwTW9kdWxlLm5vV3JhcCtcIiBiZC1zZXJ2ZXItaGVhZGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaDVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImg1LTE4XzFuZCBkZWZhdWx0Q29sb3ItMV9halgwIG1hcmdpbi1yZXNldCBiZC1zZXJ2ZXItbmFtZVwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImg1XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJoNS0xOF8xbmQgZGVmYXVsdENvbG9yLTFfYWpYMCBtYXJnaW4tcmVzZXQgYmQtc2VydmVyLW1lbWJlci1jb3VudFwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIubWVtYmVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBNZW1iZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuaG9yaXpvbnRhbCtcIiBcIit3cmFwTW9kdWxlLm5vV3JhcH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyV3JhcC0ybEpFa2Qgc2Nyb2xsZXJUaGVtZWQtMm9lbnVzIHRoZW1lR2hvc3RIYWlybGluZS1EQkQtMmQgc2Nyb2xsZXJGYWRlLTFJanc1eSBiZC1zZXJ2ZXItZGVzY3JpcHRpb24tY29udGFpbmVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzY3JvbGxlci0yRktGUEcgc2Nyb2xsZXIgYmQtc2VydmVyLWRlc2NyaXB0aW9uXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmRlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJmbGV4LTF4TVFnNSBmbGV4LTFPMUdLWSBob3Jpem9udGFsLTFhZTljaSBob3Jpem9udGFsLTJFRUVuWSBkaXJlY3Rpb25Sb3ctM3YzdGZHIG5vV3JhcC0zanludjYgYmQtc2VydmVyLWZvb3RlclwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZmxleENoaWxkLWZhb1ZXMyBiZC1zZXJ2ZXItdGFnc1wiLCBzdHlsZToge2ZsZXg6IFwiMSAxIGF1dG9cIn19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5jYXRlZ29yaWVzLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuam9pbmVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYnV0dG9uLTM4YVNjciBsb29rRmlsbGVkLTFHeDAwUCBjb2xvckJyYW5kLTNwWHI5MSBzaXplTWluLTFtSmQxeCBncm93LXE3N09OTiBjb2xvckdyZWVuLTI5aUFLWVwiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIiwgYmFja2dyb3VuZENvbG9yOiBcIiMzYWMxNWNcIn19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSm9pbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmVycm9yICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYnV0dG9uLTM4YVNjciBsb29rRmlsbGVkLTFHeDAwUCBjb2xvckJyYW5kLTNwWHI5MSBzaXplTWluLTFtSmQxeCBncm93LXE3N09OTiBkaXNhYmxlZC05YUYydWdcIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCIsIGJhY2tncm91bmRDb2xvcjogXCIjYzEzYTNhXCJ9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlcnZlci5lcnJvciAmJiAhdGhpcy5zdGF0ZS5qb2luZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwifSwgb25DbGljazogKCkgPT4ge3RoaXMuam9pbigpO319LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSm9pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgLy8gKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGhhbmRsZUVycm9yKCkge1xuICAgICAgICB0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsID0gdGhpcy5wcm9wcy5mYWxsYmFjaztcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW1hZ2VFcnJvcjogdHJ1ZX0pO1xuICAgIH1cblxuICAgIGpvaW4oKSB7XG4gICAgICAgIHRoaXMucHJvcHMuam9pbih0aGlzKTtcbiAgICAgICAgLy90aGlzLnNldFN0YXRlKHtqb2luZWQ6IHRydWV9KTtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcblxuaW1wb3J0IFNjcm9sbGVyIGZyb20gXCIuLi9zY3JvbGxlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2lkZWJhclZpZXcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtzaWRlYmFyLCBjb250ZW50LCB0b29sc30gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2kgdWktc3RhbmRhcmQtc2lkZWJhci12aWV3XCJ9LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzaWRlYmFyUmVnaW9uLVZGVFVrTiBzaWRlYmFyLXJlZ2lvblwifSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsZXIsIHtrZXk6IFwic2lkZWJhclNjcm9sbGVyXCIsIHJlZjogXCJzaWRlYmFyU2Nyb2xsZXJcIiwgc2lkZWJhcjogdHJ1ZSwgZmFkZTogc2lkZWJhci5mYWRlIHx8IHRydWUsIGRhcms6IHNpZGViYXIuZGFyayB8fCB0cnVlfSwgc2lkZWJhci5jb21wb25lbnQpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiY29udGVudFJlZ2lvbi0zbkR1WXkgY29udGVudC1yZWdpb25cIn0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiY29udGVudFRyYW5zaXRpb25XcmFwLTNocU9FVyBjb250ZW50LXRyYW5zaXRpb24td3JhcFwifSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwic2Nyb2xsZXJXcmFwLTJsSkVrZCBmaXJlZm94Rml4U2Nyb2xsRmxleC1jbkkyaXggY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcC0zWVpYZG0gY29udGVudC1yZWdpb24tc2Nyb2xsZXItd3JhcCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdC0yOE1TbjAgc2Nyb2xsZXJUcmFjay0xWklwc3ZcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJzY3JvbGxlci0yRktGUEcgZmlyZWZveEZpeFNjcm9sbEZsZXgtY25JMml4IGNvbnRlbnRSZWdpb25TY3JvbGxlci0yNm5jMWUgY29udGVudC1yZWdpb24tc2Nyb2xsZXIgc2Nyb2xsZXJcIiwgcmVmOiBcImNvbnRlbnRTY3JvbGxlclwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJjb250ZW50Q29sdW1uLTJocklZSCBjb250ZW50Q29sdW1uRGVmYXVsdC0xVlFrR00gY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSwgY29udGVudC5jb21wb25lbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xzLmNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUmVsb2FkSWNvbiBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgICAgICAgICAgICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgICAgICAgICAgICAgdmlld0JveDogXCIwIDAgMjQgMjRcIixcbiAgICAgICAgICAgICAgICBmaWxsOiBcIiNkY2RkZGVcIixcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtcmVsb2FkIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgb25DbGljazogdGhpcy5wcm9wcy5vbkNsaWNrLFxuICAgICAgICAgICAgICAgIHN0eWxlOiB7d2lkdGg6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIiwgaGVpZ2h0OiB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCJ9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZDogXCJNMTcuNjUgNi4zNUMxNi4yIDQuOSAxNC4yMSA0IDEyIDRjLTQuNDIgMC03Ljk5IDMuNTgtNy45OSA4czMuNTcgOCA3Ljk5IDhjMy43MyAwIDYuODQtMi41NSA3LjczLTZoLTIuMDhjLS44MiAyLjMzLTMuMDQgNC01LjY1IDQtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNmMxLjY2IDAgMy4xNC42OSA0LjIyIDEuNzhMMTMgMTFoN1Y0bC0yLjM1IDIuMzV6XCJ9KSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6IFwibm9uZVwiLCBkOiBcIk0wIDBoMjR2MjRIMHpcIn0pXG4gICAgICAgICk7XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2Nyb2xsZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgLy9zY3JvbGxlcldyYXAtMmxKRWtkIHNjcm9sbGVyVGhlbWVkLTJvZW51cyB0aGVtZUdob3N0SGFpcmxpbmUtREJELTJkIHNjcm9sbGVyRmFkZS0xSWp3NXlcclxuICAgICAgICBsZXQgc2Nyb2xsZXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXJIb3Jpem9udGFsKVswXVxyXG4gICAgICAgIGxldCBzY3JvbGxlck1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaWRlYmFyUmVnaW9uU2Nyb2xsZXIpWzBdXHJcbiAgICAgICAgbGV0IHdyYXBwZXJDbGFzcyA9IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0SGFpcmxpbmV9JHt0aGlzLnByb3BzLmZhZGUgPyBcIiBcIitzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJGYWRlIDogXCJcIn1gO1xyXG4gICAgICAgIGxldCBzY3JvbGxlckNsYXNzID0gc2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyK1wiIHNjcm9sbGVyXCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVjayAqL1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNpZGViYXIpIHNjcm9sbGVyQ2xhc3MgKz0gYCAke3Njcm9sbGVyTW9kdWxlMi5zaWRlYmFyUmVnaW9uU2Nyb2xsZXJ9IHNpZGViYXItcmVnaW9uLXNjcm9sbGVyYFxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmNvbnRlbnRDb2x1bW4pIHtcclxuICAgICAgICAgICAgc2Nyb2xsZXJDbGFzcyArPSBcIiBcIitzY3JvbGxlck1vZHVsZTIuY29udGVudFJlZ2lvblNjcm9sbGVyK1wiIGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyXCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWNrICovXHJcbiAgICAgICAgICAgIHdyYXBwZXJDbGFzcyA9IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUyLmNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXB9IGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyLXdyYXAgICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0fSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRyYWNrfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHtjaGlsZHJlbn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtrZXk6IFwic2Nyb2xsZXJ3cmFwXCIsIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtrZXk6IFwic2Nyb2xsZXJcIiwgcmVmOiBcInNjcm9sbGVyXCIsIGNsYXNzTmFtZTogc2Nyb2xsZXJDbGFzc30sXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlblxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBWMkNfU2Nyb2xsZXIucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFYyQ19TY3JvbGxlci5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbn0pOyAiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5pbXBvcnQgU2V0dGluZ3NHcm91cCBmcm9tIFwiLi9zZXR0aW5nc0dyb3VwXCI7XG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc2VjdGlvbnMubWFwKChzZWN0aW9uLCBpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGkgIT09IDAgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFyZ2luVG9wLCB7fSkgOiBudWxsLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc0dyb3VwLCBPYmplY3QuYXNzaWduKHt9LCBzZWN0aW9uLCB7b25DaGFuZ2U6IHRoaXMucHJvcHMub25DaGFuZ2V9KSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICB9XG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuL3N3aXRjaFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NHcm91cCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge3RpdGxlLCBzZXR0aW5ncywgYnV0dG9ufSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbXBvbmVudCA9IGJ1dHRvbiA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7a2V5OiBcInRpdGxlLWJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYmQtcGZidG5cIiwgb25DbGljazogYnV0dG9uLm9uQ2xpY2t9LCBidXR0b24udGl0bGUpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIFtCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IHRpdGxlfSksXG4gICAgICAgICAgICAgICAgYnV0dG9uQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIHNldHRpbmdzLm1hcChzZXR0aW5nID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtpZDogc2V0dGluZy5pZCwga2V5OiBzZXR0aW5nLmlkLCBkYXRhOiBzZXR0aW5nLCBjaGVja2VkOiBzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nLmlkXSwgb25DaGFuZ2U6IChpZCwgY2hlY2tlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShpZCwgY2hlY2tlZCk7XG4gICAgICAgICAgICAgICAgICAgIH19KTtcbiAgICAgICAgICAgICAgICB9KV07XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXR0aW5nc1RpdGxlIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cbi8vaDItMmdXRS1vIHRpdGxlLTNzWldZUSBzaXplMTYtMTRjR3o1IGhlaWdodDIwLW1PMmVJTiB3ZWlnaHRTZW1pQm9sZC1OSmV4emkgZGEtaDIgZGEtdGl0bGUgZGEtc2l6ZTE2IGRhLWhlaWdodDIwIGRhLXdlaWdodFNlbWlCb2xkIGRlZmF1bHRDb2xvci0xX2FqWDAgZGEtZGVmYXVsdENvbG9yIG1hcmdpblRvcDYwLTNQR2J0SyBkYS1tYXJnaW5Ub3A2MCBtYXJnaW5Cb3R0b20yMC0zMnFJRDcgZGEtbWFyZ2luQm90dG9tMjBcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcImgyXCIsXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sXG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcbiAgICAgICAgKTtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9jb21wb25lbnRzL3N3aXRjaFwiO1xyXG5cclxubGV0IGNsYXNzbmFtZXMgPSBbXVxyXG5mdW5jdGlvbiBnZXRDbGFzc05hbWUobmFtZSl7XHJcbiAgICBsZXQgY2xhc3NOYW1lID0gY2xhc3NuYW1lcy5maW5kKGUgPT4gZS5zdGFydHNXaXRoKG5hbWUrXCItXCIpKVxyXG4gICAgaWYoY2xhc3NOYW1lKXJldHVybiBjbGFzc05hbWVcclxuICAgIGNsYXNzTmFtZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlW25hbWVdKVswXVtuYW1lXVxyXG4gICAgY2xhc3NuYW1lcy5wdXNoKGNsYXNzTmFtZSlcclxuICAgIHJldHVybiBjbGFzc05hbWVcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3dpdGNoSXRlbSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5jaGVja2VkID0gIXRoaXMucHJvcHMuY2hlY2tlZDtcclxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMuaWQsIHRoaXMucHJvcHMuY2hlY2tlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCB7dGV4dCwgaW5mb30gPSB0aGlzLnByb3BzLmRhdGE7XHJcbiAgICAgICAgaWYoIWNsYXNzbmFtZXMuZmluZChlID0+IGUuc3RhcnRzV2l0aChcImJldGEtXCIpKSl7XHJcbiAgICAgICAgICAgIGNsYXNzbmFtZXMucHVzaChCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iZXRhICYmICghZS5jb250YWluZXIgJiYgIWUudXNlclNldHRpbmdzVm9pY2UpKVswXS5iZXRhKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLnByb3BzLmRhdGEuZXhwZXJpbWVudGFsKXtcclxuICAgICAgICAgICAgaW5mbyA9IFtcclxuICAgICAgICAgICAgICAgIGluZm8sXHJcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3VwXCIsIHtjbGFzc05hbWU6IGdldENsYXNzTmFtZShcImJldGFcIil9LCBcIihFWFBFUklNRU5UQUwpXCIpXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZsZXggZmxleC12ZXJ0aWNhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwIHVpLXN3aXRjaC1pdGVtXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mbGV4IGZsZXgtaG9yaXpvbnRhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge2tleTogXCJ0aXRsZVwiLCBjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMyBtYXJnaW4tcmVzZXQgbWFyZ2luLXJlc2V0IHVpLWZsZXgtY2hpbGRcIn0sIHRleHQpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2tleTogXCJzd2l0Y2hcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH0pXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGV4dCBzdHlsZS1kZXNjcmlwdGlvbiBtYXJnaW4tdG9wLTRcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSwgaW5mbylcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1RhYkJhckhlYWRlciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCJ9LCB0aGlzLnByb3BzLnRleHQsIHRoaXMucHJvcHMuYnV0dG9uKTtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1RhYkJhckl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMucHJvcHMuc2VsZWN0ZWQgfHwgZmFsc2VcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge2NsYXNzTmFtZTogYHVpLXRhYi1iYXItaXRlbSR7dGhpcy5wcm9wcy5zZWxlY3RlZCA/IFwiIHNlbGVjdGVkXCIgOiBcIlwifWAsIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvbkNsaWNrKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2xpY2sodGhpcy5wcm9wcy5pZCk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1RhYkJhclNlcGFyYXRvciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLXNlcGFyYXRvciBtYXJnaW4tdG9wLTggbWFyZ2luLWJvdHRvbS04XCJ9KTtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcblxuaW1wb3J0IFhTdmcgZnJvbSBcIi4veFN2Z1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVG9vbHMgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgdG9vbHNNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b29sc0NvbnRhaW5lcilbMF1cbiAgICAgICAgbGV0IGNvbnRhaW5lck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRhaW5lciAmJiBlLmNsb3NlQnV0dG9uICYmIGUuY2xvc2VCdXR0b25Cb2xkKVswXVxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidG9vbHMtY29udGFpbmVyIFwiK3Rvb2xzTW9kdWxlLnRvb2xzQ29udGFpbmVyfSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInRvb2xzIFwiK3Rvb2xzTW9kdWxlLnRvb2xzfSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY29udGFpbmVyTW9kdWxlLmNvbnRhaW5lcn0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJidG4tY2xvc2UgXCIrY29udGFpbmVyTW9kdWxlLmNsb3NlQnV0dG9uLCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFhTdmcsIG51bGwpXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImVzYy10ZXh0IFwiK2NvbnRhaW5lck1vZHVsZS5rZXliaW5kfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRVNDXCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvbkNsaWNrKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2xvc2VCdXR0b24gJiYgZS5rZXliaW5kQm9sZClbMF0uY2xvc2VCdXR0b24uc3BsaXQoXCIgXCIpWzBdKTtcbiAgICAgICAgaWYgKGNsb3NlQnV0dG9uKSBjbG9zZUJ1dHRvbi5jbGljaygpO1xuICAgIH1cbn0iLCIvKipcclxuICogVG9vbHRpcCB0aGF0IGF1dG9tYXRpY2FsbHkgc2hvdyBhbmQgaGlkZSB0aGVtc2VsdmVzIG9uIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzLlxyXG4gKiBXaWxsIGFsc28gcmVtb3ZlIHRoZW1zZWx2ZXMgaWYgdGhlIG5vZGUgdG8gd2F0Y2ggaXMgcmVtb3ZlZCBmcm9tIERPTSB0aHJvdWdoXHJcbiAqIGEgTXV0YXRpb25PYnNlcnZlci5cclxuICpcclxuICogTm90ZSB0aGlzIGlzIG5vdCB1c2luZyBEaXNjb3JkJ3MgaW50ZXJuYWxzIGJ1dCBub3JtYWwgRE9NIG1hbmlwdWxhdGlvbiBhbmQgZW11bGF0ZXNcclxuICogRGlzY29yZCdzIG93biB0b29sdGlwcyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLlxyXG4gKlxyXG4gKiBAbW9kdWxlIEVtdWxhdGVkVG9vbHRpcFxyXG4gKiBAdmVyc2lvbiAwLjAuMVxyXG4gKi9cclxuXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4uL21vZHVsZXMvd2VicGFja01vZHVsZXNcIjtcclxubGV0IFRvb2x0aXBDbGFzc2VzXHJcbmZ1bmN0aW9uIGdldFRvb2x0aXBDbGFzc2VzKCl7XHJcblx0aWYoVG9vbHRpcENsYXNzZXMpcmV0dXJuIFRvb2x0aXBDbGFzc2VzXHJcblx0cmV0dXJuIFRvb2x0aXBDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJ0b29sdGlwXCIsIFwidG9vbHRpcEJsYWNrXCIpO1xyXG59XHJcbmxldCBUb29sdGlwTGF5ZXJzXHJcbmZ1bmN0aW9uIGdldFRvb2x0aXBMYXllcnMoKXtcclxuXHRpZihUb29sdGlwTGF5ZXJzKXJldHVybiBUb29sdGlwTGF5ZXJzXHJcblx0cmV0dXJuIFRvb2x0aXBMYXllcnMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImxheWVyXCIsIFwibGF5ZXJDb250YWluZXJcIik7XHJcbn1cclxuXHJcbmNvbnN0IGdldENsYXNzID0gZnVuY3Rpb24oc2lkZU9yQ29sb3IpIHtcclxuICAgIGNvbnN0IHVwcGVyQ2FzZSA9IHNpZGVPckNvbG9yWzBdLnRvVXBwZXJDYXNlKCkgKyBzaWRlT3JDb2xvci5zbGljZSgxKTtcclxuICAgIGNvbnN0IHRvb2x0aXBDbGFzcyA9IGdldFRvb2x0aXBDbGFzc2VzKClbYHRvb2x0aXAke3VwcGVyQ2FzZX1gXTtcclxuICAgIGlmICh0b29sdGlwQ2xhc3MpIHJldHVybiB0b29sdGlwQ2xhc3M7XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGNsYXNzRXhpc3RzID0gZnVuY3Rpb24oc2lkZU9yQ29sb3IpIHtcclxuICAgIHJldHVybiBnZXRDbGFzcyhzaWRlT3JDb2xvcikgPyB0cnVlIDogZmFsc2U7XHJcbn07XHJcblxyXG5jb25zdCB0b1B4ID0gZnVuY3Rpb24odmFsdWUpIHtcclxuICAgIHJldHVybiBgJHt2YWx1ZX1weGA7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbXVsYXRlZFRvb2x0aXAge1xyXG5cdC8qKlxyXG5cdCAqXHJcblx0ICogQGNvbnN0cnVjdG9yXHJcblx0ICogQHBhcmFtIHsoSFRNTEVsZW1lbnR8alF1ZXJ5KX0gbm9kZSAtIERPTSBub2RlIHRvIG1vbml0b3IgYW5kIHNob3cgdGhlIHRvb2x0aXAgb25cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGlwIC0gc3RyaW5nIHRvIHNob3cgaW4gdGhlIHRvb2x0aXBcclxuXHQgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIHRvb2x0aXBcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc3R5bGU9YmxhY2tdIC0gY29ycmVsYXRlcyB0byB0aGUgZGlzY29yZCBzdHlsaW5nL2NvbG9ycyAoYmxhY2ssIGJyYW5kLCBncmVlbiwgZ3JleSwgcmVkLCB5ZWxsb3cpXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNpZGU9dG9wXSAtIGNhbiBiZSBhbnkgb2YgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5wcmV2ZW50RmxpcD1mYWxzZV0gLSBwcmV2ZW50cyBtb3ZpbmcgdGhlIHRvb2x0aXAgdG8gdGhlIG9wcG9zaXRlIHNpZGUgaWYgaXQgaXMgdG9vIGJpZyBvciBnb2VzIG9mZnNjcmVlblxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kaXNhYmxlZD1mYWxzZV0gLSB3aGV0aGVyIHRoZSB0b29sdGlwIHNob3VsZCBiZSBkaXNhYmxlZCBmcm9tIHNob3dpbmcgb24gaG92ZXJcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXR0YWNoRXZlbnRzPXRydWVdIC0gd2hldGhlciB0aGUgdG9vbHRpcCBzaG91bGQgbGlzdGVuIHRvIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKG5vZGUsIHRleHQsIG9wdGlvbnMgPSB7fSkge1xyXG5cdFx0Y29uc3Qge3N0eWxlID0gXCJibGFja1wiLCBzaWRlID0gXCJ0b3BcIiwgcHJldmVudEZsaXAgPSBmYWxzZSwgZGlzYWJsZWQgPSBmYWxzZSwgYXR0YWNoRXZlbnRzID0gdHJ1ZX0gPSBvcHRpb25zO1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZSBpbnN0YW5jZW9mIGpRdWVyeSA/IG5vZGVbMF0gOiBub2RlO1xyXG4gICAgICAgIHRoaXMubGFiZWwgPSB0ZXh0O1xyXG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0dGhpcy5zaWRlID0gc2lkZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHRoaXMucHJldmVudEZsaXAgPSBwcmV2ZW50RmxpcDtcclxuICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XHJcblxyXG4gICAgICAgIGlmICghY2xhc3NFeGlzdHModGhpcy5zaWRlKSkgcmV0dXJuIFV0aWxzLmVycihcIkVtdWxhdGVkVG9vbHRpcFwiLCBgU2lkZSAke3RoaXMuc2lkZX0gZG9lcyBub3QgZXhpc3QuYCk7XHJcblx0XHRpZiAoIWNsYXNzRXhpc3RzKHRoaXMuc3R5bGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTdHlsZSAke3RoaXMuc3R5bGV9IGRvZXMgbm90IGV4aXN0LmApO1xyXG5cdFx0XHJcblx0XHR0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0dGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBMYXllcnMoKS5sYXllciArIFwiIFwiICsgZ2V0VG9vbHRpcExheWVycygpLmRpc2FibGVkUG9pbnRlckV2ZW50cztcclxuXHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7Z2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwfSAke2dldENsYXNzKHRoaXMuc3R5bGUpfWA7XHJcblxyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwQ29udGVudFxyXG5cclxuXHRcdGNvbnN0IHBvaW50ZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHBvaW50ZXJFbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcFBvaW50ZXI7XHJcblxyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5hcHBlbmQocG9pbnRlckVsZW1lbnQpO1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5hcHBlbmQodGhpcy5sYWJlbEVsZW1lbnQpO1xyXG5cdFx0dGhpcy5lbGVtZW50LmFwcGVuZCh0aGlzLnRvb2x0aXBFbGVtZW50KTtcclxuXHJcblx0XHRpZihhdHRhY2hFdmVudHMpe1xyXG5cdFx0XHR0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgKCkgPT4ge1xyXG5cdFx0XHRcdGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcblx0XHRcdFx0dGhpcy5zaG93KCk7XHJcblx0XHJcblx0XHRcdFx0Y29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcblx0XHRcdFx0XHRtdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZih0aGlzLm5vZGUpID4gLTE7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKHRoaXMubm9kZSkpO1xyXG5cdFx0XHRcdFx0XHRpZiAoZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2gpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmhpZGUoKTtcclxuXHRcdFx0XHRcdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFxyXG5cdFx0XHRcdG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pO1xyXG5cdFx0XHR9KTtcclxuXHRcclxuXHRcdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsICgpID0+IHtcclxuXHRcdFx0XHR0aGlzLmhpZGUoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENvbnRhaW5lciB3aGVyZSB0aGUgdG9vbHRpcCB3aWxsIGJlIGFwcGVuZGVkLiAqL1xyXG4gICAgZ2V0IGNvbnRhaW5lcigpIHsgXHJcblx0XHRyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitVdGlscy5yZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb3BvdXRzKVswXS5wb3BvdXRzKStcIiB+IC5cIitVdGlscy5yZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllckNvbnRhaW5lcilbMF0ubGF5ZXJDb250YWluZXIpKTsgXHJcblx0fVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBhYm92ZSB0aGUgZWxlbWVudCAqL1xyXG4gICAgZ2V0IGNhblNob3dBYm92ZSgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0ID49IDA7IH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gYmVsb3cgdGhlIGVsZW1lbnQgKi9cclxuICAgIGdldCBjYW5TaG93QmVsb3coKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgPD0gVXRpbHMuc2NyZWVuSGVpZ2h0OyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSBsZWZ0IG9mIHRoZSBlbGVtZW50ICovXHJcbiAgICBnZXQgY2FuU2hvd0xlZnQoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA+PSAwOyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSByaWdodCBvZiB0aGUgZWxlbWVudCAqL1xyXG5cdGdldCBjYW5TaG93UmlnaHQoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIHRoaXMubm9kZS5vZmZzZXRXaWR0aCArIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA8PSBVdGlscy5zY3JlZW5XaWR0aDsgfVxyXG5cclxuICAgIC8qKiBIaWRlcyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VsZWF2ZS4gKi9cclxuXHRoaWRlKCkge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcclxuXHR9XHJcblxyXG4gICAgLyoqIFNob3dzIHRoZSB0b29sdGlwLiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBvbiBtb3VzZWVudGVyLiBXaWxsIGF0dGVtcHQgdG8gZmxpcCBpZiBwb3NpdGlvbiB3YXMgd3JvbmcuICovXHJcblx0c2hvdygpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IGAke2dldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcH0gJHtnZXRDbGFzcyh0aGlzLnN0eWxlKX1gO1xyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmxhYmVsO1xyXG5cdFx0dGhpcy5jb250YWluZXIuYXBwZW5kKHRoaXMuZWxlbWVudCk7XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcInRvcFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dBYm92ZSB8fCAoIXRoaXMuY2FuU2hvd0Fib3ZlICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dBYm92ZSgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0JlbG93KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcImJvdHRvbVwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dCZWxvdyB8fCAoIXRoaXMuY2FuU2hvd0JlbG93ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dCZWxvdygpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0Fib3ZlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcImxlZnRcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93TGVmdCB8fCAoIXRoaXMuY2FuU2hvd0xlZnQgJiYgdGhpcy5wcmV2ZW50RmxpcCkpIHRoaXMuc2hvd0xlZnQoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dSaWdodCgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJyaWdodFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dSaWdodCB8fCAoIXRoaXMuY2FuU2hvd1JpZ2h0ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dSaWdodCgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0xlZnQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgYWJvdmUgdGhlIG5vZGUuICovXHJcblx0c2hvd0Fib3ZlKCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwidG9wXCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gMTApKTtcclxuXHRcdHRoaXMuY2VudGVySG9yaXpvbnRhbGx5KCk7XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIGJlbG93IHRoZSBub2RlLiAqL1xyXG5cdHNob3dCZWxvdygpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImJvdHRvbVwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgbGVmdCBvZiB0aGUgbm9kZS4gKi9cclxuXHRzaG93TGVmdCgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImxlZnRcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoIC0gMTApKTtcclxuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgcmlnaHQgb2YgdGhlIG5vZGUuICovXHJcblx0c2hvd1JpZ2h0KCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwicmlnaHRcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgdGhpcy5ub2RlLm9mZnNldFdpZHRoICsgMTApKTtcclxuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xyXG5cdH1cclxuXHJcblx0Y2VudGVySG9yaXpvbnRhbGx5KCkge1xyXG4gICAgICAgIGNvbnN0IG5vZGVjZW50ZXIgPSB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArICh0aGlzLm5vZGUub2Zmc2V0V2lkdGggLyAyKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLyAyKSkpO1xyXG5cdH1cclxuXHJcblx0Y2VudGVyVmVydGljYWxseSgpIHtcclxuXHRcdGNvbnN0IG5vZGVjZW50ZXIgPSB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgKHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgLyAyKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KG5vZGVjZW50ZXIgLSAodGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAvIDIpKSk7XHJcblx0fVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFRvb2x0aXAgZnJvbSBcIi4vdG9vbHRpcFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgY29uc3Qge3N0eWxlID0gXCJibGFja1wiLCBzaWRlID0gXCJ0b3BcIiwgdGV4dCA9IFwiXCJ9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICB0aGlzLm5vZGUgPSBCRFYyLnJlYWN0RG9tLmZpbmRET01Ob2RlKHRoaXMpO1xyXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKHRoaXMubm9kZSwgdGV4dCwge3N0eWxlLCBzaWRlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwLmhpZGUoKTtcclxuICAgICAgICBkZWxldGUgdGhpcy50b29sdGlwO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19YU3ZnIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwic3ZnXCIsXG4gICAgICAgICAgICB7eG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdmlld0JveDogXCIwIDAgMTIgMTJcIiwgc3R5bGU6IHt3aWR0aDogXCIxOHB4XCIsIGhlaWdodDogXCIxOHB4XCJ9fSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcImdcIixcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJhY2tncm91bmRcIiwgZmlsbDogXCJub25lXCIsIGZpbGxSdWxlOiBcImV2ZW5vZGRcIn0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZDogXCJNMCAwaDEydjEySDBcIn0pLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2NsYXNzTmFtZTogXCJmaWxsXCIsIGZpbGw6IFwiI2RjZGRkZVwiLCBkOiBcIk05LjUgMy4yMDVMOC43OTUgMi41IDYgNS4yOTUgMy4yMDUgMi41bC0uNzA1LjcwNUw1LjI5NSA2IDIuNSA4Ljc5NWwuNzA1LjcwNUw2IDYuNzA1IDguNzk1IDkuNWwuNzA1LS43MDVMNi43MDUgNlwifSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG59IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZWN0cm9uXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV2ZW50c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtb2R1bGVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZS1mZXRjaFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXRoXCIpOyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0xheWVycy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvaG9va3MuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3BsdWdpbkNlcnRpZmllci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luTW9kdWxlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wb3BvdXRXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWxTaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy90aGVtZU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3YyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy92b2ljZU1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL0xpZ2h0Y29yZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvYnVnX2h1bnRlci5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvY2lyY3VzLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL0FjY291bnRJbmZvcy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9BcGlQcmV2aWV3LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9uY2FyZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9hZGRvbmxpc3QuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYmRMb2dvLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY2hlY2tib3guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jb21wb25lbnRzL2Ryb3Bkb3duLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc2VhcmNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc3dpdGNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbnRlbnRDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3IuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3JEZXRhY2hlZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Vycm9yQm91bmRhcnkuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kZWxldGUuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZG93bmFycm93LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2VkaXQuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvaGlzdG9yeS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvbWFyZ2ludG9wLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3ByZXNlbmNlU2V0dGluZ3MuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9wdWJsaWNTZXJ2ZXJzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9zZXJ2ZXJDYXJkLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcmVsb2FkSWNvbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NlY3Rpb25lZFNldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZXR0aW5nc0dyb3VwLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzVGl0bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zd2l0Y2guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJTZXBhcmF0b3IuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29sdGlwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHRpcFdyYXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS94U3ZnLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZWxlY3Ryb25cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZXZlbnRzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImZzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm1vZHVsZVwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJub2RlLWZldGNoXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInBhdGhcIiJdLCJuYW1lcyI6WyJtaW5pbXVtRGlzY29yZFZlcnNpb24iLCJjdXJyZW50RGlzY29yZFZlcnNpb24iLCJ3aW5kb3ciLCJEaXNjb3JkTmF0aXZlIiwicmVtb3RlQXBwIiwiZ2V0VmVyc2lvbiIsIm1pblN1cHBvcnRlZFZlcnNpb24iLCJiYmRWZXJzaW9uIiwiYmJkQ2hhbmdlbG9nIiwiZGVzY3JpcHRpb24iLCJjaGFuZ2VzIiwidGl0bGUiLCJ0eXBlIiwiaXRlbXMiLCJzZXR0aW5ncyIsImlkIiwiaW5mbyIsImltcGxlbWVudGVkIiwiaGlkZGVuIiwiY2F0IiwiY2F0ZWdvcnkiLCJleHBlcmltZW50YWwiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJkZWZhdWx0Q29va2llIiwic2V0dGluZ3NDb29raWUiLCJzZXR0aW5nc1JQQyIsImRlZmF1bHRSUEMiLCJEYXRlIiwibm93IiwibGlnaHRjb3JkU2V0dGluZ3MiLCJkZWZhdWx0TGlnaHRjb3JkU2V0dGluZ3MiLCJiZHBsdWdpbkVycm9ycyIsImJkdGhlbWVFcnJvcnMiLCJiZENvbmZpZyIsIk9iamVjdCIsImNyZWF0ZSIsIkJldHRlckRpc2NvcmRDb25maWciLCJiZHRoZW1lcyIsImJkcGx1Z2lucyIsInBsdWdpbkNvb2tpZSIsInRoZW1lQ29va2llIiwibG9jYWxTdG9yYWdlRml4IiwibG9hZGluZ0ljb24iLCJkZXByZWNhdGVHbG9iYWwiLCJrZXkiLCJ2YWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiVXRpbHMiLCJ3YXJuIiwiZ2xvYmFsS2V5cyIsImtleXMiLCJHbG9iYWxzIiwiQkRWMiIsInBsdWdpbk1vZHVsZSIsInRoZW1lTW9kdWxlIiwiQkRFdmVudHMiLCJzZXR0aW5nc1BhbmVsIiwiRGF0YVN0b3JlIiwiQ29udGVudE1hbmFnZXIiLCJDbGFzc05vcm1hbGl6ZXIiLCJCZEFwaSIsIkNvcmUiLCJDb3JlV3JhcHBlciIsImNvbnN0cnVjdG9yIiwibWV0aG9kcyIsInNldENvbmZpZyIsInNldE1ldGhvZHMiLCJpbml0IiwidjJMb2FkZXIiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjb250ZW50V2luZG93R2V0dGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiSFRNTElGcmFtZUVsZW1lbnQiLCJwcm90b3R5cGUiLCJjb250ZW50V2luZG93IiwiUmVmbGVjdCIsImFwcGx5IiwiYXJndW1lbnRzIiwiUHJveHkiLCJvYmoiLCJwcm9wIiwidW5kZWZpbmVkIiwidmFsIiwiYmluZCIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiRnVuY3Rpb24iLCJvT3BlbiIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInVybCIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJURkhvdXIiLCJpbmplY3QyNEhvdXIiLCJjYW5jZWwyNEhvdXIiLCJ0d2VsdmVIb3VyIiwiUmVnRXhwIiwiY29udmVydCIsImRhdGEiLCJtYXRjaGVkIiwicmV0dXJuVmFsdWUiLCJtYXRjaCIsImxlbmd0aCIsInJlcGxhY2UiLCJwYWRTdGFydCIsInBhcnNlSW50IiwiY2FuY2VsQ296eSIsIm1vbmtleVBhdGNoIiwiVGltZUZvcm1hdHRlciIsImFmdGVyIiwiY2FuY2VsQ29tcGFjdCIsInJlbW92ZTI0SG91ciIsImRpc3BhdGNoZXIiLCJMaWdodGNvcmQiLCJEaXNjb3JkTW9kdWxlcyIsIkNoYW5uZWxNb2R1bGUiLCJCRE1vZHVsZXMiLCJlIiwiZGVmYXVsdCIsImdldENoYW5uZWwiLCJoYXNDaGFubmVsIiwicmVsYXRpb25TaGlwTW9kdWxlIiwiYWRkUmVsYXRpb25zaGlwIiwiRE1Nb2R1bGUiLCJjbG9zZVByaXZhdGVDaGFubmVsIiwiYmxvY2tlZCIsInVzZXJNb2R1bGUiLCJnZXRDdXJyZW50VXNlciIsIkFudGlCb3RETSIsImFudGlETSIsImVuYWJsZWQiLCJlbmFibGUiLCJzdWJzY3JpYmUiLCJkaXNhYmxlIiwidW5zdWJzY3JpYmUiLCJldiIsIm1lc3NhZ2UiLCJhdXRob3IiLCJib3QiLCJndWlsZF9pZCIsImNoYW5uZWwiLCJjaGFubmVsX2lkIiwic2Nhbk1lc3NhZ2UiLCJzaG93VG9hc3QiLCJ1c2VybmFtZSIsImRpc2NyaW1pbmF0b3IiLCJsb2NhdGlvbiIsInRlc3QiLCJjb250ZW50IiwiRW1iZWRzQ29udGFpbnMiLCJzZWFyY2giLCJlbWJlZHMiLCJtYXAiLCJlbWJlZCIsImZvb3RlciIsInRleHQiLCJmaWVsZHMiLCJuYW1lIiwibSIsIkRpc3BhdGNoZXIiLCJkaXNwYXRjaCIsIkFjdGlvblR5cGVzIiwic29ja2V0SWQiLCJwaWQiLCJDdXN0b21SaWNoUHJlc2VuY2UiLCJnYW1lIiwiZm9ybWF0ZWRHYW1lIiwiYXBwbGljYXRpb25faWQiLCJkZXRhaWxzIiwic3RhdGUiLCJ0aW1lc3RhbXBzIiwic3RhcnQiLCJhc3NldHMiLCJsYXJnZV9pbWFnZSIsInNtYWxsX2ltYWdlIiwic2VuZEdhbWUiLCJMT0NBTF9BQ1RJVklUWV9VUERBVEUiLCJhY3Rpdml0eSIsImNvbnNvbGUiLCJsb2ciLCJzZXQiLCJmZXRjaEFzc2V0cyIsImFwcGxpY2F0aW9uSWQiLCJnZXRBc3NldHMiLCJFcnJvciIsIkxheWVycyIsImxheWVycyIsIkJldHRlckRpc2NvcmQiLCJpc0luamVjdGVkIiwicXVlcnlTZWxlY3RvciIsImluamVjdCIsImNsYXNzTmFtZUxheWVycyIsInJlbW92ZURhIiwidjIiLCJXZWJwYWNrTW9kdWxlcyIsImZpbmQiLCJsYXllciIsIlJlYWN0SW5zdGFuY2UiLCJBcGkiLCJGaW5kUmVhY3QiLCJyZW5kZXIiLCJjYWxsIiwiY2xhc3NMaXN0IiwicHJvcHMiLCJjaGlsZHJlbiIsInNwbGl0IiwicHVzaCIsImpvaW4iLCJmb3JFYWNoIiwiZm9yY2VVcGRhdGUiLCJjcmVhdGVMYXllciIsInV1aWR2NCIsImxheSIsImluZGV4IiwiZmluZEluZGV4Iiwic3BsaWNlIiwicmVtb3ZlIiwiTGF5ZXJNb2R1bGVzIiwiTGF5ZXIiLCJSZWFjdCIsIkNvbXBvbmVudCIsImFuaW1hdGlvbiIsIm1vZHVsZXMiLCJWYWx1ZSIsImdldExheWVyIiwia2V5ZG93biIsIndoaWNoIiwiZGl2IiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY29tcG9uZW50RGlkTW91bnQiLCJhZGRFdmVudExpc3RlbmVyIiwiY29tcG9uZW50V2lsbEVudGVyIiwidGltaW5nIiwidG9WYWx1ZSIsImR1cmF0aW9uIiwiY29tcG9uZW50V2lsbExlYXZlIiwiaW50ZXJwb2xhdGlvbiIsImludGVycG9sYXRlIiwiaW5wdXRSYW5nZSIsIm91dHB1dFJhbmdlIiwic3R5bGUiLCJvcGFjaXR5IiwidHJhbnNmb3JtIiwic2NhbGUiLCJEaXYiLCJfX1NFQ1JFVF9FTU9USU9OX18iLCJjc3MiLCJiYWNrZ3JvdW5kQ29sb3IiLCJwb3NpdGlvbiIsInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdCIsImRpc3BsYXkiLCJvdmVyZmxvdyIsIldlYmtpdEJveE9yaWVudCIsIldlYmtpdEJveERpcmVjdGlvbiIsIm1zRmxleERpcmVjdGlvbiIsImZsZXhEaXJlY3Rpb24iLCJ6SW5kZXgiLCJwYWRkaW5nVG9wIiwiZmlsdGVyIiwiZGVmYXVsdFByb3BzIiwiUmVhY3RET00iLCJSZWFjdERvbSIsIlJlYWN0Q29tcG9uZW50IiwiV2luZG93Q29uZmlnRmlsZSIsImVtb3RlcyIsInNjcmVlbldpZHRoIiwiTWF0aCIsIm1heCIsImRvY3VtZW50RWxlbWVudCIsImNsaWVudFdpZHRoIiwiaW5uZXJXaWR0aCIsInNjcmVlbkhlaWdodCIsImNsaWVudEhlaWdodCIsImlubmVySGVpZ2h0IiwiZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMiLCJnZXRXaW5kb3dQcmVmZXJlbmNlIiwic2V0V2luZG93UHJlZmVyZW5jZSIsImluamVjdENTUyIsIkRPTSIsImFkZFN0eWxlIiwiZXNjYXBlSUQiLCJjbGVhckNTUyIsInJlbW92ZVN0eWxlIiwibGlua0pTIiwiYWRkU2NyaXB0IiwidW5saW5rSlMiLCJyZW1vdmVTY3JpcHQiLCJnZXRQbHVnaW4iLCJoYXNPd25Qcm9wZXJ0eSIsInBsdWdpbiIsImdldENvcmUiLCJtYWluQ29yZSIsImFsZXJ0Iiwic2hvd0NvbmZpcm1hdGlvbk1vZGFsIiwiY2FuY2VsVGV4dCIsIm9wdGlvbnMiLCJmaW5kTW9kdWxlIiwiZmluZEFsbE1vZHVsZXMiLCJmaW5kQWxsIiwiZmluZE1vZHVsZUJ5UHJvcHMiLCJmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzIiwiZmluZE1vZHVsZUJ5UHJvdG90eXBlcyIsInByb3RvcyIsImZpbmRCeVByb3RvdHlwZXMiLCJmaW5kTW9kdWxlQnlEaXNwbGF5TmFtZSIsImZpbmRCeURpc3BsYXlOYW1lIiwiZ2V0SW50ZXJuYWxJbnN0YW5jZSIsIm5vZGUiLCJqUXVlcnkiLCJFbGVtZW50IiwibG9hZERhdGEiLCJwbHVnaW5OYW1lIiwiZ2V0UGx1Z2luRGF0YSIsImdldERhdGEiLCJzYXZlRGF0YSIsInNldFBsdWdpbkRhdGEiLCJzZXREYXRhIiwiZGVsZXRlRGF0YSIsImRlbGV0ZVBsdWdpbkRhdGEiLCJ3aGF0IiwibWV0aG9kTmFtZSIsIm9uUmVtb3ZlZCIsImNhbGxiYWNrIiwic3VwcHJlc3NFcnJvcnMiLCJtZXRob2QiLCJ0ZXN0SlNPTiIsImlzUGx1Z2luRW5hYmxlZCIsImlzVGhlbWVFbmFibGVkIiwiaXNTZXR0aW5nRW5hYmxlZCIsImVuYWJsZVNldHRpbmciLCJvbkNoYW5nZSIsImRpc2FibGVTZXR0aW5nIiwidG9nZ2xlU2V0dGluZyIsImdldEJERGF0YSIsInNldEJERGF0YSIsIm1ha2VBZGRvbkFQSSIsImNvb2tpZSIsImxpc3QiLCJtYW5hZ2VyIiwiQWRkb25BUEkiLCJmb2xkZXIiLCJpc0VuYWJsZWQiLCJ0b2dnbGUiLCJyZWxvYWQiLCJnZXRBbGwiLCJrIiwiYSIsIlBsdWdpbnMiLCJUaGVtZXMiLCJFdmVudEVtaXR0ZXIiLCJyZXF1aXJlIiwiZXZlbnROYW1lIiwiYXJncyIsImVtaXQiLCJvZmYiLCJldmVudEFjdGlvbiIsInJlbW92ZUxpc3RlbmVyIiwic2VsZWN0b3JzIiwiZ2V0U2VsZWN0b3JzIiwic3RhbmRhcmRTaWRlYmFyVmlldyIsImRlZmF1bHRDbGFzc05hbWUiLCJzZWxlY3RzIiwidXNlclNldHRpbmdzQWNjb3VudCIsInBheW1lbnRTb3VyY2VSb3ciLCJzdWJUZXh0IiwiZGVzY3JpcHRpb25XcmFwcGVyIiwidmlld0JvZHkiLCJ1c2VyU2V0dGluZ3NTZWN1cml0eSIsIkJsdXJQcml2YXRlIiwiZXJyb3IiLCJET01Ub29scyIsIm5vcm1hbGl6ZWRQcmVmaXgiLCJyYW5kQ2xhc3MiLCJzdG9wIiwiaGFzUGF0Y2hlZCIsInVucGF0Y2hDbGFzc01vZHVsZXMiLCJtb2R1bGVGaWx0ZXIiLCJyZXZlcnRFbGVtZW50IiwicGF0Y2hDbGFzc01vZHVsZXMiLCJub3JtYWxpemVFbGVtZW50IiwicGF0Y2hET01NZXRob2RzIiwibW9kdWxlIiwicGF0Y2hDbGFzc01vZHVsZSIsInVucGF0Y2hDbGFzc01vZHVsZSIsInNob3VsZElnbm9yZSIsImlzTmFOIiwiZW5kc1dpdGgiLCJzdGFydHNXaXRoIiwiQXJyYXkiLCJpc0FycmF5IiwiX19lc01vZHVsZSIsImJhc2VDbGFzc05hbWUiLCJjb21wb25lbnROYW1lIiwiY2xhc3NOYW1lcyIsIm5vcm1hbENsYXNzIiwiY2FtZWxDYXNlIiwicyIsImkiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwibmV3U3RyaW5nIiwidHJpbSIsImVsZW1lbnQiLCJjbGFzc2VzIiwiYyIsImNsZW4iLCJuZXdDbGFzcyIsImFkZCIsImNoaWxkIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwidG9SZW1vdmUiLCJjb250YWlucyIsIkRPTVRva2VuTGlzdCIsInRva2VuIiwidG9rZW5zIiwidCIsIkNvbG9yZWRUZXh0IiwiaW5qZWN0Q29sb3JlZFRleHQiLCJjYW5jZWxDb2xvcmVkVGV4dCIsIk1lc3NhZ2VDb21wb25lbnQiLCJiZWZvcmUiLCJtZXRob2RBcmd1bWVudHMiLCJjaGlsZHJlbk1lc3NhZ2VDb250ZW50IiwibWVzc2FnZUNvbnRlbnQiLCJkaXNwbGF5TmFtZSIsIm9yaWdpbmFsVHlwZSIsIl9fb3JpZ2luYWxNZXRob2QiLCJyb2xlQ29sb3IiLCJjb2xvclN0cmluZyIsImNvbG9yIiwiYXNzaWduIiwicmVtb3ZlQ29sb3JlZFRleHQiLCJjbGFzc05hbWVNYXJrdXAiLCJtYXJrdXAiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZWxlbSIsInNldFByb3BlcnR5IiwicGF0aCIsImZzIiwiTW9kdWxlIiwiZ2xvYmFsUGF0aHMiLCJyZXNvbHZlIiwicmVtb3RlIiwiYXBwIiwiZ2V0QXBwUGF0aCIsIk1ldGFFcnJvciIsIm9yaWdpbmFsSlNSZXF1aXJlIiwiX2V4dGVuc2lvbnMiLCJvcmlnaW5hbENTU1JlcXVpcmUiLCJzcGxpdFJlZ2V4IiwiZXNjYXBlZEF0UmVnZXgiLCJhZGRvbkNhY2hlIiwidGltZUNhY2hlIiwid2F0Y2hlcnMiLCJwYXRjaEV4dGVuc2lvbnMiLCJnZXRDb250ZW50UmVxdWlyZSIsInBsdWdpbnNGb2xkZXIiLCJfcGx1Z2luc0ZvbGRlciIsInJlYWxwYXRoU3luYyIsImRhdGFQYXRoIiwidGhlbWVzRm9sZGVyIiwiX3RoZW1lc0ZvbGRlciIsImxvYWRBZGRvbkNlcnRpZmllckNhY2hlIiwiZGF0YVN0b3JlIiwiZ2V0U2V0dGluZ0dyb3VwIiwic2V0U2V0dGluZ0dyb3VwIiwiZW5jcnlwdFNldHRpbmdzQ2FjaGUiLCJKU09OIiwicGFyc2UiLCJkZWNyeXB0U2V0dGluZ3NDYWNoZSIsImhhc2giLCJyZXN1bHQiLCJzdXNwZWN0Iiwic2F2ZUFkZG9uQ2FjaGUiLCJzdHJpbmdpZnkiLCJ3YXRjaENvbnRlbnQiLCJjb250ZW50VHlwZSIsImlzUGx1Z2luIiwiYmFzZUZvbGRlciIsImZpbGVFbmRpbmciLCJ3YXRjaCIsInBlcnNpc3RlbnQiLCJldmVudFR5cGUiLCJmaWxlbmFtZSIsIlByb21pc2UiLCJyIiwic2V0VGltZW91dCIsInN0YXRTeW5jIiwiZXJyIiwiY29kZSIsInVubG9hZFBsdWdpbiIsInVubG9hZFRoZW1lIiwiaXNGaWxlIiwic3RhdHMiLCJtdGltZSIsImdldFRpbWUiLCJsb2FkUGx1Z2luIiwibG9hZFRoZW1lIiwicmVsb2FkUGx1Z2luIiwicmVsb2FkVGhlbWUiLCJ1bndhdGNoQ29udGVudCIsImNsb3NlIiwiZXh0cmFjdE1ldGEiLCJmaXJzdExpbmUiLCJoYXNPbGRNZXRhIiwicGFyc2VPbGRNZXRhIiwiaGFzTmV3TWV0YSIsInBhcnNlTmV3TWV0YSIsIm1ldGEiLCJyYXdNZXRhIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJpbmRleE9mIiwicGFyc2VkIiwiZm9ybWF0IiwiYmxvY2siLCJvdXQiLCJmaWVsZCIsImFjY3VtIiwibGluZSIsImNoYXJBdCIsImwiLCJzdWJzdHIiLCJzZWxmIiwib3JpZ2luYWxSZXF1aXJlIiwicG9zc2libGVQYXRoIiwiYmFzZW5hbWUiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwic3RyaXBCT00iLCJhZGRlZCIsImF0aW1lTXMiLCJtb2RpZmllZCIsIm10aW1lTXMiLCJzaXplIiwiX2NvbXBpbGUiLCJkaWRFeHBvcnQiLCJpc0VtcHR5IiwiZXhwb3J0cyIsIm1ha2VQbGFjZWhvbGRlclBsdWdpbiIsImdldE5hbWUiLCJnZXRBdXRob3IiLCJnZXREZXNjcmlwdGlvbiIsInNvdXJjZSIsIndlYnNpdGUiLCJsb2FkQ29udGVudCIsInByb2Nlc3NGaWxlIiwidGltZXN0YW1wIiwiZmlsZSIsImhhcm0iLCJzdGFjayIsInVubG9hZENvbnRlbnQiLCJjYWNoZSIsImlzTG9hZGVkIiwicmVsb2FkQ29udGVudCIsImNhbnRVbmxvYWQiLCJsb2FkTmV3Q29udGVudCIsImJhc2VkaXIiLCJmaWxlcyIsInJlYWRkaXJTeW5jIiwiY29udGVudExpc3QiLCJ2YWx1ZXMiLCJyZW1vdmVkIiwiZiIsImxvYWRBbGxDb250ZW50IiwiZXJyb3JzIiwibG9hZFBsdWdpbnMiLCJsb2FkVGhlbWVzIiwiY29uZmlnIiwiaGFzU3RhcnRlZCIsImZsYXQiLCJ2ZXJzaW9uIiwiRUQiLCJXZWJTb2NrZXQiLCJwYXRjaEF0dHJpYnV0ZXMiLCJpbml0U2V0dGluZ3MiLCJjaGVja0Zvckd1aWxkcyIsImluaXRpYWxpemUiLCJpbml0aWFsaXplU2V0dGluZ3MiLCJjb250ZW50TWFuYWdlciIsIkJ1ZmZlciIsImZyb20iLCJ0b1N0cmluZyIsImNsaWNrIiwiUGx1Z2luQ2VydGlmaWVyIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsImluaXRPYnNlcnZlciIsInNob3dDb250ZW50RXJyb3JzIiwicGx1Z2lucyIsInRoZW1lcyIsInByZXZpb3VzVmVyc2lvbiIsInNob3dDaGFuZ2Vsb2dNb2RhbCIsIkVtb2ppTW9kdWxlIiwicGF0Y2hTb2NpYWwiLCJwYXRjaEd1aWxkUGlsbHMiLCJwYXRjaEd1aWxkTGlzdEl0ZW1zIiwicGF0Y2hHdWlsZFNlcGFyYXRvciIsInBhdGNoTWVzc2FnZUhlYWRlciIsInBhdGNoTWVtYmVyTGlzdCIsInBhdGNoQXR0YWNobWVudCIsImhhdmVJbnN0YWxsZWREZWZhdWx0Iiwib25DbG9zZSIsImxvZ28iLCJpbm5lckhUTUwiLCJhdHRyaWJzUGF0Y2hzIiwiY2FuY2VsUGF0Y2hBdHRyaWJ1dGVzIiwiQW5jaG9yIiwiZW5zdXJlRXhwb3J0ZWQiLCJ0aGVuIiwiRGlzY29yZFRhZyIsIkRpc2NvcmRUYWdDb21wIiwiYmFkZ2VEaXYiLCJtYXJnaW5Ub3AiLCJ1c2VyIiwiVG9vbHRpcFdyYXAiLCJzaWRlIiwiaHJlZiIsInRhcmdldCIsIkJETG9nbyIsIkxpZ2h0Y29yZExvZ28iLCJhcHBseUJhZGdlcyIsInRpbWVzQ2hlY2tlZCIsIndyYXBwZXIiLCJndWlsZENsYXNzZXMiLCJndWlsZCIsImxpc3RJdGVtIiwiYmxvYiIsImJsb2JDb250YWluZXIiLCJkZWZlckxvYWRlZCIsInJlYWR5U3RhdGUiLCJpbmplY3RFeHRlcm5hbHMiLCJzYXZlU2V0dGluZ3MiLCJsb2FkU2V0dGluZ3MiLCJzZXR0aW5nIiwiZ2V0UHJlZGljYXRlU2VjdGlvbnMiLCJzZXR0aW5nTW9kdWxlIiwic2VjdGlvbiIsInBvcGVkIiwicG9wIiwicmVuZGVyU2lkZWJhciIsImNsYXNzTmFtZUxheWVyIiwiY2xhc3NOYW1lU29jaWFsTGlua3MiLCJjbGFzc05hbWVNb2RhbCIsIm1haW5PYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJtdXRhdGlvbnMiLCJtbGVuIiwibXV0YXRpb24iLCJyYXdPYnNlcnZlciIsImFkZGVkTm9kZXMiLCJhbmltYXRpbmciLCJzb2NpYWxMaW5rcyIsIm1vZGFsIiwiaW5uZXIiLCJyZXNwb25zaXZlV2lkdGhNb2JpbGUiLCJnZXRBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJwYXJlbnRFbGVtZW50Iiwib2JzZXJ2ZSIsImNoaWxkTGlzdCIsInN1YnRyZWUiLCJzb2NpYWxQYXRjaCIsIlRhYkJhciIsInNvY2lhbE1vZHVsZTEiLCJvcmlnaW5hbCIsIm5ld09uZSIsInJldHVyblZhbCIsImxpbmsiLCJjbGFzc05hbWVDb2xvck11dGVkIiwic2l6ZXMiLCJjbGFzc05hbWVWZXJzaW9uSGFzaCIsImNvbG9yTXV0ZWQiLCJzaXplMzIiLCJ2ZXJzaW9uSGFzaCIsImJyYW5jaCIsImFkZGl0aW9uYWwiLCJyZWFjdCIsInNpemUxMiIsImVsZWN0cm9uIiwiZ2V0R2xvYmFsIiwiY29tbWl0Iiwib3JpZ2luYWxWZXJzaW9ucyIsImdldEd1aWxkQ2xhc3NlcyIsImd1aWxkc1dyYXBwZXIiLCJmaW5kQnlQcm9wcyIsImd1aWxkcyIsInBpbGwiLCJndWlsZExpc3RJdGVtc1BhdGNoIiwiR3VpbGRDbGFzc2VzIiwibGlzdEl0ZW1DbGFzcyIsImJsb2JDbGFzcyIsInJlYWN0SW5zdGFuY2UiLCJHdWlsZENvbXBvbmVudCIsInJldHVybiIsInRoaXNPYmplY3QiLCJndWlsZERhdGEiLCJ1bnJlYWQiLCJzZWxlY3RlZCIsImF1ZGlvIiwidmlkZW8iLCJiYWRnZSIsImFuaW1hdGFibGUiLCJndWlsZFBpbGxQYXRjaCIsImd1aWxkUGlsbCIsImhvdmVyZWQiLCJndWlsZFNlcGFyYXRvclBhdGNoIiwiR3VpbGRzIiwiZ3VpbGRDb21wb25lbnRzIiwiR3VpbGRTZXBhcmF0b3IiLCJTZXBhcmF0b3IiLCJBdHRhY2htZW50UGF0Y2giLCJBdHRhY2htZW50IiwiYXR0YWNobWVudCIsImdldE5lc3RlZFByb3AiLCJwYXRjaCIsIm1lc3NhZ2VIZWFkZXJQYXRjaCIsIk1lc3NhZ2VIZWFkZXIiLCJjaGF0IiwibmV4dFRpY2siLCJnZXRFbGVtZW50QnlJZCIsImNoaWxkTm9kZXMiLCJibG9ja0RpdiIsImRpc3RhbnQiLCJnZXRCYWRnZXMiLCJiYWRnZXMiLCJzdmciLCJ3aWR0aCIsInNjb3BlcyIsInNjb3BlIiwiY29tcG9uZW50IiwiZGl2MiIsInJlYWN0RG9tIiwibWVtYmVyTGlzdFBhdGNoIiwiTWVtYmVyTGlzdEl0ZW0iLCJyZW5kZXJEZWNvcmF0b3JzIiwidXBkYXRlSW5qZWN0b3IiLCJpbmplY3Rpb25QYXRoIiwiX19ub25fd2VicGFja19yZXF1aXJlX18iLCJyZWxlYXNlQ2hhbm5lbCIsImdsb2JhbHMiLCJnZXRSZWxlYXNlQ2hhbm5lbCIsImVudiIsIkFQUERBVEEiLCJIT01FIiwiWERHX0NPTkZJR19IT01FIiwic3RhYmxlIiwiY2FuYXJ5IiwicHRiIiwicGx1Z2luRGF0YSIsIkJERmlsZSIsIndyaXRlRmlsZVN5bmMiLCJzZXR0aW5nc0ZpbGUiLCJ1bmxpbmtTeW5jIiwiX2luamVjdGlvblBhdGgiLCJiYXNlIiwicm9hbWluZ0Jhc2UiLCJnZXRQYXRoIiwicm9hbWluZ0xvY2F0aW9uIiwicmVhbExvY2F0aW9uIiwiY29uZmlnRmlsZSIsIl9jb25maWdGaWxlIiwiX0JERmlsZSIsIl9zZXR0aW5nc0ZpbGUiLCJnZXRQbHVnaW5GaWxlIiwiRGV2TW9kZSIsImRlYnVnTGlzdGVuZXIiLCJjb3B5U2VsZWN0b3JMaXN0ZW5lciIsInN0YXJ0RGVidWdMaXN0ZW5lciIsInN0YXJ0Q29weVNlbGVjdG9yIiwic3RvcERlYnVnTGlzdGVuZXIiLCJzdG9wQ29weVNlbGVjdG9yIiwicHJldmVudERlZmF1bHQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJzdG9wUHJvcGFnYXRpb24iLCJzZWxlY3RvciIsImdldFNlbGVjdG9yIiwiY2xhc3NMYXllciIsImNsYXNzSXRlbXMiLCJkaXNhYmxlZFBvaW50ZXJFdmVudHMiLCJtZW51IiwiYXR0YWNoIiwiY20iLCJxdWVyeSIsImNvbnRhaW5lciIsImxheWVyQ29udGFpbmVyIiwiY21XcmFwIiwic3R5bGVGbGV4aWJsZSIsImFjY29tbW9kYXRlU2Nyb2xsYmFyIiwiYXBwZW5kIiwiY2xpZW50WSIsImNsaWVudFgiLCJzY3JvbGxlckNsYXNzZXMiLCJzY3JvbGxlcldyYXAiLCJzY3JvbGxlclRoZW1lZCIsInRoZW1lR2hvc3RIYWlybGluZSIsInNjcm9sbGVyIiwicmVtb3ZlQ00iLCJrZXlDb2RlIiwiY21nIiwiY21pIiwiaXRlbSIsImxhYmVsQ29udGFpbmVyIiwiY29sb3JEZWZhdWx0IiwibGFiZWwiLCJOYXRpdmVNb2R1bGUiLCJjb3B5IiwiZWxlbWVudHMiLCJxdWVyeUFsbCIsImZvY3VzZWQiLCJzZXBhcmF0b3IiLCJzY3JvbGxIZWlnaHQiLCJmdWxsUGF0aCIsImVsIiwibmFtZXMiLCJwYXJlbnROb2RlIiwidW5zaGlmdCIsIm93bmVyRG9jdW1lbnQiLCJ0YWdOYW1lIiwiZW50cmllcyIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJEaXNhYmxlVHlwaW5nIiwic3RhcnRUeXBpbmciLCJ0eXBpbmdNb2R1bGUiLCJkaXNhYmxlZCIsInN0b3BUeXBpbmciLCJyYW5kb20iLCJ2IiwiYXdhaXRpbmdCYWRnZXNQcm9taXNlcyIsImJhZGdlc1RvRmV0Y2giLCJEaXN0YW50U2VydmVyIiwiX2NhY2hlIiwibmV3UHJvbWlzZSIsInJlcyIsIkNvbnN0YW50cyIsImRlZmF1bHRVc2VycyIsImZldGNoZWRCYWRnZXMiLCJ1c2VycyIsImhhbmRsZVJlcXVlc3QiLCJSb3V0ZXMiLCJzdGF0dXMiLCJyZXNwb25zZUJvZHkiLCJqc29uIiwicHJvbWlzZSIsInVzZXJfaWQiLCJjYXRjaCIsIkxpZ2h0Y29yZEVycm9yIiwicm91dGUiLCJyZWplY3QiLCJub2RlRmV0Y2giLCJTRVJWRVJfVVJMIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJCdWdIdW50ZXJCYWRnZSIsIkNpcmN1cyIsImhlYWQiLCJzY3JpcHQiLCJzcmMiLCJvbmxvYWQiLCJhbmltYXRlIiwiXyIsInVwZGF0ZSIsInBlcmZvcm1hbmNlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwidGltZSIsInRpbWVGcmFjdGlvbiIsInByb2dyZXNzIiwiUSIsInBhcnNlSFRNTCIsImlzSFRNTCIsIk5vZGVMaXN0Iiwic29tZSIsIm4iLCJub2RlVHlwZSIsImJhc2VFbGVtZW50IiwiaHRtbCIsImZyYWdtZW50IiwidGVtcGxhdGUiLCJjbG9uZU5vZGUiLCJlc2NhcGVIVE1MIiwidGV4dE5vZGUiLCJjcmVhdGVUZXh0Tm9kZSIsInNwYW5FbGVtZW50Iiwibm9kZVZhbHVlIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZUNsYXNzIiwiY2xhc3NuYW1lIiwiaW5kaWNhdG9yIiwiaGFzQ2xhc3MiLCJldmVyeSIsInJlcGxhY2VDbGFzcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiYXBwZW5kVG8iLCJ0aGlzTm9kZSIsInRoYXROb2RlIiwicHJlcGVuZFRvIiwicHJlcGVuZCIsImluc2VydEFmdGVyIiwidGFyZ2V0Tm9kZSIsImluc2VydEJlZm9yZSIsIm5leHRTaWJsaW5nIiwibmV3Tm9kZSIsIm5leHQiLCJuZXh0QWxsIiwibmV4dFVudGlsIiwibWF0Y2hlcyIsInByZXZpb3VzIiwicHJldmlvdXNBbGwiLCJwcmV2aW91c1VudGlsIiwiaW5kZXhJblBhcmVudCIsIm51bSIsInBhcmVudCIsImZpbmRDaGlsZCIsImZpbmRDaGlsZHJlbiIsInBhcmVudHMiLCJjbG9zZXN0IiwicGFyZW50c1VudGlsIiwic2libGluZ3MiLCJhdHRyaWJ1dGUiLCJnbG9iYWwiLCJnZXRDb21wdXRlZFN0eWxlIiwiaGVpZ2h0IiwidGV4dENvbnRlbnQiLCJvdXRlcldpZHRoIiwib2Zmc2V0V2lkdGgiLCJvdXRlckhlaWdodCIsIm9mZnNldEhlaWdodCIsIm9mZnNldCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImxpc3RlbmVycyIsIl9saXN0ZW5lcnMiLCJvbiIsImV2ZW50IiwiZGVsZWdhdGUiLCJuYW1lc3BhY2UiLCJoYXNEZWxlZ2F0ZSIsImV2ZW50RnVuYyIsImNhbmNlbCIsIm5ld0NhbmNlbCIsIm9uY2UiLCJfX29mZkFsbCIsIm1hdGNoRmlsdGVyIiwibGlzdGVuZXIiLCJkZWZhdWx0RmlsdGVyIiwib25Nb3VudENoYW5nZSIsIm9uTW91bnQiLCJ3cmFwcGVkQ2FsbGJhY2siLCJvYnNlcnZlciIsIm5vZGVzIiwicmVtb3ZlZE5vZGVzIiwiZGlyZWN0TWF0Y2giLCJwYXJlbnRNYXRjaCIsIm9uVW5tb3VudCIsIm9uQWRkZWQiLCJ3cmFwIiwiZG9tV3JhcHBlciIsInJlc29sdmVFbGVtZW50IiwiRW1vamlSZWdleCIsIkN1c3RvbUVtb2ppTW9kdWxlIiwiQ3VzdG9tRW1vamkiLCJFbW9qaU1vZHVsZUFwaSIsImdldEN1c3RvbUVtb2ppQnlJZCIsIkF1dG9jb21wbGV0ZU1vZHVsZSIsIkF1dG9Db21wbGV0aW9uVGVtcGxhdGVzIiwiZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyIsIkVtb2ppTW9kdWxlUXVlcnkiLCJxdWVyeUVtb2ppUmVzdWx0cyIsIk1lc3NhZ2VzIiwiRU1PSklfTUFUQ0hJTkciLCJndWlsZE1vZHVsZSIsImdldEd1aWxkIiwiZ2V0R3VpbGRzIiwiaXNGZXRjaGluZyIsImVtb2ppU2VhcmNoIiwiZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dCIsIkxJR0hUQ09SRF9FTU9KSVMiLCJhcmcxIiwiYXJnMiIsImNvbmRpdGlvbiIsInNldEVtb2ppVXNhYmxlIiwicXVlcnlSZXN1bHRzIiwicmVzdWx0cyIsInJlbmRlclJlc3VsdHMiLCJEIiwiZW1vamlzIiwiRU1PSkkiLCJFbW9qaSIsImVtb2ppIiwidW5pcXVlTmFtZSIsInNlbnRpbmVsIiwiZ3VpbGRJZCIsImdldFBsYWluVGV4dCIsImlzQW5pbWF0ZWQiLCJhbmltYXRlZCIsIm1hbmFnZWQiLCJvcmlnaW5hbE5hbWUiLCJnZXRSYXdUZXh0IiwiY2FuY2VsRW1vamlSZW5kZXIiLCJjYW5jZWxFbW90ZVJlbmRlciIsIm5ld0NvbnRlbnQiLCJoYXNQYXJzZWQiLCJleGVjIiwicmF3Iiwid29yZHMiLCJ3b3JkIiwiYXJyIiwiZW1vamlJZCIsImp1bWJvYWJsZSIsInJlZHVjZSIsImN1cnJlbnQiLCJzaGlmdCIsIm8iLCJ1IiwiZCIsIm9uQ2xpY2siLCJvbkhvdmVyIiwiUiIsInByZWZpeCIsIlRpdGxlIiwiRW1vamlGaWx0ZXJNb2R1bGUiLCJpc0Vtb2ppRGlzYWJsZWQiLCJpc1VzYWJsZSIsInVzYWJsZSIsInN1cnJvZ2F0ZXMiLCJkaXZlcnNpdHkiLCJ1c2VTdGF0ZSIsInVzZUZvcmNlVXBkYXRlIiwiY2FjaGUyIiwicHJvY2Vzc0F0dGFjaG1lbnQiLCJpc1RydXN0ZWQiLCJ0ZXN0cyIsInRocmVhdHMiLCJjaGVja1ZpcnVzZXMiLCJyZXN1bHRDYWxsYmFjayIsInJlbW92ZUNhbGxiYWNrIiwiaXNIYXJtZnVsIiwibm9fY29tbWVudHMiLCJzY3JwdCIsImhhc2hUb1VybCIsImNoZWNrSGFzaCIsImdldEN1cnJlbnRXZWJDb250ZW50cyIsInVzZXJBZ2VudCIsIl9fcGF0aCIsImlzRnJvbUxvYWRlciIsImNyeXB0byIsImFsbG9jIiwiY3JlYXRlUmVhZFN0cmVhbSIsImNodW5rIiwiY29uY2F0IiwiaGFzaFJlc3VsdCIsImRpZ2VzdCIsInJlbmRlclRvRWxlbWVudHMiLCJmbG93ZXJTdGFyTW9kdWxlIiwiZmxvd2VyU3RhckNvbnRhaW5lciIsImNoaWxkTW9kdWxlIiwiY2hpbGRDb250YWluZXIiLCJib3JkZXJDb2xvciIsIm5leHROb2RlIiwiY29uZmlybVRleHQiLCJkYW5nZXIiLCJvbkNhbmNlbCIsIm9uQ29uZmlybSIsInNoZWxsIiwib3BlbkV4dGVybmFsIiwidG9vbHRpcFdyYXAiLCJ2aWV3Qm94IiwieCIsInkiLCJtYXNrIiwiZmlsbCIsInBvaW50ZXJFdmVudHMiLCJvZmZpY2lhbCIsInNwYW4iLCJmbG9hdCIsImZsb3dlclN0YXIiLCJnZXRLZXllZEFycmF5IiwiYnVmZmVyIiwiaW5zdGFsbFBhdGgiLCJjdXJzb3IiLCJzdHJva2UiLCJzYXZlIiwiT2JqZWN0U3RvcmFnZSIsImxvY2FsU3RvcmFnZU1vZHVsZSIsImxvY2FsU3RvcmFnZSIsImltcGwiLCJidG9hIiwic2V0SW50ZXJ2YWwiLCJzYWZlSlNPTlBhcnNlIiwiYXRvYiIsImdlbmVyYXRlS2V5IiwiZGVjaXBoZXIiLCJkZWNyeXB0ZWQiLCJmaW5hbCIsImNpcGhlciIsImVuY3J5cHRlZCIsIlBsdWdpbk1vZHVsZSIsImxvYWRQbHVnaW5EYXRhIiwibG9hZCIsInNhdmVQbHVnaW5EYXRhIiwiY2hhbm5lbFN3aXRjaCIsInN0YXJ0UGx1Z2luIiwic3RvcFBsdWdpbiIsImVuYWJsZVBsdWdpbiIsImRpc2FibGVQbHVnaW4iLCJ0b2dnbGVQbHVnaW4iLCJwIiwiZmlsZW5hbWVPck5hbWUiLCJiZHBsdWdpbiIsImRlbGV0ZSIsImVkaXQiLCJvcGVuSXRlbSIsInVwZGF0ZVBsdWdpbkxpc3QiLCJzYXZlZCIsIm5ld01lc3NhZ2UiLCJvbk1lc3NhZ2UiLCJvblN3aXRjaCIsInBvcG91dFdpbmRvdyIsIndpbmRvd3MiLCJNYXAiLCJwb3BvdXRNb2R1bGUiLCJnZXRXaW5kb3ciLCJzZXRJbW1lZGlhdGUiLCJiZEV2ZW50cyIsInJlbW92ZVRoZW1lcyIsImFwcGx5VGhlbWVzIiwidGhlbWVOYW1lIiwidGhlbWUiLCJleGlzdGluZyIsInVuZXNjYXBlIiwicmVtb3ZlQXR0cmlidXRlIiwiVjJfUHVibGljU2VydmVycyIsIl9hcHBlbmRCdXR0b24iLCJWMkNfUHVibGljU2VydmVycyIsInJvb3RJZCIsImJ1dHRvbiIsImJ0biIsImNpcmNsZUJ1dHRvbk1hc2siLCJjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lciIsImRvd25sb2FkUHJvZ3Jlc3MiLCJ0dXRvcmlhbENvbnRhaW5lciIsImFkZEJ1dHRvbiIsImd1aWxkUGF0Y2giLCJHdWlsZExpc3QiLCJ3ZWJwYWNrTW9kdWxlcyIsIkd1aWxkTGlzdE9sZCIsInJlbW92ZUJ1dHRvbiIsIkJEU2lkZWJhckhlYWRlciIsIlB1cmVDb21wb25lbnQiLCJzaWRlYmFyQ29tcG9uZW50cyIsIkhlYWRlciIsIkl0ZW0iLCJjaGFuZ2Vsb2dCdXR0b24iLCJIaXN0b3J5IiwicmVuZGVyZWQiLCJpc0NsZWFyaW5nQ2FjaGUiLCJWMl9TZXR0aW5nc1BhbmVsIiwidXBkYXRlU2V0dGluZ3MiLCJzaWRlYmFyIiwiVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIiwicmVnaXN0ZXJDb21wb25lbnRzIiwicmVnaXN0ZXIiLCJtYWtlQ29tcG9uZW50IiwibGlnaHRjb3JkQ29tcG9uZW50IiwiUHJlc2VuY2VDb21wb25lbnQiLCJBY2NvdW50SW5mb3NDb21wb25lbnQiLCJBcGlQcmV2aWV3Q29tcG9uZW50IiwiY29yZUNvbXBvbmVudCIsImN1c3RvbUNzc0NvbXBvbmVudCIsInJlbmRlckFkZG9uUGFuZSIsImNvcmVTZXR0aW5ncyIsImdldFNldHRpbmdzIiwiY2F0ZWdvcmllcyIsIlNldCIsInNlY3Rpb25zIiwiUHJlc2VuY2VTZXR0aW5ncyIsImNoZWNrZWQiLCJwdWJsaWNTZXJ2ZXJzTW9kdWxlIiwidm9pY2VNb2RlIiwidGZIb3VyIiwiY29sb3JlZFRleHQiLCJkTW9kZSIsIlNldHRpbmdzIiwiZGV2TW9kZSIsImNhbGxSaW5naW5nQmVhdCIsInNldHRpbmdzU3RvcmUiLCJzaG93Q3VycmVudEdhbWUiLCJ1cGRhdGVSZW1vdGVTZXR0aW5ncyIsImdldEN1cnJlbnRXaW5kb3ciLCJzZXRBbHdheXNPblRvcCIsIkFudGlBZERNIiwiYmx1clByaXZhdGUiLCJkaXNhYmxlVHlwaW5nIiwiYXBwU2V0dGluZ3MiLCJyZWxhdW5jaCIsImV4aXQiLCJjb3JlIiwiTm90aWZpY2F0aW9uc1VzZVNoaW0iLCJTZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwiTWFyZ2luVG9wIiwiaXNDaGVja2VkIiwiU3dpdGNoIiwiQ29tcG9uZW50cyIsImlucHV0cyIsIkJ1dHRvbiIsImxvb2siLCJob3ZlckNvbG9yIiwiaXBjIiwic2VuZCIsImFyZ3YiLCJxdWl0Iiwic2Vzc2lvbiIsImNsZWFyQ2FjaGUiLCJWMkNfUHJlc2VuY2VTZXR0aW5ncyIsIlYyQ19BY2NvdW50SW5mb3MiLCJBcGlQcmV2aWV3IiwiQ3NzRWRpdG9yIiwiQ29udGVudExpc3QiLCJvcmlnaW5hbFJlbmRlciIsImVudW1lcmFibGUiLCJDYXJkTGlzdCIsIlNldHRpbmdDb21wb25lbnQiLCJwYW5lbHMiLCJwYW5lbCIsImdldENvbXBvbmVudCIsIkxDaXRlbXMiLCJMQ0Rldkl0ZW1zIiwiVGhlbWVNb2R1bGUiLCJsb2FkVGhlbWVEYXRhIiwic2F2ZVRoZW1lRGF0YSIsImVuYWJsZVRoZW1lIiwiZGlzYWJsZVRoZW1lIiwidG9nZ2xlVGhlbWUiLCJiZHRoZW1lIiwidXBkYXRlVGhlbWVMaXN0IiwiX3dpbmRvd0NvbmZpZ0ZpbGUiLCJ0cmFuc3BhcmVudCIsImZyYW1lIiwiY2hhckNvZGVBdCIsImdldFRleHRBcmVhIiwiY2hhbm5lbFRleHRBcmVhIiwidGl0bGVXcmFwcGVyIiwiaW5zZXJ0VGV4dCIsInRleHRhcmVhIiwiZm9jdXMiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsImV4ZWNDb21tYW5kIiwibW9kdWxlTmFtZSIsImdyb3VwQ29sbGFwc2VkIiwiZ3JvdXBFbmQiLCJmb3JtYXRTdHJpbmciLCJzdHJpbmciLCJyZXBsYWNlbWVudCIsImVzY2FwZSIsInBhcmFtcyIsImluc3RlYWQiLCJzaWxlbnQiLCJmb3JjZSIsIm9yaWdNZXRob2QiLCJjYW5jZWxlZCIsImNhbmNlbFBhdGNoIiwib3JpZ2luYWxNZXRob2QiLCJjYWxsT3JpZ2luYWxNZXRob2QiLCJ0ZW1wUmV0IiwiX19tb25rZXlQYXRjaGVkIiwiZGlzY29ubmVjdCIsImhhc05vdGljZSIsImZvcm0iLCJ0b2FzdFdyYXBwZXIiLCJpY29uIiwidGltZW91dCIsInRvYXN0RWxlbSIsImlubmVyVGV4dCIsIm1vZGFsTW9kdWxlIiwiaGlkZU9uRnVsbHNjcmVlbiIsImhlYWRlck1vZHVsZSIsImhlYWRlciIsImZvb3RlcjJNb2R1bGUiLCJmb2N1c0xvY2siLCJiYWNrZHJvcCIsImJhY2tkcm9wV2l0aExheWVyIiwiY2xvc2luZ0xpc3RlbmVycyIsInBsdWdpbkVycm9ycyIsInRoZW1lRXJyb3JzIiwiZ2VuZXJhdGVUYWIiLCJ0YWJzIiwiTW9kYWxTdGFjayIsIkNoYW5nZWxvZ0NsYXNzZXMiLCJUZXh0RWxlbWVudCIsIkZsZXhDaGlsZCIsIlRpdGxlcyIsIkNoYW5nZWxvZyIsInNlbGVjdGFibGUiLCJNYXJrZG93blBhcnNlciIsImltYWdlIiwic3VidGl0bGUiLCJjZSIsImNoYW5nZWxvZ0l0ZW1zIiwiZW50cnkiLCJtYXJnaW4iLCJyZW5kZXJIZWFkZXIiLCJDaGlsZCIsImdyb3ciLCJzaHJpbmsiLCJ0YWciLCJUYWdzIiwiSDQiLCJTaXplcyIsIlNNQUxMIiwiQ29sb3JzIiwiU1RBTkRBUkQiLCJkYXRlIiwicmVuZGVyRm9vdGVyIiwiQW5jaG9yQ2xhc3NlcyIsImFuY2hvciIsImFuY2hvclVuZGVybGluZU9uSG92ZXIiLCJqb2luU3VwcG9ydFNlcnZlciIsImpvaW5CRDIiLCJzdXBwb3J0TGluayIsImRlZmF1bHRGb290ZXIiLCJvblNjcm9sbCIsIk1vZGFsQWN0aW9ucyIsIk1hcmtkb3duIiwiQ29uZmlybWF0aW9uTW9kYWwiLCJlbXB0eUZ1bmN0aW9uIiwib3Blbk1vZGFsIiwicmVkIiwibW9kYWxLZXkiLCJWMiIsImVkaXRvckRldGFjaGVkIiwicmVxIiwid2VicGFja0pzb25wIiwiX19leHRyYV9pZF9fIiwic2hvdWxkUHJvdGVjdCIsInRoZU1vZHVsZSIsImNsZWFyIiwic29ydCIsImdldFRva2VuIiwiZ2V0RW1haWwiLCJzaG93VG9rZW4iLCJwcm90ZWN0IiwiaXNEZWZhdWx0IiwibW9kIiwicHJveHkiLCJmdW5jIiwiX19wcm90b19fIiwicHJvcE5hbWVzIiwicHJvdG9OYW1lcyIsInByb3RvUHJvcCIsImludGVybmFsIiwiam9pbkJEMSIsIkludml0ZUFjdGlvbnMiLCJhY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsIiwibGVhdmVCRDEiLCJHdWlsZEFjdGlvbnMiLCJsZWF2ZUd1aWxkIiwibGVhdmVCRDIiLCJqb2luTEMiLCJsZWF2ZUxDIiwicmVhY3RDb21wb25lbnQiLCJhbmNob3JDbGFzc2VzIiwic2xhdGVFZGl0b3JDbGFzc2VzIiwibWVzc2FnZUNsYXNzZXMiLCJ1bnJlYWRNZW50aW9uc0JhciIsImd1aWxkc0Vycm9yIiwiTWVzc2FnZUNvbnRlbnRDb21wb25lbnQiLCJUb29sdGlwV3JhcHBlciIsIlRvb2x0aXBzIiwiaGlkZSIsInNob3ciLCJzdWJtaXQiLCJhY3RpdmF0ZVJhZ2luZ0RlbW9uIiwiZGlzbWlzcyIsIktleUdlbmVyYXRvciIsIkxheWVyU3RhY2siLCJVc2VyU3RvcmUiLCJDaGFubmVsU3RvcmUiLCJDaGFubmVsQWN0aW9ucyIsIlByaXZhdGVDaGFubmVsQWN0aW9ucyIsIm9wZW5ETSIsInVzZXJJZCIsInNlbGZJZCIsInByaXZhdGVDaGFubmVsSWQiLCJnZXRETUZyb21Vc2VySWQiLCJzZWxlY3RQcml2YXRlQ2hhbm5lbCIsIm9wZW5Qcml2YXRlQ2hhbm5lbCIsInBhcnNlU2V0dGluZ3MiLCJWb2ljZU1vZGUiLCJtYXJnaW5Nb2R1bGUyIiwiZGVmYXVsdE1hcmdpbmg1IiwiY29sb3JNb2R1bGUiLCJjb2xvclN0YW5kYXJkIiwic2l6ZU1vZHVsZSIsInNjcm9sbGJhck1vZHVsZTEiLCJzY3JvbGxiYXJHaG9zdEhhaXJsaW5lIiwiR3VpbGRNb2R1bGUiLCJnZXRSZWxhdGlvbnNoaXBzIiwic2Vzc2lvbk1vZHVsZSIsImdldFNlc3Npb25zIiwic2l6ZTE0IiwiaDUiLCJnZXRQcm9maWxlVmFsdWUiLCJnZXRTdGF0aXN0aWNzIiwiZ2V0U2Vzc2lvblZhbHVlIiwibWFyZ2luQm90dG9tMjAiLCJzZXNzaW9uc1JhdyIsInNlc3Npb25zIiwic2Vzc2lvbklkIiwiY2xpZW50SW5mbyIsIm9zIiwiY2xpZW50IiwiYWN0aXZpdGllcyIsInJlcGVhdCIsImNyZWF0ZWRBdCIsImF2YXRhclVSTCIsImF2YXRhciIsImdldEF2YXRhclVSTCIsImdldERhdGUiLCJnZXRNb250aCIsImdldEZ1bGxZZWFyIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImZsYWdzIiwiaGFzUHJlbWl1bVN1YnNjcmlwdGlvbiIsImVtYWlsIiwibWZhRW5hYmxlZCIsIm1vYmlsZSIsInBob25lIiwidmVyaWZpZWQiLCJuc2Z3QWxsb3dlZCIsInJlbGF0aW9ucyIsImZyaWVuZHMiLCJpc0ZyaWVuZCIsImlzQmxvY2tlZCIsImhpZ2h0bGlnaHRKUyIsImhpZ2hsaWdodCIsIm1lc3NhZ2VNb2R1bGUxIiwibWVzc2FnZU1vZHVsZTIiLCJDb2RlQ29udGVudCIsImxpc3RMYW5ndWFnZXMiLCJfX2h0bWwiLCJsYW5ndWFnZSIsIm1hcmdpbkJvdHRvbTgiLCJmb3JtTW9kdWxlIiwic3RhdGVzIiwiRm9ybVNlY3Rpb24iLCJhbGxDb21wb25lbnRzIiwiY29tcCIsImNvbXBOYW1lIiwiY29tcFBhdGgiLCJyZW5kZXJzIiwiQ29tcG9uZW50UHJldmlldyIsInRhYiIsIkFsbFByZXZpZXdzIiwiZ2V0UHJvcHMiLCJyZW5kZXJQcmV2aWV3IiwicGFkZGluZyIsImJvcmRlclJhZGl1cyIsInJlbmRlckNvZGUiLCJnZW5lcmF0ZUNvZGUiLCJnZXRTdHJGb3JQcm9wIiwibGFuZyIsIlN0cmluZyIsIiQkdHlwZW9mIiwiU3ltYm9sIiwiZm9yIiwiY29tcENhdGVnb3J5IiwicHJvcFN0cmluZ3MiLCJjaGlsZHJlblByb3AiLCJzdHIiLCJvcGVuVGFnIiwiY2xvc2VUYWciLCJ2aXNpYmxlS2V5IiwicHJvcE9iamVjdCIsImlzTGFzdCIsImlzRmlyc3QiLCJjaGlsZHJlbkRhdGEiLCJoZWxwIiwic3VjY2VzcyIsInNldFN0YXRlIiwibWFyZ2luQm90dG9tIiwiVjJDX1BsdWdpbkNhcmQiLCJzaG93U2V0dGluZ3MiLCJzZXRJbml0aWFsU3RhdGUiLCJoYXNTZXR0aW5ncyIsImFkZG9uIiwiZ2V0U2V0dGluZ3NQYW5lbCIsInJlbG9hZHMiLCJ0cnVzdGVkIiwiY2xvc2VTZXR0aW5ncyIsInBhbmVsUmVmIiwic2V0dGluZ3NPcGVuIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicmVmcyIsInNldHRpbmdzcGFuZWwiLCJpc0hpZGRlbiIsImNUb3AiLCJzY3JvbGxUb3AiLCJjQm90dG9tIiwiZVRvcCIsIm9mZnNldFRvcCIsImVCb3R0b20iLCJjYXJkTm9kZSIsInRoaXNOb2RlT2Zmc2V0IiwiY29udGFpbmVyT2Zmc2V0IiwiZW5kUG9pbnQiLCJnZXRTdHJpbmciLCJzZXR0aW5nc0NvbXBvbmVudCIsInJlZiIsIlhTdmciLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsImJ1aWxkVGl0bGUiLCJuYW1lSW5kZXgiLCJ2ZXJzaW9uSW5kZXgiLCJhdXRob3JJbmRleCIsInBvcExheWVyIiwibWFrZUxpbmsiLCJtYWtlQnV0dG9uIiwiYWN0aW9uIiwidW5tb3VudGVkIiwibGlua3MiLCJpbnZpdGUiLCJ0ZXN0ZXIiLCJkb25hdGUiLCJwYXRyZW9uIiwiYXV0aG9ySWQiLCJhdXRob3JMaW5rIiwiaXNTY2FubmluZyIsIlRvb2x0aXAiLCJhc2NlbmRpbmciLCJpc1BsdWdpbnMiLCJyZXZlcnNlIiwib25BZGRvbkNoYW5nZXMiLCJvcGVuRm9sZGVyIiwib3BlblBhdGgiLCJzaG91bGREZWxldGUiLCJjb25maXJtRGVsZXRlIiwic29ydE9wdGlvbnMiLCJkaXJlY3Rpb25zIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJnZXRBZGRvbnMiLCJzb3J0ZWRBZGRvbnMiLCJiIiwiY2FwIiwiZmlyc3QiLCJzZWNvbmQiLCJsb2NhbGVDb21wYXJlIiwicmVuZGVyQ2hlY2tVcGRhdGVzIiwiWmVyZXNQbHVnaW5MaWJyYXJ5IiwiUGx1Z2luVXBkYXRlcyIsImNoZWNrQWxsIiwidG9vbHRpcElzU2hvd2luZyIsInRvb2x0aXAiLCJtYXJnaW5MZWZ0IiwiY2hlY2tVcGRhdGVCdXR0b24iLCJFbXVsYXRlZFRvb2x0aXAiLCJhdHRhY2hFdmVudHMiLCJyZWZyZXNoSWNvbiIsImFkZG9uQ2FyZHMiLCJmaWxsUnVsZSIsImNsaXBSdWxlIiwic3Ryb2tlTGluZWNhcCIsInN0cm9rZUxpbmVqb2luIiwiVjJDX0NoZWNrYm94IiwiY2hlY2tib3hFbGVtZW50IiwiY2hlY2tib3giLCJjaGVja2JveElubmVyIiwiU2VsZWN0IiwiZHJvcGRvd24iLCJjcmVhdGVSZWYiLCJzaG93TWVudSIsImhpZGVNZW51Iiwib3B0IiwiaXNPcGVuIiwiU2VhcmNoIiwib25LZXlEb3duIiwicGxhY2Vob2xkZXIiLCJzd2l0Y2giLCJWMkNfQ29udGVudENvbHVtbiIsImNvbnRlbnRNb2R1bGUiLCJjb250ZW50Q29sdW1uIiwiY29udGVudENvbHVtbkRlZmF1bHQiLCJWMkNfQ3NzRWRpdG9yIiwibGluZXMiLCJkZXRhY2hlZEVkaXRvciIsIlYyQ19Dc3NFZGl0b3JEZXRhY2hlZCIsInVwZGF0ZUNzcyIsInNhdmVDc3MiLCJkZXRhY2giLCJkZXRhY2hlZCIsImVkaXRvciIsImFjZSIsInNldFRoZW1lIiwic2V0TW9kZSIsInNldFNob3dQcmludE1hcmdpbiIsInNldEZvbnRTaXplIiwiZGVzdHJveSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsInVubW91bnRDb21wb25lbnRBdE5vZGUiLCJkZXRhY2hlZFJvb3QiLCJjb2RlTWlycm9yIiwibGluZU51bWJlcnMiLCJtb2RlIiwiaW5kZW50VW5pdCIsInNjcm9sbGJhclN0eWxlIiwiX2Njc3MiLCJjY3NzIiwidXBkYXRlTGluZUNvdW50IiwibGluZUNvdW50IiwiU2V0dGluZ3NUaXRsZSIsIkNoZWNrYm94IiwiYm9yZGVyUmlnaHQiLCJib3JkZXJMZWZ0IiwiZm9udFNpemUiLCJhcmciLCJnZXRWYWx1ZSIsImRyb290IiwiX3Jvb3QiLCJpbmplY3REZXRhY2hlZFJvb3QiLCJyb290IiwiaW5qZWN0Um9vdCIsIkJERXJyb3JCb3VuZGFyeSIsImhhc0Vycm9yIiwiY29tcG9uZW50RGlkQ2F0Y2giLCJEZWxldGUiLCJEb3duQXJyb3ciLCJFZGl0IiwibWFyZ2luTW9kdWxlIiwibWFyZ2luVG9wNjAiLCJWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXMiLCJwcmV2aWV3IiwiaXNmZXRjaGluZyIsImFzc2V0Q29tcG9uZW50cyIsInVwZGF0ZVdoZW5GZXRjaGVkIiwiZGVmYXVsdFNldHRpbmciLCJSUENQcm9wcyIsImFzc2V0IiwidXBkYXRlUHJldmlldyIsIm9wdGlvbnNDb21wb25lbnRzIiwib2hnb2RvaGZ1Y2siLCJfb3B0aW9uc0NvbXBvbmVudHMiLCJhcnJheSIsImlucHV0VGV4dE1vZHVsZXMiLCJJbnB1dFRleHQiLCJyZW1vdmVLZXliaW5kIiwiX2hvcml6b250YWwiLCJpbnB1dE1pbmkiLCJzaXplMTYiLCJzaXplMjAiLCJpbnB1dCIsImxhc3RFZGl0ZWQiLCJpc1RpbWluZyIsInJvd01vZHVsZSIsImZsZXhNb2R1bGUiLCJpbnB1dE1vZHVsZSIsInNpemVNb2R1bGUyIiwicm93IiwiZmxleENoaWxkIiwiSW5wdXROdW1iZXJNb2R1bGVzIiwiSW5wdXROdW1iZXIiLCJjb2xvclRyYW5zcGFyZW50Iiwic2V0VmFsdWUiLCJjbGlwYm9hcmQiLCJJbnB1dENob2ljZU1vZHVsZXMiLCJJbnB1dENob2ljZSIsIkRpdmlkZXJNb2R1bGVzIiwiRGl2aWRlciIsImRpdmlkZXIiLCJkaXZpZGVyRGVmYXVsdCIsIkRpc2NvcmRCdXR0b24iLCJScGNQcmV2aWV3IiwiYWN0aXZlIiwiY2hhbmdlVGFiIiwiYW5jaWVudFRhYiIsInNldEFjdGl2ZSIsImZsZXgiLCJycGMiLCJpc0FjdGl2ZSIsIlByb2ZpbGUiLCJQb3BvdXQiLCJUYWIiLCJlbXB0eUNsYXNzZXMiLCJQcmVzZW5jZUVycm9yQ2F0Y2hlciIsImVyckluZm8iLCJlbXB0eVN0YXRlSW1hZ2UiLCJlbXB0eVN0YXRlIiwiZW1wdHlTdGF0ZUhlYWRlciIsImVtcHR5U3RhdGVTdWJ0ZXh0IiwicG9wb3V0TW9kdWxlcyIsIlVzZXJQb3BvdXRDb21wb25lbnQiLCJQb3BvdXRQcm9wcyIsIlVzZXJQb3BvdXQiLCJyZW5kZXIxIiwiY2hhbm5lbElkIiwiZGlzYWJsZVVzZXJQcm9maWxlTGluayIsIl9Vc2VyUG9wb3V0IiwicG9wb3V0IiwiZXhjbHVkZVByb3BlcnRpZXMiLCJwcm9maWxlTW9kdWxlcyIsIlVzZXJQcm9maWxlQ29tcG9uZW50IiwiUHJvZmlsZVByb3BzIiwiY29ubmVjdGVkUHJvZmlsZVN0b3JlIiwiVXNlclByb2ZpbGUiLCJyZW5kZXIyIiwicmVuZGVyMyIsInJlbmRlcjQiLCJwcm9maWxlIiwiU2V0dGluZ3NWaWV3IiwiY2hhbmdlQ2F0ZWdvcnkiLCJzZWFyY2hLZXlEb3duIiwiY2hlY2tDb25uZWN0aW9uIiwiY29ubmVjdCIsIkd1aWxkU3RvcmUiLCJBdmF0YXJEZWZhdWx0cyIsIlNvcnRlZEd1aWxkU3RvcmUiLCJob29rcyIsInNlbGVjdGVkQ2F0ZWdvcnkiLCJsb2FkaW5nIiwic2VydmVycyIsImNvbm5lY3Rpb24iLCJjYXRlZ29yeVNsdWdzIiwiZmV0Y2giLCJzZWFyY2hFbmRQb2ludCIsInNlcnZlciIsImpvaW5lZCIsImVuZCIsInRlcm0iLCJjYXRlZ29yeUJ1dHRvbnMiLCJ0b3RhbCIsInNlcnZlckNhcmQiLCJwaW5uZWQiLCJhY2NlcHRJbnZpdGUiLCJpbnZpdGVfY29kZSIsImpvaW5FbmRQb2ludCIsImlkZW50aWZpZXIiLCJjcmVkZW50aWFscyIsIndpbmRvd09wdGlvbnMiLCJyb3VuZCIsInNjcmVlblgiLCJzY3JlZW5ZIiwid2luIiwiam9pbldpbmRvdyIsIkJyb3dzZXJXaW5kb3ciLCJ3ZWJDb250ZW50cyIsImxvYWRVUkwiLCJzZXRNZW51QmFyVmlzaWJpbGl0eSIsInJlc2l6YWJsZSIsIm1heGltaXphYmxlIiwibWluaW1pemFibGUiLCJhbHdheXNPblRvcCIsImNlbnRlciIsIndlYlByZWZlcmVuY2VzIiwibm9kZUludGVncmF0aW9uIiwiYmRTZXJ2ZXIiLCJvbmxpbmUiLCJtZW1iZXJzIiwiaWNvblVybCIsIm5hdGl2ZWpvaW4iLCJzZXJ2ZXIyIiwiZ3VpbGRMaXN0IiwiZ2V0RmxhdHRlbmVkR3VpbGRJZHMiLCJkZWZhdWx0TGlzdCIsIkRFRkFVTFRfQVZBVEFSUyIsIlNlcnZlckNhcmQiLCJmYWxsYmFjayIsImZsb29yIiwiY29ubmVjdEVuZFBvaW50IiwicmVzcG9uc2UiLCJvblNldFNlY3Rpb24iLCJzZWFyY2hJbnB1dCIsImdldFRoaXMiLCJzZXJjaGlucHV0Iiwic2VhcmNoaW5wdXQiLCJtYXhMZW5ndGgiLCJub3RDb25uZWN0ZWQiLCJjb2x1bW5Nb2R1bGUiLCJtaW5IZWlnaHQiLCJsaW5lSGVpZ2h0IiwidXNlRWZmZWN0IiwiVGFiQmFyU2VwYXJhdG9yIiwiVjJDX1NlcnZlckNhcmQiLCJpbWFnZUVycm9yIiwiY2FyZE1vZHVsZSIsImNhcmQiLCJjYXJkUHJpbWFyeSIsIl9ob3Jpem9udGFsUmV2ZXJzZSIsIndyYXBNb2R1bGUiLCJub1dyYXAiLCJzdHJlYW1lck1vZGVFbmFibGVkIiwib25FcnJvciIsImhhbmRsZUVycm9yIiwiZHJhZ2dhYmxlIiwiaG9yaXpvbnRhbCIsIlYyQ19SZWxvYWRJY29uIiwieG1sbnMiLCJWMkNfU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCIsIlNldHRpbmdzR3JvdXAiLCJzd2l0Y2hJdGVtIiwiYmV0YUNsYXNzTmFtZXMiLCJWMkNfU2V0dGluZ3NHcm91cCIsInJlbmRlck9sZFNldHRpbmdzIiwiYnV0dG9uQ29tcG9uZW50IiwiYmV0YSIsInVzZXJTZXR0aW5nc1ZvaWNlIiwiREVGQVVMVCIsIlYyQ19TZXR0aW5nc1RpdGxlIiwiY2xhc3NuYW1lcyIsImdldENsYXNzTmFtZSIsIlN3aXRjaEl0ZW0iLCJWMkNfVGFiQmFyU2VwYXJhdG9yIiwiVG9vbHRpcENsYXNzZXMiLCJnZXRUb29sdGlwQ2xhc3NlcyIsIlRvb2x0aXBMYXllcnMiLCJnZXRUb29sdGlwTGF5ZXJzIiwiZ2V0Q2xhc3MiLCJzaWRlT3JDb2xvciIsInVwcGVyQ2FzZSIsInRvb2x0aXBDbGFzcyIsImNsYXNzRXhpc3RzIiwidG9QeCIsInByZXZlbnRGbGlwIiwidG9vbHRpcEVsZW1lbnQiLCJsYWJlbEVsZW1lbnQiLCJ0b29sdGlwQ29udGVudCIsInBvaW50ZXJFbGVtZW50IiwidG9vbHRpcFBvaW50ZXIiLCJwb3BvdXRzIiwiY2FuU2hvd0Fib3ZlIiwiY2FuU2hvd0JlbG93IiwiY2FuU2hvd0xlZnQiLCJjYW5TaG93UmlnaHQiLCJfY2xhc3NOYW1lIiwic2hvd0Fib3ZlIiwic2hvd0JlbG93Iiwic2hvd0xlZnQiLCJzaG93UmlnaHQiLCJjZW50ZXJIb3Jpem9udGFsbHkiLCJjZW50ZXJWZXJ0aWNhbGx5Iiwibm9kZWNlbnRlciIsImZpbmRET01Ob2RlIiwiVjJDX1hTdmciXSwibWFwcGluZ3MiOiI7O1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FB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SCxLQURHLEVBRUg7QUFBQ3dzRCxXQUFLLEVBQUUsNEJBQVI7QUFBc0MzdEIsYUFBTyxFQUFFLFdBQS9DO0FBQTREN3pCLFdBQUssRUFBRTtBQUFDeWUsYUFBSyxFQUFFLE1BQVI7QUFBZ0JvTSxjQUFNLEVBQUU7QUFBeEI7QUFBbkUsS0FGRyxFQUdILzJCLG1EQUFJLENBQUN5bkIsS0FBTCxDQUFXdm1CLGFBQVgsQ0FDSSxHQURKLEVBRUk7QUFBQ0MsZUFBUyxFQUFFLFlBQVo7QUFBMEJnL0IsVUFBSSxFQUFFLE1BQWhDO0FBQXdDMmUsY0FBUSxFQUFFO0FBQWxELEtBRkosRUFHSTkrQyxtREFBSSxDQUFDeW5CLEtBQUwsQ0FBV3ZtQixhQUFYLENBQXlCLE1BQXpCLEVBQWlDO0FBQUN5N0IsT0FBQyxFQUFFO0FBQUosS0FBakMsQ0FISixFQUlJMzhCLG1EQUFJLENBQUN5bkIsS0FBTCxDQUFXdm1CLGFBQVgsQ0FBeUIsTUFBekIsRUFBaUM7QUFBQ0MsZUFBUyxFQUFFLE1BQVo7QUFBb0JnL0IsVUFBSSxFQUFFLFNBQTFCO0FBQXFDeEQsT0FBQyxFQUFFO0FBQXhDLEtBQWpDLENBSkosQ0FIRyxDQUFQO0FBVUg7O0FBaEJxRCxDOzs7Ozs7Ozs7OztBQ0YxRCxtQzs7Ozs7Ozs7Ozs7QUNBQSxxQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSwrQjs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSxpQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LmpzXCIpO1xuIiwiZXhwb3J0IGNvbnN0IG1pbmltdW1EaXNjb3JkVmVyc2lvbiA9IFwiMC4wLjMwN1wiO1xuZXhwb3J0IGNvbnN0IGN1cnJlbnREaXNjb3JkVmVyc2lvbiA9ICh3aW5kb3cuRGlzY29yZE5hdGl2ZSAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAgJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwLmdldFZlcnNpb24gJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwLmdldFZlcnNpb24oKSkgfHwgXCIwLjAuMzA3XCI7XG5leHBvcnQgY29uc3QgbWluU3VwcG9ydGVkVmVyc2lvbiA9IFwiMC4zLjBcIjtcbmV4cG9ydCBjb25zdCBiYmRWZXJzaW9uID0gXCIwLjMuNVwiO1xuZXhwb3J0IGNvbnN0IGJiZENoYW5nZWxvZyA9IHtcbiAgICBkZXNjcmlwdGlvbjogXCJCaWcgdGhpbmdzIGFyZSBjb21pbmcuXCIsXG4gICAgY2hhbmdlczogW1xuICAgICAgICB7XG4gICAgICAgICAgICB0aXRsZTogXCJCdWcgRml4ZXNcIixcbiAgICAgICAgICAgIHR5cGU6IFwiZml4ZWRcIixcbiAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgXCJTb21lIGZpeGVzIHJlbGF0ZWQgdG8gc2hvd2luZyBtb2RhbHMgaW4gdGhlIGBCZEFwaWAuXCIsXG4gICAgICAgICAgICAgICAgXCJGaXhlZCB0aGUgb3BlbiBmb2xkZXIgYnV0dG9ucyBmb3IgcGx1Z2lucyBhbmQgdGhlbWVzXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIF1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXR0aW5ncyA9IHtcbiAgICBcIkN1c3RvbSBjc3MgbGl2ZSB1cGRhdGVcIjogICAgIHtpZDogXCJiZGEtY3NzLTBcIiwgaW5mbzogXCJcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCAgY2F0OiBcImNvcmVcIn0sXG4gICAgXCJDdXN0b20gY3NzIGF1dG8gdWRwYXRlXCI6ICAgICB7aWQ6IFwiYmRhLWNzcy0xXCIsIGluZm86IFwiXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgIGNhdDogXCJjb3JlXCJ9LFxuICAgIFwiQmV0dGVyRGlzY29yZCBCbHVlXCI6ICAgICAgICAge2lkOiBcImJkYS1ncy1iXCIsICBpbmZvOiBcIlJlcGxhY2UgRGlzY29yZCBibHVlIHdpdGggQkQgQmx1ZVwiLCAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IGZhbHNlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIn0sXG5cbiAgICAvKiBDb3JlICovXG4gICAgLyogPT09PT09ICovXG4gICAgXCJQdWJsaWMgU2VydmVyc1wiOiAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTFcIiwgIGluZm86IFwiRGlzcGxheSBwdWJsaWMgc2VydmVycyBidXR0b25cIiwgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJNaW5pbWFsIE1vZGVcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTJcIiwgIGluZm86IFwiSGlkZSBlbGVtZW50cyBhbmQgcmVkdWNlIHRoZSBzaXplIG9mIGVsZW1lbnRzLlwiLCAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJWb2ljZSBNb2RlXCI6ICAgICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTRcIiwgIGluZm86IFwiT25seSBzaG93IHZvaWNlIGNoYXRcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJIaWRlIENoYW5uZWxzXCI6ICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTNcIiwgIGluZm86IFwiSGlkZSBjaGFubmVscyBpbiBtaW5pbWFsIG1vZGVcIiwgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJEYXJrIE1vZGVcIjogICAgICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTVcIiwgIGluZm86IFwiTWFrZSBjZXJ0YWluIGVsZW1lbnRzIGRhcmsgYnkgZGVmYXVsdCh3aXApXCIsICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJWb2ljZSBEaXNjb25uZWN0XCI6ICAgICAgICAgICB7aWQ6IFwiYmRhLWRjLTBcIiwgIGluZm86IFwiRGlzY29ubmVjdCBmcm9tIHZvaWNlIHNlcnZlciB3aGVuIGNsb3NpbmcgRGlzY29yZFwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCIyNCBIb3VyIFRpbWVzdGFtcHNcIjogICAgICAgICB7aWQ6IFwiYmRhLWdzLTZcIiwgIGluZm86IFwiUmVwbGFjZSAxMmhyIHRpbWVzdGFtcHMgd2l0aCBwcm9wZXIgb25lc1wiLCAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJDb2xvcmVkIFRleHRcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTdcIiwgIGluZm86IFwiTWFrZSB0ZXh0IGNvbG9yIHRoZSBzYW1lIGFzIHJvbGUgY29sb3JcIiwgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJOb3JtYWxpemUgQ2xhc3Nlc1wiOiAgICAgICAgICB7aWQ6IFwiZm9yay1wcy00XCIsIGluZm86IFwiQWRkcyBzdGFibGUgY2xhc3NlcyB0byBlbGVtZW50cyB0byBoZWxwIHRoZW1lcy4gKGUuZy4gYWRkcyAuZGEtY2hhbm5lbHMgdG8gLmNoYW5uZWxzLUllMmw2QSlcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxuXG4gICAgLyogQ29udGVudCAqL1xuICAgIFwiQ29udGVudCBFcnJvciBNb2RhbFwiOiAgICAgICAge2lkOiBcImZvcmstcHMtMVwiLCBpbmZvOiBcIlNob3dzIGEgbW9kYWwgd2l0aCBwbHVnaW4vdGhlbWUgZXJyb3JzXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXG4gICAgXCJTY2FuIFBsdWdpbnNcIjogICAgICAgICAgICAgICB7aWQ6IFwiZm9yay1wcy02XCIsIGluZm86IFwiU2NhbiBwbHVnaW5zIGZvciBhbnkgdGhyZWF0IHRoYXQgY2FuIGJlIGhpZGRlbiBpbnNpZGUuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXG4gICAgXCJTaG93IFRvYXN0c1wiOiAgICAgICAgICAgICAgICB7aWQ6IFwiZm9yay1wcy0yXCIsIGluZm86IFwiU2hvd3MgYSBzbWFsbCBub3RpZmljYXRpb24gZm9yIGltcG9ydGFudCBpbmZvcm1hdGlvblwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxuICAgIFwiU2Nyb2xsIFRvIFNldHRpbmdzXCI6ICAgICAgICAge2lkOiBcImZvcmstcHMtM1wiLCBpbmZvOiBcIkF1dG8tc2Nyb2xscyB0byBhIHBsdWdpbidzIHNldHRpbmdzIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkIChvbmx5IGlmIG91dCBvZiB2aWV3KVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxuICAgIFwiQXV0b21hdGljIExvYWRpbmdcIjogICAgICAgICAge2lkOiBcImZvcmstcHMtNVwiLCBpbmZvOiBcIkF1dG9tYXRpY2FsbHkgbG9hZHMsIHJlbG9hZHMsIGFuZCB1bmxvYWRzIHBsdWdpbnMgYW5kIHRoZW1lc1wiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxuICAgIFwiRW5hYmxlIEVkaXQgQnV0dG9uXCI6ICAgICAgICAge2lkOiBcImZvcmstcHMtN1wiLCBpbmZvOiBcIkVuYWJsZSBhbiBFZGl0IEJ1dHRvbiBvbiB0aGUgcGx1Z2luIGFuZCB0aGVtZSBwYW5lbC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcbiAgICBcIlRoZW1lcyBpbiBQb3BvdXQgV2luZG93XCI6ICAgIHtpZDogXCJsaWdodGNvcmQtOVwiLCBpbmZvOiBcIkVuYWJsZSB0aGVtZXMgaW4gUG9wb3V0IFdpbmRvdy4gKEZvciBleGFtcGxlLCB3aGVuIGRldGFjaGluZyBzY3JlZW5zaGFyZS4pXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIiwgZXhwZXJpbWVudGFsOiB0cnVlfSxcblxuICAgIC8qIERldmVsb3BlciAqL1xuICAgIFwiRGV2ZWxvcGVyIE1vZGVcIjogICAgICAgICBcdCAge2lkOiBcImJkYS1ncy04XCIsIGluZm86IFwiRGV2ZWxvcGVyIE1vZGUgVG9nZ2xlXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXG4gICAgXCJDb3B5IFNlbGVjdG9yXCI6XHRcdFx0ICB7aWQ6IFwiZm9yay1kbS0xXCIsIGluZm86IFwiQWRkcyBhIFxcXCJDb3B5IFNlbGVjdG9yXFxcIiBvcHRpb24gdG8gY29udGV4dCBtZW51cyB3aGVuIGRldmVsb3BlciBtb2RlIGlzIGFjdGl2ZVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiZGV2ZWxvcGVyIHNldHRpbmdzXCJ9LFxuXG4gICAgLyoqIExpZ2h0Y29yZCAqL1xuICAgIFwiRGlzYWJsZSBCZXR0ZXJEaXNjb3JkXCI6ICAgICAge2lkOiBcImJkLWRpc2FibGVcIiwgIGluZm86IFwiRGlzYWJsZSBCZXR0ZXJkaXNjb3JkIChwbHVnaW5zLCB0aGVtZXMsIGV0YykgKE5vdCBpbXBsZW1lbnRlZCkuXCIsIGltcGxlbWVudGVkOiBmYWxzZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXG4gICAgXCJCbHVyIFBlcnNvbmFsIEluZm9ybWF0aW9uXCI6ICB7aWQ6IFwibGlnaHRjb3JkLTZcIiwgaW5mbzogXCJCbHVyIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbnMgbGlrZSBlbWFpbCwgcGF5bWVudCBpbmZvcyBhbmQgbW9yZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxuICAgIFwiQ2FsbGluZyBSaW5nIEJlYXRcIjogICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0yXCIsIGluZm86IFwiRW5hYmxlIERpc2NvcmQncyBzcGVjaWFsIGNhbGxpbmcgYmVhdC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxuICAgIFwiRGV2ZWxvcGVyIE9wdGlvbnNcIjogICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0xXCIsIGluZm86IFwiRW5hYmxlIERpc2NvcmQncyAmIExpZ2h0Y29yZCdzIEludGVybmFsIERldmVsb3BlciBPcHRpb25zLiBUaGlzIGFsbG93IHRoZSBcXFwiRXhwZXJpbWVudHNcXFwiIHRhYiwgdGhlIFxcXCJEZXZlbG9wZXIgT3B0aW9uc1xcXCIgdGFiIGFuZCB0aGUgXFxcIkxpZ2h0Y29yZCBBcGlcXFwiIHNlY3Rpb24uXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcbiAgICBcIkFkIEJsb2NrXCI6ICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtNFwiLCBpbmZvOiBcIkJsb2NrIGFueSBCT1QgdGhhdCBkbXMgeW91IHdpdGggYW4gaW52aXRlIGxpbmsuIEV2ZW4gaW4gYW4gZW1iZWQuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcbiAgICBcIkVuYWJsZSBMaWdodGNvcmQgU2VydmVyc1wiOiAgIHtpZDogXCJsaWdodGNvcmQtNVwiLCBpbmZvOiBcIkVuYWJsZSBMaWdodGNvcmQncyBzZXJ2ZXJzLiBEaXNhYmxpbmcgdGhpcyB3aWxsIGRpc2FibGUgY3VzdG9tIGJhZGdlcy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxuICAgIFwiRGlzYWJsZSB0eXBpbmdcIjogICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC03XCIsIGluZm86IFwiRG9uJ3QgbGV0IG90aGVyIHNlZSB5b3UncmUgdHlwaW5nLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXG4gICAgXCJMaWdodGNvcmQgVGFic1wiOiAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLThcIiwgaW5mbzogXCJBbGxvd3MgeW91IHRvIGxhdW5jaCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTGlnaHRjb3JkIGluIHRoZSBzYW1lIHdpbmRvdy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCIsIGV4cGVyaW1lbnRhbDogdHJ1ZX0sXG4gICAgXCJVc2UgTm90aWZpY2F0aW9uIFNoaW1cIjogICAgICB7aWQ6IFwibGlnaHRjb3JkLTEwXCIsIGluZm86IFwiQmFzaWNhbGx5IGRvbid0IHVzZSBXaW5kb3dzJ3MgTm90aWZpY2F0aW9ucy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gXCJ3aW4zMlwiLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwiLCBleHBlcmltZW50YWw6IGZhbHNlfSxcblxuICAgIC8qKiBMaWdodGNvcmQgV2luZG93ICovXG4gICAgXCJBbHdheXMtb24tVG9wXCI6ICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTNcIiwgaW5mbzogXCJFbmFibGUgdGhlIHdpbmRvdydzIEFsd2F5cy1vbi1Ub3AgbW9kZSwgd2hlcmUgTGlnaHRjb3JkIHN0YXlzIG9uIHRvcCBvZiBvdGhlciBhcHBsaWNhdGlvbnMuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcbiAgICBcIk5vIFdpbmRvdyBCb3VuZHNcIjogICAgICAgICAgIHtpZDogXCJub193aW5kb3dfYm91bmRcIiwgaW5mbzogXCJEaXNhYmxlIFdpbmRvdyBCb3VuZHMuIENhbiBiZSB1c2VmdWwgaWYgeW91IHVzZSBhIHdpbmRvdyBtYW5hZ2VyLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBwcm9jZXNzLnBsYXRmb3JtICE9PSBcImxpbnV4XCIsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxuICAgIFwiRW5hYmxlIEdsYXNzdHJvblwiOiAgICAgICAgICAge2lkOiBcImVuYWJsZV9nbGFzc3Ryb25cIiwgaW5mbzogXCJFbmFibGUgR2xhc3N0cm9uLiBJZiB5b3UncmUgbm90IHVzaW5nIHRyYW5zcGFyZW50IHRoZW1lcywgdGhpcyBjYW4gcmVkdWNlIGxhZy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxuICAgIFxuICAgIC8qKiBSaWNoUHJlc2VuY2UgKi9cbiAgICBcIkVuYWJsZVwiOiAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiLCBpbmZvOiBcIkVuYWJsZSBSaWNoUHJlc2VuY2UgYmVsb3cuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwic3RhdHVzXCJ9XG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvb2tpZSA9IHtcbiAgICBcImJkYS1ncy0xXCI6IHRydWUsXG4gICAgXCJiZGEtZ3MtMlwiOiBmYWxzZSxcbiAgICBcImJkYS1ncy0zXCI6IGZhbHNlLFxuICAgIFwiYmRhLWdzLTRcIjogZmFsc2UsXG4gICAgXCJiZGEtZ3MtNVwiOiB0cnVlLFxuICAgIFwiYmRhLWdzLTZcIjogZmFsc2UsXG4gICAgXCJiZGEtZ3MtN1wiOiBmYWxzZSxcbiAgICBcImJkYS1ncy04XCI6IGZhbHNlLFxuICAgIFwiYmRhLWVzLTBcIjogdHJ1ZSxcbiAgICBcImJkYS1lcy0xXCI6IHRydWUsXG4gICAgXCJiZGEtZXMtMlwiOiB0cnVlLFxuICAgIFwiYmRhLWVzLTRcIjogZmFsc2UsXG4gICAgXCJiZGEtZXMtNlwiOiB0cnVlLFxuICAgIFwiYmRhLWVzLTdcIjogdHJ1ZSxcbiAgICBcImJkYS1ncy1iXCI6IGZhbHNlLFxuICAgIFwiYmRhLWVzLThcIjogdHJ1ZSxcbiAgICBcImJkYS1kYy0wXCI6IGZhbHNlLFxuICAgIFwiYmRhLWNzcy0wXCI6IGZhbHNlLFxuICAgIFwiYmRhLWNzcy0xXCI6IGZhbHNlLFxuICAgIFwiYmRhLWVzLTlcIjogdHJ1ZSxcbiAgICBcImZvcmstZG0tMVwiOiBmYWxzZSxcbiAgICBcImZvcmstcHMtMVwiOiB0cnVlLFxuICAgIFwiZm9yay1wcy0yXCI6IHRydWUsXG4gICAgXCJmb3JrLXBzLTNcIjogdHJ1ZSxcbiAgICBcImZvcmstcHMtNFwiOiB0cnVlLFxuICAgIFwiZm9yay1wcy01XCI6IHRydWUsXG4gICAgXCJmb3JrLXBzLTZcIjogdHJ1ZSxcbiAgICBcImZvcmstcHMtN1wiOiBmYWxzZSxcbiAgICBcImZvcmstZXMtMlwiOiBmYWxzZSxcbiAgICBcImZvcmstZXMtM1wiOiB0cnVlLFxuICAgIFwiZm9yay13cC0xXCI6IGZhbHNlLFxuICAgIFwiZm9yay13cC0yXCI6IGZhbHNlLFxuICAgIFwiZm9yay1iZXRhXCI6IHRydWUsXG4gICAgXCJsaWdodGNvcmQtMVwiOiBmYWxzZSxcbiAgICBcImxpZ2h0Y29yZC0yXCI6IHRydWUsXG4gICAgXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiOiBmYWxzZSxcbiAgICBcImxpZ2h0Y29yZC0zXCI6IGZhbHNlLFxuICAgIFwibGlnaHRjb3JkLTRcIjogZmFsc2UsXG4gICAgXCJsaWdodGNvcmQtNVwiOiB0cnVlLFxuICAgIFwibGlnaHRjb3JkLTZcIjogdHJ1ZSxcbiAgICBcImxpZ2h0Y29yZC03XCI6IGZhbHNlLFxuICAgIFwibGlnaHRjb3JkLThcIjogZmFsc2UsXG4gICAgXCJsaWdodGNvcmQtOVwiOiBmYWxzZSxcbiAgICBcImxpZ2h0Y29yZC0xMFwiOiBmYWxzZSxcbiAgICBcIm5vX3dpbmRvd19ib3VuZFwiOiBmYWxzZSxcbn07XG5cblxuZXhwb3J0IGNvbnN0IHNldHRpbmdzQ29va2llID0ge307XG5cbmV4cG9ydCBjb25zdCBzZXR0aW5nc1JQQyA9IHt9O1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRSUEMgPSB7XG4gICAgXCJuYW1lXCI6IFwiTGlnaHRjb3JkXCIsXG4gICAgXCJhcHBsaWNhdGlvbl9pZFwiOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiLFxuICAgIFwic3RhdGVcIjogXCJMaWdodGNvcmQgQ2xpZW50XCIsXG4gICAgXCJkZXRhaWxzXCI6IFwiQnJvd3NpbmcgRGlzY29yZFwiLFxuICAgIFwidGltZXN0YW1wcy5zdGFydFwiOiBEYXRlLm5vdygpLFxuICAgIFwiYXNzZXRzLnNtYWxsXCI6IG51bGwsXG4gICAgXCJhc3NldHMubGFyZ2VcIjogXCI3MTIzMjM4MjEwMzc2ODI3OTFcIlxufVxuXG5leHBvcnQgY29uc3QgbGlnaHRjb3JkU2V0dGluZ3MgPSB7fTtcbmV4cG9ydCBjb25zdCBkZWZhdWx0TGlnaHRjb3JkU2V0dGluZ3MgPSB7fTtcblxuZXhwb3J0IGNvbnN0IGJkcGx1Z2luRXJyb3JzID0gW107XG5leHBvcnQgY29uc3QgYmR0aGVtZUVycm9ycyA9IFtdOyAvLyBkZWZpbmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cbmV4cG9ydCBjb25zdCBiZENvbmZpZyA9IE9iamVjdC5jcmVhdGUoQmV0dGVyRGlzY29yZENvbmZpZyk7XG5cbmV4cG9ydCBjb25zdCBiZHRoZW1lcyA9IHt9O1xuZXhwb3J0IGNvbnN0IGJkcGx1Z2lucyA9IHt9O1xuXG5leHBvcnQgY29uc3QgcGx1Z2luQ29va2llID0ge307XG5leHBvcnQgY29uc3QgdGhlbWVDb29raWUgPSB7fTsiLCJpbXBvcnQgbG9jYWxTdG9yYWdlRml4IGZyb20gXCIuL2xvY2FsU3RvcmFnZUZpeFwiO1xuaW1wb3J0IGxvYWRpbmdJY29uIGZyb20gXCIuL2xvYWRpbmdJY29uXCI7XG5sb2NhbFN0b3JhZ2VGaXgoKTtcbmxvYWRpbmdJY29uKCk7XG5cbmNvbnN0IGRlcHJlY2F0ZUdsb2JhbCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywga2V5LCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIFV0aWxzLndhcm4oXCJEZXByZWNhdGVkIEdsb2JhbFwiLCBgXCIke2tleX1cIiB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLiBQbGVhc2Ugb25seSB1c2UgQmRBcGkuYCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTsgIFxufTtcblxuXG5pbXBvcnQgKiBhcyBHbG9iYWxzIGZyb20gXCIuLzBnbG9iYWxzXCI7XG5cbmNvbnN0IGdsb2JhbEtleXMgPSBPYmplY3Qua2V5cyhHbG9iYWxzKTtcbmZvciAoY29uc3Qga2V5IG9mIGdsb2JhbEtleXMpIGRlcHJlY2F0ZUdsb2JhbChrZXksIEdsb2JhbHNba2V5XSk7XG5cblxuaW1wb3J0IEJkQXBpIGZyb20gXCIuL21vZHVsZXMvYmRBcGlcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL21vZHVsZXMvdjJcIjtcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vbW9kdWxlcy9wbHVnaW5Nb2R1bGVcIjtcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vbW9kdWxlcy91dGlsc1wiO1xuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL21vZHVsZXMvYmRFdmVudHNcIjtcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL21vZHVsZXMvY29udGVudE1hbmFnZXJcIjtcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vbW9kdWxlcy9jbGFzc05vcm1hbGl6ZXJcIjtcblxuZGVwcmVjYXRlR2xvYmFsKFwiQkRWMlwiLCBCRFYyKTtcbmRlcHJlY2F0ZUdsb2JhbChcInBsdWdpbk1vZHVsZVwiLCBwbHVnaW5Nb2R1bGUpO1xuZGVwcmVjYXRlR2xvYmFsKFwidGhlbWVNb2R1bGVcIiwgdGhlbWVNb2R1bGUpO1xuZGVwcmVjYXRlR2xvYmFsKFwiVXRpbHNcIiwgVXRpbHMpO1xuZGVwcmVjYXRlR2xvYmFsKFwiQkRFdmVudHNcIiwgQkRFdmVudHMpO1xuZGVwcmVjYXRlR2xvYmFsKFwic2V0dGluZ3NQYW5lbFwiLCBzZXR0aW5nc1BhbmVsKTtcbmRlcHJlY2F0ZUdsb2JhbChcIkRhdGFTdG9yZVwiLCBEYXRhU3RvcmUpO1xuZGVwcmVjYXRlR2xvYmFsKFwiQ29udGVudE1hbmFnZXJcIiwgQ29udGVudE1hbmFnZXIpO1xuZGVwcmVjYXRlR2xvYmFsKFwiQ2xhc3NOb3JtYWxpemVyXCIsIENsYXNzTm9ybWFsaXplcik7XG5cbndpbmRvdy5CZEFwaSA9IEJkQXBpO1xuXG5pbXBvcnQgQ29yZSBmcm9tIFwiLi9tb2R1bGVzL2NvcmVcIjtcbmRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIENvcmUpO1xuXG4vLyBUT0RPOiBDaGFuZ2UgSW5pdCBtb2RlIGFuZCBzdG9wIHVzaW5nIENvcmVXcmFwcGVyLlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKGJkQ29uZmlnLCBtZXRob2RzKSB7XG4gICAgICAgIENvcmUuc2V0Q29uZmlnKGJkQ29uZmlnKTtcbiAgICAgICAgQ29yZS5zZXRNZXRob2RzKG1ldGhvZHMpO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIC8vIGRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIHRoaXMubWFpbkNvcmUpO1xuICAgICAgICBDb3JlLmluaXQoKTtcbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xuICAgIGNvbnN0IHYyTG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB2MkxvYWRlci5jbGFzc05hbWUgPSBcImJkLWxvYWRlcnYyXCI7XG4gICAgdjJMb2FkZXIudGl0bGUgPSBcIkJhbmRhZ2VkQkQgaXMgbG9hZGluZy4uLlwiO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodjJMb2FkZXIpO1xufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBjb250ZW50V2luZG93R2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiKS5nZXQ7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgXCJjb250ZW50V2luZG93XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gUmVmbGVjdC5hcHBseShjb250ZW50V2luZG93R2V0dGVyLCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm94eShjb250ZW50V2luZG93LCB7XG4gICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJsb2NhbFN0b3JhZ2VcIikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IG9ialtwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHZhbC5iaW5kKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFByZXZlbnQgaW50ZXJjZXB0aW9uIGJ5IHBhdGNoaW5nIFJlZmxlY3QuYXBwbHkgYW5kIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZmxlY3QsIFwiYXBwbHlcIiwge3ZhbHVlOiBSZWZsZWN0LmFwcGx5LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCBcImJpbmRcIiwge3ZhbHVlOiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlfSk7XG5cbiAgICBjb25zdCBvT3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuO1xuICAgIFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgaWYgKHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiYXBpL3dlYmhvb2tzXCIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkob09wZW4sIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFRGSG91ciB7XG4gICAgaW5qZWN0MjRIb3VyKCkge1xuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHJldHVybjtcblxuICAgICAgICBjb25zdCB0d2VsdmVIb3VyID0gbmV3IFJlZ0V4cChgKFswLTldezEsMn0pOihbMC05XXsxLDJ9KVxcXFxzKEFNfFBNKWApO1xuICAgICAgICBjb25zdCBjb252ZXJ0ID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IGRhdGEucmV0dXJuVmFsdWUubWF0Y2godHdlbHZlSG91cik7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZWQgfHwgbWF0Y2hlZC5sZW5ndGggIT09IDQpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkWzNdID09PSBcIkFNXCIpIHJldHVybiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZS5yZXBsYWNlKG1hdGNoZWRbMF0sIGAke21hdGNoZWRbMV0gPT09IFwiMTJcIiA/IFwiMDBcIiA6IG1hdGNoZWRbMV0ucGFkU3RhcnQoMiwgXCIwXCIpfToke21hdGNoZWRbMl19YCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWUucmVwbGFjZShtYXRjaGVkWzBdLCBgJHttYXRjaGVkWzFdID09PSBcIjEyXCIgPyBcIjEyXCIgOiBwYXJzZUludChtYXRjaGVkWzFdKSArIDEyfToke21hdGNoZWRbMl19YCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2FuY2VsQ296eSA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuVGltZUZvcm1hdHRlciwgXCJjYWxlbmRhckZvcm1hdFwiLCB7YWZ0ZXI6IGNvbnZlcnR9KTsgLy8gQ2FsbGVkIGluIENvenkgbW9kZVxuICAgICAgICBjb25zdCBjYW5jZWxDb21wYWN0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImRhdGVGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb21wYWN0IG1vZGVcbiAgICAgICAgdGhpcy5jYW5jZWwyNEhvdXIgPSAoKSA9PiB7Y2FuY2VsQ296eSgpOyBjYW5jZWxDb21wYWN0KCk7fTsgLy8gQ2FuY2VsIGJvdGhcbiAgICB9XG5cbiAgICByZW1vdmUyNEhvdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbmNlbDI0SG91cikgdGhpcy5jYW5jZWwyNEhvdXIoKTtcbiAgICB9XG59OyIsImltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXG5cbmNvbnN0IGRpc3BhdGNoZXIgPSB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmRpc3BhdGNoZXJcbmNvbnN0IENoYW5uZWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDaGFubmVsICYmIGUuZGVmYXVsdC5oYXNDaGFubmVsKVswXS5kZWZhdWx0XG5sZXQgcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKVswXVxubGV0IERNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cblxuY29uc3QgYmxvY2tlZCA9IHt9XG5cbmxldCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdXG5mdW5jdGlvbiBnZXRDdXJyZW50VXNlcigpe1xuICAgIGlmKHVzZXJNb2R1bGUpcmV0dXJuIHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEFudGlCb3RETSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5hbnRpRE0gPSB0aGlzLmFudGlETS5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgfVxuXG4gICAgZW5hYmxlKCl7XG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxuXG4gICAgICAgIGRpc3BhdGNoZXIuc3Vic2NyaWJlKFwiTUVTU0FHRV9DUkVBVEVcIiwgdGhpcy5hbnRpRE0pXG4gICAgfVxuXG4gICAgZGlzYWJsZSgpe1xuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxuXG4gICAgICAgIGRpc3BhdGNoZXIudW5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcbiAgICB9XG5cbiAgICBhbnRpRE0oZXYpe1xuICAgICAgICBpZighZXYubWVzc2FnZS5hdXRob3IuYm90KXJldHVyblxuICAgICAgICBpZihldi5tZXNzYWdlLmF1dGhvci5pZCA9PT0gZ2V0Q3VycmVudFVzZXIoKS5pZClcbiAgICAgICAgaWYoZXYubWVzc2FnZS5ndWlsZF9pZClyZXR1cm5cblxuICAgICAgICBjb25zdCBjaGFubmVsID0gQ2hhbm5lbE1vZHVsZS5nZXRDaGFubmVsKGV2Lm1lc3NhZ2UuY2hhbm5lbF9pZClcbiAgICAgICAgaWYoIWNoYW5uZWwpcmV0dXJuIC8vIG1pZ2h0IGJlIGJyb2tlblxuXG4gICAgICAgIGlmKGNoYW5uZWwudHlwZSAhPT0gMSlyZXR1cm5cblxuICAgICAgICBpZihibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSlyZXR1cm4gLy8gSWYgdGhlIHVzZXIgdW5ibG9jayB0aGUgYm90LCBEb24ndCBibG9jayBpdCBhZ2Fpbi5cblxuICAgICAgICBpZihzY2FuTWVzc2FnZShldi5tZXNzYWdlKSl7XG4gICAgICAgICAgICBibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSA9IHRydWVcbiAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChgW0FkQmxvY2tdOiBCbG9ja2VkICR7ZXYubWVzc2FnZS5hdXRob3IudXNlcm5hbWV9IyR7ZXYubWVzc2FnZS5hdXRob3IuZGlzY3JpbWluYXRvcn1gLCB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwid2FybmluZ1wiXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYoIXJlbGF0aW9uU2hpcE1vZHVsZSlyZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXApWzBdXG4gICAgICAgICAgICByZWxhdGlvblNoaXBNb2R1bGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXAoZXYubWVzc2FnZS5hdXRob3IuaWQsIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogXCJDb250ZXh0TWVudVwiXG4gICAgICAgICAgICB9LCAyKVxuICAgICAgICAgICAgaWYoIURNTW9kdWxlKURNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cbiAgICAgICAgICAgIERNTW9kdWxlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbChjaGFubmVsLmlkLCBmYWxzZSlcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2Nhbk1lc3NhZ2UobWVzc2FnZSl7XG4gICAgaWYoLyhkaXNjb3JkXFwuZ2d8ZGlzY29yZFxcLmNvbVxcL2ludml0ZVxcL3xkaXNjb3JkYXBwXFwuY29tXFwvaW52aXRlXFwvKS9nLnRlc3QobWVzc2FnZS5jb250ZW50KSlyZXR1cm4gdHJ1ZVxuICAgIGlmKEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZC5nZy9cIikgfHwgRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgXCJkaXNjb3JkLmNvbS9pbnZpdGUvXCIpIHx8IEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZGFwcC5jb20vaW52aXRlL1wiKSlyZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGZhbHNlXG59XG5mdW5jdGlvbiBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBzZWFyY2gpe1xuICAgIGxldCBlbWJlZHMgPSBtZXNzYWdlLmVtYmVkcyB8fCBbXVxuICAgIGlmKGVtYmVkcy5sZW5ndGggPT09IDApcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIGVtYmVkcy5tYXAoZW1iZWQgPT4ge1xuICAgICAgICBpZihlbWJlZC50eXBlICE9PSBcInJpY2hcIilyZXR1cm4gZmFsc2VcbiAgICAgICAgaWYoKGVtYmVkLnRpdGxlIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcbiAgICAgICAgaWYoKGVtYmVkLmRlc2NyaXB0aW9uIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcbiAgICAgICAgaWYoKChlbWJlZC5mb290ZXIgfHwgXCJcIikgJiYgZW1iZWQuZm9vdGVyLnRleHQgfHwgXCJcIikuaW5jbHVkZXMoc2VhcmNoKSlyZXR1cm4gdHJ1ZVxuICAgICAgICBpZigoZW1iZWQuZmllbGRzIHx8IFtdKS5tYXAoZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZS52YWx1ZS5pbmNsdWRlcyhzZWFyY2gpIHx8IGUubmFtZS5pbmNsdWRlcyhzZWFyY2gpXG4gICAgICAgIH0pLmluY2x1ZGVzKHRydWUpKXJldHVybiB0cnVlXG4gICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgfSkuaW5jbHVkZXModHJ1ZSlcbn0iLCJpbXBvcnQge3NldHRpbmdzUlBDLCBkZWZhdWx0UlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcblxuY29uc3QgZGlzcGF0Y2hlciA9IEJETW9kdWxlcy5nZXQobT0+bS5EaXNwYXRjaGVyJiZtLmRlZmF1bHQmJm0uZGVmYXVsdC5kaXNwYXRjaClbMF0uZGVmYXVsdFxuY29uc3QgQWN0aW9uVHlwZXMgPSBCRE1vZHVsZXMuZ2V0KG09Pm0uQWN0aW9uVHlwZXMpWzBdLkFjdGlvblR5cGVzXG5cbmNvbnN0IHNvY2tldElkID0gXCJsaWdodGNvcmQtc3Bvb2Ytc29ja2V0XCJcbmNvbnN0IHBpZCA9IHByb2Nlc3MucGlkXG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDdXN0b21SaWNoUHJlc2VuY2Uge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG5cbiAgICAgICAgdGhpcy5nYW1lID0gc2V0dGluZ3NSUENcbiAgICB9XG4gICAgXG4gICAgZ2V0IGZvcm1hdGVkR2FtZSgpe1xuICAgICAgICBpZighdGhpcy5nYW1lKXJldHVybiBudWxsXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpcmV0dXJuIG51bGxcbiAgICAgICAgbGV0IGdhbWUgPSB7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLmdhbWUubmFtZSB8fCBkZWZhdWx0UlBDLm5hbWUsXG4gICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXG4gICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmdhbWUuZGV0YWlscyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdGF0ZTogdGhpcy5nYW1lLnN0YXRlIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcbiAgICAgICAgICAgICAgICBsYXJnZV9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdLFxuICAgICAgICAgICAgICAgIHNtYWxsX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMuc21hbGxcIl0gfHwgdW5kZWZpbmVkXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdhbWVcbiAgICB9XG5cbiAgICBzZW5kR2FtZSgpe1xuICAgICAgICBkaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQ0FMX0FDVElWSVRZX1VQREFURSxcbiAgICAgICAgICAgIHNvY2tldElkLFxuICAgICAgICAgICAgcGlkLFxuICAgICAgICAgICAgYWN0aXZpdHk6IHRoaXMuZm9ybWF0ZWRHYW1lXG4gICAgICAgIH0pICAgXG4gICAgfVxuXG4gICAgZW5hYmxlKCkge1xuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcbiAgICAgICAgY29uc29sZS5sb2coXCJFbmFibGluZyBjdXN0b20gUmljaFByZXNlbmNlXCIpXG5cbiAgICAgICAgdGhpcy5zZXQoc2V0dGluZ3NSUEMgfHwgT2JqZWN0LmNyZWF0ZShkZWZhdWx0UlBDKSlcblxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcbiAgICB9XG5cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBjb25zb2xlLmxvZyhcIkRpc2FibGluZyBjdXN0b20gUmljaFByZXNlbmNlXCIpXG5cbiAgICAgICAgdGhpcy5zZW5kR2FtZSgpXG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBc3NldHMoYXBwbGljYXRpb25JZCl7XG4gICAgICAgIGxldCBhc3NldHMgPSBhd2FpdCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5nZXRBc3NldHMpWzBdLmdldEFzc2V0cyhhcHBsaWNhdGlvbklkKVxuICAgICAgICBpZihhc3NldHMudW5kZWZpbmVkICYmIHR5cGVvZiBhc3NldHMudW5kZWZpbmVkID09PSBcIm51bWJlclwiKXtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gQXBwbGljYXRpb25cIilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXNzZXRzXG4gICAgfVxuXG4gICAgc2V0KGFjdGl2aXR5KXtcbiAgICAgICAgdGhpcy5nYW1lID0gYWN0aXZpdHlcblxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcbiAgICB9XG59IiwiaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgdjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL2Rpc3RhbnRcIjtcbmltcG9ydCB7IHRpbWluZ1NhZmVFcXVhbCB9IGZyb20gXCJjcnlwdG9cIjtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIExheWVycyB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5sYXllcnMgPSBbXVxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuTGF5ZXJzID0gdGhpc1xuICAgIH1cblxuICAgIGdldCBpc0luamVjdGVkKCl7XG4gICAgICAgIHJldHVybiAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJkaXYuTGF5ZXJzLmluamVjdGVkXCIpXG4gICAgfVxuXG4gICAgaW5qZWN0KCl7XG4gICAgICAgIGlmKHRoaXMuaXNJbmplY3RlZClyZXR1cm5cbiAgICAgICAgbGV0IFtcbiAgICAgICAgICAgIGNsYXNzTmFtZUxheWVyc1xuICAgICAgICBdID0gW1xuICAgICAgICAgICAgVXRpbHMucmVtb3ZlRGEodjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUubGF5ZXJzICYmIGUubGF5ZXIpLmxheWVycylcbiAgICAgICAgXVxuICAgICAgICBjb25zdCBsYXllcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK2NsYXNzTmFtZUxheWVycyk7XG4gICAgICAgIGlmICghbGF5ZXJzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IFJlYWN0SW5zdGFuY2UgPSBMaWdodGNvcmQuQXBpLlV0aWxzLkZpbmRSZWFjdChsYXllcnMsIDEpXG4gICAgICAgIGlmKCFSZWFjdEluc3RhbmNlKXJldHVybiBsYXllcnNcbiAgICAgICAgdGhpcy5SZWFjdEluc3RhbmNlID0gUmVhY3RJbnN0YW5jZVxuICAgICAgICBsZXQgcmVuZGVyID0gUmVhY3RJbnN0YW5jZS5yZW5kZXJcbiAgICAgICAgUmVhY3RJbnN0YW5jZS5yZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSByZW5kZXIuY2FsbChSZWFjdEluc3RhbmNlKVxuICAgICAgICAgICAgbGV0IGNsYXNzTGlzdCA9IHJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuWzFdLnByb3BzLmNsYXNzTmFtZS5zcGxpdChcIiBcIilcbiAgICAgICAgICAgIGNsYXNzTGlzdC5wdXNoKFwiTGF5ZXJzXCIpXG4gICAgICAgICAgICBjbGFzc0xpc3QucHVzaChcImluamVjdGVkXCIpXG4gICAgICAgICAgICByZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlblsxXS5wcm9wcy5jbGFzc05hbWUgPSBjbGFzc0xpc3Quam9pbihcIiBcIilcblxuICAgICAgICAgICAgdGhpcy5sYXllcnMuZm9yRWFjaChsYXllciA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2hpbGRyZW4ucHVzaChsYXllclsxXSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZVxuICAgICAgICB9XG4gICAgICAgIFJlYWN0SW5zdGFuY2UuZm9yY2VVcGRhdGUoKVxuICAgIH1cblxuICAgIGNyZWF0ZUxheWVyKGNoaWxkcmVuLCBwcm9wcyA9IHt9KXtcbiAgICAgICAgbGV0IGlkID0gdXVpZHY0KClcbiAgICAgICAgbGV0IGxheWVyID0gbnVsbFxuICAgICAgICB0aGlzLmxheWVycy5wdXNoKFtpZCwgPExheWVyIHsuLi5wcm9wc30gZ2V0TGF5ZXI9e2xheSA9PiB7XG4gICAgICAgICAgICBsYXllciA9IGxheVxuICAgICAgICB9fSBrZXk9e2lkfSBpZD17aWR9IHJlbW92ZT17KCkgPT4ge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KGUgPT4gZVswXSA9PT0gaWQpXG4gICAgICAgICAgICBpZihpbmRleCA9PT0gLTEpcmV0dXJuXG4gICAgICAgICAgICB0aGlzLmxheWVycy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgICBsYXllciA9IG51bGxcbiAgICAgICAgICAgIGlmKHRoaXMuUmVhY3RJbnN0YW5jZSl0aGlzLlJlYWN0SW5zdGFuY2UuZm9yY2VVcGRhdGUoKVxuICAgICAgICAgICAgdGhpcy5pbmplY3QoKVxuICAgICAgICB9fT57Y2hpbGRyZW59PC9MYXllcj5dKVxuICAgICAgICBpZih0aGlzLlJlYWN0SW5zdGFuY2UpdGhpcy5SZWFjdEluc3RhbmNlLmZvcmNlVXBkYXRlKClcbiAgICAgICAgdGhpcy5pbmplY3QoKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVtb3ZlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoIWxheWVyKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KGUgPT4gZVswXSA9PT0gaWQpXG4gICAgICAgICAgICAgICAgICAgIGlmKGluZGV4ID09PSAtMSlyZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgICAgICAgICBsYXllciA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5SZWFjdEluc3RhbmNlKXRoaXMuUmVhY3RJbnN0YW5jZS5mb3JjZVVwZGF0ZSgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5qZWN0KClcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIucmVtb3ZlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxubGV0IExheWVyTW9kdWxlc1xuZXhwb3J0IGNsYXNzIExheWVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBhbmltYXRpb246IG5ldyB0aGlzLm1vZHVsZXNbMF0uZGVmYXVsdC5WYWx1ZSgwKVxuICAgICAgICB9IFxuICAgICAgICB0aGlzLnByb3BzLmdldExheWVyKHRoaXMpXG4gICAgICAgIHRoaXMua2V5ZG93biA9IHRoaXMua2V5ZG93bi5iaW5kKHRoaXMpXG4gICAgfVxuXG4gICAga2V5ZG93bihlKXtcbiAgICAgICAgaWYgKGUud2hpY2ggPT09IDI3KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgbW9kdWxlcygpe1xuICAgICAgICByZXR1cm4gTGF5ZXJNb2R1bGVzIHx8IChMYXllck1vZHVsZXMgPSBbXG4gICAgICAgICAgICB2Mi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5WYWx1ZSAmJiBlLmRlZmF1bHQuZGl2KVxuICAgICAgICBdKVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmtleWRvd24pXG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoZXYpe1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5rZXlkb3duKVxuICAgIH1cblxuICAgIHJlbW92ZSgpe1xuICAgICAgICB0aGlzLnByb3BzLnJlbW92ZSgpXG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbEVudGVyKGV2KXtcbiAgICAgICAgdGhpcy5tb2R1bGVzWzBdLmRlZmF1bHQudGltaW5nKHRoaXMuc3RhdGUuYW5pbWF0aW9uLCB7XG4gICAgICAgICAgICB0b1ZhbHVlOiAxLFxuICAgICAgICAgICAgZHVyYXRpb246IDEwMFxuICAgICAgICB9KS5zdGFydChldilcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsTGVhdmUoZXYpe1xuICAgICAgICB0aGlzLm1vZHVsZXNbMF0uZGVmYXVsdC50aW1pbmcodGhpcy5zdGF0ZS5hbmltYXRpb24sIHtcbiAgICAgICAgICAgIHRvVmFsdWU6IDAsXG4gICAgICAgICAgICBkdXJhdGlvbjogMTAwXG4gICAgICAgIH0pLnN0YXJ0KGV2KVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBsZXQgaW50ZXJwb2xhdGlvbiA9IHRoaXMuc3RhdGUuYW5pbWF0aW9uLmludGVycG9sYXRlKHtcbiAgICAgICAgICAgIGlucHV0UmFuZ2U6IFswLCAxXSxcbiAgICAgICAgICAgIG91dHB1dFJhbmdlOiBbMS4wNywgMV1cbiAgICAgICAgfSlcbiAgICAgICAgbGV0IHN0eWxlID0ge1xuICAgICAgICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5hbmltYXRpb24sXG4gICAgICAgICAgICB0cmFuc2Zvcm06IFt7XG4gICAgICAgICAgICAgICAgc2NhbGU6IGludGVycG9sYXRpb25cbiAgICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgICAgbGV0IERpdiA9IHRoaXMubW9kdWxlc1swXS5kZWZhdWx0LmRpdlxuICAgICAgICByZXR1cm4gPERpdiBjbGFzc05hbWU9e1tfX1NFQ1JFVF9FTU9USU9OX18uY3NzKHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjpcInZhcigtLWJhY2tncm91bmQtcHJpbWFyeSlcIixcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgICAgICAgV2Via2l0Qm94T3JpZW50OiBcInZlcnRpY2FsXCIsXG4gICAgICAgICAgICBXZWJraXRCb3hEaXJlY3Rpb246IFwibm9ybWFsXCIsXG4gICAgICAgICAgICBtc0ZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgekluZGV4OiAxMDFcbiAgICAgICAgfSkscHJvY2Vzcy5wbGF0Zm9ybT09PVwid2luMzJcIj9fX1NFQ1JFVF9FTU9USU9OX18uY3NzKHtcbiAgICAgICAgICAgIHRvcDogXCItMjJweFwiLFxuICAgICAgICAgICAgcGFkZGluZ1RvcDogXCIyMnB4XCJcbiAgICAgICAgfSk6bnVsbCwuLi4odGhpcy5wcm9wcy5jbGFzc05hbWU/dGhpcy5wcm9wcy5jbGFzc05hbWUuc3BsaXQoXCIgXCIpOltdKV0uZmlsdGVyKGU9PmUpLmpvaW4oXCIgXCIpIHx8IG51bGx9IHN0eWxlPXtzdHlsZX0+XG4gICAgICAgICAgICB7dGhpcy5wcm9wcy5jaGlsZHJlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoKVxuICAgICAgICAgICAgfSl9XG4gICAgICAgIDwvRGl2PlxuICAgIH1cbn1cbkxheWVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBpZDogbnVsbCxcbiAgICBjaGlsZHJlbjogbnVsbFxufSIsImltcG9ydCB7cGx1Z2luQ29va2llLCB0aGVtZUNvb2tpZSwgYmRwbHVnaW5zLCBiZHRoZW1lcywgc2V0dGluZ3NDb29raWUsIHNldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBtYWluQ29yZSBmcm9tIFwiLi9jb3JlXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xuaW1wb3J0IHNldHRpbmdzUGFuZWwgZnJvbSBcIi4vc2V0dGluZ3NQYW5lbFwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xuXG5jb25zdCBCZEFwaSA9IHtcbiAgICBnZXQgUmVhY3QoKSB7IHJldHVybiBCRFYyLlJlYWN0OyB9LFxuICAgIGdldCBSZWFjdERPTSgpIHsgcmV0dXJuIEJEVjIuUmVhY3REb207IH0sXG4gICAgZ2V0IFJlYWN0Q29tcG9uZW50KCkge3JldHVybiBCRFYyLlJlYWN0Q29tcG9uZW50O30sXG4gICAgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7cmV0dXJuIFV0aWxzLldpbmRvd0NvbmZpZ0ZpbGU7fSxcbiAgICBnZXQgc2V0dGluZ3MoKSB7cmV0dXJuIHNldHRpbmdzO30sXG4gICAgZ2V0IGVtb3RlcygpIHtyZXR1cm4gbnVsbH0sIC8vIGRlcHJlY2F0ZWQsIGRlbGV0ZWQgYWxsIGVtb3RlcyBmcm9tIGJldHRlcmRpc2NvcmQuXG4gICAgZ2V0IHNjcmVlbldpZHRoKCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTsgfSxcbiAgICBnZXQgc2NyZWVuSGVpZ2h0KCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApOyB9XG59O1xuXG5CZEFwaS5nZXRBbGxXaW5kb3dQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBVdGlscy5nZXRBbGxXaW5kb3dQcmVmZXJlbmNlcygpO1xufTtcblxuQmRBcGkuZ2V0V2luZG93UHJlZmVyZW5jZSA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBVdGlscy5nZXRXaW5kb3dQcmVmZXJlbmNlKGtleSk7XG59O1xuXG5CZEFwaS5zZXRXaW5kb3dQcmVmZXJlbmNlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKGtleSwgdmFsdWUpO1xufTtcblxuLy9JbmplY3QgQ1NTIHRvIGRvY3VtZW50IGhlYWRcbi8vaWQgPSBpZCBvZiBlbGVtZW50XG4vL2NzcyA9IGN1c3RvbSBjc3NcbkJkQXBpLmluamVjdENTUyA9IGZ1bmN0aW9uIChpZCwgY3NzKSB7XG4gICAgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRChpZCksIGNzcyk7XG59O1xuXG4vL0NsZWFyIGNzcy9yZW1vdmUgYW55IGVsZW1lbnRcbi8vaWQgPSBpZCBvZiBlbGVtZW50XG5CZEFwaS5jbGVhckNTUyA9IGZ1bmN0aW9uIChpZCkge1xuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQoaWQpKTtcbn07XG5cbi8vSW5qZWN0IENTUyB0byBkb2N1bWVudCBoZWFkXG4vL2lkID0gaWQgb2YgZWxlbWVudFxuLy9jc3MgPSBjdXN0b20gY3NzXG5CZEFwaS5saW5rSlMgPSBmdW5jdGlvbiAoaWQsIHVybCkge1xuICAgIERPTS5hZGRTY3JpcHQoRE9NLmVzY2FwZUlEKGlkKSwgdXJsKTtcbn07XG5cbi8vQ2xlYXIgY3NzL3JlbW92ZSBhbnkgZWxlbWVudFxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcbkJkQXBpLnVubGlua0pTID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgRE9NLnJlbW92ZVNjcmlwdChET00uZXNjYXBlSUQoaWQpKTtcbn07XG5cbi8vR2V0IGFub3RoZXIgcGx1Z2luXG4vL25hbWUgPSBuYW1lIG9mIHBsdWdpblxuQmRBcGkuZ2V0UGx1Z2luID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoYmRwbHVnaW5zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBiZHBsdWdpbnNbbmFtZV0ucGx1Z2luO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbi8vR2V0IEJldHRlckRpc2NvcmQgQ29yZVxuQmRBcGkuZ2V0Q29yZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBVdGlscy53YXJuKFwiRGVwcmVjYXRpb24gTm90aWNlXCIsIGBCZEFwaS5nZXRDb3JlKCkgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5gKTtcbiAgICByZXR1cm4gbWFpbkNvcmU7XG59O1xuXG4vKipcbiAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgbW9kYWwuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gYSBzdHJpbmcgb2YgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBtb2RhbFxuICovXG5CZEFwaS5hbGVydCA9IGZ1bmN0aW9uICh0aXRsZSwgY29udGVudCkge1xuICAgIHJldHVybiBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIHtjYW5jZWxUZXh0OiBudWxsfSk7XG59O1xuXG4vKipcbiAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgY29uZmlybWF0aW9uIG1vZGFsIHdpdGggb3B0aW9uYWwgY29uZmlybSBhbmQgY2FuY2VsIGNhbGxiYWNrcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxuICogQHBhcmFtIHsoc3RyaW5nfFJlYWN0RWxlbWVudHxBcnJheTxzdHJpbmd8UmVhY3RFbGVtZW50Pil9IGNoaWxkcmVuIC0gYSBzaW5nbGUgb3IgbWl4ZWQgYXJyYXkgb2YgcmVhY3QgZWxlbWVudHMgYW5kIHN0cmluZ3MuIEV2ZXJ5IHN0cmluZyBpcyB3cmFwcGVkIGluIERpc2NvcmQncyBgTWFya2Rvd25gIGNvbXBvbmVudCBzbyBzdHJpbmdzIHdpbGwgc2hvdyBhbmQgcmVuZGVyIHByb3Blcmx5LlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnMgdG8gbW9kaWZ5IHRoZSBtb2RhbFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kYW5nZXI9ZmFsc2VdIC0gd2hldGhlciB0aGUgbWFpbiBidXR0b24gc2hvdWxkIGJlIHJlZCBvciBub3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb25maXJtVGV4dD1Pa2F5XSAtIHRleHQgZm9yIHRoZSBjb25maXJtYXRpb24vc3VibWl0IGJ1dHRvblxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNhbmNlbFRleHQ9Q2FuY2VsXSAtIHRleHQgZm9yIHRoZSBjYW5jZWwgYnV0dG9uXG4gKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNvbmZpcm09Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uXG4gKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNhbmNlbD1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIGNhbmNlbCBidXR0b25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5rZXldIC0ga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGFsLiBJZiBub3QgcHJvdmlkZWQsIG9uZSBpcyBnZW5lcmF0ZWQgYW5kIHJldHVybmVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBrZXkgdXNlZCBmb3IgdGhpcyBtb2RhbFxuICovXG5CZEFwaS5zaG93Q29uZmlybWF0aW9uTW9kYWwgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMpO1xufTtcblxuLy9TaG93IHRvYXN0IGFsZXJ0XG5CZEFwaS5zaG93VG9hc3QgPSBmdW5jdGlvbihjb250ZW50LCBvcHRpb25zID0ge30pIHtcbiAgICBVdGlscy5zaG93VG9hc3QoY29udGVudCwgb3B0aW9ucyk7XG59O1xuXG4vLyBGaW5kcyBtb2R1bGVcbkJkQXBpLmZpbmRNb2R1bGUgPSBmdW5jdGlvbihmaWx0ZXIpIHtcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGZpbHRlcik7XG59O1xuXG4vLyBGaW5kcyBtb2R1bGVcbkJkQXBpLmZpbmRBbGxNb2R1bGVzID0gZnVuY3Rpb24oZmlsdGVyKSB7XG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEFsbChmaWx0ZXIpO1xufTtcblxuLy8gRmluZHMgbW9kdWxlXG5CZEFwaS5maW5kTW9kdWxlQnlQcm9wcyA9IGZ1bmN0aW9uKC4uLnByb3BzKSB7XG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhwcm9wcyk7XG59O1xuXG5CZEFwaS5maW5kTW9kdWxlQnlQcm90b3R5cGVzID0gZnVuY3Rpb24oLi4ucHJvdG9zKSB7XG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5UHJvdG90eXBlcyhwcm90b3MpO1xufTtcblxuQmRBcGkuZmluZE1vZHVsZUJ5RGlzcGxheU5hbWUgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUobmFtZSk7XG59O1xuXG4vLyBHZXRzIHJlYWN0IGluc3RhbmNlXG5CZEFwaS5nZXRJbnRlcm5hbEluc3RhbmNlID0gZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiB3aW5kb3cualF1ZXJ5KSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGpRdWVyeSkgbm9kZSA9IG5vZGVbMF07XG4gICAgcmV0dXJuIEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShub2RlKTtcbn07XG5cbi8vIEdldHMgZGF0YVxuQmRBcGkubG9hZERhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXkpIHtcbiAgICByZXR1cm4gRGF0YVN0b3JlLmdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KTtcbn07XG5cbkJkQXBpLmdldERhdGEgPSBCZEFwaS5sb2FkRGF0YTtcblxuLy8gU2V0cyBkYXRhXG5CZEFwaS5zYXZlRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSwgZGF0YSkge1xuICAgIHJldHVybiBEYXRhU3RvcmUuc2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXksIGRhdGEpO1xufTtcblxuQmRBcGkuc2V0RGF0YSA9IEJkQXBpLnNhdmVEYXRhO1xuXG4vLyBEZWxldGVzIGRhdGFcbkJkQXBpLmRlbGV0ZURhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXkpIHtcbiAgICByZXR1cm4gRGF0YVN0b3JlLmRlbGV0ZVBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KTtcbn07XG5cbi8vIFBhdGNoZXMgb3RoZXIgZnVuY3Rpb25zXG5CZEFwaS5tb25rZXlQYXRjaCA9IGZ1bmN0aW9uKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gVXRpbHMubW9ua2V5UGF0Y2god2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucyk7XG59O1xuXG4vLyBFdmVudCB3aGVuIGVsZW1lbnQgaXMgcmVtb3ZlZFxuQmRBcGkub25SZW1vdmVkID0gZnVuY3Rpb24obm9kZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gVXRpbHMub25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKTtcbn07XG5cbi8vIFdyYXBzIGZ1bmN0aW9uIGluIHRyeS4uY2F0Y2hcbkJkQXBpLnN1cHByZXNzRXJyb3JzID0gZnVuY3Rpb24obWV0aG9kLCBtZXNzYWdlKSB7XG4gICAgcmV0dXJuIFV0aWxzLnN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSk7XG59O1xuXG4vLyBUZXN0cyBmb3IgdmFsaWQgSlNPTlxuQmRBcGkudGVzdEpTT04gPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgcmV0dXJuIFV0aWxzLnRlc3RKU09OKGRhdGEpO1xufTtcblxuQmRBcGkuaXNQbHVnaW5FbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiAhIXBsdWdpbkNvb2tpZVtuYW1lXTtcbn07XG5cbkJkQXBpLmlzVGhlbWVFbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiAhIXRoZW1lQ29va2llW25hbWVdO1xufTtcblxuQmRBcGkuaXNTZXR0aW5nRW5hYmxlZCA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgcmV0dXJuICEhc2V0dGluZ3NDb29raWVbaWRdO1xufTtcblxuQmRBcGkuZW5hYmxlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsIHRydWUpO1xufTtcblxuQmRBcGkuZGlzYWJsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCBmYWxzZSk7XG59O1xuXG5CZEFwaS50b2dnbGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgIXNldHRpbmdzQ29va2llW2lkXSk7XG59O1xuXG4vLyBHZXRzIGRhdGFcbkJkQXBpLmdldEJERGF0YSA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBEYXRhU3RvcmUuZ2V0QkREYXRhKGtleSk7XG59O1xuXG4vLyBTZXRzIGRhdGFcbkJkQXBpLnNldEJERGF0YSA9IGZ1bmN0aW9uKGtleSwgZGF0YSkge1xuICAgIHJldHVybiBEYXRhU3RvcmUuc2V0QkREYXRhKGtleSwgZGF0YSk7XG59O1xuXG5cblxuY29uc3QgbWFrZUFkZG9uQVBJID0gKGNvb2tpZSwgbGlzdCwgbWFuYWdlcikgPT4gbmV3IGNsYXNzIEFkZG9uQVBJIHtcblxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIG1hbmFnZXIuZm9sZGVyO31cblxuICAgIGlzRW5hYmxlZChuYW1lKSB7XG4gICAgICAgIHJldHVybiAhIWNvb2tpZVtuYW1lXTtcbiAgICB9XG5cbiAgICBlbmFibGUobmFtZSkge1xuICAgICAgICByZXR1cm4gbWFuYWdlci5lbmFibGUobmFtZSk7XG4gICAgfVxuXG4gICAgZGlzYWJsZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmRpc2FibGUobmFtZSk7XG4gICAgfVxuXG4gICAgdG9nZ2xlKG5hbWUpIHtcbiAgICAgICAgaWYgKGNvb2tpZVtuYW1lXSkgdGhpcy5kaXNhYmxlKG5hbWUpO1xuICAgICAgICBlbHNlIHRoaXMuZW5hYmxlKG5hbWUpO1xuICAgIH1cblxuICAgIHJlbG9hZChuYW1lKSB7XG4gICAgICAgIHJldHVybiBtYW5hZ2VyLnJlbG9hZChuYW1lKTtcbiAgICB9XG5cbiAgICBnZXQobmFtZSkge1xuICAgICAgICBpZiAobGlzdC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgaWYgKGxpc3RbbmFtZV0ucGx1Z2luKSByZXR1cm4gbGlzdFtuYW1lXS5wbHVnaW47XG4gICAgICAgICAgICByZXR1cm4gbGlzdFtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRBbGwoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhsaXN0KS5tYXAoayA9PiB0aGlzLmdldChrKSkuZmlsdGVyKGEgPT4gYSk7XG4gICAgfVxufTtcblxuQmRBcGkuUGx1Z2lucyA9IG1ha2VBZGRvbkFQSShwbHVnaW5Db29raWUsIGJkcGx1Z2lucywgcGx1Z2luTW9kdWxlKTtcbkJkQXBpLlRoZW1lcyA9IG1ha2VBZGRvbkFQSSh0aGVtZUNvb2tpZSwgYmR0aGVtZXMsIHRoZW1lTW9kdWxlKTtcblxuZXhwb3J0IGRlZmF1bHQgQmRBcGk7XG5cbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5CZEFwaSA9IEJkQXBpIiwiLyogQkRFdmVudHMgKi9cbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQkRFdmVudHMgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkJERXZlbnRzID0gdGhpc1xuICAgIH1cbiAgICBkaXNwYXRjaChldmVudE5hbWUsIC4uLmFyZ3MpIHt0aGlzLmVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKTt9XG4gICAgb2ZmKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pIHt0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pO31cbn07IiwiLyoqXG4gKiBDcmVkaXRzIHRvIEBoZWxsYm91bmQxMzM3IG9uIGdpdGh1YiBmb3IgdGhlIGNzc1xuICovXG5cbmltcG9ydCBET01Ub29scyBmcm9tIFwiLi9kb210b29sc1wiXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxuXG5sZXQgc2VsZWN0b3JzXG5jb25zdCByZW1vdmVEYSA9IFV0aWxzLnJlbW92ZURhXG5mdW5jdGlvbiBnZXRTZWxlY3RvcnMoKXtcbiAgICBsZXQgc3RhbmRhcmRTaWRlYmFyVmlldyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnN0YW5kYXJkU2lkZWJhclZpZXcpWzBdXG4gICAgaWYoIXN0YW5kYXJkU2lkZWJhclZpZXcpcmV0dXJuIG51bGxcbiAgICBsZXQgZGVmYXVsdENsYXNzTmFtZSA9IHJlbW92ZURhKHN0YW5kYXJkU2lkZWJhclZpZXcuc3RhbmRhcmRTaWRlYmFyVmlldylcbiAgICBsZXQgc2VsZWN0cyA9IFtdXG4gICAgbGV0IHVzZXJTZXR0aW5nc0FjY291bnQgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyU2V0dGluZ3NBY2NvdW50KVswXVxuICAgIGNvbnN0IGNoaWxkcmVuID0gQkRNb2R1bGVzLmdldChlID0+IHR5cGVvZiBlLmNoaWxkcmVuID09PSBcInN0cmluZ1wiKVswXVxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAucGF5bWVudC1pbmZvIC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlc2NyaXB0aW9uICYmIHR5cGVvZiBlLmRlc2NyaXB0aW9uID09PSBcInN0cmluZ1wiICYmIGUuZGVzY3JpcHRpb24uaW5jbHVkZXMoXCJmb3JtVGV4dFwiKSlbMF0uZGVzY3JpcHRpb24pfWApXG4gICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnBheW1lbnRTb3VyY2VSb3cpWzBdLnBheW1lbnRTb3VyY2VSb3cpfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdWJUZXh0ICYmIGUuZGVzY3JpcHRpb25XcmFwcGVyKVswXS5zdWJUZXh0KX1gKVxuICAgIGlmKHVzZXJTZXR0aW5nc0FjY291bnQpe1xuICAgICAgICBzZWxlY3RzLnB1c2goYCNhcHAtbW91bnQgLiR7ZGVmYXVsdENsYXNzTmFtZX0gLiR7cmVtb3ZlRGEodXNlclNldHRpbmdzQWNjb3VudC51c2VyU2V0dGluZ3NBY2NvdW50KX0gZGl2Om50aC1jaGlsZCgyKT5kaXY6bnRoLWNoaWxkKDIpPi4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnZpZXdCb2R5KVswXS52aWV3Qm9keSl9YClcbiAgICAgICAgc2VsZWN0cy5wdXNoKGAuJHtyZW1vdmVEYSh1c2VyU2V0dGluZ3NBY2NvdW50LnVzZXJTZXR0aW5nc1NlY3VyaXR5KX0gLiR7cmVtb3ZlRGEoY2hpbGRyZW4uY2hpbGRyZW4pfSA+IGRpdjpudGgtY2hpbGQoMilgKVxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhzZWxlY3RzKVxuICAgIHJldHVybiBzZWxlY3RzXG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCbHVyUHJpdmF0ZSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcbiAgICB9XG5cbiAgICBlbmFibGUoKXtcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXG4gICAgICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9ycyB8fCBnZXRTZWxlY3RvcnMoKVxuXG4gICAgICAgIGlmKCFzZWxlY3RvcnMpY29uc29sZS5lcnJvcihuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIHNlbGVjdG9ycyB0byBibHVyIHBlcnNvbm5hbCBpbmZvcm1hdGlvbnMuXCIpKVxuICAgICAgICBET01Ub29scy5hZGRTdHlsZShcImJsdXJQcml2YXRlXCIsIGBcbiR7c2VsZWN0b3JzLmpvaW4oXCIsIFwiKX0ge1xuICAgIHRyYW5zaXRpb246IGFsbCAxNTBtcyBjdWJpYy1iZXppZXIoLjU1LC4wODUsLjY4LC41Myk7XG4gICAgZmlsdGVyOiBibHVyKDRweCk7XG4gICAgb3BhY2l0eTogLjg7XG59XG5cbiR7c2VsZWN0b3JzLm1hcChlID0+IGUrXCI6aG92ZXJcIikuam9pbihcIiwgXCIpfSAge1xuICAgIHRyYW5zaXRpb246IGFsbCAxNTBtcyBjdWJpYy1iZXppZXIoLjU1LC4wOSwuNjgsLjUzKTtcbiAgICBmaWx0ZXI6IG5vbmU7XG4gICAgb3BhY2l0eTogMTtcbn1gKVxuICAgIH1cblxuICAgIGRpc2FibGUoKXtcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcbiAgICAgICAgRE9NVG9vbHMucmVtb3ZlU3R5bGUoXCJibHVyUHJpdmF0ZVwiKVxuICAgIH1cbn0iLCJpbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcblxuY29uc3Qgbm9ybWFsaXplZFByZWZpeCA9IFwiZGFcIjtcbmNvbnN0IHJhbmRDbGFzcyA9IG5ldyBSZWdFeHAoYF4oPyEke25vcm1hbGl6ZWRQcmVmaXh9LSkoKD86W0EtWmEtel18WzAtOV18LSkrKS0oPzpbQS1aYS16XXxbMC05XXwtfF8pezZ9JGApO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ2xhc3NOb3JtYWxpemVyIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuQ2xhc3NOb3JtYWxpemVyID0gdGhpc1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUGF0Y2hlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZXMoV2VicGFja01vZHVsZXMuZmluZEFsbCh0aGlzLm1vZHVsZUZpbHRlci5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMucmV2ZXJ0RWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKSk7XG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy5oYXNQYXRjaGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMucGF0Y2hDbGFzc01vZHVsZXMoV2VicGFja01vZHVsZXMuZmluZEFsbCh0aGlzLm1vZHVsZUZpbHRlci5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplRWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKSk7XG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGF0Y2hET01NZXRob2RzKCk7XG4gICAgfVxuXG4gICAgcGF0Y2hDbGFzc01vZHVsZXMobW9kdWxlcykge1xuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICAgICAgICB0aGlzLnBhdGNoQ2xhc3NNb2R1bGUobm9ybWFsaXplZFByZWZpeCwgbW9kdWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVucGF0Y2hDbGFzc01vZHVsZXMobW9kdWxlcykge1xuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvdWxkSWdub3JlKHZhbHVlKSB7XG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHZhbHVlLmVuZHNXaXRoKFwicHhcIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJjaFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImVtXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwibXNcIikpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcImxheWVyQ29udGFpbmVyLVwiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiI1wiKSAmJiAodmFsdWUubGVuZ3RoID09IDcgfHwgdmFsdWUubGVuZ3RoID09IDQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKFwiY2FsYyhcIikgfHwgdmFsdWUuaW5jbHVkZXMoXCJyZ2JhXCIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG1vZHVsZUZpbHRlcihtb2R1bGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShtb2R1bGUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChtb2R1bGUuX19lc01vZHVsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKG1vZHVsZSkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBtb2R1bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbW9kdWxlW2Jhc2VDbGFzc05hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3BsaXQoXCItXCIpLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFyYW5kQ2xhc3MudGVzdCh2YWx1ZS5zcGxpdChcIiBcIilbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwYXRjaENsYXNzTW9kdWxlKGNvbXBvbmVudE5hbWUsIGNsYXNzTmFtZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IG5vcm1hbENsYXNzLm1hdGNoKHJhbmRDbGFzcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaCB8fCAhbWF0Y2gubGVuZ3RoIHx8IG1hdGNoLmxlbmd0aCA8IDIpIGNvbnRpbnVlOyAvLyBTaG91bGRuJ3QgZXZlciBoYXBwZW4gc2luY2UgdGhleSBwYXNzZWQgdGhlIG1vZHVsZUZpbHRlciwgYnV0IHlvdSBuZXZlciBrbm93XG4gICAgICAgICAgICAgICAgY29uc3QgY2FtZWxDYXNlID0gbWF0Y2hbMV0uc3BsaXQoXCItXCIpLm1hcCgocywgaSkgPT4gaSA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV0gKz0gYCAke2NvbXBvbmVudE5hbWV9LSR7Y2FtZWxDYXNlfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bnBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gY2xhc3NOYW1lcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgbmV3U3RyaW5nID0gXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9ybWFsQ2xhc3Mgb2YgY2xhc3NMaXN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbENsYXNzLnN0YXJ0c1dpdGgoYCR7Y29tcG9uZW50TmFtZX0tYCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG5ld1N0cmluZyArPSBgICR7bm9ybWFsQ2xhc3N9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV0gPSBuZXdTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbm9ybWFsaXplRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gZWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgICAgIGZvciAobGV0IGMgPSAwLCBjbGVuID0gY2xhc3Nlcy5sZW5ndGg7IGMgPCBjbGVuOyBjKyspIHtcbiAgICAgICAgICAgIGlmICghcmFuZENsYXNzLnRlc3QoY2xhc3Nlc1tjXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBjbGFzc2VzW2NdLm1hdGNoKHJhbmRDbGFzcylbMV07XG4gICAgICAgICAgICBjb25zdCBuZXdDbGFzcyA9IG1hdGNoLnNwbGl0KFwiLVwiKS5tYXAoKHMsIGkpID0+IGkgPyBzWzBdLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpIDogcykuam9pbihcIlwiKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChgJHtub3JtYWxpemVkUHJlZml4fS0ke25ld0NsYXNzfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWxlbWVudC5jaGlsZHJlbikgdGhpcy5ub3JtYWxpemVFbGVtZW50KGNoaWxkKTtcbiAgICB9XG5cbiAgICByZXZlcnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XG4gICAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuICYmIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoKSB0aGlzLnJldmVydEVsZW1lbnQoZWxlbWVudC5jaGlsZHJlblswXSk7XG4gICAgICAgIGlmIChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZykgdGhpcy5yZXZlcnRFbGVtZW50KGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICAgICAgICBjb25zdCB0b1JlbW92ZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGlmIChjbGFzc2VzW2NdLnN0YXJ0c1dpdGgoYCR7bm9ybWFsaXplZFByZWZpeH0tYCkpIHRvUmVtb3ZlLnB1c2goY2xhc3Nlc1tjXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLnRvUmVtb3ZlKTtcbiAgICB9XG5cbiAgICBwYXRjaERPTU1ldGhvZHMoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5zID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5jb250YWlucztcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgICAgICAgICAvLyBjb25zdCB0b2tlbnMgPSB0b2tlbi5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShjb250YWlucywgdGhpcywgW3Rva2VuLnNwbGl0KFwiIFwiKVswXV0pO1xuICAgICAgICAgICAgLy8gcmV0dXJuIHRva2Vucy5ldmVyeSh0ID0+IGNvbnRhaW5zLmNhbGwodGhpcywgdCkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFkZCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkO1xuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKC4uLnRva2Vucykge1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgICAgICB0b2tlbnNbdF0gPSB0b2tlbnNbdF0uc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoYWRkLCB0aGlzLCB0b2tlbnMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlO1xuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKC4uLnRva2Vucykge1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgICAgICB0b2tlbnNbdF0gPSB0b2tlbnNbdF0uc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkocmVtb3ZlLCB0aGlzLCB0b2tlbnMpO1xuICAgICAgICB9O1xuICAgIH1cblxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENvbG9yZWRUZXh0IHtcbiAgICBpbmplY3RDb2xvcmVkVGV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsQ29sb3JlZFRleHQpIHJldHVybjtcbiAgICAgICAgaWYgKCFCRFYyLk1lc3NhZ2VDb21wb25lbnQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmNhbmNlbENvbG9yZWRUZXh0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2JlZm9yZTogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF07XG4gICAgICAgICAgICBpZiAoIXByb3BzIHx8ICFwcm9wcy5jaGlsZHJlbk1lc3NhZ2VDb250ZW50KSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlQ29udGVudCA9IHByb3BzLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICghbWVzc2FnZUNvbnRlbnQudHlwZSB8fCAhbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlIHx8IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZS5kaXNwbGF5TmFtZSAhPSBcIk1lc3NhZ2VDb250ZW50XCIpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVHlwZSA9IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZTtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFR5cGUuX19vcmlnaW5hbE1ldGhvZCkgcmV0dXJuOyAvLyBEb24ndCBwYXRjaCBhZ2FpblxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlID0gZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG9yaWdpbmFsVHlwZShwcm9wcyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZUNvbG9yID0gc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtN1wiXSA/IHByb3BzLm1lc3NhZ2UuY29sb3JTdHJpbmcgfHwgXCJcIiA6IFwiXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuc3R5bGUgPSB7Y29sb3I6IHJvbGVDb2xvcn07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbFR5cGU7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSwgb3JpZ2luYWxUeXBlKTtcbiAgICAgICAgfX0pO1xuICAgIH1cblxuICAgIHJlbW92ZUNvbG9yZWRUZXh0KCkge1xuICAgICAgICBsZXQgY2xhc3NOYW1lTWFya3VwID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXS5tYXJrdXBcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5cIitjbGFzc05hbWVNYXJrdXAuc3BsaXQoXCIgXCIpWzBdKS5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgICAgICAgZWxlbS5zdHlsZS5zZXRQcm9wZXJ0eShcImNvbG9yXCIsIFwiXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG59OyIsImltcG9ydCB7YmRDb25maWcsIGJkcGx1Z2lucywgYmR0aGVtZXMsIHNldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcbmltcG9ydCB7IGVuY3J5cHRTZXR0aW5nc0NhY2hlLCBkZWNyeXB0U2V0dGluZ3NDYWNoZSwgcHJvY2Vzc0ZpbGUgfSBmcm9tIFwiLi9wbHVnaW5DZXJ0aWZpZXJcIjtcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCBNb2R1bGUgPSByZXF1aXJlKFwibW9kdWxlXCIpLk1vZHVsZTtcbk1vZHVsZS5nbG9iYWxQYXRocy5wdXNoKHBhdGgucmVzb2x2ZShyZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmFwcC5nZXRBcHBQYXRoKCksIFwibm9kZV9tb2R1bGVzXCIpKTtcbmNsYXNzIE1ldGFFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIk1ldGFFcnJvclwiO1xuICAgIH1cbn1cbmNvbnN0IG9yaWdpbmFsSlNSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdO1xuY29uc3Qgb3JpZ2luYWxDU1NSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA/IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gOiAoKSA9PiB7cmV0dXJuIG51bGw7fTtcbmNvbnN0IHNwbGl0UmVnZXggPSAvW15cXFNcXHJcXG5dKj8oPzpcXHJcXG58XFxuKVteXFxTXFxyXFxuXSo/XFwqW15cXFNcXHJcXG5dPy87XG5jb25zdCBlc2NhcGVkQXRSZWdleCA9IC9eXFxcXEAvO1xuXG5leHBvcnQgbGV0IGFkZG9uQ2FjaGUgPSB7fVxuXG5sZXQgaGFzUGF0Y2hlZCA9IGZhbHNlXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ29udGVudE1hbmFnZXIge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudGltZUNhY2hlID0ge307XG4gICAgICAgIHRoaXMud2F0Y2hlcnMgPSB7fTtcbiAgICB9XG5cbiAgICBwYXRjaEV4dGVuc2lvbnMoKXtcbiAgICAgICAgaWYoaGFzUGF0Y2hlZClyZXR1cm5cbiAgICAgICAgaGFzUGF0Y2hlZCA9IHRydWVcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInBsdWdpblwiKTtcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA9IHRoaXMuZ2V0Q29udGVudFJlcXVpcmUoXCJ0aGVtZVwiKTtcbiAgICB9XG5cbiAgICBnZXQgcGx1Z2luc0ZvbGRlcigpIHtyZXR1cm4gdGhpcy5fcGx1Z2luc0ZvbGRlciB8fCAodGhpcy5fcGx1Z2luc0ZvbGRlciA9IGZzLnJlYWxwYXRoU3luYyhwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGggKyBcInBsdWdpbnMvXCIpKSk7fVxuICAgIGdldCB0aGVtZXNGb2xkZXIoKSB7cmV0dXJuIHRoaXMuX3RoZW1lc0ZvbGRlciB8fCAodGhpcy5fdGhlbWVzRm9sZGVyID0gZnMucmVhbHBhdGhTeW5jKHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCArIFwidGhlbWVzL1wiKSkpO31cblxuICAgIGxvYWRBZGRvbkNlcnRpZmllckNhY2hlKCl7XG4gICAgICAgIGlmKHR5cGVvZiBkYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIpICE9PSBcInN0cmluZ1wiKXtcbiAgICAgICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIiwgZW5jcnlwdFNldHRpbmdzQ2FjaGUoXCJ7fVwiKSlcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgYWRkb25DYWNoZSA9IEpTT04ucGFyc2UoZGVjcnlwdFNldHRpbmdzQ2FjaGUoZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiKSkpXG4gICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiLCBlbmNyeXB0U2V0dGluZ3NDYWNoZShcInt9XCIpKVxuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGUgPSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5rZXlzKGFkZG9uQ2FjaGUpXG4gICAgICAgIC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhZGRvbkNhY2hlW2tleV1cbiAgICAgICAgICAgIGlmKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cblxuICAgICAgICAgICAgbGV0IHByb3BzID0gW3tcbiAgICAgICAgICAgICAgICBrZXk6IFwidGltZXN0YW1wXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJyZXN1bHRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcImhhc2hcIixcbiAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9XVxuICAgICAgICAgICAgZm9yKGxldCBwcm9wIG9mIHByb3BzKXtcbiAgICAgICAgICAgICAgICBpZighKHByb3Aua2V5IGluIHZhbHVlKSB8fCB0eXBlb2YgdmFsdWVbcHJvcC5rZXldICE9PSBwcm9wLnR5cGUpe1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtrZXldXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHZhbHVlLmhhc2ggIT09IGtleSl7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodmFsdWUucmVzdWx0LnN1c3BlY3QpeyAvLyByZWZldGNoIGZyb20gcmVtb3RlIHRvIGJlIHN1cmUgeW91J3JlIHVwIHRvIGRhdGUuXG4gICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnNhdmVBZGRvbkNhY2hlKClcbiAgICB9XG5cbiAgICBzYXZlQWRkb25DYWNoZSgpe1xuICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKEpTT04uc3RyaW5naWZ5KGFkZG9uQ2FjaGUpKSlcbiAgICB9XG5cbiAgICB3YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gY29udGVudFR5cGUgPT09IFwicGx1Z2luXCI7XG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xuICAgICAgICB0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSA9IGZzLndhdGNoKGJhc2VGb2xkZXIsIHtwZXJzaXN0ZW50OiBmYWxzZX0sIGFzeW5jIChldmVudFR5cGUsIGZpbGVuYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWV2ZW50VHlwZSB8fCAhZmlsZW5hbWUgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSByZXR1cm47XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcbiAgICAgICAgICAgIHRyeSB7ZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7fVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIuY29kZSAhPT0gXCJFTk9FTlRcIikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSByZXR1cm4gcGx1Z2luTW9kdWxlLnVubG9hZFBsdWdpbihmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoZW1lTW9kdWxlLnVubG9hZFRoZW1lKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XG4gICAgICAgICAgICBpZiAoIXN0YXRzIHx8ICFzdGF0cy5tdGltZSB8fCAhc3RhdHMubXRpbWUuZ2V0VGltZSgpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodHlwZW9mKHN0YXRzLm10aW1lLmdldFRpbWUoKSkgIT09IFwibnVtYmVyXCIpIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV0gPT0gc3RhdHMubXRpbWUuZ2V0VGltZSgpKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV0gPSBzdGF0cy5tdGltZS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwicmVuYW1lXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIGF3YWl0IHBsdWdpbk1vZHVsZS5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICBlbHNlIGF3YWl0IHRoZW1lTW9kdWxlLmxvYWRUaGVtZShmaWxlbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwiY2hhbmdlXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIGF3YWl0IHBsdWdpbk1vZHVsZS5yZWxvYWRQbHVnaW4oZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhlbWVNb2R1bGUucmVsb2FkVGhlbWUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1bndhdGNoQ29udGVudChjb250ZW50VHlwZSkge1xuICAgICAgICBpZiAoIXRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XG4gICAgICAgIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdLmNsb3NlKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXTtcbiAgICB9XG5cbiAgICBleHRyYWN0TWV0YShjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0TGluZSA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIilbMF07XG4gICAgICAgIGNvbnN0IGhhc09sZE1ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvL01FVEFcIik7XG4gICAgICAgIGlmIChoYXNPbGRNZXRhKSByZXR1cm4gdGhpcy5wYXJzZU9sZE1ldGEoY29udGVudCk7XG4gICAgICAgIGNvbnN0IGhhc05ld01ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvKipcIik7XG4gICAgICAgIGlmIChoYXNOZXdNZXRhKSByZXR1cm4gdGhpcy5wYXJzZU5ld01ldGEoY29udGVudCk7XG4gICAgICAgIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIHdhcyBub3QgZm91bmQuXCIpO1xuICAgIH1cblxuICAgIHBhcnNlT2xkTWV0YShjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xuICAgICAgICBjb25zdCByYXdNZXRhID0gbWV0YS5zdWJzdHJpbmcobWV0YS5sYXN0SW5kZXhPZihcIi8vTUVUQVwiKSArIDYsIG1ldGEubGFzdEluZGV4T2YoXCIqLy9cIikpO1xuICAgICAgICBpZiAobWV0YS5pbmRleE9mKFwiTUVUQVwiKSA8IDApIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIHdhcyBub3QgZm91bmQuXCIpO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBVdGlscy50ZXN0SlNPTihyYXdNZXRhKTtcbiAgICAgICAgaWYgKCFwYXJzZWQpIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIGNvdWxkIG5vdCBiZSBwYXJzZWQuXCIpO1xuICAgICAgICBpZiAoIXBhcnNlZC5uYW1lKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSBtaXNzaW5nIG5hbWUgZGF0YS5cIik7XG4gICAgICAgIHBhcnNlZC5mb3JtYXQgPSBcImpzb25cIjtcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG5cbiAgICBwYXJzZU5ld01ldGEoY29udGVudCkge1xuICAgICAgICBjb25zdCBibG9jayA9IGNvbnRlbnQuc3BsaXQoXCIvKipcIiwgMilbMV0uc3BsaXQoXCIqL1wiLCAxKVswXTtcbiAgICAgICAgY29uc3Qgb3V0ID0ge307XG4gICAgICAgIGxldCBmaWVsZCA9IFwiXCI7XG4gICAgICAgIGxldCBhY2N1bSA9IFwiXCI7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBibG9jay5zcGxpdChzcGxpdFJlZ2V4KSkge1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gXCJAXCIgJiYgbGluZS5jaGFyQXQoMSkgIT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtO1xuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBsaW5lLmluZGV4T2YoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZpZWxkID0gbGluZS5zdWJzdHIoMSwgbCAtIDEpO1xuICAgICAgICAgICAgICAgIGFjY3VtID0gbGluZS5zdWJzdHIobCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYWNjdW0gKz0gXCIgXCIgKyBsaW5lLnJlcGxhY2UoXCJcXFxcblwiLCBcIlxcblwiKS5yZXBsYWNlKGVzY2FwZWRBdFJlZ2V4LCBcIkBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtLnRyaW0oKTtcbiAgICAgICAgZGVsZXRlIG91dFtcIlwiXTtcbiAgICAgICAgb3V0LmZvcm1hdCA9IFwianNkb2NcIjtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBnZXRDb250ZW50UmVxdWlyZSh0eXBlKSB7XG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVxdWlyZSA9IGlzUGx1Z2luID8gb3JpZ2luYWxKU1JlcXVpcmUgOiBvcmlnaW5hbENTU1JlcXVpcmU7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihtb2R1bGUsIGZpbGVuYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyBzZWxmLnBsdWdpbnNGb2xkZXIgOiBzZWxmLnRoZW1lc0ZvbGRlcjtcbiAgICAgICAgICAgIGNvbnN0IHBvc3NpYmxlUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSk7XG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocG9zc2libGVQYXRoKSB8fCBmaWxlbmFtZSAhPT0gZnMucmVhbHBhdGhTeW5jKHBvc3NpYmxlUGF0aCkpIHJldHVybiBSZWZsZWN0LmFwcGx5KG9yaWdpbmFsUmVxdWlyZSwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVuYW1lLCBcInV0ZjhcIik7XG4gICAgICAgICAgICBjb250ZW50ID0gVXRpbHMuc3RyaXBCT00oY29udGVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMoZmlsZW5hbWUpO1xuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHNlbGYuZXh0cmFjdE1ldGEoY29udGVudCk7XG4gICAgICAgICAgICBtZXRhLmZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSk7XG4gICAgICAgICAgICBtZXRhLmFkZGVkID0gc3RhdHMuYXRpbWVNcztcbiAgICAgICAgICAgIG1ldGEubW9kaWZpZWQgPSBzdGF0cy5tdGltZU1zO1xuICAgICAgICAgICAgbWV0YS5zaXplID0gc3RhdHMuc2l6ZTtcbiAgICAgICAgICAgIGlmICghaXNQbHVnaW4pIHtcbiAgICAgICAgICAgICAgICBtZXRhLmNzcyA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGEuZm9ybWF0ID09IFwianNvblwiKSBtZXRhLmNzcyA9IG1ldGEuY3NzLnNwbGl0KFwiXFxuXCIpLnNsaWNlKDEpLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGBtb2R1bGUuZXhwb3J0cyA9ICR7SlNPTi5zdHJpbmdpZnkobWV0YSl9O2A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNQbHVnaW4pIHtcbiAgICAgICAgICAgICAgICBtb2R1bGUuX2NvbXBpbGUoY29udGVudCwgbW9kdWxlLmZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRFeHBvcnQgPSAhVXRpbHMuaXNFbXB0eShtb2R1bGUuZXhwb3J0cyk7XG4gICAgICAgICAgICAgICAgaWYgKGRpZEV4cG9ydCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRhLnR5cGUgPSBtb2R1bGUuZXhwb3J0cztcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBtZXRhO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLndhcm4oXCJNb2R1bGUgTm90IEV4cG9ydGVkXCIsIGAke21ldGEubmFtZX0sIHBsZWFzZSBzdGFydCBzZXR0aW5nIG1vZHVsZS5leHBvcnRzYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYFxcbm1vZHVsZS5leHBvcnRzID0gJHtKU09OLnN0cmluZ2lmeShtZXRhKX07XFxubW9kdWxlLmV4cG9ydHMudHlwZSA9ICR7bWV0YS5leHBvcnRzIHx8IG1ldGEubmFtZX07YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtb2R1bGUuX2NvbXBpbGUoY29udGVudCwgZmlsZW5hbWUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIG1ha2VQbGFjZWhvbGRlclBsdWdpbihkYXRhKSB7XG4gICAgICAgIHJldHVybiB7cGx1Z2luOiB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6ICgpID0+IHt9LFxuICAgICAgICAgICAgICAgIGdldE5hbWU6ICgpID0+IHtyZXR1cm4gZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWU7fSxcbiAgICAgICAgICAgICAgICBnZXRBdXRob3I6ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9LFxuICAgICAgICAgICAgICAgIGdldERlc2NyaXB0aW9uOiAoKSA9PiB7cmV0dXJuIGRhdGEubWVzc2FnZSA/IGRhdGEubWVzc2FnZSA6IFwiVGhpcyBwbHVnaW4gd2FzIHVuYWJsZSB0byBiZSBsb2FkZWQuIENoZWNrIHRoZSBhdXRob3IncyBwYWdlIGZvciB1cGRhdGVzLlwiO30sXG4gICAgICAgICAgICAgICAgZ2V0VmVyc2lvbjogKCkgPT4ge3JldHVybiBcIj8/P1wiO31cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lOiBkYXRhLm5hbWUgfHwgZGF0YS5maWxlbmFtZSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiBkYXRhLmZpbGVuYW1lLFxuICAgICAgICAgICAgc291cmNlOiBkYXRhLnNvdXJjZSA/IGRhdGEuc291cmNlIDogXCJcIixcbiAgICAgICAgICAgIHdlYnNpdGU6IGRhdGEud2Vic2l0ZSA/IGRhdGEud2Vic2l0ZSA6IFwiXCJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xuICAgICAgICBpZiAodHlwZW9mKGZpbGVuYW1lKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YodHlwZSkgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcblxuICAgICAgICBpZihzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSl7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSwgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgICAgICAgICAgIH0sIChoYXNoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiBoYXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmlsZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LCB0cnVlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGlmKHJlc3VsdCl7XG4gICAgICAgICAgICAgICAgYWRkb25DYWNoZVtyZXN1bHQuaGFzaF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgaGFzaDogcmVzdWx0Lmhhc2gsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUFkZG9uQ2FjaGUoKVxuICAgICAgICAgICAgICAgIGlmKHJlc3VsdC5zdXNwZWN0KXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIlRoaXMgcGx1Z2luIG1pZ2h0IGJlIGRhbmdlcm91cyAoXCIrcmVzdWx0Lmhhcm0rXCIpLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIlRoaXMgcGx1Z2luIG1pZ2h0IGJlIGRhbmdlcm91cyAoXCIrcmVzdWx0Lmhhcm0rXCIpLlwiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHt3aW5kb3cucmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTt9XG4gICAgICAgIGNhdGNoIChlcnJvcikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSBjb21waWxlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnJvci5tZXNzYWdlLCBzdGFjazogZXJyb3Iuc3RhY2t9fTt9XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB3aW5kb3cucmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTtcbiAgICAgICAgaWYoIWNvbnRlbnQubmFtZSlyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDYW5ub3QgZXNjYXBlIHRoZSBJRC5cIiwgZXJyb3I6IG5ldyBFcnJvcihcIkNhbm5vdCByZWFkIHByb3BlcnR5ICdyZXBsYWNlJyBvZiB1bmRlZmluZWRcIil9XG4gICAgICAgIGNvbnRlbnQuaWQgPSBVdGlscy5lc2NhcGVJRChjb250ZW50Lm5hbWUpO1xuICAgICAgICAvL2lmKCFpZClyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJJbnZhbGlkIElEXCIsIGVycm9yOiBuZXcgRXJyb3IoXCJQbGVhc2UgZml4IHRoZSBuYW1lIG9mIFwiK2ZpbGVuYW1lK1wiLiBCZXR0ZXJEaXNjb3JkIGNhbid0IGVzY2FwZSBhbiBJRC5cIil9XG4gICAgICAgIGlmIChpc1BsdWdpbikge1xuICAgICAgICAgICAgaWYgKCFjb250ZW50LnR5cGUpIHJldHVybjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udGVudC5wbHVnaW4gPSBuZXcgY29udGVudC50eXBlKCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGJkcGx1Z2luc1tjb250ZW50LnBsdWdpbi5nZXROYW1lKCldO1xuICAgICAgICAgICAgICAgIGJkcGx1Z2luc1tjb250ZW50LnBsdWdpbi5nZXROYW1lKCldID0gY29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSBjb25zdHJ1Y3RlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnJvci5tZXNzYWdlLCBzdGFjazogZXJyb3Iuc3RhY2t9fTt9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgYmR0aGVtZXNbY29udGVudC5uYW1lXTtcbiAgICAgICAgICAgIGJkdGhlbWVzW2NvbnRlbnQubmFtZV0gPSBjb250ZW50O1xuICAgICAgICB9XG4gICAgfSAgIFxuXG4gICAgdW5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xuICAgICAgICBpZiAodHlwZW9mKGZpbGVuYW1lKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YodHlwZSkgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cucmVxdWlyZS5jYWNoZVt3aW5kb3cucmVxdWlyZS5yZXNvbHZlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIHVubG9hZGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX07fVxuICAgIH1cblxuICAgIGlzTG9hZGVkKGZpbGVuYW1lLCB0eXBlKSB7XG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XG4gICAgICAgIHRyeSB7d2luZG93LnJlcXVpcmUuY2FjaGVbd2luZG93LnJlcXVpcmUucmVzb2x2ZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKV07fVxuICAgICAgICBjYXRjaCAoZXJyKSB7cmV0dXJuIGZhbHNlO31cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xuICAgICAgICBjb25zdCBjYW50VW5sb2FkID0gdGhpcy51bmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcbiAgICAgICAgaWYgKGNhbnRVbmxvYWQpIHJldHVybiBjYW50VW5sb2FkO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XG4gICAgfVxuXG4gICAgbG9hZE5ld0NvbnRlbnQodHlwZSkge1xuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XG4gICAgICAgIGNvbnN0IGJhc2VkaXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xuICAgICAgICBjb25zdCBjb250ZW50TGlzdCA9IE9iamVjdC52YWx1ZXMoaXNQbHVnaW4gPyBiZHBsdWdpbnMgOiBiZHRoZW1lcyk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjb250ZW50TGlzdC5maWx0ZXIodCA9PiAhZmlsZXMuaW5jbHVkZXModC5maWxlbmFtZSkpLm1hcChjID0+IGlzUGx1Z2luID8gYy5wbHVnaW4uZ2V0TmFtZSgpIDogYy5uYW1lKTtcbiAgICAgICAgY29uc3QgYWRkZWQgPSBmaWxlcy5maWx0ZXIoZiA9PiAhY29udGVudExpc3QuZmluZCh0ID0+IHQuZmlsZW5hbWUgPT0gZikgJiYgZi5lbmRzV2l0aChmaWxlRW5kaW5nKSAmJiBmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZWRpciwgZikpLmlzRmlsZSgpKTtcbiAgICAgICAgcmV0dXJuIHthZGRlZCwgcmVtb3ZlZH07XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZEFsbENvbnRlbnQodHlwZSkge1xuICAgICAgICB0aGlzLnBhdGNoRXh0ZW5zaW9ucygpXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgbG9hZFBsdWdpbnMoKSB7cmV0dXJuIHRoaXMubG9hZEFsbENvbnRlbnQoXCJwbHVnaW5cIik7fVxuICAgIGxvYWRUaGVtZXMoKSB7cmV0dXJuIHRoaXMubG9hZEFsbENvbnRlbnQoXCJ0aGVtZVwiKTt9XG59O1xuXG4vKipcbiAqIERvbid0IGV4cG9zZSBjb250ZW50TWFuYWdlciAtIGNvdWxkIGJlIGRhbmdlcm91cyBmb3Igbm93XG4gKi8iLCJpbXBvcnQge2JkQ29uZmlnLCBtaW5TdXBwb3J0ZWRWZXJzaW9uLCBiYmRWZXJzaW9uLCBzZXR0aW5nc0Nvb2tpZSwgYmRwbHVnaW5FcnJvcnMsIGJkdGhlbWVFcnJvcnMsIGJiZENoYW5nZWxvZywgZGVmYXVsdENvb2tpZSwgY3VycmVudERpc2NvcmRWZXJzaW9uLCBkZWZhdWx0UlBDLCBzZXR0aW5nc1JQQywgbGlnaHRjb3JkU2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsXCI7XG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuL3BsdWdpbk1vZHVsZVwiO1xuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XG5cbmltcG9ydCBCRExvZ28gZnJvbSBcIi4uL3VpL2JkTG9nb1wiO1xuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xuaW1wb3J0IExpZ2h0Y29yZExvZ28gZnJvbSBcIi4uL3N2Zy9MaWdodGNvcmRcIjtcbmltcG9ydCBQbHVnaW5DZXJ0aWZpZXIgZnJvbSBcIi4vcGx1Z2luQ2VydGlmaWVyXCI7XG5pbXBvcnQgZGlzdGFudCwgeyB1dWlkdjQgfSBmcm9tIFwiLi9kaXN0YW50XCI7XG5pbXBvcnQgRW1vamlNb2R1bGUgZnJvbSBcIi4vZW1vamlNb2R1bGVcIlxuaW1wb3J0IHtyZW1vdGUgYXMgZWxlY3Ryb259IGZyb20gXCJlbGVjdHJvblwiXG5pbXBvcnQgdjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xuXG5sZXQgbWV0aG9kc1xuZnVuY3Rpb24gQ29yZSgpIHt9XG5cblxuQ29yZS5wcm90b3R5cGUuc2V0Q29uZmlnID0gZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgaWYgKHRoaXMuaGFzU3RhcnRlZCkgcmV0dXJuO1xuICAgIE9iamVjdC5hc3NpZ24oYmRDb25maWcsIGNvbmZpZyk7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ29yZS5wcm90b3R5cGUsIFwibWV0aG9kc1wiLCB7XG4gICAgZ2V0KCl7XG4gICAgICAgIHJldHVybiBtZXRob2RzXG4gICAgfVxufSlcblxuQ29yZS5wcm90b3R5cGUuc2V0TWV0aG9kcyA9IGZ1bmN0aW9uKG0pIHtcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XG4gICAgbWV0aG9kcyA9IG1cbn07XG5cbkNvcmUucHJvdG90eXBlLmluaXQgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XG4gICAgdGhpcy5oYXNTdGFydGVkID0gdHJ1ZTtcblxuICAgIGlmICghQXJyYXkucHJvdG90eXBlLmZsYXQpIHtcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmV0dGVyRGlzY29yZCB2XCIgKyBiYmRWZXJzaW9uICsgXCIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9sZCB2ZXJzaW9uIChcIiArIGN1cnJlbnREaXNjb3JkVmVyc2lvbiArIFwiKSBvZiBEaXNjb3JkLiBQbGVhc2UgdXBkYXRlIHlvdXIgRGlzY29yZCBpbnN0YWxsYXRpb24gYmVmb3JlIHByb2NlZWRpbmcuXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGJkQ29uZmlnLnZlcnNpb24gPCBtaW5TdXBwb3J0ZWRWZXJzaW9uKSB7XG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmRDb25maWcudmVyc2lvbiArIFwiICh5b3VyIHZlcnNpb24pXCIgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsYXRlc3QganMgKFwiICsgYmJkVmVyc2lvbiArIFwiKS48YnI+PGJyPiBQbGVhc2UgZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb20gPGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9yZWxlYXNlcy9sYXRlc3QnIHRhcmdldD0nX2JsYW5rJz5HaXRIdWI8L2E+XCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5FRCkge1xuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBFbmhhbmNlZERpc2NvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5XZWJTb2NrZXQgJiYgd2luZG93LldlYlNvY2tldC5uYW1lICYmIHdpbmRvdy5XZWJTb2NrZXQubmFtZS5pbmNsdWRlcyhcIlBhdGNoZWRcIikpIHtcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmFuZGFnZWRCRCBkb2VzIG5vdCB3b3JrIHdpdGggUG93ZXJjb3JkLiBQbGVhc2UgdW5pbnN0YWxsIG9uZSBvZiB0aGVtLlwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRyaWJ1dGVzLmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xuXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBTZXR0aW5nc1wiKTtcbiAgICB0aGlzLmluaXRTZXR0aW5ncygpO1xuXG4gICAgYXdhaXQgdGhpcy5jaGVja0Zvckd1aWxkcygpO1xuICAgIEJEVjIuaW5pdGlhbGl6ZSgpO1xuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJVcGRhdGluZyBTZXR0aW5nc1wiKTtcbiAgICBzZXR0aW5nc1BhbmVsLmluaXRpYWxpemVTZXR0aW5ncygpO1xuXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgQWRkb25zIENhY2hlXCIpXG4gICAgYXdhaXQgY29udGVudE1hbmFnZXIubG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUoKVxuXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgUGx1Z2luc1wiKTtcbiAgICBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbnMoKTtcblxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIFRoZW1lc1wiKTtcbiAgICBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWVzKCk7XG5cbiAgICBET00uYWRkU3R5bGUoXCJjdXN0b21jc3NcIiwgQnVmZmVyLmZyb20oRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpLCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIikpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1kYy0wXCJdKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJ0bi5idG4tZGlzY29ubmVjdFwiKS5jbGljaygpO1xuICAgIH0pO1xuXG4gICAgUGx1Z2luQ2VydGlmaWVyLnN0YXJ0KClcblxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJSZW1vdmluZyBMb2FkaW5nIEljb25cIik7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKS5sZW5ndGgpIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKVswXS5yZW1vdmUoKTtcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiSW5pdGlhbGl6aW5nIE1haW4gT2JzZXJ2ZXJcIik7XG4gICAgdGhpcy5pbml0T2JzZXJ2ZXIoKTtcblxuICAgIC8vIFNob3cgbG9hZGluZyBlcnJvcnNcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIHtcbiAgICAgICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkNvbGxlY3RpbmcgU3RhcnR1cCBFcnJvcnNcIik7XG4gICAgICAgIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBiZHBsdWdpbkVycm9ycywgdGhlbWVzOiBiZHRoZW1lRXJyb3JzfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNWZXJzaW9uID0gRGF0YVN0b3JlLmdldEJERGF0YShcInZlcnNpb25cIik7XG4gICAgaWYgKGJiZFZlcnNpb24gPiBwcmV2aW91c1ZlcnNpb24pIHtcbiAgICAgICAgaWYgKGJiZENoYW5nZWxvZykgdGhpcy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTtcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcInZlcnNpb25cIiwgYmJkVmVyc2lvbik7XG4gICAgfVxuXG4gICAgRW1vamlNb2R1bGUuc3RhcnQoKVxuXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaFNvY2lhbC5iaW5kKHRoaXMpLCBcIkJEIFNvY2lhbCBQYXRjaFwiKSgpO1xuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hHdWlsZFBpbGxzLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgUGlsbHMgUGF0Y2hcIikoKTtcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRMaXN0SXRlbXMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBMaXN0IEl0ZW1zIFBhdGNoXCIpKCk7XG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkU2VwYXJhdG9yLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgU2VwYXJhdG9yIFBhdGNoXCIpKCk7XG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lc3NhZ2VIZWFkZXIuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBDaGF0IFBhdGNoXCIpKCk7XG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lbWJlckxpc3QuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBNZW1iZXIgTGlzdCBQYXRjaFwiKSgpO1xuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRhY2htZW50LmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xuXG4gICAgaWYoYmRDb25maWcuaGF2ZUluc3RhbGxlZERlZmF1bHQpe1xuICAgICAgICBsZXQgYWxlcnQgPSBVdGlscy5hbGVydChcIkZpcnN0IEluc3RhbGxhdGlvblwiLCBcIkFzIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBpbnN0YWxsIExpZ2h0Y29yZCwgV2UgYWRkZWQgdHdvIGRlZmF1bHQgdGhlbWVzIGFuZCBvbmUgZGVmYXVsdCBwbHVnaW4gaW4geW91ciBwbHVnaW4vdGhlbWUgZm9sZGVyLiBDaGVjayBpdCBpbiB0aGUgUGx1Z2luL1RoZW1lIHNldHRpbmdzLlwiKVxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgYWxlcnQub25DbG9zZShyZXNvbHZlKVxuICAgICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBsb2dvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnQgPiBkaXYudHlwZVdpbmRvd3MtMXphLW43LndpdGhGcmFtZS1oYVlsdEkudGl0bGVCYXItQUM0cEdWLmhvcml6b250YWxSZXZlcnNlLTN0UmpZNy5mbGV4LTFPMUdLWS5kaXJlY3Rpb25Sb3dSZXZlcnNlLW04SWpJcS5qdXN0aWZ5U3RhcnQtMk5ERnppLmFsaWduU3RyZXRjaC1EcEdQZjMuZGEtdHlwZVdpbmRvd3MuZGEtd2l0aEZyYW1lLmRhLXRpdGxlQmFyLmRhLWhvcml6b250YWxSZXZlcnNlLmRhLWZsZXguZGEtZGlyZWN0aW9uUm93UmV2ZXJzZS5kYS1qdXN0aWZ5U3RhcnQuZGEtYWxpZ25TdHJldGNoID4gZGl2LndvcmRtYXJrV2luZG93cy0xdjBsWUQud29yZG1hcmstMmlERGZtLmRhLXdvcmRtYXJrV2luZG93cy5kYS13b3JkbWFya1wiKVxuICAgIGlmKGxvZ28pe1xuICAgICAgICBsb2dvLnN0eWxlLnRvcCA9IFwiM3B4XCJcbiAgICAgICAgbG9nby5pbm5lckhUTUwgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMTBcIiB3aWR0aD1cIjcwXCIgdmlld0JveD1cIjAgMCA3Mi41NCAxMFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC01cHgsIG1hcmdpbi10b3A6IDEwcHhcIj5cbiAgICA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk00NC44MSw5LjY3VjYuMzNjMC0xLjIxLDIuMTMtMS40OSwyLjc4LS4yOGwyLS44MUEzLjUzLDMuNTMsMCwwLDAsNDYuMiwzYy0xLjkyLDAtMy44MSwxLjEzLTMuODEsMy4zM1Y5LjY3YzAsMi4yMSwxLjg5LDMuMzMsMy43NywzLjMzYTMuODcsMy44NywwLDAsMCwzLjQ1LTIuMThsLTIuMTItMUM0NywxMS4xNyw0NC44MSwxMC44NSw0NC44MSw5LjY3Wk0xMC42OCwxMi44OWgyLjQxVjMuMTdIMTAuNjhaTTcxLjc2LDMuMTRINjguMTlWNy4yM0w3MC41Nyw5LjR2LTRoMS4yN2MuODEsMCwxLjIxLjQxLDEuMjEsMXYzYzAsLjYzLS4zOCwxLjA1LTEuMjEsMS4wNUg2OC4xOHYyLjMxaDMuNTdjMS45MiwwLDMuNzItMSwzLjcyLTMuMlY2LjM5Qzc1LjQ4LDQuMTMsNzMuNjgsMy4xNCw3MS43NiwzLjE0Wk01NC4yMiwzYy0yLDAtNCwxLjEtNCwzLjM0VjkuNjZjMCwyLjIzLDIsMy4zNCw0LDMuMzRzMy45NS0xLjExLDMuOTUtMy4zNFY2LjM0QzU4LjE5LDQuMTEsNTYuMiwzLDU0LjIyLDNabTEuNTUsNi42NmMwLC43LS43OCwxLjA2LTEuNTQsMS4wNnMtMS41NS0uMzUtMS41NS0xLjA2VjYuMzRjMC0uNzIuNzUtMS4xLDEuNS0xLjFzMS41OS4zNSwxLjU5LDEuMVpNNjYuODQsNi4zNGMwLTIuMjktMS41OC0zLjItMy41NS0zLjJINTkuNDZ2OS43M2gyLjQ1VjkuNzdoLjQzbDIuMjIsMy4wOWgzTDY1LDkuNTJDNjYuMTMsOS4xNSw2Ni44NCw4LjE0LDY2Ljg0LDYuMzRaTTYzLjMzLDcuNjVINjEuOTFWNS40M2gxLjQyQTEuMTEsMS4xMSwwLDEsMSw2My4zMyw3LjY1Wk0yOS44MywxM2gyLjQyVjMuMDZIMjkuODNWNi43M2wtMywwVjMuMDlIMjQuN3Y5Ljc4aDIuMTRWOC42OGwzLDBaTTE3LjE2LDkuNzZWNi40MmMwLTEuMjEsMi4xMy0xLjQ5LDIuNzgtLjI4bDItLjgxYTMuNTUsMy41NSwwLDAsMC0zLjM2LTIuMjRjLTEuOTIsMC0zLjgxLDEuMTMtMy44MSwzLjMzVjkuNzZjMCwyLjIxLDIsMy4xNSwzLjksMy4xNXMzLjU4LTEsMy41OC0zVjcuNThIMTguNzlsMCwxLjM2SDIwLjN2Ljc3QzIwLjMsMTAuOTIsMTcuMTYsMTAuOTQsMTcuMTYsOS43NlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTIuOTMgLTMpXCIvPlxuICAgIDxwb2x5Z29uIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBwb2ludHM9XCIzNS45MSAwLjA2IDM4LjQzIDAuMDYgMzguNDMgMS44NCAzNS45MiAxLjgxIDM1Ljk3IDEwIDMzLjU1IDEwIDMzLjQ5IDEuNzUgMzAuOTggMS43NCAzMC45OCAwLjA2IDMzLjQ5IDAuMDYgMzUuOTEgMC4wNlwiLz5cbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMCA5Ljk3IDYuNSAxMCA2LjUgNy42MyAyLjQxIDcuNjMgMi40MSAwLjI2IDAgMi4yNiAwIDkuOTdcIi8+XG48L3N2Zz5gXG4gICAgfVxufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hBdHRyaWJ1dGVzID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgbGV0IGF0dHJpYnNQYXRjaHMgPSBbXVxuICAgIHRoaXMuY2FuY2VsUGF0Y2hBdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGF0dHJpYnNQYXRjaHMuZm9yRWFjaChlID0+IGUoKSlcbiAgICB9XG5cbiAgICB3aGlsZSghdjIuTWVzc2FnZUNvbXBvbmVudClhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSlcbiAgICBcbiAgICAvLyBUT0RPOiB0cnkgdG8gcGF0Y2ggY29ycmVjdGx5IHRoZSB1c2VyIHBvcG91dCBvbiBhIG5leHQgdXBkYXRlXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XG4gICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkRpc2NvcmRUYWdcIilcbiAgICAudGhlbihEaXNjb3JkVGFnID0+IHtcbiAgICAgICAgbGV0IERpc2NvcmRUYWdDb21wID0gRGlzY29yZFRhZy5kZWZhdWx0XG4gICAgICAgIERpc2NvcmRUYWcuZGVmYXVsdCA9IGZ1bmN0aW9uKHByb3BzKXtcbiAgICAgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IERpc2NvcmRUYWdDb21wKHByb3BzKVxuXG4gICAgICAgICAgICBsZXQgaWQgPSB1dWlkdjQoKVxuXG4gICAgICAgICAgICBsZXQgYmFkZ2VEaXYgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lXCIsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogXCI1cHhcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgICAgIGlkOiBcImJhZGdlcy1cIitpZCxcbiAgICAgICAgICAgICAgICBrZXk6IFwiYmFkZ2VzLVwiK2lkLFxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5oZXJpdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpXG5cbiAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IFtyZXR1cm5WYWx1ZV1cblxuICAgICAgICAgICAgaWYgKHByb3BzLnVzZXIuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHsgLy8gUmF1ZW56aTogQmFuZGFnZWRCRCBEZXZlbG9wZXJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnVzZXIuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgcHJvcHMudXNlci5pZCA9PT0gXCI2OTYwMDM0NTY2MTEzODUzOTZcIil7IC8vIE5vdCBUaG9taXo6IExpZ2h0Y29yZCBEZXZlbG9wZXIsIFBob3JjeXM6IExpZ2h0Y29yZCBEZXZlbG9wZXJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYmFkZ2VEaXYpXG4gICAgICAgICAgICBsZXQgZGl2ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBjaGlsZHJlbilcbiAgICAgICAgICAgIGFwcGx5QmFkZ2VzKGlkLCBwcm9wcy51c2VyLCBmYWxzZSlcblxuICAgICAgICAgICAgcmV0dXJuIGRpdlxuICAgICAgICB9XG4gICAgICAgIERpc2NvcmRUYWcuZGVmYXVsdC5kaXNwbGF5TmFtZSA9IERpc2NvcmRUYWdDb21wLmRpc3BsYXlOYW1lXG4gICAgfSlcblxuICAgIGF0dHJpYnNQYXRjaHMucHVzaChVdGlscy5tb25rZXlQYXRjaCh2Mi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xuICAgICAgICBpZihkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UpeyAvLyB0aGlzIGNhbiBiZSBhIGJsb2NrZWQgbWVzc2FnZSAobm90IG9wZW5lZClcbiAgICAgICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHNbXCJkYXRhLW1lc3NhZ2UtaWRcIl0gPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UuaWRcbiAgICAgICAgfVxuICAgIH19KSlcbiAgICAgICAgLypcbiAgICBhdHRyaWJzUGF0Y2hzLnB1c2goVXRpbHMubW9ua2V5UGF0Y2godjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wc1tcIm1lc3NhZ2UtaWRcIl0gPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UuaWRcbiAgICB9fSkpKi9cbn1cblxuQ29yZS5wcm90b3R5cGUuY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbigpIHtcbiAgICBsZXQgdGltZXNDaGVja2VkID0gMDtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGNvbnN0IGNoZWNrRm9yR3VpbGRzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gQkRWMi5ndWlsZENsYXNzZXMud3JhcHBlci5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn1gKS5sZW5ndGggPiAwKSB0aW1lc0NoZWNrZWQrKztcbiAgICAgICAgICAgIGNvbnN0IGd1aWxkID0gQkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW0uc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IEJEVjIuZ3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9IC4ke2d1aWxkfSAuJHtibG9ifWApLmxlbmd0aCA+IDApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmICh0aW1lc0NoZWNrZWQgPj0gNTApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPSBcImxvYWRpbmdcIikgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgKCkgPT4ge3NldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7fSk7XG4gICAgfSk7XG59O1xuXG5Db3JlLnByb3RvdHlwZS5pbmplY3RFeHRlcm5hbHMgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAvLyBObyBleHRlcm5hbHNcbn07XG5cbkNvcmUucHJvdG90eXBlLmluaXRTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICBEYXRhU3RvcmUuaW5pdGlhbGl6ZSgpO1xuICAgIGlmKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwibGlnaHRjb3JkLXNldHRpbmdzXCIpKXtcbiAgICAgICAgZm9yKGxldCBrZXkgaW4gbGlnaHRjb3JkU2V0dGluZ3Mpe1xuICAgICAgICAgICAgZGVsZXRlIGxpZ2h0Y29yZFNldHRpbmdzW2tleV1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZighRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSl7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIGRlZmF1bHRSUEMpO1xuICAgIH1cbiAgICBpZighRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpKXtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NDb29raWUsIGRlZmF1bHRDb29raWUpO1xuICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNldHRpbmdzUGFuZWwubG9hZFNldHRpbmdzKCk7XG4gICAgICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBkZWZhdWx0Q29va2llKSB7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbc2V0dGluZ10gPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbc2V0dGluZ10gPSBkZWZhdWx0Q29va2llW3NldHRpbmddO1xuICAgICAgICAgICAgICAgIHNldHRpbmdzUGFuZWwuc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnByb3RvdHlwZSAmJiBlLmRlZmF1bHQucHJvdG90eXBlLmdldFByZWRpY2F0ZVNlY3Rpb25zKVxuICAgIC50aGVuKHNldHRpbmdNb2R1bGUgPT4ge1xuXG4gICAgICAgIGxldCBnZXRQcmVkaWNhdGVTZWN0aW9ucyA9IHNldHRpbmdNb2R1bGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnNcbiAgICAgICAgc2V0dGluZ01vZHVsZS5kZWZhdWx0LnByb3RvdHlwZS5nZXRQcmVkaWNhdGVTZWN0aW9ucyA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZ2V0UHJlZGljYXRlU2VjdGlvbnMuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXG5cbiAgICAgICAgICAgIGlmKCFyZXN1bHRbMV0pcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgaWYocmVzdWx0WzFdLnNlY3Rpb24gPT09IFwiTXkgQWNjb3VudFwiKXsgLy8gdXNlciBzZXR0aW5ncywgbm90IGd1aWxkIHNldHRpbmdzXG4gICAgICAgICAgICAgICAgbGV0IHBvcGVkID0gW11cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcblxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnNldHRpbmdzUGFuZWwucmVuZGVyU2lkZWJhcih0aGlzKSlcblxuICAgICAgICAgICAgICAgIHdoaWxlKHBvcGVkWzBdKXtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocG9wZWQucG9wKCkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgfSlcbn07XG5cblxubGV0IGNsYXNzTmFtZUxheWVyXG5sZXQgY2xhc3NOYW1lU29jaWFsTGlua3NcbmxldCBjbGFzc05hbWVNb2RhbFxuXG5Db3JlLnByb3RvdHlwZS5pbml0T2JzZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbWFpbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbWxlbiA9IG11dGF0aW9ucy5sZW5ndGg7IGkgPCBtbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG11dGF0aW9uID0gbXV0YXRpb25zW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW5Nb2R1bGUgIT09IFwidW5kZWZpbmVkXCIpIHBsdWdpbk1vZHVsZS5yYXdPYnNlcnZlcihtdXRhdGlvbik7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdhcyBub3RoaW5nIGFkZGVkLCBza2lwXG4gICAgICAgICAgICBpZiAoIW11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoIHx8ICEobXV0YXRpb24uYWRkZWROb2Rlc1swXSBpbnN0YW5jZW9mIEVsZW1lbnQpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG11dGF0aW9uLmFkZGVkTm9kZXNbMF07XG5cbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVMYXllciljbGFzc05hbWVMYXllciA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUubGF5ZXIgJiYgdHlwZW9mIGUubGF5ZXIgPT09IFwic3RyaW5nXCIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyXG4gICAgICAgICAgICBpZighY2xhc3NOYW1lU29jaWFsTGlua3MpY2xhc3NOYW1lU29jaWFsTGlua3MgPSBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLnNvY2lhbExpbmtzICYmIHR5cGVvZiBlLnNvY2lhbExpbmtzID09PSBcInN0cmluZ1wiKVswXS5zb2NpYWxMaW5rc1xuICAgICAgICAgICAgaWYoIWNsYXNzTmFtZU1vZGFsKWNsYXNzTmFtZU1vZGFsID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5tb2RhbCAmJiB0eXBlb2YgZS5tb2RhbCA9PT0gXCJzdHJpbmdcIiAmJiBlLmlubmVyICYmIHR5cGVvZiBlLmlubmVyID09PSBcInN0cmluZ1wiICYmICFlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSlbMF0ubW9kYWxcblxuICAgICAgICAgICAgaWYgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZUxheWVyKSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgPT09IFwiR1VJTERfU0VUVElOR1NcIil7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJzZXJ2ZXItc2V0dGluZ3NcIik7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJzZXJ2ZXItc2V0dGluZ3NcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVTb2NpYWxMaW5rcykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJ1c2VyLXNldHRpbmdzXCIpO1xuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImlkXCIsIFwidXNlci1zZXR0aW5nc1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudEVsZW1lbnQgPT0gZG9jdW1lbnQuYm9keSAmJiBub2RlLnF1ZXJ5U2VsZWN0b3IoXCIjYWNlX3NldHRpbmdzbWVudVwiKSkgbm9kZS5pZCA9IFwiYWNlX3NldHRpbmdzbWVudV9jb250YWluZXJcIjtcblxuICAgICAgICAgICAgLy8gRW1vamkgUGlja2VyXG4gICAgICAgICAgICAvL25vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImVtb2ppUGlja2VyLTNtMVMtalwiKS5sZW5ndGggJiYgIW5vZGUucXVlcnlTZWxlY3RvcihcIi5lbW9qaVBpY2tlci0zbTFTLWpcIikucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJhbmltYXRvckxlZnQtMUVReFUwXCIpXG4gICAgICAgICAgICAvL2lmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcjIpICYmIG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVFbW9qaVBpY2tlcikubGVuZ3RoICAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLlwiK2NsYXNzTmFtZUVtb2ppUGlja2VyKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVBbmltYXRvckxlZnQpKSBxdWlja0Vtb3RlTWVudS5vYnNDYWxsYmFjayhub2RlKTtcblxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBtYWluT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwge1xuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICB9KTtcbn07XG5cbkNvcmUucHJvdG90eXBlLnNob3dDaGFuZ2Vsb2dNb2RhbCA9IGZ1bmN0aW9uKG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwob3B0aW9ucyk7XG59O1xuXG5Db3JlLnByb3RvdHlwZS5hbGVydCA9IGZ1bmN0aW9uKHRpdGxlLCBjb250ZW50KSB7XG4gICAgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcbn07XG5cbkNvcmUucHJvdG90eXBlLnBhdGNoU29jaWFsID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuc29jaWFsUGF0Y2gpIHJldHVybjtcbiAgICBjb25zdCBUYWJCYXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIlRhYkJhclwiKTtcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgICBpZiAoIVRhYkJhcikgcmV0dXJuO1xuICAgIHRoaXMuc29jaWFsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChUYWJCYXIucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlbjtcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoIHx8IGNoaWxkcmVuLmxlbmd0aCA8IDMpIHJldHVybjtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDNdLnR5cGUuZGlzcGxheU5hbWUgIT09IFwiU2VwYXJhdG9yXCIpIHJldHVybjtcbiAgICAgICAgaWYgKCFjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJzb2NpYWxMaW5rc1wiKSkgcmV0dXJuO1xuICAgICAgICBpZiAoQW5jaG9yKSB7XG4gICAgICAgICAgICBsZXQgc29jaWFsTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNvY2lhbExpbmtzKVswXVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlO1xuICAgICAgICAgICAgY29uc3QgbmV3T25lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWwoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmRcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxvZ29cIn0pXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVyblZhbC5wcm9wcy5jaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkRcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1zb2NpYWwtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlID0gbmV3T25lO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IFtcbiAgICAgICAgICAgIGNsYXNzTmFtZUNvbG9yTXV0ZWQsXG4gICAgICAgICAgICBzaXplcyxcbiAgICAgICAgICAgIGNsYXNzTmFtZVZlcnNpb25IYXNoXG4gICAgICAgIF0gPSBbXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvck11dGVkKVswXS5jb2xvck11dGVkLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnNpb25IYXNoKVswXS52ZXJzaW9uSGFzaFxuICAgICAgICBdXG5cbiAgICAgICAgY29uc3QgdmVyc2lvbkhhc2ggPSBgKCR7YmRDb25maWcuaGFzaCA/IGJkQ29uZmlnLmhhc2guc3Vic3RyaW5nKDAsIDcpIDogYmRDb25maWcuYnJhbmNofSlgO1xuICAgICAgICBjb25zdCBhZGRpdGlvbmFsID0gW1xuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGAke2NsYXNzTmFtZUNvbG9yTXV0ZWR9ICR7c2l6ZXMuc2l6ZTEyfWB9LCBgTGlnaHRjb3JkICR7ZWxlY3Ryb24uZ2V0R2xvYmFsKFwiQnVpbGRJbmZvXCIpLnZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIGAoJHsoZWxlY3Ryb24uZ2V0R2xvYmFsKFwiQnVpbGRJbmZvXCIpLmNvbW1pdCB8fCBcIlVua25vd25cIikuc2xpY2UoMCwgNyl9KWApKSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYEJCRCAke2JiZFZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIHZlcnNpb25IYXNoKSlcbiAgICAgICAgXVxuICAgICAgICBcblxuICAgICAgICBjb25zdCBvcmlnaW5hbFZlcnNpb25zID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udHlwZTtcbiAgICAgICAgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udHlwZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWxWZXJzaW9ucyguLi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnNwbGljZSgxLCAwLCBhZGRpdGlvbmFsKTtcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7XG4gICAgICAgIH07XG4gICAgfX0pO1xufTtcblxuY29uc3QgZ2V0R3VpbGRDbGFzc2VzID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgZ3VpbGRzV3JhcHBlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwid3JhcHBlclwiLCBcInVucmVhZE1lbnRpb25zQmFyXCIpO1xuICAgIGNvbnN0IGd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZ3VpbGRzRXJyb3JcIiwgXCJzZWxlY3RlZFwiKTtcbiAgICBjb25zdCBwaWxsID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJibG9iQ29udGFpbmVyXCIpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBndWlsZHNXcmFwcGVyLCBndWlsZHMsIHBpbGwpO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZExpc3RJdGVtcyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2gpIHJldHVybjtcbiAgICBjb25zdCBHdWlsZENsYXNzZXMgPSBnZXRHdWlsZENsYXNzZXMoKTtcbiAgICBjb25zdCBsaXN0SXRlbUNsYXNzID0gR3VpbGRDbGFzc2VzLmxpc3RJdGVtLnNwbGl0KFwiIFwiKVswXTtcbiAgICBjb25zdCBibG9iQ2xhc3MgPSBHdWlsZENsYXNzZXMuYmxvYkNvbnRhaW5lci5zcGxpdChcIiBcIilbMF07XG4gICAgY29uc3QgcmVhY3RJbnN0YW5jZSA9IEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtsaXN0SXRlbUNsYXNzfSAuJHtibG9iQ2xhc3N9YCkucGFyZW50RWxlbWVudCk7XG4gICAgY29uc3QgR3VpbGRDb21wb25lbnQgPSByZWFjdEluc3RhbmNlLnJldHVybi50eXBlO1xuICAgIGlmICghR3VpbGRDb21wb25lbnQpIHJldHVybjtcbiAgICB0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZENvbXBvbmVudC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKGRhdGEucmV0dXJuVmFsdWUgJiYgZGF0YS50aGlzT2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWU7XG4gICAgICAgICAgICBjb25zdCBndWlsZERhdGEgPSBkYXRhLnRoaXNPYmplY3QucHJvcHM7XG4gICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gXCIgYmQtZ3VpbGRcIjtcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEudW5yZWFkKSBjbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLnNlbGVjdGVkKSBjbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYXVkaW8pIGNsYXNzTmFtZSArPSBcIiBiZC1hdWRpb1wiO1xuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS52aWRlbykgY2xhc3NOYW1lICs9IFwiIGJkLXZpZGVvXCI7XG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmJhZGdlKSBjbGFzc05hbWUgKz0gXCIgYmQtYmFkZ2VcIjtcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYW5pbWF0YWJsZSkgY2xhc3NOYW1lICs9IFwiIGJkLWFuaW1hdGFibGVcIjtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZVxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgfX0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFBpbGxzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuZ3VpbGRQaWxsUGF0Y2gpIHJldHVybjtcbiAgICBjb25zdCBndWlsZFBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmICFtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LnRvU3RyaW5nICYmIG0uZGVmYXVsdC50b1N0cmluZygpLmluY2x1ZGVzKFwidHJhbnNsYXRlM2RcIikpO1xuICAgIGlmICghZ3VpbGRQaWxsKSByZXR1cm47XG4gICAgdGhpcy5ndWlsZFBpbGxQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKGd1aWxkUGlsbCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcbiAgICAgICAgaWYgKHByb3BzLnVucmVhZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XG4gICAgICAgIGlmIChwcm9wcy5zZWxlY3RlZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcbiAgICAgICAgaWYgKHByb3BzLmhvdmVyZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWhvdmVyZWRcIjtcbiAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWU7XG4gICAgfX0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2gpIHJldHVybjtcbiAgICBjb25zdCBHdWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcbiAgICBjb25zdCBndWlsZENvbXBvbmVudHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInJlbmRlckxpc3RJdGVtXCIpO1xuICAgIGlmICghZ3VpbGRDb21wb25lbnRzIHx8ICFHdWlsZHMpIHJldHVybjtcbiAgICBjb25zdCBHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGd1aWxkQ29tcG9uZW50cy5TZXBhcmF0b3IoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkLXNlcGFyYXRvclwiO1xuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfTtcbiAgICB0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZHMucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XG4gICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2hpbGRyZW5bM10udHlwZSA9IEd1aWxkU2VwYXJhdG9yO1xuICAgIH19KTtcbn07XG5cbkNvcmUucHJvdG90eXBlLnBhdGNoQXR0YWNobWVudCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLkF0dGFjaG1lbnRQYXRjaCkgcmV0dXJuO1xuICAgIGNvbnN0IEF0dGFjaG1lbnQgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdHRhY2htZW50XCIpWzBdIC8vIHRlbXBvcmFyeVxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xuICAgIGlmICghQW5jaG9yIHx8ICFBdHRhY2htZW50IHx8ICFBdHRhY2htZW50LmRlZmF1bHQpIHJldHVybjtcbiAgICB0aGlzLkF0dGFjaG1lbnRQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEF0dGFjaG1lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XG4gICAgICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSlyZXR1cm5cbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdIHx8IG51bGxcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW5cIik7XG5cbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhYXR0YWNobWVudCB8fCAhYXR0YWNobWVudC51cmwpcmV0dXJuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcblxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXG4gICAgICAgIGNoaWxkcmVuLnB1c2goQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBpZDogXCJjZXJ0aWZpZWQtXCIraWRcbiAgICAgICAgfSkpXG4gICAgICAgIFBsdWdpbkNlcnRpZmllci5wYXRjaChhdHRhY2htZW50LCBcImNlcnRpZmllZC1cIitpZClcbiAgICB9fSlcbn1cblxuQ29yZS5wcm90b3R5cGUucGF0Y2hNZXNzYWdlSGVhZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMubWVzc2FnZUhlYWRlclBhdGNoKSByZXR1cm47XG4gICAgY29uc3QgTWVzc2FnZUhlYWRlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiTWVzc2FnZVRpbWVzdGFtcFwiKTtcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgICBpZiAoIUFuY2hvciB8fCAhTWVzc2FnZUhlYWRlciB8fCAhTWVzc2FnZUhlYWRlci5kZWZhdWx0KSByZXR1cm47XG4gICAgdGhpcy5tZXNzYWdlSGVhZGVyUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChNZXNzYWdlSGVhZGVyLCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xuICAgICAgICBjb25zdCBhdXRob3IgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcIm1lc3NhZ2UuYXV0aG9yXCIpO1xuICAgICAgICAvLyBjb25zdCBoZWFkZXIgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wc1wiKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlbi4xLnByb3BzLmNoaWxkcmVuXCIpO1xuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFhdXRob3IgfHwgIWF1dGhvci5pZClyZXR1cm5cbiAgICAgICAgLy8gaWYgKGhlYWRlciAmJiBoZWFkZXIuY2xhc3NOYW1lKSBoZWFkZXIuY2xhc3NOYW1lICs9IFwiIFwiXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcbiAgICAgICAgaWYgKGF1dGhvci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikgeyAvLyBSYXVlbnppOiBCYW5kYWdlZEJEIERldmVsb3BlclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGF1dGhvci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCBhdXRob3IuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpeyAvLyBOb3QgVGhvbWl6OiBMaWdodGNvcmQgRGV2ZWxvcGVyLCBQaG9yY3lzOiBMaWdodGNvcmQgRGV2ZWxvcGVyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkIERldmVsb3BlclwifSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKVxuICAgICAgICBjaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBpZDogXCJiYWRnZXMtXCIraWQsXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgYXBwbHlCYWRnZXMoaWQsIGF1dGhvciwgdHJ1ZSlcbiAgICB9fSk7XG59O1xuXG5mdW5jdGlvbiBhcHBseUJhZGdlcyhpZCwgdXNlciwgY2hhdCl7XG4gICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYmFkZ2VzLVwiK2lkKVxuICAgICAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuXG4gICAgICAgIGlmKGRpdi5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm5cbiAgICAgICAgbGV0IGJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgICBibG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGJsb2NrRGl2KVxuXG4gICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xuXG4gICAgICAgIGRpc3RhbnQuZ2V0QmFkZ2VzKHVzZXIuaWQpXG4gICAgICAgIC50aGVuKGJhZGdlcyA9PiB7XG4gICAgICAgICAgICBiYWRnZXMuZm9yRWFjaChiYWRnZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHN2Zzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCIxNnB4XCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJkLWxvZ29cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcIjE2cHhcIiwgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmFkZ2Uuc2NvcGVzLmZvckVhY2goc2NvcGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZihzY29wZSA9PT0gXCJ1c2VyXCIpey8vIHJlcXVpcmUgdXNlclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMudXNlciA9IHVzZXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pIFxuICAgICAgICAgICAgICAgIGlmKCFiYWRnZS5ocmVmKXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuQW5jaG9yID0gQW5jaG9yXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmhyZWYgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNoYXQgPyBcImJkLWNoYXQtYmFkZ2VcIiA6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGJhZGdlLm5hbWUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IGJhZGdlLm5hbWV9LFxuICAgICAgICAgICAgICAgICAgICBiYWRnZS5ocmVmID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogYmFkZ2UuaHJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2hhdCA/IFwiYmQtY2hhdC1iYWRnZVwiIDogXCJiZC1tZW1iZXItYmFkZ2VcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYmFkZ2UubmFtZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KGJhZGdlLmNvbXBvbmVudCwgcHJvcHMpKSA6IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChiYWRnZS5jb21wb25lbnQsIHByb3BzKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKGVsZW1lbnQsIGRpdjIpXG4gICAgICAgICAgICAgICAgZGl2Mi5jaGlsZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH0pXG59XG5cbkNvcmUucHJvdG90eXBlLnBhdGNoTWVtYmVyTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLm1lbWJlckxpc3RQYXRjaCkgcmV0dXJuO1xuICAgIGNvbnN0IE1lbWJlckxpc3RJdGVtID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNZW1iZXJMaXN0SXRlbVwiKTtcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgICBpZiAoIUFuY2hvciB8fCAhTWVtYmVyTGlzdEl0ZW0gfHwgIU1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSB8fCAhTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlLnJlbmRlckRlY29yYXRvcnMpIHJldHVybjtcbiAgICB0aGlzLm1lbWJlckxpc3RQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSwgXCJyZW5kZXJEZWNvcmF0b3JzXCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgdXNlciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS50aGlzT2JqZWN0LCBcInByb3BzLnVzZXJcIik7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuXCIpO1xuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICF1c2VyIHx8ICF1c2VyLmlkKXJldHVyblxuICAgICAgICAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xuICAgICAgICBpZiAodXNlci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodXNlci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCB1c2VyLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcbiAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmFkZ2VzLVwiK2lkfSlcbiAgICAgICAgKVxuICAgICAgICBhcHBseUJhZGdlcyhpZCwgdXNlciwgZmFsc2UpXG4gICAgfX0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUudXBkYXRlSW5qZWN0b3IgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAvLyBUaGVyZSB3aWxsIG5ldmVyIGJlIGFuIGluamVjdGlvbiBwYXRoLCBzbyB3ZSBkbyBub3QgbmVlZCB0aGUgY29kZSBiZWxvdy4gXG4gICAgLy8gSW5zZXJ0IGNvbW1lbnRzIHNvIGl0IHdpbGwgYmUgZXJhc2VkIHdoZW4gcHJvZHVjdGlvbi5cbiAgICBcbiAgICBjb25zdCBpbmplY3Rpb25QYXRoID0gRGF0YVN0b3JlLmluamVjdGlvblBhdGg7XG4gICAgaWYgKCFpbmplY3Rpb25QYXRoKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvKlxuXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICAgIGNvbnN0IHJtcmYgPSByZXF1aXJlKFwicmltcmFmXCIpO1xuICAgIGNvbnN0IHlhdXpsID0gcmVxdWlyZShcInlhdXpsXCIpO1xuICAgIGNvbnN0IG1rZGlycCA9IHJlcXVpcmUoXCJta2RpcnBcIik7XG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoXCJyZXF1ZXN0XCIpO1xuXG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShpbmplY3Rpb25QYXRoLCBcIi4uXCIpO1xuICAgIGNvbnN0IGZvbGRlck5hbWUgPSBwYXRoLmJhc2VuYW1lKGluamVjdGlvblBhdGgpO1xuICAgIGNvbnN0IHppcExpbmsgPSBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvYXJjaGl2ZS9pbmplY3Rvci56aXBcIjtcbiAgICBjb25zdCBzYXZlZFppcCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBcImluamVjdG9yLnppcFwiKTtcbiAgICBjb25zdCBleHRyYWN0ZWRGb2xkZXIgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgXCJCZXR0ZXJEaXNjb3JkQXBwLWluamVjdG9yXCIpO1xuXG4gICAgLy8gRG93bmxvYWQgdGhlIGluamVjdG9yIHppcCBmaWxlXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJEb3dubG9hZGluZyBcIiArIHppcExpbmspO1xuICAgIGxldCBzdWNjZXNzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHJlcXVlc3QuZ2V0KHt1cmw6IHppcExpbmssIGVuY29kaW5nOiBudWxsfSwgYXN5bmMgKGVycm9yLCByZXNwb25zZSwgYm9keSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkgcmV0dXJuIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgLy8gU2F2ZSBhIGJhY2t1cCBpbiBjYXNlIHNvbWVvbmUgaGFzIHRoZWlyIG93biBjb3B5XG4gICAgICAgICAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLmV4aXN0cyhzYXZlZFppcCwgcmVzKSk7XG4gICAgICAgICAgICBpZiAoYWxyZWFkeUV4aXN0cykgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLnJlbmFtZShzYXZlZFppcCwgYCR7c2F2ZWRaaXB9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XG5cbiAgICAgICAgICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiV3JpdGluZyBcIiArIHNhdmVkWmlwKTtcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZShzYXZlZFppcCwgYm9keSwgZXJyID0+IHJlc29sdmUoIWVycikpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBzdWNjZXNzO1xuXG4gICAgLy8gQ2hlY2sgYW5kIGRlbGV0ZSByZW5hbWUgZXh0cmFjdGlvblxuICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMuZXhpc3RzKGV4dHJhY3RlZEZvbGRlciwgcmVzKSk7XG4gICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoZXh0cmFjdGVkRm9sZGVyLCBgJHtleHRyYWN0ZWRGb2xkZXJ9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XG4gICAgXG4gICAgLy8gVW56aXAgdGhlIGRvd25sb2FkZWQgemlwIGZpbGVcbiAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgbmV3IFByb21pc2UociA9PiB5YXV6bC5vcGVuKHNhdmVkWmlwLCB7bGF6eUVudHJpZXM6IHRydWV9LCAoZXJyLCB6aXApID0+ICByKHppcCkpKTtcbiAgICB6aXBmaWxlLm9uKFwiZW50cnlcIiwgZnVuY3Rpb24oZW50cnkpIHtcbiAgICAgICAgLy8gU2tpcCBkaXJlY3RvcmllcywgdGhleSBhcmUgaGFuZGxlZCB3aXRoIG1rZGlycFxuICAgICAgICBpZiAoZW50cnkuZmlsZU5hbWUuZW5kc1dpdGgoXCIvXCIpKSByZXR1cm4gemlwZmlsZS5yZWFkRW50cnkoKTtcblxuICAgICAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkV4dHJhY3RpbmcgXCIgKyBlbnRyeS5maWxlTmFtZSk7XG4gICAgICAgIC8vIE1ha2UgYW55IG5lZWRlZCBwYXJlbnQgZGlyZWN0b3JpZXNcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgZW50cnkuZmlsZU5hbWUpO1xuICAgICAgICBta2RpcnAuc3luYyhwYXRoLmRpcm5hbWUoZnVsbFBhdGgpKTtcbiAgICAgICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbShlbnRyeSwgZnVuY3Rpb24oZXJyLCByZWFkU3RyZWFtKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICAgICAgcmVhZFN0cmVhbS5vbihcImVuZFwiLCBmdW5jdGlvbigpIHt6aXBmaWxlLnJlYWRFbnRyeSgpO30pOyAvLyBHbyB0byBuZXh0IGZpbGUgYWZ0ZXIgdGhpc1xuICAgICAgICAgICAgcmVhZFN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZ1bGxQYXRoKSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHppcGZpbGUucmVhZEVudHJ5KCk7IC8vIFN0YXJ0IHJlYWRpbmdcblxuICAgIC8vIFdhaXQgZm9yIHRoZSBmaW5hbCBmaWxlIHRvIGZpbmlzaFxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gemlwZmlsZS5vbmNlKFwiZW5kXCIsIHJlc29sdmUpKTtcblxuICAgIC8vIFNhdmUgYSBiYWNrdXAgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgZmluYWwgc3RlcFxuICAgIGNvbnN0IGJhY2t1cEZvbGRlciA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBgJHtmb2xkZXJOYW1lfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWApO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGluamVjdGlvblBhdGgsIGJhY2t1cEZvbGRlciwgcmVzb2x2ZSkpO1xuXG4gICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgZm9sZGVyIHRvIHdoYXQgaXQgc2hvdWxkIGJlXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgYFJlbmFtaW5nICR7cGF0aC5iYXNlbmFtZShleHRyYWN0ZWRGb2xkZXIpfSB0byAke2ZvbGRlck5hbWV9YCk7XG4gICAgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGV4dHJhY3RlZEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgZXJyID0+IHJlc29sdmUoIWVycikpKTtcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgVXRpbHMuZXJyKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJGYWlsZWQgdG8gcmVuYW1lIHRoZSBmaW5hbCBkaXJlY3RvcnlcIik7XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIC8vIElmIHJlbmFtZSBoYWQgaXNzdWVzLCBkZWxldGUgd2hhdCB3ZSB0cmllZCB0byByZW5hbWUgYW5kIHJlc3RvcmUgYmFja3VwXG4gICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgIFV0aWxzLmVycihcIkluamVjdG9yVXBkYXRlXCIsIFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuLi4gcmVzdG9yaW5nIGJhY2t1cHMuXCIpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJtcmYoZXh0cmFjdGVkRm9sZGVyLCByZXNvbHZlKSk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGJhY2t1cEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgcmVzb2x2ZSkpO1xuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gdGhpcyBwb2ludCwgZXZlcnl0aGluZyBzaG91bGQgaGF2ZSBnb25lIHNtb290aGx5LlxuICAgIC8vIENsZWFudXAgdGhlIGJhY2t1cCBmb2xkZXIgdGhlbiByZW1vdmUgdGhlIHppcFxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnVubGluayhzYXZlZFppcCwgcmVzb2x2ZSkpO1xuXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJJbmplY3RvciBVcGRhdGVkIVwiKTtcbiAgICByZXR1cm4gc3VjY2VzczsqL1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IENvcmUoKTtcblxuLyoqXG4gKiBEb24ndCBleHBvc2UgY29yZSAtIGNvdWxkIGJlIGRhbmdlcm91cyBmb3Igbm93XG4gKi8iLCJjb25zdCBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA9IHdpbmRvdy5yZXF1aXJlXG5cbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XG5cbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgcmVsZWFzZUNoYW5uZWwgPSBEaXNjb3JkTmF0aXZlLmdsb2JhbHMgPyBEaXNjb3JkTmF0aXZlLmdsb2JhbHMucmVsZWFzZUNoYW5uZWwgOiBEaXNjb3JkTmF0aXZlLmFwcCA/IERpc2NvcmROYXRpdmUuYXBwLmdldFJlbGVhc2VDaGFubmVsKCkgOiBcInN0YWJsZVwiO1xuXG5sZXQgZGF0YVBhdGggPSBcIlwiO1xuaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikgZGF0YVBhdGggPSBwcm9jZXNzLmVudi5BUFBEQVRBO1xuZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIikgZGF0YVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5lbnYuSE9NRSwgXCJMaWJyYXJ5XCIsIFwiUHJlZmVyZW5jZXNcIik7XG5lbHNlIGRhdGFQYXRoID0gcHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FID8gcHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FIDogcGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUsIFwiLmNvbmZpZ1wiKTtcbmRhdGFQYXRoID0gcGF0aC5qb2luKGRhdGFQYXRoLCBcIkJldHRlckRpc2NvcmRcIik7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEYXRhU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmRhdGEgPSB7c2V0dGluZ3M6IHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fX07XG4gICAgICAgIHRoaXMucGx1Z2luRGF0YSA9IHt9O1xuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRGF0YVN0b3JlID0gdGhpc1xuICAgIH1cblxuICAgIGluaXRpYWxpemUoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5CREZpbGUpKSBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcInV0Zi04XCIpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuQkRGaWxlLCBcInV0Zi04XCIpKVxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJzZXR0aW5nc1wiKSkgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLnNldHRpbmdzRmlsZSkpIHJldHVybjtcbiAgICAgICAgICAgIGxldCBzZXR0aW5ncyA9IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKHRoaXMuc2V0dGluZ3NGaWxlKTtcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpO1xuICAgICAgICAgICAgaWYgKHNldHRpbmdzLmhhc093blByb3BlcnR5KFwic2V0dGluZ3NcIikpIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX0sIHtbcmVsZWFzZUNoYW5uZWxdOiBzZXR0aW5nc30pO1xuICAgICAgICAgICAgZWxzZSBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319LCBzZXR0aW5ncyk7XG4gICAgICAgICAgICB0aGlzLnNldEJERGF0YShcInNldHRpbmdzXCIsIHNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICBVdGlscy5hbGVydChcIkNvcnJ1cHQgU3RvcmFnZVwiLCBcIlRoZSBiZCBzdG9yYWdlIGhhcyBzb21laG93IGJlY29tZSBjb3JydXB0LiBZb3UgbWF5IGVpdGhlciB0cnkgdG8gc2FsdmFnZSB0aGUgZmlsZSBvciBkZWxldGUgaXQgdGhlbiByZWxvYWQuXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGluamVjdGlvblBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuX2luamVjdGlvblBhdGgpIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoO1xuICAgICAgICBjb25zdCBlbGVjdHJvbiA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xuICAgICAgICBjb25zdCBiYXNlID0gZWxlY3Ryb24uZ2V0QXBwUGF0aCgpO1xuICAgICAgICBjb25zdCByb2FtaW5nQmFzZSA9IGVsZWN0cm9uLmdldFBhdGgoXCJ1c2VyRGF0YVwiKTtcbiAgICAgICAgY29uc3Qgcm9hbWluZ0xvY2F0aW9uID0gcGF0aC5yZXNvbHZlKHJvYW1pbmdCYXNlLCBlbGVjdHJvbi5nZXRWZXJzaW9uKCksIFwibW9kdWxlc1wiLCBcImRpc2NvcmRfZGVza3RvcF9jb3JlXCIsIFwiaW5qZWN0b3JcIik7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcGF0aC5yZXNvbHZlKGJhc2UsIFwiLi5cIiwgXCJhcHBcIik7XG4gICAgICAgIGNvbnN0IHJlYWxMb2NhdGlvbiA9IGZzLmV4aXN0c1N5bmMobG9jYXRpb24pID8gbG9jYXRpb24gOiBmcy5leGlzdHNTeW5jKHJvYW1pbmdMb2NhdGlvbikgPyByb2FtaW5nTG9jYXRpb24gOiBudWxsO1xuICAgICAgICBpZiAoIXJlYWxMb2NhdGlvbikgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IHJlYWxMb2NhdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgY29uZmlnRmlsZSgpIHtyZXR1cm4gdGhpcy5fY29uZmlnRmlsZSB8fCAodGhpcy5fY29uZmlnRmlsZSA9IHBhdGgucmVzb2x2ZSh0aGlzLmluamVjdGlvblBhdGgsIFwiYmV0dGVyZGlzY29yZFwiLCBcImNvbmZpZy5qc29uXCIpKTt9XG4gICAgZ2V0IEJERmlsZSgpIHtyZXR1cm4gdGhpcy5fQkRGaWxlIHx8ICh0aGlzLl9CREZpbGUgPSBwYXRoLnJlc29sdmUoZGF0YVBhdGgsIFwiYmRzdG9yYWdlLmpzb25cIikpO31cbiAgICBnZXQgc2V0dGluZ3NGaWxlKCkge3JldHVybiB0aGlzLl9zZXR0aW5nc0ZpbGUgfHwgKHRoaXMuX3NldHRpbmdzRmlsZSA9IHBhdGgucmVzb2x2ZShkYXRhUGF0aCwgXCJiZHNldHRpbmdzLmpzb25cIikpO31cbiAgICBnZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpIHtyZXR1cm4gcGF0aC5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIHBsdWdpbk5hbWUgKyBcIi5jb25maWcuanNvblwiKTt9XG5cbiAgICBnZXRTZXR0aW5nR3JvdXAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2V0dGluZ3NbcmVsZWFzZUNoYW5uZWxdW2tleV0gfHwgbnVsbDtcbiAgICB9XG5cbiAgICBzZXRTZXR0aW5nR3JvdXAoa2V5LCBkYXRhKSB7XG4gICAgICAgIHRoaXMuZGF0YS5zZXR0aW5nc1tyZWxlYXNlQ2hhbm5lbF1ba2V5XSA9IGRhdGE7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwidXRmLThcIik7XG4gICAgfVxuXG4gICAgZ2V0QkREYXRhKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW2tleV0gfHwgXCJcIjtcbiAgICB9XG5cbiAgICBzZXRCRERhdGEoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmRhdGFba2V5XSA9IHZhbHVlO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcInV0Zi04XCIpO1xuICAgIH1cblxuICAgIGdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XTtcbiAgICB9XG5cbiAgICBzZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSksIEpTT04uc3RyaW5naWZ5KHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSwgbnVsbCwgNCksIFwidXRmLThcIik7XG4gICAgfVxuXG4gICAgZGVsZXRlUGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcbiAgICAgICAgZGVsZXRlIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdLCBudWxsLCA0KSwgXCJ1dGYtOFwiKTtcbiAgICB9XG59OyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGV2TW9kZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZGVidWdMaXN0ZW5lciA9IHRoaXMuZGVidWdMaXN0ZW5lci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyID0gdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lci5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIHN0YXJ0KCkge1xuICAgICAgICB0aGlzLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLWRtLTFcIl0pIHRoaXMuc3RhcnRDb3B5U2VsZWN0b3IoKTtcbiAgICB9XG4gICAgXG4gICAgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5zdG9wRGVidWdMaXN0ZW5lcigpO1xuICAgICAgICB0aGlzLnN0b3BDb3B5U2VsZWN0b3IoKTtcbiAgICB9XG5cbiAgICBzdGFydERlYnVnTGlzdGVuZXIoKSB7XG4gICAgICAgIHRoaXMuc3RvcERlYnVnTGlzdGVuZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5kZWJ1Z0xpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBzdG9wRGVidWdMaXN0ZW5lcigpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5kZWJ1Z0xpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBzdGFydENvcHlTZWxlY3RvcigpIHtcbiAgICAgICAgdGhpcy5zdG9wQ29weVNlbGVjdG9yKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBzdG9wQ29weVNlbGVjdG9yKCkge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgZGVidWdMaXN0ZW5lcihlKSB7XG4gICAgICAgIGlmIChlLndoaWNoID09PSAxMTkgfHwgZS53aGljaCA9PSAxMTgpIHsvL0Y4XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiVjWyVjRGV2TW9kZSVjXSAlY0JyZWFrL1Jlc3VtZVwiLCBcImNvbG9yOiByZWQ7XCIsIFwiY29sb3I6ICMzMDMwMzA7IGZvbnQtd2VpZ2h0OjcwMDtcIiwgXCJjb2xvcjpyZWQ7XCIsIFwiXCIpO1xuICAgICAgICAgICAgZGVidWdnZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZGVidWdnZXJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICB9XG4gICAgfVxuXG4gICAgY29weVNlbGVjdG9yTGlzdGVuZXIoZSkge1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLmdldFNlbGVjdG9yKGUudGFyZ2V0KTtcbiAgICBcbiAgICAgICAgICAgIGxldCBbXG4gICAgICAgICAgICAgICAgY2xhc3NMYXllciwgXG4gICAgICAgICAgICAgICAgY2xhc3NJdGVtc1xuICAgICAgICAgICAgXSA9IFtcbiAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLmxheWVyICYmIHR5cGVvZiBlLmxheWVyID09PSBcInN0cmluZ1wiICYmIGUuZGlzYWJsZWRQb2ludGVyRXZlbnRzKVswXSxcbiAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLm1lbnUpWzBdXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZ1bmN0aW9uIGF0dGFjaCgpIHtcbiAgICAgICAgICAgICAgICBpZighY2xhc3NJdGVtcyB8fCAhY2xhc3NMYXllci5sYXllcilyZXR1cm4gY29uc29sZS5sb2coY2xhc3NJdGVtcywgY2xhc3NMYXllci5sYXllcilcblxuICAgICAgICAgICAgICAgIGxldCBjbSA9IERPTS5xdWVyeShcIi5cIitVdGlscy5yZW1vdmVEYShjbGFzc0l0ZW1zLm1lbnUpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNtKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IERPTS5xdWVyeShcIiNhcHAtbW91bnQgPiAuXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NMYXllci5sYXllckNvbnRhaW5lcikpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbVdyYXAgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NMYXllci5sYXllcn1cIj5gKTtcbiAgICAgICAgICAgICAgICAgICAgY20gPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5tZW51fSAke2NsYXNzSXRlbXMuc3R5bGVGbGV4aWJsZX0gJHtjbGFzc0l0ZW1zLmFjY29tbW9kYXRlU2Nyb2xsYmFyfSBiZC1jb250ZXh0LW1lbnVcIiBzdHlsZT1cIlwiPjwvZGl2PmApO1xuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuYXBwZW5kKGNtKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChjbVdyYXApO1xuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUudG9wID0gZS5jbGllbnRZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUubGVmdCA9IGUuY2xpZW50WCArIFwicHhcIjtcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJtZW51XCIpXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5pZCA9IFwiYmQtY29weS1zZWxlY3Rvci1jb250ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJDb3B5IFNlbGVjdG9yIEFjdGlvbnNcIilcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxlckNsYXNzZXMgPSBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLnNjcm9sbGVyV3JhcClbMF1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXJXcmFwID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke3Njcm9sbGVyQ2xhc3Nlcy5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJDbGFzc2VzLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyQ2xhc3Nlcy50aGVtZUdob3N0SGFpcmxpbmV9XCI+PC9kaXY+YClcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7QkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXIpWzBdLnNjcm9sbGVyfSAke2NsYXNzSXRlbXMuc2Nyb2xsZXJ9XCI+PC9kaXY+YClcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZXJXcmFwLmFwcGVuZChzY3JvbGxlcilcbiAgICAgICAgICAgICAgICAgICAgY20uYXBwZW5kKHNjcm9sbGVyV3JhcClcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVDTSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgJiYgZS5rZXlDb2RlICE9PSAyNykgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21XcmFwLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHJlbW92ZUNNKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCByZW1vdmVDTSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgcmVtb3ZlQ00pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlQ00pO1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgcmVtb3ZlQ00pO1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgcmVtb3ZlQ00pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjbVdyYXAgPSBjbS5wYXJlbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBjbS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF1cbiAgICAgICAgICAgICAgICBjb25zdCBjbWcgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiByb2xlPVwiZ3JvdXBcIj48L2Rpdj5gKTtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgY21pID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMuaXRlbX0gJHtjbGFzc0l0ZW1zLmxhYmVsQ29udGFpbmVyfSAke2NsYXNzSXRlbXMuY29sb3JEZWZhdWx0fVwiIHJvbGU9XCJtZW51aXRlbVwiIGlkPVwiYmQtY29weS1zZWxlY3Rvci1pdGVtLWNtXCI+PC9kaXY+YCk7XG4gICAgICAgICAgICAgICAgY21pLmFwcGVuZChET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5sYWJlbH1cIj5Db3B5IFNlbGVjdG9yPC9kaXY+YCkpO1xuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBCRFYyLk5hdGl2ZU1vZHVsZS5jb3B5KHNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50cyA9IERPTS5xdWVyeUFsbChcImRpdltyb2xlPW1lbnVpdGVtXS5cIitVdGlscy5yZW1vdmVEYShjbGFzc0l0ZW1zLmZvY3VzZWQpKVxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyAmJiBlbGVtZW50cy5mb3JFYWNoKGVsZW0gPT4gZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzSXRlbXMuZm9jdXNlZCkpXG4gICAgICAgICAgICAgICAgICAgIGNtaS5jbGFzc0xpc3QuYWRkKGNsYXNzSXRlbXMuZm9jdXNlZClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY21pLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NJdGVtcy5mb2N1c2VkKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgY21nLmFwcGVuZChjbWkpO1xuICAgICAgICAgICAgICAgIGlmKHNjcm9sbGVyLmNoaWxkTm9kZXMubGVuZ3RoKXsgLy8gYXBlbmQgYSBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgcm9sZT1cInNlcGFyYXRvclwiIGNsYXNzPVwiJHtjbGFzc0l0ZW1zLnNlcGFyYXRvcn1cIj48L2Rpdj5gKVxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQoc2VwYXJhdG9yKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQoY21nKTtcbiAgICAgICAgICAgICAgICBpZihjbVdyYXAuY2xpZW50SGVpZ2h0IDwgY21XcmFwLnNjcm9sbEhlaWdodCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib3ZlcmZsb3dpbmcgXCIrY21XcmFwLnN0eWxlLnRvcClcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLnRvcCA9IChjbVdyYXAuc3R5bGUudG9wIC0gY21nLmNsaWVudEhlaWdodCkgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib3ZlcmZsb3dpbmdcIitjbVdyYXAuc3R5bGUudG9wKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIHNldFRpbWVvdXQoYXR0YWNoLCAxKTtcbiAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0U2VsZWN0b3IoZWxlbWVudCkge1xuICAgICAgICBpZiAoZWxlbWVudC5pZCkgcmV0dXJuIGAjJHtlbGVtZW50LmlkfWA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBmdWxsUGF0aChlbCl7XG4gICAgICAgICAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICAgICAgICAgIHdoaWxlIChlbC5wYXJlbnROb2RlKXtcbiAgICAgICAgICAgICAgaWYgKGVsLmlkKXtcbiAgICAgICAgICAgICAgICBuYW1lcy51bnNoaWZ0KCcjJytlbC5pZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGlmIChlbD09ZWwub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIG5hbWVzLnVuc2hpZnQoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpK0FycmF5LmZyb20oZWwuY2xhc3NMaXN0LmVudHJpZXMoKSkubWFwKGUgPT4gXCIuXCIrZSkuam9pbihcIlwiKSk7XG4gICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGM9MSxlPWVsO2UucHJldmlvdXNFbGVtZW50U2libGluZztlPWUucHJldmlvdXNFbGVtZW50U2libGluZyxjKyspO1xuICAgICAgICAgICAgICAgICAgbmFtZXMudW5zaGlmdChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkrKCh0eXBlb2YgZWwuY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsLmNsYXNzTmFtZSkgfHwgXCJcIikuc3BsaXQoXCIgXCIpLmZpbHRlcihlID0+ICEhZSkubWFwKGUgPT4gXCIuXCIrZSkuam9pbihcIlwiKStcIjpudGgtY2hpbGQoXCIrYytcIilcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsPWVsLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYW1lcy5qb2luKFwiID4gXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxsUGF0aChlbGVtZW50KVxuICAgIH1cbn07IiwiZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIERpc2FibGVUeXBpbmcge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5zdGFydFR5cGluZylcbiAgICAgICAgLnRoZW4odHlwaW5nTW9kdWxlID0+IHtcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUeXBpbmcgPSB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdGFydFR5cGluZ1xuICAgICAgICAgICAgdHlwaW5nTW9kdWxlLmRlZmF1bHQuc3RhcnRUeXBpbmcgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0YXJ0VHlwaW5nLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RvcFR5cGluZyA9IHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmdcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmcgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0b3BUeXBpbmcuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZVxuICAgICAgICB9KVxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRGlzYWJsZVR5cGluZyA9IHRoaXNcbiAgICB9XG5cbiAgICBkaXNhYmxlKCl7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgZW5hYmxlKCl7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZVxuICAgIH1cbn0iLCJpbXBvcnQgQnVnSHVudGVyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9idWdfaHVudGVyXCJcbmltcG9ydCBub2RlRmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxuaW1wb3J0IHsgc2V0dGluZ3NDb29raWUgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBDaXJjdXMgZnJvbSBcIi4uL3N2Zy9jaXJjdXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCgpIHsgLy8gR2VuZXJhdGUgVVVJRCAoTm8gY3J5cHRvIHJuZylcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XG4gICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xufSAgXG5cbmNvbnN0IGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXMgPSB7fVxubGV0IGJhZGdlc1RvRmV0Y2ggPSBbXVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGlzdGFudFNlcnZlciB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5fY2FjaGUgPSB7XG4gICAgICAgICAgICBiYWRnZXM6IHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5EaXN0YW50U2VydmVyID0gdGhpc1xuICAgIH1cblxuICAgIGdldCBjYWNoZSgpe1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVcbiAgICB9XG5cbiAgICBzZXQgY2FjaGUoZGF0YSl7XG4gICAgICAgIGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB0aGlzLl9jYWNoZSAhPT0gXCJvYmplY3RcIilyZXR1cm4gdGhpcy5fY2FjaGUgPSBkYXRhXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZSA9IE9iamVjdC5hc3NpZ24odGhpcy5fY2FjaGUsIGRhdGEpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1c3RvbSBiYWRnZXMgZnJvbSB0aGUgdXNlciBJRC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlciBUaGUgdXNlciBJRCBcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb25zdGFudHNbXCJiYWRnZXNcIl0+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldEJhZGdlcyh1c2VyKXtcbiAgICAgICAgaWYodGhpcy5jYWNoZS5iYWRnZXNbdXNlcl0pcmV0dXJuIHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdXG4gICAgICAgIGlmKGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl0pcmV0dXJuIGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl1cblxuICAgICAgICBsZXQgcmVzb2x2ZVxuICAgICAgICBjb25zdCBuZXdQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcykgPT4gKHJlc29sdmUgPSByZXMpKVxuICAgICAgICBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdID0gbmV3UHJvbWlzZVxuXG4gICAgICAgIGNvbnN0IGJhZGdlcyA9IFtdXG4gICAgICAgIGZvcihsZXQgYmFkZ2Ugb2YgQ29uc3RhbnRzLmJhZGdlcyl7XG4gICAgICAgICAgICBpZihiYWRnZS5kZWZhdWx0VXNlcnMuaW5jbHVkZXModXNlcikpYmFkZ2VzLnB1c2goYmFkZ2UpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmV0Y2hlZEJhZGdlcyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpZighc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNVwiXSlyZXR1cm4gcmVzb2x2ZShbXSlcbiAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2gucHVzaChbdXNlciwgcmVzb2x2ZV0pXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdXNlcnMgPSBiYWRnZXNUb0ZldGNoXG4gICAgICAgICAgICAgICAgaWYodXNlcnMubGVuZ3RoID09PSAwKXJldHVyblxuICAgICAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2ggPSBbXVxuICAgICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3QoUm91dGVzLmJhZGdlcywgXCJQT1NUXCIsIEpTT04uc3RyaW5naWZ5KHVzZXJzLm1hcChlID0+IGVbMF0pKSlcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogc2VydmVyIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0oW10pLy8gcmVzb2x2ZSBubyBiYWRnZSBmZXRjaGVkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdXNlciBvZiByZXNwb25zZUJvZHkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSB1c2Vycy5maW5kKHByb21pc2UgPT4gcHJvbWlzZVswXSA9PT0gdXNlci51c2VyX2lkKVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVsxXSh1c2VyLmJhZGdlcylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHsvLyBDb3VsZG4ndCBmZXRjaCBiYWRnZXM6IGVycm9yXG4gICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyIGluc3RhbmNlb2YgTGlnaHRjb3JkRXJyb3IpKWNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXShbXSkvLyByZXNvbHZlIG5vIGJhZGdlIGZldGNoZWRcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgMClcbiAgICAgICAgfSlcbiAgICAgICAgZm9yKGxldCBiYWRnZSBvZiBmZXRjaGVkQmFkZ2VzKXtcbiAgICAgICAgICAgIGlmKCFDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpY29udGludWUgLy8gV2UgZG8gbm90IGhhdmUgdGhlIENvbXBvbmVudCwgc2tpcCBpdC5cbiAgICAgICAgICAgIGlmKGJhZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gYmFkZ2UpKWNvbnRpbnVlIC8vIEFscmVhZHkgaW5zZXJ0ZWQuXG4gICAgICAgICAgICBiYWRnZXMucHVzaChDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWNoZSA9IHtcbiAgICAgICAgICAgIGJhZGdlczogT2JqZWN0LmFzc2lnbih0aGlzLmNhY2hlLmJhZGdlcywge1t1c2VyXTogYmFkZ2VzfSlcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXVxuICAgICAgICB9LCA2MDAwMDApO1xuXG4gICAgICAgIHJlc29sdmUoYmFkZ2VzKVxuICAgICAgICBkZWxldGUgYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXVxuICAgICAgICByZXR1cm4gYmFkZ2VzXG4gICAgfVxufVxuXG5jb25zdCBoYW5kbGVSZXF1ZXN0ID0gZnVuY3Rpb24ocm91dGUsIG1ldGhvZCwgZGF0YSl7XG4gICAgaWYoIXNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTVcIl0pe1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IExpZ2h0Y29yZEVycm9yKFwiVGhlIGN1cnJlbnQgc2V0dGluZ3MgYmxvY2tlZCB0aGUgcmVxdWVzdC5cIikpXG4gICAgfVxuICAgIHJldHVybiBub2RlRmV0Y2goYCR7Q29uc3RhbnRzLlNFUlZFUl9VUkx9L2FwaS92MSR7cm91dGV9YCwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ0xJRU5UXCI6IFwiTGlnaHRjb3JkXCIsXG4gICAgICAgICAgICBcIkF1dGhvcml6YXRpb25cIjogd2luZG93LkxpZ2h0Y29yZC5BcGkuQXV0aG9yaXphdGlvbiB8fCBcIk5vbmU6OkFub255bW91c1wiXG4gICAgICAgIH0sXG4gICAgICAgIC4uLihkYXRhID8ge1xuICAgICAgICAgICAgYm9keTogZGF0YVxuICAgICAgICB9IDoge30pXG4gICAgfSlcbn1cblxuY2xhc3MgTGlnaHRjb3JkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxuICAgICAgICB0aGlzLm5hbWUgPSBcIkxpZ2h0Y29yZEVycm9yXCJcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBDb25zdGFudHMgPSB7XG4gICAgU0VSVkVSX1VSTDogXCJodHRwczovL2xpZ2h0Y29yZC5kZXJva3UueHl6XCIsXG4gICAgYmFkZ2VzOiBbIC8vIFRPRE86IEFkZCBtb3JlIGJhZGdlcyArIHNlcnZlciBzaWRlIHN2Z1xuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcIkxpZ2h0Y29yZCBCdWcgSHVudGVyXCIsXG4gICAgICAgICAgICBpZDogXCJmMDQ2OThmNS04MTZiLTQxZTMtYmQwMS05MjI5MTE5M2Q3YTVcIixcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW1xuICAgICAgICAgICAgICAgIFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIsXG4gICAgICAgICAgICAgICAgXCI2OTYwMDM0NTY2MTEzODUzOTZcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHNjb3BlczogW10sXG4gICAgICAgICAgICBjb21wb25lbnQ6IEJ1Z0h1bnRlckJhZGdlLFxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vbGlnaHRjb3JkL2xpZ2h0Y29yZC93aWtpL2JhZGdlcyNidWdfaHVudGVyXCJcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgbmFtZTogXCJCdWZmb29uXCIsXG4gICAgICAgICAgICBpZDogXCIwNjkwNGQzMS02NWI0LTQxZWMtYTUwYy04NjU4YmJkMWFmOTZcIixcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW1xuICAgICAgICAgICAgICAgIFwiMzg5MDE2ODk1NTQzNzA1NjAyXCIsXG4gICAgICAgICAgICAgICAgXCI2NjQ2MDAxMzQ1Mjg2NjM1NjVcIixcbiAgICAgICAgICAgICAgICBcIjYyNTM1MDY1NzgyOTg5NjIyNFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcbiAgICAgICAgICAgIGNvbXBvbmVudDogQ2lyY3VzLFxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL3lvdXR1LmJlL0VKdGI2ei1kbFQ4P3Q9MTQ1XCJcbiAgICAgICAgfVxuICAgIF1cbn1cblxuZXhwb3J0IGNvbnN0IFJvdXRlcyA9IHtcbiAgICBiYWRnZXM6IGAvdXNlcnMvYmFkZ2VzYFxufSIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggWmFjaGFyeSBSYXVlblxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xuICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksXG4gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWRcbiAqIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELFxuICogSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEFcbiAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFRcbiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRlxuICogQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFXG4gKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiAqIFxuICogRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQkRQbHVnaW5MaWJyYXJ5XG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlXG4gKiBAbmFtZSBPZmZzZXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3AgLSBUb3Agb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByaWdodCAtIFJpZ2h0IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYm90dG9tIC0gQm90dG9tIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVmdCAtIExlZnQgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBPdXRlciBoZWlnaHQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gT3V0ZXIgd2lkdGggb2YgdGhlIHRhcmdldCBlbGVtZW50LlxuICovXG5cbiAvKipcbiAqIEZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSByZW1vdmVzIGFkZGVkIGxpc3RlbmVyLlxuICogQGNhbGxiYWNrIG1vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lclxuICovXG4gXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01Ub29scyB7XG5cbiAgICBzdGF0aWMgZXNjYXBlSUQoaWQpIHtcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XG4gICAgfVxuXG4gICAgLyoqXG5cdCAqIEFkZHMgYSBzdHlsZSB0byB0aGUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGlkZW50aWZpZXIgdG8gdXNlIGFzIHRoZSBlbGVtZW50IGlkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjc3MgLSBjc3MgdG8gYWRkIHRvIHRoZSBkb2N1bWVudFxuXHQgKi9cblx0c3RhdGljIGFkZFN0eWxlKGlkLCBjc3MpIHtcblx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChET01Ub29scy5jcmVhdGVFbGVtZW50KGA8c3R5bGUgaWQ9XCIke2lkfVwiPiR7Y3NzfTwvc3R5bGU+YCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBzdHlsZSBmcm9tIHRoZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gb3JpZ2luYWwgaWRlbnRpZmllciB1c2VkXG5cdCAqL1xuXHRzdGF0aWMgcmVtb3ZlU3R5bGUoaWQpIHtcblx0XHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuXHRcdGlmIChlbGVtZW50KSBlbGVtZW50LnJlbW92ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMvcmVxdWlyZXMgYSByZW1vdGUgc2NyaXB0IHRvIGJlIGxvYWRlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBpZGVudGlmaWVyIHRvIHVzZSBmb3IgdGhpcyBzY3JpcHRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIHVybCBmcm9tIHdoaWNoIHRvIGxvYWQgdGhlIHNjcmlwdFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNjcmlwdCBpcyBsb2FkZWRcblx0ICovXG5cdHN0YXRpYyBhZGRTY3JpcHQoaWQsIHVybCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0XHRcdGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdFx0XHRzY3JpcHQuaWQgPSBpZDtcblx0XHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdFx0XHRzY3JpcHQudHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI7XG5cdFx0XHRzY3JpcHQub25sb2FkID0gcmVzb2x2ZTtcblx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kKHNjcmlwdCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhIHJlbW90ZSBzY3JpcHQgZnJvbSB0aGUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIG9yaWdpbmFsIGlkZW50aWZpZXIgdXNlZFxuXHQgKi9cblx0c3RhdGljIHJlbW92ZVNjcmlwdChpZCkge1xuICAgICAgICBpZCA9IHRoaXMuZXNjYXBlSUQoaWQpO1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG5cdFx0aWYgKGVsZW1lbnQpIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIGh0dHBzOi8vamF2YXNjcmlwdC5pbmZvL2pzLWFuaW1hdGlvblxuICAgIHN0YXRpYyBhbmltYXRlKHt0aW1pbmcgPSBfID0+IF8sIHVwZGF0ZSwgZHVyYXRpb259KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIGFuaW1hdGUodGltZSkge1xuICAgICAgICAgIC8vIHRpbWVGcmFjdGlvbiBnb2VzIGZyb20gMCB0byAxXG4gICAgICAgICAgbGV0IHRpbWVGcmFjdGlvbiA9ICh0aW1lIC0gc3RhcnQpIC8gZHVyYXRpb247XG4gICAgICAgICAgaWYgKHRpbWVGcmFjdGlvbiA+IDEpIHRpbWVGcmFjdGlvbiA9IDE7XG4gICAgICBcbiAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHN0YXRlXG4gICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aW1pbmcodGltZUZyYWN0aW9uKTtcbiAgICAgIFxuICAgICAgICAgIHVwZGF0ZShwcm9ncmVzcyk7IC8vIGRyYXcgaXRcbiAgICAgIFxuICAgICAgICAgIGlmICh0aW1lRnJhY3Rpb24gPCAxKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBteSBzaGl0IHZlcnNpb24gb2Ygbm90IGhhdmluZyB0byB1c2UgYCRgIGZyb20galF1ZXJ5LiBNZWFuaW5nXG4gICAgICogdGhhdCB5b3UgY2FuIHBhc3MgYSBzZWxlY3RvciBhbmQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHJ1biB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLnF1ZXJ5fS5cbiAgICAgKiBJdCBhbHNvIG1lYW5zIHRoYXQgeW91IGNhbiBwYXNzIGEgc3RyaW5nIG9mIGh0bWwgYW5kIGl0IHdpbGwgcGVyZm9ybSBhbmQgcmV0dXJuIGBwYXJzZUhUTUxgLlxuICAgICAqIEBzZWUgbW9kdWxlOkRPTVRvb2xzLnBhcnNlSFRNTFxuICAgICAqIEBzZWUgbW9kdWxlOkRPTVRvb2xzLnF1ZXJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnkgb3IgSFRNTCB0byBwYXJzZVxuICAgICAqIEByZXR1cm5zIHsoRG9jdW1lbnRGcmFnbWVudHxOb2RlTGlzdHxIVE1MRWxlbWVudCl9IC0gRWl0aGVyIHRoZSByZXN1bHQgb2YgYHBhcnNlSFRNTGAgb3IgYHF1ZXJ5YFxuICAgICAqL1xuICAgIHN0YXRpYyBRKHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnBhcnNlSFRNTChzZWxlY3Rvcik7XG4gICAgICAgIGNvbnN0IGlzSFRNTCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCA/IEFycmF5LmZyb20oZWxlbWVudCkuc29tZShuID0+IG4ubm9kZVR5cGUgPT09IDEpIDogZWxlbWVudC5ub2RlVHlwZSA9PT0gMTtcbiAgICAgICAgaWYgKGlzSFRNTCkgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3NlbnRpYWxseSBhIHNob3J0aGFuZCBmb3IgYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgLiBJZiB0aGUgYGJhc2VFbGVtZW50YCBpcyBub3QgcHJvdmlkZWRcbiAgICAgKiBgZG9jdW1lbnRgIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeVxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gW2Jhc2VFbGVtZW50XSAtIEVsZW1lbnQgdG8gYmFzZSB0aGUgcXVlcnkgZnJvbVxuICAgICAqIEByZXR1cm5zIHsoRWxlbWVudHxudWxsKX0gLSBUaGUgZm91bmQgZWxlbWVudCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBxdWVyeShzZWxlY3RvciwgYmFzZUVsZW1lbnQgPSBkb2N1bWVudCkge1xuICAgICAgICByZXR1cm4gYmFzZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNzZW50aWFsbHkgYSBzaG9ydGhhbmQgZm9yIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsYC4gSWYgdGhlIGBiYXNlRWxlbWVudGAgaXMgbm90IHByb3ZpZGVkXG4gICAgICogYGRvY3VtZW50YCBpcyB1c2VkIGJ5IGRlZmF1bHQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnlcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtiYXNlRWxlbWVudF0gLSBFbGVtZW50IHRvIGJhc2UgdGhlIHF1ZXJ5IGZyb21cbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gQXJyYXkgb2YgYWxsIGZvdW5kIGVsZW1lbnRzXG4gICAgICovXG4gICAgc3RhdGljIHF1ZXJ5QWxsKHNlbGVjdG9yLCBiYXNlRWxlbWVudCA9IGRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiBiYXNlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBzdHJpbmcgb2YgSFRNTCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy4gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdHJ1ZSxcbiAgICAgKiB0aGUgcGFyc2VkIEhUTUwgd2lsbCBiZSByZXR1cm5lZCBhcyBhIGRvY3VtZW50IGZyYWdtZW50IHtAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudEZyYWdtZW50fS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgaWYgeW91IGhhdmUgYSBsaXN0IG9mIGVsZW1lbnRzIGF0IHRoZSB0b3AgbGV2ZWwsIHRoZXkgY2FuIHRoZW4gYmUgYXBwZW5kZWQgYWxsIGF0IG9uY2UgdG8gYW5vdGhlciBub2RlLlxuICAgICAqIFxuICAgICAqIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGZhbHNlLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUgbGlzdCBvZiBwYXJzZWRcbiAgICAgKiBub2RlcyBhbmQgdGhlcmUgd2VyZSBtdWx0aXBsZSB0b3AgbGV2ZWwgbm9kZXMsIG90aGVyd2lzZSB0aGUgc2luZ2xlIG5vZGUgaXMgcmV0dXJuZWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgLSBIVE1MIHRvIGJlIHBhcnNlZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZyYWdtZW50PWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRoZSByZXR1cm4gc2hvdWxkIGJlIHRoZSByYXcgYERvY3VtZW50RnJhZ21lbnRgXG4gICAgICogQHJldHVybnMgeyhEb2N1bWVudEZyYWdtZW50fE5vZGVMaXN0fEhUTUxFbGVtZW50KX0gLSBUaGUgcmVzdWx0IG9mIEhUTUwgcGFyc2luZ1xuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZUhUTUwoaHRtbCwgZnJhZ21lbnQgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICBpZiAoZnJhZ21lbnQpIHJldHVybiBub2RlO1xuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDEgPyBub2RlLmNoaWxkTm9kZXMgOiBub2RlLmNoaWxkTm9kZXNbMF07XG4gICAgfVxuXG4gICAgLyoqIEFsdGVybmF0ZSBuYW1lIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLnBhcnNlSFRNTH0gKi9cbiAgICBzdGF0aWMgY3JlYXRlRWxlbWVudChodG1sLCBmcmFnbWVudCA9IGZhbHNlKSB7cmV0dXJuIHRoaXMucGFyc2VIVE1MKGh0bWwsIGZyYWdtZW50KTt9XG4gICAgXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSBzdHJpbmcgb2YgaHRtbCBhbmQgZXNjYXBlcyBpdCB1c2luZyB0aGUgYnJvd2VyJ3Mgb3duIGVzY2FwaW5nIG1lY2hhbmlzbS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbCAtIGh0bWwgdG8gYmUgZXNjYXBlZFxuICAgICAqL1xuICAgIHN0YXRpYyBlc2NhcGVIVE1MKGh0bWwpIHtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICAgICAgY29uc3Qgc3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3BhbkVsZW1lbnQuYXBwZW5kKHRleHROb2RlKTtcbiAgICAgICAgdGV4dE5vZGUubm9kZVZhbHVlID0gaHRtbDtcbiAgICAgICAgcmV0dXJuIHNwYW5FbGVtZW50LmlubmVySFRNTDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdCBvZiBjbGFzc2VzIGZyb20gdGhlIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXG4gICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IGNsYXNzZXMgLSBOYW1lcyBvZiBjbGFzc2VzIHRvIGFkZFxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkQ2xhc3MoZWxlbWVudCwgLi4uY2xhc3Nlcykge1xuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykgY2xhc3Nlc1tjXSA9IGNsYXNzZXNbY10udG9TdHJpbmcoKS5zcGxpdChcIiBcIik7XG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzZXMpO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgbGlzdCBvZiBjbGFzc2VzIGZyb20gdGhlIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXG4gICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IGNsYXNzZXMgLSBOYW1lcyBvZiBjbGFzc2VzIHRvIHJlbW92ZVxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgLi4uY2xhc3Nlcykge1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIGNsYXNzZXNbY10gPSBjbGFzc2VzW2NdLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi5jbGFzc2VzKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcmVzZW50OiBUb2dnbGUgY2xhc3MgdmFsdWU7XG4gICAgICogaS5lLiwgaWYgY2xhc3MgZXhpc3RzIHRoZW4gcmVtb3ZlIGl0IGFuZCByZXR1cm4gZmFsc2UsIGlmIG5vdCwgdGhlbiBhZGQgaXQgYW5kIHJldHVybiB0cnVlLlxuICAgICAqIFdoZW4gYSBzZWNvbmQgYXJndW1lbnQgaXMgcHJlc2VudDpcbiAgICAgKiBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGV2YWx1YXRlcyB0byB0cnVlLCBhZGQgc3BlY2lmaWVkIGNsYXNzIHZhbHVlLCBhbmQgaWYgaXQgZXZhbHVhdGVzIHRvIGZhbHNlLCByZW1vdmUgaXQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NuYW1lIC0gTmFtZSBvZiBjbGFzcyB0byB0b2dnbGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmRpY2F0b3JdIC0gT3B0aW9uYWwgaW5kaWNhdG9yIGZvciBpZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIHRvZ2dsZWRcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgc3RhdGljIHRvZ2dsZUNsYXNzKGVsZW1lbnQsIGNsYXNzbmFtZSwgaW5kaWNhdG9yKSB7XG4gICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS50b1N0cmluZygpLnNwbGl0KFwiIFwiKS5maWx0ZXIoYyA9PiBjKTtcbiAgICAgICAgaWYgKHR5cGVvZihpbmRpY2F0b3IpICE9PSBcInVuZGVmaW5lZFwiKSBjbGFzc25hbWUuZm9yRWFjaChjID0+IGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjLCBpbmRpY2F0b3IpKTtcbiAgICAgICAgZWxzZSBjbGFzc25hbWUuZm9yRWFjaChjID0+IGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjKSk7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBlbGVtZW50IGhhcyBhIHNwZWNpZmljIGNsYXNzXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NuYW1lIC0gTmFtZSBvZiBjbGFzcyB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIGNsYXNzLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NuYW1lKSB7XG4gICAgICAgIHJldHVybiBjbGFzc25hbWUudG9TdHJpbmcoKS5zcGxpdChcIiBcIikuZmlsdGVyKGMgPT4gYykuZXZlcnkoYyA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgb25lIGNsYXNzIHdpdGggYW5vdGhlclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9sZE5hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIHJlcGxhY2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3TmFtZSAtIE5ldyBuYW1lIGZvciB0aGUgY2xhc3NcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgc3RhdGljIHJlcGxhY2VDbGFzcyhlbGVtZW50LCBvbGROYW1lLCBuZXdOYW1lKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlcGxhY2Uob2xkTmFtZSwgbmV3TmFtZSk7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYHRoaXNOb2RlYCB0byBgdGhhdE5vZGVgXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIE5vZGUgdG8gYmUgYXBwZW5kZWQgdG8gYW5vdGhlciBub2RlXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGF0Tm9kZSAtIE5vZGUgZm9yIGB0aGlzTm9kZWAgdG8gYmUgYXBwZW5kZWQgdG9cbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBhcHBlbmRUbyh0aGlzTm9kZSwgdGhhdE5vZGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZih0aGF0Tm9kZSkgPT0gXCJzdHJpbmdcIikgdGhhdE5vZGUgPSB0aGlzLnF1ZXJ5KHRoYXROb2RlKTtcbiAgICAgICAgaWYgKCF0aGF0Tm9kZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoYXROb2RlLmFwcGVuZCh0aGlzTm9kZSk7XG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVwZW5kcyBgdGhpc05vZGVgIHRvIGB0aGF0Tm9kZWBcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gTm9kZSB0byBiZSBwcmVwZW5kZWQgdG8gYW5vdGhlciBub2RlXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGF0Tm9kZSAtIE5vZGUgZm9yIGB0aGlzTm9kZWAgdG8gYmUgcHJlcGVuZGVkIHRvXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgcHJlcGVuZFRvKHRoaXNOb2RlLCB0aGF0Tm9kZSkge1xuICAgICAgICBpZiAodHlwZW9mKHRoYXROb2RlKSA9PSBcInN0cmluZ1wiKSB0aGF0Tm9kZSA9IHRoaXMucXVlcnkodGhhdE5vZGUpO1xuICAgICAgICBpZiAoIXRoYXROb2RlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhhdE5vZGUucHJlcGVuZCh0aGlzTm9kZSk7XG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYWZ0ZXIgYSBzcGVjaWZpYyBlbGVtZW50LCBzaW1pbGFyIHRvIGpRdWVyeSdzIGB0aGlzRWxlbWVudC5pbnNlcnRBZnRlcihvdGhlckVsZW1lbnQpYC5cbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gVGhlIG5vZGUgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXROb2RlIC0gTm9kZSB0byBpbnNlcnQgYWZ0ZXIgaW4gdGhlIHRyZWVcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBpbnNlcnRBZnRlcih0aGlzTm9kZSwgdGFyZ2V0Tm9kZSkge1xuICAgICAgICB0YXJnZXROb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXNOb2RlLCB0YXJnZXROb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBhZnRlciBhIHNwZWNpZmljIGVsZW1lbnQsIHNpbWlsYXIgdG8galF1ZXJ5J3MgYHRoaXNFbGVtZW50LmFmdGVyKG5ld0VsZW1lbnQpYC5cbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gVGhlIG5vZGUgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIHtOb2RlfSBuZXdOb2RlIC0gTm9kZSB0byBpbnNlcnQgYWZ0ZXIgaW4gdGhlIHRyZWVcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBhZnRlcih0aGlzTm9kZSwgbmV3Tm9kZSkge1xuICAgICAgICB0aGlzTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCB0aGlzTm9kZS5uZXh0U2libGluZyk7XG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBuZXh0IHNpYmxpbmcgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gT3B0aW9uYWwgc2VsZWN0b3JcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgc2libGluZyBlbGVtZW50XG4gICAgICovXG4gICAgc3RhdGljIG5leHQoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBzZWxlY3RvciA/IGVsZW1lbnQucXVlcnlTZWxlY3RvcihcIisgXCIgKyBzZWxlY3RvcikgOiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBzdWJzZXF1ZW50IHNpYmxpbmdzLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IG5leHQgc2libGluZ3Mgb2ZcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcbiAgICAgKi9cbiAgICBzdGF0aWMgbmV4dEFsbChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ+ICpcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3Vic2VxdWVudCBzaWJsaW5ncyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBmb2xsb3dpbmcgc2libGluZ3Mgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXG4gICAgICovXG4gICAgc3RhdGljIG5leHRVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICBjb25zdCBuZXh0ID0gW107IFxuICAgICAgICB3aGlsZSAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcgJiYgIWVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLm1hdGNoZXMoc2VsZWN0b3IpKSBuZXh0LnB1c2goZWxlbWVudCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gT3B0aW9uYWwgc2VsZWN0b3JcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgc2libGluZyBlbGVtZW50XG4gICAgICovXG4gICAgc3RhdGljIHByZXZpb3VzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgaWYgKHNlbGVjdG9yKSByZXR1cm4gcHJldmlvdXMgJiYgcHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikgPyBwcmV2aW91cyA6IG51bGw7XG4gICAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBwcmVjZWVkaW5nIHNpYmxpbmdzLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHByZWNlZWRpbmcgc2libGluZ3Mgb2ZcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcbiAgICAgKi9cbiAgICBzdGF0aWMgcHJldmlvdXNBbGwoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IFtdO1xuICAgICAgICB3aGlsZSAoZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSBwcmV2aW91cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xuICAgICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJlY2VlZGluZyBzaWJsaW5ncyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBwcmVjZWVkaW5nIHNpYmxpbmdzIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xuICAgICAqL1xuICAgIHN0YXRpYyBwcmV2aW91c1VudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gW107IFxuICAgICAgICB3aGlsZSAoZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmICFlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcubWF0Y2hlcyhzZWxlY3RvcikpIHByZXZpb3VzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyk7XG4gICAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHdoaWNoIGluZGV4IGluIGNoaWxkcmVuIGEgY2VydGFpbiBub2RlIGlzLiBTaW1pbGFyIHRvIGpRdWVyeSdzIGAkLmluZGV4KClgXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBub2RlIHRvIGZpbmQgaXRzIGluZGV4IGluIHBhcmVudFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEluZGV4IG9mIHRoZSBub2RlXG4gICAgICovXG4gICAgc3RhdGljIGluZGV4SW5QYXJlbnQobm9kZSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICBsZXQgbnVtID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IG5vZGUpIHJldHVybiBudW07XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ubm9kZVR5cGUgPT0gMSkgbnVtKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKiBTaG9ydGhhbmQgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMuaW5kZXhJblBhcmVudH0gKi9cbiAgICBzdGF0aWMgaW5kZXgobm9kZSkge3JldHVybiB0aGlzLmluZGV4SW5QYXJlbnQobm9kZSk7fVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50IGlmIGl0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLFxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIG51bGwuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgcGFyZW50IG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHBhcmVudFxuICAgICAqIEByZXR1cm5zIHsoRWxlbWVudHxudWxsKX0gLSBUaGUgc2libGluZyBlbGVtZW50IG9yIG51bGxcbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyZW50KGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xuICAgICAgICByZXR1cm4gIXNlbGVjdG9yIHx8IGVsZW1lbnQucGFyZW50RWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSA/IGVsZW1lbnQucGFyZW50RWxlbWVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgY2hpbGRyZW4gb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgY2hpbGRyZW4gb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgY2hpbGRyZW4gdG9cbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgY2hpbGRyZW5cbiAgICAgKi9cbiAgICBzdGF0aWMgZmluZENoaWxkKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCI6c2NvcGUgPiBcIiArIHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBjaGlsZHJlbiBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBjaGlsZHJlbiBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBjaGlsZHJlbiB0b1xuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBjaGlsZHJlblxuICAgICAqL1xuICAgIHN0YXRpYyBmaW5kQ2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IFwiICsgc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGFuY2VzdG9ycyBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBwYXJlbnRzIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBwYXJlbnRzIHRvXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHBhcmVudHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyZW50cyhlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcbiAgICAgICAgY29uc3QgcGFyZW50cyA9IFtdO1xuICAgICAgICBpZiAoc2VsZWN0b3IpIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpKSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5jbG9zZXN0KHNlbGVjdG9yKSk7XG4gICAgICAgIGVsc2Ugd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhbmNlc3RvcnMgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgYW5jZXN0b3JzIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBwYXJlbnRzXG4gICAgICovXG4gICAgc3RhdGljIHBhcmVudHNVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICBjb25zdCBwYXJlbnRzID0gW107XG4gICAgICAgIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgIWVsZW1lbnQucGFyZW50RWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBzaWJsaW5ncyBvZiB0aGUgZWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3Rvci5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgc2libGluZ3Mgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiKlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBzaWJsaW5ncyB0b1xuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xuICAgICAqL1xuICAgIHN0YXRpYyBzaWJsaW5ncyhlbGVtZW50LCBzZWxlY3RvciA9IFwiKlwiKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGUgPT4gZSAhPSBlbGVtZW50ICYmIGUubWF0Y2hlcyhzZWxlY3RvcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgZ2V0cyBjc3Mgc3R5bGVzIGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIHN0eWxlIGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgc3R5bGUuICBcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIEF0dHJpYnV0ZSB0byBnZXQgb3Igc2V0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBWYWx1ZSB0byBzZXQgZm9yIGF0dHJpYnV0ZVxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXG4gICAgICovXG4gICAgc3RhdGljIGNzcyhlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBnbG9iYWwuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVthdHRyaWJ1dGVdO1xuICAgICAgICBlbGVtZW50LnN0eWxlW2F0dHJpYnV0ZV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBnZXRzIHRoZSB3aWR0aCBmb3IgYSBzcGVjaWZpYyBlbGVtZW50LiBJZiBgdmFsdWVgIGlzIHByb3ZpZGVkXG4gICAgICogdGhlbiBpdCBzZXRzIHRoZSB3aWR0aCBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIHdpZHRoLiAgXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gV2lkdGggdG8gc2V0XG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgd2lkdGgoZWxlbWVudCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkud2lkdGgpO1xuICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgaGVpZ2h0IGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIGhlaWdodCBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIGhlaWdodC4gIFxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIEhlaWdodCB0byBzZXRcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBoZWlnaHQoZWxlbWVudCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuaGVpZ2h0KTtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaW5uZXIgdGV4dCBvZiBhbiBlbGVtZW50IGlmIGdpdmVuIGEgdmFsdWUsIG90aGVyd2lzZSByZXR1cm5zIGl0LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSB0ZXh0IG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XSAtIENvbnRlbnQgdG8gc2V0XG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBFaXRoZXIgdGhlIHN0cmluZyBzZXQgYnkgdGhpcyBjYWxsIG9yIHRoZSBjdXJyZW50IHRleHQgY29udGVudCBvZiB0aGUgbm9kZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdGV4dChlbGVtZW50LCB0ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YodGV4dCkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbm5lcldpZHRoIG9mIHRoZSBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgaW5uZXIgd2lkdGggb2ZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIGlubmVyIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIHN0YXRpYyBpbm5lcldpZHRoKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5uZXJIZWlnaHQgb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBpbm5lciBoZWlnaHQgb2ZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIGlubmVyIGhlaWdodCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW5uZXJIZWlnaHQoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgb3V0ZXJXaWR0aCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIG91dGVyIHdpZHRoIG9mXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBvdXRlciB3aWR0aCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBzdGF0aWMgb3V0ZXJXaWR0aChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG91dGVySGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgb3V0ZXIgaGVpZ2h0IG9mXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBvdXRlciBoZWlnaHQgb2YgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgc3RhdGljIG91dGVySGVpZ2h0KGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgcGFnZS5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBvZmZzZXQgb2ZcbiAgICAgKiBAcmV0dXJuIHtPZmZzZXR9IC0gVGhlIG9mZnNldCBvZiB0aGUgZWxlbWVudFxuICAgICAqL1xuICAgIHN0YXRpYyBvZmZzZXQoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGxpc3RlbmVycygpIHsgcmV0dXJuIHRoaXMuX2xpc3RlbmVycyB8fCAodGhpcy5fbGlzdGVuZXJzID0ge30pOyB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8galF1ZXJ5J3MgYG9uYCBmdW5jdGlvbiBhbmQgY2FuICpob3BlZnVsbHkqIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LlxuICAgICAqIFxuICAgICAqIFJhdGhlciB0aGFuIGF0dGVtcHQgdG8gZXhwbGFpbiwgSSdsbCBzaG93IHNvbWUgZXhhbXBsZSB1c2FnZXMuXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YC5cbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZXMgd2hlbiB0aGUgdGFyZ2V0IGlzIGEgYC5ibG9ja2AgZWxlbWVudC5cbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBcIi5ibG9ja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgLlxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAgdGhhdCBvbmx5IGZpcmVzIG9uY2UuXG4gICAgICogYGNvbnN0IGNhbmNlbCA9IERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiZmlyZWQhXCIpOyBjYW5jZWwoKTt9KTtgXG4gICAgICogXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhZGQgbGlzdGVuZXIgdG9cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gZGVsZWdhdGUgLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxuICAgICAqIEByZXR1cm5zIHttb2R1bGU6RE9NVG9vbHN+Q2FuY2VsTGlzdGVuZXJ9IC0gQSBmdW5jdGlvbiB0aGF0IHdpbGwgdW5kbyB0aGUgbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzdGF0aWMgb24oZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gY2FsbGJhY2sgOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSkgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbmV3Q2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uc3BsaWNlKHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uZmluZEluZGV4KGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50KSwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICBldmVudDogdHlwZSxcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICAgICAgICAgIGNhbmNlbDogbmV3Q2FuY2VsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXdDYW5jZWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbmFsaXR5IGZvciB0aGlzIG1ldGhvZCBtYXRjaGVzIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub259IGJ1dCBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgaXRzZWxmXG4gICAgICogYW5kIHJlbW92ZXMgdGhlIGxpc3RlbmVyIHVwb24gdGhlIGZpcnN0IGZpcmluZyBvZiB0aGUgZGVzaXJlZCBldmVudC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0b1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBkZWxlZ2F0ZSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XG4gICAgICogQHJldHVybnMge21vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lcn0gLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCB1bmRvIHRoZSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHN0YXRpYyBvbmNlKGVsZW1lbnQsIGV2ZW50LCBkZWxlZ2F0ZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcbiAgICAgICAgfSA6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkgcmV0dXJuO1xuICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0pIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnNwbGljZSh0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLmZpbmRJbmRleChsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCksIDEpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IHR5cGUsXG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgICAgICBjYW5jZWw6IG5ld0NhbmNlbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3Q2FuY2VsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWw7XG4gICAgfVxuXG4gICAgc3RhdGljIF9fb2ZmQWxsKGV2ZW50LCBlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xuICAgICAgICBsZXQgbWF0Y2hGaWx0ZXIgPSBsaXN0ZW5lciA9PiBsaXN0ZW5lci5ldmVudCA9PSB0eXBlLCBkZWZhdWx0RmlsdGVyID0gXyA9PiBfO1xuICAgICAgICBpZiAoZWxlbWVudCkgbWF0Y2hGaWx0ZXIgPSBsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCwgZGVmYXVsdEZpbHRlciA9IGwgPT4gbC5lbGVtZW50ID09IGVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gfHwgW107XG4gICAgICAgIGNvbnN0IGxpc3QgPSB0eXBlID8gbGlzdGVuZXJzLmZpbHRlcihtYXRjaEZpbHRlcikgOiBsaXN0ZW5lcnMuZmlsdGVyKGRlZmF1bHRGaWx0ZXIpO1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGxpc3QubGVuZ3RoOyBjKyspIGxpc3RbY10uY2FuY2VsKCk7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byBqUXVlcnkncyBgb2ZmYCBmdW5jdGlvbiBhbmQgY2FuICpob3BlZnVsbHkqIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LlxuICAgICAqIFxuICAgICAqIFJhdGhlciB0aGFuIGF0dGVtcHQgdG8gZXhwbGFpbiwgSSdsbCBzaG93IHNvbWUgZXhhbXBsZSB1c2FnZXMuXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyIGNhbGxlZCBgb25DbGlja2AgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAuXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIG9uQ2xpY2spO2BcbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgY2FsbGVkIGBvbkNsaWNrYCAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZWQgd2hlbiB0aGUgdGFyZ2V0IGlzIGEgYC5ibG9ja2AgZWxlbWVudC5cbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgXCIuYmxvY2tcIiwgb25DbGljayk7YFxuICAgICAqIFxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgLlxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGlja1wiLCBvbkNsaWNrKTtgXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gYGVsZW1lbnRgLlxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCIubXlQbHVnaW5cIik7YFxuICAgICAqIFxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYWxsIGNsaWNrIGxpc3RlbmVycyBpbiBuYW1lc3BhY2UgYG15UGx1Z2luYCBmcm9tICphbGwgZWxlbWVudHMqLlxuICAgICAqIGBET01Ub29scy5vZmYoXCJjbGljay5teVBsdWdpblwiKTtgXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gKmFsbCBlbGVtZW50cyouXG4gICAgICogYERPTVRvb2xzLm9mZihcIi5teVBsdWdpblwiKTtgXG4gICAgICogXG4gICAgICogQHBhcmFtIHsoRWxlbWVudHxzdHJpbmcpfSBlbGVtZW50IC0gRWxlbWVudCB0byByZW1vdmUgbGlzdGVuZXIgZnJvbVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRdIC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IFtkZWxlZ2F0ZV0gLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBvcmlnaW5hbCBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBvZmYoZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodHlwZW9mKGVsZW1lbnQpID09IFwic3RyaW5nXCIpIHJldHVybiB0aGlzLl9fb2ZmQWxsKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkgcmV0dXJuIHRoaXMuX19vZmZBbGwoZXZlbnQsIGVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGNhbGxiYWNrIDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQubWF0Y2hlcyhkZWxlZ2F0ZSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3Igd2hlbiB0aGUgbm9kZSBpcyBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50IGJvZHkuXG4gICAgICogVGhlIGxpc3RlbmVyIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB1cG9uIGZpcmluZy5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gbm9kZSB0byB3YWl0IGZvclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IGNhbGxiYWNrIC0gZnVuY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIGV2ZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBvbk1vdW50IC0gZGV0ZXJtaW5lcyBpZiBpdCBzaG91bGQgZmlyZSBvbiBNb3VudCBvciBvbiBVbm1vdW50XG4gICAgICovXG4gICAgc3RhdGljIG9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2ssIG9uTW91bnQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIudW5zdWJzY3JpYmUod3JhcHBlZENhbGxiYWNrKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuc3Vic2NyaWJlKHdyYXBwZWRDYWxsYmFjaywgbXV0YXRpb24gPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG9uTW91bnQgPyBtdXRhdGlvbi5hZGRlZE5vZGVzIDogbXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZihub2RlKSA+IC0xO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnMobm9kZSkpO1xuICAgICAgICAgICAgcmV0dXJuIGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50Q2hhbmdlfSB3aXRoIHRoaXJkIHBhcmFtZXRlciBgdHJ1ZWAgKi9cbiAgICBzdGF0aWMgb25Nb3VudChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrKTsgfVxuXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50Q2hhbmdlfSB3aXRoIHRoaXJkIHBhcmFtZXRlciBgZmFsc2VgICovXG4gICAgc3RhdGljIG9uVW5tb3VudChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrLCBmYWxzZSk7IH1cblxuICAgIC8qKiBBbGlhcyBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50fSAqL1xuICAgIHN0YXRpYyBvbkFkZGVkKG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnQobm9kZSwgY2FsbGJhY2spOyB9XG5cbiAgICAvKiogQWxpYXMgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Vbm1vdW50fSAqL1xuICAgIHN0YXRpYyBvblJlbW92ZWQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Vbm1vdW50KG5vZGUsIGNhbGxiYWNrLCBmYWxzZSk7IH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB3aGljaCBjb21iaW5lcyBtdWx0aXBsZSBlbGVtZW50cyBpbnRvIG9uZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7QXJyYXk8SFRNTEVsZW1lbnQ+fSBlbGVtZW50cyAtIGFycmF5IG9mIGVsZW1lbnRzIHRvIHB1dCBpbnRvIGEgc2luZ2xlIHBhcmVudFxuICAgICAqL1xuICAgIHN0YXRpYyB3cmFwKGVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGRvbVdyYXBwZXIgPSB0aGlzLnBhcnNlSFRNTChgPGRpdiBjbGFzcz1cImRvbS13cmFwcGVyXCI+PC9kaXY+YCk7XG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgZWxlbWVudHMubGVuZ3RoOyBlKyspIGRvbVdyYXBwZXIuYXBwZW5kQ2hpbGQoZWxlbWVudHNbZV0pO1xuICAgICAgICByZXR1cm4gZG9tV3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgbm9kZSB0byBhbiBIVE1MRWxlbWVudC4gVGhpcyBpcyBtYWlubHkgdXNlZCBieSBsaWJyYXJ5IG1vZHVsZXMuXG4gICAgICogQHBhcmFtIHsoalF1ZXJ5fEVsZW1lbnQpfSBub2RlIC0gbm9kZSB0byByZXNvbHZlXG4gICAgICovXG4gICAgc3RhdGljIHJlc29sdmVFbGVtZW50KG5vZGUpIHtcbiAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIGpRdWVyeSkgJiYgIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2YgalF1ZXJ5ID8gbm9kZVswXSA6IG5vZGU7XG4gICAgfVxufVxuXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRE9NID0gRE9NVG9vbHMiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IENvbnN0YW50cyA9IHtcbiAgICBFbW9qaVJlZ2V4OiAvPGE/XFwuKFxcdyspXFwuKFxcZCspPi9nXG59XG5cbmxldCBDdXN0b21FbW9qaU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLkN1c3RvbUVtb2ppKVswXVxubGV0IEVtb2ppTW9kdWxlQXBpID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKVswXVxubGV0IEF1dG9jb21wbGV0ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF1dG9jb21wbGV0ZVwiKVswXVxubGV0IEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucylbMF1cbmxldCBFbW9qaU1vZHVsZVF1ZXJ5ID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHMpWzBdXG5sZXQgTWVzc2FnZXMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcyAmJiBlLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcpWzBdXG5sZXQgZ3VpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylbMF1cbmxldCBlbW9qaVNlYXJjaCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQpXG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBFbW9qaU1vZHVsZSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5pbml0KCkuY2F0Y2goZXJyID0+IFV0aWxzLmVycihcIkVtb2ppTW9kdWxlXCIsIFwiQW4gZXJyb3Igb2NjdXJlZFwiLCBlcnIpKSAvLyBiZXR0ZXIgbG9nZ2luZ1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKXtcbiAgICAgICAgLyoqIEVtb2ppIEF1dG9Db21wbGV0ZSAqL1xuICAgICAgICBpZighQXV0b2NvbXBsZXRlTW9kdWxlKUF1dG9jb21wbGV0ZU1vZHVsZSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdXRvY29tcGxldGVcIilcbiAgICAgICAgaWYoIUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzKUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMpXG4gICAgICAgIGlmKCFFbW9qaU1vZHVsZVF1ZXJ5KUVtb2ppTW9kdWxlUXVlcnkgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHMpXG4gICAgICAgIGlmKCFNZXNzYWdlcylNZXNzYWdlcyA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcyAmJiBlLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcpXG4gICAgICAgIGlmKCFndWlsZE1vZHVsZSlndWlsZE1vZHVsZSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylcbiAgICAgICAgaWYoIWVtb2ppU2VhcmNoKWVtb2ppU2VhcmNoID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQpXG5cbiAgICAgICAgaWYoQXV0b2NvbXBsZXRlTW9kdWxlICYmIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzICYmIEVtb2ppTW9kdWxlUXVlcnkgJiYgTWVzc2FnZXMgJiYgZ3VpbGRNb2R1bGUgJiYgZW1vamlTZWFyY2gpe1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFBhdGNoaW5nIGdldEF1dG9jb21wbGV0ZU9wdGlvbnMgb2YgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXNgLCBBdXRvQ29tcGxldGlvblRlbXBsYXRlcylcbiAgICAgICAgICAgIGNvbnN0IGdldEF1dG9jb21wbGV0ZU9wdGlvbnMgPSBBdXRvQ29tcGxldGlvblRlbXBsYXRlcy5nZXRBdXRvY29tcGxldGVPcHRpb25zXG4gICAgICAgICAgICBBdXRvQ29tcGxldGlvblRlbXBsYXRlcy5nZXRBdXRvY29tcGxldGVPcHRpb25zID0gZnVuY3Rpb24oZSwgdCwgbiwgciwgYSl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRBdXRvY29tcGxldGVPcHRpb25zLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxuICAgICAgICAgICAgICAgIHZhbHVlLkxJR0hUQ09SRF9FTU9KSVMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMoYXJnMSwgYXJnMil7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uID0gYXJnMi5sZW5ndGggPiAxICYmIFwiLlwiID09PSBhcmcxXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFbW9qaVVzYWJsZShjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0cyh0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gRW1vamlNb2R1bGVRdWVyeS5kZWZhdWx0LnF1ZXJ5RW1vamlSZXN1bHRzKHQsIGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJSZXN1bHRzKGUsIHQsIG4sIHIsIGEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQoZSwgdCwgYS5lbW9qaXMsIG4sIHIsIE1lc3NhZ2VzLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcsIE1lc3NhZ2VzLmRlZmF1bHQuTWVzc2FnZXMuRU1PSkksIEF1dG9jb21wbGV0ZU1vZHVsZS5kZWZhdWx0LkVtb2ppLCAoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppOiBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGUuaWQgfHwgZS51bmlxdWVOYW1lIHx8IGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudGluZWw6IFwiLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlsZDogbnVsbCAhPSBlLmd1aWxkSWQgPyBndWlsZE1vZHVsZS5kZWZhdWx0LmdldEd1aWxkKGUuZ3VpbGRJZCkgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiLlwiICsgZSArIFwiLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGxhaW5UZXh0KGlkLCBndWlsZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamlzID0gZ3VpbGQuZW1vamlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZW1vamlzIHx8IG51bGwgPT0gZW1vamlzW2lkXSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamkgPSBlbW9qaXNbaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW5pbWF0ZWQgPSBlbW9qaS5hbmltYXRlZCA/IFwiYVwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW9qaS5tYW5hZ2VkIHx8IG51bGwgPT0gZW1vamkuaWQgPyBcIi5cIiArIGVtb2ppLm5hbWUgKyBcIi5cIiA6IFwiPFwiICsgaXNBbmltYXRlZCArIFwiLlwiICsgKGVtb2ppLm9yaWdpbmFsTmFtZSB8fCBlbW9qaS5uYW1lKSArIFwiLlwiICsgZW1vamkuaWQgKyBcIj5cIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBnZXRSYXdUZXh0KGlkLCBndWlsZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamlzID0gZ3VpbGQuZW1vamlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZW1vamlzIHx8IG51bGwgPT0gZW1vamlzW2lkXSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamkgPSBlbW9qaXNbaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW5pbWF0ZWQgPSBlbW9qaS5hbmltYXRlZCA/IFwiYVwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW9qaS5tYW5hZ2VkIHx8IG51bGwgPT0gZW1vamkuaWQgPyBcIi5cIiArIGVtb2ppLm5hbWUgKyBcIi5cIiA6IFwiPFwiICsgaXNBbmltYXRlZCArIFwiLlwiICsgKGVtb2ppLm9yaWdpbmFsTmFtZSB8fCBlbW9qaS5uYW1lKSArIFwiLlwiICsgZW1vamkuaWQgKyBcIj5cIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobmV3IEVycm9yKFwiQ291bGRuJ3Qgc3RhcnQgYXV0b2NvbXBsZXRpb24gb2YgTGlnaHRjb3JkJ3MgZW1vamlzLlwiKSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBFbW9qaSBkaXNwbGF5ICovXG4gICAgICAgIHdoaWxlICghQkRWMi5NZXNzYWdlQ29tcG9uZW50KSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbEVtb2ppUmVuZGVyKXsgLy8gVE9ETzogUHJvcGVyIGVtb2ppIGZvcm1hdHRpbmcgLyByZW5kZXJpbmdcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YmVmb3JlOiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMubWVzc2FnZVwiKVxuICAgICAgICAgICAgICAgIGlmKCFtZXNzYWdlKXJldHVyblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudFwiKVxuICAgICAgICAgICAgICAgIGlmKCFjb250ZW50IHx8ICFjb250ZW50Lmxlbmd0aClyZXR1cm5cbiAgICBcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7e1xuICAgICAgICAgICAgICAgICAqICByYXc6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgKiAgbmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAqICBpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAqICBhbmltYXRlZDogYm9vbGVhblxuICAgICAgICAgICAgICAgICAqIH1bXX1cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBsZXQgZW1vamlzID0gW11cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gW11cbiAgICAgICAgICAgICAgICBmb3IobGV0IG5vZGUgb2YgY29udGVudCl7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yobm9kZSkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaChub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcnNlZDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1BhcnNlZCA9IGZhbHNlXG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBDb25zdGFudHMuRW1vamlSZWdleC5leGVjKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BhcnNlZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighRW1vamlNb2R1bGVBcGkpRW1vamlNb2R1bGVBcGkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQpWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vamkgPSBFbW9qaU1vZHVsZUFwaS5kZWZhdWx0LmdldEN1c3RvbUVtb2ppQnlJZChwYXJzZWRbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZW1vamkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbW9qaS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGVtb2ppLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiBwYXJzZWRbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQ6IHBhcnNlZFswXS5zdGFydHNXaXRoKFwiPGFcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXJzZWRbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcGFyc2VkWzJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiBwYXJzZWRbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHBhcnNlZCk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmKGhhc1BhcnNlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JkcyA9IG5vZGUuc3BsaXQoXCIgXCIpLm1hcCgod29yZCwgaW5kZXgsIGFycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF3b3JkKXJldHVybiBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vamkgPSBlbW9qaXMuZmluZChlID0+IGUucmF3ID09IHdvcmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWVtb2ppKXJldHVybiB3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUN1c3RvbUVtb2ppTW9kdWxlKUN1c3RvbUVtb2ppTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuQ3VzdG9tRW1vamkpWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ3VzdG9tRW1vamlNb2R1bGUuQ3VzdG9tRW1vamksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAuJHtlbW9qaS5uYW1lfS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlJZDogZW1vamkuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1ib2FibGU6IGFyci5sZW5ndGggPT09IDEgJiYgY29udGVudC5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJldmlvdXMubGVuZ3RoID09PSAwKXJldHVybiBbY3VycmVudF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgY3VycmVudCA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcmV2aW91c1twcmV2aW91cy5sZW5ndGggLSAxXSA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1twcmV2aW91cy5sZW5ndGggLSAxXSArPSBgICR7Y3VycmVudH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5wdXNoKFwiIFwiK2N1cnJlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5wdXNoKFwiIFwiLCBjdXJyZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2goLi4ud29yZHMpXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKG5vZGUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50WzBdKXtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50LnNoaWZ0KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUobmV3Q29udGVudFswXSl7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudC5wdXNoKG5ld0NvbnRlbnQuc2hpZnQoKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9fSk7XG4gICAgICAgIH0vKlxuICAgICAgICBsZXQgdXNlck1vZHVsZVxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiRW1vamlQaWNrZXJMaXN0Um93XCIpXG4gICAgICAgIC50aGVuKEVtb2ppUGlja2VyTGlzdFJvdyA9PiB7XG4gICAgICAgICAgICBsZXQgY2xhc3NzID0gRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHRcbiAgICAgICAgICAgIEVtb2ppUGlja2VyTGlzdFJvdy5kZWZhdWx0ID0gY2xhc3MgRW1vamlQaWNrZXJMaXN0Um93IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlbmRlcigpe1xuICAgICAgICAgICAgICAgICAgICBpZighdXNlck1vZHVsZSl1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdXG4gICAgICAgICAgICAgICAgICAgIGlmKCF1c2VyTW9kdWxlKXJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNsYXNzcywgdGhpcy5wcm9wcylcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxuICAgICAgICAgICAgICAgICAgICBpZighdXNlci5oYXNQcmVtaXVtU3Vic2NyaXB0aW9uKXJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNsYXNzcywgdGhpcy5wcm9wcylcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjbGFzc3MsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppRGVzY3JpcHRvcnM6IHRoaXMucHJvcHMuZW1vamlEZXNjcmlwdG9ycy5tYXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pc0Rpc2FibGVkID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pKSAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHQuZGlzcGxheU5hbWUgPSBcIkVtb2ppUGlja2VyTGlzdFJvd1wiXG4gICAgICAgIH0pKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlKCl7XG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxFbW90ZVJlbmRlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyKCk7XG4gICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHN0YXJ0KCl7XG4gICAgICAgIFxuICAgIH1cbn1cblxuZnVuY3Rpb24gRChlLCB0LCBuLCByLCBvLCBpLCBzLCB1LCBsLCBjKSB7XG4gICAgaWYgKG51bGwgPT0gbiB8fCAwID09PSBuLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGQgPSBuLm1hcCgoZnVuY3Rpb24oZSwgbikge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh1LCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIG9uQ2xpY2s6IG8sXG4gICAgICAgICAgICBvbkhvdmVyOiByLFxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHQgPT09IG4sXG4gICAgICAgICAgICBpbmRleDogblxuICAgICAgICB9LCBsKGUsIG4pKSlcbiAgICB9KSk7XG4gICAgcmV0dXJuIFtSKGksIHMsIGUsIGMpLCBkXVxufVxuXG5mdW5jdGlvbiBSKGUsIHQsIG4sIHIpIHtcbiAgICB2YXIgYSA9IChuLmxlbmd0aCA+IDAgPyBlLmZvcm1hdCh7XG4gICAgICAgIHByZWZpeDogcihuKVxuICAgIH0pIDogdClcbiAgICBpZihBcnJheS5pc0FycmF5KGEpKXtcbiAgICAgICAgYS51bnNoaWZ0KFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwge30sIFwiW0xpZ2h0Y29yZF0gXCIpKVxuICAgIH1lbHNle1xuICAgICAgICBhID0gXCJbTElHSFRDT1JEXSBcIithXG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEF1dG9jb21wbGV0ZU1vZHVsZS5kZWZhdWx0LlRpdGxlLCB7XG4gICAgICAgIHRpdGxlOiBhXG4gICAgfSwgYSlcbn1cblIuZGlzcGxheU5hbWUgPSBcInJlbmRlckhlYWRlclwiO1xuXG5sZXQgRW1vamlGaWx0ZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQpWzBdXG5sZXQgaXNFbW9qaURpc2FibGVkID0gRW1vamlGaWx0ZXJNb2R1bGUgJiYgRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWRcbmxldCBpc1VzYWJsZSA9IGZhbHNlXG5sZXQgaGFzUGF0Y2hlZCA9IGZhbHNlXG5cbmZ1bmN0aW9uIHNldEVtb2ppVXNhYmxlKHVzYWJsZSl7XG4gICAgaXNVc2FibGUgPSB1c2FibGVcbiAgICBpZihoYXNQYXRjaGVkKXJldHVyblxuICAgIGlmKCFFbW9qaUZpbHRlck1vZHVsZSlFbW9qaUZpbHRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZClbMF1cbiAgICBpZighRW1vamlGaWx0ZXJNb2R1bGUpcmV0dXJuXG4gICAgaWYoIWlzRW1vamlEaXNhYmxlZClpc0Vtb2ppRGlzYWJsZWQgPSBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZFxuXG4gICAgaGFzUGF0Y2hlZCA9IHRydWVcbiAgICBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZCA9IGZ1bmN0aW9uKGVtb2ppKXtcbiAgICAgICAgaWYoaXNVc2FibGUpe1xuICAgICAgICAgICAgaWYoZW1vamkuc3Vycm9nYXRlcyB8fCBlbW9qaS5kaXZlcnNpdHkpcmV0dXJuIHRydWVcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0Vtb2ppRGlzYWJsZWQuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCJcbmNvbnN0IHt1c2VTdGF0ZX0gPSBCRFYyLnJlYWN0XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUZvcmNlVXBkYXRlKCl7XG4gICAgcmV0dXJuIHVzZVN0YXRlKClbMV07XG59IiwiaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiXG5pbXBvcnQgKiBhcyBlbGVjdHJvbiBmcm9tIFwiZWxlY3Ryb25cIlxuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIlxuaW1wb3J0IHRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiXG5pbXBvcnQgeyBiYXNlbmFtZSwgam9pbiB9IGZyb20gXCJwYXRoXCJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiXG5pbXBvcnQgeyBhZGRvbkNhY2hlIH0gZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIlxuXG5jb25zdCBjYWNoZSA9IHt9XG5jb25zdCBjYWNoZTIgPSB7fVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgUGx1Z2luQ2VydGlmaWVyIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuUGx1Z2luQ2VydGlmaWVyID0gdGhpc1xuICAgIH1cblxuICAgIHBhdGNoKGF0dGFjaG1lbnQsIGlkKXtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50LCBpZClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzdGFydCgpe1xuXG4gICAgfVxuXG4gICAgaXNUcnVzdGVkKGhhc2gpe1xuICAgICAgICByZXR1cm4gY2FjaGVbaGFzaF0gJiYgIWNhY2hlW2hhc2hdLnN1c3BlY3RcbiAgICB9XG59XG5cbmNvbnN0IHRlc3RzID0gW1xuICAgIFsvdG9rZW4vZ2ksIDBdLFxuICAgIFsvZW1haWwvZ2ksIDBdLFxuICAgIFsvbWZhL2dpLCAwXSxcbiAgICBbLzJmYS9naSwgMF0sXG4gICAgWy9waG9uZS9naSwgMF0sXG4gICAgWy9jaGlsZF9wcm9jZXNzL2dpLCAwXSxcbiAgICBbL2xvY2FsU3RvcmFnZS9naSwgMF0sXG4gICAgWy9nZXRHbG9iYWwvZ2ksIDBdLFxuICAgIFsvQnJvd3NlcldpbmRvdy9naSwgMF0sXG4gICAgWy9cXC5leGUvZ2ksIDBdLFxuICAgIFsvZXZhbC9naSwgMF0sXG4gICAgWy9XZWJBc3NlbWJseS9naSwgMF0sXG4gICAgWy9YTUxIdHRwUmVxdWVzdChcXC58XFxbW1wiJ2BdKXByb3RvdHlwZS9naSwgMF0sXG4gICAgWy93aW5kb3dcXC5mZXRjaCggKyk/PS9naSwgMF0sXG4gICAgLyoqIE9iZnVzY2F0aW9uIC8gaGlkZGVuIC8gd29ya2Fyb3VuZHMgKi9cbiAgICBbLyhbXCInYF1cXCspW1wiJ2BdXFx3W1wiJ2BdL2dpLCAxXSxcbiAgICBbL1tcIidgXVxcd1tcIidgXShcXCtbXCInYF0pL2dpLCAxXSxcbiAgICBbL1xcJHtbXCInYF1cXHcrW1wiJ2BdfS9naSwgMV0sXG4gICAgLyoqIGhleGFkZWNpbWFsICovXG4gICAgWy9fMHhcXHd7NH1cXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csIDFdLFxuICAgIFsvXzB4XFx3ezR9XFwoJzB4W1xcZGFiY2RlZl0rJyggKyk/LCggKyk/J1teJ117NH0nXFwpL2csIDFdLCAvLyBfMHg4ZGI3KCcweDAnLCAneDFdZicpXG4gICAgLyoqIG1hbmdsZWQgKi9cbiAgICBbL1xcdytcXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csIDFdLCAvLyBiKCcweDAnKVxuICAgIFsvXFx3K1xcKCcweFtcXGRhYmNkZWZdKycoICspPywoICspPydbXiddezR9J1xcKS9nLCAxXSwgLy8gYignMHgwJywgJ3gxXWYnKVxuICAgIC8qKiBzdHJpbmcgYXJyYXkgYXQgc3RhcnQgKi9cbiAgICBbL152YXIgW1xcd1xcZF8kXSs9XFxbXCIvZ2ksIDFdXG5dXG5cbmNvbnN0IHRocmVhdHMgPSBbXG4gICAgXCJBY2NvdW50IFN0ZWFsZXIvVmlydXNcIixcbiAgICBcIk9iZnVzY2F0aW9uL0hpZGRlbiBjb2RlXCJcbl1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2ssIGZpbGVuYW1lKXtcbiAgICBkYXRhID0gZGF0YS50b1N0cmluZyhcInV0ZjhcIilcbiAgICBsZXQgaXNIYXJtZnVsID0gZmFsc2VcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGNvbnN0IG5vX2NvbW1lbnRzID0gZGF0YS5yZXBsYWNlKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfChbXlxcXFw6XXxeKVxcL1xcLy4qJC9nbSwgXCJcIikudHJpbSgpLy8gcmVtb3ZpbmcgYWxsIGNvbW1lbnRzIGZyb20gcGx1Z2lucyAocmVtb3ZlIG1ldGEgYW5kIG90aGVyLilcblxuICAgIGZvcihjb25zdCBbdGVzdCwgdHlwZV0gb2YgdGVzdHMpe1xuICAgICAgICBjb25zdCBzY3JwdCA9IHR5cGUgPT09IDEgPyBub19jb21tZW50cyA6IGRhdGFcbiAgICAgICAgaWYodGVzdC5leGVjKHNjcnB0KSl7XG4gICAgICAgICAgICBpc0hhcm1mdWwgPSB0aHJlYXRzW3R5cGVdXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYoIWlzSGFybWZ1bClyZXR1cm4gcmVtb3ZlQ2FsbGJhY2soaGFzaClcbiAgICBjYWNoZVtoYXNoXSA9IHtcbiAgICAgICAgc3VzcGVjdDogdHJ1ZSxcbiAgICAgICAgbmFtZTogaGFzaFRvVXJsW2hhc2hdLnNwbGl0KFwiL1wiKS5wb3AoKSxcbiAgICAgICAgdHlwZTogaGFzaFRvVXJsW2hhc2hdLmVuZHNXaXRoKFwiLmpzXCIpID8gXCJQbHVnaW5cIiA6IFwiVGhlbWVcIixcbiAgICAgICAgaGFybTogaXNIYXJtZnVsLFxuICAgICAgICBoYXNoOiBoYXNoLFxuICAgICAgICBmaWxlbmFtZVxuICAgIH1cbiAgICBcbiAgICBjb25zb2xlLmxvZyhgRm91bmQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzICR7Y2FjaGVbaGFzaF0udHlwZS50b0xvd2VyQ2FzZSgpfTogJHtjYWNoZVtoYXNoXS5uYW1lfWApXG5cbiAgICByZXN1bHRDYWxsYmFjayhjYWNoZVtoYXNoXSlcbn1cblxuY29uc3QgaGFzaFRvVXJsID0ge31cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSGFzaChoYXNoLCBkYXRhLCBmaWxlbmFtZSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKXtcbiAgICBjb25zb2xlLmxvZyhgRmlsZTogJHtmaWxlbmFtZX0gaGFzaDogJHtoYXNofWApXG4gICAgaWYoIWNhY2hlW2hhc2hdKXtcbiAgICAgICAgbm9kZUZldGNoKFwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL0xpZ2h0Y29yZC9maWxlaGFzaGVzQG1hc3Rlci9oYXNoZXMvXCIraGFzaCwgeyAvLyBVc2luZyBub2RlLWZldGNoIHRvIGJ5cGFzcyBjb3JzXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnQgLy8gaGF2ZSB0byBzZXQgdXNlci1hZ2VudFxuICAgICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGFzeW5jIHJlcyA9PiB7XG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApe1xuICAgICAgICAgICAgICAgIGlmKGZpbGVuYW1lLmVuZHNXaXRoKFwiLnRoZW1lLmNzc1wiKSlyZXR1cm4gcmVtb3ZlQ2FsbGJhY2soaGFzaClcbiAgICAgICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2ssIGZpbGVuYW1lKVxuICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFjaygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKVxuICAgICAgICAgICAgcmVzdWx0Lmhhc2ggPSBoYXNoXG4gICAgICAgICAgICByZXN1bHQuZmlsZW5hbWUgPSBmaWxlbmFtZVxuXG4gICAgICAgICAgICBjYWNoZVtoYXNoXSA9IHJlc3VsdFxuXG4gICAgICAgICAgICByZXN1bHRDYWxsYmFjayhyZXN1bHQpXG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCByZWFkIGZyb20gZ2l0aHViLiAke2Vycn1gKVxuICAgICAgICAgICAgaWYoZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiByZW1vdmVDYWxsYmFjayhoYXNoKVxuICAgICAgICAgICAgY2hlY2tWaXJ1c2VzKGhhc2gsIGRhdGEsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjaywgZmlsZW5hbWUpXG4gICAgICAgIH0pXG4gICAgfWVsc2V7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhY2hlW2hhc2hdXG5cbiAgICAgICAgcmVzdWx0Q2FsbGJhY2socmVzdWx0KVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NGaWxlKF9fcGF0aCwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrID0gKGhhc2gpID0+IHt9LCBpc0Zyb21Mb2FkZXIgPSBmYWxzZSl7ICAgIFxuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIGxldCBkYXRhID0gQnVmZmVyLmFsbG9jKDApXG5cbiAgICBjcmVhdGVSZWFkU3RyZWFtKF9fcGF0aCkub24oXCJkYXRhXCIsIGNodW5rID0+IHtcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIGNodW5rXSlcbiAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspXG4gICAgfSkub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICBjb25zdCBoYXNoUmVzdWx0ID0gaGFzaC5kaWdlc3QoXCJoZXhcIilcblxuICAgICAgICBoYXNoVG9VcmxbaGFzaFJlc3VsdF0gPSBfX3BhdGhcblxuICAgICAgICBpZihpc0Zyb21Mb2FkZXIgJiYgYWRkb25DYWNoZVtoYXNoUmVzdWx0XSl7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdXG4gICAgICAgICAgICBpZih2YWx1ZS50aW1lc3RhbXAgPCAoRGF0ZS5ub3coKSAtIDYuMDQ4ZSs4KSl7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVbaGFzaFJlc3VsdF1cbiAgICAgICAgICAgICAgICBjb250ZW50TWFuYWdlci5zYXZlQWRkb25DYWNoZSgpXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayh2YWx1ZS5yZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGVja0hhc2goaGFzaFJlc3VsdCwgZGF0YSwgYmFzZW5hbWUoX19wYXRoKSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50LCBpZCl7XG4gICAgaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlyZXR1cm5cbiAgICBpZighYXR0YWNobWVudC51cmwuc3RhcnRzV2l0aChcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXG4gICAgaWYoIWF0dGFjaG1lbnQuZmlsZW5hbWUuZW5kc1dpdGgoXCIucGx1Z2luLmpzXCIpICYmICFhdHRhY2htZW50LmZpbGVuYW1lLmVuZHNXaXRoKFwiLnRoZW1lLmNzc1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXG5cbiAgICBub2RlRmV0Y2goYXR0YWNobWVudC51cmwsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnRcbiAgICAgICAgfVxuICAgIH0pLnRoZW4ocmVzID0+IHtcbiAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIkZpbGUgZG9lc24ndCBleGlzdC5cIilcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAgIGxldCBkYXRhID0gQnVmZmVyLmFsbG9jKDApXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZGF0YVwiLCBjaHVuayA9PiB7XG4gICAgICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgY2h1bmtdKVxuICAgICAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspXG4gICAgICAgIH0pXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhc2hSZXN1bHQgPSBoYXNoLmRpZ2VzdChcImhleFwiKVxuXG4gICAgICAgICAgICBjYWNoZTJbYXR0YWNobWVudC51cmxdID0gaGFzaFJlc3VsdFxuICAgICAgICAgICAgaGFzaFRvVXJsW2hhc2hSZXN1bHRdID0gYXR0YWNobWVudC51cmxcblxuICAgICAgICAgICAgY2hlY2tIYXNoKGhhc2hSZXN1bHQsIGRhdGEsIGF0dGFjaG1lbnQuZmlsZW5hbWUsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZW5kZXJUb0VsZW1lbnRzKGlkLCByZXN1bHQsIGF0dGFjaG1lbnQuZmlsZW5hbWUpXG4gICAgICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgICAgICBpZihlbGVtKWVsZW0ucmVtb3ZlKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfSkuY2F0Y2goKCk9Pnt9KVxufVxuXG5sZXQgZmxvd2VyU3Rhck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsb3dlclN0YXJDb250YWluZXIpWzBdXG5sZXQgY2hpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGlsZENvbnRhaW5lcilbMF1cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnRbXX0gZWxlbWVudHMgXG4gKiBAcGFyYW0ge3t0eXBlOiBcIlRoZW1lXCJ8XCJQbHVnaW5cIiwgbmFtZTogc3RyaW5nLCBvZmZpY2lhbD86IGJvb2xlYW59fHtzdXNwZWN0OnRydWUsIHR5cGU6IFwiVGhlbWVcInxcIlBsdWdpblwiLCBuYW1lOiBzdHJpbmcsIGhhcm06IHN0cmluZ319IHJlc3VsdFxuICovXG5mdW5jdGlvbiByZW5kZXJUb0VsZW1lbnRzKGlkLCByZXN1bHQsIGZpbGVuYW1lKXtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuIC8vIGFscmVhZHkgY2VydGlmaWVkL2RpdiBkb2VzIG5vdCBleGlzdCBhbnltb3JlLlxuXG4gICAgaWYoIWZsb3dlclN0YXJNb2R1bGUpZmxvd2VyU3Rhck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsb3dlclN0YXJDb250YWluZXIpWzBdXG4gICAgaWYoIWNoaWxkTW9kdWxlKWNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXG4gICAgXG4gICAgaWYocmVzdWx0LnN1c3BlY3Qpe1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwicmdiKDI0MCwgNzEsIDcxKVwiXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFxuICAgICAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSBcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGV0IG5leHROb2RlID0gKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pe1xuICAgICAgICAgICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSBcIkFcIil7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgP1wiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJUaGUgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiAqKlwiK2ZpbGVuYW1lK1wiKiogbWlnaHQgYmUgZGFuZ2Vyb3VzICoqKFwiK3Jlc3VsdC5oYXJtK1wiKSoqLiBcXG5cXG4qKldlIGRvbid0IHJlY29tbWFuZCB0byBkb3dubG9hZCBpdCoqLiBIb3dldmVyLCB5b3UgY2FuIHN0aWxsIGRvIGl0IGJlbG93LlwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRG93bmxvYWQgQW55d2F5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkRvbid0ICFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZWN0cm9uLnJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoY2hpbGQuaHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKFtcImRpdlwiXS5pbmNsdWRlcyhjaGlsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHROb2RlKGNoaWxkKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE5vZGUoZGl2LnBhcmVudE5vZGUpXG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgfVxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiBpcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMuXCJ9LCBcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifX0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IEJETW9kdWxlcy5nZXQoZSA9PiBlLnN2ZylbMF0uc3ZnLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDQwIDMyXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6XCIwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OlwiMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6XCIzMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OlwiMzJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s6XCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtMzIpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsOlwiI2YwNDc0N1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzazpcInVybCgjc3ZnLW1hc2stc3RhdHVzLWRuZClcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTpCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXS5wb2ludGVyRXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApLCBkaXYpXG4gICAgfWVsc2UgaWYoIXJlc3VsdC5vZmZpY2lhbCl7XG4gICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjNDA4N2VkXCJcbiAgICAgICAgbGV0IHNwYW4gPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtzdHlsZToge2Rpc3BsYXk6IFwiaW5oZXJpdFwifX0sIFtcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIGlzIGNlcnRpZmllZCBieSBMaWdodGNvcmQuXCJ9LCBcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIiwgZmxvYXQ6IFwibGVmdFwifX0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjNGY1NDVjXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjaGlsZE1vZHVsZS5jaGlsZENvbnRhaW5lcn0sIFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjZmZmZmZmXCIsZDpcIk03LjQsMTEuMTcsNCw4LjYyLDUsNy4yNmwyLDEuNTNMMTAuNjQsNGwxLjM2LDFaXCJ9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IFwiSW5zdGFsbCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgb24gTGlnaHRjb3JkLlwifSwgXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCJ9LCBvbkNsaWNrKCl7XG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiA/XCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJMaWdodGNvcmQgd2lsbCBhdXRvbWF0aWNhbGx5IGluc3RhbGwgYW5kIGxhdW5jaCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIuIFlvdSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGRvLlwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBhbmQgSW5zdGFsbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiSSd2ZSBjaGFuZ2VkIG15IG1pbmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYW5nZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBnZXRLZXllZEFycmF5KGNhY2hlMikuZmluZChlID0+IGVbMV0gPT09IHJlc3VsdC5oYXNoKVswXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsaW5rKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlRmV0Y2gobGluaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJTdGF0dXMgd2FzIG5vdCAyMDBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgcmVzLmJ1ZmZlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zdGFsbFBhdGggPSBqb2luKHJlc3VsdC50eXBlID09PSBcIlBsdWdpblwiID8gY29udGVudE1hbmFnZXIuX3BsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci5fdGhlbWVzRm9sZGVyLCByZXN1bHQuZmlsZW5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpbnN0YWxsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZVN5bmMoaW5zdGFsbFBhdGgsIGNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QocmVzdWx0LnR5cGUrXCIgc3VjY2VzZnVsbHkgaW5zdGFsbGVkLlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGVyci5tZXNzYWdlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDI0IDI0XCIsc3R5bGU6e1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwicmdiKDY3LCAxODEsIDEyOSlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz1cImZpbGxcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0xOSA5aC00VjNIOXY2SDVsNyA3IDctN3pNNSAxOHYyaDE0di0ySDV6XCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICBdKVxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihzcGFuLCBkaXYpXG4gICAgfWVsc2V7XG4gICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjNDA4N2VkXCJcbiAgICAgICAgbGV0IHNwYW4gPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtzdHlsZToge2Rpc3BsYXk6IFwiaW5oZXJpdFwifX0sIFtcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIHdhcyBtYWRlIGJ5IHRoZSBkZXZlbG9wZXJzIG9mIExpZ2h0Y29yZC5cIiwgc3R5bGU6XCJicmFuZFwifSwgXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCIsIGZsb2F0OiBcImxlZnRcIn19LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIixzdHJva2U6XCIjMzYzOTNmXCIsc3R5bGU6e2NvbG9yOlwiIzQwODdlZFwifX0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiY3VycmVudENvbG9yXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjaGlsZE1vZHVsZS5jaGlsZENvbnRhaW5lcn0sIFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjZmZmZmZmXCIsZDpcIk0xMC43LDUuMjhhMi45LDIuOSwwLDAsMC0yLjExLjg2LjExLjExLDAsMCwwLDAsLjE2bDEuMDUuOTRhLjExLjExLDAsMCwwLC4xNSwwLDEuMjcsMS4yNywwLDAsMSwuOS0uMzNjLjY1LDAsLjY1LjczLjY1LjczYS42NC42NCwwLDAsMS0uNjUuNjUsMS43MywxLjczLDAsMCwxLTEuMTgtLjU0Yy0uMzEtLjI2LS4zNi0uMzItLjczLS42NlM3LjA2LDUuMjgsNS42NSw1LjI4QTIuMjYsMi4yNiwwLDAsMCwzLjM3LDcuNTYsMi41OSwyLjU5LDAsMCwwLDMuODIsOWEyLjE4LDIuMTgsMCwwLDAsMS44My44OSwyLjk0LDIuOTQsMCwwLDAsMi4xLS44MS4xMS4xMSwwLDAsMCwwLS4xNkw2Ljc0LDhBLjExLjExLDAsMCwwLDYuNiw4YTEuNTgsMS41OCwwLDAsMS0uOTQuMjloMEEuNzEuNzEsMCwwLDEsNSw3LjU2SDVhLjYzLjYzLDAsMCwxLC42NS0uNjRjLjcxLDAsMS40Mi43NSwxLjk0LDEuMjcuNzUuNzYsMS42NiwxLjc5LDMuMTEsMS43NEEyLjI4LDIuMjgsMCwwLDAsMTMsNy42NGEyLjU5LDIuNTksMCwwLDAtLjQ1LTEuNDdBMi4xNCwyLjE0LDAsMCwwLDEwLjcsNS4yOFpcIn0pXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogXCJJbnN0YWxsIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiBvbiBMaWdodGNvcmQuXCJ9LCBcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIn0sIG9uQ2xpY2soKXtcbiAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiID9cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkxpZ2h0Y29yZCB3aWxsIGF1dG9tYXRpY2FsbHkgZG93bmxvYWQgYW5kIGxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiLiBZb3UgbXVzdCBlbmFibGUgaXQgaW4gdGhlIHNldHRpbmdzLlwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBhbmQgSW5zdGFsbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiSSd2ZSBjaGFuZ2VkIG15IG1pbmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYW5nZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBnZXRLZXllZEFycmF5KGNhY2hlMikuZmluZChlID0+IGVbMV0gPT09IHJlc3VsdC5oYXNoKVswXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZldGNoKGxpbmspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgbmV3IEVycm9yKFwiU3RhdHVzIHdhcyBub3QgMjAwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGF3YWl0IHJlcy5idWZmZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluc3RhbGxQYXRoID0gam9pbihyZXN1bHQudHlwZSA9PT0gXCJQbHVnaW5cIiA/IGNvbnRlbnRNYW5hZ2VyLl9wbHVnaW5zRm9sZGVyIDogY29udGVudE1hbmFnZXIuX3RoZW1lc0ZvbGRlciwgcmVzdWx0LmZpbGVuYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGluc3RhbGxQYXRoLCBjb250ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KHJlc3VsdC50eXBlK1wiIHN1Y2Nlc2Z1bGx5IGluc3RhbGxlZC5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChlcnIubWVzc2FnZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAyNCAyNFwiLHN0eWxlOntcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcInJnYig2NywgMTgxLCAxMjkpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJmaWxsXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1elwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgXSlcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc3BhbiwgZGl2KVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0S2V5ZWRBcnJheShvYmope1xuICAgIGxldCBhcnIgPSBbXVxuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrID0+IHtcbiAgICAgICAgYXJyLnB1c2goW2ssIG9ialtrXV0pXG4gICAgfSlcbiAgICByZXR1cm4gYXJyXG59XG5cbmxldCBrZXkgPSBudWxsXG5sZXQgc2F2ZSA9IG51bGxcblxud2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQobT0+bS5PYmplY3RTdG9yYWdlKVxuLnRoZW4obG9jYWxTdG9yYWdlTW9kdWxlID0+IHtcbiAgICBsZXQgbG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlTW9kdWxlLmltcGxcbiAgICBzYXZlID0gZnVuY3Rpb24oKXtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldChcIlBsdWdpbkNlcnRpZmllcktleUVuY3J5cHRpb25fX1wiLCBidG9hKEpTT04uc3RyaW5naWZ5KGtleSkpKVxuICAgIH1cbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHNhdmUoKVxuICAgIH0sIDEwMDAwMCk7XG4gICAgdHJ5e1xuICAgICAgICBsZXQgdmFsID0gc2FmZUpTT05QYXJzZShhdG9iKGxvY2FsU3RvcmFnZS5nZXQoXCJQbHVnaW5DZXJ0aWZpZXJLZXlFbmNyeXB0aW9uX19cIikpKVxuICAgICAgICBpZih2YWwgaW5zdGFuY2VvZiBFcnJvciB8fCAhQXJyYXkuaXNBcnJheSh2YWwpIHx8IHZhbC5sZW5ndGggIT09IDIgfHwgdmFsLmZpbmQoZSA9PiB0eXBlb2YgZSAhPT0gXCJzdHJpbmdcIikgfHwgQnVmZmVyLmZyb20odmFsWzBdLCBcImJhc2U2NFwiKS5sZW5ndGggIT09IDE2IHx8IEJ1ZmZlci5mcm9tKHZhbFsxXSwgXCJiYXNlNjRcIikubGVuZ3RoICE9PSAzMil7XG4gICAgICAgICAgICBnZW5lcmF0ZUtleSgpXG4gICAgICAgICAgICBzYXZlKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGtleSA9IHZhbFxuICAgIH1jYXRjaChlKXtcbiAgICAgICAgZ2VuZXJhdGVLZXkoKVxuICAgICAgICBzYXZlKClcbiAgICB9XG59KVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUtleSgpe1xuICAgIGtleSA9IFtjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLCBjcnlwdG8ucmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpXVxufVxuXG5mdW5jdGlvbiBzYWZlSlNPTlBhcnNlKGpzb24pe1xuICAgIHRyeXtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbilcbiAgICB9Y2F0Y2goZSl7XG4gICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgRXJyb3IgPyBuZXcgRXJyb3IoZSkgOiBlXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjcnlwdFNldHRpbmdzQ2FjaGUoZGF0YSl7XG4gICAgdHJ5e1xuICAgICAgICBsZXQgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdihcImFlcy0yNTYtY2JjXCIsIEJ1ZmZlci5mcm9tKGtleVsxXSwgXCJiYXNlNjRcIiksIEJ1ZmZlci5mcm9tKGtleVswXSwgXCJiYXNlNjRcIikpXG4gICAgICAgIGxldCBkZWNyeXB0ZWQgPSBkZWNpcGhlci51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSwgXCJiYXNlNjRcIikpO1xuICAgICAgICBkZWNyeXB0ZWQgPSBCdWZmZXIuY29uY2F0KFtkZWNyeXB0ZWQsIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgICAgICAgcmV0dXJuIGRlY3J5cHRlZC50b1N0cmluZyhcInV0ZjhcIilcbiAgICB9Y2F0Y2goZSl7XG4gICAgICAgIHJldHVybiBcInt9XCJcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jcnlwdFNldHRpbmdzQ2FjaGUoZGF0YSl7XG4gICAgbGV0IGFyZ3MgPSBbQnVmZmVyLmZyb20oa2V5WzFdLCBcImJhc2U2NFwiKSwgQnVmZmVyLmZyb20oa2V5WzBdLCBcImJhc2U2NFwiKV1cbiAgICBcbiAgICBsZXQgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWNiYycsIC4uLmFyZ3MpO1xuICAgIGxldCBlbmNyeXB0ZWQgPSBjaXBoZXIudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEsIFwidXRmOFwiKSk7XG4gICAgZW5jcnlwdGVkID0gQnVmZmVyLmNvbmNhdChbZW5jcnlwdGVkLCBjaXBoZXIuZmluYWwoKV0pO1xuICAgIHJldHVybiBlbmNyeXB0ZWQudG9TdHJpbmcoXCJiYXNlNjRcIilcbn0iLCJpbXBvcnQge2JkcGx1Z2luRXJyb3JzLCBwbHVnaW5Db29raWUsIHNldHRpbmdzQ29va2llLCBiZHBsdWdpbnN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL2JkRXZlbnRzXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcblxuY2xhc3MgUGx1Z2luTW9kdWxlIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuUGx1Z2luTW9kdWxlID0gdGhpc1xuICAgIH1cbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyO31cbn1cblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2lucyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmxvYWRQbHVnaW5EYXRhKCk7XG4gICAgYmRwbHVnaW5FcnJvcnMuc3BsaWNlKDAsIDAsIC4uLihhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkUGx1Z2lucygpKSk7XG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBwbHVnaW4sIG5hbWU7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XG4gICAgICAgICAgICBuYW1lID0gcGx1Z2luLmdldE5hbWUoKTtcbiAgICAgICAgICAgIGlmIChwbHVnaW4ubG9hZCAmJiB0eXBlb2YocGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgcGx1Z2luLmxvYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgbmFtZSArIFwiIGNvdWxkIG5vdCBiZSBsb2FkZWQuXCIsIGVycik7XG4gICAgICAgICAgICBiZHBsdWdpbkVycm9ycy5wdXNoKHtuYW1lOiBuYW1lLCBmaWxlOiBiZHBsdWdpbnNbcGx1Z2luc1tpXV0uZmlsZW5hbWUsIG1lc3NhZ2U6IFwibG9hZCgpIGNvdWxkIG5vdCBiZSBmaXJlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFja319KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbbmFtZV0pIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwbHVnaW5Db29raWVbbmFtZV0pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLnN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2luLmdldE5hbWUoKX0gdiR7cGx1Z2luLmdldFZlcnNpb24oKX0gaGFzIHN0YXJ0ZWQuYCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIG5hbWUgKyBcIiBjb3VsZCBub3QgYmUgc3RhcnRlZC5cIiwgZXJyKTtcbiAgICAgICAgICAgICAgICBiZHBsdWdpbkVycm9ycy5wdXNoKHtuYW1lOiBuYW1lLCBmaWxlOiBiZHBsdWdpbnNbcGx1Z2luc1tpXV0uZmlsZW5hbWUsIG1lc3NhZ2U6IFwic3RhcnQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMCkpXG4gICAgfVxuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcblxuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkub24oXCJkaWQtbmF2aWdhdGUtaW4tcGFnZVwiLCB0aGlzLmNoYW5uZWxTd2l0Y2guYmluZCh0aGlzKSk7XG4gICAgLy8gaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnN0YXJ0UGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICAgIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5zdGFydCgpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdGFydGVkLmApO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gY291bGQgbm90IGJlIHN0YXJ0ZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgcGx1Z2luICsgXCIgY291bGQgbm90IGJlIHN0YXJ0ZWQuXCIsIGVycik7XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zdG9wUGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICAgIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5zdG9wKCk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gaGFzIHN0b3BwZWQuYCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBjb3VsZCBub3QgYmUgc3RvcHBlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKSArIFwiIGNvdWxkIG5vdCBiZSBzdG9wcGVkLlwiLCBlcnIpO1xuICAgIH1cbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZW5hYmxlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHJldHVybjtcbiAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IHRydWU7XG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xuICAgIHRoaXMuc3RhcnRQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHJldHVybiB0aGlzLmVuYWJsZVBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmRpc2FibGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbl0pIHJldHVybjtcbiAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IGZhbHNlO1xuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICB0aGlzLnN0b3BQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudG9nZ2xlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbikge1xuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbik7XG4gICAgZWxzZSB0aGlzLmVuYWJsZVBsdWdpbihwbHVnaW4pO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZVBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW4gPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZSkge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZENvbnRlbnQoZmlsZW5hbWUsIFwicGx1Z2luXCIpO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLmAsIGVycm9yKTtcbiAgICB9XG4gICAgY29uc3QgcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiAoY29uc29sZS5sb2cocC5maWxlbmFtZSwgZmlsZW5hbWUpKSB8fCBwLmZpbGVuYW1lID09IGZpbGVuYW1lKS5wbHVnaW47XG4gICAgdHJ5IHsgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO31cbiAgICBjYXRjaCAoZXJyKSB7aWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycl19KTt9XG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2luLmdldE5hbWUoKX0gdiR7cGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIGxvYWRlZC5gKTtcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLWxvYWRlZFwiLCBwbHVnaW4uZ2V0TmFtZSgpKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudW5sb2FkUGx1Z2luID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XG4gICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW4ucGx1Z2luLmdldE5hbWUoKTtcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHRoaXMuZGlzYWJsZVBsdWdpbihwbHVnaW4sIHRydWUpO1xuICAgIGNvbnN0IGVycm9yID0gQ29udGVudE1hbmFnZXIudW5sb2FkQ29udGVudChiZHBsdWdpbnNbcGx1Z2luXS5maWxlbmFtZSwgXCJwbHVnaW5cIik7XG4gICAgZGVsZXRlIGJkcGx1Z2luc1twbHVnaW5dO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIGVycm9yKTtcbiAgICB9XG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSB3YXMgdW5sb2FkZWQuYCk7XG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSB3YXMgdW5sb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tdW5sb2FkZWRcIiwgcGx1Z2luKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XG4gICAgdGhpcy51bmxvYWRQbHVnaW4oYmRwbHVnaW4uZmlsZW5hbWUpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XG4gICAgcmVxdWlyZShcImZzXCIpLnVubGlua1N5bmMoZnVsbFBhdGgpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yZWxvYWRQbHVnaW4gPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmRwbHVnaW4pIHJldHVybiB0aGlzLmxvYWRQbHVnaW4oZmlsZW5hbWVPck5hbWUpO1xuICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luLnBsdWdpbi5nZXROYW1lKCk7XG4gICAgY29uc3QgZW5hYmxlZCA9IHBsdWdpbkNvb2tpZVtwbHVnaW5dO1xuICAgIGlmIChlbmFibGVkKSB0aGlzLnN0b3BQbHVnaW4ocGx1Z2luLCB0cnVlKTtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLnJlbG9hZENvbnRlbnQoYmRwbHVnaW5zW3BsdWdpbl0uZmlsZW5hbWUsIFwicGx1Z2luXCIpO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIGVycm9yKTtcbiAgICB9XG4gICAgaWYgKGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkICYmIHR5cGVvZihiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4ubG9hZCgpO1xuICAgIGlmIChlbmFibGVkKSB0aGlzLnN0YXJ0UGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgcmVsb2FkZWQuYCk7XG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgcmVsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tcmVsb2FkZWRcIiwgcGx1Z2luKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLnJlbG9hZFBsdWdpbihuYW1lKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZWRpdCA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XG4gICAgY29uc29sZS5sb2coXCJFZGl0IFwiICsgZmlsZW5hbWVPck5hbWUpO1xuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xuICAgIGNvbnNvbGUubG9nKFwiRWRpdCBcIiArIGZ1bGxQYXRoKTtcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0oYCR7ZnVsbFBhdGh9YCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnVwZGF0ZVBsdWdpbkxpc3QgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCByZXN1bHRzID0gQ29udGVudE1hbmFnZXIubG9hZE5ld0NvbnRlbnQoXCJwbHVnaW5cIik7XG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiByZXN1bHRzLmFkZGVkKSB0aGlzLmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiByZXN1bHRzLnJlbW92ZWQpIHRoaXMudW5sb2FkUGx1Z2luKG5hbWUpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzYXZlZCA9IERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJwbHVnaW5zXCIpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHBsdWdpbkNvb2tpZSwgc2F2ZWQpO1xuICAgIH1cbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuc2F2ZVBsdWdpbkRhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInBsdWdpbnNcIiwgcGx1Z2luQ29va2llKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubmV3TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vbk1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9uTWVzc2FnZSgpOyB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZmlyZSBvbk1lc3NhZ2UgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmNoYW5uZWxTd2l0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbi5nZXROYW1lKCldKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4ub25Td2l0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9uU3dpdGNoKCk7IH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uU3dpdGNoIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yYXdPYnNlcnZlciA9IGZ1bmN0aW9uKGUpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vYnNlcnZlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub2JzZXJ2ZXIoZSk7IH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9ic2VydmVyIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IFBsdWdpbk1vZHVsZSgpOyIsImltcG9ydCB7IHRoZW1lQ29va2llIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCJcbmltcG9ydCBiZEV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCJcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIHBvcG91dFdpbmRvdyB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBXaW5kb3c+fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53aW5kb3dzID0gbmV3IE1hcCgpXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMuaW5pdCgpXG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpe1xuICAgICAgICBsZXQgcG9wb3V0TW9kdWxlID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFdpbmRvdylcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyLnN1YnNjcmliZShcIlBPUE9VVF9XSU5ET1dfT1BFTlwiLCAoZXYpID0+IHtcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogQHR5cGUge1dpbmRvd31cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBwb3BvdXRNb2R1bGUuZGVmYXVsdC5nZXRXaW5kb3coZXYua2V5KVxuICAgICAgICAgICAgICAgIHRoaXMud2luZG93cy5zZXQoZXYua2V5LCB3aW5kb3cpXG5cbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NMaXN0ID0gd2luZG93LmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0XG4gICAgICAgICAgICAgICAgY2xhc3NMaXN0LmFkZChcIndpbmRvdy1wb3BvdXRcIilcbiAgICAgICAgICAgICAgICBjbGFzc0xpc3QuYWRkKFwibGlnaHRjb3JkXCIpXG4gICAgICAgICAgICAgICAgY2xhc3NMaXN0LmFkZChcImxpZ2h0Y29yZFwiKVxuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoZXYua2V5KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyLnN1YnNjcmliZShcIlBPUE9VVF9XSU5ET1dfQ0xPU0VcIiwgKGV2KSA9PiB7XG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2luZG93cy5kZWxldGUoZXYua2V5KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS1lbmFibGVkXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKClcbiAgICAgICAgfSlcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS1kaXNhYmxlZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpXG4gICAgICAgIH0pXG4gICAgICAgIGJkRXZlbnRzLm9uKFwidGhlbWUtcmVsb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKVxuICAgICAgICB9KVxuICAgICAgICBiZEV2ZW50cy5vbihcInRoZW1lLXVubG9hZGVkXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKClcbiAgICAgICAgfSlcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS1sb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGVuYWJsZSgpe1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXG4gICAgICAgIHRoaXMudXBkYXRlKClcbiAgICB9XG5cbiAgICBkaXNhYmxlKCl7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMudXBkYXRlKClcbiAgICB9XG5cbiAgICB1cGRhdGUoa2V5KXtcbiAgICAgICAgaWYoIXRoaXMud2luZG93cy5zaXplKXJldHVyblxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZVRoZW1lcyhrZXkpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlUaGVtZXMoa2V5KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlVGhlbWVzKGtleSl7XG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cbiAgICAgICAgaWYoa2V5KXtcbiAgICAgICAgICAgIGxldCB3aW5kb3cgPSB0aGlzLndpbmRvd3MuZ2V0KGtleSlcbiAgICAgICAgICAgIGlmKCF3aW5kb3cpcmV0dXJuXG4gICAgICAgICAgICBsZXQgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnRcblxuICAgICAgICAgICAgZm9yKGxldCBzdHlsZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbZGF0YS1saWdodGNvcmQtdGhlbWU9dHJ1ZV1cIikpe1xuICAgICAgICAgICAgICAgIHN0eWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZm9yKGxldCBrZXkgb2YgdGhpcy53aW5kb3dzLmtleXMoKSl7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVUaGVtZXMoa2V5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlUaGVtZXMoa2V5KXtcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cbiAgICAgICAgaWYoa2V5KXtcbiAgICAgICAgICAgIGxldCB3aW5kb3cgPSB0aGlzLndpbmRvd3MuZ2V0KGtleSlcbiAgICAgICAgICAgIGlmKCF3aW5kb3cpcmV0dXJuXG4gICAgICAgICAgICBsZXQgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnRcblxuICAgICAgICAgICAgZm9yKGxldCBzdHlsZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbZGF0YS1saWdodGNvcmQtdGhlbWU9dHJ1ZV1cIikpe1xuICAgICAgICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZShcIndpbGwtcmVtb3ZlXCIsIFwidHJ1ZVwiKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhiZHRoZW1lcylcbiAgICAgICAgICAgIC5mb3JFYWNoKHRoZW1lTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoIXRoZW1lQ29va2llW3RoZW1lTmFtZV0pcmV0dXJuIC8vIHRoZW1lIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1t0aGVtZU5hbWVdXG4gICAgICAgICAgICAgICAgaWYoIXRoZW1lKXJldHVybiAvLzpzaHJ1ZzpcblxuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzdHlsZVtkYXRhLWxpZ2h0Y29yZC10aGVtZT10cnVlXSNcIitET00uZXNjYXBlSUQodGhlbWUuaWQpKVxuICAgICAgICAgICAgICAgIGlmKGV4aXN0aW5nKXtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuaW5uZXJIVE1MID0gdW5lc2NhcGUodGhlbWUuY3NzKVxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5yZW1vdmVBdHRyaWJ1dGUoXCJ3aWxsLXJlbW92ZVwiKVxuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5pZCA9IERPTS5lc2NhcGVJRCh0aGVtZS5pZClcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gdW5lc2NhcGUodGhlbWUuY3NzKVxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWxpZ2h0Y29yZC10aGVtZVwiLCBcInRydWVcIilcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoc3R5bGUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZm9yKGxldCBzdHlsZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbd2lsbC1yZW1vdmU9dHJ1ZV1cIikpe1xuICAgICAgICAgICAgICAgIHN0eWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZm9yKGxldCBrZXkgb2YgdGhpcy53aW5kb3dzLmtleXMoKSl7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVRoZW1lcyhrZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcblxuaW1wb3J0IFYyQ19QdWJsaWNTZXJ2ZXJzIGZyb20gXCIuLi91aS9wdWJsaWNzZXJ2ZXJzL3B1YmxpY1NlcnZlcnNcIjtcbmltcG9ydCBMYXllcnMgZnJvbSBcIi4vTGF5ZXJzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMl9QdWJsaWNTZXJ2ZXJzIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24gPSB0aGlzLl9hcHBlbmRCdXR0b24uYmluZCh0aGlzKTtcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlYyX1B1YmxpY1NlcnZlcnMgPSB0aGlzXG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBMYXllcnMuY3JlYXRlTGF5ZXIoKGNsb3NlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19QdWJsaWNTZXJ2ZXJzLCB7cm9vdElkOiBcInB1YnNsYXllcnJvb3RcIiwgY2xvc2V9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGdldCBidXR0b24oKSB7XG4gICAgICAgIGNvbnN0IGJ0biA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtcHViLWxpXCIgY2xhc3M9XCIke0JEVjIuZ3VpbGRDbGFzc2VzLmxpc3RJdGVtfVwiPmApO1xuICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWdzLTFcIl0pIGJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItYnV0dG9uXCIgY2xhc3M9XCIke1wid3JhcHBlci0yNWVWSW4gXCIgKyBCRFYyLmd1aWxkQ2xhc3Nlcy5jaXJjbGVCdXR0b25NYXNrfVwiPnB1YmxpYzwvZGl2PmApO1xuICAgICAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge3RoaXMucmVuZGVyKCk7fSk7XG4gICAgICAgIGJ0bi5hcHBlbmQobGFiZWwpO1xuICAgICAgICByZXR1cm4gYnRuO1xuICAgIH1cblxuICAgIF9hcHBlbmRCdXR0b24oKSB7XG4gICAgICAgIGxldCBbXG4gICAgICAgICAgICBjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lclxuICAgICAgICBdID0gW1xuICAgICAgICAgICAgVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZG93bmxvYWRQcm9ncmVzcyAmJiBlLnR1dG9yaWFsQ29udGFpbmVyKVswXS50dXRvcmlhbENvbnRhaW5lcilcbiAgICAgICAgXVxuICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBndWlsZHMgPSBET00ucXVlcnkoYGRpdi4ke2NsYXNzTmFtZXR1dG9yaWFsQ29udGFpbmVyfSA+IGRpdmApO1xuICAgICAgICBET00uYWZ0ZXIoZ3VpbGRzLCB0aGlzLmJ1dHRvbik7XG4gICAgfVxuXG4gICAgYWRkQnV0dG9uKCkge1xuICAgICAgICBpZiAodGhpcy5ndWlsZFBhdGNoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IEd1aWxkTGlzdCA9IHdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHQgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTmF2aWdhYmxlR3VpbGRzXCIpO1xuICAgICAgICBjb25zdCBHdWlsZExpc3RPbGQgPSB3ZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcbiAgICAgICAgaWYgKCFHdWlsZExpc3QgJiYgIUd1aWxkTGlzdE9sZCkgVXRpbHMud2FybihcIlB1YmxpY1NlcnZlclwiLCBcIkNhbid0IGZpbmQgR3VpbGRMaXN0IGNvbXBvbmVudFwiKTtcbiAgICAgICAgdGhpcy5ndWlsZFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRMaXN0ID8gR3VpbGRMaXN0IDogR3VpbGRMaXN0T2xkLnByb3RvdHlwZSwgR3VpbGRMaXN0ID8gXCJkZWZhdWx0XCIgOiBcInJlbmRlclwiLCB7YWZ0ZXI6IHRoaXMuX2FwcGVuZEJ1dHRvbn0pO1xuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24oKTtcbiAgICB9XG5cbiAgICByZW1vdmVCdXR0b24oKSB7XG4gICAgICAgIHRoaXMuZ3VpbGRQYXRjaCgpO1xuICAgICAgICBkZWxldGUgdGhpcy5ndWlsZFBhdGNoO1xuICAgICAgICBjb25zdCBidXR0b24gPSBET00ucXVlcnkoXCIjYmQtcHViLWxpXCIpO1xuICAgICAgICBpZiAoYnV0dG9uKSBidXR0b24ucmVtb3ZlKCk7XG4gICAgfVxufTsiLCJpbXBvcnQge3NldHRpbmdzLCBzZXR0aW5nc0Nvb2tpZSwgc2V0dGluZ3NSUEMsIGxpZ2h0Y29yZFNldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XG5pbXBvcnQgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIGZyb20gXCIuL3NldHRpbmdzUGFuZWxTaWRlYmFyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcbmltcG9ydCBjb2xvcmVkVGV4dCBmcm9tIFwiLi9jb2xvcmVkVGV4dFwiO1xuaW1wb3J0IHRmSG91ciBmcm9tIFwiLi8yNGhvdXJcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcblxuaW1wb3J0IHB1YmxpY1NlcnZlcnNNb2R1bGUgZnJvbSBcIi4vcHVibGljU2VydmVyc1wiO1xuaW1wb3J0IHZvaWNlTW9kZSBmcm9tIFwiLi92b2ljZU1vZGVcIjtcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vY2xhc3NOb3JtYWxpemVyXCI7XG5pbXBvcnQgZE1vZGUgZnJvbSBcIi4vZGV2TW9kZVwiO1xuXG5pbXBvcnQgU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBmcm9tIFwiLi4vdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbFwiO1xuaW1wb3J0IENzc0VkaXRvciBmcm9tIFwiLi4vdWkvY3NzRWRpdG9yXCI7XG5pbXBvcnQgQ2FyZExpc3QgZnJvbSBcIi4uL3VpL2FkZG9ubGlzdFwiO1xuaW1wb3J0IFYyQ19QcmVzZW5jZVNldHRpbmdzIGZyb20gXCIuLi91aS9wcmVzZW5jZVNldHRpbmdzXCI7XG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuL0N1c3RvbVJpY2hQcmVzZW5jZVwiO1xuaW1wb3J0IFYyQ19BY2NvdW50SW5mb3MgZnJvbSBcIi4uL3VpL0FjY291bnRJbmZvc1wiO1xuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XG5pbXBvcnQgQW50aUFkRE0gZnJvbSBcIi4vQW50aUFkRE1cIjtcbmltcG9ydCBibHVyUHJpdmF0ZSBmcm9tIFwiLi9ibHVyUHJpdmF0ZVwiO1xuaW1wb3J0IGRpc2FibGVUeXBpbmcgZnJvbSBcIi4vZGlzYWJsZVR5cGluZ1wiO1xuaW1wb3J0IEFwaVByZXZpZXcgZnJvbSBcIi4uL3VpL0FwaVByZXZpZXdcIjtcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4uL3VpL3N3aXRjaFwiO1xuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi4vdWkvbWFyZ2ludG9wXCI7XG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcbmltcG9ydCB0b29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcbmltcG9ydCBIaXN0b3J5IGZyb20gXCIuLi91aS9pY29ucy9oaXN0b3J5XCI7XG5pbXBvcnQgY29yZSBmcm9tIFwiLi9jb3JlXCI7XG5pbXBvcnQgcG9wb3V0V2luZG93IGZyb20gXCIuL3BvcG91dFdpbmRvd1wiO1xuXG5jbGFzcyBCRFNpZGViYXJIZWFkZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IHNpZGViYXJDb21wb25lbnRzID0gd2VicGFja01vZHVsZXMuZmluZChlID0+IGUuU2VwYXJhdG9yICYmIGUuSGVhZGVyICYmIGUuSXRlbSlcblxuICAgICAgICBjb25zdCBjaGFuZ2Vsb2dCdXR0b24gPSBSZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJDaGFuZ2Vsb2dcIn0sIFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge3N0eWxlOiB7ZmxvYXQ6IFwicmlnaHRcIiwgY3Vyc29yOiBcInBvaW50ZXJcIn0sIGNsYXNzTmFtZTogXCJiZC1jaGFuZ2Vsb2ctYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTt9fSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEhpc3RvcnksIHtjbGFzc05hbWU6IFwiYmQtaWNvblwiLCBzaXplOiBcIjE2cHhcIn0pXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGxldCByZW5kZXJlZCA9IG5ldyBzaWRlYmFyQ29tcG9uZW50cy5IZWFkZXIoe1xuICAgICAgICAgICAgY2hpbGRyZW46IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIFwiQmFuZGFnZWQgQkRcIiwgY2hhbmdlbG9nQnV0dG9uKSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwiXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiByZW5kZXJlZFxuICAgIH1cbn1cblxubGV0IGlzQ2xlYXJpbmdDYWNoZSA9IGZhbHNlXG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMl9TZXR0aW5nc1BhbmVsIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzID0gdGhpcy51cGRhdGVTZXR0aW5ncy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNpZGViYXIgPSBuZXcgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyKCk7XG5cbiAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudHMoKVxuICAgIH1cblxuICAgIHJlZ2lzdGVyQ29tcG9uZW50cygpe1xuICAgICAgICAvKiogTGlnaHRjb3JkICovXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImxpZ2h0Y29yZFwiLCBtYWtlQ29tcG9uZW50KHRoaXMubGlnaHRjb3JkQ29tcG9uZW50LmJpbmQodGhpcykpKVxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJzdGF0dXNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLlByZXNlbmNlQ29tcG9uZW50LmJpbmQodGhpcykpKVxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJhY2NvdW50aW5mb1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuQWNjb3VudEluZm9zQ29tcG9uZW50LmJpbmQodGhpcykpKVxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJsY2FwaXByZXZpZXdcIiwgbWFrZUNvbXBvbmVudCh0aGlzLkFwaVByZXZpZXdDb21wb25lbnQuYmluZCh0aGlzKSkpXG5cbiAgICAgICAgLyogQmFuZGFnZWQgQkQgKi9cbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwiQkRDaGFuZ2Vsb2dUaXRsZVwiLCBtYWtlQ29tcG9uZW50KCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQkRTaWRlYmFySGVhZGVyKCkucmVuZGVyKClcbiAgICAgICAgfSkpXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImNvcmVcIiwgbWFrZUNvbXBvbmVudCh0aGlzLmNvcmVDb21wb25lbnQuYmluZCh0aGlzKSkpXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImN1c3RvbWNzc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuY3VzdG9tQ3NzQ29tcG9uZW50LmJpbmQodGhpcykpKVxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJwbHVnaW5zXCIsIG1ha2VDb21wb25lbnQodGhpcy5yZW5kZXJBZGRvblBhbmUoXCJwbHVnaW5zXCIpKSlcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwidGhlbWVzXCIsIG1ha2VDb21wb25lbnQodGhpcy5yZW5kZXJBZGRvblBhbmUoXCJ0aGVtZXNcIikpKVxuICAgIH1cbiAgICBcbiAgICBnZXQgY29yZVNldHRpbmdzKCkge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoXCJjb3JlXCIpO1xuICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gWy4uLm5ldyBTZXQoc2V0dGluZ3MubWFwKHMgPT4gcy5jYXRlZ29yeSkpXTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yaWVzLm1hcChjID0+IHtyZXR1cm4ge3RpdGxlOiBjLCBzZXR0aW5nczogc2V0dGluZ3MuZmlsdGVyKHMgPT4gcy5jYXRlZ29yeSA9PSBjKX07fSk7XG4gICAgICAgIHJldHVybiBzZWN0aW9ucztcbiAgICB9XG5cbiAgICBnZXQgbGlnaHRjb3JkU2V0dGluZ3MoKSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncyhcImxpZ2h0Y29yZFwiKTtcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5uZXcgU2V0KHNldHRpbmdzLm1hcChzID0+IHMuY2F0ZWdvcnkpKV07XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2F0ZWdvcmllcy5tYXAoYyA9PiB7cmV0dXJuIHt0aXRsZTogYywgc2V0dGluZ3M6IHNldHRpbmdzLmZpbHRlcihzID0+IHMuY2F0ZWdvcnkgPT0gYyl9O30pO1xuICAgICAgICByZXR1cm4gc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgZ2V0IFByZXNlbmNlU2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNldHRpbmdzKFwic3RhdHVzXCIpXG4gICAgfVxuXG4gICAgZ2V0U2V0dGluZ3MoY2F0ZWdvcnkpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nba2V5XTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmNhdCA9PT0gY2F0ZWdvcnkgJiYgc2V0dGluZy5pbXBsZW1lbnRlZCAmJiAhc2V0dGluZy5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBzZXR0aW5nLnRleHQgPSBrZXk7XG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2V0dGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgICB9LCBbXSk7XG4gICAgfVxuXG5cbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCwgc2lkZWJhcikge1xuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKGlkLCBjaGVja2VkLCBzaWRlYmFyKTtcbiAgICB9XG5cbiAgICB1cGRhdGVTZXR0aW5ncyhpZCwgZW5hYmxlZCwgc2lkZWJhcikge1xuICAgICAgICBpZighW1wibGlnaHRjb3JkLThcIiwgXCJub193aW5kb3dfYm91bmRcIiwgXCJlbmFibGVfZ2xhc3N0cm9uXCIsIFwibGlnaHRjb3JkLTEwXCJdLmluY2x1ZGVzKGlkKSlzZXR0aW5nc0Nvb2tpZVtpZF0gPSBlbmFibGVkO1xuXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy0yXCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xuICAgICAgICAgICAgZWxzZSBET00ucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTNcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWwtY2hhblwiKTtcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTFcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHB1YmxpY1NlcnZlcnNNb2R1bGUuYWRkQnV0dG9uKCk7XG4gICAgICAgICAgICBlbHNlIHB1YmxpY1NlcnZlcnNNb2R1bGUucmVtb3ZlQnV0dG9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtNFwiKSB7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgdm9pY2VNb2RlLnN0YXJ0KCk7XG4gICAgICAgICAgICBlbHNlIHZvaWNlTW9kZS5zdG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtNVwiKSB7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuYWJsZWQgJiYgaWQgPT0gXCJiZGEtZ3MtNlwiKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XG5cbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTdcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGNvbG9yZWRUZXh0LmluamVjdENvbG9yZWRUZXh0KCk7XG4gICAgICAgICAgICBlbHNlIGNvbG9yZWRUZXh0LnJlbW92ZUNvbG9yZWRUZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXBzLTRcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIENsYXNzTm9ybWFsaXplci5zdGFydCgpO1xuICAgICAgICAgICAgZWxzZSBDbGFzc05vcm1hbGl6ZXIuc3RvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy01XCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIudW53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIudW53YXRjaENvbnRlbnQoXCJ0aGVtZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstd3AtMVwiKSB7XG4gICAgICAgICAgICBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwidHJhbnNwYXJlbnRcIiwgZW5hYmxlZCk7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShcImJhY2tncm91bmRDb2xvclwiLCBudWxsKTtcbiAgICAgICAgICAgIGVsc2UgVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShcImJhY2tncm91bmRDb2xvclwiLCBcIiMyZjMxMzZcIik7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy04XCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBkTW9kZS5zdGFydERlYnVnTGlzdGVuZXIoKTtcbiAgICAgICAgICAgIGVsc2UgZE1vZGUuc3RvcERlYnVnTGlzdGVuZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstZG0tMVwiKSB7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcbiAgICAgICAgICAgIGVsc2UgZE1vZGUuc3RvcENvcHlTZWxlY3RvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC0xXCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSB0cnVlXG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IGZhbHNlXG4gICAgICAgICAgICBzaWRlYmFyLmZvcmNlVXBkYXRlKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTJcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuY2FsbFJpbmdpbmdCZWF0ID0gdHJ1ZVxuICAgICAgICAgICAgZWxzZSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3NTdG9yZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgdHlwZW9mIGUuZGVmYXVsdCA9PT0gXCJvYmplY3RcIiAmJiBcInNob3dDdXJyZW50R2FtZVwiIGluIGUuZGVmYXVsdClbMF1cbiAgICAgICAgICAgICAgICBpZihzZXR0aW5nc1N0b3JlICYmICFzZXR0aW5nc1N0b3JlLmRlZmF1bHQuc2hvd0N1cnJlbnRHYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3MpWzBdLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0N1cnJlbnRHYW1lOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBDdXN0b21SaWNoUHJlc2VuY2UuZGlzYWJsZSgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC0zXCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXG4gICAgICAgICAgICBlbHNlIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0QWx3YXlzT25Ub3AoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC00XCIpIHtcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xuICAgICAgICAgICAgICAgIEFudGlBZERNLmVuYWJsZSgpXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5kaXNhYmxlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTZcIikge1xuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZW5hYmxlKClcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGJsdXJQcml2YXRlLmRpc2FibGUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtN1wiKSB7XG4gICAgICAgICAgICBpZihlbmFibGVkKXtcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmVuYWJsZSgpXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmRpc2FibGUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtOFwiKXtcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2V0KFwiaXNUYWJzXCIsIGVuYWJsZWQpXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxuICAgICAgICAgICAgcmVtb3RlLmFwcC5leGl0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTlcIikge1xuICAgICAgICAgICAgcG9wb3V0V2luZG93W2VuYWJsZWQgPyBcImVuYWJsZVwiIDogXCJkaXNhYmxlXCJdKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTEwXCIpe1xuICAgICAgICAgICAgY29yZS5tZXRob2RzLk5vdGlmaWNhdGlvbnNVc2VTaGltKGVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibm9fd2luZG93X2JvdW5kXCIpe1xuICAgICAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gcmVtb3RlLmdldEdsb2JhbChcImFwcFNldHRpbmdzXCIpXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJOT19XSU5ET1dTX0JPVU5EXCIsIGVuYWJsZWQpXG5cbiAgICAgICAgICAgIGFwcFNldHRpbmdzLmRlbGV0ZShcIklTX01BWElNSVpFRFwiKVxuICAgICAgICAgICAgYXBwU2V0dGluZ3MuZGVsZXRlKFwiSVNfTUlOSU1JWkVEXCIpIFxuICAgICAgICAgICAgYXBwU2V0dGluZ3MuZGVsZXRlKFwiV0lORE9XX0JPVU5EU1wiKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxuICAgICAgICAgICAgcmVtb3RlLmFwcC5leGl0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwiZW5hYmxlX2dsYXNzdHJvblwiKXtcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2V0KFwiR0xBU1NUUk9OXCIsIGVuYWJsZWQpXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxuICAgICAgICAgICAgcmVtb3RlLmFwcC5leGl0KClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZVNldHRpbmdzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdGlhbGl6ZVNldHRpbmdzKCkge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMlwiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbFwiKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTNcIl0pIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWwtY2hhblwiKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTFcIl0pIHB1YmxpY1NlcnZlcnNNb2R1bGUuYWRkQnV0dG9uKCk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy00XCJdKSB2b2ljZU1vZGUuc3RhcnQoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTVcIl0pIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgdGZIb3VyLmluamVjdDI0SG91cigpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtN1wiXSkgY29sb3JlZFRleHQuaW5qZWN0Q29sb3JlZFRleHQoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy00XCJdKSBDbGFzc05vcm1hbGl6ZXIuc3RhcnQoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTFcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IHRydWVcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTJcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuY2FsbFJpbmdpbmdCZWF0ID0gdHJ1ZVxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiXSkgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0zXCJdKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC00XCJdKSBBbnRpQWRETS5lbmFibGUoKVxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNlwiXSkgYmx1clByaXZhdGUuZW5hYmxlKClcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTdcIl0pIGRpc2FibGVUeXBpbmcuZW5hYmxlKClcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTlcIl0pIHBvcG91dFdpbmRvdy5lbmFibGUoKVxuXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkge1xuICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xuICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtOFwiXSkgZE1vZGUuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstZG0tMVwiXSkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcblxuICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xuICAgIH1cblxuICAgIHNhdmVTZXR0aW5ncygpIHtcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIsIHNldHRpbmdzQ29va2llKTtcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInJwY1wiLCBzZXR0aW5nc1JQQyk7XG4gICAgICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJsaWdodGNvcmQtc2V0dGluZ3NcIiwgbGlnaHRjb3JkU2V0dGluZ3MpO1xuICAgIH1cblxuICAgIGxvYWRTZXR0aW5ncygpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc0Nvb2tpZSwgRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGxpZ2h0Y29yZFNldHRpbmdzLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwibGlnaHRjb3JkLXNldHRpbmdzXCIpKVxuICAgICAgICBPYmplY3QuYXNzaWduKGxpZ2h0Y29yZFNldHRpbmdzLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwibGlnaHRjb3JkLXNldHRpbmdzXCIpKTtcbiAgICB9XG5cbiAgICByZW5kZXJTaWRlYmFyKHNpZGViYXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhci5yZW5kZXIoc2lkZWJhcik7XG4gICAgfVxuXG4gICAgY29yZUNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZWN0aW9uZWRTZXR0aW5nc1BhbmVsLCB7a2V5OiBcImNzcGFuZWxcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIHNlY3Rpb25zOiB0aGlzLmNvcmVTZXR0aW5nc30pXG4gICAgfVxuXG4gICAgbGlnaHRjb3JkQ29tcG9uZW50KHNpZGViYXIsIGZvcmNlVXBkYXRlKSB7XG4gICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGhpcy5saWdodGNvcmRTZXR0aW5ncy5tYXAoKHNlY3Rpb24sIGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAoaSA9PT0gMCA/IG51bGwgOiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFyZ2luVG9wKSksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSwgc2VjdGlvbi50aXRsZSksXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzQ2hlY2tlZCA9IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09PSBcImxpZ2h0Y29yZC04XCIpaXNDaGVja2VkID0gYXBwU2V0dGluZ3MuZ2V0KFwiaXNUYWJzXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT09IFwibm9fd2luZG93X2JvdW5kXCIpaXNDaGVja2VkID0gYXBwU2V0dGluZ3MuZ2V0KFwiTk9fV0lORE9XU19CT1VORFwiLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT09IFwiZW5hYmxlX2dsYXNzdHJvblwiKWlzQ2hlY2tlZCA9IGFwcFNldHRpbmdzLmdldChcIkdMQVNTVFJPTlwiLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJsaWdodGNvcmQtMTBcIilpc0NoZWNrZWQgPSAhYXBwU2V0dGluZ3MuZ2V0KFwiREVGQVVMVF9OT1RJRklDQVRJT05TXCIsIHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgY2hlY2tlZDogaXNDaGVja2VkLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShpZCwgY2hlY2tlZCwgc2lkZWJhcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT0gXCJsaWdodGNvcmQtOFwiICYmIGlzQ2hlY2tlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcImdyZWVuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rOiBcIm91dGxpbmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBcInNtYWxsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3ZlckNvbG9yOiBcImJyYW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5pcGMuc2VuZChcIk5FV19UQUJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBcIk9wZW4gYSBuZXcgVGFiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSksIFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBcInllbGxvd1wiLFxuICAgICAgICAgICAgICAgIGxvb2s6IFwiZ2hvc3RcIixcbiAgICAgICAgICAgICAgICBzaXplOiBcIm1lZGl1bVwiLFxuICAgICAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwicmVkXCIsXG4gICAgICAgICAgICAgICAgb25DbGljaygpe1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlNob3VsZCByZWxhdW5jaFwiKVxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuYXBwLnJlbGF1bmNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IHJlbW90ZS5wcm9jZXNzLmFyZ3Yuc2xpY2UoMSkuY29uY2F0KFtcIi0tZGlzYWJsZS1iZXR0ZXJkaXNjb3JkXCJdKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuYXBwLnF1aXQoKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd3JhcHBlcjogdHJ1ZVxuICAgICAgICAgICAgfSwgXCJSZWxhdW5jaCB3aXRob3V0IEJldHRlckRpc2NvcmRcIiksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uLCB7XG4gICAgICAgICAgICAgICAgY29sb3I6IFwieWVsbG93XCIsXG4gICAgICAgICAgICAgICAgbG9vazogXCJnaG9zdFwiLFxuICAgICAgICAgICAgICAgIHNpemU6IFwibWVkaXVtXCIsXG4gICAgICAgICAgICAgICAgaG92ZXJDb2xvcjogXCJyZWRcIixcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGlzQ2xlYXJpbmdDYWNoZSlyZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgaXNDbGVhcmluZ0NhY2hlID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJDbGVhcmluZyBjYWNoZS4uLlwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImluZm9cIlxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZSgpXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS5zZXNzaW9uLmNsZWFyQ2FjaGUoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJDYWNoZSBpcyBjbGVhcmVkICFcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3VjY2Vzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGVhcmluZ0NhY2hlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiQW4gZXJyb3Igb2NjdXJlZC4gQ2hlY2sgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbnMuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NsZWFyaW5nQ2FjaGUgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVcGRhdGUoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd3JhcHBlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogaXNDbGVhcmluZ0NhY2hlXG4gICAgICAgICAgICB9LCBcIkNsZWFyIGNhY2hlXCIpXG4gICAgICAgIF1cbiAgICB9XG5cbiAgICBQcmVzZW5jZUNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfUHJlc2VuY2VTZXR0aW5ncywge1xuICAgICAgICAgICAga2V5OiBcImxwcGFubmVsXCIsXG4gICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgXG4gICAgICAgICAgICBzZXR0aW5nczogdGhpcy5QcmVzZW5jZVNldHRpbmdzXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgQWNjb3VudEluZm9zQ29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19BY2NvdW50SW5mb3MsIHtcbiAgICAgICAgICAgIGtleTogXCJsYXBhbm5lbFwiXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgQXBpUHJldmlld0NvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChBcGlQcmV2aWV3LCB7XG4gICAgICAgICAgICBrZXk6IFwibGFwaXBhbm5lbFwiXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgY3VzdG9tQ3NzQ29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENzc0VkaXRvciwge2tleTogXCJjc3NlZGl0b3JcIn0pXG4gICAgfVxuXG4gICAgcmVuZGVyQWRkb25QYW5lKHR5cGUpIHtcbiAgICAgICAgLy8gSSBrbm93IHRoaXMgc2hvdWxkbid0IGJlIGhlcmUsIGJ1dCB3aGVuIGl0IGlzbid0LFxuICAgICAgICAvLyBSZWFjdCByZWZ1c2VzIHRvIGNoYW5nZSB0aGUgYnV0dG9uIHdoZW4gZ29pbmdcbiAgICAgICAgLy8gYmV0d2VlbiBwbHVnaW5zIGFuZCB0aGVtZXMgcGFnZS4uLiBzb21ldGhpbmdcbiAgICAgICAgLy8gdG8gZGVidWcgbGF0ZXIuXG4gICAgICAgIGNsYXNzIENvbnRlbnRMaXN0IGV4dGVuZHMgQkRWMi5yZWFjdC5Db21wb25lbnQge1xuICAgICAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVmaXggPSB0aGlzLnByb3BzLnR5cGUucmVwbGFjZShcInNcIiwgXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgb25DaGFuZ2UoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgICAgIHJlbmRlcigpIHtyZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjt9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBDb250ZW50TGlzdC5wcm90b3R5cGUucmVuZGVyO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29udGVudExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENvbnRlbnRMaXN0LCB7dHlwZX0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDYXJkTGlzdCwge3R5cGV9KSlcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKlxuICogTm8gbmVlZCB0byBleHBvcnQgc2V0dGluZ3NQYW5lbCBvbiB3aW5kb3dcbiAqL1xuXG5mdW5jdGlvbiBtYWtlQ29tcG9uZW50KGNoaWxkcmVuKXtcbiAgICBjbGFzcyBTZXR0aW5nQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCl7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oc2lkZWJhciwgKCkgPT4gdGhpcy5mb3JjZVVwZGF0ZSgpKVxuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzaWRlYmFyXG4gICAgcmV0dXJuIChzKSA9PiB7XG4gICAgICAgIHNpZGViYXIgPSBzXG4gICAgICAgIHJldHVybiBTZXR0aW5nQ29tcG9uZW50XG4gICAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSB7fVxuICAgIH1cblxuICAgIHJlZ2lzdGVyKHBhbmVsLCBjb21wb25lbnQpe1xuICAgICAgICB0aGlzLnBhbmVsc1twYW5lbF0gPSBjb21wb25lbnRcbiAgICB9XG5cbiAgICBnZXRDb21wb25lbnQocGFuZWwsIHNpZGViYXIpe1xuICAgICAgICByZXR1cm4gdGhpcy5wYW5lbHNbcGFuZWxdKHNpZGViYXIpXG4gICAgfVxuXG4gICAgZ2V0IGl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gW3tcbiAgICAgICAgICAgIHRleHQ6IFwiQmV0dGVyRGlzY29yZCBTZXR0aW5nc1wiLCBcbiAgICAgICAgICAgIGlkOiBcImNvcmVcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICB0ZXh0OiBcIlBsdWdpbnNcIiwgXG4gICAgICAgICAgICBpZDogXCJwbHVnaW5zXCJcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgdGV4dDogXCJUaGVtZXNcIiwgXG4gICAgICAgICAgICBpZDogXCJ0aGVtZXNcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICB0ZXh0OiBcIkN1c3RvbSBDU1NcIiwgXG4gICAgICAgICAgICBpZDogXCJjdXN0b21jc3NcIlxuICAgICAgICB9XTtcbiAgICB9XG5cbiAgICBnZXQgTENpdGVtcygpe1xuICAgICAgICBsZXQgaXRlbXMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dDogXCJMaWdodGNvcmQgU2V0dGluZ3NcIixcbiAgICAgICAgICAgICAgICBpZDogXCJsaWdodGNvcmRcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHRleHQ6IFwiUmljaFByZXNlbmNlXCIsIFxuICAgICAgICAgICAgICAgIGlkOiBcInN0YXR1c1wiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdGV4dDogXCJBY2NvdW50IEluZm9cIixcbiAgICAgICAgICAgICAgICBpZDogXCJhY2NvdW50aW5mb1wiXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgZ2V0IExDRGV2SXRlbXMoKXtcbiAgICAgICAgbGV0IGl0ZW1zID0gW11cbiAgICAgICAgaWYoIXdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSlyZXR1cm4gaXRlbXNcbiAgICAgICAgaXRlbXMucHVzaCguLi5bXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJIRUFERVJcIixcbiAgICAgICAgICAgICAgICBsYWJlbDogXCJMaWdodGNvcmQgQXBpXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dDogXCJDb21wb25lbnRzIFByZXZpZXdcIixcbiAgICAgICAgICAgICAgICBpZDogXCJsY2FwaXByZXZpZXdcIlxuICAgICAgICAgICAgfVxuICAgICAgICBdKVxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICByZW5kZXIoc2lkZWJhcikge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiSEVBREVSXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiTGlnaHRjb3JkXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi50aGlzLkxDaXRlbXMubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAuLi50aGlzLkxDRGV2SXRlbXMubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmKGUuc2VjdGlvbilyZXR1cm4gZVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJDVVNUT01cIixcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChcIkJEQ2hhbmdlbG9nVGl0bGVcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi50aGlzLml0ZW1zLm1hcChlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uOiBlLmlkLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS50ZXh0LFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkLCBzaWRlYmFyKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiRElWSURFUlwiXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9XG59XG5cbi8qKlxuICogTm8gbmVlZCB0byBleHBvcnQgc2V0dGluZ3NQYW5lbFNpZGViYXIgb24gd2luZG93XG4gKi8iLCJpbXBvcnQge2JkdGhlbWVFcnJvcnMsIHRoZW1lQ29va2llLCBzZXR0aW5nc0Nvb2tpZSwgYmR0aGVtZXN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL2JkRXZlbnRzXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcbmltcG9ydCBiZEV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiO1xuXG5jbGFzcyBUaGVtZU1vZHVsZSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlRoZW1lTW9kdWxlID0gdGhpc1xuICAgIH1cbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXI7fVxufVxuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lcyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmxvYWRUaGVtZURhdGEoKTtcbiAgICBiZHRoZW1lRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFRoZW1lcygpKSk7XG4gICAgY29uc3QgdGhlbWVzID0gT2JqZWN0LmtleXMoYmR0aGVtZXMpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGVtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1t0aGVtZXNbaV1dO1xuICAgICAgICBpZiAoIXRoZW1lQ29va2llW3RoZW1lLm5hbWVdKSB0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhlbWVDb29raWVbdGhlbWUubmFtZV0pIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcblxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMCkpXG4gICAgfVxuICAgIGZvciAoY29uc3QgdGhlbWUgaW4gdGhlbWVDb29raWUpIHtcbiAgICAgICAgaWYgKCFiZHRoZW1lc1t0aGVtZV0pIGRlbGV0ZSB0aGVtZUNvb2tpZVt0aGVtZV07XG4gICAgfVxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xuICAgIC8vIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZW5hYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHRoZW1lQ29va2llW25hbWVdID0gdHJ1ZTtcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW25hbWVdO1xuICAgIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcbiAgICBiZEV2ZW50cy5kaXNwYXRjaChcInRoZW1lLWVuYWJsZWRcIilcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IGhhcyBiZWVuIGFwcGxpZWQuYCk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlVGhlbWUobmFtZSwgcmVsb2FkKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHRoZW1lQ29va2llW25hbWVdID0gZmFsc2U7XG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1tuYW1lXTtcbiAgICBET00ucmVtb3ZlU3R5bGUoRE9NLmVzY2FwZUlEKHRoZW1lLmlkKSk7XG4gICAgYmRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS1kaXNhYmxlZFwiKVxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gaGFzIGJlZW4gZGlzYWJsZWQuYCk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVUaGVtZShuYW1lLCByZWxvYWQpO1xufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnRvZ2dsZVRoZW1lID0gZnVuY3Rpb24odGhlbWUpIHtcbiAgICBpZiAodGhlbWVDb29raWVbdGhlbWVdKSB0aGlzLmRpc2FibGVUaGVtZSh0aGVtZSk7XG4gICAgZWxzZSB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZVRoZW1lKG5hbWUpO1xufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmxvYWRUaGVtZSA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkQ29udGVudChmaWxlbmFtZSwgXCJ0aGVtZVwiKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLiBJdCBtYXkgbm90IGhhdmUgYmVlbiBsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBjb25zdCB0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lKTtcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSB3YXMgbG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IHdhcyBsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS1sb2FkZWRcIiwgdGhlbWUubmFtZSk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudW5sb2FkVGhlbWUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmR0aGVtZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZS5uYW1lO1xuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcbiAgICBjb25zdCBlcnJvciA9IENvbnRlbnRNYW5hZ2VyLnVubG9hZENvbnRlbnQoYmR0aGVtZXNbdGhlbWVdLmZpbGVuYW1lLCBcInRoZW1lXCIpO1xuICAgIGRlbGV0ZSBiZHRoZW1lc1t0aGVtZV07XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3RoZW1lczogW2Vycm9yXX0pO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gd2FzIHVubG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB3YXMgdW5sb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS11bmxvYWRlZFwiLCB0aGVtZSk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zdCBiZHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybjtcbiAgICB0aGlzLnVubG9hZFRoZW1lKGJkdGhlbWUuZmlsZW5hbWUpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIsIGJkdGhlbWUuZmlsZW5hbWUpO1xuICAgIHJlcXVpcmUoXCJmc1wiKS51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5yZWxvYWRUaGVtZSA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm4gdGhpcy5sb2FkVGhlbWUoZmlsZW5hbWVPck5hbWUpO1xuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZS5uYW1lO1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIucmVsb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUsIHRydWUpLCB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCBlcnJvcik7XG4gICAgfVxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSB2JHtiZHRoZW1lc1t0aGVtZV0udmVyc2lvbn0gd2FzIHJlbG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB2JHtiZHRoZW1lc1t0aGVtZV0udmVyc2lvbn0gd2FzIHJlbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtcmVsb2FkZWRcIiwgdGhlbWUpO1xufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWxvYWRUaGVtZShuYW1lKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lZGl0ID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0oYCR7ZnVsbFBhdGh9YCk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudXBkYXRlVGhlbWVMaXN0ID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IENvbnRlbnRNYW5hZ2VyLmxvYWROZXdDb250ZW50KFwidGhlbWVcIik7XG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiByZXN1bHRzLmFkZGVkKSB0aGlzLmxvYWRUaGVtZShmaWxlbmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRUaGVtZShuYW1lKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVEYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwidGhlbWVzXCIpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoZW1lQ29va2llLCBzYXZlZCk7XG4gICAgfVxufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnNhdmVUaGVtZURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInRoZW1lc1wiLCB0aGVtZUNvb2tpZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgVGhlbWVNb2R1bGUoKTsiLCJpbXBvcnQge2JiZFZlcnNpb259IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXRpbHMge1xuICAgIC8qKiBEb2N1bWVudC93aW5kb3cgd2lkdGggKi9cbiAgICBzdGF0aWMgZ2V0IHNjcmVlbldpZHRoKCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTsgfVxuICAgIC8qKiBEb2N1bWVudC93aW5kb3cgaGVpZ2h0ICovXG4gICAgc3RhdGljIGdldCBzY3JlZW5IZWlnaHQoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7IH1cblxuICAgIHN0YXRpYyBnZXQgV2luZG93Q29uZmlnRmlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpbmRvd0NvbmZpZ0ZpbGUgPSBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRBbGxXaW5kb3dQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgICAgICAgZnJhbWU6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBnZXRXaW5kb3dQcmVmZXJlbmNlKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcInRyYW5zcGFyZW50XCIpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoa2V5ID09PSBcImZyYW1lXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBzZXRXaW5kb3dQcmVmZXJlbmNlKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJmcmFtZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyBzdHJpcEJPTShjb250ZW50KSB7XG4gICAgICAgIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRleHRBcmVhKCkge1xuICAgICAgICByZXR1cm4gRE9NLnF1ZXJ5KFwiLlwiK3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoYW5uZWxUZXh0QXJlYSAmJiBlLnRpdGxlV3JhcHBlcilbMF0uY2hhbm5lbFRleHRBcmVhKStcIiB0ZXh0YXJlYVwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaW5zZXJ0VGV4dCh0ZXh0YXJlYSwgdGV4dCkge1xuICAgICAgICB0ZXh0YXJlYS5mb2N1cygpO1xuICAgICAgICB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCA9IDA7XG4gICAgICAgIHRleHRhcmVhLnNlbGVjdGlvbkVuZCA9IHRleHRhcmVhLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbnNlcnRUZXh0XCIsIGZhbHNlLCB0ZXh0KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZXNjYXBlSUQoaWQpIHtcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XG4gICAgfVxuXG4gICAgc3RhdGljIGxvZyhtb2R1bGVOYW1lLCBtZXNzYWdlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiAjM2E3MWMxOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiAjM2E3MWMxO1wiLCBcIlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgd2Fybihtb2R1bGVOYW1lLCBtZXNzYWdlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogI0U4QTQwMDsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogI0U4QTQwMDtcIiwgXCJcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIGVycihtb2R1bGVOYW1lLCBtZXNzYWdlLCBlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogcmVkOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiByZWQ7XCIsIFwiXCIpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXCIlY0Vycm9yOiBcIiArIGVycm9yLm1lc3NhZ2UsIFwiY29sb3I6IHJlZDtcIik7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLnN0YWNrKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdCBzdHJpbmdzIHdpdGggcGxhY2Vob2xkZXJzIChge3twbGFjZWhvbGRlcn19YCkgaW50byBmdWxsIHN0cmluZ3MuXG4gICAgICogUXVpY2sgZXhhbXBsZTogYFBsdWdpblV0aWxpdGllcy5mb3JtYXRTdHJpbmcoXCJIZWxsbywge3t1c2VyfX1cIiwge3VzZXI6IFwiWmVyZWJvc1wifSlgXG4gICAgICogd291bGQgcmV0dXJuIFwiSGVsbG8sIFplcmVib3NcIi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIC0gc3RyaW5nIHRvIGZvcm1hdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgLSBvYmplY3QgbGl0ZXJhbCBvZiBwbGFjZWhvbGRlcnMgdG8gcmVwbGFjZW1lbnRzXG4gICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHByb3Blcmx5IGZvcm1hdHRlZCBzdHJpbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgZm9ybWF0U3RyaW5nKHN0cmluZywgdmFsdWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdmFsIGluIHZhbHVlcykge1xuICAgICAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gdmFsdWVzW3ZhbF07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXBsYWNlbWVudCkpIHJlcGxhY2VtZW50ID0gSlNPTi5zdHJpbmdpZnkocmVwbGFjZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZihyZXBsYWNlbWVudCkgPT09IFwib2JqZWN0XCIgJiYgcmVwbGFjZW1lbnQgIT09IG51bGwpIHJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKG5ldyBSZWdFeHAoYHt7JHt2YWx9fX1gLCBcImdcIiksIHJlcGxhY2VtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH1cblxuICAgIHN0YXRpYyBlc2NhcGUocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdGVzdEpTT04oZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRW1wdHkob2JqKSB7XG4gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogPT0gdW5kZWZpbmVkIHx8IG9iaiA9PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZihvYmopICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubGVuZ3RoID09IDA7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc3RhdGljIHN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gKC4uLnBhcmFtcykgPT4ge1xuICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIG1ldGhvZCguLi5wYXJhbXMpO1x0fVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgdGhpcy5lcnIoXCJTdXBwcmVzc2VkRXJyb3JcIiwgXCJFcnJvciBvY2N1cnJlZCBpbiBcIiArIG1lc3NhZ2UsIGUpOyB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIG1vbmtleVBhdGNoKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qge2JlZm9yZSwgYWZ0ZXIsIGluc3RlYWQsIG9uY2UgPSBmYWxzZSwgc2lsZW50ID0gZmFsc2UsIGZvcmNlID0gZmFsc2V9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBvcHRpb25zLmRpc3BsYXlOYW1lIHx8IHdoYXQuZGlzcGxheU5hbWUgfHwgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSB8fCB3aGF0Lm5hbWUgfHwgd2hhdC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmxvZyhcInBhdGNoXCIsIG1ldGhvZE5hbWUsIFwib2ZcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgICBpZiAoZm9yY2UpIHdoYXRbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcihtZXRob2ROYW1lLCBcImRvZXMgbm90IGV4aXN0IGZvclwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yaWdNZXRob2QgPSB3aGF0W21ldGhvZE5hbWVdO1xuICAgICAgICBsZXQgY2FuY2VsZWQgPSBmYWxzZVxuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJ1bnBhdGNoXCIsIG1ldGhvZE5hbWUsIFwib2ZcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIC8vd2hhdFttZXRob2ROYW1lXSA9IG9yaWdNZXRob2Q7XG4gICAgICAgICAgICBjYW5jZWxlZCA9IHRydWUgLy8gdGhpcyBhbGxvdyB0byBtb25rZXlwYXRjaCBtb3JlIHRoYW4gb25lIHRpbWUuXG4gICAgICAgIH07XG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmKGNhbmNlbGVkKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ01ldGhvZC5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgdGhpc09iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICBtZXRob2RBcmd1bWVudHM6IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICBjYW5jZWxQYXRjaDogY2FuY2VsLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kOiBvcmlnTWV0aG9kLFxuICAgICAgICAgICAgICAgIGNhbGxPcmlnaW5hbE1ldGhvZDogKCkgPT4gZGF0YS5yZXR1cm5WYWx1ZSA9IGRhdGEub3JpZ2luYWxNZXRob2QuYXBwbHkoZGF0YS50aGlzT2JqZWN0LCBkYXRhLm1ldGhvZEFyZ3VtZW50cylcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaW5zdGVhZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBSZXQgPSBVdGlscy5zdXBwcmVzc0Vycm9ycyhpbnN0ZWFkLCBcImBpbnN0ZWFkYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmICh0ZW1wUmV0ICE9PSB1bmRlZmluZWQpIGRhdGEucmV0dXJuVmFsdWUgPSB0ZW1wUmV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSkgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYmVmb3JlLCBcImBiZWZvcmVgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XG4gICAgICAgICAgICAgICAgZGF0YS5jYWxsT3JpZ2luYWxNZXRob2QoKTtcbiAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIpIFV0aWxzLnN1cHByZXNzRXJyb3JzKGFmdGVyLCBcImBhZnRlcmAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvbmNlKSBjYW5jZWwoKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnJldHVyblZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuYXNzaWduKHdoYXRbbWV0aG9kTmFtZV0sIG9yaWdNZXRob2QpO1xuICAgICAgICB3aGF0W21ldGhvZE5hbWVdLl9fbW9ua2V5UGF0Y2hlZCA9IHRydWU7XG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QpIHtcbiAgICAgICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uX19vcmlnaW5hbE1ldGhvZCA9IG9yaWdNZXRob2Q7XG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7cmV0dXJuIG9yaWdNZXRob2QudG9TdHJpbmcoKTt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWw7XG4gICAgfVxuXG4gICAgc3RhdGljIG9uUmVtb3ZlZChub2RlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgbXV0YXRpb25zLmxlbmd0aDsgbSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbbV07XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKG5vZGUpID4gLTE7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnMobm9kZSkpO1xuICAgICAgICAgICAgICAgIGlmIChkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtzdWJ0cmVlOiB0cnVlLCBjaGlsZExpc3Q6IHRydWV9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0TmVzdGVkUHJvcChvYmosIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoL1xccz9cXC5cXHM/LykucmVkdWNlKGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmpbcHJvcF07XG4gICAgICAgIH0sIG9iaik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBzaG93cyBhIHRvYXN0IHNpbWlsYXIgdG8gYW5kcm9pZCB0b3dhcmRzIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IFRoZSBzdHJpbmcgdG8gc2hvdyBpbiB0aGUgdG9hc3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3QuIE9wdGlvbmFsIHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50eXBlIENoYW5nZXMgdGhlIHR5cGUgb2YgdGhlIHRvYXN0IHN0eWxpc3RpY2FsbHkgYW5kIHNlbWFudGljYWxseS4gQ2hvaWNlczogXCJcIiwgXCJpbmZvXCIsIFwic3VjY2Vzc1wiLCBcImRhbmdlclwiL1wiZXJyb3JcIiwgXCJ3YXJuaW5nXCIvXCJ3YXJuXCIuIERlZmF1bHQ6IFwiXCJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuaWNvbiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGljb24gc2hvdWxkIHNob3cgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZS4gQSB0b2FzdCB3aXRob3V0IHR5cGUgd2lsbCBhbHdheXMgaGF2ZSBubyBpY29uLiBEZWZhdWx0OiB0cnVlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMudGltZW91dCBBZGp1c3RzIHRoZSB0aW1lIChpbiBtcykgdGhlIHRvYXN0IHNob3VsZCBiZSBzaG93biBmb3IgYmVmb3JlIGRpc2FwcGVhcmluZyBhdXRvbWF0aWNhbGx5LiBEZWZhdWx0OiAzMDAwXG4gICAgICovXG4gICAgc3RhdGljIHNob3dUb2FzdChjb250ZW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKSkge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIityZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaWRlYmFyICYmIGUuaGFzTm90aWNlKVswXS5zaWRlYmFyKStcIiArIGRpdlwiKSB8fCBudWxsO1xuICAgICAgICAgICAgY29uc3QgZm9ybSA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiZm9ybVwiKSA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCBib3R0b20gPSBmb3JtID8gZm9ybS5vZmZzZXRIZWlnaHQgOiA4MDtcbiAgICAgICAgICAgIGNvbnN0IHRvYXN0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuY2xhc3NMaXN0LmFkZChcImJkLXRvYXN0c1wiKTtcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcImJvdHRvbVwiLCBib3R0b20rXCJweFwiKTtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpLmFwcGVuZENoaWxkKHRvYXN0V3JhcHBlcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9hc3RXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iZC10b2FzdHNcIilcbiAgICAgICAgY29uc3Qge3R5cGUgPSBcIlwiLCBpY29uID0gdHJ1ZSwgdGltZW91dCA9IDMwMDB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgdG9hc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJiZC10b2FzdFwiKTtcbiAgICAgICAgaWYgKHR5cGUpIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwidG9hc3QtXCIgKyB0eXBlKTtcbiAgICAgICAgaWYgKHR5cGUgJiYgaWNvbikgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJpY29uXCIpO1xuICAgICAgICB0b2FzdEVsZW0uaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgdG9hc3RXcmFwcGVyLmFwcGVuZENoaWxkKHRvYXN0RWxlbSk7XG4gICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgYGNhbGMoNTAlIC0gJHt0b2FzdFdyYXBwZXIub2Zmc2V0V2lkdGggLyAyfXB4KWApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiY2xvc2luZ1wiKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRvYXN0RWxlbS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuYmQtdG9hc3RzIC5iZC10b2FzdFwiKS5sZW5ndGgpIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLnJlbW92ZSgpO1xuICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGFsZXJ0KHRpdGxlLCBjb250ZW50KSB7XG4gICAgICAgIGxldCBtb2RhbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1vZGFsICYmIGUuaW5uZXIgJiYgIWUuaGlkZU9uRnVsbHNjcmVlbilbMF1cbiAgICAgICAgbGV0IGhlYWRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXG4gICAgICAgIGxldCBmb290ZXIyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuZm9jdXNMb2NrKVswXVxuICAgICAgICBjb25zdCBtb2RhbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtd3JhcHBlciB0aGVtZS1kYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtYmFja2Ryb3AgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iYWNrZHJvcCAmJiBlLmJhY2tkcm9wV2l0aExheWVyKVswXS5iYWNrZHJvcH1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbCAke21vZGFsTW9kdWxlLm1vZGFsfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPiR7dGl0bGV9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyLXdyYXAgZmFkZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbnRlbnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXIgJHtoZWFkZXJNb2R1bGUuZm9vdGVyfSAke2Zvb3RlcjJNb2R1bGUuZm9vdGVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5mb290ZXIgYnV0dG9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcbiAgICAgICAgICAgICAgICBtb2RhbC5yZW1vdmUoKTsgXG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcigpXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICB9KTtcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5iZC1iYWNrZHJvcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgXG4gICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIERPTS5xdWVyeShcIiNhcHAtbW91bnRcIikuYXBwZW5kKG1vZGFsKTtcbiAgICAgICAgY29uc3QgY2xvc2luZ0xpc3RlbmVycyA9IFtdXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxuICAgICAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2xvc2U6IChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBzaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogcGx1Z2luRXJyb3JzID0gW10sIHRoZW1lczogdGhlbWVFcnJvcnMgPSBbXX0pIHtcbiAgICAgICAgaWYgKCFwbHVnaW5FcnJvcnMgfHwgIXRoZW1lRXJyb3JzKSByZXR1cm47XG4gICAgICAgIGlmICghcGx1Z2luRXJyb3JzLmxlbmd0aCAmJiAhdGhlbWVFcnJvcnMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBtb2RhbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1vZGFsICYmIGUuaW5uZXIgJiYgIWUuaGlkZU9uRnVsbHNjcmVlbilbMF1cbiAgICAgICAgbGV0IGhlYWRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXG4gICAgICAgIGxldCBmb290ZXIyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuZm9jdXNMb2NrKVswXVxuICAgICAgICBjb25zdCBtb2RhbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtd3JhcHBlciB0aGVtZS1kYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtYmFja2Ryb3AgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iYWNrZHJvcCAmJiBlLmJhY2tkcm9wV2l0aExheWVyKVswXS5iYWNrZHJvcH1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbCBiZC1jb250ZW50LW1vZGFsICR7bW9kYWxNb2R1bGUubW9kYWx9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWlubmVyICR7bW9kYWxNb2R1bGUuaW5uZXJ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgJHtoZWFkZXJNb2R1bGUuaGVhZGVyfVwiPjxkaXYgY2xhc3M9XCJ0aXRsZVwiPkNvbnRlbnQgRXJyb3JzPC9kaXY+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhciBUT1BcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItaXRlbVwiPlBsdWdpbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItaXRlbVwiPlRoZW1lczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbmFtZVwiPk5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1tZXNzYWdlXCI+TWVzc2FnZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLWVycm9yXCI+RXJyb3I8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyLXdyYXAgZmFkZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlclwiPlxuICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyICR7aGVhZGVyTW9kdWxlLmZvb3Rlcn0gJHtmb290ZXIyTW9kdWxlLmZvb3Rlcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiPk9rYXk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7XG4gICAgXG4gICAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlVGFiKGVycm9ycykge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJlcnJvcnNcIj5gKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXJyIG9mIGVycm9ycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJlcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbmFtZVwiPiR7ZXJyLm5hbWUgPyBlcnIubmFtZSA6IGVyci5maWxlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbWVzc2FnZVwiPiR7ZXJyLm1lc3NhZ2V9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1lcnJvclwiPjxhIGNsYXNzPVwiZXJyb3ItbGlua1wiIGhyZWY9XCJcIj4ke2Vyci5lcnJvciA/IGVyci5lcnJvci5tZXNzYWdlIDogXCJcIn08L2E+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoZXJyb3IpO1xuICAgICAgICAgICAgICAgIGlmIChlcnIuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IucXVlcnlTZWxlY3RvckFsbChcImFcIikuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGBFcnJvciBkZXRhaWxzIGZvciAke2Vyci5uYW1lID8gZXJyLm5hbWUgOiBlcnIuZmlsZX0uYCwgZXJyLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgY29uc3QgdGFicyA9IFtnZW5lcmF0ZVRhYihwbHVnaW5FcnJvcnMpLCBnZW5lcmF0ZVRhYih0aGVtZUVycm9ycyldO1xuICAgIFxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKFwiLnRhYi1iYXItaXRlbVwiKS5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnRhYi1iYXItaXRlbS5zZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZCkgRE9NLnJlbW92ZUNsYXNzKHNlbGVjdGVkLCBcInNlbGVjdGVkXCIpO1xuICAgICAgICAgICAgRE9NLmFkZENsYXNzKGUudGFyZ2V0LCBcInNlbGVjdGVkXCIpO1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnNjcm9sbGVyXCIpO1xuICAgICAgICAgICAgc2Nyb2xsZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgICAgIHNjcm9sbGVyLmFwcGVuZCh0YWJzW0RPTS5pbmRleChlLnRhcmdldCldKTtcbiAgICAgICAgfSkpO1xuICAgIFxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IG1vZGFsLnJlbW92ZSgpOyB9LCAzMDApO1xuICAgICAgICB9KTtcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5iZC1iYWNrZHJvcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9kYWwucmVtb3ZlKCk7IH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLmFwcGVuZChtb2RhbCk7XG4gICAgICAgIGlmIChwbHVnaW5FcnJvcnMubGVuZ3RoKSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnRhYi1iYXItaXRlbVwiKS5jbGljaygpO1xuICAgICAgICBlbHNlIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFiLWJhci1pdGVtXCIpWzFdLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNob3dDaGFuZ2Vsb2dNb2RhbChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgTW9kYWxTdGFjayA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicHVzaFwiLCBcInVwZGF0ZVwiLCBcInBvcFwiLCBcInBvcFdpdGhLZXlcIik7XG4gICAgICAgIGNvbnN0IENoYW5nZWxvZ0NsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImZpeGVkXCIsIFwiaW1wcm92ZWRcIik7XG4gICAgICAgIGNvbnN0IFRleHRFbGVtZW50ID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUZXh0XCIpO1xuICAgICAgICBjb25zdCBGbGV4Q2hpbGQgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIkNoaWxkXCIpO1xuICAgICAgICBjb25zdCBUaXRsZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIlRhZ3NcIiwgXCJkZWZhdWx0XCIpO1xuICAgICAgICBjb25zdCBDaGFuZ2Vsb2cgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0UHJvcHMgJiYgbS5kZWZhdWx0UHJvcHMuc2VsZWN0YWJsZSA9PSBmYWxzZSk7XG4gICAgICAgIGNvbnN0IE1hcmtkb3duUGFyc2VyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJkZWZhdWx0UnVsZXNcIiwgXCJwYXJzZVwiKTtcbiAgICAgICAgaWYgKCFDaGFuZ2Vsb2cgfHwgIU1vZGFsU3RhY2sgfHwgIUNoYW5nZWxvZ0NsYXNzZXMgfHwgIVRleHRFbGVtZW50IHx8ICFGbGV4Q2hpbGQgfHwgIVRpdGxlcyB8fCAhTWFya2Rvd25QYXJzZXIpIHJldHVybjtcbiAgICBcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgaW1hZ2UgPSBcImh0dHBzOi8vcmVwb3NpdG9yeS1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzEwNTQ3MzUzNy85NTdiNTQ4MC03YzI2LTExZTktODQwMS01MGZhODIwY2JhZTVcIiwgXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IFwiXCIsIFxuICAgICAgICAgICAgY2hhbmdlcyA9IFtdLCBcbiAgICAgICAgICAgIHRpdGxlID0gXCJCYW5kYWdlZEJEXCIsIFxuICAgICAgICAgICAgc3VidGl0bGUgPSBgdiR7YmJkVmVyc2lvbn1gLCBcbiAgICAgICAgICAgIGZvb3RlclxuICAgICAgICB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgY2UgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNoYW5nZWxvZ0l0ZW1zID0gW2NlKFwiaW1nXCIsIHtzcmM6IGltYWdlfSldO1xuICAgICAgICBpZiAoZGVzY3JpcHRpb24pIGNoYW5nZWxvZ0l0ZW1zLnB1c2goY2UoXCJwXCIsIG51bGwsIE1hcmtkb3duUGFyc2VyLnBhcnNlKGRlc2NyaXB0aW9uKSkpO1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5nZXMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gY2hhbmdlc1tjXTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBDaGFuZ2Vsb2dDbGFzc2VzW2VudHJ5LnR5cGVdID8gQ2hhbmdlbG9nQ2xhc3Nlc1tlbnRyeS50eXBlXSA6IENoYW5nZWxvZ0NsYXNzZXMuYWRkZWQ7XG4gICAgICAgICAgICBjb25zdCBtYXJnaW4gPSBjID09IDAgPyBDaGFuZ2Vsb2dDbGFzc2VzLm1hcmdpblRvcCA6IFwiXCI7XG4gICAgICAgICAgICBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGNlKFwiaDFcIiwge2NsYXNzTmFtZTogYCR7dHlwZX0gJHttYXJnaW59YCx9LCBlbnRyeS50aXRsZSkpO1xuICAgICAgICAgICAgY29uc3QgbGlzdCA9IGNlKFwidWxcIiwgbnVsbCwgZW50cnkuaXRlbXMubWFwKGkgPT4gY2UoXCJsaVwiLCBudWxsLCBNYXJrZG93blBhcnNlci5wYXJzZShpKSkpKTtcbiAgICAgICAgICAgIGNoYW5nZWxvZ0l0ZW1zLnB1c2gobGlzdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVuZGVySGVhZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gY2UoRmxleENoaWxkLkNoaWxkLCB7Z3JvdzogMSwgc2hyaW5rOiAxfSxcbiAgICAgICAgICAgICAgICBjZShUaXRsZXMuZGVmYXVsdCwge3RhZzogVGl0bGVzLlRhZ3MuSDR9LCB0aXRsZSksXG4gICAgICAgICAgICAgICAgY2UoVGV4dEVsZW1lbnQse3NpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLCBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJELCBjbGFzc05hbWU6IENoYW5nZWxvZ0NsYXNzZXMuZGF0ZX0sIHN1YnRpdGxlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICBcbiAgICAgICAgY29uc3QgcmVuZGVyRm9vdGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XG4gICAgICAgICAgICBjb25zdCBBbmNob3JDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyXCIpIHx8IHthbmNob3I6IFwiYW5jaG9yLTNaLThCYlwiLCBhbmNob3JVbmRlcmxpbmVPbkhvdmVyOiBcImFuY2hvclVuZGVybGluZU9uSG92ZXItMkVTSFFCXCJ9O1xuICAgICAgICAgICAgY29uc3Qgam9pblN1cHBvcnRTZXJ2ZXIgPSAoY2xpY2spID0+IHtcbiAgICAgICAgICAgICAgICBjbGljay5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGNsaWNrLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIE1vZGFsU3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgQkRWMi5qb2luQkQyKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgc3VwcG9ydExpbmsgPSBBbmNob3IgPyBjZShBbmNob3IsIHtvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpIDogY2UoXCJhXCIsIHtjbGFzc05hbWU6IGAke0FuY2hvckNsYXNzZXMuYW5jaG9yfSAke0FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gLCBvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpO1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZvb3RlciA9IGNlKFRleHRFbGVtZW50LHtzaXplOiBUZXh0RWxlbWVudC5TaXplcy5TTUFMTCwgY29sb3I6IFRleHRFbGVtZW50LkNvbG9ycy5TVEFOREFSRH0sIFwiTmVlZCBzdXBwb3J0PyBcIiwgc3VwcG9ydExpbmspO1xuICAgICAgICAgICAgcmV0dXJuIGNlKEZsZXhDaGlsZC5DaGlsZCwge2dyb3c6IDEsIHNocmluazogMX0sIGZvb3RlciA/IGZvb3RlciA6IGRlZmF1bHRGb290ZXIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBNb2RhbFN0YWNrLnB1c2goZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBjZShDaGFuZ2Vsb2csIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogQ2hhbmdlbG9nQ2xhc3Nlcy5jb250YWluZXIsXG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvblNjcm9sbDogXyA9PiBfLFxuICAgICAgICAgICAgICAgIG9uQ2xvc2U6IF8gPT4gXyxcbiAgICAgICAgICAgICAgICByZW5kZXJIZWFkZXI6IHJlbmRlckhlYWRlcixcbiAgICAgICAgICAgICAgICByZW5kZXJGb290ZXI6IHJlbmRlckZvb3RlcixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogY2hhbmdlbG9nSXRlbXNcbiAgICAgICAgICAgIH0sIHByb3BzKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgY29uZmlybWF0aW9uIG1vZGFsIHdpdGggb3B0aW9uYWwgY29uZmlybSBhbmQgY2FuY2VsIGNhbGxiYWNrcy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UmVhY3RFbGVtZW50fEFycmF5PHN0cmluZ3xSZWFjdEVsZW1lbnQ+KX0gY2hpbGRyZW4gLSBhIHNpbmdsZSBvciBtaXhlZCBhcnJheSBvZiByZWFjdCBlbGVtZW50cyBhbmQgc3RyaW5ncy4gRXZlcnkgc3RyaW5nIGlzIHdyYXBwZWQgaW4gRGlzY29yZCdzIGBNYXJrZG93bmAgY29tcG9uZW50IHNvIHN0cmluZ3Mgd2lsbCBzaG93IGFuZCByZW5kZXIgcHJvcGVybHkuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnMgdG8gbW9kaWZ5IHRoZSBtb2RhbFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGFuZ2VyPWZhbHNlXSAtIHdoZXRoZXIgdGhlIG1haW4gYnV0dG9uIHNob3VsZCBiZSByZWQgb3Igbm90XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbmZpcm1UZXh0PU9rYXldIC0gdGV4dCBmb3IgdGhlIGNvbmZpcm1hdGlvbi9zdWJtaXQgYnV0dG9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNhbmNlbFRleHQ9Q2FuY2VsXSAtIHRleHQgZm9yIHRoZSBjYW5jZWwgYnV0dG9uXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25Db25maXJtPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgc3VibWl0IGJ1dHRvblxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ2FuY2VsPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgY2FuY2VsIGJ1dHRvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5rZXldIC0ga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGFsLiBJZiBub3QgcHJvdmlkZWQsIG9uZSBpcyBnZW5lcmF0ZWQgYW5kIHJldHVybmVkXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSB0aGUga2V5IHVzZWQgZm9yIHRoaXMgbW9kYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgTW9kYWxBY3Rpb25zID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJvcGVuTW9kYWxcIiwgXCJ1cGRhdGVNb2RhbFwiKTtcbiAgICAgICAgY29uc3QgTWFya2Rvd24gPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIk1hcmtkb3duXCIpO1xuICAgICAgICBjb25zdCBDb25maXJtYXRpb25Nb2RhbCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiQ29uZmlybU1vZGFsXCIpO1xuICAgICAgICBpZiAoIU1vZGFsQWN0aW9ucyB8fCAhQ29uZmlybWF0aW9uTW9kYWwgfHwgIU1hcmtkb3duKSByZXR1cm4gVXRpbHMuYWxlcnQodGl0bGUsIGNvbnRlbnQpO1xuXG4gICAgICAgIGNvbnN0IGVtcHR5RnVuY3Rpb24gPSAoKSA9PiB7fTtcbiAgICAgICAgY29uc3Qge29uQ29uZmlybSA9IGVtcHR5RnVuY3Rpb24sIG9uQ2FuY2VsID0gZW1wdHlGdW5jdGlvbiwgY29uZmlybVRleHQgPSBcIk9rYXlcIiwgY2FuY2VsVGV4dCA9IFwiQ2FuY2VsXCIsIGRhbmdlciA9IGZhbHNlLCBrZXkgPSB1bmRlZmluZWR9ID0gb3B0aW9ucztcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIGNvbnRlbnQgPSBbY29udGVudF07XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50Lm1hcChjID0+IHR5cGVvZihjKSA9PT0gXCJzdHJpbmdcIiA/IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChNYXJrZG93biwgbnVsbCwgYykgOiBjKTtcbiAgICAgICAgcmV0dXJuIE1vZGFsQWN0aW9ucy5vcGVuTW9kYWwocHJvcHMgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChDb25maXJtYXRpb25Nb2RhbCwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgaGVhZGVyOiB0aXRsZSxcbiAgICAgICAgICAgICAgICByZWQ6IGRhbmdlcixcbiAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogY29uZmlybVRleHQsXG4gICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogY2FuY2VsVGV4dCxcbiAgICAgICAgICAgICAgICBvbkNvbmZpcm06IG9uQ29uZmlybSxcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogb25DYW5jZWxcbiAgICAgICAgICAgIH0sIHByb3BzKSwgY29udGVudCk7XG4gICAgICAgIH0sIHttb2RhbEtleToga2V5fSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCByZW1vdmVEYSgpe1xuICAgICAgICByZXR1cm4gcmVtb3ZlRGFcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZURhKGNsYXNzTmFtZSl7XG4gICAgaWYoIWNsYXNzTmFtZSlyZXR1cm4gY2xhc3NOYW1lXG4gICAgcmV0dXJuIGNsYXNzTmFtZS5zcGxpdChcIiBcIikuZmlsdGVyKGUgPT4gIWUuc3RhcnRzV2l0aChcImRhLVwiKSkuam9pbihcIiBcIilcbn1cblxuVXRpbHMuc2hvd1RvYXN0ID0gVXRpbHMuc3VwcHJlc3NFcnJvcnMoVXRpbHMuc2hvd1RvYXN0LCBcIkNvdWxkIG5vdCBzaG93IHRvYXN0LlwiKTtcblxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlV0aWxzID0gVXRpbHMiLCJpbXBvcnQge3NldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjIge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yRGV0YWNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5XZWJwYWNrTW9kdWxlcyA9ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXEgPSB3ZWJwYWNrSnNvbnAucHVzaChbW10sIHtfX2V4dHJhX2lkX186IChtb2R1bGUsIGV4cG9ydHMsIHJlcSkgPT4gbW9kdWxlLmV4cG9ydHMgPSByZXF9LCBbW1wiX19leHRyYV9pZF9fXCJdXV0pO1xuICAgICAgICAgICAgZGVsZXRlIHJlcS5tLl9fZXh0cmFfaWRfXztcbiAgICAgICAgICAgIGRlbGV0ZSByZXEuYy5fX2V4dHJhX2lkX187XG5cbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFByb3RlY3QgPSB0aGVNb2R1bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGVNb2R1bGUucmVtb3ZlICYmIHRoZU1vZHVsZS5zZXQgJiYgdGhlTW9kdWxlLmNsZWFyICYmIHRoZU1vZHVsZS5nZXQgJiYgIXRoZU1vZHVsZS5zb3J0KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhlTW9kdWxlLmdldFRva2VuIHx8IHRoZU1vZHVsZS5nZXRFbWFpbCB8fCB0aGVNb2R1bGUuc2hvd1Rva2VuKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBwcm90ZWN0ID0gKHRoZU1vZHVsZSwgaXNEZWZhdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1vZCA9ICFpc0RlZmF1bHQgPyB0aGVNb2R1bGUuZGVmYXVsdCA6IHRoZU1vZHVsZVxuICAgICAgICAgICAgICAgIGlmKCFtb2QpcmV0dXJuIHRoZU1vZHVsZVxuICAgICAgICAgICAgICAgIGlmIChtb2QucmVtb3ZlICYmIG1vZC5zZXQgJiYgbW9kLmNsZWFyICYmIG1vZC5nZXQgJiYgIW1vZC5zb3J0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoIW1vZC5nZXRUb2tlbiAmJiAhbW9kLmdldEVtYWlsICYmICFtb2Quc2hvd1Rva2VuKXJldHVybiB0aGVNb2R1bGVcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KG1vZCwge1xuICAgICAgICAgICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwiZ2V0VG9rZW5cIiB8fCBwcm9wID09PSBcImdldEVtYWlsXCIgfHwgcHJvcCA9PT0gXCJzaG93VG9rZW5cIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBmdW5jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcImdldFRva2VuXCIgJiYgb2JqLmdldFRva2VuKSByZXR1cm4gKCkgPT4gXCJtZmEuWENuYkt6bzBDTElxZEp6Qm5MMEQ4UGZEcnVxa0pOSGp3SFh0cjM5VVUzRjhoSHg0M2pvaklTeWk1amRqTzUyZTlfZTlNam1hZlpGRnBjLXNlT01hXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcImdldEVtYWlsXCIgJiYgb2JqLmdldEVtYWlsKSByZXR1cm4gKCkgPT4gXCJwdXBwZXQxMTExMkBnbWFpbC5jb21cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwic2hvd1Rva2VuXCIgJiYgb2JqLnNob3dUb2tlbikgcmV0dXJuICgpID0+IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcIl9fcHJvdG9fX1wiICYmIG9iai5fX3Byb3RvX18pIHJldHVybiBwcm94eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9ialtmdW5jXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYoIWlzRGVmYXVsdCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGVNb2R1bGUsIHtkZWZhdWx0OiBwcm94eX0pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgZmluZCA9IChmaWx0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gcmVxLmNbaV0uZXhwb3J0cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIHJldHVybiBwcm90ZWN0KG0uZGVmYXVsdCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiBmaWx0ZXIobSkpXHRyZXR1cm4gcHJvdGVjdChtLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiQ2Fubm90IGZpbmQgbG9hZGVkIG1vZHVsZSBpbiBjYWNoZVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgbW9kdWxlcy5wdXNoKHByb3RlY3QobS5kZWZhdWx0LCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKHByb3RlY3QobSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlcztcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeVVuaXF1ZVByb3BlcnRpZXMgPSAocHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xuICAgICAgICAgICAgY29uc3QgZmluZEJ5UHJvdG90eXBlcyA9IChwcm90b05hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUucHJvdG90eXBlICYmIHByb3RvTmFtZXMuZXZlcnkocHJvdG9Qcm9wID0+IG1vZHVsZS5wcm90b3R5cGVbcHJvdG9Qcm9wXSAhPT0gdW5kZWZpbmVkKSk7XG4gICAgICAgICAgICBjb25zdCBmaW5kQnlEaXNwbGF5TmFtZSA9IChkaXNwbGF5TmFtZSkgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLmRpc3BsYXlOYW1lID09PSBkaXNwbGF5TmFtZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7ZmluZCwgZmluZEFsbCwgZmluZEJ5VW5pcXVlUHJvcGVydGllcywgZmluZEJ5UHJvdG90eXBlcywgZmluZEJ5RGlzcGxheU5hbWV9O1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIHRoaXMuaW50ZXJuYWwgPSB7XG4gICAgICAgICAgICByZWFjdDogdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIkNvbXBvbmVudFwiLCBcIlB1cmVDb21wb25lbnRcIiwgXCJDaGlsZHJlblwiLCBcImNyZWF0ZUVsZW1lbnRcIiwgXCJjbG9uZUVsZW1lbnRcIl0pLFxuICAgICAgICAgICAgcmVhY3REb206IHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJmaW5kRE9NTm9kZVwiXSlcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRJbnRlcm5hbEluc3RhbmNlID0gZSA9PiBlW09iamVjdC5rZXlzKGUpLmZpbmQoayA9PiBrLnN0YXJ0c1dpdGgoXCJfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZVwiKSldO1xuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVjIgPSB0aGlzXG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZSgpIHtcblxuICAgIH1cblxuICAgIGpvaW5CRDEoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCIwVG1mbzVaYk9SQ1JxYkFkXCIpO31cbiAgICBsZWF2ZUJEMSgpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiODYwMDQ3NDQ5NjY5MTQwNDhcIik7fVxuXG4gICAgam9pbkJEMigpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcIjJIU2NtOGpcIik7fVxuICAgIGxlYXZlQkQyKCkge3RoaXMuR3VpbGRBY3Rpb25zLmxlYXZlR3VpbGQoXCIyODA4MDY0NzI5MjgxOTg2NTZcIik7fVxuXG4gICAgam9pbkxDKCkge3RoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKFwiN2VGZmYyQVwiKTt9XG4gICAgbGVhdmVMQygpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiNzA1OTA4MzUwMjE4NjY2MTE3XCIpO31cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3R9XG4gICAgICovXG4gICAgZ2V0IHJlYWN0KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0O31cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxuICAgICAqL1xuICAgIGdldCBSZWFjdCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdDt9XG4gICAgLyoqXG4gICAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdC1kb21cIil9XG4gICAgICovXG4gICAgZ2V0IHJlYWN0RG9tKCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0RG9tO31cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0LWRvbVwiKX1cbiAgICAgKi9cbiAgICBnZXQgUmVhY3REb20oKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3REb207fVxuICAgIC8qKlxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxuICAgICAqL1xuICAgIGdldCByZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdC5Db21wb25lbnQ7fVxuICAgIC8qKlxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxuICAgICAqL1xuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdC5Db21wb25lbnQ7fVxuXG4gICAgZ2V0IGFuY2hvckNsYXNzZXMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyXCJdKSB8fCB7YW5jaG9yOiBcImFuY2hvci0zWi04QmJcIiwgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwifTt9XG4gICAgZ2V0IHNsYXRlRWRpdG9yQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNsYXRlVGV4dEFyZWFcIl0pO31cbiAgICBnZXQgbWVzc2FnZUNsYXNzZXMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJtZXNzYWdlXCIsIFwiY29udGFpbmVyQ296eVwiXSk7fVxuICAgIGdldCBndWlsZENsYXNzZXMoKSB7XG5cdFx0Y29uc3QgZ3VpbGRzV3JhcHBlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLndyYXBwZXIgJiYgZS51bnJlYWRNZW50aW9uc0JhcilbMF07XG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmd1aWxkc0Vycm9yICYmIGUuc2VsZWN0ZWQpWzBdXG4gICAgICAgIGNvbnN0IHBpbGwgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ibG9iQ29udGFpbmVyKVswXVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcblx0fVxuXG4gICAgZ2V0IE1lc3NhZ2VDb250ZW50Q29tcG9uZW50KCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShcImRpc2FibGVCdXR0b25zXCIpKTt9XG4gICAgZ2V0IE1lc3NhZ2VDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTWVzc2FnZVwiKTt9XG4gICAgZ2V0IFRpbWVGb3JtYXR0ZXIoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJkYXRlRm9ybWF0XCJdKTt9XG4gICAgZ2V0IFRvb2x0aXBXcmFwcGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVG9vbHRpcFwiKTt9XG4gICAgZ2V0IE5hdGl2ZU1vZHVsZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNldEJhZGdlXCJdKTt9XG4gICAgZ2V0IEludml0ZUFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhY2NlcHRJbnZpdGVcIl0pO31cbiAgICBnZXQgR3VpbGRBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wibGVhdmVHdWlsZFwiXSk7fVxuICAgIGdldCBUb29sdGlwcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5oaWRlICYmIG0uc2hvdyAmJiAhbS5zZWFyY2ggJiYgIW0uc3VibWl0ICYmICFtLnNlYXJjaCAmJiAhbS5hY3RpdmF0ZVJhZ2luZ0RlbW9uICYmICFtLmRpc21pc3MpO31cbiAgICBnZXQgS2V5R2VuZXJhdG9yKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLnRvU3RyaW5nICYmIC9cImJpbmFyeVwiLy50ZXN0KG0udG9TdHJpbmcoKSkpO31cbiAgICBnZXQgTGF5ZXJTdGFjaygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInBvcExheWVyXCJdKTt9XG4gICAgZ2V0IFVzZXJTdG9yZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldEN1cnJlbnRVc2VyXCJdKTt9XG4gICAgZ2V0IENoYW5uZWxTdG9yZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldENoYW5uZWxcIl0pO31cbiAgICBnZXQgQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJvcGVuUHJpdmF0ZUNoYW5uZWxcIl0pO31cbiAgICBnZXQgUHJpdmF0ZUNoYW5uZWxBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2VsZWN0UHJpdmF0ZUNoYW5uZWxcIl0pO31cblxuICAgIG9wZW5ETSh1c2VySWQpIHtcbiAgICAgICAgY29uc3Qgc2VsZklkID0gdGhpcy5Vc2VyU3RvcmUuZ2V0Q3VycmVudFVzZXIoKS5pZDtcbiAgICAgICAgaWYgKHNlbGZJZCA9PSB1c2VySWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgcHJpdmF0ZUNoYW5uZWxJZCA9IHRoaXMuQ2hhbm5lbFN0b3JlLmdldERNRnJvbVVzZXJJZCh1c2VySWQpO1xuICAgICAgICBpZiAocHJpdmF0ZUNoYW5uZWxJZCkgcmV0dXJuIHRoaXMuUHJpdmF0ZUNoYW5uZWxBY3Rpb25zLnNlbGVjdFByaXZhdGVDaGFubmVsKHByaXZhdGVDaGFubmVsSWQpO1xuICAgICAgICB0aGlzLkNoYW5uZWxBY3Rpb25zLm9wZW5Qcml2YXRlQ2hhbm5lbChzZWxmSWQsIHVzZXJJZCk7XG4gICAgfVxuXG4gICAgcGFyc2VTZXR0aW5ncyhjYXQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nba2V5XTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmNhdCA9PT0gY2F0ICYmIHNldHRpbmcuaW1wbGVtZW50ZWQgJiYgIXNldHRpbmcuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNldHRpbmcpO1xuICAgICAgICAgICAgfSByZXR1cm4gYXJyO1xuICAgICAgICB9LCBbXSk7XG4gICAgfVxuXG59OyIsImltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcblxuY29uc3Qgc3R5bGUgPSBgXG4gICAgLmNvbnRhaW5lci0yUmwwMXUge1xuICAgICAgICBkaXNwbGF5OiBub25lIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAuY2hhdC0zYlJ4eHUge1xuICAgICAgICBkaXNwbGF5OiBub25lIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAuc2lkZWJhci0ySzhwRmgge1xuICAgICAgICBmbGV4LWdyb3c6IDEhaW1wb3J0YW50O1xuICAgIH1cbmA7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWb2ljZU1vZGUge1xuICAgIHN0YXJ0KCkge1xuICAgICAgICBET00uYWRkU3R5bGUoXCJWb2ljZU1vZGVcIiwgc3R5bGUpO1xuICAgIH1cblxuICAgIHN0b3AoKSB7XG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcIlZvaWNlTW9kZVwiKTtcbiAgICB9XG59OyIsImNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XG5kZWxldGUgcmVxLm0uX19leHRyYV9pZF9fO1xuZGVsZXRlIHJlcS5jLl9fZXh0cmFfaWRfXztcbmNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XG4gICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XG4gICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XG4gICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSByZXR1cm4gbS5kZWZhdWx0O1xuICAgICAgICAgICAgaWYgKG0gJiYgZmlsdGVyKG0pKVx0cmV0dXJuIG07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS53YXJuKFwiQ2Fubm90IGZpbmQgbG9hZGVkIG1vZHVsZSBpbiBjYWNoZVwiKTtcbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xuICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgbW9kdWxlcy5wdXNoKG0uZGVmYXVsdCk7XG4gICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKG0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtb2R1bGVzO1xufTtcblxuY29uc3QgZmluZEJ5UHJvcHMgPSAoLi4ucHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xuY29uc3QgZmluZEJ5UHJvdG90eXBlcyA9ICguLi5wcm90b05hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUucHJvdG90eXBlICYmIHByb3RvTmFtZXMuZXZlcnkocHJvdG9Qcm9wID0+IG1vZHVsZS5wcm90b3R5cGVbcHJvdG9Qcm9wXSAhPT0gdW5kZWZpbmVkKSk7XG5jb25zdCBmaW5kQnlEaXNwbGF5TmFtZSA9IChkaXNwbGF5TmFtZSkgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLmRpc3BsYXlOYW1lID09PSBkaXNwbGF5TmFtZSk7XG5cbmxldCBtb2QgPSAge2ZpbmQsIGZpbmRBbGwsIGZpbmRCeVByb3BzLCBmaW5kQnlQcm90b3R5cGVzLCBmaW5kQnlEaXNwbGF5TmFtZX07XG5leHBvcnQgZGVmYXVsdCBtb2Rcblxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLldlYnBhY2tNb2R1bGVzID0gbW9kIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHRjb3JkTG9nbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2OCAxNjguNjlcIiB7Li4ucHJvcHN9IGhlaWdodD1cIjEwMCVcIiB3aWR0aD17cHJvcHMuc2l6ZX0+XG4gICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInByZWZpeF9fYVwiIHgxPXs2Ni43fSB5MT17LTQ4Ny43fSB4Mj17NjYuN30geTI9ey01MDguNzN9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UzMDYxM1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2JcIiB4MT17MTAxLjd9IHkxPXstNDg3Ljd9IHgyPXsxMDEuN30geTI9ey01MDguNzN9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UyMDYxM1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2NcIiB4MT17ODR9IHkxPXstNDA4fSB4Mj17ODR9IHkyPXstNTc2LjY5fSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMzA2MTNcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXsxfSBzdG9wQ29sb3I9XCIjNzMxYTEzXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cbiAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIiNmZmZcIiBkPVwiTTE0LjkgMzUuM2gxMzkuMlYxMzNIMTQuOXpcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNjYuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19hKVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMDEuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19iKVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDB2MTY4bDE2OCAuNjlWMHptMTExLjMgMTI0LjFzLTMuNC00LjEtNi4zLTcuN2MxMi42LTMuNSAxNy40LTExLjMgMTcuNC0xMS4zYTUyLjUyIDUyLjUyIDAgMDEtMTEuMSA1LjYgNjguNjMgNjguNjMgMCAwMS0zOC45IDQgNzAuMTIgNzAuMTIgMCAwMS0xNC4xLTQuMSA0OC44OCA0OC44OCAwIDAxLTcuMS0zLjNjLS4zLS4yLS42LS4zLS45LS41YS43Ni43NiAwIDAwLS40LS4yYy0xLjctMS0yLjYtMS42LTIuNi0xLjZzNC42IDcuNiAxNi44IDExLjJjLTIuOSAzLjYtNi40IDcuOS02LjQgNy45LTIxLjItLjYtMjkuMy0xNC41LTI5LjMtMTQuNSAwLTMwLjYgMTMuOC01NS40IDEzLjgtNTUuNCAxMy44LTEwLjMgMjYuOS0xMCAyNi45LTEwbDEgMS4xQzUyLjggNTAuMyA0NSA1Ny45IDQ1IDU3LjlhNTYuMiA1Ni4yIDAgMDE1LjctMi43IDcyLjE5IDcyLjE5IDAgMDEyMS44LTYgOC43NSA4Ljc1IDAgMDExLjYtLjIgODkuMSA4OS4xIDAgMDExOS40LS4yIDc4LjQ1IDc4LjQ1IDAgMDEyOC45IDkuMXMtNy41LTcuMi0yMy45LTEyLjFsMS4zLTEuNXMxMy4xLS4zIDI2LjkgMTBjMCAwIDEzLjggMjQuOCAxMy44IDU1LjQuMS0uMS04IDEzLjgtMjkuMiAxNC40elwiIGZpbGw9XCJ1cmwoI3ByZWZpeF9fYylcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgIClcbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVnSHVudGVyQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpe1xuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDMxLjMgMjkuNVwiIHsuLi5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjggMXMxMiA4LjIgNy40IDE5LjdTMTYuNiAyOSAyMCAyNS42cy00LTUuNi04LjctMTBMMjIuOCAxXCIgZmlsbD1cInJnYmEoMjI3LDYsMTksLjYpXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjEgMTIuM2MtMi41IDMuMi02LjEgNC44LTguOSA0LjNMMy42IDI4LjhjLS43LjktMS45IDEtMi44LjMtLjktLjctMS0xLjktLjQtMi44TDEwIDE0LjFjLTEuMy0yLjUtLjYtNi40IDItOS43IDMuMi00IDgtNS41IDEwLjgtMy40czIuNCA3LjItLjcgMTEuM3pcIiBmaWxsPVwiI2UzMDYxM1wiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgKVxuICAgIH0gXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2lyY3VzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKXtcbiAgICAgICAgcmV0dXJuICg8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDM2IDM2XCIgIHsuLi50aGlzLnByb3BzLnN2Z30gaGVpZ2h0PVwiMTAwJVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjREQyRTQ0XCJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0zMyAzM2EyIDIgMCAwMS0yIDJINWEyIDIgMCAwMS0yLTJsMS0xMmgyOGwxIDEyelwiXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0VBNTk2RVwiXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTMgMzVjLS43OTItMS44NzUtMS43NS0zLjI5MS0zLjQxNy00LjY2NiAxLjc1LTEuNDU5IDQuNTQyLTUuNSA1LjI1LTguMjkyczIuNzUgOC4xMjUgMi4wNDIgMTAuNjI1UzEzIDM1IDEzIDM1em0xMC4zMDMgMGMuNzkxLTEuODc1IDEuNzUtMy4yOTEgMy40MTYtNC42NjYtMS43NS0xLjQ1OS00LjU0MS01LjUtNS4yNS04LjI5Mi0uNzA3LTIuNzkyLTIuNzUgOC4xMjUtMi4wNCAxMC42MjUuNzA4IDIuNSAzLjg3NCAyLjMzMyAzLjg3NCAyLjMzM3pcIlxuICAgICAgICAgICAgICAgID48L3BhdGg+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNCRTE5MzFcIlxuICAgICAgICAgICAgICAgICAgICBkPVwiTTMuNzI4IDI0LjI2M0EyLjUgMi41IDAgMDA4IDIyLjVjMC0uNTY1LS4xOTUtMS4wODEtLjUxMS0xLjVINGwtLjI3MiAzLjI2M3ptMjguNTQ0IDBMMzIgMjFoLTMuNDg5QTIuNDgyIDIuNDgyIDAgMDAyOCAyMi41YTIuNSAyLjUgMCAwMDQuMjcyIDEuNzYzelwiXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTRcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyMlwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjZcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjMgMzVIMTNzMi02IDItMTNoNmMwIDcgMiAxMyAyIDEzek0xNyAyaDJ2N2gtMnpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM1NUFDRUVcIlxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE4LjgzOC4yMDZDMTcuNjY3LjA0MiAxNyAuMzE4IDE3IDEuNDE4djFjMCAxLjEuODY1IDEuNzUzIDEuOTIzIDEuNDUxbDUuMTU0LS45MDFjMS43MTUtLjM0MyAxLjU0OC0xLjU5My4wODUtMS44ODRMMTguODM4LjIwNnpcIlxuICAgICAgICAgICAgICAgID48L3BhdGg+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNDQ0Q2RERcIlxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE4IDZsLS4wODEuMTIzQzEwLjkzOCAxNi45ODEgMyAxNS4wMTUgMyAxOXYyLjVhMi41IDIuNSAwIDAwNC45NS41SDEyYTIgMiAwIDAwNCAwaDRhMiAyIDAgMDA0IDBoNC4wNWEyLjUgMi41IDAgMDA0Ljk1LS41VjE5YzAtNC04LTItMTUtMTN6XCJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICAgICAgICAgIDxnIGZpbGw9XCIjRjVGOEZBXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuOTQ4IDYuMDc4bC0uMDMuMDQ1QzE3LjEzMiAxMS42MTkgMTAuODExIDE2LjEyNiA4IDE4djRhMiAyIDAgMDA0IDB2LTRjLjk4Mi0uOTgyIDUuODEzLTYuNzg3IDUuOTg0LTExLjczMi0uMDEtLjA2NC0uMDI3LS4xMjYtLjAzNi0uMTl6bS4wOC4zOThDMTguMzI0IDExLjM3NCAyMy4wMzEgMTcuMDMxIDI0IDE4djRhMiAyIDAgMDA0IDB2LTRjLTIuNzUtMS44MzMtOC45NTMtNi4xOS05Ljk3Mi0xMS41MjR6XCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3Ljk4NCA2LjI3QzE3LjkyMiA4LjM0NiAxNy42MDYgMTYuMzk0IDE2IDE4djRhMiAyIDAgMDA0IDB2LTRjLTEuNTY0LTEuNTY0LTEuOTA1LTkuMjQxLTEuOTc5LTExLjU1OS0uMDExLS4wNTctLjAyNy0uMTEzLS4wMzctLjE3MXpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgIClcbiAgICB9IFxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgVjJDX1NldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xuXG4vKipcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3RcIil9XG4gKi9cbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcblxubGV0IG1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdXG5sZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxubGV0IHNpemVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdXG5sZXQgc2Nyb2xsYmFyTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdXG5jb25zdCBHdWlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcylbMF0uZGVmYXVsdFxuY29uc3QgcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0UmVsYXRpb25zaGlwcylbMF0uZGVmYXVsdFxuY29uc3Qgc2Vzc2lvbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFNlc3Npb25zKVswXS5kZWZhdWx0XG5jb25zdCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHRcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0FjY291bnRJbmZvcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgaWYoIW1hcmdpbk1vZHVsZTIpbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF1cbiAgICAgICAgaWYoIWNvbG9yTW9kdWxlKWNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF1cbiAgICAgICAgaWYoIXNpemVNb2R1bGUpc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiQWNjb3VudCBJbmZvc1wiLz4sXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XG4gICAgICAgICAgICAgICAgICAgIFByb2ZpbGVcbiAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFByb2ZpbGVWYWx1ZSgpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XG4gICAgICAgICAgICAgICAgICAgIFN0YXRpc3RpY3NcbiAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFN0YXRpc3RpY3MoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxuICAgICAgICAgICAgICAgICAgICBDb25uZWN0ZWQgU2Vzc2lvbnNcbiAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFNlc3Npb25WYWx1ZSgpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxuICAgICAgICAgICAgPC9kaXY+LFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXS5tYXJnaW5Cb3R0b20yMH0+PC9kaXY+XG4gICAgICAgIF1cbiAgICB9XG5cbiAgICBnZXRTZXNzaW9uVmFsdWUoKXtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbnNSYXcgPSBzZXNzaW9uTW9kdWxlLmdldFNlc3Npb25zKClcbiAgICAgICAgY29uc3Qgc2Vzc2lvbnMgPSBPYmplY3Qua2V5cyhzZXNzaW9uc1JhdykuZmlsdGVyKGUgPT4gZSAhPT0gXCJhbGxcIikubWFwKGUgPT4gc2Vzc2lvbnNSYXdbZV0pXG5cbiAgICAgICAgaWYoc2Vzc2lvbnMubGVuZ3RoID09PSAwKXJldHVybiBcIi0gTm8gc2Vzc2lvbiBkZXRlY3RlZC4gUGxlYXNlIHRyeSBpbiBhIGZldyBzZWNvbmRzXCJcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBzZXNzaW9ucy5tYXAoZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYCsgaWQ6ICR7ZS5zZXNzaW9uSWR9XG4rIG9zOiAke2UuY2xpZW50SW5mby5vc1swXS50b1VwcGVyQ2FzZSgpK2UuY2xpZW50SW5mby5vcy5zbGljZSgxKX1cbisgY2xpZW50OiAke2UuY2xpZW50SW5mby5jbGllbnR9XG4rIHN0YXR1czogJHtlLnN0YXR1c31cbisgQWN0aXZpdGllczogJHtlLmFjdGl2aXRpZXMubGVuZ3RofWBcbiAgICAgICAgfSkuam9pbihcIlxcblwiK1wiLVwiLnJlcGVhdCgzOCkrXCJcXG5cIilcbiAgICB9XG5cbiAgICBnZXRQcm9maWxlVmFsdWUoKXtcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZ2V0Q3VycmVudFVzZXIoKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge0RhdGV9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSB1c2VyLmNyZWF0ZWRBdFxuXG4gICAgICAgIGxldCBhdmF0YXJVUkwgPSB1c2VyLmF2YXRhclVSTFxuICAgICAgICBpZih1c2VyLmF2YXRhciAmJiB1c2VyLmF2YXRhci5zdGFydHNXaXRoKFwiYV9cIikpe1xuICAgICAgICAgICAgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwoXCJnaWZcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGF2YXRhclVSTC5zdGFydHNXaXRoKFwiL1wiKSl7XG4gICAgICAgICAgICBhdmF0YXJVUkwgPSBcImh0dHBzOi8vZGlzY29yZC5jb21cIithdmF0YXJVUkxcbiAgICAgICAgfVxuICAgICAgICBpZihhdmF0YXJVUkwuZW5kc1dpdGgoXCI/c2l6ZT0xMjhcIikpe1xuICAgICAgICAgICAgYXZhdGFyVVJMID0gYXZhdGFyVVJMLnJlcGxhY2UoXCI/c2l6ZT0xMjhcIiwgXCI/c2l6ZT00MDk2XCIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCsgVXNlcm5hbWU6ICR7dXNlci51c2VybmFtZX1cbisgRGlzY3JpbWluYXRvcjogJHt1c2VyLmRpc2NyaW1pbmF0b3J9XG4rIFRhZzogJHt1c2VyLnRhZ31cbisgSUQ6ICR7dXNlci5pZH1cbisgQXZhdGFyOiAke3VzZXIuYXZhdGFyfVxuKyBBdmF0YXIgVVJMOiAke2F2YXRhclVSTH1cbisgQ3JlYXRpb24gRGF0ZTogJHsoY3JlYXRlZEF0LmdldERhdGUoKSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9LyR7KGNyZWF0ZWRBdC5nZXRNb250aCgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfS8keyhjcmVhdGVkQXQuZ2V0RnVsbFllYXIoKSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9ICR7Y3JlYXRlZEF0LmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9aCAke2NyZWF0ZWRBdC5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9bWluICR7Y3JlYXRlZEF0LmdldFNlY29uZHMoKX1zXG4rIEZsYWdzOiAke3VzZXIuZmxhZ3N9XG4rIEhhcyBOaXRybzogJHt1c2VyLmhhc1ByZW1pdW1TdWJzY3JpcHRpb24gPyBcIlllc1wiIDogXCJOb1wifVxuLSBFbWFpbDogJHt1c2VyLmVtYWlsfVxuLSAyRkE6ICR7dXNlci5tZmFFbmFibGVkID8gXCJZZXNcIiA6IFwiTm9cIn1cbi0gSGFzIEJlZW4gT24gTW9iaWxlOiAke3VzZXIubW9iaWxlID8gXCJZZXNcIiA6IFwiTm9cIn1cbi0gUGhvbmU6ICR7dXNlci5waG9uZSB8fCBcIk5vbmVcIn1cbi0gVmVyaWZpZWQ6ICR7dXNlci52ZXJpZmllZH1cbi0gQ2FuIFNlZSBOU0ZXIENoYW5uZWxzOiAke3VzZXIubnNmd0FsbG93ZWR9YDtcbiAgICB9XG5cbiAgICBnZXRTdGF0aXN0aWNzKCl7XG5cbiAgICAgICAgY29uc3QgZ3VpbGRzID0gT2JqZWN0LnZhbHVlcyhHdWlsZE1vZHVsZS5nZXRHdWlsZHMoKSlcbiAgICAgICAgY29uc3QgcmVsYXRpb25zID0gT2JqZWN0LmtleXMocmVsYXRpb25TaGlwTW9kdWxlLmdldFJlbGF0aW9uc2hpcHMoKSlcbiAgICAgICAgY29uc3QgZnJpZW5kcyA9IHJlbGF0aW9ucy5maWx0ZXIoZSA9PiByZWxhdGlvblNoaXBNb2R1bGUuaXNGcmllbmQoZSkpXG4gICAgICAgIGNvbnN0IGJsb2NrZWQgPSByZWxhdGlvbnMuZmlsdGVyKGUgPT4gcmVsYXRpb25TaGlwTW9kdWxlLmlzQmxvY2tlZChlKSlcblxuICAgICAgICByZXR1cm4gYCsgU2VydmVyIENvdW50OiAke2d1aWxkcy5sZW5ndGh9IHNlcnZlcnNcbisgUmVsYXRpb25zOiAke3JlbGF0aW9ucy5sZW5ndGh9IHJlbGF0aW9uc1xuKyBGcmllbmRzIENvdW50OiAke2ZyaWVuZHMubGVuZ3RofSBmcmllbmRzXG4tIEJsb2NrZWQgVXNlcnMgQ291bnQ6ICR7YmxvY2tlZC5sZW5ndGh9IGJsb2NrZWQgdXNlcnNgXG4gICAgfVxufVxuXG5cbmxldCBoaWdodGxpZ2h0SlMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oaWdobGlnaHQpWzBdXG5sZXQgbWVzc2FnZU1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdXG5sZXQgbWVzc2FnZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tZXNzYWdlQ29udGVudClbMF1cblxuY2xhc3MgQ29kZUNvbnRlbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpe1xuICAgICAgICBpZighbWVzc2FnZU1vZHVsZTEpbWVzc2FnZU1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdXG4gICAgICAgIGlmKCFtZXNzYWdlTW9kdWxlMiltZXNzYWdlTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lc3NhZ2VDb250ZW50KVswXVxuICAgICAgICBpZighc2Nyb2xsYmFyTW9kdWxlMSlzY3JvbGxiYXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF1cbiAgICAgICAgaWYoIWhpZ2h0bGlnaHRKUyloaWdodGxpZ2h0SlMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5saXN0TGFuZ3VhZ2VzKVswXVxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e2Ake21lc3NhZ2VNb2R1bGUxLm1hcmt1cH0gJHttZXNzYWdlTW9kdWxlMi5tZXNzYWdlQ29udGVudH1gfT5cbiAgICAgICAgICAgIDxwcmU+XG4gICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9e2Ake3Njcm9sbGJhck1vZHVsZTEuc2Nyb2xsYmFyR2hvc3RIYWlybGluZX0gaGxqc2B9IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBoaWdodGxpZ2h0SlMuaGlnaGxpZ2h0KHRoaXMucHJvcHMubGFuZ3VhZ2UsIHRoaXMucHJvcHMuY29udGVudCkudmFsdWV9fT5cblxuICAgICAgICAgICAgICAgIDwvY29kZT5cbiAgICAgICAgICAgIDwvcHJlPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTgpWzBdLm1hcmdpbkJvdHRvbTh9PjwvZGl2PlxuICAgICAgICA8L2Rpdj4pXG4gICAgfVxufSIsIi8vIEdvb2QgbHVjayB0byByZWFkIG15IGNvZGUsIEV2ZW4gbWUgY2FuJ3QgcmVhZCBpdCBwcm9wZXJseS5cblxuaW1wb3J0IHsgc3RhdCB9IGZyb20gXCJmc1wiXG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi4vbW9kdWxlcy9kaXN0YW50XCJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiXG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIlxuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi9tYXJnaW50b3BcIlxuXG5sZXQgZm9ybU1vZHVsZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpUHJldmlldyBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cylcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHN0YXRlczogW11cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBpZighZm9ybU1vZHVsZSlmb3JtTW9kdWxlID0gd2VicGFja01vZHVsZXMuZmluZChlID0+IGUuRm9ybVNlY3Rpb24pXG4gICAgICAgIC8qKiBcbiAgICAgICAgICogQHR5cGUge0Z1bmN0aW9uW119XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBhbGxDb21wb25lbnRzID0gWy4uLm5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cykubWFwKGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV0pLm1hcChrID0+IHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV1ba10pXG4gICAgICAgIH0pLmZsYXQoKSldXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICA8Zm9ybU1vZHVsZS5Gb3JtU2VjdGlvbiB0YWc9XCJoMlwiIHRpdGxlPVwiTGlnaHRjb3JkJ3MgQXBpIEF2YWlsbGFibGUgY29tcG9uZW50c1wiPlxuICAgICAgICAgICAgICAgIDxmb3JtTW9kdWxlLkZvcm1UZXh0IHR5cGU9XCJkZXNjcmlwdGlvblwiIGNsYXNzTmFtZT1cIlwiIHNlbGVjdGFibGU9e2ZhbHNlfT5cbiAgICAgICAgICAgICAgICAgICAgVGhlc2UgY29tcG9uZW50cyBhcmUgaGVyZSBmb3IgdGhlIHBsdWdpbiBkZXZzLiBUaGV5IGNhbiBxdWlja2x5IGVtYmVkIGFueSBjb21wb25lbnQgYmVsb3cgd2l0aCB0aGlzIHBhbmVsLlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7bWFyZ2luVG9wOiBcIjIwcHhcIn19PjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cImluZm9cIj5BbGwgdGhlc2UgY29tcG9uZW50cyBoYXZlIGVycm9yIGhhbmRsaW5nLiBJZiB5b3Ugd2FudCBub25lLCBhZGQgYC5vcmlnaW5hbGAgYWZ0ZXIgdGhlIGNvbXBvbmVudCBwYXRoLjwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+XG4gICAgICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwid2FyblwiPldlIGRvIG5vdCByZWNvbW1lbmQgbW9kaWZ5aW5nIHRoZXNlIGNvbXBvbmVudCB3aXRoIHBsdWdpbnMuIE9ubHkgZG8gdGhpcyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD5cbiAgICAgICAgICAgICAgICA8L2Zvcm1Nb2R1bGUuRm9ybVRleHQ+XG4gICAgICAgICAgICAgICAgPE1hcmdpblRvcD48L01hcmdpblRvcD5cbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gY29sb3I9XCJicmFuZFwiIGxvb2s9XCJvdXRsaW5lZFwiIHNpemU9XCJtZWRpdW1cIiBob3ZlckNvbG9yPVwiZ3JlZW5cIiBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoXCJodHRwczovL2xpZ2h0Y29yZC5kZXJva3UueHl6L0xpZ2h0Y29yZEFwaS9kb2NzXCIpXG4gICAgICAgICAgICAgICAgfX0gd3JhcHBlcj17ZmFsc2V9PlxuICAgICAgICAgICAgICAgICAgICBEb2N1bWVudGF0aW9uXG4gICAgICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cbiAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtU2VjdGlvbj4sXG4gICAgICAgICAgICBhbGxDb21wb25lbnRzLm1hcChjb21wID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wTmFtZSA9IGNvbXAuZGlzcGxheU5hbWUgfHwgY29tcC5uYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcFBhdGggPSBgTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLiR7T2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cykuZmluZChlID0+IHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV1bY29tcE5hbWVdKX0uJHtjb21wTmFtZX1gXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxDb21wb25lbnRQcmV2aWV3IGtleT17Y29tcFBhdGh9IGNvbXA9e2NvbXB9IC8+XG4gICAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgfVxuXG4gICAgZ2V0IHJlbmRlcnMoKXtcblxuICAgIH1cbn1cblxuY2xhc3MgQ29tcG9uZW50UHJldmlldyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcylcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHRhYjogXCJwcmV2aWV3XCIsXG4gICAgICAgICAgICBlbGVtOiBwcm9wcy5jb21wLFxuICAgICAgICAgICAgb3B0aW9uczoge31cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBjb25zdCBjb21wID0gdGhpcy5wcm9wcy5jb21wXG4gICAgICAgIGxldCBBbGxQcmV2aWV3cyA9IFtdXG4gICAgICAgIGlmKGNvbXAuQWxsUHJldmlld3MpQWxsUHJldmlld3MgPSBjb21wLkFsbFByZXZpZXdzXG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVcbiAgICAgICAgbGV0IGdldFByb3BzID0gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGZpbmFsID0ge31cbiAgICAgICAgICAgIEFsbFByZXZpZXdzLmZvckVhY2goY2F0ZWdvcnkgPT4ge1xuICAgICAgICAgICAgICAgIGZpbmFsW09iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXV0gPSBjYXRlZ29yeVswXVtPYmplY3Qua2V5cyhjYXRlZ29yeVswXSlbMF1dXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc3RhdGUub3B0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGZpbmFsW2tleV0gPSBBbGxQcmV2aWV3cy5maW5kKGUgPT4gZS5maW5kKGUgPT4gZVtrZXldKSlbc3RhdGUub3B0aW9uc1trZXldXVtrZXldXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlbmRlclByZXZpZXcgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gPGRpdiBzdHlsZT17e21hcmdpbjogXCIyMHB4XCJ9fT5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCJcbiAgICAgICAgICAgICAgICB9fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxuICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudChjb21wLCBnZXRQcm9wcygpKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIGxldCByZW5kZXJDb2RlID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIDxkaXYgc3R5bGU9e3ttYXJnaW46IFwiMjBweFwifX0+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsIFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXG4gICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPVwibGMtdGFiLWJveC1zaGFkb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICBKU1hcbiAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkVycm9yQ2F0Y2hlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5Db2RlQmxvY2sgbGFuZ3VhZ2U9XCJqc3hcIiBjb250ZW50PXtnZW5lcmF0ZUNvZGUoXCJqc3hcIil9Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPiAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFjdFxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuRXJyb3JDYXRjaGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAge1JlYWN0LmNyZWF0ZUVsZW1lbnQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzXCIgY29udGVudD17Z2VuZXJhdGVDb2RlKFwicmVhY3RcIil9Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBsZXQgZ2V0U3RyRm9yUHJvcCA9ICh2YWx1ZSwgY29tcFBhdGgsIGxhbmcpID0+IHtcbiAgICAgICAgICAgIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpe1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXG4gICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpe1xuICAgICAgICAgICAgICAgIGlmKHZhbHVlICYmIHZhbHVlLiQkdHlwZW9mICYmICh2YWx1ZS4kJHR5cGVvZiA9PT0gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIikgfHwgdmFsdWUuJCR0eXBlb2YgPT09IDB4ZWFjNykpe1xuICAgICAgICAgICAgICAgICAgICBpZihjb21wUGF0aCA9PT0gXCJMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYobGFuZyA9PT0gXCJyZWFjdFwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge3N0eWxlOiB7XG5tYXJnaW5Ub3A6IFwiMjBweFwiLCBtYXJnaW5Cb3R0b206IFwiMjBweFwiXG59fSxcblJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge3N0eWxlOiB7XG5iYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsXG5wYWRkaW5nOiBcIjMwcHggMzBweFwiLFxuYm9yZGVyUmFkaXVzOiBcIjhweFwiXG59LCBjbGFzc05hbWU6IFwibGMtdGFiLWJveC1zaGFkb3dcIiB9LFxuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UaXRsZSwgbnVsbCwgXCJQcmV2aWV3IHRhYnNcIilcbilcbilgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihsYW5nID09PSBcImpzeFwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxkaXYgc3R5bGU9e3tcbm1hcmdpblRvcDogXCIyMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIyMHB4XCJcbn19PlxuPGRpdiBzdHlsZT17e1xuICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXG4gICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIiwgXG4gICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXG59fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxuICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UaXRsZT5QcmV2aWV3IHRhYnM8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlPlxuPC9kaXY+XG48L2Rpdj5gXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91ciBjb21wb25lbnRzIGhlcmUuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCBcIiAgICBcIilcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGdlbmVyYXRlQ29kZSA9IGZ1bmN0aW9uKGxhbmcpeyAvLyBjb2RlIGZvcm1hdHRpbmcgaXMgaGFyZFxuICAgICAgICAgICAgY29uc3QgY29tcE5hbWUgPSBjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZVxuICAgICAgICAgICAgbGV0IGNhdGVnb3JpZXMgPSBPYmplY3Qua2V5cyh3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzKVxuICAgICAgICAgICAgY29uc3QgY29tcENhdGVnb3J5ID0gY2F0ZWdvcmllcy5maW5kKGUgPT4gd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXVtjb21wTmFtZV0pXG4gICAgICAgICAgICBjb25zdCBjb21wUGF0aCA9IGBMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuJHtjb21wQ2F0ZWdvcnl9LiR7Y29tcE5hbWV9YFxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBnZXRQcm9wcygpXG5cbiAgICAgICAgICAgIGlmKGxhbmcgPT09IFwianN4XCIpe1xuICAgICAgICAgICAgICAgIGxldCBwcm9wU3RyaW5ncyA9IFtdXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuUHJvcCA9IG51bGxcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZihrZXkgPT0gXCJjaGlsZHJlblwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUHJvcCA9IGdldFN0ckZvclByb3AocHJvcHNba2V5XSwgY29tcFBhdGgsIGxhbmcpXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9IGtleStcIj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb3BzW2tleV0gPT09IFwic3RyaW5nXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBKU09OLnN0cmluZ2lmeShwcm9wc1trZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGB7JHtnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKX19YFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MucHVzaChzdHIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGxldCBvcGVuVGFnXG4gICAgICAgICAgICAgICAgaWYoY2hpbGRyZW5Qcm9wKXtcbiAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0+YFxuICAgICAgICAgICAgICAgICAgICBsZXQgY2xvc2VUYWcgPSBgPC8ke2NvbXBQYXRofT5gXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtvcGVuVGFnfVxcbiAgICAke2NoaWxkcmVuUHJvcH1cXG4ke2Nsb3NlVGFnfWBcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0vPmBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5UYWdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ZWxzZSBpZihsYW5nID09PSBcInJlYWN0XCIpe1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuIHx8IG51bGxcbiAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHMuY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBpZihjaGlsZHJlbiAmJiBjaGlsZHJlbi4kJHR5cGVvZiAmJiAoY2hpbGRyZW4uJCR0eXBlb2YgPT09IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpIHx8IGNoaWxkcmVuLiQkdHlwZW9mID09PSAweGVhYzcpKXtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBnZXRTdHJGb3JQcm9wKGNoaWxkcmVuLCBjb21wUGF0aCwgbGFuZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHByb3BTdHJpbmdzID0gW11cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmlzaWJsZUtleSA9IC9bXlxcd1xcZF9dL2cudGVzdChrZXkpID8gSlNPTi5zdHJpbmdpZnkoa2V5KSA6IGtleVxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0gdmlzaWJsZUtleStcIjogXCJcbiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb3BzW2tleV0gPT09IFwic3RyaW5nXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KHByb3BzW2tleV0pXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGdldFN0ckZvclByb3AocHJvcHNba2V5XSwgY29tcFBhdGgsIGxhbmcpLnNwbGl0KFwiXFxuXCIpLm1hcCgoc3RyLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gMClyZXR1cm4gc3RyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiICAgIFwiICsgc3RyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MucHVzaChzdHIpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBsZXQgcHJvcE9iamVjdCA9IFwie1wiXG4gICAgICAgICAgICAgICAgaWYocHJvcFN0cmluZ3MubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MuZm9yRWFjaCgoc3RyLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNMYXN0ID0gaSA9PT0gcHJvcFN0cmluZ3MubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzRmlyc3QgPSBpID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpZighaXNGaXJzdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIixcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIlxcbiAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBzdHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzTGFzdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPVwiXFxufVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCJ9XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuRGF0YSA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJzdHJpbmdcIiAmJiBjaGlsZHJlbi5zdGFydHNXaXRoKFwiUmVhY3QuY3JlYXRlRWxlbWVudFwiKSA/IGNoaWxkcmVuIDogSlNPTi5zdHJpbmdpZnkoY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBSZWFjdC5jcmVhdGVFbGVtZW50KCR7Y29tcFBhdGh9LCAke3Byb3BPYmplY3R9LCAke2NoaWxkcmVuRGF0YX0pYFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBoZWxwID0gY29tcC5oZWxwIHx8IHt9XG4gICAgICAgIGxldCBpbmZvID0gaGVscC5pbmZvID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiaW5mb1wiPlxuICAgICAgICAgICAge2hlbHAuaW5mb31cbiAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxuICAgICAgICBsZXQgd2FybiA9IGhlbHAud2FybiA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cIndhcm5cIj5cbiAgICAgICAgICAgIHtoZWxwLndhcm59XG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcbiAgICAgICAgbGV0IGRhbmdlciA9IGhlbHAuZGFuZ2VyID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICB7aGVscC5kYW5nZXJ9XG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcbiAgICAgICAgbGV0IGVycm9yID0gaGVscC5lcnJvciA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cImVycm9yXCI+XG4gICAgICAgICAgICB7aGVscC5lcnJvcn1cbiAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxuICAgICAgICBsZXQgc3VjY2VzcyA9IGhlbHAuc3VjY2VzcyA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cInN1Y2Nlc3NcIj5cbiAgICAgICAgICAgIHtoZWxwLnN1Y2Nlc3N9XG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcbiAgICAgICAgcmV0dXJuICg8ZGl2PlxuICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nc1RpdGxlPlxuICAgICAgICAgICAgICAgIHtjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZX1cbiAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdzVGl0bGU+XG4gICAgICAgICAgICB7aW5mb31cbiAgICAgICAgICAgIHtzdWNjZXNzfVxuICAgICAgICAgICAge3dhcm59XG4gICAgICAgICAgICB7ZXJyb3J9XG4gICAgICAgICAgICB7ZGFuZ2VyfVxuICAgICAgICAgICAge0FsbFByZXZpZXdzLm1hcChjYXRlZ29yeSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoY2F0ZWdvcnlbMF0ub25DbGljaylyZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLnRleHQpcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICBpZihjYXRlZ29yeVswXS5jaGlsZHJlbilyZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5Lmxlbmd0aCA9PT0gMSlyZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBPYmplY3Qua2V5cyhjYXRlZ29yeVswXSlbMF1cbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtrZXl9XG4gICAgICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT4sXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Ecm9wZG93biBvcHRpb25zPXtjYXRlZ29yeS5tYXAoKGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIm9wdC1cIitpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogSlNPTi5zdHJpbmdpZnkoZVtPYmplY3Qua2V5cyhlKVswXV0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pfSB2YWx1ZT17XCJvcHQtXCIrKHN0YXRlLm9wdGlvbnNba2V5XSB8fCBcIjBcIil9IG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLm9wdGlvbnMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2tleV06ICh2YWx1ZS52YWx1ZSB8fCBcIjBcIikucmVwbGFjZShcIm9wdC1cIiwgXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfX0gc2VhcmNoYWJsZT17dHJ1ZX0vPixcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e21hcmdpbkJvdHRvbTogXCI4cHhcIn19PjwvZGl2PlxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzIHRhYnM9e1t7bGFiZWw6IFwiUHJldmlld1wiLCBpZDogXCJwcmV2aWV3XCJ9LCB7bGFiZWw6IFwiQ29kZVwiLCBpZDogXCJjb2RlXCJ9XX0gXG4gICAgICAgICAgICAgICAgYWN0aXZlPXtzdGF0ZS50YWJ9IGNoaWxkcmVuPXtzdGF0ZS50YWIgPT09IFwicHJldmlld1wiID8gcmVuZGVyUHJldmlldygpIDogcmVuZGVyQ29kZSgpfSBvbkNoYW5nZT17KHRhYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYlxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH19Lz5cbiAgICAgICAgPC9kaXY+KVxuICAgIH1cbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcblxuaW1wb3J0IFhTdmcgZnJvbSBcIi4veFN2Z1wiO1xuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4vcmVsb2FkSWNvblwiO1xuaW1wb3J0IEVkaXRJY29uIGZyb20gXCIuL2ljb25zL2VkaXRcIjtcbmltcG9ydCBEZWxldGVJY29uIGZyb20gXCIuL2ljb25zL2RlbGV0ZVwiO1xuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9jb21wb25lbnRzL3N3aXRjaFwiO1xuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XG5pbXBvcnQgeyBwcm9jZXNzRmlsZSB9IGZyb20gXCIuLi9tb2R1bGVzL3BsdWdpbkNlcnRpZmllclwiO1xuaW1wb3J0IGNvbnRlbnRNYW5hZ2VyIGZyb20gXCIuLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcblxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xuY29uc3QgYW5jaG9yQ2xhc3NlcyA9IEJEVjIuYW5jaG9yQ2xhc3NlcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1BsdWdpbkNhcmQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zaG93U2V0dGluZ3MgPSB0aGlzLnNob3dTZXR0aW5ncy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgICB0aGlzLmhhc1NldHRpbmdzID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gJiYgdHlwZW9mKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwpID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIHRoaXMuc2V0dGluZ3NQYW5lbCA9IFwiXCI7XG5cbiAgICAgICAgdGhpcy5lZGl0ID0gdGhpcy5lZGl0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVsZXRlID0gdGhpcy5kZWxldGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWxvYWQgPSB0aGlzLnJlbG9hZC5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMucHJvcHMuZW5hYmxlZCxcbiAgICAgICAgICAgIHNldHRpbmdzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlbG9hZHM6IDAsXG4gICAgICAgICAgICB0cnVzdGVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNob3dTZXR0aW5ncygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1NldHRpbmdzKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzOiB0cnVlfSk7XG4gICAgfVxuXG4gICAgY2xvc2VTZXR0aW5ncygpIHtcbiAgICAgICAgdGhpcy5wYW5lbFJlZi5jdXJyZW50LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzT3BlbjogZmFsc2V9KTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1BhbmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTNcIl0pIHJldHVybjtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzSGlkZGVuID0gKGNvbnRhaW5lciwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKCFjb250YWluZXIpe1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihgQ29udGFpbmVyIGlzIHVuZGVmaW5lZC5gKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNCb3R0b20gPSBjVG9wICsgY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgICAgICAgICAgICAgICBjb25zdCBlVG9wID0gZWxlbWVudC5vZmZzZXRUb3A7XG4gICAgICAgICAgICAgICAgY29uc3QgZUJvdHRvbSA9IGVUb3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgICAgICAgICByZXR1cm4gIChlVG9wIDwgY1RvcCB8fCBlQm90dG9tID4gY0JvdHRvbSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCB0aGlzTm9kZSA9IHRoaXMucmVmcy5jYXJkTm9kZTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXNOb2RlLmNsb3Nlc3QoXCJkaXZbY2xhc3MqPVxcXCJjb250ZW50UmVnaW9uU2Nyb2xsZXItXFxcIl1cIilcbiAgICAgICAgICAgIGlmICghaXNIaWRkZW4oY29udGFpbmVyLCB0aGlzTm9kZSkpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHRoaXNOb2RlT2Zmc2V0ID0gRE9NLm9mZnNldCh0aGlzTm9kZSk7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJPZmZzZXQgPSBET00ub2Zmc2V0KGNvbnRhaW5lcik7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XG4gICAgICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXNOb2RlT2Zmc2V0LnRvcCAtIGNvbnRhaW5lck9mZnNldC50b3AgKyBjb250YWluZXIuc2Nyb2xsVG9wIC0gMzA7XG4gICAgICAgICAgICBET00uYW5pbWF0ZSh7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmRQb2ludCA+IG9yaWdpbmFsKSBjb250YWluZXIuc2Nyb2xsVG9wID0gb3JpZ2luYWwgKyAocHJvZ3Jlc3MgKiAoZW5kUG9pbnQgLSBvcmlnaW5hbCkpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBvcmlnaW5hbCAtIChwcm9ncmVzcyAqIChvcmlnaW5hbCAtIGVuZFBvaW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgZ2V0U3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBcIj8/P1wiO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgZ2V0IHNldHRpbmdzQ29tcG9uZW50KCkge1xuICAgICAgICB0cnkgeyB0aGlzLnNldHRpbmdzUGFuZWwgPSB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRTZXR0aW5nc1BhbmVsKCk7IH1cbiAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGdldCBzZXR0aW5ncyBwYW5lbCBmb3IgXCIgKyB0aGlzLm5hbWUgKyBcIi5cIiwgZXJyKTsgfVxuXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkIGJkLWFkZG9uLWNhcmQgc2V0dGluZ3Mtb3BlbiB1aS1zd2l0Y2gtaXRlbVwiLCByZWY6IFwiY2FyZE5vZGVcIn0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1wiZmxvYXRcIjogXCJyaWdodFwiLCBcImN1cnNvclwiOiBcInBvaW50ZXJcIn0sIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcy5zZXR0aW5nc3BhbmVsLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtzZXR0aW5nczogZmFsc2V9KTtcbiAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFhTdmcsIG51bGwpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIn0pLFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCAhPT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIiwgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtfX2h0bWw6IHRoaXMuc2V0dGluZ3NQYW5lbH19KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGJ1aWxkVGl0bGUobmFtZSwgdmVyc2lvbiwgYXV0aG9yKSB7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gXCJ7e25hbWV9fSB2e3t2ZXJzaW9ufX0gYnkge3thdXRob3J9fVwiLnNwbGl0KC8oe3tbQS1aYS16XSt9fSkvKTtcbiAgICAgICAgY29uc3QgbmFtZUluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7bmFtZX19XCIpO1xuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVtuYW1lSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJuYW1lIGJkYS1uYW1lXCJ9LCBuYW1lKTtcbiAgICAgICAgY29uc3QgdmVyc2lvbkluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7dmVyc2lvbn19XCIpO1xuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVt2ZXJzaW9uSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJ2ZXJzaW9uIGJkYS12ZXJzaW9uXCJ9LCB2ZXJzaW9uKTtcbiAgICAgICAgY29uc3QgYXV0aG9ySW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3thdXRob3J9fVwiKTtcbiAgICAgICAgaWYgKG5hbWVJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImF1dGhvciBiZGEtYXV0aG9yXCJ9O1xuICAgICAgICAgICAgaWYgKGF1dGhvci5saW5rIHx8IGF1dGhvci5pZCkge1xuICAgICAgICAgICAgICAgIHByb3BzLmNsYXNzTmFtZSArPSBgICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWA7XG4gICAgICAgICAgICAgICAgcHJvcHMudGFyZ2V0ID0gXCJfYmxhbmtcIjtcblxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IubGluaykgcHJvcHMuaHJlZiA9IGF1dGhvci5saW5rO1xuICAgICAgICAgICAgICAgIGlmIChhdXRob3IuaWQpIHByb3BzLm9uQ2xpY2sgPSAoKSA9PiB7QkRWMi5MYXllclN0YWNrLnBvcExheWVyKCk7IEJEVjIub3BlbkRNKGF1dGhvci5pZCk7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRpdGxlW2F1dGhvckluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoYXV0aG9yLmxpbmsgfHwgYXV0aG9yLmlkID8gXCJhXCIgOiBcInNwYW5cIiwgcHJvcHMsIGF1dGhvci5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGl0bGUuZmxhdCgpO1xuICAgIH1cblxuICAgIG1ha2VMaW5rKHRpdGxlLCB1cmwpIHtcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImJkYS1saW5rIGJkYS1saW5rLXdlYnNpdGVcIiwgdGFyZ2V0OiBcIl9ibGFua1wifTtcbiAgICAgICAgaWYgKHR5cGVvZih1cmwpID09IFwic3RyaW5nXCIpIHByb3BzLmhyZWYgPSB1cmw7XG4gICAgICAgIGlmICh0eXBlb2YodXJsKSA9PSBcImZ1bmN0aW9uXCIpIHByb3BzLm9uQ2xpY2sgPSAoZXZlbnQpID0+IHtldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdXJsKCk7fTtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgcHJvcHMsIHRpdGxlKTtcbiAgICB9XG5cbiAgICBtYWtlQnV0dG9uKHRpdGxlLCBjaGlsZHJlbiwgYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiA8VG9vbHRpcFdyYXAgY29sb3I9XCJibGFja1wiIHNpZGU9XCJ0b3BcIiB0ZXh0PXt0aXRsZX0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWFkZG9uLWJ1dHRvblwiIG9uQ2xpY2s9e2FjdGlvbn0+e2NoaWxkcmVufTwvZGl2PlxuICAgICAgICA8L1Rvb2x0aXBXcmFwPjtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xuICAgICAgICB0aGlzLnVubW91bnRlZCA9IHRydWVcbiAgICB9XG5cbiAgICBnZXQgbGlua3MoKSB7XG4gICAgICAgIGNvbnN0IGxpbmtzID0gW107XG4gICAgICAgIGNvbnN0IGFkZG9uID0gdGhpcy5wcm9wcy5hZGRvbjtcbiAgICAgICAgaWYgKGFkZG9uLndlYnNpdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIldlYnNpdGVcIiwgYWRkb24ud2Vic2l0ZSkpO1xuICAgICAgICBpZiAoYWRkb24uc291cmNlKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJTb3VyY2VcIiwgYWRkb24uc291cmNlKSk7XG4gICAgICAgIGlmIChhZGRvbi5pbnZpdGUpIHtcbiAgICAgICAgICAgIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlN1cHBvcnQgU2VydmVyXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0ZXIgPSAvXFwuZ2dcXC8oLiopJC87XG4gICAgICAgICAgICAgICAgbGV0IGNvZGUgPSBhZGRvbi5pbnZpdGU7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3Rlci50ZXN0KGNvZGUpKSBjb2RlID0gY29kZS5tYXRjaCh0ZXN0ZXIpWzFdO1xuICAgICAgICAgICAgICAgIEJEVjIuTGF5ZXJTdGFjay5wb3BMYXllcigpO1xuICAgICAgICAgICAgICAgIEJEVjIuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKGNvZGUpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhZGRvbi5kb25hdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIkRvbmF0ZVwiLCBhZGRvbi5kb25hdGUpKTtcbiAgICAgICAgaWYgKGFkZG9uLnBhdHJlb24pIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlBhdHJlb25cIiwgYWRkb24ucGF0cmVvbikpO1xuICAgICAgICByZXR1cm4gbGlua3M7XG4gICAgfVxuXG4gICAgZ2V0IGZvb3RlcigpIHtcbiAgICAgICAgY29uc3QgbGlua3MgPSB0aGlzLmxpbmtzO1xuICAgICAgICByZXR1cm4gKGxpbmtzLmxlbmd0aCB8fCB0aGlzLmhhc1NldHRpbmdzKSAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkLWZvb3RlciBiZGEtZm9vdGVyXCJ9LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcImJkLWFkZG9uLWxpbmtzIGJkYS1saW5rc1wifSxcbiAgICAgICAgICAgICAgICAuLi4obGlua3MubWFwKChlbGVtZW50LCBpbmRleCkgPT4gaW5kZXggPCBsaW5rcy5sZW5ndGggLSAxID8gW2VsZW1lbnQsIFwiIHwgXCJdIDogZWxlbWVudCkuZmxhdCgpKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRoaXMuaGFzU2V0dGluZ3MgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtvbkNsaWNrOiB0aGlzLnNob3dTZXR0aW5ncywgY2xhc3NOYW1lOiBcImJkLWJ1dHRvbiBiZGEtc2V0dGluZ3MtYnV0dG9uXCIsIGRpc2FibGVkOiAhdGhpcy5zdGF0ZS5jaGVja2VkfSwgXCJTZXR0aW5nc1wiKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnByb3BzLnRvZ2dsZSAmJiB0aGlzLnByb3BzLnRvZ2dsZSh0aGlzLm5hbWUpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiAhdGhpcy5zdGF0ZS5jaGVja2VkfSk7XG4gICAgfVxuXG4gICAgZWRpdCgpIHt0aGlzLnByb3BzLmVkaXQodGhpcy5uYW1lKTt9XG4gICAgZGVsZXRlKCkge3RoaXMucHJvcHMucmVtb3ZlKHRoaXMubmFtZSk7fVxuICAgIHJlbG9hZCgpIHt0aGlzLnByb3BzLnJlbG9hZCh0aGlzLm5hbWUpO31cblxuICAgIGdldCBuYW1lKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IHRoaXMucHJvcHMuYWRkb24ubmFtZSk7fVxuICAgIGdldCBhdXRob3IoKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0QXV0aG9yKCkgOiB0aGlzLnByb3BzLmFkZG9uLmF1dGhvcik7fVxuICAgIGdldCBkZXNjcmlwdGlvbigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXREZXNjcmlwdGlvbigpIDogdGhpcy5wcm9wcy5hZGRvbi5kZXNjcmlwdGlvbik7fVxuICAgIGdldCB2ZXJzaW9uKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IHRoaXMucHJvcHMuYWRkb24udmVyc2lvbik7fVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuIHRoaXMuc2V0dGluZ3NDb21wb25lbnQ7XG4gICAgICAgIGNvbnN0IHthdXRob3JJZCwgYXV0aG9yTGlua30gPSB0aGlzLnByb3BzLmFkZG9uO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlID0ge31cbiAgICAgICAgaWYoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTZcIl0pe1xuICAgICAgICAgICAgaWYoIXRoaXMuaXNTY2FubmluZyl7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NjYW5uaW5nID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKHJlc29sdmUodGhpcy5wcm9wcy5hZGRvbi5maWxlbmFtZS5lbmRzV2l0aChcIi5wbHVnaW4uanNcIikgPyBjb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyIDogY29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyLCB0aGlzLnByb3BzLmFkZG9uLmZpbGVuYW1lKSwgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnVubW91bnRlZClyZXR1cm5cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RydXN0ZWQ6IHJlc3VsdC5zdXNwZWN0ID8gXCJzdXNwZWN0XCIgOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSwgKCkgPT4ge30pXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmlzVHJ1c3RlZCA9PT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLmJvcmRlckNvbG9yID0gXCIjNDA4N2VkXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5pc1RydXN0ZWQgPT09IFwic3VzcGVjdFwiKXtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuYm9yZGVyQ29sb3IgPSBcInJnYigyNDAsIDcxLCA3MSlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQgYmQtYWRkb24tY2FyZCBzZXR0aW5ncy1jbG9zZWQgdWktc3dpdGNoLWl0ZW1cIiwgc3R5bGV9LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24taGVhZGVyIGJkYS1oZWFkZXJcIn0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQtdGl0bGUgYmRhLWhlYWRlci10aXRsZVwifSwgdGhpcy5idWlsZFRpdGxlKHRoaXMubmFtZSwgdGhpcy52ZXJzaW9uLCB7bmFtZTogdGhpcy5hdXRob3IsIGlkOiBhdXRob3JJZCwgbGluazogYXV0aG9yTGlua30pKSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24tY29udHJvbHMgYmRhLWNvbnRyb2xzXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5lZGl0ICYmIHRoaXMubWFrZUJ1dHRvbihcIkVkaXRcIiwgPEVkaXRJY29uIGNsYXNzTmFtZT1cImJkLWljb25cIiAvPiwgdGhpcy5lZGl0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVtb3ZlICYmIHRoaXMubWFrZUJ1dHRvbihcIkRlbGV0ZVwiLCA8RGVsZXRlSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMuZGVsZXRlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVsb2FkICYmIHRoaXMubWFrZUJ1dHRvbihcIlJlbG9hZFwiLCA8UmVsb2FkSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMucmVsb2FkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7b25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMuc3RhdGUuY2hlY2tlZH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1zY3JvbGxlci13cmFwIGJkYS1kZXNjcmlwdGlvbi13cmFwIHNjcm9sbGVyLXdyYXAgZmFkZVwifSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1zY3JvbGxlciBiZC1hZGRvbi1kZXNjcmlwdGlvbiBiZGEtZGVzY3JpcHRpb24gc2Nyb2xsZXJcIn0sIHRoaXMuZGVzY3JpcHRpb24pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy5mb290ZXJcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gVjJDX1BsdWdpbkNhcmQucHJvdG90eXBlLnJlbmRlcjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWMkNfUGx1Z2luQ2FyZC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxufSk7IiwiaW1wb3J0IEVycm9yQm91bmRhcnkgZnJvbSBcIi4vZXJyb3JCb3VuZGFyeVwiO1xuaW1wb3J0IENvbnRlbnRDb2x1bW4gZnJvbSBcIi4vY29udGVudENvbHVtblwiO1xuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4vcmVsb2FkSWNvblwiO1xuaW1wb3J0IEFkZG9uQ2FyZCBmcm9tIFwiLi9hZGRvbmNhcmRcIjtcbmltcG9ydCBEcm9wZG93biBmcm9tIFwiLi9jb21wb25lbnRzL2Ryb3Bkb3duXCI7XG5pbXBvcnQgU2VhcmNoIGZyb20gXCIuL2NvbXBvbmVudHMvc2VhcmNoXCI7XG5cbmltcG9ydCB7c2V0dGluZ3NDb29raWUsIHBsdWdpbkNvb2tpZSwgdGhlbWVDb29raWUsIGJkcGx1Z2lucywgYmR0aGVtZXN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi4vbW9kdWxlcy9wbHVnaW5Nb2R1bGVcIjtcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi4vbW9kdWxlcy90aGVtZU1vZHVsZVwiO1xuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XG5pbXBvcnQgQmRBcGkgZnJvbSBcIi4uL21vZHVsZXMvYmRBcGlcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XG5pbXBvcnQgYmRFdmVudHMgZnJvbSBcIi4uL21vZHVsZXMvYmRFdmVudHNcIjtcbmltcG9ydCBFbXVsYXRlZFRvb2x0aXAgZnJvbSBcIi4vdG9vbHRpcFwiO1xuXG5jb25zdCBUb29sdGlwID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUb29sdGlwXCIpO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcmRMaXN0IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge3NvcnQ6IFwibmFtZVwiLCBhc2NlbmRpbmc6IHRydWUsIHF1ZXJ5OiBcIlwifTtcbiAgICAgICAgdGhpcy5pc1BsdWdpbnMgPSB0aGlzLnByb3BzLnR5cGUgPT0gXCJwbHVnaW5zXCI7XG4gICAgICAgIHRoaXMuY29va2llID0gdGhpcy5pc1BsdWdpbnMgPyBwbHVnaW5Db29raWUgOiB0aGVtZUNvb2tpZTtcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gdGhpcy5pc1BsdWdpbnMgPyBwbHVnaW5Nb2R1bGUgOiB0aGVtZU1vZHVsZTtcblxuICAgICAgICB0aGlzLnNvcnQgPSB0aGlzLnNvcnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZXZlcnNlID0gdGhpcy5yZXZlcnNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcblxuICAgICAgICB0aGlzLm9uQWRkb25DaGFuZ2VzID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25BZGRvbkNoYW5nZXMgPSB0aGlzLm9uQWRkb25DaGFuZ2VzLmJpbmQodGhpcylcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpe1xuICAgICAgICBjb25zdCB0eXBlID0gKHRoaXMuaXNQbHVnaW5zID8gXCJwbHVnaW5cIiA6IFwidGhlbWVcIikgKyBcIi1cIlxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfWxvYWRlZGAsIHRoaXMub25BZGRvbkNoYW5nZXMpXG4gICAgICAgIGJkRXZlbnRzLm9uKGAke3R5cGV9dW5sb2FkZWRgLCB0aGlzLm9uQWRkb25DaGFuZ2VzKVxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfXJlbG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xuICAgICAgICBjb25zdCB0eXBlID0gKHRoaXMuaXNQbHVnaW5zID8gXCJwbHVnaW5cIiA6IFwidGhlbWVcIikgKyBcIi1cIlxuICAgICAgICBiZEV2ZW50cy5vZmYoYCR7dHlwZX1sb2FkZWRgLCB0aGlzLm9uQWRkb25DaGFuZ2VzKVxuICAgICAgICBiZEV2ZW50cy5vZmYoYCR7dHlwZX11bmxvYWRlZGAsIHRoaXMub25BZGRvbkNoYW5nZXMpXG4gICAgICAgIGJkRXZlbnRzLm9mZihgJHt0eXBlfXJlbG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcbiAgICB9XG5cbiAgICBvcGVuRm9sZGVyKCkge1xuICAgICAgICBjb25zdCBzaGVsbCA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbDtcbiAgICAgICAgY29uc3Qgb3BlbiA9IHNoZWxsLm9wZW5QYXRoIHx8IHNoZWxsLm9wZW5JdGVtO1xuICAgICAgICBvcGVuKHRoaXMuaXNQbHVnaW5zID8gQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciA6IENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlcik7XG4gICAgfVxuXG4gICAgZWRpdChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG5hbWUpO1xuICAgICAgICB0aGlzLm1hbmFnZXIuZWRpdChuYW1lKTtcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGUobmFtZSkge1xuICAgICAgICBjb25zdCBzaG91bGREZWxldGUgPSBhd2FpdCB0aGlzLmNvbmZpcm1EZWxldGUobmFtZSk7XG4gICAgICAgIGlmICghc2hvdWxkRGVsZXRlKSByZXR1cm47XG4gICAgICAgIHRoaXMubWFuYWdlci5kZWxldGUobmFtZSk7XG4gICAgfVxuXG4gICAgY29uZmlybURlbGV0ZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIEJkQXBpLnNob3dDb25maXJtYXRpb25Nb2RhbChcIkFyZSBZb3UgU3VyZT9cIiwgYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJHtuYW1lfT9gLCB7XG4gICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRlbGV0ZVwiLFxuICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge3Jlc29sdmUodHJ1ZSk7fSxcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge3Jlc29sdmUoZmFsc2UpO31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgc29ydE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7bGFiZWw6IFwiTmFtZVwiLCB2YWx1ZTogXCJuYW1lXCJ9LFxuICAgICAgICAgICAge2xhYmVsOiBcIkF1dGhvclwiLCB2YWx1ZTogXCJhdXRob3JcIn0sXG4gICAgICAgICAgICB7bGFiZWw6IFwiVmVyc2lvblwiLCB2YWx1ZTogXCJ2ZXJzaW9uXCJ9LFxuICAgICAgICAgICAge2xhYmVsOiBcIlJlY2VudGx5IEFkZGVkXCIsIHZhbHVlOiBcImFkZGVkXCJ9LFxuICAgICAgICAgICAge2xhYmVsOiBcIkxhc3QgTW9kaWZpZWRcIiwgdmFsdWU6IFwibW9kaWZpZWRcIn0sXG4gICAgICAgICAgICB7bGFiZWw6IFwiRmlsZSBTaXplXCIsIHZhbHVlOiBcInNpemVcIn0sXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgZ2V0IGRpcmVjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7bGFiZWw6IFwiQXNjZW5kaW5nXCIsIHZhbHVlOiB0cnVlfSxcbiAgICAgICAgICAgIHtsYWJlbDogXCJEZXNjZW5kaW5nXCIsIHZhbHVlOiBmYWxzZX1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICByZXZlcnNlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2FzY2VuZGluZzogdmFsdWV9KTtcbiAgICB9XG5cbiAgICBzb3J0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NvcnQ6IHZhbHVlfSk7XG4gICAgfVxuXG4gICAgc2VhcmNoKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3F1ZXJ5OiBldmVudC50YXJnZXQudmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKX0pO1xuICAgIH1cblxuICAgIGdldFByb3BzKGFkZG9uKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXk6IHRoaXMuZ2V0TmFtZShhZGRvbiksXG4gICAgICAgICAgICBlbmFibGVkOiB0aGlzLmNvb2tpZVt0aGlzLmdldE5hbWUoYWRkb24pXSxcbiAgICAgICAgICAgIHRvZ2dsZTogdGhpcy5tYW5hZ2VyLnRvZ2dsZS5iaW5kKHRoaXMubWFuYWdlciksXG4gICAgICAgICAgICBlZGl0OiBzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtN1wiXSA/IHRoaXMuZWRpdC5iaW5kKHRoaXMpIDogbnVsbCxcbiAgICAgICAgICAgIHJlbW92ZTogdGhpcy5kZWxldGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGFkZG9uOiBhZGRvbixcbiAgICAgICAgICAgIGhhc2g6IGFkZG9uLmhhc2hcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRTdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiPz8/XCI7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBnZXQgbGlzdCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy50eXBlID09PSBcInBsdWdpbnNcIiA/IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKSA6IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpO1xuICAgIH1cblxuICAgIGdldEFkZG9ucygpIHtcbiAgICAgICAgY29uc3Qgc29ydGVkQWRkb25zID0gdGhpcy5saXN0LnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhcCA9IHRoaXMuc3RhdGUuc29ydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRoaXMuc3RhdGUuc29ydC5zbGljZSgxKTtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gYS5wbHVnaW4gJiYgYS5wbHVnaW5bYGdldCR7Y2FwfWBdID8gdGhpcy5nZXRTdHJpbmcoYS5wbHVnaW5bYGdldCR7Y2FwfWBdKCkpIDogdGhpcy5nZXRTdHJpbmcoYVt0aGlzLnN0YXRlLnNvcnRdKTtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IGIucGx1Z2luICYmIGIucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGIucGx1Z2luW2BnZXQke2NhcH1gXSgpKSAgOiB0aGlzLmdldFN0cmluZyhiW3RoaXMuc3RhdGUuc29ydF0pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZihmaXJzdCkgPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0LnRvTG9jYWxlTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShzZWNvbmQudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgICAgICAgICBpZiAoZmlyc3QgPiBzZWNvbmQpIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKHNlY29uZCA+IGZpcnN0KSByZXR1cm4gLTE7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5hc2NlbmRpbmcpIHNvcnRlZEFkZG9ucy5yZXZlcnNlKCk7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gW107XG4gICAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgc29ydGVkQWRkb25zLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhZGRvbiA9IHNvcnRlZEFkZG9uc1thXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldE5hbWUoYWRkb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGF1dGhvciA9IHRoaXMuZ2V0QXV0aG9yKGFkZG9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMuZ2V0RGVzY3JpcHRpb24oYWRkb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24oYWRkb24pO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lKSBtYXRjaGVzID0gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChhdXRob3IpIG1hdGNoZXMgPSBtYXRjaGVzIHx8IGF1dGhvci50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgZGVzY3JpcHRpb24udG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgdmVyc2lvbi50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlcykgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuZ2V0UHJvcHMoYWRkb24pO1xuICAgICAgICAgICAgcmVuZGVyZWQucHVzaCg8RXJyb3JCb3VuZGFyeT48QWRkb25DYXJkIHsuLi5wcm9wc30gcmVsb2FkPXshc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0gJiYgdGhpcy5tYW5hZ2VyLnJlbG9hZC5iaW5kKHRoaXMubWFuYWdlcil9IC8+PC9FcnJvckJvdW5kYXJ5Pik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkO1xuICAgIH1cblxuICAgIGdldE5hbWUoYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IGFkZG9uLm5hbWUpO31cbiAgICBnZXRBdXRob3IoYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldEF1dGhvcigpIDogYWRkb24uYXV0aG9yKTt9XG4gICAgZ2V0RGVzY3JpcHRpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldERlc2NyaXB0aW9uKCkgOiBhZGRvbi5kZXNjcmlwdGlvbik7fVxuICAgIGdldFZlcnNpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IGFkZG9uLnZlcnNpb24pO31cblxuICAgIHJlbmRlckNoZWNrVXBkYXRlcygpe1xuICAgICAgICBpZighd2luZG93LlplcmVzUGx1Z2luTGlicmFyeSlyZXR1cm4gbnVsbFxuICAgICAgICBpZighd2luZG93LlBsdWdpblVwZGF0ZXMpcmV0dXJuIG51bGxcbiAgICAgICAgaWYodHlwZW9mIHdpbmRvdy5QbHVnaW5VcGRhdGVzLmNoZWNrQWxsICE9PSBcImZ1bmN0aW9uXCIpcmV0dXJuIG51bGxcbiAgICAgICAgaWYoIXRoaXMuaXNQbHVnaW5zKXJldHVybiBudWxsXG5cbiAgICAgICAgbGV0IHRvb2x0aXBJc1Nob3dpbmcgPSBmYWxzZVxuICAgICAgICBsZXQgdG9vbHRpcFxuICAgICAgICByZXR1cm4gPFRvb2x0aXBXcmFwIHRleHQ9XCJDaGVja3MgZm9yIHVwZGF0ZXMgb2YgcGx1Z2lucyB0aGF0IHN1cHBvcnQgdGhpcyBmZWF0dXJlLiBSaWdodC1jbGljayBmb3IgYSBsaXN0LlwiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3ttYXJnaW5MZWZ0OiBcIjEwcHhcIn19IG9uTW91c2VMZWF2ZT17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0b29sdGlwSXNTaG93aW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcC5oaWRlKClcbiAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gcmVmPVwiY2hlY2tVcGRhdGVCdXR0b25cIiBjb2xvcj1cImJyYW5kXCIgbG9vaz1cImZpbGxlZFwiIHNpemU9XCJtaW5cIiBob3ZlckNvbG9yPVwiZGVmYXVsdFwiIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiUGx1Z2luIHVwZGF0ZSBjaGVjayBpbiBwcm9ncmVzcy5cIiwge3R5cGU6IFwiaW5mb1wifSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5QbHVnaW5VcGRhdGVzLmNoZWNrQWxsKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJQbHVnaW4gdXBkYXRlIGNoZWNrIGNvbXBsZXRlLlwiLCB7dHlwZTogXCJzdWNjZXNzXCJ9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGNoZWNraW5nIHVwZGF0ZS5cIiwge3R5cGU6IFwiZXJyb3JcIn0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGNoZWNraW5nIHVwZGF0ZS5cIiwge3R5cGU6IFwiZXJyb3JcIn0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9fSB3cmFwcGVyPXtmYWxzZX0gZGlzYWJsZWQ9e2ZhbHNlfSBvblJpZ2h0Q2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYoIXRoaXMucmVmcy5jaGVja1VwZGF0ZUJ1dHRvbilyZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuUGx1Z2luVXBkYXRlcyB8fCAhd2luZG93LlBsdWdpblVwZGF0ZXMucGx1Z2lucykgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZih0b29sdGlwSXNTaG93aW5nKXJldHVyblxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwID0gbmV3IEVtdWxhdGVkVG9vbHRpcCh0aGlzLnJlZnMuY2hlY2tVcGRhdGVCdXR0b24ucmVmcy5vcmlnaW5hbC5yZWZzLmJ1dHRvbiwgT2JqZWN0LnZhbHVlcyh3aW5kb3cuUGx1Z2luVXBkYXRlcy5wbHVnaW5zKS5tYXAocCA9PiBwLm5hbWUpLmpvaW4oXCIsIFwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lkZTogXCJib3R0b21cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaEV2ZW50czogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcC5zaG93KClcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcElzU2hvd2luZyA9IHRydWVcbiAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgZm9yIFVwZGF0ZXNcbiAgICAgICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L1Rvb2x0aXBXcmFwPlxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgcmVmcmVzaEljb24gPSA8VG9vbHRpcCBjb2xvcj1cImJsYWNrXCIgcG9zaXRpb249XCJ0b3BcIiB0ZXh0PVwiUmVsb2FkIExpc3RcIj5cbiAgICAgICAgICAgIHsocHJvcHMpID0+IFxuICAgICAgICAgICAgPFJlbG9hZEljb24gey4uLnByb3BzfSBjbGFzc05hbWU9XCJiZC1pY29uIGJkLXJlbG9hZCBiZC1yZWxvYWQtaGVhZGVyXCIgc2l6ZT1cIjE4cHhcIiBvbkNsaWNrPXthc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbHVnaW5zKSBwbHVnaW5Nb2R1bGUudXBkYXRlUGx1Z2luTGlzdCgpO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhlbWVNb2R1bGUudXBkYXRlVGhlbWVMaXN0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgICAgfX0gLz5cbiAgICAgICAgICAgIH08L1Rvb2x0aXA+O1xuICAgICAgICBjb25zdCBhZGRvbkNhcmRzID0gdGhpcy5nZXRBZGRvbnMoKTtcblxuICAgICAgICByZXR1cm4gPENvbnRlbnRDb2x1bW4gdGl0bGU9e2Ake3RoaXMucHJvcHMudHlwZS50b1VwcGVyQ2FzZSgpfeKAlCR7YWRkb25DYXJkcy5sZW5ndGh9YH0+XG4gICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24ga2V5PVwiZm9sZGVyLWJ1dHRvblwiIGNvbG9yPVwiYnJhbmRcIiBcbiAgICAgICAgICAgICAgICBsb29rPVwiZmlsbGVkXCIgc2l6ZT1cIm1pblwiIGhvdmVyQ29sb3I9XCJkZWZhdWx0XCIgb25DbGljaz17dGhpcy5vcGVuRm9sZGVyLmJpbmQodGhpcyl9IHdyYXBwZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IFwiMTBweFwiXG4gICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgT3BlbiB7dGhpcy5pc1BsdWdpbnMgPyBcIlBsdWdpblwiIDogXCJUaGVtZVwifSBGb2xkZXJcbiAgICAgICAgICAgIDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+XG4gICAgICAgICAgICB7dGhpcy5yZW5kZXJDaGVja1VwZGF0ZXMoKX1cbiAgICAgICAgICAgIHshc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0gJiYgcmVmcmVzaEljb259XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWNvbnRyb2xzIGJkLWFkZG9uLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPFNlYXJjaCBvbkNoYW5nZT17dGhpcy5zZWFyY2h9IHBsYWNlaG9sZGVyPXtgU2VhcmNoICR7dGhpcy5wcm9wcy50eXBlfS4uLmB9IC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1hZGRvbi1kcm9wZG93bnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+U29ydCBieTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duIG9wdGlvbnM9e3RoaXMuc29ydE9wdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLnNvcnR9IHN0eWxlPVwidHJhbnNwYXJlbnRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+T3JkZXI6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93biBvcHRpb25zPXt0aGlzLmRpcmVjdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLnJldmVyc2V9IHN0eWxlPVwidHJhbnNwYXJlbnRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmRhLXNsaXN0IGJkLWFkZG9uLWxpc3RcIj57YWRkb25DYXJkc308L2Rpdj5cbiAgICAgICAgPC9Db250ZW50Q29sdW1uPlxuICAgIH1cbn1cblxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBDYXJkTGlzdC5wcm90b3R5cGUucmVuZGVyO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KENhcmRMaXN0LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXG59KTsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCRExvZ28gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcInN2Z1wiLFxuICAgICAgICAgICAge2hlaWdodDogXCIxMDAlXCIsIHdpZHRoOiB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHN0eWxlOiB7ZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLCBjbGlwUnVsZTogXCJldmVub2RkXCIsIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIn0sIHZpZXdCb3g6IFwiMCAwIDIwMDAgMjAwMFwifSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcIm1ldGFkYXRhXCIsIG51bGwpLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVmc1wiLCBudWxsLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MVwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMjBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MlwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMTVcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgyNTUsMjU1LDI1NSwwLjE1KVwifSkpLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93M1wifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMTBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MylcIn0sIGQ6IFwiTTExOTUuNDQrMTM1LjQ0MkwxMTk1LjQ0KzEzNS40NDJMOTk3LjYrMTM2LjQ0MkMxMDI0LjIrMTQ5Ljc0MisxMTcwLjM0KzE2My41NDIrMTE5My42NCsxNzkuNzQyQzEyNjQuMzQrMjI4Ljg0MisxMzE5Ljc0KzI5MS4yNDIrMTM1OC4yNCszNjUuMDQyQzEzOTguMTQrNDQxLjY0MisxNDE5Ljc0KzUzMC42NDIrMTQyMi41NCs2MjkuNjQyTDE0MjIuNTQrNjMwLjg0MkwxNDIyLjU0KzYzMi4wNDJDMTQyMi41NCs3NzMuMTQyKzE0MjIuNTQrMTIyOC4xNCsxNDIyLjU0KzEzNjkuMTRMMTQyMi41NCsxMzcwLjM0TDE0MjIuNTQrMTM3MS41NEMxNDE5Ljg0KzE0NzAuNTQrMTM5OC4yNCsxNTU5LjU0KzEzNTguMjQrMTYzNi4xNEMxMzE5Ljc0KzE3MDkuOTQrMTI2NC40NCsxNzcyLjM0KzExOTMuNjQrMTgyMS40NEMxMTcxLjA0KzE4MzcuMTQrMTAyNS43KzE4NTAuNTQrMTAwMCsxODYzLjU0TDExOTMuNTQrMTg2NC41NEMxNTM5Ljc0KzE4NjYuNDQrMTg2NC41NCsxNjkzLjM0KzE4NjQuNTQrMTI5Ni42NEwxODY0LjU0KzcxNi45NDJDMTg2Ni40NCszMTIuNDQyKzE1NDEuNjQrMTM1LjQ0MisxMTk1LjQ0KzEzNS40NDJaXCIsIGZpbGw6IFwiIzE3MTcxN1wiLCBvcGFjaXR5OiBcIjFcIn0pLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MilcIn0sIGQ6IFwiTTE2OTUuNTQrNjMxLjQ0MkMxNjg1Ljg0KzI3OC4wNDIrMTQwOS4zNCsxMzUuNDQyKzEwNTIuOTQrMTM1LjQ0MkwzNjEuNzQrMTM2LjQ0Mkw4MDMuNzQrNDkwLjQ0MkwxMDYwLjc0KzQ5MC40NDJDMTMzNS4yNCs0OTAuNDQyKzEzMzUuMjQrODM1LjM0MisxMDYwLjc0KzgzNS4zNDJMMTA2MC43NCsxMTY0Ljg0QzExNTAuMjIrMTE2NC44NCsxMjEwLjUzKzEyMDEuNDgrMTI0MS42OCsxMjUwLjg3QzEzMDYuMDcrMTM1MysxMjQ1Ljc2KzE1MDkuNjQrMTA2MC43NCsxNTA5LjY0TDM2MS43NCsxODYzLjU0TDEwNTIuOTQrMTg2NC41NEMxNDA5LjI0KzE4NjQuNTQrMTY4NS43NCsxNzIxLjk0KzE2OTUuNTQrMTM2OC41NEMxNjk1LjU0KzEyMDUuOTQrMTY1MS4wNCsxMDg0LjQ0KzE1NzIuNjQrOTk5Ljk0MkMxNjUxLjA0KzkxNS41NDIrMTY5NS41NCs3OTQuMDQyKzE2OTUuNTQrNjMxLjQ0MlpcIiwgZmlsbDogXCIjM0U4MkU1XCIsIG9wYWNpdHk6IFwiMVwifSksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7c3R5bGU6IHtmaWx0ZXI6IFwidXJsKCNzaGFkb3cxKVwifSwgZDogXCJNMTQ2OS4yNSs2MzEuNDQyQzE0NTkuNTUrMjc4LjA0MisxMTgzLjA1KzEzNS40NDIrODI2LjY1KzEzNS40NDJMMTM1LjQ1KzEzNS40NDJMMTM1LjQ1KzEwMDRDMTM1LjQ1KzEwMDQrMTM1LjQyNysxMjU1LjIxKzM1NS42MjYrMTI1NS4yMUM1NzUuODI1KzEyNTUuMjErNTc1Ljg0OCsxMDA0KzU3NS44NDgrMTAwNEw1NzcuNDUrNDkwLjQ0Mkw4MzQuNDUrNDkwLjQ0MkMxMTA4Ljk1KzQ5MC40NDIrMTEwOC45NSs4MzUuMzQyKzgzNC40NSs4MzUuMzQyTDY2NC42NSs4MzUuMzQyTDY2NC42NSsxMTY0Ljg0TDgzNC40NSsxMTY0Ljg0QzkyMy45MzIrMTE2NC44NCs5ODQuMjQ0KzEyMDEuNDgrMTAxNS4zOSsxMjUwLjg3QzEwNzkuNzgrMTM1MysxMDE5LjQ3KzE1MDkuNjQrODM0LjQ1KzE1MDkuNjRMMTM1LjQ1KzE1MDkuNjRMMTM1LjQ1KzE4NjQuNTRMODI2LjY1KzE4NjQuNTRDMTE4Mi45NSsxODY0LjU0KzE0NTkuNDUrMTcyMS45NCsxNDY5LjI1KzEzNjguNTRDMTQ2OS4yNSsxMjA1Ljk0KzE0MjQuNzUrMTA4NC40NCsxMzQ2LjM1Kzk5OS45NDJDMTQyNC43NSs5MTUuNTQyKzE0NjkuMjUrNzk0LjA0MisxNDY5LjI1KzYzMS40NDJaXCIsIGZpbGw6IFwiI0ZGRkZGRlwiLCBvcGFjaXR5OiBcIjFcIn0pXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19DaGVja2JveCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5jaGVja2VkIHx8IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJsaVwiLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3ggXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hFbGVtZW50KVswXS5jaGVja2JveCwgb25DbGljazogdGhpcy5vbkNsaWNrfSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtaW5uZXIgXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hJbm5lcilbMF0uY2hlY2tib3hJbm5lcn0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtjbGFzc05hbWU6IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3hFbGVtZW50LCBjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWQsIG9uQ2hhbmdlOiAoKSA9PiB7fSwgdHlwZTogXCJjaGVja2JveFwifSksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvbkNsaWNrKCkge1xuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMuaWQsICF0aGlzLnN0YXRlLmNoZWNrZWQpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGNoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWRcbiAgICAgICAgfSk7XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgQXJyb3cgZnJvbSBcIi4uL2ljb25zL2Rvd25hcnJvd1wiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7b3BlbjogZmFsc2UsIHZhbHVlOiB0aGlzLnByb3BzLnZhbHVlIHx8IHRoaXMucHJvcHMub3B0aW9uc1swXS52YWx1ZX07XG4gICAgICAgIHRoaXMuZHJvcGRvd24gPSBSZWFjdC5jcmVhdGVSZWYoKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zaG93TWVudSA9IHRoaXMuc2hvd01lbnUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oaWRlTWVudSA9IHRoaXMuaGlkZU1lbnUuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBzaG93TWVudShldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiB0cnVlfSwgKCkgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuaGlkZU1lbnUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoaWRlTWVudSgpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogZmFsc2V9LCAoKSA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oaWRlTWVudSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3ZhbHVlfSk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlKSB0aGlzLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0ZWQoKSB7cmV0dXJuIHRoaXMucHJvcHMub3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PSB0aGlzLnN0YXRlLnZhbHVlKTt9XG5cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtb3B0aW9uc1wiPlxuICAgICAgICAgICAge3RoaXMucHJvcHMub3B0aW9ucy5tYXAob3B0ID0+IFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0LW9wdGlvbiR7c2VsZWN0ZWQudmFsdWUgPT0gb3B0LnZhbHVlID8gXCIgc2VsZWN0ZWRcIiA6IFwiXCJ9YH0gb25DbGljaz17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMsIG9wdC52YWx1ZSl9PntvcHQubGFiZWx9PC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj47XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMucHJvcHMuc3R5bGUgPT0gXCJ0cmFuc3BhcmVudFwiID8gXCIgYmQtc2VsZWN0LXRyYW5zcGFyZW50XCIgOiBcIlwiO1xuICAgICAgICBjb25zdCBpc09wZW4gPSB0aGlzLnN0YXRlLm9wZW4gPyBcIiBtZW51LW9wZW5cIiA6IFwiXCI7XG4gICAgICAgIHJldHVybiAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxBcnJvdyBjbGFzc05hbWU9XCJiZC1zZWxlY3QtYXJyb3dcIiAvPlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cbiAgICAgICAgICAgICAgICA8L2Rpdj47XG4gICAgfVxufVxuXG4vLyByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcFwiPlxuLy8gPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+e3RoaXMucHJvcHMubGFiZWx9PC9sYWJlbD5cbi8vIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0JHtzdHlsZX0ke2lzT3Blbn1gfSBvbkNsaWNrPXt0aGlzLnNob3dNZW51fSByZWY9e3RoaXMuZHJvcGRvd259PlxuLy8gICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWNvbnRyb2xzXCI+XG4vLyAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XG4vLyAgICAgICAgIDxBcnJvdyBjbGFzc05hbWU9XCJiZC1zZWxlY3QtYXJyb3dcIiAvPlxuLy8gICAgIDwvZGl2PlxuLy8gPC9kaXY+XG4vLyB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cbi8vIDwvZGl2PjsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIi4uL2ljb25zL3NlYXJjaFwiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcylcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBbXCJiZC1zZWFyY2gtd3JhcHBlclwiXVxuICAgICAgICBpZih0aGlzLnN0YXRlLmZvY3VzZWQpY2xhc3NOYW1lLnB1c2goXCJmb2N1c2VkXCIpXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lLmpvaW4oXCIgXCIpfT5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG9uQ2hhbmdlPXt0aGlzLnByb3BzLm9uQ2hhbmdlfSBvbktleURvd249e3RoaXMucHJvcHMub25LZXlEb3dufSB0eXBlPVwidGV4dFwiIFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJiZC1zZWFyY2hcIiBwbGFjZWhvbGRlcj17dGhpcy5wcm9wcy5wbGFjZWhvbGRlcn0gbWF4TGVuZ3RoPVwiNTBcIiBcbiAgICAgICAgICAgICAgICAgICAgb25Gb2N1cz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Zm9jdXNlZDogdHJ1ZX0pXG4gICAgICAgICAgICAgICAgICAgIH19IG9uQmx1cj17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Zm9jdXNlZDogZmFsc2V9KVxuICAgICAgICAgICAgICAgICAgICB9fS8+XG4gICAgICAgICAgICAgICAgICAgIDxTZWFyY2hJY29uIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+O1xuICAgIH1cbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge2NoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH07XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3dpdGNoID0gPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuU3dpdGNoIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfSB2YWx1ZT17dGhpcy5zdGF0ZS5jaGVja2VkfSAvPlxuICAgIH1cblxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiB2YWx1ZX0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3dpdGNoXG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Db250ZW50Q29sdW1uIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgZGlzcGxheU5hbWUoKSB7cmV0dXJuIFwiQ29udGVudENvbHVtblwiO31cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgLy9sZXQgY29udGVudE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW4pWzBdXG4gICAgICAgIGxldCB0aXRsZSA9IHRoaXMucHJvcHMudGl0bGUgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sIHRoaXMucHJvcHMudGl0bGUpIDogbnVsbFxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgICAgIF1cbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW4gKyBcIiBcIitjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIiwgc3R5bGU6IHtwYWRkaW5nOiBcIjYwcHggNDBweCAwcHhcIn19LFxuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgICAgICk7XG4gICAgfVxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCJcblxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xuaW1wb3J0IENoZWNrYm94IGZyb20gXCIuL2NoZWNrYm94XCI7XG5pbXBvcnQgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGZyb20gXCIuL2Nzc0VkaXRvckRldGFjaGVkXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Dc3NFZGl0b3IgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGYucHJvcHMubGluZXMgPSAwO1xuICAgICAgICBzZWxmLnNldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgICBzZWxmLmF0dGFjaCA9IHNlbGYuYXR0YWNoLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYuZGV0YWNoZWRFZGl0b3IgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX0Nzc0VkaXRvckRldGFjaGVkLCB7YXR0YWNoOiBzZWxmLmF0dGFjaH0pO1xuICAgICAgICBzZWxmLm9uQ2xpY2sgPSBzZWxmLm9uQ2xpY2suYmluZChzZWxmKTtcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLnNhdmVDc3MgPSBzZWxmLnNhdmVDc3MuYmluZChzZWxmKTtcbiAgICAgICAgc2VsZi5kZXRhY2ggPSBzZWxmLmRldGFjaC5iaW5kKHNlbGYpO1xuICAgIH1cblxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGRldGFjaGVkOiB0aGlzLnByb3BzLmRldGFjaGVkIHx8IEJEVjIuZWRpdG9yRGV0YWNoZWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgLy8gdGhpcy51cGRhdGVMaW5lQ291bnQoKTtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3JcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFRoZW1lKFwiYWNlL3RoZW1lL2Rpc2NvcmRcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2Nzc1wiKTtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Rm9udFNpemUoMTQpO1xuICAgICAgICB0aGlzLmVkaXRvci5vbihcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnNhdmVDc3MoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3NzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAocHJldlN0YXRlLmRldGFjaGVkICYmICFzZWxmLnN0YXRlLmRldGFjaGVkKSB7XG4gICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUoc2VsZi5kZXRhY2hlZFJvb3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29kZU1pcnJvcigpIHtcbiAgICB9XG5cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxuICAgICAgICAgICAgbW9kZTogXCJjc3NcIixcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXG4gICAgICAgICAgICB0aGVtZTogXCJtYXRlcmlhbFwiLFxuICAgICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IFwic2ltcGxlXCJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgY3NzKCkge1xuICAgICAgICBjb25zdCBfY2NzcyA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKTtcbiAgICAgICAgbGV0IGNjc3MgPSBcIlwiO1xuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIGNjc3MgPSBCdWZmZXIuZnJvbShfY2NzcywgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjY3NzO1xuICAgIH1cblxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5yZWZzLmVkaXRvci52YWx1ZS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XG4gICAgICAgIGlmIChsaW5lQ291bnQgPT0gdGhpcy5wcm9wcy5saW5lcykgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XG4gICAgICAgIHRoaXMucHJvcHMubGluZXMgPSBsaW5lQ291bnQ7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgICAgICBjb25zdCB7ZGV0YWNoZWR9ID0gc2VsZi5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGRldGFjaGVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtpZDogXCJlZGl0b3ItZGV0YWNoZWRcIn0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBcIkN1c3RvbSBDU1MgRWRpdG9yXCJ9KSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiaDNcIixcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgXCJFZGl0b3IgRGV0YWNoZWRcIlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdHRhY2goKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICBcIkF0dGFjaFwiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICFkZXRhY2hlZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogXCJDdXN0b20gQ1NTIEVkaXRvclwifSksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmQtY3VzdG9tY3NzLWVkaXRvclwiLCBjbGFzc05hbWU6IFwiZWRpdG9yXCIsIHJlZjogXCJlZGl0b3JcIn0sIHNlbGYuY3NzKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWF0dGFjaC1jb250cm9sc1wifSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ1bFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1ncm91cFwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRyb2xzLWJ1dHRvblwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIzcHggMCAwIDNweFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJ1cGRhdGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVXBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2F2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwiZGV0YWNoXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkRldGFjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2ZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCI1cHhcIn19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zYXZlZCBjaGFuZ2VzIGFyZSBsb3N0IG9uIGRldGFjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiaGVscC10ZXh0XCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiUHJlc3MgXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiY29kZVwiLCB7Y2xhc3NOYW1lOiBcImlubGluZVwifSwgXCJjdHJsXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiK1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJpbmxpbmVcIn0sIFwiLFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiB3aXRoIHRoZSBlZGl0b3IgZm9jdXNlZCB0byBhY2Nlc3MgdGhlIGVkaXRvcidzIHNldHRpbmdzLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgIF1cbiAgICB9XG5cbiAgICBvbkNsaWNrKGFyZykge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgc3dpdGNoIChhcmcpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUNzcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcbiAgICAgICAgICAgICAgICBzZWxmLnNhdmVDc3MoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkZXRhY2hcIjpcbiAgICAgICAgICAgICAgICBzZWxmLmRldGFjaCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQpIHtcbiAgICAgICAgc3dpdGNoIChpZCkge1xuICAgICAgICAgICAgY2FzZSBcImxpdmUtdXBkYXRlXCI6XG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0gPSBjaGVja2VkO1xuICAgICAgICAgICAgICAgIFNldHRpbmdzLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQ3NzKCkge1xuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XG4gICAgICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCB0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpO1xuICAgIH1cblxuICAgIHNhdmVDc3MoKSB7XG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiLCBCdWZmZXIuZnJvbSh0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCksIFwidXRmLThcIikudG9TdHJpbmcoXCJiYXNlNjRcIikpO1xuICAgIH1cblxuICAgIGRldGFjaCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZGV0YWNoZWQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRyb290ID0gc2VsZi5kZXRhY2hlZFJvb3Q7XG4gICAgICAgIGlmICghZHJvb3QpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRkFJTEVEIFRPIElOSkVDVCBST09UOiAuYXBwXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHNlbGYuZGV0YWNoZWRFZGl0b3IsIGRyb290KTtcbiAgICB9XG5cbiAgICBnZXQgZGV0YWNoZWRSb290KCkge1xuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiKTtcbiAgICAgICAgaWYgKCFfcm9vdCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdERldGFjaGVkUm9vdCgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkUm9vdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3Jvb3Q7XG4gICAgfVxuXG4gICAgaW5qZWN0RGV0YWNoZWRSb290KCkge1xuICAgICAgICBjb25zdCBhcHAgPSBET00ucXVlcnkoXCIuYXBwLCAuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuYXBwICYmIGUubGF5ZXJzKVswXS5hcHApKTtcbiAgICAgICAgaWYgKCFhcHApIHJldHVybiBmYWxzZTtcbiAgICAgICAgRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIj5gKSwgYXBwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXR0YWNoKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBkZXRhY2hlZDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCJcblxuaW1wb3J0IENoZWNrYm94IGZyb20gXCIuL2NoZWNrYm94XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Dc3NFZGl0b3JEZXRhY2hlZCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgc2VsZi5vbkNsaWNrID0gc2VsZi5vbkNsaWNrLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYudXBkYXRlQ3NzID0gc2VsZi51cGRhdGVDc3MuYmluZChzZWxmKTtcbiAgICAgICAgc2VsZi5zYXZlQ3NzID0gc2VsZi5zYXZlQ3NzLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYub25DaGFuZ2UgPSBzZWxmLm9uQ2hhbmdlLmJpbmQoc2VsZik7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkLWRldGFjaGVkLWVkaXRvclwiKTtcbiAgICAgICAgQkRWMi5lZGl0b3JEZXRhY2hlZCA9IHRydWU7XG4gICAgICAgIC8vIHRoaXMudXBkYXRlTGluZUNvdW50KCk7XG4gICAgICAgIHRoaXMuZWRpdG9yID0gYWNlLmVkaXQoXCJiZC1jdXN0b21jc3MtZWRpdG9yLWRldGFjaGVkXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9kaXNjb3JkXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9jc3NcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFNob3dQcmludE1hcmdpbihmYWxzZSk7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldEZvbnRTaXplKDE0KTtcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5zYXZlQ3NzKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNzcygpO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBET00ucmVtb3ZlQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZC1kZXRhY2hlZC1lZGl0b3JcIik7XG4gICAgICAgIEJEVjIuZWRpdG9yRGV0YWNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5yZWZzLmVkaXRvci52YWx1ZS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XG4gICAgICAgIGlmIChsaW5lQ291bnQgPT0gdGhpcy5wcm9wcy5saW5lcykgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XG4gICAgICAgIHRoaXMucHJvcHMubGluZXMgPSBsaW5lQ291bnQ7XG4gICAgfVxuXG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcbiAgICAgICAgICAgIG1vZGU6IFwiY3NzXCIsXG4gICAgICAgICAgICBpbmRlbnRVbml0OiA0LFxuICAgICAgICAgICAgdGhlbWU6IFwibWF0ZXJpYWxcIixcbiAgICAgICAgICAgIHNjcm9sbGJhclN0eWxlOiBcInNpbXBsZVwiXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IGNzcygpIHtcbiAgICAgICAgY29uc3QgX2Njc3MgPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIik7XG4gICAgICAgIGxldCBjY3NzID0gXCJcIjtcbiAgICAgICAgaWYgKF9jY3NzICYmIF9jY3NzICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBjY3NzID0gQnVmZmVyLmZyb20oX2Njc3MsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2NzcztcbiAgICB9XG5cbiAgICBnZXQgcm9vdCgpIHtcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIik7XG4gICAgICAgIGlmICghX3Jvb3QpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3RSb290KCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcm9vdDtcbiAgICB9XG5cbiAgICBpbmplY3RSb290KCkge1xuICAgICAgICBjb25zdCBhcHAgPSBET00ucXVlcnkoXCIuYXBwLCAuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuYXBwICYmIGUubGF5ZXJzKVswXS5hcHApKTtcbiAgICAgICAgaWYgKCFhcHApIHJldHVybiBmYWxzZTtcbiAgICAgICAgRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIj5gKSwgYXBwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJkLWRldGFjaGVkLWNzcy1lZGl0b3JcIiwgaWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1lZGl0b3JcIn0sXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWlubmVycGFuZVwifSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJlZGl0b3Itd3JhcHBlclwifSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yLWRldGFjaGVkXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtYXR0YWNoLWNvbnRyb2xzXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWdyb3VwXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCB7aWQ6IFwibGl2ZS11cGRhdGVcIiwgdGV4dDogXCJMaXZlIFVwZGF0ZVwiLCBvbkNoYW5nZTogc2VsZi5vbkNoYW5nZSwgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl19KVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInVwZGF0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwic2F2ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTYXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMCAzcHggM3B4IDBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJhdHRhY2hcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQXR0YWNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVbnNhdmVkIGNoYW5nZXMgYXJlIGxvc3Qgb24gYXR0YWNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCkge1xuICAgICAgICBzd2l0Y2ggKGlkKSB7XG4gICAgICAgICAgICBjYXNlIFwibGl2ZS11cGRhdGVcIjpcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSA9IGNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgU2V0dGluZ3Muc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNsaWNrKGlkKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBzd2l0Y2ggKGlkKSB7XG4gICAgICAgICAgICBjYXNlIFwiYXR0YWNoXCI6XG4gICAgICAgICAgICAgICAgaWYgKERPTS5xdWVyeShcIiNlZGl0b3ItZGV0YWNoZWRcIikpIHNlbGYucHJvcHMuYXR0YWNoKCk7XG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHNlbGYucm9vdCk7XG4gICAgICAgICAgICAgICAgc2VsZi5yb290LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ3NzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic2F2ZVwiOlxuICAgICAgICAgICAgICAgIHNlbGYuc2F2ZUNzcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQ3NzKCkge1xuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XG4gICAgICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCB0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpO1xuICAgIH1cblxuICAgIHNhdmVDc3MoKSB7XG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiLCBCdWZmZXIuZnJvbSh0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCksIFwidXRmLThcIikudG9TdHJpbmcoXCJiYXNlNjRcIikpO1xuICAgIH1cbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCREVycm9yQm91bmRhcnkgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgdGhpcy5zdGF0ZSA9IHtoYXNFcnJvcjogZmFsc2V9O1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZENhdGNoKCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7aGFzRXJyb3I6IHRydWV9KTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5oYXNFcnJvcikgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInJlYWN0LWVycm9yXCJ9LCBcIkNvbXBvbmVudCBFcnJvclwiKTsgIFxuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47IFxuICAgIH1cbn1cblxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBCREVycm9yQm91bmRhcnkucHJvdG90eXBlLnJlbmRlcjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCREVycm9yQm91bmRhcnkucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcbn0pOyAiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERlbGV0ZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiO1xuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfT5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPjxwYXRoIGQ9XCJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0elwiLz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwelwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz47XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XG5cbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG93bkFycm93IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCI7XG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fT5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjEyIDkuMjlMMTIgMTMuMTdsMy44OC0zLjg4Yy4zOS0uMzkgMS4wMi0uMzkgMS40MSAwIC4zOS4zOS4zOSAxLjAyIDAgMS40MWwtNC41OSA0LjU5Yy0uMzkuMzktMS4wMi4zOS0xLjQxIDBMNi43IDEwLjdjLS4zOS0uMzktLjM5LTEuMDIgMC0xLjQxLjM5LS4zOCAxLjAzLS4zOSAxLjQyIDB6XCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcblxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCI7XG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAxNy4yNVYyMWgzLjc1TDE3LjgxIDkuOTRsLTMuNzUtMy43NUwzIDE3LjI1ek0yMC43MSA3LjA0Yy4zOS0uMzkuMzktMS4wMiAwLTEuNDFsLTIuMzQtMi4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBsLTEuODMgMS44MyAzLjc1IDMuNzUgMS44My0xLjgzelwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiIC8+XG4gICAgICAgICAgICAgICA8L3N2Zz47XG4gICAgfVxufSIsInsvKiA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCIgd2lkdGg9XCIxOHB4XCIgaGVpZ2h0PVwiMThweFwiPlxuICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgPHBhdGggZD1cIk0xMyAzYy00Ljk3IDAtOSA0LjAzLTkgOUgxbDMuODkgMy44OS4wNy4xNEw5IDEySDZjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjkzIDAtMy42OC0uNzktNC45NC0yLjA2bC0xLjQyIDEuNDJDOC4yNyAxOS45OSAxMC41MSAyMSAxMyAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptLTEgNXY1bDQuMjggMi41NC43Mi0xLjIxLTMuNS0yLjA4VjhIMTJ6XCIvPlxuPC9zdmc+ICovfVxuXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhpc3RvcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE4cHhcIjtcbiAgICAgICAgcmV0dXJuIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMyAzYy00Ljk3IDAtOSA0LjAzLTkgOUgxbDMuODkgMy44OS4wNy4xNEw5IDEySDZjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjkzIDAtMy42OC0uNzktNC45NC0yLjA2bC0xLjQyIDEuNDJDOC4yNyAxOS45OSAxMC41MSAyMSAxMyAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptLTEgNXY1bDQuMjggMi41NC43Mi0xLjIxLTMuNS0yLjA4VjhIMTJ6XCIvPlxuICAgICAgICA8L3N2Zz47XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XG5cbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCI7XG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fT5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6XCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcbiAgICB9XG59IiwibGV0IG1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpblRvcDYwKVswXVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXJnaW5Ub3AgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpe1xuICAgICAgICBpZighbWFyZ2luTW9kdWxlKW1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpblRvcDYwKVswXVxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e21hcmdpbk1vZHVsZS5tYXJnaW5Ub3A2MH0+PC9kaXY+XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgVjJDX1NldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xuaW1wb3J0IFYyQ19TZXR0aW5nc0dyb3VwIGZyb20gXCIuL3NldHRpbmdzR3JvdXBcIjtcbmltcG9ydCBkYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XG5pbXBvcnQgeyBkZWZhdWx0UlBDLCBzZXR0aW5nc1JQQyB9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IEN1c3RvbVJpY2hQcmVzZW5jZSBmcm9tIFwiLi4vbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2VcIlxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XG5cbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcblxubGV0IFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlc1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1ByZXNlbmNlU2V0dGluZ3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZGF0YTogZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSB8fCBkZWZhdWx0UlBDLFxuICAgICAgICAgICAgYXNzZXRzOiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcmV2aWV3ID0gbnVsbFxuICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxuICAgICAgICBpZih0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpe1xuICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cyA9IG5ldyBTZXQoKVxuICAgIH1cblxuICAgIHVwZGF0ZVdoZW5GZXRjaGVkKGNvbXApe1xuICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5hZGQoY29tcClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge0lucHV0VGV4dH0gc2V0dGluZyBcbiAgICAgKi9cbiAgICBvbkNoYW5nZShzZXR0aW5nLCB2YWx1ZSl7XG4gICAgICAgIGxldCBkZWZhdWx0U2V0dGluZyA9IFJQQ1Byb3BzLmZpbmQoZSA9PiBlLmlkID09PSBzZXR0aW5nLnByb3BzLmlkKVxuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgdGhpcy5zdGF0ZS5kYXRhLCB7XG4gICAgICAgICAgICAgICAgW2RlZmF1bHRTZXR0aW5nLmlkXTogISF2YWx1ZSA/IHZhbHVlIDogbnVsbFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBhc3NldHM6IHRoaXMuc3RhdGUuYXNzZXRzXG4gICAgICAgIH0pXG4gICAgICAgIGlmKHNldHRpbmcucHJvcHMuaWQgPT09IFwiYXBwbGljYXRpb25faWRcIil7XG4gICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJycGNcIiwgc2V0dGluZ3NSUEMpO1xuICAgICAgICB0aGlzLnByZXZpZXcuZm9yY2VVcGRhdGUoKVxuICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2Uuc2V0KHNldHRpbmdzUlBDKVxuICAgIH1cblxuICAgIGZldGNoQXNzZXRzKCl7XG4gICAgICAgIGlmKHRoaXMuaXNmZXRjaGluZyA9PT0gdHJ1ZSl7XG4gICAgICAgICAgICBsZXQgYXBwID0gdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQgIT09IGFwcCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcbiAgICAgICAgICAgIH0sIDUwMDApO1xuICAgICAgICB9XG4gICAgICAgIGlmKCF0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpe1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxuICAgICAgICAgICAgICAgIGFzc2V0czogW11cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSB0cnVlXG4gICAgICAgIEN1c3RvbVJpY2hQcmVzZW5jZS5mZXRjaEFzc2V0cyh0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpXG4gICAgICAgIC50aGVuKGFzc2V0cyA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxuICAgICAgICAgICAgICAgIGFzc2V0czogT2JqZWN0LmtleXMoYXNzZXRzKS5tYXAoayA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhc3NldCA9IGFzc2V0c1trXVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGFzc2V0LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYXNzZXQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFzc2V0LnR5cGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxuICAgICAgICAgICAgICAgIGFzc2V0czogW11cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgdXBkYXRlUHJldmlldyhkYXRhKXtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBkYXRhXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgZ2V0IG1vZHVsZXMoKXtcbiAgICAgICAgcmV0dXJuIFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyB8fCAoVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzID0gW1xuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXG4gICAgICAgIF0pXG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgW1xuICAgICAgICAgICAgbWFyZ2luTW9kdWxlXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NHcm91cCB0aXRsZT1cIlJpY2hQcmVzZW5jZSBTZXR0aW5nc1wiIHNldHRpbmdzPXt0aGlzLnByb3BzLnNldHRpbmdzfSBvbkNoYW5nZT17dGhpcy5wcm9wcy5vbkNoYW5nZX0vPixcbiAgICAgICAgICAgIDxNYXJnaW5Ub3AgLz4sXG4gICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIlJpY2hQcmVzZW5jZVwiLz4sXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHsvKiogb3B0aW9ucyAqL31cbiAgICAgICAgICAgICAgICB7dGhpcy5vcHRpb25zQ29tcG9uZW50c31cbiAgICAgICAgICAgIDwvZGl2PixcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPE1hcmdpblRvcCAvPlxuICAgICAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiUHJldmlld1wiLz5cbiAgICAgICAgICAgICAgICB7LyoqIHByZXZpZXcgKi99XG4gICAgICAgICAgICAgICAgPFJwY1ByZXZpZXcgc2V0dGluZ3M9e3RoaXN9Lz5cbiAgICAgICAgICAgIDwvZGl2PixcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXttYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PjwvZGl2PixcbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3tvcGFjaXR5OiAwLjAxfX0gb25DbGljaz17d2luZG93Lm9oZ29kb2hmdWNrfT5cbiAgICAgICAgICAgICAgICBPaCBnb2QgT2ggZnVja1xuICAgICAgICAgICAgPC9idXR0b24+LFxuICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT17e29wYWNpdHk6IDAuMDF9fSBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9TGtZYTdycHNfZzRcIilcbiAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgIFNlZSA/IEkgcHVsbGVkIGEgbGl0bGUgc25lYWt5IG9uIHlhXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgXVxuICAgIH1cblxuICAgIGdldCBvcHRpb25zQ29tcG9uZW50cygpe1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0NvbXBvbmVudHMgfHwgKHRoaXMuX29wdGlvbnNDb21wb25lbnRzID0gUlBDUHJvcHMubWFwKGUgPT4ge1xuICAgICAgICAgICAgaWYoZS50eXBlID09PSBcInRleHRcIil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDxJbnB1dFRleHQgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5cbiAgICAgICAgICAgIH1lbHNlIGlmKGUudHlwZSA9PT0gXCJudW1iZXJcIil7XG4gICAgICAgICAgICAgICAgbGV0IGFycmF5ID0gWzxJbnB1dE51bWJlciBzZXR0aW5nPXtlfSBtYW5hZ2VyPXt0aGlzfSBpZD17ZS5pZH0vPl0vKlxuICAgICAgICAgICAgICAgIGlmKGUuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiKXtcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkudW5zaGlmdCg8RGlzY29yZEJ1dHRvbiB0aXRsZT1cIkNvcHkgQ3VycmVudCBUaW1lc3RhbXBcIiBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3JkTmF0aXZlLmNsaXBib2FyZC5jb3B5KERhdGUubm93KCkrXCJcIilcbiAgICAgICAgICAgICAgICAgICAgfX0gLz4pXG4gICAgICAgICAgICAgICAgfSovXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5XG4gICAgICAgICAgICB9ZWxzZSBpZihlLnR5cGUgPT09IFwiY2hvaWNlXCIpe1xuICAgICAgICAgICAgICAgIGlmKFtcImFzc2V0cy5zbWFsbFwiLCBcImFzc2V0cy5sYXJnZVwiXS5pbmNsdWRlcyhlLmlkKSl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8SW5wdXRDaG9pY2Ugc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9IGNob2ljZXM9e1t7dmFsdWU6IFwibm9uZVwiLCBsYWJlbDogXCJObyBhc3NldHNcIn1dLmNvbmNhdCh0aGlzLnN0YXRlLmFzc2V0cy5tYXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcImFzc2V0LVwiK2UuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSl9Lz5cbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiVW5rbm93biBjaG9pY2UuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKVxuICAgIH1cbn1cbmNvbnN0IFJQQ1Byb3BzID0gW1xuICAgIHtcbiAgICAgICAgdGl0bGU6IFwiQXBwbGljYXRpb24gSURcIixcbiAgICAgICAgaWQ6IFwiYXBwbGljYXRpb25faWRcIixcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiNzExNDE2OTU3NzE4NzU3NDE4XCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgdGl0bGU6IFwiTmFtZVwiLFxuICAgICAgICBpZDogXCJuYW1lXCIsXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICBwbGFjZWhvbGRlcjogXCJMaWdodGNvcmRcIlxuICAgIH0sXG4gICAge1xuICAgICAgICB0aXRsZTogXCJEZXRhaWxzXCIsXG4gICAgICAgIGlkOiBcImRldGFpbHNcIixcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkJyb3dzaW5nIERpc2NvcmRcIlxuICAgIH0sXG4gICAge1xuICAgICAgICB0aXRsZTogXCJTdGF0ZVwiLFxuICAgICAgICBpZDogXCJzdGF0ZVwiLFxuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiTGlnaHRjb3JkIENsaWVudFwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHRpdGxlOiBcIlRpbWVzdGFtcCBTdGFydFwiLFxuICAgICAgICBpZDogXCJ0aW1lc3RhbXBzLnN0YXJ0XCIsXG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGdldCBwbGFjZWhvbGRlcigpe1xuICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KClcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICB0aXRsZTogXCJMYXJnZUFzc2V0XCIsXG4gICAgICAgIGlkOiBcImFzc2V0cy5sYXJnZVwiLFxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHRpdGxlOiBcIlNtYWxsQXNzZXRcIixcbiAgICAgICAgaWQ6IFwiYXNzZXRzLnNtYWxsXCIsXG4gICAgICAgIHR5cGU6IFwiY2hvaWNlXCJcbiAgICB9LFxuXVxuXG5sZXQgaW5wdXRUZXh0TW9kdWxlc1xuY2xhc3MgSW5wdXRUZXh0IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgZ2V0IG1vZHVsZXMoKXtcbiAgICAgICAgaWYoaW5wdXRUZXh0TW9kdWxlcyAmJiBpbnB1dFRleHRNb2R1bGVzWzBdKXJldHVybiBpbnB1dFRleHRNb2R1bGVzXG4gICAgICAgIHJldHVybiBpbnB1dFRleHRNb2R1bGVzID0gW1xuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuaW5wdXRNaW5pKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUxNiAmJiBlLnNpemUyMClbMF0sXG4gICAgICAgIF1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XG4gICAgICAgIHN1cGVyKHByb3BzKVxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZGF0YTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5wdXQgPSA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuVGV4dElucHV0IHBsYWNlaG9sZGVyPXtzZXR0aW5nLnBsYWNlaG9sZGVyfSBuYW1lPXtzZXR0aW5nLmlkfSB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGlmKCF0aGlzLmxhc3RFZGl0ZWQgfHwgdGhpcy5sYXN0RWRpdGVkIDwgRGF0ZS5ub3coKSAtIDUwMCl7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlKVxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcbiAgICAgICAgICAgIH1lbHNlIGlmKCF0aGlzLmlzVGltaW5nKXtcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB0aGlzLnN0YXRlLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcbiAgICAgICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9fSB0eXBlPVwidGV4dFwiLz5cbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcblxuICAgICAgICBsZXQgW1xuICAgICAgICAgICAgcm93TW9kdWxlLFxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcbiAgICAgICAgICAgIGZsZXhNb2R1bGUsXG4gICAgICAgICAgICBpbnB1dE1vZHVsZSxcbiAgICAgICAgICAgIHNpemVNb2R1bGUyLFxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG5cbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxuICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAge3RoaXMuaW5wdXR9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxEaXZpZGVyLz5cbiAgICAgICAgPC9kaXY+KVxuICAgIH1cbn1cblxubGV0IElucHV0TnVtYmVyTW9kdWxlc1xuY2xhc3MgSW5wdXROdW1iZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBnZXQgbW9kdWxlcygpe1xuICAgICAgICByZXR1cm4gSW5wdXROdW1iZXJNb2R1bGVzIHx8IChJbnB1dE51bWJlck1vZHVsZXMgPSBbXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5pbnB1dE1pbmkpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTE2ICYmIGUuc2l6ZTIwKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yVHJhbnNwYXJlbnQpWzBdLFxuICAgICAgICBdKVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcbiAgICAgICAgc3VwZXIocHJvcHMpXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnB1dCA9IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5UZXh0SW5wdXQgcGxhY2Vob2xkZXI9e3NldHRpbmcucGxhY2Vob2xkZXJ9IG5hbWU9e3NldHRpbmcuaWR9IHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IHR5cGU9XCJudW1iZXJcIiBvbkNoYW5nZT17KHZhbHVlLCBuYW1lLCBpbnB1dCkgPT4ge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcZF0rL2csIFwiXCIpXG4gICAgICAgICAgICBpZih2YWx1ZSA9PSB0aGlzLnN0YXRlLmRhdGEpe1xuICAgICAgICAgICAgICAgIGlucHV0LnNldFZhbHVlKHZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9fSB0eXBlPVwidGV4dFwiLz5cbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcblxuICAgICAgICBsZXQgW1xuICAgICAgICAgICAgcm93TW9kdWxlLFxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcbiAgICAgICAgICAgIGZsZXhNb2R1bGUsXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcblxuXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cbiAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgIHt0aGlzLmlucHV0fVxuICAgICAgICAgICAgICAgIHtzZXR0aW5nLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIiA/IFxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKStcIlwiKVxuICAgICAgICAgICAgICAgIH19IGNvbG9yPVwiYnJhbmRcIj5Db3B5IGN1cnJlbnQgdGltZXN0YW1wPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj4gOiBudWxsfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8RGl2aWRlci8+XG4gICAgICAgIDwvZGl2PilcbiAgICB9XG59XG5cbmxldCBJbnB1dENob2ljZU1vZHVsZXNcbmNsYXNzIElucHV0Q2hvaWNlIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcylcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdID8gXCJhc3NldC1cIit0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSA6IFwibm9uZVwiXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLnVwZGF0ZVdoZW5GZXRjaGVkKHRoaXMpXG4gICAgfVxuXG4gICAgb25DaGFuZ2UoZGF0YSl7XG4gICAgICAgIGxldCB2YWx1ZSA9IGRhdGEudmFsdWVcblxuICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlID09PSBcIm5vbmVcIiA/IG51bGwgOiB2YWx1ZS5yZXBsYWNlKFwiYXNzZXQtXCIsIFwiXCIpKVxuICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxuICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XG4gICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSA9PT0gXCJub25lXCIgPyBudWxsIDogdGhpcy5zdGF0ZS5kYXRhLnJlcGxhY2UoXCJhc3NldC1cIiwgXCJcIikpXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IG51bGxcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZGF0YTogdmFsdWVcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXG4gICAgfVxuICAgIFxuICAgIGdldCBtb2R1bGVzKCl7XG4gICAgICAgIHJldHVybiBJbnB1dENob2ljZU1vZHVsZXMgfHwgKElucHV0Q2hvaWNlTW9kdWxlcyA9IFtcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxuICAgICAgICBdKVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xuXG4gICAgICAgIGxldCBbXG4gICAgICAgICAgICByb3dNb2R1bGUsXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUsXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUyLFxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXG4gICAgICAgICAgICBzaXplTW9kdWxlLFxuICAgICAgICAgICAgZmxleE1vZHVsZVxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG4gICAgICAgIFxuICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5hc3NldHMubWFwKGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJhc3NldC1cIitlLmlkLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBlLm5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBvcHRpb25zLnVuc2hpZnQoe1xuICAgICAgICAgICAgdmFsdWU6IFwibm9uZVwiLFxuICAgICAgICAgICAgbGFiZWw6IFwiTm8gYXNzZXRzXCJcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XG4gICAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuRHJvcGRvd24gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb3B0aW9ucz17b3B0aW9uc30gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzKX0gLz5cbiAgICAgICAgICAgICAgICB7Lyo8U2VsZWN0IHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyl9IG9wdGlvbnM9e29wdGlvbnN9Lz4qL31cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPERpdmlkZXIvPlxuICAgICAgICA8L2Rpdj4pXG4gICAgfVxufVxuXG5sZXQgRGl2aWRlck1vZHVsZXMgPSBbXVxuY2xhc3MgRGl2aWRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIGdldCBtb2R1bGVzKCl7XG4gICAgICAgIHJldHVybiBEaXZpZGVyTW9kdWxlcyYmRGl2aWRlck1vZHVsZXNbMF0gPyBEaXZpZGVyTW9kdWxlcyA6IChEaXZpZGVyTW9kdWxlcyA9IFtcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXIgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXJEZWZhdWx0KVswXVxuICAgICAgICBdKVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBsZXQgW1xuICAgICAgICAgICAgZGl2aWRlcixcbiAgICAgICAgICAgIGRpdmlkZXJEZWZhdWx0XG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcblxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YCR7ZGl2aWRlci5kaXZpZGVyfSAke2RpdmlkZXJEZWZhdWx0LmRpdmlkZXJEZWZhdWx0fWB9PjwvZGl2PlxuICAgIH1cbn1cblxuY2xhc3MgRGlzY29yZEJ1dHRvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGxldCByb3dNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXVxuICAgICAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdXG5cbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9IGNvbG9yPVwiYnJhbmRcIj5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMudGl0bGV9XG4gICAgICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj4pXG4gICAgfVxufVxuXG5jbGFzcyBScGNQcmV2aWV3IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KXtcbiAgICAgICAgc3VwZXIocHJvcHMpXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBhY3RpdmU6IFwicHJvZmlsZVwiXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJzID0gW11cblxuICAgICAgICB0aGlzLnByb3BzLnNldHRpbmdzLnByZXZpZXcgPSB0aGlzXG4gICAgfVxuXG4gICAgY2hhbmdlVGFiKHRhYil7XG4gICAgICAgIGxldCBhbmNpZW50VGFiID0gdGhpcy5zdGF0ZS5hY3RpdmVcbiAgICAgICAgaWYoYW5jaWVudFRhYiA9PT0gdGFiLnByb3BzLmlkKXJldHVyblxuXG4gICAgICAgIHRoaXMudGFicy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgZS5zZXRBY3RpdmUoZmFsc2UpXG4gICAgICAgIH0pXG4gICAgICAgIHRhYi5zZXRBY3RpdmUodHJ1ZSlcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IHRhYi5wcm9wcy5pZFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPVwibGMtdGFiV3JhcHBlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYy10YWJuYXZcIiBzdHlsZT17e2ZsZXg6IFwiMCAxIGF1dG9cIn19PlxuICAgICAgICAgICAgICAgIDxUYWIgcHJldmlldz17dGhpc30gdGl0bGU9XCJGdWxsIFByb2ZpbGVcIiBpZD1cInByb2ZpbGVcIi8+XG4gICAgICAgICAgICAgICAgPFRhYiBwcmV2aWV3PXt0aGlzfSB0aXRsZT1cIlVzZXIgUG9wb3V0XCIgaWQ9XCJwb3BvdXRcIi8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxQcmVzZW5jZUVycm9yQ2F0Y2hlciBwcmV2aWV3PXt0aGlzLnByZXZpZXd9IHN0YXRlPXt0aGlzLnN0YXRlLnJwY30gcHJvcHM9e3twcmV2aWV3OiB0aGlzfX0ga2V5PXt0aGlzLnN0YXRlLmFjdGl2ZX0gLz5cbiAgICAgICAgPC9kaXY+KVxuICAgIH0gICBcblxuICAgIGlzQWN0aXZlKHRhYil7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmFjdGl2ZSA9PT0gdGFiXG4gICAgfVxuXG4gICAgZ2V0IHByZXZpZXcoKXtcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5hY3RpdmUgPT09IFwicHJvZmlsZVwiKXJldHVybiBQcm9maWxlXG4gICAgICAgIHJldHVybiBQb3BvdXRcbiAgICB9XG59XG5cbmNsYXNzIFRhYiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcylcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgYWN0aXZlOiBwcm9wcy5wcmV2aWV3LmlzQWN0aXZlKHByb3BzLmlkKVxuICAgICAgICB9XG4gICAgICAgIHByb3BzLnByZXZpZXcudGFicy5wdXNoKHRoaXMpXG4gICAgfVxuXG4gICAgc2V0QWN0aXZlKGlzQWN0aXZlKXtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6ICEhaXNBY3RpdmVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IGNsYXNzTmFtZSA9IGBsYy1uYXZJdGVtYFxuICAgICAgICBpZih0aGlzLnN0YXRlLmFjdGl2ZSl7XG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtQWN0aXZlYFxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSBgIGxjLW5hdkl0ZW1JbmFjdGl2ZWBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWV9IG9uQ2xpY2s9eygpPT57XG4gICAgICAgICAgICB0aGlzLnByb3BzLnByZXZpZXcuY2hhbmdlVGFiKHRoaXMpXG4gICAgICAgIH19PlxuICAgICAgICAgICAge3RoaXMucHJvcHMudGl0bGV9XG4gICAgICAgIDwvZGl2PilcbiAgICB9XG59XG5cbmxldCBlbXB0eUNsYXNzZXNcbmNsYXNzIFByZXNlbmNlRXJyb3JDYXRjaGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb21wb25lbnREaWRDYXRjaChlcnIsIGVyckluZm8pe1xuICAgICAgICBjb25zb2xlLmVycm9yKGVyciwgZXJySW5mbylcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBlcnJvcjogdHJ1ZVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZW5kZXIoKXtcbiAgICAgICAgaWYoIXRoaXMuc3RhdGUpe1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZighdGhpcy5zdGF0ZS5lcnJvcil7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlldyA9IG5ldyB0aGlzLnByb3BzLnByZXZpZXcodGhpcy5wcm9wcy5wcm9wcylcbiAgICAgICAgICAgICAgICBwcmV2aWV3LnNldFN0YXRlKHRoaXMucHJvcHMuc3RhdGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpZXcucmVuZGVyKClcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuZXJyb3IgPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBlbXB0eUNsYXNzZXMgPSBlbXB0eUNsYXNzZXMgfHwgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5lbXB0eVN0YXRlSW1hZ2UgJiYgZS5lbXB0eVN0YXRlKVxuICAgICAgICAgICAgaWYoIWVtcHR5Q2xhc3Nlcyl7XG4gICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiQW4gZXJyb3Igb2NjdXJlZC4gUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9ucy5cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBtYXJnaW46IFwiMjBweFwiXG4gICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpXCIsIFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXG4gICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPXtgbGMtdGFiLWJveC1zaGFkb3cgJHtlbXB0eUNsYXNzZXMuZW1wdHlTdGF0ZX1gfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2VtcHR5Q2xhc3Nlcy5lbXB0eVN0YXRlSW1hZ2V9IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IFwiMjBweFwiXG4gICAgICAgICAgICAgICAgICAgIH19PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17ZW1wdHlDbGFzc2VzLmVtcHR5U3RhdGVIZWFkZXJ9PkFuIGVycm9yIG9jY3VyZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPXtlbXB0eUNsYXNzZXMuZW1wdHlTdGF0ZVN1YnRleHR9PlxuICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9ucy4gSm9pbiBvdXIgwq1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzTmFtZT17YCR7QkRWMi5hbmNob3JDbGFzc2VzLmFuY2hvcn0gJHtCRFYyLmFuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gfSByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9ezB9IG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLmpvaW5MQygpXG4gICAgICAgICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHNlcnZlclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgwq0gZm9yIGhlbHAuXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgfVxufVxuXG5sZXQgcG9wb3V0TW9kdWxlc1xubGV0IFVzZXJQb3BvdXRDb21wb25lbnRcbmxldCBQb3BvdXRQcm9wc1xuY2xhc3MgUG9wb3V0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBnZXQgbW9kdWxlcygpe1xuICAgICAgICByZXR1cm4gcG9wb3V0TW9kdWxlcyB8fCAocG9wb3V0TW9kdWxlcyA9IFtcbiAgICAgICAgICAgIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiVXNlclBvcG91dFwiKSxcbiAgICAgICAgICAgIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpXG4gICAgICAgIF0pXG4gICAgfVxuXG4gICAgZ2V0Q29tcG9uZW50KCl7XG4gICAgICAgIGxldCBbXG4gICAgICAgICAgICBVc2VyUG9wb3V0LFxuICAgICAgICAgICAgdXNlck1vZHVsZVxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG5cbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcbiAgICAgICAgICAgIGxldCByZW5kZXIxID0gVXNlclBvcG91dC5kZWZhdWx0KHtcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHVzZXIuaWQsIFxuICAgICAgICAgICAgICAgIGd1aWxkSWQ6IG51bGwsIFxuICAgICAgICAgICAgICAgIGNoYW5uZWxJZDogbnVsbCwgXG4gICAgICAgICAgICAgICAgZGlzYWJsZVVzZXJQcm9maWxlTGluazogdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIFVzZXJQb3BvdXRDb21wb25lbnQgPSByZW5kZXIxLnR5cGVcbiAgICAgICAgICAgIFBvcG91dFByb3BzID0gcmVuZGVyMS5wcm9wc1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKClcbiAgICAgICAgfSwgbnVsbClcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgaWYoIVVzZXJQb3BvdXRDb21wb25lbnQpcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50KClcbiAgICAgICAgbGV0IFtcbiAgICAgICAgICAgIF9Vc2VyUG9wb3V0LFxuICAgICAgICAgICAgdXNlck1vZHVsZVxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG5cbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXG5cbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcbiAgICAgICAgY29uc3QgYWN0aXZpdHkgPSAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcbiAgICAgICAgICAgIGxldCBnYW1lID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2FtZS5uYW1lIHx8IGRlZmF1bHRSUEMubmFtZSxcbiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgZGV0YWlsczogdGhpcy5nYW1lLmRldGFpbHMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YXRlOiB0aGlzLmdhbWUuc3RhdGUgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXG4gICAgICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcbiAgICAgICAgICAgICAgICAgICAgbGFyZ2VfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgc21hbGxfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5zbWFsbFwiXSB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHR5cGU6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnYW1lXG4gICAgICAgIH0pLmNhbGwoe1xuICAgICAgICAgICAgZ2FtZTogZGF0YVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHBvcG91dCA9IG5ldyBVc2VyUG9wb3V0Q29tcG9uZW50KE9iamVjdC5hc3NpZ24oe30sIFBvcG91dFByb3BzLCB7XG4gICAgICAgICAgICBhY3Rpdml0eTogYWN0aXZpdHksXG4gICAgICAgICAgICB1c2VySWQ6IHVzZXIuaWRcbiAgICAgICAgfSkpLnJlbmRlcigpLnByb3BzLmNoaWxkcmVuIC8vIGJ5cGFzcyB0cmFja2luZ1xuXG4gICAgICAgIC8vIHJlbW92ZSB0aGUgc3RvcCBwcm9wYWdhdGlvbiBzaGl0LlxuICAgICAgICBjb25zdCBjb250YWluZXIgPSA8ZGl2IHsuLi53aW5kb3cuTGlnaHRjb3JkLkFwaS5fLmV4Y2x1ZGVQcm9wZXJ0aWVzKHBvcG91dC5wcm9wcywgW1wib25DbGlja1wiLCBcIm9uQ29udGV4dE1lbnVcIl0pfSAvPlxuXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxjLXVzZXJQb3BvdXQgbGMtdGFiLWJveC1zaGFkb3dcIj5cbiAgICAgICAgICAgIHtjb250YWluZXJ9XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbn1cblxubGV0IHByb2ZpbGVNb2R1bGVzXG5sZXQgVXNlclByb2ZpbGVDb21wb25lbnRcbmxldCBQcm9maWxlUHJvcHNcbmxldCBjb25uZWN0ZWRQcm9maWxlU3RvcmVcbmNsYXNzIFByb2ZpbGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGdldCBtb2R1bGVzKCl7XG4gICAgICAgIHJldHVybiBwcm9maWxlTW9kdWxlcyB8fCAocHJvZmlsZU1vZHVsZXMgPSBbXG4gICAgICAgICAgICBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIlVzZXJQcm9maWxlXCIpLFxuICAgICAgICAgICAgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilcbiAgICAgICAgXSlcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IFtcbiAgICAgICAgICAgIFVzZXJQcm9maWxlLFxuICAgICAgICAgICAgdXNlck1vZHVsZVxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG5cbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXG4gICAgICAgIGlmKCFVc2VyUHJvZmlsZUNvbXBvbmVudCl7XG4gICAgICAgICAgICBjb25zdCByZW5kZXIxID0gbmV3IFVzZXJQcm9maWxlLmRlZmF1bHQoe1xuICAgICAgICAgICAgICAgIHVzZXI6IHVzZXJcbiAgICAgICAgICAgIH0pLnJlbmRlcigpXG4gICAgICAgICAgICBjb25uZWN0ZWRQcm9maWxlU3RvcmUgPSByZW5kZXIxLnR5cGVcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcjIgPSBuZXcgcmVuZGVyMS50eXBlKHJlbmRlcjEucHJvcHMpLnJlbmRlcigpXG4gICAgICAgICAgICBjb25zdCByZW5kZXIzID0gcmVuZGVyMi50eXBlLnJlbmRlcihyZW5kZXIyLnByb3BzLCBudWxsKVxuICAgICAgICAgICAgY29uc3QgcmVuZGVyNCA9IG5ldyByZW5kZXIzLnR5cGUocmVuZGVyMy5wcm9wcykucmVuZGVyKClcbiAgICAgICAgICAgIFVzZXJQcm9maWxlQ29tcG9uZW50ID0gcmVuZGVyNC50eXBlXG4gICAgICAgIH1cbiAgICAgICAgaWYoIVVzZXJQcm9maWxlQ29tcG9uZW50KXRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCB0aGUgVXNlclByb2ZpbGVDb21wb25lbnQgY29tcG9uZW50LmApXG5cbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcbiAgICAgICAgY29uc3QgYWN0aXZpdHkgPSAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcbiAgICAgICAgICAgIGxldCBnYW1lID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2FtZS5uYW1lIHx8IGRlZmF1bHRSUEMubmFtZSxcbiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgZGV0YWlsczogdGhpcy5nYW1lLmRldGFpbHMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YXRlOiB0aGlzLmdhbWUuc3RhdGUgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXG4gICAgICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcbiAgICAgICAgICAgICAgICAgICAgbGFyZ2VfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgc21hbGxfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5zbWFsbFwiXSB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHR5cGU6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnYW1lXG4gICAgICAgIH0pLmNhbGwoe1xuICAgICAgICAgICAgZ2FtZTogZGF0YVxuICAgICAgICB9KVxuXG4gICAgICAgIFByb2ZpbGVQcm9wcyA9IG5ldyBjb25uZWN0ZWRQcm9maWxlU3RvcmUoe1xuICAgICAgICAgICAgdXNlcjogdXNlcixcbiAgICAgICAgICAgIGNsb3NlOiAoKSA9PiB7fVxuICAgICAgICB9KS5yZW5kZXIoKS5wcm9wc1xuICAgICAgICBjb25zdCBwcm9maWxlID0gbmV3IFVzZXJQcm9maWxlQ29tcG9uZW50KE9iamVjdC5hc3NpZ24oe30sIFByb2ZpbGVQcm9wcywge1xuICAgICAgICAgICAgYWN0aXZpdHk6IGFjdGl2aXR5XG4gICAgICAgIH0pKS5yZW5kZXIoKS5wcm9wcy5jaGlsZHJlbiAvLyBieXBhc3MgdHJhY2tpbmdcblxuICAgICAgICBwcm9maWxlLnByb3BzLnN0eWxlID0ge1xuICAgICAgICAgICAgd2lkdGg6IFwiYXV0b1wiXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJsYy10YWIgbGMtdGFiLWJveC1zaGFkb3dcIj5cbiAgICAgICAgICAgIHtwcm9maWxlfVxuICAgICAgICA8L2Rpdj5cbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcblxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4uL3NldHRpbmdzVGl0bGVcIjtcbmltcG9ydCBUYWJCYXJTZXBhcmF0b3IgZnJvbSBcIi4uL3RhYkJhclNlcGFyYXRvclwiO1xuXG5pbXBvcnQgU2VydmVyQ2FyZCBmcm9tIFwiLi9zZXJ2ZXJDYXJkXCI7XG5pbXBvcnQgeyB1c2VGb3JjZVVwZGF0ZSB9IGZyb20gXCIuLi8uLi9tb2R1bGVzL2hvb2tzXCI7XG5cbmxldCBTZXR0aW5nc1ZpZXdcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QdWJsaWNTZXJ2ZXJzIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICAgIHRoaXMuY2xvc2UgPSB0aGlzLmNsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY2hhbmdlQ2F0ZWdvcnkgPSB0aGlzLmNoYW5nZUNhdGVnb3J5LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zZWFyY2hLZXlEb3duID0gdGhpcy5zZWFyY2hLZXlEb3duLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY2hlY2tDb25uZWN0aW9uID0gdGhpcy5jaGVja0Nvbm5lY3Rpb24uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5qb2luID0gdGhpcy5qb2luLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY29ubmVjdCA9IHRoaXMuY29ubmVjdC5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuR3VpbGRTdG9yZSA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRHdWlsZHNcIl0pO1xuICAgICAgICB0aGlzLkF2YXRhckRlZmF1bHRzID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFVzZXJBdmF0YXJVUkxcIiwgXCJERUZBVUxUX0FWQVRBUlNcIl0pO1xuICAgICAgICB0aGlzLkludml0ZUFjdGlvbnMgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYWNjZXB0SW52aXRlXCJdKTtcbiAgICAgICAgdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFNvcnRlZEd1aWxkc1wiXSk7XG5cbiAgICAgICAgdGhpcy5ob29rcyA9IFtdXG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMuY2hlY2tDb25uZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogLTEsXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICAgICAgc2VydmVyczogW10sXG4gICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgICAgICAgIHN0YXRlOiAwLFxuICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWN0aW9uOiB0aGlzLmNhdGVnb3J5U2x1Z3NbMF0sXG4gICAgICAgICAgICB0aGVtZTogXCJkYXJrXCJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5jbG9zZSgpXG4gICAgfVxuXG4gICAgc2VhcmNoKHF1ZXJ5LCBjbGVhcikge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgZmV0Y2goYCR7c2VsZi5zZWFyY2hFbmRQb2ludH0ke3F1ZXJ5fSR7cXVlcnkgPyBcIiZzY2hlbWE9bmV3XCIgOiBcIj9zY2hlbWE9bmV3XCJ9YCwge1xuICAgICAgICAgICAgbWV0aG9kOiBcImdldFwiXG4gICAgICAgIH0pLnRoZW4oYXN5bmMgcmVzID0+IHtcbiAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBhd2FpdCByZXMudGV4dCgpXG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHNlcnZlcnMgPSBkYXRhLnJlc3VsdHMucmVkdWNlKChhcnIsIHNlcnZlcikgPT4ge1xuICAgICAgICAgICAgICAgIHNlcnZlci5qb2luZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXJ2ZXIpO1xuICAgICAgICAgICAgICAgIC8vIGFyci5wdXNoKDxTZXJ2ZXJDYXJkIHNlcnZlcj17c2VydmVyfSBqb2luPXtzZWxmLmpvaW59Lz4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnI7XG4gICAgICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgICAgIGlmICghY2xlYXIpIHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXJzID0gc2VsZi5zdGF0ZS5zZXJ2ZXJzLmNvbmNhdChzZXJ2ZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vc2VydmVycy51bnNoaWZ0KHNlbGYuYmRTZXJ2ZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZW5kID0gZGF0YS5zaXplICsgZGF0YS5mcm9tO1xuICAgICAgICAgICAgZGF0YS5uZXh0ID0gYD9mcm9tPSR7ZW5kfWA7XG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS50ZXJtKSBkYXRhLm5leHQgKz0gYCZ0ZXJtPSR7c2VsZi5zdGF0ZS50ZXJtfWA7XG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5KSBkYXRhLm5leHQgKz0gYCZjYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gZGF0YS50b3RhbCkge1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEudG90YWw7XG4gICAgICAgICAgICAgICAgZGF0YS5uZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRpdGxlID0gYFNob3dpbmcgMS0ke2VuZH0gb2YgJHtkYXRhLnRvdGFsfSByZXN1bHRzIGluICR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xuICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUudGVybSkgdGl0bGUgKz0gYCBmb3IgJHtzZWxmLnN0YXRlLnRlcm19YDtcblxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgICAgIHNlcnZlcnM6IHNlcnZlcnMsXG4gICAgICAgICAgICAgICAgbmV4dDogZGF0YS5uZXh0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiRmFpbGVkIHRvIGxvYWQgc2VydmVycy4gQ2hlY2sgY29uc29sZSBmb3IgZGV0YWlsc1wiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBhc3luYyBqb2luKHNlcnZlckNhcmQpIHtcbiAgICAgICAgaWYgKHNlcnZlckNhcmQucHJvcHMucGlubmVkKSByZXR1cm4gdGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZShzZXJ2ZXJDYXJkLnByb3BzLmludml0ZV9jb2RlKTtcblxuICAgICAgICBhd2FpdCBmZXRjaChgJHt0aGlzLmpvaW5FbmRQb2ludH0vJHtzZXJ2ZXJDYXJkLnByb3BzLnNlcnZlci5pZGVudGlmaWVyfWAse1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgICAgICAgICAgbW9kZTogXCJjb3JzXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VydmVyQ2FyZC5zZXRTdGF0ZSh7am9pbmVkOiB0cnVlfSk7XG4gICAgfVxuXG4gICAgY29ubmVjdCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBzZWxmLndpbmRvd09wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMueCA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblggKyB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgLSBvcHRpb25zLndpZHRoIC8gMik7XG4gICAgICAgIG9wdGlvbnMueSA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblkgKyB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyIC0gb3B0aW9ucy5oZWlnaHQgLyAyKTtcblxuICAgICAgICBjb25zdCB3aW4gPSBzZWxmLmpvaW5XaW5kb3cgPSBuZXcgKHdpbmRvdy5yZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLkJyb3dzZXJXaW5kb3cpKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB1cmwgPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vY29ubmVjdD9zY29wZXM9Z3VpbGRzLmpvaW4mcHJldmlvdXNVcmw9aHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9pbmZvXCI7XG4gICAgICAgIHdpbi53ZWJDb250ZW50cy5vbihcImRpZC1uYXZpZ2F0ZVwiLCAoZXZlbnQsIHVybCkgPT4ge1xuICAgICAgICAgICAgaWYgKHVybCAhPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb1wiKSByZXR1cm47XG4gICAgICAgICAgICB3aW4uY2xvc2UoKTtcbiAgICAgICAgICAgIHNlbGYuY2hlY2tDb25uZWN0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB3aW4ubG9hZFVSTCh1cmwpO1xuICAgICAgICB3aW4uc2V0TWVudUJhclZpc2liaWxpdHkoZmFsc2UpXG4gICAgfVxuXG4gICAgZ2V0IHdpbmRvd09wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICAgICAgaGVpZ2h0OiA1NTAsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzI4MmIzMFwiLFxuICAgICAgICAgICAgc2hvdzogdHJ1ZSxcbiAgICAgICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBtYXhpbWl6YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBtaW5pbWl6YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBhbHdheXNPblRvcDogdHJ1ZSxcbiAgICAgICAgICAgIGZyYW1lOiB0cnVlLFxuICAgICAgICAgICAgY2VudGVyOiBmYWxzZSxcbiAgICAgICAgICAgIHdlYlByZWZlcmVuY2VzOiB7XG4gICAgICAgICAgICAgICAgbm9kZUludGVncmF0aW9uOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBiZFNlcnZlcigpIHtcbiAgICAgICAgY29uc3Qgc2VydmVyID0ge1xuICAgICAgICAgICAgbmFtZTogXCJCZXR0ZXJEaXNjb3JkXCIsXG4gICAgICAgICAgICBvbmxpbmU6IFwiMzAwMDArXCIsXG4gICAgICAgICAgICBtZW1iZXJzOiBcIjcwMDAwK1wiLFxuICAgICAgICAgICAgY2F0ZWdvcmllczogW1wiY29tbXVuaXR5XCIsIFwicHJvZ3JhbW1pbmdcIiwgXCJzdXBwb3J0XCJdLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT2ZmaWNpYWwgQmV0dGVyRGlzY29yZCBzZXJ2ZXIgZm9yIHN1cHBvcnQgZXRjXCIsXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIsXG4gICAgICAgICAgICBpY29uVXJsOiBcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2ljb25zLzg2MDA0NzQ0OTY2OTE0MDQ4LzI5MmU3ZjZiZmZmMmI3MWRmZDEzZTUwOGE4NTlhZWRkLndlYnBcIixcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCIwVG1mbzVaYk9SQ1JxYkFkXCIsXG4gICAgICAgICAgICBwaW5uZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc2VydmVyMiA9IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkXCIsXG4gICAgICAgICAgICBvbmxpbmU6IFwiMTAwK1wiLFxuICAgICAgICAgICAgbWVtYmVyczogXCIzMDArXCIsXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJjb21tdW5pdHlcIiwgXCJwcm9ncmFtbWluZ1wiLCBcInN1cHBvcnRcIl0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPZmZpY2lhbCBMaWdodGNvcmQgc2VydmVyIGZvciBzdXBwb3J0IGV0Y1wiLFxuICAgICAgICAgICAgaWRlbnRpZmllcjogXCI3MDU5MDgzNTAyMTg2NjYxMTdcIixcbiAgICAgICAgICAgIGljb25Vcmw6IFwiaHR0cHM6Ly9naXRodWIuY29tL2xpZ2h0Y29yZC5wbmdcIixcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCI3ZUZmZjJBXCIsXG4gICAgICAgICAgICBwaW5uZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZ3VpbGRMaXN0ID0gdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlLmdldEZsYXR0ZW5lZEd1aWxkSWRzKCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRMaXN0ID0gdGhpcy5BdmF0YXJEZWZhdWx0cy5ERUZBVUxUX0FWQVRBUlM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyMiwgcGlubmVkOiB0cnVlLCBqb2luOiB0aGlzLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSksXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyLCBwaW5uZWQ6IHRydWUsIGpvaW46IHRoaXMuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KVxuICAgICAgICBdXG4gICAgfVxuXG4gICAgZ2V0IHNlYXJjaEVuZFBvaW50KCkge1xuICAgICAgICByZXR1cm4gXCJodHRwczovL3NlYXJjaC5kaXNjb3Jkc2VydmVycy5jb21cIjtcbiAgICB9XG5cbiAgICBnZXQgam9pbkVuZFBvaW50KCkge1xuICAgICAgICByZXR1cm4gXCJodHRwczovL2ouZGlzY29yZHNlcnZlcnMuY29tXCI7XG4gICAgfVxuXG4gICAgZ2V0IGNvbm5lY3RFbmRQb2ludCgpIHtcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9qb2luLmRpc2NvcmRzZXJ2ZXJzLmNvbS9jb25uZWN0XCI7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tDb25uZWN0aW9uKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb2Ase1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICAgICAgICAgICAgbW9kZTogXCJjb3JzXCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcbiAgICAgICAgICAgIGlmKCF0ZXh0KXtcbiAgICAgICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UodGV4dClcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IDAsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMixcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZi5zZWFyY2goXCJcIiwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXG4gICAgICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAtMSxcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiAxLFxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHRoaXMuaG9va3MuZm9yRWFjaCgoZSkgPT4gZSgpKVxuICAgICAgICBTZXR0aW5nc1ZpZXcgPSBTZXR0aW5nc1ZpZXcgfHwgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlNldHRpbmdzVmlld1wiKVxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJwdWJzbGF5ZXJyb290XCJ9LCBcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwicHVic2xheWVyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NWaWV3LCB7XG4gICAgICAgICAgICAgICAgb25TZXRTZWN0aW9uOiAoc2VjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUNhdGVnb3J5KHRoaXMuY2F0ZWdvcnlTbHVncy5pbmRleE9mKHNlY3Rpb24pKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VjdGlvbnM6IHRoaXMuc2VjdGlvbnMsXG4gICAgICAgICAgICAgICAgb25DbG9zZTogdGhpcy5jbG9zZSxcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiB0aGlzLnN0YXRlLnNlY3Rpb25cbiAgICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCBzZWN0aW9ucygpe1xuICAgICAgICBsZXQgc2VjdGlvbnMgPSBbXVxuICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHNlY3Rpb246IFwiSEVBREVSXCIsXG4gICAgICAgICAgICBsYWJlbDogXCJQdWJsaWMgU2VydmVyc1wiXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHNlY3Rpb246IFwiRElWSURFUlwiXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHNlY3Rpb246IFwiQ1VTVE9NXCIsXG4gICAgICAgICAgICBlbGVtZW50OiB0aGlzLnNlYXJjaElucHV0LmJpbmQobnVsbCwgKCkgPT4gdGhpcywgdGhpcy5zZWFyY2hLZXlEb3duKVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBcIkhFQURFUlwiLFxuICAgICAgICAgICAgbGFiZWw6IFwiQ2F0ZWdvcmllc1wiXG4gICAgICAgIH0sIC4uLnRoaXMuY2F0ZWdvcnlCdXR0b25zLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNlY3Rpb246IHRoaXMuY2F0ZWdvcnlTbHVnc1tpbmRleF0sXG4gICAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuY29udGVudC5iaW5kKG51bGwsICgpID0+IHRoaXMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBcIkNVU1RPTVwiLFxuICAgICAgICAgICAgZWxlbWVudDogdGhpcy5mb290ZXJcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgc2VjdGlvbjogXCJDVVNUT01cIixcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuY29ubmVjdGlvbi5iaW5kKG51bGwsICgpID0+IHRoaXMpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBzZWN0aW9uc1xuICAgIH1cbiAgICBcbiAgICBzZWFyY2hJbnB1dChnZXRUaGlzLCBzZWFyY2hLZXlEb3duKSB7XG4gICAgICAgIGNvbnN0IFt2YWx1ZSwgc2V0VmFsdWVdID0gQkRWMi5yZWFjdC51c2VTdGF0ZShcIlwiKVxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS1pdGVtXCJ9LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10ZXh0LWlucHV0IGZsZXgtdmVydGljYWxcIiwgc3R5bGU6IHt3aWR0aDogXCIxNzJweFwiLCBtYXJnaW5MZWZ0OiBcIjEwcHhcIn19LFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmOiAoc2VyY2hpbnB1dCkgPT4gKGdldFRoaXMoKS5yZWZzLnNlYXJjaGlucHV0ID0gc2VyY2hpbnB1dCksIFxuICAgICAgICAgICAgICAgICAgICBvbktleURvd246IHNlYXJjaEtleURvd24sIFxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZTogKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGUudGFyZ2V0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsIFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiaW5wdXQgZGVmYXVsdFwiLCBcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiU2VhcmNoLi4uXCIsIFxuICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGg6IFwiNTBcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZWFyY2hLZXlEb3duKGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcgfHwgZS53aGljaCAhPT0gMTMpIHJldHVybjtcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxuICAgICAgICAgICAgdGVybTogZS50YXJnZXQudmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBxdWVyeSA9IGA/dGVybT0ke2UudGFyZ2V0LnZhbHVlfWA7XG4gICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkgIT09IDApIHtcbiAgICAgICAgICAgIHF1ZXJ5ICs9IGAmY2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5zZWFyY2gocXVlcnksIHRydWUpO1xuICAgIH1cblxuICAgIGdldCBjYXRlZ29yeVNsdWdzKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmNhdGVnb3J5QnV0dG9ucy5tYXAoZSA9PiBlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15cXHdcXGRdKy9nLCBcIl9cIikpXG4gICAgfVxuXG4gICAgZ2V0IGNhdGVnb3J5QnV0dG9ucygpIHtcbiAgICAgICAgcmV0dXJuIFtcIkFsbFwiLCBcIkZQUyBHYW1lc1wiLCBcIk1NTyBHYW1lc1wiLCBcIlN0cmF0ZWd5IEdhbWVzXCIsIFwiTU9CQSBHYW1lc1wiLCBcIlJQRyBHYW1lc1wiLCBcIlRhYmxldG9wIEdhbWVzXCIsIFwiU2FuZGJveCBHYW1lc1wiLCBcIlNpbXVsYXRpb24gR2FtZXNcIiwgXCJNdXNpY1wiLCBcIkNvbW11bml0eVwiLCBcIkxhbmd1YWdlXCIsIFwiUHJvZ3JhbW1pbmdcIiwgXCJPdGhlclwiXTtcbiAgICB9XG5cbiAgICBjaGFuZ2VDYXRlZ29yeShpZCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO1xuICAgICAgICBzZWxmLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiBpZCxcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcbiAgICAgICAgICAgIHRlcm06IG51bGwsXG4gICAgICAgICAgICBzZWN0aW9uOiBzZWxmLmNhdGVnb3J5U2x1Z3NbaWRdXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaWQgPT09IDApIHtcbiAgICAgICAgICAgIHNlbGYuc2VhcmNoKFwiXCIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuc2VhcmNoKGA/Y2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tpZF19YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY29udGVudChnZXRUaGlzKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSBnZXRUaGlzKCk7XG4gICAgICAgIHNlbGYudXNlU3RhdGUoKVxuICAgICAgICBjb25zdCBndWlsZExpc3QgPSBzZWxmLlNvcnRlZEd1aWxkU3RvcmUuZ2V0RmxhdHRlbmVkR3VpbGRJZHMoKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdExpc3QgPSBzZWxmLkF2YXRhckRlZmF1bHRzLkRFRkFVTFRfQVZBVEFSUztcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUuY29ubmVjdGlvbi5zdGF0ZSA9PT0gMSkgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChzZWxmLm5vdENvbm5lY3RlZC5iaW5kKG51bGwsIGdldFRoaXMpKTtcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7cmVmOiAocmVmKSA9PiB7XG4gICAgICAgICAgICAgICAgKHNlbGYucmVmcy5jb250ZW50ID0gcmVmKVxuICAgICAgICAgICAgfSwga2V5OiBcInBjXCIsIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogc2VsZi5zdGF0ZS50aXRsZX0pLFxuICAgICAgICAgICAgc2VsZi5iZFNlcnZlcixcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5tYXAoKHNlcnZlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge2tleTogc2VydmVyLmlkZW50aWZpZXIsIHNlcnZlcjogc2VydmVyLCBqb2luOiBzZWxmLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNlbGYuc3RhdGUubmV4dCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO3NlbGYuc2V0U3RhdGUoe2xvYWRpbmc6IHRydWV9KTsgc2VsZi5zZWFyY2goc2VsZi5zdGF0ZS5uZXh0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIiwgc3R5bGU6IHt3aWR0aDogXCIxMDAlXCIsIG1hcmdpblRvcDogXCIxMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIxMHB4XCJ9fSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlLmxvYWRpbmcgPyBcIkxvYWRpbmdcIiA6IFwiTG9hZCBNb3JlXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5zZXJ2ZXJzLmxlbmd0aCA+IDAgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlfSlcbiAgICAgICAgKV07XG4gICAgfVxuXG4gICAgbm90Q29ubmVjdGVkKGdldFRoaXMpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IGdldFRoaXMoKTtcbiAgICAgICAgLy9yZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHsgdGV4dDogc2VsZi5zdGF0ZS50aXRsZSB9KTtcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7a2V5OiBcIm5jY1wiLCByZWY6IChyZWYpID0+IChzZWxmLnJlZnMuY29udGVudCA9IHJlZiksIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcImgyXCIsXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LFxuICAgICAgICAgICAgICAgIFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBzZWxmLmNvbm5lY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogXCIxOHB4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogXCIxMHB4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodDogXCIxNHB4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb25uZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksIHNlbGYuYmRTZXJ2ZXJcbiAgICAgICAgKV07XG4gICAgfVxuXG4gICAgZm9vdGVyKCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIn0sXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJhXCIsXG4gICAgICAgICAgICAgICAge2hyZWY6IFwiaHR0cHM6Ly9kaXNjb3Jkc2VydmVycy5jb21cIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICBcIkRpc2NvcmRzZXJ2ZXJzLmNvbVwiXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXNlU3RhdGUoKXtcbiAgICAgICAgY29uc3QgZm9yY2VVcGRhdGUgPSB1c2VGb3JjZVVwZGF0ZSgpXG4gICAgICAgIEJEVjIuUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaG9va3MucHVzaChsaXN0ZW5lcilcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmhvb2tzLmZpbmRJbmRleChlID0+IGU9PT1saXN0ZW5lcilcbiAgICAgICAgICAgICAgICBpZihpbmRleCA8IDApcmV0dXJuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFtdKVxuICAgIH1cblxuICAgIGNvbm5lY3Rpb24oZ2V0VGhpcykge1xuICAgICAgICBjb25zdCBzZWxmID0gZ2V0VGhpcygpO1xuICAgICAgICBzZWxmLnVzZVN0YXRlKClcbiAgICAgICAgY29uc3Qge2Nvbm5lY3Rpb259ID0gc2VsZi5zdGF0ZTtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IDIpIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwpO1xuXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICB7c3R5bGU6IHtjb2xvcjogXCIjYjliYmJlXCIsIGZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCIxMHB4XCJ9fSxcbiAgICAgICAgICAgICAgICBcIkNvbm5lY3RlZCBhczogXCIsXG4gICAgICAgICAgICAgICAgYCR7Y29ubmVjdGlvbi51c2VyLnVzZXJuYW1lfSMke2Nvbm5lY3Rpb24udXNlci5kaXNjcmltaW5hdG9yfWBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7c3R5bGU6IHtwYWRkaW5nOiBcIjVweCAxMHB4IDAgMTBweFwifX0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHt3aWR0aDogXCIxMDAlXCIsIG1pbkhlaWdodDogXCIyMHB4XCJ9LCB0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwidWktYnV0dG9uIGZpbGxlZCBicmFuZCBzbWFsbCBncm93XCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIiwgb25DbGljazogc2VsZi5jb25uZWN0fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUmVjb25uZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NlcnZlckNhcmQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCkgdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCA9IHRoaXMucHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBpbWFnZUVycm9yOiBmYWxzZSxcbiAgICAgICAgICAgIGpvaW5lZDogdGhpcy5wcm9wcy5ndWlsZExpc3QuaW5jbHVkZXModGhpcy5wcm9wcy5zZXJ2ZXIuaWRlbnRpZmllcilcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtzZXJ2ZXJ9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgbGV0IGNhcmRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jYXJkICYmIGUuY2FyZFByaW1hcnkpWzBdXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxleENoaWxkICYmIGUuX2hvcml6b250YWxSZXZlcnNlKVswXVxuICAgICAgICBsZXQgd3JhcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm5vV3JhcCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkKVswXVxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJkaXZcIiwgLy8gY2FyZFByaW1hcnktMUh2LXRvXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBgJHtjYXJkTW9kdWxlLmNhcmR9ICR7Y2FyZE1vZHVsZS5jYXJkUHJpbWFyeX0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b204KVswXS5tYXJnaW5Cb3R0b204fSBiZC1zZXJ2ZXItY2FyZCR7c2VydmVyLnBpbm5lZCA/IFwiIGJkLXNlcnZlci1jYXJkLXBpbm5lZFwiIDogXCJcIn1gfSxcbiAgICAgICAgICAgIC8vIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAvLyBcImRpdlwiLFxuICAgICAgICAgICAgICAgIC8vIHsgY2xhc3NOYW1lOiBcImZsZXgtMXhNUWc1IGZsZXgtMU8xR0tZIGhvcml6b250YWwtMWFlOWNpIGhvcml6b250YWwtMkVFRW5ZIGZsZXgtMU8xR0tZIGRpcmVjdGlvblJvdy0zdjN0ZkcganVzdGlmeVN0YXJ0LTJ5SVpvMCBhbGlnblN0cmV0Y2gtMWh3eE1hIG5vV3JhcC0zanludjZcIiB9LFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7cmVmOiBcImltZ1wiLCBjbGFzc05hbWU6IFwiYmQtc2VydmVyLWltYWdlXCIsIHNyYzogc2VydmVyLmljb25VcmwsIG9uRXJyb3I6IHRoaXMuaGFuZGxlRXJyb3IuYmluZCh0aGlzKSwgZHJhZ2dhYmxlOiBmYWxzZX0pLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5mbGV4Q2hpbGQrXCIgYmQtc2VydmVyLWNvbnRlbnRcIn0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBmbGV4TW9kdWxlLmhvcml6b250YWwrXCIgXCIrd3JhcE1vZHVsZS5ub1dyYXArXCIgYmQtc2VydmVyLWhlYWRlclwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImg1XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJoNS0xOF8xbmQgZGVmYXVsdENvbG9yLTFfYWpYMCBtYXJnaW4tcmVzZXQgYmQtc2VydmVyLW5hbWVcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJoNVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiaDUtMThfMW5kIGRlZmF1bHRDb2xvci0xX2FqWDAgbWFyZ2luLXJlc2V0IGJkLXNlcnZlci1tZW1iZXItY291bnRcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLm1lbWJlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgTWVtYmVyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBmbGV4TW9kdWxlLmhvcml6b250YWwrXCIgXCIrd3JhcE1vZHVsZS5ub1dyYXB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzY3JvbGxlcldyYXAtMmxKRWtkIHNjcm9sbGVyVGhlbWVkLTJvZW51cyB0aGVtZUdob3N0SGFpcmxpbmUtREJELTJkIHNjcm9sbGVyRmFkZS0xSWp3NXkgYmQtc2VydmVyLWRlc2NyaXB0aW9uLWNvbnRhaW5lclwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2Nyb2xsZXItMkZLRlBHIHNjcm9sbGVyIGJkLXNlcnZlci1kZXNjcmlwdGlvblwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5kZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZGlyZWN0aW9uUm93LTN2M3RmRyBub1dyYXAtM2p5bnY2IGJkLXNlcnZlci1mb290ZXJcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImZsZXhDaGlsZC1mYW9WVzMgYmQtc2VydmVyLXRhZ3NcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuY2F0ZWdvcmllcy5qb2luKFwiLCBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmpvaW5lZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk4gY29sb3JHcmVlbi0yOWlBS1lcIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCIsIGJhY2tncm91bmRDb2xvcjogXCIjM2FjMTVjXCJ9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5lcnJvciAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk4gZGlzYWJsZWQtOWFGMnVnXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwiLCBiYWNrZ3JvdW5kQ29sb3I6IFwiI2MxM2EzYVwifX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZXJ2ZXIuZXJyb3IgJiYgIXRoaXMuc3RhdGUuam9pbmVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYnV0dG9uLTM4YVNjciBsb29rRmlsbGVkLTFHeDAwUCBjb2xvckJyYW5kLTNwWHI5MSBzaXplTWluLTFtSmQxeCBncm93LXE3N09OTlwiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIn0sIG9uQ2xpY2s6ICgpID0+IHt0aGlzLmpvaW4oKTt9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIC8vIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvcigpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCA9IHRoaXMucHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2ltYWdlRXJyb3I6IHRydWV9KTtcbiAgICB9XG5cbiAgICBqb2luKCkge1xuICAgICAgICB0aGlzLnByb3BzLmpvaW4odGhpcyk7XG4gICAgICAgIC8vdGhpcy5zZXRTdGF0ZSh7am9pbmVkOiB0cnVlfSk7XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19SZWxvYWRJY29uIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgICAgICAgICAgICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICAgICAgICAgICAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxuICAgICAgICAgICAgICAgIGZpbGw6IFwiI2RjZGRkZVwiLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1yZWxvYWQgXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLnByb3BzLm9uQ2xpY2ssXG4gICAgICAgICAgICAgICAgc3R5bGU6IHt3aWR0aDogdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiLCBoZWlnaHQ6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIn1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXpcIn0pLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDogXCJub25lXCIsIGQ6IFwiTTAgMGgyNHYyNEgwelwifSlcbiAgICAgICAgKTtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcblxuaW1wb3J0IFNldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi9tYXJnaW50b3BcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NlY3Rpb25lZFNldHRpbmdzUGFuZWwgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLnNlY3Rpb25zLm1hcCgoc2VjdGlvbiwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBpICE9PSAwID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KE1hcmdpblRvcCwge30pIDogbnVsbCxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NHcm91cCwgT2JqZWN0LmFzc2lnbih7fSwgc2VjdGlvbiwge29uQ2hhbmdlOiB0aGlzLnByb3BzLm9uQ2hhbmdlfSkpXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pXG4gICAgfVxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcblxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9zd2l0Y2hcIjtcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCI7XG5cbmxldCBmb3JtTW9kdWxlXG5sZXQgc3dpdGNoSXRlbVxubGV0IGJldGFDbGFzc05hbWVzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NHcm91cCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBlcnJvcjogZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlck9sZFNldHRpbmdzKCkge1xuICAgICAgICBjb25zdCB7dGl0bGUsIHNldHRpbmdzLCBidXR0b259ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgYnV0dG9uQ29tcG9uZW50ID0gYnV0dG9uID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtrZXk6IFwidGl0bGUtYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJiZC1wZmJ0blwiLCBvbkNsaWNrOiBidXR0b24ub25DbGlja30sIGJ1dHRvbi50aXRsZSkgOiBudWxsO1xuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogdGl0bGV9KSxcbiAgICAgICAgICAgICAgICBidXR0b25Db21wb25lbnQsXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2lkOiBzZXR0aW5nLmlkLCBrZXk6IHNldHRpbmcuaWQsIGRhdGE6IHNldHRpbmcsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGlkLCBjaGVja2VkKTtcbiAgICAgICAgICAgICAgICAgICAgfX0pO1xuICAgICAgICAgICAgICAgIH0pXTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRDYXRjaChlcnIsIGVyckluZm8pe1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIsIGVyckluZm8pXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZXJyb3I6IHRydWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5lcnJvcil7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyT2xkU2V0dGluZ3MoKVxuICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICBpZighZm9ybU1vZHVsZSlmb3JtTW9kdWxlID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5Gb3JtU2VjdGlvbilcbiAgICAgICAgICAgICAgICBpZighc3dpdGNoSXRlbSlzd2l0Y2hJdGVtID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJTd2l0Y2hJdGVtXCIpXG4gICAgICAgICAgICAgICAgaWYoIWJldGFDbGFzc05hbWVzKWJldGFDbGFzc05hbWVzID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5iZXRhICYmICghZS5jb250YWluZXIgJiYgIWUudXNlclNldHRpbmdzVm9pY2UpKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IFtdXG4gICAgICAgICAgICAgICAgaWYodGhpcy5wcm9wcy5kZXNjcmlwdGlvbil7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goPGZvcm1Nb2R1bGUuRm9ybVRleHQgdHlwZT1cImRlc2NyaXB0aW9uXCIgc2VsZWN0YWJsZT17ZmFsc2V9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtVGV4dD4sIDxNYXJnaW5Ub3A+PC9NYXJnaW5Ub3A+KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKC4uLnRoaXMucHJvcHMuc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcudGV4dFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuZXhwZXJpbWVudGFsKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ucHVzaCg8c3VwIGNsYXNzTmFtZT17YmV0YUNsYXNzTmFtZXMuYmV0YX0+KEVYUEVSSU1FTlRBTCk8L3N1cD4pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxzd2l0Y2hJdGVtLmRlZmF1bHQgb25DaGFuZ2U9eyhldikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShzZXR0aW5nLmlkLCBldi50YXJnZXQuY2hlY2tlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgICAgICAgICAgfX0ga2V5PXtzZXR0aW5nLmlkfSB2YWx1ZT17c2V0dGluZ3NDb29raWVbc2V0dGluZy5pZF19IGNsYXNzTmFtZT17X19TRUNSRVRfRU1PVElPTl9fLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b206IFwiMjBweFwiXG4gICAgICAgICAgICAgICAgICAgIH0pfSBkaXNhYmxlZD17ZmFsc2V9IGhpZGVCb3JkZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT17c3dpdGNoSXRlbS5kZWZhdWx0LlNpemVzLkRFRkFVTFR9IHRoZW1lPXtzd2l0Y2hJdGVtLmRlZmF1bHQuVGhlbWVzLkRFRkFVTFR9IG5vdGU9e3NldHRpbmcuaW5mb30+XG4gICAgICAgICAgICAgICAgICAgICAgICB7aW5mb31cbiAgICAgICAgICAgICAgICAgICAgPC9zd2l0Y2hJdGVtLmRlZmF1bHQ+XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxmb3JtTW9kdWxlLkZvcm1TZWN0aW9uIHRhZz1cImgyXCIgdGl0bGU9e3RoaXMucHJvcHMudGl0bGV9PlxuICAgICAgICAgICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICAgICAgPC9mb3JtTW9kdWxlLkZvcm1TZWN0aW9uPlxuICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NUaXRsZSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG4vL2gyLTJnV0UtbyB0aXRsZS0zc1pXWVEgc2l6ZTE2LTE0Y0d6NSBoZWlnaHQyMC1tTzJlSU4gd2VpZ2h0U2VtaUJvbGQtTkpleHppIGRhLWgyIGRhLXRpdGxlIGRhLXNpemUxNiBkYS1oZWlnaHQyMCBkYS13ZWlnaHRTZW1pQm9sZCBkZWZhdWx0Q29sb3ItMV9halgwIGRhLWRlZmF1bHRDb2xvciBtYXJnaW5Ub3A2MC0zUEdidEsgZGEtbWFyZ2luVG9wNjAgbWFyZ2luQm90dG9tMjAtMzJxSUQ3IGRhLW1hcmdpbkJvdHRvbTIwXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJoMlwiLFxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LFxuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XG4gICAgICAgICk7XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuL2NvbXBvbmVudHMvc3dpdGNoXCI7XG5cbmxldCBjbGFzc25hbWVzID0gW11cbmZ1bmN0aW9uIGdldENsYXNzTmFtZShuYW1lKXtcbiAgICBsZXQgY2xhc3NOYW1lID0gY2xhc3NuYW1lcy5maW5kKGUgPT4gZS5zdGFydHNXaXRoKG5hbWUrXCItXCIpKVxuICAgIGlmKGNsYXNzTmFtZSlyZXR1cm4gY2xhc3NOYW1lXG4gICAgY2xhc3NOYW1lID0gQkRNb2R1bGVzLmdldChlID0+IGVbbmFtZV0pWzBdW25hbWVdXG4gICAgY2xhc3NuYW1lcy5wdXNoKGNsYXNzTmFtZSlcbiAgICByZXR1cm4gY2xhc3NOYW1lXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaEl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5jaGVja2VkID0gIXRoaXMucHJvcHMuY2hlY2tlZDtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmlkLCB0aGlzLnByb3BzLmNoZWNrZWQpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHt0ZXh0LCBpbmZvfSA9IHRoaXMucHJvcHMuZGF0YTtcbiAgICAgICAgaWYoIWNsYXNzbmFtZXMuZmluZChlID0+IGUuc3RhcnRzV2l0aChcImJldGEtXCIpKSl7XG4gICAgICAgICAgICBjbGFzc25hbWVzLnB1c2goQkRNb2R1bGVzLmdldChlID0+IGUuYmV0YSAmJiAoIWUuY29udGFpbmVyICYmICFlLnVzZXJTZXR0aW5nc1ZvaWNlKSlbMF0uYmV0YSlcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLnByb3BzLmRhdGEuZXhwZXJpbWVudGFsKXtcbiAgICAgICAgICAgIGluZm8gPSBbXG4gICAgICAgICAgICAgICAgaW5mbyxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3VwXCIsIHtjbGFzc05hbWU6IGdldENsYXNzTmFtZShcImJldGFcIil9LCBcIihFWFBFUklNRU5UQUwpXCIpXG4gICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZsZXggZmxleC12ZXJ0aWNhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwIHVpLXN3aXRjaC1pdGVtXCJ9LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktZmxleCBmbGV4LWhvcml6b250YWwgZmxleC1qdXN0aWZ5LXN0YXJ0IGZsZXgtYWxpZ24tc3RyZXRjaCBmbGV4LW5vd3JhcFwifSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoM1wiLCB7a2V5OiBcInRpdGxlXCIsIGNsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgzIG1hcmdpbi1yZXNldCBtYXJnaW4tcmVzZXQgdWktZmxleC1jaGlsZFwifSwgdGV4dCksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2tleTogXCJzd2l0Y2hcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10ZXh0IHN0eWxlLWRlc2NyaXB0aW9uIG1hcmdpbi10b3AtNFwiLCBzdHlsZToge2ZsZXg6IFwiMSAxIGF1dG9cIn19LCBpbmZvKVxuICAgICAgICApO1xuICAgIH1cbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVGFiQmFyU2VwYXJhdG9yIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItc2VwYXJhdG9yIG1hcmdpbi10b3AtOCBtYXJnaW4tYm90dG9tLThcIn0pO1xuICAgIH1cbn0iLCIvKipcbiAqIFRvb2x0aXAgdGhhdCBhdXRvbWF0aWNhbGx5IHNob3cgYW5kIGhpZGUgdGhlbXNlbHZlcyBvbiBtb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGV2ZW50cy5cbiAqIFdpbGwgYWxzbyByZW1vdmUgdGhlbXNlbHZlcyBpZiB0aGUgbm9kZSB0byB3YXRjaCBpcyByZW1vdmVkIGZyb20gRE9NIHRocm91Z2hcbiAqIGEgTXV0YXRpb25PYnNlcnZlci5cbiAqXG4gKiBOb3RlIHRoaXMgaXMgbm90IHVzaW5nIERpc2NvcmQncyBpbnRlcm5hbHMgYnV0IG5vcm1hbCBET00gbWFuaXB1bGF0aW9uIGFuZCBlbXVsYXRlc1xuICogRGlzY29yZCdzIG93biB0b29sdGlwcyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLlxuICpcbiAqIEBtb2R1bGUgRW11bGF0ZWRUb29sdGlwXG4gKiBAdmVyc2lvbiAwLjAuMVxuICovXG5cbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XG5sZXQgVG9vbHRpcENsYXNzZXNcbmZ1bmN0aW9uIGdldFRvb2x0aXBDbGFzc2VzKCl7XG5cdGlmKFRvb2x0aXBDbGFzc2VzKXJldHVybiBUb29sdGlwQ2xhc3Nlc1xuXHRyZXR1cm4gVG9vbHRpcENsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInRvb2x0aXBcIiwgXCJ0b29sdGlwQmxhY2tcIik7XG59XG5sZXQgVG9vbHRpcExheWVyc1xuZnVuY3Rpb24gZ2V0VG9vbHRpcExheWVycygpe1xuXHRpZihUb29sdGlwTGF5ZXJzKXJldHVybiBUb29sdGlwTGF5ZXJzXG5cdHJldHVybiBUb29sdGlwTGF5ZXJzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJsYXllclwiLCBcImxheWVyQ29udGFpbmVyXCIpO1xufVxuXG5jb25zdCBnZXRDbGFzcyA9IGZ1bmN0aW9uKHNpZGVPckNvbG9yKSB7XG4gICAgY29uc3QgdXBwZXJDYXNlID0gc2lkZU9yQ29sb3JbMF0udG9VcHBlckNhc2UoKSArIHNpZGVPckNvbG9yLnNsaWNlKDEpO1xuICAgIGNvbnN0IHRvb2x0aXBDbGFzcyA9IGdldFRvb2x0aXBDbGFzc2VzKClbYHRvb2x0aXAke3VwcGVyQ2FzZX1gXTtcbiAgICBpZiAodG9vbHRpcENsYXNzKSByZXR1cm4gdG9vbHRpcENsYXNzO1xuICAgIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgY2xhc3NFeGlzdHMgPSBmdW5jdGlvbihzaWRlT3JDb2xvcikge1xuICAgIHJldHVybiBnZXRDbGFzcyhzaWRlT3JDb2xvcikgPyB0cnVlIDogZmFsc2U7XG59O1xuXG5jb25zdCB0b1B4ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gYCR7dmFsdWV9cHhgO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW11bGF0ZWRUb29sdGlwIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0geyhIVE1MRWxlbWVudHxqUXVlcnkpfSBub2RlIC0gRE9NIG5vZGUgdG8gbW9uaXRvciBhbmQgc2hvdyB0aGUgdG9vbHRpcCBvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGlwIC0gc3RyaW5nIHRvIHNob3cgaW4gdGhlIHRvb2x0aXBcblx0ICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0b29sdGlwXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdHlsZT1ibGFja10gLSBjb3JyZWxhdGVzIHRvIHRoZSBkaXNjb3JkIHN0eWxpbmcvY29sb3JzIChibGFjaywgYnJhbmQsIGdyZWVuLCBncmV5LCByZWQsIHllbGxvdylcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNpZGU9dG9wXSAtIGNhbiBiZSBhbnkgb2YgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJldmVudEZsaXA9ZmFsc2VdIC0gcHJldmVudHMgbW92aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBvcHBvc2l0ZSBzaWRlIGlmIGl0IGlzIHRvbyBiaWcgb3IgZ29lcyBvZmZzY3JlZW5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRpc2FibGVkPWZhbHNlXSAtIHdoZXRoZXIgdGhlIHRvb2x0aXAgc2hvdWxkIGJlIGRpc2FibGVkIGZyb20gc2hvd2luZyBvbiBob3ZlclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXR0YWNoRXZlbnRzPXRydWVdIC0gd2hldGhlciB0aGUgdG9vbHRpcCBzaG91bGQgbGlzdGVuIHRvIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzLlxuXHQgKi9cblx0Y29uc3RydWN0b3Iobm9kZSwgdGV4dCwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0Y29uc3Qge3N0eWxlID0gXCJibGFja1wiLCBzaWRlID0gXCJ0b3BcIiwgcHJldmVudEZsaXAgPSBmYWxzZSwgZGlzYWJsZWQgPSBmYWxzZSwgYXR0YWNoRXZlbnRzID0gdHJ1ZX0gPSBvcHRpb25zO1xuXHRcdHRoaXMubm9kZSA9IG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRleHQ7XG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHRoaXMuc2lkZSA9IHNpZGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdGhpcy5wcmV2ZW50RmxpcCA9IHByZXZlbnRGbGlwO1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG5cbiAgICAgICAgaWYgKCFjbGFzc0V4aXN0cyh0aGlzLnNpZGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTaWRlICR7dGhpcy5zaWRlfSBkb2VzIG5vdCBleGlzdC5gKTtcblx0XHRpZiAoIWNsYXNzRXhpc3RzKHRoaXMuc3R5bGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTdHlsZSAke3RoaXMuc3R5bGV9IGRvZXMgbm90IGV4aXN0LmApO1xuXHRcdFxuXHRcdHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBMYXllcnMoKS5sYXllciArIFwiIFwiICsgZ2V0VG9vbHRpcExheWVycygpLmRpc2FibGVkUG9pbnRlckV2ZW50cztcblxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7Z2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwfSAke2dldENsYXNzKHRoaXMuc3R5bGUpfWA7XG5cblx0XHR0aGlzLmxhYmVsRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwQ29udGVudFxuXG5cdFx0Y29uc3QgcG9pbnRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdHBvaW50ZXJFbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcFBvaW50ZXI7XG5cblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmFwcGVuZChwb2ludGVyRWxlbWVudCk7XG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5hcHBlbmQodGhpcy5sYWJlbEVsZW1lbnQpO1xuXHRcdHRoaXMuZWxlbWVudC5hcHBlbmQodGhpcy50b29sdGlwRWxlbWVudCk7XG5cblx0XHRpZihhdHRhY2hFdmVudHMpe1xuXHRcdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsICgpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblx0XHRcdFx0dGhpcy5zaG93KCk7XG5cdFxuXHRcdFx0XHRjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcblx0XHRcdFx0XHRtdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKHRoaXMubm9kZSkgPiAtMTtcblx0XHRcdFx0XHRcdGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKHRoaXMubm9kZSkpO1xuXHRcdFx0XHRcdFx0aWYgKGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGlkZSgpO1xuXHRcdFx0XHRcdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcblx0XHRcdFx0b2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7c3VidHJlZTogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlfSk7XG5cdFx0XHR9KTtcblx0XG5cdFx0XHR0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmhpZGUoKTtcblx0XHRcdH0pO1xuXHRcdH1cbiAgICB9XG5cbiAgICAvKiogQ29udGFpbmVyIHdoZXJlIHRoZSB0b29sdGlwIHdpbGwgYmUgYXBwZW5kZWQuICovXG4gICAgZ2V0IGNvbnRhaW5lcigpIHsgXG5cdFx0cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUucG9wb3V0cylbMF0ucG9wb3V0cykrXCIgfiAuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXJDb250YWluZXIpWzBdLmxheWVyQ29udGFpbmVyKSk7IFxuXHR9XG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBhYm92ZSB0aGUgZWxlbWVudCAqL1xuICAgIGdldCBjYW5TaG93QWJvdmUoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCA+PSAwOyB9XG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBiZWxvdyB0aGUgZWxlbWVudCAqL1xuICAgIGdldCBjYW5TaG93QmVsb3coKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgPD0gVXRpbHMuc2NyZWVuSGVpZ2h0OyB9XG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiB0byB0aGUgbGVmdCBvZiB0aGUgZWxlbWVudCAqL1xuICAgIGdldCBjYW5TaG93TGVmdCgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoID49IDA7IH1cbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSByaWdodCBvZiB0aGUgZWxlbWVudCAqL1xuXHRnZXQgY2FuU2hvd1JpZ2h0KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyB0aGlzLm5vZGUub2Zmc2V0V2lkdGggKyB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggPD0gVXRpbHMuc2NyZWVuV2lkdGg7IH1cblxuICAgIC8qKiBIaWRlcyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VsZWF2ZS4gKi9cblx0aGlkZSgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcblx0fVxuXG4gICAgLyoqIFNob3dzIHRoZSB0b29sdGlwLiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBvbiBtb3VzZWVudGVyLiBXaWxsIGF0dGVtcHQgdG8gZmxpcCBpZiBwb3NpdGlvbiB3YXMgd3JvbmcuICovXG5cdHNob3coKSB7XG4gICAgICAgIHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7Z2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwfSAke2dldENsYXNzKHRoaXMuc3R5bGUpfWA7XG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmxhYmVsO1xuXHRcdHRoaXMuY29udGFpbmVyLmFwcGVuZCh0aGlzLmVsZW1lbnQpO1xuXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcInRvcFwiKSB7XG5cdFx0XHRpZiAodGhpcy5jYW5TaG93QWJvdmUgfHwgKCF0aGlzLmNhblNob3dBYm92ZSAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93QWJvdmUoKTtcblx0XHRcdGVsc2UgdGhpcy5zaG93QmVsb3coKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zaWRlID09IFwiYm90dG9tXCIpIHtcblx0XHRcdGlmICh0aGlzLmNhblNob3dCZWxvdyB8fCAoIXRoaXMuY2FuU2hvd0JlbG93ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dCZWxvdygpO1xuXHRcdFx0ZWxzZSB0aGlzLnNob3dBYm92ZSgpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJsZWZ0XCIpIHtcblx0XHRcdGlmICh0aGlzLmNhblNob3dMZWZ0IHx8ICghdGhpcy5jYW5TaG93TGVmdCAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93TGVmdCgpO1xuXHRcdFx0ZWxzZSB0aGlzLnNob3dSaWdodCgpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJyaWdodFwiKSB7XG5cdFx0XHRpZiAodGhpcy5jYW5TaG93UmlnaHQgfHwgKCF0aGlzLmNhblNob3dSaWdodCAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93UmlnaHQoKTtcblx0XHRcdGVsc2UgdGhpcy5zaG93TGVmdCgpO1xuXHRcdH1cblx0fVxuXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgYWJvdmUgdGhlIG5vZGUuICovXG5cdHNob3dBYm92ZSgpIHtcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJ0b3BcIikpO1xuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gMTApKTtcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xuXHR9XG5cbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCBiZWxvdyB0aGUgbm9kZS4gKi9cblx0c2hvd0JlbG93KCkge1xuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImJvdHRvbVwiKSk7XG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgKyAxMCkpO1xuXHRcdHRoaXMuY2VudGVySG9yaXpvbnRhbGx5KCk7XG5cdH1cblxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBsZWZ0IG9mIHRoZSBub2RlLiAqL1xuXHRzaG93TGVmdCgpIHtcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJsZWZ0XCIpKTtcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLSAxMCkpO1xuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xuXHR9XG5cbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgcmlnaHQgb2YgdGhlIG5vZGUuICovXG5cdHNob3dSaWdodCgpIHtcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJyaWdodFwiKSk7XG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgdGhpcy5ub2RlLm9mZnNldFdpZHRoICsgMTApKTtcblx0XHR0aGlzLmNlbnRlclZlcnRpY2FsbHkoKTtcblx0fVxuXG5cdGNlbnRlckhvcml6b250YWxseSgpIHtcbiAgICAgICAgY29uc3Qgbm9kZWNlbnRlciA9IHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgKHRoaXMubm9kZS5vZmZzZXRXaWR0aCAvIDIpO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLyAyKSkpO1xuXHR9XG5cblx0Y2VudGVyVmVydGljYWxseSgpIHtcblx0XHRjb25zdCBub2RlY2VudGVyID0gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArICh0aGlzLm5vZGUub2Zmc2V0SGVpZ2h0IC8gMik7XG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gMikpKTtcblx0fVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgVG9vbHRpcCBmcm9tIFwiLi90b29sdGlwXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuXG4gICAgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHRleHQgPSBcIlwifSA9IHRoaXMucHJvcHM7XG4gICAgICAgIHRoaXMubm9kZSA9IEJEVjIucmVhY3REb20uZmluZERPTU5vZGUodGhpcyk7XG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKHRoaXMubm9kZSwgdGV4dCwge3N0eWxlLCBzaWRlfSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRvb2x0aXA7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1hTdmcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJzdmdcIixcbiAgICAgICAgICAgIHt4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCB2aWV3Qm94OiBcIjAgMCAxMiAxMlwiLCBzdHlsZToge3dpZHRoOiBcIjE4cHhcIiwgaGVpZ2h0OiBcIjE4cHhcIn19LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgIFwiZ1wiLFxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYmFja2dyb3VuZFwiLCBmaWxsOiBcIm5vbmVcIiwgZmlsbFJ1bGU6IFwiZXZlbm9kZFwifSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0wIDBoMTJ2MTJIMFwifSksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7Y2xhc3NOYW1lOiBcImZpbGxcIiwgZmlsbDogXCIjZGNkZGRlXCIsIGQ6IFwiTTkuNSAzLjIwNUw4Ljc5NSAyLjUgNiA1LjI5NSAzLjIwNSAyLjVsLS43MDUuNzA1TDUuMjk1IDYgMi41IDguNzk1bC43MDUuNzA1TDYgNi43MDUgOC43OTUgOS41bC43MDUtLjcwNUw2LjcwNSA2XCJ9KVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG9cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlY3Ryb25cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXZlbnRzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vZHVsZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlLWZldGNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/BetterDiscordApp/dist/index.min.js b/BetterDiscordApp/dist/index.min.js index b70bcf9..281ed8e 100644 --- a/BetterDiscordApp/dist/index.min.js +++ b/BetterDiscordApp/dist/index.min.js @@ -1 +1,2 @@ -module.exports=function(e){var t={};function n(s){if(t[s])return t[s].exports;var r=t[s]={i:s,l:!1,exports:{}};return e[s].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(s,r,function(t){return e[t]}.bind(null,r));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(e,t){e.exports=require("electron")},function(e,t){e.exports=require("path")},function(e,t){e.exports=require("fs")},function(e,t){e.exports=require("crypto")},function(e,t){e.exports=require("node-fetch")},function(e,t){e.exports=require("events")},function(e,t){e.exports=require("module")},function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return Os}));var s={};n.r(s),n.d(s,"minimumDiscordVersion",(function(){return r})),n.d(s,"currentDiscordVersion",(function(){return o})),n.d(s,"minSupportedVersion",(function(){return i})),n.d(s,"bbdVersion",(function(){return a})),n.d(s,"bbdChangelog",(function(){return l})),n.d(s,"settings",(function(){return c})),n.d(s,"defaultCookie",(function(){return d})),n.d(s,"settingsCookie",(function(){return h})),n.d(s,"settingsRPC",(function(){return u})),n.d(s,"defaultRPC",(function(){return p})),n.d(s,"bdpluginErrors",(function(){return m})),n.d(s,"bdthemeErrors",(function(){return g})),n.d(s,"bdConfig",(function(){return f})),n.d(s,"bdthemes",(function(){return b})),n.d(s,"bdplugins",(function(){return y})),n.d(s,"pluginCookie",(function(){return v})),n.d(s,"themeCookie",(function(){return w}));const r="0.0.307",o=window.DiscordNative&&window.DiscordNative.remoteApp&&window.DiscordNative.remoteApp.getVersion&&window.DiscordNative.remoteApp.getVersion()||"0.0.307",i="0.3.0",a="0.3.5",l={description:"Big things are coming.",changes:[{title:"Bug Fixes",type:"fixed",items:["Some fixes related to showing modals in the `BdApi`.","Fixed the open folder buttons for plugins and themes"]}]},c={"Custom css live update":{id:"bda-css-0",info:"",implemented:!0,hidden:!0,cat:"core"},"Custom css auto udpate":{id:"bda-css-1",info:"",implemented:!0,hidden:!0,cat:"core"},"BetterDiscord Blue":{id:"bda-gs-b",info:"Replace Discord blue with BD Blue",implemented:!1,hidden:!1,cat:"core"},"Public Servers":{id:"bda-gs-1",info:"Display public servers button",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Minimal Mode":{id:"bda-gs-2",info:"Hide elements and reduce the size of elements.",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Voice Mode":{id:"bda-gs-4",info:"Only show voice chat",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Hide Channels":{id:"bda-gs-3",info:"Hide channels in minimal mode",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Dark Mode":{id:"bda-gs-5",info:"Make certain elements dark by default(wip)",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Voice Disconnect":{id:"bda-dc-0",info:"Disconnect from voice server when closing Discord",implemented:!0,hidden:!1,cat:"core",category:"modules"},"24 Hour Timestamps":{id:"bda-gs-6",info:"Replace 12hr timestamps with proper ones",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Colored Text":{id:"bda-gs-7",info:"Make text color the same as role color",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Normalize Classes":{id:"fork-ps-4",info:"Adds stable classes to elements to help themes. (e.g. adds .da-channels to .channels-Ie2l6A)",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Content Error Modal":{id:"fork-ps-1",info:"Shows a modal with plugin/theme errors",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Scan Plugins":{id:"fork-ps-6",info:"Scan plugins for any threat that can be hidden inside.",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Show Toasts":{id:"fork-ps-2",info:"Shows a small notification for important information",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Scroll To Settings":{id:"fork-ps-3",info:"Auto-scrolls to a plugin's settings when the button is clicked (only if out of view)",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Automatic Loading":{id:"fork-ps-5",info:"Automatically loads, reloads, and unloads plugins and themes",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Enable Edit Button":{id:"fork-ps-7",info:"Enable an Edit Button on the plugin and theme panel.",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Themes in Popout Window":{id:"lightcord-9",info:"Enable themes in Popout Window. (For example, when detaching screenshare.)",implemented:!0,hidden:!1,cat:"core",category:"content manager",experimental:!0},"Developer Mode":{id:"bda-gs-8",info:"Developer Mode Toggle",implemented:!0,hidden:!1,cat:"core",category:"developer settings"},"Copy Selector":{id:"fork-dm-1",info:'Adds a "Copy Selector" option to context menus when developer mode is active',implemented:!0,hidden:!1,cat:"core",category:"developer settings"},"Disable BetterDiscord":{id:"bd-disable",info:"Disable Betterdiscord (plugins, themes, etc) (Not implemented).",implemented:!1,hidden:!1,cat:"lightcord",category:"Lightcord"},"Blur Personal Information":{id:"lightcord-6",info:"Blur sensitive informations like email, payment infos and more.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Calling Ring Beat":{id:"lightcord-2",info:"Enable Discord's special calling beat.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Developer Options":{id:"lightcord-1",info:'Enable Discord\'s & Lightcord\'s Internal Developer Options. This allow the "Experiments" tab, the "Developer Options" tab and the "Lightcord Api" section.',implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Ad Block":{id:"lightcord-4",info:"Block any BOT that dms you with an invite link. Even in an embed.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Enable Lightcord Servers":{id:"lightcord-5",info:"Enable Lightcord's servers. Disabling this will disable custom badges.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Disable typing":{id:"lightcord-7",info:"Don't let other see you're typing.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Lightcord Tabs":{id:"lightcord-8",info:"Allows you to launch multiple instances of Lightcord in the same window.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord",experimental:!0},"Use Notification Shim":{id:"lightcord-10",info:"Basically don't use Windows's Notifications.",implemented:!0,hidden:"win32"!==process.platform,cat:"lightcord",category:"Lightcord",experimental:!1},"Always-on-Top":{id:"lightcord-3",info:"Enable the window's Always-on-Top mode, where Lightcord stays on top of other applications.",implemented:!0,hidden:!1,cat:"lightcord",category:"Window"},"No Window Bounds":{id:"no_window_bound",info:"Disable Window Bounds. Can be useful if you use a window manager.",implemented:!0,hidden:"linux"!==process.platform,cat:"lightcord",category:"Window"},"Enable Glasstron":{id:"enable_glasstron",info:"Enable Glasstron. If you're not using transparent themes, this can reduce lag.",implemented:!0,hidden:!1,cat:"lightcord",category:"Window"},Enable:{id:"lightcord-presence-1",info:"Enable RichPresence below.",implemented:!0,hidden:!1,cat:"status"}},d={"bda-gs-1":!0,"bda-gs-2":!1,"bda-gs-3":!1,"bda-gs-4":!1,"bda-gs-5":!0,"bda-gs-6":!1,"bda-gs-7":!1,"bda-gs-8":!1,"bda-es-0":!0,"bda-es-1":!0,"bda-es-2":!0,"bda-es-4":!1,"bda-es-6":!0,"bda-es-7":!0,"bda-gs-b":!1,"bda-es-8":!0,"bda-dc-0":!1,"bda-css-0":!1,"bda-css-1":!1,"bda-es-9":!0,"fork-dm-1":!1,"fork-ps-1":!0,"fork-ps-2":!0,"fork-ps-3":!0,"fork-ps-4":!0,"fork-ps-5":!0,"fork-ps-6":!0,"fork-ps-7":!1,"fork-es-2":!1,"fork-es-3":!0,"fork-wp-1":!1,"fork-wp-2":!1,"fork-beta":!0,"lightcord-1":!1,"lightcord-2":!0,"lightcord-presence-1":!1,"lightcord-3":!1,"lightcord-4":!1,"lightcord-5":!0,"lightcord-6":!0,"lightcord-7":!1,"lightcord-8":!1,"lightcord-9":!1,"lightcord-10":!1,no_window_bound:!1},h={},u={},p={name:"Lightcord",application_id:"711416957718757418",state:"Lightcord Client",details:"Browsing Discord","timestamps.start":Date.now(),"assets.small":null,"assets.large":"712323821037682791"},m=[],g=[],f=Object.create(BetterDiscordConfig),b={},y={},v={},w={},C=webpackJsonp.push([[],{__extra_id__:(e,t,n)=>e.exports=n},[["__extra_id__"]]]);delete C.m.__extra_id__,delete C.c.__extra_id__;const E=e=>{for(const t in C.c)if(C.c.hasOwnProperty(t)){const n=C.c[t].exports;if(n&&n.__esModule&&n.default&&e(n.default))return n.default;if(n&&e(n))return n}return null};let S={find:E,findAll:e=>{const t=[];for(const n in C.c)if(C.c.hasOwnProperty(n)){const s=C.c[n].exports;s&&s.__esModule&&s.default&&e(s.default)?t.push(s.default):s&&e(s)&&t.push(s)}return t},findByProps:(...e)=>E(t=>e.every(e=>void 0!==t[e])),findByPrototypes:(...e)=>E(t=>t.prototype&&e.every(e=>void 0!==t.prototype[e])),findByDisplayName:e=>E(t=>t.displayName===e)};var x=S;window.Lightcord.BetterDiscord.WebpackModules=S;const k=window.require,D=n(2),M=n(1),B=DiscordNative.globals?DiscordNative.globals.releaseChannel:DiscordNative.app?DiscordNative.app.getReleaseChannel():"stable";let N="";N="win32"===process.platform?process.env.APPDATA:"darwin"===process.platform?M.join(process.env.HOME,"Library","Preferences"):process.env.XDG_CONFIG_HOME?process.env.XDG_CONFIG_HOME:M.join(process.env.HOME,".config"),N=M.join(N,"BetterDiscord");var L=new class{constructor(){this.data={settings:{stable:{},canary:{},ptb:{}}},this.pluginData={},window.Lightcord.BetterDiscord.DataStore=this}initialize(){try{D.existsSync(this.BDFile)||D.writeFileSync(this.BDFile,JSON.stringify(this.data,null,4),"utf-8");const e=JSON.parse(D.readFileSync(this.BDFile,"utf-8"));if(e.hasOwnProperty("settings")&&(this.data=e),!D.existsSync(this.settingsFile))return;let t=k(this.settingsFile);D.unlinkSync(this.settingsFile),t=t.hasOwnProperty("settings")?Object.assign({stable:{},canary:{},ptb:{}},{[B]:t}):Object.assign({stable:{},canary:{},ptb:{}},t),this.setBDData("settings",t)}catch(e){console.error(e),ke.alert("Corrupt Storage","The bd storage has somehow become corrupt. You may either try to salvage the file or delete it then reload.")}}get injectionPath(){return this._injectionPath=null}get configFile(){return this._configFile||(this._configFile=M.resolve(this.injectionPath,"betterdiscord","config.json"))}get BDFile(){return this._BDFile||(this._BDFile=M.resolve(N,"bdstorage.json"))}get settingsFile(){return this._settingsFile||(this._settingsFile=M.resolve(N,"bdsettings.json"))}getPluginFile(e){return M.resolve(we.pluginsFolder,e+".config.json")}getSettingGroup(e){return this.data.settings[B][e]||null}setSettingGroup(e,t){this.data.settings[B][e]=t,D.writeFileSync(this.BDFile,JSON.stringify(this.data,null,4),"utf-8")}getBDData(e){return this.data[e]||""}setBDData(e,t){this.data[e]=t,D.writeFileSync(this.BDFile,JSON.stringify(this.data,null,4),"utf-8")}getPluginData(e,t){return void 0!==this.pluginData[e]?this.pluginData[e][t]:D.existsSync(this.getPluginFile(e))?(this.pluginData[e]=JSON.parse(D.readFileSync(this.getPluginFile(e))),this.pluginData[e][t]):void 0}setPluginData(e,t,n){void 0!==n&&(void 0===this.pluginData[e]&&(this.pluginData[e]={}),this.pluginData[e][t]=n,D.writeFileSync(this.getPluginFile(e),JSON.stringify(this.pluginData[e],null,4),"utf-8"))}deletePluginData(e,t){void 0===this.pluginData[e]&&(this.pluginData[e]={}),delete this.pluginData[e][t],D.writeFileSync(this.getPluginFile(e),JSON.stringify(this.pluginData[e],null,4),"utf-8")}};const A=n(5);var P=new class extends A{constructor(){super(),window.Lightcord.BetterDiscord.BDEvents=this}dispatch(e,...t){this.emit(e,...t)}off(e,t){this.removeListener(e,t)}};class T{constructor(){window.Lightcord.BetterDiscord.PluginModule=this}get folder(){return we.pluginsFolder}}T.prototype.loadPlugins=async function(){this.loadPluginData(),m.splice(0,0,...await we.loadPlugins());const e=Object.keys(y);for(let t=0;tsetTimeout(e,10))}this.savePluginData(),n(0).remote.getCurrentWebContents().on("did-navigate-in-page",this.channelSwitch.bind(this))},T.prototype.startPlugin=function(e,t=!1){try{y[e].plugin.start(),h["fork-ps-2"]&&!t&&ke.showToast(`${y[e].plugin.getName()} v${y[e].plugin.getVersion()} has started.`)}catch(n){h["fork-ps-2"]&&!t&&ke.showToast(`${y[e].plugin.getName()} v${y[e].plugin.getVersion()} could not be started.`,{type:"error"}),v[e]=!1,this.savePluginData(),ke.err("Plugins",e+" could not be started.",n)}},T.prototype.stopPlugin=function(e,t=!1){try{y[e].plugin.stop(),h["fork-ps-2"]&&!t&&ke.showToast(`${y[e].plugin.getName()} v${y[e].plugin.getVersion()} has stopped.`)}catch(n){h["fork-ps-2"]&&!t&&ke.showToast(`${y[e].plugin.getName()} v${y[e].plugin.getVersion()} could not be stopped.`,{type:"error"}),ke.err("Plugins",y[e].plugin.getName()+" could not be stopped.",n)}},T.prototype.enablePlugin=function(e,t=!1){v[e]||(v[e]=!0,this.savePluginData(),this.startPlugin(e,t))},T.prototype.enable=function(e,t=!1){return this.enablePlugin(e,t)},T.prototype.disablePlugin=function(e,t=!1){v[e]&&(v[e]=!1,this.savePluginData(),this.stopPlugin(e,t))},T.prototype.disable=function(e,t=!1){return this.disablePlugin(e,t)},T.prototype.togglePlugin=function(e){v[e]?this.disablePlugin(e):this.enablePlugin(e)},T.prototype.toggle=function(e,t=!1){return this.togglePlugin(e,t)},T.prototype.loadPlugin=async function(e){const t=await we.loadContent(e,"plugin");if(t)return h["fork-ps-1"]&&ke.showContentErrors({plugins:[t]}),h["fork-ps-2"]&&ke.showToast(e+" could not be loaded.",{type:"error"}),ke.err("ContentManager",e+" could not be loaded.",t);const n=Object.values(y).find(t=>console.log(t.filename,e)||t.filename==e).plugin;try{n.load&&"function"==typeof n.load&&n.load()}catch(e){h["fork-ps-1"]&&ke.showContentErrors({plugins:[e]})}ke.log("ContentManager",`${n.getName()} v${n.getVersion()} was loaded.`),h["fork-ps-2"]&&ke.showToast(`${n.getName()} v${n.getVersion()} was loaded.`,{type:"success"}),P.dispatch("plugin-loaded",n.getName())},T.prototype.unloadPlugin=function(e){const t=Object.values(y).find(t=>t.filename==e)||y[e];if(!t)return;const n=t.plugin.getName();v[n]&&this.disablePlugin(n,!0);const s=we.unloadContent(y[n].filename,"plugin");if(delete y[n],s)return h["fork-ps-1"]&&ke.showContentErrors({plugins:[s]}),h["fork-ps-2"]&&ke.showToast(n+" could not be unloaded. It may have not been loaded yet.",{type:"error"}),ke.err("ContentManager",n+" could not be unloaded. It may have not been loaded yet.",s);ke.log("ContentManager",n+" was unloaded."),h["fork-ps-2"]&&ke.showToast(n+" was unloaded.",{type:"success"}),P.dispatch("plugin-unloaded",n)},T.prototype.delete=function(e){const t=Object.values(y).find(t=>t.filename==e)||y[e];if(!t)return;this.unloadPlugin(t.filename);const s=n(1).resolve(we.pluginsFolder,t.filename);n(2).unlinkSync(s)},T.prototype.reloadPlugin=async function(e){const t=Object.values(y).find(t=>t.filename==e)||y[e];if(!t)return this.loadPlugin(e);const n=t.plugin.getName(),s=v[n];s&&this.stopPlugin(n,!0);const r=await we.reloadContent(y[n].filename,"plugin");if(r)return h["fork-ps-1"]&&ke.showContentErrors({plugins:[r]}),h["fork-ps-2"]&&ke.showToast(n+" could not be reloaded.",{type:"error"}),ke.err("ContentManager",n+" could not be reloaded.",r);y[n].plugin.load&&"function"==typeof y[n].plugin.load&&y[n].plugin.load(),s&&this.startPlugin(n,!0),ke.log("ContentManager",`${n} v${y[n].plugin.getVersion()} was reloaded.`),h["fork-ps-2"]&&ke.showToast(`${n} v${y[n].plugin.getVersion()} was reloaded.`,{type:"success"}),P.dispatch("plugin-reloaded",n)},T.prototype.reload=function(e){return this.reloadPlugin(e)},T.prototype.edit=function(e){console.log("Edit "+e);const t=Object.values(y).find(t=>t.filename==e)||y[e];if(!t)return;const s=n(1).resolve(we.pluginsFolder,t.filename);console.log("Edit "+s),n(0).shell.openItem(""+s)},T.prototype.updatePluginList=function(){const e=we.loadNewContent("plugin");for(const t of e.added)this.loadPlugin(t);for(const t of e.removed)this.unloadPlugin(t)},T.prototype.loadPluginData=function(){const e=L.getSettingGroup("plugins");e&&Object.assign(v,e)},T.prototype.savePluginData=function(){L.setSettingGroup("plugins",v)},T.prototype.newMessage=function(){const e=Object.keys(y);for(let t=0;t{if(this.disabled)return;this.show();const e=new MutationObserver(t=>{t.forEach(t=>{const n=Array.from(t.removedNodes),s=n.indexOf(this.node)>-1,r=n.some(e=>e.contains(this.node));(s||r)&&(this.hide(),e.disconnect())})});e.observe(document.body,{subtree:!0,childList:!0})}),this.node.addEventListener("mouseleave",()=>{this.hide()}))}get container(){return document.querySelector("."+ke.removeDa(BDModules.get(e=>e.popouts)[0].popouts)+" ~ ."+ke.removeDa(BDModules.get(e=>e.layerContainer)[0].layerContainer))}get canShowAbove(){return this.node.getBoundingClientRect().top-this.element.offsetHeight>=0}get canShowBelow(){return this.node.getBoundingClientRect().top+this.node.offsetHeight+this.element.offsetHeight<=ke.screenHeight}get canShowLeft(){return this.node.getBoundingClientRect().left-this.element.offsetWidth>=0}get canShowRight(){return this.node.getBoundingClientRect().left+this.node.offsetWidth+this.element.offsetWidth<=ke.screenWidth}hide(){this.element.remove(),this.tooltipElement.className=this._className}show(){this.tooltipElement.className=`${F().tooltip} ${H(this.style)}`,this.labelElement.textContent=this.label,this.container.append(this.element),"top"==this.side&&(this.canShowAbove||!this.canShowAbove&&this.preventFlip?this.showAbove():this.showBelow()),"bottom"==this.side&&(this.canShowBelow||!this.canShowBelow&&this.preventFlip?this.showBelow():this.showAbove()),"left"==this.side&&(this.canShowLeft||!this.canShowLeft&&this.preventFlip?this.showLeft():this.showRight()),"right"==this.side&&(this.canShowRight||!this.canShowRight&&this.preventFlip?this.showRight():this.showLeft())}showAbove(){this.tooltipElement.classList.add(H("top")),this.element.style.setProperty("top",q(this.node.getBoundingClientRect().top-this.element.offsetHeight-10)),this.centerHorizontally()}showBelow(){this.tooltipElement.classList.add(H("bottom")),this.element.style.setProperty("top",q(this.node.getBoundingClientRect().top+this.node.offsetHeight+10)),this.centerHorizontally()}showLeft(){this.tooltipElement.classList.add(H("left")),this.element.style.setProperty("left",q(this.node.getBoundingClientRect().left-this.element.offsetWidth-10)),this.centerVertically()}showRight(){this.tooltipElement.classList.add(H("right")),this.element.style.setProperty("left",q(this.node.getBoundingClientRect().left+this.node.offsetWidth+10)),this.centerVertically()}centerHorizontally(){const e=this.node.getBoundingClientRect().left+this.node.offsetWidth/2;this.element.style.setProperty("left",q(e-this.element.offsetWidth/2))}centerVertically(){const e=this.node.getBoundingClientRect().top+this.node.offsetHeight/2;this.element.style.setProperty("top",q(e-this.element.offsetHeight/2))}}var V=class extends React.Component{constructor(e){super(e)}async componentDidMount(){const{style:e="black",side:t="top",text:n=""}=this.props;this.node=xe.reactDom.findDOMNode(this),this.tooltip=new G(this.node,n,{style:e,side:t})}componentWillUnmount(){this.tooltip.hide(),delete this.tooltip}render(){return this.props.children}},J=n(2),Z=n(1);const Y={},K={};var X=new class{constructor(){window.Lightcord.BetterDiscord.PluginCertifier=this}patch(e,t){process.nextTick(()=>{!function(e,t){if(!document.getElementById(t))return;if(!e.url.startsWith("https://cdn.discordapp.com/"))return document.getElementById(t).remove();if(!e.filename.endsWith(".plugin.js")&&!e.filename.endsWith(".theme.css"))return document.getElementById(t).remove();j()(e.url,{headers:{"User-Agent":_.remote.getCurrentWebContents().userAgent}}).then(n=>{if(200!==n.status)throw new Error("File doesn't exist.");const s=$.createHash("sha256");let r=Buffer.alloc(0);n.body.on("data",e=>{r=Buffer.concat([r,e]),s.update(e)}),n.body.on("end",()=>{const n=s.digest("hex");K[e.url]=n,ee[n]=e.url,te(n,r,e.filename,n=>{!function(e,t,n){const s=document.getElementById(e);if(!s||s.childNodes.length>0)return;se||(se=BDModules.get(e=>e.flowerStarContainer)[0]);re||(re=BDModules.get(e=>e.childContainer)[0]);if(t.suspect){try{s.parentNode.style.borderColor="rgb(240, 71, 71)";let e=s=>{for(let r of s.children)"A"===r.tagName?r.addEventListener("click",e=>{e.preventDefault(),e.stopImmediatePropagation(),ke.showConfirmationModal("Are you sure you want to download this ?","The "+t.type.toLowerCase()+" **"+n+"** might be dangerous **("+t.harm+")**. \n\n**We don't recommand to download it**. However, you can still do it below.",{confirmText:"Download Anyway",cancelText:"Don't !",danger:!0,onCancel:()=>{},onConfirm:()=>{_.remote.shell.openExternal(r.href)}})}):["div"].includes(r.tagName.toLowerCase())&&e(r)};e(s.parentNode)}catch(e){console.error(e)}xe.reactDom.render(xe.react.createElement(V,{text:t.type+" "+t.name+" is potentially dangerous."},xe.react.createElement("div",{className:se.flowerStarContainer,style:{width:"20px",height:"20px"}},xe.react.createElement("svg",{className:BDModules.get(e=>e.svg)[0].svg,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 40 32"},xe.react.createElement("rect",{x:"0",y:"0",width:"32",height:"32",mask:"url(#svg-mask-avatar-status-round-32)",fill:"#f04747",mask:"url(#svg-mask-status-dnd)",className:BDModules.get(e=>e.pointerEvents)[0].pointerEvents})))),s)}else if(t.official){s.parentNode.style.borderColor="#4087ed";let e=xe.react.createElement("span",{style:{display:"inherit"}},[xe.react.createElement(V,{text:t.type+" "+t.name+" was made by the developers of Lightcord.",style:"brand"},xe.react.createElement("div",{className:se.flowerStarContainer,style:{width:"20px",height:"20px",float:"left"}},xe.react.createElement("svg",{className:se.flowerStar,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 16 15.2",stroke:"#36393f",style:{color:"#4087ed"}},xe.react.createElement("path",{fill:"currentColor","fill-rule":"evenodd",d:"m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"})),xe.react.createElement("div",{className:re.childContainer},xe.react.createElement("svg",{"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 16 15.2"},xe.react.createElement("path",{fill:"#ffffff",d:"M10.7,5.28a2.9,2.9,0,0,0-2.11.86.11.11,0,0,0,0,.16l1.05.94a.11.11,0,0,0,.15,0,1.27,1.27,0,0,1,.9-.33c.65,0,.65.73.65.73a.64.64,0,0,1-.65.65,1.73,1.73,0,0,1-1.18-.54c-.31-.26-.36-.32-.73-.66S7.06,5.28,5.65,5.28A2.26,2.26,0,0,0,3.37,7.56,2.59,2.59,0,0,0,3.82,9a2.18,2.18,0,0,0,1.83.89,2.94,2.94,0,0,0,2.1-.81.11.11,0,0,0,0-.16L6.74,8A.11.11,0,0,0,6.6,8a1.58,1.58,0,0,1-.94.29h0A.71.71,0,0,1,5,7.56H5a.63.63,0,0,1,.65-.64c.71,0,1.42.75,1.94,1.27.75.76,1.66,1.79,3.11,1.74A2.28,2.28,0,0,0,13,7.64a2.59,2.59,0,0,0-.45-1.47A2.14,2.14,0,0,0,10.7,5.28Z"}))))),xe.react.createElement(V,{text:"Install this "+t.type.toLowerCase()+" on Lightcord."},xe.react.createElement("div",{className:se.flowerStarContainer,style:{width:"20px",height:"20px"},onClick(){ke.showConfirmationModal("Are you sure you want to download this "+t.type.toLowerCase()+" ?","Lightcord will automatically download and load this "+t.type.toLowerCase()+". You must enable it in the settings.",{confirmText:"Download and Install",cancelText:"I've changed my mind",danger:!1,onCancel:()=>{},onConfirm:()=>{let e=oe(K).find(e=>e[1]===t.hash)[0];j()(e).then(async e=>{if(200!==e.status)throw new Error("Status was not 200");let n=await e.buffer(),s=Object(Z.join)("Plugin"===t.type?we._pluginsFolder:we._themesFolder,t.filename);Object(J.writeFileSync)(s,n),ke.showToast(t.type+" succesfully installed.")}).catch(e=>{e=e instanceof Error?e:new Error(e),ke.showToast(e.message,{type:"error"})})}})}},xe.react.createElement("svg",{className:se.flowerStar,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 24 24",style:{color:"rgb(67, 181, 129)",cursor:"pointer"}},React.createElement("g",{fill:"none","fill-rule":"evenodd"},React.createElement("path",{d:"M0 0h24v24H0z"}),React.createElement("path",{class:"fill",fill:"currentColor",d:"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"})))))]);xe.reactDom.render(e,s)}else{s.parentNode.style.borderColor="#4087ed";let e=xe.react.createElement("span",{style:{display:"inherit"}},[xe.react.createElement(V,{text:t.type+" "+t.name+" is certified by Lightcord."},xe.react.createElement("div",{className:se.flowerStarContainer,style:{width:"20px",height:"20px",float:"left"}},xe.react.createElement("svg",{className:se.flowerStar,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 16 15.2"},xe.react.createElement("path",{fill:"#4f545c","fill-rule":"evenodd",d:"m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"})),xe.react.createElement("div",{className:re.childContainer},xe.react.createElement("svg",{"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 16 15.2"},xe.react.createElement("path",{fill:"#ffffff",d:"M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z"}))))),xe.react.createElement(V,{text:"Install this "+t.type.toLowerCase()+" on Lightcord."},xe.react.createElement("div",{className:se.flowerStarContainer,style:{width:"20px",height:"20px"},onClick(){ke.showConfirmationModal("Are you sure you want to download this "+t.type.toLowerCase()+" ?","Lightcord will automatically install and launch this "+t.type.toLowerCase()+". You don't have anything to do.",{confirmText:"Download and Install",cancelText:"I've changed my mind",danger:!1,onCancel:()=>{},onConfirm:()=>{let e=oe(K).find(e=>e[1]===t.hash)[0];console.log(e),j()(e).then(async e=>{if(200!==e.status)throw new Error("Status was not 200");let n=await e.buffer(),s=Object(Z.join)("Plugin"===t.type?we._pluginsFolder:we._themesFolder,t.filename);console.log(s),Object(J.writeFileSync)(s,n),ke.showToast(t.type+" succesfully installed.")}).catch(e=>{e=e instanceof Error?e:new Error(e),ke.showToast(e.message,{type:"error"})})}})}},xe.react.createElement("svg",{className:se.flowerStar,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 24 24",style:{color:"rgb(67, 181, 129)",cursor:"pointer"}},React.createElement("g",{fill:"none","fill-rule":"evenodd"},React.createElement("path",{d:"M0 0h24v24H0z"}),React.createElement("path",{class:"fill",fill:"currentColor",d:"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"})))))]);xe.reactDom.render(e,s)}}(t,n,e.filename)},()=>{let e=document.getElementById(t);e&&e.remove()})})}).catch(()=>{})}(e,t)})}start(){}isTrusted(e){return Y[e]&&!Y[e].suspect}};function Q(e,t,n,s,r){t=t.toString("utf8");let o=!1;for(let e of t.split(/[^\w\d]+/g)){for(let t of["token","email","phone","MFA","2fa","child_process","localStorage","eval","getGlobal","BrowserWindow"])if(e.toLowerCase().includes(t.toLowerCase())&&"domtokenlist"===!e.toLowerCase()){console.log(t,e),o="token stealer/virus";break}if(o)break}if(!o){const e=t.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm,"").trim();if(/var [\w\d_$]+=\["/gi.test(e)&&(o="obfuscation/hidden code"),!o){const t=[/_0x\w{4}\('0x[\dabcdef]+'\)/g,/_0x\w{4}\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g,/\w+\('0x[\dabcdef]+'\)/g,/\w+\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g];for(let n of t){if(o)break;n.test(e)&&(o="obfuscation/hidden code")}}}if(!o)return s(e);Y[e]={suspect:!0,name:ee[e].split("/").pop(),type:ee[e].endsWith(".js")?"Plugin":"Theme",harm:o,hash:e,filename:r},console.log(`Found potentially dangerous ${Y[e].type.toLowerCase()}: ${Y[e].name}`),n(Y[e])}const ee={};function te(e,t,n,s,r){if(console.log(`File: ${n} hash: ${e}`),Y[e]){const t=Y[e];s(t)}else j()("https://cdn.jsdelivr.net/gh/Lightcord/filehashes@master/hashes/"+e,{headers:{"User-Agent":_.remote.getCurrentWebContents().userAgent}}).then(async o=>{if(200!==o.status)return n.endsWith(".theme.css")?r(e):void Q(e,t,s,r,n);const i=await o.json();i.hash=e,i.filename=n,Y[e]=i,s(i)}).catch(o=>{if(console.error("Could not read from github. "+o),n.endsWith(".theme.css"))return r(e);Q(e,t,s,r,n)})}function ne(e,t,n=(e=>{}),s=!1){const r=$.createHash("sha256");let o=Buffer.alloc(0);Object(J.createReadStream)(e).on("data",e=>{o=Buffer.concat([o,e]),r.update(e)}).on("end",()=>{const i=r.digest("hex");if(ee[i]=e,s&&ye[i]){let e=ye[i];if(!(e.timestampe.flowerStarContainer)[0],re=BDModules.get(e=>e.childContainer)[0];function oe(e){let t=[];return Object.keys(e).forEach(n=>{t.push([n,e[n]])}),t}let ie=null,ae=null;function le(){ie=[$.randomBytes(16).toString("base64"),$.randomBytes(32).toString("base64")]}function ce(e){let t=[Buffer.from(ie[1],"base64"),Buffer.from(ie[0],"base64")],n=$.createCipheriv("aes-256-cbc",...t),s=n.update(Buffer.from(e,"utf8"));return s=Buffer.concat([s,n.final()]),s.toString("base64")}window.Lightcord.Api.ensureExported(e=>e.ObjectStorage).then(e=>{let t=e.impl;ae=function(){t.set("PluginCertifierKeyEncryption__",btoa(JSON.stringify(ie)))},setInterval(()=>{ae()},1e5);try{let e=function(e){try{return JSON.parse(e)}catch(e){return e instanceof Error?new Error(e):e}}(atob(t.get("PluginCertifierKeyEncryption__")));if(e instanceof Error||!Array.isArray(e)||2!==e.length||e.find(e=>"string"!=typeof e)||16!==Buffer.from(e[0],"base64").length||32!==Buffer.from(e[1],"base64").length)return le(),void ae();ie=e}catch(e){le(),ae()}});const de=n(1),he=n(2),ue=n(6).Module;ue.globalPaths.push(de.resolve(n(0).remote.app.getAppPath(),"node_modules"));class pe extends Error{constructor(e){super(e),this.name="MetaError"}}const me=ue._extensions[".js"],ge=ue._extensions[".css"]?ue._extensions[".css"]:()=>null,fe=/[^\S\r\n]*?(?:\r\n|\n)[^\S\r\n]*?\*[^\S\r\n]?/,be=/^\\@/;let ye={},ve=!1;var we=new class{constructor(){this.timeCache={},this.watchers={}}patchExtensions(){ve||(ve=!0,ue._extensions[".js"]=this.getContentRequire("plugin"),ue._extensions[".css"]=this.getContentRequire("theme"))}get pluginsFolder(){return this._pluginsFolder||(this._pluginsFolder=he.realpathSync(de.resolve(f.dataPath+"plugins/")))}get themesFolder(){return this._themesFolder||(this._themesFolder=he.realpathSync(de.resolve(f.dataPath+"themes/")))}loadAddonCertifierCache(){if("string"!=typeof L.getSettingGroup("PluginCertifierHashes"))L.setSettingGroup("PluginCertifierHashes",ce("{}"));else try{ye=JSON.parse(function(e){try{let t=$.createDecipheriv("aes-256-cbc",Buffer.from(ie[1],"base64"),Buffer.from(ie[0],"base64")),n=t.update(Buffer.from(e,"base64"));return n=Buffer.concat([n,t.final()]),n.toString("utf8")}catch(e){return"{}"}}(L.getSettingGroup("PluginCertifierHashes")))}catch(e){L.setSettingGroup("PluginCertifierHashes",ce("{}")),ye={}}Object.keys(ye).forEach(e=>{let t=ye[e];if(!t||"object"!=typeof t||Array.isArray(t))return delete ye[e];let n=[{key:"timestamp",type:"number"},{key:"result",type:"object"},{key:"hash",type:"string"}];for(let s of n)if(!(s.key in t)||typeof t[s.key]!==s.type)return void delete ye[e];t.hash===e?t.result.suspect&&delete ye[e]:delete ye[e]}),this.saveAddonCache()}saveAddonCache(){L.setSettingGroup("PluginCertifierHashes",ce(JSON.stringify(ye)))}watchContent(e){if(this.watchers[e])return;const t="plugin"===e,n=t?this.pluginsFolder:this.themesFolder,s=t?".plugin.js":".theme.css";this.watchers[e]=he.watch(n,{persistent:!1},async(e,r)=>{if(!e||!r||!r.endsWith(s))return;await new Promise(e=>setTimeout(e,50));try{he.statSync(de.resolve(n,r))}catch(e){if("ENOENT"!==e.code)return;return delete this.timeCache[r],t?R.unloadPlugin(r):Se.unloadTheme(r)}if(!he.statSync(de.resolve(n,r)).isFile())return;const o=he.statSync(de.resolve(n,r));o&&o.mtime&&o.mtime.getTime()&&"number"==typeof o.mtime.getTime()&&this.timeCache[r]!=o.mtime.getTime()&&(this.timeCache[r]=o.mtime.getTime(),"rename"==e&&(t?await R.loadPlugin(r):await Se.loadTheme(r)),"change"==e&&(t?await R.reloadPlugin(r):await Se.reloadTheme(r)))})}unwatchContent(e){this.watchers[e]&&(this.watchers[e].close(),delete this.watchers[e])}extractMeta(e){const t=e.split("\n")[0];if(t.includes("//META"))return this.parseOldMeta(e);if(t.includes("/**"))return this.parseNewMeta(e);throw new pe("META was not found.")}parseOldMeta(e){const t=e.split("\n")[0],n=t.substring(t.lastIndexOf("//META")+6,t.lastIndexOf("*//"));if(t.indexOf("META")<0)throw new pe("META was not found.");const s=ke.testJSON(n);if(!s)throw new pe("META could not be parsed.");if(!s.name)throw new pe("META missing name data.");return s.format="json",s}parseNewMeta(e){const t=e.split("/**",2)[1].split("*/",1)[0],n={};let s="",r="";for(const e of t.split(fe))if(0!==e.length)if("@"===e.charAt(0)&&" "!==e.charAt(1)){n[s]=r;const t=e.indexOf(" ");s=e.substr(1,t-1),r=e.substr(t+1)}else r+=" "+e.replace("\\n","\n").replace(be,"@");return n[s]=r.trim(),delete n[""],n.format="jsdoc",n}getContentRequire(e){const t="plugin"===e,n=this,s=t?me:ge;return function(e,r){const o=t?n.pluginsFolder:n.themesFolder,i=de.resolve(o,de.basename(r));if(!he.existsSync(i)||r!==he.realpathSync(i))return Reflect.apply(s,this,arguments);let a=he.readFileSync(r,"utf8");a=ke.stripBOM(a);const l=he.statSync(r),c=n.extractMeta(a);if(c.filename=de.basename(r),c.added=l.atimeMs,c.modified=l.mtimeMs,c.size=l.size,t||(c.css=a,"json"==c.format&&(c.css=c.css.split("\n").slice(1).join("\n")),a=`module.exports = ${JSON.stringify(c)};`),t){e._compile(a,e.filename);!ke.isEmpty(e.exports)?(c.type=e.exports,e.exports=c,a=""):(ke.warn("Module Not Exported",c.name+", please start setting module.exports"),a+=`\nmodule.exports = ${JSON.stringify(c)};\nmodule.exports.type = ${c.exports||c.name};`)}e._compile(a,r)}}makePlaceholderPlugin(e){return{plugin:{start:()=>{},getName:()=>e.name||e.filename,getAuthor:()=>"???",getDescription:()=>e.message?e.message:"This plugin was unable to be loaded. Check the author's page for updates.",getVersion:()=>"???"},name:e.name||e.filename,filename:e.filename,source:e.source?e.source:"",website:e.website?e.website:""}}async loadContent(e,t){if(void 0===e||void 0===t)return;const n="plugin"===t,s=n?this.pluginsFolder:this.themesFolder;if(h["fork-ps-6"]){let t=await new Promise(t=>{ne(de.resolve(s,e),e=>{console.log(e),t(e)},n=>{t({suspect:!1,hash:n,filename:e,name:e})},!0)});if(t&&(ye[t.hash]={timestamp:Date.now(),hash:t.hash,result:t},this.saveAddonCache(),t.suspect))return{name:e,file:e,message:"This plugin might be dangerous ("+t.harm+").",error:new Error("This plugin might be dangerous ("+t.harm+").")}}try{window.require(de.resolve(s,e))}catch(t){return{name:e,file:e,message:"Could not be compiled.",error:{message:t.message,stack:t.stack}}}const r=window.require(de.resolve(s,e));if(!r.name)return{name:e,file:e,message:"Cannot escape the ID.",error:new Error("Cannot read property 'replace' of undefined")};if(r.id=ke.escapeID(r.name),n){if(!r.type)return;try{r.plugin=new r.type,delete y[r.plugin.getName()],y[r.plugin.getName()]=r}catch(t){return{name:e,file:e,message:"Could not be constructed.",error:{message:t.message,stack:t.stack}}}}else delete b[r.name],b[r.name]=r}unloadContent(e,t){if(void 0===e||void 0===t)return;const n="plugin"===t?this.pluginsFolder:this.themesFolder;try{delete window.require.cache[window.require.resolve(de.resolve(n,e))]}catch(t){return{name:e,file:e,message:"Could not be unloaded.",error:{message:t.message,stack:t.stack}}}}isLoaded(e,t){const n="plugin"===t?this.pluginsFolder:this.themesFolder;try{window.require.cache[window.require.resolve(de.resolve(n,e))]}catch(e){return!1}return!0}async reloadContent(e,t){const n=this.unloadContent(e,t);return n||await this.loadContent(e,t)}loadNewContent(e){const t="plugin"===e,n=t?".plugin.js":".theme.css",s=t?this.pluginsFolder:this.themesFolder,r=he.readdirSync(s),o=Object.values(t?y:b),i=o.filter(e=>!r.includes(e.filename)).map(e=>t?e.plugin.getName():e.name);return{added:r.filter(e=>!o.find(t=>t.filename==e)&&e.endsWith(n)&&he.statSync(de.resolve(s,e)).isFile()),removed:i}}async loadAllContent(e){this.patchExtensions();const t="plugin"===e,n=t?".plugin.js":".theme.css",s=t?this.pluginsFolder:this.themesFolder,r=[],o=he.readdirSync(s);for(const t of o){if(!he.statSync(de.resolve(s,t)).isFile()||!t.endsWith(n))continue;const o=await this.loadContent(t,e);o&&r.push(o)}return r}loadPlugins(){return this.loadAllContent("plugin")}loadThemes(){return this.loadAllContent("theme")}};class Ce{static escapeID(e){return e.replace(/^[^a-z]+|[^\w-]+/gi,"-")}static addStyle(e,t){document.head.append(Ce.createElement(``))}static removeStyle(e){const t=document.getElementById(e);t&&t.remove()}static addScript(e,t){return new Promise(n=>{const s=document.createElement("script");s.id=e,s.src=t,s.type="text/javascript",s.onload=n,document.head.append(s)})}static removeScript(e){e=this.escapeID(e);const t=document.getElementById(e);t&&t.remove()}static animate({timing:e=(e=>e),update:t,duration:n}){const s=performance.now();requestAnimationFrame((function r(o){let i=(o-s)/n;i>1&&(i=1);const a=e(i);t(a),i<1&&requestAnimationFrame(r)}))}static Q(e){const t=this.parseHTML(e);return(t instanceof NodeList?Array.from(t).some(e=>1===e.nodeType):1===t.nodeType)?t:this.query(e)}static query(e,t){return t||(t=document),t.querySelector(e)}static queryAll(e,t){return t||(t=document),t.querySelectorAll(e)}static parseHTML(e,t=!1){const n=document.createElement("template");n.innerHTML=e;const s=n.content.cloneNode(!0);return t?s:s.childNodes.length>1?s.childNodes:s.childNodes[0]}static createElement(e,t=!1){return this.parseHTML(e,t)}static escapeHTML(e){const t=document.createTextNode(""),n=document.createElement("span");return n.append(t),t.nodeValue=e,n.innerHTML}static addClass(e,...t){t=t.flat().filter(e=>e);for(let e=0;ee),e.classList.add(...t),e}static removeClass(e,...t){for(let e=0;ee),e.classList.remove(...t),e}static toggleClass(e,t,n){return t=t.toString().split(" ").filter(e=>e),void 0!==n?t.forEach(t=>e.classList.toggle(t,n)):t.forEach(t=>e.classList.toggle(t)),e}static hasClass(e,t){return t.toString().split(" ").filter(e=>e).every(t=>e.classList.contains(t))}static replaceClass(e,t,n){return e.classList.replace(t,n),e}static appendTo(e,t){return"string"==typeof t&&(t=this.query(t)),t?(t.append(e),e):null}static prependTo(e,t){return"string"==typeof t&&(t=this.query(t)),t?(t.prepend(e),e):null}static insertAfter(e,t){return t.parentNode.insertBefore(e,t.nextSibling),e}static after(e,t){return e.parentNode.insertBefore(t,e.nextSibling),e}static next(e,t=""){return t?e.querySelector("+ "+t):e.nextElementSibling}static nextAll(e){return e.querySelectorAll("~ *")}static nextUntil(e,t){const n=[];for(;e.nextElementSibling&&!e.nextElementSibling.matches(t);)n.push(e=e.nextElementSibling);return n}static previous(e,t=""){const n=e.previousElementSibling;return t?n&&n.matches(t)?n:null:n}static previousAll(e){const t=[];for(;e.previousElementSibling;)t.push(e=e.previousElementSibling);return t}static previousUntil(e,t){const n=[];for(;e.previousElementSibling&&!e.previousElementSibling.matches(t);)n.push(e=e.previousElementSibling);return n}static indexInParent(e){const t=e.parentNode.childNodes;let n=0;for(let s=0;s "+t)}static findChildren(e,t){return e.querySelectorAll(":scope > "+t)}static parents(e,t=""){const n=[];if(t)for(;e.parentElement&&e.parentElement.closest(t);)n.push(e=e.parentElement.closest(t));else for(;e.parentElement;)n.push(e=e.parentElement);return n}static parentsUntil(e,t){const n=[];for(;e.parentElement&&!e.parentElement.matches(t);)n.push(e=e.parentElement);return n}static siblings(e,t="*"){return Array.from(e.parentElement.children).filter(n=>n!=e&&n.matches(t))}static css(e,t,n){return void 0===n?global.getComputedStyle(e)[t]:(e.style[t]=n,e)}static width(e,t){return void 0===t?parseInt(getComputedStyle(e).width):(e.style.width=t,e)}static height(e,t){return void 0===t?parseInt(getComputedStyle(e).height):(e.style.height=t,e)}static text(e,t){return void 0===t?e.textContent:e.textContent=t}static innerWidth(e){return e.clientWidth}static innerHeight(e){return e.clientHeight}static outerWidth(e){return e.offsetWidth}static outerHeight(e){return e.offsetHeight}static offset(e){return e.getBoundingClientRect()}static get listeners(){return this._listeners||(this._listeners={})}static on(e,t,n,s){const[r,o]=t.split("."),i=n&&s;s||(s=n);const a=i?function(e){e.target.matches(n)&&s(e)}:s;e.addEventListener(r,a);const l=()=>{e.removeEventListener(r,a)};if(o){this.listeners[o]||(this.listeners[o]=[]);const t=()=>{l(),this.listeners[o].splice(this.listeners[o].findIndex(t=>t.event==r&&t.element==e),1)};return this.listeners[o].push({event:r,element:e,cancel:t}),t}return l}static once(e,t,n,s){const[r,o]=t.split("."),i=n&&s;s||(s=n);const a=i?function(t){t.target.matches(n)&&(s(t),e.removeEventListener(r,a))}:function(t){s(t),e.removeEventListener(r,a)};e.addEventListener(r,a);const l=()=>{e.removeEventListener(r,a)};if(o){this.listeners[o]||(this.listeners[o]=[]);const t=()=>{l(),this.listeners[o].splice(this.listeners[o].findIndex(t=>t.event==r&&t.element==e),1)};return this.listeners[o].push({event:r,element:e,cancel:t}),t}return l}static __offAll(e,t){const[n,s]=e.split(".");let r=e=>e.event==n,o=e=>e;t&&(r=e=>e.event==n&&e.element==t,o=e=>e.element==t);const i=this.listeners[s]||[],a=n?i.filter(r):i.filter(o);for(let e=0;e{this.observer.unsubscribe(s),t()};return this.observer.subscribe(s,t=>{const s=Array.from(n?t.addedNodes:t.removedNodes),r=s.indexOf(e)>-1,o=s.some(t=>t.contains(e));return r||o}),e}static onMount(e,t){return this.onMountChange(e,t)}static onUnmount(e,t){return this.onMountChange(e,t,!1)}static onAdded(e,t){return this.onMount(e,t)}static onRemoved(e,t){return this.onUnmount(e,t,!1)}static wrap(e){const t=this.parseHTML('
');for(let n=0;nsetTimeout(e,10))}for(const e in w)b[e]||delete w[e];this.saveThemeData()},Ee.prototype.enableTheme=function(e,t=!1){w[e]=!0,this.saveThemeData();const n=b[e];Ce.addStyle(Ce.escapeID(n.id),unescape(n.css)),P.dispatch("theme-enabled"),h["fork-ps-2"]&&!t&&ke.showToast(`${n.name} v${n.version} has been applied.`)},Ee.prototype.enable=function(e,t=!1){return this.enableTheme(e,t)},Ee.prototype.disableTheme=function(e,t=!1){w[e]=!1,this.saveThemeData();const n=b[e];Ce.removeStyle(Ce.escapeID(n.id)),P.dispatch("theme-disabled"),h["fork-ps-2"]&&!t&&ke.showToast(`${n.name} v${n.version} has been disabled.`)},Ee.prototype.disable=function(e,t=!1){return this.disableTheme(e,t)},Ee.prototype.toggleTheme=function(e){w[e]?this.disableTheme(e):this.enableTheme(e)},Ee.prototype.toggle=function(e){return this.toggleTheme(e)},Ee.prototype.loadTheme=async function(e){const t=await we.loadContent(e,"theme");if(t)return h["fork-ps-1"]&&ke.showContentErrors({themes:[t]}),h["fork-ps-2"]&&ke.showToast(e+" could not be loaded. It may not have been loaded.",{type:"error"}),ke.err("ContentManager",e+" could not be loaded.",t);const n=Object.values(b).find(t=>t.filename==e);ke.log("ContentManager",`${n.name} v${n.version} was loaded.`),h["fork-ps-2"]&&ke.showToast(`${n.name} v${n.version} was loaded.`,{type:"success"}),P.dispatch("theme-loaded",n.name)},Ee.prototype.unloadTheme=function(e){const t=Object.values(b).find(t=>t.filename==e)||b[e];if(!t)return;const n=t.name;w[n]&&this.disableTheme(n,!0);const s=we.unloadContent(b[n].filename,"theme");if(delete b[n],s)return h["fork-ps-1"]&&ke.showContentErrors({themes:[s]}),h["fork-ps-2"]&&ke.showToast(n+" could not be unloaded. It may have not been loaded yet.",{type:"error"}),ke.err("ContentManager",n+" could not be unloaded. It may have not been loaded yet.",s);ke.log("ContentManager",n+" was unloaded."),h["fork-ps-2"]&&ke.showToast(n+" was unloaded.",{type:"success"}),P.dispatch("theme-unloaded",n)},Ee.prototype.delete=function(e){const t=Object.values(b).find(t=>t.filename==e)||b[e];if(!t)return;this.unloadTheme(t.filename);const s=n(1).resolve(we.themesFolder,t.filename);n(2).unlinkSync(s)},Ee.prototype.reloadTheme=async function(e){const t=Object.values(b).find(t=>t.filename==e)||b[e];if(!t)return this.loadTheme(e);const n=t.name,s=await we.reloadContent(b[n].filename,"theme");if(w[n]&&(this.disableTheme(n,!0),this.enableTheme(n,!0)),s)return h["fork-ps-1"]&&ke.showContentErrors({themes:[s]}),h["fork-ps-2"]&&ke.showToast(n+" could not be reloaded.",{type:"error"}),ke.err("ContentManager",n+" could not be reloaded.",s);ke.log("ContentManager",`${n} v${b[n].version} was reloaded.`),h["fork-ps-2"]&&ke.showToast(`${n} v${b[n].version} was reloaded.`,{type:"success"}),P.dispatch("theme-reloaded",n)},Ee.prototype.reload=function(e){return this.reloadTheme(e)},Ee.prototype.edit=function(e){const t=Object.values(b).find(t=>t.filename==e)||b[e];if(!t)return;const s=n(1).resolve(we.themesFolder,t.filename);n(0).shell.openItem(""+s)},Ee.prototype.updateThemeList=function(){const e=we.loadNewContent("theme");for(const t of e.added)this.loadTheme(t);for(const t of e.removed)this.unloadTheme(t)},Ee.prototype.loadThemeData=function(){const e=L.getSettingGroup("themes");e&&Object.assign(w,e)},Ee.prototype.saveThemeData=function(){L.setSettingGroup("themes",w)};var Se=new Ee,xe=new class{constructor(){this.editorDetached=!1,this.WebpackModules=(()=>{const e=webpackJsonp.push([[],{__extra_id__:(e,t,n)=>e.exports=n},[["__extra_id__"]]]);delete e.m.__extra_id__,delete e.c.__extra_id__;const t=(e,t)=>{let n=t?e:e.default;if(!n)return e;if(n.remove&&n.set&&n.clear&&n.get&&!n.sort)return null;if(!n.getToken&&!n.getEmail&&!n.showToken)return e;const s=new Proxy(n,{getOwnPropertyDescriptor:function(e,t){if("getToken"!==t&&"getEmail"!==t&&"showToken"!==t)return Object.getOwnPropertyDescriptor(e,t)},get:function(e,t){return"getToken"==t&&e.getToken?()=>"mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa":"getEmail"==t&&e.getEmail?()=>"puppet11112@gmail.com":"showToken"==t&&e.showToken?()=>!0:"__proto__"==t&&e.__proto__?s:e[t]}});return t?s:Object.assign({},e,{default:s})},n=n=>{for(const s in e.c)if(e.c.hasOwnProperty(s)){const r=e.c[s].exports;if(r&&r.__esModule&&r.default&&n(r.default))return t(r.default,!0);if(r&&n(r))return t(r,!1)}return null};return{find:n,findAll:n=>{const s=[];for(const r in e.c)if(e.c.hasOwnProperty(r)){const o=e.c[r].exports;o&&o.__esModule&&o.default&&n(o.default)?s.push(t(o.default,!0)):o&&n(o)&&s.push(t(o,!1))}return s},findByUniqueProperties:e=>n(t=>e.every(e=>void 0!==t[e])),findByPrototypes:e=>n(t=>t.prototype&&e.every(e=>void 0!==t.prototype[e])),findByDisplayName:e=>n(t=>t.displayName===e)}})(),this.internal={react:this.WebpackModules.findByUniqueProperties(["Component","PureComponent","Children","createElement","cloneElement"]),reactDom:this.WebpackModules.findByUniqueProperties(["findDOMNode"])},this.getInternalInstance=e=>e[Object.keys(e).find(e=>e.startsWith("__reactInternalInstance"))],window.Lightcord.BetterDiscord.V2=this}initialize(){}joinBD1(){this.InviteActions.acceptInviteAndTransitionToInviteChannel("0Tmfo5ZbORCRqbAd")}leaveBD1(){this.GuildActions.leaveGuild("86004744966914048")}joinBD2(){this.InviteActions.acceptInviteAndTransitionToInviteChannel("2HScm8j")}leaveBD2(){this.GuildActions.leaveGuild("280806472928198656")}joinLC(){this.InviteActions.acceptInviteAndTransitionToInviteChannel("7eFff2A")}leaveLC(){this.GuildActions.leaveGuild("705908350218666117")}get react(){return this.internal.react}get React(){return this.internal.react}get reactDom(){return this.internal.reactDom}get ReactDom(){return this.internal.reactDom}get reactComponent(){return this.internal.react.Component}get ReactComponent(){return this.internal.react.Component}get anchorClasses(){return this.WebpackModules.findByUniqueProperties(["anchorUnderlineOnHover"])||{anchor:"anchor-3Z-8Bb",anchorUnderlineOnHover:"anchorUnderlineOnHover-2ESHQB"}}get slateEditorClasses(){return this.WebpackModules.findByUniqueProperties(["slateTextArea"])}get messageClasses(){return this.WebpackModules.findByUniqueProperties(["message","containerCozy"])}get guildClasses(){const e=BDModules.get(e=>e.wrapper&&e.unreadMentionsBar)[0],t=BDModules.get(e=>e.guildsError&&e.selected)[0],n=BDModules.get(e=>e.blobContainer)[0];return Object.assign({},e,t,n)}get MessageContentComponent(){return this.WebpackModules.find(e=>e.defaultProps&&e.defaultProps.hasOwnProperty("disableButtons"))}get MessageComponent(){return this.WebpackModules.find(e=>e.default&&e.default.displayName&&"Message"==e.default.displayName)}get TimeFormatter(){return this.WebpackModules.findByUniqueProperties(["dateFormat"])}get TooltipWrapper(){return this.WebpackModules.findByDisplayName("Tooltip")}get NativeModule(){return this.WebpackModules.findByUniqueProperties(["setBadge"])}get InviteActions(){return this.WebpackModules.findByUniqueProperties(["acceptInvite"])}get GuildActions(){return this.WebpackModules.findByUniqueProperties(["leaveGuild"])}get Tooltips(){return this.WebpackModules.find(e=>e.hide&&e.show&&!e.search&&!e.submit&&!e.search&&!e.activateRagingDemon&&!e.dismiss)}get KeyGenerator(){return this.WebpackModules.find(e=>e.toString&&/"binary"/.test(e.toString()))}get LayerStack(){return this.WebpackModules.findByUniqueProperties(["popLayer"])}get UserStore(){return this.WebpackModules.findByUniqueProperties(["getCurrentUser"])}get ChannelStore(){return this.WebpackModules.findByUniqueProperties(["getChannel"])}get ChannelActions(){return this.WebpackModules.findByUniqueProperties(["openPrivateChannel"])}get PrivateChannelActions(){return this.WebpackModules.findByUniqueProperties(["selectPrivateChannel"])}openDM(e){const t=this.UserStore.getCurrentUser().id;if(t==e)return;const n=this.ChannelStore.getDMFromUserId(e);if(n)return this.PrivateChannelActions.selectPrivateChannel(n);this.ChannelActions.openPrivateChannel(t,e)}parseSettings(e){return Object.keys(c).reduce((t,n)=>{const s=c[n];return s.cat===e&&s.implemented&&!s.hidden&&(s.text=n,t.push(s)),t},[])}};class ke{static get screenWidth(){return Math.max(document.documentElement.clientWidth,window.innerWidth||0)}static get screenHeight(){return Math.max(document.documentElement.clientHeight,window.innerHeight||0)}static get WindowConfigFile(){return this._windowConfigFile=null}static getAllWindowPreferences(){return{transparent:!0,frame:!1}}static getWindowPreference(e){return"transparent"===e||"frame"!==e&&null}static setWindowPreference(e,t){return"transparent"===e||"frame"!==e&&null}static stripBOM(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e}static getTextArea(){return Ce.query("."+De(BDModules.get(e=>e.channelTextArea&&e.titleWrapper)[0].channelTextArea)+" textarea")}static insertText(e,t){e.focus(),e.selectionStart=0,e.selectionEnd=e.value.length,document.execCommand("insertText",!1,t)}static escapeID(e){return e.replace(/^[^a-z]+|[^\w-]+/gi,"-")}static log(e,t){console.log(`%c[BandagedBD]%c [${e}]%c ${t}`,"color: #3a71c1; font-weight: 700;","color: #3a71c1;","")}static warn(e,t){console.warn(`%c[BandagedBD]%c [${e}]%c ${t}`,"color: #E8A400; font-weight: 700;","color: #E8A400;","")}static err(e,t,n){console.log(`%c[BandagedBD]%c [${e}]%c ${t}`,"color: red; font-weight: 700;","color: red;",""),n&&(console.groupCollapsed("%cError: "+n.message,"color: red;"),console.error(n.stack),console.groupEnd())}static formatString(e,t){for(const n in t){let s=t[n];Array.isArray(s)&&(s=JSON.stringify(s)),"object"==typeof s&&null!==s&&(s=s.toString()),e=e.replace(new RegExp(`{{${n}}}`,"g"),s)}return e}static escape(e){return e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}static testJSON(e){try{return JSON.parse(e)}catch(e){return!1}}static isEmpty(e){if(null==e||null==e||""==e)return!0;if("object"!=typeof e)return!1;if(Array.isArray(e))return 0==e.length;for(const t in e)if(e.hasOwnProperty(t))return!1;return!0}static suppressErrors(e,t){return(...n)=>{try{return e(...n)}catch(e){this.err("SuppressedError","Error occurred in "+t,e)}}}static monkeyPatch(e,t,n){const{before:s,after:r,instead:o,once:i=!1,silent:a=!1,force:l=!1}=n,c=n.displayName||e.displayName||e[t].displayName||e.name||e.constructor.displayName||e.constructor.name;if(a||console.log("patch",t,"of",c),!e[t]){if(!l)return console.error(t,"does not exist for",c);e[t]=function(){}}const d=e[t];let h=!1;const u=()=>{a||console.log("unpatch",t,"of",c),h=!0};return e[t]=function(){if(h)return d.call(this,...arguments);const n={thisObject:this,methodArguments:arguments,cancelPatch:u,originalMethod:d,callOriginalMethod:()=>n.returnValue=n.originalMethod.apply(n.thisObject,n.methodArguments)};if(o){const s=ke.suppressErrors(o,"`instead` callback of "+e[t].displayName)(n);void 0!==s&&(n.returnValue=s)}else s&&ke.suppressErrors(s,"`before` callback of "+e[t].displayName)(n),n.callOriginalMethod(),r&&ke.suppressErrors(r,"`after` callback of "+e[t].displayName)(n);return i&&u(),n.returnValue},Object.assign(e[t],d),e[t].__monkeyPatched=!0,e[t].displayName=c,e[t].__originalMethod||(e[t].__originalMethod=d,e[t].toString=function(){return d.toString()}),u}static onRemoved(e,t){const n=new MutationObserver(s=>{for(let r=0;r-1,l=i.some(t=>t.contains(e));(a||l)&&(n.disconnect(),t())}});n.observe(document.body,{subtree:!0,childList:!0})}static getNestedProp(e,t){return t.split(/\s?\.\s?/).reduce((function(e,t){return e&&e[t]}),e)}static showToast(e,t={}){if(!document.querySelector(".bd-toasts")){const e=document.querySelector("."+De(BDModules.get(e=>e.sidebar&&e.hasNotice)[0].sidebar)+" + div")||null,t=e?e.querySelector("form"):null,n=t?t.offsetHeight:80,s=document.createElement("div");s.classList.add("bd-toasts"),s.style.setProperty("bottom",n+"px"),document.querySelector("#app-mount").appendChild(s)}const n=document.querySelector(".bd-toasts"),{type:s="",icon:r=!0,timeout:o=3e3}=t,i=document.createElement("div");i.classList.add("bd-toast"),s&&i.classList.add("toast-"+s),s&&r&&i.classList.add("icon"),i.innerText=e,n.appendChild(i),n.style.setProperty("left",`calc(50% - ${n.offsetWidth/2}px)`),setTimeout(()=>{i.classList.add("closing"),setTimeout(()=>{i.remove(),document.querySelectorAll(".bd-toasts .bd-toast").length||document.querySelector(".bd-toasts").remove()},300)},o)}static alert(e,t){let n=BDModules.get(e=>e.modal&&e.inner&&!e.hideOnFullscreen)[0],s=BDModules.get(e=>e.header&&e.responsiveWidthMobile&&e.hideOnFullscreen)[0],r=BDModules.get(e=>e.header&&e.responsiveWidthMobile&&e.focusLock)[0];const o=Ce.createElement(`
\n
\n
\n
\n
\n
${e}
\n
\n
\n
\n
\n ${t}\n
\n
\n
\n \n
\n
\n
`);o.querySelector(".footer button").addEventListener("click",()=>{Ce.addClass(o,"closing"),setTimeout(()=>{o.remove(),i.forEach(e=>{try{e()}catch(e){console.error(e)}})},300)}),o.querySelector(".bd-backdrop").addEventListener("click",()=>{Ce.addClass(o,"closing"),setTimeout(()=>{o.remove(),i.forEach(e=>{try{e()}catch(e){console.error(e)}})},300)}),Ce.query("#app-mount").append(o);const i=[];return{close:()=>{Ce.addClass(o,"closing"),setTimeout(()=>{o.remove(),i.forEach(e=>{try{e()}catch(e){console.error(e)}})},300)},onClose:e=>{i.push(e)}}}static showContentErrors({plugins:e=[],themes:t=[]}){if(!e||!t)return;if(!e.length&&!t.length)return;let n=BDModules.get(e=>e.modal&&e.inner&&!e.hideOnFullscreen)[0],s=BDModules.get(e=>e.header&&e.responsiveWidthMobile&&e.hideOnFullscreen)[0],r=BDModules.get(e=>e.header&&e.responsiveWidthMobile&&e.focusLock)[0];const o=Ce.createElement(`
\n
\n
\n
\n
Content Errors
\n
\n
\n
\n
Plugins
\n
Themes
\n
\n
\n
\n
Name
\n
Message
\n
Error
\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
`);function i(e){const t=Ce.createElement('
');for(const n of e){const e=Ce.createElement(`
\n
${n.name?n.name:n.file}
\n
${n.message}
\n \n
`);t.append(e),n.error&&e.querySelectorAll("a").forEach(e=>e.addEventListener("click",e=>{e.preventDefault(),ke.err("ContentManager",`Error details for ${n.name?n.name:n.file}.`,n.error)}))}return t}const a=[i(e),i(t)];o.querySelectorAll(".tab-bar-item").forEach(e=>e.addEventListener("click",e=>{e.preventDefault();const t=o.querySelector(".tab-bar-item.selected");t&&Ce.removeClass(t,"selected"),Ce.addClass(e.target,"selected");const n=o.querySelector(".scroller");n.innerHTML="",n.append(a[Ce.index(e.target)])})),o.querySelector(".footer button").addEventListener("click",()=>{Ce.addClass(o,"closing"),setTimeout(()=>{o.remove()},300)}),o.querySelector(".bd-backdrop").addEventListener("click",()=>{Ce.addClass(o,"closing"),setTimeout(()=>{o.remove()},300)}),Ce.query("#app-mount").append(o),e.length?o.querySelector(".tab-bar-item").click():o.querySelectorAll(".tab-bar-item")[1].click()}static showChangelogModal(e={}){const t=x.findByProps("push","update","pop","popWithKey"),n=x.findByProps("fixed","improved"),s=x.findByDisplayName("Text"),r=x.findByProps("Child"),o=x.findByProps("Tags","default"),i=x.find(e=>e.defaultProps&&0==e.defaultProps.selectable),l=x.findByProps("defaultRules","parse");if(!(i&&t&&n&&s&&r&&o&&l))return;const{image:c="https://repository-images.githubusercontent.com/105473537/957b5480-7c26-11e9-8401-50fa820cbae5",description:d="",changes:h=[],title:u="BandagedBD",subtitle:p="v"+a,footer:m}=e,g=xe.React.createElement,f=[g("img",{src:c})];d&&f.push(g("p",null,l.parse(d)));for(let e=0;eg("li",null,l.parse(e))));f.push(o)}const b=function(){return g(r.Child,{grow:1,shrink:1},g(o.default,{tag:o.Tags.H4},u),g(s,{size:s.Sizes.SMALL,color:s.Colors.STANDARD,className:n.date},p))},y=()=>{const e=x.find(e=>"Anchor"==e.displayName),n=x.findByProps("anchorUnderlineOnHover")||{anchor:"anchor-3Z-8Bb",anchorUnderlineOnHover:"anchorUnderlineOnHover-2ESHQB"},o=e=>{e.preventDefault(),e.stopPropagation(),t.pop(),xe.joinBD2()},i=e?g(e,{onClick:o},"Join our Discord Server."):g("a",{className:`${n.anchor} ${n.anchorUnderlineOnHover}`,onClick:o},"Join our Discord Server."),a=g(s,{size:s.Sizes.SMALL,color:s.Colors.STANDARD},"Need support? ",i);return g(r.Child,{grow:1,shrink:1},m||a)};return t.push((function(e){return g(i,Object.assign({className:n.container,selectable:!0,onScroll:e=>e,onClose:e=>e,renderHeader:b,renderFooter:y,children:f},e))}))}static showConfirmationModal(e,t,n={}){const s=x.findByProps("openModal","updateModal"),r=x.findByDisplayName("Markdown"),o=x.findByDisplayName("ConfirmModal");if(!s||!o||!r)return ke.alert(e,t);const i=()=>{},{onConfirm:a=i,onCancel:l=i,confirmText:c="Okay",cancelText:d="Cancel",danger:h=!1,key:u}=n;return Array.isArray(t)||(t=[t]),t=t.map(e=>"string"==typeof e?xe.React.createElement(r,null,e):e),s.openModal(n=>xe.React.createElement(o,Object.assign({header:e,red:h,confirmText:c,cancelText:d,onConfirm:a,onCancel:l},n),t),{modalKey:u})}static get removeDa(){return De}}function De(e){return e?e.split(" ").filter(e=>!e.startsWith("da-")).join(" "):e}ke.showToast=ke.suppressErrors(ke.showToast,"Could not show toast."),window.Lightcord.BetterDiscord.Utils=ke;class Me{constructor(){this.panels={}}register(e,t){this.panels[e]=t}getComponent(e,t){return this.panels[e](t)}get items(){return[{text:"BetterDiscord Settings",id:"core"},{text:"Plugins",id:"plugins"},{text:"Themes",id:"themes"},{text:"Custom CSS",id:"customcss"}]}get LCitems(){return[{text:"Lightcord Settings",id:"lightcord"},{text:"RichPresence",id:"status"},{text:"Account Info",id:"accountinfo"}]}get LCDevItems(){let e=[];return window.Lightcord.Settings.devMode?(e.push({section:"DIVIDER"},{section:"HEADER",label:"Lightcord Api"},{text:"Components Preview",id:"lcapipreview"}),e):e}render(e){return[{section:"HEADER",label:"Lightcord"},...this.LCitems.map(t=>({section:t.id,label:t.text,element:this.getComponent(t.id,e)})),...this.LCDevItems.map(t=>t.section?t:{section:t.id,label:t.text,element:this.getComponent(t.id,e)}),{section:"DIVIDER"},{section:"CUSTOM",element:this.getComponent("BDChangelogTitle")},...this.items.map(t=>({section:t.id,label:t.text,element:this.getComponent(t.id,e)})),{section:"DIVIDER"}]}}var Be=new class{injectColoredText(){this.cancelColoredText||xe.MessageComponent&&(this.cancelColoredText=ke.monkeyPatch(xe.MessageComponent,"default",{before:e=>{const t=e.methodArguments[0];if(!t||!t.childrenMessageContent)return;const n=t.childrenMessageContent;if(!n.type||!n.type.type||"MessageContent"!=n.type.type.displayName)return;const s=n.type.type;s.__originalMethod||(n.type.type=function(e){const t=s(e),n=h["bda-gs-7"]&&e.message.colorString||"";return t.props.style={color:n},t},n.type.type.__originalMethod=s,Object.assign(n.type.type,s))}}))}removeColoredText(){let e=BDModules.get(e=>e.markup)[0].markup;document.querySelectorAll("."+e.split(" ")[0]).forEach(e=>{e.style.setProperty("color","")})}},Ne=new class{inject24Hour(){if(this.cancel24Hour)return;const e=new RegExp("([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)"),t=t=>{if(!h["bda-gs-6"])return;const n=t.returnValue.match(e);return n&&4===n.length?"AM"===n[3]?t.returnValue=t.returnValue.replace(n[0],`${"12"===n[1]?"00":n[1].padStart(2,"0")}:${n[2]}`):t.returnValue=t.returnValue.replace(n[0],`${"12"===n[1]?"12":parseInt(n[1])+12}:${n[2]}`):void 0},n=ke.monkeyPatch(xe.TimeFormatter,"calendarFormat",{after:t}),s=ke.monkeyPatch(xe.TimeFormatter,"dateFormat",{after:t});this.cancel24Hour=()=>{n(),s()}}remove24Hour(){this.cancel24Hour&&this.cancel24Hour()}};class Le extends xe.reactComponent{constructor(e){super(e)}render(){return xe.react.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 12 12",style:{width:"18px",height:"18px"}},xe.react.createElement("g",{className:"background",fill:"none",fillRule:"evenodd"},xe.react.createElement("path",{d:"M0 0h12v12H0"}),xe.react.createElement("path",{className:"fill",fill:"#dcddde",d:"M9.5 3.205L8.795 2.5 6 5.295 3.205 2.5l-.705.705L5.295 6 2.5 8.795l.705.705L6 6.705 8.795 9.5l.705-.705L6.705 6"})))}}class Ae extends xe.reactComponent{constructor(e){super(e),this.onClick=this.onClick.bind(this)}render(){let e=BDModules.get(e=>e.toolsContainer)[0],t=BDModules.get(e=>e.container&&e.closeButton&&e.closeButtonBold)[0];return xe.react.createElement("div",{className:"tools-container "+e.toolsContainer},xe.react.createElement("div",{className:"tools "+e.tools},xe.react.createElement("div",{className:t.container},xe.react.createElement("div",{className:"btn-close "+t.closeButton,onClick:this.onClick},xe.react.createElement(Le,null)),xe.react.createElement("div",{className:"esc-text "+t.keybind},"ESC"))))}onClick(){this.props.onClick&&this.props.onClick();const e=document.querySelector("."+BDModules.get(e=>e.closeButton&&e.keybindBold)[0].closeButton.split(" ")[0]);e&&e.click()}}class Pe extends xe.reactComponent{constructor(e){super(e)}render(){return xe.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},this.props.text)}}class Te extends xe.reactComponent{constructor(e){super(e)}render(){return xe.react.createElement("div",{className:"ui-tab-bar-separator margin-top-8 margin-bottom-8"})}}class Re extends xe.reactComponent{constructor(e){super(e)}render(){return xe.react.createElement("div",{className:"ui-tab-bar-header"},this.props.text,this.props.button)}}class Oe extends xe.reactComponent{constructor(e){super(e),this.setInitialState(),this.onClick=this.onClick.bind(this)}setInitialState(){this.state={selected:this.props.selected||!1}}render(){return xe.react.createElement("div",{className:"ui-tab-bar-item"+(this.props.selected?" selected":""),onClick:this.onClick},this.props.text)}onClick(){this.props.onClick&&this.props.onClick(this.props.id)}}class je extends xe.reactComponent{constructor(e){super(e),this.props.server.iconUrl||(this.props.server.iconUrl=this.props.fallback),this.state={imageError:!1,joined:this.props.guildList.includes(this.props.server.identifier)}}render(){const{server:e}=this.props;let t=BDModules.get(e=>e.card&&e.cardPrimary)[0],n=BDModules.get(e=>e.flexChild&&e._horizontalReverse)[0],s=BDModules.get(e=>e.noWrap&&!e.streamerModeEnabled)[0];return xe.react.createElement("div",{className:`${t.card} ${t.cardPrimary} ${BDModules.get(e=>e.marginBottom8)[0].marginBottom8} bd-server-card${e.pinned?" bd-server-card-pinned":""}`},xe.react.createElement("img",{ref:"img",className:"bd-server-image",src:e.iconUrl,onError:this.handleError.bind(this),draggable:!1}),xe.react.createElement("div",{className:n.flexChild+" bd-server-content"},xe.react.createElement("div",{className:n.horizontal+" "+s.noWrap+" bd-server-header"},xe.react.createElement("h5",{className:"h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name"},e.name),xe.react.createElement("h5",{className:"h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count"},e.members," Members")),xe.react.createElement("div",{className:n.horizontal+" "+s.noWrap},xe.react.createElement("div",{className:"scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container"},xe.react.createElement("div",{className:"scroller-2FKFPG scroller bd-server-description"},e.description))),xe.react.createElement("div",{className:"flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer"},xe.react.createElement("div",{className:"flexChild-faoVW3 bd-server-tags",style:{flex:"1 1 auto"}},e.categories.join(", ")),this.state.joined&&xe.react.createElement("button",{type:"button",className:"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN colorGreen-29iAKY",style:{minHeight:"12px",marginTop:"4px",backgroundColor:"#3ac15c"}},xe.react.createElement("div",{className:"ui-button-contents"},"Joined")),e.error&&xe.react.createElement("button",{type:"button",className:"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN disabled-9aF2ug",style:{minHeight:"12px",marginTop:"4px",backgroundColor:"#c13a3a"}},xe.react.createElement("div",{className:"ui-button-contents"},"Error")),!e.error&&!this.state.joined&&xe.react.createElement("button",{type:"button",className:"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN",style:{minHeight:"12px",marginTop:"4px"},onClick:()=>{this.join()}},xe.react.createElement("div",{className:"ui-button-contents"},"Join")))))}handleError(){this.props.server.iconUrl=this.props.fallback,this.setState({imageError:!0})}join(){this.props.join(this)}}class _e extends xe.reactComponent{constructor(e){super(e)}render(){let e=BDModules.get(e=>e.scrollerHorizontal)[0],t=BDModules.get(e=>e.sidebarRegionScroller)[0],n=`${e.scrollerWrap} ${e.scrollerThemed} ${e.themeGhostHairline}${this.props.fade?" "+e.scrollerFade:""}`,s=e.scroller+" scroller";this.props.sidebar&&(s+=` ${t.sidebarRegionScroller} sidebar-region-scroller`),this.props.contentColumn&&(s+=" "+t.contentRegionScroller+" content-region-scroller",n=`${e.scrollerWrap} ${t.contentRegionScrollerWrap} content-region-scroller-wrap ${e.scrollerThemed} ${e.themeGhost} ${e.scrollerTrack}`);const{children:r}=this.props;return xe.react.createElement("div",{key:"scrollerwrap",className:n},xe.react.createElement("div",{key:"scroller",ref:"scroller",className:s},r))}}const $e=_e.prototype.render;Object.defineProperty(_e.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>$e});class Ie extends xe.reactComponent{constructor(e){super(e)}render(){const{sidebar:e,content:t,tools:n}=this.props.children;return xe.react.createElement("div",{className:"standardSidebarView-3F1I7i ui-standard-sidebar-view"},xe.react.createElement("div",{className:"sidebarRegion-VFTUkN sidebar-region"},xe.react.createElement(_e,{key:"sidebarScroller",ref:"sidebarScroller",sidebar:!0,fade:e.fade||!0,dark:e.dark||!0},e.component)),xe.react.createElement("div",{className:"contentRegion-3nDuYy content-region"},xe.react.createElement("div",{className:"contentTransitionWrap-3hqOEW content-transition-wrap"},xe.react.createElement("div",{className:"scrollerWrap-2lJEkd firefoxFixScrollFlex-cnI2ix contentRegionScrollerWrap-3YZXdm content-region-scroller-wrap scrollerThemed-2oenus themeGhost-28MSn0 scrollerTrack-1ZIpsv"},xe.react.createElement("div",{className:"scroller-2FKFPG firefoxFixScrollFlex-cnI2ix contentRegionScroller-26nc1e content-region-scroller scroller",ref:"contentScroller"},xe.react.createElement("div",{className:"contentColumn-2hrIYH contentColumnDefault-1VQkGM content-column default"},t.component),n.component)))))}}class We extends xe.reactComponent{constructor(e){super(e),this.setInitialState(),this.close=this.close.bind(this),this.changeCategory=this.changeCategory.bind(this),this.search=this.search.bind(this),this.searchKeyDown=this.searchKeyDown.bind(this),this.checkConnection=this.checkConnection.bind(this),this.join=this.join.bind(this),this.connect=this.connect.bind(this),this.GuildStore=xe.WebpackModules.findByUniqueProperties(["getGuilds"]),this.AvatarDefaults=xe.WebpackModules.findByUniqueProperties(["getUserAvatarURL","DEFAULT_AVATARS"]),this.InviteActions=xe.WebpackModules.findByUniqueProperties(["acceptInvite"]),this.SortedGuildStore=xe.WebpackModules.findByUniqueProperties(["getSortedGuilds"])}componentDidMount(){this.checkConnection()}setInitialState(){this.state={selectedCategory:-1,title:"Loading...",loading:!0,servers:[],next:null,connection:{state:0,user:null}}}close(){this.props.close()}search(e,t){const n=this;fetch(`${n.endPoint}${e}${e?"&schema=new":"?schema=new"}`,{method:"get"}).then(async e=>{if(200!==e.status)throw await e.text();let s=await e.json(),r=s.results.reduce((e,t)=>(t.joined=!1,e.push(t),e),[]);t||(r=n.state.servers.concat(r));let o=s.size+s.from;s.next="?from="+o,n.state.term&&(s.next+="&term="+n.state.term),n.state.selectedCategory&&(s.next+="&category="+n.categoryButtons[n.state.selectedCategory]),o>=s.total&&(o=s.total,s.next=null);let i=`Showing 1-${o} of ${s.total} results in ${n.categoryButtons[n.state.selectedCategory]}`;n.state.term&&(i+=" for "+n.state.term),n.setState({loading:!1,title:i,servers:r,next:s.next}),t&&(n.refs.sbv.refs.contentScroller.scrollTop=0)}).catch(e=>(console.error(e),n.setState({loading:!1,title:"Failed to load servers. Check console for details"})))}async join(e){if(e.props.pinned)return this.InviteActions.acceptInvite(e.props.invite_code);await fetch(`${this.joinEndPoint}/${e.props.server.identifier}`,{method:"GET",credentials:"include",mode:"cors",headers:{Accept:"application/json","Content-Type":"application/json"}}),e.setState({joined:!0})}connect(){const e=this,t=e.windowOptions;t.x=Math.round(window.screenX+window.innerWidth/2-t.width/2),t.y=Math.round(window.screenY+window.innerHeight/2-t.height/2),e.joinWindow=new(window.require("electron").remote.BrowserWindow)(t);e.joinWindow.webContents.on("did-navigate",(t,n)=>{"https://auth.discordservers.com/info"==n&&(e.joinWindow.close(),e.checkConnection())}),e.joinWindow.loadURL("https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info")}get windowOptions(){return{width:500,height:550,backgroundColor:"#282b30",show:!0,resizable:!1,maximizable:!1,minimizable:!1,alwaysOnTop:!0,frame:!1,center:!1,webPreferences:{nodeIntegration:!1}}}get bdServer(){const e=this.SortedGuildStore.getFlattenedGuildIds(),t=this.AvatarDefaults.DEFAULT_AVATARS;return[xe.react.createElement(je,{server:{name:"Lightcord",online:"100+",members:"300+",categories:["community","programming","support"],description:"Official Lightcord server for support etc",identifier:"705908350218666117",iconUrl:"https://github.com/lightcord.png",nativejoin:!0,invite_code:"7eFff2A",pinned:!0},pinned:!0,join:this.join,guildList:e,fallback:t[Math.floor(5*Math.random())]}),xe.react.createElement(je,{server:{name:"BetterDiscord",online:"30000+",members:"70000+",categories:["community","programming","support"],description:"Official BetterDiscord server for support etc",identifier:"86004744966914048",iconUrl:"https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp",nativejoin:!0,invite_code:"0Tmfo5ZbORCRqbAd",pinned:!0},pinned:!0,join:this.join,guildList:e,fallback:t[Math.floor(5*Math.random())]})]}get endPoint(){return"https://search.discordservers.com"}get joinEndPoint(){return"https://j.discordservers.com"}get connectEndPoint(){return"https://join.discordservers.com/connect"}async checkConnection(){const e=this;try{const t=await fetch("https://auth.discordservers.com/info",{method:"GET",credentials:"include",mode:"cors",headers:{Accept:"application/json","Content-Type":"application/json"}}),n=await t.text();if(!n)return void e.setState({title:"Not connected to discordservers.com!",loading:!0,selectedCategory:-1,connection:{state:1,user:null}});const s=JSON.parse(n);e.setState({selectedCategory:0,connection:{state:2,user:s}}),e.search("",!0)}catch(t){console.error(t),e.setState({title:"Not connected to discordservers.com!",loading:!0,selectedCategory:-1,connection:{state:1,user:null}})}}render(){return xe.react.createElement("div",{id:"pubslayerroot"},xe.react.createElement("div",{id:"pubslayer"},xe.react.createElement(Ie,{ref:"sbv"},this.component)))}get component(){return{sidebar:{component:this.sidebar},content:{component:this.content},tools:{component:xe.react.createElement(Ae,{key:"pt",ref:"tools",onClick:this.close})}}}get sidebar(){return xe.react.createElement("div",{className:"sidebar",key:"ps"},xe.react.createElement("div",{className:"ui-tab-bar SIDE"},xe.react.createElement("div",{className:"ui-tab-bar-header",style:{fontSize:"16px"}},"Public Servers"),xe.react.createElement(Te,null),this.searchInput,xe.react.createElement(Te,null),xe.react.createElement(Re,{text:"Categories"}),this.categoryButtons.map((e,t)=>xe.react.createElement(Oe,{id:t,onClick:this.changeCategory,key:t,text:e,selected:this.state.selectedCategory===t})),xe.react.createElement(Te,null),this.footer,this.connection))}get searchInput(){return xe.react.createElement("div",{className:"ui-form-item"},xe.react.createElement("div",{className:"ui-text-input flex-vertical",style:{width:"172px",marginLeft:"10px"}},xe.react.createElement("input",{ref:"searchinput",onKeyDown:this.searchKeyDown,onChange:()=>{},type:"text",className:"input default",placeholder:"Search...",maxLength:"50"})))}searchKeyDown(e){const t=this;if(t.state.loading||13!==e.which)return;t.setState({loading:!0,title:"Loading...",term:e.target.value});let n="?term="+e.target.value;0!==t.state.selectedCategory&&(n+="&category="+t.categoryButtons[t.state.selectedCategory]),t.search(n,!0)}get categoryButtons(){return["All","FPS Games","MMO Games","Strategy Games","MOBA Games","RPG Games","Tabletop Games","Sandbox Games","Simulation Games","Music","Community","Language","Programming","Other"]}changeCategory(e){const t=this;t.state.loading||(t.refs.searchinput.value="",t.setState({loading:!0,selectedCategory:e,title:"Loading...",term:null}),0!==e?t.search("?category="+t.categoryButtons[e],!0):t.search("",!0))}get content(){const e=this,t=this.SortedGuildStore.getFlattenedGuildIds(),n=this.AvatarDefaults.DEFAULT_AVATARS;if(1===e.state.connection.state)return e.notConnected;let s=BDModules.get(e=>e.contentColumnDefault)[0];return[xe.react.createElement("div",{ref:"content",key:"pc",className:s.contentColumn+" "+s.contentColumn+" content-column default"},xe.react.createElement(Pe,{text:e.state.title}),e.bdServer,e.state.servers.map(s=>xe.react.createElement(je,{key:s.identifier,server:s,join:e.join,guildList:t,fallback:n[Math.floor(5*Math.random())]})),e.state.next&&xe.react.createElement("button",{type:"button",onClick:()=>{e.state.loading||(e.setState({loading:!0}),e.search(e.state.next,!1))},className:"ui-button filled brand small grow",style:{width:"100%",marginTop:"10px",marginBottom:"10px"}},xe.react.createElement("div",{className:"ui-button-contents"},e.state.loading?"Loading":"Load More")),e.state.servers.length>0&&xe.react.createElement(Pe,{text:e.state.title}))]}get notConnected(){let e=BDModules.get(e=>e.contentColumnDefault)[0];return[xe.react.createElement("div",{key:"ncc",ref:"content",className:e.contentColumn+" "+e.contentColumn+" content-column default"},xe.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},"Not connected to discordservers.com!",xe.react.createElement("button",{onClick:this.connect,type:"button",className:"ui-button filled brand small grow",style:{display:"inline-block",minHeight:"18px",marginLeft:"10px",lineHeight:"14px"}},xe.react.createElement("div",{className:"ui-button-contents"},"Connect"))),this.bdServer)]}get footer(){return xe.react.createElement("div",{className:"ui-tab-bar-header"},xe.react.createElement("a",{href:"https://discordservers.com",target:"_blank"},"Discordservers.com"))}get connection(){const{connection:e}=this.state;return 2!==e.state?xe.react.createElement("span",null):xe.react.createElement("span",null,xe.react.createElement(Te,null),xe.react.createElement("span",{style:{color:"#b9bbbe",fontSize:"10px",marginLeft:"10px"}},"Connected as: ",`${e.user.username}#${e.user.discriminator}`),xe.react.createElement("div",{style:{padding:"5px 10px 0 10px"}},xe.react.createElement("button",{style:{width:"100%",minHeight:"20px"},type:"button",className:"ui-button filled brand small grow"},xe.react.createElement("div",{className:"ui-button-contents",onClick:this.connect},"Reconnect"))))}}function Fe(){return(Fe=Object.assign||function(e){for(var t=1;tt=e);Ge[e]=n;const s=[];for(let t of Ke.badges)t.defaultUsers.includes(e)&&s.push(t);const r=await new Promise(t=>{if(!h["lightcord-5"])return t([]);Ve.push([e,t]),setTimeout(()=>{let e=Ve;0!==e.length&&(Ve=[],Ze(Xe.badges,"POST",JSON.stringify(e.map(e=>e[0]))).then(async t=>{200!==t.status&&e.forEach(e=>{e[1]([])});const n=await t.json();for(let t of n){e.find(e=>e[0]===t.user_id)[1](t.badges)}}).catch(t=>{t instanceof Ye||console.error(t),e.forEach(e=>{e[1]([])})}))},0)});for(let e of r)Ke.badges.find(t=>t.id===e)&&(s.find(t=>t.id===e)||s.push(Ke.badges.find(t=>t.id===e)));return this.cache={badges:Object.assign(this.cache.badges,{[e]:s})},setTimeout(()=>{delete this.cache.badges[e]},6e5),t(s),delete Ge[e],s}};const Ze=function(e,t,n){return h["lightcord-5"]?j()(`${Ke.SERVER_URL}/api/v1${e}`,{method:t,headers:{CLIENT:"Lightcord",Authorization:window.Lightcord.Api.Authorization||"None::Anonymous"},...n?{body:n}:{}}):Promise.reject(new Ye("The current settings blocked the request."))};class Ye extends Error{constructor(){super(...arguments),this.name="LightcordError"}}const Ke={SERVER_URL:"https://lightcord.deroku.xyz",badges:[{name:"Lightcord Bug Hunter",id:"f04698f5-816b-41e3-bd01-92291193d7a5",defaultUsers:["696481194443014174","696003456611385396"],scopes:[],component:ze,href:"https://github.com/lightcord/lightcord/wiki/badges#bug_hunter"},{name:"Buffoon",id:"06904d31-65b4-41ec-a50c-8658bbd1af96",defaultUsers:["389016895543705602","664600134528663565","625350657829896224"],scopes:[],component:Ue,href:"https://youtu.be/EJtb6z-dlT8?t=145"}]},Xe={badges:"/users/badges"};function Qe(){return(Qe=Object.assign||function(e){for(var t=1;te.layers&&e.layer).layers)];const t=document.querySelector("."+e);if(!t)return!1;const n=Lightcord.Api.Utils.FindReact(t,1);if(!n)return t;this.ReactInstance=n;let s=n.render;n.render=()=>{let e=s.call(n),t=e.props.children[1].props.className.split(" ");return t.push("Layers"),t.push("injected"),e.props.children[1].props.className=t.join(" "),this.layers.forEach(t=>{e.props.children[1].props.children.push(t[1])}),e},n.forceUpdate()}createLayer(e,t={}){let n=qe(),s=null;return this.layers.push([n,React.createElement(nt,Qe({},t,{getLayer:e=>{s=e},key:n,id:n,remove:()=>{let e=this.layers.findIndex(e=>e[0]===n);-1!==e&&(this.layers.splice(e,1),s=null,this.ReactInstance&&this.ReactInstance.forceUpdate(),this.inject())}}),e)]),this.ReactInstance&&this.ReactInstance.forceUpdate(),this.inject(),{remove:()=>{if(s)s.remove();else{let e=this.layers.findIndex(e=>e[0]===n);if(-1===e)return;this.layers.splice(e,1),s=null,this.ReactInstance&&this.ReactInstance.forceUpdate(),this.inject()}}}}};let tt;class nt extends React.Component{constructor(){super(...arguments),this.state={animation:new this.modules[0].default.Value(0)},this.props.getLayer(this),this.keydown=this.keydown.bind(this)}keydown(e){27===e.which&&this.remove()}get modules(){return tt||(tt=[xe.WebpackModules.find(e=>e.default&&e.default.Value&&e.default.div)])}componentWillUnmount(){window.removeEventListener("keydown",this.keydown)}componentDidMount(e){window.addEventListener("keydown",this.keydown)}remove(){this.props.remove()}componentWillEnter(e){this.modules[0].default.timing(this.state.animation,{toValue:1,duration:100}).start(e)}componentWillLeave(e){this.modules[0].default.timing(this.state.animation,{toValue:0,duration:100}).start(e)}render(){let e=this.state.animation.interpolate({inputRange:[0,1],outputRange:[1.07,1]}),t={opacity:this.state.animation,transform:[{scale:e}]},n=this.modules[0].default.div;return React.createElement(n,{className:[__SECRET_EMOTION__.css({backgroundColor:"var(--background-primary)",position:"absolute",top:0,right:0,bottom:0,left:0,display:"flex",overflow:"hidden",WebkitBoxOrient:"vertical",WebkitBoxDirection:"normal",msFlexDirection:"column",flexDirection:"column",zIndex:101}),"win32"===process.platform?__SECRET_EMOTION__.css({top:"-22px",paddingTop:"22px"}):null,...this.props.className?this.props.className.split(" "):[]].filter(e=>e).join(" ")||null,style:t},this.props.children(()=>{this.remove()}))}}nt.defaultProps={id:null,children:null};var st=new class{constructor(){this._appendButton=this._appendButton.bind(this),window.Lightcord.BetterDiscord.V2_PublicServers=this}render(){et.createLayer(e=>xe.react.createElement(We,{rootId:"pubslayerroot",close:e}))}get button(){const e=Ce.createElement(`
`);h["bda-gs-1"]||(e.style.display="none");const t=Ce.createElement(`
public
`);return t.addEventListener("click",()=>{this.render()}),e.append(t),e}_appendButton(){let[e]=[ke.removeDa(BDModules.get(e=>e.downloadProgress&&e.tutorialContainer)[0].tutorialContainer)];if(Ce.query("#bd-pub-li"))return;const t=Ce.query(`div.${e} > div`);Ce.after(t,this.button)}addButton(){if(this.guildPatch)return;const e=x.find(e=>e.default&&"NavigableGuilds"==e.default.displayName),t=x.findByDisplayName("Guilds");e||t||ke.warn("PublicServer","Can't find GuildList component"),this.guildPatch=ke.monkeyPatch(e||t.prototype,e?"default":"render",{after:this._appendButton}),this._appendButton()}removeButton(){this.guildPatch(),delete this.guildPatch;const e=Ce.query("#bd-pub-li");e&&e.remove()}};var rt=new class{start(){Ce.addStyle("VoiceMode","\n .container-2Rl01u {\n display: none!important;\n }\n\n .chat-3bRxxu {\n display: none!important;\n }\n\n .sidebar-2K8pFh {\n flex-grow: 1!important;\n }\n")}stop(){Ce.removeStyle("VoiceMode")}};const ot=new RegExp("^(?!da-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$");var it=new class{constructor(){window.Lightcord.BetterDiscord.ClassNormalizer=this}stop(){this.hasPatched&&(this.unpatchClassModules(x.findAll(this.moduleFilter.bind(this))),this.revertElement(document.querySelector("#app-mount")),this.hasPatched=!1)}start(){this.hasPatched||(this.patchClassModules(x.findAll(this.moduleFilter.bind(this))),this.normalizeElement(document.querySelector("#app-mount")),this.hasPatched=!0,this.patchDOMMethods())}patchClassModules(e){for(const t of e)this.patchClassModule("da",t)}unpatchClassModules(e){for(const t of e)this.unpatchClassModule("da",t)}shouldIgnore(e){return!isNaN(e)||(!!(e.endsWith("px")||e.endsWith("ch")||e.endsWith("em")||e.endsWith("ms"))||(!!e.startsWith("layerContainer-")||(!(!e.startsWith("#")||7!=e.length&&4!=e.length)||!(!e.includes("calc(")&&!e.includes("rgba")))))}moduleFilter(e){if("object"!=typeof e||Array.isArray(e))return!1;if(e.__esModule)return!1;if(!Object.keys(e).length)return!1;for(const t in e){const n=e[t];if("string"!=typeof n)return!1;if(!this.shouldIgnore(n)){if(1===n.split("-").length)return!1;if(!ot.test(n.split(" ")[0]))return!1}}return!0}patchClassModule(e,t){for(const n in t){const s=t[n];if(this.shouldIgnore(s))continue;const r=s.split(" ");for(const s of r){const r=s.match(ot);if(!r||!r.length||r.length<2)continue;const o=r[1].split("-").map((e,t)=>t?e[0].toUpperCase()+e.slice(1):e).join("");t[n]+=` ${e}-${o}`}}}unpatchClassModule(e,t){for(const n in t){const s=t[n];if(this.shouldIgnore(s))continue;let r="";const o=s.split(" ");for(const t of o)t.startsWith(e+"-")||(r+=" "+t);t[n]=r.trim()}}normalizeElement(e){if(!(e instanceof Element))return;const t=e.classList;for(let n=0,s=t.length;nt?e[0].toUpperCase()+e.slice(1):e).join("");e.classList.add("da-"+s)}for(const t of e.children)this.normalizeElement(t)}revertElement(e){if(!(e instanceof Element))return;e.children&&e.children.length&&this.revertElement(e.children[0]),e.nextElementSibling&&this.revertElement(e.nextElementSibling);const t=e.classList,n=[];for(let e=0;ee.layer&&"string"==typeof e.layer&&e.disabledPointerEvents)[0],BDModules.get(e=>e.menu)[0]];setTimeout((function(){if(!s||!n.layer)return console.log(s,n.layer);let r=Ce.query("."+ke.removeDa(s.menu));if(!r){const t=Ce.query("#app-mount > ."+ke.removeDa(n.layerContainer)),o=Ce.createElement(`
`);r=Ce.createElement(`
`),o.append(r),t.append(o),o.style.top=e.clientY+"px",o.style.left=e.clientX+"px",o.setAttribute("role","menu"),o.setAttribute("tabindex","-1"),o.id="bd-copy-selector-context",o.setAttribute("aria-label","Copy Selector Actions");const i=BDModules.get(e=>e.scrollerWrap)[0],a=Ce.createElement(`
`),l=Ce.createElement(`
`);a.append(l),r.append(a);const c=function(e){e.keyCode&&27!==e.keyCode||(o.remove(),document.removeEventListener("click",c),document.removeEventListener("contextmenu",c),document.removeEventListener("keyup",c))};document.addEventListener("click",c),document.addEventListener("contextmenu",c),document.addEventListener("keyup",c)}const o=r.parentElement,i=r.childNodes[0].childNodes[0],a=Ce.createElement('
'),l=Ce.createElement(``);if(l.append(Ce.createElement(`
Copy Selector
`)),l.addEventListener("click",()=>{xe.NativeModule.copy(t),o.style.display="none"}),l.addEventListener("mouseover",e=>{let t=Ce.queryAll("div[role=menuitem]."+ke.removeDa(s.focused));t&&t.forEach(e=>e.classList.remove(s.focused)),l.classList.add(s.focused)}),l.addEventListener("mouseout",e=>{l.classList.remove(s.focused)}),a.append(l),i.childNodes.length){const e=Ce.createElement(``);i.append(e)}i.append(a),o.clientHeight"."+e).join(""));else{for(var n=1,s=e;s.previousElementSibling;s=s.previousElementSibling,n++);t.unshift(e.tagName.toLowerCase()+("string"==typeof e.className&&e.className||"").split(" ").filter(e=>!!e).map(e=>"."+e).join("")+":nth-child("+n+")")}e=e.parentNode}return t.join(" > ")}(e)}};const lt=xe.React;class ct extends lt.Component{constructor(e){super(e),this.state={checked:this.props.checked},this.onChange=this.onChange.bind(this),this.switch=lt.createElement(Lightcord.Api.Components.inputs.Switch,{onChange:this.onChange,value:this.state.checked})}onChange(e){this.props.disabled||(this.props.onChange(e),this.setState({checked:e}))}render(){return this.switch}}let dt=[];function ht(e){let t=dt.find(t=>t.startsWith(e+"-"));return t||(t=BDModules.get(t=>t[e])[0][e],dt.push(t),t)}class ut extends xe.reactComponent{constructor(e){super(e),this.onChange=this.onChange.bind(this)}onChange(){this.props.checked=!this.props.checked,this.props.onChange(this.props.id,this.props.checked)}render(){let{text:e,info:t}=this.props.data;return dt.find(e=>e.startsWith("beta-"))||dt.push(BDModules.get(e=>e.beta&&!e.container&&!e.userSettingsVoice)[0].beta),this.props.data.experimental&&(t=[t,React.createElement("sup",{className:ht("beta")},"(EXPERIMENTAL)")]),xe.react.createElement("div",{className:"ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item"},xe.react.createElement("div",{className:"ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap"},xe.react.createElement("h3",{key:"title",className:"ui-form-title h3 margin-reset margin-reset ui-flex-child"},e),xe.react.createElement(ct,{key:"switch",onChange:this.onChange,checked:this.props.checked})),xe.react.createElement("div",{className:"ui-form-text style-description margin-top-4",style:{flex:"1 1 auto"}},t))}}class pt extends xe.reactComponent{constructor(e){super(e)}render(){const{title:e,settings:t,button:n}=this.props,s=n?xe.react.createElement("button",{key:"title-button",className:"bd-pfbtn",onClick:n.onClick},n.title):null;return[xe.react.createElement(Pe,{text:e}),s,t.map(e=>xe.react.createElement(ut,{id:e.id,key:e.id,data:e,checked:h[e.id],onChange:(e,t)=>{this.props.onChange(e,t)}}))]}}let mt=BDModules.get(e=>e.marginTop60)[0];class gt extends React.Component{render(){return mt||(mt=BDModules.get(e=>e.marginTop60)[0]),React.createElement("div",{className:mt.marginTop60})}}class ft extends xe.reactComponent{constructor(e){super(e)}render(){return this.props.sections.map((e,t)=>[0!==t?xe.react.createElement(gt,{}):null,xe.react.createElement(pt,Object.assign({},e,{onChange:this.props.onChange}))])}}class bt extends xe.reactComponent{constructor(e){super(e),this.onClick=this.onClick.bind(this),this.setInitialState()}setInitialState(){this.state={checked:this.props.checked||!1}}render(){return xe.react.createElement("li",null,xe.react.createElement("div",{className:"checkbox "+BDModules.get(e=>e.checkboxElement)[0].checkbox,onClick:this.onClick},xe.react.createElement("div",{className:"checkbox-inner "+BDModules.get(e=>e.checkboxInner)[0].checkboxInner},xe.react.createElement("input",{className:BDModules.get(e=>e.checkboxElement)[0].checkboxElement,checked:this.state.checked,onChange:()=>{},type:"checkbox"}),xe.react.createElement("span",null)),xe.react.createElement("span",null,this.props.text)))}onClick(){this.props.onChange(this.props.id,!this.state.checked),this.setState({checked:!this.state.checked})}}class yt extends xe.reactComponent{constructor(e){super(e);this.onClick=this.onClick.bind(this),this.updateCss=this.updateCss.bind(this),this.saveCss=this.saveCss.bind(this),this.onChange=this.onChange.bind(this)}componentDidMount(){Ce.addClass(Ce.query("#app-mount"),"bd-detached-editor"),xe.editorDetached=!0,this.editor=ace.edit("bd-customcss-editor-detached"),this.editor.setTheme("ace/theme/discord"),this.editor.session.setMode("ace/mode/css"),this.editor.setShowPrintMargin(!1),this.editor.setFontSize(14),this.editor.on("change",()=>{h["bda-css-0"]&&(this.saveCss(),this.updateCss())})}componentWillUnmount(){Ce.removeClass(Ce.query("#app-mount"),"bd-detached-editor"),xe.editorDetached=!1,this.editor.destroy()}updateLineCount(){const e=this.refs.editor.value.split("\n").length;e!=this.props.lines&&(this.refs.lines.textContent=Array.from(new Array(e),(e,t)=>t+1).join(".\n")+".",this.props.lines=e)}get options(){return{lineNumbers:!0,mode:"css",indentUnit:4,theme:"material",scrollbarStyle:"simple"}}get css(){const e=L.getBDData("bdcustomcss");let t="";return e&&""!==e&&(t=Buffer.from(e,"base64").toString("utf8")),t}get root(){const e=Ce.query("#bd-customcss-detach-container");return e||(this.injectRoot()?this.detachedRoot:null)}injectRoot(){const e=Ce.query(".app, ."+ke.removeDa(BDModules.get(e=>e.app&&e.layers)[0].app));return!!e&&(Ce.insertAfter(Ce.createElement('
'),e),!0)}render(){const e=this;return xe.react.createElement("div",{className:"bd-detached-css-editor",id:"bd-customcss-detach-editor"},xe.react.createElement("div",{id:"bd-customcss-innerpane"},xe.react.createElement("div",{className:"editor-wrapper"},xe.react.createElement("div",{id:"bd-customcss-editor-detached",className:"editor",ref:"editor"},e.css)),xe.react.createElement("div",{id:"bd-customcss-attach-controls"},xe.react.createElement("ul",{className:"checkbox-group"},xe.react.createElement(bt,{id:"live-update",text:"Live Update",onChange:e.onChange,checked:h["bda-css-0"]})),xe.react.createElement("div",{id:"bd-customcss-detach-controls-button"},xe.react.createElement("button",{style:{borderRadius:"3px 0 0 3px",borderRight:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{e.onClick("update")}},"Update"),xe.react.createElement("button",{style:{borderRadius:"0",borderLeft:"1px solid #2d2d2d",borderRight:"1px solid #2d2d2d"},className:"btn btn-primary",onClick:()=>{e.onClick("save")}},"Save"),xe.react.createElement("button",{style:{borderRadius:"0 3px 3px 0",borderLeft:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{e.onClick("attach")}},"Attach"),xe.react.createElement("span",{style:{fontSize:"10px",marginLeft:"5px"}},"Unsaved changes are lost on attach")))))}onChange(e,t){switch(e){case"live-update":h["bda-css-0"]=t,ts.saveSettings()}}onClick(e){const t=this;switch(e){case"attach":Ce.query("#editor-detached")&&t.props.attach(),xe.reactDom.unmountComponentAtNode(t.root),t.root.remove();break;case"update":t.updateCss();break;case"save":t.saveCss()}}updateCss(){Ce.removeStyle("customcss"),Ce.addStyle("customcss",this.editor.session.getValue())}saveCss(){L.setBDData("bdcustomcss",Buffer.from(this.editor.session.getValue(),"utf-8").toString("base64"))}}class vt extends xe.reactComponent{constructor(e){super(e);this.props.lines=0,this.setInitialState(),this.attach=this.attach.bind(this),this.detachedEditor=xe.react.createElement(yt,{attach:this.attach}),this.onClick=this.onClick.bind(this),this.updateCss=this.updateCss.bind(this),this.saveCss=this.saveCss.bind(this),this.detach=this.detach.bind(this)}setInitialState(){this.state={detached:this.props.detached||xe.editorDetached}}componentDidMount(){this.editor=ace.edit("bd-customcss-editor"),this.editor.setTheme("ace/theme/discord"),this.editor.session.setMode("ace/mode/css"),this.editor.setShowPrintMargin(!1),this.editor.setFontSize(14),this.editor.on("change",()=>{h["bda-css-0"]&&(this.saveCss(),this.updateCss())})}componentWillUnmount(){this.editor.destroy()}componentDidUpdate(e,t){const n=this;t.detached&&!n.state.detached&&xe.reactDom.unmountComponentAtNode(n.detachedRoot)}codeMirror(){}get options(){return{lineNumbers:!0,mode:"css",indentUnit:4,theme:"material",scrollbarStyle:"simple"}}get css(){const e=L.getBDData("bdcustomcss");let t="";return e&&""!==e&&(t=Buffer.from(e,"base64").toString("utf8")),t}updateLineCount(){const e=this.refs.editor.value.split("\n").length;e!=this.props.lines&&(this.refs.lines.textContent=Array.from(new Array(e),(e,t)=>t+1).join(".\n")+".",this.props.lines=e)}render(){const e=this,{detached:t}=e.state;return[t&&xe.react.createElement("div",{id:"editor-detached"},xe.react.createElement(Pe,{text:"Custom CSS Editor"}),xe.react.createElement("h3",null,"Editor Detached"),xe.react.createElement("button",{className:"btn btn-primary",onClick:()=>{e.attach()}},"Attach")),!t&&xe.react.createElement("div",null,xe.react.createElement(Pe,{text:"Custom CSS Editor"}),xe.react.createElement("div",{className:"editor-wrapper"},xe.react.createElement("div",{id:"bd-customcss-editor",className:"editor",ref:"editor"},e.css)),xe.react.createElement("div",{id:"bd-customcss-attach-controls"},xe.react.createElement("ul",{className:"checkbox-group"},xe.react.createElement(bt,{id:"live-update",text:"Live Update",onChange:this.onChange,checked:h["bda-css-0"]})),xe.react.createElement("div",{id:"bd-customcss-detach-controls-button"},xe.react.createElement("button",{style:{borderRadius:"3px 0 0 3px",borderRight:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{e.onClick("update")}},"Update"),xe.react.createElement("button",{style:{borderRadius:"0",borderLeft:"1px solid #2d2d2d",borderRight:"1px solid #2d2d2d"},className:"btn btn-primary",onClick:()=>{e.onClick("save")}},"Save"),xe.react.createElement("button",{style:{borderRadius:"0 3px 3px 0",borderLeft:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{e.onClick("detach")}},"Detach"),xe.react.createElement("span",{style:{fontSize:"10px",marginLeft:"5px"}},"Unsaved changes are lost on detach"),xe.react.createElement("div",{className:"help-text"},"Press ",xe.react.createElement("code",{className:"inline"},"ctrl"),"+",xe.react.createElement("span",{className:"inline"},",")," with the editor focused to access the editor's settings."))))]}onClick(e){const t=this;switch(e){case"update":t.updateCss();break;case"save":t.saveCss();break;case"detach":t.detach()}}onChange(e,t){switch(e){case"live-update":h["bda-css-0"]=t,ts.saveSettings()}}updateCss(){Ce.removeStyle("customcss"),Ce.addStyle("customcss",this.editor.session.getValue())}saveCss(){L.setBDData("bdcustomcss",Buffer.from(this.editor.session.getValue(),"utf-8").toString("base64"))}detach(){this.setState({detached:!0});const e=this.detachedRoot;e?xe.reactDom.render(this.detachedEditor,e):console.log("FAILED TO INJECT ROOT: .app")}get detachedRoot(){const e=Ce.query("#bd-customcss-detach-container");return e||(this.injectDetachedRoot()?this.detachedRoot:null)}injectDetachedRoot(){const e=Ce.query(".app, ."+ke.removeDa(BDModules.get(e=>e.app&&e.layers)[0].app));return!!e&&(Ce.insertAfter(Ce.createElement('
'),e),!0)}attach(){this.setState({detached:!1})}}class wt extends xe.reactComponent{constructor(e){super(e),this.state={hasError:!1}}componentDidCatch(){this.setState({hasError:!0})}render(){return this.state.hasError?xe.react.createElement("div",{className:"react-error"},"Component Error"):this.props.children}}const Ct=wt.prototype.render;Object.defineProperty(wt.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>Ct});class Et extends xe.reactComponent{constructor(e){super(e)}static get displayName(){return"ContentColumn"}render(){let e=this.props.title?xe.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},this.props.title):null;return[e,this.props.children]}}class St extends xe.reactComponent{constructor(e){super(e)}render(){return xe.react.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"#dcddde",className:"bd-reload "+this.props.className,onClick:this.props.onClick,style:{width:this.props.size||"24px",height:this.props.size||"24px"}},xe.react.createElement("path",{d:"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"}),xe.react.createElement("path",{fill:"none",d:"M0 0h24v24H0z"}))}}const xt=xe.React;class kt extends xt.Component{render(){const e=this.props.size||"24px";return xt.createElement("svg",{className:this.props.className||"",viewBox:"0 0 24 24",fill:"var(--text-normal)",style:{width:e,height:e},onClick:this.props.onClick},xt.createElement("path",{d:"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"}),xt.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}))}}const Dt=xe.React;class Mt extends Dt.Component{render(){const e=this.props.size||"24px";return Dt.createElement("svg",{className:this.props.className||"",fill:"var(--text-normal)",viewBox:"0 0 24 24",style:{width:e,height:e},onClick:this.props.onClick},Dt.createElement("path",{fill:"none",d:"M0 0h24v24H0V0z"}),Dt.createElement("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z"}),Dt.createElement("path",{fill:"none",d:"M0 0h24v24H0z"}))}}const Bt=xe.React,Nt=xe.anchorClasses;class Lt extends xe.reactComponent{constructor(e){super(e),this.onChange=this.onChange.bind(this),this.showSettings=this.showSettings.bind(this),this.setInitialState(),this.hasSettings=this.props.addon.plugin&&"function"==typeof this.props.addon.plugin.getSettingsPanel,this.settingsPanel="",this.edit=this.edit.bind(this),this.delete=this.delete.bind(this),this.reload=this.reload.bind(this)}setInitialState(){this.state={checked:this.props.enabled,settings:!1,reloads:0,trusted:!1}}showSettings(){this.hasSettings&&this.setState({settings:!0})}closeSettings(){this.panelRef.current.innerHTML="",this.setState({settingsOpen:!1})}componentDidUpdate(){this.state.settings&&("object"==typeof this.settingsPanel&&this.refs.settingspanel.appendChild(this.settingsPanel),h["fork-ps-3"]&&setImmediate(()=>{const e=this.refs.cardNode,t=e.closest('div[class*="contentRegionScroller-"]');if(!((e,t)=>{if(!e)return console.error(new Error("Container is undefined.")),!1;const n=e.scrollTop,s=n+e.clientHeight,r=t.offsetTop,o=r+t.clientHeight;return rs})(t,e))return;const n=Ce.offset(e),s=Ce.offset(t),r=t.scrollTop,o=n.top-s.top+t.scrollTop-30;Ce.animate({duration:300,update:function(e){t.scrollTop=o>r?r+e*(o-r):r-e*(r-o)}})}))}getString(e){return e?"string"==typeof e?e:e.toString():"???"}get settingsComponent(){try{this.settingsPanel=this.props.addon.plugin.getSettingsPanel()}catch(e){ke.err("Plugins","Unable to get settings panel for "+this.name+".",e)}return xe.react.createElement("div",{className:"bd-card bd-addon-card settings-open ui-switch-item",ref:"cardNode"},xe.react.createElement("div",{style:{float:"right",cursor:"pointer"},onClick:()=>{this.refs.settingspanel.innerHTML="",this.setState({settings:!1})}},xe.react.createElement(Le,null)),"object"==typeof this.settingsPanel&&xe.react.createElement("div",{id:"plugin-settings-"+this.name,className:"plugin-settings",ref:"settingspanel"}),"object"!=typeof this.settingsPanel&&xe.react.createElement("div",{id:"plugin-settings-"+this.name,className:"plugin-settings",ref:"settingspanel",dangerouslySetInnerHTML:{__html:this.settingsPanel}}))}buildTitle(e,t,n){const s="{{name}} v{{version}} by {{author}}".split(/({{[A-Za-z]+}})/),r=s.findIndex(e=>"{{name}}"==e);r&&(s[r]=Bt.createElement("span",{className:"name bda-name"},e));const o=s.findIndex(e=>"{{version}}"==e);r&&(s[o]=Bt.createElement("span",{className:"version bda-version"},t));const i=s.findIndex(e=>"{{author}}"==e);if(r){const e={className:"author bda-author"};(n.link||n.id)&&(e.className+=` ${Nt.anchor} ${Nt.anchorUnderlineOnHover}`,e.target="_blank",n.link&&(e.href=n.link),n.id&&(e.onClick=()=>{xe.LayerStack.popLayer(),xe.openDM(n.id)})),s[i]=Bt.createElement(n.link||n.id?"a":"span",e,n.name)}return s.flat()}makeLink(e,t){const n={className:"bda-link bda-link-website",target:"_blank"};return"string"==typeof t&&(n.href=t),"function"==typeof t&&(n.onClick=e=>{e.preventDefault(),e.stopPropagation(),t()}),xe.react.createElement("a",n,e)}makeButton(e,t,n){return Bt.createElement(V,{color:"black",side:"top",text:e},Bt.createElement("div",{className:"bd-addon-button",onClick:n},t))}componentWillUnmount(){this.unmounted=!0}get links(){const e=[],t=this.props.addon;return t.website&&e.push(this.makeLink("Website",t.website)),t.source&&e.push(this.makeLink("Source",t.source)),t.invite&&e.push(this.makeLink("Support Server",()=>{const e=/\.gg\/(.*)$/;let n=t.invite;e.test(n)&&(n=n.match(e)[1]),xe.LayerStack.popLayer(),xe.InviteActions.acceptInviteAndTransitionToInviteChannel(n)})),t.donate&&e.push(this.makeLink("Donate",t.donate)),t.patreon&&e.push(this.makeLink("Patreon",t.patreon)),e}get footer(){const e=this.links;return(e.length||this.hasSettings)&&xe.react.createElement("div",{className:"bd-card-footer bda-footer"},xe.react.createElement("span",{className:"bd-addon-links bda-links"},...e.map((t,n)=>n{this.unmounted||this.setState({isTrusted:!e.suspect||"suspect"})},()=>{}))),xe.react.createElement("div",{className:"bd-card bd-addon-card settings-closed ui-switch-item",style:n},xe.react.createElement("div",{className:"bd-addon-header bda-header"},xe.react.createElement("div",{className:"bd-card-title bda-header-title"},this.buildTitle(this.name,this.version,{name:this.author,id:e,link:t})),xe.react.createElement("div",{className:"bd-addon-controls bda-controls"},this.props.edit&&this.makeButton("Edit",Bt.createElement(kt,{className:"bd-icon"}),this.edit),this.props.remove&&this.makeButton("Delete",Bt.createElement(Mt,{className:"bd-icon"}),this.delete),this.props.reload&&this.makeButton("Reload",Bt.createElement(St,{className:"bd-icon"}),this.reload),Bt.createElement(ct,{onChange:this.onChange,checked:this.state.checked}))),xe.react.createElement("div",{className:"bd-scroller-wrap bda-description-wrap scroller-wrap fade"},xe.react.createElement("div",{className:"bd-scroller bd-addon-description bda-description scroller"},this.description)),this.footer)}}const At=Lt.prototype.render;Object.defineProperty(Lt.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>At});const Pt=xe.React;class Tt extends Pt.Component{render(){const e=this.props.size||"16px";return Pt.createElement("svg",{className:this.props.className||"",fill:"var(--text-normal)",viewBox:"0 0 24 24",style:{width:e,height:e}},Pt.createElement("path",{d:"M8.12 9.29L12 13.17l3.88-3.88c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41l-4.59 4.59c-.39.39-1.02.39-1.41 0L6.7 10.7c-.39-.39-.39-1.02 0-1.41.39-.38 1.03-.39 1.42 0z"}))}}const Rt=xe.React;class Ot extends Rt.Component{constructor(e){super(e),this.state={open:!1,value:this.props.value||this.props.options[0].value},this.dropdown=Rt.createRef(),this.onChange=this.onChange.bind(this),this.showMenu=this.showMenu.bind(this),this.hideMenu=this.hideMenu.bind(this)}showMenu(e){e.preventDefault(),this.setState({open:!0},()=>{document.addEventListener("click",this.hideMenu)})}hideMenu(){this.setState({open:!1},()=>{document.removeEventListener("click",this.hideMenu)})}onChange(e){this.setState({value:e}),this.props.onChange&&this.props.onChange(e)}get selected(){return this.props.options.find(e=>e.value==this.state.value)}get options(){const e=this.selected;return Rt.createElement("div",{className:"bd-select-options"},this.props.options.map(t=>Rt.createElement("div",{className:"bd-select-option"+(e.value==t.value?" selected":""),onClick:this.onChange.bind(this,t.value)},t.label)))}render(){const e="transparent"==this.props.style?" bd-select-transparent":"",t=this.state.open?" menu-open":"";return Rt.createElement("div",{className:`bd-select${e}${t}`,onClick:this.showMenu,ref:this.dropdown},Rt.createElement("div",{className:"bd-select-value"},this.selected.label),Rt.createElement(Tt,{className:"bd-select-arrow"}),this.state.open&&this.options)}}const jt=xe.React;class _t extends jt.Component{render(){const e=this.props.size||"16px";return jt.createElement("svg",{className:this.props.className||"",fill:"var(--text-normal)",viewBox:"0 0 24 24",style:{width:e,height:e}},jt.createElement("path",{fill:"none",d:"M0 0h24v24H0V0z"}),jt.createElement("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"}))}}const $t=xe.React;class It extends $t.Component{constructor(e){super(e),this.state={focused:!1}}render(){const e=["bd-search-wrapper"];return this.state.focused&&e.push("focused"),$t.createElement("div",{className:e.join(" ")},$t.createElement("input",{onChange:this.props.onChange,onKeyDown:this.props.onKeyDown,type:"text",className:"bd-search",placeholder:this.props.placeholder,maxLength:"50",onFocus:()=>{this.setState({focused:!0})},onBlur:()=>{this.setState({focused:!1})}}),$t.createElement(_t,null))}}function Wt(){return(Wt=Object.assign||function(e){for(var t=1;t{Ps.showConfirmationModal("Are You Sure?",`Are you sure you want to delete ${e}?`,{danger:!0,confirmText:"Delete",onConfirm:()=>{t(!0)},onCancel:()=>{t(!1)}})})}get sortOptions(){return[{label:"Name",value:"name"},{label:"Author",value:"author"},{label:"Version",value:"version"},{label:"Recently Added",value:"added"},{label:"Last Modified",value:"modified"},{label:"File Size",value:"size"}]}get directions(){return[{label:"Ascending",value:!0},{label:"Descending",value:!1}]}reverse(e){this.setState({ascending:e})}sort(e){this.setState({sort:e})}search(e){this.setState({query:e.target.value.toLocaleLowerCase()})}getProps(e){return{key:this.getName(e),enabled:this.cookie[this.getName(e)],toggle:this.manager.toggle.bind(this.manager),edit:h["fork-ps-7"]?this.edit.bind(this):null,remove:this.delete.bind(this),addon:e,hash:e.hash}}getString(e){return e?"string"==typeof e?e:e.toString():"???"}get list(){return"plugins"===this.props.type?Object.values(y):Object.values(b)}getAddons(){const e=this.list.sort((e,t)=>{const n=this.state.sort.charAt(0).toUpperCase()+this.state.sort.slice(1),s=e.plugin&&e.plugin["get"+n]?this.getString(e.plugin["get"+n]()):this.getString(e[this.state.sort]),r=t.plugin&&t.plugin["get"+n]?this.getString(t.plugin["get"+n]()):this.getString(t[this.state.sort]);return"string"==typeof s?s.toLocaleLowerCase().localeCompare(r.toLocaleLowerCase()):s>r?1:r>s?-1:0});this.state.ascending||e.reverse();const t=[];for(let n=0;n{t=!1,e.hide()}},zt.createElement(Lightcord.Api.Components.inputs.Button,{ref:"checkUpdateButton",color:"brand",look:"filled",size:"min",hoverColor:"default",onClick:()=>{try{ke.showToast("Plugin update check in progress.",{type:"info"}),window.PluginUpdates.checkAll().then(()=>{ke.showToast("Plugin update check complete.",{type:"success"})}).catch(e=>{console.error(e),ke.showToast("An error occured while checking update.",{type:"error"})})}catch(e){console.error(e),ke.showToast("An error occured while checking update.",{type:"error"})}},wrapper:!1,disabled:!1,onRightClick:()=>{this.refs.checkUpdateButton&&window.PluginUpdates&&window.PluginUpdates.plugins&&(t||(e=new G(this.refs.checkUpdateButton.refs.original.refs.button,Object.values(window.PluginUpdates.plugins).map(e=>e.name).join(", "),{side:"bottom",attachEvents:!1}),e.show(),t=!0))}},"Check for Updates")))}render(){const e=zt.createElement(Ft,{color:"black",position:"top",text:"Reload List"},e=>zt.createElement(St,Wt({},e,{className:"bd-icon bd-reload bd-reload-header",size:"18px",onClick:async()=>{this.isPlugins?R.updatePluginList():Se.updateThemeList(),this.forceUpdate()}}))),t=this.getAddons();return zt.createElement(Et,{title:`${this.props.type.toUpperCase()}—${t.length}`},zt.createElement(Lightcord.Api.Components.inputs.Button,{key:"folder-button",color:"brand",look:"filled",size:"min",hoverColor:"default",onClick:this.openFolder.bind(this),wrapper:!1,style:{marginLeft:"10px"}},"Open ",this.isPlugins?"Plugin":"Theme"," Folder"),this.renderCheckUpdates(),!h["fork-ps-5"]&&e,zt.createElement("div",{className:"bd-controls bd-addon-controls"},zt.createElement(It,{onChange:this.search,placeholder:`Search ${this.props.type}...`}),zt.createElement("div",{className:"bd-addon-dropdowns"},zt.createElement("div",{className:"bd-select-wrapper"},zt.createElement("label",{className:"bd-label"},"Sort by:"),zt.createElement(Ot,{options:this.sortOptions,onChange:this.sort,style:"transparent"})),zt.createElement("div",{className:"bd-select-wrapper"},zt.createElement("label",{className:"bd-label"},"Order:"),zt.createElement(Ot,{options:this.directions,onChange:this.reverse,style:"transparent"})))),zt.createElement("div",{className:"bda-slist bd-addon-list"},t))}}const Ut=Ht.prototype.render;Object.defineProperty(Ht.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>Ut});const qt=BDModules.get(e=>e.Dispatcher&&e.default&&e.default.dispatch)[0].default,Gt=BDModules.get(e=>e.ActionTypes)[0].ActionTypes,Vt=process.pid;var Jt=new class{constructor(){this.enabled=!1,this.game=u}get formatedGame(){if(!this.game)return null;if(!1===this.enabled)return null;return{name:this.game.name||p.name,application_id:this.game.application_id||p.application_id,details:this.game.details||void 0,state:this.game.state||void 0,timestamps:this.game["timestamps.start"]?{start:this.game["timestamps.start"]}:void 0,assets:this.game["assets.large"]?{large_image:this.game["assets.large"],small_image:this.game["assets.small"]||void 0}:void 0}}sendGame(){qt.dispatch({type:Gt.LOCAL_ACTIVITY_UPDATE,socketId:"lightcord-spoof-socket",pid:Vt,activity:this.formatedGame})}enable(){this.enabled||(this.enabled=!0,console.log("Enabling custom RichPresence"),this.set(u||Object.create(p)),this.sendGame())}disable(){this.enabled&&(this.enabled=!1,console.log("Disabling custom RichPresence"),this.sendGame())}async fetchAssets(e){let t=await BDModules.get(e=>e.getAssets)[0].getAssets(e);if(t.undefined&&"number"==typeof t.undefined)throw new Error("Unknown Application");return t}set(e){this.game=e,this.sendGame()}};const Zt=xe.React;let Yt;class Kt extends Zt.Component{constructor(e){super(e),this.state={data:L.getSettingGroup("rpc")||p,assets:[]},this.preview=null,this.isfetching=!1,this.state.data.application_id&&this.fetchAssets(),this.assetComponents=new Set}updateWhenFetched(e){this.assetComponents.add(e)}onChange(e,t){let n=Xt.find(t=>t.id===e.props.id);this.setState({data:Object.assign(u,this.state.data,{[n.id]:t||null}),assets:this.state.assets}),"application_id"===e.props.id&&this.fetchAssets(),L.setSettingGroup("rpc",u),this.preview.forceUpdate(),Jt.set(u)}fetchAssets(){if(!0===this.isfetching){let e=this.state.data.application_id;setTimeout(()=>{this.state.data.application_id===e&&this.fetchAssets()},5e3)}if(!this.state.data.application_id)return this.setState({data:this.state.data,assets:[]}),this.forceUpdate(),void this.assetComponents.forEach(e=>e.forceUpdate());this.isfetching=!0,Jt.fetchAssets(this.state.data.application_id).then(e=>{this.isfetching=!1,this.setState({data:this.state.data,assets:Object.keys(e).map(t=>{let n=e[t];return{id:n.id,name:n.name,type:n.type}})}),this.forceUpdate(),this.assetComponents.forEach(e=>e.forceUpdate())}).catch(()=>{this.isfetching=!1,this.setState({data:this.state.data,assets:[]}),this.forceUpdate(),this.assetComponents.forEach(e=>e.forceUpdate())})}updatePreview(e){this.setState({data:e})}get modules(){return Yt||(Yt=[BDModules.get(e=>e.marginBottom20)[0]])}render(){let[e]=this.modules;return[Zt.createElement(pt,{title:"RichPresence Settings",settings:this.props.settings,onChange:this.props.onChange}),Zt.createElement(gt,null),Zt.createElement(Pe,{text:"RichPresence"}),Zt.createElement("div",null,this.optionsComponents),Zt.createElement("div",null,Zt.createElement(gt,null),Zt.createElement(Pe,{text:"Preview"}),Zt.createElement(fn,{settings:this})),Zt.createElement("div",{className:e.marginBottom20}),Zt.createElement("button",{style:{opacity:.01},onClick:window.ohgodohfuck},"Oh god Oh fuck"),Zt.createElement("button",{style:{opacity:.01},onClick:()=>{_.remote.shell.openExternal("https://www.youtube.com/watch?v=LkYa7rps_g4")}},"See ? I pulled a litle sneaky on ya")]}get optionsComponents(){return this._optionsComponents||(this._optionsComponents=Xt.map(e=>{if("text"===e.type)return Zt.createElement(nn,{setting:e,manager:this,id:e.id});if("number"===e.type){return[Zt.createElement(sn,{setting:e,manager:this,id:e.id})]}return"choice"===e.type?["assets.small","assets.large"].includes(e.id)?Zt.createElement(rn,{setting:e,manager:this,id:e.id,choices:[{value:"none",label:"No assets"}].concat(this.state.assets.map(e=>({value:"asset-"+e.id,label:e.name})))}):"Unknown choice.":void 0}))}}const Xt=[{title:"Application ID",id:"application_id",type:"number",placeholder:"711416957718757418"},{title:"Name",id:"name",type:"text",placeholder:"Lightcord"},{title:"Details",id:"details",type:"text",placeholder:"Browsing Discord"},{title:"State",id:"state",type:"text",placeholder:"Lightcord Client"},{title:"Timestamp Start",id:"timestamps.start",type:"number",get placeholder(){return Date.now()}},{title:"LargeAsset",id:"assets.large",type:"choice"},{title:"SmallAsset",id:"assets.small",type:"choice"}];let Qt,en,tn;class nn extends Zt.PureComponent{get modules(){return Qt&&Qt[0]?Qt:Qt=[BDModules.get(e=>e.removeKeybind)[0],BDModules.get(e=>e.marginBottom20)[0],BDModules.get(e=>e.defaultMarginh5)[0],BDModules.get(e=>e.colorStandard)[0],BDModules.get(e=>e.size32)[0],BDModules.get(e=>e._horizontal)[0],BDModules.get(e=>e.inputMini)[0],BDModules.get(e=>e.size16&&e.size20)[0]]}constructor(e){super(e);let t=this.props.setting;this.state={data:this.props.manager.state.data[t.id]},this.input=Zt.createElement(window.Lightcord.Api.Components.inputs.TextInput,{placeholder:t.placeholder,name:t.id,value:this.state.data,onChange:e=>{this.setState({data:e}),!this.lastEdited||this.lastEdited{this.props.manager.onChange(this,this.state.data),this.isTiming=null,this.lastEdited=Date.now()},500))},type:"text"})}render(){let e=this.props.setting,[t,n,s,r,o,i,a,l]=this.modules;return Zt.createElement("div",{className:t.row+" "+n.marginBottom20},Zt.createElement("div",{className:`${t.item} ${i.flexChild}`},Zt.createElement("h5",{className:r.colorStandard+" "+o.size14+" "+s.h5+" "+s.defaultMarginh5},e.title),this.input),Zt.createElement(gn,null))}}class sn extends Zt.PureComponent{get modules(){return en||(en=[BDModules.get(e=>e.removeKeybind)[0],BDModules.get(e=>e.marginBottom20)[0],BDModules.get(e=>e.defaultMarginh5)[0],BDModules.get(e=>e.colorStandard)[0],BDModules.get(e=>e.size32)[0],BDModules.get(e=>e._horizontal)[0],BDModules.get(e=>e.inputMini)[0],BDModules.get(e=>e.size16&&e.size20)[0],BDModules.get(e=>e.colorTransparent)[0]])}constructor(e){super(e);let t=this.props.setting;this.state={data:this.props.manager.state.data[t.id]},this.input=Zt.createElement(window.Lightcord.Api.Components.inputs.TextInput,{placeholder:t.placeholder,name:t.id,value:this.state.data,type:"number",onChange:(e,t,n)=>{(e=e.replace(/[^\d]+/g,""))!=this.state.data?(!this.lastEdited||this.lastEdited{this.props.manager.onChange(this,this.state.data),this.isTiming=null,this.lastEdited=Date.now()},500)),this.setState({data:e})):n.setValue(e)},type:"text"})}render(){let e=this.props.setting,[t,n,s,r,o,i]=this.modules;return Zt.createElement("div",{className:t.row+" "+n.marginBottom20},Zt.createElement("div",{className:`${t.item} ${i.flexChild}`},Zt.createElement("h5",{className:r.colorStandard+" "+o.size14+" "+s.h5+" "+s.defaultMarginh5},e.title),this.input,"timestamps.start"===e.id?Zt.createElement(Lightcord.Api.Components.inputs.Button,{onClick:()=>{DiscordNative.clipboard.copy(Date.now()+"")},color:"brand"},"Copy current timestamp"):null),Zt.createElement(gn,null))}}class rn extends Zt.PureComponent{constructor(e){super(e);let t=this.props.setting;this.state={data:this.props.manager.state.data[t.id]?"asset-"+this.props.manager.state.data[t.id]:"none"},this.props.manager.updateWhenFetched(this)}onChange(e){let t=e.value;!this.lastEdited||this.lastEdited{this.props.manager.onChange(this,"none"===this.state.data?null:this.state.data.replace("asset-","")),this.isTiming=null,this.lastEdited=Date.now()},500)),this.setState({data:t}),this.forceUpdate()}get modules(){return tn||(tn=[BDModules.get(e=>e.removeKeybind)[0],BDModules.get(e=>e.marginBottom20)[0],BDModules.get(e=>e.defaultMarginh5)[0],BDModules.get(e=>e.colorStandard)[0],BDModules.get(e=>e.size32)[0],BDModules.get(e=>e._horizontal)[0]])}render(){let e=this.props.setting,[t,n,s,r,o,i]=this.modules,a=this.props.manager.state.assets.map(e=>({value:"asset-"+e.id,label:e.name}));return a.unshift({value:"none",label:"No assets"}),Zt.createElement("div",{className:t.row+" "+n.marginBottom20},Zt.createElement("div",{className:`${t.item} ${i.flexChild}`},Zt.createElement("h5",{className:r.colorStandard+" "+o.size14+" "+s.h5+" "+s.defaultMarginh5},e.title),Zt.createElement(window.Lightcord.Api.Components.inputs.Dropdown,{value:this.state.data,options:a,onChange:this.onChange.bind(this)})),Zt.createElement(gn,null))}}let on,an,ln,cn,dn,hn,un,pn,mn=[];class gn extends Zt.PureComponent{get modules(){return mn&&mn[0]?mn:mn=[BDModules.get(e=>e.divider&&1===Object.keys(e).length)[0],BDModules.get(e=>e.dividerDefault)[0]]}render(){let[e,t]=this.modules;return Zt.createElement("div",{class:`${e.divider} ${t.dividerDefault}`})}}Zt.Component;class fn extends Zt.Component{constructor(e={}){super(e),this.state={active:"profile"},this.tabs=[],this.props.settings.preview=this}changeTab(e){this.state.active!==e.props.id&&(this.tabs.forEach(e=>{e.setActive(!1)}),e.setActive(!0),this.setState({active:e.props.id}))}render(){return Zt.createElement("div",{className:"lc-tabWrapper"},Zt.createElement("div",{className:"lc-tabnav",style:{flex:"0 1 auto"}},Zt.createElement(bn,{preview:this,title:"Full Profile",id:"profile"}),Zt.createElement(bn,{preview:this,title:"User Popout",id:"popout"})),Zt.createElement(yn,{preview:this.preview,state:this.state.rpc,props:{preview:this},key:this.state.active}))}isActive(e){return this.state.active===e}get preview(){return"profile"===this.state.active?wn:vn}}class bn extends Zt.Component{constructor(e){super(e),this.state={active:e.preview.isActive(e.id)},e.preview.tabs.push(this)}setActive(e){this.setState({active:!!e})}render(){let e="lc-navItem";return this.state.active?e+=" lc-navItemActive":e+=" lc-navItemInactive",Zt.createElement("div",{className:e,onClick:()=>{this.props.preview.changeTab(this)}},this.props.title)}}class yn extends Zt.Component{componentDidCatch(e,t){console.error(e,t),this.setState({error:!0})}render(){if(this.state||(this.state={error:!1}),this.state.error)return on=on||xe.WebpackModules.find(e=>e.emptyStateImage&&e.emptyState),on?Zt.createElement("div",{style:{margin:"20px"}},Zt.createElement("div",{style:{backgroundColor:"var(--background-primary)",padding:"30px 30px",borderRadius:"8px"},className:"lc-tab-box-shadow "+on.emptyState},Zt.createElement("div",{className:on.emptyStateImage,style:{marginTop:"20px"}}),Zt.createElement("div",{className:on.emptyStateHeader},"An error occured"),Zt.createElement("p",{className:on.emptyStateSubtext},"Please check the console for more informations. Join our ­",Zt.createElement("a",{className:`${xe.anchorClasses.anchor} ${xe.anchorClasses.anchorUnderlineOnHover}`,role:"button",tabindex:0,onClick:()=>{xe.joinLC()}},"support server"),"­ for help."))):(ke.showToast("An error occured. Please check the console for more informations."),null);try{const e=new this.props.preview(this.props.props);return e.setState(this.props.state),e.render()}catch(e){return console.error(e),this.state.error=!0,this.render()}}}class vn extends Zt.Component{get modules(){return an||(an=[xe.WebpackModules.find(e=>e.default&&"UserPopout"===e.default.displayName),xe.WebpackModules.find(e=>e.default&&e.default.getCurrentUser)])}getComponent(){let[e,t]=this.modules;const n=t.default.getCurrentUser();return Zt.createElement(()=>{let t=e.default({userId:n.id,guildId:null,channelId:null,disableUserProfileLink:!0});return ln=t.type,cn=t.props,this.render()},null)}render(){if(!ln)return this.getComponent();let[e,t]=this.modules;const n=t.default.getCurrentUser();let s=Object.assign({},p,this.props.preview.props.settings.state.data);const r=function(){if(!this.game)return null;return{name:this.game.name||p.name,application_id:this.game.application_id||p.application_id,details:this.game.details||void 0,state:this.game.state||void 0,timestamps:this.game["timestamps.start"]?{start:this.game["timestamps.start"]}:void 0,assets:this.game["assets.large"]?{large_image:this.game["assets.large"],small_image:this.game["assets.small"]||void 0}:void 0,type:0}}.call({game:s}),o=new ln(Object.assign({},cn,{activity:r,userId:n.id})).render().props.children,i=Zt.createElement("div",window.Lightcord.Api._.excludeProperties(o.props,["onClick","onContextMenu"]));return Zt.createElement("div",{className:"lc-userPopout lc-tab-box-shadow"},i)}}class wn extends Zt.Component{get modules(){return dn||(dn=[xe.WebpackModules.find(e=>e.default&&"UserProfile"===e.default.displayName),xe.WebpackModules.find(e=>e.default&&e.default.getCurrentUser)])}render(){let[e,t]=this.modules;const n=t.default.getCurrentUser();if(!hn){const t=new e.default({user:n}).render();pn=t.type;const s=new t.type(t.props).render(),r=s.type.render(s.props,null),o=new r.type(r.props).render();hn=o.type}if(!hn)throw new Error("Couldn't find the UserProfileComponent component.");let s=Object.assign({},p,this.props.preview.props.settings.state.data);const r=function(){if(!this.game)return null;return{name:this.game.name||p.name,application_id:this.game.application_id||p.application_id,details:this.game.details||void 0,state:this.game.state||void 0,timestamps:this.game["timestamps.start"]?{start:this.game["timestamps.start"]}:void 0,assets:this.game["assets.large"]?{large_image:this.game["assets.large"],small_image:this.game["assets.small"]||void 0}:void 0,type:0}}.call({game:s});un=new pn({user:n,close:()=>{}}).render().props;const o=new hn(Object.assign({},un,{activity:r})).render().props.children;return o.props.style={width:"auto"},Zt.createElement("div",{className:"lc-tab lc-tab-box-shadow"},o)}}const Cn=xe.React;let En=BDModules.get(e=>e.defaultMarginh5)[0],Sn=BDModules.get(e=>e.colorStandard)[0],xn=BDModules.get(e=>e.size32)[0],kn=BDModules.get(e=>e.scrollbarGhostHairline)[0];const Dn=BDModules.get(e=>e.default&&e.default.getGuilds)[0].default,Mn=BDModules.get(e=>e.default&&e.default.getRelationships)[0].default,Bn=BDModules.get(e=>e.default&&e.default.getSessions)[0].default,Nn=BDModules.get(e=>e.default&&e.default.getCurrentUser)[0].default;class Ln extends Cn.Component{constructor(e){super(e)}render(){return En||(En=BDModules.get(e=>e.defaultMarginh5)[0]),Sn||(Sn=BDModules.get(e=>e.colorStandard)[0]),xn||(xn=BDModules.get(e=>e.size32)[0]),[Cn.createElement(Pe,{text:"Account Infos"}),Cn.createElement("div",null,Cn.createElement("h5",{className:Sn.colorStandard+" "+xn.size14+" "+En.h5+" "+En.defaultMarginh5},"Profile"),Cn.createElement(Rn,{content:this.getProfileValue(),language:"diff"}),Cn.createElement("h5",{className:Sn.colorStandard+" "+xn.size14+" "+En.h5+" "+En.defaultMarginh5},"Statistics"),Cn.createElement(Rn,{content:this.getStatistics(),language:"diff"}),Cn.createElement("h5",{className:Sn.colorStandard+" "+xn.size14+" "+En.h5+" "+En.defaultMarginh5},"Connected Sessions"),Cn.createElement(Rn,{content:this.getSessionValue(),language:"diff"})),Cn.createElement("div",{className:BDModules.get(e=>e.marginBottom20)[0].marginBottom20})]}getSessionValue(){const e=Bn.getSessions(),t=Object.keys(e).filter(e=>"all"!==e).map(t=>e[t]);return 0===t.length?"- No session detected. Please try in a few seconds":t.map(e=>`+ id: ${e.sessionId}\n+ os: ${e.clientInfo.os[0].toUpperCase()+e.clientInfo.os.slice(1)}\n+ client: ${e.clientInfo.client}\n+ status: ${e.status}\n+ Activities: ${e.activities.length}`).join("\n"+"-".repeat(38)+"\n")}getProfileValue(){const e=Nn.getCurrentUser(),t=e.createdAt;let n=e.avatarURL;return e.avatar&&e.avatar.startsWith("a_")&&(n=e.getAvatarURL("gif")),n.startsWith("/")&&(n="https://discord.com"+n),n.endsWith("?size=128")&&(n=n.replace("?size=128","?size=4096")),`+ Username: ${e.username}\n+ Discriminator: ${e.discriminator}\n+ Tag: ${e.tag}\n+ ID: ${e.id}\n+ Avatar: ${e.avatar}\n+ Avatar URL: ${n}\n+ Creation Date: ${t.getDate().toString().padStart(2,"0")}/${(t.getMonth()+1).toString().padStart(2,"0")}/${t.getFullYear().toString().padStart(2,"0")} ${t.getHours().toString().padStart(2,"0")}h ${t.getMinutes().toString().padStart(2,"0")}min ${t.getSeconds()}s\n+ Flags: ${e.flags}\n+ Has Nitro: ${e.hasPremiumSubscription?"Yes":"No"}\n- Email: ${e.email}\n- 2FA: ${e.mfaEnabled?"Yes":"No"}\n- Has Been On Mobile: ${e.mobile?"Yes":"No"}\n- Phone: ${e.phone||"None"}\n- Verified: ${e.verified}\n- Can See NSFW Channels: ${e.nsfwAllowed}`}getStatistics(){const e=Object.values(Dn.getGuilds()),t=Object.keys(Mn.getRelationships()),n=t.filter(e=>Mn.isFriend(e)),s=t.filter(e=>Mn.isBlocked(e));return`+ Server Count: ${e.length} servers\n+ Relations: ${t.length} relations\n+ Friends Count: ${n.length} friends\n- Blocked Users Count: ${s.length} blocked users`}}let An=BDModules.get(e=>e.highlight)[0],Pn=BDModules.get(e=>e.markup)[0],Tn=BDModules.get(e=>e.messageContent)[0];class Rn extends Cn.Component{render(){return Pn||(Pn=BDModules.get(e=>e.markup)[0]),Tn||(Tn=BDModules.get(e=>e.messageContent)[0]),kn||(kn=BDModules.get(e=>e.scrollbarGhostHairline)[0]),An||(An=BDModules.get(e=>e.listLanguages)[0]),Cn.createElement("div",{class:`${Pn.markup} ${Tn.messageContent}`},Cn.createElement("pre",null,Cn.createElement("code",{class:kn.scrollbarGhostHairline+" hljs",dangerouslySetInnerHTML:{__html:An.highlight(this.props.language,this.props.content).value}})),Cn.createElement("div",{className:BDModules.get(e=>e.marginBottom8)[0].marginBottom8}))}}const On=window.Lightcord.DiscordModules.dispatcher,jn=BDModules.get(e=>e.default&&e.default.getChannel&&e.default.hasChannel)[0].default;let _n=BDModules.get(e=>e.default&&e.default.addRelationship)[0],$n=BDModules.get(e=>e.default&&e.default.closePrivateChannel)[0];const In={};let Wn=BDModules.get(e=>e.default&&e.default.getCurrentUser)[0];var Fn=new class{constructor(){this.antiDM=this.antiDM.bind(this),this.enabled=!1}enable(){this.enabled||(this.enabled=!0,On.subscribe("MESSAGE_CREATE",this.antiDM))}disable(){this.enabled&&(this.enabled=!1,On.unsubscribe("MESSAGE_CREATE",this.antiDM))}antiDM(e){if(!e.message.author.bot)return;if(e.message.author.id===(Wn?Wn.default.getCurrentUser():null).id&&e.message.guild_id)return;const t=jn.getChannel(e.message.channel_id);var n;t&&(1===t.type&&(In[e.message.author.id]||(n=e.message,(/(discord\.gg|discord\.com\/invite\/|discordapp\.com\/invite\/)/g.test(n.content)||zn(n,"discord.gg/")||zn(n,"discord.com/invite/")||zn(n,"discordapp.com/invite/"))&&(In[e.message.author.id]=!0,ke.showToast(`[AdBlock]: Blocked ${e.message.author.username}#${e.message.author.discriminator}`,{type:"warning"}),_n||(_n=BDModules.get(e=>e.default&&e.default.addRelationship)[0]),_n.default.addRelationship(e.message.author.id,{location:"ContextMenu"},2),$n||($n=BDModules.get(e=>e.default&&e.default.closePrivateChannel)[0]),$n.default.closePrivateChannel(t.id,!1)))))}};function zn(e,t){let n=e.embeds||[];return 0!==n.length&&n.map(e=>"rich"===e.type&&(!!(e.title||"").includes(t)||(!!(e.description||"").includes(t)||(!!((e.footer?e.footer.text:"")||"").includes(t)||!!(e.fields||[]).map(e=>e.value.includes(t)||e.name.includes(t)).includes(!0))))).includes(!0)}let Hn;const Un=ke.removeDa;var qn=new class{constructor(){this.enabled=!1}enable(){this.enabled||(this.enabled=!0,Hn=Hn||function(){let e=BDModules.get(e=>e.standardSidebarView)[0];if(!e)return null;let t=Un(e.standardSidebarView),n=[],s=BDModules.get(e=>e.userSettingsAccount)[0];const r=BDModules.get(e=>"string"==typeof e.children)[0];return n.push(`#app-mount .${t} .payment-info .${Un(BDModules.get(e=>e.description&&"string"==typeof e.description&&e.description.includes("formText"))[0].description)}`),n.push(`#app-mount .${t} .${Un(BDModules.get(e=>e.paymentSourceRow)[0].paymentSourceRow)} .${Un(BDModules.get(e=>e.subText&&e.descriptionWrapper)[0].subText)}`),s&&(n.push(`#app-mount .${t} .${Un(s.userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${Un(BDModules.get(e=>e.viewBody)[0].viewBody)}`),n.push(`.${Un(s.userSettingsSecurity)} .${Un(r.children)} > div:nth-child(2)`)),console.log(n),n}(),Hn||console.error(new Error("Couldn't find selectors to blur personnal informations.")),Ce.addStyle("blurPrivate",`\n${Hn.join(", ")} {\n transition: all 150ms cubic-bezier(.55,.085,.68,.53);\n filter: blur(4px);\n opacity: .8;\n}\n\n${Hn.map(e=>e+":hover").join(", ")} {\n transition: all 150ms cubic-bezier(.55,.09,.68,.53);\n filter: none;\n opacity: 1;\n}`))}disable(){this.enabled&&(this.enabled=!1,Ce.removeStyle("blurPrivate"))}},Gn=new class{constructor(){window.Lightcord.Api.ensureExported(e=>e.default&&e.default.startTyping).then(e=>{let t=this;const n=e.default.startTyping;e.default.startTyping=function(){if(t.disabled)return n.call(this,...arguments)};const s=e.default.stopTyping;e.default.stopTyping=function(){if(t.disabled)return s.call(this,...arguments)},this.disabled=!0}),window.Lightcord.BetterDiscord.DisableTyping=this}disable(){this.disabled=!0}enable(){this.disabled=!1}};let Vn;class Jn extends React.PureComponent{constructor(){super(...arguments),this.state={states:[]}}render(){Vn||(Vn=x.find(e=>e.FormSection));const e=[...new Set(Object.keys(window.Lightcord.Api.Components).map(e=>Object.keys(window.Lightcord.Api.Components[e]).map(t=>window.Lightcord.Api.Components[e][t])).flat())];return[React.createElement(Vn.FormSection,{tag:"h2",title:"Lightcord's Api Availlable components"},React.createElement(Vn.FormText,{type:"description",className:"",selectable:!1},"These components are here for the plugin devs. They can quickly embed any component below with this panel.",React.createElement("div",{style:{marginTop:"20px"}}),React.createElement(Lightcord.Api.Components.general.AlertBox,{type:"info"},"All these components have error handling. If you want none, add `.original` after the component path."),React.createElement(Lightcord.Api.Components.general.AlertBox,{type:"warn"},"We do not recommend modifying these component with plugins. Only do this if you know what you are doing.")),React.createElement(gt,null),React.createElement(Lightcord.Api.Components.inputs.Button,{color:"brand",look:"outlined",size:"medium",hoverColor:"green",onClick:()=>{_.remote.shell.openExternal("https://lightcord.deroku.xyz/LightcordApi/docs")},wrapper:!1},"Documentation")),e.map(e=>{const t=e.displayName||e.name,n=`Lightcord.Api.Components.${Object.keys(window.Lightcord.Api.Components).find(e=>window.Lightcord.Api.Components[e][t])}.${t}`;return React.createElement(Zn,{key:n,comp:e})})]}get renders(){}}class Zn extends React.Component{constructor(e){super(e),this.state={tab:"preview",elem:e.comp,options:{}}}render(){const e=this.props.comp;let t=[];e.AllPreviews&&(t=e.AllPreviews);let n=this.state,s=()=>{let e={};return t.forEach(t=>{e[Object.keys(t[0])[0]]=t[0][Object.keys(t[0])[0]]}),Object.keys(n.options).forEach(s=>{e[s]=t.find(e=>e.find(e=>e[s]))[n.options[s]][s]}),e},r=(e,t,n)=>{if("string"==typeof e)return e;if("boolean"==typeof e)return String(e);if("function"==typeof e)return e.toString();if("object"==typeof e){if(e&&e.$$typeof&&(e.$$typeof===Symbol.for("react.element")||60103===e.$$typeof)){if("Lightcord.Api.Components.general.Tabs"===t){if("react"===n)return'React.createElement("div", {style: {\nmarginTop: "20px", marginBottom: "20px"\n}},\nReact.createElement("div", {style: {\nbackgroundColor: "var(--background-secondary)",\npadding: "30px 30px",\nborderRadius: "8px"\n}, className: "lc-tab-box-shadow" },\nReact.createElement(Lightcord.Api.Components.general.Title, null, "Preview tabs")\n)\n)';if("jsx"===n)return'
\n
\n Preview tabs\n
\n
'}return"Your components here."}return JSON.stringify(e,null," ")}return String(e)},o=function(t){const n=e.displayName||e.name;const o=`Lightcord.Api.Components.${Object.keys(window.Lightcord.Api.Components).find(e=>window.Lightcord.Api.Components[e][n])}.${n}`,i=s();if("jsx"===t){let e,n=[],s=null;if(Object.keys(i).forEach(e=>{if("children"==e)s=r(i[e],o,t);else{let s=e+"=";"string"==typeof i[e]?s+=JSON.stringify(i[e]):s+=`{${r(i[e],o,t)}}`,n.push(s)}}),s){return e=`<${o} ${n.join(" ")}>`,`${e}\n ${s}\n${``}`}return e=`<${o} ${n.join(" ")}/>`,e}if("react"===t){let e=i.children||null;delete i.children,e&&e.$$typeof&&(e.$$typeof===Symbol.for("react.element")||60103===e.$$typeof)&&(e=r(e,o,t));let n=[];Object.keys(i).forEach(e=>{let s=(/[^\w\d_]/g.test(e)?JSON.stringify(e):e)+": ";"string"==typeof i[e]?s+=JSON.stringify(i[e]):s+=r(i[e],o,t).split("\n").map((e,t)=>0===t?e:" "+e).join("\n"),n.push(s)});let s="{";n.length?n.forEach((e,t)=>{let r=t===n.length-1;0===t||(s+=","),s+="\n ",s+=e,r&&(s+="\n}")}):s+="}";let a="string"==typeof e&&e.startsWith("React.createElement")?e:JSON.stringify(e);return`React.createElement(${o}, ${s}, ${a})`}},i=e.help||{},a=i.info?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"info"},i.info):null,l=i.warn?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"warn"},i.warn):null,c=i.danger?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"danger"},i.danger):null,d=i.error?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"error"},i.error):null,h=i.success?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"success"},i.success):null;return React.createElement("div",null,React.createElement(window.Lightcord.Api.Components.general.SettingsTitle,null,e.displayName||e.name),a,h,l,d,c,t.map(e=>{if(e[0].onClick)return null;if(e[0].text)return null;if(e[0].children)return null;if(1===e.length)return null;let t=Object.keys(e[0])[0];return[React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle,null,t),React.createElement(window.Lightcord.Api.Components.inputs.Dropdown,{options:e.map((e,t)=>({value:"opt-"+t,label:JSON.stringify(e[Object.keys(e)[0]])})),value:"opt-"+(n.options[t]||"0"),onChange:e=>{this.setState({options:Object.assign({},n.options,{[t]:(e.value||"0").replace("opt-","")})})},searchable:!0}),React.createElement("div",{style:{marginBottom:"8px"}})]}),React.createElement(window.Lightcord.Api.Components.general.Tabs,{tabs:[{label:"Preview",id:"preview"},{label:"Code",id:"code"}],active:n.tab,children:"preview"===n.tab?React.createElement("div",{style:{margin:"20px"}},React.createElement("div",{style:{backgroundColor:"var(--background-secondary)",padding:"30px 30px",borderRadius:"8px"},className:"lc-tab-box-shadow"},React.createElement(e,s()))):React.createElement("div",{style:{margin:"20px"}},React.createElement("div",{style:{backgroundColor:"var(--background-secondary)",padding:"30px 30px",borderRadius:"8px"},className:"lc-tab-box-shadow"},React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle,null,"JSX"),React.createElement(window.Lightcord.Api.Components.general.ErrorCatcher,null,React.createElement(()=>React.createElement(window.Lightcord.Api.Components.general.CodeBlock,{language:"jsx",content:o("jsx")}))),React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle,null,"React"),React.createElement(window.Lightcord.Api.Components.general.ErrorCatcher,null,React.createElement(()=>React.createElement(window.Lightcord.Api.Components.general.CodeBlock,{language:"js",content:o("react")}))))),onChange:e=>{this.setState({tab:e})}}))}}const Yn=xe.React;class Kn extends Yn.Component{render(){const e=this.props.size||"18px";return Yn.createElement("svg",{viewBox:"0 0 24 24",fill:"var(--text-normal)",className:this.props.className||"",style:{width:e,height:e},onClick:this.props.onClick},Yn.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}),Yn.createElement("path",{d:"M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"}))}}var Xn=new class{constructor(){this.windows=new Map,this.enabled=!1,this.init()}async init(){let e=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.getWindow);window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_OPEN",t=>{setImmediate(()=>{const n=e.default.getWindow(t.key);this.windows.set(t.key,n);let s=n.document.body.classList;s.add("window-popout"),s.add("lightcord"),s.add("lightcord"),this.update(t.key)})}),window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_CLOSE",e=>{setImmediate(()=>{this.windows.delete(e.key)})}),P.on("theme-enabled",()=>{this.update()}),P.on("theme-disabled",()=>{this.update()}),P.on("theme-reloaded",()=>{this.update()}),P.on("theme-unloaded",()=>{this.update()}),P.on("theme-loaded",()=>{this.update()})}enable(){this.enabled=!0,this.update()}disable(){this.enabled=!1,this.update()}update(e){if(this.windows.size)return this.enabled?this.applyThemes(e):this.removeThemes(e)}removeThemes(e){if(!this.enabled)if(e){let t=this.windows.get(e);if(!t)return;let n=t.document;for(let e of n.querySelectorAll("style[data-lightcord-theme=true]"))e.remove()}else for(let e of this.windows.keys())this.removeThemes(e)}applyThemes(e){if(this.enabled)if(e){let t=this.windows.get(e);if(!t)return;let n=t.document;for(let e of n.querySelectorAll("style[data-lightcord-theme=true]"))e.setAttribute("will-remove","true");Object.keys(bdthemes).forEach(e=>{if(!w[e])return;const t=bdthemes[e];if(!t)return;let s=n.querySelector("style[data-lightcord-theme=true]#"+Ce.escapeID(t.id));if(s)s.innerHTML=unescape(t.css),s.removeAttribute("will-remove");else{const e=n.createElement("style");e.id=Ce.escapeID(t.id),e.innerHTML=unescape(t.css),e.setAttribute("data-lightcord-theme","true"),n.head.append(e)}});for(let e of n.querySelectorAll("style[will-remove=true]"))e.remove()}else for(let e of this.windows.keys())this.applyThemes(e)}};class Qn extends React.PureComponent{render(){let e=x.find(e=>e.Separator&&e.Header&&e.Item);const t=React.createElement(V,{color:"black",side:"top",text:"Changelog"},React.createElement("span",{style:{float:"right",cursor:"pointer"},className:"bd-changelog-button",onClick:()=>{ke.showChangelogModal(bbdChangelog)}},React.createElement(Kn,{className:"bd-icon",size:"16px"})));return new e.Header({children:React.createElement("span",null,"Bandaged BD",t),className:"ui-tab-bar-header"})}}let es=!1;var ts=new class{constructor(){this.onChange=this.onChange.bind(this),this.updateSettings=this.updateSettings.bind(this),this.sidebar=new Me,this.registerComponents()}registerComponents(){this.sidebar.register("lightcord",ns(this.lightcordComponent.bind(this))),this.sidebar.register("status",ns(this.PresenceComponent.bind(this))),this.sidebar.register("accountinfo",ns(this.AccountInfosComponent.bind(this))),this.sidebar.register("lcapipreview",ns(this.ApiPreviewComponent.bind(this))),this.sidebar.register("BDChangelogTitle",ns(()=>(new Qn).render())),this.sidebar.register("core",ns(this.coreComponent.bind(this))),this.sidebar.register("customcss",ns(this.customCssComponent.bind(this))),this.sidebar.register("plugins",ns(this.renderAddonPane("plugins"))),this.sidebar.register("themes",ns(this.renderAddonPane("themes")))}get coreSettings(){const e=this.getSettings("core");return[...new Set(e.map(e=>e.category))].map(t=>({title:t,settings:e.filter(e=>e.category==t)}))}get lightcordSettings(){const e=this.getSettings("lightcord");return[...new Set(e.map(e=>e.category))].map(t=>({title:t,settings:e.filter(e=>e.category==t)}))}get PresenceSettings(){return this.getSettings("status")}getSettings(e){return Object.keys(c).reduce((t,n)=>{const s=c[n];return s.cat===e&&s.implemented&&!s.hidden&&(s.text=n,t.push(s)),t},[])}onChange(e,t,n){this.updateSettings(e,t,n)}updateSettings(e,t,n){if(["lightcord-8","no_window_bound","enable_glasstron","lightcord-10"].includes(e)||(h[e]=t),"bda-gs-2"==e&&(t?Ce.addClass(document.body,"bd-minimal"):Ce.removeClass(document.body,"bd-minimal")),"bda-gs-3"==e&&(t?Ce.addClass(document.body,"bd-minimal-chan"):Ce.removeClass(document.body,"bd-minimal-chan")),"bda-gs-1"==e&&(t?st.addButton():st.removeButton()),"bda-gs-4"==e&&(t?rt.start():rt.stop()),"bda-gs-5"==e&&(t?Ce.addClass(Ce.query("#app-mount"),"bda-dark"):Ce.removeClass(Ce.query("#app-mount"),"bda-dark")),t&&"bda-gs-6"==e&&Ne.inject24Hour(),"bda-gs-7"==e&&(t?Be.injectColoredText():Be.removeColoredText()),"fork-ps-4"==e&&(t?it.start():it.stop()),"fork-ps-5"==e&&(t?(we.watchContent("plugin"),we.watchContent("theme")):(we.unwatchContent("plugin"),we.unwatchContent("theme"))),"fork-wp-1"==e&&(ke.setWindowPreference("transparent",t),t?ke.setWindowPreference("backgroundColor",null):ke.setWindowPreference("backgroundColor","#2f3136")),"bda-gs-8"==e&&(t?at.startDebugListener():at.stopDebugListener()),"fork-dm-1"==e&&(t?at.startCopySelector():at.stopCopySelector()),"lightcord-1"===e&&(window.Lightcord.Settings.devMode=!!t,n.forceUpdate()),"lightcord-2"===e&&(window.Lightcord.Settings.callRingingBeat=!!t),"lightcord-presence-1"===e)if(t){Jt.enable();const e=BDModules.get(e=>e.default&&"object"==typeof e.default&&"showCurrentGame"in e.default)[0];e&&!e.default.showCurrentGame&&BDModules.get(e=>e.default&&e.default.updateRemoteSettings)[0].default.updateRemoteSettings({showCurrentGame:!0})}else Jt.disable();if("lightcord-3"===e&&(t?_.remote.getCurrentWindow().setAlwaysOnTop(!0):_.remote.getCurrentWindow().setAlwaysOnTop(!1)),"lightcord-4"===e&&(t?Fn.enable():Fn.disable()),"lightcord-6"===e&&(t?qn.enable():qn.disable()),"lightcord-7"===e&&(t?Gn.enable():Gn.disable()),"lightcord-8"===e){let e=_.remote.getGlobal("appSettings");e.set("isTabs",t),e.save(),_.remote.app.relaunch(),_.remote.app.exit()}if("lightcord-9"===e&&Xn[t?"enable":"disable"](),"lightcord-10"!==e){if("no_window_bound"===e){let e=_.remote.getGlobal("appSettings");e.set("NO_WINDOWS_BOUND",t),e.delete("IS_MAXIMIZED"),e.delete("IS_MINIMIZED"),e.delete("WINDOW_BOUNDS"),e.save(),_.remote.app.relaunch(),_.remote.app.exit()}if("enable_glasstron"===e){let e=_.remote.getGlobal("appSettings");e.set("GLASSTRON",t),e.save(),_.remote.app.relaunch(),_.remote.app.exit()}this.saveSettings()}else Ns.methods.NotificationsUseShim(t)}async initializeSettings(){h["bda-gs-2"]&&Ce.addClass(document.body,"bd-minimal"),h["bda-gs-3"]&&Ce.addClass(document.body,"bd-minimal-chan"),h["bda-gs-1"]&&st.addButton(),h["bda-gs-4"]&&rt.start(),h["bda-gs-5"]&&Ce.addClass(Ce.query("#app-mount"),"bda-dark"),h["bda-gs-6"]&&Ne.inject24Hour(),h["bda-gs-7"]&&Be.injectColoredText(),h["fork-ps-4"]&&it.start(),h["lightcord-1"]&&(window.Lightcord.Settings.devMode=!0),h["lightcord-2"]&&(window.Lightcord.Settings.callRingingBeat=!0),h["lightcord-presence-1"]&&Jt.enable(),h["lightcord-3"]&&_.remote.getCurrentWindow().setAlwaysOnTop(!0),h["lightcord-4"]&&Fn.enable(),h["lightcord-6"]&&qn.enable(),h["lightcord-7"]&&Gn.enable(),h["lightcord-9"]&&Xn.enable(),h["fork-ps-5"]&&(we.watchContent("plugin"),we.watchContent("theme")),h["bda-gs-8"]&&at.startDebugListener(),h["fork-dm-1"]&&at.startCopySelector(),this.saveSettings()}saveSettings(){L.setSettingGroup("settings",h),L.setSettingGroup("rpc",u)}loadSettings(){Object.assign(h,L.getSettingGroup("settings")),Object.assign(u,L.getSettingGroup("rpc"))}renderSidebar(e){return this.sidebar.render(e)}coreComponent(){return xe.react.createElement(ft,{key:"cspanel",onChange:this.onChange,sections:this.coreSettings})}lightcordComponent(e,t){let n=_.remote.getGlobal("appSettings");return[this.lightcordSettings.map((t,s)=>[0===s?null:xe.react.createElement(gt),xe.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},t.title),t.settings.map(t=>{let s=h[t.id];"lightcord-8"===t.id&&(s=n.get("isTabs",!1)),"no_window_bound"===t.id&&(s=n.get("NO_WINDOWS_BOUND",!1)),"enable_glasstron"===t.id&&(s=n.get("GLASSTRON",!0)),"lightcord-10"===t.id&&(s=!n.get("DEFAULT_NOTIFICATIONS",!0));let r=xe.react.createElement(ut,{id:t.id,key:t.id,data:t,checked:s,onChange:(t,n)=>{this.onChange(t,n,e)}});return"lightcord-8"==t.id&&s?[r,React.createElement(Lightcord.Api.Components.inputs.Button,{color:"green",look:"outlined",size:"small",hoverColor:"brand",onClick:()=>{DiscordNative.ipc.send("NEW_TAB")},wrapper:!1,disabled:!1},"Open a new Tab")]:r})]),xe.react.createElement(window.Lightcord.Api.Components.inputs.Button,{color:"yellow",look:"ghost",size:"medium",hoverColor:"red",onClick(){console.log("Should relaunch"),_.remote.app.relaunch({args:_.remote.process.argv.slice(1).concat(["--disable-betterdiscord"])}),_.remote.app.quit()},wrapper:!0},"Relaunch without BetterDiscord"),React.createElement(Lightcord.Api.Components.inputs.Button,{color:"yellow",look:"ghost",size:"medium",hoverColor:"red",onClick:()=>{es||(es=!0,ke.showToast("Clearing cache...",{type:"info"}),t(),_.remote.getCurrentWebContents().session.clearCache().then(()=>{ke.showToast("Cache is cleared !",{type:"success"}),es=!1,t()}).catch(e=>{console.error(e),ke.showToast("An error occured. Check console for more informations.",{type:"error"}),es=!1,t()}))},wrapper:!0,disabled:es},"Clear cache")]}PresenceComponent(){return xe.react.createElement(Kt,{key:"lppannel",onChange:this.onChange,settings:this.PresenceSettings})}AccountInfosComponent(){return xe.react.createElement(Ln,{key:"lapannel"})}ApiPreviewComponent(){return xe.react.createElement(Jn,{key:"lapipannel"})}customCssComponent(){return xe.react.createElement(vt,{key:"csseditor"})}renderAddonPane(e){class t extends xe.react.Component{constructor(e){super(e),this.prefix=this.props.type.replace("s","")}onChange(){this.props.onChange(this.props.type)}render(){return this.props.children}}const n=t.prototype.render;return Object.defineProperty(t.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>n}),function(){return xe.react.createElement(t,{type:e},xe.react.createElement(Ht,{type:e}))}}};function ns(e){class t extends React.Component{render(){return e(n,()=>this.forceUpdate())}}let n;return e=>(n=e,t)}class ss extends xe.reactComponent{render(){return xe.react.createElement("svg",{height:"100%",width:this.props.size||"16px",className:"bd-logo "+this.props.className,style:{fillRule:"evenodd",clipRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},viewBox:"0 0 2000 2000"},xe.react.createElement("metadata",null),xe.react.createElement("defs",null,xe.react.createElement("filter",{id:"shadow1"},xe.react.createElement("feDropShadow",{dx:"20",dy:"0",stdDeviation:"20","flood-color":"rgba(0,0,0,0.35)"})),xe.react.createElement("filter",{id:"shadow2"},xe.react.createElement("feDropShadow",{dx:"15",dy:"0",stdDeviation:"20","flood-color":"rgba(255,255,255,0.15)"})),xe.react.createElement("filter",{id:"shadow3"},xe.react.createElement("feDropShadow",{dx:"10",dy:"0",stdDeviation:"20","flood-color":"rgba(0,0,0,0.35)"}))),xe.react.createElement("g",null,xe.react.createElement("path",{style:{filter:"url(#shadow3)"},d:"M1195.44+135.442L1195.44+135.442L997.6+136.442C1024.2+149.742+1170.34+163.542+1193.64+179.742C1264.34+228.842+1319.74+291.242+1358.24+365.042C1398.14+441.642+1419.74+530.642+1422.54+629.642L1422.54+630.842L1422.54+632.042C1422.54+773.142+1422.54+1228.14+1422.54+1369.14L1422.54+1370.34L1422.54+1371.54C1419.84+1470.54+1398.24+1559.54+1358.24+1636.14C1319.74+1709.94+1264.44+1772.34+1193.64+1821.44C1171.04+1837.14+1025.7+1850.54+1000+1863.54L1193.54+1864.54C1539.74+1866.44+1864.54+1693.34+1864.54+1296.64L1864.54+716.942C1866.44+312.442+1541.64+135.442+1195.44+135.442Z",fill:"#171717",opacity:"1"}),xe.react.createElement("path",{style:{filter:"url(#shadow2)"},d:"M1695.54+631.442C1685.84+278.042+1409.34+135.442+1052.94+135.442L361.74+136.442L803.74+490.442L1060.74+490.442C1335.24+490.442+1335.24+835.342+1060.74+835.342L1060.74+1164.84C1150.22+1164.84+1210.53+1201.48+1241.68+1250.87C1306.07+1353+1245.76+1509.64+1060.74+1509.64L361.74+1863.54L1052.94+1864.54C1409.24+1864.54+1685.74+1721.94+1695.54+1368.54C1695.54+1205.94+1651.04+1084.44+1572.64+999.942C1651.04+915.542+1695.54+794.042+1695.54+631.442Z",fill:"#3E82E5",opacity:"1"}),xe.react.createElement("path",{style:{filter:"url(#shadow1)"},d:"M1469.25+631.442C1459.55+278.042+1183.05+135.442+826.65+135.442L135.45+135.442L135.45+1004C135.45+1004+135.427+1255.21+355.626+1255.21C575.825+1255.21+575.848+1004+575.848+1004L577.45+490.442L834.45+490.442C1108.95+490.442+1108.95+835.342+834.45+835.342L664.65+835.342L664.65+1164.84L834.45+1164.84C923.932+1164.84+984.244+1201.48+1015.39+1250.87C1079.78+1353+1019.47+1509.64+834.45+1509.64L135.45+1509.64L135.45+1864.54L826.65+1864.54C1182.95+1864.54+1459.45+1721.94+1469.25+1368.54C1469.25+1205.94+1424.75+1084.44+1346.35+999.942C1424.75+915.542+1469.25+794.042+1469.25+631.442Z",fill:"#FFFFFF",opacity:"1"})))}}function rs(){return(rs=Object.assign||function(e){for(var t=1;t/g};let as=BDModules.get(e=>e.CustomEmoji)[0],ls=BDModules.get(e=>e.default&&e.default.getCustomEmojiById)[0],cs=BDModules.get(e=>e.default&&"Autocomplete"===e.default.displayName)[0],ds=BDModules.get(e=>e.getAutocompleteOptions)[0],hs=BDModules.get(e=>e.default&&e.default.queryEmojiResults)[0],us=BDModules.get(e=>e.default&&e.default.Messages&&e.default.Messages.EMOJI_MATCHING)[0],ps=BDModules.get(e=>e.default&&e.default.getGuild&&e.default.getGuilds&&!e.default.isFetching)[0],ms=BDModules.get(e=>e.default&&e.default.getDisambiguatedEmojiContext);var gs=new class{constructor(){this.init().catch(e=>ke.err("EmojiModule","An error occured",e))}async init(){if(cs||(cs=await window.Lightcord.Api.ensureExported(e=>e.default&&"Autocomplete"===e.default.displayName)),ds||(ds=await window.Lightcord.Api.ensureExported(e=>e.getAutocompleteOptions)),hs||(hs=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.queryEmojiResults)),us||(us=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.Messages&&e.default.Messages.EMOJI_MATCHING)),ps||(ps=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.getGuild&&e.default.getGuilds&&!e.default.isFetching)),ms||(ms=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.getDisambiguatedEmojiContext)),cs&&ds&&hs&&us&&ps&&ms){console.log("Patching getAutocompleteOptions of AutoCompletionTemplates",ds);const e=ds.getAutocompleteOptions;ds.getAutocompleteOptions=function(t,n,s,r,o){const i=e.call(this,...arguments);return i.LIGHTCORD_EMOJIS={matches(e,t){let n=t.length>1&&"."===e;return Ds(n),n},queryResults:e=>hs.default.queryEmojiResults(e,t),renderResults:(e,t,n,s,r)=>fs(e,t,r.emojis,n,s,us.default.Messages.EMOJI_MATCHING,us.default.Messages.EMOJI,cs.default.Emoji,(function(e){return{emoji:e,key:e.id||e.uniqueName||e.name,sentinel:".",guild:null!=e.guildId?ps.default.getGuild(e.guildId):null}}),(function(e){return"."+e+"."})),getPlainText(e,t){var n=t.emojis;if(null==n||null==n[e])return"";var s=n[e],r=s.animated?"a":"";return s.managed||null==s.id?"."+s.name+".":"<"+r+"."+(s.originalName||s.name)+"."+s.id+">"},getRawText(e,t){var n=t.emojis;if(null==n||null==n[e])return"";var s=n[e],r=s.animated?"a":"";return s.managed||null==s.id?"."+s.name+".":"<"+r+"."+(s.originalName||s.name)+"."+s.id+">"}},i}}else console.error(new Error("Couldn't start autocompletion of Lightcord's emojis."));for(;!xe.MessageComponent;)await new Promise(e=>setTimeout(e,100));this.cancelEmojiRender||(this.cancelEmoteRender=ke.monkeyPatch(xe.MessageComponent,"default",{before:e=>{if(!ke.getNestedProp(e.methodArguments[0],"childrenMessageContent.props.message"))return;const t=ke.getNestedProp(e.methodArguments[0],"childrenMessageContent.props.content");if(!t||!t.length)return;let n=[];const s=[];for(let e of t){if("string"!=typeof e){s.push(e);continue}let r,o=!1;do{if(r=is.EmojiRegex.exec(e),r){o=!0,ls||(ls=BDModules.get(e=>e.default&&e.default.getCustomEmojiById)[0]);const e=ls.default.getCustomEmojiById(r[2]);e?n.push({animated:e.animated,name:e.name,id:e.id,raw:r[0]}):n.push({animated:r[0].startsWith("{if(!e)return"";const o=n.find(t=>t.raw==e);return o?(as||(as=BDModules.get(e=>e.CustomEmoji)[0]),React.createElement(as.CustomEmoji,{emoji:{name:`.${o.name}.`,emojiId:o.id,animated:o.animated,jumboable:1===r.length&&1===t.length}})):e}).reduce((e,t)=>0===e.length?[t]:"string"==typeof t?"string"==typeof e[e.length-1]?(e[e.length-1]+=" "+t,e):(e.push(" "+t),e):(e.push(" ",t),e),[]);s.push(...r)}else s.push(e)}for(;e.methodArguments[0].childrenMessageContent.props.content[0];)e.methodArguments[0].childrenMessageContent.props.content.shift();for(;s[0];)e.methodArguments[0].childrenMessageContent.props.content.push(s.shift())}}))}disable(){this.cancelEmoteRender&&(this.cancelEmoteRender(),this.cancelEmoteRender=null)}start(){}};function fs(e,t,n,s,r,o,i,a,l,c){if(null==n||0===n.length)return null;var d=n.map((function(e,n){return React.createElement(a,Object.assign({onClick:r,onHover:s,selected:t===n,index:n},l(e,n)))}));return[bs(o,i,e,c),d]}function bs(e,t,n,s){var r=n.length>0?e.format({prefix:s(n)}):t;return Array.isArray(r)?r.unshift(React.createElement("strong",{},"[Lightcord] ")):r="[LIGHTCORD] "+r,React.createElement(cs.default.Title,{title:r},r)}bs.displayName="renderHeader";let ys,vs,ws,Cs,Es=BDModules.get(e=>e.default&&e.default.isEmojiDisabled)[0],Ss=Es&&Es.default.isEmojiDisabled,xs=!1,ks=!1;function Ds(e){xs=e,ks||(Es||(Es=BDModules.get(e=>e.default&&e.default.isEmojiDisabled)[0]),Es&&(Ss||(Ss=Es.default.isEmojiDisabled),ks=!0,Es.default.isEmojiDisabled=function(e){return xs?!(!e.surrogates&&!e.diversity):Ss.call(this,...arguments)}))}function Ms(){}Ms.prototype.setConfig=function(e){this.hasStarted||Object.assign(f,e)},Object.defineProperty(Ms.prototype,"methods",{get:()=>ys}),Ms.prototype.setMethods=function(e){this.hasStarted||(ys=e)},Ms.prototype.init=async function(){if(this.hasStarted)return;if(this.hasStarted=!0,!Array.prototype.flat)return void ke.alert("Not Supported","BetterDiscord v"+a+" does not support this old version ("+o+") of Discord. Please update your Discord installation before proceeding.");if(f.version
Please download the latest version from GitHub");if(window.ED)return void ke.alert("Not Supported","BandagedBD does not work with EnhancedDiscord. Please uninstall one of them.");if(window.WebSocket&&window.WebSocket.name&&window.WebSocket.name.includes("Patched"))return void ke.alert("Not Supported","BandagedBD does not work with Powercord. Please uninstall one of them.");ke.suppressErrors(this.patchAttributes.bind(this),"LC Plugin Certifier Patch")(),ke.log("Startup","Initializing Settings"),this.initSettings(),await this.checkForGuilds(),xe.initialize(),ke.log("Startup","Updating Settings"),ts.initializeSettings(),ke.log("Startup","Loading Addons Cache"),await we.loadAddonCertifierCache(),ke.log("Startup","Loading Plugins"),await R.loadPlugins(),ke.log("Startup","Loading Themes"),await Se.loadThemes(),Ce.addStyle("customcss",Buffer.from(L.getBDData("bdcustomcss"),"base64").toString("utf8")),window.addEventListener("beforeunload",(function(){h["bda-dc-0"]&&document.querySelector(".btn.btn-disconnect").click()})),X.start(),ke.log("Startup","Removing Loading Icon"),document.getElementsByClassName("bd-loaderv2").length&&document.getElementsByClassName("bd-loaderv2")[0].remove(),ke.log("Startup","Initializing Main Observer"),this.initObserver(),h["fork-ps-1"]&&(ke.log("Startup","Collecting Startup Errors"),ke.showContentErrors({plugins:m,themes:g}));const e=L.getBDData("version");if(a>e&&(l&&this.showChangelogModal(l),L.setBDData("version",a)),gs.start(),ke.suppressErrors(this.patchSocial.bind(this),"BD Social Patch")(),ke.suppressErrors(this.patchGuildPills.bind(this),"BD Guild Pills Patch")(),ke.suppressErrors(this.patchGuildListItems.bind(this),"BD Guild List Items Patch")(),ke.suppressErrors(this.patchGuildSeparator.bind(this),"BD Guild Separator Patch")(),ke.suppressErrors(this.patchMessageHeader.bind(this),"BD Badge Chat Patch")(),ke.suppressErrors(this.patchMemberList.bind(this),"BD Badge Member List Patch")(),ke.suppressErrors(this.patchAttachment.bind(this),"LC Plugin Certifier Patch")(),f.haveInstalledDefault){let e=ke.alert("First Installation","As it is the first time you install Lightcord, We added two default themes and one default plugin in your plugin/theme folder. Check it in the Plugin/Theme settings.");await new Promise(t=>{e.onClose(t)})}const t=document.querySelector("#app-mount > div.typeWindows-1za-n7.withFrame-haYltI.titleBar-AC4pGV.horizontalReverse-3tRjY7.flex-1O1GKY.directionRowReverse-m8IjIq.justifyStart-2NDFzi.alignStretch-DpGPf3.da-typeWindows.da-withFrame.da-titleBar.da-horizontalReverse.da-flex.da-directionRowReverse.da-justifyStart.da-alignStretch > div.wordmarkWindows-1v0lYD.wordmark-2iDDfm.da-wordmarkWindows.da-wordmark");t&&(t.style.top="3px",t.innerHTML='\n \n \n \n')},Ms.prototype.patchAttributes=async function(){let e=[];for(this.cancelPatchAttributes=function(){e.forEach(e=>e())};!xe.MessageComponent;)await new Promise(e=>setTimeout(e,100));const t=x.find(e=>"Anchor"==e.displayName);window.Lightcord.Api.ensureExported(e=>e.default&&"DiscordTag"===e.default.displayName).then(e=>{let n=e.default;e.default=function(e){let s=n(e),r=qe(),o=xe.React.createElement("div",{style:{display:"inline",marginTop:"5px"}},xe.React.createElement("span",{id:"badges-"+r,key:"badges-"+r,style:{display:"inherit"}})),i=[s];"249746236008169473"===e.user.id?i.push(xe.React.createElement(V,{color:"black",side:"top",text:"BandagedBD Developer"},xe.React.createElement(t,{className:"bd-chat-badge",href:"https://github.com/rauenzi/BetterDiscordApp",title:"BandagedBD",target:"_blank"},xe.React.createElement(ss,{size:"16px",className:"bd-logo"})))):"696481194443014174"!==e.user.id&&"696003456611385396"!==e.user.id||i.push(xe.React.createElement(V,{color:"black",side:"top",text:"Lightcord Developer"},xe.React.createElement(t,{className:"bd-chat-badge",href:"https://github.com/Lightcord/Lightcord",title:"Lightcord",target:"_blank"},xe.React.createElement(os,{size:"16px",className:"bd-logo"})))),i.push(o);let a=xe.React.createElement("div",{style:{display:"block"}},i);return Bs(r,e.user,!1),a}}),e.push(ke.monkeyPatch(xe.MessageComponent,"default",{after:e=>{e.methodArguments[0].childrenMessageContent.props.message&&(e.returnValue.props["data-message-id"]=e.methodArguments[0].childrenMessageContent.props.message.id)}}))},Ms.prototype.checkForGuilds=function(){let e=0;return new Promise(t=>{const n=function(){const s=xe.guildClasses.wrapper.split(" ")[0];document.querySelectorAll("."+s).length>0&&e++;const r=xe.guildClasses.listItem.split(" ")[0],o=xe.guildClasses.blobContainer.split(" ")[0];return document.querySelectorAll(`.${s} .${r} .${o}`).length>0||e>=50?t(f.deferLoaded=!0):void setTimeout(n,100)};"loading"!=document.readyState&&setTimeout(n,100),document.addEventListener("DOMContentLoaded",()=>{setTimeout(n,100)})})},Ms.prototype.injectExternals=async function(){},Ms.prototype.initSettings=function(){if(L.initialize(),L.getSettingGroup("settings")||L.getSettingGroup("rpc")){ts.loadSettings();for(const e in d)null==h[e]&&(h[e]=d[e],ts.saveSettings())}else L.getSettingGroup("settings")||Object.assign(h,d),L.getSettingGroup("rpc")||Object.assign(u,p),ts.saveSettings();window.Lightcord.Api.ensureExported(e=>e.default&&e.default.prototype&&e.default.prototype.getPredicateSections).then(e=>{let t=e.default.prototype.getPredicateSections;e.default.prototype.getPredicateSections=function(){let e=t.call(this,...arguments);if(!e[1])return e;if("My Account"===e[1].section){let t=[];for(t.push(e.pop()),t.push(e.pop()),t.push(e.pop()),t.push(e.pop()),e.push(...ts.renderSidebar(this));t[0];)e.push(t.pop())}return e}})},Ms.prototype.initObserver=function(){new MutationObserver(e=>{for(let t=0,n=e.length;te.layer&&"string"==typeof e.layer&&e.animating)[0].layer),ws||(ws=BDModules.get(e=>e.socialLinks&&"string"==typeof e.socialLinks)[0].socialLinks),Cs||(Cs=BDModules.get(e=>e.modal&&"string"==typeof e.modal&&e.inner&&"string"==typeof e.inner&&!e.responsiveWidthMobile)[0].modal),s.classList.contains(vs)&&("GUILD_SETTINGS"===s.getAttribute("aria-label")&&(s.setAttribute("layer-id","server-settings"),s.setAttribute("id","server-settings")),s.getElementsByClassName(ws).length&&(s.setAttribute("layer-id","user-settings"),s.setAttribute("id","user-settings"))),s.parentElement==document.body&&s.querySelector("#ace_settingsmenu")&&(s.id="ace_settingsmenu_container")}}).observe(document,{childList:!0,subtree:!0})},Ms.prototype.showChangelogModal=function(e={}){return ke.showChangelogModal(e)},Ms.prototype.alert=function(e,t){return ke.alert(e,t)},Ms.prototype.patchSocial=function(){if(this.socialPatch)return;const e=x.find(e=>"TabBar"==e.displayName),t=x.find(e=>"Anchor"==e.displayName);e&&(this.socialPatch=ke.monkeyPatch(e.prototype,"render",{after:e=>{const n=e.returnValue.props.children;if(!n||!n.length||n.length<3)return;if("Separator"!==n[n.length-3].type.displayName)return;if(!n[n.length-2].type.toString().includes("socialLinks"))return;if(t){let e=BDModules.get(e=>e.socialLinks)[0];const s=n[n.length-2].type,r=function(){const n=s(...arguments);return n.props.children.push(xe.React.createElement(V,{color:"black",side:"top",text:"Lightcord"},xe.React.createElement(t,{className:"bd-social-link "+e.link,href:"https://github.com/Lightcord/Lightcord",title:"Lightcord",target:"_blank"},xe.React.createElement(os,{size:"16px",className:"bd-social-logo"})))),n.props.children.push(xe.React.createElement(V,{color:"black",side:"top",text:"BandagedBD"},xe.React.createElement(t,{className:"bd-social-link "+e.link,href:"https://github.com/rauenzi/BetterDiscordApp",title:"BandagedBD",target:"_blank"},xe.React.createElement(ss,{size:"16px",className:"bd-social-logo"})))),n};n[n.length-2].type=r}let[s,r,o]=[BDModules.get(e=>e.colorMuted)[0].colorMuted,BDModules.get(e=>e.size32)[0],BDModules.get(e=>e.versionHash)[0].versionHash];const i=`(${f.hash?f.hash.substring(0,7):f.branch})`,l=[xe.react.createElement("div",{className:`${s} ${r.size12}`},`Lightcord ${_.remote.getGlobal("BuildInfo").version} `,xe.react.createElement("span",{className:o+" da-versionHash"},`(${(_.remote.getGlobal("BuildInfo").commit||"Unknown").slice(0,7)})`)),xe.react.createElement("div",{className:`${s} ${r.size12}`},`BBD ${a} `,xe.react.createElement("span",{className:o+" da-versionHash"},i))],c=n[n.length-1].type;n[n.length-1].type=function(){const e=c(...arguments);return e.props.children.splice(1,0,l),e}}}))};function Bs(e,t,n){process.nextTick(()=>{const s=document.getElementById("badges-"+e);if(!s||s.childNodes.length>0)return;if(s.childNodes.length)return;let r=document.createElement("div");r.style.display="none",s.appendChild(r);const o=x.find(e=>"Anchor"==e.displayName);Je.getBadges(t.id).then(e=>{e.forEach(e=>{const r={svg:{size:"16px",className:"bd-logo",width:"16px"}};e.scopes.forEach(e=>{"user"===e&&(r.user=t)}),e.href||(r.Anchor=o,r.href={className:n?"bd-chat-badge":"bd-member-badge",title:e.name,target:"_blank"});const i=xe.React.createElement(V,{color:"black",side:"top",text:e.name},e.href?xe.react.createElement(o,{href:e.href,className:n?"bd-chat-badge":"bd-member-badge",title:e.name,target:"_blank"},xe.React.createElement(e.component,r)):xe.React.createElement(e.component,r)),a=document.createElement("div");xe.reactDom.render(i,a),a.childNodes.forEach(e=>{s.appendChild(e)})})})})}Ms.prototype.patchGuildListItems=function(){if(this.guildListItemsPatch)return;const e=function(){const e=x.findByProps("wrapper","unreadMentionsBar"),t=x.findByProps("guildsError","selected"),n=x.findByProps("blobContainer");return Object.assign({},e,t,n)}(),t=e.listItem.split(" ")[0],n=e.blobContainer.split(" ")[0],s=xe.getInternalInstance(document.querySelector(`.${t} .${n}`).parentElement).return.type;s&&(this.guildListItemsPatch=ke.monkeyPatch(s.prototype,"render",{after:e=>{if(e.returnValue&&e.thisObject){const t=e.returnValue,n=e.thisObject.props;let s=t.props.className;return s+=" bd-guild",n.unread&&(s+=" bd-unread"),n.selected&&(s+=" bd-selected"),n.audio&&(s+=" bd-audio"),n.video&&(s+=" bd-video"),n.badge&&(s+=" bd-badge"),n.animatable&&(s+=" bd-animatable"),t.props.className=s,t}}}))},Ms.prototype.patchGuildPills=function(){if(this.guildPillPatch)return;const e=x.find(e=>e.default&&!e.default.displayName&&e.default.toString&&e.default.toString().includes("translate3d"));e&&(this.guildPillPatch=ke.monkeyPatch(e,"default",{after:e=>{const t=e.methodArguments[0];return t.unread&&(e.returnValue.props.className+=" bd-unread"),t.selected&&(e.returnValue.props.className+=" bd-selected"),t.hovered&&(e.returnValue.props.className+=" bd-hovered"),e.returnValue}}))},Ms.prototype.patchGuildSeparator=function(){if(this.guildSeparatorPatch)return;const e=x.findByDisplayName("Guilds"),t=x.findByProps("renderListItem");if(!t||!e)return;const n=function(){const e=t.Separator(...arguments);return e.props.className+=" bd-guild-separator",e};this.guildSeparatorPatch=ke.monkeyPatch(e.prototype,"render",{after:e=>{e.returnValue.props.children[1].props.children[3].type=n}})},Ms.prototype.patchAttachment=function(){if(this.AttachmentPatch)return;const e=BDModules.get(e=>e.default&&"Attachment"===e.default.displayName)[0];x.find(e=>"Anchor"==e.displayName)&&e&&e.default&&(this.AttachmentPatch=ke.monkeyPatch(e,"default",{after:e=>{if(!h["fork-ps-6"])return;const t=e.methodArguments[0]||null,n=ke.getNestedProp(e.returnValue,"props.children");if(!n||!t||!t.url)return;if(!Array.isArray(n))return;const s=qe();n.push(xe.react.createElement("span",{id:"certified-"+s})),X.patch(t,"certified-"+s)}}))},Ms.prototype.patchMessageHeader=function(){if(this.messageHeaderPatch)return;const e=x.findByProps("MessageTimestamp"),t=x.find(e=>"Anchor"==e.displayName);t&&e&&e.default&&(this.messageHeaderPatch=ke.monkeyPatch(e,"default",{after:e=>{const n=ke.getNestedProp(e.methodArguments[0],"message.author"),s=ke.getNestedProp(e.returnValue,"props.children.1.props.children.1.props.children");if(!s||!n||!n.id)return;if(!Array.isArray(s))return;"249746236008169473"===n.id?s.push(xe.React.createElement(V,{color:"black",side:"top",text:"BandagedBD Developer"},xe.React.createElement(t,{className:"bd-chat-badge",href:"https://github.com/rauenzi/BetterDiscordApp",title:"BandagedBD",target:"_blank"},xe.React.createElement(ss,{size:"16px",className:"bd-logo"})))):"696481194443014174"!==n.id&&"696003456611385396"!==n.id||s.push(xe.React.createElement(V,{color:"black",side:"top",text:"Lightcord Developer"},xe.React.createElement(t,{className:"bd-chat-badge",href:"https://github.com/Lightcord/Lightcord",title:"Lightcord",target:"_blank"},xe.React.createElement(os,{size:"16px",className:"bd-logo"}))));const r=qe();s.push(xe.React.createElement("div",{id:"badges-"+r,style:{display:"inline"}})),Bs(r,n,!0)}}))},Ms.prototype.patchMemberList=function(){if(this.memberListPatch)return;const e=x.findByDisplayName("MemberListItem"),t=x.find(e=>"Anchor"==e.displayName);t&&e&&e.prototype&&e.prototype.renderDecorators&&(this.memberListPatch=ke.monkeyPatch(e.prototype,"renderDecorators",{after:e=>{const n=ke.getNestedProp(e.thisObject,"props.user"),s=ke.getNestedProp(e.returnValue,"props.children");if(!s||!n||!n.id)return;if(!Array.isArray(s))return;"249746236008169473"===n.id?s.push(xe.React.createElement(V,{color:"black",side:"top",text:"BandagedBD Developer"},xe.React.createElement(t,{className:"bd-member-badge",href:"https://github.com/rauenzi/BetterDiscordApp",title:"BandagedBD",target:"_blank"},xe.React.createElement(ss,{size:"16px",className:"bd-logo"})))):"696481194443014174"!==n.id&&"696003456611385396"!==n.id||s.push(xe.React.createElement(V,{color:"black",side:"top",text:"Lightcord Developer"},xe.React.createElement(t,{className:"bd-member-badge",href:"https://github.com/Lightcord/Lightcord",title:"Lightcord",target:"_blank"},xe.React.createElement(os,{size:"16px",className:"bd-logo"}))));const r=qe();s.push(xe.React.createElement("div",{id:"badges-"+r})),Bs(r,n,!1)}}))},Ms.prototype.updateInjector=async function(){if(!L.injectionPath)return!1};var Ns=new Ms;const Ls={get React(){return xe.React},get ReactDOM(){return xe.ReactDom},get ReactComponent(){return xe.ReactComponent},get WindowConfigFile(){return ke.WindowConfigFile},get settings(){return c},get emotes(){return null},get screenWidth(){return Math.max(document.documentElement.clientWidth,window.innerWidth||0)},get screenHeight(){return Math.max(document.documentElement.clientHeight,window.innerHeight||0)},getAllWindowPreferences:function(){return ke.getAllWindowPreferences()},getWindowPreference:function(e){return ke.getWindowPreference(e)},setWindowPreference:function(e,t){return ke.setWindowPreference(e,t)},injectCSS:function(e,t){Ce.addStyle(Ce.escapeID(e),t)},clearCSS:function(e){Ce.removeStyle(Ce.escapeID(e))},linkJS:function(e,t){Ce.addScript(Ce.escapeID(e),t)},unlinkJS:function(e){Ce.removeScript(Ce.escapeID(e))},getPlugin:function(e){return y.hasOwnProperty(e)?y[e].plugin:null},getCore:function(){return ke.warn("Deprecation Notice","BdApi.getCore() will be removed in future versions."),Ns},alert:function(e,t){return ke.showConfirmationModal(e,t,{cancelText:null})},showConfirmationModal:function(e,t,n={}){return ke.showConfirmationModal(e,t,n)},showToast:function(e,t={}){ke.showToast(e,t)},findModule:function(e){return xe.WebpackModules.find(e)},findAllModules:function(e){return xe.WebpackModules.findAll(e)},findModuleByProps:function(...e){return xe.WebpackModules.findByUniqueProperties(e)},findModuleByPrototypes:function(...e){return xe.WebpackModules.findByPrototypes(e)},findModuleByDisplayName:function(e){return xe.WebpackModules.findByDisplayName(e)},getInternalInstance:function(e){if(e instanceof window.jQuery||e instanceof Element)return e instanceof jQuery&&(e=e[0]),xe.getInternalInstance(e)},loadData:function(e,t){return L.getPluginData(e,t)}};Ls.getData=Ls.loadData,Ls.saveData=function(e,t,n){return L.setPluginData(e,t,n)},Ls.setData=Ls.saveData,Ls.deleteData=function(e,t){return L.deletePluginData(e,t)},Ls.monkeyPatch=function(e,t,n){return ke.monkeyPatch(e,t,n)},Ls.onRemoved=function(e,t){return ke.onRemoved(e,t)},Ls.suppressErrors=function(e,t){return ke.suppressErrors(e,t)},Ls.testJSON=function(e){return ke.testJSON(e)},Ls.isPluginEnabled=function(e){return!!v[e]},Ls.isThemeEnabled=function(e){return!!w[e]},Ls.isSettingEnabled=function(e){return!!h[e]},Ls.enableSetting=function(e){return ts.onChange(e,!0)},Ls.disableSetting=function(e){return ts.onChange(e,!1)},Ls.toggleSetting=function(e){return ts.onChange(e,!h[e])},Ls.getBDData=function(e){return L.getBDData(e)},Ls.setBDData=function(e,t){return L.setBDData(e,t)};const As=(e,t,n)=>new class{get folder(){return n.folder}isEnabled(t){return!!e[t]}enable(e){return n.enable(e)}disable(e){return n.disable(e)}toggle(t){e[t]?this.disable(t):this.enable(t)}reload(e){return n.reload(e)}get(e){return t.hasOwnProperty(e)?t[e].plugin?t[e].plugin:t[e]:null}getAll(){return Object.keys(t).map(e=>this.get(e)).filter(e=>e)}};Ls.Plugins=As(v,y,R),Ls.Themes=As(w,b,Se);var Ps=Ls;window.Lightcord.BetterDiscord.BdApi=Ls,function(){const e=Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype,"contentWindow").get;Object.defineProperty(HTMLIFrameElement.prototype,"contentWindow",{get:function(){const t=Reflect.apply(e,this,arguments);return new Proxy(t,{getOwnPropertyDescriptor:function(e,t){if("localStorage"!==t)return Object.getOwnPropertyDescriptor(e,t)},get:function(e,t){if("localStorage"===t)return null;const n=e[t];return"function"==typeof n?n.bind(e):n}})}}),Object.defineProperty(Reflect,"apply",{value:Reflect.apply,writable:!1,configurable:!1}),Object.defineProperty(Function.prototype,"bind",{value:Function.prototype.bind,writable:!1,configurable:!1});const t=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(){const e=arguments[1];return e.toLowerCase().includes("api/webhooks")?null:Reflect.apply(t,this,arguments)}}(),(()=>{const e=document.createElement("div");e.className="bd-loaderv2",e.title="BandagedBD is loading...",document.body.appendChild(e)})();const Ts=(e,t)=>{Object.defineProperty(window,e,{get:()=>(ke.warn("Deprecated Global",`"${e}" will be removed in future versions. Please only use BdApi.`),t)})},Rs=Object.keys(s);for(const e of Rs)Ts(e,s[e]);Ts("BDV2",xe),Ts("pluginModule",R),Ts("themeModule",Se),Ts("Utils",ke),Ts("BDEvents",P),Ts("settingsPanel",ts),Ts("DataStore",L),Ts("ContentManager",we),Ts("ClassNormalizer",it),window.BdApi=Ps,Ts("mainCore",Ns);class Os{constructor(e,t){Ns.setConfig(e),Ns.setMethods(t)}init(){Ns.init()}}}]); \ No newline at end of file +module.exports=function(e){var t={};function n(s){if(t[s])return t[s].exports;var r=t[s]={i:s,l:!1,exports:{}};return e[s].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(s,r,function(t){return e[t]}.bind(null,r));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(e,t){e.exports=require("electron")},function(e,t){e.exports=require("path")},function(e,t){e.exports=require("fs")},function(e,t){e.exports=require("crypto")},function(e,t){e.exports=require("node-fetch")},function(e,t){e.exports=require("events")},function(e,t){e.exports=require("module")},function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return Is}));var s={};n.r(s),n.d(s,"minimumDiscordVersion",(function(){return r})),n.d(s,"currentDiscordVersion",(function(){return o})),n.d(s,"minSupportedVersion",(function(){return i})),n.d(s,"bbdVersion",(function(){return a})),n.d(s,"bbdChangelog",(function(){return l})),n.d(s,"settings",(function(){return c})),n.d(s,"defaultCookie",(function(){return d})),n.d(s,"settingsCookie",(function(){return h})),n.d(s,"settingsRPC",(function(){return u})),n.d(s,"defaultRPC",(function(){return p})),n.d(s,"lightcordSettings",(function(){return m})),n.d(s,"defaultLightcordSettings",(function(){return g})),n.d(s,"bdpluginErrors",(function(){return f})),n.d(s,"bdthemeErrors",(function(){return b})),n.d(s,"bdConfig",(function(){return y})),n.d(s,"bdthemes",(function(){return v})),n.d(s,"bdplugins",(function(){return w})),n.d(s,"pluginCookie",(function(){return C})),n.d(s,"themeCookie",(function(){return E}));const r="0.0.307",o=window.DiscordNative&&window.DiscordNative.remoteApp&&window.DiscordNative.remoteApp.getVersion&&window.DiscordNative.remoteApp.getVersion()||"0.0.307",i="0.3.0",a="0.3.5",l={description:"Big things are coming.",changes:[{title:"Bug Fixes",type:"fixed",items:["Some fixes related to showing modals in the `BdApi`.","Fixed the open folder buttons for plugins and themes"]}]},c={"Custom css live update":{id:"bda-css-0",info:"",implemented:!0,hidden:!0,cat:"core"},"Custom css auto udpate":{id:"bda-css-1",info:"",implemented:!0,hidden:!0,cat:"core"},"BetterDiscord Blue":{id:"bda-gs-b",info:"Replace Discord blue with BD Blue",implemented:!1,hidden:!1,cat:"core"},"Public Servers":{id:"bda-gs-1",info:"Display public servers button",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Minimal Mode":{id:"bda-gs-2",info:"Hide elements and reduce the size of elements.",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Voice Mode":{id:"bda-gs-4",info:"Only show voice chat",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Hide Channels":{id:"bda-gs-3",info:"Hide channels in minimal mode",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Dark Mode":{id:"bda-gs-5",info:"Make certain elements dark by default(wip)",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Voice Disconnect":{id:"bda-dc-0",info:"Disconnect from voice server when closing Discord",implemented:!0,hidden:!1,cat:"core",category:"modules"},"24 Hour Timestamps":{id:"bda-gs-6",info:"Replace 12hr timestamps with proper ones",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Colored Text":{id:"bda-gs-7",info:"Make text color the same as role color",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Normalize Classes":{id:"fork-ps-4",info:"Adds stable classes to elements to help themes. (e.g. adds .da-channels to .channels-Ie2l6A)",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Content Error Modal":{id:"fork-ps-1",info:"Shows a modal with plugin/theme errors",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Scan Plugins":{id:"fork-ps-6",info:"Scan plugins for any threat that can be hidden inside.",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Show Toasts":{id:"fork-ps-2",info:"Shows a small notification for important information",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Scroll To Settings":{id:"fork-ps-3",info:"Auto-scrolls to a plugin's settings when the button is clicked (only if out of view)",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Automatic Loading":{id:"fork-ps-5",info:"Automatically loads, reloads, and unloads plugins and themes",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Enable Edit Button":{id:"fork-ps-7",info:"Enable an Edit Button on the plugin and theme panel.",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Themes in Popout Window":{id:"lightcord-9",info:"Enable themes in Popout Window. (For example, when detaching screenshare.)",implemented:!0,hidden:!1,cat:"core",category:"content manager",experimental:!0},"Developer Mode":{id:"bda-gs-8",info:"Developer Mode Toggle",implemented:!0,hidden:!1,cat:"core",category:"developer settings"},"Copy Selector":{id:"fork-dm-1",info:'Adds a "Copy Selector" option to context menus when developer mode is active',implemented:!0,hidden:!1,cat:"core",category:"developer settings"},"Disable BetterDiscord":{id:"bd-disable",info:"Disable Betterdiscord (plugins, themes, etc) (Not implemented).",implemented:!1,hidden:!1,cat:"lightcord",category:"Lightcord"},"Blur Personal Information":{id:"lightcord-6",info:"Blur sensitive informations like email, payment infos and more.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Calling Ring Beat":{id:"lightcord-2",info:"Enable Discord's special calling beat.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Developer Options":{id:"lightcord-1",info:'Enable Discord\'s & Lightcord\'s Internal Developer Options. This allow the "Experiments" tab, the "Developer Options" tab and the "Lightcord Api" section.',implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Ad Block":{id:"lightcord-4",info:"Block any BOT that dms you with an invite link. Even in an embed.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Enable Lightcord Servers":{id:"lightcord-5",info:"Enable Lightcord's servers. Disabling this will disable custom badges.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Disable typing":{id:"lightcord-7",info:"Don't let other see you're typing.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Lightcord Tabs":{id:"lightcord-8",info:"Allows you to launch multiple instances of Lightcord in the same window.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord",experimental:!0},"Use Notification Shim":{id:"lightcord-10",info:"Basically don't use Windows's Notifications.",implemented:!0,hidden:"win32"!==process.platform,cat:"lightcord",category:"Lightcord",experimental:!1},"Always-on-Top":{id:"lightcord-3",info:"Enable the window's Always-on-Top mode, where Lightcord stays on top of other applications.",implemented:!0,hidden:!1,cat:"lightcord",category:"Window"},"No Window Bounds":{id:"no_window_bound",info:"Disable Window Bounds. Can be useful if you use a window manager.",implemented:!0,hidden:"linux"!==process.platform,cat:"lightcord",category:"Window"},"Enable Glasstron":{id:"enable_glasstron",info:"Enable Glasstron. If you're not using transparent themes, this can reduce lag.",implemented:!0,hidden:!1,cat:"lightcord",category:"Window"},Enable:{id:"lightcord-presence-1",info:"Enable RichPresence below.",implemented:!0,hidden:!1,cat:"status"}},d={"bda-gs-1":!0,"bda-gs-2":!1,"bda-gs-3":!1,"bda-gs-4":!1,"bda-gs-5":!0,"bda-gs-6":!1,"bda-gs-7":!1,"bda-gs-8":!1,"bda-es-0":!0,"bda-es-1":!0,"bda-es-2":!0,"bda-es-4":!1,"bda-es-6":!0,"bda-es-7":!0,"bda-gs-b":!1,"bda-es-8":!0,"bda-dc-0":!1,"bda-css-0":!1,"bda-css-1":!1,"bda-es-9":!0,"fork-dm-1":!1,"fork-ps-1":!0,"fork-ps-2":!0,"fork-ps-3":!0,"fork-ps-4":!0,"fork-ps-5":!0,"fork-ps-6":!0,"fork-ps-7":!1,"fork-es-2":!1,"fork-es-3":!0,"fork-wp-1":!1,"fork-wp-2":!1,"fork-beta":!0,"lightcord-1":!1,"lightcord-2":!0,"lightcord-presence-1":!1,"lightcord-3":!1,"lightcord-4":!1,"lightcord-5":!0,"lightcord-6":!0,"lightcord-7":!1,"lightcord-8":!1,"lightcord-9":!1,"lightcord-10":!1,no_window_bound:!1},h={},u={},p={name:"Lightcord",application_id:"711416957718757418",state:"Lightcord Client",details:"Browsing Discord","timestamps.start":Date.now(),"assets.small":null,"assets.large":"712323821037682791"},m={},g={},f=[],b=[],y=Object.create(BetterDiscordConfig),v={},w={},C={},E={},S=webpackJsonp.push([[],{__extra_id__:(e,t,n)=>e.exports=n},[["__extra_id__"]]]);delete S.m.__extra_id__,delete S.c.__extra_id__;const x=e=>{for(const t in S.c)if(S.c.hasOwnProperty(t)){const n=S.c[t].exports;if(n&&n.__esModule&&n.default&&e(n.default))return n.default;if(n&&e(n))return n}return null};let k={find:x,findAll:e=>{const t=[];for(const n in S.c)if(S.c.hasOwnProperty(n)){const s=S.c[n].exports;s&&s.__esModule&&s.default&&e(s.default)?t.push(s.default):s&&e(s)&&t.push(s)}return t},findByProps:(...e)=>x(t=>e.every(e=>void 0!==t[e])),findByPrototypes:(...e)=>x(t=>t.prototype&&e.every(e=>void 0!==t.prototype[e])),findByDisplayName:e=>x(t=>t.displayName===e)};var D=k;window.Lightcord.BetterDiscord.WebpackModules=k;const M=window.require,B=n(2),N=n(1),L=DiscordNative.globals?DiscordNative.globals.releaseChannel:DiscordNative.app?DiscordNative.app.getReleaseChannel():"stable";let A="";A="win32"===process.platform?process.env.APPDATA:"darwin"===process.platform?N.join(process.env.HOME,"Library","Preferences"):process.env.XDG_CONFIG_HOME?process.env.XDG_CONFIG_HOME:N.join(process.env.HOME,".config"),A=N.join(A,"BetterDiscord");var P=new class{constructor(){this.data={settings:{stable:{},canary:{},ptb:{}}},this.pluginData={},window.Lightcord.BetterDiscord.DataStore=this}initialize(){try{B.existsSync(this.BDFile)||B.writeFileSync(this.BDFile,JSON.stringify(this.data,null,4),"utf-8");const e=JSON.parse(B.readFileSync(this.BDFile,"utf-8"));if(e.hasOwnProperty("settings")&&(this.data=e),!B.existsSync(this.settingsFile))return;let t=M(this.settingsFile);B.unlinkSync(this.settingsFile),t=t.hasOwnProperty("settings")?Object.assign({stable:{},canary:{},ptb:{}},{[L]:t}):Object.assign({stable:{},canary:{},ptb:{}},t),this.setBDData("settings",t)}catch(e){console.error(e),Ne.alert("Corrupt Storage","The bd storage has somehow become corrupt. You may either try to salvage the file or delete it then reload.")}}get injectionPath(){return this._injectionPath=null}get configFile(){return this._configFile||(this._configFile=N.resolve(this.injectionPath,"betterdiscord","config.json"))}get BDFile(){return this._BDFile||(this._BDFile=N.resolve(A,"bdstorage.json"))}get settingsFile(){return this._settingsFile||(this._settingsFile=N.resolve(A,"bdsettings.json"))}getPluginFile(e){return N.resolve(xe.pluginsFolder,e+".config.json")}getSettingGroup(e){return this.data.settings[L][e]||null}setSettingGroup(e,t){this.data.settings[L][e]=t,B.writeFileSync(this.BDFile,JSON.stringify(this.data,null,4),"utf-8")}getBDData(e){return this.data[e]||""}setBDData(e,t){this.data[e]=t,B.writeFileSync(this.BDFile,JSON.stringify(this.data,null,4),"utf-8")}getPluginData(e,t){return void 0!==this.pluginData[e]?this.pluginData[e][t]:B.existsSync(this.getPluginFile(e))?(this.pluginData[e]=JSON.parse(B.readFileSync(this.getPluginFile(e))),this.pluginData[e][t]):void 0}setPluginData(e,t,n){void 0!==n&&(void 0===this.pluginData[e]&&(this.pluginData[e]={}),this.pluginData[e][t]=n,B.writeFileSync(this.getPluginFile(e),JSON.stringify(this.pluginData[e],null,4),"utf-8"))}deletePluginData(e,t){void 0===this.pluginData[e]&&(this.pluginData[e]={}),delete this.pluginData[e][t],B.writeFileSync(this.getPluginFile(e),JSON.stringify(this.pluginData[e],null,4),"utf-8")}};const T=n(5);var R=new class extends T{constructor(){super(),window.Lightcord.BetterDiscord.BDEvents=this}dispatch(e,...t){this.emit(e,...t)}off(e,t){this.removeListener(e,t)}};class O{constructor(){window.Lightcord.BetterDiscord.PluginModule=this}get folder(){return xe.pluginsFolder}}O.prototype.loadPlugins=async function(){this.loadPluginData(),f.splice(0,0,...await xe.loadPlugins());const e=Object.keys(w);for(let t=0;tsetTimeout(e,10))}this.savePluginData(),n(0).remote.getCurrentWebContents().on("did-navigate-in-page",this.channelSwitch.bind(this))},O.prototype.startPlugin=function(e,t=!1){try{w[e].plugin.start(),h["fork-ps-2"]&&!t&&Ne.showToast(`${w[e].plugin.getName()} v${w[e].plugin.getVersion()} has started.`)}catch(n){h["fork-ps-2"]&&!t&&Ne.showToast(`${w[e].plugin.getName()} v${w[e].plugin.getVersion()} could not be started.`,{type:"error"}),C[e]=!1,this.savePluginData(),Ne.err("Plugins",e+" could not be started.",n)}},O.prototype.stopPlugin=function(e,t=!1){try{w[e].plugin.stop(),h["fork-ps-2"]&&!t&&Ne.showToast(`${w[e].plugin.getName()} v${w[e].plugin.getVersion()} has stopped.`)}catch(n){h["fork-ps-2"]&&!t&&Ne.showToast(`${w[e].plugin.getName()} v${w[e].plugin.getVersion()} could not be stopped.`,{type:"error"}),Ne.err("Plugins",w[e].plugin.getName()+" could not be stopped.",n)}},O.prototype.enablePlugin=function(e,t=!1){C[e]||(C[e]=!0,this.savePluginData(),this.startPlugin(e,t))},O.prototype.enable=function(e,t=!1){return this.enablePlugin(e,t)},O.prototype.disablePlugin=function(e,t=!1){C[e]&&(C[e]=!1,this.savePluginData(),this.stopPlugin(e,t))},O.prototype.disable=function(e,t=!1){return this.disablePlugin(e,t)},O.prototype.togglePlugin=function(e){C[e]?this.disablePlugin(e):this.enablePlugin(e)},O.prototype.toggle=function(e,t=!1){return this.togglePlugin(e,t)},O.prototype.loadPlugin=async function(e){const t=await xe.loadContent(e,"plugin");if(t)return h["fork-ps-1"]&&Ne.showContentErrors({plugins:[t]}),h["fork-ps-2"]&&Ne.showToast(e+" could not be loaded.",{type:"error"}),Ne.err("ContentManager",e+" could not be loaded.",t);const n=Object.values(w).find(t=>console.log(t.filename,e)||t.filename==e).plugin;try{n.load&&"function"==typeof n.load&&n.load()}catch(e){h["fork-ps-1"]&&Ne.showContentErrors({plugins:[e]})}Ne.log("ContentManager",`${n.getName()} v${n.getVersion()} was loaded.`),h["fork-ps-2"]&&Ne.showToast(`${n.getName()} v${n.getVersion()} was loaded.`,{type:"success"}),R.dispatch("plugin-loaded",n.getName())},O.prototype.unloadPlugin=function(e){const t=Object.values(w).find(t=>t.filename==e)||w[e];if(!t)return;const n=t.plugin.getName();C[n]&&this.disablePlugin(n,!0);const s=xe.unloadContent(w[n].filename,"plugin");if(delete w[n],s)return h["fork-ps-1"]&&Ne.showContentErrors({plugins:[s]}),h["fork-ps-2"]&&Ne.showToast(n+" could not be unloaded. It may have not been loaded yet.",{type:"error"}),Ne.err("ContentManager",n+" could not be unloaded. It may have not been loaded yet.",s);Ne.log("ContentManager",n+" was unloaded."),h["fork-ps-2"]&&Ne.showToast(n+" was unloaded.",{type:"success"}),R.dispatch("plugin-unloaded",n)},O.prototype.delete=function(e){const t=Object.values(w).find(t=>t.filename==e)||w[e];if(!t)return;this.unloadPlugin(t.filename);const s=n(1).resolve(xe.pluginsFolder,t.filename);n(2).unlinkSync(s)},O.prototype.reloadPlugin=async function(e){const t=Object.values(w).find(t=>t.filename==e)||w[e];if(!t)return this.loadPlugin(e);const n=t.plugin.getName(),s=C[n];s&&this.stopPlugin(n,!0);const r=await xe.reloadContent(w[n].filename,"plugin");if(r)return h["fork-ps-1"]&&Ne.showContentErrors({plugins:[r]}),h["fork-ps-2"]&&Ne.showToast(n+" could not be reloaded.",{type:"error"}),Ne.err("ContentManager",n+" could not be reloaded.",r);w[n].plugin.load&&"function"==typeof w[n].plugin.load&&w[n].plugin.load(),s&&this.startPlugin(n,!0),Ne.log("ContentManager",`${n} v${w[n].plugin.getVersion()} was reloaded.`),h["fork-ps-2"]&&Ne.showToast(`${n} v${w[n].plugin.getVersion()} was reloaded.`,{type:"success"}),R.dispatch("plugin-reloaded",n)},O.prototype.reload=function(e){return this.reloadPlugin(e)},O.prototype.edit=function(e){console.log("Edit "+e);const t=Object.values(w).find(t=>t.filename==e)||w[e];if(!t)return;const s=n(1).resolve(xe.pluginsFolder,t.filename);console.log("Edit "+s),n(0).shell.openItem(""+s)},O.prototype.updatePluginList=function(){const e=xe.loadNewContent("plugin");for(const t of e.added)this.loadPlugin(t);for(const t of e.removed)this.unloadPlugin(t)},O.prototype.loadPluginData=function(){const e=P.getSettingGroup("plugins");e&&Object.assign(C,e)},O.prototype.savePluginData=function(){P.setSettingGroup("plugins",C)},O.prototype.newMessage=function(){const e=Object.keys(w);for(let t=0;t{if(this.disabled)return;this.show();const e=new MutationObserver(t=>{t.forEach(t=>{const n=Array.from(t.removedNodes),s=n.indexOf(this.node)>-1,r=n.some(e=>e.contains(this.node));(s||r)&&(this.hide(),e.disconnect())})});e.observe(document.body,{subtree:!0,childList:!0})}),this.node.addEventListener("mouseleave",()=>{this.hide()}))}get container(){return document.querySelector("."+Ne.removeDa(BDModules.get(e=>e.popouts)[0].popouts)+" ~ ."+Ne.removeDa(BDModules.get(e=>e.layerContainer)[0].layerContainer))}get canShowAbove(){return this.node.getBoundingClientRect().top-this.element.offsetHeight>=0}get canShowBelow(){return this.node.getBoundingClientRect().top+this.node.offsetHeight+this.element.offsetHeight<=Ne.screenHeight}get canShowLeft(){return this.node.getBoundingClientRect().left-this.element.offsetWidth>=0}get canShowRight(){return this.node.getBoundingClientRect().left+this.node.offsetWidth+this.element.offsetWidth<=Ne.screenWidth}hide(){this.element.remove(),this.tooltipElement.className=this._className}show(){this.tooltipElement.className=`${U().tooltip} ${q(this.style)}`,this.labelElement.textContent=this.label,this.container.append(this.element),"top"==this.side&&(this.canShowAbove||!this.canShowAbove&&this.preventFlip?this.showAbove():this.showBelow()),"bottom"==this.side&&(this.canShowBelow||!this.canShowBelow&&this.preventFlip?this.showBelow():this.showAbove()),"left"==this.side&&(this.canShowLeft||!this.canShowLeft&&this.preventFlip?this.showLeft():this.showRight()),"right"==this.side&&(this.canShowRight||!this.canShowRight&&this.preventFlip?this.showRight():this.showLeft())}showAbove(){this.tooltipElement.classList.add(q("top")),this.element.style.setProperty("top",V(this.node.getBoundingClientRect().top-this.element.offsetHeight-10)),this.centerHorizontally()}showBelow(){this.tooltipElement.classList.add(q("bottom")),this.element.style.setProperty("top",V(this.node.getBoundingClientRect().top+this.node.offsetHeight+10)),this.centerHorizontally()}showLeft(){this.tooltipElement.classList.add(q("left")),this.element.style.setProperty("left",V(this.node.getBoundingClientRect().left-this.element.offsetWidth-10)),this.centerVertically()}showRight(){this.tooltipElement.classList.add(q("right")),this.element.style.setProperty("left",V(this.node.getBoundingClientRect().left+this.node.offsetWidth+10)),this.centerVertically()}centerHorizontally(){const e=this.node.getBoundingClientRect().left+this.node.offsetWidth/2;this.element.style.setProperty("left",V(e-this.element.offsetWidth/2))}centerVertically(){const e=this.node.getBoundingClientRect().top+this.node.offsetHeight/2;this.element.style.setProperty("top",V(e-this.element.offsetHeight/2))}}var Z=class extends React.Component{constructor(e){super(e)}async componentDidMount(){const{style:e="black",side:t="top",text:n=""}=this.props;this.node=Be.reactDom.findDOMNode(this),this.tooltip=new J(this.node,n,{style:e,side:t})}componentWillUnmount(){this.tooltip.hide(),delete this.tooltip}render(){return this.props.children}},K=n(2),Y=n(1);const X={},Q={};var ee=new class{constructor(){window.Lightcord.BetterDiscord.PluginCertifier=this}patch(e,t){process.nextTick(()=>{!function(e,t){if(!document.getElementById(t))return;if(!e.url.startsWith("https://cdn.discordapp.com/"))return document.getElementById(t).remove();if(!e.filename.endsWith(".plugin.js")&&!e.filename.endsWith(".theme.css"))return document.getElementById(t).remove();I()(e.url,{headers:{"User-Agent":$.remote.getCurrentWebContents().userAgent}}).then(n=>{if(200!==n.status)throw new Error("File doesn't exist.");const s=W.createHash("sha256");let r=Buffer.alloc(0);n.body.on("data",e=>{r=Buffer.concat([r,e]),s.update(e)}),n.body.on("end",()=>{const n=s.digest("hex");Q[e.url]=n,re[n]=e.url,oe(n,r,e.filename,n=>{!function(e,t,n){const s=document.getElementById(e);if(!s||s.childNodes.length>0)return;ae||(ae=BDModules.get(e=>e.flowerStarContainer)[0]);le||(le=BDModules.get(e=>e.childContainer)[0]);if(t.suspect){try{s.parentNode.style.borderColor="rgb(240, 71, 71)";let e=s=>{for(let r of s.children)"A"===r.tagName?r.addEventListener("click",e=>{e.preventDefault(),e.stopImmediatePropagation(),Ne.showConfirmationModal("Are you sure you want to download this ?","The "+t.type.toLowerCase()+" **"+n+"** might be dangerous **("+t.harm+")**. \n\n**We don't recommand to download it**. However, you can still do it below.",{confirmText:"Download Anyway",cancelText:"Don't !",danger:!0,onCancel:()=>{},onConfirm:()=>{$.remote.shell.openExternal(r.href)}})}):["div"].includes(r.tagName.toLowerCase())&&e(r)};e(s.parentNode)}catch(e){console.error(e)}Be.reactDom.render(Be.react.createElement(Z,{text:t.type+" "+t.name+" is potentially dangerous."},Be.react.createElement("div",{className:ae.flowerStarContainer,style:{width:"20px",height:"20px"}},Be.react.createElement("svg",{className:BDModules.get(e=>e.svg)[0].svg,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 40 32"},Be.react.createElement("rect",{x:"0",y:"0",width:"32",height:"32",mask:"url(#svg-mask-avatar-status-round-32)",fill:"#f04747",mask:"url(#svg-mask-status-dnd)",className:BDModules.get(e=>e.pointerEvents)[0].pointerEvents})))),s)}else if(t.official){s.parentNode.style.borderColor="#4087ed";let e=Be.react.createElement("span",{style:{display:"inherit"}},[Be.react.createElement(Z,{text:t.type+" "+t.name+" was made by the developers of Lightcord.",style:"brand"},Be.react.createElement("div",{className:ae.flowerStarContainer,style:{width:"20px",height:"20px",float:"left"}},Be.react.createElement("svg",{className:ae.flowerStar,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 16 15.2",stroke:"#36393f",style:{color:"#4087ed"}},Be.react.createElement("path",{fill:"currentColor","fill-rule":"evenodd",d:"m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"})),Be.react.createElement("div",{className:le.childContainer},Be.react.createElement("svg",{"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 16 15.2"},Be.react.createElement("path",{fill:"#ffffff",d:"M10.7,5.28a2.9,2.9,0,0,0-2.11.86.11.11,0,0,0,0,.16l1.05.94a.11.11,0,0,0,.15,0,1.27,1.27,0,0,1,.9-.33c.65,0,.65.73.65.73a.64.64,0,0,1-.65.65,1.73,1.73,0,0,1-1.18-.54c-.31-.26-.36-.32-.73-.66S7.06,5.28,5.65,5.28A2.26,2.26,0,0,0,3.37,7.56,2.59,2.59,0,0,0,3.82,9a2.18,2.18,0,0,0,1.83.89,2.94,2.94,0,0,0,2.1-.81.11.11,0,0,0,0-.16L6.74,8A.11.11,0,0,0,6.6,8a1.58,1.58,0,0,1-.94.29h0A.71.71,0,0,1,5,7.56H5a.63.63,0,0,1,.65-.64c.71,0,1.42.75,1.94,1.27.75.76,1.66,1.79,3.11,1.74A2.28,2.28,0,0,0,13,7.64a2.59,2.59,0,0,0-.45-1.47A2.14,2.14,0,0,0,10.7,5.28Z"}))))),Be.react.createElement(Z,{text:"Install this "+t.type.toLowerCase()+" on Lightcord."},Be.react.createElement("div",{className:ae.flowerStarContainer,style:{width:"20px",height:"20px"},onClick(){Ne.showConfirmationModal("Are you sure you want to download this "+t.type.toLowerCase()+" ?","Lightcord will automatically download and load this "+t.type.toLowerCase()+". You must enable it in the settings.",{confirmText:"Download and Install",cancelText:"I've changed my mind",danger:!1,onCancel:()=>{},onConfirm:()=>{let e=ce(Q).find(e=>e[1]===t.hash)[0];I()(e).then(async e=>{if(200!==e.status)throw new Error("Status was not 200");let n=await e.buffer(),s=Object(Y.join)("Plugin"===t.type?xe._pluginsFolder:xe._themesFolder,t.filename);Object(K.writeFileSync)(s,n),Ne.showToast(t.type+" succesfully installed.")}).catch(e=>{e=e instanceof Error?e:new Error(e),Ne.showToast(e.message,{type:"error"})})}})}},Be.react.createElement("svg",{className:ae.flowerStar,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 24 24",style:{color:"rgb(67, 181, 129)",cursor:"pointer"}},React.createElement("g",{fill:"none","fill-rule":"evenodd"},React.createElement("path",{d:"M0 0h24v24H0z"}),React.createElement("path",{class:"fill",fill:"currentColor",d:"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"})))))]);Be.reactDom.render(e,s)}else{s.parentNode.style.borderColor="#4087ed";let e=Be.react.createElement("span",{style:{display:"inherit"}},[Be.react.createElement(Z,{text:t.type+" "+t.name+" is certified by Lightcord."},Be.react.createElement("div",{className:ae.flowerStarContainer,style:{width:"20px",height:"20px",float:"left"}},Be.react.createElement("svg",{className:ae.flowerStar,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 16 15.2"},Be.react.createElement("path",{fill:"#4f545c","fill-rule":"evenodd",d:"m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"})),Be.react.createElement("div",{className:le.childContainer},Be.react.createElement("svg",{"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 16 15.2"},Be.react.createElement("path",{fill:"#ffffff",d:"M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z"}))))),Be.react.createElement(Z,{text:"Install this "+t.type.toLowerCase()+" on Lightcord."},Be.react.createElement("div",{className:ae.flowerStarContainer,style:{width:"20px",height:"20px"},onClick(){Ne.showConfirmationModal("Are you sure you want to download this "+t.type.toLowerCase()+" ?","Lightcord will automatically install and launch this "+t.type.toLowerCase()+". You don't have anything to do.",{confirmText:"Download and Install",cancelText:"I've changed my mind",danger:!1,onCancel:()=>{},onConfirm:()=>{let e=ce(Q).find(e=>e[1]===t.hash)[0];console.log(e),I()(e).then(async e=>{if(200!==e.status)throw new Error("Status was not 200");let n=await e.buffer(),s=Object(Y.join)("Plugin"===t.type?xe._pluginsFolder:xe._themesFolder,t.filename);console.log(s),Object(K.writeFileSync)(s,n),Ne.showToast(t.type+" succesfully installed.")}).catch(e=>{e=e instanceof Error?e:new Error(e),Ne.showToast(e.message,{type:"error"})})}})}},Be.react.createElement("svg",{className:ae.flowerStar,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 24 24",style:{color:"rgb(67, 181, 129)",cursor:"pointer"}},React.createElement("g",{fill:"none","fill-rule":"evenodd"},React.createElement("path",{d:"M0 0h24v24H0z"}),React.createElement("path",{class:"fill",fill:"currentColor",d:"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"})))))]);Be.reactDom.render(e,s)}}(t,n,e.filename)},()=>{let e=document.getElementById(t);e&&e.remove()})})}).catch(()=>{})}(e,t)})}start(){}isTrusted(e){return X[e]&&!X[e].suspect}};const te=[[/token/gi,0],[/email/gi,0],[/mfa/gi,0],[/2fa/gi,0],[/phone/gi,0],[/child_process/gi,0],[/localStorage/gi,0],[/getGlobal/gi,0],[/BrowserWindow/gi,0],[/\.exe/gi,0],[/eval/gi,0],[/WebAssembly/gi,0],[/XMLHttpRequest(\.|\[["'`])prototype/gi,0],[/window\.fetch( +)?=/gi,0],[/(["'`]\+)["'`]\w["'`]/gi,1],[/["'`]\w["'`](\+["'`])/gi,1],[/\${["'`]\w+["'`]}/gi,1],[/_0x\w{4}\('0x[\dabcdef]+'\)/g,1],[/_0x\w{4}\('0x[\dabcdef]+'( +)?,( +)?'[^']{4}'\)/g,1],[/\w+\('0x[\dabcdef]+'\)/g,1],[/\w+\('0x[\dabcdef]+'( +)?,( +)?'[^']{4}'\)/g,1],[/^var [\w\d_$]+=\["/gi,1]],ne=["Account Stealer/Virus","Obfuscation/Hidden code"];function se(e,t,n,s,r){let o=!1;const i=(t=t.toString("utf8")).replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm,"").trim();for(const[e,n]of te){const s=1===n?i:t;if(e.exec(s)){o=ne[n];break}}if(!o)return s(e);X[e]={suspect:!0,name:re[e].split("/").pop(),type:re[e].endsWith(".js")?"Plugin":"Theme",harm:o,hash:e,filename:r},console.log(`Found potentially dangerous ${X[e].type.toLowerCase()}: ${X[e].name}`),n(X[e])}const re={};function oe(e,t,n,s,r){if(console.log(`File: ${n} hash: ${e}`),X[e]){const t=X[e];s(t)}else I()("https://cdn.jsdelivr.net/gh/Lightcord/filehashes@master/hashes/"+e,{headers:{"User-Agent":$.remote.getCurrentWebContents().userAgent}}).then(async o=>{if(200!==o.status){if(n.endsWith(".theme.css"))return r(e);try{se(e,t,s,r,n)}catch(e){console.error(e),r()}return}const i=await o.json();i.hash=e,i.filename=n,X[e]=i,s(i)}).catch(o=>{if(console.error("Could not read from github. "+o),n.endsWith(".theme.css"))return r(e);se(e,t,s,r,n)})}function ie(e,t,n=(e=>{}),s=!1){const r=W.createHash("sha256");let o=Buffer.alloc(0);Object(K.createReadStream)(e).on("data",e=>{o=Buffer.concat([o,e]),r.update(e)}).on("end",()=>{const i=r.digest("hex");if(re[i]=e,s&&Ee[i]){let e=Ee[i];if(!(e.timestampe.flowerStarContainer)[0],le=BDModules.get(e=>e.childContainer)[0];function ce(e){let t=[];return Object.keys(e).forEach(n=>{t.push([n,e[n]])}),t}let de=null,he=null;function ue(){de=[W.randomBytes(16).toString("base64"),W.randomBytes(32).toString("base64")]}function pe(e){let t=[Buffer.from(de[1],"base64"),Buffer.from(de[0],"base64")],n=W.createCipheriv("aes-256-cbc",...t),s=n.update(Buffer.from(e,"utf8"));return s=Buffer.concat([s,n.final()]),s.toString("base64")}window.Lightcord.Api.ensureExported(e=>e.ObjectStorage).then(e=>{let t=e.impl;he=function(){t.set("PluginCertifierKeyEncryption__",btoa(JSON.stringify(de)))},setInterval(()=>{he()},1e5);try{let e=function(e){try{return JSON.parse(e)}catch(e){return e instanceof Error?new Error(e):e}}(atob(t.get("PluginCertifierKeyEncryption__")));if(e instanceof Error||!Array.isArray(e)||2!==e.length||e.find(e=>"string"!=typeof e)||16!==Buffer.from(e[0],"base64").length||32!==Buffer.from(e[1],"base64").length)return ue(),void he();de=e}catch(e){ue(),he()}});const me=n(1),ge=n(2),fe=n(6).Module;fe.globalPaths.push(me.resolve(n(0).remote.app.getAppPath(),"node_modules"));class be extends Error{constructor(e){super(e),this.name="MetaError"}}const ye=fe._extensions[".js"],ve=fe._extensions[".css"]?fe._extensions[".css"]:()=>null,we=/[^\S\r\n]*?(?:\r\n|\n)[^\S\r\n]*?\*[^\S\r\n]?/,Ce=/^\\@/;let Ee={},Se=!1;var xe=new class{constructor(){this.timeCache={},this.watchers={}}patchExtensions(){Se||(Se=!0,fe._extensions[".js"]=this.getContentRequire("plugin"),fe._extensions[".css"]=this.getContentRequire("theme"))}get pluginsFolder(){return this._pluginsFolder||(this._pluginsFolder=ge.realpathSync(me.resolve(y.dataPath+"plugins/")))}get themesFolder(){return this._themesFolder||(this._themesFolder=ge.realpathSync(me.resolve(y.dataPath+"themes/")))}loadAddonCertifierCache(){if("string"!=typeof P.getSettingGroup("PluginCertifierHashes"))P.setSettingGroup("PluginCertifierHashes",pe("{}"));else try{Ee=JSON.parse(function(e){try{let t=W.createDecipheriv("aes-256-cbc",Buffer.from(de[1],"base64"),Buffer.from(de[0],"base64")),n=t.update(Buffer.from(e,"base64"));return n=Buffer.concat([n,t.final()]),n.toString("utf8")}catch(e){return"{}"}}(P.getSettingGroup("PluginCertifierHashes")))}catch(e){P.setSettingGroup("PluginCertifierHashes",pe("{}")),Ee={}}Object.keys(Ee).forEach(e=>{let t=Ee[e];if(!t||"object"!=typeof t||Array.isArray(t))return delete Ee[e];let n=[{key:"timestamp",type:"number"},{key:"result",type:"object"},{key:"hash",type:"string"}];for(let s of n)if(!(s.key in t)||typeof t[s.key]!==s.type)return void delete Ee[e];t.hash===e?t.result.suspect&&delete Ee[e]:delete Ee[e]}),this.saveAddonCache()}saveAddonCache(){P.setSettingGroup("PluginCertifierHashes",pe(JSON.stringify(Ee)))}watchContent(e){if(this.watchers[e])return;const t="plugin"===e,n=t?this.pluginsFolder:this.themesFolder,s=t?".plugin.js":".theme.css";this.watchers[e]=ge.watch(n,{persistent:!1},async(e,r)=>{if(!e||!r||!r.endsWith(s))return;await new Promise(e=>setTimeout(e,50));try{ge.statSync(me.resolve(n,r))}catch(e){if("ENOENT"!==e.code)return;return delete this.timeCache[r],t?j.unloadPlugin(r):Me.unloadTheme(r)}if(!ge.statSync(me.resolve(n,r)).isFile())return;const o=ge.statSync(me.resolve(n,r));o&&o.mtime&&o.mtime.getTime()&&"number"==typeof o.mtime.getTime()&&this.timeCache[r]!=o.mtime.getTime()&&(this.timeCache[r]=o.mtime.getTime(),"rename"==e&&(t?await j.loadPlugin(r):await Me.loadTheme(r)),"change"==e&&(t?await j.reloadPlugin(r):await Me.reloadTheme(r)))})}unwatchContent(e){this.watchers[e]&&(this.watchers[e].close(),delete this.watchers[e])}extractMeta(e){const t=e.split("\n")[0];if(t.includes("//META"))return this.parseOldMeta(e);if(t.includes("/**"))return this.parseNewMeta(e);throw new be("META was not found.")}parseOldMeta(e){const t=e.split("\n")[0],n=t.substring(t.lastIndexOf("//META")+6,t.lastIndexOf("*//"));if(t.indexOf("META")<0)throw new be("META was not found.");const s=Ne.testJSON(n);if(!s)throw new be("META could not be parsed.");if(!s.name)throw new be("META missing name data.");return s.format="json",s}parseNewMeta(e){const t=e.split("/**",2)[1].split("*/",1)[0],n={};let s="",r="";for(const e of t.split(we))if(0!==e.length)if("@"===e.charAt(0)&&" "!==e.charAt(1)){n[s]=r;const t=e.indexOf(" ");s=e.substr(1,t-1),r=e.substr(t+1)}else r+=" "+e.replace("\\n","\n").replace(Ce,"@");return n[s]=r.trim(),delete n[""],n.format="jsdoc",n}getContentRequire(e){const t="plugin"===e,n=this,s=t?ye:ve;return function(e,r){const o=t?n.pluginsFolder:n.themesFolder,i=me.resolve(o,me.basename(r));if(!ge.existsSync(i)||r!==ge.realpathSync(i))return Reflect.apply(s,this,arguments);let a=ge.readFileSync(r,"utf8");a=Ne.stripBOM(a);const l=ge.statSync(r),c=n.extractMeta(a);if(c.filename=me.basename(r),c.added=l.atimeMs,c.modified=l.mtimeMs,c.size=l.size,t||(c.css=a,"json"==c.format&&(c.css=c.css.split("\n").slice(1).join("\n")),a=`module.exports = ${JSON.stringify(c)};`),t){e._compile(a,e.filename);!Ne.isEmpty(e.exports)?(c.type=e.exports,e.exports=c,a=""):(Ne.warn("Module Not Exported",c.name+", please start setting module.exports"),a+=`\nmodule.exports = ${JSON.stringify(c)};\nmodule.exports.type = ${c.exports||c.name};`)}e._compile(a,r)}}makePlaceholderPlugin(e){return{plugin:{start:()=>{},getName:()=>e.name||e.filename,getAuthor:()=>"???",getDescription:()=>e.message?e.message:"This plugin was unable to be loaded. Check the author's page for updates.",getVersion:()=>"???"},name:e.name||e.filename,filename:e.filename,source:e.source?e.source:"",website:e.website?e.website:""}}async loadContent(e,t){if(void 0===e||void 0===t)return;const n="plugin"===t,s=n?this.pluginsFolder:this.themesFolder;if(h["fork-ps-6"]){let t=await new Promise(t=>{ie(me.resolve(s,e),e=>{console.log(e),t(e)},n=>{t({suspect:!1,hash:n,filename:e,name:e})},!0)});if(t&&(Ee[t.hash]={timestamp:Date.now(),hash:t.hash,result:t},this.saveAddonCache(),t.suspect))return{name:e,file:e,message:"This plugin might be dangerous ("+t.harm+").",error:new Error("This plugin might be dangerous ("+t.harm+").")}}try{window.require(me.resolve(s,e))}catch(t){return{name:e,file:e,message:"Could not be compiled.",error:{message:t.message,stack:t.stack}}}const r=window.require(me.resolve(s,e));if(!r.name)return{name:e,file:e,message:"Cannot escape the ID.",error:new Error("Cannot read property 'replace' of undefined")};if(r.id=Ne.escapeID(r.name),n){if(!r.type)return;try{r.plugin=new r.type,delete w[r.plugin.getName()],w[r.plugin.getName()]=r}catch(t){return{name:e,file:e,message:"Could not be constructed.",error:{message:t.message,stack:t.stack}}}}else delete v[r.name],v[r.name]=r}unloadContent(e,t){if(void 0===e||void 0===t)return;const n="plugin"===t?this.pluginsFolder:this.themesFolder;try{delete window.require.cache[window.require.resolve(me.resolve(n,e))]}catch(t){return{name:e,file:e,message:"Could not be unloaded.",error:{message:t.message,stack:t.stack}}}}isLoaded(e,t){const n="plugin"===t?this.pluginsFolder:this.themesFolder;try{window.require.cache[window.require.resolve(me.resolve(n,e))]}catch(e){return!1}return!0}async reloadContent(e,t){const n=this.unloadContent(e,t);return n||await this.loadContent(e,t)}loadNewContent(e){const t="plugin"===e,n=t?".plugin.js":".theme.css",s=t?this.pluginsFolder:this.themesFolder,r=ge.readdirSync(s),o=Object.values(t?w:v),i=o.filter(e=>!r.includes(e.filename)).map(e=>t?e.plugin.getName():e.name);return{added:r.filter(e=>!o.find(t=>t.filename==e)&&e.endsWith(n)&&ge.statSync(me.resolve(s,e)).isFile()),removed:i}}async loadAllContent(e){this.patchExtensions();const t="plugin"===e,n=t?".plugin.js":".theme.css",s=t?this.pluginsFolder:this.themesFolder,r=[],o=ge.readdirSync(s);for(const t of o){if(!ge.statSync(me.resolve(s,t)).isFile()||!t.endsWith(n))continue;const o=await this.loadContent(t,e);o&&r.push(o)}return r}loadPlugins(){return this.loadAllContent("plugin")}loadThemes(){return this.loadAllContent("theme")}};class ke{static escapeID(e){return e.replace(/^[^a-z]+|[^\w-]+/gi,"-")}static addStyle(e,t){document.head.append(ke.createElement(``))}static removeStyle(e){const t=document.getElementById(e);t&&t.remove()}static addScript(e,t){return new Promise(n=>{const s=document.createElement("script");s.id=e,s.src=t,s.type="text/javascript",s.onload=n,document.head.append(s)})}static removeScript(e){e=this.escapeID(e);const t=document.getElementById(e);t&&t.remove()}static animate({timing:e=(e=>e),update:t,duration:n}){const s=performance.now();requestAnimationFrame((function r(o){let i=(o-s)/n;i>1&&(i=1);const a=e(i);t(a),i<1&&requestAnimationFrame(r)}))}static Q(e){const t=this.parseHTML(e);return(t instanceof NodeList?Array.from(t).some(e=>1===e.nodeType):1===t.nodeType)?t:this.query(e)}static query(e,t=document){return t.querySelector(e)}static queryAll(e,t=document){return t.querySelectorAll(e)}static parseHTML(e,t=!1){const n=document.createElement("template");n.innerHTML=e;const s=n.content.cloneNode(!0);return t?s:s.childNodes.length>1?s.childNodes:s.childNodes[0]}static createElement(e,t=!1){return this.parseHTML(e,t)}static escapeHTML(e){const t=document.createTextNode(""),n=document.createElement("span");return n.append(t),t.nodeValue=e,n.innerHTML}static addClass(e,...t){t=t.flat().filter(e=>e);for(let e=0;ee),e.classList.add(...t),e}static removeClass(e,...t){for(let e=0;ee),e.classList.remove(...t),e}static toggleClass(e,t,n){return t=t.toString().split(" ").filter(e=>e),void 0!==n?t.forEach(t=>e.classList.toggle(t,n)):t.forEach(t=>e.classList.toggle(t)),e}static hasClass(e,t){return t.toString().split(" ").filter(e=>e).every(t=>e.classList.contains(t))}static replaceClass(e,t,n){return e.classList.replace(t,n),e}static appendTo(e,t){return"string"==typeof t&&(t=this.query(t)),t?(t.append(e),e):null}static prependTo(e,t){return"string"==typeof t&&(t=this.query(t)),t?(t.prepend(e),e):null}static insertAfter(e,t){return t.parentNode.insertBefore(e,t.nextSibling),e}static after(e,t){return e.parentNode.insertBefore(t,e.nextSibling),e}static next(e,t=""){return t?e.querySelector("+ "+t):e.nextElementSibling}static nextAll(e){return e.querySelectorAll("~ *")}static nextUntil(e,t){const n=[];for(;e.nextElementSibling&&!e.nextElementSibling.matches(t);)n.push(e=e.nextElementSibling);return n}static previous(e,t=""){const n=e.previousElementSibling;return t?n&&n.matches(t)?n:null:n}static previousAll(e){const t=[];for(;e.previousElementSibling;)t.push(e=e.previousElementSibling);return t}static previousUntil(e,t){const n=[];for(;e.previousElementSibling&&!e.previousElementSibling.matches(t);)n.push(e=e.previousElementSibling);return n}static indexInParent(e){const t=e.parentNode.childNodes;let n=0;for(let s=0;s "+t)}static findChildren(e,t){return e.querySelectorAll(":scope > "+t)}static parents(e,t=""){const n=[];if(t)for(;e.parentElement&&e.parentElement.closest(t);)n.push(e=e.parentElement.closest(t));else for(;e.parentElement;)n.push(e=e.parentElement);return n}static parentsUntil(e,t){const n=[];for(;e.parentElement&&!e.parentElement.matches(t);)n.push(e=e.parentElement);return n}static siblings(e,t="*"){return Array.from(e.parentElement.children).filter(n=>n!=e&&n.matches(t))}static css(e,t,n){return void 0===n?global.getComputedStyle(e)[t]:(e.style[t]=n,e)}static width(e,t){return void 0===t?parseInt(getComputedStyle(e).width):(e.style.width=t,e)}static height(e,t){return void 0===t?parseInt(getComputedStyle(e).height):(e.style.height=t,e)}static text(e,t){return void 0===t?e.textContent:e.textContent=t}static innerWidth(e){return e.clientWidth}static innerHeight(e){return e.clientHeight}static outerWidth(e){return e.offsetWidth}static outerHeight(e){return e.offsetHeight}static offset(e){return e.getBoundingClientRect()}static get listeners(){return this._listeners||(this._listeners={})}static on(e,t,n,s){const[r,o]=t.split("."),i=n&&s;s||(s=n);const a=i?function(e){e.target.matches(n)&&s(e)}:s;e.addEventListener(r,a);const l=()=>{e.removeEventListener(r,a)};if(o){this.listeners[o]||(this.listeners[o]=[]);const t=()=>{l(),this.listeners[o].splice(this.listeners[o].findIndex(t=>t.event==r&&t.element==e),1)};return this.listeners[o].push({event:r,element:e,cancel:t}),t}return l}static once(e,t,n,s){const[r,o]=t.split("."),i=n&&s;s||(s=n);const a=i?function(t){t.target.matches(n)&&(s(t),e.removeEventListener(r,a))}:function(t){s(t),e.removeEventListener(r,a)};e.addEventListener(r,a);const l=()=>{e.removeEventListener(r,a)};if(o){this.listeners[o]||(this.listeners[o]=[]);const t=()=>{l(),this.listeners[o].splice(this.listeners[o].findIndex(t=>t.event==r&&t.element==e),1)};return this.listeners[o].push({event:r,element:e,cancel:t}),t}return l}static __offAll(e,t){const[n,s]=e.split(".");let r=e=>e.event==n,o=e=>e;t&&(r=e=>e.event==n&&e.element==t,o=e=>e.element==t);const i=this.listeners[s]||[],a=n?i.filter(r):i.filter(o);for(let e=0;e{this.observer.unsubscribe(s),t()};return this.observer.subscribe(s,t=>{const s=Array.from(n?t.addedNodes:t.removedNodes),r=s.indexOf(e)>-1,o=s.some(t=>t.contains(e));return r||o}),e}static onMount(e,t){return this.onMountChange(e,t)}static onUnmount(e,t){return this.onMountChange(e,t,!1)}static onAdded(e,t){return this.onMount(e,t)}static onRemoved(e,t){return this.onUnmount(e,t,!1)}static wrap(e){const t=this.parseHTML('
');for(let n=0;nsetTimeout(e,10))}for(const e in E)v[e]||delete E[e];this.saveThemeData()},De.prototype.enableTheme=function(e,t=!1){E[e]=!0,this.saveThemeData();const n=v[e];ke.addStyle(ke.escapeID(n.id),unescape(n.css)),R.dispatch("theme-enabled"),h["fork-ps-2"]&&!t&&Ne.showToast(`${n.name} v${n.version} has been applied.`)},De.prototype.enable=function(e,t=!1){return this.enableTheme(e,t)},De.prototype.disableTheme=function(e,t=!1){E[e]=!1,this.saveThemeData();const n=v[e];ke.removeStyle(ke.escapeID(n.id)),R.dispatch("theme-disabled"),h["fork-ps-2"]&&!t&&Ne.showToast(`${n.name} v${n.version} has been disabled.`)},De.prototype.disable=function(e,t=!1){return this.disableTheme(e,t)},De.prototype.toggleTheme=function(e){E[e]?this.disableTheme(e):this.enableTheme(e)},De.prototype.toggle=function(e){return this.toggleTheme(e)},De.prototype.loadTheme=async function(e){const t=await xe.loadContent(e,"theme");if(t)return h["fork-ps-1"]&&Ne.showContentErrors({themes:[t]}),h["fork-ps-2"]&&Ne.showToast(e+" could not be loaded. It may not have been loaded.",{type:"error"}),Ne.err("ContentManager",e+" could not be loaded.",t);const n=Object.values(v).find(t=>t.filename==e);Ne.log("ContentManager",`${n.name} v${n.version} was loaded.`),h["fork-ps-2"]&&Ne.showToast(`${n.name} v${n.version} was loaded.`,{type:"success"}),R.dispatch("theme-loaded",n.name)},De.prototype.unloadTheme=function(e){const t=Object.values(v).find(t=>t.filename==e)||v[e];if(!t)return;const n=t.name;E[n]&&this.disableTheme(n,!0);const s=xe.unloadContent(v[n].filename,"theme");if(delete v[n],s)return h["fork-ps-1"]&&Ne.showContentErrors({themes:[s]}),h["fork-ps-2"]&&Ne.showToast(n+" could not be unloaded. It may have not been loaded yet.",{type:"error"}),Ne.err("ContentManager",n+" could not be unloaded. It may have not been loaded yet.",s);Ne.log("ContentManager",n+" was unloaded."),h["fork-ps-2"]&&Ne.showToast(n+" was unloaded.",{type:"success"}),R.dispatch("theme-unloaded",n)},De.prototype.delete=function(e){const t=Object.values(v).find(t=>t.filename==e)||v[e];if(!t)return;this.unloadTheme(t.filename);const s=n(1).resolve(xe.themesFolder,t.filename);n(2).unlinkSync(s)},De.prototype.reloadTheme=async function(e){const t=Object.values(v).find(t=>t.filename==e)||v[e];if(!t)return this.loadTheme(e);const n=t.name,s=await xe.reloadContent(v[n].filename,"theme");if(E[n]&&(this.disableTheme(n,!0),this.enableTheme(n,!0)),s)return h["fork-ps-1"]&&Ne.showContentErrors({themes:[s]}),h["fork-ps-2"]&&Ne.showToast(n+" could not be reloaded.",{type:"error"}),Ne.err("ContentManager",n+" could not be reloaded.",s);Ne.log("ContentManager",`${n} v${v[n].version} was reloaded.`),h["fork-ps-2"]&&Ne.showToast(`${n} v${v[n].version} was reloaded.`,{type:"success"}),R.dispatch("theme-reloaded",n)},De.prototype.reload=function(e){return this.reloadTheme(e)},De.prototype.edit=function(e){const t=Object.values(v).find(t=>t.filename==e)||v[e];if(!t)return;const s=n(1).resolve(xe.themesFolder,t.filename);n(0).shell.openItem(""+s)},De.prototype.updateThemeList=function(){const e=xe.loadNewContent("theme");for(const t of e.added)this.loadTheme(t);for(const t of e.removed)this.unloadTheme(t)},De.prototype.loadThemeData=function(){const e=P.getSettingGroup("themes");e&&Object.assign(E,e)},De.prototype.saveThemeData=function(){P.setSettingGroup("themes",E)};var Me=new De,Be=new class{constructor(){this.editorDetached=!1,this.WebpackModules=(()=>{const e=webpackJsonp.push([[],{__extra_id__:(e,t,n)=>e.exports=n},[["__extra_id__"]]]);delete e.m.__extra_id__,delete e.c.__extra_id__;const t=(e,t)=>{let n=t?e:e.default;if(!n)return e;if(n.remove&&n.set&&n.clear&&n.get&&!n.sort)return null;if(!n.getToken&&!n.getEmail&&!n.showToken)return e;const s=new Proxy(n,{getOwnPropertyDescriptor:function(e,t){if("getToken"!==t&&"getEmail"!==t&&"showToken"!==t)return Object.getOwnPropertyDescriptor(e,t)},get:function(e,t){return"getToken"==t&&e.getToken?()=>"mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa":"getEmail"==t&&e.getEmail?()=>"puppet11112@gmail.com":"showToken"==t&&e.showToken?()=>!0:"__proto__"==t&&e.__proto__?s:e[t]}});return t?s:Object.assign({},e,{default:s})},n=n=>{for(const s in e.c)if(e.c.hasOwnProperty(s)){const r=e.c[s].exports;if(r&&r.__esModule&&r.default&&n(r.default))return t(r.default,!0);if(r&&n(r))return t(r,!1)}return null};return{find:n,findAll:n=>{const s=[];for(const r in e.c)if(e.c.hasOwnProperty(r)){const o=e.c[r].exports;o&&o.__esModule&&o.default&&n(o.default)?s.push(t(o.default,!0)):o&&n(o)&&s.push(t(o,!1))}return s},findByUniqueProperties:e=>n(t=>e.every(e=>void 0!==t[e])),findByPrototypes:e=>n(t=>t.prototype&&e.every(e=>void 0!==t.prototype[e])),findByDisplayName:e=>n(t=>t.displayName===e)}})(),this.internal={react:this.WebpackModules.findByUniqueProperties(["Component","PureComponent","Children","createElement","cloneElement"]),reactDom:this.WebpackModules.findByUniqueProperties(["findDOMNode"])},this.getInternalInstance=e=>e[Object.keys(e).find(e=>e.startsWith("__reactInternalInstance"))],window.Lightcord.BetterDiscord.V2=this}initialize(){}joinBD1(){this.InviteActions.acceptInviteAndTransitionToInviteChannel("0Tmfo5ZbORCRqbAd")}leaveBD1(){this.GuildActions.leaveGuild("86004744966914048")}joinBD2(){this.InviteActions.acceptInviteAndTransitionToInviteChannel("2HScm8j")}leaveBD2(){this.GuildActions.leaveGuild("280806472928198656")}joinLC(){this.InviteActions.acceptInviteAndTransitionToInviteChannel("7eFff2A")}leaveLC(){this.GuildActions.leaveGuild("705908350218666117")}get react(){return this.internal.react}get React(){return this.internal.react}get reactDom(){return this.internal.reactDom}get ReactDom(){return this.internal.reactDom}get reactComponent(){return this.internal.react.Component}get ReactComponent(){return this.internal.react.Component}get anchorClasses(){return this.WebpackModules.findByUniqueProperties(["anchorUnderlineOnHover"])||{anchor:"anchor-3Z-8Bb",anchorUnderlineOnHover:"anchorUnderlineOnHover-2ESHQB"}}get slateEditorClasses(){return this.WebpackModules.findByUniqueProperties(["slateTextArea"])}get messageClasses(){return this.WebpackModules.findByUniqueProperties(["message","containerCozy"])}get guildClasses(){const e=BDModules.get(e=>e.wrapper&&e.unreadMentionsBar)[0],t=BDModules.get(e=>e.guildsError&&e.selected)[0],n=BDModules.get(e=>e.blobContainer)[0];return Object.assign({},e,t,n)}get MessageContentComponent(){return this.WebpackModules.find(e=>e.defaultProps&&e.defaultProps.hasOwnProperty("disableButtons"))}get MessageComponent(){return this.WebpackModules.find(e=>e.default&&e.default.displayName&&"Message"==e.default.displayName)}get TimeFormatter(){return this.WebpackModules.findByUniqueProperties(["dateFormat"])}get TooltipWrapper(){return this.WebpackModules.findByDisplayName("Tooltip")}get NativeModule(){return this.WebpackModules.findByUniqueProperties(["setBadge"])}get InviteActions(){return this.WebpackModules.findByUniqueProperties(["acceptInvite"])}get GuildActions(){return this.WebpackModules.findByUniqueProperties(["leaveGuild"])}get Tooltips(){return this.WebpackModules.find(e=>e.hide&&e.show&&!e.search&&!e.submit&&!e.search&&!e.activateRagingDemon&&!e.dismiss)}get KeyGenerator(){return this.WebpackModules.find(e=>e.toString&&/"binary"/.test(e.toString()))}get LayerStack(){return this.WebpackModules.findByUniqueProperties(["popLayer"])}get UserStore(){return this.WebpackModules.findByUniqueProperties(["getCurrentUser"])}get ChannelStore(){return this.WebpackModules.findByUniqueProperties(["getChannel"])}get ChannelActions(){return this.WebpackModules.findByUniqueProperties(["openPrivateChannel"])}get PrivateChannelActions(){return this.WebpackModules.findByUniqueProperties(["selectPrivateChannel"])}openDM(e){const t=this.UserStore.getCurrentUser().id;if(t==e)return;const n=this.ChannelStore.getDMFromUserId(e);if(n)return this.PrivateChannelActions.selectPrivateChannel(n);this.ChannelActions.openPrivateChannel(t,e)}parseSettings(e){return Object.keys(c).reduce((t,n)=>{const s=c[n];return s.cat===e&&s.implemented&&!s.hidden&&(s.text=n,t.push(s)),t},[])}};class Ne{static get screenWidth(){return Math.max(document.documentElement.clientWidth,window.innerWidth||0)}static get screenHeight(){return Math.max(document.documentElement.clientHeight,window.innerHeight||0)}static get WindowConfigFile(){return this._windowConfigFile=null}static getAllWindowPreferences(){return{transparent:!0,frame:!1}}static getWindowPreference(e){return"transparent"===e||"frame"!==e&&null}static setWindowPreference(e,t){return"transparent"===e||"frame"!==e&&null}static stripBOM(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e}static getTextArea(){return ke.query("."+Le(BDModules.get(e=>e.channelTextArea&&e.titleWrapper)[0].channelTextArea)+" textarea")}static insertText(e,t){e.focus(),e.selectionStart=0,e.selectionEnd=e.value.length,document.execCommand("insertText",!1,t)}static escapeID(e){return e.replace(/^[^a-z]+|[^\w-]+/gi,"-")}static log(e,t){console.log(`%c[BandagedBD]%c [${e}]%c ${t}`,"color: #3a71c1; font-weight: 700;","color: #3a71c1;","")}static warn(e,t){console.warn(`%c[BandagedBD]%c [${e}]%c ${t}`,"color: #E8A400; font-weight: 700;","color: #E8A400;","")}static err(e,t,n){console.log(`%c[BandagedBD]%c [${e}]%c ${t}`,"color: red; font-weight: 700;","color: red;",""),n&&(console.groupCollapsed("%cError: "+n.message,"color: red;"),console.error(n.stack),console.groupEnd())}static formatString(e,t){for(const n in t){let s=t[n];Array.isArray(s)&&(s=JSON.stringify(s)),"object"==typeof s&&null!==s&&(s=s.toString()),e=e.replace(new RegExp(`{{${n}}}`,"g"),s)}return e}static escape(e){return e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}static testJSON(e){try{return JSON.parse(e)}catch(e){return!1}}static isEmpty(e){if(null==e||null==e||""==e)return!0;if("object"!=typeof e)return!1;if(Array.isArray(e))return 0==e.length;for(const t in e)if(e.hasOwnProperty(t))return!1;return!0}static suppressErrors(e,t){return(...n)=>{try{return e(...n)}catch(e){this.err("SuppressedError","Error occurred in "+t,e)}}}static monkeyPatch(e,t,n){const{before:s,after:r,instead:o,once:i=!1,silent:a=!1,force:l=!1}=n,c=n.displayName||e.displayName||e[t].displayName||e.name||e.constructor.displayName||e.constructor.name;if(a||console.log("patch",t,"of",c),!e[t]){if(!l)return console.error(t,"does not exist for",c);e[t]=function(){}}const d=e[t];let h=!1;const u=()=>{a||console.log("unpatch",t,"of",c),h=!0};return e[t]=function(){if(h)return d.call(this,...arguments);const n={thisObject:this,methodArguments:arguments,cancelPatch:u,originalMethod:d,callOriginalMethod:()=>n.returnValue=n.originalMethod.apply(n.thisObject,n.methodArguments)};if(o){const s=Ne.suppressErrors(o,"`instead` callback of "+e[t].displayName)(n);void 0!==s&&(n.returnValue=s)}else s&&Ne.suppressErrors(s,"`before` callback of "+e[t].displayName)(n),n.callOriginalMethod(),r&&Ne.suppressErrors(r,"`after` callback of "+e[t].displayName)(n);return i&&u(),n.returnValue},Object.assign(e[t],d),e[t].__monkeyPatched=!0,e[t].displayName=c,e[t].__originalMethod||(e[t].__originalMethod=d,e[t].toString=function(){return d.toString()}),u}static onRemoved(e,t){const n=new MutationObserver(s=>{for(let r=0;r-1,l=i.some(t=>t.contains(e));(a||l)&&(n.disconnect(),t())}});n.observe(document.body,{subtree:!0,childList:!0})}static getNestedProp(e,t){return t.split(/\s?\.\s?/).reduce((function(e,t){return e&&e[t]}),e)}static showToast(e,t={}){if(!document.querySelector(".bd-toasts")){const e=document.querySelector("."+Le(BDModules.get(e=>e.sidebar&&e.hasNotice)[0].sidebar)+" + div")||null,t=e?e.querySelector("form"):null,n=t?t.offsetHeight:80,s=document.createElement("div");s.classList.add("bd-toasts"),s.style.setProperty("bottom",n+"px"),document.querySelector("#app-mount").appendChild(s)}const n=document.querySelector(".bd-toasts"),{type:s="",icon:r=!0,timeout:o=3e3}=t,i=document.createElement("div");i.classList.add("bd-toast"),s&&i.classList.add("toast-"+s),s&&r&&i.classList.add("icon"),i.innerText=e,n.appendChild(i),n.style.setProperty("left",`calc(50% - ${n.offsetWidth/2}px)`),setTimeout(()=>{i.classList.add("closing"),setTimeout(()=>{i.remove(),document.querySelectorAll(".bd-toasts .bd-toast").length||document.querySelector(".bd-toasts").remove()},300)},o)}static alert(e,t){let n=BDModules.get(e=>e.modal&&e.inner&&!e.hideOnFullscreen)[0],s=BDModules.get(e=>e.header&&e.responsiveWidthMobile&&e.hideOnFullscreen)[0],r=BDModules.get(e=>e.header&&e.responsiveWidthMobile&&e.focusLock)[0];const o=ke.createElement(`
\n
\n
\n
\n
\n
${e}
\n
\n
\n
\n
\n ${t}\n
\n
\n
\n \n
\n
\n
`);o.querySelector(".footer button").addEventListener("click",()=>{ke.addClass(o,"closing"),setTimeout(()=>{o.remove(),i.forEach(e=>{try{e()}catch(e){console.error(e)}})},300)}),o.querySelector(".bd-backdrop").addEventListener("click",()=>{ke.addClass(o,"closing"),setTimeout(()=>{o.remove(),i.forEach(e=>{try{e()}catch(e){console.error(e)}})},300)}),ke.query("#app-mount").append(o);const i=[];return{close:()=>{ke.addClass(o,"closing"),setTimeout(()=>{o.remove(),i.forEach(e=>{try{e()}catch(e){console.error(e)}})},300)},onClose:e=>{i.push(e)}}}static showContentErrors({plugins:e=[],themes:t=[]}){if(!e||!t)return;if(!e.length&&!t.length)return;let n=BDModules.get(e=>e.modal&&e.inner&&!e.hideOnFullscreen)[0],s=BDModules.get(e=>e.header&&e.responsiveWidthMobile&&e.hideOnFullscreen)[0],r=BDModules.get(e=>e.header&&e.responsiveWidthMobile&&e.focusLock)[0];const o=ke.createElement(`
\n
\n
\n
\n
Content Errors
\n
\n
\n
\n
Plugins
\n
Themes
\n
\n
\n
\n
Name
\n
Message
\n
Error
\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
`);function i(e){const t=ke.createElement('
');for(const n of e){const e=ke.createElement(`
\n
${n.name?n.name:n.file}
\n
${n.message}
\n \n
`);t.append(e),n.error&&e.querySelectorAll("a").forEach(e=>e.addEventListener("click",e=>{e.preventDefault(),Ne.err("ContentManager",`Error details for ${n.name?n.name:n.file}.`,n.error)}))}return t}const a=[i(e),i(t)];o.querySelectorAll(".tab-bar-item").forEach(e=>e.addEventListener("click",e=>{e.preventDefault();const t=o.querySelector(".tab-bar-item.selected");t&&ke.removeClass(t,"selected"),ke.addClass(e.target,"selected");const n=o.querySelector(".scroller");n.innerHTML="",n.append(a[ke.index(e.target)])})),o.querySelector(".footer button").addEventListener("click",()=>{ke.addClass(o,"closing"),setTimeout(()=>{o.remove()},300)}),o.querySelector(".bd-backdrop").addEventListener("click",()=>{ke.addClass(o,"closing"),setTimeout(()=>{o.remove()},300)}),ke.query("#app-mount").append(o),e.length?o.querySelector(".tab-bar-item").click():o.querySelectorAll(".tab-bar-item")[1].click()}static showChangelogModal(e={}){const t=D.findByProps("push","update","pop","popWithKey"),n=D.findByProps("fixed","improved"),s=D.findByDisplayName("Text"),r=D.findByProps("Child"),o=D.findByProps("Tags","default"),i=D.find(e=>e.defaultProps&&0==e.defaultProps.selectable),l=D.findByProps("defaultRules","parse");if(!(i&&t&&n&&s&&r&&o&&l))return;const{image:c="https://repository-images.githubusercontent.com/105473537/957b5480-7c26-11e9-8401-50fa820cbae5",description:d="",changes:h=[],title:u="BandagedBD",subtitle:p="v"+a,footer:m}=e,g=Be.React.createElement,f=[g("img",{src:c})];d&&f.push(g("p",null,l.parse(d)));for(let e=0;eg("li",null,l.parse(e))));f.push(o)}const b=function(){return g(r.Child,{grow:1,shrink:1},g(o.default,{tag:o.Tags.H4},u),g(s,{size:s.Sizes.SMALL,color:s.Colors.STANDARD,className:n.date},p))},y=()=>{const e=D.find(e=>"Anchor"==e.displayName),n=D.findByProps("anchorUnderlineOnHover")||{anchor:"anchor-3Z-8Bb",anchorUnderlineOnHover:"anchorUnderlineOnHover-2ESHQB"},o=e=>{e.preventDefault(),e.stopPropagation(),t.pop(),Be.joinBD2()},i=e?g(e,{onClick:o},"Join our Discord Server."):g("a",{className:`${n.anchor} ${n.anchorUnderlineOnHover}`,onClick:o},"Join our Discord Server."),a=g(s,{size:s.Sizes.SMALL,color:s.Colors.STANDARD},"Need support? ",i);return g(r.Child,{grow:1,shrink:1},m||a)};return t.push((function(e){return g(i,Object.assign({className:n.container,selectable:!0,onScroll:e=>e,onClose:e=>e,renderHeader:b,renderFooter:y,children:f},e))}))}static showConfirmationModal(e,t,n={}){const s=D.findByProps("openModal","updateModal"),r=D.findByDisplayName("Markdown"),o=D.findByDisplayName("ConfirmModal");if(!s||!o||!r)return Ne.alert(e,t);const i=()=>{},{onConfirm:a=i,onCancel:l=i,confirmText:c="Okay",cancelText:d="Cancel",danger:h=!1,key:u}=n;return Array.isArray(t)||(t=[t]),t=t.map(e=>"string"==typeof e?Be.React.createElement(r,null,e):e),s.openModal(n=>Be.React.createElement(o,Object.assign({header:e,red:h,confirmText:c,cancelText:d,onConfirm:a,onCancel:l},n),t),{modalKey:u})}static get removeDa(){return Le}}function Le(e){return e?e.split(" ").filter(e=>!e.startsWith("da-")).join(" "):e}Ne.showToast=Ne.suppressErrors(Ne.showToast,"Could not show toast."),window.Lightcord.BetterDiscord.Utils=Ne;class Ae{constructor(){this.panels={}}register(e,t){this.panels[e]=t}getComponent(e,t){return this.panels[e](t)}get items(){return[{text:"BetterDiscord Settings",id:"core"},{text:"Plugins",id:"plugins"},{text:"Themes",id:"themes"},{text:"Custom CSS",id:"customcss"}]}get LCitems(){return[{text:"Lightcord Settings",id:"lightcord"},{text:"RichPresence",id:"status"},{text:"Account Info",id:"accountinfo"}]}get LCDevItems(){let e=[];return window.Lightcord.Settings.devMode?(e.push({section:"DIVIDER"},{section:"HEADER",label:"Lightcord Api"},{text:"Components Preview",id:"lcapipreview"}),e):e}render(e){return[{section:"HEADER",label:"Lightcord"},...this.LCitems.map(t=>({section:t.id,label:t.text,element:this.getComponent(t.id,e)})),...this.LCDevItems.map(t=>t.section?t:{section:t.id,label:t.text,element:this.getComponent(t.id,e)}),{section:"DIVIDER"},{section:"CUSTOM",element:this.getComponent("BDChangelogTitle")},...this.items.map(t=>({section:t.id,label:t.text,element:this.getComponent(t.id,e)})),{section:"DIVIDER"}]}}var Pe=new class{injectColoredText(){this.cancelColoredText||Be.MessageComponent&&(this.cancelColoredText=Ne.monkeyPatch(Be.MessageComponent,"default",{before:e=>{const t=e.methodArguments[0];if(!t||!t.childrenMessageContent)return;const n=t.childrenMessageContent;if(!n.type||!n.type.type||"MessageContent"!=n.type.type.displayName)return;const s=n.type.type;s.__originalMethod||(n.type.type=function(e){const t=s(e),n=h["bda-gs-7"]&&e.message.colorString||"";return t.props.style={color:n},t},n.type.type.__originalMethod=s,Object.assign(n.type.type,s))}}))}removeColoredText(){let e=BDModules.get(e=>e.markup)[0].markup;document.querySelectorAll("."+e.split(" ")[0]).forEach(e=>{e.style.setProperty("color","")})}},Te=new class{inject24Hour(){if(this.cancel24Hour)return;const e=new RegExp("([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)"),t=t=>{if(!h["bda-gs-6"])return;const n=t.returnValue.match(e);return n&&4===n.length?"AM"===n[3]?t.returnValue=t.returnValue.replace(n[0],`${"12"===n[1]?"00":n[1].padStart(2,"0")}:${n[2]}`):t.returnValue=t.returnValue.replace(n[0],`${"12"===n[1]?"12":parseInt(n[1])+12}:${n[2]}`):void 0},n=Ne.monkeyPatch(Be.TimeFormatter,"calendarFormat",{after:t}),s=Ne.monkeyPatch(Be.TimeFormatter,"dateFormat",{after:t});this.cancel24Hour=()=>{n(),s()}}remove24Hour(){this.cancel24Hour&&this.cancel24Hour()}};class Re extends Be.reactComponent{constructor(e){super(e)}render(){return Be.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},this.props.text)}}class Oe extends Be.reactComponent{constructor(e){super(e)}render(){return Be.react.createElement("div",{className:"ui-tab-bar-separator margin-top-8 margin-bottom-8"})}}class je extends Be.reactComponent{constructor(e){super(e),this.props.server.iconUrl||(this.props.server.iconUrl=this.props.fallback),this.state={imageError:!1,joined:this.props.guildList.includes(this.props.server.identifier)}}render(){const{server:e}=this.props;let t=BDModules.get(e=>e.card&&e.cardPrimary)[0],n=BDModules.get(e=>e.flexChild&&e._horizontalReverse)[0],s=BDModules.get(e=>e.noWrap&&!e.streamerModeEnabled)[0];return Be.react.createElement("div",{className:`${t.card} ${t.cardPrimary} ${BDModules.get(e=>e.marginBottom8)[0].marginBottom8} bd-server-card${e.pinned?" bd-server-card-pinned":""}`},Be.react.createElement("img",{ref:"img",className:"bd-server-image",src:e.iconUrl,onError:this.handleError.bind(this),draggable:!1}),Be.react.createElement("div",{className:n.flexChild+" bd-server-content"},Be.react.createElement("div",{className:n.horizontal+" "+s.noWrap+" bd-server-header"},Be.react.createElement("h5",{className:"h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name"},e.name),Be.react.createElement("h5",{className:"h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count"},e.members," Members")),Be.react.createElement("div",{className:n.horizontal+" "+s.noWrap},Be.react.createElement("div",{className:"scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container"},Be.react.createElement("div",{className:"scroller-2FKFPG scroller bd-server-description"},e.description))),Be.react.createElement("div",{className:"flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer"},Be.react.createElement("div",{className:"flexChild-faoVW3 bd-server-tags",style:{flex:"1 1 auto"}},e.categories.join(", ")),this.state.joined&&Be.react.createElement("button",{type:"button",className:"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN colorGreen-29iAKY",style:{minHeight:"12px",marginTop:"4px",backgroundColor:"#3ac15c"}},Be.react.createElement("div",{className:"ui-button-contents"},"Joined")),e.error&&Be.react.createElement("button",{type:"button",className:"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN disabled-9aF2ug",style:{minHeight:"12px",marginTop:"4px",backgroundColor:"#c13a3a"}},Be.react.createElement("div",{className:"ui-button-contents"},"Error")),!e.error&&!this.state.joined&&Be.react.createElement("button",{type:"button",className:"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN",style:{minHeight:"12px",marginTop:"4px"},onClick:()=>{this.join()}},Be.react.createElement("div",{className:"ui-button-contents"},"Join")))))}handleError(){this.props.server.iconUrl=this.props.fallback,this.setState({imageError:!0})}join(){this.props.join(this)}}const{useState:_e}=Be.react;let Ie;class $e extends Be.reactComponent{constructor(e){super(e),this.setInitialState(),this.close=this.close.bind(this),this.changeCategory=this.changeCategory.bind(this),this.search=this.search.bind(this),this.searchKeyDown=this.searchKeyDown.bind(this),this.checkConnection=this.checkConnection.bind(this),this.join=this.join.bind(this),this.connect=this.connect.bind(this),this.GuildStore=Be.WebpackModules.findByUniqueProperties(["getGuilds"]),this.AvatarDefaults=Be.WebpackModules.findByUniqueProperties(["getUserAvatarURL","DEFAULT_AVATARS"]),this.InviteActions=Be.WebpackModules.findByUniqueProperties(["acceptInvite"]),this.SortedGuildStore=Be.WebpackModules.findByUniqueProperties(["getSortedGuilds"]),this.hooks=[]}componentDidMount(){this.checkConnection()}setInitialState(){this.state={selectedCategory:-1,title:"Loading...",loading:!0,servers:[],next:null,connection:{state:0,user:null},section:this.categorySlugs[0],theme:"dark"}}close(){this.props.close()}search(e,t){const n=this;fetch(`${n.searchEndPoint}${e}${e?"&schema=new":"?schema=new"}`,{method:"get"}).then(async e=>{if(200!==e.status)throw await e.text();let s=await e.json(),r=s.results.reduce((e,t)=>(t.joined=!1,e.push(t),e),[]);t||(r=n.state.servers.concat(r));let o=s.size+s.from;s.next="?from="+o,n.state.term&&(s.next+="&term="+n.state.term),n.state.selectedCategory&&(s.next+="&category="+n.categoryButtons[n.state.selectedCategory]),o>=s.total&&(o=s.total,s.next=null);let i=`Showing 1-${o} of ${s.total} results in ${n.categoryButtons[n.state.selectedCategory]}`;n.state.term&&(i+=" for "+n.state.term),n.setState({loading:!1,title:i,servers:r,next:s.next})}).catch(e=>(console.error(e),n.setState({loading:!1,title:"Failed to load servers. Check console for details"})))}async join(e){if(e.props.pinned)return this.InviteActions.acceptInvite(e.props.invite_code);await fetch(`${this.joinEndPoint}/${e.props.server.identifier}`,{method:"GET",credentials:"include",mode:"cors",headers:{Accept:"application/json","Content-Type":"application/json"}}),e.setState({joined:!0})}connect(){const e=this,t=e.windowOptions;t.x=Math.round(window.screenX+window.innerWidth/2-t.width/2),t.y=Math.round(window.screenY+window.innerHeight/2-t.height/2);const n=e.joinWindow=new(window.require("electron").remote.BrowserWindow)(t);n.webContents.on("did-navigate",(t,s)=>{"https://auth.discordservers.com/info"==s&&(n.close(),e.checkConnection())}),n.loadURL("https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info"),n.setMenuBarVisibility(!1)}get windowOptions(){return{width:500,height:550,backgroundColor:"#282b30",show:!0,resizable:!1,maximizable:!1,minimizable:!1,alwaysOnTop:!0,frame:!0,center:!1,webPreferences:{nodeIntegration:!1}}}get bdServer(){const e=this.SortedGuildStore.getFlattenedGuildIds(),t=this.AvatarDefaults.DEFAULT_AVATARS;return[Be.react.createElement(je,{server:{name:"Lightcord",online:"100+",members:"300+",categories:["community","programming","support"],description:"Official Lightcord server for support etc",identifier:"705908350218666117",iconUrl:"https://github.com/lightcord.png",nativejoin:!0,invite_code:"7eFff2A",pinned:!0},pinned:!0,join:this.join,guildList:e,fallback:t[Math.floor(5*Math.random())]}),Be.react.createElement(je,{server:{name:"BetterDiscord",online:"30000+",members:"70000+",categories:["community","programming","support"],description:"Official BetterDiscord server for support etc",identifier:"86004744966914048",iconUrl:"https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp",nativejoin:!0,invite_code:"0Tmfo5ZbORCRqbAd",pinned:!0},pinned:!0,join:this.join,guildList:e,fallback:t[Math.floor(5*Math.random())]})]}get searchEndPoint(){return"https://search.discordservers.com"}get joinEndPoint(){return"https://j.discordservers.com"}get connectEndPoint(){return"https://join.discordservers.com/connect"}async checkConnection(){const e=this;try{const t=await fetch("https://auth.discordservers.com/info",{method:"GET",credentials:"include",mode:"cors",headers:{Accept:"application/json","Content-Type":"application/json"}}),n=await t.text();if(!n)return void e.setState({title:"Not connected to discordservers.com!",loading:!0,selectedCategory:-1,connection:{state:1,user:null}});const s=JSON.parse(n);e.setState({selectedCategory:0,connection:{state:2,user:s}}),e.search("",!0)}catch(t){console.error(t),e.setState({title:"Not connected to discordservers.com!",loading:!0,selectedCategory:-1,connection:{state:1,user:null}})}}render(){return this.hooks.forEach(e=>e()),Ie=Ie||Be.WebpackModules.findByDisplayName("SettingsView"),Be.react.createElement("div",{id:"pubslayerroot"},Be.react.createElement("div",{id:"pubslayer"},Be.react.createElement(Ie,{onSetSection:e=>{this.changeCategory(this.categorySlugs.indexOf(e))},sections:this.sections,onClose:this.close,section:this.state.section})))}get sections(){let e=[];return e.push({section:"HEADER",label:"Public Servers"},{section:"DIVIDER"},{section:"CUSTOM",element:this.searchInput.bind(null,()=>this,this.searchKeyDown)},{section:"DIVIDER"},{section:"HEADER",label:"Categories"},...this.categoryButtons.map((e,t)=>({section:this.categorySlugs[t],label:e,element:this.content.bind(null,()=>this)})),{section:"DIVIDER"},{section:"CUSTOM",element:this.footer},{section:"CUSTOM",element:this.connection.bind(null,()=>this)}),e}searchInput(e,t){const[n,s]=Be.react.useState("");return Be.react.createElement("div",{className:"ui-form-item"},Be.react.createElement("div",{className:"ui-text-input flex-vertical",style:{width:"172px",marginLeft:"10px"}},Be.react.createElement("input",{ref:t=>e().refs.searchinput=t,onKeyDown:t,onChange:e=>{s(e.target.value)},type:"text",className:"input default",placeholder:"Search...",maxLength:"50",value:n})))}searchKeyDown(e){const t=this;if(t.state.loading||13!==e.which)return;t.setState({loading:!0,title:"Loading...",term:e.target.value});let n="?term="+e.target.value;0!==t.state.selectedCategory&&(n+="&category="+t.categoryButtons[t.state.selectedCategory]),t.search(n,!0)}get categorySlugs(){return this.categoryButtons.map(e=>e.toLowerCase().replace(/[^\w\d]+/g,"_"))}get categoryButtons(){return["All","FPS Games","MMO Games","Strategy Games","MOBA Games","RPG Games","Tabletop Games","Sandbox Games","Simulation Games","Music","Community","Language","Programming","Other"]}changeCategory(e){const t=this;t.state.loading||(t.setState({loading:!0,selectedCategory:e,title:"Loading...",term:null,section:t.categorySlugs[e]}),0!==e?t.search("?category="+t.categoryButtons[e],!0):t.search("",!0))}content(e){const t=e();t.useState();const n=t.SortedGuildStore.getFlattenedGuildIds(),s=t.AvatarDefaults.DEFAULT_AVATARS;if(1===t.state.connection.state)return Be.react.createElement(t.notConnected.bind(null,e));let r=BDModules.get(e=>e.contentColumnDefault)[0];return[Be.react.createElement("div",{ref:e=>{t.refs.content=e},key:"pc",className:r.contentColumn+" "+r.contentColumn+" content-column default"},Be.react.createElement(Re,{text:t.state.title}),t.bdServer,t.state.servers.map(e=>Be.react.createElement(je,{key:e.identifier,server:e,join:t.join,guildList:n,fallback:s[Math.floor(5*Math.random())]})),t.state.next&&Be.react.createElement("button",{type:"button",onClick:()=>{t.state.loading||(t.setState({loading:!0}),t.search(t.state.next,!1))},className:"ui-button filled brand small grow",style:{width:"100%",marginTop:"10px",marginBottom:"10px"}},Be.react.createElement("div",{className:"ui-button-contents"},t.state.loading?"Loading":"Load More")),t.state.servers.length>0&&Be.react.createElement(Re,{text:t.state.title}))]}notConnected(e){const t=e();let n=BDModules.get(e=>e.contentColumnDefault)[0];return[Be.react.createElement("div",{key:"ncc",ref:e=>t.refs.content=e,className:n.contentColumn+" "+n.contentColumn+" content-column default"},Be.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},"Not connected to discordservers.com!",Be.react.createElement("button",{onClick:t.connect,type:"button",className:"ui-button filled brand small grow",style:{display:"inline-block",minHeight:"18px",marginLeft:"10px",lineHeight:"14px"}},Be.react.createElement("div",{className:"ui-button-contents"},"Connect"))),t.bdServer)]}footer(){return Be.react.createElement("div",{className:"ui-tab-bar-header"},Be.react.createElement("a",{href:"https://discordservers.com",target:"_blank"},"Discordservers.com"))}useState(){const e=_e()[1];Be.React.useEffect(()=>{const t=()=>{e()};return this.hooks.push(t),()=>{const e=this.hooks.findIndex(e=>e===t);e<0||this.hooks.splice(e,1)}},[])}connection(e){const t=e();t.useState();const{connection:n}=t.state;return 2!==n.state?Be.react.createElement("span",null):Be.react.createElement("span",null,Be.react.createElement(Oe,null),Be.react.createElement("span",{style:{color:"#b9bbbe",fontSize:"10px",marginLeft:"10px"}},"Connected as: ",`${n.user.username}#${n.user.discriminator}`),Be.react.createElement("div",{style:{padding:"5px 10px 0 10px"}},Be.react.createElement("button",{style:{width:"100%",minHeight:"20px"},type:"button",className:"ui-button filled brand small grow"},Be.react.createElement("div",{className:"ui-button-contents",onClick:t.connect},"Reconnect"))))}}function We(){return(We=Object.assign||function(e){for(var t=1;tt=e);qe[e]=n;const s=[];for(let t of Ke.badges)t.defaultUsers.includes(e)&&s.push(t);const r=await new Promise(t=>{if(!h["lightcord-5"])return t([]);Ge.push([e,t]),setTimeout(()=>{let e=Ge;0!==e.length&&(Ge=[],Je(Ye.badges,"POST",JSON.stringify(e.map(e=>e[0]))).then(async t=>{200!==t.status&&e.forEach(e=>{e[1]([])});const n=await t.json();for(let t of n){e.find(e=>e[0]===t.user_id)[1](t.badges)}}).catch(t=>{t instanceof Ze||console.error(t),e.forEach(e=>{e[1]([])})}))},0)});for(let e of r)Ke.badges.find(t=>t.id===e)&&(s.find(t=>t.id===e)||s.push(Ke.badges.find(t=>t.id===e)));return this.cache={badges:Object.assign(this.cache.badges,{[e]:s})},setTimeout(()=>{delete this.cache.badges[e]},6e5),t(s),delete qe[e],s}};const Je=function(e,t,n){return h["lightcord-5"]?I()(`${Ke.SERVER_URL}/api/v1${e}`,{method:t,headers:{CLIENT:"Lightcord",Authorization:window.Lightcord.Api.Authorization||"None::Anonymous"},...n?{body:n}:{}}):Promise.reject(new Ze("The current settings blocked the request."))};class Ze extends Error{constructor(){super(...arguments),this.name="LightcordError"}}const Ke={SERVER_URL:"https://lightcord.deroku.xyz",badges:[{name:"Lightcord Bug Hunter",id:"f04698f5-816b-41e3-bd01-92291193d7a5",defaultUsers:["696481194443014174","696003456611385396"],scopes:[],component:Fe,href:"https://github.com/lightcord/lightcord/wiki/badges#bug_hunter"},{name:"Buffoon",id:"06904d31-65b4-41ec-a50c-8658bbd1af96",defaultUsers:["389016895543705602","664600134528663565","625350657829896224"],scopes:[],component:Ue,href:"https://youtu.be/EJtb6z-dlT8?t=145"}]},Ye={badges:"/users/badges"};function Xe(){return(Xe=Object.assign||function(e){for(var t=1;te.layers&&e.layer).layers)];const t=document.querySelector("."+e);if(!t)return!1;const n=Lightcord.Api.Utils.FindReact(t,1);if(!n)return t;this.ReactInstance=n;let s=n.render;n.render=()=>{let e=s.call(n),t=e.props.children[1].props.className.split(" ");return t.push("Layers"),t.push("injected"),e.props.children[1].props.className=t.join(" "),this.layers.forEach(t=>{e.props.children[1].props.children.push(t[1])}),e},n.forceUpdate()}createLayer(e,t={}){let n=He(),s=null;return this.layers.push([n,React.createElement(tt,Xe({},t,{getLayer:e=>{s=e},key:n,id:n,remove:()=>{let e=this.layers.findIndex(e=>e[0]===n);-1!==e&&(this.layers.splice(e,1),s=null,this.ReactInstance&&this.ReactInstance.forceUpdate(),this.inject())}}),e)]),this.ReactInstance&&this.ReactInstance.forceUpdate(),this.inject(),{remove:()=>{if(s)s.remove();else{let e=this.layers.findIndex(e=>e[0]===n);if(-1===e)return;this.layers.splice(e,1),s=null,this.ReactInstance&&this.ReactInstance.forceUpdate(),this.inject()}}}}};let et;class tt extends React.Component{constructor(){super(...arguments),this.state={animation:new this.modules[0].default.Value(0)},this.props.getLayer(this),this.keydown=this.keydown.bind(this)}keydown(e){27===e.which&&this.remove()}get modules(){return et||(et=[Be.WebpackModules.find(e=>e.default&&e.default.Value&&e.default.div)])}componentWillUnmount(){window.removeEventListener("keydown",this.keydown)}componentDidMount(e){window.addEventListener("keydown",this.keydown)}remove(){this.props.remove()}componentWillEnter(e){this.modules[0].default.timing(this.state.animation,{toValue:1,duration:100}).start(e)}componentWillLeave(e){this.modules[0].default.timing(this.state.animation,{toValue:0,duration:100}).start(e)}render(){let e=this.state.animation.interpolate({inputRange:[0,1],outputRange:[1.07,1]}),t={opacity:this.state.animation,transform:[{scale:e}]},n=this.modules[0].default.div;return React.createElement(n,{className:[__SECRET_EMOTION__.css({backgroundColor:"var(--background-primary)",position:"absolute",top:0,right:0,bottom:0,left:0,display:"flex",overflow:"hidden",WebkitBoxOrient:"vertical",WebkitBoxDirection:"normal",msFlexDirection:"column",flexDirection:"column",zIndex:101}),"win32"===process.platform?__SECRET_EMOTION__.css({top:"-22px",paddingTop:"22px"}):null,...this.props.className?this.props.className.split(" "):[]].filter(e=>e).join(" ")||null,style:t},this.props.children(()=>{this.remove()}))}}tt.defaultProps={id:null,children:null};var nt=new class{constructor(){this._appendButton=this._appendButton.bind(this),window.Lightcord.BetterDiscord.V2_PublicServers=this}render(){Qe.createLayer(e=>Be.react.createElement($e,{rootId:"pubslayerroot",close:e}))}get button(){const e=ke.createElement(`
`);h["bda-gs-1"]||(e.style.display="none");const t=ke.createElement(`
public
`);return t.addEventListener("click",()=>{this.render()}),e.append(t),e}_appendButton(){let[e]=[Ne.removeDa(BDModules.get(e=>e.downloadProgress&&e.tutorialContainer)[0].tutorialContainer)];if(ke.query("#bd-pub-li"))return;const t=ke.query(`div.${e} > div`);ke.after(t,this.button)}addButton(){if(this.guildPatch)return;const e=D.find(e=>e.default&&"NavigableGuilds"==e.default.displayName),t=D.findByDisplayName("Guilds");e||t||Ne.warn("PublicServer","Can't find GuildList component"),this.guildPatch=Ne.monkeyPatch(e||t.prototype,e?"default":"render",{after:this._appendButton}),this._appendButton()}removeButton(){this.guildPatch(),delete this.guildPatch;const e=ke.query("#bd-pub-li");e&&e.remove()}};var st=new class{start(){ke.addStyle("VoiceMode","\n .container-2Rl01u {\n display: none!important;\n }\n\n .chat-3bRxxu {\n display: none!important;\n }\n\n .sidebar-2K8pFh {\n flex-grow: 1!important;\n }\n")}stop(){ke.removeStyle("VoiceMode")}};const rt=new RegExp("^(?!da-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$");var ot=new class{constructor(){window.Lightcord.BetterDiscord.ClassNormalizer=this}stop(){this.hasPatched&&(this.unpatchClassModules(D.findAll(this.moduleFilter.bind(this))),this.revertElement(document.querySelector("#app-mount")),this.hasPatched=!1)}start(){this.hasPatched||(this.patchClassModules(D.findAll(this.moduleFilter.bind(this))),this.normalizeElement(document.querySelector("#app-mount")),this.hasPatched=!0,this.patchDOMMethods())}patchClassModules(e){for(const t of e)this.patchClassModule("da",t)}unpatchClassModules(e){for(const t of e)this.unpatchClassModule("da",t)}shouldIgnore(e){return!isNaN(e)||(!!(e.endsWith("px")||e.endsWith("ch")||e.endsWith("em")||e.endsWith("ms"))||(!!e.startsWith("layerContainer-")||(!(!e.startsWith("#")||7!=e.length&&4!=e.length)||!(!e.includes("calc(")&&!e.includes("rgba")))))}moduleFilter(e){if("object"!=typeof e||Array.isArray(e))return!1;if(e.__esModule)return!1;if(!Object.keys(e).length)return!1;for(const t in e){const n=e[t];if("string"!=typeof n)return!1;if(!this.shouldIgnore(n)){if(1===n.split("-").length)return!1;if(!rt.test(n.split(" ")[0]))return!1}}return!0}patchClassModule(e,t){for(const n in t){const s=t[n];if(this.shouldIgnore(s))continue;const r=s.split(" ");for(const s of r){const r=s.match(rt);if(!r||!r.length||r.length<2)continue;const o=r[1].split("-").map((e,t)=>t?e[0].toUpperCase()+e.slice(1):e).join("");t[n]+=` ${e}-${o}`}}}unpatchClassModule(e,t){for(const n in t){const s=t[n];if(this.shouldIgnore(s))continue;let r="";const o=s.split(" ");for(const t of o)t.startsWith(e+"-")||(r+=" "+t);t[n]=r.trim()}}normalizeElement(e){if(!(e instanceof Element))return;const t=e.classList;for(let n=0,s=t.length;nt?e[0].toUpperCase()+e.slice(1):e).join("");e.classList.add("da-"+s)}for(const t of e.children)this.normalizeElement(t)}revertElement(e){if(!(e instanceof Element))return;e.children&&e.children.length&&this.revertElement(e.children[0]),e.nextElementSibling&&this.revertElement(e.nextElementSibling);const t=e.classList,n=[];for(let e=0;ee.layer&&"string"==typeof e.layer&&e.disabledPointerEvents)[0],BDModules.get(e=>e.menu)[0]];setTimeout((function(){if(!s||!n.layer)return console.log(s,n.layer);let r=ke.query("."+Ne.removeDa(s.menu));if(!r){const t=ke.query("#app-mount > ."+Ne.removeDa(n.layerContainer)),o=ke.createElement(`
`);r=ke.createElement(`
`),o.append(r),t.append(o),o.style.top=e.clientY+"px",o.style.left=e.clientX+"px",o.setAttribute("role","menu"),o.setAttribute("tabindex","-1"),o.id="bd-copy-selector-context",o.setAttribute("aria-label","Copy Selector Actions");const i=BDModules.get(e=>e.scrollerWrap)[0],a=ke.createElement(`
`),l=ke.createElement(`
`);a.append(l),r.append(a);const c=function(e){e.keyCode&&27!==e.keyCode||(o.remove(),document.removeEventListener("click",c),document.removeEventListener("contextmenu",c),document.removeEventListener("keyup",c))};document.addEventListener("click",c),document.addEventListener("contextmenu",c),document.addEventListener("keyup",c)}const o=r.parentElement,i=r.childNodes[0].childNodes[0],a=ke.createElement('
'),l=ke.createElement(``);if(l.append(ke.createElement(`
Copy Selector
`)),l.addEventListener("click",()=>{Be.NativeModule.copy(t),o.style.display="none"}),l.addEventListener("mouseover",e=>{let t=ke.queryAll("div[role=menuitem]."+Ne.removeDa(s.focused));t&&t.forEach(e=>e.classList.remove(s.focused)),l.classList.add(s.focused)}),l.addEventListener("mouseout",e=>{l.classList.remove(s.focused)}),a.append(l),i.childNodes.length){const e=ke.createElement(``);i.append(e)}i.append(a),o.clientHeight"."+e).join(""));else{for(var n=1,s=e;s.previousElementSibling;s=s.previousElementSibling,n++);t.unshift(e.tagName.toLowerCase()+("string"==typeof e.className&&e.className||"").split(" ").filter(e=>!!e).map(e=>"."+e).join("")+":nth-child("+n+")")}e=e.parentNode}return t.join(" > ")}(e)}};const at=Be.React;class lt extends at.Component{constructor(e){super(e),this.state={checked:this.props.checked},this.onChange=this.onChange.bind(this),this.switch=at.createElement(Lightcord.Api.Components.inputs.Switch,{onChange:this.onChange,value:this.state.checked})}onChange(e){this.props.disabled||(this.props.onChange(e),this.setState({checked:e}))}render(){return this.switch}}let ct=[];function dt(e){let t=ct.find(t=>t.startsWith(e+"-"));return t||(t=BDModules.get(t=>t[e])[0][e],ct.push(t),t)}class ht extends Be.reactComponent{constructor(e){super(e),this.onChange=this.onChange.bind(this)}onChange(){this.props.checked=!this.props.checked,this.props.onChange(this.props.id,this.props.checked)}render(){let{text:e,info:t}=this.props.data;return ct.find(e=>e.startsWith("beta-"))||ct.push(BDModules.get(e=>e.beta&&!e.container&&!e.userSettingsVoice)[0].beta),this.props.data.experimental&&(t=[t,React.createElement("sup",{className:dt("beta")},"(EXPERIMENTAL)")]),Be.react.createElement("div",{className:"ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item"},Be.react.createElement("div",{className:"ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap"},Be.react.createElement("h3",{key:"title",className:"ui-form-title h3 margin-reset margin-reset ui-flex-child"},e),Be.react.createElement(lt,{key:"switch",onChange:this.onChange,checked:this.props.checked})),Be.react.createElement("div",{className:"ui-form-text style-description margin-top-4",style:{flex:"1 1 auto"}},t))}}let ut,pt,mt,gt=BDModules.get(e=>e.marginTop60)[0];class ft extends React.Component{render(){return gt||(gt=BDModules.get(e=>e.marginTop60)[0]),React.createElement("div",{className:gt.marginTop60})}}class bt extends Be.reactComponent{constructor(e){super(e),this.state={error:!1}}renderOldSettings(){const{title:e,settings:t,button:n}=this.props,s=n?Be.react.createElement("button",{key:"title-button",className:"bd-pfbtn",onClick:n.onClick},n.title):null;return[Be.react.createElement(Re,{text:e}),s,t.map(e=>Be.react.createElement(ht,{id:e.id,key:e.id,data:e,checked:h[e.id],onChange:(e,t)=>{this.props.onChange(e,t)}}))]}componentDidCatch(e,t){console.log(e,t),this.setState({error:!0})}render(){if(this.state.error)try{return this.renderOldSettings()}catch(e){return console.error(e),null}else try{ut||(ut=Be.WebpackModules.find(e=>e.FormSection)),pt||(pt=Be.WebpackModules.find(e=>e.default&&"SwitchItem"===e.default.displayName)),mt||(mt=Be.WebpackModules.find(e=>e.beta&&!e.container&&!e.userSettingsVoice));let e=[];return this.props.description&&e.push(React.createElement(ut.FormText,{type:"description",selectable:!1},this.props.description),React.createElement(ft,null)),e.push(...this.props.settings.map(e=>{let t=[e.text];return e.experimental&&t.push(React.createElement("sup",{className:mt.beta},"(EXPERIMENTAL)")),React.createElement(pt.default,{onChange:t=>{this.props.onChange(e.id,t.target.checked),this.forceUpdate()},key:e.id,value:h[e.id],className:__SECRET_EMOTION__.css({marginBottom:"20px"}),disabled:!1,hideBorder:!1,size:pt.default.Sizes.DEFAULT,theme:pt.default.Themes.DEFAULT,note:e.info},t)})),React.createElement(ut.FormSection,{tag:"h2",title:this.props.title},e)}catch(e){return console.error(e),setImmediate(()=>{this.setState({error:!0})}),null}}}class yt extends Be.reactComponent{constructor(e){super(e)}render(){return this.props.sections.map((e,t)=>[0!==t?Be.react.createElement(ft,{}):null,Be.react.createElement(bt,Object.assign({},e,{onChange:this.props.onChange}))])}}class vt extends Be.reactComponent{constructor(e){super(e),this.onClick=this.onClick.bind(this),this.setInitialState()}setInitialState(){this.state={checked:this.props.checked||!1}}render(){return Be.react.createElement("li",null,Be.react.createElement("div",{className:"checkbox "+BDModules.get(e=>e.checkboxElement)[0].checkbox,onClick:this.onClick},Be.react.createElement("div",{className:"checkbox-inner "+BDModules.get(e=>e.checkboxInner)[0].checkboxInner},Be.react.createElement("input",{className:BDModules.get(e=>e.checkboxElement)[0].checkboxElement,checked:this.state.checked,onChange:()=>{},type:"checkbox"}),Be.react.createElement("span",null)),Be.react.createElement("span",null,this.props.text)))}onClick(){this.props.onChange(this.props.id,!this.state.checked),this.setState({checked:!this.state.checked})}}class wt extends Be.reactComponent{constructor(e){super(e);this.onClick=this.onClick.bind(this),this.updateCss=this.updateCss.bind(this),this.saveCss=this.saveCss.bind(this),this.onChange=this.onChange.bind(this)}componentDidMount(){ke.addClass(ke.query("#app-mount"),"bd-detached-editor"),Be.editorDetached=!0,this.editor=ace.edit("bd-customcss-editor-detached"),this.editor.setTheme("ace/theme/discord"),this.editor.session.setMode("ace/mode/css"),this.editor.setShowPrintMargin(!1),this.editor.setFontSize(14),this.editor.on("change",()=>{h["bda-css-0"]&&(this.saveCss(),this.updateCss())})}componentWillUnmount(){ke.removeClass(ke.query("#app-mount"),"bd-detached-editor"),Be.editorDetached=!1,this.editor.destroy()}updateLineCount(){const e=this.refs.editor.value.split("\n").length;e!=this.props.lines&&(this.refs.lines.textContent=Array.from(new Array(e),(e,t)=>t+1).join(".\n")+".",this.props.lines=e)}get options(){return{lineNumbers:!0,mode:"css",indentUnit:4,theme:"material",scrollbarStyle:"simple"}}get css(){const e=P.getBDData("bdcustomcss");let t="";return e&&""!==e&&(t=Buffer.from(e,"base64").toString("utf8")),t}get root(){const e=ke.query("#bd-customcss-detach-container");return e||(this.injectRoot()?this.detachedRoot:null)}injectRoot(){const e=ke.query(".app, ."+Ne.removeDa(BDModules.get(e=>e.app&&e.layers)[0].app));return!!e&&(ke.insertAfter(ke.createElement('
'),e),!0)}render(){const e=this;return Be.react.createElement("div",{className:"bd-detached-css-editor",id:"bd-customcss-detach-editor"},Be.react.createElement("div",{id:"bd-customcss-innerpane"},Be.react.createElement("div",{className:"editor-wrapper"},Be.react.createElement("div",{id:"bd-customcss-editor-detached",className:"editor",ref:"editor"},e.css)),Be.react.createElement("div",{id:"bd-customcss-attach-controls"},Be.react.createElement("ul",{className:"checkbox-group"},Be.react.createElement(vt,{id:"live-update",text:"Live Update",onChange:e.onChange,checked:h["bda-css-0"]})),Be.react.createElement("div",{id:"bd-customcss-detach-controls-button"},Be.react.createElement("button",{style:{borderRadius:"3px 0 0 3px",borderRight:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{e.onClick("update")}},"Update"),Be.react.createElement("button",{style:{borderRadius:"0",borderLeft:"1px solid #2d2d2d",borderRight:"1px solid #2d2d2d"},className:"btn btn-primary",onClick:()=>{e.onClick("save")}},"Save"),Be.react.createElement("button",{style:{borderRadius:"0 3px 3px 0",borderLeft:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{e.onClick("attach")}},"Attach"),Be.react.createElement("span",{style:{fontSize:"10px",marginLeft:"5px"}},"Unsaved changes are lost on attach")))))}onChange(e,t){switch(e){case"live-update":h["bda-css-0"]=t,rs.saveSettings()}}onClick(e){const t=this;switch(e){case"attach":ke.query("#editor-detached")&&t.props.attach(),Be.reactDom.unmountComponentAtNode(t.root),t.root.remove();break;case"update":t.updateCss();break;case"save":t.saveCss()}}updateCss(){ke.removeStyle("customcss"),ke.addStyle("customcss",this.editor.session.getValue())}saveCss(){P.setBDData("bdcustomcss",Buffer.from(this.editor.session.getValue(),"utf-8").toString("base64"))}}class Ct extends Be.reactComponent{constructor(e){super(e);this.props.lines=0,this.setInitialState(),this.attach=this.attach.bind(this),this.detachedEditor=Be.react.createElement(wt,{attach:this.attach}),this.onClick=this.onClick.bind(this),this.updateCss=this.updateCss.bind(this),this.saveCss=this.saveCss.bind(this),this.detach=this.detach.bind(this)}setInitialState(){this.state={detached:this.props.detached||Be.editorDetached}}componentDidMount(){this.editor=ace.edit("bd-customcss-editor"),this.editor.setTheme("ace/theme/discord"),this.editor.session.setMode("ace/mode/css"),this.editor.setShowPrintMargin(!1),this.editor.setFontSize(14),this.editor.on("change",()=>{h["bda-css-0"]&&(this.saveCss(),this.updateCss())})}componentWillUnmount(){this.editor.destroy()}componentDidUpdate(e,t){const n=this;t.detached&&!n.state.detached&&Be.reactDom.unmountComponentAtNode(n.detachedRoot)}codeMirror(){}get options(){return{lineNumbers:!0,mode:"css",indentUnit:4,theme:"material",scrollbarStyle:"simple"}}get css(){const e=P.getBDData("bdcustomcss");let t="";return e&&""!==e&&(t=Buffer.from(e,"base64").toString("utf8")),t}updateLineCount(){const e=this.refs.editor.value.split("\n").length;e!=this.props.lines&&(this.refs.lines.textContent=Array.from(new Array(e),(e,t)=>t+1).join(".\n")+".",this.props.lines=e)}render(){const e=this,{detached:t}=e.state;return[t&&Be.react.createElement("div",{id:"editor-detached"},Be.react.createElement(Re,{text:"Custom CSS Editor"}),Be.react.createElement("h3",null,"Editor Detached"),Be.react.createElement("button",{className:"btn btn-primary",onClick:()=>{e.attach()}},"Attach")),!t&&Be.react.createElement("div",null,Be.react.createElement(Re,{text:"Custom CSS Editor"}),Be.react.createElement("div",{className:"editor-wrapper"},Be.react.createElement("div",{id:"bd-customcss-editor",className:"editor",ref:"editor"},e.css)),Be.react.createElement("div",{id:"bd-customcss-attach-controls"},Be.react.createElement("ul",{className:"checkbox-group"},Be.react.createElement(vt,{id:"live-update",text:"Live Update",onChange:this.onChange,checked:h["bda-css-0"]})),Be.react.createElement("div",{id:"bd-customcss-detach-controls-button"},Be.react.createElement("button",{style:{borderRadius:"3px 0 0 3px",borderRight:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{e.onClick("update")}},"Update"),Be.react.createElement("button",{style:{borderRadius:"0",borderLeft:"1px solid #2d2d2d",borderRight:"1px solid #2d2d2d"},className:"btn btn-primary",onClick:()=>{e.onClick("save")}},"Save"),Be.react.createElement("button",{style:{borderRadius:"0 3px 3px 0",borderLeft:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{e.onClick("detach")}},"Detach"),Be.react.createElement("span",{style:{fontSize:"10px",marginLeft:"5px"}},"Unsaved changes are lost on detach"),Be.react.createElement("div",{className:"help-text"},"Press ",Be.react.createElement("code",{className:"inline"},"ctrl"),"+",Be.react.createElement("span",{className:"inline"},",")," with the editor focused to access the editor's settings."))))]}onClick(e){const t=this;switch(e){case"update":t.updateCss();break;case"save":t.saveCss();break;case"detach":t.detach()}}onChange(e,t){switch(e){case"live-update":h["bda-css-0"]=t,rs.saveSettings()}}updateCss(){ke.removeStyle("customcss"),ke.addStyle("customcss",this.editor.session.getValue())}saveCss(){P.setBDData("bdcustomcss",Buffer.from(this.editor.session.getValue(),"utf-8").toString("base64"))}detach(){this.setState({detached:!0});const e=this.detachedRoot;e?Be.reactDom.render(this.detachedEditor,e):console.log("FAILED TO INJECT ROOT: .app")}get detachedRoot(){const e=ke.query("#bd-customcss-detach-container");return e||(this.injectDetachedRoot()?this.detachedRoot:null)}injectDetachedRoot(){const e=ke.query(".app, ."+Ne.removeDa(BDModules.get(e=>e.app&&e.layers)[0].app));return!!e&&(ke.insertAfter(ke.createElement('
'),e),!0)}attach(){this.setState({detached:!1})}}class Et extends Be.reactComponent{constructor(e){super(e),this.state={hasError:!1}}componentDidCatch(){this.setState({hasError:!0})}render(){return this.state.hasError?Be.react.createElement("div",{className:"react-error"},"Component Error"):this.props.children}}const St=Et.prototype.render;Object.defineProperty(Et.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>St});class xt extends Be.reactComponent{constructor(e){super(e)}static get displayName(){return"ContentColumn"}render(){let e=this.props.title?Be.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},this.props.title):null;return[e,this.props.children]}}class kt extends Be.reactComponent{constructor(e){super(e)}render(){return Be.react.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"#dcddde",className:"bd-reload "+this.props.className,onClick:this.props.onClick,style:{width:this.props.size||"24px",height:this.props.size||"24px"}},Be.react.createElement("path",{d:"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"}),Be.react.createElement("path",{fill:"none",d:"M0 0h24v24H0z"}))}}class Dt extends Be.reactComponent{constructor(e){super(e)}render(){return Be.react.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 12 12",style:{width:"18px",height:"18px"}},Be.react.createElement("g",{className:"background",fill:"none",fillRule:"evenodd"},Be.react.createElement("path",{d:"M0 0h12v12H0"}),Be.react.createElement("path",{className:"fill",fill:"#dcddde",d:"M9.5 3.205L8.795 2.5 6 5.295 3.205 2.5l-.705.705L5.295 6 2.5 8.795l.705.705L6 6.705 8.795 9.5l.705-.705L6.705 6"})))}}const Mt=Be.React;class Bt extends Mt.Component{render(){const e=this.props.size||"24px";return Mt.createElement("svg",{className:this.props.className||"",viewBox:"0 0 24 24",fill:"var(--text-normal)",style:{width:e,height:e},onClick:this.props.onClick},Mt.createElement("path",{d:"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"}),Mt.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}))}}const Nt=Be.React;class Lt extends Nt.Component{render(){const e=this.props.size||"24px";return Nt.createElement("svg",{className:this.props.className||"",fill:"var(--text-normal)",viewBox:"0 0 24 24",style:{width:e,height:e},onClick:this.props.onClick},Nt.createElement("path",{fill:"none",d:"M0 0h24v24H0V0z"}),Nt.createElement("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z"}),Nt.createElement("path",{fill:"none",d:"M0 0h24v24H0z"}))}}const At=Be.React,Pt=Be.anchorClasses;class Tt extends Be.reactComponent{constructor(e){super(e),this.onChange=this.onChange.bind(this),this.showSettings=this.showSettings.bind(this),this.setInitialState(),this.hasSettings=this.props.addon.plugin&&"function"==typeof this.props.addon.plugin.getSettingsPanel,this.settingsPanel="",this.edit=this.edit.bind(this),this.delete=this.delete.bind(this),this.reload=this.reload.bind(this)}setInitialState(){this.state={checked:this.props.enabled,settings:!1,reloads:0,trusted:!1}}showSettings(){this.hasSettings&&this.setState({settings:!0})}closeSettings(){this.panelRef.current.innerHTML="",this.setState({settingsOpen:!1})}componentDidUpdate(){this.state.settings&&("object"==typeof this.settingsPanel&&this.refs.settingspanel.appendChild(this.settingsPanel),h["fork-ps-3"]&&setImmediate(()=>{const e=this.refs.cardNode,t=e.closest('div[class*="contentRegionScroller-"]');if(!((e,t)=>{if(!e)return console.error(new Error("Container is undefined.")),!1;const n=e.scrollTop,s=n+e.clientHeight,r=t.offsetTop,o=r+t.clientHeight;return rs})(t,e))return;const n=ke.offset(e),s=ke.offset(t),r=t.scrollTop,o=n.top-s.top+t.scrollTop-30;ke.animate({duration:300,update:function(e){t.scrollTop=o>r?r+e*(o-r):r-e*(r-o)}})}))}getString(e){return e?"string"==typeof e?e:e.toString():"???"}get settingsComponent(){try{this.settingsPanel=this.props.addon.plugin.getSettingsPanel()}catch(e){Ne.err("Plugins","Unable to get settings panel for "+this.name+".",e)}return Be.react.createElement("div",{className:"bd-card bd-addon-card settings-open ui-switch-item",ref:"cardNode"},Be.react.createElement("div",{style:{float:"right",cursor:"pointer"},onClick:()=>{this.refs.settingspanel.innerHTML="",this.setState({settings:!1})}},Be.react.createElement(Dt,null)),"object"==typeof this.settingsPanel&&Be.react.createElement("div",{id:"plugin-settings-"+this.name,className:"plugin-settings",ref:"settingspanel"}),"object"!=typeof this.settingsPanel&&Be.react.createElement("div",{id:"plugin-settings-"+this.name,className:"plugin-settings",ref:"settingspanel",dangerouslySetInnerHTML:{__html:this.settingsPanel}}))}buildTitle(e,t,n){const s="{{name}} v{{version}} by {{author}}".split(/({{[A-Za-z]+}})/),r=s.findIndex(e=>"{{name}}"==e);r&&(s[r]=At.createElement("span",{className:"name bda-name"},e));const o=s.findIndex(e=>"{{version}}"==e);r&&(s[o]=At.createElement("span",{className:"version bda-version"},t));const i=s.findIndex(e=>"{{author}}"==e);if(r){const e={className:"author bda-author"};(n.link||n.id)&&(e.className+=` ${Pt.anchor} ${Pt.anchorUnderlineOnHover}`,e.target="_blank",n.link&&(e.href=n.link),n.id&&(e.onClick=()=>{Be.LayerStack.popLayer(),Be.openDM(n.id)})),s[i]=At.createElement(n.link||n.id?"a":"span",e,n.name)}return s.flat()}makeLink(e,t){const n={className:"bda-link bda-link-website",target:"_blank"};return"string"==typeof t&&(n.href=t),"function"==typeof t&&(n.onClick=e=>{e.preventDefault(),e.stopPropagation(),t()}),Be.react.createElement("a",n,e)}makeButton(e,t,n){return At.createElement(Z,{color:"black",side:"top",text:e},At.createElement("div",{className:"bd-addon-button",onClick:n},t))}componentWillUnmount(){this.unmounted=!0}get links(){const e=[],t=this.props.addon;return t.website&&e.push(this.makeLink("Website",t.website)),t.source&&e.push(this.makeLink("Source",t.source)),t.invite&&e.push(this.makeLink("Support Server",()=>{const e=/\.gg\/(.*)$/;let n=t.invite;e.test(n)&&(n=n.match(e)[1]),Be.LayerStack.popLayer(),Be.InviteActions.acceptInviteAndTransitionToInviteChannel(n)})),t.donate&&e.push(this.makeLink("Donate",t.donate)),t.patreon&&e.push(this.makeLink("Patreon",t.patreon)),e}get footer(){const e=this.links;return(e.length||this.hasSettings)&&Be.react.createElement("div",{className:"bd-card-footer bda-footer"},Be.react.createElement("span",{className:"bd-addon-links bda-links"},...e.map((t,n)=>n{this.unmounted||this.setState({isTrusted:!e.suspect||"suspect"})},()=>{}))),Be.react.createElement("div",{className:"bd-card bd-addon-card settings-closed ui-switch-item",style:n},Be.react.createElement("div",{className:"bd-addon-header bda-header"},Be.react.createElement("div",{className:"bd-card-title bda-header-title"},this.buildTitle(this.name,this.version,{name:this.author,id:e,link:t})),Be.react.createElement("div",{className:"bd-addon-controls bda-controls"},this.props.edit&&this.makeButton("Edit",At.createElement(Bt,{className:"bd-icon"}),this.edit),this.props.remove&&this.makeButton("Delete",At.createElement(Lt,{className:"bd-icon"}),this.delete),this.props.reload&&this.makeButton("Reload",At.createElement(kt,{className:"bd-icon"}),this.reload),At.createElement(lt,{onChange:this.onChange,checked:this.state.checked}))),Be.react.createElement("div",{className:"bd-scroller-wrap bda-description-wrap scroller-wrap fade"},Be.react.createElement("div",{className:"bd-scroller bd-addon-description bda-description scroller"},this.description)),this.footer)}}const Rt=Tt.prototype.render;Object.defineProperty(Tt.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>Rt});const Ot=Be.React;class jt extends Ot.Component{render(){const e=this.props.size||"16px";return Ot.createElement("svg",{className:this.props.className||"",fill:"var(--text-normal)",viewBox:"0 0 24 24",style:{width:e,height:e}},Ot.createElement("path",{d:"M8.12 9.29L12 13.17l3.88-3.88c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41l-4.59 4.59c-.39.39-1.02.39-1.41 0L6.7 10.7c-.39-.39-.39-1.02 0-1.41.39-.38 1.03-.39 1.42 0z"}))}}const _t=Be.React;class It extends _t.Component{constructor(e){super(e),this.state={open:!1,value:this.props.value||this.props.options[0].value},this.dropdown=_t.createRef(),this.onChange=this.onChange.bind(this),this.showMenu=this.showMenu.bind(this),this.hideMenu=this.hideMenu.bind(this)}showMenu(e){e.preventDefault(),this.setState({open:!0},()=>{document.addEventListener("click",this.hideMenu)})}hideMenu(){this.setState({open:!1},()=>{document.removeEventListener("click",this.hideMenu)})}onChange(e){this.setState({value:e}),this.props.onChange&&this.props.onChange(e)}get selected(){return this.props.options.find(e=>e.value==this.state.value)}get options(){const e=this.selected;return _t.createElement("div",{className:"bd-select-options"},this.props.options.map(t=>_t.createElement("div",{className:"bd-select-option"+(e.value==t.value?" selected":""),onClick:this.onChange.bind(this,t.value)},t.label)))}render(){const e="transparent"==this.props.style?" bd-select-transparent":"",t=this.state.open?" menu-open":"";return _t.createElement("div",{className:`bd-select${e}${t}`,onClick:this.showMenu,ref:this.dropdown},_t.createElement("div",{className:"bd-select-value"},this.selected.label),_t.createElement(jt,{className:"bd-select-arrow"}),this.state.open&&this.options)}}const $t=Be.React;class Wt extends $t.Component{render(){const e=this.props.size||"16px";return $t.createElement("svg",{className:this.props.className||"",fill:"var(--text-normal)",viewBox:"0 0 24 24",style:{width:e,height:e}},$t.createElement("path",{fill:"none",d:"M0 0h24v24H0V0z"}),$t.createElement("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"}))}}const Ft=Be.React;class zt extends Ft.Component{constructor(e){super(e),this.state={focused:!1}}render(){const e=["bd-search-wrapper"];return this.state.focused&&e.push("focused"),Ft.createElement("div",{className:e.join(" ")},Ft.createElement("input",{onChange:this.props.onChange,onKeyDown:this.props.onKeyDown,type:"text",className:"bd-search",placeholder:this.props.placeholder,maxLength:"50",onFocus:()=>{this.setState({focused:!0})},onBlur:()=>{this.setState({focused:!1})}}),Ft.createElement(Wt,null))}}function Ut(){return(Ut=Object.assign||function(e){for(var t=1;t{Os.showConfirmationModal("Are You Sure?",`Are you sure you want to delete ${e}?`,{danger:!0,confirmText:"Delete",onConfirm:()=>{t(!0)},onCancel:()=>{t(!1)}})})}get sortOptions(){return[{label:"Name",value:"name"},{label:"Author",value:"author"},{label:"Version",value:"version"},{label:"Recently Added",value:"added"},{label:"Last Modified",value:"modified"},{label:"File Size",value:"size"}]}get directions(){return[{label:"Ascending",value:!0},{label:"Descending",value:!1}]}reverse(e){this.setState({ascending:e})}sort(e){this.setState({sort:e})}search(e){this.setState({query:e.target.value.toLocaleLowerCase()})}getProps(e){return{key:this.getName(e),enabled:this.cookie[this.getName(e)],toggle:this.manager.toggle.bind(this.manager),edit:h["fork-ps-7"]?this.edit.bind(this):null,remove:this.delete.bind(this),addon:e,hash:e.hash}}getString(e){return e?"string"==typeof e?e:e.toString():"???"}get list(){return"plugins"===this.props.type?Object.values(w):Object.values(v)}getAddons(){const e=this.list.sort((e,t)=>{const n=this.state.sort.charAt(0).toUpperCase()+this.state.sort.slice(1),s=e.plugin&&e.plugin["get"+n]?this.getString(e.plugin["get"+n]()):this.getString(e[this.state.sort]),r=t.plugin&&t.plugin["get"+n]?this.getString(t.plugin["get"+n]()):this.getString(t[this.state.sort]);return"string"==typeof s?s.toLocaleLowerCase().localeCompare(r.toLocaleLowerCase()):s>r?1:r>s?-1:0});this.state.ascending||e.reverse();const t=[];for(let n=0;n{t=!1,e.hide()}},qt.createElement(Lightcord.Api.Components.inputs.Button,{ref:"checkUpdateButton",color:"brand",look:"filled",size:"min",hoverColor:"default",onClick:()=>{try{Ne.showToast("Plugin update check in progress.",{type:"info"}),window.PluginUpdates.checkAll().then(()=>{Ne.showToast("Plugin update check complete.",{type:"success"})}).catch(e=>{console.error(e),Ne.showToast("An error occured while checking update.",{type:"error"})})}catch(e){console.error(e),Ne.showToast("An error occured while checking update.",{type:"error"})}},wrapper:!1,disabled:!1,onRightClick:()=>{this.refs.checkUpdateButton&&window.PluginUpdates&&window.PluginUpdates.plugins&&(t||(e=new J(this.refs.checkUpdateButton.refs.original.refs.button,Object.values(window.PluginUpdates.plugins).map(e=>e.name).join(", "),{side:"bottom",attachEvents:!1}),e.show(),t=!0))}},"Check for Updates")))}render(){const e=qt.createElement(Ht,{color:"black",position:"top",text:"Reload List"},e=>qt.createElement(kt,Ut({},e,{className:"bd-icon bd-reload bd-reload-header",size:"18px",onClick:async()=>{this.isPlugins?j.updatePluginList():Me.updateThemeList(),this.forceUpdate()}}))),t=this.getAddons();return qt.createElement(xt,{title:`${this.props.type.toUpperCase()}—${t.length}`},qt.createElement(Lightcord.Api.Components.inputs.Button,{key:"folder-button",color:"brand",look:"filled",size:"min",hoverColor:"default",onClick:this.openFolder.bind(this),wrapper:!1,style:{marginLeft:"10px"}},"Open ",this.isPlugins?"Plugin":"Theme"," Folder"),this.renderCheckUpdates(),!h["fork-ps-5"]&&e,qt.createElement("div",{className:"bd-controls bd-addon-controls"},qt.createElement(zt,{onChange:this.search,placeholder:`Search ${this.props.type}...`}),qt.createElement("div",{className:"bd-addon-dropdowns"},qt.createElement("div",{className:"bd-select-wrapper"},qt.createElement("label",{className:"bd-label"},"Sort by:"),qt.createElement(It,{options:this.sortOptions,onChange:this.sort,style:"transparent"})),qt.createElement("div",{className:"bd-select-wrapper"},qt.createElement("label",{className:"bd-label"},"Order:"),qt.createElement(It,{options:this.directions,onChange:this.reverse,style:"transparent"})))),qt.createElement("div",{className:"bda-slist bd-addon-list"},t))}}const Vt=Gt.prototype.render;Object.defineProperty(Gt.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>Vt});const Jt=BDModules.get(e=>e.Dispatcher&&e.default&&e.default.dispatch)[0].default,Zt=BDModules.get(e=>e.ActionTypes)[0].ActionTypes,Kt=process.pid;var Yt=new class{constructor(){this.enabled=!1,this.game=u}get formatedGame(){if(!this.game)return null;if(!1===this.enabled)return null;return{name:this.game.name||p.name,application_id:this.game.application_id||p.application_id,details:this.game.details||void 0,state:this.game.state||void 0,timestamps:this.game["timestamps.start"]?{start:this.game["timestamps.start"]}:void 0,assets:this.game["assets.large"]?{large_image:this.game["assets.large"],small_image:this.game["assets.small"]||void 0}:void 0}}sendGame(){Jt.dispatch({type:Zt.LOCAL_ACTIVITY_UPDATE,socketId:"lightcord-spoof-socket",pid:Kt,activity:this.formatedGame})}enable(){this.enabled||(this.enabled=!0,console.log("Enabling custom RichPresence"),this.set(u||Object.create(p)),this.sendGame())}disable(){this.enabled&&(this.enabled=!1,console.log("Disabling custom RichPresence"),this.sendGame())}async fetchAssets(e){let t=await BDModules.get(e=>e.getAssets)[0].getAssets(e);if(t.undefined&&"number"==typeof t.undefined)throw new Error("Unknown Application");return t}set(e){this.game=e,this.sendGame()}};const Xt=Be.React;let Qt;class en extends Xt.Component{constructor(e){super(e),this.state={data:P.getSettingGroup("rpc")||p,assets:[]},this.preview=null,this.isfetching=!1,this.state.data.application_id&&this.fetchAssets(),this.assetComponents=new Set}updateWhenFetched(e){this.assetComponents.add(e)}onChange(e,t){let n=tn.find(t=>t.id===e.props.id);this.setState({data:Object.assign(u,this.state.data,{[n.id]:t||null}),assets:this.state.assets}),"application_id"===e.props.id&&this.fetchAssets(),P.setSettingGroup("rpc",u),this.preview.forceUpdate(),Yt.set(u)}fetchAssets(){if(!0===this.isfetching){let e=this.state.data.application_id;setTimeout(()=>{this.state.data.application_id===e&&this.fetchAssets()},5e3)}if(!this.state.data.application_id)return this.setState({data:this.state.data,assets:[]}),this.forceUpdate(),void this.assetComponents.forEach(e=>e.forceUpdate());this.isfetching=!0,Yt.fetchAssets(this.state.data.application_id).then(e=>{this.isfetching=!1,this.setState({data:this.state.data,assets:Object.keys(e).map(t=>{let n=e[t];return{id:n.id,name:n.name,type:n.type}})}),this.forceUpdate(),this.assetComponents.forEach(e=>e.forceUpdate())}).catch(()=>{this.isfetching=!1,this.setState({data:this.state.data,assets:[]}),this.forceUpdate(),this.assetComponents.forEach(e=>e.forceUpdate())})}updatePreview(e){this.setState({data:e})}get modules(){return Qt||(Qt=[BDModules.get(e=>e.marginBottom20)[0]])}render(){let[e]=this.modules;return[Xt.createElement(bt,{title:"RichPresence Settings",settings:this.props.settings,onChange:this.props.onChange}),Xt.createElement(ft,null),Xt.createElement(Re,{text:"RichPresence"}),Xt.createElement("div",null,this.optionsComponents),Xt.createElement("div",null,Xt.createElement(ft,null),Xt.createElement(Re,{text:"Preview"}),Xt.createElement(vn,{settings:this})),Xt.createElement("div",{className:e.marginBottom20}),Xt.createElement("button",{style:{opacity:.01},onClick:window.ohgodohfuck},"Oh god Oh fuck"),Xt.createElement("button",{style:{opacity:.01},onClick:()=>{$.remote.shell.openExternal("https://www.youtube.com/watch?v=LkYa7rps_g4")}},"See ? I pulled a litle sneaky on ya")]}get optionsComponents(){return this._optionsComponents||(this._optionsComponents=tn.map(e=>{if("text"===e.type)return Xt.createElement(on,{setting:e,manager:this,id:e.id});if("number"===e.type){return[Xt.createElement(an,{setting:e,manager:this,id:e.id})]}return"choice"===e.type?["assets.small","assets.large"].includes(e.id)?Xt.createElement(ln,{setting:e,manager:this,id:e.id,choices:[{value:"none",label:"No assets"}].concat(this.state.assets.map(e=>({value:"asset-"+e.id,label:e.name})))}):"Unknown choice.":void 0}))}}const tn=[{title:"Application ID",id:"application_id",type:"number",placeholder:"711416957718757418"},{title:"Name",id:"name",type:"text",placeholder:"Lightcord"},{title:"Details",id:"details",type:"text",placeholder:"Browsing Discord"},{title:"State",id:"state",type:"text",placeholder:"Lightcord Client"},{title:"Timestamp Start",id:"timestamps.start",type:"number",get placeholder(){return Date.now()}},{title:"LargeAsset",id:"assets.large",type:"choice"},{title:"SmallAsset",id:"assets.small",type:"choice"}];let nn,sn,rn;class on extends Xt.PureComponent{get modules(){return nn&&nn[0]?nn:nn=[BDModules.get(e=>e.removeKeybind)[0],BDModules.get(e=>e.marginBottom20)[0],BDModules.get(e=>e.defaultMarginh5)[0],BDModules.get(e=>e.colorStandard)[0],BDModules.get(e=>e.size32)[0],BDModules.get(e=>e._horizontal)[0],BDModules.get(e=>e.inputMini)[0],BDModules.get(e=>e.size16&&e.size20)[0]]}constructor(e){super(e);let t=this.props.setting;this.state={data:this.props.manager.state.data[t.id]},this.input=Xt.createElement(window.Lightcord.Api.Components.inputs.TextInput,{placeholder:t.placeholder,name:t.id,value:this.state.data,onChange:e=>{this.setState({data:e}),!this.lastEdited||this.lastEdited{this.props.manager.onChange(this,this.state.data),this.isTiming=null,this.lastEdited=Date.now()},500))},type:"text"})}render(){let e=this.props.setting,[t,n,s,r,o,i,a,l]=this.modules;return Xt.createElement("div",{className:t.row+" "+n.marginBottom20},Xt.createElement("div",{className:`${t.item} ${i.flexChild}`},Xt.createElement("h5",{className:r.colorStandard+" "+o.size14+" "+s.h5+" "+s.defaultMarginh5},e.title),this.input),Xt.createElement(yn,null))}}class an extends Xt.PureComponent{get modules(){return sn||(sn=[BDModules.get(e=>e.removeKeybind)[0],BDModules.get(e=>e.marginBottom20)[0],BDModules.get(e=>e.defaultMarginh5)[0],BDModules.get(e=>e.colorStandard)[0],BDModules.get(e=>e.size32)[0],BDModules.get(e=>e._horizontal)[0],BDModules.get(e=>e.inputMini)[0],BDModules.get(e=>e.size16&&e.size20)[0],BDModules.get(e=>e.colorTransparent)[0]])}constructor(e){super(e);let t=this.props.setting;this.state={data:this.props.manager.state.data[t.id]},this.input=Xt.createElement(window.Lightcord.Api.Components.inputs.TextInput,{placeholder:t.placeholder,name:t.id,value:this.state.data,type:"number",onChange:(e,t,n)=>{(e=e.replace(/[^\d]+/g,""))!=this.state.data?(!this.lastEdited||this.lastEdited{this.props.manager.onChange(this,this.state.data),this.isTiming=null,this.lastEdited=Date.now()},500)),this.setState({data:e})):n.setValue(e)},type:"text"})}render(){let e=this.props.setting,[t,n,s,r,o,i]=this.modules;return Xt.createElement("div",{className:t.row+" "+n.marginBottom20},Xt.createElement("div",{className:`${t.item} ${i.flexChild}`},Xt.createElement("h5",{className:r.colorStandard+" "+o.size14+" "+s.h5+" "+s.defaultMarginh5},e.title),this.input,"timestamps.start"===e.id?Xt.createElement(Lightcord.Api.Components.inputs.Button,{onClick:()=>{DiscordNative.clipboard.copy(Date.now()+"")},color:"brand"},"Copy current timestamp"):null),Xt.createElement(yn,null))}}class ln extends Xt.PureComponent{constructor(e){super(e);let t=this.props.setting;this.state={data:this.props.manager.state.data[t.id]?"asset-"+this.props.manager.state.data[t.id]:"none"},this.props.manager.updateWhenFetched(this)}onChange(e){let t=e.value;!this.lastEdited||this.lastEdited{this.props.manager.onChange(this,"none"===this.state.data?null:this.state.data.replace("asset-","")),this.isTiming=null,this.lastEdited=Date.now()},500)),this.setState({data:t}),this.forceUpdate()}get modules(){return rn||(rn=[BDModules.get(e=>e.removeKeybind)[0],BDModules.get(e=>e.marginBottom20)[0],BDModules.get(e=>e.defaultMarginh5)[0],BDModules.get(e=>e.colorStandard)[0],BDModules.get(e=>e.size32)[0],BDModules.get(e=>e._horizontal)[0]])}render(){let e=this.props.setting,[t,n,s,r,o,i]=this.modules,a=this.props.manager.state.assets.map(e=>({value:"asset-"+e.id,label:e.name}));return a.unshift({value:"none",label:"No assets"}),Xt.createElement("div",{className:t.row+" "+n.marginBottom20},Xt.createElement("div",{className:`${t.item} ${i.flexChild}`},Xt.createElement("h5",{className:r.colorStandard+" "+o.size14+" "+s.h5+" "+s.defaultMarginh5},e.title),Xt.createElement(window.Lightcord.Api.Components.inputs.Dropdown,{value:this.state.data,options:a,onChange:this.onChange.bind(this)})),Xt.createElement(yn,null))}}let cn,dn,hn,un,pn,mn,gn,fn,bn=[];class yn extends Xt.PureComponent{get modules(){return bn&&bn[0]?bn:bn=[BDModules.get(e=>e.divider&&1===Object.keys(e).length)[0],BDModules.get(e=>e.dividerDefault)[0]]}render(){let[e,t]=this.modules;return Xt.createElement("div",{class:`${e.divider} ${t.dividerDefault}`})}}Xt.Component;class vn extends Xt.Component{constructor(e={}){super(e),this.state={active:"profile"},this.tabs=[],this.props.settings.preview=this}changeTab(e){this.state.active!==e.props.id&&(this.tabs.forEach(e=>{e.setActive(!1)}),e.setActive(!0),this.setState({active:e.props.id}))}render(){return Xt.createElement("div",{className:"lc-tabWrapper"},Xt.createElement("div",{className:"lc-tabnav",style:{flex:"0 1 auto"}},Xt.createElement(wn,{preview:this,title:"Full Profile",id:"profile"}),Xt.createElement(wn,{preview:this,title:"User Popout",id:"popout"})),Xt.createElement(Cn,{preview:this.preview,state:this.state.rpc,props:{preview:this},key:this.state.active}))}isActive(e){return this.state.active===e}get preview(){return"profile"===this.state.active?Sn:En}}class wn extends Xt.Component{constructor(e){super(e),this.state={active:e.preview.isActive(e.id)},e.preview.tabs.push(this)}setActive(e){this.setState({active:!!e})}render(){let e="lc-navItem";return this.state.active?e+=" lc-navItemActive":e+=" lc-navItemInactive",Xt.createElement("div",{className:e,onClick:()=>{this.props.preview.changeTab(this)}},this.props.title)}}class Cn extends Xt.Component{componentDidCatch(e,t){console.error(e,t),this.setState({error:!0})}render(){if(this.state||(this.state={error:!1}),this.state.error)return cn=cn||Be.WebpackModules.find(e=>e.emptyStateImage&&e.emptyState),cn?Xt.createElement("div",{style:{margin:"20px"}},Xt.createElement("div",{style:{backgroundColor:"var(--background-primary)",padding:"30px 30px",borderRadius:"8px"},className:"lc-tab-box-shadow "+cn.emptyState},Xt.createElement("div",{className:cn.emptyStateImage,style:{marginTop:"20px"}}),Xt.createElement("div",{className:cn.emptyStateHeader},"An error occured"),Xt.createElement("p",{className:cn.emptyStateSubtext},"Please check the console for more informations. Join our ­",Xt.createElement("a",{className:`${Be.anchorClasses.anchor} ${Be.anchorClasses.anchorUnderlineOnHover}`,role:"button",tabindex:0,onClick:()=>{Be.joinLC()}},"support server"),"­ for help."))):(Ne.showToast("An error occured. Please check the console for more informations."),null);try{const e=new this.props.preview(this.props.props);return e.setState(this.props.state),e.render()}catch(e){return console.error(e),this.state.error=!0,this.render()}}}class En extends Xt.Component{get modules(){return dn||(dn=[Be.WebpackModules.find(e=>e.default&&"UserPopout"===e.default.displayName),Be.WebpackModules.find(e=>e.default&&e.default.getCurrentUser)])}getComponent(){let[e,t]=this.modules;const n=t.default.getCurrentUser();return Xt.createElement(()=>{let t=e.default({userId:n.id,guildId:null,channelId:null,disableUserProfileLink:!0});return hn=t.type,un=t.props,this.render()},null)}render(){if(!hn)return this.getComponent();let[e,t]=this.modules;const n=t.default.getCurrentUser();let s=Object.assign({},p,this.props.preview.props.settings.state.data);const r=function(){if(!this.game)return null;return{name:this.game.name||p.name,application_id:this.game.application_id||p.application_id,details:this.game.details||void 0,state:this.game.state||void 0,timestamps:this.game["timestamps.start"]?{start:this.game["timestamps.start"]}:void 0,assets:this.game["assets.large"]?{large_image:this.game["assets.large"],small_image:this.game["assets.small"]||void 0}:void 0,type:0}}.call({game:s}),o=new hn(Object.assign({},un,{activity:r,userId:n.id})).render().props.children,i=Xt.createElement("div",window.Lightcord.Api._.excludeProperties(o.props,["onClick","onContextMenu"]));return Xt.createElement("div",{className:"lc-userPopout lc-tab-box-shadow"},i)}}class Sn extends Xt.Component{get modules(){return pn||(pn=[Be.WebpackModules.find(e=>e.default&&"UserProfile"===e.default.displayName),Be.WebpackModules.find(e=>e.default&&e.default.getCurrentUser)])}render(){let[e,t]=this.modules;const n=t.default.getCurrentUser();if(!mn){const t=new e.default({user:n}).render();fn=t.type;const s=new t.type(t.props).render(),r=s.type.render(s.props,null),o=new r.type(r.props).render();mn=o.type}if(!mn)throw new Error("Couldn't find the UserProfileComponent component.");let s=Object.assign({},p,this.props.preview.props.settings.state.data);const r=function(){if(!this.game)return null;return{name:this.game.name||p.name,application_id:this.game.application_id||p.application_id,details:this.game.details||void 0,state:this.game.state||void 0,timestamps:this.game["timestamps.start"]?{start:this.game["timestamps.start"]}:void 0,assets:this.game["assets.large"]?{large_image:this.game["assets.large"],small_image:this.game["assets.small"]||void 0}:void 0,type:0}}.call({game:s});gn=new fn({user:n,close:()=>{}}).render().props;const o=new mn(Object.assign({},gn,{activity:r})).render().props.children;return o.props.style={width:"auto"},Xt.createElement("div",{className:"lc-tab lc-tab-box-shadow"},o)}}const xn=Be.React;let kn=BDModules.get(e=>e.defaultMarginh5)[0],Dn=BDModules.get(e=>e.colorStandard)[0],Mn=BDModules.get(e=>e.size32)[0],Bn=BDModules.get(e=>e.scrollbarGhostHairline)[0];const Nn=BDModules.get(e=>e.default&&e.default.getGuilds)[0].default,Ln=BDModules.get(e=>e.default&&e.default.getRelationships)[0].default,An=BDModules.get(e=>e.default&&e.default.getSessions)[0].default,Pn=BDModules.get(e=>e.default&&e.default.getCurrentUser)[0].default;class Tn extends xn.Component{constructor(e){super(e)}render(){return kn||(kn=BDModules.get(e=>e.defaultMarginh5)[0]),Dn||(Dn=BDModules.get(e=>e.colorStandard)[0]),Mn||(Mn=BDModules.get(e=>e.size32)[0]),[xn.createElement(Re,{text:"Account Infos"}),xn.createElement("div",null,xn.createElement("h5",{className:Dn.colorStandard+" "+Mn.size14+" "+kn.h5+" "+kn.defaultMarginh5},"Profile"),xn.createElement(_n,{content:this.getProfileValue(),language:"diff"}),xn.createElement("h5",{className:Dn.colorStandard+" "+Mn.size14+" "+kn.h5+" "+kn.defaultMarginh5},"Statistics"),xn.createElement(_n,{content:this.getStatistics(),language:"diff"}),xn.createElement("h5",{className:Dn.colorStandard+" "+Mn.size14+" "+kn.h5+" "+kn.defaultMarginh5},"Connected Sessions"),xn.createElement(_n,{content:this.getSessionValue(),language:"diff"})),xn.createElement("div",{className:BDModules.get(e=>e.marginBottom20)[0].marginBottom20})]}getSessionValue(){const e=An.getSessions(),t=Object.keys(e).filter(e=>"all"!==e).map(t=>e[t]);return 0===t.length?"- No session detected. Please try in a few seconds":t.map(e=>`+ id: ${e.sessionId}\n+ os: ${e.clientInfo.os[0].toUpperCase()+e.clientInfo.os.slice(1)}\n+ client: ${e.clientInfo.client}\n+ status: ${e.status}\n+ Activities: ${e.activities.length}`).join("\n"+"-".repeat(38)+"\n")}getProfileValue(){const e=Pn.getCurrentUser(),t=e.createdAt;let n=e.avatarURL;return e.avatar&&e.avatar.startsWith("a_")&&(n=e.getAvatarURL("gif")),n.startsWith("/")&&(n="https://discord.com"+n),n.endsWith("?size=128")&&(n=n.replace("?size=128","?size=4096")),`+ Username: ${e.username}\n+ Discriminator: ${e.discriminator}\n+ Tag: ${e.tag}\n+ ID: ${e.id}\n+ Avatar: ${e.avatar}\n+ Avatar URL: ${n}\n+ Creation Date: ${t.getDate().toString().padStart(2,"0")}/${(t.getMonth()+1).toString().padStart(2,"0")}/${t.getFullYear().toString().padStart(2,"0")} ${t.getHours().toString().padStart(2,"0")}h ${t.getMinutes().toString().padStart(2,"0")}min ${t.getSeconds()}s\n+ Flags: ${e.flags}\n+ Has Nitro: ${e.hasPremiumSubscription?"Yes":"No"}\n- Email: ${e.email}\n- 2FA: ${e.mfaEnabled?"Yes":"No"}\n- Has Been On Mobile: ${e.mobile?"Yes":"No"}\n- Phone: ${e.phone||"None"}\n- Verified: ${e.verified}\n- Can See NSFW Channels: ${e.nsfwAllowed}`}getStatistics(){const e=Object.values(Nn.getGuilds()),t=Object.keys(Ln.getRelationships()),n=t.filter(e=>Ln.isFriend(e)),s=t.filter(e=>Ln.isBlocked(e));return`+ Server Count: ${e.length} servers\n+ Relations: ${t.length} relations\n+ Friends Count: ${n.length} friends\n- Blocked Users Count: ${s.length} blocked users`}}let Rn=BDModules.get(e=>e.highlight)[0],On=BDModules.get(e=>e.markup)[0],jn=BDModules.get(e=>e.messageContent)[0];class _n extends xn.Component{render(){return On||(On=BDModules.get(e=>e.markup)[0]),jn||(jn=BDModules.get(e=>e.messageContent)[0]),Bn||(Bn=BDModules.get(e=>e.scrollbarGhostHairline)[0]),Rn||(Rn=BDModules.get(e=>e.listLanguages)[0]),xn.createElement("div",{class:`${On.markup} ${jn.messageContent}`},xn.createElement("pre",null,xn.createElement("code",{class:Bn.scrollbarGhostHairline+" hljs",dangerouslySetInnerHTML:{__html:Rn.highlight(this.props.language,this.props.content).value}})),xn.createElement("div",{className:BDModules.get(e=>e.marginBottom8)[0].marginBottom8}))}}const In=window.Lightcord.DiscordModules.dispatcher,$n=BDModules.get(e=>e.default&&e.default.getChannel&&e.default.hasChannel)[0].default;let Wn=BDModules.get(e=>e.default&&e.default.addRelationship)[0],Fn=BDModules.get(e=>e.default&&e.default.closePrivateChannel)[0];const zn={};let Un=BDModules.get(e=>e.default&&e.default.getCurrentUser)[0];var Hn=new class{constructor(){this.antiDM=this.antiDM.bind(this),this.enabled=!1}enable(){this.enabled||(this.enabled=!0,In.subscribe("MESSAGE_CREATE",this.antiDM))}disable(){this.enabled&&(this.enabled=!1,In.unsubscribe("MESSAGE_CREATE",this.antiDM))}antiDM(e){if(!e.message.author.bot)return;if(e.message.author.id===(Un?Un.default.getCurrentUser():null).id&&e.message.guild_id)return;const t=$n.getChannel(e.message.channel_id);var n;t&&(1===t.type&&(zn[e.message.author.id]||(n=e.message,(/(discord\.gg|discord\.com\/invite\/|discordapp\.com\/invite\/)/g.test(n.content)||qn(n,"discord.gg/")||qn(n,"discord.com/invite/")||qn(n,"discordapp.com/invite/"))&&(zn[e.message.author.id]=!0,Ne.showToast(`[AdBlock]: Blocked ${e.message.author.username}#${e.message.author.discriminator}`,{type:"warning"}),Wn||(Wn=BDModules.get(e=>e.default&&e.default.addRelationship)[0]),Wn.default.addRelationship(e.message.author.id,{location:"ContextMenu"},2),Fn||(Fn=BDModules.get(e=>e.default&&e.default.closePrivateChannel)[0]),Fn.default.closePrivateChannel(t.id,!1)))))}};function qn(e,t){let n=e.embeds||[];return 0!==n.length&&n.map(e=>"rich"===e.type&&(!!(e.title||"").includes(t)||(!!(e.description||"").includes(t)||(!!((e.footer?e.footer.text:"")||"").includes(t)||!!(e.fields||[]).map(e=>e.value.includes(t)||e.name.includes(t)).includes(!0))))).includes(!0)}let Gn;const Vn=Ne.removeDa;var Jn=new class{constructor(){this.enabled=!1}enable(){this.enabled||(this.enabled=!0,Gn=Gn||function(){let e=BDModules.get(e=>e.standardSidebarView)[0];if(!e)return null;let t=Vn(e.standardSidebarView),n=[],s=BDModules.get(e=>e.userSettingsAccount)[0];const r=BDModules.get(e=>"string"==typeof e.children)[0];return n.push(`#app-mount .${t} .payment-info .${Vn(BDModules.get(e=>e.description&&"string"==typeof e.description&&e.description.includes("formText"))[0].description)}`),n.push(`#app-mount .${t} .${Vn(BDModules.get(e=>e.paymentSourceRow)[0].paymentSourceRow)} .${Vn(BDModules.get(e=>e.subText&&e.descriptionWrapper)[0].subText)}`),s&&(n.push(`#app-mount .${t} .${Vn(s.userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${Vn(BDModules.get(e=>e.viewBody)[0].viewBody)}`),n.push(`.${Vn(s.userSettingsSecurity)} .${Vn(r.children)} > div:nth-child(2)`)),console.log(n),n}(),Gn||console.error(new Error("Couldn't find selectors to blur personnal informations.")),ke.addStyle("blurPrivate",`\n${Gn.join(", ")} {\n transition: all 150ms cubic-bezier(.55,.085,.68,.53);\n filter: blur(4px);\n opacity: .8;\n}\n\n${Gn.map(e=>e+":hover").join(", ")} {\n transition: all 150ms cubic-bezier(.55,.09,.68,.53);\n filter: none;\n opacity: 1;\n}`))}disable(){this.enabled&&(this.enabled=!1,ke.removeStyle("blurPrivate"))}},Zn=new class{constructor(){window.Lightcord.Api.ensureExported(e=>e.default&&e.default.startTyping).then(e=>{let t=this;const n=e.default.startTyping;e.default.startTyping=function(){if(t.disabled)return n.call(this,...arguments)};const s=e.default.stopTyping;e.default.stopTyping=function(){if(t.disabled)return s.call(this,...arguments)},this.disabled=!0}),window.Lightcord.BetterDiscord.DisableTyping=this}disable(){this.disabled=!0}enable(){this.disabled=!1}};let Kn;class Yn extends React.PureComponent{constructor(){super(...arguments),this.state={states:[]}}render(){Kn||(Kn=D.find(e=>e.FormSection));const e=[...new Set(Object.keys(window.Lightcord.Api.Components).map(e=>Object.keys(window.Lightcord.Api.Components[e]).map(t=>window.Lightcord.Api.Components[e][t])).flat())];return[React.createElement(Kn.FormSection,{tag:"h2",title:"Lightcord's Api Availlable components"},React.createElement(Kn.FormText,{type:"description",className:"",selectable:!1},"These components are here for the plugin devs. They can quickly embed any component below with this panel.",React.createElement("div",{style:{marginTop:"20px"}}),React.createElement(Lightcord.Api.Components.general.AlertBox,{type:"info"},"All these components have error handling. If you want none, add `.original` after the component path."),React.createElement(Lightcord.Api.Components.general.AlertBox,{type:"warn"},"We do not recommend modifying these component with plugins. Only do this if you know what you are doing.")),React.createElement(ft,null),React.createElement(Lightcord.Api.Components.inputs.Button,{color:"brand",look:"outlined",size:"medium",hoverColor:"green",onClick:()=>{$.remote.shell.openExternal("https://lightcord.deroku.xyz/LightcordApi/docs")},wrapper:!1},"Documentation")),e.map(e=>{const t=e.displayName||e.name,n=`Lightcord.Api.Components.${Object.keys(window.Lightcord.Api.Components).find(e=>window.Lightcord.Api.Components[e][t])}.${t}`;return React.createElement(Xn,{key:n,comp:e})})]}get renders(){}}class Xn extends React.Component{constructor(e){super(e),this.state={tab:"preview",elem:e.comp,options:{}}}render(){const e=this.props.comp;let t=[];e.AllPreviews&&(t=e.AllPreviews);let n=this.state,s=()=>{let e={};return t.forEach(t=>{e[Object.keys(t[0])[0]]=t[0][Object.keys(t[0])[0]]}),Object.keys(n.options).forEach(s=>{e[s]=t.find(e=>e.find(e=>e[s]))[n.options[s]][s]}),e},r=(e,t,n)=>{if("string"==typeof e)return e;if("boolean"==typeof e)return String(e);if("function"==typeof e)return e.toString();if("object"==typeof e){if(e&&e.$$typeof&&(e.$$typeof===Symbol.for("react.element")||60103===e.$$typeof)){if("Lightcord.Api.Components.general.Tabs"===t){if("react"===n)return'React.createElement("div", {style: {\nmarginTop: "20px", marginBottom: "20px"\n}},\nReact.createElement("div", {style: {\nbackgroundColor: "var(--background-secondary)",\npadding: "30px 30px",\nborderRadius: "8px"\n}, className: "lc-tab-box-shadow" },\nReact.createElement(Lightcord.Api.Components.general.Title, null, "Preview tabs")\n)\n)';if("jsx"===n)return'
\n
\n Preview tabs\n
\n
'}return"Your components here."}return JSON.stringify(e,null," ")}return String(e)},o=function(t){const n=e.displayName||e.name;const o=`Lightcord.Api.Components.${Object.keys(window.Lightcord.Api.Components).find(e=>window.Lightcord.Api.Components[e][n])}.${n}`,i=s();if("jsx"===t){let e,n=[],s=null;if(Object.keys(i).forEach(e=>{if("children"==e)s=r(i[e],o,t);else{let s=e+"=";"string"==typeof i[e]?s+=JSON.stringify(i[e]):s+=`{${r(i[e],o,t)}}`,n.push(s)}}),s){return e=`<${o} ${n.join(" ")}>`,`${e}\n ${s}\n${``}`}return e=`<${o} ${n.join(" ")}/>`,e}if("react"===t){let e=i.children||null;delete i.children,e&&e.$$typeof&&(e.$$typeof===Symbol.for("react.element")||60103===e.$$typeof)&&(e=r(e,o,t));let n=[];Object.keys(i).forEach(e=>{let s=(/[^\w\d_]/g.test(e)?JSON.stringify(e):e)+": ";"string"==typeof i[e]?s+=JSON.stringify(i[e]):s+=r(i[e],o,t).split("\n").map((e,t)=>0===t?e:" "+e).join("\n"),n.push(s)});let s="{";n.length?n.forEach((e,t)=>{let r=t===n.length-1;0===t||(s+=","),s+="\n ",s+=e,r&&(s+="\n}")}):s+="}";let a="string"==typeof e&&e.startsWith("React.createElement")?e:JSON.stringify(e);return`React.createElement(${o}, ${s}, ${a})`}},i=e.help||{},a=i.info?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"info"},i.info):null,l=i.warn?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"warn"},i.warn):null,c=i.danger?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"danger"},i.danger):null,d=i.error?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"error"},i.error):null,h=i.success?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"success"},i.success):null;return React.createElement("div",null,React.createElement(window.Lightcord.Api.Components.general.SettingsTitle,null,e.displayName||e.name),a,h,l,d,c,t.map(e=>{if(e[0].onClick)return null;if(e[0].text)return null;if(e[0].children)return null;if(1===e.length)return null;let t=Object.keys(e[0])[0];return[React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle,null,t),React.createElement(window.Lightcord.Api.Components.inputs.Dropdown,{options:e.map((e,t)=>({value:"opt-"+t,label:JSON.stringify(e[Object.keys(e)[0]])})),value:"opt-"+(n.options[t]||"0"),onChange:e=>{this.setState({options:Object.assign({},n.options,{[t]:(e.value||"0").replace("opt-","")})})},searchable:!0}),React.createElement("div",{style:{marginBottom:"8px"}})]}),React.createElement(window.Lightcord.Api.Components.general.Tabs,{tabs:[{label:"Preview",id:"preview"},{label:"Code",id:"code"}],active:n.tab,children:"preview"===n.tab?React.createElement("div",{style:{margin:"20px"}},React.createElement("div",{style:{backgroundColor:"var(--background-secondary)",padding:"30px 30px",borderRadius:"8px"},className:"lc-tab-box-shadow"},React.createElement(e,s()))):React.createElement("div",{style:{margin:"20px"}},React.createElement("div",{style:{backgroundColor:"var(--background-secondary)",padding:"30px 30px",borderRadius:"8px"},className:"lc-tab-box-shadow"},React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle,null,"JSX"),React.createElement(window.Lightcord.Api.Components.general.ErrorCatcher,null,React.createElement(()=>React.createElement(window.Lightcord.Api.Components.general.CodeBlock,{language:"jsx",content:o("jsx")}))),React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle,null,"React"),React.createElement(window.Lightcord.Api.Components.general.ErrorCatcher,null,React.createElement(()=>React.createElement(window.Lightcord.Api.Components.general.CodeBlock,{language:"js",content:o("react")}))))),onChange:e=>{this.setState({tab:e})}}))}}const Qn=Be.React;class es extends Qn.Component{render(){const e=this.props.size||"18px";return Qn.createElement("svg",{viewBox:"0 0 24 24",fill:"var(--text-normal)",className:this.props.className||"",style:{width:e,height:e},onClick:this.props.onClick},Qn.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}),Qn.createElement("path",{d:"M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"}))}}var ts=new class{constructor(){this.windows=new Map,this.enabled=!1,this.init()}async init(){let e=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.getWindow);window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_OPEN",t=>{setImmediate(()=>{const n=e.default.getWindow(t.key);this.windows.set(t.key,n);let s=n.document.body.classList;s.add("window-popout"),s.add("lightcord"),s.add("lightcord"),this.update(t.key)})}),window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_CLOSE",e=>{setImmediate(()=>{this.windows.delete(e.key)})}),R.on("theme-enabled",()=>{this.update()}),R.on("theme-disabled",()=>{this.update()}),R.on("theme-reloaded",()=>{this.update()}),R.on("theme-unloaded",()=>{this.update()}),R.on("theme-loaded",()=>{this.update()})}enable(){this.enabled=!0,this.update()}disable(){this.enabled=!1,this.update()}update(e){if(this.windows.size)return this.enabled?this.applyThemes(e):this.removeThemes(e)}removeThemes(e){if(!this.enabled)if(e){let t=this.windows.get(e);if(!t)return;let n=t.document;for(let e of n.querySelectorAll("style[data-lightcord-theme=true]"))e.remove()}else for(let e of this.windows.keys())this.removeThemes(e)}applyThemes(e){if(this.enabled)if(e){let t=this.windows.get(e);if(!t)return;let n=t.document;for(let e of n.querySelectorAll("style[data-lightcord-theme=true]"))e.setAttribute("will-remove","true");Object.keys(bdthemes).forEach(e=>{if(!E[e])return;const t=bdthemes[e];if(!t)return;let s=n.querySelector("style[data-lightcord-theme=true]#"+ke.escapeID(t.id));if(s)s.innerHTML=unescape(t.css),s.removeAttribute("will-remove");else{const e=n.createElement("style");e.id=ke.escapeID(t.id),e.innerHTML=unescape(t.css),e.setAttribute("data-lightcord-theme","true"),n.head.append(e)}});for(let e of n.querySelectorAll("style[will-remove=true]"))e.remove()}else for(let e of this.windows.keys())this.applyThemes(e)}};class ns extends React.PureComponent{render(){let e=D.find(e=>e.Separator&&e.Header&&e.Item);const t=React.createElement(Z,{color:"black",side:"top",text:"Changelog"},React.createElement("span",{style:{float:"right",cursor:"pointer"},className:"bd-changelog-button",onClick:()=>{Ne.showChangelogModal(bbdChangelog)}},React.createElement(es,{className:"bd-icon",size:"16px"})));return new e.Header({children:React.createElement("span",null,"Bandaged BD",t),className:"ui-tab-bar-header"})}}let ss=!1;var rs=new class{constructor(){this.onChange=this.onChange.bind(this),this.updateSettings=this.updateSettings.bind(this),this.sidebar=new Ae,this.registerComponents()}registerComponents(){this.sidebar.register("lightcord",os(this.lightcordComponent.bind(this))),this.sidebar.register("status",os(this.PresenceComponent.bind(this))),this.sidebar.register("accountinfo",os(this.AccountInfosComponent.bind(this))),this.sidebar.register("lcapipreview",os(this.ApiPreviewComponent.bind(this))),this.sidebar.register("BDChangelogTitle",os(()=>(new ns).render())),this.sidebar.register("core",os(this.coreComponent.bind(this))),this.sidebar.register("customcss",os(this.customCssComponent.bind(this))),this.sidebar.register("plugins",os(this.renderAddonPane("plugins"))),this.sidebar.register("themes",os(this.renderAddonPane("themes")))}get coreSettings(){const e=this.getSettings("core");return[...new Set(e.map(e=>e.category))].map(t=>({title:t,settings:e.filter(e=>e.category==t)}))}get lightcordSettings(){const e=this.getSettings("lightcord");return[...new Set(e.map(e=>e.category))].map(t=>({title:t,settings:e.filter(e=>e.category==t)}))}get PresenceSettings(){return this.getSettings("status")}getSettings(e){return Object.keys(c).reduce((t,n)=>{const s=c[n];return s.cat===e&&s.implemented&&!s.hidden&&(s.text=n,t.push(s)),t},[])}onChange(e,t,n){this.updateSettings(e,t,n)}updateSettings(e,t,n){if(["lightcord-8","no_window_bound","enable_glasstron","lightcord-10"].includes(e)||(h[e]=t),"bda-gs-2"==e&&(t?ke.addClass(document.body,"bd-minimal"):ke.removeClass(document.body,"bd-minimal")),"bda-gs-3"==e&&(t?ke.addClass(document.body,"bd-minimal-chan"):ke.removeClass(document.body,"bd-minimal-chan")),"bda-gs-1"==e&&(t?nt.addButton():nt.removeButton()),"bda-gs-4"==e&&(t?st.start():st.stop()),"bda-gs-5"==e&&(t?ke.addClass(ke.query("#app-mount"),"bda-dark"):ke.removeClass(ke.query("#app-mount"),"bda-dark")),t&&"bda-gs-6"==e&&Te.inject24Hour(),"bda-gs-7"==e&&(t?Pe.injectColoredText():Pe.removeColoredText()),"fork-ps-4"==e&&(t?ot.start():ot.stop()),"fork-ps-5"==e&&(t?(xe.watchContent("plugin"),xe.watchContent("theme")):(xe.unwatchContent("plugin"),xe.unwatchContent("theme"))),"fork-wp-1"==e&&(Ne.setWindowPreference("transparent",t),t?Ne.setWindowPreference("backgroundColor",null):Ne.setWindowPreference("backgroundColor","#2f3136")),"bda-gs-8"==e&&(t?it.startDebugListener():it.stopDebugListener()),"fork-dm-1"==e&&(t?it.startCopySelector():it.stopCopySelector()),"lightcord-1"===e&&(window.Lightcord.Settings.devMode=!!t,n.forceUpdate()),"lightcord-2"===e&&(window.Lightcord.Settings.callRingingBeat=!!t),"lightcord-presence-1"===e)if(t){Yt.enable();const e=BDModules.get(e=>e.default&&"object"==typeof e.default&&"showCurrentGame"in e.default)[0];e&&!e.default.showCurrentGame&&BDModules.get(e=>e.default&&e.default.updateRemoteSettings)[0].default.updateRemoteSettings({showCurrentGame:!0})}else Yt.disable();if("lightcord-3"===e&&(t?$.remote.getCurrentWindow().setAlwaysOnTop(!0):$.remote.getCurrentWindow().setAlwaysOnTop(!1)),"lightcord-4"===e&&(t?Hn.enable():Hn.disable()),"lightcord-6"===e&&(t?Jn.enable():Jn.disable()),"lightcord-7"===e&&(t?Zn.enable():Zn.disable()),"lightcord-8"===e){let e=$.remote.getGlobal("appSettings");e.set("isTabs",t),e.save(),$.remote.app.relaunch(),$.remote.app.exit()}if("lightcord-9"===e&&ts[t?"enable":"disable"](),"lightcord-10"!==e){if("no_window_bound"===e){let e=$.remote.getGlobal("appSettings");e.set("NO_WINDOWS_BOUND",t),e.delete("IS_MAXIMIZED"),e.delete("IS_MINIMIZED"),e.delete("WINDOW_BOUNDS"),e.save(),$.remote.app.relaunch(),$.remote.app.exit()}if("enable_glasstron"===e){let e=$.remote.getGlobal("appSettings");e.set("GLASSTRON",t),e.save(),$.remote.app.relaunch(),$.remote.app.exit()}this.saveSettings()}else Ps.methods.NotificationsUseShim(t)}async initializeSettings(){h["bda-gs-2"]&&ke.addClass(document.body,"bd-minimal"),h["bda-gs-3"]&&ke.addClass(document.body,"bd-minimal-chan"),h["bda-gs-1"]&&nt.addButton(),h["bda-gs-4"]&&st.start(),h["bda-gs-5"]&&ke.addClass(ke.query("#app-mount"),"bda-dark"),h["bda-gs-6"]&&Te.inject24Hour(),h["bda-gs-7"]&&Pe.injectColoredText(),h["fork-ps-4"]&&ot.start(),h["lightcord-1"]&&(window.Lightcord.Settings.devMode=!0),h["lightcord-2"]&&(window.Lightcord.Settings.callRingingBeat=!0),h["lightcord-presence-1"]&&Yt.enable(),h["lightcord-3"]&&$.remote.getCurrentWindow().setAlwaysOnTop(!0),h["lightcord-4"]&&Hn.enable(),h["lightcord-6"]&&Jn.enable(),h["lightcord-7"]&&Zn.enable(),h["lightcord-9"]&&ts.enable(),h["fork-ps-5"]&&(xe.watchContent("plugin"),xe.watchContent("theme")),h["bda-gs-8"]&&it.startDebugListener(),h["fork-dm-1"]&&it.startCopySelector(),this.saveSettings()}saveSettings(){P.setSettingGroup("settings",h),P.setSettingGroup("rpc",u),P.setSettingGroup("lightcord-settings",m)}loadSettings(){Object.assign(h,P.getSettingGroup("settings")),Object.assign(u,P.getSettingGroup("rpc")),console.log(m,P.getSettingGroup("lightcord-settings")),Object.assign(m,P.getSettingGroup("lightcord-settings"))}renderSidebar(e){return this.sidebar.render(e)}coreComponent(){return Be.react.createElement(yt,{key:"cspanel",onChange:this.onChange,sections:this.coreSettings})}lightcordComponent(e,t){let n=$.remote.getGlobal("appSettings");return[this.lightcordSettings.map((t,s)=>[0===s?null:Be.react.createElement(ft),Be.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},t.title),t.settings.map(t=>{let s=h[t.id];"lightcord-8"===t.id&&(s=n.get("isTabs",!1)),"no_window_bound"===t.id&&(s=n.get("NO_WINDOWS_BOUND",!1)),"enable_glasstron"===t.id&&(s=n.get("GLASSTRON",!0)),"lightcord-10"===t.id&&(s=!n.get("DEFAULT_NOTIFICATIONS",!0));let r=Be.react.createElement(ht,{id:t.id,key:t.id,data:t,checked:s,onChange:(t,n)=>{this.onChange(t,n,e)}});return"lightcord-8"==t.id&&s?[r,React.createElement(Lightcord.Api.Components.inputs.Button,{color:"green",look:"outlined",size:"small",hoverColor:"brand",onClick:()=>{DiscordNative.ipc.send("NEW_TAB")},wrapper:!1,disabled:!1},"Open a new Tab")]:r})]),Be.react.createElement(window.Lightcord.Api.Components.inputs.Button,{color:"yellow",look:"ghost",size:"medium",hoverColor:"red",onClick(){console.log("Should relaunch"),$.remote.app.relaunch({args:$.remote.process.argv.slice(1).concat(["--disable-betterdiscord"])}),$.remote.app.quit()},wrapper:!0},"Relaunch without BetterDiscord"),React.createElement(Lightcord.Api.Components.inputs.Button,{color:"yellow",look:"ghost",size:"medium",hoverColor:"red",onClick:()=>{ss||(ss=!0,Ne.showToast("Clearing cache...",{type:"info"}),t(),$.remote.getCurrentWebContents().session.clearCache().then(()=>{Ne.showToast("Cache is cleared !",{type:"success"}),ss=!1,t()}).catch(e=>{console.error(e),Ne.showToast("An error occured. Check console for more informations.",{type:"error"}),ss=!1,t()}))},wrapper:!0,disabled:ss},"Clear cache")]}PresenceComponent(){return Be.react.createElement(en,{key:"lppannel",onChange:this.onChange,settings:this.PresenceSettings})}AccountInfosComponent(){return Be.react.createElement(Tn,{key:"lapannel"})}ApiPreviewComponent(){return Be.react.createElement(Yn,{key:"lapipannel"})}customCssComponent(){return Be.react.createElement(Ct,{key:"csseditor"})}renderAddonPane(e){class t extends Be.react.Component{constructor(e){super(e),this.prefix=this.props.type.replace("s","")}onChange(){this.props.onChange(this.props.type)}render(){return this.props.children}}const n=t.prototype.render;return Object.defineProperty(t.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>n}),function(){return Be.react.createElement(t,{type:e},Be.react.createElement(Gt,{type:e}))}}};function os(e){class t extends React.Component{render(){return e(n,()=>this.forceUpdate())}}let n;return e=>(n=e,t)}class is extends Be.reactComponent{render(){return Be.react.createElement("svg",{height:"100%",width:this.props.size||"16px",className:"bd-logo "+this.props.className,style:{fillRule:"evenodd",clipRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},viewBox:"0 0 2000 2000"},Be.react.createElement("metadata",null),Be.react.createElement("defs",null,Be.react.createElement("filter",{id:"shadow1"},Be.react.createElement("feDropShadow",{dx:"20",dy:"0",stdDeviation:"20","flood-color":"rgba(0,0,0,0.35)"})),Be.react.createElement("filter",{id:"shadow2"},Be.react.createElement("feDropShadow",{dx:"15",dy:"0",stdDeviation:"20","flood-color":"rgba(255,255,255,0.15)"})),Be.react.createElement("filter",{id:"shadow3"},Be.react.createElement("feDropShadow",{dx:"10",dy:"0",stdDeviation:"20","flood-color":"rgba(0,0,0,0.35)"}))),Be.react.createElement("g",null,Be.react.createElement("path",{style:{filter:"url(#shadow3)"},d:"M1195.44+135.442L1195.44+135.442L997.6+136.442C1024.2+149.742+1170.34+163.542+1193.64+179.742C1264.34+228.842+1319.74+291.242+1358.24+365.042C1398.14+441.642+1419.74+530.642+1422.54+629.642L1422.54+630.842L1422.54+632.042C1422.54+773.142+1422.54+1228.14+1422.54+1369.14L1422.54+1370.34L1422.54+1371.54C1419.84+1470.54+1398.24+1559.54+1358.24+1636.14C1319.74+1709.94+1264.44+1772.34+1193.64+1821.44C1171.04+1837.14+1025.7+1850.54+1000+1863.54L1193.54+1864.54C1539.74+1866.44+1864.54+1693.34+1864.54+1296.64L1864.54+716.942C1866.44+312.442+1541.64+135.442+1195.44+135.442Z",fill:"#171717",opacity:"1"}),Be.react.createElement("path",{style:{filter:"url(#shadow2)"},d:"M1695.54+631.442C1685.84+278.042+1409.34+135.442+1052.94+135.442L361.74+136.442L803.74+490.442L1060.74+490.442C1335.24+490.442+1335.24+835.342+1060.74+835.342L1060.74+1164.84C1150.22+1164.84+1210.53+1201.48+1241.68+1250.87C1306.07+1353+1245.76+1509.64+1060.74+1509.64L361.74+1863.54L1052.94+1864.54C1409.24+1864.54+1685.74+1721.94+1695.54+1368.54C1695.54+1205.94+1651.04+1084.44+1572.64+999.942C1651.04+915.542+1695.54+794.042+1695.54+631.442Z",fill:"#3E82E5",opacity:"1"}),Be.react.createElement("path",{style:{filter:"url(#shadow1)"},d:"M1469.25+631.442C1459.55+278.042+1183.05+135.442+826.65+135.442L135.45+135.442L135.45+1004C135.45+1004+135.427+1255.21+355.626+1255.21C575.825+1255.21+575.848+1004+575.848+1004L577.45+490.442L834.45+490.442C1108.95+490.442+1108.95+835.342+834.45+835.342L664.65+835.342L664.65+1164.84L834.45+1164.84C923.932+1164.84+984.244+1201.48+1015.39+1250.87C1079.78+1353+1019.47+1509.64+834.45+1509.64L135.45+1509.64L135.45+1864.54L826.65+1864.54C1182.95+1864.54+1459.45+1721.94+1469.25+1368.54C1469.25+1205.94+1424.75+1084.44+1346.35+999.942C1424.75+915.542+1469.25+794.042+1469.25+631.442Z",fill:"#FFFFFF",opacity:"1"})))}}function as(){return(as=Object.assign||function(e){for(var t=1;t/g};let ds=BDModules.get(e=>e.CustomEmoji)[0],hs=BDModules.get(e=>e.default&&e.default.getCustomEmojiById)[0],us=BDModules.get(e=>e.default&&"Autocomplete"===e.default.displayName)[0],ps=BDModules.get(e=>e.getAutocompleteOptions)[0],ms=BDModules.get(e=>e.default&&e.default.queryEmojiResults)[0],gs=BDModules.get(e=>e.default&&e.default.Messages&&e.default.Messages.EMOJI_MATCHING)[0],fs=BDModules.get(e=>e.default&&e.default.getGuild&&e.default.getGuilds&&!e.default.isFetching)[0],bs=BDModules.get(e=>e.default&&e.default.getDisambiguatedEmojiContext);var ys=new class{constructor(){this.init().catch(e=>Ne.err("EmojiModule","An error occured",e))}async init(){if(us||(us=await window.Lightcord.Api.ensureExported(e=>e.default&&"Autocomplete"===e.default.displayName)),ps||(ps=await window.Lightcord.Api.ensureExported(e=>e.getAutocompleteOptions)),ms||(ms=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.queryEmojiResults)),gs||(gs=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.Messages&&e.default.Messages.EMOJI_MATCHING)),fs||(fs=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.getGuild&&e.default.getGuilds&&!e.default.isFetching)),bs||(bs=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.getDisambiguatedEmojiContext)),us&&ps&&ms&&gs&&fs&&bs){console.log("Patching getAutocompleteOptions of AutoCompletionTemplates",ps);const e=ps.getAutocompleteOptions;ps.getAutocompleteOptions=function(t,n,s,r,o){const i=e.call(this,...arguments);return i.LIGHTCORD_EMOJIS={matches(e,t){let n=t.length>1&&"."===e;return Ns(n),n},queryResults:e=>ms.default.queryEmojiResults(e,t),renderResults:(e,t,n,s,r)=>vs(e,t,r.emojis,n,s,gs.default.Messages.EMOJI_MATCHING,gs.default.Messages.EMOJI,us.default.Emoji,(function(e){return{emoji:e,key:e.id||e.uniqueName||e.name,sentinel:".",guild:null!=e.guildId?fs.default.getGuild(e.guildId):null}}),(function(e){return"."+e+"."})),getPlainText(e,t){var n=t.emojis;if(null==n||null==n[e])return"";var s=n[e],r=s.animated?"a":"";return s.managed||null==s.id?"."+s.name+".":"<"+r+"."+(s.originalName||s.name)+"."+s.id+">"},getRawText(e,t){var n=t.emojis;if(null==n||null==n[e])return"";var s=n[e],r=s.animated?"a":"";return s.managed||null==s.id?"."+s.name+".":"<"+r+"."+(s.originalName||s.name)+"."+s.id+">"}},i}}else console.error(new Error("Couldn't start autocompletion of Lightcord's emojis."));for(;!Be.MessageComponent;)await new Promise(e=>setTimeout(e,100));this.cancelEmojiRender||(this.cancelEmoteRender=Ne.monkeyPatch(Be.MessageComponent,"default",{before:e=>{if(!Ne.getNestedProp(e.methodArguments[0],"childrenMessageContent.props.message"))return;const t=Ne.getNestedProp(e.methodArguments[0],"childrenMessageContent.props.content");if(!t||!t.length)return;let n=[];const s=[];for(let e of t){if("string"!=typeof e){s.push(e);continue}let r,o=!1;do{if(r=cs.EmojiRegex.exec(e),r){o=!0,hs||(hs=BDModules.get(e=>e.default&&e.default.getCustomEmojiById)[0]);const e=hs.default.getCustomEmojiById(r[2]);e?n.push({animated:e.animated,name:e.name,id:e.id,raw:r[0]}):n.push({animated:r[0].startsWith("{if(!e)return"";const o=n.find(t=>t.raw==e);return o?(ds||(ds=BDModules.get(e=>e.CustomEmoji)[0]),React.createElement(ds.CustomEmoji,{emoji:{name:`.${o.name}.`,emojiId:o.id,animated:o.animated,jumboable:1===r.length&&1===t.length}})):e}).reduce((e,t)=>0===e.length?[t]:"string"==typeof t?"string"==typeof e[e.length-1]?(e[e.length-1]+=" "+t,e):(e.push(" "+t),e):(e.push(" ",t),e),[]);s.push(...r)}else s.push(e)}for(;e.methodArguments[0].childrenMessageContent.props.content[0];)e.methodArguments[0].childrenMessageContent.props.content.shift();for(;s[0];)e.methodArguments[0].childrenMessageContent.props.content.push(s.shift())}}))}disable(){this.cancelEmoteRender&&(this.cancelEmoteRender(),this.cancelEmoteRender=null)}start(){}};function vs(e,t,n,s,r,o,i,a,l,c){if(null==n||0===n.length)return null;var d=n.map((function(e,n){return React.createElement(a,Object.assign({onClick:r,onHover:s,selected:t===n,index:n},l(e,n)))}));return[ws(o,i,e,c),d]}function ws(e,t,n,s){var r=n.length>0?e.format({prefix:s(n)}):t;return Array.isArray(r)?r.unshift(React.createElement("strong",{},"[Lightcord] ")):r="[LIGHTCORD] "+r,React.createElement(us.default.Title,{title:r},r)}ws.displayName="renderHeader";let Cs,Es,Ss,xs,ks=BDModules.get(e=>e.default&&e.default.isEmojiDisabled)[0],Ds=ks&&ks.default.isEmojiDisabled,Ms=!1,Bs=!1;function Ns(e){Ms=e,Bs||(ks||(ks=BDModules.get(e=>e.default&&e.default.isEmojiDisabled)[0]),ks&&(Ds||(Ds=ks.default.isEmojiDisabled),Bs=!0,ks.default.isEmojiDisabled=function(e){return Ms?!(!e.surrogates&&!e.diversity):Ds.call(this,...arguments)}))}function Ls(){}Ls.prototype.setConfig=function(e){this.hasStarted||Object.assign(y,e)},Object.defineProperty(Ls.prototype,"methods",{get:()=>Cs}),Ls.prototype.setMethods=function(e){this.hasStarted||(Cs=e)},Ls.prototype.init=async function(){if(this.hasStarted)return;if(this.hasStarted=!0,!Array.prototype.flat)return void Ne.alert("Not Supported","BetterDiscord v"+a+" does not support this old version ("+o+") of Discord. Please update your Discord installation before proceeding.");if(y.version
Please download the latest version from GitHub");if(window.ED)return void Ne.alert("Not Supported","BandagedBD does not work with EnhancedDiscord. Please uninstall one of them.");if(window.WebSocket&&window.WebSocket.name&&window.WebSocket.name.includes("Patched"))return void Ne.alert("Not Supported","BandagedBD does not work with Powercord. Please uninstall one of them.");Ne.suppressErrors(this.patchAttributes.bind(this),"LC Plugin Certifier Patch")(),Ne.log("Startup","Initializing Settings"),this.initSettings(),await this.checkForGuilds(),Be.initialize(),Ne.log("Startup","Updating Settings"),rs.initializeSettings(),Ne.log("Startup","Loading Addons Cache"),await xe.loadAddonCertifierCache(),Ne.log("Startup","Loading Plugins"),await j.loadPlugins(),Ne.log("Startup","Loading Themes"),await Me.loadThemes(),ke.addStyle("customcss",Buffer.from(P.getBDData("bdcustomcss"),"base64").toString("utf8")),window.addEventListener("beforeunload",(function(){h["bda-dc-0"]&&document.querySelector(".btn.btn-disconnect").click()})),ee.start(),Ne.log("Startup","Removing Loading Icon"),document.getElementsByClassName("bd-loaderv2").length&&document.getElementsByClassName("bd-loaderv2")[0].remove(),Ne.log("Startup","Initializing Main Observer"),this.initObserver(),h["fork-ps-1"]&&(Ne.log("Startup","Collecting Startup Errors"),Ne.showContentErrors({plugins:f,themes:b}));const e=P.getBDData("version");if(a>e&&(l&&this.showChangelogModal(l),P.setBDData("version",a)),ys.start(),Ne.suppressErrors(this.patchSocial.bind(this),"BD Social Patch")(),Ne.suppressErrors(this.patchGuildPills.bind(this),"BD Guild Pills Patch")(),Ne.suppressErrors(this.patchGuildListItems.bind(this),"BD Guild List Items Patch")(),Ne.suppressErrors(this.patchGuildSeparator.bind(this),"BD Guild Separator Patch")(),Ne.suppressErrors(this.patchMessageHeader.bind(this),"BD Badge Chat Patch")(),Ne.suppressErrors(this.patchMemberList.bind(this),"BD Badge Member List Patch")(),Ne.suppressErrors(this.patchAttachment.bind(this),"LC Plugin Certifier Patch")(),y.haveInstalledDefault){let e=Ne.alert("First Installation","As it is the first time you install Lightcord, We added two default themes and one default plugin in your plugin/theme folder. Check it in the Plugin/Theme settings.");await new Promise(t=>{e.onClose(t)})}const t=document.querySelector("#app-mount > div.typeWindows-1za-n7.withFrame-haYltI.titleBar-AC4pGV.horizontalReverse-3tRjY7.flex-1O1GKY.directionRowReverse-m8IjIq.justifyStart-2NDFzi.alignStretch-DpGPf3.da-typeWindows.da-withFrame.da-titleBar.da-horizontalReverse.da-flex.da-directionRowReverse.da-justifyStart.da-alignStretch > div.wordmarkWindows-1v0lYD.wordmark-2iDDfm.da-wordmarkWindows.da-wordmark");t&&(t.style.top="3px",t.innerHTML='\n \n \n \n')},Ls.prototype.patchAttributes=async function(){let e=[];for(this.cancelPatchAttributes=function(){e.forEach(e=>e())};!Be.MessageComponent;)await new Promise(e=>setTimeout(e,100));const t=D.find(e=>"Anchor"==e.displayName);window.Lightcord.Api.ensureExported(e=>e.default&&"DiscordTag"===e.default.displayName).then(e=>{let n=e.default;e.default=function(e){let s=n(e),r=He(),o=Be.React.createElement("div",{style:{display:"inline",marginTop:"5px"}},Be.React.createElement("span",{id:"badges-"+r,key:"badges-"+r,style:{display:"inherit"}})),i=[s];"249746236008169473"===e.user.id?i.push(Be.React.createElement(Z,{color:"black",side:"top",text:"BandagedBD Developer"},Be.React.createElement(t,{className:"bd-chat-badge",href:"https://github.com/rauenzi/BetterDiscordApp",title:"BandagedBD",target:"_blank"},Be.React.createElement(is,{size:"16px",className:"bd-logo"})))):"696481194443014174"!==e.user.id&&"696003456611385396"!==e.user.id||i.push(Be.React.createElement(Z,{color:"black",side:"top",text:"Lightcord Developer"},Be.React.createElement(t,{className:"bd-chat-badge",href:"https://github.com/Lightcord/Lightcord",title:"Lightcord",target:"_blank"},Be.React.createElement(ls,{size:"16px",className:"bd-logo"})))),i.push(o);let a=Be.React.createElement("div",{style:{display:"block"}},i);return As(r,e.user,!1),a},e.default.displayName=n.displayName}),e.push(Ne.monkeyPatch(Be.MessageComponent,"default",{after:e=>{e.methodArguments[0].childrenMessageContent.props.message&&(e.returnValue.props["data-message-id"]=e.methodArguments[0].childrenMessageContent.props.message.id)}}))},Ls.prototype.checkForGuilds=function(){let e=0;return new Promise(t=>{const n=function(){const s=Be.guildClasses.wrapper.split(" ")[0];document.querySelectorAll("."+s).length>0&&e++;const r=Be.guildClasses.listItem.split(" ")[0],o=Be.guildClasses.blobContainer.split(" ")[0];return document.querySelectorAll(`.${s} .${r} .${o}`).length>0||e>=50?t(y.deferLoaded=!0):void setTimeout(n,100)};"loading"!=document.readyState&&setTimeout(n,100),document.addEventListener("DOMContentLoaded",()=>{setTimeout(n,100)})})},Ls.prototype.injectExternals=async function(){},Ls.prototype.initSettings=function(){if(P.initialize(),!P.getSettingGroup("lightcord-settings"))for(let e in m)delete m[e];if(P.getSettingGroup("rpc")||Object.assign(u,p),P.getSettingGroup("settings")){rs.loadSettings();for(const e in d)null==h[e]&&(h[e]=d[e],rs.saveSettings())}else Object.assign(h,d),rs.saveSettings();window.Lightcord.Api.ensureExported(e=>e.default&&e.default.prototype&&e.default.prototype.getPredicateSections).then(e=>{let t=e.default.prototype.getPredicateSections;e.default.prototype.getPredicateSections=function(){let e=t.call(this,...arguments);if(!e[1])return e;if("My Account"===e[1].section){let t=[];for(t.push(e.pop()),t.push(e.pop()),t.push(e.pop()),t.push(e.pop()),e.push(...rs.renderSidebar(this));t[0];)e.push(t.pop())}return console.log(e),e}})},Ls.prototype.initObserver=function(){new MutationObserver(e=>{for(let t=0,n=e.length;te.layer&&"string"==typeof e.layer&&e.animating)[0].layer),Ss||(Ss=BDModules.get(e=>e.socialLinks&&"string"==typeof e.socialLinks)[0].socialLinks),xs||(xs=BDModules.get(e=>e.modal&&"string"==typeof e.modal&&e.inner&&"string"==typeof e.inner&&!e.responsiveWidthMobile)[0].modal),s.classList.contains(Es)&&("GUILD_SETTINGS"===s.getAttribute("aria-label")&&(s.setAttribute("layer-id","server-settings"),s.setAttribute("id","server-settings")),s.getElementsByClassName(Ss).length&&(s.setAttribute("layer-id","user-settings"),s.setAttribute("id","user-settings"))),s.parentElement==document.body&&s.querySelector("#ace_settingsmenu")&&(s.id="ace_settingsmenu_container")}}).observe(document,{childList:!0,subtree:!0})},Ls.prototype.showChangelogModal=function(e={}){return Ne.showChangelogModal(e)},Ls.prototype.alert=function(e,t){return Ne.alert(e,t)},Ls.prototype.patchSocial=function(){if(this.socialPatch)return;const e=D.find(e=>"TabBar"==e.displayName),t=D.find(e=>"Anchor"==e.displayName);e&&(this.socialPatch=Ne.monkeyPatch(e.prototype,"render",{after:e=>{const n=e.returnValue.props.children;if(!n||!n.length||n.length<3)return;if("Separator"!==n[n.length-3].type.displayName)return;if(!n[n.length-2].type.toString().includes("socialLinks"))return;if(t){let e=BDModules.get(e=>e.socialLinks)[0];const s=n[n.length-2].type,r=function(){const n=s(...arguments);return n.props.children.push(Be.React.createElement(Z,{color:"black",side:"top",text:"Lightcord"},Be.React.createElement(t,{className:"bd-social-link "+e.link,href:"https://github.com/Lightcord/Lightcord",title:"Lightcord",target:"_blank"},Be.React.createElement(ls,{size:"16px",className:"bd-social-logo"})))),n.props.children.push(Be.React.createElement(Z,{color:"black",side:"top",text:"BandagedBD"},Be.React.createElement(t,{className:"bd-social-link "+e.link,href:"https://github.com/rauenzi/BetterDiscordApp",title:"BandagedBD",target:"_blank"},Be.React.createElement(is,{size:"16px",className:"bd-social-logo"})))),n};n[n.length-2].type=r}let[s,r,o]=[BDModules.get(e=>e.colorMuted)[0].colorMuted,BDModules.get(e=>e.size32)[0],BDModules.get(e=>e.versionHash)[0].versionHash];const i=`(${y.hash?y.hash.substring(0,7):y.branch})`,l=[Be.react.createElement("div",{className:`${s} ${r.size12}`},`Lightcord ${$.remote.getGlobal("BuildInfo").version} `,Be.react.createElement("span",{className:o+" da-versionHash"},`(${($.remote.getGlobal("BuildInfo").commit||"Unknown").slice(0,7)})`)),Be.react.createElement("div",{className:`${s} ${r.size12}`},`BBD ${a} `,Be.react.createElement("span",{className:o+" da-versionHash"},i))],c=n[n.length-1].type;n[n.length-1].type=function(){const e=c(...arguments);return e.props.children.splice(1,0,l),e}}}))};function As(e,t,n){process.nextTick(()=>{const s=document.getElementById("badges-"+e);if(!s||s.childNodes.length>0)return;if(s.childNodes.length)return;let r=document.createElement("div");r.style.display="none",s.appendChild(r);const o=D.find(e=>"Anchor"==e.displayName);Ve.getBadges(t.id).then(e=>{e.forEach(e=>{const r={svg:{size:"16px",className:"bd-logo",width:"16px"}};e.scopes.forEach(e=>{"user"===e&&(r.user=t)}),e.href||(r.Anchor=o,r.href={className:n?"bd-chat-badge":"bd-member-badge",title:e.name,target:"_blank"});const i=Be.React.createElement(Z,{color:"black",side:"top",text:e.name},e.href?Be.react.createElement(o,{href:e.href,className:n?"bd-chat-badge":"bd-member-badge",title:e.name,target:"_blank"},Be.React.createElement(e.component,r)):Be.React.createElement(e.component,r)),a=document.createElement("div");Be.reactDom.render(i,a),a.childNodes.forEach(e=>{s.appendChild(e)})})})})}Ls.prototype.patchGuildListItems=function(){if(this.guildListItemsPatch)return;const e=function(){const e=D.findByProps("wrapper","unreadMentionsBar"),t=D.findByProps("guildsError","selected"),n=D.findByProps("blobContainer");return Object.assign({},e,t,n)}(),t=e.listItem.split(" ")[0],n=e.blobContainer.split(" ")[0],s=Be.getInternalInstance(document.querySelector(`.${t} .${n}`).parentElement).return.type;s&&(this.guildListItemsPatch=Ne.monkeyPatch(s.prototype,"render",{after:e=>{if(e.returnValue&&e.thisObject){const t=e.returnValue,n=e.thisObject.props;let s=t.props.className;return s+=" bd-guild",n.unread&&(s+=" bd-unread"),n.selected&&(s+=" bd-selected"),n.audio&&(s+=" bd-audio"),n.video&&(s+=" bd-video"),n.badge&&(s+=" bd-badge"),n.animatable&&(s+=" bd-animatable"),t.props.className=s,t}}}))},Ls.prototype.patchGuildPills=function(){if(this.guildPillPatch)return;const e=D.find(e=>e.default&&!e.default.displayName&&e.default.toString&&e.default.toString().includes("translate3d"));e&&(this.guildPillPatch=Ne.monkeyPatch(e,"default",{after:e=>{const t=e.methodArguments[0];return t.unread&&(e.returnValue.props.className+=" bd-unread"),t.selected&&(e.returnValue.props.className+=" bd-selected"),t.hovered&&(e.returnValue.props.className+=" bd-hovered"),e.returnValue}}))},Ls.prototype.patchGuildSeparator=function(){if(this.guildSeparatorPatch)return;const e=D.findByDisplayName("Guilds"),t=D.findByProps("renderListItem");if(!t||!e)return;const n=function(){const e=t.Separator(...arguments);return e.props.className+=" bd-guild-separator",e};this.guildSeparatorPatch=Ne.monkeyPatch(e.prototype,"render",{after:e=>{e.returnValue.props.children[1].props.children[3].type=n}})},Ls.prototype.patchAttachment=function(){if(this.AttachmentPatch)return;const e=BDModules.get(e=>e.default&&"Attachment"===e.default.displayName)[0];D.find(e=>"Anchor"==e.displayName)&&e&&e.default&&(this.AttachmentPatch=Ne.monkeyPatch(e,"default",{after:e=>{if(!h["fork-ps-6"])return;const t=e.methodArguments[0]||null,n=Ne.getNestedProp(e.returnValue,"props.children");if(!n||!t||!t.url)return;if(!Array.isArray(n))return;const s=He();n.push(Be.react.createElement("span",{id:"certified-"+s})),ee.patch(t,"certified-"+s)}}))},Ls.prototype.patchMessageHeader=function(){if(this.messageHeaderPatch)return;const e=D.findByProps("MessageTimestamp"),t=D.find(e=>"Anchor"==e.displayName);t&&e&&e.default&&(this.messageHeaderPatch=Ne.monkeyPatch(e,"default",{after:e=>{const n=Ne.getNestedProp(e.methodArguments[0],"message.author"),s=Ne.getNestedProp(e.returnValue,"props.children.1.props.children.1.props.children");if(!s||!n||!n.id)return;if(!Array.isArray(s))return;"249746236008169473"===n.id?s.push(Be.React.createElement(Z,{color:"black",side:"top",text:"BandagedBD Developer"},Be.React.createElement(t,{className:"bd-chat-badge",href:"https://github.com/rauenzi/BetterDiscordApp",title:"BandagedBD",target:"_blank"},Be.React.createElement(is,{size:"16px",className:"bd-logo"})))):"696481194443014174"!==n.id&&"696003456611385396"!==n.id||s.push(Be.React.createElement(Z,{color:"black",side:"top",text:"Lightcord Developer"},Be.React.createElement(t,{className:"bd-chat-badge",href:"https://github.com/Lightcord/Lightcord",title:"Lightcord",target:"_blank"},Be.React.createElement(ls,{size:"16px",className:"bd-logo"}))));const r=He();s.push(Be.React.createElement("div",{id:"badges-"+r,style:{display:"inline"}})),As(r,n,!0)}}))},Ls.prototype.patchMemberList=function(){if(this.memberListPatch)return;const e=D.findByDisplayName("MemberListItem"),t=D.find(e=>"Anchor"==e.displayName);t&&e&&e.prototype&&e.prototype.renderDecorators&&(this.memberListPatch=Ne.monkeyPatch(e.prototype,"renderDecorators",{after:e=>{const n=Ne.getNestedProp(e.thisObject,"props.user"),s=Ne.getNestedProp(e.returnValue,"props.children");if(!s||!n||!n.id)return;if(!Array.isArray(s))return;"249746236008169473"===n.id?s.push(Be.React.createElement(Z,{color:"black",side:"top",text:"BandagedBD Developer"},Be.React.createElement(t,{className:"bd-member-badge",href:"https://github.com/rauenzi/BetterDiscordApp",title:"BandagedBD",target:"_blank"},Be.React.createElement(is,{size:"16px",className:"bd-logo"})))):"696481194443014174"!==n.id&&"696003456611385396"!==n.id||s.push(Be.React.createElement(Z,{color:"black",side:"top",text:"Lightcord Developer"},Be.React.createElement(t,{className:"bd-member-badge",href:"https://github.com/Lightcord/Lightcord",title:"Lightcord",target:"_blank"},Be.React.createElement(ls,{size:"16px",className:"bd-logo"}))));const r=He();s.push(Be.React.createElement("div",{id:"badges-"+r})),As(r,n,!1)}}))},Ls.prototype.updateInjector=async function(){if(!P.injectionPath)return!1};var Ps=new Ls;const Ts={get React(){return Be.React},get ReactDOM(){return Be.ReactDom},get ReactComponent(){return Be.ReactComponent},get WindowConfigFile(){return Ne.WindowConfigFile},get settings(){return c},get emotes(){return null},get screenWidth(){return Math.max(document.documentElement.clientWidth,window.innerWidth||0)},get screenHeight(){return Math.max(document.documentElement.clientHeight,window.innerHeight||0)},getAllWindowPreferences:function(){return Ne.getAllWindowPreferences()},getWindowPreference:function(e){return Ne.getWindowPreference(e)},setWindowPreference:function(e,t){return Ne.setWindowPreference(e,t)},injectCSS:function(e,t){ke.addStyle(ke.escapeID(e),t)},clearCSS:function(e){ke.removeStyle(ke.escapeID(e))},linkJS:function(e,t){ke.addScript(ke.escapeID(e),t)},unlinkJS:function(e){ke.removeScript(ke.escapeID(e))},getPlugin:function(e){return w.hasOwnProperty(e)?w[e].plugin:null},getCore:function(){return Ne.warn("Deprecation Notice","BdApi.getCore() will be removed in future versions."),Ps},alert:function(e,t){return Ne.showConfirmationModal(e,t,{cancelText:null})},showConfirmationModal:function(e,t,n={}){return Ne.showConfirmationModal(e,t,n)},showToast:function(e,t={}){Ne.showToast(e,t)},findModule:function(e){return Be.WebpackModules.find(e)},findAllModules:function(e){return Be.WebpackModules.findAll(e)},findModuleByProps:function(...e){return Be.WebpackModules.findByUniqueProperties(e)},findModuleByPrototypes:function(...e){return Be.WebpackModules.findByPrototypes(e)},findModuleByDisplayName:function(e){return Be.WebpackModules.findByDisplayName(e)},getInternalInstance:function(e){if(e instanceof window.jQuery||e instanceof Element)return e instanceof jQuery&&(e=e[0]),Be.getInternalInstance(e)},loadData:function(e,t){return P.getPluginData(e,t)}};Ts.getData=Ts.loadData,Ts.saveData=function(e,t,n){return P.setPluginData(e,t,n)},Ts.setData=Ts.saveData,Ts.deleteData=function(e,t){return P.deletePluginData(e,t)},Ts.monkeyPatch=function(e,t,n){return Ne.monkeyPatch(e,t,n)},Ts.onRemoved=function(e,t){return Ne.onRemoved(e,t)},Ts.suppressErrors=function(e,t){return Ne.suppressErrors(e,t)},Ts.testJSON=function(e){return Ne.testJSON(e)},Ts.isPluginEnabled=function(e){return!!C[e]},Ts.isThemeEnabled=function(e){return!!E[e]},Ts.isSettingEnabled=function(e){return!!h[e]},Ts.enableSetting=function(e){return rs.onChange(e,!0)},Ts.disableSetting=function(e){return rs.onChange(e,!1)},Ts.toggleSetting=function(e){return rs.onChange(e,!h[e])},Ts.getBDData=function(e){return P.getBDData(e)},Ts.setBDData=function(e,t){return P.setBDData(e,t)};const Rs=(e,t,n)=>new class{get folder(){return n.folder}isEnabled(t){return!!e[t]}enable(e){return n.enable(e)}disable(e){return n.disable(e)}toggle(t){e[t]?this.disable(t):this.enable(t)}reload(e){return n.reload(e)}get(e){return t.hasOwnProperty(e)?t[e].plugin?t[e].plugin:t[e]:null}getAll(){return Object.keys(t).map(e=>this.get(e)).filter(e=>e)}};Ts.Plugins=Rs(C,w,j),Ts.Themes=Rs(E,v,Me);var Os=Ts;window.Lightcord.BetterDiscord.BdApi=Ts,function(){const e=Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype,"contentWindow").get;Object.defineProperty(HTMLIFrameElement.prototype,"contentWindow",{get:function(){const t=Reflect.apply(e,this,arguments);return new Proxy(t,{getOwnPropertyDescriptor:function(e,t){if("localStorage"!==t)return Object.getOwnPropertyDescriptor(e,t)},get:function(e,t){if("localStorage"===t)return null;const n=e[t];return"function"==typeof n?n.bind(e):n}})}}),Object.defineProperty(Reflect,"apply",{value:Reflect.apply,writable:!1,configurable:!1}),Object.defineProperty(Function.prototype,"bind",{value:Function.prototype.bind,writable:!1,configurable:!1});const t=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(){const e=arguments[1];return e.toLowerCase().includes("api/webhooks")?null:Reflect.apply(t,this,arguments)}}(),(()=>{const e=document.createElement("div");e.className="bd-loaderv2",e.title="BandagedBD is loading...",document.body.appendChild(e)})();const js=(e,t)=>{Object.defineProperty(window,e,{get:()=>(Ne.warn("Deprecated Global",`"${e}" will be removed in future versions. Please only use BdApi.`),t)})},_s=Object.keys(s);for(const e of _s)js(e,s[e]);js("BDV2",Be),js("pluginModule",j),js("themeModule",Me),js("Utils",Ne),js("BDEvents",R),js("settingsPanel",rs),js("DataStore",P),js("ContentManager",xe),js("ClassNormalizer",ot),window.BdApi=Os,js("mainCore",Ps);class Is{constructor(e,t){Ps.setConfig(e),Ps.setMethods(t)}init(){Ps.init()}}}]); +//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/BetterDiscordApp/dist/index.min.js.map b/BetterDiscordApp/dist/index.min.js.map index da1ad75..9bb5bc2 100644 --- a/BetterDiscordApp/dist/index.min.js.map +++ b/BetterDiscordApp/dist/index.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://BetterDiscord/webpack/bootstrap","webpack://BetterDiscord/external \"electron\"","webpack://BetterDiscord/external \"path\"","webpack://BetterDiscord/external \"fs\"","webpack://BetterDiscord/external \"crypto\"","webpack://BetterDiscord/external \"node-fetch\"","webpack://BetterDiscord/external \"events\"","webpack://BetterDiscord/external \"module\"","webpack://BetterDiscord/./src/0globals.js","webpack://BetterDiscord/./src/modules/webpackModules.js","webpack://BetterDiscord/./src/modules/dataStore.js","webpack://BetterDiscord/./src/modules/bdEvents.js","webpack://BetterDiscord/./src/modules/pluginModule.js","webpack://BetterDiscord/./src/ui/tooltip.js","webpack://BetterDiscord/./src/ui/tooltipWrap.js","webpack://BetterDiscord/./src/modules/pluginCertifier.js","webpack://BetterDiscord/./src/modules/contentManager.js","webpack://BetterDiscord/./src/modules/domtools.js","webpack://BetterDiscord/./src/modules/themeModule.js","webpack://BetterDiscord/./src/modules/v2.js","webpack://BetterDiscord/./src/modules/utils.js","webpack://BetterDiscord/./src/modules/settingsPanelSidebar.js","webpack://BetterDiscord/./src/modules/coloredText.js","webpack://BetterDiscord/./src/modules/24hour.js","webpack://BetterDiscord/./src/ui/settingsTitle.js","webpack://BetterDiscord/./src/ui/tabBarSeparator.js","webpack://BetterDiscord/./src/ui/publicservers/serverCard.js","webpack://BetterDiscord/./src/modules/hooks.js","webpack://BetterDiscord/./src/ui/publicservers/publicServers.js","webpack://BetterDiscord/./src/svg/bug_hunter.jsx","webpack://BetterDiscord/./src/svg/circus.jsx","webpack://BetterDiscord/./src/modules/distant.js","webpack://BetterDiscord/./src/modules/Layers.jsx","webpack://BetterDiscord/./src/modules/publicServers.js","webpack://BetterDiscord/./src/modules/voiceMode.js","webpack://BetterDiscord/./src/modules/classNormalizer.js","webpack://BetterDiscord/./src/modules/devMode.js","webpack://BetterDiscord/./src/ui/components/switch.jsx","webpack://BetterDiscord/./src/ui/switch.js","webpack://BetterDiscord/./src/ui/margintop.jsx","webpack://BetterDiscord/./src/ui/settingsGroup.jsx","webpack://BetterDiscord/./src/ui/sectionedSettingsPanel.js","webpack://BetterDiscord/./src/ui/checkbox.js","webpack://BetterDiscord/./src/ui/cssEditorDetached.js","webpack://BetterDiscord/./src/ui/cssEditor.js","webpack://BetterDiscord/./src/ui/errorBoundary.js","webpack://BetterDiscord/./src/ui/contentColumn.js","webpack://BetterDiscord/./src/ui/reloadIcon.js","webpack://BetterDiscord/./src/ui/xSvg.js","webpack://BetterDiscord/./src/ui/icons/edit.jsx","webpack://BetterDiscord/./src/ui/icons/delete.jsx","webpack://BetterDiscord/./src/ui/addoncard.jsx","webpack://BetterDiscord/./src/ui/icons/downarrow.jsx","webpack://BetterDiscord/./src/ui/components/dropdown.jsx","webpack://BetterDiscord/./src/ui/icons/search.jsx","webpack://BetterDiscord/./src/ui/components/search.jsx","webpack://BetterDiscord/./src/ui/addonlist.jsx","webpack://BetterDiscord/./src/modules/CustomRichPresence.js","webpack://BetterDiscord/./src/ui/presenceSettings.jsx","webpack://BetterDiscord/./src/ui/AccountInfos.jsx","webpack://BetterDiscord/./src/modules/AntiAdDM.js","webpack://BetterDiscord/./src/modules/blurPrivate.js","webpack://BetterDiscord/./src/modules/disableTyping.js","webpack://BetterDiscord/./src/ui/ApiPreview.jsx","webpack://BetterDiscord/./src/ui/icons/history.jsx","webpack://BetterDiscord/./src/modules/popoutWindow.js","webpack://BetterDiscord/./src/modules/settingsPanel.js","webpack://BetterDiscord/./src/ui/bdLogo.js","webpack://BetterDiscord/./src/svg/Lightcord.jsx","webpack://BetterDiscord/./src/modules/emojiModule.js","webpack://BetterDiscord/./src/modules/core.js","webpack://BetterDiscord/./src/modules/bdApi.js","webpack://BetterDiscord/./src/localStorageFix.js","webpack://BetterDiscord/./src/index.js","webpack://BetterDiscord/./src/loadingIcon.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","require","minimumDiscordVersion","currentDiscordVersion","window","DiscordNative","remoteApp","getVersion","minSupportedVersion","bbdVersion","bbdChangelog","description","changes","title","type","items","settings","id","info","implemented","hidden","cat","category","experimental","process","platform","defaultCookie","settingsCookie","settingsRPC","defaultRPC","Date","now","lightcordSettings","defaultLightcordSettings","bdpluginErrors","bdthemeErrors","bdConfig","BetterDiscordConfig","bdthemes","bdplugins","pluginCookie","themeCookie","req","webpackJsonp","push","__extra_id__","find","filter","default","mod","findAll","findByProps","propNames","every","prop","undefined","findByPrototypes","protoNames","protoProp","findByDisplayName","displayName","Lightcord","BetterDiscord","WebpackModules","__non_webpack_require__","fs","path","releaseChannel","globals","app","getReleaseChannel","dataPath","env","APPDATA","join","HOME","XDG_CONFIG_HOME","constructor","this","data","stable","canary","ptb","pluginData","DataStore","initialize","existsSync","BDFile","writeFileSync","JSON","stringify","parse","readFileSync","settingsFile","unlinkSync","assign","setBDData","err","console","error","Utils","alert","_injectionPath","_configFile","resolve","injectionPath","_BDFile","_settingsFile","getPluginFile","pluginName","ContentManager","pluginsFolder","getSettingGroup","setSettingGroup","getBDData","getPluginData","setPluginData","deletePluginData","EventEmitter","super","BDEvents","dispatch","eventName","args","emit","off","eventAction","removeListener","PluginModule","loadPlugins","async","loadPluginData","splice","plugins","keys","length","plugin","getName","load","file","filename","message","stack","start","showToast","Promise","setTimeout","savePluginData","remote","getCurrentWebContents","on","channelSwitch","startPlugin","reload","stopPlugin","stop","enablePlugin","enable","disablePlugin","disable","togglePlugin","toggle","loadPlugin","loadContent","showContentErrors","values","log","unloadPlugin","filenameOrName","bdplugin","unloadContent","delete","fullPath","reloadPlugin","enabled","reloadContent","edit","shell","openItem","updatePluginList","results","loadNewContent","added","removed","saved","newMessage","onMessage","onSwitch","rawObserver","e","observer","TooltipClasses","TooltipLayers","getTooltipClasses","getTooltipLayers","getClass","sideOrColor","upperCase","toUpperCase","slice","tooltipClass","classExists","toPx","EmulatedTooltip","node","text","options","style","side","preventFlip","disabled","attachEvents","jQuery","label","toLowerCase","element","document","createElement","className","layer","disabledPointerEvents","tooltipElement","tooltip","labelElement","tooltipContent","pointerElement","tooltipPointer","append","addEventListener","show","MutationObserver","mutations","forEach","mutation","nodes","Array","from","removedNodes","directMatch","indexOf","parentMatch","some","parent","contains","hide","disconnect","observe","body","subtree","childList","querySelector","removeDa","BDModules","popouts","layerContainer","getBoundingClientRect","top","offsetHeight","screenHeight","left","offsetWidth","screenWidth","remove","_className","textContent","container","canShowAbove","showAbove","showBelow","canShowBelow","canShowLeft","showLeft","showRight","canShowRight","classList","add","setProperty","centerHorizontally","centerVertically","nodecenter","React","Component","props","BDV2","reactDom","findDOMNode","Tooltip","componentWillUnmount","render","children","cache","cache2","PluginCertifier","patch","attachment","nextTick","getElementById","url","startsWith","endsWith","nodeFetch","headers","electron","userAgent","then","res","status","Error","hash","crypto","Buffer","alloc","chunk","concat","update","hashResult","digest","hashToUrl","checkHash","result","div","childNodes","flowerStarModule","flowerStarContainer","childModule","childContainer","suspect","parentNode","borderColor","nextNode","child","tagName","preventDefault","stopImmediatePropagation","showConfirmationModal","harm","confirmText","cancelText","danger","onCancel","onConfirm","openExternal","href","includes","react","tooltipWrap","width","height","svg","viewBox","x","y","mask","fill","pointerEvents","official","span","display","float","flowerStar","stroke","color","onClick","link","getKeyedArray","content","buffer","installPath","contentManager","_pluginsFolder","_themesFolder","catch","cursor","fill-rule","class","renderToElements","elem","processAttachment","isTrusted","tests","threats","checkViruses","resultCallback","removeCallback","isHarmful","no_comments","toString","replace","trim","test","scrpt","exec","split","pop","json","processFile","__path","isFromLoader","createReadStream","addonCache","timestamp","saveAddonCache","basename","obj","arr","k","save","generateKey","encryptSettingsCache","cipher","encrypted","final","Api","ensureExported","ObjectStorage","localStorageModule","localStorage","impl","set","btoa","setInterval","val","safeJSONParse","atob","isArray","Module","globalPaths","getAppPath","MetaError","originalJSRequire","_extensions","originalCSSRequire","splitRegex","escapedAtRegex","hasPatched","timeCache","watchers","patchExtensions","getContentRequire","realpathSync","loadAddonCertifierCache","dataStore","decipher","decrypted","decryptSettingsCache","watchContent","contentType","isPlugin","baseFolder","themesFolder","fileEnding","watch","persistent","eventType","statSync","code","pluginModule","themeModule","unloadTheme","isFile","stats","mtime","getTime","loadTheme","reloadTheme","unwatchContent","close","extractMeta","firstLine","parseOldMeta","parseNewMeta","meta","rawMeta","substring","lastIndexOf","parsed","testJSON","format","block","out","field","accum","line","charAt","substr","self","originalRequire","possiblePath","Reflect","apply","arguments","stripBOM","atimeMs","modified","mtimeMs","size","css","_compile","isEmpty","warn","makePlaceholderPlugin","getAuthor","getDescription","source","website","escapeID","isLoaded","cantUnload","basedir","files","readdirSync","contentList","map","f","errors","loadAllContent","loadThemes","DOMTools","head","script","src","onload","timing","_","duration","performance","requestAnimationFrame","animate","time","timeFraction","progress","selector","parseHTML","NodeList","nodeType","query","baseElement","querySelectorAll","html","fragment","template","innerHTML","cloneNode","textNode","createTextNode","spanElement","nodeValue","classes","flat","classname","indicator","oldName","newName","thisNode","thatNode","prepend","targetNode","insertBefore","nextSibling","newNode","nextElementSibling","next","matches","previous","previousElementSibling","num","indexInParent","parentElement","parents","closest","attribute","global","getComputedStyle","parseInt","clientWidth","clientHeight","_listeners","event","delegate","callback","namespace","hasDelegate","eventFunc","target","cancel","removeEventListener","listeners","newCancel","findIndex","matchFilter","listener","defaultFilter","list","__offAll","onMount","wrappedCallback","unsubscribe","subscribe","addedNodes","onMountChange","onUnmount","elements","domWrapper","appendChild","Element","DOM","ThemeModule","loadThemeData","themes","theme","addStyle","unescape","saveThemeData","enableTheme","bdEvents","version","disableTheme","removeStyle","toggleTheme","bdtheme","updateThemeList","editorDetached","protect","theModule","isDefault","clear","sort","getToken","getEmail","showToken","proxy","Proxy","getOwnPropertyDescriptor","func","__proto__","findByUniqueProperties","internal","getInternalInstance","V2","joinBD1","InviteActions","acceptInviteAndTransitionToInviteChannel","leaveBD1","GuildActions","leaveGuild","joinBD2","leaveBD2","joinLC","leaveLC","anchor","anchorUnderlineOnHover","guildsWrapper","wrapper","unreadMentionsBar","guilds","guildsError","selected","pill","blobContainer","defaultProps","search","submit","activateRagingDemon","dismiss","openDM","userId","selfId","UserStore","getCurrentUser","privateChannelId","ChannelStore","getDMFromUserId","PrivateChannelActions","selectPrivateChannel","ChannelActions","openPrivateChannel","parseSettings","reduce","setting","Math","max","documentElement","innerWidth","innerHeight","_windowConfigFile","transparent","frame","charCodeAt","channelTextArea","titleWrapper","textarea","focus","selectionStart","selectionEnd","execCommand","moduleName","groupCollapsed","groupEnd","string","replacement","RegExp","method","params","what","methodName","before","after","instead","once","silent","force","origMethod","canceled","thisObject","methodArguments","cancelPatch","originalMethod","callOriginalMethod","returnValue","tempRet","suppressErrors","__monkeyPatched","__originalMethod","sidebar","hasNotice","form","bottom","toastWrapper","icon","timeout","toastElem","innerText","modalModule","modal","inner","hideOnFullscreen","headerModule","header","responsiveWidthMobile","footer2Module","focusLock","backdrop","backdropWithLayer","footer","addClass","closingListeners","onClose","pluginErrors","themeErrors","generateTab","el","tabs","removeClass","scroller","index","click","ModalStack","ChangelogClasses","TextElement","FlexChild","Titles","Changelog","selectable","MarkdownParser","image","subtitle","ce","changelogItems","entry","margin","marginTop","renderHeader","Child","grow","shrink","tag","Tags","H4","Sizes","SMALL","Colors","STANDARD","date","renderFooter","Anchor","AnchorClasses","joinSupportServer","stopPropagation","supportLink","defaultFooter","onScroll","ModalActions","Markdown","ConfirmationModal","emptyFunction","openModal","red","modalKey","V2_SettingsPanel_Sidebar","panels","register","panel","component","getComponent","Settings","devMode","section","LCitems","LCDevItems","injectColoredText","cancelColoredText","MessageComponent","monkeyPatch","childrenMessageContent","messageContent","originalType","roleColor","colorString","removeColoredText","classNameMarkup","markup","inject24Hour","cancel24Hour","twelveHour","convert","matched","match","padStart","cancelCozy","TimeFormatter","cancelCompact","remove24Hour","V2C_SettingsTitle","reactComponent","V2C_TabBarSeparator","V2C_ServerCard","server","iconUrl","fallback","state","imageError","joined","guildList","identifier","cardModule","card","cardPrimary","flexModule","flexChild","_horizontalReverse","wrapModule","noWrap","streamerModeEnabled","marginBottom8","pinned","ref","onError","handleError","draggable","horizontal","members","flex","categories","minHeight","backgroundColor","setState","useState","SettingsView","V2C_PublicServers","setInitialState","changeCategory","searchKeyDown","checkConnection","connect","GuildStore","AvatarDefaults","SortedGuildStore","hooks","componentDidMount","selectedCategory","loading","servers","connection","user","categorySlugs","fetch","searchEndPoint","end","term","categoryButtons","total","serverCard","acceptInvite","invite_code","joinEndPoint","credentials","windowOptions","round","screenX","screenY","win","joinWindow","webContents","loadURL","setMenuBarVisibility","resizable","maximizable","minimizable","alwaysOnTop","center","webPreferences","nodeIntegration","getFlattenedGuildIds","defaultList","DEFAULT_AVATARS","ServerCard","online","nativejoin","floor","random","response","onSetSection","sections","searchInput","getThis","setValue","marginLeft","serchinput","refs","searchinput","onKeyDown","onChange","placeholder","maxLength","which","notConnected","columnModule","contentColumnDefault","contentColumn","SettingsTitle","bdServer","marginBottom","lineHeight","forceUpdate","useEffect","TabBarSeparator","fontSize","username","discriminator","padding","BugHunterBadge","Circus","xmlns","cx","cy","uuidv4","awaitingBadgesPromises","badgesToFetch","_cache","badges","DistantServer","newPromise","badge","Constants","defaultUsers","fetchedBadges","users","handleRequest","Routes","responseBody","promise","user_id","LightcordError","route","SERVER_URL","Authorization","reject","scopes","layers","Layers","inject","isInjected","classNameLayers","v2","ReactInstance","FindReact","createLayer","getLayer","lay","LayerModules","Layer","animation","Value","keydown","ev","componentWillEnter","toValue","componentWillLeave","interpolation","interpolate","inputRange","outputRange","opacity","transform","scale","Div","__SECRET_EMOTION__","position","right","overflow","WebkitBoxOrient","WebkitBoxDirection","msFlexDirection","flexDirection","zIndex","paddingTop","_appendButton","V2_PublicServers","rootId","btn","guildClasses","listItem","circleButtonMask","classNametutorialContainer","downloadProgress","tutorialContainer","button","addButton","guildPatch","GuildList","webpackModules","GuildListOld","removeButton","randClass","ClassNormalizer","unpatchClassModules","moduleFilter","revertElement","patchClassModules","normalizeElement","patchDOMMethods","patchClassModule","unpatchClassModule","shouldIgnore","isNaN","baseClassName","componentName","classNames","normalClass","camelCase","newString","clen","newClass","toRemove","DOMTokenList","token","tokens","debugListener","copySelectorListener","startDebugListener","startCopySelector","stopDebugListener","stopCopySelector","getSelector","classLayer","classItems","menu","cm","cmWrap","styleFlexible","accommodateScrollbar","clientY","clientX","setAttribute","scrollerClasses","scrollerWrap","scrollerThemed","themeGhostHairline","removeCM","keyCode","cmg","cmi","item","labelContainer","colorDefault","NativeModule","copy","queryAll","focused","separator","scrollHeight","names","unshift","ownerDocument","entries","Switch","checked","switch","Components","inputs","classnames","getClassName","SwitchItem","beta","userSettingsVoice","formModule","switchItem","betaClassNames","marginModule","marginTop60","MarginTop","V2C_SettingsGroup","renderOldSettings","buttonComponent","componentDidCatch","errInfo","FormSection","FormText","hideBorder","DEFAULT","Themes","note","setImmediate","V2C_SectionedSettingsPanel","SettingsGroup","V2C_Checkbox","checkboxElement","checkbox","checkboxInner","V2C_CssEditorDetached","updateCss","saveCss","editor","ace","setTheme","session","setMode","setShowPrintMargin","setFontSize","destroy","updateLineCount","lineCount","lines","lineNumbers","indentUnit","scrollbarStyle","_ccss","ccss","_root","injectRoot","detachedRoot","insertAfter","Checkbox","borderRadius","borderRight","borderLeft","saveSettings","attach","unmountComponentAtNode","root","getValue","V2C_CssEditor","detachedEditor","detach","detached","componentDidUpdate","prevProps","prevState","codeMirror","arg","droot","injectDetachedRoot","BDErrorBoundary","hasError","originalRender","configurable","V2C_ContentColumn","V2C_ReloadIcon","V2C_XSvg","fillRule","Edit","Delete","anchorClasses","V2C_PluginCard","showSettings","hasSettings","addon","getSettingsPanel","settingsPanel","reloads","trusted","closeSettings","panelRef","current","settingsOpen","settingspanel","cardNode","cTop","scrollTop","cBottom","eTop","offsetTop","eBottom","isHidden","thisNodeOffset","offset","containerOffset","original","endPoint","getString","XSvg","dangerouslySetInnerHTML","__html","buildTitle","author","nameIndex","versionIndex","authorIndex","LayerStack","popLayer","makeLink","makeButton","action","unmounted","links","invite","tester","donate","patreon","settingsComponent","authorId","authorLink","isScanning","DownArrow","Select","open","dropdown","createRef","showMenu","hideMenu","opt","isOpen","Search","onFocus","onBlur","CardList","ascending","isPlugins","cookie","manager","reverse","onAddonChanges","openFolder","openPath","confirmDelete","BdApi","toLocaleLowerCase","getProps","getAddons","sortedAddons","a","b","cap","first","second","localeCompare","rendered","renderCheckUpdates","ZeresPluginLibrary","PluginUpdates","checkAll","tooltipIsShowing","onMouseLeave","Button","look","hoverColor","onRightClick","checkUpdateButton","refreshIcon","addonCards","sortOptions","directions","dispatcher","Dispatcher","ActionTypes","pid","game","application_id","details","timestamps","assets","large_image","small_image","sendGame","LOCAL_ACTIVITY_UPDATE","socketId","activity","formatedGame","applicationId","getAssets","V2C_PresenceSettingsModules","V2C_PresenceSettings","preview","isfetching","fetchAssets","assetComponents","Set","updateWhenFetched","comp","defaultSetting","RPCProps","CustomRichPresence","asset","updatePreview","marginBottom20","optionsComponents","RpcPreview","ohgodohfuck","_optionsComponents","InputText","InputNumber","InputChoice","choices","inputTextModules","InputNumberModules","InputChoiceModules","PureComponent","removeKeybind","defaultMarginh5","colorStandard","size32","_horizontal","inputMini","size16","size20","input","TextInput","lastEdited","isTiming","rowModule","marginModule2","colorModule","sizeModule","inputModule","sizeModule2","row","size14","h5","Divider","colorTransparent","clipboard","Dropdown","emptyClasses","popoutModules","UserPopoutComponent","PopoutProps","profileModules","UserProfileComponent","ProfileProps","connectedProfileStore","DividerModules","divider","dividerDefault","active","changeTab","tab","setActive","Tab","rpc","isActive","Profile","Popout","PresenceErrorCatcher","emptyStateImage","emptyState","emptyStateHeader","emptyStateSubtext","role","tabindex","UserPopout","userModule","render1","guildId","channelId","disableUserProfileLink","_UserPopout","popout","excludeProperties","UserProfile","render2","render3","render4","profile","scrollbarModule1","scrollbarGhostHairline","GuildModule","getGuilds","relationShipModule","getRelationships","sessionModule","getSessions","V2C_AccountInfos","CodeContent","getProfileValue","language","getStatistics","getSessionValue","sessionsRaw","sessions","sessionId","clientInfo","os","client","activities","repeat","createdAt","avatarURL","avatar","getAvatarURL","getDate","getMonth","getFullYear","getHours","getMinutes","getSeconds","flags","hasPremiumSubscription","email","mfaEnabled","mobile","phone","verified","nsfwAllowed","relations","friends","isFriend","blocked","isBlocked","hightlightJS","highlight","messageModule1","messageModule2","listLanguages","DiscordModules","ChannelModule","getChannel","hasChannel","addRelationship","DMModule","closePrivateChannel","antiDM","bot","guild_id","channel","channel_id","EmbedsContains","location","embeds","embed","fields","selectors","standardSidebarView","defaultClassName","selects","userSettingsAccount","paymentSourceRow","subText","descriptionWrapper","viewBody","userSettingsSecurity","getSelectors","startTyping","typingModule","stopTyping","DisableTyping","ApiPreview","states","allComponents","general","AlertBox","compName","compPath","ComponentPreview","AllPreviews","getStrForProp","lang","String","$$typeof","for","generateCode","openTag","propStrings","childrenProp","str","propObject","isLast","childrenData","help","success","SettingSubTitle","searchable","Tabs","ErrorCatcher","CodeBlock","History","windows","Map","init","popoutModule","getWindow","applyThemes","removeThemes","themeName","existing","removeAttribute","BDSidebarHeader","sidebarComponents","Separator","Header","Item","changelogButton","showChangelogModal","isClearingCache","updateSettings","registerComponents","makeComponent","lightcordComponent","PresenceComponent","AccountInfosComponent","ApiPreviewComponent","coreComponent","customCssComponent","renderAddonPane","getSettings","publicServersModule","voiceMode","tfHour","coloredText","setWindowPreference","dMode","callRingingBeat","settingsStore","showCurrentGame","updateRemoteSettings","getCurrentWindow","setAlwaysOnTop","AntiAdDM","blurPrivate","disableTyping","appSettings","getGlobal","relaunch","exit","popoutWindow","core","methods","NotificationsUseShim","loadSettings","renderSidebar","SectionedSettingsPanel","coreSettings","isChecked","ipc","send","argv","quit","clearCache","PresenceSettings","CssEditor","ContentList","prefix","SettingComponent","BDLogo","clipRule","strokeLinecap","strokeLinejoin","LightcordLogo","x1","y1","x2","y2","gradientTransform","gradientUnits","stopColor","EmojiRegex","CustomEmojiModule","CustomEmoji","EmojiModuleApi","getCustomEmojiById","AutocompleteModule","AutoCompletionTemplates","getAutocompleteOptions","EmojiModuleQuery","queryEmojiResults","Messages","EMOJI_MATCHING","guildModule","getGuild","isFetching","emojiSearch","getDisambiguatedEmojiContext","LIGHTCORD_EMOJIS","arg1","arg2","condition","setEmojiUsable","queryResults","renderResults","D","emojis","EMOJI","Emoji","emoji","uniqueName","sentinel","guild","getPlainText","isAnimated","animated","managed","originalName","getRawText","cancelEmojiRender","cancelEmoteRender","getNestedProp","newContent","hasParsed","raw","words","word","emojiId","jumboable","shift","u","onHover","R","Title","classNameLayer","classNameSocialLinks","classNameModal","EmojiFilterModule","isEmojiDisabled","isUsable","usable","surrogates","diversity","Core","setConfig","config","hasStarted","setMethods","ED","WebSocket","patchAttributes","initSettings","checkForGuilds","initializeSettings","getElementsByClassName","initObserver","previousVersion","EmojiModule","patchSocial","patchGuildPills","patchGuildListItems","patchGuildSeparator","patchMessageHeader","patchMemberList","patchAttachment","haveInstalledDefault","logo","attribsPatchs","cancelPatchAttributes","DiscordTag","DiscordTagComp","badgeDiv","TooltipWrap","applyBadges","timesChecked","blob","deferLoaded","readyState","injectExternals","getPredicateSections","settingModule","poped","mlen","animating","socialLinks","getAttribute","socialPatch","TabBar","socialModule1","newOne","returnVal","classNameColorMuted","sizes","classNameVersionHash","colorMuted","versionHash","branch","additional","size12","commit","originalVersions","chat","blockDiv","distant","getBadges","scope","div2","guildListItemsPatch","GuildClasses","getGuildClasses","listItemClass","blobClass","GuildComponent","return","guildData","unread","audio","video","animatable","guildPillPatch","guildPill","hovered","guildSeparatorPatch","Guilds","guildComponents","GuildSeparator","AttachmentPatch","Attachment","messageHeaderPatch","MessageHeader","memberListPatch","MemberListItem","renderDecorators","updateInjector","ReactDom","ReactComponent","WindowConfigFile","getAllWindowPreferences","getWindowPreference","addScript","removeScript","mainCore","protos","getData","loadData","saveData","setData","deleteData","onRemoved","isPluginEnabled","isThemeEnabled","isSettingEnabled","enableSetting","disableSetting","toggleSetting","makeAddonAPI","folder","isEnabled","getAll","Plugins","contentWindowGetter","HTMLIFrameElement","contentWindow","writable","Function","oOpen","XMLHttpRequest","localStorageFix","v2Loader","loadingIcon","deprecateGlobal","globalKeys","Globals","CoreWrapper"],"mappings":"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","file":"index.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 7);\n","module.exports = require(\"electron\");","module.exports = require(\"path\");","module.exports = require(\"fs\");","module.exports = require(\"crypto\");","module.exports = require(\"node-fetch\");","module.exports = require(\"events\");","module.exports = require(\"module\");","export const minimumDiscordVersion = \"0.0.307\";\r\nexport const currentDiscordVersion = (window.DiscordNative && window.DiscordNative.remoteApp && window.DiscordNative.remoteApp.getVersion && window.DiscordNative.remoteApp.getVersion()) || \"0.0.307\";\r\nexport const minSupportedVersion = \"0.3.0\";\r\nexport const bbdVersion = \"0.3.5\";\r\nexport const bbdChangelog = {\r\n description: \"Big things are coming.\",\r\n changes: [\r\n {\r\n title: \"Bug Fixes\",\r\n type: \"fixed\",\r\n items: [\r\n \"Some fixes related to showing modals in the `BdApi`.\",\r\n \"Fixed the open folder buttons for plugins and themes\"\r\n ]\r\n }\r\n ]\r\n};\r\n\r\nexport const settings = {\r\n \"Custom css live update\": {id: \"bda-css-0\", info: \"\", implemented: true, hidden: true, cat: \"core\"},\r\n \"Custom css auto udpate\": {id: \"bda-css-1\", info: \"\", implemented: true, hidden: true, cat: \"core\"},\r\n \"BetterDiscord Blue\": {id: \"bda-gs-b\", info: \"Replace Discord blue with BD Blue\", implemented: false, hidden: false, cat: \"core\"},\r\n\r\n /* Core */\r\n /* ====== */\r\n \"Public Servers\": {id: \"bda-gs-1\", info: \"Display public servers button\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\r\n \"Minimal Mode\": {id: \"bda-gs-2\", info: \"Hide elements and reduce the size of elements.\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\r\n \"Voice Mode\": {id: \"bda-gs-4\", info: \"Only show voice chat\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\r\n \"Hide Channels\": {id: \"bda-gs-3\", info: \"Hide channels in minimal mode\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\r\n \"Dark Mode\": {id: \"bda-gs-5\", info: \"Make certain elements dark by default(wip)\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\r\n \"Voice Disconnect\": {id: \"bda-dc-0\", info: \"Disconnect from voice server when closing Discord\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\r\n \"24 Hour Timestamps\": {id: \"bda-gs-6\", info: \"Replace 12hr timestamps with proper ones\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\r\n \"Colored Text\": {id: \"bda-gs-7\", info: \"Make text color the same as role color\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\r\n \"Normalize Classes\": {id: \"fork-ps-4\", info: \"Adds stable classes to elements to help themes. (e.g. adds .da-channels to .channels-Ie2l6A)\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\r\n\r\n /* Content */\r\n \"Content Error Modal\": {id: \"fork-ps-1\", info: \"Shows a modal with plugin/theme errors\", implemented: true, hidden: false, cat: \"core\", category: \"content manager\"},\r\n \"Scan Plugins\": {id: \"fork-ps-6\", info: \"Scan plugins for any threat that can be hidden inside.\", implemented: true, hidden: false, cat: \"core\", category: \"content manager\"},\r\n \"Show Toasts\": {id: \"fork-ps-2\", info: \"Shows a small notification for important information\", implemented: true, hidden: false, cat: \"core\", category: \"content manager\"},\r\n \"Scroll To Settings\": {id: \"fork-ps-3\", info: \"Auto-scrolls to a plugin's settings when the button is clicked (only if out of view)\", implemented: true, hidden: false, cat: \"core\", category: \"content manager\"},\r\n \"Automatic Loading\": {id: \"fork-ps-5\", info: \"Automatically loads, reloads, and unloads plugins and themes\", implemented: true, hidden: false, cat: \"core\", category: \"content manager\"},\r\n \"Enable Edit Button\": {id: \"fork-ps-7\", info: \"Enable an Edit Button on the plugin and theme panel.\", implemented: true, hidden: false, cat: \"core\", category: \"content manager\"},\r\n \"Themes in Popout Window\": {id: \"lightcord-9\", info: \"Enable themes in Popout Window. (For example, when detaching screenshare.)\", implemented: true, hidden: false, cat: \"core\", category: \"content manager\", experimental: true},\r\n\r\n /* Developer */\r\n \"Developer Mode\": \t {id: \"bda-gs-8\", info: \"Developer Mode Toggle\", implemented: true, hidden: false, cat: \"core\", category: \"developer settings\"},\r\n \"Copy Selector\":\t\t\t {id: \"fork-dm-1\", info: \"Adds a \\\"Copy Selector\\\" option to context menus when developer mode is active\", implemented: true, hidden: false, cat: \"core\", category: \"developer settings\"},\r\n\r\n /** Lightcord */\r\n \"Disable BetterDiscord\": {id: \"bd-disable\", info: \"Disable Betterdiscord (plugins, themes, etc) (Not implemented).\", implemented: false, hidden: false, cat: \"lightcord\", category: \"Lightcord\"},\r\n \"Blur Personal Information\": {id: \"lightcord-6\", info: \"Blur sensitive informations like email, payment infos and more.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\"},\r\n \"Calling Ring Beat\": {id: \"lightcord-2\", info: \"Enable Discord's special calling beat.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\"},\r\n \"Developer Options\": {id: \"lightcord-1\", info: \"Enable Discord's & Lightcord's Internal Developer Options. This allow the \\\"Experiments\\\" tab, the \\\"Developer Options\\\" tab and the \\\"Lightcord Api\\\" section.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\"},\r\n \"Ad Block\": {id: \"lightcord-4\", info: \"Block any BOT that dms you with an invite link. Even in an embed.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\"},\r\n \"Enable Lightcord Servers\": {id: \"lightcord-5\", info: \"Enable Lightcord's servers. Disabling this will disable custom badges.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\"},\r\n \"Disable typing\": {id: \"lightcord-7\", info: \"Don't let other see you're typing.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\"},\r\n \"Lightcord Tabs\": {id: \"lightcord-8\", info: \"Allows you to launch multiple instances of Lightcord in the same window.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\", experimental: true},\r\n \"Use Notification Shim\": {id: \"lightcord-10\", info: \"Basically don't use Windows's Notifications.\", implemented: true, hidden: process.platform !== \"win32\", cat: \"lightcord\", category: \"Lightcord\", experimental: false},\r\n\r\n /** Lightcord Window */\r\n \"Always-on-Top\": {id: \"lightcord-3\", info: \"Enable the window's Always-on-Top mode, where Lightcord stays on top of other applications.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Window\"},\r\n \"No Window Bounds\": {id: \"no_window_bound\", info: \"Disable Window Bounds. Can be useful if you use a window manager.\", implemented: true, hidden: process.platform !== \"linux\", cat: \"lightcord\", category: \"Window\"},\r\n \"Enable Glasstron\": {id: \"enable_glasstron\", info: \"Enable Glasstron. If you're not using transparent themes, this can reduce lag.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Window\"},\r\n \r\n /** RichPresence */\r\n \"Enable\": {id: \"lightcord-presence-1\", info: \"Enable RichPresence below.\", implemented: true, hidden: false, cat: \"status\"}\r\n};\r\n\r\nexport const defaultCookie = {\r\n \"bda-gs-1\": true,\r\n \"bda-gs-2\": false,\r\n \"bda-gs-3\": false,\r\n \"bda-gs-4\": false,\r\n \"bda-gs-5\": true,\r\n \"bda-gs-6\": false,\r\n \"bda-gs-7\": false,\r\n \"bda-gs-8\": false,\r\n \"bda-es-0\": true,\r\n \"bda-es-1\": true,\r\n \"bda-es-2\": true,\r\n \"bda-es-4\": false,\r\n \"bda-es-6\": true,\r\n \"bda-es-7\": true,\r\n \"bda-gs-b\": false,\r\n \"bda-es-8\": true,\r\n \"bda-dc-0\": false,\r\n \"bda-css-0\": false,\r\n \"bda-css-1\": false,\r\n \"bda-es-9\": true,\r\n \"fork-dm-1\": false,\r\n \"fork-ps-1\": true,\r\n \"fork-ps-2\": true,\r\n \"fork-ps-3\": true,\r\n \"fork-ps-4\": true,\r\n \"fork-ps-5\": true,\r\n \"fork-ps-6\": true,\r\n \"fork-ps-7\": false,\r\n \"fork-es-2\": false,\r\n \"fork-es-3\": true,\r\n \"fork-wp-1\": false,\r\n \"fork-wp-2\": false,\r\n \"fork-beta\": true,\r\n \"lightcord-1\": false,\r\n \"lightcord-2\": true,\r\n \"lightcord-presence-1\": false,\r\n \"lightcord-3\": false,\r\n \"lightcord-4\": false,\r\n \"lightcord-5\": true,\r\n \"lightcord-6\": true,\r\n \"lightcord-7\": false,\r\n \"lightcord-8\": false,\r\n \"lightcord-9\": false,\r\n \"lightcord-10\": false,\r\n \"no_window_bound\": false,\r\n};\r\n\r\n\r\nexport const settingsCookie = {};\r\n\r\nexport const settingsRPC = {};\r\nexport const defaultRPC = {\r\n \"name\": \"Lightcord\",\r\n \"application_id\": \"711416957718757418\",\r\n \"state\": \"Lightcord Client\",\r\n \"details\": \"Browsing Discord\",\r\n \"timestamps.start\": Date.now(),\r\n \"assets.small\": null,\r\n \"assets.large\": \"712323821037682791\"\r\n}\r\n\r\nexport const lightcordSettings = {};\r\nexport const defaultLightcordSettings = {};\r\n\r\nexport const bdpluginErrors = [];\r\nexport const bdthemeErrors = []; // define for backwards compatibility\r\n\r\nexport const bdConfig = Object.create(BetterDiscordConfig);\r\n\r\nexport const bdthemes = {};\r\nexport const bdplugins = {};\r\n\r\nexport const pluginCookie = {};\r\nexport const themeCookie = {};","const req = webpackJsonp.push([[], {__extra_id__: (module, exports, req) => module.exports = req}, [[\"__extra_id__\"]]]);\r\ndelete req.m.__extra_id__;\r\ndelete req.c.__extra_id__;\r\nconst find = (filter) => {\r\n for (const i in req.c) {\r\n if (req.c.hasOwnProperty(i)) {\r\n const m = req.c[i].exports;\r\n if (m && m.__esModule && m.default && filter(m.default)) return m.default;\r\n if (m && filter(m))\treturn m;\r\n }\r\n }\r\n // console.warn(\"Cannot find loaded module in cache\");\r\n return null;\r\n};\r\n\r\nconst findAll = (filter) => {\r\n const modules = [];\r\n for (const i in req.c) {\r\n if (req.c.hasOwnProperty(i)) {\r\n const m = req.c[i].exports;\r\n if (m && m.__esModule && m.default && filter(m.default)) modules.push(m.default);\r\n else if (m && filter(m)) modules.push(m);\r\n }\r\n }\r\n return modules;\r\n};\r\n\r\nconst findByProps = (...propNames) => find(module => propNames.every(prop => module[prop] !== undefined));\r\nconst findByPrototypes = (...protoNames) => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined));\r\nconst findByDisplayName = (displayName) => find(module => module.displayName === displayName);\r\n\r\nlet mod = {find, findAll, findByProps, findByPrototypes, findByDisplayName};\r\nexport default mod\r\n\r\nwindow.Lightcord.BetterDiscord.WebpackModules = mod","const __non_webpack_require__ = window.require\r\n\r\nimport Utils from \"./utils\";\r\nimport ContentManager from \"./contentManager\";\r\n\r\nconst fs = require(\"fs\");\r\nconst path = require(\"path\");\r\nconst releaseChannel = DiscordNative.globals ? DiscordNative.globals.releaseChannel : DiscordNative.app ? DiscordNative.app.getReleaseChannel() : \"stable\";\r\n\r\nlet dataPath = \"\";\r\nif (process.platform === \"win32\") dataPath = process.env.APPDATA;\r\nelse if (process.platform === \"darwin\") dataPath = path.join(process.env.HOME, \"Library\", \"Preferences\");\r\nelse dataPath = process.env.XDG_CONFIG_HOME ? process.env.XDG_CONFIG_HOME : path.join(process.env.HOME, \".config\");\r\ndataPath = path.join(dataPath, \"BetterDiscord\");\r\n\r\nexport default new class DataStore {\r\n constructor() {\r\n this.data = {settings: {stable: {}, canary: {}, ptb: {}}};\r\n this.pluginData = {};\r\n window.Lightcord.BetterDiscord.DataStore = this\r\n }\r\n\r\n initialize() {\r\n try {\r\n if (!fs.existsSync(this.BDFile)) fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), \"utf-8\");\r\n const data = JSON.parse(fs.readFileSync(this.BDFile, \"utf-8\"))\r\n if (data.hasOwnProperty(\"settings\")) this.data = data;\r\n if (!fs.existsSync(this.settingsFile)) return;\r\n let settings = __non_webpack_require__(this.settingsFile);\r\n fs.unlinkSync(this.settingsFile);\r\n if (settings.hasOwnProperty(\"settings\")) settings = Object.assign({stable: {}, canary: {}, ptb: {}}, {[releaseChannel]: settings});\r\n else settings = Object.assign({stable: {}, canary: {}, ptb: {}}, settings);\r\n this.setBDData(\"settings\", settings);\r\n }\r\n catch (err) {\r\n console.error(err);\r\n Utils.alert(\"Corrupt Storage\", \"The bd storage has somehow become corrupt. You may either try to salvage the file or delete it then reload.\");\r\n }\r\n }\r\n\r\n get injectionPath() {\r\n return this._injectionPath = null;\r\n if (this._injectionPath) return this._injectionPath;\r\n const electron = require(\"electron\").remote.app;\r\n const base = electron.getAppPath();\r\n const roamingBase = electron.getPath(\"userData\");\r\n const roamingLocation = path.resolve(roamingBase, electron.getVersion(), \"modules\", \"discord_desktop_core\", \"injector\");\r\n const location = path.resolve(base, \"..\", \"app\");\r\n const realLocation = fs.existsSync(location) ? location : fs.existsSync(roamingLocation) ? roamingLocation : null;\r\n if (!realLocation) return this._injectionPath = null;\r\n return this._injectionPath = realLocation;\r\n }\r\n\r\n get configFile() {return this._configFile || (this._configFile = path.resolve(this.injectionPath, \"betterdiscord\", \"config.json\"));}\r\n get BDFile() {return this._BDFile || (this._BDFile = path.resolve(dataPath, \"bdstorage.json\"));}\r\n get settingsFile() {return this._settingsFile || (this._settingsFile = path.resolve(dataPath, \"bdsettings.json\"));}\r\n getPluginFile(pluginName) {return path.resolve(ContentManager.pluginsFolder, pluginName + \".config.json\");}\r\n\r\n getSettingGroup(key) {\r\n return this.data.settings[releaseChannel][key] || null;\r\n }\r\n\r\n setSettingGroup(key, data) {\r\n this.data.settings[releaseChannel][key] = data;\r\n fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), \"utf-8\");\r\n }\r\n\r\n getBDData(key) {\r\n return this.data[key] || \"\";\r\n }\r\n\r\n setBDData(key, value) {\r\n this.data[key] = value;\r\n fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), \"utf-8\");\r\n }\r\n\r\n getPluginData(pluginName, key) {\r\n if (this.pluginData[pluginName] !== undefined) return this.pluginData[pluginName][key];\r\n if (!fs.existsSync(this.getPluginFile(pluginName))) return undefined;\r\n this.pluginData[pluginName] = JSON.parse(fs.readFileSync(this.getPluginFile(pluginName)));\r\n return this.pluginData[pluginName][key];\r\n }\r\n\r\n setPluginData(pluginName, key, value) {\r\n if (value === undefined) return;\r\n if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};\r\n this.pluginData[pluginName][key] = value;\r\n fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), \"utf-8\");\r\n }\r\n\r\n deletePluginData(pluginName, key) {\r\n if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};\r\n delete this.pluginData[pluginName][key];\r\n fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), \"utf-8\");\r\n }\r\n};","/* BDEvents */\r\nconst EventEmitter = require(\"events\");\r\nexport default new class BDEvents extends EventEmitter {\r\n constructor(){\r\n super()\r\n window.Lightcord.BetterDiscord.BDEvents = this\r\n }\r\n dispatch(eventName, ...args) {this.emit(eventName, ...args);}\r\n off(eventName, eventAction) {this.removeListener(eventName, eventAction);}\r\n};","import {bdpluginErrors, pluginCookie, settingsCookie, bdplugins} from \"../0globals\";\nimport ContentManager from \"./contentManager\";\nimport DataStore from \"./dataStore\";\nimport BDEvents from \"./bdEvents\";\nimport Utils from \"./utils\";\n\nclass PluginModule {\n constructor(){\n window.Lightcord.BetterDiscord.PluginModule = this\n }\n get folder() {return ContentManager.pluginsFolder;}\n}\n\nPluginModule.prototype.loadPlugins = async function () {\n this.loadPluginData();\n bdpluginErrors.splice(0, 0, ...(await ContentManager.loadPlugins()));\n const plugins = Object.keys(bdplugins);\n for (let i = 0; i < plugins.length; i++) {\n let plugin, name;\n\n try {\n plugin = bdplugins[plugins[i]].plugin;\n name = plugin.getName();\n if (plugin.load && typeof(plugin.load) == \"function\") plugin.load();\n } catch (err) {\n pluginCookie[name] = false;\n Utils.err(\"Plugins\", name + \" could not be loaded.\", err);\n bdpluginErrors.push({name: name, file: bdplugins[plugins[i]].filename, message: \"load() could not be fired.\", error: {message: err.message, stack: err.stack}});\n continue;\n }\n\n if (!pluginCookie[name]) pluginCookie[name] = false;\n\n if (pluginCookie[name]) {\n try {\n plugin.start();\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${plugin.getName()} v${plugin.getVersion()} has started.`);\n } catch (err) {\n pluginCookie[name] = false;\n Utils.err(\"Plugins\", name + \" could not be started.\", err);\n bdpluginErrors.push({name: name, file: bdplugins[plugins[i]].filename, message: \"start() could not be fired.\", error: {message: err.message, stack: err.stack}});\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 10))\n }\n this.savePluginData();\n\n require(\"electron\").remote.getCurrentWebContents().on(\"did-navigate-in-page\", this.channelSwitch.bind(this));\n // if (settingsCookie[\"fork-ps-5\"]) ContentManager.watchContent(\"plugin\");\n};\n\nPluginModule.prototype.startPlugin = function(plugin, reload = false) {\n try {\n bdplugins[plugin].plugin.start();\n if (settingsCookie[\"fork-ps-2\"] && !reload) Utils.showToast(`${bdplugins[plugin].plugin.getName()} v${bdplugins[plugin].plugin.getVersion()} has started.`);\n }\n catch (err) {\n if (settingsCookie[\"fork-ps-2\"] && !reload) Utils.showToast(`${bdplugins[plugin].plugin.getName()} v${bdplugins[plugin].plugin.getVersion()} could not be started.`, {type: \"error\"});\n pluginCookie[plugin] = false;\n this.savePluginData();\n Utils.err(\"Plugins\", plugin + \" could not be started.\", err);\n }\n};\n\nPluginModule.prototype.stopPlugin = function(plugin, reload = false) {\n try {\n bdplugins[plugin].plugin.stop();\n if (settingsCookie[\"fork-ps-2\"] && !reload) Utils.showToast(`${bdplugins[plugin].plugin.getName()} v${bdplugins[plugin].plugin.getVersion()} has stopped.`);\n }\n catch (err) {\n if (settingsCookie[\"fork-ps-2\"] && !reload) Utils.showToast(`${bdplugins[plugin].plugin.getName()} v${bdplugins[plugin].plugin.getVersion()} could not be stopped.`, {type: \"error\"});\n Utils.err(\"Plugins\", bdplugins[plugin].plugin.getName() + \" could not be stopped.\", err);\n }\n};\n\nPluginModule.prototype.enablePlugin = function (plugin, reload = false) {\n if (pluginCookie[plugin]) return;\n pluginCookie[plugin] = true;\n this.savePluginData();\n this.startPlugin(plugin, reload);\n};\n\nPluginModule.prototype.enable = function (plugin, reload = false) {\n return this.enablePlugin(plugin, reload);\n};\n\nPluginModule.prototype.disablePlugin = function (plugin, reload = false) {\n if (!pluginCookie[plugin]) return;\n pluginCookie[plugin] = false;\n this.savePluginData();\n this.stopPlugin(plugin, reload);\n};\n\nPluginModule.prototype.disable = function (plugin, reload = false) {\n return this.disablePlugin(plugin, reload);\n};\n\nPluginModule.prototype.togglePlugin = function (plugin) {\n if (pluginCookie[plugin]) this.disablePlugin(plugin);\n else this.enablePlugin(plugin);\n};\n\nPluginModule.prototype.toggle = function (plugin, reload = false) {\n return this.togglePlugin(plugin, reload);\n};\n\nPluginModule.prototype.loadPlugin = async function(filename) {\n const error = await ContentManager.loadContent(filename, \"plugin\");\n if (error) {\n if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({plugins: [error]});\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${filename} could not be loaded.`, {type: \"error\"});\n return Utils.err(\"ContentManager\", `${filename} could not be loaded.`, error);\n }\n const plugin = Object.values(bdplugins).find(p => (console.log(p.filename, filename)) || p.filename == filename).plugin;\n try { if (plugin.load && typeof(plugin.load) == \"function\") plugin.load();}\n catch (err) {if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({plugins: [err]});}\n Utils.log(\"ContentManager\", `${plugin.getName()} v${plugin.getVersion()} was loaded.`);\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${plugin.getName()} v${plugin.getVersion()} was loaded.`, {type: \"success\"});\n BDEvents.dispatch(\"plugin-loaded\", plugin.getName());\n};\n\nPluginModule.prototype.unloadPlugin = function(filenameOrName) {\n const bdplugin = Object.values(bdplugins).find(p => p.filename == filenameOrName) || bdplugins[filenameOrName];\n if (!bdplugin) return;\n const plugin = bdplugin.plugin.getName();\n if (pluginCookie[plugin]) this.disablePlugin(plugin, true);\n const error = ContentManager.unloadContent(bdplugins[plugin].filename, \"plugin\");\n delete bdplugins[plugin];\n if (error) {\n if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({plugins: [error]});\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${plugin} could not be unloaded. It may have not been loaded yet.`, {type: \"error\"});\n return Utils.err(\"ContentManager\", `${plugin} could not be unloaded. It may have not been loaded yet.`, error);\n }\n Utils.log(\"ContentManager\", `${plugin} was unloaded.`);\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${plugin} was unloaded.`, {type: \"success\"});\n BDEvents.dispatch(\"plugin-unloaded\", plugin);\n};\n\nPluginModule.prototype.delete = function(filenameOrName) {\n const bdplugin = Object.values(bdplugins).find(p => p.filename == filenameOrName) || bdplugins[filenameOrName];\n if (!bdplugin) return;\n this.unloadPlugin(bdplugin.filename);\n const fullPath = require(\"path\").resolve(ContentManager.pluginsFolder, bdplugin.filename);\n require(\"fs\").unlinkSync(fullPath);\n};\n\nPluginModule.prototype.reloadPlugin = async function(filenameOrName) {\n const bdplugin = Object.values(bdplugins).find(p => p.filename == filenameOrName) || bdplugins[filenameOrName];\n if (!bdplugin) return this.loadPlugin(filenameOrName);\n const plugin = bdplugin.plugin.getName();\n const enabled = pluginCookie[plugin];\n if (enabled) this.stopPlugin(plugin, true);\n const error = await ContentManager.reloadContent(bdplugins[plugin].filename, \"plugin\");\n if (error) {\n if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({plugins: [error]});\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${plugin} could not be reloaded.`, {type: \"error\"});\n return Utils.err(\"ContentManager\", `${plugin} could not be reloaded.`, error);\n }\n if (bdplugins[plugin].plugin.load && typeof(bdplugins[plugin].plugin.load) == \"function\") bdplugins[plugin].plugin.load();\n if (enabled) this.startPlugin(plugin, true);\n Utils.log(\"ContentManager\", `${plugin} v${bdplugins[plugin].plugin.getVersion()} was reloaded.`);\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${plugin} v${bdplugins[plugin].plugin.getVersion()} was reloaded.`, {type: \"success\"});\n BDEvents.dispatch(\"plugin-reloaded\", plugin);\n};\n\nPluginModule.prototype.reload = function(name) {\n return this.reloadPlugin(name);\n};\n\nPluginModule.prototype.edit = function(filenameOrName) {\n console.log(\"Edit \" + filenameOrName);\n const bdplugin = Object.values(bdplugins).find(p => p.filename == filenameOrName) || bdplugins[filenameOrName];\n if (!bdplugin) return;\n const fullPath = require(\"path\").resolve(ContentManager.pluginsFolder, bdplugin.filename);\n console.log(\"Edit \" + fullPath);\n require(\"electron\").shell.openItem(`${fullPath}`);\n};\n\nPluginModule.prototype.updatePluginList = function() {\n const results = ContentManager.loadNewContent(\"plugin\");\n for (const filename of results.added) this.loadPlugin(filename);\n for (const name of results.removed) this.unloadPlugin(name);\n};\n\nPluginModule.prototype.loadPluginData = function () {\n const saved = DataStore.getSettingGroup(\"plugins\");\n if (saved) {\n Object.assign(pluginCookie, saved);\n }\n};\n\nPluginModule.prototype.savePluginData = function () {\n DataStore.setSettingGroup(\"plugins\", pluginCookie);\n};\n\nPluginModule.prototype.newMessage = function () {\n const plugins = Object.keys(bdplugins);\n for (let i = 0; i < plugins.length; i++) {\n const plugin = bdplugins[plugins[i]].plugin;\n if (!pluginCookie[plugin.getName()]) continue;\n if (typeof plugin.onMessage === \"function\") {\n try { plugin.onMessage(); }\n catch (err) { Utils.err(\"Plugins\", \"Unable to fire onMessage for \" + plugin.getName() + \".\", err); }\n }\n }\n};\n\nPluginModule.prototype.channelSwitch = function () {\n const plugins = Object.keys(bdplugins);\n for (let i = 0; i < plugins.length; i++) {\n const plugin = bdplugins[plugins[i]].plugin;\n if (!pluginCookie[plugin.getName()]) continue;\n if (typeof plugin.onSwitch === \"function\") {\n try { plugin.onSwitch(); }\n catch (err) { Utils.err(\"Plugins\", \"Unable to fire onSwitch for \" + plugin.getName() + \".\", err); }\n }\n }\n};\n\nPluginModule.prototype.rawObserver = function(e) {\n const plugins = Object.keys(bdplugins);\n for (let i = 0; i < plugins.length; i++) {\n const plugin = bdplugins[plugins[i]].plugin;\n if (!pluginCookie[plugin.getName()]) continue;\n if (typeof plugin.observer === \"function\") {\n try { plugin.observer(e); }\n catch (err) { Utils.err(\"Plugins\", \"Unable to fire observer for \" + plugin.getName() + \".\", err); }\n }\n }\n};\n\nexport default new PluginModule();","/**\r\n * Tooltip that automatically show and hide themselves on mouseenter and mouseleave events.\r\n * Will also remove themselves if the node to watch is removed from DOM through\r\n * a MutationObserver.\r\n *\r\n * Note this is not using Discord's internals but normal DOM manipulation and emulates\r\n * Discord's own tooltips as closely as possible.\r\n *\r\n * @module EmulatedTooltip\r\n * @version 0.0.1\r\n */\r\n\r\nimport Utils from \"../modules/utils\";\r\nimport WebpackModules from \"../modules/webpackModules\";\r\nlet TooltipClasses\r\nfunction getTooltipClasses(){\r\n\tif(TooltipClasses)return TooltipClasses\r\n\treturn TooltipClasses = WebpackModules.findByProps(\"tooltip\", \"tooltipBlack\");\r\n}\r\nlet TooltipLayers\r\nfunction getTooltipLayers(){\r\n\tif(TooltipLayers)return TooltipLayers\r\n\treturn TooltipLayers = WebpackModules.findByProps(\"layer\", \"layerContainer\");\r\n}\r\n\r\nconst getClass = function(sideOrColor) {\r\n const upperCase = sideOrColor[0].toUpperCase() + sideOrColor.slice(1);\r\n const tooltipClass = getTooltipClasses()[`tooltip${upperCase}`];\r\n if (tooltipClass) return tooltipClass;\r\n return null;\r\n};\r\n\r\nconst classExists = function(sideOrColor) {\r\n return getClass(sideOrColor) ? true : false;\r\n};\r\n\r\nconst toPx = function(value) {\r\n return `${value}px`;\r\n};\r\n\r\nexport default class EmulatedTooltip {\r\n\t/**\r\n\t *\r\n\t * @constructor\r\n\t * @param {(HTMLElement|jQuery)} node - DOM node to monitor and show the tooltip on\r\n\t * @param {string} tip - string to show in the tooltip\r\n\t * @param {object} options - additional options for the tooltip\r\n\t * @param {string} [options.style=black] - correlates to the discord styling/colors (black, brand, green, grey, red, yellow)\r\n\t * @param {string} [options.side=top] - can be any of top, right, bottom, left\r\n\t * @param {boolean} [options.preventFlip=false] - prevents moving the tooltip to the opposite side if it is too big or goes offscreen\r\n * @param {boolean} [options.disabled=false] - whether the tooltip should be disabled from showing on hover\r\n * @param {boolean} [options.attachEvents=true] - whether the tooltip should listen to mouseenter and mouseleave events.\r\n\t */\r\n\tconstructor(node, text, options = {}) {\r\n\t\tconst {style = \"black\", side = \"top\", preventFlip = false, disabled = false, attachEvents = true} = options;\r\n\t\tthis.node = node instanceof jQuery ? node[0] : node;\r\n this.label = text;\r\n this.style = style.toLowerCase();\r\n\t\tthis.side = side.toLowerCase();\r\n this.preventFlip = preventFlip;\r\n this.disabled = disabled;\r\n\r\n if (!classExists(this.side)) return Utils.err(\"EmulatedTooltip\", `Side ${this.side} does not exist.`);\r\n\t\tif (!classExists(this.style)) return Utils.err(\"EmulatedTooltip\", `Style ${this.style} does not exist.`);\r\n\t\t\r\n\t\tthis.element = document.createElement(\"div\");\r\n\t\tthis.element.className = getTooltipLayers().layer + \" \" + getTooltipLayers().disabledPointerEvents;\r\n\r\n\t\tthis.tooltipElement = document.createElement(\"div\");\r\n\t\tthis.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`;\r\n\r\n\t\tthis.labelElement = document.createElement(\"div\");\r\n\t\tthis.labelElement.className = getTooltipClasses().tooltipContent\r\n\r\n\t\tconst pointerElement = document.createElement(\"div\");\r\n\t\tpointerElement.className = getTooltipClasses().tooltipPointer;\r\n\r\n\t\tthis.tooltipElement.append(pointerElement);\r\n\t\tthis.tooltipElement.append(this.labelElement);\r\n\t\tthis.element.append(this.tooltipElement);\r\n\r\n\t\tif(attachEvents){\r\n\t\t\tthis.node.addEventListener(\"mouseenter\", () => {\r\n\t\t\t\tif (this.disabled) return;\r\n\t\t\t\tthis.show();\r\n\t\r\n\t\t\t\tconst observer = new MutationObserver((mutations) => {\r\n\t\t\t\t\tmutations.forEach((mutation) => {\r\n\t\t\t\t\t\tconst nodes = Array.from(mutation.removedNodes);\r\n\t\t\t\t\t\tconst directMatch = nodes.indexOf(this.node) > -1;\r\n\t\t\t\t\t\tconst parentMatch = nodes.some(parent => parent.contains(this.node));\r\n\t\t\t\t\t\tif (directMatch || parentMatch) {\r\n\t\t\t\t\t\t\tthis.hide();\r\n\t\t\t\t\t\t\tobserver.disconnect();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\r\n\t\t\t\tobserver.observe(document.body, {subtree: true, childList: true});\r\n\t\t\t});\r\n\t\r\n\t\t\tthis.node.addEventListener(\"mouseleave\", () => {\r\n\t\t\t\tthis.hide();\r\n\t\t\t});\r\n\t\t}\r\n }\r\n\r\n /** Container where the tooltip will be appended. */\r\n get container() { \r\n\t\treturn document.querySelector(\".\"+Utils.removeDa(BDModules.get(e => e.popouts)[0].popouts)+\" ~ .\"+Utils.removeDa(BDModules.get(e => e.layerContainer)[0].layerContainer)); \r\n\t}\r\n /** Boolean representing if the tooltip will fit on screen above the element */\r\n get canShowAbove() { return this.node.getBoundingClientRect().top - this.element.offsetHeight >= 0; }\r\n /** Boolean representing if the tooltip will fit on screen below the element */\r\n get canShowBelow() { return this.node.getBoundingClientRect().top + this.node.offsetHeight + this.element.offsetHeight <= Utils.screenHeight; }\r\n /** Boolean representing if the tooltip will fit on screen to the left of the element */\r\n get canShowLeft() { return this.node.getBoundingClientRect().left - this.element.offsetWidth >= 0; }\r\n /** Boolean representing if the tooltip will fit on screen to the right of the element */\r\n\tget canShowRight() { return this.node.getBoundingClientRect().left + this.node.offsetWidth + this.element.offsetWidth <= Utils.screenWidth; }\r\n\r\n /** Hides the tooltip. Automatically called on mouseleave. */\r\n\thide() {\r\n this.element.remove();\r\n this.tooltipElement.className = this._className;\r\n\t}\r\n\r\n /** Shows the tooltip. Automatically called on mouseenter. Will attempt to flip if position was wrong. */\r\n\tshow() {\r\n this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`;\r\n\t\tthis.labelElement.textContent = this.label;\r\n\t\tthis.container.append(this.element);\r\n\r\n\t\tif (this.side == \"top\") {\r\n\t\t\tif (this.canShowAbove || (!this.canShowAbove && this.preventFlip)) this.showAbove();\r\n\t\t\telse this.showBelow();\r\n\t\t}\r\n\r\n\t\tif (this.side == \"bottom\") {\r\n\t\t\tif (this.canShowBelow || (!this.canShowBelow && this.preventFlip)) this.showBelow();\r\n\t\t\telse this.showAbove();\r\n\t\t}\r\n\r\n\t\tif (this.side == \"left\") {\r\n\t\t\tif (this.canShowLeft || (!this.canShowLeft && this.preventFlip)) this.showLeft();\r\n\t\t\telse this.showRight();\r\n\t\t}\r\n\r\n\t\tif (this.side == \"right\") {\r\n\t\t\tif (this.canShowRight || (!this.canShowRight && this.preventFlip)) this.showRight();\r\n\t\t\telse this.showLeft();\r\n\t\t}\r\n\t}\r\n\r\n /** Force showing the tooltip above the node. */\r\n\tshowAbove() {\r\n\t\tthis.tooltipElement.classList.add(getClass(\"top\"));\r\n\t\tthis.element.style.setProperty(\"top\", toPx(this.node.getBoundingClientRect().top - this.element.offsetHeight - 10));\r\n\t\tthis.centerHorizontally();\r\n\t}\r\n\r\n /** Force showing the tooltip below the node. */\r\n\tshowBelow() {\r\n\t\tthis.tooltipElement.classList.add(getClass(\"bottom\"));\r\n\t\tthis.element.style.setProperty(\"top\", toPx(this.node.getBoundingClientRect().top + this.node.offsetHeight + 10));\r\n\t\tthis.centerHorizontally();\r\n\t}\r\n\r\n /** Force showing the tooltip to the left of the node. */\r\n\tshowLeft() {\r\n\t\tthis.tooltipElement.classList.add(getClass(\"left\"));\r\n\t\tthis.element.style.setProperty(\"left\", toPx(this.node.getBoundingClientRect().left - this.element.offsetWidth - 10));\r\n\t\tthis.centerVertically();\r\n\t}\r\n\r\n /** Force showing the tooltip to the right of the node. */\r\n\tshowRight() {\r\n\t\tthis.tooltipElement.classList.add(getClass(\"right\"));\r\n\t\tthis.element.style.setProperty(\"left\", toPx(this.node.getBoundingClientRect().left + this.node.offsetWidth + 10));\r\n\t\tthis.centerVertically();\r\n\t}\r\n\r\n\tcenterHorizontally() {\r\n const nodecenter = this.node.getBoundingClientRect().left + (this.node.offsetWidth / 2);\r\n this.element.style.setProperty(\"left\", toPx(nodecenter - (this.element.offsetWidth / 2)));\r\n\t}\r\n\r\n\tcenterVertically() {\r\n\t\tconst nodecenter = this.node.getBoundingClientRect().top + (this.node.offsetHeight / 2);\r\n\t\tthis.element.style.setProperty(\"top\", toPx(nodecenter - (this.element.offsetHeight / 2)));\r\n\t}\r\n}","import BDV2 from \"../modules/v2\";\r\nimport Tooltip from \"./tooltip\";\r\n\r\nexport default class extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n async componentDidMount() {\r\n const {style = \"black\", side = \"top\", text = \"\"} = this.props;\r\n this.node = BDV2.reactDom.findDOMNode(this);\r\n this.tooltip = new Tooltip(this.node, text, {style, side});\r\n }\r\n\r\n componentWillUnmount() {\r\n this.tooltip.hide();\r\n delete this.tooltip;\r\n }\r\n\r\n render() {\r\n return this.props.children;\r\n }\r\n}","import nodeFetch from \"node-fetch\"\r\nimport * as electron from \"electron\"\r\nimport * as crypto from \"crypto\"\r\nimport BDV2 from \"./v2\"\r\nimport tooltipWrap from \"../ui/tooltipWrap\"\r\nimport Utils from \"./utils\"\r\nimport { createReadStream, writeFileSync } from \"fs\"\r\nimport { basename, join } from \"path\"\r\nimport contentManager from \"./contentManager\"\r\nimport { addonCache } from \"./contentManager\"\r\n\r\nconst cache = {}\r\nconst cache2 = {}\r\n\r\nexport default new class PluginCertifier {\r\n constructor(){\r\n window.Lightcord.BetterDiscord.PluginCertifier = this\r\n }\r\n\r\n patch(attachment, id){\r\n process.nextTick(() => {\r\n processAttachment(attachment, id)\r\n })\r\n }\r\n\r\n start(){\r\n\r\n }\r\n\r\n isTrusted(hash){\r\n return cache[hash] && !cache[hash].suspect\r\n }\r\n}\r\n\r\nconst tests = [\r\n [/token/gi, 0],\r\n [/email/gi, 0],\r\n [/mfa/gi, 0],\r\n [/2fa/gi, 0],\r\n [/phone/gi, 0],\r\n [/child_process/gi, 0],\r\n [/localStorage/gi, 0],\r\n [/getGlobal/gi, 0],\r\n [/BrowserWindow/gi, 0],\r\n [/\\.exe/gi, 0],\r\n [/eval/gi, 0],\r\n [/WebAssembly/gi, 0],\r\n [/XMLHttpRequest(\\.|\\[[\"'`])prototype/gi, 0],\r\n [/window\\.fetch( +)?=/gi, 0],\r\n /** Obfuscation / hidden / workarounds */\r\n [/([\"'`]\\+)[\"'`]\\w[\"'`]/gi, 1],\r\n [/[\"'`]\\w[\"'`](\\+[\"'`])/gi, 1],\r\n [/\\${[\"'`]\\w+[\"'`]}/gi, 1],\r\n /** hexadecimal */\r\n [/_0x\\w{4}\\('0x[\\dabcdef]+'\\)/g, 1],\r\n [/_0x\\w{4}\\('0x[\\dabcdef]+'( +)?,( +)?'[^']{4}'\\)/g, 1], // _0x8db7('0x0', 'x1]f')\r\n /** mangled */\r\n [/\\w+\\('0x[\\dabcdef]+'\\)/g, 1], // b('0x0')\r\n [/\\w+\\('0x[\\dabcdef]+'( +)?,( +)?'[^']{4}'\\)/g, 1], // b('0x0', 'x1]f')\r\n /** string array at start */\r\n [/^var [\\w\\d_$]+=\\[\"/gi, 1]\r\n]\r\n\r\nconst threats = [\r\n \"Account Stealer/Virus\",\r\n \"Obfuscation/Hidden code\"\r\n]\r\n\r\nexport function checkViruses(hash, data, resultCallback, removeCallback, filename){\r\n data = data.toString(\"utf8\")\r\n let isHarmful = false\r\n /**\r\n * @type {string}\r\n */\r\n const no_comments = data.replace(/\\/\\*[\\s\\S]*?\\*\\/|([^\\\\:]|^)\\/\\/.*$/gm, \"\").trim()// removing all comments from plugins (remove meta and other.)\r\n\r\n for(const [test, type] of tests){\r\n const scrpt = type === 1 ? no_comments : data\r\n if(test.exec(scrpt)){\r\n isHarmful = threats[type]\r\n break\r\n }\r\n }\r\n\r\n if(!isHarmful)return removeCallback(hash)\r\n cache[hash] = {\r\n suspect: true,\r\n name: hashToUrl[hash].split(\"/\").pop(),\r\n type: hashToUrl[hash].endsWith(\".js\") ? \"Plugin\" : \"Theme\",\r\n harm: isHarmful,\r\n hash: hash,\r\n filename\r\n }\r\n \r\n console.log(`Found potentially dangerous ${cache[hash].type.toLowerCase()}: ${cache[hash].name}`)\r\n\r\n resultCallback(cache[hash])\r\n}\r\n\r\nconst hashToUrl = {}\r\n\r\nexport function checkHash(hash, data, filename, resultCallback, removeCallback){\r\n console.log(`File: ${filename} hash: ${hash}`)\r\n if(!cache[hash]){\r\n nodeFetch(\"https://cdn.jsdelivr.net/gh/Lightcord/filehashes@master/hashes/\"+hash, { // Using node-fetch to bypass cors\r\n headers: {\r\n \"User-Agent\": electron.remote.getCurrentWebContents().userAgent // have to set user-agent\r\n }\r\n }).then(async res => {\r\n if(res.status !== 200){\r\n if(filename.endsWith(\".theme.css\"))return removeCallback(hash)\r\n try{\r\n checkViruses(hash, data, resultCallback, removeCallback, filename)\r\n }catch(e){\r\n console.error(e)\r\n removeCallback()\r\n }\r\n return\r\n }\r\n const result = await res.json()\r\n result.hash = hash\r\n result.filename = filename\r\n\r\n cache[hash] = result\r\n\r\n resultCallback(result)\r\n }).catch((err) => {\r\n console.error(`Could not read from github. ${err}`)\r\n if(filename.endsWith(\".theme.css\"))return removeCallback(hash)\r\n checkViruses(hash, data, resultCallback, removeCallback, filename)\r\n })\r\n }else{\r\n const result = cache[hash]\r\n\r\n resultCallback(result)\r\n }\r\n}\r\n\r\nexport function processFile(__path, resultCallback, removeCallback = (hash) => {}, isFromLoader = false){ \r\n const hash = crypto.createHash(\"sha256\")\r\n let data = Buffer.alloc(0)\r\n\r\n createReadStream(__path).on(\"data\", chunk => {\r\n data = Buffer.concat([data, chunk])\r\n hash.update(chunk)\r\n }).on(\"end\", () => {\r\n const hashResult = hash.digest(\"hex\")\r\n\r\n hashToUrl[hashResult] = __path\r\n\r\n if(isFromLoader && addonCache[hashResult]){\r\n let value = addonCache[hashResult]\r\n if(value.timestamp < (Date.now() - 6.048e+8)){\r\n delete addonCache[hashResult]\r\n contentManager.saveAddonCache()\r\n }else{\r\n resultCallback(value.result)\r\n return\r\n }\r\n }\r\n\r\n checkHash(hashResult, data, basename(__path), resultCallback, removeCallback)\r\n })\r\n}\r\n\r\nexport function processAttachment(attachment, id){\r\n if(!document.getElementById(id))return\r\n if(!attachment.url.startsWith(\"https://cdn.discordapp.com/\"))return document.getElementById(id).remove()\r\n if(!attachment.filename.endsWith(\".plugin.js\") && !attachment.filename.endsWith(\".theme.css\"))return document.getElementById(id).remove()\r\n\r\n nodeFetch(attachment.url, {\r\n headers: {\r\n \"User-Agent\": electron.remote.getCurrentWebContents().userAgent\r\n }\r\n }).then(res => {\r\n if(res.status !== 200)throw new Error(\"File doesn't exist.\")\r\n const hash = crypto.createHash(\"sha256\")\r\n let data = Buffer.alloc(0)\r\n res.body.on(\"data\", chunk => {\r\n data = Buffer.concat([data, chunk])\r\n hash.update(chunk)\r\n })\r\n res.body.on(\"end\", () => {\r\n const hashResult = hash.digest(\"hex\")\r\n\r\n cache2[attachment.url] = hashResult\r\n hashToUrl[hashResult] = attachment.url\r\n\r\n checkHash(hashResult, data, attachment.filename, (result) => {\r\n renderToElements(id, result, attachment.filename)\r\n }, () => {\r\n let elem = document.getElementById(id)\r\n if(elem)elem.remove()\r\n })\r\n })\r\n }).catch(()=>{})\r\n}\r\n\r\nlet flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0]\r\nlet childModule = BDModules.get(e => e.childContainer)[0]\r\n\r\n/**\r\n * \r\n * @param {HTMLDivElement[]} elements \r\n * @param {{type: \"Theme\"|\"Plugin\", name: string, official?: boolean}|{suspect:true, type: \"Theme\"|\"Plugin\", name: string, harm: string}} result\r\n */\r\nfunction renderToElements(id, result, filename){\r\n const div = document.getElementById(id)\r\n if(!div || div.childNodes.length > 0)return // already certified/div does not exist anymore.\r\n\r\n if(!flowerStarModule)flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0]\r\n if(!childModule)childModule = BDModules.get(e => e.childContainer)[0]\r\n \r\n if(result.suspect){\r\n try{\r\n div.parentNode.style.borderColor = \"rgb(240, 71, 71)\"\r\n /**\r\n * \r\n * @param {HTMLElement} node \r\n */\r\n let nextNode = (node) => {\r\n for(let child of node.children){\r\n if(child.tagName === \"A\"){\r\n child.addEventListener(\"click\", (e) => {\r\n e.preventDefault()\r\n e.stopImmediatePropagation()\r\n\r\n Utils.showConfirmationModal(\r\n \"Are you sure you want to download this ?\", \r\n \"The \"+result.type.toLowerCase()+\" **\"+filename+\"** might be dangerous **(\"+result.harm+\")**. \\n\\n**We don't recommand to download it**. However, you can still do it below.\", \r\n {\r\n confirmText: \"Download Anyway\",\r\n cancelText: \"Don't !\",\r\n danger: true,\r\n onCancel: () => {},\r\n onConfirm: () => {\r\n electron.remote.shell.openExternal(child.href)\r\n }\r\n }\r\n )\r\n })\r\n }else if([\"div\"].includes(child.tagName.toLowerCase())){\r\n nextNode(child)\r\n }\r\n }\r\n }\r\n nextNode(div.parentNode)\r\n }catch(e){\r\n console.error(e)\r\n }\r\n BDV2.reactDom.render(BDV2.react.createElement(tooltipWrap, {text: result.type+\" \"+result.name+\" is potentially dangerous.\"}, \r\n BDV2.react.createElement(\"div\", {className: flowerStarModule.flowerStarContainer, style: {width: \"20px\", height: \"20px\"}},\r\n BDV2.react.createElement(\"svg\", {className: BDModules.get(e => e.svg)[0].svg, \"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 40 32\"},\r\n BDV2.react.createElement(\"rect\", {\r\n x:\"0\",\r\n y:\"0\",\r\n width:\"32\",\r\n height:\"32\",\r\n mask:\"url(#svg-mask-avatar-status-round-32)\",\r\n fill:\"#f04747\",\r\n mask:\"url(#svg-mask-status-dnd)\",\r\n className:BDModules.get(e => e.pointerEvents)[0].pointerEvents\r\n })\r\n )\r\n )\r\n ), div)\r\n }else if(!result.official){\r\n div.parentNode.style.borderColor = \"#4087ed\"\r\n let span = BDV2.react.createElement(\"span\", {style: {display: \"inherit\"}}, [\r\n BDV2.react.createElement(tooltipWrap, {text: result.type+\" \"+result.name+\" is certified by Lightcord.\"}, \r\n BDV2.react.createElement(\"div\", {className: flowerStarModule.flowerStarContainer, style: {width: \"20px\", height: \"20px\", float: \"left\"}},\r\n BDV2.react.createElement(\"svg\", {className: flowerStarModule.flowerStar, \"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 16 15.2\"},\r\n BDV2.react.createElement(\"path\", {fill:\"#4f545c\", \"fill-rule\":\"evenodd\",d:\"m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z\"})\r\n ),\r\n BDV2.react.createElement(\"div\", {className: childModule.childContainer}, \r\n BDV2.react.createElement(\"svg\", {\"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 16 15.2\"}, \r\n BDV2.react.createElement(\"path\", {fill:\"#ffffff\",d:\"M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z\"})\r\n )\r\n )\r\n )\r\n ),\r\n BDV2.react.createElement(tooltipWrap, {text: \"Install this \"+result.type.toLowerCase()+\" on Lightcord.\"}, \r\n BDV2.react.createElement(\"div\", {className: flowerStarModule.flowerStarContainer, style: {width: \"20px\", height: \"20px\"}, onClick(){\r\n Utils.showConfirmationModal(\r\n \"Are you sure you want to download this \"+result.type.toLowerCase()+\" ?\", \r\n \"Lightcord will automatically install and launch this \"+result.type.toLowerCase()+\". You don't have anything to do.\", \r\n {\r\n confirmText: \"Download and Install\",\r\n cancelText: \"I've changed my mind\",\r\n danger: false,\r\n onCancel: () => {},\r\n onConfirm: () => {\r\n let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0]\r\n console.log(link)\r\n nodeFetch(link)\r\n .then(async res => {\r\n if(res.status !== 200)throw new Error(\"Status was not 200\")\r\n let content = await res.buffer()\r\n let installPath = join(result.type === \"Plugin\" ? contentManager._pluginsFolder : contentManager._themesFolder, result.filename)\r\n console.log(installPath)\r\n writeFileSync(installPath, content)\r\n Utils.showToast(result.type+\" succesfully installed.\")\r\n }).catch(err => {\r\n err = err instanceof Error ? err : new Error(err)\r\n Utils.showToast(err.message, {\r\n type: \"error\"\r\n })\r\n })\r\n }\r\n }\r\n )\r\n }},\r\n BDV2.react.createElement(\"svg\", {className: flowerStarModule.flowerStar, \"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 24 24\",style:{\r\n color: \"rgb(67, 181, 129)\",\r\n cursor: \"pointer\"\r\n }},\r\n \r\n \r\n \r\n \r\n )\r\n )\r\n )\r\n ])\r\n BDV2.reactDom.render(span, div)\r\n }else{\r\n div.parentNode.style.borderColor = \"#4087ed\"\r\n let span = BDV2.react.createElement(\"span\", {style: {display: \"inherit\"}}, [\r\n BDV2.react.createElement(tooltipWrap, {text: result.type+\" \"+result.name+\" was made by the developers of Lightcord.\", style:\"brand\"}, \r\n BDV2.react.createElement(\"div\", {className: flowerStarModule.flowerStarContainer, style: {width: \"20px\", height: \"20px\", float: \"left\"}},\r\n BDV2.react.createElement(\"svg\", {className: flowerStarModule.flowerStar, \"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 16 15.2\",stroke:\"#36393f\",style:{color:\"#4087ed\"}},\r\n BDV2.react.createElement(\"path\", {fill:\"currentColor\", \"fill-rule\":\"evenodd\",d:\"m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z\"})\r\n ),\r\n BDV2.react.createElement(\"div\", {className: childModule.childContainer}, \r\n BDV2.react.createElement(\"svg\", {\"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 16 15.2\"}, \r\n BDV2.react.createElement(\"path\", {fill:\"#ffffff\",d:\"M10.7,5.28a2.9,2.9,0,0,0-2.11.86.11.11,0,0,0,0,.16l1.05.94a.11.11,0,0,0,.15,0,1.27,1.27,0,0,1,.9-.33c.65,0,.65.73.65.73a.64.64,0,0,1-.65.65,1.73,1.73,0,0,1-1.18-.54c-.31-.26-.36-.32-.73-.66S7.06,5.28,5.65,5.28A2.26,2.26,0,0,0,3.37,7.56,2.59,2.59,0,0,0,3.82,9a2.18,2.18,0,0,0,1.83.89,2.94,2.94,0,0,0,2.1-.81.11.11,0,0,0,0-.16L6.74,8A.11.11,0,0,0,6.6,8a1.58,1.58,0,0,1-.94.29h0A.71.71,0,0,1,5,7.56H5a.63.63,0,0,1,.65-.64c.71,0,1.42.75,1.94,1.27.75.76,1.66,1.79,3.11,1.74A2.28,2.28,0,0,0,13,7.64a2.59,2.59,0,0,0-.45-1.47A2.14,2.14,0,0,0,10.7,5.28Z\"})\r\n )\r\n )\r\n )\r\n ),\r\n BDV2.react.createElement(tooltipWrap, {text: \"Install this \"+result.type.toLowerCase()+\" on Lightcord.\"}, \r\n BDV2.react.createElement(\"div\", {className: flowerStarModule.flowerStarContainer, style: {width: \"20px\", height: \"20px\"}, onClick(){\r\n Utils.showConfirmationModal(\r\n \"Are you sure you want to download this \"+result.type.toLowerCase()+\" ?\", \r\n \"Lightcord will automatically download and load this \"+result.type.toLowerCase()+\". You must enable it in the settings.\", \r\n {\r\n confirmText: \"Download and Install\",\r\n cancelText: \"I've changed my mind\",\r\n danger: false,\r\n onCancel: () => {},\r\n onConfirm: () => {\r\n let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0]\r\n \r\n nodeFetch(link)\r\n .then(async res => {\r\n if(res.status !== 200)throw new Error(\"Status was not 200\")\r\n let content = await res.buffer()\r\n let installPath = join(result.type === \"Plugin\" ? contentManager._pluginsFolder : contentManager._themesFolder, result.filename)\r\n \r\n writeFileSync(installPath, content)\r\n Utils.showToast(result.type+\" succesfully installed.\")\r\n }).catch(err => {\r\n err = err instanceof Error ? err : new Error(err)\r\n Utils.showToast(err.message, {\r\n type: \"error\"\r\n })\r\n })\r\n }\r\n }\r\n )\r\n }},\r\n BDV2.react.createElement(\"svg\", {className: flowerStarModule.flowerStar, \"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 24 24\",style:{\r\n color: \"rgb(67, 181, 129)\",\r\n cursor: \"pointer\"\r\n }},\r\n \r\n \r\n \r\n \r\n )\r\n )\r\n )\r\n ])\r\n BDV2.reactDom.render(span, div)\r\n }\r\n}\r\n\r\nfunction getKeyedArray(obj){\r\n let arr = []\r\n Object.keys(obj).forEach(k => {\r\n arr.push([k, obj[k]])\r\n })\r\n return arr\r\n}\r\n\r\nlet key = null\r\nlet save = null\r\n\r\nwindow.Lightcord.Api.ensureExported(m=>m.ObjectStorage)\r\n.then(localStorageModule => {\r\n let localStorage = localStorageModule.impl\r\n save = function(){\r\n localStorage.set(\"PluginCertifierKeyEncryption__\", btoa(JSON.stringify(key)))\r\n }\r\n setInterval(() => {\r\n save()\r\n }, 100000);\r\n try{\r\n let val = safeJSONParse(atob(localStorage.get(\"PluginCertifierKeyEncryption__\")))\r\n if(val instanceof Error || !Array.isArray(val) || val.length !== 2 || val.find(e => typeof e !== \"string\") || Buffer.from(val[0], \"base64\").length !== 16 || Buffer.from(val[1], \"base64\").length !== 32){\r\n generateKey()\r\n save()\r\n return\r\n }\r\n key = val\r\n }catch(e){\r\n generateKey()\r\n save()\r\n }\r\n})\r\n\r\nfunction generateKey(){\r\n key = [crypto.randomBytes(16).toString(\"base64\"), crypto.randomBytes(32).toString(\"base64\")]\r\n}\r\n\r\nfunction safeJSONParse(json){\r\n try{\r\n return JSON.parse(json)\r\n }catch(e){\r\n return e instanceof Error ? new Error(e) : e\r\n }\r\n}\r\n\r\nexport function decryptSettingsCache(data){\r\n try{\r\n let decipher = crypto.createDecipheriv(\"aes-256-cbc\", Buffer.from(key[1], \"base64\"), Buffer.from(key[0], \"base64\"))\r\n let decrypted = decipher.update(Buffer.from(data, \"base64\"));\r\n decrypted = Buffer.concat([decrypted, decipher.final()]);\r\n return decrypted.toString(\"utf8\")\r\n }catch(e){\r\n return \"{}\"\r\n }\r\n}\r\nexport function encryptSettingsCache(data){\r\n let args = [Buffer.from(key[1], \"base64\"), Buffer.from(key[0], \"base64\")]\r\n \r\n let cipher = crypto.createCipheriv('aes-256-cbc', ...args);\r\n let encrypted = cipher.update(Buffer.from(data, \"utf8\"));\r\n encrypted = Buffer.concat([encrypted, cipher.final()]);\r\n return encrypted.toString(\"base64\")\r\n}","import {bdConfig, bdplugins, bdthemes, settingsCookie} from \"../0globals\";\r\nimport pluginModule from \"./pluginModule\";\r\nimport themeModule from \"./themeModule\";\r\nimport Utils from \"./utils\";\r\nimport dataStore from \"./dataStore\";\r\nimport { encryptSettingsCache, decryptSettingsCache, processFile } from \"./pluginCertifier\";\r\n\r\nconst path = require(\"path\");\r\nconst fs = require(\"fs\");\r\nconst Module = require(\"module\").Module;\r\nModule.globalPaths.push(path.resolve(require(\"electron\").remote.app.getAppPath(), \"node_modules\"));\r\nclass MetaError extends Error {\r\n constructor(message) {\r\n super(message);\r\n this.name = \"MetaError\";\r\n }\r\n}\r\nconst originalJSRequire = Module._extensions[\".js\"];\r\nconst originalCSSRequire = Module._extensions[\".css\"] ? Module._extensions[\".css\"] : () => {return null;};\r\nconst splitRegex = /[^\\S\\r\\n]*?(?:\\r\\n|\\n)[^\\S\\r\\n]*?\\*[^\\S\\r\\n]?/;\r\nconst escapedAtRegex = /^\\\\@/;\r\n\r\nexport let addonCache = {}\r\n\r\nlet hasPatched = false\r\nexport default new class ContentManager {\r\n\r\n constructor() {\r\n this.timeCache = {};\r\n this.watchers = {};\r\n }\r\n\r\n patchExtensions(){\r\n if(hasPatched)return\r\n hasPatched = true\r\n Module._extensions[\".js\"] = this.getContentRequire(\"plugin\");\r\n Module._extensions[\".css\"] = this.getContentRequire(\"theme\");\r\n }\r\n\r\n get pluginsFolder() {return this._pluginsFolder || (this._pluginsFolder = fs.realpathSync(path.resolve(bdConfig.dataPath + \"plugins/\")));}\r\n get themesFolder() {return this._themesFolder || (this._themesFolder = fs.realpathSync(path.resolve(bdConfig.dataPath + \"themes/\")));}\r\n\r\n loadAddonCertifierCache(){\r\n if(typeof dataStore.getSettingGroup(\"PluginCertifierHashes\") !== \"string\"){\r\n dataStore.setSettingGroup(\"PluginCertifierHashes\", encryptSettingsCache(\"{}\"))\r\n }else{\r\n try{\r\n addonCache = JSON.parse(decryptSettingsCache(dataStore.getSettingGroup(\"PluginCertifierHashes\")))\r\n }catch(e){\r\n dataStore.setSettingGroup(\"PluginCertifierHashes\", encryptSettingsCache(\"{}\"))\r\n addonCache = {}\r\n }\r\n }\r\n Object.keys(addonCache)\r\n .forEach(key => {\r\n let value = addonCache[key]\r\n if(!value || typeof value !== \"object\" || Array.isArray(value))return delete addonCache[key]\r\n\r\n let props = [{\r\n key: \"timestamp\",\r\n type: \"number\"\r\n }, {\r\n key: \"result\",\r\n type: \"object\"\r\n }, {\r\n key: \"hash\",\r\n type: \"string\"\r\n }]\r\n for(let prop of props){\r\n if(!(prop.key in value) || typeof value[prop.key] !== prop.type){\r\n delete addonCache[key]\r\n return\r\n }\r\n }\r\n if(value.hash !== key){\r\n delete addonCache[key]\r\n return\r\n }\r\n if(value.result.suspect){ // refetch from remote to be sure you're up to date.\r\n delete addonCache[key]\r\n return\r\n }\r\n })\r\n this.saveAddonCache()\r\n }\r\n\r\n saveAddonCache(){\r\n dataStore.setSettingGroup(\"PluginCertifierHashes\", encryptSettingsCache(JSON.stringify(addonCache)))\r\n }\r\n\r\n watchContent(contentType) {\r\n if (this.watchers[contentType]) return;\r\n const isPlugin = contentType === \"plugin\";\r\n const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;\r\n const fileEnding = isPlugin ? \".plugin.js\" : \".theme.css\";\r\n this.watchers[contentType] = fs.watch(baseFolder, {persistent: false}, async (eventType, filename) => {\r\n if (!eventType || !filename || !filename.endsWith(fileEnding)) return;\r\n await new Promise(r => setTimeout(r, 50));\r\n try {fs.statSync(path.resolve(baseFolder, filename));}\r\n catch (err) {\r\n if (err.code !== \"ENOENT\") return;\r\n delete this.timeCache[filename];\r\n if (isPlugin) return pluginModule.unloadPlugin(filename);\r\n return themeModule.unloadTheme(filename);\r\n }\r\n if (!fs.statSync(path.resolve(baseFolder, filename)).isFile()) return;\r\n const stats = fs.statSync(path.resolve(baseFolder, filename));\r\n if (!stats || !stats.mtime || !stats.mtime.getTime()) return;\r\n if (typeof(stats.mtime.getTime()) !== \"number\") return;\r\n if (this.timeCache[filename] == stats.mtime.getTime()) return;\r\n this.timeCache[filename] = stats.mtime.getTime();\r\n if (eventType == \"rename\") {\r\n if (isPlugin) await pluginModule.loadPlugin(filename);\r\n else await themeModule.loadTheme(filename);\r\n }\r\n if (eventType == \"change\") {\r\n if (isPlugin) await pluginModule.reloadPlugin(filename);\r\n else await themeModule.reloadTheme(filename);\r\n }\r\n });\r\n }\r\n\r\n unwatchContent(contentType) {\r\n if (!this.watchers[contentType]) return;\r\n this.watchers[contentType].close();\r\n delete this.watchers[contentType];\r\n }\r\n\r\n extractMeta(content) {\r\n const firstLine = content.split(\"\\n\")[0];\r\n const hasOldMeta = firstLine.includes(\"//META\");\r\n if (hasOldMeta) return this.parseOldMeta(content);\r\n const hasNewMeta = firstLine.includes(\"/**\");\r\n if (hasNewMeta) return this.parseNewMeta(content);\r\n throw new MetaError(\"META was not found.\");\r\n }\r\n\r\n parseOldMeta(content) {\r\n const meta = content.split(\"\\n\")[0];\r\n const rawMeta = meta.substring(meta.lastIndexOf(\"//META\") + 6, meta.lastIndexOf(\"*//\"));\r\n if (meta.indexOf(\"META\") < 0) throw new MetaError(\"META was not found.\");\r\n const parsed = Utils.testJSON(rawMeta);\r\n if (!parsed) throw new MetaError(\"META could not be parsed.\");\r\n if (!parsed.name) throw new MetaError(\"META missing name data.\");\r\n parsed.format = \"json\";\r\n return parsed;\r\n }\r\n\r\n parseNewMeta(content) {\r\n const block = content.split(\"/**\", 2)[1].split(\"*/\", 1)[0];\r\n const out = {};\r\n let field = \"\";\r\n let accum = \"\";\r\n for (const line of block.split(splitRegex)) {\r\n if (line.length === 0) continue;\r\n if (line.charAt(0) === \"@\" && line.charAt(1) !== \" \") {\r\n out[field] = accum;\r\n const l = line.indexOf(\" \");\r\n field = line.substr(1, l - 1);\r\n accum = line.substr(l + 1);\r\n }\r\n else {\r\n accum += \" \" + line.replace(\"\\\\n\", \"\\n\").replace(escapedAtRegex, \"@\");\r\n }\r\n }\r\n out[field] = accum.trim();\r\n delete out[\"\"];\r\n out.format = \"jsdoc\";\r\n return out;\r\n }\r\n\r\n getContentRequire(type) {\r\n const isPlugin = type === \"plugin\";\r\n const self = this;\r\n const originalRequire = isPlugin ? originalJSRequire : originalCSSRequire;\r\n return function(module, filename) {\r\n const baseFolder = isPlugin ? self.pluginsFolder : self.themesFolder;\r\n const possiblePath = path.resolve(baseFolder, path.basename(filename));\r\n if (!fs.existsSync(possiblePath) || filename !== fs.realpathSync(possiblePath)) return Reflect.apply(originalRequire, this, arguments);\r\n let content = fs.readFileSync(filename, \"utf8\");\r\n content = Utils.stripBOM(content);\r\n\r\n const stats = fs.statSync(filename);\r\n const meta = self.extractMeta(content);\r\n meta.filename = path.basename(filename);\r\n meta.added = stats.atimeMs;\r\n meta.modified = stats.mtimeMs;\r\n meta.size = stats.size;\r\n if (!isPlugin) {\r\n meta.css = content;\r\n if (meta.format == \"json\") meta.css = meta.css.split(\"\\n\").slice(1).join(\"\\n\");\r\n content = `module.exports = ${JSON.stringify(meta)};`;\r\n }\r\n if (isPlugin) {\r\n module._compile(content, module.filename);\r\n const didExport = !Utils.isEmpty(module.exports);\r\n if (didExport) {\r\n meta.type = module.exports;\r\n module.exports = meta;\r\n content = \"\";\r\n }\r\n else {\r\n Utils.warn(\"Module Not Exported\", `${meta.name}, please start setting module.exports`);\r\n content += `\\nmodule.exports = ${JSON.stringify(meta)};\\nmodule.exports.type = ${meta.exports || meta.name};`;\r\n }\r\n }\r\n module._compile(content, filename);\r\n };\r\n }\r\n\r\n makePlaceholderPlugin(data) {\r\n return {plugin: {\r\n start: () => {},\r\n getName: () => {return data.name || data.filename;},\r\n getAuthor: () => {return \"???\";},\r\n getDescription: () => {return data.message ? data.message : \"This plugin was unable to be loaded. Check the author's page for updates.\";},\r\n getVersion: () => {return \"???\";}\r\n },\r\n name: data.name || data.filename,\r\n filename: data.filename,\r\n source: data.source ? data.source : \"\",\r\n website: data.website ? data.website : \"\"\r\n };\r\n }\r\n\r\n async loadContent(filename, type) {\r\n if (typeof(filename) === \"undefined\" || typeof(type) === \"undefined\") return;\r\n const isPlugin = type === \"plugin\";\r\n const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;\r\n\r\n if(settingsCookie[\"fork-ps-6\"]){\r\n let result = await new Promise(resolve => {\r\n processFile(path.resolve(baseFolder, filename), (result) => {\r\n console.log(result)\r\n resolve(result)\r\n }, (hash) => {\r\n resolve({\r\n suspect: false,\r\n hash: hash,\r\n filename: filename,\r\n name: filename\r\n })\r\n }, true)\r\n })\r\n if(result){\r\n addonCache[result.hash] = {\r\n timestamp: Date.now(),\r\n hash: result.hash,\r\n result: result\r\n }\r\n this.saveAddonCache()\r\n if(result.suspect){\r\n return {\r\n name: filename,\r\n file: filename,\r\n message: \"This plugin might be dangerous (\"+result.harm+\").\",\r\n error: new Error(\"This plugin might be dangerous (\"+result.harm+\").\")\r\n }\r\n }\r\n }\r\n }\r\n\r\n try {window.require(path.resolve(baseFolder, filename));}\r\n catch (error) {return {name: filename, file: filename, message: \"Could not be compiled.\", error: {message: error.message, stack: error.stack}};}\r\n const content = window.require(path.resolve(baseFolder, filename));\r\n if(!content.name)return {name: filename, file: filename, message: \"Cannot escape the ID.\", error: new Error(\"Cannot read property 'replace' of undefined\")}\r\n content.id = Utils.escapeID(content.name);\r\n //if(!id)return {name: filename, file: filename, message: \"Invalid ID\", error: new Error(\"Please fix the name of \"+filename+\". BetterDiscord can't escape an ID.\")}\r\n if (isPlugin) {\r\n if (!content.type) return;\r\n try {\r\n content.plugin = new content.type();\r\n delete bdplugins[content.plugin.getName()];\r\n bdplugins[content.plugin.getName()] = content;\r\n }\r\n catch (error) {return {name: filename, file: filename, message: \"Could not be constructed.\", error: {message: error.message, stack: error.stack}};}\r\n }\r\n else {\r\n delete bdthemes[content.name];\r\n bdthemes[content.name] = content;\r\n }\r\n } \r\n\r\n unloadContent(filename, type) {\r\n if (typeof(filename) === \"undefined\" || typeof(type) === \"undefined\") return;\r\n const isPlugin = type === \"plugin\";\r\n const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;\r\n try {\r\n delete window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))];\r\n }\r\n catch (err) {return {name: filename, file: filename, message: \"Could not be unloaded.\", error: {message: err.message, stack: err.stack}};}\r\n }\r\n\r\n isLoaded(filename, type) {\r\n const isPlugin = type === \"plugin\";\r\n const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;\r\n try {window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))];}\r\n catch (err) {return false;}\r\n return true;\r\n }\r\n\r\n async reloadContent(filename, type) {\r\n const cantUnload = this.unloadContent(filename, type);\r\n if (cantUnload) return cantUnload;\r\n return await this.loadContent(filename, type);\r\n }\r\n\r\n loadNewContent(type) {\r\n const isPlugin = type === \"plugin\";\r\n const fileEnding = isPlugin ? \".plugin.js\" : \".theme.css\";\r\n const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;\r\n const files = fs.readdirSync(basedir);\r\n const contentList = Object.values(isPlugin ? bdplugins : bdthemes);\r\n const removed = contentList.filter(t => !files.includes(t.filename)).map(c => isPlugin ? c.plugin.getName() : c.name);\r\n const added = files.filter(f => !contentList.find(t => t.filename == f) && f.endsWith(fileEnding) && fs.statSync(path.resolve(basedir, f)).isFile());\r\n return {added, removed};\r\n }\r\n\r\n async loadAllContent(type) {\r\n this.patchExtensions()\r\n const isPlugin = type === \"plugin\";\r\n const fileEnding = isPlugin ? \".plugin.js\" : \".theme.css\";\r\n const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;\r\n const errors = [];\r\n const files = fs.readdirSync(basedir);\r\n\r\n for (const filename of files) {\r\n if (!fs.statSync(path.resolve(basedir, filename)).isFile() || !filename.endsWith(fileEnding)) continue;\r\n const error = await this.loadContent(filename, type);\r\n if (error) errors.push(error);\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n loadPlugins() {return this.loadAllContent(\"plugin\");}\r\n loadThemes() {return this.loadAllContent(\"theme\");}\r\n};\r\n\r\n/**\r\n * Don't expose contentManager - could be dangerous for now\r\n */","/**\r\n * Copyright 2018 Zachary Rauen\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining\r\n * a copy of this software and associated documentation files (the \"Software\"),\r\n * to deal in the Software without restriction, including without limitation the\r\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is furnished\r\n * to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\r\n * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\r\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\r\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\r\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\r\n * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n * \r\n * From: https://github.com/rauenzi/BDPluginLibrary\r\n */\r\n\r\n/**\r\n * @interface\r\n * @name Offset\r\n * @property {number} top - Top offset of the target element.\r\n * @property {number} right - Right offset of the target element.\r\n * @property {number} bottom - Bottom offset of the target element.\r\n * @property {number} left - Left offset of the target element.\r\n * @property {number} height - Outer height of the target element.\r\n * @property {number} width - Outer width of the target element.\r\n */\r\n\r\n /**\r\n * Function that automatically removes added listener.\r\n * @callback module:DOMTools~CancelListener\r\n */\r\n \r\nexport default class DOMTools {\r\n\r\n static escapeID(id) {\r\n return id.replace(/^[^a-z]+|[^\\w-]+/gi, \"-\");\r\n }\r\n\r\n /**\r\n\t * Adds a style to the document.\r\n\t * @param {string} id - identifier to use as the element id\r\n\t * @param {string} css - css to add to the document\r\n\t */\r\n\tstatic addStyle(id, css) {\r\n\t\tdocument.head.append(DOMTools.createElement(``));\r\n\t}\r\n\r\n\t/**\r\n\t * Removes a style from the document.\r\n\t * @param {string} id - original identifier used\r\n\t */\r\n\tstatic removeStyle(id) {\r\n\t\tconst element = document.getElementById(id);\r\n\t\tif (element) element.remove();\r\n\t}\r\n\r\n\t/**\r\n\t * Adds/requires a remote script to be loaded\r\n\t * @param {string} id - identifier to use for this script\r\n\t * @param {string} url - url from which to load the script\r\n\t * @returns {Promise} promise that resolves when the script is loaded\r\n\t */\r\n\tstatic addScript(id, url) {\r\n\t\treturn new Promise(resolve => {\r\n\t\t\tconst script = document.createElement(\"script\");\r\n\t\t\tscript.id = id;\r\n\t\t\tscript.src = url;\r\n\t\t\tscript.type = \"text/javascript\";\r\n\t\t\tscript.onload = resolve;\r\n\t\t\tdocument.head.append(script);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Removes a remote script from the document.\r\n\t * @param {string} id - original identifier used\r\n\t */\r\n\tstatic removeScript(id) {\r\n id = this.escapeID(id);\r\n\t\tconst element = document.getElementById(id);\r\n\t\tif (element) element.remove();\r\n }\r\n \r\n // https://javascript.info/js-animation\r\n static animate({timing = _ => _, update, duration}) {\r\n const start = performance.now();\r\n \r\n requestAnimationFrame(function animate(time) {\r\n // timeFraction goes from 0 to 1\r\n let timeFraction = (time - start) / duration;\r\n if (timeFraction > 1) timeFraction = 1;\r\n \r\n // calculate the current animation state\r\n const progress = timing(timeFraction);\r\n \r\n update(progress); // draw it\r\n \r\n if (timeFraction < 1) {\r\n requestAnimationFrame(animate);\r\n }\r\n \r\n });\r\n }\r\n\r\n /**\r\n * This is my shit version of not having to use `$` from jQuery. Meaning\r\n * that you can pass a selector and it will automatically run {@link module:DOMTools.query}.\r\n * It also means that you can pass a string of html and it will perform and return `parseHTML`.\r\n * @see module:DOMTools.parseHTML\r\n * @see module:DOMTools.query\r\n * @param {string} selector - Selector to query or HTML to parse\r\n * @returns {(DocumentFragment|NodeList|HTMLElement)} - Either the result of `parseHTML` or `query`\r\n */\r\n static Q(selector) {\r\n const element = this.parseHTML(selector);\r\n const isHTML = element instanceof NodeList ? Array.from(element).some(n => n.nodeType === 1) : element.nodeType === 1;\r\n if (isHTML) return element;\r\n return this.query(selector);\r\n }\r\n\r\n /**\r\n * Essentially a shorthand for `document.querySelector`. If the `baseElement` is not provided\r\n * `document` is used by default.\r\n * @param {string} selector - Selector to query\r\n * @param {Element} [baseElement] - Element to base the query from\r\n * @returns {(Element|null)} - The found element or null if not found\r\n */\r\n static query(selector, baseElement = document) {\r\n return baseElement.querySelector(selector);\r\n }\r\n\r\n /**\r\n * Essentially a shorthand for `document.querySelectorAll`. If the `baseElement` is not provided\r\n * `document` is used by default.\r\n * @param {string} selector - Selector to query\r\n * @param {Element} [baseElement] - Element to base the query from\r\n * @returns {Array} - Array of all found elements\r\n */\r\n static queryAll(selector, baseElement = document) {\r\n return baseElement.querySelectorAll(selector);\r\n }\r\n\r\n /**\r\n * Parses a string of HTML and returns the results. If the second parameter is true,\r\n * the parsed HTML will be returned as a document fragment {@see https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment}.\r\n * This is extremely useful if you have a list of elements at the top level, they can then be appended all at once to another node.\r\n * \r\n * If the second parameter is false, then the return value will be the list of parsed\r\n * nodes and there were multiple top level nodes, otherwise the single node is returned.\r\n * @param {string} html - HTML to be parsed\r\n * @param {boolean} [fragment=false] - Whether or not the return should be the raw `DocumentFragment`\r\n * @returns {(DocumentFragment|NodeList|HTMLElement)} - The result of HTML parsing\r\n */\r\n static parseHTML(html, fragment = false) {\r\n const template = document.createElement(\"template\");\r\n template.innerHTML = html;\r\n const node = template.content.cloneNode(true);\r\n if (fragment) return node;\r\n return node.childNodes.length > 1 ? node.childNodes : node.childNodes[0];\r\n }\r\n\r\n /** Alternate name for {@link module:DOMTools.parseHTML} */\r\n static createElement(html, fragment = false) {return this.parseHTML(html, fragment);}\r\n \r\n /**\r\n * Takes a string of html and escapes it using the brower's own escaping mechanism.\r\n * @param {String} html - html to be escaped\r\n */\r\n static escapeHTML(html) {\r\n const textNode = document.createTextNode(\"\");\r\n const spanElement = document.createElement(\"span\");\r\n spanElement.append(textNode);\r\n textNode.nodeValue = html;\r\n return spanElement.innerHTML;\r\n }\r\n\r\n /**\r\n * Adds a list of classes from the target element.\r\n * @param {Element} element - Element to edit classes of\r\n * @param {...string} classes - Names of classes to add\r\n * @returns {Element} - `element` to allow for chaining\r\n */\r\n static addClass(element, ...classes) {\r\n classes = classes.flat().filter(c => c);\r\n for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(\" \");\r\n classes = classes.flat().filter(c => c);\r\n element.classList.add(...classes);\r\n return element;\r\n }\r\n\r\n /**\r\n * Removes a list of classes from the target element.\r\n * @param {Element} element - Element to edit classes of\r\n * @param {...string} classes - Names of classes to remove\r\n * @returns {Element} - `element` to allow for chaining\r\n */\r\n static removeClass(element, ...classes) {\r\n for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(\" \");\r\n classes = classes.flat().filter(c => c);\r\n element.classList.remove(...classes);\r\n return element;\r\n }\r\n\r\n /**\r\n * When only one argument is present: Toggle class value;\r\n * i.e., if class exists then remove it and return false, if not, then add it and return true.\r\n * When a second argument is present:\r\n * If the second argument evaluates to true, add specified class value, and if it evaluates to false, remove it.\r\n * @param {Element} element - Element to edit classes of\r\n * @param {string} classname - Name of class to toggle\r\n * @param {boolean} [indicator] - Optional indicator for if the class should be toggled\r\n * @returns {Element} - `element` to allow for chaining\r\n */\r\n static toggleClass(element, classname, indicator) {\r\n classname = classname.toString().split(\" \").filter(c => c);\r\n if (typeof(indicator) !== \"undefined\") classname.forEach(c => element.classList.toggle(c, indicator));\r\n else classname.forEach(c => element.classList.toggle(c));\r\n return element;\r\n }\r\n\r\n /**\r\n * Checks if an element has a specific class\r\n * @param {Element} element - Element to edit classes of\r\n * @param {string} classname - Name of class to check\r\n * @returns {boolean} - `true` if the element has the class, `false` otherwise.\r\n */\r\n static hasClass(element, classname) {\r\n return classname.toString().split(\" \").filter(c => c).every(c => element.classList.contains(c));\r\n }\r\n\r\n /**\r\n * Replaces one class with another\r\n * @param {Element} element - Element to edit classes of\r\n * @param {string} oldName - Name of class to replace\r\n * @param {string} newName - New name for the class\r\n * @returns {Element} - `element` to allow for chaining\r\n */\r\n static replaceClass(element, oldName, newName) {\r\n element.classList.replace(oldName, newName);\r\n return element;\r\n }\r\n\r\n /**\r\n * Appends `thisNode` to `thatNode`\r\n * @param {Node} thisNode - Node to be appended to another node\r\n * @param {Node} thatNode - Node for `thisNode` to be appended to\r\n * @returns {Node} - `thisNode` to allow for chaining\r\n */\r\n static appendTo(thisNode, thatNode) {\r\n if (typeof(thatNode) == \"string\") thatNode = this.query(thatNode);\r\n if (!thatNode) return null;\r\n thatNode.append(thisNode);\r\n return thisNode;\r\n }\r\n\r\n /**\r\n * Prepends `thisNode` to `thatNode`\r\n * @param {Node} thisNode - Node to be prepended to another node\r\n * @param {Node} thatNode - Node for `thisNode` to be prepended to\r\n * @returns {Node} - `thisNode` to allow for chaining\r\n */\r\n static prependTo(thisNode, thatNode) {\r\n if (typeof(thatNode) == \"string\") thatNode = this.query(thatNode);\r\n if (!thatNode) return null;\r\n thatNode.prepend(thisNode);\r\n return thisNode;\r\n }\r\n\r\n /**\r\n * Insert after a specific element, similar to jQuery's `thisElement.insertAfter(otherElement)`.\r\n * @param {Node} thisNode - The node to insert\r\n * @param {Node} targetNode - Node to insert after in the tree\r\n * @returns {Node} - `thisNode` to allow for chaining\r\n */\r\n static insertAfter(thisNode, targetNode) {\r\n targetNode.parentNode.insertBefore(thisNode, targetNode.nextSibling);\r\n return thisNode;\r\n }\r\n\r\n /**\r\n * Insert after a specific element, similar to jQuery's `thisElement.after(newElement)`.\r\n * @param {Node} thisNode - The node to insert\r\n * @param {Node} newNode - Node to insert after in the tree\r\n * @returns {Node} - `thisNode` to allow for chaining\r\n */\r\n static after(thisNode, newNode) {\r\n thisNode.parentNode.insertBefore(newNode, thisNode.nextSibling);\r\n return thisNode;\r\n }\r\n\r\n /**\r\n * Gets the next sibling element that matches the selector.\r\n * @param {Element} element - Element to get the next sibling of\r\n * @param {string} [selector=\"\"] - Optional selector\r\n * @returns {Element} - The sibling element\r\n */\r\n static next(element, selector = \"\") {\r\n return selector ? element.querySelector(\"+ \" + selector) : element.nextElementSibling;\r\n }\r\n\r\n /**\r\n * Gets all subsequent siblings.\r\n * @param {Element} element - Element to get next siblings of\r\n * @returns {NodeList} - The list of siblings\r\n */\r\n static nextAll(element) {\r\n return element.querySelectorAll(\"~ *\");\r\n }\r\n\r\n /**\r\n * Gets the subsequent siblings until an element matches the selector.\r\n * @param {Element} element - Element to get the following siblings of\r\n * @param {string} selector - Selector to stop at\r\n * @returns {Array} - The list of siblings\r\n */\r\n static nextUntil(element, selector) {\r\n const next = []; \r\n while (element.nextElementSibling && !element.nextElementSibling.matches(selector)) next.push(element = element.nextElementSibling);\r\n return next;\r\n }\r\n\r\n /**\r\n * Gets the previous sibling element that matches the selector.\r\n * @param {Element} element - Element to get the previous sibling of\r\n * @param {string} [selector=\"\"] - Optional selector\r\n * @returns {Element} - The sibling element\r\n */\r\n static previous(element, selector = \"\") {\r\n const previous = element.previousElementSibling;\r\n if (selector) return previous && previous.matches(selector) ? previous : null;\r\n return previous;\r\n }\r\n\r\n /**\r\n * Gets all preceeding siblings.\r\n * @param {Element} element - Element to get preceeding siblings of\r\n * @returns {NodeList} - The list of siblings\r\n */\r\n static previousAll(element) {\r\n const previous = [];\r\n while (element.previousElementSibling) previous.push(element = element.previousElementSibling);\r\n return previous;\r\n }\r\n\r\n /**\r\n * Gets the preceeding siblings until an element matches the selector.\r\n * @param {Element} element - Element to get the preceeding siblings of\r\n * @param {string} selector - Selector to stop at\r\n * @returns {Array} - The list of siblings\r\n */\r\n static previousUntil(element, selector) {\r\n const previous = []; \r\n while (element.previousElementSibling && !element.previousElementSibling.matches(selector)) previous.push(element = element.previousElementSibling);\r\n return previous;\r\n }\r\n\r\n /**\r\n * Find which index in children a certain node is. Similar to jQuery's `$.index()`\r\n * @param {HTMLElement} node - The node to find its index in parent\r\n * @returns {number} Index of the node\r\n */\r\n static indexInParent(node) {\r\n const children = node.parentNode.childNodes;\r\n let num = 0;\r\n for (let i = 0; i < children.length; i++) {\r\n if (children[i] == node) return num;\r\n if (children[i].nodeType == 1) num++;\r\n }\r\n return -1;\r\n }\r\n\r\n /** Shorthand for {@link module:DOMTools.indexInParent} */\r\n static index(node) {return this.indexInParent(node);}\r\n\r\n /**\r\n * Gets the parent of the element if it matches the selector,\r\n * otherwise returns null.\r\n * @param {Element} element - Element to get parent of\r\n * @param {string} [selector=\"\"] - Selector to match parent\r\n * @returns {(Element|null)} - The sibling element or null\r\n */\r\n static parent(element, selector = \"\") {\r\n return !selector || element.parentElement.matches(selector) ? element.parentElement : null;\r\n }\r\n\r\n /**\r\n * Gets all children of Element that match the selector if provided.\r\n * @param {Element} element - Element to get all children of\r\n * @param {string} selector - Selector to match the children to\r\n * @returns {Array} - The list of children\r\n */\r\n static findChild(element, selector) {\r\n return element.querySelector(\":scope > \" + selector);\r\n }\r\n\r\n /**\r\n * Gets all children of Element that match the selector if provided.\r\n * @param {Element} element - Element to get all children of\r\n * @param {string} selector - Selector to match the children to\r\n * @returns {Array} - The list of children\r\n */\r\n static findChildren(element, selector) {\r\n return element.querySelectorAll(\":scope > \" + selector);\r\n }\r\n\r\n /**\r\n * Gets all ancestors of Element that match the selector if provided.\r\n * @param {Element} element - Element to get all parents of\r\n * @param {string} [selector=\"\"] - Selector to match the parents to\r\n * @returns {Array} - The list of parents\r\n */\r\n static parents(element, selector = \"\") {\r\n const parents = [];\r\n if (selector) while (element.parentElement && element.parentElement.closest(selector)) parents.push(element = element.parentElement.closest(selector));\r\n else while (element.parentElement) parents.push(element = element.parentElement);\r\n return parents;\r\n }\r\n\r\n /**\r\n * Gets the ancestors until an element matches the selector.\r\n * @param {Element} element - Element to get the ancestors of\r\n * @param {string} selector - Selector to stop at\r\n * @returns {Array} - The list of parents\r\n */\r\n static parentsUntil(element, selector) {\r\n const parents = [];\r\n while (element.parentElement && !element.parentElement.matches(selector)) parents.push(element = element.parentElement);\r\n return parents;\r\n }\r\n\r\n /**\r\n * Gets all siblings of the element that match the selector.\r\n * @param {Element} element - Element to get all siblings of\r\n * @param {string} [selector=\"*\"] - Selector to match the siblings to\r\n * @returns {Array} - The list of siblings\r\n */\r\n static siblings(element, selector = \"*\") {\r\n return Array.from(element.parentElement.children).filter(e => e != element && e.matches(selector));\r\n }\r\n\r\n /**\r\n * Sets or gets css styles for a specific element. If `value` is provided\r\n * then it sets the style and returns the element to allow for chaining,\r\n * otherwise returns the style. \r\n * @param {Element} element - Element to set the CSS of\r\n * @param {string} attribute - Attribute to get or set\r\n * @param {string} [value] - Value to set for attribute\r\n * @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.\r\n */\r\n static css(element, attribute, value) {\r\n if (typeof(value) == \"undefined\") return global.getComputedStyle(element)[attribute];\r\n element.style[attribute] = value;\r\n return element;\r\n }\r\n\r\n /**\r\n * Sets or gets the width for a specific element. If `value` is provided\r\n * then it sets the width and returns the element to allow for chaining,\r\n * otherwise returns the width. \r\n * @param {Element} element - Element to set the CSS of\r\n * @param {string} [value] - Width to set\r\n * @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.\r\n */\r\n static width(element, value) {\r\n if (typeof(value) == \"undefined\") return parseInt(getComputedStyle(element).width);\r\n element.style.width = value;\r\n return element;\r\n }\r\n\r\n /**\r\n * Sets or gets the height for a specific element. If `value` is provided\r\n * then it sets the height and returns the element to allow for chaining,\r\n * otherwise returns the height. \r\n * @param {Element} element - Element to set the CSS of\r\n * @param {string} [value] - Height to set\r\n * @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.\r\n */\r\n static height(element, value) {\r\n if (typeof(value) == \"undefined\") return parseInt(getComputedStyle(element).height);\r\n element.style.height = value;\r\n return element;\r\n }\r\n\r\n /**\r\n * Sets the inner text of an element if given a value, otherwise returns it.\r\n * @param {Element} element - Element to set the text of\r\n * @param {string} [text] - Content to set\r\n * @returns {string} - Either the string set by this call or the current text content of the node.\r\n */\r\n static text(element, text) {\r\n if (typeof(text) == \"undefined\") return element.textContent;\r\n return element.textContent = text;\r\n }\r\n\r\n /**\r\n * Returns the innerWidth of the element.\r\n * @param {Element} element - Element to retrieve inner width of\r\n * @return {number} - The inner width of the element.\r\n */\r\n static innerWidth(element) {\r\n return element.clientWidth;\r\n }\r\n\r\n /**\r\n * Returns the innerHeight of the element.\r\n * @param {Element} element - Element to retrieve inner height of\r\n * @return {number} - The inner height of the element.\r\n */\r\n static innerHeight(element) {\r\n return element.clientHeight;\r\n }\r\n\r\n /**\r\n * Returns the outerWidth of the element.\r\n * @param {Element} element - Element to retrieve outer width of\r\n * @return {number} - The outer width of the element.\r\n */\r\n static outerWidth(element) {\r\n return element.offsetWidth;\r\n }\r\n\r\n /**\r\n * Returns the outerHeight of the element.\r\n * @param {Element} element - Element to retrieve outer height of\r\n * @return {number} - The outer height of the element.\r\n */\r\n static outerHeight(element) {\r\n return element.offsetHeight;\r\n }\r\n\r\n /**\r\n * Gets the offset of the element in the page.\r\n * @param {Element} element - Element to get offset of\r\n * @return {Offset} - The offset of the element\r\n */\r\n static offset(element) {\r\n return element.getBoundingClientRect();\r\n }\r\n\r\n static get listeners() { return this._listeners || (this._listeners = {}); }\r\n\r\n /**\r\n * This is similar to jQuery's `on` function and can *hopefully* be used in the same way.\r\n * \r\n * Rather than attempt to explain, I'll show some example usages.\r\n * \r\n * The following will add a click listener (in the `myPlugin` namespace) to `element`.\r\n * `DOMTools.on(element, \"click.myPlugin\", () => {console.log(\"clicked!\");});`\r\n * \r\n * The following will add a click listener (in the `myPlugin` namespace) to `element` that only fires when the target is a `.block` element.\r\n * `DOMTools.on(element, \"click.myPlugin\", \".block\", () => {console.log(\"clicked!\");});`\r\n * \r\n * The following will add a click listener (without namespace) to `element`.\r\n * `DOMTools.on(element, \"click\", () => {console.log(\"clicked!\");});`\r\n * \r\n * The following will add a click listener (without namespace) to `element` that only fires once.\r\n * `const cancel = DOMTools.on(element, \"click\", () => {console.log(\"fired!\"); cancel();});`\r\n * \r\n * @param {Element} element - Element to add listener to\r\n * @param {string} event - Event to listen to with option namespace (e.g. \"event.namespace\")\r\n * @param {(string|callable)} delegate - Selector to run on element to listen to\r\n * @param {callable} [callback] - Function to fire on event\r\n * @returns {module:DOMTools~CancelListener} - A function that will undo the listener\r\n */\r\n static on(element, event, delegate, callback) {\r\n const [type, namespace] = event.split(\".\");\r\n const hasDelegate = delegate && callback;\r\n if (!callback) callback = delegate;\r\n const eventFunc = !hasDelegate ? callback : function(event) {\r\n if (event.target.matches(delegate)) {\r\n callback(event);\r\n }\r\n };\r\n\r\n element.addEventListener(type, eventFunc);\r\n const cancel = () => {\r\n element.removeEventListener(type, eventFunc);\r\n };\r\n if (namespace) {\r\n if (!this.listeners[namespace]) this.listeners[namespace] = [];\r\n const newCancel = () => {\r\n cancel();\r\n this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1);\r\n };\r\n this.listeners[namespace].push({\r\n event: type,\r\n element: element,\r\n cancel: newCancel\r\n });\r\n return newCancel;\r\n }\r\n return cancel;\r\n }\r\n\r\n /**\r\n * Functionality for this method matches {@link module:DOMTools.on} but automatically cancels itself\r\n * and removes the listener upon the first firing of the desired event.\r\n * \r\n * @param {Element} element - Element to add listener to\r\n * @param {string} event - Event to listen to with option namespace (e.g. \"event.namespace\")\r\n * @param {(string|callable)} delegate - Selector to run on element to listen to\r\n * @param {callable} [callback] - Function to fire on event\r\n * @returns {module:DOMTools~CancelListener} - A function that will undo the listener\r\n */\r\n static once(element, event, delegate, callback) {\r\n const [type, namespace] = event.split(\".\");\r\n const hasDelegate = delegate && callback;\r\n if (!callback) callback = delegate;\r\n const eventFunc = !hasDelegate ? function(event) {\r\n callback(event);\r\n element.removeEventListener(type, eventFunc);\r\n } : function(event) {\r\n if (!event.target.matches(delegate)) return;\r\n callback(event);\r\n element.removeEventListener(type, eventFunc);\r\n };\r\n\r\n element.addEventListener(type, eventFunc);\r\n const cancel = () => {\r\n element.removeEventListener(type, eventFunc);\r\n };\r\n if (namespace) {\r\n if (!this.listeners[namespace]) this.listeners[namespace] = [];\r\n const newCancel = () => {\r\n cancel();\r\n this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1);\r\n };\r\n this.listeners[namespace].push({\r\n event: type,\r\n element: element,\r\n cancel: newCancel\r\n });\r\n return newCancel;\r\n }\r\n return cancel;\r\n }\r\n\r\n static __offAll(event, element) {\r\n const [type, namespace] = event.split(\".\");\r\n let matchFilter = listener => listener.event == type, defaultFilter = _ => _;\r\n if (element) matchFilter = l => l.event == type && l.element == element, defaultFilter = l => l.element == element;\r\n const listeners = this.listeners[namespace] || [];\r\n const list = type ? listeners.filter(matchFilter) : listeners.filter(defaultFilter);\r\n for (let c = 0; c < list.length; c++) list[c].cancel();\r\n }\r\n \r\n /**\r\n * This is similar to jQuery's `off` function and can *hopefully* be used in the same way.\r\n * \r\n * Rather than attempt to explain, I'll show some example usages.\r\n * \r\n * The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element`.\r\n * `DOMTools.off(element, \"click.myPlugin\", onClick);`\r\n * \r\n * The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element` that only fired when the target is a `.block` element.\r\n * `DOMTools.off(element, \"click.myPlugin\", \".block\", onClick);`\r\n * \r\n * The following will remove a click listener (without namespace) from `element`.\r\n * `DOMTools.off(element, \"click\", onClick);`\r\n * \r\n * The following will remove all listeners in namespace `myPlugin` from `element`.\r\n * `DOMTools.off(element, \".myPlugin\");`\r\n * \r\n * The following will remove all click listeners in namespace `myPlugin` from *all elements*.\r\n * `DOMTools.off(\"click.myPlugin\");`\r\n * \r\n * The following will remove all listeners in namespace `myPlugin` from *all elements*.\r\n * `DOMTools.off(\".myPlugin\");`\r\n * \r\n * @param {(Element|string)} element - Element to remove listener from\r\n * @param {string} [event] - Event to listen to with option namespace (e.g. \"event.namespace\")\r\n * @param {(string|callable)} [delegate] - Selector to run on element to listen to\r\n * @param {callable} [callback] - Function to fire on event\r\n * @returns {Element} - The original element to allow for chaining\r\n */\r\n static off(element, event, delegate, callback) {\r\n if (typeof(element) == \"string\") return this.__offAll(element);\r\n const [type, namespace] = event.split(\".\");\r\n if (namespace) return this.__offAll(event, element);\r\n\r\n const hasDelegate = delegate && callback;\r\n if (!callback) callback = delegate;\r\n const eventFunc = !hasDelegate ? callback : function(event) {\r\n if (event.target.matches(delegate)) {\r\n callback(event);\r\n }\r\n };\r\n\r\n element.removeEventListener(type, eventFunc);\r\n return element;\r\n }\r\n\r\n /**\r\n * Adds a listener for when the node is added/removed from the document body.\r\n * The listener is automatically removed upon firing.\r\n * @param {HTMLElement} node - node to wait for\r\n * @param {callable} callback - function to be performed on event\r\n * @param {boolean} onMount - determines if it should fire on Mount or on Unmount\r\n */\r\n static onMountChange(node, callback, onMount = true) {\r\n const wrappedCallback = () => {\r\n this.observer.unsubscribe(wrappedCallback);\r\n callback();\r\n };\r\n this.observer.subscribe(wrappedCallback, mutation => {\r\n const nodes = Array.from(onMount ? mutation.addedNodes : mutation.removedNodes);\r\n const directMatch = nodes.indexOf(node) > -1;\r\n const parentMatch = nodes.some(parent => parent.contains(node));\r\n return directMatch || parentMatch;\r\n });\r\n return node;\r\n }\r\n\r\n /** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `true` */\r\n static onMount(node, callback) { return this.onMountChange(node, callback); }\r\n\r\n /** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `false` */\r\n static onUnmount(node, callback) { return this.onMountChange(node, callback, false); }\r\n\r\n /** Alias for {@link module:DOMTools.onMount} */\r\n static onAdded(node, callback) { return this.onMount(node, callback); }\r\n\r\n /** Alias for {@link module:DOMTools.onUnmount} */\r\n static onRemoved(node, callback) { return this.onUnmount(node, callback, false); }\r\n\r\n /**\r\n * Helper function which combines multiple elements into one parent element\r\n * @param {Array} elements - array of elements to put into a single parent\r\n */\r\n static wrap(elements) {\r\n const domWrapper = this.parseHTML(`
`);\r\n for (let e = 0; e < elements.length; e++) domWrapper.appendChild(elements[e]);\r\n return domWrapper;\r\n }\r\n\r\n /**\r\n * Resolves the node to an HTMLElement. This is mainly used by library modules.\r\n * @param {(jQuery|Element)} node - node to resolve\r\n */\r\n static resolveElement(node) {\r\n if (!(node instanceof jQuery) && !(node instanceof Element)) return undefined;\r\n return node instanceof jQuery ? node[0] : node;\r\n }\r\n}\r\n\r\nwindow.Lightcord.BetterDiscord.DOM = DOMTools","import {bdthemeErrors, themeCookie, settingsCookie, bdthemes} from \"../0globals\";\r\nimport ContentManager from \"./contentManager\";\r\nimport DataStore from \"./dataStore\";\r\nimport BDEvents from \"./bdEvents\";\r\nimport Utils from \"./utils\";\r\nimport DOM from \"./domtools\";\r\nimport bdEvents from \"./bdEvents\";\r\n\r\nclass ThemeModule {\r\n constructor(){\r\n window.Lightcord.BetterDiscord.ThemeModule = this\r\n }\r\n get folder() {return ContentManager.themesFolder;}\r\n}\r\n\r\nThemeModule.prototype.loadThemes = async function () {\r\n this.loadThemeData();\r\n bdthemeErrors.splice(0, 0, ...(await ContentManager.loadThemes()));\r\n const themes = Object.keys(bdthemes);\r\n\r\n for (let i = 0; i < themes.length; i++) {\r\n const theme = bdthemes[themes[i]];\r\n if (!themeCookie[theme.name]) themeCookie[theme.name] = false;\r\n if (themeCookie[theme.name]) DOM.addStyle(DOM.escapeID(theme.id), unescape(theme.css));\r\n\r\n await new Promise((resolve) => setTimeout(resolve, 10))\r\n }\r\n for (const theme in themeCookie) {\r\n if (!bdthemes[theme]) delete themeCookie[theme];\r\n }\r\n this.saveThemeData();\r\n // if (settingsCookie[\"fork-ps-5\"]) ContentManager.watchContent(\"theme\");\r\n};\r\n\r\nThemeModule.prototype.enableTheme = function(name, reload = false) {\r\n themeCookie[name] = true;\r\n this.saveThemeData();\r\n const theme = bdthemes[name];\r\n DOM.addStyle(DOM.escapeID(theme.id), unescape(theme.css));\r\n bdEvents.dispatch(\"theme-enabled\")\r\n if (settingsCookie[\"fork-ps-2\"] && !reload) Utils.showToast(`${theme.name} v${theme.version} has been applied.`);\r\n};\r\n\r\nThemeModule.prototype.enable = function (name, reload = false) {\r\n return this.enableTheme(name, reload);\r\n};\r\n\r\nThemeModule.prototype.disableTheme = function(name, reload = false) {\r\n themeCookie[name] = false;\r\n this.saveThemeData();\r\n const theme = bdthemes[name];\r\n DOM.removeStyle(DOM.escapeID(theme.id));\r\n bdEvents.dispatch(\"theme-disabled\")\r\n if (settingsCookie[\"fork-ps-2\"] && !reload) Utils.showToast(`${theme.name} v${theme.version} has been disabled.`);\r\n};\r\n\r\nThemeModule.prototype.disable = function (name, reload = false) {\r\n return this.disableTheme(name, reload);\r\n};\r\n\r\nThemeModule.prototype.toggleTheme = function(theme) {\r\n if (themeCookie[theme]) this.disableTheme(theme);\r\n else this.enableTheme(theme);\r\n};\r\n\r\nThemeModule.prototype.toggle = function (name) {\r\n return this.toggleTheme(name);\r\n};\r\n\r\nThemeModule.prototype.loadTheme = async function(filename) {\r\n const error = await ContentManager.loadContent(filename, \"theme\");\r\n if (error) {\r\n if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({themes: [error]});\r\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${filename} could not be loaded. It may not have been loaded.`, {type: \"error\"});\r\n return Utils.err(\"ContentManager\", `${filename} could not be loaded.`, error);\r\n }\r\n const theme = Object.values(bdthemes).find(p => p.filename == filename);\r\n Utils.log(\"ContentManager\", `${theme.name} v${theme.version} was loaded.`);\r\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${theme.name} v${theme.version} was loaded.`, {type: \"success\"});\r\n BDEvents.dispatch(\"theme-loaded\", theme.name);\r\n};\r\n\r\nThemeModule.prototype.unloadTheme = function(filenameOrName) {\r\n const bdtheme = Object.values(bdthemes).find(p => p.filename == filenameOrName) || bdthemes[filenameOrName];\r\n if (!bdtheme) return;\r\n const theme = bdtheme.name;\r\n if (themeCookie[theme]) this.disableTheme(theme, true);\r\n const error = ContentManager.unloadContent(bdthemes[theme].filename, \"theme\");\r\n delete bdthemes[theme];\r\n if (error) {\r\n if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({themes: [error]});\r\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${theme} could not be unloaded. It may have not been loaded yet.`, {type: \"error\"});\r\n return Utils.err(\"ContentManager\", `${theme} could not be unloaded. It may have not been loaded yet.`, error);\r\n }\r\n Utils.log(\"ContentManager\", `${theme} was unloaded.`);\r\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${theme} was unloaded.`, {type: \"success\"});\r\n BDEvents.dispatch(\"theme-unloaded\", theme);\r\n};\r\n\r\nThemeModule.prototype.delete = function(filenameOrName) {\r\n const bdtheme = Object.values(bdthemes).find(p => p.filename == filenameOrName) || bdthemes[filenameOrName];\r\n if (!bdtheme) return;\r\n this.unloadTheme(bdtheme.filename);\r\n const fullPath = require(\"path\").resolve(ContentManager.themesFolder, bdtheme.filename);\r\n require(\"fs\").unlinkSync(fullPath);\r\n};\r\n\r\nThemeModule.prototype.reloadTheme = async function(filenameOrName) {\r\n const bdtheme = Object.values(bdthemes).find(p => p.filename == filenameOrName) || bdthemes[filenameOrName];\r\n if (!bdtheme) return this.loadTheme(filenameOrName);\r\n const theme = bdtheme.name;\r\n const error = await ContentManager.reloadContent(bdthemes[theme].filename, \"theme\");\r\n if (themeCookie[theme]) this.disableTheme(theme, true), this.enableTheme(theme, true);\r\n if (error) {\r\n if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({themes: [error]});\r\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${theme} could not be reloaded.`, {type: \"error\"});\r\n return Utils.err(\"ContentManager\", `${theme} could not be reloaded.`, error);\r\n }\r\n Utils.log(\"ContentManager\", `${theme} v${bdthemes[theme].version} was reloaded.`);\r\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${theme} v${bdthemes[theme].version} was reloaded.`, {type: \"success\"});\r\n BDEvents.dispatch(\"theme-reloaded\", theme);\r\n};\r\n\r\nThemeModule.prototype.reload = function(name) {\r\n return this.reloadTheme(name);\r\n};\r\n\r\nThemeModule.prototype.edit = function(filenameOrName) {\r\n const bdplugin = Object.values(bdthemes).find(p => p.filename == filenameOrName) || bdthemes[filenameOrName];\r\n if (!bdplugin) return;\r\n const fullPath = require(\"path\").resolve(ContentManager.themesFolder, bdplugin.filename);\r\n require(\"electron\").shell.openItem(`${fullPath}`);\r\n};\r\n\r\nThemeModule.prototype.updateThemeList = function() {\r\n const results = ContentManager.loadNewContent(\"theme\");\r\n for (const filename of results.added) this.loadTheme(filename);\r\n for (const name of results.removed) this.unloadTheme(name);\r\n};\r\n\r\nThemeModule.prototype.loadThemeData = function() {\r\n const saved = DataStore.getSettingGroup(\"themes\");\r\n if (saved) {\r\n Object.assign(themeCookie, saved);\r\n }\r\n};\r\n\r\nThemeModule.prototype.saveThemeData = function () {\r\n DataStore.setSettingGroup(\"themes\", themeCookie);\r\n};\r\n\r\nexport default new ThemeModule();","import {settings} from \"../0globals\";\r\nimport themeModule from \"./themeModule\";\r\n\r\nexport default new class V2 {\r\n\r\n constructor() {\r\n this.editorDetached = false;\r\n this.WebpackModules = (() => {\r\n const req = webpackJsonp.push([[], {__extra_id__: (module, exports, req) => module.exports = req}, [[\"__extra_id__\"]]]);\r\n delete req.m.__extra_id__;\r\n delete req.c.__extra_id__;\r\n\r\n const shouldProtect = theModule => {\r\n if (theModule.remove && theModule.set && theModule.clear && theModule.get && !theModule.sort) return true;\r\n if (theModule.getToken || theModule.getEmail || theModule.showToken) return true;\r\n return false;\r\n };\r\n\r\n const protect = (theModule, isDefault) => {\r\n let mod = !isDefault ? theModule.default : theModule\r\n if(!mod)return theModule\r\n if (mod.remove && mod.set && mod.clear && mod.get && !mod.sort) return null;\r\n if (!mod.getToken && !mod.getEmail && !mod.showToken)return theModule\r\n\r\n const proxy = new Proxy(mod, {\r\n getOwnPropertyDescriptor: function(obj, prop) {\r\n if (prop === \"getToken\" || prop === \"getEmail\" || prop === \"showToken\") return undefined;\r\n return Object.getOwnPropertyDescriptor(obj, prop);\r\n },\r\n get: function(obj, func) {\r\n if (func == \"getToken\" && obj.getToken) return () => \"mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa\";\r\n if (func == \"getEmail\" && obj.getEmail) return () => \"puppet11112@gmail.com\";\r\n if (func == \"showToken\" && obj.showToken) return () => true;\r\n if (func == \"__proto__\" && obj.__proto__) return proxy;\r\n \r\n return obj[func];\r\n }\r\n });\r\n\r\n if(!isDefault){\r\n return Object.assign({}, theModule, {default: proxy})\r\n }\r\n\r\n return proxy;\r\n };\r\n\r\n const find = (filter) => {\r\n for (const i in req.c) {\r\n if (req.c.hasOwnProperty(i)) {\r\n const m = req.c[i].exports;\r\n if (m && m.__esModule && m.default && filter(m.default)) return protect(m.default, true);\r\n if (m && filter(m))\treturn protect(m, false);\r\n }\r\n }\r\n // console.warn(\"Cannot find loaded module in cache\");\r\n return null;\r\n };\r\n\r\n const findAll = (filter) => {\r\n const modules = [];\r\n for (const i in req.c) {\r\n if (req.c.hasOwnProperty(i)) {\r\n const m = req.c[i].exports;\r\n if (m && m.__esModule && m.default && filter(m.default)) modules.push(protect(m.default, true));\r\n else if (m && filter(m)) modules.push(protect(m, false));\r\n }\r\n }\r\n return modules;\r\n };\r\n\r\n const findByUniqueProperties = (propNames) => find(module => propNames.every(prop => module[prop] !== undefined));\r\n const findByPrototypes = (protoNames) => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined));\r\n const findByDisplayName = (displayName) => find(module => module.displayName === displayName);\r\n\r\n return {find, findAll, findByUniqueProperties, findByPrototypes, findByDisplayName};\r\n })();\r\n\r\n this.internal = {\r\n react: this.WebpackModules.findByUniqueProperties([\"Component\", \"PureComponent\", \"Children\", \"createElement\", \"cloneElement\"]),\r\n reactDom: this.WebpackModules.findByUniqueProperties([\"findDOMNode\"])\r\n };\r\n this.getInternalInstance = e => e[Object.keys(e).find(k => k.startsWith(\"__reactInternalInstance\"))];\r\n window.Lightcord.BetterDiscord.V2 = this\r\n }\r\n\r\n initialize() {\r\n\r\n }\r\n\r\n joinBD1() {this.InviteActions.acceptInviteAndTransitionToInviteChannel(\"0Tmfo5ZbORCRqbAd\");}\r\n leaveBD1() {this.GuildActions.leaveGuild(\"86004744966914048\");}\r\n\r\n joinBD2() {this.InviteActions.acceptInviteAndTransitionToInviteChannel(\"2HScm8j\");}\r\n leaveBD2() {this.GuildActions.leaveGuild(\"280806472928198656\");}\r\n\r\n joinLC() {this.InviteActions.acceptInviteAndTransitionToInviteChannel(\"7eFff2A\");}\r\n leaveLC() {this.GuildActions.leaveGuild(\"705908350218666117\");}\r\n\r\n /**\r\n * @type {typeof React}\r\n */\r\n get react() {return this.internal.react;}\r\n /**\r\n * @type {typeof React}\r\n */\r\n get React() {return this.internal.react;}\r\n /**\r\n * @type {typeof import(\"react-dom\")}\r\n */\r\n get reactDom() {return this.internal.reactDom;}\r\n /**\r\n * @type {typeof import(\"react-dom\")}\r\n */\r\n get ReactDom() {return this.internal.reactDom;}\r\n /**\r\n * @type {typeof React.Component}\r\n */\r\n get reactComponent() {return this.internal.react.Component;}\r\n /**\r\n * @type {typeof React.Component}\r\n */\r\n get ReactComponent() {return this.internal.react.Component;}\r\n\r\n get anchorClasses() {return this.WebpackModules.findByUniqueProperties([\"anchorUnderlineOnHover\"]) || {anchor: \"anchor-3Z-8Bb\", anchorUnderlineOnHover: \"anchorUnderlineOnHover-2ESHQB\"};}\r\n get slateEditorClasses() {return this.WebpackModules.findByUniqueProperties([\"slateTextArea\"]);}\r\n get messageClasses() {return this.WebpackModules.findByUniqueProperties([\"message\", \"containerCozy\"]);}\r\n get guildClasses() {\r\n\t\tconst guildsWrapper = BDModules.get(e => e.wrapper && e.unreadMentionsBar)[0];\r\n const guilds = BDModules.get(e => e.guildsError && e.selected)[0]\r\n const pill = BDModules.get(e => e.blobContainer)[0]\r\n return Object.assign({}, guildsWrapper, guilds, pill);\r\n\t}\r\n\r\n get MessageContentComponent() {return this.WebpackModules.find(m => m.defaultProps && m.defaultProps.hasOwnProperty(\"disableButtons\"));}\r\n get MessageComponent() {return this.WebpackModules.find(m => m.default && m.default.displayName && m.default.displayName == \"Message\");}\r\n get TimeFormatter() {return this.WebpackModules.findByUniqueProperties([\"dateFormat\"]);}\r\n get TooltipWrapper() {return this.WebpackModules.findByDisplayName(\"Tooltip\");}\r\n get NativeModule() {return this.WebpackModules.findByUniqueProperties([\"setBadge\"]);}\r\n get InviteActions() {return this.WebpackModules.findByUniqueProperties([\"acceptInvite\"]);}\r\n get GuildActions() {return this.WebpackModules.findByUniqueProperties([\"leaveGuild\"]);}\r\n get Tooltips() {return this.WebpackModules.find(m => m.hide && m.show && !m.search && !m.submit && !m.search && !m.activateRagingDemon && !m.dismiss);}\r\n get KeyGenerator() {return this.WebpackModules.find(m => m.toString && /\"binary\"/.test(m.toString()));}\r\n get LayerStack() {return this.WebpackModules.findByUniqueProperties([\"popLayer\"]);}\r\n get UserStore() {return this.WebpackModules.findByUniqueProperties([\"getCurrentUser\"]);}\r\n get ChannelStore() {return this.WebpackModules.findByUniqueProperties([\"getChannel\"]);}\r\n get ChannelActions() {return this.WebpackModules.findByUniqueProperties([\"openPrivateChannel\"]);}\r\n get PrivateChannelActions() {return this.WebpackModules.findByUniqueProperties([\"selectPrivateChannel\"]);}\r\n\r\n openDM(userId) {\r\n const selfId = this.UserStore.getCurrentUser().id;\r\n if (selfId == userId) return;\r\n const privateChannelId = this.ChannelStore.getDMFromUserId(userId);\r\n if (privateChannelId) return this.PrivateChannelActions.selectPrivateChannel(privateChannelId);\r\n this.ChannelActions.openPrivateChannel(selfId, userId);\r\n }\r\n\r\n parseSettings(cat) {\r\n return Object.keys(settings).reduce((arr, key) => {\r\n const setting = settings[key];\r\n if (setting.cat === cat && setting.implemented && !setting.hidden) {\r\n setting.text = key;\r\n arr.push(setting);\r\n } return arr;\r\n }, []);\r\n }\r\n\r\n};","import {bbdVersion} from \"../0globals\";\nimport WebpackModules from \"./webpackModules\";\nimport BDV2 from \"./v2\";\nimport DOM from \"./domtools\";\nexport default class Utils {\n /** Document/window width */\n static get screenWidth() { return Math.max(document.documentElement.clientWidth, window.innerWidth || 0); }\n /** Document/window height */\n static get screenHeight() { return Math.max(document.documentElement.clientHeight, window.innerHeight || 0); }\n\n static get WindowConfigFile() {\n return this._windowConfigFile = null;\n }\n\n static getAllWindowPreferences() {\n return {\n transparent: true,\n frame: false\n };\n }\n \n static getWindowPreference(key) {\n if (key === \"transparent\") return true;\n if (key === \"frame\") return false;\n return null;\n }\n \n static setWindowPreference(key, value) {\n if (key === \"transparent\") return true;\n if (key === \"frame\") return false;\n return null;\n }\n\n static stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n }\n\n static getTextArea() {\n return DOM.query(\".\"+removeDa(BDModules.get(e => e.channelTextArea && e.titleWrapper)[0].channelTextArea)+\" textarea\");\n }\n\n static insertText(textarea, text) {\n textarea.focus();\n textarea.selectionStart = 0;\n textarea.selectionEnd = textarea.value.length;\n document.execCommand(\"insertText\", false, text);\n }\n\n static escapeID(id) {\n return id.replace(/^[^a-z]+|[^\\w-]+/gi, \"-\");\n }\n\n static log(moduleName, message) {\n console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, \"color: #3a71c1; font-weight: 700;\", \"color: #3a71c1;\", \"\");\n }\n\n static warn(moduleName, message) {\n console.warn(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, \"color: #E8A400; font-weight: 700;\", \"color: #E8A400;\", \"\");\n }\n\n static err(moduleName, message, error) {\n console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, \"color: red; font-weight: 700;\", \"color: red;\", \"\");\n if (error) {\n console.groupCollapsed(\"%cError: \" + error.message, \"color: red;\");\n console.error(error.stack);\n console.groupEnd();\n }\n }\n\n /**\n * Format strings with placeholders (`{{placeholder}}`) into full strings.\n * Quick example: `PluginUtilities.formatString(\"Hello, {{user}}\", {user: \"Zerebos\"})`\n * would return \"Hello, Zerebos\".\n * @param {string} string - string to format\n * @param {object} values - object literal of placeholders to replacements\n * @returns {string} the properly formatted string\n */\n static formatString(string, values) {\n for (const val in values) {\n let replacement = values[val];\n if (Array.isArray(replacement)) replacement = JSON.stringify(replacement);\n if (typeof(replacement) === \"object\" && replacement !== null) replacement = replacement.toString();\n string = string.replace(new RegExp(`{{${val}}}`, \"g\"), replacement);\n }\n return string;\n }\n\n static escape(s) {\n return s.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n }\n\n static testJSON(data) {\n try {\n return JSON.parse(data);\n }\n catch (err) {\n return false;\n }\n }\n\n static isEmpty(obj) {\n if (obj == null || obj == undefined || obj == \"\") return true;\n if (typeof(obj) !== \"object\") return false;\n if (Array.isArray(obj)) return obj.length == 0;\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) return false;\n }\n return true;\n }\n\n static suppressErrors(method, message) {\n return (...params) => {\n try { return method(...params);\t}\n catch (e) { this.err(\"SuppressedError\", \"Error occurred in \" + message, e); }\n };\n }\n\n static monkeyPatch(what, methodName, options) {\n const {before, after, instead, once = false, silent = false, force = false} = options;\n const displayName = options.displayName || what.displayName || what[methodName].displayName || what.name || what.constructor.displayName || what.constructor.name;\n if (!silent) console.log(\"patch\", methodName, \"of\", displayName); // eslint-disable-line no-console\n if (!what[methodName]) {\n if (force) what[methodName] = function() {};\n else return console.error(methodName, \"does not exist for\", displayName); // eslint-disable-line no-console\n }\n const origMethod = what[methodName];\n let canceled = false\n const cancel = () => {\n if (!silent) console.log(\"unpatch\", methodName, \"of\", displayName); // eslint-disable-line no-console\n //what[methodName] = origMethod;\n canceled = true // this allow to monkeypatch more than one time.\n };\n what[methodName] = function() {\n if(canceled){\n return origMethod.call(this, ...arguments)\n }\n const data = {\n thisObject: this,\n methodArguments: arguments,\n cancelPatch: cancel,\n originalMethod: origMethod,\n callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments)\n };\n if (instead) {\n const tempRet = Utils.suppressErrors(instead, \"`instead` callback of \" + what[methodName].displayName)(data);\n if (tempRet !== undefined) data.returnValue = tempRet;\n }\n else {\n if (before) Utils.suppressErrors(before, \"`before` callback of \" + what[methodName].displayName)(data);\n data.callOriginalMethod();\n if (after) Utils.suppressErrors(after, \"`after` callback of \" + what[methodName].displayName)(data);\n }\n if (once) cancel();\n return data.returnValue;\n };\n Object.assign(what[methodName], origMethod);\n what[methodName].__monkeyPatched = true;\n what[methodName].displayName = displayName;\n if (!what[methodName].__originalMethod) {\n what[methodName].__originalMethod = origMethod;\n what[methodName].toString = function() {return origMethod.toString();};\n }\n return cancel;\n }\n\n static onRemoved(node, callback) {\n const observer = new MutationObserver((mutations) => {\n for (let m = 0; m < mutations.length; m++) {\n const mutation = mutations[m];\n const nodes = Array.from(mutation.removedNodes);\n const directMatch = nodes.indexOf(node) > -1;\n const parentMatch = nodes.some(parent => parent.contains(node));\n if (directMatch || parentMatch) {\n observer.disconnect();\n callback();\n }\n }\n });\n\n observer.observe(document.body, {subtree: true, childList: true});\n }\n\n static getNestedProp(obj, path) {\n return path.split(/\\s?\\.\\s?/).reduce(function(obj, prop) {\n return obj && obj[prop];\n }, obj);\n }\n\n /**\n * This shows a toast similar to android towards the bottom of the screen.\n *\n * @param {string} content The string to show in the toast.\n * @param {object} options Options object. Optional parameter.\n * @param {string} options.type Changes the type of the toast stylistically and semantically. Choices: \"\", \"info\", \"success\", \"danger\"/\"error\", \"warning\"/\"warn\". Default: \"\"\n * @param {boolean} options.icon Determines whether the icon should show corresponding to the type. A toast without type will always have no icon. Default: true\n * @param {number} options.timeout Adjusts the time (in ms) the toast should be shown for before disappearing automatically. Default: 3000\n */\n static showToast(content, options = {}) {\n if (!document.querySelector(\".bd-toasts\")) {\n const container = document.querySelector(\".\"+removeDa(BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar)+\" + div\") || null;\n const form = container ? container.querySelector(\"form\") : null;\n const bottom = form ? form.offsetHeight : 80;\n const toastWrapper = document.createElement(\"div\");\n toastWrapper.classList.add(\"bd-toasts\");\n toastWrapper.style.setProperty(\"bottom\", bottom+\"px\");\n document.querySelector(\"#app-mount\").appendChild(toastWrapper);\n }\n const toastWrapper = document.querySelector(\".bd-toasts\")\n const {type = \"\", icon = true, timeout = 3000} = options;\n const toastElem = document.createElement(\"div\");\n toastElem.classList.add(\"bd-toast\");\n if (type) toastElem.classList.add(\"toast-\" + type);\n if (type && icon) toastElem.classList.add(\"icon\");\n toastElem.innerText = content;\n toastWrapper.appendChild(toastElem);\n toastWrapper.style.setProperty(\"left\", `calc(50% - ${toastWrapper.offsetWidth / 2}px)`);\n setTimeout(() => {\n toastElem.classList.add(\"closing\");\n setTimeout(() => {\n toastElem.remove();\n if (!document.querySelectorAll(\".bd-toasts .bd-toast\").length) document.querySelector(\".bd-toasts\").remove();\n }, 300);\n }, timeout);\n }\n\n static alert(title, content) {\n let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0]\n let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0]\n let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0]\n const modal = DOM.createElement(`
\n
e.backdrop && e.backdropWithLayer)[0].backdrop}\">
\n
\n
\n
\n
${title}
\n
\n
\n
\n
\n ${content}\n
\n
\n
\n
\n \n
\n
\n
\n
`);\n modal.querySelector(\".footer button\").addEventListener(\"click\", () => {\n DOM.addClass(modal, \"closing\");\n setTimeout(() => { \n modal.remove(); \n closingListeners.forEach((listener) => {\n try{\n listener()\n }catch(e){\n console.error(e)\n }\n })\n }, 300);\n });\n modal.querySelector(\".bd-backdrop\").addEventListener(\"click\", () => {\n DOM.addClass(modal, \"closing\");\n setTimeout(() => { \n modal.remove(); \n closingListeners.forEach((listener) => {\n try{\n listener()\n }catch(e){\n console.error(e)\n }\n })\n }, 300);\n });\n DOM.query(\"#app-mount\").append(modal);\n const closingListeners = []\n return {\n close: () => {\n DOM.addClass(modal, \"closing\");\n setTimeout(() => { \n modal.remove(); \n closingListeners.forEach((listener) => {\n try{\n listener()\n }catch(e){\n console.error(e)\n }\n })\n }, 300);\n },\n onClose: (listener) => {\n closingListeners.push(listener)\n }\n }\n }\n\n static showContentErrors({plugins: pluginErrors = [], themes: themeErrors = []}) {\n if (!pluginErrors || !themeErrors) return;\n if (!pluginErrors.length && !themeErrors.length) return;\n let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0]\n let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0]\n let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0]\n const modal = DOM.createElement(`
\n
e.backdrop && e.backdropWithLayer)[0].backdrop}\">
\n
\n
\n
Content Errors
\n
\n
\n
\n
Plugins
\n
Themes
\n
\n
\n
\n
Name
\n
Message
\n
Error
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
`);\n \n function generateTab(errors) {\n const container = DOM.createElement(`
`);\n for (const err of errors) {\n const error = DOM.createElement(`
\n
${err.name ? err.name : err.file}
\n
${err.message}
\n \n
`);\n container.append(error);\n if (err.error) {\n error.querySelectorAll(\"a\").forEach(el => el.addEventListener(\"click\", (e) => {\n e.preventDefault();\n Utils.err(\"ContentManager\", `Error details for ${err.name ? err.name : err.file}.`, err.error);\n }));\n }\n }\n return container;\n }\n \n const tabs = [generateTab(pluginErrors), generateTab(themeErrors)];\n \n modal.querySelectorAll(\".tab-bar-item\").forEach(el => el.addEventListener(\"click\", (e) => {\n e.preventDefault();\n const selected = modal.querySelector(\".tab-bar-item.selected\");\n if (selected) DOM.removeClass(selected, \"selected\");\n DOM.addClass(e.target, \"selected\");\n const scroller = modal.querySelector(\".scroller\");\n scroller.innerHTML = \"\";\n scroller.append(tabs[DOM.index(e.target)]);\n }));\n \n modal.querySelector(\".footer button\").addEventListener(\"click\", () => {\n DOM.addClass(modal, \"closing\");\n setTimeout(() => { modal.remove(); }, 300);\n });\n modal.querySelector(\".bd-backdrop\").addEventListener(\"click\", () => {\n DOM.addClass(modal, \"closing\");\n setTimeout(() => { modal.remove(); }, 300);\n });\n DOM.query(\"#app-mount\").append(modal);\n if (pluginErrors.length) modal.querySelector(\".tab-bar-item\").click();\n else modal.querySelectorAll(\".tab-bar-item\")[1].click();\n }\n\n static showChangelogModal(options = {}) {\n const ModalStack = WebpackModules.findByProps(\"push\", \"update\", \"pop\", \"popWithKey\");\n const ChangelogClasses = WebpackModules.findByProps(\"fixed\", \"improved\");\n const TextElement = WebpackModules.findByDisplayName(\"Text\");\n const FlexChild = WebpackModules.findByProps(\"Child\");\n const Titles = WebpackModules.findByProps(\"Tags\", \"default\");\n const Changelog = WebpackModules.find(m => m.defaultProps && m.defaultProps.selectable == false);\n const MarkdownParser = WebpackModules.findByProps(\"defaultRules\", \"parse\");\n if (!Changelog || !ModalStack || !ChangelogClasses || !TextElement || !FlexChild || !Titles || !MarkdownParser) return;\n \n const {\n image = \"https://repository-images.githubusercontent.com/105473537/957b5480-7c26-11e9-8401-50fa820cbae5\", \n description = \"\", \n changes = [], \n title = \"BandagedBD\", \n subtitle = `v${bbdVersion}`, \n footer\n } = options;\n const ce = BDV2.React.createElement;\n const changelogItems = [ce(\"img\", {src: image})];\n if (description) changelogItems.push(ce(\"p\", null, MarkdownParser.parse(description)));\n for (let c = 0; c < changes.length; c++) {\n const entry = changes[c];\n const type = ChangelogClasses[entry.type] ? ChangelogClasses[entry.type] : ChangelogClasses.added;\n const margin = c == 0 ? ChangelogClasses.marginTop : \"\";\n changelogItems.push(ce(\"h1\", {className: `${type} ${margin}`,}, entry.title));\n const list = ce(\"ul\", null, entry.items.map(i => ce(\"li\", null, MarkdownParser.parse(i))));\n changelogItems.push(list);\n }\n const renderHeader = function() {\n return ce(FlexChild.Child, {grow: 1, shrink: 1},\n ce(Titles.default, {tag: Titles.Tags.H4}, title),\n ce(TextElement,{size: TextElement.Sizes.SMALL, color: TextElement.Colors.STANDARD, className: ChangelogClasses.date}, subtitle)\n );\n };\n \n const renderFooter = () => {\n const Anchor = WebpackModules.find(m => m.displayName == \"Anchor\");\n const AnchorClasses = WebpackModules.findByProps(\"anchorUnderlineOnHover\") || {anchor: \"anchor-3Z-8Bb\", anchorUnderlineOnHover: \"anchorUnderlineOnHover-2ESHQB\"};\n const joinSupportServer = (click) => {\n click.preventDefault();\n click.stopPropagation();\n ModalStack.pop();\n BDV2.joinBD2();\n };\n const supportLink = Anchor ? ce(Anchor, {onClick: joinSupportServer}, \"Join our Discord Server.\") : ce(\"a\", {className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`, onClick: joinSupportServer}, \"Join our Discord Server.\");\n const defaultFooter = ce(TextElement,{size: TextElement.Sizes.SMALL, color: TextElement.Colors.STANDARD}, \"Need support? \", supportLink);\n return ce(FlexChild.Child, {grow: 1, shrink: 1}, footer ? footer : defaultFooter);\n };\n\n return ModalStack.push(function(props) {\n return ce(Changelog, Object.assign({\n className: ChangelogClasses.container,\n selectable: true,\n onScroll: _ => _,\n onClose: _ => _,\n renderHeader: renderHeader,\n renderFooter: renderFooter,\n children: changelogItems\n }, props));\n });\n }\n\n /**\n * Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks.\n * @param {string} title - title of the modal\n * @param {(string|ReactElement|Array)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly.\n * @param {object} [options] - options to modify the modal\n * @param {boolean} [options.danger=false] - whether the main button should be red or not\n * @param {string} [options.confirmText=Okay] - text for the confirmation/submit button\n * @param {string} [options.cancelText=Cancel] - text for the cancel button\n * @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button\n * @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button\n * @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned\n * @returns {string} - the key used for this modal\n */\n static showConfirmationModal(title, content, options = {}) {\n const ModalActions = WebpackModules.findByProps(\"openModal\", \"updateModal\");\n const Markdown = WebpackModules.findByDisplayName(\"Markdown\");\n const ConfirmationModal = WebpackModules.findByDisplayName(\"ConfirmModal\");\n if (!ModalActions || !ConfirmationModal || !Markdown) return Utils.alert(title, content);\n\n const emptyFunction = () => {};\n const {onConfirm = emptyFunction, onCancel = emptyFunction, confirmText = \"Okay\", cancelText = \"Cancel\", danger = false, key = undefined} = options;\n\n if (!Array.isArray(content)) content = [content];\n content = content.map(c => typeof(c) === \"string\" ? BDV2.React.createElement(Markdown, null, c) : c);\n return ModalActions.openModal(props => {\n return BDV2.React.createElement(ConfirmationModal, Object.assign({\n header: title,\n red: danger,\n confirmText: confirmText,\n cancelText: cancelText,\n onConfirm: onConfirm,\n onCancel: onCancel\n }, props), content);\n }, {modalKey: key});\n }\n\n static get removeDa(){\n return removeDa\n }\n}\n\nfunction removeDa(className){\n if(!className)return className\n return className.split(\" \").filter(e => !e.startsWith(\"da-\")).join(\" \")\n}\n\nUtils.showToast = Utils.suppressErrors(Utils.showToast, \"Could not show toast.\");\n\nwindow.Lightcord.BetterDiscord.Utils = Utils","export default class V2_SettingsPanel_Sidebar {\r\n\r\n constructor() {\r\n this.panels = {}\r\n }\r\n\r\n register(panel, component){\r\n this.panels[panel] = component\r\n }\r\n\r\n getComponent(panel, sidebar){\r\n return this.panels[panel](sidebar)\r\n }\r\n\r\n get items() {\r\n return [{\r\n text: \"BetterDiscord Settings\", \r\n id: \"core\"\r\n }, {\r\n text: \"Plugins\", \r\n id: \"plugins\"\r\n }, {\r\n text: \"Themes\", \r\n id: \"themes\"\r\n }, {\r\n text: \"Custom CSS\", \r\n id: \"customcss\"\r\n }];\r\n }\r\n\r\n get LCitems(){\r\n let items = [\r\n {\r\n text: \"Lightcord Settings\",\r\n id: \"lightcord\"\r\n }, {\r\n text: \"RichPresence\", \r\n id: \"status\"\r\n }, {\r\n text: \"Account Info\",\r\n id: \"accountinfo\"\r\n }\r\n ]\r\n return items\r\n }\r\n\r\n get LCDevItems(){\r\n let items = []\r\n if(!window.Lightcord.Settings.devMode)return items\r\n items.push(...[\r\n {\r\n section: \"DIVIDER\"\r\n },\r\n {\r\n section: \"HEADER\",\r\n label: \"Lightcord Api\"\r\n },\r\n {\r\n text: \"Components Preview\",\r\n id: \"lcapipreview\"\r\n }\r\n ])\r\n return items\r\n }\r\n\r\n render(sidebar) {\r\n return [\r\n {\r\n section: \"HEADER\",\r\n label: \"Lightcord\"\r\n },\r\n ...this.LCitems.map(e => {\r\n return {\r\n section: e.id,\r\n label: e.text,\r\n element: this.getComponent(e.id, sidebar)\r\n }\r\n }),\r\n ...this.LCDevItems.map(e => {\r\n if(e.section)return e\r\n return {\r\n section: e.id,\r\n label: e.text,\r\n element: this.getComponent(e.id, sidebar)\r\n }\r\n }),\r\n {\r\n section: \"DIVIDER\"\r\n },\r\n {\r\n section: \"CUSTOM\",\r\n element: this.getComponent(\"BDChangelogTitle\")\r\n },\r\n ...this.items.map(e => {\r\n return {\r\n section: e.id,\r\n label: e.text,\r\n element: this.getComponent(e.id, sidebar)\r\n }\r\n }),\r\n {\r\n section: \"DIVIDER\"\r\n }\r\n ]\r\n }\r\n}\r\n\r\n/**\r\n * No need to export settingsPanelSidebar on window\r\n */","import {settingsCookie} from \"../0globals\";\r\nimport BDV2 from \"./v2\";\r\nimport Utils from \"./utils\";\r\n\r\nexport default new class ColoredText {\r\n injectColoredText() {\r\n if (this.cancelColoredText) return;\r\n if (!BDV2.MessageComponent) return;\r\n\r\n this.cancelColoredText = Utils.monkeyPatch(BDV2.MessageComponent, \"default\", {before: (data) => {\r\n const props = data.methodArguments[0];\r\n if (!props || !props.childrenMessageContent) return;\r\n const messageContent = props.childrenMessageContent;\r\n\r\n if (!messageContent.type || !messageContent.type.type || messageContent.type.type.displayName != \"MessageContent\") return;\r\n const originalType = messageContent.type.type;\r\n if (originalType.__originalMethod) return; // Don't patch again\r\n messageContent.type.type = function(props) {\r\n const returnValue = originalType(props);\r\n const roleColor = settingsCookie[\"bda-gs-7\"] ? props.message.colorString || \"\" : \"\";\r\n returnValue.props.style = {color: roleColor};\r\n return returnValue;\r\n };\r\n\r\n messageContent.type.type.__originalMethod = originalType;\r\n Object.assign(messageContent.type.type, originalType);\r\n }});\r\n }\r\n\r\n removeColoredText() {\r\n let classNameMarkup = BDModules.get(e => e.markup)[0].markup\r\n document.querySelectorAll(\".\"+classNameMarkup.split(\" \")[0]).forEach(elem => {\r\n elem.style.setProperty(\"color\", \"\");\r\n });\r\n }\r\n};","import {settingsCookie} from \"../0globals\";\r\nimport BDV2 from \"./v2\";\r\nimport Utils from \"./utils\";\r\n\r\nexport default new class TFHour {\r\n inject24Hour() {\r\n if (this.cancel24Hour) return;\r\n\r\n const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\\\s(AM|PM)`);\r\n const convert = (data) => {\r\n if (!settingsCookie[\"bda-gs-6\"]) return;\r\n const matched = data.returnValue.match(twelveHour);\r\n if (!matched || matched.length !== 4) return;\r\n if (matched[3] === \"AM\") return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === \"12\" ? \"00\" : matched[1].padStart(2, \"0\")}:${matched[2]}`);\r\n return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === \"12\" ? \"12\" : parseInt(matched[1]) + 12}:${matched[2]}`);\r\n };\r\n\r\n const cancelCozy = Utils.monkeyPatch(BDV2.TimeFormatter, \"calendarFormat\", {after: convert}); // Called in Cozy mode\r\n const cancelCompact = Utils.monkeyPatch(BDV2.TimeFormatter, \"dateFormat\", {after: convert}); // Called in Compact mode\r\n this.cancel24Hour = () => {cancelCozy(); cancelCompact();}; // Cancel both\r\n }\r\n\r\n remove24Hour() {\r\n if (this.cancel24Hour) this.cancel24Hour();\r\n }\r\n};","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class V2C_SettingsTitle extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n//h2-2gWE-o title-3sZWYQ size16-14cGz5 height20-mO2eIN weightSemiBold-NJexzi da-h2 da-title da-size16 da-height20 da-weightSemiBold defaultColor-1_ajX0 da-defaultColor marginTop60-3PGbtK da-marginTop60 marginBottom20-32qID7 da-marginBottom20\r\n render() {\r\n return BDV2.react.createElement(\r\n \"h2\",\r\n {className: \"ui-form-title h2 margin-reset margin-bottom-20\"},\r\n this.props.text\r\n );\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class V2C_TabBarSeparator extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return BDV2.react.createElement(\"div\", {className: \"ui-tab-bar-separator margin-top-8 margin-bottom-8\"});\r\n }\r\n}","import BDV2 from \"../../modules/v2\";\r\n\r\nexport default class V2C_ServerCard extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n if (!this.props.server.iconUrl) this.props.server.iconUrl = this.props.fallback;\r\n this.state = {\r\n imageError: false,\r\n joined: this.props.guildList.includes(this.props.server.identifier)\r\n };\r\n }\r\n\r\n render() {\r\n const {server} = this.props;\r\n let cardModule = BDModules.get(e => e.card && e.cardPrimary)[0]\r\n let flexModule = BDModules.get(e => e.flexChild && e._horizontalReverse)[0]\r\n let wrapModule = BDModules.get(e => e.noWrap && !e.streamerModeEnabled)[0]\r\n return BDV2.react.createElement(\r\n \"div\", // cardPrimary-1Hv-to\r\n {className: `${cardModule.card} ${cardModule.cardPrimary} ${BDModules.get(e => e.marginBottom8)[0].marginBottom8} bd-server-card${server.pinned ? \" bd-server-card-pinned\" : \"\"}`},\r\n // BDV2.react.createElement(\r\n // \"div\",\r\n // { className: \"flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY flex-1O1GKY directionRow-3v3tfG justifyStart-2yIZo0 alignStretch-1hwxMa noWrap-3jynv6\" },\r\n BDV2.react.createElement(\"img\", {ref: \"img\", className: \"bd-server-image\", src: server.iconUrl, onError: this.handleError.bind(this), draggable: false}),\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: flexModule.flexChild+\" bd-server-content\"},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: flexModule.horizontal+\" \"+wrapModule.noWrap+\" bd-server-header\"},\r\n BDV2.react.createElement(\r\n \"h5\",\r\n {className: \"h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name\"},\r\n server.name\r\n ),\r\n BDV2.react.createElement(\r\n \"h5\",\r\n {className: \"h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count\"},\r\n server.members,\r\n \" Members\"\r\n )\r\n ),\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: flexModule.horizontal+\" \"+wrapModule.noWrap},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container\"},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"scroller-2FKFPG scroller bd-server-description\"},\r\n server.description\r\n )\r\n )\r\n ),\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer\"},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"flexChild-faoVW3 bd-server-tags\", style: {flex: \"1 1 auto\"}},\r\n server.categories.join(\", \")\r\n ),\r\n this.state.joined && BDV2.react.createElement(\r\n \"button\",\r\n {type: \"button\", className: \"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN colorGreen-29iAKY\", style: {minHeight: \"12px\", marginTop: \"4px\", backgroundColor: \"#3ac15c\"}},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"ui-button-contents\"},\r\n \"Joined\"\r\n )\r\n ),\r\n server.error && BDV2.react.createElement(\r\n \"button\",\r\n {type: \"button\", className: \"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN disabled-9aF2ug\", style: {minHeight: \"12px\", marginTop: \"4px\", backgroundColor: \"#c13a3a\"}},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"ui-button-contents\"},\r\n \"Error\"\r\n )\r\n ),\r\n !server.error && !this.state.joined && BDV2.react.createElement(\r\n \"button\",\r\n {type: \"button\", className: \"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN\", style: {minHeight: \"12px\", marginTop: \"4px\"}, onClick: () => {this.join();}},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"ui-button-contents\"},\r\n \"Join\"\r\n )\r\n )\r\n )\r\n )\r\n // )\r\n );\r\n }\r\n\r\n handleError() {\r\n this.props.server.iconUrl = this.props.fallback;\r\n this.setState({imageError: true});\r\n }\r\n\r\n join() {\r\n this.props.join(this);\r\n //this.setState({joined: true});\r\n }\r\n}","import BDV2 from \"./v2\"\r\nconst {useState} = BDV2.react\r\n\r\n\r\nexport function useForceUpdate(){\r\n return useState()[1];\r\n}","import BDV2 from \"../../modules/v2\";\r\n\r\nimport SettingsTitle from \"../settingsTitle\";\r\nimport TabBarSeparator from \"../tabBarSeparator\";\r\n\r\nimport ServerCard from \"./serverCard\";\r\nimport { useForceUpdate } from \"../../modules/hooks\";\r\n\r\nlet SettingsView\r\nexport default class V2C_PublicServers extends BDV2.reactComponent {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.setInitialState();\r\n this.close = this.close.bind(this);\r\n this.changeCategory = this.changeCategory.bind(this);\r\n this.search = this.search.bind(this);\r\n this.searchKeyDown = this.searchKeyDown.bind(this);\r\n this.checkConnection = this.checkConnection.bind(this);\r\n this.join = this.join.bind(this);\r\n this.connect = this.connect.bind(this);\r\n\r\n this.GuildStore = BDV2.WebpackModules.findByUniqueProperties([\"getGuilds\"]);\r\n this.AvatarDefaults = BDV2.WebpackModules.findByUniqueProperties([\"getUserAvatarURL\", \"DEFAULT_AVATARS\"]);\r\n this.InviteActions = BDV2.WebpackModules.findByUniqueProperties([\"acceptInvite\"]);\r\n this.SortedGuildStore = BDV2.WebpackModules.findByUniqueProperties([\"getSortedGuilds\"]);\r\n\r\n this.hooks = []\r\n }\r\n\r\n componentDidMount() {\r\n this.checkConnection();\r\n }\r\n\r\n setInitialState() {\r\n this.state = {\r\n selectedCategory: -1,\r\n title: \"Loading...\",\r\n loading: true,\r\n servers: [],\r\n next: null,\r\n connection: {\r\n state: 0,\r\n user: null\r\n },\r\n section: this.categorySlugs[0],\r\n theme: \"dark\"\r\n };\r\n }\r\n\r\n close() {\r\n this.props.close()\r\n }\r\n\r\n search(query, clear) {\r\n const self = this;\r\n fetch(`${self.searchEndPoint}${query}${query ? \"&schema=new\" : \"?schema=new\"}`, {\r\n method: \"get\"\r\n }).then(async res => {\r\n if(res.status !== 200)throw await res.text()\r\n let data = await res.json()\r\n \r\n let servers = data.results.reduce((arr, server) => {\r\n server.joined = false;\r\n arr.push(server);\r\n // arr.push();\r\n return arr;\r\n }, []);\r\n\r\n if (!clear) {\r\n servers = self.state.servers.concat(servers);\r\n }\r\n else {\r\n //servers.unshift(self.bdServer);\r\n }\r\n\r\n let end = data.size + data.from;\r\n data.next = `?from=${end}`;\r\n if (self.state.term) data.next += `&term=${self.state.term}`;\r\n if (self.state.selectedCategory) data.next += `&category=${self.categoryButtons[self.state.selectedCategory]}`;\r\n if (end >= data.total) {\r\n end = data.total;\r\n data.next = null;\r\n }\r\n\r\n let title = `Showing 1-${end} of ${data.total} results in ${self.categoryButtons[self.state.selectedCategory]}`;\r\n if (self.state.term) title += ` for ${self.state.term}`;\r\n\r\n self.setState({\r\n loading: false,\r\n title: title,\r\n servers: servers,\r\n next: data.next\r\n });\r\n }).catch((err) => {\r\n console.error(err)\r\n return self.setState({\r\n loading: false,\r\n title: \"Failed to load servers. Check console for details\"\r\n });\r\n })\r\n }\r\n\r\n async join(serverCard) {\r\n if (serverCard.props.pinned) return this.InviteActions.acceptInvite(serverCard.props.invite_code);\r\n\r\n await fetch(`${this.joinEndPoint}/${serverCard.props.server.identifier}`,{\r\n method: \"GET\",\r\n credentials: \"include\",\r\n mode: \"cors\",\r\n headers: {\r\n \"Accept\": \"application/json\",\r\n \"Content-Type\": \"application/json\"\r\n }\r\n });\r\n\r\n serverCard.setState({joined: true});\r\n }\r\n\r\n connect() {\r\n const self = this;\r\n const options = self.windowOptions;\r\n options.x = Math.round(window.screenX + window.innerWidth / 2 - options.width / 2);\r\n options.y = Math.round(window.screenY + window.innerHeight / 2 - options.height / 2);\r\n\r\n const win = self.joinWindow = new (window.require(\"electron\").remote.BrowserWindow)(options);\r\n const url = \"https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info\";\r\n win.webContents.on(\"did-navigate\", (event, url) => {\r\n if (url != \"https://auth.discordservers.com/info\") return;\r\n win.close();\r\n self.checkConnection();\r\n });\r\n win.loadURL(url);\r\n win.setMenuBarVisibility(false)\r\n }\r\n\r\n get windowOptions() {\r\n return {\r\n width: 500,\r\n height: 550,\r\n backgroundColor: \"#282b30\",\r\n show: true,\r\n resizable: false,\r\n maximizable: false,\r\n minimizable: false,\r\n alwaysOnTop: true,\r\n frame: true,\r\n center: false,\r\n webPreferences: {\r\n nodeIntegration: false\r\n }\r\n };\r\n }\r\n\r\n get bdServer() {\r\n const server = {\r\n name: \"BetterDiscord\",\r\n online: \"30000+\",\r\n members: \"70000+\",\r\n categories: [\"community\", \"programming\", \"support\"],\r\n description: \"Official BetterDiscord server for support etc\",\r\n identifier: \"86004744966914048\",\r\n iconUrl: \"https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp\",\r\n nativejoin: true,\r\n invite_code: \"0Tmfo5ZbORCRqbAd\",\r\n pinned: true\r\n };\r\n const server2 = {\r\n name: \"Lightcord\",\r\n online: \"100+\",\r\n members: \"300+\",\r\n categories: [\"community\", \"programming\", \"support\"],\r\n description: \"Official Lightcord server for support etc\",\r\n identifier: \"705908350218666117\",\r\n iconUrl: \"https://github.com/lightcord.png\",\r\n nativejoin: true,\r\n invite_code: \"7eFff2A\",\r\n pinned: true\r\n };\r\n const guildList = this.SortedGuildStore.getFlattenedGuildIds();\r\n const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;\r\n return [\r\n BDV2.react.createElement(ServerCard, {server: server2, pinned: true, join: this.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)]}),\r\n BDV2.react.createElement(ServerCard, {server: server, pinned: true, join: this.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)]})\r\n ]\r\n }\r\n\r\n get searchEndPoint() {\r\n return \"https://search.discordservers.com\";\r\n }\r\n\r\n get joinEndPoint() {\r\n return \"https://j.discordservers.com\";\r\n }\r\n\r\n get connectEndPoint() {\r\n return \"https://join.discordservers.com/connect\";\r\n }\r\n\r\n async checkConnection() {\r\n const self = this;\r\n try {\r\n const response = await fetch(`https://auth.discordservers.com/info`,{\r\n method: \"GET\",\r\n credentials: \"include\",\r\n mode: \"cors\",\r\n headers: {\r\n \"Accept\": \"application/json\",\r\n \"Content-Type\": \"application/json\"\r\n }\r\n });\r\n const text = await response.text()\r\n if(!text){\r\n self.setState({\r\n title: \"Not connected to discordservers.com!\",\r\n loading: true,\r\n selectedCategory: -1,\r\n connection: {\r\n state: 1,\r\n user: null\r\n }\r\n });\r\n return\r\n }\r\n const data = JSON.parse(text)\r\n self.setState({\r\n selectedCategory: 0,\r\n connection: {\r\n state: 2,\r\n user: data\r\n }\r\n });\r\n self.search(\"\", true);\r\n }\r\n catch (error) {\r\n console.error(error)\r\n self.setState({\r\n title: \"Not connected to discordservers.com!\",\r\n loading: true,\r\n selectedCategory: -1,\r\n connection: {\r\n state: 1,\r\n user: null\r\n }\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n this.hooks.forEach((e) => e())\r\n SettingsView = SettingsView || BDV2.WebpackModules.findByDisplayName(\"SettingsView\")\r\n return BDV2.react.createElement(\"div\", {id: \"pubslayerroot\"}, \r\n BDV2.react.createElement(\"div\", {id: \"pubslayer\"}, BDV2.react.createElement(SettingsView, {\r\n onSetSection: (section) => {\r\n this.changeCategory(this.categorySlugs.indexOf(section))\r\n },\r\n sections: this.sections,\r\n onClose: this.close,\r\n section: this.state.section\r\n }))\r\n );\r\n }\r\n\r\n get sections(){\r\n let sections = []\r\n sections.push({\r\n section: \"HEADER\",\r\n label: \"Public Servers\"\r\n }, {\r\n section: \"DIVIDER\"\r\n }, {\r\n section: \"CUSTOM\",\r\n element: this.searchInput.bind(null, () => this, this.searchKeyDown)\r\n }, {\r\n section: \"DIVIDER\"\r\n }, {\r\n section: \"HEADER\",\r\n label: \"Categories\"\r\n }, ...this.categoryButtons.map((value, index) => {\r\n return {\r\n section: this.categorySlugs[index],\r\n label: value,\r\n element: this.content.bind(null, () => this)\r\n }\r\n }), {\r\n section: \"DIVIDER\"\r\n }, {\r\n section: \"CUSTOM\",\r\n element: this.footer\r\n }, {\r\n section: \"CUSTOM\",\r\n element: this.connection.bind(null, () => this)\r\n })\r\n return sections\r\n }\r\n \r\n searchInput(getThis, searchKeyDown) {\r\n const [value, setValue] = BDV2.react.useState(\"\")\r\n return BDV2.react.createElement(\r\n \"div\",\r\n {className: \"ui-form-item\"},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"ui-text-input flex-vertical\", style: {width: \"172px\", marginLeft: \"10px\"}},\r\n BDV2.react.createElement(\"input\", {\r\n ref: (serchinput) => (getThis().refs.searchinput = serchinput), \r\n onKeyDown: searchKeyDown, \r\n onChange: (e) => {\r\n setValue(e.target.value)\r\n }, \r\n type: \"text\", \r\n className: \"input default\", \r\n placeholder: \"Search...\", \r\n maxLength: \"50\",\r\n value: value\r\n })\r\n )\r\n );\r\n }\r\n\r\n searchKeyDown(e) {\r\n const self = this;\r\n if (self.state.loading || e.which !== 13) return;\r\n self.setState({\r\n loading: true,\r\n title: \"Loading...\",\r\n term: e.target.value\r\n });\r\n let query = `?term=${e.target.value}`;\r\n if (self.state.selectedCategory !== 0) {\r\n query += `&category=${self.categoryButtons[self.state.selectedCategory]}`;\r\n }\r\n self.search(query, true);\r\n }\r\n\r\n get categorySlugs(){\r\n return this.categoryButtons.map(e => e.toLowerCase().replace(/[^\\w\\d]+/g, \"_\"))\r\n }\r\n\r\n get categoryButtons() {\r\n return [\"All\", \"FPS Games\", \"MMO Games\", \"Strategy Games\", \"MOBA Games\", \"RPG Games\", \"Tabletop Games\", \"Sandbox Games\", \"Simulation Games\", \"Music\", \"Community\", \"Language\", \"Programming\", \"Other\"];\r\n }\r\n\r\n changeCategory(id) {\r\n const self = this;\r\n if (self.state.loading) return;\r\n self.setState({\r\n loading: true,\r\n selectedCategory: id,\r\n title: \"Loading...\",\r\n term: null,\r\n section: self.categorySlugs[id]\r\n });\r\n if (id === 0) {\r\n self.search(\"\", true);\r\n return;\r\n }\r\n self.search(`?category=${self.categoryButtons[id]}`, true);\r\n }\r\n\r\n content(getThis) {\r\n const self = getThis();\r\n self.useState()\r\n const guildList = self.SortedGuildStore.getFlattenedGuildIds();\r\n const defaultList = self.AvatarDefaults.DEFAULT_AVATARS;\r\n if (self.state.connection.state === 1) return BDV2.react.createElement(self.notConnected.bind(null, getThis));\r\n let columnModule = BDModules.get(e => e.contentColumnDefault)[0]\r\n return [BDV2.react.createElement(\r\n \"div\",\r\n {ref: (ref) => {\r\n (self.refs.content = ref)\r\n }, key: \"pc\", className: columnModule.contentColumn+\" \"+columnModule.contentColumn+\" content-column default\"},\r\n BDV2.react.createElement(SettingsTitle, {text: self.state.title}),\r\n self.bdServer,\r\n self.state.servers.map((server) => {\r\n return BDV2.react.createElement(ServerCard, {key: server.identifier, server: server, join: self.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)]});\r\n }),\r\n self.state.next && BDV2.react.createElement(\r\n \"button\",\r\n {type: \"button\", onClick: () => {\r\n if (self.state.loading) return;self.setState({loading: true}); self.search(self.state.next, false);\r\n }, className: \"ui-button filled brand small grow\", style: {width: \"100%\", marginTop: \"10px\", marginBottom: \"10px\"}},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"ui-button-contents\"},\r\n self.state.loading ? \"Loading\" : \"Load More\"\r\n )\r\n ),\r\n self.state.servers.length > 0 && BDV2.react.createElement(SettingsTitle, {text: self.state.title})\r\n )];\r\n }\r\n\r\n notConnected(getThis) {\r\n const self = getThis();\r\n //return BDV2.react.createElement(SettingsTitle, { text: self.state.title });\r\n let columnModule = BDModules.get(e => e.contentColumnDefault)[0]\r\n return [BDV2.react.createElement(\r\n \"div\",\r\n {key: \"ncc\", ref: (ref) => (self.refs.content = ref), className: columnModule.contentColumn+\" \"+columnModule.contentColumn+\" content-column default\"},\r\n BDV2.react.createElement(\r\n \"h2\",\r\n {className: \"ui-form-title h2 margin-reset margin-bottom-20\"},\r\n \"Not connected to discordservers.com!\",\r\n BDV2.react.createElement(\r\n \"button\",\r\n {\r\n onClick: self.connect,\r\n type: \"button\",\r\n className: \"ui-button filled brand small grow\",\r\n style: {\r\n display: \"inline-block\",\r\n minHeight: \"18px\",\r\n marginLeft: \"10px\",\r\n lineHeight: \"14px\"\r\n }\r\n },\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"ui-button-contents\"},\r\n \"Connect\"\r\n )\r\n )\r\n ), self.bdServer\r\n )];\r\n }\r\n\r\n footer() {\r\n return BDV2.react.createElement(\r\n \"div\",\r\n {className: \"ui-tab-bar-header\"},\r\n BDV2.react.createElement(\r\n \"a\",\r\n {href: \"https://discordservers.com\", target: \"_blank\"},\r\n \"Discordservers.com\"\r\n )\r\n );\r\n }\r\n\r\n useState(){\r\n const forceUpdate = useForceUpdate()\r\n BDV2.React.useEffect(() => {\r\n const listener = () => {\r\n forceUpdate()\r\n }\r\n this.hooks.push(listener)\r\n return () => {\r\n const index = this.hooks.findIndex(e => e===listener)\r\n if(index < 0)return\r\n this.hooks.splice(index, 1)\r\n }\r\n }, [])\r\n }\r\n\r\n connection(getThis) {\r\n const self = getThis();\r\n self.useState()\r\n const {connection} = self.state;\r\n if (connection.state !== 2) return BDV2.react.createElement(\"span\", null);\r\n\r\n return BDV2.react.createElement(\r\n \"span\",\r\n null,\r\n BDV2.react.createElement(TabBarSeparator, null),\r\n BDV2.react.createElement(\r\n \"span\",\r\n {style: {color: \"#b9bbbe\", fontSize: \"10px\", marginLeft: \"10px\"}},\r\n \"Connected as: \",\r\n `${connection.user.username}#${connection.user.discriminator}`\r\n ),\r\n BDV2.react.createElement(\r\n \"div\",\r\n {style: {padding: \"5px 10px 0 10px\"}},\r\n BDV2.react.createElement(\r\n \"button\",\r\n {style: {width: \"100%\", minHeight: \"20px\"}, type: \"button\", className: \"ui-button filled brand small grow\"},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"ui-button-contents\", onClick: self.connect},\r\n \"Reconnect\"\r\n )\r\n )\r\n )\r\n );\r\n }\r\n}","export default class BugHunterBadge extends React.Component {\r\n render(){\r\n const props = this.props\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n } \r\n}","export default class Circus extends React.Component {\r\n render(){\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n } \r\n}","import BugHunterBadge from \"../svg/bug_hunter\"\r\nimport nodeFetch from \"node-fetch\"\r\nimport { settingsCookie } from \"../0globals\";\r\nimport Circus from \"../svg/circus\";\r\n\r\nexport function uuidv4() { // Generate UUID (No crypto rng)\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n} \r\n\r\nconst awaitingBadgesPromises = {}\r\nlet badgesToFetch = []\r\n\r\nexport default new class DistantServer {\r\n constructor(){\r\n this._cache = {\r\n badges: {\r\n\r\n }\r\n }\r\n window.Lightcord.BetterDiscord.DistantServer = this\r\n }\r\n\r\n get cache(){\r\n return this._cache\r\n }\r\n\r\n set cache(data){\r\n if(typeof data !== \"object\" || typeof this._cache !== \"object\")return this._cache = data\r\n return this._cache = Object.assign(this._cache, data)\r\n }\r\n\r\n /**\r\n * Get custom badges from the user ID.\r\n * @param {string} user The user ID \r\n * @returns {Promise}\r\n */\r\n async getBadges(user){\r\n if(this.cache.badges[user])return this.cache.badges[user]\r\n if(awaitingBadgesPromises[user])return awaitingBadgesPromises[user]\r\n\r\n let resolve\r\n const newPromise = new Promise((res) => (resolve = res))\r\n awaitingBadgesPromises[user] = newPromise\r\n\r\n const badges = []\r\n for(let badge of Constants.badges){\r\n if(badge.defaultUsers.includes(user))badges.push(badge)\r\n }\r\n const fetchedBadges = await new Promise((resolve) => {\r\n if(!settingsCookie[\"lightcord-5\"])return resolve([])\r\n badgesToFetch.push([user, resolve])\r\n setTimeout(() => {\r\n let users = badgesToFetch\r\n if(users.length === 0)return\r\n badgesToFetch = []\r\n handleRequest(Routes.badges, \"POST\", JSON.stringify(users.map(e => e[0])))\r\n .then(async res => {\r\n if(res.status !== 200){// Couldn't fetch badges: server error\r\n users.forEach(data => {\r\n data[1]([])// resolve no badge fetched\r\n })\r\n }\r\n const responseBody = await res.json()\r\n \r\n for(let user of responseBody){\r\n let promise = users.find(promise => promise[0] === user.user_id)\r\n promise[1](user.badges)\r\n }\r\n }).catch((err) => {// Couldn't fetch badges: error\r\n if(!(err instanceof LightcordError))console.error(err)\r\n users.forEach(data => {\r\n data[1]([])// resolve no badge fetched\r\n })\r\n })\r\n }, 0)\r\n })\r\n for(let badge of fetchedBadges){\r\n if(!Constants.badges.find(e => e.id === badge))continue // We do not have the Component, skip it.\r\n if(badges.find(e => e.id === badge))continue // Already inserted.\r\n badges.push(Constants.badges.find(e => e.id === badge))\r\n }\r\n this.cache = {\r\n badges: Object.assign(this.cache.badges, {[user]: badges})\r\n }\r\n setTimeout(() => {\r\n delete this.cache.badges[user]\r\n }, 600000);\r\n\r\n resolve(badges)\r\n delete awaitingBadgesPromises[user]\r\n return badges\r\n }\r\n}\r\n\r\nconst handleRequest = function(route, method, data){\r\n if(!settingsCookie[\"lightcord-5\"]){\r\n return Promise.reject(new LightcordError(\"The current settings blocked the request.\"))\r\n }\r\n return nodeFetch(`${Constants.SERVER_URL}/api/v1${route}`, {\r\n method,\r\n headers: {\r\n \"CLIENT\": \"Lightcord\",\r\n \"Authorization\": window.Lightcord.Api.Authorization || \"None::Anonymous\"\r\n },\r\n ...(data ? {\r\n body: data\r\n } : {})\r\n })\r\n}\r\n\r\nclass LightcordError extends Error {\r\n constructor(){\r\n super(...arguments)\r\n this.name = \"LightcordError\"\r\n }\r\n}\r\n\r\nexport const Constants = {\r\n SERVER_URL: \"https://lightcord.deroku.xyz\",\r\n badges: [ // TODO: Add more badges + server side svg\r\n {\r\n name: \"Lightcord Bug Hunter\",\r\n id: \"f04698f5-816b-41e3-bd01-92291193d7a5\",\r\n defaultUsers: [\r\n \"696481194443014174\",\r\n \"696003456611385396\"\r\n ],\r\n scopes: [],\r\n component: BugHunterBadge,\r\n href: \"https://github.com/lightcord/lightcord/wiki/badges#bug_hunter\"\r\n }, {\r\n name: \"Buffoon\",\r\n id: \"06904d31-65b4-41ec-a50c-8658bbd1af96\",\r\n defaultUsers: [\r\n \"389016895543705602\",\r\n \"664600134528663565\",\r\n \"625350657829896224\"\r\n ],\r\n scopes: [],\r\n component: Circus,\r\n href: \"https://youtu.be/EJtb6z-dlT8?t=145\"\r\n }\r\n ]\r\n}\r\n\r\nexport const Routes = {\r\n badges: `/users/badges`\r\n}","import Utils from \"./utils\";\r\nimport v2 from \"./v2\";\r\nimport { uuidv4 } from \"./distant\";\r\nimport { timingSafeEqual } from \"crypto\";\r\n\r\nexport default new class Layers {\r\n constructor(){\r\n this.layers = []\r\n window.Lightcord.BetterDiscord.Layers = this\r\n }\r\n\r\n get isInjected(){\r\n return !!document.querySelector(\"div.Layers.injected\")\r\n }\r\n\r\n inject(){\r\n if(this.isInjected)return\r\n let [\r\n classNameLayers\r\n ] = [\r\n Utils.removeDa(v2.WebpackModules.find(e => e.layers && e.layer).layers)\r\n ]\r\n const layers = document.querySelector(\".\"+classNameLayers);\r\n if (!layers) return false;\r\n const ReactInstance = Lightcord.Api.Utils.FindReact(layers, 1)\r\n if(!ReactInstance)return layers\r\n this.ReactInstance = ReactInstance\r\n let render = ReactInstance.render\r\n ReactInstance.render = () => {\r\n let returnValue = render.call(ReactInstance)\r\n let classList = returnValue.props.children[1].props.className.split(\" \")\r\n classList.push(\"Layers\")\r\n classList.push(\"injected\")\r\n returnValue.props.children[1].props.className = classList.join(\" \")\r\n\r\n this.layers.forEach(layer => {\r\n returnValue.props.children[1].props.children.push(layer[1])\r\n })\r\n\r\n return returnValue\r\n }\r\n ReactInstance.forceUpdate()\r\n }\r\n\r\n createLayer(children, props = {}){\r\n let id = uuidv4()\r\n let layer = null\r\n this.layers.push([id, {\r\n layer = lay\r\n }} key={id} id={id} remove={() => {\r\n let index = this.layers.findIndex(e => e[0] === id)\r\n if(index === -1)return\r\n this.layers.splice(index, 1)\r\n layer = null\r\n if(this.ReactInstance)this.ReactInstance.forceUpdate()\r\n this.inject()\r\n }}>{children}])\r\n if(this.ReactInstance)this.ReactInstance.forceUpdate()\r\n this.inject()\r\n return {\r\n remove: () => {\r\n if(!layer){\r\n let index = this.layers.findIndex(e => e[0] === id)\r\n if(index === -1)return\r\n this.layers.splice(index, 1)\r\n layer = null\r\n if(this.ReactInstance)this.ReactInstance.forceUpdate()\r\n this.inject()\r\n }else{\r\n layer.remove()\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\nlet LayerModules\r\nexport class Layer extends React.Component {\r\n constructor(){\r\n super(...arguments)\r\n this.state = {\r\n animation: new this.modules[0].default.Value(0)\r\n } \r\n this.props.getLayer(this)\r\n this.keydown = this.keydown.bind(this)\r\n }\r\n\r\n keydown(e){\r\n if (e.which === 27) {\r\n this.remove()\r\n }\r\n }\r\n\r\n get modules(){\r\n return LayerModules || (LayerModules = [\r\n v2.WebpackModules.find(e => e.default && e.default.Value && e.default.div)\r\n ])\r\n }\r\n\r\n componentWillUnmount(){\r\n window.removeEventListener(\"keydown\", this.keydown)\r\n }\r\n\r\n componentDidMount(ev){\r\n window.addEventListener(\"keydown\", this.keydown)\r\n }\r\n\r\n remove(){\r\n this.props.remove()\r\n }\r\n\r\n componentWillEnter(ev){\r\n this.modules[0].default.timing(this.state.animation, {\r\n toValue: 1,\r\n duration: 100\r\n }).start(ev)\r\n }\r\n\r\n componentWillLeave(ev){\r\n this.modules[0].default.timing(this.state.animation, {\r\n toValue: 0,\r\n duration: 100\r\n }).start(ev)\r\n }\r\n\r\n render(){\r\n let interpolation = this.state.animation.interpolate({\r\n inputRange: [0, 1],\r\n outputRange: [1.07, 1]\r\n })\r\n let style = {\r\n opacity: this.state.animation,\r\n transform: [{\r\n scale: interpolation\r\n }]\r\n }\r\n let Div = this.modules[0].default.div\r\n return
e).join(\" \") || null} style={style}>\r\n {this.props.children(() => {\r\n this.remove()\r\n })}\r\n
\r\n }\r\n}\r\nLayer.defaultProps = {\r\n id: null,\r\n children: null\r\n}","import {settingsCookie} from \"../0globals\";\r\nimport BDV2 from \"./v2\";\r\nimport webpackModules from \"./webpackModules\";\r\nimport Utils from \"./utils\";\r\nimport DOM from \"./domtools\";\r\n\r\nimport V2C_PublicServers from \"../ui/publicservers/publicServers\";\r\nimport Layers from \"./Layers\";\r\n\r\nexport default new class V2_PublicServers {\r\n\r\n constructor() {\r\n this._appendButton = this._appendButton.bind(this);\r\n window.Lightcord.BetterDiscord.V2_PublicServers = this\r\n }\r\n\r\n render() {\r\n Layers.createLayer((close) => {\r\n return BDV2.react.createElement(V2C_PublicServers, {rootId: \"pubslayerroot\", close})\r\n })\r\n }\r\n\r\n get button() {\r\n const btn = DOM.createElement(`
`);\r\n if (!settingsCookie[\"bda-gs-1\"]) btn.style.display = \"none\";\r\n const label = DOM.createElement(`
public
`);\r\n label.addEventListener(\"click\", () => {this.render();});\r\n btn.append(label);\r\n return btn;\r\n }\r\n\r\n _appendButton() {\r\n let [\r\n classNametutorialContainer\r\n ] = [\r\n Utils.removeDa(BDModules.get(e => e.downloadProgress && e.tutorialContainer)[0].tutorialContainer)\r\n ]\r\n if (DOM.query(\"#bd-pub-li\")) return;\r\n const guilds = DOM.query(`div.${classNametutorialContainer} > div`);\r\n DOM.after(guilds, this.button);\r\n }\r\n\r\n addButton() {\r\n if (this.guildPatch) return;\r\n const GuildList = webpackModules.find(m => m.default && m.default.displayName == \"NavigableGuilds\");\r\n const GuildListOld = webpackModules.findByDisplayName(\"Guilds\");\r\n if (!GuildList && !GuildListOld) Utils.warn(\"PublicServer\", \"Can't find GuildList component\");\r\n this.guildPatch = Utils.monkeyPatch(GuildList ? GuildList : GuildListOld.prototype, GuildList ? \"default\" : \"render\", {after: this._appendButton});\r\n this._appendButton();\r\n }\r\n\r\n removeButton() {\r\n this.guildPatch();\r\n delete this.guildPatch;\r\n const button = DOM.query(\"#bd-pub-li\");\r\n if (button) button.remove();\r\n }\r\n};","import DOM from \"./domtools\";\r\n\r\nconst style = `\r\n .container-2Rl01u {\r\n display: none!important;\r\n }\r\n\r\n .chat-3bRxxu {\r\n display: none!important;\r\n }\r\n\r\n .sidebar-2K8pFh {\r\n flex-grow: 1!important;\r\n }\r\n`;\r\n\r\nexport default new class VoiceMode {\r\n start() {\r\n DOM.addStyle(\"VoiceMode\", style);\r\n }\r\n\r\n stop() {\r\n DOM.removeStyle(\"VoiceMode\");\r\n }\r\n};","import WebpackModules from \"./webpackModules\";\r\n\r\nconst normalizedPrefix = \"da\";\r\nconst randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`);\r\n\r\nexport default new class ClassNormalizer {\r\n constructor(){\r\n window.Lightcord.BetterDiscord.ClassNormalizer = this\r\n }\r\n stop() {\r\n if (!this.hasPatched) return;\r\n this.unpatchClassModules(WebpackModules.findAll(this.moduleFilter.bind(this)));\r\n this.revertElement(document.querySelector(\"#app-mount\"));\r\n this.hasPatched = false;\r\n }\r\n\r\n start() {\r\n if (this.hasPatched) return;\r\n this.patchClassModules(WebpackModules.findAll(this.moduleFilter.bind(this)));\r\n this.normalizeElement(document.querySelector(\"#app-mount\"));\r\n this.hasPatched = true;\r\n this.patchDOMMethods();\r\n }\r\n\r\n patchClassModules(modules) {\r\n for (const module of modules) {\r\n this.patchClassModule(normalizedPrefix, module);\r\n }\r\n }\r\n\r\n unpatchClassModules(modules) {\r\n for (const module of modules) {\r\n this.unpatchClassModule(normalizedPrefix, module);\r\n }\r\n }\r\n\r\n shouldIgnore(value) {\r\n if (!isNaN(value)) return true;\r\n if (value.endsWith(\"px\") || value.endsWith(\"ch\") || value.endsWith(\"em\") || value.endsWith(\"ms\")) return true;\r\n if (value.startsWith(\"layerContainer-\")) return true;\r\n if (value.startsWith(\"#\") && (value.length == 7 || value.length == 4)) return true;\r\n if (value.includes(\"calc(\") || value.includes(\"rgba\")) return true;\r\n return false;\r\n }\r\n\r\n moduleFilter(module) {\r\n if (typeof module !== \"object\" || Array.isArray(module)) return false;\r\n if (module.__esModule) return false;\r\n if (!Object.keys(module).length) return false;\r\n for (const baseClassName in module) {\r\n const value = module[baseClassName];\r\n if (typeof value !== \"string\") return false;\r\n if (this.shouldIgnore(value)) continue;\r\n if (value.split(\"-\").length === 1) return false;\r\n if (!randClass.test(value.split(\" \")[0])) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n patchClassModule(componentName, classNames) {\r\n for (const baseClassName in classNames) {\r\n const value = classNames[baseClassName];\r\n if (this.shouldIgnore(value)) continue;\r\n const classList = value.split(\" \");\r\n for (const normalClass of classList) {\r\n const match = normalClass.match(randClass);\r\n if (!match || !match.length || match.length < 2) continue; // Shouldn't ever happen since they passed the moduleFilter, but you never know\r\n const camelCase = match[1].split(\"-\").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join(\"\");\r\n classNames[baseClassName] += ` ${componentName}-${camelCase}`;\r\n }\r\n }\r\n }\r\n\r\n unpatchClassModule(componentName, classNames) {\r\n for (const baseClassName in classNames) {\r\n const value = classNames[baseClassName];\r\n if (this.shouldIgnore(value)) continue;\r\n let newString = \"\";\r\n const classList = value.split(\" \");\r\n for (const normalClass of classList) {\r\n if (normalClass.startsWith(`${componentName}-`)) continue;\r\n newString += ` ${normalClass}`;\r\n }\r\n classNames[baseClassName] = newString.trim();\r\n }\r\n }\r\n\r\n normalizeElement(element) {\r\n if (!(element instanceof Element)) return;\r\n const classes = element.classList;\r\n for (let c = 0, clen = classes.length; c < clen; c++) {\r\n if (!randClass.test(classes[c])) continue;\r\n const match = classes[c].match(randClass)[1];\r\n const newClass = match.split(\"-\").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join(\"\");\r\n element.classList.add(`${normalizedPrefix}-${newClass}`);\r\n }\r\n for (const child of element.children) this.normalizeElement(child);\r\n }\r\n\r\n revertElement(element) {\r\n if (!(element instanceof Element)) return;\r\n if (element.children && element.children.length) this.revertElement(element.children[0]);\r\n if (element.nextElementSibling) this.revertElement(element.nextElementSibling);\r\n const classes = element.classList;\r\n const toRemove = [];\r\n for (let c = 0; c < classes.length; c++) {\r\n if (classes[c].startsWith(`${normalizedPrefix}-`)) toRemove.push(classes[c]);\r\n }\r\n element.classList.remove(...toRemove);\r\n }\r\n\r\n patchDOMMethods() {\r\n const contains = DOMTokenList.prototype.contains;\r\n DOMTokenList.prototype.contains = function(token) {\r\n // const tokens = token.split(\" \");\r\n return Reflect.apply(contains, this, [token.split(\" \")[0]]);\r\n // return tokens.every(t => contains.call(this, t));\r\n };\r\n\r\n const add = DOMTokenList.prototype.add;\r\n DOMTokenList.prototype.add = function(...tokens) {\r\n for (let t = 0; t < tokens.length; t++) {\r\n tokens[t] = tokens[t].split(\" \")[0];\r\n }\r\n return Reflect.apply(add, this, tokens);\r\n };\r\n\r\n const remove = DOMTokenList.prototype.remove;\r\n DOMTokenList.prototype.remove = function(...tokens) {\r\n for (let t = 0; t < tokens.length; t++) {\r\n tokens[t] = tokens[t].split(\" \")[0];\r\n }\r\n return Reflect.apply(remove, this, tokens);\r\n };\r\n }\r\n\r\n};","import {settingsCookie} from \"../0globals\";\r\nimport BDV2 from \"./v2\";\r\nimport DOM from \"./domtools\";\r\nimport Utils from \"./utils\";\r\n\r\nexport default new class DevMode {\r\n constructor() {\r\n this.debugListener = this.debugListener.bind(this);\r\n this.copySelectorListener = this.copySelectorListener.bind(this);\r\n }\r\n\r\n start() {\r\n this.startDebugListener();\r\n if (settingsCookie[\"fork-dm-1\"]) this.startCopySelector();\r\n }\r\n \r\n stop() {\r\n this.stopDebugListener();\r\n this.stopCopySelector();\r\n }\r\n\r\n startDebugListener() {\r\n this.stopDebugListener();\r\n document.addEventListener(\"keydown\", this.debugListener);\r\n }\r\n\r\n stopDebugListener() {\r\n document.removeEventListener(\"keydown\", this.debugListener);\r\n }\r\n\r\n startCopySelector() {\r\n this.stopCopySelector();\r\n document.addEventListener(\"contextmenu\", this.copySelectorListener);\r\n }\r\n\r\n stopCopySelector() {\r\n document.removeEventListener(\"contextmenu\", this.copySelectorListener);\r\n }\r\n\r\n debugListener(e) {\r\n if (e.which === 119 || e.which == 118) {//F8\r\n console.log(\"%c[%cDevMode%c] %cBreak/Resume\", \"color: red;\", \"color: #303030; font-weight:700;\", \"color:red;\", \"\");\r\n debugger; // eslint-disable-line no-debugger\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n }\r\n }\r\n\r\n copySelectorListener(e) {\r\n try{\r\n e.stopPropagation();\r\n const selector = this.getSelector(e.target);\r\n \r\n let [\r\n classLayer, \r\n classItems\r\n ] = [\r\n BDModules.get((e) => e.layer && typeof e.layer === \"string\" && e.disabledPointerEvents)[0],\r\n BDModules.get((e) => e.menu)[0]\r\n ]\r\n \r\n function attach() {\r\n if(!classItems || !classLayer.layer)return console.log(classItems, classLayer.layer)\r\n\r\n let cm = DOM.query(\".\"+Utils.removeDa(classItems.menu));\r\n if (!cm) {\r\n const container = DOM.query(\"#app-mount > .\"+Utils.removeDa(classLayer.layerContainer));\r\n const cmWrap = DOM.createElement(`
`);\r\n cm = DOM.createElement(`
`);\r\n cmWrap.append(cm);\r\n container.append(cmWrap);\r\n cmWrap.style.top = e.clientY + \"px\";\r\n cmWrap.style.left = e.clientX + \"px\";\r\n cmWrap.setAttribute(\"role\", \"menu\")\r\n cmWrap.setAttribute(\"tabindex\", \"-1\")\r\n cmWrap.id = \"bd-copy-selector-context\"\r\n cmWrap.setAttribute(\"aria-label\", \"Copy Selector Actions\")\r\n\r\n const scrollerClasses = BDModules.get((e) => e.scrollerWrap)[0]\r\n const scrollerWrap = DOM.createElement(`
`)\r\n const scroller = DOM.createElement(`
e.scroller)[0].scroller} ${classItems.scroller}\">
`)\r\n scrollerWrap.append(scroller)\r\n cm.append(scrollerWrap)\r\n\r\n const removeCM = function(e) {\r\n if (e.keyCode && e.keyCode !== 27) return;\r\n cmWrap.remove();\r\n document.removeEventListener(\"click\", removeCM);\r\n document.removeEventListener(\"contextmenu\", removeCM);\r\n document.removeEventListener(\"keyup\", removeCM);\r\n };\r\n document.addEventListener(\"click\", removeCM);\r\n document.addEventListener(\"contextmenu\", removeCM);\r\n document.addEventListener(\"keyup\", removeCM);\r\n }\r\n const cmWrap = cm.parentElement\r\n \r\n const scroller = cm.childNodes[0].childNodes[0]\r\n const cmg = DOM.createElement(`
`);\r\n /**\r\n * @type {HTMLElement}\r\n */\r\n const cmi = DOM.createElement(`
`);\r\n cmi.append(DOM.createElement(`
Copy Selector
`));\r\n cmi.addEventListener(\"click\", () => {\r\n BDV2.NativeModule.copy(selector);\r\n cmWrap.style.display = \"none\"\r\n });\r\n cmi.addEventListener(\"mouseover\", (e) => {\r\n let elements = DOM.queryAll(\"div[role=menuitem].\"+Utils.removeDa(classItems.focused))\r\n elements && elements.forEach(elem => elem.classList.remove(classItems.focused))\r\n cmi.classList.add(classItems.focused)\r\n })\r\n cmi.addEventListener(\"mouseout\", (e) => {\r\n cmi.classList.remove(classItems.focused)\r\n })\r\n cmg.append(cmi);\r\n if(scroller.childNodes.length){ // apend a separator\r\n const separator = DOM.createElement(`
`)\r\n scroller.append(separator)\r\n }\r\n scroller.append(cmg);\r\n if(cmWrap.clientHeight < cmWrap.scrollHeight){\r\n console.log(\"overflowing \"+cmWrap.style.top)\r\n cmWrap.style.top = (cmWrap.style.top - cmg.clientHeight) + \"px\";\r\n console.log(\"overflowing\"+cmWrap.style.top)\r\n }\r\n }\r\n \r\n setTimeout(attach, 1);\r\n }catch(e){\r\n console.error(e)\r\n }\r\n }\r\n\r\n getSelector(element) {\r\n if (element.id) return `#${element.id}`;\r\n /**\r\n * \r\n * @param {HTMLElement} el \r\n */\r\n function fullPath(el){\r\n var names = [];\r\n while (el.parentNode){\r\n if (el.id){\r\n names.unshift('#'+el.id);\r\n break;\r\n }else{\r\n if (el==el.ownerDocument.documentElement) names.unshift(el.tagName.toLowerCase()+Array.from(el.classList.entries()).map(e => \".\"+e).join(\"\"));\r\n else{\r\n for (var c=1,e=el;e.previousElementSibling;e=e.previousElementSibling,c++);\r\n names.unshift(el.tagName.toLowerCase()+((typeof el.className === \"string\" && el.className) || \"\").split(\" \").filter(e => !!e).map(e => \".\"+e).join(\"\")+\":nth-child(\"+c+\")\");\r\n }\r\n el=el.parentNode;\r\n }\r\n }\r\n return names.join(\" > \");\r\n }\r\n return fullPath(element)\r\n }\r\n};","import BDV2 from \"../../modules/v2\";\r\n\r\nconst React = BDV2.React;\r\n\r\nexport default class Switch extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {checked: this.props.checked};\r\n this.onChange = this.onChange.bind(this);\r\n this.switch = \r\n }\r\n\r\n onChange(value) {\r\n if (this.props.disabled) return;\r\n this.props.onChange(value);\r\n this.setState({checked: value});\r\n }\r\n\r\n render() {\r\n return this.switch\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\nimport Switch from \"./components/switch\";\r\n\r\nlet classnames = []\r\nfunction getClassName(name){\r\n let className = classnames.find(e => e.startsWith(name+\"-\"))\r\n if(className)return className\r\n className = BDModules.get(e => e[name])[0][name]\r\n classnames.push(className)\r\n return className\r\n}\r\n\r\nexport default class SwitchItem extends BDV2.reactComponent {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.onChange = this.onChange.bind(this);\r\n }\r\n\r\n onChange() {\r\n this.props.checked = !this.props.checked;\r\n this.props.onChange(this.props.id, this.props.checked);\r\n }\r\n\r\n render() {\r\n let {text, info} = this.props.data;\r\n if(!classnames.find(e => e.startsWith(\"beta-\"))){\r\n classnames.push(BDModules.get(e => e.beta && (!e.container && !e.userSettingsVoice))[0].beta)\r\n }\r\n if(this.props.data.experimental){\r\n info = [\r\n info,\r\n React.createElement(\"sup\", {className: getClassName(\"beta\")}, \"(EXPERIMENTAL)\")\r\n ]\r\n }\r\n return BDV2.react.createElement(\"div\", {className: \"ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item\"},\r\n BDV2.react.createElement(\"div\", {className: \"ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap\"},\r\n BDV2.react.createElement(\"h3\", {key: \"title\", className: \"ui-form-title h3 margin-reset margin-reset ui-flex-child\"}, text),\r\n BDV2.react.createElement(Switch, {key: \"switch\", onChange: this.onChange, checked: this.props.checked})\r\n ),\r\n BDV2.react.createElement(\"div\", {className: \"ui-form-text style-description margin-top-4\", style: {flex: \"1 1 auto\"}}, info)\r\n );\r\n }\r\n}","let marginModule = BDModules.get(e => e.marginTop60)[0]\r\n\r\nexport default class MarginTop extends React.Component {\r\n render(){\r\n if(!marginModule)marginModule = BDModules.get(e => e.marginTop60)[0]\r\n return
\r\n }\r\n}","import {settingsCookie} from \"../0globals\";\r\nimport BDV2 from \"../modules/v2\";\r\n\r\nimport SettingsTitle from \"./settingsTitle\";\r\nimport Switch from \"./switch\";\r\nimport MarginTop from \"./margintop\";\r\n\r\nlet formModule\r\nlet switchItem\r\nlet betaClassNames\r\nexport default class V2C_SettingsGroup extends BDV2.reactComponent {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n error: false\r\n }\r\n }\r\n\r\n renderOldSettings() {\r\n const {title, settings, button} = this.props;\r\n const buttonComponent = button ? BDV2.react.createElement(\"button\", {key: \"title-button\", className: \"bd-pfbtn\", onClick: button.onClick}, button.title) : null;\r\n return [BDV2.react.createElement(SettingsTitle, {text: title}),\r\n buttonComponent,\r\n settings.map(setting => {\r\n return BDV2.react.createElement(Switch, {id: setting.id, key: setting.id, data: setting, checked: settingsCookie[setting.id], onChange: (id, checked) => {\r\n this.props.onChange(id, checked);\r\n }});\r\n })];\r\n }\r\n\r\n componentDidCatch(err, errInfo){\r\n console.log(err, errInfo)\r\n this.setState({\r\n error: true\r\n })\r\n }\r\n\r\n render(){\r\n if(this.state.error){\r\n try{\r\n return this.renderOldSettings()\r\n }catch(e){\r\n console.error(e)\r\n return null\r\n }\r\n }else{\r\n try{\r\n if(!formModule)formModule = BDV2.WebpackModules.find(e => e.FormSection)\r\n if(!switchItem)switchItem = BDV2.WebpackModules.find(e => e.default && e.default.displayName === \"SwitchItem\")\r\n if(!betaClassNames)betaClassNames = BDV2.WebpackModules.find(e => e.beta && (!e.container && !e.userSettingsVoice))\r\n \r\n let children = []\r\n if(this.props.description){\r\n children.push(\r\n {this.props.description}\r\n , )\r\n }\r\n children.push(...this.props.settings.map(setting => {\r\n let info = [\r\n setting.text\r\n ]\r\n if(setting.experimental){\r\n info.push((EXPERIMENTAL))\r\n }\r\n return {\r\n this.props.onChange(setting.id, ev.target.checked);\r\n this.forceUpdate()\r\n }} key={setting.id} value={settingsCookie[setting.id]} className={__SECRET_EMOTION__.css({\r\n marginBottom: \"20px\"\r\n })} disabled={false} hideBorder={false}\r\n size={switchItem.default.Sizes.DEFAULT} theme={switchItem.default.Themes.DEFAULT} note={setting.info}>\r\n {info}\r\n \r\n }))\r\n return \r\n {children}\r\n \r\n }catch(e){\r\n console.error(e)\r\n setImmediate(()=>{\r\n this.setState({\r\n error: true\r\n })\r\n })\r\n return null\r\n }\r\n }\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\n\r\nimport SettingsGroup from \"./settingsGroup\";\r\nimport MarginTop from \"./margintop\";\r\n\r\nexport default class V2C_SectionedSettingsPanel extends BDV2.reactComponent {\r\n\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return this.props.sections.map((section, i) => {\r\n return [\r\n i !== 0 ? BDV2.react.createElement(MarginTop, {}) : null,\r\n BDV2.react.createElement(SettingsGroup, Object.assign({}, section, {onChange: this.props.onChange}))\r\n ]\r\n })\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class V2C_Checkbox extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n this.onClick = this.onClick.bind(this);\r\n this.setInitialState();\r\n }\r\n\r\n setInitialState() {\r\n this.state = {\r\n checked: this.props.checked || false\r\n };\r\n }\r\n\r\n render() {\r\n return BDV2.react.createElement(\r\n \"li\",\r\n null,\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"checkbox \"+BDModules.get(e => e.checkboxElement)[0].checkbox, onClick: this.onClick},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"checkbox-inner \"+BDModules.get(e => e.checkboxInner)[0].checkboxInner},\r\n BDV2.react.createElement(\"input\", {className: BDModules.get(e => e.checkboxElement)[0].checkboxElement, checked: this.state.checked, onChange: () => {}, type: \"checkbox\"}),\r\n BDV2.react.createElement(\"span\", null)\r\n ),\r\n BDV2.react.createElement(\r\n \"span\",\r\n null,\r\n this.props.text\r\n )\r\n )\r\n );\r\n }\r\n\r\n onClick() {\r\n this.props.onChange(this.props.id, !this.state.checked);\r\n this.setState({\r\n checked: !this.state.checked\r\n });\r\n }\r\n}","import {settingsCookie} from \"../0globals\";\r\nimport Settings from \"../modules/settingsPanel\";\r\nimport BDV2 from \"../modules/v2\";\r\nimport DataStore from \"../modules/dataStore\";\r\nimport DOM from \"../modules/domtools\";\r\nimport Utils from \"../modules/utils\"\r\n\r\nimport Checkbox from \"./checkbox\";\r\n\r\nexport default class V2C_CssEditorDetached extends BDV2.reactComponent {\r\n\r\n constructor(props) {\r\n super(props);\r\n const self = this;\r\n self.onClick = self.onClick.bind(self);\r\n self.updateCss = self.updateCss.bind(self);\r\n self.saveCss = self.saveCss.bind(self);\r\n self.onChange = self.onChange.bind(self);\r\n }\r\n\r\n componentDidMount() {\r\n DOM.addClass(DOM.query(\"#app-mount\"), \"bd-detached-editor\");\r\n BDV2.editorDetached = true;\r\n // this.updateLineCount();\r\n this.editor = ace.edit(\"bd-customcss-editor-detached\");\r\n this.editor.setTheme(\"ace/theme/discord\");\r\n this.editor.session.setMode(\"ace/mode/css\");\r\n this.editor.setShowPrintMargin(false);\r\n this.editor.setFontSize(14);\r\n this.editor.on(\"change\", () => {\r\n if (!settingsCookie[\"bda-css-0\"]) return;\r\n this.saveCss();\r\n this.updateCss();\r\n });\r\n\r\n }\r\n\r\n componentWillUnmount() {\r\n DOM.removeClass(DOM.query(\"#app-mount\"), \"bd-detached-editor\");\r\n BDV2.editorDetached = false;\r\n this.editor.destroy();\r\n }\r\n\r\n updateLineCount() {\r\n const lineCount = this.refs.editor.value.split(\"\\n\").length;\r\n if (lineCount == this.props.lines) return;\r\n this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(\".\\n\") + \".\";\r\n this.props.lines = lineCount;\r\n }\r\n\r\n get options() {\r\n return {\r\n lineNumbers: true,\r\n mode: \"css\",\r\n indentUnit: 4,\r\n theme: \"material\",\r\n scrollbarStyle: \"simple\"\r\n };\r\n }\r\n\r\n get css() {\r\n const _ccss = DataStore.getBDData(\"bdcustomcss\");\r\n let ccss = \"\";\r\n if (_ccss && _ccss !== \"\") {\r\n ccss = Buffer.from(_ccss, \"base64\").toString(\"utf8\");\r\n }\r\n return ccss;\r\n }\r\n\r\n get root() {\r\n const _root = DOM.query(\"#bd-customcss-detach-container\");\r\n if (!_root) {\r\n if (!this.injectRoot()) return null;\r\n return this.detachedRoot;\r\n }\r\n return _root;\r\n }\r\n\r\n injectRoot() {\r\n const app = DOM.query(\".app, .\"+Utils.removeDa(BDModules.get(e => e.app && e.layers)[0].app));\r\n if (!app) return false;\r\n DOM.insertAfter(DOM.createElement(`
`), app);\r\n return true;\r\n }\r\n\r\n render() {\r\n const self = this;\r\n return BDV2.react.createElement(\r\n \"div\",\r\n {className: \"bd-detached-css-editor\", id: \"bd-customcss-detach-editor\"},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {id: \"bd-customcss-innerpane\"},\r\n BDV2.react.createElement(\"div\", {className: \"editor-wrapper\"},\r\n BDV2.react.createElement(\"div\", {id: \"bd-customcss-editor-detached\", className: \"editor\", ref: \"editor\"}, self.css)\r\n ),\r\n BDV2.react.createElement(\r\n \"div\",\r\n {id: \"bd-customcss-attach-controls\"},\r\n BDV2.react.createElement(\r\n \"ul\",\r\n {className: \"checkbox-group\"},\r\n BDV2.react.createElement(Checkbox, {id: \"live-update\", text: \"Live Update\", onChange: self.onChange, checked: settingsCookie[\"bda-css-0\"]})\r\n ),\r\n BDV2.react.createElement(\r\n \"div\",\r\n {id: \"bd-customcss-detach-controls-button\"},\r\n BDV2.react.createElement(\r\n \"button\",\r\n {style: {borderRadius: \"3px 0 0 3px\", borderRight: \"1px solid #3f4146\"}, className: \"btn btn-primary\", onClick: () => {\r\n self.onClick(\"update\");\r\n }},\r\n \"Update\"\r\n ),\r\n BDV2.react.createElement(\r\n \"button\",\r\n {style: {borderRadius: \"0\", borderLeft: \"1px solid #2d2d2d\", borderRight: \"1px solid #2d2d2d\"}, className: \"btn btn-primary\", onClick: () => {\r\n self.onClick(\"save\");\r\n }},\r\n \"Save\"\r\n ),\r\n BDV2.react.createElement(\r\n \"button\",\r\n {style: {borderRadius: \"0 3px 3px 0\", borderLeft: \"1px solid #3f4146\"}, className: \"btn btn-primary\", onClick: () => {\r\n self.onClick(\"attach\");\r\n }},\r\n \"Attach\"\r\n ),\r\n BDV2.react.createElement(\r\n \"span\",\r\n {style: {fontSize: \"10px\", marginLeft: \"5px\"}},\r\n \"Unsaved changes are lost on attach\"\r\n )\r\n )\r\n )\r\n )\r\n );\r\n }\r\n\r\n onChange(id, checked) {\r\n switch (id) {\r\n case \"live-update\":\r\n settingsCookie[\"bda-css-0\"] = checked;\r\n Settings.saveSettings();\r\n break;\r\n }\r\n }\r\n\r\n onClick(id) {\r\n const self = this;\r\n switch (id) {\r\n case \"attach\":\r\n if (DOM.query(\"#editor-detached\")) self.props.attach();\r\n BDV2.reactDom.unmountComponentAtNode(self.root);\r\n self.root.remove();\r\n break;\r\n case \"update\":\r\n self.updateCss();\r\n break;\r\n case \"save\":\r\n self.saveCss();\r\n break;\r\n }\r\n }\r\n\r\n updateCss() {\r\n DOM.removeStyle(\"customcss\");\r\n DOM.addStyle(\"customcss\", this.editor.session.getValue());\r\n }\r\n\r\n saveCss() {\r\n DataStore.setBDData(\"bdcustomcss\", Buffer.from(this.editor.session.getValue(), \"utf-8\").toString(\"base64\"));\r\n }\r\n}","import {settingsCookie} from \"../0globals\";\r\nimport Settings from \"../modules/settingsPanel\";\r\nimport BDV2 from \"../modules/v2\";\r\nimport DataStore from \"../modules/dataStore\";\r\nimport DOM from \"../modules/domtools\";\r\nimport Utils from \"../modules/utils\"\r\n\r\nimport SettingsTitle from \"./settingsTitle\";\r\nimport Checkbox from \"./checkbox\";\r\nimport V2C_CssEditorDetached from \"./cssEditorDetached\";\r\n\r\nexport default class V2C_CssEditor extends BDV2.reactComponent {\r\n\r\n constructor(props) {\r\n super(props);\r\n const self = this;\r\n self.props.lines = 0;\r\n self.setInitialState();\r\n self.attach = self.attach.bind(self);\r\n self.detachedEditor = BDV2.react.createElement(V2C_CssEditorDetached, {attach: self.attach});\r\n self.onClick = self.onClick.bind(self);\r\n self.updateCss = self.updateCss.bind(self);\r\n self.saveCss = self.saveCss.bind(self);\r\n self.detach = self.detach.bind(self);\r\n }\r\n\r\n setInitialState() {\r\n this.state = {\r\n detached: this.props.detached || BDV2.editorDetached\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n // this.updateLineCount();\r\n this.editor = ace.edit(\"bd-customcss-editor\");\r\n this.editor.setTheme(\"ace/theme/discord\");\r\n this.editor.session.setMode(\"ace/mode/css\");\r\n this.editor.setShowPrintMargin(false);\r\n this.editor.setFontSize(14);\r\n this.editor.on(\"change\", () => {\r\n if (!settingsCookie[\"bda-css-0\"]) return;\r\n this.saveCss();\r\n this.updateCss();\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n this.editor.destroy();\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n const self = this;\r\n if (prevState.detached && !self.state.detached) {\r\n BDV2.reactDom.unmountComponentAtNode(self.detachedRoot);\r\n }\r\n }\r\n\r\n codeMirror() {\r\n }\r\n\r\n get options() {\r\n return {\r\n lineNumbers: true,\r\n mode: \"css\",\r\n indentUnit: 4,\r\n theme: \"material\",\r\n scrollbarStyle: \"simple\"\r\n };\r\n }\r\n\r\n get css() {\r\n const _ccss = DataStore.getBDData(\"bdcustomcss\");\r\n let ccss = \"\";\r\n if (_ccss && _ccss !== \"\") {\r\n ccss = Buffer.from(_ccss, \"base64\").toString(\"utf8\");\r\n }\r\n return ccss;\r\n }\r\n\r\n updateLineCount() {\r\n const lineCount = this.refs.editor.value.split(\"\\n\").length;\r\n if (lineCount == this.props.lines) return;\r\n this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(\".\\n\") + \".\";\r\n this.props.lines = lineCount;\r\n }\r\n\r\n render() {\r\n const self = this;\r\n\r\n const {detached} = self.state;\r\n return [\r\n detached && BDV2.react.createElement(\r\n \"div\",\r\n {id: \"editor-detached\"},\r\n BDV2.react.createElement(SettingsTitle, {text: \"Custom CSS Editor\"}),\r\n BDV2.react.createElement(\r\n \"h3\",\r\n null,\r\n \"Editor Detached\"\r\n ),\r\n BDV2.react.createElement(\r\n \"button\",\r\n {className: \"btn btn-primary\", onClick: () => {\r\n self.attach();\r\n }},\r\n \"Attach\"\r\n )\r\n ),\r\n !detached && BDV2.react.createElement(\r\n \"div\",\r\n null,\r\n BDV2.react.createElement(SettingsTitle, {text: \"Custom CSS Editor\"}),\r\n BDV2.react.createElement(\"div\", {className: \"editor-wrapper\"},\r\n BDV2.react.createElement(\"div\", {id: \"bd-customcss-editor\", className: \"editor\", ref: \"editor\"}, self.css)\r\n ),\r\n BDV2.react.createElement(\r\n \"div\",\r\n {id: \"bd-customcss-attach-controls\"},\r\n BDV2.react.createElement(\r\n \"ul\",\r\n {className: \"checkbox-group\"},\r\n BDV2.react.createElement(Checkbox, {id: \"live-update\", text: \"Live Update\", onChange: this.onChange, checked: settingsCookie[\"bda-css-0\"]})\r\n ),\r\n BDV2.react.createElement(\r\n \"div\",\r\n {id: \"bd-customcss-detach-controls-button\"},\r\n BDV2.react.createElement(\r\n \"button\",\r\n {style: {borderRadius: \"3px 0 0 3px\", borderRight: \"1px solid #3f4146\"}, className: \"btn btn-primary\", onClick: () => {\r\n self.onClick(\"update\");\r\n }},\r\n \"Update\"\r\n ),\r\n BDV2.react.createElement(\r\n \"button\",\r\n {style: {borderRadius: \"0\", borderLeft: \"1px solid #2d2d2d\", borderRight: \"1px solid #2d2d2d\"}, className: \"btn btn-primary\", onClick: () => {\r\n self.onClick(\"save\");\r\n }},\r\n \"Save\"\r\n ),\r\n BDV2.react.createElement(\r\n \"button\",\r\n {style: {borderRadius: \"0 3px 3px 0\", borderLeft: \"1px solid #3f4146\"}, className: \"btn btn-primary\", onClick: () => {\r\n self.onClick(\"detach\");\r\n }},\r\n \"Detach\"\r\n ),\r\n BDV2.react.createElement(\r\n \"span\",\r\n {style: {fontSize: \"10px\", marginLeft: \"5px\"}},\r\n \"Unsaved changes are lost on detach\"\r\n ),\r\n BDV2.react.createElement(\"div\", {className: \"help-text\"},\r\n \"Press \",\r\n BDV2.react.createElement(\"code\", {className: \"inline\"}, \"ctrl\"),\r\n \"+\",\r\n BDV2.react.createElement(\"span\", {className: \"inline\"}, \",\"),\r\n \" with the editor focused to access the editor's settings.\"\r\n )\r\n )\r\n )\r\n )\r\n ]\r\n }\r\n\r\n onClick(arg) {\r\n const self = this;\r\n switch (arg) {\r\n case \"update\":\r\n self.updateCss();\r\n break;\r\n case \"save\":\r\n self.saveCss();\r\n break;\r\n case \"detach\":\r\n self.detach();\r\n break;\r\n }\r\n }\r\n\r\n onChange(id, checked) {\r\n switch (id) {\r\n case \"live-update\":\r\n settingsCookie[\"bda-css-0\"] = checked;\r\n Settings.saveSettings();\r\n break;\r\n }\r\n }\r\n\r\n updateCss() {\r\n DOM.removeStyle(\"customcss\");\r\n DOM.addStyle(\"customcss\", this.editor.session.getValue());\r\n }\r\n\r\n saveCss() {\r\n DataStore.setBDData(\"bdcustomcss\", Buffer.from(this.editor.session.getValue(), \"utf-8\").toString(\"base64\"));\r\n }\r\n\r\n detach() {\r\n const self = this;\r\n self.setState({\r\n detached: true\r\n });\r\n const droot = self.detachedRoot;\r\n if (!droot) {\r\n console.log(\"FAILED TO INJECT ROOT: .app\");\r\n return;\r\n }\r\n BDV2.reactDom.render(self.detachedEditor, droot);\r\n }\r\n\r\n get detachedRoot() {\r\n const _root = DOM.query(\"#bd-customcss-detach-container\");\r\n if (!_root) {\r\n if (!this.injectDetachedRoot()) return null;\r\n return this.detachedRoot;\r\n }\r\n return _root;\r\n }\r\n\r\n injectDetachedRoot() {\r\n const app = DOM.query(\".app, .\"+Utils.removeDa(BDModules.get(e => e.app && e.layers)[0].app));\r\n if (!app) return false;\r\n DOM.insertAfter(DOM.createElement(`
`), app);\r\n return true;\r\n }\r\n\r\n attach() {\r\n const self = this;\r\n self.setState({\r\n detached: false\r\n });\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class BDErrorBoundary extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state = {hasError: false};\r\n }\r\n\r\n componentDidCatch() {\r\n this.setState({hasError: true});\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) return BDV2.react.createElement(\"div\", {className: \"react-error\"}, \"Component Error\"); \r\n return this.props.children; \r\n }\r\n}\r\n\r\nconst originalRender = BDErrorBoundary.prototype.render;\r\nObject.defineProperty(BDErrorBoundary.prototype, \"render\", {\r\n enumerable: false,\r\n configurable: false,\r\n set: function() {console.warn(\"Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins\");},\r\n get: () => originalRender\r\n}); ","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class V2C_ContentColumn extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n static get displayName() {return \"ContentColumn\";}\r\n\r\n render() {\r\n //let contentModule = BDModules.get(e => e.contentColumn)[0]\r\n let title = this.props.title ? BDV2.react.createElement(\"h2\", {className: \"ui-form-title h2 margin-reset margin-bottom-20\"}, this.props.title) : null\r\n return [\r\n title,\r\n this.props.children\r\n ]\r\n return BDV2.react.createElement(\r\n \"div\",\r\n {className: contentModule.contentColumn + \" \"+contentModule.contentColumnDefault+\" content-column default\", style: {padding: \"60px 40px 0px\"}},\r\n title,\r\n this.props.children\r\n );\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class V2C_ReloadIcon extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return BDV2.react.createElement(\"svg\", {\r\n xmlns: \"http://www.w3.org/2000/svg\",\r\n viewBox: \"0 0 24 24\",\r\n fill: \"#dcddde\",\r\n className: \"bd-reload \" + this.props.className,\r\n onClick: this.props.onClick,\r\n style: {width: this.props.size || \"24px\", height: this.props.size || \"24px\"}\r\n },\r\n BDV2.react.createElement(\"path\", {d: \"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"}),\r\n BDV2.react.createElement(\"path\", {fill: \"none\", d: \"M0 0h24v24H0z\"})\r\n );\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class V2C_XSvg extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return BDV2.react.createElement(\r\n \"svg\",\r\n {xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 12 12\", style: {width: \"18px\", height: \"18px\"}},\r\n BDV2.react.createElement(\r\n \"g\",\r\n {className: \"background\", fill: \"none\", fillRule: \"evenodd\"},\r\n BDV2.react.createElement(\"path\", {d: \"M0 0h12v12H0\"}),\r\n BDV2.react.createElement(\"path\", {className: \"fill\", fill: \"#dcddde\", d: \"M9.5 3.205L8.795 2.5 6 5.295 3.205 2.5l-.705.705L5.295 6 2.5 8.795l.705.705L6 6.705 8.795 9.5l.705-.705L6.705 6\"})\r\n )\r\n );\r\n }\r\n}","import BDV2 from \"../../modules/v2\";\r\n\r\nconst React = BDV2.React;\r\n\r\nexport default class Edit extends React.Component {\r\n render() {\r\n const size = this.props.size || \"24px\";\r\n return \r\n \r\n \r\n ;\r\n }\r\n}","import BDV2 from \"../../modules/v2\";\r\n\r\nconst React = BDV2.React;\r\n\r\nexport default class Delete extends React.Component {\r\n render() {\r\n const size = this.props.size || \"24px\";\r\n return \r\n \r\n \r\n ;\r\n }\r\n}","import {settingsCookie} from \"../0globals\";\r\nimport BDV2 from \"../modules/v2\";\r\nimport Utils from \"../modules/utils\";\r\nimport DOM from \"../modules/domtools\";\r\n\r\nimport XSvg from \"./xSvg\";\r\nimport ReloadIcon from \"./reloadIcon\";\r\nimport EditIcon from \"./icons/edit\";\r\nimport DeleteIcon from \"./icons/delete\";\r\nimport Switch from \"./components/switch\";\r\nimport TooltipWrap from \"./tooltipWrap\";\r\nimport { processFile } from \"../modules/pluginCertifier\";\r\nimport contentManager from \"../modules/contentManager\";\r\nimport { resolve } from \"path\";\r\n\r\nconst React = BDV2.React;\r\nconst anchorClasses = BDV2.anchorClasses;\r\n\r\nexport default class V2C_PluginCard extends BDV2.reactComponent {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.onChange = this.onChange.bind(this);\r\n this.showSettings = this.showSettings.bind(this);\r\n this.setInitialState();\r\n this.hasSettings = this.props.addon.plugin && typeof(this.props.addon.plugin.getSettingsPanel) === \"function\";\r\n this.settingsPanel = \"\";\r\n\r\n this.edit = this.edit.bind(this);\r\n this.delete = this.delete.bind(this);\r\n this.reload = this.reload.bind(this);\r\n }\r\n\r\n setInitialState() {\r\n this.state = {\r\n checked: this.props.enabled,\r\n settings: false,\r\n reloads: 0,\r\n trusted: false\r\n };\r\n }\r\n\r\n showSettings() {\r\n if (!this.hasSettings) return;\r\n this.setState({settings: true});\r\n }\r\n\r\n closeSettings() {\r\n this.panelRef.current.innerHTML = \"\";\r\n this.setState({settingsOpen: false});\r\n }\r\n\r\n componentDidUpdate() {\r\n if (!this.state.settings) return;\r\n if (typeof this.settingsPanel === \"object\") {\r\n this.refs.settingspanel.appendChild(this.settingsPanel);\r\n }\r\n\r\n if (!settingsCookie[\"fork-ps-3\"]) return;\r\n setImmediate(() => {\r\n const isHidden = (container, element) => {\r\n if(!container){\r\n console.error(new Error(`Container is undefined.`))\r\n return false\r\n }\r\n const cTop = container.scrollTop;\r\n const cBottom = cTop + container.clientHeight;\r\n const eTop = element.offsetTop;\r\n const eBottom = eTop + element.clientHeight;\r\n return (eTop < cTop || eBottom > cBottom);\r\n };\r\n\r\n const thisNode = this.refs.cardNode;\r\n const container = thisNode.closest(\"div[class*=\\\"contentRegionScroller-\\\"]\")\r\n if (!isHidden(container, thisNode)) return;\r\n const thisNodeOffset = DOM.offset(thisNode);\r\n const containerOffset = DOM.offset(container);\r\n const original = container.scrollTop;\r\n const endPoint = thisNodeOffset.top - containerOffset.top + container.scrollTop - 30;\r\n DOM.animate({\r\n duration: 300,\r\n update: function(progress) {\r\n if (endPoint > original) container.scrollTop = original + (progress * (endPoint - original));\r\n else container.scrollTop = original - (progress * (original - endPoint));\r\n }\r\n });\r\n });\r\n }\r\n\r\n\r\n getString(value) {\r\n if (!value) return \"???\";\r\n return typeof value == \"string\" ? value : value.toString();\r\n }\r\n\r\n get settingsComponent() {\r\n try { this.settingsPanel = this.props.addon.plugin.getSettingsPanel(); }\r\n catch (err) { Utils.err(\"Plugins\", \"Unable to get settings panel for \" + this.name + \".\", err); }\r\n\r\n return BDV2.react.createElement(\"div\", {className: \"bd-card bd-addon-card settings-open ui-switch-item\", ref: \"cardNode\"},\r\n BDV2.react.createElement(\"div\", {style: {\"float\": \"right\", \"cursor\": \"pointer\"}, onClick: () => {\r\n this.refs.settingspanel.innerHTML = \"\";\r\n this.setState({settings: false});\r\n }},\r\n BDV2.react.createElement(XSvg, null)\r\n ),\r\n typeof this.settingsPanel === \"object\" && BDV2.react.createElement(\"div\", {id: `plugin-settings-${this.name}`, className: \"plugin-settings\", ref: \"settingspanel\"}),\r\n typeof this.settingsPanel !== \"object\" && BDV2.react.createElement(\"div\", {id: `plugin-settings-${this.name}`, className: \"plugin-settings\", ref: \"settingspanel\", dangerouslySetInnerHTML: {__html: this.settingsPanel}})\r\n );\r\n }\r\n\r\n buildTitle(name, version, author) {\r\n const title = \"{{name}} v{{version}} by {{author}}\".split(/({{[A-Za-z]+}})/);\r\n const nameIndex = title.findIndex(s => s == \"{{name}}\");\r\n if (nameIndex) title[nameIndex] = React.createElement(\"span\", {className: \"name bda-name\"}, name);\r\n const versionIndex = title.findIndex(s => s == \"{{version}}\");\r\n if (nameIndex) title[versionIndex] = React.createElement(\"span\", {className: \"version bda-version\"}, version);\r\n const authorIndex = title.findIndex(s => s == \"{{author}}\");\r\n if (nameIndex) {\r\n const props = {className: \"author bda-author\"};\r\n if (author.link || author.id) {\r\n props.className += ` ${anchorClasses.anchor} ${anchorClasses.anchorUnderlineOnHover}`;\r\n props.target = \"_blank\";\r\n\r\n if (author.link) props.href = author.link;\r\n if (author.id) props.onClick = () => {BDV2.LayerStack.popLayer(); BDV2.openDM(author.id);};\r\n }\r\n title[authorIndex] = React.createElement(author.link || author.id ? \"a\" : \"span\", props, author.name);\r\n }\r\n return title.flat();\r\n }\r\n\r\n makeLink(title, url) {\r\n const props = {className: \"bda-link bda-link-website\", target: \"_blank\"};\r\n if (typeof(url) == \"string\") props.href = url;\r\n if (typeof(url) == \"function\") props.onClick = (event) => {event.preventDefault(); event.stopPropagation(); url();};\r\n return BDV2.react.createElement(\"a\", props, title);\r\n }\r\n\r\n makeButton(title, children, action) {\r\n return \r\n
{children}
\r\n
;\r\n }\r\n\r\n componentWillUnmount(){\r\n this.unmounted = true\r\n }\r\n\r\n get links() {\r\n const links = [];\r\n const addon = this.props.addon;\r\n if (addon.website) links.push(this.makeLink(\"Website\", addon.website));\r\n if (addon.source) links.push(this.makeLink(\"Source\", addon.source));\r\n if (addon.invite) {\r\n links.push(this.makeLink(\"Support Server\", () => {\r\n const tester = /\\.gg\\/(.*)$/;\r\n let code = addon.invite;\r\n if (tester.test(code)) code = code.match(tester)[1];\r\n BDV2.LayerStack.popLayer();\r\n BDV2.InviteActions.acceptInviteAndTransitionToInviteChannel(code);\r\n }));\r\n }\r\n if (addon.donate) links.push(this.makeLink(\"Donate\", addon.donate));\r\n if (addon.patreon) links.push(this.makeLink(\"Patreon\", addon.patreon));\r\n return links;\r\n }\r\n\r\n get footer() {\r\n const links = this.links;\r\n return (links.length || this.hasSettings) && BDV2.react.createElement(\"div\", {className: \"bd-card-footer bda-footer\"},\r\n BDV2.react.createElement(\"span\", {className: \"bd-addon-links bda-links\"},\r\n ...(links.map((element, index) => index < links.length - 1 ? [element, \" | \"] : element).flat())\r\n ),\r\n this.hasSettings && BDV2.react.createElement(\"button\", {onClick: this.showSettings, className: \"bd-button bda-settings-button\", disabled: !this.state.checked}, \"Settings\")\r\n );\r\n }\r\n\r\n onChange() {\r\n this.props.toggle && this.props.toggle(this.name);\r\n this.setState({checked: !this.state.checked});\r\n }\r\n\r\n edit() {this.props.edit(this.name);}\r\n delete() {this.props.remove(this.name);}\r\n reload() {this.props.reload(this.name);}\r\n\r\n get name() {return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getName() : this.props.addon.name);}\r\n get author() {return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getAuthor() : this.props.addon.author);}\r\n get description() {return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getDescription() : this.props.addon.description);}\r\n get version() {return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getVersion() : this.props.addon.version);}\r\n\r\n render() {\r\n if (this.state.settings) return this.settingsComponent;\r\n const {authorId, authorLink} = this.props.addon;\r\n\r\n const style = {}\r\n if(settingsCookie[\"fork-ps-6\"]){\r\n if(!this.isScanning){\r\n this.isScanning = true\r\n processFile(resolve(this.props.addon.filename.endsWith(\".plugin.js\") ? contentManager.pluginsFolder : contentManager.themesFolder, this.props.addon.filename), (result) => {\r\n if(this.unmounted)return\r\n \r\n this.setState({\r\n isTrusted: result.suspect ? \"suspect\" : true\r\n })\r\n }, () => {})\r\n }else{\r\n if(this.state.isTrusted === true){\r\n style.borderColor = \"#4087ed\"\r\n }\r\n if(this.state.isTrusted === \"suspect\"){\r\n style.borderColor = \"rgb(240, 71, 71)\"\r\n }\r\n }\r\n }\r\n \r\n return BDV2.react.createElement(\"div\", {className: \"bd-card bd-addon-card settings-closed ui-switch-item\", style},\r\n BDV2.react.createElement(\"div\", {className: \"bd-addon-header bda-header\"},\r\n BDV2.react.createElement(\"div\", {className: \"bd-card-title bda-header-title\"}, this.buildTitle(this.name, this.version, {name: this.author, id: authorId, link: authorLink})),\r\n BDV2.react.createElement(\"div\", {className: \"bd-addon-controls bda-controls\"},\r\n this.props.edit && this.makeButton(\"Edit\", , this.edit),\r\n this.props.remove && this.makeButton(\"Delete\", , this.delete),\r\n this.props.reload && this.makeButton(\"Reload\", , this.reload),\r\n React.createElement(Switch, {onChange: this.onChange, checked: this.state.checked})\r\n )\r\n ),\r\n BDV2.react.createElement(\"div\", {className: \"bd-scroller-wrap bda-description-wrap scroller-wrap fade\"},\r\n BDV2.react.createElement(\"div\", {className: \"bd-scroller bd-addon-description bda-description scroller\"}, this.description)\r\n ),\r\n this.footer\r\n );\r\n }\r\n}\r\n\r\nconst originalRender = V2C_PluginCard.prototype.render;\r\nObject.defineProperty(V2C_PluginCard.prototype, \"render\", {\r\n enumerable: false,\r\n configurable: false,\r\n set: function() {console.warn(\"Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins\");},\r\n get: () => originalRender\r\n});","import BDV2 from \"../../modules/v2\";\r\n\r\nconst React = BDV2.React;\r\n\r\nexport default class DownArrow extends React.Component {\r\n render() {\r\n const size = this.props.size || \"16px\";\r\n return \r\n \r\n ;\r\n }\r\n}","import BDV2 from \"../../modules/v2\";\r\nimport Arrow from \"../icons/downarrow\";\r\n\r\nconst React = BDV2.React;\r\n\r\n\r\nexport default class Select extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {open: false, value: this.props.value || this.props.options[0].value};\r\n this.dropdown = React.createRef();\r\n this.onChange = this.onChange.bind(this);\r\n this.showMenu = this.showMenu.bind(this);\r\n this.hideMenu = this.hideMenu.bind(this);\r\n }\r\n\r\n showMenu(event) {\r\n event.preventDefault();\r\n this.setState({open: true}, () => {\r\n document.addEventListener(\"click\", this.hideMenu);\r\n });\r\n }\r\n\r\n hideMenu() {\r\n this.setState({open: false}, () => {\r\n document.removeEventListener(\"click\", this.hideMenu);\r\n });\r\n }\r\n\r\n onChange(value) {\r\n this.setState({value});\r\n if (this.props.onChange) this.props.onChange(value);\r\n }\r\n\r\n get selected() {return this.props.options.find(o => o.value == this.state.value);}\r\n\r\n get options() {\r\n const selected = this.selected;\r\n return
\r\n {this.props.options.map(opt => \r\n
{opt.label}
\r\n )}\r\n
;\r\n }\r\n\r\n render() {\r\n const style = this.props.style == \"transparent\" ? \" bd-select-transparent\" : \"\";\r\n const isOpen = this.state.open ? \" menu-open\" : \"\";\r\n return
\r\n
{this.selected.label}
\r\n \r\n {this.state.open && this.options}\r\n
;\r\n }\r\n}\r\n\r\n// return
\r\n// \r\n//
\r\n//
\r\n//
{this.selected.label}
\r\n// \r\n//
\r\n//
\r\n// {this.state.open && this.options}\r\n//
;","import BDV2 from \"../../modules/v2\";\r\n\r\nconst React = BDV2.React;\r\n\r\nexport default class Search extends React.Component {\r\n render() {\r\n const size = this.props.size || \"16px\";\r\n return \r\n \r\n \r\n ;\r\n }\r\n}","import BDV2 from \"../../modules/v2\";\r\nimport SearchIcon from \"../icons/search\";\r\n\r\nconst React = BDV2.React;\r\n\r\nexport default class Search extends React.Component {\r\n constructor(props){\r\n super(props)\r\n this.state = {\r\n focused: false\r\n }\r\n }\r\n render() {\r\n const className = [\"bd-search-wrapper\"]\r\n if(this.state.focused)className.push(\"focused\")\r\n return
\r\n {\r\n this.setState({focused: true})\r\n }} onBlur={() => {\r\n this.setState({focused: false})\r\n }}/>\r\n \r\n
;\r\n }\r\n}","import ErrorBoundary from \"./errorBoundary\";\r\nimport ContentColumn from \"./contentColumn\";\r\nimport ReloadIcon from \"./reloadIcon\";\r\nimport AddonCard from \"./addoncard\";\r\nimport Dropdown from \"./components/dropdown\";\r\nimport Search from \"./components/search\";\r\n\r\nimport {settingsCookie, pluginCookie, themeCookie, bdplugins, bdthemes} from \"../0globals\";\r\nimport ContentManager from \"../modules/contentManager\";\r\nimport BDV2 from \"../modules/v2\";\r\nimport pluginModule from \"../modules/pluginModule\";\r\nimport themeModule from \"../modules/themeModule\";\r\nimport WebpackModules from \"../modules/webpackModules\";\r\nimport BdApi from \"../modules/bdApi\";\r\nimport Utils from \"../modules/utils\";\r\nimport TooltipWrap from \"./tooltipWrap\";\r\nimport bdEvents from \"../modules/bdEvents\";\r\nimport EmulatedTooltip from \"./tooltip\";\r\n\r\nconst Tooltip = WebpackModules.findByDisplayName(\"Tooltip\");\r\n\r\nconst React = BDV2.react;\r\n\r\nexport default class CardList extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state = {sort: \"name\", ascending: true, query: \"\"};\r\n this.isPlugins = this.props.type == \"plugins\";\r\n this.cookie = this.isPlugins ? pluginCookie : themeCookie;\r\n this.manager = this.isPlugins ? pluginModule : themeModule;\r\n\r\n this.sort = this.sort.bind(this);\r\n this.reverse = this.reverse.bind(this);\r\n this.search = this.search.bind(this);\r\n\r\n this.onAddonChanges = function(){\r\n this.forceUpdate()\r\n }\r\n this.onAddonChanges = this.onAddonChanges.bind(this)\r\n }\r\n\r\n componentDidMount(){\r\n const type = (this.isPlugins ? \"plugin\" : \"theme\") + \"-\"\r\n bdEvents.on(`${type}loaded`, this.onAddonChanges)\r\n bdEvents.on(`${type}unloaded`, this.onAddonChanges)\r\n bdEvents.on(`${type}reloaded`, this.onAddonChanges)\r\n }\r\n\r\n componentWillUnmount(){\r\n const type = (this.isPlugins ? \"plugin\" : \"theme\") + \"-\"\r\n bdEvents.off(`${type}loaded`, this.onAddonChanges)\r\n bdEvents.off(`${type}unloaded`, this.onAddonChanges)\r\n bdEvents.off(`${type}reloaded`, this.onAddonChanges)\r\n }\r\n\r\n openFolder() {\r\n const shell = require(\"electron\").shell;\r\n const open = shell.openPath || shell.openItem;\r\n open(this.isPlugins ? ContentManager.pluginsFolder : ContentManager.themesFolder);\r\n }\r\n\r\n edit(name) {\r\n console.log(name);\r\n this.manager.edit(name);\r\n }\r\n\r\n async delete(name) {\r\n const shouldDelete = await this.confirmDelete(name);\r\n if (!shouldDelete) return;\r\n this.manager.delete(name);\r\n }\r\n\r\n confirmDelete(name) {\r\n return new Promise(resolve => {\r\n BdApi.showConfirmationModal(\"Are You Sure?\", `Are you sure you want to delete ${name}?`, {\r\n danger: true,\r\n confirmText: \"Delete\",\r\n onConfirm: () => {resolve(true);},\r\n onCancel: () => {resolve(false);}\r\n });\r\n });\r\n }\r\n\r\n get sortOptions() {\r\n return [\r\n {label: \"Name\", value: \"name\"},\r\n {label: \"Author\", value: \"author\"},\r\n {label: \"Version\", value: \"version\"},\r\n {label: \"Recently Added\", value: \"added\"},\r\n {label: \"Last Modified\", value: \"modified\"},\r\n {label: \"File Size\", value: \"size\"},\r\n ];\r\n }\r\n\r\n get directions() {\r\n return [\r\n {label: \"Ascending\", value: true},\r\n {label: \"Descending\", value: false}\r\n ];\r\n }\r\n\r\n reverse(value) {\r\n this.setState({ascending: value});\r\n }\r\n\r\n sort(value) {\r\n this.setState({sort: value});\r\n }\r\n\r\n search(event) {\r\n this.setState({query: event.target.value.toLocaleLowerCase()});\r\n }\r\n\r\n getProps(addon) {\r\n return {\r\n key: this.getName(addon),\r\n enabled: this.cookie[this.getName(addon)],\r\n toggle: this.manager.toggle.bind(this.manager),\r\n edit: settingsCookie[\"fork-ps-7\"] ? this.edit.bind(this) : null,\r\n remove: this.delete.bind(this),\r\n addon: addon,\r\n hash: addon.hash\r\n };\r\n }\r\n\r\n getString(value) {\r\n if (!value) return \"???\";\r\n return typeof value == \"string\" ? value : value.toString();\r\n }\r\n\r\n get list(){\r\n return this.props.type === \"plugins\" ? Object.values(bdplugins) : Object.values(bdthemes);\r\n }\r\n\r\n getAddons() {\r\n const sortedAddons = this.list.sort((a, b) => {\r\n const cap = this.state.sort.charAt(0).toUpperCase() + this.state.sort.slice(1);\r\n const first = a.plugin && a.plugin[`get${cap}`] ? this.getString(a.plugin[`get${cap}`]()) : this.getString(a[this.state.sort]);\r\n const second = b.plugin && b.plugin[`get${cap}`] ? this.getString(b.plugin[`get${cap}`]()) : this.getString(b[this.state.sort]);\r\n if (typeof(first) == \"string\") return first.toLocaleLowerCase().localeCompare(second.toLocaleLowerCase());\r\n if (first > second) return 1;\r\n if (second > first) return -1;\r\n return 0;\r\n });\r\n if (!this.state.ascending) sortedAddons.reverse();\r\n const rendered = [];\r\n for (let a = 0; a < sortedAddons.length; a++) {\r\n const addon = sortedAddons[a];\r\n if (this.state.query) {\r\n let matches = null;\r\n const name = this.getName(addon);\r\n const author = this.getAuthor(addon);\r\n const description = this.getDescription(addon);\r\n const version = this.getVersion(addon);\r\n if (name) matches = name.toLocaleLowerCase().includes(this.state.query);\r\n if (author) matches = matches || author.toLocaleLowerCase().includes(this.state.query);\r\n if (description) matches = matches || description.toLocaleLowerCase().includes(this.state.query);\r\n if (version) matches = matches || version.toLocaleLowerCase().includes(this.state.query);\r\n if (!matches) continue;\r\n }\r\n const props = this.getProps(addon);\r\n rendered.push();\r\n }\r\n return rendered;\r\n }\r\n\r\n getName(addon) {return this.getString(addon.plugin ? addon.plugin.getName() : addon.name);}\r\n getAuthor(addon) {return this.getString(addon.plugin ? addon.plugin.getAuthor() : addon.author);}\r\n getDescription(addon) {return this.getString(addon.plugin ? addon.plugin.getDescription() : addon.description);}\r\n getVersion(addon) {return this.getString(addon.plugin ? addon.plugin.getVersion() : addon.version);}\r\n\r\n renderCheckUpdates(){\r\n if(!window.ZeresPluginLibrary)return null\r\n if(!window.PluginUpdates)return null\r\n if(typeof window.PluginUpdates.checkAll !== \"function\")return null\r\n if(!this.isPlugins)return null\r\n\r\n let tooltipIsShowing = false\r\n let tooltip\r\n return \r\n {\r\n tooltipIsShowing = false\r\n tooltip.hide()\r\n }}>\r\n {\r\n try{\r\n Utils.showToast(\"Plugin update check in progress.\", {type: \"info\"})\r\n window.PluginUpdates.checkAll()\r\n .then(() => {\r\n Utils.showToast(\"Plugin update check complete.\", {type: \"success\"})\r\n }).catch(err => {\r\n console.error(err)\r\n Utils.showToast(\"An error occured while checking update.\", {type: \"error\"})\r\n })\r\n }catch(e){\r\n console.error(e)\r\n Utils.showToast(\"An error occured while checking update.\", {type: \"error\"})\r\n }\r\n }} wrapper={false} disabled={false} onRightClick={() => {\r\n if(!this.refs.checkUpdateButton)return\r\n if (!window.PluginUpdates || !window.PluginUpdates.plugins) return;\r\n if(tooltipIsShowing)return\r\n tooltip = new EmulatedTooltip(this.refs.checkUpdateButton.refs.original.refs.button, Object.values(window.PluginUpdates.plugins).map(p => p.name).join(\", \"), {\r\n side: \"bottom\",\r\n attachEvents: false\r\n })\r\n tooltip.show()\r\n tooltipIsShowing = true\r\n }}>\r\n Check for Updates\r\n \r\n \r\n \r\n }\r\n\r\n render() {\r\n const refreshIcon = \r\n {(props) => \r\n {\r\n if (this.isPlugins) pluginModule.updatePluginList();\r\n else themeModule.updateThemeList();\r\n this.forceUpdate();\r\n }} />\r\n };\r\n const addonCards = this.getAddons();\r\n\r\n return \r\n \r\n Open {this.isPlugins ? \"Plugin\" : \"Theme\"} Folder\r\n \r\n {this.renderCheckUpdates()}\r\n {!settingsCookie[\"fork-ps-5\"] && refreshIcon}\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
{addonCards}
\r\n
\r\n }\r\n}\r\n\r\nconst originalRender = CardList.prototype.render;\r\nObject.defineProperty(CardList.prototype, \"render\", {\r\n enumerable: false,\r\n configurable: false,\r\n set: function() {console.warn(\"Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins\");},\r\n get: () => originalRender\r\n});","import {settingsRPC, defaultRPC} from \"../0globals\";\r\n\r\nconst dispatcher = BDModules.get(m=>m.Dispatcher&&m.default&&m.default.dispatch)[0].default\r\nconst ActionTypes = BDModules.get(m=>m.ActionTypes)[0].ActionTypes\r\n\r\nconst socketId = \"lightcord-spoof-socket\"\r\nconst pid = process.pid\r\n\r\nexport default new class CustomRichPresence {\r\n constructor(){\r\n this.enabled = false\r\n\r\n this.game = settingsRPC\r\n }\r\n \r\n get formatedGame(){\r\n if(!this.game)return null\r\n if(this.enabled === false)return null\r\n let game = {\r\n name: this.game.name || defaultRPC.name,\r\n application_id: this.game.application_id || defaultRPC.application_id,\r\n details: this.game.details || undefined,\r\n state: this.game.state || undefined,\r\n timestamps: this.game[\"timestamps.start\"] ? {\r\n start: this.game[\"timestamps.start\"]\r\n } : undefined,\r\n assets: this.game[\"assets.large\"] ? {\r\n large_image: this.game[\"assets.large\"],\r\n small_image: this.game[\"assets.small\"] || undefined\r\n } : undefined\r\n }\r\n return game\r\n }\r\n\r\n sendGame(){\r\n dispatcher.dispatch({\r\n type: ActionTypes.LOCAL_ACTIVITY_UPDATE,\r\n socketId,\r\n pid,\r\n activity: this.formatedGame\r\n }) \r\n }\r\n\r\n enable() {\r\n if(this.enabled)return\r\n this.enabled = true\r\n console.log(\"Enabling custom RichPresence\")\r\n\r\n this.set(settingsRPC || Object.create(defaultRPC))\r\n\r\n this.sendGame()\r\n }\r\n\r\n disable() {\r\n if(!this.enabled)return\r\n this.enabled = false\r\n console.log(\"Disabling custom RichPresence\")\r\n\r\n this.sendGame()\r\n }\r\n\r\n async fetchAssets(applicationId){\r\n let assets = await BDModules.get(e => e.getAssets)[0].getAssets(applicationId)\r\n if(assets.undefined && typeof assets.undefined === \"number\"){\r\n throw new Error(\"Unknown Application\")\r\n }\r\n return assets\r\n }\r\n\r\n set(activity){\r\n this.game = activity\r\n\r\n this.sendGame()\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\nimport V2C_SettingsTitle from \"./settingsTitle\";\r\nimport V2C_SettingsGroup from \"./settingsGroup\";\r\nimport dataStore from \"../modules/dataStore\";\r\nimport { defaultRPC, settingsRPC } from \"../0globals\";\r\nimport CustomRichPresence from \"../modules/CustomRichPresence\"\r\nimport { remote } from \"electron\";\r\nimport MarginTop from \"./margintop\";\r\nimport Utils from \"../modules/utils\";\r\n\r\nconst React = BDV2.React;\r\n\r\nlet V2C_PresenceSettingsModules\r\nexport default class V2C_PresenceSettings extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n data: dataStore.getSettingGroup(\"rpc\") || defaultRPC,\r\n assets: []\r\n }\r\n\r\n this.preview = null\r\n this.isfetching = false\r\n if(this.state.data.application_id){\r\n this.fetchAssets()\r\n }\r\n\r\n this.assetComponents = new Set()\r\n }\r\n\r\n updateWhenFetched(comp){\r\n this.assetComponents.add(comp)\r\n }\r\n\r\n /**\r\n * \r\n * @param {InputText} setting \r\n */\r\n onChange(setting, value){\r\n let defaultSetting = RPCProps.find(e => e.id === setting.props.id)\r\n\r\n this.setState({\r\n data: Object.assign(settingsRPC, this.state.data, {\r\n [defaultSetting.id]: !!value ? value : null\r\n }),\r\n assets: this.state.assets\r\n })\r\n if(setting.props.id === \"application_id\"){\r\n this.fetchAssets()\r\n }\r\n\r\n dataStore.setSettingGroup(\"rpc\", settingsRPC);\r\n this.preview.forceUpdate()\r\n CustomRichPresence.set(settingsRPC)\r\n }\r\n\r\n fetchAssets(){\r\n if(this.isfetching === true){\r\n let app = this.state.data.application_id\r\n setTimeout(() => {\r\n if(this.state.data.application_id !== app){\r\n return\r\n }\r\n this.fetchAssets()\r\n }, 5000);\r\n }\r\n if(!this.state.data.application_id){\r\n this.setState({\r\n data: this.state.data,\r\n assets: []\r\n })\r\n this.forceUpdate()\r\n this.assetComponents.forEach(e => e.forceUpdate())\r\n return\r\n }\r\n this.isfetching = true\r\n CustomRichPresence.fetchAssets(this.state.data.application_id)\r\n .then(assets => {\r\n this.isfetching = false\r\n this.setState({\r\n data: this.state.data,\r\n assets: Object.keys(assets).map(k => {\r\n let asset = assets[k]\r\n return {\r\n id: asset.id,\r\n name: asset.name,\r\n type: asset.type\r\n }\r\n })\r\n })\r\n this.forceUpdate()\r\n this.assetComponents.forEach(e => e.forceUpdate())\r\n }).catch(() => {\r\n this.isfetching = false\r\n this.setState({\r\n data: this.state.data,\r\n assets: []\r\n })\r\n this.forceUpdate()\r\n this.assetComponents.forEach(e => e.forceUpdate())\r\n })\r\n }\r\n\r\n updatePreview(data){\r\n this.setState({\r\n data\r\n })\r\n }\r\n\r\n get modules(){\r\n return V2C_PresenceSettingsModules || (V2C_PresenceSettingsModules = [\r\n BDModules.get(e => e.marginBottom20)[0]\r\n ])\r\n }\r\n\r\n render() {\r\n let [\r\n marginModule\r\n ] = this.modules\r\n return [\r\n ,\r\n ,\r\n ,\r\n
\r\n {/** options */}\r\n {this.optionsComponents}\r\n
,\r\n
\r\n \r\n \r\n {/** preview */}\r\n \r\n
,\r\n
,\r\n ,\r\n \r\n ]\r\n }\r\n\r\n get optionsComponents(){\r\n return this._optionsComponents || (this._optionsComponents = RPCProps.map(e => {\r\n if(e.type === \"text\"){\r\n return \r\n }else if(e.type === \"number\"){\r\n let array = []/*\r\n if(e.id === \"timestamps.start\"){\r\n array.unshift( {\r\n DiscordNative.clipboard.copy(Date.now()+\"\")\r\n }} />)\r\n }*/\r\n return array\r\n }else if(e.type === \"choice\"){\r\n if([\"assets.small\", \"assets.large\"].includes(e.id)){\r\n return {\r\n return {\r\n value: \"asset-\"+e.id,\r\n label: e.name\r\n }\r\n }))}/>\r\n }else{\r\n return \"Unknown choice.\"\r\n }\r\n }\r\n }))\r\n }\r\n}\r\nconst RPCProps = [\r\n {\r\n title: \"Application ID\",\r\n id: \"application_id\",\r\n type: \"number\",\r\n placeholder: \"711416957718757418\"\r\n },\r\n {\r\n title: \"Name\",\r\n id: \"name\",\r\n type: \"text\",\r\n placeholder: \"Lightcord\"\r\n },\r\n {\r\n title: \"Details\",\r\n id: \"details\",\r\n type: \"text\",\r\n placeholder: \"Browsing Discord\"\r\n },\r\n {\r\n title: \"State\",\r\n id: \"state\",\r\n type: \"text\",\r\n placeholder: \"Lightcord Client\"\r\n },\r\n {\r\n title: \"Timestamp Start\",\r\n id: \"timestamps.start\",\r\n type: \"number\",\r\n get placeholder(){\r\n return Date.now()\r\n }\r\n },\r\n {\r\n title: \"LargeAsset\",\r\n id: \"assets.large\",\r\n type: \"choice\"\r\n },\r\n {\r\n title: \"SmallAsset\",\r\n id: \"assets.small\",\r\n type: \"choice\"\r\n },\r\n]\r\n\r\nlet inputTextModules\r\nclass InputText extends React.PureComponent {\r\n get modules(){\r\n if(inputTextModules && inputTextModules[0])return inputTextModules\r\n return inputTextModules = [\r\n BDModules.get(e => e.removeKeybind)[0],\r\n BDModules.get(e => e.marginBottom20)[0],\r\n BDModules.get(e => e.defaultMarginh5)[0],\r\n BDModules.get(e => e.colorStandard)[0],\r\n BDModules.get(e => e.size32)[0],\r\n BDModules.get(e => e._horizontal)[0],\r\n BDModules.get(e => e.inputMini)[0],\r\n BDModules.get(e => e.size16 && e.size20)[0],\r\n ]\r\n }\r\n\r\n constructor(props){\r\n super(props)\r\n let setting = this.props.setting\r\n this.state = {\r\n data: this.props.manager.state.data[setting.id]\r\n }\r\n\r\n this.input = {\r\n this.setState({\r\n data: value\r\n })\r\n if(!this.lastEdited || this.lastEdited < Date.now() - 500){\r\n this.props.manager.onChange(this, value)\r\n this.lastEdited = Date.now()\r\n }else if(!this.isTiming){\r\n this.isTiming = setTimeout(() => {\r\n this.props.manager.onChange(this, this.state.data)\r\n this.isTiming = null\r\n this.lastEdited = Date.now()\r\n }, 500);\r\n }\r\n }} type=\"text\"/>\r\n }\r\n\r\n render(){\r\n let setting = this.props.setting\r\n\r\n let [\r\n rowModule,\r\n marginModule,\r\n marginModule2,\r\n colorModule,\r\n sizeModule,\r\n flexModule,\r\n inputModule,\r\n sizeModule2,\r\n ] = this.modules\r\n\r\n return (
\r\n
\r\n
\r\n {setting.title}\r\n
\r\n {this.input}\r\n
\r\n \r\n
)\r\n }\r\n}\r\n\r\nlet InputNumberModules\r\nclass InputNumber extends React.PureComponent {\r\n get modules(){\r\n return InputNumberModules || (InputNumberModules = [\r\n BDModules.get(e => e.removeKeybind)[0],\r\n BDModules.get(e => e.marginBottom20)[0],\r\n BDModules.get(e => e.defaultMarginh5)[0],\r\n BDModules.get(e => e.colorStandard)[0],\r\n BDModules.get(e => e.size32)[0],\r\n BDModules.get(e => e._horizontal)[0],\r\n BDModules.get(e => e.inputMini)[0],\r\n BDModules.get(e => e.size16 && e.size20)[0],\r\n BDModules.get(e => e.colorTransparent)[0],\r\n ])\r\n }\r\n\r\n constructor(props){\r\n super(props)\r\n let setting = this.props.setting\r\n this.state = {\r\n data: this.props.manager.state.data[setting.id]\r\n }\r\n\r\n this.input = {\r\n value = value.replace(/[^\\d]+/g, \"\")\r\n if(value == this.state.data){\r\n input.setValue(value)\r\n return\r\n }\r\n\r\n if(!this.lastEdited || this.lastEdited < Date.now() - 500){\r\n this.props.manager.onChange(this, value)\r\n this.lastEdited = Date.now()\r\n }else if(!this.isTiming){\r\n this.isTiming = setTimeout(() => {\r\n this.props.manager.onChange(this, this.state.data)\r\n this.isTiming = null\r\n this.lastEdited = Date.now()\r\n }, 500);\r\n }\r\n this.setState({\r\n data: value\r\n })\r\n }} type=\"text\"/>\r\n }\r\n\r\n render(){\r\n let setting = this.props.setting\r\n\r\n let [\r\n rowModule,\r\n marginModule,\r\n marginModule2,\r\n colorModule,\r\n sizeModule,\r\n flexModule,\r\n ] = this.modules\r\n\r\n\r\n return (
\r\n
\r\n
\r\n {setting.title}\r\n
\r\n {this.input}\r\n {setting.id === \"timestamps.start\" ? \r\n {\r\n DiscordNative.clipboard.copy(Date.now()+\"\")\r\n }} color=\"brand\">Copy current timestamp : null}\r\n
\r\n \r\n
)\r\n }\r\n}\r\n\r\nlet InputChoiceModules\r\nclass InputChoice extends React.PureComponent {\r\n constructor(props){\r\n super(props)\r\n let setting = this.props.setting\r\n this.state = {\r\n data: this.props.manager.state.data[setting.id] ? \"asset-\"+this.props.manager.state.data[setting.id] : \"none\"\r\n }\r\n this.props.manager.updateWhenFetched(this)\r\n }\r\n\r\n onChange(data){\r\n let value = data.value\r\n\r\n if(!this.lastEdited || this.lastEdited < Date.now() - 500){\r\n this.props.manager.onChange(this, value === \"none\" ? null : value.replace(\"asset-\", \"\"))\r\n this.lastEdited = Date.now()\r\n }else if(!this.isTiming){\r\n this.isTiming = setTimeout(() => {\r\n this.props.manager.onChange(this, this.state.data === \"none\" ? null : this.state.data.replace(\"asset-\", \"\"))\r\n this.isTiming = null\r\n this.lastEdited = Date.now()\r\n }, 500);\r\n }\r\n this.setState({\r\n data: value\r\n })\r\n this.forceUpdate()\r\n }\r\n \r\n get modules(){\r\n return InputChoiceModules || (InputChoiceModules = [\r\n BDModules.get(e => e.removeKeybind)[0],\r\n BDModules.get(e => e.marginBottom20)[0],\r\n BDModules.get(e => e.defaultMarginh5)[0],\r\n BDModules.get(e => e.colorStandard)[0],\r\n BDModules.get(e => e.size32)[0],\r\n BDModules.get(e => e._horizontal)[0]\r\n ])\r\n }\r\n\r\n render(){\r\n let setting = this.props.setting\r\n\r\n let [\r\n rowModule,\r\n marginModule,\r\n marginModule2,\r\n colorModule,\r\n sizeModule,\r\n flexModule\r\n ] = this.modules\r\n \r\n let options = this.props.manager.state.assets.map(e => {\r\n return {\r\n value: \"asset-\"+e.id,\r\n label: e.name\r\n }\r\n })\r\n\r\n options.unshift({\r\n value: \"none\",\r\n label: \"No assets\"\r\n })\r\n\r\n return (
\r\n
\r\n
\r\n {setting.title}\r\n
\r\n \r\n {/* {\n this.setState({focused: true})\n }} onBlur={() => {\n this.setState({focused: false})\n }}/>\n \n
;\n }\n}","import ErrorBoundary from \"./errorBoundary\";\nimport ContentColumn from \"./contentColumn\";\nimport ReloadIcon from \"./reloadIcon\";\nimport AddonCard from \"./addoncard\";\nimport Dropdown from \"./components/dropdown\";\nimport Search from \"./components/search\";\n\nimport {settingsCookie, pluginCookie, themeCookie, bdplugins, bdthemes} from \"../0globals\";\nimport ContentManager from \"../modules/contentManager\";\nimport BDV2 from \"../modules/v2\";\nimport pluginModule from \"../modules/pluginModule\";\nimport themeModule from \"../modules/themeModule\";\nimport WebpackModules from \"../modules/webpackModules\";\nimport BdApi from \"../modules/bdApi\";\nimport Utils from \"../modules/utils\";\nimport TooltipWrap from \"./tooltipWrap\";\nimport bdEvents from \"../modules/bdEvents\";\nimport EmulatedTooltip from \"./tooltip\";\n\nconst Tooltip = WebpackModules.findByDisplayName(\"Tooltip\");\n\nconst React = BDV2.react;\n\nexport default class CardList extends BDV2.reactComponent {\n constructor(props) {\n super(props);\n this.state = {sort: \"name\", ascending: true, query: \"\"};\n this.isPlugins = this.props.type == \"plugins\";\n this.cookie = this.isPlugins ? pluginCookie : themeCookie;\n this.manager = this.isPlugins ? pluginModule : themeModule;\n\n this.sort = this.sort.bind(this);\n this.reverse = this.reverse.bind(this);\n this.search = this.search.bind(this);\n\n this.onAddonChanges = function(){\n this.forceUpdate()\n }\n this.onAddonChanges = this.onAddonChanges.bind(this)\n }\n\n componentDidMount(){\n const type = (this.isPlugins ? \"plugin\" : \"theme\") + \"-\"\n bdEvents.on(`${type}loaded`, this.onAddonChanges)\n bdEvents.on(`${type}unloaded`, this.onAddonChanges)\n bdEvents.on(`${type}reloaded`, this.onAddonChanges)\n }\n\n componentWillUnmount(){\n const type = (this.isPlugins ? \"plugin\" : \"theme\") + \"-\"\n bdEvents.off(`${type}loaded`, this.onAddonChanges)\n bdEvents.off(`${type}unloaded`, this.onAddonChanges)\n bdEvents.off(`${type}reloaded`, this.onAddonChanges)\n }\n\n openFolder() {\n const shell = require(\"electron\").shell;\n const open = shell.openPath || shell.openItem;\n open(this.isPlugins ? ContentManager.pluginsFolder : ContentManager.themesFolder);\n }\n\n edit(name) {\n console.log(name);\n this.manager.edit(name);\n }\n\n async delete(name) {\n const shouldDelete = await this.confirmDelete(name);\n if (!shouldDelete) return;\n this.manager.delete(name);\n }\n\n confirmDelete(name) {\n return new Promise(resolve => {\n BdApi.showConfirmationModal(\"Are You Sure?\", `Are you sure you want to delete ${name}?`, {\n danger: true,\n confirmText: \"Delete\",\n onConfirm: () => {resolve(true);},\n onCancel: () => {resolve(false);}\n });\n });\n }\n\n get sortOptions() {\n return [\n {label: \"Name\", value: \"name\"},\n {label: \"Author\", value: \"author\"},\n {label: \"Version\", value: \"version\"},\n {label: \"Recently Added\", value: \"added\"},\n {label: \"Last Modified\", value: \"modified\"},\n {label: \"File Size\", value: \"size\"},\n ];\n }\n\n get directions() {\n return [\n {label: \"Ascending\", value: true},\n {label: \"Descending\", value: false}\n ];\n }\n\n reverse(value) {\n this.setState({ascending: value});\n }\n\n sort(value) {\n this.setState({sort: value});\n }\n\n search(event) {\n this.setState({query: event.target.value.toLocaleLowerCase()});\n }\n\n getProps(addon) {\n return {\n key: this.getName(addon),\n enabled: this.cookie[this.getName(addon)],\n toggle: this.manager.toggle.bind(this.manager),\n edit: settingsCookie[\"fork-ps-7\"] ? this.edit.bind(this) : null,\n remove: this.delete.bind(this),\n addon: addon,\n hash: addon.hash\n };\n }\n\n getString(value) {\n if (!value) return \"???\";\n return typeof value == \"string\" ? value : value.toString();\n }\n\n get list(){\n return this.props.type === \"plugins\" ? Object.values(bdplugins) : Object.values(bdthemes);\n }\n\n getAddons() {\n const sortedAddons = this.list.sort((a, b) => {\n const cap = this.state.sort.charAt(0).toUpperCase() + this.state.sort.slice(1);\n const first = a.plugin && a.plugin[`get${cap}`] ? this.getString(a.plugin[`get${cap}`]()) : this.getString(a[this.state.sort]);\n const second = b.plugin && b.plugin[`get${cap}`] ? this.getString(b.plugin[`get${cap}`]()) : this.getString(b[this.state.sort]);\n if (typeof(first) == \"string\") return first.toLocaleLowerCase().localeCompare(second.toLocaleLowerCase());\n if (first > second) return 1;\n if (second > first) return -1;\n return 0;\n });\n if (!this.state.ascending) sortedAddons.reverse();\n const rendered = [];\n for (let a = 0; a < sortedAddons.length; a++) {\n const addon = sortedAddons[a];\n if (this.state.query) {\n let matches = null;\n const name = this.getName(addon);\n const author = this.getAuthor(addon);\n const description = this.getDescription(addon);\n const version = this.getVersion(addon);\n if (name) matches = name.toLocaleLowerCase().includes(this.state.query);\n if (author) matches = matches || author.toLocaleLowerCase().includes(this.state.query);\n if (description) matches = matches || description.toLocaleLowerCase().includes(this.state.query);\n if (version) matches = matches || version.toLocaleLowerCase().includes(this.state.query);\n if (!matches) continue;\n }\n const props = this.getProps(addon);\n rendered.push();\n }\n return rendered;\n }\n\n getName(addon) {return this.getString(addon.plugin ? addon.plugin.getName() : addon.name);}\n getAuthor(addon) {return this.getString(addon.plugin ? addon.plugin.getAuthor() : addon.author);}\n getDescription(addon) {return this.getString(addon.plugin ? addon.plugin.getDescription() : addon.description);}\n getVersion(addon) {return this.getString(addon.plugin ? addon.plugin.getVersion() : addon.version);}\n\n renderCheckUpdates(){\n if(!window.ZeresPluginLibrary)return null\n if(!window.PluginUpdates)return null\n if(typeof window.PluginUpdates.checkAll !== \"function\")return null\n if(!this.isPlugins)return null\n\n let tooltipIsShowing = false\n let tooltip\n return \n {\n tooltipIsShowing = false\n tooltip.hide()\n }}>\n {\n try{\n Utils.showToast(\"Plugin update check in progress.\", {type: \"info\"})\n window.PluginUpdates.checkAll()\n .then(() => {\n Utils.showToast(\"Plugin update check complete.\", {type: \"success\"})\n }).catch(err => {\n console.error(err)\n Utils.showToast(\"An error occured while checking update.\", {type: \"error\"})\n })\n }catch(e){\n console.error(e)\n Utils.showToast(\"An error occured while checking update.\", {type: \"error\"})\n }\n }} wrapper={false} disabled={false} onRightClick={() => {\n if(!this.refs.checkUpdateButton)return\n if (!window.PluginUpdates || !window.PluginUpdates.plugins) return;\n if(tooltipIsShowing)return\n tooltip = new EmulatedTooltip(this.refs.checkUpdateButton.refs.original.refs.button, Object.values(window.PluginUpdates.plugins).map(p => p.name).join(\", \"), {\n side: \"bottom\",\n attachEvents: false\n })\n tooltip.show()\n tooltipIsShowing = true\n }}>\n Check for Updates\n \n \n \n }\n\n render() {\n const refreshIcon = \n {(props) => \n {\n if (this.isPlugins) pluginModule.updatePluginList();\n else themeModule.updateThemeList();\n this.forceUpdate();\n }} />\n };\n const addonCards = this.getAddons();\n\n return \n \n Open {this.isPlugins ? \"Plugin\" : \"Theme\"} Folder\n \n {this.renderCheckUpdates()}\n {!settingsCookie[\"fork-ps-5\"] && refreshIcon}\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n \n
\n
\n
{addonCards}
\n
\n }\n}\n\nconst originalRender = CardList.prototype.render;\nObject.defineProperty(CardList.prototype, \"render\", {\n enumerable: false,\n configurable: false,\n set: function() {console.warn(\"Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins\");},\n get: () => originalRender\n});","import {settingsRPC, defaultRPC} from \"../0globals\";\n\nconst dispatcher = BDModules.get(m=>m.Dispatcher&&m.default&&m.default.dispatch)[0].default\nconst ActionTypes = BDModules.get(m=>m.ActionTypes)[0].ActionTypes\n\nconst socketId = \"lightcord-spoof-socket\"\nconst pid = process.pid\n\nexport default new class CustomRichPresence {\n constructor(){\n this.enabled = false\n\n this.game = settingsRPC\n }\n \n get formatedGame(){\n if(!this.game)return null\n if(this.enabled === false)return null\n let game = {\n name: this.game.name || defaultRPC.name,\n application_id: this.game.application_id || defaultRPC.application_id,\n details: this.game.details || undefined,\n state: this.game.state || undefined,\n timestamps: this.game[\"timestamps.start\"] ? {\n start: this.game[\"timestamps.start\"]\n } : undefined,\n assets: this.game[\"assets.large\"] ? {\n large_image: this.game[\"assets.large\"],\n small_image: this.game[\"assets.small\"] || undefined\n } : undefined\n }\n return game\n }\n\n sendGame(){\n dispatcher.dispatch({\n type: ActionTypes.LOCAL_ACTIVITY_UPDATE,\n socketId,\n pid,\n activity: this.formatedGame\n }) \n }\n\n enable() {\n if(this.enabled)return\n this.enabled = true\n console.log(\"Enabling custom RichPresence\")\n\n this.set(settingsRPC || Object.create(defaultRPC))\n\n this.sendGame()\n }\n\n disable() {\n if(!this.enabled)return\n this.enabled = false\n console.log(\"Disabling custom RichPresence\")\n\n this.sendGame()\n }\n\n async fetchAssets(applicationId){\n let assets = await BDModules.get(e => e.getAssets)[0].getAssets(applicationId)\n if(assets.undefined && typeof assets.undefined === \"number\"){\n throw new Error(\"Unknown Application\")\n }\n return assets\n }\n\n set(activity){\n this.game = activity\n\n this.sendGame()\n }\n}","import BDV2 from \"../modules/v2\";\nimport V2C_SettingsTitle from \"./settingsTitle\";\nimport V2C_SettingsGroup from \"./settingsGroup\";\nimport dataStore from \"../modules/dataStore\";\nimport { defaultRPC, settingsRPC } from \"../0globals\";\nimport CustomRichPresence from \"../modules/CustomRichPresence\"\nimport { remote } from \"electron\";\nimport MarginTop from \"./margintop\";\nimport Utils from \"../modules/utils\";\n\nconst React = BDV2.React;\n\nlet V2C_PresenceSettingsModules\nexport default class V2C_PresenceSettings extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n data: dataStore.getSettingGroup(\"rpc\") || defaultRPC,\n assets: []\n }\n\n this.preview = null\n this.isfetching = false\n if(this.state.data.application_id){\n this.fetchAssets()\n }\n\n this.assetComponents = new Set()\n }\n\n updateWhenFetched(comp){\n this.assetComponents.add(comp)\n }\n\n /**\n * \n * @param {InputText} setting \n */\n onChange(setting, value){\n let defaultSetting = RPCProps.find(e => e.id === setting.props.id)\n\n this.setState({\n data: Object.assign(settingsRPC, this.state.data, {\n [defaultSetting.id]: !!value ? value : null\n }),\n assets: this.state.assets\n })\n if(setting.props.id === \"application_id\"){\n this.fetchAssets()\n }\n\n dataStore.setSettingGroup(\"rpc\", settingsRPC);\n this.preview.forceUpdate()\n CustomRichPresence.set(settingsRPC)\n }\n\n fetchAssets(){\n if(this.isfetching === true){\n let app = this.state.data.application_id\n setTimeout(() => {\n if(this.state.data.application_id !== app){\n return\n }\n this.fetchAssets()\n }, 5000);\n }\n if(!this.state.data.application_id){\n this.setState({\n data: this.state.data,\n assets: []\n })\n this.forceUpdate()\n this.assetComponents.forEach(e => e.forceUpdate())\n return\n }\n this.isfetching = true\n CustomRichPresence.fetchAssets(this.state.data.application_id)\n .then(assets => {\n this.isfetching = false\n this.setState({\n data: this.state.data,\n assets: Object.keys(assets).map(k => {\n let asset = assets[k]\n return {\n id: asset.id,\n name: asset.name,\n type: asset.type\n }\n })\n })\n this.forceUpdate()\n this.assetComponents.forEach(e => e.forceUpdate())\n }).catch(() => {\n this.isfetching = false\n this.setState({\n data: this.state.data,\n assets: []\n })\n this.forceUpdate()\n this.assetComponents.forEach(e => e.forceUpdate())\n })\n }\n\n updatePreview(data){\n this.setState({\n data\n })\n }\n\n get modules(){\n return V2C_PresenceSettingsModules || (V2C_PresenceSettingsModules = [\n BDModules.get(e => e.marginBottom20)[0]\n ])\n }\n\n render() {\n let [\n marginModule\n ] = this.modules\n return [\n ,\n ,\n ,\n
\n {/** options */}\n {this.optionsComponents}\n
,\n
\n \n \n {/** preview */}\n \n
,\n
,\n ,\n \n ]\n }\n\n get optionsComponents(){\n return this._optionsComponents || (this._optionsComponents = RPCProps.map(e => {\n if(e.type === \"text\"){\n return \n }else if(e.type === \"number\"){\n let array = []/*\n if(e.id === \"timestamps.start\"){\n array.unshift( {\n DiscordNative.clipboard.copy(Date.now()+\"\")\n }} />)\n }*/\n return array\n }else if(e.type === \"choice\"){\n if([\"assets.small\", \"assets.large\"].includes(e.id)){\n return {\n return {\n value: \"asset-\"+e.id,\n label: e.name\n }\n }))}/>\n }else{\n return \"Unknown choice.\"\n }\n }\n }))\n }\n}\nconst RPCProps = [\n {\n title: \"Application ID\",\n id: \"application_id\",\n type: \"number\",\n placeholder: \"711416957718757418\"\n },\n {\n title: \"Name\",\n id: \"name\",\n type: \"text\",\n placeholder: \"Lightcord\"\n },\n {\n title: \"Details\",\n id: \"details\",\n type: \"text\",\n placeholder: \"Browsing Discord\"\n },\n {\n title: \"State\",\n id: \"state\",\n type: \"text\",\n placeholder: \"Lightcord Client\"\n },\n {\n title: \"Timestamp Start\",\n id: \"timestamps.start\",\n type: \"number\",\n get placeholder(){\n return Date.now()\n }\n },\n {\n title: \"LargeAsset\",\n id: \"assets.large\",\n type: \"choice\"\n },\n {\n title: \"SmallAsset\",\n id: \"assets.small\",\n type: \"choice\"\n },\n]\n\nlet inputTextModules\nclass InputText extends React.PureComponent {\n get modules(){\n if(inputTextModules && inputTextModules[0])return inputTextModules\n return inputTextModules = [\n BDModules.get(e => e.removeKeybind)[0],\n BDModules.get(e => e.marginBottom20)[0],\n BDModules.get(e => e.defaultMarginh5)[0],\n BDModules.get(e => e.colorStandard)[0],\n BDModules.get(e => e.size32)[0],\n BDModules.get(e => e._horizontal)[0],\n BDModules.get(e => e.inputMini)[0],\n BDModules.get(e => e.size16 && e.size20)[0],\n ]\n }\n\n constructor(props){\n super(props)\n let setting = this.props.setting\n this.state = {\n data: this.props.manager.state.data[setting.id]\n }\n\n this.input = {\n this.setState({\n data: value\n })\n if(!this.lastEdited || this.lastEdited < Date.now() - 500){\n this.props.manager.onChange(this, value)\n this.lastEdited = Date.now()\n }else if(!this.isTiming){\n this.isTiming = setTimeout(() => {\n this.props.manager.onChange(this, this.state.data)\n this.isTiming = null\n this.lastEdited = Date.now()\n }, 500);\n }\n }} type=\"text\"/>\n }\n\n render(){\n let setting = this.props.setting\n\n let [\n rowModule,\n marginModule,\n marginModule2,\n colorModule,\n sizeModule,\n flexModule,\n inputModule,\n sizeModule2,\n ] = this.modules\n\n return (
\n
\n
\n {setting.title}\n
\n {this.input}\n
\n \n
)\n }\n}\n\nlet InputNumberModules\nclass InputNumber extends React.PureComponent {\n get modules(){\n return InputNumberModules || (InputNumberModules = [\n BDModules.get(e => e.removeKeybind)[0],\n BDModules.get(e => e.marginBottom20)[0],\n BDModules.get(e => e.defaultMarginh5)[0],\n BDModules.get(e => e.colorStandard)[0],\n BDModules.get(e => e.size32)[0],\n BDModules.get(e => e._horizontal)[0],\n BDModules.get(e => e.inputMini)[0],\n BDModules.get(e => e.size16 && e.size20)[0],\n BDModules.get(e => e.colorTransparent)[0],\n ])\n }\n\n constructor(props){\n super(props)\n let setting = this.props.setting\n this.state = {\n data: this.props.manager.state.data[setting.id]\n }\n\n this.input = {\n value = value.replace(/[^\\d]+/g, \"\")\n if(value == this.state.data){\n input.setValue(value)\n return\n }\n\n if(!this.lastEdited || this.lastEdited < Date.now() - 500){\n this.props.manager.onChange(this, value)\n this.lastEdited = Date.now()\n }else if(!this.isTiming){\n this.isTiming = setTimeout(() => {\n this.props.manager.onChange(this, this.state.data)\n this.isTiming = null\n this.lastEdited = Date.now()\n }, 500);\n }\n this.setState({\n data: value\n })\n }} type=\"text\"/>\n }\n\n render(){\n let setting = this.props.setting\n\n let [\n rowModule,\n marginModule,\n marginModule2,\n colorModule,\n sizeModule,\n flexModule,\n ] = this.modules\n\n\n return (
\n
\n
\n {setting.title}\n
\n {this.input}\n {setting.id === \"timestamps.start\" ? \n {\n DiscordNative.clipboard.copy(Date.now()+\"\")\n }} color=\"brand\">Copy current timestamp : null}\n
\n \n
)\n }\n}\n\nlet InputChoiceModules\nclass InputChoice extends React.PureComponent {\n constructor(props){\n super(props)\n let setting = this.props.setting\n this.state = {\n data: this.props.manager.state.data[setting.id] ? \"asset-\"+this.props.manager.state.data[setting.id] : \"none\"\n }\n this.props.manager.updateWhenFetched(this)\n }\n\n onChange(data){\n let value = data.value\n\n if(!this.lastEdited || this.lastEdited < Date.now() - 500){\n this.props.manager.onChange(this, value === \"none\" ? null : value.replace(\"asset-\", \"\"))\n this.lastEdited = Date.now()\n }else if(!this.isTiming){\n this.isTiming = setTimeout(() => {\n this.props.manager.onChange(this, this.state.data === \"none\" ? null : this.state.data.replace(\"asset-\", \"\"))\n this.isTiming = null\n this.lastEdited = Date.now()\n }, 500);\n }\n this.setState({\n data: value\n })\n this.forceUpdate()\n }\n \n get modules(){\n return InputChoiceModules || (InputChoiceModules = [\n BDModules.get(e => e.removeKeybind)[0],\n BDModules.get(e => e.marginBottom20)[0],\n BDModules.get(e => e.defaultMarginh5)[0],\n BDModules.get(e => e.colorStandard)[0],\n BDModules.get(e => e.size32)[0],\n BDModules.get(e => e._horizontal)[0]\n ])\n }\n\n render(){\n let setting = this.props.setting\n\n let [\n rowModule,\n marginModule,\n marginModule2,\n colorModule,\n sizeModule,\n flexModule\n ] = this.modules\n \n let options = this.props.manager.state.assets.map(e => {\n return {\n value: \"asset-\"+e.id,\n label: e.name\n }\n })\n\n options.unshift({\n value: \"none\",\n label: \"No assets\"\n })\n\n return (
\n
\n
\n {setting.title}\n
\n \n {/*