(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/sdks/qq_sdk.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, '5c5bd9NS+JOaLaYqbUdHfeN', 'qq_sdk'); // Scripts/sdks/qq_sdk.js "use strict"; // window.PLATFORM = "qq"; // 平台号 // window.PACKAGE_VERSION = "_0_0_2"; // window.CHANNEL = "h5sszg_qq"; // 渠道号 window.PACKAGE_NAME = "闪烁之光口袋版"; // 渠道号 var LoginController = require("login_controller"); var RoleController = require("role_controller"); var VipEvent = require("vip_event"); var QQSDK = function QQSDK() {}; QQSDK.account_info = null; QQSDK.user_info = null; QQSDK.initSDK = function () { console.log("QQSDK相关"); console.log(window); if (!window.qq) return; this.initTopInfo(); window.CHANNEL = "h5youyi_qq"; window.PLATFORM_NAME = "wb"; window.PLATFORM = "wb"; qq.setKeepScreenOn({ keepScreenOn: true }); qq.onShow(function (res) { qq.setKeepScreenOn({ keepScreenOn: true }); }); qq.onHide(function (res) { qq.setKeepScreenOn({ keepScreenOn: false }); }); qq.showShareMenu({ showShareItems: ['qq', 'qzone', 'wechatFriends', 'wechatMoment'], success: function success() { qq.onShareAppMessage(function () { return { imageUrl: "https://s2.ax1x.com/2019/09/21/nvzZlj.png" // 图片 URL }; }); } }); qq.getSetting({ success: function success(res) { cc.log(res); if (res.authSetting["scope.userInfo"]) { QQSDK.checkLoginStatus(); } else { var info = qq.getSystemInfoSync(); var button = qq.createUserInfoButton({ type: 'text', text: '', style: { left: 0, //info.screenWidth/2-80, top: info.screenHeight / 2, //info.windowHeight - info.windowHeight/3, width: info.screenWidth, //160, height: info.screenHeight / 2, //40, lineHeight: 0, backgroundColor: '', color: '#ffffff', textAlign: 'center', fontSize: 16, borderRadius: 4 } }); button.show(); button.onTap(function (res) { button.hide(); QQSDK.checkLoginStatus(); console.log(res); }); } } }); }; QQSDK.initTopInfo = function () { var menuInfo = qq.getMenuButtonBoundingClientRect(); var systemInfo = qq.getSystemInfoSync(); if (menuInfo.top > 30) { window.WX_FIT = menuInfo.top / systemInfo.screenHeight * 0.7 || 0; } else { window.WX_FIT = menuInfo.top / systemInfo.screenHeight * 0.1 || 0; } console.log("QQ小游戏菜单栏的适配值"); cc.log(WX_FIT); }; QQSDK.checkLoginStatus = function () { // 获取本地key try { var value = this.account_info = qq.getStorageSync('account_info'); if (value) { QQSDK.checkSessionKey(value); } else { QQSDK.login(); } } catch (e) {// Do something when catch error } }; QQSDK.login = function () { if (window.qq) { qq.login({ success: function success(res) { if (res.code) { //发起网络请求 cc.log("初始化登录信息返回"); cc.log(res); qq.request({ url: 'https://s1-wb-h5sszg.shiyuegame.com/api.php/pf/qq/login', method: "POST", data: { js_code: res.code, cps: "qqtest" }, header: { 'content-type': 'application/json' // 默认值 }, success: function success(res) { cc.log("服务器登录信息返回"); cc.log(res); if (res && res.data) { if (res.data.error == 666) { // 请求成功 try { console.log("保存用户信息到本地"); cc.log(res.data.msg); QQSDK.account_info = res.data.msg; qq.setStorageSync('account_info', res.data.msg); // 请求成功开始登录游戏 QQSDK.initUserInfo(); } catch (e) {} } } } }); } else { console.log('登录失败!' + res.errMsg); } } }); } }; QQSDK.checkSessionKey = function (data) { cc.log("校验key是否过期"); qq.checkSession({ success: function success() { // 没有失效,继续登录 QQSDK.initUserInfo(); }, fail: function fail() { // session_key 已经失效,需要重新执行登录流程 QQSDK.login(); } }); }; QQSDK.initUserInfo = function () { qq.getUserInfo({ success: function success(res) { QQSDK.user_info = res; cc.log("获取用户信息成功"); cc.log(res); QQSDK.setLoginData(res); }, fail: function fail(res) { cc.log("获取用户信息失败"); } }); }; QQSDK.setLoginData = function (user_info) { this.user_info = user_info; this.sdkBackLogin(); }; // SDK登录成功回调 QQSDK.sdkBackLogin = function () { var login_data = {}; login_data.usrName = "qq_" + this.account_info.openid; login_data.password = "qq123456"; console.log("QQ数据初始花成功,开始请求服务器列表"); LoginController.getInstance().loginPlatformRequest(login_data); }; QQSDK.loginGame = function () { var test_acount = LoginController.getInstance().getTestAccount(); cc.log("使用了QQ测试账号"); cc.log(test_acount); // SDK请求登录游戏 var login_data = {}; if (test_acount) { login_data.account = test_acount; } else { login_data.account = "qq_" + this.account_info.openid; } login_data.rawData = this.user_info.rawData; login_data.signature = this.user_info.signature; login_data.channel = CHANNEL; login_data.package_name = PACKAGE_NAME; login_data.package_version = PACKAGE_VERSION; login_data.platform = PLATFORM; login_data.token = QQSDK.account_info.session_key; login_data.timestamp = QQSDK.account_info.time; login_data.sign = QQSDK.account_info.sign; LoginController.getInstance().cusSDKLogin(login_data); }; // 通知服务器成功 QQSDK.submitLogin = function (url) { if (url) { var submit_url = "https://" + url + "/api.php/pf/qq/session"; console.log(submit_url); console.log(QQSDK.account_info); qq.request({ url: submit_url, method: "POST", data: { session_key: QQSDK.account_info.session_key, openid: QQSDK.account_info.openid, time: QQSDK.account_info.time, sign: QQSDK.account_info.sign, cps: "qqtest" }, header: { 'content-type': 'application/json' // 默认值 }, success: function success(res) { cc.log("服务器登录信息返回"); cc.log(res); if (res && res.data) { console.log(res.data); if (res.data.error == 666) {// 请求成功 } } } }); } }; QQSDK.getCurrChannel = function () {}; QQSDK.canvasToTempFilePath = function () { var canvas = cc.game.canvas; canvas.toTempFilePath({ x: 0, y: 510 * canvas.height / 1280, width: canvas.width, height: 550 * canvas.height / 1280, destWidth: 500, destHeight: 400, fileType: "jpg", success: function success(res) { //.可以保存该截屏图片 qq.shareAppMessage({ imageUrl: res.tempFilePath }); }, fail: function fail(res) { //.可以保存该截屏图片 qq.shareAppMessage({ imageUrl: "https://s2.ax1x.com/2019/09/21/nvzZlj.png" // 图片 URL }); } }); }; QQSDK.getSubChannel = function () {}; // QQ小游戏余额查询 QQSDK.checkBalance = function () { var loginInfo = LoginController.getInstance().model.getLoginInfo(); var data = { openid: this.account_info.openid, time: QQSDK.account_info.time, sign: QQSDK.account_info.sign, cps: "qqtest" }; qq.request({ url: "https://" + loginInfo.host + "/api.php/pf/qq/balance", method: "POST", data: data, header: { 'content-type': 'application/json' // 默认值 }, success: function success(res) { if (res && res.data) { if (res.data.error == 666) { // 请求成功 try { if (res.data.msg) { gcore.GlobalEvent.fire(VipEvent.UPDATA_QQ_BALANCE, res.data.msg.remainder); } } catch (e) {} } } } }); }; //支付 QQSDK.pay = function (money, buyNum, prodId, productName, productDesc, extension, coinNum) { var payCallFunc = function () { var loginInfo = LoginController.getInstance().model.getLoginInfo(); var roleVo = RoleController.getInstance().getRoleVo(); if (roleVo == null) return; var severInfo = roleVo.srv_id.split("_"); var platform = severInfo[0] || ""; var zone_id = severInfo[1]; var systemInfo = qq.getSystemInfoSync(); var systemName = systemInfo.system; var pf = ""; if (systemName.indexOf("iOS") > -1) {// return; } else if (systemName.indexOf("Android") > -1) { pf = "qq_m_qq-2001-android-2011"; } //时间戳 var date_time = Math.ceil(Date.now() / 1000); productName = productName || money * 10 + "钻石"; var cps = "qqtest"; var channel = CHANNEL; var _extension = roleVo.rid + "$$" + platform + "$$" + zone_id + "$$" + channel + "$$" + prodId + "$$" + productName + "$$" + cps + "$$" + date_time; cc.log("拓展参数_extension==>", _extension); var base_64 = require("base64").Base64; _extension = base_64.encode(_extension); qq.request({ url: "https://" + loginInfo.host + "/api.php/pf/qq/pre_pay", method: "POST", data: { openid: this.account_info.openid, zone_id: zone_id, pf: pf, amt: money * 10, good_num: 1, time: QQSDK.account_info.time, sign: QQSDK.account_info.sign, app_remark: _extension, cps: cps }, header: { 'content-type': 'application/json' // 默认值 }, success: function success(res) { console.log("预下单返回"); console.log(res); if (res && res.data) { if (res.data.error == 666) { // 请求成功 try { qq.requestMidasPayment({ prepayId: res.data.msg.prepayId, starCurrency: money * 10, success: function success(res) { console.log("支付回调成功", res); }, fail: function fail(res) { console.log("支付回调失败", res); }, complete: function complete(res) { console.log("支付回调complete", res); } }); } catch (e) {} } } } }); }.bind(this); require("tips_controller").getInstance().showFirstCharge(payCallFunc); }; module.exports = QQSDK; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcc2Rrc1xccXFfc2RrLmpzIl0sIm5hbWVzIjpbIndpbmRvdyIsIlBBQ0tBR0VfTkFNRSIsIkxvZ2luQ29udHJvbGxlciIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIlZpcEV2ZW50IiwiUVFTREsiLCJhY2NvdW50X2luZm8iLCJ1c2VyX2luZm8iLCJpbml0U0RLIiwiY29uc29sZSIsImxvZyIsInFxIiwiaW5pdFRvcEluZm8iLCJDSEFOTkVMIiwiUExBVEZPUk1fTkFNRSIsIlBMQVRGT1JNIiwic2V0S2VlcFNjcmVlbk9uIiwia2VlcFNjcmVlbk9uIiwib25TaG93IiwicmVzIiwib25IaWRlIiwic2hvd1NoYXJlTWVudSIsInNob3dTaGFyZUl0ZW1zIiwic3VjY2VzcyIsIm9uU2hhcmVBcHBNZXNzYWdlIiwiaW1hZ2VVcmwiLCJnZXRTZXR0aW5nIiwiY2MiLCJhdXRoU2V0dGluZyIsImNoZWNrTG9naW5TdGF0dXMiLCJpbmZvIiwiZ2V0U3lzdGVtSW5mb1N5bmMiLCJidXR0b24iLCJjcmVhdGVVc2VySW5mb0J1dHRvbiIsInR5cGUiLCJ0ZXh0Iiwic3R5bGUiLCJsZWZ0IiwidG9wIiwic2NyZWVuSGVpZ2h0Iiwid2lkdGgiLCJzY3JlZW5XaWR0aCIsImhlaWdodCIsImxpbmVIZWlnaHQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJjb2xvciIsInRleHRBbGlnbiIsImZvbnRTaXplIiwiYm9yZGVyUmFkaXVzIiwic2hvdyIsIm9uVGFwIiwiaGlkZSIsIm1lbnVJbmZvIiwiZ2V0TWVudUJ1dHRvbkJvdW5kaW5nQ2xpZW50UmVjdCIsInN5c3RlbUluZm8iLCJXWF9GSVQiLCJ2YWx1ZSIsImdldFN0b3JhZ2VTeW5jIiwiY2hlY2tTZXNzaW9uS2V5IiwibG9naW4iLCJlIiwiY29kZSIsInJlcXVlc3QiLCJ1cmwiLCJtZXRob2QiLCJkYXRhIiwianNfY29kZSIsImNwcyIsImhlYWRlciIsImVycm9yIiwibXNnIiwic2V0U3RvcmFnZVN5bmMiLCJpbml0VXNlckluZm8iLCJlcnJNc2ciLCJjaGVja1Nlc3Npb24iLCJmYWlsIiwiZ2V0VXNlckluZm8iLCJzZXRMb2dpbkRhdGEiLCJzZGtCYWNrTG9naW4iLCJsb2dpbl9kYXRhIiwidXNyTmFtZSIsIm9wZW5pZCIsInBhc3N3b3JkIiwiZ2V0SW5zdGFuY2UiLCJsb2dpblBsYXRmb3JtUmVxdWVzdCIsImxvZ2luR2FtZSIsInRlc3RfYWNvdW50IiwiZ2V0VGVzdEFjY291bnQiLCJhY2NvdW50IiwicmF3RGF0YSIsInNpZ25hdHVyZSIsImNoYW5uZWwiLCJwYWNrYWdlX25hbWUiLCJwYWNrYWdlX3ZlcnNpb24iLCJQQUNLQUdFX1ZFUlNJT04iLCJwbGF0Zm9ybSIsInRva2VuIiwic2Vzc2lvbl9rZXkiLCJ0aW1lc3RhbXAiLCJ0aW1lIiwic2lnbiIsImN1c1NES0xvZ2luIiwic3VibWl0TG9naW4iLCJzdWJtaXRfdXJsIiwiZ2V0Q3VyckNoYW5uZWwiLCJjYW52YXNUb1RlbXBGaWxlUGF0aCIsImNhbnZhcyIsImdhbWUiLCJ0b1RlbXBGaWxlUGF0aCIsIngiLCJ5IiwiZGVzdFdpZHRoIiwiZGVzdEhlaWdodCIsImZpbGVUeXBlIiwic2hhcmVBcHBNZXNzYWdlIiwidGVtcEZpbGVQYXRoIiwiZ2V0U3ViQ2hhbm5lbCIsImNoZWNrQmFsYW5jZSIsImxvZ2luSW5mbyIsIm1vZGVsIiwiZ2V0TG9naW5JbmZvIiwiaG9zdCIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJmaXJlIiwiVVBEQVRBX1FRX0JBTEFOQ0UiLCJyZW1haW5kZXIiLCJwYXkiLCJtb25leSIsImJ1eU51bSIsInByb2RJZCIsInByb2R1Y3ROYW1lIiwicHJvZHVjdERlc2MiLCJleHRlbnNpb24iLCJjb2luTnVtIiwicGF5Q2FsbEZ1bmMiLCJyb2xlVm8iLCJnZXRSb2xlVm8iLCJzZXZlckluZm8iLCJzcnZfaWQiLCJzcGxpdCIsInpvbmVfaWQiLCJzeXN0ZW1OYW1lIiwic3lzdGVtIiwicGYiLCJpbmRleE9mIiwiZGF0ZV90aW1lIiwiTWF0aCIsImNlaWwiLCJEYXRlIiwibm93IiwiX2V4dGVuc2lvbiIsInJpZCIsImJhc2VfNjQiLCJCYXNlNjQiLCJlbmNvZGUiLCJhbXQiLCJnb29kX251bSIsImFwcF9yZW1hcmsiLCJyZXF1ZXN0TWlkYXNQYXltZW50IiwicHJlcGF5SWQiLCJzdGFyQ3VycmVuY3kiLCJjb21wbGV0ZSIsImJpbmQiLCJzaG93Rmlyc3RDaGFyZ2UiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBQSxNQUFNLENBQUNDLFlBQVAsR0FBc0IsU0FBdEIsRUFBa0M7O0FBRWxDLElBQUlDLGVBQWUsR0FBR0MsT0FBTyxDQUFDLGtCQUFELENBQTdCOztBQUNBLElBQUlDLGNBQWMsR0FBR0QsT0FBTyxDQUFDLGlCQUFELENBQTVCOztBQUNBLElBQUlFLFFBQVEsR0FBR0YsT0FBTyxDQUFDLFdBQUQsQ0FBdEI7O0FBRUEsSUFBSUcsS0FBSyxHQUFHLFNBQVJBLEtBQVEsR0FBVyxDQUV0QixDQUZEOztBQUlBQSxLQUFLLENBQUNDLFlBQU4sR0FBcUIsSUFBckI7QUFDQUQsS0FBSyxDQUFDRSxTQUFOLEdBQWtCLElBQWxCOztBQUVBRixLQUFLLENBQUNHLE9BQU4sR0FBZ0IsWUFBVztBQUN2QkMsRUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVksU0FBWjtBQUNBRCxFQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWVgsTUFBWjtBQUdFLE1BQUksQ0FBQ0EsTUFBTSxDQUFDWSxFQUFaLEVBQWlCO0FBRWpCLE9BQUtDLFdBQUw7QUFFQWIsRUFBQUEsTUFBTSxDQUFDYyxPQUFQLEdBQWlCLFlBQWpCO0FBQ0FkLEVBQUFBLE1BQU0sQ0FBQ2UsYUFBUCxHQUF1QixJQUF2QjtBQUNBZixFQUFBQSxNQUFNLENBQUNnQixRQUFQLEdBQWtCLElBQWxCO0FBRUFKLEVBQUFBLEVBQUUsQ0FBQ0ssZUFBSCxDQUFtQjtBQUNqQkMsSUFBQUEsWUFBWSxFQUFFO0FBREcsR0FBbkI7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aEJELENBZ0JFLE9BQU95QyxDQUFQLEVBQVUsQ0FFWDtBQUNGO0FBQ0Y7QUFDRjtBQTNDUSxLQUFYO0FBNkNELEdBN0VpQixDQTZFaEJ1RyxJQTdFZ0IsQ0E2RVgsSUE3RVcsQ0FBbEI7O0FBOEVBakssRUFBQUEsT0FBTyxDQUFDLGlCQUFELENBQVAsQ0FBMkJpRixXQUEzQixHQUF5Q2lGLGVBQXpDLENBQXlEN0IsV0FBekQ7QUFDRCxDQWhGRDs7QUFxRkE4QixNQUFNLENBQUNDLE9BQVAsR0FBaUJqSyxLQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gd2luZG93LlBMQVRGT1JNID0gXCJxcVwiOyAgICAgICAgLy8g5bmz5Y+w5Y+3XHJcbi8vIHdpbmRvdy5QQUNLQUdFX1ZFUlNJT04gPSBcIl8wXzBfMlwiO1xyXG4vLyB3aW5kb3cuQ0hBTk5FTCA9IFwiaDVzc3pnX3FxXCI7ICAvLyDmuKDpgZPlj7dcclxud2luZG93LlBBQ0tBR0VfTkFNRSA9IFwi6Zeq54OB5LmL5YWJ5Y+j6KKL54mIXCI7ICAvLyDmuKDpgZPlj7dcclxuXHJcbnZhciBMb2dpbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwibG9naW5fY29udHJvbGxlclwiKTtcclxudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcclxudmFyIFZpcEV2ZW50ID0gcmVxdWlyZShcInZpcF9ldmVudFwiKVxyXG5cclxudmFyIFFRU0RLID0gZnVuY3Rpb24oKSB7XHJcblxyXG59O1xyXG5cclxuUVFTREsuYWNjb3VudF9pbmZvID0gbnVsbDtcclxuUVFTREsudXNlcl9pbmZvID0gbnVsbDtcclxuXHJcblFRU0RLLmluaXRTREsgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiUVFTREvnm7jlhbNcIik7XHJcbiAgICBjb25zb2xlLmxvZyh3aW5kb3cpO1xyXG5cclxuICAgXHJcbiAgICAgIGlmICghd2luZG93LnFxKSAgcmV0dXJuO1xyXG4gIFxyXG4gICAgICB0aGlzLmluaXRUb3BJbmZvKCk7XHJcblxyXG4gICAgICB3aW5kb3cuQ0hBTk5FTCA9IFwiaDV5b3V5aV9xcVwiO1xyXG4gICAgICB3aW5kb3cuUExBVEZPUk1fTkFNRSA9IFwid2JcIjtcclxuICAgICAgd2luZG93LlBMQVRGT1JNID0gXCJ3YlwiOyBcclxuICAgICAgXHJcbiAgICAgIHFxLnNldEtlZXBTY3JlZW5Pbih7XHJcbiAgICAgICAga2VlcFNjcmVlbk9uOiB0cnVlXHJcbiAgICAgIH0pXHJcbiAgICAgIHFxLm9uU2hvdyhmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgIHFxLnNldEtlZXBTY3JlZW5Pbih7XHJcbiAgICAgICAgICBrZWVwU2NyZWVuT246IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHFxLm9uSGlkZShmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgIHFxLnNldEtlZXBTY3JlZW5Pbih7XHJcbiAgICAgICAgICBrZWVwU2NyZWVuT246IGZhbHNlXHJcbiAgICAgICAgfSlcclxuICAgICAgfSk7XHJcbiAgICAgIFxyXG4gICAgICBxcS5zaG93U2hhcmVNZW51KHtcclxuICAgICAgICBzaG93U2hhcmVJdGVtczogWydxcScsICdxem9uZScsJ3dlY2hhdEZyaWVuZHMnLCAnd2VjaGF0TW9tZW50J10sXHJcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICBxcS5vblNoYXJlQXBwTWVzc2FnZSgoKSA9PiAoe1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaW1hZ2VVcmw6IFwiaHR0cHM6Ly9zMi5heDF4LmNvbS8yMDE5LzA5LzIxL252elpsai5wbmdcIiAvLyDlm77niYcgVVJMXHJcbiAgICAgICAgICB9KSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBxcS5nZXRTZXR0aW5nKHtcclxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHtcclxuICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgaWYgKHJlcy5hdXRoU2V0dGluZ1tcInNjb3BlLnVzZXJJbmZvXCJdKSB7XHJcbiAgICAgICAgICAgIFFRU0RLLmNoZWNrTG9naW5TdGF0dXMoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBpbmZvID0gcXEuZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgICAgICAgICAgdmFyIGJ1dHRvbiA9IHFxLmNyZWF0ZVVzZXJJbmZvQnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICAgIHRleHQ6ICcnLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgbGVmdDogMCwvL2luZm8uc2NyZWVuV2lkdGgvMi04MCxcclxuICAgICAgICAgICAgICAgICAgdG9wOiBpbmZvLnNjcmVlbkhlaWdodC8yLC8vaW5mby53aW5kb3dIZWlnaHQgLSBpbmZvLndpbmRvd0hlaWdodC8zLFxyXG4gICAgICAgICAgICAgICAgICB3aWR0aDogaW5mby5zY3JlZW5XaWR0aCwvLzE2MCxcclxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpbmZvLnNjcmVlbkhlaWdodC8yLC8vNDAsXHJcbiAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJycsXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZmZmZicsXHJcbiAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAxNixcclxuICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiA0LFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBidXR0b24uc2hvdygpO1xyXG4gICAgICAgICAgICBidXR0b24ub25UYXAoKHJlcyk9PntcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICBRUVNESy5jaGVja0xvZ2luU3RhdHVzKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxufVxyXG5cclxuXHJcblFRU0RLLmluaXRUb3BJbmZvID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgbWVudUluZm8gPSBxcS5nZXRNZW51QnV0dG9uQm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB2YXIgc3lzdGVtSW5mbyA9IHFxLmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICBpZihtZW51SW5mby50b3A+MzApe1xyXG4gICAgICB3aW5kb3cuV1hfRklUID0gbWVudUluZm8udG9wIC8gc3lzdGVtSW5mby5zY3JlZW5IZWlnaHQgKjAuNyB8fCAwO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHdpbmRvdy5XWF9GSVQgPSBtZW51SW5mby50b3AgLyBzeXN0ZW1JbmZvLnNjcmVlbkhlaWdodCAqMC4xIHx8IDA7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcIlFR5bCP5ri45oiP6I+c5Y2V5qCP55qE6YCC6YWN5YC8XCIpO1xyXG4gICAgY2MubG9nKFdYX0ZJVCk7XHJcbn1cclxuXHJcblFRU0RLLmNoZWNrTG9naW5TdGF0dXMgPSBmdW5jdGlvbigpIHtcclxuICAvLyDojrflj5bmnKzlnLBrZXlcclxuICB0cnkge1xyXG4gICAgdmFyIHZhbHVlID0gdGhpcy5hY2NvdW50X2luZm8gPSBxcS5nZXRTdG9yYWdlU3luYygnYWNjb3VudF9pbmZvJylcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBRUVNESy5jaGVja1Nlc3Npb25LZXkodmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgUVFTREsubG9naW4oKTtcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICAvLyBEbyBzb21ldGhpbmcgd2hlbiBjYXRjaCBlcnJvclxyXG4gIH1cclxufVxyXG5cclxuXHJcblFRU0RLLmxvZ2luID0gZnVuY3Rpb24oKSB7XHJcbiAgaWYgKHdpbmRvdy5xcSkge1xyXG4gICAgICBxcS5sb2dpbih7XHJcbiAgICAgICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAvL+WPkei1t+e9kee7nOivt+axglxyXG4gICAgICAgICAgICAgICAgY2MubG9nKFwi5Yid5aeL5YyW55m75b2V5L+h5oGv6L+U5ZueXCIpO1xyXG4gICAgICAgICAgICAgICAgY2MubG9nKHJlcyk7XHJcbiAgICAgICAgICAgICAgICBxcS5yZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9zMS13Yi1oNXNzemcuc2hpeXVlZ2FtZS5jb20vYXBpLnBocC9wZi9xcS9sb2dpbicsXHJcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICBqc19jb2RlOiByZXMuY29kZSxcclxuICAgICAgICAgICAgICAgICAgICBjcHM6IFwicXF0ZXN0XCJcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgc3VjY2VzcyAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2MubG9nKFwi5pyN5Yqh5Zmo55m75b2V5L+h5oGv6L+U5ZueXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS/neWtmOeUqOaIt+S/oeaBr+WIsOacrOWcsFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLmxvZyhyZXMuZGF0YS5tc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUVFTREsuYWNjb3VudF9pbmZvID0gcmVzLmRhdGEubXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXEuc2V0U3RvcmFnZVN5bmMoJ2FjY291bnRfaW5mbycsIHJlcy5kYXRhLm1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDor7fmsYLmiJDlip/lvIDlp4vnmbvlvZXmuLjmiI9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFRU0RLLmluaXRVc2VySW5mbygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+eZu+W9leWksei0pe+8gScgKyByZXMuZXJyTXNnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuUVFTREsuY2hlY2tTZXNzaW9uS2V5ID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgY2MubG9nKFwi5qCh6aqMa2V55piv5ZCm6L+H5pyfXCIpO1xyXG4gICAgICBxcS5jaGVja1Nlc3Npb24oe1xyXG4gICAgICAgIHN1Y2Nlc3MgKCkge1xyXG4gICAgICAgICAgLy8g5rKh5pyJ5aSx5pWI77yM57un57ut55m75b2VXHJcbiAgICAgICAgICBRUVNESy5pbml0VXNlckluZm8oKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZhaWwgKCkge1xyXG4gICAgICAgICAgLy8gc2Vzc2lvbl9rZXkg5bey57uP5aSx5pWI77yM6ZyA6KaB6YeN5paw5omn6KGM55m75b2V5rWB56iLXHJcbiAgICAgICAgICBRUVNESy5sb2dpbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxufVxyXG5cclxuUVFTREsuaW5pdFVzZXJJbmZvID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHFxLmdldFVzZXJJbmZvKHtcclxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHtcclxuICAgICAgICAgIFFRU0RLLnVzZXJfaW5mbyA9IHJlcztcclxuICAgICAgICAgIGNjLmxvZyhcIuiOt+WPlueUqOaIt+S/oeaBr+aIkOWKn1wiKTtcclxuICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgUVFTREsuc2V0TG9naW5EYXRhKHJlcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgZmFpbDogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAgICAgICBjYy5sb2coXCLojrflj5bnlKjmiLfkv6Hmga/lpLHotKVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG59XHJcblxyXG5RUVNESy5zZXRMb2dpbkRhdGEgPSBmdW5jdGlvbih1c2VyX2luZm8pIHtcclxuICB0aGlzLnVzZXJfaW5mbyA9IHVzZXJfaW5mbztcclxuICB0aGlzLnNka0JhY2tMb2dpbigpO1xyXG59XHJcblxyXG4vLyBTREvnmbvlvZXmiJDlip/lm57osINcclxuUVFTREsuc2RrQmFja0xvZ2luID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIGxvZ2luX2RhdGEgPSB7fTtcclxuICBsb2dpbl9kYXRhLnVzck5hbWUgPSBcInFxX1wiICsgdGhpcy5hY2NvdW50X2luZm8ub3BlbmlkO1xyXG4gIGxvZ2luX2RhdGEucGFzc3dvcmQgPSBcInFxMTIzNDU2XCI7XHJcbiAgY29uc29sZS5sb2coXCJRUeaVsOaNruWIneWni+iKseaIkOWKn++8jOW8gOWni+ivt+axguacjeWKoeWZqOWIl+ihqFwiKTtcclxuICBMb2dpbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5sb2dpblBsYXRmb3JtUmVxdWVzdChsb2dpbl9kYXRhKTtcclxufVxyXG5cclxuUVFTREsubG9naW5HYW1lID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIHRlc3RfYWNvdW50ID0gTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0VGVzdEFjY291bnQoKTtcclxuICBjYy5sb2coXCLkvb/nlKjkuoZRUea1i+ivlei0puWPt1wiKTtcclxuICBjYy5sb2codGVzdF9hY291bnQpO1xyXG5cclxuICAvLyBTREvor7fmsYLnmbvlvZXmuLjmiI9cclxuICB2YXIgbG9naW5fZGF0YSA9IHt9O1xyXG4gIGlmICh0ZXN0X2Fjb3VudCkge1xyXG4gICAgbG9naW5fZGF0YS5hY2NvdW50ID0gdGVzdF9hY291bnQ7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxvZ2luX2RhdGEuYWNjb3VudCA9IFwicXFfXCIgKyB0aGlzLmFjY291bnRfaW5mby5vcGVuaWQ7XHJcbiAgfVxyXG4gIGxvZ2luX2RhdGEucmF3RGF0YSA9IHRoaXMudXNlcl9pbmZvLnJhd0RhdGE7XHJcbiAgbG9naW5fZGF0YS5zaWduYXR1cmUgPSB0aGlzLnVzZXJfaW5mby5zaWduYXR1cmU7XHJcbiAgbG9naW5fZGF0YS5jaGFubmVsID0gQ0hBTk5FTDtcclxuICBsb2dpbl9kYXRhLnBhY2thZ2VfbmFtZSA9IFBBQ0tBR0VfTkFNRTtcclxuICBsb2dpbl9kYXRhLnBhY2thZ2VfdmVyc2lvbiA9IFBBQ0tBR0VfVkVSU0lPTjtcclxuICBsb2dpbl9kYXRhLnBsYXRmb3JtID0gUExBVEZPUk07XHJcbiAgbG9naW5fZGF0YS50b2tlbiA9IFFRU0RLLmFjY291bnRfaW5mby5zZXNzaW9uX2tleTtcclxuICBsb2dpbl9kYXRhLnRpbWVzdGFtcCA9IFFRU0RLLmFjY291bnRfaW5mby50aW1lO1xyXG4gIGxvZ2luX2RhdGEuc2lnbiA9IFFRU0RLLmFjY291bnRfaW5mby5zaWduO1xyXG5cclxuICBMb2dpbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jdXNTREtMb2dpbihsb2dpbl9kYXRhKTtcclxufVxyXG5cclxuLy8g6YCa55+l5pyN5Yqh5Zmo5oiQ5YqfXHJcblFRU0RLLnN1Ym1pdExvZ2luID0gZnVuY3Rpb24odXJsKSB7XHJcbiAgICBpZiAodXJsKSB7XHJcbiAgICAgIHZhciBzdWJtaXRfdXJsID0gXCJodHRwczovL1wiICsgdXJsICsgXCIvYXBpLnBocC9wZi9xcS9zZXNzaW9uXCI7XHJcbiAgICAgIGNvbnNvbGUubG9nKHN1Ym1pdF91cmwpO1xyXG4gICAgICBjb25zb2xlLmxvZyhRUVNESy5hY2NvdW50X2luZm8pO1xyXG5cclxuICAgICAgcXEucmVxdWVzdCh7XHJcbiAgICAgICAgdXJsOiBzdWJtaXRfdXJsLFxyXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgc2Vzc2lvbl9rZXk6IFFRU0RLLmFjY291bnRfaW5mby5zZXNzaW9uX2tleSxcclxuICAgICAgICAgIG9wZW5pZDogUVFTREsuYWNjb3VudF9pbmZvLm9wZW5pZCxcclxuICAgICAgICAgIHRpbWU6UVFTREsuYWNjb3VudF9pbmZvLnRpbWUsXHJcbiAgICAgICAgICBzaWduOlFRU0RLLmFjY291bnRfaW5mby5zaWduLFxyXG4gICAgICAgICAgY3BzOiBcInFxdGVzdFwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgLy8g6buY6K6k5YC8XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgIGNjLmxvZyhcIuacjeWKoeWZqOeZu+W9leS/oeaBr+i/lOWbnlwiKTtcclxuICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuZGF0YSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMuZGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG5cclxuICAgIH0gXHJcbn1cclxuXHJcblFRU0RLLmdldEN1cnJDaGFubmVsID0gZnVuY3Rpb24oKSB7XHJcblxyXG59XHJcblxyXG5RUVNESy5jYW52YXNUb1RlbXBGaWxlUGF0aCA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciBjYW52YXMgPSBjYy5nYW1lLmNhbnZhcztcclxuICBcclxuICBjYW52YXMudG9UZW1wRmlsZVBhdGgoe1xyXG4gICAgICB4OiAwLFxyXG4gICAgICB5OiA1MTAqY2FudmFzLmhlaWdodC8xMjgwLFxyXG4gICAgICB3aWR0aDogY2FudmFzLndpZHRoLFxyXG4gICAgICBoZWlnaHQ6IDU1MCpjYW52YXMuaGVpZ2h0LzEyODAsXHJcbiAgICAgIGRlc3RXaWR0aDogNTAwLFxyXG4gICAgICBkZXN0SGVpZ2h0OiA0MDAsXHJcbiAgICAgIGZpbGVUeXBlOlwianBnXCIsXHJcblxyXG4gICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgIC8vLuWPr+S7peS/neWtmOivpeaIquWxj+WbvueJh1xyXG4gICAgICAgICAgcXEuc2hhcmVBcHBNZXNzYWdlKHtcclxuICAgICAgICAgICAgICBpbWFnZVVybDogcmVzLnRlbXBGaWxlUGF0aFxyXG4gICAgICAgICAgfSlcclxuICAgICAgfSxcclxuICAgICAgZmFpbCAocmVzKSB7XHJcbiAgICAgICAgICAvLy7lj6/ku6Xkv53lrZjor6XmiKrlsY/lm77niYdcclxuICAgICAgICAgIHFxLnNoYXJlQXBwTWVzc2FnZSh7XHJcbiAgICAgICAgICAgIGltYWdlVXJsOiBcImh0dHBzOi8vczIuYXgxeC5jb20vMjAxOS8wOS8yMS9udnpabGoucG5nXCIgLy8g5Zu+54mHIFVSTFxyXG4gICAgICAgICAgfSlcclxuICAgICAgfSxcclxuICB9KVxyXG5cclxufVxyXG5cclxuUVFTREsuZ2V0U3ViQ2hhbm5lbCA9IGZ1bmN0aW9uKCkge1xyXG4gIFxyXG59XHJcblxyXG5cclxuLy8gUVHlsI/muLjmiI/kvZnpop3mn6Xor6JcclxuUVFTREsuY2hlY2tCYWxhbmNlID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIGxvZ2luSW5mbyA9IExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm1vZGVsLmdldExvZ2luSW5mbygpO1xyXG4gIFxyXG4gIHZhciBkYXRhID0ge1xyXG4gICAgICBvcGVuaWQ6IHRoaXMuYWNjb3VudF9pbmZvLm9wZW5pZCxcclxuICAgICAgdGltZTpRUVNESy5hY2NvdW50X2luZm8udGltZSxcclxuICAgICAgc2lnbjpRUVNESy5hY2NvdW50X2luZm8uc2lnbixcclxuICAgICAgY3BzOiBcInFxdGVzdFwiXHJcbiAgICB9XHJcbiAgICBcclxuICBxcS5yZXF1ZXN0KHtcclxuICAgIHVybDogXCJodHRwczovL1wiK2xvZ2luSW5mby5ob3N0K1wiL2FwaS5waHAvcGYvcXEvYmFsYW5jZVwiLFxyXG4gICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgIGRhdGE6IGRhdGEsXHJcbiAgICBoZWFkZXI6IHtcclxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgIH0sXHJcbiAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgaWYgKHJlcyAmJiByZXMuZGF0YSkge1xyXG4gICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGlmKHJlcy5kYXRhLm1zZyl7XHJcbiAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKFZpcEV2ZW50LlVQREFUQV9RUV9CQUxBTkNFLHJlcy5kYXRhLm1zZy5yZW1haW5kZXIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG5cclxuLy/mlK/ku5hcclxuUVFTREsucGF5ID0gZnVuY3Rpb24obW9uZXksIGJ1eU51bSwgcHJvZElkLCBwcm9kdWN0TmFtZSwgcHJvZHVjdERlc2MsIGV4dGVuc2lvbiwgY29pbk51bSkge1xyXG4gIHZhciBwYXlDYWxsRnVuYyA9IGZ1bmN0aW9uKCl7XHJcbiAgICB2YXIgbG9naW5JbmZvID0gTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkubW9kZWwuZ2V0TG9naW5JbmZvKCk7XHJcblxyXG4gICAgdmFyIHJvbGVWbyA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XHJcbiAgICBpZiAocm9sZVZvID09IG51bGwpIHJldHVybjtcclxuICAgIHZhciBzZXZlckluZm8gPSByb2xlVm8uc3J2X2lkLnNwbGl0KFwiX1wiKTtcclxuICAgIHZhciBwbGF0Zm9ybSA9IHNldmVySW5mb1swXSB8fCBcIlwiO1xyXG4gICAgdmFyIHpvbmVfaWQgPSBzZXZlckluZm9bMV07XHJcblxyXG4gICAgdmFyIHN5c3RlbUluZm8gPSBxcS5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgdmFyIHN5c3RlbU5hbWUgPSBzeXN0ZW1JbmZvLnN5c3RlbTtcclxuICAgIHZhciBwZiA9IFwiXCI7XHJcbiAgICBpZihzeXN0ZW1OYW1lLmluZGV4T2YoXCJpT1NcIik+LTEpe1xyXG4gICAgICAvLyByZXR1cm47XHJcbiAgICB9ZWxzZSBpZihzeXN0ZW1OYW1lLmluZGV4T2YoXCJBbmRyb2lkXCIpPi0xKXtcclxuICAgICAgcGYgPSBcInFxX21fcXEtMjAwMS1hbmRyb2lkLTIwMTFcIjtcclxuICAgIH1cclxuXHJcbiAgICAvL+aXtumXtOaIs1xyXG4gICAgdmFyIGRhdGVfdGltZSA9IE1hdGguY2VpbChEYXRlLm5vdygpIC8gMTAwMCk7XHJcblxyXG4gICAgcHJvZHVjdE5hbWUgPSBwcm9kdWN0TmFtZSB8fCAobW9uZXkgKiAxMCkgKyBcIumSu+efs1wiO1xyXG4gICAgdmFyIGNwcyA9IFwicXF0ZXN0XCI7XHJcbiAgICB2YXIgY2hhbm5lbCA9IENIQU5ORUw7XHJcblxyXG4gICAgdmFyIF9leHRlbnNpb24gPSByb2xlVm8ucmlkICsgXCIkJFwiICsgcGxhdGZvcm0gKyBcIiQkXCIgKyB6b25lX2lkICtcclxuICAgICAgICAgIFwiJCRcIiArIGNoYW5uZWwgKyBcIiQkXCIgKyBwcm9kSWQgKyBcIiQkXCIgKyBwcm9kdWN0TmFtZSArIFwiJCRcIiArIGNwcyArIFwiJCRcIiArIGRhdGVfdGltZTtcclxuICAgICAgY2MubG9nKFwi5ouT5bGV5Y+C5pWwX2V4dGVuc2lvbj09PlwiLCBfZXh0ZW5zaW9uKVxyXG4gICAgICB2YXIgYmFzZV82NCA9IHJlcXVpcmUoXCJiYXNlNjRcIikuQmFzZTY0O1xyXG4gICAgICBfZXh0ZW5zaW9uID0gYmFzZV82NC5lbmNvZGUoX2V4dGVuc2lvbik7XHJcbiAgICBcclxuICAgIFxyXG4gICAgcXEucmVxdWVzdCh7XHJcbiAgICAgIHVybDogXCJodHRwczovL1wiK2xvZ2luSW5mby5ob3N0K1wiL2FwaS5waHAvcGYvcXEvcHJlX3BheVwiLFxyXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgb3BlbmlkOiB0aGlzLmFjY291bnRfaW5mby5vcGVuaWQsXHJcbiAgICAgICAgem9uZV9pZDogem9uZV9pZCxcclxuICAgICAgICBwZjogcGYsXHJcbiAgICAgICAgYW10Om1vbmV5KjEwLFxyXG4gICAgICAgIGdvb2RfbnVtOiAxLFxyXG4gICAgICAgIHRpbWU6UVFTREsuYWNjb3VudF9pbmZvLnRpbWUsXHJcbiAgICAgICAgc2lnbjpRUVNESy5hY2NvdW50X2luZm8uc2lnbixcclxuICAgICAgICBhcHBfcmVtYXJrOl9leHRlbnNpb24sXHJcbiAgICAgICAgY3BzOiBjcHNcclxuICAgICAgfSxcclxuICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgICAgfSxcclxuICAgICAgc3VjY2VzcyAocmVzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLpooTkuIvljZXov5Tlm55cIik7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzKTtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5kYXRhKSB7XHJcbiAgICAgICAgICBpZiAocmVzLmRhdGEuZXJyb3IgPT0gNjY2KSB7ICAgIC8vIOivt+axguaIkOWKn1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcXEucmVxdWVzdE1pZGFzUGF5bWVudCh7XHJcbiAgICAgICAgICAgICAgICAgIHByZXBheUlkOnJlcy5kYXRhLm1zZy5wcmVwYXlJZCxcclxuICAgICAgICAgICAgICAgICAgc3RhckN1cnJlbmN5Om1vbmV5KjEwLFxyXG4gICAgICAgICAgICAgICAgICBzdWNjZXNzOmZ1bmN0aW9uKHJlcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmlK/ku5jlm57osIPmiJDlip9cIixyZXMpXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgICBmYWlsOmZ1bmN0aW9uKHJlcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmlK/ku5jlm57osIPlpLHotKVcIixyZXMpXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICBjb21wbGV0ZTpmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pSv5LuY5Zue6LCDY29tcGxldGVcIixyZXMpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfS5iaW5kKHRoaXMpO1xyXG4gIHJlcXVpcmUoXCJ0aXBzX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5zaG93Rmlyc3RDaGFyZ2UocGF5Q2FsbEZ1bmMpO1xyXG59O1xyXG5cclxuXHJcblxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBRUVNESzsiXX0=