|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/guildwar/view/guildwar_rank_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, 'e31c159Ma1PWKAm5zwgVnPf', 'guildwar_rank_window');
|
// Scripts/mod/guildwar/view/guildwar_rank_window.js
|
|
"use strict";
|
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 联盟战排名
|
// <br/>Create: 2019-05-09 15:51:03
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var RankConstant = require("rank_constant");
|
|
var GuildwarEvent = require("guildwar_event");
|
|
var RankItem = require("rank_item");
|
|
var CommonScrollView = require("common_scrollview");
|
|
var RoleController = require("role_controller");
|
|
var PlayerHead = require("playerhead");
|
|
var Guildwar_rankWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("rank", "rank_window");
|
this.viewTag = SCENE_TAG.dialogue; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
|
|
this.win_type = WinType.Big; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initConfig: function initConfig() {
|
this.first_list = {};
|
this.click_index = RankConstant.RankType.guild_war;
|
this.ctrl = require("guildwar_controller").getInstance();
|
this.model = this.ctrl.getModel();
|
this.node_list = [];
|
},
|
// 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
|
openCallBack: function openCallBack() {
|
this.background = this.seekChild("background");
|
this.main_panel = this.seekChild("main_container");
|
this.close_btn = this.seekChild("close_btn");
|
this.rank_panel = this.seekChild("rank_panel");
|
this.my_rank = this.seekChild("my_rank");
|
this.rank_index = this.seekChild(this.my_rank, "rank_id", cc.Label);
|
this.four_label = this.seekChild(this.my_rank, "four_label", cc.RichText);
|
this.my_rank_power = this.seekChild(this.my_rank, "my_rank_power", cc.Label);
|
this.my_head = new PlayerHead();
|
this.my_head.setParent(this.my_rank);
|
this.my_head.show();
|
this.my_head.setPosition(-155, 60); // this.my_head.setVisible(false);
|
|
this.my_head.setScale(0.9);
|
this.no_rank = this.seekChild(this.my_rank, "no_rank", cc.Label);
|
this.my_name = this.seekChild(this.my_rank, "my_name", cc.Label);
|
this.no_rank.string = "未上榜";
|
this.my_name.string = "";
|
this.star_label = Utils.createLabel(24, new cc.Color(0x68, 0x45, 0x2a, 0xff), null, 402, 56, "", this.my_rank, 0, cc.v2(0, 0.5));
|
this.score_label = Utils.createLabel(24, new cc.Color(0x68, 0x45, 0x2a, 0xff), null, 525, 56, "", this.my_rank, 0, cc.v2(0, 0.5));
|
this.node_list.push(this.star_label);
|
this.node_list.push(this.score_label);
|
this.title_con = this.seekChild(this.main_panel, "title_con");
|
var title = this.seekChild(this.title_con, "title_label", cc.Label);
|
var name = RankConstant.TitleName[this.click_index] || "";
|
title.string = name;
|
this.top_bg = this.seekChild(this.main_panel, "top_bg", cc.Sprite);
|
this.top_bg.node.setScale(0.9, 0.9);
|
var res_id = PathTool.getBigBg("rank_1", null, "rank");
|
this.loadRes(res_id, function (sf_obj) {
|
this.top_bg.spriteFrame = sf_obj;
|
}.bind(this));
|
this.top_container = this.seekChild("top_container");
|
this.top_rank_list = {}; //顶部前3;
|
|
for (var i = 1; i <= 3; i++) {
|
var label = this.seekChild(this.top_container, "name_" + i, cc.Label);
|
var img = this.seekChild(this.top_container, "guan_" + i);
|
|
if (this.top_rank_list[i] == null) {
|
this.top_rank_list[i] = {};
|
this.top_rank_list[i].label = label;
|
this.top_rank_list[i].img = img;
|
}
|
}
|
|
var list_size = cc.size(610, 530);
|
var setting = {
|
item_class: RankItem,
|
// 单元类
|
start_x: 5,
|
// 第一个单元的X起点
|
space_x: 0,
|
// x方向的间隔
|
start_y: 0,
|
// 第一个单元的Y起点
|
space_y: 0,
|
// y方向的间隔
|
item_width: 600,
|
// 单元的尺寸width
|
item_height: 120,
|
// 单元的尺寸height
|
row: 0,
|
// 行数,作用于水平滚动类型
|
col: 1,
|
// 列数,作用于垂直滚动类型
|
need_dynamic: true
|
};
|
this.list_view = new CommonScrollView();
|
this.list_view.createScroll(this.rank_panel, cc.v2(0, -28), ScrollViewDir.vertical, ScrollViewStartPos.top, list_size, setting, cc.v2(0.5, 0.5));
|
this.updateTitle();
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
this.background.on(cc.Node.EventType.TOUCH_END, function () {
|
this.ctrl.openGuildWarRankView(false);
|
}, this);
|
this.close_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
this.ctrl.openGuildWarRankView(false);
|
}, this);
|
this.addGlobalEvent(GuildwarEvent.UpdateGuildWarRankDataEvent, function (data) {
|
this.updateRankList(data);
|
}, this);
|
},
|
//更新标题
|
updateTitle: function updateTitle() {
|
var title_list = RankConstant.RankTitle[this.click_index] || {};
|
var num = Object.keys(title_list).length || 0;
|
var pos_list = RankConstant.TitlePos[this.click_index] || {};
|
var line_pos_list = RankConstant.TitleLinePos[this.click_index] || {};
|
|
for (var i = 1; i <= num; i++) {
|
if (i != num) {
|
this.createImage(line_pos_list[i]);
|
}
|
|
var offx = pos_list[i] || 0;
|
var label = Utils.createLabel(24, new cc.Color(0x68, 0x45, 0x2a, 0xff), null, offx - 336, 230, "", this.main_panel, 0, cc.v2(0, 0.5));
|
var str = title_list[i] || "";
|
label.string = str;
|
this.node_list.push(label);
|
}
|
},
|
createImage: function createImage(x) {
|
var line_offx = x || 0;
|
var res = PathTool.getCommonIcomPath("common_1069");
|
var line = Utils.createImage(this.main_panel, res, line_offx - 338, 230, cc.v2(0, 0.5), true, 1, false);
|
this.loadRes(res, function (sf_obj) {
|
line.spriteFrame = sf_obj;
|
}.bind(this));
|
line.node.setScale(1, 0.8);
|
this.node_list.push(line);
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
|
openRootWnd: function openRootWnd(params) {
|
this.ctrl.requestGuildWarRankData();
|
},
|
updateRankList: function updateRankList(data) {
|
this.rank_data = data;
|
this.updateMyData();
|
this.updateRankData();
|
|
if (this.rank_data.length <= 0) {
|
this.showEmptyIcon(true);
|
} else {
|
this.showEmptyIcon(false);
|
}
|
|
this.list_view.setData(this.rank_data, null, {
|
rank_type: RankConstant.RankType.guild_war
|
});
|
},
|
getMyselfRankData: function getMyselfRankData(rid, srv_id) {
|
var myself_data = {};
|
|
for (var k in this.rank_data) {
|
var data = this.rank_data[k];
|
|
if (data.rid == rid && data.srv_id == srv_id) {
|
myself_data = data;
|
break;
|
}
|
}
|
|
return myself_data;
|
},
|
updateMyData: function updateMyData() {
|
if (!this.rank_data) return;
|
var role_vo = RoleController.getInstance().getRoleVo();
|
var myself_data = this.getMyselfRankData(role_vo.rid, role_vo.srv_id);
|
var str = "0";
|
var my_idx = myself_data.rank || 0;
|
|
if (my_idx && my_idx > 0) {
|
str = my_idx;
|
}
|
|
this.no_rank.node.active = false;
|
this.rank_index.string = str;
|
|
if (my_idx && my_idx >= 1 && my_idx <= 3) {
|
this.rank_index.node.active = false;
|
|
if (!this.my_rank_icon) {
|
this.my_rank_icon = this.seekChild(this.my_rank, "my_rank_icon", cc.Sprite);
|
}
|
|
this.my_rank_icon.node.active = true;
|
this.loadRes(PathTool.getUIIconPath('common', 'common_300' + my_idx), function (sp) {
|
this.my_rank_icon.spriteFrame = sp;
|
}.bind(this));
|
this.my_rank_icon.node.scale = 0.7;
|
} else {
|
if (my_idx <= 0) {
|
this.no_rank.node.active = true;
|
this.rank_index.node.active = false;
|
} else {
|
this.rank_index.node.active = true;
|
|
if (this.my_rank_icon) {
|
this.my_rank_icon.node.active = false;
|
}
|
}
|
}
|
|
this.my_head.setHeadRes(role_vo.face_id);
|
this.star_label.string = myself_data.star || "";
|
this.my_name.string = myself_data.name || "";
|
this.score_label.string = myself_data.war_score || "";
|
},
|
updateRankData: function updateRankData() {
|
var _pos_list;
|
|
if (!this.rank_data) return;
|
var rank_list = this.rank_data || {};
|
var count = 0;
|
var size = this.main_panel.getContentSize();
|
|
for (var i in rank_list) {
|
var v = rank_list[i];
|
var idx = v.idx || v.rank;
|
|
if (idx > 0 && idx <= 3) {
|
count = count + 1;
|
|
if (!this.first_list[idx]) {
|
var head = new PlayerHead();
|
head.show();
|
var width = 0;
|
var height = 373;
|
var off_y = 0;
|
|
if (idx == 2) {
|
width = -170;
|
height = 360;
|
off_y = 6;
|
} else if (idx == 3) {
|
width = 170;
|
height = 360;
|
off_y = 6;
|
}
|
|
head.setPosition(width, height);
|
head.setParent(this.main_panel);
|
var name = this.top_rank_list[count].label;
|
name.node.active = true;
|
var title = this.top_rank_list[count].img;
|
title.active = true;
|
this.first_list[idx] = title;
|
this.first_list[idx] = head;
|
this.first_list[idx].head_name = name;
|
}
|
|
var face_id = v.face_id || v.face || v.leader_face || 0;
|
var avatar_bid = v.avatar_bid || v.leader_avatar_bid || 0; // var vo = gdata("avatar_data", "data_avatar", [avatar_bid]);
|
// if (vo) {
|
// var res_id = vo.res_id || 1;
|
// var res = "";
|
// }
|
|
this.first_list[idx].setHeadRes(face_id);
|
this.first_list[idx].addCallBack(function (v) {
|
var roleVo = RoleController.getInstance().getRoleVo();
|
var rid = v.rid || v.leader_rid || 0;
|
var srv_id = v.srv_id || v.leader_srvid || 0;
|
if (roleVo.rid == rid && roleVo.srv_id == srv_id) return;
|
var vo = {
|
rid: rid,
|
srv_id: srv_id
|
};
|
|
require("chat_controller").getInstance().openFriendInfo(vo);
|
}.bind(this, v));
|
var name = v.name || "";
|
this.first_list[idx].head_name.string = name;
|
}
|
|
if (count >= 3) break;
|
}
|
|
if (!this.no_label_list) {
|
this.no_label_list = {};
|
}
|
|
for (var i in this.no_label_list) {
|
this.no_label_list[i].setVisible(false);
|
}
|
|
var pos_list = (_pos_list = {}, _defineProperty(_pos_list, 1, 336 - size.width / 2), _defineProperty(_pos_list, 2, 167 - size.width / 2), _defineProperty(_pos_list, 3, 508 - size.width / 2), _pos_list);
|
|
if (rank_list.length < 3) {
|
for (var i = rank_list.length + 1; i <= 3; i++) {
|
if (!this.no_label_list[i]) {
|
var label = Utils.createLabel(24, null, null, pos_list[i], 360, Utils.TI18N("虚位以待"), this.main_panel, 0, cc.v2(0.5, 0.5));
|
this.no_label_list[i] = label.node;
|
this.node_list.push(label);
|
|
if (this.top_rank_list[i]) {
|
this.top_rank_list[i].label.node.active = false;
|
this.top_rank_list[i].img.active = false;
|
}
|
}
|
|
this.no_label_list[i].active = true;
|
}
|
}
|
},
|
//显示空白
|
showEmptyIcon: function showEmptyIcon(bool) {
|
if (!this.empty_con && bool == false) return;
|
|
if (!this.empty_con) {
|
var size = cc.size(200, 200);
|
this.empty_con = new cc.Node();
|
this.empty_con.setContentSize(size);
|
this.empty_con.setAnchorPoint(cc.v2(0.5, 0.5));
|
this.empty_con.setPosition(cc.v2(0, 0));
|
this.main_panel.addChild(this.empty_con);
|
var res = PathTool.getBigBg("bigbg_3");
|
this.empty_bg = Utils.createImage(this.empty_con, null, 0, 0, cc.v2(0.5, 0.5), false);
|
this.loadRes(res, function (sf_obj) {
|
this.empty_bg.spriteFrame = sf_obj;
|
}.bind(this));
|
this.empty_label = Utils.createLabel(26, new cc.Color(0x68, 0x45, 0x2a, 0xff), null, 0, -100, "", this.empty_con, 0, cc.v2(0.5, 0.5));
|
}
|
|
var str = Utils.TI18N("当前排行榜暂无数据");
|
this.empty_label.string = str;
|
this.empty_con.active = bool;
|
},
|
// 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
|
closeCallBack: function closeCallBack() {
|
if (this.node_list) {
|
for (var i in this.node_list) {
|
var v = this.node_list[i];
|
|
if (v instanceof cc.Node) {
|
v.destroy();
|
v = null;
|
} else {
|
v.node.destroy();
|
v = null;
|
}
|
}
|
|
this.node_list = null;
|
}
|
|
if (this.empty_con) {
|
this.empty_con.destroy();
|
this.empty_label.destroy();
|
this.empty_bg.destroy();
|
this.empty_con = null;
|
this.empty_bg = null;
|
this.empty_label = null;
|
}
|
|
if (this.my_head) {
|
this.my_head.deleteMe();
|
this.my_head = null;
|
}
|
|
this.ctrl.openGuildWarRankView(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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZHdhclxcdmlld1xcZ3VpbGR3YXJfcmFua193aW5kb3cuanMiXSwibmFtZXMiOlsiUGF0aFRvb2wiLCJyZXF1aXJlIiwiUmFua0NvbnN0YW50IiwiR3VpbGR3YXJFdmVudCIsIlJhbmtJdGVtIiwiQ29tbW9uU2Nyb2xsVmlldyIsIlJvbGVDb250cm9sbGVyIiwiUGxheWVySGVhZCIsIkd1aWxkd2FyX3JhbmtXaW5kb3ciLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwiZGlhbG9ndWUiLCJ3aW5fdHlwZSIsIldpblR5cGUiLCJCaWciLCJpbml0Q29uZmlnIiwiZmlyc3RfbGlzdCIsImNsaWNrX2luZGV4IiwiUmFua1R5cGUiLCJndWlsZF93YXIiLCJjdHJsIiwiZ2V0SW5zdGFuY2UiLCJtb2RlbCIsImdldE1vZGVsIiwibm9kZV9saXN0Iiwib3BlbkNhbGxCYWNrIiwiYmFja2dyb3VuZCIsInNlZWtDaGlsZCIsIm1haW5fcGFuZWwiLCJjbG9zZV9idG4iLCJyYW5rX3BhbmVsIiwibXlfcmFuayIsInJhbmtfaW5kZXgiLCJMYWJlbCIsImZvdXJfbGFiZWwiLCJSaWNoVGV4dCIsIm15X3JhbmtfcG93ZXIiLCJteV9oZWFkIiwic2V0UGFyZW50Iiwic2hvdyIsInNldFBvc2l0aW9uIiwic2V0U2NhbGUiLCJub19yYW5rIiwibXlfbmFtZSIsInN0cmluZyIsInN0YXJfbGFiZWwiLCJVdGlscyIsImNyZWF0ZUxhYmVsIiwiQ29sb3IiLCJ2MiIsInNjb3JlX2xhYmVsIiwicHVzaCIsInRpdGxlX2NvbiIsInRpdGxlIiwibmFtZSIsIlRpdGxlTmFtZSIsInRvcF9iZyIsIlNwcml0ZSIsIm5vZGUiLCJyZXNfaWQiLCJnZXRCaWdCZyIsImxvYWRSZXMiLCJzZl9vYmoiLCJzcHJpdGVGcmFtZSIsImJpbmQiLCJ0b3BfY29udGFpbmVyIiwidG9wX3JhbmtfbGlzdCIsImkiLCJsYWJlbCIsImltZyIsImxpc3Rfc2l6ZSIsInNpemUiLCJzZXR0aW5nIiwiaXRlbV9jbGFzcyIsInN0YXJ0X3giLCJzcGFjZV94Iiwic3RhcnRfeSIsInNwYWNlX3kiLCJpdGVtX3dpZHRoIiwiaXRlbV9oZWlnaHQiLCJyb3ciLCJjb2wiLCJuZWVkX2R5bmFtaWMiLCJsaXN0X3ZpZXciLCJjcmVhdGVTY3JvbGwiLCJTY3JvbGxWaWV3RGlyIiwidmVydGljYWwiLCJTY3JvbGxWaWV3U3RhcnRQb3MiLCJ0b3AiLCJ1cGRhdGVUaXRsZSIsInJlZ2lzdGVyRXZlbnQiLCJvbiIsIk5vZGUiLCJFdmVudFR5cGUiLCJUT1VDSF9FTkQiLCJvcGVuR3VpbGRXYXJSYW5rVmlldyIsImFkZEdsb2JhbEV2ZW50IiwiVXBkYXRlR3VpbGRXYXJSYW5rRGF0YUV2ZW50IiwiZGF0YSIsInVwZGF0ZVJhbmtMaXN0IiwidGl0bGVfbGlzdCIsIlJhbmtUaXRsZSIsIm51bSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJwb3NfbGlzdCIsIlRpdGxlUG9zIiwibGluZV9wb3NfbGlzdCIsIlRpdGxlTGluZVBvcyIsImNyZWF0ZUltYWdlIiwib2ZmeCIsInN0ciIsIngiLCJsaW5lX29mZngiLCJyZXMiLCJnZXRDb21tb25JY29tUGF0aCIsImxpbmUiLCJvcGVuUm9vdFduZCIsInBhcmFtcyIsInJlcXVlc3RHdWlsZFdhclJhbmtEYXRhIiwicmFua19kYXRhIiwidXBkYXRlTXlEYXRhIiwidXBkYXRlUmFua0RhdGEiLCJzaG93RW1wdHlJY29uIiwic2V0RGF0YSIsInJhbmtfdHlwZSIsImdldE15c2VsZlJhbmtEYXRhIiwicmlkIiwic3J2X2lkIiwibXlzZWxmX2RhdGEiLCJrIiwicm9sZV92byIsImdldFJvbGVWbyIsIm15X2lkeCIsInJhbmsiLCJhY3RpdmUiLCJteV9yYW5rX2ljb24iLCJnZXRVSUljb25QYXRoIiwic3AiLCJzY2FsZSIsInNldEhlYWRSZXMiLCJmYWNlX2lkIiwic3RhciIsIndhcl9zY29yZSIsInJhbmtfbGlzdCIsImNvdW50IiwiZ2V0Q29udGVudFNpemUiLCJ2IiwiaWR4IiwiaGVhZCIsIndpZHRoIiwiaGVpZ2h0Iiwib2ZmX3kiLCJoZWFkX25hbWUiLCJmYWNlIiwibGVhZGVyX2ZhY2UiLCJhdmF0YXJfYmlkIiwibGVhZGVyX2F2YXRhcl9iaWQiLCJhZGRDYWxsQmFjayIsInJvbGVWbyIsImxlYWRlcl9yaWQiLCJsZWFkZXJfc3J2aWQiLCJ2byIsIm9wZW5GcmllbmRJbmZvIiwibm9fbGFiZWxfbGlzdCIsInNldFZpc2libGUiLCJUSTE4TiIsImJvb2wiLCJlbXB0eV9jb24iLCJzZXRDb250ZW50U2l6ZSIsInNldEFuY2hvclBvaW50IiwiYWRkQ2hpbGQiLCJlbXB0eV9iZyIsImVtcHR5X2xhYmVsIiwiY2xvc2VDYWxsQmFjayIsImRlc3Ryb3kiLCJkZWxldGVNZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsWUFBWSxHQUFHRCxPQUFPLENBQUMsZUFBRCxDQUExQjs7QUFDQSxJQUFJRSxhQUFhLEdBQUdGLE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFDQSxJQUFJRyxRQUFRLEdBQUdILE9BQU8sQ0FBQyxXQUFELENBQXRCOztBQUNBLElBQUlJLGdCQUFnQixHQUFHSixPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUssY0FBYyxHQUFHTCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSU0sVUFBVSxHQUFHTixPQUFPLENBQUMsWUFBRCxDQUF4Qjs7QUFFQSxJQUFJTyxtQkFBbUIsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDL0IsYUFBU0MsUUFEc0I7QUFFL0JDLEVBQUFBLElBQUksRUFBRSxnQkFBWTtBQUNkLFNBQUtDLFVBQUwsR0FBa0JiLFFBQVEsQ0FB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QThCO0FBQzFCLFlBQUk0SCxDQUFDLEdBQUcsS0FBSzVILFNBQUwsQ0FBZTJDLENBQWYsQ0FBUjs7QUFDQSxZQUFJaUYsQ0FBQyxZQUFZakosRUFBRSxDQUFDeUYsSUFBcEIsRUFBMEI7QUFDdEJ3RCxVQUFBQSxDQUFDLENBQUM0QixPQUFGO0FBQ0E1QixVQUFBQSxDQUFDLEdBQUcsSUFBSjtBQUNILFNBSEQsTUFHTztBQUNIQSxVQUFBQSxDQUFDLENBQUMxRixJQUFGLENBQU9zSCxPQUFQO0FBQ0E1QixVQUFBQSxDQUFDLEdBQUcsSUFBSjtBQUNIO0FBQ0o7O0FBQ0QsV0FBSzVILFNBQUwsR0FBaUIsSUFBakI7QUFDSDs7QUFDRCxRQUFJLEtBQUtpSixTQUFULEVBQW9CO0FBQ2hCLFdBQUtBLFNBQUwsQ0FBZU8sT0FBZjtBQUNBLFdBQUtGLFdBQUwsQ0FBaUJFLE9BQWpCO0FBQ0EsV0FBS0gsUUFBTCxDQUFjRyxPQUFkO0FBQ0EsV0FBS1AsU0FBTCxHQUFpQixJQUFqQjtBQUNBLFdBQUtJLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxXQUFLQyxXQUFMLEdBQW1CLElBQW5CO0FBQ0g7O0FBQ0QsUUFBSSxLQUFLekksT0FBVCxFQUFrQjtBQUNkLFdBQUtBLE9BQUwsQ0FBYTRJLFFBQWI7QUFDQSxXQUFLNUksT0FBTCxHQUFlLElBQWY7QUFDSDs7QUFDRCxTQUFLakIsSUFBTCxDQUFVMkUsb0JBQVYsQ0FBK0IsS0FBL0I7QUFDSDtBQXZWOEIsQ0FBVCxDQUExQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgIOiBlOebn+aImOaOkuWQjVxuLy8gPGJyLz5DcmVhdGU6IDIwMTktMDUtMDkgMTU6NTE6MDNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XG52YXIgUmFua0NvbnN0YW50ID0gcmVxdWlyZShcInJhbmtfY29uc3RhbnRcIik7XG52YXIgR3VpbGR3YXJFdmVudCA9IHJlcXVpcmUoXCJndWlsZHdhcl9ldmVudFwiKTtcbnZhciBSYW5rSXRlbSA9IHJlcXVpcmUoXCJyYW5rX2l0ZW1cIik7XG52YXIgQ29tbW9uU2Nyb2xsVmlldyA9IHJlcXVpcmUoXCJjb21tb25fc2Nyb2xsdmlld1wiKTtcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XG52YXIgUGxheWVySGVhZCA9IHJlcXVpcmUoXCJwbGF5ZXJoZWFkXCIpO1xuXG52YXIgR3VpbGR3YXJfcmFua1dpbmRvdyA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJyYW5rXCIsIFwicmFua193aW5kb3dcIik7XG4gICAgICAgIHRoaXMudmlld1RhZyA9IFNDRU5FX1RBRy5kaWFsb2d1ZTsgICAgICAgICAgICAgICAgLy/or6XnqpfkvZPmiYDlsZ51aeWxgue6pyzlhajlsY91aemcgOimgeWcqHVp5bGCLOmdnuWFqOWxj3Vp5ZyoZGlhbG9ndWXlsYIs6L+Z5Liq6KaB5rOo5oSPXG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkJpZzsgICAgICAgICAgICAgICAvL+aYr+WQpuaYr+WFqOWxj+eql+S9kyAgV2luVHlwZS5GdWxsLCBXaW5UeXBlLkJpZywgV2luVHlwZS5NaW5pLCBXaW5UeXBlLlRpcHNcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW5LiA5Lqb6YWN572u5pWw5o2uLOWPr+S7peeUqOS6juWjsOaYjuS4gOS6m+WPmOmHj+S5i+exu+eahFxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5maXJzdF9saXN0ID0ge307XG4gICAgICAgIHRoaXMuY2xpY2tfaW5kZXggPSBSYW5rQ29uc3RhbnQuUmFua1R5cGUuZ3VpbGRfd2FyO1xuICAgICAgICB0aGlzLmN0cmwgPSByZXF1aXJlKFwiZ3VpbGR3YXJfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jdHJsLmdldE1vZGVsKCk7XG4gICAgICAgIHRoaXMubm9kZV9saXN0ID0gW107XG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjueahOWbnuiwgyzlj6/ku6XlnKjov5nph4zmjZXojrfnm7jlhbPoioLngrnmiJbogIXnu4Tku7ZcbiAgICBvcGVuQ2FsbEJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gdGhpcy5zZWVrQ2hpbGQoXCJiYWNrZ3JvdW5kXCIpO1xuXG4gICAgICAgIHRoaXMubWFpbl9wYW5lbCA9IHRoaXMuc2Vla0NoaWxkKFwibWFpbl9jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMuY2xvc2VfYnRuID0gdGhpcy5zZWVrQ2hpbGQoXCJjbG9zZV9idG5cIik7XG5cbiAgICAgICAgdGhpcy5yYW5rX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQoXCJyYW5rX3BhbmVsXCIpO1xuICAgICAgICB0aGlzLm15X3JhbmsgPSB0aGlzLnNlZWtDaGlsZChcIm15X3JhbmtcIik7XG5cbiAgICAgICAgdGhpcy5yYW5rX2luZGV4ID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5teV9yYW5rLCBcInJhbmtfaWRcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLmZvdXJfbGFiZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm15X3JhbmssIFwiZm91cl9sYWJlbFwiLCBjYy5SaWNoVGV4dCk7XG4gICAgICAgIHRoaXMubXlfcmFua19wb3dlciA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubXlfcmFuaywgXCJteV9yYW5rX3Bvd2VyXCIsIGNjLkxhYmVsKTtcblxuICAgICAgICB0aGlzLm15X2hlYWQgPSBuZXcgUGxheWVySGVhZCgpO1xuICAgICAgICB0aGlzLm15X2hlYWQuc2V0UGFyZW50KHRoaXMubXlfcmFuayk7XG4gICAgICAgIHRoaXMubXlfaGVhZC5zaG93KClcbiAgICAgICAgdGhpcy5teV9oZWFkLnNldFBvc2l0aW9uKC0xNTUsIDYwKTtcbiAgICAgICAgLy8gdGhpcy5teV9oZWFkLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgICB0aGlzLm15X2hlYWQuc2V0U2NhbGUoMC45KVxuXG4gICAgICAgIHRoaXMubm9fcmFuayA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubXlfcmFuaywgXCJub19yYW5rXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5teV9uYW1lID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5teV9yYW5rLCBcIm15X25hbWVcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLm5vX3Jhbmsuc3RyaW5nID0gXCLmnKrkuIrmppxcIjtcbiAgICAgICAgdGhpcy5teV9uYW1lLnN0cmluZyA9IFwiXCI7XG5cbiAgICAgICAgdGhpcy5zdGFyX2xhYmVsID0gVXRpbHMuY3JlYXRlTGFiZWwoMjQsIG5ldyBjYy5Db2xvcigweDY4LCAweDQ1LCAweDJhLCAweGZmKSwgbnVsbCwgNDAyLCA1NiwgXCJcIiwgdGhpcy5teV9yYW5rLCAwLCBjYy52MigwLCAwLjUpKTtcbiAgICAgICAgdGhpcy5zY29yZV9sYWJlbCA9IFV0aWxzLmNyZWF0ZUxhYmVsKDI0LCBuZXcgY2MuQ29sb3IoMHg2OCwgMHg0NSwgMHgyYSwgMHhmZiksIG51bGwsIDUyNSwgNTYsIFwiXCIsIHRoaXMubXlfcmFuaywgMCwgY2MudjIoMCwgMC41KSk7XG4gICAgICAgIHRoaXMubm9kZV9saXN0LnB1c2godGhpcy5zdGFyX2xhYmVsKTtcbiAgICAgICAgdGhpcy5ub2RlX2xpc3QucHVzaCh0aGlzLnNjb3JlX2xhYmVsKTtcblxuICAgICAgICB0aGlzLnRpdGxlX2NvbiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9wYW5lbCwgXCJ0aXRsZV9jb25cIik7XG4gICAgICAgIHZhciB0aXRsZSA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudGl0bGVfY29uLCBcInRpdGxlX2xhYmVsXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdmFyIG5hbWUgPSBSYW5rQ29uc3RhbnQuVGl0bGVOYW1lW3RoaXMuY2xpY2tfaW5kZXhdIHx8IFwiXCI7XG4gICAgICAgIHRpdGxlLnN0cmluZyA9IG5hbWU7XG5cbiAgICAgICAgdGhpcy50b3BfYmcgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fcGFuZWwsIFwidG9wX2JnXCIsIGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMudG9wX2JnLm5vZGUuc2V0U2NhbGUoMC45LCAwLjkpO1xuXG4gICAgICAgIHZhciByZXNfaWQgPSBQYXRoVG9vbC5nZXRCaWdCZyhcInJhbmtfMVwiLCBudWxsLCBcInJhbmtcIik7XG4gICAgICAgIHRoaXMubG9hZFJlcyhyZXNfaWQsIGZ1bmN0aW9uIChzZl9vYmopIHtcbiAgICAgICAgICAgIHRoaXMudG9wX2JnLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICB9LmJpbmQodGhpcykpXG5cbiAgICAgICAgdGhpcy50b3BfY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQoXCJ0b3BfY29udGFpbmVyXCIpO1xuICAgICAgICB0aGlzLnRvcF9yYW5rX2xpc3QgPSB7fTsvL+mhtumDqOWJjTM7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IDM7IGkrKykge1xuICAgICAgICAgICAgdmFyIGxhYmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy50b3BfY29udGFpbmVyLCBcIm5hbWVfXCIgKyBpLCBjYy5MYWJlbCk7XG4gICAgICAgICAgICB2YXIgaW1nID0gdGhpcy5zZWVrQ2hpbGQodGhpcy50b3BfY29udGFpbmVyLCBcImd1YW5fXCIgKyBpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRvcF9yYW5rX2xpc3RbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9wX3JhbmtfbGlzdFtpXSA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMudG9wX3JhbmtfbGlzdFtpXS5sYWJlbCA9IGxhYmVsO1xuICAgICAgICAgICAgICAgIHRoaXMudG9wX3JhbmtfbGlzdFtpXS5pbWcgPSBpbWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGlzdF9zaXplID0gY2Muc2l6ZSg2MTAsIDUzMCk7XG4gICAgICAgIHZhciBzZXR0aW5nID0ge1xuICAgICAgICAgICAgaXRlbV9jbGFzczogUmFua0l0ZW0sICAgICAgLy8g5Y2V5YWD57G7XG4gICAgICAgICAgICBzdGFydF94OiA1LCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWOi1t+eCuVxuICAgICAgICAgICAgc3BhY2VfeDogMCwgICAgICAgICAgICAgICAgICAgIC8vIHjmlrnlkJHnmoTpl7TpmpRcbiAgICAgICAgICAgIHN0YXJ0X3k6IDAsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRZ6LW354K5XG4gICAgICAgICAgICBzcGFjZV95OiAwLCAgICAgICAgICAgICAgICAgICAvLyB55pa55ZCR55qE6Ze06ZqUXG4gICAgICAgICAgICBpdGVtX3dpZHRoOiA2MDAsICAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE5bC65a+4d2lkdGhcbiAgICAgICAgICAgIGl0ZW1faGVpZ2h0OiAxMjAsICAgICAgICAgICAgICAvLyDljZXlhYPnmoTlsLrlr7hoZWlnaHRcbiAgICAgICAgICAgIHJvdzogMCwgICAgICAgICAgICAgICAgICAgICAgICAvLyDooYzmlbDvvIzkvZznlKjkuo7msLTlubPmu5rliqjnsbvlnotcbiAgICAgICAgICAgIGNvbDogMSwgICAgICAgICAgICAgICAgICAgICAgICAvLyDliJfmlbDvvIzkvZznlKjkuo7lnoLnm7Tmu5rliqjnsbvlnotcbiAgICAgICAgICAgIG5lZWRfZHluYW1pYzogdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdF92aWV3ID0gbmV3IENvbW1vblNjcm9sbFZpZXcoKVxuICAgICAgICB0aGlzLmxpc3Rfdmlldy5jcmVhdGVTY3JvbGwodGhpcy5yYW5rX3BhbmVsLCBjYy52MigwLCAtMjgpLCBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsLCBTY3JvbGxWaWV3U3RhcnRQb3MudG9wLCBsaXN0X3NpemUsIHNldHRpbmcsIGNjLnYyKDAuNSwgMC41KSlcblxuICAgICAgICB0aGlzLnVwZGF0ZVRpdGxlKCk7XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOS6i+S7tuebkeWQrOeahOaOpeWPoyzkuI3pnIDopoHmiYvliqjosIPnlKgs5aaC5p6c5piv5L2/55SoZ2NvcmUuR2xvYmFsRXZlbnTnm5HlkKws5Y+v5Lul55u05o6l6LCD55SoYWRkR2xvYmFsRXZlbnRcbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuR3VpbGRXYXJSYW5rVmlldyhmYWxzZSk7XG4gICAgICAgIH0sIHRoaXMpXG4gICAgICAgIHRoaXMuY2xvc2VfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5HdWlsZFdhclJhbmtWaWV3KGZhbHNlKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWxkd2FyRXZlbnQuVXBkYXRlR3VpbGRXYXJSYW5rRGF0YUV2ZW50LCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVSYW5rTGlzdChkYXRhKTtcbiAgICAgICAgfSwgdGhpcylcbiAgICB9LFxuXG4gICAgLy/mm7TmlrDmoIfpophcbiAgICB1cGRhdGVUaXRsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGl0bGVfbGlzdCA9IFJhbmtDb25zdGFudC5SYW5rVGl0bGVbdGhpcy5jbGlja19pbmRleF0gfHwge307XG4gICAgICAgIHZhciBudW0gPSBPYmplY3Qua2V5cyh0aXRsZV9saXN0KS5sZW5ndGggfHwgMDtcbiAgICAgICAgdmFyIHBvc19saXN0ID0gUmFua0NvbnN0YW50LlRpdGxlUG9zW3RoaXMuY2xpY2tfaW5kZXhdIHx8IHt9O1xuICAgICAgICB2YXIgbGluZV9wb3NfbGlzdCA9IFJhbmtDb25zdGFudC5UaXRsZUxpbmVQb3NbdGhpcy5jbGlja19pbmRleF0gfHwge307XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IG51bTsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSAhPSBudW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUltYWdlKGxpbmVfcG9zX2xpc3RbaV0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgb2ZmeCA9IHBvc19saXN0W2ldIHx8IDA7XG4gICAgICAgICAgICB2YXIgbGFiZWwgPSBVdGlscy5jcmVhdGVMYWJlbCgyNCwgbmV3IGNjLkNvbG9yKDB4NjgsIDB4NDUsIDB4MmEsIDB4ZmYpLCBudWxsLCBvZmZ4IC0gMzM2LCAyMzAsIFwiXCIsIHRoaXMubWFpbl9wYW5lbCwgMCwgY2MudjIoMCwgMC41KSlcbiAgICAgICAgICAgIHZhciBzdHIgPSB0aXRsZV9saXN0W2ldIHx8IFwiXCI7XG4gICAgICAgICAgICBsYWJlbC5zdHJpbmcgPSBzdHI7XG4gICAgICAgICAgICB0aGlzLm5vZGVfbGlzdC5wdXNoKGxhYmVsKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjcmVhdGVJbWFnZTogZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgdmFyIGxpbmVfb2ZmeCA9IHggfHwgMDtcbiAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldENvbW1vbkljb21QYXRoKFwiY29tbW9uXzEwNjlcIik7XG4gICAgICAgIHZhciBsaW5lID0gVXRpbHMuY3JlYXRlSW1hZ2UodGhpcy5tYWluX3BhbmVsLCByZXMsIGxpbmVfb2ZmeCAtIDMzOCwgMjMwLCBjYy52MigwLCAwLjUpLCB0cnVlLCAxLCBmYWxzZSk7XG4gICAgICAgIHRoaXMubG9hZFJlcyhyZXMsIGZ1bmN0aW9uIChzZl9vYmopIHtcbiAgICAgICAgICAgIGxpbmUuc3ByaXRlRnJhbWUgPSBzZl9vYmo7XG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgbGluZS5ub2RlLnNldFNjYWxlKDEsIDAuOCk7XG4gICAgICAgIHRoaXMubm9kZV9saXN0LnB1c2gobGluZSk7XG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjizmt7vliqDliLDlr7nlupTkuLvoioLngrnkuYvlkI7nmoTlm57osIMs5Lmf5bCx5piv5LiA5Liq56qX5L2T55qE5q2j5byP5YWl5Y+jLOWPr+S7peiuvue9ruS4gOS6m+aVsOaNruS6hlxuICAgIG9wZW5Sb290V25kOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuY3RybC5yZXF1ZXN0R3VpbGRXYXJSYW5rRGF0YSgpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVSYW5rTGlzdDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5yYW5rX2RhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLnVwZGF0ZU15RGF0YSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJhbmtEYXRhKCk7XG4gICAgICAgIGlmICh0aGlzLnJhbmtfZGF0YS5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5zaG93RW1wdHlJY29uKHRydWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dFbXB0eUljb24oZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdF92aWV3LnNldERhdGEodGhpcy5yYW5rX2RhdGEsIG51bGwsIHsgcmFua190eXBlOiBSYW5rQ29uc3RhbnQuUmFua1R5cGUuZ3VpbGRfd2FyIH0pXG4gICAgfSxcblxuICAgIGdldE15c2VsZlJhbmtEYXRhOiBmdW5jdGlvbiAocmlkLCBzcnZfaWQpIHtcbiAgICAgICAgdmFyIG15c2VsZl9kYXRhID0ge307XG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5yYW5rX2RhdGEpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5yYW5rX2RhdGFba107XG4gICAgICAgICAgICBpZiAoZGF0YS5yaWQgPT0gcmlkICYmIGRhdGEuc3J2X2lkID09IHNydl9pZCkge1xuICAgICAgICAgICAgICAgIG15c2VsZl9kYXRhID0gZGF0YTtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteXNlbGZfZGF0YVxuICAgIH0sXG5cbiAgICB1cGRhdGVNeURhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJhbmtfZGF0YSkgcmV0dXJuXG5cbiAgICAgICAgdmFyIHJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICB2YXIgbXlzZWxmX2RhdGEgPSB0aGlzLmdldE15c2VsZlJhbmtEYXRhKHJvbGVfdm8ucmlkLCByb2xlX3ZvLnNydl9pZCk7XG5cbiAgICAgICAgdmFyIHN0ciA9IFwiMFwiO1xuICAgICAgICB2YXIgbXlfaWR4ID0gbXlzZWxmX2RhdGEucmFuayB8fCAwO1xuICAgICAgICBpZiAobXlfaWR4ICYmIG15X2lkeCA+IDApIHtcbiAgICAgICAgICAgIHN0ciA9IG15X2lkeFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ub19yYW5rLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmFua19pbmRleC5zdHJpbmcgPSBzdHI7XG5cbiAgICAgICAgaWYgKG15X2lkeCAmJiBteV9pZHggPj0gMSAmJiBteV9pZHggPD0gMykge1xuICAgICAgICAgICAgdGhpcy5yYW5rX2luZGV4Lm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXRoaXMubXlfcmFua19pY29uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5teV9yYW5rX2ljb24gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm15X3JhbmssIFwibXlfcmFua19pY29uXCIsIGNjLlNwcml0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm15X3JhbmtfaWNvbi5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0VUlJY29uUGF0aCgnY29tbW9uJywgJ2NvbW1vbl8zMDAnICsgbXlfaWR4KSwgZnVuY3Rpb24gKHNwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5teV9yYW5rX2ljb24uc3ByaXRlRnJhbWUgPSBzcDtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIHRoaXMubXlfcmFua19pY29uLm5vZGUuc2NhbGUgPSAwLjc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobXlfaWR4IDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vX3Jhbmsubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucmFua19pbmRleC5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmtfaW5kZXgubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm15X3JhbmtfaWNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm15X3JhbmtfaWNvbi5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm15X2hlYWQuc2V0SGVhZFJlcyhyb2xlX3ZvLmZhY2VfaWQpO1xuXG4gICAgICAgIHRoaXMuc3Rhcl9sYWJlbC5zdHJpbmcgPSBteXNlbGZfZGF0YS5zdGFyIHx8IFwiXCI7XG4gICAgICAgIHRoaXMubXlfbmFtZS5zdHJpbmcgPSBteXNlbGZfZGF0YS5uYW1lIHx8IFwiXCI7XG4gICAgICAgIHRoaXMuc2NvcmVfbGFiZWwuc3RyaW5nID0gbXlzZWxmX2RhdGEud2FyX3Njb3JlIHx8IFwiXCI7XG4gICAgfSxcblxuICAgIHVwZGF0ZVJhbmtEYXRhOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5yYW5rX2RhdGEpIHJldHVyblxuICAgICAgICB2YXIgcmFua19saXN0ID0gdGhpcy5yYW5rX2RhdGEgfHwge307XG4gICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgIHZhciBzaXplID0gdGhpcy5tYWluX3BhbmVsLmdldENvbnRlbnRTaXplKCk7XG4gICAgICAgIGZvciAodmFyIGkgaW4gcmFua19saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IHJhbmtfbGlzdFtpXTtcbiAgICAgICAgICAgIHZhciBpZHggPSB2LmlkeCB8fCB2LnJhbms7XG4gICAgICAgICAgICBpZiAoaWR4ID4gMCAmJiBpZHggPD0gMykge1xuICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5maXJzdF9saXN0W2lkeF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBuZXcgUGxheWVySGVhZCgpO1xuICAgICAgICAgICAgICAgICAgICBoZWFkLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IDM3MztcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9mZl95ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC0gMTcwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMzYwO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3kgPSA2O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlkeCA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDE3MDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDM2MDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZl95ID0gNjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBoZWFkLnNldFBvc2l0aW9uKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBoZWFkLnNldFBhcmVudCh0aGlzLm1haW5fcGFuZWwpO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy50b3BfcmFua19saXN0W2NvdW50XS5sYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgbmFtZS5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IHRoaXMudG9wX3JhbmtfbGlzdFtjb3VudF0uaW1nO1xuICAgICAgICAgICAgICAgICAgICB0aXRsZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0X2xpc3RbaWR4XSA9IHRpdGxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0X2xpc3RbaWR4XSA9IGhlYWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RfbGlzdFtpZHhdLmhlYWRfbmFtZSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGZhY2VfaWQgPSB2LmZhY2VfaWQgfHwgdi5mYWNlIHx8IHYubGVhZGVyX2ZhY2UgfHwgMDtcbiAgICAgICAgICAgICAgICB2YXIgYXZhdGFyX2JpZCA9IHYuYXZhdGFyX2JpZCB8fCB2LmxlYWRlcl9hdmF0YXJfYmlkIHx8IDA7XG4gICAgICAgICAgICAgICAgLy8gdmFyIHZvID0gZ2RhdGEoXCJhdmF0YXJfZGF0YVwiLCBcImRhdGFfYXZhdGFyXCIsIFthdmF0YXJfYmlkXSk7XG4gICAgICAgICAgICAgICAgLy8gaWYgKHZvKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHZhciByZXNfaWQgPSB2by5yZXNfaWQgfHwgMTtcbiAgICAgICAgICAgICAgICAvLyAgICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdF9saXN0W2lkeF0uc2V0SGVhZFJlcyhmYWNlX2lkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0X2xpc3RbaWR4XS5hZGRDYWxsQmFjayhmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcm9sZVZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZCA9IHYucmlkIHx8IHYubGVhZGVyX3JpZCB8fCAwO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3J2X2lkID0gdi5zcnZfaWQgfHwgdi5sZWFkZXJfc3J2aWQgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVWby5yaWQgPT0gcmlkICYmIHJvbGVWby5zcnZfaWQgPT0gc3J2X2lkKSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHZvID0geyByaWQ6IHJpZCwgc3J2X2lkOiBzcnZfaWQgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShcImNoYXRfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5GcmllbmRJbmZvKHZvKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgdikpXG5cbiAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IHYubmFtZSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RfbGlzdFtpZHhdLmhlYWRfbmFtZS5zdHJpbmcgPSBuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvdW50ID49IDMpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5ub19sYWJlbF9saXN0KSB7XG4gICAgICAgICAgICB0aGlzLm5vX2xhYmVsX2xpc3QgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5ub19sYWJlbF9saXN0KSB7XG4gICAgICAgICAgICB0aGlzLm5vX2xhYmVsX2xpc3RbaV0uc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvc19saXN0ID0geyBbMV06IDMzNiAtIHNpemUud2lkdGggLyAyLCBbMl06IDE2NyAtIHNpemUud2lkdGggLyAyLCBbM106IDUwOCAtIHNpemUud2lkdGggLyAyIH07XG4gICAgICAgIGlmIChyYW5rX2xpc3QubGVuZ3RoIDwgMykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHJhbmtfbGlzdC5sZW5ndGggKyAxOyBpIDw9IDM7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub19sYWJlbF9saXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IFV0aWxzLmNyZWF0ZUxhYmVsKDI0LCBudWxsLCBudWxsLCBwb3NfbGlzdFtpXSwgMzYwLCBVdGlscy5USTE4TihcIuiZmuS9jeS7peW+hVwiKSwgdGhpcy5tYWluX3BhbmVsLCAwLCBjYy52MigwLjUsIDAuNSkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9fbGFiZWxfbGlzdFtpXSA9IGxhYmVsLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZV9saXN0LnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50b3BfcmFua19saXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcF9yYW5rX2xpc3RbaV0ubGFiZWwubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9wX3JhbmtfbGlzdFtpXS5pbWcuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5ub19sYWJlbF9saXN0W2ldLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/mmL7npLrnqbrnmb1cbiAgICBzaG93RW1wdHlJY29uOiBmdW5jdGlvbiAoYm9vbCkge1xuICAgICAgICBpZiAoIXRoaXMuZW1wdHlfY29uICYmIGJvb2wgPT0gZmFsc2UpIHJldHVyblxuICAgICAgICBpZiAoIXRoaXMuZW1wdHlfY29uKSB7XG4gICAgICAgICAgICB2YXIgc2l6ZSA9IGNjLnNpemUoMjAwLCAyMDApO1xuICAgICAgICAgICAgdGhpcy5lbXB0eV9jb24gPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgdGhpcy5lbXB0eV9jb24uc2V0Q29udGVudFNpemUoc2l6ZSk7XG4gICAgICAgICAgICB0aGlzLmVtcHR5X2Nvbi5zZXRBbmNob3JQb2ludChjYy52MigwLjUsIDAuNSkpO1xuICAgICAgICAgICAgdGhpcy5lbXB0eV9jb24uc2V0UG9zaXRpb24oY2MudjIoMCwgMCkpO1xuICAgICAgICAgICAgdGhpcy5tYWluX3BhbmVsLmFkZENoaWxkKHRoaXMuZW1wdHlfY29uKTtcbiAgICAgICAgICAgIHZhciByZXMgPSBQYXRoVG9vbC5nZXRCaWdCZyhcImJpZ2JnXzNcIik7XG4gICAgICAgICAgICB0aGlzLmVtcHR5X2JnID0gVXRpbHMuY3JlYXRlSW1hZ2UodGhpcy5lbXB0eV9jb24sIG51bGwsIDAsIDAsIGNjLnYyKDAuNSwgMC41KSwgZmFsc2UpXG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAoc2Zfb2JqKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbXB0eV9iZy5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIHRoaXMuZW1wdHlfbGFiZWwgPSBVdGlscy5jcmVhdGVMYWJlbCgyNiwgbmV3IGNjLkNvbG9yKDB4NjgsIDB4NDUsIDB4MmEsIDB4ZmYpLCBudWxsLCAwLCAtMTAwLCBcIlwiLCB0aGlzLmVtcHR5X2NvbiwgMCwgY2MudjIoMC41LCAwLjUpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gVXRpbHMuVEkxOE4oXCLlvZPliY3mjpLooYzmppzmmoLml6DmlbDmja5cIik7XG4gICAgICAgIHRoaXMuZW1wdHlfbGFiZWwuc3RyaW5nID0gc3RyO1xuICAgICAgICB0aGlzLmVtcHR5X2Nvbi5hY3RpdmUgPSBib29sO1xuICAgIH0sXG5cbiAgICAvLyDlhbPpl63nqpfkvZPlm57osIMs6ZyA6KaB5Zyo6L+Z6YeM6LCD55So6K+l56qX5L2T5omA5bGeY29udHJvbGxlcueahGNsb3Nl5pa55rOV5rKh55So5LqO572u56m66K+l56qX5L2T5a6e5L6L5a+56LGhXG4gICAgY2xvc2VDYWxsQmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5ub2RlX2xpc3QpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5ub2RlX2xpc3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMubm9kZV9saXN0W2ldO1xuICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgY2MuTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB2LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdi5ub2RlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ub2RlX2xpc3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVtcHR5X2Nvbikge1xuICAgICAgICAgICAgdGhpcy5lbXB0eV9jb24uZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5lbXB0eV9sYWJlbC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmVtcHR5X2JnLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuZW1wdHlfY29uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZW1wdHlfYmcgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5lbXB0eV9sYWJlbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubXlfaGVhZCkge1xuICAgICAgICAgICAgdGhpcy5teV9oZWFkLmRlbGV0ZU1lKCk7XG4gICAgICAgICAgICB0aGlzLm15X2hlYWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3RybC5vcGVuR3VpbGRXYXJSYW5rVmlldyhmYWxzZSk7XG4gICAgfSxcbn0pIl19
|