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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/voyage/view/voyage_main_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, '09a99xrtDJLHpoJEKE75Ygs', 'voyage_main_window');
// Scripts/mod/voyage/view/voyage_main_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-03-07 11:23:08
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var RoleController = require("role_controller");
 
var CommonScrollView = require("common_scrollview");
 
var VoyageController = require("voyage_controller");
 
var VoyageEvent = require("voyage_event");
 
var BackPackConst = require("backpack_const");
 
var BackpackController = require("backpack_controller");
 
var VoyageOrderItem = require("voyage_order_item");
 
var VoyageConst = require("voyage_const");
 
var Voyage_mainWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("voyage", "voyage_main_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.role_vo = RoleController.getInstance().getRoleVo();
    this.ctrl = VoyageController.getInstance();
    this.model = this.ctrl.getModel();
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    this.background = this.seekChild("background");
    this.background.scale = FIT_SCALE;
    this.main_container = this.seekChild("main_container");
    this.top_bg_sp = this.seekChild(this.main_container, "top_bg", cc.Sprite);
    this.loadRes(PathTool.getBigBg("txt_cn_bigbg_22"), function (res) {
      this.top_bg_sp.spriteFrame = res;
    }.bind(this));
    this.refresh_btn_nd = this.seekChild("refresh_btn");
    this.refresh_btn_lb = this.seekChild(this.refresh_btn_nd, "label", cc.Label);
    this.refresh_btn_img_sp = this.seekChild(this.refresh_btn_nd, "img", cc.Sprite);
    this.refresh_btn_img_sp.node.active = false;
    this.special_btn_nd = this.seekChild("special_btn");
    this.explain_btn_nd = this.seekChild("explain_btn");
    this.special_sk = this.seekChild(this.special_btn_nd, "special_sk", sp.Skeleton);
    this.progress_pb = this.seekChild(this.main_container, "progress", cc.ProgressBar);
    this.progress_pb.progress = 0;
    this.progress_value_lb = this.seekChild(this.main_container, "progress_value", cc.Label);
    this.no_order_image_nd = this.seekChild(this.main_container, "no_order_image"); //刷新道具消耗
 
    var cost_config = Config.shipping_data.data_const["refresh_cost"];
    this.cost_item_bid = cost_config.val[0][0];
    this.cost_item_num = cost_config.val[0][1];
    this.item_count_lb = this.seekChild(this.main_container, "item_count", cc.Label);
    var item_config = Utils.getItemConfig(this.cost_item_bid);
    var res_icon_sp = this.seekChild(this.main_container, "res_icon", cc.Sprite);
    var item_icon_sp = this.seekChild(this.main_container, "item_icon", cc.Sprite);
    this.loadRes(PathTool.getItemRes(7), function (sf_obj) {
      res_icon_sp.spriteFrame = sf_obj;
    }.bind(this));
    this.loadRes(PathTool.getItemRes(item_config.icon), function (sf_obj) {
      item_icon_sp.spriteFrame = sf_obj;
    }.bind(this));
    var order_list_nd = this.seekChild(this.main_container, "order_list");
    var bgSize = order_list_nd.getContentSize();
    var tab_size = cc.size(bgSize.width - 10, bgSize.height - 10);
    var setting = {
      item_class: VoyageOrderItem,
      // 单元类
      start_x: 5,
      // 第一个单元的X起点
      space_x: 0,
      // x方向的间隔
      start_y: 0,
      // 第一个单元的Y起点
      space_y: 0,
      // y方向的间隔
      item_width: 631,
      // 单元的尺寸width
      item_height: 171,
      // 单元的尺寸height
      row: 0,
      // 行数,作用于水平滚动类型
      col: 1,
      // 列数,作用于垂直滚动类型
      need_dynamic: true
    };
    this.order_scrollview = new CommonScrollView();
    this.order_scrollview.createScroll(order_list_nd, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, tab_size, setting, cc.v2(0.5, 0.5));
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    Utils.onTouchEnd(this.background, function () {
      this.ctrl.openVoyageMainWindow(false);
    }.bind(this), 2);
    this.explain_btn_nd.on(cc.Node.EventType.TOUCH_END, function (event) {
      Utils.playButtonSound(1);
      var explain_config = Config.shipping_data.data_explain[1];
      var pos = event.touch.getLocation();
      if (explain_config) require("tips_controller").getInstance().showCommonTips(StringUtil.parse(explain_config.desc), pos);
    });
    this.special_btn_nd.on(cc.Node.EventType.TOUCH_END, function (event) {
      Utils.playButtonSound(1);
      var pos = event.touch.getLocation();
 
      this._onClickSpecialBtn(pos);
    }, this);
    Utils.onTouchEnd(this.refresh_btn_nd, function () {
      var is_first = this.model.getFirstFresh();
      var p_1 = RoleController.getInstance().getModel().checkPrivilegeStatus(3);
      var p_2 = RoleController.getInstance().getModel().checkPrivilegeStatus(2);
 
      if (is_first && !p_1 && !p_2) {
        var refresh_config = Config.shipping_data.data_refresh[this.role_vo.vip_lev];
        if (!refresh_config) return;
        var free_times = this.model.getFreeTimes();
        var free_count = refresh_config.free_times; //免费刷新上限
 
        if (free_times >= free_count) {
          this.ctrl.send23820();
 
          var fun = function () {
            require("vip_controller").getInstance().openVipMainWindow(true, VIPTABCONST.PRIVILEGE);
 
            this.ctrl.openVoyageMainWindow(false);
          }.bind(this);
 
          var str = cc.js.formatStr(Utils.TI18N("获取远航特权,<color=#c92606>每日首次</c>钻石、刷新券刷新必出<color=#c92606>高品质</c>远航任务,完成可获高额奖励!!!"));
 
          require("commonalert").show(str, Utils.TI18N("立即前往"), fun, Utils.TI18N("残忍拒绝"), null, 1);
 
          return;
        }
      }
 
      if (this.model.checkIsHaveHigherEpicOrder()) {
        var fun = function () {
          this.ctrl.requestRefreshOrder();
        }.bind(this);
 
        var str = cc.js.formatStr(Utils.TI18N("有紫色以上的远航任务未接取,是否继续?"));
 
        require("commonalert").show(str, Utils.TI18N("确定"), fun, Utils.TI18N("取消"), null, 1);
      } else {
        this.ctrl.requestRefreshOrder();
      }
    }.bind(this), 1); //更新所有订单数据
 
    this.addGlobalEvent(VoyageEvent.UpdateVoyageDataEvent, function () {
      this.refreshOrderList();
      this.refreshBtnStatus();
    }, this); //删除订单
 
    this.addGlobalEvent(VoyageEvent.DeleteOrderDataEvent, function () {
      this.refreshOrderList();
    }, this);
 
    if (this.role_assets_event == null) {
      if (this.role_vo == null) {
        this.role_vo = RoleController.getInstance().getRoleVo();
      }
 
      this.role_assets_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
        if (key == "energy") {
          this.refreshProgressInfo();
        } else if (key == "vip_lev") {
          this.refreshBtnStatus();
        }
      }, this);
    } //刷新道具数量更新
 
 
    this.addGlobalEvent(EventId.ADD_GOODS, function (bag_code, item_list) {
      if (bag_code != BackPackConst.Bag_Code.BACKPACK) return;
      this.checkNeedUpdateItemNum(item_list);
    }, this);
    this.addGlobalEvent(EventId.MODIFY_GOODS_NUM, function (bag_code, item_list) {
      if (bag_code != BackPackConst.Bag_Code.BACKPACK) return;
      this.checkNeedUpdateItemNum(item_list);
    }, this);
    this.addGlobalEvent(EventId.DELETE_GOODS, function (bag_code, item_list) {
      if (bag_code != BackPackConst.Bag_Code.BACKPACK) return;
      this.checkNeedUpdateItemNum(item_list);
    }, this);
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd() {
    //判断本地是否有订单缓存数据,没有则请求
    if (this.model.checkIsHaveOrderData()) {
      this.refreshOrderList();
      this.refreshBtnStatus();
    } else {
      this.ctrl.requestVoyageInfo();
    }
 
    this.refreshProgressInfo();
    this.refreshItemNum();
    this.updateSpecialEffectStatus();
  },
  //更新所有订单列表
  refreshOrderList: function refreshOrderList() {
    var order_data = this.model.getAllOrderList();
 
    if (!order_data || Utils.next(order_data) == null) {
      // this.no_order_image_nd.active = true;
      this.no_order_image_nd.setPosition(0, 0);
 
      if (this.no_order_image_sp == null) {
        this.no_order_image_sp = this.no_order_image_nd.getComponent(cc.Sprite);
        this.loadRes(PathTool.getBigBg("bigbg_3"), function (sp) {
          this.no_order_image_sp.spriteFrame = sp;
        }.bind(this));
      }
 
      this.order_scrollview.setData([]);
    } else {
      var _temp_sort_index;
 
      //排序规则 已完成>可接取>进行中
      var temp_sort_index = (_temp_sort_index = {}, _defineProperty(_temp_sort_index, VoyageConst.Order_Status.Finish, 1), _defineProperty(_temp_sort_index, VoyageConst.Order_Status.Unget, 2), _defineProperty(_temp_sort_index, VoyageConst.Order_Status.Underway, 3), _temp_sort_index);
 
      var sortFunc = function sortFunc(objA, objB) {
        var sort_index_a = temp_sort_index[objA.status];
        var sort_index_b = temp_sort_index[objB.status]; //引导需要订单号为1的放在最前面
 
        if (objA.order_id == 1 && objA.status == VoyageConst.Order_Status.Unget && objB.order_id != 1) {
          return -1;
        } else if (objA.order_id != 1 && objB.order_id == 1 && objB.status == VoyageConst.Order_Status.Unget) {
          return 1;
        } else if (sort_index_a == sort_index_b) {
          //未接取的按照品质排序,已接取和已完成的按照完成时间排序
          if (objA.status == VoyageConst.Order_Status.Unget) {
            return objB.config.quality - objA.config.quality;
          } else {
            return objA.end_time - objB.end_time;
          }
        } else {
          return sort_index_a - sort_index_b;
        }
      };
 
      order_data.sort(sortFunc);
 
      for (var i in order_data) {
        order_data[i].index = i;
      }
 
      this.order_scrollview.setData(order_data); // this.no_order_image_nd.active = false;
 
      this.no_order_image_nd.setPosition(1000, 0);
    }
  },
  //更新刷新按钮状态
  refreshBtnStatus: function refreshBtnStatus() {
    var refresh_config = Config.shipping_data.data_refresh[this.role_vo.vip_lev];
    if (!refresh_config) return;
    var free_times = this.model.getFreeTimes();
    var free_count = refresh_config.free_times; //免费刷新上限
 
    if (free_times < free_count) {
      this.refresh_btn_lb.string = Utils.TI18N("免费刷新");
      this.refresh_btn_img_sp.node.active = false;
      return;
    } //道具
 
 
    var count = BackpackController.getInstance().getModel().getItemNumByBid(this.cost_item_bid);
 
    if (count >= this.cost_item_num) {
      var item_config = Utils.getItemConfig(this.cost_item_bid);
      var res = PathTool.getItemRes(item_config.icon);
      this.refresh_btn_lb.string = cc.js.formatStr("    %d 刷新", this.cost_item_num);
      this.loadRes(res, function (sf_obj) {
        this.refresh_btn_img_sp.spriteFrame = sf_obj;
      }.bind(this));
      this.refresh_btn_img_sp.node.active = true;
      return;
    } //钻石
 
 
    var coin_times = this.model.getCoinTimes();
    var coin_count = refresh_config.all_times;
 
    if (coin_times < coin_count) {
      var bid = refresh_config.expend[0][0];
      var num = refresh_config.expend[0][1];
      var item_config = Utils.getItemConfig(bid);
      var res = PathTool.getItemRes(item_config.icon);
      this.refresh_btn_lb.string = cc.js.formatStr("    %d 刷新", num);
      this.loadRes(res, function (sf_obj) {
        this.refresh_btn_img_sp.spriteFrame = sf_obj;
      }.bind(this));
      this.refresh_btn_img_sp.node.active = true;
      return;
    }
 
    this.refresh_btn_lb.string = Utils.TI18N("刷新");
    this.refresh_btn_img_sp.node.active = false;
  },
  //更新冒险情报进度
  refreshProgressInfo: function refreshProgressInfo() {
    if (this.role_vo) {
      var cur_energy = this.role_vo.energy;
      var max_energy = this.role_vo.energy_max;
      var percent = cur_energy / max_energy;
      this.progress_value_lb.string = cur_energy + "/" + max_energy;
      this.progress_pb.progress = percent;
    }
  },
  //更新刷新道具数量
  refreshItemNum: function refreshItemNum() {
    var count = BackpackController.getInstance().getModel().getItemNumByBid(this.cost_item_bid);
    this.item_count_lb.string = count;
  },
  checkNeedUpdateItemNum: function checkNeedUpdateItemNum(item_list) {
    if (item_list == null || Utils.next(item_list) == null) return;
 
    for (var k in item_list) {
      var v = item_list[k];
 
      if (v.config) {
        var bid = v.config.id;
 
        if (this.cost_item_bid && bid == this.cost_item_bid) {
          this.refreshItemNum();
          this.refreshBtnStatus();
          break;
        }
      }
    }
  },
  //刷新特效显示状态
  updateSpecialEffectStatus: function updateSpecialEffectStatus() {
    var one_time_pri = RoleController.getInstance().getModel().checkPrivilegeStatus(2);
    var three_time_pri = RoleController.getInstance().getModel().checkPrivilegeStatus(3);
 
    if (one_time_pri || three_time_pri) {
      this.handleEffect(true);
    } else {
      this.handleEffect(false);
    }
  },
  //激活特权特效显示
  handleEffect: function handleEffect(status) {
    if (status == false) {
      if (this.special_sk) {
        this.special_sk.setToSetupPose();
        this.special_sk.clearTracks();
      }
    } else {
      if (this.special_sk) {
        var res = cc.js.formatStr("spine/%s/action.atlas", PathTool.getEffectRes(628));
        this.loadRes(res, function (res_object) {
          this.special_sk.skeletonData = res_object;
          this.special_sk.setAnimation(1, PlayerAction.action, true);
        }.bind(this));
      }
    }
  },
  _onClickSpecialBtn: function _onClickSpecialBtn(pos) {
    var tips_str = "";
 
    for (var i = 1; i <= 2; i++) {
      var explain_config = Config.shipping_data.data_explain[i + 1];
 
      if (explain_config) {
        var status = RoleController.getInstance().getModel().checkPrivilegeStatus(i + 1);
        var str = StringUtil.parse(explain_config.desc || "");
 
        if (status) {
          str = str + Utils.TI18N("<color=#249003>                                 (已激活)</c>");
        } else {
          str = str + Utils.TI18N("<color=#c92606>                                 (未激活)</c>");
        }
 
        if (i == 1) {
          tips_str = str;
        } else {
          tips_str = tips_str + "\n\n\n" + str;
        }
      }
    }
 
    require("tips_controller").getInstance().showCommonTips(tips_str, cc.v2(pos.x, pos.y - 80));
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    if (this.order_scrollview) {
      this.order_scrollview.deleteMe();
      this.order_scrollview = null;
    }
 
    if (this.role_assets_event) {
      this.role_vo.unbind(this.role_assets_event);
      this.role_assets_event = null;
      this.role_vo = null;
    }
 
    this.handleEffect(false);
 
    var GuideEvent = require("guide_event");
 
    gcore.GlobalEvent.fire(GuideEvent.CloseTaskEffect);
    this.ctrl.openVoyageMainWindow(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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFx2b3lhZ2VcXHZpZXdcXHZveWFnZV9tYWluX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIkNvbW1vblNjcm9sbFZpZXciLCJWb3lhZ2VDb250cm9sbGVyIiwiVm95YWdlRXZlbnQiLCJCYWNrUGFja0NvbnN0IiwiQmFja3BhY2tDb250cm9sbGVyIiwiVm95YWdlT3JkZXJJdGVtIiwiVm95YWdlQ29uc3QiLCJWb3lhZ2VfbWFpbldpbmRvdyIsImNjIiwiQ2xhc3MiLCJCYXNlVmlldyIsImN0b3IiLCJwcmVmYWJQYXRoIiwiZ2V0UHJlZmFiUGF0aCIsInZpZXdUYWciLCJTQ0VORV9UQUciLCJkaWFsb2d1ZSIsIndpbl90eXBlIiwiV2luVHlwZSIsIkJpZyIsImluaXRDb25maWciLCJyb2xlX3ZvIiwiZ2V0SW5zdGFuY2UiLCJnZXRSb2xlVm8iLCJjdHJsIiwibW9kZWwiLCJnZXRNb2RlbCIsIm9wZW5DYWxsQmFjayIsImJhY2tncm91bmQiLCJzZWVrQ2hpbGQiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsIm1haW5fY29udGFpbmVyIiwidG9wX2JnX3NwIiwiU3ByaXRlIiwibG9hZFJlcyIsImdldEJpZ0JnIiwicmVzIiwic3ByaXRlRnJhbWUiLCJiaW5kIiwicmVmcmVzaF9idG5fbmQiLCJyZWZyZXNoX2J0bl9sYiIsIkxhYmVsIiwicmVmcmVzaF9idG5faW1nX3NwIiwibm9kZSIsImFjdGl2ZSIsInNwZWNpYWxfYnRuX25kIiwiZXhwbGFpbl9idG5fbmQiLCJzcGVjaWFsX3NrIiwic3AiLCJTa2VsZXRvbiIsInByb2dyZXNzX3BiIiwiUHJvZ3Jlc3NCYXIiLCJwcm9ncmVzcyIsInByb2dyZXNzX3ZhbHVlX2xiIiwibm9fb3JkZXJfaW1hZ2VfbmQiLCJjb3N0X2NvbmZpZyIsIkNvbmZpZyIsInNoaXBwaW5nX2RhdGEiLCJkYXRhX2NvbnN0IiwiY29zdF9pdGVtX2JpZCIsInZhbCIsImNvc3RfaXRlbV9udW0iLCJpdGVtX2NvdW50X2xiIiwiaXRlbV9jb25maWciLCJVdGlscyIsImdldEl0ZW1Db25maWciLCJyZXNfaWNvbl9zcCIsIml0ZW1faWNvbl9zcCIsImdldEl0ZW1SZXMiLCJzZl9vYmoiLCJpY29uIiwib3JkZXJfbGlzdF9uZCIsImJnU2l6ZSIsImdldENvbnRlbnRTaXplIiwidGFiX3NpemUiLCJzaXplIiwid2lkdGgiLCJoZWlnaHQiLCJzZXR0aW5nIiwiaXRlbV9jbGFzcyIsInN0YXJ0X3giLCJzcGFjZV94Iiwic3RhcnRfeSIsInNwYWNlX3kiLCJpdGVtX3dpZHRoIiwiaXRlbV9oZWlnaHQiLCJyb3ciLCJjb2wiLCJuZWVkX2R5bmFtaWMiLCJvcmRlcl9zY3JvbGx2aWV3IiwiY3JlYXRlU2Nyb2xsIiwidjIiLCJTY3JvbGxWaWV3RGlyIiwidmVydGljYWwiLCJTY3JvbGxWaWV3U3RhcnRQb3MiLCJ0b3AiLCJyZWdpc3RlckV2ZW50Iiwib25Ub3VjaEVuZCIsIm9wZW5Wb3lhZ2VNYWluV2luZG93Iiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZXZlbnQiLCJwbGF5QnV0dG9uU291bmQiLCJleHBsYWluX2NvbmZpZyIsImRhdGFfZXhwbGFpbiIsInBvcyIsInRvdWNoIiwiZ2V0TG9jYXRpb24iLCJzaG93Q29tbW9uVGlwcyIsIlN0cmluZ1V0aWwiLCJwYXJzZSIsImRlc2MiLCJfb25DbGlja1NwZWNpYWxCdG4iLCJpc19maXJzdCIsImdldEZpcnN0RnJlc2giLCJwXzEiLCJjaGVja1ByaXZpbGVnZVN0YXR1cyIsInBfMiIsInJlZnJlc2hfY29uZmlnIiwiZGF0YV9yZWZyZXNoIiwidmlwX2xldiIsImZyZWVfdGltZXMiLCJnZXRGcmVlVGltZXMiLCJmcmVlX2NvdW50Iiwic2VuZDIzODIwIiwiZnVuIiwib3BlblZpcE1haW5XaW5kb3ciLCJWSVBUQUJDT05TVCIsIlBSSVZJTEVHRSIsInN0ciIsImpzIiwiZm9ybWF0U3RyIiwiVEkxOE4iLCJzaG93IiwiY2hlY2tJc0hhdmVIaWdoZXJFcGljT3JkZXIiLCJyZXF1ZXN0UmVmcmVzaE9yZGVyIiwiYWRkR2xvYmFsRXZlbnQiLCJVcGRhdGVWb3lhZ2VEYXRhRXZlbnQiLCJyZWZyZXNoT3JkZXJMaXN0IiwicmVmcmVzaEJ0blN0YXR1cyIsIkRlbGV0ZU9yZGVyRGF0YUV2ZW50Iiwicm9sZV9hc3NldHNfZXZlbnQiLCJFdmVudElkIiwiVVBEQVRFX1JPTEVfQVRUUklCVVRFIiwia2V5IiwidmFsdWUiLCJyZWZyZXNoUHJvZ3Jlc3NJbmZvIiwiQUREX0dPT0RTIiwiYmFnX2NvZGUiLCJpdGVtX2xpc3QiLCJCYWdfQ29kZSIsIkJBQ0tQQUNLIiwiY2hlY2tOZWVkVXBkYXRlSXRlbU51bSIsIk1PRElGWV9HT09EU19OVU0iLCJERUxFVEVfR09PRFMiLCJvcGVuUm9vdFduZCIsImNoZWNrSXNIYXZlT3JkZXJEYXRhIiwicmVxdWVzdFZveWFnZUluZm8iLCJyZWZyZXNoSXRlbU51bSIsInVwZGF0ZVNwZWNpYWxFZmZlY3RTdGF0dXMiLCJvcmRlcl9kYXRhIiwiZ2V0QWxsT3JkZXJMaXN0IiwibmV4dCIsInNldFBvc2l0aW9uIiwibm9fb3JkZXJfaW1hZ2Vfc3AiLCJnZXRDb21wb25lbnQiLCJzZXREYXRhIiwidGVtcF9zb3J0X2luZGV4IiwiT3JkZXJfU3RhdHVzIiwiRmluaXNoIiwiVW5nZXQiLCJVbmRlcndheSIsInNvcnRGdW5jIiwib2JqQSIsIm9iakIiLCJzb3J0X2luZGV4X2EiLCJzdGF0dXMiLCJzb3J0X2luZGV4X2IiLCJvcmRlcl9pZCIsImNvbmZpZyIsInF1YWxpdHkiLCJlbmRfdGltZSIsInNvcnQiLCJpIiwiaW5kZXgiLCJzdHJpbmciLCJjb3VudCIsImdldEl0ZW1OdW1CeUJpZCIsImNvaW5fdGltZXMiLCJnZXRDb2luVGltZXMiLCJjb2luX2NvdW50IiwiYWxsX3RpbWVzIiwiYmlkIiwiZXhwZW5kIiwibnVtIiwiY3VyX2VuZXJneSIsImVuZXJneSIsIm1heF9lbmVyZ3kiLCJlbmVyZ3lfbWF4IiwicGVyY2VudCIsImsiLCJ2IiwiaWQiLCJvbmVfdGltZV9wcmkiLCJ0aHJlZV90aW1lX3ByaSIsImhhbmRsZUVmZmVjdCIsInNldFRvU2V0dXBQb3NlIiwiY2xlYXJUcmFja3MiLCJnZXRFZmZlY3RSZXMiLCJyZXNfb2JqZWN0Iiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwiUGxheWVyQWN0aW9uIiwiYWN0aW9uIiwidGlwc19zdHIiLCJ4IiwieSIsImNsb3NlQ2FsbEJhY2siLCJkZWxldGVNZSIsInVuYmluZCIsIkd1aWRlRXZlbnQiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIkNsb3NlVGFza0VmZmVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsY0FBYyxHQUFHRCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUUsZ0JBQWdCLEdBQUdGLE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFDQSxJQUFJRyxnQkFBZ0IsR0FBR0gsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlJLFdBQVcsR0FBR0osT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBQ0EsSUFBSUssYUFBYSxHQUFHTCxPQUFPLENBQUMsZ0JBQUQsQ0FBM0I7O0FBQ0EsSUFBSU0sa0JBQWtCLEdBQUdOLE9BQU8sQ0FBQyxxQkFBRCxDQUFoQzs7QUFDQSxJQUFJTyxlQUFlLEdBQUdQLE9BQU8sQ0FBQyxtQkFBRCxDQUE3Qjs7QUFDQSxJQUFJUSxXQUFXLEdBQUdSLE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUVBLElBQUlTLGlCQUFpQixHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUM3QixhQUFTQyxRQURvQjtBQUU3QkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZO0FBQ2QsU0FBS0MsVUFBTCxHQUFrQmYsUUFBUSxD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LCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICDov5nph4zmmK/mj4/ov7Dov5nkuKrnqpfkvZPnmoTkvZznlKjnmoRcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAzLTA3IDExOjIzOjA4XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBDb21tb25TY3JvbGxWaWV3ID0gcmVxdWlyZShcImNvbW1vbl9zY3JvbGx2aWV3XCIpO1xudmFyIFZveWFnZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwidm95YWdlX2NvbnRyb2xsZXJcIik7XG52YXIgVm95YWdlRXZlbnQgPSByZXF1aXJlKFwidm95YWdlX2V2ZW50XCIpO1xudmFyIEJhY2tQYWNrQ29uc3QgPSByZXF1aXJlKFwiYmFja3BhY2tfY29uc3RcIik7XG52YXIgQmFja3BhY2tDb250cm9sbGVyID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnRyb2xsZXJcIik7XG52YXIgVm95YWdlT3JkZXJJdGVtID0gcmVxdWlyZShcInZveWFnZV9vcmRlcl9pdGVtXCIpO1xudmFyIFZveWFnZUNvbnN0ID0gcmVxdWlyZShcInZveWFnZV9jb25zdFwiKTtcblxudmFyIFZveWFnZV9tYWluV2luZG93ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcInZveWFnZVwiLCBcInZveWFnZV9tYWluX3dpbmRvd1wiKTtcbiAgICAgICAgdGhpcy52aWV3VGFnID0gU0NFTkVfVEFHLmRpYWxvZ3VlOyAgICAgICAgICAgICAgICAvL+ivpeeql+S9k+aJgOWxnnVp5bGC57qnLOWFqOWxj3Vp6ZyA6KaB5ZyodWnlsYIs6Z2e5YWo5bGPdWnlnKhkaWFsb2d1ZeWxgizov5nkuKropoHms6jmhI9cbiAgICAgICAgdGhpcy53aW5fdHlwZSA9IFdpblR5cGUuQmlnOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICB0aGlzLmN0cmwgPSBWb3lhZ2VDb250cm9sbGVyLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSB0aGlzLnNlZWtDaGlsZChcImJhY2tncm91bmRcIik7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZC5zY2FsZSA9IEZJVF9TQ0FMRTtcbiAgICAgICAgdGhpcy5tYWluX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKFwibWFpbl9jb250YWluZXJcIik7XG5cbiAgICAgICAgdGhpcy50b3BfYmdfc3AgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInRvcF9iZ1wiLCBjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0QmlnQmcoXCJ0eHRfY25fYmlnYmdfMjJcIiksIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMudG9wX2JnX3NwLnNwcml0ZUZyYW1lID0gcmVzXG4gICAgICAgIH0uYmluZCh0aGlzKSlcblxuICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX25kID0gdGhpcy5zZWVrQ2hpbGQoXCJyZWZyZXNoX2J0blwiKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMucmVmcmVzaF9idG5fbmQsIFwibGFiZWxcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX2ltZ19zcCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMucmVmcmVzaF9idG5fbmQsIFwiaW1nXCIsIGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMucmVmcmVzaF9idG5faW1nX3NwLm5vZGUuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zcGVjaWFsX2J0bl9uZCA9IHRoaXMuc2Vla0NoaWxkKFwic3BlY2lhbF9idG5cIik7XG4gICAgICAgIHRoaXMuZXhwbGFpbl9idG5fbmQgPSB0aGlzLnNlZWtDaGlsZChcImV4cGxhaW5fYnRuXCIpO1xuICAgICAgICB0aGlzLnNwZWNpYWxfc2sgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnNwZWNpYWxfYnRuX25kLCBcInNwZWNpYWxfc2tcIiwgc3AuU2tlbGV0b24pO1xuXG4gICAgICAgIHRoaXMucHJvZ3Jlc3NfcGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInByb2dyZXNzXCIsIGNjLlByb2dyZXNzQmFyKTtcbiAgICAgICAgdGhpcy5wcm9ncmVzc19wYi5wcm9ncmVzcyA9IDA7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NfdmFsdWVfbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInByb2dyZXNzX3ZhbHVlXCIsIGNjLkxhYmVsKTtcblxuICAgICAgICB0aGlzLm5vX29yZGVyX2ltYWdlX25kID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJub19vcmRlcl9pbWFnZVwiKTtcblxuICAgICAgICAvL+WIt+aWsOmBk+WFt+a2iOiAl1xuICAgICAgICB2YXIgY29zdF9jb25maWcgPSBDb25maWcuc2hpcHBpbmdfZGF0YS5kYXRhX2NvbnN0W1wicmVmcmVzaF9jb3N0XCJdO1xuICAgICAgICB0aGlzLmNvc3RfaXRlbV9iaWQgPSBjb3N0X2NvbmZpZy52YWxbMF1bMF07XG4gICAgICAgIHRoaXMuY29zdF9pdGVtX251bSA9IGNvc3RfY29uZmlnLnZhbFswXVsxXTtcbiAgICAgICAgdGhpcy5pdGVtX2NvdW50X2xiID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJpdGVtX2NvdW50XCIsIGNjLkxhYmVsKTtcblxuICAgICAgICB2YXIgaXRlbV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKHRoaXMuY29zdF9pdGVtX2JpZCk7XG5cbiAgICAgICAgdmFyIHJlc19pY29uX3NwID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJyZXNfaWNvblwiLCBjYy5TcHJpdGUpO1xuICAgICAgICB2YXIgaXRlbV9pY29uX3NwID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJpdGVtX2ljb25cIiwgY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEl0ZW1SZXMoNyksIGZ1bmN0aW9uIChzZl9vYmopIHtcbiAgICAgICAgICAgIHJlc19pY29uX3NwLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRJdGVtUmVzKGl0ZW1fY29uZmlnLmljb24pLCBmdW5jdGlvbiAoc2Zfb2JqKSB7XG4gICAgICAgICAgICBpdGVtX2ljb25fc3Auc3ByaXRlRnJhbWUgPSBzZl9vYmo7XG4gICAgICAgIH0uYmluZCh0aGlzKSlcblxuICAgICAgICB2YXIgb3JkZXJfbGlzdF9uZCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9jb250YWluZXIsIFwib3JkZXJfbGlzdFwiKVxuICAgICAgICB2YXIgYmdTaXplID0gb3JkZXJfbGlzdF9uZC5nZXRDb250ZW50U2l6ZSgpO1xuICAgICAgICB2YXIgdGFiX3NpemUgPSBjYy5zaXplKGJnU2l6ZS53aWR0aCAtIDEwLCBiZ1NpemUuaGVpZ2h0IC0gMTApO1xuICAgICAgICB2YXIgc2V0dGluZyA9IHtcbiAgICAgICAgICAgIGl0ZW1fY2xhc3M6IFZveWFnZU9yZGVySXRlbSwgICAgICAvLyDljZXlhYPnsbtcbiAgICAgICAgICAgIHN0YXJ0X3g6IDUsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRY6LW354K5XG4gICAgICAgICAgICBzcGFjZV94OiAwLCAgICAgICAgICAgICAgICAgICAgLy8geOaWueWQkeeahOmXtOmalFxuICAgICAgICAgICAgc3RhcnRfeTogMCwgICAgICAgICAgICAgICAgICAgIC8vIOesrOS4gOS4quWNleWFg+eahFnotbfngrlcbiAgICAgICAgICAgIHNwYWNlX3k6IDAsICAgICAgICAgICAgICAgICAgIC8vIHnmlrnlkJHnmoTpl7TpmpRcbiAgICAgICAgICAgIGl0ZW1fd2lkdGg6IDYzMSwgICAgICAgICAgICAgICAvLyDljZXlhYPnmoTlsLrlr7h3aWR0aFxuICAgICAgICAgICAgaXRlbV9oZWlnaHQ6IDE3MSwgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuGhlaWdodFxuICAgICAgICAgICAgcm93OiAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIOihjOaVsO+8jOS9nOeUqOS6juawtOW5s+a7muWKqOexu+Wei1xuICAgICAgICAgICAgY29sOiAxLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWIl+aVsO+8jOS9nOeUqOS6juWeguebtOa7muWKqOexu+Wei1xuICAgICAgICAgICAgbmVlZF9keW5hbWljOiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcmRlcl9zY3JvbGx2aWV3ID0gbmV3IENvbW1vblNjcm9sbFZpZXcoKVxuICAgICAgICB0aGlzLm9yZGVyX3Njcm9sbHZpZXcuY3JlYXRlU2Nyb2xsKG9yZGVyX2xpc3RfbmQsIGNjLnYyKDAsIDApLCBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsLCBTY3JvbGxWaWV3U3RhcnRQb3MudG9wLCB0YWJfc2l6ZSwgc2V0dGluZywgY2MudjIoMC41LCAwLjUpKVxuXG4gICAgfSxcblxuICAgIC8vIOazqOWGjOS6i+S7tuebkeWQrOeahOaOpeWPoyzkuI3pnIDopoHmiYvliqjosIPnlKgs5aaC5p6c5piv5L2/55SoZ2NvcmUuR2xvYmFsRXZlbnTnm5HlkKws5Y+v5Lul55u05o6l6LCD55SoYWRkR2xvYmFsRXZlbnRcbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5iYWNrZ3JvdW5kLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlblZveWFnZU1haW5XaW5kb3coZmFsc2UpXG4gICAgICAgIH0uYmluZCh0aGlzKSwgMilcblxuICAgICAgICB0aGlzLmV4cGxhaW5fYnRuX25kLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoMSk7XG4gICAgICAgICAgICB2YXIgZXhwbGFpbl9jb25maWcgPSBDb25maWcuc2hpcHBpbmdfZGF0YS5kYXRhX2V4cGxhaW5bMV07XG4gICAgICAgICAgICB2YXIgcG9zID0gZXZlbnQudG91Y2guZ2V0TG9jYXRpb24oKTtcbiAgICAgICAgICAgIGlmIChleHBsYWluX2NvbmZpZylcbiAgICAgICAgICAgICAgICByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuc2hvd0NvbW1vblRpcHMoU3RyaW5nVXRpbC5wYXJzZShleHBsYWluX2NvbmZpZy5kZXNjKSwgcG9zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zcGVjaWFsX2J0bl9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKDEpO1xuICAgICAgICAgICAgdmFyIHBvcyA9IGV2ZW50LnRvdWNoLmdldExvY2F0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNsaWNrU3BlY2lhbEJ0bihwb3MpXG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMucmVmcmVzaF9idG5fbmQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpc19maXJzdCA9IHRoaXMubW9kZWwuZ2V0Rmlyc3RGcmVzaCgpO1xuICAgICAgICAgICAgdmFyIHBfMSA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5jaGVja1ByaXZpbGVnZVN0YXR1cygzKTtcbiAgICAgICAgICAgIHZhciBwXzIgPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuY2hlY2tQcml2aWxlZ2VTdGF0dXMoMik7XG4gICAgICAgICAgICBpZiAoaXNfZmlyc3QgJiYgIXBfMSAmJiAhcF8yKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZnJlc2hfY29uZmlnID0gQ29uZmlnLnNoaXBwaW5nX2RhdGEuZGF0YV9yZWZyZXNoW3RoaXMucm9sZV92by52aXBfbGV2XTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZnJlc2hfY29uZmlnKSByZXR1cm5cbiAgICAgICAgICAgICAgICB2YXIgZnJlZV90aW1lcyA9IHRoaXMubW9kZWwuZ2V0RnJlZVRpbWVzKCk7XG4gICAgICAgICAgICAgICAgdmFyIGZyZWVfY291bnQgPSByZWZyZXNoX2NvbmZpZy5mcmVlX3RpbWVzOy8v5YWN6LS55Yi35paw5LiK6ZmQXG4gICAgICAgICAgICAgICAgaWYgKGZyZWVfdGltZXMgPj0gZnJlZV9jb3VudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZDIzODIwKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmdW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKFwidmlwX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuVmlwTWFpbldpbmRvdyh0cnVlLCBWSVBUQUJDT05TVC5QUklWSUxFR0UpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3BlblZveWFnZU1haW5XaW5kb3coZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuiOt+WPlui/nOiIqueJueadg++8jDxjb2xvcj0jYzkyNjA2Puavj+aXpemmluasoTwvYz7pkrvnn7PjgIHliLfmlrDliLjliLfmlrDlv4Xlh7o8Y29sb3I9I2M5MjYwNj7pq5jlk4HotKg8L2M+6L+c6Iiq5Lu75Yqh77yM5a6M5oiQ5Y+v6I636auY6aKd5aWW5Yqx77yB77yB77yBXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShcImNvbW1vbmFsZXJ0XCIpLnNob3coc3RyLCBVdGlscy5USTE4TihcIueri+WNs+WJjeW+gFwiKSwgZnVuLCBVdGlscy5USTE4TihcIuaui+W/jeaLkue7nVwiKSwgbnVsbCwgMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuY2hlY2tJc0hhdmVIaWdoZXJFcGljT3JkZXIoKSkge1xuICAgICAgICAgICAgICAgIHZhciBmdW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5yZXF1ZXN0UmVmcmVzaE9yZGVyKCk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgdmFyIHN0ciA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuaciee0q+iJsuS7peS4iueahOi/nOiIquS7u+WKoeacquaOpeWPlu+8jOaYr+WQpue7p+e7re+8n1wiKSk7XG4gICAgICAgICAgICAgICAgcmVxdWlyZShcImNvbW1vbmFsZXJ0XCIpLnNob3coc3RyLCBVdGlscy5USTE4TihcIuehruWumlwiKSwgZnVuLCBVdGlscy5USTE4TihcIuWPlua2iFwiKSwgbnVsbCwgMSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RSZWZyZXNoT3JkZXIoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgLy/mm7TmlrDmiYDmnInorqLljZXmlbDmja5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChWb3lhZ2VFdmVudC5VcGRhdGVWb3lhZ2VEYXRhRXZlbnQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE9yZGVyTGlzdCgpXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hCdG5TdGF0dXMoKVxuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIC8v5Yig6Zmk6K6i5Y2VXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoVm95YWdlRXZlbnQuRGVsZXRlT3JkZXJEYXRhRXZlbnQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE9yZGVyTGlzdCgpXG4gICAgICAgIH0sIHRoaXMpXG5cbiAgICAgICAgaWYgKHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm9sZV92byA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSB0aGlzLnJvbGVfdm8uYmluZChFdmVudElkLlVQREFURV9ST0xFX0FUVFJJQlVURSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09IFwiZW5lcmd5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoUHJvZ3Jlc3NJbmZvKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gXCJ2aXBfbGV2XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQnRuU3RhdHVzKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKVxuICAgICAgICB9XG5cbiAgICAgICAgLy/liLfmlrDpgZPlhbfmlbDph4/mm7TmlrBcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChFdmVudElkLkFERF9HT09EUywgZnVuY3Rpb24gKGJhZ19jb2RlLCBpdGVtX2xpc3QpIHtcbiAgICAgICAgICAgIGlmIChiYWdfY29kZSAhPSBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLKSByZXR1cm5cbiAgICAgICAgICAgIHRoaXMuY2hlY2tOZWVkVXBkYXRlSXRlbU51bShpdGVtX2xpc3QpO1xuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoRXZlbnRJZC5NT0RJRllfR09PRFNfTlVNLCBmdW5jdGlvbiAoYmFnX2NvZGUsIGl0ZW1fbGlzdCkge1xuICAgICAgICAgICAgaWYgKGJhZ19jb2RlICE9IEJhY2tQYWNrQ29uc3QuQmFnX0NvZGUuQkFDS1BBQ0spIHJldHVyblxuICAgICAgICAgICAgdGhpcy5jaGVja05lZWRVcGRhdGVJdGVtTnVtKGl0ZW1fbGlzdCk7XG4gICAgICAgIH0sIHRoaXMpXG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChFdmVudElkLkRFTEVURV9HT09EUywgZnVuY3Rpb24gKGJhZ19jb2RlLCBpdGVtX2xpc3QpIHtcbiAgICAgICAgICAgIGlmIChiYWdfY29kZSAhPSBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLKSByZXR1cm5cbiAgICAgICAgICAgIHRoaXMuY2hlY2tOZWVkVXBkYXRlSXRlbU51bShpdGVtX2xpc3QpO1xuICAgICAgICB9LCB0aGlzKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvL+WIpOaWreacrOWcsOaYr+WQpuacieiuouWNlee8k+WtmOaVsOaNru+8jOayoeacieWImeivt+axglxuICAgICAgICBpZiAodGhpcy5tb2RlbC5jaGVja0lzSGF2ZU9yZGVyRGF0YSgpKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hPcmRlckxpc3QoKVxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQnRuU3RhdHVzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3RybC5yZXF1ZXN0Vm95YWdlSW5mbygpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hQcm9ncmVzc0luZm8oKVxuICAgICAgICB0aGlzLnJlZnJlc2hJdGVtTnVtKClcbiAgICAgICAgdGhpcy51cGRhdGVTcGVjaWFsRWZmZWN0U3RhdHVzKClcbiAgICB9LFxuXG4gICAgLy/mm7TmlrDmiYDmnInorqLljZXliJfooahcbiAgICByZWZyZXNoT3JkZXJMaXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvcmRlcl9kYXRhID0gdGhpcy5tb2RlbC5nZXRBbGxPcmRlckxpc3QoKTtcbiAgICAgICAgaWYgKCFvcmRlcl9kYXRhIHx8IFV0aWxzLm5leHQob3JkZXJfZGF0YSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gdGhpcy5ub19vcmRlcl9pbWFnZV9uZC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5ub19vcmRlcl9pbWFnZV9uZC5zZXRQb3NpdGlvbigwLCAwKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5vX29yZGVyX2ltYWdlX3NwID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vX29yZGVyX2ltYWdlX3NwID0gdGhpcy5ub19vcmRlcl9pbWFnZV9uZC5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0QmlnQmcoXCJiaWdiZ18zXCIpLCBmdW5jdGlvbiAoc3ApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub19vcmRlcl9pbWFnZV9zcC5zcHJpdGVGcmFtZSA9IHNwO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3JkZXJfc2Nyb2xsdmlldy5zZXREYXRhKFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8v5o6S5bqP6KeE5YiZIOW3suWujOaIkD7lj6/mjqXlj5Y+6L+b6KGM5LitXG4gICAgICAgICAgICB2YXIgdGVtcF9zb3J0X2luZGV4ID0ge1xuICAgICAgICAgICAgICAgIFtWb3lhZ2VDb25zdC5PcmRlcl9TdGF0dXMuRmluaXNoXTogMSxcbiAgICAgICAgICAgICAgICBbVm95YWdlQ29uc3QuT3JkZXJfU3RhdHVzLlVuZ2V0XTogMixcbiAgICAgICAgICAgICAgICBbVm95YWdlQ29uc3QuT3JkZXJfU3RhdHVzLlVuZGVyd2F5XTogMyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzb3J0RnVuYyA9IGZ1bmN0aW9uIChvYmpBLCBvYmpCKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNvcnRfaW5kZXhfYSA9IHRlbXBfc29ydF9pbmRleFtvYmpBLnN0YXR1c107XG4gICAgICAgICAgICAgICAgdmFyIHNvcnRfaW5kZXhfYiA9IHRlbXBfc29ydF9pbmRleFtvYmpCLnN0YXR1c107XG4gICAgICAgICAgICAgICAgLy/lvJXlr7zpnIDopoHorqLljZXlj7fkuLox55qE5pS+5Zyo5pyA5YmN6Z2iXG4gICAgICAgICAgICAgICAgaWYgKG9iakEub3JkZXJfaWQgPT0gMSAmJiBvYmpBLnN0YXR1cyA9PSBWb3lhZ2VDb25zdC5PcmRlcl9TdGF0dXMuVW5nZXQgJiYgb2JqQi5vcmRlcl9pZCAhPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqQS5vcmRlcl9pZCAhPSAxICYmIG9iakIub3JkZXJfaWQgPT0gMSAmJiBvYmpCLnN0YXR1cyA9PSBWb3lhZ2VDb25zdC5PcmRlcl9TdGF0dXMuVW5nZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvcnRfaW5kZXhfYSA9PSBzb3J0X2luZGV4X2IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy/mnKrmjqXlj5bnmoTmjInnhaflk4HotKjmjpLluo/vvIzlt7LmjqXlj5blkozlt7LlrozmiJDnmoTmjInnhaflrozmiJDml7bpl7TmjpLluo9cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iakEuc3RhdHVzID09IFZveWFnZUNvbnN0Lk9yZGVyX1N0YXR1cy5VbmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iakIuY29uZmlnLnF1YWxpdHkgLSBvYmpBLmNvbmZpZy5xdWFsaXR5XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqQS5lbmRfdGltZSAtIG9iakIuZW5kX3RpbWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0X2luZGV4X2EgLSBzb3J0X2luZGV4X2JcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcmRlcl9kYXRhLnNvcnQoc29ydEZ1bmMpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIG9yZGVyX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBvcmRlcl9kYXRhW2ldLmluZGV4ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3JkZXJfc2Nyb2xsdmlldy5zZXREYXRhKG9yZGVyX2RhdGEpO1xuICAgICAgICAgICAgLy8gdGhpcy5ub19vcmRlcl9pbWFnZV9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubm9fb3JkZXJfaW1hZ2VfbmQuc2V0UG9zaXRpb24oMTAwMCwgMCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/mm7TmlrDliLfmlrDmjInpkq7nirbmgIFcbiAgICByZWZyZXNoQnRuU3RhdHVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZWZyZXNoX2NvbmZpZyA9IENvbmZpZy5zaGlwcGluZ19kYXRhLmRhdGFfcmVmcmVzaFt0aGlzLnJvbGVfdm8udmlwX2xldl07XG4gICAgICAgIGlmICghcmVmcmVzaF9jb25maWcpIHJldHVyblxuICAgICAgICB2YXIgZnJlZV90aW1lcyA9IHRoaXMubW9kZWwuZ2V0RnJlZVRpbWVzKCk7XG4gICAgICAgIHZhciBmcmVlX2NvdW50ID0gcmVmcmVzaF9jb25maWcuZnJlZV90aW1lczsvL+WFjei0ueWIt+aWsOS4iumZkFxuICAgICAgICBpZiAoZnJlZV90aW1lcyA8IGZyZWVfY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG5fbGIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlhY3otLnliLfmlrBcIilcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG5faW1nX3NwLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8v6YGT5YW3XG4gICAgICAgIHZhciBjb3VudCA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0SXRlbU51bUJ5QmlkKHRoaXMuY29zdF9pdGVtX2JpZCk7XG4gICAgICAgIGlmIChjb3VudCA+PSB0aGlzLmNvc3RfaXRlbV9udW0pIHtcbiAgICAgICAgICAgIHZhciBpdGVtX2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcodGhpcy5jb3N0X2l0ZW1fYmlkKTtcbiAgICAgICAgICAgIHZhciByZXMgPSBQYXRoVG9vbC5nZXRJdGVtUmVzKGl0ZW1fY29uZmlnLmljb24pO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYi5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoXCIgICAgJWQg5Yi35pawXCIsIHRoaXMuY29zdF9pdGVtX251bSk7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAoc2Zfb2JqKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9pbWdfc3Auc3ByaXRlRnJhbWUgPSBzZl9vYmo7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX2ltZ19zcC5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvL+mSu+efs1xuICAgICAgICB2YXIgY29pbl90aW1lcyA9IHRoaXMubW9kZWwuZ2V0Q29pblRpbWVzKCk7XG4gICAgICAgIHZhciBjb2luX2NvdW50ID0gcmVmcmVzaF9jb25maWcuYWxsX3RpbWVzO1xuICAgICAgICBpZiAoY29pbl90aW1lcyA8IGNvaW5fY291bnQpIHtcbiAgICAgICAgICAgIHZhciBiaWQgPSByZWZyZXNoX2NvbmZpZy5leHBlbmRbMF1bMF07XG4gICAgICAgICAgICB2YXIgbnVtID0gcmVmcmVzaF9jb25maWcuZXhwZW5kWzBdWzFdO1xuICAgICAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhiaWQpO1xuICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoaXRlbV9jb25maWcuaWNvbik7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX2xiLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihcIiAgICAlZCDliLfmlrBcIiwgbnVtKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhyZXMsIGZ1bmN0aW9uIChzZl9vYmopIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX2ltZ19zcC5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG5faW1nX3NwLm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWIt+aWsFwiKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9pbWdfc3Aubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgLy/mm7TmlrDlhpLpmanmg4XmiqXov5vluqZcbiAgICByZWZyZXNoUHJvZ3Jlc3NJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvbGVfdm8pIHtcbiAgICAgICAgICAgIHZhciBjdXJfZW5lcmd5ID0gdGhpcy5yb2xlX3ZvLmVuZXJneTtcbiAgICAgICAgICAgIHZhciBtYXhfZW5lcmd5ID0gdGhpcy5yb2xlX3ZvLmVuZXJneV9tYXg7XG4gICAgICAgICAgICB2YXIgcGVyY2VudCA9IGN1cl9lbmVyZ3kgLyBtYXhfZW5lcmd5O1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc192YWx1ZV9sYi5zdHJpbmcgPSBjdXJfZW5lcmd5ICsgXCIvXCIgKyBtYXhfZW5lcmd5O1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc19wYi5wcm9ncmVzcyA9IHBlcmNlbnQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/mm7TmlrDliLfmlrDpgZPlhbfmlbDph49cbiAgICByZWZyZXNoSXRlbU51bTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY291bnQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEl0ZW1OdW1CeUJpZCh0aGlzLmNvc3RfaXRlbV9iaWQpO1xuICAgICAgICB0aGlzLml0ZW1fY291bnRfbGIuc3RyaW5nID0gY291bnQ7XG4gICAgfSxcblxuICAgIGNoZWNrTmVlZFVwZGF0ZUl0ZW1OdW06IGZ1bmN0aW9uIChpdGVtX2xpc3QpIHtcbiAgICAgICAgaWYgKGl0ZW1fbGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQoaXRlbV9saXN0KSA9PSBudWxsKSByZXR1cm5cbiAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtX2xpc3QpIHtcbiAgICAgICAgICAgIHZhciB2ID0gaXRlbV9saXN0W2tdO1xuICAgICAgICAgICAgaWYgKHYuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJpZCA9IHYuY29uZmlnLmlkO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvc3RfaXRlbV9iaWQgJiYgYmlkID09IHRoaXMuY29zdF9pdGVtX2JpZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hJdGVtTnVtKClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQnRuU3RhdHVzKClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/liLfmlrDnibnmlYjmmL7npLrnirbmgIFcbiAgICB1cGRhdGVTcGVjaWFsRWZmZWN0U3RhdHVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvbmVfdGltZV9wcmkgPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuY2hlY2tQcml2aWxlZ2VTdGF0dXMoMik7XG4gICAgICAgIHZhciB0aHJlZV90aW1lX3ByaSA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5jaGVja1ByaXZpbGVnZVN0YXR1cygzKTtcbiAgICAgICAgaWYgKG9uZV90aW1lX3ByaSB8fCB0aHJlZV90aW1lX3ByaSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVFZmZlY3QodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdChmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/mv4DmtLvnibnmnYPnibnmlYjmmL7npLpcbiAgICBoYW5kbGVFZmZlY3Q6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3BlY2lhbF9zaykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9zay5zZXRUb1NldHVwUG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9zay5jbGVhclRyYWNrcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3BlY2lhbF9zaykge1xuICAgICAgICAgICAgICAgIHZhciByZXMgPSBjYy5qcy5mb3JtYXRTdHIoXCJzcGluZS8lcy9hY3Rpb24uYXRsYXNcIiwgUGF0aFRvb2wuZ2V0RWZmZWN0UmVzKDYyOCkpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsX3NrLnNrZWxldG9uRGF0YSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9zay5zZXRBbmltYXRpb24oMSwgUGxheWVyQWN0aW9uLmFjdGlvbiwgdHJ1ZSlcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX29uQ2xpY2tTcGVjaWFsQnRuOiBmdW5jdGlvbiAocG9zKSB7XG4gICAgICAgIHZhciB0aXBzX3N0ciA9IFwiXCI7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IDI7IGkrKykge1xuICAgICAgICAgICAgdmFyIGV4cGxhaW5fY29uZmlnID0gQ29uZmlnLnNoaXBwaW5nX2RhdGEuZGF0YV9leHBsYWluW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChleHBsYWluX2NvbmZpZykge1xuICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuY2hlY2tQcml2aWxlZ2VTdGF0dXMoaSArIDEpO1xuICAgICAgICAgICAgICAgIHZhciBzdHIgPSBTdHJpbmdVdGlsLnBhcnNlKGV4cGxhaW5fY29uZmlnLmRlc2MgfHwgXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHIgKyBVdGlscy5USTE4TihcIjxjb2xvcj0jMjQ5MDAzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIO+8iOW3sua/gOa0u++8iTwvYz5cIilcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHIgKyBVdGlscy5USTE4TihcIjxjb2xvcj0jYzkyNjA2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIO+8iOacqua/gOa0u++8iTwvYz5cIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aXBzX3N0ciA9IHN0cjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aXBzX3N0ciA9IHRpcHNfc3RyICsgXCJcXG5cXG5cXG5cIiArIHN0cjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWlyZShcInRpcHNfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLnNob3dDb21tb25UaXBzKHRpcHNfc3RyLCBjYy52Mihwb3MueCwgcG9zLnkgLSA4MCkpXG4gICAgfSxcblxuICAgIC8vIOWFs+mXreeql+S9k+WbnuiwgyzpnIDopoHlnKjov5nph4zosIPnlKjor6XnqpfkvZPmiYDlsZ5jb250cm9sbGVy55qEY2xvc2Xmlrnms5XmsqHnlKjkuo7nva7nqbror6XnqpfkvZPlrp7kvovlr7nosaFcbiAgICBjbG9zZUNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9yZGVyX3Njcm9sbHZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMub3JkZXJfc2Nyb2xsdmlldy5kZWxldGVNZSgpO1xuICAgICAgICAgICAgdGhpcy5vcmRlcl9zY3JvbGx2aWV3ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yb2xlX2Fzc2V0c19ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5yb2xlX3ZvLnVuYmluZCh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50KTtcbiAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yb2xlX3ZvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdChmYWxzZSk7XG4gICAgICAgIHZhciBHdWlkZUV2ZW50ID0gcmVxdWlyZShcImd1aWRlX2V2ZW50XCIpO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWRlRXZlbnQuQ2xvc2VUYXNrRWZmZWN0KTtcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5Wb3lhZ2VNYWluV2luZG93KGZhbHNlKTtcbiAgICB9LFxufSkiXX0=