@aws-cdk/app-staging-synthesizer-alpha 2.82.0-alpha.0
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 +5029 -0
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +169 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +401 -0
- package/adr/resource-names.md +30 -0
- package/jest.config.js +4 -0
- package/lib/app-staging-synthesizer.d.ts +125 -0
- package/lib/app-staging-synthesizer.js +255 -0
- package/lib/bootstrap-roles.d.ts +93 -0
- package/lib/bootstrap-roles.js +98 -0
- package/lib/default-staging-stack.d.ts +151 -0
- package/lib/default-staging-stack.js +285 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +21 -0
- package/lib/per-env-staging-factory.d.ts +10 -0
- package/lib/per-env-staging-factory.js +32 -0
- package/lib/private/app-global.d.ts +16 -0
- package/lib/private/app-global.js +34 -0
- package/lib/private/no-tokens.d.ts +1 -0
- package/lib/private/no-tokens.js +13 -0
- package/lib/staging-stack.d.ts +107 -0
- package/lib/staging-stack.js +3 -0
- package/package.json +105 -0
- package/rosetta/_generated.ts-fixture +6 -0
- package/rosetta/default.ts-fixture +22 -0
- package/rosetta/with-custom-staging.ts-fixture +44 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.DefaultStagingStack = exports.DEPLOY_TIME_PREFIX = void 0;
|
|
5
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const fs = require("fs");
|
|
8
|
+
const path = require("path");
|
|
9
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
10
|
+
const ecr = require("aws-cdk-lib/aws-ecr");
|
|
11
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
12
|
+
const kms = require("aws-cdk-lib/aws-kms");
|
|
13
|
+
const s3 = require("aws-cdk-lib/aws-s3");
|
|
14
|
+
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
15
|
+
exports.DEPLOY_TIME_PREFIX = 'deploy-time/';
|
|
16
|
+
/**
|
|
17
|
+
* A default Staging Stack that implements IStagingResources.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id' });
|
|
21
|
+
*/
|
|
22
|
+
class DefaultStagingStack extends aws_cdk_lib_1.Stack {
|
|
23
|
+
/**
|
|
24
|
+
* Return a factory that will create DefaultStagingStacks
|
|
25
|
+
*/
|
|
26
|
+
static factory(options) {
|
|
27
|
+
try {
|
|
28
|
+
jsiiDeprecationWarnings._aws_cdk_app_staging_synthesizer_alpha_DefaultStagingStackOptions(options);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
32
|
+
Error.captureStackTrace(error, this.factory);
|
|
33
|
+
}
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
const appId = options.appId.toLocaleLowerCase().replace(/[^a-z0-9-]/g, '-').slice(0, 20);
|
|
37
|
+
return {
|
|
38
|
+
obtainStagingResources(stack, context) {
|
|
39
|
+
const app = aws_cdk_lib_1.App.of(stack);
|
|
40
|
+
if (!aws_cdk_lib_1.App.isApp(app)) {
|
|
41
|
+
throw new Error(`Stack ${stack.stackName} must be part of an App`);
|
|
42
|
+
}
|
|
43
|
+
const stackId = `StagingStack-${appId}-${context.environmentString}`;
|
|
44
|
+
return new DefaultStagingStack(app, stackId, {
|
|
45
|
+
...options,
|
|
46
|
+
// Does not need to contain environment because stack names are unique inside an env anyway
|
|
47
|
+
stackName: `StagingStack-${appId}`,
|
|
48
|
+
env: {
|
|
49
|
+
account: stack.account,
|
|
50
|
+
region: stack.region,
|
|
51
|
+
},
|
|
52
|
+
appId,
|
|
53
|
+
qualifier: context.qualifier,
|
|
54
|
+
deployRoleArn: context.deployRoleArn,
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Default asset publishing role name for file (S3) assets.
|
|
61
|
+
*/
|
|
62
|
+
get fileRoleName() {
|
|
63
|
+
// This role name can be a maximum of 64 letters. The reason why
|
|
64
|
+
// we slice the appId and not the entire name is because this.region
|
|
65
|
+
// can be a token and we don't want to accidentally cut it off.
|
|
66
|
+
return `cdk-${this.appId}-file-role-${this.region}`;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Default asset publishing role name for docker (ECR) assets.
|
|
70
|
+
*/
|
|
71
|
+
get imageRoleName() {
|
|
72
|
+
// This role name can be a maximum of 64 letters. The reason why
|
|
73
|
+
// we slice the appId and not the entire name is because this.region
|
|
74
|
+
// can be a token and we don't want to accidentally cut it off.
|
|
75
|
+
return `cdk-${this.appId}-image-role-${this.region}`;
|
|
76
|
+
}
|
|
77
|
+
constructor(scope, id, props) {
|
|
78
|
+
super(scope, id, {
|
|
79
|
+
...props,
|
|
80
|
+
synthesizer: new aws_cdk_lib_1.BootstraplessSynthesizer(),
|
|
81
|
+
});
|
|
82
|
+
this.props = props;
|
|
83
|
+
this.didImageRole = false;
|
|
84
|
+
try {
|
|
85
|
+
jsiiDeprecationWarnings._aws_cdk_app_staging_synthesizer_alpha_DefaultStagingStackProps(props);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
89
|
+
Error.captureStackTrace(error, DefaultStagingStack);
|
|
90
|
+
}
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
this.appId = this.validateAppId(props.appId);
|
|
94
|
+
this.dependencyStack = this;
|
|
95
|
+
this.deployRoleArn = props.deployRoleArn;
|
|
96
|
+
this.stagingBucketName = props.stagingBucketName;
|
|
97
|
+
const specializer = new helpers_internal_1.StringSpecializer(this, props.qualifier);
|
|
98
|
+
this.providedFileRole = props.fileAssetPublishingRole?._specialize(specializer);
|
|
99
|
+
this.providedImageRole = props.imageAssetPublishingRole?._specialize(specializer);
|
|
100
|
+
this.stagingRepos = {};
|
|
101
|
+
}
|
|
102
|
+
validateAppId(id) {
|
|
103
|
+
const errors = [];
|
|
104
|
+
if (id.length > 20) {
|
|
105
|
+
errors.push(`appId expected no more than 20 characters but got ${id.length} characters.`);
|
|
106
|
+
}
|
|
107
|
+
if (id !== id.toLocaleLowerCase()) {
|
|
108
|
+
errors.push('appId only accepts lowercase characters.');
|
|
109
|
+
}
|
|
110
|
+
if (!/^[a-z0-9-]*$/.test(id)) {
|
|
111
|
+
errors.push('appId expects only letters, numbers, and dashes (\'-\')');
|
|
112
|
+
}
|
|
113
|
+
if (errors.length > 0) {
|
|
114
|
+
throw new Error([
|
|
115
|
+
`appId ${id} has errors:`,
|
|
116
|
+
...errors,
|
|
117
|
+
].join('\n'));
|
|
118
|
+
}
|
|
119
|
+
return id;
|
|
120
|
+
}
|
|
121
|
+
ensureFileRole() {
|
|
122
|
+
if (this.providedFileRole) {
|
|
123
|
+
// Override
|
|
124
|
+
this.fileRoleManifestArn = this.providedFileRole._arnForCloudAssembly();
|
|
125
|
+
const cfnArn = this.providedFileRole._arnForCloudFormation();
|
|
126
|
+
this.fileRole = cfnArn ? iam.Role.fromRoleArn(this, 'CdkFileRole', cfnArn) : undefined;
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const roleName = this.fileRoleName;
|
|
130
|
+
this.fileRole = new iam.Role(this, 'CdkFileRole', {
|
|
131
|
+
roleName,
|
|
132
|
+
assumedBy: new iam.AccountPrincipal(this.account),
|
|
133
|
+
});
|
|
134
|
+
this.fileRoleManifestArn = aws_cdk_lib_1.Stack.of(this).formatArn({
|
|
135
|
+
partition: '${AWS::Partition}',
|
|
136
|
+
region: '',
|
|
137
|
+
service: 'iam',
|
|
138
|
+
resource: 'role',
|
|
139
|
+
resourceName: roleName,
|
|
140
|
+
arnFormat: aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
ensureImageRole() {
|
|
144
|
+
// It may end up setting imageRole to undefined, but at least we tried
|
|
145
|
+
if (this.didImageRole) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
this.didImageRole = true;
|
|
149
|
+
if (this.providedImageRole) {
|
|
150
|
+
// Override
|
|
151
|
+
this.imageRoleManifestArn = this.providedImageRole._arnForCloudAssembly();
|
|
152
|
+
const cfnArn = this.providedImageRole._arnForCloudFormation();
|
|
153
|
+
this.imageRole = cfnArn ? iam.Role.fromRoleArn(this, 'CdkImageRole', cfnArn) : undefined;
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const roleName = this.imageRoleName;
|
|
157
|
+
this.imageRole = new iam.Role(this, 'CdkImageRole', {
|
|
158
|
+
roleName,
|
|
159
|
+
assumedBy: new iam.AccountPrincipal(this.account),
|
|
160
|
+
});
|
|
161
|
+
this.imageRoleManifestArn = aws_cdk_lib_1.Stack.of(this).formatArn({
|
|
162
|
+
partition: '${AWS::Partition}',
|
|
163
|
+
region: '',
|
|
164
|
+
service: 'iam',
|
|
165
|
+
resource: 'role',
|
|
166
|
+
resourceName: roleName,
|
|
167
|
+
arnFormat: aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
createBucketKey() {
|
|
171
|
+
return new kms.Key(this, 'BucketKey', {
|
|
172
|
+
alias: `alias/cdk-${this.appId}-staging`,
|
|
173
|
+
admins: [new iam.AccountPrincipal(this.account)],
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
getCreateBucket() {
|
|
177
|
+
const stagingBucketName = this.stagingBucketName ?? `cdk-${this.appId}-staging-${this.account}-${this.region}`;
|
|
178
|
+
const bucketId = 'CdkStagingBucket';
|
|
179
|
+
const createdBucket = this.node.tryFindChild(bucketId);
|
|
180
|
+
if (createdBucket) {
|
|
181
|
+
return stagingBucketName;
|
|
182
|
+
}
|
|
183
|
+
this.ensureFileRole();
|
|
184
|
+
const key = this.createBucketKey();
|
|
185
|
+
// Create the bucket once the dependencies have been created
|
|
186
|
+
const bucket = new s3.Bucket(this, bucketId, {
|
|
187
|
+
bucketName: stagingBucketName,
|
|
188
|
+
removalPolicy: aws_cdk_lib_1.RemovalPolicy.RETAIN,
|
|
189
|
+
encryption: s3.BucketEncryption.KMS,
|
|
190
|
+
encryptionKey: key,
|
|
191
|
+
// Many AWS account safety checkers will complain when buckets aren't versioned
|
|
192
|
+
versioned: true,
|
|
193
|
+
// Many AWS account safety checkers will complain when SSL isn't enforced
|
|
194
|
+
enforceSSL: true,
|
|
195
|
+
});
|
|
196
|
+
if (this.fileRole) {
|
|
197
|
+
bucket.grantReadWrite(this.fileRole);
|
|
198
|
+
}
|
|
199
|
+
if (this.deployRoleArn) {
|
|
200
|
+
bucket.addToResourcePolicy(new iam.PolicyStatement({
|
|
201
|
+
actions: [
|
|
202
|
+
's3:GetObject*',
|
|
203
|
+
's3:GetBucket*',
|
|
204
|
+
's3:List*',
|
|
205
|
+
],
|
|
206
|
+
resources: [bucket.bucketArn, bucket.arnForObjects('*')],
|
|
207
|
+
principals: [new iam.ArnPrincipal(this.deployRoleArn)],
|
|
208
|
+
}));
|
|
209
|
+
}
|
|
210
|
+
// Objects should never be overwritten, but let's make sure we have a lifecycle policy
|
|
211
|
+
// for it anyway.
|
|
212
|
+
bucket.addLifecycleRule({
|
|
213
|
+
noncurrentVersionExpiration: aws_cdk_lib_1.Duration.days(365),
|
|
214
|
+
});
|
|
215
|
+
bucket.addLifecycleRule({
|
|
216
|
+
prefix: exports.DEPLOY_TIME_PREFIX,
|
|
217
|
+
expiration: this.props.deployTimeFileAssetLifetime ?? aws_cdk_lib_1.Duration.days(30),
|
|
218
|
+
});
|
|
219
|
+
return stagingBucketName;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Returns the well-known name of the repo
|
|
223
|
+
*/
|
|
224
|
+
getCreateRepo(asset) {
|
|
225
|
+
if (!asset.assetName) {
|
|
226
|
+
throw new Error('Assets synthesized with AppScopedStagingSynthesizer must include an \'assetName\' in the asset source definition.');
|
|
227
|
+
}
|
|
228
|
+
// Create image publishing role if it doesn't exist
|
|
229
|
+
this.ensureImageRole();
|
|
230
|
+
const repoName = generateRepoName(`${this.appId}/${asset.assetName}`);
|
|
231
|
+
if (this.stagingRepos[asset.assetName] === undefined) {
|
|
232
|
+
this.stagingRepos[asset.assetName] = new ecr.Repository(this, repoName, {
|
|
233
|
+
repositoryName: repoName,
|
|
234
|
+
lifecycleRules: [{
|
|
235
|
+
description: 'Garbage collect old image versions and keep the specified number of latest versions',
|
|
236
|
+
maxImageCount: this.props.imageAssetVersionCount ?? 3,
|
|
237
|
+
}],
|
|
238
|
+
});
|
|
239
|
+
if (this.imageRole) {
|
|
240
|
+
this.stagingRepos[asset.assetName].grantPullPush(this.imageRole);
|
|
241
|
+
this.stagingRepos[asset.assetName].grantRead(this.imageRole);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return repoName;
|
|
245
|
+
function generateRepoName(name) {
|
|
246
|
+
return name.toLocaleLowerCase().replace('.', '-');
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
addFile(asset) {
|
|
250
|
+
// Has side effects so must go first
|
|
251
|
+
const bucketName = this.getCreateBucket();
|
|
252
|
+
return {
|
|
253
|
+
bucketName,
|
|
254
|
+
assumeRoleArn: this.fileRoleManifestArn,
|
|
255
|
+
prefix: asset.deployTime ? exports.DEPLOY_TIME_PREFIX : undefined,
|
|
256
|
+
dependencyStack: this,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
addDockerImage(asset) {
|
|
260
|
+
// Has side effects so must go first
|
|
261
|
+
const repoName = this.getCreateRepo(asset);
|
|
262
|
+
return {
|
|
263
|
+
repoName,
|
|
264
|
+
assumeRoleArn: this.imageRoleManifestArn,
|
|
265
|
+
dependencyStack: this,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Synthesizes the cloudformation template into a cloud assembly.
|
|
270
|
+
* @internal
|
|
271
|
+
*/
|
|
272
|
+
_synthesizeTemplate(session, lookupRoleArn) {
|
|
273
|
+
super._synthesizeTemplate(session, lookupRoleArn);
|
|
274
|
+
const builder = session.assembly;
|
|
275
|
+
const outPath = path.join(builder.outdir, this.templateFile);
|
|
276
|
+
const size = fs.statSync(outPath).size;
|
|
277
|
+
if (size > 51200) {
|
|
278
|
+
throw new Error(`Staging resource template cannot be greater than 51200 bytes, but got ${size} bytes`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
283
|
+
DefaultStagingStack[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DefaultStagingStack", version: "2.82.0-alpha.0" };
|
|
284
|
+
exports.DefaultStagingStack = DefaultStagingStack;
|
|
285
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsNkNBV3FCO0FBQ3JCLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDLHlDQUF5QztBQUN6Qyw0RUFBMEU7QUFJN0QsUUFBQSxrQkFBa0IsR0FBRyxjQUFjLENBQUM7QUF5RmpEOzs7OztHQUtHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxtQkFBSztJQUM1Qzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBbUM7Ozs7Ozs7Ozs7UUFDdkQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6RixPQUFPO1lBQ0wsc0JBQXNCLENBQUMsS0FBSyxFQUFFLE9BQU87Z0JBQ25DLE1BQU0sR0FBRyxHQUFHLGlCQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsaUJBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLENBQUMsU0FBUyx5QkFBeUIsQ0FBQyxDQUFDO2lCQUNwRTtnQkFFRCxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsS0FBSyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNyRSxPQUFPLElBQUksbUJBQW1CLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRTtvQkFDM0MsR0FBRyxPQUFPO29CQUVWLDJGQUEyRjtvQkFDM0YsU0FBUyxFQUFFLGdCQUFnQixLQUFLLEVBQUU7b0JBQ2xD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LEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2QyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5RUFBeUUsSUFBSSxRQUFRLENBQUMsQ0FBQztTQUN4RztLQUNGOzs7O0FBclRVLGtEQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBBcHAsXG4gIEFybkZvcm1hdCxcbiAgQm9vdHN0cmFwbGVzc1N5bnRoZXNpemVyLFxuICBEb2NrZXJJbWFnZUFzc2V0U291cmNlLFxuICBEdXJhdGlvbixcbiAgRmlsZUFzc2V0U291cmNlLFxuICBJU3ludGhlc2lzU2Vzc2lvbixcbiAgUmVtb3ZhbFBvbGljeSxcbiAgU3RhY2ssXG4gIFN0YWNrUHJvcHMsXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjciBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBTdHJpbmdTcGVjaWFsaXplciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgQm9vdHN0cmFwUm9sZSB9IGZyb20gJy4vYm9vdHN0cmFwLXJvbGVzJztcbmltcG9ydCB7IEZpbGVTdGFnaW5nTG9jYXRpb24sIElTdGFnaW5nUmVzb3VyY2VzLCBJU3RhZ2luZ1Jlc291cmNlc0ZhY3RvcnksIEltYWdlU3RhZ2luZ0xvY2F0aW9uIH0gZnJvbSAnLi9zdGFnaW5nLXN0YWNrJztcblxuZXhwb3J0IGNvbnN0IERFUExPWV9USU1FX1BSRUZJWCA9ICdkZXBsb3ktdGltZS8nO1xuXG4vKipcbiAqIFVzZXIgY29uZmlndXJhYmxlIG9wdGlvbnMgdG8gdGhlIERlZmF1bHRTdGFnaW5nU3RhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdFN0YWdpbmdTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFwcGxpY2F0aW9uIHRoYXQgdGhlIHN0YWdpbmcgc3RhY2sgYmVsb25ncyB0by5cbiAgICpcbiAgICogVGhpcyBpZGVudGlmaWVyIHdpbGwgYmUgdXNlZCBpbiB0aGUgbmFtZSBvZiBzdGFnaW5nIHJlc291cmNlc1xuICAgKiBjcmVhdGVkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgQ0RLIGFwcHMuXG4gICAqXG4gICAqIFRoZSBpZGVudGlmaWVyIHNob3VsZCBpbmNsdWRlIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIGFuZCBkYXNoZXMgKCctJykgb25seVxuICAgKiBhbmQgaGF2ZSBhIG1heGltdW0gb2YgMjAgY2hhcmFjdGVycy5cbiAgICovXG4gIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IG5hbWUgZm9yIHRoZSBzdGFnaW5nIGJ1Y2tldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgd2VsbC1rbm93biBuYW1lIHVuaXF1ZSB0byB0aGlzIGFwcC9lbnYuXG4gICAqL1xuICByZWFkb25seSBzdGFnaW5nQnVja2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUGFzcyBpbiBhbiBleGlzdGluZyByb2xlIHRvIGJlIHVzZWQgYXMgdGhlIGZpbGUgcHVibGlzaGluZyByb2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBmaWxlQXNzZXRQdWJsaXNoaW5nUm9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIFBhc3MgaW4gYW4gZXhpc3Rpbmcgcm9sZSB0byBiZSB1c2VkIGFzIHRoZSBpbWFnZSBwdWJsaXNoaW5nIHJvbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBuZXcgcm9sZSB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlQXNzZXRQdWJsaXNoaW5nUm9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBsaWZldGltZSBmb3IgZGVwbG95IHRpbWUgZmlsZSBhc3NldHMuXG4gICAqXG4gICAqIEFzc2V0cyB0aGF0IGFyZSBvbmx5IG5lY2Vzc2FyeSBhdCBkZXBsb3ltZW50IHRpbWUgKGZvciBpbnN0YW5jZSxcbiAgICogQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVzIGFuZCBMYW1iZGEgc291cmNlIGNvZGUgYnVuZGxlcykgd2lsbCBiZVxuICAgKiBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQgYWZ0ZXIgdGhpcyBtYW55IGRheXMuIEFzc2V0cyB0aGF0IG1heSBiZVxuICAgKiByZWFkIGZyb20gdGhlIHN0YWdpbmcgYnVja2V0IGR1cmluZyB5b3VyIGFwcGxpY2F0aW9uJ3MgcnVuIHRpbWVcbiAgICogd2lsbCBub3QgYmUgZGVsZXRlZC5cbiAgICpcbiAgICogU2V0IHRoaXMgdG8gdGhlIGxlbmd0aCBvZiB0aW1lIHlvdSB3aXNoIHRvIGJlIGFibGUgdG8gcm9sbCBiYWNrIHRvXG4gICAqIHByZXZpb3VzIHZlcnNpb25zIG9mIHlvdXIgYXBwbGljYXRpb24gd2l0aG91dCBoYXZpbmcgdG8gZG8gYSBuZXdcbiAgICogYGNkayBzeW50aGAgYW5kIHJlLXVwbG9hZCBvZiBhc3NldHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRHVyYXRpb24uZGF5cygzMClcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveVRpbWVGaWxlQXNzZXRMaWZldGltZT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW1hZ2UgdmVyc2lvbnMgdG8gc3RvcmUgaW4gYSByZXBvc2l0b3J5LlxuICAgKlxuICAgKiBQcmV2aW91cyB2ZXJzaW9ucyBvZiBhbiBpbWFnZSBjYW4gYmUgc3RvcmVkIGZvciByb2xsYmFjayBwdXJwb3Nlcy5cbiAgICogT25jZSBhIHJlcG9zaXRvcnkgaGFzIG1vcmUgdGhhbiAzIGltYWdlIHZlcnNpb25zIHN0b3JlZCwgdGhlIG9sZGVzdFxuICAgKiB2ZXJzaW9uIHdpbGwgYmUgZGlzY2FyZGVkLiBUaGlzIGFsbG93cyBmb3Igc2Vuc2libGUgZ2FyYmFnZSBjb2xsZWN0aW9uXG4gICAqIHdoaWxlIG1haW50YWluaW5nIGEgZmV3IHByZXZpb3VzIHZlcnNpb25zIGZvciByb2xsYmFjayBzY2VuYXJpb3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXAgdG8gMyB2ZXJzaW9ucyBzdG9yZWRcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlQXNzZXRWZXJzaW9uQ291bnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRGVmYXVsdCBTdGFnaW5nIFN0YWNrIFByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0U3RhZ2luZ1N0YWNrUHJvcHMgZXh0ZW5kcyBEZWZhdWx0U3RhZ2luZ1N0YWNrT3B0aW9ucywgU3RhY2tQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBkZXBsb3kgYWN0aW9uIHJvbGUsIGlmIGdpdmVuXG4gICAqXG4gICAqIFRoaXMgcm9sZSB3aWxsIG5lZWQgcGVybWlzc2lvbnMgdG8gcmVhZCBmcm9tIHRvIHRoZSBzdGFnaW5nIHJlc291cmNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgQ0xJIGNyZWRlbnRpYWxzIGFyZSBhc3N1bWVkLCBubyBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFyZSBncmFudGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95Um9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHF1YWxpZmllciB1c2VkIHRvIHNwZWNpYWxpemUgc3RyaW5nc1xuICAgKlxuICAgKiBTaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IGJ1dCB3aG8ga25vd3Mgd2hhdCBwZW9wbGUgbWlnaHQgZG8uXG4gICAqL1xuICByZWFkb25seSBxdWFsaWZpZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGRlZmF1bHQgU3RhZ2luZyBTdGFjayB0aGF0IGltcGxlbWVudHMgSVN0YWdpbmdSZXNvdXJjZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRlZmF1bHRTdGFnaW5nU3RhY2sgPSBEZWZhdWx0U3RhZ2luZ1N0YWNrLmZhY3RvcnkoeyBhcHBJZDogJ215LWFwcC1pZCcgfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZhdWx0U3RhZ2luZ1N0YWNrIGV4dGVuZHMgU3RhY2sgaW1wbGVtZW50cyBJU3RhZ2luZ1Jlc291cmNlcyB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBmYWN0b3J5IHRoYXQgd2lsbCBjcmVhdGUgRGVmYXVsdFN0YWdpbmdTdGFja3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZmFjdG9yeShvcHRpb25zOiBEZWZhdWx0U3RhZ2luZ1N0YWNrT3B0aW9ucyk6IElTdGFnaW5nUmVzb3VyY2VzRmFjdG9yeSB7XG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpLnNsaWNlKDAsIDIwKTtcbiAgICByZXR1cm4ge1xuICAgICAgb2J0YWluU3RhZ2luZ1Jlc291cmNlcyhzdGFjaywgY29udGV4dCkge1xuICAgICAgICBjb25zdCBhcHAgPSBBcHAub2Yoc3RhY2spO1xuICAgICAgICBpZiAoIUFwcC5pc0FwcChhcHApKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGFjayAke3N0YWNrLnN0YWNrTmFtZX0gbXVzdCBiZSBwYXJ0IG9mIGFuIEFwcGApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhY2tJZCA9IGBTdGFnaW5nU3RhY2stJHthcHBJZH0tJHtjb250ZXh0LmVudmlyb25tZW50U3RyaW5nfWA7XG4gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFN0YWdpbmdTdGFjayhhcHAsIHN0YWNrSWQsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuXG4gICAgICAgICAgLy8gRG9lcyBub3QgbmVlZCB0byBjb250YWluIGVudmlyb25tZW50IGJlY2F1c2Ugc3RhY2sgbmFtZXMgYXJlIHVuaXF1ZSBpbnNpZGUgYW4gZW52IGFueXdheVxuICAgICAgICAgIHN0YWNrTmFtZTogYFN0YWdpbmdTdGFjay0ke2FwcElkfWAsXG4gICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICBhY2NvdW50OiBzdGFjay5hY2NvdW50LFxuICAgICAgICAgICAgcmVnaW9uOiBzdGFjay5yZWdpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcHBJZCxcbiAgICAgICAgICBxdWFsaWZpZXI6IGNvbnRleHQucXVhbGlmaWVyLFxuICAgICAgICAgIGRlcGxveVJvbGVBcm46IGNvbnRleHQuZGVwbG95Um9sZUFybixcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBhc3NldCBwdWJsaXNoaW5nIHJvbGUgbmFtZSBmb3IgZmlsZSAoUzMpIGFzc2V0cy5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGZpbGVSb2xlTmFtZSgpIHtcbiAgICAvLyBUaGlzIHJvbGUgbmFtZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGxldHRlcnMuIFRoZSByZWFzb24gd2h5XG4gICAgLy8gd2Ugc2xpY2UgdGhlIGFwcElkIGFuZCBub3QgdGhlIGVudGlyZSBuYW1lIGlzIGJlY2F1c2UgdGhpcy5yZWdpb25cbiAgICAvLyBjYW4gYmUgYSB0b2tlbiBhbmQgd2UgZG9uJ3Qgd2FudCB0byBhY2NpZGVudGFsbHkgY3V0IGl0IG9mZi5cbiAgICByZXR1cm4gYGNkay0ke3RoaXMuYXBwSWR9LWZpbGUtcm9sZS0ke3RoaXMucmVnaW9ufWA7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBhc3NldCBwdWJsaXNoaW5nIHJvbGUgbmFtZSBmb3IgZG9ja2VyIChFQ1IpIGFzc2V0cy5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGltYWdlUm9sZU5hbWUoKSB7XG4gICAgLy8gVGhpcyByb2xlIG5hbWUgY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBsZXR0ZXJzLiBUaGUgcmVhc29uIHdoeVxuICAgIC8vIHdlIHNsaWNlIHRoZSBhcHBJZCBhbmQgbm90IHRoZSBlbnRpcmUgbmFtZSBpcyBiZWNhdXNlIHRoaXMucmVnaW9uXG4gICAgLy8gY2FuIGJlIGEgdG9rZW4gYW5kIHdlIGRvbid0IHdhbnQgdG8gYWNjaWRlbnRhbGx5IGN1dCBpdCBvZmYuXG4gICAgcmV0dXJuIGBjZGstJHt0aGlzLmFwcElkfS1pbWFnZS1yb2xlLSR7dGhpcy5yZWdpb259YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXBwLXNjb3BlZCwgZXZpcm9ubWVudC1rZXllZCBzdGFnaW5nIGJ1Y2tldC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGFnaW5nQnVja2V0PzogczMuQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgYXBwLXNjb3BlZCwgZW52aXJvbm1lbnQta2V5ZWQgZWNyIHJlcG9zaXRvcmllcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBhcHAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhZ2luZ1JlcG9zOiBSZWNvcmQ8c3RyaW5nLCBlY3IuUmVwb3NpdG9yeT47XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0byBhZGQgZGVwZW5kZW5jaWVzIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlcGVuZGVuY3lTdGFjazogU3RhY2s7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWdpbmdCdWNrZXROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWxlIHB1Ymxpc2ggcm9sZSBBUk4gaW4gYXNzZXQgbWFuaWZlc3QgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVkRmlsZVJvbGU/OiBCb290c3RyYXBSb2xlO1xuICBwcml2YXRlIGZpbGVSb2xlPzogaWFtLklSb2xlO1xuICBwcml2YXRlIGZpbGVSb2xlTWFuaWZlc3RBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEltYWdlIHB1Ymxpc2hpbmcgcm9sZSBBUk4gaW4gYXNzZXQgbWFuaWZlc3QgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVkSW1hZ2VSb2xlPzogQm9vdHN0cmFwUm9sZTtcbiAgcHJpdmF0ZSBpbWFnZVJvbGU/OiBpYW0uSVJvbGU7XG4gIHByaXZhdGUgZGlkSW1hZ2VSb2xlID0gZmFsc2U7XG4gIHByaXZhdGUgaW1hZ2VSb2xlTWFuaWZlc3RBcm4/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXBsb3lSb2xlQXJuPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBBcHAsIGlkOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IERlZmF1bHRTdGFnaW5nU3RhY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBzeW50aGVzaXplcjogbmV3IEJvb3RzdHJhcGxlc3NTeW50aGVzaXplcigpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hcHBJZCA9IHRoaXMudmFsaWRhdGVBcHBJZChwcm9wcy5hcHBJZCk7XG4gICAgdGhpcy5kZXBlbmRlbmN5U3RhY2sgPSB0aGlzO1xuXG4gICAgdGhpcy5kZXBsb3lSb2xlQXJuID0gcHJvcHMuZGVwbG95Um9sZUFybjtcbiAgICB0aGlzLnN0YWdpbmdCdWNrZXROYW1lID0gcHJvcHMuc3RhZ2luZ0J1Y2tldE5hbWU7XG4gICAgY29uc3Qgc3BlY2lhbGl6ZXIgPSBuZXcgU3RyaW5nU3BlY2lhbGl6ZXIodGhpcywgcHJvcHMucXVhbGlmaWVyKTtcblxuICAgIHRoaXMucHJvdmlkZWRGaWxlUm9sZSA9IHByb3BzLmZpbGVBc3NldFB1Ymxpc2hpbmdSb2xlPy5fc3BlY2lhbGl6ZShzcGVjaWFsaXplcik7XG4gICAgdGhpcy5wcm92aWRlZEltYWdlUm9sZSA9IHByb3BzLmltYWdlQXNzZXRQdWJsaXNoaW5nUm9sZT8uX3NwZWNpYWxpemUoc3BlY2lhbGl6ZXIpO1xuICAgIHRoaXMuc3RhZ2luZ1JlcG9zID0ge307XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQXBwSWQoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIGlmIChpZC5sZW5ndGggPiAyMCkge1xuICAgICAgZXJyb3JzLnB1c2goYGFwcElkIGV4cGVjdGVkIG5vIG1vcmUgdGhhbiAyMCBjaGFyYWN0ZXJzIGJ1dCBnb3QgJHtpZC5sZW5ndGh9IGNoYXJhY3RlcnMuYCk7XG4gICAgfVxuICAgIGlmIChpZCAhPT0gaWQudG9Mb2NhbGVMb3dlckNhc2UoKSkge1xuICAgICAgZXJyb3JzLnB1c2goJ2FwcElkIG9ubHkgYWNjZXB0cyBsb3dlcmNhc2UgY2hhcmFjdGVycy4nKTtcbiAgICB9XG4gICAgaWYgKCEvXlthLXowLTktXSokLy50ZXN0KGlkKSkge1xuICAgICAgZXJyb3JzLnB1c2goJ2FwcElkIGV4cGVjdHMgb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgZGFzaGVzIChcXCctXFwnKScpO1xuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFtcbiAgICAgICAgYGFwcElkICR7aWR9IGhhcyBlcnJvcnM6YCxcbiAgICAgICAgLi4uZXJyb3JzLFxuICAgICAgXS5qb2luKCdcXG4nKSk7XG4gICAgfVxuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlRmlsZVJvbGUoKSB7XG4gICAgaWYgKHRoaXMucHJvdmlkZWRGaWxlUm9sZSkge1xuICAgICAgLy8gT3ZlcnJpZGVcbiAgICAgIHRoaXMuZmlsZVJvbGVNYW5pZmVzdEFybiA9IHRoaXMucHJvdmlkZWRGaWxlUm9sZS5fYXJuRm9yQ2xvdWRBc3NlbWJseSgpO1xuICAgICAgY29uc3QgY2ZuQXJuID0gdGhpcy5wcm92aWRlZEZpbGVSb2xlLl9hcm5Gb3JDbG91ZEZvcm1hdGlvbigpO1xuICAgICAgdGhpcy5maWxlUm9sZSA9IGNmbkFybiA/IGlhbS5Sb2xlLmZyb21Sb2xlQXJuKHRoaXMsICdDZGtGaWxlUm9sZScsIGNmbkFybikgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgcm9sZU5hbWUgPSB0aGlzLmZpbGVSb2xlTmFtZTtcbiAgICB0aGlzLmZpbGVSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdDZGtGaWxlUm9sZScsIHtcbiAgICAgIHJvbGVOYW1lLFxuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLkFjY291bnRQcmluY2lwYWwodGhpcy5hY2NvdW50KSxcbiAgICB9KTtcblxuICAgIHRoaXMuZmlsZVJvbGVNYW5pZmVzdEFybiA9IFN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICBwYXJ0aXRpb246ICcke0FXUzo6UGFydGl0aW9ufScsXG4gICAgICByZWdpb246ICcnLCAvLyBpYW0gaXMgZ2xvYmFsXG4gICAgICBzZXJ2aWNlOiAnaWFtJyxcbiAgICAgIHJlc291cmNlOiAncm9sZScsXG4gICAgICByZXNvdXJjZU5hbWU6IHJvbGVOYW1lLFxuICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlSW1hZ2VSb2xlKCkge1xuICAgIC8vIEl0IG1heSBlbmQgdXAgc2V0dGluZyBpbWFnZVJvbGUgdG8gdW5kZWZpbmVkLCBidXQgYXQgbGVhc3Qgd2UgdHJpZWRcbiAgICBpZiAodGhpcy5kaWRJbWFnZVJvbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaWRJbWFnZVJvbGUgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMucHJvdmlkZWRJbWFnZVJvbGUpIHtcbiAgICAgIC8vIE92ZXJyaWRlXG4gICAgICB0aGlzLmltYWdlUm9sZU1hbmlmZXN0QXJuID0gdGhpcy5wcm92aWRlZEltYWdlUm9sZS5fYXJuRm9yQ2xvdWRBc3NlbWJseSgpO1xuICAgICAgY29uc3QgY2ZuQXJuID0gdGhpcy5wcm92aWRlZEltYWdlUm9sZS5fYXJuRm9yQ2xvdWRGb3JtYXRpb24oKTtcbiAgICAgIHRoaXMuaW1hZ2VSb2xlID0gY2ZuQXJuID8gaWFtLlJvbGUuZnJvbVJvbGVBcm4odGhpcywgJ0Nka0ltYWdlUm9sZScsIGNmbkFybikgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgcm9sZU5hbWUgPSB0aGlzLmltYWdlUm9sZU5hbWU7XG4gICAgdGhpcy5pbWFnZVJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ0Nka0ltYWdlUm9sZScsIHtcbiAgICAgIHJvbGVOYW1lLFxuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLkFjY291bnRQcmluY2lwYWwodGhpcy5hY2NvdW50KSxcbiAgICB9KTtcbiAgICB0aGlzLmltYWdlUm9sZU1hbmlmZXN0QXJuID0gU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgIHBhcnRpdGlvbjogJyR7QVdTOjpQYXJ0aXRpb259JyxcbiAgICAgIHJlZ2lvbjogJycsIC8vIGlhbSBpcyBnbG9iYWxcbiAgICAgIHNlcnZpY2U6ICdpYW0nLFxuICAgICAgcmVzb3VyY2U6ICdyb2xlJyxcbiAgICAgIHJlc291cmNlTmFtZTogcm9sZU5hbWUsXG4gICAgICBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCdWNrZXRLZXkoKToga21zLklLZXkge1xuICAgIHJldHVybiBuZXcga21zLktleSh0aGlzLCAnQnVja2V0S2V5Jywge1xuICAgICAgYWxpYXM6IGBhbGlhcy9jZGstJHt0aGlzLmFwcElkfS1zdGFnaW5nYCxcbiAgICAgIGFkbWluczogW25ldyBpYW0uQWNjb3VudFByaW5jaXBhbCh0aGlzLmFjY291bnQpXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3JlYXRlQnVja2V0KCkge1xuICAgIGNvbnN0IHN0YWdpbmdCdWNrZXROYW1lID0gdGhpcy5zdGFnaW5nQnVja2V0TmFtZSA/PyBgY2RrLSR7dGhpcy5hcHBJZH0tc3RhZ2luZy0ke3RoaXMuYWNjb3VudH0tJHt0aGlzLnJlZ2lvbn1gO1xuICAgIGNvbnN0IGJ1Y2tldElkID0gJ0Nka1N0YWdpbmdCdWNrZXQnO1xuICAgIGNvbnN0IGNyZWF0ZWRCdWNrZXQgPSB0aGlzLm5vZGUudHJ5RmluZENoaWxkKGJ1Y2tldElkKSBhcyBzMy5CdWNrZXQ7XG4gICAgaWYgKGNyZWF0ZWRCdWNrZXQpIHtcbiAgICAgIHJldHVybiBzdGFnaW5nQnVja2V0TmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLmVuc3VyZUZpbGVSb2xlKCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5jcmVhdGVCdWNrZXRLZXkoKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgYnVja2V0IG9uY2UgdGhlIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gY3JlYXRlZFxuICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgYnVja2V0SWQsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHN0YWdpbmdCdWNrZXROYW1lLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICBlbmNyeXB0aW9uOiBzMy5CdWNrZXRFbmNyeXB0aW9uLktNUyxcbiAgICAgIGVuY3J5cHRpb25LZXk6IGtleSxcblxuICAgICAgLy8gTWFueSBBV1MgYWNjb3VudCBzYWZldHkgY2hlY2tlcnMgd2lsbCBjb21wbGFpbiB3aGVuIGJ1Y2tldHMgYXJlbid0IHZlcnNpb25lZFxuICAgICAgdmVyc2lvbmVkOiB0cnVlLFxuICAgICAgLy8gTWFueSBBV1MgYWNjb3VudCBzYWZldHkgY2hlY2tlcnMgd2lsbCBjb21wbGFpbiB3aGVuIFNTTCBpc24ndCBlbmZvcmNlZFxuICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmZpbGVSb2xlKSB7XG4gICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5maWxlUm9sZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVwbG95Um9sZUFybikge1xuICAgICAgYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ3MzOkdldE9iamVjdConLFxuICAgICAgICAgICdzMzpHZXRCdWNrZXQqJyxcbiAgICAgICAgICAnczM6TGlzdConLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtidWNrZXQuYnVja2V0QXJuLCBidWNrZXQuYXJuRm9yT2JqZWN0cygnKicpXSxcbiAgICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uQXJuUHJpbmNpcGFsKHRoaXMuZGVwbG95Um9sZUFybildLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIE9iamVjdHMgc2hvdWxkIG5ldmVyIGJlIG92ZXJ3cml0dGVuLCBidXQgbGV0J3MgbWFrZSBzdXJlIHdlIGhhdmUgYSBsaWZlY3ljbGUgcG9saWN5XG4gICAgLy8gZm9yIGl0IGFueXdheS5cbiAgICBidWNrZXQuYWRkTGlmZWN5Y2xlUnVsZSh7XG4gICAgICBub25jdXJyZW50VmVyc2lvbkV4cGlyYXRpb246IER1cmF0aW9uLmRheXMoMzY1KSxcbiAgICB9KTtcblxuICAgIGJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgIHByZWZpeDogREVQTE9ZX1RJTUVfUFJFRklYLFxuICAgICAgZXhwaXJhdGlvbjogdGhpcy5wcm9wcy5kZXBsb3lUaW1lRmlsZUFzc2V0TGlmZXRpbWUgPz8gRHVyYXRpb24uZGF5cygzMCksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RhZ2luZ0J1Y2tldE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgd2VsbC1rbm93biBuYW1lIG9mIHRoZSByZXBvXG4gICAqL1xuICBwcml2YXRlIGdldENyZWF0ZVJlcG8oYXNzZXQ6IERvY2tlckltYWdlQXNzZXRTb3VyY2UpOiBzdHJpbmcge1xuICAgIGlmICghYXNzZXQuYXNzZXROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fzc2V0cyBzeW50aGVzaXplZCB3aXRoIEFwcFNjb3BlZFN0YWdpbmdTeW50aGVzaXplciBtdXN0IGluY2x1ZGUgYW4gXFwnYXNzZXROYW1lXFwnIGluIHRoZSBhc3NldCBzb3VyY2UgZGVmaW5pdGlvbi4nKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgaW1hZ2UgcHVibGlzaGluZyByb2xlIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICB0aGlzLmVuc3VyZUltYWdlUm9sZSgpO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSBnZW5lcmF0ZVJlcG9OYW1lKGAke3RoaXMuYXBwSWR9LyR7YXNzZXQuYXNzZXROYW1lfWApO1xuICAgIGlmICh0aGlzLnN0YWdpbmdSZXBvc1thc3NldC5hc3NldE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhZ2luZ1JlcG9zW2Fzc2V0LmFzc2V0TmFtZV0gPSBuZXcgZWNyLlJlcG9zaXRvcnkodGhpcywgcmVwb05hbWUsIHtcbiAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHJlcG9OYW1lLFxuICAgICAgICBsaWZlY3ljbGVSdWxlczogW3tcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0dhcmJhZ2UgY29sbGVjdCBvbGQgaW1hZ2UgdmVyc2lvbnMgYW5kIGtlZXAgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbGF0ZXN0IHZlcnNpb25zJyxcbiAgICAgICAgICBtYXhJbWFnZUNvdW50OiB0aGlzLnByb3BzLmltYWdlQXNzZXRWZXJzaW9uQ291bnQgPz8gMyxcbiAgICAgICAgfV0sXG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLmltYWdlUm9sZSkge1xuICAgICAgICB0aGlzLnN0YWdpbmdSZXBvc1thc3NldC5hc3NldE5hbWVdLmdyYW50UHVsbFB1c2godGhpcy5pbWFnZVJvbGUpO1xuICAgICAgICB0aGlzLnN0YWdpbmdSZXBvc1thc3NldC5hc3NldE5hbWVdLmdyYW50UmVhZCh0aGlzLmltYWdlUm9sZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXBvTmFtZTtcblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlUmVwb05hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICctJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZEZpbGUoYXNzZXQ6IEZpbGVBc3NldFNvdXJjZSk6IEZpbGVTdGFnaW5nTG9jYXRpb24ge1xuICAgIC8vIEhhcyBzaWRlIGVmZmVjdHMgc28gbXVzdCBnbyBmaXJzdFxuICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSB0aGlzLmdldENyZWF0ZUJ1Y2tldCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICBhc3N1bWVSb2xlQXJuOiB0aGlzLmZpbGVSb2xlTWFuaWZlc3RBcm4sXG4gICAgICBwcmVmaXg6IGFzc2V0LmRlcGxveVRpbWUgPyBERVBMT1lfVElNRV9QUkVGSVggOiB1bmRlZmluZWQsXG4gICAgICBkZXBlbmRlbmN5U3RhY2s6IHRoaXMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhZGREb2NrZXJJbWFnZShhc3NldDogRG9ja2VySW1hZ2VBc3NldFNvdXJjZSk6IEltYWdlU3RhZ2luZ0xvY2F0aW9uIHtcbiAgICAvLyBIYXMgc2lkZSBlZmZlY3RzIHNvIG11c3QgZ28gZmlyc3RcbiAgICBjb25zdCByZXBvTmFtZSA9IHRoaXMuZ2V0Q3JlYXRlUmVwbyhhc3NldCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVwb05hbWUsXG4gICAgICBhc3N1bWVSb2xlQXJuOiB0aGlzLmltYWdlUm9sZU1hbmlmZXN0QXJuLFxuICAgICAgZGVwZW5kZW5jeVN0YWNrOiB0aGlzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3ludGhlc2l6ZXMgdGhlIGNsb3VkZm9ybWF0aW9uIHRlbXBsYXRlIGludG8gYSBjbG91ZCBhc3NlbWJseS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3N5bnRoZXNpemVUZW1wbGF0ZShzZXNzaW9uOiBJU3ludGhlc2lzU2Vzc2lvbiwgbG9va3VwUm9sZUFybj86IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHN1cGVyLl9zeW50aGVzaXplVGVtcGxhdGUoc2Vzc2lvbiwgbG9va3VwUm9sZUFybik7XG5cbiAgICBjb25zdCBidWlsZGVyID0gc2Vzc2lvbi5hc3NlbWJseTtcbiAgICBjb25zdCBvdXRQYXRoID0gcGF0aC5qb2luKGJ1aWxkZXIub3V0ZGlyLCB0aGlzLnRlbXBsYXRlRmlsZSk7XG4gICAgY29uc3Qgc2l6ZSA9IGZzLnN0YXRTeW5jKG91dFBhdGgpLnNpemU7XG4gICAgaWYgKHNpemUgPiA1MTIwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGFnaW5nIHJlc291cmNlIHRlbXBsYXRlIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gNTEyMDAgYnl0ZXMsIGJ1dCBnb3QgJHtzaXplfSBieXRlc2ApO1xuICAgIH1cbiAgfVxufVxuIl19
|
package/lib/index.d.ts
ADDED
package/lib/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./default-staging-stack"), exports);
|
|
18
|
+
__exportStar(require("./app-staging-synthesizer"), exports);
|
|
19
|
+
__exportStar(require("./bootstrap-roles"), exports);
|
|
20
|
+
__exportStar(require("./staging-stack"), exports);
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMERBQXdDO0FBQ3hDLDREQUEwQztBQUMxQyxvREFBa0M7QUFDbEMsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kZWZhdWx0LXN0YWdpbmctc3RhY2snO1xuZXhwb3J0ICogZnJvbSAnLi9hcHAtc3RhZ2luZy1zeW50aGVzaXplcic7XG5leHBvcnQgKiBmcm9tICcuL2Jvb3RzdHJhcC1yb2xlcyc7XG5leHBvcnQgKiBmcm9tICcuL3N0YWdpbmctc3RhY2snO1xuIl19
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Stack } from 'aws-cdk-lib';
|
|
2
|
+
import { IStagingResources, IStagingResourcesFactory, ObtainStagingResourcesContext } from './staging-stack';
|
|
3
|
+
/**
|
|
4
|
+
* Wraps another IStagingResources factory, and caches the result on a per-environment basis.
|
|
5
|
+
*/
|
|
6
|
+
export declare class PerEnvironmentStagingFactory implements IStagingResourcesFactory {
|
|
7
|
+
private readonly wrapped;
|
|
8
|
+
constructor(wrapped: IStagingResourcesFactory);
|
|
9
|
+
obtainStagingResources(stack: Stack, context: ObtainStagingResourcesContext): IStagingResources;
|
|
10
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PerEnvironmentStagingFactory = void 0;
|
|
4
|
+
const app_global_1 = require("./private/app-global");
|
|
5
|
+
/**
|
|
6
|
+
* Per-environment cache
|
|
7
|
+
*
|
|
8
|
+
* This is a global because we might have multiple instances of this class
|
|
9
|
+
* in the app, but we want to cache across all of them.
|
|
10
|
+
*/
|
|
11
|
+
const ENVIRONMENT_CACHE = new app_global_1.AppScopedGlobal(() => new Map());
|
|
12
|
+
/**
|
|
13
|
+
* Wraps another IStagingResources factory, and caches the result on a per-environment basis.
|
|
14
|
+
*/
|
|
15
|
+
class PerEnvironmentStagingFactory {
|
|
16
|
+
constructor(wrapped) {
|
|
17
|
+
this.wrapped = wrapped;
|
|
18
|
+
}
|
|
19
|
+
obtainStagingResources(stack, context) {
|
|
20
|
+
const cacheKey = context.environmentString;
|
|
21
|
+
const cache = ENVIRONMENT_CACHE.for(stack);
|
|
22
|
+
const existing = cache.get(cacheKey);
|
|
23
|
+
if (existing) {
|
|
24
|
+
return existing;
|
|
25
|
+
}
|
|
26
|
+
const result = this.wrapped.obtainStagingResources(stack, context);
|
|
27
|
+
cache.set(cacheKey, result);
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.PerEnvironmentStagingFactory = PerEnvironmentStagingFactory;
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyLWVudi1zdGFnaW5nLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwZXItZW52LXN0YWdpbmctZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBdUQ7QUFHdkQ7Ozs7O0dBS0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLElBQUksNEJBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBNkIsQ0FBQyxDQUFDO0FBRTFGOztHQUVHO0FBQ0gsTUFBYSw0QkFBNEI7SUFDdkMsWUFBNkIsT0FBaUM7UUFBakMsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7S0FBSztJQUU1RCxzQkFBc0IsQ0FBQyxLQUFZLEVBQUUsT0FBc0M7UUFDaEYsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBRTNDLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLElBQUksUUFBUSxFQUFFO1lBQ1osT0FBTyxRQUFRLENBQUM7U0FDakI7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuRSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1QixPQUFPLE1BQU0sQ0FBQztLQUNmO0NBQ0Y7QUFoQkQsb0VBZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBcHBTY29wZWRHbG9iYWwgfSBmcm9tICcuL3ByaXZhdGUvYXBwLWdsb2JhbCc7XG5pbXBvcnQgeyBJU3RhZ2luZ1Jlc291cmNlcywgSVN0YWdpbmdSZXNvdXJjZXNGYWN0b3J5LCBPYnRhaW5TdGFnaW5nUmVzb3VyY2VzQ29udGV4dCB9IGZyb20gJy4vc3RhZ2luZy1zdGFjayc7XG5cbi8qKlxuICogUGVyLWVudmlyb25tZW50IGNhY2hlXG4gKlxuICogVGhpcyBpcyBhIGdsb2JhbCBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3NcbiAqIGluIHRoZSBhcHAsIGJ1dCB3ZSB3YW50IHRvIGNhY2hlIGFjcm9zcyBhbGwgb2YgdGhlbS5cbiAqL1xuY29uc3QgRU5WSVJPTk1FTlRfQ0FDSEUgPSBuZXcgQXBwU2NvcGVkR2xvYmFsKCgpID0+IG5ldyBNYXA8c3RyaW5nLCBJU3RhZ2luZ1Jlc291cmNlcz4oKSk7XG5cbi8qKlxuICogV3JhcHMgYW5vdGhlciBJU3RhZ2luZ1Jlc291cmNlcyBmYWN0b3J5LCBhbmQgY2FjaGVzIHRoZSByZXN1bHQgb24gYSBwZXItZW52aXJvbm1lbnQgYmFzaXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQZXJFbnZpcm9ubWVudFN0YWdpbmdGYWN0b3J5IGltcGxlbWVudHMgSVN0YWdpbmdSZXNvdXJjZXNGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB3cmFwcGVkOiBJU3RhZ2luZ1Jlc291cmNlc0ZhY3RvcnkpIHsgfVxuXG4gIHB1YmxpYyBvYnRhaW5TdGFnaW5nUmVzb3VyY2VzKHN0YWNrOiBTdGFjaywgY29udGV4dDogT2J0YWluU3RhZ2luZ1Jlc291cmNlc0NvbnRleHQpOiBJU3RhZ2luZ1Jlc291cmNlcyB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBjb250ZXh0LmVudmlyb25tZW50U3RyaW5nO1xuXG4gICAgY29uc3QgY2FjaGUgPSBFTlZJUk9OTUVOVF9DQUNIRS5mb3Ioc3RhY2spO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gY2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLndyYXBwZWQub2J0YWluU3RhZ2luZ1Jlc291cmNlcyhzdGFjaywgY29udGV4dCk7XG4gICAgY2FjaGUuc2V0KGNhY2hlS2V5LCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IConstruct } from 'constructs';
|
|
2
|
+
/**
|
|
3
|
+
* Hold an App-wide global variable
|
|
4
|
+
*
|
|
5
|
+
* This is a replacement for a `static` variable, but does the right thing in case people
|
|
6
|
+
* instantiate multiple Apps in the same process space (for example, in unit tests or
|
|
7
|
+
* people using `cli-lib` in advanced configurations).
|
|
8
|
+
*
|
|
9
|
+
* This class assumes that the global you're going to be storing is a mutable object.
|
|
10
|
+
*/
|
|
11
|
+
export declare class AppScopedGlobal<A> {
|
|
12
|
+
private readonly factory;
|
|
13
|
+
private readonly map;
|
|
14
|
+
constructor(factory: () => A);
|
|
15
|
+
for(ctr: IConstruct): A;
|
|
16
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AppScopedGlobal = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
/**
|
|
6
|
+
* Hold an App-wide global variable
|
|
7
|
+
*
|
|
8
|
+
* This is a replacement for a `static` variable, but does the right thing in case people
|
|
9
|
+
* instantiate multiple Apps in the same process space (for example, in unit tests or
|
|
10
|
+
* people using `cli-lib` in advanced configurations).
|
|
11
|
+
*
|
|
12
|
+
* This class assumes that the global you're going to be storing is a mutable object.
|
|
13
|
+
*/
|
|
14
|
+
class AppScopedGlobal {
|
|
15
|
+
constructor(factory) {
|
|
16
|
+
this.factory = factory;
|
|
17
|
+
this.map = new WeakMap();
|
|
18
|
+
}
|
|
19
|
+
for(ctr) {
|
|
20
|
+
const app = aws_cdk_lib_1.App.of(ctr);
|
|
21
|
+
if (!aws_cdk_lib_1.App.isApp(app)) {
|
|
22
|
+
throw new Error(`Construct ${ctr.node.path} must be part of an App`);
|
|
23
|
+
}
|
|
24
|
+
const existing = this.map.get(app);
|
|
25
|
+
if (existing) {
|
|
26
|
+
return existing;
|
|
27
|
+
}
|
|
28
|
+
const instance = this.factory();
|
|
29
|
+
this.map.set(app, instance);
|
|
30
|
+
return instance;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.AppScopedGlobal = AppScopedGlobal;
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWdsb2JhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFwcC1nbG9iYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQWtDO0FBR2xDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBYSxlQUFlO0lBRzFCLFlBQTZCLE9BQWdCO1FBQWhCLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFGNUIsUUFBRyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7S0FHNUM7SUFFTSxHQUFHLENBQUMsR0FBZTtRQUN4QixNQUFNLEdBQUcsR0FBRyxpQkFBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsaUJBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSx5QkFBeUIsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxRQUFRLEVBQUU7WUFDWixPQUFPLFFBQVEsQ0FBQztTQUNqQjtRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUIsT0FBTyxRQUFRLENBQUM7S0FDakI7Q0FDRjtBQXBCRCwwQ0FvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHAgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogSG9sZCBhbiBBcHAtd2lkZSBnbG9iYWwgdmFyaWFibGVcbiAqXG4gKiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIGEgYHN0YXRpY2AgdmFyaWFibGUsIGJ1dCBkb2VzIHRoZSByaWdodCB0aGluZyBpbiBjYXNlIHBlb3BsZVxuICogaW5zdGFudGlhdGUgbXVsdGlwbGUgQXBwcyBpbiB0aGUgc2FtZSBwcm9jZXNzIHNwYWNlIChmb3IgZXhhbXBsZSwgaW4gdW5pdCB0ZXN0cyBvclxuICogcGVvcGxlIHVzaW5nIGBjbGktbGliYCBpbiBhZHZhbmNlZCBjb25maWd1cmF0aW9ucykuXG4gKlxuICogVGhpcyBjbGFzcyBhc3N1bWVzIHRoYXQgdGhlIGdsb2JhbCB5b3UncmUgZ29pbmcgdG8gYmUgc3RvcmluZyBpcyBhIG11dGFibGUgb2JqZWN0LlxuICovXG5leHBvcnQgY2xhc3MgQXBwU2NvcGVkR2xvYmFsPEE+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgV2Vha01hcDxBcHAsIEE+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBmYWN0b3J5OiAoKSA9PiBBKSB7XG4gIH1cblxuICBwdWJsaWMgZm9yKGN0cjogSUNvbnN0cnVjdCk6IEEge1xuICAgIGNvbnN0IGFwcCA9IEFwcC5vZihjdHIpO1xuICAgIGlmICghQXBwLmlzQXBwKGFwcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29uc3RydWN0ICR7Y3RyLm5vZGUucGF0aH0gbXVzdCBiZSBwYXJ0IG9mIGFuIEFwcGApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5tYXAuZ2V0KGFwcCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5mYWN0b3J5KCk7XG4gICAgdGhpcy5tYXAuc2V0KGFwcCwgaW5zdGFuY2UpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function validateNoTokens<A extends object>(props: A, context: string): void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateNoTokens = void 0;
|
|
4
|
+
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
5
|
+
function validateNoTokens(props, context) {
|
|
6
|
+
for (const [key, value] of Object.entries(props)) {
|
|
7
|
+
if (typeof value === 'string') {
|
|
8
|
+
helpers_internal_1.StringSpecializer.validateNoTokens(value, `${context} property '${key}'`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.validateNoTokens = validateNoTokens;
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibm8tdG9rZW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDRFQUEwRTtBQUUxRSxTQUFnQixnQkFBZ0IsQ0FBbUIsS0FBUSxFQUFFLE9BQWU7SUFDMUUsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDaEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0Isb0NBQWlCLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEdBQUcsT0FBTyxjQUFjLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDM0U7S0FDRjtBQUNILENBQUM7QUFORCw0Q0FNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0cmluZ1NwZWNpYWxpemVyIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU5vVG9rZW5zPEEgZXh0ZW5kcyBvYmplY3Q+KHByb3BzOiBBLCBjb250ZXh0OiBzdHJpbmcpIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIFN0cmluZ1NwZWNpYWxpemVyLnZhbGlkYXRlTm9Ub2tlbnModmFsdWUsIGAke2NvbnRleHR9IHByb3BlcnR5ICcke2tleX0nYCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { DockerImageAssetSource, FileAssetSource, Stack } from 'aws-cdk-lib';
|
|
2
|
+
import { IConstruct } from 'constructs';
|
|
3
|
+
/**
|
|
4
|
+
* Information returned by the Staging Stack for each file asset.
|
|
5
|
+
*/
|
|
6
|
+
export interface FileStagingLocation {
|
|
7
|
+
/**
|
|
8
|
+
* The name of the staging bucket
|
|
9
|
+
*/
|
|
10
|
+
readonly bucketName: string;
|
|
11
|
+
/**
|
|
12
|
+
* A prefix to add to the keys
|
|
13
|
+
*
|
|
14
|
+
* @default ''
|
|
15
|
+
*/
|
|
16
|
+
readonly prefix?: string;
|
|
17
|
+
/**
|
|
18
|
+
* The ARN to assume to write files to this bucket
|
|
19
|
+
*
|
|
20
|
+
* @default - Don't assume a role
|
|
21
|
+
*/
|
|
22
|
+
readonly assumeRoleArn?: string;
|
|
23
|
+
/**
|
|
24
|
+
* The stack that creates this bucket (leads to dependencies on it)
|
|
25
|
+
*
|
|
26
|
+
* @default - Don't add dependencies
|
|
27
|
+
*/
|
|
28
|
+
readonly dependencyStack?: Stack;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Information returned by the Staging Stack for each image asset
|
|
32
|
+
*/
|
|
33
|
+
export interface ImageStagingLocation {
|
|
34
|
+
/**
|
|
35
|
+
* The name of the staging repository
|
|
36
|
+
*/
|
|
37
|
+
readonly repoName: string;
|
|
38
|
+
/**
|
|
39
|
+
* The arn to assume to write files to this repository
|
|
40
|
+
*
|
|
41
|
+
* @default - Don't assume a role
|
|
42
|
+
*/
|
|
43
|
+
readonly assumeRoleArn?: string;
|
|
44
|
+
/**
|
|
45
|
+
* The stack that creates this repository (leads to dependencies on it)
|
|
46
|
+
*
|
|
47
|
+
* @default - Don't add dependencies
|
|
48
|
+
*/
|
|
49
|
+
readonly dependencyStack?: Stack;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Staging Resource interface.
|
|
53
|
+
*/
|
|
54
|
+
export interface IStagingResources extends IConstruct {
|
|
55
|
+
/**
|
|
56
|
+
* Return staging resource information for a file asset.
|
|
57
|
+
*/
|
|
58
|
+
addFile(asset: FileAssetSource): FileStagingLocation;
|
|
59
|
+
/**
|
|
60
|
+
* Return staging resource information for a docker asset.
|
|
61
|
+
*/
|
|
62
|
+
addDockerImage(asset: DockerImageAssetSource): ImageStagingLocation;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Staging Resource Factory interface.
|
|
66
|
+
*
|
|
67
|
+
* The function included in this class will be called by the synthesizer
|
|
68
|
+
* to create or reference an IStagingResources construct that has the necessary
|
|
69
|
+
* staging resources for the stack.
|
|
70
|
+
*/
|
|
71
|
+
export interface IStagingResourcesFactory {
|
|
72
|
+
/**
|
|
73
|
+
* Return an object that will manage staging resources for the given stack
|
|
74
|
+
*
|
|
75
|
+
* This is called whenever the the `AppStagingSynthesizer` binds to a specific
|
|
76
|
+
* stack, and allows selecting where the staging resources go.
|
|
77
|
+
*
|
|
78
|
+
* This method can choose to either create a new construct (perhaps a stack)
|
|
79
|
+
* and return it, or reference an existing construct.
|
|
80
|
+
*
|
|
81
|
+
* @param stack - stack to return an appropriate IStagingStack for
|
|
82
|
+
*/
|
|
83
|
+
obtainStagingResources(stack: Stack, context: ObtainStagingResourcesContext): IStagingResources;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Context parameters for the 'obtainStagingResources' function
|
|
87
|
+
*/
|
|
88
|
+
export interface ObtainStagingResourcesContext {
|
|
89
|
+
/**
|
|
90
|
+
* A unique string describing the environment that is guaranteed not to have tokens in it
|
|
91
|
+
*/
|
|
92
|
+
readonly environmentString: string;
|
|
93
|
+
/**
|
|
94
|
+
* The ARN of the deploy action role, if given
|
|
95
|
+
*
|
|
96
|
+
* This role will need permissions to read from to the staging resources.
|
|
97
|
+
*
|
|
98
|
+
* @default - Deploy role ARN is unknown
|
|
99
|
+
*/
|
|
100
|
+
readonly deployRoleArn?: string;
|
|
101
|
+
/**
|
|
102
|
+
* The qualifier passed to the synthesizer
|
|
103
|
+
*
|
|
104
|
+
* The staging stack shouldn't need this, but it might.
|
|
105
|
+
*/
|
|
106
|
+
readonly qualifier: string;
|
|
107
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhZ2luZy1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0YWdpbmctc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERvY2tlckltYWdlQXNzZXRTb3VyY2UsIEZpbGVBc3NldFNvdXJjZSwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogSW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgdGhlIFN0YWdpbmcgU3RhY2sgZm9yIGVhY2ggZmlsZSBhc3NldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlU3RhZ2luZ0xvY2F0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzdGFnaW5nIGJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHByZWZpeCB0byBhZGQgdG8gdGhlIGtleXNcbiAgICpcbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiB0byBhc3N1bWUgdG8gd3JpdGUgZmlsZXMgdG8gdGhpcyBidWNrZXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBEb24ndCBhc3N1bWUgYSByb2xlXG4gICAqL1xuICByZWFkb25seSBhc3N1bWVSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdGhhdCBjcmVhdGVzIHRoaXMgYnVja2V0IChsZWFkcyB0byBkZXBlbmRlbmNpZXMgb24gaXQpXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRG9uJ3QgYWRkIGRlcGVuZGVuY2llc1xuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jeVN0YWNrPzogU3RhY2s7XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgdGhlIFN0YWdpbmcgU3RhY2sgZm9yIGVhY2ggaW1hZ2UgYXNzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZVN0YWdpbmdMb2NhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc3RhZ2luZyByZXBvc2l0b3J5XG4gICAqL1xuICByZWFkb25seSByZXBvTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJuIHRvIGFzc3VtZSB0byB3cml0ZSBmaWxlcyB0byB0aGlzIHJlcG9zaXRvcnlcbiAgICpcbiAgICogQGRlZmF1bHQgLSBEb24ndCBhc3N1bWUgYSByb2xlXG4gICAqL1xuICByZWFkb25seSBhc3N1bWVSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdGhhdCBjcmVhdGVzIHRoaXMgcmVwb3NpdG9yeSAobGVhZHMgdG8gZGVwZW5kZW5jaWVzIG9uIGl0KVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIERvbid0IGFkZCBkZXBlbmRlbmNpZXNcbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY3lTdGFjaz86IFN0YWNrO1xufVxuXG4vKipcbiAqIFN0YWdpbmcgUmVzb3VyY2UgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTdGFnaW5nUmVzb3VyY2VzIGV4dGVuZHMgSUNvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBSZXR1cm4gc3RhZ2luZyByZXNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgYSBmaWxlIGFzc2V0LlxuICAgKi9cbiAgYWRkRmlsZShhc3NldDogRmlsZUFzc2V0U291cmNlKTogRmlsZVN0YWdpbmdMb2NhdGlvbjtcblxuICAvKipcbiAgICogUmV0dXJuIHN0YWdpbmcgcmVzb3VyY2UgaW5mb3JtYXRpb24gZm9yIGEgZG9ja2VyIGFzc2V0LlxuICAgKi9cbiAgYWRkRG9ja2VySW1hZ2UoYXNzZXQ6IERvY2tlckltYWdlQXNzZXRTb3VyY2UpOiBJbWFnZVN0YWdpbmdMb2NhdGlvbjtcbn1cblxuLyoqXG4gKiBTdGFnaW5nIFJlc291cmNlIEZhY3RvcnkgaW50ZXJmYWNlLlxuICpcbiAqIFRoZSBmdW5jdGlvbiBpbmNsdWRlZCBpbiB0aGlzIGNsYXNzIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBzeW50aGVzaXplclxuICogdG8gY3JlYXRlIG9yIHJlZmVyZW5jZSBhbiBJU3RhZ2luZ1Jlc291cmNlcyBjb25zdHJ1Y3QgdGhhdCBoYXMgdGhlIG5lY2Vzc2FyeVxuICogc3RhZ2luZyByZXNvdXJjZXMgZm9yIHRoZSBzdGFjay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3RhZ2luZ1Jlc291cmNlc0ZhY3Rvcnkge1xuICAvKipcbiAgICogUmV0dXJuIGFuIG9iamVjdCB0aGF0IHdpbGwgbWFuYWdlIHN0YWdpbmcgcmVzb3VyY2VzIGZvciB0aGUgZ2l2ZW4gc3RhY2tcbiAgICpcbiAgICogVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHRoZSBgQXBwU3RhZ2luZ1N5bnRoZXNpemVyYCBiaW5kcyB0byBhIHNwZWNpZmljXG4gICAqIHN0YWNrLCBhbmQgYWxsb3dzIHNlbGVjdGluZyB3aGVyZSB0aGUgc3RhZ2luZyByZXNvdXJjZXMgZ28uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBjaG9vc2UgdG8gZWl0aGVyIGNyZWF0ZSBhIG5ldyBjb25zdHJ1Y3QgKHBlcmhhcHMgYSBzdGFjaylcbiAgICogYW5kIHJldHVybiBpdCwgb3IgcmVmZXJlbmNlIGFuIGV4aXN0aW5nIGNvbnN0cnVjdC5cbiAgICpcbiAgICogQHBhcmFtIHN0YWNrIC0gc3RhY2sgdG8gcmV0dXJuIGFuIGFwcHJvcHJpYXRlIElTdGFnaW5nU3RhY2sgZm9yXG4gICAqL1xuICBvYnRhaW5TdGFnaW5nUmVzb3VyY2VzKHN0YWNrOiBTdGFjaywgY29udGV4dDogT2J0YWluU3RhZ2luZ1Jlc291cmNlc0NvbnRleHQpOiBJU3RhZ2luZ1Jlc291cmNlcztcbn1cblxuLyoqXG4gKiBDb250ZXh0IHBhcmFtZXRlcnMgZm9yIHRoZSAnb2J0YWluU3RhZ2luZ1Jlc291cmNlcycgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnRhaW5TdGFnaW5nUmVzb3VyY2VzQ29udGV4dCB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZW52aXJvbm1lbnQgdGhhdCBpcyBndWFyYW50ZWVkIG5vdCB0byBoYXZlIHRva2VucyBpbiBpdFxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnRTdHJpbmc6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgZGVwbG95IGFjdGlvbiByb2xlLCBpZiBnaXZlblxuICAgKlxuICAgKiBUaGlzIHJvbGUgd2lsbCBuZWVkIHBlcm1pc3Npb25zIHRvIHJlYWQgZnJvbSB0byB0aGUgc3RhZ2luZyByZXNvdXJjZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRGVwbG95IHJvbGUgQVJOIGlzIHVua25vd25cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveVJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBxdWFsaWZpZXIgcGFzc2VkIHRvIHRoZSBzeW50aGVzaXplclxuICAgKlxuICAgKiBUaGUgc3RhZ2luZyBzdGFjayBzaG91bGRuJ3QgbmVlZCB0aGlzLCBidXQgaXQgbWlnaHQuXG4gICAqL1xuICByZWFkb25seSBxdWFsaWZpZXI6IHN0cmluZztcbn1cbiJdfQ==
|