|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/hallows/view/hallows_trace_window.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, 'f6b31ozLvBNMIhH+5tRauox', 'hallows_trace_window');
|
// Scripts/mod/hallows/view/hallows_trace_window.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 圣印窗体
|
// <br/>Create: 2019-02-20 14:15:58
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var BackpackController = require("backpack_controller");
|
|
var Hallows_traceWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("hallows", "hallows_trace_window");
|
this.viewTag = SCENE_TAG.dialogue; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
|
|
this.win_type = WinType.Big; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
|
|
this.ctrl = arguments[0];
|
this.model = this.ctrl.getModel();
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initConfig: function initConfig() {
|
this.attr_list = {};
|
this.this_use_num = 0;
|
this.cost_config = Config.hallows_data.data_const.id_stone;
|
this.attr_config = Config.hallows_data.data_const.stone_attribute;
|
},
|
// 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
|
openCallBack: function openCallBack() {
|
this.background = this.root_wnd.getChildByName("background");
|
this.background.scale = FIT_SCALE;
|
var main_panel = this.root_wnd.getChildByName("main_panel");
|
this.background_img = main_panel.getChildByName("background").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getCommonIcomPath("common_1036"), function (resObject) {
|
this.background_img.spriteFrame = resObject;
|
}.bind(this));
|
this.Image_1 = main_panel.getChildByName("Image_1").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getCommonIcomPath("common_1037"), function (resObject) {
|
this.Image_1.spriteFrame = resObject;
|
}.bind(this));
|
this.Image_2 = main_panel.getChildByName("Image_2").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getCommonIcomPath("common_1024"), function (resObject) {
|
this.Image_2.spriteFrame = resObject;
|
}.bind(this));
|
this.Image_5 = main_panel.getChildByName("Image_5").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getCommonIcomPath("common_90024"), function (resObject) {
|
this.Image_5.spriteFrame = resObject;
|
}.bind(this));
|
this.Sprite_5 = main_panel.getChildByName("Sprite_5").getComponent(cc.Sprite);
|
this.Sprite_6 = main_panel.getChildByName("Sprite_6").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getCommonIcomPath("common_1033"), function (resObject) {
|
this.Sprite_5.spriteFrame = resObject;
|
this.Sprite_6.spriteFrame = resObject;
|
}.bind(this));
|
this.Sprite_23 = main_panel.getChildByName("Sprite_23").getComponent(cc.Sprite);
|
this.Sprite_23_0 = main_panel.getChildByName("Sprite_23_0").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getCommonIcomPath("common_1016"), function (resObject) {
|
this.Sprite_23.spriteFrame = resObject;
|
this.Sprite_23_0.spriteFrame = resObject;
|
}.bind(this));
|
var win_title = main_panel.getChildByName("win_title").getComponent(cc.Label);
|
win_title.string = Utils.TI18N("圣印");
|
var attr_title = main_panel.getChildByName("attr_title").getComponent(cc.Label);
|
attr_title.string = Utils.TI18N("当前属性");
|
var desc = main_panel.getChildByName("desc").getComponent(cc.Label);
|
desc.string = Utils.TI18N("来源:充值活动");
|
this.cost_item = ItemsPool.getInstance().getItem("backpack_item");
|
this.cost_item.setParent(main_panel);
|
this.cost_item.setPosition(336 - main_panel.width / 2, 290 - main_panel.height / 2);
|
this.cost_item.initConfig(false, 1, false, true);
|
this.cost_item.show();
|
this.can_use_label = main_panel.getChildByName("can_use_label").getComponent(cc.RichText);
|
this.max_btn = main_panel.getChildByName("max_btn");
|
this.plus_btn = main_panel.getChildByName("plus_btn");
|
this.min_btn = main_panel.getChildByName("min_btn");
|
this.slider = main_panel.getChildByName("slider").getComponent(cc.Slider); // 滑块
|
|
this.progress = main_panel.getChildByName("ProgressBar").getComponent(cc.ProgressBar);
|
this.upgrade_btn = main_panel.getChildByName("upgrade_btn");
|
this.upgrade_btn_label = this.upgrade_btn.getChildByName("label").getComponent(cc.Label);
|
this.upgrade_btn_label.string = Utils.TI18N("使用");
|
|
for (var i = 1; i < 3; i++) {
|
var attr = main_panel.getChildByName("attr_" + i);
|
|
if (attr) {
|
var object = {};
|
object.item = attr;
|
object.icon = attr.getChildByName("icon").getComponent(cc.Sprite);
|
object.label = attr.getChildByName("label").getComponent(cc.Label);
|
this.attr_list[i] = object;
|
}
|
}
|
|
this.close_btn = main_panel.getChildByName("close_btn");
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
this.background.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Close);
|
this.ctrl.openHallowsTraceWindow(false);
|
}, this);
|
this.close_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Close);
|
this.ctrl.openHallowsTraceWindow(false);
|
}, this);
|
this.upgrade_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Close);
|
|
if (this.data) {
|
if (this.this_use_num == 0) {
|
this.ctrl.openHallowsTraceWindow(false);
|
} else {
|
if (this.num == 0) {
|
message(Utils.TI18N("使用数量不能为0"));
|
} else {
|
this.ctrl.requestUseTraceItem(this.data.id, this.num);
|
}
|
}
|
}
|
}, this);
|
this.slider.node.on("slide", function () {
|
this.setComposeNumByPercent(this.slider.progress);
|
this.progress.progress = this.slider.progress;
|
}, this);
|
this.min_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
var percent = this.slider.progress;
|
if (percent == 0) return;
|
if (this.num == 0) return;
|
if (this.this_use_num == 0) return;
|
this.num = this.num - 1;
|
this.setComposeNum(this.num);
|
}, this);
|
this.plus_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
var percent = this.slider.progress;
|
if (percent == 1) return;
|
if (this.this_use_num == 0) return;
|
if (this.num >= this.this_use_num) return;
|
this.num = this.num + 1;
|
this.setComposeNum(this.num);
|
}, this);
|
this.max_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
var percent = this.slider.progress;
|
if (percent == 1) return;
|
if (this.this_use_num == 0) return;
|
if (this.num >= this.this_use_num) return;
|
this.num = this.this_use_num;
|
this.setComposeNum(this.num);
|
}, this);
|
},
|
setComposeNum: function setComposeNum(num) {
|
this.num = num;
|
var percent = this.num / this.this_use_num || 0;
|
this.slider.progress = percent;
|
this.progress.progress = this.slider.progress;
|
this.fileNum(num);
|
},
|
setComposeNumByPercent: function setComposeNumByPercent(percent) {
|
this.num = Math.floor(percent * this.this_use_num);
|
this.fileNum(this.num);
|
},
|
fileNum: function fileNum(num) {
|
if (this.had_max_num == null) return;
|
this.cost_item.setNeedNum(num, this.had_max_num);
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
|
openRootWnd: function openRootWnd(data) {
|
this.data = data;
|
|
if (data && data.vo && this.cost_config) {
|
this.had_use_num = data.vo.seal; // 当前使用的数量
|
|
this.use_max_num = this.getUseMaxNum(); // 当前最高可使用数量
|
//数据异常
|
|
if (this.use_max_num == 0) return;
|
var max_step = Config.hallows_data.data_max_lev[this.data.id];
|
if (max_step == null) return;
|
var step = this.data.vo.step; //没吃满,都显示可以使用的
|
|
if (this.had_use_num < this.use_max_num) {
|
this.can_use_label.string = cc.js.formatStr(Utils.TI18N("当前已使用:%s/%s"), this.had_use_num, this.use_max_num);
|
} else {
|
if (step >= max_step) {
|
//已经满级的
|
this.can_use_label.string = cc.js.formatStr(Utils.TI18N("已达最大使用数量:%s/%s"), this.had_use_num, this.use_max_num);
|
} else {
|
//找出下一阶的
|
var next_config = gdata("hallows_data", "data_trace_cost", Utils.getNorKey(this.data.id, step + 1));
|
|
if (next_config) {
|
this.can_use_label.string = cc.js.formatStr(Utils.TI18N("圣器%s阶可增加使用数量:%s"), step + 1, next_config.num - this.had_use_num);
|
}
|
}
|
}
|
|
this.can_use_num = this.use_max_num - this.had_use_num; // 当前剩余可使用数量
|
|
if (this.can_use_num < 0) {
|
this.can_use_num = 0;
|
} //当前背包中数量
|
|
|
this.had_max_num = BackpackController.getInstance().getModel().getItemNumByBid(this.cost_config.val); // 背包中总数量
|
|
var itemVo = {
|
bid: this.cost_config.val,
|
num: this.had_max_num
|
};
|
this.cost_item.setData(itemVo);
|
this.this_use_num = Math.min(this.can_use_num, this.had_max_num); //这次最多可使用的数量
|
|
this.num = this.this_use_num; // 当前数量
|
|
this.setComposeNum(this.num);
|
this.setBaseAttrList();
|
}
|
},
|
//设置当前圣印总属性
|
setBaseAttrList: function setBaseAttrList() {
|
if (this.cost_config == null || this.attr_config == null) return;
|
|
if (this.had_use_num == null) {
|
this.had_use_num = 0;
|
}
|
|
for (var i in this.attr_list) {
|
this.attr_list[i].item.active = false;
|
}
|
|
for (var j in this.attr_config.val) {
|
var v = this.attr_config.val[j];
|
var attr_key = v[0];
|
var attr_val = v[1] * this.had_use_num;
|
var attr_name = Config.attr_data.data_key_to_name[attr_key];
|
|
if (attr_name) {
|
var attr_icon = PathTool.getAttrIconByStr(attr_key);
|
var attr_str = cc.js.formatStr(Utils.TI18N(" %s +%s"), attr_name, attr_val);
|
var object = this.attr_list[parseInt(j) + 1];
|
|
if (object) {
|
object.item.active = true;
|
var res = PathTool.getCommonIcomPath(attr_icon);
|
this.loadRes(res, function (icon, sf_obj) {
|
icon.spriteFrame = sf_obj;
|
}.bind(this, object.icon));
|
object.label.string = attr_str;
|
}
|
}
|
}
|
},
|
//返回当前阶数最大可使用的数量的配置表
|
getUseMaxNum: function getUseMaxNum() {
|
if (this.data == null || this.data.vo == null) return;
|
var trace_cost_config = gdata("hallows_data", "data_trace_cost", Utils.getNorKey(this.data.id, this.data.vo.step));
|
|
if (trace_cost_config) {
|
return trace_cost_config.num;
|
}
|
|
return 0;
|
},
|
// 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
|
closeCallBack: function closeCallBack() {
|
if (this.cost_item) {
|
this.cost_item.onDelete();
|
}
|
|
this.cost_item = null;
|
this.ctrl.openHallowsTraceWindow(false);
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoYWxsb3dzXFx2aWV3XFxoYWxsb3dzX3RyYWNlX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJIYWxsb3dzX3RyYWNlV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsImRpYWxvZ3VlIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiQmlnIiwiY3RybCIsImFyZ3VtZW50cyIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJpbml0Q29uZmlnIiwiYXR0cl9saXN0IiwidGhpc191c2VfbnVtIiwiY29zdF9jb25maWciLCJDb25maWciLCJoYWxsb3dzX2RhdGEiLCJkYXRhX2NvbnN0IiwiaWRfc3RvbmUiLCJhdHRyX2NvbmZpZyIsInN0b25lX2F0dHJpYnV0ZSIsIm9wZW5DYWxsQmFjayIsImJhY2tncm91bmQiLCJyb290X3duZCIsImdldENoaWxkQnlOYW1lIiwic2NhbGUiLCJGSVRfU0NBTEUiLCJtYWluX3BhbmVsIiwiYmFja2dyb3VuZF9pbWciLCJnZXRDb21wb25lbnQiLCJTcHJpdGUiLCJsb2FkUmVzIiwiZ2V0Q29tbW9uSWNvbVBhdGgiLCJyZXNPYmplY3QiLCJzcHJpdGVGcmFtZSIsImJpbmQiLCJJbWFnZV8xIiwiSW1hZ2VfMiIsIkltYWdlXzUiLCJTcHJpdGVfNSIsIlNwcml0ZV82IiwiU3ByaXRlXzIzIiwiU3ByaXRlXzIzXzAiLCJ3aW5fdGl0bGUiLCJMYWJlbCIsInN0cmluZyIsIlV0aWxzIiwiVEkxOE4iLCJhdHRyX3RpdGxlIiwiZGVzYyIsImNvc3RfaXRlbSIsIkl0ZW1zUG9vbCIsImdldEluc3RhbmNlIiwiZ2V0SXRlbSIsInNldFBhcmVudCIsInNldFBvc2l0aW9uIiwid2lkdGgiLCJoZWlnaHQiLCJzaG93IiwiY2FuX3VzZV9sYWJlbCIsIlJpY2hUZXh0IiwibWF4X2J0biIsInBsdXNfYnRuIiwibWluX2J0biIsInNsaWRlciIsIlNsaWRlciIsInByb2dyZXNzIiwiUHJvZ3Jlc3NCYXIiLCJ1cGdyYWRlX2J0biIsInVwZ3JhZGVfYnRuX2xhYmVsIiwiaSIsImF0dHIiLCJvYmplY3QiLCJpdGVtIiwiaWNvbiIsImxhYmVsIiwiY2xvc2VfYnRuIiwicmVnaXN0ZXJFdmVudCIsIm9uIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsInBsYXlCdXR0b25Tb3VuZCIsIkJ1dHRvblNvdW5kIiwiQ2xvc2UiLCJvcGVuSGFsbG93c1RyYWNlV2luZG93IiwiZGF0YSIsIm51bSIsIm1lc3NhZ2UiLCJyZXF1ZXN0VXNlVHJhY2VJdGVtIiwiaWQiLCJub2RlIiwic2V0Q29tcG9zZU51bUJ5UGVyY2VudCIsIk5vcm1hbCIsInBlcmNlbnQiLCJzZXRDb21wb3NlTnVtIiwiZmlsZU51bSIsIk1hdGgiLCJmbG9vciIsImhhZF9tYXhfbnVtIiwic2V0TmVlZE51bSIsIm9wZW5Sb290V25kIiwidm8iLCJoYWRfdXNlX251bSIsInNlYWwiLCJ1c2VfbWF4X251bSIsImdldFVzZU1heE51bSIsIm1heF9zdGVwIiwiZGF0YV9tYXhfbGV2Iiwic3RlcCIsImpzIiwiZm9ybWF0U3RyIiwibmV4dF9jb25maWciLCJnZGF0YSIsImdldE5vcktleSIsImNhbl91c2VfbnVtIiwiZ2V0SXRlbU51bUJ5QmlkIiwidmFsIiwiaXRlbVZvIiwiYmlkIiwic2V0RGF0YSIsIm1pbiIsInNldEJhc2VBdHRyTGlzdCIsImFjdGl2ZSIsImoiLCJ2IiwiYXR0cl9rZXkiLCJhdHRyX3ZhbCIsImF0dHJfbmFtZSIsImF0dHJfZGF0YSIsImRhdGFfa2V5X3RvX25hbWUiLCJhdHRyX2ljb24iLCJnZXRBdHRySWNvbkJ5U3RyIiwiYXR0cl9zdHIiLCJwYXJzZUludCIsInJlcyIsInNmX29iaiIsInRyYWNlX2Nvc3RfY29uZmlnIiwiY2xvc2VDYWxsQmFjayIsIm9uRGVsZXRlIl0s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QUFVN0QsSUFBVixFQUFlOEQsTUFBZixFQUF1QjtBQUNyQzlELFlBQUFBLElBQUksQ0FBQ3hDLFdBQUwsR0FBbUJzRyxNQUFuQjtBQUNILFdBRmlCLENBRWhCckcsSUFGZ0IsQ0FFWCxJQUZXLEVBRU5xQyxNQUFNLENBQUNFLElBRkQsQ0FBbEI7QUFHQUYsVUFBQUEsTUFBTSxDQUFDRyxLQUFQLENBQWE5QixNQUFiLEdBQXNCd0YsUUFBdEI7QUFDSDtBQUNKO0FBQ0o7QUFDSixHQS9QOEI7QUFpUS9CO0FBQ0EzQixFQUFBQSxZQUFZLEVBQUMsd0JBQVU7QUFDbkIsUUFBRyxLQUFLcEIsSUFBTCxJQUFhLElBQWIsSUFBcUIsS0FBS0EsSUFBTCxDQUFVZ0IsRUFBVixJQUFnQixJQUF4QyxFQUE2QztBQUM3QyxRQUFJbUMsaUJBQWlCLEdBQUd4QixLQUFLLENBQUMsY0FBRCxFQUFnQixpQkFBaEIsRUFBa0NuRSxLQUFLLENBQUNvRSxTQUFOLENBQWdCLEtBQUs1QixJQUFMLENBQVVJLEVBQTFCLEVBQThCLEtBQUtKLElBQUwsQ0FBVWdCLEVBQVYsQ0FBYU8sSUFBM0MsQ0FBbEMsQ0FBN0I7O0FBQ0EsUUFBRzRCLGlCQUFILEVBQXFCO0FBQ2pCLGFBQU9BLGlCQUFpQixDQUFDbEQsR0FBekI7QUFDSDs7QUFDRCxXQUFPLENBQVA7QUFDSCxHQXpROEI7QUEyUS9CO0FBQ0FtRCxFQUFBQSxhQUFhLEVBQUMseUJBQVU7QUFDcEIsUUFBRyxLQUFLeEYsU0FBUixFQUFrQjtBQUNkLFdBQUtBLFNBQUwsQ0FBZXlGLFFBQWY7QUFDSDs7QUFDRCxTQUFLekYsU0FBTCxHQUFpQixJQUFqQjtBQUNBLFNBQUszQyxJQUFMLENBQVU4RSxzQkFBVixDQUFpQyxLQUFqQztBQUNIO0FBbFI4QixDQUFULENBQTFCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg5Zyj5Y2w56qX5L2TXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMi0yMCAxNDoxNTo1OFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcblxudmFyIEhhbGxvd3NfdHJhY2VXaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiaGFsbG93c1wiLCBcImhhbGxvd3NfdHJhY2Vfd2luZG93XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcuZGlhbG9ndWU7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5CaWc7ICAgICAgICAgICAgICAgLy/mmK/lkKbmmK/lhajlsY/nqpfkvZMgIFdpblR5cGUuRnVsbCwgV2luVHlwZS5CaWcsIFdpblR5cGUuTWluaSwgV2luVHlwZS5UaXBzXG4gICAgICAgIHRoaXMuY3RybCA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuY3RybC5nZXRNb2RlbCgpO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmF0dHJfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLnRoaXNfdXNlX251bSA9IDA7XG4gICAgICAgIHRoaXMuY29zdF9jb25maWcgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfY29uc3QuaWRfc3RvbmU7XG4gICAgICAgIHRoaXMuYXR0cl9jb25maWcgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfY29uc3Quc3RvbmVfYXR0cmlidXRlO1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI7nmoTlm57osIMs5Y+v5Lul5Zyo6L+Z6YeM5o2V6I6355u45YWz6IqC54K55oiW6ICF57uE5Lu2XG4gICAgb3BlbkNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJiYWNrZ3JvdW5kXCIpO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQuc2NhbGUgPSBGSVRfU0NBTEU7XG4gICAgICAgIHZhciBtYWluX3BhbmVsID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcIm1haW5fcGFuZWxcIilcblxuICAgICAgICB0aGlzLmJhY2tncm91bmRfaW1nID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImJhY2tncm91bmRcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRDb21tb25JY29tUGF0aChcImNvbW1vbl8xMDM2XCIpLCAoZnVuY3Rpb24ocmVzT2JqZWN0KXtcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZF9pbWcuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuSW1hZ2VfMSA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJJbWFnZV8xXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMTAzN1wiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLkltYWdlXzEuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuSW1hZ2VfMiA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJJbWFnZV8yXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMTAyNFwiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLkltYWdlXzIuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuSW1hZ2VfNSA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJJbWFnZV81XCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fOTAwMjRcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgdGhpcy5JbWFnZV81LnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLlNwcml0ZV81ID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcIlNwcml0ZV81XCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLlNwcml0ZV82ID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcIlNwcml0ZV82XCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMTAzM1wiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLlNwcml0ZV81LnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgdGhpcy5TcHJpdGVfNi5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5TcHJpdGVfMjMgPSBtYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiU3ByaXRlXzIzXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLlNwcml0ZV8yM18wID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcIlNwcml0ZV8yM18wXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMTAxNlwiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLlNwcml0ZV8yMy5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgICAgIHRoaXMuU3ByaXRlXzIzXzAuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHZhciB3aW5fdGl0bGUgPSBtYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwid2luX3RpdGxlXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHdpbl90aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWco+WNsFwiKTtcbiAgICAgICAgXG4gICAgICAgIHZhciBhdHRyX3RpdGxlID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImF0dHJfdGl0bGVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgYXR0cl90aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuW9k+WJjeWxnuaAp1wiKTtcbiAgICAgICAgXG4gICAgICAgIHZhciBkZXNjID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImRlc2NcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgZGVzYy5zdHJpbmcgPSBVdGlscy5USTE4TihcIuadpea6kDrlhYXlgLzmtLvliqhcIik7XG4gICAgIFxuICAgICAgICB0aGlzLmNvc3RfaXRlbSA9IEl0ZW1zUG9vbC5nZXRJbnN0YW5jZSgpLmdldEl0ZW0oXCJiYWNrcGFja19pdGVtXCIpO1xuICAgICAgICB0aGlzLmNvc3RfaXRlbS5zZXRQYXJlbnQobWFpbl9wYW5lbCk7XG4gICAgICAgIHRoaXMuY29zdF9pdGVtLnNldFBvc2l0aW9uKDMzNi1tYWluX3BhbmVsLndpZHRoLzIsIDI5MCAtIG1haW5fcGFuZWwuaGVpZ2h0LzIpO1xuICAgICAgICB0aGlzLmNvc3RfaXRlbS5pbml0Q29uZmlnKGZhbHNlLCAxLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuY29zdF9pdGVtLnNob3coKTtcbiAgICAgICAgdGhpcy5jYW5fdXNlX2xhYmVsID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImNhbl91c2VfbGFiZWxcIikuZ2V0Q29tcG9uZW50KGNjLlJpY2hUZXh0KVxuICAgIFxuICAgICAgICB0aGlzLm1heF9idG4gPSBtYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwibWF4X2J0blwiKVxuICAgICAgICB0aGlzLnBsdXNfYnRuID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInBsdXNfYnRuXCIpXG4gICAgICAgIHRoaXMubWluX2J0biA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJtaW5fYnRuXCIpXG4gICAgICAgIHRoaXMuc2xpZGVyID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInNsaWRlclwiKS5nZXRDb21wb25lbnQoY2MuU2xpZGVyKTsvLyDmu5HlnZdcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJQcm9ncmVzc0JhclwiKS5nZXRDb21wb25lbnQoY2MuUHJvZ3Jlc3NCYXIpO1xuICAgIFxuICAgICAgICB0aGlzLnVwZ3JhZGVfYnRuID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInVwZ3JhZGVfYnRuXCIpXG4gICAgICAgIHRoaXMudXBncmFkZV9idG5fbGFiZWwgPSB0aGlzLnVwZ3JhZGVfYnRuLmdldENoaWxkQnlOYW1lKFwibGFiZWxcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy51cGdyYWRlX2J0bl9sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIuS9v+eUqFwiKTtcblxuICAgICAgICBmb3IodmFyIGkgPSAxO2k8MztpKyspe1xuICAgICAgICAgICAgdmFyIGF0dHIgPSBtYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiYXR0cl9cIitpKTtcbiAgICAgICAgICAgIGlmKGF0dHIpe1xuICAgICAgICAgICAgICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICAgICAgICAgICAgICBvYmplY3QuaXRlbSA9IGF0dHI7XG4gICAgICAgICAgICAgICAgb2JqZWN0Lmljb24gPSBhdHRyLmdldENoaWxkQnlOYW1lKFwiaWNvblwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgICAgICBvYmplY3QubGFiZWwgPSBhdHRyLmdldENoaWxkQnlOYW1lKFwibGFiZWxcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJfbGlzdFtpXSA9IG9iamVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xvc2VfYnRuID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImNsb3NlX2J0blwiKVxuICAgIH0sXG5cbiAgICAvLyDms6jlhozkuovku7bnm5HlkKznmoTmjqXlj6Ms5LiN6ZyA6KaB5omL5Yqo6LCD55SoLOWmguaenOaYr+S9v+eUqGdjb3JlLkdsb2JhbEV2ZW5055uR5ZCsLOWPr+S7peebtOaOpeiwg+eUqGFkZEdsb2JhbEV2ZW50XG4gICAgcmVnaXN0ZXJFdmVudDpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmJhY2tncm91bmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5IYWxsb3dzVHJhY2VXaW5kb3coZmFsc2UpO1xuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIHRoaXMuY2xvc2VfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLkNsb3NlKTtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c1RyYWNlV2luZG93KGZhbHNlKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICB0aGlzLnVwZ3JhZGVfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLkNsb3NlKTtcbiAgICAgICAgICAgIGlmKHRoaXMuZGF0YSl7XG4gICAgICAgICAgICAgICAgaWYodGhpcy50aGlzX3VzZV9udW0gPT0gMCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c1RyYWNlV2luZG93KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5udW0gPT0gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5L2/55So5pWw6YeP5LiN6IO95Li6MFwiKSlcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdFVzZVRyYWNlSXRlbSh0aGlzLmRhdGEuaWQsIHRoaXMubnVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICB0aGlzLnNsaWRlci5ub2RlLm9uKFwic2xpZGVcIixmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGhpcy5zZXRDb21wb3NlTnVtQnlQZXJjZW50KHRoaXMuc2xpZGVyLnByb2dyZXNzKTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MucHJvZ3Jlc3MgPSB0aGlzLnNsaWRlci5wcm9ncmVzcztcbiAgICAgICAgfSx0aGlzKVxuXG4gICAgICAgIHRoaXMubWluX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZChCdXR0b25Tb3VuZC5Ob3JtYWwpO1xuICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSB0aGlzLnNsaWRlci5wcm9ncmVzcztcbiAgICAgICAgICAgIGlmKHBlcmNlbnQgPT0gMClyZXR1cm47XG4gICAgICAgICAgICBpZih0aGlzLm51bSA9PSAwKXJldHVybjtcbiAgICAgICAgICAgIGlmKHRoaXMudGhpc191c2VfbnVtID09IDApcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5udW0gPSB0aGlzLm51bSAtIDE7XG4gICAgICAgICAgICB0aGlzLnNldENvbXBvc2VOdW0odGhpcy5udW0pO1xuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIHRoaXMucGx1c19idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIHZhciBwZXJjZW50ID0gdGhpcy5zbGlkZXIucHJvZ3Jlc3M7XG4gICAgICAgICAgICBpZihwZXJjZW50ID09IDEpcmV0dXJuO1xuICAgICAgICAgICAgaWYodGhpcy50aGlzX3VzZV9udW0gPT0gMClyZXR1cm47XG4gICAgICAgICAgICBpZih0aGlzLm51bSA+PSB0aGlzLnRoaXNfdXNlX251bSlyZXR1cm47XG4gICAgICAgICAgICB0aGlzLm51bSA9IHRoaXMubnVtICsgMTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29tcG9zZU51bSh0aGlzLm51bSk7XG4gICAgICAgIH0sIHRoaXMpXG5cblxuICAgICAgICB0aGlzLm1heF9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIHZhciBwZXJjZW50ID0gdGhpcy5zbGlkZXIucHJvZ3Jlc3M7XG4gICAgICAgICAgICBpZihwZXJjZW50ID09IDEpcmV0dXJuO1xuICAgICAgICAgICAgaWYodGhpcy50aGlzX3VzZV9udW0gPT0gMClyZXR1cm47XG4gICAgICAgICAgICBpZih0aGlzLm51bSA+PSB0aGlzLnRoaXNfdXNlX251bSlyZXR1cm47XG4gICAgICAgICAgICB0aGlzLm51bSA9IHRoaXMudGhpc191c2VfbnVtO1xuICAgICAgICAgICAgdGhpcy5zZXRDb21wb3NlTnVtKHRoaXMubnVtKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgIH0sXG5cbiAgICBzZXRDb21wb3NlTnVtOmZ1bmN0aW9uKG51bSl7XG4gICAgICAgIHRoaXMubnVtID0gbnVtO1xuICAgICAgICB2YXIgcGVyY2VudCA9IHRoaXMubnVtIC8gdGhpcy50aGlzX3VzZV9udW0gfHwgMDtcbiAgICAgICAgdGhpcy5zbGlkZXIucHJvZ3Jlc3MgPSBwZXJjZW50O1xuICAgICAgICB0aGlzLnByb2dyZXNzLnByb2dyZXNzID0gdGhpcy5zbGlkZXIucHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMuZmlsZU51bShudW0pO1xuICAgIH0sXG5cbiAgICBzZXRDb21wb3NlTnVtQnlQZXJjZW50OmZ1bmN0aW9uKHBlcmNlbnQpe1xuICAgICAgICB0aGlzLm51bSA9IE1hdGguZmxvb3IoIHBlcmNlbnQgKiB0aGlzLnRoaXNfdXNlX251bSApXG4gICAgICAgIHRoaXMuZmlsZU51bSh0aGlzLm51bSk7XG4gICAgfSxcblxuICAgIGZpbGVOdW06ZnVuY3Rpb24obnVtKXtcbiAgICAgICAgaWYodGhpcy5oYWRfbWF4X251bSA9PSBudWxsKXJldHVybjtcbiAgICAgICAgdGhpcy5jb3N0X2l0ZW0uc2V0TmVlZE51bShudW0gLCB0aGlzLmhhZF9tYXhfbnVtKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgaWYoZGF0YSAmJiBkYXRhLnZvICYmIHRoaXMuY29zdF9jb25maWcpe1xuICAgICAgICAgICAgdGhpcy5oYWRfdXNlX251bSA9IGRhdGEudm8uc2VhbDsgICAgICAgICAgICAgLy8g5b2T5YmN5L2/55So55qE5pWw6YePXG4gICAgICAgICAgICB0aGlzLnVzZV9tYXhfbnVtID0gdGhpcy5nZXRVc2VNYXhOdW0oKTsgICAgICAvLyDlvZPliY3mnIDpq5jlj6/kvb/nlKjmlbDph49cblxuICAgICAgICAgICAgLy/mlbDmja7lvILluLhcbiAgICAgICAgICAgIGlmKHRoaXMudXNlX21heF9udW0gPT0gMClyZXR1cm47XG4gICAgICAgICAgICB2YXIgbWF4X3N0ZXAgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfbWF4X2xldlt0aGlzLmRhdGEuaWRdO1xuICAgICAgICAgICAgaWYobWF4X3N0ZXAgPT0gbnVsbClyZXR1cm47XG4gICAgICAgICAgICB2YXIgc3RlcCA9IHRoaXMuZGF0YS52by5zdGVwO1xuICAgICAgICAgICAgLy/msqHlkIPmu6Es6YO95pi+56S65Y+v5Lul5L2/55So55qEXG4gICAgICAgICAgICBpZih0aGlzLmhhZF91c2VfbnVtIDwgdGhpcy51c2VfbWF4X251bSl7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5fdXNlX2xhYmVsLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuW9k+WJjeW3suS9v+eUqDolcy8lc1wiKSwgdGhpcy5oYWRfdXNlX251bSwgdGhpcy51c2VfbWF4X251bSk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBpZihzdGVwID49IG1heF9zdGVwKXsvL+W3sue7j+a7oee6p+eahFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbl91c2VfbGFiZWwuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5bey6L6+5pyA5aSn5L2/55So5pWw6YePOiVzLyVzXCIpLCB0aGlzLmhhZF91c2VfbnVtLCB0aGlzLnVzZV9tYXhfbnVtKVxuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAvL+aJvuWHuuS4i+S4gOmYtueahFxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dF9jb25maWcgPSBnZGF0YShcImhhbGxvd3NfZGF0YVwiLFwiZGF0YV90cmFjZV9jb3N0XCIsVXRpbHMuZ2V0Tm9yS2V5KHRoaXMuZGF0YS5pZCwgc3RlcCsxKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKG5leHRfY29uZmlnKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuX3VzZV9sYWJlbC5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLlnKPlmaglc+mYtuWPr+WinuWKoOS9v+eUqOaVsOmHjzolc1wiKSwgc3RlcCsxLCAobmV4dF9jb25maWcubnVtIC0gdGhpcy5oYWRfdXNlX251bSkgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNhbl91c2VfbnVtID0gdGhpcy51c2VfbWF4X251bSAtIHRoaXMuaGFkX3VzZV9udW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDlvZPliY3liankvZnlj6/kvb/nlKjmlbDph49cbiAgICAgICAgICAgIGlmKHRoaXMuY2FuX3VzZV9udW0gPCAwKXtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbl91c2VfbnVtID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v5b2T5YmN6IOM5YyF5Lit5pWw6YePXG4gICAgICAgICAgICB0aGlzLmhhZF9tYXhfbnVtID0gQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRJdGVtTnVtQnlCaWQodGhpcy5jb3N0X2NvbmZpZy52YWwpOyAgICAgLy8g6IOM5YyF5Lit5oC75pWw6YePXG4gICAgICAgICAgICB2YXIgaXRlbVZvID0ge2JpZDp0aGlzLmNvc3RfY29uZmlnLnZhbCwgbnVtOnRoaXMuaGFkX21heF9udW19O1xuICAgICAgICAgICAgdGhpcy5jb3N0X2l0ZW0uc2V0RGF0YShpdGVtVm8pICBcbiAgICAgICAgICAgIHRoaXMudGhpc191c2VfbnVtID0gTWF0aC5taW4odGhpcy5jYW5fdXNlX251bSwgdGhpcy5oYWRfbWF4X251bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+i/measoeacgOWkmuWPr+S9v+eUqOeahOaVsOmHj1xuICAgICAgICAgICAgdGhpcy5udW0gPSB0aGlzLnRoaXNfdXNlX251bTsgICAgICAgIC8vIOW9k+WJjeaVsOmHj1xuICAgICAgICAgICAgdGhpcy5zZXRDb21wb3NlTnVtKHRoaXMubnVtKTtcbiAgICAgICAgICAgIHRoaXMuc2V0QmFzZUF0dHJMaXN0KClcblxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6K6+572u5b2T5YmN5Zyj5Y2w5oC75bGe5oCnXG4gICAgc2V0QmFzZUF0dHJMaXN0OmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuY29zdF9jb25maWcgPT0gbnVsbCB8fCB0aGlzLmF0dHJfY29uZmlnID09IG51bGwpcmV0dXJuO1xuICAgICAgICBpZih0aGlzLmhhZF91c2VfbnVtID09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5oYWRfdXNlX251bSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5hdHRyX2xpc3Qpe1xuICAgICAgICAgICAgdGhpcy5hdHRyX2xpc3RbaV0uaXRlbS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaiBpbiB0aGlzLmF0dHJfY29uZmlnLnZhbCl7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMuYXR0cl9jb25maWcudmFsW2pdO1xuICAgICAgICAgICAgdmFyIGF0dHJfa2V5ID0gdlswXTtcbiAgICAgICAgICAgIHZhciBhdHRyX3ZhbCA9IHZbMV0gKiB0aGlzLmhhZF91c2VfbnVtIDtcbiAgICAgICAgICAgIHZhciBhdHRyX25hbWUgPSBDb25maWcuYXR0cl9kYXRhLmRhdGFfa2V5X3RvX25hbWVbYXR0cl9rZXldO1xuICAgICAgICAgICAgaWYoYXR0cl9uYW1lKXtcbiAgICAgICAgICAgICAgICB2YXIgYXR0cl9pY29uID0gUGF0aFRvb2wuZ2V0QXR0ckljb25CeVN0cihhdHRyX2tleSk7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJfc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiICVzICslc1wiKSxhdHRyX25hbWUsIGF0dHJfdmFsKTtcblxuICAgICAgICAgICAgICAgIHZhciBvYmplY3QgPSB0aGlzLmF0dHJfbGlzdFtwYXJzZUludChqKSsxXTtcbiAgICAgICAgICAgICAgICBpZihvYmplY3Qpe1xuICAgICAgICAgICAgICAgICAgICBvYmplY3QuaXRlbS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoYXR0cl9pY29uKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKGljb24sc2Zfb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyxvYmplY3QuaWNvbikpO1xuICAgICAgICAgICAgICAgICAgICBvYmplY3QubGFiZWwuc3RyaW5nID0gYXR0cl9zdHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6L+U5Zue5b2T5YmN6Zi25pWw5pyA5aSn5Y+v5L2/55So55qE5pWw6YeP55qE6YWN572u6KGoXG4gICAgZ2V0VXNlTWF4TnVtOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuZGF0YSA9PSBudWxsIHx8IHRoaXMuZGF0YS52byA9PSBudWxsKXJldHVybjtcbiAgICAgICAgdmFyIHRyYWNlX2Nvc3RfY29uZmlnID0gZ2RhdGEoXCJoYWxsb3dzX2RhdGFcIixcImRhdGFfdHJhY2VfY29zdFwiLFV0aWxzLmdldE5vcktleSh0aGlzLmRhdGEuaWQsIHRoaXMuZGF0YS52by5zdGVwKSk7XG4gICAgICAgIGlmKHRyYWNlX2Nvc3RfY29uZmlnKXtcbiAgICAgICAgICAgIHJldHVybiB0cmFjZV9jb3N0X2NvbmZpZy5udW1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMFxuICAgIH0sXG5cbiAgICAvLyDlhbPpl63nqpfkvZPlm57osIMs6ZyA6KaB5Zyo6L+Z6YeM6LCD55So6K+l56qX5L2T5omA5bGeY29udHJvbGxlcueahGNsb3Nl5pa55rOV5rKh55So5LqO572u56m66K+l56qX5L2T5a6e5L6L5a+56LGhXG4gICAgY2xvc2VDYWxsQmFjazpmdW5jdGlvbigpe1xuICAgICAgICBpZih0aGlzLmNvc3RfaXRlbSl7XG4gICAgICAgICAgICB0aGlzLmNvc3RfaXRlbS5vbkRlbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29zdF9pdGVtID0gbnVsbFxuICAgICAgICB0aGlzLmN0cmwub3BlbkhhbGxvd3NUcmFjZVdpbmRvdyhmYWxzZSk7XG4gICAgfSxcbn0pIl19
|