(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/backpack/backpack_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, '8f945muht9P9q6gp3WKcUDC', 'backpack_model'); // Scripts/mod/backpack/backpack_model.js "use strict"; // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 这里填写详细说明,主要填写该模块的功能简要 //
Create: 2018-12-24 16:50:14 // -------------------------------------------------------------------- var BackPackConst = require("backpack_const"); var BackpackModel = cc.Class({ "extends": BaseClass, ctor: function ctor() {}, properties: {}, initConfig: function initConfig() { this.item_list = {}; // 物品列表,背包类型座位key this.hallows_comp_list = {}; //神器合成 this.equip_score_list = {}; }, /** * 初始化背包和装备背包数据 * @param {*} data */ initItemList: function initItemList(data) { var GoodsVo = require("goods_vo"); var bag_list = {}; for (var index = 0; index < data.item_list.length; index++) { var element = data.item_list[index]; var item_vo = new GoodsVo(); item_vo.initAttrData(element); bag_list[element.id] = item_vo; // 装备背包备份多个最高评分列表的4件装备 this.updateEquipScoreList(data.bag_code, item_vo); } // 储存空间物品 var bag_code = data.bag_code; this.item_list[bag_code] = bag_list; // -- 是装备背包 if (bag_code == BackPackConst.Bag_Code.EQUIPS) {// self.cur_equip_volume = #data.item_list // -- MainuiController:getInstance():setBtnRedPoint(MainuiConst.btn_index.backpack, (self.cur_equip_volume >= data.volume)) } else { if (!this.is_init_hero_chip_redpoint) { this.is_init_hero_chip_redpoint = true; this.getHeroChipRedPoint(); } } this.setHallowsCompData(); gcore.GlobalEvent.fire(EventId.GET_ALL_DATA, bag_code); }, getHeroChipRedPoint: function getHeroChipRedPoint() { var hero_list = this.getAllBackPackArray(BackPackConst.item_tab_type.HERO); var status = false; for (var i = 0; i < hero_list.length; ++i) { var v = hero_list[i]; status = this.checkHeroChipRedPoint(v); if (status) { break; } } var MainuiController = require("mainui_controller"); var MainuiConst = require("mainui_const"); MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.backpack, status); }, // --检查英雄碎片是否能合/成 checkHeroChipRedPoint: function checkHeroChipRedPoint(v) { if (v.quality != -1 && v.base_id) { // --碎片 var partner_config = Config.partner_data.data_get_compound_info; if (partner_config[v.base_id]) { if (v.quantity >= partner_config[v.base_id].num) { return true; } } // --符文 if (this.hallows_comp_list && this.hallows_comp_list[v.base_id]) { if (v.quantity >= this.hallows_comp_list[v.base_id].num) { return true; } } } return false; }, // 增加或者更新一个物品 updateBagItemsNum: function updateBagItemsNum(data, is_update) { var GoodsVo = require("goods_vo"); var add_list = {}; var bag_code = null; for (var index = 0; index < data.item_list.length; index++) { var element = data.item_list[index]; if (this.item_list[element.storage] == null) { this.item_list[element.storage] = {}; } var item_vo = this.item_list[element.storage][element.id]; if (item_vo == null) { item_vo = new GoodsVo(); this.item_list[element.storage][element.id] = item_vo; } //背包英雄符文碎片红点逻辑 (先算是否有红点) -zys var status = null; var config = Utils.getItemConfig(element.base_id); if (config.sub_type == BackPackConst.item_tab_type.HERO) { status = this.checkHeroChipRedPoint(item_vo); } item_vo.initAttrData(element); // 储存一下存储空间 if (bag_code == null) { bag_code = element.storage; } // 备份新增物品 add_list[element.id] = item_vo; // 装备背包备份多个最高评分列表的4件装备 if (bag_code == BackPackConst.Bag_Code.EQUIPS) { if (item_vo && item_vo.config) { var type = item_vo.config.type || 1; if (!this.equip_score_list[type]) this.equip_score_list[type] = {}; this.equip_score_list[type][item_vo.id] = item_vo; } } //背包英雄符文碎片红点逻辑 (如果没有红点才判断)-zys if (!status && config.sub_type == BackPackConst.item_tab_type.HERO) { if (this.checkHeroChipRedPoint(item_vo)) { var MainuiController = require("mainui_controller"); var MainuiConst = require("mainui_const"); MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.backpack, true); } } } bag_code = bag_code || BackPackConst.Bag_Code.BACKPACK; if (is_update) { gcore.GlobalEvent.fire(EventId.MODIFY_GOODS_NUM, bag_code, add_list); } else { gcore.GlobalEvent.fire(EventId.ADD_GOODS, bag_code, add_list); } }, // 删除一个物品 deleteBagItems: function deleteBagItems(data) { var del_list = {}; var bag_code = null; for (var index = 0; index < data.item_list.length; index++) { var element = data.item_list[index]; if (this.item_list[element.storage]) { var item_vo = this.item_list[element.storage][element.id]; if (bag_code == null) { bag_code = element.storage; } // bag_code = item_vo.storage || BackPackConst.Bag_Code.BACKPACK if (bag_code == BackPackConst.Bag_Code.EQUIPS) { if (item_vo && item_vo.config) { var type = item_vo.config.type || 1; if (!this.equip_score_list[type]) this.equip_score_list[type] = {}; this.equip_score_list[type][item_vo.id] = null; } } else if (bag_code == BackPackConst.Bag_Code.BACKPACK) { //背包里面的符文(以前神器) if (item_vo && item_vo.config) { var type = item_vo.config.type || 1; if (type == BackPackConst.item_type.ARTIFACTCHIPS) { if (!this.equip_score_list[type]) this.equip_score_list[type] = {}; this.equip_score_list[type][item_vo.id] = null; } } } if (item_vo) { del_list[element.id] = item_vo; this.item_list[element.storage][element.id] = null; } } // 储存一下存储空间 // if (bag_code == null) { // bag_code = element.storage // } } bag_code = bag_code || BackPackConst.Bag_Code.BACKPACK; gcore.GlobalEvent.fire(EventId.DELETE_GOODS, bag_code, del_list); }, // 根据背包标签页类型返回当前的物品列表 getAllBackPackArray: function getAllBackPackArray(type) { type = type || BackPackConst.item_tab_type.EQUIPS; var bag_code = BackPackConst.Bag_Code.BACKPACK; if (type == BackPackConst.item_tab_type.EQUIPS) { bag_code = BackPackConst.Bag_Code.EQUIPS; } var bag_list = this.item_list[bag_code]; var temp_list = []; for (var key in bag_list) { var item_vo = bag_list[key]; if (item_vo && item_vo.config && item_vo.config.sub_type == type) { temp_list.push(item_vo); } } if (temp_list.length > 0) { temp_list.sort(Utils.tableUpperSorter(["quality", "sort", "base_id"])); } // 排序 return temp_list; }, // 获取对应背包类型的物品列表 getBagItemList: function getBagItemList(bag_code) { return this.item_list[bag_code] || {}; }, // 根据bid获得道具物品的数量(包括资产道具) getItemNumByBid: function getItemNumByBid(bid) { var asset_key = gdata("item_data", "data_assets_id2label", bid); if (asset_key) { var RoleController = require("role_controller"); var role_vo = RoleController.getInstance().getRoleVo(); if (role_vo[asset_key]) { return role_vo[asset_key]; } else { return 0; } } else { return this.getBackPackItemNumByBid(bid); } }, // 根据bid获取背包物品的数量 getPackItemNumByBid: function getPackItemNumByBid(bag_code, bid) { if (bag_code == null) { bag_code = BackPackConst.Bag_Code.BACKPACK; } var len = 0; var bag_list = this.getBagItemList(bag_code); for (var k in bag_list) { var item = bag_list[k]; if (item && item.config && item.config.id == bid) { len += item.quantity; } } return len; }, // 根据bid获取背包物品数量 getBackPackItemNumByBid: function getBackPackItemNumByBid(bid) { return this.getPackItemNumByBid(BackPackConst.Bag_Code.BACKPACK, bid); }, getItemListForShare: function getItemListForShare(bag_type) { var bag_code = bag_type || BackPackConst.Bag_Code.BACKPACK; var list = this.item_list[bag_code]; var target_list = []; if (list) { for (var item_i in list) { if (list[item_i] && list[item_i].config && list[item_i].config.can_share === 1) { target_list.push(list[item_i]); } } } return target_list; }, //根据id获取背包的物品数据 getBackPackItemById: function getBackPackItemById(id) { return this.getBagItemById(BackPackConst.Bag_Code.BACKPACK, id); }, //根据bag_code,id获得物品数据 getBagItemById: function getBagItemById(bag_code, id) { var temp_list = this.getBagItemList(bag_code); if (temp_list != null && temp_list[id] != null) { return temp_list[id]; } }, //根据类型获得背包中该类型物品的列表 getBackPackItemListByType: function getBackPackItemListByType(type) { var list = []; var bag_list = this.getBagItemList(BackPackConst.Bag_Code.BACKPACK); for (var k in bag_list) { var item = bag_list[k]; if (item && item.config && item.config.type == type) { list.push(item); } } return list; }, //根据bid获取物品的id列表 getBackPackItemIdListByBid: function getBackPackItemIdListByBid(bid) { var id_list = []; var bag_list = this.getBagItemList(BackPackConst.Bag_Code.BACKPACK); for (var k in bag_list) { var item = bag_list[k]; if (item && item.config && item.config.id == bid) { id_list.push(item.id); } } return id_list; }, //神器合成 setHallowsCompData: function setHallowsCompData() { if (Utils.next(this.hallows_comp_list) != null) return; var data_list = Config.item_product_data.data_product_data; for (var i in data_list) { var v = data_list[i]; this.hallows_comp_list[v.need_items[0][0]] = { bid: v.bid, num: v.need_items[0][1] }; } }, getHallowsCompData: function getHallowsCompData(id) { if (!this.hallows_comp_list && Utils.next(this.hallows_comp_list) == null) { return this.hallows_comp_list[id] || {}; } }, getAllEquipListByType: function getAllEquipListByType(type) { return this.equip_score_list[type] || []; }, updateEquipScoreList: function updateEquipScoreList(bag_code, temp_item) { if (temp_item && temp_item.config) { var type = temp_item.config.type || 1; // 装备背包备份一个序号列表 if (bag_code == BackPackConst.Bag_Code.EQUIPS) { if (!this.equip_score_list[type]) this.equip_score_list[type] = {}; this.equip_score_list[type][temp_item.id] = temp_item; } else if (bag_code == BackPackConst.Bag_Code.BACKPACK) { // 背包里面的符文(以前神器) if (type == BackPackConst.item_type.ARTIFACTCHIPS) { if (!this.equip_score_list[type]) this.equip_score_list[type] = {}; this.equip_score_list[type][temp_item.id] = temp_item; } } } } }); module.exports = BackpackModel; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYWNrcGFja1xcYmFja3BhY2tfbW9kZWwuanMiXSwibmFtZXMiOlsiQmFja1BhY2tDb25zdCIsInJlcXVpcmUiLCJCYWNrcGFja01vZGVsIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsImN0b3IiLCJwcm9wZXJ0aWVzIiwiaW5pdENvbmZpZyIsIml0ZW1fbGlzdCIsImhhbGxvd3NfY29tcF9saXN0IiwiZXF1aXBfc2NvcmVfbGlzdCIsImluaXRJdGVtTGlzdCIsImRhdGEiLCJHb29kc1ZvIiwiYmFnX2xpc3QiLCJpbmRleCIsImxlbmd0aCIsImVsZW1lbnQiLCJpdGVtX3ZvIiwiaW5pdEF0dHJEYXRhIiwiaWQiLCJ1cGRhdGVFcXVpcFNjb3JlTGlzdCIsImJhZ19jb2RlIiwiQmFnX0NvZGUiLCJFUVVJUFMiLCJpc19pbml0X2hlcm9fY2hpcF9yZWRwb2ludCIsImdldEhlcm9DaGlwUmVkUG9pbnQiLCJzZXRIYWxsb3dzQ29tcERhdGEiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIkV2ZW50SWQiLCJHRVRfQUxMX0RBVEEiLCJoZXJvX2xpc3QiLCJnZXRBbGxCYWNrUGFja0FycmF5IiwiaXRlbV90YWJfdHlwZSIsIkhFUk8iLCJzdGF0dXMiLCJpIiwidiIsImNoZWNrSGVyb0NoaXBSZWRQb2ludCIsIk1haW51aUNvbnRyb2xsZXIiLCJNYWludWlDb25zdCIsImdldEluc3RhbmNlIiwic2V0QnRuUmVkUG9pbnQiLCJidG5faW5kZXgiLCJiYWNrcGFjayIsInF1YWxpdHkiLCJiYXNlX2lkIiwicGFydG5lcl9jb25maWciLCJDb25maWciLCJwYXJ0bmVyX2RhdGEiLCJkYXRhX2dldF9jb21wb3VuZF9pbmZvIiwicXVhbnRpdHkiLCJudW0iLCJ1cGRhdGVCYWdJdGVtc051bSIsImlzX3VwZGF0ZSIsImFkZF9saXN0Iiwic3RvcmFnZSIsImNvbmZpZyIsIlV0aWxzIiwiZ2V0SXRlbUNvbmZpZyIsInN1Yl90eXBlIiwidHlwZSIsIkJBQ0tQQUNLIiwiTU9ESUZZX0dPT0RTX05VTSIsIkFERF9HT09EUyIsImRlbGV0ZUJhZ0l0ZW1zIiwiZGVsX2xpc3QiLCJpdGVtX3R5cGUiLCJBUlRJRkFDVENISVBTIiwiREVMRVRFX0dPT0RTIiwidGVtcF9saXN0Iiwia2V5IiwicHVzaCIsInNvcnQiLCJ0YWJsZVVwcGVyU29ydGVyIiwiZ2V0QmFnSXRlbUxpc3QiLCJnZXRJdGVtTnVtQnlCaWQiLCJiaWQiLCJhc3NldF9rZXkiLCJnZGF0YSIsIlJvbGVDb250cm9sbGVyIiwicm9sZV92byIsImdldFJvbGVWbyIsImdldEJhY2tQYWNrSXRlbU51bUJ5QmlkIiwiZ2V0UGFja0l0ZW1OdW1CeUJpZCIsImxlbiIsImsiLCJpdGVtIiwiZ2V0SXRlbUxpc3RGb3JTaGFyZSIsImJhZ190eXBlIiwibGlzdCIsInRhcmdldF9saXN0IiwiaXRlbV9pIiwiY2FuX3NoYXJlIiwiZ2V0QmFja1BhY2tJdGVtQnlJZCIsImdldEJhZ0l0ZW1CeUlkIiwiZ2V0QmFja1BhY2tJdGVtTGlzdEJ5VHlwZSIsImdldEJhY2tQYWNrSXRlbUlkTGlzdEJ5QmlkIiwiaWRfbGlzdCIsIm5leHQiLCJkYXRhX2xpc3QiLCJpdGVtX3Byb2R1Y3RfZGF0YSIsImRhdGFfcHJvZHVjdF9kYXRhIiwibmVlZF9pdGVtcyIsImdldEhhbGxvd3NDb21wRGF0YSIsImdldEFsbEVxdWlwTGlzdEJ5VHlwZSIsInRlbXBfaXRlbSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsYUFBYSxHQUFHQyxPQUFPLENBQUMsZ0JBQUQsQ0FBM0I7O0FBQ0EsSUFBSUMsYUFBYSxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUN6QixhQUFTQyxTQURnQjtBQUV6QkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZLENBQ2pCLENBSHdCO0FBS3pCQyxFQUFBQSxVQUFVLEVBQUUsRUFM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LElBQXRCLElBQThCLEVBQTlCO0FBQ0osYUFBS3JELGdCQUFMLENBQXNCcUQsSUFBdEIsRUFBNEI2QyxTQUFTLENBQUN4RixFQUF0QyxJQUE0Q3dGLFNBQTVDO0FBQ0gsT0FKRCxNQUlPLElBQUl0RixRQUFRLElBQUl2QixhQUFhLENBQUN3QixRQUFkLENBQXVCeUMsUUFBdkMsRUFBaUQ7QUFDcEQ7QUFDQSxZQUFJRCxJQUFJLElBQUloRSxhQUFhLENBQUNzRSxTQUFkLENBQXdCQyxhQUFwQyxFQUFtRDtBQUMvQyxjQUFJLENBQUMsS0FBSzVELGdCQUFMLENBQXNCcUQsSUFBdEIsQ0FBTCxFQUNJLEtBQUtyRCxnQkFBTCxDQUFzQnFELElBQXRCLElBQThCLEVBQTlCO0FBQ0osZUFBS3JELGdCQUFMLENBQXNCcUQsSUFBdEIsRUFBNEI2QyxTQUFTLENBQUN4RixFQUF0QyxJQUE0Q3dGLFNBQTVDO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7QUF0VndCLENBQVQsQ0FBcEI7QUF5VkFDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjdHLGFBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE4LTEyLTI0IDE2OjUwOjE0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIEJhY2tQYWNrQ29uc3QgPSByZXF1aXJlKFwiYmFja3BhY2tfY29uc3RcIilcbnZhciBCYWNrcGFja01vZGVsID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDbGFzcyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcblxuICAgIHByb3BlcnRpZXM6IHtcbiAgICB9LFxuXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLml0ZW1fbGlzdCA9IHt9ICAgICAgICAgICAgIC8vIOeJqeWTgeWIl+ihqCzog4zljIXnsbvlnovluqfkvY1rZXlcbiAgICAgICAgdGhpcy5oYWxsb3dzX2NvbXBfbGlzdCA9IHt9ICAgICAvL+elnuWZqOWQiOaIkFxuICAgICAgICB0aGlzLmVxdWlwX3Njb3JlX2xpc3QgPSB7fVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDliJ3lp4vljJbog4zljIXlkozoo4XlpIfog4zljIXmlbDmja5cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgXG4gICAgICovXG4gICAgaW5pdEl0ZW1MaXN0OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgR29vZHNWbyA9IHJlcXVpcmUoXCJnb29kc192b1wiKTtcbiAgICAgICAgdmFyIGJhZ19saXN0ID0ge307XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhLml0ZW1fbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkYXRhLml0ZW1fbGlzdFtpbmRleF07XG4gICAgICAgICAgICB2YXIgaXRlbV92byA9IG5ldyBHb29kc1ZvKCk7XG4gICAgICAgICAgICBpdGVtX3ZvLmluaXRBdHRyRGF0YShlbGVtZW50KTtcbiAgICAgICAgICAgIGJhZ19saXN0W2VsZW1lbnQuaWRdID0gaXRlbV92bztcblxuICAgICAgICAgICAgLy8g6KOF5aSH6IOM5YyF5aSH5Lu95aSa5Liq5pyA6auY6K+E5YiG5YiX6KGo55qENOS7tuijheWkh1xuICAgICAgICAgICAgdGhpcy51cGRhdGVFcXVpcFNjb3JlTGlzdChkYXRhLmJhZ19jb2RlLCBpdGVtX3ZvKVxuICAgICAgICB9XG4gICAgICAgIC8vIOWCqOWtmOepuumXtOeJqeWTgVxuICAgICAgICB2YXIgYmFnX2NvZGUgPSBkYXRhLmJhZ19jb2RlO1xuICAgICAgICB0aGlzLml0ZW1fbGlzdFtiYWdfY29kZV0gPSBiYWdfbGlzdDtcblxuICAgICAgICAvLyAtLSDmmK/oo4XlpIfog4zljIVcbiAgICAgICAgaWYgKGJhZ19jb2RlID09IEJhY2tQYWNrQ29uc3QuQmFnX0NvZGUuRVFVSVBTKSB7XG4gICAgICAgICAgICAvLyBzZWxmLmN1cl9lcXVpcF92b2x1bWUgPSAjZGF0YS5pdGVtX2xpc3QgXG4gICAgICAgICAgICAvLyAtLSBNYWludWlDb250cm9sbGVyOmdldEluc3RhbmNlKCk6c2V0QnRuUmVkUG9pbnQoTWFpbnVpQ29uc3QuYnRuX2luZGV4LmJhY2twYWNrLCAoc2VsZi5jdXJfZXF1aXBfdm9sdW1lID49IGRhdGEudm9sdW1lKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc19pbml0X2hlcm9fY2hpcF9yZWRwb2ludCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNfaW5pdF9oZXJvX2NoaXBfcmVkcG9pbnQgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRIZXJvQ2hpcFJlZFBvaW50KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEhhbGxvd3NDb21wRGF0YSgpO1xuXG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRXZlbnRJZC5HRVRfQUxMX0RBVEEsIGJhZ19jb2RlKTtcbiAgICB9LFxuICAgIGdldEhlcm9DaGlwUmVkUG9pbnQoKSB7XG4gICAgICAgIGxldCBoZXJvX2xpc3QgPSB0aGlzLmdldEFsbEJhY2tQYWNrQXJyYXkoQmFja1BhY2tDb25zdC5pdGVtX3RhYl90eXBlLkhFUk8pXG4gICAgICAgIGxldCBzdGF0dXMgPSBmYWxzZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlcm9fbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IHYgPSBoZXJvX2xpc3RbaV1cbiAgICAgICAgICAgIHN0YXR1cyA9IHRoaXMuY2hlY2tIZXJvQ2hpcFJlZFBvaW50KHYpXG4gICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKVxuICAgICAgICB2YXIgTWFpbnVpQ29uc3QgPSByZXF1aXJlKFwibWFpbnVpX2NvbnN0XCIpXG4gICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRCdG5SZWRQb2ludChNYWludWlDb25zdC5idG5faW5kZXguYmFja3BhY2ssIHN0YXR1cylcbiAgICB9LFxuICAgIC8vIC0t5qOA5p+l6Iux6ZuE56KO54mH5piv5ZCm6IO95ZCIL+aIkFxuICAgIGNoZWNrSGVyb0NoaXBSZWRQb2ludCh2KSB7XG4gICAgICAgIGlmICh2LnF1YWxpdHkgIT0gLTEgJiYgdi5iYXNlX2lkKSB7XG4gICAgICAgICAgICAvLyAtLeeijueJh1xuICAgICAgICAgICAgbGV0IHBhcnRuZXJfY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX2dldF9jb21wb3VuZF9pbmZvXG4gICAgICAgICAgICBpZiAocGFydG5lcl9jb25maWdbdi5iYXNlX2lkXSkge1xuICAgICAgICAgICAgICAgIGlmICh2LnF1YW50aXR5ID49IHBhcnRuZXJfY29uZmlnW3YuYmFzZV9pZF0ubnVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gLS3nrKbmlodcbiAgICAgICAgICAgIGlmICh0aGlzLmhhbGxvd3NfY29tcF9saXN0ICYmIHRoaXMuaGFsbG93c19jb21wX2xpc3Rbdi5iYXNlX2lkXSkge1xuICAgICAgICAgICAgICAgIGlmICh2LnF1YW50aXR5ID49IHRoaXMuaGFsbG93c19jb21wX2xpc3Rbdi5iYXNlX2lkXS5udW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcbiAgICAvLyDlop7liqDmiJbogIXmm7TmlrDkuIDkuKrnianlk4FcbiAgICB1cGRhdGVCYWdJdGVtc051bTogZnVuY3Rpb24gKGRhdGEsIGlzX3VwZGF0ZSkge1xuICAgICAgICB2YXIgR29vZHNWbyA9IHJlcXVpcmUoXCJnb29kc192b1wiKTtcbiAgICAgICAgdmFyIGFkZF9saXN0ID0ge31cbiAgICAgICAgdmFyIGJhZ19jb2RlID0gbnVsbFxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YS5pdGVtX2xpc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZGF0YS5pdGVtX2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbV9saXN0W2VsZW1lbnQuc3RvcmFnZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0W2VsZW1lbnQuc3RvcmFnZV0gPSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGl0ZW1fdm8gPSB0aGlzLml0ZW1fbGlzdFtlbGVtZW50LnN0b3JhZ2VdW2VsZW1lbnQuaWRdXG4gICAgICAgICAgICBpZiAoaXRlbV92byA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaXRlbV92byA9IG5ldyBHb29kc1ZvKClcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fbGlzdFtlbGVtZW50LnN0b3JhZ2VdW2VsZW1lbnQuaWRdID0gaXRlbV92b1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgLy/og4zljIXoi7Hpm4TnrKbmlofnoo7niYfnuqLngrnpgLvovpEgKOWFiOeul+aYr+WQpuaciee6oueCuSkgLXp5c1xuICAgICAgICAgICAgIGxldCBzdGF0dXMgPSBudWxsO1xuICAgICAgICAgICAgIGxldCBjb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGVsZW1lbnQuYmFzZV9pZCk7XG4gICAgICAgICAgICAgaWYgKGNvbmZpZy5zdWJfdHlwZSA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fdGFiX3R5cGUuSEVSTykge1xuICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aGlzLmNoZWNrSGVyb0NoaXBSZWRQb2ludChpdGVtX3ZvKTtcbiAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGl0ZW1fdm8uaW5pdEF0dHJEYXRhKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyDlgqjlrZjkuIDkuIvlrZjlgqjnqbrpl7RcbiAgICAgICAgICAgIGlmIChiYWdfY29kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYmFnX2NvZGUgPSBlbGVtZW50LnN0b3JhZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOWkh+S7veaWsOWinueJqeWTgVxuICAgICAgICAgICAgYWRkX2xpc3RbZWxlbWVudC5pZF0gPSBpdGVtX3ZvO1xuXG5cbiAgICAgICAgICAgIC8vIOijheWkh+iDjOWMheWkh+S7veWkmuS4quacgOmrmOivhOWIhuWIl+ihqOeahDTku7boo4XlpIdcbiAgICAgICAgICAgIGlmIChiYWdfY29kZSA9PSBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkVRVUlQUykge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtX3ZvICYmIGl0ZW1fdm8uY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gaXRlbV92by5jb25maWcudHlwZSB8fCAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZXF1aXBfc2NvcmVfbGlzdFt0eXBlXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXF1aXBfc2NvcmVfbGlzdFt0eXBlXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVxdWlwX3Njb3JlX2xpc3RbdHlwZV1baXRlbV92by5pZF0gPSBpdGVtX3ZvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy/og4zljIXoi7Hpm4TnrKbmlofnoo7niYfnuqLngrnpgLvovpEgKOWmguaenOayoeaciee6oueCueaJjeWIpOaWrSktenlzXG4gICAgICAgICAgICBpZiAoIXN0YXR1cyAmJiBjb25maWcuc3ViX3R5cGUgPT0gQmFja1BhY2tDb25zdC5pdGVtX3RhYl90eXBlLkhFUk8pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja0hlcm9DaGlwUmVkUG9pbnQoaXRlbV92bykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIE1haW51aUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIilcbiAgICAgICAgICAgICAgICAgICAgdmFyIE1haW51aUNvbnN0ID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKVxuICAgICAgICAgICAgICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0QnRuUmVkUG9pbnQoTWFpbnVpQ29uc3QuYnRuX2luZGV4LmJhY2twYWNrLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYmFnX2NvZGUgPSBiYWdfY29kZSB8fCBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLO1xuXG4gICAgICAgIGlmIChpc191cGRhdGUpIHtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRXZlbnRJZC5NT0RJRllfR09PRFNfTlVNLCBiYWdfY29kZSwgYWRkX2xpc3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShFdmVudElkLkFERF9HT09EUywgYmFnX2NvZGUsIGFkZF9saXN0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliKDpmaTkuIDkuKrnianlk4FcbiAgICBkZWxldGVCYWdJdGVtczogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdmFyIGRlbF9saXN0ID0ge31cbiAgICAgICAgdmFyIGJhZ19jb2RlID0gbnVsbFxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YS5pdGVtX2xpc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZGF0YS5pdGVtX2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbV9saXN0W2VsZW1lbnQuc3RvcmFnZV0pIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbV92byA9IHRoaXMuaXRlbV9saXN0W2VsZW1lbnQuc3RvcmFnZV1bZWxlbWVudC5pZF1cbiAgICAgICAgICAgICAgICBpZiAoYmFnX2NvZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBiYWdfY29kZSA9IGVsZW1lbnQuc3RvcmFnZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBiYWdfY29kZSA9IGl0ZW1fdm8uc3RvcmFnZSB8fCBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLXG4gICAgICAgICAgICAgICAgaWYgKGJhZ19jb2RlID09IEJhY2tQYWNrQ29uc3QuQmFnX0NvZGUuRVFVSVBTKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtX3ZvICYmIGl0ZW1fdm8uY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGl0ZW1fdm8uY29uZmlnLnR5cGUgfHwgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5lcXVpcF9zY29yZV9saXN0W3R5cGVdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXF1aXBfc2NvcmVfbGlzdFt0eXBlXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcXVpcF9zY29yZV9saXN0W3R5cGVdW2l0ZW1fdm8uaWRdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFnX2NvZGUgPT0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSykge1xuICAgICAgICAgICAgICAgICAgICAvL+iDjOWMhemHjOmdoueahOespuaWhyjku6XliY3npZ7lmagpXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtX3ZvICYmIGl0ZW1fdm8uY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGl0ZW1fdm8uY29uZmlnLnR5cGUgfHwgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEJhY2tQYWNrQ29uc3QuaXRlbV90eXBlLkFSVElGQUNUQ0hJUFMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZXF1aXBfc2NvcmVfbGlzdFt0eXBlXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcXVpcF9zY29yZV9saXN0W3R5cGVdID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcXVpcF9zY29yZV9saXN0W3R5cGVdW2l0ZW1fdm8uaWRdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpdGVtX3ZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbF9saXN0W2VsZW1lbnQuaWRdID0gaXRlbV92b1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1fbGlzdFtlbGVtZW50LnN0b3JhZ2VdW2VsZW1lbnQuaWRdID0gbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOWCqOWtmOS4gOS4i+WtmOWCqOepuumXtFxuICAgICAgICAgICAgLy8gaWYgKGJhZ19jb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vICAgICBiYWdfY29kZSA9IGVsZW1lbnQuc3RvcmFnZVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9XG4gICAgICAgIGJhZ19jb2RlID0gYmFnX2NvZGUgfHwgQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSztcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShFdmVudElkLkRFTEVURV9HT09EUywgYmFnX2NvZGUsIGRlbF9saXN0KTtcbiAgICB9LFxuXG4gICAgLy8g5qC55o2u6IOM5YyF5qCH562+6aG157G75Z6L6L+U5Zue5b2T5YmN55qE54mp5ZOB5YiX6KGoXG4gICAgZ2V0QWxsQmFja1BhY2tBcnJheTogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdHlwZSA9IHR5cGUgfHwgQmFja1BhY2tDb25zdC5pdGVtX3RhYl90eXBlLkVRVUlQU1xuICAgICAgICB2YXIgYmFnX2NvZGUgPSBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLXG4gICAgICAgIGlmICh0eXBlID09IEJhY2tQYWNrQ29uc3QuaXRlbV90YWJfdHlwZS5FUVVJUFMpIHtcbiAgICAgICAgICAgIGJhZ19jb2RlID0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5FUVVJUFNcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmFnX2xpc3QgPSB0aGlzLml0ZW1fbGlzdFtiYWdfY29kZV1cbiAgICAgICAgdmFyIHRlbXBfbGlzdCA9IFtdXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBiYWdfbGlzdCkge1xuICAgICAgICAgICAgdmFyIGl0ZW1fdm8gPSBiYWdfbGlzdFtrZXldXG4gICAgICAgICAgICBpZiAoaXRlbV92byAmJiBpdGVtX3ZvLmNvbmZpZyAmJiBpdGVtX3ZvLmNvbmZpZy5zdWJfdHlwZSA9PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgdGVtcF9saXN0LnB1c2goaXRlbV92bylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGVtcF9saXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRlbXBfbGlzdC5zb3J0KFV0aWxzLnRhYmxlVXBwZXJTb3J0ZXIoW1wicXVhbGl0eVwiLCBcInNvcnRcIiwgXCJiYXNlX2lkXCJdKSlcbiAgICAgICAgfVxuICAgICAgICAvLyDmjpLluo9cbiAgICAgICAgcmV0dXJuIHRlbXBfbGlzdFxuICAgIH0sXG5cbiAgICAvLyDojrflj5blr7nlupTog4zljIXnsbvlnovnmoTnianlk4HliJfooaggXG4gICAgZ2V0QmFnSXRlbUxpc3Q6IGZ1bmN0aW9uIChiYWdfY29kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtX2xpc3RbYmFnX2NvZGVdIHx8IHt9O1xuICAgIH0sXG5cblxuICAgIC8vIOagueaNrmJpZOiOt+W+l+mBk+WFt+eJqeWTgeeahOaVsOmHjyjljIXmi6zotYTkuqfpgZPlhbcpXG4gICAgZ2V0SXRlbU51bUJ5QmlkOiBmdW5jdGlvbiAoYmlkKSB7XG4gICAgICAgIHZhciBhc3NldF9rZXkgPSBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfYXNzZXRzX2lkMmxhYmVsXCIsIGJpZCk7XG4gICAgICAgIGlmIChhc3NldF9rZXkpIHtcbiAgICAgICAgICAgIHZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgICAgICBpZiAocm9sZV92b1thc3NldF9rZXldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvbGVfdm9bYXNzZXRfa2V5XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRCYWNrUGFja0l0ZW1OdW1CeUJpZChiaWQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOagueaNrmJpZOiOt+WPluiDjOWMheeJqeWTgeeahOaVsOmHjyBcbiAgICBnZXRQYWNrSXRlbU51bUJ5QmlkOiBmdW5jdGlvbiAoYmFnX2NvZGUsIGJpZCkge1xuICAgICAgICBpZiAoYmFnX2NvZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgYmFnX2NvZGUgPSBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxlbiA9IDA7XG4gICAgICAgIGxldCBiYWdfbGlzdCA9IHRoaXMuZ2V0QmFnSXRlbUxpc3QoYmFnX2NvZGUpO1xuICAgICAgICBmb3IgKGxldCBrIGluIGJhZ19saXN0KSB7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IGJhZ19saXN0W2tdO1xuICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5jb25maWcgJiYgaXRlbS5jb25maWcuaWQgPT0gYmlkKSB7XG4gICAgICAgICAgICAgICAgbGVuICs9IGl0ZW0ucXVhbnRpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxlbjtcbiAgICB9LFxuXG4gICAgLy8g5qC55o2uYmlk6I635Y+W6IOM5YyF54mp5ZOB5pWw6YePXG4gICAgZ2V0QmFja1BhY2tJdGVtTnVtQnlCaWQ6IGZ1bmN0aW9uIChiaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFja0l0ZW1OdW1CeUJpZChCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLLCBiaWQpO1xuICAgIH0sXG5cbiAgICBnZXRJdGVtTGlzdEZvclNoYXJlOiBmdW5jdGlvbiAoYmFnX3R5cGUpIHtcbiAgICAgICAgdmFyIGJhZ19jb2RlID0gYmFnX3R5cGUgfHwgQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSztcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLml0ZW1fbGlzdFtiYWdfY29kZV07XG4gICAgICAgIHZhciB0YXJnZXRfbGlzdCA9IFtdO1xuICAgICAgICBpZiAobGlzdCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaXRlbV9pIGluIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdFtpdGVtX2ldICYmIGxpc3RbaXRlbV9pXS5jb25maWcgJiYgbGlzdFtpdGVtX2ldLmNvbmZpZy5jYW5fc2hhcmUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2xpc3QucHVzaChsaXN0W2l0ZW1faV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0X2xpc3RcbiAgICB9LFxuXG4gICAgLy/moLnmja5pZOiOt+WPluiDjOWMheeahOeJqeWTgeaVsOaNrlxuICAgIGdldEJhY2tQYWNrSXRlbUJ5SWQ6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCYWdJdGVtQnlJZChCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLLCBpZClcbiAgICB9LFxuXG4gICAgLy/moLnmja5iYWdfY29kZe+8jGlk6I635b6X54mp5ZOB5pWw5o2uXG4gICAgZ2V0QmFnSXRlbUJ5SWQ6IGZ1bmN0aW9uIChiYWdfY29kZSwgaWQpIHtcbiAgICAgICAgdmFyIHRlbXBfbGlzdCA9IHRoaXMuZ2V0QmFnSXRlbUxpc3QoYmFnX2NvZGUpO1xuICAgICAgICBpZiAodGVtcF9saXN0ICE9IG51bGwgJiYgdGVtcF9saXN0W2lkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGVtcF9saXN0W2lkXVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5qC55o2u57G75Z6L6I635b6X6IOM5YyF5Lit6K+l57G75Z6L54mp5ZOB55qE5YiX6KGoXG4gICAgZ2V0QmFja1BhY2tJdGVtTGlzdEJ5VHlwZTogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIGxpc3QgPSBbXTtcbiAgICAgICAgdmFyIGJhZ19saXN0ID0gdGhpcy5nZXRCYWdJdGVtTGlzdChCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLKTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBiYWdfbGlzdCkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBiYWdfbGlzdFtrXTtcbiAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uY29uZmlnICYmIGl0ZW0uY29uZmlnLnR5cGUgPT0gdHlwZSkge1xuICAgICAgICAgICAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGlzdFxuICAgIH0sXG5cbiAgICAvL+agueaNrmJpZOiOt+WPlueJqeWTgeeahGlk5YiX6KGoXG4gICAgZ2V0QmFja1BhY2tJdGVtSWRMaXN0QnlCaWQ6IGZ1bmN0aW9uIChiaWQpIHtcbiAgICAgICAgdmFyIGlkX2xpc3QgPSBbXTtcbiAgICAgICAgdmFyIGJhZ19saXN0ID0gdGhpcy5nZXRCYWdJdGVtTGlzdChCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLKTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBiYWdfbGlzdCkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBiYWdfbGlzdFtrXTtcbiAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uY29uZmlnICYmIGl0ZW0uY29uZmlnLmlkID09IGJpZCkge1xuICAgICAgICAgICAgICAgIGlkX2xpc3QucHVzaChpdGVtLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWRfbGlzdFxuICAgIH0sXG5cbiAgICAvL+elnuWZqOWQiOaIkFxuICAgIHNldEhhbGxvd3NDb21wRGF0YTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoVXRpbHMubmV4dCh0aGlzLmhhbGxvd3NfY29tcF9saXN0KSAhPSBudWxsKSByZXR1cm47XG4gICAgICAgIHZhciBkYXRhX2xpc3QgPSBDb25maWcuaXRlbV9wcm9kdWN0X2RhdGEuZGF0YV9wcm9kdWN0X2RhdGE7XG4gICAgICAgIGZvciAodmFyIGkgaW4gZGF0YV9saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IGRhdGFfbGlzdFtpXTtcbiAgICAgICAgICAgIHRoaXMuaGFsbG93c19jb21wX2xpc3Rbdi5uZWVkX2l0ZW1zWzBdWzBdXSA9IHsgYmlkOiB2LmJpZCwgbnVtOiB2Lm5lZWRfaXRlbXNbMF1bMV0gfTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRIYWxsb3dzQ29tcERhdGE6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICBpZiAoIXRoaXMuaGFsbG93c19jb21wX2xpc3QgJiYgVXRpbHMubmV4dCh0aGlzLmhhbGxvd3NfY29tcF9saXN0KSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYWxsb3dzX2NvbXBfbGlzdFtpZF0gfHwge307XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0QWxsRXF1aXBMaXN0QnlUeXBlOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcXVpcF9zY29yZV9saXN0W3R5cGVdIHx8IFtdO1xuICAgIH0sXG5cbiAgICB1cGRhdGVFcXVpcFNjb3JlTGlzdDogZnVuY3Rpb24gKGJhZ19jb2RlLCB0ZW1wX2l0ZW0pIHtcbiAgICAgICAgaWYgKHRlbXBfaXRlbSAmJiB0ZW1wX2l0ZW0uY29uZmlnKSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IHRlbXBfaXRlbS5jb25maWcudHlwZSB8fCAxO1xuICAgICAgICAgICAgLy8g6KOF5aSH6IOM5YyF5aSH5Lu95LiA5Liq5bqP5Y+35YiX6KGoXG4gICAgICAgICAgICBpZiAoYmFnX2NvZGUgPT0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5FUVVJUFMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZXF1aXBfc2NvcmVfbGlzdFt0eXBlXSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcXVpcF9zY29yZV9saXN0W3R5cGVdID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5lcXVpcF9zY29yZV9saXN0W3R5cGVdW3RlbXBfaXRlbS5pZF0gPSB0ZW1wX2l0ZW07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJhZ19jb2RlID09IEJhY2tQYWNrQ29uc3QuQmFnX0NvZGUuQkFDS1BBQ0spIHtcbiAgICAgICAgICAgICAgICAvLyDog4zljIXph4zpnaLnmoTnrKbmloco5Lul5YmN56We5ZmoKVxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEJhY2tQYWNrQ29uc3QuaXRlbV90eXBlLkFSVElGQUNUQ0hJUFMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVxdWlwX3Njb3JlX2xpc3RbdHlwZV0pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVxdWlwX3Njb3JlX2xpc3RbdHlwZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcXVpcF9zY29yZV9saXN0W3R5cGVdW3RlbXBfaXRlbS5pZF0gPSB0ZW1wX2l0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2twYWNrTW9kZWw7XG4iXX0=