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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/hero/hero_calculate.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, 'a43b2Qoq7pLrawGSHCNCKmH', 'hero_calculate');
// Scripts/mod/hero/hero_calculate.js
 
"use strict";
 
// var HeroController = require("hero_controller");
var HeroEvent = require("hero_event");
 
var HeroConst = require("hero_const");
 
var BackpackController = require("backpack_controller");
 
var MainuiController = require("mainui_controller");
 
var MainuiConst = require("mainui_const");
 
var HeroCalculate = cc.Class({
  "extends": BaseClass,
  ctor: function ctor() {},
  //---------------------------英雄升级升阶的红点逻辑-------------------------
  //是足够需要条件
  //@limit 限制条件
  //@ hero_vo 英雄信息
  isEnoughCondition: function isEnoughCondition(limit, hero_vo) {
    var isNeed = true;
 
    for (var limit_i in limit) {
      if (limit[limit_i][0] == "star") if (hero_vo.star < limit[limit_i][1]) {
        isNeed = false;
        break;
      }
    }
 
    return isNeed;
  },
  calculatePower: function calculatePower(attr_list) {
    var total_power = 0;
    if (!attr_list || attr_list.length === 0) return total_power;
    var key = null,
        value = null;
 
    for (var attr_i in attr_list) {
      var arrt_item = attr_list[attr_i];
 
      if (typeof arrt_item == "array") {
        key = arrt_item[0];
        value = arrt_item[1];
      } else {
        key = attr_i;
        value = arrt_item;
      }
 
      var radio = Config.attr_data.data_power[key];
 
      if (radio) {
        total_power = total_power + value * radio * 0.001;
      }
    }
 
    return Math.ceil(total_power);
  },
  // 检查所有有效英雄红点 
  checkAllHeroRedPoint: function checkAllHeroRedPoint() {
    var redpoint_data1 = this.checkHeroRedPointByRedPointType(HeroConst.RedPointType.eRPLevelUp, true);
    var redpoint_data2 = this.checkHeroRedPointByRedPointType(HeroConst.RedPointType.eRPEquip, true);
    var redpoint_data3 = this.checkHeroRedPointByRedPointType(HeroConst.RedPointType.eRPStar, true);
    var redpoint_data4 = this.checkHeroRedPointByRedPointType(HeroConst.RedPointType.eRPTalent, true); // 策划要求 天赋不算如主界面红点 但是算入英雄背包红点
 
    var data = [redpoint_data1, redpoint_data2, redpoint_data3]; // , redpoint_data4
 
    MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.partner, data);
    var data = [redpoint_data1, redpoint_data2, redpoint_data3];
    gcore.GlobalEvent.fire(HeroEvent.All_Hero_RedPoint_Event, data);
  },
  //检查单个英雄的红点信息
  checkSingleHeroRedPoint: function checkSingleHeroRedPoint(hero_vo) {
    var is_redpoint = false; //升级 升阶红点
 
    is_redpoint = this.checkSingleHeroLevelUpRedPoint(hero_vo);
    if (is_redpoint) return true; //装备红点
 
    is_redpoint = this.checkSingleHeroEquipRedPoint(hero_vo);
    if (is_redpoint) return true; //升星红点
 
    is_redpoint = this.checkSingleHeroUpgradeStarRedPoint(hero_vo);
    if (is_redpoint) return true; //天赋红点
 
    is_redpoint = this.checkSingleHeroTalentSkillRedPoint(hero_vo);
    return is_redpoint;
  },
  // 计算升星红点红点根据升星表
  // @is_ignore_master_card 是否忽视主卡(6星以上的升星逻辑)
  // @partner_id 忽视主卡的 唯一id
  checkSingleStarFuseRedPointByStarConfig: function checkSingleStarFuseRedPointByStarConfig(star_config, is_ignore_master_card, partner_id) {
    if (!star_config) return false;
    var hero_item_data_list = {};
    var index = 1;
    var expend = star_config.expend1[0]; // 特定条件数据 结构 dic_the_conditions[bid][星级] = 数量
 
    var dic_the_conditions = {}; // 随机条件 dic_random_conditions[阵营][星级] = 数量
 
    var dic_random_conditions = {}; // 标志已用
 
    var dic_hero_id = {};
    var need_count = 0;
 
    if (!is_ignore_master_card) {
      if (expend) {
        // 指定的 {10402,4,1} : 10402: 表示bid, 4: 表示星级 1:表示数量
        var bid = expend[0];
        var star = expend[1];
        var count = expend[2];
        dic_the_conditions[bid] = {};
        dic_the_conditions[bid][star] = count;
        need_count = need_count + count;
      }
 
      index = index + 1;
    } else {
      dic_hero_id[partner_id] = 1;
    }
 
    for (var expend_i = 0; expend_i < star_config.expend2.length; ++expend_i) {
      // 指定的 {10402,4,1} : 10402: 表示bid, 4: 表示星级 1:表示数量
      var expend = star_config.expend2[expend_i];
      var bid = expend[0];
      var star = expend[1];
      var count = expend[2];
      if (!dic_the_conditions[bid]) dic_the_conditions[bid] = {};
 
      if (!dic_the_conditions[bid][star]) {
        dic_the_conditions[bid][star] = count;
      } else {
        dic_the_conditions[bid][star] = dic_the_conditions[bid][star] + count;
      }
 
      need_count = need_count + count;
      index = index + 1;
    } // 4是和策划说好了最多4个
 
 
    if (index <= 4) {
      // 随机的 {1,4,2} : 1 表示阵营  4: 表示星级 2表示数量
      for (var expend_i = 0; expend_i < star_config.expend3.length; ++expend_i) {
        var expend = star_config.expend3[expend_i];
        var camp = expend[0];
        var star = expend[1];
        var count = expend[2];
        if (!dic_random_conditions[camp]) dic_random_conditions[camp] = {};
 
        if (!dic_random_conditions[camp][star]) {
          dic_random_conditions[camp][star] = count;
        } else {
          dic_random_conditions[camp][star] = dic_random_conditions[camp][star] + count;
        }
 
        need_count = need_count + count;
        index = index + 1;
        if (index > 4) break;
      }
    } // 获取列表
 
 
    var HeroController = require("hero_controller");
 
    var model = HeroController.getInstance().getModel();
    var total_count = model.getHeroListByMatchInfo(dic_the_conditions, dic_random_conditions, dic_hero_id);
    var is_redpoint = total_count >= need_count;
    var result = {
      is_redpoint: is_redpoint,
      need_count: need_count,
      total_count: total_count
    };
    return result;
  },
  //检测符文类型的红点
  //@equip_vo 符文对象..如果为空说明没有符文
  checkSingleArtifactRedPoint: function checkSingleArtifactRedPoint(equip_vo) {
    var backpack_model = require("backpack_controller").getInstance().getModel();
 
    var BackPackConst = require("backpack_const");
 
    var equip_score_list = backpack_model.getAllEquipListByType(BackPackConst.item_type.ARTIFACTCHIPS);
 
    if (equip_vo == null) {
      if (equip_score_list && Utils.equip_score_list) {
        return true;
      }
    }
 
    return false;
  },
  // 根据红点类型 清空红点记录 
  // @red_point_type 参考 HeroConst.RedPointType
  // @is_delay 是否延迟检测
  clearAllHeroRecordByRedPointType: function clearAllHeroRecordByRedPointType(red_point_type, is_delay) {
    // 马上清除
    var HeroController = require("hero_controller");
 
    var model = HeroController.getInstance().getModel();
    var hero_list = model.getHeroList();
 
    for (var hero_i in hero_list) {
      hero_list[hero_i].red_point[red_point_type] = null;
    }
 
    this.checkHeroRedPointByRedPointType(red_point_type);
 
    if (red_point_type == HeroConst.RedPointType.eRPLevelUp || red_point_type == HeroConst.RedPointType.eRPTalent) {
      // --目前升级 和 天赋 用到延迟
      model.is_delay_redpoint_update[red_point_type] = false;
    }
  },
  // 根据红点类型 清检测红点记录 
  // @red_point_type 参考 HeroConst.RedPointType
  // @ 是否只是返回 红点数据就好
  checkHeroRedPointByRedPointType: function checkHeroRedPointByRedPointType(red_point_type, is_return) {
    var HeroController = require("hero_controller");
 
    var hero_list = HeroController.getInstance().getModel().getHeroList();
    var redpoint_data = {};
    redpoint_data.bid = red_point_type;
    redpoint_data.status = false;
 
    for (var hero_i in hero_list) {
      var hero_vo = hero_list[hero_i];
 
      if (this.isCheckHeroRedPointByHeroVo(hero_vo)) {
        //等级
        if (red_point_type == HeroConst.RedPointType.eRPLevelUp) {
          redpoint_data.status = this.checkSingleHeroLevelUpRedPoint(hero_vo);
          if (redpoint_data.status) break;
        } else if (red_point_type == HeroConst.RedPointType.eRPEquip) {
          //装备
          redpoint_data.status = this.checkSingleHeroEquipRedPoint(hero_vo);
          if (redpoint_data.status) break;
        } else if (red_point_type == HeroConst.RedPointType.eRPStar) {
          //升星
          redpoint_data.status = this.checkSingleHeroUpgradeStarRedPoint(hero_vo);
          if (redpoint_data.status) break;
        } else if (red_point_type == HeroConst.RedPointType.eRPTalent) {
          //天赋
          redpoint_data.status = this.checkSingleHeroTalentSkillRedPoint(hero_vo);
          if (redpoint_data.status) break;
        }
      }
    }
 
    if (is_return) {
      return redpoint_data;
    } else {
      // if red_point_type ~= HeroConst.RedPointType.eRPTalent then --天赋
      //     // 策划要求 天赋不算如主界面红点 但是算入英雄背包红点
      //     MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.partner,{redpoint_data})
      // end
      MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.partner, [redpoint_data]);
      gcore.GlobalEvent.fire(HeroEvent.All_Hero_RedPoint_Event, [redpoint_data]); // GlobalEvent.getInstance().Fire(HeroEvent.All_Hero_RedPoint_Event, {redpoint_data})
    }
  },
  //是否需要检测红点
  isCheckHeroRedPointByHeroVo: function isCheckHeroRedPointByHeroVo(hero_vo) {
    //  3 以后走配置表 
    // 等于 > 3级 和 上阵的英雄需要检查红点 注意: hero_vo.lev > 3 暂时不要
    // hero_vo.is_in_form < 10 因为 is_in_form.改成 布阵类型 *10 + 序号了
    if (!hero_vo) return;
    if (hero_vo.isFormDrama()) return true;
    return false;
  },
  // 检查单个英雄升级红点 及进阶红点
  checkSingleHeroLevelUpRedPoint: function checkSingleHeroLevelUpRedPoint(hero_vo) {
    if (!hero_vo) return false; // if (hero_vo.red_point && typeof hero_vo.red_point[HeroConst.RedPointType.eRPLevelUp] != "boolean") {
    //     return hero_vo.red_point[HeroConst.RedPointType.eRPLevelUp] == true;
    // }
 
    if (hero_vo.red_point && hero_vo.red_point[HeroConst.RedPointType.eRPLevelUp] != null) {
      return hero_vo.red_point[HeroConst.RedPointType.eRPLevelUp] == true;
    }
 
    var status = this.getHeroShowLevelStatus(hero_vo);
    var is_redpoint = false;
 
    if (status == 1) {
      //升级
      var lev_config = Config.partner_data.data_partner_lev[hero_vo.lev];
 
      if (lev_config) {
        var up_cost = lev_config.expend || [];
        var lev_redpoint = true;
 
        for (var cost_i = 0; cost_i < up_cost.length; ++cost_i) {
          var cost = up_cost[cost_i];
          var count = BackpackController.getInstance().getModel().getItemNumByBid(cost[0]);
 
          if (count < cost[1]) {
            lev_redpoint = false;
          }
        }
 
        is_redpoint = lev_redpoint;
      }
    } else if (status == 2) {
      // 升阶
      var key = Utils.getNorKey(hero_vo.type, hero_vo.break_id, hero_vo.break_lev);
      var break_config = Config.partner_data.data_partner_brach[key];
 
      if (break_config) {
        var cost_list = break_config.expend || [];
        var break_redpoint = true;
 
        for (var cost_i = 0; cost_i < cost_list.length; ++cost_i) {
          var cost = cost_list[cost_i];
          var count = BackpackController.getInstance().getModel().getItemNumByBid(cost[0]);
          if (count < cost[1]) break_redpoint = false;
        }
 
        is_redpoint = break_redpoint;
      }
    }
 
    if (hero_vo.red_point) {
      hero_vo.red_point[HeroConst.RedPointType.eRPLevelUp] = is_redpoint;
    }
 
    return is_redpoint;
  },
  // 检查单个英雄装备红点
  checkSingleHeroEquipRedPoint: function checkSingleHeroEquipRedPoint(hero_vo) {
    if (!hero_vo) return false;
 
    if (typeof hero_vo.red_point[HeroConst.RedPointType.eRPEquip] == "boolean") {
      return hero_vo.red_point[HeroConst.RedPointType.eRPEquip] == true;
    }
 
    var is_redpoint = false;
 
    var HeroController = require("hero_controller");
 
    var model = HeroController.getInstance().getModel(); // 装备
 
    var equip_list = model.getHeroEquipList(hero_vo.partner_id);
    var equip_type_list = HeroConst.EquipPosList || {};
 
    for (var equip_type_i in equip_type_list) {
      is_redpoint = this.checkSingleHeroEachPosEquipRedPoint(equip_type_list[equip_type_i], equip_list[equip_type_i]);
      if (is_redpoint) break;
    }
 
    hero_vo.red_point[HeroConst.RedPointType.eRPEquip] = is_redpoint;
    return is_redpoint;
  },
  // 检测装备类型的红点
  // @equip_type 装备类型
  // @equip_vo 装备对象..如果为空说明没有装备
  checkSingleHeroEachPosEquipRedPoint: function checkSingleHeroEachPosEquipRedPoint(equip_type, equip_vo) {
    var equip_type = equip_type || 1;
    var backpack_model = BackpackController.getInstance().getModel();
    var equip_score_list = backpack_model.getAllEquipListByType(equip_type);
 
    if (!equip_vo) {
      // 没有装备..判断是否有对应类型的装备
      if (equip_score_list && Utils.next(equip_score_list)) {
        // 有红点
        return true;
      }
    } else {
      // 如果没有分数..算一个 ..
      if (!equip_vo.all_score || equip_vo.all_score == 0) {
        equip_vo.setEnchantScore(0);
      }
 
      var score = equip_vo.all_score || 0;
 
      if (equip_score_list) {
        // 要判断当前装备比背包的装备评分底才显示红点
        for (var equip_i in equip_score_list) {
          var equip_item = equip_score_list[equip_i];
 
          if (equip_item && equip_item.all_score && equip_item.all_score > score) {
            return true;
          }
        }
      }
    }
 
    return false;
  },
  // 检查单个英雄升星红点 
  checkSingleHeroUpgradeStarRedPoint: function checkSingleHeroUpgradeStarRedPoint(hero_vo) {
    if (!hero_vo) return false; // if (typeof hero_vo.red_point[HeroConst.RedPointType.eRPStar] == "boolean") {
    //     return hero_vo.red_point[HeroConst.RedPointType.eRPStar] == true;
    // }
 
    var star = hero_vo.star || 1;
    var next_key = Utils.getNorKey(hero_vo.bid, star + 1);
    var next_star_config = gdata("partner_data", "data_partner_star", next_key);
 
    if (!next_star_config) {
      // 说明满星了
      hero_vo.red_point[HeroConst.RedPointType.eRPStar] = false;
      return false;
    }
 
    var star_config = next_star_config;
    var is_redpoint = false;
 
    var HeroController = require("hero_controller");
 
    var model = HeroController.getInstance().getModel();
 
    if (star == model.hero_info_upgrade_star_param2) {
      // 10级升11有世界等级要求
      is_redpoint = model.checkOpenStar11();
    } else {
      is_redpoint = true;
    }
 
    if (is_redpoint) {
      if (star_config) {
        var star_result = this.checkSingleStarFuseRedPointByStarConfig(star_config, true, hero_vo.partner_id);
        is_redpoint = star_result.is_redpoint; // 计算消耗    
 
        if (is_redpoint && star_config.other_expend.length > 0) {
          var count = BackpackController.getInstance().getModel().getItemNumByBid(star_config.other_expend[0][0]);
          if (count < star_config.other_expend[0][1]) is_redpoint = false;
        }
      } else {
        is_redpoint = false;
      }
    }
 
    hero_vo.red_point[HeroConst.RedPointType.eRPStar] = is_redpoint;
    return is_redpoint;
  },
  // 检查单个天赋技能红点
  checkSingleHeroTalentSkillRedPoint: function checkSingleHeroTalentSkillRedPoint(hero_vo) {
    cc.log("checkSingleHeroTalentSkillRedPoint");
    if (!hero_vo) return false; // --首次升级到6星记录
 
    if (hero_vo.is_open_talent == true) {
      return true;
    }
 
    if (hero_vo.red_point[HeroConst.RedPointType.eRPTalent] != null) {
      return hero_vo.red_point[HeroConst.RedPointType.eRPTalent] == true;
    }
 
    if (!hero_vo.ishaveTalentData()) return false;
    var is_redpoint = false;
 
    var HeroController = require("hero_controller");
 
    var dic_hero_talent_skill_learn_redpoint = HeroController.getInstance().getModel().getTalentRedpointRecord();
    var dic_skill_id = {};
 
    for (var pos in hero_vo.talent_skill_list) {
      var id = hero_vo.talent_skill_list[pos];
      dic_skill_id[id] = pos;
    }
 
    for (var i in Config.partner_skill_data.data_partner_skill_pos) {
      var v = Config.partner_skill_data.data_partner_skill_pos[i];
 
      if (hero_vo.talent_skill_list[v.pos]) {
        // --已装备技能 只需判断能否升级
        is_redpoint = this.checkSingleTalentSkillLevel(hero_vo.talent_skill_list[v.pos]);
 
        if (is_redpoint) {
          break;
        }
      } else {
        // --未装备 先判断是否解锁位置 
        var is_lock = false;
 
        if (v.pos_limit[0] == 'star') {
          is_lock = hero_vo.star >= v.pos_limit[1];
        }
 
        if (is_lock) {
          for (var _id in dic_hero_talent_skill_learn_redpoint) {
            if (dic_skill_id[_id] == null) {
              is_redpoint = true;
              break;
            }
          }
 
          if (is_redpoint) {
            break;
          }
        }
      }
    }
 
    hero_vo.red_point[HeroConst.RedPointType.eRPTalent] = is_redpoint;
    return is_redpoint;
  },
  // --判断天赋技能能否升级 @skill_id 技能id
  checkSingleTalentSkillLevel: function checkSingleTalentSkillLevel(skill_id) {
    var config = Config.partner_skill_data.data_partner_skill_level[skill_id];
 
    if (config) {
      var is_enough = true;
 
      for (var i = 0; i < config.expend.length; ++i) {
        var cost = config.expend[i];
        var have_num = BackpackController.getInstance().getModel().getItemNumByBid(cost[0]);
 
        if (have_num < cost[1]) {
          is_enough = false;
          break;
        }
      }
 
      return is_enough;
    }
 
    return false;
  },
  // 获取等级显示状态 
  // @ return 0:表示满级  1: 表示可以升级 : 2:表示可以进阶  -1 表示出错了
  getHeroShowLevelStatus: function getHeroShowLevelStatus(hero_vo) {
    var key = hero_vo.type + "_" + hero_vo.break_id + "_" + hero_vo.break_lev;
    var break_config = Config.partner_data.data_partner_brach[key];
    if (!break_config) return -1;
    var next_key = hero_vo.type + "_" + hero_vo.break_id + "_" + (hero_vo.break_lev + 1);
    var next_break_config = Config.partner_data.data_partner_brach[next_key];
    var lev_max = break_config.lev_max;
    var status = 0;
 
    if (!next_break_config) {
      var key = hero_vo.bid + "_" + hero_vo.star;
      var star_config = gdata("partner_data", "data_partner_star", key);
 
      if (star_config && lev_max < star_config.lev_max) {
        lev_max = star_config.lev_max;
      }
 
      if (hero_vo.lev >= lev_max) {
        //  都满了  满级状态
        status = 0;
      } else {
        // 等级不足 需要升级
        status = 1;
      }
    } else {
      if (next_break_config.limit && next_break_config.limit.length > 0) {
        if (hero_vo.lev >= break_config.lev_max) {
          // 进阶有要求 需要升星
          var is_enough = this.isEnoughCondition(next_break_config.limit, hero_vo);
 
          if (is_enough) {
            // 可以进阶了
            status = 2;
          } else {
            // 不满足条件.显示满级状态
            status = 0;
          }
        } else {
          status = 1;
        }
      } else {
        // 没有限制
        if (hero_vo.lev >= break_config.lev_max) {
          // 可以进阶了
          status = 2;
        } else {
          // 等级不足 需要升级
          status = 1;
        }
      }
    }
 
    return status;
  },
 
  /***************************计算祭坛的红点信息*******************************/
  // 消除融合红点
  clearAllStarFuseRedpointRecord: function clearAllStarFuseRedpointRecord() {
    var HeroController = require("hero_controller");
 
    var dic_fuse_info = HeroController.getInstance().getModel().getStarFuseList();
    if (!dic_fuse_info) return false; // 0表示全部英雄 
    // var camp_fuse_info = dic_fuse_info[0]
 
    for (var data_i in dic_fuse_info) {
      var fuse_data = dic_fuse_info[data_i];
      fuse_data.cur_redpoint = null;
    } // 计算主界面熔炼祭坛的红点
    // this.checkAllStarFuseRedpoint();
 
 
    RedMgr.getInstance().addCalHandler(this.checkAllStarFuseRedpoint.bind(this), RedIds.RefuseHero);
  },
  // 计算熔炼红点
  checkAllStarFuseRedpoint: function checkAllStarFuseRedpoint() {
    var HeroController = require("hero_controller");
 
    var dic_fuse_info = HeroController.getInstance().getModel().getStarFuseList();
    if (!dic_fuse_info) return false; // 0表示全部英雄 
    // var camp_fuse_info = dic_fuse_info[0];
 
    var is_redpoint = this.checkCampStarFuseRedpoint(dic_fuse_info);
 
    var MainSceneController = require("mainscene_controller");
 
    var SceneConst = require("scene_const");
 
    MainSceneController.getInstance().setBuildRedStatus(SceneConst.CenterSceneBuild.fuse, is_redpoint);
    return is_redpoint;
  },
  //计算熔炼祭坛各阵营红点
  checkCampStarFuseRedpoint: function checkCampStarFuseRedpoint(camp_fuse_info) {
    if (!camp_fuse_info) return false;
    var is_all_redpoint = false;
    var is_redpoint = false;
 
    for (var data_i in camp_fuse_info) {
      var fuse_data = camp_fuse_info[data_i];
      is_redpoint = this.checkSingleStarFuseRedPoint(fuse_data);
      if (!is_all_redpoint && is_redpoint) is_all_redpoint = true;
    }
 
    return is_all_redpoint;
  },
  // 计算单个英雄数据红点 
  checkSingleStarFuseRedPoint: function checkSingleStarFuseRedPoint(fuse_data) {
    //cur_redpoint == nil 就是没有计算过红点的
    if (fuse_data.cur_redpoint) return fuse_data.cur_redpoint == 1;
    if (!fuse_data.star_config) return; // var is_redpoint, need_count, total_count 
 
    var result = this.checkSingleStarFuseRedPointByStarConfig(fuse_data.star_config);
 
    if (result.is_redpoint) {
      // 有红点 类型 1  因为融合祭坛那边排序问题 这样定义 
      result.cur_redpoint = 1;
      fuse_data.cur_redpoint = 1;
    } else {
      // 没有红点 类型 2
      result.cur_redpoint = 2;
      fuse_data.cur_redpoint = 2;
    }
 
    fuse_data.need_count = result.need_count || 0;
    fuse_data.total_count = result.total_count || 0;
    return result.is_redpoint;
  }
}); // 实例化单利
 
