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
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/seerpalace/view/seerpalace_change_panel.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, '8aa66VG6x9NoZYTXDQlxD8U', 'seerpalace_change_panel');
// Scripts/mod/seerpalace/view/seerpalace_change_panel.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的 (英雄转换)
// <br/>Create: 2019-03-22 14:37:35
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var SeerpalaceController = require("seerpalace_controller");
 
var HeroConst = require("hero_const");
 
var SeerpalaceConst = require("seerpalace_const");
 
var CommonScrollView = require("common_scrollview");
 
var SeerpalaceEvent = require("seerpalace_event");
 
var HeroController = require("hero_controller");
 
var BaseRole = require("baserole");
 
var Seerpalace_change_Panel = cc.Class({
  "extends": BasePanel,
  ctor: function ctor() {
    var self = this;
    this.prefabPath = PathTool.getPrefabPath("seerpalace", "seerpalace_change_panel");
    this.ctrl = SeerpalaceController.getInstance();
    this.model = SeerpalaceController.getInstance().getModel();
    self.camp_list = {};
    self.cur_role_vo = {};
    self.cur_role_item = null;
    self.cur_camp_type = HeroConst.CampType.eNone;
    self.left_stars_1 = {};
    self.left_stars_2 = {};
    self.right_stars_1 = {};
    self.right_stars_2 = {};
    self.is_first_open = true; // 首次打开界面标识
 
    self.change_partner_id = 0; // 有置换结果但未保存的英雄,0为没有
 
    self.change_new_partner_bid = 0; // 有置换结果但未保存的新英雄,0为没有
 
    self.lock_partner_ids = {}; // 锁住不能置换的英雄
 
    self.cancel_partner_id = 0; // 缓存取消保存的英雄id,取消之后要依然选中它
  },
  // 可以初始化声明一些变量的
  initConfig: function initConfig() {},
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initPanel: function initPanel() {
    var self = this;
    var main_container = self.root_wnd.getChildByName("main_container");
    self.change_btn = main_container.getChildByName("change_btn");
    self.change_btn.active = false;
    self.cancel_btn = main_container.getChildByName("cancel_btn");
    self.cancel_btn.active = false;
    self.save_btn = main_container.getChildByName("save_btn");
    self.save_btn.active = false;
    self.left_panel = main_container.getChildByName("left_panel");
    self.left_panel.active = false;
    self.left_lv_label = this.seekChild("left_lv_label", cc.Label);
    self.right_panel = main_container.getChildByName("right_panel");
    self.right_panel.active = false;
    self.right_lv_label = this.seekChild("right_lv_label", cc.Label);
    self.change_lb = this.seekChild("change_label", cc.Label);
    self.left_effect_node = main_container.getChildByName("left_effect_node");
    self.right_effect_node = main_container.getChildByName("right_effect_node");
    self.role_layout = main_container.getChildByName("role_layout");
    self.toggle_nd = this.seekChild("toogle");
    this.left_name_label = this.seekChild("left_name_label", cc.Label);
    this.right_name_label = this.seekChild("right_name_label", cc.Label);
    this.left_item_sp = this.seekChild("left_item", cc.Sprite);
    this.right_item_sp = this.seekChild("right_item", cc.Sprite);
    this.right_name_label_sp = this.seekChild("right_name_label", cc.Sprite);
    var bgSize = self.role_layout.getContentSize();
    self.btn_summon_sp = this.seekChild("item", cc.Sprite);
    var scale = 0.9;
    var scroll_view_size = cc.size(bgSize.width - 80, 108);
    var setting = {
      item_class: "hero_exhibition_item",
      //-- 单元类
      start_x: 0,
      //-- 第一个单元的X起点
      space_x: 15,
      //-- x方向的间隔
      start_y: 0,
      //-- 第一个单元的Y起点
      space_y: 0,
      //-- y方向的间隔
      item_width: 119 * scale,
      //-- 单元的尺寸width
      item_height: 119 * scale,
      //-- 单元的尺寸height
      row: 1,
      //-- 行数,作用于水平滚动类型
      col: 0,
      //-- 列数,作用于垂直滚动类型
      scale: scale
    };
    this.role_scrollview = new CommonScrollView();
    this.role_scrollview.createScroll(self.role_layout, cc.v2(40, 128), ScrollViewDir.horizontal, ScrollViewStartPos.top, scroll_view_size, setting, cc.v2(0, 0)); // this.role_scrollview.setSwallowTouches(false)
 
    var path = PathTool.getIconPath("item", SeerpalaceConst.Good_XianZhi);
    this.loadRes(path, function (SpriteFrame) {
      this.btn_summon_sp.spriteFrame = SpriteFrame;
    }.bind(this)); // if(this.model.change_info){
    //     self.setData(this.model.change_info)
    // }
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    var _this = this;
 
    var self = this;
    this.change_btn.on("touchend", this._onClickChangeBtn, this);
    this.cancel_btn.on("touchend", this._onClickCancelBtn, this);
    this.save_btn.on("touchend", this._onClickSaveBtn, this);
    this.addGlobalEvent(SeerpalaceEvent.Change_Role_Info_Event, function (data) {
      self.setData(data);
    }.bind(this));
    this.addGlobalEvent(SeerpalaceEvent.Change_Role_Success, function () {
      self.handleRightChangeEffect(true);
    }.bind(this));
 
    var _loop = function _loop(i) {
      var camp_btn = self.toggle_nd.getChildByName("camp_btn_" + i);
 
      if (camp_btn) {
        self.camp_list[i] = camp_btn;
        camp_btn.on("touchend", function () {
          this._onClickCampBtn(i);
 
          Utils.playButtonSound(3);
        }, _this);
      }
    };
 
    for (var i = 1; i <= 4; ++i) {
      _loop(i);
    }
 
    this.ctrl.requestSeerpalaceChangeInfo();
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调可以设置一些数据了
  onShow: function onShow(params) {},
  // 面板设置不可见的回调,这里做一些不可见的屏蔽处理
  onHide: function onHide() {},
  addToParent: function addToParent(status) {
    status = status || false;
 
    if (status) {
      this.show();
    } else {
      this.hide();
    } // if (this.is_first_open) {
    //     // -- 初次打开界面时请求置换相关数据
    //     this.ctrl.requestSeerpalaceChangeInfo(  )
    //     this.is_first_open = false
    // }
 
  },
  // -- 置换
  _onClickChangeBtn: function _onClickChangeBtn() {
    Utils.playButtonSound(1);
    var self = this;
 
    if (self.cur_role_vo && self.cur_role_vo.id) {
      this.ctrl.requestSeerpalaceChangeRole(self.cur_role_vo.id, 1);
    } else {
      message("请先选择一位英雄");
    }
  },
  // -- 取消
  _onClickCancelBtn: function _onClickCancelBtn() {
    Utils.playButtonSound(1);
    var self = this;
 
    if (self.change_partner_id && self.change_partner_id != 0) {
      self.cancel_partner_id = self.change_partner_id;
      this.ctrl.requestSeerpalaceChangeRole(self.change_partner_id, 0);
    }
  },
  // -- 保存
  _onClickSaveBtn: function _onClickSaveBtn() {
    Utils.playButtonSound(1);
    var self = this;
 
    if (self.change_partner_id && self.change_partner_id != 0) {
      this.ctrl.requestSeerpalaceChangeRole(self.change_partner_id, 2);
    }
  },
  setData: function setData(data) {
    var self = this;
    self.data = data || {};
    self.change_partner_id = data.partner_id || 0;
    self.change_new_partner_bid = data.new_partner_bid || 0;
    self.lock_partner_ids = data.partner_ids || {};
    self.role_layout.active = self.change_partner_id == 0;
    self.cancel_btn.active = self.change_partner_id != 0;
    self.save_btn.active = self.change_partner_id != 0;
 
    if (self.change_partner_id == 0) {
      if (!self.cur_index) {
        self.toggle_nd.getChildByName("camp_btn_1").getComponent(cc.Toggle).isChecked = true;
 
        self._onClickCampBtn(1);
      } else {
        self.refreshRoleList();
      }
    } else {
      self.cur_index = null;
      self.cur_role_vo = {};
      self.cur_camp_type = HeroConst.CampType.eNone;
 
      if (self.cur_role_item) {
        self.cur_role_item.setSelected(false);
        self.cur_role_item = null;
      }
    }
 
    self.refreshRoleSpine();
  },
  // -- 刷新英雄头像列表
  refreshRoleList: function refreshRoleList() {
    var self = this;
    self.cur_role_data = [];
    var all_role_list = HeroController.getInstance().getModel().getAllHeroArray();
    var camp_type = HeroConst.CampType.eNone;
 
    if (self.cur_index == SeerpalaceConst.Change_Index_Camp.All) {
      camp_type = HeroConst.CampType.eNone;
    } else if (self.cur_index == SeerpalaceConst.Change_Index_Camp.Water) {
      camp_type = HeroConst.CampType.eWater;
    } else if (self.cur_index == SeerpalaceConst.Change_Index_Camp.Fire) {
      camp_type = HeroConst.CampType.eFire;
    } else if (self.cur_index == SeerpalaceConst.Change_Index_Camp.Wind) {
      camp_type = HeroConst.CampType.eWind;
    }
 
    self.cur_camp_type = camp_type;
 
    for (var k in all_role_list || {}) {
      // k,role_vo in pairs(all_role_list.items or {}) do
      var role_vo = all_role_list[k];
 
      if (role_vo.star == 4 || role_vo.star == 5) {
        var is_lock = self.checkIsLockedRole(role_vo.id);
 
        if (camp_type == HeroConst.CampType.eNone) {
          if (role_vo.camp_type == HeroConst.CampType.eWater || role_vo.camp_type == HeroConst.CampType.eFire || role_vo.camp_type == HeroConst.CampType.eWind) {
            var role_data = Utils.deepCopy(role_vo);
            role_data.is_locked = is_lock;
            self.cur_role_data.push(role_data); // table_insert(self.cur_role_data, role_data)
          }
        } else if (role_vo.camp_type == camp_type) {
          var _role_data = Utils.deepCopy(role_vo);
 
          _role_data.is_locked = is_lock;
          self.cur_role_data.push(_role_data); // table_insert(self.cur_role_data, role_data)
        }
      }
    }
 
    this.cur_role_data.sort(function (objA, objB) {
      var is_lock_a = self.checkIsLockedRole(objA.id);
      var is_lock_b = self.checkIsLockedRole(objB.id);
 
      if (is_lock_a && !is_lock_b) {
        return 1;
      } else if (!is_lock_a && is_lock_b) {
        return -1;
      } else if (objA.star == objB.star) {
        if (objA.camp_type == objB.camp_type) {
          return objB.lev - objA.lev;
        } else {
          return objB.camp_type - objA.camp_type;
        }
      } else {
        return objB.star - objA.star;
      }
    });
 
    if (self.cur_role_item) {
      self.cur_role_item.setSelected(false);
    }
 
    var extendData = {
      scale: 0.85,
      can_click: true,
      from_type: HeroConst.ExhibitionItemType.eHeroChange
    };
    self.role_scrollview.setData(self.cur_role_data, function (cell) {
      this._onClickPartner(cell);
    }.bind(this), extendData);
    self.role_scrollview.addEndCallBack(function () {
      if (self.cur_role_vo && Utils.next(self.cur_role_vo) && self.cur_camp_type != null) {
        // -- 记录了上一次选中英雄的数据,切换到全部或该英雄阵营时,该英雄继续为选中状态
        if (self.cur_role_vo.camp_type == self.cur_camp_type || self.cur_camp_type == HeroConst.CampType.eNone) {
          var list = self.role_scrollview.getItemList();
 
          for (var _k = 0; _k < list.length; ++_k) {
            var v = list[_k];
            var data = v.getData();
 
            if (data.id == self.cur_role_vo.id) {
              self._onClickPartner(v);
 
              break;
            }
          }
        }
      } else if (self.cancel_partner_id && self.cancel_partner_id != 0) {
        //--选中取消置换的英雄
        var _list = self.role_scrollview.getItemList();
 
        for (var _k2 = 0; _k2 < _list.length; ++_k2) {
          var _v = _list[_k2];
 
          var _data = _v.getData();
 
          if (_data.id == self.cancel_partner_id) {
            self._onClickPartner(_v);
 
            self.role_scrollview.jumpToMove(cc.v2(-(_k2 - 3) * (0.85 * 119 + 15), 0), 0.01);
            break;
          }
        }
 
        self.cancel_partner_id = 0;
      }
    }.bind(this));
  },
  _onClickPartner: function _onClickPartner(item) {
    var self = this;
    var vo = item.getData();
 
    if (vo.checkHeroLockTips(true)) {
      return;
    }
 
    if (self.cur_role_item) {
      self.cur_role_item.setSelected(false);
    }
 
    item.setSelected(true);
    self.cur_role_item = item;
    self.cur_role_vo = vo;
    var role_star = vo.star;
    var label_str = "";
    var cost_config = Config.recruit_high_data.data_seerpalace_const["hero_change" + role_star];
 
    if (cost_config && cost_config.val) {
      var bid = cost_config.val[0][0];
      var num = cost_config.val[0][1];
      var item_config = Utils.getItemConfig(bid);
 
      if (item_config) {
        label_str = num + " 置换";
      }
    }
 
    self.change_lb.string = label_str;
    self.refreshRoleSpine();
  },
  // -- 刷新英雄模型显示
  refreshRoleSpine: function refreshRoleSpine() {
    var self = this; // if (self.left_role){
    //     self.left_role.deleteMe()
    //     self.left_role = null
    // }
    // if (self.right_role) {
    //     self.right_role.deleteMe()
    //     self.right_role = null
    // }
    // -- 选中了某一个英雄或者有未保存的重置英雄
 
    if (self.cur_role_vo && Utils.next(self.cur_role_vo) || self.change_partner_id != 0) {
      var left_role_vo = {}; //-- 左侧英雄的数据
 
      if (self.change_partner_id == 0) {
        left_role_vo = self.cur_role_vo;
        self.change_btn.active = true;
        self.handleRightRandomEffect(true);
      } else {
        left_role_vo = HeroController.getInstance().getModel().getHeroById(self.change_partner_id);
        self.change_btn.active = false;
        self.handleRightRandomEffect(false);
      }
 
      if (left_role_vo && (Utils.next(left_role_vo) || Utils.next(left_role_vo) == 0)) {
        if (self.left_role == null) {
          self.left_role = new BaseRole();
          self.left_role.setParent(self.left_panel);
          self.left_role.node.setPosition(cc.v2(100, 180));
        }
 
        self.left_role.setData(BaseRole.type.partner, left_role_vo, PlayerAction.show, true, 0.72);
        var type_res = PathTool.getHeroCampRes(left_role_vo.camp_type);
        var path = PathTool.getUIIconPath("common", type_res);
        self.right_item_sp.spriteFrame = null;
        this.loadRes(path, function (SpriteFrame) {
          self.left_item_sp.spriteFrame = SpriteFrame;
          self.right_item_sp.spriteFrame = SpriteFrame;
        }.bind(this));
        self.left_name_label.string = left_role_vo.name;
        self.left_lv_label.string = left_role_vo.lev;
        self.right_lv_label.string = left_role_vo.lev;
        var right_name = "????";
 
        if (self.change_new_partner_bid != 0) {
          var base_config = Config.partner_data.data_partner_base[self.change_new_partner_bid];
          var right_role_data = {
            bid: self.change_new_partner_bid,
            star: left_role_vo.star
          };
 
          if (self.right_role == null) {
            self.right_role = new BaseRole();
            self.right_role.setParent(self.right_panel);
            self.right_role.node.setPosition(cc.v2(100, 180));
          }
 
          self.right_role.node.active = true;
          self.right_role.setData(BaseRole.type.partner, right_role_data, PlayerAction.show, true, 0.72);
 
          if (base_config && base_config.name) {
            right_name = base_config.name;
          }
        } else {
          right_name = "????";
 
          if (self.right_role) {
            self.right_role.node.active = false;
          }
        }
 
        self.right_name_label.string = right_name;
 
        for (var i in self.left_stars_1) {
          var star = self.left_stars_1[i].node;
          star.active = false;
        }
 
        for (var _i in self.left_stars_2) {
          var _star = self.left_stars_2[_i].node;
          _star.active = false;
        }
 
        for (var _i2 in self.right_stars_1) {
          var _star2 = self.right_stars_1[_i2].node;
          _star2.active = false;
        }
 
        for (var _i3 in self.right_stars_2) {
          var _star3 = self.right_stars_2[_i3].node;
          _star3.active = false;
        }
 
        if (self.left_star10) {
          self.left_star10.node.active = false;
        }
 
        if (self.right_star10) {
          self.right_star10.node.active = false;
        }
 
        var role_star = left_role_vo.star;
 
        var _cStar = function _cStar(star_count, res, star_list, parent_node) {
          var _this2 = this;
 
          var star_pos = SeerpalaceConst.Change_Pos_X[star_count] || {};
 
          for (var _i4 = 0; _i4 < star_count; ++_i4) {
            if (!star_list[_i4]) {
              (function () {
                var star = Utils.createImage(parent_node, res, 0, 338, cc.v2(0.5, 0.5), true);
                self.loadRes(res, function (SpriteFrame) {
                  star.spriteFrame = SpriteFrame;
                }.bind(_this2));
                star_list[_i4] = star;
              })();
            }
 
            star_list[_i4].node.active = true;
            var pos_x = star_pos[_i4];
 
            if (pos_x) {
              star_list[_i4].node.x = pos_x;
            }
          }
        };
 
        if (role_star > 0 && role_star <= 5) {
          var res = PathTool.getUIIconPath("common", "common_90074");
 
          _cStar(role_star, res, self.left_stars_1, self.left_panel);
 
          _cStar(role_star, res, self.right_stars_1, self.right_panel);
        } else if (role_star >= 6 && role_star <= 9) {
          var _res = PathTool.getUIIconPath("common", "common_90075");
 
          var count = role_star - 5;
 
          _cStar(count, _res, self.left_stars_2, self.left_panel);
 
          _cStar(count, _res, self.right_stars_2, self.right_panel);
        } else if (role_star >= 10) {
          var _res2 = PathTool.getUIIconPath("common", "common_90073");
 
          if (!self.left_star10) {
            self.left_star10 = Utils.createImage(self.left_panel, _res2, 100, 338, cc.v2(0.5, 0.5), true, 0, false);
            self.left_star10.setScale(1.2);
          } else {
            self.left_star10.node.active = true;
          }
 
          if (!self.right_star10) {
            self.right_star10 = Utils.createImage(self.right_panel, _res2, 100, 338, cc.v2(0.5, 0.5), true, 0, false);
            self.right_star10.setScale(1.2);
          } else {
            self.right_star10.node.active = true;
          }
        }
      }
 
      self.left_panel.active = true;
      self.right_panel.active = true;
      self.handleLeftEmptyEffect(false);
    } else {
      self.left_panel.active = false;
      self.right_panel.active = false;
      self.change_btn.active = false;
      self.handleLeftEmptyEffect(true);
      self.handleRightRandomEffect(false);
    }
  },
  _onClickCampBtn: function _onClickCampBtn(index) {
    var self = this;
    if (self.cur_index == index) return;
 
    if (self.cur_index) {
      var old_camp_data = self.camp_list[self.cur_index];
 
      if (old_camp_data && old_camp_data.select_image) {
        old_camp_data.select_image.active = false;
      }
    }
 
    var cur_camp_data = self.camp_list[index];
 
    if (cur_camp_data && cur_camp_data.select_image) {
      cur_camp_data.select_image.active = true;
    }
 
    self.cur_index = index;
    self.refreshRoleList();
  },
  // -- 判断是否为锁住的英雄
  checkIsLockedRole: function checkIsLockedRole(id) {
    var self = this;
    var is_locked = false;
 
    for (var i in self.lock_partner_ids) {
      // k,v in pairs(self.lock_partner_ids) do
      var v = self.lock_partner_ids[i];
 
      if (v.id && v.id == id) {
        is_locked = true;
        break;
      }
    }
 
    return is_locked;
  },
  // -- 左边为空时播放的特效
  handleLeftEmptyEffect: function handleLeftEmptyEffect(status) {
    var self = this;
 
    if (status == false) {
      if (self.left_empty_effect) {
        self.left_empty_effect.skeletonData = null;
        this.left_empty_effect.setToSetupPose();
        this.left_empty_effect.clearTracks();
        self.left_empty_effect = null;
      }
    } else {
      if (this.left_effect_node && !this.left_empty_effect) {
        var path = PathTool.getSpinePath("E24001", "action");
        this.loadRes(path, function (skeleton_data) {
          this.left_empty_effect = self.left_effect_node.getChildByName("action").getComponent(sp.Skeleton);
          this.left_empty_effect.skeletonData = skeleton_data;
          this.left_empty_effect.setAnimation(0, "action", true);
        }.bind(this));
      }
    }
  },
  // -- 右边为随机时的特效
  handleRightRandomEffect: function handleRightRandomEffect(status) {
    var self = this;
 
    if (status == false) {
      if (self.right_random_effect) {
        this.right_random_effect.setToSetupPose();
        this.right_random_effect.clearTracks();
        this.right_random_effect.skeletonData = null;
        self.right_random_effect = null;
      }
    } else {
      if (self.right_effect_node && !self.right_random_effect) {
        var path = PathTool.getSpinePath("E24002", "action");
        this.loadRes(path, function (skeleton_data) {
          this.right_random_effect = self.right_effect_node.getChildByName("action").getComponent(sp.Skeleton);
          this.right_random_effect.skeletonData = skeleton_data;
          this.right_random_effect.setAnimation(0, "action", true);
        }.bind(this));
      }
    }
  },
  //-- 右边置换成功的特效
  handleRightChangeEffect: function handleRightChangeEffect(status) {
    var self = this;
 
    if (status == false) {
      if (self.right_change_effect) {
        self.right_change_effect.skeletonData = null;
        this.right_change_effect.setToSetupPose();
        this.right_change_effect.clearTracks();
        self.right_change_effect = null;
      }
    } else {
      if (self.right_effect_node && !self.right_change_effect) {
        var path = PathTool.getSpinePath("E24003", "action");
        this.loadRes(path, function (skeleton_data) {
          self.right_change_effect = self.right_effect_node.getChildByName("action1").getComponent(sp.Skeleton);
          self.right_change_effect.skeletonData = skeleton_data;
          self.right_change_effect.setAnimation(0, "action", false);
        }.bind(this));
      } else if (self.right_change_effect) {
        self.right_change_effect.setAnimation(0, "action", false);
      }
    }
  },
  // 当面板从主节点释放掉的调用接口,需要手动调用,而且也一定要调用
  onDelete: function onDelete() {
    var self = this;
 
    if (self.role_change_info_event) {
      gcore.GlobalEvent.unbind(self.role_change_info_event);
      self.role_change_info_event = null;
    }
 
    if (self.change_success_event) {
      gcore.GlobalEvent.unbind(self.change_success_event);
      self.change_success_event = null;
    }
 
    if (self.left_role) {
      self.left_role.deleteMe();
      self.left_role = null;
    }
 
    if (self.right_role) {
      self.right_role.deleteMe();
      self.right_role = null;
    }
 
    this.handleRightRandomEffect(false);
    this.handleLeftEmptyEffect(false);
    this.handleRightChangeEffect(false);
  }
});
module.exports = Seerpalace_change_Panel;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxzZWVycGFsYWNlXFx2aWV3XFxzZWVycGFsYWNlX2NoYW5nZV9wYW5lbC5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJTZWVycGFsYWNlQ29udHJvbGxlciIsIkhlcm9Db25zdCIsIlNlZXJwYWxhY2VDb25zdCIsIkNvbW1vblNjcm9sbFZpZXciLCJTZWVycGFsYWNlRXZlbnQiLCJIZXJvQ29udHJvbGxlciIsIkJhc2VSb2xlIiwiU2VlcnBhbGFjZV9jaGFuZ2VfUGFuZWwiLCJjYyIsIkNsYXNzIiwiQmFzZVBhbmVsIiwiY3RvciIsInNlbGYiLCJwcmVmYWJQYXRoIiwiZ2V0UHJlZmFiUGF0aCIsImN0cmwiLCJnZXRJbnN0YW5jZSIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJjYW1wX2xpc3QiLCJjdXJfcm9sZV92byIsImN1cl9yb2xlX2l0ZW0iLCJjdXJfY2FtcF90eXBlIiwiQ2FtcFR5cGUiLCJlTm9uZSIsImxlZnRfc3RhcnNfMSIsImxlZnRfc3RhcnNfMiIsInJpZ2h0X3N0YXJzXzEiLCJyaWdodF9zdGFyc18yIiwiaXNfZmlyc3Rfb3BlbiIsImNoYW5nZV9wYXJ0bmVyX2lkIiwiY2hhbmdlX25ld19wYXJ0bmVyX2JpZCIsImxvY2tfcGFydG5lcl9pZHMiLCJjYW5jZWxfcGFydG5lcl9pZCIsImluaXRDb25maWciLCJpbml0UGFuZWwiLCJtYWluX2NvbnRhaW5lciIsInJvb3Rfd25kIiwiZ2V0Q2hpbGRCeU5hbWUiLCJjaGFuZ2VfYnRuIiwiYWN0aXZlIiwiY2FuY2VsX2J0biIsInNhdmVfYnRuIiwibGVmdF9wYW5lbCIsImxlZnRfbHZfbGFiZWwiLCJzZWVrQ2hpbGQiLCJMYWJlbCIsInJpZ2h0X3BhbmVsIiwicmlnaHRfbHZfbGFiZWwiLCJjaGFuZ2VfbGIiLCJsZWZ0X2VmZmVjdF9ub2RlIiwicmlnaHRfZWZmZWN0X25vZGUiLCJyb2xlX2xheW91dCIsInRvZ2dsZV9uZCIsImxlZnRfbmFtZV9sYWJlbCIsInJpZ2h0X25hbWVfbGFiZWwiLCJsZWZ0X2l0ZW1fc3AiLCJTcHJpdGUiLCJyaWdodF9pdGVtX3NwIiwicmlnaHRfbmFtZV9sYWJlbF9zcCIsImJnU2l6ZSIsImdldENvbnRlbnRTaXplIiwiYnRuX3N1bW1vbl9zcCIsInNjYWxlIiwic2Nyb2xsX3ZpZXdfc2l6ZSIsInNpemUiLCJ3aWR0aCIsInNldHRpbmciLCJpdGVtX2NsYXNzIiwic3RhcnRfeCIsInNwYWNlX3giLCJzdGFydF95Iiwic3BhY2VfeSIsIml0ZW1fd2lkdGgiLCJpdGVtX2hlaWdodCIsInJvdyIsImNvbCIsInJvbGVfc2Nyb2xsdmlldyIsImNyZWF0ZVNjcm9sbCIsInYyIiwiU2Nyb2xsVmlld0RpciIsImhvcml6b250YWwiLCJTY3JvbGxWaWV3U3RhcnRQb3MiLCJ0b3AiLCJwYXRoIiwiZ2V0SWNvblBhdGgiLCJHb29kX1hpYW5aaGkiLCJsb2FkUmVzIiwiU3ByaXRlRnJhbWUiLCJzcHJpdGVGcmFtZSIsImJpbmQiLCJyZWdpc3RlckV2ZW50Iiwib24iLCJfb25DbGlja0NoYW5nZUJ0biIsIl9vbkNsaWNrQ2FuY2VsQnRuIiwiX29uQ2xpY2tTYXZlQnRuIiwiYWRkR2xvYmFsRXZlbnQiLCJDaGFuZ2VfUm9sZV9JbmZvX0V2ZW50IiwiZGF0YSIsInNldERhdGEiLCJDaGFuZ2VfUm9sZV9TdWNjZXNzIiwiaGFuZGxlUmlnaHRDaGFuZ2VFZmZlY3QiLCJpIiwiY2FtcF9idG4iLCJfb25DbGlja0NhbXBCdG4iLCJVdGlscyIsInBsYXlCdXR0b25Tb3VuZCIsInJlcXVlc3RTZWVycGFsYWNlQ2hhbmdlSW5mbyIsIm9uU2hvdyIsInBhcmFtcyIsIm9uSGlkZSIsImFkZFRvUGFyZW50Iiwic3RhdHVzIiwic2hvdyIsImhpZGUiLCJpZCIsInJlcXVlc3RTZWVycGFsYWNlQ2hhbmdlUm9sZSIsIm1lc3NhZ2UiLCJwYXJ0bmVyX2lkIiwibmV3X3BhcnRuZXJfYmlkIiwicGFydG5lcl9pZHMiLCJjdXJfaW5kZXgiLCJnZXRDb21wb25lbnQiLCJUb2dnbGUiLCJpc0NoZWNrZWQiLCJyZWZyZXNoUm9sZUxpc3QiLCJzZXRTZWxlY3RlZCIsInJlZnJlc2hSb2xlU3BpbmUiLCJjdXJfcm9sZV9kYXRhIiwiYWxsX3JvbGVfbGlzdCIsImdldEFsbEhlcm9BcnJheSIsImNhbXBfdHlwZSIsIkNoYW5nZV9JbmRleF9DYW1wIiwiQWxsIiwiV2F0ZXIiLCJlV2F0ZXIiLCJGaXJlIiwiZUZpcmUiLCJXaW5kIiwiZVdpbmQiLCJrIiwicm9sZV92byIsInN0YXIiLCJpc19sb2NrIiwiY2hlY2tJc0xvY2tlZFJvbGUiLCJyb2xlX2RhdGEiLCJkZWVwQ29weSIsImlzX2xvY2tlZCIsInB1c2giLCJzb3J0Iiwib2JqQSIsIm9iakIiLCJpc19sb2NrX2EiLCJpc19sb2NrX2IiLCJsZXYiLCJleHRlbmREYXRhIiwiY2FuX2NsaWNrIiwiZnJvbV90eXBlIiwiRXhoaWJpdGlvbkl0ZW1UeXBlIiwiZUhlcm9DaGFuZ2UiLCJjZWxsIiwiX29uQ2xpY2tQYXJ0bmVyIiwiYWRkRW5kQ2FsbEJhY2siLCJuZXh0IiwibGlzdCIsImdldEl0ZW1MaXN0IiwibGVuZ3RoIiwidiIsImdldERhdGEiLCJqdW1wVG9Nb3ZlIiwiaXRlbSIsInZvIiwiY2hlY2tIZXJvTG9ja1RpcHMiLCJyb2xlX3N0YXIiLCJsYWJlbF9zdHIiLCJjb3N0X2NvbmZpZyIsIkNvbmZpZyIsInJlY3J1aXRfaGlnaF9kYXRhIiwiZGF0YV9zZWVycGFsYWNlX2NvbnN0IiwidmFsIiwiYmlkIiwibnVtIiwiaXRlbV9jb25maWciLCJnZXRJdGVtQ29uZmlnIiwic3RyaW5nIiwibGVmdF9yb2xlX3ZvIiwiaGFuZGxlUmlnaHRSYW5kb21FZmZlY3QiLCJnZXRIZXJvQnlJZCIsImxlZnRfcm9sZSIsInNldFBhcmVudCIsIm5vZGUiLCJzZXRQb3NpdGlvbiIsInR5cGUiLCJwYXJ0bmVyIiwiUGxheWVyQWN0aW9uIiwidHlwZV9yZXMiLCJnZXRIZXJvQ2FtcFJlcyIsImdldFVJSWNvblBhdGgiLCJuYW1lIiwicmlnaHRfbmFtZSIsImJhc2VfY29uZmlnIiwicGFydG5lcl9kYXRhIiwiZGF0YV9wYXJ0bmVyX2Jhc2UiLCJyaWdodF9yb2xlX2RhdGEiLCJyaWdodF9yb2xlIiwibGVmdF9zdGFyMTAiLCJyaWdodF9zdGFyMTAiLCJfY1N0YXIiLCJzdGFyX2NvdW50IiwicmVzIiwic3Rhcl9saXN0IiwicGFyZW50X25vZGUiLCJzdGFyX3BvcyIsIkNoYW5nZV9Qb3NfWCIsImNyZWF0ZUltYWdlIiwicG9zX3giLCJ4IiwiY291bnQiLCJzZXRTY2FsZSIsImhhbmRsZUxlZnRFbXB0eUVmZmVjdCIsImluZGV4Iiwib2xkX2NhbXBfZGF0YSIsInNlbGVjdF9pbWFnZSIsImN1cl9jYW1wX2RhdGEiLCJsZWZ0X2VtcHR5X2VmZmVjdCIsInNrZWxldG9uRGF0YSIsInNldFRvU2V0dXBQb3NlIiwiY2xlYXJUcmFja3MiLCJnZXRTcGluZVBhdGgiLCJza2VsZXRvbl9kYXRhIiwic3AiLCJTa2VsZXRvbiIsInNldEFuaW1hdGlvbiIsInJpZ2h0X3JhbmRvbV9lZmZlY3QiLCJyaWdodF9jaGFuZ2VfZWZmZWN0Iiwib25EZWxldGUiLCJyb2xlX2NoYW5nZV9pbmZvX2V2ZW50IiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsInVuYmluZCIsImNoYW5nZV9zdWNjZXNzX2V2ZW50IiwiZGVsZXRlTWUiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsb0JBQW9CLEdBQUdELE9BQU8sQ0FBQyx1QkFBRCxDQUFsQzs7QUFDQSxJQUFJRSxTQUFTLEdBQUdGLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlHLGVBQWUsR0FBR0gsT0FBTyxDQUFDLGtCQUFELENBQTdCOztBQUNBLElBQUlJLGdCQUFnQixHQUFHSixPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUssZUFBZSxHQUFHTCxPQUFPLENBQUMsa0JBQUQsQ0FBN0I7O0FBQ0EsSUFBSU0sY0FBYyxHQUFHTixPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSU8sUUFBUSxHQUFHUCxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJUSx1QkFBdUIsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDbkMsYUFBU0MsU0FEMEI7QUFFbkNDLEVBQUFBLElBQUksRUFBRSxnQkFBWTtBQUNkLFFBQUlDLElBQUksR0FBRyxJQUFYO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQmYsUUFBUSxDQUFDZ0IsYUFBVCxDQUF1QixZQUF2QixFQUFxQyx5QkFBckMsQ0FBbEI7QUFDQSxTQUFLQyxJQUFMLEdBQVlmLG9CQUFvQixDQUFDZ0IsV0FBckIsRUFBWjtBQUNBLFNBQUtDLEtBQUwsR0FBYWpCLG9CQUFvQixDQUFDZ0IsV0FBckIsR0FBbUNFLFFBQW5DLEVBQWI7QUFDQU4sSUFBQUEsSUFBSSxDQUFDTyxTQUFMLEdBQWlCLEVBQWpCO0FBQ0FQLElBQUFBLElBQUksQ0FBQ1EsV0FBTCxHQUFtQixFQUFuQjtBQUNBUixJQUFBQSxJQUFJLENBQUNTLGFBQUwsR0FBcUIsSUFBckI7QUFDQVQsSUFBQUEsSUFBSSxDQUFDVSxhQUFMLEdBQXFCckIsU0FBUyxDQUFDc0IsUUFBVixDQUFtQkMsS0FBeEM7QUFDQVosSUFBQUEsSUFBSSxDQUFDYSxZQUFMLEdBQW9CLEVBQXBCO0FBQ0FiLElBQUFBLElBQUksQ0FBQ2MsWUFBTCxHQUFvQixFQUFwQjtBQUNBZCxJQUFBQSxJQUFJLENBQUNlLGFBQUwsR0FBcUIsRUFBckI7QUFDQWYsSUFBQUEsSUFBSSxDQUFDZ0IsYUFBTCxHQUFxQixFQUFyQjtBQUNBaEIsSUFBQUEsSUFBSSxDQUFDaUIsYUFBTCxHQUFxQixJQUFyQixDQWJjLENBYWE7O0FBQzNCakIsSUFBQUEsSUFBSSxDQUFDa0IsaUJBQUwsR0FBeUIsQ0FBekIsQ0FkYyxDQWNhOztBQUMzQmxCLElBQUFBLElBQUksQ0FBQ21CLHNCQUFMLEdBQThCLENBQTlCLENBZmMsQ0Fla0I7O0FBQ2hDbkIsSUFBQUEsSUFBSSxDQUFDb0IsZ0JBQUwsR0FBd0IsRUFBeEIsQ0FoQmMsQ0FnQmE7O0FBQzNCcEIsSUFBQUEsSUFBSSxDQUFDcUIsaUJBQUwsR0FBeUIsQ0FBekIsQ0FqQmMsQ0FpQmE7QUFDOUIsR0FwQmtDO0FBc0JuQztBQUNBQyxFQUFBQSxVQUFVLEVBQUMsc0JBQVUsQ0FFcEIsQ0F6QmtDO0FBMkJuQztBQUNBQyxFQUFBQSxTQUFTLEVBQUMscUJBQVU7QUFDaEIsUUFBSXZCLElBQUksR0FBRyxJQUFYO0FBQ0EsUUFBSXdCLGNBQWMsR0FBR3hCLElBQUksQ0FBQ3lCLFFBQUwsQ0FBY0MsY0FBZCxDQUE2QixnQkFBN0IsQ0FBckI7QUFDQTFCLElBQUFBLElBQUksQ0FBQzJCLFVBQUwsR0FBa0JILGNBQWMsQ0FBQ0UsY0FBZixDQUE4QixZQUE5QixDQUFsQjtBQUNBMUIsSUFBQUEsSUFBSSxDQUFDMkIsVUFBTCxDQUFnQkMsTUFBaEIsR0FBeUIsS0FBekI7QUFFQTVCLElBQUFBLElBQUksQ0FBQzZCLFVBQUwsR0FBa0JMLGNBQWMsQ0FBQ0UsY0FBZixDQUE4QixZQUE5QixDQUFsQjtBQUVBMUIsSUFBQUEsSUFBSSxDQUFDNkIsVUFBTCxDQUFnQkQsTUFBaEIsR0FBeUIsS0FBekI7QUFFQTVCLElBQUFBLElBQUksQ0FBQzhCLFFBQUwsR0FBZ0JOLGNBQWMsQ0FBQ0UsY0FBZixDQUE4QixVQUE5QixDQUFoQjtBQUNBMUIsSUFBQUEsSUFBSSxDQUFDOEIsUUFBTCxDQUFjRixNQUFkLEdBQXVCLEtBQXZCO0FBRUE1QixJQUFBQSxJQUFJLENBQUMrQixVQUFMLEdBQWtCUCxjQUFjLENBQUNFLGNBQWYsQ0FBOEIsWUFBOUIsQ0FBbEI7QUFDQTFCLElBQUFBLElBQUksQ0FBQytCLFVBQUwsQ0FBZ0JILE1BQWhCLEdBQTBCLEtBQTFCO0FBQ0E1QixJQUFBQSxJQUFJLENBQUNnQyxhQUFMLEdBQXFCLEtBQUtDLFNBQUwsQ0FBZSxlQUFmLEVBQStCckMsRUFBRSxDQUFDc0MsS0FBbEMsQ0FBckI7QUFFQWxDLElBQUFBLElBQUksQ0FBQ21DLFdBQUwsR0FBbUJYLGNBQWMsQ0FBQ0UsY0FBZixDQUE4QixhQUE5QixDQUFuQjtBQUNBMUIsSUFBQUEsSUFBSSxDQUFDbUMsV0FBTCxDQUFpQlAsTUFBakIsR0FBMEIsS0FBMUI7QUFDQTVCLElBQUFBLElBQUksQ0FBQ29DLGNBQUwsR0FBc0IsS0FBS0gsU0FBTCxDQUFlLGdCQUFmLEVBQWdDckMsRUFBRSxDQUFDc0MsS0FBbkMsQ0FBdEI7QUFFQWxDLElBQUFBLElBQUksQ0FBQ3FDLFNBQUwsR0FBaUIsS0FBS0osU0FBTCxDQUFlLGNBQWYsRUFBOEJyQyxFQUFFLENBQUNzQyxLQUFqQyxDQUFqQjtBQUNBbEMsSUFBQUEsSUFBSSxDQUFDc0MsZ0JBQUwsR0FBd0JkLGNBQWMsQ0FBQ0UsY0FBZixDQUE4QixrQkFBOUIsQ0FBeEI7QUFDQTFCLElBQUFBLElBQUksQ0FBQ3VDLGlCQUFMLEdBQXlCZixjQUFjLENBQUNFLGNBQWYsQ0FBOEIsbUJBQTlCLENBQXpCO0FBQ0ExQixJQUFBQSxJQUFJLENBQUN3QyxXQUFMLEdBQW1CaEIsY0FBYyxDQUFDRSxjQUFmLENBQThCLGFBQTlCLENBQW5CO0FBQ0ExQixJQUFBQSxJQUFJLENBQUN5QyxTQUFMLEdBQWlCLEtBQUtSLFNBQUwsQ0FBZSxRQUFmLENBQWpCO0FBQ0EsU0FBS1MsZUFBTCxHQUF1QixLQUFLVCxTQUFMLENBQWUsaUJBQWYsRUFBaUNyQyxFQUFFLENBQUNzQyxLQUFwQyxDQUF2QjtBQUNBLFNBQUtTLGdCQUFMLEdBQXdCLEtBQUtWLFNBQUwsQ0FBZSxrQkFBZixFQUFrQ3JDLEVBQUUsQ0FBQ3NDLEtBQXJDLENBQXhCO0FBQ0EsU0FBS1UsWUFBTCxHQUFvQixLQUFLWCxTQUFMLENBQWUsV0FBZixFQUEyQnJDLEVBQUUsQ0FBQ2lELE1BQTlCLENBQXBCO0FBQ0EsU0FBS0MsYUFBTCxHQUFxQixLQUFLYixTQUFMLENBQWUsWUFBZixFQUE0QnJDLEVBQUUsQ0FBQ2lELE1BQS9CLENBQXJCO0FBQ0EsU0FBS0UsbUJBQUwsR0FBMkIsS0FBS2QsU0FBTCxDQUFlLGtCQUFmLEVBQWtDckMsRUFBRSxDQUFDaUQsTUFBckMsQ0FBM0I7QUFDQSxRQUFJRyxNQUFNLEdBQUdoRCxJQUFJLENBQUN3QyxXQUFMLENBQWlCUyxjQUFqQixFQUFiO0FBQ0FqRCxJQUFBQSxJQUFJLENBQUNrRCxhQUFMLEdBQXFCLEtBQUtqQixTQUFMLENBQWUsTUFBZixFQUFzQnJDLEVBQUUsQ0FBQ2lELE1BQXpCLENBQXJCO0FBQ0EsUUFBSU0sS0FBSyxHQUFHLEdBQVo7QUFDQSxRQUFJQyxnQkFBZ0IsR0FBR3hELEVBQUUsQ0FBQ3lELElBQUgsQ0FBUUwsTUFBTSxDQUFDTSxLQUFQLEdBQWUsRUFBdkIsRUFBMkIsR0FBM0IsQ0FBdkI7QUFDQSxRQUFJQyxPQUFPLEdBQUc7QUFDVkMsTUFBQUEsVUFBVSxFQUFHLHNCQURIO0FBQ2dDO0FBQzFDQyxNQUFBQSxPQUFPLEVBQUcsQ0FGQTtBQUU0QjtBQUN0Q0MsTUFBQUEsT0FBTyxFQUFHLEVBSEE7QUFHNEI7QUFDdENDLE1BQUFBLE9BQU8sRUFBRyxDQUpBO0FBSTRCO0FBQ3RDQyxNQUFBQSxPQUFPLEVBQUcsQ0FMQTtBQUs0QjtBQUN0Q0MsTUFBQUEsVUFBVSxFQUFHLE1BQUlWLEtBTlA7QUFNNEI7QUFDdENXLE1BQUFBLFdBQVcsRUFBRyxNQUFJWCxLQVBSO0FBTzRCO0FBQ3RDWSxNQUFBQSxHQUFHLEVBQUcsQ0FSSTtBQVE0QjtBQUN0Q0MsTUFBQUEsR0FBRyxFQUFHLENBVEk7QUFTNEI7QUFDdENiLE1BQUFBLEtBQUssRUFBR0E7QUFWRSxLQUFkO0FBWUEsU0FBS2MsZUFBTCxHQUF1QixJQUFJMUUsZ0JBQUosRUFBdkI7QUFDQSxTQUFLMEUsZUFBTCxDQUFxQkMsWUFBckIsQ0FBa0NsRSxJQUFJLENBQUN3QyxXQUF2QyxFQUFtRDVDLEVBQUUsQ0FBQ3VFLEVBQUgsQ0FBTSxFQUFOLEVBQVMsR0FBVCxDQUFuRCxFQUFpRUMsYUFBYSxDQUFDQyxVQUEvRSxFQUEwRkMsa0JBQWtCLENBQUNDLEdBQTdHLEVBQWlIbkIsZ0JBQWpILEVBQWtJRyxPQUFsSSxFQUEwSTNELEVBQUUsQ0FBQ3VFLEVBQUgsQ0FBTSxDQUFOLEVBQVMsQ0FBVCxDQUExSSxFQWhEZ0IsQ0FpRGhCOztBQUNBLFFBQUlLLElBQUksR0FBR3RGLFFBQVEsQ0FBQ3VGLFdBQVQsQ0FBcUIsTUFBckIsRUFBNEJuRixlQUFlLENBQUNvRixZQUE1QyxDQUFYO0FBQ0EsU0FBS0MsT0FBTCxDQUFhSCxJQUFiLEVBQWtCLFVBQVNJLFdBQVQsRUFBcUI7QUFDbkMsV0FBSzFCLGFBQUwsQ0FBbUIyQixXQUFuQixHQUFrQ0QsV0FBbEM7QUFDSCxLQUZpQixDQUVoQkUsSUFGZ0IsQ0FFWCxJQUZXLENBQWxCLEVBbkRnQixDQXNEaEI7QUFDQTtBQUNBO0FBRUgsR0F0RmtDO0FBd0ZuQztBQUNBQyxFQUFBQSxhQUFhLEVBQUMseUJBQVU7QUFBQTs7QUFDcEIsUUFBSS9FLElBQUksR0FBRyxJQUFYO0FBQ0EsU0FBSzJCLFVBQUwsQ0FBZ0JxRCxFQUFoQixDQUFtQixVQUFuQixFQUE4QixLQUFLQyxpQkFBbkMsRUFBcUQsSUFBckQ7QUFDQSxTQUFLcEQsVUFBTCxDQUFnQm1ELEVBQWhCLENBQW1CLFVBQW5CLEVBQThCLEtBQUtFLGlCQUFuQyxFQUFxRCxJQUFyRDtBQUNBLFNBQUtwRCxRQUFMLENBQWNrRCxFQUFkLENBQWlCLFVBQWpCLEVBQTRCLEtBQUtHLGVBQWpDLEVBQWlELElBQWpEO0FBQ0EsU0FBS0MsY0FBTCxDQUFvQjVGLGVBQWUsQ0FBQzZGLHNCQUFwQyxFQUEyRCxVQUFVQyxJQUFWLEVBQWU7QUFDdEV0RixNQUFBQSxJQUFJLENBQUN1RixPQUFMLENBQWFELElBQWI7QUFDSCxLQUYwRCxDQUV6RFIsSUFGeUQsQ0FFcEQsSUFGb0QsQ0FBM0Q7QUFHQSxTQUFLTSxjQUFMLENBQW9CNUYsZUFBZSxDQUFDZ0csbUJBQXBDLEVBQXdELFlBQVc7QUFDL0R4RixNQUFBQSxJQUFJLENBQUN5Rix1QkFBTCxDQUE2QixJQUE3QjtBQUNILEtBRnVELENBRXREWCxJQUZzRCxDQUVqRCxJQUZpRCxDQUF4RDs7QUFSb0IsK0JBV1hZLENBWFc7QUFZaEIsVUFBSUMsUUFBUSxHQUFHM0YsSUFBSSxDQUFDeUMsU0FBTCxDQUFlZixjQUFmLENBQThCLGNBQWNnRSxDQUE1QyxDQUFmOztBQUNBLFVBQUlDLFFBQUosRUFBYTtBQUNUM0YsUUFBQUEsSUFBSSxDQUFDTyxTQUFMLENBQWVtRixDQUFmLElBQW9CQyxRQUFwQjtBQUNBQSxRQUFBQSxRQUFRLENBQUNYLEVBQVQsQ0FBWSxVQUFaLEVBQXVCLFlBQVU7QUFDN0IsZUFBS1ksZUFBTCxDQUFxQkYsQ0FBckI7O0FBQ0FHLFVBQUFBLEtBQUssQ0FBQ0MsZUFBTixDQUFzQixDQUF0QjtBQUNILFNBSEQsRUFHRSxLQUhGO0FBSUg7QUFuQmU7O0FBV3BCLFNBQUssSUFBSUosQ0FBQyxHQUFDLENBQVgsRUFBYUEsQ0FBQyxJQUFFLENBQWhCLEVBQWtCLEVBQUVBLENBQXBCLEVBQXNCO0FBQUEsWUFBYkEsQ0FBYTtBQVNyQjs7QUFDRCxTQUFLdkYsSUFBTCxDQUFVNEYsMkJBQVY7QUFDSCxHQS9Ha0M7QUFpSG5DO0FBQ0FDLEVBQUFBLE1BQU0sRUFBQyxnQkFBU0MsTUFBVCxFQUFnQixDQUV0QixDQXBIa0M7QUFzSG5DO0FBQ0FDLEVBQUFBLE1BQU0sRUFBQyxrQkFBVSxDQUVoQixDQXpIa0M7QUEwSG5DQyxFQUFBQSxXQTFIbUMsdUJBMEh0QkMsTUExSHNCLEVBMEhkO0FBQ2pCQSxJQUFBQSxNQUFNLEdBQUdBLE1BQU0sSUFBSSxLQUFuQjs7QUFDQSxRQUFHQSxNQUFILEVBQVU7QUFDTixXQUFLQyxJQUFMO0FBQ0gsS0FGRCxNQUVLO0FBQ0QsV0FBS0MsSUFBTDtBQUNILEtBTmdCLENBT2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0gsR0F0SWtDO0FBdUluQztBQUNBckIsRUFBQUEsaUJBeEltQywrQkF3SWhCO0FBQ2ZZLElBQUFBLEtBQUssQ0FBQ0MsZUFBTixDQUFzQixDQUF0QjtBQUNBLFFBQUk5RixJQUFJLEdBQUcsSUFBWDs7QUFDQSxRQUFJQSxJQUFJLENBQUNRLFdBQUwsSUFBb0JSLElBQUksQ0FBQ1EsV0FBTCxDQUFpQitGLEVBQXpDLEVBQTRDO0FBQ3hDLFdBQUtwRyxJQUFMLENBQVVxRywyQkFBVixDQUFzQ3hHLElBQUksQ0FBQ1EsV0FBTCxDQUFpQitGLEVBQXZELEVBQTJELENBQTNEO0FBQ0gsS0FGRCxNQUVLO0FBQ0RFLE1BQUFBLE9BQU8sQ0FBQyxVQUFELENBQVA7QUFDSDtBQUNKLEdBaEprQztBQWlKbkM7QUFDQXZCLEVBQUFBLGlCQWxKbUMsK0JBa0pkO0FBQ2pCVyxJQUFBQSxLQUFLLENBQUNDLGVBQU4sQ0FBc0IsQ0FBdEI7QUFDQSxRQUFJOUYsSUFBSSxHQUFHLElBQVg7O0FBQ0EsUUFBSUEsSUFBSSxDQUFDa0IsaUJBQUwsSUFBMEJsQixJQUFJLENBQUNrQixpQkFBTCxJQUEwQixDQUF4RCxFQUEwRDtBQUN0RGxCLE1BQUFBLElBQUksQ0FBQ3FCLGlCQUFMLEdBQXlCckIsSUFBSSxDQUFDa0IsaUJBQTlCO0FBQ0EsV0FBS2YsSUFBTCxDQUFVcUcsMkJBQVYsQ0FBc0N4RyxJQUFJLENBQUNrQixpQkFBM0MsRUFBOEQsQ0FBOUQ7QUFDSDtBQUNKLEdBekprQztBQTBKbkM7QUFDQWlFLEVBQUFBLGVBM0ptQyw2QkEySmxCO0FBQ2JVLElBQUFBLEtBQUssQ0FBQ0MsZUFBTixDQUFzQixDQUF0QjtBQUNBLFFBQUk5RixJQUFJLEdBQUcsSUFBWDs7QUFDQSxRQUFJQSxJQUFJLENBQUNrQixpQkFBTCxJQUEwQmxCLElBQUksQ0FBQ2tCLGlCQUFMLElBQTBCLENBQXhELEVBQTJEO0FBQ3ZELFdBQUtmLElBQUwsQ0FBVXFHLDJCQUFWLENBQXNDeEcsSUFBSSxDQUFDa0IsaUJBQTNDLEVBQThELENBQTlEO0FBQ0g7QUFDSixHQWpLa0M7QUFrS25DcUUsRUFBQUEsT0FsS21DLG1CQWtLM0JELElBbEsyQixFQWtLdEI7QUFDVCxRQUFJdEYsSUFBSSxHQUFHLElBQVg7QUFDQUEsSUFBQUEsSUFBSSxDQUFDc0YsSUFBTCxHQUFZQSxJQUFJLElBQUksRUFBcEI7QUFDQXRGLElBQUFBLElBQUksQ0FBQ2tCLGlCQUFMLEdBQXlCb0UsSUFBSSxDQUFDb0IsVUFBTCxJQUFtQixDQUE1QztBQUNBMUcsSUFBQUEsSUFBSSxDQUFDbUIsc0JBQUwsR0FBOEJtRSxJQUFJLENBQUNxQixlQUFMLElBQXdCLENBQXREO0FBQ0EzRyxJQUFBQSxJQUFJLENBQUNvQixnQkFBTCxHQUF3QmtFLElBQUksQ0FBQ3NCLFdBQUwsSUFBb0IsRUFBNUM7QUFFQTVHLElBQUFBLElBQUksQ0FBQ3dDLFdBQUwsQ0FBaUJaLE1BQWpCLEdBQTJCNUIsSUFBSSxDQUFDa0IsaUJBQUwsSUFBMEIsQ0FBckQ7QUFDQWxCLElBQUFBLElBQUksQ0FBQzZCLFVBQUwsQ0FBZ0JELE1BQWhCLEdBQTBCNUIsSUFBSSxDQUFDa0IsaUJBQUwsSUFBMEIsQ0FBcEQ7QUFDQWxCLElBQUFBLElBQUksQ0FBQzhCLFFBQUwsQ0FBY0YsTUFBZCxHQUF3QjVCLElBQUksQ0FBQ2tCLGlCQUFMLElBQTBCLENBQWxEOztBQUNBLFFBQUlsQixJQUFJLENBQUNrQixpQkFBTCxJQUEwQixDQUE5QixFQUFpQztBQUM3QixVQUFJLENBQUNsQixJQUFJLENBQUM2RyxTQUFWLEVBQW9CO0FBQ2hCN0csUUFBQUEsSUFBSSxDQUFDeUMsU0FBTCxDQUFlZixjQUFmLENBQThCLFlBQTlCLEVBQTRDb0YsWUFBNUMsQ0FBeURsSCxFQUFFLENBQUNtSCxNQUE1RCxFQUFvRUMsU0FBcEUsR0FBZ0YsSUFBaEY7O0FBQ0FoSCxRQUFBQSxJQUFJLENBQUM0RixlQUFMLENBQXFCLENBQXJCO0FBQ0gsT0FIRCxNQUdLO0FBQ0Q1RixRQUFBQSxJQUFJLENBQUNpSCxlQUFMO0FBQ0g7QUFDSixLQVBELE1BT0s7QUFDRGpILE1BQUFBLElBQUksQ0FBQzZHLFNBQUwsR0FBaUIsSUFBakI7QUFDQTdHLE1BQUFBLElBQUksQ0FBQ1EsV0FBTCxHQUFtQixFQUFuQjtBQUNBUixNQUFBQSxJQUFJLENBQUNVLGFBQUwsR0FBcUJyQixTQUFTLENBQUNzQixRQUFWLENBQW1CQyxLQUF4Qzs7QUFDQSxVQUFJWixJQUFJLENBQUNTLGFBQVQsRUFBdUI7QUFDbkJULFFBQUFBLElBQUksQ0FBQ1MsYUFBTCxDQUFtQnlHLFdBQW5CLENBQStCLEtBQS9CO0FBQ0FsSCxRQUFBQSxJQUFJLENBQUNTLGFBQUwsR0FBcUIsSUFBckI7QUFDSDtBQUNKOztBQUNEVCxJQUFBQSxJQUFJLENBQUNtSCxnQkFBTDtBQUNILEdBN0xrQztBQThMbkM7QUFDQUYsRUFBQUEsZUEvTG1DLDZCQStMbEI7QUFDYixRQUFJakgsSUFBSSxHQUFHLElBQVg7QUFDQUEsSUFBQUEsSUFBSSxDQUFDb0gsYUFBTCxHQUFxQixFQUFyQjtBQUNBLFFBQUlDLGFBQWEsR0FBRzVILGNBQWMsQ0FBQ1csV0FBZixHQUE2QkUsUUFBN0IsR0FBd0NnSCxlQUF4QyxFQUFwQjtBQUNBLFFBQUlDLFNBQVMsR0FBR2xJLFNBQVMsQ0FBQ3NCLFFBQVYsQ0FBbUJDLEtBQW5DOztBQUNBLFFBQUlaLElBQUksQ0FBQzZHLFNBQUwsSUFBa0J2SCxlQUFlLENBQUNrSSxpQkFBaEIsQ0FBa0NDLEdBQXhELEVBQTREO0FBQ3hERixNQUFBQSxTQUFTLEdBQUdsSSxTQUFTLENBQUNzQixRQUFWLENBQW1CQyxLQUEvQjtBQUNILEtBRkQsTUFFTSxJQUFJWixJQUFJLENBQUM2RyxTQUFMLElBQWtCdkgsZUFBZSxDQUFDa0ksaUJBQWhCLENBQWtDRSxLQUF4RCxFQUE4RDtBQUNoRUgsTUFBQUEsU0FBUyxHQUFHbEksU0FBUyxDQUFDc0IsUUFBVixDQUFtQmdILE1BQS9CO0FBQ0gsS0FGSyxNQUVBLElBQUkzSCxJQUFJLENBQUM2RyxTQUFMLElBQWtCdkgsZUFBZSxDQUFDa0ksaUJBQWhCLENBQWtDSSxJQUF4RCxFQUE2RDtBQUMvREwsTUFBQUEsU0FBUyxHQUFHbEksU0FBUyxDQUFDc0IsUUFBVixDQUFtQmtILEtBQS9CO0FBQ0gsS0FGSyxNQUVBLElBQUk3SCxJQUFJLENBQUM2RyxTQUFMLElBQWtCdkgsZUFBZSxDQUFDa0ksaUJBQWhCLENBQWtDTSxJQUF4RCxFQUE2RDtBQUMvRFAsTUFBQUEsU0FBUyxHQUFHbEksU0FBUyxDQUFDc0IsUUFBVixDQUFtQm9ILEtBQS9CO0FBQ0g7O0FBQ0QvSCxJQUFBQSxJQUFJLENBQUNVLGFBQUwsR0FBcUI2RyxTQUFyQjs7QUFFQSxTQUFLLElBQUlTLENBQVQsSUFBY1gsYUFBYSxJQUFJLEVBQS9CLEVBQWtDO0FBQUM7QUFDL0IsVUFBSVksT0FBTyxHQUFHWixhQUFhLENBQUNXLENBQUQsQ0FBM0I7O0FBQ0EsVUFBSUMsT0FBTyxDQUFDQyxJQUFSLElBQWdCLENBQWhCLElBQXFCRCxPQUFPLENBQUNDLElBQVIsSUFBZ0IsQ0FBekMsRUFBMkM7QUFDdkMsWUFBSUMsT0FBTyxHQUFHbkksSUFBSSxDQUFDb0ksaUJBQUwsQ0FBdUJILE9BQU8sQ0FBQzFCLEVBQS9CLENBQWQ7O0FBQ0EsWUFBSWdCLFNBQVMsSUFBSWxJLFNBQVMsQ0FBQ3NCLFFBQVYsQ0FBbUJDLEtBQXBDLEVBQTBDO0FBQ3RDLGNBQUlxSCxPQUFPLENBQUNWLFNBQVIsSUFBcUJsSSxTQUFTLENBQUNzQixRQUFWLENBQW1CZ0gsTUFBeEMsSUFDSk0sT0FBTyxDQUFDVixTQUFSLElBQXFCbEksU0FBUyxDQUFDc0IsUUFBVixDQUFtQmtILEtBRHBDLElBRUpJLE9BQU8sQ0FBQ1YsU0FBUixJQUFxQmxJLFNBQVMsQ0FBQ3NCLFFBQVYsQ0FBbUJvSCxLQUZ4QyxFQUU4QztBQUMxQyxnQkFBSU0sU0FBUyxHQUFHeEMsS0FBSyxDQUFDeUMsUUFBTixDQUFlTCxPQUFmLENBQWhCO0FBQ0FJLFlBQUFBLFNBQVMsQ0FBQ0UsU0FBVixHQUFzQkosT0FBdEI7QUFDQW5JLFlBQUFBLElBQUksQ0FBQ29ILGFBQUwsQ0FBbUJvQixJQUFuQixDQUF3QkgsU0FBeEIsRUFIMEMsQ0FJMUM7QUFDSDtBQUNKLFNBVEQsTUFTTSxJQUFJSixPQUFPLENBQUNWLFNBQVIsSUFBcUJBLFNBQXpCLEVBQW9DO0FBQ3RDLGNBQUljLFVBQVMsR0FBR3hDLEtBQUssQ0FBQ3lDLFFBQU4sQ0FBZUwsT0FBZixDQUFoQjs7QUFDQUksVUFBQUEsVUFBUyxDQUFDRSxTQUFWLEdBQXNCSixPQUF0QjtBQUNBbkksVUFBQUEsSUFBSSxDQUFDb0gsYUFBTCxDQUFtQm9CLElBQW5CLENBQXdCSCxVQUF4QixFQUhzQyxDQUl0QztBQUNIO0FBRUo7QUFDSjs7QUFDRCxTQUFLakIsYUFBTCxDQUFtQnFCLElBQW5CLENBQXdCLFVBQVVDLElBQVYsRUFBZ0JDLElBQWhCLEVBQXNCO0FBQzFDLFVBQUlDLFNBQVMsR0FBRzVJLElBQUksQ0FBQ29JLGlCQUFMLENBQXVCTSxJQUFJLENBQUNuQyxFQUE1QixDQUFoQjtBQUNBLFVBQUlzQyxTQUFTLEdBQUc3SSxJQUFJLENBQUNvSSxpQkFBTCxDQUF1Qk8sSUFBSSxDQUFDcEMsRUFBNUIsQ0FBaEI7O0FBQ0EsVUFBSXFDLFNBQVMsSUFBSSxDQUFDQyxTQUFsQixFQUE2QjtBQUN6QixlQUFRLENBQVI7QUFDSCxPQUZELE1BRU0sSUFBSSxDQUFDRCxTQUFELElBQWNDLFNBQWxCLEVBQTRCO0FBQzlCLGVBQVEsQ0FBQyxDQUFUO0FBQ0gsT0FGSyxNQUVBLElBQUlILElBQUksQ0FBQ1IsSUFBTCxJQUFhUyxJQUFJLENBQUNULElBQXRCLEVBQTRCO0FBQzlCLFlBQUlRLElBQUksQ0FBQ25CLFNBQUwsSUFBa0JvQixJQUFJLENBQUNwQixTQUEzQixFQUFxQztBQUNqQyxpQkFBT29CLElBQUksQ0FBQ0csR0FBTCxHQUFXSixJQUFJLENBQUNJLEdBQXZCO0FBQ0gsU0FGRCxNQUVLO0FBQ0QsaUJBQU9ILElBQUksQ0FBQ3BCLFNBQUwsR0FBaUJtQixJQUFJLENBQUNuQixTQUE3QjtBQUNIO0FBQ0osT0FOSyxNQU9GO0FBQ0EsZUFBT29CLElBQUksQ0FBQ1QsSUFBTCxHQUFZUSxJQUFJLENBQUNSLElBQXhCO0FBQ0g7QUFDSixLQWpCRDs7QUFtQkEsUUFBSWxJLElBQUksQ0FBQ1MsYUFBVCxFQUF1QjtBQUNuQlQsTUFBQUEsSUFBSSxDQUFDUyxhQUFMLENBQW1CeUcsV0FBbkIsQ0FBK0IsS0FBL0I7QUFDSDs7QUFDRCxRQUFJNkIsVUFBVSxHQUFHO0FBQUM1RixNQUFBQSxLQUFLLEVBQUcsSUFBVDtBQUFlNkYsTUFBQUEsU0FBUyxFQUFHLElBQTNCO0FBQWlDQyxNQUFBQSxTQUFTLEVBQUc1SixTQUFTLENBQUM2SixrQkFBVixDQUE2QkM7QUFBMUUsS0FBakI7QUFDQW5KLElBQUFBLElBQUksQ0FBQ2lFLGVBQUwsQ0FBcUJzQixPQUFyQixDQUE2QnZGLElBQUksQ0FBQ29ILGFBQWxDLEVBQWdELFVBQVNnQyxJQUFULEVBQWM7QUFDMUQsV0FBS0MsZUFBTCxDQUFxQkQsSUFBckI7QUFDSCxLQUYrQyxDQUU5Q3RFLElBRjhDLENBRXpDLElBRnlDLENBQWhELEVBRWFpRSxVQUZiO0FBR0EvSSxJQUFBQSxJQUFJLENBQUNpRSxlQUFMLENBQXFCcUYsY0FBckIsQ0FBb0MsWUFBVztBQUMzQyxVQUFJdEosSUFBSSxDQUFDUSxXQUFMLElBQW9CcUYsS0FBSyxDQUFDMEQsSUFBTixDQUFXdkosSUFBSSxDQUFDUSxXQUFoQixDQUFwQixJQUFvRFIsSUFBSSxDQUFDVSxhQUFMLElBQW9CLElBQTVFLEVBQWtGO0FBQzlFO0FBQ0EsWUFBSVYsSUFBSSxDQUFDUSxXQUFMLENBQWlCK0csU0FBakIsSUFBOEJ2SCxJQUFJLENBQUNVLGFBQW5DLElBQW9EVixJQUFJLENBQUNVLGFBQUwsSUFBc0JyQixTQUFTLENBQUNzQixRQUFWLENBQW1CQyxLQUFqRyxFQUF3RztBQUNwRyxjQUFJNEksSUFBSSxHQUFHeEosSUFBSSxDQUFDaUUsZUFBTCxDQUFxQndGLFdBQXJCLEVBQVg7O0FBQ0EsZUFBSSxJQUFJekIsRUFBQyxHQUFDLENBQVYsRUFBWUEsRUFBQyxHQUFDd0IsSUFBSSxDQUFDRSxNQUFuQixFQUEwQixFQUFFMUIsRUFBNUIsRUFBOEI7QUFDMUIsZ0JBQUkyQixDQUFDLEdBQUdILElBQUksQ0FBQ3hCLEVBQUQsQ0FBWjtBQUNBLGdCQUFJMUMsSUFBSSxHQUFHcUUsQ0FBQyxDQUFDQyxPQUFGLEVBQVg7O0FBQ0EsZ0JBQUl0RSxJQUFJLENBQUNpQixFQUFMLElBQVd2RyxJQUFJLENBQUNRLFdBQUwsQ0FBaUIrRixFQUFoQyxFQUFtQztBQUMvQnZHLGNBQUFBLElBQUksQ0FBQ3FKLGVBQUwsQ0FBcUJNLENBQXJCOztBQUNBO0FBQ0g7QUFDSjtBQUNKO0FBQ0osT0FiRCxNQWFNLElBQUczSixJQUFJLENBQUNxQixpQkFBTCxJQUEwQnJCLElBQUksQ0FBQ3FCLGlCQUFMLElBQTBCLENBQXZELEVBQTBEO0FBQUU7QUFDOUQsWUFBSW1JLEtBQUksR0FBR3hKLElBQUksQ0FBQ2lFLGVBQUwsQ0FBcUJ3RixXQUFyQixFQUFYOztBQUNBLGFBQUksSUFBSXpCLEdBQUMsR0FBQyxDQUFWLEVBQVlBLEdBQUMsR0FBQ3dCLEtBQUksQ0FBQ0UsTUFBbkIsRUFBMEIsRUFBRTFCLEdBQTVCLEVBQThCO0FBQzFCLGNBQUkyQixFQUFDLEdBQUdILEtBQUksQ0FBQ3hCLEdBQUQsQ0FBWjs7QUFDQSxjQUFJMUMsS0FBSSxHQUFHcUUsRUFBQyxDQUFDQyxPQUFGLEVBQVg7O0FBQ0EsY0FBSXRFLEtBQUksQ0FBQ2lCLEVBQUwsSUFBV3ZHLElBQUksQ0FBQ3FCLGlCQUFwQixFQUFzQztBQUNsQ3JCLFlBQUFBLElBQUksQ0FBQ3FKLGVBQUwsQ0FBcUJNLEVBQXJCOztBQUNBM0osWUFBQUEsSUFBSSxDQUFDaUUsZUFBTCxDQUFxQjRGLFVBQXJCLENBQWdDakssRUFBRSxDQUFDdUUsRUFBSCxDQUFNLEVBQUU2RCxHQUFDLEdBQUMsQ0FBSixLQUFRLE9BQUssR0FBTCxHQUFTLEVBQWpCLENBQU4sRUFBNEIsQ0FBNUIsQ0FBaEMsRUFBZ0UsSUFBaEU7QUFDQTtBQUNIO0FBQ0o7O0FBQ0RoSSxRQUFBQSxJQUFJLENBQUNxQixpQkFBTCxHQUF5QixDQUF6QjtBQUNIO0FBQ0osS0EzQm1DLENBMkJsQ3lELElBM0JrQyxDQTJCN0IsSUEzQjZCLENBQXBDO0FBNEJILEdBM1JrQztBQTRSbkN1RSxFQUFBQSxlQTVSbUMsMkJBNFJuQlMsSUE1Um1CLEVBNFJkO0FBQ2pCLFFBQUk5SixJQUFJLEdBQUcsSUFBWDtBQUNBLFFBQUkrSixFQUFFLEdBQUdELElBQUksQ0FBQ0YsT0FBTCxFQUFUOztBQUNBLFFBQUlHLEVBQUUsQ0FBQ0MsaUJBQUgsQ0FBcUIsSUFBckIsQ0FBSixFQUErQjtBQUMzQjtBQUNIOztBQUNELFFBQUloSyxJQUFJLENBQUNTLGFBQVQsRUFBd0I7QUFDcEJULE1BQUFBLElBQUksQ0FBQ1MsYUFBTCxDQUFtQnlHLFdBQW5CLENBQStCLEtBQS9CO0FBQ0g7O0FBQ0Q0QyxJQUFBQSxJQUFJLENBQUM1QyxXQUFMLENBQWlCLElBQWpCO0FBQ0FsSCxJQUFBQSxJQUFJLENBQUNTLGFBQUwsR0FBcUJxSixJQUFyQjtBQUNBOUosSUFBQUEsSUFBSSxDQUFDUSxXQUFMLEdBQW1CdUosRUFBbkI7QUFFQSxRQUFJRSxTQUFTLEdBQUdGLEVBQUUsQ0FBQzdCLElBQW5CO0FBQ0EsUUFBSWdDLFNBQVMsR0FBRyxFQUFoQjtBQUNBLFFBQUlDLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxpQkFBUCxDQUF5QkMscUJBQXpCLENBQStDLGdCQUFnQkwsU0FBL0QsQ0FBbEI7O0FBQ0EsUUFBSUUsV0FBVyxJQUFJQSxXQUFXLENBQUNJLEdBQS9CLEVBQW9DO0FBQ2hDLFVBQUlDLEdBQUcsR0FBR0wsV0FBVyxDQUFDSSxHQUFaLENBQWdCLENBQWhCLEVBQW1CLENBQW5CLENBQVY7QUFDQSxVQUFJRSxHQUFHLEdBQUdOLFdBQVcsQ0FBQ0ksR0FBWixDQUFnQixDQUFoQixFQUFtQixDQUFuQixDQUFWO0FBQ0EsVUFBSUcsV0FBVyxHQUFHN0UsS0FBSyxDQUFDOEUsYUFBTixDQUFvQkgsR0FBcEIsQ0FBbEI7O0FBQ0EsVUFBR0UsV0FBSCxFQUFpQjtBQUNiUixRQUFBQSxTQUFTLEdBQUdPLEdBQUcsR0FBRSxLQUFqQjtBQUNIO0FBQ0o7O0FBQ0R6SyxJQUFBQSxJQUFJLENBQUNxQyxTQUFMLENBQWV1SSxNQUFmLEdBQXdCVixTQUF4QjtBQUNBbEssSUFBQUEsSUFBSSxDQUFDbUgsZ0JBQUw7QUFDSCxHQXRUa0M7QUF1VG5DO0FBQ0FBLEVBQUFBLGdCQXhUbUMsOEJBd1RqQjtBQUNkLFFBQUluSCxJQUFJLEdBQUcsSUFBWCxDQURjLENBRWQ7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUNBLFFBQUlBLElBQUksQ0FBQ1EsV0FBTCxJQUFvQnFGLEtBQUssQ0FBQzBELElBQU4sQ0FBV3ZKLElBQUksQ0FBQ1EsV0FBaEIsQ0FBcEIsSUFBb0RSLElBQUksQ0FBQ2tCLGlCQUFMLElBQTBCLENBQWxGLEVBQXFGO0FBQ2pGLFVBQUkySixZQUFZLEdBQUcsRUFBbkIsQ0FEaUYsQ0FDM0Q7O0FBQ3RCLFVBQUk3SyxJQUFJLENBQUNrQixpQkFBTCxJQUEwQixDQUE5QixFQUFpQztBQUM3QjJKLFFBQUFBLFlBQVksR0FBRzdLLElBQUksQ0FBQ1EsV0FBcEI7QUFDQVIsUUFBQUEsSUFBSSxDQUFDMkIsVUFBTCxDQUFnQkMsTUFBaEIsR0FBeUIsSUFBekI7QUFDQTVCLFFBQUFBLElBQUksQ0FBQzhLLHVCQUFMLENBQTZCLElBQTdCO0FBQ0gsT0FKRCxNQUlLO0FBQ0RELFFBQUFBLFlBQVksR0FBR3BMLGNBQWMsQ0FBQ1csV0FBZixHQUE2QkUsUUFBN0IsR0FBd0N5SyxXQUF4QyxDQUFvRC9LLElBQUksQ0FBQ2tCLGlCQUF6RCxDQUFmO0FBQ0FsQixRQUFBQSxJQUFJLENBQUMyQixVQUFMLENBQWdCQyxNQUFoQixHQUF5QixLQUF6QjtBQUNBNUIsUUFBQUEsSUFBSSxDQUFDOEssdUJBQUwsQ0FBNkIsS0FBN0I7QUFDSDs7QUFDRCxVQUFJRCxZQUFZLEtBQUtoRixLQUFLLENBQUMwRCxJQUFOLENBQVdzQixZQUFYLEtBQTRCaEYsS0FBSyxDQUFDMEQsSUFBTixDQUFXc0IsWUFBWCxLQUE0QixDQUE3RCxDQUFoQixFQUFnRjtBQUM1RSxZQUFHN0ssSUFBSSxDQUFDZ0wsU0FBTCxJQUFrQixJQUFyQixFQUEwQjtBQUN0QmhMLFVBQUFBLElBQUksQ0FBQ2dMLFNBQUwsR0FBaUIsSUFBSXRMLFFBQUosRUFBakI7QUFDQU0sVUFBQUEsSUFBSSxDQUFDZ0wsU0FBTCxDQUFlQyxTQUFmLENBQXlCakwsSUFBSSxDQUFDK0IsVUFBOUI7QUFDQS9CLFVBQUFBLElBQUksQ0FBQ2dMLFNBQUwsQ0FBZUUsSUFBZixDQUFvQkMsV0FBcEIsQ0FBZ0N2TCxFQUFFLENBQUN1RSxFQUFILENBQU0sR0FBTixFQUFXLEdBQVgsQ0FBaEM7QUFDSDs7QUFDRG5FLFFBQUFBLElBQUksQ0FBQ2dMLFNBQUwsQ0FBZXpGLE9BQWYsQ0FBdUI3RixRQUFRLENBQUMwTCxJQUFULENBQWNDLE9BQXJDLEVBQThDUixZQUE5QyxFQUE0RFMsWUFBWSxDQUFDakYsSUFBekUsRUFBK0UsSUFBL0UsRUFBb0YsSUFBcEY7QUFFQSxZQUFJa0YsUUFBUSxHQUFHck0sUUFBUSxDQUFDc00sY0FBVCxDQUF3QlgsWUFBWSxDQUFDdEQsU0FBckMsQ0FBZjtBQUNBLFlBQUkvQyxJQUFJLEdBQUd0RixRQUFRLENBQUN1TSxhQUFULENBQXVCLFFBQXZCLEVBQWdDRixRQUFoQyxDQUFYO0FBQ0F2TCxRQUFBQSxJQUFJLENBQUM4QyxhQUFMLENBQW1CK0IsV0FBbkIsR0FBaUMsSUFBakM7QUFDQSxhQUFLRixPQUFMLENBQWFILElBQWIsRUFBa0IsVUFBU0ksV0FBVCxFQUFxQjtBQUNuQzVFLFVBQUFBLElBQUksQ0FBQzRDLFlBQUwsQ0FBa0JpQyxXQUFsQixHQUFnQ0QsV0FBaEM7QUFDQTVFLFVBQUFBLElBQUksQ0FBQzhDLGFBQUwsQ0FBbUIrQixXQUFuQixHQUFpQ0QsV0FBakM7QUFDSCxTQUhpQixDQUdoQkUsSUFIZ0IsQ0FHWCxJQUhXLENBQWxCO0FBSUE5RSxRQUFBQSxJQUFJLENBQUMwQyxlQUFMLENBQXFCa0ksTUFBckIsR0FBOEJDLFlBQVksQ0FBQ2EsSUFBM0M7QUFDQTFMLFFBQUFBLElBQUksQ0FBQ2dDLGFBQUwsQ0FBbUI0SSxNQUFuQixHQUE0QkMsWUFBWSxDQUFDL0IsR0FBekM7QUFDQTlJLFFBQUFBLElBQUksQ0FBQ29DLGNBQUwsQ0FBb0J3SSxNQUFwQixHQUE2QkMsWUFBWSxDQUFDL0IsR0FBMUM7QUFDQSxZQUFJNkMsVUFBVSxHQUFHLE1BQWpCOztBQUNBLFlBQUkzTCxJQUFJLENBQUNtQixzQkFBTCxJQUErQixDQUFuQyxFQUFzQztBQUNsQyxjQUFJeUssV0FBVyxHQUFHeEIsTUFBTSxDQUFDeUIsWUFBUCxDQUFvQkMsaUJBQXBCLENBQXNDOUwsSUFBSSxDQUFDbUIsc0JBQTNDLENBQWxCO0FBQ0EsY0FBSTRLLGVBQWUsR0FBRztBQUFDdkIsWUFBQUEsR0FBRyxFQUFHeEssSUFBSSxDQUFDbUIsc0JBQVo7QUFBb0MrRyxZQUFBQSxJQUFJLEVBQUcyQyxZQUFZLENBQUMzQztBQUF4RCxXQUF0Qjs7QUFDQSxjQUFHbEksSUFBSSxDQUFDZ00sVUFBTCxJQUFtQixJQUF0QixFQUEyQjtBQUN2QmhNLFlBQUFBLElBQUksQ0FBQ2dNLFVBQUwsR0FBa0IsSUFBSXRNLFFBQUosRUFBbEI7QUFDQU0sWUFBQUEsSUFBSSxDQUFDZ00sVUFBTCxDQUFnQmYsU0FBaEIsQ0FBMEJqTCxJQUFJLENBQUNtQyxXQUEvQjtBQUNBbkMsWUFBQUEsSUFBSSxDQUFDZ00sVUFBTCxDQUFnQmQsSUFBaEIsQ0FBcUJDLFdBQXJCLENBQWlDdkwsRUFBRSxDQUFDdUUsRUFBSCxDQUFNLEdBQU4sRUFBVyxHQUFYLENBQWpDO0FBQ0g7O0FBQ0RuRSxVQUFBQSxJQUFJLENBQUNnTSxVQUFMLENBQWdCZCxJQUFoQixDQUFxQnRKLE1BQXJCLEdBQThCLElBQTlCO0FBQ0E1QixVQUFBQSxJQUFJLENBQUNnTSxVQUFMLENBQWdCekcsT0FBaEIsQ0FBd0I3RixRQUFRLENBQUMwTCxJQUFULENBQWNDLE9BQXRDLEVBQThDVSxlQUE5QyxFQUE4RFQsWUFBWSxDQUFDakYsSUFBM0UsRUFBaUYsSUFBakYsRUFBc0YsSUFBdEY7O0FBQ0EsY0FBSXVGLFdBQVcsSUFBSUEsV0FBVyxDQUFDRixJQUEvQixFQUFvQztBQUNoQ0MsWUFBQUEsVUFBVSxHQUFHQyxXQUFXLENBQUNGLElBQXpCO0FBQ0g7QUFDSixTQWJELE1BYUs7QUFDREMsVUFBQUEsVUFBVSxHQUFHLE1BQWI7O0FBQ0EsY0FBRzNMLElBQUksQ0FBQ2dNLFVBQVIsRUFBbUI7QUFDZmhNLFlBQUFBLElBQUksQ0FBQ2dNLFVBQUwsQ0FBZ0JkLElBQWhCLENBQXFCdEosTUFBckIsR0FBOEIsS0FBOUI7QUFDSDtBQUNKOztBQUNENUIsUUFBQUEsSUFBSSxDQUFDMkMsZ0JBQUwsQ0FBc0JpSSxNQUF0QixHQUErQmUsVUFBL0I7O0FBRUEsYUFBSyxJQUFJakcsQ0FBVCxJQUFjMUYsSUFBSSxDQUFDYSxZQUFuQixFQUFnQztBQUM1QixjQUFJcUgsSUFBSSxHQUFHbEksSUFBSSxDQUFDYSxZQUFMLENBQWtCNkUsQ0FBbEIsRUFBcUJ3RixJQUFoQztBQUNBaEQsVUFBQUEsSUFBSSxDQUFDdEcsTUFBTCxHQUFjLEtBQWQ7QUFDSDs7QUFDRCxhQUFLLElBQUk4RCxFQUFULElBQWMxRixJQUFJLENBQUNjLFlBQW5CLEVBQWdDO0FBQzVCLGNBQUlvSCxLQUFJLEdBQUdsSSxJQUFJLENBQUNjLFlBQUwsQ0FBa0I0RSxFQUFsQixFQUFxQndGLElBQWhDO0FBQ0FoRCxVQUFBQSxLQUFJLENBQUN0RyxNQUFMLEdBQWMsS0FBZDtBQUNIOztBQUNELGFBQUssSUFBSThELEdBQVQsSUFBYzFGLElBQUksQ0FBQ2UsYUFBbkIsRUFBaUM7QUFDN0IsY0FBSW1ILE1BQUksR0FBR2xJLElBQUksQ0FBQ2UsYUFBTCxDQUFtQjJFLEdBQW5CLEVBQXNCd0YsSUFBakM7QUFDQWhELFVBQUFBLE1BQUksQ0FBQ3RHLE1BQUwsR0FBYyxLQUFkO0FBQ0g7O0FBQ0QsYUFBSyxJQUFJOEQsR0FBVCxJQUFjMUYsSUFBSSxDQUFDZ0IsYUFBbkIsRUFBaUM7QUFDN0IsY0FBSWtILE1BQUksR0FBR2xJLElBQUksQ0FBQ2dCLGFBQUwsQ0FBbUIwRSxHQUFuQixFQUFzQndGLElBQWpDO0FBQ0FoRCxVQUFBQSxNQUFJLENBQUN0RyxNQUFMLEdBQWMsS0FBZDtBQUNIOztBQUNELFlBQUk1QixJQUFJLENBQUNpTSxXQUFULEVBQXNCO0FBQ2xCak0sVUFBQUEsSUFBSSxDQUFDaU0sV0FBTCxDQUFpQmYsSUFBakIsQ0FBc0J0SixNQUF0QixHQUErQixLQUEvQjtBQUNIOztBQUNELFlBQUk1QixJQUFJLENBQUNrTSxZQUFULEVBQXNCO0FBQ2xCbE0sVUFBQUEsSUFBSSxDQUFDa00sWUFBTCxDQUFrQmhCLElBQWxCLENBQXVCdEosTUFBdkIsR0FBZ0MsS0FBaEM7QUFDSDs7QUFFRCxZQUFJcUksU0FBUyxHQUFHWSxZQUFZLENBQUMzQyxJQUE3Qjs7QUFDQSxZQUFJaUUsTUFBTSxHQUFHLFNBQVRBLE1BQVMsQ0FBU0MsVUFBVCxFQUFxQkMsR0FBckIsRUFBMEJDLFNBQTFCLEVBQXFDQyxXQUFyQyxFQUFpRDtBQUFBOztBQUMxRCxjQUFJQyxRQUFRLEdBQUdsTixlQUFlLENBQUNtTixZQUFoQixDQUE2QkwsVUFBN0IsS0FBNEMsRUFBM0Q7O0FBQ0EsZUFBSyxJQUFJMUcsR0FBQyxHQUFDLENBQVgsRUFBYUEsR0FBQyxHQUFDMEcsVUFBZixFQUEwQixFQUFFMUcsR0FBNUIsRUFBOEI7QUFDMUIsZ0JBQUksQ0FBQzRHLFNBQVMsQ0FBQzVHLEdBQUQsQ0FBZCxFQUFtQjtBQUFBO0FBQ2Ysb0JBQUl3QyxJQUFJLEdBQUdyQyxLQUFLLENBQUM2RyxXQUFOLENBQWtCSCxXQUFsQixFQUErQkYsR0FBL0IsRUFBb0MsQ0FBcEMsRUFBdUMsR0FBdkMsRUFBNEN6TSxFQUFFLENBQUN1RSxFQUFILENBQU0sR0FBTixFQUFXLEdBQVgsQ0FBNUMsRUFBNkQsSUFBN0QsQ0FBWDtBQUNBbkUsZ0JBQUFBLElBQUksQ0FBQzJFLE9BQUwsQ0FBYTBILEdBQWIsRUFBaUIsVUFBU3pILFdBQVQsRUFBcUI7QUFDbENzRCxrQkFBQUEsSUFBSSxDQUFDckQsV0FBTCxHQUFvQkQsV0FBcEI7QUFDSCxpQkFGZ0IsQ0FFZkUsSUFGZSxDQUVWLE1BRlUsQ0FBakI7QUFHQXdILGdCQUFBQSxTQUFTLENBQUM1RyxHQUFELENBQVQsR0FBZXdDLElBQWY7QUFMZTtBQU1sQjs7QUFDRG9FLFlBQUFBLFNBQVMsQ0FBQzVHLEdBQUQsQ0FBVCxDQUFhd0YsSUFBYixDQUFrQnRKLE1BQWxCLEdBQTJCLElBQTNCO0FBQ0EsZ0JBQUkrSyxLQUFLLEdBQUdILFFBQVEsQ0FBQzlHLEdBQUQsQ0FBcEI7O0FBQ0EsZ0JBQUlpSCxLQUFKLEVBQVU7QUFDTkwsY0FBQUEsU0FBUyxDQUFDNUcsR0FBRCxDQUFULENBQWF3RixJQUFiLENBQWtCMEIsQ0FBbEIsR0FBc0JELEtBQXRCO0FBQ0g7QUFDSjtBQUNKLFNBaEJEOztBQWtCQSxZQUFJMUMsU0FBUyxHQUFHLENBQVosSUFBaUJBLFNBQVMsSUFBSSxDQUFsQyxFQUFxQztBQUNqQyxjQUFJb0MsR0FBRyxHQUFHbk4sUUFBUSxDQUFDdU0sYUFBVCxDQUF1QixRQUF2QixFQUFnQyxjQUFoQyxDQUFWOztBQUNBVSxVQUFBQSxNQUFNLENBQUNsQyxTQUFELEVBQVlvQyxHQUFaLEVBQWlCck0sSUFBSSxDQUFDYSxZQUF0QixFQUFvQ2IsSUFBSSxDQUFDK0IsVUFBekMsQ0FBTjs7QUFDQW9LLFVBQUFBLE1BQU0sQ0FBQ2xDLFNBQUQsRUFBWW9DLEdBQVosRUFBaUJyTSxJQUFJLENBQUNlLGFBQXRCLEVBQXFDZixJQUFJLENBQUNtQyxXQUExQyxDQUFOO0FBQ0gsU0FKRCxNQUlNLElBQUk4SCxTQUFTLElBQUksQ0FBYixJQUFrQkEsU0FBUyxJQUFJLENBQW5DLEVBQXNDO0FBQ3hDLGNBQUlvQyxJQUFHLEdBQUduTixRQUFRLENBQUN1TSxhQUFULENBQXVCLFFBQXZCLEVBQWdDLGNBQWhDLENBQVY7O0FBQ0EsY0FBSW9CLEtBQUssR0FBRzVDLFNBQVMsR0FBRyxDQUF4Qjs7QUFDQWtDLFVBQUFBLE1BQU0sQ0FBQ1UsS0FBRCxFQUFRUixJQUFSLEVBQWFyTSxJQUFJLENBQUNjLFlBQWxCLEVBQWdDZCxJQUFJLENBQUMrQixVQUFyQyxDQUFOOztBQUNBb0ssVUFBQUEsTUFBTSxDQUFDVSxLQUFELEVBQVFSLElBQVIsRUFBYXJNLElBQUksQ0FBQ2dCLGFBQWxCLEVBQWlDaEIsSUFBSSxDQUFDbUMsV0FBdEMsQ0FBTjtBQUNILFNBTEssTUFLQSxJQUFJOEgsU0FBUyxJQUFJLEVBQWpCLEVBQW9CO0FBQ3RCLGNBQUlvQyxLQUFHLEdBQUduTixRQUFRLENBQUN1TSxhQUFULENBQXVCLFFBQXZCLEVBQWdDLGNBQWhDLENBQVY7O0FBQ0EsY0FBSSxDQUFDekwsSUFBSSxDQUFDaU0sV0FBVixFQUF1QjtBQUNuQmpNLFlBQUFBLElBQUksQ0FBQ2lNLFdBQUwsR0FBbUJwRyxLQUFLLENBQUM2RyxXQUFOLENBQWtCMU0sSUFBSSxDQUFDK0IsVUFBdkIsRUFBbUNzSyxLQUFuQyxFQUF3QyxHQUF4QyxFQUE2QyxHQUE3QyxFQUFpRHpNLEVBQUUsQ0FBQ3VFLEVBQUgsQ0FBTSxHQUFOLEVBQVUsR0FBVixDQUFqRCxFQUFnRSxJQUFoRSxFQUFxRSxDQUFyRSxFQUF1RSxLQUF2RSxDQUFuQjtBQUNBbkUsWUFBQUEsSUFBSSxDQUFDaU0sV0FBTCxDQUFpQmEsUUFBakIsQ0FBMEIsR0FBMUI7QUFDSCxXQUhELE1BR0s7QUFDRDlNLFlBQUFBLElBQUksQ0FBQ2lNLFdBQUwsQ0FBaUJmLElBQWpCLENBQXNCdEosTUFBdEIsR0FBK0IsSUFBL0I7QUFDSDs7QUFFRCxjQUFJLENBQUM1QixJQUFJLENBQUNrTSxZQUFWLEVBQXdCO0FBQ3BCbE0sWUFBQUEsSUFBSSxDQUFDa00sWUFBTCxHQUFvQnJHLEtBQUssQ0FBQzZHLFdBQU4sQ0FBa0IxTSxJQUFJLENBQUNtQyxXQUF2QixFQUFvQ2tLLEtBQXBDLEVBQXlDLEdBQXpDLEVBQThDLEdBQTlDLEVBQWtEek0sRUFBRSxDQUFDdUUsRUFBSCxDQUFNLEdBQU4sRUFBVSxHQUFWLENBQWxELEVBQWlFLElBQWpFLEVBQXNFLENBQXRFLEVBQXdFLEtBQXhFLENBQXBCO0FBQ0FuRSxZQUFBQSxJQUFJLENBQUNrTSxZQUFMLENBQWtCWSxRQUFsQixDQUEyQixHQUEzQjtBQUNILFdBSEQsTUFHSztBQUNEOU0sWUFBQUEsSUFBSSxDQUFDa00sWUFBTCxDQUFrQmhCLElBQWxCLENBQXVCdEosTUFBdkIsR0FBZ0MsSUFBaEM7QUFDSDtBQUNKO0FBQ0o7O0FBRUQ1QixNQUFBQSxJQUFJLENBQUMrQixVQUFMLENBQWdCSCxNQUFoQixHQUF5QixJQUF6QjtBQUNBNUIsTUFBQUEsSUFBSSxDQUFDbUMsV0FBTCxDQUFpQlAsTUFBakIsR0FBMEIsSUFBMUI7QUFDQTVCLE1BQUFBLElBQUksQ0FBQytNLHFCQUFMLENBQTJCLEtBQTNCO0FBQ0gsS0EzSEQsTUEySEs7QUFDRC9NLE1BQUFBLElBQUksQ0FBQytCLFVBQUwsQ0FBZ0JILE1BQWhCLEdBQXlCLEtBQXpCO0FBQ0E1QixNQUFBQSxJQUFJLENBQUNtQyxXQUFMLENBQWlCUCxNQUFqQixHQUEwQixLQUExQjtBQUNBNUIsTUFBQUEsSUFBSSxDQUFDMkIsVUFBTCxDQUFnQkMsTUFBaEIsR0FBeUIsS0FBekI7QUFDQTVCLE1BQUFBLElBQUksQ0FBQytNLHFCQUFMLENBQTJCLElBQTNCO0FBQ0EvTSxNQUFBQSxJQUFJLENBQUM4Syx1QkFBTCxDQUE2QixLQUE3QjtBQUNIO0FBQ0osR0F2Y2tDO0FBd2NuQ2xGLEVBQUFBLGVBeGNtQywyQkF3Y2xCb0gsS0F4Y2tCLEVBd2NYO0FBQ3BCLFFBQUloTixJQUFJLEdBQUcsSUFBWDtBQUNBLFFBQUlBLElBQUksQ0FBQzZHLFNBQUwsSUFBa0JtRyxLQUF0QixFQUE4Qjs7QUFFOUIsUUFBSWhOLElBQUksQ0FBQzZHLFNBQVQsRUFBb0I7QUFDaEIsVUFBSW9HLGFBQWEsR0FBR2pOLElBQUksQ0FBQ08sU0FBTCxDQUFlUCxJQUFJLENBQUM2RyxTQUFwQixDQUFwQjs7QUFDQSxVQUFJb0csYUFBYSxJQUFJQSxhQUFhLENBQUNDLFlBQW5DLEVBQWlEO0FBQzdDRCxRQUFBQSxhQUFhLENBQUNDLFlBQWQsQ0FBMkJ0TCxNQUEzQixHQUFvQyxLQUFwQztBQUNIO0FBQ0o7O0FBRUQsUUFBSXVMLGFBQWEsR0FBR25OLElBQUksQ0FBQ08sU0FBTCxDQUFleU0sS0FBZixDQUFwQjs7QUFDQSxRQUFJRyxhQUFhLElBQUlBLGFBQWEsQ0FBQ0QsWUFBbkMsRUFBZ0Q7QUFDNUNDLE1BQUFBLGFBQWEsQ0FBQ0QsWUFBZCxDQUEyQnRMLE1BQTNCLEdBQW9DLElBQXBDO0FBQ0g7O0FBRUQ1QixJQUFBQSxJQUFJLENBQUM2RyxTQUFMLEdBQWlCbUcsS0FBakI7QUFDQWhOLElBQUFBLElBQUksQ0FBQ2lILGVBQUw7QUFDSCxHQTFka0M7QUEyZG5DO0FBQ0FtQixFQUFBQSxpQkE1ZG1DLDZCQTRkaEI3QixFQTVkZ0IsRUE0ZFo7QUFDbkIsUUFBSXZHLElBQUksR0FBRyxJQUFYO0FBQ0EsUUFBSXVJLFNBQVMsR0FBRyxLQUFoQjs7QUFDQSxTQUFJLElBQUk3QyxDQUFSLElBQWExRixJQUFJLENBQUNvQixnQkFBbEIsRUFBbUM7QUFBRTtBQUNqQyxVQUFJdUksQ0FBQyxHQUFHM0osSUFBSSxDQUFDb0IsZ0JBQUwsQ0FBc0JzRSxDQUF0QixDQUFSOztBQUNBLFVBQUlpRSxDQUFDLENBQUNwRCxFQUFGLElBQVFvRCxDQUFDLENBQUNwRCxFQUFGLElBQVFBLEVBQXBCLEVBQXdCO0FBQ3BCZ0MsUUFBQUEsU0FBUyxHQUFHLElBQVo7QUFDQTtBQUNIO0FBQ0o7O0FBQ0QsV0FBT0EsU0FBUDtBQUNILEdBdmVrQztBQXdlbkM7QUFDQXdFLEVBQUFBLHFCQXplbUMsaUNBeWVaM0csTUF6ZVksRUF5ZUo7QUFDM0IsUUFBSXBHLElBQUksR0FBRyxJQUFYOztBQUNBLFFBQUlvRyxNQUFNLElBQUksS0FBZCxFQUFvQjtBQUNoQixVQUFJcEcsSUFBSSxDQUFDb04saUJBQVQsRUFBNEI7QUFDeEJwTixRQUFBQSxJQUFJLENBQUNvTixpQkFBTCxDQUF1QkMsWUFBdkIsR0FBc0MsSUFBdEM7QUFDQSxhQUFLRCxpQkFBTCxDQUF1QkUsY0FBdkI7QUFDQSxhQUFLRixpQkFBTCxDQUF1QkcsV0FBdkI7QUFDQXZOLFFBQUFBLElBQUksQ0FBQ29OLGlCQUFMLEdBQXlCLElBQXpCO0FBQ0g7QUFDSixLQVBELE1BT0s7QUFDRCxVQUFHLEtBQUs5SyxnQkFBTCxJQUF5QixDQUFDLEtBQUs4SyxpQkFBbEMsRUFBb0Q7QUFDaEQsWUFBSTVJLElBQUksR0FBR3RGLFFBQVEsQ0FBQ3NPLFlBQVQsQ0FBc0IsUUFBdEIsRUFBZ0MsUUFBaEMsQ0FBWDtBQUNBLGFBQUs3SSxPQUFMLENBQWFILElBQWIsRUFBbUIsVUFBU2lKLGFBQVQsRUFBdUI7QUFDdEMsZUFBS0wsaUJBQUwsR0FBeUJwTixJQUFJLENBQUNzQyxnQkFBTCxDQUFzQlosY0FBdEIsQ0FBcUMsUUFBckMsRUFBK0NvRixZQUEvQyxDQUE0RDRHLEVBQUUsQ0FBQ0MsUUFBL0QsQ0FBekI7QUFDQSxlQUFLUCxpQkFBTCxDQUF1QkMsWUFBdkIsR0FBc0NJLGFBQXRDO0FBQ0EsZUFBS0wsaUJBQUwsQ0FBdUJRLFlBQXZCLENBQW9DLENBQXBDLEVBQXVDLFFBQXZDLEVBQWlELElBQWpEO0FBQ0gsU0FKa0IsQ0FJakI5SSxJQUppQixDQUlaLElBSlksQ0FBbkI7QUFLSDtBQUNKO0FBQ0osR0E1ZmtDO0FBNmZuQztBQUNBZ0csRUFBQUEsdUJBOWZtQyxtQ0E4ZlYxRSxNQTlmVSxFQThmRjtBQUM3QixRQUFJcEcsSUFBSSxHQUFHLElBQVg7O0FBQ0EsUUFBSW9HLE1BQU0sSUFBSSxLQUFkLEVBQXFCO0FBQ2pCLFVBQUlwRyxJQUFJLENBQUM2TixtQkFBVCxFQUE2QjtBQUN6QixhQUFLQSxtQkFBTCxDQUF5QlAsY0FBekI7QUFDQSxhQUFLTyxtQkFBTCxDQUF5Qk4sV0FBekI7QUFDQSxhQUFLTSxtQkFBTCxDQUF5QlIsWUFBekIsR0FBd0MsSUFBeEM7QUFDQXJOLFFBQUFBLElBQUksQ0FBQzZOLG1CQUFMLEdBQTJCLElBQTNCO0FBQ0g7QUFDSixLQVBELE1BT0s7QUFDRCxVQUFJN04sSUFBSSxDQUFDdUMsaUJBQUwsSUFBMEIsQ0FBQ3ZDLElBQUksQ0FBQzZOLG1CQUFwQyxFQUF3RDtBQUNwRCxZQUFJckosSUFBSSxHQUFHdEYsUUFBUSxDQUFDc08sWUFBVCxDQUFzQixRQUF0QixFQUFnQyxRQUFoQyxDQUFYO0FBQ0EsYUFBSzdJLE9BQUwsQ0FBYUgsSUFBYixFQUFtQixVQUFTaUosYUFBVCxFQUF1QjtBQUN0QyxlQUFLSSxtQkFBTCxHQUEyQjdOLElBQUksQ0FBQ3VDLGlCQUFMLENBQXVCYixjQUF2QixDQUFzQyxRQUF0QyxFQUFnRG9GLFlBQWhELENBQTZENEcsRUFBRSxDQUFDQyxRQUFoRSxDQUEzQjtBQUNBLGVBQUtFLG1CQUFMLENBQXlCUixZQUF6QixHQUF3Q0ksYUFBeEM7QUFDQSxlQUFLSSxtQkFBTCxDQUF5QkQsWUFBekIsQ0FBc0MsQ0FBdEMsRUFBeUMsUUFBekMsRUFBbUQsSUFBbkQ7QUFDSCxTQUprQixDQUlqQjlJLElBSmlCLENBSVosSUFKWSxDQUFuQjtBQUtIO0FBQ0o7QUFDSixHQWpoQmtDO0FBa2hCbkM7QUFDQVcsRUFBQUEsdUJBbmhCbUMsbUNBbWhCVlcsTUFuaEJVLEVBbWhCRjtBQUM3QixRQUFJcEcsSUFBSSxHQUFHLElBQVg7O0FBQ0EsUUFBSW9HLE1BQU0sSUFBSSxLQUFkLEVBQW9CO0FBQ2hCLFVBQUlwRyxJQUFJLENBQUM4TixtQkFBVCxFQUE2QjtBQUN6QjlOLFFBQUFBLElBQUksQ0FBQzhOLG1CQUFMLENBQXlCVCxZQUF6QixHQUF3QyxJQUF4QztBQUNBLGFBQUtTLG1CQUFMLENBQXlCUixjQUF6QjtBQUNBLGFBQUtRLG1CQUFMLENBQXlCUCxXQUF6QjtBQUNBdk4sUUFBQUEsSUFBSSxDQUFDOE4sbUJBQUwsR0FBMkIsSUFBM0I7QUFDSDtBQUNKLEtBUEQsTUFPSztBQUNELFVBQUc5TixJQUFJLENBQUN1QyxpQkFBTCxJQUEwQixDQUFDdkMsSUFBSSxDQUFDOE4sbUJBQW5DLEVBQXVEO0FBQ25ELFlBQUl0SixJQUFJLEdBQUd0RixRQUFRLENBQUNzTyxZQUFULENBQXNCLFFBQXRCLEVBQWdDLFFBQWhDLENBQVg7QUFDQSxhQUFLN0ksT0FBTCxDQUFhSCxJQUFiLEVBQW1CLFVBQVNpSixhQUFULEVBQXVCO0FBQ3RDek4sVUFBQUEsSUFBSSxDQUFDOE4sbUJBQUwsR0FBMkI5TixJQUFJLENBQUN1QyxpQkFBTCxDQUF1QmIsY0FBdkIsQ0FBc0MsU0FBdEMsRUFBaURvRixZQUFqRCxDQUE4RDRHLEVBQUUsQ0FBQ0MsUUFBakUsQ0FBM0I7QUFDQTNOLFVBQUFBLElBQUksQ0FBQzhOLG1CQUFMLENBQXlCVCxZQUF6QixHQUF3Q0ksYUFBeEM7QUFDQXpOLFVBQUFBLElBQUksQ0FBQzhOLG1CQUFMLENBQXlCRixZQUF6QixDQUFzQyxDQUF0QyxFQUF5QyxRQUF6QyxFQUFvRCxLQUFwRDtBQUNILFNBSmtCLENBSWpCOUksSUFKaUIsQ0FJWixJQUpZLENBQW5CO0FBS0gsT0FQRCxNQU9NLElBQUc5RSxJQUFJLENBQUM4TixtQkFBUixFQUE2QjtBQUMvQjlOLFFBQUFBLElBQUksQ0FBQzhOLG1CQUFMLENBQXlCRixZQUF6QixDQUFzQyxDQUF0QyxFQUF5QyxRQUF6QyxFQUFvRCxLQUFwRDtBQUNIO0FBQ0o7QUFFSixHQXppQmtDO0FBMGlCbkM7QUFDQUcsRUFBQUEsUUFBUSxFQUFDLG9CQUFVO0FBQ2YsUUFBSS9OLElBQUksR0FBRyxJQUFYOztBQUNBLFFBQUdBLElBQUksQ0FBQ2dPLHNCQUFSLEVBQStCO0FBQzNCQyxNQUFBQSxLQUFLLENBQUNDLFdBQU4sQ0FBa0JDLE1BQWxCLENBQXlCbk8sSUFBSSxDQUFDZ08sc0JBQTlCO0FBQ0FoTyxNQUFBQSxJQUFJLENBQUNnTyxzQkFBTCxHQUE4QixJQUE5QjtBQUNIOztBQUNELFFBQUdoTyxJQUFJLENBQUNvTyxvQkFBUixFQUE2QjtBQUN6QkgsTUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCQyxNQUFsQixDQUF5Qm5PLElBQUksQ0FBQ29PLG9CQUE5QjtBQUNBcE8sTUFBQUEsSUFBSSxDQUFDb08sb0JBQUwsR0FBNEIsSUFBNUI7QUFDSDs7QUFDRCxRQUFJcE8sSUFBSSxDQUFDZ0wsU0FBVCxFQUFtQjtBQUNmaEwsTUFBQUEsSUFBSSxDQUFDZ0wsU0FBTCxDQUFlcUQsUUFBZjtBQUNBck8sTUFBQUEsSUFBSSxDQUFDZ0wsU0FBTCxHQUFpQixJQUFqQjtBQUNIOztBQUVELFFBQUloTCxJQUFJLENBQUNnTSxVQUFULEVBQXFCO0FBQ2pCaE0sTUFBQUEsSUFBSSxDQUFDZ00sVUFBTCxDQUFnQnFDLFFBQWhCO0FBQ0FyTyxNQUFBQSxJQUFJLENBQUNnTSxVQUFMLEdBQWtCLElBQWxCO0FBQ0g7O0FBRUQsU0FBS2xCLHVCQUFMLENBQTZCLEtBQTdCO0FBQ0EsU0FBS2lDLHFCQUFMLENBQTJCLEtBQTNCO0FBQ0EsU0FBS3RILHVCQUFMLENBQTZCLEtBQTdCO0FBQ0g7QUFsa0JrQyxDQUFULENBQTlCO0FBb2tCQTZJLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjVPLHVCQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgIOi/memHjOaYr+aPj+i/sOi/meS4queql+S9k+eahOS9nOeUqOeahCAo6Iux6ZuE6L2s5o2i77yJXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMy0yMiAxNDozNzozNVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBTZWVycGFsYWNlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJzZWVycGFsYWNlX2NvbnRyb2xsZXJcIilcbnZhciBIZXJvQ29uc3QgPSByZXF1aXJlKFwiaGVyb19jb25zdFwiKVxudmFyIFNlZXJwYWxhY2VDb25zdCA9IHJlcXVpcmUoXCJzZWVycGFsYWNlX2NvbnN0XCIpXG52YXIgQ29tbW9uU2Nyb2xsVmlldyA9IHJlcXVpcmUoXCJjb21tb25fc2Nyb2xsdmlld1wiKTtcbnZhciBTZWVycGFsYWNlRXZlbnQgPSByZXF1aXJlKFwic2VlcnBhbGFjZV9ldmVudFwiKVxudmFyIEhlcm9Db250cm9sbGVyID0gcmVxdWlyZShcImhlcm9fY29udHJvbGxlclwiKVxudmFyIEJhc2VSb2xlID0gcmVxdWlyZShcImJhc2Vyb2xlXCIpXG52YXIgU2VlcnBhbGFjZV9jaGFuZ2VfUGFuZWwgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVBhbmVsLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJzZWVycGFsYWNlXCIsIFwic2VlcnBhbGFjZV9jaGFuZ2VfcGFuZWxcIik7XG4gICAgICAgIHRoaXMuY3RybCA9IFNlZXJwYWxhY2VDb250cm9sbGVyLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMubW9kZWwgPSBTZWVycGFsYWNlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKClcbiAgICAgICAgc2VsZi5jYW1wX2xpc3QgPSB7fVxuICAgICAgICBzZWxmLmN1cl9yb2xlX3ZvID0ge31cbiAgICAgICAgc2VsZi5jdXJfcm9sZV9pdGVtID0gbnVsbFxuICAgICAgICBzZWxmLmN1cl9jYW1wX3R5cGUgPSBIZXJvQ29uc3QuQ2FtcFR5cGUuZU5vbmVcbiAgICAgICAgc2VsZi5sZWZ0X3N0YXJzXzEgPSB7fVxuICAgICAgICBzZWxmLmxlZnRfc3RhcnNfMiA9IHt9XG4gICAgICAgIHNlbGYucmlnaHRfc3RhcnNfMSA9IHt9XG4gICAgICAgIHNlbGYucmlnaHRfc3RhcnNfMiA9IHt9XG4gICAgICAgIHNlbGYuaXNfZmlyc3Rfb3BlbiA9IHRydWUgIC8vIOmmluasoeaJk+W8gOeVjOmdouagh+ivhlxuICAgICAgICBzZWxmLmNoYW5nZV9wYXJ0bmVyX2lkID0gMCAvLyDmnInnva7mjaLnu5PmnpzkvYbmnKrkv53lrZjnmoToi7Hpm4TvvIww5Li65rKh5pyJXG4gICAgICAgIHNlbGYuY2hhbmdlX25ld19wYXJ0bmVyX2JpZCA9IDAgLy8g5pyJ572u5o2i57uT5p6c5L2G5pyq5L+d5a2Y55qE5paw6Iux6ZuE77yMMOS4uuayoeaciVxuICAgICAgICBzZWxmLmxvY2tfcGFydG5lcl9pZHMgPSB7fSAvLyDplIHkvY/kuI3og73nva7mjaLnmoToi7Hpm4RcbiAgICAgICAgc2VsZi5jYW5jZWxfcGFydG5lcl9pZCA9IDAgLy8g57yT5a2Y5Y+W5raI5L+d5a2Y55qE6Iux6ZuEaWTvvIzlj5bmtojkuYvlkI7opoHkvp3nhLbpgInkuK3lroNcbiAgICB9LFxuXG4gICAgLy8g5Y+v5Lul5Yid5aeL5YyW5aOw5piO5LiA5Lqb5Y+Y6YeP55qEXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuXG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcbiAgICBpbml0UGFuZWw6ZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICAgIGxldCBtYWluX2NvbnRhaW5lciA9IHNlbGYucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJtYWluX2NvbnRhaW5lclwiKVxuICAgICAgICBzZWxmLmNoYW5nZV9idG4gPSBtYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImNoYW5nZV9idG5cIilcbiAgICAgICAgc2VsZi5jaGFuZ2VfYnRuLmFjdGl2ZSA9IGZhbHNlXG5cbiAgICAgICAgc2VsZi5jYW5jZWxfYnRuID0gbWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJjYW5jZWxfYnRuXCIpXG5cbiAgICAgICAgc2VsZi5jYW5jZWxfYnRuLmFjdGl2ZSA9IGZhbHNlXG5cbiAgICAgICAgc2VsZi5zYXZlX2J0biA9IG1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwic2F2ZV9idG5cIilcbiAgICAgICAgc2VsZi5zYXZlX2J0bi5hY3RpdmUgPSBmYWxzZVxuXG4gICAgICAgIHNlbGYubGVmdF9wYW5lbCA9IG1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwibGVmdF9wYW5lbFwiKVxuICAgICAgICBzZWxmLmxlZnRfcGFuZWwuYWN0aXZlID0gIGZhbHNlXG4gICAgICAgIHNlbGYubGVmdF9sdl9sYWJlbCA9IHRoaXMuc2Vla0NoaWxkKFwibGVmdF9sdl9sYWJlbFwiLGNjLkxhYmVsKVxuXG4gICAgICAgIHNlbGYucmlnaHRfcGFuZWwgPSBtYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInJpZ2h0X3BhbmVsXCIpXG4gICAgICAgIHNlbGYucmlnaHRfcGFuZWwuYWN0aXZlID0gZmFsc2VcbiAgICAgICAgc2VsZi5yaWdodF9sdl9sYWJlbCA9IHRoaXMuc2Vla0NoaWxkKFwicmlnaHRfbHZfbGFiZWxcIixjYy5MYWJlbClcblxuICAgICAgICBzZWxmLmNoYW5nZV9sYiA9IHRoaXMuc2Vla0NoaWxkKFwiY2hhbmdlX2xhYmVsXCIsY2MuTGFiZWwpXG4gICAgICAgIHNlbGYubGVmdF9lZmZlY3Rfbm9kZSA9IG1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwibGVmdF9lZmZlY3Rfbm9kZVwiKVxuICAgICAgICBzZWxmLnJpZ2h0X2VmZmVjdF9ub2RlID0gbWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJyaWdodF9lZmZlY3Rfbm9kZVwiKVxuICAgICAgICBzZWxmLnJvbGVfbGF5b3V0ID0gbWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJyb2xlX2xheW91dFwiKVxuICAgICAgICBzZWxmLnRvZ2dsZV9uZCA9IHRoaXMuc2Vla0NoaWxkKFwidG9vZ2xlXCIpXG4gICAgICAgIHRoaXMubGVmdF9uYW1lX2xhYmVsID0gdGhpcy5zZWVrQ2hpbGQoXCJsZWZ0X25hbWVfbGFiZWxcIixjYy5MYWJlbClcbiAgICAgICAgdGhpcy5yaWdodF9uYW1lX2xhYmVsID0gdGhpcy5zZWVrQ2hpbGQoXCJyaWdodF9uYW1lX2xhYmVsXCIsY2MuTGFiZWwpXG4gICAgICAgIHRoaXMubGVmdF9pdGVtX3NwID0gdGhpcy5zZWVrQ2hpbGQoXCJsZWZ0X2l0ZW1cIixjYy5TcHJpdGUpXG4gICAgICAgIHRoaXMucmlnaHRfaXRlbV9zcCA9IHRoaXMuc2Vla0NoaWxkKFwicmlnaHRfaXRlbVwiLGNjLlNwcml0ZSlcbiAgICAgICAgdGhpcy5yaWdodF9uYW1lX2xhYmVsX3NwID0gdGhpcy5zZWVrQ2hpbGQoXCJyaWdodF9uYW1lX2xhYmVsXCIsY2MuU3ByaXRlKVxuICAgICAgICBsZXQgYmdTaXplID0gc2VsZi5yb2xlX2xheW91dC5nZXRDb250ZW50U2l6ZSgpXG4gICAgICAgIHNlbGYuYnRuX3N1bW1vbl9zcCA9IHRoaXMuc2Vla0NoaWxkKFwiaXRlbVwiLGNjLlNwcml0ZSlcbiAgICAgICAgbGV0IHNjYWxlID0gMC45XG4gICAgICAgIGxldCBzY3JvbGxfdmlld19zaXplID0gY2Muc2l6ZShiZ1NpemUud2lkdGggLSA4MCwgMTA4KVxuICAgICAgICBsZXQgc2V0dGluZyA9IHtcbiAgICAgICAgICAgIGl0ZW1fY2xhc3MgOiBcImhlcm9fZXhoaWJpdGlvbl9pdGVtXCIsICAgICAgLy8tLSDljZXlhYPnsbtcbiAgICAgICAgICAgIHN0YXJ0X3ggOiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLSDnrKzkuIDkuKrljZXlhYPnmoRY6LW354K5XG4gICAgICAgICAgICBzcGFjZV94IDogMTUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0geOaWueWQkeeahOmXtOmalFxuICAgICAgICAgICAgc3RhcnRfeSA6IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tIOesrOS4gOS4quWNleWFg+eahFnotbfngrlcbiAgICAgICAgICAgIHNwYWNlX3kgOiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLSB55pa55ZCR55qE6Ze06ZqUXG4gICAgICAgICAgICBpdGVtX3dpZHRoIDogMTE5KnNjYWxlLCAgICAgICAgICAgICAgIC8vLS0g5Y2V5YWD55qE5bC65a+4d2lkdGhcbiAgICAgICAgICAgIGl0ZW1faGVpZ2h0IDogMTE5KnNjYWxlLCAgICAgICAgICAgICAgLy8tLSDljZXlhYPnmoTlsLrlr7hoZWlnaHRcbiAgICAgICAgICAgIHJvdyA6IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLSDooYzmlbDvvIzkvZznlKjkuo7msLTlubPmu5rliqjnsbvlnotcbiAgICAgICAgICAgIGNvbCA6IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLSDliJfmlbDvvIzkvZznlKjkuo7lnoLnm7Tmu5rliqjnsbvlnotcbiAgICAgICAgICAgIHNjYWxlIDogc2NhbGUsXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb2xlX3Njcm9sbHZpZXcgPSBuZXcgQ29tbW9uU2Nyb2xsVmlldygpO1xuICAgICAgICB0aGlzLnJvbGVfc2Nyb2xsdmlldy5jcmVhdGVTY3JvbGwoc2VsZi5yb2xlX2xheW91dCxjYy52Mig0MCwxMjgpLFNjcm9sbFZpZXdEaXIuaG9yaXpvbnRhbCxTY3JvbGxWaWV3U3RhcnRQb3MudG9wLHNjcm9sbF92aWV3X3NpemUsc2V0dGluZyxjYy52MigwLCAwKSlcbiAgICAgICAgLy8gdGhpcy5yb2xlX3Njcm9sbHZpZXcuc2V0U3dhbGxvd1RvdWNoZXMoZmFsc2UpXG4gICAgICAgIGxldCBwYXRoID0gUGF0aFRvb2wuZ2V0SWNvblBhdGgoXCJpdGVtXCIsU2VlcnBhbGFjZUNvbnN0Lkdvb2RfWGlhblpoaSlcbiAgICAgICAgdGhpcy5sb2FkUmVzKHBhdGgsZnVuY3Rpb24oU3ByaXRlRnJhbWUpe1xuICAgICAgICAgICAgdGhpcy5idG5fc3VtbW9uX3NwLnNwcml0ZUZyYW1lICA9IFNwcml0ZUZyYW1lXG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgLy8gaWYodGhpcy5tb2RlbC5jaGFuZ2VfaW5mbyl7XG4gICAgICAgIC8vICAgICBzZWxmLnNldERhdGEodGhpcy5tb2RlbC5jaGFuZ2VfaW5mbylcbiAgICAgICAgLy8gfVxuICAgICAgIFxuICAgIH0sXG5cbiAgICAvLyDms6jlhozkuovku7bnm5HlkKznmoTmjqXlj6Ms5LiN6ZyA6KaB5omL5Yqo6LCD55SoLOWmguaenOaYr+S9v+eUqGdjb3JlLkdsb2JhbEV2ZW5055uR5ZCsLOWPr+S7peebtOaOpeiwg+eUqGFkZEdsb2JhbEV2ZW50XG4gICAgcmVnaXN0ZXJFdmVudDpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgdGhpcy5jaGFuZ2VfYnRuLm9uKFwidG91Y2hlbmRcIix0aGlzLl9vbkNsaWNrQ2hhbmdlQnRuLHRoaXMpXG4gICAgICAgIHRoaXMuY2FuY2VsX2J0bi5vbihcInRvdWNoZW5kXCIsdGhpcy5fb25DbGlja0NhbmNlbEJ0bix0aGlzKVxuICAgICAgICB0aGlzLnNhdmVfYnRuLm9uKFwidG91Y2hlbmRcIix0aGlzLl9vbkNsaWNrU2F2ZUJ0bix0aGlzKVxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KFNlZXJwYWxhY2VFdmVudC5DaGFuZ2VfUm9sZV9JbmZvX0V2ZW50LGZ1bmN0aW9uIChkYXRhKXtcbiAgICAgICAgICAgIHNlbGYuc2V0RGF0YShkYXRhKVxuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoU2VlcnBhbGFjZUV2ZW50LkNoYW5nZV9Sb2xlX1N1Y2Nlc3MsZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICBzZWxmLmhhbmRsZVJpZ2h0Q2hhbmdlRWZmZWN0KHRydWUpXG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgZm9yIChsZXQgaT0xO2k8PTQ7KytpKXtcbiAgICAgICAgICAgIGxldCBjYW1wX2J0biA9IHNlbGYudG9nZ2xlX25kLmdldENoaWxkQnlOYW1lKFwiY2FtcF9idG5fXCIgKyBpKVxuICAgICAgICAgICAgaWYgKGNhbXBfYnRuKXtcbiAgICAgICAgICAgICAgICBzZWxmLmNhbXBfbGlzdFtpXSA9IGNhbXBfYnRuXG4gICAgICAgICAgICAgICAgY2FtcF9idG4ub24oXCJ0b3VjaGVuZFwiLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2xpY2tDYW1wQnRuKGkpXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgzKVxuICAgICAgICAgICAgICAgIH0sdGhpcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN0cmwucmVxdWVzdFNlZXJwYWxhY2VDaGFuZ2VJbmZvKCAgKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCD5Y+v5Lul6K6+572u5LiA5Lqb5pWw5o2u5LqGXG4gICAgb25TaG93OmZ1bmN0aW9uKHBhcmFtcyl7XG5cbiAgICB9LFxuXG4gICAgLy8g6Z2i5p2/6K6+572u5LiN5Y+v6KeB55qE5Zue6LCDLOi/memHjOWBmuS4gOS6m+S4jeWPr+ingeeahOWxj+iUveWkhOeQhlxuICAgIG9uSGlkZTpmdW5jdGlvbigpe1xuXG4gICAgfSxcbiAgICBhZGRUb1BhcmVudCggc3RhdHVzICl7XG4gICAgICAgIHN0YXR1cyA9IHN0YXR1cyB8fCBmYWxzZVxuICAgICAgICBpZihzdGF0dXMpe1xuICAgICAgICAgICAgdGhpcy5zaG93KClcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmICh0aGlzLmlzX2ZpcnN0X29wZW4pIHtcbiAgICAgICAgLy8gICAgIC8vIC0tIOWIneasoeaJk+W8gOeVjOmdouaXtuivt+axgue9ruaNouebuOWFs+aVsOaNrlxuICAgICAgICAvLyAgICAgdGhpcy5jdHJsLnJlcXVlc3RTZWVycGFsYWNlQ2hhbmdlSW5mbyggIClcbiAgICAgICAgLy8gICAgIHRoaXMuaXNfZmlyc3Rfb3BlbiA9IGZhbHNlXG4gICAgICAgIC8vIH1cbiAgICB9LFxuICAgIC8vIC0tIOe9ruaNolxuICAgIF9vbkNsaWNrQ2hhbmdlQnRuKCl7XG4gICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgxKVxuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgaWYgKHNlbGYuY3VyX3JvbGVfdm8gJiYgc2VsZi5jdXJfcm9sZV92by5pZCl7XG4gICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdFNlZXJwYWxhY2VDaGFuZ2VSb2xlKHNlbGYuY3VyX3JvbGVfdm8uaWQsIDEpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgbWVzc2FnZShcIuivt+WFiOmAieaLqeS4gOS9jeiLsembhFwiKVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyAtLSDlj5bmtohcbiAgICBfb25DbGlja0NhbmNlbEJ0biggICl7XG4gICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgxKVxuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgaWYgKHNlbGYuY2hhbmdlX3BhcnRuZXJfaWQgJiYgc2VsZi5jaGFuZ2VfcGFydG5lcl9pZCAhPSAwKXtcbiAgICAgICAgICAgIHNlbGYuY2FuY2VsX3BhcnRuZXJfaWQgPSBzZWxmLmNoYW5nZV9wYXJ0bmVyX2lkXG4gICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdFNlZXJwYWxhY2VDaGFuZ2VSb2xlKHNlbGYuY2hhbmdlX3BhcnRuZXJfaWQsIDApXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIC0tIOS/neWtmFxuICAgIF9vbkNsaWNrU2F2ZUJ0bigpe1xuICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoMSlcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICAgIGlmIChzZWxmLmNoYW5nZV9wYXJ0bmVyX2lkICYmIHNlbGYuY2hhbmdlX3BhcnRuZXJfaWQgIT0gMCApe1xuICAgICAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RTZWVycGFsYWNlQ2hhbmdlUm9sZShzZWxmLmNoYW5nZV9wYXJ0bmVyX2lkLCAyKVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZXREYXRhKGRhdGEpe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgc2VsZi5kYXRhID0gZGF0YSB8fCB7fVxuICAgICAgICBzZWxmLmNoYW5nZV9wYXJ0bmVyX2lkID0gZGF0YS5wYXJ0bmVyX2lkIHx8IDBcbiAgICAgICAgc2VsZi5jaGFuZ2VfbmV3X3BhcnRuZXJfYmlkID0gZGF0YS5uZXdfcGFydG5lcl9iaWQgfHwgMFxuICAgICAgICBzZWxmLmxvY2tfcGFydG5lcl9pZHMgPSBkYXRhLnBhcnRuZXJfaWRzIHx8IHt9XG5cbiAgICAgICAgc2VsZi5yb2xlX2xheW91dC5hY3RpdmUgPSAoc2VsZi5jaGFuZ2VfcGFydG5lcl9pZCA9PSAwKVxuICAgICAgICBzZWxmLmNhbmNlbF9idG4uYWN0aXZlID0gKHNlbGYuY2hhbmdlX3BhcnRuZXJfaWQgIT0gMClcbiAgICAgICAgc2VsZi5zYXZlX2J0bi5hY3RpdmUgPSAoc2VsZi5jaGFuZ2VfcGFydG5lcl9pZCAhPSAwKVxuICAgICAgICBpZiAoc2VsZi5jaGFuZ2VfcGFydG5lcl9pZCA9PSAwKSB7XG4gICAgICAgICAgICBpZiAoIXNlbGYuY3VyX2luZGV4KXtcbiAgICAgICAgICAgICAgICBzZWxmLnRvZ2dsZV9uZC5nZXRDaGlsZEJ5TmFtZShcImNhbXBfYnRuXzFcIikuZ2V0Q29tcG9uZW50KGNjLlRvZ2dsZSkuaXNDaGVja2VkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHNlbGYuX29uQ2xpY2tDYW1wQnRuKDEpXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2hSb2xlTGlzdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgc2VsZi5jdXJfaW5kZXggPSBudWxsXG4gICAgICAgICAgICBzZWxmLmN1cl9yb2xlX3ZvID0ge31cbiAgICAgICAgICAgIHNlbGYuY3VyX2NhbXBfdHlwZSA9IEhlcm9Db25zdC5DYW1wVHlwZS5lTm9uZVxuICAgICAgICAgICAgaWYgKHNlbGYuY3VyX3JvbGVfaXRlbSl7XG4gICAgICAgICAgICAgICAgc2VsZi5jdXJfcm9sZV9pdGVtLnNldFNlbGVjdGVkKGZhbHNlKVxuICAgICAgICAgICAgICAgIHNlbGYuY3VyX3JvbGVfaXRlbSA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZWxmLnJlZnJlc2hSb2xlU3BpbmUoKVxuICAgIH0sXG4gICAgLy8gLS0g5Yi35paw6Iux6ZuE5aS05YOP5YiX6KGoXG4gICAgcmVmcmVzaFJvbGVMaXN0KCl7XG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICBzZWxmLmN1cl9yb2xlX2RhdGEgPSBbXVxuICAgICAgICBsZXQgYWxsX3JvbGVfbGlzdCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRBbGxIZXJvQXJyYXkoKVxuICAgICAgICBsZXQgY2FtcF90eXBlID0gSGVyb0NvbnN0LkNhbXBUeXBlLmVOb25lXG4gICAgICAgIGlmIChzZWxmLmN1cl9pbmRleCA9PSBTZWVycGFsYWNlQ29uc3QuQ2hhbmdlX0luZGV4X0NhbXAuQWxsKXtcbiAgICAgICAgICAgIGNhbXBfdHlwZSA9IEhlcm9Db25zdC5DYW1wVHlwZS5lTm9uZVxuICAgICAgICB9ZWxzZSBpZiAoc2VsZi5jdXJfaW5kZXggPT0gU2VlcnBhbGFjZUNvbnN0LkNoYW5nZV9JbmRleF9DYW1wLldhdGVyKXtcbiAgICAgICAgICAgIGNhbXBfdHlwZSA9IEhlcm9Db25zdC5DYW1wVHlwZS5lV2F0ZXJcbiAgICAgICAgfWVsc2UgaWYgKHNlbGYuY3VyX2luZGV4ID09IFNlZXJwYWxhY2VDb25zdC5DaGFuZ2VfSW5kZXhfQ2FtcC5GaXJlKXtcbiAgICAgICAgICAgIGNhbXBfdHlwZSA9IEhlcm9Db25zdC5DYW1wVHlwZS5lRmlyZVxuICAgICAgICB9ZWxzZSBpZiAoc2VsZi5jdXJfaW5kZXggPT0gU2VlcnBhbGFjZUNvbnN0LkNoYW5nZV9JbmRleF9DYW1wLldpbmQpe1xuICAgICAgICAgICAgY2FtcF90eXBlID0gSGVyb0NvbnN0LkNhbXBUeXBlLmVXaW5kXG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5jdXJfY2FtcF90eXBlID0gY2FtcF90eXBlXG5cbiAgICAgICAgZm9yIChsZXQgayBpbiBhbGxfcm9sZV9saXN0IHx8IHt9KXsvLyBrLHJvbGVfdm8gaW4gcGFpcnMoYWxsX3JvbGVfbGlzdC5pdGVtcyBvciB7fSkgZG9cbiAgICAgICAgICAgIGxldCByb2xlX3ZvID0gYWxsX3JvbGVfbGlzdFtrXVxuICAgICAgICAgICAgaWYgKHJvbGVfdm8uc3RhciA9PSA0IHx8IHJvbGVfdm8uc3RhciA9PSA1KXtcbiAgICAgICAgICAgICAgICBsZXQgaXNfbG9jayA9IHNlbGYuY2hlY2tJc0xvY2tlZFJvbGUocm9sZV92by5pZClcbiAgICAgICAgICAgICAgICBpZiAoY2FtcF90eXBlID09IEhlcm9Db25zdC5DYW1wVHlwZS5lTm9uZSl7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlX3ZvLmNhbXBfdHlwZSA9PSBIZXJvQ29uc3QuQ2FtcFR5cGUuZVdhdGVyIHx8XG4gICAgICAgICAgICAgICAgICAgIHJvbGVfdm8uY2FtcF90eXBlID09IEhlcm9Db25zdC5DYW1wVHlwZS5lRmlyZSB8fFxuICAgICAgICAgICAgICAgICAgICByb2xlX3ZvLmNhbXBfdHlwZSA9PSBIZXJvQ29uc3QuQ2FtcFR5cGUuZVdpbmQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGVfZGF0YSA9IFV0aWxzLmRlZXBDb3B5KHJvbGVfdm8pXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlX2RhdGEuaXNfbG9ja2VkID0gaXNfbG9ja1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJfcm9sZV9kYXRhLnB1c2gocm9sZV9kYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFibGVfaW5zZXJ0KHNlbGYuY3VyX3JvbGVfZGF0YSwgcm9sZV9kYXRhKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYgKHJvbGVfdm8uY2FtcF90eXBlID09IGNhbXBfdHlwZSApe1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZV9kYXRhID0gVXRpbHMuZGVlcENvcHkocm9sZV92bylcbiAgICAgICAgICAgICAgICAgICAgcm9sZV9kYXRhLmlzX2xvY2tlZCA9IGlzX2xvY2tcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJfcm9sZV9kYXRhLnB1c2gocm9sZV9kYXRhKVxuICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZV9pbnNlcnQoc2VsZi5jdXJfcm9sZV9kYXRhLCByb2xlX2RhdGEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VyX3JvbGVfZGF0YS5zb3J0KGZ1bmN0aW9uKCBvYmpBLCBvYmpCICl7XG4gICAgICAgICAgICBsZXQgaXNfbG9ja19hID0gc2VsZi5jaGVja0lzTG9ja2VkUm9sZShvYmpBLmlkKVxuICAgICAgICAgICAgbGV0IGlzX2xvY2tfYiA9IHNlbGYuY2hlY2tJc0xvY2tlZFJvbGUob2JqQi5pZClcbiAgICAgICAgICAgIGlmIChpc19sb2NrX2EgJiYgIWlzX2xvY2tfYiApeyBcbiAgICAgICAgICAgICAgICByZXR1cm4gIDFcbiAgICAgICAgICAgIH1lbHNlIGlmICghaXNfbG9ja19hICYmIGlzX2xvY2tfYil7XG4gICAgICAgICAgICAgICAgcmV0dXJuICAtMVxuICAgICAgICAgICAgfWVsc2UgaWYgKG9iakEuc3RhciA9PSBvYmpCLnN0YXIgKXtcbiAgICAgICAgICAgICAgICBpZiAob2JqQS5jYW1wX3R5cGUgPT0gb2JqQi5jYW1wX3R5cGUpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqQi5sZXYgLSBvYmpBLmxldiBcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iakIuY2FtcF90eXBlIC0gb2JqQS5jYW1wX3R5cGUgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqQi5zdGFyIC0gb2JqQS5zdGFyIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChzZWxmLmN1cl9yb2xlX2l0ZW0pe1xuICAgICAgICAgICAgc2VsZi5jdXJfcm9sZV9pdGVtLnNldFNlbGVjdGVkKGZhbHNlKVxuICAgICAgICB9XG4gICAgICAgIGxldCBleHRlbmREYXRhID0ge3NjYWxlIDogMC44NSwgY2FuX2NsaWNrIDogdHJ1ZSwgZnJvbV90eXBlIDogSGVyb0NvbnN0LkV4aGliaXRpb25JdGVtVHlwZS5lSGVyb0NoYW5nZX1cbiAgICAgICAgc2VsZi5yb2xlX3Njcm9sbHZpZXcuc2V0RGF0YShzZWxmLmN1cl9yb2xlX2RhdGEsZnVuY3Rpb24oY2VsbCl7XG4gICAgICAgICAgICB0aGlzLl9vbkNsaWNrUGFydG5lcihjZWxsKVxuICAgICAgICB9LmJpbmQodGhpcyksZXh0ZW5kRGF0YSlcbiAgICAgICAgc2VsZi5yb2xlX3Njcm9sbHZpZXcuYWRkRW5kQ2FsbEJhY2soZnVuY3Rpb24oICl7XG4gICAgICAgICAgICBpZiAoc2VsZi5jdXJfcm9sZV92byAmJiBVdGlscy5uZXh0KHNlbGYuY3VyX3JvbGVfdm8pICYmIHNlbGYuY3VyX2NhbXBfdHlwZSE9bnVsbCApe1xuICAgICAgICAgICAgICAgIC8vIC0tIOiusOW9leS6huS4iuS4gOasoemAieS4reiLsembhOeahOaVsOaNru+8jOWIh+aNouWIsOWFqOmDqOaIluivpeiLsembhOmYteiQpeaXtu+8jOivpeiLsembhOe7p+e7reS4uumAieS4reeKtuaAgVxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmN1cl9yb2xlX3ZvLmNhbXBfdHlwZSA9PSBzZWxmLmN1cl9jYW1wX3R5cGUgfHwgc2VsZi5jdXJfY2FtcF90eXBlID09IEhlcm9Db25zdC5DYW1wVHlwZS5lTm9uZSApe1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IHNlbGYucm9sZV9zY3JvbGx2aWV3LmdldEl0ZW1MaXN0KClcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBrPTA7azxsaXN0Lmxlbmd0aDsrK2spe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSBsaXN0W2tdXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHYuZ2V0RGF0YSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5pZCA9PSBzZWxmLmN1cl9yb2xlX3ZvLmlkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9vbkNsaWNrUGFydG5lcih2KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ZWxzZSBpZihzZWxmLmNhbmNlbF9wYXJ0bmVyX2lkICYmIHNlbGYuY2FuY2VsX3BhcnRuZXJfaWQgIT0gMCApeyAvLy0t6YCJ5Lit5Y+W5raI572u5o2i55qE6Iux6ZuEXG4gICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBzZWxmLnJvbGVfc2Nyb2xsdmlldy5nZXRJdGVtTGlzdCgpXG4gICAgICAgICAgICAgICAgZm9yKGxldCBrPTA7azxsaXN0Lmxlbmd0aDsrK2spe1xuICAgICAgICAgICAgICAgICAgICBsZXQgdiA9IGxpc3Rba11cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB2LmdldERhdGEoKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5pZCA9PSBzZWxmLmNhbmNlbF9wYXJ0bmVyX2lkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX29uQ2xpY2tQYXJ0bmVyKHYpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJvbGVfc2Nyb2xsdmlldy5qdW1wVG9Nb3ZlKGNjLnYyKC0oay0zKSooMC44NSoxMTkrMTUpLCAwKSwgMC4wMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VsZi5jYW5jZWxfcGFydG5lcl9pZCA9IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgIH0sXG4gICAgX29uQ2xpY2tQYXJ0bmVyKGl0ZW0pe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgbGV0IHZvID0gaXRlbS5nZXREYXRhKClcbiAgICAgICAgaWYgKHZvLmNoZWNrSGVyb0xvY2tUaXBzKHRydWUpKXtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxmLmN1cl9yb2xlX2l0ZW0gKXtcbiAgICAgICAgICAgIHNlbGYuY3VyX3JvbGVfaXRlbS5zZXRTZWxlY3RlZChmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICBpdGVtLnNldFNlbGVjdGVkKHRydWUpXG4gICAgICAgIHNlbGYuY3VyX3JvbGVfaXRlbSA9IGl0ZW1cbiAgICAgICAgc2VsZi5jdXJfcm9sZV92byA9IHZvXG5cbiAgICAgICAgbGV0IHJvbGVfc3RhciA9IHZvLnN0YXJcbiAgICAgICAgbGV0IGxhYmVsX3N0ciA9IFwiXCJcbiAgICAgICAgbGV0IGNvc3RfY29uZmlnID0gQ29uZmlnLnJlY3J1aXRfaGlnaF9kYXRhLmRhdGFfc2VlcnBhbGFjZV9jb25zdFtcImhlcm9fY2hhbmdlXCIgKyByb2xlX3N0YXJdXG4gICAgICAgIGlmIChjb3N0X2NvbmZpZyAmJiBjb3N0X2NvbmZpZy52YWwgKXtcbiAgICAgICAgICAgIGxldCBiaWQgPSBjb3N0X2NvbmZpZy52YWxbMF1bMF1cbiAgICAgICAgICAgIGxldCBudW0gPSBjb3N0X2NvbmZpZy52YWxbMF1bMV1cbiAgICAgICAgICAgIGxldCBpdGVtX2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoYmlkKVxuICAgICAgICAgICAgaWYoaXRlbV9jb25maWcpICB7XG4gICAgICAgICAgICAgICAgbGFiZWxfc3RyID0gbnVtICtcIiDnva7mjaJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNlbGYuY2hhbmdlX2xiLnN0cmluZyA9IGxhYmVsX3N0clxuICAgICAgICBzZWxmLnJlZnJlc2hSb2xlU3BpbmUoKVxuICAgIH0sICAgXG4gICAgLy8gLS0g5Yi35paw6Iux6ZuE5qih5Z6L5pi+56S6XG4gICAgcmVmcmVzaFJvbGVTcGluZSgpe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgLy8gaWYgKHNlbGYubGVmdF9yb2xlKXtcbiAgICAgICAgLy8gICAgIHNlbGYubGVmdF9yb2xlLmRlbGV0ZU1lKClcbiAgICAgICAgLy8gICAgIHNlbGYubGVmdF9yb2xlID0gbnVsbFxuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gaWYgKHNlbGYucmlnaHRfcm9sZSkge1xuICAgICAgICAvLyAgICAgc2VsZi5yaWdodF9yb2xlLmRlbGV0ZU1lKClcbiAgICAgICAgLy8gICAgIHNlbGYucmlnaHRfcm9sZSA9IG51bGxcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIC0tIOmAieS4reS6huafkOS4gOS4quiLsembhOaIluiAheacieacquS/neWtmOeahOmHjee9ruiLsembhFxuICAgICAgICBpZiAoc2VsZi5jdXJfcm9sZV92byAmJiBVdGlscy5uZXh0KHNlbGYuY3VyX3JvbGVfdm8pIHx8IHNlbGYuY2hhbmdlX3BhcnRuZXJfaWQgIT0gMCApe1xuICAgICAgICAgICAgbGV0IGxlZnRfcm9sZV92byA9IHt9IC8vLS0g5bem5L6n6Iux6ZuE55qE5pWw5o2uXG4gICAgICAgICAgICBpZiAoc2VsZi5jaGFuZ2VfcGFydG5lcl9pZCA9PSAwICl7XG4gICAgICAgICAgICAgICAgbGVmdF9yb2xlX3ZvID0gc2VsZi5jdXJfcm9sZV92b1xuICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlX2J0bi5hY3RpdmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSaWdodFJhbmRvbUVmZmVjdCh0cnVlKVxuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgbGVmdF9yb2xlX3ZvID0gSGVyb0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEhlcm9CeUlkKHNlbGYuY2hhbmdlX3BhcnRuZXJfaWQpXG4gICAgICAgICAgICAgICAgc2VsZi5jaGFuZ2VfYnRuLmFjdGl2ZSA9IGZhbHNlXG4gICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVSaWdodFJhbmRvbUVmZmVjdChmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZWZ0X3JvbGVfdm8gJiYgKFV0aWxzLm5leHQobGVmdF9yb2xlX3ZvKSB8fCBVdGlscy5uZXh0KGxlZnRfcm9sZV92bykgPT0gMCkpe1xuICAgICAgICAgICAgICAgIGlmKHNlbGYubGVmdF9yb2xlID09IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmxlZnRfcm9sZSA9IG5ldyBCYXNlUm9sZSgpXG4gICAgICAgICAgICAgICAgICAgIHNlbGYubGVmdF9yb2xlLnNldFBhcmVudChzZWxmLmxlZnRfcGFuZWwpXG4gICAgICAgICAgICAgICAgICAgIHNlbGYubGVmdF9yb2xlLm5vZGUuc2V0UG9zaXRpb24oY2MudjIoMTAwLCAxODApKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZWxmLmxlZnRfcm9sZS5zZXREYXRhKEJhc2VSb2xlLnR5cGUucGFydG5lciwgbGVmdF9yb2xlX3ZvLCBQbGF5ZXJBY3Rpb24uc2hvdywgdHJ1ZSwwLjcyKTtcblxuICAgICAgICAgICAgICAgIGxldCB0eXBlX3JlcyA9IFBhdGhUb29sLmdldEhlcm9DYW1wUmVzKGxlZnRfcm9sZV92by5jYW1wX3R5cGUpXG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiY29tbW9uXCIsdHlwZV9yZXMpXG4gICAgICAgICAgICAgICAgc2VsZi5yaWdodF9pdGVtX3NwLnNwcml0ZUZyYW1lID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMocGF0aCxmdW5jdGlvbihTcHJpdGVGcmFtZSl7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYubGVmdF9pdGVtX3NwLnNwcml0ZUZyYW1lID0gU3ByaXRlRnJhbWVcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5yaWdodF9pdGVtX3NwLnNwcml0ZUZyYW1lID0gU3ByaXRlRnJhbWVcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgc2VsZi5sZWZ0X25hbWVfbGFiZWwuc3RyaW5nID0gbGVmdF9yb2xlX3ZvLm5hbWUgXG4gICAgICAgICAgICAgICAgc2VsZi5sZWZ0X2x2X2xhYmVsLnN0cmluZyA9IGxlZnRfcm9sZV92by5sZXZcbiAgICAgICAgICAgICAgICBzZWxmLnJpZ2h0X2x2X2xhYmVsLnN0cmluZyA9IGxlZnRfcm9sZV92by5sZXZcbiAgICAgICAgICAgICAgICBsZXQgcmlnaHRfbmFtZSA9IFwiPz8/P1wiXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hhbmdlX25ld19wYXJ0bmVyX2JpZCAhPSAwICl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiYXNlX2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9wYXJ0bmVyX2Jhc2Vbc2VsZi5jaGFuZ2VfbmV3X3BhcnRuZXJfYmlkXVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmlnaHRfcm9sZV9kYXRhID0ge2JpZCA6IHNlbGYuY2hhbmdlX25ld19wYXJ0bmVyX2JpZCwgc3RhciA6IGxlZnRfcm9sZV92by5zdGFyfVxuICAgICAgICAgICAgICAgICAgICBpZihzZWxmLnJpZ2h0X3JvbGUgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJpZ2h0X3JvbGUgPSBuZXcgQmFzZVJvbGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yaWdodF9yb2xlLnNldFBhcmVudChzZWxmLnJpZ2h0X3BhbmVsKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yaWdodF9yb2xlLm5vZGUuc2V0UG9zaXRpb24oY2MudjIoMTAwLCAxODApKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucmlnaHRfcm9sZS5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucmlnaHRfcm9sZS5zZXREYXRhKEJhc2VSb2xlLnR5cGUucGFydG5lcixyaWdodF9yb2xlX2RhdGEsUGxheWVyQWN0aW9uLnNob3csIHRydWUsMC43MilcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VfY29uZmlnICYmIGJhc2VfY29uZmlnLm5hbWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfbmFtZSA9IGJhc2VfY29uZmlnLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICByaWdodF9uYW1lID0gXCI/Pz8/XCJcbiAgICAgICAgICAgICAgICAgICAgaWYoc2VsZi5yaWdodF9yb2xlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmlnaHRfcm9sZS5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlbGYucmlnaHRfbmFtZV9sYWJlbC5zdHJpbmcgPSByaWdodF9uYW1lXG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpIGluIHNlbGYubGVmdF9zdGFyc18xKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXIgPSBzZWxmLmxlZnRfc3RhcnNfMVtpXS5ub2RlXG4gICAgICAgICAgICAgICAgICAgIHN0YXIuYWN0aXZlID0gZmFsc2VcdFx0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gc2VsZi5sZWZ0X3N0YXJzXzIpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhciA9IHNlbGYubGVmdF9zdGFyc18yW2ldLm5vZGVcbiAgICAgICAgICAgICAgICAgICAgc3Rhci5hY3RpdmUgPSBmYWxzZVx0XHRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiBzZWxmLnJpZ2h0X3N0YXJzXzEpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhciA9IHNlbGYucmlnaHRfc3RhcnNfMVtpXS5ub2RlXG4gICAgICAgICAgICAgICAgICAgIHN0YXIuYWN0aXZlID0gZmFsc2VcdFx0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gc2VsZi5yaWdodF9zdGFyc18yKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXIgPSBzZWxmLnJpZ2h0X3N0YXJzXzJbaV0ubm9kZSAgIFxuICAgICAgICAgICAgICAgICAgICBzdGFyLmFjdGl2ZSA9IGZhbHNlXHRcdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5sZWZ0X3N0YXIxMCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmxlZnRfc3RhcjEwLm5vZGUuYWN0aXZlID0gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYucmlnaHRfc3RhcjEwKXtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5yaWdodF9zdGFyMTAubm9kZS5hY3RpdmUgPSBmYWxzZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCByb2xlX3N0YXIgPSBsZWZ0X3JvbGVfdm8uc3RhclxuICAgICAgICAgICAgICAgIGxldCBfY1N0YXIgPSBmdW5jdGlvbihzdGFyX2NvdW50LCByZXMsIHN0YXJfbGlzdCwgcGFyZW50X25vZGUpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3Rhcl9wb3MgPSBTZWVycGFsYWNlQ29uc3QuQ2hhbmdlX1Bvc19YW3N0YXJfY291bnRdIHx8IHt9XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDtpPHN0YXJfY291bnQ7KytpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3Rhcl9saXN0W2ldKSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFyID0gVXRpbHMuY3JlYXRlSW1hZ2UocGFyZW50X25vZGUsIHJlcywgMCwgMzM4LCBjYy52MigwLjUsIDAuNSksIHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkUmVzKHJlcyxmdW5jdGlvbihTcHJpdGVGcmFtZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXIuc3ByaXRlRnJhbWUgID0gU3ByaXRlRnJhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rhcl9saXN0W2ldID0gc3RhclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhcl9saXN0W2ldLm5vZGUuYWN0aXZlID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvc194ID0gc3Rhcl9wb3NbaV1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NfeCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rhcl9saXN0W2ldLm5vZGUueCA9IHBvc194XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocm9sZV9zdGFyID4gMCAmJiByb2xlX3N0YXIgPD0gNSApe1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImNvbW1vblwiLFwiY29tbW9uXzkwMDc0XCIpXG4gICAgICAgICAgICAgICAgICAgIF9jU3Rhcihyb2xlX3N0YXIsIHJlcywgc2VsZi5sZWZ0X3N0YXJzXzEsIHNlbGYubGVmdF9wYW5lbClcbiAgICAgICAgICAgICAgICAgICAgX2NTdGFyKHJvbGVfc3RhciwgcmVzLCBzZWxmLnJpZ2h0X3N0YXJzXzEsIHNlbGYucmlnaHRfcGFuZWwpXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYgKHJvbGVfc3RhciA+PSA2ICYmIHJvbGVfc3RhciA8PSA5ICl7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXMgPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiY29tbW9uXCIsXCJjb21tb25fOTAwNzVcIilcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gcm9sZV9zdGFyIC0gNVxuICAgICAgICAgICAgICAgICAgICBfY1N0YXIoY291bnQsIHJlcywgc2VsZi5sZWZ0X3N0YXJzXzIsIHNlbGYubGVmdF9wYW5lbClcbiAgICAgICAgICAgICAgICAgICAgX2NTdGFyKGNvdW50LCByZXMsIHNlbGYucmlnaHRfc3RhcnNfMiwgc2VsZi5yaWdodF9wYW5lbClcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZiAocm9sZV9zdGFyID49IDEwKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcyA9IFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJjb21tb25cIixcImNvbW1vbl85MDA3M1wiKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYubGVmdF9zdGFyMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGVmdF9zdGFyMTAgPSBVdGlscy5jcmVhdGVJbWFnZShzZWxmLmxlZnRfcGFuZWwsIHJlcywgMTAwLCAzMzgsY2MudjIoMC41LDAuNSksdHJ1ZSwwLGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sZWZ0X3N0YXIxMC5zZXRTY2FsZSgxLjIpXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sZWZ0X3N0YXIxMC5ub2RlLmFjdGl2ZSA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5yaWdodF9zdGFyMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmlnaHRfc3RhcjEwID0gVXRpbHMuY3JlYXRlSW1hZ2Uoc2VsZi5yaWdodF9wYW5lbCwgcmVzLCAxMDAsIDMzOCxjYy52MigwLjUsMC41KSx0cnVlLDAsZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJpZ2h0X3N0YXIxMC5zZXRTY2FsZSgxLjIpXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yaWdodF9zdGFyMTAubm9kZS5hY3RpdmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGYubGVmdF9wYW5lbC5hY3RpdmUgPSB0cnVlXG4gICAgICAgICAgICBzZWxmLnJpZ2h0X3BhbmVsLmFjdGl2ZSA9IHRydWVcbiAgICAgICAgICAgIHNlbGYuaGFuZGxlTGVmdEVtcHR5RWZmZWN0KGZhbHNlKVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHNlbGYubGVmdF9wYW5lbC5hY3RpdmUgPSBmYWxzZVxuICAgICAgICAgICAgc2VsZi5yaWdodF9wYW5lbC5hY3RpdmUgPSBmYWxzZVxuICAgICAgICAgICAgc2VsZi5jaGFuZ2VfYnRuLmFjdGl2ZSA9IGZhbHNlXG4gICAgICAgICAgICBzZWxmLmhhbmRsZUxlZnRFbXB0eUVmZmVjdCh0cnVlKVxuICAgICAgICAgICAgc2VsZi5oYW5kbGVSaWdodFJhbmRvbUVmZmVjdChmYWxzZSlcbiAgICAgICAgfVxuICAgIH0sXG4gICAgX29uQ2xpY2tDYW1wQnRuKCBpbmRleCApe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgaWYgKHNlbGYuY3VyX2luZGV4ID09IGluZGV4KSAgcmV0dXJuIFxuXG4gICAgICAgIGlmIChzZWxmLmN1cl9pbmRleCkge1xuICAgICAgICAgICAgbGV0IG9sZF9jYW1wX2RhdGEgPSBzZWxmLmNhbXBfbGlzdFtzZWxmLmN1cl9pbmRleF1cbiAgICAgICAgICAgIGlmIChvbGRfY2FtcF9kYXRhICYmIG9sZF9jYW1wX2RhdGEuc2VsZWN0X2ltYWdlICl7XG4gICAgICAgICAgICAgICAgb2xkX2NhbXBfZGF0YS5zZWxlY3RfaW1hZ2UuYWN0aXZlID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXJfY2FtcF9kYXRhID0gc2VsZi5jYW1wX2xpc3RbaW5kZXhdXG4gICAgICAgIGlmIChjdXJfY2FtcF9kYXRhICYmIGN1cl9jYW1wX2RhdGEuc2VsZWN0X2ltYWdlKXtcbiAgICAgICAgICAgIGN1cl9jYW1wX2RhdGEuc2VsZWN0X2ltYWdlLmFjdGl2ZSA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuY3VyX2luZGV4ID0gaW5kZXhcbiAgICAgICAgc2VsZi5yZWZyZXNoUm9sZUxpc3QoKVxuICAgIH0sXG4gICAgLy8gLS0g5Yik5pat5piv5ZCm5Li66ZSB5L2P55qE6Iux6ZuEXG4gICAgY2hlY2tJc0xvY2tlZFJvbGUoIGlkICl7XG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICBsZXQgaXNfbG9ja2VkID0gZmFsc2VcbiAgICAgICAgZm9yKGxldCBpIGluIHNlbGYubG9ja19wYXJ0bmVyX2lkcyl7IC8vIGssdiBpbiBwYWlycyhzZWxmLmxvY2tfcGFydG5lcl9pZHMpIGRvXG4gICAgICAgICAgICBsZXQgdiA9IHNlbGYubG9ja19wYXJ0bmVyX2lkc1tpXVxuICAgICAgICAgICAgaWYgKHYuaWQgJiYgdi5pZCA9PSBpZCApe1xuICAgICAgICAgICAgICAgIGlzX2xvY2tlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc19sb2NrZWRcbiAgICB9LFxuICAgIC8vIC0tIOW3pui+ueS4uuepuuaXtuaSreaUvueahOeJueaViFxuICAgIGhhbmRsZUxlZnRFbXB0eUVmZmVjdCggc3RhdHVzICl7XG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICBpZiAoc3RhdHVzID09IGZhbHNlKXsgXG4gICAgICAgICAgICBpZiAoc2VsZi5sZWZ0X2VtcHR5X2VmZmVjdCkge1xuICAgICAgICAgICAgICAgIHNlbGYubGVmdF9lbXB0eV9lZmZlY3Quc2tlbGV0b25EYXRhID0gbnVsbFxuICAgICAgICAgICAgICAgIHRoaXMubGVmdF9lbXB0eV9lZmZlY3Quc2V0VG9TZXR1cFBvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnRfZW1wdHlfZWZmZWN0LmNsZWFyVHJhY2tzKCk7XG4gICAgICAgICAgICAgICAgc2VsZi5sZWZ0X2VtcHR5X2VmZmVjdCA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLmxlZnRfZWZmZWN0X25vZGUgJiYgIXRoaXMubGVmdF9lbXB0eV9lZmZlY3Qpe1xuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gUGF0aFRvb2wuZ2V0U3BpbmVQYXRoKFwiRTI0MDAxXCIsIFwiYWN0aW9uXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhwYXRoLCBmdW5jdGlvbihza2VsZXRvbl9kYXRhKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0X2VtcHR5X2VmZmVjdCA9IHNlbGYubGVmdF9lZmZlY3Rfbm9kZS5nZXRDaGlsZEJ5TmFtZShcImFjdGlvblwiKS5nZXRDb21wb25lbnQoc3AuU2tlbGV0b24pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdF9lbXB0eV9lZmZlY3Quc2tlbGV0b25EYXRhID0gc2tlbGV0b25fZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0X2VtcHR5X2VmZmVjdC5zZXRBbmltYXRpb24oMCwgXCJhY3Rpb25cIiwgdHJ1ZSk7ICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpOyAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyAtLSDlj7PovrnkuLrpmo/mnLrml7bnmoTnibnmlYhcbiAgICBoYW5kbGVSaWdodFJhbmRvbUVmZmVjdCggc3RhdHVzICl7XG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICBpZiAoc3RhdHVzID09IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5yaWdodF9yYW5kb21fZWZmZWN0KXtcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0X3JhbmRvbV9lZmZlY3Quc2V0VG9TZXR1cFBvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0X3JhbmRvbV9lZmZlY3QuY2xlYXJUcmFja3MoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0X3JhbmRvbV9lZmZlY3Quc2tlbGV0b25EYXRhID0gbnVsbDtcbiAgICAgICAgICAgICAgICBzZWxmLnJpZ2h0X3JhbmRvbV9lZmZlY3QgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYgKHNlbGYucmlnaHRfZWZmZWN0X25vZGUgJiYgIXNlbGYucmlnaHRfcmFuZG9tX2VmZmVjdCl7XG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoXCJFMjQwMDJcIiwgXCJhY3Rpb25cIik7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHBhdGgsIGZ1bmN0aW9uKHNrZWxldG9uX2RhdGEpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0X3JhbmRvbV9lZmZlY3QgPSBzZWxmLnJpZ2h0X2VmZmVjdF9ub2RlLmdldENoaWxkQnlOYW1lKFwiYWN0aW9uXCIpLmdldENvbXBvbmVudChzcC5Ta2VsZXRvbilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodF9yYW5kb21fZWZmZWN0LnNrZWxldG9uRGF0YSA9IHNrZWxldG9uX2RhdGE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHRfcmFuZG9tX2VmZmVjdC5zZXRBbmltYXRpb24oMCwgXCJhY3Rpb25cIiwgdHJ1ZSk7ICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLy0tIOWPs+i+uee9ruaNouaIkOWKn+eahOeJueaViFxuICAgIGhhbmRsZVJpZ2h0Q2hhbmdlRWZmZWN0KCBzdGF0dXMgKXtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICAgIGlmIChzdGF0dXMgPT0gZmFsc2Upe1xuICAgICAgICAgICAgaWYgKHNlbGYucmlnaHRfY2hhbmdlX2VmZmVjdCl7XG4gICAgICAgICAgICAgICAgc2VsZi5yaWdodF9jaGFuZ2VfZWZmZWN0LnNrZWxldG9uRGF0YSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodF9jaGFuZ2VfZWZmZWN0LnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodF9jaGFuZ2VfZWZmZWN0LmNsZWFyVHJhY2tzKCk7XG4gICAgICAgICAgICAgICAgc2VsZi5yaWdodF9jaGFuZ2VfZWZmZWN0ID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHNlbGYucmlnaHRfZWZmZWN0X25vZGUgJiYgIXNlbGYucmlnaHRfY2hhbmdlX2VmZmVjdCl7XG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoXCJFMjQwMDNcIiwgXCJhY3Rpb25cIik7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHBhdGgsIGZ1bmN0aW9uKHNrZWxldG9uX2RhdGEpe1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnJpZ2h0X2NoYW5nZV9lZmZlY3QgPSBzZWxmLnJpZ2h0X2VmZmVjdF9ub2RlLmdldENoaWxkQnlOYW1lKFwiYWN0aW9uMVwiKS5nZXRDb21wb25lbnQoc3AuU2tlbGV0b24pXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucmlnaHRfY2hhbmdlX2VmZmVjdC5za2VsZXRvbkRhdGEgPSBza2VsZXRvbl9kYXRhXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucmlnaHRfY2hhbmdlX2VmZmVjdC5zZXRBbmltYXRpb24oMCwgXCJhY3Rpb25cIiAsIGZhbHNlKVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIH1lbHNlIGlmKHNlbGYucmlnaHRfY2hhbmdlX2VmZmVjdCkge1xuICAgICAgICAgICAgICAgIHNlbGYucmlnaHRfY2hhbmdlX2VmZmVjdC5zZXRBbmltYXRpb24oMCwgXCJhY3Rpb25cIiAsIGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgIH0sXG4gICAgLy8g5b2T6Z2i5p2/5LuO5Li76IqC54K56YeK5pS+5o6J55qE6LCD55So5o6l5Y+jLOmcgOimgeaJi+WKqOiwg+eUqCzogIzkuJTkuZ/kuIDlrpropoHosIPnlKhcbiAgICBvbkRlbGV0ZTpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgaWYoc2VsZi5yb2xlX2NoYW5nZV9pbmZvX2V2ZW50KXtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZChzZWxmLnJvbGVfY2hhbmdlX2luZm9fZXZlbnQpXG4gICAgICAgICAgICBzZWxmLnJvbGVfY2hhbmdlX2luZm9fZXZlbnQgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgaWYoc2VsZi5jaGFuZ2Vfc3VjY2Vzc19ldmVudCl7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC51bmJpbmQoc2VsZi5jaGFuZ2Vfc3VjY2Vzc19ldmVudClcbiAgICAgICAgICAgIHNlbGYuY2hhbmdlX3N1Y2Nlc3NfZXZlbnQgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGYubGVmdF9yb2xlKXtcbiAgICAgICAgICAgIHNlbGYubGVmdF9yb2xlLmRlbGV0ZU1lKClcbiAgICAgICAgICAgIHNlbGYubGVmdF9yb2xlID0gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGYucmlnaHRfcm9sZSkge1xuICAgICAgICAgICAgc2VsZi5yaWdodF9yb2xlLmRlbGV0ZU1lKClcbiAgICAgICAgICAgIHNlbGYucmlnaHRfcm9sZSA9IG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlUmlnaHRSYW5kb21FZmZlY3QoZmFsc2UpXG4gICAgICAgIHRoaXMuaGFuZGxlTGVmdEVtcHR5RWZmZWN0KGZhbHNlKVxuICAgICAgICB0aGlzLmhhbmRsZVJpZ2h0Q2hhbmdlRWZmZWN0KGZhbHNlKVxuICAgIH0sXG59KVxubW9kdWxlLmV4cG9ydHMgPSBTZWVycGFsYWNlX2NoYW5nZV9QYW5lbDsiXX0=