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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/battle/battle_loop.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, '5a5b5z2plxG9L+PaGlrhlMS', 'battle_loop');
// Scripts/mod/battle/battle_loop.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      假战斗单位生成器
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
window.BattleLoop = {
  /**
   * 初始化对象生成器
   * @param {*} data 
   */
  init: function init(data) {
    this.next_target_type_pos = 1;
    this.next_target_type_kill = 2;
    this.talk_cd = 0;
    this.col_info = [0, 1, 2, 3, 1, 2, 3, 1, 2, 3], this.col_pos_info = [[], [1, 4, 7], [2, 5, 8], [3, 6, 9]], this.idx = 0;
    this.data = data;
    this.a_objects = {};
    this.target_objects = {}; // this.icon_res_list = [5,2,7];
    // this.icon_idx = 0;
 
    this.randWaveTargets();
    this.b_formation_type = data.b_formation_type || 1;
    this.now_num = 0;
    this.max_num = Math.min(data.partner_list.length, 3);
    this.needPlays = {};
    this.last_pos = 0;
    this.last_time = 0;
    this.a_col = {};
    this.target_play = {};
    this.cd_time = 1;
 
    if (data.partner_list.length < 2) {
      this.cd_time = 2;
    }
 
    var config = Config.dungeon_data.data_drama_dungeon_info[data.dun_bid.toString()];
    this.talk_list = config.talk_ids;
    var play = {};
    play.objects = {};
    play.target_list = {};
    play.comabt_type = data.combat_type;
 
    for (var index = 0; index < data.partner_list.length; index++) {
      var element = data.partner_list[index];
      element.playing = 0;
      var temp_pos = index + 1;
      this.a_objects[temp_pos] = element;
      play.objects[temp_pos] = {
        pos: element.pos,
        object_bid: element.bid,
        bid: element.bid,
        star: element.star,
        object_type: 2,
        group: 1,
        hp: element.hp,
        hp_max: element.hp,
        skill_list: [],
        fashion: element.use_skin
      };
      var col = this.col_info[element.pos];
      this.a_col[col] = this.a_col[col] || {
        rnum: 0,
        "enum": 0
      };
      this.a_col[col].rnum += 1;
      this.a_col[col][element.pos] = temp_pos; // this.a_col[col][v.pos] = i;
 
      for (var i = 0; i < element.skill_list.length; i++) {
        var temp = element.skill_list[i];
        play.objects[temp_pos].skill_list.push(temp.sid);
      }
    }
 
    play.target_list[0] = this.nextTarget();
    return play;
  },
  // 产出下一波怪
  nextTarget: function nextTarget() {
    var now = gcore.SmartSocket.getTime();
    if (this.now_num >= this.max_num) return;
    if (this.now_num > 0 && now - this.last_time < this.cd_time) return;
    var pos_list = [];
    var pos_list2 = [];
    var pos = 0;
    var col = 0;
 
    for (var index = 1; index < 10; index++) {
      pos = index + GIRD_POS_OFFSET;
      col = this.col_info[index];
 
      if (this.target_objects[pos] == null && this.a_col[col] != null && this.last_pos != pos && this.a_col[col].rnum > this.a_col[col]["enum"]) {
        pos_list.push(pos);
 
        if (this.col_info[this.last_pos - GIRD_POS_OFFSET] != col) {
          pos_list2.push(pos);
        }
      }
    }
 
    if (pos_list2.length > 0) {
      pos_list = pos_list2;
    }
 
    if (pos_list.length > 0) {
      pos = this.rand_item(pos_list);
      col = this.col_info[pos - GIRD_POS_OFFSET];
      this.a_col[col]["enum"] = this.a_col[col]["enum"] + 1;
      var target = this.rand_item(this.b_objects);
      this.target_objects[pos] = target;
      this.needPlays[pos] = 1;
      this.last_pos = pos;
      this.last_time = now; // var icon = this.icon_res_list[this.icon_idx];
      // this.icon_idx = this.icon_idx % (this.icon_res_list.length) + 1
 
      this.now_num += 1;
      var play = this.init_play(pos);
      this.target_play[pos] = play;
      return {
        pos: pos,
        object_bid: target.bid,
        bid: target.bid,
        star: target.star,
        object_type: 3,
        group: 2,
        hp: target.hp,
        hp_max: target.hp,
        skill_list: [],
        actor: play.actor,
        effect_bid: play.effect_bid
      };
    }
  },
  // 技能播报计算
  init_play: function init_play(pos) {
    if (pos == null) return;
    var target = this.target_objects[pos];
    if (target == null || !this.needPlays[pos]) return;
    var a_idx = this.selectActor(pos);
    this.needPlays[pos] = a_idx;
    var actor = this.a_objects[a_idx];
    actor.playing = actor.playing + 1;
    var skill = this.rand_item_by_key(actor.skill_list, 'rand');
    var play = {
      skill_plays: [],
      actor: actor.pos,
      target: pos,
      skill_bid: skill.sid
    };
    var skill_idx = 1;
    var effect_idx = 1;
    var rand_object = this.rand_talk();
    var talk_pos = rand_object && rand_object.talk_pos ? rand_object.talk_pos : 0;
    var talk_content = rand_object && rand_object.talk_content ? rand_object.talk_content : "";
    var skill_play = {
      order: skill_idx,
      bid: actor.bid,
      actor: actor.pos,
      target: pos,
      skill_bid: skill.sid,
      effect_play: [],
      talk_pos: talk_pos,
      talk_content: talk_content
    };
    var hp = target.hp;
 
    for (var index = 0; index < skill.effect_list.length; index++) {
      var element = skill.effect_list[index];
      play.effect_bid = element.eid;
      var hurt = Utils.randomNum(element.min_hurt, element.max_hurt);
      var is_crit = 0;
      var tmp_crit = Utils.randomNum(0, 1000);
 
      if (tmp_crit < actor.crit) {
        hurt = Math.ceil(hurt * 1.5);
        is_crit = 1;
      }
 
      var dec_hp = hurt;
 
      if (index != skill.effect_list.length - 1) {
        dec_hp = Math.ceil(Math.min(hurt, hp) / skill.effect_list.length);
      }
 
      hp = Math.max(hp - dec_hp);
      var effect_play = {
        order: effect_idx,
        actor: actor.pos,
        target: pos,
        effect_bid: element.eid,
        hp: hp,
        hurt: -hurt,
        is_crit: is_crit
      };
      skill_play.effect_play.push(effect_play);
      effect_idx += 1;
    }
 
    play.skill_plays.push(skill_play);
    return play;
  },
  // 
  play: function play(pos) {
    var play = this.target_play[pos];
    this.target_play[pos] = null;
    return play;
  },
  // 选择进攻者(选在同行中,优先前排英雄)
  selectActor: function selectActor(pos) {
    var logic_pos = pos - GIRD_POS_OFFSET;
    var col = this.col_info[logic_pos];
    var col_pos = this.col_pos_info[col];
    var a_col_pos = this.a_col[col];
    var a_idx = 0;
    var a_front_idx = 0;
 
    for (var index = 0; index < col_pos.length; index++) {
      var a_pos = col_pos[index];
      a_idx = a_col_pos[a_pos];
 
      if (a_idx) {
        a_front_idx = a_front_idx || a_idx;
 
        if (this.a_objects[a_idx].playing == 0) {
          return a_idx;
        }
      }
    }
 
    return a_front_idx;
  },
  // 技能播放完成
  playEnd: function playEnd(pos) {
    var a_idx = this.needPlays[pos];
 
    if (a_idx) {
      var actor = this.a_objects[a_idx];
      actor.playing -= 1;
    }
 
    this.needPlays[pos] = null;
    this.target_objects[pos] = null;
    this.now_num -= 1;
    var col = this.col_info[pos - GIRD_POS_OFFSET];
 
    if (this.a_col[col]) {
      this.a_col[col]["enum"] -= 1;
    }
  },
  // 随机说话
  rand_talk: function rand_talk() {
    this.talk_cd = this.talk_cd - 1;
    if (this.talk_cd > 0) return;
    var talk = this.rand_item_by_key2(this.talk_list, 1, 10000);
 
    if (talk && talk[0]) {
      this.talk_cd = 5;
      var target = this.rand_item(this.a_objects);
      var idx = talk[0] || 1;
      var config = Config.dungeon_data.data_drama_talk[idx.toString()];
      return {
        talk_pos: target.pos,
        talk_content: config.talk
      };
    }
  },
  randWaveTargets: function randWaveTargets() {
    if (this.idx % 10 == 0) {
      this.b_objects = this.rand_item(this.data.wave_list).unit_list;
    }
 
    this.idx += 1;
  },
  // 随机从里面取出一项
  rand_item: function rand_item(tab) {
    if (tab instanceof Array) {
      var length = tab.length;
      var index = Utils.randomNum(1, length);
      return tab[index - 1];
    } else {
      var temp_ary = [];
 
      for (var key in tab) {
        temp_ary.push(key);
      }
 
      var _length = temp_ary.length;
      var index = Utils.randomNum(1, _length);
      var tab_key = temp_ary[index - 1];
      return tab[tab_key];
    }
  },
  // 按指定建随机一项
  rand_item_by_key: function rand_item_by_key(tab, key) {
    var sum = 0;
 
    for (var index = 0; index < tab.length; index++) {
      var element = tab[index];
      sum = sum + element[key];
    }
 
    return this.rand_item_by_key2(tab, key, sum);
  },
  rand_item_by_key2: function rand_item_by_key2(tab, key, sum) {
    var rank = Utils.randomNum(1, sum);
 
    for (var index = 0; index < tab.length; index++) {
      var element = tab[index];
      sum = sum - element[key];
 
      if (rank >= sum) {
        return element;
      }
    }
  }
}; // module.exports = BattleLoop;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYXR0bGVcXGJhdHRsZV9sb29wLmpzIl0sIm5hbWVzIjpbIndpbmRvdyIsIkJhdHRsZUxvb3AiLCJpbml0IiwiZGF0YSIsIm5leHRfdGFyZ2V0X3R5cGVfcG9zIiwibmV4dF90YXJnZXRfdHlwZV9raWxsIiwidGFsa19jZCIsImNvbF9pbmZvIiwiY29sX3Bvc19pbmZvIiwiaWR4IiwiYV9vYmplY3RzIiwidGFyZ2V0X29iamVjdHMiLCJyYW5kV2F2ZVRhcmdldHMiLCJiX2Zvcm1hdGlvbl90eXBlIiwibm93X251bSIsIm1heF9udW0iLCJNYXRoIiwibWluIiwicGFydG5lcl9saXN0IiwibGVuZ3RoIiwibmVlZFBsYXlzIiwibGFzdF9wb3MiLCJsYXN0X3RpbWUiLCJhX2NvbCIsInRhcmdldF9wbGF5IiwiY2RfdGltZSIsImNvbmZpZyIsIkNvbmZpZyIsImR1bmdlb25fZGF0YSIsImRhdGFfZHJhbWFfZHVuZ2Vvbl9pbmZvIiwiZHVuX2JpZCIsInRvU3RyaW5nIiwidGFsa19saXN0IiwidGFsa19pZHMiLCJwbGF5Iiwib2JqZWN0cyIsInRhcmdldF9saXN0IiwiY29tYWJ0X3R5cGUiLCJjb21iYXRfdHlwZSIsImluZGV4IiwiZWxlbWVudCIsInBsYXlpbmciLCJ0ZW1wX3BvcyIsInBvcyIsIm9iamVjdF9iaWQiLCJiaWQiLCJzdGFyIiwib2JqZWN0X3R5cGUiLCJncm91cCIsImhwIiwiaHBfbWF4Iiwic2tpbGxfbGlzdCIsImZhc2hpb24iLCJ1c2Vfc2tpbiIsImNvbCIsInJudW0iLCJpIiwidGVtcCIsInB1c2giLCJzaWQiLCJuZXh0VGFyZ2V0Iiwibm93IiwiZ2NvcmUiLCJTbWFydFNvY2tldCIsImdldFRpbWUiLCJwb3NfbGlzdCIsInBvc19saXN0MiIsIkdJUkRfUE9TX09GRlNFVCIsInJhbmRfaXRlbSIsInRhcmdldCIsImJfb2JqZWN0cyIsImluaXRfcGxheSIsImFjdG9yIiwiZWZmZWN0X2JpZCIsImFfaWR4Iiwic2VsZWN0QWN0b3IiLCJza2lsbCIsInJhbmRfaXRlbV9ieV9rZXkiLCJza2lsbF9wbGF5cyIsInNraWxsX2JpZCIsInNraWxsX2lkeCIsImVmZmVjdF9pZHgiLCJyYW5kX29iamVjdCIsInJhbmRfdGFsayIsInRhbGtfcG9zIiwidGFsa19jb250ZW50Iiwic2tpbGxfcGxheSIsIm9yZGVyIiwiZWZmZWN0X3BsYXkiLCJlZmZlY3RfbGlzdCIsImVpZCIsImh1cnQiLCJVdGlscyIsInJhbmRvbU51bSIsIm1pbl9odXJ0IiwibWF4X2h1cnQiLCJpc19jcml0IiwidG1wX2NyaXQiLCJjcml0IiwiY2VpbCIsImRlY19ocCIsIm1heCIsImxvZ2ljX3BvcyIsImNvbF9wb3MiLCJhX2NvbF9wb3MiLCJhX2Zyb250X2lkeCIsImFfcG9zIiwicGxheUVuZCIsInRhbGsiLCJyYW5kX2l0ZW1fYnlfa2V5MiIsImRhdGFfZHJhbWFfdGFsayIsIndhdmVfbGlzdCIsInVuaXRfbGlzdCIsInRhYiIsIkFycmF5IiwidGVtcF9hcnkiLCJrZXkiLCJ0YWJfa2V5Iiwic3VtIiwicmFuayJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQUEsTUFBTSxDQUFDQyxVQUFQLEdBQW9CO0FBQ2hCOzs7O0FBSUFDLEVBQUFBLElBQUksRUFBQyxjQUFTQyxJQUFULEVBQWM7QUFDZixTQUFLQyxvQkFBTCxHQUE0QixDQUE1QjtBQUNBLFNBQUtDLHFCQUFMLEdBQTZCLENBQTdCO0FBQ0EsU0FBS0MsT0FBTCxHQUFlLENBQWY7QUFDQSxTQUFLQyxRQUFMLEdBQWdCLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsQ0FBbkIsRUFBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsRUFBNEIsQ0FBNUIsQ0FBaEIsRUFDQSxLQUFLQyxZQUFMLEdBQW9CLENBQUMsRUFBRCxFQUFLLENBQUMsQ0FBRCxFQUFJLENB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QW5CO0FBQ0ErRSxNQUFBQSxHQUFHLEdBQUdBLEdBQUcsR0FBRzlFLE9BQU8sQ0FBQzRFLEdBQUQsQ0FBbkI7QUFDSDs7QUFDRCxXQUFPLEtBQUtQLGlCQUFMLENBQXVCSSxHQUF2QixFQUE0QkcsR0FBNUIsRUFBaUNFLEdBQWpDLENBQVA7QUFDSCxHQXRPZTtBQXdPaEJULEVBQUFBLGlCQUFpQixFQUFDLDJCQUFTSSxHQUFULEVBQWNHLEdBQWQsRUFBbUJFLEdBQW5CLEVBQXVCO0FBQ3JDLFFBQUlDLElBQUksR0FBRzNCLEtBQUssQ0FBQ0MsU0FBTixDQUFnQixDQUFoQixFQUFtQnlCLEdBQW5CLENBQVg7O0FBQ0EsU0FBSyxJQUFJL0UsS0FBSyxHQUFHLENBQWpCLEVBQW9CQSxLQUFLLEdBQUcwRSxHQUFHLENBQUM5RixNQUFoQyxFQUF3Q29CLEtBQUssRUFBN0MsRUFBaUQ7QUFDN0MsVUFBTUMsT0FBTyxHQUFHeUUsR0FBRyxDQUFDMUUsS0FBRCxDQUFuQjtBQUNBK0UsTUFBQUEsR0FBRyxHQUFHQSxHQUFHLEdBQUc5RSxPQUFPLENBQUM0RSxHQUFELENBQW5COztBQUNBLFVBQUlHLElBQUksSUFBSUQsR0FBWixFQUFnQjtBQUNaLGVBQVE5RSxPQUFSO0FBQ0g7QUFDSjtBQUNKO0FBalBlLENBQXBCLEVBbVBBIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDlgYfmiJjmlpfljZXkvY3nlJ/miJDlmahcbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbndpbmRvdy5CYXR0bGVMb29wID0ge1xuICAgIC8qKlxuICAgICAqIOWIneWni+WMluWvueixoeeUn+aIkOWZqFxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBcbiAgICAgKi9cbiAgICBpbml0OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICB0aGlzLm5leHRfdGFyZ2V0X3R5cGVfcG9zID0gMTtcbiAgICAgICAgdGhpcy5uZXh0X3RhcmdldF90eXBlX2tpbGwgPSAyO1xuICAgICAgICB0aGlzLnRhbGtfY2QgPSAwO1xuICAgICAgICB0aGlzLmNvbF9pbmZvID0gWzAsIDEsIDIsIDMsIDEsIDIsIDMsIDEsIDIsIDNdLFxuICAgICAgICB0aGlzLmNvbF9wb3NfaW5mbyA9IFtbXSwgWzEsIDQsIDddLCBbMiwgNSwgOF0sIFszLCA2LCA5XV0sXG5cbiAgICAgICAgdGhpcy5pZHggPSAwO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmFfb2JqZWN0cyA9IHt9O1xuICAgICAgICB0aGlzLnRhcmdldF9vYmplY3RzID0ge307XG4gICAgICAgIC8vIHRoaXMuaWNvbl9yZXNfbGlzdCA9IFs1LDIsN107XG4gICAgICAgIC8vIHRoaXMuaWNvbl9pZHggPSAwO1xuICAgICAgICB0aGlzLnJhbmRXYXZlVGFyZ2V0cygpO1xuICAgICAgICB0aGlzLmJfZm9ybWF0aW9uX3R5cGUgPSBkYXRhLmJfZm9ybWF0aW9uX3R5cGUgfHwgMTtcbiAgICAgICAgdGhpcy5ub3dfbnVtID0gMDtcbiAgICAgICAgdGhpcy5tYXhfbnVtID0gTWF0aC5taW4oZGF0YS5wYXJ0bmVyX2xpc3QubGVuZ3RoLCAzKTtcbiAgICAgICAgdGhpcy5uZWVkUGxheXMgPSB7fTtcbiAgICAgICAgdGhpcy5sYXN0X3BvcyA9IDA7XG4gICAgICAgIHRoaXMubGFzdF90aW1lID0gMDtcbiAgICAgICAgdGhpcy5hX2NvbCA9IHt9XG4gICAgICAgIHRoaXMudGFyZ2V0X3BsYXkgPSB7fTtcbiAgICAgICAgdGhpcy5jZF90aW1lID0gMTtcbiAgICAgICAgaWYgKGRhdGEucGFydG5lcl9saXN0Lmxlbmd0aCA8IDIpe1xuICAgICAgICAgICAgdGhpcy5jZF90aW1lID0gMjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25maWcgPSBDb25maWcuZHVuZ2Vvbl9kYXRhLmRhdGFfZHJhbWFfZHVuZ2Vvbl9pbmZvW2RhdGEuZHVuX2JpZC50b1N0cmluZygpXTtcbiAgICAgICAgdGhpcy50YWxrX2xpc3QgPSBjb25maWcudGFsa19pZHM7XG4gICAgICAgIHZhciBwbGF5ID0ge307XG4gICAgICAgIHBsYXkub2JqZWN0cyA9IHt9O1xuICAgICAgICBwbGF5LnRhcmdldF9saXN0ID0ge307XG4gICAgICAgIHBsYXkuY29tYWJ0X3R5cGUgPSBkYXRhLmNvbWJhdF90eXBlO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YS5wYXJ0bmVyX2xpc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IGRhdGEucGFydG5lcl9saXN0W2luZGV4XTtcbiAgICAgICAgICAgIGVsZW1lbnQucGxheWluZyA9IDA7XG4gICAgICAgICAgICB2YXIgdGVtcF9wb3MgPSBpbmRleCArIDE7XG4gICAgICAgICAgICB0aGlzLmFfb2JqZWN0c1t0ZW1wX3Bvc10gPSBlbGVtZW50O1xuICAgICAgICAgICAgcGxheS5vYmplY3RzW3RlbXBfcG9zXSA9IHsgcG9zOiBlbGVtZW50LnBvcywgb2JqZWN0X2JpZDogZWxlbWVudC5iaWQsIGJpZDogZWxlbWVudC5iaWQsIHN0YXI6IGVsZW1lbnQuc3Rhciwgb2JqZWN0X3R5cGU6IDIsIGdyb3VwOiAxLCBocDogZWxlbWVudC5ocCwgaHBfbWF4OiBlbGVtZW50LmhwLCBza2lsbF9saXN0OiBbXSwgZmFzaGlvbjogZWxlbWVudC51c2Vfc2tpbiB9O1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xfaW5mb1tlbGVtZW50LnBvc107XG4gICAgICAgICAgICB0aGlzLmFfY29sW2NvbF0gPSB0aGlzLmFfY29sW2NvbF0gfHwge3JudW06MCwgZW51bTowfTtcbiAgICAgICAgICAgIHRoaXMuYV9jb2xbY29sXS5ybnVtICs9IDE7XG4gICAgICAgICAgICB0aGlzLmFfY29sW2NvbF1bZWxlbWVudC5wb3NdID0gdGVtcF9wb3M7XG4gICAgICAgICAgICAvLyB0aGlzLmFfY29sW2NvbF1bdi5wb3NdID0gaTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5za2lsbF9saXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IGVsZW1lbnQuc2tpbGxfbGlzdFtpXTtcbiAgICAgICAgICAgICAgICBwbGF5Lm9iamVjdHNbdGVtcF9wb3NdLnNraWxsX2xpc3QucHVzaCh0ZW1wLnNpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGxheS50YXJnZXRfbGlzdFswXSA9IHRoaXMubmV4dFRhcmdldCgpO1xuICAgICAgICByZXR1cm4gcGxheTtcbiAgICB9LFxuXG4gICAgLy8g5Lqn5Ye65LiL5LiA5rOi5oCqXG4gICAgbmV4dFRhcmdldDpmdW5jdGlvbigpe1xuICAgICAgICBjb25zdCBub3cgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XG4gICAgICAgIGlmICh0aGlzLm5vd19udW0gPj0gdGhpcy5tYXhfbnVtKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLm5vd19udW0gPiAwICYmIChub3cgLSB0aGlzLmxhc3RfdGltZSA8IHRoaXMuY2RfdGltZSkpIHJldHVybjtcbiAgICAgICAgdmFyIHBvc19saXN0ID0gW107XG4gICAgICAgIHZhciBwb3NfbGlzdDIgPSBbXTtcbiAgICAgICAgdmFyIHBvcyA9IDA7XG4gICAgICAgIHZhciBjb2wgPSAwO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgMTA7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHBvcyA9IGluZGV4ICsgR0lSRF9QT1NfT0ZGU0VUO1xuICAgICAgICAgICAgY29sID0gdGhpcy5jb2xfaW5mb1tpbmRleF07XG4gICAgICAgICAgICBpZiAodGhpcy50YXJnZXRfb2JqZWN0c1twb3NdID09IG51bGwgJiYgdGhpcy5hX2NvbFtjb2xdICE9IG51bGwgJiYgdGhpcy5sYXN0X3BvcyAhPSBwb3MgJiYgKHRoaXMuYV9jb2xbY29sXS5ybnVtID4gdGhpcy5hX2NvbFtjb2xdLmVudW0pKXtcbiAgICAgICAgICAgICAgICBwb3NfbGlzdC5wdXNoKHBvcyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sX2luZm9bdGhpcy5sYXN0X3BvcyAtIEdJUkRfUE9TX09GRlNFVF0gIT0gY29sKXtcbiAgICAgICAgICAgICAgICAgICAgcG9zX2xpc3QyLnB1c2gocG9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvc19saXN0Mi5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIHBvc19saXN0ID0gcG9zX2xpc3QyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NfbGlzdC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIHBvcyA9IHRoaXMucmFuZF9pdGVtKHBvc19saXN0KTtcbiAgICAgICAgICAgIGNvbCA9IHRoaXMuY29sX2luZm9bcG9zLUdJUkRfUE9TX09GRlNFVF07XG4gICAgICAgICAgICB0aGlzLmFfY29sW2NvbF0uZW51bSA9IHRoaXMuYV9jb2xbY29sXS5lbnVtICsgMTtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLnJhbmRfaXRlbSh0aGlzLmJfb2JqZWN0cyk7XG4gICAgICAgICAgICB0aGlzLnRhcmdldF9vYmplY3RzW3Bvc10gPSB0YXJnZXQ7XG4gICAgICAgICAgICB0aGlzLm5lZWRQbGF5c1twb3NdID0gMTtcbiAgICAgICAgICAgIHRoaXMubGFzdF9wb3MgPSBwb3M7XG4gICAgICAgICAgICB0aGlzLmxhc3RfdGltZSA9IG5vdztcbiAgICAgICAgICAgIC8vIHZhciBpY29uID0gdGhpcy5pY29uX3Jlc19saXN0W3RoaXMuaWNvbl9pZHhdO1xuICAgICAgICAgICAgLy8gdGhpcy5pY29uX2lkeCA9IHRoaXMuaWNvbl9pZHggJSAodGhpcy5pY29uX3Jlc19saXN0Lmxlbmd0aCkgKyAxXG4gICAgICAgICAgICB0aGlzLm5vd19udW0gKz0gMTtcbiAgICAgICAgICAgIHZhciBwbGF5ID0gdGhpcy5pbml0X3BsYXkocG9zKTtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0X3BsYXlbcG9zXSA9IHBsYXk7XG4gICAgICAgICAgICByZXR1cm4geyBwb3M6IHBvcywgb2JqZWN0X2JpZDp0YXJnZXQuYmlkLCBiaWQ6IHRhcmdldC5iaWQsIHN0YXI6IHRhcmdldC5zdGFyLCBvYmplY3RfdHlwZTogMywgZ3JvdXA6IDIsIGhwOiB0YXJnZXQuaHAsIGhwX21heDogdGFyZ2V0LmhwLCBza2lsbF9saXN0OiBbXSwgYWN0b3I6IHBsYXkuYWN0b3IsIGVmZmVjdF9iaWQ6IHBsYXkuZWZmZWN0X2JpZH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmioDog73mkq3miqXorqHnrpdcbiAgICBpbml0X3BsYXk6ZnVuY3Rpb24gKHBvcyl7XG4gICAgICAgIGlmIChwb3MgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy50YXJnZXRfb2JqZWN0c1twb3NdO1xuICAgICAgICBpZih0YXJnZXQgPT0gbnVsbCB8fCAhdGhpcy5uZWVkUGxheXNbcG9zXSkgcmV0dXJuO1xuICAgICAgICB2YXIgYV9pZHggPSB0aGlzLnNlbGVjdEFjdG9yKHBvcyk7XG4gICAgICAgIHRoaXMubmVlZFBsYXlzW3Bvc10gPSBhX2lkeDtcbiAgICAgICAgdmFyIGFjdG9yID0gdGhpcy5hX29iamVjdHNbYV9pZHhdO1xuICAgICAgICBhY3Rvci5wbGF5aW5nID0gYWN0b3IucGxheWluZyArIDE7XG4gICAgICAgIHZhciBza2lsbCA9IHRoaXMucmFuZF9pdGVtX2J5X2tleShhY3Rvci5za2lsbF9saXN0LCAncmFuZCcpO1xuICAgICAgICB2YXIgcGxheSA9IHsgc2tpbGxfcGxheXM6IFtdLCBhY3RvcjogYWN0b3IucG9zLCB0YXJnZXQ6IHBvcywgc2tpbGxfYmlkOiBza2lsbC5zaWQgfTtcbiAgICAgICAgdmFyIHNraWxsX2lkeCA9IDE7XG4gICAgICAgIHZhciBlZmZlY3RfaWR4ID0gMTtcbiAgICAgICAgdmFyIHJhbmRfb2JqZWN0ID0gdGhpcy5yYW5kX3RhbGsoKTtcbiAgICAgICAgdmFyIHRhbGtfcG9zID0gKHJhbmRfb2JqZWN0ICYmIHJhbmRfb2JqZWN0LnRhbGtfcG9zKSA/IHJhbmRfb2JqZWN0LnRhbGtfcG9zIDogMDtcbiAgICAgICAgdmFyIHRhbGtfY29udGVudCA9IChyYW5kX29iamVjdCAmJiByYW5kX29iamVjdC50YWxrX2NvbnRlbnQpID8gcmFuZF9vYmplY3QudGFsa19jb250ZW50IDogXCJcIjtcbiAgICAgICAgdmFyIHNraWxsX3BsYXkgPSB7IG9yZGVyOiBza2lsbF9pZHgsIGJpZDogYWN0b3IuYmlkLCBhY3RvcjogYWN0b3IucG9zLCB0YXJnZXQ6IHBvcywgc2tpbGxfYmlkOiBza2lsbC5zaWQsIGVmZmVjdF9wbGF5OiBbXSwgdGFsa19wb3M6IHRhbGtfcG9zLCB0YWxrX2NvbnRlbnQ6IHRhbGtfY29udGVudCB9ICAgICAgICBcbiAgICAgICAgdmFyIGhwID0gdGFyZ2V0LmhwXG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNraWxsLmVmZmVjdF9saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHNraWxsLmVmZmVjdF9saXN0W2luZGV4XTtcbiAgICAgICAgICAgIHBsYXkuZWZmZWN0X2JpZCA9IGVsZW1lbnQuZWlkO1xuICAgICAgICAgICAgdmFyIGh1cnQgPSBVdGlscy5yYW5kb21OdW0oZWxlbWVudC5taW5faHVydCwgZWxlbWVudC5tYXhfaHVydCk7XG4gICAgICAgICAgICB2YXIgaXNfY3JpdCA9IDA7XG4gICAgICAgICAgICB2YXIgdG1wX2NyaXQgPSBVdGlscy5yYW5kb21OdW0oMCwgMTAwMCk7XG4gICAgICAgICAgICBpZiAodG1wX2NyaXQgPCBhY3Rvci5jcml0KXtcbiAgICAgICAgICAgICAgICBodXJ0ID0gTWF0aC5jZWlsKGh1cnQgKiAxLjUpO1xuICAgICAgICAgICAgICAgIGlzX2NyaXQgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRlY19ocCA9IGh1cnQ7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT0gKHNraWxsLmVmZmVjdF9saXN0Lmxlbmd0aCAtIDEpKXtcbiAgICAgICAgICAgICAgICBkZWNfaHAgPSBNYXRoLmNlaWwoTWF0aC5taW4oaHVydCwgaHApIC8gKHNraWxsLmVmZmVjdF9saXN0Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaHAgPSBNYXRoLm1heChocCAtIGRlY19ocCk7XG4gICAgICAgICAgICB2YXIgZWZmZWN0X3BsYXkgPSB7IG9yZGVyOiBlZmZlY3RfaWR4LCBhY3RvcjogYWN0b3IucG9zLCB0YXJnZXQ6IHBvcywgZWZmZWN0X2JpZDogZWxlbWVudC5laWQsIGhwOiBocCwgaHVydDogLWh1cnQsIGlzX2NyaXQ6IGlzX2NyaXQgfVxuICAgICAgICAgICAgc2tpbGxfcGxheS5lZmZlY3RfcGxheS5wdXNoKGVmZmVjdF9wbGF5KTtcbiAgICAgICAgICAgIGVmZmVjdF9pZHggKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBwbGF5LnNraWxsX3BsYXlzLnB1c2goc2tpbGxfcGxheSk7XG4gICAgICAgIHJldHVybiBwbGF5O1xuICAgIH0sXG5cbiAgICAvLyBcbiAgICBwbGF5OmZ1bmN0aW9uKHBvcyl7XG4gICAgICAgIHZhciBwbGF5ID0gdGhpcy50YXJnZXRfcGxheVtwb3NdO1xuICAgICAgICB0aGlzLnRhcmdldF9wbGF5W3Bvc10gPSBudWxsO1xuICAgICAgICByZXR1cm4gcGxheTtcbiAgICB9LFxuXG4gICAgLy8g6YCJ5oup6L+b5pS76ICFKOmAieWcqOWQjOihjOS4rSzkvJjlhYjliY3mjpLoi7Hpm4QpXG4gICAgc2VsZWN0QWN0b3I6ZnVuY3Rpb24ocG9zKXtcbiAgICAgICAgdmFyIGxvZ2ljX3BvcyA9IHBvcyAtIEdJUkRfUE9TX09GRlNFVDtcbiAgICAgICAgdmFyIGNvbCA9IHRoaXMuY29sX2luZm9bbG9naWNfcG9zXTtcbiAgICAgICAgdmFyIGNvbF9wb3MgPSB0aGlzLmNvbF9wb3NfaW5mb1tjb2xdO1xuICAgICAgICB2YXIgYV9jb2xfcG9zID0gdGhpcy5hX2NvbFtjb2xdO1xuICAgICAgICB2YXIgYV9pZHggPSAwO1xuICAgICAgICB2YXIgYV9mcm9udF9pZHggPSAwO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29sX3Bvcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGFfcG9zID0gY29sX3Bvc1tpbmRleF07XG4gICAgICAgICAgICBhX2lkeCA9IGFfY29sX3Bvc1thX3Bvc11cbiAgICAgICAgICAgIGlmIChhX2lkeCl7XG4gICAgICAgICAgICAgICAgYV9mcm9udF9pZHggPSBhX2Zyb250X2lkeCB8fCBhX2lkeDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hX29iamVjdHNbYV9pZHhdLnBsYXlpbmcgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYV9pZHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhX2Zyb250X2lkeDtcbiAgICB9LFxuXG4gICAgLy8g5oqA6IO95pKt5pS+5a6M5oiQXG4gICAgcGxheUVuZDpmdW5jdGlvbihwb3Mpe1xuICAgICAgICB2YXIgYV9pZHggPSB0aGlzLm5lZWRQbGF5c1twb3NdO1xuICAgICAgICBpZiAoYV9pZHgpe1xuICAgICAgICAgICAgdmFyIGFjdG9yID0gdGhpcy5hX29iamVjdHNbYV9pZHhdO1xuICAgICAgICAgICAgYWN0b3IucGxheWluZyAtPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmVlZFBsYXlzW3Bvc10gPSBudWxsO1xuICAgICAgICB0aGlzLnRhcmdldF9vYmplY3RzW3Bvc10gPSBudWxsO1xuICAgICAgICB0aGlzLm5vd19udW0gLT0gMTtcbiAgICAgICAgdmFyIGNvbCA9IHRoaXMuY29sX2luZm9bcG9zIC0gR0lSRF9QT1NfT0ZGU0VUXTtcbiAgICAgICAgaWYgKHRoaXMuYV9jb2xbY29sXSl7XG4gICAgICAgICAgICB0aGlzLmFfY29sW2NvbF0uZW51bSAtPSAxO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOmaj+acuuivtOivnVxuICAgIHJhbmRfdGFsazpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLnRhbGtfY2QgPSB0aGlzLnRhbGtfY2QgLSAxO1xuICAgICAgICBpZiAodGhpcy50YWxrX2NkID4gMCkgcmV0dXJuO1xuICAgICAgICB2YXIgdGFsayA9IHRoaXMucmFuZF9pdGVtX2J5X2tleTIodGhpcy50YWxrX2xpc3QsIDEsIDEwMDAwKVxuICAgICAgICBpZiAodGFsayAmJiB0YWxrWzBdKXtcbiAgICAgICAgICAgIHRoaXMudGFsa19jZCA9IDU7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5yYW5kX2l0ZW0odGhpcy5hX29iamVjdHMpO1xuICAgICAgICAgICAgdmFyIGlkeCA9IHRhbGtbMF0gfHwgMTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IENvbmZpZy5kdW5nZW9uX2RhdGEuZGF0YV9kcmFtYV90YWxrW2lkeC50b1N0cmluZygpXTtcbiAgICAgICAgICAgIHJldHVybiB7dGFsa19wb3M6dGFyZ2V0LnBvcywgdGFsa19jb250ZW50OmNvbmZpZy50YWxrfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJhbmRXYXZlVGFyZ2V0czpmdW5jdGlvbigpe1xuICAgICAgICBpZiAodGhpcy5pZHggJSAxMCA9PSAwKXtcbiAgICAgICAgICAgIHRoaXMuYl9vYmplY3RzID0gdGhpcy5yYW5kX2l0ZW0odGhpcy5kYXRhLndhdmVfbGlzdCkudW5pdF9saXN0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaWR4ICs9IDE7XG4gICAgfSxcblxuICAgIC8vIOmaj+acuuS7jumHjOmdouWPluWHuuS4gOmhuVxuICAgIHJhbmRfaXRlbTpmdW5jdGlvbih0YWIpe1xuICAgICAgICBpZiAodGFiIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHRhYi5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBVdGlscy5yYW5kb21OdW0oMSwgbGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiB0YWJbaW5kZXggLSAxXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0ZW1wX2FyeSA9IFtdXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGFiKSB7XG4gICAgICAgICAgICAgICAgdGVtcF9hcnkucHVzaChrZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSB0ZW1wX2FyeS5sZW5ndGhcbiAgICAgICAgICAgIHZhciBpbmRleCA9IFV0aWxzLnJhbmRvbU51bSgxLCBsZW5ndGgpO1xuICAgICAgICAgICAgdmFyIHRhYl9rZXkgPSB0ZW1wX2FyeVtpbmRleCAtIDFdO1xuICAgICAgICAgICAgcmV0dXJuIHRhYlt0YWJfa2V5XTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmjInmjIflrprlu7rpmo/mnLrkuIDpoblcbiAgICByYW5kX2l0ZW1fYnlfa2V5OmZ1bmN0aW9uKHRhYiwga2V5KXtcbiAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0YWIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGFiW2luZGV4XTtcbiAgICAgICAgICAgIHN1bSA9IHN1bSArIGVsZW1lbnRba2V5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yYW5kX2l0ZW1fYnlfa2V5Mih0YWIsIGtleSwgc3VtKTtcbiAgICB9LFxuXG4gICAgcmFuZF9pdGVtX2J5X2tleTI6ZnVuY3Rpb24odGFiLCBrZXksIHN1bSl7XG4gICAgICAgIHZhciByYW5rID0gVXRpbHMucmFuZG9tTnVtKDEsIHN1bSk7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0YWIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGFiW2luZGV4XTtcbiAgICAgICAgICAgIHN1bSA9IHN1bSAtIGVsZW1lbnRba2V5XTtcbiAgICAgICAgICAgIGlmIChyYW5rID49IHN1bSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuICBlbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbn07XG4vLyBtb2R1bGUuZXhwb3J0cyA9IEJhdHRsZUxvb3A7Il19