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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/guild/guild_model.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, 'e3e73qrgAxPZb0kkCHS45i4', 'guild_model');
// Scripts/mod/guild/guild_model.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      这里填写详细说明,主要填写该模块的功能简要
// <br/>Create: 2019-01-14 10:57:08
// --------------------------------------------------------------------
var GuildListVo = require("guild_list_vo");
 
var GuildConst = require("guild_const");
 
var GuildEvent = require("guild_event");
 
var GuildMyInfoVo = require("guild_my_info_vo");
 
var RoleController = require("role_controller");
 
var GuildMemberVo = require("guild_member_vo");
 
var MainuiController = require("mainui_controller");
 
var MainuiConst = require("mainui_const");
 
var GuildModel = cc.Class({
  "extends": BaseClass,
  ctor: function ctor() {
    var GuildController = require("guild_controller");
 
    this.ctrl = GuildController.getInstance();
    this.guild_cache_list = {}; // 缓存的当前服务器列表
 
    this.guild_apply_list = {}; // 公会申请列表
 
    this.donate_sum = 0; // 今天已经捐献的次数
 
    this.guild_member_list = {}; // 成员列表
 
    this.guild_list = []; // 当前所有的公会列表
 
    this.guild_search_list = []; // 当前待查找的公会列表
 
    this.my_guild_assistant = {}; // 当前副会长的数据
 
    this.guild_red_status_list = {}; // 公会红点的状态
 
    this.guild_donate_activity_list = []; // 捐献活跃宝箱清空
  },
  properties: {},
  initConfig: function initConfig() {},
  updateGuildList: function updateGuildList(name, data_list) {
    if (name == "") {
      this.guild_list = [];
 
      for (var i in data_list) {
        var v = data_list[i];
        var guild_vo = this.guild_cache_list[Utils.getNorKey(v.gid, v.gsrv_id)];
 
        if (guild_vo == null) {
          guild_vo = new GuildListVo();
          this.guild_cache_list[Utils.getNorKey(v.gid, v.gsrv_id)] = guild_vo;
        }
 
        guild_vo.updateData(v);
        this.guild_list.push(guild_vo);
      }
    } else {
      this.guild_search_list = [];
 
      for (var i in data_list) {
        var v = data_list[i];
        var guild_vo = this.guild_cache_list[Utils.getNorKey(v.gid, v.gsrv_id)];
 
        if (guild_vo == null) {
          guild_vo = new GuildListVo();
          this.guild_cache_list[Utils.getNorKey(v.gid, v.gsrv_id)] = guild_vo;
        }
 
        guild_vo.updateData(v);
        this.guild_search_list.push(guild_vo);
      }
    }
 
    var type = GuildConst.list_type.total;
    var guild_list = this.guild_list;
 
    if (name != "") {
      type = GuildConst.list_type.search;
      guild_list = this.guild_search_list;
    }
 
    gcore.GlobalEvent.fire(GuildEvent.UpdateGuildList, type, guild_list);
  },
  //申请某个公会的返回
  updateGuildApplyStatus: function updateGuildApplyStatus(gid, gsrv_id, is_apply) {
    var guild_list_vo = this.guild_cache_list[Utils.getNorKey(gid, gsrv_id)];
    if (guild_list_vo != null) guild_list_vo.setGuildAttribute("is_apply", is_apply);
  },
  //更新自己公会的基础信息
  updateMyGuildInfo: function updateMyGuildInfo(data) {
    if (this.my_guild_info == null) this.my_guild_info = new GuildMyInfoVo();
    this.my_guild_info.updateData(data);
  },
  // 清楚联盟相关缓存数据
  clearMyGuildInfo: function clearMyGuildInfo() {
    this.my_guild_info = null;
    this.guild_red_status_list = {};
    this.my_guild_assistant = {};
    this.guild_member_list = {};
    this.guild_donate_activity_list = []; // 这里需要做清楚红点操作
 
    MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.guild);
  },
  //获取自己公会信息
  getMyGuildInfo: function getMyGuildInfo() {
    return this.my_guild_info;
  },
  //更新成员列表,增删
  //type:"0:更新 1:添加 2:删除" 
  updateMyGuildMemberList: function updateMyGuildMemberList(data_list, type) {
    var role_vo = RoleController.getInstance().getRoleVo();
    if (role_vo == null) return;
 
    if (type == 2) {
      for (var i in data_list) {
        var v = data_list[i];
        this.guild_member_list[Utils.getNorKey(v.rid, v.srv_id)] = null;
 
        if (this.my_guild_assistant[Utils.getNorKey(v.rid, v.srv_id)] != null) {
          this.my_guild_assistant[Utils.getNorKey(v.rid, v.srv_id)] = null; //这里抛出时间更新副会长的数量吧
 
          if (role_vo.position != GuildConst.post_type.member) gcore.GlobalEvent.fire(GuildEvent.UpdateAssistantNumEvent);
        }
      }
    } else {
      var member_vo = null;
 
      for (var i in data_list) {
        var v = data_list[i];
        member_vo = this.guild_member_list[Utils.getNorKey(v.rid, v.srv_id)]; //如果之前存在副会长,但是现在没有了的话,就移除掉
 
        if (this.my_guild_assistant[Utils.getNorKey(v.rid, v.srv_id)] != null) {
          if (v.post != GuildConst.post_type.assistant) {
            this.my_guild_assistant[Utils.getNorKey(v.rid, v.srv_id)] = null;
            if (role_vo.position != GuildConst.post_type.member) gcore.GlobalEvent.fire(GuildEvent.UpdateAssistantNumEvent);
          }
        } else {
          if (v.post == GuildConst.post_type.assistant) {
            this.my_guild_assistant[Utils.getNorKey(v.rid, v.srv_id)] = v;
            if (role_vo.position != GuildConst.post_type.member) gcore.GlobalEvent.fire(GuildEvent.UpdateAssistantNumEvent);
          }
        }
 
        if (member_vo == null) {
          member_vo = new GuildMemberVo();
          this.guild_member_list[Utils.getNorKey(v.rid, v.srv_id)] = member_vo;
        }
 
        if (v.is_self == null) {
          v.is_self = RoleController.getInstance().checkIsSelf(v.srv_id, v.rid); //当前是不是自己
        }
 
        v.role_post = role_vo.position;
        member_vo.updateData(v);
      }
    }
 
    gcore.GlobalEvent.fire(GuildEvent.UpdateMyMemberListEvent, type);
  },
  //自己职位变化的时候更改一下成员列表里面的自己职位数据
  updateMemberByPosition: function updateMemberByPosition(value) {
    if (this.guild_member_list != null) {
      for (var k in this.guild_member_list) {
        this.guild_member_list[k].setGuildAttribute("role_post", value);
      }
    }
  },
  //获取当前副会长的总数
  getAssistantSum: function getAssistantSum() {
    if (this.my_guild_assistant == null) return;
    var sum = 0;
 
    for (var k in this.my_guild_assistant) {
      if (this.my_guild_assistant[k] != null) sum = sum + 1;
    }
 
    return sum;
  },
  //获取成员列表
  getGuildMemberList: function getGuildMemberList() {
    var member_list = [];
 
    for (var k in this.guild_member_list) {
      if (this.guild_member_list[k] != null) member_list.push(this.guild_member_list[k]);
    }
 
    if (member_list.length > 0) {
      member_list.sort(Utils.tableUpperSorter(["online", "post_sort", "donate"]));
    }
 
    return member_list;
  },
  //更新玩家捐献情况
  updateDonateInfo: function updateDonateInfo(data_list) {
    if (data_list == null) return;
    this.donate_sum = 0;
    this.donate_list = [];
 
    for (var i in data_list) {
      var v = data_list[i];
      this.donate_list[v.type] = v.num;
      this.donate_sum = this.donate_sum + v.num;
    }
 
    gcore.GlobalEvent.fire(GuildEvent.UpdateDonateInfo);
    this.updateGuildRedStatus(GuildConst.red_index.donate, this.donate_sum <= 0);
  },
  //这里表示捐献成功了
  setGuildDonateStatus: function setGuildDonateStatus() {
    this.donate_sum = this.donate_sum + 1;
    this.updateGuildRedStatus(GuildConst.red_index.donate, false);
  },
  //判断某一个捐献状态
  checkDonateStatus: function checkDonateStatus(type) {
    var num = this.donate_list[type];
    return [this.donate_sum > 0, num && num > 0];
  },
  //更新申请列表,
  updateGuildApplyList: function updateGuildApplyList(data_list) {
    this.guild_apply_list = {};
 
    for (var i in data_list) {
      var v = data_list[i];
      this.guild_apply_list[Utils.getNorKey(v.rid, v.srv_id)] = v;
    }
 
    gcore.GlobalEvent.fire(GuildEvent.UpdateApplyListInfo);
    this.clearApplyRedStatus();
  },
  //处理完成某个玩家申请请求之后,在总的申请列表中删除这个数据    
  deleteApplyInfo: function deleteApplyInfo(rid, srv_id) {
    if (this.guild_apply_list[Utils.getNorKey(rid, srv_id)] != null) {
      this.guild_apply_list[Utils.getNorKey(rid, srv_id)] = null;
      gcore.GlobalEvent.fire(GuildEvent.UpdateApplyListInfo);
      this.clearApplyRedStatus();
    }
  },
  //清除公会申请红点状态
  clearApplyRedStatus: function clearApplyRedStatus() {
    if (Utils.getArrTrueLen(this.guild_apply_list) == 0) this.updateGuildRedStatus(GuildConst.red_index.apply, false);
  },
  //获取当前申请列表,按照在线,战力以及vip等级从打到小排序
  getGuildApplyList: function getGuildApplyList() {
    var apply_list = [];
 
    for (var k in this.guild_apply_list) {
      if (this.guild_apply_list[k] != null) apply_list.push(this.guild_apply_list[k]);
    }
 
    if (apply_list.length > 0) apply_list.sort(Utils.tableUpperSorter(["is_online", "power", "vip_lev"]));
    return apply_list;
  },
  //处理公会红点的状态
  updateGuildRedStatus: function updateGuildRedStatus(type, status) {
    var base_data = Config.function_data.data_base;
    var bool = MainuiController.getInstance().checkIsOpenByActivate(base_data[6].activate);
    if (bool == false) return;
    var _status = this.guild_red_status_list[type];
    if (_status == status) return;
    this.guild_red_status_list[type] = status; //更新场景红点状态
 
    MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.guild, {
      bid: type,
      status: status
    }); //事件用于同步更新公会主ui的红点
 
    gcore.GlobalEvent.fire(GuildEvent.UpdateGuildRedStatus, type, status);
  },
  //联盟活跃红点
  updataGuildActionRedStatus: function updataGuildActionRedStatus(data) {
    RedMgr.getInstance().addCalHandler(function () {
      this.goal_data = data;
      var red = false;
      var lev_data = Config.guild_quest_data.data_lev_data;
      var lev_data_len = Config.guild_quest_data.data_lev_data_length;
      if (data.lev < lev_data_len && data.exp >= lev_data[data.lev].exp) red = true;
      MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.guild, {
        bid: GuildConst.red_index.goal_action,
        status: red
      });
      gcore.GlobalEvent.fire(GuildEvent.UpdateGuildRedStatus, GuildConst.red_index.goal_action, red);
    }.bind(this), RedIds.GuildActive);
  },
  getGoalRedStatus: function getGoalRedStatus() {
    if (this.goal_data == null || !Utils.next(this.goal_data)) return false;
    var status = false;
    var lev_data = Config.guild_quest_data.data_lev_data;
 
    if (this.goal_data.lev < Config.guild_quest_data.data_lev_data_length && this.goal_data.exp >= lev_data[this.goal_data.lev].exp) {
      status = true;
    }
 
    return status;
  },
  //判断某个类型的红点状态
  getRedStatus: function getRedStatus(type) {
    return this.guild_red_status_list[type];
  },
  //判断是否有捐献红点
  getDonateRedStatus: function getDonateRedStatus() {
    var status = this.getRedStatus(GuildConst.red_index.donate);
    if (status == true) return status;
    status = this.getRedStatus(GuildConst.red_index.donate_activity);
    return status;
  },
  //捐献活跃宝箱情况
  updateDonateBoxInfo: function updateDonateBoxInfo(boxes, donate_exp) {
    this.guild_donate_activity_list = {};
    this.guild_donate_activity = donate_exp; //当前公会捐献活跃度
 
    for (var i in boxes) {
      this.guild_donate_activity_list[boxes[i].box_id] = true;
    }
 
    this.checkDonateActivity();
  },
  //设置某个捐献宝箱的状态
  setDonateBoxStatus: function setDonateBoxStatus(box_id) {
    if (this.guild_donate_activity_list == null) this.guild_donate_activity_list = {};
    this.guild_donate_activity_list[box_id] = true;
    gcore.GlobalEvent.fire(GuildEvent.UpdateDonateBoxStatus, box_id);
    this.checkDonateActivity();
  },
  //别人捐献的时候更新当前捐献进度,可能同步会有红点提示
  updateDonateActivity: function updateDonateActivity(value) {
    this.guild_donate_activity = value;
    gcore.GlobalEvent.fire(GuildEvent.UpdateDonateBoxStatus);
    this.checkDonateActivity();
  },
  //监测是否有公会捐献活跃宝箱
  checkDonateActivity: function checkDonateActivity() {
    RedMgr.getInstance().addCalHandler(function () {
      var activity = this.guild_donate_activity || 0;
      var red_status = false;
 
      for (var i in Config.guild_data.data_donate_box) {
        var v = Config.guild_data.data_donate_box[i];
 
        if (activity >= v.box_val && !this.guild_donate_activity_list[i]) {
          red_status = true;
          break;
        }
      }
 
      this.updateGuildRedStatus(GuildConst.red_index.donate_activity, red_status);
    }.bind(this), RedIds.GuildDonate);
  },
  //返回捐献活跃度的值
  getDonateActivityValue: function getDonateActivityValue() {
    return this.guild_donate_activity || 0;
  },
  //获取捐献宝箱状态
  getDonateBoxStatus: function getDonateBoxStatus(id) {
    return this.guild_donate_activity_list[id];
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZFxcZ3VpbGRfbW9kZWwuanMiXSwibmFtZXMiOlsiR3VpbGRMaXN0Vm8iLCJyZXF1aXJlIiwiR3VpbGRDb25zdCIsIkd1aWxkRXZlbnQiLCJHdWlsZE15SW5mb1ZvIiwiUm9sZUNvbnRyb2xsZXIiLCJHdWlsZE1lbWJlclZvIiwiTWFpbnVpQ29udHJvbGxlciIsIk1haW51aUNvbnN0IiwiR3VpbGRNb2RlbCIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJjdG9yIiwiR3VpbGRDb250cm9sbGVyIiwiY3RybCIsImdldEluc3RhbmNlIiwiZ3VpbGRfY2FjaGVfbGlzdCIsImd1aWxkX2FwcGx5X2xpc3QiLCJkb25hdGVfc3VtIiwiZ3VpbGRfbWVtYmVyX2xpc3QiLCJndWlsZF9saXN0IiwiZ3VpbGRfc2VhcmNoX2xpc3QiLCJteV9ndWlsZF9hc3Npc3RhbnQiLCJndWlsZF9yZWRfc3RhdHVzX2xpc3QiLCJndWlsZF9kb25hdGVfYWN0aXZpdHlfbGlzdCIsInByb3BlcnRpZXMiLCJpbml0Q29uZmlnIiwidXBkYXRlR3VpbGRMaXN0IiwibmFtZSIsImRhdGFfbGlzdCIsImkiLCJ2IiwiZ3VpbGRfdm8iLCJVdGlscyIsImdldE5vcktleSIsImdpZCIsImdzcnZfaWQiLCJ1cGRhdGVEYXRhIiwicHVzaCIsInR5cGUiLCJsaXN0X3R5cGUiLCJ0b3RhbCIsInNlYXJjaCIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJmaXJlIiwiVXBkYXRlR3VpbGRMaXN0IiwidXBkYXRlR3VpbGRBcHBseVN0YXR1cyIsImlzX2FwcGx5IiwiZ3VpbGRfbGlzdF92byIsInNldEd1aWxkQXR0cmlidXRlIiwidXBkYXRlTXlHdWlsZEluZm8iLCJkYXRhIiwibXlfZ3VpbGRfaW5mbyIsImNsZWFyTXlHdWlsZEluZm8iLCJzZXRCdG5SZWRQb2ludCIsImJ0bl9pbmRleCIsImd1aWxkIiwiZ2V0TXlHdWlsZEluZm8iLCJ1cGRhdGVNeUd1aWxkTWVtYmVyTGlzdCIsInJvbGVfdm8iLCJnZXRSb2xlVm8iLCJyaWQiLCJzcnZfaWQiLCJwb3NpdGlvbiIsInBvc3RfdHlwZSIsIm1lbWJlciIsIlVwZGF0ZUFzc2lzdGFudE51bUV2ZW50IiwibWVtYmVyX3ZvIiwicG9zdCIsImFzc2lzdGFudCIsImlzX3NlbGYiLCJjaGVja0lzU2VsZiIsInJvbGVfcG9zdCIsIlVwZGF0ZU15TWVtYmVyTGlzdEV2ZW50IiwidXBkYXRlTWVtYmVyQnlQb3NpdGlvbiIsInZhbHVlIiwiayIsImdldEFzc2lzdGFudFN1bSIsInN1bSIsImdldEd1aWxkTWVtYmVyTGlzdCIsIm1lbWJlcl9saXN0IiwibGVuZ3RoIiwic29ydCIsInRhYmxlVXBwZXJTb3J0ZXIiLCJ1cGRhdGVEb25hdGVJbmZvIiwiZG9uYXRlX2xpc3QiLCJudW0iLCJVcGRhdGVEb25hdGVJbmZvIiwidXBkYXRlR3VpbGRSZWRTdGF0dXMiLCJyZWRfaW5kZXgiLCJkb25hdGUiLCJzZXRHdWlsZERvbmF0ZVN0YXR1cyIsImNoZWNrRG9uYXRlU3RhdHVzIiwidXBkYXRlR3VpbGRBcHBseUxpc3QiLCJVcGRhdGVBcHBseUxpc3RJbmZvIiwiY2xlYXJBcHBseVJlZFN0YXR1cyIsImRlbGV0ZUFwcGx5SW5mbyIsImdldEFyclRydWVMZW4iLCJhcHBseSIsImdldEd1aWxkQXBwbHlMaXN0IiwiYXBwbHlfbGlzdCIsInN0YXR1cyIsImJhc2VfZGF0YSIsIkNvbmZpZyIsImZ1bmN0aW9uX2RhdGEiLCJkYXRhX2Jhc2UiLCJib29sIiwiY2hlY2tJc09wZW5CeUFjdGl2YXRlIiwiYWN0aXZhdGUiLCJfc3RhdHVzIiwiYmlkIiwiVXBkYXRlR3VpbGRSZWRTdGF0dXMiLCJ1cGRhdGFHdWlsZEFjdGlvblJlZFN0YXR1cyIsIlJlZE1nciIsImFkZENhbEhhbmRsZXIiLCJnb2FsX2RhdGEiLCJyZWQiLCJsZXZfZGF0YSIsImd1aWxkX3F1ZXN0X2RhdGEiLCJkYXRhX2xldl9kYXRhIiwibGV2X2RhdGFfbGVuIiwiZGF0YV9sZXZfZGF0YV9sZW5ndGgiLCJsZXYiLCJleHAiLCJnb2FsX2FjdGlvbiIsImJpbmQiLCJSZWRJZHMiLCJHdWlsZEFjdGl2ZSIsImdldEdvYWxSZWRTdGF0dXMiLCJuZXh0IiwiZ2V0UmVkU3RhdHVzIiwiZ2V0RG9uYXRlUmVkU3RhdHVzIiwiZG9uYXRlX2FjdGl2aXR5IiwidXBkYXRlRG9uYXRlQm94SW5mbyIsImJveGVzIiwiZG9uYXRlX2V4cCIsImd1aWxkX2RvbmF0ZV9hY3Rpdml0eSIsImJveF9pZCIsImNoZWNrRG9uYXRlQWN0aXZpdHkiLCJzZXREb25hdGVCb3hTdGF0dXMiLCJVcGRhdGVEb25hdGVCb3hTdGF0dXMiLCJ1cGRhdGVEb25hdGVBY3Rpdml0eSIsImFjdGl2aXR5IiwicmVkX3N0YXR1cyIsImd1aWxkX2RhdGEiLCJkYXRhX2RvbmF0ZV9ib3giLCJib3hfdmFsIiwiR3VpbGREb25hdGUiLCJnZXREb25hdGVBY3Rpdml0eVZhbHVlIiwiZ2V0RG9uYXRlQm94U3RhdHVzIiwiaWQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsV0FBVyxHQUFHQyxPQUFPLENBQUMsZUFBRCxDQUF6Qjs7QUFDQSxJQUFJQyxVQUFVLEdBQUdELE9BQU8sQ0FBQyxhQUFELENBQXhCOztBQUNBLElBQUlFLFVBQVUsR0FBR0YsT0FBTyxDQUFDLGFBQUQsQ0FBeEI7O0FBQ0EsSUFBSUcsYUFBYSxHQUFHSCxPQUFPLENBQUMsa0JBQUQsQ0FBM0I7O0FBQ0EsSUFBSUksY0FBYyxHQUFHSixPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUssYUFBYSxHQUFHTCxPQUFPLENBQUMsaUJBQUQsQ0FBM0I7O0FBQ0EsSUFBSU0sZ0JBQWdCLEdBQUdOLE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFDQSxJQUFJTyxXQUFXLEdBQUdQLE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUVBLElBQUlRLFVBQVUsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENB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QUFDLEtBQUszSCwwQkFBTCxDQUFnQ00sQ0FBaEMsQ0FBOUIsRUFBa0U7QUFDOURrSCxVQUFBQSxVQUFVLEdBQUcsSUFBYjtBQUNBO0FBQ0g7QUFDSjs7QUFDRCxXQUFLdkQsb0JBQUwsQ0FBMEJ4RixVQUFVLENBQUN5RixTQUFYLENBQXFCMkMsZUFBL0MsRUFBZ0VXLFVBQWhFO0FBQ0gsS0FYa0MsQ0FXakNsQixJQVhpQyxDQVc1QixJQVg0QixDQUFuQyxFQVdjQyxNQUFNLENBQUNxQixXQVhyQjtBQVlILEdBaFZxQjtBQWtWdEI7QUFDQUMsRUFBQUEsc0JBQXNCLEVBQUUsa0NBQVk7QUFDaEMsV0FBTyxLQUFLWixxQkFBTCxJQUE4QixDQUFyQztBQUNILEdBclZxQjtBQXVWdEI7QUFDQWEsRUFBQUEsa0JBQWtCLEVBQUUsNEJBQVVDLEVBQVYsRUFBYztBQUM5QixXQUFPLEtBQUsvSCwwQkFBTCxDQUFnQytILEVBQWhDLENBQVA7QUFDSDtBQTFWcUIsQ0FBVCxDQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDov5nph4zloavlhpnor6bnu4bor7TmmI4s5Li76KaB5aGr5YaZ6K+l5qih5Z2X55qE5Yqf6IO9566A6KaBXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMS0xNCAxMDo1NzowOFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBHdWlsZExpc3RWbyA9IHJlcXVpcmUoXCJndWlsZF9saXN0X3ZvXCIpO1xudmFyIEd1aWxkQ29uc3QgPSByZXF1aXJlKFwiZ3VpbGRfY29uc3RcIik7XG52YXIgR3VpbGRFdmVudCA9IHJlcXVpcmUoXCJndWlsZF9ldmVudFwiKTtcbnZhciBHdWlsZE15SW5mb1ZvID0gcmVxdWlyZShcImd1aWxkX215X2luZm9fdm9cIik7XG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xudmFyIEd1aWxkTWVtYmVyVm8gPSByZXF1aXJlKFwiZ3VpbGRfbWVtYmVyX3ZvXCIpO1xudmFyIE1haW51aUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIik7XG52YXIgTWFpbnVpQ29uc3QgPSByZXF1aXJlKFwibWFpbnVpX2NvbnN0XCIpO1xuXG52YXIgR3VpbGRNb2RlbCA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ2xhc3MsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgR3VpbGRDb250cm9sbGVyID0gcmVxdWlyZShcImd1aWxkX2NvbnRyb2xsZXJcIik7XG4gICAgICAgIHRoaXMuY3RybCA9IEd1aWxkQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuXG4gICAgICAgIHRoaXMuZ3VpbGRfY2FjaGVfbGlzdCA9IHt9OyAgICAgIC8vIOe8k+WtmOeahOW9k+WJjeacjeWKoeWZqOWIl+ihqFxuICAgICAgICB0aGlzLmd1aWxkX2FwcGx5X2xpc3QgPSB7fTsgICAgICAvLyDlhazkvJrnlLPor7fliJfooahcbiAgICAgICAgdGhpcy5kb25hdGVfc3VtID0gMDsgICAgICAgICAgICAgLy8g5LuK5aSp5bey57uP5o2Q54yu55qE5qyh5pWwXG4gICAgICAgIHRoaXMuZ3VpbGRfbWVtYmVyX2xpc3QgPSB7fTsgICAgIC8vIOaIkOWRmOWIl+ihqFxuICAgICAgICB0aGlzLmd1aWxkX2xpc3QgPSBbXTsgICAgICAgICAgICAvLyDlvZPliY3miYDmnInnmoTlhazkvJrliJfooahcbiAgICAgICAgdGhpcy5ndWlsZF9zZWFyY2hfbGlzdCA9IFtdOyAgICAgLy8g5b2T5YmN5b6F5p+l5om+55qE5YWs5Lya5YiX6KGoXG4gICAgICAgIHRoaXMubXlfZ3VpbGRfYXNzaXN0YW50ID0ge307ICAgIC8vIOW9k+WJjeWJr+S8mumVv+eahOaVsOaNrlxuICAgICAgICB0aGlzLmd1aWxkX3JlZF9zdGF0dXNfbGlzdCA9IHt9OyAvLyDlhazkvJrnuqLngrnnmoTnirbmgIFcbiAgICAgICAgdGhpcy5ndWlsZF9kb25hdGVfYWN0aXZpdHlfbGlzdCA9IFtdOyAgICAvLyDmjZDnjK7mtLvot4Plrp3nrrHmuIXnqbpcbiAgICB9LFxuXG4gICAgcHJvcGVydGllczoge1xuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcblxuICAgIHVwZGF0ZUd1aWxkTGlzdDogZnVuY3Rpb24gKG5hbWUsIGRhdGFfbGlzdCkge1xuICAgICAgICBpZiAobmFtZSA9PSBcIlwiKSB7XG4gICAgICAgICAgICB0aGlzLmd1aWxkX2xpc3QgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZGF0YV9saXN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSBkYXRhX2xpc3RbaV07XG4gICAgICAgICAgICAgICAgdmFyIGd1aWxkX3ZvID0gdGhpcy5ndWlsZF9jYWNoZV9saXN0W1V0aWxzLmdldE5vcktleSh2LmdpZCwgdi5nc3J2X2lkKV07XG4gICAgICAgICAgICAgICAgaWYgKGd1aWxkX3ZvID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3VpbGRfdm8gPSBuZXcgR3VpbGRMaXN0Vm8oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ndWlsZF9jYWNoZV9saXN0W1V0aWxzLmdldE5vcktleSh2LmdpZCwgdi5nc3J2X2lkKV0gPSBndWlsZF92bztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ3VpbGRfdm8udXBkYXRlRGF0YSh2KTtcbiAgICAgICAgICAgICAgICB0aGlzLmd1aWxkX2xpc3QucHVzaChndWlsZF92byk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmd1aWxkX3NlYXJjaF9saXN0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIGRhdGFfbGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gZGF0YV9saXN0W2ldO1xuICAgICAgICAgICAgICAgIHZhciBndWlsZF92byA9IHRoaXMuZ3VpbGRfY2FjaGVfbGlzdFtVdGlscy5nZXROb3JLZXkodi5naWQsIHYuZ3Nydl9pZCldO1xuICAgICAgICAgICAgICAgIGlmIChndWlsZF92byA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGd1aWxkX3ZvID0gbmV3IEd1aWxkTGlzdFZvKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3VpbGRfY2FjaGVfbGlzdFtVdGlscy5nZXROb3JLZXkodi5naWQsIHYuZ3Nydl9pZCldID0gZ3VpbGRfdm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGd1aWxkX3ZvLnVwZGF0ZURhdGEodik7XG4gICAgICAgICAgICAgICAgdGhpcy5ndWlsZF9zZWFyY2hfbGlzdC5wdXNoKGd1aWxkX3ZvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdHlwZSA9IEd1aWxkQ29uc3QubGlzdF90eXBlLnRvdGFsO1xuICAgICAgICB2YXIgZ3VpbGRfbGlzdCA9IHRoaXMuZ3VpbGRfbGlzdDtcbiAgICAgICAgaWYgKG5hbWUgIT0gXCJcIikge1xuICAgICAgICAgICAgdHlwZSA9IEd1aWxkQ29uc3QubGlzdF90eXBlLnNlYXJjaDtcbiAgICAgICAgICAgIGd1aWxkX2xpc3QgPSB0aGlzLmd1aWxkX3NlYXJjaF9saXN0O1xuICAgICAgICB9XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpbGRFdmVudC5VcGRhdGVHdWlsZExpc3QsIHR5cGUsIGd1aWxkX2xpc3QpO1xuICAgIH0sXG5cbiAgICAvL+eUs+ivt+afkOS4quWFrOS8mueahOi/lOWbnlxuICAgIHVwZGF0ZUd1aWxkQXBwbHlTdGF0dXM6IGZ1bmN0aW9uIChnaWQsIGdzcnZfaWQsIGlzX2FwcGx5KSB7XG4gICAgICAgIHZhciBndWlsZF9saXN0X3ZvID0gdGhpcy5ndWlsZF9jYWNoZV9saXN0W1V0aWxzLmdldE5vcktleShnaWQsIGdzcnZfaWQpXTtcbiAgICAgICAgaWYgKGd1aWxkX2xpc3Rfdm8gIT0gbnVsbClcbiAgICAgICAgICAgIGd1aWxkX2xpc3Rfdm8uc2V0R3VpbGRBdHRyaWJ1dGUoXCJpc19hcHBseVwiLCBpc19hcHBseSk7XG4gICAgfSxcblxuICAgIC8v5pu05paw6Ieq5bex5YWs5Lya55qE5Z+656GA5L+h5oGvXG4gICAgdXBkYXRlTXlHdWlsZEluZm86IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLm15X2d1aWxkX2luZm8gPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMubXlfZ3VpbGRfaW5mbyA9IG5ldyBHdWlsZE15SW5mb1ZvKCk7XG4gICAgICAgIHRoaXMubXlfZ3VpbGRfaW5mby51cGRhdGVEYXRhKGRhdGEpO1xuICAgIH0sXG5cbiAgICAvLyDmuIXmpZrogZTnm5/nm7jlhbPnvJPlrZjmlbDmja5cbiAgICBjbGVhck15R3VpbGRJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubXlfZ3VpbGRfaW5mbyA9IG51bGxcbiAgICAgICAgdGhpcy5ndWlsZF9yZWRfc3RhdHVzX2xpc3QgPSB7fTtcbiAgICAgICAgdGhpcy5teV9ndWlsZF9hc3Npc3RhbnQgPSB7fTtcbiAgICAgICAgdGhpcy5ndWlsZF9tZW1iZXJfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLmd1aWxkX2RvbmF0ZV9hY3Rpdml0eV9saXN0ID0gW107XG5cbiAgICAgICAgLy8g6L+Z6YeM6ZyA6KaB5YGa5riF5qWa57qi54K55pON5L2cXG4gICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRCdG5SZWRQb2ludChNYWludWlDb25zdC5idG5faW5kZXguZ3VpbGQpO1xuICAgIH0sXG5cbiAgICAvL+iOt+WPluiHquW3seWFrOS8muS/oeaBr1xuICAgIGdldE15R3VpbGRJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm15X2d1aWxkX2luZm87XG4gICAgfSxcblxuICAgIC8v5pu05paw5oiQ5ZGY5YiX6KGo77yM5aKe5YigXG4gICAgLy90eXBlOlwiMDrmm7TmlrAgMTrmt7vliqAgMjrliKDpmaRcIiBcbiAgICB1cGRhdGVNeUd1aWxkTWVtYmVyTGlzdDogZnVuY3Rpb24gKGRhdGFfbGlzdCwgdHlwZSkge1xuICAgICAgICB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgIGlmIChyb2xlX3ZvID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgaWYgKHR5cGUgPT0gMikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBkYXRhX2xpc3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IGRhdGFfbGlzdFtpXTtcbiAgICAgICAgICAgICAgICB0aGlzLmd1aWxkX21lbWJlcl9saXN0W1V0aWxzLmdldE5vcktleSh2LnJpZCwgdi5zcnZfaWQpXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubXlfZ3VpbGRfYXNzaXN0YW50W1V0aWxzLmdldE5vcktleSh2LnJpZCwgdi5zcnZfaWQpXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubXlfZ3VpbGRfYXNzaXN0YW50W1V0aWxzLmdldE5vcktleSh2LnJpZCwgdi5zcnZfaWQpXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8v6L+Z6YeM5oqb5Ye65pe26Ze05pu05paw5Ymv5Lya6ZW/55qE5pWw6YeP5ZCnXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlX3ZvLnBvc2l0aW9uICE9IEd1aWxkQ29uc3QucG9zdF90eXBlLm1lbWJlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpbGRFdmVudC5VcGRhdGVBc3Npc3RhbnROdW1FdmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIG1lbWJlcl92byA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIGRhdGFfbGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gZGF0YV9saXN0W2ldO1xuICAgICAgICAgICAgICAgIG1lbWJlcl92byA9IHRoaXMuZ3VpbGRfbWVtYmVyX2xpc3RbVXRpbHMuZ2V0Tm9yS2V5KHYucmlkLCB2LnNydl9pZCldO1xuICAgICAgICAgICAgICAgIC8v5aaC5p6c5LmL5YmN5a2Y5Zyo5Ymv5Lya6ZW/77yM5L2G5piv546w5Zyo5rKh5pyJ5LqG55qE6K+d77yM5bCx56e76Zmk5o6JXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubXlfZ3VpbGRfYXNzaXN0YW50W1V0aWxzLmdldE5vcktleSh2LnJpZCwgdi5zcnZfaWQpXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2LnBvc3QgIT0gR3VpbGRDb25zdC5wb3N0X3R5cGUuYXNzaXN0YW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm15X2d1aWxkX2Fzc2lzdGFudFtVdGlscy5nZXROb3JLZXkodi5yaWQsIHYuc3J2X2lkKV0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVfdm8ucG9zaXRpb24gIT0gR3VpbGRDb25zdC5wb3N0X3R5cGUubWVtYmVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpbGRFdmVudC5VcGRhdGVBc3Npc3RhbnROdW1FdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodi5wb3N0ID09IEd1aWxkQ29uc3QucG9zdF90eXBlLmFzc2lzdGFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5teV9ndWlsZF9hc3Npc3RhbnRbVXRpbHMuZ2V0Tm9yS2V5KHYucmlkLCB2LnNydl9pZCldID0gdjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb2xlX3ZvLnBvc2l0aW9uICE9IEd1aWxkQ29uc3QucG9zdF90eXBlLm1lbWJlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkRXZlbnQuVXBkYXRlQXNzaXN0YW50TnVtRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lbWJlcl92byA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lbWJlcl92byA9IG5ldyBHdWlsZE1lbWJlclZvKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3VpbGRfbWVtYmVyX2xpc3RbVXRpbHMuZ2V0Tm9yS2V5KHYucmlkLCB2LnNydl9pZCldID0gbWVtYmVyX3ZvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodi5pc19zZWxmID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdi5pc19zZWxmID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jaGVja0lzU2VsZih2LnNydl9pZCwgdi5yaWQpOyAgIC8v5b2T5YmN5piv5LiN5piv6Ieq5bexXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHYucm9sZV9wb3N0ID0gcm9sZV92by5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICBtZW1iZXJfdm8udXBkYXRlRGF0YSh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkRXZlbnQuVXBkYXRlTXlNZW1iZXJMaXN0RXZlbnQsIHR5cGUpO1xuICAgIH0sXG5cbiAgICAvL+iHquW3seiBjOS9jeWPmOWMlueahOaXtuWAmeabtOaUueS4gOS4i+aIkOWRmOWIl+ihqOmHjOmdoueahOiHquW3seiBjOS9jeaVsOaNrlxuICAgIHVwZGF0ZU1lbWJlckJ5UG9zaXRpb246IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5ndWlsZF9tZW1iZXJfbGlzdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZ3VpbGRfbWVtYmVyX2xpc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmd1aWxkX21lbWJlcl9saXN0W2tdLnNldEd1aWxkQXR0cmlidXRlKFwicm9sZV9wb3N0XCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iOt+WPluW9k+WJjeWJr+S8mumVv+eahOaAu+aVsFxuICAgIGdldEFzc2lzdGFudFN1bTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5teV9ndWlsZF9hc3Npc3RhbnQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm15X2d1aWxkX2Fzc2lzdGFudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubXlfZ3VpbGRfYXNzaXN0YW50W2tdICE9IG51bGwpXG4gICAgICAgICAgICAgICAgc3VtID0gc3VtICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtXG4gICAgfSxcblxuICAgIC8v6I635Y+W5oiQ5ZGY5YiX6KGoXG4gICAgZ2V0R3VpbGRNZW1iZXJMaXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtZW1iZXJfbGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZ3VpbGRfbWVtYmVyX2xpc3QpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuZ3VpbGRfbWVtYmVyX2xpc3Rba10gIT0gbnVsbClcbiAgICAgICAgICAgICAgICBtZW1iZXJfbGlzdC5wdXNoKHRoaXMuZ3VpbGRfbWVtYmVyX2xpc3Rba10pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lbWJlcl9saXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1lbWJlcl9saXN0LnNvcnQoVXRpbHMudGFibGVVcHBlclNvcnRlcihbXCJvbmxpbmVcIiwgXCJwb3N0X3NvcnRcIiwgXCJkb25hdGVcIl0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVtYmVyX2xpc3RcbiAgICB9LFxuXG4gICAgLy/mm7TmlrDnjqnlrrbmjZDnjK7mg4XlhrVcbiAgICB1cGRhdGVEb25hdGVJbmZvOiBmdW5jdGlvbiAoZGF0YV9saXN0KSB7XG4gICAgICAgIGlmIChkYXRhX2xpc3QgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB0aGlzLmRvbmF0ZV9zdW0gPSAwO1xuICAgICAgICB0aGlzLmRvbmF0ZV9saXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgaW4gZGF0YV9saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IGRhdGFfbGlzdFtpXTtcbiAgICAgICAgICAgIHRoaXMuZG9uYXRlX2xpc3Rbdi50eXBlXSA9IHYubnVtO1xuICAgICAgICAgICAgdGhpcy5kb25hdGVfc3VtID0gdGhpcy5kb25hdGVfc3VtICsgdi5udW07XG4gICAgICAgIH1cbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZEV2ZW50LlVwZGF0ZURvbmF0ZUluZm8pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlR3VpbGRSZWRTdGF0dXMoR3VpbGRDb25zdC5yZWRfaW5kZXguZG9uYXRlLCAodGhpcy5kb25hdGVfc3VtIDw9IDApKTtcbiAgICB9LFxuXG4gICAgLy/ov5nph4zooajnpLrmjZDnjK7miJDlip/kuoZcbiAgICBzZXRHdWlsZERvbmF0ZVN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRvbmF0ZV9zdW0gPSB0aGlzLmRvbmF0ZV9zdW0gKyAxO1xuICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkUmVkU3RhdHVzKEd1aWxkQ29uc3QucmVkX2luZGV4LmRvbmF0ZSwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICAvL+WIpOaWreafkOS4gOS4quaNkOeMrueKtuaAgVxuICAgIGNoZWNrRG9uYXRlU3RhdHVzOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICB2YXIgbnVtID0gdGhpcy5kb25hdGVfbGlzdFt0eXBlXTtcbiAgICAgICAgcmV0dXJuIFsodGhpcy5kb25hdGVfc3VtID4gMCksIChudW0gJiYgbnVtID4gMCldXG4gICAgfSxcblxuICAgIC8v5pu05paw55Sz6K+35YiX6KGo77yMXG4gICAgdXBkYXRlR3VpbGRBcHBseUxpc3Q6IGZ1bmN0aW9uIChkYXRhX2xpc3QpIHtcbiAgICAgICAgdGhpcy5ndWlsZF9hcHBseV9saXN0ID0ge307XG4gICAgICAgIGZvciAodmFyIGkgaW4gZGF0YV9saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IGRhdGFfbGlzdFtpXTtcbiAgICAgICAgICAgIHRoaXMuZ3VpbGRfYXBwbHlfbGlzdFtVdGlscy5nZXROb3JLZXkodi5yaWQsIHYuc3J2X2lkKV0gPSB2O1xuICAgICAgICB9XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpbGRFdmVudC5VcGRhdGVBcHBseUxpc3RJbmZvKTtcbiAgICAgICAgdGhpcy5jbGVhckFwcGx5UmVkU3RhdHVzKCk7XG4gICAgfSxcblxuICAgIC8v5aSE55CG5a6M5oiQ5p+Q5Liq546p5a6255Sz6K+36K+35rGC5LmL5ZCO77yM5Zyo5oC755qE55Sz6K+35YiX6KGo5Lit5Yig6Zmk6L+Z5Liq5pWw5o2uICAgIFxuICAgIGRlbGV0ZUFwcGx5SW5mbzogZnVuY3Rpb24gKHJpZCwgc3J2X2lkKSB7XG4gICAgICAgIGlmICh0aGlzLmd1aWxkX2FwcGx5X2xpc3RbVXRpbHMuZ2V0Tm9yS2V5KHJpZCwgc3J2X2lkKV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5ndWlsZF9hcHBseV9saXN0W1V0aWxzLmdldE5vcktleShyaWQsIHNydl9pZCldID0gbnVsbDtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpbGRFdmVudC5VcGRhdGVBcHBseUxpc3RJbmZvKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJBcHBseVJlZFN0YXR1cygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5riF6Zmk5YWs5Lya55Sz6K+357qi54K554q25oCBXG4gICAgY2xlYXJBcHBseVJlZFN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoVXRpbHMuZ2V0QXJyVHJ1ZUxlbih0aGlzLmd1aWxkX2FwcGx5X2xpc3QpID09IDApXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkUmVkU3RhdHVzKEd1aWxkQ29uc3QucmVkX2luZGV4LmFwcGx5LCBmYWxzZSk7XG4gICAgfSxcblxuICAgIC8v6I635Y+W5b2T5YmN55Sz6K+35YiX6KGo77yM5oyJ54Wn5Zyo57q/77yM5oiY5Yqb5Lul5Y+Kdmlw562J57qn5LuO5omT5Yiw5bCP5o6S5bqPXG4gICAgZ2V0R3VpbGRBcHBseUxpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFwcGx5X2xpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmd1aWxkX2FwcGx5X2xpc3QpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuZ3VpbGRfYXBwbHlfbGlzdFtrXSAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGFwcGx5X2xpc3QucHVzaCh0aGlzLmd1aWxkX2FwcGx5X2xpc3Rba10pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcHBseV9saXN0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICBhcHBseV9saXN0LnNvcnQoVXRpbHMudGFibGVVcHBlclNvcnRlcihbXCJpc19vbmxpbmVcIiwgXCJwb3dlclwiLCBcInZpcF9sZXZcIl0pKTtcbiAgICAgICAgcmV0dXJuIGFwcGx5X2xpc3RcbiAgICB9LFxuXG4gICAgLy/lpITnkIblhazkvJrnuqLngrnnmoTnirbmgIFcbiAgICB1cGRhdGVHdWlsZFJlZFN0YXR1czogZnVuY3Rpb24gKHR5cGUsIHN0YXR1cykge1xuICAgICAgICB2YXIgYmFzZV9kYXRhID0gQ29uZmlnLmZ1bmN0aW9uX2RhdGEuZGF0YV9iYXNlO1xuICAgICAgICB2YXIgYm9vbCA9IE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jaGVja0lzT3BlbkJ5QWN0aXZhdGUoYmFzZV9kYXRhWzZdLmFjdGl2YXRlKTtcbiAgICAgICAgaWYgKGJvb2wgPT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdmFyIF9zdGF0dXMgPSB0aGlzLmd1aWxkX3JlZF9zdGF0dXNfbGlzdFt0eXBlXTtcbiAgICAgICAgaWYgKF9zdGF0dXMgPT0gc3RhdHVzKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIHRoaXMuZ3VpbGRfcmVkX3N0YXR1c19saXN0W3R5cGVdID0gc3RhdHVzO1xuXG4gICAgICAgIC8v5pu05paw5Zy65pmv57qi54K554q25oCBXG4gICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRCdG5SZWRQb2ludChNYWludWlDb25zdC5idG5faW5kZXguZ3VpbGQsIHsgYmlkOiB0eXBlLCBzdGF0dXM6IHN0YXR1cyB9KTtcbiAgICAgICAgLy/kuovku7bnlKjkuo7lkIzmraXmm7TmlrDlhazkvJrkuLt1aeeahOe6oueCuVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkRXZlbnQuVXBkYXRlR3VpbGRSZWRTdGF0dXMsIHR5cGUsIHN0YXR1cyk7XG4gICAgfSxcblxuICAgIC8v6IGU55uf5rS76LeD57qi54K5XG4gICAgdXBkYXRhR3VpbGRBY3Rpb25SZWRTdGF0dXM6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIFJlZE1nci5nZXRJbnN0YW5jZSgpLmFkZENhbEhhbmRsZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5nb2FsX2RhdGEgPSBkYXRhO1xuICAgICAgICAgICAgdmFyIHJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGxldl9kYXRhID0gQ29uZmlnLmd1aWxkX3F1ZXN0X2RhdGEuZGF0YV9sZXZfZGF0YTtcbiAgICAgICAgICAgIHZhciBsZXZfZGF0YV9sZW4gPSBDb25maWcuZ3VpbGRfcXVlc3RfZGF0YS5kYXRhX2xldl9kYXRhX2xlbmd0aDtcbiAgICAgICAgICAgIGlmIChkYXRhLmxldiA8IGxldl9kYXRhX2xlbiAmJiBkYXRhLmV4cCA+PSBsZXZfZGF0YVtkYXRhLmxldl0uZXhwKVxuICAgICAgICAgICAgICAgIHJlZCA9IHRydWVcbiAgICAgICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRCdG5SZWRQb2ludChNYWludWlDb25zdC5idG5faW5kZXguZ3VpbGQsIHsgYmlkOiBHdWlsZENvbnN0LnJlZF9pbmRleC5nb2FsX2FjdGlvbiwgc3RhdHVzOiByZWQgfSk7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkRXZlbnQuVXBkYXRlR3VpbGRSZWRTdGF0dXMsIEd1aWxkQ29uc3QucmVkX2luZGV4LmdvYWxfYWN0aW9uLCByZWQpO1xuICAgICAgICB9LmJpbmQodGhpcyksIFJlZElkcy5HdWlsZEFjdGl2ZSlcbiAgICB9LFxuXG4gICAgZ2V0R29hbFJlZFN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5nb2FsX2RhdGEgPT0gbnVsbCB8fCAhVXRpbHMubmV4dCh0aGlzLmdvYWxfZGF0YSkpIHJldHVybiBmYWxzZVxuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHZhciBsZXZfZGF0YSA9IENvbmZpZy5ndWlsZF9xdWVzdF9kYXRhLmRhdGFfbGV2X2RhdGE7XG4gICAgICAgIGlmICh0aGlzLmdvYWxfZGF0YS5sZXYgPCBDb25maWcuZ3VpbGRfcXVlc3RfZGF0YS5kYXRhX2xldl9kYXRhX2xlbmd0aCAmJiB0aGlzLmdvYWxfZGF0YS5leHAgPj0gbGV2X2RhdGFbdGhpcy5nb2FsX2RhdGEubGV2XS5leHApIHtcbiAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXR1c1xuICAgIH0sXG5cbiAgICAvL+WIpOaWreafkOS4quexu+Wei+eahOe6oueCueeKtuaAgVxuICAgIGdldFJlZFN0YXR1czogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGRfcmVkX3N0YXR1c19saXN0W3R5cGVdO1xuICAgIH0sXG5cbiAgICAvL+WIpOaWreaYr+WQpuacieaNkOeMrue6oueCuVxuICAgIGdldERvbmF0ZVJlZFN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy5nZXRSZWRTdGF0dXMoR3VpbGRDb25zdC5yZWRfaW5kZXguZG9uYXRlKTtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSB0cnVlKVxuICAgICAgICAgICAgcmV0dXJuIHN0YXR1c1xuICAgICAgICBzdGF0dXMgPSB0aGlzLmdldFJlZFN0YXR1cyhHdWlsZENvbnN0LnJlZF9pbmRleC5kb25hdGVfYWN0aXZpdHkpO1xuICAgICAgICByZXR1cm4gc3RhdHVzXG4gICAgfSxcblxuICAgIC8v5o2Q54yu5rS76LeD5a6d566x5oOF5Ya1XG4gICAgdXBkYXRlRG9uYXRlQm94SW5mbzogZnVuY3Rpb24gKGJveGVzLCBkb25hdGVfZXhwKSB7XG4gICAgICAgIHRoaXMuZ3VpbGRfZG9uYXRlX2FjdGl2aXR5X2xpc3QgPSB7fTtcbiAgICAgICAgdGhpcy5ndWlsZF9kb25hdGVfYWN0aXZpdHkgPSBkb25hdGVfZXhwOyAvL+W9k+WJjeWFrOS8muaNkOeMrua0u+i3g+W6plxuICAgICAgICBmb3IgKHZhciBpIGluIGJveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmd1aWxkX2RvbmF0ZV9hY3Rpdml0eV9saXN0W2JveGVzW2ldLmJveF9pZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2tEb25hdGVBY3Rpdml0eSgpO1xuICAgIH0sXG5cbiAgICAvL+iuvue9ruafkOS4quaNkOeMruWuneeuseeahOeKtuaAgVxuICAgIHNldERvbmF0ZUJveFN0YXR1czogZnVuY3Rpb24gKGJveF9pZCkge1xuICAgICAgICBpZiAodGhpcy5ndWlsZF9kb25hdGVfYWN0aXZpdHlfbGlzdCA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5ndWlsZF9kb25hdGVfYWN0aXZpdHlfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLmd1aWxkX2RvbmF0ZV9hY3Rpdml0eV9saXN0W2JveF9pZF0gPSB0cnVlO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkRXZlbnQuVXBkYXRlRG9uYXRlQm94U3RhdHVzLCBib3hfaWQpO1xuICAgICAgICB0aGlzLmNoZWNrRG9uYXRlQWN0aXZpdHkoKTtcbiAgICB9LFxuXG4gICAgLy/liKvkurrmjZDnjK7nmoTml7blgJnmm7TmlrDlvZPliY3mjZDnjK7ov5vluqYs5Y+v6IO95ZCM5q2l5Lya5pyJ57qi54K55o+Q56S6XG4gICAgdXBkYXRlRG9uYXRlQWN0aXZpdHk6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmd1aWxkX2RvbmF0ZV9hY3Rpdml0eSA9IHZhbHVlO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkRXZlbnQuVXBkYXRlRG9uYXRlQm94U3RhdHVzKTtcbiAgICAgICAgdGhpcy5jaGVja0RvbmF0ZUFjdGl2aXR5KCk7XG4gICAgfSxcblxuICAgIC8v55uR5rWL5piv5ZCm5pyJ5YWs5Lya5o2Q54yu5rS76LeD5a6d566xXG4gICAgY2hlY2tEb25hdGVBY3Rpdml0eTogZnVuY3Rpb24gKCkge1xuICAgICAgICBSZWRNZ3IuZ2V0SW5zdGFuY2UoKS5hZGRDYWxIYW5kbGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhY3Rpdml0eSA9IHRoaXMuZ3VpbGRfZG9uYXRlX2FjdGl2aXR5IHx8IDA7XG4gICAgICAgICAgICB2YXIgcmVkX3N0YXR1cyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBDb25maWcuZ3VpbGRfZGF0YS5kYXRhX2RvbmF0ZV9ib3gpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IENvbmZpZy5ndWlsZF9kYXRhLmRhdGFfZG9uYXRlX2JveFtpXTtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHkgPj0gdi5ib3hfdmFsICYmICF0aGlzLmd1aWxkX2RvbmF0ZV9hY3Rpdml0eV9saXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZF9zdGF0dXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlR3VpbGRSZWRTdGF0dXMoR3VpbGRDb25zdC5yZWRfaW5kZXguZG9uYXRlX2FjdGl2aXR5LCByZWRfc3RhdHVzKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCBSZWRJZHMuR3VpbGREb25hdGUpXG4gICAgfSxcblxuICAgIC8v6L+U5Zue5o2Q54yu5rS76LeD5bqm55qE5YC8XG4gICAgZ2V0RG9uYXRlQWN0aXZpdHlWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlsZF9kb25hdGVfYWN0aXZpdHkgfHwgMDtcbiAgICB9LFxuXG4gICAgLy/ojrflj5bmjZDnjK7lrp3nrrHnirbmgIFcbiAgICBnZXREb25hdGVCb3hTdGF0dXM6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlsZF9kb25hdGVfYWN0aXZpdHlfbGlzdFtpZF07XG4gICAgfVxufSk7XG4iXX0=