projen
Version:
CDK for software projects
198 lines • 22 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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommitAndTagVersion = void 0;
/**
* Library to invoke commit-and-tag-version
*/
const fs_1 = require("fs");
const path = __importStar(require("node:path"));
const logging = __importStar(require("../logging"));
const exec_1 = require("../util/exec");
const DEFAULT_CATV_SPEC = "commit-and-tag-version@^13";
class CommitAndTagVersion {
cwd;
options;
tool;
args;
constructor(packageSpec, cwd, options) {
this.cwd = cwd;
this.options = options;
let resolvedCli;
if (!packageSpec) {
// If no packageSpec is given, try and resolve the CATV binary
// from devDependencies. This will speed up execution a lot.
try {
resolvedCli = require.resolve("commit-and-tag-version/bin/cli.js");
}
catch {
// not installed locally; fall back to npx below
}
}
if (resolvedCli) {
// Run the resolved CLI directly with node - fully shell-free.
this.tool = exec_1.node;
this.args = [resolvedCli];
}
else {
// npx is a Windows `.cmd` shim, so it runs via the cross-platform helper.
this.tool = exec_1.npx;
this.args = [packageSpec ?? DEFAULT_CATV_SPEC];
}
}
/**
* Invoke the `commit-and-tag` package
*/
async invoke(options) {
const configOptions = this.options.configOptions ?? {};
const versionFile = { filename: this.options.versionFile, type: "json" };
const catvConfig = {
commitAll: false,
infile: this.options.changelogFile,
prerelease: this.options.prerelease,
header: "",
skip: {
commit: true,
tag: true,
bump: options.skipBump,
changelog: options.skipChangelog,
},
tagPrefix: this.options.tagPrefix
? `${this.options.tagPrefix}v`
: undefined,
releaseAs: options.releaseAs,
dryRun: options.dryRun,
...configOptions,
packageFiles: this.mergeFiles(versionFile, configOptions.packageFiles),
bumpFiles: this.mergeFiles(versionFile, configOptions.bumpFiles),
};
logging.debug(`.versionrc.json: ${JSON.stringify(catvConfig)}`);
// Generate a temporary config file, then execute the package and remove the
// config file again.
const rcfile = path.join(this.cwd, ".versionrc.json");
await fs_1.promises.writeFile(rcfile, JSON.stringify(catvConfig, undefined, 2));
try {
let ret;
if (options.capture) {
ret = await this.tool.capture(this.args, { cwd: this.cwd });
}
else {
await this.tool.run(this.args, { cwd: this.cwd });
}
return ret;
}
finally {
await fs_1.promises.unlink(rcfile);
}
}
/**
* Keep the version file first, since CATV reads the current version from the first package file.
*/
mergeFiles(versionFile, files = []) {
const merged = [versionFile];
const seen = new Set([path.resolve(this.cwd, versionFile.filename)]);
for (const file of files) {
const resolved = path.resolve(this.cwd, file.filename);
if (!seen.has(resolved)) {
seen.add(resolved);
merged.push(file);
}
}
return merged;
}
/**
* Regenerate the most recent change log
*
* Do this by deleting the most recent tag, running CATV, then
* restoring the tag.
*
* We do this combined with skipping the bump to make CATV regenerate the
* changelog of the most recent release (if we left the tag, the changelog
* would be empty).
*/
async regeneratePreviousChangeLog(version, latestTag) {
const oldCommit = exec_1.git.capture(["rev-parse", latestTag], {
cwd: this.cwd,
});
exec_1.git.run(["tag", "--delete", latestTag], { cwd: this.cwd });
try {
await this.invoke({
releaseAs: version,
skipBump: true,
});
}
finally {
exec_1.git.run(["tag", latestTag, oldCommit], { cwd: this.cwd });
}
}
/**
* Invoke CATV and return the version it would have bumped to
*
* CATV will always at least perform a patch bump, even if there aren't any
* commits to look at.
*
* We have to do this by parsing the output string, which is pretty bad
* but I don't see that we have another way.
*/
async dryRun() {
const output = stripAnsi(await this.invoke({
capture: true,
dryRun: true,
skipChangelog: true,
}));
const re = /bumping version.*from ([0-9a-z.+-]+) to ([0-9a-z.+-]+)/im;
const m = re.exec(output);
if (!m) {
throw new Error(`Could not match ${re} in ${output}`);
}
return m[2];
}
}
exports.CommitAndTagVersion = CommitAndTagVersion;
/**
* Strips ANSI escape codes from a string
*
* Need to use this because the `--no-colors` argument to CATV is sometimes
* respected and sometimes not and it's driving me crazy.
*/
function stripAnsi(str) {
// Pattern matches all ANSI escape sequences including colors, cursor movement, etc
const pattern = [
"[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)",
"(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))",
].join("|");
return str.replace(new RegExp(pattern, "g"), "");
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LXRhZy12ZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbGVhc2UvY29tbWl0LXRhZy12ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsMkJBQW9DO0FBQ3BDLGdEQUFrQztBQUVsQyxvREFBc0M7QUFDdEMsdUNBQThDO0FBRzlDLE1BQU0saUJBQWlCLEdBQUcsNEJBQTRCLENBQUM7QUFtQnZELE1BQWEsbUJBQW1CO0lBTVg7SUFDQTtJQU5GLElBQUksQ0FBbUI7SUFDdkIsSUFBSSxDQUFXO0lBRWhDLFlBQ0UsV0FBK0IsRUFDZCxHQUFXLEVBQ1gsT0FBNEI7UUFENUIsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUNYLFlBQU8sR0FBUCxPQUFPLENBQXFCO1FBRTdDLElBQUksV0FBK0IsQ0FBQztRQUNwQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsOERBQThEO1lBQzlELDREQUE0RDtZQUM1RCxJQUFJLENBQUM7Z0JBQ0gsV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLGdEQUFnRDtZQUNsRCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsOERBQThEO1lBQzlELElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBSSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QixDQUFDO2FBQU0sQ0FBQztZQUNOLDBFQUEwRTtZQUMxRSxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQUcsQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVyxJQUFJLGlCQUFpQixDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFF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QUNiLE1BQU0sRUFBRSxJQUFJO1lBQ1osYUFBYSxFQUFFLElBQUk7U0FDcEIsQ0FBQyxDQUNILENBQUM7UUFDRixNQUFNLEVBQUUsR0FBRywwREFBMEQsQ0FBQztRQUN0RSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLENBQUM7Q0FDRjtBQXBKRCxrREFvSkM7QUFpQ0Q7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxHQUFXO0lBQzVCLG1GQUFtRjtJQUNuRixNQUFNLE9BQU8sR0FBRztRQUNkLDhIQUE4SDtRQUM5SCwwREFBMEQ7S0FDM0QsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExpYnJhcnkgdG8gaW52b2tlIGNvbW1pdC1hbmQtdGFnLXZlcnNpb25cbiAqL1xuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb25maWctc3BlY1wiO1xuaW1wb3J0ICogYXMgbG9nZ2luZyBmcm9tIFwiLi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHsgZ2l0LCBub2RlLCBucHggfSBmcm9tIFwiLi4vdXRpbC9leGVjXCI7XG5pbXBvcnQgdHlwZSB7IEFzeW5jVG9vbCwgVG9vbCB9IGZyb20gXCIuLi91dGlsL2V4ZWNcIjtcblxuY29uc3QgREVGQVVMVF9DQVRWX1NQRUMgPSBcImNvbW1pdC1hbmQtdGFnLXZlcnNpb25AXjEzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0QW5kVGFnT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHRhZ1ByZWZpeD86IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbkZpbGU6IHN0cmluZztcbiAgcmVhZG9ubHkgY2hhbmdlbG9nRmlsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcHJlcmVsZWFzZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29uZmlnT3B0aW9ucz86IENvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZva2VPcHRpb25zIHtcbiAgcmVhZG9ubHkgcmVsZWFzZUFzPzogc3RyaW5nO1xuICByZWFkb25seSBkcnlSdW4/OiBib29sZWFuO1xuICAvKiogQXZvaWQgdXBkYXRpbmcgdGhlIHZlcnNpb24gZmlsZXMgKi9cbiAgcmVhZG9ubHkgc2tpcEJ1bXA/OiBib29sZWFuO1xuICByZWFkb25seSBza2lwQ2hhbmdlbG9nPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2FwdHVyZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBDb21taXRBbmRUYWdWZXJzaW9uIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0b29sOiBUb29sIHwgQXN5bmNUb29sO1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3M6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhY2thZ2VTcGVjOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjd2Q6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IENvbW1pdEFuZFRhZ09wdGlvbnMsXG4gICkge1xuICAgIGxldCByZXNvbHZlZENsaTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghcGFja2FnZVNwZWMpIHtcbiAgICAgIC8vIElmIG5vIHBhY2thZ2VTcGVjIGlzIGdpdmVuLCB0cnkgYW5kIHJlc29sdmUgdGhlIENBVFYgYmluYXJ5XG4gICAgICAvLyBmcm9tIGRldkRlcGVuZGVuY2llcy4gVGhpcyB3aWxsIHNwZWVkIHVwIGV4ZWN1dGlvbiBhIGxvdC5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVkQ2xpID0gcmVxdWlyZS5yZXNvbHZlKFwiY29tbWl0LWFuZC10YWctdmVyc2lvbi9iaW4vY2xpLmpzXCIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIG5vdCBpbnN0YWxsZWQgbG9jYWxseTsgZmFsbCBiYWNrIHRvIG5weCBiZWxvd1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXNvbHZlZENsaSkge1xuICAgICAgLy8gUnVuIHRoZSByZXNvbHZlZCBDTEkgZGlyZWN0bHkgd2l0aCBub2RlIC0gZnVsbHkgc2hlbGwtZnJlZS5cbiAgICAgIHRoaXMudG9vbCA9IG5vZGU7XG4gICAgICB0aGlzLmFyZ3MgPSBbcmVzb2x2ZWRDbGldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBucHggaXMgYSBXaW5kb3dzIGAuY21kYCBzaGltLCBzbyBpdCBydW5zIHZpYSB0aGUgY3Jvc3MtcGxhdGZvcm0gaGVscGVyLlxuICAgICAgdGhpcy50b29sID0gbnB4O1xuICAgICAgdGhpcy5hcmdzID0gW3BhY2thZ2VTcGVjID8/IERFRkFVTFRfQ0FUVl9TUEVDXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIHRoZSBgY29tbWl0LWFuZC10YWdgIHBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbnZva2U8QSBleHRlbmRzIEludm9rZU9wdGlvbnM+KFxuICAgIG9wdGlvbnM6IEEsXG4gICk6IFByb21pc2U8QSBleHRlbmRzIHsgY2FwdHVyZTogdHJ1ZSB9ID8gc3RyaW5nIDogdm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZ09wdGlvbnM6IENvbW1pdEFuZFRhZ0NvbmZpZyA9IHRoaXMub3B0aW9ucy5jb25maWdPcHRpb25zID8/IHt9O1xuICAgIGNvbnN0IHZlcnNpb25GaWxlID0geyBmaWxlbmFtZTogdGhpcy5vcHRpb25zLnZlcnNpb25GaWxlLCB0eXBlOiBcImpzb25cIiB9O1xuICAgIGNvbnN0IGNhdHZDb25maWc6IENvbW1pdEFuZFRhZ0NvbmZpZyA9IHtcbiAgICAgIGNvbW1pdEFsbDogZmFsc2UsXG4gICAgICBpbmZpbGU6IHRoaXMub3B0aW9ucy5jaGFuZ2Vsb2dGaWxlLFxuICAgICAgcHJlcmVsZWFzZTogdGhpcy5vcHRpb25zLnByZXJlbGVhc2UsXG4gICAgICBoZWFkZXI6IFwiXCIsXG4gICAgICBza2lwOiB7XG4gICAgICAgIGNvbW1pdDogdHJ1ZSxcbiAgICAgICAgdGFnOiB0cnVlLFxuICAgICAgICBidW1wOiBvcHRpb25zLnNraXBCdW1wLFxuICAgICAgICBjaGFuZ2Vsb2c6IG9wdGlvbnMuc2tpcENoYW5nZWxvZyxcbiAgICAgIH0sXG4gICAgICB0YWdQcmVmaXg6IHRoaXMub3B0aW9ucy50YWdQcmVmaXhcbiAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMudGFnUHJlZml4fXZgXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgcmVsZWFzZUFzOiBvcHRpb25zLnJlbGVhc2VBcyxcbiAgICAgIGRyeVJ1bjogb3B0aW9ucy5kcnlSdW4sXG4gICAgICAuLi5jb25maWdPcHRpb25zLFxuICAgICAgcGFja2FnZUZpbGVzOiB0aGlzLm1lcmdlRmlsZXModmVyc2lvbkZpbGUsIGNvbmZpZ09wdGlvbnMucGFja2FnZUZpbGVzKSxcbiAgICAgIGJ1bXBGaWxlczogdGhpcy5tZXJnZUZpbGVzKHZlcnNpb25GaWxlLCBjb25maWdPcHRpb25zLmJ1bXBGaWxlcyksXG4gICAgfTtcbiAgICBsb2dnaW5nLmRlYnVnKGAudmVyc2lvbnJjLmpzb246ICR7SlNPTi5zdHJpbmdpZnkoY2F0dkNvbmZpZyl9YCk7XG5cbiAgICAvLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBjb25maWcgZmlsZSwgdGhlbiBleGVjdXRlIHRoZSBwYWNrYWdlIGFuZCByZW1vdmUgdGhlXG4gICAgLy8gY29uZmlnIGZpbGUgYWdhaW4uXG4gICAgY29uc3QgcmNmaWxlID0gcGF0aC5qb2luKHRoaXMuY3dkLCBcIi52ZXJzaW9ucmMuanNvblwiKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocmNmaWxlLCBKU09OLnN0cmluZ2lmeShjYXR2Q29uZmlnLCB1bmRlZmluZWQsIDIpKTtcbiAgICB0cnkge1xuICAgICAgbGV0IHJldDogYW55O1xuICAgICAgaWYgKG9wdGlvbnMuY2FwdHVyZSkge1xuICAgICAgICByZXQgPSBhd2FpdCB0aGlzLnRvb2wuY2FwdHVyZSh0aGlzLmFyZ3MsIHsgY3dkOiB0aGlzLmN3ZCB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMudG9vbC5ydW4odGhpcy5hcmdzLCB7IGN3ZDogdGhpcy5jd2QgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsocmNmaWxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogS2VlcCB0aGUgdmVyc2lvbiBmaWxlIGZpcnN0LCBzaW5jZSBDQVRWIHJlYWRzIHRoZSBjdXJyZW50IHZlcnNpb24gZnJvbSB0aGUgZmlyc3QgcGFja2FnZSBmaWxlLlxuICAgKi9cbiAgcHJpdmF0ZSBtZXJnZUZpbGVzKFxuICAgIHZlcnNpb25GaWxlOiBDb21taXRBbmRUYWdGaWxlLFxuICAgIGZpbGVzOiBDb21taXRBbmRUYWdGaWxlW10gPSBbXSxcbiAgKTogQ29tbWl0QW5kVGFnRmlsZVtdIHtcbiAgICBjb25zdCBtZXJnZWQgPSBbdmVyc2lvbkZpbGVdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KFtwYXRoLnJlc29sdmUodGhpcy5jd2QsIHZlcnNpb25GaWxlLmZpbGVuYW1lKV0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUodGhpcy5jd2QsIGZpbGUuZmlsZW5hbWUpO1xuICAgICAgaWYgKCFzZWVuLmhhcyhyZXNvbHZlZCkpIHtcbiAgICAgICAgc2Vlbi5hZGQocmVzb2x2ZWQpO1xuICAgICAgICBtZXJnZWQucHVzaChmaWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdlbmVyYXRlIHRoZSBtb3N0IHJlY2VudCBjaGFuZ2UgbG9nXG4gICAqXG4gICAqIERvIHRoaXMgYnkgZGVsZXRpbmcgdGhlIG1vc3QgcmVjZW50IHRhZywgcnVubmluZyBDQVRWLCB0aGVuXG4gICAqIHJlc3RvcmluZyB0aGUgdGFnLlxuICAgKlxuICAgKiBXZSBkbyB0aGlzIGNvbWJpbmVkIHdpdGggc2tpcHBpbmcgdGhlIGJ1bXAgdG8gbWFrZSBDQVRWIHJlZ2VuZXJhdGUgdGhlXG4gICAqIGNoYW5nZWxvZyBvZiB0aGUgbW9zdCByZWNlbnQgcmVsZWFzZSAoaWYgd2UgbGVmdCB0aGUgdGFnLCB0aGUgY2hhbmdlbG9nXG4gICAqIHdvdWxkIGJlIGVtcHR5KS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdlbmVyYXRlUHJldmlvdXNDaGFuZ2VMb2codmVyc2lvbjogc3RyaW5nLCBsYXRlc3RUYWc6IHN0cmluZykge1xuICAgIGNvbnN0IG9sZENvbW1pdCA9IGdpdC5jYXB0dXJlKFtcInJldi1wYXJzZVwiLCBsYXRlc3RUYWddLCB7XG4gICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgIH0pO1xuXG4gICAgZ2l0LnJ1bihbXCJ0YWdcIiwgXCItLWRlbGV0ZVwiLCBsYXRlc3RUYWddLCB7IGN3ZDogdGhpcy5jd2QgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW52b2tlKHtcbiAgICAgICAgcmVsZWFzZUFzOiB2ZXJzaW9uLFxuICAgICAgICBza2lwQnVtcDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBnaXQucnVuKFtcInRhZ1wiLCBsYXRlc3RUYWcsIG9sZENvbW1pdF0sIHsgY3dkOiB0aGlzLmN3ZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIENBVFYgYW5kIHJldHVybiB0aGUgdmVyc2lvbiBpdCB3b3VsZCBoYXZlIGJ1bXBlZCB0b1xuICAgKlxuICAgKiBDQVRWIHdpbGwgYWx3YXlzIGF0IGxlYXN0IHBlcmZvcm0gYSBwYXRjaCBidW1wLCBldmVuIGlmIHRoZXJlIGFyZW4ndCBhbnlcbiAgICogY29tbWl0cyB0byBsb29rIGF0LlxuICAgKlxuICAgKiBXZSBoYXZlIHRvIGRvIHRoaXMgYnkgcGFyc2luZyB0aGUgb3V0cHV0IHN0cmluZywgd2hpY2ggaXMgcHJldHR5IGJhZFxuICAgKiBidXQgSSBkb24ndCBzZWUgdGhhdCB3ZSBoYXZlIGFub3RoZXIgd2F5LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRyeVJ1bigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG91dHB1dCA9IHN0cmlwQW5zaShcbiAgICAgIGF3YWl0IHRoaXMuaW52b2tlKHtcbiAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgICAgZHJ5UnVuOiB0cnVlLFxuICAgICAgICBza2lwQ2hhbmdlbG9nOiB0cnVlLFxuICAgICAgfSksXG4gICAgKTtcbiAgICBjb25zdCByZSA9IC9idW1waW5nIHZlcnNpb24uKmZyb20gKFswLTlhLXouKy1dKykgdG8gKFswLTlhLXouKy1dKykvaW07XG4gICAgY29uc3QgbSA9IHJlLmV4ZWMob3V0cHV0KTtcbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IG1hdGNoICR7cmV9IGluICR7b3V0cHV0fWApO1xuICAgIH1cblxuICAgIHJldHVybiBtWzJdO1xuICB9XG59XG5cbi8qKlxuICogQW4gZW50cnkgaW4gdGhlIENBVFYgYHBhY2thZ2VGaWxlc2Agb3IgYGJ1bXBGaWxlc2AgYXJyYXlzXG4gKi9cbmludGVyZmFjZSBDb21taXRBbmRUYWdGaWxlIHtcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgdHlwZT86IHN0cmluZztcbiAgdXBkYXRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBNb2RlbGluZyB0aGUgQ0FUViBjb25maWcgZmlsZVxuICovXG5pbnRlcmZhY2UgQ29tbWl0QW5kVGFnQ29uZmlnIGV4dGVuZHMgQ29uZmlnIHtcbiAgcGFja2FnZUZpbGVzPzogQ29tbWl0QW5kVGFnRmlsZVtdO1xuICBidW1wRmlsZXM/OiBDb21taXRBbmRUYWdGaWxlW107XG4gIGNvbW1pdEFsbD86IGJvb2xlYW47XG4gIGluZmlsZT86IHN0cmluZztcbiAgcHJlcmVsZWFzZT86IHN0cmluZztcbiAgc2tpcD86IHtcbiAgICBjb21taXQ/OiBib29sZWFuO1xuICAgIHRhZz86IGJvb2xlYW47XG4gICAgYnVtcD86IGJvb2xlYW47XG4gICAgY2hhbmdlbG9nPzogYm9vbGVhbjtcbiAgfTtcbiAgZmlyc3RSZWxlYXNlPzogYm9vbGVhbjtcbiAgdGFnUHJlZml4Pzogc3RyaW5nO1xuICByZWxlYXNlQXM/OiBzdHJpbmc7XG4gIGRyeVJ1bj86IGJvb2xlYW47XG4gIHBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RyaXBzIEFOU0kgZXNjYXBlIGNvZGVzIGZyb20gYSBzdHJpbmdcbiAqXG4gKiBOZWVkIHRvIHVzZSB0aGlzIGJlY2F1c2UgdGhlIGAtLW5vLWNvbG9yc2AgYXJndW1lbnQgdG8gQ0FUViBpcyBzb21ldGltZXNcbiAqIHJlc3BlY3RlZCBhbmQgc29tZXRpbWVzIG5vdCBhbmQgaXQncyBkcml2aW5nIG1lIGNyYXp5LlxuICovXG5mdW5jdGlvbiBzdHJpcEFuc2koc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBQYXR0ZXJuIG1hdGNoZXMgYWxsIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyBpbmNsdWRpbmcgY29sb3JzLCBjdXJzb3IgbW92ZW1lbnQsIGV0Y1xuICBjb25zdCBwYXR0ZXJuID0gW1xuICAgIFwiW1xcXFx1MDAxQlxcXFx1MDA5Ql1bW1xcXFxdKCkjOz9dKig/Oig/Oig/Oig/OjtbLWEtekEtWlxcXFxkXFxcXC8jJi46PT8lQH5fXSspKnxbYS16QS1aXFxcXGRdKyg/OjtbLWEtekEtWlxcXFxkXFxcXC8jJi46PT8lQH5fXSopKik/XFxcXHUwMDA3KVwiLFxuICAgIFwiKD86KD86XFxcXGR7MSw0fSg/OjtcXFxcZHswLDR9KSopP1tcXFxcZEEtUFItVFpjZi1udHFyeT0+PH5dKSlcIixcbiAgXS5qb2luKFwifFwiKTtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAocGF0dGVybiwgXCJnXCIpLCBcIlwiKTtcbn1cbiJdfQ==