link-type-definitions
Version:
link type definitions
387 lines (304 loc) • 47.3 kB
JavaScript
;
require("core-js/modules/es.array.filter");
require("core-js/modules/es.array.index-of");
require("core-js/modules/es.array.iterator");
require("core-js/modules/es.array.map");
require("core-js/modules/es.array.slice");
require("core-js/modules/es.object.get-own-property-descriptors");
require("core-js/modules/es.promise");
require("core-js/modules/es.set");
require("core-js/modules/es.string.replace");
require("core-js/modules/es.string.split");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = linkTypeDefinitions;
exports.linkGlob = linkGlob;
exports.setup = setup;
exports.findDefinitionsPath = findDefinitionsPath;
exports.writeLinkedDirectives = writeLinkedDirectives;
exports.createLinkedDirectives = createLinkedDirectives;
var _execa = _interopRequireDefault(require("execa"));
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _globby = _interopRequireDefault(require("globby"));
var _newregexp = _interopRequireDefault(require("newregexp"));
var _ora = _interopRequireDefault(require("ora"));
var _os = _interopRequireDefault(require("os"));
var _path = _interopRequireDefault(require("path"));
var _pkgDir = _interopRequireDefault(require("pkg-dir"));
var _package = _interopRequireDefault(require("../package.json"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
const packageName = _package.default.name;
const packageVersion = _package.default.version;
function linkTypeDefinitions() {
return _linkTypeDefinitions.apply(this, arguments);
}
function _linkTypeDefinitions() {
_linkTypeDefinitions = _asyncToGenerator(function* (partialOptions = {}, spinner = (0, _ora.default)()) {
let options = _objectSpread({
copy: true,
cwd: process.cwd(),
dryRun: false,
ns: `_${packageName}`,
save: false,
unlink: false,
verbose: false
}, partialOptions);
try {
var _require;
const pkgOptions = (_require = require(_path.default.resolve(options.cwd, 'package.json'))) === null || _require === void 0 ? void 0 : _require.linkTypeDefinitionsOptions;
delete pkgOptions.cwd;
delete pkgOptions.moduleName;
delete pkgOptions.save;
delete pkgOptions.unlink;
options = _objectSpread(_objectSpread(_objectSpread({}, options), pkgOptions), partialOptions);
} catch (err) {}
if (options.verbose) {
spinner.info(`OPTIONS: ${JSON.stringify(options, null, 2)}`);
}
const rootPath = (yield (0, _pkgDir.default)(options.cwd)) || options.cwd;
const installedFromPath = /\/node_modules\/.*/g.test(options.cwd) ? options.cwd.replace(/\/node_modules\/.*/g, '') : null;
const typesLocationPath = installedFromPath ? _path.default.resolve(installedFromPath, 'node_modules/@types', options.ns) : _path.default.resolve(rootPath, 'node_modules/@types', options.ns);
const pkgPath = _path.default.resolve(rootPath, 'package.json');
if (!(yield _fsExtra.default.pathExists(pkgPath))) return;
let pkg;
try {
pkg = require(pkgPath);
} catch (err) {}
if (!pkg) return;
let _pkg = pkg,
linkTypeDefinitions = _pkg.linkTypeDefinitions;
if (options.moduleName) linkTypeDefinitions = [options.moduleName];
if (!linkTypeDefinitions.length) return;
yield Promise.all(linkTypeDefinitions.map( /*#__PURE__*/function () {
var _ref = _asyncToGenerator(function* (moduleName) {
var _pkg2, _pkg3;
const dependencies = new Set(pkg ? [...Object.keys(((_pkg2 = pkg) === null || _pkg2 === void 0 ? void 0 : _pkg2.dependencies) || {}), ...Object.keys(((_pkg3 = pkg) === null || _pkg3 === void 0 ? void 0 : _pkg3.devDependencies) || {})] : []);
if (moduleName.substr(0, 2) !== './' && !dependencies.has(moduleName) && !options.unlink) {
if (options.moduleName) {
spinner.stop();
spinner.fail(`cannot link unless '${moduleName}' is saved in dependencies or devDependencies in the package.json file`);
process.exit(1);
}
spinner.stop();
spinner.warn(`'${moduleName}' not saved in dependencies or devDependencies in the package.json file`);
return;
}
if (pkg && options.save && options.moduleName) {
if (!options.dryRun) {
const linkTypeDefinitionsSet = new Set([...(pkg.linkTypeDefinitions || []), ...linkTypeDefinitions]);
if (options.unlink) linkTypeDefinitionsSet.delete(options.moduleName);
pkg.linkTypeDefinitions = [...linkTypeDefinitionsSet];
yield _fsExtra.default.writeJson(pkgPath, pkg, {
spaces: 2
});
}
if (options.dryRun || options.verbose) {
spinner.info(`updated ${pkgPath}`);
}
}
if (moduleName.substr(0, 2) === './') {
if (installedFromPath) {
var _pkg4;
yield linkGlob(_path.default.resolve(rootPath, moduleName), options, typesLocationPath, _path.default.resolve(...(pkg ? [(_pkg4 = pkg) === null || _pkg4 === void 0 ? void 0 : _pkg4.name] : []), moduleName).slice(process.cwd().length + 1), spinner);
}
} else if (!installedFromPath) {
const modulePath = _path.default.resolve(rootPath, 'node_modules', moduleName);
const definitionsPath = yield findDefinitionsPath(modulePath);
yield linkGlob(definitionsPath, options, typesLocationPath, moduleName, spinner);
}
});
return function (_x10) {
return _ref.apply(this, arguments);
};
}()));
if (!options.dryRun) {
yield writeLinkedDirectives(typesLocationPath, options.ns);
}
});
return _linkTypeDefinitions.apply(this, arguments);
}
function linkGlob(_x, _x2, _x3, _x4, _x5) {
return _linkGlob.apply(this, arguments);
}
function _linkGlob() {
_linkGlob = _asyncToGenerator(function* (rootGlobPath, options, typesLocationPath, moduleName, spinner) {
yield Promise.all((yield (0, _globby.default)(_path.default.resolve(rootGlobPath, '**/*.d.ts?(x)'))).map( /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator(function* (globPath) {
const relativeGlobPath = globPath.slice(rootGlobPath.length + 1);
if ((options.ignorePaths || []).reduce((shouldIgnore, ignorePath) => {
if (shouldIgnore) return shouldIgnore;
if ((0, _newregexp.default)(ignorePath).test(globPath)) return true;
return shouldIgnore;
}, false)) {
if (!options.dryRun) {
yield _fsExtra.default.remove(_path.default.resolve(typesLocationPath, moduleName, relativeGlobPath));
}
if (options.dryRun || options.verbose) {
spinner.fail(`${_path.default.resolve(typesLocationPath, moduleName, relativeGlobPath)}`);
}
return true;
}
if (!options.dryRun) {
yield _fsExtra.default.remove(_path.default.resolve(typesLocationPath, moduleName, relativeGlobPath));
}
if (options.unlink) {
if (options.dryRun || options.verbose) {
spinner.fail(`${_path.default.resolve(typesLocationPath, moduleName, relativeGlobPath)}`);
}
} else {
if (!options.dryRun) {
yield _fsExtra.default.mkdirs(_path.default.resolve(typesLocationPath, moduleName));
if (options.copy) {
yield _fsExtra.default.copy(_path.default.resolve(rootGlobPath, relativeGlobPath), _path.default.resolve(typesLocationPath, moduleName, relativeGlobPath));
} else {
yield _fsExtra.default.symlink(_path.default.resolve(rootGlobPath, relativeGlobPath), _path.default.resolve(typesLocationPath, moduleName, relativeGlobPath), 'file');
}
}
if (options.dryRun || options.verbose) {
spinner.info(`${_path.default.resolve(rootGlobPath, relativeGlobPath)} ${options.copy ? '=>' : '->'} ${_path.default.resolve(typesLocationPath, moduleName, relativeGlobPath)}`);
}
}
});
return function (_x11) {
return _ref2.apply(this, arguments);
};
}()));
});
return _linkGlob.apply(this, arguments);
}
function setup(_x6) {
return _setup.apply(this, arguments);
}
function _setup() {
_setup = _asyncToGenerator(function* (partialOptions, spinner = (0, _ora.default)()) {
var _scripts$postinstall;
let options = _objectSpread({
cwd: process.cwd(),
dryRun: false,
install: true,
typesLocation: '',
verbose: false
}, partialOptions);
try {
var _require2;
const pkgOptions = (_require2 = require(_path.default.resolve(options.cwd, 'package.json'))) === null || _require2 === void 0 ? void 0 : _require2.linkTypeDefinitionsOptions;
options = _objectSpread(_objectSpread(_objectSpread({}, options), pkgOptions), partialOptions);
} catch (err) {}
if (options.verbose) {
spinner.info(`OPTIONS: ${JSON.stringify(options, null, 2)}`);
}
const rootPath = (yield (0, _pkgDir.default)(_path.default.resolve(options.cwd))) || options.cwd;
const pkgPath = _path.default.resolve(rootPath, 'package.json');
if (!(yield _fsExtra.default.pathExists(pkgPath))) return false;
let pkg;
try {
pkg = require(pkgPath);
} catch (err) {}
if (!pkg) return false;
const _pkg5 = pkg,
linkTypeDefinitions = _pkg5.linkTypeDefinitions,
scripts = _pkg5.scripts;
if (linkTypeDefinitions || pkg.linkTypeDefinitionsOptions) {
spinner.warn(`project already setup with ${packageName}`);
return false;
}
pkg.linkTypeDefinitions = [];
let postinstall = `${packageName} link`;
if (scripts === null || scripts === void 0 ? void 0 : (_scripts$postinstall = scripts.postinstall) === null || _scripts$postinstall === void 0 ? void 0 : _scripts$postinstall.length) {
postinstall = `${scripts.postinstall} && ${postinstall}`;
}
pkg = _objectSpread(_objectSpread({}, pkg), {}, {
scripts: _objectSpread(_objectSpread({}, pkg.scripts || {}), {}, {
postinstall
}),
devDependencies: _objectSpread(_objectSpread({}, pkg.devDependencies || {}), {}, {
[packageName]: `^${packageVersion}`
})
});
if (!options.dryRun) yield _fsExtra.default.writeJson(pkgPath, pkg, {
spaces: 2
});
if (options.dryRun || options.verbose) spinner.info(`updated ${pkgPath}`);
if (options.install) {
const npm = yield getNpm();
yield (0, _execa.default)(npm, ['install'], {
stdio: 'inherit'
});
}
return true;
});
return _setup.apply(this, arguments);
}
function getNpm() {
return _getNpm.apply(this, arguments);
}
function _getNpm() {
_getNpm = _asyncToGenerator(function* (npms = ['pnpm', 'yarn', 'npm', 'chipchop']) {
const foundNpms = new Set();
yield Promise.all(npms.map( /*#__PURE__*/function () {
var _ref3 = _asyncToGenerator(function* (npm) {
const isWin = _os.default.platform().indexOf('win') > -1;
const where = isWin ? 'where' : 'which';
try {
const p = yield (0, _execa.default)(where, [npm]);
if (!p.exitCode) foundNpms.add(npm);
} catch (err) {}
});
return function (_x12) {
return _ref3.apply(this, arguments);
};
}()));
return npms.reduce((foundNpm, npm) => {
if (foundNpm) return foundNpm;
if (foundNpms.has(npm)) return npm;
return foundNpm;
}, null) || 'npm';
});
return _getNpm.apply(this, arguments);
}
function findDefinitionsPath(_x7) {
return _findDefinitionsPath.apply(this, arguments);
}
function _findDefinitionsPath() {
_findDefinitionsPath = _asyncToGenerator(function* (modulePath) {
const definitionsPathsHashMap = (yield (0, _globby.default)(_path.default.resolve(modulePath, '**/*.d.ts?(x)'))).reduce((definitionsPathsHashMap, globPath) => {
const globPathArray = globPath.split('/');
const key = (globPathArray.length - 1).toString();
const definitionsPaths = definitionsPathsHashMap[key] || [];
definitionsPaths.push(globPathArray.slice(0, globPathArray.length - 1).join('/'));
definitionsPathsHashMap[key] = definitionsPaths;
return definitionsPathsHashMap;
}, {});
const definitionsPaths = definitionsPathsHashMap[Math.min(...Object.keys(definitionsPathsHashMap).map(key => Number(key))).toString()];
if (definitionsPaths.length === 1) return definitionsPaths[0];
const defintionsPathArray = definitionsPaths[0].split('/');
return defintionsPathArray.slice(0, defintionsPathArray.length - 1).join('/');
});
return _findDefinitionsPath.apply(this, arguments);
}
function writeLinkedDirectives(_x8, _x9) {
return _writeLinkedDirectives.apply(this, arguments);
}
function _writeLinkedDirectives() {
_writeLinkedDirectives = _asyncToGenerator(function* (typesLocationPath, ns) {
const relativeTypePathsSet = new Set((yield (0, _globby.default)(_path.default.resolve(typesLocationPath, '**/*.d.ts'))).map(typePath => {
return typePath.slice(typesLocationPath.length + 1);
}));
relativeTypePathsSet.delete('index.d.ts');
const relativeTypePaths = [...relativeTypePathsSet];
const linkedDirectives = createLinkedDirectives(relativeTypePaths, ns);
yield _fsExtra.default.mkdirs(typesLocationPath);
yield _fsExtra.default.writeFile(_path.default.resolve(typesLocationPath, 'index.d.ts'), linkedDirectives);
});
return _writeLinkedDirectives.apply(this, arguments);
}
function createLinkedDirectives(filePaths, ns = '_') {
return [...filePaths.map(filePath => `/// <reference path="${filePath}" />`), `declare module '${ns}' {}`].join('\n');
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6WyJwYWNrYWdlTmFtZSIsInBrZyIsIm5hbWUiLCJwYWNrYWdlVmVyc2lvbiIsInZlcnNpb24iLCJsaW5rVHlwZURlZmluaXRpb25zIiwicGFydGlhbE9wdGlvbnMiLCJzcGlubmVyIiwib3B0aW9ucyIsImNvcHkiLCJjd2QiLCJwcm9jZXNzIiwiZHJ5UnVuIiwibnMiLCJzYXZlIiwidW5saW5rIiwidmVyYm9zZSIsInBrZ09wdGlvbnMiLCJyZXF1aXJlIiwicGF0aCIsInJlc29sdmUiLCJsaW5rVHlwZURlZmluaXRpb25zT3B0aW9ucyIsIm1vZHVsZU5hbWUiLCJlcnIiLCJpbmZvIiwiSlNPTiIsInN0cmluZ2lmeSIsInJvb3RQYXRoIiwiaW5zdGFsbGVkRnJvbVBhdGgiLCJ0ZXN0IiwicmVwbGFjZSIsInR5cGVzTG9jYXRpb25QYXRoIiwicGtnUGF0aCIsImZzIiwicGF0aEV4aXN0cyIsImxlbmd0aCIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJkZXBlbmRlbmNpZXMiLCJTZXQiLCJPYmplY3QiLCJrZXlzIiwiZGV2RGVwZW5kZW5jaWVzIiwic3Vic3RyIiwiaGFzIiwic3RvcCIsImZhaWwiLCJleGl0Iiwid2FybiIsImxpbmtUeXBlRGVmaW5pdGlvbnNTZXQiLCJkZWxldGUiLCJ3cml0ZUpzb24iLCJzcGFjZXMiLCJsaW5rR2xvYiIsInNsaWNlIiwibW9kdWxlUGF0aCIsImRlZmluaXRpb25zUGF0aCIsImZpbmREZWZpbml0aW9uc1BhdGgiLCJ3cml0ZUxpbmtlZERpcmVjdGl2ZXMiLCJyb290R2xvYlBhdGgiLCJnbG9iUGF0aCIsInJlbGF0aXZlR2xvYlBhdGgiLCJpZ25vcmVQYXRocyIsInJlZHVjZSIsInNob3VsZElnbm9yZSIsImlnbm9yZVBhdGgiLCJyZW1vdmUiLCJta2RpcnMiLCJzeW1saW5rIiwic2V0dXAiLCJpbnN0YWxsIiwidHlwZXNMb2NhdGlvbiIsInNjcmlwdHMiLCJwb3N0aW5zdGFsbCIsIm5wbSIsImdldE5wbSIsInN0ZGlvIiwibnBtcyIsImZvdW5kTnBtcyIsImlzV2luIiwib3MiLCJwbGF0Zm9ybSIsImluZGV4T2YiLCJ3aGVyZSIsInAiLCJleGl0Q29kZSIsImFkZCIsImZvdW5kTnBtIiwiZGVmaW5pdGlvbnNQYXRoc0hhc2hNYXAiLCJnbG9iUGF0aEFycmF5Iiwic3BsaXQiLCJrZXkiLCJ0b1N0cmluZyIsImRlZmluaXRpb25zUGF0aHMiLCJwdXNoIiwiam9pbiIsIk1hdGgiLCJtaW4iLCJOdW1iZXIiLCJkZWZpbnRpb25zUGF0aEFycmF5IiwicmVsYXRpdmVUeXBlUGF0aHNTZXQiLCJ0eXBlUGF0aCIsInJlbGF0aXZlVHlwZVBhdGhzIiwibGlua2VkRGlyZWN0aXZlcyIsImNyZWF0ZUxpbmtlZERpcmVjdGl2ZXMiLCJ3cml0ZUZpbGUiLCJmaWxlUGF0aHMiLCJmaWxlUGF0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxNQUFNQSxXQUFXLEdBQUdDLGlCQUFJQyxJQUF4QjtBQUNBLE1BQU1DLGNBQWMsR0FBR0YsaUJBQUlHLE9BQTNCOztTQTZCOEJDLG1COzs7OzsyQ0FBZixXQUNiQyxjQUFtRCxHQUFHLEVBRHpDLEVBRWJDLE9BQU8sR0FBRyxtQkFGRyxFQUdiO0FBQ0EsUUFBSUMsT0FBbUM7QUFDckNDLE1BQUFBLElBQUksRUFBRSxJQUQrQjtBQUVyQ0MsTUFBQUEsR0FBRyxFQUFFQyxPQUFPLENBQUNELEdBQVIsRUFGZ0M7QUFHckNFLE1BQUFBLE1BQU0sRUFBRSxLQUg2QjtBQUlyQ0MsTUFBQUEsRUFBRSxFQUFHLElBQUdiLFdBQVksRUFKaUI7QUFLckNjLE1BQUFBLElBQUksRUFBRSxLQUwrQjtBQU1yQ0MsTUFBQUEsTUFBTSxFQUFFLEtBTjZCO0FBT3JDQyxNQUFBQSxPQUFPLEVBQUU7QUFQNEIsT0FRbENW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QURJLEVBRUp5RSxnQkFGSSxDQUFOO0FBSUQsRzs7OztBQUVNLFNBQVNDLHNCQUFULENBQWdDRSxTQUFoQyxFQUFxRDlGLEVBQUUsR0FBRyxHQUExRCxFQUF1RTtBQUM1RSxTQUFPLENBQ0wsR0FBRzhGLFNBQVMsQ0FBQ3JFLEdBQVYsQ0FDQXNFLFFBQUQsSUFBdUIsd0JBQXVCQSxRQUFTLE1BRHRELENBREUsRUFJSixtQkFBa0IvRixFQUFHLE1BSmpCLEVBS0xtRixJQUxLLENBS0EsSUFMQSxDQUFQO0FBTUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXhlY2EgZnJvbSAnZXhlY2EnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBnbG9iYnkgZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCBuZXdSZWdFeHAgZnJvbSAnbmV3cmVnZXhwJztcbmltcG9ydCBvcmEsIHsgT3JhIH0gZnJvbSAnb3JhJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBwa2dEaXIgZnJvbSAncGtnLWRpcic7XG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5cbmNvbnN0IHBhY2thZ2VOYW1lID0gcGtnLm5hbWU7XG5jb25zdCBwYWNrYWdlVmVyc2lvbiA9IHBrZy52ZXJzaW9uO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBrZyB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGlua1R5cGVEZWZpbml0aW9uczogc3RyaW5nW107XG4gIGxpbmtUeXBlRGVmaW5pdGlvbnNPcHRpb25zOiBQYXJ0aWFsPExpbmtUeXBlRGVmaW5pdGlvbnNPcHRpb25zPjtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUeXBlRGVmaW5pdGlvbnNPcHRpb25zIHtcbiAgY29weTogYm9vbGVhbjtcbiAgY3dkOiBzdHJpbmc7XG4gIGRyeVJ1bjogYm9vbGVhbjtcbiAgaWdub3JlUGF0aHM/OiBzdHJpbmdbXTtcbiAgbW9kdWxlTmFtZT86IHN0cmluZztcbiAgbnM6IHN0cmluZztcbiAgc2F2ZTogYm9vbGVhbjtcbiAgdW5saW5rOiBib29sZWFuO1xuICB2ZXJib3NlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHVwT3B0aW9ucyB7XG4gIGN3ZDogc3RyaW5nO1xuICBkcnlSdW46IGJvb2xlYW47XG4gIGluc3RhbGw6IGJvb2xlYW47XG4gIHR5cGVzTG9jYXRpb246IHN0cmluZztcbiAgdmVyYm9zZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gbGlua1R5cGVEZWZpbml0aW9ucyhcbiAgcGFydGlhbE9wdGlvbnM6IFBhcnRpYWw8TGlua1R5cGVEZWZpbml0aW9uc09wdGlvbnM+ID0ge30sXG4gIHNwaW5uZXIgPSBvcmEoKVxuKSB7XG4gIGxldCBvcHRpb25zOiBMaW5rVHlwZURlZmluaXRpb25zT3B0aW9ucyA9IHtcbiAgICBjb3B5OiB0cnVlLFxuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBkcnlSdW46IGZhbHNlLFxuICAgIG5zOiBgXyR7cGFja2FnZU5hbWV9YCxcbiAgICBzYXZlOiBmYWxzZSxcbiAgICB1bmxpbms6IGZhbHNlLFxuICAgIHZlcmJvc2U6IGZhbHNlLFxuICAgIC4uLnBhcnRpYWxPcHRpb25zXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcGtnT3B0aW9ucyA9IHJlcXVpcmUocGF0aC5yZXNvbHZlKG9wdGlvbnMuY3dkLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/LmxpbmtUeXBlRGVmaW5pdGlvbnNPcHRpb25zO1xuICAgIGRlbGV0ZSBwa2dPcHRpb25zLmN3ZDtcbiAgICBkZWxldGUgcGtnT3B0aW9ucy5tb2R1bGVOYW1lO1xuICAgIGRlbGV0ZSBwa2dPcHRpb25zLnNhdmU7XG4gICAgZGVsZXRlIHBrZ09wdGlvbnMudW5saW5rO1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgLi4ucGtnT3B0aW9ucyxcbiAgICAgIC4uLnBhcnRpYWxPcHRpb25zXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7fVxuICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgc3Bpbm5lci5pbmZvKGBPUFRJT05TOiAke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMsIG51bGwsIDIpfWApO1xuICB9XG4gIGNvbnN0IHJvb3RQYXRoID0gKGF3YWl0IHBrZ0RpcihvcHRpb25zLmN3ZCkpIHx8IG9wdGlvbnMuY3dkO1xuICBjb25zdCBpbnN0YWxsZWRGcm9tUGF0aCA9IC9cXC9ub2RlX21vZHVsZXNcXC8uKi9nLnRlc3Qob3B0aW9ucy5jd2QpXG4gICAgPyBvcHRpb25zLmN3ZC5yZXBsYWNlKC9cXC9ub2RlX21vZHVsZXNcXC8uKi9nLCAnJylcbiAgICA6IG51bGw7XG4gIGNvbnN0IHR5cGVzTG9jYXRpb25QYXRoID0gaW5zdGFsbGVkRnJvbVBhdGhcbiAgICA/IHBhdGgucmVzb2x2ZShpbnN0YWxsZWRGcm9tUGF0aCwgJ25vZGVfbW9kdWxlcy9AdHlwZXMnLCBvcHRpb25zLm5zKVxuICAgIDogcGF0aC5yZXNvbHZlKHJvb3RQYXRoLCAnbm9kZV9tb2R1bGVzL0B0eXBlcycsIG9wdGlvbnMubnMpO1xuICBjb25zdCBwa2dQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGlmICghKGF3YWl0IGZzLnBhdGhFeGlzdHMocGtnUGF0aCkpKSByZXR1cm47XG4gIGxldCBwa2c6IFBrZyB8IHZvaWQ7XG4gIHRyeSB7XG4gICAgcGtnID0gcmVxdWlyZShwa2dQYXRoKTtcbiAgfSBjYXRjaCAoZXJyKSB7fVxuICBpZiAoIXBrZykgcmV0dXJuO1xuICBsZXQgeyBsaW5rVHlwZURlZmluaXRpb25zIH0gPSBwa2c7XG4gIGlmIChvcHRpb25zLm1vZHVsZU5hbWUpIGxpbmtUeXBlRGVmaW5pdGlvbnMgPSBbb3B0aW9ucy5tb2R1bGVOYW1lXTtcbiAgaWYgKCFsaW5rVHlwZURlZmluaXRpb25zLmxlbmd0aCkgcmV0dXJuO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBsaW5rVHlwZURlZmluaXRpb25zLm1hcChhc3luYyAobW9kdWxlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFxuICAgICAgICBwa2dcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LmtleXMocGtnPy5kZXBlbmRlbmNpZXMgfHwge30pLFxuICAgICAgICAgICAgICAuLi5PYmplY3Qua2V5cyhwa2c/LmRldkRlcGVuZGVuY2llcyB8fCB7fSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBtb2R1bGVOYW1lLnN1YnN0cigwLCAyKSAhPT0gJy4vJyAmJlxuICAgICAgICAhZGVwZW5kZW5jaWVzLmhhcyhtb2R1bGVOYW1lKSAmJlxuICAgICAgICAhb3B0aW9ucy51bmxpbmtcbiAgICAgICkge1xuICAgICAgICBpZiAob3B0aW9ucy5tb2R1bGVOYW1lKSB7XG4gICAgICAgICAgc3Bpbm5lci5zdG9wKCk7XG4gICAgICAgICAgc3Bpbm5lci5mYWlsKFxuICAgICAgICAgICAgYGNhbm5vdCBsaW5rIHVubGVzcyAnJHttb2R1bGVOYW1lfScgaXMgc2F2ZWQgaW4gZGVwZW5kZW5jaWVzIG9yIGRldkRlcGVuZGVuY2llcyBpbiB0aGUgcGFja2FnZS5qc29uIGZpbGVgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgc3Bpbm5lci5zdG9wKCk7XG4gICAgICAgIHNwaW5uZXIud2FybihcbiAgICAgICAgICBgJyR7bW9kdWxlTmFtZX0nIG5vdCBzYXZlZCBpbiBkZXBlbmRlbmNpZXMgb3IgZGV2RGVwZW5kZW5jaWVzIGluIHRoZSBwYWNrYWdlLmpzb24gZmlsZWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHBrZyAmJiBvcHRpb25zLnNhdmUgJiYgb3B0aW9ucy5tb2R1bGVOYW1lKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICBjb25zdCBsaW5rVHlwZURlZmluaXRpb25zU2V0ID0gbmV3IFNldChbXG4gICAgICAgICAgICAuLi4ocGtnLmxpbmtUeXBlRGVmaW5pdGlvbnMgfHwgW10pLFxuICAgICAgICAgICAgLi4ubGlua1R5cGVEZWZpbml0aW9uc1xuICAgICAgICAgIF0pO1xuICAgICAgICAgIGlmIChvcHRpb25zLnVubGluaykgbGlua1R5cGVEZWZpbml0aW9uc1NldC5kZWxldGUob3B0aW9ucy5tb2R1bGVOYW1lKTtcbiAgICAgICAgICBwa2cubGlua1R5cGVEZWZpbml0aW9ucyA9IFsuLi5saW5rVHlwZURlZmluaXRpb25zU2V0XTtcbiAgICAgICAgICBhd2FpdCBmcy53cml0ZUpzb24ocGtnUGF0aCwgcGtnLCB7IHNwYWNlczogMiB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5kcnlSdW4gfHwgb3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgc3Bpbm5lci5pbmZvKGB1cGRhdGVkICR7cGtnUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1vZHVsZU5hbWUuc3Vic3RyKDAsIDIpID09PSAnLi8nKSB7XG4gICAgICAgIGlmIChpbnN0YWxsZWRGcm9tUGF0aCkge1xuICAgICAgICAgIGF3YWl0IGxpbmtHbG9iKFxuICAgICAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3RQYXRoLCBtb2R1bGVOYW1lKSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICB0eXBlc0xvY2F0aW9uUGF0aCxcbiAgICAgICAgICAgIHBhdGhcbiAgICAgICAgICAgICAgLnJlc29sdmUoLi4uKHBrZyA/IFtwa2c/Lm5hbWVdIDogW10pLCBtb2R1bGVOYW1lKVxuICAgICAgICAgICAgICAuc2xpY2UocHJvY2Vzcy5jd2QoKS5sZW5ndGggKyAxKSxcbiAgICAgICAgICAgIHNwaW5uZXJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpbnN0YWxsZWRGcm9tUGF0aCkge1xuICAgICAgICBjb25zdCBtb2R1bGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RQYXRoLCAnbm9kZV9tb2R1bGVzJywgbW9kdWxlTmFtZSk7XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb25zUGF0aCA9IGF3YWl0IGZpbmREZWZpbml0aW9uc1BhdGgobW9kdWxlUGF0aCk7XG4gICAgICAgIGF3YWl0IGxpbmtHbG9iKFxuICAgICAgICAgIGRlZmluaXRpb25zUGF0aCxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHR5cGVzTG9jYXRpb25QYXRoLFxuICAgICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgICAgc3Bpbm5lclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG4gIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICBhd2FpdCB3cml0ZUxpbmtlZERpcmVjdGl2ZXModHlwZXNMb2NhdGlvblBhdGgsIG9wdGlvbnMubnMpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW5rR2xvYihcbiAgcm9vdEdsb2JQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IExpbmtUeXBlRGVmaW5pdGlvbnNPcHRpb25zLFxuICB0eXBlc0xvY2F0aW9uUGF0aDogc3RyaW5nLFxuICBtb2R1bGVOYW1lOiBzdHJpbmcsXG4gIHNwaW5uZXI6IE9yYVxuKSB7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIChhd2FpdCBnbG9iYnkocGF0aC5yZXNvbHZlKHJvb3RHbG9iUGF0aCwgJyoqLyouZC50cz8oeCknKSkpLm1hcChcbiAgICAgIGFzeW5jIChnbG9iUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlR2xvYlBhdGggPSBnbG9iUGF0aC5zbGljZShyb290R2xvYlBhdGgubGVuZ3RoICsgMSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAob3B0aW9ucy5pZ25vcmVQYXRocyB8fCBbXSkucmVkdWNlKFxuICAgICAgICAgICAgKHNob3VsZElnbm9yZTogYm9vbGVhbiwgaWdub3JlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChzaG91bGRJZ25vcmUpIHJldHVybiBzaG91bGRJZ25vcmU7XG4gICAgICAgICAgICAgIGlmIChuZXdSZWdFeHAoaWdub3JlUGF0aCkudGVzdChnbG9iUGF0aCkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gc2hvdWxkSWdub3JlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5yZW1vdmUoXG4gICAgICAgICAgICAgIHBhdGgucmVzb2x2ZSh0eXBlc0xvY2F0aW9uUGF0aCwgbW9kdWxlTmFtZSwgcmVsYXRpdmVHbG9iUGF0aClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcHRpb25zLmRyeVJ1biB8fCBvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIHNwaW5uZXIuZmFpbChcbiAgICAgICAgICAgICAgYCR7cGF0aC5yZXNvbHZlKHR5cGVzTG9jYXRpb25QYXRoLCBtb2R1bGVOYW1lLCByZWxhdGl2ZUdsb2JQYXRoKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgYXdhaXQgZnMucmVtb3ZlKFxuICAgICAgICAgICAgcGF0aC5yZXNvbHZlKHR5cGVzTG9jYXRpb25QYXRoLCBtb2R1bGVOYW1lLCByZWxhdGl2ZUdsb2JQYXRoKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMudW5saW5rKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuIHx8IG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgc3Bpbm5lci5mYWlsKFxuICAgICAgICAgICAgICBgJHtwYXRoLnJlc29sdmUodHlwZXNMb2NhdGlvblBhdGgsIG1vZHVsZU5hbWUsIHJlbGF0aXZlR2xvYlBhdGgpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLm1rZGlycyhwYXRoLnJlc29sdmUodHlwZXNMb2NhdGlvblBhdGgsIG1vZHVsZU5hbWUpKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvcHkpIHtcbiAgICAgICAgICAgICAgYXdhaXQgZnMuY29weShcbiAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUocm9vdEdsb2JQYXRoLCByZWxhdGl2ZUdsb2JQYXRoKSxcbiAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUodHlwZXNMb2NhdGlvblBhdGgsIG1vZHVsZU5hbWUsIHJlbGF0aXZlR2xvYlBhdGgpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhd2FpdCBmcy5zeW1saW5rKFxuICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShyb290R2xvYlBhdGgsIHJlbGF0aXZlR2xvYlBhdGgpLFxuICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZSh0eXBlc0xvY2F0aW9uUGF0aCwgbW9kdWxlTmFtZSwgcmVsYXRpdmVHbG9iUGF0aCksXG4gICAgICAgICAgICAgICAgJ2ZpbGUnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcHRpb25zLmRyeVJ1biB8fCBvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIHNwaW5uZXIuaW5mbyhcbiAgICAgICAgICAgICAgYCR7cGF0aC5yZXNvbHZlKHJvb3RHbG9iUGF0aCwgcmVsYXRpdmVHbG9iUGF0aCl9ICR7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jb3B5ID8gJz0+JyA6ICctPidcbiAgICAgICAgICAgICAgfSAke3BhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICB0eXBlc0xvY2F0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICAgICAgICAgIHJlbGF0aXZlR2xvYlBhdGhcbiAgICAgICAgICAgICAgKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIClcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBwYXJ0aWFsT3B0aW9uczogUGFydGlhbDxTZXR1cE9wdGlvbnM+LFxuICBzcGlubmVyID0gb3JhKClcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBsZXQgb3B0aW9uczogU2V0dXBPcHRpb25zID0ge1xuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBkcnlSdW46IGZhbHNlLFxuICAgIGluc3RhbGw6IHRydWUsXG4gICAgdHlwZXNMb2NhdGlvbjogJycsXG4gICAgdmVyYm9zZTogZmFsc2UsXG4gICAgLi4ucGFydGlhbE9wdGlvbnNcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa2dPcHRpb25zID0gcmVxdWlyZShwYXRoLnJlc29sdmUob3B0aW9ucy5jd2QsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8ubGlua1R5cGVEZWZpbml0aW9uc09wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAuLi5wa2dPcHRpb25zLFxuICAgICAgLi4ucGFydGlhbE9wdGlvbnNcbiAgICB9O1xuICB9IGNhdGNoIChlcnIpIHt9XG4gIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICBzcGlubmVyLmluZm8oYE9QVElPTlM6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucywgbnVsbCwgMil9YCk7XG4gIH1cbiAgY29uc3Qgcm9vdFBhdGggPSAoYXdhaXQgcGtnRGlyKHBhdGgucmVzb2x2ZShvcHRpb25zLmN3ZCkpKSB8fCBvcHRpb25zLmN3ZDtcbiAgY29uc3QgcGtnUGF0aCA9IHBhdGgucmVzb2x2ZShyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIShhd2FpdCBmcy5wYXRoRXhpc3RzKHBrZ1BhdGgpKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgcGtnOiBQa2cgfCB2b2lkO1xuICB0cnkge1xuICAgIHBrZyA9IHJlcXVpcmUocGtnUGF0aCk7XG4gIH0gY2F0Y2ggKGVycikge31cbiAgaWYgKCFwa2cpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgeyBsaW5rVHlwZURlZmluaXRpb25zLCBzY3JpcHRzIH0gPSBwa2c7XG4gIGlmIChsaW5rVHlwZURlZmluaXRpb25zIHx8IHBrZy5saW5rVHlwZURlZmluaXRpb25zT3B0aW9ucykge1xuICAgIHNwaW5uZXIud2FybihgcHJvamVjdCBhbHJlYWR5IHNldHVwIHdpdGggJHtwYWNrYWdlTmFtZX1gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcGtnLmxpbmtUeXBlRGVmaW5pdGlvbnMgPSBbXTtcbiAgbGV0IHBvc3RpbnN0YWxsID0gYCR7cGFja2FnZU5hbWV9IGxpbmtgO1xuICBpZiAoc2NyaXB0cz8ucG9zdGluc3RhbGw/Lmxlbmd0aCkge1xuICAgIHBvc3RpbnN0YWxsID0gYCR7c2NyaXB0cy5wb3N0aW5zdGFsbH0gJiYgJHtwb3N0aW5zdGFsbH1gO1xuICB9XG4gIHBrZyA9IHtcbiAgICAuLi5wa2csXG4gICAgc2NyaXB0czoge1xuICAgICAgLi4uKHBrZy5zY3JpcHRzIHx8IHt9KSxcbiAgICAgIHBvc3RpbnN0YWxsXG4gICAgfSxcbiAgICBkZXZEZXBlbmRlbmNpZXM6IHtcbiAgICAgIC4uLihwa2cuZGV2RGVwZW5kZW5jaWVzIHx8IHt9KSxcbiAgICAgIFtwYWNrYWdlTmFtZV06IGBeJHtwYWNrYWdlVmVyc2lvbn1gXG4gICAgfVxuICB9O1xuICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSBhd2FpdCBmcy53cml0ZUpzb24ocGtnUGF0aCwgcGtnLCB7IHNwYWNlczogMiB9KTtcbiAgaWYgKG9wdGlvbnMuZHJ5UnVuIHx8IG9wdGlvbnMudmVyYm9zZSkgc3Bpbm5lci5pbmZvKGB1cGRhdGVkICR7cGtnUGF0aH1gKTtcbiAgaWYgKG9wdGlvbnMuaW5zdGFsbCkge1xuICAgIGNvbnN0IG5wbSA9IGF3YWl0IGdldE5wbSgpO1xuICAgIGF3YWl0IGV4ZWNhKG5wbSwgWydpbnN0YWxsJ10sIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TnBtKFxuICBucG1zID0gWydwbnBtJywgJ3lhcm4nLCAnbnBtJywgJ2NoaXBjaG9wJ11cbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZvdW5kTnBtczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIG5wbXMubWFwKGFzeW5jIChucG06IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgaXNXaW4gPSBvcy5wbGF0Zm9ybSgpLmluZGV4T2YoJ3dpbicpID4gLTE7XG4gICAgICBjb25zdCB3aGVyZSA9IGlzV2luID8gJ3doZXJlJyA6ICd3aGljaCc7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwID0gYXdhaXQgZXhlY2Eod2hlcmUsIFtucG1dKTtcbiAgICAgICAgaWYgKCFwLmV4aXRDb2RlKSBmb3VuZE5wbXMuYWRkKG5wbSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHt9XG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIChcbiAgICBucG1zLnJlZHVjZSgoZm91bmROcG06IHN0cmluZyB8IG51bGwsIG5wbTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZm91bmROcG0pIHJldHVybiBmb3VuZE5wbTtcbiAgICAgIGlmIChmb3VuZE5wbXMuaGFzKG5wbSkpIHJldHVybiBucG07XG4gICAgICByZXR1cm4gZm91bmROcG07XG4gICAgfSwgbnVsbCkgfHwgJ25wbSdcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZWZpbml0aW9uc1BhdGgobW9kdWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGVmaW5pdGlvbnNQYXRoc0hhc2hNYXAgPSAoXG4gICAgYXdhaXQgZ2xvYmJ5KHBhdGgucmVzb2x2ZShtb2R1bGVQYXRoLCAnKiovKi5kLnRzPyh4KScpKVxuICApLnJlZHVjZShcbiAgICAoZGVmaW5pdGlvbnNQYXRoc0hhc2hNYXA6IERlZmluaXRpb25zUGF0aEhhc2hNYXAsIGdsb2JQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGdsb2JQYXRoQXJyYXkgPSBnbG9iUGF0aC5zcGxpdCgnLycpO1xuICAgICAgY29uc3Qga2V5ID0gKGdsb2JQYXRoQXJyYXkubGVuZ3RoIC0gMSkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGRlZmluaXRpb25zUGF0aHMgPSBkZWZpbml0aW9uc1BhdGhzSGFzaE1hcFtrZXldIHx8IFtdO1xuICAgICAgZGVmaW5pdGlvbnNQYXRocy5wdXNoKFxuICAgICAgICBnbG9iUGF0aEFycmF5LnNsaWNlKDAsIGdsb2JQYXRoQXJyYXkubGVuZ3RoIC0gMSkuam9pbignLycpXG4gICAgICApO1xuICAgICAgZGVmaW5pdGlvbnNQYXRoc0hhc2hNYXBba2V5XSA9IGRlZmluaXRpb25zUGF0aHM7XG4gICAgICByZXR1cm4gZGVmaW5pdGlvbnNQYXRoc0hhc2hNYXA7XG4gICAgfSxcbiAgICB7fVxuICApO1xuICBjb25zdCBkZWZpbml0aW9uc1BhdGhzID1cbiAgICBkZWZpbml0aW9uc1BhdGhzSGFzaE1hcFtcbiAgICAgIE1hdGgubWluKFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhkZWZpbml0aW9uc1BhdGhzSGFzaE1hcCkubWFwKChrZXk6IHN0cmluZykgPT5cbiAgICAgICAgICBOdW1iZXIoa2V5KVxuICAgICAgICApXG4gICAgICApLnRvU3RyaW5nKClcbiAgICBdO1xuICBpZiAoZGVmaW5pdGlvbnNQYXRocy5sZW5ndGggPT09IDEpIHJldHVybiBkZWZpbml0aW9uc1BhdGhzWzBdO1xuICBjb25zdCBkZWZpbnRpb25zUGF0aEFycmF5ID0gZGVmaW5pdGlvbnNQYXRoc1swXS5zcGxpdCgnLycpO1xuICByZXR1cm4gZGVmaW50aW9uc1BhdGhBcnJheS5zbGljZSgwLCBkZWZpbnRpb25zUGF0aEFycmF5Lmxlbmd0aCAtIDEpLmpvaW4oJy8nKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlTGlua2VkRGlyZWN0aXZlcyhcbiAgdHlwZXNMb2NhdGlvblBhdGg6IHN0cmluZyxcbiAgbnM6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHJlbGF0aXZlVHlwZVBhdGhzU2V0ID0gbmV3IFNldChcbiAgICAoYXdhaXQgZ2xvYmJ5KHBhdGgucmVzb2x2ZSh0eXBlc0xvY2F0aW9uUGF0aCwgJyoqLyouZC50cycpKSkubWFwKFxuICAgICAgKHR5cGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIHR5cGVQYXRoLnNsaWNlKHR5cGVzTG9jYXRpb25QYXRoLmxlbmd0aCArIDEpO1xuICAgICAgfVxuICAgIClcbiAgKTtcbiAgcmVsYXRpdmVUeXBlUGF0aHNTZXQuZGVsZXRlKCdpbmRleC5kLnRzJyk7XG4gIGNvbnN0IHJlbGF0aXZlVHlwZVBhdGhzID0gWy4uLnJlbGF0aXZlVHlwZVBhdGhzU2V0XTtcbiAgY29uc3QgbGlua2VkRGlyZWN0aXZlcyA9IGNyZWF0ZUxpbmtlZERpcmVjdGl2ZXMocmVsYXRpdmVUeXBlUGF0aHMsIG5zKTtcbiAgYXdhaXQgZnMubWtkaXJzKHR5cGVzTG9jYXRpb25QYXRoKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIHBhdGgucmVzb2x2ZSh0eXBlc0xvY2F0aW9uUGF0aCwgJ2luZGV4LmQudHMnKSxcbiAgICBsaW5rZWREaXJlY3RpdmVzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMaW5rZWREaXJlY3RpdmVzKGZpbGVQYXRoczogc3RyaW5nW10sIG5zID0gJ18nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5maWxlUGF0aHMubWFwKFxuICAgICAgKGZpbGVQYXRoOiBzdHJpbmcpID0+IGAvLy8gPHJlZmVyZW5jZSBwYXRoPVwiJHtmaWxlUGF0aH1cIiAvPmBcbiAgICApLFxuICAgIGBkZWNsYXJlIG1vZHVsZSAnJHtuc30nIHt9YFxuICBdLmpvaW4oJ1xcbicpO1xufVxuXG5pbnRlcmZhY2UgRGVmaW5pdGlvbnNQYXRoSGFzaE1hcCB7XG4gIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdO1xufVxuIl19