projen
Version:
CDK for software projects
104 lines • 18.1 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PullRequestBackport = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const auto_approve_1 = require("./auto-approve");
const github_1 = require("./github");
const workflows_1 = require("./workflows");
const component_1 = require("../component");
const json_1 = require("../json");
const release_1 = require("../release");
class PullRequestBackport extends component_1.Component {
constructor(scope, options = {}) {
super(scope);
const workflowEngine = github_1.GitHub.of(this.project);
if (!workflowEngine) {
throw new Error(`Cannot add ${new.target.name} to project without GitHub enabled. Please enable GitHub for this project.`);
}
const branches = options.branches ?? release_1.Release.of(this.project)?.branches ?? [];
if (branches.length === 0) {
this.project.logger.warn("PullRequestBackport could not find any target branches. Backports will not be available. Please add release branches or configure `branches` manually.");
}
const targetPrLabelsRaw = options.backportPRLabels ?? ["backport"];
const targetPrLabels = [...targetPrLabelsRaw];
const shouldAutoApprove = options.autoApproveBackport ?? true;
if (shouldAutoApprove) {
const autoApprove = this.project.components.find((c) => c instanceof auto_approve_1.AutoApprove);
if (autoApprove?.label) {
targetPrLabels.push(autoApprove.label);
}
}
const backportBranchNamePrefix = options.backportBranchNamePrefix ?? "backport/";
const labelPrefix = options.labelPrefix ?? "backport-to-";
// Configuration
this.file = new json_1.JsonFile(this, ".backportrc.json", {
obj: {
commitConflicts: options.createWithConflicts ?? true,
targetPRLabels: targetPrLabels,
backportBranchName: `${backportBranchNamePrefix}{{targetBranch}}-{{refValues}}`,
prTitle: "{{sourcePullRequest.title}} (backport #{{sourcePullRequest.number}})",
targetBranchChoices: branches,
},
// File needs to be available to the GitHub Workflow
committed: true,
});
this.project.addPackageIgnore(this.file.path);
// Workflow
this.workflow = new workflows_1.GithubWorkflow(workflowEngine, options.workflowName ?? "backport");
this.workflow.on({
pullRequestTarget: {
types: ["labeled", "unlabeled", "closed"],
},
});
// condition to detect if the PR is a backport PR
// we prefer to match the PR using labels, but will fallback to matching the branch name prefix
const branchCondition = `startsWith(github.head_ref, '${backportBranchNamePrefix}')`;
const labelConditions = targetPrLabelsRaw.map((label) => `contains(github.event.pull_request.labels.*.name, '${label}')`);
const isBackportPr = labelConditions.length
? `(${labelConditions.join(" && ")})`
: `${branchCondition})`;
const checkStep = "check_labels";
const checkOutput = "matched";
const labelPrefixEscaped = labelPrefix.replace(/"/g, '\\"');
this.workflow.addJob("backport", {
name: "Backport PR",
runsOn: ["ubuntu-latest"],
permissions: {},
// Only ever run this job if the PR is merged and not a backport PR itself
if: `github.event.pull_request.merged == true && !${isBackportPr}`,
steps: [
...workflowEngine.projenCredentials.setupSteps,
// We need a custom step to check if the PR has any of the labels that indicate that the PR should be backported.
// This is not currently possible with GH Actions expression by itself, so we use a bash script.
{
id: checkStep,
name: "Check for backport labels",
shell: "bash",
run: [
"labels='${{ toJSON(github.event.pull_request.labels.*.name) }}'",
`matched=$(echo $labels | jq '.|map(select(startswith("${labelPrefixEscaped}"))) | length')`,
`echo "${checkOutput}=$matched"`,
`echo "${checkOutput}=$matched" >> $GITHUB_OUTPUT`,
].join("\n"),
},
{
name: "Backport Action",
uses: "sqren/backport-github-action@v9.5.1",
// only run this step if we have found matching labels in the previous step
// this is to prevent workflow failures because the action fails when pre-conditions are not met
// and causes any PR to be marked with a red X, leading to error blindness.
if: `fromJSON(steps.${checkStep}.outputs.${checkOutput}) > 0`,
with: {
github_token: workflowEngine.projenCredentials.tokenRef,
auto_backport_label_prefix: labelPrefix,
},
},
],
});
}
}
exports.PullRequestBackport = PullRequestBackport;
_a = JSII_RTTI_SYMBOL_1;
PullRequestBackport[_a] = { fqn: "projen.github.PullRequestBackport", version: "0.95.2" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC1yZXF1ZXN0LWJhY2twb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dpdGh1Yi9wdWxsLXJlcXVlc3QtYmFja3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxpREFBNkM7QUFDN0MscUNBQWtDO0FBQ2xDLDJDQUE2QztBQUM3Qyw0Q0FBeUM7QUFDekMsa0NBQW1DO0FBQ25DLHdDQUFxQztBQTBEckMsTUFBYSxtQkFBb0IsU0FBUSxxQkFBUztJQUloRCxZQUNFLEtBQWlCLEVBQ2pCLFVBQXNDLEVBQUU7UUFFeEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsTUFBTSxjQUFjLEdBQUcsZUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQ2IsY0FDRSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQ2IsNEVBQTRFLENBQzdFLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQ1osT0FBTyxDQUFDLFFBQVEsSUFBSSxpQkFBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBYyxDQUFDLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUN0RSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN0Qix3SkFBd0osQ0FDekosQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlDLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQztRQUM5RCxJ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QyxJQUFJLENBQUMsSUFBSSxDQUFDO2lCQUNiO2dCQUNEO29CQUNFLElBQUksRUFBRSxpQkFBaUI7b0JBQ3ZCLElBQUksRUFBRSxxQ0FBcUM7b0JBQzNDLDJFQUEyRTtvQkFDM0UsZ0dBQWdHO29CQUNoRywyRUFBMkU7b0JBQzNFLEVBQUUsRUFBRSxrQkFBa0IsU0FBUyxZQUFZLFdBQVcsT0FBTztvQkFDN0QsSUFBSSxFQUFFO3dCQUNKLFlBQVksRUFBRSxjQUFjLENBQUMsaUJBQWlCLENBQUMsUUFBUTt3QkFDdkQsMEJBQTBCLEVBQUUsV0FBVztxQkFDeEM7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBdkhILGtEQXdIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQXV0b0FwcHJvdmUgfSBmcm9tIFwiLi9hdXRvLWFwcHJvdmVcIjtcbmltcG9ydCB7IEdpdEh1YiB9IGZyb20gXCIuL2dpdGh1YlwiO1xuaW1wb3J0IHsgR2l0aHViV29ya2Zsb3cgfSBmcm9tIFwiLi93b3JrZmxvd3NcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IEpzb25GaWxlIH0gZnJvbSBcIi4uL2pzb25cIjtcbmltcG9ydCB7IFJlbGVhc2UgfSBmcm9tIFwiLi4vcmVsZWFzZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFB1bGxSZXF1ZXN0QmFja3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJiYWNrcG9ydFwiXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNob3VsZCB0aGlzIGNyZWF0ZWQgQmFja3BvcnQgUFJzIHdpdGggY29uZmxpY3RzLlxuICAgKlxuICAgKiBDb25mbGljdHMgd2lsbCBoYXZlIHRvIGJlIHJlc29sdmVkIG1hbnVhbGx5LCBidXQgYSBQUiBpcyBhbHdheXMgY3JlYXRlZC5cbiAgICogU2V0IHRvIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYmFja3BvcnQgUFIgZnJvbSBiZWluZyBjcmVhdGVkIGlmIHRoZXJlIGFyZSBjb25mbGljdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZVdpdGhDb25mbGljdHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFiZWxzIGFkZGVkIHRvIHRoZSBjcmVhdGVkIGJhY2twb3J0IFBSLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXCJiYWNrcG9ydFwiXVxuICAgKi9cbiAgcmVhZG9ubHkgYmFja3BvcnRQUkxhYmVscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IHVzZWQgdG8gbmFtZSBiYWNrcG9ydCBicmFuY2hlcy5cbiAgICpcbiAgICogTWFrZSBzdXJlIHRvIGluY2x1ZGUgYSBzZXBhcmF0b3IgYXQgdGhlIGVuZCBsaWtlIGAvYCBvciBgX2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiYmFja3BvcnQvXCJcbiAgICovXG4gIHJlYWRvbmx5IGJhY2twb3J0QnJhbmNoTmFtZVByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogQXV0b21hdGljYWxseSBhcHByb3ZlIGJhY2twb3J0IFBScyBpZiB0aGUgJ2F1dG8gYXBwcm92ZScgd29ya2Zsb3cgaXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhdXRvQXBwcm92ZUJhY2twb3J0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTGlzdCBvZiBicmFuY2hlcyB0aGF0IGNhbiBiZSBhIHRhcmdldCBmb3IgYmFja3BvcnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWxsb3cgYmFja3BvcnRzIHRvIGFsbCByZWxlYXNlIGJyYW5jaGVzXG4gICAqL1xuICByZWFkb25seSBicmFuY2hlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IHVzZWQgdG8gZGV0ZWN0IFBScyB0aGF0IHNob3VsZCBiZSBiYWNrcG9ydGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImJhY2twb3J0LXRvLVwiXG4gICAqL1xuICByZWFkb25seSBsYWJlbFByZWZpeD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFB1bGxSZXF1ZXN0QmFja3BvcnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgZmlsZTogSnNvbkZpbGU7XG4gIHB1YmxpYyByZWFkb25seSB3b3JrZmxvdzogR2l0aHViV29ya2Zsb3c7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBJQ29uc3RydWN0LFxuICAgIG9wdGlvbnM6IFB1bGxSZXF1ZXN0QmFja3BvcnRPcHRpb25zID0ge31cbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUpO1xuXG4gICAgY29uc3Qgd29ya2Zsb3dFbmdpbmUgPSBHaXRIdWIub2YodGhpcy5wcm9qZWN0KTtcbiAgICBpZiAoIXdvcmtmbG93RW5naW5lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgYWRkICR7XG4gICAgICAgICAgbmV3LnRhcmdldC5uYW1lXG4gICAgICAgIH0gdG8gcHJvamVjdCB3aXRob3V0IEdpdEh1YiBlbmFibGVkLiBQbGVhc2UgZW5hYmxlIEdpdEh1YiBmb3IgdGhpcyBwcm9qZWN0LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYnJhbmNoZXMgPVxuICAgICAgb3B0aW9ucy5icmFuY2hlcyA/PyBSZWxlYXNlLm9mKHRoaXMucHJvamVjdCBhcyBhbnkpPy5icmFuY2hlcyA/PyBbXTtcbiAgICBpZiAoYnJhbmNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnByb2plY3QubG9nZ2VyLndhcm4oXG4gICAgICAgIFwiUHVsbFJlcXVlc3RCYWNrcG9ydCBjb3VsZCBub3QgZmluZCBhbnkgdGFyZ2V0IGJyYW5jaGVzLiBCYWNrcG9ydHMgd2lsbCBub3QgYmUgYXZhaWxhYmxlLiBQbGVhc2UgYWRkIHJlbGVhc2UgYnJhbmNoZXMgb3IgY29uZmlndXJlIGBicmFuY2hlc2AgbWFudWFsbHkuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0UHJMYWJlbHNSYXcgPSBvcHRpb25zLmJhY2twb3J0UFJMYWJlbHMgPz8gW1wiYmFja3BvcnRcIl07XG4gICAgY29uc3QgdGFyZ2V0UHJMYWJlbHMgPSBbLi4udGFyZ2V0UHJMYWJlbHNSYXddO1xuXG4gICAgY29uc3Qgc2hvdWxkQXV0b0FwcHJvdmUgPSBvcHRpb25zLmF1dG9BcHByb3ZlQmFja3BvcnQgPz8gdHJ1ZTtcbiAgICBpZiAoc2hvdWxkQXV0b0FwcHJvdmUpIHtcbiAgICAgIGNvbnN0IGF1dG9BcHByb3ZlID0gdGhpcy5wcm9qZWN0LmNvbXBvbmVudHMuZmluZChcbiAgICAgICAgKGMpOiBjIGlzIEF1dG9BcHByb3ZlID0+IGMgaW5zdGFuY2VvZiBBdXRvQXBwcm92ZVxuICAgICAgKTtcbiAgICAgIGlmIChhdXRvQXBwcm92ZT8ubGFiZWwpIHtcbiAgICAgICAgdGFyZ2V0UHJMYWJlbHMucHVzaChhdXRvQXBwcm92ZS5sYWJlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYmFja3BvcnRCcmFuY2hOYW1lUHJlZml4ID1cbiAgICAgIG9wdGlvbnMuYmFja3BvcnRCcmFuY2hOYW1lUHJlZml4ID8/IFwiYmFja3BvcnQvXCI7XG4gICAgY29uc3QgbGFiZWxQcmVmaXggPSBvcHRpb25zLmxhYmVsUHJlZml4ID8/IFwiYmFja3BvcnQtdG8tXCI7XG5cbiAgICAvLyBDb25maWd1cmF0aW9uXG4gICAgdGhpcy5maWxlID0gbmV3IEpzb25GaWxlKHRoaXMsIFwiLmJhY2twb3J0cmMuanNvblwiLCB7XG4gICAgICBvYmo6IHtcbiAgICAgICAgY29tbWl0Q29uZmxpY3RzOiBvcHRpb25zLmNyZWF0ZVdpdGhDb25mbGljdHMgPz8gdHJ1ZSxcbiAgICAgICAgdGFyZ2V0UFJMYWJlbHM6IHRhcmdldFByTGFiZWxzLFxuICAgICAgICBiYWNrcG9ydEJyYW5jaE5hbWU6IGAke2JhY2twb3J0QnJhbmNoTmFtZVByZWZpeH17e3RhcmdldEJyYW5jaH19LXt7cmVmVmFsdWVzfX1gLFxuICAgICAgICBwclRpdGxlOlxuICAgICAgICAgIFwie3tzb3VyY2VQdWxsUmVxdWVzdC50aXRsZX19IChiYWNrcG9ydCAje3tzb3VyY2VQdWxsUmVxdWVzdC5udW1iZXJ9fSlcIixcbiAgICAgICAgdGFyZ2V0QnJhbmNoQ2hvaWNlczogYnJhbmNoZXMsXG4gICAgICB9LFxuICAgICAgLy8gRmlsZSBuZWVkcyB0byBiZSBhdmFpbGFibGUgdG8gdGhlIEdpdEh1YiBXb3JrZmxvd1xuICAgICAgY29tbWl0dGVkOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRQYWNrYWdlSWdub3JlKHRoaXMuZmlsZS5wYXRoKTtcblxuICAgIC8vIFdvcmtmbG93XG4gICAgdGhpcy53b3JrZmxvdyA9IG5ldyBHaXRodWJXb3JrZmxvdyhcbiAgICAgIHdvcmtmbG93RW5naW5lLFxuICAgICAgb3B0aW9ucy53b3JrZmxvd05hbWUgPz8gXCJiYWNrcG9ydFwiXG4gICAgKTtcbiAgICB0aGlzLndvcmtmbG93Lm9uKHtcbiAgICAgIHB1bGxSZXF1ZXN0VGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbXCJsYWJlbGVkXCIsIFwidW5sYWJlbGVkXCIsIFwiY2xvc2VkXCJdLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIGNvbmRpdGlvbiB0byBkZXRlY3QgaWYgdGhlIFBSIGlzIGEgYmFja3BvcnQgUFJcbiAgICAvLyB3ZSBwcmVmZXIgdG8gbWF0Y2ggdGhlIFBSIHVzaW5nIGxhYmVscywgYnV0IHdpbGwgZmFsbGJhY2sgdG8gbWF0Y2hpbmcgdGhlIGJyYW5jaCBuYW1lIHByZWZpeFxuICAgIGNvbnN0IGJyYW5jaENvbmRpdGlvbiA9IGBzdGFydHNXaXRoKGdpdGh1Yi5oZWFkX3JlZiwgJyR7YmFja3BvcnRCcmFuY2hOYW1lUHJlZml4fScpYDtcbiAgICBjb25zdCBsYWJlbENvbmRpdGlvbnM6IHN0cmluZ1tdID0gdGFyZ2V0UHJMYWJlbHNSYXcubWFwKFxuICAgICAgKGxhYmVsKSA9PiBgY29udGFpbnMoZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5sYWJlbHMuKi5uYW1lLCAnJHtsYWJlbH0nKWBcbiAgICApO1xuICAgIGNvbnN0IGlzQmFja3BvcnRQciA9IGxhYmVsQ29uZGl0aW9ucy5sZW5ndGhcbiAgICAgID8gYCgke2xhYmVsQ29uZGl0aW9ucy5qb2luKFwiICYmIFwiKX0pYFxuICAgICAgOiBgJHticmFuY2hDb25kaXRpb259KWA7XG5cbiAgICBjb25zdCBjaGVja1N0ZXAgPSBcImNoZWNrX2xhYmVsc1wiO1xuICAgIGNvbnN0IGNoZWNrT3V0cHV0ID0gXCJtYXRjaGVkXCI7XG4gICAgY29uc3QgbGFiZWxQcmVmaXhFc2NhcGVkID0gbGFiZWxQcmVmaXgucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpO1xuXG4gICAgdGhpcy53b3JrZmxvdy5hZGRKb2IoXCJiYWNrcG9ydFwiLCB7XG4gICAgICBuYW1lOiBcIkJhY2twb3J0IFBSXCIsXG4gICAgICBydW5zT246IFtcInVidW50dS1sYXRlc3RcIl0sXG4gICAgICBwZXJtaXNzaW9uczoge30sXG4gICAgICAvLyBPbmx5IGV2ZXIgcnVuIHRoaXMgam9iIGlmIHRoZSBQUiBpcyBtZXJnZWQgYW5kIG5vdCBhIGJhY2twb3J0IFBSIGl0c2VsZlxuICAgICAgaWY6IGBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0Lm1lcmdlZCA9PSB0cnVlICYmICEke2lzQmFja3BvcnRQcn1gLFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAgLi4ud29ya2Zsb3dFbmdpbmUucHJvamVuQ3JlZGVudGlhbHMuc2V0dXBTdGVwcyxcbiAgICAgICAgLy8gV2UgbmVlZCBhIGN1c3RvbSBzdGVwIHRvIGNoZWNrIGlmIHRoZSBQUiBoYXMgYW55IG9mIHRoZSBsYWJlbHMgdGhhdCBpbmRpY2F0ZSB0aGF0IHRoZSBQUiBzaG91bGQgYmUgYmFja3BvcnRlZC5cbiAgICAgICAgLy8gVGhpcyBpcyBub3QgY3VycmVudGx5IHBvc3NpYmxlIHdpdGggR0ggQWN0aW9ucyBleHByZXNzaW9uIGJ5IGl0c2VsZiwgc28gd2UgdXNlIGEgYmFzaCBzY3JpcHQuXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogY2hlY2tTdGVwLFxuICAgICAgICAgIG5hbWU6IFwiQ2hlY2sgZm9yIGJhY2twb3J0IGxhYmVsc1wiLFxuICAgICAgICAgIHNoZWxsOiBcImJhc2hcIixcbiAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgIFwibGFiZWxzPScke3sgdG9KU09OKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubGFiZWxzLioubmFtZSkgfX0nXCIsXG4gICAgICAgICAgICBgbWF0Y2hlZD0kKGVjaG8gJGxhYmVscyB8IGpxICcufG1hcChzZWxlY3Qoc3RhcnRzd2l0aChcIiR7bGFiZWxQcmVmaXhFc2NhcGVkfVwiKSkpIHwgbGVuZ3RoJylgLFxuICAgICAgICAgICAgYGVjaG8gXCIke2NoZWNrT3V0cHV0fT0kbWF0Y2hlZFwiYCxcbiAgICAgICAgICAgIGBlY2hvIFwiJHtjaGVja091dHB1dH09JG1hdGNoZWRcIiA+PiAkR0lUSFVCX09VVFBVVGAsXG4gICAgICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJCYWNrcG9ydCBBY3Rpb25cIixcbiAgICAgICAgICB1c2VzOiBcInNxcmVuL2JhY2twb3J0LWdpdGh1Yi1hY3Rpb25AdjkuNS4xXCIsXG4gICAgICAgICAgLy8gb25seSBydW4gdGhpcyBzdGVwIGlmIHdlIGhhdmUgZm91bmQgbWF0Y2hpbmcgbGFiZWxzIGluIHRoZSBwcmV2aW91cyBzdGVwXG4gICAgICAgICAgLy8gdGhpcyBpcyB0byBwcmV2ZW50IHdvcmtmbG93IGZhaWx1cmVzIGJlY2F1c2UgdGhlIGFjdGlvbiBmYWlscyB3aGVuIHByZS1jb25kaXRpb25zIGFyZSBub3QgbWV0XG4gICAgICAgICAgLy8gYW5kIGNhdXNlcyBhbnkgUFIgdG8gYmUgbWFya2VkIHdpdGggYSByZWQgWCwgbGVhZGluZyB0byBlcnJvciBibGluZG5lc3MuXG4gICAgICAgICAgaWY6IGBmcm9tSlNPTihzdGVwcy4ke2NoZWNrU3RlcH0ub3V0cHV0cy4ke2NoZWNrT3V0cHV0fSkgPiAwYCxcbiAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICBnaXRodWJfdG9rZW46IHdvcmtmbG93RW5naW5lLnByb2plbkNyZWRlbnRpYWxzLnRva2VuUmVmLFxuICAgICAgICAgICAgYXV0b19iYWNrcG9ydF9sYWJlbF9wcmVmaXg6IGxhYmVsUHJlZml4LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=