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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