aws-delivlib
Version:
A fabulous library for defining continuous pipelines for building, testing and releasing code libraries.
177 lines • 28.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BuildSpec = void 0;
const util_1 = require("./util");
const MAGIC_ARTIFACT_NAME = 'PRIMARY';
/**
* Class to model a buildspec version 0.2
*
* Artifact handling is a little special: CodeBuild will interpret the
* 'artifacts' section differently depending on whether there are secondary
* artifacts or not.
*
* If there is only one artifact, the single artifact must go into the top-level
* 'artifacts' section. If there are multiple artifacts, all of them must go
* into the 'secondary-artifacts' section. Upon rendering to JSON, the caller
* must supply the name of the primary artifact (it's determined by
* the CodePipeline Action that invokes the CodeBuild Project that uses this
* buildspec).
*
* INVARIANT: in-memory, the BuildSpec will treat all artifacts the same (as
* a bag of secondary artifacts). At the edges (construction or rendering),
* if there's only a single artifact it will be rendered to the primary
* artifact.
*/
class BuildSpec {
static literal(struct) {
return new BuildSpec(struct);
}
static simple(props) {
// We merge the primary artifact into the secondary artifacts under a special key
// They will be compacted back together during rendering.
const artifactDirectories = Object.assign({}, props.additionalArtifactDirectories || {}, props.artifactDirectory ? { [MAGIC_ARTIFACT_NAME]: props.artifactDirectory } : {});
let artifacts;
if (Object.keys(artifactDirectories || {}).length > 0) {
artifacts = {
'secondary-artifacts': (0, util_1.mapValues)(artifactDirectories, d => ({
'base-directory': d,
'files': ['**/*'],
})),
};
}
return new BuildSpec({
version: '0.2',
phases: (0, util_1.noUndefined)({
install: props.install !== undefined ? { commands: props.install } : undefined,
pre_build: props.preBuild !== undefined ? { commands: props.preBuild } : undefined,
build: props.build !== undefined ? { commands: props.build } : undefined,
}),
artifacts,
reports: props.reports,
});
}
static empty() {
return new BuildSpec({ version: '0.2' });
}
constructor(spec) {
this.spec = spec;
}
get additionalArtifactNames() {
return Object.keys(this.spec.artifacts && this.spec.artifacts['secondary-artifacts'] || {}).filter(n => n !== MAGIC_ARTIFACT_NAME);
}
merge(other) {
return new BuildSpec({
'version': '0.2',
'run-as': mergeObj(this.spec['run-as'], other.spec['run-as'], equalObjects),
'env': mergeObj(this.spec.env, other.spec.env, (a, b) => ({
'parameter-store': mergeDict(a['parameter-store'], b['parameter-store'], equalObjects),
'variables': mergeDict(a.variables, b.variables, equalObjects),
})),
'phases': mergeDict(this.spec.phases, other.spec.phases, (a, b, phase) => {
const merged = {
'run-as': mergeObj(a['run-as'], b['run-as'], equalObjects),
'on-failure': mergeObj(a['on-failure'], b['on-failure'], equalObjects),
'commands': mergeList(a.commands, b.commands),
'finally': mergeList(a.finally, b.finally),
};
if (phase === 'install') {
merged['runtime-versions'] = mergeDict(a['runtime-versions'], b['runtime-versions'], equalObjects);
}
return (0, util_1.noUndefined)(merged);
}),
'artifacts': mergeObj(this.spec.artifacts, other.spec.artifacts, mergeArtifacts),
'cache': mergeObj(this.spec.cache, other.spec.cache, (a, b) => ({
paths: mergeList(a.paths, b.paths),
})),
'reports': mergeDict(this.spec.reports, other.spec.reports, (a, b) => {
throw new Error(`Reports must have unique names, got ${a} and ${b}`);
}),
});
function mergeArtifacts(a, b) {
if (a.files || b.files) {
throw new Error('None of the BuildSpecs may have a primary artifact.');
}
const artifacts = Object.assign({}, a['secondary-artifacts'] || {});
for (const [k, v] of Object.entries(b['secondary-artifacts'] || {})) {
if (k in artifacts) {
throw new Error(`There is already an artifact with name ${k}`);
}
artifacts[k] = v;
}
return Object.assign({}, a, { 'secondary-artifacts': artifacts });
}
function equalObjects(a, b) {
if (a !== b) {
throw new Error(`Can't merge two different values for the same key: ${JSON.stringify(a)}, ${JSON.stringify(b)}`);
}
return b;
}
function mergeObj(a, b, fn) {
if (a === undefined) {
return b;
}
if (b === undefined) {
return a;
}
return fn(a, b);
}
function mergeDict(as, bs, fn) {
return mergeObj(as, bs, (a, b) => {
const ret = Object.assign({}, a);
for (const [k, v] of Object.entries(b)) {
if (ret[k]) {
ret[k] = fn(ret[k], v, k);
}
else {
ret[k] = v;
}
}
return ret;
});
}
function mergeList(as, bs) {
return mergeObj(as, bs, (a, b) => a.concat(b));
}
}
render(options = {}) {
return Object.assign({}, this.spec, { artifacts: this.renderArtifacts(options) });
}
renderArtifacts(options) {
if (!this.spec.artifacts || !this.spec.artifacts['secondary-artifacts']) {
return this.spec.artifacts;
}
// Simplify a single "secondary-artifacts" to a single primary artifact (regardless of the name)
const singleArt = dictSingletonValue(this.spec.artifacts['secondary-artifacts']);
if (singleArt) {
return singleArt;
}
// Otherwise rename a 'PRIMARY' key if it exists
if (MAGIC_ARTIFACT_NAME in this.spec.artifacts['secondary-artifacts']) {
if (!options.primaryArtifactName) {
throw new Error(`Replacement name for ${MAGIC_ARTIFACT_NAME} artifact not supplied`);
}
return { 'secondary-artifacts': renameKey(this.spec.artifacts['secondary-artifacts'], MAGIC_ARTIFACT_NAME, options.primaryArtifactName) };
}
return this.spec.artifacts;
}
}
exports.BuildSpec = BuildSpec;
/**
* If the dict is a singleton dict, return the value of the first key, otherwise return undefined
*/
function dictSingletonValue(xs) {
const keys = Object.keys(xs);
if (keys.length === 1) {
return xs[keys[0]];
}
return undefined;
}
function renameKey(xs, orig, rename) {
const ret = Object.assign({}, xs);
if (orig in ret) {
ret[rename] = ret[orig];
delete ret[orig];
}
return ret;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJ1aWxkLXNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQWdEO0FBR2hELE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFhLFNBQVM7SUFDYixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQXVCO1FBQzNDLE9BQU8sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBMkI7UUFDOUMsaUZBQWlGO1FBQ2pGLHlEQUF5RDtRQUN6RCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUMxQyxLQUFLLENBQUMsNkJBQTZCLElBQUksRUFBRSxFQUN6QyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2xGLENBQUM7UUFFRixJQUFJLFNBQTRDLENBQUM7UUFDakQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckQsU0FBUyxHQUFHO2dCQUNWLHFCQUFxQixFQUFFLElBQUEsZ0JBQVMsRUFBQyxtQkFBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzNELGdCQUFnQixFQUFFLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztpQkFDbEIsQ0FBQyxDQUFDO2FBQ0osQ0FBQztTQUNIO1FBRUQsT0FBTyxJQUFJLFNBQVMsQ0FBQztZQUNuQixPQUFPLEVBQUUsS0FBSztZQUNkLE1BQU0sRUFBRSxJQUFBLGtCQUFXLEVBQUM7Z0JBQ2xCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUM5RSxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDbEYsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDekUsQ0FBQztZQUNGLFNBQVM7WUFDVCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLO1FBQ2pCLE9BQU8sSUFBSSxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsWUFBcUMsSUFBcUI7UUFBckIsU0FBSSxHQUFKLElBQUksQ0FBaUI7SUFDMUQsQ0FBQztJQUVELElBQVcsdUJBQXVCO1FBQ2hDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3JJLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBZ0I7UUFDM0IsT0FBTyxJQUFJLFNBQVMsQ0FBQztZQUNuQixTQUFTLEVBQUUsS0FBSztZQUNoQixRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxZQUFZLENBQUM7WUFDM0UsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3hELGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsRUFBRSxZQUFZLENBQUM7Z0JBQ3RGLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQzthQUMvRCxDQUFDLENBQUM7WUFDSCxRQUFRLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDdkUsTUFBTSxNQUFNLEdBQWdCO29CQUMxQixRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsWUFBWSxDQUFDO29CQUMxRCxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDO29CQUN0RSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBRTtvQkFDOUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7aUJBQzNDLENBQUM7Z0JBRUYsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO29CQUN0QixNQUE2QixDQUFDLGtCQUFrQixDQUFDLEdBQUcsU0FBUyxDQUMzRCxDQUF3QixDQUFDLGtCQUFrQixDQUFDLEVBQzVDLENBQXdCLENBQUMsa0JBQWtCLENBQUMsRUFDN0MsWUFBWSxDQUNiLENBQUM7aUJBQ0g7Z0JBRUQsT0FBTyxJQUFBLGtCQUFXLEVBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUFDO1lBQ0YsV0FBVyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUM7WUFDaEYsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzlELEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFFO2FBQ3BDLENBQUMsQ0FBQztZQUNILFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ25FLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILFNBQVMsY0FBYyxDQUFDLENBQXdCLEVBQUUsQ0FBd0I7WUFDeEUsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQzthQUN4RTtZQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO2dCQUNuRSxJQUFJLENBQUMsSUFBSSxTQUFTLEVBQUU7b0JBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2hFO2dCQUNELFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDbEI7WUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUdELFNBQVMsWUFBWSxDQUFDLENBQVMsRUFBRSxDQUFTO1lBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2xIO1lBQ0QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBRUQsU0FBUyxRQUFRLENBQUksQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLEVBQXFCO1lBQzVFLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFBRSxPQUFPLENBQUMsQ0FBQzthQUFFO1lBQ2xDLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFBRSxPQUFPLENBQUMsQ0FBQzthQUFFO1lBQ2xDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBRUQsU0FBUyxTQUFTLENBQUksRUFBa0MsRUFBRSxFQUFrQyxFQUFFLEVBQWdDO1lBQzVILE9BQU8sUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDdEMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUMzQjt5QkFBTTt3QkFDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNaO2lCQUNGO2dCQUNELE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsU0FBUyxTQUFTLENBQUksRUFBbUIsRUFBRSxFQUFtQjtZQUM1RCxPQUFPLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRU0sTUFBTSxDQUFDLFVBQWtDLEVBQUU7UUFDaEQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFTyxlQUFlLENBQUMsT0FBK0I7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7U0FBRTtRQUV4RyxnR0FBZ0c7UUFDaEcsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLElBQUksU0FBUyxFQUFFO1lBQUUsT0FBTyxTQUFTLENBQUM7U0FBRTtRQUVwQyxnREFBZ0Q7UUFDaEQsSUFBSSxtQkFBbUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFO1lBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLG1CQUFtQix3QkFBd0IsQ0FBQyxDQUFDO2FBQ3RGO1lBRUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7U0FDM0k7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQXZKRCw4QkF1SkM7QUFtRkQ7O0dBRUc7QUFDSCxTQUFTLGtCQUFrQixDQUFJLEVBQXdCO0lBQ3JELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNyQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNwQjtJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBSSxFQUF3QixFQUFFLElBQVksRUFBRSxNQUFjO0lBQzFFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRTtRQUNmLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEI7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYXBWYWx1ZXMsIG5vVW5kZWZpbmVkIH0gZnJvbSAnLi91dGlsJztcblxuXG5jb25zdCBNQUdJQ19BUlRJRkFDVF9OQU1FID0gJ1BSSU1BUlknO1xuXG4vKipcbiAqIENsYXNzIHRvIG1vZGVsIGEgYnVpbGRzcGVjIHZlcnNpb24gMC4yXG4gKlxuICogQXJ0aWZhY3QgaGFuZGxpbmcgaXMgYSBsaXR0bGUgc3BlY2lhbDogQ29kZUJ1aWxkIHdpbGwgaW50ZXJwcmV0IHRoZVxuICogJ2FydGlmYWN0cycgc2VjdGlvbiBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGVyZSBhcmUgc2Vjb25kYXJ5XG4gKiBhcnRpZmFjdHMgb3Igbm90LlxuICpcbiAqIElmIHRoZXJlIGlzIG9ubHkgb25lIGFydGlmYWN0LCB0aGUgc2luZ2xlIGFydGlmYWN0IG11c3QgZ28gaW50byB0aGUgdG9wLWxldmVsXG4gKiAnYXJ0aWZhY3RzJyBzZWN0aW9uLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgYXJ0aWZhY3RzLCBhbGwgb2YgdGhlbSBtdXN0IGdvXG4gKiBpbnRvIHRoZSAnc2Vjb25kYXJ5LWFydGlmYWN0cycgc2VjdGlvbi4gVXBvbiByZW5kZXJpbmcgdG8gSlNPTiwgdGhlIGNhbGxlclxuICogbXVzdCBzdXBwbHkgdGhlIG5hbWUgb2YgdGhlIHByaW1hcnkgYXJ0aWZhY3QgKGl0J3MgZGV0ZXJtaW5lZCBieVxuICogdGhlIENvZGVQaXBlbGluZSBBY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBDb2RlQnVpbGQgUHJvamVjdCB0aGF0IHVzZXMgdGhpc1xuICogYnVpbGRzcGVjKS5cbiAqXG4gKiBJTlZBUklBTlQ6IGluLW1lbW9yeSwgdGhlIEJ1aWxkU3BlYyB3aWxsIHRyZWF0IGFsbCBhcnRpZmFjdHMgdGhlIHNhbWUgKGFzXG4gKiBhIGJhZyBvZiBzZWNvbmRhcnkgYXJ0aWZhY3RzKS4gQXQgdGhlIGVkZ2VzIChjb25zdHJ1Y3Rpb24gb3IgcmVuZGVyaW5nKSxcbiAqIGlmIHRoZXJlJ3Mgb25seSBhIHNpbmdsZSBhcnRpZmFjdCBpdCB3aWxsIGJlIHJlbmRlcmVkIHRvIHRoZSBwcmltYXJ5XG4gKiBhcnRpZmFjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1aWxkU3BlYyB7XG4gIHB1YmxpYyBzdGF0aWMgbGl0ZXJhbChzdHJ1Y3Q6IEJ1aWxkU3BlY1N0cnVjdCkge1xuICAgIHJldHVybiBuZXcgQnVpbGRTcGVjKHN0cnVjdCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNpbXBsZShwcm9wczogU2ltcGxlQnVpbGRTcGVjUHJvcHMpIHtcbiAgICAvLyBXZSBtZXJnZSB0aGUgcHJpbWFyeSBhcnRpZmFjdCBpbnRvIHRoZSBzZWNvbmRhcnkgYXJ0aWZhY3RzIHVuZGVyIGEgc3BlY2lhbCBrZXlcbiAgICAvLyBUaGV5IHdpbGwgYmUgY29tcGFjdGVkIGJhY2sgdG9nZXRoZXIgZHVyaW5nIHJlbmRlcmluZy5cbiAgICBjb25zdCBhcnRpZmFjdERpcmVjdG9yaWVzID0gT2JqZWN0LmFzc2lnbih7fSxcbiAgICAgIHByb3BzLmFkZGl0aW9uYWxBcnRpZmFjdERpcmVjdG9yaWVzIHx8IHt9LFxuICAgICAgcHJvcHMuYXJ0aWZhY3REaXJlY3RvcnkgPyB7IFtNQUdJQ19BUlRJRkFDVF9OQU1FXTogcHJvcHMuYXJ0aWZhY3REaXJlY3RvcnkgfSA6IHt9LFxuICAgICk7XG5cbiAgICBsZXQgYXJ0aWZhY3RzOiBQcmltYXJ5QXJ0aWZhY3RTdHJ1Y3QgfCB1bmRlZmluZWQ7XG4gICAgaWYgKE9iamVjdC5rZXlzKGFydGlmYWN0RGlyZWN0b3JpZXMgfHwge30pLmxlbmd0aCA+IDApIHtcbiAgICAgIGFydGlmYWN0cyA9IHtcbiAgICAgICAgJ3NlY29uZGFyeS1hcnRpZmFjdHMnOiBtYXBWYWx1ZXMoYXJ0aWZhY3REaXJlY3RvcmllcyEsIGQgPT4gKHtcbiAgICAgICAgICAnYmFzZS1kaXJlY3RvcnknOiBkLFxuICAgICAgICAgICdmaWxlcyc6IFsnKiovKiddLFxuICAgICAgICB9KSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQnVpbGRTcGVjKHtcbiAgICAgIHZlcnNpb246ICcwLjInLFxuICAgICAgcGhhc2VzOiBub1VuZGVmaW5lZCh7XG4gICAgICAgIGluc3RhbGw6IHByb3BzLmluc3RhbGwgIT09IHVuZGVmaW5lZCA/IHsgY29tbWFuZHM6IHByb3BzLmluc3RhbGwgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlX2J1aWxkOiBwcm9wcy5wcmVCdWlsZCAhPT0gdW5kZWZpbmVkID8geyBjb21tYW5kczogcHJvcHMucHJlQnVpbGQgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgYnVpbGQ6IHByb3BzLmJ1aWxkICE9PSB1bmRlZmluZWQgPyB7IGNvbW1hbmRzOiBwcm9wcy5idWlsZCB9IDogdW5kZWZpbmVkLFxuICAgICAgfSksXG4gICAgICBhcnRpZmFjdHMsXG4gICAgICByZXBvcnRzOiBwcm9wcy5yZXBvcnRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBlbXB0eSgpIHtcbiAgICByZXR1cm4gbmV3IEJ1aWxkU3BlYyh7IHZlcnNpb246ICcwLjInIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHNwZWM6IEJ1aWxkU3BlY1N0cnVjdCkge1xuICB9XG5cbiAgcHVibGljIGdldCBhZGRpdGlvbmFsQXJ0aWZhY3ROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuc3BlYy5hcnRpZmFjdHMgJiYgdGhpcy5zcGVjLmFydGlmYWN0c1snc2Vjb25kYXJ5LWFydGlmYWN0cyddIHx8IHt9KS5maWx0ZXIobiA9PiBuICE9PSBNQUdJQ19BUlRJRkFDVF9OQU1FKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXJnZShvdGhlcjogQnVpbGRTcGVjKTogQnVpbGRTcGVjIHtcbiAgICByZXR1cm4gbmV3IEJ1aWxkU3BlYyh7XG4gICAgICAndmVyc2lvbic6ICcwLjInLFxuICAgICAgJ3J1bi1hcyc6IG1lcmdlT2JqKHRoaXMuc3BlY1sncnVuLWFzJ10sIG90aGVyLnNwZWNbJ3J1bi1hcyddLCBlcXVhbE9iamVjdHMpLFxuICAgICAgJ2Vudic6IG1lcmdlT2JqKHRoaXMuc3BlYy5lbnYsIG90aGVyLnNwZWMuZW52LCAoYSwgYikgPT4gKHtcbiAgICAgICAgJ3BhcmFtZXRlci1zdG9yZSc6IG1lcmdlRGljdChhWydwYXJhbWV0ZXItc3RvcmUnXSwgYlsncGFyYW1ldGVyLXN0b3JlJ10sIGVxdWFsT2JqZWN0cyksXG4gICAgICAgICd2YXJpYWJsZXMnOiBtZXJnZURpY3QoYS52YXJpYWJsZXMsIGIudmFyaWFibGVzLCBlcXVhbE9iamVjdHMpLFxuICAgICAgfSkpLFxuICAgICAgJ3BoYXNlcyc6IG1lcmdlRGljdCh0aGlzLnNwZWMucGhhc2VzLCBvdGhlci5zcGVjLnBoYXNlcywgKGEsIGIsIHBoYXNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lcmdlZDogUGhhc2VTdHJ1Y3QgPSB7XG4gICAgICAgICAgJ3J1bi1hcyc6IG1lcmdlT2JqKGFbJ3J1bi1hcyddLCBiWydydW4tYXMnXSwgZXF1YWxPYmplY3RzKSxcbiAgICAgICAgICAnb24tZmFpbHVyZSc6IG1lcmdlT2JqKGFbJ29uLWZhaWx1cmUnXSwgYlsnb24tZmFpbHVyZSddLCBlcXVhbE9iamVjdHMpLFxuICAgICAgICAgICdjb21tYW5kcyc6IG1lcmdlTGlzdChhLmNvbW1hbmRzLCBiLmNvbW1hbmRzKSEsXG4gICAgICAgICAgJ2ZpbmFsbHknOiBtZXJnZUxpc3QoYS5maW5hbGx5LCBiLmZpbmFsbHkpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwaGFzZSA9PT0gJ2luc3RhbGwnKSB7XG4gICAgICAgICAgKG1lcmdlZCBhcyBJbnN0YWxsUGhhc2VTdHJ1Y3QpWydydW50aW1lLXZlcnNpb25zJ10gPSBtZXJnZURpY3QoXG4gICAgICAgICAgICAoYSBhcyBJbnN0YWxsUGhhc2VTdHJ1Y3QpWydydW50aW1lLXZlcnNpb25zJ10sXG4gICAgICAgICAgICAoYiBhcyBJbnN0YWxsUGhhc2VTdHJ1Y3QpWydydW50aW1lLXZlcnNpb25zJ10sXG4gICAgICAgICAgICBlcXVhbE9iamVjdHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub1VuZGVmaW5lZChtZXJnZWQpO1xuICAgICAgfSksXG4gICAgICAnYXJ0aWZhY3RzJzogbWVyZ2VPYmoodGhpcy5zcGVjLmFydGlmYWN0cywgb3RoZXIuc3BlYy5hcnRpZmFjdHMsIG1lcmdlQXJ0aWZhY3RzKSxcbiAgICAgICdjYWNoZSc6IG1lcmdlT2JqKHRoaXMuc3BlYy5jYWNoZSwgb3RoZXIuc3BlYy5jYWNoZSwgKGEsIGIpID0+ICh7XG4gICAgICAgIHBhdGhzOiBtZXJnZUxpc3QoYS5wYXRocywgYi5wYXRocykhLFxuICAgICAgfSkpLFxuICAgICAgJ3JlcG9ydHMnOiBtZXJnZURpY3QodGhpcy5zcGVjLnJlcG9ydHMsIG90aGVyLnNwZWMucmVwb3J0cywgKGEsIGIpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXBvcnRzIG11c3QgaGF2ZSB1bmlxdWUgbmFtZXMsIGdvdCAke2F9IGFuZCAke2J9YCk7XG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1lcmdlQXJ0aWZhY3RzKGE6IFByaW1hcnlBcnRpZmFjdFN0cnVjdCwgYjogUHJpbWFyeUFydGlmYWN0U3RydWN0KTogUHJpbWFyeUFydGlmYWN0U3RydWN0IHtcbiAgICAgIGlmIChhLmZpbGVzIHx8IGIuZmlsZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb25lIG9mIHRoZSBCdWlsZFNwZWNzIG1heSBoYXZlIGEgcHJpbWFyeSBhcnRpZmFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXJ0aWZhY3RzID0gT2JqZWN0LmFzc2lnbih7fSwgYVsnc2Vjb25kYXJ5LWFydGlmYWN0cyddIHx8IHt9KTtcbiAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGJbJ3NlY29uZGFyeS1hcnRpZmFjdHMnXSB8fCB7fSkpIHtcbiAgICAgICAgaWYgKGsgaW4gYXJ0aWZhY3RzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSBpcyBhbHJlYWR5IGFuIGFydGlmYWN0IHdpdGggbmFtZSAke2t9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYXJ0aWZhY3RzW2tdID0gdjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBhLCB7ICdzZWNvbmRhcnktYXJ0aWZhY3RzJzogYXJ0aWZhY3RzIH0pO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gZXF1YWxPYmplY3RzKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG4gICAgICBpZiAoYSAhPT0gYikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IG1lcmdlIHR3byBkaWZmZXJlbnQgdmFsdWVzIGZvciB0aGUgc2FtZSBrZXk6ICR7SlNPTi5zdHJpbmdpZnkoYSl9LCAke0pTT04uc3RyaW5naWZ5KGIpfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VPYmo8VD4oYTogVCB8IHVuZGVmaW5lZCwgYjogVCB8IHVuZGVmaW5lZCwgZm46IChhOiBULCBiOiBUKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBiOyB9XG4gICAgICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBhOyB9XG4gICAgICByZXR1cm4gZm4oYSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VEaWN0PFQ+KGFzOiB7IFtrOiBzdHJpbmddOiBUIH0gfCB1bmRlZmluZWQsIGJzOiB7IFtrOiBzdHJpbmddOiBUIH0gfCB1bmRlZmluZWQsIGZuOiAoYTogVCwgYjogVCwgazogc3RyaW5nKSA9PiBUKSB7XG4gICAgICByZXR1cm4gbWVyZ2VPYmooYXMsIGJzLCAoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCByZXQgPSBPYmplY3QuYXNzaWduKHt9LCBhKTtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYikpIHtcbiAgICAgICAgICBpZiAocmV0W2tdKSB7XG4gICAgICAgICAgICByZXRba10gPSBmbihyZXRba10sIHYsIGspO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXRba10gPSB2O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VMaXN0PFQ+KGFzOiBUW10gfCB1bmRlZmluZWQsIGJzOiBUW10gfCB1bmRlZmluZWQpOiBUW10gfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIG1lcmdlT2JqKGFzLCBicywgKGEsIGIpID0+IGEuY29uY2F0KGIpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKG9wdGlvbnM6IEJ1aWxkU3BlY1JlbmRlck9wdGlvbnMgPSB7fSk6IEJ1aWxkU3BlY1N0cnVjdCB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3BlYywgeyBhcnRpZmFjdHM6IHRoaXMucmVuZGVyQXJ0aWZhY3RzKG9wdGlvbnMpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJBcnRpZmFjdHMob3B0aW9uczogQnVpbGRTcGVjUmVuZGVyT3B0aW9ucyk6IFByaW1hcnlBcnRpZmFjdFN0cnVjdCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnNwZWMuYXJ0aWZhY3RzIHx8ICF0aGlzLnNwZWMuYXJ0aWZhY3RzWydzZWNvbmRhcnktYXJ0aWZhY3RzJ10pIHsgcmV0dXJuIHRoaXMuc3BlYy5hcnRpZmFjdHM7IH1cblxuICAgIC8vIFNpbXBsaWZ5IGEgc2luZ2xlIFwic2Vjb25kYXJ5LWFydGlmYWN0c1wiIHRvIGEgc2luZ2xlIHByaW1hcnkgYXJ0aWZhY3QgKHJlZ2FyZGxlc3Mgb2YgdGhlIG5hbWUpXG4gICAgY29uc3Qgc2luZ2xlQXJ0ID0gZGljdFNpbmdsZXRvblZhbHVlKHRoaXMuc3BlYy5hcnRpZmFjdHNbJ3NlY29uZGFyeS1hcnRpZmFjdHMnXSk7XG4gICAgaWYgKHNpbmdsZUFydCkgeyByZXR1cm4gc2luZ2xlQXJ0OyB9XG5cbiAgICAvLyBPdGhlcndpc2UgcmVuYW1lIGEgJ1BSSU1BUlknIGtleSBpZiBpdCBleGlzdHNcbiAgICBpZiAoTUFHSUNfQVJUSUZBQ1RfTkFNRSBpbiB0aGlzLnNwZWMuYXJ0aWZhY3RzWydzZWNvbmRhcnktYXJ0aWZhY3RzJ10pIHtcbiAgICAgIGlmICghb3B0aW9ucy5wcmltYXJ5QXJ0aWZhY3ROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVwbGFjZW1lbnQgbmFtZSBmb3IgJHtNQUdJQ19BUlRJRkFDVF9OQU1FfSBhcnRpZmFjdCBub3Qgc3VwcGxpZWRgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgJ3NlY29uZGFyeS1hcnRpZmFjdHMnOiByZW5hbWVLZXkodGhpcy5zcGVjLmFydGlmYWN0c1snc2Vjb25kYXJ5LWFydGlmYWN0cyddLCBNQUdJQ19BUlRJRkFDVF9OQU1FLCBvcHRpb25zLnByaW1hcnlBcnRpZmFjdE5hbWUpIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3BlYy5hcnRpZmFjdHM7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVCdWlsZFNwZWNQcm9wcyB7XG4gIGluc3RhbGw/OiBzdHJpbmdbXTtcbiAgcHJlQnVpbGQ/OiBzdHJpbmdbXTtcbiAgYnVpbGQ/OiBzdHJpbmdbXTtcbiAgcmVwb3J0cz86IHsgW2tleTogc3RyaW5nXTogUmVwb3J0U3RydWN0IH07XG4gIGFydGlmYWN0RGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgZGlyZWN0b3JpZXMgZm9yIGVhY2ggYXJ0aWZhY3QgYXJlXG4gICAqXG4gICAqIFVzZSBzcGVjaWFsIG5hbWUgUFJJTUFSWSB0byByZWZlciB0byB0aGUgcHJpbWFyeSBhcnRpZmFjdC4gV2lsbCBiZVxuICAgKiByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgYXJ0aWZhY3QgbmFtZSB3aGVuIHRoZSBidWlsZCBzcGVjIGlzIHN5bnRoZXNpemVkLlxuICAgKi9cbiAgYWRkaXRpb25hbEFydGlmYWN0RGlyZWN0b3JpZXM/OiB7IFtpZDogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRTcGVjU3RydWN0IHtcbiAgJ3ZlcnNpb24nOiAnMC4yJztcbiAgJ3J1bi1hcyc/OiBzdHJpbmc7XG4gICdlbnYnPzogRW52U3RydWN0O1xuICAncGhhc2VzJz86IHtcbiAgICBpbnN0YWxsPzogSW5zdGFsbFBoYXNlU3RydWN0O1xuICAgIHByZV9idWlsZD86IFBoYXNlU3RydWN0O1xuICAgIGJ1aWxkPzogUGhhc2VTdHJ1Y3Q7XG4gICAgcG9zdF9idWlsZD86IFBoYXNlU3RydWN0O1xuICB9O1xuICAnYXJ0aWZhY3RzJz86IFByaW1hcnlBcnRpZmFjdFN0cnVjdDtcbiAgJ2NhY2hlJz86IENhY2hlU3RydWN0O1xuICAncmVwb3J0cyc/OiB7IFtrZXk6IHN0cmluZ106IFJlcG9ydFN0cnVjdCB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudlN0cnVjdCB7XG4gICd2YXJpYWJsZXMnPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgJ3BhcmFtZXRlci1zdG9yZSc/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAnZXhwb3J0ZWQtdmFyaWFibGVzJz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBoYXNlU3RydWN0IHtcbiAgJ3J1bi1hcyc/OiBzdHJpbmc7XG4gICdvbi1mYWlsdXJlJz86IHN0cmluZztcbiAgJ2NvbW1hbmRzJzogc3RyaW5nW107XG4gICdmaW5hbGx5Jz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbGxQaGFzZVN0cnVjdCBleHRlbmRzIFBoYXNlU3RydWN0IHtcbiAgJ3J1bnRpbWUtdmVyc2lvbnMnPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRTdHJ1Y3Qge1xuICAnZmlsZXMnPzogc3RyaW5nW107XG4gICdiYXNlLWRpcmVjdG9yeSc/OiBzdHJpbmc7XG4gICdkaXNjYXJkLXBhdGhzJz86ICd5ZXMnIHwgJ25vJztcbiAgJ2ZpbGUtZm9ybWF0Jz86ICdDdWN1bWJlckpzb24nIHwgJ0p1bml0WG1sJyB8ICdOdW5pdFhtbCcgfCAnVGVzdE5HWG1sJyB8ICdWaXN1YWxTdHVkaW9UcngnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFydGlmYWN0U3RydWN0IHtcbiAgJ2ZpbGVzJz86IHN0cmluZ1tdO1xuICAnbmFtZSc/OiBzdHJpbmc7XG4gICdiYXNlLWRpcmVjdG9yeSc/OiBzdHJpbmc7XG4gICdkaXNjYXJkLXBhdGhzJz86ICd5ZXMnIHwgJ25vJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmltYXJ5QXJ0aWZhY3RTdHJ1Y3QgZXh0ZW5kcyBBcnRpZmFjdFN0cnVjdCB7XG4gICdzZWNvbmRhcnktYXJ0aWZhY3RzJz86IHsgW2tleTogc3RyaW5nXTogQXJ0aWZhY3RTdHJ1Y3QgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZVN0cnVjdCB7XG4gIHBhdGhzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFNwZWNSZW5kZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJlcGxhY2UgUFJJTUFSWSBhcnRpZmFjdCBuYW1lIHdpdGggdGhpc1xuICAgKlxuICAgKiBDYW5ub3QgdXNlIHRoZSBzcGVjaWFsIHRlcm0gUFJJTUFSWSBpZiB0aGlzIGlzIG5vdCBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgIENhbm5vdCB1c2UgUFJJTUFSWVxuICAgKi9cbiAgcHJpbWFyeUFydGlmYWN0TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJZiB0aGUgZGljdCBpcyBhIHNpbmdsZXRvbiBkaWN0LCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBrZXksIG90aGVyd2lzZSByZXR1cm4gdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGRpY3RTaW5nbGV0b25WYWx1ZTxUPih4czogeyBba2V5OiBzdHJpbmddOiBUIH0pOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHhzKTtcbiAgaWYgKGtleXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHhzW2tleXNbMF1dO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlbmFtZUtleTxUPih4czogeyBba2V5OiBzdHJpbmddOiBUIH0sIG9yaWc6IHN0cmluZywgcmVuYW1lOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IFQgfSB7XG4gIGNvbnN0IHJldCA9IE9iamVjdC5hc3NpZ24oe30sIHhzKTtcbiAgaWYgKG9yaWcgaW4gcmV0KSB7XG4gICAgcmV0W3JlbmFtZV0gPSByZXRbb3JpZ107XG4gICAgZGVsZXRlIHJldFtvcmlnXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIl19