@xpertss/projen-types 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +62 -174
- package/API.md +20 -329
- package/README.md +20 -5
- package/lib/actions/action-build-workflow.js +4 -2
- package/lib/actions/action-dogfood-workflow.js +4 -2
- package/lib/actions/action-sonar-workflow.d.ts +6 -6
- package/lib/actions/action-sonar-workflow.js +8 -6
- package/lib/actions/github-action-project.d.ts +7 -7
- package/lib/actions/github-action-project.js +13 -7
- package/lib/cdk/app-runtime-scaffold.js +1 -1
- package/lib/cdk/cdk-app-project.js +5 -3
- package/lib/cdk/cdk-infra-project.js +1 -1
- package/lib/cdk/cdk-typescript-base.js +19 -4
- package/lib/cdk/components/ecr-ecs-constructs.js +1 -1
- package/lib/cdk/components/edge-networking-constructs.js +1 -1
- package/lib/cdk/database-component.js +1 -1
- package/lib/common/manual-deploy-workflow.js +3 -1
- package/lib/common/projen-drift-check-workflow.js +4 -2
- package/lib/common/upgrade-workflow.js +3 -1
- package/lib/common/workflow-change-notice-workflow.js +4 -2
- package/lib/common/workflow-purpose.d.ts +21 -0
- package/lib/common/workflow-purpose.js +51 -0
- package/lib/index.d.ts +0 -1
- package/lib/index.js +1 -2
- package/lib/java/components/cdk-deploy-hook.js +1 -1
- package/lib/java/components/code-index-workflow.js +5 -3
- package/lib/java/components/docker-publish.js +5 -3
- package/lib/java/components/flyway-migration.js +1 -1
- package/lib/java/components/github-packages-publish.js +5 -3
- package/lib/java/components/maven-central-publish.js +5 -3
- package/lib/java/java-app-project.js +1 -1
- package/lib/java/java-library-project.js +1 -1
- package/lib/java/java-maven-base.js +7 -4
- package/lib/java/java-service-project.js +1 -1
- package/lib/java/options.d.ts +1 -1
- package/lib/java/options.js +1 -1
- package/package.json +1 -1
- package/lib/common/actions-allowlist-guard.d.ts +0 -37
- package/lib/common/actions-allowlist-guard.js +0 -70
package/lib/java/options.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qYXZhL29wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudmlyb25tZW50T3B0aW9ucyB9IGZyb20gJy4uL2NvbW1vbi9lbnZpcm9ubWVudC1vcHRpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBDb21tb25KYXZhT3B0aW9ucyB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZ3JvdXBJZDogc3RyaW5nO1xuICByZWFkb25seSBhcnRpZmFjdElkOiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IFwiMC4xLjBcIiAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKiBTb25hckNsb3VkIHByb2plY3Qga2V5LiBJZiB1bnNldCwgdGhlIHNvbmFyIHNjYW4gc3RlcCBpcyBza2lwcGVkLiAqL1xuICByZWFkb25seSBzb25hclByb2plY3RLZXk/OiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IFwiUFJPSkVOX0dJVEhVQl9UT0tFTlwiICovXG4gIHJlYWRvbmx5IGdoZVRva2VuU2VjcmV0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEphdmFMaWJyYXJ5UHJvamVjdE9wdGlvbnMgZXh0ZW5kcyBDb21tb25KYXZhT3B0aW9ucyB7XG4gIC8qKiBVc2UgTWF2ZW4gQ2VudHJhbCdzIE9JREMgdHJ1c3RlZC1wdWJsaXNoaW5nIGZsb3cgaW5zdGVhZCBvZiBzZWNyZXQtYmFzZWQgR1BHIHNpZ25pbmcuICovXG4gIHJlYWRvbmx5IG1hdmVuQ2VudHJhbE9pZGM/OiBib29sZWFuO1xuXG4gIC8qKiBAZGVmYXVsdCB0cnVlICovXG4gIHJlYWRvbmx5IHB1Ymxpc2hDb2RlSW5kZXg/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENka0RlcGxveUhvb2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21wYW5pb24gQ0RLIGluZnJhL2FwcCByZXBvIChvd25lci9yZXBvKSB0aGF0IG93bnMgdGhlIGFjdHVhbFxuICAgKiBpbmZyYXN0cnVjdHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgd29ya2Zsb3cgaXMgc3RpbGwgZ2VuZXJhdGVkLCBidXQgaXRzIG9ubHkgc3RlcCBmYWlscyB3aXRoXG4gICAqIGluc3RydWN0aW9ucyAoc2VlIGBDZGtEZXBsb3lIb29rYClcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFJlcG8/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSmF2YVNlcnZpY2VQcm9qZWN0T3B0aW9ucyBleHRlbmRzIENvbW1vbkphdmFPcHRpb25zIHtcbiAgLyoqIEBkZWZhdWx0IFwiZG9ja2VyLmlvXCIgKi9cbiAgcmVhZG9ubHkgZG9ja2VyUmVnaXN0cnk/OiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IHRydWUgKi9cbiAgcmVhZG9ubHkgdXNlRmx5d2F5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGNvbXBhbmlvbiBDREsgaW5mcmEvYXBwIHJlcG8gKGBvd25lci9yZXBvYCkgd2hvc2UgYGRlcGxveS55bWxgIHRoZVxuICAgKiBgZGVwbG95LWNka2Agd29ya2Zsb3cgZGlzcGF0Y2hlcy5cbiAgICpcbiAgICogQSBwbGFpbiBzdHJpbmcgcmF0aGVyIHRoYW4gYSBuZXN0ZWQgc3RydWN0IHNvIHRoYXRcbiAgICogYHByb2plbiBuZXcgLS1mcm9tIEB4cGVydHNzL3Byb2plbi10eXBlcyBqYXZhX3NlcnZpY2VgIGNhbiBwYXNzIGl0XG4gICAqIChgLS1jZGstZGVwbG95LXRhcmdldC1yZXBvIG93bmVyL3JlcG9gKTogcHJvamVuJ3MgQ0xJIGNhbiBvbmx5IHJlbmRlclxuICAgKiBvcHRpb25zIHdob3NlIHR5cGUgaXMgYSBzdHJpbmcvbnVtYmVyL2Jvb2xlYW4vYXJyYXkvZW51bSwgc28gYVxuICAgKiBzdHJ1Y3QtdHlwZWQgb3B0aW9uIGlzIGludmlzaWJsZSB0byBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgZGVwbG95LWNkay55bWxgIGlzIGdlbmVyYXRlZCB3aXRoIGEgc2luZ2xlIGZhaWxpbmcgc3RlcCB0aGF0XG4gICAqIHRlbGxzIHlvdSB0byBzZXQgdGhpc1xuICAgKi9cbiAgcmVhZG9ubHkgY2RrRGVwbG95VGFyZ2V0UmVwbz86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBnZW5lcmF0ZSB0aGUgYGRlcGxveS1jZGtgIHdvcmtmbG93IGF0IGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2RrRGVwbG95SG9vaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlcGxveSB0YXJnZXRzIHRvIG9mZmVyIG9uIHRoZSBgQ2RrRGVwbG95SG9va2AncyBtYW51YWwtZGlzcGF0Y2hcbiAgICogd29ya2Zsb3csIHdoZW4gdGhlIGhvb2sgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgW1wicHJvZFwiXVxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnRzPzogKHN0cmluZyB8IEVudmlyb25tZW50T3B0aW9ucylbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKYXZhQXBwUHJvamVjdE9wdGlvbnMgZXh0ZW5kcyBDb21tb25KYXZhT3B0aW9ucyB7XG4gIC8qKiBAZGVmYXVsdCBcImh0dHBzOi8vbWF2ZW4ucGtnLmdpdGh1Yi5jb20vT1dORVIvUkVQT1wiIChkZXJpdmVkIGZyb20gdGhlIHJlcG9zaXRvcnkgVVJMKSAqL1xuICByZWFkb25seSBnaFBhY2thZ2VzUmVnaXN0cnk/OiBzdHJpbmc7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { Component, github } from 'projen';
|
|
2
|
-
/**
|
|
3
|
-
* Blocking, tamper-proof PR check that stops a disallowed GitHub Action
|
|
4
|
-
* reference from ever (re)appearing in a repo's workflow or composite-action
|
|
5
|
-
* files.
|
|
6
|
-
*
|
|
7
|
-
* Runs on `pull_request_target` so it always executes the copy of this
|
|
8
|
-
* workflow committed on the base branch - a PR cannot edit this file to
|
|
9
|
-
* disable or weaken the check. It checks out and executes nothing from the
|
|
10
|
-
* PR; it only reads the PR head's file content via the GitHub API. Because
|
|
11
|
-
* `pull_request_target` runs with the base repo's token even for
|
|
12
|
-
* fork-originated PRs, the failure comment posts reliably.
|
|
13
|
-
*
|
|
14
|
-
* It performs a flat, unconditional scan of the PR's head ref (no
|
|
15
|
-
* base-vs-head comparison): fetch the content of every GitHub workflow and
|
|
16
|
-
* composite-action file, extract every `uses:` value, and fail if any does
|
|
17
|
-
* not start with one of the three trusted namespaces from AD-001
|
|
18
|
-
* (`actions/`, `docker/`, `xpertss/`). The single
|
|
19
|
-
* exemption is a local same-repo reference (`uses: .` or
|
|
20
|
-
* `uses: ./.github/actions/<name>`) - the repo's own hand-committed action,
|
|
21
|
-
* to which the org policy's "allow select actions" setting does not apply.
|
|
22
|
-
*/
|
|
23
|
-
export interface ActionsAllowlistGuardOptions {
|
|
24
|
-
/**
|
|
25
|
-
* GitHub secret holding a token with permission to comment on PRs, used
|
|
26
|
-
* for the failure comment. The check still fails without it, so fork PRs -
|
|
27
|
-
* which get no secrets - are only missing the extra comment.
|
|
28
|
-
* @default "PROJEN_GITHUB_TOKEN"
|
|
29
|
-
*/
|
|
30
|
-
readonly gheTokenSecret?: string;
|
|
31
|
-
/** @default "actions-allowlist-guard" */
|
|
32
|
-
readonly workflowName?: string;
|
|
33
|
-
}
|
|
34
|
-
export declare class ActionsAllowlistGuard extends Component {
|
|
35
|
-
readonly workflow: github.GithubWorkflow;
|
|
36
|
-
constructor(scope: github.GitHubProject, options?: ActionsAllowlistGuardOptions);
|
|
37
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ActionsAllowlistGuard = void 0;
|
|
4
|
-
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
5
|
-
const projen_1 = require("projen");
|
|
6
|
-
const constants_1 = require("./constants");
|
|
7
|
-
class ActionsAllowlistGuard extends projen_1.Component {
|
|
8
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionsAllowlistGuard", version: "0.0.6" };
|
|
9
|
-
workflow;
|
|
10
|
-
constructor(scope, options = {}) {
|
|
11
|
-
super(scope, 'ActionsAllowlistGuard');
|
|
12
|
-
const gh = scope.github;
|
|
13
|
-
if (!gh) {
|
|
14
|
-
throw new Error('ActionsAllowlistGuard requires GitHub integration to be enabled');
|
|
15
|
-
}
|
|
16
|
-
const gheTokenSecret = options.gheTokenSecret ?? constants_1.DEFAULT_GHE_TOKEN_SECRET;
|
|
17
|
-
this.workflow = new projen_1.github.GithubWorkflow(gh, options.workflowName ?? 'actions-allowlist-guard');
|
|
18
|
-
this.workflow.on({ pullRequestTarget: {} });
|
|
19
|
-
this.workflow.addJob('check', {
|
|
20
|
-
runsOn: ['ubuntu-latest'],
|
|
21
|
-
permissions: {
|
|
22
|
-
contents: projen_1.github.workflows.JobPermission.READ,
|
|
23
|
-
pullRequests: projen_1.github.workflows.JobPermission.WRITE,
|
|
24
|
-
},
|
|
25
|
-
env: { GH_TOKEN: `\${{ secrets.${gheTokenSecret} }}` },
|
|
26
|
-
steps: [
|
|
27
|
-
{
|
|
28
|
-
name: 'Enforce action allow-list',
|
|
29
|
-
run: `set -uo pipefail
|
|
30
|
-
head_sha="\${{ github.event.pull_request.head.sha }}"
|
|
31
|
-
pr_number="\${{ github.event.number }}"
|
|
32
|
-
repo="\${GITHUB_REPOSITORY}"
|
|
33
|
-
# All files at the PR head (recursive tree), narrowed to workflow and
|
|
34
|
-
# composite-action files.
|
|
35
|
-
files="$(gh api "repos/$repo/git/trees/$head_sha?recursive=1" --jq '.tree[] | select(.type=="blob") | .path' | grep -E '^\\.github/(workflows/[^/]+\\.(yml|yaml)|actions/[^/]+/action\\.(yml|yaml))$' || true)"
|
|
36
|
-
violations=()
|
|
37
|
-
while IFS= read -r path; do
|
|
38
|
-
[ -z "$path" ] && continue
|
|
39
|
-
content="$(gh api "repos/$repo/contents/$path?ref=$head_sha" --jq -r '.content' 2>/dev/null | base64 -d 2>/dev/null || true)"
|
|
40
|
-
lineno=0
|
|
41
|
-
while IFS= read -r line; do
|
|
42
|
-
lineno=$((lineno + 1))
|
|
43
|
-
value="$(printf '%s\\n' "$line" | sed -n 's/^[[:space:]]*uses:[[:space:]]*//p' | tr -d '\\\"')"
|
|
44
|
-
[ -z "$value" ] && continue
|
|
45
|
-
case "$value" in
|
|
46
|
-
actions/*|docker/*|xpertss/*|.|./*) ;;
|
|
47
|
-
*) violations+=(" - $path:$lineno — uses: $value") ;;
|
|
48
|
-
esac
|
|
49
|
-
done <<< "$content"
|
|
50
|
-
done <<< "$files"
|
|
51
|
-
if [ "\${#violations[@]}" -gt 0 ]; then
|
|
52
|
-
{
|
|
53
|
-
echo "❌ Disallowed GitHub Action reference"
|
|
54
|
-
echo ""
|
|
55
|
-
echo "This PR references an action outside the allow-list:"
|
|
56
|
-
echo ""
|
|
57
|
-
printf '%s\\n' "\${violations[@]}"
|
|
58
|
-
echo ""
|
|
59
|
-
echo "Org policy trusts only actions/*, docker/*, and xpertss/*. Use an equivalent internal action, or ask its maintainers to add one."
|
|
60
|
-
} | gh pr comment "$pr_number" --body-file - || echo "::warning::could not post PR comment (fork PR or missing token)"
|
|
61
|
-
exit 1
|
|
62
|
-
fi
|
|
63
|
-
`,
|
|
64
|
-
},
|
|
65
|
-
],
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
exports.ActionsAllowlistGuard = ActionsAllowlistGuard;
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9ucy1hbGxvd2xpc3QtZ3VhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbW9uL2FjdGlvbnMtYWxsb3dsaXN0LWd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FBMkM7QUFDM0MsMkNBQXVEO0FBb0N2RCxNQUFhLHFCQUFzQixTQUFRLGtCQUFTOztJQUNsQyxRQUFRLENBQXdCO0lBRWhELFlBQ0UsS0FBMkIsRUFDM0IsVUFBd0MsRUFBRTtRQUUxQyxLQUFLLENBQUMsS0FBSyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFdEMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN4QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixNQUFNLElBQUksS0FBSyxDQUNiLGlFQUFpRSxDQUNsRSxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sY0FBYyxHQUNsQixPQUFPLENBQUMsY0FBYyxJQUFJLG9DQUF3QixDQUFDO1FBRXJELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxlQUFNLENBQUMsY0FBYyxDQUN2QyxFQUFFLEVBQ0YsT0FBTyxDQUFDLFlBQVksSUFBSSx5QkFBeUIsQ0FDbEQsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDNUIsTUFBTSxFQUFFLENBQUMsZUFBZSxDQUFDO1lBQ3pCLFdBQVcsRUFBRTtnQkFDWCxRQUFRLEVBQUUsZUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSTtnQkFDN0MsWUFBWSxFQUFFLGVBQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUs7YUFDbkQ7WUFDRCxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLGNBQWMsS0FBSyxFQUFFO1lBQ3RELEtBQUssRUFBRTtnQkFDTDtvQkFDRSxJQUFJLEVBQUUsMkJBQTJCO29CQUNqQyxHQUFHLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FrQ2Q7aUJBQ1E7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBeEVILHNEQXlFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZ2l0aHViIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IERFRkFVTFRfR0hFX1RPS0VOX1NFQ1JFVCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBCbG9ja2luZywgdGFtcGVyLXByb29mIFBSIGNoZWNrIHRoYXQgc3RvcHMgYSBkaXNhbGxvd2VkIEdpdEh1YiBBY3Rpb25cbiAqIHJlZmVyZW5jZSBmcm9tIGV2ZXIgKHJlKWFwcGVhcmluZyBpbiBhIHJlcG8ncyB3b3JrZmxvdyBvciBjb21wb3NpdGUtYWN0aW9uXG4gKiBmaWxlcy5cbiAqXG4gKiBSdW5zIG9uIGBwdWxsX3JlcXVlc3RfdGFyZ2V0YCBzbyBpdCBhbHdheXMgZXhlY3V0ZXMgdGhlIGNvcHkgb2YgdGhpc1xuICogd29ya2Zsb3cgY29tbWl0dGVkIG9uIHRoZSBiYXNlIGJyYW5jaCAtIGEgUFIgY2Fubm90IGVkaXQgdGhpcyBmaWxlIHRvXG4gKiBkaXNhYmxlIG9yIHdlYWtlbiB0aGUgY2hlY2suIEl0IGNoZWNrcyBvdXQgYW5kIGV4ZWN1dGVzIG5vdGhpbmcgZnJvbSB0aGVcbiAqIFBSOyBpdCBvbmx5IHJlYWRzIHRoZSBQUiBoZWFkJ3MgZmlsZSBjb250ZW50IHZpYSB0aGUgR2l0SHViIEFQSS4gQmVjYXVzZVxuICogYHB1bGxfcmVxdWVzdF90YXJnZXRgIHJ1bnMgd2l0aCB0aGUgYmFzZSByZXBvJ3MgdG9rZW4gZXZlbiBmb3JcbiAqIGZvcmstb3JpZ2luYXRlZCBQUnMsIHRoZSBmYWlsdXJlIGNvbW1lbnQgcG9zdHMgcmVsaWFibHkuXG4gKlxuICAqIEl0IHBlcmZvcm1zIGEgZmxhdCwgdW5jb25kaXRpb25hbCBzY2FuIG9mIHRoZSBQUidzIGhlYWQgcmVmIChub1xuICAqIGJhc2UtdnMtaGVhZCBjb21wYXJpc29uKTogZmV0Y2ggdGhlIGNvbnRlbnQgb2YgZXZlcnkgR2l0SHViIHdvcmtmbG93IGFuZFxuICAqIGNvbXBvc2l0ZS1hY3Rpb24gZmlsZSwgZXh0cmFjdCBldmVyeSBgdXNlczpgIHZhbHVlLCBhbmQgZmFpbCBpZiBhbnkgZG9lc1xuICAqIG5vdCBzdGFydCB3aXRoIG9uZSBvZiB0aGUgdGhyZWUgdHJ1c3RlZCBuYW1lc3BhY2VzIGZyb20gQUQtMDAxXG4gICogKGBhY3Rpb25zL2AsIGBkb2NrZXIvYCwgYHhwZXJ0c3MvYCkuIFRoZSBzaW5nbGVcbiAqIGV4ZW1wdGlvbiBpcyBhIGxvY2FsIHNhbWUtcmVwbyByZWZlcmVuY2UgKGB1c2VzOiAuYCBvclxuICogYHVzZXM6IC4vLmdpdGh1Yi9hY3Rpb25zLzxuYW1lPmApIC0gdGhlIHJlcG8ncyBvd24gaGFuZC1jb21taXR0ZWQgYWN0aW9uLFxuICogdG8gd2hpY2ggdGhlIG9yZyBwb2xpY3kncyBcImFsbG93IHNlbGVjdCBhY3Rpb25zXCIgc2V0dGluZyBkb2VzIG5vdCBhcHBseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25zQWxsb3dsaXN0R3VhcmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEdpdEh1YiBzZWNyZXQgaG9sZGluZyBhIHRva2VuIHdpdGggcGVybWlzc2lvbiB0byBjb21tZW50IG9uIFBScywgdXNlZFxuICAgKiBmb3IgdGhlIGZhaWx1cmUgY29tbWVudC4gVGhlIGNoZWNrIHN0aWxsIGZhaWxzIHdpdGhvdXQgaXQsIHNvIGZvcmsgUFJzIC1cbiAgICogd2hpY2ggZ2V0IG5vIHNlY3JldHMgLSBhcmUgb25seSBtaXNzaW5nIHRoZSBleHRyYSBjb21tZW50LlxuICAgKiBAZGVmYXVsdCBcIlBST0pFTl9HSVRIVUJfVE9LRU5cIlxuICAgKi9cbiAgcmVhZG9ubHkgZ2hlVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IFwiYWN0aW9ucy1hbGxvd2xpc3QtZ3VhcmRcIiAqL1xuICByZWFkb25seSB3b3JrZmxvd05hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25zQWxsb3dsaXN0R3VhcmQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3c6IGdpdGh1Yi5HaXRodWJXb3JrZmxvdztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogZ2l0aHViLkdpdEh1YlByb2plY3QsXG4gICAgb3B0aW9uczogQWN0aW9uc0FsbG93bGlzdEd1YXJkT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgJ0FjdGlvbnNBbGxvd2xpc3RHdWFyZCcpO1xuXG4gICAgY29uc3QgZ2ggPSBzY29wZS5naXRodWI7XG4gICAgaWYgKCFnaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQWN0aW9uc0FsbG93bGlzdEd1YXJkIHJlcXVpcmVzIEdpdEh1YiBpbnRlZ3JhdGlvbiB0byBiZSBlbmFibGVkJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2hlVG9rZW5TZWNyZXQgPVxuICAgICAgb3B0aW9ucy5naGVUb2tlblNlY3JldCA/PyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQ7XG5cbiAgICB0aGlzLndvcmtmbG93ID0gbmV3IGdpdGh1Yi5HaXRodWJXb3JrZmxvdyhcbiAgICAgIGdoLFxuICAgICAgb3B0aW9ucy53b3JrZmxvd05hbWUgPz8gJ2FjdGlvbnMtYWxsb3dsaXN0LWd1YXJkJyxcbiAgICApO1xuICAgIHRoaXMud29ya2Zsb3cub24oeyBwdWxsUmVxdWVzdFRhcmdldDoge30gfSk7XG4gICAgdGhpcy53b3JrZmxvdy5hZGRKb2IoJ2NoZWNrJywge1xuICAgICAgcnVuc09uOiBbJ3VidW50dS1sYXRlc3QnXSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGNvbnRlbnRzOiBnaXRodWIud29ya2Zsb3dzLkpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgcHVsbFJlcXVlc3RzOiBnaXRodWIud29ya2Zsb3dzLkpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICB9LFxuICAgICAgZW52OiB7IEdIX1RPS0VOOiBgXFwke3sgc2VjcmV0cy4ke2doZVRva2VuU2VjcmV0fSB9fWAgfSxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnRW5mb3JjZSBhY3Rpb24gYWxsb3ctbGlzdCcsXG4gICAgICAgICAgcnVuOiBgc2V0IC11byBwaXBlZmFpbFxuaGVhZF9zaGE9XCJcXCR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQuc2hhIH19XCJcbnByX251bWJlcj1cIlxcJHt7IGdpdGh1Yi5ldmVudC5udW1iZXIgfX1cIlxucmVwbz1cIlxcJHtHSVRIVUJfUkVQT1NJVE9SWX1cIlxuIyBBbGwgZmlsZXMgYXQgdGhlIFBSIGhlYWQgKHJlY3Vyc2l2ZSB0cmVlKSwgbmFycm93ZWQgdG8gd29ya2Zsb3cgYW5kXG4jIGNvbXBvc2l0ZS1hY3Rpb24gZmlsZXMuXG5maWxlcz1cIiQoZ2ggYXBpIFwicmVwb3MvJHJlcG8vZ2l0L3RyZWVzLyRoZWFkX3NoYT9yZWN1cnNpdmU9MVwiIC0tanEgJy50cmVlW10gfCBzZWxlY3QoLnR5cGU9PVwiYmxvYlwiKSB8IC5wYXRoJyB8IGdyZXAgLUUgJ15cXFxcLmdpdGh1Yi8od29ya2Zsb3dzL1teL10rXFxcXC4oeW1sfHlhbWwpfGFjdGlvbnMvW14vXSsvYWN0aW9uXFxcXC4oeW1sfHlhbWwpKSQnIHx8IHRydWUpXCJcbnZpb2xhdGlvbnM9KClcbndoaWxlIElGUz0gcmVhZCAtciBwYXRoOyBkb1xuICBbIC16IFwiJHBhdGhcIiBdICYmIGNvbnRpbnVlXG4gIGNvbnRlbnQ9XCIkKGdoIGFwaSBcInJlcG9zLyRyZXBvL2NvbnRlbnRzLyRwYXRoP3JlZj0kaGVhZF9zaGFcIiAtLWpxIC1yICcuY29udGVudCcgMj4vZGV2L251bGwgfCBiYXNlNjQgLWQgMj4vZGV2L251bGwgfHwgdHJ1ZSlcIlxuICBsaW5lbm89MFxuICB3aGlsZSBJRlM9IHJlYWQgLXIgbGluZTsgZG9cbiAgICBsaW5lbm89JCgobGluZW5vICsgMSkpXG4gICAgdmFsdWU9XCIkKHByaW50ZiAnJXNcXFxcbicgXCIkbGluZVwiIHwgc2VkIC1uICdzL15bWzpzcGFjZTpdXSp1c2VzOltbOnNwYWNlOl1dKi8vcCcgfCB0ciAtZCAnXFxcXFxcXCInKVwiXG4gICAgWyAteiBcIiR2YWx1ZVwiIF0gJiYgY29udGludWVcbiAgICBjYXNlIFwiJHZhbHVlXCIgaW5cbiAgICAgIGFjdGlvbnMvKnxkb2NrZXIvKnx4cGVydHNzLyp8LnwuLyopIDs7XG4gICAgICAqKSB2aW9sYXRpb25zKz0oXCIgIC0gJHBhdGg6JGxpbmVubyDigJQgdXNlczogJHZhbHVlXCIpIDs7XG4gICAgZXNhY1xuICBkb25lIDw8PCBcIiRjb250ZW50XCJcbmRvbmUgPDw8IFwiJGZpbGVzXCJcbmlmIFsgXCJcXCR7I3Zpb2xhdGlvbnNbQF19XCIgLWd0IDAgXTsgdGhlblxuICB7XG4gICAgZWNobyBcIuKdjCBEaXNhbGxvd2VkIEdpdEh1YiBBY3Rpb24gcmVmZXJlbmNlXCJcbiAgICBlY2hvIFwiXCJcbiAgICBlY2hvIFwiVGhpcyBQUiByZWZlcmVuY2VzIGFuIGFjdGlvbiBvdXRzaWRlIHRoZSBhbGxvdy1saXN0OlwiXG4gICAgZWNobyBcIlwiXG4gICAgcHJpbnRmICclc1xcXFxuJyBcIlxcJHt2aW9sYXRpb25zW0BdfVwiXG4gICAgZWNobyBcIlwiXG4gICAgZWNobyBcIk9yZyBwb2xpY3kgdHJ1c3RzIG9ubHkgYWN0aW9ucy8qLCBkb2NrZXIvKiwgYW5kIHhwZXJ0c3MvKi4gVXNlIGFuIGVxdWl2YWxlbnQgaW50ZXJuYWwgYWN0aW9uLCBvciBhc2sgaXRzIG1haW50YWluZXJzIHRvIGFkZCBvbmUuXCJcbiAgfSB8IGdoIHByIGNvbW1lbnQgXCIkcHJfbnVtYmVyXCIgLS1ib2R5LWZpbGUgLSB8fCBlY2hvIFwiOjp3YXJuaW5nOjpjb3VsZCBub3QgcG9zdCBQUiBjb21tZW50IChmb3JrIFBSIG9yIG1pc3NpbmcgdG9rZW4pXCJcbiAgZXhpdCAxXG5maVxuYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|