HeroCalculate.getInstance = function () {
  if (!this.instance) {
    this.instance = new this();
  }
 
  return this.instance;
};
 
module.exports = HeroCalculate;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvXFxoZXJvX2NhbGN1bGF0ZS5qcyJdLCJuYW1lcyI6WyJIZXJvRXZlbnQiLCJyZXF1aXJlIiwiSGVyb0NvbnN0IiwiQmFja3BhY2tDb250cm9sbGVyIiwiTWFpbnVpQ29udHJvbGxlciIsIk1haW51aUNvbnN0IiwiSGVyb0NhbGN1bGF0ZSIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJjdG9yIiwiaXNFbm91Z2hDb25kaXRpb24iLCJsaW1pdCIsImhlcm9fdm8iLCJpc05lZWQiLCJsaW1pdF9pIiwic3RhciIsImNhbGN1bGF0ZVBvd2VyIiwiYXR0cl9saXN0IiwidG90YWxfcG93ZXIiLCJsZW5ndGgiLCJrZXkiLCJ2YWx1ZSIsImF0dHJfaSIsImFycnRfaXRlbSIsInJhZGlvIiwiQ29uZmlnIiwiYXR0cl9kYXRhIiwiZGF0YV9wb3dlciIsIk1hdGgiLCJjZWlsIiwiY2hlY2tBbGxIZXJvUmVkUG9pbnQiLCJyZWRwb2ludF9kYXRhMSIsImNoZWNrSGVyb1JlZFBvaW50QnlSZWRQb2ludFR5cGUiLCJSZWRQb2ludFR5cGUiLCJlUlBMZXZlbFVwIiwicmVkcG9pbnRfZGF0YTIiLCJlUlBFcXVpcCIsInJlZHBvaW50X2RhdGEzIiwiZVJQU3RhciIsInJlZHBvaW50X2RhdGE0IiwiZVJQVGFsZW50IiwiZGF0YSIsImdldEluc3RhbmNlIiwic2V0QnRuUmVkUG9pbnQiLCJidG5faW5kZXgiLCJwYXJ0bmVyIiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImZpcmUiLCJBbGxfSGVyb19SZWRQb2ludF9FdmVudCIsImNoZWNrU2luZ2xlSGVyb1JlZFBvaW50IiwiaXNfcmVkcG9pbnQiLCJjaGVja1NpbmdsZUhlcm9MZXZlbFVwUmVkUG9pbnQiLCJjaGVja1NpbmdsZUhlcm9FcXVpcFJlZFBvaW50IiwiY2hlY2tTaW5nbGVIZXJvVXBncmFkZVN0YXJSZWRQb2ludCIsImNoZWNrU2luZ2xlSGVyb1RhbGVudFNraWxsUmVkUG9pbnQiLCJjaGVja1NpbmdsZVN0YXJGdXNlUmVkUG9pbnRCeVN0YXJDb25maWciLCJzdGFyX2NvbmZpZyIsImlzX2lnbm9yZV9tYXN0ZXJfY2FyZCIsInBhcnRuZXJfaWQiLCJoZXJvX2l0ZW1fZGF0YV9saXN0IiwiaW5kZXgiLCJleHBlbmQiLCJleHBlbmQxIiwiZGljX3RoZV9jb25kaXRpb25zIiwiZGljX3JhbmRvbV9jb25kaXRpb25zIiwiZGljX2hlcm9faWQiLCJuZWVkX2NvdW50IiwiYmlkIiwiY291bnQiLCJleHBlbmRfaSIsImV4cGVuZDIiLCJleHBlbmQzIiwiY2FtcCIsIkhlcm9Db250cm9sbGVyIiwibW9kZWwiLCJnZXRNb2RlbCIsInRvdGFsX2NvdW50IiwiZ2V0SGVyb0xpc3RCeU1hdGNoSW5mbyIsInJlc3VsdCIsImNoZWNrU2luZ2xlQXJ0aWZhY3RSZWRQb2ludCIsImVxdWlwX3ZvIiwiYmFja3BhY2tfbW9kZWwiLCJCYWNrUGFja0NvbnN0IiwiZXF1aXBfc2NvcmVfbGlzdCIsImdldEFsbEVxdWlwTGlzdEJ5VHlwZSIsIml0ZW1fdHlwZSIsIkFSVElGQUNUQ0hJUFMiLCJVdGlscyIsImNsZWFyQWxsSGVyb1JlY29yZEJ5UmVkUG9pbnRUeXBlIiwicmVkX3BvaW50X3R5cGUiLCJpc19kZWxheSIsImhlcm9fbGlzdCIsImdldEhlcm9MaXN0IiwiaGVyb19pIiwicmVkX3BvaW50IiwiaXNfZGVsYXlfcmVkcG9pbnRfdXBkYXRlIiwiaXNfcmV0dXJuIiwicmVkcG9pbnRfZGF0YSIsInN0YXR1cyIsImlzQ2hlY2tIZXJvUmVkUG9pbnRCeUhlcm9WbyIsImlzRm9ybURyYW1hIiwiZ2V0SGVyb1Nob3dMZXZlbFN0YXR1cyIsImxldl9jb25maWciLCJwYXJ0bmVyX2RhdGEiLCJkYXRhX3BhcnRuZXJfbGV2IiwibGV2IiwidXBfY29zdCIsImxldl9yZWRwb2ludCIsImNvc3RfaSIsImNvc3QiLCJnZXRJdGVtTnVtQnlCaWQiLCJnZXROb3JLZXkiLCJ0eXBlIiwiYnJlYWtfaWQiLCJicmVha19sZXYiLCJicmVha19jb25maWciLCJkYXRhX3BhcnRuZXJfYnJhY2giLCJjb3N0X2xpc3QiLCJicmVha19yZWRwb2ludCIsImVxdWlwX2xpc3QiLCJnZXRIZXJvRXF1aXBMaXN0IiwiZXF1aXBfdHlwZV9saXN0IiwiRXF1aXBQb3NMaXN0IiwiZXF1aXBfdHlwZV9pIiwiY2hlY2tTaW5nbGVIZXJvRWFjaFBvc0VxdWlwUmVkUG9pbnQiLCJlcXVpcF90eXBlIiwibmV4dCIsImFsbF9zY29yZSIsInNldEVuY2hhbnRTY29yZSIsInNjb3JlIiwiZXF1aXBfaSIsImVxdWlwX2l0ZW0iLCJuZXh0X2tleSIsIm5leHRfc3Rhcl9jb25maWciLCJnZGF0YSIsImhlcm9faW5mb191cGdyYWRlX3N0YXJfcGFyYW0yIiwiY2hlY2tPcGVuU3RhcjExIiwic3Rhcl9yZXN1bHQiLCJvdGhlcl9leHBlbmQiLCJsb2ciLCJpc19vcGVuX3RhbGVudCIsImlzaGF2ZVRhbGVudERhdGEiLCJkaWNfaGVyb190YWxlbnRfc2tpbGxfbGVhcm5fcmVkcG9pbnQiLCJnZXRUYWxlbnRSZWRwb2ludFJlY29yZCIsImRpY19za2lsbF9pZCIsInBvcyIsInRhbGVudF9za2lsbF9saXN0IiwiaWQiLCJpIiwicGFydG5lcl9za2lsbF9kYXRhIiwiZGF0YV9wYXJ0bmVyX3NraWxsX3BvcyIsInYiLCJjaGVja1NpbmdsZVRhbGVudFNraWxsTGV2ZWwiLCJpc19sb2NrIiwicG9zX2xpbWl0Iiwic2tpbGxfaWQiLCJjb25maWciLCJkYXRhX3BhcnRuZXJfc2tpbGxfbGV2ZWwiLCJpc19lbm91Z2giLCJoYXZlX251bSIsIm5leHRfYnJlYWtfY29uZmlnIiwibGV2X21heCIsImNsZWFyQWxsU3RhckZ1c2VSZWRwb2ludFJlY29yZCIsImRpY19mdXNlX2luZm8iLCJnZXRTdGFyRnVzZUxpc3QiLCJkYXRhX2kiLCJmdXNlX2RhdGEiLCJjdXJfcmVkcG9pbnQiLCJSZWRNZ3IiLCJhZGRDYWxIYW5kbGVyIiwiY2hlY2tBbGxTdGFyRnVzZVJlZHBvaW50IiwiYmluZCIsIlJlZElkcyIsIlJlZnVzZUhlcm8iLCJjaGVja0NhbXBTdGFyRnVzZVJlZHBvaW50IiwiTWFpblNjZW5lQ29udHJvbGxlciIsIlNjZW5lQ29uc3QiLCJzZXRCdWlsZFJlZFN0YXR1cyIsIkNlbnRlclNjZW5lQnVpbGQiLCJmdXNlIiwiY2FtcF9mdXNlX2luZm8iLCJpc19hbGxfcmVkcG9pbnQiLCJjaGVja1NpbmdsZVN0YXJGdXNlUmVkUG9pbnQiLCJpbnN0YW5jZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQSxJQUFJQSxTQUFTLEdBQVlDLE9BQU8sQ0FBQyxZQUFELENBQWhDOztBQUNBLElBQUlDLFNBQVMsR0FBWUQsT0FBTyxDQUFDLFlBQUQsQ0FBaEM7O0FBQ0EsSUFBSUUsa0JBQWtCLEdBQUdGLE9BQU8sQ0FBQyxxQkFBRCxDQUFoQzs7QUFDQSxJQUFJRyxnQkFBZ0IsR0FBS0gsT0FBTyxDQUFDLG1CQUFELENBQWhDOztBQUNBLElBQUlJLFdBQVcsR0FBVUosT0FBTyxDQUFDLGNBQUQsQ0FBaEM7O0FBRUEsSUFBSUssYUFBYSxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUM1QixhQUFTQyxTQURtQjtBQUc1QkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFXLENBRWhCLENBTDJCO0FBTzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0FDLEVBQUFBLGlCQUFpQixFQUFFLDJCQUFTQyxLQUFULEVBQWdCQyxPQUFoQixFQUF5QjtBQUN4QyxRQUFJQyxNQUFNLEdBQUcsSUFBYjs7QUFDQSxTQUFLLElBQUlDLE9BQVQsSUFBb0JILEtBQXBCLEVBQTJCO0FBQ3ZCLFVBQUlBLEtBQUssQ0FBQ0csT0FBRCxDQUFMLENBQWUsQ0FBZixLQUFxQixNQUF6QixFQUNJLElBQUlGLE9BQU8sQ0FBQ0csSUFBUixHQUFlSixLQUFLLENBQUNHLE9BQUQsQ0FBTCxDQUFlLENBQWYsQ0FBbkIsRUFBc0M7QUFDbENELFFBQUFBLE1BQU0sR0FBRyxLQUFUO0FB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LEdBQXdCRSxNQUFNLENBQUNGLFdBQVAsSUFBc0IsQ0FBOUM7QUFFQSxXQUFPRSxNQUFNLENBQUM1QixXQUFkO0FBQ0g7QUExbUIyQixDQUFULENBQXBCLEVBK21CQTs7QUFDQTlDLGFBQWEsQ0FBQ3FDLFdBQWQsR0FBNEIsWUFBVztBQUNuQyxNQUFJLENBQUMsS0FBSzhJLFFBQVYsRUFBb0I7QUFDaEIsU0FBS0EsUUFBTCxHQUFnQixJQUFJLElBQUosRUFBaEI7QUFDSDs7QUFDRCxTQUFPLEtBQUtBLFFBQVo7QUFDSCxDQUxEOztBQVFBQyxNQUFNLENBQUNDLE9BQVAsR0FBaUJyTCxhQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdmFyIEhlcm9Db250cm9sbGVyID0gcmVxdWlyZShcImhlcm9fY29udHJvbGxlclwiKTtcclxudmFyIEhlcm9FdmVudCAgICAgICAgICA9IHJlcXVpcmUoXCJoZXJvX2V2ZW50XCIpO1xyXG52YXIgSGVyb0NvbnN0ICAgICAgICAgID0gcmVxdWlyZShcImhlcm9fY29uc3RcIik7XHJcbnZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcclxudmFyIE1haW51aUNvbnRyb2xsZXIgICA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKVxyXG52YXIgTWFpbnVpQ29uc3QgICAgICAgID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKTtcclxuXHJcbnZhciBIZXJvQ2FsY3VsYXRlID0gY2MuQ2xhc3Moe1xyXG5cdGV4dGVuZHM6IEJhc2VDbGFzcyxcclxuXHJcblx0Y3RvcjogZnVuY3Rpb24oKSB7XHJcblx0XHRcclxuXHR9LFxyXG5cclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLeiLsembhOWNh+e6p+WNh+mYtueahOe6oueCuemAu+i+kS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvL+aYr+i2s+Wkn+mcgOimgeadoeS7tlxyXG5cdC8vQGxpbWl0IOmZkOWItuadoeS7tlxyXG5cdC8vQCBoZXJvX3ZvIOiLsembhOS/oeaBr1xyXG5cdGlzRW5vdWdoQ29uZGl0aW9uOiBmdW5jdGlvbihsaW1pdCwgaGVyb192bykge1xyXG5cdCAgICB2YXIgaXNOZWVkID0gdHJ1ZTtcclxuXHQgICAgZm9yICh2YXIgbGltaXRfaSBpbiBsaW1pdCkge1xyXG5cdCAgICAgICAgaWYgKGxpbWl0W2xpbWl0X2ldWzBdID09IFwic3RhclwiKVxyXG5cdCAgICAgICAgICAgIGlmIChoZXJvX3ZvLnN0YXIgPCBsaW1pdFtsaW1pdF9pXVsxXSkge1xyXG5cdCAgICAgICAgICAgICAgICBpc05lZWQgPSBmYWxzZTtcclxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XHJcblx0ICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblx0ICAgIHJldHVybiBpc05lZWQ7XHJcblx0fSxcclxuXHJcblx0Y2FsY3VsYXRlUG93ZXI6IGZ1bmN0aW9uKGF0dHJfbGlzdCkge1xyXG5cdCAgICB2YXIgdG90YWxfcG93ZXIgPSAwO1xyXG5cdCAgICBpZiAoIWF0dHJfbGlzdCB8fCBhdHRyX2xpc3QubGVuZ3RoID09PSAwKSBcclxuXHQgICAgICAgIHJldHVybiB0b3RhbF9wb3dlclxyXG5cdCAgICBcclxuXHQgICAgdmFyIGtleSA9IG51bGwsIHZhbHVlID0gbnVsbDtcclxuXHQgICAgZm9yICh2YXIgYXR0cl9pIGluIGF0dHJfbGlzdCkge1xyXG5cdCAgICBcdHZhciBhcnJ0X2l0ZW0gPSBhdHRyX2xpc3RbYXR0cl9pXTtcclxuXHQgICAgXHRpZiAodHlwZW9mIGFycnRfaXRlbSA9PSBcImFycmF5XCIpIHtcclxuXHQgICAgXHRcdGtleSA9IGFycnRfaXRlbVswXTtcclxuXHQgICAgXHRcdHZhbHVlID0gYXJydF9pdGVtWzFdO1xyXG5cdCAgICBcdH0gZWxzZSB7XHJcblx0ICAgIFx0XHRrZXkgPSBhdHRyX2k7XHJcblx0ICAgIFx0XHR2YWx1ZSA9IGFycnRfaXRlbTtcclxuXHQgICAgXHR9XHJcblx0ICAgIFx0dmFyIHJhZGlvID0gQ29uZmlnLmF0dHJfZGF0YS5kYXRhX3Bvd2VyW2tleV07XHJcblx0ICAgIFx0aWYgKHJhZGlvKSB7XHJcblx0ICAgICAgICAgICAgdG90YWxfcG93ZXIgPSB0b3RhbF9wb3dlciArIHZhbHVlICogcmFkaW8gKiAwLjAwMTtcclxuXHQgICAgXHR9XHJcblx0ICAgIH1cclxuXHJcblx0ICAgIHJldHVybiBNYXRoLmNlaWwodG90YWxfcG93ZXIpO1xyXG5cdH0sXHJcblxyXG5cclxuXHQvLyDmo4Dmn6XmiYDmnInmnInmlYjoi7Hpm4TnuqLngrkgXHJcblx0Y2hlY2tBbGxIZXJvUmVkUG9pbnQ6IGZ1bmN0aW9uKCkge1xyXG5cdCAgICB2YXIgcmVkcG9pbnRfZGF0YTEgPSB0aGlzLmNoZWNrSGVyb1JlZFBvaW50QnlSZWRQb2ludFR5cGUoSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBMZXZlbFVwLCB0cnVlKVxyXG5cdCAgICB2YXIgcmVkcG9pbnRfZGF0YTIgPSB0aGlzLmNoZWNrSGVyb1JlZFBvaW50QnlSZWRQb2ludFR5cGUoSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBFcXVpcCwgdHJ1ZSlcclxuXHQgICAgdmFyIHJlZHBvaW50X2RhdGEzID0gdGhpcy5jaGVja0hlcm9SZWRQb2ludEJ5UmVkUG9pbnRUeXBlKEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQU3RhciwgdHJ1ZSlcclxuXHQgICAgdmFyIHJlZHBvaW50X2RhdGE0ID0gdGhpcy5jaGVja0hlcm9SZWRQb2ludEJ5UmVkUG9pbnRUeXBlKEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQVGFsZW50LCB0cnVlKVxyXG5cdCAgICAvLyDnrZbliJLopoHmsYIg5aSp6LWL5LiN566X5aaC5Li755WM6Z2i57qi54K5IOS9huaYr+eul+WFpeiLsembhOiDjOWMhee6oueCuVxyXG5cdCAgICB2YXIgZGF0YSA9IFtyZWRwb2ludF9kYXRhMSwgcmVkcG9pbnRfZGF0YTIsIHJlZHBvaW50X2RhdGEzXTsgLy8gLCByZWRwb2ludF9kYXRhNFxyXG5cdCAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0QnRuUmVkUG9pbnQoTWFpbnVpQ29uc3QuYnRuX2luZGV4LnBhcnRuZXIsZGF0YSk7XHJcblx0ICAgIHZhciBkYXRhID0gW3JlZHBvaW50X2RhdGExLCByZWRwb2ludF9kYXRhMiwgcmVkcG9pbnRfZGF0YTNdO1xyXG5cdCAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEhlcm9FdmVudC5BbGxfSGVyb19SZWRQb2ludF9FdmVudCwgZGF0YSk7XHJcblx0fSxcclxuXHJcblxyXG5cdC8v5qOA5p+l5Y2V5Liq6Iux6ZuE55qE57qi54K55L+h5oGvXHJcblx0Y2hlY2tTaW5nbGVIZXJvUmVkUG9pbnQ6IGZ1bmN0aW9uKGhlcm9fdm8pIHtcclxuXHQgICAgdmFyIGlzX3JlZHBvaW50ID0gZmFsc2U7XHJcblx0ICAgIC8v5Y2H57qnIOWNh+mYtue6oueCuVxyXG5cdCAgICBpc19yZWRwb2ludCA9IHRoaXMuY2hlY2tTaW5nbGVIZXJvTGV2ZWxVcFJlZFBvaW50KGhlcm9fdm8pO1xyXG5cdCAgICBpZiAoaXNfcmVkcG9pbnQpIHJldHVybiB0cnVlO1xyXG5cdCAgICAvL+ijheWkh+e6oueCuVxyXG5cdCAgICBpc19yZWRwb2ludCA9IHRoaXMuY2hlY2tTaW5nbGVIZXJvRXF1aXBSZWRQb2ludChoZXJvX3ZvKVxyXG5cdCAgICBpZiAoaXNfcmVkcG9pbnQpIHJldHVybiB0cnVlO1xyXG5cdCAgICAvL+WNh+aYn+e6oueCuVxyXG5cdCAgICBpc19yZWRwb2ludCA9IHRoaXMuY2hlY2tTaW5nbGVIZXJvVXBncmFkZVN0YXJSZWRQb2ludChoZXJvX3ZvKVxyXG5cdCAgICBpZiAoaXNfcmVkcG9pbnQpIHJldHVybiB0cnVlO1xyXG5cdCAgICAvL+Wkqei1i+e6oueCuVxyXG5cdCAgICBpc19yZWRwb2ludCA9IHRoaXMuY2hlY2tTaW5nbGVIZXJvVGFsZW50U2tpbGxSZWRQb2ludChoZXJvX3ZvKVxyXG5cdCAgICByZXR1cm4gaXNfcmVkcG9pbnRcdFx0XHJcblx0fSxcclxuXHJcblx0Ly8g6K6h566X5Y2H5pif57qi54K557qi54K55qC55o2u5Y2H5pif6KGoXHJcblx0Ly8gQGlzX2lnbm9yZV9tYXN0ZXJfY2FyZCDmmK/lkKblv73op4bkuLvljaEoNuaYn+S7peS4iueahOWNh+aYn+mAu+i+kSlcclxuXHQvLyBAcGFydG5lcl9pZCDlv73op4bkuLvljaHnmoQg5ZSv5LiAaWRcclxuXHRjaGVja1NpbmdsZVN0YXJGdXNlUmVkUG9pbnRCeVN0YXJDb25maWc6IGZ1bmN0aW9uKHN0YXJfY29uZmlnLCBpc19pZ25vcmVfbWFzdGVyX2NhcmQsIHBhcnRuZXJfaWQpIHtcclxuXHQgICAgaWYgKCFzdGFyX2NvbmZpZykgcmV0dXJuIGZhbHNlO1xyXG5cdCAgICB2YXIgaGVyb19pdGVtX2RhdGFfbGlzdCA9IHt9O1xyXG5cdCAgICB2YXIgaW5kZXggPSAxO1xyXG5cdCAgICB2YXIgZXhwZW5kID0gc3Rhcl9jb25maWcuZXhwZW5kMVswXTtcclxuXHQgICAgLy8g54m55a6a5p2h5Lu25pWw5o2uIOe7k+aehCBkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXVvmmJ/nuqddID0g5pWw6YePXHJcblx0ICAgIHZhciBkaWNfdGhlX2NvbmRpdGlvbnMgPSB7fTtcclxuXHQgICAgLy8g6ZqP5py65p2h5Lu2IGRpY19yYW5kb21fY29uZGl0aW9uc1vpmLXokKVdW+aYn+e6p10gPSDmlbDph49cclxuXHQgICAgdmFyIGRpY19yYW5kb21fY29uZGl0aW9ucyA9IHt9O1xyXG5cdCAgICAvLyDmoIflv5flt7LnlKhcclxuXHQgICAgdmFyIGRpY19oZXJvX2lkID0ge307XHJcblx0ICAgIHZhciBuZWVkX2NvdW50ID0gMDtcclxuXHQgICAgaWYgKCFpc19pZ25vcmVfbWFzdGVyX2NhcmQpIHtcclxuXHQgICAgICAgIGlmIChleHBlbmQpIHtcclxuXHQgICAgICAgICAgICAvLyDmjIflrprnmoQgezEwNDAyLDQsMX0gOiAxMDQwMjog6KGo56S6YmlkLCA0OiDooajnpLrmmJ/nuqcgMTrooajnpLrmlbDph49cclxuXHQgICAgICAgICAgICB2YXIgYmlkID0gZXhwZW5kWzBdO1xyXG5cdCAgICAgICAgICAgIHZhciBzdGFyID0gZXhwZW5kWzFdO1xyXG5cdCAgICAgICAgICAgIHZhciBjb3VudCA9IGV4cGVuZFsyXTtcclxuXHJcblx0ICAgICAgICAgICAgZGljX3RoZV9jb25kaXRpb25zW2JpZF0gPSB7fTtcclxuXHQgICAgICAgICAgICBkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXVtzdGFyXSA9IGNvdW50O1xyXG5cdCAgICAgICAgICAgIG5lZWRfY291bnQgPSBuZWVkX2NvdW50ICsgY291bnQ7XHJcblx0ICAgICAgICB9XHJcblx0ICAgICAgICBpbmRleCA9IGluZGV4ICsgMTtcdCAgICBcdFxyXG5cdCAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgZGljX2hlcm9faWRbcGFydG5lcl9pZF0gPSAxO1xyXG5cdCAgICB9XHJcblxyXG5cdCAgICBmb3IgKHZhciBleHBlbmRfaSA9IDA7ZXhwZW5kX2k8IHN0YXJfY29uZmlnLmV4cGVuZDIubGVuZ3RoOysrZXhwZW5kX2kpIHtcclxuXHQgICAgICAgIC8vIOaMh+WumueahCB7MTA0MDIsNCwxfSA6IDEwNDAyOiDooajnpLpiaWQsIDQ6IOihqOekuuaYn+e6pyAxOuihqOekuuaVsOmHj1xyXG5cdCAgICBcdHZhciBleHBlbmQgPSBzdGFyX2NvbmZpZy5leHBlbmQyW2V4cGVuZF9pXTtcclxuXHJcbiAgICAgICAgICAgIHZhciBiaWQgPSBleHBlbmRbMF07XHJcbiAgICAgICAgICAgIHZhciBzdGFyID0gZXhwZW5kWzFdO1xyXG4gICAgICAgICAgICB2YXIgY291bnQgPSBleHBlbmRbMl07XHJcblxyXG5cdCAgICAgICAgaWYgKCFkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXSlcclxuXHQgICAgICAgICAgICBkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXSA9IHt9O1xyXG5cclxuXHQgICAgICAgIGlmICghZGljX3RoZV9jb25kaXRpb25zW2JpZF1bc3Rhcl0pIHtcclxuXHQgICAgICAgICAgICBkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXVtzdGFyXSA9IGNvdW50O1xyXG5cdCAgICAgICAgfSBlbHNlIHtcclxuXHQgICAgICAgICAgICBkaWNfdGhlX2NvbmRpdGlvbnNbYmlkXVtzdGFyXSA9IGRpY190aGVfY29uZGl0aW9uc1tiaWRdW3N0YXJdICsgY291bnQ7XHJcblx0ICAgICAgICB9XHJcblx0ICAgICAgICBuZWVkX2NvdW50ID0gbmVlZF9jb3VudCArIGNvdW50O1xyXG5cdCAgICAgICAgaW5kZXggPSBpbmRleCArIDE7XHJcblx0ICAgIH1cclxuXHJcblx0ICAgIC8vIDTmmK/lkoznrZbliJLor7Tlpb3kuobmnIDlpJo05LiqXHJcblx0ICAgIGlmIChpbmRleCA8PSA0KSB7XHJcblx0ICAgICAgICAvLyDpmo/mnLrnmoQgezEsNCwyfSA6IDEg6KGo56S66Zi16JClICA0OiDooajnpLrmmJ/nuqcgMuihqOekuuaVsOmHj1xyXG5cdFx0ICAgIGZvciAodmFyIGV4cGVuZF9pPTA7ZXhwZW5kX2k8c3Rhcl9jb25maWcuZXhwZW5kMy5sZW5ndGg7KytleHBlbmRfaSkge1xyXG5cdFx0ICAgIFx0dmFyIGV4cGVuZCA9IHN0YXJfY29uZmlnLmV4cGVuZDNbZXhwZW5kX2ldO1xyXG5cdCAgICAgICAgICAgIHZhciBjYW1wID0gZXhwZW5kWzBdO1xyXG5cdCAgICAgICAgICAgIHZhciBzdGFyID0gZXhwZW5kWzFdO1xyXG5cdCAgICAgICAgICAgIHZhciBjb3VudCA9IGV4cGVuZFsyXTtcclxuXHJcblx0ICAgICAgICAgICAgaWYgKCFkaWNfcmFuZG9tX2NvbmRpdGlvbnNbY2FtcF0pXHJcblx0ICAgICAgICAgICAgICAgIGRpY19yYW5kb21fY29uZGl0aW9uc1tjYW1wXSA9IHt9O1xyXG5cclxuXHQgICAgICAgICAgICBpZiAoIWRpY19yYW5kb21fY29uZGl0aW9uc1tjYW1wXVtzdGFyXSkge1xyXG5cdCAgICAgICAgICAgICAgICBkaWNfcmFuZG9tX2NvbmRpdGlvbnNbY2FtcF1bc3Rhcl0gPSBjb3VudDtcclxuXHQgICAgICAgICAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgICAgICAgICBkaWNfcmFuZG9tX2NvbmRpdGlvbnNbY2FtcF1bc3Rhcl0gPSBkaWNfcmFuZG9tX2NvbmRpdGlvbnNbY2FtcF1bc3Rhcl0gKyBjb3VudDtcclxuXHQgICAgICAgICAgICB9XHJcblxyXG5cdCAgICAgICAgICAgIG5lZWRfY291bnQgPSBuZWVkX2NvdW50ICsgY291bnQ7IFxyXG5cdCAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxO1xyXG5cdCAgICAgICAgICAgIGlmIChpbmRleCA+IDQpXHJcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cdFx0ICAgIH1cclxuXHQgICAgfVxyXG5cclxuXHQgICAgLy8g6I635Y+W5YiX6KGoXHJcblx0ICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XHJcblx0ICAgIHZhciBtb2RlbCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcclxuXHQgICAgdmFyIHRvdGFsX2NvdW50ID0gbW9kZWwuZ2V0SGVyb0xpc3RCeU1hdGNoSW5mbyhkaWNfdGhlX2NvbmRpdGlvbnMsIGRpY19yYW5kb21fY29uZGl0aW9ucywgZGljX2hlcm9faWQpO1xyXG5cdCAgICB2YXIgaXNfcmVkcG9pbnQgPSB0b3RhbF9jb3VudCA+PSBuZWVkX2NvdW50O1xyXG5cdCAgICB2YXIgcmVzdWx0ID0ge2lzX3JlZHBvaW50OiBpc19yZWRwb2ludCwgbmVlZF9jb3VudDogbmVlZF9jb3VudCwgdG90YWxfY291bnQ6IHRvdGFsX2NvdW50fTtcclxuXHQgICAgcmV0dXJuIHJlc3VsdDtcclxuXHR9LFxyXG5cclxuXHQvL+ajgOa1i+espuaWh+exu+Wei+eahOe6oueCuVxyXG5cdC8vQGVxdWlwX3ZvIOespuaWh+WvueixoS4u5aaC5p6c5Li656m66K+05piO5rKh5pyJ56ym5paHXHJcblx0Y2hlY2tTaW5nbGVBcnRpZmFjdFJlZFBvaW50OmZ1bmN0aW9uKGVxdWlwX3ZvKXtcclxuXHRcdHZhciBiYWNrcGFja19tb2RlbCA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcclxuXHRcdHZhciBCYWNrUGFja0NvbnN0ID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnN0XCIpXHJcblx0XHR2YXIgZXF1aXBfc2NvcmVfbGlzdCA9IGJhY2twYWNrX21vZGVsLmdldEFsbEVxdWlwTGlzdEJ5VHlwZShCYWNrUGFja0NvbnN0Lml0ZW1fdHlwZS5BUlRJRkFDVENISVBTKVxyXG5cclxuXHRcdGlmKGVxdWlwX3ZvID09IG51bGwpe1xyXG5cdFx0XHRpZihlcXVpcF9zY29yZV9saXN0ICYmIFV0aWxzLmVxdWlwX3Njb3JlX2xpc3Qpe1xyXG5cdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZVxyXG5cdH0sXHJcblxyXG5cdC8vIOagueaNrue6oueCueexu+WeiyDmuIXnqbrnuqLngrnorrDlvZUgXHJcblx0Ly8gQHJlZF9wb2ludF90eXBlIOWPguiAgyBIZXJvQ29uc3QuUmVkUG9pbnRUeXBlXHJcblx0Ly8gQGlzX2RlbGF5IOaYr+WQpuW7tui/n+ajgOa1i1xyXG5cdGNsZWFyQWxsSGVyb1JlY29yZEJ5UmVkUG9pbnRUeXBlOiBmdW5jdGlvbihyZWRfcG9pbnRfdHlwZSwgaXNfZGVsYXkpIHtcclxuXHQgICAgLy8g6ams5LiK5riF6ZmkXHJcblx0ICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XHJcblx0ICAgIHZhciBtb2RlbCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcclxuXHQgICAgdmFyIGhlcm9fbGlzdCA9IG1vZGVsLmdldEhlcm9MaXN0KCk7XHJcblxyXG5cdCAgICBmb3IgKHZhciBoZXJvX2kgaW4gaGVyb19saXN0KSB7XHJcblx0ICAgIFx0aGVyb19saXN0W2hlcm9faV0ucmVkX3BvaW50W3JlZF9wb2ludF90eXBlXSA9IG51bGw7XHJcblx0ICAgIH1cclxuXHJcblx0XHR0aGlzLmNoZWNrSGVyb1JlZFBvaW50QnlSZWRQb2ludFR5cGUocmVkX3BvaW50X3R5cGUpO1xyXG5cdFx0aWYocmVkX3BvaW50X3R5cGUgPT0gSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBMZXZlbFVwIHx8IHJlZF9wb2ludF90eXBlID09IEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQVGFsZW50KXtcclxuICAgICAgICAgICAgLy8gLS3nm67liY3ljYfnuqcg5ZKMIOWkqei1iyDnlKjliLDlu7bov59cclxuICAgICAgICAgICAgbW9kZWwuaXNfZGVsYXlfcmVkcG9pbnRfdXBkYXRlW3JlZF9wb2ludF90eXBlXSA9IGZhbHNlXHJcblx0XHR9XHJcblx0fSxcclxuXHJcblxyXG5cdC8vIOagueaNrue6oueCueexu+WeiyDmuIXmo4DmtYvnuqLngrnorrDlvZUgXHJcblx0Ly8gQHJlZF9wb2ludF90eXBlIOWPguiAgyBIZXJvQ29uc3QuUmVkUG9pbnRUeXBlXHJcblx0Ly8gQCDmmK/lkKblj6rmmK/ov5Tlm54g57qi54K55pWw5o2u5bCx5aW9XHJcblx0Y2hlY2tIZXJvUmVkUG9pbnRCeVJlZFBvaW50VHlwZTogZnVuY3Rpb24ocmVkX3BvaW50X3R5cGUsIGlzX3JldHVybikge1xyXG5cdCAgICB2YXIgSGVyb0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpO1x0XHRcclxuXHQgICAgdmFyIGhlcm9fbGlzdCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRIZXJvTGlzdCgpO1xyXG5cdCAgICB2YXIgcmVkcG9pbnRfZGF0YSA9IHt9O1xyXG5cdCAgICByZWRwb2ludF9kYXRhLmJpZCA9IHJlZF9wb2ludF90eXBlO1xyXG5cdCAgICByZWRwb2ludF9kYXRhLnN0YXR1cyA9IGZhbHNlO1xyXG5cclxuXHQgICAgZm9yICh2YXIgaGVyb19pIGluIGhlcm9fbGlzdCkge1xyXG5cdCAgICBcdHZhciBoZXJvX3ZvID0gaGVyb19saXN0W2hlcm9faV07XHJcblx0ICAgICAgICBpZiAodGhpcy5pc0NoZWNrSGVyb1JlZFBvaW50QnlIZXJvVm8oaGVyb192bykpIHsgICAgICAvL+etiee6p1xyXG5cdCAgICAgICAgICAgIGlmIChyZWRfcG9pbnRfdHlwZSA9PSBIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUExldmVsVXApIHtcclxuXHQgICAgICAgICAgICAgICAgcmVkcG9pbnRfZGF0YS5zdGF0dXMgPSB0aGlzLmNoZWNrU2luZ2xlSGVyb0xldmVsVXBSZWRQb2ludChoZXJvX3ZvKTtcclxuXHQgICAgICAgICAgICAgICAgaWYgKHJlZHBvaW50X2RhdGEuc3RhdHVzKVxyXG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHQgICAgICAgICAgICBcdFxyXG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAocmVkX3BvaW50X3R5cGUgPT0gSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBFcXVpcCkgeyAgIC8v6KOF5aSHXHJcblx0ICAgICAgICAgICAgICAgIHJlZHBvaW50X2RhdGEuc3RhdHVzID0gdGhpcy5jaGVja1NpbmdsZUhlcm9FcXVpcFJlZFBvaW50KGhlcm9fdm8pO1xyXG5cdCAgICAgICAgICAgICAgICBpZiAocmVkcG9pbnRfZGF0YS5zdGF0dXMpXHJcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZF9wb2ludF90eXBlID09IEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQU3RhcikgeyAgIC8v5Y2H5pifXHJcblx0ICAgICAgICAgICAgICAgIHJlZHBvaW50X2RhdGEuc3RhdHVzID0gdGhpcy5jaGVja1NpbmdsZUhlcm9VcGdyYWRlU3RhclJlZFBvaW50KGhlcm9fdm8pO1xyXG5cdCAgICAgICAgICAgICAgICBpZiAocmVkcG9pbnRfZGF0YS5zdGF0dXMpIFxyXG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChyZWRfcG9pbnRfdHlwZSA9PSBIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUFRhbGVudCkgeyAgIC8v5aSp6LWLXHJcblx0ICAgICAgICAgICAgICAgIHJlZHBvaW50X2RhdGEuc3RhdHVzID0gdGhpcy5jaGVja1NpbmdsZUhlcm9UYWxlbnRTa2lsbFJlZFBvaW50KGhlcm9fdm8pO1xyXG5cdCAgICAgICAgICAgICAgICBpZiAocmVkcG9pbnRfZGF0YS5zdGF0dXMpIFxyXG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblx0ICAgICAgICAgICAgfVxyXG5cdCAgICAgICAgfVxyXG5cdCAgICB9XHJcblxyXG5cdCAgICBpZiAoaXNfcmV0dXJuKSB7XHJcblx0ICAgICAgICByZXR1cm4gcmVkcG9pbnRfZGF0YVxyXG5cdCAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgLy8gaWYgcmVkX3BvaW50X3R5cGUgfj0gSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBUYWxlbnQgdGhlbiAtLeWkqei1i1xyXG5cdCAgICAgICAgLy8gICAgIC8vIOetluWIkuimgeaxgiDlpKnotYvkuI3nrpflpoLkuLvnlYzpnaLnuqLngrkg5L2G5piv566X5YWl6Iux6ZuE6IOM5YyF57qi54K5XHJcblx0ICAgICAgICAvLyAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEJ0blJlZFBvaW50KE1haW51aUNvbnN0LmJ0bl9pbmRleC5wYXJ0bmVyLHtyZWRwb2ludF9kYXRhfSlcclxuXHQgICAgICAgIC8vIGVuZFxyXG5cdFx0ICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRCdG5SZWRQb2ludChNYWludWlDb25zdC5idG5faW5kZXgucGFydG5lciwgW3JlZHBvaW50X2RhdGFdKTtcdCAgICAgICAgXHJcbiAgICBcdCAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEhlcm9FdmVudC5BbGxfSGVyb19SZWRQb2ludF9FdmVudCwgW3JlZHBvaW50X2RhdGFdKTtcclxuXHQgICAgICAgIC8vIEdsb2JhbEV2ZW50LmdldEluc3RhbmNlKCkuRmlyZShIZXJvRXZlbnQuQWxsX0hlcm9fUmVkUG9pbnRfRXZlbnQsIHtyZWRwb2ludF9kYXRhfSlcclxuXHQgICAgfVxyXG5cdH0sXHJcblxyXG5cdC8v5piv5ZCm6ZyA6KaB5qOA5rWL57qi54K5XHJcblx0aXNDaGVja0hlcm9SZWRQb2ludEJ5SGVyb1ZvOiBmdW5jdGlvbihoZXJvX3ZvKSB7XHJcblx0ICAgIC8vICAzIOS7peWQjui1sOmFjee9ruihqCBcclxuXHQgICAgLy8g562J5LqOID4gM+e6pyDlkowg5LiK6Zi155qE6Iux6ZuE6ZyA6KaB5qOA5p+l57qi54K5IOazqOaEjzogaGVyb192by5sZXYgPiAzIOaaguaXtuS4jeimgVxyXG5cdCAgICAvLyBoZXJvX3ZvLmlzX2luX2Zvcm0gPCAxMCDlm6DkuLogaXNfaW5fZm9ybS7mlLnmiJAg5biD6Zi157G75Z6LICoxMCArIOW6j+WPt+S6hlxyXG5cdCAgICBpZiAoIWhlcm9fdm8pIHJldHVybjtcclxuXHJcblx0ICAgIGlmIChoZXJvX3ZvLmlzRm9ybURyYW1hKCkpXHJcblx0ICAgICAgICByZXR1cm4gdHJ1ZVxyXG5cdCAgICByZXR1cm4gZmFsc2U7XHJcblx0fSxcclxuXHJcblx0Ly8g5qOA5p+l5Y2V5Liq6Iux6ZuE5Y2H57qn57qi54K5IOWPiui/m+mYtue6oueCuVxyXG5cdGNoZWNrU2luZ2xlSGVyb0xldmVsVXBSZWRQb2ludDogZnVuY3Rpb24oaGVyb192bykge1x0ICAgIFxyXG5cdFx0aWYgKCFoZXJvX3ZvKSByZXR1cm4gZmFsc2U7XHJcblx0ICAgIC8vIGlmIChoZXJvX3ZvLnJlZF9wb2ludCAmJiB0eXBlb2YgaGVyb192by5yZWRfcG9pbnRbSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBMZXZlbFVwXSAhPSBcImJvb2xlYW5cIikge1xyXG5cdCAgICAvLyAgICAgcmV0dXJuIGhlcm9fdm8ucmVkX3BvaW50W0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQTGV2ZWxVcF0gPT0gdHJ1ZTtcclxuXHQgICAgLy8gfVxyXG5cdFx0aWYoaGVyb192by5yZWRfcG9pbnQgJiYgaGVyb192by5yZWRfcG9pbnRbSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBMZXZlbFVwXSAhPSBudWxsKXtcclxuXHRcdFx0cmV0dXJuIGhlcm9fdm8ucmVkX3BvaW50W0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQTGV2ZWxVcF0gPT0gdHJ1ZVxyXG5cdFx0fVxyXG5cdCAgICB2YXIgc3RhdHVzID0gdGhpcy5nZXRIZXJvU2hvd0xldmVsU3RhdHVzKGhlcm9fdm8pO1xyXG5cdCAgICB2YXIgaXNfcmVkcG9pbnQgPSBmYWxzZTtcclxuXHJcblx0ICAgIGlmIChzdGF0dXMgPT0gMSkgeyAgLy/ljYfnuqdcclxuXHQgICAgICAgIHZhciBsZXZfY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX3BhcnRuZXJfbGV2W2hlcm9fdm8ubGV2XTtcclxuXHQgICAgICAgIGlmIChsZXZfY29uZmlnKSB7XHJcblx0ICAgICAgICAgICAgdmFyIHVwX2Nvc3QgPSBsZXZfY29uZmlnLmV4cGVuZCB8fCBbXTtcclxuXHQgICAgICAgICAgICB2YXIgbGV2X3JlZHBvaW50ID0gdHJ1ZTtcclxuXHQgICAgICAgICAgICBmb3IgKHZhciBjb3N0X2kgPSAwIDtjb3N0X2kgPCB1cF9jb3N0Lmxlbmd0aDsrK2Nvc3RfaSkge1xyXG5cdCAgICAgICAgICAgIFx0dmFyIGNvc3QgPSB1cF9jb3N0W2Nvc3RfaV07XHJcblx0XHRcdFx0XHR2YXIgY291bnQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEl0ZW1OdW1CeUJpZChjb3N0WzBdKTtcclxuXHQgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgY29zdFsxXSl7XHJcblx0XHRcdFx0XHRcdGxldl9yZWRwb2ludCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdCAgICAgICAgICAgIH1cclxuXHRcdFx0XHRpc19yZWRwb2ludCA9IGxldl9yZWRwb2ludDtcclxuXHQgICAgICAgIH1cclxuXHQgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gMikgeyAvLyDljYfpmLZcclxuXHQgICAgICAgIHZhciBrZXkgPSBVdGlscy5nZXROb3JLZXkoaGVyb192by50eXBlLCBoZXJvX3ZvLmJyZWFrX2lkLCBoZXJvX3ZvLmJyZWFrX2xldik7XHJcblx0ICAgICAgICB2YXIgYnJlYWtfY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX3BhcnRuZXJfYnJhY2hba2V5XTtcclxuXHQgICAgICAgIGlmIChicmVha19jb25maWcpIHtcclxuXHQgICAgICAgICAgICB2YXIgY29zdF9saXN0ID0gYnJlYWtfY29uZmlnLmV4cGVuZCB8fCBbXTtcclxuXHQgICAgICAgICAgICB2YXIgYnJlYWtfcmVkcG9pbnQgPSB0cnVlO1xyXG5cdCAgICAgICAgICAgIGZvciAodmFyIGNvc3RfaT0wO2Nvc3RfaSA8IGNvc3RfbGlzdC5sZW5ndGg7Kytjb3N0X2kpIHtcclxuXHQgICAgICAgICAgICBcdHZhciBjb3N0ID0gY29zdF9saXN0W2Nvc3RfaV07XHJcblx0XHRcdFx0XHR2YXIgY291bnQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEl0ZW1OdW1CeUJpZChjb3N0WzBdKTtcclxuXHJcblx0ICAgICAgICAgICAgICAgIGlmIChjb3VudCA8IGNvc3RbMV0pXHJcblx0ICAgICAgICAgICAgICAgICAgICBicmVha19yZWRwb2ludCA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHQgICAgICAgICAgICBpc19yZWRwb2ludCA9IGJyZWFrX3JlZHBvaW50O1xyXG5cdCAgICAgICAgfVxyXG5cdCAgICB9XHJcblx0XHRpZihoZXJvX3ZvLnJlZF9wb2ludCl7XHJcblx0XHRcdGhlcm9fdm8ucmVkX3BvaW50W0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQTGV2ZWxVcF0gPSBpc19yZWRwb2ludCBcclxuXHRcdH1cclxuXHQgICAgcmV0dXJuIGlzX3JlZHBvaW50XHRcdFxyXG5cdH0sXHJcblxyXG5cdC8vIOajgOafpeWNleS4quiLsembhOijheWkh+e6oueCuVxyXG5cdGNoZWNrU2luZ2xlSGVyb0VxdWlwUmVkUG9pbnQ6IGZ1bmN0aW9uKGhlcm9fdm8pIHtcclxuXHRcdGlmICghaGVyb192bykgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHQgICAgaWYgKHR5cGVvZiBoZXJvX3ZvLnJlZF9wb2ludFtIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUEVxdWlwXSA9PSBcImJvb2xlYW5cIikge1xyXG5cdCAgICAgICAgcmV0dXJuIGhlcm9fdm8ucmVkX3BvaW50W0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQRXF1aXBdID09IHRydWVcclxuXHQgICAgfVxyXG5cclxuXHQgICAgdmFyIGlzX3JlZHBvaW50ID0gZmFsc2U7XHJcblx0ICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XHJcblx0ICAgIHZhciBtb2RlbCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKVxyXG5cdCAgICAvLyDoo4XlpIdcclxuXHQgICAgdmFyIGVxdWlwX2xpc3QgPSBtb2RlbC5nZXRIZXJvRXF1aXBMaXN0KGhlcm9fdm8ucGFydG5lcl9pZCk7XHJcblx0ICAgIHZhciBlcXVpcF90eXBlX2xpc3QgPSBIZXJvQ29uc3QuRXF1aXBQb3NMaXN0IHx8IHt9O1xyXG5cclxuXHQgICAgZm9yICh2YXIgZXF1aXBfdHlwZV9pIGluIGVxdWlwX3R5cGVfbGlzdCkge1xyXG5cclxuXHQgICAgICAgIGlzX3JlZHBvaW50ID0gdGhpcy5jaGVja1NpbmdsZUhlcm9FYWNoUG9zRXF1aXBSZWRQb2ludChlcXVpcF90eXBlX2xpc3RbZXF1aXBfdHlwZV9pXSwgZXF1aXBfbGlzdFtlcXVpcF90eXBlX2ldKVxyXG5cdCAgICAgICAgaWYgKGlzX3JlZHBvaW50KVxyXG5cdCAgICAgICAgICAgIGJyZWFrXHJcblx0ICAgIH1cclxuXHJcblx0ICAgIGhlcm9fdm8ucmVkX3BvaW50W0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQRXF1aXBdID0gaXNfcmVkcG9pbnQ7XHJcblx0ICAgIHJldHVybiBpc19yZWRwb2ludDtcclxuXHR9LFxyXG5cclxuXHJcblx0Ly8g5qOA5rWL6KOF5aSH57G75Z6L55qE57qi54K5XHJcblx0Ly8gQGVxdWlwX3R5cGUg6KOF5aSH57G75Z6LXHJcblx0Ly8gQGVxdWlwX3ZvIOijheWkh+WvueixoS4u5aaC5p6c5Li656m66K+05piO5rKh5pyJ6KOF5aSHXHJcblx0Y2hlY2tTaW5nbGVIZXJvRWFjaFBvc0VxdWlwUmVkUG9pbnQ6IGZ1bmN0aW9uKGVxdWlwX3R5cGUsIGVxdWlwX3ZvKSB7XHJcblx0ICAgIHZhciBlcXVpcF90eXBlID0gZXF1aXBfdHlwZSB8fCAxO1xyXG5cdCAgICB2YXIgYmFja3BhY2tfbW9kZWwgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpO1xyXG5cdCAgICB2YXIgZXF1aXBfc2NvcmVfbGlzdCA9IGJhY2twYWNrX21vZGVsLmdldEFsbEVxdWlwTGlzdEJ5VHlwZShlcXVpcF90eXBlKTtcclxuXHJcblx0ICAgIGlmICghZXF1aXBfdm8pIHtcclxuXHQgICAgICAgIC8vIOayoeacieijheWkhy4u5Yik5pat5piv5ZCm5pyJ5a+55bqU57G75Z6L55qE6KOF5aSHXHJcblx0ICAgICAgICBpZiAoZXF1aXBfc2NvcmVfbGlzdCAmJiBVdGlscy5uZXh0KGVxdWlwX3Njb3JlX2xpc3QpKSB7XHJcblx0ICAgICAgICAgICAgLy8g5pyJ57qi54K5XHJcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuXHQgICAgICAgIH1cclxuXHQgICAgfSBlbHNlIHtcclxuXHQgICAgICAgIC8vIOWmguaenOayoeacieWIhuaVsC4u566X5LiA5LiqIC4uXHJcblx0ICAgICAgICBpZiAoIWVxdWlwX3ZvLmFsbF9zY29yZSB8fCBlcXVpcF92by5hbGxfc2NvcmUgPT0gMCkge1xyXG5cdCAgICAgICAgICAgIGVxdWlwX3ZvLnNldEVuY2hhbnRTY29yZSgwKTtcclxuXHQgICAgICAgIH1cclxuXHQgICAgICAgIHZhciBzY29yZSA9IGVxdWlwX3ZvLmFsbF9zY29yZSB8fCAwO1xyXG5cdCAgICAgICAgaWYgKGVxdWlwX3Njb3JlX2xpc3QpIHtcclxuXHQgICAgICAgICAgICAvLyDopoHliKTmlq3lvZPliY3oo4XlpIfmr5Tog4zljIXnmoToo4XlpIfor4TliIblupXmiY3mmL7npLrnuqLngrlcclxuXHQgICAgICAgICAgICBmb3IgKHZhciBlcXVpcF9pIGluIGVxdWlwX3Njb3JlX2xpc3QpIHtcclxuXHQgICAgICAgICAgICBcdHZhciBlcXVpcF9pdGVtID0gZXF1aXBfc2NvcmVfbGlzdFtlcXVpcF9pXVxyXG5cdCAgICAgICAgICAgICAgICBpZiAoZXF1aXBfaXRlbSAmJiBlcXVpcF9pdGVtLmFsbF9zY29yZSAmJiBlcXVpcF9pdGVtLmFsbF9zY29yZSA+IHNjb3JlKSB7XHJcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG5cdCAgICAgICAgICAgICAgICB9XHJcblx0ICAgICAgICAgICAgfVxyXG5cdCAgICAgICAgfVxyXG5cdCAgICB9XHJcblx0ICAgIFxyXG5cdCAgICByZXR1cm4gZmFsc2VcclxuXHR9LFxyXG5cclxuXHQvLyDmo4Dmn6XljZXkuKroi7Hpm4TljYfmmJ/nuqLngrkgXHJcblx0Y2hlY2tTaW5nbGVIZXJvVXBncmFkZVN0YXJSZWRQb2ludDogZnVuY3Rpb24oaGVyb192bykge1xyXG5cdFx0aWYgKCFoZXJvX3ZvKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdCAgICAvLyBpZiAodHlwZW9mIGhlcm9fdm8ucmVkX3BvaW50W0hlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQU3Rhcl0gPT0gXCJib29sZWFuXCIpIHtcclxuXHQgICAgLy8gICAgIHJldHVybiBoZXJvX3ZvLnJlZF9wb2ludFtIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUFN0YXJdID09IHRydWU7XHJcblx0ICAgIC8vIH1cclxuXHQgICAgXHJcblx0ICAgIHZhciBzdGFyID0gaGVyb192by5zdGFyIHx8IDE7XHJcblx0ICAgIHZhciBuZXh0X2tleSA9IFV0aWxzLmdldE5vcktleShoZXJvX3ZvLmJpZCwgc3RhciArIDEpO1xyXG5cdCAgICB2YXIgbmV4dF9zdGFyX2NvbmZpZyA9IGdkYXRhKFwicGFydG5lcl9kYXRhXCIsIFwiZGF0YV9wYXJ0bmVyX3N0YXJcIiwgbmV4dF9rZXkpO1xyXG5cdCAgICBpZiAoIW5leHRfc3Rhcl9jb25maWcpIHtcclxuXHQgICAgICAgIC8vIOivtOaYjua7oeaYn+S6hlxyXG5cdCAgICAgICAgaGVyb192by5yZWRfcG9pbnRbSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBTdGFyXSA9IGZhbHNlO1xyXG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cdCAgICB9XHJcblx0ICAgIFxyXG5cdCAgICB2YXIgc3Rhcl9jb25maWcgPSBuZXh0X3N0YXJfY29uZmlnO1xyXG5cdCAgICB2YXIgaXNfcmVkcG9pbnQgPSBmYWxzZTtcclxuXHQgICAgdmFyIEhlcm9Db250cm9sbGVyID0gcmVxdWlyZShcImhlcm9fY29udHJvbGxlclwiKTtcclxuXHQgICAgdmFyIG1vZGVsID0gIEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcclxuXHQgICAgaWYgKHN0YXIgPT0gbW9kZWwuaGVyb19pbmZvX3VwZ3JhZGVfc3Rhcl9wYXJhbTIpIHtcclxuXHQgICAgICAgIC8vIDEw57qn5Y2HMTHmnInkuJbnlYznrYnnuqfopoHmsYJcclxuXHQgICAgICAgIGlzX3JlZHBvaW50ID0gbW9kZWwuY2hlY2tPcGVuU3RhcjExKCk7XHJcblx0ICAgIH0gZWxzZSB7XHJcblx0ICAgICAgICBpc19yZWRwb2ludCA9IHRydWU7XHJcblx0ICAgIH1cclxuXHJcblx0ICAgIGlmIChpc19yZWRwb2ludCkge1xyXG5cdCAgICAgICAgaWYgKHN0YXJfY29uZmlnKSB7XHJcblx0ICAgICAgICBcdHZhciBzdGFyX3Jlc3VsdCA9IHRoaXMuY2hlY2tTaW5nbGVTdGFyRnVzZVJlZFBvaW50QnlTdGFyQ29uZmlnKHN0YXJfY29uZmlnLCB0cnVlLCBoZXJvX3ZvLnBhcnRuZXJfaWQpO1xyXG5cdCAgICAgICAgICAgIGlzX3JlZHBvaW50ID0gc3Rhcl9yZXN1bHQuaXNfcmVkcG9pbnQ7XHJcblx0ICAgICAgICAgICAgLy8g6K6h566X5raI6ICXICAgIFxyXG5cdCAgICAgICAgICAgIGlmIChpc19yZWRwb2ludCAmJiBzdGFyX2NvbmZpZy5vdGhlcl9leHBlbmQubGVuZ3RoID4gMCkge1xyXG5cdCAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEl0ZW1OdW1CeUJpZChzdGFyX2NvbmZpZy5vdGhlcl9leHBlbmRbMF1bMF0pO1xyXG5cdCAgICAgICAgICAgICAgICBpZiAoY291bnQgPCBzdGFyX2NvbmZpZy5vdGhlcl9leHBlbmRbMF1bMV0pXHJcblx0ICAgICAgICAgICAgICAgICAgIGlzX3JlZHBvaW50ID0gZmFsc2U7XHJcblx0ICAgICAgICAgICAgfVxyXG5cdCAgICAgICAgfSBlbHNlIHtcclxuXHQgICAgICAgICAgICBpc19yZWRwb2ludCA9IGZhbHNlO1xyXG5cdCAgICAgICAgfVxyXG5cdCAgICB9XHJcblxyXG5cdCAgICBoZXJvX3ZvLnJlZF9wb2ludFtIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUFN0YXJdID0gaXNfcmVkcG9pbnQ7XHJcblx0ICAgIHJldHVybiBpc19yZWRwb2ludFxyXG5cdH0sXHJcblxyXG5cdC8vIOajgOafpeWNleS4quWkqei1i+aKgOiDvee6oueCuVxyXG5cdGNoZWNrU2luZ2xlSGVyb1RhbGVudFNraWxsUmVkUG9pbnQ6IGZ1bmN0aW9uKGhlcm9fdm8pIHtcclxuXHRcdGNjLmxvZyhcImNoZWNrU2luZ2xlSGVyb1RhbGVudFNraWxsUmVkUG9pbnRcIilcclxuXHRcdGlmICghaGVyb192bykgcmV0dXJuIGZhbHNlO1xyXG5cdFx0Ly8gLS3pppbmrKHljYfnuqfliLA25pif6K6w5b2VXHJcblx0XHRpZihoZXJvX3ZvLmlzX29wZW5fdGFsZW50ID09IHRydWUpe1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0fVxyXG5cdFx0aWYoaGVyb192by5yZWRfcG9pbnRbSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBUYWxlbnRdICE9IG51bGwpe1xyXG5cdFx0XHRyZXR1cm4gaGVyb192by5yZWRfcG9pbnRbSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBUYWxlbnRdID09IHRydWVcclxuXHRcdH1cclxuXHJcblx0XHRpZighaGVyb192by5pc2hhdmVUYWxlbnREYXRhKCkpcmV0dXJuIGZhbHNlO1xyXG5cdFx0bGV0IGlzX3JlZHBvaW50ID0gZmFsc2VcclxuXHRcdHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIilcclxuXHRcdGxldCBkaWNfaGVyb190YWxlbnRfc2tpbGxfbGVhcm5fcmVkcG9pbnQgPSBIZXJvQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0VGFsZW50UmVkcG9pbnRSZWNvcmQoKVxyXG5cdFx0bGV0IGRpY19za2lsbF9pZCA9IHt9XHJcblx0XHRmb3IobGV0IHBvcyBpbiBoZXJvX3ZvLnRhbGVudF9za2lsbF9saXN0KXtcclxuXHRcdFx0bGV0IGlkID0gaGVyb192by50YWxlbnRfc2tpbGxfbGlzdFtwb3NdXHJcblx0XHRcdGRpY19za2lsbF9pZFtpZF0gPSBwb3NcclxuXHRcdH1cdFxyXG5cdFx0Zm9yKGxldCBpIGluIENvbmZpZy5wYXJ0bmVyX3NraWxsX2RhdGEuZGF0YV9wYXJ0bmVyX3NraWxsX3Bvcyl7XHJcblx0XHRcdGxldCB2ID0gQ29uZmlnLnBhcnRuZXJfc2tpbGxfZGF0YS5kYXRhX3BhcnRuZXJfc2tpbGxfcG9zW2ldXHJcblx0XHRcdGlmKGhlcm9fdm8udGFsZW50X3NraWxsX2xpc3Rbdi5wb3NdKSB7XHJcblx0XHRcdFx0Ly8gLS3lt7Loo4XlpIfmioDog70g5Y+q6ZyA5Yik5pat6IO95ZCm5Y2H57qnXHJcblx0XHRcdFx0aXNfcmVkcG9pbnQgPSB0aGlzLmNoZWNrU2luZ2xlVGFsZW50U2tpbGxMZXZlbChoZXJvX3ZvLnRhbGVudF9za2lsbF9saXN0W3YucG9zXSlcclxuXHRcdFx0XHRpZihpc19yZWRwb2ludCl7XHJcblx0XHRcdFx0XHRicmVha1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0Ly8gLS3mnKroo4XlpIcg5YWI5Yik5pat5piv5ZCm6Kej6ZSB5L2N572uIFxyXG5cdFx0XHRcdGxldCBpc19sb2NrID0gZmFsc2VcclxuXHRcdFx0XHRpZih2LnBvc19saW1pdFswXSA9PSAnc3Rhcicpe1xyXG5cdFx0XHRcdFx0aXNfbG9jayA9IChoZXJvX3ZvLnN0YXIgPj0gdi5wb3NfbGltaXRbMV0pXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmKGlzX2xvY2spe1xyXG5cdFx0XHRcdFx0Zm9yKGxldCBpZCBpbiBkaWNfaGVyb190YWxlbnRfc2tpbGxfbGVhcm5fcmVkcG9pbnQpeyBcclxuXHRcdFx0XHRcdFx0aWYoZGljX3NraWxsX2lkW2lkXSA9PSBudWxsKXtcclxuXHRcdFx0XHRcdFx0XHRpc19yZWRwb2ludCA9IHRydWVcclxuXHRcdFx0XHRcdFx0XHRicmVha1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZihpc19yZWRwb2ludCl7XHJcblx0XHRcdFx0XHRcdGJyZWFrXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRoZXJvX3ZvLnJlZF9wb2ludFtIZXJvQ29uc3QuUmVkUG9pbnRUeXBlLmVSUFRhbGVudF0gPSBpc19yZWRwb2ludFxyXG5cdFx0cmV0dXJuIGlzX3JlZHBvaW50XHJcblx0fSxcdFxyXG5cdC8vIC0t5Yik5pat5aSp6LWL5oqA6IO96IO95ZCm5Y2H57qnIEBza2lsbF9pZCDmioDog71pZFxyXG5cdGNoZWNrU2luZ2xlVGFsZW50U2tpbGxMZXZlbChza2lsbF9pZCl7XHJcblx0XHRsZXQgY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfc2tpbGxfZGF0YS5kYXRhX3BhcnRuZXJfc2tpbGxfbGV2ZWxbc2tpbGxfaWRdXHJcblx0XHRpZihjb25maWcpe1xyXG5cdFx0XHRsZXQgaXNfZW5vdWdoID0gdHJ1ZVxyXG5cdFx0XHRmb3IobGV0IGk9MDtpPGNvbmZpZy5leHBlbmQubGVuZ3RoOysraSl7XHJcblx0XHRcdFx0bGV0IGNvc3QgPSBjb25maWcuZXhwZW5kW2ldXHJcblx0XHRcdFx0bGV0IGhhdmVfbnVtID0gQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRJdGVtTnVtQnlCaWQoY29zdFswXSlcclxuXHRcdFx0XHRpZihoYXZlX251bSA8IGNvc3RbMV0pe1xyXG5cdFx0XHRcdFx0aXNfZW5vdWdoID0gZmFsc2VcclxuXHRcdFx0XHRcdGJyZWFrXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBpc19lbm91Z2hcclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZVxyXG5cdH0sXHJcblxyXG5cdC8vIOiOt+WPluetiee6p+aYvuekuueKtuaAgSBcclxuXHQvLyBAIHJldHVybiAwOuihqOekuua7oee6pyAgMTog6KGo56S65Y+v5Lul5Y2H57qnIDogMjrooajnpLrlj6/ku6Xov5vpmLYgIC0xIOihqOekuuWHuumUmeS6hlxyXG5cdGdldEhlcm9TaG93TGV2ZWxTdGF0dXM6IGZ1bmN0aW9uKGhlcm9fdm8pIHtcclxuXHQgICAgdmFyIGtleSA9IGhlcm9fdm8udHlwZSArIFwiX1wiICsgaGVyb192by5icmVha19pZCArIFwiX1wiICsgaGVyb192by5icmVha19sZXY7XHJcblx0ICAgIHZhciBicmVha19jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9icmFjaFtrZXldO1xyXG5cdCAgICBpZiAoIWJyZWFrX2NvbmZpZykgcmV0dXJuIC0xO1xyXG5cdCAgICB2YXIgbmV4dF9rZXkgPSBoZXJvX3ZvLnR5cGUgKyBcIl9cIiArIGhlcm9fdm8uYnJlYWtfaWQgKyBcIl9cIiArIChoZXJvX3ZvLmJyZWFrX2xldiArIDEpO1xyXG5cdCAgICB2YXIgbmV4dF9icmVha19jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9icmFjaFtuZXh0X2tleV07XHJcblxyXG5cdCAgICB2YXIgbGV2X21heCA9IGJyZWFrX2NvbmZpZy5sZXZfbWF4O1xyXG5cdCAgICB2YXIgc3RhdHVzID0gMDtcclxuXHJcblx0ICAgIGlmICghbmV4dF9icmVha19jb25maWcpIHtcclxuXHQgICAgICAgIHZhciBrZXkgPSBoZXJvX3ZvLmJpZCArIFwiX1wiICsgaGVyb192by5zdGFyXHJcblx0ICAgICAgICB2YXIgc3Rhcl9jb25maWcgPSBnZGF0YShcInBhcnRuZXJfZGF0YVwiLCBcImRhdGFfcGFydG5lcl9zdGFyXCIsIGtleSk7XHJcblx0ICAgICAgICBpZiAoc3Rhcl9jb25maWcgJiYgbGV2X21heCA8IHN0YXJfY29uZmlnLmxldl9tYXgpIHtcclxuXHQgICAgICAgICAgICBsZXZfbWF4ID0gc3Rhcl9jb25maWcubGV2X21heFxyXG5cdCAgICAgICAgfVxyXG5cclxuXHQgICAgICAgIGlmIChoZXJvX3ZvLmxldiA+PSBsZXZfbWF4KSB7XHJcblx0ICAgICAgICAgICAgLy8gIOmDvea7oeS6hiAg5ruh57qn54q25oCBXHJcblx0ICAgICAgICAgICAgc3RhdHVzID0gMDtcclxuXHQgICAgICAgIH0gZWxzZSB7XHJcblx0ICAgICAgICAgICAgLy8g562J57qn5LiN6LazIOmcgOimgeWNh+e6p1xyXG5cdCAgICAgICAgICAgIHN0YXR1cyA9IDE7XHJcblx0ICAgICAgICB9XHJcblx0ICAgIH0gZWxzZSB7XHJcblx0ICAgICAgICBpZiAobmV4dF9icmVha19jb25maWcubGltaXQgJiYgbmV4dF9icmVha19jb25maWcubGltaXQubGVuZ3RoID4gMCkge1xyXG5cdCAgICAgICAgICAgIGlmIChoZXJvX3ZvLmxldiA+PSBicmVha19jb25maWcubGV2X21heCkge1xyXG5cdCAgICAgICAgICAgICAgICAvLyDov5vpmLbmnInopoHmsYIg6ZyA6KaB5Y2H5pifXHJcblx0ICAgICAgICAgICAgICAgIHZhciBpc19lbm91Z2ggPSB0aGlzLmlzRW5vdWdoQ29uZGl0aW9uKG5leHRfYnJlYWtfY29uZmlnLmxpbWl0LCBoZXJvX3ZvKVxyXG5cdCAgICAgICAgICAgICAgICBpZiAoaXNfZW5vdWdoKSB7XHJcblx0ICAgICAgICAgICAgICAgICAgICAvLyDlj6/ku6Xov5vpmLbkuoZcclxuXHQgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDI7XHJcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcblx0ICAgICAgICAgICAgICAgICAgICAvLyDkuI3mu6HotrPmnaHku7Yu5pi+56S65ruh57qn54q25oCBXHJcblx0ICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwO1xyXG5cdCAgICAgICAgICAgICAgICB9XHJcblx0ICAgICAgICAgICAgfSBlbHNlIHtcclxuXHQgICAgICAgICAgICAgICAgc3RhdHVzID0gMTtcclxuXHQgICAgICAgICAgICB9XHJcblx0ICAgICAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgICAgIC8vIOayoeaciemZkOWItlxyXG5cdCAgICAgICAgICAgIGlmIChoZXJvX3ZvLmxldiA+PSBicmVha19jb25maWcubGV2X21heCkge1xyXG5cdCAgICAgICAgICAgICAgICAvLyDlj6/ku6Xov5vpmLbkuoZcclxuXHQgICAgICAgICAgICAgICAgc3RhdHVzID0gMjtcclxuXHQgICAgICAgICAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgICAgICAgICAgLy8g562J57qn5LiN6LazIOmcgOimgeWNh+e6p1xyXG5cdCAgICAgICAgICAgICAgICBzdGF0dXMgPSAxO1xyXG5cdCAgICAgICAgICAgIH1cclxuXHQgICAgICAgIH1cclxuXHQgICAgfVxyXG5cdCAgICByZXR1cm4gc3RhdHVzXHJcblx0fSxcclxuXHJcblx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKuiuoeeul+elreWdm+eahOe6oueCueS/oeaBryoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdC8vIOa2iOmZpOiejeWQiOe6oueCuVxyXG5cdGNsZWFyQWxsU3RhckZ1c2VSZWRwb2ludFJlY29yZDogZnVuY3Rpb24oKSB7XHJcblx0ICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIilcclxuXHQgICAgdmFyIGRpY19mdXNlX2luZm8gPSAgSGVyb0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldFN0YXJGdXNlTGlzdCgpO1xyXG5cdCAgICBpZiAoIWRpY19mdXNlX2luZm8pIHJldHVybiBmYWxzZTtcclxuXHJcblx0ICAgIC8vIDDooajnpLrlhajpg6joi7Hpm4QgXHJcblx0ICAgIC8vIHZhciBjYW1wX2Z1c2VfaW5mbyA9IGRpY19mdXNlX2luZm9bMF1cclxuXHQgICAgZm9yICh2YXIgZGF0YV9pIGluIGRpY19mdXNlX2luZm8pIHtcclxuXHQgICAgXHR2YXIgZnVzZV9kYXRhID0gZGljX2Z1c2VfaW5mb1tkYXRhX2ldO1xyXG5cdCAgICAgICAgZnVzZV9kYXRhLmN1cl9yZWRwb2ludCA9IG51bGw7XHJcblx0ICAgIH1cdCAgICBcclxuXHJcblx0ICAgIC8vIOiuoeeul+S4u+eVjOmdoueGlOeCvOelreWdm+eahOe6oueCuVxyXG5cdCAgICAvLyB0aGlzLmNoZWNrQWxsU3RhckZ1c2VSZWRwb2ludCgpO1xyXG5cclxuXHRcdFJlZE1nci5nZXRJbnN0YW5jZSgpLmFkZENhbEhhbmRsZXIodGhpcy5jaGVja0FsbFN0YXJGdXNlUmVkcG9pbnQuYmluZCh0aGlzKSwgUmVkSWRzLlJlZnVzZUhlcm8pO1xyXG5cclxuXHR9LFxyXG5cclxuXHQvLyDorqHnrpfnhpTngrznuqLngrlcclxuXHRjaGVja0FsbFN0YXJGdXNlUmVkcG9pbnQ6IGZ1bmN0aW9uKCkge1xyXG5cdCAgICB2YXIgSGVyb0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpO1xyXG5cdCAgICB2YXIgZGljX2Z1c2VfaW5mbyA9ICBIZXJvQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0U3RhckZ1c2VMaXN0KCk7XHJcblx0ICAgIGlmICghZGljX2Z1c2VfaW5mbykgcmV0dXJuIGZhbHNlO1xyXG5cdCAgICAvLyAw6KGo56S65YWo6YOo6Iux6ZuEIFxyXG5cdCAgICAvLyB2YXIgY2FtcF9mdXNlX2luZm8gPSBkaWNfZnVzZV9pbmZvWzBdO1xyXG5cclxuXHQgICAgdmFyIGlzX3JlZHBvaW50ID0gdGhpcy5jaGVja0NhbXBTdGFyRnVzZVJlZHBvaW50KGRpY19mdXNlX2luZm8pXHJcblxyXG5cdFx0dmFyIE1haW5TY2VuZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIik7XHJcblx0XHR2YXIgU2NlbmVDb25zdCAgICAgICAgICA9IHJlcXVpcmUoXCJzY2VuZV9jb25zdFwiKTtcclxuXHQgICAgTWFpblNjZW5lQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEJ1aWxkUmVkU3RhdHVzKFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5mdXNlLCBpc19yZWRwb2ludCk7XHJcblxyXG5cdCAgICByZXR1cm4gaXNfcmVkcG9pbnRcclxuXHR9LFxyXG5cclxuXHJcblx0Ly/orqHnrpfnhpTngrznpa3lnZvlkITpmLXokKXnuqLngrlcclxuXHRjaGVja0NhbXBTdGFyRnVzZVJlZHBvaW50OiBmdW5jdGlvbihjYW1wX2Z1c2VfaW5mbykge1xyXG5cdCAgICBpZiAoIWNhbXBfZnVzZV9pbmZvKSByZXR1cm4gZmFsc2U7XHJcblx0ICAgIHZhciBpc19hbGxfcmVkcG9pbnQgPSBmYWxzZTtcclxuXHQgICAgdmFyIGlzX3JlZHBvaW50ID0gZmFsc2U7XHJcblxyXG5cdCAgICBmb3IgKHZhciBkYXRhX2kgaW4gY2FtcF9mdXNlX2luZm8pIHtcclxuXHQgICAgXHR2YXIgZnVzZV9kYXRhID0gY2FtcF9mdXNlX2luZm9bZGF0YV9pXTtcclxuXHQgICAgICAgIGlzX3JlZHBvaW50ID0gdGhpcy5jaGVja1NpbmdsZVN0YXJGdXNlUmVkUG9pbnQoZnVzZV9kYXRhKTtcclxuXHQgICAgICAgIGlmICghaXNfYWxsX3JlZHBvaW50ICYmIGlzX3JlZHBvaW50KVxyXG5cdCAgICAgICAgICAgIGlzX2FsbF9yZWRwb2ludCA9IHRydWU7XHJcblx0ICAgIH1cclxuXHJcblx0ICAgIHJldHVybiBpc19hbGxfcmVkcG9pbnRcdFx0XHJcblx0fSxcclxuXHJcblx0Ly8g6K6h566X5Y2V5Liq6Iux6ZuE5pWw5o2u57qi54K5IFxyXG5cdGNoZWNrU2luZ2xlU3RhckZ1c2VSZWRQb2ludDogZnVuY3Rpb24oZnVzZV9kYXRhKSB7XHJcblx0ICAgIC8vY3VyX3JlZHBvaW50ID09IG5pbCDlsLHmmK/msqHmnInorqHnrpfov4fnuqLngrnnmoRcclxuXHQgICAgaWYgKGZ1c2VfZGF0YS5jdXJfcmVkcG9pbnQpXHJcblx0ICAgICAgICByZXR1cm4gZnVzZV9kYXRhLmN1cl9yZWRwb2ludCA9PSAxO1xyXG5cclxuXHQgICAgaWYgKCFmdXNlX2RhdGEuc3Rhcl9jb25maWcpIHJldHVybjtcclxuXHQgICAgLy8gdmFyIGlzX3JlZHBvaW50LCBuZWVkX2NvdW50LCB0b3RhbF9jb3VudCBcclxuXHQgICAgdmFyIHJlc3VsdCA9IHRoaXMuY2hlY2tTaW5nbGVTdGFyRnVzZVJlZFBvaW50QnlTdGFyQ29uZmlnKGZ1c2VfZGF0YS5zdGFyX2NvbmZpZylcclxuXHJcblx0ICAgIGlmIChyZXN1bHQuaXNfcmVkcG9pbnQpIHtcclxuXHQgICAgICAgIC8vIOaciee6oueCuSDnsbvlnosgMSAg5Zug5Li66J6N5ZCI56Wt5Z2b6YKj6L655o6S5bqP6Zeu6aKYIOi/meagt+WumuS5iSBcclxuXHQgICAgICAgIHJlc3VsdC5jdXJfcmVkcG9pbnQgPSAxO1xyXG5cdFx0ICAgIGZ1c2VfZGF0YS5jdXJfcmVkcG9pbnQgPSAxO1xyXG5cdCAgICB9IGVsc2Uge1xyXG5cdCAgICAgICAgLy8g5rKh5pyJ57qi54K5IOexu+WeiyAyXHJcblx0ICAgICAgICByZXN1bHQuY3VyX3JlZHBvaW50ID0gMjtcclxuXHRcdCAgICBmdXNlX2RhdGEuY3VyX3JlZHBvaW50ID0gMjtcdCAgICAgICAgXHJcblx0ICAgIH1cclxuXHQgICAgZnVzZV9kYXRhLm5lZWRfY291bnQgPSByZXN1bHQubmVlZF9jb3VudCB8fCAwO1xyXG5cdCAgICBmdXNlX2RhdGEudG90YWxfY291bnQgPSByZXN1bHQudG90YWxfY291bnQgfHwgMDtcclxuXHJcblx0ICAgIHJldHVybiByZXN1bHQuaXNfcmVkcG9pbnQ7XHJcblx0fSxcclxuXHJcbn0pO1xyXG5cclxuXHJcbi8vIOWunuS+i+WMluWNleWIqVxyXG5IZXJvQ2FsY3VsYXRlLmdldEluc3RhbmNlID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgICB0aGlzLmluc3RhbmNlID0gbmV3IHRoaXMoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xyXG59XHJcblxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBIZXJvQ2FsY3VsYXRlOyJdfQ==