UNPKG

cdk8s-cli

Version:

This is the command line tool for Cloud Development Kit (CDK) for Kubernetes (cdk8s).

195 lines • 25 kB
"use strict"; 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; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.safeParseCrds = exports.ImportCustomResourceDefinition = exports.CustomResourceDefinition = void 0; const fs = __importStar(require("fs")); const path = __importStar(require("path")); const ajv_1 = __importDefault(require("ajv")); const codemaker_1 = require("codemaker"); const json2jsii_1 = require("json2jsii"); const base_1 = require("./base"); const codegen_1 = require("./codegen"); const reviver_1 = require("../reviver"); const util_1 = require("../util"); const CRD_KIND = 'CustomResourceDefinition'; // all these APIs are compatible from our perspective. const SUPPORTED_API_VERSIONS = [ 'apiextensions.k8s.io/v1beta1', 'apiextensions.k8s.io/v1', ]; class CustomResourceDefinition { constructor(manifest) { this.versions = []; const apiVersion = manifest?.apiVersion ?? 'undefined'; assert(SUPPORTED_API_VERSIONS.includes(apiVersion), `"apiVersion" is "${apiVersion}" but it should be one of: ${SUPPORTED_API_VERSIONS.map(x => `"${x}"`).join(', ')}`); assert(manifest.kind === CRD_KIND, `"kind" must be "${CRD_KIND}"`); const spec = manifest.spec; if (!spec) { throw new Error('manifest does not have a "spec" attribute'); } this.group = spec.group; this.kind = spec.names.kind; if (spec.version) { this.addVersions([{ name: spec.version, schema: spec.validation?.openAPIV3Schema }]); } else { this.addVersions((spec.versions ?? []).map(v => ({ name: v.name, schema: v.schema?.openAPIV3Schema ?? spec.validation?.openAPIV3Schema }))); } if (this.versions.length === 0) { throw new Error('unable to determine CRD versions'); } } merge(crd) { this.addVersions(crd.versions); } addVersions(versions) { for (const v of versions) { const existingVersions = this.versions.map(ver => ver.name); if (existingVersions.includes(v.name)) { throw new Error(`Found multiple occurrences of version ${v.name} for ${this.key}`); } this.versions.push({ name: v.name, schema: v.schema }); } } get key() { return `${this.group}/${this.kind.toLocaleLowerCase()}`; } async generateTypeScript(code, options) { for (let i = 0; i < this.versions.length; i++) { const version = this.versions[i]; // to preseve backwards compatiblity, only append a suffix for // the second version onwards. const suffix = i === 0 ? '' : (0, codemaker_1.toPascalCase)(version.name); const types = new json2jsii_1.TypeGenerator({}); (0, codegen_1.generateConstruct)(types, { group: this.group, version: version.name, kind: this.kind, fqn: `${this.kind}${suffix}`, schema: version.schema, custom: true, prefix: options.classNamePrefix, suffix, }); code.line(types.render()); } } } exports.CustomResourceDefinition = CustomResourceDefinition; class ImportCustomResourceDefinition extends base_1.ImportBase { static async fromSpec(importSpec) { const { source } = importSpec; const manifest = await (0, util_1.download)(source); return new ImportCustomResourceDefinition(manifest); } constructor(rawManifest) { super(); this.groups = {}; this.rawManifest = rawManifest; const manifest = safeParseCrds(rawManifest); const crds = {}; const groups = {}; for (const spec of manifest) { const crd = new CustomResourceDefinition(spec); const key = crd.key; if (key in crds) { // might contain different versions - lets try to merge them in crds[key].merge(crd); } else { crds[key] = crd; } } //sort to ensure consistent ordering for snapshot compare const sortedCrds = Object.values(crds).sort((a, b) => a.key.localeCompare(b.key)); for (const crd of sortedCrds) { const g = crd.group; if (!(g in groups)) { groups[g] = new Array(); } groups[g].push(crd); } this.groups = groups; } get moduleNames() { return Object.keys(this.groups); } async generateTypeScript(code, moduleName, options) { const crds = this.groups[moduleName]; (0, codegen_1.emitHeader)(code, true); for (const crd of crds) { console.log(` ${crd.key}`); await crd.generateTypeScript(code, options); } } } exports.ImportCustomResourceDefinition = ImportCustomResourceDefinition; function assert(condition, message) { if (!condition) { throw new Error(`invalid CustomResourceDefinition manifest: ${message}`); } } function safeParseCrds(manifest) { const schemaPath = path.join(__dirname, '..', 'schemas', 'crd.schema.json'); const schema = JSON.parse(fs.readFileSync(schemaPath, { encoding: 'utf8' })); const reviver = new reviver_1.SafeReviver({ sanitizers: [reviver_1.SafeReviver.DESCRIPTION_SANITIZER, reviver_1.SafeReviver.LEGAL_CHAR_SANITIZER], }); // first parse and strip const objects = (0, util_1.safeParseYaml)(manifest, reviver); // since the manifest can contain non crds as well, we first // collect all crds and only apply a schema validation on them. const crds = []; function collectCRDs(objs) { for (const obj of objs.filter(o => o)) { if (obj.kind === CRD_KIND) { crds.push(obj); } if (obj.kind === 'List') { collectCRDs(obj.items); } } } collectCRDs(objects); const ajv = new ajv_1.default(); const validate = ajv.compile(schema); const errors = []; for (const crd of crds) { validate(crd); if (validate.errors) { errors.push(...validate.errors); } ; } if (errors.length > 0) { throw new Error(`Schema validation errors detected\n ${errors.map(e => `* ${e.message}`).join('\n')}`); } return crds; } exports.safeParseCrds = safeParseCrds; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydC9jcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLDhDQUFzQjtBQUN0Qix5Q0FBb0Q7QUFDcEQseUNBQTBDO0FBQzFDLGlDQUFxRDtBQUNyRCx1Q0FBMEQ7QUFFMUQsd0NBQXlDO0FBQ3pDLGtDQUFrRDtBQUVsRCxNQUFNLFFBQVEsR0FBRywwQkFBMEIsQ0FBQztBQTBCNUMsc0RBQXNEO0FBQ3RELE1BQU0sc0JBQXNCLEdBQUc7SUFDN0IsOEJBQThCO0lBQzlCLHlCQUF5QjtDQUMxQixDQUFDO0FBSUYsTUFBYSx3QkFBd0I7SUFPbkMsWUFBWSxRQUFrQztRQUo3QixhQUFRLEdBQXNDLEVBQUUsQ0FBQztRQUtoRSxNQUFNLFVBQVUsR0FBRyxRQUFRLEVBQUUsVUFBVSxJQUFJLFdBQVcsQ0FBQztRQUN2RCxNQUFNLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLG9CQUFvQixVQUFVLDhCQUE4QixzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4SyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsbUJBQW1CLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFFbkUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFFNUIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN0RjthQUFNO1lBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLGVBQWUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdJO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1NBQ3JEO0lBRUgsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUE2QjtRQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sV0FBVyxDQUFDLFFBQTJDO1FBQzdELEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFO1lBQ3hCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsSUFBSSxRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2FBQ3BGO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDeEQ7SUFDSCxDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUVNLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFlLEVBQUUsT0FBd0I7UUFFdkUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBRTdDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFakMsOERBQThEO1lBQzlELDhCQUE4QjtZQUM5QixNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUEsd0JBQVksRUFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFekQsTUFBTSxLQUFLLEdBQUcsSUFBSSx5QkFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXBDLElBQUEsMkJBQWlCLEVBQUMsS0FBSyxFQUFFO2dCQUN2QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxFQUFFO2dCQUM1QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ3RCLE1BQU0sRUFBRSxJQUFJO2dCQUNaLE1BQU0sRUFBRSxPQUFPLENBQUMsZUFBZTtnQkFDL0IsTUFBTTthQUNQLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDM0I7SUFDSCxDQUFDO0NBQ0Y7QUE1RUQsNERBNEVDO0FBRUQsTUFBYSw4QkFBK0IsU0FBUSxpQkFBVTtJQUNyRCxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFzQjtRQUNqRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxlQUFRLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsT0FBTyxJQUFJLDhCQUE4QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFLRCxZQUFvQixXQUFtQjtRQUNyQyxLQUFLLEVBQUUsQ0FBQztRQUhPLFdBQU0sR0FBK0MsRUFBRyxDQUFDO1FBS3hFLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU1QyxNQUFNLElBQUksR0FBNkMsRUFBRyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUErQyxFQUFHLENBQUM7UUFFL0QsS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLEVBQUU7WUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBRXBCLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtnQkFDZiwrREFBK0Q7Z0JBQy9ELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDdEI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzthQUNqQjtTQUNGO1FBRUQseURBQXlEO1FBQ3pELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBMkIsRUFBRSxDQUEyQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV0SSxLQUFLLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRTtZQUM1QixNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQ3BCLElBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsRUFBRztnQkFDcEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxFQUE0QixDQUFDO2FBQ25EO1lBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNyQjtRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRVMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQWUsRUFBRSxVQUFrQixFQUFFLE9BQXdCO1FBQzlGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFHckMsSUFBQSxvQkFBVSxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV2QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtZQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDNUIsTUFBTSxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztDQUNGO0FBNURELHdFQTREQztBQUVELFNBQVMsTUFBTSxDQUFDLFNBQWtCLEVBQUUsT0FBZTtJQUNqRCxJQUFJLENBQUMsU0FBUyxFQUFFO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsT0FBTyxFQUFFLENBQUMsQ0FBQztLQUMxRTtBQUNILENBQUM7QUFHRCxTQUFnQixhQUFhLENBQUMsUUFBZ0I7SUFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sT0FBTyxHQUFHLElBQUkscUJBQVcsQ0FBQztRQUM5QixVQUFVLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLHFCQUFxQixFQUFFLHFCQUFXLENBQUMsb0JBQW9CLENBQUM7S0FDbEYsQ0FBQyxDQUFDO0lBRUgsd0JBQXdCO0lBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUEsb0JBQWEsRUFBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFakQsNERBQTREO0lBQzVELCtEQUErRDtJQUUvRCxNQUFNLElBQUksR0FBVSxFQUFFLENBQUM7SUFFdkIsU0FBUyxXQUFXLENBQUMsSUFBVztRQUM5QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNyQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtnQkFDdkIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN4QjtTQUNGO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUVyQixNQUFNLEdBQUcsR0FBRyxJQUFJLGFBQUcsRUFBRSxDQUFDO0lBQ3RCLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ3RCLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2pDO1FBQUEsQ0FBQztLQUNIO0lBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ3hHO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBekNELHNDQXlDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQWp2IGZyb20gJ2Fqdic7XG5pbXBvcnQgeyBDb2RlTWFrZXIsIHRvUGFzY2FsQ2FzZSB9IGZyb20gJ2NvZGVtYWtlcic7XG5pbXBvcnQgeyBUeXBlR2VuZXJhdG9yIH0gZnJvbSAnanNvbjJqc2lpJztcbmltcG9ydCB7IEdlbmVyYXRlT3B0aW9ucywgSW1wb3J0QmFzZSB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBlbWl0SGVhZGVyLCBnZW5lcmF0ZUNvbnN0cnVjdCB9IGZyb20gJy4vY29kZWdlbic7XG5pbXBvcnQgeyBJbXBvcnRTcGVjIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IFNhZmVSZXZpdmVyIH0gZnJvbSAnLi4vcmV2aXZlcic7XG5pbXBvcnQgeyBkb3dubG9hZCwgc2FmZVBhcnNlWWFtbCB9IGZyb20gJy4uL3V0aWwnO1xuXG5jb25zdCBDUkRfS0lORCA9ICdDdXN0b21SZXNvdXJjZURlZmluaXRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hbmlmZXN0T2JqZWN0RGVmaW5pdGlvbiB7XG4gIGFwaVZlcnNpb24/OiBzdHJpbmc7XG4gIGtpbmQ/OiBzdHJpbmc7XG4gIGl0ZW1zPzogTWFuaWZlc3RPYmplY3REZWZpbml0aW9uW107IC8vIGlmIGBraW5kYCBpcyBcIkxpc3RcIlxuICBtZXRhZGF0YT86IHtcbiAgICBuYW1lPzogc3RyaW5nO1xuICB9O1xuICBzcGVjPzoge1xuICAgIGdyb3VwOiBzdHJpbmc7XG4gICAgbmFtZXM6IHtcbiAgICAgIGtpbmQ6IHN0cmluZztcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICB9O1xuICAgIHZlcnNpb25zPzogQXJyYXk8e1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgc2NoZW1hPzogeyBvcGVuQVBJVjNTY2hlbWE/OiBhbnkgfTtcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICB9PjtcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIHZhbGlkYXRpb24/OiB7IG9wZW5BUElWM1NjaGVtYT86IGFueSB9O1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgfTtcbn1cblxuLy8gYWxsIHRoZXNlIEFQSXMgYXJlIGNvbXBhdGlibGUgZnJvbSBvdXIgcGVyc3BlY3RpdmUuXG5jb25zdCBTVVBQT1JURURfQVBJX1ZFUlNJT05TID0gW1xuICAnYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjFiZXRhMScsXG4gICdhcGlleHRlbnNpb25zLms4cy5pby92MScsXG5dO1xuXG50eXBlIEN1c3RvbVJlc291cmNlRGVmaW5pdGlvblZlcnNpb24gPSB7IG5hbWU6IHN0cmluZzsgc2NoZW1hPzogYW55IH07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZXNvdXJjZURlZmluaXRpb24ge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkga2luZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHZlcnNpb25zOiBDdXN0b21SZXNvdXJjZURlZmluaXRpb25WZXJzaW9uW10gPSBbXTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZ3JvdXA6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtYW5pZmVzdDogTWFuaWZlc3RPYmplY3REZWZpbml0aW9uKSB7XG4gICAgY29uc3QgYXBpVmVyc2lvbiA9IG1hbmlmZXN0Py5hcGlWZXJzaW9uID8/ICd1bmRlZmluZWQnO1xuICAgIGFzc2VydChTVVBQT1JURURfQVBJX1ZFUlNJT05TLmluY2x1ZGVzKGFwaVZlcnNpb24pLCBgXCJhcGlWZXJzaW9uXCIgaXMgXCIke2FwaVZlcnNpb259XCIgYnV0IGl0IHNob3VsZCBiZSBvbmUgb2Y6ICR7U1VQUE9SVEVEX0FQSV9WRVJTSU9OUy5tYXAoeCA9PiBgXCIke3h9XCJgKS5qb2luKCcsICcpfWApO1xuICAgIGFzc2VydChtYW5pZmVzdC5raW5kID09PSBDUkRfS0lORCwgYFwia2luZFwiIG11c3QgYmUgXCIke0NSRF9LSU5EfVwiYCk7XG5cbiAgICBjb25zdCBzcGVjID0gbWFuaWZlc3Quc3BlYztcbiAgICBpZiAoIXNwZWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWFuaWZlc3QgZG9lcyBub3QgaGF2ZSBhIFwic3BlY1wiIGF0dHJpYnV0ZScpO1xuICAgIH1cblxuICAgIHRoaXMuZ3JvdXAgPSBzcGVjLmdyb3VwO1xuICAgIHRoaXMua2luZCA9IHNwZWMubmFtZXMua2luZDtcblxuICAgIGlmIChzcGVjLnZlcnNpb24pIHtcbiAgICAgIHRoaXMuYWRkVmVyc2lvbnMoW3sgbmFtZTogc3BlYy52ZXJzaW9uLCBzY2hlbWE6IHNwZWMudmFsaWRhdGlvbj8ub3BlbkFQSVYzU2NoZW1hIH1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRWZXJzaW9ucygoc3BlYy52ZXJzaW9ucyA/PyBbXSkubWFwKHYgPT4gKHsgbmFtZTogdi5uYW1lLCBzY2hlbWE6IHYuc2NoZW1hPy5vcGVuQVBJVjNTY2hlbWEgPz8gc3BlYy52YWxpZGF0aW9uPy5vcGVuQVBJVjNTY2hlbWEgfSkpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52ZXJzaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGRldGVybWluZSBDUkQgdmVyc2lvbnMnKTtcbiAgICB9XG5cbiAgfVxuXG4gIHB1YmxpYyBtZXJnZShjcmQ6IEN1c3RvbVJlc291cmNlRGVmaW5pdGlvbikge1xuICAgIHRoaXMuYWRkVmVyc2lvbnMoY3JkLnZlcnNpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVmVyc2lvbnModmVyc2lvbnM6IEN1c3RvbVJlc291cmNlRGVmaW5pdGlvblZlcnNpb25bXSkge1xuICAgIGZvciAoY29uc3QgdiBvZiB2ZXJzaW9ucykge1xuICAgICAgY29uc3QgZXhpc3RpbmdWZXJzaW9ucyA9IHRoaXMudmVyc2lvbnMubWFwKHZlciA9PiB2ZXIubmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmdWZXJzaW9ucy5pbmNsdWRlcyh2Lm5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgdmVyc2lvbiAke3YubmFtZX0gZm9yICR7dGhpcy5rZXl9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLnZlcnNpb25zLnB1c2goeyBuYW1lOiB2Lm5hbWUsIHNjaGVtYTogdi5zY2hlbWEgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBrZXkoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ3JvdXB9LyR7dGhpcy5raW5kLnRvTG9jYWxlTG93ZXJDYXNlKCl9YDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZW5lcmF0ZVR5cGVTY3JpcHQoY29kZTogQ29kZU1ha2VyLCBvcHRpb25zOiBHZW5lcmF0ZU9wdGlvbnMpIHtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52ZXJzaW9ucy5sZW5ndGg7IGkrKykge1xuXG4gICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy52ZXJzaW9uc1tpXTtcblxuICAgICAgLy8gdG8gcHJlc2V2ZSBiYWNrd2FyZHMgY29tcGF0aWJsaXR5LCBvbmx5IGFwcGVuZCBhIHN1ZmZpeCBmb3JcbiAgICAgIC8vIHRoZSBzZWNvbmQgdmVyc2lvbiBvbndhcmRzLlxuICAgICAgY29uc3Qgc3VmZml4ID0gaSA9PT0gMCA/ICcnIDogdG9QYXNjYWxDYXNlKHZlcnNpb24ubmFtZSk7XG5cbiAgICAgIGNvbnN0IHR5cGVzID0gbmV3IFR5cGVHZW5lcmF0b3Ioe30pO1xuXG4gICAgICBnZW5lcmF0ZUNvbnN0cnVjdCh0eXBlcywge1xuICAgICAgICBncm91cDogdGhpcy5ncm91cCxcbiAgICAgICAgdmVyc2lvbjogdmVyc2lvbi5uYW1lLFxuICAgICAgICBraW5kOiB0aGlzLmtpbmQsXG4gICAgICAgIGZxbjogYCR7dGhpcy5raW5kfSR7c3VmZml4fWAsXG4gICAgICAgIHNjaGVtYTogdmVyc2lvbi5zY2hlbWEsXG4gICAgICAgIGN1c3RvbTogdHJ1ZSxcbiAgICAgICAgcHJlZml4OiBvcHRpb25zLmNsYXNzTmFtZVByZWZpeCxcbiAgICAgICAgc3VmZml4LFxuICAgICAgfSk7XG5cbiAgICAgIGNvZGUubGluZSh0eXBlcy5yZW5kZXIoKSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbXBvcnRDdXN0b21SZXNvdXJjZURlZmluaXRpb24gZXh0ZW5kcyBJbXBvcnRCYXNlIHtcbiAgcHVibGljIHN0YXRpYyBhc3luYyBmcm9tU3BlYyhpbXBvcnRTcGVjOiBJbXBvcnRTcGVjKTogUHJvbWlzZTxJbXBvcnRDdXN0b21SZXNvdXJjZURlZmluaXRpb24+IHtcbiAgICBjb25zdCB7IHNvdXJjZSB9ID0gaW1wb3J0U3BlYztcbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGRvd25sb2FkKHNvdXJjZSk7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRDdXN0b21SZXNvdXJjZURlZmluaXRpb24obWFuaWZlc3QpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHJhd01hbmlmZXN0OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JvdXBzOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21SZXNvdXJjZURlZmluaXRpb25bXT4gPSB7IH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihyYXdNYW5pZmVzdDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMucmF3TWFuaWZlc3QgPSByYXdNYW5pZmVzdDtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHNhZmVQYXJzZUNyZHMocmF3TWFuaWZlc3QpO1xuXG4gICAgY29uc3QgY3JkczogUmVjb3JkPHN0cmluZywgQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uPiA9IHsgfTtcbiAgICBjb25zdCBncm91cHM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbVJlc291cmNlRGVmaW5pdGlvbltdPiA9IHsgfTtcblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBtYW5pZmVzdCkge1xuICAgICAgY29uc3QgY3JkID0gbmV3IEN1c3RvbVJlc291cmNlRGVmaW5pdGlvbihzcGVjKTtcbiAgICAgIGNvbnN0IGtleSA9IGNyZC5rZXk7XG5cbiAgICAgIGlmIChrZXkgaW4gY3Jkcykge1xuICAgICAgICAvLyBtaWdodCBjb250YWluIGRpZmZlcmVudCB2ZXJzaW9ucyAtIGxldHMgdHJ5IHRvIG1lcmdlIHRoZW0gaW5cbiAgICAgICAgY3Jkc1trZXldLm1lcmdlKGNyZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjcmRzW2tleV0gPSBjcmQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9zb3J0IHRvIGVuc3VyZSBjb25zaXN0ZW50IG9yZGVyaW5nIGZvciBzbmFwc2hvdCBjb21wYXJlXG4gICAgY29uc3Qgc29ydGVkQ3JkcyA9IE9iamVjdC52YWx1ZXMoY3Jkcykuc29ydCgoYTogQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uLCBiOiBDdXN0b21SZXNvdXJjZURlZmluaXRpb24pID0+IGEua2V5LmxvY2FsZUNvbXBhcmUoYi5rZXkpKTtcblxuICAgIGZvciAoY29uc3QgY3JkIG9mIHNvcnRlZENyZHMpIHtcbiAgICAgIGNvbnN0IGcgPSBjcmQuZ3JvdXA7XG4gICAgICBpZiAoICEoZyBpbiBncm91cHMpICkge1xuICAgICAgICBncm91cHNbZ10gPSBuZXcgQXJyYXk8Q3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uPigpO1xuICAgICAgfVxuICAgICAgZ3JvdXBzW2ddLnB1c2goY3JkKTtcbiAgICB9XG5cbiAgICB0aGlzLmdyb3VwcyA9IGdyb3VwcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbW9kdWxlTmFtZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZ3JvdXBzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZVR5cGVTY3JpcHQoY29kZTogQ29kZU1ha2VyLCBtb2R1bGVOYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEdlbmVyYXRlT3B0aW9ucykge1xuICAgIGNvbnN0IGNyZHMgPSB0aGlzLmdyb3Vwc1ttb2R1bGVOYW1lXTtcblxuXG4gICAgZW1pdEhlYWRlcihjb2RlLCB0cnVlKTtcblxuICAgIGZvciAoY29uc3QgY3JkIG9mIGNyZHMpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Y3JkLmtleX1gKTtcbiAgICAgIGF3YWl0IGNyZC5nZW5lcmF0ZVR5cGVTY3JpcHQoY29kZSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydChjb25kaXRpb246IGJvb2xlYW4sIG1lc3NhZ2U6IHN0cmluZykge1xuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBDdXN0b21SZXNvdXJjZURlZmluaXRpb24gbWFuaWZlc3Q6ICR7bWVzc2FnZX1gKTtcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBzYWZlUGFyc2VDcmRzKG1hbmlmZXN0OiBzdHJpbmcpOiBNYW5pZmVzdE9iamVjdERlZmluaXRpb25bXSB7XG4gIGNvbnN0IHNjaGVtYVBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnc2NoZW1hcycsICdjcmQuc2NoZW1hLmpzb24nKTtcbiAgY29uc3Qgc2NoZW1hID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2NoZW1hUGF0aCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pKTtcbiAgY29uc3QgcmV2aXZlciA9IG5ldyBTYWZlUmV2aXZlcih7XG4gICAgc2FuaXRpemVyczogW1NhZmVSZXZpdmVyLkRFU0NSSVBUSU9OX1NBTklUSVpFUiwgU2FmZVJldml2ZXIuTEVHQUxfQ0hBUl9TQU5JVElaRVJdLFxuICB9KTtcblxuICAvLyBmaXJzdCBwYXJzZSBhbmQgc3RyaXBcbiAgY29uc3Qgb2JqZWN0cyA9IHNhZmVQYXJzZVlhbWwobWFuaWZlc3QsIHJldml2ZXIpO1xuXG4gIC8vIHNpbmNlIHRoZSBtYW5pZmVzdCBjYW4gY29udGFpbiBub24gY3JkcyBhcyB3ZWxsLCB3ZSBmaXJzdFxuICAvLyBjb2xsZWN0IGFsbCBjcmRzIGFuZCBvbmx5IGFwcGx5IGEgc2NoZW1hIHZhbGlkYXRpb24gb24gdGhlbS5cblxuICBjb25zdCBjcmRzOiBhbnlbXSA9IFtdO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3RDUkRzKG9ianM6IGFueVtdKSB7XG4gICAgZm9yIChjb25zdCBvYmogb2Ygb2Jqcy5maWx0ZXIobyA9PiBvKSkge1xuICAgICAgaWYgKG9iai5raW5kID09PSBDUkRfS0lORCkge1xuICAgICAgICBjcmRzLnB1c2gob2JqKTtcbiAgICAgIH1cbiAgICAgIGlmIChvYmoua2luZCA9PT0gJ0xpc3QnKSB7XG4gICAgICAgIGNvbGxlY3RDUkRzKG9iai5pdGVtcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29sbGVjdENSRHMob2JqZWN0cyk7XG5cbiAgY29uc3QgYWp2ID0gbmV3IEFqdigpO1xuICBjb25zdCB2YWxpZGF0ZSA9IGFqdi5jb21waWxlKHNjaGVtYSk7XG4gIGNvbnN0IGVycm9ycyA9IFtdO1xuICBmb3IgKGNvbnN0IGNyZCBvZiBjcmRzKSB7XG4gICAgdmFsaWRhdGUoY3JkKTtcbiAgICBpZiAodmFsaWRhdGUuZXJyb3JzKSB7XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZS5lcnJvcnMpO1xuICAgIH07XG4gIH1cbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY2hlbWEgdmFsaWRhdGlvbiBlcnJvcnMgZGV0ZWN0ZWRcXG4gJHtlcnJvcnMubWFwKGUgPT4gYCogJHtlLm1lc3NhZ2V9YCkuam9pbignXFxuJyl9YCk7XG4gIH1cbiAgcmV0dXJuIGNyZHM7XG59XG4iXX0=