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
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/hero/view/hero_skin_window.js';
                    var __require = nodeEnv ? function (request) {
                        return cc.require(request);
                    } : function (request) {
                        return __quick_compile_project__.require(request, __filename);
                    };
                    function __define (exports, require, module) {
                        if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, '0ad81sQHl9CU6uwSVzuqOoK', 'hero_skin_window');
// Scripts/mod/hero/view/hero_skin_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     英雄查看皮肤立绘界面
// <br/>Create: 2019-09-11 20:22:43
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var HeroController = require("hero_controller");
 
var CommonScrollViewSingleLayout = require("common_scrollview_single");
 
var BackPackConst = require("backpack_const");
 
var BackpackController = require("backpack_controller");
 
var CommonAlert = require("commonalert");
 
var ActionController = require("action_controller");
 
var MallConst = require("mall_const");
 
var MallController = require("mall_controller");
 
var BaseRole = require("baserole");
 
var HeroEvent = require("hero_event");
 
var MainUIController = require("mainui_controller");
 
var MainuiConst = require("mainui_const");
 
var Hero_skinWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("hero", "hero_skin_window");
    this.viewTag = SCENE_TAG.dialogue; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Full; //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    //能否点击头像
    this.can_click_btn = true;
    this.ctrl = HeroController.getInstance();
    this.model = this.ctrl.getModel();
    this.color_1 = new cc.Color(0x64, 0x32, 0x23, 0xff);
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    this.background = this.seekChild("background", cc.Sprite);
    this.background.node.scale = FIT_SCALE;
    this.loadRes(PathTool.getBigBg("hero_draw_bg", null, "hero"), function (sp) {
      this.background.spriteFrame = sp;
    }.bind(this));
    this.main_container = this.seekChild("main_container"); //英雄名字
 
    this.hero_name_lb = this.seekChild("hero_name", cc.Label);
    this.hero_name_lb.string = "";
    this.title_name_lb = this.seekChild("title_name", cc.Label);
    this.title_name_lb.string = ""; //英雄立绘
 
    this.hero_draw_icon_nd = this.seekChild(this.main_container, "hero_draw_icon");
    this.hero_draw_icon_sp = this.seekChild(this.main_container, "hero_draw_icon", cc.Sprite);
    this.hero_draw_icon_x = this.hero_draw_icon_nd.x;
    this.hero_draw_icon_y = this.hero_draw_icon_nd.y; //底部面板
 
    this.bottom_panel = this.seekChild(this.main_container, "bottom_panel"); //英雄信息面板
 
    this.hero_panel = this.seekChild(this.bottom_panel, "hero_panel");
    this.hero_panel_x = this.hero_panel.x;
    this.hero_panel.x += cc.winSize.width * 2;
    this.hero_panel.active = true;
    this.mode_node = this.seekChild(this.hero_panel, "model_node");
    this.hero_panel_bg_nd = this.seekChild(this.hero_panel, "bg");
    this.line_nd = this.seekChild(this.hero_panel, "line");
    this.name_lb = this.seekChild(this.hero_panel, "name", cc.Label); //属性面板
 
    this.attr_panel = this.seekChild(this.bottom_panel, "attr_panel");
    this.attr_panel_x = this.attr_panel.x;
    this.attr_panel.x += cc.winSize.width * 2;
    this.attr_panel.active = true;
    var time_key = this.seekChild(this.attr_panel, "time_key", cc.Label);
    time_key.string = Utils.TI18N("有效时间:");
    var attr_key = this.seekChild(this.attr_panel, "attr_key", cc.Label);
    attr_key.string = Utils.TI18N("属性加成:"); //时间
 
    this.time_val_lb = this.seekChild(this.attr_panel, "time_val", cc.Label);
    this.attr_item_list = {};
    this.show_btn = this.seekChild(this.bottom_panel, "show_btn");
    this.show_btn_icon_nd = this.seekChild(this.show_btn, "icon");
    this.left_btn = this.seekChild(this.bottom_panel, "left_btn");
    this.right_btn = this.seekChild(this.bottom_panel, "right_btn");
    this.lay_scrollview = this.seekChild(this.bottom_panel, "lay_scrollview");
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    Utils.onTouchEnd(this.left_btn, function () {
      this.ctrl.openHeroSkinWindow(false);
    }.bind(this), 2);
    Utils.onTouchEnd(this.right_btn, function () {
      //确定选择当前皮肤做作为显示皮肤
      if (!this.hero_vo) return;
      if (!this.skin_data_list) return;
      var skin_data = this.skin_data_list[this.select_skin_index];
 
      if (skin_data && skin_data.is_skin_data) {
        //换成其他皮肤
        if (this.hero_vo.use_skin != skin_data.skin_id) {
          this.ctrl.sender11019(this.hero_vo.partner_id, skin_data.skin_id);
        }
      } else {
        if (this.hero_vo.use_skin != 0) {
          //换回原来皮肤
          this.ctrl.sender11019(this.hero_vo.partner_id, 0);
        }
      }
    }.bind(this), 1);
    Utils.onTouchEnd(this.show_btn, function () {
      //显示
      if (!this.hero_vo) return;
      if (!this.skin_data_list) return;
 
      if (this.is_show_attr) {
        this.is_show_attr = false;
        this.attr_panel.x += cc.winSize.width * 2;
        this.hero_panel.x = this.hero_panel_x;
        this.updateHeroInfo(1);
 
        if (this.show_btn_icon_nd) {
          this.show_btn_icon_nd.setScale(-1);
        }
      } else {
        this.is_show_attr = true;
        var skin_data = this.skin_data_list[this.select_skin_index];
        this.hero_panel.x += cc.winSize.width * 2;
 
        if (skin_data && skin_data.is_skin_data) {
          this.attr_panel.x = this.attr_panel_x;
          this.updateAttrInfo();
        } else {
          this.attr_panel.x += cc.winSize.width * 2;
        }
 
        if (this.show_btn_icon_nd) {
          this.show_btn_icon_nd.setScale(1);
        }
      }
    }.bind(this), 2);
    this.addGlobalEvent(HeroEvent.Hero_Skin_Info_Event, function () {
      if (this.select_skin_index == null) return;
      if (!this.skin_data_list) return;
 
      for (var i in this.skin_data_list) {
        var v = this.skin_data_list[i];
 
        if (this.model.isUnlockHeroSkin(v.skin_id)) {
          v.is_lock = false;
        } else {
          v.is_lock = true;
        }
      }
 
      if (this.use_skin_index != null) {
        this.updateSkinList(this.use_skin_index);
        this.use_skin_index = null;
      } else {
        this.updateSkinList(this.select_skin_index);
      }
    }, this);
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(hero_vo) {
    if (!hero_vo) return;
    this.hero_vo = hero_vo;
    var bid_config = Config.partner_skin_data.data_partner_bid_info[this.hero_vo.bid];
    if (!bid_config) return;
    var partner_config = Config.partner_data.data_partner_base[this.hero_vo.bid];
 
    if (partner_config) {
      this.hero_name_lb.string = partner_config.name;
    } //皮肤数据
 
 
    this.skin_data_list = [];
 
    for (var skin_id in bid_config) {
      var v = bid_config[skin_id];
      var data = {};
      data.is_skin_data = true; //表示是皮肤数据
 
      if (this.model.isUnlockHeroSkin(v.skin_id)) {
        data.is_lock = false;
      } else {
        data.is_lock = true;
      }
 
      data.skin_id = skin_id;
      data.config = Config.partner_skin_data.data_skin_info[v.skin_id];
      this.skin_data_list.push(data);
    }
 
    this.skin_data_list.sort(Utils.tableLowerSorter(["skin_id"])); //第一个肯定是本体
 
    this.skin_data_list.unshift(this.hero_vo);
    var select_index = 0;
    var use_skin = this.hero_vo.use_skin || 0;
 
    if (use_skin != 0) {
      for (var i in this.skin_data_list) {
        var _v = this.skin_data_list[i];
 
        if (_v.skin_id == use_skin) {
          select_index = i;
        }
      }
    }
 
    this.is_show_attr = true;
    this.updateSkinList(select_index);
  },
  updateSkinList: function updateSkinList(select_index) {
    if (this.scroll_view == null) {
      var scroll_view_size = this.lay_scrollview.getContentSize();
      var list_setting = {
        start_x: 0,
        space_x: 0,
        start_y: 0,
        space_y: 0,
        item_width: 120,
        item_height: 120,
        row: 1,
        col: 1,
        need_dynamic: true
      };
      this.scroll_view = new CommonScrollViewSingleLayout();
      this.scroll_view.createScroll(this.lay_scrollview, cc.v2(0, 0), ScrollViewDir.horizontal, ScrollViewStartPos.top, scroll_view_size, list_setting, cc.v2(0.5, 0.5));
      this.scroll_view.registerScriptHandlerSingle(this.createNewCell.bind(this), ScrollViewFuncType.CreateNewCell);
      this.scroll_view.registerScriptHandlerSingle(this.numberOfCells.bind(this), ScrollViewFuncType.NumberOfCells);
      this.scroll_view.registerScriptHandlerSingle(this.updateCellByIndex.bind(this), ScrollViewFuncType.UpdateCellByIndex);
      this.scroll_view.registerScriptHandlerSingle(this.onCellTouched.bind(this), ScrollViewFuncType.OnCellTouched);
      var max_count = Math.floor(scroll_view_size.width / list_setting.item_width);
 
      if (this.skin_data_list.length <= max_count) {
        this.scroll_view.setClickEnabled(false);
      }
    }
 
    var select_index = select_index || 0;
    this.scroll_view.reloadData(select_index);
  },
  //     --创建cell 
  // --@width 是setting.item_width
  // --@height 是setting.item_height
  createNewCell: function createNewCell(width, height) {
    var cell = ItemsPool.getInstance().getItem("backpack_item");
    cell.initConfig(false, 1, false, true);
    cell.show();
    cell.setDefaultTip();
    cell.setQualityBG(BackPackConst.quality.orange);
    cell.addCallBack(function () {
      this.onCellTouched(cell);
    }.bind(this));
    return cell;
  },
  //获取数据数量
  numberOfCells: function numberOfCells() {
    if (!this.skin_data_list) return 0;
    return this.skin_data_list.length;
  },
  // --更新cell(拖动的时候.刷新数据时候会执行次方法)
  // --cell :createNewCell的返回的对象
  // --index :数据的索引
  updateCellByIndex: function updateCellByIndex(cell, index) {
    this.startUpdate(100, function () {
      cell.index = index;
      var skin_data = this.skin_data_list[index];
      if (!skin_data) return;
      var icon_res = null;
 
      if (skin_data.is_skin_data) {
        icon_res = PathTool.getHeadRes(skin_data.config.head_id);
        cell.setItemIcon(icon_res);
 
        if (skin_data.is_lock) {
          cell.setItemIconUnEnabled(true);
        } else {
          cell.setItemIconUnEnabled(false);
        }
      } else {
        var key = Utils.getNorKey(skin_data.bid, skin_data.star);
        var star_config = gdata("partner_data", "data_partner_star", [key]);
 
        if (star_config) {
          icon_res = PathTool.getHeadRes(star_config.head_id);
          cell.setItemIcon(icon_res);
        }
 
        cell.setItemIconUnEnabled(false);
      }
 
      if (this.select_skin_index != null && this.select_skin_index == index) {
        cell.setSelected(true);
      } else {
        cell.setSelected(false);
      }
    }.bind(this), 1);
  },
  //点击cell .需要在 createNewCell 设置点击事件
  onCellTouched: function onCellTouched(cell) {
    if (!this.can_click_btn) return;
    if (cell.index == null) return;
    var index = cell.index;
    var skin_data = this.skin_data_list[index];
    if (!skin_data) return;
 
    if (skin_data.is_skin_data) {
      if (skin_data.is_lock) {
        this.setLockInfo(skin_data, index);
        return;
      }
    }
 
    if (this.select_cell != null) {
      this.select_cell.setSelected(false);
    }
 
    this.select_cell = cell;
    this.select_cell.setSelected(true);
    this.updateSelectSkinInfo(index);
  },
  //更新选中的皮肤信息
  updateSelectSkinInfo: function updateSelectSkinInfo(index) {
    if (!this.select_skin_index && this.select_skin_index == index) return;
    this.select_skin_index = index;
    var skin_data = this.skin_data_list[this.select_skin_index];
    var name_str = "";
 
    if (skin_data.config) {
      name_str = skin_data.config.skin_name;
    } else {
      var config = gdata("partner_data", "data_partner_library", [skin_data.bid]);
 
      if (config) {
        name_str = config.title;
      }
    }
 
    this.title_name_lb.string = name_str;
 
    if (skin_data.is_skin_data) {
      this.skin_config = skin_data.config;
 
      if (this.is_show_attr) {
        this.attr_panel.x = this.attr_panel_x;
        this.updateAttrInfo();
      } else {
        this.attr_panel.x += cc.winSize.width * 2;
      }
    } else {
      //英雄对象
      this.skin_config = gdata("partner_data", "data_partner_library", [skin_data.bid]);
      this.attr_panel.x += cc.winSize.width * 2;
    }
 
    this.updateDrawInfo();
 
    if (!this.is_show_attr) {
      this.updateHeroInfo(2);
    }
  },
  setLockInfo: function setLockInfo(skin_data, index) {
    var dic_item_id = {};
 
    for (var i in skin_data.config.item_id_list) {
      var id = skin_data.config.item_id_list[i];
      dic_item_id[id] = true;
    }
 
    var have_item = null;
    var have_list = [];
    var list = BackpackController.getInstance().getModel().getBagItemList(BackPackConst.Bag_Code.BACKPACK) || {};
 
    for (var _i in list) {
      var item = list[_i];
 
      if (item && item.config && dic_item_id[item.config.id]) {
        //背包上有道具
        var data = {};
 
        if (item.config.client_effect[0] && item.config.client_effect[0][1]) {
          data.time = item.config.client_effect[0][1];
        } else {
          data.time = 1;
        }
 
        if (data.time == 0) {
          //表示有永久的皮肤
          have_item = item;
          break;
        }
 
        data.item_info = item;
        have_list.push(data);
      }
    }
 
    if (have_item) {
      //表示有永久的皮肤
      this.useSkinItemByID(have_item, index);
      return;
    }
 
    if (have_list.length > 0) {
      have_list.sort(Utils.tableUpperSorter(["time"]));
      this.useSkinItemByID(have_list[0].item_info, index);
    } else {
      //说明该皮肤不能同商城获取
      // if (skin_data.config.is_shop == 0) {
      //     message(Utils.TI18N("暂未获取此皮肤,请前往相关活动或玩法中获取!"));
      // } else {
      this.gotoSkinAction(skin_data.config); // }
    }
  },
  //使用皮肤道具
  useSkinItemByID: function useSkinItemByID(have_item, index) {
    if (have_item.config) {
      var color = BackPackConst.getWhiteQualityColorStr(have_item.config.quality);
      var str = cc.js.formatStr(Utils.TI18N("已拥有解锁道具,是否消耗<div fontcolor=#%s>%s</div>解锁该皮肤?"), color, have_item.config.name);
 
      var callback = function () {
        this.use_skin_index = index;
        BackpackController.getInstance().sender10515(have_item.id, 1);
      }.bind(this);
 
      CommonAlert.show(str, Utils.TI18N("确定"), callback, Utils.TI18N("取消"), null, 2, null, {
        title: Utils.TI18N("解锁皮肤")
      });
    }
  },
  //跳转活动id
  gotoSkinAction: function gotoSkinAction(config) {
    var callback = function () {
      //优先找皮肤活动
      if (config.action_bid != 0) {
        //是否存在
        var is_exist = ActionController.getInstance().checkActionExistByActionBid(config.action_bid);
 
        if (is_exist) {
          Utils.closeAllWindow();
          this.startUpdate(100, function () {
            ActionController.getInstance().openActionMainPanel(true, null, config.action_bid);
          }.bind(this), 1);
          return;
        }
      }
 
      if (config.main_id != null) {
        var is_has = MainUIController.getInstance().getFucntionIconVoById(config.main_id);
 
        if (is_has) {
          Utils.closeAllWindow();
          this.startUpdate(100, function () {
            ActionController.getInstance().openBuySkinWindow(true);
          }.bind(this), 1);
          return;
        }
      } //没有皮肤活动 找活动商城
 
 
      var shop_config = Config.exchange_data.data_shop_list[MallConst.MallType.HeroSkin];
 
      if (config.is_shop == 1 && shop_config && shop_config.sort != 0) {
        MallController.getInstance().openMallPanel(true, MallConst.MallType.HeroSkin);
        return;
      } //没有活动商城 提示:
 
 
      message(Utils.TI18N("暂无该皮肤获取途径"));
    }.bind(this);
 
    var str = Utils.TI18N("当前暂未拥有该皮肤,是否前往获取?");
    CommonAlert.show(str, Utils.TI18N("确定"), callback, Utils.TI18N("取消"), null, null, null, {
      title: Utils.TI18N("解锁皮肤")
    });
  },
  //更新立绘信息
  updateDrawInfo: function updateDrawInfo() {
    if (!this.skin_config) return;
    var draw_res_id = this.skin_config.draw_res;
 
    if (draw_res_id == null || draw_res_id == "") {
      draw_res_id = this.getDefaultDrawRes();
    }
 
    if (draw_res_id) {
      var bg_res = PathTool.getIconPath("herodraw/herodrawres", draw_res_id);
 
      if (this.hero_draw_icon_sp) {
        this.loadRes(bg_res, function (sp) {
          this.hero_draw_icon_sp.spriteFrame = sp;
        }.bind(this));
      }
 
      if (this.skin_config.scale == 0) {
        this.hero_draw_icon_nd.scale = 1;
      } else {
        this.hero_draw_icon_nd.scale = this.skin_config.scale / 100;
      }
 
      if (this.skin_config.draw_offset && Utils.next(this.skin_config.draw_offset) != null) {
        var offset_x = this.skin_config.draw_offset[0][0] || 0;
        var offset_y = this.skin_config.draw_offset[0][1] || 0;
        this.hero_draw_icon_nd.setPosition(this.hero_draw_icon_x + offset_x, this.hero_draw_icon_y + offset_y);
      }
    }
  },
  //显示属性
  updateAttrInfo: function updateAttrInfo() {
    var _this = this;
 
    if (!this.skin_config) return;
    var end_time = this.model.getHeroSkinInfoBySkinID(this.skin_config.skin_id);
 
    if (end_time != null) {
      if (end_time == 0) {
        this.time_val_lb.string = Utils.TI18N("永久");
        this.time_val_lb.node.stopAllActions();
      } else {
        var time = end_time - gcore.SmartSocket.getTime();
 
        if (time <= 0) {
          this.time_val_lb.string = Utils.TI18N("00:00:00");
        } else {
          Utils.commonCountDownTime(this.time_val_lb, time);
        }
      }
    }
 
    var y = 27;
    var width_item = 150;
    var offset_x = 150;
    var size = cc.size(width_item, 35);
 
    for (var i in this.attr_item_list) {
      var v = this.attr_item_list[i];
      v.bg_sp.node.active = false;
      v.key_rt.node.active = false;
    }
 
    var _loop = function _loop(_i2) {
      var v = _this.skin_config.skin_attr[_i2];
      var x = 200 + (_i2 - 1) * width_item + offset_x;
 
      if (_this.attr_item_list[_i2] == null) {
        _this.attr_item_list[_i2] = _this.createAttrItem(x, y, size);
      } else {
        _this.attr_item_list[_i2].bg_sp.node.active = true;
        _this.attr_item_list[_i2].key_rt.node.active = true;
      }
 
      var arr = Utils.commonGetAttrInfoByKeyValue(v[0], v[1]);
      var str = cc.js.formatStr("<img src='%s'/> %s + %s", arr.icon, arr.attr_name, arr.attr_val);
      _this.attr_item_list[_i2].key_rt.string = str;
 
      _this.loadRes(arr.res, function (resObject) {
        this.attr_item_list[_i2].key_rt.addSpriteFrame(resObject);
      }.bind(_this));
    };
 
    for (var _i2 in this.skin_config.skin_attr) {
      _loop(_i2);
    }
  },
  //创建属性item
  createAttrItem: function createAttrItem(x, y, size) {
    var item = {};
    var res = PathTool.getUIIconPath("hero", "partner_skin_03");
    item.bg_sp = Utils.createImage(this.attr_panel, null, x, y, cc.v2(0, 0.5), null, 0, true);
    this.loadRes(res, function (sp) {
      item.bg_sp.spriteFrame = sp;
    });
    item.bg_sp.node.setContentSize(size);
    item.key_rt = Utils.createRichLabel(22, this.color_1, cc.v2(0, 0.5), cc.v2(x + 10, y), 24, 380, this.attr_panel, "left");
    return item;
  },
  //更新英雄信息
  //来源位置 1 表示 按show_btn 的   2 表示 按皮肤头像的
  updateHeroInfo: function updateHeroInfo(form_type) {
    var skin_data = this.skin_data_list[this.select_skin_index];
    var hero_config = null;
    var skin_id = 0;
    var hero_vo = this.skin_data_list[0];
 
    if (skin_data.is_skin_data) {
      hero_config = gdata("partner_skin_data", "data_hero_info", [skin_data.skin_id]);
      skin_id = skin_data.config.skin_id;
    }
 
    this.updateSpine(hero_vo, skin_id, form_type); //说明有传记
 
    if (hero_config) {// this.line_nd.active = true;
      // this.name_lb.node.active = true;
    }
  },
  //更新模型,也是初始化模型
  //@is_refresh  是否需要检测
  updateSpine: function updateSpine(hero_vo, skin_id, form_type) {
    if (this.record_skin_id != null && this.record_skin_id == skin_id) return;
    this.record_skin_id = skin_id;
 
    var fun = function () {
      if (!this.spine) {
        this.spine = new BaseRole();
        this.spine.setParent(this.mode_node);
        this.spine.setPosition(0, 104);
        this.spine.setData(BaseRole.type.partner, hero_vo, PlayerAction.show, true, 0.45, {
          skin_id: skin_id
        });
        this.spine.showShadowUI(true);
        var action = cc.fadeIn(0.2);
        this.spine.node.runAction(action);
      }
    }.bind(this);
 
    var callback = function () {
      this.spine.node.stopAllActions();
      this.spine.node.removeFromParent();
      this.spine = null;
      this.can_click_btn = true;
      fun();
    }.bind(this);
 
    if (this.spine) {
      this.can_click_btn = false;
 
      if (form_type == 2) {
        var action = cc.fadeOut(0.2);
        this.spine.node.runAction(cc.sequence(action, cc.callFunc(callback)));
      } else {
        callback();
      }
    } else {
      fun();
    }
  },
  //获取缺省的模型id
  getDefaultModeRes: function getDefaultModeRes() {
    var partner_config = this.getPartnerConfig()[0];
    var star_config = this.getPartnerConfig()[1];
 
    if (partner_config && star_config) {
      return star_config.res_id;
    }
  },
  //获取缺省的模型立绘
  getDefaultDrawRes: function getDefaultDrawRes() {
    var partner_config = this.getPartnerConfig()[0];
    var star_config = this.getPartnerConfig()[1];
 
    if (partner_config && star_config) {
      return partner_config.draw_res;
    }
  },
  //获取英雄对应配置
  getPartnerConfig: function getPartnerConfig() {
    if (!this.hero_vo) return;
 
    if (this.partner_config == null) {
      this.partner_config = Config.partner_data.data_partner_base[this.hero_vo.bid];
    }
 
    if (this.partner_config && this.star_config == null) {
      var key = Utils.getNorKey(this.partner_config.bid, this.partner_config.init_star);
      this.star_config = gdata("partner_data", "data_partner_star", [key]);
    }
 
    return [this.partner_config, this.star_config];
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    if (this.scroll_view) {
      this.scroll_view.deleteMe();
      this.scroll_view = null;
    }
 
    this.time_val_lb.node.stopAllActions();
    this.ctrl.openHeroSkinWindow();
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvXFx2aWV3XFxoZXJvX3NraW5fd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIkhlcm9Db250cm9sbGVyIiwiQ29tbW9uU2Nyb2xsVmlld1NpbmdsZUxheW91dCIsIkJhY2tQYWNrQ29uc3QiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJDb21tb25BbGVydCIsIkFjdGlvbkNvbnRyb2xsZXIiLCJNYWxsQ29uc3QiLCJNYWxsQ29udHJvbGxlciIsIkJhc2VSb2xlIiwiSGVyb0V2ZW50IiwiTWFpblVJQ29udHJvbGxlciIsIk1haW51aUNvbnN0IiwiSGVyb19za2luV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsImRpYWxvZ3VlIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiRnVsbCIsImluaXRDb25maWciLCJjYW5fY2xpY2tfYnRuIiwiY3RybCIsImdldEluc3RhbmNlIiwibW9kZWwiLCJnZXRNb2RlbCIsImNvbG9yXzEiLCJDb2xvciIsIm9wZW5DYWxsQmFjayIsImJhY2tncm91bmQiLCJzZWVrQ2hpbGQiLCJTcHJpdGUiLCJub2RlIiwic2NhbGUiLCJGSVRfU0NBTEUiLCJsb2FkUmVzIiwiZ2V0QmlnQmciLCJzcCIsInNwcml0ZUZyYW1lIiwiYmluZCIsIm1haW5fY29udGFpbmVyIiwiaGVyb19uYW1lX2xiIiwiTGFiZWwiLCJzdHJpbmciLCJ0aXRsZV9uYW1lX2xiIiwiaGVyb19kcmF3X2ljb25fbmQiLCJoZXJvX2RyYXdfaWNvbl9zcCIsImhlcm9fZHJhd19pY29uX3giLCJ4IiwiaGVyb19kcmF3X2ljb25feSIsInkiLCJib3R0b21fcGFuZWwiLCJoZXJvX3BhbmVsIiwiaGVyb19wYW5lbF94Iiwid2luU2l6ZSIsIndpZHRoIiwiYWN0aXZlIiwibW9kZV9ub2RlIiwiaGVyb19wYW5lbF9iZ19uZCIsImxpbmVfbmQiLCJuYW1lX2xiIiwiYXR0cl9wYW5lbCIsImF0dHJfcGFuZWxfeCIsInRpbWVfa2V5IiwiVXRpbHMiLCJUSTE4TiIsImF0dHJfa2V5IiwidGltZV92YWxfbGIiLCJhdHRyX2l0ZW1fbGlzdCIsInNob3dfYnRuIiwic2hvd19idG5faWNvbl9uZCIsImxlZnRfYnRuIiwicmlnaHRfYnRuIiwibGF5X3Njcm9sbHZpZXciLCJyZWdpc3RlckV2ZW50Iiwib25Ub3VjaEVuZCIsIm9wZW5IZXJvU2tpbldpbmRvdyIsImhlcm9fdm8iLCJza2luX2RhdGFfbGlzdCIsInNraW5fZGF0YSIsInNlbGVjdF9za2luX2luZGV4IiwiaXNfc2tpbl9kYXRhIiwidXNlX3NraW4iLCJza2luX2lkIiwic2VuZGVyMTEwMTkiLCJwYXJ0bmVyX2lkIiwiaXNfc2hvd19hdHRyIiwidXBkYXRlSGVyb0luZm8iLCJzZXRTY2FsZSIsInVwZGF0ZUF0dHJJbmZvIiwiYWRkR2xvYmFsRXZlbnQiLCJIZXJvX1NraW5fSW5mb19FdmVudCIsImkiLCJ2IiwiaXNVbmxvY2tIZXJvU2tpbiIsImlzX2xvY2siLCJ1c2Vfc2tpbl9pbmRleCIsInVwZGF0ZVNraW5MaXN0Iiwib3BlblJvb3RXbmQiLCJiaWRfY29uZmlnIiwiQ29uZmlnIiwicGFydG5lcl9za2luX2RhdGEiLCJkYXRhX3BhcnRuZXJfYmlkX2luZm8iLCJiaWQiLCJwYXJ0bmVyX2NvbmZpZyIsInBhcnRuZXJfZGF0YSIsImRhdGFfcGFydG5lcl9iYXNlIiwibmFtZSIsImRhdGEiLCJjb25maWciLCJkYXRhX3NraW5faW5mbyIsInB1c2giLCJzb3J0IiwidGFibGVMb3dlclNvcnRlciIsInVuc2hpZnQiLCJzZWxlY3RfaW5kZXgiLCJzY3JvbGxfdmlldyIsInNjcm9sbF92aWV3X3NpemUiLCJnZXRDb250ZW50U2l6ZSIsImxpc3Rfc2V0dGluZyIsInN0YXJ0X3giLCJzcGFjZV94Iiwic3RhcnRfeSIsInNwYWNlX3kiLCJpdGVtX3dpZHRoIiwiaXRlbV9oZWlnaHQiLCJyb3ciLCJjb2wiLCJuZWVkX2R5bmFtaWMiLCJjcmVhdGVTY3JvbGwiLCJ2MiIsIlNjcm9sbFZpZXdEaXIiLCJob3Jpem9udGFsIiwiU2Nyb2xsVmlld1N0YXJ0UG9zIiwidG9wIiwicmVnaXN0ZXJTY3JpcHRIYW5kbGVyU2luZ2xlIiwiY3JlYXRlTmV3Q2VsbCIsIlNjcm9sbFZpZXdGdW5jVHlwZSIsIkNyZWF0ZU5ld0NlbGwiLCJudW1iZXJPZkNlbGxzIiwiTnVtYmVyT2ZDZWxscyIsInVwZGF0ZUNlbGxCeUluZGV4IiwiVXBkYXRlQ2VsbEJ5SW5kZXgiLCJvbkNlbGxUb3VjaGVkIiwiT25DZWxsVG91Y2hlZCIsIm1heF9jb3VudCIsIk1hdGgiLCJmbG9vciIsImxlbmd0aCIsInNldENsaWNrRW5hYmxlZCIsInJlbG9hZERhdGEiLCJoZWlnaHQiLCJjZWxsIiwiSXRlbXNQb29sIiwiZ2V0SXRlbSIsInNob3ciLCJzZXREZWZhdWx0VGlwIiwic2V0UXVhbGl0eUJHIiwicXVhbGl0eSIsIm9yYW5nZSIsImFkZENhbGxCYWNrIiwiaW5kZXgiLCJzdGFydFVwZGF0ZSIsImljb25fcmVzIiwiZ2V0SGVhZFJlcyIsImhlYWRfaWQiLCJzZXRJdGVtSWNvbiIsInNldEl0ZW1JY29uVW5FbmFibGVkIiwia2V5IiwiZ2V0Tm9yS2V5Iiwic3RhciIsInN0YXJfY29uZmlnIiwiZ2RhdGEiLCJzZXRTZWxlY3RlZCIsInNldExvY2tJbmZvIiwic2VsZWN0X2NlbGwiLCJ1cGRhdGVTZWxlY3RTa2luSW5mbyIsIm5hbWVfc3RyIiwic2tpbl9uYW1lIiwidGl0bGUiLCJza2luX2NvbmZpZyIsInVwZGF0ZURyYXdJbmZvIiwiZGljX2l0ZW1faWQiLCJpdGVtX2lkX2xpc3QiLCJpZCIsImhhdmVfaXRlbSIsImhhdmVfbGlzdCIsImxpc3QiLCJnZXRCYWdJdGVtTGlzdCIsIkJhZ19Db2RlIiwiQkFDS1BBQ0siLCJpdGVtIiwiY2xpZW50X2VmZmVjdCIsInRpbWUiLCJpdGVtX2luZm8iLCJ1c2VTa2luSXRlbUJ5SUQiLCJ0YWJsZVVwcGVyU29ydGVyIiwiZ290b1NraW5BY3Rpb24iLCJjb2xvciIsImdldFdoaXRlUXVhbGl0eUNvbG9yU3RyIiwic3RyIiwianMiLCJmb3JtYXRTdHIiLCJjYWxsYmFjayIsInNlbmRlcjEwNTE1IiwiYWN0aW9uX2JpZCIsImlzX2V4aXN0IiwiY2hlY2tBY3Rpb25FeGlzdEJ5QWN0aW9uQmlkIiwiY2xvc2VBbGxXaW5kb3ciLCJvcGVuQWN0aW9uTWFpblBhbmVsIiwibWFpbl9pZCIsImlzX2hhcyIsImdldEZ1Y250aW9uSWNvblZvQnlJZCIsIm9wZW5CdXlTa2luV2luZG93Iiwic2hvcF9jb25maWciLCJleGNoYW5nZV9kYXRhIiwiZGF0YV9zaG9wX2xpc3QiLCJNYWxsVHlwZSIsIkhlcm9Ta2luIiwiaXNfc2hvcCIsIm9wZW5NYWxsUGFuZWwiLCJtZXNzYWdlIiwiZHJhd19yZXNfaWQiLCJkcmF3X3JlcyIsImdldERlZmF1bHREcmF3UmVzIiwiYmdfcmVzIiwiZ2V0SWNvblBhdGgiLCJkcmF3X29mZnNldCIsIm5leHQiLCJvZmZzZXRfeCIsIm9mZnNldF95Iiwic2V0UG9zaXRpb24iLCJlbmRfdGltZSIsImdldEhlcm9Ta2luSW5mb0J5U2tpbklEIiwic3RvcEFsbEFjdGlvbnMiLCJnY29yZSIsIlNtYXJ0U29ja2V0IiwiZ2V0VGltZSIsImNvbW1vbkNvdW50RG93blRpbWUiLCJ3aWR0aF9pdGVtIiwic2l6ZSIsImJnX3NwIiwia2V5X3J0Iiwic2tpbl9hdHRyIiwiY3JlYXRlQXR0ckl0ZW0iLCJhcnIiLCJjb21tb25HZXRBdHRySW5mb0J5S2V5VmFsdWUiLCJpY29uIiwiYXR0cl9uYW1lIiwiYXR0cl92YWwiLCJyZXMiLCJyZXNPYmplY3QiLCJhZGRTcHJpdGVGcmFtZSIsImdldFVJSWNvblBhdGgiLCJjcmVhdGVJbWFnZSIsInNldENvbnRlbnRTaXplIiwiY3JlYXRlUmljaExhYmVsIiwiZm9ybV90eXBlIiwiaGVyb19jb25maWciLCJ1cGRhdGVTcGluZSIsInJlY29yZF9za2luX2lkIiwiZnVuIiwic3BpbmUiLCJzZXRQYXJlbnQiLCJzZXREYXRhIiwidHlwZSIsInBhcnRuZXIiLCJQbGF5ZXJBY3Rpb24iLCJzaG93U2hhZG93VUkiLCJhY3Rpb24iLCJmYWRlSW4iLCJydW5BY3Rpb24iLCJyZW1vdmVGcm9tUGFyZW50IiwiZmFkZU91dCIsInNlcXVlbmNlIiwiY2FsbEZ1bmMiLCJnZXREZWZhdWx0TW9kZVJlcyIsImdldFBhcnRuZXJDb25maWciLCJyZXNfaWQiLCJpbml0X3N0YXIiLCJjbG9zZUNhbGxCYWNrIiwiZGVsZXRlTWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJQyxjQUFjLEdBQUdELE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRSw0QkFBNEIsR0FBR0YsT0FBTyxDQUFDLDBCQUFELENBQTFDOztBQUNBLElBQUlHLGFBQWEsR0FBR0gsT0FBTyxDQUFDLGdCQUFELENBQTNCOztBQUNBLElBQUlJLGtCQUFrQixHQUFHSixPQUFPLENBQUMscUJBQUQsQ0FBaEM7O0FBQ0EsSUFBSUssV0FBVyxHQUFHTCxPQUFPLENBQUMsYUFBRCxDQUF6Qjs7QUFDQSxJQUFJTSxnQkFBZ0IsR0FBR04sT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlPLFNBQVMsR0FBR1AsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsSUFBSVEsY0FBYyxHQUFHUixPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSVMsUUFBUSxHQUFHVCxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJVSxTQUFTLEdBQUdWLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlXLGdCQUFnQixHQUFHWCxPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSVksV0FBVyxHQUFHWixPQUFPLENBQUMsY0FB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SSxLQUFLQyxjQUFMLElBQXVCLEtBQUttRSxXQUFMLElBQW9CLElBQS9DLEVBQXFEO0FBQ2pELFVBQUlILEdBQUcsR0FBR3hHLEtBQUssQ0FBQ3lHLFNBQU4sQ0FBZ0IsS0FBS2pFLGNBQUwsQ0FBb0JELEdBQXBDLEVBQXlDLEtBQUtDLGNBQUwsQ0FBb0IrSyxTQUE3RCxDQUFWO0FBQ0EsV0FBSzVHLFdBQUwsR0FBbUJDLEtBQUssQ0FBQyxjQUFELEVBQWlCLG1CQUFqQixFQUFzQyxDQUFDSixHQUFELENBQXRDLENBQXhCO0FBQ0g7O0FBQ0QsV0FBTyxDQUFDLEtBQUtoRSxjQUFOLEVBQXNCLEtBQUttRSxXQUEzQixDQUFQO0FBQ0gsR0F2bUIwQjtBQXltQjNCO0FBQ0E2RyxFQUFBQSxhQUFhLEVBQUUseUJBQVk7QUFDdkIsUUFBSSxLQUFLcEssV0FBVCxFQUFzQjtBQUNsQixXQUFLQSxXQUFMLENBQWlCcUssUUFBakI7QUFDQSxXQUFLckssV0FBTCxHQUFtQixJQUFuQjtBQUNIOztBQUNELFNBQUtqRCxXQUFMLENBQWlCbkMsSUFBakIsQ0FBc0IwTSxjQUF0QjtBQUNBLFNBQUtwTixJQUFMLENBQVVzRCxrQkFBVjtBQUNIO0FBam5CMEIsQ0FBVCxDQUF0QiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgIOiLsembhOafpeeci+earuiCpOeri+e7mOeVjOmdolxuLy8gPGJyLz5DcmVhdGU6IDIwMTktMDktMTEgMjA6MjI6NDNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XG52YXIgSGVyb0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpO1xudmFyIENvbW1vblNjcm9sbFZpZXdTaW5nbGVMYXlvdXQgPSByZXF1aXJlKFwiY29tbW9uX3Njcm9sbHZpZXdfc2luZ2xlXCIpO1xudmFyIEJhY2tQYWNrQ29uc3QgPSByZXF1aXJlKFwiYmFja3BhY2tfY29uc3RcIik7XG52YXIgQmFja3BhY2tDb250cm9sbGVyID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnRyb2xsZXJcIik7XG52YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XG52YXIgQWN0aW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJhY3Rpb25fY29udHJvbGxlclwiKTtcbnZhciBNYWxsQ29uc3QgPSByZXF1aXJlKFwibWFsbF9jb25zdFwiKTtcbnZhciBNYWxsQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWxsX2NvbnRyb2xsZXJcIik7XG52YXIgQmFzZVJvbGUgPSByZXF1aXJlKFwiYmFzZXJvbGVcIik7XG52YXIgSGVyb0V2ZW50ID0gcmVxdWlyZShcImhlcm9fZXZlbnRcIik7XG52YXIgTWFpblVJQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG5cblxudmFyIEhlcm9fc2tpbldpbmRvdyA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJoZXJvXCIsIFwiaGVyb19za2luX3dpbmRvd1wiKTtcbiAgICAgICAgdGhpcy52aWV3VGFnID0gU0NFTkVfVEFHLmRpYWxvZ3VlOyAgICAgICAgICAgICAgICAvL+ivpeeql+S9k+aJgOWxnnVp5bGC57qnLOWFqOWxj3Vp6ZyA6KaB5ZyodWnlsYIs6Z2e5YWo5bGPdWnlnKhkaWFsb2d1ZeWxgizov5nkuKropoHms6jmhI9cbiAgICAgICAgdGhpcy53aW5fdHlwZSA9IFdpblR5cGUuRnVsbDsgICAgICAgICAgICAgICAvL+aYr+WQpuaYr+WFqOWxj+eql+S9kyAgV2luVHlwZS5GdWxsLCBXaW5UeXBlLkJpZywgV2luVHlwZS5NaW5pLCBXaW5UeXBlLlRpcHNcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW5LiA5Lqb6YWN572u5pWw5o2uLOWPr+S7peeUqOS6juWjsOaYjuS4gOS6m+WPmOmHj+S5i+exu+eahFxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy/og73lkKbngrnlh7vlpLTlg49cbiAgICAgICAgdGhpcy5jYW5fY2xpY2tfYnRuID0gdHJ1ZVxuICAgICAgICB0aGlzLmN0cmwgPSBIZXJvQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jdHJsLmdldE1vZGVsKCk7XG4gICAgICAgIHRoaXMuY29sb3JfMSA9IG5ldyBjYy5Db2xvcigweDY0LCAweDMyLCAweDIzLCAweGZmKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI7nmoTlm57osIMs5Y+v5Lul5Zyo6L+Z6YeM5o2V6I6355u45YWz6IqC54K55oiW6ICF57uE5Lu2XG4gICAgb3BlbkNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMuc2Vla0NoaWxkKFwiYmFja2dyb3VuZFwiLCBjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQubm9kZS5zY2FsZSA9IEZJVF9TQ0FMRTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEJpZ0JnKFwiaGVyb19kcmF3X2JnXCIsIG51bGwsIFwiaGVyb1wiKSwgZnVuY3Rpb24gKHNwKSB7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmQuc3ByaXRlRnJhbWUgPSBzcDtcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIHRoaXMubWFpbl9jb250YWluZXIgPSB0aGlzLnNlZWtDaGlsZChcIm1haW5fY29udGFpbmVyXCIpO1xuXG4gICAgICAgIC8v6Iux6ZuE5ZCN5a2XXG4gICAgICAgIHRoaXMuaGVyb19uYW1lX2xiID0gdGhpcy5zZWVrQ2hpbGQoXCJoZXJvX25hbWVcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLmhlcm9fbmFtZV9sYi5zdHJpbmcgPSBcIlwiO1xuICAgICAgICB0aGlzLnRpdGxlX25hbWVfbGIgPSB0aGlzLnNlZWtDaGlsZChcInRpdGxlX25hbWVcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnRpdGxlX25hbWVfbGIuc3RyaW5nID0gXCJcIjtcbiAgICAgICAgLy/oi7Hpm4Tnq4vnu5hcbiAgICAgICAgdGhpcy5oZXJvX2RyYXdfaWNvbl9uZCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9jb250YWluZXIsIFwiaGVyb19kcmF3X2ljb25cIik7XG4gICAgICAgIHRoaXMuaGVyb19kcmF3X2ljb25fc3AgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcImhlcm9fZHJhd19pY29uXCIsIGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMuaGVyb19kcmF3X2ljb25feCA9IHRoaXMuaGVyb19kcmF3X2ljb25fbmQueDtcbiAgICAgICAgdGhpcy5oZXJvX2RyYXdfaWNvbl95ID0gdGhpcy5oZXJvX2RyYXdfaWNvbl9uZC55O1xuXG4gICAgICAgIC8v5bqV6YOo6Z2i5p2/XG4gICAgICAgIHRoaXMuYm90dG9tX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJib3R0b21fcGFuZWxcIik7XG5cbiAgICAgICAgLy/oi7Hpm4Tkv6Hmga/pnaLmnb9cbiAgICAgICAgdGhpcy5oZXJvX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5ib3R0b21fcGFuZWwsIFwiaGVyb19wYW5lbFwiKTtcbiAgICAgICAgdGhpcy5oZXJvX3BhbmVsX3ggPSB0aGlzLmhlcm9fcGFuZWwueDtcbiAgICAgICAgdGhpcy5oZXJvX3BhbmVsLnggKz0gY2Mud2luU2l6ZS53aWR0aCAqIDI7XG4gICAgICAgIHRoaXMuaGVyb19wYW5lbC5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMubW9kZV9ub2RlID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5oZXJvX3BhbmVsLCBcIm1vZGVsX25vZGVcIik7XG4gICAgICAgIHRoaXMuaGVyb19wYW5lbF9iZ19uZCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuaGVyb19wYW5lbCwgXCJiZ1wiKTtcbiAgICAgICAgdGhpcy5saW5lX25kID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5oZXJvX3BhbmVsLCBcImxpbmVcIik7XG4gICAgICAgIHRoaXMubmFtZV9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuaGVyb19wYW5lbCwgXCJuYW1lXCIsIGNjLkxhYmVsKTtcblxuXG4gICAgICAgIC8v5bGe5oCn6Z2i5p2/XG4gICAgICAgIHRoaXMuYXR0cl9wYW5lbCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYm90dG9tX3BhbmVsLCBcImF0dHJfcGFuZWxcIik7XG4gICAgICAgIHRoaXMuYXR0cl9wYW5lbF94ID0gdGhpcy5hdHRyX3BhbmVsLng7XG4gICAgICAgIHRoaXMuYXR0cl9wYW5lbC54ICs9IGNjLndpblNpemUud2lkdGggKiAyO1xuICAgICAgICB0aGlzLmF0dHJfcGFuZWwuYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICBsZXQgdGltZV9rZXkgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmF0dHJfcGFuZWwsIFwidGltZV9rZXlcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aW1lX2tleS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuacieaViOaXtumXtDpcIik7XG4gICAgICAgIGxldCBhdHRyX2tleSA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYXR0cl9wYW5lbCwgXCJhdHRyX2tleVwiLCBjYy5MYWJlbCk7XG4gICAgICAgIGF0dHJfa2V5LnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5bGe5oCn5Yqg5oiQOlwiKTtcblxuICAgICAgICAvL+aXtumXtFxuICAgICAgICB0aGlzLnRpbWVfdmFsX2xiID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5hdHRyX3BhbmVsLCBcInRpbWVfdmFsXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5hdHRyX2l0ZW1fbGlzdCA9IHt9O1xuXG4gICAgICAgIHRoaXMuc2hvd19idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJvdHRvbV9wYW5lbCwgXCJzaG93X2J0blwiKTtcbiAgICAgICAgdGhpcy5zaG93X2J0bl9pY29uX25kID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5zaG93X2J0biwgXCJpY29uXCIpO1xuICAgICAgICB0aGlzLmxlZnRfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5ib3R0b21fcGFuZWwsIFwibGVmdF9idG5cIik7XG4gICAgICAgIHRoaXMucmlnaHRfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5ib3R0b21fcGFuZWwsIFwicmlnaHRfYnRuXCIpO1xuXG4gICAgICAgIHRoaXMubGF5X3Njcm9sbHZpZXcgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJvdHRvbV9wYW5lbCwgXCJsYXlfc2Nyb2xsdmlld1wiKTtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmxlZnRfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3Blbkhlcm9Ta2luV2luZG93KGZhbHNlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAyKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5yaWdodF9idG4sIGZ1bmN0aW9uICgpIHsgLy/noa7lrprpgInmi6nlvZPliY3nmq7ogqTlgZrkvZzkuLrmmL7npLrnmq7ogqRcbiAgICAgICAgICAgIGlmICghdGhpcy5oZXJvX3ZvKSByZXR1cm5cbiAgICAgICAgICAgIGlmICghdGhpcy5za2luX2RhdGFfbGlzdCkgcmV0dXJuXG4gICAgICAgICAgICBsZXQgc2tpbl9kYXRhID0gdGhpcy5za2luX2RhdGFfbGlzdFt0aGlzLnNlbGVjdF9za2luX2luZGV4XTtcbiAgICAgICAgICAgIGlmIChza2luX2RhdGEgJiYgc2tpbl9kYXRhLmlzX3NraW5fZGF0YSkge1xuICAgICAgICAgICAgICAgIC8v5o2i5oiQ5YW25LuW55qu6IKkXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGVyb192by51c2Vfc2tpbiAhPSBza2luX2RhdGEuc2tpbl9pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMTEwMTkodGhpcy5oZXJvX3ZvLnBhcnRuZXJfaWQsIHNraW5fZGF0YS5za2luX2lkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGVyb192by51c2Vfc2tpbiAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8v5o2i5Zue5Y6f5p2l55qu6IKkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5zZW5kZXIxMTAxOSh0aGlzLmhlcm9fdm8ucGFydG5lcl9pZCwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLnNob3dfYnRuLCBmdW5jdGlvbiAoKSB7ICAgLy/mmL7npLpcbiAgICAgICAgICAgIGlmICghdGhpcy5oZXJvX3ZvKSByZXR1cm5cbiAgICAgICAgICAgIGlmICghdGhpcy5za2luX2RhdGFfbGlzdCkgcmV0dXJuXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzX3Nob3dfYXR0cikge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNfc2hvd19hdHRyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyX3BhbmVsLnggKz0gY2Mud2luU2l6ZS53aWR0aCAqIDI7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX3BhbmVsLnggPSB0aGlzLmhlcm9fcGFuZWxfeDtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUhlcm9JbmZvKDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dfYnRuX2ljb25fbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93X2J0bl9pY29uX25kLnNldFNjYWxlKC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNfc2hvd19hdHRyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc2tpbl9kYXRhID0gdGhpcy5za2luX2RhdGFfbGlzdFt0aGlzLnNlbGVjdF9za2luX2luZGV4XTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fcGFuZWwueCArPSBjYy53aW5TaXplLndpZHRoICogMjtcbiAgICAgICAgICAgICAgICBpZiAoc2tpbl9kYXRhICYmIHNraW5fZGF0YS5pc19za2luX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyX3BhbmVsLnggPSB0aGlzLmF0dHJfcGFuZWxfeDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBdHRySW5mbygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0cl9wYW5lbC54ICs9IGNjLndpblNpemUud2lkdGggKiAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93X2J0bl9pY29uX25kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd19idG5faWNvbl9uZC5zZXRTY2FsZSgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMilcblxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEhlcm9FdmVudC5IZXJvX1NraW5fSW5mb19FdmVudCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0X3NraW5faW5kZXggPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2tpbl9kYXRhX2xpc3QpIHJldHVyblxuICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLnNraW5fZGF0YV9saXN0KSB7XG4gICAgICAgICAgICAgICAgbGV0IHYgPSB0aGlzLnNraW5fZGF0YV9saXN0W2ldO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmlzVW5sb2NrSGVyb1NraW4odi5za2luX2lkKSkge1xuICAgICAgICAgICAgICAgICAgICB2LmlzX2xvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2LmlzX2xvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnVzZV9za2luX2luZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNraW5MaXN0KHRoaXMudXNlX3NraW5faW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMudXNlX3NraW5faW5kZXggPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNraW5MaXN0KHRoaXMuc2VsZWN0X3NraW5faW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKGhlcm9fdm8pIHtcbiAgICAgICAgaWYgKCFoZXJvX3ZvKSByZXR1cm5cbiAgICAgICAgdGhpcy5oZXJvX3ZvID0gaGVyb192bztcblxuICAgICAgICBsZXQgYmlkX2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX3NraW5fZGF0YS5kYXRhX3BhcnRuZXJfYmlkX2luZm9bdGhpcy5oZXJvX3ZvLmJpZF07XG4gICAgICAgIGlmICghYmlkX2NvbmZpZykgcmV0dXJuXG5cbiAgICAgICAgbGV0IHBhcnRuZXJfY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX3BhcnRuZXJfYmFzZVt0aGlzLmhlcm9fdm8uYmlkXTtcbiAgICAgICAgaWYgKHBhcnRuZXJfY29uZmlnKSB7XG4gICAgICAgICAgICB0aGlzLmhlcm9fbmFtZV9sYi5zdHJpbmcgPSBwYXJ0bmVyX2NvbmZpZy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIC8v55qu6IKk5pWw5o2uXG4gICAgICAgIHRoaXMuc2tpbl9kYXRhX2xpc3QgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBza2luX2lkIGluIGJpZF9jb25maWcpIHtcbiAgICAgICAgICAgIGxldCB2ID0gYmlkX2NvbmZpZ1tza2luX2lkXTtcbiAgICAgICAgICAgIGxldCBkYXRhID0ge307XG4gICAgICAgICAgICBkYXRhLmlzX3NraW5fZGF0YSA9IHRydWU7ICAgLy/ooajnpLrmmK/nmq7ogqTmlbDmja5cblxuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuaXNVbmxvY2tIZXJvU2tpbih2LnNraW5faWQpKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5pc19sb2NrID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEuaXNfbG9jayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhLnNraW5faWQgPSBza2luX2lkO1xuICAgICAgICAgICAgZGF0YS5jb25maWcgPSBDb25maWcucGFydG5lcl9za2luX2RhdGEuZGF0YV9za2luX2luZm9bdi5za2luX2lkXTtcbiAgICAgICAgICAgIHRoaXMuc2tpbl9kYXRhX2xpc3QucHVzaChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNraW5fZGF0YV9saXN0LnNvcnQoVXRpbHMudGFibGVMb3dlclNvcnRlcihbXCJza2luX2lkXCJdKSk7XG4gICAgICAgIC8v56ys5LiA5Liq6IKv5a6a5piv5pys5L2TXG4gICAgICAgIHRoaXMuc2tpbl9kYXRhX2xpc3QudW5zaGlmdCh0aGlzLmhlcm9fdm8pO1xuXG4gICAgICAgIGxldCBzZWxlY3RfaW5kZXggPSAwO1xuICAgICAgICBsZXQgdXNlX3NraW4gPSB0aGlzLmhlcm9fdm8udXNlX3NraW4gfHwgMDtcbiAgICAgICAgaWYgKHVzZV9za2luICE9IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5za2luX2RhdGFfbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCB2ID0gdGhpcy5za2luX2RhdGFfbGlzdFtpXTtcbiAgICAgICAgICAgICAgICBpZiAodi5za2luX2lkID09IHVzZV9za2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdF9pbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNfc2hvd19hdHRyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVTa2luTGlzdChzZWxlY3RfaW5kZXgpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVTa2luTGlzdDogZnVuY3Rpb24gKHNlbGVjdF9pbmRleCkge1xuXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbF92aWV3ID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBzY3JvbGxfdmlld19zaXplID0gdGhpcy5sYXlfc2Nyb2xsdmlldy5nZXRDb250ZW50U2l6ZSgpO1xuICAgICAgICAgICAgbGV0IGxpc3Rfc2V0dGluZyA9IHtcbiAgICAgICAgICAgICAgICBzdGFydF94OiAwLFxuICAgICAgICAgICAgICAgIHNwYWNlX3g6IDAsXG4gICAgICAgICAgICAgICAgc3RhcnRfeTogMCxcbiAgICAgICAgICAgICAgICBzcGFjZV95OiAwLFxuICAgICAgICAgICAgICAgIGl0ZW1fd2lkdGg6IDEyMCxcbiAgICAgICAgICAgICAgICBpdGVtX2hlaWdodDogMTIwLFxuICAgICAgICAgICAgICAgIHJvdzogMSxcbiAgICAgICAgICAgICAgICBjb2w6IDEsXG4gICAgICAgICAgICAgICAgbmVlZF9keW5hbWljOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3ID0gbmV3IENvbW1vblNjcm9sbFZpZXdTaW5nbGVMYXlvdXQoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcuY3JlYXRlU2Nyb2xsKHRoaXMubGF5X3Njcm9sbHZpZXcsIGNjLnYyKDAsIDApLCBTY3JvbGxWaWV3RGlyLmhvcml6b250YWwsIFNjcm9sbFZpZXdTdGFydFBvcy50b3AsIHNjcm9sbF92aWV3X3NpemUsIGxpc3Rfc2V0dGluZywgY2MudjIoMC41LCAwLjUpKVxuXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnJlZ2lzdGVyU2NyaXB0SGFuZGxlclNpbmdsZSh0aGlzLmNyZWF0ZU5ld0NlbGwuYmluZCh0aGlzKSwgU2Nyb2xsVmlld0Z1bmNUeXBlLkNyZWF0ZU5ld0NlbGwpXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnJlZ2lzdGVyU2NyaXB0SGFuZGxlclNpbmdsZSh0aGlzLm51bWJlck9mQ2VsbHMuYmluZCh0aGlzKSwgU2Nyb2xsVmlld0Z1bmNUeXBlLk51bWJlck9mQ2VsbHMpXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnJlZ2lzdGVyU2NyaXB0SGFuZGxlclNpbmdsZSh0aGlzLnVwZGF0ZUNlbGxCeUluZGV4LmJpbmQodGhpcyksIFNjcm9sbFZpZXdGdW5jVHlwZS5VcGRhdGVDZWxsQnlJbmRleClcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcucmVnaXN0ZXJTY3JpcHRIYW5kbGVyU2luZ2xlKHRoaXMub25DZWxsVG91Y2hlZC5iaW5kKHRoaXMpLCBTY3JvbGxWaWV3RnVuY1R5cGUuT25DZWxsVG91Y2hlZClcbiAgICAgICAgICAgIGxldCBtYXhfY291bnQgPSBNYXRoLmZsb29yKHNjcm9sbF92aWV3X3NpemUud2lkdGggLyBsaXN0X3NldHRpbmcuaXRlbV93aWR0aCk7XG4gICAgICAgICAgICBpZiAodGhpcy5za2luX2RhdGFfbGlzdC5sZW5ndGggPD0gbWF4X2NvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlldy5zZXRDbGlja0VuYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBzZWxlY3RfaW5kZXggPSBzZWxlY3RfaW5kZXggfHwgMDtcbiAgICAgICAgdGhpcy5zY3JvbGxfdmlldy5yZWxvYWREYXRhKHNlbGVjdF9pbmRleCk7XG4gICAgfSxcblxuICAgIC8vICAgICAtLeWIm+W7umNlbGwgXG4gICAgLy8gLS1Ad2lkdGgg5pivc2V0dGluZy5pdGVtX3dpZHRoXG4gICAgLy8gLS1AaGVpZ2h0IOaYr3NldHRpbmcuaXRlbV9oZWlnaHRcbiAgICBjcmVhdGVOZXdDZWxsOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBsZXQgY2VsbCA9IEl0ZW1zUG9vbC5nZXRJbnN0YW5jZSgpLmdldEl0ZW0oXCJiYWNrcGFja19pdGVtXCIpO1xuICAgICAgICBjZWxsLmluaXRDb25maWcoZmFsc2UsIDEsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgY2VsbC5zaG93KCk7XG4gICAgICAgIGNlbGwuc2V0RGVmYXVsdFRpcCgpO1xuICAgICAgICBjZWxsLnNldFF1YWxpdHlCRyhCYWNrUGFja0NvbnN0LnF1YWxpdHkub3JhbmdlKTtcbiAgICAgICAgY2VsbC5hZGRDYWxsQmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2VsbFRvdWNoZWQoY2VsbClcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICByZXR1cm4gY2VsbFxuICAgIH0sXG5cbiAgICAvL+iOt+WPluaVsOaNruaVsOmHj1xuICAgIG51bWJlck9mQ2VsbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNraW5fZGF0YV9saXN0KSByZXR1cm4gMFxuICAgICAgICByZXR1cm4gdGhpcy5za2luX2RhdGFfbGlzdC5sZW5ndGhcbiAgICB9LFxuXG4gICAgLy8gLS3mm7TmlrBjZWxsKOaLluWKqOeahOaXtuWAmS7liLfmlrDmlbDmja7ml7blgJnkvJrmiafooYzmrKHmlrnms5UpXG4gICAgLy8gLS1jZWxsIDpjcmVhdGVOZXdDZWxs55qE6L+U5Zue55qE5a+56LGhXG4gICAgLy8gLS1pbmRleCA65pWw5o2u55qE57Si5byVXG4gICAgdXBkYXRlQ2VsbEJ5SW5kZXg6IGZ1bmN0aW9uIChjZWxsLCBpbmRleCkge1xuICAgICAgICB0aGlzLnN0YXJ0VXBkYXRlKDEwMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2VsbC5pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgbGV0IHNraW5fZGF0YSA9IHRoaXMuc2tpbl9kYXRhX2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKCFza2luX2RhdGEpIHJldHVyblxuICAgICAgICAgICAgbGV0IGljb25fcmVzID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChza2luX2RhdGEuaXNfc2tpbl9kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWNvbl9yZXMgPSBQYXRoVG9vbC5nZXRIZWFkUmVzKHNraW5fZGF0YS5jb25maWcuaGVhZF9pZCk7XG4gICAgICAgICAgICAgICAgY2VsbC5zZXRJdGVtSWNvbihpY29uX3Jlcyk7XG4gICAgICAgICAgICAgICAgaWYgKHNraW5fZGF0YS5pc19sb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwuc2V0SXRlbUljb25VbkVuYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5zZXRJdGVtSWNvblVuRW5hYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gVXRpbHMuZ2V0Tm9yS2V5KHNraW5fZGF0YS5iaWQsIHNraW5fZGF0YS5zdGFyKTtcbiAgICAgICAgICAgICAgICBsZXQgc3Rhcl9jb25maWcgPSBnZGF0YShcInBhcnRuZXJfZGF0YVwiLCBcImRhdGFfcGFydG5lcl9zdGFyXCIsIFtrZXldKTtcbiAgICAgICAgICAgICAgICBpZiAoc3Rhcl9jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWNvbl9yZXMgPSBQYXRoVG9vbC5nZXRIZWFkUmVzKHN0YXJfY29uZmlnLmhlYWRfaWQpO1xuICAgICAgICAgICAgICAgICAgICBjZWxsLnNldEl0ZW1JY29uKGljb25fcmVzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjZWxsLnNldEl0ZW1JY29uVW5FbmFibGVkKGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0X3NraW5faW5kZXggIT0gbnVsbCAmJiB0aGlzLnNlbGVjdF9za2luX2luZGV4ID09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgY2VsbC5zZXRTZWxlY3RlZCh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2VsbC5zZXRTZWxlY3RlZChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSk7XG4gICAgfSxcblxuICAgIC8v54K55Ye7Y2VsbCAu6ZyA6KaB5ZyoIGNyZWF0ZU5ld0NlbGwg6K6+572u54K55Ye75LqL5Lu2XG4gICAgb25DZWxsVG91Y2hlZDogZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbl9jbGlja19idG4pIHJldHVyblxuICAgICAgICBpZiAoY2VsbC5pbmRleCA9PSBudWxsKSByZXR1cm5cbiAgICAgICAgbGV0IGluZGV4ID0gY2VsbC5pbmRleDtcbiAgICAgICAgbGV0IHNraW5fZGF0YSA9IHRoaXMuc2tpbl9kYXRhX2xpc3RbaW5kZXhdO1xuICAgICAgICBpZiAoIXNraW5fZGF0YSkgcmV0dXJuXG4gICAgICAgIGlmIChza2luX2RhdGEuaXNfc2tpbl9kYXRhKSB7XG4gICAgICAgICAgICBpZiAoc2tpbl9kYXRhLmlzX2xvY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldExvY2tJbmZvKHNraW5fZGF0YSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0X2NlbGwgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RfY2VsbC5zZXRTZWxlY3RlZChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RfY2VsbCA9IGNlbGw7XG4gICAgICAgIHRoaXMuc2VsZWN0X2NlbGwuc2V0U2VsZWN0ZWQodHJ1ZSk7XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0U2tpbkluZm8oaW5kZXgpXG4gICAgfSxcblxuICAgIC8v5pu05paw6YCJ5Lit55qE55qu6IKk5L+h5oGvXG4gICAgdXBkYXRlU2VsZWN0U2tpbkluZm86IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0X3NraW5faW5kZXggJiYgdGhpcy5zZWxlY3Rfc2tpbl9pbmRleCA9PSBpbmRleCkgcmV0dXJuXG4gICAgICAgIHRoaXMuc2VsZWN0X3NraW5faW5kZXggPSBpbmRleDtcbiAgICAgICAgbGV0IHNraW5fZGF0YSA9IHRoaXMuc2tpbl9kYXRhX2xpc3RbdGhpcy5zZWxlY3Rfc2tpbl9pbmRleF07XG5cbiAgICAgICAgbGV0IG5hbWVfc3RyID0gXCJcIjtcblxuICAgICAgICBpZiAoc2tpbl9kYXRhLmNvbmZpZykge1xuICAgICAgICAgICAgbmFtZV9zdHIgPSBza2luX2RhdGEuY29uZmlnLnNraW5fbmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSBnZGF0YShcInBhcnRuZXJfZGF0YVwiLCBcImRhdGFfcGFydG5lcl9saWJyYXJ5XCIsIFtza2luX2RhdGEuYmlkXSk7XG4gICAgICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgbmFtZV9zdHIgPSBjb25maWcudGl0bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aXRsZV9uYW1lX2xiLnN0cmluZyA9IG5hbWVfc3RyO1xuXG4gICAgICAgIGlmIChza2luX2RhdGEuaXNfc2tpbl9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNraW5fY29uZmlnID0gc2tpbl9kYXRhLmNvbmZpZztcbiAgICAgICAgICAgIGlmICh0aGlzLmlzX3Nob3dfYXR0cikge1xuICAgICAgICAgICAgICAgIHRoaXMuYXR0cl9wYW5lbC54ID0gdGhpcy5hdHRyX3BhbmVsX3g7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBdHRySW5mbygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJfcGFuZWwueCArPSBjYy53aW5TaXplLndpZHRoICogMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8v6Iux6ZuE5a+56LGhXG4gICAgICAgICAgICB0aGlzLnNraW5fY29uZmlnID0gZ2RhdGEoXCJwYXJ0bmVyX2RhdGFcIiwgXCJkYXRhX3BhcnRuZXJfbGlicmFyeVwiLCBbc2tpbl9kYXRhLmJpZF0pO1xuICAgICAgICAgICAgdGhpcy5hdHRyX3BhbmVsLnggKz0gY2Mud2luU2l6ZS53aWR0aCAqIDI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZURyYXdJbmZvKCk7XG4gICAgICAgIGlmICghdGhpcy5pc19zaG93X2F0dHIpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSGVyb0luZm8oMik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0TG9ja0luZm86IGZ1bmN0aW9uIChza2luX2RhdGEsIGluZGV4KSB7XG4gICAgICAgIGxldCBkaWNfaXRlbV9pZCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpIGluIHNraW5fZGF0YS5jb25maWcuaXRlbV9pZF9saXN0KSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBza2luX2RhdGEuY29uZmlnLml0ZW1faWRfbGlzdFtpXTtcbiAgICAgICAgICAgIGRpY19pdGVtX2lkW2lkXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGF2ZV9pdGVtID0gbnVsbDtcbiAgICAgICAgbGV0IGhhdmVfbGlzdCA9IFtdO1xuICAgICAgICBsZXQgbGlzdCA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0QmFnSXRlbUxpc3QoQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSykgfHwge307XG4gICAgICAgIGZvciAobGV0IGkgaW4gbGlzdCkge1xuICAgICAgICAgICAgbGV0IGl0ZW0gPSBsaXN0W2ldO1xuICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5jb25maWcgJiYgZGljX2l0ZW1faWRbaXRlbS5jb25maWcuaWRdKSB7XG4gICAgICAgICAgICAgICAgLy/og4zljIXkuIrmnInpgZPlhbdcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbmZpZy5jbGllbnRfZWZmZWN0WzBdICYmIGl0ZW0uY29uZmlnLmNsaWVudF9lZmZlY3RbMF1bMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50aW1lID0gaXRlbS5jb25maWcuY2xpZW50X2VmZmVjdFswXVsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnRpbWUgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGF0YS50aW1lID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy/ooajnpLrmnInmsLjkuYXnmoTnmq7ogqRcbiAgICAgICAgICAgICAgICAgICAgaGF2ZV9pdGVtID0gaXRlbTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0YS5pdGVtX2luZm8gPSBpdGVtO1xuICAgICAgICAgICAgICAgIGhhdmVfbGlzdC5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYXZlX2l0ZW0pIHtcbiAgICAgICAgICAgIC8v6KGo56S65pyJ5rC45LmF55qE55qu6IKkXG4gICAgICAgICAgICB0aGlzLnVzZVNraW5JdGVtQnlJRChoYXZlX2l0ZW0sIGluZGV4KTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhdmVfbGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBoYXZlX2xpc3Quc29ydChVdGlscy50YWJsZVVwcGVyU29ydGVyKFtcInRpbWVcIl0pKTtcbiAgICAgICAgICAgIHRoaXMudXNlU2tpbkl0ZW1CeUlEKGhhdmVfbGlzdFswXS5pdGVtX2luZm8sIGluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8v6K+05piO6K+l55qu6IKk5LiN6IO95ZCM5ZWG5Z+O6I635Y+WXG4gICAgICAgICAgICAvLyBpZiAoc2tpbl9kYXRhLmNvbmZpZy5pc19zaG9wID09IDApIHtcbiAgICAgICAgICAgIC8vICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5pqC5pyq6I635Y+W5q2k55qu6IKk77yM6K+35YmN5b6A55u45YWz5rS75Yqo5oiW546p5rOV5Lit6I635Y+W77yBXCIpKTtcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdvdG9Ta2luQWN0aW9uKHNraW5fZGF0YS5jb25maWcpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5L2/55So55qu6IKk6YGT5YW3XG4gICAgdXNlU2tpbkl0ZW1CeUlEOiBmdW5jdGlvbiAoaGF2ZV9pdGVtLCBpbmRleCkge1xuICAgICAgICBpZiAoaGF2ZV9pdGVtLmNvbmZpZykge1xuICAgICAgICAgICAgbGV0IGNvbG9yID0gQmFja1BhY2tDb25zdC5nZXRXaGl0ZVF1YWxpdHlDb2xvclN0cihoYXZlX2l0ZW0uY29uZmlnLnF1YWxpdHkpO1xuICAgICAgICAgICAgbGV0IHN0ciA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuW3suaLpeacieino+mUgemBk+WFtyzmmK/lkKbmtojogJc8ZGl2IGZvbnRjb2xvcj0jJXM+JXM8L2Rpdj7op6PplIHor6Xnmq7ogqTvvJ9cIiksIGNvbG9yLCBoYXZlX2l0ZW0uY29uZmlnLm5hbWUpO1xuICAgICAgICAgICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlX3NraW5faW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZW5kZXIxMDUxNShoYXZlX2l0ZW0uaWQsIDEpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICBDb21tb25BbGVydC5zaG93KHN0ciwgVXRpbHMuVEkxOE4oXCLnoa7lrppcIiksIGNhbGxiYWNrLCBVdGlscy5USTE4TihcIuWPlua2iFwiKSwgbnVsbCwgMiwgbnVsbCwgeyB0aXRsZTogVXRpbHMuVEkxOE4oXCLop6PplIHnmq7ogqRcIikgfSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+i3s+i9rOa0u+WKqGlkXG4gICAgZ290b1NraW5BY3Rpb246IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy/kvJjlhYjmib7nmq7ogqTmtLvliqhcbiAgICAgICAgICAgIGlmIChjb25maWcuYWN0aW9uX2JpZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgLy/mmK/lkKblrZjlnKhcbiAgICAgICAgICAgICAgICBsZXQgaXNfZXhpc3QgPSBBY3Rpb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkuY2hlY2tBY3Rpb25FeGlzdEJ5QWN0aW9uQmlkKGNvbmZpZy5hY3Rpb25fYmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNfZXhpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgVXRpbHMuY2xvc2VBbGxXaW5kb3coKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFVwZGF0ZSgxMDAsIGZ1bmN0aW9uICgpIHsgQWN0aW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5BY3Rpb25NYWluUGFuZWwodHJ1ZSwgbnVsbCwgY29uZmlnLmFjdGlvbl9iaWQpOyB9LmJpbmQodGhpcyksIDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5tYWluX2lkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNfaGFzID0gTWFpblVJQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEZ1Y250aW9uSWNvblZvQnlJZChjb25maWcubWFpbl9pZCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzX2hhcykge1xuICAgICAgICAgICAgICAgICAgICBVdGlscy5jbG9zZUFsbFdpbmRvdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VXBkYXRlKDEwMCwgZnVuY3Rpb24gKCkgeyBBY3Rpb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkJ1eVNraW5XaW5kb3codHJ1ZSk7IH0uYmluZCh0aGlzKSwgMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL+ayoeacieearuiCpOa0u+WKqCDmib7mtLvliqjllYbln45cbiAgICAgICAgICAgIGxldCBzaG9wX2NvbmZpZyA9IENvbmZpZy5leGNoYW5nZV9kYXRhLmRhdGFfc2hvcF9saXN0W01hbGxDb25zdC5NYWxsVHlwZS5IZXJvU2tpbl07XG4gICAgICAgICAgICBpZiAoY29uZmlnLmlzX3Nob3AgPT0gMSAmJiBzaG9wX2NvbmZpZyAmJiBzaG9wX2NvbmZpZy5zb3J0ICE9IDApIHtcbiAgICAgICAgICAgICAgICBNYWxsQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5NYWxsUGFuZWwodHJ1ZSwgTWFsbENvbnN0Lk1hbGxUeXBlLkhlcm9Ta2luKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL+ayoeaciea0u+WKqOWVhuWfjiDmj5DnpLo6XG4gICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5pqC5peg6K+l55qu6IKk6I635Y+W6YCU5b6EXCIpKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpXG5cbiAgICAgICAgbGV0IHN0ciA9IFV0aWxzLlRJMThOKFwi5b2T5YmN5pqC5pyq5oul5pyJ6K+l55qu6IKkLOaYr+WQpuWJjeW+gOiOt+WPlu+8n1wiKTtcbiAgICAgICAgQ29tbW9uQWxlcnQuc2hvdyhzdHIsIFV0aWxzLlRJMThOKFwi56Gu5a6aXCIpLCBjYWxsYmFjaywgVXRpbHMuVEkxOE4oXCLlj5bmtohcIiksIG51bGwsIG51bGwsIG51bGwsIHsgdGl0bGU6IFV0aWxzLlRJMThOKFwi6Kej6ZSB55qu6IKkXCIpIH0pO1xuICAgIH0sXG5cbiAgICAvL+abtOaWsOeri+e7mOS/oeaBr1xuICAgIHVwZGF0ZURyYXdJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5za2luX2NvbmZpZykgcmV0dXJuXG4gICAgICAgIGxldCBkcmF3X3Jlc19pZCA9IHRoaXMuc2tpbl9jb25maWcuZHJhd19yZXM7XG4gICAgICAgIGlmIChkcmF3X3Jlc19pZCA9PSBudWxsIHx8IGRyYXdfcmVzX2lkID09IFwiXCIpIHtcbiAgICAgICAgICAgIGRyYXdfcmVzX2lkID0gdGhpcy5nZXREZWZhdWx0RHJhd1JlcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkcmF3X3Jlc19pZCkge1xuICAgICAgICAgICAgbGV0IGJnX3JlcyA9IFBhdGhUb29sLmdldEljb25QYXRoKFwiaGVyb2RyYXcvaGVyb2RyYXdyZXNcIiwgZHJhd19yZXNfaWQpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVyb19kcmF3X2ljb25fc3ApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoYmdfcmVzLCBmdW5jdGlvbiAoc3ApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZXJvX2RyYXdfaWNvbl9zcC5zcHJpdGVGcmFtZSA9IHNwO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNraW5fY29uZmlnLnNjYWxlID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fZHJhd19pY29uX25kLnNjYWxlID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX2RyYXdfaWNvbl9uZC5zY2FsZSA9IHRoaXMuc2tpbl9jb25maWcuc2NhbGUgLyAxMDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNraW5fY29uZmlnLmRyYXdfb2Zmc2V0ICYmIFV0aWxzLm5leHQodGhpcy5za2luX2NvbmZpZy5kcmF3X29mZnNldCkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRfeCA9IHRoaXMuc2tpbl9jb25maWcuZHJhd19vZmZzZXRbMF1bMF0gfHwgMDtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0X3kgPSB0aGlzLnNraW5fY29uZmlnLmRyYXdfb2Zmc2V0WzBdWzFdIHx8IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX2RyYXdfaWNvbl9uZC5zZXRQb3NpdGlvbih0aGlzLmhlcm9fZHJhd19pY29uX3ggKyBvZmZzZXRfeCwgdGhpcy5oZXJvX2RyYXdfaWNvbl95ICsgb2Zmc2V0X3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5pi+56S65bGe5oCnXG4gICAgdXBkYXRlQXR0ckluZm86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNraW5fY29uZmlnKSByZXR1cm5cbiAgICAgICAgbGV0IGVuZF90aW1lID0gdGhpcy5tb2RlbC5nZXRIZXJvU2tpbkluZm9CeVNraW5JRCh0aGlzLnNraW5fY29uZmlnLnNraW5faWQpO1xuICAgICAgICBpZiAoZW5kX3RpbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGVuZF90aW1lID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVfdmFsX2xiLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5rC45LmFXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGltZV92YWxfbGIubm9kZS5zdG9wQWxsQWN0aW9ucygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdGltZSA9IGVuZF90aW1lIC0gZ2NvcmUuU21hcnRTb2NrZXQuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0aW1lIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lX3ZhbF9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIjAwOjAwOjAwXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLmNvbW1vbkNvdW50RG93blRpbWUodGhpcy50aW1lX3ZhbF9sYiwgdGltZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB5ID0gMjc7XG4gICAgICAgIGxldCB3aWR0aF9pdGVtID0gMTUwO1xuICAgICAgICBsZXQgb2Zmc2V0X3ggPSAxNTA7XG4gICAgICAgIGxldCBzaXplID0gY2Muc2l6ZSh3aWR0aF9pdGVtLCAzNSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmF0dHJfaXRlbV9saXN0KSB7XG4gICAgICAgICAgICBsZXQgdiA9IHRoaXMuYXR0cl9pdGVtX2xpc3RbaV07XG4gICAgICAgICAgICB2LmJnX3NwLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB2LmtleV9ydC5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLnNraW5fY29uZmlnLnNraW5fYXR0cikge1xuICAgICAgICAgICAgbGV0IHYgPSB0aGlzLnNraW5fY29uZmlnLnNraW5fYXR0cltpXTtcbiAgICAgICAgICAgIGxldCB4ID0gMjAwICsgKGkgLSAxKSAqIHdpZHRoX2l0ZW0gKyBvZmZzZXRfeDtcbiAgICAgICAgICAgIGlmICh0aGlzLmF0dHJfaXRlbV9saXN0W2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJfaXRlbV9saXN0W2ldID0gdGhpcy5jcmVhdGVBdHRySXRlbSh4LCB5LCBzaXplKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyX2l0ZW1fbGlzdFtpXS5iZ19zcC5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyX2l0ZW1fbGlzdFtpXS5rZXlfcnQubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYXJyID0gVXRpbHMuY29tbW9uR2V0QXR0ckluZm9CeUtleVZhbHVlKHZbMF0sIHZbMV0pO1xuICAgICAgICAgICAgbGV0IHN0ciA9IGNjLmpzLmZvcm1hdFN0cihcIjxpbWcgc3JjPSclcycvPiAlcyArICVzXCIsIGFyci5pY29uLCBhcnIuYXR0cl9uYW1lLCBhcnIuYXR0cl92YWwpO1xuICAgICAgICAgICAgdGhpcy5hdHRyX2l0ZW1fbGlzdFtpXS5rZXlfcnQuc3RyaW5nID0gc3RyO1xuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGFyci5yZXMsIChmdW5jdGlvbiAocmVzT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyX2l0ZW1fbGlzdFtpXS5rZXlfcnQuYWRkU3ByaXRlRnJhbWUocmVzT2JqZWN0KTtcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5Yib5bu65bGe5oCnaXRlbVxuICAgIGNyZWF0ZUF0dHJJdGVtOiBmdW5jdGlvbiAoeCwgeSwgc2l6ZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHt9O1xuICAgICAgICBsZXQgcmVzID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImhlcm9cIiwgXCJwYXJ0bmVyX3NraW5fMDNcIik7XG4gICAgICAgIGl0ZW0uYmdfc3AgPSBVdGlscy5jcmVhdGVJbWFnZSh0aGlzLmF0dHJfcGFuZWwsIG51bGwsIHgsIHksIGNjLnYyKDAsIDAuNSksIG51bGwsIDAsIHRydWUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAoc3ApIHtcbiAgICAgICAgICAgIGl0ZW0uYmdfc3Auc3ByaXRlRnJhbWUgPSBzcDtcbiAgICAgICAgfSlcbiAgICAgICAgaXRlbS5iZ19zcC5ub2RlLnNldENvbnRlbnRTaXplKHNpemUpO1xuICAgICAgICBpdGVtLmtleV9ydCA9IFV0aWxzLmNyZWF0ZVJpY2hMYWJlbCgyMiwgdGhpcy5jb2xvcl8xLCBjYy52MigwLCAwLjUpLCBjYy52Mih4ICsgMTAsIHkpLCAyNCwgMzgwLCB0aGlzLmF0dHJfcGFuZWwsIFwibGVmdFwiKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9LFxuXG4gICAgLy/mm7TmlrDoi7Hpm4Tkv6Hmga9cbiAgICAvL+adpea6kOS9jee9riAxIOihqOekuiDmjIlzaG93X2J0biDnmoQgICAyIOihqOekuiDmjInnmq7ogqTlpLTlg4/nmoRcbiAgICB1cGRhdGVIZXJvSW5mbzogZnVuY3Rpb24gKGZvcm1fdHlwZSkge1xuICAgICAgICBsZXQgc2tpbl9kYXRhID0gdGhpcy5za2luX2RhdGFfbGlzdFt0aGlzLnNlbGVjdF9za2luX2luZGV4XTtcbiAgICAgICAgbGV0IGhlcm9fY29uZmlnID0gbnVsbDtcbiAgICAgICAgbGV0IHNraW5faWQgPSAwO1xuICAgICAgICBsZXQgaGVyb192byA9IHRoaXMuc2tpbl9kYXRhX2xpc3RbMF07XG4gICAgICAgIGlmIChza2luX2RhdGEuaXNfc2tpbl9kYXRhKSB7XG4gICAgICAgICAgICBoZXJvX2NvbmZpZyA9IGdkYXRhKFwicGFydG5lcl9za2luX2RhdGFcIiwgXCJkYXRhX2hlcm9faW5mb1wiLCBbc2tpbl9kYXRhLnNraW5faWRdKTtcbiAgICAgICAgICAgIHNraW5faWQgPSBza2luX2RhdGEuY29uZmlnLnNraW5faWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTcGluZShoZXJvX3ZvLCBza2luX2lkLCBmb3JtX3R5cGUpO1xuXG4gICAgICAgIC8v6K+05piO5pyJ5Lyg6K6wXG4gICAgICAgIGlmIChoZXJvX2NvbmZpZykge1xuICAgICAgICAgICAgLy8gdGhpcy5saW5lX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAvLyB0aGlzLm5hbWVfbGIubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5pu05paw5qih5Z6LLOS5n+aYr+WIneWni+WMluaooeWei1xuICAgIC8vQGlzX3JlZnJlc2ggIOaYr+WQpumcgOimgeajgOa1i1xuICAgIHVwZGF0ZVNwaW5lOiBmdW5jdGlvbiAoaGVyb192bywgc2tpbl9pZCwgZm9ybV90eXBlKSB7XG4gICAgICAgIGlmICh0aGlzLnJlY29yZF9za2luX2lkICE9IG51bGwgJiYgdGhpcy5yZWNvcmRfc2tpbl9pZCA9PSBza2luX2lkKSByZXR1cm5cbiAgICAgICAgdGhpcy5yZWNvcmRfc2tpbl9pZCA9IHNraW5faWQ7XG5cbiAgICAgICAgbGV0IGZ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zcGluZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3BpbmUgPSBuZXcgQmFzZVJvbGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNwaW5lLnNldFBhcmVudCh0aGlzLm1vZGVfbm9kZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGluZS5zZXRQb3NpdGlvbigwLCAxMDQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BpbmUuc2V0RGF0YShCYXNlUm9sZS50eXBlLnBhcnRuZXIsIGhlcm9fdm8sIFBsYXllckFjdGlvbi5zaG93LCB0cnVlLCAwLjQ1LCB7IHNraW5faWQ6IHNraW5faWQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGluZS5zaG93U2hhZG93VUkodHJ1ZSk7XG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbiA9IGNjLmZhZGVJbigwLjIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BpbmUubm9kZS5ydW5BY3Rpb24oYWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgIGxldCBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuc3BpbmUubm9kZS5zdG9wQWxsQWN0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5zcGluZS5ub2RlLnJlbW92ZUZyb21QYXJlbnQoKTtcbiAgICAgICAgICAgIHRoaXMuc3BpbmUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jYW5fY2xpY2tfYnRuID0gdHJ1ZTtcbiAgICAgICAgICAgIGZ1bigpO1xuICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgaWYgKHRoaXMuc3BpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuX2NsaWNrX2J0biA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGZvcm1fdHlwZSA9PSAyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbiA9IGNjLmZhZGVPdXQoMC4yKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNwaW5lLm5vZGUucnVuQWN0aW9uKGNjLnNlcXVlbmNlKGFjdGlvbiwgY2MuY2FsbEZ1bmMoY2FsbGJhY2spKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZ1bigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W57y655yB55qE5qih5Z6LaWRcbiAgICBnZXREZWZhdWx0TW9kZVJlczogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgcGFydG5lcl9jb25maWcgPSB0aGlzLmdldFBhcnRuZXJDb25maWcoKVswXTtcbiAgICAgICAgbGV0IHN0YXJfY29uZmlnID0gdGhpcy5nZXRQYXJ0bmVyQ29uZmlnKClbMV07XG4gICAgICAgIGlmIChwYXJ0bmVyX2NvbmZpZyAmJiBzdGFyX2NvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXJfY29uZmlnLnJlc19pZFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W57y655yB55qE5qih5Z6L56uL57uYXG4gICAgZ2V0RGVmYXVsdERyYXdSZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHBhcnRuZXJfY29uZmlnID0gdGhpcy5nZXRQYXJ0bmVyQ29uZmlnKClbMF07XG4gICAgICAgIGxldCBzdGFyX2NvbmZpZyA9IHRoaXMuZ2V0UGFydG5lckNvbmZpZygpWzFdO1xuICAgICAgICBpZiAocGFydG5lcl9jb25maWcgJiYgc3Rhcl9jb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0bmVyX2NvbmZpZy5kcmF3X3Jlc1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W6Iux6ZuE5a+55bqU6YWN572uXG4gICAgZ2V0UGFydG5lckNvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaGVyb192bykgcmV0dXJuXG4gICAgICAgIGlmICh0aGlzLnBhcnRuZXJfY29uZmlnID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGFydG5lcl9jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9iYXNlW3RoaXMuaGVyb192by5iaWRdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcnRuZXJfY29uZmlnICYmIHRoaXMuc3Rhcl9jb25maWcgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGtleSA9IFV0aWxzLmdldE5vcktleSh0aGlzLnBhcnRuZXJfY29uZmlnLmJpZCwgdGhpcy5wYXJ0bmVyX2NvbmZpZy5pbml0X3N0YXIpO1xuICAgICAgICAgICAgdGhpcy5zdGFyX2NvbmZpZyA9IGdkYXRhKFwicGFydG5lcl9kYXRhXCIsIFwiZGF0YV9wYXJ0bmVyX3N0YXJcIiwgW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy5wYXJ0bmVyX2NvbmZpZywgdGhpcy5zdGFyX2NvbmZpZ11cbiAgICB9LFxuXG4gICAgLy8g5YWz6Zet56qX5L2T5Zue6LCDLOmcgOimgeWcqOi/memHjOiwg+eUqOivpeeql+S9k+aJgOWxnmNvbnRyb2xsZXLnmoRjbG9zZeaWueazleayoeeUqOS6jue9ruepuuivpeeql+S9k+WunuS+i+WvueixoVxuICAgIGNsb3NlQ2FsbEJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsX3ZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcuZGVsZXRlTWUoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZV92YWxfbGIubm9kZS5zdG9wQWxsQWN0aW9ucygpO1xuICAgICAgICB0aGlzLmN0cmwub3Blbkhlcm9Ta2luV2luZG93KCk7XG4gICAgfSxcbn0pIl19