123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641 |
- import { decodeNormMsg, encodeNormMsg } from "/src/comm/controllers/entity/message.ts";
- import { Controller } from "/src/comm/core/controller.ts";
- import __vite__cjsImport2_fileSaver from "/node_modules/.vite/deps/file-saver.js?v=fe35e769"; const saveAs = __vite__cjsImport2_fileSaver["saveAs"];
- import { Base64 } from "/node_modules/.vite/deps/js-base64.js?v=f0a3e95a";
- export class DeviceController extends Controller {
- ipc;
- constructor() {
- super();
- if (window.ipc) {
- this.ipc = window.ipc;
- } else {
- this.ipc = {
- emit(name, ...args) {
- console.error("emit msg=>", name, args);
- },
- on(name) {
- console.error("on message", name);
- }
- };
- }
- this.initEvent();
- }
- _conn;
- initEvent() {
- const scope = this;
- this.ipc.on("OnDragEnter", function(files) {
- scope.emit("onDragEnter", files);
- });
- this.ipc.on("downloadsucc", (fpath, size) => {
- scope.emit("downloadsucc", fpath, size);
- });
- this.ipc.emit("GetSocketUri", [], (uri) => {
- let conn = new WebSocket(uri);
- conn.onopen = (e) => {
- console.log("bus socket connected!!!");
- };
- conn.onclose = (evt) => {
- console.log("app bus socket conn closed", evt);
- setTimeout(() => {
- this._conn = new WebSocket(uri);
- }, 1e3);
- };
- conn.onmessage = function(evt) {
- if (!evt.data || evt.data == "")
- return;
- try {
- const blob = evt.data;
- blob.arrayBuffer().then((buff) => {
- const msg = decodeNormMsg(new Uint8Array(buff));
- scope.emit("on" + msg.sub, msg);
- });
- } catch (error) {
- console.error(evt.data, typeof evt.data, error);
- }
- };
- this._conn = conn;
- });
- }
- async onReady() {
- this.profile = await this.getLocalAppProfile();
- }
- profile = {
- wsPort: "",
- version: "",
- dataDir: "",
- exeDir: "",
- exeName: "",
- exePath: ""
- };
- getLocalAppProfile() {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("LocalAppProfile", [], function(config) {
- r(config);
- });
- });
- }
- //选择磁盘文件夹
- SelectDir() {
- const sid = Date.now();
- const cbname = "c" + sid;
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("SelectDir", [sid], function(ok) {
- console.log("call=>", ok);
- if (!ok) {
- r("");
- }
- ipc.on(cbname, function(dir) {
- r(dir);
- });
- });
- });
- }
- IsDirEmpty(dir) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("IsDirEmpty", [dir], function(ok) {
- r(ok);
- });
- });
- }
- IsFileExit(fpath) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("IsFileExit", [fpath], function(ok) {
- r(ok);
- });
- });
- }
- WriteFileText(dir, content) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("WriteFileText", [dir, content], function(ok) {
- r(ok);
- });
- });
- }
- ReadFileText(dir) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("ReadFileText", [dir], function(data) {
- r(data);
- });
- });
- }
- //拷贝文件
- CopyFile(srcFile, targetFile) {
- const sid = Date.now();
- const cbname = "copy" + sid;
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.on(cbname, function(ok) {
- r(ok);
- });
- ipc.emit("CopyFile", [cbname, srcFile, targetFile]);
- });
- }
- //保存应用级的配置
- SaveSysConfigItem(key, value) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("SaveAppConfigItem", [key, value], function(data) {
- r(data);
- });
- });
- }
- GetSysConfigItem(key) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("GetAppConfigItem", [key], function(data) {
- r(data);
- });
- });
- }
- RemoveSysConfigItem(key) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("RemoveSysConfigItem", [key], function(data) {
- r(data);
- });
- });
- }
- //获取应用的baseUrl
- GetSysDataBaseUrl() {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("GetAppDataBaseUrl", [], function(data) {
- r(data);
- });
- });
- }
- //获取应用的baseUrl
- CopyFileToAppData(src, targetRelativePath) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit(
- "CopyFileToAppData",
- [src, targetRelativePath],
- function(data) {
- r(data);
- }
- );
- });
- }
- RemoveAppData(targetRelativePath) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("RemoveAppData", [targetRelativePath], function(data) {
- r(data);
- });
- });
- }
- //打开文件所在的目录
- OpenDir(dir) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("OpenDir", [dir], function(data) {
- r(data);
- });
- });
- }
- SelectOneFilePath(title, filters) {
- const sid = Date.now();
- return new Promise((r) => {
- const ipc = this.ipc;
- const cbname = "c" + sid;
- ipc.emit(
- "SelectOneFilePath",
- [sid, title, filters],
- function(ok) {
- if (!ok) {
- r("");
- }
- ipc.on(cbname, function(dir) {
- r(dir);
- });
- }
- );
- });
- }
- //开启projects 的httpserver
- StartHttpServer(prjFile) {
- const sid = Date.now();
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("StartProjectHttpServer", [prjFile], function(data) {
- r(data);
- });
- });
- }
- //下在线文件 默认超时时间20分钟
- DownloadFile(url, fpath, timeoutSecend = 60 * 20, cb) {
- const sid = "d" + Date.now();
- return new Promise((r) => {
- console.log(url, "==>", fpath);
- const cancel = this.OnMsg(sid, (data) => {
- cb && cb(data.type, data);
- if (data.type == "succ") {
- r(true);
- cancel.unbind();
- return;
- }
- if (data.type == "error") {
- r(false);
- cancel.unbind();
- }
- });
- const ipc = this.ipc;
- ipc.emit(
- "DownloadFile",
- [sid, fpath, url, timeoutSecend],
- function(err) {
- console.log("DownloadFile callback");
- if (err) {
- console.error(err);
- r(false);
- }
- }
- );
- });
- }
- Unzip(fpath, distDir, cb) {
- const sid = "unzip" + Date.now();
- return new Promise((r) => {
- const cancel = this.OnMsg(sid, (data) => {
- cb && cb(data.type, data);
- if (data.type == "succ") {
- r(true);
- cancel.unbind();
- return;
- }
- if (data.type == "error") {
- r(false);
- cancel.unbind();
- }
- });
- const ipc = this.ipc;
- ipc.emit("Unzip", [sid, fpath, distDir]);
- });
- }
- //获取文件夹的大小
- //文件目录不要太大,不然会卡死程序
- GetDirSize(dir) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("GetDirSize", [dir], function(size) {
- r(size);
- });
- });
- }
- //获取系统数据目录
- GetAppDataDir() {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("GetAppDataDir", [], function(dir) {
- r(dir);
- });
- });
- }
- OpenAssetWindow(projectPath) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit(
- "openAssetsWindow",
- [
- `${location.host}/library.html?path=${projectPath}`,
- "资源管理库",
- 1280,
- 960
- ],
- function(ok) {
- r(ok);
- }
- );
- });
- }
- SendMsg(subject, msg) {
- const conn = this._conn;
- if (!conn) {
- console.error("应用socket异常");
- return;
- }
- conn.send(encodeNormMsg({ sub: subject, msg }));
- }
- OnMsg(subject, cb) {
- return this.on("on" + subject, cb);
- }
- //同步阻塞当前进程
- UploadSync(files) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("UploadSync", [files], function(ret) {
- r(ret);
- });
- });
- }
- //异步上传不会阻塞当前进程
- UploadASync(files) {
- const sid = "u" + Date.now();
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("UploadASync", [sid, files], function(ok) {
- if (!ok) {
- r([]);
- return;
- }
- ipc.on(sid, (items) => {
- r(items);
- });
- });
- });
- }
- //异步上传不会阻塞当前进程
- UploadDir(dir, targetDir) {
- const sid = "u" + Date.now();
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("UploadDir", [sid, dir, targetDir], function(ok) {
- if (!ok) {
- r([]);
- return;
- }
- ipc.on(sid, (items) => {
- r(items);
- });
- });
- });
- }
- GetFilesInDir(dir, filter) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("GetFilesInDir", [dir, filter], function(ret) {
- r(ret);
- });
- });
- }
- GetRunningApp() {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit(
- "GetRunningApp",
- [],
- function(apps) {
- r(apps);
- }
- );
- });
- }
- GetSubDirNames(dir) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("GetSubDirNames", [dir], function(ret) {
- r(ret);
- });
- });
- }
- RemoveFile(fpath) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("RemoveFile", [fpath], function(ok) {
- r(ok);
- });
- });
- }
- RemoveDir(fpath) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("RemoveDir", [fpath], function(ok) {
- r(ok);
- });
- });
- }
- GetSaveFile(title, filter = "图片(*.png;*.jpg)") {
- const sid = "sf" + Date.now();
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("GetSaveFile", [sid, title, filter], function(ok) {
- if (ok) {
- ipc.on(sid, (ret) => {
- r(ret);
- });
- return;
- }
- r("");
- });
- });
- }
- OpenOneFile(title, filter = "图片(*.png;*.jpg)") {
- const sid = "sf" + Date.now();
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("OpenOneFile", [sid, title, filter], function(file) {
- setTimeout(() => {
- r(file);
- }, 0);
- });
- });
- }
- GetImageMeta(fpath) {
- return new Promise((r) => {
- const img = new Image();
- img.onload = () => {
- r({ Width: img.width, Height: img.height, Size: 0 });
- };
- img.src = fpath;
- });
- }
- SetMainTitle(title) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("SetMainTitle", [title], function(ok) {
- r(ok);
- });
- });
- }
- SaveFile(fpath, buff) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("SaveFile", [fpath, Array.from(buff)], function(err) {
- r(err);
- });
- });
- }
- OpenQueen5(url, title) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("OpenQueen5", [url, title], function(err) {
- r(err);
- });
- });
- }
- OpenQueen5Play(url, title) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("OpenQueen5Play", [url, title], function(err) {
- r(err);
- });
- });
- }
- SaveBlobFile(url, fbase64path) {
- console.log("save blob to ", fbase64path);
- return new Promise((r) => {
- const cancel = this.on("downloadsucc", (dpath) => {
- console.log("fpath=>", dpath);
- if (fbase64path == Base64.encode(dpath)) {
- cancel.unbind();
- r(true);
- }
- });
- saveAs(url, fbase64path);
- });
- }
- SaveClipboard(blob) {
- return navigator.clipboard.write([
- new ClipboardItem({
- "image/png": blob
- })
- ]);
- }
- GetNatsProfile() {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("NatsProfile", [], function(data) {
- r(data);
- });
- });
- }
- OpenWeb(url, title, width = 1280, height = 720) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("OpenWeb", [url, title, width, height], function(data) {
- r(data);
- });
- });
- }
- RunNativeApp(guid, entry, params, title, key) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit(
- "RunNativeApp",
- [guid, entry, params, title, key],
- function(err) {
- console.log("xxxx", err);
- r(err);
- }
- );
- });
- }
- RunCmdSvcApp(guid, webUrl, entry, params, title, key) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit(
- "RunCmdSvcApp",
- [guid, webUrl, entry, params, title, key],
- function(err) {
- console.log("xxxx", err);
- r(err);
- }
- );
- });
- }
- StopNativeApp(guid) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("StopNativeApp", [guid], function(ok) {
- r(ok);
- });
- });
- }
- LancherUpgrade(updateUrl, lancherUrl) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("Upgrade", [updateUrl, lancherUrl], function(ok) {
- r(ok);
- });
- });
- }
- CreateShortcut(appName, lancherPath, icoPath) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit(
- "CreateShortcut",
- [appName, lancherPath, icoPath],
- function(ok) {
- r(ok);
- }
- );
- });
- }
- DeleteShortcut(appName) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("DeleteShortcut", [appName], function(ok) {
- r(ok);
- });
- });
- }
- ResumeMainWnd() {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("ResumeMainWnd", [], function(ok) {
- r(ok);
- });
- });
- }
- HideMainWnd() {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("HideMainWnd", [], function(ok) {
- r(ok);
- });
- });
- }
- QuitLancher() {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("QuitLancher", [], function(ok) {
- r(ok);
- });
- });
- }
- MaxWindow(isMax) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("MaxWindow", [isMax], function(ok) {
- r(ok);
- });
- });
- }
- FoldWindow(isFold) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("FoldWindow", [isFold], function(ok) {
- r(ok);
- });
- });
- }
- TrayNotice(notice) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit(
- "TrayNotice",
- [notice.title || "提示", notice.context, notice.timeout || 2e3],
- function(ok) {
- r(ok);
- }
- );
- });
- }
- UpdateConfig(version) {
- return new Promise((r) => {
- const ipc = this.ipc;
- ipc.emit("UpdateConfig", [version], function(ok) {
- r(ok);
- });
- });
- }
- }
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRldmljZUN0cmwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRzIH0gZnJvbSBcInF1ZWVuanNcIjtcclxuaW1wb3J0IHsgTm9ybU1zZywgZGVjb2RlTm9ybU1zZywgZW5jb2RlTm9ybU1zZyB9IGZyb20gXCIuL2VudGl0eS9tZXNzYWdlXCI7XHJcbmltcG9ydCB7IENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29yZS9jb250cm9sbGVyXCI7XHJcblxyXG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tIFwiZmlsZS1zYXZlclwiO1xyXG5cclxuaW1wb3J0IHsgQmFzZTY0IH0gZnJvbSBcImpzLWJhc2U2NFwiO1xyXG50eXBlIFVwbG9hZEl0ZW0gPSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBmcGF0aDogc3RyaW5nO1xyXG4gIGRpcjogc3RyaW5nO1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbiAgdXJsPzogc3RyaW5nO1xyXG4gIHNpemU/OiBudW1iZXI7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBGaWxlSW5mbyA9IHtcclxuICBGcGF0aDogc3RyaW5nO1xyXG4gIFNpemU6IG51bWJlcjtcclxuICBDcmVhdGVBdDogbnVtYmVyOyAvL2luZm8uTW9kVGltZSgpLlVuaXgoKVxyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIERldmljZUNvbnRyb2xsZXIgZXh0ZW5kcyBDb250cm9sbGVyIHtcclxuICBpcGM6IGFueTtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBpZiAod2luZG93LmlwYykge1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgdGhpcy5pcGMgPSB3aW5kb3cuaXBjO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pcGMgPSB7XHJcbiAgICAgICAgZW1pdChuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZW1pdCBtc2c9PlwiLCBuYW1lLCBhcmdzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIm9uIG1lc3NhZ2VcIiwgbmFtZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5pdEV2ZW50KCk7XHJcbiAgfVxyXG4gIF9jb25uPzogV2ViU29ja2V0O1xyXG5cclxuICBpbml0RXZlbnQoKSB7XHJcbiAgICBjb25zdCBzY29wZSA9IHRoaXM7XHJcbiAgICB0aGlzLmlwYy5vbihcIk9uRHJhZ0VudGVyXCIsIGZ1bmN0aW9uIChmaWxlczogc3RyaW5nW10pIHtcclxuICAgICAgc2NvcGUuZW1pdChcIm9uRHJhZ0VudGVyXCIsIGZpbGVzKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5pcGMub24oXCJkb3dubG9hZHN1Y2NcIiwgKGZwYXRoOiBzdHJpbmcsIHNpemU6IG51bWJlcikgPT4ge1xyXG4gICAgICBzY29wZS5lbWl0KFwiZG93bmxvYWRzdWNjXCIsIGZwYXRoLCBzaXplKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaXBjLmVtaXQoXCJHZXRTb2NrZXRVcmlcIiwgW10sICh1cmk6IHN0cmluZykgPT4ge1xyXG4gICAgICBsZXQgY29ubiA9IG5ldyBXZWJTb2NrZXQodXJpKTtcclxuICAgICAgY29ubi5vbm9wZW4gPSAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiYnVzIHNvY2tldCBjb25uZWN0ZWQhISFcIik7XHJcbiAgICAgIH07XHJcbiAgICAgIGNvbm4ub25jbG9zZSA9IChldnQpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImFwcCBidXMgc29ja2V0IGNvbm4gY2xvc2VkXCIsIGV2dCk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fY29ubiA9IG5ldyBXZWJTb2NrZXQodXJpKTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgfTtcclxuICAgICAgY29ubi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZ0KSB7XHJcbiAgICAgICAgaWYgKCFldnQuZGF0YSB8fCBldnQuZGF0YSA9PSBcIlwiKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBibG9iID0gZXZ0LmRhdGEgYXMgQmxvYjtcclxuICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGRlY29kZU5vcm1Nc2cobmV3IFVpbnQ4QXJyYXkoYnVmZikpO1xyXG4gICAgICAgICAgICBzY29wZS5lbWl0KFwib25cIiArIG1zZy5zdWIsIG1zZyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihldnQuZGF0YSwgdHlwZW9mIGV2dC5kYXRhLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLl9jb25uID0gY29ubjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25SZWFkeSgpIHtcclxuICAgIHRoaXMucHJvZmlsZSA9IGF3YWl0IHRoaXMuZ2V0TG9jYWxBcHBQcm9maWxlKCk7XHJcbiAgfVxyXG5cclxuICBwcm9maWxlID0ge1xyXG4gICAgd3NQb3J0OiBcIlwiLFxyXG4gICAgdmVyc2lvbjogXCJcIixcclxuICAgIGRhdGFEaXI6IFwiXCIsXHJcbiAgICBleGVEaXI6IFwiXCIsXHJcbiAgICBleGVOYW1lOiBcIlwiLFxyXG4gICAgZXhlUGF0aDogXCJcIixcclxuICB9O1xyXG5cclxuICBnZXRMb2NhbEFwcFByb2ZpbGUoKTogUHJvbWlzZTx0eXBlb2YgdGhpcy5wcm9maWxlPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiTG9jYWxBcHBQcm9maWxlXCIsIFtdLCBmdW5jdGlvbiAoY29uZmlnOiBhbnkpIHtcclxuICAgICAgICByKGNvbmZpZyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8v6YCJ5oup56OB55uY5paH5Lu25aS5XHJcbiAgU2VsZWN0RGlyKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBzaWQgPSBEYXRlLm5vdygpO1xyXG4gICAgY29uc3QgY2JuYW1lID0gXCJjXCIgKyBzaWQ7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiU2VsZWN0RGlyXCIsIFtzaWRdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImNhbGw9PlwiLCBvayk7XHJcbiAgICAgICAgaWYgKCFvaykge1xyXG4gICAgICAgICAgcihcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaXBjLm9uKGNibmFtZSwgZnVuY3Rpb24gKGRpcjogc3RyaW5nKSB7XHJcbiAgICAgICAgICByKGRpcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIElzRGlyRW1wdHkoZGlyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJJc0RpckVtcHR5XCIsIFtkaXJdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgSXNGaWxlRXhpdChmcGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiSXNGaWxlRXhpdFwiLCBbZnBhdGhdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFdyaXRlRmlsZVRleHQoZGlyOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIldyaXRlRmlsZVRleHRcIiwgW2RpciwgY29udGVudF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgUmVhZEZpbGVUZXh0KGRpcjogc3RyaW5nKTogUHJvbWlzZTx7IGVycm9yOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiUmVhZEZpbGVUZXh0XCIsIFtkaXJdLCBmdW5jdGlvbiAoZGF0YTogYW55KSB7XHJcbiAgICAgICAgcihkYXRhKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8v5ou36LSd5paH5Lu2XHJcbiAgQ29weUZpbGUoc3JjRmlsZTogc3RyaW5nLCB0YXJnZXRGaWxlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IHNpZCA9IERhdGUubm93KCk7XHJcbiAgICBjb25zdCBjYm5hbWUgPSBcImNvcHlcIiArIHNpZDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLm9uKGNibmFtZSwgZnVuY3Rpb24gKG9rOiBib29sZWFuKSB7XHJcbiAgICAgICAgcihvayk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpcGMuZW1pdChcIkNvcHlGaWxlXCIsIFtjYm5hbWUsIHNyY0ZpbGUsIHRhcmdldEZpbGVdKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/kv53lrZjlupTnlKjnuqfnmoTphY3nva5cclxuICBTYXZlU3lzQ29uZmlnSXRlbShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlNhdmVBcHBDb25maWdJdGVtXCIsIFtrZXksIHZhbHVlXSwgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgIHIoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIEdldFN5c0NvbmZpZ0l0ZW0oa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgZXJyb3I6IHN0cmluZzsgdGV4dDogc3RyaW5nIH0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJHZXRBcHBDb25maWdJdGVtXCIsIFtrZXldLCBmdW5jdGlvbiAoZGF0YTogYW55KSB7XHJcbiAgICAgICAgcihkYXRhKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgUmVtb3ZlU3lzQ29uZmlnSXRlbShrZXk6IHN0cmluZyk6IFByb21pc2U8eyBlcnJvcjogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlJlbW92ZVN5c0NvbmZpZ0l0ZW1cIiwgW2tleV0sIGZ1bmN0aW9uIChkYXRhOiBhbnkpIHtcclxuICAgICAgICByKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/ojrflj5blupTnlKjnmoRiYXNlVXJsXHJcbiAgR2V0U3lzRGF0YUJhc2VVcmwoKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiR2V0QXBwRGF0YUJhc2VVcmxcIiwgW10sIGZ1bmN0aW9uIChkYXRhOiBhbnkpIHtcclxuICAgICAgICByKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/ojrflj5blupTnlKjnmoRiYXNlVXJsXHJcbiAgQ29weUZpbGVUb0FwcERhdGEoc3JjOiBzdHJpbmcsIHRhcmdldFJlbGF0aXZlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXHJcbiAgICAgICAgXCJDb3B5RmlsZVRvQXBwRGF0YVwiLFxyXG4gICAgICAgIFtzcmMsIHRhcmdldFJlbGF0aXZlUGF0aF0sXHJcbiAgICAgICAgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgICAgcihkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFJlbW92ZUFwcERhdGEodGFyZ2V0UmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJSZW1vdmVBcHBEYXRhXCIsIFt0YXJnZXRSZWxhdGl2ZVBhdGhdLCBmdW5jdGlvbiAoZGF0YTogYW55KSB7XHJcbiAgICAgICAgcihkYXRhKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8v5omT5byA5paH5Lu25omA5Zyo55qE55uu5b2VXHJcbiAgT3BlbkRpcihkaXI6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIk9wZW5EaXJcIiwgW2Rpcl0sIGZ1bmN0aW9uIChkYXRhOiBhbnkpIHtcclxuICAgICAgICByKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgU2VsZWN0T25lRmlsZVBhdGgodGl0bGU6IHN0cmluZywgZmlsdGVyczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHNpZCA9IERhdGUubm93KCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBjb25zdCBjYm5hbWUgPSBcImNcIiArIHNpZDtcclxuICAgICAgaXBjLmVtaXQoXHJcbiAgICAgICAgXCJTZWxlY3RPbmVGaWxlUGF0aFwiLFxyXG4gICAgICAgIFtzaWQsIHRpdGxlLCBmaWx0ZXJzXSxcclxuICAgICAgICBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICAgIGlmICghb2spIHtcclxuICAgICAgICAgICAgcihcIlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlwYy5vbihjYm5hbWUsIGZ1bmN0aW9uIChkaXI6IHN0cmluZykge1xyXG4gICAgICAgICAgICByKGRpcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8v5byA5ZCvcHJvamVjdHMg55qEaHR0cHNlcnZlclxyXG4gIFN0YXJ0SHR0cFNlcnZlcihwcmpGaWxlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3Qgc2lkID0gRGF0ZS5ub3coKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJTdGFydFByb2plY3RIdHRwU2VydmVyXCIsIFtwcmpGaWxlXSwgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgIHIoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvL+S4i+WcqOe6v+aWh+S7tiDpu5jorqTotoXml7bml7bpl7QyMOWIhumSn1xyXG4gIERvd25sb2FkRmlsZShcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgZnBhdGg6IHN0cmluZyxcclxuICAgIHRpbWVvdXRTZWNlbmQ6IG51bWJlciA9IDYwICogMjAsXHJcbiAgICBjYj86IChldmVudDogXCJzdGFydFwiIHwgXCJwcm9ncmVzc1wiIHwgXCJlcnJvclwiIHwgXCJzdWNjXCIsIHAxOiBOb3JtTXNnKSA9PiB2b2lkXHJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBzaWQgPSBcImRcIiArIERhdGUubm93KCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc29sZS5sb2codXJsLCBcIj09PlwiLCBmcGF0aCk7XHJcbiAgICAgIGNvbnN0IGNhbmNlbCA9IHRoaXMuT25Nc2coc2lkLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNiICYmIGNiKGRhdGEudHlwZSBhcyBhbnksIGRhdGEpO1xyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT0gXCJzdWNjXCIpIHtcclxuICAgICAgICAgIHIodHJ1ZSk7XHJcbiAgICAgICAgICBjYW5jZWwudW5iaW5kKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT0gXCJlcnJvclwiKSB7XHJcbiAgICAgICAgICByKGZhbHNlKTtcclxuICAgICAgICAgIGNhbmNlbC51bmJpbmQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFxyXG4gICAgICAgIFwiRG93bmxvYWRGaWxlXCIsXHJcbiAgICAgICAgW3NpZCwgZnBhdGgsIHVybCwgdGltZW91dFNlY2VuZF0sXHJcbiAgICAgICAgZnVuY3Rpb24gKGVycjogc3RyaW5nKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkRvd25sb2FkRmlsZSBjYWxsYmFja1wiKTtcclxuICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICByKGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFVuemlwKFxyXG4gICAgZnBhdGg6IHN0cmluZyxcclxuICAgIGRpc3REaXI6IHN0cmluZyxcclxuICAgIGNiPzogKGV2ZW50OiBcInByb2dyZXNzXCIgfCBcImVycm9yXCIgfCBcInN1Y2NcIiwgcDE6IE5vcm1Nc2cpID0+IHZvaWRcclxuICApIHtcclxuICAgIGNvbnN0IHNpZCA9IFwidW56aXBcIiArIERhdGUubm93KCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhbmNlbCA9IHRoaXMuT25Nc2coc2lkLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNiICYmIGNiKGRhdGEudHlwZSBhcyBhbnksIGRhdGEpO1xyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT0gXCJzdWNjXCIpIHtcclxuICAgICAgICAgIHIodHJ1ZSk7XHJcbiAgICAgICAgICBjYW5jZWwudW5iaW5kKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT0gXCJlcnJvclwiKSB7XHJcbiAgICAgICAgICByKGZhbHNlKTtcclxuICAgICAgICAgIGNhbmNlbC51bmJpbmQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJVbnppcFwiLCBbc2lkLCBmcGF0aCwgZGlzdERpcl0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvL+iOt+WPluaWh+S7tuWkueeahOWkp+Wwj1xyXG4gIC8v5paH5Lu255uu5b2V5LiN6KaB5aSq5aSn77yM5LiN54S25Lya5Y2h5q2756iL5bqPXHJcbiAgR2V0RGlyU2l6ZShkaXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiR2V0RGlyU2l6ZVwiLCBbZGlyXSwgZnVuY3Rpb24gKHNpemU6IG51bWJlcikge1xyXG4gICAgICAgIHIoc2l6ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvL+iOt+WPluezu+e7n+aVsOaNruebruW9lVxyXG4gIEdldEFwcERhdGFEaXIoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJHZXRBcHBEYXRhRGlyXCIsIFtdLCBmdW5jdGlvbiAoZGlyOiBzdHJpbmcpIHtcclxuICAgICAgICByKGRpcik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBPcGVuQXNzZXRXaW5kb3cocHJvamVjdFBhdGg6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcclxuICAgICAgICBcIm9wZW5Bc3NldHNXaW5kb3dcIixcclxuICAgICAgICBbXHJcbiAgICAgICAgICBgJHtsb2NhdGlvbi5ob3N0fS9saWJyYXJ5Lmh0bWw/cGF0aD0ke3Byb2plY3RQYXRofWAsXHJcbiAgICAgICAgICBcIui1hOa6kOeuoeeQhuW6k1wiLFxyXG4gICAgICAgICAgMTI4MCxcclxuICAgICAgICAgIDk2MCxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgICAgcihvayk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBTZW5kTXNnKHN1YmplY3Q6IHN0cmluZywgbXNnOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNvbm4gPSB0aGlzLl9jb25uO1xyXG4gICAgaWYgKCFjb25uKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCLlupTnlKhzb2NrZXTlvILluLhcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbm4uc2VuZChlbmNvZGVOb3JtTXNnKHsgc3ViOiBzdWJqZWN0LCBtc2c6IG1zZyB9KSk7XHJcbiAgfVxyXG5cclxuICBPbk1zZyhzdWJqZWN0OiBzdHJpbmcsIGNiOiAobXNnOiBOb3JtTXNnKSA9PiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLm9uKFwib25cIiArIHN1YmplY3QsIGNiKTtcclxuICB9XHJcblxyXG4gIC8v5ZCM5q2l6Zi75aGe5b2T5YmN6L+b56iLXHJcbiAgVXBsb2FkU3luYyhmaWxlczogVXBsb2FkSXRlbVtdKTogUHJvbWlzZTxVcGxvYWRJdGVtW10+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJVcGxvYWRTeW5jXCIsIFtmaWxlc10sIGZ1bmN0aW9uIChyZXQ6IGFueSkge1xyXG4gICAgICAgIHIocmV0KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8v5byC5q2l5LiK5Lyg5LiN5Lya6Zi75aGe5b2T5YmN6L+b56iLXHJcbiAgVXBsb2FkQVN5bmMoZmlsZXM6IFVwbG9hZEl0ZW1bXSk6IFByb21pc2U8VXBsb2FkSXRlbVtdPiB7XHJcbiAgICBjb25zdCBzaWQgPSBcInVcIiArIERhdGUubm93KCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiVXBsb2FkQVN5bmNcIiwgW3NpZCwgZmlsZXNdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoIW9rKSB7XHJcbiAgICAgICAgICByKFtdKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaXBjLm9uKHNpZCwgKGl0ZW1zOiBhbnkpID0+IHtcclxuICAgICAgICAgIHIoaXRlbXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/lvILmraXkuIrkvKDkuI3kvJrpmLvloZ7lvZPliY3ov5vnqItcclxuICBVcGxvYWREaXIoZGlyOiBzdHJpbmcsIHRhcmdldERpcjogc3RyaW5nKTogUHJvbWlzZTxVcGxvYWRJdGVtW10+IHtcclxuICAgIGNvbnN0IHNpZCA9IFwidVwiICsgRGF0ZS5ub3coKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJVcGxvYWREaXJcIiwgW3NpZCwgZGlyLCB0YXJnZXREaXJdLCBmdW5jdGlvbiAob2s6IGFueSkge1xyXG4gICAgICAgIGlmICghb2spIHtcclxuICAgICAgICAgIHIoW10pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpcGMub24oc2lkLCAoaXRlbXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcihpdGVtcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBHZXRGaWxlc0luRGlyKGRpcjogc3RyaW5nLCBmaWx0ZXI6IHN0cmluZyk6IFByb21pc2U8RmlsZUluZm9bXT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIkdldEZpbGVzSW5EaXJcIiwgW2RpciwgZmlsdGVyXSwgZnVuY3Rpb24gKHJldDogYW55KSB7XHJcbiAgICAgICAgcihyZXQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBHZXRSdW5uaW5nQXBwKCk6IFByb21pc2U8eyBHdWlkOiBzdHJpbmc7IFRpdGxlOiBzdHJpbmc7IEtleTogc3RyaW5nIH1bXT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcclxuICAgICAgICBcIkdldFJ1bm5pbmdBcHBcIixcclxuICAgICAgICBbXSxcclxuICAgICAgICBmdW5jdGlvbiAoYXBwczogeyBHdWlkOiBzdHJpbmc7IFRpdGxlOiBzdHJpbmc7IEtleTogc3RyaW5nIH1bXSkge1xyXG4gICAgICAgICAgcihhcHBzKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEdldFN1YkRpck5hbWVzKGRpcjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIkdldFN1YkRpck5hbWVzXCIsIFtkaXJdLCBmdW5jdGlvbiAocmV0OiBhbnkpIHtcclxuICAgICAgICByKHJldCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBSZW1vdmVGaWxlKGZwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJSZW1vdmVGaWxlXCIsIFtmcGF0aF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBSZW1vdmVEaXIoZnBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlJlbW92ZURpclwiLCBbZnBhdGhdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEdldFNhdmVGaWxlKHRpdGxlOiBzdHJpbmcsIGZpbHRlciA9IFwi5Zu+54mHKCoucG5nOyouanBnKVwiKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHNpZCA9IFwic2ZcIiArIERhdGUubm93KCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiR2V0U2F2ZUZpbGVcIiwgW3NpZCwgdGl0bGUsIGZpbHRlcl0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChvaykge1xyXG4gICAgICAgICAgaXBjLm9uKHNpZCwgKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHIocmV0KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByKFwiXCIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgT3Blbk9uZUZpbGUodGl0bGU6IHN0cmluZywgZmlsdGVyID0gXCLlm77niYcoKi5wbmc7Ki5qcGcpXCIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3Qgc2lkID0gXCJzZlwiICsgRGF0ZS5ub3coKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJPcGVuT25lRmlsZVwiLCBbc2lkLCB0aXRsZSwgZmlsdGVyXSwgZnVuY3Rpb24gKGZpbGU6IGFueSkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgcihmaWxlKTtcclxuICAgICAgICB9LCAwKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEdldEltYWdlTWV0YShcclxuICAgIGZwYXRoOiBzdHJpbmdcclxuICApOiBQcm9taXNlPHsgV2lkdGg6IG51bWJlcjsgSGVpZ2h0OiBudW1iZXI7IFNpemU6IG51bWJlciB9PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgcih7IFdpZHRoOiBpbWcud2lkdGgsIEhlaWdodDogaW1nLmhlaWdodCwgU2l6ZTogMCB9KTtcclxuICAgICAgfTtcclxuICAgICAgaW1nLnNyYyA9IGZwYXRoO1xyXG5cclxuICAgICAgLy8gY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIC8vIGlwYy5lbWl0KFwiR2V0SW1hZ2VNZXRhXCIsIFtmcGF0aF0sIGZ1bmN0aW9uIChtZXRhKSB7XHJcbiAgICAgIC8vICAgICByKG1ldGEpO1xyXG4gICAgICAvLyB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgU2V0TWFpblRpdGxlKHRpdGxlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJTZXRNYWluVGl0bGVcIiwgW3RpdGxlXSwgZnVuY3Rpb24gKG9rOiBhbnkpIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFNhdmVGaWxlKGZwYXRoOiBzdHJpbmcsIGJ1ZmY6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiU2F2ZUZpbGVcIiwgW2ZwYXRoLCBBcnJheS5mcm9tKGJ1ZmYpXSwgZnVuY3Rpb24gKGVycjogc3RyaW5nKSB7XHJcbiAgICAgICAgcihlcnIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgT3BlblF1ZWVuNSh1cmw6IHN0cmluZywgdGl0bGU6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIk9wZW5RdWVlbjVcIiwgW3VybCwgdGl0bGVdLCBmdW5jdGlvbiAoZXJyOiBhbnkpIHtcclxuICAgICAgICByKGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIE9wZW5RdWVlbjVQbGF5KHVybDogc3RyaW5nLCB0aXRsZTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiT3BlblF1ZWVuNVBsYXlcIiwgW3VybCwgdGl0bGVdLCBmdW5jdGlvbiAoZXJyOiBhbnkpIHtcclxuICAgICAgICByKGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBTYXZlQmxvYkZpbGUodXJsOiBzdHJpbmcsIGZiYXNlNjRwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnNvbGUubG9nKFwic2F2ZSBibG9iIHRvIFwiLCBmYmFzZTY0cGF0aCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhbmNlbCA9IHRoaXMub24oXCJkb3dubG9hZHN1Y2NcIiwgKGRwYXRoOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImZwYXRoPT5cIiwgZHBhdGgpO1xyXG4gICAgICAgIGlmIChmYmFzZTY0cGF0aCA9PSBCYXNlNjQuZW5jb2RlKGRwYXRoKSkge1xyXG4gICAgICAgICAgY2FuY2VsLnVuYmluZCgpO1xyXG4gICAgICAgICAgcih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBzYXZlQXModXJsLCBmYmFzZTY0cGF0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFNhdmVDbGlwYm9hcmQoYmxvYjogQmxvYikge1xyXG4gICAgcmV0dXJuIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGUoW1xyXG4gICAgICBuZXcgQ2xpcGJvYXJkSXRlbSh7XHJcbiAgICAgICAgXCJpbWFnZS9wbmdcIjogYmxvYixcclxuICAgICAgfSksXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIEdldE5hdHNQcm9maWxlKCk6IFByb21pc2U8eyBhcGlQb3J0OiBzdHJpbmc7IHdzUG9ydDogc3RyaW5nOyBpcDogc3RyaW5nIH0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJOYXRzUHJvZmlsZVwiLCBbXSwgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgIHIoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBPcGVuV2ViKFxyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICB0aXRsZTogc3RyaW5nLFxyXG4gICAgd2lkdGggPSAxMjgwLFxyXG4gICAgaGVpZ2h0ID0gNzIwXHJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiT3BlbldlYlwiLCBbdXJsLCB0aXRsZSwgd2lkdGgsIGhlaWdodF0sIGZ1bmN0aW9uIChkYXRhOiBhbnkpIHtcclxuICAgICAgICByKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgUnVuTmF0aXZlQXBwKFxyXG4gICAgZ3VpZDogc3RyaW5nLFxyXG4gICAgZW50cnk6IHN0cmluZyxcclxuICAgIHBhcmFtczogc3RyaW5nW10sXHJcbiAgICB0aXRsZTogc3RyaW5nLFxyXG4gICAga2V5OiBzdHJpbmdcclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcclxuICAgICAgICBcIlJ1bk5hdGl2ZUFwcFwiLFxyXG4gICAgICAgIFtndWlkLCBlbnRyeSwgcGFyYW1zLCB0aXRsZSwga2V5XSxcclxuICAgICAgICBmdW5jdGlvbiAoZXJyOiBzdHJpbmcpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwieHh4eFwiLCBlcnIpO1xyXG4gICAgICAgICAgcihlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgUnVuQ21kU3ZjQXBwKFxyXG4gICAgZ3VpZDogc3RyaW5nLFxyXG4gICAgd2ViVXJsOiBzdHJpbmcsXHJcbiAgICBlbnRyeTogc3RyaW5nLFxyXG4gICAgcGFyYW1zOiBzdHJpbmdbXSxcclxuICAgIHRpdGxlOiBzdHJpbmcsXHJcbiAgICBrZXk6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFxyXG4gICAgICAgIFwiUnVuQ21kU3ZjQXBwXCIsXHJcbiAgICAgICAgW2d1aWQsIHdlYlVybCwgZW50cnksIHBhcmFtcywgdGl0bGUsIGtleV0sXHJcbiAgICAgICAgZnVuY3Rpb24gKGVycjogc3RyaW5nKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInh4eHhcIiwgZXJyKTtcclxuICAgICAgICAgIHIoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFN0b3BOYXRpdmVBcHAoZ3VpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiU3RvcE5hdGl2ZUFwcFwiLCBbZ3VpZF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBMYW5jaGVyVXBncmFkZSh1cGRhdGVVcmw6IHN0cmluZywgbGFuY2hlclVybDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiVXBncmFkZVwiLCBbdXBkYXRlVXJsLCBsYW5jaGVyVXJsXSwgZnVuY3Rpb24gKG9rOiBib29sZWFuKSB7XHJcbiAgICAgICAgcihvayk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIENyZWF0ZVNob3J0Y3V0KFxyXG4gICAgYXBwTmFtZTogc3RyaW5nLFxyXG4gICAgbGFuY2hlclBhdGg6IHN0cmluZyxcclxuICAgIGljb1BhdGg6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcclxuICAgICAgICBcIkNyZWF0ZVNob3J0Y3V0XCIsXHJcbiAgICAgICAgW2FwcE5hbWUsIGxhbmNoZXJQYXRoLCBpY29QYXRoXSxcclxuICAgICAgICBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICAgIHIob2spO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBEZWxldGVTaG9ydGN1dChhcHBOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJEZWxldGVTaG9ydGN1dFwiLCBbYXBwTmFtZV0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBSZXN1bWVNYWluV25kKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlJlc3VtZU1haW5XbmRcIiwgW10sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBIaWRlTWFpblduZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJIaWRlTWFpblduZFwiLCBbXSwgZnVuY3Rpb24gKG9rOiBib29sZWFuKSB7XHJcbiAgICAgICAgcihvayk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFF1aXRMYW5jaGVyKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIlF1aXRMYW5jaGVyXCIsIFtdLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgTWF4V2luZG93KGlzTWF4OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFwiTWF4V2luZG93XCIsIFtpc01heF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBGb2xkV2luZG93KGlzRm9sZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlwYyA9IHRoaXMuaXBjO1xyXG4gICAgICBpcGMuZW1pdChcIkZvbGRXaW5kb3dcIiwgW2lzRm9sZF0sIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgIHIob2spO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgVHJheU5vdGljZShub3RpY2U6IHtcclxuICAgIHRpdGxlPzogc3RyaW5nO1xyXG4gICAgY29udGV4dDogc3RyaW5nO1xyXG4gICAgdGltZW91dD86IG51bWJlcjtcclxuICB9KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcclxuICAgICAgY29uc3QgaXBjID0gdGhpcy5pcGM7XHJcbiAgICAgIGlwYy5lbWl0KFxyXG4gICAgICAgIFwiVHJheU5vdGljZVwiLFxyXG4gICAgICAgIFtub3RpY2UudGl0bGUgfHwgXCLmj5DnpLpcIiwgbm90aWNlLmNvbnRleHQsIG5vdGljZS50aW1lb3V0IHx8IDIwMDBdLFxyXG4gICAgICAgIGZ1bmN0aW9uIChvazogYm9vbGVhbikge1xyXG4gICAgICAgICAgcihvayk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFVwZGF0ZUNvbmZpZyh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4ge1xyXG4gICAgICBjb25zdCBpcGMgPSB0aGlzLmlwYztcclxuICAgICAgaXBjLmVtaXQoXCJVcGRhdGVDb25maWdcIiwgW3ZlcnNpb25dLCBmdW5jdGlvbiAob2s6IGJvb2xlYW4pIHtcclxuICAgICAgICByKG9rKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtc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
|