cdk8s-cli
Version:
This is the command line tool for Cloud Development Kit (CDK) for Kubernetes (cdk8s).
239 lines • 32 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.ValidationPlugin = exports.ValidationReport = exports.ValidationLogger = exports.ValidationContext = void 0;
const fs = __importStar(require("fs"));
const os = __importStar(require("os"));
const table_1 = require("table");
const yaml = __importStar(require("yaml"));
/**
* Context available to plugins during validation.
*/
class ValidationContext {
constructor(
/**
* The list of manifests to validate.
*/
manifests,
/**
* The NodeJS package name of the plugin running the validation.
*/
pkg,
/**
* The version of the NodeJS package that runs the validation.
*/
version,
/**
* Construct metadata of resources in the application.
*/
metadata = {},
/**
* Whether or not the synth command was executed with --stdout.
*/
stdout) {
this.manifests = manifests;
this.pkg = pkg;
this.version = version;
this.metadata = metadata;
this.stdout = stdout;
this.report = new ValidationReport(this.pkg, this.version, this.metadata ?? {}, stdout ?? false);
this.logger = new ValidationLogger();
}
parseManifest(manifestPath) {
const parsed = yaml.parseAllDocuments(fs.readFileSync(manifestPath, { encoding: 'utf-8' }));
const resources = Array.isArray(parsed) ? parsed : [parsed];
return resources.map(r => r.toJS());
}
}
exports.ValidationContext = ValidationContext;
/**
* Logger available to plugins during validation. Use this instead of `console.log`.
*/
class ValidationLogger {
/**
* Log a message.
*/
log(message) {
console.log(message);
}
}
exports.ValidationLogger = ValidationLogger;
/**
* The report emitted by the plugin after evaluation.
*/
class ValidationReport {
constructor(pkg, version, metadata, stdout) {
this.pkg = pkg;
this.version = version;
this.metadata = metadata;
this.stdout = stdout;
this.violations = [];
}
/**
* Add a violation to the report.
*/
addViolation(violation) {
if (this._summary) {
throw new Error('Violations cannot be added to report after its submitted');
}
const violatingConstructs = [];
for (const resource of violation.violatingResources) {
const constructPath = this.metadata[resource.resourceName]?.path;
violatingConstructs.push({
...resource,
// augment with construct metadata
constructPath: constructPath,
// if synth is executed with --stdout, the manifest path
// here is temporary and will be deleted once the command finishes.
manifestPath: this.stdout ? 'STDOUT' : resource.manifestPath,
});
}
this.violations.push({
ruleName: violation.ruleName,
recommendation: violation.recommendation,
violatingConstructs: violatingConstructs,
fix: violation.fix,
});
}
/**
* Submit the report with a status and additional metadata.
*/
submit(status, metadata) {
this._summary = { status, plugin: this.pkg, version: this.version, metadata };
}
/**
* Whether or not the report was successfull.
*/
get success() {
if (!this._summary) {
throw new Error('Unable to determine report status: Report is incomplete. Call \'report.submit\'');
}
return this._summary.status === 'success';
}
/**
* Transform the report to a well formatted table string.
*/
toString() {
const json = this.toJson();
const output = [json.title];
output.push('-'.repeat(json.title.length));
output.push('');
output.push('(Summary)');
output.push('');
output.push((0, table_1.table)([
['Status', json.summary.status],
['Plugin', json.summary.plugin],
['Version', json.summary.version],
...Object.entries(json.summary.metadata ?? {}),
]));
if (json.violations) {
output.push('');
output.push('(Violations)');
}
for (const violation of json.violations) {
const occurrences = violation.violatingConstructs.flatMap(c => c.locations).length;
const title = reset(red(bright(`${violation.ruleName} (${occurrences} occurrences)`)));
output.push('');
output.push(title);
output.push('');
output.push(' Occurrences:');
for (const construct of violation.violatingConstructs) {
output.push('');
output.push(` - Construct Path: ${construct.constructPath ?? 'N/A'}`);
output.push(` - Manifest Path: ${construct.manifestPath}`);
output.push(` - Resource Name: ${construct.resourceName}`);
if (construct.locations) {
output.push(' - Locations:');
for (const location of construct.locations) {
output.push(` > ${location}`);
}
}
}
output.push('');
output.push(` Recommendation: ${violation.recommendation}`);
output.push(` How to fix: ${violation.fix}`);
}
return output.join(os.EOL);
}
/**
* Transform the report into a JSON object.
*/
toJson() {
if (!this._summary) {
throw new Error('Unable to determine report result: Report is incomplete. Call \'report.submit\'');
}
return {
title: `Validation Report (${this.pkg}@${this.version})`,
violations: this.violations,
summary: this._summary,
};
}
}
exports.ValidationReport = ValidationReport;
/**
* Utiliy class for loading validation plugins.
*/
class ValidationPlugin {
/**
* Load the validation plugin and create the necessary context for its execution.
*/
static load(validation, app, stdout, pluginManager) {
const plugin = pluginManager.load({
pkg: validation.package,
version: validation.version,
class: validation.class,
properties: validation.properties,
installEnv: validation.installEnv,
});
if (typeof (plugin.instance.validate) !== 'function') {
throw new Error(`Instance of class '${validation.class}' from package '${validation.package}@${validation.version}' is not a validation plugin. Are you sure you specified the correct class?`);
}
const metadata = app.constructMetadata ? this.loadConstructMetadata(app.constructMetadata) : {};
const context = new ValidationContext(app.manifests, plugin.package.pkg, plugin.package.version, metadata, stdout);
return { plugin: plugin.instance, context };
}
static loadConstructMetadata(constructMetadataPath) {
const contents = JSON.parse(fs.readFileSync(constructMetadataPath, { encoding: 'utf-8' }));
const resources = {};
if (contents.version !== '1.0.0') {
throw new Error(`Unexpected version of construct metadata at ${constructMetadataPath}: ${contents.version}. Supported versions are: [1.0.0]`);
}
for (const [name, metadata] of Object.entries(contents.resources)) {
resources[name] = { path: metadata.path };
}
return resources;
}
}
exports.ValidationPlugin = ValidationPlugin;
function reset(s) {
return `${s}\x1b[0m`;
}
function red(s) {
return `\x1b[31m${s}`;
}
function bright(s) {
return `\x1b[1m${s}`;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsdUNBQXlCO0FBQ3pCLGlDQUE4QjtBQUM5QiwyQ0FBNkI7QUFLN0I7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQWdCNUI7SUFFRTs7T0FFRztJQUNhLFNBQTRCO0lBRTVDOztPQUVHO0lBQ2EsR0FBVztJQUUzQjs7T0FFRztJQUNhLE9BQWU7SUFFL0I7O09BRUc7SUFDYSxXQUFnRSxFQUFFO0lBRWxGOztPQUVHO0lBQ2EsTUFBZ0I7UUFwQmhCLGNBQVMsR0FBVCxTQUFTLENBQW1CO1FBSzVCLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFLWCxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBS2YsYUFBUSxHQUFSLFFBQVEsQ0FBMEQ7UUFLbEUsV0FBTSxHQUFOLE1BQU0sQ0FBVTtRQUVoQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQztRQUNqRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRU0sYUFBYSxDQUFDLFlBQW9CO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxD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UUFDaEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRixNQUFNLFNBQVMsR0FBaUQsRUFBRSxDQUFDO1FBQ25FLElBQUksUUFBUSxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MscUJBQXFCLEtBQUssUUFBUSxDQUFDLE9BQU8sbUNBQW1DLENBQUMsQ0FBQztTQUMvSTtRQUNELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNqRSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUcsUUFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNwRDtRQUNELE9BQU8sU0FBUyxDQUFDO0lBRW5CLENBQUM7Q0FFRjtBQTFDRCw0Q0EwQ0M7QUFjRCxTQUFTLEtBQUssQ0FBQyxDQUFTO0lBQ3RCLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQztBQUN2QixDQUFDO0FBRUQsU0FBUyxHQUFHLENBQUMsQ0FBUztJQUNwQixPQUFPLFdBQVcsQ0FBQyxFQUFFLENBQUM7QUFDeEIsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLENBQVM7SUFDdkIsT0FBTyxVQUFVLENBQUMsRUFBRSxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgeyB0YWJsZSB9IGZyb20gJ3RhYmxlJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAneWFtbCc7XG5pbXBvcnQgeyBQbHVnaW5NYW5hZ2VyIH0gZnJvbSAnLi9fbWFuYWdlcic7XG5pbXBvcnQgeyBWYWxpZGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IFN5bnRoZXNpemVkQXBwIH0gZnJvbSAnLi4vdXRpbCc7XG5cbi8qKlxuICogQ29udGV4dCBhdmFpbGFibGUgdG8gcGx1Z2lucyBkdXJpbmcgdmFsaWRhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25Db250ZXh0IHtcblxuICAvKipcbiAgICogUmVwb3J0IGVtaXR0ZWQgYnkgdGhlIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIFBsdWdpbnMgc2hvdWxkIGludGVyYWN0IHdpdGggdGhpcyBvYmplY3QgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnQ6IFZhbGlkYXRpb25SZXBvcnQ7XG5cbiAgLyoqXG4gICAqIExvZ2dlciBmb3IgdGhlIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIFBsdWdpbnMgc2hvdWxkIGludGVyYWN0IHdpdGggdGhpcyBvYmplY3QgdG8gbG9nIG1lc3NhZ2VzIGR1cmluZyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlcjogVmFsaWRhdGlvbkxvZ2dlcjtcblxuICBjb25zdHJ1Y3RvcihcblxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIG1hbmlmZXN0cyB0byB2YWxpZGF0ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbWFuaWZlc3RzOiByZWFkb25seSBzdHJpbmdbXSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBOb2RlSlMgcGFja2FnZSBuYW1lIG9mIHRoZSBwbHVnaW4gcnVubmluZyB0aGUgdmFsaWRhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcGtnOiBzdHJpbmcsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgTm9kZUpTIHBhY2thZ2UgdGhhdCBydW5zIHRoZSB2YWxpZGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcsXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgbWV0YWRhdGEgb2YgcmVzb3VyY2VzIGluIHRoZSBhcHBsaWNhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE6IHtyZWFkb25seSBba2V5OiBzdHJpbmddOiBSZXNvdXJjZUNvbnN0cnVjdE1ldGFkYXRhfSA9IHt9LFxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHN5bnRoIGNvbW1hbmQgd2FzIGV4ZWN1dGVkIHdpdGggLS1zdGRvdXQuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHN0ZG91dD86IGJvb2xlYW4pIHtcblxuICAgIHRoaXMucmVwb3J0ID0gbmV3IFZhbGlkYXRpb25SZXBvcnQodGhpcy5wa2csIHRoaXMudmVyc2lvbiwgdGhpcy5tZXRhZGF0YSA/PyB7fSwgc3Rkb3V0ID8/IGZhbHNlKTtcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBWYWxpZGF0aW9uTG9nZ2VyKCk7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VNYW5pZmVzdChtYW5pZmVzdFBhdGg6IHN0cmluZyk6IGFueVtdIHtcbiAgICBjb25zdCBwYXJzZWQgPSB5YW1sLnBhcnNlQWxsRG9jdW1lbnRzKGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkpO1xuICAgIGNvbnN0IHJlc291cmNlcyA9IEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZCA6IFtwYXJzZWRdO1xuICAgIHJldHVybiByZXNvdXJjZXMubWFwKHIgPT4gci50b0pTKCkpO1xuICB9XG59XG5cbi8qKlxuICogTG9nZ2VyIGF2YWlsYWJsZSB0byBwbHVnaW5zIGR1cmluZyB2YWxpZGF0aW9uLiBVc2UgdGhpcyBpbnN0ZWFkIG9mIGBjb25zb2xlLmxvZ2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uTG9nZ2VyIHtcblxuICAvKipcbiAgICogTG9nIGEgbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyBsb2cobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb250cmFjdCBiZXR3ZWVuIGNkazhzIGFuZCB0aGlyZC1wYXJ0aWVzIGxvb2tpbmcgdG8gaW1wbGVtZW50IHZhbGlkYXRpb24gcGx1Z2lucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uIHtcblxuICAvKipcbiAgICogUnVuIHRoZSB2YWxpZGF0aW9uIGxvZ2ljLlxuICAgKlxuICAgKiAtIFVzZSBgY29udGV4dC5tYW5pZmVzdHNgIHRvIHJldHJpZXZlIHRoZSBsaXN0IG9mIG1hbmlmZXN0cyB0byB2YWxpZGF0ZS5cbiAgICogLSBVc2UgYGNvbnRleHQucmVwb3J0YCB0byBhY2Nlc3MgYW5kIGJ1aWxkIHRoZSByZXN1bHRpbmcgcmVwb3J0LlxuICAgKlxuICAgKiBNYWtlIHN1cmUgdG8gY2FsbCBgY29udGV4dC5yZXBvcnQucGFzcygpYCBvciBgY29udGV4dC5yZXBvcnQuZmFpbCgpYCBiZWZvcmUgcmV0dXJuaW5nLCBvdGhlcndpc2UgdGhlIHZhbGlkYXRpb24gaXMgY29uc2lkZXJlZCBpbmNvbXBsZXRlLlxuICAgKi9cbiAgdmFsaWRhdGUoY29udGV4dDogVmFsaWRhdGlvbkNvbnRleHQpOiBQcm9taXNlPHZvaWQ+O1xuXG59XG5cbi8qKlxuICogUmVzb3VyY2UgdmlvbGF0aW5nIGEgc3BlY2lmaWMgcnVsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uVmlvbGF0aW5nUmVzb3VyY2Uge1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9jYXRpb25zIGluIGl0cyBjb25maWcgdGhhdCBwb3NlIHRoZSB2aW9sYXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYXRpb25zOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIG1hbmlmZXN0IHRoaXMgcmVzb3VyY2UgaXMgZGVmaW5lZCBpbi5cbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0UGF0aDogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQ29uc3RydWN0IHZpb2xhdGluZyBhIHNwZWNpZmljIHJ1bGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblZpb2xhdGluZ0NvbnN0cnVjdCBleHRlbmRzIFZhbGlkYXRpb25WaW9sYXRpbmdSZXNvdXJjZSB7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdHJ1Y3QgcGF0aCBhcyBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnN0cnVjdFBhdGg/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBWaW9sYXRpb24gcHJvZHVjZWQgYnkgdGhlIHZhbGlkYXRpb24gcGx1Z2luLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25WaW9sYXRpb24ge1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcnVsZS5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbW1lbmRhdGlvbiB0byByZXNvbHZlIHRoZSB2aW9sYXRpb24uXG4gICAqL1xuICByZWFkb25seSByZWNvbW1lbmRhdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgdG8gZml4IHRoZSByZWNvbW1lbmRhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGZpeDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2VzIHZpb2xhdGluZyB0aGlzIHJ1bGUuXG4gICAqL1xuICByZWFkb25seSB2aW9sYXRpbmdSZXNvdXJjZXM6IHJlYWRvbmx5IFZhbGlkYXRpb25WaW9sYXRpbmdSZXNvdXJjZVtdO1xuXG59XG5cbi8qKlxuICogVmFsaWRhdGlvbiBwcm9kdWNlZCBieSB0aGUgdmFsaWRhdGlvbiBwbHVnaW4sIGluIGNvbnN0cnVjdCB0ZXJtcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uVmlvbGF0aW9uQ29uc3RydWN0QXdhcmUgZXh0ZW5kcyBPbWl0PFZhbGlkYXRpb25WaW9sYXRpb24sICd2aW9sYXRpbmdSZXNvdXJjZXMnPiB7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdHJ1Y3RzIHZpb2xhdGluZyB0aGlzIHJ1bGUuXG4gICAqL1xuICByZWFkb25seSB2aW9sYXRpbmdDb25zdHJ1Y3RzOiByZWFkb25seSBWYWxpZGF0aW9uVmlvbGF0aW5nQ29uc3RydWN0W107XG59XG5cbi8vIHdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGFuIGVudW0gc28gdGhhdFxuLy8gcGx1Z2lucyBkb24ndCBoYXZlIHRvIGltcG9ydCB0aGUgY2xpIGF0IHJ1bnRpbWUuXG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uUmVwb3J0U3RhdHVzID0gJ3N1Y2Nlc3MnIHwgJ2ZhaWx1cmUnO1xuXG4vKipcbiAqIFN1bW1hcnkgb2YgdGhlIHJlcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uUmVwb3J0U3VtbWFyeSB7XG5cbiAgcmVhZG9ubHkgc3RhdHVzOiBWYWxpZGF0aW9uUmVwb3J0U3RhdHVzO1xuXG4gIHJlYWRvbmx5IHBsdWdpbjogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICByZWFkb25seSBtZXRhZGF0YT86IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbn1cblxuLyoqXG4gKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXBvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlcG9ydEpzb24ge1xuXG4gIC8qKlxuICAgKiBSZXBvcnQgdGl0bGUuXG4gICAqL1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHZpb2xhdGlvbnMgaW4gdGhlIHJlcnBvdC5cbiAgICovXG4gIHJlYWRvbmx5IHZpb2xhdGlvbnM6IHJlYWRvbmx5IFZhbGlkYXRpb25WaW9sYXRpb25Db25zdHJ1Y3RBd2FyZVtdO1xuXG4gIC8qKlxuICAgKiBSZXBvcnQgc3VtbWFyeS5cbiAgICovXG4gIHJlYWRvbmx5IHN1bW1hcnk6IFZhbGlkYXRpb25SZXBvcnRTdW1tYXJ5O1xuXG59XG5cbi8qKlxuICogVGhlIHJlcG9ydCBlbWl0dGVkIGJ5IHRoZSBwbHVnaW4gYWZ0ZXIgZXZhbHVhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25SZXBvcnQge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlvbGF0aW9uczogVmFsaWRhdGlvblZpb2xhdGlvbkNvbnN0cnVjdEF3YXJlW10gPSBbXTtcblxuICBwcml2YXRlIF9zdW1tYXJ5PzogVmFsaWRhdGlvblJlcG9ydFN1bW1hcnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwa2c6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1ldGFkYXRhOiB7cmVhZG9ubHkgW2tleTogc3RyaW5nXTogUmVzb3VyY2VDb25zdHJ1Y3RNZXRhZGF0YX0sXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGRvdXQ6IGJvb2xlYW4pIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB2aW9sYXRpb24gdG8gdGhlIHJlcG9ydC5cbiAgICovXG4gIHB1YmxpYyBhZGRWaW9sYXRpb24odmlvbGF0aW9uOiBWYWxpZGF0aW9uVmlvbGF0aW9uKSB7XG4gICAgaWYgKHRoaXMuX3N1bW1hcnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmlvbGF0aW9ucyBjYW5ub3QgYmUgYWRkZWQgdG8gcmVwb3J0IGFmdGVyIGl0cyBzdWJtaXR0ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCB2aW9sYXRpbmdDb25zdHJ1Y3RzOiBWYWxpZGF0aW9uVmlvbGF0aW5nQ29uc3RydWN0W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgdmlvbGF0aW9uLnZpb2xhdGluZ1Jlc291cmNlcykge1xuICAgICAgY29uc3QgY29uc3RydWN0UGF0aCA9IHRoaXMubWV0YWRhdGFbcmVzb3VyY2UucmVzb3VyY2VOYW1lXT8ucGF0aDtcbiAgICAgIHZpb2xhdGluZ0NvbnN0cnVjdHMucHVzaCh7XG4gICAgICAgIC4uLnJlc291cmNlLFxuXG4gICAgICAgIC8vIGF1Z21lbnQgd2l0aCBjb25zdHJ1Y3QgbWV0YWRhdGFcbiAgICAgICAgY29uc3RydWN0UGF0aDogY29uc3RydWN0UGF0aCxcblxuICAgICAgICAvLyBpZiBzeW50aCBpcyBleGVjdXRlZCB3aXRoIC0tc3Rkb3V0LCB0aGUgbWFuaWZlc3QgcGF0aFxuICAgICAgICAvLyBoZXJlIGlzIHRlbXBvcmFyeSBhbmQgd2lsbCBiZSBkZWxldGVkIG9uY2UgdGhlIGNvbW1hbmQgZmluaXNoZXMuXG4gICAgICAgIG1hbmlmZXN0UGF0aDogdGhpcy5zdGRvdXQgPyAnU1RET1VUJyA6IHJlc291cmNlLm1hbmlmZXN0UGF0aCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgIHJ1bGVOYW1lOiB2aW9sYXRpb24ucnVsZU5hbWUsXG4gICAgICByZWNvbW1lbmRhdGlvbjogdmlvbGF0aW9uLnJlY29tbWVuZGF0aW9uLFxuICAgICAgdmlvbGF0aW5nQ29uc3RydWN0czogdmlvbGF0aW5nQ29uc3RydWN0cyxcbiAgICAgIGZpeDogdmlvbGF0aW9uLmZpeCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXQgdGhlIHJlcG9ydCB3aXRoIGEgc3RhdHVzIGFuZCBhZGRpdGlvbmFsIG1ldGFkYXRhLlxuICAgKi9cbiAgcHVibGljIHN1Ym1pdChzdGF0dXM6IFZhbGlkYXRpb25SZXBvcnRTdGF0dXMsIG1ldGFkYXRhPzogeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuX3N1bW1hcnkgPSB7IHN0YXR1cywgcGx1Z2luOiB0aGlzLnBrZywgdmVyc2lvbjogdGhpcy52ZXJzaW9uLCBtZXRhZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSByZXBvcnQgd2FzIHN1Y2Nlc3NmdWxsLlxuICAgKi9cbiAgcHVibGljIGdldCBzdWNjZXNzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fc3VtbWFyeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZGV0ZXJtaW5lIHJlcG9ydCBzdGF0dXM6IFJlcG9ydCBpcyBpbmNvbXBsZXRlLiBDYWxsIFxcJ3JlcG9ydC5zdWJtaXRcXCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N1bW1hcnkuc3RhdHVzID09PSAnc3VjY2Vzcyc7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtIHRoZSByZXBvcnQgdG8gYSB3ZWxsIGZvcm1hdHRlZCB0YWJsZSBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcblxuICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGNvbnN0IG91dHB1dCA9IFtqc29uLnRpdGxlXTtcblxuICAgIG91dHB1dC5wdXNoKCctJy5yZXBlYXQoanNvbi50aXRsZS5sZW5ndGgpKTtcbiAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgb3V0cHV0LnB1c2goJyhTdW1tYXJ5KScpO1xuICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICBvdXRwdXQucHVzaCh0YWJsZShbXG4gICAgICBbJ1N0YXR1cycsIGpzb24uc3VtbWFyeS5zdGF0dXNdLFxuICAgICAgWydQbHVnaW4nLCBqc29uLnN1bW1hcnkucGx1Z2luXSxcbiAgICAgIFsnVmVyc2lvbicsIGpzb24uc3VtbWFyeS52ZXJzaW9uXSxcbiAgICAgIC4uLk9iamVjdC5lbnRyaWVzKGpzb24uc3VtbWFyeS5tZXRhZGF0YSA/PyB7fSksXG4gICAgXSkpO1xuXG4gICAgaWYgKGpzb24udmlvbGF0aW9ucykge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgICAgb3V0cHV0LnB1c2goJyhWaW9sYXRpb25zKScpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZpb2xhdGlvbiBvZiBqc29uLnZpb2xhdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9jY3VycmVuY2VzID0gdmlvbGF0aW9uLnZpb2xhdGluZ0NvbnN0cnVjdHMuZmxhdE1hcChjID0+IGMubG9jYXRpb25zKS5sZW5ndGg7XG4gICAgICBjb25zdCB0aXRsZSA9IHJlc2V0KHJlZChicmlnaHQoYCR7dmlvbGF0aW9uLnJ1bGVOYW1lfSAoJHtvY2N1cnJlbmNlc30gb2NjdXJyZW5jZXMpYCkpKTtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgIG91dHB1dC5wdXNoKHRpdGxlKTtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgIG91dHB1dC5wdXNoKCcgIE9jY3VycmVuY2VzOicpO1xuICAgICAgZm9yIChjb25zdCBjb25zdHJ1Y3Qgb2YgdmlvbGF0aW9uLnZpb2xhdGluZ0NvbnN0cnVjdHMpIHtcbiAgICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgICAgICBvdXRwdXQucHVzaChgICAgIC0gQ29uc3RydWN0IFBhdGg6ICR7Y29uc3RydWN0LmNvbnN0cnVjdFBhdGggPz8gJ04vQSd9YCk7XG4gICAgICAgIG91dHB1dC5wdXNoKGAgICAgLSBNYW5pZmVzdCBQYXRoOiAke2NvbnN0cnVjdC5tYW5pZmVzdFBhdGh9YCk7XG4gICAgICAgIG91dHB1dC5wdXNoKGAgICAgLSBSZXNvdXJjZSBOYW1lOiAke2NvbnN0cnVjdC5yZXNvdXJjZU5hbWV9YCk7XG4gICAgICAgIGlmIChjb25zdHJ1Y3QubG9jYXRpb25zKSB7XG4gICAgICAgICAgb3V0cHV0LnB1c2goJyAgICAtIExvY2F0aW9uczonKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIGNvbnN0cnVjdC5sb2NhdGlvbnMpIHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKGAgICAgICA+ICR7bG9jYXRpb259YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgICBvdXRwdXQucHVzaChgICBSZWNvbW1lbmRhdGlvbjogJHt2aW9sYXRpb24ucmVjb21tZW5kYXRpb259YCk7XG4gICAgICBvdXRwdXQucHVzaChgICBIb3cgdG8gZml4OiAke3Zpb2xhdGlvbi5maXh9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKG9zLkVPTCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdGhlIHJlcG9ydCBpbnRvIGEgSlNPTiBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgdG9Kc29uKCk6IFZhbGlkYXRpb25SZXBvcnRKc29uIHtcbiAgICBpZiAoIXRoaXMuX3N1bW1hcnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRldGVybWluZSByZXBvcnQgcmVzdWx0OiBSZXBvcnQgaXMgaW5jb21wbGV0ZS4gQ2FsbCBcXCdyZXBvcnQuc3VibWl0XFwnJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogYFZhbGlkYXRpb24gUmVwb3J0ICgke3RoaXMucGtnfUAke3RoaXMudmVyc2lvbn0pYCxcbiAgICAgIHZpb2xhdGlvbnM6IHRoaXMudmlvbGF0aW9ucyxcbiAgICAgIHN1bW1hcnk6IHRoaXMuX3N1bW1hcnksXG4gICAgfTtcbiAgfVxuXG59XG5cbi8qKlxuICogVXRpbGl5IGNsYXNzIGZvciBsb2FkaW5nIHZhbGlkYXRpb24gcGx1Z2lucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25QbHVnaW4ge1xuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSB2YWxpZGF0aW9uIHBsdWdpbiBhbmQgY3JlYXRlIHRoZSBuZWNlc3NhcnkgY29udGV4dCBmb3IgaXRzIGV4ZWN1dGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbG9hZChcbiAgICB2YWxpZGF0aW9uOiBWYWxpZGF0aW9uQ29uZmlnLFxuICAgIGFwcDogU3ludGhlc2l6ZWRBcHAsXG4gICAgc3Rkb3V0OiBib29sZWFuLFxuICAgIHBsdWdpbk1hbmFnZXI6IFBsdWdpbk1hbmFnZXIpOiB7IHBsdWdpbjogVmFsaWRhdGlvbjsgY29udGV4dDogVmFsaWRhdGlvbkNvbnRleHQgfSB7XG5cbiAgICBjb25zdCBwbHVnaW4gPSBwbHVnaW5NYW5hZ2VyLmxvYWQoe1xuICAgICAgcGtnOiB2YWxpZGF0aW9uLnBhY2thZ2UsXG4gICAgICB2ZXJzaW9uOiB2YWxpZGF0aW9uLnZlcnNpb24sXG4gICAgICBjbGFzczogdmFsaWRhdGlvbi5jbGFzcyxcbiAgICAgIHByb3BlcnRpZXM6IHZhbGlkYXRpb24ucHJvcGVydGllcyxcbiAgICAgIGluc3RhbGxFbnY6IHZhbGlkYXRpb24uaW5zdGFsbEVudixcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YoKHBsdWdpbi5pbnN0YW5jZSBhcyBhbnkpLnZhbGlkYXRlKSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnN0YW5jZSBvZiBjbGFzcyAnJHt2YWxpZGF0aW9uLmNsYXNzfScgZnJvbSBwYWNrYWdlICcke3ZhbGlkYXRpb24ucGFja2FnZX1AJHt2YWxpZGF0aW9uLnZlcnNpb259JyBpcyBub3QgYSB2YWxpZGF0aW9uIHBsdWdpbi4gQXJlIHlvdSBzdXJlIHlvdSBzcGVjaWZpZWQgdGhlIGNvcnJlY3QgY2xhc3M/YCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YWRhdGEgPSBhcHAuY29uc3RydWN0TWV0YWRhdGEgPyB0aGlzLmxvYWRDb25zdHJ1Y3RNZXRhZGF0YShhcHAuY29uc3RydWN0TWV0YWRhdGEpIDoge307XG4gICAgY29uc3QgY29udGV4dCA9IG5ldyBWYWxpZGF0aW9uQ29udGV4dChhcHAubWFuaWZlc3RzLCBwbHVnaW4ucGFja2FnZS5wa2csIHBsdWdpbi5wYWNrYWdlLnZlcnNpb24sIG1ldGFkYXRhLCBzdGRvdXQpO1xuICAgIHJldHVybiB7IHBsdWdpbjogcGx1Z2luLmluc3RhbmNlIGFzIFZhbGlkYXRpb24sIGNvbnRleHQgfTtcblxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbG9hZENvbnN0cnVjdE1ldGFkYXRhKGNvbnN0cnVjdE1ldGFkYXRhUGF0aDogc3RyaW5nKTogeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBSZXNvdXJjZUNvbnN0cnVjdE1ldGFkYXRhIH0ge1xuICAgIGNvbnN0IGNvbnRlbnRzID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uc3RydWN0TWV0YWRhdGFQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pKTtcbiAgICBjb25zdCByZXNvdXJjZXM6IHsgW2tleTogc3RyaW5nXTogUmVzb3VyY2VDb25zdHJ1Y3RNZXRhZGF0YSB9ID0ge307XG4gICAgaWYgKGNvbnRlbnRzLnZlcnNpb24gIT09ICcxLjAuMCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2ZXJzaW9uIG9mIGNvbnN0cnVjdCBtZXRhZGF0YSBhdCAke2NvbnN0cnVjdE1ldGFkYXRhUGF0aH06ICR7Y29udGVudHMudmVyc2lvbn0uIFN1cHBvcnRlZCB2ZXJzaW9ucyBhcmU6IFsxLjAuMF1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbbmFtZSwgbWV0YWRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKGNvbnRlbnRzLnJlc291cmNlcykpIHtcbiAgICAgIHJlc291cmNlc1tuYW1lXSA9IHsgcGF0aDogKG1ldGFkYXRhIGFzIGFueSkucGF0aCB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVzb3VyY2VzO1xuXG4gIH1cblxufVxuXG4vKipcbiAqIENvbnN0cnVjdCByZWxhdGVkIG1ldGFkYXRhIG9uIHJlc291cmNlcy5cbiAqL1xuaW50ZXJmYWNlIFJlc291cmNlQ29uc3RydWN0TWV0YWRhdGEge1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgY29uc3RydWN0IGluIHRoZSBhcHBsaWNhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxufVxuXG5mdW5jdGlvbiByZXNldChzOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGAke3N9XFx4MWJbMG1gO1xufVxuXG5mdW5jdGlvbiByZWQoczogc3RyaW5nKSB7XG4gIHJldHVybiBgXFx4MWJbMzFtJHtzfWA7XG59XG5cbmZ1bmN0aW9uIGJyaWdodChzOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGBcXHgxYlsxbSR7c31gO1xufSJdfQ==
;