123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542 |
- (function() {
- var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
- var __module = nodeEnv ? module : {exports:{}};
- var __filename = 'preview-scripts/assets/script/plat/PlatformTaoBao.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, '571a65mEzNKSp3gUn62tiB2', 'PlatformTaoBao');
- // script/plat/PlatformTaoBao.ts
- "use strict";
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- Object.defineProperty(exports, "__esModule", { value: true });
- /**
- 游戏名称:逍遥仙(淘宝)
- 小程序ID:
- */
- var gameMethod_1 = require("../common/gameMethod");
- var Xyc_1 = require("../common/Xyc");
- var Config_1 = require("../Config");
- var EventConst_1 = require("../data/const/EventConst");
- var TypeConst_1 = require("../data/const/TypeConst");
- var GameDataCenter_1 = require("../data/GameDataCenter");
- var GameController_1 = require("../GameController");
- var UIHelp_1 = require("../logic/ui/UIHelp");
- var EventMng_1 = require("../manager/EventMng");
- var PlatformBase_1 = require("./PlatformBase");
- var PlatformTaoBao = /** @class */ (function (_super) {
- __extends(PlatformTaoBao, _super);
- function PlatformTaoBao() {
- var _this = _super.call(this) || this;
- _this.AdXiaDanSuc = false; //初始化
- // 切换到前台
- var listener = function (res) {
- // console.log("-----tb.onShow 回调触发111:", res)
- console.log("-----tb.onShow 回调触发222:", this.AdXiaDanSuc);
- // if (this.AdXiaDanSuc) {
- this.AdXiaDanSuc = false;
- console.log("有广告任务,发起奖励请求");
- // GameDataCenter.adVideo.onTaoBaoXiadanSucc() // 向服务端请求奖励
- // }
- this.dealQuery(res);
- GameDataCenter_1.default.audio.resumeMusic();
- // IOS系统,在后台切回时似乎回失去常亮功能,这里再调用一次
- my.setKeepScreenOn({
- keepScreenOn: true
- });
- EventMng_1.default.emit(EventConst_1.GameEvent.ON_SHOW_APP);
- };
- my.onShow(function (res) {
- console.log("-----tb.onShow 回调触发:", res);
- // if (this.AdXiaDanSuc) {
- // this.AdXiaDanSuc = false
- // console.log("有广告任务,发起奖励请求")
- // //连续请求5次
- // if (Config.paySuccAdokId != null) {
- // clearInterval(Config.paySuccAdokId)
- // Config.paySuccAdokId = null
- // }
- // Config.paySuccAdokIndex = 0
- // Config.paySuccAdokId = setInterval(() => {
- // Config.paySuccAdokIndex++
- // if (Config.paySuccAdokIndex >= 5) {
- // clearInterval(Config.paySuccAdokId)
- // Config.paySuccAdokId = null
- // }
- // GameDataCenter.adVideo.onTaoBaoXiadanSucc() // 向服务端请求奖励
- // }, 1000)
- // }
- _this.dealQuery(res);
- GameDataCenter_1.default.audio.resumeMusic();
- // IOS系统,在后台切回时似乎回失去常亮功能,这里再调用一次
- my.setKeepScreenOn({
- keepScreenOn: true
- });
- EventMng_1.default.emit(EventConst_1.GameEvent.ON_SHOW_APP);
- });
- // my.offShow(listener)
- var hideListener = function (res) {
- console.log("-----tb.onHide 回调触发:", res);
- // GameDataCenter.plat.instance.reportRole(ReportRoleType.offline)
- // this.dealQuery(res)
- GameDataCenter_1.default.audio.stopAllEffects();
- GameDataCenter_1.default.audio.pauseMusic();
- };
- my.onHide(function (res) {
- console.log("-----tb.onHide 回调触发:", res);
- // GameDataCenter.plat.instance.reportRole(ReportRoleType.offline)
- // this.dealQuery(res)
- GameDataCenter_1.default.audio.stopAllEffects();
- GameDataCenter_1.default.audio.pauseMusic();
- });
- // my.offHide(hideListener);
- //该方法不支持ide
- // my.setPreferredFramesPerSecond(30);
- my.setKeepScreenOn({
- keepScreenOn: true
- });
- if (my.getUpdateManager) {
- var updateManager_1 = my.getUpdateManager();
- updateManager_1.onCheckForUpdate(function (res) {
- //请求完新版本信息的回调
- console.log(res.hasUpdate);
- });
- updateManager_1.onUpdateReady(function () {
- my.confirm({
- title: '更新提示',
- content: '新版本已经准备好,是否重启应用?',
- success: function (res) {
- if (res.confirm) {
- // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
- updateManager_1.applyUpdate();
- }
- }
- });
- });
- }
- // 初始化并获取sdk实例
- if (my.tb.getInteractiveSDK) {
- _this.sdk = my.tb.getInteractiveSDK(); //调用此函数即可初始化SDK
- // 获取运营活动控制器
- _this.gameActivityController = _this.sdk.getGameActivityController({
- bizCode: 'xiaoyaoxiannew1',
- });
- }
- return _this;
- }
- PlatformTaoBao.prototype.showLoginView = function () {
- var _this = this;
- console.log("淘宝小游戏平台静默登录");
- EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 0.25, "login");
- my.getSystemInfo({
- success: function (res) {
- console.log("systemInfo: " + JSON.stringify(res));
- if (res["platform"] == "Android") {
- GameDataCenter_1.default.plat.instance.deviceOS = TypeConst_1.PlatFormDevType.android;
- }
- else {
- GameDataCenter_1.default.plat.instance.deviceOS = TypeConst_1.PlatFormDevType.ios;
- }
- }
- });
- // async function GetOpenId() {
- // let result
- // try {
- // result = await window['cloud'].application.httpRequest({
- // //不需要完整域名,只需要接口访问路径即可
- // 'path': '/welcome',
- // 'method': 'GET',
- // 'headers': {},
- // 'params': {},
- // 'body':{},
- // //cloudAppId填写开启本地调试的云应用ID,否则会调到云端
- // 'exts': { "cloudAppId": "55088", "timeout": 4000 }
- // });
- // } catch (error) {
- // console.log(error)
- // }
- // }
- my.authorize({
- scopes: 'scope.userInfo',
- success: function (res) {
- console.log("淘宝授权:" + JSON.stringify(res));
- EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 0.75, "login");
- // GetOpenId().then(res => {
- // console.log("openId == ",res)
- var code = res.accessToken.accessToken;
- console.log("淘宝静默登录成功");
- var tagInfo = _this.sdk.getChannelTag();
- console.log('ChannelTag', tagInfo);
- var params = {
- pid: Config_1.default.pid,
- param: [code]
- };
- GameController_1.default.network.send(Xyc_1.PlayerLogin.url, params, function (result) {
- console.log("后段验证返回");
- EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 1, "login");
- if (result.type == 1 && result.platBack) {
- _this.openId = result.platBack.openid;
- _this.loginParams = [result.platBack.token, JSON.stringify(tagInfo)];
- console.log("后端验证成功", _this.openId);
- // 获取邀请者uuid
- var inviter = "";
- // if (wx.getEnterOptionsSync) {
- // let obj = wx.getEnterOptionsSync()
- // if (obj.query && obj.query['inviter']) {
- // inviter = obj.query['inviter']
- // }
- // }
- _this.login(inviter);
- }
- else {
- console.log("PlayerLogin.url 返回数据异常");
- if (gameMethod_1.gameMethod.isEmpty(result.win) || gameMethod_1.gameMethod.isEmpty(result.win.msgOut)) {
- GameDataCenter_1.default.plat.showErrDialog(TypeConst_1.GameErrCode.errGamePlatLogin);
- }
- }
- // 获取用户设置信息
- console.log("获取用户设置信息");
- my.getSetting({
- withSubscriptions: true,
- success: function (res) {
- console.log("获取用户设置信息 回调:", res);
- if (res.authSetting && res.authSetting["scope.userInfo"]) {
- // 已授权
- console.log("已授权");
- GameDataCenter_1.default.plat.instance.hasAuthUserInfo = true;
- }
- }
- });
- });
- // })
- },
- fail: function (res) {
- // UIHelp.ShowTips("授权失败,请点击右上角的三个点,开启授权后重新登录")
- EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 0.75, "login");
- // GetOpenId().then(res => {
- // console.log("openId == ",res)
- // let code = res.accessToken.accessToken;
- console.log("淘宝静默登录成功");
- var tagInfo = _this.sdk.getChannelTag();
- console.log('ChannelTag', tagInfo);
- var params = {
- pid: Config_1.default.pid,
- param: []
- };
- GameController_1.default.network.send(Xyc_1.PlayerLogin.url, params, function (result) {
- console.log("后段验证返回");
- EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 1, "login");
- if (result.type == 1 && result.platBack) {
- _this.openId = result.platBack.openid;
- _this.loginParams = [result.platBack.token, JSON.stringify(tagInfo)];
- console.log("后端验证成功", _this.openId);
- // 获取邀请者uuid
- var inviter = "";
- // if (wx.getEnterOptionsSync) {
- // let obj = wx.getEnterOptionsSync()
- // if (obj.query && obj.query['inviter']) {
- // inviter = obj.query['inviter']
- // }
- // }
- _this.login(inviter);
- }
- else {
- console.log("PlayerLogin.url 返回数据异常");
- if (gameMethod_1.gameMethod.isEmpty(result.win) || gameMethod_1.gameMethod.isEmpty(result.win.msgOut)) {
- GameDataCenter_1.default.plat.showErrDialog(TypeConst_1.GameErrCode.errGamePlatLogin);
- }
- }
- // 获取用户设置信息
- console.log("获取用户设置信息");
- my.getSetting({
- withSubscriptions: true,
- success: function (res) {
- console.log("获取用户设置信息 回调:", res);
- if (res.authSetting && res.authSetting["scope.userInfo"]) {
- // 已授权
- console.log("已授权");
- GameDataCenter_1.default.plat.instance.hasAuthUserInfo = true;
- }
- }
- });
- });
- // })
- }
- });
- };
- PlatformTaoBao.prototype.dealQuery = function (res) {
- if (res.scene) {
- GameDataCenter_1.default.plat.queryparams.scene = res.scene;
- }
- var shareInfo = this.sdk.getShareInfo();
- if (shareInfo['inviter']) {
- GameDataCenter_1.default.plat.queryparams.inviter = shareInfo['inviter'];
- }
- if (shareInfo['sharer']) {
- GameDataCenter_1.default.plat.queryparams.sharer = shareInfo['sharer'];
- }
- EventMng_1.default.emit(EventConst_1.PlatEvent.ON_SCENE_CHANGED);
- };
- PlatformTaoBao.prototype.pay = function (orderId, order10cs, param) {
- my.tb.virtualTrade({
- itemId: param.productId,
- outOrderId: orderId,
- success: function (res) {
- // do something
- console.log("====== :", res);
- if (Config_1.default.paySuccAdokId != null) {
- clearInterval(Config_1.default.paySuccAdokId);
- Config_1.default.paySuccAdokId = null;
- }
- Config_1.default.paySuccAdokIndex = 0;
- Config_1.default.paySuccAdokId = setInterval(function () {
- Config_1.default.paySuccAdokIndex++;
- if (Config_1.default.paySuccAdokIndex >= 5) {
- clearInterval(Config_1.default.paySuccAdokId);
- Config_1.default.paySuccAdokId = null;
- }
- GameDataCenter_1.default.time.sendAdok();
- }, 1000);
- },
- fail: function (errData) {
- // do something
- console.log("======支付失败:", errData);
- UIHelp_1.default.ShowTips("支付失败");
- }
- });
- };
- // 打开客服窗口
- PlatformTaoBao.prototype.openService = function () {
- // 打开客服窗口
- if (my.tb.openMessage) {
- my.tb.openMessage({ sellerNick: "摩西游戏化旗舰店" });
- }
- };
- // showRewardAd(adId: string, kid: string, order11Id: string): void {
- // if (gameMethod.isEmpty(adId)) {
- // UIHelp.ShowTips("暂无广告配置")
- // return
- // }
- // // 获取任务控制器
- // let taskController = this.sdk.getTaskController({
- // materialId: '33002', //请找淘宝PD协助申请
- // materialCode: '6dZEr8Pk2xOTdGGIeUlUQUb' //请找淘宝PD协助申请
- // });
- // taskController.getTaskList()
- // .then(res => {
- // console.log("taskList:"+JSON.stringify(res))
- // let taskList = res.main
- // //找到对应的任务类型,直接触发
- // let targetTask = null;
- // for (let key in taskList) {
- // if (Object.prototype.hasOwnProperty.call(taskList, key)) {
- // let taskInfo = taskList[key];
- // if (taskInfo.consumeType == adId) {
- // targetTask = taskInfo
- // break;
- // }
- // }
- // }
- // if (targetTask != null) {
- // if (targetTask.count >= targetTask.maxCount) {
- // UIHelp.ShowTips("当前任务奖励已达领取上限")
- // return
- // }
- // taskController.executeTask(targetTask.id)
- // .then(res => {
- // this.AdXiaDanSuc = true;
- // console.log("executeTask succ:"+JSON.stringify(res))
- // })
- // .catch(err => {
- // UIHelp.ShowTips("淘宝任务执行异常")
- // console.log(err)
- // });
- // } else {
- // UIHelp.ShowTips("找不到对应的广告类型")
- // }
- // })
- // .catch(err => {
- // UIHelp.ShowTips("淘宝任务获取列表异常")
- // console.log(err)
- // });
- // }
- PlatformTaoBao.prototype.showRewardAd = function (adId, kid, order11Id) {
- var _this = this;
- if (gameMethod_1.gameMethod.isEmpty(adId)) {
- UIHelp_1.default.ShowTips(kid + "\u6682\u65E0\u5E7F\u544A\u914D\u7F6E");
- return;
- }
- // 小游戏
- if (gameMethod_1.gameMethod.isEmpty(this.RewardedVideoAd)) {
- this.RewardedVideoAd = my.createRewardedAd({ adUnitId: adId });
- }
- var isLoaded = true;
- // 按钮或者自定义事件触发
- var invoke = function () {
- if (isLoaded) {
- _this.RewardedVideoAd
- .show()
- .then(function () {
- console.log("广告显示成功");
- // 展示成功清除
- isLoaded = false;
- // this.RewardedVideoAd.offLoad(loadCallback)
- })
- .catch(function (err) {
- console.log("广告组件出现问题", err);
- // 再次重试加载一次
- _this.RewardedVideoAd
- .load()
- .then(function () {
- console.log("手动加载成功");
- invoke();
- });
- });
- }
- else {
- console.log('广告没加载完成');
- }
- };
- invoke();
- // const loadCallback = (res) => {
- // console.log('loadCallback:', res);
- // isLoaded = true;
- // invoke();
- // }
- // 完成广告回回调
- var completeCallback = function (res) {
- console.log('completeCallback', res);
- // this.AdXiaDanSuc = true;
- GameDataCenter_1.default.adVideo.onTaoBaoXiadanSucc();
- // 在合适的时机去释放监听
- // RewardedVideoAd.offLoad(loadCallback)
- // this.RewardedVideoAd.offComplete(completeCallback)
- // this.RewardedVideoAd.offClose(closeCallback)
- // this.RewardedVideoAd.offError(errorCallback)
- };
- // 完成广告或者未完成广告,关闭广告会回调
- var closeCallback = function (res) {
- console.warn('closeCallbak', res);
- };
- // 广告接口报错的回调
- var errorCallback = function (e) {
- console.error('errorCallback', e);
- };
- // 监听广告的事件
- // this.RewardedVideoAd.onLoad(loadCallback)
- this.RewardedVideoAd.onClose(closeCallback);
- this.RewardedVideoAd.onComplete(completeCallback);
- this.RewardedVideoAd.onError(errorCallback);
- };
- PlatformTaoBao.prototype.reportRoleData = function (actionName, type) {
- if (type === void 0) { type = 1; }
- if (type == 1) {
- try {
- this.sdk.reportExposure({ actionName: actionName });
- }
- catch (e) {
- console.error(e);
- }
- }
- else {
- try {
- this.sdk.reportClick({ actionName: actionName });
- }
- catch (e) {
- console.error(e);
- }
- }
- };
- //检测新人组件是否开启
- PlatformTaoBao.prototype.checkGameActivityController = function (cb) {
- if (gameMethod_1.gameMethod.isEmpty(this.gameActivityController)) {
- cb(false);
- }
- this.gameActivityController.getInfo().then(function (res) {
- console.log("checkGameActivityController res=>", res);
- // if (res.showModule) {
- // let params: UserSetZjPram = {
- // }
- // GameController.network.send(UserSetZj.url, params, (result: SevBack) => {
- // })
- // }
- cb(res.showModule);
- }).catch(function (err) {
- console.error("checkGameActivityController err:", err);
- });
- };
- //淘宝新人组件
- PlatformTaoBao.prototype.openGameActivityController = function () {
- var _this = this;
- if (gameMethod_1.gameMethod.isEmpty(this.gameActivityController)) {
- UIHelp_1.default.ShowTips("淘宝新人组件初始化失败");
- return;
- }
- // 释放监听
- this.gameActivityController.offViewClose(function () {
- });
- this.gameActivityController.getInfo().then(function (res) {
- console.log("getInfo=>", res);
- if (!gameMethod_1.gameMethod.isEmpty(_this.gameActivityController) && res.showModule) {
- _this.gameActivityController.openView().then(function (res) {
- console.log("openView=>", res);
- // 增加监听
- _this.gameActivityController.onViewClose(function () {
- });
- }).catch(function (err) {
- console.error("openGameActivityController err:", err);
- });
- }
- else {
- UIHelp_1.default.ShowTips("无法打开新人组件");
- }
- }).catch(function (err) {
- console.error(err);
- });
- };
- //淘宝用户关键行为上报
- PlatformTaoBao.prototype.reportUserAction = function (actionId) {
- console.log("reportUserAction actionId=>", actionId);
- this.sdk.reportScene({
- sceneId: 401,
- timestamp: Date.now(),
- costTime: 2000,
- extra: {
- raw: actionId
- }
- });
- };
- return PlatformTaoBao;
- }(PlatformBase_1.default));
- exports.default = PlatformTaoBao;
- 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvcGxhdC9QbGF0Zm9ybVRhb0Jhby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7O0dBR0c7QUFDSCxtREFBa0Q7QUFDbEQscUNBQTZEO0FBRTdELG9DQUErQjtBQUMvQix1REFBMkU7QUFDM0UscURBQXNHO0FBQ3RHLHlEQUFvRDtBQUNwRCxvREFBK0M7QUFDL0MsNkNBQXdDO0FBQ3hDLGdEQUEyQztBQUMzQywrQ0FBMEM7QUFDMUM7SUFBNEMsa0NBQVk7SUFJcEQ7UUFBQSxZQUNJLGlCQUFPLFNBd0dWO1FBdkdHLEtBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUEsS0FBSztRQUM5QixRQUFRO1FBQ1IsSUFBTSxRQUFRLEdBQUcsVUFBVSxHQUFHO1lBQzFCLDhDQUE4QztZQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUN4RCwwQkFBMEI7WUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUE7WUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUMzQiwwREFBMEQ7WUFDMUQsSUFBSTtZQUVKLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDbkIsd0JBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUE7WUFFbEMsZ0NBQWdDO1lBQ2hDLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQ2YsWUFBWSxFQUFFLElBQUk7YUFDckIsQ0FBQyxDQUFBO1lBRUYsa0JBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUN4QyxDQUFDLENBQUE7UUFDRCxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQUMsR0FBRztZQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDeEMsMEJBQTBCO1lBQzFCLCtCQUErQjtZQUMvQixrQ0FBa0M7WUFDbEMsZUFBZTtZQUNmLDBDQUEwQztZQUMxQyw4Q0FBOEM7WUFDOUMsc0NBQXNDO1lBQ3RDLFFBQVE7WUFDUixrQ0FBa0M7WUFDbEMsaURBQWlEO1lBQ2pELG9DQUFvQztZQUNwQyw4Q0FBOEM7WUFDOUMsa0RBQWtEO1lBQ2xELDBDQUEwQztZQUMxQyxZQUFZO1lBQ1osa0VBQWtFO1lBQ2xFLGVBQWU7WUFDZixJQUFJO1lBRUosS0FBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNuQix3QkFBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQTtZQUVsQyxnQ0FBZ0M7WUFDaEMsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDZixZQUFZLEVBQUUsSUFBSTthQUNyQixDQUFDLENBQUE7WUFFRixrQkFBUSxDQUFDLElBQUksQ0FBQyxzQkFBUyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsdUJBQXVCO1FBQ3ZCLElBQU0sWUFBWSxHQUFHLFVBQVUsR0FBRztZQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFBO1lBQ3hDLGtFQUFrRTtZQUNsRSxzQkFBc0I7WUFDdEIsd0JBQWMsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUE7WUFDckMsd0JBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDckMsQ0FBQyxDQUFBO1FBQ0QsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFDLEdBQUc7WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFBO1lBQ3hDLGtFQUFrRTtZQUNsRSxzQkFBc0I7WUFDdEIsd0JBQWMsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUE7WUFDckMsd0JBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFDSCw0QkFBNEI7UUFDNUIsV0FBVztRQUNYLHNDQUFzQztRQUV0QyxFQUFFLENBQUMsZUFBZSxDQUFDO1lBQ2YsWUFBWSxFQUFFLElBQUk7U0FDckIsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxFQUFFLENBQUMsZ0JBQWdCLEVBQUU7WUFDckIsSUFBTSxlQUFhLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFFM0MsZUFBYSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsR0FBRztnQkFDeEMsYUFBYTtnQkFDYixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUM5QixDQUFDLENBQUMsQ0FBQTtZQUVGLGVBQWEsQ0FBQyxhQUFhLENBQUM7Z0JBQ3hCLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ1AsS0FBSyxFQUFFLE1BQU07b0JBQ2IsT0FBTyxFQUFFLGtCQUFrQjtvQkFDM0IsT0FBTyxFQUFFLFVBQVUsR0FBRzt3QkFDbEIsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFOzRCQUNiLG9DQUFvQzs0QkFDcEMsZUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFBO3lCQUM5QjtvQkFDTCxDQUFDO2lCQUNKLENBQUMsQ0FBQTtZQUNOLENBQUMsQ0FBQyxDQUFBO1NBQ0w7UUFDRCxjQUFjO1FBQ2QsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFO1lBQ3pCLEtBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsZUFBZTtZQUNyRCxZQUFZO1lBQ1osS0FBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUM7Z0JBQzdELE9BQU8sRUFBRSxpQkFBaUI7YUFDN0IsQ0FBQyxDQUFDO1NBQ047O0lBQ0wsQ0FBQztJQUVELHNDQUFhLEdBQWI7UUFBQSxpQkEwSUM7UUF6SUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUMxQixrQkFBUSxDQUFDLElBQUksQ0FBQyxzQkFBUyxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDckQsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUNiLE9BQU8sRUFBRSxVQUFDLEdBQUc7Z0JBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBZSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBRyxDQUFDLENBQUM7Z0JBQ2xELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFNBQVMsRUFBRTtvQkFDOUIsd0JBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRywyQkFBZSxDQUFDLE9BQU8sQ0FBQztpQkFDbkU7cUJBQU07b0JBQ0gsd0JBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRywyQkFBZSxDQUFDLEdBQUcsQ0FBQztpQkFDL0Q7WUFDTCxDQUFDO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsK0JBQStCO1FBQy9CLGFBQWE7UUFDYixZQUFZO1FBQ1osK0RBQStEO1FBQy9ELGdDQUFnQztRQUNoQyw4QkFBOEI7UUFDOUIsMkJBQTJCO1FBQzNCLHlCQUF5QjtRQUN6Qix3QkFBd0I7UUFDeEIscUJBQXFCO1FBQ3JCLDZDQUE2QztRQUM3Qyw2REFBNkQ7UUFDN0QsVUFBVTtRQUNWLHdCQUF3QjtRQUN4Qiw2QkFBNkI7UUFDN0IsUUFBUTtRQUNSLElBQUk7UUFDSixFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ1QsTUFBTSxFQUFFLGdCQUFnQjtZQUN4QixPQUFPLEVBQUUsVUFBQyxHQUFRO2dCQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtnQkFDMUMsa0JBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQVMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2dCQUNyRCw2QkFBNkI7Z0JBQzdCLGlDQUFpQztnQkFDakMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7Z0JBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7Z0JBQ3ZCLElBQUksT0FBTyxHQUFHLEtBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLE1BQU0sR0FBb0I7b0JBQzFCLEdBQUcsRUFBRSxnQkFBTSxDQUFDLEdBQUc7b0JBQ2YsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDO2lCQUNoQixDQUFBO2dCQUNELHdCQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBVyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsVUFBQyxNQUFlO29CQUNqRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO29CQUNyQixrQkFBUSxDQUFDLElBQUksQ0FBQyxzQkFBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7b0JBQ2xELElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTt3QkFDckMsS0FBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQTt3QkFDcEMsS0FBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTt3QkFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO3dCQUVsQyxZQUFZO3dCQUNaLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQTt3QkFDaEIsZ0NBQWdDO3dCQUNoQyx5Q0FBeUM7d0JBQ3pDLCtDQUErQzt3QkFDL0MseUNBQXlDO3dCQUN6QyxRQUFRO3dCQUNSLElBQUk7d0JBQ0osS0FBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtxQkFDdEI7eUJBQU07d0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO3dCQUNyQyxJQUFJLHVCQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSx1QkFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUN6RSx3QkFBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO3lCQUNsRTtxQkFDSjtvQkFDRCxXQUFXO29CQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7b0JBQ3ZCLEVBQUUsQ0FBQyxVQUFVLENBQUM7d0JBQ1YsaUJBQWlCLEVBQUUsSUFBSTt3QkFDdkIsT0FBTyxZQUFDLEdBQUc7NEJBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUE7NEJBQ2hDLElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7Z0NBQ3RELE1BQU07Z0NBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQ0FDbEIsd0JBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7NkJBQ3REO3dCQUNMLENBQUM7cUJBQ0osQ0FBQyxDQUFBO2dCQUNOLENBQUMsQ0FBQyxDQUFBO2dCQUNGLEtBQUs7WUFFVCxDQUFDO1lBQ0QsSUFBSSxFQUFFLFVBQUMsR0FBUTtnQkFDWCwrQ0FBK0M7Z0JBQy9DLGtCQUFRLENBQUMsSUFBSSxDQUFDLHNCQUFTLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtnQkFDckQsNkJBQTZCO2dCQUM3QixpQ0FBaUM7Z0JBQ2pDLDBDQUEwQztnQkFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtnQkFDdkIsSUFBSSxPQUFPLEdBQUcsS0FBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ25DLElBQUksTUFBTSxHQUFvQjtvQkFDMUIsR0FBRyxFQUFFLGdCQUFNLENBQUMsR0FBRztvQkFDZixLQUFLLEVBQUUsRUFBRTtpQkFDWixDQUFBO2dCQUNELHdCQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBVyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsVUFBQyxNQUFlO29CQUNqRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO29CQUNyQixrQkFBUSxDQUFDLElBQUksQ0FBQyxzQkFBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7b0JBQ2xELElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTt3QkFDckMsS0FBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQTt3QkFDcEMsS0FBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTt3QkFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO3dCQUVsQyxZQUFZO3dCQUNaLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQTt3QkFDaEIsZ0NBQWdDO3dCQUNoQyx5Q0FBeUM7d0JBQ3pDLCtDQUErQzt3QkFDL0MseUNBQXlDO3dCQUN6QyxRQUFRO3dCQUNSLElBQUk7d0JBQ0osS0FBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtxQkFDdEI7eUJBQU07d0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO3dCQUNyQyxJQUFJLHVCQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSx1QkFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUN6RSx3QkFBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO3lCQUNsRTtxQkFDSjtvQkFDRCxXQUFXO29CQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7b0JBQ3ZCLEVBQUUsQ0FBQyxVQUFVLENBQUM7d0JBQ1YsaUJBQWlCLEVBQUUsSUFBSTt3QkFDdkIsT0FBTyxZQUFDLEdBQUc7NEJBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUE7NEJBQ2hDLElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7Z0NBQ3RELE1BQU07Z0NBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQ0FDbEIsd0JBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7NkJBQ3REO3dCQUNMLENBQUM7cUJBQ0osQ0FBQyxDQUFBO2dCQUNOLENBQUMsQ0FBQyxDQUFBO2dCQUNGLEtBQUs7WUFDVCxDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGtDQUFTLEdBQWpCLFVBQWtCLEdBQUc7UUFDakIsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFO1lBQ1gsd0JBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFBO1NBQ3BEO1FBQ0QsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN0Qix3QkFBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtTQUNqRTtRQUNELElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JCLHdCQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1NBQy9EO1FBQ0Qsa0JBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFFRCw0QkFBRyxHQUFILFVBQUksT0FBZSxFQUFFLFNBQWlCLEVBQUUsS0FBc0I7UUFDMUQsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDZixNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVM7WUFDdkIsVUFBVSxFQUFFLE9BQU87WUFDbkIsT0FBTyxZQUFDLEdBQUc7Z0JBQ1AsZUFBZTtnQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQTtnQkFDNUIsSUFBSSxnQkFBTSxDQUFDLGFBQWEsSUFBSSxJQUFJLEVBQUU7b0JBQzlCLGFBQWEsQ0FBQyxnQkFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO29CQUNuQyxnQkFBTSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7aUJBQzlCO2dCQUNELGdCQUFNLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO2dCQUMzQixnQkFBTSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7b0JBQy9CLGdCQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtvQkFDekIsSUFBSSxnQkFBTSxDQUFDLGdCQUFnQixJQUFJLENBQUMsRUFBRTt3QkFDOUIsYUFBYSxDQUFDLGdCQUFNLENBQUMsYUFBYSxDQUFDLENBQUE7d0JBQ25DLGdCQUFNLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtxQkFDOUI7b0JBQ0Qsd0JBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7Z0JBQ2xDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNaLENBQUM7WUFDRCxJQUFJLFlBQUMsT0FBTztnQkFDUixlQUFlO2dCQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2dCQUNuQyxnQkFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUMzQixDQUFDO1NBQ0osQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELFNBQVM7SUFDVCxvQ0FBVyxHQUFYO1FBQ0ksU0FBUztRQUNULElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDbkIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtTQUNoRDtJQUNMLENBQUM7SUFFRCxxRUFBcUU7SUFDckUsc0NBQXNDO0lBQ3RDLG9DQUFvQztJQUNwQyxpQkFBaUI7SUFDakIsUUFBUTtJQUNSLGlCQUFpQjtJQUNqQix3REFBd0Q7SUFDeEQsNENBQTRDO0lBQzVDLCtEQUErRDtJQUMvRCxVQUFVO0lBQ1YsbUNBQW1DO0lBQ25DLHFCQUFxQjtJQUNyQix1REFBdUQ7SUFDdkQsa0NBQWtDO0lBQ2xDLDJCQUEyQjtJQUMzQixpQ0FBaUM7SUFDakMsc0NBQXNDO0lBQ3RDLHlFQUF5RTtJQUN6RSxnREFBZ0Q7SUFDaEQsc0RBQXNEO0lBQ3RELDRDQUE0QztJQUM1Qyw2QkFBNkI7SUFDN0Isb0JBQW9CO0lBQ3BCLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osb0NBQW9DO0lBQ3BDLDZEQUE2RDtJQUM3RCxrREFBa0Q7SUFDbEQseUJBQXlCO0lBQ3pCLGdCQUFnQjtJQUNoQix3REFBd0Q7SUFDeEQsNkJBQTZCO0lBQzdCLDJDQUEyQztJQUMzQyx1RUFBdUU7SUFDdkUsaUJBQWlCO0lBQ2pCLDhCQUE4QjtJQUM5Qiw4Q0FBOEM7SUFDOUMsbUNBQW1DO0lBQ25DLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsNENBQTRDO0lBQzVDLFlBQVk7SUFDWixTQUFTO0lBQ1Qsc0JBQXNCO0lBQ3RCLHdDQUF3QztJQUN4QywyQkFBMkI7SUFDM0IsVUFBVTtJQUNWLElBQUk7SUFFSixxQ0FBWSxHQUFaLFVBQWEsSUFBWSxFQUFFLEdBQVcsRUFBRSxTQUFpQjtRQUF6RCxpQkFrRUM7UUFqRUcsSUFBSSx1QkFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQixnQkFBTSxDQUFDLFFBQVEsQ0FBSSxHQUFHLHlDQUFRLENBQUMsQ0FBQTtZQUMvQixPQUFNO1NBQ1Q7UUFDRCxNQUFNO1FBQ04sSUFBSSx1QkFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNsRTtRQUVELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztRQUNwQixjQUFjO1FBQ2QsSUFBTSxNQUFNLEdBQUc7WUFDWCxJQUFJLFFBQVEsRUFBRTtnQkFDVixLQUFJLENBQUMsZUFBZTtxQkFDZixJQUFJLEVBQUU7cUJBQ04sSUFBSSxDQUFDO29CQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3RCLFVBQVU7b0JBQ1YsUUFBUSxHQUFHLEtBQUssQ0FBQTtvQkFDaEIsNkNBQTZDO2dCQUNqRCxDQUFDLENBQUM7cUJBQ0QsS0FBSyxDQUFDLFVBQUMsR0FBRztvQkFDUCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDN0IscUJBQXFCO29CQUNyQixLQUFJLENBQUMsZUFBZTt5QkFDZixJQUFJLEVBQUU7eUJBQ04sSUFBSSxDQUFDO3dCQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3RCLE1BQU0sRUFBRSxDQUFBO29CQUNaLENBQUMsQ0FBQyxDQUFDO2dCQUNYLENBQUMsQ0FBQyxDQUFBO2FBQ1Q7aUJBQU07Z0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUMxQjtRQUNMLENBQUMsQ0FBQTtRQUNELE1BQU0sRUFBRSxDQUFDO1FBQ1Qsa0NBQWtDO1FBQ2xDLHlDQUF5QztRQUN6Qyx1QkFBdUI7UUFDdkIsZ0JBQWdCO1FBQ2hCLElBQUk7UUFDSixZQUFZO1FBQ1osSUFBTSxnQkFBZ0IsR0FBRyxVQUFDLEdBQUc7WUFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNyQywyQkFBMkI7WUFDM0Isd0JBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QyxjQUFjO1lBQ2Qsd0NBQXdDO1lBQ3hDLHFEQUFxRDtZQUNyRCwrQ0FBK0M7WUFDL0MsK0NBQStDO1FBQ25ELENBQUMsQ0FBQTtRQUNELHdCQUF3QjtRQUN4QixJQUFNLGFBQWEsR0FBRyxVQUFDLEdBQUc7WUFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDckMsQ0FBQyxDQUFBO1FBQ0QsYUFBYTtRQUNiLElBQU0sYUFBYSxHQUFHLFVBQUMsQ0FBQztZQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNyQyxDQUFDLENBQUE7UUFDRCxVQUFVO1FBQ1YsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQzNDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDakQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUNELHVDQUFjLEdBQWQsVUFBZSxVQUFrQixFQUFFLElBQWdCO1FBQWhCLHFCQUFBLEVBQUEsUUFBZ0I7UUFDL0MsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO1lBQ1gsSUFBSTtnQkFDQSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO2FBQ3ZEO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNwQjtTQUNKO2FBQU07WUFDSCxJQUFJO2dCQUNBLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7YUFDcEQ7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDUixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BCO1NBQ0o7SUFHTCxDQUFDO0lBQ0QsWUFBWTtJQUNaLG9EQUEyQixHQUEzQixVQUE0QixFQUEyQjtRQUNuRCxJQUFJLHVCQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ2pELEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtTQUNaO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFDLEdBQUc7WUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUNyRCx3QkFBd0I7WUFDeEIsb0NBQW9DO1lBQ3BDLFFBQVE7WUFDUixnRkFBZ0Y7WUFFaEYsU0FBUztZQUNULElBQUk7WUFDSixFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3RCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFDLEdBQUc7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNELFFBQVE7SUFDUixtREFBMEIsR0FBMUI7UUFBQSxpQkEyQkM7UUExQkcsSUFBSSx1QkFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRTtZQUNqRCxnQkFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUM5QixPQUFNO1NBQ1Q7UUFDRCxPQUFPO1FBQ1AsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQztRQUV6QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQyxHQUFHO1lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyx1QkFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO2dCQUNwRSxLQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUMsR0FBRztvQkFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQy9CLE9BQU87b0JBQ1AsS0FBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQztvQkFFeEMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQUMsR0FBRztvQkFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDLENBQUMsQ0FBQzthQUNOO2lCQUFNO2dCQUNILGdCQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFBO2FBQzlCO1FBQ0wsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQUMsR0FBRztZQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0QsWUFBWTtJQUNaLHlDQUFnQixHQUFoQixVQUFpQixRQUFnQjtRQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO1lBQ2pCLE9BQU8sRUFBRSxHQUFHO1lBQ1osU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUU7Z0JBQ0gsR0FBRyxFQUFFLFFBQVE7YUFDaEI7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0wscUJBQUM7QUFBRCxDQS9lQSxBQStlQyxDQS9lMkMsc0JBQVksR0ErZXZEIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG7muLjmiI/lkI3np7A66YCN6YGl5LuZ77yI5reY5a6d77yJXG7lsI/nqIvluo9JRDpcbiAqL1xuaW1wb3J0IHsgZ2FtZU1ldGhvZCB9IGZyb20gXCIuLi9jb21tb24vZ2FtZU1ldGhvZFwiO1xuaW1wb3J0IHsgUGxheWVyTG9naW4sIFBsYXllckxvZ2luUHJhbSB9IGZyb20gXCIuLi9jb21tb24vWHljXCI7XG5pbXBvcnQgeyBTZXZCYWNrIH0gZnJvbSBcIi4uL2NvbW1vbi9YeXNcIjtcbmltcG9ydCBDb25maWcgZnJvbSBcIi4uL0NvbmZpZ1wiO1xuaW1wb3J0IHsgR2FtZUV2ZW50LCBMb2FkRXZlbnQsIFBsYXRFdmVudCB9IGZyb20gXCIuLi9kYXRhL2NvbnN0L0V2ZW50Q29uc3RcIjtcbmltcG9ydCB7IEFEX1ZJREVPX0tFWSwgR2FtZUVyckNvZGUsIFBheVByb2R1Y3RQYXJhbSwgUGxhdEZvcm1EZXZUeXBlIH0gZnJvbSBcIi4uL2RhdGEvY29uc3QvVHlwZUNvbnN0XCI7XG5pbXBvcnQgR2FtZURhdGFDZW50ZXIgZnJvbSBcIi4uL2RhdGEvR2FtZURhdGFDZW50ZXJcIjtcbmltcG9ydCBHYW1lQ29udHJvbGxlciBmcm9tIFwiLi4vR2FtZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBVSUhlbHAgZnJvbSBcIi4uL2xvZ2ljL3VpL1VJSGVscFwiO1xuaW1wb3J0IEV2ZW50TW5nIGZyb20gXCIuLi9tYW5hZ2VyL0V2ZW50TW5nXCI7XG5pbXBvcnQgUGxhdGZvcm1CYXNlIGZyb20gXCIuL1BsYXRmb3JtQmFzZVwiO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGxhdGZvcm1UYW9CYW8gZXh0ZW5kcyBQbGF0Zm9ybUJhc2Uge1xuICAgIHNkazogYW55O1xuICAgIGdhbWVBY3Rpdml0eUNvbnRyb2xsZXI6IGFueTtcbiAgICBSZXdhcmRlZFZpZGVvQWQ6IGFueTtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLkFkWGlhRGFuU3VjID0gZmFsc2U7Ly/liJ3lp4vljJZcbiAgICAgICAgLy8g5YiH5o2i5Yiw5YmN5Y+wXG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCItLS0tLXRiLm9uU2hvdyDlm57osIPop6blj5ExMTE6XCIsIHJlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiLS0tLS10Yi5vblNob3cg5Zue6LCD6Kem5Y+RMjIyOlwiLCB0aGlzLkFkWGlhRGFuU3VjKVxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuQWRYaWFEYW5TdWMpIHtcbiAgICAgICAgICAgIHRoaXMuQWRYaWFEYW5TdWMgPSBmYWxzZVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmnInlub/lkYrku7vliqHvvIzlj5HotbflpZblirHor7fmsYJcIilcbiAgICAgICAgICAgIC8vIEdhbWVEYXRhQ2VudGVyLmFkVmlkZW8ub25UYW9CYW9YaWFkYW5TdWNjKCkgLy8g5ZCR5pyN5Yqh56uv6K+35rGC5aWW5YqxXG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIHRoaXMuZGVhbFF1ZXJ5KHJlcylcbiAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLmF1ZGlvLnJlc3VtZU11c2ljKClcblxuICAgICAgICAgICAgLy8gSU9T57O757ufLOWcqOWQjuWPsOWIh+WbnuaXtuS8vOS5juWbnuWkseWOu+W4uOS6ruWKn+iDvSzov5nph4zlho3osIPnlKjkuIDmrKFcbiAgICAgICAgICAgIG15LnNldEtlZXBTY3JlZW5Pbih7XG4gICAgICAgICAgICAgICAga2VlcFNjcmVlbk9uOiB0cnVlXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBFdmVudE1uZy5lbWl0KEdhbWVFdmVudC5PTl9TSE9XX0FQUClcbiAgICAgICAgfVxuICAgICAgICBteS5vblNob3coKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCItLS0tLXRiLm9uU2hvdyDlm57osIPop6blj5E6XCIsIHJlcylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLkFkWGlhRGFuU3VjKSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5BZFhpYURhblN1YyA9IGZhbHNlXG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCLmnInlub/lkYrku7vliqHvvIzlj5HotbflpZblirHor7fmsYJcIilcbiAgICAgICAgICAgIC8vICAgICAvL+i/nue7reivt+axgjXmrKFcbiAgICAgICAgICAgIC8vICAgICBpZiAoQ29uZmlnLnBheVN1Y2NBZG9rSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gICAgICAgICBjbGVhckludGVydmFsKENvbmZpZy5wYXlTdWNjQWRva0lkKVxuICAgICAgICAgICAgLy8gICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IG51bGxcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXggPSAwXG4gICAgICAgICAgICAvLyAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0luZGV4KytcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYgKENvbmZpZy5wYXlTdWNjQWRva0luZGV4ID49IDUpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoQ29uZmlnLnBheVN1Y2NBZG9rSWQpXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IG51bGxcbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgICAgICBHYW1lRGF0YUNlbnRlci5hZFZpZGVvLm9uVGFvQmFvWGlhZGFuU3VjYygpIC8vIOWQkeacjeWKoeerr+ivt+axguWlluWKsVxuICAgICAgICAgICAgLy8gICAgIH0sIDEwMDApXG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIHRoaXMuZGVhbFF1ZXJ5KHJlcylcbiAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLmF1ZGlvLnJlc3VtZU11c2ljKClcblxuICAgICAgICAgICAgLy8gSU9T57O757ufLOWcqOWQjuWPsOWIh+WbnuaXtuS8vOS5juWbnuWkseWOu+W4uOS6ruWKn+iDvSzov5nph4zlho3osIPnlKjkuIDmrKFcbiAgICAgICAgICAgIG15LnNldEtlZXBTY3JlZW5Pbih7XG4gICAgICAgICAgICAgICAga2VlcFNjcmVlbk9uOiB0cnVlXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBFdmVudE1uZy5lbWl0KEdhbWVFdmVudC5PTl9TSE9XX0FQUClcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG15Lm9mZlNob3cobGlzdGVuZXIpXG4gICAgICAgIGNvbnN0IGhpZGVMaXN0ZW5lciA9IGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiLS0tLS10Yi5vbkhpZGUg5Zue6LCD6Kem5Y+ROlwiLCByZXMpXG4gICAgICAgICAgICAvLyBHYW1lRGF0YUNlbnRlci5wbGF0Lmluc3RhbmNlLnJlcG9ydFJvbGUoUmVwb3J0Um9sZVR5cGUub2ZmbGluZSlcbiAgICAgICAgICAgIC8vIHRoaXMuZGVhbFF1ZXJ5KHJlcylcbiAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLmF1ZGlvLnN0b3BBbGxFZmZlY3RzKClcbiAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLmF1ZGlvLnBhdXNlTXVzaWMoKVxuICAgICAgICB9XG4gICAgICAgIG15Lm9uSGlkZSgocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIi0tLS0tdGIub25IaWRlIOWbnuiwg+inpuWPkTpcIiwgcmVzKVxuICAgICAgICAgICAgLy8gR2FtZURhdGFDZW50ZXIucGxhdC5pbnN0YW5jZS5yZXBvcnRSb2xlKFJlcG9ydFJvbGVUeXBlLm9mZmxpbmUpXG4gICAgICAgICAgICAvLyB0aGlzLmRlYWxRdWVyeShyZXMpXG4gICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5hdWRpby5zdG9wQWxsRWZmZWN0cygpXG4gICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5hdWRpby5wYXVzZU11c2ljKClcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG15Lm9mZkhpZGUoaGlkZUxpc3RlbmVyKTtcbiAgICAgICAgLy/or6Xmlrnms5XkuI3mlK/mjIFpZGVcbiAgICAgICAgLy8gbXkuc2V0UHJlZmVycmVkRnJhbWVzUGVyU2Vjb25kKDMwKTtcblxuICAgICAgICBteS5zZXRLZWVwU2NyZWVuT24oe1xuICAgICAgICAgICAga2VlcFNjcmVlbk9uOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChteS5nZXRVcGRhdGVNYW5hZ2VyKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVNYW5hZ2VyID0gbXkuZ2V0VXBkYXRlTWFuYWdlcigpXG5cbiAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIub25DaGVja0ZvclVwZGF0ZShmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgLy/or7fmsYLlrozmlrDniYjmnKzkv6Hmga/nmoTlm57osINcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMuaGFzVXBkYXRlKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5vblVwZGF0ZVJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBteS5jb25maXJtKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmm7TmlrDmj5DnpLonLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiAn5paw54mI5pys5bey57uP5YeG5aSH5aW977yM5piv5ZCm6YeN5ZCv5bqU55So77yfJyxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5jb25maXJtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5paw55qE54mI5pys5bey57uP5LiL6L295aW977yM6LCD55SoIGFwcGx5VXBkYXRlIOW6lOeUqOaWsOeJiOacrOW5tumHjeWQr1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIuYXBwbHlVcGRhdGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgLy8g5Yid5aeL5YyW5bm26I635Y+Wc2Rr5a6e5L6LXG4gICAgICAgIGlmIChteS50Yi5nZXRJbnRlcmFjdGl2ZVNESykge1xuICAgICAgICAgICAgdGhpcy5zZGsgPSBteS50Yi5nZXRJbnRlcmFjdGl2ZVNESygpOyAvL+iwg+eUqOatpOWHveaVsOWNs+WPr+WIneWni+WMllNES1xuICAgICAgICAgICAgLy8g6I635Y+W6L+Q6JCl5rS75Yqo5o6n5Yi25ZmoXG4gICAgICAgICAgICB0aGlzLmdhbWVBY3Rpdml0eUNvbnRyb2xsZXIgPSB0aGlzLnNkay5nZXRHYW1lQWN0aXZpdHlDb250cm9sbGVyKHtcbiAgICAgICAgICAgICAgICBiaXpDb2RlOiAneGlhb3lhb3hpYW5uZXcxJywvL+ivt+eUs+ivt1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93TG9naW5WaWV3KCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZyhcIua3mOWuneWwj+a4uOaIj+W5s+WPsOmdmem7mOeZu+W9lVwiKVxuICAgICAgICBFdmVudE1uZy5lbWl0KExvYWRFdmVudC5MT0FEX1BST0dSRVNTLCAwLjI1LCBcImxvZ2luXCIpXG4gICAgICAgIG15LmdldFN5c3RlbUluZm8oe1xuICAgICAgICAgICAgc3VjY2VzczogKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBzeXN0ZW1JbmZvOiAke0pTT04uc3RyaW5naWZ5KHJlcyl9YCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc1tcInBsYXRmb3JtXCJdID09IFwiQW5kcm9pZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnBsYXQuaW5zdGFuY2UuZGV2aWNlT1MgPSBQbGF0Rm9ybURldlR5cGUuYW5kcm9pZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5wbGF0Lmluc3RhbmNlLmRldmljZU9TID0gUGxhdEZvcm1EZXZUeXBlLmlvcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbiBHZXRPcGVuSWQoKSB7XG4gICAgICAgIC8vIGxldCByZXN1bHRcbiAgICAgICAgLy8gICAgIHRyeSB7XG4gICAgICAgIC8vICAgICByZXN1bHQgPSBhd2FpdCB3aW5kb3dbJ2Nsb3VkJ10uYXBwbGljYXRpb24uaHR0cFJlcXVlc3Qoe1xuICAgICAgICAvLyAgICAgICAgIC8v5LiN6ZyA6KaB5a6M5pW05Z+f5ZCN77yM5Y+q6ZyA6KaB5o6l5Y+j6K6/6Zeu6Lev5b6E5Y2z5Y+vXG4gICAgICAgIC8vICAgICAgICAgJ3BhdGgnOiAnL3dlbGNvbWUnLFxuICAgICAgICAvLyAgICAgICAgICdtZXRob2QnOiAnR0VUJyxcbiAgICAgICAgLy8gICAgICAgICAnaGVhZGVycyc6IHt9LFxuICAgICAgICAvLyAgICAgICAgICdwYXJhbXMnOiB7fSxcbiAgICAgICAgLy8gICAgICAgICAnYm9keSc6e30sXG4gICAgICAgIC8vICAgICAgICAgLy9jbG91ZEFwcElk5aGr5YaZ5byA5ZCv5pys5Zyw6LCD6K+V55qE5LqR5bqU55SoSUQs5ZCm5YiZ5Lya6LCD5Yiw5LqR56uvXG4gICAgICAgIC8vICAgICAgICAgJ2V4dHMnOiB7IFwiY2xvdWRBcHBJZFwiOiBcIjU1MDg4XCIsIFwidGltZW91dFwiOiA0MDAwIH1cbiAgICAgICAgLy8gICAgIH0pO1xuICAgICAgICAvLyAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICBteS5hdXRob3JpemUoe1xuICAgICAgICAgICAgc2NvcGVzOiAnc2NvcGUudXNlckluZm8nLFxuICAgICAgICAgICAgc3VjY2VzczogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmt5jlrp3mjojmnYPvvJpcIiArIEpTT04uc3RyaW5naWZ5KHJlcykpXG4gICAgICAgICAgICAgICAgRXZlbnRNbmcuZW1pdChMb2FkRXZlbnQuTE9BRF9QUk9HUkVTUywgMC43NSwgXCJsb2dpblwiKVxuICAgICAgICAgICAgICAgIC8vIEdldE9wZW5JZCgpLnRoZW4ocmVzID0+IHsgXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJvcGVuSWQgPT0gXCIscmVzKSBcbiAgICAgICAgICAgICAgICBsZXQgY29kZSA9IHJlcy5hY2Nlc3NUb2tlbi5hY2Nlc3NUb2tlbjtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIua3mOWunemdmem7mOeZu+W9leaIkOWKn1wiKVxuICAgICAgICAgICAgICAgIGxldCB0YWdJbmZvID0gdGhpcy5zZGsuZ2V0Q2hhbm5lbFRhZygpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDaGFubmVsVGFnJywgdGFnSW5mbyk7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtczogUGxheWVyTG9naW5QcmFtID0ge1xuICAgICAgICAgICAgICAgICAgICBwaWQ6IENvbmZpZy5waWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtOiBbY29kZV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgR2FtZUNvbnRyb2xsZXIubmV0d29yay5zZW5kKFBsYXllckxvZ2luLnVybCwgcGFyYW1zLCAocmVzdWx0OiBTZXZCYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO5q616aqM6K+B6L+U5ZueXCIpXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50TW5nLmVtaXQoTG9hZEV2ZW50LkxPQURfUFJPR1JFU1MsIDEsIFwibG9naW5cIilcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC50eXBlID09IDEgJiYgcmVzdWx0LnBsYXRCYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5JZCA9IHJlc3VsdC5wbGF0QmFjay5vcGVuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9naW5QYXJhbXMgPSBbcmVzdWx0LnBsYXRCYWNrLnRva2VuLCBKU09OLnN0cmluZ2lmeSh0YWdJbmZvKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO56uv6aqM6K+B5oiQ5YqfXCIsIHRoaXMub3BlbklkKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bpgoDor7fogIV1dWlkXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW52aXRlciA9IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh3eC5nZXRFbnRlck9wdGlvbnNTeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IG9iaiA9IHd4LmdldEVudGVyT3B0aW9uc1N5bmMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmIChvYmoucXVlcnkgJiYgb2JqLnF1ZXJ5WydpbnZpdGVyJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgaW52aXRlciA9IG9iai5xdWVyeVsnaW52aXRlciddXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dpbihpbnZpdGVyKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJQbGF5ZXJMb2dpbi51cmwg6L+U5Zue5pWw5o2u5byC5bi4XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHJlc3VsdC53aW4pIHx8IGdhbWVNZXRob2QuaXNFbXB0eShyZXN1bHQud2luLm1zZ091dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5wbGF0LnNob3dFcnJEaWFsb2coR2FtZUVyckNvZGUuZXJyR2FtZVBsYXRMb2dpbilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bnlKjmiLforr7nva7kv6Hmga9cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bnlKjmiLforr7nva7kv6Hmga9cIilcbiAgICAgICAgICAgICAgICAgICAgbXkuZ2V0U2V0dGluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aXRoU3Vic2NyaXB0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bnlKjmiLforr7nva7kv6Hmga8g5Zue6LCDOlwiLCByZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5hdXRoU2V0dGluZyAmJiByZXMuYXV0aFNldHRpbmdbXCJzY29wZS51c2VySW5mb1wiXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDlt7LmjojmnYNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlt7LmjojmnYNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIucGxhdC5pbnN0YW5jZS5oYXNBdXRoVXNlckluZm8gPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLy8gfSlcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhaWw6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFVJSGVscC5TaG93VGlwcyhcIuaOiOadg+Wksei0pe+8jOivt+eCueWHu+WPs+S4iuinkueahOS4ieS4queCue+8jOW8gOWQr+aOiOadg+WQjumHjeaWsOeZu+W9lVwiKVxuICAgICAgICAgICAgICAgIEV2ZW50TW5nLmVtaXQoTG9hZEV2ZW50LkxPQURfUFJPR1JFU1MsIDAuNzUsIFwibG9naW5cIilcbiAgICAgICAgICAgICAgICAvLyBHZXRPcGVuSWQoKS50aGVuKHJlcyA9PiB7IFxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwib3BlbklkID09IFwiLHJlcykgXG4gICAgICAgICAgICAgICAgLy8gbGV0IGNvZGUgPSByZXMuYWNjZXNzVG9rZW4uYWNjZXNzVG9rZW47XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmt5jlrp3pnZnpu5jnmbvlvZXmiJDlip9cIilcbiAgICAgICAgICAgICAgICBsZXQgdGFnSW5mbyA9IHRoaXMuc2RrLmdldENoYW5uZWxUYWcoKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ2hhbm5lbFRhZycsIHRhZ0luZm8pO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbXM6IFBsYXllckxvZ2luUHJhbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcGlkOiBDb25maWcucGlkLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbTogW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgR2FtZUNvbnRyb2xsZXIubmV0d29yay5zZW5kKFBsYXllckxvZ2luLnVybCwgcGFyYW1zLCAocmVzdWx0OiBTZXZCYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO5q616aqM6K+B6L+U5ZueXCIpXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50TW5nLmVtaXQoTG9hZEV2ZW50LkxPQURfUFJPR1JFU1MsIDEsIFwibG9naW5cIilcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC50eXBlID09IDEgJiYgcmVzdWx0LnBsYXRCYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5JZCA9IHJlc3VsdC5wbGF0QmFjay5vcGVuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9naW5QYXJhbXMgPSBbcmVzdWx0LnBsYXRCYWNrLnRva2VuLCBKU09OLnN0cmluZ2lmeSh0YWdJbmZvKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO56uv6aqM6K+B5oiQ5YqfXCIsIHRoaXMub3BlbklkKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bpgoDor7fogIV1dWlkXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW52aXRlciA9IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh3eC5nZXRFbnRlck9wdGlvbnNTeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IG9iaiA9IHd4LmdldEVudGVyT3B0aW9uc1N5bmMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmIChvYmoucXVlcnkgJiYgb2JqLnF1ZXJ5WydpbnZpdGVyJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgaW52aXRlciA9IG9iai5xdWVyeVsnaW52aXRlciddXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dpbihpbnZpdGVyKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJQbGF5ZXJMb2dpbi51cmwg6L+U5Zue5pWw5o2u5byC5bi4XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHJlc3VsdC53aW4pIHx8IGdhbWVNZXRob2QuaXNFbXB0eShyZXN1bHQud2luLm1zZ091dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5wbGF0LnNob3dFcnJEaWFsb2coR2FtZUVyckNvZGUuZXJyR2FtZVBsYXRMb2dpbilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bnlKjmiLforr7nva7kv6Hmga9cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bnlKjmiLforr7nva7kv6Hmga9cIilcbiAgICAgICAgICAgICAgICAgICAgbXkuZ2V0U2V0dGluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aXRoU3Vic2NyaXB0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bnlKjmiLforr7nva7kv6Hmga8g5Zue6LCDOlwiLCByZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5hdXRoU2V0dGluZyAmJiByZXMuYXV0aFNldHRpbmdbXCJzY29wZS51c2VySW5mb1wiXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDlt7LmjojmnYNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlt7LmjojmnYNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIucGxhdC5pbnN0YW5jZS5oYXNBdXRoVXNlckluZm8gPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLy8gfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFsUXVlcnkocmVzKSB7XG4gICAgICAgIGlmIChyZXMuc2NlbmUpIHtcbiAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnBsYXQucXVlcnlwYXJhbXMuc2NlbmUgPSByZXMuc2NlbmVcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2hhcmVJbmZvID0gdGhpcy5zZGsuZ2V0U2hhcmVJbmZvKCk7XG4gICAgICAgIGlmIChzaGFyZUluZm9bJ2ludml0ZXInXSkge1xuICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIucGxhdC5xdWVyeXBhcmFtcy5pbnZpdGVyID0gc2hhcmVJbmZvWydpbnZpdGVyJ11cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hhcmVJbmZvWydzaGFyZXInXSkge1xuICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIucGxhdC5xdWVyeXBhcmFtcy5zaGFyZXIgPSBzaGFyZUluZm9bJ3NoYXJlciddXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnRNbmcuZW1pdChQbGF0RXZlbnQuT05fU0NFTkVfQ0hBTkdFRClcbiAgICB9XG5cbiAgICBwYXkob3JkZXJJZDogc3RyaW5nLCBvcmRlcjEwY3M6IHN0cmluZywgcGFyYW06IFBheVByb2R1Y3RQYXJhbSk6IHZvaWQge1xuICAgICAgICBteS50Yi52aXJ0dWFsVHJhZGUoe1xuICAgICAgICAgICAgaXRlbUlkOiBwYXJhbS5wcm9kdWN0SWQsXG4gICAgICAgICAgICBvdXRPcmRlcklkOiBvcmRlcklkLFxuICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmdcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIj09PT09PSA6XCIsIHJlcylcbiAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLnBheVN1Y2NBZG9rSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKENvbmZpZy5wYXlTdWNjQWRva0lkKVxuICAgICAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXggPSAwXG4gICAgICAgICAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0luZGV4KytcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5wYXlTdWNjQWRva0luZGV4ID49IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoQ29uZmlnLnBheVN1Y2NBZG9rSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBHYW1lRGF0YUNlbnRlci50aW1lLnNlbmRBZG9rKClcbiAgICAgICAgICAgICAgICB9LCAxMDAwKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhaWwoZXJyRGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIGRvIHNvbWV0aGluZ1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiPT09PT095pSv5LuY5aSx6LSlOlwiLCBlcnJEYXRhKVxuICAgICAgICAgICAgICAgIFVJSGVscC5TaG93VGlwcyhcIuaUr+S7mOWksei0pVwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8vIOaJk+W8gOWuouacjeeql+WPo1xuICAgIG9wZW5TZXJ2aWNlKCkge1xuICAgICAgICAvLyDmiZPlvIDlrqLmnI3nqpflj6NcbiAgICAgICAgaWYgKG15LnRiLm9wZW5NZXNzYWdlKSB7XG4gICAgICAgICAgICBteS50Yi5vcGVuTWVzc2FnZSh7IHNlbGxlck5pY2s6IFwi5pGp6KW/5ri45oiP5YyW5peX6Iiw5bqXXCIgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNob3dSZXdhcmRBZChhZElkOiBzdHJpbmcsIGtpZDogc3RyaW5nLCBvcmRlcjExSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGFkSWQpKSB7XG4gICAgLy8gICAgICAgICBVSUhlbHAuU2hvd1RpcHMoXCLmmoLml6Dlub/lkYrphY3nva5cIilcbiAgICAvLyAgICAgICAgIHJldHVyblxuICAgIC8vICAgICB9XG4gICAgLy8gICAgIC8vIOiOt+WPluS7u+WKoeaOp+WItuWZqFxuICAgIC8vICAgICBsZXQgdGFza0NvbnRyb2xsZXIgPSB0aGlzLnNkay5nZXRUYXNrQ29udHJvbGxlcih7XG4gICAgLy8gICAgICAgICBtYXRlcmlhbElkOiAnMzMwMDInLCAvL+ivt+aJvua3mOWunVBE5Y2P5Yqp55Sz6K+3XG4gICAgLy8gICAgICAgICBtYXRlcmlhbENvZGU6ICc2ZFpFcjhQazJ4T1RkR0dJZVVsVVFVYicgLy/or7fmib7mt5jlrp1QROWNj+WKqeeUs+ivt1xuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgdGFza0NvbnRyb2xsZXIuZ2V0VGFza0xpc3QoKVxuICAgIC8vICAgICAudGhlbihyZXMgPT4ge1xuICAgIC8vICAgICAgICAgY29uc29sZS5sb2coXCJ0YXNrTGlzdDpcIitKU09OLnN0cmluZ2lmeShyZXMpKVxuICAgIC8vICAgICAgICAgbGV0IHRhc2tMaXN0ID0gcmVzLm1haW5cbiAgICAvLyAgICAgICAgIC8v5om+5Yiw5a+55bqU55qE5Lu75Yqh57G75Z6L77yM55u05o6l6Kem5Y+RXG4gICAgLy8gICAgICAgICBsZXQgdGFyZ2V0VGFzayA9IG51bGw7XG4gICAgLy8gICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGFza0xpc3QpIHtcbiAgICAvLyAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhc2tMaXN0LCBrZXkpKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIGxldCB0YXNrSW5mbyA9IHRhc2tMaXN0W2tleV07XG4gICAgLy8gICAgICAgICAgICAgICAgIGlmICh0YXNrSW5mby5jb25zdW1lVHlwZSA9PSBhZElkKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0YXJnZXRUYXNrID0gdGFza0luZm9cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgaWYgKHRhcmdldFRhc2sgIT0gbnVsbCkge1xuICAgIC8vICAgICAgICAgICAgIGlmICh0YXJnZXRUYXNrLmNvdW50ID49IHRhcmdldFRhc2subWF4Q291bnQpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgVUlIZWxwLlNob3dUaXBzKFwi5b2T5YmN5Lu75Yqh5aWW5Yqx5bey6L6+6aKG5Y+W5LiK6ZmQXCIpXG4gICAgLy8gICAgICAgICAgICAgICAgIHJldHVyblxuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgICAgICB0YXNrQ29udHJvbGxlci5leGVjdXRlVGFzayh0YXJnZXRUYXNrLmlkKVxuICAgIC8vICAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMuQWRYaWFEYW5TdWMgPSB0cnVlO1xuICAgIC8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImV4ZWN1dGVUYXNrIHN1Y2M6XCIrSlNPTi5zdHJpbmdpZnkocmVzKSlcbiAgICAvLyAgICAgICAgICAgICB9KVxuICAgIC8vICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgIC8vICAgICAgICAgICAgICAgICBVSUhlbHAuU2hvd1RpcHMoXCLmt5jlrp3ku7vliqHmiafooYzlvILluLhcIilcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKVxuICAgIC8vICAgICAgICAgICAgIH0pO1xuICAgIC8vICAgICAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgICAgICBVSUhlbHAuU2hvd1RpcHMoXCLmib7kuI3liLDlr7nlupTnmoTlub/lkYrnsbvlnotcIilcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfSlcbiAgICAvLyAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgLy8gICAgICAgICBVSUhlbHAuU2hvd1RpcHMoXCLmt5jlrp3ku7vliqHojrflj5bliJfooajlvILluLhcIilcbiAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGVycilcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gfVxuXG4gICAgc2hvd1Jld2FyZEFkKGFkSWQ6IHN0cmluZywga2lkOiBzdHJpbmcsIG9yZGVyMTFJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoYWRJZCkpIHtcbiAgICAgICAgICAgIFVJSGVscC5TaG93VGlwcyhgJHtraWR95pqC5peg5bm/5ZGK6YWN572uYClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIOWwj+a4uOaIj1xuICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMuUmV3YXJkZWRWaWRlb0FkKSkge1xuICAgICAgICAgICAgdGhpcy5SZXdhcmRlZFZpZGVvQWQgPSBteS5jcmVhdGVSZXdhcmRlZEFkKHsgYWRVbml0SWQ6IGFkSWQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAvLyDmjInpkq7miJbogIXoh6rlrprkuYnkuovku7bop6blj5FcbiAgICAgICAgY29uc3QgaW52b2tlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5SZXdhcmRlZFZpZGVvQWRcbiAgICAgICAgICAgICAgICAgICAgLnNob3coKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuW5v+WRiuaYvuekuuaIkOWKn1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWxleekuuaIkOWKn+a4hemZpCBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGVkID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuUmV3YXJkZWRWaWRlb0FkLm9mZkxvYWQobG9hZENhbGxiYWNrKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlub/lkYrnu4Tku7blh7rnjrDpl67pophcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWGjeasoemHjeivleWKoOi9veS4gOasoSAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmV3YXJkZWRWaWRlb0FkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmiYvliqjliqDovb3miJDlip9cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCflub/lkYrmsqHliqDovb3lrozmiJAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnZva2UoKTtcbiAgICAgICAgLy8gY29uc3QgbG9hZENhbGxiYWNrID0gKHJlcykgPT4ge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coJ2xvYWRDYWxsYmFjazonLCByZXMpO1xuICAgICAgICAvLyAgICAgaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAvLyAgICAgaW52b2tlKCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8g5a6M5oiQ5bm/5ZGK5Zue5Zue6LCDICBcbiAgICAgICAgY29uc3QgY29tcGxldGVDYWxsYmFjayA9IChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb21wbGV0ZUNhbGxiYWNrJywgcmVzKTtcbiAgICAgICAgICAgIC8vIHRoaXMuQWRYaWFEYW5TdWMgPSB0cnVlO1xuICAgICAgICAgICAgR2FtZURhdGFDZW50ZXIuYWRWaWRlby5vblRhb0Jhb1hpYWRhblN1Y2MoKTtcbiAgICAgICAgICAgIC8vIOWcqOWQiOmAgueahOaXtuacuuWOu+mHiuaUvuebkeWQrFxuICAgICAgICAgICAgLy8gUmV3YXJkZWRWaWRlb0FkLm9mZkxvYWQobG9hZENhbGxiYWNrKVxuICAgICAgICAgICAgLy8gdGhpcy5SZXdhcmRlZFZpZGVvQWQub2ZmQ29tcGxldGUoY29tcGxldGVDYWxsYmFjaylcbiAgICAgICAgICAgIC8vIHRoaXMuUmV3YXJkZWRWaWRlb0FkLm9mZkNsb3NlKGNsb3NlQ2FsbGJhY2spXG4gICAgICAgICAgICAvLyB0aGlzLlJld2FyZGVkVmlkZW9BZC5vZmZFcnJvcihlcnJvckNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICAgIC8vIOWujOaIkOW5v+WRiuaIluiAheacquWujOaIkOW5v+WRiu+8jOWFs+mXreW5v+WRiuS8muWbnuiwgyAgXG4gICAgICAgIGNvbnN0IGNsb3NlQ2FsbGJhY2sgPSAocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ2Nsb3NlQ2FsbGJhaycsIHJlcylcbiAgICAgICAgfVxuICAgICAgICAvLyDlub/lkYrmjqXlj6PmiqXplJnnmoTlm57osIMgXG4gICAgICAgIGNvbnN0IGVycm9yQ2FsbGJhY2sgPSAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignZXJyb3JDYWxsYmFjaycsIGUpXG4gICAgICAgIH1cbiAgICAgICAgLy8g55uR5ZCs5bm/5ZGK55qE5LqL5Lu2XG4gICAgICAgIC8vIHRoaXMuUmV3YXJkZWRWaWRlb0FkLm9uTG9hZChsb2FkQ2FsbGJhY2spXG4gICAgICAgIHRoaXMuUmV3YXJkZWRWaWRlb0FkLm9uQ2xvc2UoY2xvc2VDYWxsYmFjaylcbiAgICAgICAgdGhpcy5SZXdhcmRlZFZpZGVvQWQub25Db21wbGV0ZShjb21wbGV0ZUNhbGxiYWNrKVxuICAgICAgICB0aGlzLlJld2FyZGVkVmlkZW9BZC5vbkVycm9yKGVycm9yQ2FsbGJhY2spXG4gICAgfVxuICAgIHJlcG9ydFJvbGVEYXRhKGFjdGlvbk5hbWU6IHN0cmluZywgdHlwZTogTnVtYmVyID0gMSkge1xuICAgICAgICBpZiAodHlwZSA9PSAxKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2RrLnJlcG9ydEV4cG9zdXJlKHsgYWN0aW9uTmFtZTogYWN0aW9uTmFtZSB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNkay5yZXBvcnRDbGljayh7IGFjdGlvbk5hbWU6IGFjdGlvbk5hbWUgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICB9XG4gICAgLy/mo4DmtYvmlrDkurrnu4Tku7bmmK/lkKblvIDlkK9cbiAgICBjaGVja0dhbWVBY3Rpdml0eUNvbnRyb2xsZXIoY2I6IChpc09wZW46IGJvb2xlYW4pID0+IHt9KSB7XG4gICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkodGhpcy5nYW1lQWN0aXZpdHlDb250cm9sbGVyKSkge1xuICAgICAgICAgICAgY2IoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nYW1lQWN0aXZpdHlDb250cm9sbGVyLmdldEluZm8oKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2hlY2tHYW1lQWN0aXZpdHlDb250cm9sbGVyIHJlcz0+XCIsIHJlcylcbiAgICAgICAgICAgIC8vIGlmIChyZXMuc2hvd01vZHVsZSkge1xuICAgICAgICAgICAgLy8gICAgIGxldCBwYXJhbXM6IFVzZXJTZXRaalByYW0gPSB7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIEdhbWVDb250cm9sbGVyLm5ldHdvcmsuc2VuZChVc2VyU2V0WmoudXJsLCBwYXJhbXMsIChyZXN1bHQ6IFNldkJhY2spID0+IHtcblxuICAgICAgICAgICAgLy8gICAgIH0pXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBjYihyZXMuc2hvd01vZHVsZSlcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImNoZWNrR2FtZUFjdGl2aXR5Q29udHJvbGxlciBlcnI6XCIsIGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvL+a3mOWuneaWsOS6uue7hOS7tlxuICAgIG9wZW5HYW1lQWN0aXZpdHlDb250cm9sbGVyKCkge1xuICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMuZ2FtZUFjdGl2aXR5Q29udHJvbGxlcikpIHtcbiAgICAgICAgICAgIFVJSGVscC5TaG93VGlwcyhcIua3mOWuneaWsOS6uue7hOS7tuWIneWni+WMluWksei0pVwiKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8g6YeK5pS+55uR5ZCsXG4gICAgICAgIHRoaXMuZ2FtZUFjdGl2aXR5Q29udHJvbGxlci5vZmZWaWV3Q2xvc2UoKCkgPT4ge1xuXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdhbWVBY3Rpdml0eUNvbnRyb2xsZXIuZ2V0SW5mbygpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJnZXRJbmZvPT5cIiwgcmVzKTtcbiAgICAgICAgICAgIGlmICghZ2FtZU1ldGhvZC5pc0VtcHR5KHRoaXMuZ2FtZUFjdGl2aXR5Q29udHJvbGxlcikgJiYgcmVzLnNob3dNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdhbWVBY3Rpdml0eUNvbnRyb2xsZXIub3BlblZpZXcoKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvcGVuVmlldz0+XCIsIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIOWinuWKoOebkeWQrFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdhbWVBY3Rpdml0eUNvbnRyb2xsZXIub25WaWV3Q2xvc2UoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm9wZW5HYW1lQWN0aXZpdHlDb250cm9sbGVyIGVycjpcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgVUlIZWxwLlNob3dUaXBzKFwi5peg5rOV5omT5byA5paw5Lq657uE5Lu2XCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8v5reY5a6d55So5oi35YWz6ZSu6KGM5Li65LiK5oqlXG4gICAgcmVwb3J0VXNlckFjdGlvbihhY3Rpb25JZDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwicmVwb3J0VXNlckFjdGlvbiBhY3Rpb25JZD0+XCIsIGFjdGlvbklkKTtcbiAgICAgICAgdGhpcy5zZGsucmVwb3J0U2NlbmUoe1xuICAgICAgICAgICAgc2NlbmVJZDogNDAxLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgY29zdFRpbWU6IDIwMDAsXG4gICAgICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgICAgIHJhdzogYWN0aW9uSWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufSJdfQ==
|