projen
Version:
CDK for software projects
180 lines • 28.1 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.WorkflowSteps = exports.CheckoutSubmodules = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const object_1 = require("../util/object");
/**
* Whether to checkout Git submodules in CI workflows.
*/
var CheckoutSubmodules;
(function (CheckoutSubmodules) {
/**
* Don't checkout submodules.
*/
CheckoutSubmodules["DISABLED"] = "false";
/**
* Checkout only top-level submodules.
*/
CheckoutSubmodules["ENABLED"] = "true";
/**
* Checkout submodules recursively.
*/
CheckoutSubmodules["RECURSIVE"] = "recursive";
})(CheckoutSubmodules || (exports.CheckoutSubmodules = CheckoutSubmodules = {}));
/**
* A collection of very commonly used, individual, GitHub Workflow Job steps.
*/
class WorkflowSteps {
/**
* Checks out a repository.
*
* @param options Options to configure the `checkout` JobStep
* @returns A JobStep that checks out a repository
*/
static checkout(options = {}) {
const checkoutWith = (0, object_1.removeNullOrUndefinedProperties)({
"fetch-depth": options?.with?.fetchDepth,
token: options?.with?.token,
ref: options?.with?.ref,
repository: options?.with?.repository,
path: options?.with?.path,
...(options?.with?.lfs ? { lfs: true } : {}),
...(options?.with?.submodules &&
options.with.submodules !== CheckoutSubmodules.DISABLED
? {
submodules: options.with.submodules === CheckoutSubmodules.RECURSIVE
? "recursive"
: true,
}
: {}),
});
return {
...this.buildJobStepConfig({
...options,
name: options.name ?? "Checkout",
}),
uses: "actions/checkout@v6",
with: Object.keys(checkoutWith).length > 0 ? checkoutWith : undefined,
};
}
/**
* Configures the git identity (user name and email).
*
* @param options Options to configure the git identity JobStep
* @returns Job step that configures the provided git identity
*/
static setupGitIdentity(options) {
return {
...this.buildJobStepConfig({
...options,
name: options.name ?? "Set git identity",
}),
run: [
`git config user.name "${options.gitIdentity.name}"`,
`git config user.email "${options.gitIdentity.email}"`,
].join("\n"),
};
}
/**
* Checks if a tag exists.
*
* Requires a checkout step to have been run before this step with "fetch-depth" set to "0".
*
* Outputs:
* - `exists`: A string value of 'true' or 'false' indicating if the tag exists.
*
* @param tag The tag to check. You may use valid bash code instead of a literal string in this field.
* @param options Options to configure the `tag-exists` JobStep
* @returns Job step that checks if the provided tag exists
*/
static tagExists(tag, options) {
const checkTag = (remoteTag) => `git ls-remote -q --exit-code --tags origin ${remoteTag}`;
const varIsSet = (variable) => `[ ! -z "$${variable}" ]`;
const setOutput = (value) => `(echo "exists=${value ? "true" : "false"}" >> $GITHUB_OUTPUT)`;
return {
...this.buildJobStepConfig({
...options,
name: options.name ?? "Check if tag exists",
id: options.id ?? "check-tag",
shell: "bash",
}),
run: [
`TAG=${tag}`,
`(${varIsSet("TAG")} && ${checkTag("$TAG")} && ${setOutput(true)}) || ${setOutput(false)}`,
"cat $GITHUB_OUTPUT",
].join("\n"),
};
}
/**
* Uploads an artifact.
*
* @param options Options to configure the `upload-artifact` JobStep
* @returns A JobStep that uploads an artifact
*/
static uploadArtifact(options) {
const uploadArtifactWith = (0, object_1.removeNullOrUndefinedProperties)({
name: options?.with?.name,
path: options?.with?.path,
overwrite: options?.with?.overwrite ?? true,
"if-no-files-found": options?.with?.ifNoFilesFound,
"retention-days": options?.with?.retentionDays,
"compression-level": options?.with?.compressionLevel,
"include-hidden-files": options?.with?.includeHiddenFiles,
});
return {
...this.buildJobStepConfig({
...options,
name: options.name ?? "Upload artifact",
}),
uses: "actions/upload-artifact@v7",
with: uploadArtifactWith,
};
}
/**
* Downloads an artifact.
*
* @param options Options to configure the `download-artifact` JobStep
* @returns A JobStep that downloads an artifact
*/
static downloadArtifact(options) {
const downloadArtifactWith = options?.with
? (0, object_1.removeNullOrUndefinedProperties)({
name: options?.with?.name,
"artifact-ids": options?.with?.artifactIds?.join(",") || undefined, // || undefined will remove an empty list
path: options?.with?.path,
pattern: options?.with?.pattern,
repository: options?.with?.repository,
"merge-multiple": options?.with?.mergeMultiple,
"github-token": options?.with?.token,
"run-id": options?.with?.runId,
})
: undefined;
return {
...this.buildJobStepConfig({
...options,
name: options?.name ?? "Download artifact",
}),
uses: "actions/download-artifact@v8",
with: downloadArtifactWith,
};
}
/**
* Simple adapter to ensure we only include the necessary fields for a JobStepConfiguration.
*/
static buildJobStepConfig(options) {
return {
continueOnError: options?.continueOnError,
env: options?.env,
id: options?.id,
if: options?.if,
name: options?.name,
timeoutMinutes: options?.timeoutMinutes,
workingDirectory: options?.workingDirectory,
};
}
}
exports.WorkflowSteps = WorkflowSteps;
_a = JSII_RTTI_SYMBOL_1;
WorkflowSteps[_a] = { fqn: "projen.github.WorkflowSteps", version: "0.99.70" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctc3RlcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2l0aHViL3dvcmtmbG93LXN0ZXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsMkNBQWlFO0FBRWpFOztHQUVHO0FBQ0gsSUFBWSxrQkFlWDtBQWZELFdBQVksa0JBQWtCO0lBQzVCOztPQUVHO0lBQ0gsd0NBQWtCLENBQUE7SUFFbEI7O09BRUc7SUFDSCxzQ0FBZ0IsQ0FBQTtJQUVoQjs7T0FFRztJQUNILDZDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFmVyxrQkFBa0Isa0NBQWxCLGtCQUFrQixRQWU3QjtBQUVEOztHQUVHO0FBQ0gsTUFBYSxhQUFhO0lBQ3hCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUEyQixFQUFFO1FBQ2xELE1BQU0sWUFBWSxHQUFHLElBQUEsd0NBQStCLEVBQUM7WUFDbkQsYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVTtZQUN4QyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLO1lBQzNCLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUc7WUFDdkIsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVTtZQUNyQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJO1lBQ3pCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVO2dCQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxrQkFBa0IsQ0FBQyxRQUFRO2dCQUNyRCxDQUFDLENBQUM7b0JBQ0UsVUFBVSxFQUNSLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxL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QUVHO0lBQ0ssTUFBTSxDQUFDLGtCQUFrQixDQUMvQixPQUE2QjtRQUU3QixPQUFPO1lBQ0wsZUFBZSxFQUFFLE9BQU8sRUFBRSxlQUFlO1lBQ3pDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRztZQUNqQixFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDZixFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDZixJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUk7WUFDbkIsY0FBYyxFQUFFLE9BQU8sRUFBRSxjQUFjO1lBQ3ZDLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxnQkFBZ0I7U0FDNUMsQ0FBQztJQUNKLENBQUM7O0FBcEtILHNDQXFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgR2l0SWRlbnRpdHkgfSBmcm9tIFwiLi90YXNrLXdvcmtmbG93XCI7XG5pbXBvcnQgdHlwZSB7IEpvYlN0ZXBDb25maWd1cmF0aW9uLCBKb2JTdGVwIH0gZnJvbSBcIi4vd29ya2Zsb3dzLW1vZGVsXCI7XG5pbXBvcnQgeyByZW1vdmVOdWxsT3JVbmRlZmluZWRQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uL3V0aWwvb2JqZWN0XCI7XG5cbi8qKlxuICogV2hldGhlciB0byBjaGVja291dCBHaXQgc3VibW9kdWxlcyBpbiBDSSB3b3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBlbnVtIENoZWNrb3V0U3VibW9kdWxlcyB7XG4gIC8qKlxuICAgKiBEb24ndCBjaGVja291dCBzdWJtb2R1bGVzLlxuICAgKi9cbiAgRElTQUJMRUQgPSBcImZhbHNlXCIsXG5cbiAgLyoqXG4gICAqIENoZWNrb3V0IG9ubHkgdG9wLWxldmVsIHN1Ym1vZHVsZXMuXG4gICAqL1xuICBFTkFCTEVEID0gXCJ0cnVlXCIsXG5cbiAgLyoqXG4gICAqIENoZWNrb3V0IHN1Ym1vZHVsZXMgcmVjdXJzaXZlbHkuXG4gICAqL1xuICBSRUNVUlNJVkUgPSBcInJlY3Vyc2l2ZVwiLFxufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiB2ZXJ5IGNvbW1vbmx5IHVzZWQsIGluZGl2aWR1YWwsIEdpdEh1YiBXb3JrZmxvdyBKb2Igc3RlcHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1N0ZXBzIHtcbiAgLyoqXG4gICAqIENoZWNrcyBvdXQgYSByZXBvc2l0b3J5LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgYGNoZWNrb3V0YCBKb2JTdGVwXG4gICAqIEByZXR1cm5zIEEgSm9iU3RlcCB0aGF0IGNoZWNrcyBvdXQgYSByZXBvc2l0b3J5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNoZWNrb3V0KG9wdGlvbnM6IENoZWNrb3V0T3B0aW9ucyA9IHt9KTogSm9iU3RlcCB7XG4gICAgY29uc3QgY2hlY2tvdXRXaXRoID0gcmVtb3ZlTnVsbE9yVW5kZWZpbmVkUHJvcGVydGllcyh7XG4gICAgICBcImZldGNoLWRlcHRoXCI6IG9wdGlvbnM/LndpdGg/LmZldGNoRGVwdGgsXG4gICAgICB0b2tlbjogb3B0aW9ucz8ud2l0aD8udG9rZW4sXG4gICAgICByZWY6IG9wdGlvbnM/LndpdGg/LnJlZixcbiAgICAgIHJlcG9zaXRvcnk6IG9wdGlvbnM/LndpdGg/LnJlcG9zaXRvcnksXG4gICAgICBwYXRoOiBvcHRpb25zPy53aXRoPy5wYXRoLFxuICAgICAgLi4uKG9wdGlvbnM/LndpdGg/LmxmcyA/IHsgbGZzOiB0cnVlIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucz8ud2l0aD8uc3VibW9kdWxlcyAmJlxuICAgICAgb3B0aW9ucy53aXRoLnN1Ym1vZHVsZXMgIT09IENoZWNrb3V0U3VibW9kdWxlcy5ESVNBQkxFRFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN1Ym1vZHVsZXM6XG4gICAgICAgICAgICAgIG9wdGlvbnMud2l0aC5zdWJtb2R1bGVzID09PSBDaGVja291dFN1Ym1vZHVsZXMuUkVDVVJTSVZFXG4gICAgICAgICAgICAgICAgPyBcInJlY3Vyc2l2ZVwiXG4gICAgICAgICAgICAgICAgOiB0cnVlLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5idWlsZEpvYlN0ZXBDb25maWcoe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUgPz8gXCJDaGVja291dFwiLFxuICAgICAgfSksXG4gICAgICB1c2VzOiBcImFjdGlvbnMvY2hlY2tvdXRAdjZcIixcbiAgICAgIHdpdGg6IE9iamVjdC5rZXlzKGNoZWNrb3V0V2l0aCkubGVuZ3RoID4gMCA/IGNoZWNrb3V0V2l0aCA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIGdpdCBpZGVudGl0eSAodXNlciBuYW1lIGFuZCBlbWFpbCkuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBnaXQgaWRlbnRpdHkgSm9iU3RlcFxuICAgKiBAcmV0dXJucyBKb2Igc3RlcCB0aGF0IGNvbmZpZ3VyZXMgdGhlIHByb3ZpZGVkIGdpdCBpZGVudGl0eVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXR1cEdpdElkZW50aXR5KG9wdGlvbnM6IFNldHVwR2l0SWRlbnRpdHlPcHRpb25zKTogSm9iU3RlcCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuYnVpbGRKb2JTdGVwQ29uZmlnKHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lID8/IFwiU2V0IGdpdCBpZGVudGl0eVwiLFxuICAgICAgfSksXG4gICAgICBydW46IFtcbiAgICAgICAgYGdpdCBjb25maWcgdXNlci5uYW1lIFwiJHtvcHRpb25zLmdpdElkZW50aXR5Lm5hbWV9XCJgLFxuICAgICAgICBgZ2l0IGNvbmZpZyB1c2VyLmVtYWlsIFwiJHtvcHRpb25zLmdpdElkZW50aXR5LmVtYWlsfVwiYCxcbiAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHRhZyBleGlzdHMuXG4gICAqXG4gICAqIFJlcXVpcmVzIGEgY2hlY2tvdXQgc3RlcCB0byBoYXZlIGJlZW4gcnVuIGJlZm9yZSB0aGlzIHN0ZXAgd2l0aCBcImZldGNoLWRlcHRoXCIgc2V0IHRvIFwiMFwiLlxuICAgKlxuICAgKiBPdXRwdXRzOlxuICAgKiAtIGBleGlzdHNgOiBBIHN0cmluZyB2YWx1ZSBvZiAndHJ1ZScgb3IgJ2ZhbHNlJyBpbmRpY2F0aW5nIGlmIHRoZSB0YWcgZXhpc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgdG8gY2hlY2suIFlvdSBtYXkgdXNlIHZhbGlkIGJhc2ggY29kZSBpbnN0ZWFkIG9mIGEgbGl0ZXJhbCBzdHJpbmcgaW4gdGhpcyBmaWVsZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGB0YWctZXhpc3RzYCBKb2JTdGVwXG4gICAqIEByZXR1cm5zIEpvYiBzdGVwIHRoYXQgY2hlY2tzIGlmIHRoZSBwcm92aWRlZCB0YWcgZXhpc3RzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRhZ0V4aXN0cyh0YWc6IHN0cmluZywgb3B0aW9uczogSm9iU3RlcENvbmZpZ3VyYXRpb24pOiBKb2JTdGVwIHtcbiAgICBjb25zdCBjaGVja1RhZyA9IChyZW1vdGVUYWc6IHN0cmluZykgPT5cbiAgICAgIGBnaXQgbHMtcmVtb3RlIC1xIC0tZXhpdC1jb2RlIC0tdGFncyBvcmlnaW4gJHtyZW1vdGVUYWd9YDtcbiAgICBjb25zdCB2YXJJc1NldCA9ICh2YXJpYWJsZTogc3RyaW5nKSA9PiBgWyAhIC16IFwiJCR7dmFyaWFibGV9XCIgXWA7XG4gICAgY29uc3Qgc2V0T3V0cHV0ID0gKHZhbHVlOiBib29sZWFuKSA9PlxuICAgICAgYChlY2hvIFwiZXhpc3RzPSR7dmFsdWUgPyBcInRydWVcIiA6IFwiZmFsc2VcIn1cIiA+PiAkR0lUSFVCX09VVFBVVClgO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuYnVpbGRKb2JTdGVwQ29uZmlnKHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lID8/IFwiQ2hlY2sgaWYgdGFnIGV4aXN0c1wiLFxuICAgICAgICBpZDogb3B0aW9ucy5pZCA/PyBcImNoZWNrLXRhZ1wiLFxuICAgICAgICBzaGVsbDogXCJiYXNoXCIsXG4gICAgICB9KSxcbiAgICAgIHJ1bjogW1xuICAgICAgICBgVEFHPSR7dGFnfWAsXG4gICAgICAgIGAoJHt2YXJJc1NldChcIlRBR1wiKX0gJiYgJHtjaGVja1RhZyhcIiRUQUdcIil9ICYmICR7c2V0T3V0cHV0KFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICl9KSB8fCAke3NldE91dHB1dChmYWxzZSl9YCxcbiAgICAgICAgXCJjYXQgJEdJVEhVQl9PVVRQVVRcIixcbiAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgYW4gYXJ0aWZhY3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBgdXBsb2FkLWFydGlmYWN0YCBKb2JTdGVwXG4gICAqIEByZXR1cm5zIEEgSm9iU3RlcCB0aGF0IHVwbG9hZHMgYW4gYXJ0aWZhY3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXBsb2FkQXJ0aWZhY3Qob3B0aW9uczogVXBsb2FkQXJ0aWZhY3RPcHRpb25zKTogSm9iU3RlcCB7XG4gICAgY29uc3QgdXBsb2FkQXJ0aWZhY3RXaXRoOiBVcGxvYWRBcnRpZmFjdFdpdGggPVxuICAgICAgcmVtb3ZlTnVsbE9yVW5kZWZpbmVkUHJvcGVydGllcyh7XG4gICAgICAgIG5hbWU6IG9wdGlvbnM/LndpdGg/Lm5hbWUsXG4gICAgICAgIHBhdGg6IG9wdGlvbnM/LndpdGg/LnBhdGgsXG4gICAgICAgIG92ZXJ3cml0ZTogb3B0aW9ucz8ud2l0aD8ub3ZlcndyaXRlID8/IHRydWUsXG4gICAgICAgIFwiaWYtbm8tZmlsZXMtZm91bmRcIjogb3B0aW9ucz8ud2l0aD8uaWZOb0ZpbGVzRm91bmQsXG4gICAgICAgIFwicmV0ZW50aW9uLWRheXNcIjogb3B0aW9ucz8ud2l0aD8ucmV0ZW50aW9uRGF5cyxcbiAgICAgICAgXCJjb21wcmVzc2lvbi1sZXZlbFwiOiBvcHRpb25zPy53aXRoPy5jb21wcmVzc2lvbkxldmVsLFxuICAgICAgICBcImluY2x1ZGUtaGlkZGVuLWZpbGVzXCI6IG9wdGlvbnM/LndpdGg/LmluY2x1ZGVIaWRkZW5GaWxlcyxcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuYnVpbGRKb2JTdGVwQ29uZmlnKHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lID8/IFwiVXBsb2FkIGFydGlmYWN0XCIsXG4gICAgICB9KSxcbiAgICAgIHVzZXM6IFwiYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjdcIixcbiAgICAgIHdpdGg6IHVwbG9hZEFydGlmYWN0V2l0aCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkcyBhbiBhcnRpZmFjdC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGBkb3dubG9hZC1hcnRpZmFjdGAgSm9iU3RlcFxuICAgKiBAcmV0dXJucyBBIEpvYlN0ZXAgdGhhdCBkb3dubG9hZHMgYW4gYXJ0aWZhY3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZG93bmxvYWRBcnRpZmFjdChvcHRpb25zPzogRG93bmxvYWRBcnRpZmFjdE9wdGlvbnMpOiBKb2JTdGVwIHtcbiAgICBjb25zdCBkb3dubG9hZEFydGlmYWN0V2l0aDogRG93bmxvYWRBcnRpZmFjdFdpdGggfCB1bmRlZmluZWQgPSBvcHRpb25zPy53aXRoXG4gICAgICA/IHJlbW92ZU51bGxPclVuZGVmaW5lZFByb3BlcnRpZXMoe1xuICAgICAgICAgIG5hbWU6IG9wdGlvbnM/LndpdGg/Lm5hbWUsXG4gICAgICAgICAgXCJhcnRpZmFjdC1pZHNcIjogb3B0aW9ucz8ud2l0aD8uYXJ0aWZhY3RJZHM/LmpvaW4oXCIsXCIpIHx8IHVuZGVmaW5lZCwgLy8gfHwgdW5kZWZpbmVkIHdpbGwgcmVtb3ZlIGFuIGVtcHR5IGxpc3RcbiAgICAgICAgICBwYXRoOiBvcHRpb25zPy53aXRoPy5wYXRoLFxuICAgICAgICAgIHBhdHRlcm46IG9wdGlvbnM/LndpdGg/LnBhdHRlcm4sXG4gICAgICAgICAgcmVwb3NpdG9yeTogb3B0aW9ucz8ud2l0aD8ucmVwb3NpdG9yeSxcbiAgICAgICAgICBcIm1lcmdlLW11bHRpcGxlXCI6IG9wdGlvbnM/LndpdGg/Lm1lcmdlTXVsdGlwbGUsXG4gICAgICAgICAgXCJnaXRodWItdG9rZW5cIjogb3B0aW9ucz8ud2l0aD8udG9rZW4sXG4gICAgICAgICAgXCJydW4taWRcIjogb3B0aW9ucz8ud2l0aD8ucnVuSWQsXG4gICAgICAgIH0pXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmJ1aWxkSm9iU3RlcENvbmZpZyh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIG5hbWU6IG9wdGlvbnM/Lm5hbWUgPz8gXCJEb3dubG9hZCBhcnRpZmFjdFwiLFxuICAgICAgfSksXG4gICAgICB1c2VzOiBcImFjdGlvbnMvZG93bmxvYWQtYXJ0aWZhY3RAdjhcIixcbiAgICAgIHdpdGg6IGRvd25sb2FkQXJ0aWZhY3RXaXRoLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2ltcGxlIGFkYXB0ZXIgdG8gZW5zdXJlIHdlIG9ubHkgaW5jbHVkZSB0aGUgbmVjZXNzYXJ5IGZpZWxkcyBmb3IgYSBKb2JTdGVwQ29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGJ1aWxkSm9iU3RlcENvbmZpZyhcbiAgICBvcHRpb25zOiBKb2JTdGVwQ29uZmlndXJhdGlvbixcbiAgKTogSm9iU3RlcENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBjb250aW51ZU9uRXJyb3I6IG9wdGlvbnM/LmNvbnRpbnVlT25FcnJvcixcbiAgICAgIGVudjogb3B0aW9ucz8uZW52LFxuICAgICAgaWQ6IG9wdGlvbnM/LmlkLFxuICAgICAgaWY6IG9wdGlvbnM/LmlmLFxuICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgIHRpbWVvdXRNaW51dGVzOiBvcHRpb25zPy50aW1lb3V0TWludXRlcyxcbiAgICAgIHdvcmtpbmdEaXJlY3Rvcnk6IG9wdGlvbnM/LndvcmtpbmdEaXJlY3RvcnksXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDaGVja291dE9wdGlvbnMgZXh0ZW5kcyBKb2JTdGVwQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBgY2hlY2tvdXRgLlxuICAgKi9cbiAgcmVhZG9ubHkgd2l0aD86IENoZWNrb3V0V2l0aDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgY2hlY2tvdXRgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrb3V0V2l0aCB7XG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgY29tbWl0cyB0byBmZXRjaC4gMCBpbmRpY2F0ZXMgYWxsIGhpc3RvcnkgZm9yIGFsbCBicmFuY2hlcyBhbmQgdGFncy5cbiAgICpcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgZmV0Y2hEZXB0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgTEZTIGlzIGVuYWJsZWQgZm9yIHRoZSBHaXRIdWIgcmVwb3NpdG9yeVxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgbGZzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjaGVja291dCBHaXQgc3VibW9kdWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgQ2hlY2tvdXRTdWJtb2R1bGVzLkRJU0FCTEVEXG4gICAqL1xuICByZWFkb25seSBzdWJtb2R1bGVzPzogQ2hlY2tvdXRTdWJtb2R1bGVzO1xuXG4gIC8qKlxuICAgKiBCcmFuY2ggb3IgdGFnIG5hbWUuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGRlZmF1bHQgYnJhbmNoIGlzIGltcGxpY2l0bHkgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVmPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3NpdG9yeSAob3duZXIvcmVwbykgdG8gdXNlLlxuICAgKiBAZGVmYXVsdCAtIHRoZSBkZWZhdWx0IHJlcG9zaXRvcnkgaXMgaW1wbGljaXRseSB1c2VkXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIEdpdEh1YiB0b2tlbiB0byB1c2Ugd2hlbiBjaGVja2luZyBvdXQgdGhlIHJlcG9zaXRvcnkuXG4gICAqXG4gICAqIElmIHRoZSBpbnRlbnQgaXMgdG8gcHVzaCBjaGFuZ2VzIGJhY2sgdG8gdGhlIGJyYW5jaCwgdGhlbiB5b3UgbXVzdCB1c2UgYVxuICAgKiBQQVQgd2l0aCBgcmVwb2AgKGFuZCBwb3NzaWJseSBgd29ya2Zsb3dzYCkgcGVybWlzc2lvbnMuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGRlZmF1bHQgR0lUSFVCX1RPS0VOIGlzIGltcGxpY2l0bHkgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlbGF0aXZlIHBhdGggdW5kZXIgJEdJVEhVQl9XT1JLU1BBQ0UgdG8gcGxhY2UgdGhlIHJlcG9zaXRvcnlcbiAgICogQGRlZmF1bHQgLSAkR0lUSFVCX1dPUktTUEFDRVxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXR1cEdpdElkZW50aXR5T3B0aW9ucyBleHRlbmRzIEpvYlN0ZXBDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGl0eSB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBnaXRJZGVudGl0eTogR2l0SWRlbnRpdHk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkQXJ0aWZhY3RXaXRoIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGFydGlmYWN0IHRvIHVwbG9hZC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJhcnRpZmFjdFwiXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUsIGRpcmVjdG9yeSBvciB3aWxkY2FyZCBwYXR0ZXJuIHRoYXQgZGVzY3JpYmVzIHdoYXQgdG8gdXBsb2FkXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNpcmVkIGJlaGF2aW9yIGlmIG5vIGZpbGVzIGFyZSBmb3VuZCB1c2luZyB0aGUgcHJvdmlkZWQgcGF0aC5cbiAgICogQXZhaWxhYmxlIE9wdGlvbnM6XG4gICAqICAgd2FybjogT3V0cHV0IGEgd2FybmluZyBidXQgZG8gbm90IGZhaWwgdGhlIGFjdGlvblxuICAgKiAgIGVycm9yOiBGYWlsIHRoZSBhY3Rpb24gd2l0aCBhbiBlcnJvciBtZXNzYWdlXG4gICAqICAgaWdub3JlOiBEbyBub3Qgb3V0cHV0IGFueSB3YXJuaW5ncyBvciBlcnJvcnMsIHRoZSBhY3Rpb24gZG9lcyBub3QgZmFpbFxuICAgKlxuICAgKiBAZGVmYXVsdCBcIndhcm5cIlxuICAgKi9cbiAgcmVhZG9ubHkgaWZOb0ZpbGVzRm91bmQ/OiBcImVycm9yXCIgfCBcIndhcm5cIiB8IFwiaWdub3JlXCI7XG5cbiAgLyoqXG4gICAqIER1cmF0aW9uIGFmdGVyIHdoaWNoIGFydGlmYWN0IHdpbGwgZXhwaXJlIGluIGRheXMuIDAgbWVhbnMgdXNpbmcgZGVmYXVsdCByZXBvc2l0b3J5IHJldGVudGlvbi5cbiAgICpcbiAgICogTWluaW11bSAxIGRheS5cbiAgICogTWF4aW11bSA5MCBkYXlzIHVubGVzcyBjaGFuZ2VkIGZyb20gdGhlIHJlcG9zaXRvcnkgc2V0dGluZ3MgcGFnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgZGVmYXVsdCByZXBvc2l0b3J5IHJldGVudGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcmV0ZW50aW9uRGF5cz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxldmVsIG9mIGNvbXByZXNzaW9uIGZvciBabGliIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGFydGlmYWN0IGFyY2hpdmUuXG4gICAqXG4gICAqIFRoZSB2YWx1ZSBjYW4gcmFuZ2UgZnJvbSAwIHRvIDkuXG4gICAqIEZvciBsYXJnZSBmaWxlcyB0aGF0IGFyZSBub3QgZWFzaWx5IGNvbXByZXNzZWQsIGEgdmFsdWUgb2YgMCBpcyByZWNvbW1lbmRlZCBmb3Igc2lnbmlmaWNhbnRseSBmYXN0ZXIgdXBsb2Fkcy5cbiAgICpcbiAgICogQGRlZmF1bHQgNlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcHJlc3Npb25MZXZlbD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciBhY3Rpb24gc2hvdWxkIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBhcnRpZmFjdCB3aXRoIHRoZSBzYW1lIG5hbWUgKHNob3VsZCBvbmUgZXhpc3QpXG4gICAqXG4gICAqIEludHJvZHVjZWQgaW4gdjQgYW5kIHJlcHJlc2VudHMgYSBicmVha2luZyBjaGFuZ2UgZnJvbSB0aGUgYmVoYXZpb3Igb2YgdGhlIHYzIGFjdGlvbi5cbiAgICogVG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZywgdGhpcyBzaG91bGQgYmUgc2V0IHRoZSBgdHJ1ZWAgKHRoZSBkZWZhdWx0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcndyaXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGhpZGRlbiBmaWxlcyBpbiB0aGUgcHJvdmlkZWQgcGF0aCBpbiB0aGUgYXJ0aWZhY3RcbiAgICpcbiAgICogVGhlIGZpbGUgY29udGVudHMgb2YgYW55IGhpZGRlbiBmaWxlcyBpbiB0aGUgcGF0aCBzaG91bGQgYmUgdmFsaWRhdGVkIGJlZm9yZSBlbmFibGVkIHRoaXMgdG8gYXZvaWQgdXBsb2FkaW5nIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVIaWRkZW5GaWxlcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkQXJ0aWZhY3RPcHRpb25zIGV4dGVuZHMgSm9iU3RlcENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogT3B0aW9ucyBmb3IgYHVwbG9hZC1hcnRpZmFjdGAuXG4gICAqL1xuICByZWFkb25seSB3aXRoOiBVcGxvYWRBcnRpZmFjdFdpdGg7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG93bmxvYWRBcnRpZmFjdFdpdGgge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgYXJ0aWZhY3QgdG8gZG93bmxvYWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB1bnNwZWNpZmllZCwgYWxsIGFydGlmYWN0cyBmb3IgdGhlIHJ1biBhcmUgZG93bmxvYWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSURzIG9mIHRoZSBhcnRpZmFjdHMgdG8gZG93bmxvYWQuXG4gICAqIEVpdGhlciBpbnB1dHMgYGFydGlmYWN0LWlkc2Agb3IgYG5hbWVgIGNhbiBiZSB1c2VkLCBidXQgbm90IGJvdGguXG4gICAqL1xuICByZWFkb25seSBhcnRpZmFjdElkcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUsIGRpcmVjdG9yeSBvciB3aWxkY2FyZCBwYXR0ZXJuIHRoYXQgZGVzY3JpYmVzIHdoYXQgdG8gZG93bmxvYWQuIFN1cHBvcnRzIGJhc2ljIHRpbGRlIGV4cGFuc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSAkR0lUSFVCX1dPUktTUEFDRVxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBnbG9iIHBhdHRlcm4gdG8gdGhlIGFydGlmYWN0cyB0aGF0IHNob3VsZCBiZSBkb3dubG9hZGVkXG4gICAqIFRoaXMgaXMgaWdub3JlZCBpZiBuYW1lIGlzIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0dGVybj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hlbiBtdWx0aXBsZSBhcnRpZmFjdHMgYXJlIG1hdGNoZWQsIHRoaXMgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yaWVzXG4gICAqIElmIHRydWUsIHRoZSBkb3dubG9hZGVkIGFydGlmYWN0cyB3aWxsIGJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgcGF0aFxuICAgKiBJZiBmYWxzZSwgdGhlIGRvd25sb2FkZWQgYXJ0aWZhY3RzIHdpbGwgYmUgZXh0cmFjdGVkIGludG8gaW5kaXZpZHVhbCBuYW1lZCBkaXJlY3RvcmllcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBwYXRoXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBtZXJnZU11bHRpcGxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIEdpdEh1YiB0b2tlbiB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIHRoZSBHaXRIdWIgQVBJIHRvIGRvd25sb2FkIGFydGlmYWN0cyBmcm9tIGEgZGlmZmVyZW50IHJlcG9zaXRvcnkgb3IgZnJvbSBhIGRpZmZlcmVudCB3b3JrZmxvdyBydW5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB1bnNwZWNpZmllZCwgdGhlIGFjdGlvbiB3aWxsIGRvd25sb2FkIGFydGlmYWN0cyBmcm9tIHRoZSBjdXJyZW50IHJlcG8gYW5kIHRoZSBjdXJyZW50IHdvcmtmbG93IHJ1blxuICAgKi9cbiAgcmVhZG9ubHkgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXBvc2l0b3J5IG93bmVyIGFuZCB0aGUgcmVwb3NpdG9yeSBuYW1lIGpvaW5lZCB0b2dldGhlciBieSBcIi9cIlxuICAgKiBJZiBnaXRodWItdG9rZW4gaXMgc3BlY2lmaWVkLCB0aGlzIGlzIHRoZSByZXBvc2l0b3J5IHRoYXQgYXJ0aWZhY3RzIHdpbGwgYmUgZG93bmxvYWRlZCBmcm9tXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19XG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHdvcmtmbG93IHJ1biB3aGVyZSB0aGUgZGVzaXJlZCBkb3dubG9hZCBhcnRpZmFjdCB3YXMgdXBsb2FkZWQgZnJvbVxuICAgKiBJZiBnaXRodWItdG9rZW4gaXMgc3BlY2lmaWVkLCB0aGlzIGlzIHRoZSBydW4gdGhhdCBhcnRpZmFjdHMgd2lsbCBiZSBkb3dubG9hZGVkIGZyb21cbiAgICpcbiAgICogQGRlZmF1bHQgLSAke3sgZ2l0aHViLnJ1bl9pZCB9fVxuICAgKi9cbiAgcmVhZG9ubHkgcnVuSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG93bmxvYWRBcnRpZmFjdE9wdGlvbnMgZXh0ZW5kcyBKb2JTdGVwQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBgZG93bmxvYWQtYXJ0aWZhY3RgLlxuICAgKi9cbiAgcmVhZG9ubHkgd2l0aDogRG93bmxvYWRBcnRpZmFjdFdpdGg7XG59XG4iXX0=