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
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/hero/artifact/artifact_recast_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, '453bevXkS9JU5e46XxoT9+j', 'artifact_recast_window');
// Scripts/mod/hero/artifact/artifact_recast_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-04-10 11:06:33
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var HeroController = require("hero_controller");
 
var HeroEvent = require("hero_event");
 
var BackpackController = require("backpack_controller");
 
var PartnerCalculate = require("partner_calculate");
 
var SkillItem = require("skill_item");
 
var PartnerConst = require("partner_const");
 
var Artifact_recastWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("hero", "artifact_recast_panel");
    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.ctrl = HeroController.getInstance();
    this.model = this.ctrl.getModel();
    this.is_can_save = false;
    this.need_list = {};
    this.base_list_left = {};
    this.base_list_right = {};
    this.skill_list_left = {};
    this.skill_list_right = {};
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    this.background = this.seekChild("background");
    this.main_container = this.seekChild("main_container");
    var container = this.seekChild(this.main_container, "container");
    this.left_bg_nd = this.seekChild(container, "Image_7");
    this.right_bg_nd = this.seekChild(container, "Image_9");
    this.name_lb = this.seekChild(container, "name_txt", cc.Label);
    this.pos_item = this.seekChild("pos_item");
    var cost_icon_1_sp = this.seekChild(container, "cost_icon_1", cc.Sprite);
    var cost_icon_2_sp = this.seekChild(container, "cost_icon_2", cc.Sprite);
    this.cost_icon = [cost_icon_1_sp, cost_icon_2_sp];
    var cost_txt_1_lb = this.seekChild(container, "cost_txt_1", cc.Label);
    var cost_txt_2_lb = this.seekChild(container, "cost_txt_2", cc.Label);
    cost_txt_1_lb.string = "";
    cost_txt_2_lb.string = "";
    this.cost_txt = [cost_txt_1_lb, cost_txt_2_lb];
    this.close_btn = this.seekChild("close_btn");
    this.save_btn = this.seekChild("save_btn");
    this.reset_btn = this.seekChild("reset_btn");
    this.cancel_btn = this.seekChild("cancel_btn");
    this.explain_btn = this.seekChild("explain_btn");
    this.item_node = ItemsPool.getInstance().getItem("backpack_item");
    this.item_node.initConfig(false, 1, false, false);
    this.item_node.show();
    this.item_node.setParent(this.pos_item);
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    Utils.onTouchEnd(this.close_btn, function () {
      this.ctrl.openArtifactRecastWindow(false);
    }.bind(this), 2); //重铸
 
    Utils.onTouchEnd(this.reset_btn, function () {
      if (this.data && this.data.id) {
        this.ctrl.sender11033(this.partner_id, this.data.id, {});
      }
    }.bind(this), 1); //保存重铸
 
    Utils.onTouchEnd(this.save_btn, function () {
      if (this.data && this.data.id) {
        this.ctrl.sender11034(this.partner_id, this.data.id, 1);
      }
    }.bind(this), 1); //取消重铸(改为继续重铸)
 
    Utils.onTouchEnd(this.cancel_btn, function () {
      if (this.data && this.data.id) {
        this.ctrl.sender11033(this.partner_id, this.data.id, {});
      }
    }.bind(this), 1);
    this.explain_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
      Utils.playButtonSound(1);
      var pos = event.touch.getLocation();
      var desc = StringUtil.parse(Config.partner_artifact_data.data_artifact_const.recast_rule.desc);
 
      require("tips_controller").getInstance().showCommonTips(desc, pos);
    });
    this.addGlobalEvent(HeroEvent.Artifact_Recast_Event, function () {
      if (!this.data || this.data.id == 0) return;
 
      if (this.partner_id && this.partner_id != 0) {
        var artifact_list = this.model.getPartnerArtifactList(this.partner_id);
 
        for (var k in artifact_list) {
          var vo = artifact_list[k];
 
          if (vo.id == this.data.id) {
            this.setData(vo, this.partner_id);
            break;
          }
        }
      } else {
        var item_data = BackpackController.getInstance().getModel().getBackPackItemById(this.data.id);
        this.setData(item_data, this.partner_id);
      }
    }, this);
    this.addGlobalEvent(HeroEvent.Artifact_Save_Event, function () {
      if (!this.data || this.data.id == 0) return;
 
      if (this.partner_id && this.partner_id != 0) {
        var artifact_list = this.model.getPartnerArtifactList(this.partner_id);
 
        for (var k in artifact_list) {
          var vo = artifact_list[k];
 
          if (vo.id == this.data.id) {
            this.setData(vo, this.partner_id);
            break;
          }
        }
      } else {
        var item_data = BackpackController.getInstance().getModel().getBackPackItemById(this.data.id);
        this.setData(item_data, this.partner_id);
      }
    }, this);
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(params) {
    this.setData(params.data, params.partner_id);
  },
  setData: function setData(data, partner_id) {
    this.data = data || {};
    this.item_config = data.config;
    this.partner_id = partner_id || 0;
    this.item_node.setData(data);
    this.name_lb.string = this.item_config.name; //判断是否已经重铸但未保存
 
    this.is_can_save = false;
 
    if (this.data.extra_attr && Utils.next(this.data.extra_attr) != null) {
      this.is_can_save = true;
    }
 
    this.setBaseAttrInfo();
    this.setSkillInfo();
    this.updateBtnShow();
    this.updateCostInfo();
  },
  //基础属性
  setBaseAttrInfo: function setBaseAttrInfo() {
    var _this = this;
 
    if (!this.data || !this.data.attr || !this.item_config) return;
    var attr_num = 2;
    var artifact_config = Config.partner_artifact_data.data_artifact_data[this.item_config.id];
 
    if (artifact_config) {
      attr_num = artifact_config.attr_num;
    }
 
    for (var i in this.data.attr) {
      if (i > attr_num) break;
      var v = this.data.attr[i];
      var attr_id = v.attr_id;
      var attr_key = Config.attr_data.data_id_to_key[attr_id];
      var attr_val = v.attr_val / 1000;
      var attr_name = Config.attr_data.data_key_to_name[attr_key];
 
      if (attr_name != null) {
        var icon;
        var is_per;
        var attr_str;
 
        (function () {
          if (!_this.base_list_left[i]) {
            _this.base_list_left[i] = Utils.createRichLabel(24, new cc.Color(0x68, 0x45, 0x2a, 0xff), cc.v2(0, 0.5), cc.v2(60 - 151, 28), 30, 380, _this.left_bg_nd);
            _this.base_list_left[i].horizontalAlign = cc.macro.TextAlignment.LEFT;
          }
 
          var label = _this.base_list_left[i];
          label.node.y = -70 - i * 35;
          icon = PathTool.getAttrIconByStr(attr_key);
          is_per = PartnerCalculate.isShowPerByStr(attr_key);
 
          if (is_per == true) {
            attr_val = attr_val / 10 + "%";
          }
 
          attr_str = cc.js.formatStr("<img src='%s' /> <color=#68452a> %s:</c><color=#68452a>%s</c>", icon, attr_name, attr_val);
          label.string = attr_str;
 
          _this.loadRes(PathTool.getUIIconPath("common", icon), function (resObject) {
            label.addSpriteFrame(resObject);
          }.bind(_this));
        })();
      }
    }
 
    if (this.is_can_save) {
      //重铸过,未保存
      for (var i in this.data.extra_attr) {
        var v = this.data.extra_attr[i];
        var attr_id = v.attr_id;
        var attr_key = Config.attr_data.data_id_to_key[attr_id];
        var attr_val = v.attr_val / 1000;
        var attr_name = Config.attr_data.data_key_to_name[attr_key];
 
        if (attr_name != null) {
          var icon;
          var is_per;
          var attr_str;
 
          (function () {
            if (!_this.base_list_right[i]) {
              _this.base_list_right[i] = Utils.createRichLabel(24, new cc.Color(0x68, 0x45, 0x2a, 0xff), cc.v2(0, 0.5), cc.v2(60 - 151, 28), 30, 380, _this.right_bg_nd);
              _this.base_list_right[i].horizontalAlign = cc.macro.TextAlignment.LEFT;
            }
 
            var label = _this.base_list_right[i];
            label.node.x = -91;
            label.node.y = -70 - i * 35;
            icon = PathTool.getAttrIconByStr(attr_key);
            is_per = PartnerCalculate.isShowPerByStr(attr_key);
 
            if (is_per == true) {
              attr_val = attr_val / 10 + "%";
            }
 
            attr_str = cc.js.formatStr("<img src='%s' /> <color=#68452a> %s:</c><color=#68452a>%s</c>", icon, attr_name, attr_val);
            label.string = attr_str;
 
            _this.loadRes(PathTool.getUIIconPath("common", icon), function (resObject) {
              label.addSpriteFrame(resObject);
            }.bind(_this));
          })();
        }
      }
    } else {
      for (var i in this.data.attr) {
        if (i > attr_name) break;
        var v = this.data.attr[i];
 
        if (!this.base_list_right[i]) {
          this.base_list_right[i] = Utils.createRichLabel(24, new cc.Color(0x68, 0x45, 0x2a, 0xff), cc.v2(0, 0.5), cc.v2(120 - 303, 28), 30, 380, this.right_bg_nd);
          this.base_list_right[i].horizontalAlign = cc.macro.TextAlignment.LEFT;
        }
 
        var label = this.base_list_right[i];
        label.node.x = -51;
        label.node.y = -70 - i * 35;
        label.string = Utils.TI18N("随机属性");
      }
    }
  },
  //神器技能
  setSkillInfo: function setSkillInfo() {
    if (this.data == null || this.data.extra == null) return;
    var skill_num = 0;
    var artifact_config = Config.partner_artifact_data.data_artifact_data[this.item_config.id];
 
    if (artifact_config) {
      skill_num = artifact_config.skill_num;
    }
 
    var index = 1;
    var cur_skills = [];
    this.data.extra.sort(Utils.tableLowerSorter(["extra_k"]));
 
    for (var k in this.skill_list_left) {
      this.setSkillItemVisible(false, this.skill_list_left[k]);
    }
 
    for (var i in this.data.extra) {
      var value = this.data.extra[i];
 
      if (value && value.extra_k && value.extra_k == 1 || value.extra_k == 2 || value.extra_k == 8) {
        if (cur_skills.length <= skill_num) {
          cur_skills.push(value.extra_v);
          var config = gdata("skill_data", "data_get_skill", [value.extra_v]);
 
          if (config) {
            if (!this.skill_list_left[index]) {
              var item = this.createSkillItem(this.left_bg_nd, index);
              this.skill_list_left[index] = item;
            }
 
            var _skill_item = this.skill_list_left[index];
            this.setSkillItemVisible(true, _skill_item);
 
            _skill_item.skill.setData(config.bid);
 
            _skill_item.name.string = config.name;
            _skill_item.desc.string = config.des;
            _skill_item.random_icon.node.active = false;
            _skill_item.random_des.node.active = false;
            var name_color = PartnerConst.SkillColor[config.level];
            name_color = name_color || new cc.Color(0x68, 0x45, 0x2a, 0xff);
            _skill_item.name.node.color = name_color;
            index = index + 1;
          }
        }
      }
    }
 
    this.cur_skills = cur_skills; //右侧
 
    var recast_skills = [];
 
    for (var i in this.data.extra) {
      var value = this.data.extra[i];
 
      if (value && value.extra_k != null && value.extra_k == 3 || value.extra_k == 4 || value.extra_k == 9) {
        recast_skills.push(value.extra_v);
      }
    }
 
    this.recast_skills = recast_skills;
    var right_skill_num = skill_num; //当没有重置技能则显示为最大数量的问号,有则显示为技能数量
 
    if (Utils.next(recast_skills) != null) {
      right_skill_num = recast_skills.length;
    }
 
    if (right_skill_num > skill_num) {
      right_skill_num = skill_num;
    }
 
    for (var k in this.skill_list_right) {
      this.setSkillItemVisible(false, this.skill_list_right[k]);
    }
 
    for (var i = 0; i < right_skill_num; i++) {
      if (!this.skill_list_right[i]) {
        var item = this.createSkillItem(this.right_bg_nd, i + 1);
        this.skill_list_right[i] = item;
      }
 
      var skill_id = recast_skills[i];
      var skill_item = this.skill_list_right[i];
      this.setSkillItemVisible(true, skill_item);
      skill_item.name.node.active = true;
      skill_item.desc.node.active = true;
      skill_item.random_icon.node.active = false;
      skill_item.random_des.node.active = false;
      var config = gdata("skill_data", "data_get_skill", [skill_id]);
 
      if (config) {
        skill_item.skill.setData(config.bid);
        skill_item.name.string = config.name;
        skill_item.desc.string = config.des;
        var name_color = PartnerConst.SkillColor[config.level];
        name_color = name_color || new cc.Color(0x68, 0x45, 0x2a, 0xff);
        skill_item.name.node.color = name_color;
      } else {
        skill_item.skill.setData();
        skill_item.name.node.active = false;
        skill_item.desc.node.active = false;
        skill_item.random_icon.node.active = true;
        skill_item.random_des.node.active = true;
      }
    }
  },
  //创建一个技能item
  createSkillItem: function createSkillItem(parent, index) {
    var item = {};
    var skill = new SkillItem();
    skill.setLeveStatus(false);
    skill.setScale(0.8);
    skill.setParent(parent);
    var pos_y = 207 - 444 - (index - 1) * 130;
    skill.setPosition(cc.v2(60 - 151, pos_y));
    var name = Utils.createLabel(22, new cc.Color(0xfe, 0xee, 0xba, 0xff), null, 130 - 167, pos_y + 15, "", parent, 1, cc.v2(0, 0));
    var desc = Utils.createRichLabel(20, new cc.Color(0x68, 0x45, 0x2a, 0xff), cc.v2(0, 1), cc.v2(130 - 167, pos_y + 20), 26, 180, parent);
    desc.horizontalAlign = cc.macro.TextAlignment.LEFT;
    var icon_res = PathTool.getUIIconPath("artifact", "artifact_1003");
    var random_icon = Utils.createImage(parent, null, 75 - 167, pos_y, cc.v2(0.5, 0.5), null, 2);
    this.loadRes(icon_res, function (sp) {
      random_icon.spriteFrame = sp;
    }.bind(this));
    var random_des = Utils.createLabel(24, new cc.Color(0x68, 0x45, 0x2a, 0xff), null, 130 - 167, pos_y, Utils.TI18N("随机技能"), parent, 1, cc.v2(0, 0.5));
    item.skill = skill;
    item.name = name;
    item.desc = desc;
    item.random_icon = random_icon;
    item.random_des = random_des;
    return item;
  },
  setSkillItemVisible: function setSkillItemVisible(status, item) {
    if (item == null) return;
    item.skill.setVisible(status);
    item.desc.node.active = status;
    item.name.node.active = status;
    item.random_icon.node.active = status;
    item.random_des.node.active = status;
  },
  updateBtnShow: function updateBtnShow() {
    this.reset_btn.active = !this.is_can_save;
    this.save_btn.active = this.is_can_save;
    this.cancel_btn.active = this.is_can_save;
  },
  updateCostInfo: function updateCostInfo() {
    var _this2 = this;
 
    if (!this.data || !this.data.attr || !this.item_config) return;
    var artifact_config = Config.partner_artifact_data.data_artifact_data[this.item_config.id];
 
    if (artifact_config && artifact_config.ref_expend) {
      var _loop = function _loop() {
        var cost_icon = _this2.cost_icon[i];
        var cost_txt = _this2.cost_txt[i];
        var cost_data = artifact_config.ref_expend[i];
 
        if (cost_data) {
          bid = cost_data[0];
          num = cost_data[1];
          item_config = Utils.getItemConfig(bid);
 
          if (item_config) {
            _this2.loadRes(PathTool.getItemRes(bid), function (sp) {
              cost_icon.spriteFrame = sp;
            }.bind(_this2));
 
            have_num = BackpackController.getInstance().getModel().getItemNumByBid(bid);
            cost_txt.string = Utils.getMoneyString(have_num) + "/" + Utils.getMoneyString(num);
 
            if (have_num >= num) {
              cost_txt.node.color = new cc.Color(0xff, 0xf6, 0xe4, 0xff);
            } else {
              cost_txt.node.color = new cc.Color(0xc8, 0x14, 0x14, 0xff);
            }
          }
        } else {
          cost_data.string = "";
        }
      };
 
      for (var i = 0; i < 2; i++) {
        var bid;
        var num;
        var item_config;
        var have_num;
 
        _loop();
      }
    }
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    if (this.item_node) {
      this.item_node.deleteMe();
      this.item_node = null;
    }
 
    if (this.skill_list_left) {
      for (var k in this.skill_list_left) {
        var v = this.skill_list_left[k];
 
        if (v) {
          v.skill.deleteMe();
          v.skill = null;
          v.desc.node.destroy();
          v.desc = null;
          v.name.node.destroy();
          v.name = null;
          v.random_des.node.destroy();
          v.random_des = null;
          v.random_icon.node.destroy();
          v.random_icon = null;
          v = null;
        }
      }
 
      this.skill_list_left = null;
    }
 
    if (this.skill_list_right) {
      for (var k in this.skill_list_right) {
        var v = this.skill_list_right[k];
 
        if (v) {
          v.skill.deleteMe();
          v.skill = null;
          v.desc.node.destroy();
          v.desc = null;
          v.name.node.destroy();
          v.name = null;
          v.random_des.node.destroy();
          v.random_des = null;
          v.random_icon.node.destroy();
          v.random_icon = null;
          v = null;
        }
      }
 
      this.skill_list_right = null;
    }
 
    if (this.base_list_left) {
      for (var k in this.base_list_left) {
        var v = this.base_list_left[k];
 
        if (v) {
          v.node.destroy();
          v = null;
        }
      }
 
      this.base_list_left = null;
    }
 
    if (this.base_list_right) {
      for (var k in this.base_list_right) {
        var v = this.base_list_right[k];
 
        if (v) {
          v.node.destroy();
          v = null;
        }
      }
 
      this.base_list_right = null;
    }
 
    this.ctrl.openArtifactRecastWindow(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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvXFxhcnRpZmFjdFxcYXJ0aWZhY3RfcmVjYXN0X3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJIZXJvQ29udHJvbGxlciIsIkhlcm9FdmVudCIsIkJhY2twYWNrQ29udHJvbGxlciIsIlBhcnRuZXJDYWxjdWxhdGUiLCJTa2lsbEl0ZW0iLCJQYXJ0bmVyQ29uc3QiLCJBcnRpZmFjdF9yZWNhc3RXaW5kb3ciLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwiZGlhbG9ndWUiLCJ3aW5fdHlwZSIsIldpblR5cGUiLCJCaWciLCJpbml0Q29uZmlnIiwiY3RybCIsImdldEluc3RhbmNlIiwibW9kZWwiLCJnZXRNb2RlbCIsImlzX2Nhbl9zYXZlIiwibmVlZF9saXN0IiwiYmFzZV9saXN0X2xlZnQiLCJiYXNlX2xpc3RfcmlnaHQiLCJza2lsbF9saXN0X2xlZnQiLCJza2lsbF9saXN0X3JpZ2h0Iiwib3BlbkNhbGxCYWNrIiwiYmFja2dyb3VuZCIsInNlZWtDaGlsZCIsIm1haW5fY29udGFpbmVyIiwiY29udGFpbmVyIiwibGVmdF9iZ19uZCIsInJpZ2h0X2JnX25kIiwibmFtZV9sYiIsIkxhYmVsIiwicG9zX2l0ZW0iLCJjb3N0X2ljb25fMV9zcCIsIlNwcml0ZSIsImNvc3RfaWNvbl8yX3NwIiwiY29zdF9pY29uIiwiY29zdF90eHRfMV9sYiIsImNvc3RfdHh0XzJfbGIiLCJzdHJpbmciLCJjb3N0X3R4dCIsImNsb3NlX2J0biIsInNhdmVfYnRuIiwicmVzZXRfYnRuIiwiY2FuY2VsX2J0biIsImV4cGxhaW5fYnRuIiwiaXRlbV9ub2RlIiwiSXRlbXNQb29sIiwiZ2V0SXRlbSIsInNob3ciLCJzZXRQYXJlbnQiLCJyZWdpc3RlckV2ZW50IiwiVXRpbHMiLCJvblRvdWNoRW5kIiwib3BlbkFydGlmYWN0UmVjYXN0V2luZG93IiwiYmluZCIsImRhdGEiLCJpZCIsInNlbmRlcjExMDMzIiwicGFydG5lcl9pZCIsInNlbmRlcjExMDM0Iiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZXZlbnQiLCJwbGF5QnV0dG9uU291bmQiLCJwb3MiLCJ0b3VjaCIsImdldExvY2F0aW9uIiwiZGVzYyIsIlN0cmluZ1V0aWwiLCJwYXJzZSIsIkNvbmZpZyIsInBhcnRuZXJfYXJ0aWZhY3RfZGF0YSIsImRhdGFfYXJ0aWZhY3RfY29uc3QiLCJyZWNhc3RfcnVsZSIsInNob3dDb21tb25UaXBzIiwiYWRkR2xvYmFsRXZlbnQiLCJBcnRpZmFjdF9SZWNhc3RfRXZlbnQiLCJhcnRpZmFjdF9saXN0IiwiZ2V0UGFydG5lckFydGlmYWN0TGlzdCIsImsiLCJ2byIsInNldERhdGEiLCJpdGVtX2RhdGEiLCJnZXRCYWNrUGFja0l0ZW1CeUlkIiwiQXJ0aWZhY3RfU2F2ZV9FdmVudCIsIm9wZW5Sb290V25kIiwicGFyYW1zIiwiaXRlbV9jb25maWciLCJjb25maWciLCJuYW1lIiwiZXh0cmFfYXR0ciIsIm5leHQiLCJzZXRCYXNlQXR0ckluZm8iLCJzZXRTa2lsbEluZm8iLCJ1cGRhdGVCdG5TaG93IiwidXBkYXRlQ29zdEluZm8iLCJhdHRyIiwiYXR0cl9udW0iLCJhcnRpZmFjdF9jb25maWciLCJkYXRhX2FydGlmYWN0X2RhdGEiLCJpIiwidiIsImF0dHJfaWQiLCJhdHRyX2tleSIsImF0dHJfZGF0YSIsImRhdGFfaWRfdG9fa2V5IiwiYXR0cl92YWwiLCJhdHRyX25hbWUiLCJkYXRhX2tleV90b19uYW1lIiwiaWNvbiIsImlzX3BlciIsImF0dHJfc3RyIiwiY3JlYXRlUmljaExhYmVsIiwiQ29sb3IiLCJ2MiIsImhvcml6b250YWxBbGlnbiIsIm1hY3JvIiwiVGV4dEFsaWdubWVudCIsIkxFRlQiLCJsYWJlbCIsIm5vZGUiLCJ5IiwiZ2V0QXR0ckljb25CeVN0ciIsImlzU2hvd1BlckJ5U3RyIiwianMiLCJmb3JtYXRTdHIiLCJsb2FkUmVzIiwiZ2V0VUlJY29uUGF0aCIsInJlc09iamVjdCIsImFkZFNwcml0ZUZyYW1lIiwieCIsIlRJMThOIiwiZXh0cmEiLCJza2lsbF9udW0iLCJpbmRleCIsImN1cl9za2lsbHMiLCJzb3J0IiwidGFibGVMb3dlclNvcnRlciIsInNldFNraWxsSXRlbVZpc2libGUiLCJ2YWx1ZSIsImV4dHJhX2siLCJsZW5ndGgiLCJwdXNoIiwiZXh0cmFfdiIsImdkYXRhIiwiaXRlbSIsImNyZWF0ZVNraWxsSXRlbSIsInNraWxsX2l0ZW0iLCJza2lsbCIsImJpZCIsImRlcyIsInJhbmRvbV9pY29uIiwiYWN0aXZlIiwicmFuZG9tX2RlcyIsIm5hbWVfY29sb3IiLCJTa2lsbENvbG9yIiwibGV2ZWwiLCJjb2xvciIsInJlY2FzdF9za2lsbHMiLCJyaWdodF9za2lsbF9udW0iLCJza2lsbF9pZCIsInBhcmVudCIsInNldExldmVTdGF0dXMiLCJzZXRTY2FsZSIsInBvc195Iiwic2V0UG9zaXRpb24iLCJjcmVhdGVMYWJlbCIsImljb25fcmVzIiwiY3JlYXRlSW1hZ2UiLCJzcCIsInNwcml0ZUZyYW1lIiwic3RhdHVzIiwic2V0VmlzaWJsZSIsInJlZl9leHBlbmQiLCJjb3N0X2RhdGEiLCJudW0iLCJnZXRJdGVtQ29uZmlnIiwiZ2V0SXRlbVJlcyIsImhhdmVfbnVtIiwiZ2V0SXRlbU51bUJ5QmlkIiwiZ2V0TW9uZXlTdHJpbmciLCJjbG9zZUNhbGxCYWNrIiwiZGVsZXRlTWUiLCJkZXN0cm95Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsY0FBYyxHQUFHRCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUUsU0FBUyxHQUFHRixPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJRyxrQkFBa0Is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LGVBQVQsRUFBMEI7QUFDdEIsV0FBSyxJQUFJOEQsQ0FBVCxJQUFjLEtBQUs5RCxlQUFuQixFQUFvQztBQUNoQyxZQUFJb0YsQ0FBQyxHQUFHLEtBQUtwRixlQUFMLENBQXFCOEQsQ0FBckIsQ0FBUjs7QUFDQSxZQUFJc0IsQ0FBSixFQUFPO0FBQ0hBLFVBQUFBLENBQUMsQ0FBQ21CLElBQUYsQ0FBTytELE9BQVA7QUFDQWxGLFVBQUFBLENBQUMsR0FBRyxJQUFKO0FBQ0g7QUFDSjs7QUFDRCxXQUFLcEYsZUFBTCxHQUF1QixJQUF2QjtBQUNIOztBQUNELFNBQUtQLElBQUwsQ0FBVXlDLHdCQUFWLENBQW1DLEtBQW5DO0FBQ0g7QUE1Y2dDLENBQVQsQ0FBNUIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICDov5nph4zmmK/mj4/ov7Dov5nkuKrnqpfkvZPnmoTkvZznlKjnmoRcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTA0LTEwIDExOjA2OjMzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIEhlcm9Db250cm9sbGVyID0gcmVxdWlyZShcImhlcm9fY29udHJvbGxlclwiKTtcbnZhciBIZXJvRXZlbnQgPSByZXF1aXJlKFwiaGVyb19ldmVudFwiKTtcbnZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKVxudmFyIFBhcnRuZXJDYWxjdWxhdGUgPSByZXF1aXJlKFwicGFydG5lcl9jYWxjdWxhdGVcIik7XG52YXIgU2tpbGxJdGVtID0gcmVxdWlyZShcInNraWxsX2l0ZW1cIik7XG52YXIgUGFydG5lckNvbnN0ID0gcmVxdWlyZShcInBhcnRuZXJfY29uc3RcIik7XG5cbnZhciBBcnRpZmFjdF9yZWNhc3RXaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiaGVyb1wiLCBcImFydGlmYWN0X3JlY2FzdF9wYW5lbFwiKTtcbiAgICAgICAgdGhpcy52aWV3VGFnID0gU0NFTkVfVEFHLmRpYWxvZ3VlOyAgICAgICAgICAgICAgICAvL+ivpeeql+S9k+aJgOWxnnVp5bGC57qnLOWFqOWxj3Vp6ZyA6KaB5ZyodWnlsYIs6Z2e5YWo5bGPdWnlnKhkaWFsb2d1ZeWxgizov5nkuKropoHms6jmhI9cbiAgICAgICAgdGhpcy53aW5fdHlwZSA9IFdpblR5cGUuQmlnOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmN0cmwgPSBIZXJvQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpXG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKVxuICAgICAgICB0aGlzLmlzX2Nhbl9zYXZlID0gZmFsc2VcbiAgICAgICAgdGhpcy5uZWVkX2xpc3QgPSB7fVxuICAgICAgICB0aGlzLmJhc2VfbGlzdF9sZWZ0ID0ge31cbiAgICAgICAgdGhpcy5iYXNlX2xpc3RfcmlnaHQgPSB7fVxuICAgICAgICB0aGlzLnNraWxsX2xpc3RfbGVmdCA9IHt9XG4gICAgICAgIHRoaXMuc2tpbGxfbGlzdF9yaWdodCA9IHt9XG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjueahOWbnuiwgyzlj6/ku6XlnKjov5nph4zmjZXojrfnm7jlhbPoioLngrnmiJbogIXnu4Tku7ZcbiAgICBvcGVuQ2FsbEJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gdGhpcy5zZWVrQ2hpbGQoXCJiYWNrZ3JvdW5kXCIpO1xuXG4gICAgICAgIHRoaXMubWFpbl9jb250YWluZXIgPSB0aGlzLnNlZWtDaGlsZChcIm1haW5fY29udGFpbmVyXCIpO1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcImNvbnRhaW5lclwiKTtcblxuICAgICAgICB0aGlzLmxlZnRfYmdfbmQgPSB0aGlzLnNlZWtDaGlsZChjb250YWluZXIsIFwiSW1hZ2VfN1wiKTtcbiAgICAgICAgdGhpcy5yaWdodF9iZ19uZCA9IHRoaXMuc2Vla0NoaWxkKGNvbnRhaW5lciwgXCJJbWFnZV85XCIpO1xuICAgICAgICB0aGlzLm5hbWVfbGIgPSB0aGlzLnNlZWtDaGlsZChjb250YWluZXIsIFwibmFtZV90eHRcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnBvc19pdGVtID0gdGhpcy5zZWVrQ2hpbGQoXCJwb3NfaXRlbVwiKVxuXG4gICAgICAgIHZhciBjb3N0X2ljb25fMV9zcCA9IHRoaXMuc2Vla0NoaWxkKGNvbnRhaW5lciwgXCJjb3N0X2ljb25fMVwiLCBjYy5TcHJpdGUpO1xuICAgICAgICB2YXIgY29zdF9pY29uXzJfc3AgPSB0aGlzLnNlZWtDaGlsZChjb250YWluZXIsIFwiY29zdF9pY29uXzJcIiwgY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5jb3N0X2ljb24gPSBbY29zdF9pY29uXzFfc3AsIGNvc3RfaWNvbl8yX3NwXTtcbiAgICAgICAgdmFyIGNvc3RfdHh0XzFfbGIgPSB0aGlzLnNlZWtDaGlsZChjb250YWluZXIsIFwiY29zdF90eHRfMVwiLCBjYy5MYWJlbCk7XG4gICAgICAgIHZhciBjb3N0X3R4dF8yX2xiID0gdGhpcy5zZWVrQ2hpbGQoY29udGFpbmVyLCBcImNvc3RfdHh0XzJcIiwgY2MuTGFiZWwpO1xuICAgICAgICBjb3N0X3R4dF8xX2xiLnN0cmluZyA9IFwiXCI7XG4gICAgICAgIGNvc3RfdHh0XzJfbGIuc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdGhpcy5jb3N0X3R4dCA9IFtjb3N0X3R4dF8xX2xiLCBjb3N0X3R4dF8yX2xiXTtcblxuICAgICAgICB0aGlzLmNsb3NlX2J0biA9IHRoaXMuc2Vla0NoaWxkKFwiY2xvc2VfYnRuXCIpO1xuICAgICAgICB0aGlzLnNhdmVfYnRuID0gdGhpcy5zZWVrQ2hpbGQoXCJzYXZlX2J0blwiKTtcbiAgICAgICAgdGhpcy5yZXNldF9idG4gPSB0aGlzLnNlZWtDaGlsZChcInJlc2V0X2J0blwiKTtcbiAgICAgICAgdGhpcy5jYW5jZWxfYnRuID0gdGhpcy5zZWVrQ2hpbGQoXCJjYW5jZWxfYnRuXCIpO1xuICAgICAgICB0aGlzLmV4cGxhaW5fYnRuID0gdGhpcy5zZWVrQ2hpbGQoXCJleHBsYWluX2J0blwiKVxuXG4gICAgICAgIHRoaXMuaXRlbV9ub2RlID0gSXRlbXNQb29sLmdldEluc3RhbmNlKCkuZ2V0SXRlbShcImJhY2twYWNrX2l0ZW1cIik7XG4gICAgICAgIHRoaXMuaXRlbV9ub2RlLmluaXRDb25maWcoZmFsc2UsIDEsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuaXRlbV9ub2RlLnNob3coKTtcbiAgICAgICAgdGhpcy5pdGVtX25vZGUuc2V0UGFyZW50KHRoaXMucG9zX2l0ZW0pXG4gICAgfSxcblxuICAgIC8vIOazqOWGjOS6i+S7tuebkeWQrOeahOaOpeWPoyzkuI3pnIDopoHmiYvliqjosIPnlKgs5aaC5p6c5piv5L2/55SoZ2NvcmUuR2xvYmFsRXZlbnTnm5HlkKws5Y+v5Lul55u05o6l6LCD55SoYWRkR2xvYmFsRXZlbnRcbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5jbG9zZV9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuQXJ0aWZhY3RSZWNhc3RXaW5kb3coZmFsc2UpXG4gICAgICAgIH0uYmluZCh0aGlzKSwgMilcbiAgICAgICAgLy/ph43pk7hcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLnJlc2V0X2J0biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMTEwMzModGhpcy5wYXJ0bmVyX2lkLCB0aGlzLmRhdGEuaWQsIHt9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG4gICAgICAgIC8v5L+d5a2Y6YeN6ZO4XG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5zYXZlX2J0biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMTEwMzQodGhpcy5wYXJ0bmVyX2lkLCB0aGlzLmRhdGEuaWQsIDEpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSlcbiAgICAgICAgLy/lj5bmtojph43pk7go5pS55Li657un57ut6YeN6ZO4KVxuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMuY2FuY2VsX2J0biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMTEwMzModGhpcy5wYXJ0bmVyX2lkLCB0aGlzLmRhdGEuaWQsIHt9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgdGhpcy5leHBsYWluX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKDEpO1xuICAgICAgICAgICAgdmFyIHBvcyA9IGV2ZW50LnRvdWNoLmdldExvY2F0aW9uKCk7XG4gICAgICAgICAgICB2YXIgZGVzYyA9IFN0cmluZ1V0aWwucGFyc2UoQ29uZmlnLnBhcnRuZXJfYXJ0aWZhY3RfZGF0YS5kYXRhX2FydGlmYWN0X2NvbnN0LnJlY2FzdF9ydWxlLmRlc2MpXG4gICAgICAgICAgICByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuc2hvd0NvbW1vblRpcHMoZGVzYywgcG9zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChIZXJvRXZlbnQuQXJ0aWZhY3RfUmVjYXN0X0V2ZW50LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRhdGEuaWQgPT0gMCkgcmV0dXJuXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJ0bmVyX2lkICYmIHRoaXMucGFydG5lcl9pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFydGlmYWN0X2xpc3QgPSB0aGlzLm1vZGVsLmdldFBhcnRuZXJBcnRpZmFjdExpc3QodGhpcy5wYXJ0bmVyX2lkKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGFydGlmYWN0X2xpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZvID0gYXJ0aWZhY3RfbGlzdFtrXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZvLmlkID09IHRoaXMuZGF0YS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhKHZvLCB0aGlzLnBhcnRuZXJfaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1fZGF0YSA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0QmFja1BhY2tJdGVtQnlJZCh0aGlzLmRhdGEuaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YShpdGVtX2RhdGEsIHRoaXMucGFydG5lcl9pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpXG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChIZXJvRXZlbnQuQXJ0aWZhY3RfU2F2ZV9FdmVudCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhLmlkID09IDApIHJldHVyblxuICAgICAgICAgICAgaWYgKHRoaXMucGFydG5lcl9pZCAmJiB0aGlzLnBhcnRuZXJfaWQgIT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBhcnRpZmFjdF9saXN0ID0gdGhpcy5tb2RlbC5nZXRQYXJ0bmVyQXJ0aWZhY3RMaXN0KHRoaXMucGFydG5lcl9pZCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhcnRpZmFjdF9saXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2byA9IGFydGlmYWN0X2xpc3Rba107XG4gICAgICAgICAgICAgICAgICAgIGlmICh2by5pZCA9PSB0aGlzLmRhdGEuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YSh2bywgdGhpcy5wYXJ0bmVyX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtX2RhdGEgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEJhY2tQYWNrSXRlbUJ5SWQodGhpcy5kYXRhLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGEoaXRlbV9kYXRhLCB0aGlzLnBhcnRuZXJfaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB0aGlzLnNldERhdGEocGFyYW1zLmRhdGEsIHBhcmFtcy5wYXJ0bmVyX2lkKVxuICAgIH0sXG5cbiAgICBzZXREYXRhOiBmdW5jdGlvbiAoZGF0YSwgcGFydG5lcl9pZCkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhIHx8IHt9O1xuICAgICAgICB0aGlzLml0ZW1fY29uZmlnID0gZGF0YS5jb25maWc7XG4gICAgICAgIHRoaXMucGFydG5lcl9pZCA9IHBhcnRuZXJfaWQgfHwgMDtcbiAgICAgICAgdGhpcy5pdGVtX25vZGUuc2V0RGF0YShkYXRhKTtcbiAgICAgICAgdGhpcy5uYW1lX2xiLnN0cmluZyA9IHRoaXMuaXRlbV9jb25maWcubmFtZTtcblxuICAgICAgICAvL+WIpOaWreaYr+WQpuW3sue7j+mHjemTuOS9huacquS/neWtmFxuICAgICAgICB0aGlzLmlzX2Nhbl9zYXZlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZXh0cmFfYXR0ciAmJiBVdGlscy5uZXh0KHRoaXMuZGF0YS5leHRyYV9hdHRyKSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmlzX2Nhbl9zYXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEJhc2VBdHRySW5mbygpXG4gICAgICAgIHRoaXMuc2V0U2tpbGxJbmZvKClcbiAgICAgICAgdGhpcy51cGRhdGVCdG5TaG93KClcbiAgICAgICAgdGhpcy51cGRhdGVDb3N0SW5mbygpXG4gICAgfSxcblxuICAgIC8v5Z+656GA5bGe5oCnXG4gICAgc2V0QmFzZUF0dHJJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5kYXRhIHx8ICF0aGlzLmRhdGEuYXR0ciB8fCAhdGhpcy5pdGVtX2NvbmZpZykgcmV0dXJuXG4gICAgICAgIHZhciBhdHRyX251bSA9IDI7XG4gICAgICAgIHZhciBhcnRpZmFjdF9jb25maWcgPSBDb25maWcucGFydG5lcl9hcnRpZmFjdF9kYXRhLmRhdGFfYXJ0aWZhY3RfZGF0YVt0aGlzLml0ZW1fY29uZmlnLmlkXTtcbiAgICAgICAgaWYgKGFydGlmYWN0X2NvbmZpZykge1xuICAgICAgICAgICAgYXR0cl9udW0gPSBhcnRpZmFjdF9jb25maWcuYXR0cl9udW07XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuZGF0YS5hdHRyKSB7XG4gICAgICAgICAgICBpZiAoaSA+IGF0dHJfbnVtKSBicmVha1xuICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmRhdGEuYXR0cltpXTtcbiAgICAgICAgICAgIHZhciBhdHRyX2lkID0gdi5hdHRyX2lkO1xuICAgICAgICAgICAgdmFyIGF0dHJfa2V5ID0gQ29uZmlnLmF0dHJfZGF0YS5kYXRhX2lkX3RvX2tleVthdHRyX2lkXTtcbiAgICAgICAgICAgIHZhciBhdHRyX3ZhbCA9IHYuYXR0cl92YWwgLyAxMDAwO1xuICAgICAgICAgICAgdmFyIGF0dHJfbmFtZSA9IENvbmZpZy5hdHRyX2RhdGEuZGF0YV9rZXlfdG9fbmFtZVthdHRyX2tleV07XG4gICAgICAgICAgICBpZiAoYXR0cl9uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYmFzZV9saXN0X2xlZnRbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlX2xpc3RfbGVmdFtpXSA9IFV0aWxzLmNyZWF0ZVJpY2hMYWJlbCgyNCwgbmV3IGNjLkNvbG9yKDB4NjgsIDB4NDUsIDB4MmEsIDB4ZmYpLCBjYy52MigwLCAwLjUpLCBjYy52Mig2MCAtIDE1MSwgMjgpLCAzMCwgMzgwLCB0aGlzLmxlZnRfYmdfbmQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2VfbGlzdF9sZWZ0W2ldLmhvcml6b250YWxBbGlnbiA9IGNjLm1hY3JvLlRleHRBbGlnbm1lbnQuTEVGVDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmJhc2VfbGlzdF9sZWZ0W2ldO1xuICAgICAgICAgICAgICAgIGxhYmVsLm5vZGUueSA9IC03MCAtIGkgKiAzNTtcbiAgICAgICAgICAgICAgICB2YXIgaWNvbiA9IFBhdGhUb29sLmdldEF0dHJJY29uQnlTdHIoYXR0cl9rZXkpO1xuICAgICAgICAgICAgICAgIHZhciBpc19wZXIgPSBQYXJ0bmVyQ2FsY3VsYXRlLmlzU2hvd1BlckJ5U3RyKGF0dHJfa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNfcGVyID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cl92YWwgPSBhdHRyX3ZhbCAvIDEwICsgXCIlXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBhdHRyX3N0ciA9IGNjLmpzLmZvcm1hdFN0cihcIjxpbWcgc3JjPSclcycgLz4gPGNvbG9yPSM2ODQ1MmE+ICVz77yaPC9jPjxjb2xvcj0jNjg0NTJhPiVzPC9jPlwiLCBpY29uLCBhdHRyX25hbWUsIGF0dHJfdmFsKTtcbiAgICAgICAgICAgICAgICBsYWJlbC5zdHJpbmcgPSBhdHRyX3N0cjtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImNvbW1vblwiLCBpY29uKSwgKGZ1bmN0aW9uIChyZXNPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwuYWRkU3ByaXRlRnJhbWUocmVzT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzX2Nhbl9zYXZlKSB7XG4gICAgICAgICAgICAvL+mHjemTuOi/h++8jOacquS/neWtmFxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmRhdGEuZXh0cmFfYXR0cikge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5kYXRhLmV4dHJhX2F0dHJbaV07XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJfaWQgPSB2LmF0dHJfaWQ7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJfa2V5ID0gQ29uZmlnLmF0dHJfZGF0YS5kYXRhX2lkX3RvX2tleVthdHRyX2lkXTtcbiAgICAgICAgICAgICAgICB2YXIgYXR0cl92YWwgPSB2LmF0dHJfdmFsIC8gMTAwMDtcbiAgICAgICAgICAgICAgICB2YXIgYXR0cl9uYW1lID0gQ29uZmlnLmF0dHJfZGF0YS5kYXRhX2tleV90b19uYW1lW2F0dHJfa2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoYXR0cl9uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmJhc2VfbGlzdF9yaWdodFtpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlX2xpc3RfcmlnaHRbaV0gPSBVdGlscy5jcmVhdGVSaWNoTGFiZWwoMjQsIG5ldyBjYy5Db2xvcigweDY4LCAweDQ1LCAweDJhLCAweGZmKSwgY2MudjIoMCwgMC41KSwgY2MudjIoNjAgLSAxNTEsIDI4KSwgMzAsIDM4MCwgdGhpcy5yaWdodF9iZ19uZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2VfbGlzdF9yaWdodFtpXS5ob3Jpem9udGFsQWxpZ24gPSBjYy5tYWNyby5UZXh0QWxpZ25tZW50LkxFRlQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmJhc2VfbGlzdF9yaWdodFtpXTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubm9kZS54ID0gLTkxO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5ub2RlLnkgPSAtNzAgLSBpICogMzU7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGljb24gPSBQYXRoVG9vbC5nZXRBdHRySWNvbkJ5U3RyKGF0dHJfa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzX3BlciA9IFBhcnRuZXJDYWxjdWxhdGUuaXNTaG93UGVyQnlTdHIoYXR0cl9rZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNfcGVyID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfdmFsID0gYXR0cl92YWwgLyAxMCArIFwiJVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRyX3N0ciA9IGNjLmpzLmZvcm1hdFN0cihcIjxpbWcgc3JjPSclcycgLz4gPGNvbG9yPSM2ODQ1MmE+ICVz77yaPC9jPjxjb2xvcj0jNjg0NTJhPiVzPC9jPlwiLCBpY29uLCBhdHRyX25hbWUsIGF0dHJfdmFsKTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwuc3RyaW5nID0gYXR0cl9zdHI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiY29tbW9uXCIsIGljb24pLCAoZnVuY3Rpb24gKHJlc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuYWRkU3ByaXRlRnJhbWUocmVzT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmRhdGEuYXR0cikge1xuICAgICAgICAgICAgICAgIGlmIChpID4gYXR0cl9uYW1lKSBicmVha1xuICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5kYXRhLmF0dHJbaV07XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmJhc2VfbGlzdF9yaWdodFtpXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhc2VfbGlzdF9yaWdodFtpXSA9IFV0aWxzLmNyZWF0ZVJpY2hMYWJlbCgyNCwgbmV3IGNjLkNvbG9yKDB4NjgsIDB4NDUsIDB4MmEsIDB4ZmYpLCBjYy52MigwLCAwLjUpLCBjYy52MigxMjAgLSAzMDMsIDI4KSwgMzAsIDM4MCwgdGhpcy5yaWdodF9iZ19uZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZV9saXN0X3JpZ2h0W2ldLmhvcml6b250YWxBbGlnbiA9IGNjLm1hY3JvLlRleHRBbGlnbm1lbnQuTEVGVDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmJhc2VfbGlzdF9yaWdodFtpXTtcbiAgICAgICAgICAgICAgICBsYWJlbC5ub2RlLnggPSAtNTFcbiAgICAgICAgICAgICAgICBsYWJlbC5ub2RlLnkgPSAtNzAgLSBpICogMzU7XG4gICAgICAgICAgICAgICAgbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLpmo/mnLrlsZ7mgKdcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+elnuWZqOaKgOiDvVxuICAgIHNldFNraWxsSW5mbzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhID09IG51bGwgfHwgdGhpcy5kYXRhLmV4dHJhID09IG51bGwpIHJldHVyblxuICAgICAgICB2YXIgc2tpbGxfbnVtID0gMDtcbiAgICAgICAgdmFyIGFydGlmYWN0X2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX2FydGlmYWN0X2RhdGEuZGF0YV9hcnRpZmFjdF9kYXRhW3RoaXMuaXRlbV9jb25maWcuaWRdO1xuICAgICAgICBpZiAoYXJ0aWZhY3RfY29uZmlnKSB7XG4gICAgICAgICAgICBza2lsbF9udW0gPSBhcnRpZmFjdF9jb25maWcuc2tpbGxfbnVtO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IDE7XG4gICAgICAgIHZhciBjdXJfc2tpbGxzID0gW107XG4gICAgICAgIHRoaXMuZGF0YS5leHRyYS5zb3J0KFV0aWxzLnRhYmxlTG93ZXJTb3J0ZXIoW1wiZXh0cmFfa1wiXSkpO1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuc2tpbGxfbGlzdF9sZWZ0KSB7XG4gICAgICAgICAgICB0aGlzLnNldFNraWxsSXRlbVZpc2libGUoZmFsc2UsIHRoaXMuc2tpbGxfbGlzdF9sZWZ0W2tdKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuZGF0YS5leHRyYSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5kYXRhLmV4dHJhW2ldO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmV4dHJhX2sgJiYgdmFsdWUuZXh0cmFfayA9PSAxIHx8IHZhbHVlLmV4dHJhX2sgPT0gMiB8fCB2YWx1ZS5leHRyYV9rID09IDgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VyX3NraWxscy5sZW5ndGggPD0gc2tpbGxfbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cl9za2lsbHMucHVzaCh2YWx1ZS5leHRyYV92KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwic2tpbGxfZGF0YVwiLCBcImRhdGFfZ2V0X3NraWxsXCIsIFt2YWx1ZS5leHRyYV92XSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5za2lsbF9saXN0X2xlZnRbaW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNyZWF0ZVNraWxsSXRlbSh0aGlzLmxlZnRfYmdfbmQsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2xpc3RfbGVmdFtpbmRleF0gPSBpdGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza2lsbF9pdGVtID0gdGhpcy5za2lsbF9saXN0X2xlZnRbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTa2lsbEl0ZW1WaXNpYmxlKHRydWUsIHNraWxsX2l0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5za2lsbC5zZXREYXRhKGNvbmZpZy5iaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5uYW1lLnN0cmluZyA9IGNvbmZpZy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5kZXNjLnN0cmluZyA9IGNvbmZpZy5kZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBza2lsbF9pdGVtLnJhbmRvbV9pY29uLm5vZGUuYWN0aXZlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraWxsX2l0ZW0ucmFuZG9tX2Rlcy5ub2RlLmFjdGl2ZSA9IGZhbHNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lX2NvbG9yID0gUGFydG5lckNvbnN0LlNraWxsQ29sb3JbY29uZmlnLmxldmVsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfY29sb3IgPSBuYW1lX2NvbG9yIHx8IG5ldyBjYy5Db2xvcigweDY4LCAweDQ1LCAweDJhLCAweGZmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraWxsX2l0ZW0ubmFtZS5ub2RlLmNvbG9yID0gbmFtZV9jb2xvcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1cl9za2lsbHMgPSBjdXJfc2tpbGxzO1xuXG4gICAgICAgIC8v5Y+z5L6nXG4gICAgICAgIHZhciByZWNhc3Rfc2tpbGxzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5kYXRhLmV4dHJhKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRhdGEuZXh0cmFbaV07XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUuZXh0cmFfayAhPSBudWxsICYmIHZhbHVlLmV4dHJhX2sgPT0gMyB8fCB2YWx1ZS5leHRyYV9rID09IDQgfHwgdmFsdWUuZXh0cmFfayA9PSA5KSB7XG4gICAgICAgICAgICAgICAgcmVjYXN0X3NraWxscy5wdXNoKHZhbHVlLmV4dHJhX3YpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVjYXN0X3NraWxscyA9IHJlY2FzdF9za2lsbHM7XG4gICAgICAgIHZhciByaWdodF9za2lsbF9udW0gPSBza2lsbF9udW07XG4gICAgICAgIC8v5b2T5rKh5pyJ6YeN572u5oqA6IO95YiZ5pi+56S65Li65pyA5aSn5pWw6YeP55qE6Zeu5Y+377yM5pyJ5YiZ5pi+56S65Li65oqA6IO95pWw6YePXG4gICAgICAgIGlmIChVdGlscy5uZXh0KHJlY2FzdF9za2lsbHMpICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJpZ2h0X3NraWxsX251bSA9IHJlY2FzdF9za2lsbHMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyaWdodF9za2lsbF9udW0gPiBza2lsbF9udW0pIHtcbiAgICAgICAgICAgIHJpZ2h0X3NraWxsX251bSA9IHNraWxsX251bTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuc2tpbGxfbGlzdF9yaWdodCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTa2lsbEl0ZW1WaXNpYmxlKGZhbHNlLCB0aGlzLnNraWxsX2xpc3RfcmlnaHRba10pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmlnaHRfc2tpbGxfbnVtOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5za2lsbF9saXN0X3JpZ2h0W2ldKSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNyZWF0ZVNraWxsSXRlbSh0aGlzLnJpZ2h0X2JnX25kLCBpICsgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF9saXN0X3JpZ2h0W2ldID0gaXRlbTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNraWxsX2lkID0gcmVjYXN0X3NraWxsc1tpXTtcbiAgICAgICAgICAgIHZhciBza2lsbF9pdGVtID0gdGhpcy5za2lsbF9saXN0X3JpZ2h0W2ldO1xuXG4gICAgICAgICAgICB0aGlzLnNldFNraWxsSXRlbVZpc2libGUodHJ1ZSwgc2tpbGxfaXRlbSk7XG4gICAgICAgICAgICBza2lsbF9pdGVtLm5hbWUubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgc2tpbGxfaXRlbS5kZXNjLm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHNraWxsX2l0ZW0ucmFuZG9tX2ljb24ubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHNraWxsX2l0ZW0ucmFuZG9tX2Rlcy5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwic2tpbGxfZGF0YVwiLCBcImRhdGFfZ2V0X3NraWxsXCIsIFtza2lsbF9pZF0pO1xuICAgICAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgICAgICAgIHNraWxsX2l0ZW0uc2tpbGwuc2V0RGF0YShjb25maWcuYmlkKTtcbiAgICAgICAgICAgICAgICBza2lsbF9pdGVtLm5hbWUuc3RyaW5nID0gY29uZmlnLm5hbWU7XG4gICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5kZXNjLnN0cmluZyA9IGNvbmZpZy5kZXM7XG5cbiAgICAgICAgICAgICAgICB2YXIgbmFtZV9jb2xvciA9IFBhcnRuZXJDb25zdC5Ta2lsbENvbG9yW2NvbmZpZy5sZXZlbF07XG4gICAgICAgICAgICAgICAgbmFtZV9jb2xvciA9IG5hbWVfY29sb3IgfHwgbmV3IGNjLkNvbG9yKDB4NjgsIDB4NDUsIDB4MmEsIDB4ZmYpO1xuICAgICAgICAgICAgICAgIHNraWxsX2l0ZW0ubmFtZS5ub2RlLmNvbG9yID0gbmFtZV9jb2xvcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5za2lsbC5zZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5uYW1lLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5kZXNjLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5yYW5kb21faWNvbi5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2tpbGxfaXRlbS5yYW5kb21fZGVzLm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+WIm+W7uuS4gOS4quaKgOiDvWl0ZW1cbiAgICBjcmVhdGVTa2lsbEl0ZW06IGZ1bmN0aW9uIChwYXJlbnQsIGluZGV4KSB7XG4gICAgICAgIHZhciBpdGVtID0ge307XG4gICAgICAgIHZhciBza2lsbCA9IG5ldyBTa2lsbEl0ZW0oKTtcbiAgICAgICAgc2tpbGwuc2V0TGV2ZVN0YXR1cyhmYWxzZSk7XG4gICAgICAgIHNraWxsLnNldFNjYWxlKDAuOClcbiAgICAgICAgc2tpbGwuc2V0UGFyZW50KHBhcmVudCk7XG4gICAgICAgIHZhciBwb3NfeSA9IDIwNyAtIDQ0NCAtIChpbmRleCAtIDEpICogMTMwO1xuICAgICAgICBza2lsbC5zZXRQb3NpdGlvbihjYy52Mig2MCAtIDE1MSwgcG9zX3kpKVxuICAgICAgICB2YXIgbmFtZSA9IFV0aWxzLmNyZWF0ZUxhYmVsKDIyLCBuZXcgY2MuQ29sb3IoMHhmZSwgMHhlZSwgMHhiYSwgMHhmZiksIG51bGwsIDEzMCAtIDE2NywgcG9zX3kgKyAxNSwgXCJcIiwgcGFyZW50LCAxLCBjYy52MigwLCAwKSlcbiAgICAgICAgdmFyIGRlc2MgPSBVdGlscy5jcmVhdGVSaWNoTGFiZWwoMjAsIG5ldyBjYy5Db2xvcigweDY4LCAweDQ1LCAweDJhLCAweGZmKSwgY2MudjIoMCwgMSksIGNjLnYyKDEzMCAtIDE2NywgcG9zX3kgKyAyMCksIDI2LCAxODAsIHBhcmVudCk7XG4gICAgICAgIGRlc2MuaG9yaXpvbnRhbEFsaWduID0gY2MubWFjcm8uVGV4dEFsaWdubWVudC5MRUZUO1xuICAgICAgICB2YXIgaWNvbl9yZXMgPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiYXJ0aWZhY3RcIiwgXCJhcnRpZmFjdF8xMDAzXCIpXG4gICAgICAgIHZhciByYW5kb21faWNvbiA9IFV0aWxzLmNyZWF0ZUltYWdlKHBhcmVudCwgbnVsbCwgNzUgLSAxNjcsIHBvc195LCBjYy52MigwLjUsIDAuNSksIG51bGwsIDIpXG4gICAgICAgIHRoaXMubG9hZFJlcyhpY29uX3JlcywgZnVuY3Rpb24gKHNwKSB7XG4gICAgICAgICAgICByYW5kb21faWNvbi5zcHJpdGVGcmFtZSA9IHNwO1xuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIHZhciByYW5kb21fZGVzID0gVXRpbHMuY3JlYXRlTGFiZWwoMjQsIG5ldyBjYy5Db2xvcigweDY4LCAweDQ1LCAweDJhLCAweGZmKSwgbnVsbCwgMTMwIC0gMTY3LCBwb3NfeSwgVXRpbHMuVEkxOE4oXCLpmo/mnLrmioDog71cIiksIHBhcmVudCwgMSwgY2MudjIoMCwgMC41KSlcbiAgICAgICAgaXRlbS5za2lsbCA9IHNraWxsO1xuICAgICAgICBpdGVtLm5hbWUgPSBuYW1lO1xuICAgICAgICBpdGVtLmRlc2MgPSBkZXNjO1xuICAgICAgICBpdGVtLnJhbmRvbV9pY29uID0gcmFuZG9tX2ljb247XG4gICAgICAgIGl0ZW0ucmFuZG9tX2RlcyA9IHJhbmRvbV9kZXM7XG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgfSxcblxuICAgIHNldFNraWxsSXRlbVZpc2libGU6IGZ1bmN0aW9uIChzdGF0dXMsIGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIGl0ZW0uc2tpbGwuc2V0VmlzaWJsZShzdGF0dXMpXG4gICAgICAgIGl0ZW0uZGVzYy5ub2RlLmFjdGl2ZSA9IHN0YXR1cztcbiAgICAgICAgaXRlbS5uYW1lLm5vZGUuYWN0aXZlID0gc3RhdHVzO1xuICAgICAgICBpdGVtLnJhbmRvbV9pY29uLm5vZGUuYWN0aXZlID0gc3RhdHVzO1xuICAgICAgICBpdGVtLnJhbmRvbV9kZXMubm9kZS5hY3RpdmUgPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIHVwZGF0ZUJ0blNob3c6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5yZXNldF9idG4uYWN0aXZlID0gIXRoaXMuaXNfY2FuX3NhdmU7XG4gICAgICAgIHRoaXMuc2F2ZV9idG4uYWN0aXZlID0gdGhpcy5pc19jYW5fc2F2ZTtcbiAgICAgICAgdGhpcy5jYW5jZWxfYnRuLmFjdGl2ZSA9IHRoaXMuaXNfY2FuX3NhdmU7XG4gICAgfSxcblxuICAgIHVwZGF0ZUNvc3RJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5kYXRhIHx8ICF0aGlzLmRhdGEuYXR0ciB8fCAhdGhpcy5pdGVtX2NvbmZpZykgcmV0dXJuXG4gICAgICAgIHZhciBhcnRpZmFjdF9jb25maWcgPSBDb25maWcucGFydG5lcl9hcnRpZmFjdF9kYXRhLmRhdGFfYXJ0aWZhY3RfZGF0YVt0aGlzLml0ZW1fY29uZmlnLmlkXTtcbiAgICAgICAgaWYgKGFydGlmYWN0X2NvbmZpZyAmJiBhcnRpZmFjdF9jb25maWcucmVmX2V4cGVuZCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb3N0X2ljb24gPSB0aGlzLmNvc3RfaWNvbltpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb3N0X3R4dCA9IHRoaXMuY29zdF90eHRbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgY29zdF9kYXRhID0gYXJ0aWZhY3RfY29uZmlnLnJlZl9leHBlbmRbaV07XG4gICAgICAgICAgICAgICAgaWYgKGNvc3RfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYmlkID0gY29zdF9kYXRhWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbnVtID0gY29zdF9kYXRhWzFdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGJpZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtX2NvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEl0ZW1SZXMoYmlkKSwgZnVuY3Rpb24gKHNwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdF9pY29uLnNwcml0ZUZyYW1lID0gc3A7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGF2ZV9udW0gPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEl0ZW1OdW1CeUJpZChiaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29zdF90eHQuc3RyaW5nID0gVXRpbHMuZ2V0TW9uZXlTdHJpbmcoaGF2ZV9udW0pICsgXCIvXCIgKyBVdGlscy5nZXRNb25leVN0cmluZyhudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVfbnVtID49IG51bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3RfdHh0Lm5vZGUuY29sb3IgPSBuZXcgY2MuQ29sb3IoMHhmZiwgMHhmNiwgMHhlNCwgMHhmZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3RfdHh0Lm5vZGUuY29sb3IgPSBuZXcgY2MuQ29sb3IoMHhjOCwgMHgxNCwgMHgxNCwgMHhmZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3N0X2RhdGEuc3RyaW5nID0gXCJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDlhbPpl63nqpfkvZPlm57osIMs6ZyA6KaB5Zyo6L+Z6YeM6LCD55So6K+l56qX5L2T5omA5bGeY29udHJvbGxlcueahGNsb3Nl5pa55rOV5rKh55So5LqO572u56m66K+l56qX5L2T5a6e5L6L5a+56LGhXG4gICAgY2xvc2VDYWxsQmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pdGVtX25vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbV9ub2RlLmRlbGV0ZU1lKCk7XG4gICAgICAgICAgICB0aGlzLml0ZW1fbm9kZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2tpbGxfbGlzdF9sZWZ0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuc2tpbGxfbGlzdF9sZWZ0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLnNraWxsX2xpc3RfbGVmdFtrXTtcbiAgICAgICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgICAgICB2LnNraWxsLmRlbGV0ZU1lKCk7XG4gICAgICAgICAgICAgICAgICAgIHYuc2tpbGwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB2LmRlc2Mubm9kZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHYuZGVzYyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHYubmFtZS5ub2RlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdi5uYW1lID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdi5yYW5kb21fZGVzLm5vZGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB2LnJhbmRvbV9kZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB2LnJhbmRvbV9pY29uLm5vZGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB2LnJhbmRvbV9pY29uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5za2lsbF9saXN0X2xlZnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNraWxsX2xpc3RfcmlnaHQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5za2lsbF9saXN0X3JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLnNraWxsX2xpc3RfcmlnaHRba107XG4gICAgICAgICAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgdi5za2lsbC5kZWxldGVNZSgpO1xuICAgICAgICAgICAgICAgICAgICB2LnNraWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdi5kZXNjLm5vZGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB2LmRlc2MgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB2Lm5hbWUubm9kZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHYubmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHYucmFuZG9tX2Rlcy5ub2RlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdi5yYW5kb21fZGVzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdi5yYW5kb21faWNvbi5ub2RlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdi5yYW5kb21faWNvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2tpbGxfbGlzdF9yaWdodCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYmFzZV9saXN0X2xlZnQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5iYXNlX2xpc3RfbGVmdCkge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5iYXNlX2xpc3RfbGVmdFtrXTtcbiAgICAgICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgICAgICB2Lm5vZGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB2ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJhc2VfbGlzdF9sZWZ0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5iYXNlX2xpc3RfcmlnaHQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5iYXNlX2xpc3RfcmlnaHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuYmFzZV9saXN0X3JpZ2h0W2tdO1xuICAgICAgICAgICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICAgICAgICAgIHYubm9kZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYmFzZV9saXN0X3JpZ2h0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN0cmwub3BlbkFydGlmYWN0UmVjYXN0V2luZG93KGZhbHNlKTtcbiAgICB9LFxufSkiXX0=