@cloudbase/app
Version:
cloudbase javascript sdk core
340 lines • 43.7 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.cloudbase = exports.LANGS = exports.getBaseEndPoint = void 0;
var utilities_1 = require("@cloudbase/utilities");
var component_1 = require("./libs/component");
var adapter_1 = require("./libs/adapter");
var cache_1 = require("./libs/cache");
var request_1 = require("./libs/request");
var common_1 = require("./constants/common");
var lang_1 = require("./libs/lang");
var common_2 = require("./constants/common");
Object.defineProperty(exports, "getBaseEndPoint", { enumerable: true, get: function () { return common_2.getBaseEndPoint; } });
var lang_2 = require("./libs/lang");
Object.defineProperty(exports, "LANGS", { enumerable: true, get: function () { return lang_2.LANGS; } });
var useAdapters = utilities_1.adapters.useAdapters, useDefaultAdapter = utilities_1.adapters.useDefaultAdapter;
var ERRORS = utilities_1.constants.ERRORS, COMMUNITY_SITE_URL = utilities_1.constants.COMMUNITY_SITE_URL;
var printWarn = utilities_1.utils.printWarn;
var catchErrorsDecorator = utilities_1.helpers.catchErrorsDecorator;
var DEFAULT_INIT_CONFIG = {
timeout: 15000,
persistence: 'local',
};
var MAX_TIMEOUT = 1000 * 60 * 10;
var MIN_TIMEOUT = 100;
var extensionMap = {};
var Cloudbase = (function () {
function Cloudbase(config) {
this.cloudbaseConfig = config ? config : this.cloudbaseConfig;
this.authInstance = null;
this.oauthInstance = null;
this.version = (0, common_1.getSdkVersion)();
}
Object.defineProperty(Cloudbase.prototype, "config", {
get: function () {
return this.cloudbaseConfig;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Cloudbase.prototype, "platform", {
get: function () {
return adapter_1.Platform;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Cloudbase.prototype, "cache", {
get: function () {
return (0, cache_1.getCacheByEnvId)(this.cloudbaseConfig.env);
},
enumerable: false,
configurable: true
});
Object.defineProperty(Cloudbase.prototype, "localCache", {
get: function () {
return (0, cache_1.getLocalCache)(this.cloudbaseConfig.env);
},
enumerable: false,
configurable: true
});
Object.defineProperty(Cloudbase.prototype, "request", {
get: function () {
return (0, request_1.getRequestByEnvId)(this.cloudbaseConfig.env);
},
enumerable: false,
configurable: true
});
Cloudbase.prototype.init = function (config) {
var _a, _b, _c;
if (config === void 0) { config = { env: '' }; }
config.endPointMode = config.endPointMode || 'GATEWAY';
if (!adapter_1.Platform.adapter) {
this.useDefaultAdapter();
}
config = this.dealNodeAdapterConfig(config);
if (!config.env) {
throw new Error(JSON.stringify({
code: ERRORS.INVALID_PARAMS,
msg: 'env must not be specified',
}));
}
this.isInitialized(config);
var reqConfig = {
timeout: config.timeout || 15000,
timeoutMsg: "[".concat((0, common_1.getSdkName)(), "][REQUEST TIMEOUT] request had been abort since didn't finished within").concat(config.timeout / 1000, "s"),
auth: config.auth,
};
this.requestClient = new adapter_1.Platform.adapter.reqClass(reqConfig);
this.cloudbaseConfig = __assign(__assign(__assign({}, DEFAULT_INIT_CONFIG), config), { i18n: (0, lang_1.i18nProxy)(adapter_1.Platform, config) });
delete this.cloudbaseConfig.lang;
this.cloudbaseConfig.timeout = this.formatTimeout(this.cloudbaseConfig.timeout);
var _d = this.cloudbaseConfig, env = _d.env, persistence = _d.persistence, debug = _d.debug, timeout = _d.timeout, oauthClient = _d.oauthClient, i18n = _d.i18n;
(0, cache_1.initCache)({ env: env, persistence: persistence, debug: debug, platformInfo: this.platform });
(0, common_1.setRegionLevelEndpoint)(env, config.region || '');
(0, common_1.setGatewayEndPointWithEnv)(env, common_1.DEFAULT_PROTOCOL, config.intl);
var app = new Cloudbase(this.cloudbaseConfig);
(0, request_1.initRequest)({
env: env,
region: config.region || '',
timeout: timeout,
oauthClient: oauthClient,
_fromApp: app,
i18n: i18n,
endPointMode: config.endPointMode,
auth: config.auth,
});
app.requestClient = this.requestClient;
(_a = this === null || this === void 0 ? void 0 : this.fire) === null || _a === void 0 ? void 0 : _a.call(this, 'cloudbase_init', app);
this.try2InitAuth(app);
if ((_b = adapter_1.Platform.adapter) === null || _b === void 0 ? void 0 : _b.nodeTool) {
(_c = adapter_1.Platform.adapter) === null || _c === void 0 ? void 0 : _c.nodeTool(app, this.cloudbaseConfig);
}
return app;
};
Cloudbase.prototype.updateConfig = function (config) {
var persistence = config.persistence, debug = config.debug;
this.cloudbaseConfig.persistence = persistence;
this.cloudbaseConfig.debug = debug;
(0, cache_1.initCache)({ env: this.cloudbaseConfig.env, persistence: persistence, debug: debug, platformInfo: this.platform });
};
Cloudbase.prototype.updateLang = function (lang) {
var _a;
if (!lang || lang === ((_a = this.cloudbaseConfig.i18n) === null || _a === void 0 ? void 0 : _a.lang))
return;
this.cloudbaseConfig.i18n.lang = lang;
};
Cloudbase.prototype.registerExtension = function (ext) {
extensionMap[ext.name] = ext;
};
Cloudbase.prototype.invokeExtension = function (name, opts) {
return __awaiter(this, void 0, void 0, function () {
var ext;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
ext = extensionMap[name];
if (!ext) {
throw new Error(JSON.stringify({
code: ERRORS.INVALID_PARAMS,
msg: "extension:".concat(name, " must be registered before invoke"),
}));
}
return [4, ext.invoke(opts, this)];
case 1: return [2, _a.sent()];
}
});
});
};
Cloudbase.prototype.useAdapters = function (adapters, options) {
var _a = useAdapters(adapters, options) || {}, adapter = _a.adapter, runtime = _a.runtime;
adapter && (adapter_1.Platform.adapter = adapter);
runtime && (adapter_1.Platform.runtime = runtime);
};
Cloudbase.prototype.registerHook = function (hook) {
(0, component_1.registerHook)(Cloudbase, hook);
};
Cloudbase.prototype.registerComponent = function (component) {
(0, component_1.registerComponent)(Cloudbase, component);
};
Cloudbase.prototype.registerVersion = function (version) {
(0, common_1.setSdkVersion)(version);
this.version = version;
};
Cloudbase.prototype.registerSdkName = function (name) {
(0, common_1.setSdkName)(name);
};
Cloudbase.prototype.isInitialized = function (config) {
if (config === void 0) { config = this.cloudbaseConfig; }
var PLACEHOLDER_PATTERNS = [
'your-env-id',
'your-envid',
'your_env_id',
'xxx-yyy',
'xxxx-yyy',
'envId',
'env-id',
'your-environment-id',
'REPLACE_ME',
];
if (PLACEHOLDER_PATTERNS.some(function (p) { return config.env.toLowerCase() === p.toLowerCase(); })) {
printWarn(ERRORS.INVALID_PARAMS, "[CloudBase] \u68C0\u6D4B\u5230\u73AF\u5883 ID \"".concat(config.env, "\" \u53EF\u80FD\u662F\u5360\u4F4D\u7B26\uFF0C\u8BF7\u66FF\u6362\u4E3A\u771F\u5B9E\u7684\u73AF\u5883 ID\u3002\n")
+ ' 获取方式:登录腾讯云开发平台 → 环境管理 → 环境设置 → 环境 ID\n'
+ ' 建议通过环境变量配置:process.env.CLOUDBASE_ENV 或 import.meta.env.VITE_CLOUDBASE_ENV');
}
return !!(config === null || config === void 0 ? void 0 : config.env);
};
Cloudbase.prototype.registerEndPoint = function (url, protocol) {
(0, common_1.setEndPointInfo)({ baseUrl: url, protocol: protocol, env: this.config.env, endPointKey: 'CLOUD_API' });
};
Cloudbase.prototype.registerEndPointWithKey = function (props) {
(0, common_1.setEndPointInfo)({
env: this.config.env,
endPointKey: props.key,
baseUrl: props.url,
protocol: props.protocol,
});
};
Cloudbase.prototype.getEndPointWithKey = function (key) {
var info = (0, common_1.getEndPointInfo)(this.config.env, key);
return {
BASE_URL: info.baseUrl,
PROTOCOL: info.protocol,
};
};
Cloudbase.prototype.parseCaptcha = function (url) {
return utilities_1.utils.parseCaptcha(url);
};
Cloudbase.prototype.useDefaultAdapter = function () {
var _a = useDefaultAdapter.bind(this)(), adapter = _a.adapter, runtime = _a.runtime;
adapter_1.Platform.adapter = adapter;
adapter_1.Platform.runtime = runtime;
};
Cloudbase.prototype.formatTimeout = function (timeout) {
switch (true) {
case timeout > MAX_TIMEOUT:
printWarn(ERRORS.INVALID_PARAMS, 'timeout is greater than maximum value[10min]');
return MAX_TIMEOUT;
case timeout < MIN_TIMEOUT:
printWarn(ERRORS.INVALID_PARAMS, 'timeout is less than maximum value[100ms]');
return MIN_TIMEOUT;
default:
return timeout;
}
};
Cloudbase.prototype.try2InitAuth = function (app) {
try {
app.auth();
}
catch (error) {
console.log('try2InitAuth error:', error);
}
};
Cloudbase.prototype.dealNodeAdapterConfig = function (config) {
var _a, _b;
if (typeof process !== 'undefined'
&& typeof process.env !== 'undefined'
&& !process.env.IS_BROWSER_BUILD
&& ((_a = adapter_1.Platform.adapter) === null || _a === void 0 ? void 0 : _a.getSecretInfo)) {
var secretInfo = (_b = adapter_1.Platform.adapter) === null || _b === void 0 ? void 0 : _b.getSecretInfo(config);
config.auth = __assign(__assign({}, config.auth), { secretId: secretInfo.secretId, secretKey: secretInfo.secretKey, sessionToken: secretInfo.sessionToken, secretType: secretInfo.secretType });
if (!config.env) {
config.env = secretInfo.env;
}
if (!config.accessKey && secretInfo.accessKey) {
config.accessKey = secretInfo.accessKey;
}
}
return config;
};
__decorate([
catchErrorsDecorator({
mode: 'sync',
title: 'Cloudbase 初始化失败',
messages: [
'请确认以下各项:',
' 1 - 调用 cloudbase.init() 的语法或参数是否正确',
' 2 - 如果是非浏览器环境,是否配置了安全应用来源(https://docs.cloudbase.net/api-reference/webv3/adapter#%E7%AC%AC-2-%E6%AD%A5%E9%85%8D%E7%BD%AE%E5%AE%89%E5%85%A8%E5%BA%94%E7%94%A8%E6%9D%A5%E6%BA%90)',
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
],
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Cloudbase)
], Cloudbase.prototype, "init", null);
__decorate([
catchErrorsDecorator({
title: '调用扩展能力失败',
messages: [
'请确认以下各项:',
' 1 - 调用 invokeExtension() 的语法或参数是否正确',
' 2 - 被调用的扩展能力是否已经安装并通过 registerExtension() 注册',
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
],
}),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String, Object]),
__metadata("design:returntype", Promise)
], Cloudbase.prototype, "invokeExtension", null);
return Cloudbase;
}());
exports.cloudbase = new Cloudbase();
exports.cloudbase.useAdapters((0, adapter_1.getWxDefaultAdapter)());
exports.default = exports.cloudbase;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBMEU7QUFhMUUsOENBQWtFO0FBQ2xFLDBDQUE4RDtBQUc5RCxzQ0FBd0U7QUFFeEUsMENBQStEO0FBQy9ELDZDQVcyQjtBQUMzQixvQ0FBOEM7QUFDOUMsNkNBQW9EO0FBQTNDLHlHQUFBLGVBQWUsT0FBQTtBQUN4QixvQ0FBbUM7QUFBMUIsNkZBQUEsS0FBSyxPQUFBO0FBQ04sSUFBQSxXQUFXLEdBQXdCLG9CQUFRLFlBQWhDLEVBQUUsaUJBQWlCLEdBQUssb0JBQVEsa0JBQWIsQ0FBYTtBQUMzQyxJQUFBLE1BQU0sR0FBeUIscUJBQVMsT0FBbEMsRUFBRSxrQkFBa0IsR0FBSyxxQkFBUyxtQkFBZCxDQUFjO0FBQ3hDLElBQUEsU0FBUyxHQUFLLGlCQUFLLFVBQVYsQ0FBVTtBQUNuQixJQUFBLG9CQUFvQixHQUFLLG1CQUFPLHFCQUFaLENBQVk7QUFLeEMsSUFBTSxtQkFBbUIsR0FBOEI7SUFDckQsT0FBTyxFQUFFLEtBQUs7SUFDZCxXQUFXLEVBQUUsT0FBTztDQUNyQixDQUFBO0FBR0QsSUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUE7QUFFbEMsSUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFBO0FBRXZCLElBQU0sWUFBWSxHQUE0QixFQUFFLENBQUE7QUFFaEQ7SUFVRSxtQkFBWSxNQUF5QjtRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFBO1FBQzdELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxD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QTtZQUdELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNmLE1BQU0sQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQTthQUM1QjtZQUdELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUU7Z0JBQzdDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQTthQUN4QztTQUNGO1FBRUQsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBM1FNO1FBVk4sb0JBQW9CLENBQUM7WUFDcEIsSUFBSSxFQUFFLE1BQU07WUFDWixLQUFLLEVBQUUsaUJBQWlCO1lBQ3hCLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLHNDQUFzQztnQkFDdEMsbUxBQW1MO2dCQUNuTCxzS0FBNkIsa0JBQWtCLENBQUU7YUFDbEQ7U0FDRixDQUFDOzs7d0NBQ3NFLFNBQVM7eUNBb0VoRjtJQTRCWTtRQVRaLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLHVDQUF1QztnQkFDdkMsZ0RBQWdEO2dCQUNoRCxzS0FBNkIsa0JBQWtCLENBQUU7YUFDbEQ7U0FDRixDQUFDOzs7O29EQVdEO0lBa0tILGdCQUFDO0NBQUEsQUEzVEQsSUEyVEM7QUFNWSxRQUFBLFNBQVMsR0FBZSxJQUFJLFNBQVMsRUFBRSxDQUFBO0FBRXBELGlCQUFTLENBQUMsV0FBVyxDQUFDLElBQUEsNkJBQW1CLEdBQUUsQ0FBQyxDQUFBO0FBRzVDLGtCQUFlLGlCQUFTLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZGFwdGVycywgY29uc3RhbnRzLCB1dGlscywgaGVscGVycyB9IGZyb20gJ0BjbG91ZGJhc2UvdXRpbGl0aWVzJ1xuaW1wb3J0IHsgU0RLQWRhcHRlckludGVyZmFjZSwgQ2xvdWRiYXNlQWRhcHRlciwgSVJlcXVlc3RDb25maWcgfSBmcm9tICdAY2xvdWRiYXNlL2FkYXB0ZXItaW50ZXJmYWNlJ1xuaW1wb3J0IHtcbiAgSUNsb3VkYmFzZUNvbmZpZyxcbiAgSUNsb3VkYmFzZVVwZ3JhZGVkQ29uZmlnLFxuICBJQ2xvdWRiYXNlLFxuICBJQ2xvdWRiYXNlRXh0ZW5zaW9uLFxuICBLVixcbiAgSUNsb3VkYmFzZVBsYXRmb3JtSW5mbyxcbiAgRW5kUG9pbnRLZXksXG4gIElDbG91ZGJhc2VBcGlzLFxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzJ1xuaW1wb3J0IHsgSUNsb3VkYmFzZUF1dGggfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2F1dGgnXG5pbXBvcnQgeyByZWdpc3RlckNvbXBvbmVudCwgcmVnaXN0ZXJIb29rIH0gZnJvbSAnLi9saWJzL2NvbXBvbmVudCdcbmltcG9ydCB7IGdldFd4RGVmYXVsdEFkYXB0ZXIsIFBsYXRmb3JtIH0gZnJvbSAnLi9saWJzL2FkYXB0ZXInXG5pbXBvcnQgeyBJQ2xvdWRiYXNlQ29tcG9uZW50LCBJQ2xvdWRiYXNlSG9vayB9IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvY29tcG9uZW50J1xuaW1wb3J0IHsgSUNsb3VkYmFzZUNhY2hlIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9jYWNoZSdcbmltcG9ydCB7IGluaXRDYWNoZSwgZ2V0Q2FjaGVCeUVudklkLCBnZXRMb2NhbENhY2hlIH0gZnJvbSAnLi9saWJzL2NhY2hlJ1xuaW1wb3J0IHsgSUNsb3VkYmFzZVJlcXVlc3QgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL3JlcXVlc3QnXG5pbXBvcnQgeyBpbml0UmVxdWVzdCwgZ2V0UmVxdWVzdEJ5RW52SWQgfSBmcm9tICcuL2xpYnMvcmVxdWVzdCdcbmltcG9ydCB7XG4gIGdldFNka05hbWUsXG4gIHNldFNka1ZlcnNpb24sXG4gIHNldFJlZ2lvbkxldmVsRW5kcG9pbnQsXG4gIHNldFNka05hbWUsXG4gIHNldEdhdGV3YXlFbmRQb2ludFdpdGhFbnYsXG4gIHR5cGUgSVNldEVuZFBvaW50V2l0aEtleSxcbiAgc2V0RW5kUG9pbnRJbmZvLFxuICBnZXRFbmRQb2ludEluZm8sXG4gIGdldFNka1ZlcnNpb24sXG4gIERFRkFVTFRfUFJPVE9DT0wsXG59IGZyb20gJy4vY29uc3RhbnRzL2NvbW1vbidcbmltcG9ydCB7IGkxOG5Qcm94eSwgTEFOR1MgfSBmcm9tICcuL2xpYnMvbGFuZydcbmV4cG9ydCB7IGdldEJhc2VFbmRQb2ludCB9IGZyb20gJy4vY29uc3RhbnRzL2NvbW1vbidcbmV4cG9ydCB7IExBTkdTIH0gZnJvbSAnLi9saWJzL2xhbmcnXG5jb25zdCB7IHVzZUFkYXB0ZXJzLCB1c2VEZWZhdWx0QWRhcHRlciB9ID0gYWRhcHRlcnNcbmNvbnN0IHsgRVJST1JTLCBDT01NVU5JVFlfU0lURV9VUkwgfSA9IGNvbnN0YW50c1xuY29uc3QgeyBwcmludFdhcm4gfSA9IHV0aWxzXG5jb25zdCB7IGNhdGNoRXJyb3JzRGVjb3JhdG9yIH0gPSBoZWxwZXJzXG5cbi8qKlxuICogQGNvbnN0YW50IOm7mOiupOmFjee9rlxuICovXG5jb25zdCBERUZBVUxUX0lOSVRfQ09ORklHOiBQYXJ0aWFsPElDbG91ZGJhc2VDb25maWc+ID0ge1xuICB0aW1lb3V0OiAxNTAwMCxcbiAgcGVyc2lzdGVuY2U6ICdsb2NhbCcsIC8vIOaMgeS5heWMluWtmOWCqOexu+Wei1xufVxuXG4vLyB0aW1lb3V05LiK6ZmQMTDliIbpkp9cbmNvbnN0IE1BWF9USU1FT1VUID0gMTAwMCAqIDYwICogMTBcbi8vIHRpbWVvdXTkuIvpmZAxMDBtc1xuY29uc3QgTUlOX1RJTUVPVVQgPSAxMDBcblxuY29uc3QgZXh0ZW5zaW9uTWFwOiBLVjxJQ2xvdWRiYXNlRXh0ZW5zaW9uPiA9IHt9XG5cbmNsYXNzIENsb3VkYmFzZSBpbXBsZW1lbnRzIElDbG91ZGJhc2Uge1xuICBwdWJsaWMgYXV0aEluc3RhbmNlOiBJQ2xvdWRiYXNlQXV0aFxuICBwdWJsaWMgb2F1dGhJbnN0YW5jZTogYW55XG4gIHB1YmxpYyByZXF1ZXN0Q2xpZW50OiBhbnlcbiAgcHVibGljIG9hdXRoQ2xpZW50OiBhbnlcbiAgcHVibGljIHZlcnNpb246IHN0cmluZ1xuICBwdWJsaWMgYXV0aDogSUNsb3VkYmFzZVsnYXV0aCddICYgSUNsb3VkYmFzZUF1dGhcbiAgcHVibGljIGFwaXM6IElDbG91ZGJhc2VBcGlzXG4gIHByaXZhdGUgY2xvdWRiYXNlQ29uZmlnOiBJQ2xvdWRiYXNlQ29uZmlnXG5cbiAgY29uc3RydWN0b3IoY29uZmlnPzogSUNsb3VkYmFzZUNvbmZpZykge1xuICAgIHRoaXMuY2xvdWRiYXNlQ29uZmlnID0gY29uZmlnID8gY29uZmlnIDogdGhpcy5jbG91ZGJhc2VDb25maWdcbiAgICB0aGlzLmF1dGhJbnN0YW5jZSA9IG51bGxcbiAgICB0aGlzLm9hdXRoSW5zdGFuY2UgPSBudWxsXG4gICAgdGhpcy52ZXJzaW9uID0gZ2V0U2RrVmVyc2lvbigpXG4gIH1cblxuICBnZXQgY29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLmNsb3VkYmFzZUNvbmZpZ1xuICB9XG5cbiAgZ2V0IHBsYXRmb3JtKCk6IElDbG91ZGJhc2VQbGF0Zm9ybUluZm8ge1xuICAgIHJldHVybiBQbGF0Zm9ybVxuICB9XG5cbiAgZ2V0IGNhY2hlKCk6IElDbG91ZGJhc2VDYWNoZSB7XG4gICAgcmV0dXJuIGdldENhY2hlQnlFbnZJZCh0aGlzLmNsb3VkYmFzZUNvbmZpZy5lbnYpXG4gIH1cblxuICBnZXQgbG9jYWxDYWNoZSgpOiBJQ2xvdWRiYXNlQ2FjaGUge1xuICAgIHJldHVybiBnZXRMb2NhbENhY2hlKHRoaXMuY2xvdWRiYXNlQ29uZmlnLmVudilcbiAgfVxuXG4gIGdldCByZXF1ZXN0KCk6IElDbG91ZGJhc2VSZXF1ZXN0IHtcbiAgICByZXR1cm4gZ2V0UmVxdWVzdEJ5RW52SWQodGhpcy5jbG91ZGJhc2VDb25maWcuZW52KVxuICB9XG5cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICBtb2RlOiAnc3luYycsXG4gICAgdGl0bGU6ICdDbG91ZGJhc2Ug5Yid5aeL5YyW5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGNsb3VkYmFzZS5pbml0KCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlpoLmnpzmmK/pnZ7mtY/op4jlmajnjq/looPvvIzmmK/lkKbphY3nva7kuoblronlhajlupTnlKjmnaXmupDvvIhodHRwczovL2RvY3MuY2xvdWRiYXNlLm5ldC9hcGktcmVmZXJlbmNlL3dlYnYzL2FkYXB0ZXIjJUU3JUFDJUFDLTItJUU2JUFEJUE1JUU5JTg1JThEJUU3JUJEJUFFJUU1JUFFJTg5JUU1JTg1JUE4JUU1JUJBJTk0JUU3JTk0JUE4JUU2JTlEJUE1JUU2JUJBJTkw77yJJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBpbml0KGNvbmZpZzogSUNsb3VkYmFzZUNvbmZpZyAmIHsgbGFuZz86IExBTkdTIH0gPSB7IGVudjogJycgfSk6IENsb3VkYmFzZSB7XG4gICAgY29uZmlnLmVuZFBvaW50TW9kZSA9IGNvbmZpZy5lbmRQb2ludE1vZGUgfHwgJ0dBVEVXQVknXG5cbiAgICAvLyDliJ3lp4vljJbml7boi6XmnKrlhbzlrrnlubPlj7DvvIzliJnkvb/nlKjpu5jorqRhZGFwdGVyXG4gICAgaWYgKCFQbGF0Zm9ybS5hZGFwdGVyKSB7XG4gICAgICB0aGlzLnVzZURlZmF1bHRBZGFwdGVyKClcbiAgICB9XG5cbiAgICAvLyDlnKjliKTmlq1jb25maWcuZW525LmL5YmN77yM5YWI5aSE55CGbm9kZeeOr+Wig+eahOmFjee9rlxuICAgIGNvbmZpZyA9IHRoaXMuZGVhbE5vZGVBZGFwdGVyQ29uZmlnKGNvbmZpZylcblxuICAgIGlmICghY29uZmlnLmVudikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICBtc2c6ICdlbnYgbXVzdCBub3QgYmUgc3BlY2lmaWVkJyxcbiAgICAgIH0pLClcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQoY29uZmlnKVxuXG4gICAgY29uc3QgcmVxQ29uZmlnOiBJUmVxdWVzdENvbmZpZyAmIHsgYXV0aDogSUNsb3VkYmFzZUNvbmZpZ1snYXV0aCddIH0gPSB7XG4gICAgICB0aW1lb3V0OiBjb25maWcudGltZW91dCB8fCAxNTAwMCxcbiAgICAgIHRpbWVvdXRNc2c6IGBbJHtnZXRTZGtOYW1lKCl9XVtSRVFVRVNUIFRJTUVPVVRdIHJlcXVlc3QgaGFkIGJlZW4gYWJvcnQgc2luY2UgZGlkbid0IGZpbmlzaGVkIHdpdGhpbiR7XG4gICAgICAgIGNvbmZpZy50aW1lb3V0IC8gMTAwMFxuICAgICAgfXNgLFxuICAgICAgYXV0aDogY29uZmlnLmF1dGgsXG4gICAgfVxuXG4gICAgdGhpcy5yZXF1ZXN0Q2xpZW50ID0gbmV3IFBsYXRmb3JtLmFkYXB0ZXIucmVxQ2xhc3MocmVxQ29uZmlnKVxuXG4gICAgdGhpcy5jbG91ZGJhc2VDb25maWcgPSB7XG4gICAgICAuLi5ERUZBVUxUX0lOSVRfQ09ORklHLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgaTE4bjogaTE4blByb3h5KFBsYXRmb3JtLCBjb25maWcpLFxuICAgIH1cblxuICAgIGRlbGV0ZSAodGhpcy5jbG91ZGJhc2VDb25maWcgYXMgYW55KS5sYW5nXG4gICAgLy8g5L+u5q2jdGltZW91dOWPluWAvFxuICAgIHRoaXMuY2xvdWRiYXNlQ29uZmlnLnRpbWVvdXQgPSB0aGlzLmZvcm1hdFRpbWVvdXQodGhpcy5jbG91ZGJhc2VDb25maWcudGltZW91dClcbiAgICAvLyDliJ3lp4vljJZjYWNoZeWSjHJlcXVlc3RcbiAgICBjb25zdCB7IGVudiwgcGVyc2lzdGVuY2UsIGRlYnVnLCB0aW1lb3V0LCBvYXV0aENsaWVudCwgaTE4biB9ID0gdGhpcy5jbG91ZGJhc2VDb25maWdcbiAgICBpbml0Q2FjaGUoeyBlbnYsIHBlcnNpc3RlbmNlLCBkZWJ1ZywgcGxhdGZvcm1JbmZvOiB0aGlzLnBsYXRmb3JtIH0pXG5cbiAgICBzZXRSZWdpb25MZXZlbEVuZHBvaW50KGVudiwgY29uZmlnLnJlZ2lvbiB8fCAnJylcbiAgICBzZXRHYXRld2F5RW5kUG9pbnRXaXRoRW52KGVudiwgREVGQVVMVF9QUk9UT0NPTCwgY29uZmlnLmludGwpXG5cbiAgICBjb25zdCBhcHAgPSBuZXcgQ2xvdWRiYXNlKHRoaXMuY2xvdWRiYXNlQ29uZmlnKVxuICAgIGluaXRSZXF1ZXN0KHtcbiAgICAgIGVudixcbiAgICAgIHJlZ2lvbjogY29uZmlnLnJlZ2lvbiB8fCAnJyxcbiAgICAgIHRpbWVvdXQsXG4gICAgICBvYXV0aENsaWVudCxcbiAgICAgIF9mcm9tQXBwOiBhcHAsXG4gICAgICBpMThuLFxuICAgICAgZW5kUG9pbnRNb2RlOiBjb25maWcuZW5kUG9pbnRNb2RlLFxuICAgICAgYXV0aDogY29uZmlnLmF1dGgsXG4gICAgfSlcbiAgICBhcHAucmVxdWVzdENsaWVudCA9IHRoaXMucmVxdWVzdENsaWVudFxuICAgIDsodGhpcyBhcyBhbnkpPy5maXJlPy4oJ2Nsb3VkYmFzZV9pbml0JywgYXBwKVxuXG4gICAgdGhpcy50cnkySW5pdEF1dGgoYXBwKVxuXG4gICAgLy8gbm9kZeeOr+Wig+WPr+S7peS7jmFkYXB0ZXLojrflj5Zub2RlVG9vbOeahOaWueazlVxuICAgIGlmIChQbGF0Zm9ybS5hZGFwdGVyPy5ub2RlVG9vbCkge1xuICAgICAgUGxhdGZvcm0uYWRhcHRlcj8ubm9kZVRvb2woYXBwLCB0aGlzLmNsb3VkYmFzZUNvbmZpZylcbiAgICB9XG5cbiAgICByZXR1cm4gYXBwXG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29uZmlnKGNvbmZpZzogSUNsb3VkYmFzZVVwZ3JhZGVkQ29uZmlnKSB7XG4gICAgY29uc3QgeyBwZXJzaXN0ZW5jZSwgZGVidWcgfSA9IGNvbmZpZ1xuICAgIHRoaXMuY2xvdWRiYXNlQ29uZmlnLnBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2VcbiAgICB0aGlzLmNsb3VkYmFzZUNvbmZpZy5kZWJ1ZyA9IGRlYnVnXG4gICAgLy8gcGVyc2lzdGVuY2XmlLnliqjlvbHlk41jYWNoZVxuICAgIGluaXRDYWNoZSh7IGVudjogdGhpcy5jbG91ZGJhc2VDb25maWcuZW52LCBwZXJzaXN0ZW5jZSwgZGVidWcsIHBsYXRmb3JtSW5mbzogdGhpcy5wbGF0Zm9ybSB9KVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUxhbmcobGFuZzogTEFOR1MpIHtcbiAgICBpZiAoIWxhbmcgfHwgbGFuZyA9PT0gdGhpcy5jbG91ZGJhc2VDb25maWcuaTE4bj8ubGFuZykgcmV0dXJuXG5cbiAgICB0aGlzLmNsb3VkYmFzZUNvbmZpZy5pMThuLmxhbmcgPSBsYW5nXG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJFeHRlbnNpb24oZXh0OiBJQ2xvdWRiYXNlRXh0ZW5zaW9uKSB7XG4gICAgZXh0ZW5zaW9uTWFwW2V4dC5uYW1lXSA9IGV4dFxuICB9XG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfosIPnlKjmianlsZXog73lipvlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggaW52b2tlRXh0ZW5zaW9uKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDooqvosIPnlKjnmoTmianlsZXog73lipvmmK/lkKblt7Lnu4/lronoo4XlubbpgJrov4cgcmVnaXN0ZXJFeHRlbnNpb24oKSDms6jlhownLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGludm9rZUV4dGVuc2lvbihuYW1lOiBzdHJpbmcsIG9wdHM6IGFueSkge1xuICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbk1hcFtuYW1lXVxuICAgIGlmICghZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgIG1zZzogYGV4dGVuc2lvbjoke25hbWV9IG11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgaW52b2tlYCxcbiAgICAgIH0pLClcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgZXh0Lmludm9rZShvcHRzLCB0aGlzKVxuICB9XG5cbiAgcHVibGljIHVzZUFkYXB0ZXJzKGFkYXB0ZXJzOiBDbG91ZGJhc2VBZGFwdGVyIHwgQ2xvdWRiYXNlQWRhcHRlcltdLCBvcHRpb25zPzogYW55KSB7XG4gICAgY29uc3QgeyBhZGFwdGVyLCBydW50aW1lIH0gPSB1c2VBZGFwdGVycyhhZGFwdGVycywgb3B0aW9ucykgfHwge31cbiAgICBhZGFwdGVyICYmIChQbGF0Zm9ybS5hZGFwdGVyID0gYWRhcHRlciBhcyBTREtBZGFwdGVySW50ZXJmYWNlKVxuICAgIHJ1bnRpbWUgJiYgKFBsYXRmb3JtLnJ1bnRpbWUgPSBydW50aW1lIGFzIHN0cmluZylcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlckhvb2soaG9vazogSUNsb3VkYmFzZUhvb2spIHtcbiAgICByZWdpc3Rlckhvb2soQ2xvdWRiYXNlLCBob29rKVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyQ29tcG9uZW50KGNvbXBvbmVudDogSUNsb3VkYmFzZUNvbXBvbmVudCkge1xuICAgIHJlZ2lzdGVyQ29tcG9uZW50KENsb3VkYmFzZSwgY29tcG9uZW50KVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyVmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcpIHtcbiAgICBzZXRTZGtWZXJzaW9uKHZlcnNpb24pXG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvblxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyU2RrTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICBzZXRTZGtOYW1lKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICog5qOA5p+l5b2T5YmNIENsb3VkYmFzZSDlrp7kvovmmK/lkKblt7LlrozmiJDliJ3lp4vljJZcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiBpbXBvcnQgY2xvdWRiYXNlIGZyb20gJ0BjbG91ZGJhc2UvanMtc2RrJ1xuICAgKlxuICAgKiAvLyDliJ3lp4vljJbliY1cbiAgICogY29uc29sZS5sb2coY2xvdWRiYXNlLmlzSW5pdGlhbGl6ZWQoKSkgLy8gZmFsc2VcbiAgICpcbiAgICogY29uc3QgYXBwID0gY2xvdWRiYXNlLmluaXQoeyBlbnY6ICd5b3VyLWVudi1pZCcgfSlcbiAgICpcbiAgICogLy8g5Yid5aeL5YyW5ZCOXG4gICAqIGNvbnNvbGUubG9nKGFwcC5pc0luaXRpYWxpemVkKCkpIC8vIHRydWVcbiAgICogYGBgXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSDmmK/lkKblt7LliJ3lp4vljJZcbiAgICovXG4gIHB1YmxpYyBpc0luaXRpYWxpemVkKGNvbmZpZyA9IHRoaXMuY2xvdWRiYXNlQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgLy8g5qOA5rWL5bi46KeB5Y2g5L2N56ymIGVudiDlgLzvvIzlnKjlvIDlj5HpmLbmrrXnu5nlh7rlj4vlpb3mj5DnpLpcbiAgICBjb25zdCBQTEFDRUhPTERFUl9QQVRURVJOUyA9IFtcbiAgICAgICd5b3VyLWVudi1pZCcsXG4gICAgICAneW91ci1lbnZpZCcsXG4gICAgICAneW91cl9lbnZfaWQnLFxuICAgICAgJ3h4eC15eXknLFxuICAgICAgJ3h4eHgteXl5JyxcbiAgICAgICdlbnZJZCcsXG4gICAgICAnZW52LWlkJyxcbiAgICAgICd5b3VyLWVudmlyb25tZW50LWlkJyxcbiAgICAgICdSRVBMQUNFX01FJyxcbiAgICBdXG4gICAgaWYgKFBMQUNFSE9MREVSX1BBVFRFUk5TLnNvbWUocCA9PiBjb25maWcuZW52LnRvTG93ZXJDYXNlKCkgPT09IHAudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIHByaW50V2FybihcbiAgICAgICAgRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICBgW0Nsb3VkQmFzZV0g5qOA5rWL5Yiw546v5aKDIElEIFwiJHtjb25maWcuZW52fVwiIOWPr+iDveaYr+WNoOS9jeespu+8jOivt+abv+aNouS4uuecn+WunueahOeOr+WigyBJROOAglxcbmBcbiAgICAgICAgICArICcgIOiOt+WPluaWueW8j++8mueZu+W9leiFvuiur+S6keW8gOWPkeW5s+WPsCDihpIg546v5aKD566h55CGIOKGkiDnjq/looPorr7nva4g4oaSIOeOr+WigyBJRFxcbidcbiAgICAgICAgICArICcgIOW7uuiurumAmui/h+eOr+Wig+WPmOmHj+mFjee9ru+8mnByb2Nlc3MuZW52LkNMT1VEQkFTRV9FTlYg5oiWIGltcG9ydC5tZXRhLmVudi5WSVRFX0NMT1VEQkFTRV9FTlYnLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiAhIWNvbmZpZz8uZW52XG4gIH1cblxuICAvKiog6K6+572uIHRjYiBhcGkg55qEIGVuZHBvaW50ICovXG4gIHB1YmxpYyByZWdpc3RlckVuZFBvaW50KHVybDogc3RyaW5nLCBwcm90b2NvbD86ICdodHRwJyB8ICdodHRwcycpIHtcbiAgICBzZXRFbmRQb2ludEluZm8oeyBiYXNlVXJsOiB1cmwsIHByb3RvY29sLCBlbnY6IHRoaXMuY29uZmlnLmVudiwgZW5kUG9pbnRLZXk6ICdDTE9VRF9BUEknIH0pXG4gIH1cblxuICAvKiog6K6+572u572R5YWzL3RjYiBhcGnnmoQgZW5kUG9pbnTvvIzpgJrov4cga2V5IOaMh+WumiAqL1xuICBwdWJsaWMgcmVnaXN0ZXJFbmRQb2ludFdpdGhLZXkocHJvcHM6IElTZXRFbmRQb2ludFdpdGhLZXkpIHtcbiAgICBzZXRFbmRQb2ludEluZm8oe1xuICAgICAgZW52OiB0aGlzLmNvbmZpZy5lbnYsXG4gICAgICBlbmRQb2ludEtleTogcHJvcHMua2V5LFxuICAgICAgYmFzZVVybDogcHJvcHMudXJsLFxuICAgICAgcHJvdG9jb2w6IHByb3BzLnByb3RvY29sLFxuICAgIH0pXG4gIH1cblxuICAvKiog5ou/572R5YWzL3RjYiBhcGnnmoQgZW5kUG9pbnTvvIzpgJrov4cga2V5IOaMh+WumiAqL1xuICBwdWJsaWMgZ2V0RW5kUG9pbnRXaXRoS2V5KGtleTogRW5kUG9pbnRLZXkpIHtcbiAgICBjb25zdCBpbmZvID0gZ2V0RW5kUG9pbnRJbmZvKHRoaXMuY29uZmlnLmVudiwga2V5KVxuICAgIHJldHVybiB7XG4gICAgICBCQVNFX1VSTDogaW5mby5iYXNlVXJsLFxuICAgICAgUFJPVE9DT0w6IGluZm8ucHJvdG9jb2wsXG4gICAgfVxuICB9XG5cbiAgLy8g6Kej5p6QVVJM5Y+C5pWwXG4gIHB1YmxpYyBwYXJzZUNhcHRjaGEodXJsKSB7XG4gICAgcmV0dXJuIHV0aWxzLnBhcnNlQ2FwdGNoYSh1cmwpXG4gIH1cblxuICBwcml2YXRlIHVzZURlZmF1bHRBZGFwdGVyKCkge1xuICAgIGNvbnN0IHsgYWRhcHRlciwgcnVudGltZSB9ID0gdXNlRGVmYXVsdEFkYXB0ZXIuYmluZCh0aGlzKSgpXG4gICAgUGxhdGZvcm0uYWRhcHRlciA9IGFkYXB0ZXIgYXMgU0RLQWRhcHRlckludGVyZmFjZVxuICAgIFBsYXRmb3JtLnJ1bnRpbWUgPSBydW50aW1lIGFzIHN0cmluZ1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcikge1xuICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgY2FzZSB0aW1lb3V0ID4gTUFYX1RJTUVPVVQ6XG4gICAgICAgIHByaW50V2FybihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICd0aW1lb3V0IGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIHZhbHVlWzEwbWluXScpXG4gICAgICAgIHJldHVybiBNQVhfVElNRU9VVFxuICAgICAgY2FzZSB0aW1lb3V0IDwgTUlOX1RJTUVPVVQ6XG4gICAgICAgIHByaW50V2FybihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICd0aW1lb3V0IGlzIGxlc3MgdGhhbiBtYXhpbXVtIHZhbHVlWzEwMG1zXScpXG4gICAgICAgIHJldHVybiBNSU5fVElNRU9VVFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRpbWVvdXRcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyeTJJbml0QXV0aChhcHApIHtcbiAgICB0cnkge1xuICAgICAgYXBwLmF1dGgoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZygndHJ5MkluaXRBdXRoIGVycm9yOicsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlpITnkIYgTm9kZSDnjq/looPkuIsgYWRhcHRlciDnmoTphY3nva7kv6Hmga9cbiAgICog5ZyoIE5vZGUg546v5aKD5Lit77yM6YCa6L+HIGFkYXB0ZXIg6Ieq5Yqo6I635Y+W5a+G6ZKl44CB546v5aKDSUTjgIFhY2Nlc3NLZXkg562J6YWN572u77yMXG4gICAqIOWHj+WwkeeUqOaIt+aJi+WKqOS8oOWFpemFjee9rueahOi0n+aLhVxuICAgKiBAcGFyYW0gY29uZmlnIC0g5LqR5byA5Y+R5Yid5aeL5YyW6YWN572u5a+56LGhXG4gICAqIEByZXR1cm5zIOihpeWFheS6hiBOb2RlIGFkYXB0ZXIg5L+h5oGv5ZCO55qE6YWN572u5a+56LGhXG4gICAqL1xuICBwcml2YXRlIGRlYWxOb2RlQWRhcHRlckNvbmZpZyhjb25maWc6IElDbG91ZGJhc2VDb25maWcpIHtcbiAgICAvLyBub2Rl546v5aKD5Y+v5Lul5LuOYWRhcHRlcuiOt+WPlum7mOiupOeahHNlY3JldElk5ZKMc2VjcmV0S2V5XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnXG4gICAgICAmJiB0eXBlb2YgcHJvY2Vzcy5lbnYgIT09ICd1bmRlZmluZWQnXG4gICAgICAmJiAhcHJvY2Vzcy5lbnYuSVNfQlJPV1NFUl9CVUlMRFxuICAgICAgJiYgUGxhdGZvcm0uYWRhcHRlcj8uZ2V0U2VjcmV0SW5mb1xuICAgICkge1xuICAgICAgY29uc3Qgc2VjcmV0SW5mbyA9IFBsYXRmb3JtLmFkYXB0ZXI/LmdldFNlY3JldEluZm8oY29uZmlnKVxuICAgICAgLy8g5bCGIGFkYXB0ZXIg5o+Q5L6b55qE5a+G6ZKl5L+h5oGv5YaZ5YWlIGNvbmZpZy5hdXRoXG4gICAgICBjb25maWcuYXV0aCA9IHtcbiAgICAgICAgLi4uY29uZmlnLmF1dGgsXG4gICAgICAgIHNlY3JldElkOiBzZWNyZXRJbmZvLnNlY3JldElkLFxuICAgICAgICBzZWNyZXRLZXk6IHNlY3JldEluZm8uc2VjcmV0S2V5LFxuICAgICAgICBzZXNzaW9uVG9rZW46IHNlY3JldEluZm8uc2Vzc2lvblRva2VuLFxuICAgICAgICBzZWNyZXRUeXBlOiBzZWNyZXRJbmZvLnNlY3JldFR5cGUgYXMgYW55LFxuICAgICAgfVxuXG4gICAgICAvLyBub2RlIOeOr+Wig+WPr+iDveWPr+S7peS7juS4iuS4i+aWh+iOt+WPlmVudu+8jOeUqOaIt+acquaYvuW8j+aMh+WumuaXtuiHquWKqOWhq+WFhVxuICAgICAgaWYgKCFjb25maWcuZW52KSB7XG4gICAgICAgIGNvbmZpZy5lbnYgPSBzZWNyZXRJbmZvLmVudlxuICAgICAgfVxuXG4gICAgICAvLyBub2RlIGFkYXB0ZXLnjq/looPog73or7vlj5bliLAgcHJvY2Vzcy5lbnYuQ0xPVURCQVNFX0FQSUtFWSDml7bvvIzlnKjmsqHmnInkvKDlhaVhY2Nlc3NLZXnml7bvvIzkvb/nlKggbm9kZSBhZGFwdGVyIOaPkOS+m+eahCBhY2Nlc3NLZXnvvIhwcm9jZXNzLmVudi5DTE9VREJBU0VfQVBJS0VZ77yJXG4gICAgICBpZiAoIWNvbmZpZy5hY2Nlc3NLZXkgJiYgc2VjcmV0SW5mby5hY2Nlc3NLZXkpIHtcbiAgICAgICAgY29uZmlnLmFjY2Vzc0tleSA9IHNlY3JldEluZm8uYWNjZXNzS2V5XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG59XG5cbi8vIOexu+Wei+WvvOWHulxuZXhwb3J0IHR5cGUgeyBDbG91ZGJhc2UgfVxuXG4vLyDlgLzlr7zlh7pcbmV4cG9ydCBjb25zdCBjbG91ZGJhc2U6IElDbG91ZGJhc2UgPSBuZXcgQ2xvdWRiYXNlKClcblxuY2xvdWRiYXNlLnVzZUFkYXB0ZXJzKGdldFd4RGVmYXVsdEFkYXB0ZXIoKSlcblxuLy8g6buY6K6k5a+85Ye65a6e5L6LXG5leHBvcnQgZGVmYXVsdCBjbG91ZGJhc2VcbiJdfQ==