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 ?? this.schema?.$defs,
toJson: true,
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_.-:\-]+)\@(v?[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_.-:\-]+)\@(v?[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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVsbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbXBvcnQvaGVsbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUEwQztBQUMxQyx1Q0FBeUI7QUFDekIsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixpQ0FBNkI7QUFHN0IseUNBQTBDO0FBQzFDLCtDQUFpQztBQUNqQyxpQ0FBb0M7QUFDcEMsdUNBQWtFO0FBR2xFLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDO0FBQzFDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztBQUVoQyxNQUFhLFVBQVcsU0FBUSxpQkFBVTtJQUNqQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFzQjtRQUNqRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQVNELFlBQW9CLE1BQWM7UUFDaEMsS0FBSyxFQUFFLENBQUM7UUFKTyxzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFNaEQsTUFBTSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFL0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sUUFBUSxHQUFHLFlBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU5QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUU7WUFDckQsS0FBSyxNQUFNLFVBQVUsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFO2dCQUNqRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5QztTQUNGO1FBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzVGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTVHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVTLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFlO1FBQ2hELElBQUEsd0JBQWMsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUVyQixNQUFNLEtBQUssR0FBRyxJQUFJLHlCQUFhLENBQUM7WUFDOUIsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSztZQUMzRCxNQUFNLEVBQUUsSUFBSTtZQUNaLGFBQWEsRUFBRSxJQUFJO1NBQ3BCLENBQUMsQ0FBQztRQUVILElBQUEsK0JBQXFCLEVBQUMsS0FBSyxFQUFFO1lBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMvQixpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3pDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUztTQUNwQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQS9ERCxnQ0ErREM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxHQUFXO0lBRTFDLElBQUksUUFBUSxDQUFDO0lBQ2IsSUFBSSxTQUFTLENBQUM7SUFDZCxJQUFJLFlBQVksQ0FBQztJQUVqQixJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDakMsdUVBQXVFO1FBQ3ZFLE1BQU0sU0FBUyxHQUFHLDZFQUE2RSxDQUFDO1FBQ2hHLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixNQUFNLEtBQUssQ0FBQyxxQkFBcUIsR0FBRyxxRUFBcUUsQ0FBQyxDQUFDO1NBQzVHO1FBRUQsUUFBUSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFckQsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsWUFBWSxHQUFHLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztLQUU3QztTQUFNO1FBQ0wsd0VBQXdFO1FBQ3hFLE1BQU0sU0FBUyxHQUFHLDJGQUEyRixDQUFDO1FBQzlHLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixNQUFNLEtBQUssQ0FBQyxxQkFBcUIsR0FBRywwRUFBMEUsQ0FBQyxDQUFDO1NBQ2pIO1FBRUQsUUFBUSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixTQUFTLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNCLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLFlBQVksR0FBRyxHQUFHLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7S0FDN0M7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixZQUFZLGFBQWEsR0FBRyxtREFBbUQsQ0FBQyxDQUFDO0tBQzVIO0lBRUQsT0FBTyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsWUFBWSxDQUFDLFFBQWdCLEVBQUUsU0FBaUIsRUFBRSxZQUFvQjtJQUM3RSxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFdEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWxCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDL0I7U0FBTTtRQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDckI7SUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRWpDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUV2QixNQUFNLElBQUksR0FBRyxJQUFBLHlCQUFTLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtRQUNwQyxTQUFTLEVBQUUsZUFBZTtLQUMzQixDQUFDLENBQUM7SUFFSCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDZCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUMvQixJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsT0FBTyw2REFBNkQsQ0FBQyxDQUFDO1NBQzdHO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsUUFBUSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7S0FDN0U7SUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0tBQ3pDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsT0FBTyxDQUFDLE1BQWM7SUFDN0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgWWFtbCB9IGZyb20gJ2NkazhzJztcbmltcG9ydCB7IENvZGVNYWtlciB9IGZyb20gJ2NvZGVtYWtlcic7XG5pbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE0IH0gZnJvbSAnanNvbi1zY2hlbWEnO1xuaW1wb3J0IHsgVHlwZUdlbmVyYXRvciB9IGZyb20gJ2pzb24yanNpaSc7XG5pbXBvcnQgKiBhcyBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IEltcG9ydEJhc2UgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgZW1pdEhlbG1IZWFkZXIsIGdlbmVyYXRlSGVsbUNvbnN0cnVjdCB9IGZyb20gJy4vY29kZWdlbic7XG5pbXBvcnQgeyBJbXBvcnRTcGVjIH0gZnJvbSAnLi4vY29uZmlnJztcblxuY29uc3QgTUFYX0hFTE1fQlVGRkVSID0gMTAgKiAxMDI0ICogMTAyNDtcbmNvbnN0IENIQVJUX1NDSEVNQSA9ICd2YWx1ZXMuc2NoZW1hLmpzb24nO1xuY29uc3QgQ0hBUlRfWUFNTCA9ICdDaGFydC55YW1sJztcblxuZXhwb3J0IGNsYXNzIEltcG9ydEhlbG0gZXh0ZW5kcyBJbXBvcnRCYXNlIHtcbiAgcHVibGljIHN0YXRpYyBhc3luYyBmcm9tU3BlYyhpbXBvcnRTcGVjOiBJbXBvcnRTcGVjKTogUHJvbWlzZTxJbXBvcnRIZWxtPiB7XG4gICAgY29uc3QgeyBzb3VyY2UgfSA9IGltcG9ydFNwZWM7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRIZWxtKHNvdXJjZSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0TmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0VXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRWZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRTY2hlbWFQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnREZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hOiBKU09OU2NoZW1hNCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IFtjaGFydFVybCwgY2hhcnROYW1lLCBjaGFydFZlcnNpb25dID0gZXh0cmFjdEhlbG1DaGFydERldGFpbHMoc291cmNlKTtcblxuICAgIHRoaXMuY2hhcnROYW1lID0gY2hhcnROYW1lO1xuICAgIHRoaXMuY2hhcnRVcmwgPSBjaGFydFVybDtcbiAgICB0aGlzLmNoYXJ0VmVyc2lvbiA9IGNoYXJ0VmVyc2lvbjtcbiAgICBjb25zdCB0bXBEaXIgPSBwdWxsSGVsbVJlcG8oY2hhcnRVcmwsIGNoYXJ0TmFtZSwgY2hhcnRWZXJzaW9uKTtcblxuICAgIGNvbnN0IGNoYXJ0WWFtbEZpbGVQYXRoID0gcGF0aC5qb2luKHRtcERpciwgdGhpcy5jaGFydE5hbWUsIENIQVJUX1lBTUwpO1xuICAgIGNvbnN0IGNvbnRlbnRzID0gWWFtbC5sb2FkKGNoYXJ0WWFtbEZpbGVQYXRoKTtcblxuICAgIGlmIChjb250ZW50cy5sZW5ndGggPT09IDEgJiYgY29udGVudHNbMF0uZGVwZW5kZW5jaWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgY29udGVudHNbMF0uZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIHRoaXMuY2hhcnREZXBlbmRlbmNpZXMucHVzaChkZXBlbmRlbmN5Lm5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBvdGVudGlhbFNjaGVtYVBhdGggPSBwYXRoLmpvaW4odG1wRGlyLCB0aGlzLmNoYXJ0TmFtZSwgQ0hBUlRfU0NIRU1BKTtcbiAgICB0aGlzLmNoYXJ0U2NoZW1hUGF0aCA9IGZzLmV4aXN0c1N5bmMocG90ZW50aWFsU2NoZW1hUGF0aCkgPyBwb3RlbnRpYWxTY2hlbWFQYXRoIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuc2NoZW1hID0gdGhpcy5jaGFydFNjaGVtYVBhdGggPyBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLmNoYXJ0U2NoZW1hUGF0aCwgJ3V0Zi04JykpIDogdW5kZWZpbmVkO1xuXG4gICAgY2xlYW51cCh0bXBEaXIpO1xuICB9XG5cbiAgcHVibGljIGdldCBtb2R1bGVOYW1lcygpIHtcbiAgICByZXR1cm4gW3RoaXMuY2hhcnROYW1lXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZVR5cGVTY3JpcHQoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgZW1pdEhlbG1IZWFkZXIoY29kZSk7XG5cbiAgICBjb25zdCB0eXBlcyA9IG5ldyBUeXBlR2VuZXJhdG9yKHtcbiAgICAgIGRlZmluaXRpb25zOiB0aGlzLnNjaGVtYT8uZGVmaW5pdGlvbnMgPz8gdGhpcy5zY2hlbWE/LiRkZWZzLFxuICAgICAgdG9Kc29uOiB0cnVlLFxuICAgICAgc2FuaXRpemVFbnVtczogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGdlbmVyYXRlSGVsbUNvbnN0cnVjdCh0eXBlcywge1xuICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgIGNoYXJ0TmFtZTogdGhpcy5jaGFydE5hbWUsXG4gICAgICBjaGFydFVybDogdGhpcy5jaGFydFVybCxcbiAgICAgIGNoYXJ0VmVyc2lvbjogdGhpcy5jaGFydFZlcnNpb24sXG4gICAgICBjaGFydERlcGVuZGVuY2llczogdGhpcy5jaGFydERlcGVuZGVuY2llcyxcbiAgICAgIGZxbjogdGhpcy5jaGFydE5hbWUsXG4gICAgfSk7XG5cbiAgICBjb2RlLmxpbmUodHlwZXMucmVuZGVyKCkpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGVsbSBjaGFydCBmcm9tIHRoZSBoZWxtIHVybFxuICogQHBhcmFtIHVybFxuICogQHJldHVybnMgY2hhcnRVcmwsIGNoYXJ0TmFtZSBhbmQgY2hhcnRWZXJzaW9uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RIZWxtQ2hhcnREZXRhaWxzKHVybDogc3RyaW5nKSB7XG5cbiAgbGV0IGNoYXJ0VXJsO1xuICBsZXQgY2hhcnROYW1lO1xuICBsZXQgY2hhcnRWZXJzaW9uO1xuXG4gIGlmICh1cmwuc3RhcnRzV2l0aCgnaGVsbTpvY2k6Ly8nKSkge1xuICAgIC8vIFVSTDogaGVsbTpvY2k6Ly9yZWdpc3RyeS0xLmRvY2tlci5pby9iaXRuYW1pY2hhcnRzL3dvcmRwcmVzc0AxNy4xLjE3XG4gICAgY29uc3QgaGVsbVJlZ2V4ID0gL15oZWxtOihvY2k6XFwvXFwvW0EtWmEtejAtOV8uLTpcXC1dKylcXEAodj9bMC05XSspXFwuKFswLTldKylcXC4oW0EtWmEtejAtOS0rXSspJC87XG4gICAgY29uc3QgaGVsbURldGFpbHMgPSBoZWxtUmVnZXguZXhlYyh1cmwpO1xuXG4gICAgaWYgKCFoZWxtRGV0YWlscykge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaGVsbSBVUkw6ICR7dXJsfS4gTXVzdCBtYXRjaCB0aGUgZm9ybWF0OiAnaGVsbTo8b2NpLXJlZ2lzdHJ5LXVybD5APGNoYXJ0LXZlcnNpb24+Jy5gKTtcbiAgICB9XG5cbiAgICBjaGFydFVybCA9IGhlbG1EZXRhaWxzWzFdO1xuICAgIGNvbnN0IGxhc3RJbmRleE9mU2xhc2ggPSBjaGFydFVybC5sYXN0SW5kZXhPZignLycpO1xuICAgIGNoYXJ0TmFtZSA9IGNoYXJ0VXJsLnN1YnN0cmluZyhsYXN0SW5kZXhPZlNsYXNoICsgMSk7XG5cbiAgICBjb25zdCBtYWpvciA9IGhlbG1EZXRhaWxzWzJdO1xuICAgIGNvbnN0IG1pbm9yID0gaGVsbURldGFpbHNbM107XG4gICAgY29uc3QgcGF0Y2ggPSBoZWxtRGV0YWlsc1s0XTtcbiAgICBjaGFydFZlcnNpb24gPSBgJHttYWpvcn0uJHttaW5vcn0uJHtwYXRjaH1gO1xuXG4gIH0gZWxzZSB7XG4gICAgLy8gVVJMOiBoZWxtOmh0dHBzOi8vbGFjZXdvcmsuZ2l0aHViLmlvL2hlbG0tY2hhcnRzL2xhY2V3b3JrLWFnZW50QDYuOS4wXG4gICAgY29uc3QgaGVsbVJlZ2V4ID0gL15oZWxtOihbQS1aYS16MC05Xy4tOlxcLV0rKVxcLyhbQS1aYS16MC05Xy4tOlxcLV0rKVxcQCh2P1swLTldKylcXC4oWzAtOV0rKVxcLihbQS1aYS16MC05LStdKykkLztcbiAgICBjb25zdCBoZWxtRGV0YWlscyA9IGhlbG1SZWdleC5leGVjKHVybCk7XG5cbiAgICBpZiAoIWhlbG1EZXRhaWxzKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBoZWxtIFVSTDogJHt1cmx9LiBNdXN0IG1hdGNoIHRoZSBmb3JtYXQ6ICdoZWxtOjxyZXBvLXVybD4vPGNoYXJ0LW5hbWU+QDxjaGFydC12ZXJzaW9uPicuYCk7XG4gICAgfVxuXG4gICAgY2hhcnRVcmwgPSBoZWxtRGV0YWlsc1sxXTtcbiAgICBjaGFydE5hbWUgPSBoZWxtRGV0YWlsc1syXTtcblxuICAgIGNvbnN0IG1ham9yID0gaGVsbURldGFpbHNbM107XG4gICAgY29uc3QgbWlub3IgPSBoZWxtRGV0YWlsc1s0XTtcbiAgICBjb25zdCBwYXRjaCA9IGhlbG1EZXRhaWxzWzVdO1xuICAgIGNoYXJ0VmVyc2lvbiA9IGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNofWA7XG4gIH1cblxuICBpZiAoIXNlbXZlci52YWxpZChjaGFydFZlcnNpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYXJ0IHZlcnNpb24gKCR7Y2hhcnRWZXJzaW9ufSkgaW4gVVJMOiAke3VybH0uIE11c3QgZm9sbG93IFNlbVZlci0yIChzZWUgaHR0cHM6Ly9zZW12ZXIub3JnLykuYCk7XG4gIH1cblxuICByZXR1cm4gW2NoYXJ0VXJsLCBjaGFydE5hbWUsIGNoYXJ0VmVyc2lvbl07XG59XG5cbi8qKlxuICogUHVsbHMgdGhlIGhlbG0gY2hhcnQgaW4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5XG4gKiBAcGFyYW0gY2hhcnRVcmwgQ2hhcnQgdXJsXG4gKiBAcGFyYW0gY2hhcnROYW1lIENoYXJ0IG5hbWVcbiAqIEBwYXJhbSBjaGFydFZlcnNpb24gQ2hhcnQgdmVyc2lvblxuICogQHJldHVybnMgVGVtcG9yYXJ5IGRpcmVjdG9yeSBwYXRoXG4gKi9cbmZ1bmN0aW9uIHB1bGxIZWxtUmVwbyhjaGFydFVybDogc3RyaW5nLCBjaGFydE5hbWU6IHN0cmluZywgY2hhcnRWZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB3b3JrZGlyID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnY2RrOHMtaGVsbS0nKSk7XG5cbiAgY29uc3QgYXJncyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGFyZ3MucHVzaCgncHVsbCcpO1xuXG4gIGlmICghY2hhcnRVcmwuc3RhcnRzV2l0aCgnb2NpOi8vJykpIHtcbiAgICBhcmdzLnB1c2goY2hhcnROYW1lKTtcbiAgICBhcmdzLnB1c2goJy0tcmVwbycsIGNoYXJ0VXJsKTtcbiAgfSBlbHNlIHtcbiAgICBhcmdzLnB1c2goY2hhcnRVcmwpO1xuICB9XG5cbiAgYXJncy5wdXNoKCctLXZlcnNpb24nLCBjaGFydFZlcnNpb24pO1xuICBhcmdzLnB1c2goJy0tdW50YXInKTtcbiAgYXJncy5wdXNoKCctLXVudGFyZGlyJywgd29ya2Rpcik7XG5cbiAgY29uc3QgY29tbWFuZCA9ICdoZWxtJztcblxuICBjb25zdCBoZWxtID0gc3Bhd25TeW5jKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICBtYXhCdWZmZXI6IE1BWF9IRUxNX0JVRkZFUixcbiAgfSk7XG5cbiAgaWYgKGhlbG0uZXJyb3IpIHtcbiAgICBjb25zdCBlcnIgPSBoZWxtLmVycm9yLm1lc3NhZ2U7XG4gICAgaWYgKGVyci5pbmNsdWRlcygnRU5PRU5UJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGV4ZWN1dGUgJyR7Y29tbWFuZH0nIHRvIHB1bGwgdGhlIEhlbG0gY2hhcnQuIElzIGhlbG0gaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtP2ApO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHB1bGxpbmcgaGVsbSBjaGFydCBmcm9tIFVSTCAoJHtjaGFydFVybH0pOiAke2Vycn1gKTtcbiAgfVxuXG4gIGlmIChoZWxtLnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihoZWxtLnN0ZGVyci50b1N0cmluZygpKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZGlyO1xufVxuXG4vKipcbiAqIENsZWFudXAgdGVtcCBkaXJlY3RvcnkgY3JlYXRlZFxuICogQHBhcmFtIHRtcERpciBUZW1wb3JhcnkgZGlyZWN0b3J5IHBhdGhcbiAqL1xuZnVuY3Rpb24gY2xlYW51cCh0bXBEaXI6IHN0cmluZykge1xuICBmcy5ybVN5bmModG1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn0iXX0=