(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/common/loadermanager.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, 'd22c81wFEpPQq3vcJUA0bsW', 'loadermanager'); // Scripts/common/loadermanager.js "use strict"; // -------------------------------------------------------------------- // @author: shiraho@syg.com(必填, 创建模块的人员) // @description: // 加载资源控制器,到时候直接修改这边就好了 //
Create: new Date().toISOString() // -------------------------------------------------------------------- var FileInfo = require("fileinfo"); var ZipLoader = require("ZipLoader"); var PathTool = require("pathtool"); var DownloadManager = require("downloadmanager"); var SpineLoadingItem = require("spine_loading_item"); window.LoaderManager = cc.Class({ properties: { // 当前拥有资源管理 resources_list: { "default": {} }, //当前已加载数据 data_list: { "default": {} }, // 界面资源管理 reference_key_counter: { // 界面资源计数 "default": {} }, skeleton_counter: { // 动画计数 "default": {} }, spine_counter: { "default": {} }, release_sqe: { "default": {} }, loading_spines: { "default": {} }, _sprite_frame_cache: { "default": {} }, _prefab_time: 0, is_loading: false }, ctor: function ctor() { this.mainloop_timer = gcore.Timer.set(function () { this.update(1); }.bind(this), 1000, -1); }, statics: { instance: null }, update: function update(dt) { this._prefab_time += 1; if (this._prefab_time >= 60) { if (!this.is_loading) { cc.log("开始释放没用的预设资源"); this.clearRes(); this._prefab_time = 0; } } // for (var resi in this.release_sqe) { // this.release_sqe[resi] -= dt; // if (this.release_sqe[resi] < 0) { // this.releseSpienRes(resi); // delete this.release_sqe[resi]; // } // } }, // 加载资源,比如预制体类的,带上路径后缀,例如:预设体就是.prefab,图集就是.plist,图片就是.png或者.jpg等 loadRes: function loadRes(path, callback) { if (path == null) { return; } var loadInfo = this.getResInfo(path); switch (loadInfo.load_type) { case cc.Prefab: this.loadPrefab(loadInfo.str_key, callback); break; case cc.SpriteAtlas: this.loadAtlas(loadInfo.str_key, callback); break; case sp.SkeletonData: this.loadSpine(loadInfo.str_key, callback); break; default: { this.loadUsuallyRes(loadInfo.str_key, callback, loadInfo.load_type); } } }, releaseRes: function releaseRes(path) { if (path == null) { return; } var loadInfo = this.getResInfo(path); switch (loadInfo.load_type) { case cc.Prefab: this.releasePrefab(loadInfo.str_key); break; case cc.SpriteAtlas: this.releaseAtlas(loadInfo.str_key); break; case sp.SkeletonData: this.releaseSpine(loadInfo.str_key); break; default: { this.releaseUsuallyRes(loadInfo.str_key, loadInfo.load_type); } } }, loadUsuallyRes: function loadUsuallyRes(path, callback, load_type) { // 动态加载界面资源 // gcore.Timer.set(function(path, callback, load_type) { if (path.indexOf("ui_res") > -1) { this.is_loading = true; cc.loader.loadRes(path, load_type, function (path, errorMessage, resObject) { if (!errorMessage && resObject) { var deps = cc.loader.getDependsRecursively(resObject); for (var dep_i in deps) { this.countReference(deps[dep_i]); } callback(resObject); } else { cc.error(errorMessage, "load usuallyRes faild--->" + path); } this.is_loading = false; }.bind(this, path)); return; } if (this._sprite_frame_cache[path]) { callback(this._sprite_frame_cache[path]); return; } if (this.resources_list[path] && this.resources_list[path]["obj"]) { this.resources_list[path]["count"]++; callback(this.resources_list[path]["obj"]); return; } cc.loader.loadRes(path, load_type, function (path, errorMessage, resObject) { if (!errorMessage) { if (!this.resources_list[path]) { this.resources_list[path] = {}; this.resources_list[path]["obj"] = resObject; this.resources_list[path]["count"] = 0; } this.resources_list[path]["count"]++; callback(resObject); } else { cc.error(errorMessage, "load usuallyRes faild--->" + path); } }.bind(this, path)); // }.bind(this, path, callback, load_type), 50, 1) }, releaseUsuallyRes: function releaseUsuallyRes(path, res_type) { if (this._sprite_frame_cache[path]) { return; } if (path.indexOf("ui_res") > -1) { // var res_obj = cc.loader.getRes(path, res_type); // if (res_obj) { // var deps = cc.loader.getDependsRecursively(res_obj); // for (var dep_i in deps) { // this.countReference(deps[dep_i], -1); // } // } return; } if (this.resources_list[path]) { --this.resources_list[path]["count"]; // if (this.resources_list[path]["count"] <= 0) { // var releay_res = cc.loader.getDependsRecursively(this.resources_list[path]["obj"]); // cc.loader.release(releay_res); // delete this.resources_list[path]; // } } }, // 资源图集可以被加载很多次,但释放只需要一次就可以释放 loadAtlas: function loadAtlas(path, callback) { var atlasObj = cc.loader.getRes(path, cc.SpriteAtlas); if (atlasObj) { this.countReference(atlasObj); callback(atlasObj); return; } cc.loader.loadRes(path, cc.SpriteAtlas, function (path, err, atlsObj) { if (path) { for (var path_i in cacheAtlas) { if (cacheAtlas[path_i] == path) { var spriteFramas = atlsObj.getSpriteFrames(); for (var item_i in spriteFramas) { var spriteFrame = spriteFramas[item_i]; var itemn_path = "res/item/" + spriteFrame.name; this._sprite_frame_cache[itemn_path] = spriteFrame; } break; } } } if (!err && callback) { this.countReference(atlsObj); callback(atlsObj); } else { cc.error(err, "load preafa faild--->" + path); } }.bind(this, path)); }, releaseAtlas: function releaseAtlas(path) { var atlasObj = cc.loader.getRes(path); if (atlasObj) { this.countReference(atlasObj, -1); } }, // 加载spine资源 loadSpine: function loadSpine(spinePath, callback) { if (!spinePath) return; if (window.OUT_SPINE) { var spine_infos = spinePath.split("/"); var action = spine_infos.pop(); var anima_id = spine_infos.pop(); var loadItem = new SpineLoadingItem(anima_id, action, callback); } else { if (this.release_sqe[spinePath]) { delete this.release_sqe[spinePath]; this.spine_counter[spinePath] = 0; } if (!this.loading_spines[spinePath]) this.loading_spines[spinePath] = true; cc.loader.loadRes(spinePath, sp.SkeletonData, function (spinePath, error, resObject) { if (!error) { if (this.spine_counter[spinePath] > 0) { this.spine_counter[spinePath] += 1; } else { this.spine_counter[spinePath] = 1; } callback(resObject); if (this.loading_spines[spinePath]) delete this.loading_spines[spinePath]; } else { callback(); cc.error(error, "load spine faild--->" + spinePath); } }.bind(this, spinePath)); } }, // 释放spine资源 releaseSpine: function releaseSpine(spinePath) { return; if (!spinePath) return; if (this.spine_counter[spinePath] === undefined) { return; } if (this.spine_counter[spinePath] > 0) --this.spine_counter[spinePath]; if (this.spine_counter[spinePath] > 0) return; this.releseSpienRes(spinePath); }, delteSpine: function delteSpine(spinePath) { this.releseSpienRes(spinePath); }, releseSpienRes: function releseSpienRes(spinePath) { if (!this.loading_spines[spinePath]) { var skeleton_data = cc.loader.getRes(spinePath, sp.SkeletonData); var atlas_data = cc.loader.getRes(spinePath, cc.SpriteAtlas); if (skeleton_data) { var deps = cc.loader.getDependsRecursively(skeleton_data); for (var deps_i in deps) { var depsData = cc.loader.getRes(deps[deps_i]); cc.loader.release(depsData); } cc.loader.release(skeleton_data); } } }, /** * 基于参考key的引用计数 * @author zhanghuxing 2018-12-20 * @param asset 资源对象 * @param count 数量 * @return {[type]} */ countReference: function countReference(assetOrKey, count) { if (!assetOrKey) return; count = count === undefined ? 1 : count; var referenceKey; // if (assetOrKey instanceof cc.Asset) { // referenceKey = cc.loader._getReferenceKey(assetOrKey); // if (assetOrKey instanceof cc.SpriteAtlas) { // var dependes = cc.loader.getDependsRecursively(assetOrKey); // for (var keyIndex in dependes) { // this.countReference(dependes[keyIndex], count); // } // } // } else { referenceKey = assetOrKey; // } if (!this.reference_key_counter[referenceKey]) this.reference_key_counter[referenceKey] = 0; this.reference_key_counter[referenceKey] += count; // if (this.reference_key_counter[referenceKey] <= 0) { // // 释放png资源 // cc.loader.release(referenceKey); // } }, clearRes: function clearRes() { for (var res_key in this.reference_key_counter) { if (!this.reference_key_counter[res_key]) this.reference_key_counter[res_key] = 0; if (this.reference_key_counter[res_key] <= 0) { // 释放png资源 cc.loader.release(res_key); delete this.reference_key_counter[res_key]; } } for (var res_i in this.resources_list) { if (this.resources_list[res_i]["count"] <= 0) { var releay_res = cc.loader.getDependsRecursively(this.resources_list[res_i]["obj"]); cc.loader.release(releay_res); delete this.resources_list[res_i]; } } }, releaseByReferenceKey: function releaseByReferenceKey(referenceKey) {}, // 加载预制资源 loadPrefab: function loadPrefab(path, callback) { if (!window.PREFAB_BUILD) { CC_SUPPORT_JIT = false; this.is_loading = true; cc.loader.loadRes(path, cc.Prefab, function (err, prefab) { CC_SUPPORT_JIT = true; if (!err) { if (callback && !game.preload_loading || path == "prefab/drama/guide_main_view") { var deps = cc.loader.getDependsRecursively(prefab); for (var resIndex in deps) { // var testAsset = cc.loader.getRes(deps[resIndex]); this.countReference(deps[resIndex]); } callback(cc.instantiate(prefab)); } } else { if (callback) callback(); cc.error(err, "load preafa faild--->" + path); } this.is_loading = false; }.bind(this)); } else { var preafab_info = path.split("/"); var prefab_name = preafab_info.pop() + "_p"; var total_name = preafab_info.pop() + "_" + prefab_name; cc.loader.loadRes("prefabjs/" + total_name, cc.JsonAsset, function (total_name, err, text_data) { var testJS = require(total_name); var testObj = new testJS(text_data.json); // testObj.node.x = this.rootNd.width * 0.5; // testObj.node.y = this.rootNd.height * 0.5; callback(testObj.node); }.bind(this, total_name)); } }, // 释放预制资源 releasePrefab: function releasePrefab(path) { var testAsset = cc.loader.getRes(path); var deps = cc.loader.getDependsRecursively(testAsset); for (var resIndex in deps) { var testAsset = cc.loader.getRes(deps[resIndex]); this.countReference(deps[resIndex], -1); } }, // 释放资源 deleteRes: function deleteRes(path) { this.releaseRes(path); // if (this.resources_list[path]) { // var fileInfo = this.resources_list[path]; // fileInfo.decrementLoadNum(); // var loadNum = fileInfo.getLoadNum(); // if (loadNum <= 0){ // cc.loader.releaseRes(fileInfo.url); // fileInfo.deleteMe(); // this.resources_list[path] = null; // } // } }, getResInfo: function getResInfo(path) { // 资源类型的起始位置下表 var type_index = path.indexOf("."); // 字符串总长度 var total_num = path.length; // 剔除字符串类型的路径 var str_key = path.substring(0, type_index); // 资源纹理格式 var assets_type = path.substring(type_index, total_num); // 需要加载的资源格式 var load_type = this.getAssetsTypeSuffix(assets_type); // 后续这里要加上版本信息以及url路径处理 var resulet = {}; resulet.str_key = str_key; resulet.load_type = load_type; return resulet; }, getAssetsTypeSuffix: function getAssetsTypeSuffix(suffix) { switch (suffix) { case ".jpg": case ".png": return cc.SpriteFrame; case ".plist": return cc.SpriteAtlas; case ".mp3": return cc.AudioClip; case ".atlas": return sp.SkeletonData; case ".prefab": return cc.Prefab; } }, initConfigs: function initConfigs(callback) { // var config_zip_url = DATA_URL + "data.zip" + "?" + DATA_VER; // 微信小游戏不使用二进制文件 if (window.DEBUG_Data) { var ModuleInfo = require("modulelist"); var time = gcore.SmartSocket.getTime(); var data_url = "https://dev-h5-sszg.shiyuegame.com/data/"; var total_num = 0; for (var cfg_i = 0; cfg_i < ModuleInfo.data_list.length; cfg_i++) { var totoal_url = data_url + ModuleInfo.data_list[cfg_i] + ".json" + "?time=" + time; cc.loader.load(totoal_url, function (name, err, json_data) { total_num++; if (!err) { Config[name] = json_data; } if (total_num == ModuleInfo.data_list.length) { callback(); } else { callback(total_num / ModuleInfo.data_list.length); } }.bind(this, ModuleInfo.data_list[cfg_i])); } } else { if (PLATFORM_TYPR == "WX_SDK" || PLATFORM_TYPR == "SH_SDK" || PLATFORM_TYPR == "QQ_SDK") { var ModuleInfo = require("modulelist"); var totalNum = ModuleInfo.data_list.length; var finishNum = 0; for (var cfg_i = 0; cfg_i < ModuleInfo.data_list.length; cfg_i++) { var data_path = "data/" + ModuleInfo.data_list[cfg_i]; gcore.Timer.set(function (data_path, cfg_i) { cc.loader.loadRes(data_path, cc.JsonAsset, function (name, err, jsonData) { Config[name] = jsonData.json; finishNum++; cc.log(Config); if (finishNum == totalNum) { callback(); } else { callback(finishNum / totalNum); } }.bind(this, ModuleInfo.data_list[cfg_i])); }.bind(this, data_path, cfg_i), 20 * cfg_i, 1); } } else { ZipLoader.RegisterZipLoader(); var data_path = cc.url.raw("resources/data/data.zip"); cc.loader.load(data_path, function (err, zipData) { var JSZip = require("jszip"); zipData = new JSZip(zipData, { checkCRC32: false }); if (zipData) { var total_num = 0; var cur_num = 0; for (var data_i in zipData.files) { total_num++; gcore.Timer.set(function (data_i, cur_num) { var data = JSON.parse(zipData.files[data_i].asText()); var file_name = data_i.substring(0, data_i.length - 5); Config[file_name] = data; var progress = cur_num / 66; callback(progress); if (cur_num >= total_num && cur_num > 0) { if (callback) callback(); } }.bind(this, data_i, total_num), 20 * total_num, 1); } } }.bind(this)); } } }, initConfigScript: function initConfigScript(finish_cb) { // 发布版本,需要加载合并后json后的JS文件 if (window.USE_MERGE_JSON) { var data_path = "src/merge_json" + (window.PACKAGE_VERSION || "") + ".js"; // var data_path = "src/merge_json" + ".js"; console.log("___json==>", data_path); cc.loader.load(data_path, function (err, data) { if (data) { console.log("加载merge成功"); // console.log(window.ImportConfigs) } if (err) { console.log("加载merge_json失败"); console.log(err); } }); } } }); LoaderManager.getInstance = function () { if (!LoaderManager.instance) { LoaderManager.instance = new LoaderManager(); } return LoaderManager.instance; }; module.exports = LoaderManager; cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcY29tbW9uXFxsb2FkZXJtYW5hZ2VyLmpzIl0sIm5hbWVzIjpbIkZpbGVJbmZvIiwicmVxdWlyZSIsIlppcExvYWRlciIsIlBhdGhUb29sIiwiRG93bmxvYWRNYW5hZ2VyIiwiU3BpbmVMb2FkaW5nSXRlbSIsIndpbmRvdyIsIkxvYWRlck1hbmFnZXIiLCJjYyIsIkNsYXNzIiwicHJvcGVydGllcyIsInJlc291cmNlc19saXN0IiwiZGF0YV9saXN0IiwicmVmZXJlbmNlX2tleV9jb3VudGVyIiwic2tlbGV0b25fY291bnRlciIsInNwaW5lX2NvdW50ZXIiLCJyZWxlYXNlX3NxZSIsImxvYWRpbmdfc3BpbmVzIiwiX3Nwcml0ZV9mcmFtZV9jYWNoZSIsIl9wcmVmYWJfdGltZSIsImlzX2xvYWRpbmciLCJjdG9yIiwibWFpbmxvb3BfdGltZXIiLCJnY29yZSIsIlRpbWVyIiwic2V0IiwidXBkYXRlIiwiYmluZCIsInN0YXRpY3MiLCJpbnN0YW5jZSIsImR0IiwibG9nIiwiY2xlYXJSZXMiLCJsb2FkUmVzIiwicGF0aCIsImNhbGxiYWNrIiwibG9hZEluZm8iLCJnZXRSZXNJbmZvIiwibG9hZF90eXBlIiwiUHJlZmFiIiwibG9hZFByZWZhYiIsInN0cl9rZXkiLCJTcHJpdGVBdGxhcyIsImxvYWRBdGxhcyIsInNwIiwiU2tlbGV0b25EYXRhIiwibG9hZFNwaW5lIiwibG9hZFVzdWFsbHlSZXMiLCJyZWxlYXNlUmVzIiwicmVsZWFzZVByZWZhYiIsInJlbGVhc2VBdGxhcyIsInJlbGVhc2VTcGluZSIsInJlbGVhc2VVc3VhbGx5UmVzIiwiaW5kZXhPZiIsImxvYWRlciIsImVycm9yTWVzc2FnZSIsInJlc09iamVjdCIsImRlcHMiLCJnZXREZXBlbmRzUmVjdXJzaXZlbHkiLCJkZXBfaSIsImNvdW50UmVmZXJlbmNlIiwiZXJyb3IiLCJyZXNfdHlwZSIsImF0bGFzT2JqIiwiZ2V0UmVzIiwiZXJyIiwiYXRsc09iaiIsInBhdGhfaSIsImNhY2hlQXRsYXMiLCJzcHJpdGVGcmFtYXMiLCJnZXRTcHJpdGVGcmFtZXMiLCJpdGVtX2kiLCJzcHJpdGVGcmFtZSIsIml0ZW1uX3BhdGgiLCJuYW1lIiwic3BpbmVQYXRoIiwiT1VUX1NQSU5FIiwic3BpbmVfaW5mb3MiLCJzcGxpdCIsImFjdGlvbiIsInBvcCIsImFuaW1hX2lkIiwibG9hZEl0ZW0iLCJ1bmRlZmluZWQiLCJyZWxlc2VTcGllblJlcyIsImRlbHRlU3BpbmUiLCJza2VsZXRvbl9kYXRhIiwiYXRsYXNfZGF0YSIsImRlcHNfaSIsImRlcHNEYXRhIiwicmVsZWFzZSIsImFzc2V0T3JLZXkiLCJjb3VudCIsInJlZmVyZW5jZUtleSIsInJlc19rZXkiLCJyZXNfaSIsInJlbGVheV9yZXMiLCJyZWxlYXNlQnlSZWZlcmVuY2VLZXkiLCJQUkVGQUJfQlVJTEQiLCJDQ19TVVBQT1JUX0pJVCIsInByZWZhYiIsImdhbWUiLCJwcmVsb2FkX2xvYWRpbmciLCJyZXNJbmRleCIsImluc3RhbnRpYXRlIiwicHJlYWZhYl9pbmZvIiwicHJlZmFiX25hbWUiLCJ0b3RhbF9uYW1lIiwiSnNvbkFzc2V0IiwidGV4dF9kYXRhIiwidGVzdEpTIiwidGVzdE9iaiIsImpzb24iLCJub2RlIiwidGVzdEFzc2V0IiwiZGVsZXRlUmVzIiwidHlwZV9pbmRleCIsInRvdGFsX251bSIsImxlbmd0aCIsInN1YnN0cmluZyIsImFzc2V0c190eXBlIiwiZ2V0QXNzZXRzVHlwZVN1ZmZpeCIsInJlc3VsZXQiLCJzdWZmaXgiLCJTcHJpdGVGcmFtZSIsIkF1ZGlvQ2xpcCIsImluaXRDb25maWdzIiwiREVCVUdfRGF0YSIsIk1vZHVsZUluZm8iLCJ0aW1lIiwiU21hcnRTb2NrZXQiLCJnZXRUaW1lIiwiZGF0YV91cmwiLCJjZmdfaSIsInRvdG9hbF91cmwiLCJsb2FkIiwianNvbl9kYXRhIiwiQ29uZmlnIiwiUExBVEZPUk1fVFlQUiIsInRvdGFsTnVtIiwiZmluaXNoTnVtIiwiZGF0YV9wYXRoIiwianNvbkRhdGEiLCJSZWdpc3RlclppcExvYWRlciIsInVybCIsInJhdyIsInppcERhdGEiLCJKU1ppcCIsImNoZWNrQ1JDMzIiLCJjdXJfbnVtIiwiZGF0YV9pIiwiZmlsZXMiLCJkYXRhIiwiSlNPTiIsInBhcnNlIiwiYXNUZXh0IiwiZmlsZV9uYW1lIiwicHJvZ3Jlc3MiLCJpbml0Q29uZmlnU2NyaXB0IiwiZmluaXNoX2NiIiwiVVNFX01FUkdFX0pTT04iLCJQQUNLQUdFX1ZFUlNJT04iLCJjb25zb2xlIiwiZ2V0SW5zdGFuY2UiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBV0MsT0FBTyxDQUFDLFVBQUQsQ0FBOUI7O0FBQ0EsSUFBSUMsU0FBUyxHQUFVRCxPQUFPLENBQUMsV0FBRCxDQUE5Qjs7QUFDQSxJQUFJRSxRQUFRLEdBQVdGLE9BQU8sQ0FBQyxVQUFELENBQTlCOztBQUNBLElBQUlHLGVBQWUsR0FBSUgsT0FBTyxDQUFDLGlCQUFELENBQTlCOztBQUNBLElBQUlJLGdCQUFnQixHQUFHSixPQUFPLENBQUMsb0JBQUQsQ0FBOUI7O0FBRUFLLE1BQU0sQ0FBQ0MsYUFBUCxHQUF1QkMsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFFNUJDLEVBQUFBLFVBQVUsRUFBRTtBQUNSO0FBQ0FDLElBQUFBLGNBQWMsRUFBRTtBQUNaLGlCQUFTO0FBREcsS0FGUjtBQUtSO0FBQ0FDLElBQUFBLFNBQVMsRUFBRTtBQUNQLGlCQUFTO0FBREYsS0FOSDtBQVNSO0FBQ0FDLElBQUFBLHFCQUFxQixFQUFFO0FBQUs7QUFDeEIsaUJBQVM7QUFEVSxLQVZmO0FBYVJDLElBQUFBLGdCQUFnQixFQUFFO0FBQVU7QUFDeEIsaUJBQVM7QUFESyxLQWJWO0FBZ0JSQyxJQUFBQSxhQUFhLEVBQUU7QUFDWCxpQkFBUztBQURFLEtBaEJQO0FBbUJSQyxJQUFBQSxXQUFXLEVBQUU7QUFDVCxpQkFBUztBQURBLEtBbkJM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RUFBRSwwQkFBU0MsU0FBVCxFQUFvQjtBQUNsQztBQUNBLFFBQUl6SixNQUFNLENBQUMwSixjQUFYLEVBQTJCO0FBQ3ZCLFVBQUluQixTQUFTLEdBQUUsb0JBQW9CdkksTUFBTSxDQUFDMkosZUFBUCxJQUEwQixFQUE5QyxJQUFxRCxLQUFwRSxDQUR1QixDQUV2Qjs7QUFDQUMsTUFBQUEsT0FBTyxDQUFDbkksR0FBUixDQUFZLFlBQVosRUFBeUI4RyxTQUF6QjtBQUNBckksTUFBQUEsRUFBRSxDQUFDOEMsTUFBSCxDQUFVaUYsSUFBVixDQUFlTSxTQUFmLEVBQTBCLFVBQVM1RSxHQUFULEVBQWN1RixJQUFkLEVBQW9CO0FBQzFDLFlBQUlBLElBQUosRUFBVTtBQUNOVSxVQUFBQSxPQUFPLENBQUNuSSxHQUFSLENBQVksV0FBWixFQURNLENBRU47QUFDSDs7QUFFRCxZQUFJa0MsR0FBSixFQUFTO0FBQ0xpRyxVQUFBQSxPQUFPLENBQUNuSSxHQUFSLENBQVksZ0JBQVo7QUFDQW1JLFVBQUFBLE9BQU8sQ0FBQ25JLEdBQVIsQ0FBWWtDLEdBQVo7QUFDSDtBQUVKLE9BWEQ7QUFZSDtBQUNKO0FBcGlCMkIsQ0FBVCxDQUF2Qjs7QUF1aUJBMUQsYUFBYSxDQUFDNEosV0FBZCxHQUE0QixZQUFZO0FBQ3BDLE1BQUksQ0FBQzVKLGFBQWEsQ0FBQ3NCLFFBQW5CLEVBQTZCO0FBQ3pCdEIsSUFBQUEsYUFBYSxDQUFDc0IsUUFBZCxHQUF5QixJQUFJdEIsYUFBSixFQUF6QjtBQUNIOztBQUNELFNBQU9BLGFBQWEsQ0FBQ3NCLFFBQXJCO0FBQ0gsQ0FMRDs7QUFPQXVJLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjlKLGFBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDliqDovb3otYTmupDmjqfliLblmags5Yiw5pe25YCZ55u05o6l5L+u5pS56L+Z6L655bCx5aW95LqGXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIEZpbGVJbmZvICAgICAgICAgPSByZXF1aXJlKFwiZmlsZWluZm9cIik7XG52YXIgWmlwTG9hZGVyICAgICAgICA9IHJlcXVpcmUoXCJaaXBMb2FkZXJcIik7XG52YXIgUGF0aFRvb2wgICAgICAgICA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBEb3dubG9hZE1hbmFnZXIgID0gcmVxdWlyZShcImRvd25sb2FkbWFuYWdlclwiKTtcbnZhciBTcGluZUxvYWRpbmdJdGVtID0gcmVxdWlyZShcInNwaW5lX2xvYWRpbmdfaXRlbVwiKTtcblxud2luZG93LkxvYWRlck1hbmFnZXIgPSBjYy5DbGFzcyh7XG5cbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIC8vIOW9k+WJjeaLpeaciei1hOa6kOeuoeeQhlxuICAgICAgICByZXNvdXJjZXNfbGlzdDoge1xuICAgICAgICAgICAgZGVmYXVsdDoge31cbiAgICAgICAgfSxcbiAgICAgICAgLy/lvZPliY3lt7LliqDovb3mlbDmja5cbiAgICAgICAgZGF0YV9saXN0OiB7XG4gICAgICAgICAgICBkZWZhdWx0OiB7fVxuICAgICAgICB9LFxuICAgICAgICAvLyDnlYzpnaLotYTmupDnrqHnkIZcbiAgICAgICAgcmVmZXJlbmNlX2tleV9jb3VudGVyOiB7ICAgIC8vIOeVjOmdoui1hOa6kOiuoeaVsFxuICAgICAgICAgICAgZGVmYXVsdDoge31cbiAgICAgICAgfSxcbiAgICAgICAgc2tlbGV0b25fY291bnRlcjogeyAgICAgICAgIC8vIOWKqOeUu+iuoeaVsFxuICAgICAgICAgICAgZGVmYXVsdDoge31cbiAgICAgICAgfSxcbiAgICAgICAgc3BpbmVfY291bnRlcjoge1xuICAgICAgICAgICAgZGVmYXVsdDoge31cbiAgICAgICAgfSxcbiAgICAgICAgcmVsZWFzZV9zcWU6IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIGxvYWRpbmdfc3BpbmVzOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiB7fVxuICAgICAgICB9LFxuICAgICAgICBfc3ByaXRlX2ZyYW1lX2NhY2hlOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiB7fVxuICAgICAgICB9LFxuICAgICAgICBfcHJlZmFiX3RpbWU6IDAsXG4gICAgICAgIGlzX2xvYWRpbmc6IGZhbHNlLFxuICAgIH0sXG5cbiAgICBjdG9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5tYWlubG9vcF90aW1lciA9IGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgxKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxMDAwLCAtMSk7XG4gICAgfSxcblxuICAgIHN0YXRpY3M6IHtcbiAgICAgICAgaW5zdGFuY2U6IG51bGwsXG4gICAgfSxcblxuICAgIHVwZGF0ZTogZnVuY3Rpb24oZHQpIHtcbiAgICAgICAgdGhpcy5fcHJlZmFiX3RpbWUgKz0gMTtcbiAgICAgICAgaWYgKHRoaXMuX3ByZWZhYl90aW1lID49IDYwKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNfbG9hZGluZykge1xuICAgICAgICAgICAgICAgIGNjLmxvZyhcIuW8gOWni+mHiuaUvuayoeeUqOeahOmihOiuvui1hOa6kFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyUmVzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJlZmFiX3RpbWUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZvciAodmFyIHJlc2kgaW4gdGhpcy5yZWxlYXNlX3NxZSkge1xuICAgICAgICAvLyAgICAgdGhpcy5yZWxlYXNlX3NxZVtyZXNpXSAtPSBkdDtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLnJlbGVhc2Vfc3FlW3Jlc2ldIDwgMCkge1xuICAgICAgICAvLyAgICAgICAgIHRoaXMucmVsZXNlU3BpZW5SZXMocmVzaSk7XG4gICAgICAgIC8vICAgICAgICAgZGVsZXRlIHRoaXMucmVsZWFzZV9zcWVbcmVzaV07XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgLy8g5Yqg6L296LWE5rqQLOavlOWmgumihOWItuS9k+exu+eahCzluKbkuIrot6/lvoTlkI7nvIAs5L6L5aaCOumihOiuvuS9k+WwseaYry5wcmVmYWIs5Zu+6ZuG5bCx5pivLnBsaXN0LOWbvueJh+WwseaYry5wbmfmiJbogIUuanBn562JXG4gICAgbG9hZFJlczogZnVuY3Rpb24gKHBhdGgsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChwYXRoID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHZhciBsb2FkSW5mbyA9IHRoaXMuZ2V0UmVzSW5mbyhwYXRoKTtcblxuICAgICAgICBzd2l0Y2ggKGxvYWRJbmZvLmxvYWRfdHlwZSkge1xuICAgICAgICAgICAgY2FzZSBjYy5QcmVmYWI6XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUHJlZmFiKGxvYWRJbmZvLnN0cl9rZXksIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIGNjLlNwcml0ZUF0bGFzOlxuICAgICAgICAgICAgICAgIHRoaXMubG9hZEF0bGFzKGxvYWRJbmZvLnN0cl9rZXksIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIHNwLlNrZWxldG9uRGF0YTpcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRTcGluZShsb2FkSW5mby5zdHJfa2V5LCBjYWxsYmFjayk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFVzdWFsbHlSZXMobG9hZEluZm8uc3RyX2tleSwgY2FsbGJhY2ssIGxvYWRJbmZvLmxvYWRfdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVsZWFzZVJlczogZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB2YXIgbG9hZEluZm8gPSB0aGlzLmdldFJlc0luZm8ocGF0aCk7XG5cbiAgICAgICAgc3dpdGNoIChsb2FkSW5mby5sb2FkX3R5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgY2MuUHJlZmFiOlxuICAgICAgICAgICAgICAgIHRoaXMucmVsZWFzZVByZWZhYihsb2FkSW5mby5zdHJfa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIGNjLlNwcml0ZUF0bGFzOlxuICAgICAgICAgICAgICAgIHRoaXMucmVsZWFzZUF0bGFzKGxvYWRJbmZvLnN0cl9rZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2Ugc3AuU2tlbGV0b25EYXRhOlxuICAgICAgICAgICAgICAgIHRoaXMucmVsZWFzZVNwaW5lKGxvYWRJbmZvLnN0cl9rZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGVhc2VVc3VhbGx5UmVzKGxvYWRJbmZvLnN0cl9rZXksIGxvYWRJbmZvLmxvYWRfdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgbG9hZFVzdWFsbHlSZXM6IGZ1bmN0aW9uKHBhdGgsIGNhbGxiYWNrLCBsb2FkX3R5cGUpIHtcbiAgICAgICAgLy8g5Yqo5oCB5Yqg6L2955WM6Z2i6LWE5rqQXG4gICAgICAgIC8vIGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbihwYXRoLCBjYWxsYmFjaywgbG9hZF90eXBlKSB7XG4gICAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKFwidWlfcmVzXCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNjLmxvYWRlci5sb2FkUmVzKHBhdGgsIGxvYWRfdHlwZSwgZnVuY3Rpb24gKHBhdGgsIGVycm9yTWVzc2FnZSwgcmVzT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3JNZXNzYWdlICYmIHJlc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlcHMgPSBjYy5sb2FkZXIuZ2V0RGVwZW5kc1JlY3Vyc2l2ZWx5KHJlc09iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBkZXBfaSBpbiBkZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudFJlZmVyZW5jZShkZXBzW2RlcF9pXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2MuZXJyb3IoZXJyb3JNZXNzYWdlLCBcImxvYWQgdXN1YWxseVJlcyBmYWlsZC0tLT5cIiArIHBhdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19sb2FkaW5nID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgcGF0aCkpXG5cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX3Nwcml0ZV9mcmFtZV9jYWNoZVtwYXRoXSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMuX3Nwcml0ZV9mcmFtZV9jYWNoZVtwYXRoXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5yZXNvdXJjZXNfbGlzdFtwYXRoXSAmJiB0aGlzLnJlc291cmNlc19saXN0W3BhdGhdW1wib2JqXCJdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXNfbGlzdFtwYXRoXVtcImNvdW50XCJdICsrO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF1bXCJvYmpcIl0pO1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2MubG9hZGVyLmxvYWRSZXMocGF0aCwgbG9hZF90eXBlLCBmdW5jdGlvbiAocGF0aCwgZXJyb3JNZXNzYWdlLCByZXNPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF1bXCJvYmpcIl0gPSByZXNPYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlc19saXN0W3BhdGhdW1wiY291bnRcIl0gPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF1bXCJjb3VudFwiXSsrO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNPYmplY3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNjLmVycm9yKGVycm9yTWVzc2FnZSwgXCJsb2FkIHVzdWFsbHlSZXMgZmFpbGQtLS0+XCIgKyBwYXRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzLCBwYXRoKSlcbiAgICAgICAgLy8gfS5iaW5kKHRoaXMsIHBhdGgsIGNhbGxiYWNrLCBsb2FkX3R5cGUpLCA1MCwgMSlcbiAgICB9LFxuXG4gICAgcmVsZWFzZVVzdWFsbHlSZXM6IGZ1bmN0aW9uKHBhdGgsIHJlc190eXBlKSB7XG4gICAgICAgIGlmICh0aGlzLl9zcHJpdGVfZnJhbWVfY2FjaGVbcGF0aF0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoLmluZGV4T2YoXCJ1aV9yZXNcIikgPiAtMSkge1xuICAgICAgICAgICAgLy8gdmFyIHJlc19vYmogPSBjYy5sb2FkZXIuZ2V0UmVzKHBhdGgsIHJlc190eXBlKTtcblxuICAgICAgICAgICAgLy8gaWYgKHJlc19vYmopIHtcbiAgICAgICAgICAgIC8vICAgICB2YXIgZGVwcyA9IGNjLmxvYWRlci5nZXREZXBlbmRzUmVjdXJzaXZlbHkocmVzX29iaik7XG4gICAgICAgICAgICAvLyAgICAgZm9yICh2YXIgZGVwX2kgaW4gZGVwcykge1xuICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLmNvdW50UmVmZXJlbmNlKGRlcHNbZGVwX2ldLCAtMSk7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZXNvdXJjZXNfbGlzdFtwYXRoXSkge1xuICAgICAgICAgICAgLS0gdGhpcy5yZXNvdXJjZXNfbGlzdFtwYXRoXVtcImNvdW50XCJdO1xuICAgICAgICAgICAgLy8gaWYgKHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF1bXCJjb3VudFwiXSA8PSAwKSB7XG4gICAgICAgICAgICAvLyAgICAgdmFyIHJlbGVheV9yZXMgPSBjYy5sb2FkZXIuZ2V0RGVwZW5kc1JlY3Vyc2l2ZWx5KHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF1bXCJvYmpcIl0pO1xuICAgICAgICAgICAgLy8gICAgIGNjLmxvYWRlci5yZWxlYXNlKHJlbGVheV9yZXMpO1xuICAgICAgICAgICAgLy8gICAgIGRlbGV0ZSB0aGlzLnJlc291cmNlc19saXN0W3BhdGhdO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOi1hOa6kOWbvumbhuWPr+S7peiiq+WKoOi9veW+iOWkmuasoe+8jOS9humHiuaUvuWPqumcgOimgeS4gOasoeWwseWPr+S7pemHiuaUvlxuICAgIGxvYWRBdGxhczogZnVuY3Rpb24ocGF0aCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGF0bGFzT2JqID0gY2MubG9hZGVyLmdldFJlcyhwYXRoLCBjYy5TcHJpdGVBdGxhcyk7XG4gICAgICAgIGlmIChhdGxhc09iaikge1xuICAgICAgICAgICAgdGhpcy5jb3VudFJlZmVyZW5jZShhdGxhc09iaik7XG4gICAgICAgICAgICBjYWxsYmFjayhhdGxhc09iaik7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjYy5sb2FkZXIubG9hZFJlcyhwYXRoLCBjYy5TcHJpdGVBdGxhcywgZnVuY3Rpb24ocGF0aCwgZXJyLCBhdGxzT2JqKSB7XG4gICAgICAgICAgICBpZiAocGF0aCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGhfaSBpbiBjYWNoZUF0bGFzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZUF0bGFzW3BhdGhfaV0gPT0gcGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNwcml0ZUZyYW1hcyA9IGF0bHNPYmouZ2V0U3ByaXRlRnJhbWVzKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGl0ZW1faSBpbiBzcHJpdGVGcmFtYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ByaXRlRnJhbWUgPSBzcHJpdGVGcmFtYXNbaXRlbV9pXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbW5fcGF0aCA9IFwicmVzL2l0ZW0vXCIgKyBzcHJpdGVGcmFtZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nwcml0ZV9mcmFtZV9jYWNoZVtpdGVtbl9wYXRoXSA9IHNwcml0ZUZyYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZXJyICYmIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudFJlZmVyZW5jZShhdGxzT2JqKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhhdGxzT2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2MuZXJyb3IoZXJyLCBcImxvYWQgcHJlYWZhIGZhaWxkLS0tPlwiICsgcGF0aCk7ICAgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfS5iaW5kKHRoaXMsIHBhdGgpKTtcbiAgICB9LFxuXG4gICAgcmVsZWFzZUF0bGFzOiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHZhciBhdGxhc09iaiA9IGNjLmxvYWRlci5nZXRSZXMocGF0aCk7XG4gICAgICAgIGlmIChhdGxhc09iaikge1xuICAgICAgICAgICAgdGhpcy5jb3VudFJlZmVyZW5jZShhdGxhc09iaiwgLTEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWKoOi9vXNwaW5l6LWE5rqQXG4gICAgbG9hZFNwaW5lOiBmdW5jdGlvbihzcGluZVBhdGgsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghc3BpbmVQYXRoKSByZXR1cm47XG4gICAgICAgIGlmICh3aW5kb3cuT1VUX1NQSU5FKSB7XG4gICAgICAgICAgICB2YXIgc3BpbmVfaW5mb3MgPSBzcGluZVBhdGguc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgdmFyIGFjdGlvbiA9IHNwaW5lX2luZm9zLnBvcCgpO1xuICAgICAgICAgICAgdmFyIGFuaW1hX2lkID0gc3BpbmVfaW5mb3MucG9wKCk7XG4gICAgICAgICAgICB2YXIgbG9hZEl0ZW0gPSBuZXcgU3BpbmVMb2FkaW5nSXRlbShhbmltYV9pZCwgYWN0aW9uLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWxlYXNlX3NxZVtzcGluZVBhdGhdKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVsZWFzZV9zcWVbc3BpbmVQYXRoXTtcbiAgICAgICAgICAgICAgICB0aGlzLnNwaW5lX2NvdW50ZXJbc3BpbmVQYXRoXSA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5sb2FkaW5nX3NwaW5lc1tzcGluZVBhdGhdKVxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ19zcGluZXNbc3BpbmVQYXRoXSA9IHRydWU7XG5cbiAgICAgICAgICAgIGNjLmxvYWRlci5sb2FkUmVzKHNwaW5lUGF0aCwgc3AuU2tlbGV0b25EYXRhLCBmdW5jdGlvbiAoc3BpbmVQYXRoLCBlcnJvciwgcmVzT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zcGluZV9jb3VudGVyW3NwaW5lUGF0aF0gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwaW5lX2NvdW50ZXJbc3BpbmVQYXRoXSArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGluZV9jb3VudGVyW3NwaW5lUGF0aF0gPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc09iamVjdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubG9hZGluZ19zcGluZXNbc3BpbmVQYXRoXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdfc3BpbmVzW3NwaW5lUGF0aF1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICBjYy5lcnJvcihlcnJvciwgXCJsb2FkIHNwaW5lIGZhaWxkLS0tPlwiICsgc3BpbmVQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcywgc3BpbmVQYXRoKSlcbiAgICAgICAgfVxuXG5cbiAgICB9LFxuXG4gICAgLy8g6YeK5pS+c3BpbmXotYTmupBcbiAgICByZWxlYXNlU3BpbmU6IGZ1bmN0aW9uKHNwaW5lUGF0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgICAgaWYgKCFzcGluZVBhdGgpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuc3BpbmVfY291bnRlcltzcGluZVBhdGhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNwaW5lX2NvdW50ZXJbc3BpbmVQYXRoXSA+IDApXG4gICAgICAgICAgICAtLSB0aGlzLnNwaW5lX2NvdW50ZXJbc3BpbmVQYXRoXTtcblxuICAgICAgICBpZiAodGhpcy5zcGluZV9jb3VudGVyW3NwaW5lUGF0aF0gPiAwKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVsZXNlU3BpZW5SZXMoc3BpbmVQYXRoKTtcbiAgICB9LFxuXG4gICAgZGVsdGVTcGluZTogZnVuY3Rpb24oc3BpbmVQYXRoKSB7XG4gICAgICAgIHRoaXMucmVsZXNlU3BpZW5SZXMoc3BpbmVQYXRoKVxuICAgIH0sXG5cbiAgICByZWxlc2VTcGllblJlczogZnVuY3Rpb24oc3BpbmVQYXRoKSB7XG4gICAgICAgIGlmICghdGhpcy5sb2FkaW5nX3NwaW5lc1tzcGluZVBhdGhdKSB7XG4gICAgICAgICAgICB2YXIgc2tlbGV0b25fZGF0YSA9IGNjLmxvYWRlci5nZXRSZXMoc3BpbmVQYXRoLCBzcC5Ta2VsZXRvbkRhdGEpO1xuICAgICAgICAgICAgdmFyIGF0bGFzX2RhdGEgPSBjYy5sb2FkZXIuZ2V0UmVzKHNwaW5lUGF0aCwgY2MuU3ByaXRlQXRsYXMpO1xuXG4gICAgICAgICAgICBpZiAoc2tlbGV0b25fZGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBkZXBzID0gY2MubG9hZGVyLmdldERlcGVuZHNSZWN1cnNpdmVseShza2VsZXRvbl9kYXRhKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBkZXBzX2kgaW4gZGVwcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVwc0RhdGEgID0gY2MubG9hZGVyLmdldFJlcyhkZXBzW2RlcHNfaV0pO1xuICAgICAgICAgICAgICAgICAgICBjYy5sb2FkZXIucmVsZWFzZShkZXBzRGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNjLmxvYWRlci5yZWxlYXNlKHNrZWxldG9uX2RhdGEpOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDln7rkuo7lj4LogINrZXnnmoTlvJXnlKjorqHmlbBcbiAgICAgKiBAYXV0aG9yIHpoYW5naHV4aW5nIDIwMTgtMTItMjBcbiAgICAgKiBAcGFyYW0gIGFzc2V0IOi1hOa6kOWvueixoVxuICAgICAqIEBwYXJhbSAgY291bnQg5pWw6YePXG4gICAgICogQHJldHVybiB7W3R5cGVdfVxuICAgICAqL1xuICAgIGNvdW50UmVmZXJlbmNlOiBmdW5jdGlvbihhc3NldE9yS2V5LCBjb3VudCkge1xuICAgICAgICBpZiAoIWFzc2V0T3JLZXkpIHJldHVybjtcbiAgICAgICAgY291bnQgPSBjb3VudCA9PT0gdW5kZWZpbmVkID8gMSA6IGNvdW50O1xuICAgICAgICB2YXIgcmVmZXJlbmNlS2V5O1xuICAgICAgICAvLyBpZiAoYXNzZXRPcktleSBpbnN0YW5jZW9mIGNjLkFzc2V0KSB7XG4gICAgICAgIC8vICAgICByZWZlcmVuY2VLZXkgPSBjYy5sb2FkZXIuX2dldFJlZmVyZW5jZUtleShhc3NldE9yS2V5KTtcbiAgICAgICAgLy8gICAgIGlmIChhc3NldE9yS2V5IGluc3RhbmNlb2YgY2MuU3ByaXRlQXRsYXMpIHtcbiAgICAgICAgLy8gICAgICAgICB2YXIgZGVwZW5kZXMgPSBjYy5sb2FkZXIuZ2V0RGVwZW5kc1JlY3Vyc2l2ZWx5KGFzc2V0T3JLZXkpO1xuICAgICAgICAvLyAgICAgICAgIGZvciAodmFyIGtleUluZGV4IGluIGRlcGVuZGVzKSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuY291bnRSZWZlcmVuY2UoZGVwZW5kZXNba2V5SW5kZXhdLCBjb3VudCk7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgcmVmZXJlbmNlS2V5ID0gYXNzZXRPcktleTtcbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlX2tleV9jb3VudGVyW3JlZmVyZW5jZUtleV0pXG4gICAgICAgICAgICB0aGlzLnJlZmVyZW5jZV9rZXlfY291bnRlcltyZWZlcmVuY2VLZXldID0gMDtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2Vfa2V5X2NvdW50ZXJbcmVmZXJlbmNlS2V5XSArPSBjb3VudDtcblxuICAgICAgICAvLyBpZiAodGhpcy5yZWZlcmVuY2Vfa2V5X2NvdW50ZXJbcmVmZXJlbmNlS2V5XSA8PSAwKSB7XG4gICAgICAgIC8vICAgICAvLyDph4rmlL5wbmfotYTmupBcbiAgICAgICAgLy8gICAgIGNjLmxvYWRlci5yZWxlYXNlKHJlZmVyZW5jZUtleSk7XG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgY2xlYXJSZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciByZXNfa2V5IGluIHRoaXMucmVmZXJlbmNlX2tleV9jb3VudGVyKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlX2tleV9jb3VudGVyW3Jlc19rZXldKVxuICAgICAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlX2tleV9jb3VudGVyW3Jlc19rZXldID0gMDtcblxuICAgICAgICAgICAgaWYgKHRoaXMucmVmZXJlbmNlX2tleV9jb3VudGVyW3Jlc19rZXldIDw9IDApIHtcbiAgICAgICAgICAgICAgICAvLyDph4rmlL5wbmfotYTmupBcbiAgICAgICAgICAgICAgICBjYy5sb2FkZXIucmVsZWFzZShyZXNfa2V5KTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5yZWZlcmVuY2Vfa2V5X2NvdW50ZXJbcmVzX2tleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHJlc19pIGluIHRoaXMucmVzb3VyY2VzX2xpc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc291cmNlc19saXN0W3Jlc19pXVtcImNvdW50XCJdIDw9IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVsZWF5X3JlcyA9IGNjLmxvYWRlci5nZXREZXBlbmRzUmVjdXJzaXZlbHkodGhpcy5yZXNvdXJjZXNfbGlzdFtyZXNfaV1bXCJvYmpcIl0pO1xuICAgICAgICAgICAgICAgIGNjLmxvYWRlci5yZWxlYXNlKHJlbGVheV9yZXMpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJlc291cmNlc19saXN0W3Jlc19pXTtcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZWxlYXNlQnlSZWZlcmVuY2VLZXk6IGZ1bmN0aW9uKHJlZmVyZW5jZUtleSkge1xuXG4gICAgfSxcblxuICAgIC8vIOWKoOi9vemihOWItui1hOa6kFxuICAgIGxvYWRQcmVmYWI6IGZ1bmN0aW9uKHBhdGgsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghd2luZG93LlBSRUZBQl9CVUlMRCkge1xuICAgICAgICAgICAgQ0NfU1VQUE9SVF9KSVQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNfbG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICBjYy5sb2FkZXIubG9hZFJlcyhwYXRoLCBjYy5QcmVmYWIsIGZ1bmN0aW9uKGVyciwgcHJlZmFiKSB7XG4gICAgICAgICAgICAgICAgQ0NfU1VQUE9SVF9KSVQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2sgJiYgIWdhbWUucHJlbG9hZF9sb2FkaW5nKSB8fCBwYXRoID09IFwicHJlZmFiL2RyYW1hL2d1aWRlX21haW5fdmlld1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVwcyA9IGNjLmxvYWRlci5nZXREZXBlbmRzUmVjdXJzaXZlbHkocHJlZmFiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHJlc0luZGV4IGluIGRlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YXIgdGVzdEFzc2V0ID0gY2MubG9hZGVyLmdldFJlcyhkZXBzW3Jlc0luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudFJlZmVyZW5jZShkZXBzW3Jlc0luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhjYy5pbnN0YW50aWF0ZShwcmVmYWIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIGNjLmVycm9yKGVyciwgXCJsb2FkIHByZWFmYSBmYWlsZC0tLT5cIiArIHBhdGgpOyAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmlzX2xvYWRpbmcgPSBmYWxzZTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZWFmYWJfaW5mbyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgdmFyIHByZWZhYl9uYW1lID0gcHJlYWZhYl9pbmZvLnBvcCgpICsgXCJfcFwiO1xuICAgICAgICAgICAgdmFyIHRvdGFsX25hbWUgPSBwcmVhZmFiX2luZm8ucG9wKCkgKyBcIl9cIiArIHByZWZhYl9uYW1lO1xuICAgICAgICAgICAgY2MubG9hZGVyLmxvYWRSZXMoXCJwcmVmYWJqcy9cIiArIHRvdGFsX25hbWUsIGNjLkpzb25Bc3NldCwgZnVuY3Rpb24odG90YWxfbmFtZSwgZXJyLCB0ZXh0X2RhdGEpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGVzdEpTID0gcmVxdWlyZSh0b3RhbF9uYW1lKVxuICAgICAgICAgICAgICAgIHZhciB0ZXN0T2JqID0gbmV3IHRlc3RKUyh0ZXh0X2RhdGEuanNvbik7XG4gICAgICAgICAgICAgICAgLy8gdGVzdE9iai5ub2RlLnggPSB0aGlzLnJvb3ROZC53aWR0aCAqIDAuNTtcbiAgICAgICAgICAgICAgICAvLyB0ZXN0T2JqLm5vZGUueSA9IHRoaXMucm9vdE5kLmhlaWdodCAqIDAuNTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh0ZXN0T2JqLm5vZGUpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMsIHRvdGFsX25hbWUpKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOmHiuaUvumihOWItui1hOa6kFxuICAgIHJlbGVhc2VQcmVmYWI6IGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgdmFyIHRlc3RBc3NldCA9IGNjLmxvYWRlci5nZXRSZXMocGF0aCk7XG4gICAgICAgIHZhciBkZXBzID0gY2MubG9hZGVyLmdldERlcGVuZHNSZWN1cnNpdmVseSh0ZXN0QXNzZXQpO1xuXG4gICAgICAgIGZvciAodmFyIHJlc0luZGV4IGluIGRlcHMpIHtcbiAgICAgICAgICAgIHZhciB0ZXN0QXNzZXQgPSBjYy5sb2FkZXIuZ2V0UmVzKGRlcHNbcmVzSW5kZXhdKTtcbiAgICAgICAgICAgIHRoaXMuY291bnRSZWZlcmVuY2UoZGVwc1tyZXNJbmRleF0sIC0xKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDph4rmlL7otYTmupBcbiAgICBkZWxldGVSZXM6IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIHRoaXMucmVsZWFzZVJlcyhwYXRoKTtcbiAgICAgICAgLy8gaWYgKHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF0pIHtcbiAgICAgICAgLy8gICAgIHZhciBmaWxlSW5mbyA9IHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF07XG4gICAgICAgIC8vICAgICBmaWxlSW5mby5kZWNyZW1lbnRMb2FkTnVtKCk7XG4gICAgICAgIC8vICAgICB2YXIgbG9hZE51bSA9IGZpbGVJbmZvLmdldExvYWROdW0oKTtcbiAgICAgICAgLy8gICAgIGlmIChsb2FkTnVtIDw9IDApe1xuICAgICAgICAvLyAgICAgICAgIGNjLmxvYWRlci5yZWxlYXNlUmVzKGZpbGVJbmZvLnVybCk7XG4gICAgICAgIC8vICAgICAgICAgZmlsZUluZm8uZGVsZXRlTWUoKTtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnJlc291cmNlc19saXN0W3BhdGhdID0gbnVsbDtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgIH0sXG5cbiAgICBnZXRSZXNJbmZvOiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIC8vIOi1hOa6kOexu+Wei+eahOi1t+Wni+S9jee9ruS4i+ihqFxuICAgICAgICB2YXIgdHlwZV9pbmRleCA9IHBhdGguaW5kZXhPZihcIi5cIilcbiAgICAgICAgLy8g5a2X56ym5Liy5oC76ZW/5bqmXG4gICAgICAgIHZhciB0b3RhbF9udW0gPSBwYXRoLmxlbmd0aDtcbiAgICAgICAgLy8g5YmU6Zmk5a2X56ym5Liy57G75Z6L55qE6Lev5b6EXG4gICAgICAgIHZhciBzdHJfa2V5ID0gcGF0aC5zdWJzdHJpbmcoMCwgdHlwZV9pbmRleCk7XG4gICAgICAgIC8vIOi1hOa6kOe6ueeQhuagvOW8j1xuICAgICAgICB2YXIgYXNzZXRzX3R5cGUgPSBwYXRoLnN1YnN0cmluZyh0eXBlX2luZGV4LCB0b3RhbF9udW0pO1xuICAgICAgICAvLyDpnIDopoHliqDovb3nmoTotYTmupDmoLzlvI9cbiAgICAgICAgdmFyIGxvYWRfdHlwZSA9IHRoaXMuZ2V0QXNzZXRzVHlwZVN1ZmZpeChhc3NldHNfdHlwZSk7XG4gICAgICAgIC8vIOWQjue7rei/memHjOimgeWKoOS4iueJiOacrOS/oeaBr+S7peWPinVybOi3r+W+hOWkhOeQhlxuICAgICAgICBcbiAgICAgICAgdmFyIHJlc3VsZXQgPSB7fVxuICAgICAgICByZXN1bGV0LnN0cl9rZXkgPSBzdHJfa2V5O1xuICAgICAgICByZXN1bGV0LmxvYWRfdHlwZSA9IGxvYWRfdHlwZTtcblxuICAgICAgICByZXR1cm4gcmVzdWxldFxuICAgIH0sXG5cbiAgICBnZXRBc3NldHNUeXBlU3VmZml4OiBmdW5jdGlvbiAoc3VmZml4KXtcbiAgICAgICAgc3dpdGNoIChzdWZmaXgpIHtcbiAgICAgICAgICAgIGNhc2UgXCIuanBnXCI6XG4gICAgICAgICAgICBjYXNlIFwiLnBuZ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBjYy5TcHJpdGVGcmFtZTtcbiAgICAgICAgICAgIGNhc2UgXCIucGxpc3RcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gY2MuU3ByaXRlQXRsYXM7XG4gICAgICAgICAgICBjYXNlIFwiLm1wM1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBjYy5BdWRpb0NsaXA7XG4gICAgICAgICAgICBjYXNlIFwiLmF0bGFzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwLlNrZWxldG9uRGF0YTtcbiAgICAgICAgICAgIGNhc2UgXCIucHJlZmFiXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNjLlByZWZhYjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnczogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgLy8gdmFyIGNvbmZpZ196aXBfdXJsID0gREFUQV9VUkwgKyBcImRhdGEuemlwXCIgKyBcIj9cIiArIERBVEFfVkVSO1xuICAgICAgICAvLyDlvq7kv6HlsI/muLjmiI/kuI3kvb/nlKjkuozov5vliLbmlofku7ZcbiAgICAgICAgaWYgKHdpbmRvdy5ERUJVR19EYXRhKSB7XG4gICAgICAgICAgICB2YXIgTW9kdWxlSW5mbyA9IHJlcXVpcmUoXCJtb2R1bGVsaXN0XCIpO1xuICAgICAgICAgICAgdmFyIHRpbWUgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgZGF0YV91cmwgPSBcImh0dHBzOi8vZGV2LWg1LXNzemcuc2hpeXVlZ2FtZS5jb20vZGF0YS9cIjtcbiAgICAgICAgICAgIHZhciB0b3RhbF9udW0gPSAwO1xuICAgICAgICAgICAgZm9yICh2YXIgY2ZnX2kgPSAwOyBjZmdfaSA8ICBNb2R1bGVJbmZvLmRhdGFfbGlzdC5sZW5ndGg7IGNmZ19pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdG90b2FsX3VybCA9IGRhdGFfdXJsICsgTW9kdWxlSW5mby5kYXRhX2xpc3RbY2ZnX2ldICsgXCIuanNvblwiICsgXCI/dGltZT1cIiArIHRpbWU7XG4gICAgICAgICAgICAgICAgY2MubG9hZGVyLmxvYWQodG90b2FsX3VybCwgZnVuY3Rpb24obmFtZSwgZXJyLCBqc29uX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxfbnVtICsrXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWdbbmFtZV0gPSBqc29uX2RhdGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsX251bSA9PSBNb2R1bGVJbmZvLmRhdGFfbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0b3RhbF9udW0vTW9kdWxlSW5mby5kYXRhX2xpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCBNb2R1bGVJbmZvLmRhdGFfbGlzdFtjZmdfaV0pKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKFBMQVRGT1JNX1RZUFIgPT0gXCJXWF9TREtcIiB8fCBQTEFURk9STV9UWVBSID09IFwiU0hfU0RLXCIgfHwgUExBVEZPUk1fVFlQUiA9PSBcIlFRX1NES1wiKSB7XG4gICAgICAgICAgICAgICAgdmFyIE1vZHVsZUluZm8gPSByZXF1aXJlKFwibW9kdWxlbGlzdFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgdG90YWxOdW0gPSBNb2R1bGVJbmZvLmRhdGFfbGlzdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIGZpbmlzaE51bSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgY2ZnX2kgPSAwOyBjZmdfaSA8ICBNb2R1bGVJbmZvLmRhdGFfbGlzdC5sZW5ndGg7IGNmZ19pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFfcGF0aCA9IFwiZGF0YS9cIiArIE1vZHVsZUluZm8uZGF0YV9saXN0W2NmZ19pXTtcbiAgICAgICAgICAgICAgICAgICAgZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uKGRhdGFfcGF0aCwgY2ZnX2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNjLmxvYWRlci5sb2FkUmVzKGRhdGFfcGF0aCwgY2MuSnNvbkFzc2V0LCBmdW5jdGlvbihuYW1lLCBlcnIsIGpzb25EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnW25hbWVdID0ganNvbkRhdGEuanNvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hOdW0gKys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy5sb2coQ29uZmlnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hOdW0gPT0gdG90YWxOdW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhmaW5pc2hOdW0vdG90YWxOdW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCBNb2R1bGVJbmZvLmRhdGFfbGlzdFtjZmdfaV0pKVxuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgZGF0YV9wYXRoLCBjZmdfaSksIDIwICogY2ZnX2ksIDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBaaXBMb2FkZXIuUmVnaXN0ZXJaaXBMb2FkZXIoKTtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YV9wYXRoID1jYy51cmwucmF3KFwicmVzb3VyY2VzL2RhdGEvZGF0YS56aXBcIilcbiAgICAgICAgICAgICAgICBjYy5sb2FkZXIubG9hZChkYXRhX3BhdGgsIGZ1bmN0aW9uKGVyciwgemlwRGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBKU1ppcCA9IHJlcXVpcmUoXCJqc3ppcFwiKTtcbiAgICAgICAgICAgICAgICAgIHppcERhdGEgPSBuZXcgSlNaaXAoemlwRGF0YSwge2NoZWNrQ1JDMzI6ZmFsc2V9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHppcERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b3RhbF9udW0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cl9udW0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZGF0YV9pIGluIHppcERhdGEuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9udW0gKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uKGRhdGFfaSwgY3VyX251bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICBKU09OLnBhcnNlKHppcERhdGEuZmlsZXNbZGF0YV9pXS5hc1RleHQoKSk7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVfbmFtZSA9IGRhdGFfaS5zdWJzdHJpbmcoMCwgZGF0YV9pLmxlbmd0aCAtIDUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ1tmaWxlX25hbWVdID0gZGF0YTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBjdXJfbnVtIC8gNjY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHByb2dyZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cl9udW0gPj0gdG90YWxfbnVtICYmIGN1cl9udW0gPjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIGRhdGFfaSwgdG90YWxfbnVtKSwgMjAgKiB0b3RhbF9udW0sIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnU2NyaXB0OiBmdW5jdGlvbihmaW5pc2hfY2IpIHtcbiAgICAgICAgLy8g5Y+R5biD54mI5pys77yM6ZyA6KaB5Yqg6L295ZCI5bm25ZCOanNvbuWQjueahEpT5paH5Lu2XG4gICAgICAgIGlmICh3aW5kb3cuVVNFX01FUkdFX0pTT04pIHtcbiAgICAgICAgICAgIHZhciBkYXRhX3BhdGggPVwic3JjL21lcmdlX2pzb25cIiArICh3aW5kb3cuUEFDS0FHRV9WRVJTSU9OIHx8IFwiXCIpICsgIFwiLmpzXCI7XG4gICAgICAgICAgICAvLyB2YXIgZGF0YV9wYXRoID0gXCJzcmMvbWVyZ2VfanNvblwiICsgXCIuanNcIjsgICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiX19fanNvbj09PlwiLGRhdGFfcGF0aClcbiAgICAgICAgICAgIGNjLmxvYWRlci5sb2FkKGRhdGFfcGF0aCwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLliqDovb1tZXJnZeaIkOWKn1wiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cod2luZG93LkltcG9ydENvbmZpZ3MpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWKoOi9vW1lcmdlX2pzb27lpLHotKVcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG59KTtcblxuTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUxvYWRlck1hbmFnZXIuaW5zdGFuY2UpIHtcbiAgICAgICAgTG9hZGVyTWFuYWdlci5pbnN0YW5jZSA9IG5ldyBMb2FkZXJNYW5hZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBMb2FkZXJNYW5hZ2VyLmluc3RhbmNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExvYWRlck1hbmFnZXI7Il19