difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
 
                (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