GameDotMgr.js 39.2 KB

                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/script/game/GameDotMgr.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, '42c85SZlkZBiK4oiwPhmvGG', 'GameDotMgr');
// script/game/GameDotMgr.ts

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const simba_sdk_1 = require("simba-sdk");
const EditorEnums_1 = require("../avg/EditorEnums");
const AVG_1 = require("../avg/AVG");
const simba_config_manager_1 = require("simba-config-manager");
const Role_1 = require("../config/Role");
const GameConfig_1 = require("../GameConfig");
const Enums_1 = require("./Enums");
const GameModelManager_1 = require("./model/GameModelManager");
let GameDotMgr = /** @class */ (() => {
    class GameDotMgr {
        constructor() {
            this._majorIds = [];
        }
        static getInstance() {
            return GameDotMgr._instance;
        }
        async dot(eventKey, data, category) {
            // if (channel === "dummy") return;
            // category = category ? category : "yybs_event";
            // let baseElements = this.getBaseElements();
            // let biRet = await SDK.bi(category, eventKey, baseElements, data);
        }
        getBaseElements() {
            let regV = AVG_1.GameRecord.globalVariables["register_version"];
            if (!regV) {
                regV = GameConfig_1.GameConfig.gameVersion;
                AVG_1.GameRecord.globalVariables["register_version"] = regV;
                AVG_1.GameRecord.saveRecord();
            }
            let player = GameModelManager_1.GameModelManager.getPlayerData();
            let base = {
                energy: player.getEnergy(),
                gold: player.getGoldCoin(),
                silver: player.getClothCoin(),
                grace: [],
                user_register_version: regV,
                login_duration: simba_sdk_1.TimeManager.getGameTime(),
                total_duration: simba_sdk_1.TimeManager.getTotalGameTime(),
                daily_duration: simba_sdk_1.TimeManager.getTodayGameTime(),
            };
            let gArr = [];
            if (!this._majorIds || 0 === this._majorIds.length) {
                let r = simba_config_manager_1.ConfigManager.getAllConfig(Role_1.role);
                for (let id in r) {
                    let c = r[id];
                    if (c && c.RoleType === EditorEnums_1.RoleType.Role_Major) {
                        this._majorIds.push(c.id);
                    }
                }
            }
            for (let i = 0; i < this._majorIds.length; i++) {
                let rid = this._majorIds[i];
                let role = GameModelManager_1.GameModelManager.getRoleData(rid);
                let gv = role === null || role === void 0 ? void 0 : role.getRoleLike();
                gv = gv ? gv : 0;
                let item = {
                    roleId: rid,
                    grace: gv
                };
                gArr.push(item);
            }
            base.grace = gArr;
            return base;
        }
        async dotClickUI(uiName) {
            let eventKey = "click_ui";
            let recordKey = "click_ui_count_" + uiName + "_t_" + GameModelManager_1.GameModelManager.getCurDayStr();
            let clickCount = AVG_1.GameRecord.globalVariables[recordKey];
            if (undefined === clickCount) {
                clickCount = 0;
            }
            clickCount += 1;
            AVG_1.GameRecord.globalVariables[recordKey] = clickCount;
            AVG_1.GameRecord.saveRecord();
            // console.log("dotClickUI = ", { click_ui: clickCount, ui_location: uiName });
            await this.dot(eventKey, { click_ui: clickCount, ui_location: uiName }, "click_ui");
        }
        async dotLoading(state) {
            let eventKey = "loading";
            await this.dot(eventKey, { loading: state }, "loading");
        }
        /**
         *
         * @param playerId 玩家的PlayerId
         * @param gameConstData 兑换码兑换的道具ID
         */
        async dotExchangeCodeSuccess(playerId, gameConstData) {
            let eventKey = "exchange_code_success";
            await this.dot(eventKey, { exchange_code_success: playerId, gameConstData: gameConstData }, "exchange_code_success");
        }
        async dotCost(cType, cNum) {
            // let eventKey = "cost";
            // let recordKey = cType + GameModelManager.getCurDayStr();
            // let count = GameRecord.globalVariables[recordKey] as number;
            // if (undefined === count) {
            //     count = 0;
            // }
            // count = count + cNum;
            // GameRecord.globalVariables[recordKey] = count;
            // GameRecord.saveRecord();
            // let data = {};
            // data[cType] = count;
            // // console.log("dotCost = ", data);
            // await this.dot(eventKey, data, "cost");
        }
        async dotPlot(session, state) {
            let eventKey = "plot";
            let v = session + "_" + state;
            // console.log("dotPlot = ", { plot_state: v });
            await this.dot(eventKey, { plot_state: v }, "plot");
        }
        async dotExposure(eType) {
            // let eventKey = "show";
            // // console.log("dotExposure = ", { show: eType });
            // await this.dot(eventKey, { show: eType }, "show");
        }
        async dotShop(sType, param) {
            // let eventKey = "shop";
            // let data = {};
            // switch (sType) {
            //     case DotShopType.LuckyDraw:
            //         {
            //             data[sType] = param.location;
            //         }
            //         break;
            //     case DotShopType.Clothes:
            //         {
            //             if (param.isWear) {
            //                 data[sType] = "wear_" + param.sid + "_" + param.rid;
            //             } else {
            //                 data[sType] = "have_" + param.sid + "_" + param.rid;
            //             }
            //         }
            //         break;
            // }
            // // console.log("dotShop = ", data);
            // await this.dot(eventKey, data, "shop");
        }
        async dotShopTotal(sType, param) {
            // let eventKey = "shop_total";
            // let data = {};
            // switch (sType) {
            //     case DotShopTotalType.ShowGift:
            //         {
            //             let rKey = "g_i_t_show_c" + GameModelManager.getCurDayStr();;
            //             let total = GameRecord.globalVariables[rKey] as number;
            //             total = total ? total : 0;
            //             total++;
            //             data[sType] = {
            //                 show_id: "show_item_" + param.id,
            //                 total_show: total
            //             }
            //             GameRecord.globalVariables[rKey] = total;
            //         }
            //         break;
            //     case DotShopTotalType.BuyItem:
            //         {
            //             let rKey = "g_i_t_buy_c" + GameModelManager.getCurDayStr();;
            //             let total = GameRecord.globalVariables[rKey] as number;
            //             total = total ? total : 0;
            //             total++;
            //             data[sType] = {
            //                 buy_id: "buy_" + param.id,
            //                 total_buy: total
            //             }
            //             GameRecord.globalVariables[rKey] = total;
            //         }
            //         break;
            //     case DotShopTotalType.SendGift:
            //         {
            //             let rKey = "g_i_t_send_c" + GameModelManager.getCurDayStr();;
            //             let total = GameRecord.globalVariables[rKey] as number;
            //             total = total ? total : 0;
            //             total++;
            //             data[sType] =
            //             {
            //                 send_id: param.gid,
            //                 role_id: param.rid,
            //                 total_send: total
            //             };
            //             GameRecord.globalVariables[rKey] = total;
            //         }
            //         break;
            //     case DotShopTotalType.Popup:
            //         {
            //             data[sType] = param.popType;
            //         }
            //         break;
            // }
            // GameRecord.autoSave();
            // // console.log("dotShopTotal = ", data);
            // await this.dot(eventKey, data, "shop_total");
        }
        async dotTask(taskDotType, tId) {
            // let eventKey = "task";
            // let data = {};
            // data["daily_task"] = {};
            // switch (taskDotType) {
            //     case TaskDotType.CompleteTask:
            //         {
            //             data["daily_task"] = "completed_" + tId;
            //         }
            //         break;
            //     case TaskDotType.GetTaskRewards:
            //         {
            //             data["daily_task"] = "get_rewards_" + tId;
            //         }
            //         break;
            // }
            // await this.dot(eventKey, data, "task");
        }
        async dotMoment(id, optionType) {
            // let eventKey = "circle_of_friends";
            // let v = "circle_" + optionType;
            // await this.dot(eventKey, { circle: v }, "circle_of_friends");
        }
        async dotTutorial(tType, state, param) {
            let eventKey = "tutorial";
            let k = "" + tType;
            let v = "" + param.session;
            switch (state) {
                case Enums_1.TutorialState.SelectSentence:
                    {
                        v += state + param.plotId;
                    }
                    break;
                case Enums_1.TutorialState.SelectSentenceRet:
                    {
                        k += "_plot_select";
                        v += Enums_1.TutorialState.SelectSentence + param.plotId + state + param.select;
                    }
                    break;
                case Enums_1.TutorialState.Progress:
                    {
                        k += "_plot_progress";
                        v += state + param.progress;
                    }
                    break;
            }
            let data = {};
            data[k] = v;
            // console.log("dotTutorial = ", data);
            await this.dot(eventKey, data, "tutorial");
        }
        async dotShare(shareType, shareLocation) {
            let eventKey = "share";
            // console.log("dotShare = ", { share_type: shareType, share_location: shareLocation });
            await this.dot(eventKey, { share_type: shareType, share_location: shareLocation }, "share");
        }
        async dotVideo(videoType, videoLocation) {
            let eventKey = "video";
            // console.log("dotVideo = ", { video_type: videoType, video_location: videoLocation });
            await this.dot(eventKey, { video_type: videoType, video_location: videoLocation }, "video");
        }
        //todo
        async dotShareRes(location, titleId, imgId) {
            let eventKey = "share_source";
            let v = location + "_" + titleId + "_" + imgId;
            await this.dot(eventKey, { share_source: v }, "share_source");
        }
        async dotGuide(oprType, location) {
            let eventKey = "guide";
            let v = location + oprType;
            // console.log("dotGuide = ",{ guide: v });
            await this.dot(eventKey, { guide: v }, "guide");
        }
        async dotEvent(oprType, location) {
            let eventKey = 'event';
            let v = location;
            let data = {};
            data[oprType] = v;
            // console.log("dotEvent = ",data);
            await this.dot(eventKey, data, 'event');
        }
        async dotSpecialPlot(sceneId, plotId, selectIndex, contenType, contentStatus) {
            let eventKey = 'special_plot';
            let data = {
                scene: sceneId,
                plot: plotId,
                select: selectIndex,
                contentype: contenType,
                status: contentStatus
            };
            // console.log("dotSpecialPlot = ", data);
            await this.dot(eventKey, data, 'special_plot');
        }
    }
    GameDotMgr._instance = new GameDotMgr();
    return GameDotMgr;
})();
exports.default = GameDotMgr;

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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvZ2FtZS9HYW1lRG90TWdyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQTZDO0FBQzdDLG9EQUE4QztBQUM5QyxvQ0FBd0M7QUFDeEMsK0RBQXFEO0FBQ3JELHlDQUFzQztBQUN0Qyw4Q0FBb0Q7QUFDcEQsbUNBQTZUO0FBQzdULCtEQUE0RDtBQWE1RDtJQUFBLE1BQXFCLFVBQVU7UUFBL0I7WUFFWSxjQUFTLEdBQWEsRUFBRSxDQUFDO1FBeVNyQyxDQUFDO1FBdlNVLE1BQU0sQ0FBQyxXQUFXO1lBQ3JCLE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUNoQyxDQUFDO1FBRU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFnQixFQUFFLElBQVMsRUFBRSxRQUFpQjtZQUMzRCxtQ0FBbUM7WUFDbkMsaURBQWlEO1lBQ2pELDZDQUE2QztZQUM3QyxvRUFBb0U7UUFDeEUsQ0FBQztRQUVPLGVBQWU7WUFDbkIsSUFBSSxJQUFJLEdBQUcsZ0JBQVUsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNQLElBQUksR0FBRyx1QkFBVSxDQUFDLFdBQVcsQ0FBQztnQkFDOUIsZ0JBQVUsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RELGdCQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDM0I7WUFDRCxJQUFJLE1BQU0sR0FBRyxtQ0FBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM5QyxJQUFJLElBQUksR0FBb0I7Z0JBQ3hCLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUMxQixJQUFJLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRTtnQkFDMUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUU7Z0JBQzdCLEtBQUssRUFBRSxFQUFFO2dCQUNULHFCQUFxQixFQUFFLElBQUk7Z0JBQzNCLGNBQWMsRUFBRSx1QkFBVyxDQUFDLFdBQVcsRUFBRTtnQkFDekMsY0FBYyxFQUFFLHVCQUFXLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQzlDLGNBQWMsRUFBRSx1QkFBVyxDQUFDLGdCQUFnQixFQUFFO2FBQ2pELENBQUM7WUFDRixJQUFJLElBQUksR0FBd0MsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtnQkFDaEQsSUFBSSxDQUFDLEdBQUcsb0NBQWEsQ0FBQyxZQUFZLENBQUMsV0FBSSxDQUFDLENBQUM7Z0JBQ3pDLEtBQUssSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO29CQUNkLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLHNCQUFRLENBQUMsVUFBVSxFQUFFO3dCQUN6QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQzdCO2lCQUNKO2FBQ0o7WUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLElBQUksSUFBSSxHQUFHLG1DQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxFQUFFLEdBQUcsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUM3QixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakIsSUFBSSxJQUFJLEdBQXNDO29CQUMxQyxNQUFNLEVBQUUsR0FBRztvQkFDWCxLQUFLLEVBQUUsRUFBRTtpQkFDWixDQUFBO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbkI7WUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFjO1lBQ2xDLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQztZQUMxQixJQUFJLFNBQVMsR0FBRyxpQkFBaUIsR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLG1DQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3JGLElBQUksVUFBVSxHQUFHLGdCQUFVLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBVyxDQUFDO1lBQ2pFLElBQUksU0FBUyxLQUFLLFVBQVUsRUFBRTtnQkFDMUIsVUFBVSxHQUFHLENBQUMsQ0FBQzthQUNsQjtZQUNELFVBQVUsSUFBSSxDQUFDLENBQUM7WUFDaEIsZ0JBQVUsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQ25ELGdCQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEIsK0VBQStFO1lBQy9FLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFtQjtZQUN2QyxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUM7WUFDekIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQ7Ozs7V0FJRztRQUNJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxRQUFnQixFQUFFLGFBQXNCO1lBQ3hFLElBQUksUUFBUSxHQUFHLHVCQUF1QixDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDekgsQ0FBQztRQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBZSxFQUFFLElBQVk7WUFDOUMseUJBQXlCO1lBQ3pCLDJEQUEyRDtZQUMzRCwrREFBK0Q7WUFDL0QsNkJBQTZCO1lBQzdCLGlCQUFpQjtZQUNqQixJQUFJO1lBQ0osd0JBQXdCO1lBQ3hCLGlEQUFpRDtZQUNqRCwyQkFBMkI7WUFDM0IsaUJBQWlCO1lBQ2pCLHVCQUF1QjtZQUN2QixzQ0FBc0M7WUFDdEMsMENBQTBDO1FBQzlDLENBQUM7UUFFTSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQWUsRUFBRSxLQUF1QjtZQUN6RCxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDdEIsSUFBSSxDQUFDLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7WUFDOUIsZ0RBQWdEO1lBQ2hELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBNEI7WUFDakQseUJBQXlCO1lBQ3pCLHFEQUFxRDtZQUNyRCxxREFBcUQ7UUFDekQsQ0FBQztRQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBa0IsRUFBRSxLQUFXO1lBQ2hELHlCQUF5QjtZQUN6QixpQkFBaUI7WUFFakIsbUJBQW1CO1lBQ25CLGtDQUFrQztZQUNsQyxZQUFZO1lBQ1osNENBQTRDO1lBQzVDLFlBQVk7WUFDWixpQkFBaUI7WUFDakIsZ0NBQWdDO1lBQ2hDLFlBQVk7WUFDWixrQ0FBa0M7WUFDbEMsdUVBQXVFO1lBQ3ZFLHVCQUF1QjtZQUN2Qix1RUFBdUU7WUFDdkUsZ0JBQWdCO1lBQ2hCLFlBQVk7WUFDWixpQkFBaUI7WUFDakIsSUFBSTtZQUNKLHNDQUFzQztZQUN0QywwQ0FBMEM7UUFDOUMsQ0FBQztRQUVNLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBdUIsRUFBRSxLQUFXO1lBQzFELCtCQUErQjtZQUMvQixpQkFBaUI7WUFDakIsbUJBQW1CO1lBQ25CLHNDQUFzQztZQUN0QyxZQUFZO1lBQ1osNEVBQTRFO1lBQzVFLHNFQUFzRTtZQUN0RSx5Q0FBeUM7WUFDekMsdUJBQXVCO1lBQ3ZCLDhCQUE4QjtZQUM5QixvREFBb0Q7WUFDcEQsb0NBQW9DO1lBQ3BDLGdCQUFnQjtZQUNoQix3REFBd0Q7WUFDeEQsWUFBWTtZQUNaLGlCQUFpQjtZQUNqQixxQ0FBcUM7WUFDckMsWUFBWTtZQUNaLDJFQUEyRTtZQUMzRSxzRUFBc0U7WUFDdEUseUNBQXlDO1lBQ3pDLHVCQUF1QjtZQUN2Qiw4QkFBOEI7WUFDOUIsNkNBQTZDO1lBQzdDLG1DQUFtQztZQUNuQyxnQkFBZ0I7WUFDaEIsd0RBQXdEO1lBQ3hELFlBQVk7WUFDWixpQkFBaUI7WUFDakIsc0NBQXNDO1lBQ3RDLFlBQVk7WUFDWiw0RUFBNEU7WUFDNUUsc0VBQXNFO1lBQ3RFLHlDQUF5QztZQUN6Qyx1QkFBdUI7WUFDdkIsNEJBQTRCO1lBQzVCLGdCQUFnQjtZQUNoQixzQ0FBc0M7WUFDdEMsc0NBQXNDO1lBQ3RDLG9DQUFvQztZQUNwQyxpQkFBaUI7WUFDakIsd0RBQXdEO1lBQ3hELFlBQVk7WUFDWixpQkFBaUI7WUFDakIsbUNBQW1DO1lBQ25DLFlBQVk7WUFDWiwyQ0FBMkM7WUFDM0MsWUFBWTtZQUNaLGlCQUFpQjtZQUNqQixJQUFJO1lBQ0oseUJBQXlCO1lBQ3pCLDJDQUEyQztZQUMzQyxnREFBZ0Q7UUFDcEQsQ0FBQztRQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBd0IsRUFBRSxHQUFXO1lBQ3RELHlCQUF5QjtZQUN6QixpQkFBaUI7WUFDakIsMkJBQTJCO1lBQzNCLHlCQUF5QjtZQUN6QixxQ0FBcUM7WUFDckMsWUFBWTtZQUNaLHVEQUF1RDtZQUN2RCxZQUFZO1lBQ1osaUJBQWlCO1lBQ2pCLHVDQUF1QztZQUN2QyxZQUFZO1lBQ1oseURBQXlEO1lBQ3pELFlBQVk7WUFDWixpQkFBaUI7WUFDakIsSUFBSTtZQUNKLDBDQUEwQztRQUM5QyxDQUFDO1FBRU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFVLEVBQUUsVUFBNEI7WUFDM0Qsc0NBQXNDO1lBQ3RDLGtDQUFrQztZQUNsQyxnRUFBZ0U7UUFDcEUsQ0FBQztRQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBbUIsRUFBRSxLQUFvQixFQUFFLEtBQVU7WUFDMUUsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDO1lBQzFCLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDM0IsUUFBUSxLQUFLLEVBQUU7Z0JBQ1gsS0FBSyxxQkFBYSxDQUFDLGNBQWM7b0JBQzdCO3dCQUNJLENBQUMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztxQkFDN0I7b0JBQ0QsTUFBTTtnQkFDVixLQUFLLHFCQUFhLENBQUMsaUJBQWlCO29CQUNoQzt3QkFDSSxDQUFDLElBQUksY0FBYyxDQUFDO3dCQUNwQixDQUFDLElBQUkscUJBQWEsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztxQkFDM0U7b0JBQ0QsTUFBTTtnQkFDVixLQUFLLHFCQUFhLENBQUMsUUFBUTtvQkFDdkI7d0JBQ0ksQ0FBQyxJQUFJLGdCQUFnQixDQUFDO3dCQUN0QixDQUFDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7cUJBQy9CO29CQUNELE1BQU07YUFDYjtZQUNELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWix1Q0FBdUM7WUFDdkMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBbUIsRUFBRSxhQUFxQztZQUM1RSxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDdkIsd0ZBQXdGO1lBQ3hGLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFtQixFQUFFLGFBQXFCO1lBQzVELElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUN2Qix3RkFBd0Y7WUFDeEYsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQy9GLENBQUM7UUFFRCxNQUFNO1FBQ0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUF1QixFQUFFLE9BQWUsRUFBRSxLQUFhO1lBQzVFLElBQUksUUFBUSxHQUFHLGNBQWMsQ0FBQztZQUM5QixJQUFJLENBQUMsR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO1lBQy9DLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBMkIsRUFBRSxRQUF1QjtZQUN0RSxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDdkIsSUFBSSxDQUFDLEdBQUcsUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUMzQiwyQ0FBMkM7WUFDM0MsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBR00sS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUEyQixFQUFFLFFBQXVCO1lBQ3RFLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUN2QixJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7WUFDakIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQixtQ0FBbUM7WUFDbkMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVNLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBZSxFQUFFLE1BQWMsRUFBRSxXQUFtQixFQUFFLFVBQWtDLEVBQUUsYUFBdUM7WUFDekosSUFBSSxRQUFRLEdBQUcsY0FBYyxDQUFDO1lBQzlCLElBQUksSUFBSSxHQUFHO2dCQUNQLEtBQUssRUFBRSxPQUFPO2dCQUNkLElBQUksRUFBRSxNQUFNO2dCQUNaLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixVQUFVLEVBQUUsVUFBVTtnQkFDdEIsTUFBTSxFQUFFLGFBQWE7YUFDeEIsQ0FBQTtZQUNELDBDQUEwQztZQUMxQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNuRCxDQUFDOztJQXhTdUIsb0JBQVMsR0FBZSxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBMFNyRSxpQkFBQztLQUFBO2tCQTNTb0IsVUFBVSIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNESywgVGltZU1hbmFnZXIgfSBmcm9tIFwic2ltYmEtc2RrXCI7XG5pbXBvcnQgeyBSb2xlVHlwZSB9IGZyb20gXCIuLi9hdmcvRWRpdG9yRW51bXNcIjtcbmltcG9ydCB7IEdhbWVSZWNvcmQgfSBmcm9tIFwiLi4vYXZnL0FWR1wiO1xuaW1wb3J0IHsgQ29uZmlnTWFuYWdlciB9IGZyb20gXCJzaW1iYS1jb25maWctbWFuYWdlclwiO1xuaW1wb3J0IHsgcm9sZSB9IGZyb20gXCIuLi9jb25maWcvUm9sZVwiO1xuaW1wb3J0IHsgY2hhbm5lbCwgR2FtZUNvbmZpZyB9IGZyb20gXCIuLi9HYW1lQ29uZmlnXCI7XG5pbXBvcnQgeyBDb3N0VHlwZSwgRG90U2hvcFRvdGFsVHlwZSwgRG90U2hvcFR5cGUsIEV2ZW50TG9jYXRpb24sIEV2ZW50T3BlcmF0aW9uVHlwZSwgRXhwb3N1cmVUeXBlLCBHdWlkZUxvY2F0aW9uLCBHdWlkZU9wZXJhdGlvblR5cGUsIExvYWRpbmdTdGF0ZSwgTW9tZW50T3B0aW9uVHlwZSwgUGxvdFNlc3Npb25TdGF0ZSwgU2hhcmVMb2NhdGlvbiwgU2hvd1R5cGUsIFNwZWNpYWxEYXRlQ29udGVudFN0YXR1cywgU3BlY2lhbERhdGVDb250ZW50VHlwZSwgVGFza0RvdFR5cGUsIFR1dG9yaWFsU3RhdGUsIFR1dG9yaWFsVHlwZSB9IGZyb20gXCIuL0VudW1zXCI7XG5pbXBvcnQgeyBHYW1lTW9kZWxNYW5hZ2VyIH0gZnJvbSBcIi4vbW9kZWwvR2FtZU1vZGVsTWFuYWdlclwiO1xuXG5pbnRlcmZhY2UgQmFzZURvdEVsZW1lbnRzIHtcbiAgICBlbmVyZ3k6IG51bWJlcixcbiAgICBnb2xkOiBudW1iZXIsXG4gICAgc2lsdmVyOiBudW1iZXIsXG4gICAgZ3JhY2U6IHsgcm9sZUlkOiBudW1iZXIsIGdyYWNlOiBudW1iZXIgfVtdLFxuICAgIHVzZXJfcmVnaXN0ZXJfdmVyc2lvbjogc3RyaW5nLFxuICAgIGxvZ2luX2R1cmF0aW9uOiBudW1iZXIsXG4gICAgdG90YWxfZHVyYXRpb246IG51bWJlcixcbiAgICBkYWlseV9kdXJhdGlvbjogbnVtYmVyLFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lRG90TWdyIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfaW5zdGFuY2U6IEdhbWVEb3RNZ3IgPSBuZXcgR2FtZURvdE1ncigpO1xuICAgIHByaXZhdGUgX21ham9ySWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBHYW1lRG90TWdyIHtcbiAgICAgICAgcmV0dXJuIEdhbWVEb3RNZ3IuX2luc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3QoZXZlbnRLZXk6IHN0cmluZywgZGF0YTogYW55LCBjYXRlZ29yeT86IHN0cmluZykge1xuICAgICAgICAvLyBpZiAoY2hhbm5lbCA9PT0gXCJkdW1teVwiKSByZXR1cm47XG4gICAgICAgIC8vIGNhdGVnb3J5ID0gY2F0ZWdvcnkgPyBjYXRlZ29yeSA6IFwieXlic19ldmVudFwiO1xuICAgICAgICAvLyBsZXQgYmFzZUVsZW1lbnRzID0gdGhpcy5nZXRCYXNlRWxlbWVudHMoKTtcbiAgICAgICAgLy8gbGV0IGJpUmV0ID0gYXdhaXQgU0RLLmJpKGNhdGVnb3J5LCBldmVudEtleSwgYmFzZUVsZW1lbnRzLCBkYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJhc2VFbGVtZW50cygpOiBCYXNlRG90RWxlbWVudHMge1xuICAgICAgICBsZXQgcmVnViA9IEdhbWVSZWNvcmQuZ2xvYmFsVmFyaWFibGVzW1wicmVnaXN0ZXJfdmVyc2lvblwiXTtcbiAgICAgICAgaWYgKCFyZWdWKSB7XG4gICAgICAgICAgICByZWdWID0gR2FtZUNvbmZpZy5nYW1lVmVyc2lvbjtcbiAgICAgICAgICAgIEdhbWVSZWNvcmQuZ2xvYmFsVmFyaWFibGVzW1wicmVnaXN0ZXJfdmVyc2lvblwiXSA9IHJlZ1Y7XG4gICAgICAgICAgICBHYW1lUmVjb3JkLnNhdmVSZWNvcmQoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGxheWVyID0gR2FtZU1vZGVsTWFuYWdlci5nZXRQbGF5ZXJEYXRhKCk7XG4gICAgICAgIGxldCBiYXNlOiBCYXNlRG90RWxlbWVudHMgPSB7XG4gICAgICAgICAgICBlbmVyZ3k6IHBsYXllci5nZXRFbmVyZ3koKSxcbiAgICAgICAgICAgIGdvbGQ6IHBsYXllci5nZXRHb2xkQ29pbigpLFxuICAgICAgICAgICAgc2lsdmVyOiBwbGF5ZXIuZ2V0Q2xvdGhDb2luKCksXG4gICAgICAgICAgICBncmFjZTogW10sXG4gICAgICAgICAgICB1c2VyX3JlZ2lzdGVyX3ZlcnNpb246IHJlZ1YsXG4gICAgICAgICAgICBsb2dpbl9kdXJhdGlvbjogVGltZU1hbmFnZXIuZ2V0R2FtZVRpbWUoKSxcbiAgICAgICAgICAgIHRvdGFsX2R1cmF0aW9uOiBUaW1lTWFuYWdlci5nZXRUb3RhbEdhbWVUaW1lKCksXG4gICAgICAgICAgICBkYWlseV9kdXJhdGlvbjogVGltZU1hbmFnZXIuZ2V0VG9kYXlHYW1lVGltZSgpLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgZ0FycjogeyByb2xlSWQ6IG51bWJlciwgZ3JhY2U6IG51bWJlciB9W10gPSBbXTtcbiAgICAgICAgaWYgKCF0aGlzLl9tYWpvcklkcyB8fCAwID09PSB0aGlzLl9tYWpvcklkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByID0gQ29uZmlnTWFuYWdlci5nZXRBbGxDb25maWcocm9sZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpZCBpbiByKSB7XG4gICAgICAgICAgICAgICAgbGV0IGMgPSByW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoYyAmJiBjLlJvbGVUeXBlID09PSBSb2xlVHlwZS5Sb2xlX01ham9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21ham9ySWRzLnB1c2goYy5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbWFqb3JJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByaWQgPSB0aGlzLl9tYWpvcklkc1tpXTtcbiAgICAgICAgICAgIGxldCByb2xlID0gR2FtZU1vZGVsTWFuYWdlci5nZXRSb2xlRGF0YShyaWQpO1xuICAgICAgICAgICAgbGV0IGd2ID0gcm9sZT8uZ2V0Um9sZUxpa2UoKTtcbiAgICAgICAgICAgIGd2ID0gZ3YgPyBndiA6IDA7XG4gICAgICAgICAgICBsZXQgaXRlbTogeyByb2xlSWQ6IG51bWJlciwgZ3JhY2U6IG51bWJlciB9ID0ge1xuICAgICAgICAgICAgICAgIHJvbGVJZDogcmlkLFxuICAgICAgICAgICAgICAgIGdyYWNlOiBndlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ0Fyci5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGJhc2UuZ3JhY2UgPSBnQXJyO1xuICAgICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG90Q2xpY2tVSSh1aU5hbWU6IHN0cmluZykge1xuICAgICAgICBsZXQgZXZlbnRLZXkgPSBcImNsaWNrX3VpXCI7XG4gICAgICAgIGxldCByZWNvcmRLZXkgPSBcImNsaWNrX3VpX2NvdW50X1wiICsgdWlOYW1lICsgXCJfdF9cIiArIEdhbWVNb2RlbE1hbmFnZXIuZ2V0Q3VyRGF5U3RyKCk7XG4gICAgICAgIGxldCBjbGlja0NvdW50ID0gR2FtZVJlY29yZC5nbG9iYWxWYXJpYWJsZXNbcmVjb3JkS2V5XSBhcyBudW1iZXI7XG4gICAgICAgIGlmICh1bmRlZmluZWQgPT09IGNsaWNrQ291bnQpIHtcbiAgICAgICAgICAgIGNsaWNrQ291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGNsaWNrQ291bnQgKz0gMTtcbiAgICAgICAgR2FtZVJlY29yZC5nbG9iYWxWYXJpYWJsZXNbcmVjb3JkS2V5XSA9IGNsaWNrQ291bnQ7XG4gICAgICAgIEdhbWVSZWNvcmQuc2F2ZVJlY29yZCgpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRvdENsaWNrVUkgPSBcIiwgeyBjbGlja191aTogY2xpY2tDb3VudCwgdWlfbG9jYXRpb246IHVpTmFtZSB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5kb3QoZXZlbnRLZXksIHsgY2xpY2tfdWk6IGNsaWNrQ291bnQsIHVpX2xvY2F0aW9uOiB1aU5hbWUgfSwgXCJjbGlja191aVwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG90TG9hZGluZyhzdGF0ZTogTG9hZGluZ1N0YXRlKSB7XG4gICAgICAgIGxldCBldmVudEtleSA9IFwibG9hZGluZ1wiO1xuICAgICAgICBhd2FpdCB0aGlzLmRvdChldmVudEtleSwgeyBsb2FkaW5nOiBzdGF0ZSB9LCBcImxvYWRpbmdcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIHBsYXllcklkIOeOqeWutueahFBsYXllcklkXG4gICAgICogQHBhcmFtIGdhbWVDb25zdERhdGEg5YWR5o2i56CB5YWR5o2i55qE6YGT5YW3SURcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZG90RXhjaGFuZ2VDb2RlU3VjY2VzcyhwbGF5ZXJJZDogc3RyaW5nLCBnYW1lQ29uc3REYXRhPzogc3RyaW5nKSB7XG4gICAgICAgIGxldCBldmVudEtleSA9IFwiZXhjaGFuZ2VfY29kZV9zdWNjZXNzXCI7XG4gICAgICAgIGF3YWl0IHRoaXMuZG90KGV2ZW50S2V5LCB7IGV4Y2hhbmdlX2NvZGVfc3VjY2VzczogcGxheWVySWQsIGdhbWVDb25zdERhdGE6IGdhbWVDb25zdERhdGEgfSwgXCJleGNoYW5nZV9jb2RlX3N1Y2Nlc3NcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvdENvc3QoY1R5cGU6IENvc3RUeXBlLCBjTnVtOiBudW1iZXIpIHtcbiAgICAgICAgLy8gbGV0IGV2ZW50S2V5ID0gXCJjb3N0XCI7XG4gICAgICAgIC8vIGxldCByZWNvcmRLZXkgPSBjVHlwZSArIEdhbWVNb2RlbE1hbmFnZXIuZ2V0Q3VyRGF5U3RyKCk7XG4gICAgICAgIC8vIGxldCBjb3VudCA9IEdhbWVSZWNvcmQuZ2xvYmFsVmFyaWFibGVzW3JlY29yZEtleV0gYXMgbnVtYmVyO1xuICAgICAgICAvLyBpZiAodW5kZWZpbmVkID09PSBjb3VudCkge1xuICAgICAgICAvLyAgICAgY291bnQgPSAwO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGNvdW50ID0gY291bnQgKyBjTnVtO1xuICAgICAgICAvLyBHYW1lUmVjb3JkLmdsb2JhbFZhcmlhYmxlc1tyZWNvcmRLZXldID0gY291bnQ7XG4gICAgICAgIC8vIEdhbWVSZWNvcmQuc2F2ZVJlY29yZCgpO1xuICAgICAgICAvLyBsZXQgZGF0YSA9IHt9O1xuICAgICAgICAvLyBkYXRhW2NUeXBlXSA9IGNvdW50O1xuICAgICAgICAvLyAvLyBjb25zb2xlLmxvZyhcImRvdENvc3QgPSBcIiwgZGF0YSk7XG4gICAgICAgIC8vIGF3YWl0IHRoaXMuZG90KGV2ZW50S2V5LCBkYXRhLCBcImNvc3RcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvdFBsb3Qoc2Vzc2lvbjogbnVtYmVyLCBzdGF0ZTogUGxvdFNlc3Npb25TdGF0ZSkge1xuICAgICAgICBsZXQgZXZlbnRLZXkgPSBcInBsb3RcIjtcbiAgICAgICAgbGV0IHYgPSBzZXNzaW9uICsgXCJfXCIgKyBzdGF0ZTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJkb3RQbG90ID0gXCIsIHsgcGxvdF9zdGF0ZTogdiB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5kb3QoZXZlbnRLZXksIHsgcGxvdF9zdGF0ZTogdiB9LCBcInBsb3RcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvdEV4cG9zdXJlKGVUeXBlOiBFeHBvc3VyZVR5cGUgfCBzdHJpbmcpIHtcbiAgICAgICAgLy8gbGV0IGV2ZW50S2V5ID0gXCJzaG93XCI7XG4gICAgICAgIC8vIC8vIGNvbnNvbGUubG9nKFwiZG90RXhwb3N1cmUgPSBcIiwgeyBzaG93OiBlVHlwZSB9KTtcbiAgICAgICAgLy8gYXdhaXQgdGhpcy5kb3QoZXZlbnRLZXksIHsgc2hvdzogZVR5cGUgfSwgXCJzaG93XCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3RTaG9wKHNUeXBlOiBEb3RTaG9wVHlwZSwgcGFyYW0/OiBhbnkpIHtcbiAgICAgICAgLy8gbGV0IGV2ZW50S2V5ID0gXCJzaG9wXCI7XG4gICAgICAgIC8vIGxldCBkYXRhID0ge307XG5cbiAgICAgICAgLy8gc3dpdGNoIChzVHlwZSkge1xuICAgICAgICAvLyAgICAgY2FzZSBEb3RTaG9wVHlwZS5MdWNreURyYXc6XG4gICAgICAgIC8vICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICBkYXRhW3NUeXBlXSA9IHBhcmFtLmxvY2F0aW9uO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gICAgIGNhc2UgRG90U2hvcFR5cGUuQ2xvdGhlczpcbiAgICAgICAgLy8gICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGlmIChwYXJhbS5pc1dlYXIpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGRhdGFbc1R5cGVdID0gXCJ3ZWFyX1wiICsgcGFyYW0uc2lkICsgXCJfXCIgKyBwYXJhbS5yaWQ7XG4gICAgICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBkYXRhW3NUeXBlXSA9IFwiaGF2ZV9cIiArIHBhcmFtLnNpZCArIFwiX1wiICsgcGFyYW0ucmlkO1xuICAgICAgICAvLyAgICAgICAgICAgICB9XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIC8vIGNvbnNvbGUubG9nKFwiZG90U2hvcCA9IFwiLCBkYXRhKTtcbiAgICAgICAgLy8gYXdhaXQgdGhpcy5kb3QoZXZlbnRLZXksIGRhdGEsIFwic2hvcFwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG90U2hvcFRvdGFsKHNUeXBlOiBEb3RTaG9wVG90YWxUeXBlLCBwYXJhbT86IGFueSkge1xuICAgICAgICAvLyBsZXQgZXZlbnRLZXkgPSBcInNob3BfdG90YWxcIjtcbiAgICAgICAgLy8gbGV0IGRhdGEgPSB7fTtcbiAgICAgICAgLy8gc3dpdGNoIChzVHlwZSkge1xuICAgICAgICAvLyAgICAgY2FzZSBEb3RTaG9wVG90YWxUeXBlLlNob3dHaWZ0OlxuICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgbGV0IHJLZXkgPSBcImdfaV90X3Nob3dfY1wiICsgR2FtZU1vZGVsTWFuYWdlci5nZXRDdXJEYXlTdHIoKTs7XG4gICAgICAgIC8vICAgICAgICAgICAgIGxldCB0b3RhbCA9IEdhbWVSZWNvcmQuZ2xvYmFsVmFyaWFibGVzW3JLZXldIGFzIG51bWJlcjtcbiAgICAgICAgLy8gICAgICAgICAgICAgdG90YWwgPSB0b3RhbCA/IHRvdGFsIDogMDtcbiAgICAgICAgLy8gICAgICAgICAgICAgdG90YWwrKztcbiAgICAgICAgLy8gICAgICAgICAgICAgZGF0YVtzVHlwZV0gPSB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBzaG93X2lkOiBcInNob3dfaXRlbV9cIiArIHBhcmFtLmlkLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdG90YWxfc2hvdzogdG90YWxcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgICAgICBHYW1lUmVjb3JkLmdsb2JhbFZhcmlhYmxlc1tyS2V5XSA9IHRvdGFsO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gICAgIGNhc2UgRG90U2hvcFRvdGFsVHlwZS5CdXlJdGVtOlxuICAgICAgICAvLyAgICAgICAgIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgbGV0IHJLZXkgPSBcImdfaV90X2J1eV9jXCIgKyBHYW1lTW9kZWxNYW5hZ2VyLmdldEN1ckRheVN0cigpOztcbiAgICAgICAgLy8gICAgICAgICAgICAgbGV0IHRvdGFsID0gR2FtZVJlY29yZC5nbG9iYWxWYXJpYWJsZXNbcktleV0gYXMgbnVtYmVyO1xuICAgICAgICAvLyAgICAgICAgICAgICB0b3RhbCA9IHRvdGFsID8gdG90YWwgOiAwO1xuICAgICAgICAvLyAgICAgICAgICAgICB0b3RhbCsrO1xuICAgICAgICAvLyAgICAgICAgICAgICBkYXRhW3NUeXBlXSA9IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGJ1eV9pZDogXCJidXlfXCIgKyBwYXJhbS5pZCxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHRvdGFsX2J1eTogdG90YWxcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgICAgICBHYW1lUmVjb3JkLmdsb2JhbFZhcmlhYmxlc1tyS2V5XSA9IHRvdGFsO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gICAgIGNhc2UgRG90U2hvcFRvdGFsVHlwZS5TZW5kR2lmdDpcbiAgICAgICAgLy8gICAgICAgICB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGxldCByS2V5ID0gXCJnX2lfdF9zZW5kX2NcIiArIEdhbWVNb2RlbE1hbmFnZXIuZ2V0Q3VyRGF5U3RyKCk7O1xuICAgICAgICAvLyAgICAgICAgICAgICBsZXQgdG90YWwgPSBHYW1lUmVjb3JkLmdsb2JhbFZhcmlhYmxlc1tyS2V5XSBhcyBudW1iZXI7XG4gICAgICAgIC8vICAgICAgICAgICAgIHRvdGFsID0gdG90YWwgPyB0b3RhbCA6IDA7XG4gICAgICAgIC8vICAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgIC8vICAgICAgICAgICAgIGRhdGFbc1R5cGVdID1cbiAgICAgICAgLy8gICAgICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgc2VuZF9pZDogcGFyYW0uZ2lkLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgcm9sZV9pZDogcGFyYW0ucmlkLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdG90YWxfc2VuZDogdG90YWxcbiAgICAgICAgLy8gICAgICAgICAgICAgfTtcbiAgICAgICAgLy8gICAgICAgICAgICAgR2FtZVJlY29yZC5nbG9iYWxWYXJpYWJsZXNbcktleV0gPSB0b3RhbDtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIERvdFNob3BUb3RhbFR5cGUuUG9wdXA6XG4gICAgICAgIC8vICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICBkYXRhW3NUeXBlXSA9IHBhcmFtLnBvcFR5cGU7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIEdhbWVSZWNvcmQuYXV0b1NhdmUoKTtcbiAgICAgICAgLy8gLy8gY29uc29sZS5sb2coXCJkb3RTaG9wVG90YWwgPSBcIiwgZGF0YSk7XG4gICAgICAgIC8vIGF3YWl0IHRoaXMuZG90KGV2ZW50S2V5LCBkYXRhLCBcInNob3BfdG90YWxcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvdFRhc2sodGFza0RvdFR5cGU6IFRhc2tEb3RUeXBlLCB0SWQ6IG51bWJlcikge1xuICAgICAgICAvLyBsZXQgZXZlbnRLZXkgPSBcInRhc2tcIjtcbiAgICAgICAgLy8gbGV0IGRhdGEgPSB7fTtcbiAgICAgICAgLy8gZGF0YVtcImRhaWx5X3Rhc2tcIl0gPSB7fTtcbiAgICAgICAgLy8gc3dpdGNoICh0YXNrRG90VHlwZSkge1xuICAgICAgICAvLyAgICAgY2FzZSBUYXNrRG90VHlwZS5Db21wbGV0ZVRhc2s6XG4gICAgICAgIC8vICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICBkYXRhW1wiZGFpbHlfdGFza1wiXSA9IFwiY29tcGxldGVkX1wiICsgdElkO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gICAgIGNhc2UgVGFza0RvdFR5cGUuR2V0VGFza1Jld2FyZHM6XG4gICAgICAgIC8vICAgICAgICAge1xuICAgICAgICAvLyAgICAgICAgICAgICBkYXRhW1wiZGFpbHlfdGFza1wiXSA9IFwiZ2V0X3Jld2FyZHNfXCIgKyB0SWQ7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGF3YWl0IHRoaXMuZG90KGV2ZW50S2V5LCBkYXRhLCBcInRhc2tcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvdE1vbWVudChpZDogbnVtYmVyLCBvcHRpb25UeXBlOiBNb21lbnRPcHRpb25UeXBlKSB7XG4gICAgICAgIC8vIGxldCBldmVudEtleSA9IFwiY2lyY2xlX29mX2ZyaWVuZHNcIjtcbiAgICAgICAgLy8gbGV0IHYgPSBcImNpcmNsZV9cIiArIG9wdGlvblR5cGU7XG4gICAgICAgIC8vIGF3YWl0IHRoaXMuZG90KGV2ZW50S2V5LCB7IGNpcmNsZTogdiB9LCBcImNpcmNsZV9vZl9mcmllbmRzXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3RUdXRvcmlhbCh0VHlwZTogVHV0b3JpYWxUeXBlLCBzdGF0ZTogVHV0b3JpYWxTdGF0ZSwgcGFyYW06IGFueSkge1xuICAgICAgICBsZXQgZXZlbnRLZXkgPSBcInR1dG9yaWFsXCI7XG4gICAgICAgIGxldCBrID0gXCJcIiArIHRUeXBlO1xuICAgICAgICBsZXQgdiA9IFwiXCIgKyBwYXJhbS5zZXNzaW9uO1xuICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlIFR1dG9yaWFsU3RhdGUuU2VsZWN0U2VudGVuY2U6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2ICs9IHN0YXRlICsgcGFyYW0ucGxvdElkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVHV0b3JpYWxTdGF0ZS5TZWxlY3RTZW50ZW5jZVJldDpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGsgKz0gXCJfcGxvdF9zZWxlY3RcIjtcbiAgICAgICAgICAgICAgICAgICAgdiArPSBUdXRvcmlhbFN0YXRlLlNlbGVjdFNlbnRlbmNlICsgcGFyYW0ucGxvdElkICsgc3RhdGUgKyBwYXJhbS5zZWxlY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBUdXRvcmlhbFN0YXRlLlByb2dyZXNzOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgayArPSBcIl9wbG90X3Byb2dyZXNzXCI7XG4gICAgICAgICAgICAgICAgICAgIHYgKz0gc3RhdGUgKyBwYXJhbS5wcm9ncmVzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRhdGEgPSB7fTtcbiAgICAgICAgZGF0YVtrXSA9IHY7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZG90VHV0b3JpYWwgPSBcIiwgZGF0YSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZG90KGV2ZW50S2V5LCBkYXRhLCBcInR1dG9yaWFsXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3RTaGFyZShzaGFyZVR5cGU6IFNob3dUeXBlLCBzaGFyZUxvY2F0aW9uOiBTaGFyZUxvY2F0aW9uIHwgc3RyaW5nKSB7XG4gICAgICAgIGxldCBldmVudEtleSA9IFwic2hhcmVcIjtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJkb3RTaGFyZSA9IFwiLCB7IHNoYXJlX3R5cGU6IHNoYXJlVHlwZSwgc2hhcmVfbG9jYXRpb246IHNoYXJlTG9jYXRpb24gfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZG90KGV2ZW50S2V5LCB7IHNoYXJlX3R5cGU6IHNoYXJlVHlwZSwgc2hhcmVfbG9jYXRpb246IHNoYXJlTG9jYXRpb24gfSwgXCJzaGFyZVwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG90VmlkZW8odmlkZW9UeXBlOiBTaG93VHlwZSwgdmlkZW9Mb2NhdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIGxldCBldmVudEtleSA9IFwidmlkZW9cIjtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJkb3RWaWRlbyA9IFwiLCB7IHZpZGVvX3R5cGU6IHZpZGVvVHlwZSwgdmlkZW9fbG9jYXRpb246IHZpZGVvTG9jYXRpb24gfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZG90KGV2ZW50S2V5LCB7IHZpZGVvX3R5cGU6IHZpZGVvVHlwZSwgdmlkZW9fbG9jYXRpb246IHZpZGVvTG9jYXRpb24gfSwgXCJ2aWRlb1wiKVxuICAgIH1cblxuICAgIC8vdG9kb1xuICAgIHB1YmxpYyBhc3luYyBkb3RTaGFyZVJlcyhsb2NhdGlvbjogU2hhcmVMb2NhdGlvbiwgdGl0bGVJZDogbnVtYmVyLCBpbWdJZDogbnVtYmVyKSB7XG4gICAgICAgIGxldCBldmVudEtleSA9IFwic2hhcmVfc291cmNlXCI7XG4gICAgICAgIGxldCB2ID0gbG9jYXRpb24gKyBcIl9cIiArIHRpdGxlSWQgKyBcIl9cIiArIGltZ0lkO1xuICAgICAgICBhd2FpdCB0aGlzLmRvdChldmVudEtleSwgeyBzaGFyZV9zb3VyY2U6IHYgfSwgXCJzaGFyZV9zb3VyY2VcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvdEd1aWRlKG9wclR5cGU6IEd1aWRlT3BlcmF0aW9uVHlwZSwgbG9jYXRpb246IEd1aWRlTG9jYXRpb24pIHtcbiAgICAgICAgbGV0IGV2ZW50S2V5ID0gXCJndWlkZVwiO1xuICAgICAgICBsZXQgdiA9IGxvY2F0aW9uICsgb3ByVHlwZTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJkb3RHdWlkZSA9IFwiLHsgZ3VpZGU6IHYgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZG90KGV2ZW50S2V5LCB7IGd1aWRlOiB2IH0sIFwiZ3VpZGVcIik7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgYXN5bmMgZG90RXZlbnQob3ByVHlwZTogRXZlbnRPcGVyYXRpb25UeXBlLCBsb2NhdGlvbjogRXZlbnRMb2NhdGlvbikge1xuICAgICAgICBsZXQgZXZlbnRLZXkgPSAnZXZlbnQnO1xuICAgICAgICBsZXQgdiA9IGxvY2F0aW9uO1xuICAgICAgICBsZXQgZGF0YSA9IHt9O1xuICAgICAgICBkYXRhW29wclR5cGVdID0gdjtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJkb3RFdmVudCA9IFwiLGRhdGEpO1xuICAgICAgICBhd2FpdCB0aGlzLmRvdChldmVudEtleSwgZGF0YSwgJ2V2ZW50Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvdFNwZWNpYWxQbG90KHNjZW5lSWQ6IG51bWJlciwgcGxvdElkOiBudW1iZXIsIHNlbGVjdEluZGV4OiBudW1iZXIsIGNvbnRlblR5cGU6IFNwZWNpYWxEYXRlQ29udGVudFR5cGUsIGNvbnRlbnRTdGF0dXM6IFNwZWNpYWxEYXRlQ29udGVudFN0YXR1cykge1xuICAgICAgICBsZXQgZXZlbnRLZXkgPSAnc3BlY2lhbF9wbG90JztcbiAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICBzY2VuZTogc2NlbmVJZCxcbiAgICAgICAgICAgIHBsb3Q6IHBsb3RJZCxcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0SW5kZXgsXG4gICAgICAgICAgICBjb250ZW50eXBlOiBjb250ZW5UeXBlLFxuICAgICAgICAgICAgc3RhdHVzOiBjb250ZW50U3RhdHVzXG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJkb3RTcGVjaWFsUGxvdCA9IFwiLCBkYXRhKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kb3QoZXZlbnRLZXksIGRhdGEsICdzcGVjaWFsX3Bsb3QnKTtcbiAgICB9XG5cbn0iXX0=