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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/adventure/adventure_controller.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, '2a75aWyuEhNnp+ieh6x44kp', 'adventure_controller');
// Scripts/mod/adventure/adventure_controller.js
 
"use strict";
 
var _cc$Class;
 
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      冒险主控制器
// <br/>Create: 2019-05-09 14:14:52
// --------------------------------------------------------------------
var AdventureEvent = require("adventure_event");
 
var BattleConst = require("battle_const");
 
var MainuiController = require("mainui_controller");
 
var MainuiConst = require("mainui_const");
 
var BattleController = require("battle_controller");
 
var AdventureController = cc.Class((_cc$Class = {
  "extends": BaseController,
  ctor: function ctor() {},
  // 初始化配置数据
  initConfig: function initConfig() {
    var AdventureModel = require("adventure_model");
 
    this.model = new AdventureModel();
    this.model.initConfig();
  },
  // 返回当前的model
  getModel: function getModel() {
    return this.model;
  },
  // 注册监听事件
  registerEvents: function registerEvents() {},
  // 注册协议接受事件
  registerProtocals: function registerProtocals() {
    this.RegisterProtocal(20600, this.handle20600); //基本信息
 
    this.RegisterProtocal(20601, this.handle20601); //BUFF信息
 
    this.RegisterProtocal(20602, this.handle20602); //房间信息
 
    this.RegisterProtocal(20603, this.handle20603); //服务端通知更新指定房间信息
 
    this.RegisterProtocal(20604, this.handle20604); //获取当前伙伴信息数据
 
    this.RegisterProtocal(20605, this.handle20605); //设置上阵伙伴信息
 
    this.RegisterProtocal(20606, this.handle20606); //每一层结算
 
    this.RegisterProtocal(20607, this.handle20607); //使用3个主要技能的
 
    this.RegisterProtocal(20608, this.handle20608); //进去指定房间
 
    this.RegisterProtocal(20609, this.handle20609); //技能信息
 
    this.RegisterProtocal(20610, this.handle20610); //选中伙伴
 
    this.RegisterProtocal(20611, this.handle20611); //一击必杀请求
 
    this.RegisterProtocal(20612, this.handle20612); //冒险重置
 
    this.RegisterProtocal(20620, this.handle20620); //事件反馈
 
    this.RegisterProtocal(20621, this.handle20621); //猜拳结果反馈
 
    this.RegisterProtocal(20622, this.handle20622); //buff信息查看
 
    this.RegisterProtocal(20623, this.handle20623); //答题信息
 
    this.RegisterProtocal(20624, this.handle20624); //怪物信息
 
    this.RegisterProtocal(20625, this.handle20625); //获得技能,主要是用于表现效果处理
 
    this.RegisterProtocal(20627, this.handle20627); //NPC对话序号
 
    this.RegisterProtocal(20628, this.handle20628); //NPC对话结果
 
    this.RegisterProtocal(20630, this.handle20630); //宝箱打开结果
 
    this.RegisterProtocal(20631, this.handle20631); //神秘商店事件
 
    this.RegisterProtocal(20632, this.handle20632); //神秘商店总览
 
    this.RegisterProtocal(20633, this.handle20633); //神秘商店购买
 
    this.RegisterProtocal(20634, this.handle20634);
    this.RegisterProtocal(20635, this.handle20635);
  },
  isMonster: function isMonster(event_type) {
    return event_type == AdventureEvent.EventType.boss || event_type == AdventureEvent.EventType.mon || event_type == AdventureEvent.EventType.mon1 || event_type == AdventureEvent.EventType.mon2 || event_type == AdventureEvent.EventType.mon3;
  },
  openAnswerView: function openAnswerView(value, data) {
    if (value == false) {
      if (this.adventure_answer_view != null) {
        this.adventure_answer_view.close();
        this.adventure_answer_view = null;
      }
    } else {
      if (this.adventure_answer_view == null) {
        this.adventure_answer_view = Utils.createClass("adventure_evt_answer_window", this);
      }
 
      if (this.adventure_answer_view && this.adventure_answer_view.isOpen() == false) {
        this.adventure_answer_view.open(data);
      }
    }
  },
  //==============================--
  //desc:进入冒险的主入口
  //@return 
  //==============================--
  requestEnterAdventure: function requestEnterAdventure() {
    var form_list = this.model.getFormList();
 
    if (form_list == null || Utils.next(form_list) == null) {
      this.openAdventureFormWindow(true);
    } else {
      MainuiController.getInstance().requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.Adventrue);
    }
  },
  // ==============================--
  // desc:打开冒险站前布阵界面
  // @status:
  // @return 
  // ==============================--
  openAdventureFormWindow: function openAdventureFormWindow(status) {
    if (!status) {
      if (this.form_window) {
        this.form_window.close();
        this.form_window = null;
      }
    } else {
      if (this.form_window == null) {
        this.form_window = Utils.createClass("adventure_form_window", this);
      }
 
      if (this.form_window && this.form_window.isOpen() == false) {
        this.form_window.open();
      }
    }
  },
  // -- 引导需要
  // function AdventureController:getAdventureRoot()
  //     if this.adventure_window then
  //         return this.adventure_window.root_wnd
  //     end
  // end
  // -- 引导需要下一层的指引
  // function AdventureController:getNextAlertRoot()
  //     if this.adventure_window then
  //         var alert = this.adventure_window:getAlert()
  //         if alert then
  //             return alert.root_wnd
  //         end
  //     end
  // end
  openAdventureMainWindow: function openAdventureMainWindow(status) {
    if (!status) {
      if (this.adventure_window) {
        this.adventure_window.close();
        this.adventure_window = null;
      }
    } else {
      // 没有布阵是不给进去的
      var form_list = this.model.getFormList();
 
      if (form_list == null || Utils.next(form_list) == null) {
        // print("跳转进入神界冒险有误,当前还没有布阵 ============>")
        return;
      } // 没有基础数据也不做响应
 
 
      var base_data = this.model.getAdventureBaseData();
      if (base_data == null) return;
 
      if (this.adventure_window == null) {
        this.adventure_window = Utils.createClass("adventure_main_window", this);
      }
 
      if (this.adventure_window && this.adventure_window.isOpen() == false) {
        this.adventure_window.open();
      }
    }
  },
  openWindowByConfig: function openWindowByConfig(data) {
    if (data == null || data.config == null) return;
    var config = data.config;
 
    if (this.isMonster(config.evt_type)) {
      //boss或者怪物
      if (this.model.allHeroIsDie() == true) {
        message(Utils.TI18N("英雄全部阵亡,本轮冒险已结束!"));
        return;
      }
 
      this.openEvtViewByType(true, "adventure_evt_challenge_window", data);
    } else if (config.evt_type == AdventureEvent.EventType.box) {
      //B宝箱
      this.openEvtViewByType(true, "adventure_evt_box_window", data);
    } else if (config.evt_type == AdventureEvent.EventType.finger_guessing) {
      //猜拳
      this.openEvtViewByType(true, "adventure_evt_fighterguess_window", data);
    } else if (config.evt_type == AdventureEvent.EventType.answer) {
      //答题
      this.openEvtViewByType(true, "adventure_evt_answer_start_window", data);
    } else if (config.evt_type == AdventureEvent.EventType.npc) {
      //npc事件
      this.openEvtViewByType(true, "adventure_evt_npc_window", data);
    } else if (config.evt_type == AdventureEvent.EventType.freebox) {
      //免费宝箱
      this.openEvtViewByType(true, "adventure_evt_free_box_window", data);
    } else if (config.evt_type == AdventureEvent.EventType.npc_talk) {
      //npc对话
      this.openEvtViewByType(true, "adventure_evt_other_npc_window", data);
    } else if (config.evt_type == AdventureEvent.EventType.shop) {
      //神秘商店
      this.openEvtViewByType(true, "adventure_evt_shop_window", data);
    } else if (config.evt_type == AdventureEvent.EventType.effect) {
      //特效事件
      this.send20620(data.id, AdventureEvent.AdventureEvenHandleType.handle, {});
    }
  },
  // 打开各种事件面板
  openEvtViewByType: function openEvtViewByType(status, ref_class, data, extendparam, is_other) {
    if (status == false) {
      if (this.adventure_evt_view != null) {
        this.adventure_evt_view.close();
        this.adventure_evt_view = null;
      }
    } else {
      if (data == null) return;
      var ref_class = ref_class || "adventure_evt_challenge_window";
 
      if (this.adventure_evt_view == null) {
        this.adventure_evt_view = Utils.createClass(ref_class, this);
      }
 
      if (this.adventure_evt_view && this.adventure_evt_view.isOpen() == false) {
        this.adventure_evt_view.open(data);
      }
    }
  },
  // ==============================--
  // desc:冒险商店
  // @status:
  // @return 
  // ==============================--
  openAdventrueShopWindow: function openAdventrueShopWindow(status) {
    if (!status) {
      if (this.shop_window) {
        this.shop_window.close();
        this.shop_window = null;
      }
    } else {
      if (this.shop_window == null) {
        this.shop_window = Utils.createClass("adventure_shop_window", this);
      }
 
      if (this.shop_window && this.shop_window.isOpen() == false) {
        this.shop_window.open();
      }
    }
  },
  // ==============================--
  // desc:一击必杀界面
  // @status:
  // @return 
  // ==============================--
  openAdventureShotKillWindow: function openAdventureShotKillWindow(status, config) {
    if (!status) {
      if (this.shot_kill_window) {
        this.shot_kill_window.close();
        this.shot_kill_window = null;
      }
    } else {
      if (config == null) return;
 
      if (this.shot_kill_window == null) {
        this.shot_kill_window = Utils.createClass("adventure_shot_kill_window", this);
      }
 
      if (this.shot_kill_window && this.shot_kill_window.isOpen() == false) {
        this.shot_kill_window.open(config);
      }
    }
  },
  // ==============================--
  // desc:使用药品
  // @status:
  // @return 
  // ==============================--
  openAdventureUseHPWindow: function openAdventureUseHPWindow(status, config) {
    if (!status) {
      if (this.use_hp_window) {
        this.use_hp_window.close();
        this.use_hp_window = null;
      }
    } else {
      if (config == null) return;
 
      if (this.use_hp_window == null) {
        this.use_hp_window = Utils.createClass("adventure_use_hp_window", this);
      }
 
      if (this.use_hp_window && this.use_hp_window.isOpen() == false) {
        this.use_hp_window.open(config);
      }
    }
  },
  // 事件操作
  send20620: function send20620(room_id, action, ext_list) {
    var protocal = {};
    protocal.room_id = room_id;
    protocal.action = action;
    protocal.ext_list = ext_list || {};
    this.SendProtocal(20620, protocal);
  },
  handle20620: function handle20620(data) {
    message(data.msg);
 
    if (data.code == 2) {
      this.openEvtViewByType(false);
    }
  },
  // 请求房间信息
  send20602: function send20602() {
    var protocal = {};
    this.SendProtocal(20602, protocal);
  },
  // 房间信息返回
  handle20602: function handle20602(data) {
    this.model.setRoomList(data);
  },
  // 服务端通知更新指定房间信息
  handle20603: function handle20603(data) {
    this.model.updateRoomList(data);
  },
  send20604: function send20604() {
    this.SendProtocal(20604, {});
  },
  // 获取当前伙伴信息数据
  handle20604: function handle20604(data) {
    this.model.updateFormPartner(data.partners, data.id); // if(NEEDCHANGEENTERSTATUS == 2 && !this.first_enter){//如果是1就跳转到出具
    //     this.first_enter  = true;
    //     MainuiController.getInstance().changeMainUIStatus(MainuiConst.btn_index.drama_scene);
    // }
  },
  // 请求布阵
  requestSetForm: function requestSetForm(plist) {
    var protocal = {};
    protocal.plist = plist || {};
    this.SendProtocal(20605, protocal);
  },
  handle20605: function handle20605(data) {
    if (data.code == 1) {
      this.openAdventureFormWindow(false); // 请求进入
 
      MainuiController.getInstance().requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.Adventrue);
    }
  },
  send20608: function send20608(room_id) {
    var protocal = {};
    protocal.room_id = room_id;
    this.SendProtocal(20608, protocal);
  },
  handle20608: function handle20608(data) {
    message(data.msg);
 
    if (data.code == 1) {
      gcore.GlobalEvent.fire(AdventureEvent.HandleRoomOverEvent, data.room_id);
    }
  },
  // 基本信息
  send20600: function send20600() {
    var protocal = {};
    this.SendProtocal(20600, protocal);
  },
  // 基本信息返回
  handle20600: function handle20600(data) {
    if (data) {
      this.model.setAdventureBaseData(data);
    }
  },
  // buff信息
  send20601: function send20601() {
    this.SendProtocal(20601, {});
  },
  // buff信息返回
  handle20601: function handle20601(data) {
    if (data) {
      this.model.setBuffData(data);
    }
  },
  handle20622: function handle20622(data) {
    if (data) {
      gcore.GlobalEvent.fire(AdventureEvent.Update_Evt_Buff_Info, data);
    }
  },
  handle20621: function handle20621(data) {
    if (data) {
      gcore.GlobalEvent.fire(AdventureEvent.Update_Evt_Guess_Result, data);
    }
  },
  handle20623: function handle20623(data) {
    if (data) {
      gcore.GlobalEvent.fire(AdventureEvent.Update_Evt_Answer_Info, data);
    }
  },
  handle20628: function handle20628(data) {
    if (data) {
      message(data.msg);
      gcore.Timer.set(function () {
        this.openEvtViewByType(false);
        this.showGetItemTips(data.items);
      }.bind(this), 1000, 1);
    }
  },
  handle20630: function handle20630(data) {
    if (data) {
      gcore.GlobalEvent.fire(AdventureEvent.Update_Evt_Box_Result_Info, data);
    }
  },
  handle20627: function handle20627(data) {
    if (data) {
      gcore.GlobalEvent.fire(AdventureEvent.Update_Evt_Npc_Info, data);
    }
  },
  handle20631: function handle20631(data) {
    if (data.type == 1) {
      //点击房间事件时候请求20协议之后返回处理
      gcore.GlobalEvent.fire(AdventureEvent.Update_Evt_Shop_Info, data);
    } else if (data.type == 2) {
      //点击技能商店直接弹出
      this.openAdventureEvtShopView(true, data.list);
    }
  },
  // ==============================--
  // desc:主动打开神秘商店
  // @status:
  // @data:
  // @return 
  // ==============================--
  openAdventureEvtShopView: function openAdventureEvtShopView(status, data) {
    if (!status) {
      if (this.shop_evt_window) {
        this.shop_evt_window.close();
        this.shop_evt_window = null;
      }
    } else {
      if (this.shop_evt_window == null) {
        this.shop_evt_window = Utils.createClass("adventure_evt_shop_window", this);
      }
 
      if (this.shop_evt_window && this.shop_evt_window.isOpen() == false) {
        if (data) {
          data.is_auto = true;
        }
 
        this.shop_evt_window.open(data);
      }
    }
  },
  // ==============================--
  // desc:冒险中飘字处理
  // @items:
  // @is_guess:是否是猜拳结果
  // @ret:猜拳的结果
  // @return 
  // ==============================--
  showGetItemTips: function showGetItemTips(items, is_guess, ret) {
    if (items) {
      var str = "";
 
      for (var i in items) {
        var v = items[i];
 
        if (str != "") {
          str = str + ",";
        }
 
        var item_config = Utils.getItemConfig(v.bid);
 
        if (gdata("item_data", "data_assets_id2label", v.bid)) {
          str = cc.js.formatStr("%s<img src=%s></img><color=#289b14>x%s</color>", str, item_config.icon, v.num);
        } else {
          var BackPackConst = require("backpack_const");
 
          str = cc.js.formatStr("%s<color=%s>%s</color><color=#289b14>x%s</color>", str, BackPackConst.quality_color(item_config.quality), item_config.name, v.num);
        }
      }
 
      if (is_guess == true) {
        ret = ret || 0;
 
        if (ret == 0) {
          //平
          str = cc.js.formatStr(Utils.TI18N("平局!太可惜了,%s还你"), str);
        } else if (ret == 1) {
          //赢
          str = cc.js.formatStr(Utils.TI18N("好吧,这%s归你了"), str);
        } else {
          str = cc.js.formatStr(Utils.TI18N("看你这么可怜,还你%s吧"), str);
        }
      } else {
        str = cc.js.formatStr(Utils.TI18N("获取%s"), str);
      }
 
      Utils.playButtonSound("c_get");
      message(str);
    }
  },
  // 冒险每一层结算数据
  openAdventureFloorResultWindow: function openAdventureFloorResultWindow(status, data) {
    if (!status) {
      if (this.floor_result_window) {
        this.floor_result_window.close();
        this.floor_result_window = null;
      }
    } else {
      if (data == null || data.items_list == null) return;
 
      if (this.floor_result_window == null) {
        this.floor_result_window = Utils.createClass("adventure_floor_result_window", this);
      }
 
      if (this.floor_result_window && this.floor_result_window.isOpen() == false) {
        this.floor_result_window.open(data);
      }
    }
  },
  //  服务端主动推送的结算界面
  handle20606: function handle20606(data) {
    this.openAdventureFloorResultWindow(true, data);
  },
  // ==============================--
  // desc:请求技能信息
  // @return 
  // ==============================--
  send20609: function send20609() {
    this.SendProtocal(20609, {});
  },
  // ==============================--
  // desc:使用3个技能
  // @skill_id:
  // @val:
  // @return 
  // ==============================--
  send20607: function send20607(skill_id, val) {
    var protocal = {};
    protocal.skill_id = skill_id;
    protocal.val = val;
    this.SendProtocal(20607, protocal);
  },
  // ==============================--
  // desc:使用技能
  // time:2019-01-24 04:57:32
  // @data:
  // @return 
  // ==============================--
  handle20607: function handle20607(data) {
    message(data.msg);
 
    if (data.code == 1) {
      this.openAdventureShotKillWindow(false);
      this.openAdventureUseHPWindow(false);
    }
  }
}, _defineProperty(_cc$Class, "send20609", function send20609(data) {
  this.SendProtocal(20609, {});
}), _defineProperty(_cc$Class, "handle20609", function handle20609(data) {
  if (data) {
    gcore.GlobalEvent.fire(AdventureEvent.UpdateSkillInfo, data.skill_list);
  }
}), _defineProperty(_cc$Class, "requestSelectPartner", function requestSelectPartner(id) {
  var protocal = {};
  protocal.id = id;
  this.SendProtocal(20610, protocal);
}), _defineProperty(_cc$Class, "handle20610", function handle20610(data) {
  // -- message(data.msg)
  if (data.code == 1) {
    this.model.updateSelectPartnerID(data.id);
  }
}), _defineProperty(_cc$Class, "handle20624", function handle20624(data) {
  gcore.GlobalEvent.fire(AdventureEvent.UpdateMonsterHP, data.hp_per);
}), _defineProperty(_cc$Class, "send20611", function send20611() {
  this.SendProtocal(20611, {});
}), _defineProperty(_cc$Class, "handle20611", function handle20611(data) {
  gcore.GlobalEvent.fire(AdventureEvent.UpdateShotKillInfo, data.room_list);
}), _defineProperty(_cc$Class, "requestShopTotal", function requestShopTotal() {
  this.SendProtocal(20632, {});
}), _defineProperty(_cc$Class, "handle20632", function handle20632(data) {
  gcore.GlobalEvent.fire(AdventureEvent.UpdateShopTotalEvent, data.list);
}), _defineProperty(_cc$Class, "requestBuyShopItem", function requestBuyShopItem(id) {
  var protocal = {};
  protocal.id = id;
  this.SendProtocal(20633, protocal);
}), _defineProperty(_cc$Class, "handle20633", function handle20633(data) {
  message(data.msg);
 
  if (data.code == 1) {
    gcore.GlobalEvent.fire(AdventureEvent.UpdateShopItemEvent, data.id);
  }
}), _defineProperty(_cc$Class, "send20634", function send20634() {
  this.SendProtocal(20634, {});
}), _defineProperty(_cc$Class, "handle20634", function handle20634(data) {
  this.model.setAdventureBoxStatus(data);
  gcore.GlobalEvent.fire(AdventureEvent.UpdateBoxTeskEvent, data);
}), _defineProperty(_cc$Class, "send20635", function send20635(id) {
  var proto = {};
  proto.id = id;
  this.SendProtocal(20635, proto);
}), _defineProperty(_cc$Class, "handle20635", function handle20635(data) {
  message(data.msg);
}), _defineProperty(_cc$Class, "openAdventureBoxRewardView", function openAdventureBoxRewardView(status, kill_master) {
  if (status == true) {
    if (this.box_reward_window == null) {
      this.box_reward_window = Utils.createClass("adventure_box_reward_window", this);
    }
 
    if (this.box_reward_window && this.box_reward_window.isOpen() == false) {
      this.box_reward_window.open(kill_master);
    }
  } else {
    if (this.box_reward_window) {
      this.box_reward_window.close();
      this.box_reward_window = null;
    }
  }
}), _defineProperty(_cc$Class, "handle20625", function handle20625(data) {
  gcore.GlobalEvent.fire(AdventureEvent.GetSkillForEffectAction, data.id, data.skill_id);
}), _defineProperty(_cc$Class, "handle20612", function handle20612(data) {
  var ui_fight_type = MainuiController.getInstance().getUIFightType();
 
  if (ui_fight_type == MainuiConst.ui_fight_type.sky_scene) {
    var is_in_fight = BattleController.getInstance().isInFight();
 
    if (is_in_fight) {
      //如果是在战斗中,则等战斗结束之后,弹出提示
      if (this.battle_exit_event == null) {
        this.battle_exit_event = gcore.GlobalEvent.bind(EventId.EXIT_FIGHT, function (combat_type) {
          if (combat_type == BattleConst.Fight_Type.Adventrue) {
            this.showAdventureReset();
          }
        }.bind(this));
      }
    } else {
      this.showAdventureReset();
    }
  }
}), _defineProperty(_cc$Class, "showAdventureReset", function showAdventureReset() {
  if (this.battle_exit_event) {
    gcore.GlobalEvent.unbind(this.battle_exit_event);
    this.battle_exit_event = null;
  }
 
  MainuiController.getInstance().changeMainUIStatus(MainuiConst.btn_index.main_scene);
  gcore.Timer.set(function () {
    var msg = Utils.TI18N("神界冒险已重置,是否重新进入?");
 
    var CommonAlert = require("commonalert");
 
    CommonAlert.show(msg, Utils.TI18N("确定"), function () {
      this.requestEnterAdventure();
    }.bind(this), Utils.TI18N("取消"));
  }.bind(this), 200, 1);
}), _cc$Class));
module.exports = AdventureController;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxhZHZlbnR1cmVcXGFkdmVudHVyZV9jb250cm9sbGVyLmpzIl0sIm5hbWVzIjpbIkFkdmVudHVyZUV2ZW50IiwicmVxdWlyZSIsIkJhdHRsZUNvbnN0IiwiTWFpbnVpQ29udHJvbGxlciIsIk1haW51aUNvbnN0IiwiQmF0dGxlQ29udHJvbGxlciIsIkFkdmVudHVyZUNvbnRyb2xsZXIiLCJjYyIsIkNsYXNzIiwiQmFzZUNvbnRyb2xsZXIiLCJjdG9yIiwiaW5pdENvbmZpZyIsIkFkdmVudHVyZU1vZGVsIiwibW9kZWwiLCJnZXRNb2RlbCIsInJlZ2lzdGVyRXZlbnRzIiwicmVnaXN0ZXJQcm90b2NhbHMiLCJSZWdpc3RlclByb3RvY2FsIiwiaGFuZGxlMjA2MDAiLCJoYW5kbGUyMDYwMSIsImhhbmRsZTIwNjAyIiwiaGFuZGxlMjA2MDMiLCJoYW5kbGUyMDYwNCIsImhhbmRsZTIwNjA1IiwiaGFuZGxlMjA2MDYiLCJoYW5kbGUyMDYwNyIsImhhbmRsZTIwNjA4IiwiaGFuZGxlMjA2MDkiLCJoYW5kbGUyMDYxMCIsImhhbmRsZTIwNjExIiwiaGFuZGxlMjA2MTIiLCJoYW5kbGUyMDYyMCIsImhhbmRsZTIwNjIxIiwiaGFuZGxlMjA2MjIiLCJoYW5kbGUyMDYyMyIsImhhbmRsZTIwNjI0IiwiaGFuZGxlMjA2MjUiLCJoYW5kbGUyMDYyNyIsImhhbmRsZTIwNjI4IiwiaGFuZGxlMjA2MzAiLCJoYW5kbGUyMDYzMSIsImhhbmRsZTIwNjMyIiwiaGFuZGxlMjA2MzMiLCJoYW5kbGUyMDYzNCIsImhhbmRsZTIwNjM1IiwiaXNNb25zdGVyIiwiZXZlbnRfdHlwZSIsIkV2ZW50VHlwZSIsImJvc3MiLCJtb24iLCJtb24xIiwibW9uMiIsIm1vbjMiLCJvcGVuQW5zd2VyVmlldyIsInZhbHVlIiwiZGF0YSIsImFkdmVudHVyZV9hbnN3ZXJfdmlldyIsImNsb3NlIiwiVXRpbHMiLCJjcmVhdGVDbGFzcyIsImlzT3BlbiIsIm9wZW4iLCJyZXF1ZXN0RW50ZXJBZHZlbnR1cmUiLCJmb3JtX2xpc3QiLCJnZXRGb3JtTGlzdCIsIm5leHQiLCJvcGVuQWR2ZW50dXJlRm9ybVdpbmRvdyIsImdldEluc3RhbmNlIiwicmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3ciLCJGaWdodF9UeXBlIiwiQWR2ZW50cnVlIiwic3RhdHVzIiwiZm9ybV93aW5kb3ciLCJvcGVuQWR2ZW50dXJlTWFpbldpbmRvdyIsImFkdmVudHVyZV93aW5kb3ciLCJiYXNlX2RhdGEiLCJnZXRBZHZlbnR1cmVCYXNlRGF0YSIsIm9wZW5XaW5kb3dCeUNvbmZpZyIsImNvbmZpZyIsImV2dF90eXBlIiwiYWxsSGVyb0lzRGllIiwibWVzc2FnZSIsIlRJMThOIiwib3BlbkV2dFZpZXdCeVR5cGUiLCJib3giLCJmaW5nZXJfZ3Vlc3NpbmciLCJhbnN3ZXIiLCJucGMiLCJmcmVlYm94IiwibnBjX3RhbGsiLCJzaG9wIiwiZWZmZWN0Iiwic2VuZDIwNjIwIiwiaWQiLCJBZHZlbnR1cmVFdmVuSGFuZGxlVHlwZSIsImhhbmRsZSIsInJlZl9jbGFzcyIsImV4dGVuZHBhcmFtIiwiaXNfb3RoZXIiLCJhZHZlbnR1cmVfZXZ0X3ZpZXciLCJvcGVuQWR2ZW50cnVlU2hvcFdpbmRvdyIsInNob3Bfd2luZG93Iiwib3BlbkFkdmVudHVyZVNob3RLaWxsV2luZG93Iiwic2hvdF9raWxsX3dpbmRvdyIsIm9wZW5BZHZlbnR1cmVVc2VIUFdpbmRvdyIsInVzZV9ocF93aW5kb3ciLCJyb29tX2lkIiwiYWN0aW9uIiwiZXh0X2xpc3QiLCJwcm90b2NhbCIsIlNlbmRQcm90b2NhbCIsIm1zZyIsImNvZGUiLCJzZW5kMjA2MDIiLCJzZXRSb29tTGlzdCIsInVwZGF0ZVJvb21MaXN0Iiwic2VuZDIwNjA0IiwidXBkYXRlRm9ybVBhcnRuZXIiLCJwYXJ0bmVycyIsInJlcXVlc3RTZXRGb3JtIiwicGxpc3QiLCJzZW5kMjA2MDgiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIkhhbmRsZVJvb21PdmVyRXZlbnQiLCJzZW5kMjA2MDAiLCJzZXRBZHZlbnR1cmVCYXNlRGF0YSIsInNlbmQyMDYwMSIsInNldEJ1ZmZEYXRhIiwiVXBkYXRlX0V2dF9CdWZmX0luZm8iLCJVcGRhdGVfRXZ0X0d1ZXNzX1Jlc3VsdCIsIlVwZGF0ZV9FdnRfQW5zd2VyX0luZm8iLCJUaW1lciIsInNldCIsInNob3dHZXRJdGVtVGlwcyIsIml0ZW1zIiwiYmluZCIsIlVwZGF0ZV9FdnRfQm94X1Jlc3VsdF9JbmZvIiwiVXBkYXRlX0V2dF9OcGNfSW5mbyIsInR5cGUiLCJVcGRhdGVfRXZ0X1Nob3BfSW5mbyIsIm9wZW5BZHZlbnR1cmVFdnRTaG9wVmlldyIsImxpc3QiLCJzaG9wX2V2dF93aW5kb3ciLCJpc19hdXRvIiwiaXNfZ3Vlc3MiLCJyZXQiLCJzdHIiLCJpIiwidiIsIml0ZW1fY29uZmlnIiwiZ2V0SXRlbUNvbmZpZyIsImJpZCIsImdkYXRhIiwianMiLCJmb3JtYXRTdHIiLCJpY29uIiwibnVtIiwiQmFja1BhY2tDb25zdCIsInF1YWxpdHlfY29sb3IiLCJxdWFsaXR5IiwibmFtZSIsInBsYXlCdXR0b25Tb3VuZCIsIm9wZW5BZHZlbnR1cmVGbG9vclJlc3VsdFdpbmRvdyIsImZsb29yX3Jlc3VsdF93aW5kb3ciLCJpdGVtc19saXN0Iiwic2VuZDIwNjA5Iiwic2VuZDIwNjA3Iiwic2tpbGxfaWQiLCJ2YWwiLCJVcGRhdGVTa2lsbEluZm8iLCJza2lsbF9saXN0IiwidXBkYXRlU2VsZWN0UGFydG5lcklEIiwiVXBkYXRlTW9uc3RlckhQIiwiaHBfcGVyIiwiVXBkYXRlU2hvdEtpbGxJbmZvIiwicm9vbV9saXN0IiwiVXBkYXRlU2hvcFRvdGFsRXZlbnQiLCJVcGRhdGVTaG9wSXRlbUV2ZW50Iiwic2V0QWR2ZW50dXJlQm94U3RhdHVzIiwiVXBkYXRlQm94VGVza0V2ZW50IiwicHJvdG8iLCJraWxsX21hc3RlciIsImJveF9yZXdhcmRfd2luZG93IiwiR2V0U2tpbGxGb3JFZmZlY3RBY3Rpb24iLCJ1aV9maWdodF90eXBlIiwiZ2V0VUlGaWdodFR5cGUiLCJza3lfc2NlbmUiLCJpc19pbl9maWdodCIsImlzSW5GaWdodCIsImJhdHRsZV9leGl0X2V2ZW50IiwiRXZlbnRJZCIsIkVYSVRfRklHSFQiLCJjb21iYXRfdHlwZSIsInNob3dBZHZlbnR1cmVSZXNldCIsInVuYmluZCIsImNoYW5nZU1haW5VSVN0YXR1cyIsImJ0bl9pbmRleCIsIm1haW5fc2NlbmUiLCJDb21tb25BbGVydCIsInNob3ciLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxjQUFjLEdBQUdDLE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJQyxXQUFXLEdBQVdELE9BQU8sQ0FBQyxjQUFELENBQWpDOztBQUNBLElBQUlFLGdCQUFnQixHQUFHRixPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUcsV0FBVyxHQUFHSCxPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFDQSxJQUFJSSxnQkFBZ0IsR0FBR0osT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUVBLElBQUlLLG1CQUFtQixHQUFHQyxFQUFFLENBQUNDLEtBQUg7QUFDdEIsYUFBU0MsY0FEYTtBQUV0QkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZLENBQ2pCLENBSHFCO0FBS3RCO0FBQ0FDLEVBQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUNwQixRQUFJQyxjQUFjLEdBQUdYLE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFFQSxTQUFLWSxLQUFMLEdBQWEsSUFBSUQsY0FBSixFQUFiO0FBQ0EsU0FBS0MsS0FBTCxDQUFXRixVQUFYO0FBQ0gsR0FYcUI7QUFhdEI7QUFDQUcsRUFBQUEsUUFBUSxFQUFFLG9CQUFZO0FBQ2xCLFdBQU8sS0FBS0QsS0FBWjtBQUNILEdBaEJxQjtBQWtCdEI7QUFDQUUsRUFBQUEsY0FBYyxFQUFFLDBCQUFZLENBQzNCLENBcEJxQjtB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QUEwQjtBQUN0QnJFLElBQUFBLEtBQUssQ0FBQ0MsV0FBTixDQUFrQnlFLE1BQWxCLENBQXlCLEtBQUtMLGlCQUE5QjtBQUNBLFNBQUtBLGlCQUFMLEdBQXlCLElBQXpCO0FBQ0g7O0FBQ0Q1TCxFQUFBQSxnQkFBZ0IsQ0FBQ2dFLFdBQWpCLEdBQStCa0ksa0JBQS9CLENBQWtEak0sV0FBVyxDQUFDa00sU0FBWixDQUFzQkMsVUFBeEU7QUFDQTdFLEVBQUFBLEtBQUssQ0FBQ1csS0FBTixDQUFZQyxHQUFaLENBQWdCLFlBQVk7QUFDeEIsUUFBSXZCLEdBQUcsR0FBR3JELEtBQUssQ0FBQ3dCLEtBQU4sQ0FBWSxpQkFBWixDQUFWOztBQUNBLFFBQUlzSCxXQUFXLEdBQUd2TSxPQUFPLENBQUMsYUFBRCxDQUF6Qjs7QUFDQXVNLElBQUFBLFdBQVcsQ0FBQ0MsSUFBWixDQUFpQjFGLEdBQWpCLEVBQXNCckQsS0FBSyxDQUFDd0IsS0FBTixDQUFZLElBQVosQ0FBdEIsRUFBd0MsWUFBVTtBQUM5QyxXQUFLcEIscUJBQUw7QUFDSCxLQUZ1QyxDQUV0QzJFLElBRnNDLENBRWpDLElBRmlDLENBQXhDLEVBRWMvRSxLQUFLLENBQUN3QixLQUFOLENBQVksSUFBWixDQUZkO0FBR0gsR0FOZSxDQU1kdUQsSUFOYyxDQU1ULElBTlMsQ0FBaEIsRUFNYyxHQU5kLEVBTW1CLENBTm5CO0FBT0gsQ0Fqc0JxQixjQUExQjtBQXFzQkFpRSxNQUFNLENBQUNDLE9BQVAsR0FBaUJyTSxtQkFBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg5YaS6Zmp5Li75o6n5Yi25ZmoXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wNS0wOSAxNDoxNDo1MlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBBZHZlbnR1cmVFdmVudCA9IHJlcXVpcmUoXCJhZHZlbnR1cmVfZXZlbnRcIik7XG52YXIgQmF0dGxlQ29uc3QgICAgICAgICA9IHJlcXVpcmUoXCJiYXR0bGVfY29uc3RcIik7XG52YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG52YXIgQmF0dGxlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKTtcblxudmFyIEFkdmVudHVyZUNvbnRyb2xsZXIgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZUNvbnRyb2xsZXIsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbphY3nva7mlbDmja5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBBZHZlbnR1cmVNb2RlbCA9IHJlcXVpcmUoXCJhZHZlbnR1cmVfbW9kZWxcIik7XG5cbiAgICAgICAgdGhpcy5tb2RlbCA9IG5ldyBBZHZlbnR1cmVNb2RlbCgpO1xuICAgICAgICB0aGlzLm1vZGVsLmluaXRDb25maWcoKTtcbiAgICB9LFxuXG4gICAgLy8g6L+U5Zue5b2T5YmN55qEbW9kZWxcbiAgICBnZXRNb2RlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbDtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgcmVnaXN0ZXJFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5Y2P6K6u5o6l5Y+X5LqL5Lu2XG4gICAgcmVnaXN0ZXJQcm90b2NhbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwNjAwLCB0aGlzLmhhbmRsZTIwNjAwKSAgICAvL+WfuuacrOS/oeaBr1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjA2MDEsIHRoaXMuaGFuZGxlMjA2MDEpICAgIC8vQlVGRuS/oeaBr1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjA2MDIsIHRoaXMuaGFuZGxlMjA2MDIpICAgIC8v5oi/6Ze05L+h5oGvXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDYwMywgdGhpcy5oYW5kbGUyMDYwMykgICAgLy/mnI3liqHnq6/pgJrnn6Xmm7TmlrDmjIflrprmiL/pl7Tkv6Hmga9cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwNjA0LCB0aGlzLmhhbmRsZTIwNjA0KSAgICAvL+iOt+WPluW9k+WJjeS8meS8tOS/oeaBr+aVsOaNrlxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjA2MDUsIHRoaXMuaGFuZGxlMjA2MDUpICAgIC8v6K6+572u5LiK6Zi15LyZ5Ly05L+h5oGvXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDYwNiwgdGhpcy5oYW5kbGUyMDYwNikgICAgLy/mr4/kuIDlsYLnu5PnrpdcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwNjA3LCB0aGlzLmhhbmRsZTIwNjA3KSAgICAvL+S9v+eUqDPkuKrkuLvopoHmioDog73nmoRcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwNjA4LCB0aGlzLmhhbmRsZTIwNjA4KSAgICAvL+i/m+WOu+aMh+WumuaIv+mXtFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjA2MDksIHRoaXMuaGFuZGxlMjA2MDkpICAgIC8v5oqA6IO95L+h5oGvXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDYxMCwgdGhpcy5oYW5kbGUyMDYxMCkgICAgLy/pgInkuK3kvJnkvLRcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwNjExLCB0aGlzLmhhbmRsZTIwNjExKSAgICAvL+S4gOWHu+W/headgOivt+axglxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjA2MTIsIHRoaXMuaGFuZGxlMjA2MTIpICAgIC8v5YaS6Zmp6YeN572uXG5cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwNjIwLCB0aGlzLmhhbmRsZTIwNjIwKSAgICAvL+S6i+S7tuWPjemmiFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjA2MjEsIHRoaXMuaGFuZGxlMjA2MjEpICAgIC8v54yc5ouz57uT5p6c5Y+N6aaIXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDYyMiwgdGhpcy5oYW5kbGUyMDYyMikgICAgLy9idWZm5L+h5oGv5p+l55yLXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDYyMywgdGhpcy5oYW5kbGUyMDYyMykgICAgLy/nrZTpopjkv6Hmga9cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwNjI0LCB0aGlzLmhhbmRsZTIwNjI0KSAgICAvL+aAqueJqeS/oeaBr1xuXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDYyNSwgdGhpcy5oYW5kbGUyMDYyNSkgICAgLy/ojrflvpfmioDog70s5Li76KaB5piv55So5LqO6KGo546w5pWI5p6c5aSE55CGXG5cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwNjI3LCB0aGlzLmhhbmRsZTIwNjI3KSAgICAvL05QQ+WvueivneW6j+WPt1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjA2MjgsIHRoaXMuaGFuZGxlMjA2MjgpICAgIC8vTlBD5a+56K+d57uT5p6cXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDYzMCwgdGhpcy5oYW5kbGUyMDYzMCkgICAgLy/lrp3nrrHmiZPlvIDnu5PmnpxcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwNjMxLCB0aGlzLmhhbmRsZTIwNjMxKSAgICAvL+elnuenmOWVhuW6l+S6i+S7tlxuXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDYzMiwgdGhpcy5oYW5kbGUyMDYzMikgICAgLy/npZ7np5jllYblupfmgLvop4hcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwNjMzLCB0aGlzLmhhbmRsZTIwNjMzKSAgICAvL+elnuenmOWVhuW6l+i0reS5sFxuXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDYzNCwgdGhpcy5oYW5kbGUyMDYzNClcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwNjM1LCB0aGlzLmhhbmRsZTIwNjM1KVxuICAgIH0sXG5cbiAgICBpc01vbnN0ZXI6ZnVuY3Rpb24oZXZlbnRfdHlwZSl7XG4gICAgICAgIHJldHVybiBldmVudF90eXBlID09IEFkdmVudHVyZUV2ZW50LkV2ZW50VHlwZS5ib3NzIHx8IGV2ZW50X3R5cGUgPT0gQWR2ZW50dXJlRXZlbnQuRXZlbnRUeXBlLm1vbiB8fCBldmVudF90eXBlID09IEFkdmVudHVyZUV2ZW50LkV2ZW50VHlwZS5tb24xIHx8IGV2ZW50X3R5cGUgPT0gQWR2ZW50dXJlRXZlbnQuRXZlbnRUeXBlLm1vbjIgfHwgZXZlbnRfdHlwZSA9PSBBZHZlbnR1cmVFdmVudC5FdmVudFR5cGUubW9uMztcbiAgICB9LFxuXG4gICAgb3BlbkFuc3dlclZpZXc6ZnVuY3Rpb24odmFsdWUsZGF0YSl7XG4gICAgICAgIGlmKHZhbHVlID09IGZhbHNlKXtcbiAgICAgICAgICAgIGlmKHRoaXMuYWR2ZW50dXJlX2Fuc3dlcl92aWV3ICE9IG51bGwpe1xuICAgICAgICAgICAgICAgIHRoaXMuYWR2ZW50dXJlX2Fuc3dlcl92aWV3LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZHZlbnR1cmVfYW5zd2VyX3ZpZXcgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHRoaXMuYWR2ZW50dXJlX2Fuc3dlcl92aWV3ID09IG51bGwpe1xuICAgICAgICAgICAgICAgIHRoaXMuYWR2ZW50dXJlX2Fuc3dlcl92aWV3ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJhZHZlbnR1cmVfZXZ0X2Fuc3dlcl93aW5kb3dcIix0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMuYWR2ZW50dXJlX2Fuc3dlcl92aWV3ICYmIHRoaXMuYWR2ZW50dXJlX2Fuc3dlcl92aWV3LmlzT3BlbigpID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmVudHVyZV9hbnN3ZXJfdmlldy5vcGVuKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICAvL2Rlc2M66L+b5YWl5YaS6Zmp55qE5Li75YWl5Y+jXG4gICAgLy9AcmV0dXJuIFxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICByZXF1ZXN0RW50ZXJBZHZlbnR1cmU6ZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIGZvcm1fbGlzdCA9IHRoaXMubW9kZWwuZ2V0Rm9ybUxpc3QoKTtcbiAgICAgICAgaWYoZm9ybV9saXN0ID09IG51bGwgfHwgVXRpbHMubmV4dChmb3JtX2xpc3QpID09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5vcGVuQWR2ZW50dXJlRm9ybVdpbmRvdyh0cnVlKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5BZHZlbnRydWUpIFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gZGVzYzrmiZPlvIDlhpLpmannq5nliY3luIPpmLXnlYzpnaJcbiAgICAvLyBAc3RhdHVzOlxuICAgIC8vIEByZXR1cm4gXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICBvcGVuQWR2ZW50dXJlRm9ybVdpbmRvdzpmdW5jdGlvbihzdGF0dXMpe1xuICAgICAgICBpZighc3RhdHVzKXtcbiAgICAgICAgICAgIGlmKHRoaXMuZm9ybV93aW5kb3cpe1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1fd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLmZvcm1fd2luZG93ID09IG51bGwpe1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV93aW5kb3cgPSBVdGlscy5jcmVhdGVDbGFzcyhcImFkdmVudHVyZV9mb3JtX3dpbmRvd1wiLHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5mb3JtX3dpbmRvdyAmJiB0aGlzLmZvcm1fd2luZG93LmlzT3BlbigpID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1fd2luZG93Lm9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBcbiAgICAvLyAtLSDlvJXlr7zpnIDopoFcbiAgICAvLyBmdW5jdGlvbiBBZHZlbnR1cmVDb250cm9sbGVyOmdldEFkdmVudHVyZVJvb3QoKVxuICAgIC8vICAgICBpZiB0aGlzLmFkdmVudHVyZV93aW5kb3cgdGhlblxuICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuYWR2ZW50dXJlX3dpbmRvdy5yb290X3duZFxuICAgIC8vICAgICBlbmRcbiAgICAvLyBlbmRcblxuICAgIC8vIC0tIOW8leWvvOmcgOimgeS4i+S4gOWxgueahOaMh+W8lVxuICAgIC8vIGZ1bmN0aW9uIEFkdmVudHVyZUNvbnRyb2xsZXI6Z2V0TmV4dEFsZXJ0Um9vdCgpXG4gICAgLy8gICAgIGlmIHRoaXMuYWR2ZW50dXJlX3dpbmRvdyB0aGVuXG4gICAgLy8gICAgICAgICB2YXIgYWxlcnQgPSB0aGlzLmFkdmVudHVyZV93aW5kb3c6Z2V0QWxlcnQoKVxuICAgIC8vICAgICAgICAgaWYgYWxlcnQgdGhlblxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBhbGVydC5yb290X3duZFxuICAgIC8vICAgICAgICAgZW5kXG4gICAgLy8gICAgIGVuZFxuICAgIC8vIGVuZFxuXG4gICAgb3BlbkFkdmVudHVyZU1haW5XaW5kb3c6ZnVuY3Rpb24oc3RhdHVzKXtcbiAgICAgICAgaWYoIXN0YXR1cyl7XG4gICAgICAgICAgICBpZih0aGlzLmFkdmVudHVyZV93aW5kb3cpe1xuICAgICAgICAgICAgICAgIHRoaXMuYWR2ZW50dXJlX3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWR2ZW50dXJlX3dpbmRvdyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgLy8g5rKh5pyJ5biD6Zi15piv5LiN57uZ6L+b5Y6755qEXG4gICAgICAgICAgICB2YXIgZm9ybV9saXN0ID0gdGhpcy5tb2RlbC5nZXRGb3JtTGlzdCgpO1xuICAgICAgICAgICAgaWYoZm9ybV9saXN0ID09IG51bGwgfHwgVXRpbHMubmV4dChmb3JtX2xpc3QpID09IG51bGwpe1xuICAgICAgICAgICAgICAgIC8vIHByaW50KFwi6Lez6L2s6L+b5YWl56We55WM5YaS6Zmp5pyJ6K+vLOW9k+WJjei/mOayoeacieW4g+mYtSA9PT09PT09PT09PT0+XCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5rKh5pyJ5Z+656GA5pWw5o2u5Lmf5LiN5YGa5ZON5bqUXG4gICAgICAgICAgICB2YXIgYmFzZV9kYXRhID0gdGhpcy5tb2RlbC5nZXRBZHZlbnR1cmVCYXNlRGF0YSgpO1xuICAgICAgICAgICAgaWYoYmFzZV9kYXRhID09IG51bGwpcmV0dXJuO1xuXG4gICAgICAgICAgICBpZih0aGlzLmFkdmVudHVyZV93aW5kb3cgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgdGhpcy5hZHZlbnR1cmVfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJhZHZlbnR1cmVfbWFpbl93aW5kb3dcIix0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMuYWR2ZW50dXJlX3dpbmRvdyAmJiB0aGlzLmFkdmVudHVyZV93aW5kb3cuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMuYWR2ZW50dXJlX3dpbmRvdy5vcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgb3BlbldpbmRvd0J5Q29uZmlnOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZihkYXRhID09IG51bGwgfHwgZGF0YS5jb25maWcgPT0gbnVsbClyZXR1cm47XG4gICAgICAgIHZhciBjb25maWcgPSBkYXRhLmNvbmZpZztcbiAgICAgICAgaWYodGhpcy5pc01vbnN0ZXIoY29uZmlnLmV2dF90eXBlKSl7Ly9ib3Nz5oiW6ICF5oCq54mpXG4gICAgICAgICAgICBpZih0aGlzLm1vZGVsLmFsbEhlcm9Jc0RpZSgpID09IHRydWUpe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UoVXRpbHMuVEkxOE4oXCLoi7Hpm4Tlhajpg6jpmLXkuqEs5pys6L2u5YaS6Zmp5bey57uT5p2fIVwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcGVuRXZ0Vmlld0J5VHlwZSh0cnVlLCBcImFkdmVudHVyZV9ldnRfY2hhbGxlbmdlX3dpbmRvd1wiLCBkYXRhKTtcbiAgICAgICAgfWVsc2UgaWYoY29uZmlnLmV2dF90eXBlID09IEFkdmVudHVyZUV2ZW50LkV2ZW50VHlwZS5ib3gpey8vQuWuneeusVxuICAgICAgICAgICAgdGhpcy5vcGVuRXZ0Vmlld0J5VHlwZSh0cnVlLCBcImFkdmVudHVyZV9ldnRfYm94X3dpbmRvd1wiLCBkYXRhKTtcbiAgICAgICAgfWVsc2UgaWYoY29uZmlnLmV2dF90eXBlID09IEFkdmVudHVyZUV2ZW50LkV2ZW50VHlwZS5maW5nZXJfZ3Vlc3Npbmcpey8v54yc5ouzXG4gICAgICAgICAgICB0aGlzLm9wZW5FdnRWaWV3QnlUeXBlKHRydWUsIFwiYWR2ZW50dXJlX2V2dF9maWdodGVyZ3Vlc3Nfd2luZG93XCIsIGRhdGEpO1xuICAgICAgICB9ZWxzZSBpZihjb25maWcuZXZ0X3R5cGUgPT0gQWR2ZW50dXJlRXZlbnQuRXZlbnRUeXBlLmFuc3dlcil7Ly/nrZTpophcbiAgICAgICAgICAgIHRoaXMub3BlbkV2dFZpZXdCeVR5cGUodHJ1ZSwgXCJhZHZlbnR1cmVfZXZ0X2Fuc3dlcl9zdGFydF93aW5kb3dcIiwgZGF0YSk7XG4gICAgICAgIH1lbHNlIGlmKGNvbmZpZy5ldnRfdHlwZSA9PSBBZHZlbnR1cmVFdmVudC5FdmVudFR5cGUubnBjKXsvL25wY+S6i+S7tlxuICAgICAgICAgICAgdGhpcy5vcGVuRXZ0Vmlld0J5VHlwZSh0cnVlLCBcImFkdmVudHVyZV9ldnRfbnBjX3dpbmRvd1wiLCBkYXRhKTtcbiAgICAgICAgfWVsc2UgaWYoY29uZmlnLmV2dF90eXBlID09IEFkdmVudHVyZUV2ZW50LkV2ZW50VHlwZS5mcmVlYm94KXsvL+WFjei0ueWuneeusVxuICAgICAgICAgICAgdGhpcy5vcGVuRXZ0Vmlld0J5VHlwZSh0cnVlLCBcImFkdmVudHVyZV9ldnRfZnJlZV9ib3hfd2luZG93XCIsIGRhdGEpO1xuICAgICAgICB9ZWxzZSBpZihjb25maWcuZXZ0X3R5cGUgPT0gQWR2ZW50dXJlRXZlbnQuRXZlbnRUeXBlLm5wY190YWxrKXsvL25wY+WvueivnVxuICAgICAgICAgICAgdGhpcy5vcGVuRXZ0Vmlld0J5VHlwZSh0cnVlLCBcImFkdmVudHVyZV9ldnRfb3RoZXJfbnBjX3dpbmRvd1wiLCBkYXRhKTtcbiAgICAgICAgfWVsc2UgaWYoY29uZmlnLmV2dF90eXBlID09IEFkdmVudHVyZUV2ZW50LkV2ZW50VHlwZS5zaG9wKXsvL+elnuenmOWVhuW6l1xuICAgICAgICAgICAgdGhpcy5vcGVuRXZ0Vmlld0J5VHlwZSh0cnVlLCBcImFkdmVudHVyZV9ldnRfc2hvcF93aW5kb3dcIiwgZGF0YSk7XG4gICAgICAgIH1lbHNlIGlmKGNvbmZpZy5ldnRfdHlwZSA9PSBBZHZlbnR1cmVFdmVudC5FdmVudFR5cGUuZWZmZWN0KXsvL+eJueaViOS6i+S7tlxuICAgICAgICAgICAgdGhpcy5zZW5kMjA2MjAoZGF0YS5pZCwgQWR2ZW50dXJlRXZlbnQuQWR2ZW50dXJlRXZlbkhhbmRsZVR5cGUuaGFuZGxlLCB7fSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5omT5byA5ZCE56eN5LqL5Lu26Z2i5p2/XG4gICAgb3BlbkV2dFZpZXdCeVR5cGU6ZnVuY3Rpb24oc3RhdHVzLCByZWZfY2xhc3MsIGRhdGEsIGV4dGVuZHBhcmFtLCBpc19vdGhlcil7XG4gICAgICAgIGlmKHN0YXR1cyA9PSBmYWxzZSl7XG4gICAgICAgICAgICBpZih0aGlzLmFkdmVudHVyZV9ldnRfdmlldyE9bnVsbCl7XG4gICAgICAgICAgICAgICAgdGhpcy5hZHZlbnR1cmVfZXZ0X3ZpZXcuY2xvc2UoKTtcblx0XHRcdCAgICB0aGlzLmFkdmVudHVyZV9ldnRfdmlldyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYoZGF0YSA9PSBudWxsKXJldHVybjtcbiAgICAgICAgICAgIHZhciByZWZfY2xhc3MgPSByZWZfY2xhc3MgfHwgXCJhZHZlbnR1cmVfZXZ0X2NoYWxsZW5nZV93aW5kb3dcIiBcbiAgICAgICAgICAgIGlmKHRoaXMuYWR2ZW50dXJlX2V2dF92aWV3ID09IG51bGwpe1xuICAgICAgICAgICAgICAgIHRoaXMuYWR2ZW50dXJlX2V2dF92aWV3ID0gVXRpbHMuY3JlYXRlQ2xhc3MocmVmX2NsYXNzLHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5hZHZlbnR1cmVfZXZ0X3ZpZXcgJiYgdGhpcy5hZHZlbnR1cmVfZXZ0X3ZpZXcuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMuYWR2ZW50dXJlX2V2dF92aWV3Lm9wZW4oZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICAvLyBkZXNjOuWGkumZqeWVhuW6l1xuICAgIC8vIEBzdGF0dXM6XG4gICAgLy8gQHJldHVybiBcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIG9wZW5BZHZlbnRydWVTaG9wV2luZG93OmZ1bmN0aW9uKHN0YXR1cyl7XG4gICAgICAgIGlmKCFzdGF0dXMpe1xuICAgICAgICAgICAgaWYodGhpcy5zaG9wX3dpbmRvdyl7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG9wX3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvcF93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHRoaXMuc2hvcF93aW5kb3cgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG9wX3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiYWR2ZW50dXJlX3Nob3Bfd2luZG93XCIsdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLnNob3Bfd2luZG93ICYmIHRoaXMuc2hvcF93aW5kb3cuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvcF93aW5kb3cub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gZGVzYzrkuIDlh7vlv4XmnYDnlYzpnaJcbiAgICAvLyBAc3RhdHVzOlxuICAgIC8vIEByZXR1cm4gXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICBvcGVuQWR2ZW50dXJlU2hvdEtpbGxXaW5kb3c6ZnVuY3Rpb24oc3RhdHVzLCBjb25maWcpe1xuICAgICAgICBpZighc3RhdHVzKXtcbiAgICAgICAgICAgIGlmKHRoaXMuc2hvdF9raWxsX3dpbmRvdyl7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG90X2tpbGxfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG90X2tpbGxfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZihjb25maWcgPT0gbnVsbClyZXR1cm47XG4gICAgICAgICAgICBpZih0aGlzLnNob3Rfa2lsbF93aW5kb3cgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG90X2tpbGxfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJhZHZlbnR1cmVfc2hvdF9raWxsX3dpbmRvd1wiLHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5zaG90X2tpbGxfd2luZG93ICYmIHRoaXMuc2hvdF9raWxsX3dpbmRvdy5pc09wZW4oKSA9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG90X2tpbGxfd2luZG93Lm9wZW4oY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIC8vIGRlc2M65L2/55So6I2v5ZOBXG4gICAgLy8gQHN0YXR1czpcbiAgICAvLyBAcmV0dXJuIFxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgb3BlbkFkdmVudHVyZVVzZUhQV2luZG93OmZ1bmN0aW9uKHN0YXR1cywgY29uZmlnKXtcbiAgICAgICAgaWYoIXN0YXR1cyl7XG4gICAgICAgICAgICBpZih0aGlzLnVzZV9ocF93aW5kb3cpe1xuICAgICAgICAgICAgICAgIHRoaXMudXNlX2hwX3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMudXNlX2hwX3dpbmRvdyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYoY29uZmlnID09IG51bGwpcmV0dXJuO1xuICAgICAgICAgICAgaWYodGhpcy51c2VfaHBfd2luZG93ID09IG51bGwpe1xuICAgICAgICAgICAgICAgIHRoaXMudXNlX2hwX3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiYWR2ZW50dXJlX3VzZV9ocF93aW5kb3dcIix0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMudXNlX2hwX3dpbmRvdyAmJiB0aGlzLnVzZV9ocF93aW5kb3cuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMudXNlX2hwX3dpbmRvdy5vcGVuKGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5LqL5Lu25pON5L2cXG4gICAgc2VuZDIwNjIwOmZ1bmN0aW9uKHJvb21faWQsYWN0aW9uLGV4dF9saXN0KXtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnJvb21faWQgPSByb29tX2lkO1xuICAgICAgICBwcm90b2NhbC5hY3Rpb24gPSBhY3Rpb247XG4gICAgICAgIHByb3RvY2FsLmV4dF9saXN0ID0gZXh0X2xpc3QgfHwge307XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwNjIwLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTIwNjIwOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYoZGF0YS5jb2RlID09IDIpe1xuICAgICAgICAgICAgdGhpcy5vcGVuRXZ0Vmlld0J5VHlwZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6K+35rGC5oi/6Ze05L+h5oGvXG4gICAgc2VuZDIwNjAyOmZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDYwMiwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvLyDmiL/pl7Tkv6Hmga/ov5Tlm55cbiAgICBoYW5kbGUyMDYwMjpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRSb29tTGlzdChkYXRhKTtcbiAgICB9LFxuXG4gICAgLy8g5pyN5Yqh56uv6YCa55+l5pu05paw5oyH5a6a5oi/6Ze05L+h5oGvXG4gICAgaGFuZGxlMjA2MDM6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMubW9kZWwudXBkYXRlUm9vbUxpc3QoZGF0YSk7XG4gICAgfSxcblxuICAgIHNlbmQyMDYwNDpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDYwNCwge30pO1xuICAgIH0sXG5cbiAgICAvLyDojrflj5blvZPliY3kvJnkvLTkv6Hmga/mlbDmja5cbiAgICBoYW5kbGUyMDYwNDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVGb3JtUGFydG5lcihkYXRhLnBhcnRuZXJzLCBkYXRhLmlkKTtcbiAgICAgICAgLy8gaWYoTkVFRENIQU5HRUVOVEVSU1RBVFVTID09IDIgJiYgIXRoaXMuZmlyc3RfZW50ZXIpey8v5aaC5p6c5pivMeWwsei3s+i9rOWIsOWHuuWFt1xuICAgICAgICAvLyAgICAgdGhpcy5maXJzdF9lbnRlciAgPSB0cnVlO1xuICAgICAgICAvLyAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmNoYW5nZU1haW5VSVN0YXR1cyhNYWludWlDb25zdC5idG5faW5kZXguZHJhbWFfc2NlbmUpO1xuICAgICAgICAvLyB9XG4gICAgfSxcblxuICAgIC8vIOivt+axguW4g+mYtVxuICAgIHJlcXVlc3RTZXRGb3JtOmZ1bmN0aW9uKHBsaXN0KXtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnBsaXN0ID0gcGxpc3QgfHwge307XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwNjA1LCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTIwNjA1OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZihkYXRhLmNvZGUgPT0gMSl7XG4gICAgICAgICAgICB0aGlzLm9wZW5BZHZlbnR1cmVGb3JtV2luZG93KGZhbHNlKTtcbiAgICAgICAgICAgIC8vIOivt+axgui/m+WFpVxuICAgICAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnJlcXVlc3RPcGVuQmF0dGxlUmVsZXZhbmNlV2luZG93KEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuQWR2ZW50cnVlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZW5kMjA2MDg6ZnVuY3Rpb24ocm9vbV9pZCl7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5yb29tX2lkID0gcm9vbV9pZDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjA2MDgsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjA2MDg6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICBpZihkYXRhLmNvZGUgPT0gMSl7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFkdmVudHVyZUV2ZW50LkhhbmRsZVJvb21PdmVyRXZlbnQsIGRhdGEucm9vbV9pZCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Z+65pys5L+h5oGvXG4gICAgc2VuZDIwNjAwOmZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDYwMCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvLyDln7rmnKzkv6Hmga/ov5Tlm55cbiAgICBoYW5kbGUyMDYwMDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgaWYoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRBZHZlbnR1cmVCYXNlRGF0YShkYXRhKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBidWZm5L+h5oGvXG4gICAgc2VuZDIwNjAxOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwNjAxLCB7fSk7XG4gICAgfSxcblxuICAgIC8vIGJ1Zmbkv6Hmga/ov5Tlm55cbiAgICBoYW5kbGUyMDYwMTpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgaWYoZGF0YSl7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldEJ1ZmZEYXRhKGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBcbiAgICBoYW5kbGUyMDYyMjpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgaWYoZGF0YSl7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFkdmVudHVyZUV2ZW50LlVwZGF0ZV9FdnRfQnVmZl9JbmZvLGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGhhbmRsZTIwNjIxOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZihkYXRhKXtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWR2ZW50dXJlRXZlbnQuVXBkYXRlX0V2dF9HdWVzc19SZXN1bHQsZGF0YSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaGFuZGxlMjA2MjM6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIGlmKGRhdGEpe1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBZHZlbnR1cmVFdmVudC5VcGRhdGVfRXZ0X0Fuc3dlcl9JbmZvLGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBcblxuICAgIGhhbmRsZTIwNjI4OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZihkYXRhKXtcbiAgICAgICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICAgICAgZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5FdnRWaWV3QnlUeXBlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dHZXRJdGVtVGlwcyhkYXRhLml0ZW1zKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgMTAwMCwgMSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaGFuZGxlMjA2MzA6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIGlmKGRhdGEpe1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBZHZlbnR1cmVFdmVudC5VcGRhdGVfRXZ0X0JveF9SZXN1bHRfSW5mbyxkYXRhKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBoYW5kbGUyMDYyNzpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgaWYoZGF0YSl7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFkdmVudHVyZUV2ZW50LlVwZGF0ZV9FdnRfTnBjX0luZm8sZGF0YSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaGFuZGxlMjA2MzE6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIGlmKGRhdGEudHlwZSA9PSAxKXsvL+eCueWHu+aIv+mXtOS6i+S7tuaXtuWAmeivt+axgjIw5Y2P6K6u5LmL5ZCO6L+U5Zue5aSE55CGXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFkdmVudHVyZUV2ZW50LlVwZGF0ZV9FdnRfU2hvcF9JbmZvLGRhdGEpO1xuICAgICAgICB9ZWxzZSBpZihkYXRhLnR5cGUgPT0gMil7Ly/ngrnlh7vmioDog73llYblupfnm7TmjqXlvLnlh7pcbiAgICAgICAgICAgIHRoaXMub3BlbkFkdmVudHVyZUV2dFNob3BWaWV3KHRydWUsIGRhdGEubGlzdCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICAvLyBkZXNjOuS4u+WKqOaJk+W8gOelnuenmOWVhuW6l1xuICAgIC8vIEBzdGF0dXM6XG4gICAgLy8gQGRhdGE6XG4gICAgLy8gQHJldHVybiBcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIG9wZW5BZHZlbnR1cmVFdnRTaG9wVmlldzpmdW5jdGlvbihzdGF0dXMsIGRhdGEpe1xuICAgICAgICBpZighc3RhdHVzKXtcbiAgICAgICAgICAgIGlmKHRoaXMuc2hvcF9ldnRfd2luZG93KXtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3BfZXZ0X3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvcF9ldnRfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLnNob3BfZXZ0X3dpbmRvdyA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3BfZXZ0X3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiYWR2ZW50dXJlX2V2dF9zaG9wX3dpbmRvd1wiLHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5zaG9wX2V2dF93aW5kb3cgJiYgdGhpcy5zaG9wX2V2dF93aW5kb3cuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIGlmKGRhdGEpe1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmlzX2F1dG8gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNob3BfZXZ0X3dpbmRvdy5vcGVuKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gZGVzYzrlhpLpmankuK3po5jlrZflpITnkIZcbiAgICAvLyBAaXRlbXM6XG4gICAgLy8gQGlzX2d1ZXNzOuaYr+WQpuaYr+eMnOaLs+e7k+aenFxuICAgIC8vIEByZXQ654yc5ouz55qE57uT5p6cXG4gICAgLy8gQHJldHVybiBcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIHNob3dHZXRJdGVtVGlwczpmdW5jdGlvbihpdGVtcywgaXNfZ3Vlc3MsIHJldCl7XG4gICAgICAgIGlmKGl0ZW1zKXtcbiAgICAgICAgICAgIHZhciBzdHIgPSBcIlwiO1xuICAgICAgICAgICAgZm9yKHZhciBpIGluIGl0ZW1zKXtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IGl0ZW1zW2ldO1xuICAgICAgICAgICAgICAgIGlmKHN0ciAhPSBcIlwiKXtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gc3RyICsgXCLvvIxcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaXRlbV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKHYuYmlkKTtcbiAgICAgICAgICAgICAgICBpZihnZGF0YShcIml0ZW1fZGF0YVwiLFwiZGF0YV9hc3NldHNfaWQybGFiZWxcIix2LmJpZCkpe1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSBjYy5qcy5mb3JtYXRTdHIoXCIlczxpbWcgc3JjPSVzPjwvaW1nPjxjb2xvcj0jMjg5YjE0PnglczwvY29sb3I+XCIsIHN0ciwgaXRlbV9jb25maWcuaWNvbiwgdi5udW0pO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICB2YXIgQmFja1BhY2tDb25zdCA9IHJlcXVpcmUoXCJiYWNrcGFja19jb25zdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gY2MuanMuZm9ybWF0U3RyKFwiJXM8Y29sb3I9JXM+JXM8L2NvbG9yPjxjb2xvcj0jMjg5YjE0PnglczwvY29sb3I+XCIsIHN0ciwgQmFja1BhY2tDb25zdC5xdWFsaXR5X2NvbG9yKGl0ZW1fY29uZmlnLnF1YWxpdHkpLCBpdGVtX2NvbmZpZy5uYW1lLCB2Lm51bSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoaXNfZ3Vlc3MgPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgcmV0ID0gcmV0IHx8IDA7XG4gICAgICAgICAgICAgICAgaWYocmV0ID09IDApey8v5bmzXG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuW5s+WxgO+8geWkquWPr+aDnOS6hu+8jCVz6L+Y5L2gXCIpLCBzdHIpO1xuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHJldCA9PSAxKXsvL+i1olxuICAgICAgICAgICAgICAgICAgICBzdHIgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLlpb3lkKfvvIzov5klc+W9kuS9oOS6hlwiKSwgc3RyKTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi55yL5L2g6L+Z5LmI5Y+v5oCc77yM6L+Y5L2gJXPlkKdcIiksIHN0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi6I635Y+WJXNcIiksIHN0cik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZChcImNfZ2V0XCIpO1xuICAgICAgICAgICAgbWVzc2FnZShzdHIpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWGkumZqeavj+S4gOWxgue7k+eul+aVsOaNrlxuICAgIG9wZW5BZHZlbnR1cmVGbG9vclJlc3VsdFdpbmRvdzpmdW5jdGlvbihzdGF0dXMsIGRhdGEpe1xuICAgICAgICBpZighc3RhdHVzKXtcbiAgICAgICAgICAgIGlmKHRoaXMuZmxvb3JfcmVzdWx0X3dpbmRvdyl7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG9vcl9yZXN1bHRfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG9vcl9yZXN1bHRfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZihkYXRhID09IG51bGwgfHwgZGF0YS5pdGVtc19saXN0ID09IG51bGwpcmV0dXJuO1xuICAgICAgICAgICAgaWYodGhpcy5mbG9vcl9yZXN1bHRfd2luZG93ID09IG51bGwpe1xuICAgICAgICAgICAgICAgIHRoaXMuZmxvb3JfcmVzdWx0X3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiYWR2ZW50dXJlX2Zsb29yX3Jlc3VsdF93aW5kb3dcIix0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMuZmxvb3JfcmVzdWx0X3dpbmRvdyAmJiB0aGlzLmZsb29yX3Jlc3VsdF93aW5kb3cuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMuZmxvb3JfcmVzdWx0X3dpbmRvdy5vcGVuKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vICDmnI3liqHnq6/kuLvliqjmjqjpgIHnmoTnu5PnrpfnlYzpnaJcbiAgICBoYW5kbGUyMDYwNjpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdGhpcy5vcGVuQWR2ZW50dXJlRmxvb3JSZXN1bHRXaW5kb3codHJ1ZSwgZGF0YSk7XG4gICAgfSxcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gZGVzYzror7fmsYLmioDog73kv6Hmga9cbiAgICAvLyBAcmV0dXJuIFxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgc2VuZDIwNjA5OmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwNjA5LCB7fSk7XG4gICAgfSxcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gZGVzYzrkvb/nlKgz5Liq5oqA6IO9XG4gICAgLy8gQHNraWxsX2lkOlxuICAgIC8vIEB2YWw6XG4gICAgLy8gQHJldHVybiBcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIHNlbmQyMDYwNzpmdW5jdGlvbihza2lsbF9pZCwgdmFsKXtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnNraWxsX2lkID0gc2tpbGxfaWQ7XG4gICAgICAgIHByb3RvY2FsLnZhbCA9IHZhbDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjA2MDcsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICAvLyBkZXNjOuS9v+eUqOaKgOiDvVxuICAgIC8vIHRpbWU6MjAxOS0wMS0yNCAwNDo1NzozMlxuICAgIC8vIEBkYXRhOlxuICAgIC8vIEByZXR1cm4gXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICBoYW5kbGUyMDYwNzpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIGlmKGRhdGEuY29kZSA9PSAxKXtcbiAgICAgICAgICAgIHRoaXMub3BlbkFkdmVudHVyZVNob3RLaWxsV2luZG93KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMub3BlbkFkdmVudHVyZVVzZUhQV2luZG93KGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyAg6K+35rGC5oqA6IO95L+h5oGvLOi/memHjOWwseS4jee8k+WtmOS6hlxuICAgIHNlbmQyMDYwOTpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjA2MDksIHt9KTtcbiAgICB9LFxuXG4gICAgLy8gIOaKgOiDveS/oeaBr1xuICAgIGhhbmRsZTIwNjA5OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZihkYXRhKXtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQWR2ZW50dXJlRXZlbnQuVXBkYXRlU2tpbGxJbmZvLCBkYXRhLnNraWxsX2xpc3QpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlcXVlc3RTZWxlY3RQYXJ0bmVyOmZ1bmN0aW9uKGlkKXtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwNjEwLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIC8vICDpgInkuK3kvJnkvLTov5Tlm55cbiAgICBoYW5kbGUyMDYxMDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgLy8gLS0gbWVzc2FnZShkYXRhLm1zZylcbiAgICAgICAgaWYoZGF0YS5jb2RlID09IDEpe1xuICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVTZWxlY3RQYXJ0bmVySUQoZGF0YS5pZCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gIOiuvue9ruaAqueJqeihgOmHj1xuICAgIGhhbmRsZTIwNjI0OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFkdmVudHVyZUV2ZW50LlVwZGF0ZU1vbnN0ZXJIUCwgZGF0YS5ocF9wZXIpO1xuICAgIH0sXG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIC8vIGRlc2M6IOivt+axguS4gOWHu+W/headgOeahOS/oeaBr+WIl+ihqFxuICAgIC8vIEByZXR1cm4gXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICBzZW5kMjA2MTE6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjA2MTEsIHt9KTtcbiAgICB9LFxuICAgIFxuICAgIGhhbmRsZTIwNjExOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFkdmVudHVyZUV2ZW50LlVwZGF0ZVNob3RLaWxsSW5mbywgZGF0YS5yb29tX2xpc3QpO1xuICAgIH0sXG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIC8vIGRlc2M66K+35rGC56We56eY5ZWG5bqX5oC76KeIXG4gICAgLy8gQHJldHVybiBcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIHJlcXVlc3RTaG9wVG90YWw6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjA2MzIsIHt9KTtcbiAgICB9LFxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICAvLyBkZXNjOuelnuenmOWVhuW6l+aAu+iniFxuICAgIC8vIEBkYXRhOlxuICAgIC8vIEByZXR1cm4gXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICBoYW5kbGUyMDYzMjpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBZHZlbnR1cmVFdmVudC5VcGRhdGVTaG9wVG90YWxFdmVudCwgZGF0YS5saXN0KTtcbiAgICB9LFxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICAvLyBkZXNjOuivt+axgui0reS5sOWVhuW6l+aAu+W6l1xuICAgIC8vIEBpZDpcbiAgICAvLyBAcmV0dXJuIFxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgcmVxdWVzdEJ1eVNob3BJdGVtOmZ1bmN0aW9uKGlkKXtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwNjMzLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gZGVzYzrotK3kubDnpZ7np5jllYblupdcbiAgICAvLyBAZGF0YTpcbiAgICAvLyBAcmV0dXJuIFxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgaGFuZGxlMjA2MzM6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICBpZihkYXRhLmNvZGUgPT0gMSl7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFkdmVudHVyZUV2ZW50LlVwZGF0ZVNob3BJdGVtRXZlbnQsIGRhdGEuaWQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWuneeuseWlluWKseWxleekulxuICAgIHNlbmQyMDYzNDpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDYzNCx7fSk7XG4gICAgfSxcblxuICAgIGhhbmRsZTIwNjM0OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICB0aGlzLm1vZGVsLnNldEFkdmVudHVyZUJveFN0YXR1cyhkYXRhKTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBZHZlbnR1cmVFdmVudC5VcGRhdGVCb3hUZXNrRXZlbnQsZGF0YSk7XG4gICAgfSxcblxuICAgIC8vIOmihuWPluWuneeusVxuICAgIHNlbmQyMDYzNTpmdW5jdGlvbihpZCl7XG4gICAgICAgIHZhciBwcm90byA9IHt9O1xuICAgICAgICBwcm90by5pZCA9IGlkO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDYzNSxwcm90byk7XG4gICAgfSxcblxuICAgIGhhbmRsZTIwNjM1OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICB9LFxuXG4gICAgLy8g5omT5byA5a6d566x55WM6Z2iXG4gICAgb3BlbkFkdmVudHVyZUJveFJld2FyZFZpZXc6ZnVuY3Rpb24oc3RhdHVzLGtpbGxfbWFzdGVyKXtcbiAgICAgICAgaWYoc3RhdHVzID09IHRydWUpe1xuICAgICAgICAgICAgaWYodGhpcy5ib3hfcmV3YXJkX3dpbmRvdyA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLmJveF9yZXdhcmRfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJhZHZlbnR1cmVfYm94X3Jld2FyZF93aW5kb3dcIix0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMuYm94X3Jld2FyZF93aW5kb3cgJiYgdGhpcy5ib3hfcmV3YXJkX3dpbmRvdy5pc09wZW4oKSA9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5ib3hfcmV3YXJkX3dpbmRvdy5vcGVuKGtpbGxfbWFzdGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLmJveF9yZXdhcmRfd2luZG93KXtcbiAgICAgICAgICAgICAgICB0aGlzLmJveF9yZXdhcmRfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ib3hfcmV3YXJkX3dpbmRvdyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICAvLyBkZXNjOuiOt+W+l+aKgOiDvVxuICAgIC8vIEBkYXRhOlxuICAgIC8vIEByZXR1cm4gXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICBoYW5kbGUyMDYyNTpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBZHZlbnR1cmVFdmVudC5HZXRTa2lsbEZvckVmZmVjdEFjdGlvbixkYXRhLmlkLCBkYXRhLnNraWxsX2lkKTtcbiAgICB9LFxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICAvLyBkZXNjOuWGkumZqemHjee9rizov5nph4zpnIDopoHliKTmlq3mmK/kuI3mmK/lnKjlvZPliY3nlYzpnaIs5piv5LiN5piv5Zyo5oiY5paX5LitXG4gICAgLy8gQGRhdGE6XG4gICAgLy8gQHJldHVybiBcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIGhhbmRsZTIwNjEyOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICB2YXIgdWlfZmlnaHRfdHlwZSA9IE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRVSUZpZ2h0VHlwZSgpO1xuICAgICAgICBpZih1aV9maWdodF90eXBlID09IE1haW51aUNvbnN0LnVpX2ZpZ2h0X3R5cGUuc2t5X3NjZW5lKXtcbiAgICAgICAgICAgIHZhciBpc19pbl9maWdodCA9IEJhdHRsZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5pc0luRmlnaHQoKTtcbiAgICAgICAgICAgIGlmKGlzX2luX2ZpZ2h0KXsvL+WmguaenOaYr+WcqOaImOaWl+S4rSzliJnnrYnmiJjmlpfnu5PmnZ/kuYvlkI4s5by55Ye65o+Q56S6XG4gICAgICAgICAgICAgICAgaWYodGhpcy5iYXR0bGVfZXhpdF9ldmVudCA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXR0bGVfZXhpdF9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRXZlbnRJZC5FWElUX0ZJR0hULChmdW5jdGlvbihjb21iYXRfdHlwZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkFkdmVudHJ1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93QWR2ZW50dXJlUmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dBZHZlbnR1cmVSZXNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNob3dBZHZlbnR1cmVSZXNldDpmdW5jdGlvbigpe1xuICAgICAgICBpZih0aGlzLmJhdHRsZV9leGl0X2V2ZW50KXtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLmJhdHRsZV9leGl0X2V2ZW50KTtcbiAgICAgICAgICAgIHRoaXMuYmF0dGxlX2V4aXRfZXZlbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jaGFuZ2VNYWluVUlTdGF0dXMoTWFpbnVpQ29uc3QuYnRuX2luZGV4Lm1haW5fc2NlbmUpOyAgIFxuICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG1zZyA9IFV0aWxzLlRJMThOKFwi56We55WM5YaS6Zmp5bey6YeN572u77yM5piv5ZCm6YeN5paw6L+b5YWl77yfXCIpO1xuICAgICAgICAgICAgdmFyIENvbW1vbkFsZXJ0ID0gcmVxdWlyZShcImNvbW1vbmFsZXJ0XCIpO1xuICAgICAgICAgICAgQ29tbW9uQWxlcnQuc2hvdyhtc2csIFV0aWxzLlRJMThOKFwi56Gu5a6aXCIpLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0RW50ZXJBZHZlbnR1cmUoKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgVXRpbHMuVEkxOE4oXCLlj5bmtohcIikpXG4gICAgICAgIH0uYmluZCh0aGlzKSwgMjAwLCAxKTtcbiAgICB9LFxuXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBZHZlbnR1cmVDb250cm9sbGVyOyJdfQ==