diff --git a/main.js b/main.js index 2df9aac..712ea95 100644 --- a/main.js +++ b/main.js @@ -127,19 +127,16 @@ var FsEditor = class { if (mode === "overwrite") { fs.unlinkSync(dst); fs.copyFileSync(src, dst); - new import_obsidian.Notice(`Copy:${src}-->${dst}`, 5e3); return true; } else if (mode === "mtime") { if (fs.statSync(dst).mtimeMs < fs.statSync(src).mtimeMs) { fs.unlinkSync(dst); fs.copyFileSync(src, dst); - new import_obsidian.Notice(`Copy:${src}-->${dst}`, 5e3); return true; } } } else { fs.copyFileSync(src, dst); - new import_obsidian.Notice(`Copy:${src}-->${dst}`, 5e3); return true; } return false; @@ -192,14 +189,23 @@ var FsEditor = class { } } } + delete_file_or_dir(path) { + if (this.isfile(path)) { + this.fs.unlinkSync(path); + } else if (this.isdir(path)) { + let items = this.list_dir(path, true); + for (let item of items) { + this.delete_file_or_dir(item); + } + this.fs.rmdirSync(path); + } + } remove_files_not_in_src(src, dst) { - console.log(src, dst); if (!this.isdir(src) || !this.isdir(dst)) { return; } let items = this.list_dir(dst, false); for (let item of items) { - console.log(item); let adst = dst + "/" + item; let asrc = src + "/" + item; if (this.isfile(adst)) { @@ -208,11 +214,35 @@ var FsEditor = class { } } else if (this.isdir(adst)) { if (!this.isdir(asrc)) { - this.fs.rmdirSync(dst); + this.delete_file_or_dir(adst); + } else { + this.remove_files_not_in_src(asrc, adst); } } } } + mirror_folder(src, dst, mode = "mtime", strict = false) { + if (!this.isdir(src)) { + return; + } + this.mkdir_recursive(dst); + if (!this.isdir(dst)) { + return; + } + let items = this.list_dir(src, false); + for (let item of items) { + let asrc = this.path.join(src, item); + let adst = this.path.join(dst, item); + if (this.isfile(asrc)) { + this.copy_file(asrc, adst, mode); + } else if (this.isdir(asrc)) { + this.mirror_folder(asrc, adst, mode, strict); + } + } + if (strict) { + this.remove_files_not_in_src(src, dst); + } + } modify(path, callback, encoding = "utf8") { let fs = this.fs; if (!fs.existsSync(path)) { @@ -546,4 +576,4 @@ var VaultExpoterPlugin = class extends import_obsidian3.Plugin { } } }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJzcmMvZnNlZGl0b3IudHMiLCAic3JjL3N0cmluZ3MudHMiLCAic3JjL3NldHRpbmcudHMiLCAic3JjL2NvbW1hbmRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgKiBhcyBNb2R1bGUgZnJvbSAnbW9kdWxlJztcclxuaW1wb3J0IHsgQXBwLCBFZGl0b3IsIE1hcmtkb3duVmlldywgTW9kYWwsIE5vdGljZSwgUGx1Z2luLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBURmlsZSwgVEZvbGRlciB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmltcG9ydCB7IEZzRWRpdG9yIH0gZnJvbSAnc3JjL2ZzZWRpdG9yJztcclxuaW1wb3J0IHsgU3RyaW5ncyB9IGZyb20gJ3NyYy9zdHJpbmdzJztcclxuaW1wb3J0IHtWRXhwb3J0ZXJTZXR0aW5ncyxWRXhwb3J0ZXJTZXR0aW5nVGFiLERFRkFVTFRfU0VUVElOR1N9IGZyb20gJ3NyYy9zZXR0aW5nJ1xyXG5cclxuaW1wb3J0IHsgYWRkQ29tbWFuZHMgfSBmcm9tICdzcmMvY29tbWFuZHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmF1bHRFeHBvdGVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzdHJpbmdzIDogU3RyaW5ncztcclxuXHRzZXR0aW5nczogVkV4cG9ydGVyU2V0dGluZ3M7XHJcblx0ZnNFZGl0b3IgOiBGc0VkaXRvcjtcclxuXHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGlmKHRoaXMuYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSl7XHJcblx0XHRcdGF3YWl0IHRoaXMuX29ubG9hZF8oKVxyXG5cdFx0fWVsc2V7XHJcblx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KFxyXG5cdFx0XHRcdGFzeW5jKCk9PntcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX29ubG9hZF8oKVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0KVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgX29ubG9hZF8oKSB7XHJcblx0XHR0aGlzLnN0cmluZ3MgPSBuZXcgU3RyaW5ncygpO1xyXG5cclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblx0XHR0aGlzLmZzRWRpdG9yID0gbmV3IEZzRWRpdG9yKHRoaXMpO1xyXG5cdFx0Ly8gVGhpcyBhZGRzIGEgc2V0dGluZ3MgdGFiIHNvIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwbHVnaW5cclxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgVkV4cG9ydGVyU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cdFx0YWRkQ29tbWFuZHModGhpcyk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3RlckV2ZW50KFxyXG5cdFx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJmaWxlLW1lbnVcIiwgKG1lbnUsIGZpbGUpID0+IHtcclxuXHRcdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcclxuXHRcdFx0XHRcdGl0ZW1cclxuXHRcdFx0XHRcdC5zZXRUaXRsZShcIk1pcnJvciB0byBvdGhlciB2YXVsdFwiKVxyXG5cdFx0XHRcdFx0LnNldEljb24oXCJkb2N1bWVudFwiKVxyXG5cdFx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRsZXQgZHN0ID0gYXdhaXQgdGhpcy5mc0VkaXRvci5zZWxlY3RfdmFsaWRfZGlyKFxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2V0dGluZ3MudmF1bHREaXIuc3BsaXQoXCJcXG5cIilcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0aWYoIWRzdCl7XHJcblx0XHRcdFx0XHRcdFx0bGV0IG5jPSAodGhpcy5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbihcIm5vdGUtY2hhaW5cIik7XHJcblx0XHRcdFx0XHRcdFx0aWYoIW5jKXtcclxuXHRcdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoXCJQbHVnaW4gbm90ZS1jaGFpbiBpcyBuZWVkZWQhXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRkc3QgPSBhd2FpdCBuYy5jaGFpbi50cF9wcm9tcHQoXCJSb290IG9mIHZhdWx0XCIpO1xyXG5cdFx0XHRcdFx0XHRcdGlmKCF0aGlzLmZzRWRpdG9yLmlzZGlyKGRzdCkpe1xyXG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShcIkludmFsaWQgcm9vdDogXCIgKyBkc3QpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZihmaWxlIGluc3RhbmNlb2YgVEZpbGUpe1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZnNFZGl0b3IubWlycm9yX3RmaWxlKGZpbGUsZHN0LCdtdGltZScsdHJ1ZSxmYWxzZSk7XHJcblxyXG5cdFx0XHRcdFx0XHR9ZWxzZSBpZihmaWxlIGluc3RhbmNlb2YgVEZvbGRlcil7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5mc0VkaXRvci5taXJyb3JfdGZvbGRlcihmaWxlLGRzdCwnbXRpbWUnLHRydWUsZmFsc2UpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRvbnVubG9hZCgpIHtcclxuXHRcdFxyXG5cdH1cclxuXHJcblx0Z2V0IG5vdGVjaGFpbigpe1xyXG5cdFx0cmV0dXJuICh0aGlzLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG5cdFxyXG5cdGFzeW5jIGV4cG9ydF9yZWFkbWUodGZpbGU6VEZpbGUsZHN0OnN0cmluZ3xudWxsKXtcclxuXHRcdGxldCBuYyA9ICh0aGlzLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcblx0XHRpZighdGZpbGUpe3RmaWxlID0gbmMuY2hhaW4uY3VycmVudF9ub3RlO31cclxuXHRcdFxyXG5cdFx0Ly8gXHU4QkJFXHU3RjZFXHU4RjkzXHU1MUZBXHU3NkVFXHU1RjU1XHJcblx0XHRpZighZHN0KXtcclxuXHRcdFx0ZHN0ID0gbmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LkRpcjtcclxuXHRcdFx0aWYoIWRzdCl7XHJcblx0XHRcdFx0ZHN0ID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KCdQYXRoIG9mIExvY2FsR2l0UHJvamVjdCcpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZighZHN0IHx8ICF0aGlzLmZzRWRpdG9yLmZzLmV4aXN0c1N5bmMoZHN0KSl7XHJcblx0XHRcdG5ldyBOb3RpY2UodGhpcy5zdHJpbmdzLm5vdGljZV9ub3N1Y2hkaXIsMzAwMCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGRzdCA9IGRzdC5yZXBsYWNlKC9cXFxcL2csJy8nKTtcclxuXHRcdFxyXG5cdFx0XHJcblx0XHQvLyBcdTVCRkNcdTUxRkFcdTVGNTNcdTUyNERcdTdCMTRcdThCQjBcclxuXHRcdGxldCB0bXA7XHJcblx0XHRsZXQgbmFtZSA9IG5jLmVkaXRvci5nZXRfZnJvbnRtYXR0ZXIodGZpbGUsJ3ZleHBvcnRlcicpPy5OYW1lO1xyXG5cdFx0aWYobmFtZSAmJiAhKG5hbWU9PT0nJykpe1xyXG5cdFx0XHR0bXAgPSBkc3QrJy8nK25hbWUrJy5tZCc7XHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0dG1wID0gZHN0KycvJyt0ZmlsZS5iYXNlbmFtZSsnLm1kJztcclxuXHRcdH1cclxuXHJcblx0XHRpZih0aGlzLmZzRWRpdG9yLmNvcHlfdGZpbGUodGZpbGUsdG1wKSl7XHJcblx0XHRcdGlmKG5jLmVkaXRvci5nZXRfZnJvbnRtYXR0ZXIodGZpbGUsJ3ZleHBvcnRlcicpPy5SZW1vdmVNZXRhKXtcclxuXHRcdFx0XHRjb25zdCB1ZnVuYyA9IChwYXRoOnN0cmluZyxkYXRhOnN0cmluZyk9PntcclxuXHRcdFx0XHRcdGxldCByZXMgPSBkYXRhO1xyXG5cdFx0XHRcdFx0aWYobmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LlJlbW92ZU1ldGEpe1xyXG5cdFx0XHRcdFx0XHRyZXMgPSByZXMucmVwbGFjZShcclxuXHRcdFx0XHRcdFx0XHQvLS0tW1xcbihcXHJcXG4pXVtcXHNcXFNdKj8tLS1bXFxuKFxcclxcbildLyxcclxuXHRcdFx0XHRcdFx0XHQnJ1xyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZihuYy5lZGl0b3IuZ2V0X2Zyb250bWF0dGVyKHRmaWxlLCd2ZXhwb3J0ZXInKT8uVXNlR2l0TGluayAmJiBhc3NldHMpe1xyXG5cdFx0XHRcdFx0XHRyZXMgPSByZXMucmVwbGFjZShcclxuXHRcdFx0XHRcdFx0XHQvXFwhXFxbXFxbKC4qPylcXF1cXF0vZyxcclxuXHRcdFx0XHRcdFx0XHQobWF0Y2g6YW55LCBuYW1lOnN0cmluZykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGAhWyR7bmFtZX1dKCR7YXNzZXRzfS8ke25hbWUucmVwbGFjZSgvIC9nLCclMjAnKX0pYDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiByZXNcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5mc0VkaXRvci5tb2RpZnkodG1wLHVmdW5jKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Ly8gXHU1QkZDXHU1MUZBXHU5NjQ0XHU0RUY2XHJcblx0XHRsZXQgYXNzZXRzID0gbmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LkFzc2V0cztcclxuXHRcdGlmKGFzc2V0cyl7XHJcblx0XHRcdGxldCBvbGlua3MgPSBuYy5jaGFpbi5nZXRfb3V0bGlua3ModGZpbGUpO1xyXG5cdFx0XHRsZXQgYWRpciA9IGRzdCsnLycrYXNzZXRzO1xyXG5cdFx0XHR0aGlzLmZzRWRpdG9yLm1rZGlyX3JlY3Vyc2l2ZShhZGlyKTtcclxuXHRcdFx0Zm9yKGxldCBmIG9mIG9saW5rcyl7XHJcblx0XHRcdFx0aWYoIShmLmV4dGVuc2lvbj09PSdtZCcpKXtcclxuXHRcdFx0XHRcdHRoaXMuZnNFZGl0b3IuY29weV90ZmlsZShmLGFkaXIrJy8nK2YuYmFzZW5hbWUrJy4nK2YuZXh0ZW5zaW9uKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwgIlxyXG5pbXBvcnQgeyBBcHAsIEVkaXRvciwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcsIFRGaWxlLCBURm9sZGVyIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZzRWRpdG9ye1xyXG4gICAgZnM7XHJcbiAgICBwYXRoO1xyXG4gICAgcGx1Z2luIDpQbHVnaW47XHJcblxyXG4gICAgY29uc3RydWN0b3IocGx1Z2luOlBsdWdpbil7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICAgICAgdGhpcy5mcyA9IHJlcXVpcmUoJ2ZzJyk7XHJcbiAgICAgICAgdGhpcy5wYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCl7XHJcbiAgICAgICAgbGV0IGEgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlciBhcyBhbnk7XHJcbiAgICAgICAgcmV0dXJuIGEuYmFzZVBhdGgucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5vdGVjaGFpbigpe1xyXG4gICAgICAgIGxldCBuYyA9ICh0aGlzLnBsdWdpbi5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbignbm90ZS1jaGFpbicpO1xyXG4gICAgICAgIHJldHVybiBuY1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhYnNwYXRoKHRmaWxlOlRGaWxlfFRGb2xkZXIpe1xyXG5cdFx0aWYodGZpbGUpe1xyXG5cdFx0XHRyZXR1cm4gKHRoaXMucm9vdCsnLycrdGZpbGUucGF0aCkucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuICAgIGlzZmlsZShwYXRoOnN0cmluZyl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnMuZXhpc3RzU3luYyhwYXRoKSAmJiB0aGlzLmZzLnN0YXRTeW5jKHBhdGgpLmlzRmlsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzZGlyKHBhdGg6c3RyaW5nKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5mcy5leGlzdHNTeW5jKHBhdGgpICYmIHRoaXMuZnMuc3RhdFN5bmMocGF0aCkuaXNEaXJlY3RvcnkoKTtcclxuICAgIH1cclxuXHJcbiAgICBsaXN0X2RpcihwYXRoOnN0cmluZyxhc19mdWxscGF0aD10cnVlKXtcclxuICAgICAgICBpZighdGhpcy5pc2RpcihwYXRoKSl7cmV0dXJuIFtdfVxyXG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMuZnMucmVhZGRpclN5bmMocGF0aClcclxuICAgICAgICBpZihhc19mdWxscGF0aCl7XHJcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKFxyXG4gICAgICAgICAgICAgICAgKHg6c3RyaW5nKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoKycvJyt4XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9ICAgXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zXHJcbiAgICB9XHJcblxyXG4gICAgZmlyc3RfdmFsaWRfZGlyKHBhdGhzOkFycmF5PHN0cmluZz58c3RyaW5nKXtcclxuICAgICAgICBpZih0eXBlb2YocGF0aHMpPT0nc3RyaW5nJyl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuaXNkaXIocGF0aHMpKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoc1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yKGxldCBwYXRoIG9mIHBhdGhzKXtcclxuICAgICAgICAgICAgaWYodGhpcy5pc2RpcihwYXRoKSl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZWxlY3RfdmFsaWRfZGlyKHBhdGhzOkFycmF5PHN0cmluZz4pe1xyXG4gICAgICAgIGxldCB4cGF0aHMgPSBwYXRocy5maWx0ZXIoKHA6c3RyaW5nKT0+dGhpcy5pc2RpcihwKSk7XHJcbiAgICAgICAgaWYoeHBhdGhzLmxlbmd0aD09PTApe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9ZWxzZSBpZih4cGF0aHMubGVuZ3RoPT0xKXtcclxuICAgICAgICAgICAgcmV0dXJuIHhwYXRoc1swXTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgbGV0IG5jID0gKHRoaXMucGx1Z2luLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcbiAgICAgICAgICAgIGlmKG5jKXtcclxuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gYXdhaXQgbmMuY2hhaW4udHBfc3VnZ2VzdGVyKHhwYXRocyx4cGF0aHMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICBta2Rpcl9yZWN1cnNpdmUocGF0aDpzdHJpbmcpe1xyXG4gICAgICAgIGlmKHRoaXMuaXNkaXIocGF0aCkpe3JldHVybiB0cnVlO31cclxuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXRoLmRpcm5hbWUocGF0aCk7XHJcbiAgICAgICAgaWYoIXRoaXMuaXNkaXIocGFyZW50KSl7XHJcbiAgICAgICAgICAgIHRoaXMubWtkaXJfcmVjdXJzaXZlKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZnMubWtkaXJTeW5jKHBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG5cdCogXHU5NjQ0XHU0RUY2IHNyYyBcdTUyMzAgZHN0XHVGRjBDXHU0RTBEXHU1NzI4IHZhdWx0IFx1NEUyRFx1RkYwQ1x1OTcwMFx1ODk4MVx1N0VERFx1NUJGOVx1OERFRlx1NUY4NFxyXG5cdCogb3ZlcndyaXRlXHVGRjBDXHU1OTBEXHU3NkQ2XHVGRjFCbXRpbWVcdUZGMENcdTY1QjBcdTY1ODdcdTRFRjZcdUZGMUJcclxuXHQqL1xyXG4gICAgY29weV9maWxlKHNyYzpzdHJpbmcsZHN0OnN0cmluZyxtb2RlPSdwYXNzPm92ZXJ3cml0ZT5tdGltZScpIHtcclxuICAgICAgICBsZXQgZnMgPSB0aGlzLmZzO1xyXG5cclxuICAgICAgICBtb2RlID0gbW9kZS5zcGxpdCgnPicpWzBdXHJcbiAgICAgICAgaWYoIWZzLmV4aXN0c1N5bmMoc3JjKSl7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZnMuZXhpc3RzU3luYyhkc3QpKXtcclxuICAgICAgICAgICAgaWYobW9kZT09PSdvdmVyd3JpdGUnKXtcclxuICAgICAgICAgICAgICAgIGZzLnVubGlua1N5bmMoZHN0KTtcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmMsZHN0KTtcclxuICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoYENvcHk6JHtzcmN9LS0+JHtkc3R9YCw1MDAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihtb2RlPT09J210aW1lJyl7XHJcbiAgICAgICAgICAgICAgICAvLyBkc3QgXHU2NkY0XHU2NUIwXHU2NUY2XHU5NUY0XHU1QzBGXHU0RThFIHNyY1xyXG4gICAgICAgICAgICAgICAgaWYoZnMuc3RhdFN5bmMoZHN0KS5tdGltZU1zPGZzLnN0YXRTeW5jKHNyYykubXRpbWVNcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhkc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmMsZHN0KTtcclxuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKGBDb3B5OiR7c3JjfS0tPiR7ZHN0fWAsNTAwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKHNyYyxkc3QpO1xyXG4gICAgICAgICAgICBuZXcgTm90aWNlKGBDb3B5OiR7c3JjfS0tPiR7ZHN0fWAsNTAwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29weV90ZmlsZSh0ZmlsZTpURmlsZSwgZHN0OnN0cmluZyxtb2RlPSdtdGltZScpIHtcclxuXHRcdGlmKHRmaWxlKXtcclxuXHRcdFx0bGV0IHNyYyA9IHRoaXMuYWJzcGF0aCh0ZmlsZSk7XHJcblx0XHRcdHJldHVybiBzcmMgJiYgdGhpcy5jb3B5X2ZpbGUoc3JjLGRzdCxtb2RlKTtcclxuXHRcdH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuICAgIG1pcnJvcl90ZmlsZSh0ZmlsZTpURmlsZSx2YXVsdF9yb290OnN0cmluZyxtb2RlPSdtdGltZScsYXR0YWNobWVudD10cnVlLG91dGxpbms9ZmFsc2Upe1xyXG4gICAgICAgIC8vIFx1NUMwNlx1N0IxNFx1OEJCMFx1OTU1Q1x1NTBDRlx1NzlGQlx1NTJBOFx1NTIzMFx1NTIyQlx1NzY4NFx1NUU5M1x1NEUyRFx1RkYwQ1x1NjU4N1x1NEVGNlx1N0VEM1x1Njc4NFx1NEUwRVx1NUY1M1x1NTI0RFx1NUU5M1x1NzZGOFx1NTQwQ1xyXG4gICAgICAgIGlmKHRmaWxlKXtcclxuICAgICAgICAgICAgdmF1bHRfcm9vdCA9IHZhdWx0X3Jvb3QucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHRcdGxldCBzcmMgPSB0aGlzLnJvb3QgKyAnLycgKyB0ZmlsZS5wYXRoO1xyXG4gICAgICAgICAgICBsZXQgZHN0ID0gdmF1bHRfcm9vdCsnLycrdGZpbGUucGF0aDtcclxuICAgICAgICAgICAgdGhpcy5ta2Rpcl9yZWN1cnNpdmUodGhpcy5wYXRoLmRpcm5hbWUoZHN0KSk7XHJcblx0XHRcdHRoaXMuY29weV9maWxlKHNyYyxkc3QsbW9kZSk7XHJcbiAgICAgICAgICAgIGlmKGF0dGFjaG1lbnQpe1xyXG4gICAgICAgICAgICAgICAgbGV0IG5jID0gdGhpcy5ub3RlY2hhaW47XHJcbiAgICAgICAgICAgICAgICBpZighbmMpe3JldHVybjt9XHJcbiAgICAgICAgICAgICAgICBsZXQgdGZpbGVzID0gbmMuY2hhaW4uZ2V0X291dGxpbmtzKHRmaWxlLGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgdCBvZiB0ZmlsZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCEodC5leHRlbnNpb249PT0nbWQnKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWlycm9yX3RmaWxlKHQsdmF1bHRfcm9vdCxtb2RlLGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihvdXRsaW5rKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JfdGZpbGUodCx2YXVsdF9yb290LG1vZGUsZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cdFx0fVxyXG4gICAgfVxyXG5cclxuICAgIG1pcnJvcl90Zm9sZGVyKHRmb2xkZXI6VEZvbGRlcix2YXVsdF9yb290OnN0cmluZyxtb2RlPSdtdGltZScsYXR0YWNobWVudD10cnVlLG91dGxpbms9ZmFsc2Usc3RyaWN0PWZhbHNlKXtcclxuICAgICAgICBpZih0Zm9sZGVyKXtcclxuICAgICAgICAgICAgZm9yKGxldCB0IG9mIHRmb2xkZXIuY2hpbGRyZW4pe1xyXG4gICAgICAgICAgICAgICAgaWYodCBpbnN0YW5jZW9mIFRGb2xkZXIpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWlycm9yX3Rmb2xkZXIodCx2YXVsdF9yb290LG1vZGUsYXR0YWNobWVudCxvdXRsaW5rKTtcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHQgaW5zdGFuY2VvZiBURmlsZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JfdGZpbGUodCx2YXVsdF9yb290LG1vZGUsYXR0YWNobWVudCxvdXRsaW5rKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihzdHJpY3Qpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGRzdCA9IHZhdWx0X3Jvb3QrJy8nK3Rmb2xkZXIucGF0aFxyXG4gICAgICAgICAgICAgICAgbGV0IHNyYyA9IHRoaXMuYWJzcGF0aCh0Zm9sZGVyKVxyXG4gICAgICAgICAgICAgICAgaWYoc3JjICYmIGRzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVfZmlsZXNfbm90X2luX3NyYyhzcmMsZHN0KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblx0XHR9XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlX2ZpbGVzX25vdF9pbl9zcmMoc3JjOnN0cmluZyxkc3Q6c3RyaW5nKXtcclxuICAgICAgICBjb25zb2xlLmxvZyhzcmMsZHN0KVxyXG4gICAgICAgIGlmKCF0aGlzLmlzZGlyKHNyYykgfHwgIXRoaXMuaXNkaXIoZHN0KSl7cmV0dXJufVxyXG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMubGlzdF9kaXIoZHN0LGZhbHNlKVxyXG4gICAgICAgIGZvcihsZXQgaXRlbSBvZiBpdGVtcyl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGl0ZW0pXHJcbiAgICAgICAgICAgIGxldCBhZHN0ID0gZHN0KycvJytpdGVtXHJcbiAgICAgICAgICAgIGxldCBhc3JjID0gc3JjKycvJytpdGVtXHJcbiAgICAgICAgICAgIGlmKHRoaXMuaXNmaWxlKGFkc3QpKXtcclxuICAgICAgICAgICAgICAgIGlmKCF0aGlzLmlzZmlsZShhc3JjKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcy51bmxpbmtTeW5jKGFkc3QpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuaXNkaXIoYWRzdCkpe1xyXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuaXNkaXIoYXNyYykpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnMucm1kaXJTeW5jKGRzdClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtb2RpZnkocGF0aDpzdHJpbmcsY2FsbGJhY2s6RnVuY3Rpb24sZW5jb2Rpbmc9J3V0ZjgnKXtcclxuICAgICAgICBsZXQgZnMgPSB0aGlzLmZzO1xyXG4gICAgICAgIGlmKCFmcy5leGlzdHNTeW5jKHBhdGgpKXtyZXR1cm59O1xyXG5cclxuICAgICAgICBmcy5yZWFkRmlsZShwYXRoLCBlbmNvZGluZywgKGVycjpFcnJvciwgZGF0YTpzdHJpbmcpID0+IHtcclxuXHRcdFx0aWYoZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlYWRpbmcgZmlsZTonLCBlcnIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBycyA9IGNhbGxiYWNrKHBhdGgsZGF0YSk7XHJcblx0XHRcdGZzLndyaXRlRmlsZShwYXRoLCBycywgZW5jb2RpbmcsIChlcnI6RXJyb3IpID0+IHtcclxuXHRcdFx0ICBpZiAoZXJyKSB7XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvcignRXJyb3Igd3JpdGluZyBmaWxlOicsIGVycik7XHJcblx0XHRcdCAgfSBlbHNlIHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygnRmlsZSBjb250ZW50IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xyXG5cdFx0XHQgIH1cclxuXHRcdFx0fSk7XHJcblx0XHQgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwgIlxyXG5leHBvcnQgY2xhc3MgU3RyaW5nc3tcclxuICAgIGxhbmd1YWdlOnN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgbGV0IGxhbmcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhbmd1YWdlJyk7XHJcbiAgICAgICAgaWYobGFuZyl7XHJcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5nO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gJ2VuJztcclxuICAgICAgICB9XHJcblx0fVxyXG5cclxuICAgIGdldCBjbWRfZXhwb3J0X2N1cnJlbnRfbm90ZSgpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUJGQ1x1NTFGQVx1NUY1M1x1NTI0RFx1N0IxNFx1OEJCMCdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdFeHBvcnQgY3VycmVudCBub3RlJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNtZF9zZXRfdmV4cG9ydGVyKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU4QkJFXHU3RjZFXHU1QkZDXHU1MUZBXHU3QjE0XHU4QkIwXHU5MDA5XHU5ODc5J1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ1NldCBjb25maWcgdG8gZXhwb3J0IG5vdGUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgY21kX2V4cG9ydF9wbHVnaW4oKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdTVCRkNcdTUxRkFcdTYzRDJcdTRFRjYnXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnRXhwb3J0IHBsdWdpbic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBwcm9tcHRfcGF0aF9vZl9mb2xkZXIoKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdThGOTNcdTUxNjVcdTY1ODdcdTRFRjZcdTU5MzlcdThERUZcdTVGODQnXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnSW5wdXQgcGF0aCBvZiBmb2xkZXInO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgbm90aWNlX291dHB1dCgpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUJGQ1x1NTFGQVx1RkYxQSdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdPdXRwdXQ6JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgbm90aWNlX25vc3VjaGRpcigpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NjVFMFx1NjU0OFx1NzZFRVx1NUY1NSdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdJbnZhaWQgcGF0aC4nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2V0dGluZ19wbHVnaW5fZGlyKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU2M0QyXHU0RUY2XHU1QkZDXHU1MUZBXHU3NkVFXHU1RjU1JztcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdQbHVnaW4gZGlyIHRvIGV4cG9ydCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZXR0aW5nX3ZhdWx0X2Rpcigpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUU5M1x1NzZFRVx1NUY1NSc7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnUm9vdCBkaXIgb2YgdmF1bHQnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGxldCBzdHJpbmdzID0gbmV3IFN0cmluZ3MoKTsiLCAiaW1wb3J0IHsgXHJcblx0QXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLFBsdWdpblxyXG59IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmltcG9ydCBWYXVsdEV4cG90ZXJQbHVnaW4gZnJvbSAnLi4vbWFpbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFZFeHBvcnRlclNldHRpbmdzIHtcclxuXHRwbHVnaW5EaXJFeHBvcnRlcjpzdHJpbmc7XHJcblx0dmF1bHREaXI6c3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogVkV4cG9ydGVyU2V0dGluZ3MgPSB7XHJcblx0cGx1Z2luRGlyRXhwb3J0ZXI6JycsXHJcblx0dmF1bHREaXI6JydcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFZFeHBvcnRlclNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHRwbHVnaW46IFZhdWx0RXhwb3RlclBsdWdpbjtcclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBWYXVsdEV4cG90ZXJQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0Z2V0U2V0dGluZ1ZhbHVlKGZpZWxkOiBrZXlvZiBWRXhwb3J0ZXJTZXR0aW5ncykge1xyXG5cdFx0cmV0dXJuIHRoaXMucGx1Z2luLnNldHRpbmdzW2ZpZWxkXTtcclxuXHR9XHJcblxyXG5cdGFkZF90b2dnbGUobmFtZTpzdHJpbmcsZGVzYzpzdHJpbmcsZmllbGQ6a2V5b2YgVkV4cG9ydGVyU2V0dGluZ3Mpe1xyXG5cdFx0bGV0IHtjb250YWluZXJFbH0gPSB0aGlzO1xyXG5cdFx0bGV0IHZhbHVlID0gKHRoaXMucGx1Z2luLnNldHRpbmdzIGFzIGFueSlbZmllbGRdIGFzIGJvb2xlYW47XHJcblx0XHRsZXQgaXRlbSA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKSAgXHJcblx0XHRcdC5zZXROYW1lKG5hbWUpXHJcblx0XHRcdC5zZXREZXNjKGRlc2MpXHJcblx0XHRcdC5hZGRUb2dnbGUodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0LnNldFZhbHVlKHZhbHVlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6bmV2ZXIpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzW2ZpZWxkXSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHRcdHJldHVybiBpdGVtO1xyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHtjb250YWluZXJFbH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XHJcblx0XHRcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSh0aGlzLnBsdWdpbi5zdHJpbmdzLnNldHRpbmdfcGx1Z2luX2RpcilcclxuXHRcdFx0LmFkZFRleHRBcmVhKHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5EaXJFeHBvcnRlcilcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5EaXJFeHBvcnRlciA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cdFx0XHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0XHQuc2V0TmFtZSh0aGlzLnBsdWdpbi5zdHJpbmdzLnNldHRpbmdfdmF1bHRfZGlyKVxyXG5cdFx0XHRcdC5hZGRUZXh0QXJlYSh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy52YXVsdERpcilcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudmF1bHREaXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHR9KSk7XHJcblx0fVxyXG59XHJcbiIsICJpbXBvcnQgeyBcclxuXHROb3RpY2UsIFRGaWxlXHJcbn0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuaW1wb3J0IFZhdWx0RXhwb3RlclBsdWdpbiBmcm9tICcuLi9tYWluJztcclxuXHJcbmNvbnN0IGNtZF9leHBvcnRfY3VycmVudF9ub3RlID0gKHBsdWdpbjpWYXVsdEV4cG90ZXJQbHVnaW4pID0+ICh7XHJcblx0aWQ6ICdjbWRfZXhwb3J0X2N1cnJlbnRfbm90ZScsXHJcblx0bmFtZTogcGx1Z2luLnN0cmluZ3MuY21kX2V4cG9ydF9jdXJyZW50X25vdGUsXHJcblx0Y2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuXHRcdGNvbnN0IG5jID0gcGx1Z2luLm5vdGVjaGFpbjtcclxuXHRcdGxldCB0ZmlsZSA9IG5jLmNoYWluLmN1cnJlbnRfbm90ZTtcclxuXHRcdGF3YWl0IHBsdWdpbi5leHBvcnRfcmVhZG1lKHRmaWxlLG51bGwpO1xyXG5cdH1cclxufSk7XHJcblxyXG5jb25zdCBjbWRfc2V0X3ZleHBvcnRlciA9IChwbHVnaW46VmF1bHRFeHBvdGVyUGx1Z2luKSA9PiAoe1xyXG5cdGlkOiAnY21kX3NldF92ZXhwb3J0ZXInLFxyXG5cdG5hbWU6IHBsdWdpbi5zdHJpbmdzLmNtZF9zZXRfdmV4cG9ydGVyLFxyXG5cdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRjb25zdCBuYyA9IHBsdWdpbi5ub3RlY2hhaW47XHJcblx0XHRsZXQgZGlyID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KHBsdWdpbi5zdHJpbmdzLnByb21wdF9wYXRoX29mX2ZvbGRlcik7XHJcblx0XHRsZXQgaXRlbTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cdFx0aWYocGx1Z2luLmZzRWRpdG9yLmZzLmV4aXN0c1N5bmMoZGlyKSl7XHJcblx0XHRcdGl0ZW1bJ0RpciddID0gZGlyO1xyXG5cdFx0fVxyXG5cdFx0aXRlbVsnTmFtZSddID0gJ3JlYWRNZSc7XHJcblx0XHRpdGVtWydBc3NldHMnXSA9ICcuL2Fzc2V0cyc7XHJcblx0XHRpdGVtWydSZW1vdmVNZXRhJ10gPSB0cnVlO1xyXG5cdFx0aXRlbVsnVXNlR2l0TGluayddID0gdHJ1ZTtcclxuXHJcblx0XHRhd2FpdCBuYy5lZGl0b3Iuc2V0X2Zyb250bWF0dGVyKFxyXG5cdFx0XHRuYy5jaGFpbi5jdXJyZW50X25vdGUsXHJcblx0XHRcdCd2ZXhwb3J0ZXInLFxyXG5cdFx0XHRpdGVtXHJcblx0XHQpXHJcblx0fVxyXG59KTtcclxuXHJcbmNvbnN0IGNtZF9leHBvcnRfcGx1Z2luID0gKHBsdWdpbjpWYXVsdEV4cG90ZXJQbHVnaW4pID0+ICh7XHJcblx0aWQ6ICdjbWRfZXhwb3J0X3BsdWdpbicsXHJcblx0bmFtZTogcGx1Z2luLnN0cmluZ3MuY21kX2V4cG9ydF9wbHVnaW4sXHJcblx0Y2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuXHRcdGNvbnN0IG5jID0gcGx1Z2luLm5vdGVjaGFpbjtcclxuXHRcdFxyXG5cdFx0bGV0IHBsdWdpbnMgPSBPYmplY3Qua2V5cygocGx1Z2luLmFwcCBhcyBhbnkpLnBsdWdpbnMucGx1Z2lucyk7XHJcblx0XHRsZXQgcCA9IGF3YWl0IG5jLmNoYWluLnRwX3N1Z2dlc3RlcihwbHVnaW5zLHBsdWdpbnMpO1xyXG5cdFx0bGV0IGVwbHVnaW4gPSAocGx1Z2luLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKHApO1xyXG5cdFx0aWYoZXBsdWdpbil7XHJcblx0XHRcdGxldCB0YXJnZXQgPSBhd2FpdCBwbHVnaW4uZnNFZGl0b3Iuc2VsZWN0X3ZhbGlkX2RpcihcclxuXHRcdFx0XHRwbHVnaW4uc2V0dGluZ3MucGx1Z2luRGlyRXhwb3J0ZXIuc3BsaXQoXCJcXG5cIilcclxuXHRcdFx0KVxyXG5cdFx0XHRpZighcGx1Z2luLmZzRWRpdG9yLmZzLmV4aXN0c1N5bmModGFyZ2V0KSl7XHJcblx0XHRcdFx0dGFyZ2V0ID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KHBsdWdpbi5zdHJpbmdzLnByb21wdF9wYXRoX29mX2ZvbGRlcik7XHJcblx0XHRcdH1cclxuXHRcdFx0dGFyZ2V0ID0gdGFyZ2V0LnJlcGxhY2UoL1xcXFwvZywnLycpO1xyXG5cdFx0XHRpZighdGFyZ2V0LmVuZHNXaXRoKCcvJyArIHApKXtcclxuXHRcdFx0XHR0YXJnZXQgPSB0YXJnZXQgKyAnLycgKyBwO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKCFwbHVnaW4uZnNFZGl0b3IuZnMuZXhpc3RzU3luYyh0YXJnZXQpKXtcclxuXHRcdFx0XHRwbHVnaW4uZnNFZGl0b3IuZnMubWtkaXJTeW5jKHRhcmdldCk7XHJcblx0XHRcdH1cclxuXHRcdFx0bGV0IGl0ZW1zID0gWydtYWluLmpzJywnbWFuaWZlc3QuanNvbicsJ3N0eWxlcy5jc3MnXTtcclxuXHRcdFx0Zm9yKGxldCBpdGVtIG9mIGl0ZW1zKXtcclxuXHRcdFx0XHRsZXQgc3JjID0gYCR7cGx1Z2luLmZzRWRpdG9yLnJvb3R9LyR7ZXBsdWdpbi5tYW5pZmVzdC5kaXJ9LyR7aXRlbX1gO1xyXG5cdFx0XHRcdGxldCBkc3QgPSBgJHt0YXJnZXR9LyR7aXRlbX1gO1xyXG5cdFx0XHRcdHBsdWdpbi5mc0VkaXRvci5jb3B5X2ZpbGUoc3JjLGRzdCwnb3ZlcndyaXRlJyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn0pO1xyXG5cclxuY29uc3QgY29tbWFuZEJ1aWxkZXJzOkFycmF5PEZ1bmN0aW9uPiA9IFtcclxuICAgIFxyXG5dO1xyXG5cclxuY29uc3QgY29tbWFuZEJ1aWxkZXJzRGVza3RvcDpBcnJheTxGdW5jdGlvbj4gPSBbXHJcblx0Y21kX2V4cG9ydF9jdXJyZW50X25vdGUsXHJcblx0Y21kX3NldF92ZXhwb3J0ZXIsXHJcblx0Y21kX2V4cG9ydF9wbHVnaW5cclxuXTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRDb21tYW5kcyhwbHVnaW46VmF1bHRFeHBvdGVyUGx1Z2luKSB7XHJcbiAgICBjb21tYW5kQnVpbGRlcnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgIHBsdWdpbi5hZGRDb21tYW5kKGMocGx1Z2luKSk7XHJcbiAgICB9KTtcclxuXHRpZigocGx1Z2luLmFwcCBhcyBhbnkpLmlzTW9iaWxlPT1mYWxzZSl7XHJcblx0XHRjb21tYW5kQnVpbGRlcnNEZXNrdG9wLmZvckVhY2goKGMpID0+IHtcclxuXHRcdFx0cGx1Z2luLmFkZENvbW1hbmQoYyhwbHVnaW4pKTtcclxuXHRcdH0pO1xyXG5cdH1cclxufSJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxJQUFBQSxtQkFBNEc7OztBQ0E1RyxzQkFBNEc7QUFFckcsSUFBTSxXQUFOLE1BQWM7QUFBQSxFQUtqQixZQUFZLFFBQWM7QUFDdEIsU0FBSyxTQUFTO0FBQ2QsU0FBSyxLQUFLLFFBQVEsSUFBSTtBQUN0QixTQUFLLE9BQU8sUUFBUSxNQUFNO0FBQUEsRUFDOUI7QUFBQSxFQUVBLElBQUksT0FBTTtBQUNOLFFBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxNQUFNO0FBQzlCLFdBQU8sRUFBRSxTQUFTLFFBQVEsT0FBTSxHQUFHO0FBQUEsRUFDdkM7QUFBQSxFQUVBLElBQUksWUFBVztBQUNYLFFBQUksS0FBTSxLQUFLLE9BQU8sSUFBWSxRQUFRLFVBQVUsWUFBWTtBQUNoRSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBR0EsUUFBUSxPQUFvQjtBQUM5QixRQUFHLE9BQU07QUFDUixjQUFRLEtBQUssT0FBSyxNQUFJLE1BQU0sTUFBTSxRQUFRLE9BQU0s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TUFBTTtBQUNWLGVBQUdELE1BQUEsR0FBRyxPQUFPLGdCQUFnQixPQUFNLFdBQVcsTUFBM0MsZ0JBQUFBLElBQThDLFlBQVc7QUFDM0Qsa0JBQU0sSUFBSTtBQUFBLGNBQ1Q7QUFBQSxjQUNBO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFDQSxnQkFBR0MsTUFBQSxHQUFHLE9BQU8sZ0JBQWdCLE9BQU0sV0FBVyxNQUEzQyxnQkFBQUEsSUFBOEMsZUFBYyxRQUFPO0FBQ3JFLGtCQUFNLElBQUk7QUFBQSxjQUNUO0FBQUEsY0FDQSxDQUFDLE9BQVdDLFVBQWdCO0FBQzNCLHVCQUFPLEtBQUtBLFVBQVMsVUFBVUEsTUFBSyxRQUFRLE1BQUssS0FBSztBQUFBLGNBQ3ZEO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFDQSxpQkFBTztBQUFBLFFBQ1I7QUFDQSxjQUFNLEtBQUssU0FBUyxPQUFPLEtBQUksS0FBSztBQUFBLE1BQ3JDO0FBQUEsSUFDRDtBQUVBLFFBQUksVUFBUyxRQUFHLE9BQU8sZ0JBQWdCLE9BQU0sV0FBVyxNQUEzQyxtQkFBOEM7QUFDM0QsUUFBRyxRQUFPO0FBQ1QsVUFBSSxTQUFTLEdBQUcsTUFBTSxhQUFhLEtBQUs7QUFDeEMsVUFBSSxPQUFPLE1BQUksTUFBSTtBQUNuQixXQUFLLFNBQVMsZ0JBQWdCLElBQUk7QUFDbEMsZUFBUSxLQUFLLFFBQU87QUFDbkIsWUFBRyxFQUFFLEVBQUUsY0FBWSxPQUFNO0FBQ3hCLGVBQUssU0FBUyxXQUFXLEdBQUUsT0FBSyxNQUFJLEVBQUUsV0FBUyxNQUFJLEVBQUUsU0FBUztBQUFBLFFBQy9EO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFBQSxFQUNEO0FBQ0Q7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJlcnIiLCAiaW1wb3J0X29ic2lkaWFuIiwgInZhbHVlIiwgIl9hIiwgIl9iIiwgIm5hbWUiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJzcmMvZnNlZGl0b3IudHMiLCAic3JjL3N0cmluZ3MudHMiLCAic3JjL3NldHRpbmcudHMiLCAic3JjL2NvbW1hbmRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgKiBhcyBNb2R1bGUgZnJvbSAnbW9kdWxlJztcclxuaW1wb3J0IHsgQXBwLCBFZGl0b3IsIE1hcmtkb3duVmlldywgTW9kYWwsIE5vdGljZSwgUGx1Z2luLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBURmlsZSwgVEZvbGRlciB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmltcG9ydCB7IEZzRWRpdG9yIH0gZnJvbSAnc3JjL2ZzZWRpdG9yJztcclxuaW1wb3J0IHsgU3RyaW5ncyB9IGZyb20gJ3NyYy9zdHJpbmdzJztcclxuaW1wb3J0IHtWRXhwb3J0ZXJTZXR0aW5ncyxWRXhwb3J0ZXJTZXR0aW5nVGFiLERFRkFVTFRfU0VUVElOR1N9IGZyb20gJ3NyYy9zZXR0aW5nJ1xyXG5cclxuaW1wb3J0IHsgYWRkQ29tbWFuZHMgfSBmcm9tICdzcmMvY29tbWFuZHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmF1bHRFeHBvdGVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzdHJpbmdzIDogU3RyaW5ncztcclxuXHRzZXR0aW5nczogVkV4cG9ydGVyU2V0dGluZ3M7XHJcblx0ZnNFZGl0b3IgOiBGc0VkaXRvcjtcclxuXHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGlmKHRoaXMuYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSl7XHJcblx0XHRcdGF3YWl0IHRoaXMuX29ubG9hZF8oKVxyXG5cdFx0fWVsc2V7XHJcblx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KFxyXG5cdFx0XHRcdGFzeW5jKCk9PntcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX29ubG9hZF8oKVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0KVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgX29ubG9hZF8oKSB7XHJcblx0XHR0aGlzLnN0cmluZ3MgPSBuZXcgU3RyaW5ncygpO1xyXG5cclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblx0XHR0aGlzLmZzRWRpdG9yID0gbmV3IEZzRWRpdG9yKHRoaXMpO1xyXG5cdFx0Ly8gVGhpcyBhZGRzIGEgc2V0dGluZ3MgdGFiIHNvIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwbHVnaW5cclxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgVkV4cG9ydGVyU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cdFx0YWRkQ29tbWFuZHModGhpcyk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3RlckV2ZW50KFxyXG5cdFx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJmaWxlLW1lbnVcIiwgKG1lbnUsIGZpbGUpID0+IHtcclxuXHRcdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcclxuXHRcdFx0XHRcdGl0ZW1cclxuXHRcdFx0XHRcdC5zZXRUaXRsZShcIk1pcnJvciB0byBvdGhlciB2YXVsdFwiKVxyXG5cdFx0XHRcdFx0LnNldEljb24oXCJkb2N1bWVudFwiKVxyXG5cdFx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRsZXQgZHN0ID0gYXdhaXQgdGhpcy5mc0VkaXRvci5zZWxlY3RfdmFsaWRfZGlyKFxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2V0dGluZ3MudmF1bHREaXIuc3BsaXQoXCJcXG5cIilcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0aWYoIWRzdCl7XHJcblx0XHRcdFx0XHRcdFx0bGV0IG5jPSAodGhpcy5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbihcIm5vdGUtY2hhaW5cIik7XHJcblx0XHRcdFx0XHRcdFx0aWYoIW5jKXtcclxuXHRcdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoXCJQbHVnaW4gbm90ZS1jaGFpbiBpcyBuZWVkZWQhXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRkc3QgPSBhd2FpdCBuYy5jaGFpbi50cF9wcm9tcHQoXCJSb290IG9mIHZhdWx0XCIpO1xyXG5cdFx0XHRcdFx0XHRcdGlmKCF0aGlzLmZzRWRpdG9yLmlzZGlyKGRzdCkpe1xyXG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShcIkludmFsaWQgcm9vdDogXCIgKyBkc3QpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZihmaWxlIGluc3RhbmNlb2YgVEZpbGUpe1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZnNFZGl0b3IubWlycm9yX3RmaWxlKGZpbGUsZHN0LCdtdGltZScsdHJ1ZSxmYWxzZSk7XHJcblxyXG5cdFx0XHRcdFx0XHR9ZWxzZSBpZihmaWxlIGluc3RhbmNlb2YgVEZvbGRlcil7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5mc0VkaXRvci5taXJyb3JfdGZvbGRlcihmaWxlLGRzdCwnbXRpbWUnLHRydWUsZmFsc2UpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRvbnVubG9hZCgpIHtcclxuXHRcdFxyXG5cdH1cclxuXHJcblx0Z2V0IG5vdGVjaGFpbigpe1xyXG5cdFx0cmV0dXJuICh0aGlzLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG5cdFxyXG5cdGFzeW5jIGV4cG9ydF9yZWFkbWUodGZpbGU6VEZpbGUsZHN0OnN0cmluZ3xudWxsKXtcclxuXHRcdGxldCBuYyA9ICh0aGlzLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcblx0XHRpZighdGZpbGUpe3RmaWxlID0gbmMuY2hhaW4uY3VycmVudF9ub3RlO31cclxuXHRcdFxyXG5cdFx0Ly8gXHU4QkJFXHU3RjZFXHU4RjkzXHU1MUZBXHU3NkVFXHU1RjU1XHJcblx0XHRpZighZHN0KXtcclxuXHRcdFx0ZHN0ID0gbmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LkRpcjtcclxuXHRcdFx0aWYoIWRzdCl7XHJcblx0XHRcdFx0ZHN0ID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KCdQYXRoIG9mIExvY2FsR2l0UHJvamVjdCcpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZighZHN0IHx8ICF0aGlzLmZzRWRpdG9yLmZzLmV4aXN0c1N5bmMoZHN0KSl7XHJcblx0XHRcdG5ldyBOb3RpY2UodGhpcy5zdHJpbmdzLm5vdGljZV9ub3N1Y2hkaXIsMzAwMCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGRzdCA9IGRzdC5yZXBsYWNlKC9cXFxcL2csJy8nKTtcclxuXHRcdFxyXG5cdFx0XHJcblx0XHQvLyBcdTVCRkNcdTUxRkFcdTVGNTNcdTUyNERcdTdCMTRcdThCQjBcclxuXHRcdGxldCB0bXA7XHJcblx0XHRsZXQgbmFtZSA9IG5jLmVkaXRvci5nZXRfZnJvbnRtYXR0ZXIodGZpbGUsJ3ZleHBvcnRlcicpPy5OYW1lO1xyXG5cdFx0aWYobmFtZSAmJiAhKG5hbWU9PT0nJykpe1xyXG5cdFx0XHR0bXAgPSBkc3QrJy8nK25hbWUrJy5tZCc7XHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0dG1wID0gZHN0KycvJyt0ZmlsZS5iYXNlbmFtZSsnLm1kJztcclxuXHRcdH1cclxuXHJcblx0XHRpZih0aGlzLmZzRWRpdG9yLmNvcHlfdGZpbGUodGZpbGUsdG1wKSl7XHJcblx0XHRcdGlmKG5jLmVkaXRvci5nZXRfZnJvbnRtYXR0ZXIodGZpbGUsJ3ZleHBvcnRlcicpPy5SZW1vdmVNZXRhKXtcclxuXHRcdFx0XHRjb25zdCB1ZnVuYyA9IChwYXRoOnN0cmluZyxkYXRhOnN0cmluZyk9PntcclxuXHRcdFx0XHRcdGxldCByZXMgPSBkYXRhO1xyXG5cdFx0XHRcdFx0aWYobmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LlJlbW92ZU1ldGEpe1xyXG5cdFx0XHRcdFx0XHRyZXMgPSByZXMucmVwbGFjZShcclxuXHRcdFx0XHRcdFx0XHQvLS0tW1xcbihcXHJcXG4pXVtcXHNcXFNdKj8tLS1bXFxuKFxcclxcbildLyxcclxuXHRcdFx0XHRcdFx0XHQnJ1xyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZihuYy5lZGl0b3IuZ2V0X2Zyb250bWF0dGVyKHRmaWxlLCd2ZXhwb3J0ZXInKT8uVXNlR2l0TGluayAmJiBhc3NldHMpe1xyXG5cdFx0XHRcdFx0XHRyZXMgPSByZXMucmVwbGFjZShcclxuXHRcdFx0XHRcdFx0XHQvXFwhXFxbXFxbKC4qPylcXF1cXF0vZyxcclxuXHRcdFx0XHRcdFx0XHQobWF0Y2g6YW55LCBuYW1lOnN0cmluZykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGAhWyR7bmFtZX1dKCR7YXNzZXRzfS8ke25hbWUucmVwbGFjZSgvIC9nLCclMjAnKX0pYDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiByZXNcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5mc0VkaXRvci5tb2RpZnkodG1wLHVmdW5jKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Ly8gXHU1QkZDXHU1MUZBXHU5NjQ0XHU0RUY2XHJcblx0XHRsZXQgYXNzZXRzID0gbmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LkFzc2V0cztcclxuXHRcdGlmKGFzc2V0cyl7XHJcblx0XHRcdGxldCBvbGlua3MgPSBuYy5jaGFpbi5nZXRfb3V0bGlua3ModGZpbGUpO1xyXG5cdFx0XHRsZXQgYWRpciA9IGRzdCsnLycrYXNzZXRzO1xyXG5cdFx0XHR0aGlzLmZzRWRpdG9yLm1rZGlyX3JlY3Vyc2l2ZShhZGlyKTtcclxuXHRcdFx0Zm9yKGxldCBmIG9mIG9saW5rcyl7XHJcblx0XHRcdFx0aWYoIShmLmV4dGVuc2lvbj09PSdtZCcpKXtcclxuXHRcdFx0XHRcdHRoaXMuZnNFZGl0b3IuY29weV90ZmlsZShmLGFkaXIrJy8nK2YuYmFzZW5hbWUrJy4nK2YuZXh0ZW5zaW9uKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwgIlxyXG5pbXBvcnQgeyBBcHAsIEVkaXRvciwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcsIFRGaWxlLCBURm9sZGVyIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZzRWRpdG9ye1xyXG4gICAgZnM7XHJcbiAgICBwYXRoO1xyXG4gICAgcGx1Z2luIDpQbHVnaW47XHJcblxyXG4gICAgY29uc3RydWN0b3IocGx1Z2luOlBsdWdpbil7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICAgICAgdGhpcy5mcyA9IHJlcXVpcmUoJ2ZzJyk7XHJcbiAgICAgICAgdGhpcy5wYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCl7XHJcbiAgICAgICAgbGV0IGEgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlciBhcyBhbnk7XHJcbiAgICAgICAgcmV0dXJuIGEuYmFzZVBhdGgucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5vdGVjaGFpbigpe1xyXG4gICAgICAgIGxldCBuYyA9ICh0aGlzLnBsdWdpbi5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbignbm90ZS1jaGFpbicpO1xyXG4gICAgICAgIHJldHVybiBuY1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhYnNwYXRoKHRmaWxlOlRGaWxlfFRGb2xkZXIpe1xyXG5cdFx0aWYodGZpbGUpe1xyXG5cdFx0XHRyZXR1cm4gKHRoaXMucm9vdCsnLycrdGZpbGUucGF0aCkucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuICAgIGlzZmlsZShwYXRoOnN0cmluZyl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnMuZXhpc3RzU3luYyhwYXRoKSAmJiB0aGlzLmZzLnN0YXRTeW5jKHBhdGgpLmlzRmlsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzZGlyKHBhdGg6c3RyaW5nKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5mcy5leGlzdHNTeW5jKHBhdGgpICYmIHRoaXMuZnMuc3RhdFN5bmMocGF0aCkuaXNEaXJlY3RvcnkoKTtcclxuICAgIH1cclxuXHJcbiAgICBsaXN0X2RpcihwYXRoOnN0cmluZyxhc19mdWxscGF0aD10cnVlKXtcclxuICAgICAgICBpZighdGhpcy5pc2RpcihwYXRoKSl7cmV0dXJuIFtdfVxyXG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMuZnMucmVhZGRpclN5bmMocGF0aClcclxuICAgICAgICBpZihhc19mdWxscGF0aCl7XHJcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKFxyXG4gICAgICAgICAgICAgICAgKHg6c3RyaW5nKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoKycvJyt4XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9ICAgXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zXHJcbiAgICB9XHJcblxyXG4gICAgZmlyc3RfdmFsaWRfZGlyKHBhdGhzOkFycmF5PHN0cmluZz58c3RyaW5nKXtcclxuICAgICAgICBpZih0eXBlb2YocGF0aHMpPT0nc3RyaW5nJyl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuaXNkaXIocGF0aHMpKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoc1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yKGxldCBwYXRoIG9mIHBhdGhzKXtcclxuICAgICAgICAgICAgaWYodGhpcy5pc2RpcihwYXRoKSl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZWxlY3RfdmFsaWRfZGlyKHBhdGhzOkFycmF5PHN0cmluZz4pe1xyXG4gICAgICAgIGxldCB4cGF0aHMgPSBwYXRocy5maWx0ZXIoKHA6c3RyaW5nKT0+dGhpcy5pc2RpcihwKSk7XHJcbiAgICAgICAgaWYoeHBhdGhzLmxlbmd0aD09PTApe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9ZWxzZSBpZih4cGF0aHMubGVuZ3RoPT0xKXtcclxuICAgICAgICAgICAgcmV0dXJuIHhwYXRoc1swXTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgbGV0IG5jID0gKHRoaXMucGx1Z2luLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcbiAgICAgICAgICAgIGlmKG5jKXtcclxuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gYXdhaXQgbmMuY2hhaW4udHBfc3VnZ2VzdGVyKHhwYXRocyx4cGF0aHMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICBta2Rpcl9yZWN1cnNpdmUocGF0aDpzdHJpbmcpe1xyXG4gICAgICAgIGlmKHRoaXMuaXNkaXIocGF0aCkpe3JldHVybiB0cnVlO31cclxuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXRoLmRpcm5hbWUocGF0aCk7XHJcbiAgICAgICAgaWYoIXRoaXMuaXNkaXIocGFyZW50KSl7XHJcbiAgICAgICAgICAgIHRoaXMubWtkaXJfcmVjdXJzaXZlKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZnMubWtkaXJTeW5jKHBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG5cdCogXHU5NjQ0XHU0RUY2IHNyYyBcdTUyMzAgZHN0XHVGRjBDXHU0RTBEXHU1NzI4IHZhdWx0IFx1NEUyRFx1RkYwQ1x1OTcwMFx1ODk4MVx1N0VERFx1NUJGOVx1OERFRlx1NUY4NFxyXG5cdCogb3ZlcndyaXRlXHVGRjBDXHU1OTBEXHU3NkQ2XHVGRjFCbXRpbWVcdUZGMENcdTY1QjBcdTY1ODdcdTRFRjZcdUZGMUJcclxuXHQqL1xyXG4gICAgY29weV9maWxlKHNyYzpzdHJpbmcsZHN0OnN0cmluZyxtb2RlPSdwYXNzPm92ZXJ3cml0ZT5tdGltZScpIHtcclxuICAgICAgICBsZXQgZnMgPSB0aGlzLmZzO1xyXG5cclxuICAgICAgICBtb2RlID0gbW9kZS5zcGxpdCgnPicpWzBdXHJcbiAgICAgICAgaWYoIWZzLmV4aXN0c1N5bmMoc3JjKSl7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZnMuZXhpc3RzU3luYyhkc3QpKXtcclxuICAgICAgICAgICAgaWYobW9kZT09PSdvdmVyd3JpdGUnKXtcclxuICAgICAgICAgICAgICAgIGZzLnVubGlua1N5bmMoZHN0KTtcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmMsZHN0KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihtb2RlPT09J210aW1lJyl7XHJcbiAgICAgICAgICAgICAgICAvLyBkc3QgXHU2NkY0XHU2NUIwXHU2NUY2XHU5NUY0XHU1QzBGXHU0RThFIHNyY1xyXG4gICAgICAgICAgICAgICAgaWYoZnMuc3RhdFN5bmMoZHN0KS5tdGltZU1zPGZzLnN0YXRTeW5jKHNyYykubXRpbWVNcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhkc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmMsZHN0KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoc3JjLGRzdCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29weV90ZmlsZSh0ZmlsZTpURmlsZSwgZHN0OnN0cmluZyxtb2RlPSdtdGltZScpIHtcclxuXHRcdGlmKHRmaWxlKXtcclxuXHRcdFx0bGV0IHNyYyA9IHRoaXMuYWJzcGF0aCh0ZmlsZSk7XHJcblx0XHRcdHJldHVybiBzcmMgJiYgdGhpcy5jb3B5X2ZpbGUoc3JjLGRzdCxtb2RlKTtcclxuXHRcdH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuICAgIG1pcnJvcl90ZmlsZSh0ZmlsZTpURmlsZSx2YXVsdF9yb290OnN0cmluZyxtb2RlPSdtdGltZScsYXR0YWNobWVudD10cnVlLG91dGxpbms9ZmFsc2Upe1xyXG4gICAgICAgIC8vIFx1NUMwNlx1N0IxNFx1OEJCMFx1OTU1Q1x1NTBDRlx1NzlGQlx1NTJBOFx1NTIzMFx1NTIyQlx1NzY4NFx1NUU5M1x1NEUyRFx1RkYwQ1x1NjU4N1x1NEVGNlx1N0VEM1x1Njc4NFx1NEUwRVx1NUY1M1x1NTI0RFx1NUU5M1x1NzZGOFx1NTQwQ1xyXG4gICAgICAgIGlmKHRmaWxlKXtcclxuICAgICAgICAgICAgdmF1bHRfcm9vdCA9IHZhdWx0X3Jvb3QucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHRcdGxldCBzcmMgPSB0aGlzLnJvb3QgKyAnLycgKyB0ZmlsZS5wYXRoO1xyXG4gICAgICAgICAgICBsZXQgZHN0ID0gdmF1bHRfcm9vdCsnLycrdGZpbGUucGF0aDtcclxuICAgICAgICAgICAgdGhpcy5ta2Rpcl9yZWN1cnNpdmUodGhpcy5wYXRoLmRpcm5hbWUoZHN0KSk7XHJcblx0XHRcdHRoaXMuY29weV9maWxlKHNyYyxkc3QsbW9kZSk7XHJcbiAgICAgICAgICAgIGlmKGF0dGFjaG1lbnQpe1xyXG4gICAgICAgICAgICAgICAgbGV0IG5jID0gdGhpcy5ub3RlY2hhaW47XHJcbiAgICAgICAgICAgICAgICBpZighbmMpe3JldHVybjt9XHJcbiAgICAgICAgICAgICAgICBsZXQgdGZpbGVzID0gbmMuY2hhaW4uZ2V0X291dGxpbmtzKHRmaWxlLGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgdCBvZiB0ZmlsZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCEodC5leHRlbnNpb249PT0nbWQnKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWlycm9yX3RmaWxlKHQsdmF1bHRfcm9vdCxtb2RlLGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihvdXRsaW5rKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JfdGZpbGUodCx2YXVsdF9yb290LG1vZGUsZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cdFx0fVxyXG4gICAgfVxyXG5cclxuICAgIG1pcnJvcl90Zm9sZGVyKHRmb2xkZXI6VEZvbGRlcix2YXVsdF9yb290OnN0cmluZyxtb2RlPSdtdGltZScsYXR0YWNobWVudD10cnVlLG91dGxpbms9ZmFsc2Usc3RyaWN0PWZhbHNlKXtcclxuICAgICAgICBpZih0Zm9sZGVyKXtcclxuICAgICAgICAgICAgZm9yKGxldCB0IG9mIHRmb2xkZXIuY2hpbGRyZW4pe1xyXG4gICAgICAgICAgICAgICAgaWYodCBpbnN0YW5jZW9mIFRGb2xkZXIpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWlycm9yX3Rmb2xkZXIodCx2YXVsdF9yb290LG1vZGUsYXR0YWNobWVudCxvdXRsaW5rKTtcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHQgaW5zdGFuY2VvZiBURmlsZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JfdGZpbGUodCx2YXVsdF9yb290LG1vZGUsYXR0YWNobWVudCxvdXRsaW5rKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihzdHJpY3Qpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGRzdCA9IHZhdWx0X3Jvb3QrJy8nK3Rmb2xkZXIucGF0aFxyXG4gICAgICAgICAgICAgICAgbGV0IHNyYyA9IHRoaXMuYWJzcGF0aCh0Zm9sZGVyKVxyXG4gICAgICAgICAgICAgICAgaWYoc3JjICYmIGRzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVfZmlsZXNfbm90X2luX3NyYyhzcmMsZHN0KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblx0XHR9XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlX2ZpbGVfb3JfZGlyKHBhdGg6c3RyaW5nKXtcclxuICAgICAgICBpZih0aGlzLmlzZmlsZShwYXRoKSl7XHJcbiAgICAgICAgICAgIHRoaXMuZnMudW5saW5rU3luYyhwYXRoKVxyXG4gICAgICAgIH1lbHNlIGlmKHRoaXMuaXNkaXIocGF0aCkpe1xyXG4gICAgICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmxpc3RfZGlyKHBhdGgsdHJ1ZSlcclxuICAgICAgICAgICAgZm9yKGxldCBpdGVtIG9mIGl0ZW1zKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlX2ZpbGVfb3JfZGlyKGl0ZW0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5mcy5ybWRpclN5bmMocGF0aClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlX2ZpbGVzX25vdF9pbl9zcmMoc3JjOnN0cmluZyxkc3Q6c3RyaW5nKXtcclxuICAgICAgICAvLyBcdTkwNERcdTUzODYgZHN0IFx1NEUyRFx1NjI0MFx1NjcwOVx1NjU4N1x1NEVGNlx1RkYwQ1x1NTk4Mlx1Njc5Q1x1NjdEMFx1NjU4N1x1NEVGNlx1NEUwRFx1NTcyOHNyY1x1NEUyRFx1RkYwQ1x1NTIyMFx1OTY2NFxyXG4gICAgICAgIGlmKCF0aGlzLmlzZGlyKHNyYykgfHwgIXRoaXMuaXNkaXIoZHN0KSl7cmV0dXJufVxyXG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMubGlzdF9kaXIoZHN0LGZhbHNlKVxyXG4gICAgICAgIGZvcihsZXQgaXRlbSBvZiBpdGVtcyl7XHJcbiAgICAgICAgICAgIGxldCBhZHN0ID0gZHN0KycvJytpdGVtXHJcbiAgICAgICAgICAgIGxldCBhc3JjID0gc3JjKycvJytpdGVtXHJcbiAgICAgICAgICAgIGlmKHRoaXMuaXNmaWxlKGFkc3QpKXtcclxuICAgICAgICAgICAgICAgIGlmKCF0aGlzLmlzZmlsZShhc3JjKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcy51bmxpbmtTeW5jKGFkc3QpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuaXNkaXIoYWRzdCkpe1xyXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuaXNkaXIoYXNyYykpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlX2ZpbGVfb3JfZGlyKGFkc3QpXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZV9maWxlc19ub3RfaW5fc3JjKGFzcmMsYWRzdClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtaXJyb3JfZm9sZGVyKHNyYzpzdHJpbmcsZHN0OnN0cmluZyxtb2RlPSdtdGltZScsc3RyaWN0PWZhbHNlKXtcclxuICAgICAgICBpZighdGhpcy5pc2RpcihzcmMpKXtyZXR1cm59XHJcbiAgICAgICAgdGhpcy5ta2Rpcl9yZWN1cnNpdmUoZHN0KVxyXG4gICAgICAgIGlmKCF0aGlzLmlzZGlyKGRzdCkpe3JldHVybn1cclxuXHJcbiAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5saXN0X2RpcihzcmMsZmFsc2UpXHJcbiAgICAgICAgZm9yKGxldCBpdGVtIG9mIGl0ZW1zKXtcclxuICAgICAgICAgICAgbGV0IGFzcmMgPSB0aGlzLnBhdGguam9pbihzcmMsaXRlbSlcclxuICAgICAgICAgICAgbGV0IGFkc3QgPSB0aGlzLnBhdGguam9pbihkc3QsaXRlbSlcclxuICAgICAgICAgICAgaWYodGhpcy5pc2ZpbGUoYXNyYykpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5X2ZpbGUoYXNyYyxhZHN0LG1vZGUpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuaXNkaXIoYXNyYykpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5taXJyb3JfZm9sZGVyKGFzcmMsYWRzdCxtb2RlLHN0cmljdClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihzdHJpY3Qpe1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZV9maWxlc19ub3RfaW5fc3JjKHNyYyxkc3QpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1vZGlmeShwYXRoOnN0cmluZyxjYWxsYmFjazpGdW5jdGlvbixlbmNvZGluZz0ndXRmOCcpe1xyXG4gICAgICAgIGxldCBmcyA9IHRoaXMuZnM7XHJcbiAgICAgICAgaWYoIWZzLmV4aXN0c1N5bmMocGF0aCkpe3JldHVybn07XHJcblxyXG4gICAgICAgIGZzLnJlYWRGaWxlKHBhdGgsIGVuY29kaW5nLCAoZXJyOkVycm9yLCBkYXRhOnN0cmluZykgPT4ge1xyXG5cdFx0XHRpZihlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVhZGluZyBmaWxlOicsIGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHJzID0gY2FsbGJhY2socGF0aCxkYXRhKTtcclxuXHRcdFx0ZnMud3JpdGVGaWxlKHBhdGgsIHJzLCBlbmNvZGluZywgKGVycjpFcnJvcikgPT4ge1xyXG5cdFx0XHQgIGlmIChlcnIpIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdFcnJvciB3cml0aW5nIGZpbGU6JywgZXJyKTtcclxuXHRcdFx0ICB9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdGaWxlIGNvbnRlbnQgdXBkYXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcblx0XHRcdCAgfVxyXG5cdFx0XHR9KTtcclxuXHRcdCAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCAiXHJcbmV4cG9ydCBjbGFzcyBTdHJpbmdze1xyXG4gICAgbGFuZ3VhZ2U6c3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBsZXQgbGFuZyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFuZ3VhZ2UnKTtcclxuICAgICAgICBpZihsYW5nKXtcclxuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmc7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSAnZW4nO1xyXG4gICAgICAgIH1cclxuXHR9XHJcblxyXG4gICAgZ2V0IGNtZF9leHBvcnRfY3VycmVudF9ub3RlKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU1QkZDXHU1MUZBXHU1RjUzXHU1MjREXHU3QjE0XHU4QkIwJ1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ0V4cG9ydCBjdXJyZW50IG5vdGUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgY21kX3NldF92ZXhwb3J0ZXIoKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdThCQkVcdTdGNkVcdTVCRkNcdTUxRkFcdTdCMTRcdThCQjBcdTkwMDlcdTk4NzknXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnU2V0IGNvbmZpZyB0byBleHBvcnQgbm90ZSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjbWRfZXhwb3J0X3BsdWdpbigpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUJGQ1x1NTFGQVx1NjNEMlx1NEVGNidcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdFeHBvcnQgcGx1Z2luJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb21wdF9wYXRoX29mX2ZvbGRlcigpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1OEY5M1x1NTE2NVx1NjU4N1x1NEVGNlx1NTkzOVx1OERFRlx1NUY4NCdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdJbnB1dCBwYXRoIG9mIGZvbGRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBub3RpY2Vfb3V0cHV0KCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU1QkZDXHU1MUZBXHVGRjFBJ1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ091dHB1dDonO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBub3RpY2Vfbm9zdWNoZGlyKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU2NUUwXHU2NTQ4XHU3NkVFXHU1RjU1J1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ0ludmFpZCBwYXRoLic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZXR0aW5nX3BsdWdpbl9kaXIoKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdTYzRDJcdTRFRjZcdTVCRkNcdTUxRkFcdTc2RUVcdTVGNTUnO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ1BsdWdpbiBkaXIgdG8gZXhwb3J0JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNldHRpbmdfdmF1bHRfZGlyKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU1RTkzXHU3NkVFXHU1RjU1JztcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdSb290IGRpciBvZiB2YXVsdCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgbGV0IHN0cmluZ3MgPSBuZXcgU3RyaW5ncygpOyIsICJpbXBvcnQgeyBcclxuXHRBcHAsIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcsUGx1Z2luXHJcbn0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuaW1wb3J0IFZhdWx0RXhwb3RlclBsdWdpbiBmcm9tICcuLi9tYWluJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVkV4cG9ydGVyU2V0dGluZ3Mge1xyXG5cdHBsdWdpbkRpckV4cG9ydGVyOnN0cmluZztcclxuXHR2YXVsdERpcjpzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBWRXhwb3J0ZXJTZXR0aW5ncyA9IHtcclxuXHRwbHVnaW5EaXJFeHBvcnRlcjonJyxcclxuXHR2YXVsdERpcjonJ1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVkV4cG9ydGVyU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogVmF1bHRFeHBvdGVyUGx1Z2luO1xyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFZhdWx0RXhwb3RlclBsdWdpbikge1xyXG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0fVxyXG5cclxuXHRnZXRTZXR0aW5nVmFsdWUoZmllbGQ6IGtleW9mIFZFeHBvcnRlclNldHRpbmdzKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wbHVnaW4uc2V0dGluZ3NbZmllbGRdO1xyXG5cdH1cclxuXHJcblx0YWRkX3RvZ2dsZShuYW1lOnN0cmluZyxkZXNjOnN0cmluZyxmaWVsZDprZXlvZiBWRXhwb3J0ZXJTZXR0aW5ncyl7XHJcblx0XHRsZXQge2NvbnRhaW5lckVsfSA9IHRoaXM7XHJcblx0XHRsZXQgdmFsdWUgPSAodGhpcy5wbHVnaW4uc2V0dGluZ3MgYXMgYW55KVtmaWVsZF0gYXMgYm9vbGVhbjtcclxuXHRcdGxldCBpdGVtID0gbmV3IFNldHRpbmcoY29udGFpbmVyRWwpICBcclxuXHRcdFx0LnNldE5hbWUobmFtZSlcclxuXHRcdFx0LnNldERlc2MoZGVzYylcclxuXHRcdFx0LmFkZFRvZ2dsZSh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0VmFsdWUodmFsdWUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTpuZXZlcikgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3NbZmllbGRdID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cdFx0cmV0dXJuIGl0ZW07XHJcblx0fVxyXG5cclxuXHRkaXNwbGF5KCk6IHZvaWQge1xyXG5cdFx0Y29uc3Qge2NvbnRhaW5lckVsfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHRcdFxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKHRoaXMucGx1Z2luLnN0cmluZ3Muc2V0dGluZ19wbHVnaW5fZGlyKVxyXG5cdFx0XHQuYWRkVGV4dEFyZWEodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkRpckV4cG9ydGVyKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkRpckV4cG9ydGVyID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0XHRcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHRcdC5zZXROYW1lKHRoaXMucGx1Z2luLnN0cmluZ3Muc2V0dGluZ192YXVsdF9kaXIpXHJcblx0XHRcdFx0LmFkZFRleHRBcmVhKHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnZhdWx0RGlyKVxyXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy52YXVsdERpciA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdH0pKTtcclxuXHR9XHJcbn1cclxuIiwgImltcG9ydCB7IFxyXG5cdE5vdGljZSwgVEZpbGVcclxufSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5pbXBvcnQgVmF1bHRFeHBvdGVyUGx1Z2luIGZyb20gJy4uL21haW4nO1xyXG5cclxuY29uc3QgY21kX2V4cG9ydF9jdXJyZW50X25vdGUgPSAocGx1Z2luOlZhdWx0RXhwb3RlclBsdWdpbikgPT4gKHtcclxuXHRpZDogJ2NtZF9leHBvcnRfY3VycmVudF9ub3RlJyxcclxuXHRuYW1lOiBwbHVnaW4uc3RyaW5ncy5jbWRfZXhwb3J0X2N1cnJlbnRfbm90ZSxcclxuXHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0Y29uc3QgbmMgPSBwbHVnaW4ubm90ZWNoYWluO1xyXG5cdFx0bGV0IHRmaWxlID0gbmMuY2hhaW4uY3VycmVudF9ub3RlO1xyXG5cdFx0YXdhaXQgcGx1Z2luLmV4cG9ydF9yZWFkbWUodGZpbGUsbnVsbCk7XHJcblx0fVxyXG59KTtcclxuXHJcbmNvbnN0IGNtZF9zZXRfdmV4cG9ydGVyID0gKHBsdWdpbjpWYXVsdEV4cG90ZXJQbHVnaW4pID0+ICh7XHJcblx0aWQ6ICdjbWRfc2V0X3ZleHBvcnRlcicsXHJcblx0bmFtZTogcGx1Z2luLnN0cmluZ3MuY21kX3NldF92ZXhwb3J0ZXIsXHJcblx0Y2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuXHRcdGNvbnN0IG5jID0gcGx1Z2luLm5vdGVjaGFpbjtcclxuXHRcdGxldCBkaXIgPSBhd2FpdCBuYy5jaGFpbi50cF9wcm9tcHQocGx1Z2luLnN0cmluZ3MucHJvbXB0X3BhdGhfb2ZfZm9sZGVyKTtcclxuXHRcdGxldCBpdGVtOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblx0XHRpZihwbHVnaW4uZnNFZGl0b3IuZnMuZXhpc3RzU3luYyhkaXIpKXtcclxuXHRcdFx0aXRlbVsnRGlyJ10gPSBkaXI7XHJcblx0XHR9XHJcblx0XHRpdGVtWydOYW1lJ10gPSAncmVhZE1lJztcclxuXHRcdGl0ZW1bJ0Fzc2V0cyddID0gJy4vYXNzZXRzJztcclxuXHRcdGl0ZW1bJ1JlbW92ZU1ldGEnXSA9IHRydWU7XHJcblx0XHRpdGVtWydVc2VHaXRMaW5rJ10gPSB0cnVlO1xyXG5cclxuXHRcdGF3YWl0IG5jLmVkaXRvci5zZXRfZnJvbnRtYXR0ZXIoXHJcblx0XHRcdG5jLmNoYWluLmN1cnJlbnRfbm90ZSxcclxuXHRcdFx0J3ZleHBvcnRlcicsXHJcblx0XHRcdGl0ZW1cclxuXHRcdClcclxuXHR9XHJcbn0pO1xyXG5cclxuY29uc3QgY21kX2V4cG9ydF9wbHVnaW4gPSAocGx1Z2luOlZhdWx0RXhwb3RlclBsdWdpbikgPT4gKHtcclxuXHRpZDogJ2NtZF9leHBvcnRfcGx1Z2luJyxcclxuXHRuYW1lOiBwbHVnaW4uc3RyaW5ncy5jbWRfZXhwb3J0X3BsdWdpbixcclxuXHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0Y29uc3QgbmMgPSBwbHVnaW4ubm90ZWNoYWluO1xyXG5cdFx0XHJcblx0XHRsZXQgcGx1Z2lucyA9IE9iamVjdC5rZXlzKChwbHVnaW4uYXBwIGFzIGFueSkucGx1Z2lucy5wbHVnaW5zKTtcclxuXHRcdGxldCBwID0gYXdhaXQgbmMuY2hhaW4udHBfc3VnZ2VzdGVyKHBsdWdpbnMscGx1Z2lucyk7XHJcblx0XHRsZXQgZXBsdWdpbiA9IChwbHVnaW4uYXBwIGFzIGFueSkucGx1Z2lucy5nZXRQbHVnaW4ocCk7XHJcblx0XHRpZihlcGx1Z2luKXtcclxuXHRcdFx0bGV0IHRhcmdldCA9IGF3YWl0IHBsdWdpbi5mc0VkaXRvci5zZWxlY3RfdmFsaWRfZGlyKFxyXG5cdFx0XHRcdHBsdWdpbi5zZXR0aW5ncy5wbHVnaW5EaXJFeHBvcnRlci5zcGxpdChcIlxcblwiKVxyXG5cdFx0XHQpXHJcblx0XHRcdGlmKCFwbHVnaW4uZnNFZGl0b3IuZnMuZXhpc3RzU3luYyh0YXJnZXQpKXtcclxuXHRcdFx0XHR0YXJnZXQgPSBhd2FpdCBuYy5jaGFpbi50cF9wcm9tcHQocGx1Z2luLnN0cmluZ3MucHJvbXB0X3BhdGhfb2ZfZm9sZGVyKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0YXJnZXQgPSB0YXJnZXQucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHRcdGlmKCF0YXJnZXQuZW5kc1dpdGgoJy8nICsgcCkpe1xyXG5cdFx0XHRcdHRhcmdldCA9IHRhcmdldCArICcvJyArIHA7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoIXBsdWdpbi5mc0VkaXRvci5mcy5leGlzdHNTeW5jKHRhcmdldCkpe1xyXG5cdFx0XHRcdHBsdWdpbi5mc0VkaXRvci5mcy5ta2RpclN5bmModGFyZ2V0KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRsZXQgaXRlbXMgPSBbJ21haW4uanMnLCdtYW5pZmVzdC5qc29uJywnc3R5bGVzLmNzcyddO1xyXG5cdFx0XHRmb3IobGV0IGl0ZW0gb2YgaXRlbXMpe1xyXG5cdFx0XHRcdGxldCBzcmMgPSBgJHtwbHVnaW4uZnNFZGl0b3Iucm9vdH0vJHtlcGx1Z2luLm1hbmlmZXN0LmRpcn0vJHtpdGVtfWA7XHJcblx0XHRcdFx0bGV0IGRzdCA9IGAke3RhcmdldH0vJHtpdGVtfWA7XHJcblx0XHRcdFx0cGx1Z2luLmZzRWRpdG9yLmNvcHlfZmlsZShzcmMsZHN0LCdvdmVyd3JpdGUnKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufSk7XHJcblxyXG5jb25zdCBjb21tYW5kQnVpbGRlcnM6QXJyYXk8RnVuY3Rpb24+ID0gW1xyXG4gICAgXHJcbl07XHJcblxyXG5jb25zdCBjb21tYW5kQnVpbGRlcnNEZXNrdG9wOkFycmF5PEZ1bmN0aW9uPiA9IFtcclxuXHRjbWRfZXhwb3J0X2N1cnJlbnRfbm90ZSxcclxuXHRjbWRfc2V0X3ZleHBvcnRlcixcclxuXHRjbWRfZXhwb3J0X3BsdWdpblxyXG5dO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZENvbW1hbmRzKHBsdWdpbjpWYXVsdEV4cG90ZXJQbHVnaW4pIHtcclxuICAgIGNvbW1hbmRCdWlsZGVycy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgcGx1Z2luLmFkZENvbW1hbmQoYyhwbHVnaW4pKTtcclxuICAgIH0pO1xyXG5cdGlmKChwbHVnaW4uYXBwIGFzIGFueSkuaXNNb2JpbGU9PWZhbHNlKXtcclxuXHRcdGNvbW1hbmRCdWlsZGVyc0Rlc2t0b3AuZm9yRWFjaCgoYykgPT4ge1xyXG5cdFx0XHRwbHVnaW4uYWRkQ29tbWFuZChjKHBsdWdpbikpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLElBQUFBLG1CQUE0Rzs7O0FDQTVHLHNCQUE0RztBQUVyRyxJQUFNLFdBQU4sTUFBYztBQUFBLEVBS2pCLFlBQVksUUFBYztBQUN0QixTQUFLLFNBQVM7QUFDZCxTQUFLLEtBQUssUUFBUSxJQUFJO0FBQ3RCLFNBQUssT0FBTyxRQUFRLE1BQU07QUFBQSxFQUM5QjtBQUFBLEVBRUEsSUFBSSxPQUFNO0FBQ04sUUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLE1BQU07QUFDOUIsV0FBTyxFQUFFLFNBQVMsUUFBUSxPQUFNLEdBQUc7QUFBQSxFQUN2QztBQUFB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M0Qsa0JBQU0sSUFBSTtBQUFBLGNBQ1Q7QUFBQSxjQUNBO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFDQSxnQkFBR0MsTUFBQSxHQUFHLE9BQU8sZ0JBQWdCLE9BQU0sV0FBVyxNQUEzQyxnQkFBQUEsSUFBOEMsZUFBYyxRQUFPO0FBQ3JFLGtCQUFNLElBQUk7QUFBQSxjQUNUO0FBQUEsY0FDQSxDQUFDLE9BQVdDLFVBQWdCO0FBQzNCLHVCQUFPLEtBQUtBLFVBQVMsVUFBVUEsTUFBSyxRQUFRLE1BQUssS0FBSztBQUFBLGNBQ3ZEO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFDQSxpQkFBTztBQUFBLFFBQ1I7QUFDQSxjQUFNLEtBQUssU0FBUyxPQUFPLEtBQUksS0FBSztBQUFBLE1BQ3JDO0FBQUEsSUFDRDtBQUVBLFFBQUksVUFBUyxRQUFHLE9BQU8sZ0JBQWdCLE9BQU0sV0FBVyxNQUEzQyxtQkFBOEM7QUFDM0QsUUFBRyxRQUFPO0FBQ1QsVUFBSSxTQUFTLEdBQUcsTUFBTSxhQUFhLEtBQUs7QUFDeEMsVUFBSSxPQUFPLE1BQUksTUFBSTtBQUNuQixXQUFLLFNBQVMsZ0JBQWdCLElBQUk7QUFDbEMsZUFBUSxLQUFLLFFBQU87QUFDbkIsWUFBRyxFQUFFLEVBQUUsY0FBWSxPQUFNO0FBQ3hCLGVBQUssU0FBUyxXQUFXLEdBQUUsT0FBSyxNQUFJLEVBQUUsV0FBUyxNQUFJLEVBQUUsU0FBUztBQUFBLFFBQy9EO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFBQSxFQUNEO0FBQ0Q7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJlcnIiLCAiaW1wb3J0X29ic2lkaWFuIiwgInZhbHVlIiwgIl9hIiwgIl9iIiwgIm5hbWUiXQp9Cg== diff --git a/src/fseditor.ts b/src/fseditor.ts index 5a59fcb..f755d2e 100644 --- a/src/fseditor.ts +++ b/src/fseditor.ts @@ -110,20 +110,17 @@ export class FsEditor{ if(mode==='overwrite'){ fs.unlinkSync(dst); fs.copyFileSync(src,dst); - new Notice(`Copy:${src}-->${dst}`,5000); return true; }else if(mode==='mtime'){ // dst 更新时间小于 src if(fs.statSync(dst).mtimeMs${dst}`,5000); return true; } } }else{ fs.copyFileSync(src,dst); - new Notice(`Copy:${src}-->${dst}`,5000); return true; } return false; @@ -179,12 +176,23 @@ export class FsEditor{ } } + delete_file_or_dir(path:string){ + if(this.isfile(path)){ + this.fs.unlinkSync(path) + }else if(this.isdir(path)){ + let items = this.list_dir(path,true) + for(let item of items){ + this.delete_file_or_dir(item) + } + this.fs.rmdirSync(path) + } + } + remove_files_not_in_src(src:string,dst:string){ - console.log(src,dst) + // 遍历 dst 中所有文件,如果某文件不在src中,删除 if(!this.isdir(src) || !this.isdir(dst)){return} let items = this.list_dir(dst,false) for(let item of items){ - console.log(item) let adst = dst+'/'+item let asrc = src+'/'+item if(this.isfile(adst)){ @@ -193,12 +201,34 @@ export class FsEditor{ } }else if(this.isdir(adst)){ if(!this.isdir(asrc)){ - this.fs.rmdirSync(dst) + this.delete_file_or_dir(adst) + }else{ + this.remove_files_not_in_src(asrc,adst) } } } } + mirror_folder(src:string,dst:string,mode='mtime',strict=false){ + if(!this.isdir(src)){return} + this.mkdir_recursive(dst) + if(!this.isdir(dst)){return} + + let items = this.list_dir(src,false) + for(let item of items){ + let asrc = this.path.join(src,item) + let adst = this.path.join(dst,item) + if(this.isfile(asrc)){ + this.copy_file(asrc,adst,mode) + }else if(this.isdir(asrc)){ + this.mirror_folder(asrc,adst,mode,strict) + } + } + if(strict){ + this.remove_files_not_in_src(src,dst) + } + } + modify(path:string,callback:Function,encoding='utf8'){ let fs = this.fs; if(!fs.existsSync(path)){return};