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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/mall/view/mall_item.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, '70481KJ12hOtZnX0lMjPCYr', 'mall_item');
// Scripts/mod/mall/view/mall_item.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: @syg.com(必填, 创建模块的人员)
// @description:
//      竖版商城列表子项
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var MallController = require("mall_controller");
 
var MallEvent = require("mall_event");
 
var RoleController = require("role_controller");
 
var MallItem = cc.Class({
  "extends": BasePanel,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("mall", "mall_item");
    this.ctrl = MallController.getInstance();
    this.size = cc.size(306, 143);
    this.width = 306;
    this.height = 143;
    this.vo = null;
    this.data = null;
    this.is_touch = true;
    this.role_vo = RoleController.getInstance().getRoleVo();
  },
  initPanel: function initPanel() {
    this.main_container = this.root_wnd.getChildByName("main_container");
    this.name = this.main_container.getChildByName("name").getComponent(cc.Label);
    this.coin = this.main_container.getChildByName("count_bg").getChildByName("coin").getComponent(cc.Sprite);
    this.price = this.main_container.getChildByName("count_bg").getChildByName("price").getComponent(cc.Label);
    this.good = this.main_container.getChildByName("good");
    this.goods_item = ItemsPool.getInstance().getItem("backpack_item");
    this.goods_item.initConfig(false, 1, false, true); // this.goods_item.setPosition(10 + BackPackItem.Width / 2, this.root_wnd.getContentSize().height / 2)
 
    this.goods_item.setParent(this.good);
    this.goods_item.show();
    this.discount = this.main_container.getChildByName("discount");
    this.discount_num = this.discount.getChildByName("discount_num").getComponent(cc.Label);
    this.discount.active = false;
    this.discount_label = this.main_container.getChildByName("discount_label").getComponent(cc.RichText);
    this.sold = this.main_container.getChildByName("sold");
    this.sold.active = false;
    this.grey = this.main_container.getChildByName("grey");
    this.grey.active = false;
    this.need_icon = this.main_container.getChildByName("need_icon");
    this.need_label = this.main_container.getChildByName("need_label").getComponent(cc.Label);
    this.need_icon.active = false;
    this.need_label.node.active = false;
    this.setSellAll(false);
    this.setData(this.data);
  },
  registerEvent: function registerEvent() {
    this.main_container.on(cc.Node.EventType.TOUCH_END, function () {
      if (!this.is_touch) return;
 
      if (this.vip_limit_flag > 0) {
        message(cc.js.formatStr(Utils.TI18N("VIP%s以上可购买"), this.vip_limit_flag));
        return;
      }
 
      if (this.rank_limit_flag) {
        message(Utils.TI18N("未满足购买条件"));
        return;
      }
 
      if (this.limit_glev_status) {
        message(Utils.TI18N("该商品暂未达解锁条件哦,请努力提高公会等级"));
        return;
      }
 
      if (this.callback) this.callback(this.data);
    }, this); //除神秘商城以外的购买成功
 
    this.addGlobalEvent(MallEvent.Buy_Success_Event, function (data) {
      if (this.data.id && data.eid == this.data.id && Utils.next(data.ext || {}) != null) {
        this.data.has_buy = data.ext[0].val;
        this.discount_label.string = cc.js.formatStr(Utils.TI18N("<color=#452505>%s <color=#289b14>%s/%s</color>个</color>"), this.str, this.data.has_buy, this.data.limit_num);
        if (this.data.has_buy == this.data.limit_num) this.setSellAll(true);
      }
    }.bind(this)); //神秘/神格商城购买成功
 
    this.addGlobalEvent(MallEvent.Buy_One_Success, function (data) {
      if (this.data.order && data.order == this.data.order) {
        this.data.has_buy = this.data.has_buy + 1;
        this.discount_label.string = cc.js.formatStr(Utils.TI18N("<color=#452505>%s <color=#289b14>%s/%s</color>个</color>"), this.str, this.data.has_buy, this.data.limit_num);
        var limit_num = this.data.limit_count || this.data.limit_num;
        if (limit_num != null || this.data.has_buy >= this.data.limit_num) this.setSellAll(true);
      }
    }.bind(this));
 
    if (this.role_vo) {
      if (this.role_update_event == null) {
        this.role_update_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
          if (key == "gold" || key == "red_gold" || key == "hero_soul" || key == "arena_cent" || key == "friend_point" || key == "guild") {
            if (this.data["limit_day"] == 0 && this.data["limit_month"] == 0 && this.data["limit_week"] == 0 && this.data["limit_count"] == 0) {
              //不限购的非神秘神格商店物品
              if (this.data.shop_type != 4 && this.data.shop_type != 2) {
                if (this.pay_type != "red_gold_or_gold") {
                  if (this.role_vo[this.pay_type] && this.role_vo[this.pay_type] < 20 * this.data.price) {
                    var temp = Math.floor(this.role_vo[this.pay_type] / this.data.price);
 
                    if (temp >= 1) {
                      this.data.limit_num = temp;
                    } else {
                      this.data.limit_num = 1;
                    }
                  } else {
                    this.data.limit_num = 20;
                  }
                } else {
                  var own = this.role_vo["gold"] + this.role_vo["red_gold"];
 
                  if (own && own < 20 * this.data.price) {
                    var temp = Math.floor(own / this.data.price);
 
                    if (temp >= 1) {
                      this.data.limit_num = temp;
                    } else {
                      this.data.limit_num = 1;
                    }
                  } else {
                    this.data.limit_num = 20;
                  }
                }
              }
            }
          }
 
          if (key == "vip_lev") {
            if (this.vip_limit_flag > 0) {
              this.setData(this.data);
            }
          }
        }, this);
      }
    }
  },
  setData: function setData(data) {
    this.data = data;
    if (this.root_wnd == null) return; // return
 
    var shop_num = null; //商品类型
 
    if (data.shop_type != null) shop_num = data.shop_type;else shop_num = data.type;
    this.data = Utils.deepCopy(data);
    var config = Utils.getItemConfig(data.item_bid || data.item_id);
    config = Utils.deepCopy(config);
    var pay_config, pay_type;
    config.bid = data.item_bid || data.item_id;
 
    if (config) {
      if (data.item_num && data.item_num != 1) {
        config.num = data.item_num;
      }
 
      this.goods_item.setData(config);
      this.name.string = config.name;
    } // this.goods_item.setDefaultTips();
 
 
    if (typeof data.pay_type == "number") {
      pay_config = Utils.getItemConfig(data.pay_type);
      pay_type = gdata("item_data", "data_assets_id2label", [data.pay_type]);
    } else {
      pay_config = Utils.getItemConfig(gdata("item_data", "data_assets_label2id", [data.pay_type]));
      pay_type = data.pay_type;
    }
 
    this.pay_type = pay_type;
    this.price.string = data.price;
    var item_res_path = PathTool.getItemRes(pay_config.icon);
 
    if (item_res_path) {
      this.loadRes(item_res_path, function (res_object) {
        this.coin.spriteFrame = res_object;
      }.bind(this));
    } //限购
 
 
    this.str = "";
    var limit_num = 0;
    var limit_rank = 0;
    var limit_vip = 0;
    var is_show_limit_label = false; //天梯排名限购
 
    this.rank_limit_flag = false;
 
    if (data.limit_rank && data.limit_rank > 0) {
      if (shop_num == MallConst.MallType.Ladder) {
        var ladder_data = LadderController.getInstance().getModel().getLadderMyBaseInfo();
 
        if (ladder_data && ladder_data.best_rank == 0 || ladder_data.best_rank > data.limit_rank) {
          limit_rank = data.limit_rank;
          is_show_limit_label = true;
        }
      }
    } //vip等级限购
 
 
    this.vip_limit_flag = 0;
 
    if (data.limit_vip && data.limit_vip > 0) {
      if (this.role_vo && this.role_vo.vip_lev < data.limit_vip) {
        is_show_limit_label = true;
        limit_vip = data.limit_vip;
      }
    }
 
    if (is_show_limit_label == false) {
      if (data.limit_count != null && data.limit_count > 0) {
        this.str = "限购";
        limit_num = data.limit_count;
        is_show_limit_label = true;
      } else if (data.limit_month != null && data.limit_month > 0) {
        this.str = "每月限购";
        limit_num = data.limit_month;
        is_show_limit_label = true;
      } else if (data.limit_week != null && data.limit_week > 0) {
        this.str = "每周限购";
        limit_num = data.limit_week;
        is_show_limit_label = true;
      } else if (data.limit_day != null && data.limit_day > 0) {
        this.str = "每日限购";
        limit_num = data.limit_day;
        is_show_limit_label = true;
      } else {
        if (data.shop_type == 4 || data.shop_type == 2) {
          limit_num = 1;
          is_show_limit_label = true;
        } else {
          if (pay_type != "red_gold_or_gold") {
            if (this.role_vo[pay_type] && this.role_vo[pay_type] < 20 * data.price) {
              //取资产最大可买
              var temp = Math.floor(this.role_vo[pay_type] / data.price);
              if (temp >= 1) limit_num = temp;else limit_num = 1;
            } else {
              limit_num = 20; //无限制购买的物品 一次购买上限20
 
              is_show_limit_label = false;
            }
          } else {
            var own = this.role_vo.gold + this.role_vo.red_gold;
 
            if (own != null && own < 20 * data.price) {
              var temp = Math.floor(own / data.price);
              if (temp >= 1) limit_num = temp;else limit_num = 1;
            } else {
              limit_num = 20; //无限制购买的物品 一次购买上限20
 
              is_show_limit_label = false;
            }
          }
        }
      }
    }
 
    if (limit_vip > 0 && is_show_limit_label) {
      this.discount_label.node.active = true;
      this.discount_label.string = cc.js.formatStr(Utils.TI18N("<color=#452505><color=#289b14>      VIP%d</color>专属</color>"), limit_vip);
      this.setSellAll(false);
      this.vip_limit_flag = limit_vip;
    } else if (limit_num > 0 && is_show_limit_label) {
      this.discount_label.node.active = true;
      this.discount_label.string = cc.js.formatStr(Utils.TI18N("<color=#452505>%s <color=#289b14>%s/%s</color>个</color>"), this.str, data.has_buy, limit_num);
      if (data.has_buy == limit_num) this.setSellAll(true);else this.setSellAll(false);
    } else if (limit_rank > 0 && is_show_limit_label) {
      this.discount_label.node.active = true;
      this.discount_label.string = cc.js.formatStr(Utils.TI18N("<color=#452505><color=#ff1f0e>需达到%s名</color></color>"), limit_rank);
      this.setSellAll(false);
      this.rank_limit_flag = true;
    } else {
      this.discount_label.node.active = false;
      if (data.has_buy == 1) this.setSellAll(true);else this.setSellAll(false);
    }
 
    this.data.limit_num = limit_num;
    this.data.is_show_limit_label = is_show_limit_label; //折扣标签和折扣价格
 
    if (data.label != null && data.label > 0) {
      //表里的
      this.discount.active = true;
      this.discount_num.string = data.label + Utils.TI18N("折");
    } else if (data.discount_type != null && data.discount_type > 0) {
      //服务器信息
      this.discount.active = true;
      this.discount_num.string = data.discount_type + Utils.TI18N("折");
    } else if (data.lable != null && data.lable > 0) {
      this.discount.active = true;
      this.discount_num.string = Utils.TI18N("超值");
    } else {
      this.discount.active = false;
    }
 
    if (data.discount != null && data.discount > 0) {
      this.price.string = data.discount;
    }
 
    if (this.data.type == 10 || this.data.type == 11 || this.data.type == 12 || this.data.type == 13) {
      //装备特殊处理显示等级显示
      this.isShowLevLimit(true, this.data.lev);
    } else {
      this.isShowLevLimit(false);
    }
 
    if (this.data.type == 5 && this.data.glev != null) {
      this.isShowGLevLimit(true, this.data.glev);
    } else {
      this.isShowGLevLimit(false, 0);
    }
 
    var bid = this.ctrl.getNeedBid();
 
    if (bid != null && (bid == data.item_id || bid == data.item_bid)) {
      this.need_icon.active = true;
      this.need_label.node.active = true;
    } else {
      this.need_icon.active = false;
      this.need_label.node.active = false;
    }
 
    if (this.data.type == 3) {
      var is_show = this.ctrl.getModel().checkHeroChips(data.item_id);
      this.showChipTag(is_show);
    } else {
      this.showChipTag(false);
    }
  },
  setSellAll: function setSellAll(bool) {
    if (this.root_wnd == null) return;
    this.sold.active = bool;
    this.grey.active = bool;
    this.is_touch = !bool;
  },
  showChipTag: function showChipTag(status) {},
  isShowLevLimit: function isShowLevLimit(status, lev) {
    if (!this.limit_lev_label) {}
  },
  isShowGLevLimit: function isShowGLevLimit(status, lev) {},
  addCallBack: function addCallBack(value) {
    this.callback = value;
  },
  onShow: function onShow() {},
  onDelete: function onDelete() {
    if (this.role_update_event) {
      if (this.role_vo) {
        this.role_vo.unbind(this.role_update_event);
        this.role_update_event = null;
        this.role_vo = null;
      }
    }
 
    if (this.goods_item) {
      this.goods_item.deleteMe();
      this.goods_item = null;
    } // if(this.main_container){
    //     this.main_container.off(cc.Node.EventType.TOUCH_END,function(){},this)
    // }
 
  }
});
module.exports = MallItem;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxtYWxsXFx2aWV3XFxtYWxsX2l0ZW0uanMiXSwibmFtZXMiOlsiTWFsbENvbnRyb2xsZXIiLCJyZXF1aXJlIiwiTWFsbEV2ZW50IiwiUm9sZUNvbnRyb2xsZXIiLCJNYWxsSXRlbSIsImNjIiwiQ2xhc3MiLCJCYXNlUGFuZWwiLCJjdG9yIiwicHJlZmFiUGF0aCIsIlBhdGhUb29sIiwiZ2V0UHJlZmFiUGF0aCIsImN0cmwiLCJnZXRJbnN0YW5jZSIsInNpemUiLCJ3aWR0aCIsImhlaWdodCIsInZvIiwiZGF0YSIsImlzX3RvdWNoIiwicm9sZV92byIsImdldFJvbGVWbyIsImluaXRQYW5lbCIsIm1haW5fY29udGFpbmVyIiwicm9vdF93bmQiLCJnZXRDaGlsZEJ5TmFtZSIsIm5hbWUiLCJnZXRDb21wb25lbnQiLCJMYWJlbCIsImNvaW4iLCJTcHJpdGUiLCJwcmljZSIsImdvb2QiLCJnb29kc19pdGVtIiwiSXRlbXNQb29sIiwiZ2V0SXRlbSIsImluaXRDb25maWciLCJzZXRQYXJlbnQiLCJzaG93IiwiZGlzY291bnQiLCJkaXNjb3VudF9udW0iLCJhY3RpdmUiLCJkaXNjb3VudF9sYWJlbCIsIlJpY2hUZXh0Iiwic29sZCIsImdyZXkiLCJuZWVkX2ljb24iLCJuZWVkX2xhYmVsIiwibm9kZSIsInNldFNlbGxBbGwiLCJzZXREYXRhIiwicmVnaXN0ZXJFdmVudCIsIm9uIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsInZpcF9saW1pdF9mbGFnIiwibWVzc2FnZSIsImpzIiwiZm9ybWF0U3RyIiwiVXRpbHMiLCJUSTE4TiIsInJhbmtfbGltaXRfZmxhZyIsImxpbWl0X2dsZXZfc3RhdHVzIiwiY2FsbGJhY2siLCJhZGRHbG9iYWxFdmVudCIsIkJ1eV9TdWNjZXNzX0V2ZW50IiwiaWQiLCJlaWQiLCJuZXh0IiwiZXh0IiwiaGFzX2J1eSIsInZhbCIsInN0cmluZyIsInN0ciIsImxpbWl0X251bSIsImJpbmQiLCJCdXlfT25lX1N1Y2Nlc3MiLCJvcmRlciIsImxpbWl0X2NvdW50Iiwicm9sZV91cGRhdGVfZXZlbnQiLCJFdmVudElkIiwiVVBEQVRFX1JPTEVfQVRUUklCVVRFIiwia2V5IiwidmFsdWUiLCJzaG9wX3R5cGUiLCJwYXlfdHlwZSIsInRlbXAiLCJNYXRoIiwiZmxvb3IiLCJvd24iLCJzaG9wX251bSIsInR5cGUiLCJkZWVwQ29weSIsImNvbmZpZyIsImdldEl0ZW1Db25maWciLCJpdGVtX2JpZCIsIml0ZW1faWQiLCJwYXlfY29uZmlnIiwiYmlkIiwiaXRlbV9udW0iLCJudW0iLCJnZGF0YSIsIml0ZW1fcmVzX3BhdGgiLCJnZXRJdGVtUmVzIiwiaWNvbiIsImxvYWRSZXMiLCJyZXNfb2JqZWN0Iiwic3ByaXRlRnJhbWUiLCJsaW1pdF9yYW5rIiwibGltaXRfdmlwIiwiaXNfc2hvd19saW1pdF9sYWJlbCIsIk1hbGxDb25zdCIsIk1hbGxUeXBlIiwiTGFkZGVyIiwibGFkZGVyX2RhdGEiLCJMYWRkZXJDb250cm9sbGVyIiwiZ2V0TW9kZWwiLCJnZXRMYWRkZXJNeUJhc2VJbmZvIiwiYmVzdF9yYW5rIiwidmlwX2xldiIsImxpbWl0X21vbnRoIiwibGltaXRfd2VlayIsImxpbWl0X2RheSIsImdvbGQiLCJyZWRfZ29sZCIsImxhYmVsIiwiZGlzY291bnRfdHlwZSIsImxhYmxlIiwiaXNTaG93TGV2TGltaXQiLCJsZXYiLCJnbGV2IiwiaXNTaG93R0xldkxpbWl0IiwiZ2V0TmVlZEJpZCIsImlzX3Nob3ciLCJjaGVja0hlcm9DaGlwcyIsInNob3dDaGlwVGFnIiwiYm9vbCIsInN0YXR1cyIsImxpbWl0X2xldl9sYWJlbCIsImFkZENhbGxCYWNrIiwib25TaG93Iiwib25EZWxldGUiLCJ1bmJpbmQiLCJkZWxldGVNZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsY0FBYyxHQUFHQyxP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SUFBTCxDQUFVSixNQUFWLEdBQW1CZ0csSUFBbkI7QUFDQSxTQUFLdEgsUUFBTCxHQUFnQixDQUFDc0gsSUFBakI7QUFDSCxHQTdVbUI7QUErVXBCRCxFQUFBQSxXQUFXLEVBQUUscUJBQVVFLE1BQVYsRUFBa0IsQ0FFOUIsQ0FqVm1CO0FBbVZwQlQsRUFBQUEsY0FBYyxFQUFFLHdCQUFVUyxNQUFWLEVBQWtCUixHQUFsQixFQUF1QjtBQUNuQyxRQUFHLENBQUMsS0FBS1MsZUFBVCxFQUF5QixDQUV4QjtBQUNKLEdBdlZtQjtBQXlWcEJQLEVBQUFBLGVBQWUsRUFBRSx5QkFBVU0sTUFBVixFQUFrQlIsR0FBbEIsRUFBdUIsQ0FFdkMsQ0EzVm1CO0FBNlZwQlUsRUFBQUEsV0FBVyxFQUFDLHFCQUFTeEQsS0FBVCxFQUFlO0FBQ3ZCLFNBQUtwQixRQUFMLEdBQWdCb0IsS0FBaEI7QUFDSCxHQS9WbUI7QUFpV3BCeUQsRUFBQUEsTUFBTSxFQUFFLGtCQUFZLENBRW5CLENBbldtQjtBQXFXcEJDLEVBQUFBLFFBQVEsRUFBRSxvQkFBWTtBQUNsQixRQUFHLEtBQUs5RCxpQkFBUixFQUEwQjtBQUN0QixVQUFHLEtBQUs1RCxPQUFSLEVBQWdCO0FBQ1osYUFBS0EsT0FBTCxDQUFhMkgsTUFBYixDQUFvQixLQUFLL0QsaUJBQXpCO0FBQ0EsYUFBS0EsaUJBQUwsR0FBeUIsSUFBekI7QUFDQSxhQUFLNUQsT0FBTCxHQUFlLElBQWY7QUFDSDtBQUNKOztBQUNELFFBQUcsS0FBS2EsVUFBUixFQUFtQjtBQUNmLFdBQUtBLFVBQUwsQ0FBZ0IrRyxRQUFoQjtBQUNBLFdBQUsvRyxVQUFMLEdBQWtCLElBQWxCO0FBQ0gsS0FYaUIsQ0FZbEI7QUFDQTtBQUNBOztBQUVIO0FBclhtQixDQUFULENBQWY7QUEwWEFnSCxNQUFNLENBQUNDLE9BQVAsR0FBaUI5SSxRQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gQGF1dGhvcjogQHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXHJcbi8vIEBkZXNjcmlwdGlvbjpcclxuLy8gICAgICDnq5bniYjllYbln47liJfooajlrZDpoblcclxuLy8gPGJyLz5DcmVhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG52YXIgTWFsbENvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFsbF9jb250cm9sbGVyXCIpO1xyXG52YXIgTWFsbEV2ZW50ID0gcmVxdWlyZShcIm1hbGxfZXZlbnRcIik7XHJcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XHJcblxyXG52YXIgTWFsbEl0ZW0gPSBjYy5DbGFzcyh7XHJcbiAgICBleHRlbmRzOiBCYXNlUGFuZWwsXHJcblxyXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJtYWxsXCIsIFwibWFsbF9pdGVtXCIpO1xyXG4gICAgICAgIHRoaXMuY3RybCA9IE1hbGxDb250cm9sbGVyLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgdGhpcy5zaXplID0gY2Muc2l6ZSgzMDYsIDE0Myk7XHJcbiAgICAgICAgdGhpcy53aWR0aCA9IDMwNjtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IDE0MztcclxuICAgICAgICB0aGlzLnZvID0gbnVsbDtcclxuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaXNfdG91Y2ggPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIGluaXRQYW5lbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMubWFpbl9jb250YWluZXIgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwibWFpbl9jb250YWluZXJcIik7XHJcblxyXG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJuYW1lXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XHJcbiAgICAgICAgdGhpcy5jb2luID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImNvdW50X2JnXCIpLmdldENoaWxkQnlOYW1lKFwiY29pblwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcclxuICAgICAgICB0aGlzLnByaWNlID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImNvdW50X2JnXCIpLmdldENoaWxkQnlOYW1lKFwicHJpY2VcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcclxuXHJcbiAgICAgICAgdGhpcy5nb29kID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImdvb2RcIik7XHJcbiAgICAgICAgdGhpcy5nb29kc19pdGVtID0gSXRlbXNQb29sLmdldEluc3RhbmNlKCkuZ2V0SXRlbShcImJhY2twYWNrX2l0ZW1cIik7XHJcbiAgICAgICAgdGhpcy5nb29kc19pdGVtLmluaXRDb25maWcoZmFsc2UsIDEsIGZhbHNlLCB0cnVlKVxyXG4gICAgICAgIC8vIHRoaXMuZ29vZHNfaXRlbS5zZXRQb3NpdGlvbigxMCArIEJhY2tQYWNrSXRlbS5XaWR0aCAvIDIsIHRoaXMucm9vdF93bmQuZ2V0Q29udGVudFNpemUoKS5oZWlnaHQgLyAyKVxyXG4gICAgICAgIHRoaXMuZ29vZHNfaXRlbS5zZXRQYXJlbnQodGhpcy5nb29kKTtcclxuICAgICAgICB0aGlzLmdvb2RzX2l0ZW0uc2hvdygpO1xyXG5cclxuICAgICAgICB0aGlzLmRpc2NvdW50ID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImRpc2NvdW50XCIpO1xyXG4gICAgICAgIHRoaXMuZGlzY291bnRfbnVtID0gdGhpcy5kaXNjb3VudC5nZXRDaGlsZEJ5TmFtZShcImRpc2NvdW50X251bVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xyXG4gICAgICAgIHRoaXMuZGlzY291bnQuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5kaXNjb3VudF9sYWJlbCA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJkaXNjb3VudF9sYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuUmljaFRleHQpO1xyXG5cclxuICAgICAgICB0aGlzLnNvbGQgPSB0aGlzLm1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwic29sZFwiKTtcclxuICAgICAgICB0aGlzLnNvbGQuYWN0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuZ3JleSA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJncmV5XCIpO1xyXG4gICAgICAgIHRoaXMuZ3JleS5hY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5uZWVkX2ljb24gPSB0aGlzLm1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwibmVlZF9pY29uXCIpO1xyXG4gICAgICAgIHRoaXMubmVlZF9sYWJlbCA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJuZWVkX2xhYmVsXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XHJcbiAgICAgICAgdGhpcy5uZWVkX2ljb24uYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5uZWVkX2xhYmVsLm5vZGUuYWN0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0U2VsbEFsbChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5zZXREYXRhKHRoaXMuZGF0YSk7XHJcbiAgICB9LFxyXG5cclxuICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLm1haW5fY29udGFpbmVyLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCxmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNfdG91Y2gpXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgaWYodGhpcy52aXBfbGltaXRfZmxhZyA+IDApe1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZShjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCJWSVAlc+S7peS4iuWPr+i0reS5sFwiKSx0aGlzLnZpcF9saW1pdF9mbGFnKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5yYW5rX2xpbWl0X2ZsYWcpe1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuacqua7oei2s+i0reS5sOadoeS7tlwiKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5saW1pdF9nbGV2X3N0YXR1cyl7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi6K+l5ZWG5ZOB5pqC5pyq6L6+6Kej6ZSB5p2h5Lu25ZOm77yM6K+35Yqq5Yqb5o+Q6auY5YWs5Lya562J57qnXCIpKTtcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLmRhdGEpO1xyXG4gICAgICAgIH0sdGhpcylcclxuXHJcbiAgICAgICAgLy/pmaTnpZ7np5jllYbln47ku6XlpJbnmoTotK3kubDmiJDlip9cclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KE1hbGxFdmVudC5CdXlfU3VjY2Vzc19FdmVudCwgZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pZCAmJiBkYXRhLmVpZCA9PSB0aGlzLmRhdGEuaWQgJiYgVXRpbHMubmV4dChkYXRhLmV4dCB8fCB7fSkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLmhhc19idXkgPSBkYXRhLmV4dFswXS52YWw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2NvdW50X2xhYmVsLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIjxjb2xvcj0jNDUyNTA1PiVzIDxjb2xvcj0jMjg5YjE0PiVzLyVzPC9jb2xvcj7kuKo8L2NvbG9yPlwiKSwgdGhpcy5zdHIsIHRoaXMuZGF0YS5oYXNfYnV5LHRoaXMuZGF0YS5saW1pdF9udW0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5oYXNfYnV5ID09IHRoaXMuZGF0YS5saW1pdF9udW0pXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxsQWxsKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG5cclxuICAgICAgICAvL+elnuenmC/npZ7moLzllYbln47otK3kubDmiJDlip9cclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KE1hbGxFdmVudC5CdXlfT25lX1N1Y2Nlc3MsIGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEub3JkZXIgJiYgZGF0YS5vcmRlciA9PSB0aGlzLmRhdGEub3JkZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5oYXNfYnV5ID0gdGhpcy5kYXRhLmhhc19idXkrMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzY291bnRfbGFiZWwuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiPGNvbG9yPSM0NTI1MDU+JXMgPGNvbG9yPSMyODliMTQ+JXMvJXM8L2NvbG9yPuS4qjwvY29sb3I+XCIpLCB0aGlzLnN0ciwgdGhpcy5kYXRhLmhhc19idXksIHRoaXMuZGF0YS5saW1pdF9udW0pO1xyXG4gICAgICAgICAgICAgICAgdmFyIGxpbWl0X251bSA9IHRoaXMuZGF0YS5saW1pdF9jb3VudCB8fCB0aGlzLmRhdGEubGltaXRfbnVtO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpbWl0X251bSAhPSBudWxsIHx8IHRoaXMuZGF0YS5oYXNfYnV5ID49IHRoaXMuZGF0YS5saW1pdF9udW0pXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxsQWxsKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG5cclxuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfdXBkYXRlX2V2ZW50ID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9sZV91cGRhdGVfZXZlbnQgPSB0aGlzLnJvbGVfdm8uYmluZChFdmVudElkLlVQREFURV9ST0xFX0FUVFJJQlVURSxmdW5jdGlvbihrZXksdmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGtleSA9PSBcImdvbGRcInx8a2V5ID09IFwicmVkX2dvbGRcIiB8fCBrZXkgPT0gXCJoZXJvX3NvdWxcIiB8fCBrZXkgPT0gXCJhcmVuYV9jZW50XCIgfHwga2V5ID09IFwiZnJpZW5kX3BvaW50XCIgfHwga2V5ID09IFwiZ3VpbGRcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YVtcImxpbWl0X2RheVwiXSA9PSAwICYmIHRoaXMuZGF0YVtcImxpbWl0X21vbnRoXCJdID09IDAgJiYgdGhpcy5kYXRhW1wibGltaXRfd2Vla1wiXSA9PSAwICYmIHRoaXMuZGF0YVtcImxpbWl0X2NvdW50XCJdID09MCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+S4jemZkOi0reeahOmdnuelnuenmOelnuagvOWVhuW6l+eJqeWTgVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLnNob3BfdHlwZSAhPSA0ICYmIHRoaXMuZGF0YS5zaG9wX3R5cGUgIT0gMil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5wYXlfdHlwZSAhPSBcInJlZF9nb2xkX29yX2dvbGRcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMucm9sZV92b1t0aGlzLnBheV90eXBlXSAmJiB0aGlzLnJvbGVfdm9bdGhpcy5wYXlfdHlwZV0gPCgyMCp0aGlzLmRhdGEucHJpY2UpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gTWF0aC5mbG9vcih0aGlzLnJvbGVfdm9bdGhpcy5wYXlfdHlwZV0vdGhpcy5kYXRhLnByaWNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRlbXAgPj0gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmxpbWl0X251bSA9IHRlbXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubGltaXRfbnVtID0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5saW1pdF9udW0gPSAyMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3duID0gdGhpcy5yb2xlX3ZvW1wiZ29sZFwiXSArIHRoaXMucm9sZV92b1tcInJlZF9nb2xkXCJdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihvd24gJiYgb3duIDwoMjAqdGhpcy5kYXRhLnByaWNlKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IE1hdGguZmxvb3Iob3duL3RoaXMuZGF0YS5wcmljZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wID49IDEpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5saW1pdF9udW0gPSB0ZW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmxpbWl0X251bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmxpbWl0X251bSA9IDIwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gXCJ2aXBfbGV2XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnZpcF9saW1pdF9mbGFnID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGEodGhpcy5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sdGhpcylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgc2V0RGF0YTogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kID09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIC8vIHJldHVyblxyXG4gICAgICAgIHZhciBzaG9wX251bSA9IG51bGw7IC8v5ZWG5ZOB57G75Z6LXHJcbiAgICAgICAgaWYgKGRhdGEuc2hvcF90eXBlICE9IG51bGwpXHJcbiAgICAgICAgICAgIHNob3BfbnVtID0gZGF0YS5zaG9wX3R5cGU7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBzaG9wX251bSA9IGRhdGEudHlwZTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhID0gVXRpbHMuZGVlcENvcHkoZGF0YSk7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoZGF0YS5pdGVtX2JpZCB8fCBkYXRhLml0ZW1faWQpO1xyXG4gICAgICAgIGNvbmZpZyA9IFV0aWxzLmRlZXBDb3B5KGNvbmZpZylcclxuICAgICAgICB2YXIgcGF5X2NvbmZpZywgcGF5X3R5cGU7XHJcbiAgICAgICAgY29uZmlnLmJpZCA9IGRhdGEuaXRlbV9iaWQgfHwgZGF0YS5pdGVtX2lkO1xyXG4gICAgICAgIGlmIChjb25maWcpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEuaXRlbV9udW0gJiYgZGF0YS5pdGVtX251bSAhPSAxKXtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy5udW0gPSBkYXRhLml0ZW1fbnVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZ29vZHNfaXRlbS5zZXREYXRhKGNvbmZpZyk7XHJcbiAgICAgICAgICAgIHRoaXMubmFtZS5zdHJpbmcgPSBjb25maWcubmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy5nb29kc19pdGVtLnNldERlZmF1bHRUaXBzKCk7XHJcbiAgICAgICAgaWYodHlwZW9mKGRhdGEucGF5X3R5cGUpPT1cIm51bWJlclwiKXtcclxuICAgICAgICAgICAgcGF5X2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoZGF0YS5wYXlfdHlwZSk7XHJcbiAgICAgICAgICAgIHBheV90eXBlID0gZ2RhdGEoXCJpdGVtX2RhdGFcIixcImRhdGFfYXNzZXRzX2lkMmxhYmVsXCIsW2RhdGEucGF5X3R5cGVdKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcGF5X2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoZ2RhdGEoXCJpdGVtX2RhdGFcIixcImRhdGFfYXNzZXRzX2xhYmVsMmlkXCIsW2RhdGEucGF5X3R5cGVdKSk7XHJcbiAgICAgICAgICAgIHBheV90eXBlID0gZGF0YS5wYXlfdHlwZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wYXlfdHlwZSA9IHBheV90eXBlO1xyXG4gICAgICAgIHRoaXMucHJpY2Uuc3RyaW5nID0gZGF0YS5wcmljZTtcclxuICAgICAgICB2YXIgaXRlbV9yZXNfcGF0aCA9IFBhdGhUb29sLmdldEl0ZW1SZXMocGF5X2NvbmZpZy5pY29uKVxyXG4gICAgICAgIGlmIChpdGVtX3Jlc19wYXRoKXtcclxuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGl0ZW1fcmVzX3BhdGgsIGZ1bmN0aW9uIChyZXNfb2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvaW4uc3ByaXRlRnJhbWUgPSByZXNfb2JqZWN0O1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICAvL+mZkOi0rVxyXG4gICAgICAgIHRoaXMuc3RyID0gXCJcIjtcclxuICAgICAgICB2YXIgbGltaXRfbnVtID0gMDtcclxuICAgICAgICB2YXIgbGltaXRfcmFuayA9IDA7XHJcbiAgICAgICAgdmFyIGxpbWl0X3ZpcCA9IDA7XHJcbiAgICAgICAgdmFyIGlzX3Nob3dfbGltaXRfbGFiZWwgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy/lpKnmoq/mjpLlkI3pmZDotK1cclxuICAgICAgICB0aGlzLnJhbmtfbGltaXRfZmxhZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChkYXRhLmxpbWl0X3JhbmsgJiYgZGF0YS5saW1pdF9yYW5rID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoc2hvcF9udW0gPT0gTWFsbENvbnN0Lk1hbGxUeXBlLkxhZGRlcikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGxhZGRlcl9kYXRhID0gTGFkZGVyQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0TGFkZGVyTXlCYXNlSW5mbygpO1xyXG4gICAgICAgICAgICAgICAgaWYobGFkZGVyX2RhdGEgJiYgbGFkZGVyX2RhdGEuYmVzdF9yYW5rID09IDAgfHwgbGFkZGVyX2RhdGEuYmVzdF9yYW5rID4gZGF0YS5saW1pdF9yYW5rKXtcclxuICAgICAgICAgICAgICAgICAgICBsaW1pdF9yYW5rID0gZGF0YS5saW1pdF9yYW5rO1xyXG4gICAgICAgICAgICAgICAgICAgIGlzX3Nob3dfbGltaXRfbGFiZWwgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdmlw562J57qn6ZmQ6LStXHJcbiAgICAgICAgdGhpcy52aXBfbGltaXRfZmxhZyA9IDA7XHJcbiAgICAgICAgaWYgKGRhdGEubGltaXRfdmlwICYmIGRhdGEubGltaXRfdmlwID4gMCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvICYmIHRoaXMucm9sZV92by52aXBfbGV2IDwgZGF0YS5saW1pdF92aXApIHtcclxuICAgICAgICAgICAgICAgIGlzX3Nob3dfbGltaXRfbGFiZWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbGltaXRfdmlwID0gZGF0YS5saW1pdF92aXA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpc19zaG93X2xpbWl0X2xhYmVsID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLmxpbWl0X2NvdW50ICE9IG51bGwgJiYgZGF0YS5saW1pdF9jb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RyID0gXCLpmZDotK1cIjtcclxuICAgICAgICAgICAgICAgIGxpbWl0X251bSA9IGRhdGEubGltaXRfY291bnQ7XHJcbiAgICAgICAgICAgICAgICBpc19zaG93X2xpbWl0X2xhYmVsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmxpbWl0X21vbnRoICE9IG51bGwgJiYgZGF0YS5saW1pdF9tb250aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RyID0gXCLmr4/mnIjpmZDotK1cIjtcclxuICAgICAgICAgICAgICAgIGxpbWl0X251bSA9IGRhdGEubGltaXRfbW9udGg7XHJcbiAgICAgICAgICAgICAgICBpc19zaG93X2xpbWl0X2xhYmVsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmxpbWl0X3dlZWsgIT0gbnVsbCAmJiBkYXRhLmxpbWl0X3dlZWsgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0ciA9IFwi5q+P5ZGo6ZmQ6LStXCI7XHJcbiAgICAgICAgICAgICAgICBsaW1pdF9udW0gPSBkYXRhLmxpbWl0X3dlZWs7XHJcbiAgICAgICAgICAgICAgICBpc19zaG93X2xpbWl0X2xhYmVsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmxpbWl0X2RheSAhPSBudWxsICYmIGRhdGEubGltaXRfZGF5ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdHIgPSBcIuavj+aXpemZkOi0rVwiO1xyXG4gICAgICAgICAgICAgICAgbGltaXRfbnVtID0gZGF0YS5saW1pdF9kYXk7XHJcbiAgICAgICAgICAgICAgICBpc19zaG93X2xpbWl0X2xhYmVsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnNob3BfdHlwZSA9PSA0IHx8IGRhdGEuc2hvcF90eXBlID09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBsaW1pdF9udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlzX3Nob3dfbGltaXRfbGFiZWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGF5X3R5cGUgIT0gXCJyZWRfZ29sZF9vcl9nb2xkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucm9sZV92b1twYXlfdHlwZV0gJiYgdGhpcy5yb2xlX3ZvW3BheV90eXBlXSA8ICgyMCAqIGRhdGEucHJpY2UpKSB7IC8v5Y+W6LWE5Lqn5pyA5aSn5Y+v5LmwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IE1hdGguZmxvb3IodGhpcy5yb2xlX3ZvW3BheV90eXBlXSAvIGRhdGEucHJpY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAgPj0gMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdF9udW0gPSB0ZW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0X251bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdF9udW0gPSAyMDsgLy/ml6DpmZDliLbotK3kubDnmoTnianlk4Eg5LiA5qyh6LSt5Lmw5LiK6ZmQMjBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3Nob3dfbGltaXRfbGFiZWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvd24gPSB0aGlzLnJvbGVfdm8uZ29sZCArIHRoaXMucm9sZV92by5yZWRfZ29sZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93biAhPSBudWxsICYmIG93biA8ICgyMCAqIGRhdGEucHJpY2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IE1hdGguZmxvb3Iob3duIC8gZGF0YS5wcmljZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wID49IDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRfbnVtID0gdGVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdF9udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRfbnVtID0gMjA7IC8v5peg6ZmQ5Yi26LSt5Lmw55qE54mp5ZOBIOS4gOasoei0reS5sOS4iumZkDIwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zaG93X2xpbWl0X2xhYmVsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsaW1pdF92aXAgPiAwICYmIGlzX3Nob3dfbGltaXRfbGFiZWwpIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNjb3VudF9sYWJlbC5ub2RlLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzY291bnRfbGFiZWwuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiPGNvbG9yPSM0NTI1MDU+PGNvbG9yPSMyODliMTQ+ICAgICAgVklQJWQ8L2NvbG9yPuS4k+WxnjwvY29sb3I+XCIpLCBsaW1pdF92aXApXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsbEFsbChmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMudmlwX2xpbWl0X2ZsYWcgPSBsaW1pdF92aXA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChsaW1pdF9udW0gPiAwICYmIGlzX3Nob3dfbGltaXRfbGFiZWwpIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNjb3VudF9sYWJlbC5ub2RlLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzY291bnRfbGFiZWwuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiPGNvbG9yPSM0NTI1MDU+JXMgPGNvbG9yPSMyODliMTQ+JXMvJXM8L2NvbG9yPuS4qjwvY29sb3I+XCIpLCB0aGlzLnN0ciwgZGF0YS5oYXNfYnV5LCBsaW1pdF9udW0pO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5oYXNfYnV5ID09IGxpbWl0X251bSlcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsbEFsbCh0cnVlKVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGxBbGwoZmFsc2UpXHJcbiAgICAgICAgfSBlbHNlIGlmIChsaW1pdF9yYW5rID4gMCAmJiBpc19zaG93X2xpbWl0X2xhYmVsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzY291bnRfbGFiZWwubm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmRpc2NvdW50X2xhYmVsLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIjxjb2xvcj0jNDUyNTA1Pjxjb2xvcj0jZmYxZjBlPumcgOi+vuWIsCVz5ZCNPC9jb2xvcj48L2NvbG9yPlwiKSwgbGltaXRfcmFuayk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsbEFsbChmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMucmFua19saW1pdF9mbGFnID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2NvdW50X2xhYmVsLm5vZGUuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLmhhc19idXkgPT0gMSlcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsbEFsbCh0cnVlKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxsQWxsKGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS5saW1pdF9udW0gPSBsaW1pdF9udW07XHJcbiAgICAgICAgdGhpcy5kYXRhLmlzX3Nob3dfbGltaXRfbGFiZWwgPSBpc19zaG93X2xpbWl0X2xhYmVsO1xyXG5cclxuICAgICAgICAvL+aKmOaJo+agh+etvuWSjOaKmOaJo+S7t+agvFxyXG4gICAgICAgIGlmIChkYXRhLmxhYmVsICE9IG51bGwgJiYgZGF0YS5sYWJlbCA+IDApIHsgIC8v6KGo6YeM55qEXHJcbiAgICAgICAgICAgIHRoaXMuZGlzY291bnQuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5kaXNjb3VudF9udW0uc3RyaW5nID0gZGF0YS5sYWJlbCArIFV0aWxzLlRJMThOKFwi5oqYXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5kaXNjb3VudF90eXBlICE9IG51bGwgJiYgZGF0YS5kaXNjb3VudF90eXBlID4gMCkgeyAvL+acjeWKoeWZqOS/oeaBr1xyXG4gICAgICAgICAgICB0aGlzLmRpc2NvdW50LmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzY291bnRfbnVtLnN0cmluZyA9IGRhdGEuZGlzY291bnRfdHlwZSArIFV0aWxzLlRJMThOKFwi5oqYXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZihkYXRhLmxhYmxlICE9IG51bGwgJiYgZGF0YS5sYWJsZT4gMCl7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzY291bnQuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5kaXNjb3VudF9udW0uc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLotoXlgLxcIik7XHJcbiAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2NvdW50LmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRhdGEuZGlzY291bnQgIT0gbnVsbCAmJiBkYXRhLmRpc2NvdW50ID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnByaWNlLnN0cmluZyA9IGRhdGEuZGlzY291bnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kYXRhLnR5cGUgPT0gMTAgfHwgdGhpcy5kYXRhLnR5cGUgPT0gMTEgfHwgdGhpcy5kYXRhLnR5cGUgPT0gMTIgfHwgdGhpcy5kYXRhLnR5cGUgPT0gMTMpIHsvL+ijheWkh+eJueauiuWkhOeQhuaYvuekuuetiee6p+aYvuekulxyXG4gICAgICAgICAgICB0aGlzLmlzU2hvd0xldkxpbWl0KHRydWUsIHRoaXMuZGF0YS5sZXYpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNTaG93TGV2TGltaXQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YS50eXBlID09IDUgJiYgdGhpcy5kYXRhLmdsZXYgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzU2hvd0dMZXZMaW1pdCh0cnVlLCB0aGlzLmRhdGEuZ2xldik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc1Nob3dHTGV2TGltaXQoZmFsc2UsIDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGJpZCA9IHRoaXMuY3RybC5nZXROZWVkQmlkKCk7XHJcbiAgICAgICAgaWYgKGJpZCAhPSBudWxsICYmIChiaWQgPT0gZGF0YS5pdGVtX2lkIHx8IGJpZCA9PSBkYXRhLml0ZW1fYmlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLm5lZWRfaWNvbi5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm5lZWRfbGFiZWwubm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubmVlZF9pY29uLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm5lZWRfbGFiZWwubm9kZS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRhdGEudHlwZSA9PSAzKSB7XHJcbiAgICAgICAgICAgIHZhciBpc19zaG93ID0gdGhpcy5jdHJsLmdldE1vZGVsKCkuY2hlY2tIZXJvQ2hpcHMoZGF0YS5pdGVtX2lkKTtcclxuICAgICAgICAgICAgdGhpcy5zaG93Q2hpcFRhZyhpc19zaG93KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dDaGlwVGFnKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHNldFNlbGxBbGw6IGZ1bmN0aW9uIChib29sKSB7XHJcbiAgICAgICAgaWYodGhpcy5yb290X3duZD09bnVsbClyZXR1cm5cclxuICAgICAgICB0aGlzLnNvbGQuYWN0aXZlID0gYm9vbDtcclxuICAgICAgICB0aGlzLmdyZXkuYWN0aXZlID0gYm9vbDtcclxuICAgICAgICB0aGlzLmlzX3RvdWNoID0gIWJvb2w7XHJcbiAgICB9LFxyXG5cclxuICAgIHNob3dDaGlwVGFnOiBmdW5jdGlvbiAoc3RhdHVzKSB7XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICBpc1Nob3dMZXZMaW1pdDogZnVuY3Rpb24gKHN0YXR1cywgbGV2KSB7XHJcbiAgICAgICAgaWYoIXRoaXMubGltaXRfbGV2X2xhYmVsKXtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBpc1Nob3dHTGV2TGltaXQ6IGZ1bmN0aW9uIChzdGF0dXMsIGxldikge1xyXG5cclxuICAgIH0sXHJcblxyXG4gICAgYWRkQ2FsbEJhY2s6ZnVuY3Rpb24odmFsdWUpe1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSB2YWx1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgb25TaG93OiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICBvbkRlbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmKHRoaXMucm9sZV91cGRhdGVfZXZlbnQpe1xyXG4gICAgICAgICAgICBpZih0aGlzLnJvbGVfdm8pe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX3ZvLnVuYmluZCh0aGlzLnJvbGVfdXBkYXRlX2V2ZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9sZV91cGRhdGVfZXZlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX3ZvID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLmdvb2RzX2l0ZW0pe1xyXG4gICAgICAgICAgICB0aGlzLmdvb2RzX2l0ZW0uZGVsZXRlTWUoKTtcclxuICAgICAgICAgICAgdGhpcy5nb29kc19pdGVtID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYodGhpcy5tYWluX2NvbnRhaW5lcil7XHJcbiAgICAgICAgLy8gICAgIHRoaXMubWFpbl9jb250YWluZXIub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCxmdW5jdGlvbigpe30sdGhpcylcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNYWxsSXRlbTsiXX0=