@cloudbase/app
Version:
cloudbase javascript sdk core
205 lines • 20.5 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 __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 };
}
};
var _a;
import { utils } from '@cloudbase/utilities';
import { ReadableStream } from 'web-streams-polyfill';
import { ERROR, checkCustomUserIdRegex } from './constants';
import { lookupAppId } from './metadata';
export var isFormData = (_a = utils, _a.isFormData), toQueryString = _a.toQueryString;
export function getEnv(key) {
if (typeof process === 'undefined' || !process.env) {
return key !== undefined ? undefined : {};
}
return key !== undefined ? process.env[key] : process.env;
}
export var checkIsInScf = function () { return getEnv('TENCENTCLOUD_RUNENV') === 'SCF'; };
export function checkIsInCBR() {
return !!getEnv('CBR_ENV_ID');
}
var kSumeruEnvSet = new Set(['formal', 'pre', 'test']);
export function checkIsInSumeru() {
return kSumeruEnvSet.has(getEnv('SUMERU_ENV') || '');
}
export function isNonEmptyString(str) {
return typeof str === 'string' && str !== '';
}
export function checkIsInTencentCloud() {
return __awaiter(this, void 0, void 0, function () {
var _a;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
if (getEnv('TENCENTCLOUD') === 'true') {
return [2, true];
}
_a = isNonEmptyString;
return [4, lookupAppId()];
case 1: return [2, _a.apply(void 0, [_b.sent()])];
}
});
});
}
export var getCurrRunEnvTag = function () { return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (checkIsInScf()) {
return [2, 'scf'];
}
if (checkIsInCBR()) {
return [2, 'cbr'];
}
if (checkIsInSumeru()) {
return [2, 'sumeru'];
}
return [4, checkIsInTencentCloud()];
case 1:
if (_a.sent()) {
return [2, 'tencentcloud'];
}
return [2, 'unknown'];
}
});
}); };
export var validateUid = function (uid) {
if (typeof uid !== 'string') {
throw __assign(__assign({}, ERROR.INVALID_PARAM), { message: 'uid must be a string' });
}
if (!checkCustomUserIdRegex.test(uid)) {
throw __assign(__assign({}, ERROR.INVALID_PARAM), { message: "Invalid uid: \"".concat(uid, "\"") });
}
};
export function safeParseJson(text) {
if (!text || !text.trim()) {
return null;
}
try {
return JSON.parse(text);
}
catch (e) {
console.warn('catch an error', { e: e, text: text });
return text;
}
}
export function obj2StrRecord(obj) {
return Object.entries(obj).reduce(function (acc, cur) {
var key = cur[0], value = cur[1];
acc[key] = String(value);
return acc;
}, {});
}
export function headersInit2Indexable(h) {
if (isHeaders(h)) {
var ret_1 = {};
h.forEach(function (val, key) {
ret_1[key] = val;
});
return ret_1;
}
return h;
function isHeaders(h) {
try {
return h instanceof Headers;
}
catch (_) {
return false;
}
}
}
export function parseQueryString(search) {
var params = {};
var cleanSearch = search.replace(/^[?#]/, '');
if (!cleanSearch) {
return params;
}
var pairs = cleanSearch.split('&');
pairs.forEach(function (item) {
var _a = item.split('='), key = _a[0], value = _a[1];
key = decodeURIComponent(key);
value = decodeURIComponent(value || '');
if (key) {
if (params[key]) {
if (Array.isArray(params[key])) {
params[key].push(value);
}
else {
params[key] = [params[key], value];
}
}
else {
params[key] = value;
}
}
});
return params;
}
export function createWebStreamFromNodeReadableStream(stream) {
var asyncIterator = stream[Symbol.asyncIterator]();
return new ReadableStream({
pull: function (controller) {
return __awaiter(this, void 0, void 0, function () {
var next;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4, asyncIterator.next()];
case 1:
next = _a.sent();
if (next.done) {
controller.close();
}
else {
controller.enqueue(next.value);
}
return [2];
}
});
});
},
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGlicy9hZGFwdGVyLW5vZGUvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFHeEMsTUFBTSxDQUFTLElBQUEsVUFBVSxJQUFaLEtBQWdDLEtBRzVDLGdCQUh3QixFQUFFLGFBQWEsbUJBQUEsQ0FHdkM7QUFRRCxNQUFNLFVBQVUsTUFBTSxDQUFDLEdBQVk7SUFDakMsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ2xELE9BQU8sR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7S0FDMUM7SUFDRCxPQUFPLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7QUFDM0QsQ0FBQztBQUdELE1BQU0sQ0FBQyxJQUFNLFlBQVksR0FBRyxjQUFNLE9BQUEsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssS0FBSyxFQUF2QyxDQUF1QyxDQUFBO0FBRXpFLE1BQU0sVUFBVSxZQUFZO0lBRTFCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtBQUMvQixDQUFDO0FBRUQsSUFBTSxhQUFhLEdBQUcsSUFB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QyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUE7aUJBQ25DO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTthQUNwQjtTQUNGO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDRixPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUM7QUFNRCxNQUFNLFVBQVUscUNBQXFDLENBQUMsTUFBNkI7SUFDakYsSUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFBO0lBRXBELE9BQU8sSUFBSSxjQUFjLENBQUM7UUFDbEIsSUFBSSxZQUFDLFVBQVU7Ozs7O2dDQUNOLFdBQU0sYUFBYSxDQUFDLElBQUksRUFBRSxFQUFBOzs0QkFBakMsSUFBSSxHQUFHLFNBQTBCOzRCQUV2QyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0NBQ2IsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFBOzZCQUNuQjtpQ0FBTTtnQ0FDTCxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTs2QkFDL0I7Ozs7O1NBQ0Y7S0FDRixDQUFDLENBQUE7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcbmltcG9ydCB7IFJlYWRhYmxlU3RyZWFtIH0gZnJvbSAnd2ViLXN0cmVhbXMtcG9seWZpbGwnXG5pbXBvcnQgeyBFUlJPUiwgY2hlY2tDdXN0b21Vc2VySWRSZWdleCB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgbG9va3VwQXBwSWQgfSBmcm9tICcuL21ldGFkYXRhJ1xuXG4vKiog5LuOIEBjbG91ZGJhc2UvdXRpbGl0aWVzIOS4reaPkOWPlueahOihqOWNleWSjOafpeivouWtl+espuS4suW3peWFtyAqL1xuZXhwb3J0IGNvbnN0IHsgaXNGb3JtRGF0YSwgdG9RdWVyeVN0cmluZyB9ID0gdXRpbHMgYXMge1xuICBpc0Zvcm1EYXRhOiAob2JqOiB1bmtub3duKSA9PiBib29sZWFuXG4gIHRvUXVlcnlTdHJpbmc6IChkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBzdHJpbmdcbn1cblxuLyoqXG4gKiDot6jnq6/lronlhajojrflj5bnjq/looPlj5jph49cbiAqIFdlYiDnq6/jgIHlsI/muLjmiI/nq6/nrYnmsqHmnIkgcHJvY2VzcyDlhajlsYDlr7nosaHvvIznm7TmjqXorr/pl64gcHJvY2Vzcy5lbnYg5Lya5oql6ZSZXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPlxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudihrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZFxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudihrZXk/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJyB8fCAhcHJvY2Vzcy5lbnYpIHtcbiAgICByZXR1cm4ga2V5ICE9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7fVxuICB9XG4gIHJldHVybiBrZXkgIT09IHVuZGVmaW5lZCA/IHByb2Nlc3MuZW52W2tleV0gOiBwcm9jZXNzLmVudlxufVxuXG4vKiog5Yik5pat5b2T5YmN5piv5ZCm5ZyoIFNDRu+8iOS6keWHveaVsO+8iei/kOihjOeOr+Wig+S4rSAqL1xuZXhwb3J0IGNvbnN0IGNoZWNrSXNJblNjZiA9ICgpID0+IGdldEVudignVEVOQ0VOVENMT1VEX1JVTkVOVicpID09PSAnU0NGJ1xuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc0luQ0JSKCkge1xuICAvLyBDQlIgPSBDTE9VREJBU0VfUlVOXG4gIHJldHVybiAhIWdldEVudignQ0JSX0VOVl9JRCcpXG59XG5cbmNvbnN0IGtTdW1lcnVFbnZTZXQgPSBuZXcgU2V0KFsnZm9ybWFsJywgJ3ByZScsICd0ZXN0J10pXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc0luU3VtZXJ1KCkge1xuICAvLyBTVU1FUlVfRU5WPWZvcm1hbCB8IHRlc3QgfCBwcmVcbiAgcmV0dXJuIGtTdW1lcnVFbnZTZXQuaGFzKGdldEVudignU1VNRVJVX0VOVicpIHx8ICcnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOb25FbXB0eVN0cmluZyhzdHI6IHN0cmluZykge1xuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyICE9PSAnJ1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tJc0luVGVuY2VudENsb3VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoZ2V0RW52KCdURU5DRU5UQ0xPVUQnKSA9PT0gJ3RydWUnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gaXNOb25FbXB0eVN0cmluZyhhd2FpdCBsb29rdXBBcHBJZCgpKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Q3VyclJ1bkVudlRhZyA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBpZiAoY2hlY2tJc0luU2NmKCkpIHtcbiAgICByZXR1cm4gJ3NjZidcbiAgfSBpZiAoY2hlY2tJc0luQ0JSKCkpIHtcbiAgICByZXR1cm4gJ2NicidcbiAgfSBpZiAoY2hlY2tJc0luU3VtZXJ1KCkpIHtcbiAgICByZXR1cm4gJ3N1bWVydSdcbiAgfSBpZiAoYXdhaXQgY2hlY2tJc0luVGVuY2VudENsb3VkKCkpIHtcbiAgICByZXR1cm4gJ3RlbmNlbnRjbG91ZCdcbiAgfVxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbi8qKlxuICog5qCh6aqM6Ieq5a6a5LmJ55So5oi3IElEIOagvOW8j1xuICogQHRocm93cyDmoLzlvI/kuI3lkIjms5Xml7bmipvlh7ogSU5WQUxJRF9QQVJBTSDplJnor69cbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVWlkID0gKHVpZDogc3RyaW5nKTogdm9pZCA9PiB7XG4gIGlmICh0eXBlb2YgdWlkICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IHsgLi4uRVJST1IuSU5WQUxJRF9QQVJBTSwgbWVzc2FnZTogJ3VpZCBtdXN0IGJlIGEgc3RyaW5nJyB9XG4gIH1cbiAgaWYgKCFjaGVja0N1c3RvbVVzZXJJZFJlZ2V4LnRlc3QodWlkKSkge1xuICAgIHRocm93IHsgLi4uRVJST1IuSU5WQUxJRF9QQVJBTSwgbWVzc2FnZTogYEludmFsaWQgdWlkOiBcIiR7dWlkfVwiYCB9XG4gIH1cbn1cblxuLyoqXG4gKiDlronlhajnmoQgSlNPTiDop6PmnpDvvIzop6PmnpDlpLHotKXml7bov5Tlm57ljp/lp4vmlofmnKzogIzpnZ7mipvlvILluLhcbiAqIEBwYXJhbSB0ZXh0IC0g5b6F6Kej5p6Q55qE5a2X56ym5LiyXG4gKiBAcmV0dXJucyDop6PmnpDlkI7nmoTlr7nosaHvvIznqbrlrZfnrKbkuLLov5Tlm54gbnVsbO+8jOino+aekOWksei0pei/lOWbnuWOn+Wni+aWh+acrFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FmZVBhcnNlSnNvbih0ZXh0OiBzdHJpbmcpOiBhbnkge1xuICBpZiAoIXRleHQgfHwgIXRleHQudHJpbSgpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLndhcm4oJ2NhdGNoIGFuIGVycm9yJywgeyBlLCB0ZXh0IH0pXG4gICAgcmV0dXJuIHRleHRcbiAgfVxufVxuXG4vKipcbiAqIOWwhuWvueixoeeahOaJgOacieWAvOi9rOS4uuWtl+espuS4suexu+Wei1xuICog55So5LqO5bCGIGhlYWRlcnMg562J5a+56LGh57uf5LiA5Li6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9iajJTdHJSZWNvcmQob2JqOiBvYmplY3QpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaikucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KChhY2MsIGN1cjogW3N0cmluZywgdW5rbm93bl0pID0+IHtcbiAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBjdXJcbiAgICBhY2Nba2V5XSA9IFN0cmluZyh2YWx1ZSlcbiAgICByZXR1cm4gYWNjXG4gIH0sIHt9KVxufVxuXG4vKipcbiAqIOWwhiBIZWFkZXJzSW5pdCDovazkuLrlj6/ntKLlvJXnmoTmma7pgJrlr7nosaFcbiAqIOWFvOWuuSBIZWFkZXJzIOWunuS+i+WSjOaZrumAmuWvueixoeS4pOenjeW9ouW8j1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGVhZGVyc0luaXQySW5kZXhhYmxlKGg6IEhlYWRlcnNJbml0KSB7XG4gIGlmIChpc0hlYWRlcnMoaCkpIHtcbiAgICBjb25zdCByZXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgIGguZm9yRWFjaCgodmFsLCBrZXkpID0+IHtcbiAgICAgIHJldFtrZXldID0gdmFsXG4gICAgfSlcbiAgICByZXR1cm4gcmV0XG4gIH1cbiAgcmV0dXJuIGhcblxuICBmdW5jdGlvbiBpc0hlYWRlcnMoaDogSGVhZGVyc0luaXQpOiBoIGlzIEhlYWRlcnMge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb2RlIOS9jueJiOacrOWPr+iDveayoeacieWFqOWxgCBIZWFkZXJzXG4gICAgICByZXR1cm4gaCBpbnN0YW5jZW9mIEhlYWRlcnNcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiDmiYvliqjop6PmnpDmn6Xor6LlrZfnrKbkuLLvvIzpgb/lhY0gVVJMU2VhcmNoUGFyYW1zIOeahOWFvOWuueaAp+mXrumimFxuICog5pSv5oyB6YeN5aSNIGtleSDoh6rliqjovazkuLrmlbDnu4RcbiAqIEBwYXJhbSBzZWFyY2ggLSDmn6Xor6LlrZfnrKbkuLLvvIzlj6/luKbliY3lr7wgPyDmiJYgI1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZyhzZWFyY2g6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIGNvbnN0IHBhcmFtczogYW55ID0ge31cbiAgY29uc3QgY2xlYW5TZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXls/I10vLCAnJylcblxuICBpZiAoIWNsZWFuU2VhcmNoKSB7XG4gICAgcmV0dXJuIHBhcmFtc1xuICB9XG5cbiAgY29uc3QgcGFpcnMgPSBjbGVhblNlYXJjaC5zcGxpdCgnJicpXG5cbiAgcGFpcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGxldCBba2V5LCB2YWx1ZV0gPSBpdGVtLnNwbGl0KCc9JylcbiAgICBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5KVxuICAgIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlIHx8ICcnKVxuICAgIGlmIChrZXkpIHtcbiAgICAgIGlmIChwYXJhbXNba2V5XSkge1xuICAgICAgICAvLyDlt7LlrZjlnKjlkIzlkI0ga2V577yM6L2s5Li65pWw57uEXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtc1trZXldKSkge1xuICAgICAgICAgIHBhcmFtc1trZXldLnB1c2godmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyYW1zW2tleV0gPSBbcGFyYW1zW2tleV0sIHZhbHVlXVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gcGFyYW1zXG59XG5cbi8qKlxuICog5bCGIE5vZGUgUmVhZGFibGVTdHJlYW0g6L2s5o2i5Li6IFdlYiBSZWFkYWJsZVN0cmVhbSAocG9seWZpbGwpXG4gKiDnlKjkuo4gZmV0Y2gg5rWB5byP5ZON5bqU5ZyoIE5vZGUg546v5aKD5LiL55qE6YCC6YWNXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTdHJlYW1Gcm9tTm9kZVJlYWRhYmxlU3RyZWFtKHN0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtKTogUmVhZGFibGVTdHJlYW0ge1xuICBjb25zdCBhc3luY0l0ZXJhdG9yID0gc3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpXG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgYXN5bmMgcHVsbChjb250cm9sbGVyKSB7XG4gICAgICBjb25zdCBuZXh0ID0gYXdhaXQgYXN5bmNJdGVyYXRvci5uZXh0KClcblxuICAgICAgaWYgKG5leHQuZG9uZSkge1xuICAgICAgICBjb250cm9sbGVyLmNsb3NlKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXh0LnZhbHVlKVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG59XG4iXX0=