cdk8s-cli
Version:
This is the command line tool for Cloud Development Kit (CDK) for Kubernetes (cdk8s).
173 lines • 21.1 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ImportHelm = void 0;
const child_process_1 = require("child_process");
const fs = __importStar(require("fs"));
const os = __importStar(require("os"));
const path = __importStar(require("path"));
const cdk8s_1 = require("cdk8s");
const json2jsii_1 = require("json2jsii");
const semver = __importStar(require("semver"));
const base_1 = require("./base");
const codegen_1 = require("./codegen");
const MAX_HELM_BUFFER = 10 * 1024 * 1024;
const CHART_SCHEMA = 'values.schema.json';
const CHART_YAML = 'Chart.yaml';
class ImportHelm extends base_1.ImportBase {
static async fromSpec(importSpec) {
const { source } = importSpec;
return new ImportHelm(source);
}
constructor(source) {
super();
this.chartDependencies = [];
const [chartUrl, chartName, chartVersion] = extractHelmChartDetails(source);
this.chartName = chartName;
this.chartUrl = chartUrl;
this.chartVersion = chartVersion;
const tmpDir = pullHelmRepo(chartUrl, chartName, chartVersion);
const chartYamlFilePath = path.join(tmpDir, this.chartName, CHART_YAML);
const contents = cdk8s_1.Yaml.load(chartYamlFilePath);
if (contents.length === 1 && contents[0].dependencies) {
for (const dependency of contents[0].dependencies) {
this.chartDependencies.push(dependency.name);
}
}
const potentialSchemaPath = path.join(tmpDir, this.chartName, CHART_SCHEMA);
this.chartSchemaPath = fs.existsSync(potentialSchemaPath) ? potentialSchemaPath : undefined;
this.schema = this.chartSchemaPath ? JSON.parse(fs.readFileSync(this.chartSchemaPath, 'utf-8')) : undefined;
cleanup(tmpDir);
}
get moduleNames() {
return [this.chartName];
}
async generateTypeScript(code) {
(0, codegen_1.emitHelmHeader)(code);
const types = new json2jsii_1.TypeGenerator({
definitions: this.schema?.definitions,
toJson: false,
sanitizeEnums: true,
});
(0, codegen_1.generateHelmConstruct)(types, {
schema: this.schema,
chartName: this.chartName,
chartUrl: this.chartUrl,
chartVersion: this.chartVersion,
chartDependencies: this.chartDependencies,
fqn: this.chartName,
});
code.line(types.render());
}
}
exports.ImportHelm = ImportHelm;
/**
* Gets information about the helm chart from the helm url
* @param url
* @returns chartUrl, chartName and chartVersion
*/
function extractHelmChartDetails(url) {
let chartUrl;
let chartName;
let chartVersion;
if (url.startsWith('helm:oci://')) {
// URL: helm:oci://registry-1.docker.io/bitnamicharts/wordpress@17.1.17
const helmRegex = /^helm:(oci:\/\/[A-Za-z0-9_.-:\-]+)\@([0-9]+)\.([0-9]+)\.([A-Za-z0-9-+]+)$/;
const helmDetails = helmRegex.exec(url);
if (!helmDetails) {
throw Error(`Invalid helm URL: ${url}. Must match the format: 'helm:<oci-registry-url>@<chart-version>'.`);
}
chartUrl = helmDetails[1];
const lastIndexOfSlash = chartUrl.lastIndexOf('/');
chartName = chartUrl.substring(lastIndexOfSlash + 1);
const major = helmDetails[2];
const minor = helmDetails[3];
const patch = helmDetails[4];
chartVersion = `${major}.${minor}.${patch}`;
}
else {
// URL: helm:https://lacework.github.io/helm-charts/lacework-agent@6.9.0
const helmRegex = /^helm:([A-Za-z0-9_.-:\-]+)\/([A-Za-z0-9_.-:\-]+)\@([0-9]+)\.([0-9]+)\.([A-Za-z0-9-+]+)$/;
const helmDetails = helmRegex.exec(url);
if (!helmDetails) {
throw Error(`Invalid helm URL: ${url}. Must match the format: 'helm:<repo-url>/<chart-name>@<chart-version>'.`);
}
chartUrl = helmDetails[1];
chartName = helmDetails[2];
const major = helmDetails[3];
const minor = helmDetails[4];
const patch = helmDetails[5];
chartVersion = `${major}.${minor}.${patch}`;
}
if (!semver.valid(chartVersion)) {
throw new Error(`Invalid chart version (${chartVersion}) in URL: ${url}. Must follow SemVer-2 (see https://semver.org/).`);
}
return [chartUrl, chartName, chartVersion];
}
/**
* Pulls the helm chart in a temporary directory
* @param chartUrl Chart url
* @param chartName Chart name
* @param chartVersion Chart version
* @returns Temporary directory path
*/
function pullHelmRepo(chartUrl, chartName, chartVersion) {
const workdir = fs.mkdtempSync(path.join(os.tmpdir(), 'cdk8s-helm-'));
const args = new Array();
args.push('pull');
if (!chartUrl.startsWith('oci://')) {
args.push(chartName);
args.push('--repo', chartUrl);
}
else {
args.push(chartUrl);
}
args.push('--version', chartVersion);
args.push('--untar');
args.push('--untardir', workdir);
const command = 'helm';
const helm = (0, child_process_1.spawnSync)(command, args, {
maxBuffer: MAX_HELM_BUFFER,
});
if (helm.error) {
const err = helm.error.message;
if (err.includes('ENOENT')) {
throw new Error(`Unable to execute '${command}' to pull the Helm chart. Is helm installed on your system?`);
}
throw new Error(`Failed pulling helm chart from URL (${chartUrl}): ${err}`);
}
if (helm.status !== 0) {
throw new Error(helm.stderr.toString());
}
return workdir;
}
/**
* Cleanup temp directory created
* @param tmpDir Temporary directory path
*/
function cleanup(tmpDir) {
fs.rmSync(tmpDir, { recursive: true });
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVsbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbXBvcnQvaGVsbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUEwQztBQUMxQyx1Q0FBeUI7QUFDekIsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixpQ0FBNkI7QUFHN0IseUNBQTBDO0FBQzFDLCtDQUFpQztBQUNqQyxpQ0FBb0M7QUFDcEMsdUNBQWtFO0FBR2xFLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDO0FBQzFDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztBQUVoQyxNQUFhLFVBQVcsU0FBUSxpQkFBVTtJQUNqQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFzQjtRQUNqRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQVNELFlBQW9CLE1BQWM7UUFDaEMsS0FBSyxFQUFFLENBQUM7UUFKTyxzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFNaEQsTUFBTSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFL0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJ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SUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0tBQ3pDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsT0FBTyxDQUFDLE1BQWM7SUFDN0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgWWFtbCB9IGZyb20gJ2NkazhzJztcbmltcG9ydCB7IENvZGVNYWtlciB9IGZyb20gJ2NvZGVtYWtlcic7XG5pbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE0IH0gZnJvbSAnanNvbi1zY2hlbWEnO1xuaW1wb3J0IHsgVHlwZUdlbmVyYXRvciB9IGZyb20gJ2pzb24yanNpaSc7XG5pbXBvcnQgKiBhcyBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IEltcG9ydEJhc2UgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgZW1pdEhlbG1IZWFkZXIsIGdlbmVyYXRlSGVsbUNvbnN0cnVjdCB9IGZyb20gJy4vY29kZWdlbic7XG5pbXBvcnQgeyBJbXBvcnRTcGVjIH0gZnJvbSAnLi4vY29uZmlnJztcblxuY29uc3QgTUFYX0hFTE1fQlVGRkVSID0gMTAgKiAxMDI0ICogMTAyNDtcbmNvbnN0IENIQVJUX1NDSEVNQSA9ICd2YWx1ZXMuc2NoZW1hLmpzb24nO1xuY29uc3QgQ0hBUlRfWUFNTCA9ICdDaGFydC55YW1sJztcblxuZXhwb3J0IGNsYXNzIEltcG9ydEhlbG0gZXh0ZW5kcyBJbXBvcnRCYXNlIHtcbiAgcHVibGljIHN0YXRpYyBhc3luYyBmcm9tU3BlYyhpbXBvcnRTcGVjOiBJbXBvcnRTcGVjKTogUHJvbWlzZTxJbXBvcnRIZWxtPiB7XG4gICAgY29uc3QgeyBzb3VyY2UgfSA9IGltcG9ydFNwZWM7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRIZWxtKHNvdXJjZSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0TmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0VXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRWZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRTY2hlbWFQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnREZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hOiBKU09OU2NoZW1hNCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IFtjaGFydFVybCwgY2hhcnROYW1lLCBjaGFydFZlcnNpb25dID0gZXh0cmFjdEhlbG1DaGFydERldGFpbHMoc291cmNlKTtcblxuICAgIHRoaXMuY2hhcnROYW1lID0gY2hhcnROYW1lO1xuICAgIHRoaXMuY2hhcnRVcmwgPSBjaGFydFVybDtcbiAgICB0aGlzLmNoYXJ0VmVyc2lvbiA9IGNoYXJ0VmVyc2lvbjtcbiAgICBjb25zdCB0bXBEaXIgPSBwdWxsSGVsbVJlcG8oY2hhcnRVcmwsIGNoYXJ0TmFtZSwgY2hhcnRWZXJzaW9uKTtcblxuICAgIGNvbnN0IGNoYXJ0WWFtbEZpbGVQYXRoID0gcGF0aC5qb2luKHRtcERpciwgdGhpcy5jaGFydE5hbWUsIENIQVJUX1lBTUwpO1xuICAgIGNvbnN0IGNvbnRlbnRzID0gWWFtbC5sb2FkKGNoYXJ0WWFtbEZpbGVQYXRoKTtcblxuICAgIGlmIChjb250ZW50cy5sZW5ndGggPT09IDEgJiYgY29udGVudHNbMF0uZGVwZW5kZW5jaWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgY29udGVudHNbMF0uZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIHRoaXMuY2hhcnREZXBlbmRlbmNpZXMucHVzaChkZXBlbmRlbmN5Lm5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBvdGVudGlhbFNjaGVtYVBhdGggPSBwYXRoLmpvaW4odG1wRGlyLCB0aGlzLmNoYXJ0TmFtZSwgQ0hBUlRfU0NIRU1BKTtcbiAgICB0aGlzLmNoYXJ0U2NoZW1hUGF0aCA9IGZzLmV4aXN0c1N5bmMocG90ZW50aWFsU2NoZW1hUGF0aCkgPyBwb3RlbnRpYWxTY2hlbWFQYXRoIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuc2NoZW1hID0gdGhpcy5jaGFydFNjaGVtYVBhdGggPyBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLmNoYXJ0U2NoZW1hUGF0aCwgJ3V0Zi04JykpIDogdW5kZWZpbmVkO1xuXG4gICAgY2xlYW51cCh0bXBEaXIpO1xuICB9XG5cbiAgcHVibGljIGdldCBtb2R1bGVOYW1lcygpIHtcbiAgICByZXR1cm4gW3RoaXMuY2hhcnROYW1lXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZVR5cGVTY3JpcHQoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgZW1pdEhlbG1IZWFkZXIoY29kZSk7XG5cbiAgICBjb25zdCB0eXBlcyA9IG5ldyBUeXBlR2VuZXJhdG9yKHtcbiAgICAgIGRlZmluaXRpb25zOiB0aGlzLnNjaGVtYT8uZGVmaW5pdGlvbnMsXG4gICAgICB0b0pzb246IGZhbHNlLFxuICAgICAgc2FuaXRpemVFbnVtczogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGdlbmVyYXRlSGVsbUNvbnN0cnVjdCh0eXBlcywge1xuICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgIGNoYXJ0TmFtZTogdGhpcy5jaGFydE5hbWUsXG4gICAgICBjaGFydFVybDogdGhpcy5jaGFydFVybCxcbiAgICAgIGNoYXJ0VmVyc2lvbjogdGhpcy5jaGFydFZlcnNpb24sXG4gICAgICBjaGFydERlcGVuZGVuY2llczogdGhpcy5jaGFydERlcGVuZGVuY2llcyxcbiAgICAgIGZxbjogdGhpcy5jaGFydE5hbWUsXG4gICAgfSk7XG5cbiAgICBjb2RlLmxpbmUodHlwZXMucmVuZGVyKCkpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGVsbSBjaGFydCBmcm9tIHRoZSBoZWxtIHVybFxuICogQHBhcmFtIHVybFxuICogQHJldHVybnMgY2hhcnRVcmwsIGNoYXJ0TmFtZSBhbmQgY2hhcnRWZXJzaW9uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RIZWxtQ2hhcnREZXRhaWxzKHVybDogc3RyaW5nKSB7XG5cbiAgbGV0IGNoYXJ0VXJsO1xuICBsZXQgY2hhcnROYW1lO1xuICBsZXQgY2hhcnRWZXJzaW9uO1xuXG4gIGlmICh1cmwuc3RhcnRzV2l0aCgnaGVsbTpvY2k6Ly8nKSkge1xuICAgIC8vIFVSTDogaGVsbTpvY2k6Ly9yZWdpc3RyeS0xLmRvY2tlci5pby9iaXRuYW1pY2hhcnRzL3dvcmRwcmVzc0AxNy4xLjE3XG4gICAgY29uc3QgaGVsbVJlZ2V4ID0gL15oZWxtOihvY2k6XFwvXFwvW0EtWmEtejAtOV8uLTpcXC1dKylcXEAoWzAtOV0rKVxcLihbMC05XSspXFwuKFtBLVphLXowLTktK10rKSQvO1xuICAgIGNvbnN0IGhlbG1EZXRhaWxzID0gaGVsbVJlZ2V4LmV4ZWModXJsKTtcblxuICAgIGlmICghaGVsbURldGFpbHMpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGhlbG0gVVJMOiAke3VybH0uIE11c3QgbWF0Y2ggdGhlIGZvcm1hdDogJ2hlbG06PG9jaS1yZWdpc3RyeS11cmw+QDxjaGFydC12ZXJzaW9uPicuYCk7XG4gICAgfVxuXG4gICAgY2hhcnRVcmwgPSBoZWxtRGV0YWlsc1sxXTtcbiAgICBjb25zdCBsYXN0SW5kZXhPZlNsYXNoID0gY2hhcnRVcmwubGFzdEluZGV4T2YoJy8nKTtcbiAgICBjaGFydE5hbWUgPSBjaGFydFVybC5zdWJzdHJpbmcobGFzdEluZGV4T2ZTbGFzaCArIDEpO1xuXG4gICAgY29uc3QgbWFqb3IgPSBoZWxtRGV0YWlsc1syXTtcbiAgICBjb25zdCBtaW5vciA9IGhlbG1EZXRhaWxzWzNdO1xuICAgIGNvbnN0IHBhdGNoID0gaGVsbURldGFpbHNbNF07XG4gICAgY2hhcnRWZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9YDtcblxuICB9IGVsc2Uge1xuICAgIC8vIFVSTDogaGVsbTpodHRwczovL2xhY2V3b3JrLmdpdGh1Yi5pby9oZWxtLWNoYXJ0cy9sYWNld29yay1hZ2VudEA2LjkuMFxuICAgIGNvbnN0IGhlbG1SZWdleCA9IC9eaGVsbTooW0EtWmEtejAtOV8uLTpcXC1dKylcXC8oW0EtWmEtejAtOV8uLTpcXC1dKylcXEAoWzAtOV0rKVxcLihbMC05XSspXFwuKFtBLVphLXowLTktK10rKSQvO1xuICAgIGNvbnN0IGhlbG1EZXRhaWxzID0gaGVsbVJlZ2V4LmV4ZWModXJsKTtcblxuICAgIGlmICghaGVsbURldGFpbHMpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGhlbG0gVVJMOiAke3VybH0uIE11c3QgbWF0Y2ggdGhlIGZvcm1hdDogJ2hlbG06PHJlcG8tdXJsPi88Y2hhcnQtbmFtZT5APGNoYXJ0LXZlcnNpb24+Jy5gKTtcbiAgICB9XG5cbiAgICBjaGFydFVybCA9IGhlbG1EZXRhaWxzWzFdO1xuICAgIGNoYXJ0TmFtZSA9IGhlbG1EZXRhaWxzWzJdO1xuXG4gICAgY29uc3QgbWFqb3IgPSBoZWxtRGV0YWlsc1szXTtcbiAgICBjb25zdCBtaW5vciA9IGhlbG1EZXRhaWxzWzRdO1xuICAgIGNvbnN0IHBhdGNoID0gaGVsbURldGFpbHNbNV07XG4gICAgY2hhcnRWZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9YDtcbiAgfVxuXG4gIGlmICghc2VtdmVyLnZhbGlkKGNoYXJ0VmVyc2lvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhcnQgdmVyc2lvbiAoJHtjaGFydFZlcnNpb259KSBpbiBVUkw6ICR7dXJsfS4gTXVzdCBmb2xsb3cgU2VtVmVyLTIgKHNlZSBodHRwczovL3NlbXZlci5vcmcvKS5gKTtcbiAgfVxuXG4gIHJldHVybiBbY2hhcnRVcmwsIGNoYXJ0TmFtZSwgY2hhcnRWZXJzaW9uXTtcbn1cblxuLyoqXG4gKiBQdWxscyB0aGUgaGVsbSBjaGFydCBpbiBhIHRlbXBvcmFyeSBkaXJlY3RvcnlcbiAqIEBwYXJhbSBjaGFydFVybCBDaGFydCB1cmxcbiAqIEBwYXJhbSBjaGFydE5hbWUgQ2hhcnQgbmFtZVxuICogQHBhcmFtIGNoYXJ0VmVyc2lvbiBDaGFydCB2ZXJzaW9uXG4gKiBAcmV0dXJucyBUZW1wb3JhcnkgZGlyZWN0b3J5IHBhdGhcbiAqL1xuZnVuY3Rpb24gcHVsbEhlbG1SZXBvKGNoYXJ0VXJsOiBzdHJpbmcsIGNoYXJ0TmFtZTogc3RyaW5nLCBjaGFydFZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmtkaXIgPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICdjZGs4cy1oZWxtLScpKTtcblxuICBjb25zdCBhcmdzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgYXJncy5wdXNoKCdwdWxsJyk7XG5cbiAgaWYgKCFjaGFydFVybC5zdGFydHNXaXRoKCdvY2k6Ly8nKSkge1xuICAgIGFyZ3MucHVzaChjaGFydE5hbWUpO1xuICAgIGFyZ3MucHVzaCgnLS1yZXBvJywgY2hhcnRVcmwpO1xuICB9IGVsc2Uge1xuICAgIGFyZ3MucHVzaChjaGFydFVybCk7XG4gIH1cblxuICBhcmdzLnB1c2goJy0tdmVyc2lvbicsIGNoYXJ0VmVyc2lvbik7XG4gIGFyZ3MucHVzaCgnLS11bnRhcicpO1xuICBhcmdzLnB1c2goJy0tdW50YXJkaXInLCB3b3JrZGlyKTtcblxuICBjb25zdCBjb21tYW5kID0gJ2hlbG0nO1xuXG4gIGNvbnN0IGhlbG0gPSBzcGF3blN5bmMoY29tbWFuZCwgYXJncywge1xuICAgIG1heEJ1ZmZlcjogTUFYX0hFTE1fQlVGRkVSLFxuICB9KTtcblxuICBpZiAoaGVsbS5lcnJvcikge1xuICAgIGNvbnN0IGVyciA9IGhlbG0uZXJyb3IubWVzc2FnZTtcbiAgICBpZiAoZXJyLmluY2x1ZGVzKCdFTk9FTlQnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZXhlY3V0ZSAnJHtjb21tYW5kfScgdG8gcHVsbCB0aGUgSGVsbSBjaGFydC4gSXMgaGVsbSBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0/YCk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgcHVsbGluZyBoZWxtIGNoYXJ0IGZyb20gVVJMICgke2NoYXJ0VXJsfSk6ICR7ZXJyfWApO1xuICB9XG5cbiAgaWYgKGhlbG0uc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGhlbG0uc3RkZXJyLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtkaXI7XG59XG5cbi8qKlxuICogQ2xlYW51cCB0ZW1wIGRpcmVjdG9yeSBjcmVhdGVkXG4gKiBAcGFyYW0gdG1wRGlyIFRlbXBvcmFyeSBkaXJlY3RvcnkgcGF0aFxuICovXG5mdW5jdGlvbiBjbGVhbnVwKHRtcERpcjogc3RyaW5nKSB7XG4gIGZzLnJtU3luYyh0bXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufSJdfQ==
;