@pwrdrvr/microapps-cdk 0.0.28 → 0.0.29
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 +1884 -185
- package/API.md +890 -60
- package/README.md +2 -8
- package/lib/MicroApps.d.ts +77 -44
- package/lib/MicroApps.js +62 -33
- package/lib/MicroAppsAPIGwy.d.ts +123 -0
- package/lib/MicroAppsAPIGwy.js +178 -0
- package/lib/MicroAppsCF.d.ts +179 -17
- package/lib/MicroAppsCF.js +127 -45
- package/lib/MicroAppsS3.d.ts +114 -17
- package/lib/MicroAppsS3.js +55 -31
- package/lib/MicroAppsSvcs.d.ts +123 -25
- package/lib/MicroAppsSvcs.js +113 -152
- package/lib/index.d.ts +4 -0
- package/lib/index.js +5 -1
- package/lib/microapps-deployer/index.js +116 -88
- package/lib/microapps-deployer/index.js.map +3 -3
- package/lib/microapps-router/index.js +60 -51
- package/lib/microapps-router/index.js.map +3 -3
- package/lib/utils/ReverseDomain.d.ts +4 -0
- package/lib/utils/ReverseDomain.js +15 -0
- package/package.json +45 -45
package/lib/MicroAppsSvcs.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var _a;
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
4
|
exports.MicroAppsSvcs = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
4
6
|
const fs_1 = require("fs");
|
|
5
7
|
const path = require("path");
|
|
6
8
|
const apigwy = require("@aws-cdk/aws-apigatewayv2");
|
|
@@ -10,20 +12,24 @@ const iam = require("@aws-cdk/aws-iam");
|
|
|
10
12
|
const lambda = require("@aws-cdk/aws-lambda");
|
|
11
13
|
const lambdaNodejs = require("@aws-cdk/aws-lambda-nodejs");
|
|
12
14
|
const logs = require("@aws-cdk/aws-logs");
|
|
13
|
-
const r53 = require("@aws-cdk/aws-route53");
|
|
14
|
-
const r53targets = require("@aws-cdk/aws-route53-targets");
|
|
15
15
|
const s3 = require("@aws-cdk/aws-s3");
|
|
16
16
|
const cdk = require("@aws-cdk/core");
|
|
17
|
+
/**
|
|
18
|
+
* @stability stable
|
|
19
|
+
*/
|
|
17
20
|
class MicroAppsSvcs extends cdk.Construct {
|
|
21
|
+
/**
|
|
22
|
+
* MicroApps - Create Lambda resources, DynamoDB, and grant S3 privs.
|
|
23
|
+
*
|
|
24
|
+
* @stability stable
|
|
25
|
+
*/
|
|
18
26
|
constructor(scope, id, props) {
|
|
19
|
-
var
|
|
27
|
+
var _b;
|
|
20
28
|
super(scope, id);
|
|
21
29
|
if (props === undefined) {
|
|
22
30
|
throw new Error('props cannot be undefined');
|
|
23
31
|
}
|
|
24
|
-
const { bucketApps,
|
|
25
|
-
const { r53ZoneID, r53ZoneName, s3PolicyBypassAROAs = [], s3PolicyBypassPrincipalARNs = [], s3StrictBucketPolicy = false, autoDeleteEverything, appEnv, domainNameEdge, domainNameOrigin, certOrigin, account, region, assetNameRoot, assetNameSuffix, } = props;
|
|
26
|
-
const apigatewayName = `${assetNameRoot}${assetNameSuffix}`;
|
|
32
|
+
const { bucketApps, bucketAppsOAI, bucketAppsStaging, s3PolicyBypassAROAs = [], s3PolicyBypassPrincipalARNs = [], s3StrictBucketPolicy = false, appEnv, httpApi, removalPolicy, assetNameRoot, assetNameSuffix, rootPathPrefix = '', } = props;
|
|
27
33
|
if (s3StrictBucketPolicy === true) {
|
|
28
34
|
if (s3PolicyBypassAROAs.length === 0 && s3PolicyBypassPrincipalARNs.length === 0) {
|
|
29
35
|
throw new Error('s3StrictBucketPolicy cannot be true without specifying at least one s3PolicyBypassAROAs or s3PolicyBypassPrincipalARNs');
|
|
@@ -32,8 +38,8 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
32
38
|
//
|
|
33
39
|
// DynamoDB Table
|
|
34
40
|
//
|
|
35
|
-
|
|
36
|
-
tableName: `${assetNameRoot}${assetNameSuffix}
|
|
41
|
+
this._table = new dynamodb.Table(this, 'table', {
|
|
42
|
+
tableName: assetNameRoot ? `${assetNameRoot}${assetNameSuffix}` : undefined,
|
|
37
43
|
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
|
|
38
44
|
partitionKey: {
|
|
39
45
|
name: 'PK',
|
|
@@ -43,53 +49,51 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
43
49
|
name: 'SK',
|
|
44
50
|
type: dynamodb.AttributeType.STRING,
|
|
45
51
|
},
|
|
52
|
+
removalPolicy,
|
|
46
53
|
});
|
|
47
|
-
if (autoDeleteEverything) {
|
|
48
|
-
table.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
49
|
-
}
|
|
50
54
|
//
|
|
51
55
|
// Router Lambda Function
|
|
52
56
|
//
|
|
53
57
|
// Create Router Lambda Function
|
|
54
58
|
let routerFunc;
|
|
55
59
|
const routerFuncProps = {
|
|
56
|
-
functionName: `${assetNameRoot}-router${assetNameSuffix}
|
|
60
|
+
functionName: assetNameRoot ? `${assetNameRoot}-router${assetNameSuffix}` : undefined,
|
|
57
61
|
memorySize: 1769,
|
|
58
62
|
logRetention: logs.RetentionDays.ONE_MONTH,
|
|
59
63
|
runtime: lambda.Runtime.NODEJS_14_X,
|
|
60
64
|
timeout: cdk.Duration.seconds(15),
|
|
61
65
|
environment: {
|
|
62
66
|
NODE_ENV: appEnv,
|
|
63
|
-
DATABASE_TABLE_NAME:
|
|
67
|
+
DATABASE_TABLE_NAME: this._table.tableName,
|
|
64
68
|
AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
|
|
69
|
+
ROOT_PATH_PREFIX: rootPathPrefix,
|
|
65
70
|
},
|
|
66
71
|
};
|
|
67
|
-
if (
|
|
72
|
+
if (process.env.NODE_ENV === 'test' &&
|
|
73
|
+
fs_1.existsSync(path.join(__dirname, '..', '..', 'microapps-router', 'dist', 'index.js'))) {
|
|
68
74
|
// This is for local dev
|
|
69
|
-
routerFunc = new lambda.Function(this, '
|
|
70
|
-
code: lambda.Code.fromAsset(
|
|
75
|
+
routerFunc = new lambda.Function(this, 'router-func', {
|
|
76
|
+
code: lambda.Code.fromAsset(path.join(__dirname, '..', '..', 'microapps-router', 'dist')),
|
|
71
77
|
handler: 'index.handler',
|
|
72
78
|
...routerFuncProps,
|
|
73
79
|
});
|
|
74
80
|
}
|
|
75
|
-
else if (fs_1.existsSync(
|
|
81
|
+
else if (fs_1.existsSync(path.join(__dirname, 'microapps-router', 'index.js'))) {
|
|
76
82
|
// This is for built apps packaged with the CDK construct
|
|
77
|
-
routerFunc = new lambda.Function(this, '
|
|
78
|
-
code: lambda.Code.fromAsset(
|
|
83
|
+
routerFunc = new lambda.Function(this, 'router-func', {
|
|
84
|
+
code: lambda.Code.fromAsset(path.join(__dirname, 'microapps-router')),
|
|
79
85
|
handler: 'index.handler',
|
|
80
86
|
...routerFuncProps,
|
|
81
87
|
});
|
|
82
88
|
}
|
|
83
89
|
else {
|
|
84
90
|
// Create Router Lambda Layer
|
|
85
|
-
const routerDataFiles = new lambda.LayerVersion(this, '
|
|
86
|
-
code: lambda.Code.fromAsset('
|
|
91
|
+
const routerDataFiles = new lambda.LayerVersion(this, 'router-templates', {
|
|
92
|
+
code: lambda.Code.fromAsset(path.join(__dirname, '..', '..', 'microapps-router', 'templates')),
|
|
93
|
+
removalPolicy,
|
|
87
94
|
});
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
routerFunc = new lambdaNodejs.NodejsFunction(this, 'microapps-router-func', {
|
|
92
|
-
entry: './packages/microapps-router/src/index.ts',
|
|
95
|
+
routerFunc = new lambdaNodejs.NodejsFunction(this, 'router-func', {
|
|
96
|
+
entry: path.join(__dirname, '..', '..', 'microapps-router', 'src', 'index.ts'),
|
|
93
97
|
handler: 'handler',
|
|
94
98
|
bundling: {
|
|
95
99
|
minify: true,
|
|
@@ -99,8 +103,8 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
99
103
|
...routerFuncProps,
|
|
100
104
|
});
|
|
101
105
|
}
|
|
102
|
-
if (
|
|
103
|
-
routerFunc.applyRemovalPolicy(
|
|
106
|
+
if (removalPolicy !== undefined) {
|
|
107
|
+
routerFunc.applyRemovalPolicy(removalPolicy);
|
|
104
108
|
}
|
|
105
109
|
const policyReadTarget = new iam.PolicyStatement({
|
|
106
110
|
effect: iam.Effect.ALLOW,
|
|
@@ -110,74 +114,19 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
110
114
|
for (const router of [routerFunc]) {
|
|
111
115
|
router.addToRolePolicy(policyReadTarget);
|
|
112
116
|
// Give the Router access to DynamoDB table
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
// TODO: Add Last Route for /*/{proxy+}
|
|
117
|
-
// Note: That might not work, may need a Behavior in CloudFront
|
|
118
|
-
// or a Lambda @ Edge function that detects these and routes
|
|
119
|
-
// to origin Lambda Router function.
|
|
120
|
-
//
|
|
121
|
-
// APIGateway domain names for CloudFront and origin
|
|
122
|
-
//
|
|
123
|
-
// Create Custom Domains for API Gateway
|
|
124
|
-
const dnAppsEdge = new apigwy.DomainName(this, 'microapps-apps-edge-dn', {
|
|
125
|
-
domainName: domainNameEdge,
|
|
126
|
-
certificate: certOrigin,
|
|
127
|
-
});
|
|
128
|
-
if (autoDeleteEverything) {
|
|
129
|
-
dnAppsEdge.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
130
|
-
}
|
|
131
|
-
this._dnAppsOrigin = new apigwy.DomainName(this, 'microapps-apps-origin-dn', {
|
|
132
|
-
domainName: domainNameOrigin,
|
|
133
|
-
certificate: certOrigin,
|
|
134
|
-
});
|
|
135
|
-
if (autoDeleteEverything) {
|
|
136
|
-
this._dnAppsOrigin.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
137
|
-
}
|
|
138
|
-
// Create an integration for the Router
|
|
139
|
-
// Do this here since it's the default route
|
|
140
|
-
const intRouter = new apigwyint.LambdaProxyIntegration({
|
|
141
|
-
handler: routerFunc,
|
|
142
|
-
});
|
|
143
|
-
// Create APIGateway for the Edge name
|
|
144
|
-
const httpApiDomainMapping = {
|
|
145
|
-
domainName: dnAppsEdge,
|
|
146
|
-
};
|
|
147
|
-
const httpApi = new apigwy.HttpApi(this, 'microapps-api', {
|
|
148
|
-
defaultDomainMapping: httpApiDomainMapping,
|
|
149
|
-
defaultIntegration: intRouter,
|
|
150
|
-
apiName: apigatewayName,
|
|
151
|
-
});
|
|
152
|
-
if (autoDeleteEverything) {
|
|
153
|
-
httpApi.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
154
|
-
}
|
|
155
|
-
// Add default route on API Gateway to point to the router
|
|
156
|
-
// httpApi.addRoutes({
|
|
157
|
-
// path: '$default',
|
|
158
|
-
// integration: intRouter,
|
|
159
|
-
// });
|
|
160
|
-
//
|
|
161
|
-
// Let API Gateway accept requests using domainNameOrigin
|
|
162
|
-
// That is the origin URI that CloudFront uses for this gateway.
|
|
163
|
-
// The gateway will refuse the traffic if it doesn't have the
|
|
164
|
-
// domain name registered.
|
|
165
|
-
//
|
|
166
|
-
const mappingAppsApis = new apigwy.ApiMapping(this, 'microapps-api-mapping-origin', {
|
|
167
|
-
api: httpApi,
|
|
168
|
-
domainName: this.dnAppsOrigin,
|
|
169
|
-
});
|
|
170
|
-
mappingAppsApis.node.addDependency(this.dnAppsOrigin);
|
|
171
|
-
if (autoDeleteEverything) {
|
|
172
|
-
mappingAppsApis.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
117
|
+
this._table.grantReadData(router);
|
|
118
|
+
this._table.grant(router, 'dynamodb:DescribeTable');
|
|
173
119
|
}
|
|
174
120
|
//
|
|
175
121
|
// Deployer Lambda Function
|
|
176
122
|
//
|
|
177
123
|
// Create Deployer Lambda Function
|
|
178
|
-
const iamRoleUploadName =
|
|
179
|
-
|
|
180
|
-
|
|
124
|
+
const iamRoleUploadName = assetNameRoot
|
|
125
|
+
? `${assetNameRoot}-deployer-upload${assetNameSuffix}`
|
|
126
|
+
: undefined;
|
|
127
|
+
const deployerFuncName = assetNameRoot
|
|
128
|
+
? `${assetNameRoot}-deployer${assetNameSuffix}`
|
|
129
|
+
: undefined;
|
|
181
130
|
const deployerFuncProps = {
|
|
182
131
|
functionName: deployerFuncName,
|
|
183
132
|
memorySize: 1769,
|
|
@@ -187,32 +136,33 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
187
136
|
environment: {
|
|
188
137
|
NODE_ENV: appEnv,
|
|
189
138
|
APIGWY_ID: httpApi.httpApiId,
|
|
190
|
-
DATABASE_TABLE_NAME:
|
|
191
|
-
FILESTORE_STAGING_BUCKET:
|
|
192
|
-
FILESTORE_DEST_BUCKET:
|
|
193
|
-
UPLOAD_ROLE_NAME: iamRoleUploadName,
|
|
139
|
+
DATABASE_TABLE_NAME: this._table.tableName,
|
|
140
|
+
FILESTORE_STAGING_BUCKET: bucketAppsStaging.bucketName,
|
|
141
|
+
FILESTORE_DEST_BUCKET: bucketApps.bucketName,
|
|
194
142
|
AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
|
|
143
|
+
ROOT_PATH_PREFIX: rootPathPrefix,
|
|
195
144
|
},
|
|
196
145
|
};
|
|
197
|
-
if (
|
|
146
|
+
if (process.env.NODE_ENV === 'test' &&
|
|
147
|
+
fs_1.existsSync(path.join(__dirname, '..', '..', 'microapps-deployer', 'dist', 'index.js'))) {
|
|
198
148
|
// This is for local dev
|
|
199
|
-
|
|
200
|
-
code: lambda.Code.fromAsset(
|
|
149
|
+
this._deployerFunc = new lambda.Function(this, 'deployer-func', {
|
|
150
|
+
code: lambda.Code.fromAsset(path.join(__dirname, '..', '..', 'microapps-deployer', 'dist')),
|
|
201
151
|
handler: 'index.handler',
|
|
202
152
|
...deployerFuncProps,
|
|
203
153
|
});
|
|
204
154
|
}
|
|
205
|
-
else if (fs_1.existsSync(
|
|
155
|
+
else if (fs_1.existsSync(path.join(__dirname, 'microapps-deployer', 'index.js'))) {
|
|
206
156
|
// This is for built apps packaged with the CDK construct
|
|
207
|
-
|
|
208
|
-
code: lambda.Code.fromAsset(
|
|
157
|
+
this._deployerFunc = new lambda.Function(this, 'deployer-func', {
|
|
158
|
+
code: lambda.Code.fromAsset(path.join(__dirname, 'microapps-deployer')),
|
|
209
159
|
handler: 'index.handler',
|
|
210
160
|
...deployerFuncProps,
|
|
211
161
|
});
|
|
212
162
|
}
|
|
213
163
|
else {
|
|
214
|
-
|
|
215
|
-
entry: '
|
|
164
|
+
this._deployerFunc = new lambdaNodejs.NodejsFunction(this, 'deployer-func', {
|
|
165
|
+
entry: path.join(__dirname, '..', '..', 'microapps-deployer', 'src', 'index.ts'),
|
|
216
166
|
handler: 'handler',
|
|
217
167
|
bundling: {
|
|
218
168
|
minify: true,
|
|
@@ -221,18 +171,18 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
221
171
|
...deployerFuncProps,
|
|
222
172
|
});
|
|
223
173
|
}
|
|
224
|
-
if (
|
|
225
|
-
|
|
174
|
+
if (removalPolicy !== undefined) {
|
|
175
|
+
this._deployerFunc.applyRemovalPolicy(removalPolicy);
|
|
226
176
|
}
|
|
227
177
|
// Give the Deployer access to DynamoDB table
|
|
228
|
-
|
|
229
|
-
|
|
178
|
+
this._table.grantReadWriteData(this._deployerFunc);
|
|
179
|
+
this._table.grant(this._deployerFunc, 'dynamodb:DescribeTable');
|
|
230
180
|
//
|
|
231
181
|
// Deloyer upload temp role
|
|
232
182
|
// Deployer assumes this role with a limited policy to generate
|
|
233
183
|
// an STS temp token to return to microapps-publish for the upload.
|
|
234
184
|
//
|
|
235
|
-
const iamRoleUpload = new iam.Role(this, '
|
|
185
|
+
const iamRoleUpload = new iam.Role(this, 'deployer-upload-role', {
|
|
236
186
|
roleName: iamRoleUploadName,
|
|
237
187
|
inlinePolicies: {
|
|
238
188
|
uploadPolicy: new iam.PolicyDocument({
|
|
@@ -248,8 +198,9 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
248
198
|
],
|
|
249
199
|
}),
|
|
250
200
|
},
|
|
251
|
-
assumedBy:
|
|
201
|
+
assumedBy: this._deployerFunc.grantPrincipal,
|
|
252
202
|
});
|
|
203
|
+
this._deployerFunc.addEnvironment('UPLOAD_ROLE_NAME', iamRoleUpload.roleName);
|
|
253
204
|
//
|
|
254
205
|
// Update S3 permissions
|
|
255
206
|
//
|
|
@@ -274,7 +225,7 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
274
225
|
new iam.CanonicalUserPrincipal(bucketAppsOAI.cloudFrontOriginAccessIdentityS3CanonicalUserId),
|
|
275
226
|
new iam.AccountRootPrincipal(),
|
|
276
227
|
...s3PolicyBypassArnPrincipals,
|
|
277
|
-
|
|
228
|
+
this._deployerFunc.grantPrincipal,
|
|
278
229
|
],
|
|
279
230
|
notResources: [
|
|
280
231
|
`${bucketApps.bucketArn}/\${aws:PrincipalTag/microapp-name}/*`,
|
|
@@ -284,10 +235,10 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
284
235
|
Null: { 'aws:PrincipalTag/microapp-name': 'false' },
|
|
285
236
|
},
|
|
286
237
|
});
|
|
287
|
-
if (
|
|
238
|
+
if (removalPolicy !== undefined) {
|
|
288
239
|
policyDenyPrefixOutsideTag.addCondition(
|
|
289
240
|
// Allows the DeletableBucket Lambda to delete items in the buckets
|
|
290
|
-
'StringNotLike', { 'aws:PrincipalTag/application': `${
|
|
241
|
+
'StringNotLike', { 'aws:PrincipalTag/application': `${cdk.Stack.of(this).stackName}-core*` });
|
|
291
242
|
}
|
|
292
243
|
const policyDenyMissingTag = new iam.PolicyStatement({
|
|
293
244
|
sid: 'deny-missing-microapp-name-tag',
|
|
@@ -297,10 +248,10 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
297
248
|
new iam.CanonicalUserPrincipal(bucketAppsOAI.cloudFrontOriginAccessIdentityS3CanonicalUserId),
|
|
298
249
|
new iam.AccountRootPrincipal(),
|
|
299
250
|
// Exclude the Deployer Function directly
|
|
300
|
-
|
|
251
|
+
this._deployerFunc.grantPrincipal,
|
|
301
252
|
// 2021-12-04 - Not 100% sure that this is actually needed...
|
|
302
253
|
// Let's test this and remove if actually not necessary
|
|
303
|
-
new iam.ArnPrincipal(`arn:aws:sts::${
|
|
254
|
+
new iam.ArnPrincipal(`arn:aws:sts::${cdk.Aws.ACCOUNT_ID}:assumed-role/${(_b = this._deployerFunc.role) === null || _b === void 0 ? void 0 : _b.roleName}/${this._deployerFunc.functionName}`),
|
|
304
255
|
...s3PolicyBypassArnPrincipals,
|
|
305
256
|
],
|
|
306
257
|
resources: [`${bucketApps.bucketArn}/*`, bucketApps.bucketArn],
|
|
@@ -325,25 +276,25 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
325
276
|
// To get the AROA with the AWS CLI:
|
|
326
277
|
// aws iam get-role --role-name ROLE-NAME
|
|
327
278
|
// aws iam get-user -–user-name USER-NAME
|
|
328
|
-
StringNotLike: { 'aws:userid': [
|
|
279
|
+
StringNotLike: { 'aws:userid': [cdk.Aws.ACCOUNT_ID, ...s3PolicyBypassAROAMatches] },
|
|
329
280
|
},
|
|
330
281
|
});
|
|
331
|
-
if (
|
|
282
|
+
if (removalPolicy !== undefined) {
|
|
332
283
|
policyDenyMissingTag.addCondition(
|
|
333
284
|
// Allows the DeletableBucket Lambda to delete items in the buckets
|
|
334
|
-
'StringNotLike', { 'aws:PrincipalTag/application': `${
|
|
285
|
+
'StringNotLike', { 'aws:PrincipalTag/application': `${cdk.Stack.of(this).stackName}-core*` });
|
|
335
286
|
}
|
|
336
287
|
const policyCloudFrontAccess = new iam.PolicyStatement({
|
|
337
288
|
sid: 'cloudfront-oai-access',
|
|
338
289
|
effect: iam.Effect.ALLOW,
|
|
339
|
-
actions: ['s3:GetObject'],
|
|
290
|
+
actions: ['s3:GetObject', 's3:ListBucket'],
|
|
340
291
|
principals: [
|
|
341
292
|
new iam.CanonicalUserPrincipal(bucketAppsOAI.cloudFrontOriginAccessIdentityS3CanonicalUserId),
|
|
342
293
|
],
|
|
343
|
-
resources: [`${bucketApps.bucketArn}
|
|
294
|
+
resources: [`${bucketApps.bucketArn}/*`, bucketApps.bucketArn],
|
|
344
295
|
});
|
|
345
296
|
if (bucketApps.policy === undefined) {
|
|
346
|
-
const document = new s3.BucketPolicy(this, '
|
|
297
|
+
const document = new s3.BucketPolicy(this, 's3-policy', {
|
|
347
298
|
bucket: bucketApps,
|
|
348
299
|
}).document;
|
|
349
300
|
document.addStatements(policyCloudFrontAccess);
|
|
@@ -366,28 +317,28 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
366
317
|
actions: ['s3:DeleteObject', 's3:GetObject', 's3:ListBucket'],
|
|
367
318
|
resources: [`${bucketAppsStaging.bucketArn}/*`, bucketAppsStaging.bucketArn],
|
|
368
319
|
});
|
|
369
|
-
|
|
370
|
-
// Allow the Lambda to write to the target bucket
|
|
320
|
+
this._deployerFunc.addToRolePolicy(policyReadListStaging);
|
|
321
|
+
// Allow the Lambda to write to the target bucket and delete
|
|
371
322
|
const policyReadWriteListTarget = new iam.PolicyStatement({
|
|
372
323
|
effect: iam.Effect.ALLOW,
|
|
373
|
-
actions: ['s3:GetObject', 's3:PutObject', 's3:ListBucket'],
|
|
324
|
+
actions: ['s3:DeleteObject', 's3:GetObject', 's3:PutObject', 's3:ListBucket'],
|
|
374
325
|
resources: [`${bucketApps.bucketArn}/*`, bucketApps.bucketArn],
|
|
375
326
|
});
|
|
376
|
-
|
|
327
|
+
this._deployerFunc.addToRolePolicy(policyReadWriteListTarget);
|
|
377
328
|
// Allow the deployer to get a temporary STS token
|
|
378
329
|
const policyGetSTSToken = new iam.PolicyStatement({
|
|
379
330
|
effect: iam.Effect.ALLOW,
|
|
380
331
|
actions: ['sts:GetFederationToken'],
|
|
381
332
|
resources: ['*'],
|
|
382
333
|
});
|
|
383
|
-
|
|
334
|
+
this._deployerFunc.addToRolePolicy(policyGetSTSToken);
|
|
384
335
|
// Allow the deployer to assume the upload role
|
|
385
336
|
const policyAssumeUpload = new iam.PolicyStatement({
|
|
386
337
|
effect: iam.Effect.ALLOW,
|
|
387
338
|
actions: ['sts:AssumeRole'],
|
|
388
339
|
resources: [iamRoleUpload.roleArn],
|
|
389
340
|
});
|
|
390
|
-
|
|
341
|
+
this._deployerFunc.addToRolePolicy(policyAssumeUpload);
|
|
391
342
|
//
|
|
392
343
|
// Give Deployer permissions to create routes and integrations
|
|
393
344
|
// on the API Gateway API.
|
|
@@ -396,52 +347,62 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
396
347
|
const policyAPIList = new iam.PolicyStatement({
|
|
397
348
|
effect: iam.Effect.ALLOW,
|
|
398
349
|
actions: ['apigateway:GET'],
|
|
399
|
-
resources: [`arn:aws:apigateway:${
|
|
350
|
+
resources: [`arn:aws:apigateway:${cdk.Aws.REGION}::/apis`],
|
|
400
351
|
});
|
|
401
|
-
|
|
352
|
+
this._deployerFunc.addToRolePolicy(policyAPIList);
|
|
402
353
|
// Grant full control over the API we created
|
|
403
354
|
const policyAPIManage = new iam.PolicyStatement({
|
|
404
355
|
effect: iam.Effect.ALLOW,
|
|
405
356
|
actions: ['apigateway:*'],
|
|
406
357
|
resources: [
|
|
407
|
-
`arn:aws:apigateway:${
|
|
408
|
-
`arn:aws:apigateway:${
|
|
409
|
-
`arn:aws:apigateway:${
|
|
358
|
+
`arn:aws:apigateway:${cdk.Aws.REGION}:${cdk.Aws.ACCOUNT_ID}:${httpApi.httpApiId}/*`,
|
|
359
|
+
`arn:aws:apigateway:${cdk.Aws.REGION}::/apis/${httpApi.httpApiId}/integrations/*`,
|
|
360
|
+
`arn:aws:apigateway:${cdk.Aws.REGION}::/apis/${httpApi.httpApiId}/integrations`,
|
|
361
|
+
`arn:aws:apigateway:${cdk.Aws.REGION}::/apis/${httpApi.httpApiId}/routes`,
|
|
362
|
+
`arn:aws:apigateway:${cdk.Aws.REGION}::/apis/${httpApi.httpApiId}/routes/*`,
|
|
410
363
|
],
|
|
411
364
|
});
|
|
412
|
-
|
|
365
|
+
this._deployerFunc.addToRolePolicy(policyAPIManage);
|
|
413
366
|
// Grant full control over lambdas that indicate they are microapps
|
|
414
367
|
const policyAPIManageLambdas = new iam.PolicyStatement({
|
|
415
368
|
effect: iam.Effect.ALLOW,
|
|
416
369
|
actions: ['lambda:*'],
|
|
417
370
|
resources: [
|
|
418
|
-
`arn:aws:lambda:${
|
|
419
|
-
`arn:aws:lambda:${
|
|
371
|
+
`arn:aws:lambda:${cdk.Aws.REGION}:${cdk.Aws.ACCOUNT_ID}:function:*`,
|
|
372
|
+
`arn:aws:lambda:${cdk.Aws.REGION}:${cdk.Aws.ACCOUNT_ID}:function:*:*`,
|
|
420
373
|
],
|
|
421
374
|
conditions: {
|
|
422
375
|
StringEqualsIfExists: { 'aws:ResourceTag/microapp-managed': 'true' },
|
|
423
376
|
},
|
|
424
377
|
});
|
|
425
|
-
|
|
426
|
-
//
|
|
427
|
-
//
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
const rrAppsOrigin = new r53.ARecord(this, 'microapps-origin-arecord', {
|
|
434
|
-
zone: zone,
|
|
435
|
-
recordName: domainNameOrigin,
|
|
436
|
-
target: r53.RecordTarget.fromAlias(new r53targets.ApiGatewayv2DomainProperties(this._dnAppsOrigin.regionalDomainName, this._dnAppsOrigin.regionalHostedZoneId)),
|
|
378
|
+
this._deployerFunc.addToRolePolicy(policyAPIManageLambdas);
|
|
379
|
+
// Create an integration for the Router
|
|
380
|
+
// All traffic without another route goes to the Router
|
|
381
|
+
const intRouter = new apigwyint.HttpLambdaIntegration('router-integration', routerFunc);
|
|
382
|
+
new apigwy.HttpRoute(this, 'route-default', {
|
|
383
|
+
httpApi,
|
|
384
|
+
routeKey: apigwy.HttpRouteKey.DEFAULT,
|
|
385
|
+
integration: intRouter,
|
|
437
386
|
});
|
|
438
|
-
if (autoDeleteEverything) {
|
|
439
|
-
rrAppsOrigin.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
440
|
-
}
|
|
441
387
|
}
|
|
442
|
-
|
|
443
|
-
|
|
388
|
+
/**
|
|
389
|
+
* DynamoDB table used by Router, Deployer, and Release console app.
|
|
390
|
+
*
|
|
391
|
+
* @stability stable
|
|
392
|
+
*/
|
|
393
|
+
get table() {
|
|
394
|
+
return this._table;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Lambda function for the Deployer.
|
|
398
|
+
*
|
|
399
|
+
* @stability stable
|
|
400
|
+
*/
|
|
401
|
+
get deployerFunc() {
|
|
402
|
+
return this._deployerFunc;
|
|
444
403
|
}
|
|
445
404
|
}
|
|
446
405
|
exports.MicroAppsSvcs = MicroAppsSvcs;
|
|
447
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzU3Zjcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9NaWNyb0FwcHNTdmNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJCQUFnQztBQUNoQyw2QkFBNkI7QUFDN0Isb0RBQW9EO0FBQ3BELG9FQUFvRTtBQUVwRSxrREFBa0Q7QUFDbEQsd0NBQXdDO0FBQ3hDLDhDQUE4QztBQUM5QywyREFBMkQ7QUFDM0QsMENBQTBDO0FBQzFDLDRDQUE0QztBQUM1QywyREFBMkQ7QUFDM0Qsc0NBQXNDO0FBQ3RDLHFDQUFxQztBQW1DckMsTUFBYSxhQUFjLFNBQVEsR0FBRyxDQUFDLFNBQVM7SUFNOUMsWUFBWSxLQUFvQixFQUFFLEVBQVUsRUFBRSxLQUErQjs7UUFDM0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLEdBQzNGLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDbEIsTUFBTSxFQUNKLFNBQVMsRUFDVCxXQUFXLEVBQ1gsbUJBQW1CLEdBQUcsRUFBRSxFQUN4QiwyQkFBMkIsR0FBRyxFQUFFLEVBQ2hDLG9CQUFvQixHQUFHLEtBQUssRUFDNUIsb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixPQUFPLEVBQ1AsTUFBTSxFQUNOLGFBQWEsRUFDYixlQUFlLEdBQ2hCLEdBQUcsS0FBSyxDQUFDO1FBRVYsTUFBTSxjQUFjLEdBQUcsR0FBRyxhQUFhLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFFNUQsSUFBSSxvQkFBb0IsS0FBSyxJQUFJLEVBQUU7WUFDakMsSUFBSSxtQkFBbUIsQ0FB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QUFPLGFBQWE7Z0JBQ2hELGtCQUFrQixNQUFNLElBQUksT0FBTyxlQUFlO2FBQ25EO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLG9CQUFvQixFQUFFLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxFQUFFO2FBQ3JFO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsWUFBWSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRXJELEVBQUU7UUFDRix5Q0FBeUM7UUFDekMsRUFBRTtRQUVGLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzNFLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxTQUFTO1NBQ3hCLENBQUMsQ0FBQztRQUVILE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLEVBQUU7WUFDckUsSUFBSSxFQUFFLElBQUk7WUFDVixVQUFVLEVBQUUsZ0JBQWdCO1lBQzVCLE1BQU0sRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FDaEMsSUFBSSxVQUFVLENBQUMsNEJBQTRCLENBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQ3hDLENBQ0Y7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFJLG9CQUFvQixFQUFFO1lBQ3hCLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzVEO0lBQ0gsQ0FBQztJQXhlRCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7Q0F1ZUY7QUEzZUQsc0NBMmVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBhcGlnd3kgZnJvbSAnQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mic7XG5pbXBvcnQgKiBhcyBhcGlnd3lpbnQgZnJvbSAnQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1pbnRlZ3JhdGlvbnMnO1xuaW1wb3J0ICogYXMgYWNtIGZyb20gJ0Bhd3MtY2RrL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXInO1xuaW1wb3J0ICogYXMgZHluYW1vZGIgZnJvbSAnQGF3cy1jZGsvYXdzLWR5bmFtb2RiJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdAYXdzLWNkay9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdAYXdzLWNkay9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGxhbWJkYU5vZGVqcyBmcm9tICdAYXdzLWNkay9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ0Bhd3MtY2RrL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIHI1MyBmcm9tICdAYXdzLWNkay9hd3Mtcm91dGU1Myc7XG5pbXBvcnQgKiBhcyByNTN0YXJnZXRzIGZyb20gJ0Bhd3MtY2RrL2F3cy1yb3V0ZTUzLXRhcmdldHMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnQGF3cy1jZGsvYXdzLXMzJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdAYXdzLWNkay9jb3JlJztcbmltcG9ydCB7IElNaWNyb0FwcHNDRkV4cG9ydHMgfSBmcm9tICcuL01pY3JvQXBwc0NGJztcbmltcG9ydCB7IElNaWNyb0FwcHNTM0V4cG9ydHMgfSBmcm9tICcuL01pY3JvQXBwc1MzJztcblxuaW50ZXJmYWNlIE1pY3JvQXBwc1N2Y3NTdGFja1Byb3BzIGV4dGVuZHMgY2RrLlJlc291cmNlUHJvcHMge1xuICByZWFkb25seSBjZlN0YWNrRXhwb3J0czogSU1pY3JvQXBwc0NGRXhwb3J0cztcbiAgcmVhZG9ubHkgczNFeHBvcnRzOiBJTWljcm9BcHBzUzNFeHBvcnRzO1xuXG4gIHJlYWRvbmx5IGFwcEVudjogc3RyaW5nO1xuICByZWFkb25seSBhdXRvRGVsZXRlRXZlcnl0aGluZzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmV2ZXJzZURvbWFpbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkb21haW5OYW1lRWRnZTogc3RyaW5nO1xuICByZWFkb25seSBkb21haW5OYW1lT3JpZ2luOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgYXNzZXROYW1lUm9vdDogc3RyaW5nO1xuICByZWFkb25seSBhc3NldE5hbWVTdWZmaXg6IHN0cmluZztcblxuICByZWFkb25seSBjZXJ0T3JpZ2luOiBhY20uSUNlcnRpZmljYXRlO1xuXG4gIHJlYWRvbmx5IHI1M1pvbmVOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHI1M1pvbmVJRDogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHMzU3RyaWN0QnVja2V0UG9saWN5PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgczNQb2xpY3lCeXBhc3NBUk9Bcz86IHN0cmluZ1tdO1xuICByZWFkb25seSBzM1BvbGljeUJ5cGFzc1ByaW5jaXBhbEFSTnM/OiBzdHJpbmdbXTtcblxuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNaWNyb0FwcHNTdmNzRXhwb3J0cyB7XG4gIHJlYWRvbmx5IGRuQXBwc09yaWdpbjogYXBpZ3d5LkRvbWFpbk5hbWU7XG59XG5cbmV4cG9ydCBjbGFzcyBNaWNyb0FwcHNTdmNzIGV4dGVuZHMgY2RrLkNvbnN0cnVjdCBpbXBsZW1lbnRzIElNaWNyb0FwcHNTdmNzRXhwb3J0cyB7XG4gIHByaXZhdGUgX2RuQXBwc09yaWdpbjogYXBpZ3d5LkRvbWFpbk5hbWU7XG4gIHB1YmxpYyBnZXQgZG5BcHBzT3JpZ2luKCk6IGFwaWd3eS5Eb21haW5OYW1lIHtcbiAgICByZXR1cm4gdGhpcy5fZG5BcHBzT3JpZ2luO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNkay5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogTWljcm9BcHBzU3Zjc1N0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKHByb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJvcHMgY2Fubm90IGJlIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYnVja2V0QXBwcywgYnVja2V0QXBwc05hbWUsIGJ1Y2tldEFwcHNPQUksIGJ1Y2tldEFwcHNTdGFnaW5nLCBidWNrZXRBcHBzU3RhZ2luZ05hbWUgfSA9XG4gICAgICBwcm9wcy5zM0V4cG9ydHM7XG4gICAgY29uc3Qge1xuICAgICAgcjUzWm9uZUlELFxuICAgICAgcjUzWm9uZU5hbWUsXG4gICAgICBzM1BvbGljeUJ5cGFzc0FST0FzID0gW10sXG4gICAgICBzM1BvbGljeUJ5cGFzc1ByaW5jaXBhbEFSTnMgPSBbXSxcbiAgICAgIHMzU3RyaWN0QnVja2V0UG9saWN5ID0gZmFsc2UsXG4gICAgICBhdXRvRGVsZXRlRXZlcnl0aGluZyxcbiAgICAgIGFwcEVudixcbiAgICAgIGRvbWFpbk5hbWVFZGdlLFxuICAgICAgZG9tYWluTmFtZU9yaWdpbixcbiAgICAgIGNlcnRPcmlnaW4sXG4gICAgICBhY2NvdW50LFxuICAgICAgcmVnaW9uLFxuICAgICAgYXNzZXROYW1lUm9vdCxcbiAgICAgIGFzc2V0TmFtZVN1ZmZpeCxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBhcGlnYXRld2F5TmFtZSA9IGAke2Fzc2V0TmFtZVJvb3R9JHthc3NldE5hbWVTdWZmaXh9YDtcblxuICAgIGlmIChzM1N0cmljdEJ1Y2tldFBvbGljeSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHMzUG9saWN5QnlwYXNzQVJPQXMubGVuZ3RoID09PSAwICYmIHMzUG9saWN5QnlwYXNzUHJpbmNpcGFsQVJOcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdzM1N0cmljdEJ1Y2tldFBvbGljeSBjYW5ub3QgYmUgdHJ1ZSB3aXRob3V0IHNwZWNpZnlpbmcgYXQgbGVhc3Qgb25lIHMzUG9saWN5QnlwYXNzQVJPQXMgb3IgczNQb2xpY3lCeXBhc3NQcmluY2lwYWxBUk5zJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIER5bmFtb0RCIFRhYmxlXG4gICAgLy9cbiAgICBjb25zdCB0YWJsZSA9IG5ldyBkeW5hbW9kYi5UYWJsZSh0aGlzLCAnbWljcm9hcHBzLXJvdXRlci10YWJsZScsIHtcbiAgICAgIHRhYmxlTmFtZTogYCR7YXNzZXROYW1lUm9vdH0ke2Fzc2V0TmFtZVN1ZmZpeH1gLFxuICAgICAgYmlsbGluZ01vZGU6IGR5bmFtb2RiLkJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCxcbiAgICAgIHBhcnRpdGlvbktleToge1xuICAgICAgICBuYW1lOiAnUEsnLFxuICAgICAgICB0eXBlOiBkeW5hbW9kYi5BdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgIH0sXG4gICAgICBzb3J0S2V5OiB7XG4gICAgICAgIG5hbWU6ICdTSycsXG4gICAgICAgIHR5cGU6IGR5bmFtb2RiLkF0dHJpYnV0ZVR5cGUuU1RSSU5HLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAoYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcpIHtcbiAgICAgIHRhYmxlLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJvdXRlciBMYW1iZGEgRnVuY3Rpb25cbiAgICAvL1xuXG4gICAgLy8gQ3JlYXRlIFJvdXRlciBMYW1iZGEgRnVuY3Rpb25cbiAgICBsZXQgcm91dGVyRnVuYzogbGFtYmRhLkZ1bmN0aW9uO1xuICAgIGNvbnN0IHJvdXRlckZ1bmNQcm9wczogT21pdDxsYW1iZGEuRnVuY3Rpb25Qcm9wcywgJ2hhbmRsZXInIHwgJ2NvZGUnPiA9IHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYCR7YXNzZXROYW1lUm9vdH0tcm91dGVyJHthc3NldE5hbWVTdWZmaXh9YCxcbiAgICAgIG1lbW9yeVNpemU6IDE3NjksXG4gICAgICBsb2dSZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTRfWCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDE1KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIE5PREVfRU5WOiBhcHBFbnYsXG4gICAgICAgIERBVEFCQVNFX1RBQkxFX05BTUU6IHRhYmxlLnRhYmxlTmFtZSxcbiAgICAgICAgQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQ6ICcxJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoZXhpc3RzU3luYyhgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vLi4vZGlzdC9taWNyb2FwcHMtcm91dGVyL2luZGV4LmpzYCkpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yIGxvY2FsIGRldlxuICAgICAgcm91dGVyRnVuYyA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ21pY3JvYXBwcy1yb3V0ZXItZnVuYycsIHtcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KGAke3BhdGgucmVzb2x2ZShfX2Rpcm5hbWUpfS8uLi9kaXN0L21pY3JvYXBwcy1yb3V0ZXIvYCksXG4gICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgLi4ucm91dGVyRnVuY1Byb3BzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChleGlzdHNTeW5jKGAke3BhdGgucmVzb2x2ZShfX2Rpcm5hbWUpfS9taWNyb2FwcHMtcm91dGVyL2luZGV4LmpzYCkpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yIGJ1aWx0IGFwcHMgcGFja2FnZWQgd2l0aCB0aGUgQ0RLIGNvbnN0cnVjdFxuICAgICAgcm91dGVyRnVuYyA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ21pY3JvYXBwcy1yb3V0ZXItZnVuYycsIHtcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KGAke3BhdGgucmVzb2x2ZShfX2Rpcm5hbWUpfS9taWNyb2FwcHMtcm91dGVyL2ApLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIC4uLnJvdXRlckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgUm91dGVyIExhbWJkYSBMYXllclxuICAgICAgY29uc3Qgcm91dGVyRGF0YUZpbGVzID0gbmV3IGxhbWJkYS5MYXllclZlcnNpb24odGhpcywgJ21pY3JvYXBwcy1yb3V0ZXItbGF5ZXInLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldCgnLi9wYWNrYWdlcy9taWNyb2FwcHMtcm91dGVyL3RlbXBsYXRlcy8nKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICAgIHJvdXRlckRhdGFGaWxlcy5hcHBseVJlbW92YWxQb2xpY3koY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG4gICAgICB9XG5cbiAgICAgIHJvdXRlckZ1bmMgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsICdtaWNyb2FwcHMtcm91dGVyLWZ1bmMnLCB7XG4gICAgICAgIGVudHJ5OiAnLi9wYWNrYWdlcy9taWNyb2FwcHMtcm91dGVyL3NyYy9pbmRleC50cycsXG4gICAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgICAgc291cmNlTWFwOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBsYXllcnM6IFtyb3V0ZXJEYXRhRmlsZXNdLFxuICAgICAgICAuLi5yb3V0ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICByb3V0ZXJGdW5jLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gICAgY29uc3QgcG9saWN5UmVhZFRhcmdldCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0J10sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzLmJ1Y2tldEFybn0vKmBdLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgcm91dGVyIG9mIFtyb3V0ZXJGdW5jXSkge1xuICAgICAgcm91dGVyLmFkZFRvUm9sZVBvbGljeShwb2xpY3lSZWFkVGFyZ2V0KTtcbiAgICAgIC8vIEdpdmUgdGhlIFJvdXRlciBhY2Nlc3MgdG8gRHluYW1vREIgdGFibGVcbiAgICAgIHRhYmxlLmdyYW50UmVhZERhdGEocm91dGVyKTtcbiAgICAgIHRhYmxlLmdyYW50KHJvdXRlciwgJ2R5bmFtb2RiOkRlc2NyaWJlVGFibGUnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBBZGQgTGFzdCBSb3V0ZSBmb3IgLyove3Byb3h5K31cbiAgICAvLyBOb3RlOiBUaGF0IG1pZ2h0IG5vdCB3b3JrLCBtYXkgbmVlZCBhIEJlaGF2aW9yIGluIENsb3VkRnJvbnRcbiAgICAvLyAgICAgICBvciBhIExhbWJkYSBAIEVkZ2UgZnVuY3Rpb24gdGhhdCBkZXRlY3RzIHRoZXNlIGFuZCByb3V0ZXNcbiAgICAvLyAgICAgICB0byBvcmlnaW4gTGFtYmRhIFJvdXRlciBmdW5jdGlvbi5cblxuICAgIC8vXG4gICAgLy8gQVBJR2F0ZXdheSBkb21haW4gbmFtZXMgZm9yIENsb3VkRnJvbnQgYW5kIG9yaWdpblxuICAgIC8vXG5cbiAgICAvLyBDcmVhdGUgQ3VzdG9tIERvbWFpbnMgZm9yIEFQSSBHYXRld2F5XG4gICAgY29uc3QgZG5BcHBzRWRnZSA9IG5ldyBhcGlnd3kuRG9tYWluTmFtZSh0aGlzLCAnbWljcm9hcHBzLWFwcHMtZWRnZS1kbicsIHtcbiAgICAgIGRvbWFpbk5hbWU6IGRvbWFpbk5hbWVFZGdlLFxuICAgICAgY2VydGlmaWNhdGU6IGNlcnRPcmlnaW4sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBkbkFwcHNFZGdlLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gICAgdGhpcy5fZG5BcHBzT3JpZ2luID0gbmV3IGFwaWd3eS5Eb21haW5OYW1lKHRoaXMsICdtaWNyb2FwcHMtYXBwcy1vcmlnaW4tZG4nLCB7XG4gICAgICBkb21haW5OYW1lOiBkb21haW5OYW1lT3JpZ2luLFxuICAgICAgY2VydGlmaWNhdGU6IGNlcnRPcmlnaW4sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICB0aGlzLl9kbkFwcHNPcmlnaW4uYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbiBpbnRlZ3JhdGlvbiBmb3IgdGhlIFJvdXRlclxuICAgIC8vIERvIHRoaXMgaGVyZSBzaW5jZSBpdCdzIHRoZSBkZWZhdWx0IHJvdXRlXG4gICAgY29uc3QgaW50Um91dGVyID0gbmV3IGFwaWd3eWludC5MYW1iZGFQcm94eUludGVncmF0aW9uKHtcbiAgICAgIGhhbmRsZXI6IHJvdXRlckZ1bmMsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgQVBJR2F0ZXdheSBmb3IgdGhlIEVkZ2UgbmFtZVxuICAgIGNvbnN0IGh0dHBBcGlEb21haW5NYXBwaW5nOiBhcGlnd3kuRG9tYWluTWFwcGluZ09wdGlvbnMgPSB7XG4gICAgICBkb21haW5OYW1lOiBkbkFwcHNFZGdlLFxuICAgIH07XG4gICAgY29uc3QgaHR0cEFwaSA9IG5ldyBhcGlnd3kuSHR0cEFwaSh0aGlzLCAnbWljcm9hcHBzLWFwaScsIHtcbiAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiBodHRwQXBpRG9tYWluTWFwcGluZyxcbiAgICAgIGRlZmF1bHRJbnRlZ3JhdGlvbjogaW50Um91dGVyLFxuICAgICAgYXBpTmFtZTogYXBpZ2F0ZXdheU5hbWUsXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBodHRwQXBpLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZGVmYXVsdCByb3V0ZSBvbiBBUEkgR2F0ZXdheSB0byBwb2ludCB0byB0aGUgcm91dGVyXG4gICAgLy8gaHR0cEFwaS5hZGRSb3V0ZXMoe1xuICAgIC8vICAgcGF0aDogJyRkZWZhdWx0JyxcbiAgICAvLyAgIGludGVncmF0aW9uOiBpbnRSb3V0ZXIsXG4gICAgLy8gfSk7XG5cbiAgICAvL1xuICAgIC8vIExldCBBUEkgR2F0ZXdheSBhY2NlcHQgcmVxdWVzdHMgdXNpbmcgZG9tYWluTmFtZU9yaWdpblxuICAgIC8vIFRoYXQgaXMgdGhlIG9yaWdpbiBVUkkgdGhhdCBDbG91ZEZyb250IHVzZXMgZm9yIHRoaXMgZ2F0ZXdheS5cbiAgICAvLyBUaGUgZ2F0ZXdheSB3aWxsIHJlZnVzZSB0aGUgdHJhZmZpYyBpZiBpdCBkb2Vzbid0IGhhdmUgdGhlXG4gICAgLy8gZG9tYWluIG5hbWUgcmVnaXN0ZXJlZC5cbiAgICAvL1xuICAgIGNvbnN0IG1hcHBpbmdBcHBzQXBpcyA9IG5ldyBhcGlnd3kuQXBpTWFwcGluZyh0aGlzLCAnbWljcm9hcHBzLWFwaS1tYXBwaW5nLW9yaWdpbicsIHtcbiAgICAgIGFwaTogaHR0cEFwaSxcbiAgICAgIGRvbWFpbk5hbWU6IHRoaXMuZG5BcHBzT3JpZ2luLFxuICAgIH0pO1xuICAgIG1hcHBpbmdBcHBzQXBpcy5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5kbkFwcHNPcmlnaW4pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgbWFwcGluZ0FwcHNBcGlzLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIERlcGxveWVyIExhbWJkYSBGdW5jdGlvblxuICAgIC8vXG5cbiAgICAvLyBDcmVhdGUgRGVwbG95ZXIgTGFtYmRhIEZ1bmN0aW9uXG4gICAgY29uc3QgaWFtUm9sZVVwbG9hZE5hbWUgPSBgJHthc3NldE5hbWVSb290fS1kZXBsb3llci11cGxvYWQke2Fzc2V0TmFtZVN1ZmZpeH1gO1xuICAgIGNvbnN0IGRlcGxveWVyRnVuY05hbWUgPSBgJHthc3NldE5hbWVSb290fS1kZXBsb3llciR7YXNzZXROYW1lU3VmZml4fWA7XG4gICAgbGV0IGRlcGxveWVyRnVuYzogbGFtYmRhLkZ1bmN0aW9uO1xuICAgIGNvbnN0IGRlcGxveWVyRnVuY1Byb3BzOiBPbWl0PGxhbWJkYS5GdW5jdGlvblByb3BzLCAnaGFuZGxlcicgfCAnY29kZSc+ID0ge1xuICAgICAgZnVuY3Rpb25OYW1lOiBkZXBsb3llckZ1bmNOYW1lLFxuICAgICAgbWVtb3J5U2l6ZTogMTc2OSxcbiAgICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoMTUpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgTk9ERV9FTlY6IGFwcEVudixcbiAgICAgICAgQVBJR1dZX0lEOiBodHRwQXBpLmh0dHBBcGlJZCxcbiAgICAgICAgREFUQUJBU0VfVEFCTEVfTkFNRTogdGFibGUudGFibGVOYW1lLFxuICAgICAgICBGSUxFU1RPUkVfU1RBR0lOR19CVUNLRVQ6IGJ1Y2tldEFwcHNTdGFnaW5nTmFtZSxcbiAgICAgICAgRklMRVNUT1JFX0RFU1RfQlVDS0VUOiBidWNrZXRBcHBzTmFtZSxcbiAgICAgICAgVVBMT0FEX1JPTEVfTkFNRTogaWFtUm9sZVVwbG9hZE5hbWUsXG4gICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKGV4aXN0c1N5bmMoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9Ly4uL2Rpc3QvbWljcm9hcHBzLWRlcGxveWVyL2luZGV4LmpzYCkpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yIGxvY2FsIGRldlxuICAgICAgZGVwbG95ZXJGdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnbWljcm9hcHBzLWRlcGxveWVyLWZ1bmMnLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vLi4vZGlzdC9taWNyb2FwcHMtZGVwbG95ZXIvYCksXG4gICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgLi4uZGVwbG95ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGV4aXN0c1N5bmMoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9L21pY3JvYXBwcy1kZXBsb3llci9pbmRleC5qc2ApKSB7XG4gICAgICAvLyBUaGlzIGlzIGZvciBidWlsdCBhcHBzIHBhY2thZ2VkIHdpdGggdGhlIENESyBjb25zdHJ1Y3RcbiAgICAgIGRlcGxveWVyRnVuYyA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ21pY3JvYXBwcy1kZXBsb3llci1mdW5jJywge1xuICAgICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9L21pY3JvYXBwcy1kZXBsb3llci9gKSxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICAuLi5kZXBsb3llckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXBsb3llckZ1bmMgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsICdtaWNyb2FwcHMtZGVwbG95ZXItZnVuYycsIHtcbiAgICAgICAgZW50cnk6ICcuL3BhY2thZ2VzL21pY3JvYXBwcy1kZXBsb3llci9zcmMvaW5kZXgudHMnLFxuICAgICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgbWluaWZ5OiB0cnVlLFxuICAgICAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uZGVwbG95ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBkZXBsb3llckZ1bmMuYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cbiAgICAvLyBHaXZlIHRoZSBEZXBsb3llciBhY2Nlc3MgdG8gRHluYW1vREIgdGFibGVcbiAgICB0YWJsZS5ncmFudFJlYWRXcml0ZURhdGEoZGVwbG95ZXJGdW5jKTtcbiAgICB0YWJsZS5ncmFudChkZXBsb3llckZ1bmMsICdkeW5hbW9kYjpEZXNjcmliZVRhYmxlJyk7XG5cbiAgICAvL1xuICAgIC8vIERlbG95ZXIgdXBsb2FkIHRlbXAgcm9sZVxuICAgIC8vIERlcGxveWVyIGFzc3VtZXMgdGhpcyByb2xlIHdpdGggYSBsaW1pdGVkIHBvbGljeSB0byBnZW5lcmF0ZVxuICAgIC8vIGFuIFNUUyB0ZW1wIHRva2VuIHRvIHJldHVybiB0byBtaWNyb2FwcHMtcHVibGlzaCBmb3IgdGhlIHVwbG9hZC5cbiAgICAvL1xuICAgIGNvbnN0IGlhbVJvbGVVcGxvYWQgPSBuZXcgaWFtLlJvbGUodGhpcywgJ21pY3JvYXBwcy1kZXBsb3llci11cGxvYWQtcm9sZScsIHtcbiAgICAgIHJvbGVOYW1lOiBpYW1Sb2xlVXBsb2FkTmFtZSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIHVwbG9hZFBvbGljeTogbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ3MzOkxpc3RCdWNrZXQnXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbYnVja2V0QXBwc1N0YWdpbmcuYnVja2V0QXJuXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ3MzOlB1dE9iamVjdCcsICdzMzpHZXRPYmplY3QnLCAnczM6QWJvcnRNdWx0aXBhcnRVcGxvYWQnXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbYCR7YnVja2V0QXBwc1N0YWdpbmcuYnVja2V0QXJufS8qYF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICBhc3N1bWVkQnk6IGRlcGxveWVyRnVuYy5ncmFudFByaW5jaXBhbCxcbiAgICB9KTtcblxuICAgIC8vXG4gICAgLy8gVXBkYXRlIFMzIHBlcm1pc3Npb25zXG4gICAgLy9cbiAgICAvLyBDcmVhdGUgUHJpbmNpcGFsQVJOIExpc3RcbiAgICBjb25zdCBzM1BvbGljeUJ5cGFzc0FyblByaW5jaXBhbHM6IGlhbS5Bcm5QcmluY2lwYWxbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgYXJuUHJpbmNpcGFsIG9mIHMzUG9saWN5QnlwYXNzUHJpbmNpcGFsQVJOcykge1xuICAgICAgczNQb2xpY3lCeXBhc3NBcm5QcmluY2lwYWxzLnB1c2gobmV3IGlhbS5Bcm5QcmluY2lwYWwoYXJuUHJpbmNpcGFsKSk7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBBUk9BIExpc3QgdGhhdCBtYXRjaGVzIGFzc3VtZWQgc2Vzc2lvbnNcbiAgICBjb25zdCBzM1BvbGljeUJ5cGFzc0FST0FNYXRjaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgYXJvYSBvZiBzM1BvbGljeUJ5cGFzc0FST0FzKSB7XG4gICAgICBzM1BvbGljeUJ5cGFzc0FST0FNYXRjaGVzLnB1c2goYCR7YXJvYX06KmApO1xuICAgIH1cbiAgICAvLyBEZW55IGFwcHMgZnJvbSByZWFkaW5nOlxuICAgIC8vIC0gSWYgdGhleSBhcmUgbWlzc2luZyB0aGUgbWljcm9hcHAtbmFtZSB0YWdcbiAgICAvLyAtIEFueXRoaW5nIG91dHNpZGUgb2YgdGhlIGZvbGRlciB0aGF0IG1hdGNoZXMgdGhlaXIgbWljcm9hcHAtbmFtZSB0YWdcbiAgICBjb25zdCBwb2xpY3lEZW55UHJlZml4T3V0c2lkZVRhZyA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ2RlbnktcHJlZml4LW91dHNpZGUtbWljcm9hcHAtbmFtZS10YWcnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkRFTlksXG4gICAgICBhY3Rpb25zOiBbJ3MzOionXSxcbiAgICAgIG5vdFByaW5jaXBhbHM6IFtcbiAgICAgICAgbmV3IGlhbS5DYW5vbmljYWxVc2VyUHJpbmNpcGFsKFxuICAgICAgICAgIGJ1Y2tldEFwcHNPQUkuY2xvdWRGcm9udE9yaWdpbkFjY2Vzc0lkZW50aXR5UzNDYW5vbmljYWxVc2VySWQsXG4gICAgICAgICksXG4gICAgICAgIG5ldyBpYW0uQWNjb3VudFJvb3RQcmluY2lwYWwoKSxcbiAgICAgICAgLi4uczNQb2xpY3lCeXBhc3NBcm5QcmluY2lwYWxzLFxuICAgICAgICBkZXBsb3llckZ1bmMuZ3JhbnRQcmluY2lwYWwsXG4gICAgICBdLFxuICAgICAgbm90UmVzb3VyY2VzOiBbXG4gICAgICAgIGAke2J1Y2tldEFwcHMuYnVja2V0QXJufS9cXCR7YXdzOlByaW5jaXBhbFRhZy9taWNyb2FwcC1uYW1lfS8qYCxcbiAgICAgICAgYnVja2V0QXBwcy5idWNrZXRBcm4sXG4gICAgICBdLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBOdWxsOiB7ICdhd3M6UHJpbmNpcGFsVGFnL21pY3JvYXBwLW5hbWUnOiAnZmFsc2UnIH0sXG4gICAgICAgIC8vIFN0cmluZ05vdExpa2U6IHsnYXdzOid9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgcG9saWN5RGVueVByZWZpeE91dHNpZGVUYWcuYWRkQ29uZGl0aW9uKFxuICAgICAgICAvLyBBbGxvd3MgdGhlIERlbGV0YWJsZUJ1Y2tldCBMYW1iZGEgdG8gZGVsZXRlIGl0ZW1zIGluIHRoZSBidWNrZXRzXG4gICAgICAgICdTdHJpbmdOb3RMaWtlJyxcbiAgICAgICAgeyAnYXdzOlByaW5jaXBhbFRhZy9hcHBsaWNhdGlvbic6IGAke2Fzc2V0TmFtZVJvb3R9LWNvcmUqYCB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcG9saWN5RGVueU1pc3NpbmdUYWcgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdkZW55LW1pc3NpbmctbWljcm9hcHAtbmFtZS10YWcnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkRFTlksXG4gICAgICBhY3Rpb25zOiBbJ3MzOionXSxcbiAgICAgIG5vdFByaW5jaXBhbHM6IFtcbiAgICAgICAgbmV3IGlhbS5DYW5vbmljYWxVc2VyUHJpbmNpcGFsKFxuICAgICAgICAgIGJ1Y2tldEFwcHNPQUkuY2xvdWRGcm9udE9yaWdpbkFjY2Vzc0lkZW50aXR5UzNDYW5vbmljYWxVc2VySWQsXG4gICAgICAgICksXG4gICAgICAgIG5ldyBpYW0uQWNjb3VudFJvb3RQcmluY2lwYWwoKSxcbiAgICAgICAgLy8gRXhjbHVkZSB0aGUgRGVwbG95ZXIgRnVuY3Rpb24gZGlyZWN0bHlcbiAgICAgICAgZGVwbG95ZXJGdW5jLmdyYW50UHJpbmNpcGFsLFxuICAgICAgICAvLyAyMDIxLTEyLTA0IC0gTm90IDEwMCUgc3VyZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgbmVlZGVkLi4uXG4gICAgICAgIC8vIExldCdzIHRlc3QgdGhpcyBhbmQgcmVtb3ZlIGlmIGFjdHVhbGx5IG5vdCBuZWNlc3NhcnlcbiAgICAgICAgbmV3IGlhbS5Bcm5QcmluY2lwYWwoXG4gICAgICAgICAgYGFybjphd3M6c3RzOjoke2FjY291bnR9OmFzc3VtZWQtcm9sZS8ke2RlcGxveWVyRnVuYy5yb2xlPy5yb2xlTmFtZX0vJHtkZXBsb3llckZ1bmMuZnVuY3Rpb25OYW1lfWAsXG4gICAgICAgICksXG4gICAgICAgIC4uLnMzUG9saWN5QnlwYXNzQXJuUHJpbmNpcGFscyxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzLmJ1Y2tldEFybn0vKmAsIGJ1Y2tldEFwcHMuYnVja2V0QXJuXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgTnVsbDogeyAnYXdzOlByaW5jaXBhbFRhZy9taWNyb2FwcC1uYW1lJzogJ3RydWUnIH0sXG4gICAgICAgIC8vIE5vdGU6IFRoaXMgQVJPQSBtdXN0IGJlIHNwZWNpZmllZCB0byBwcmV2ZW50IHRoaXMgcG9saWN5IGZyb20gbG9ja2luZ1xuICAgICAgICAvLyBvdXQgbm9uLXJvb3Qgc2Vzc2lvbnMgdGhhdCBoYXZlIGFzc3VtZWQgdGhlIGFkbWluIHJvbGUuXG4gICAgICAgIC8vIFRoZSBub3RQcmluY2lwYWxzIHdpbGwgb25seSBtYXRjaCB0aGUgcm9sZSBuYW1lIGV4YWN0bHkgYW5kIHdpbGwgbm90IG1hdGNoXG4gICAgICAgIC8vIGFueSBzZXNzaW9uIHRoYXQgaGFzIGFzc3VtZWQgdGhlIHJvbGUgc2luY2Ugbm90UHJpbmNpcGFscyBkb2VzIG5vdCBhbGxvd1xuICAgICAgICAvLyB3aWxkY2FyZCBtYXRjaGVzIGFuZCBkb2VzIG5vdCBkbyB0aGVtIGltcGxpY2l0bHkgZWl0aGVyLlxuICAgICAgICAvLyBUaGUgQVJPQSBtdXN0IGJlIHVzZWQgYmVjYXVzZSB0aGVyZSBhcmUgb25seSAzIFByaW5jaXBhbCB2YXJpYWJsZXM6XG4gICAgICAgIC8vICBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX3ZhcmlhYmxlcy5odG1sI3ByaW5jaXBhbHRhYmxlXG4gICAgICAgIC8vICBhd3M6dXNlcm5hbWUsIGF3czp1c2VyaWQsIGF3czpQcmluY2lwYWxUYWdcbiAgICAgICAgLy8gRm9yIGFuIGFzc3VtZWQgcm9sZSwgYXdzOnVzZXJuYW1lIGlzIGJsYW5rLCBhd3M6dXNlcmlkIGlzOlxuICAgICAgICAvLyAgW3VuaXF1ZSBpZCBBS0EgQVJPQSBmb3IgUm9sZV06W3Nlc3Npb24gbmFtZV1cbiAgICAgICAgLy8gVGFibGUgb2YgdW5pcXVlIElEIHByZWZpeGVzIHN1Y2ggYXMgQVJPQTpcbiAgICAgICAgLy8gIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfaWRlbnRpZmllcnMuaHRtbCNpZGVudGlmaWVycy1wcmVmaXhlc1xuICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgcm9sZSBpcyBzaW1wbHkgbm90IGF2YWlsYWJsZSBhbmQgaWYgaXQgd2FzXG4gICAgICAgIC8vIHdlJ2QgbmVlZCB0byB3cml0ZSBhIGNvbXBsaWNhdGVkIGNvbXBhcmlzb24gdG8gbWFrZSBzdXJlXG4gICAgICAgIC8vIHRoYXQgd2UgZGlkbid0IGV4Y2x1ZGUgdGhlIERlbnkgdGFnIGZyb20gcm9sZXMgaW4gb3RoZXIgYWNjb3VudHMuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRvIGdldCB0aGUgQVJPQSB3aXRoIHRoZSBBV1MgQ0xJOlxuICAgICAgICAvLyAgIGF3cyBpYW0gZ2V0LXJvbGUgLS1yb2xlLW5hbWUgUk9MRS1OQU1FXG4gICAgICAgIC8vICAgYXdzIGlhbSBnZXQtdXNlciAt4oCTdXNlci1uYW1lIFVTRVItTkFNRVxuICAgICAgICBTdHJpbmdOb3RMaWtlOiB7ICdhd3M6dXNlcmlkJzogW2FjY291bnQsIC4uLnMzUG9saWN5QnlwYXNzQVJPQU1hdGNoZXNdIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgcG9saWN5RGVueU1pc3NpbmdUYWcuYWRkQ29uZGl0aW9uKFxuICAgICAgICAvLyBBbGxvd3MgdGhlIERlbGV0YWJsZUJ1Y2tldCBMYW1iZGEgdG8gZGVsZXRlIGl0ZW1zIGluIHRoZSBidWNrZXRzXG4gICAgICAgICdTdHJpbmdOb3RMaWtlJyxcbiAgICAgICAgeyAnYXdzOlByaW5jaXBhbFRhZy9hcHBsaWNhdGlvbic6IGAke2Fzc2V0TmFtZVJvb3R9LWNvcmUqYCB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcG9saWN5Q2xvdWRGcm9udEFjY2VzcyA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ2Nsb3VkZnJvbnQtb2FpLWFjY2VzcycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3MzOkdldE9iamVjdCddLFxuICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICBuZXcgaWFtLkNhbm9uaWNhbFVzZXJQcmluY2lwYWwoXG4gICAgICAgICAgYnVja2V0QXBwc09BSS5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlTM0Nhbm9uaWNhbFVzZXJJZCxcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzLmJ1Y2tldEFybn0vKmBdLFxuICAgIH0pO1xuXG4gICAgaWYgKGJ1Y2tldEFwcHMucG9saWN5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGRvY3VtZW50ID0gbmV3IHMzLkJ1Y2tldFBvbGljeSh0aGlzLCAnQ0ZQb2xpY3knLCB7XG4gICAgICAgIGJ1Y2tldDogYnVja2V0QXBwcyxcbiAgICAgIH0pLmRvY3VtZW50O1xuICAgICAgZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhwb2xpY3lDbG91ZEZyb250QWNjZXNzKTtcblxuICAgICAgaWYgKHMzU3RyaWN0QnVja2V0UG9saWN5KSB7XG4gICAgICAgIGRvY3VtZW50LmFkZFN0YXRlbWVudHMocG9saWN5RGVueVByZWZpeE91dHNpZGVUYWcpO1xuICAgICAgICBkb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeURlbnlNaXNzaW5nVGFnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYnVja2V0QXBwcy5wb2xpY3kuZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhwb2xpY3lDbG91ZEZyb250QWNjZXNzKTtcblxuICAgICAgaWYgKHMzU3RyaWN0QnVja2V0UG9saWN5KSB7XG4gICAgICAgIGJ1Y2tldEFwcHMucG9saWN5LmRvY3VtZW50LmFkZFN0YXRlbWVudHMocG9saWN5RGVueVByZWZpeE91dHNpZGVUYWcpO1xuICAgICAgICBidWNrZXRBcHBzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeURlbnlNaXNzaW5nVGFnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbGxvdyB0aGUgTGFtYmRhIHRvIHJlYWQgZnJvbSB0aGUgc3RhZ2luZyBidWNrZXRcbiAgICBjb25zdCBwb2xpY3lSZWFkTGlzdFN0YWdpbmcgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAvLyBGSVhNRTogQWxsb3cgRGVwbG95ZXIgdG8gZGVsZXRlIGZyb20gU3RhZ2luZyBidWNrZXRcbiAgICAgIGFjdGlvbnM6IFsnczM6RGVsZXRlT2JqZWN0JywgJ3MzOkdldE9iamVjdCcsICdzMzpMaXN0QnVja2V0J10sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzU3RhZ2luZy5idWNrZXRBcm59LypgLCBidWNrZXRBcHBzU3RhZ2luZy5idWNrZXRBcm5dLFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5UmVhZExpc3RTdGFnaW5nKTtcblxuICAgIC8vIEFsbG93IHRoZSBMYW1iZGEgdG8gd3JpdGUgdG8gdGhlIHRhcmdldCBidWNrZXRcbiAgICBjb25zdCBwb2xpY3lSZWFkV3JpdGVMaXN0VGFyZ2V0ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydzMzpHZXRPYmplY3QnLCAnczM6UHV0T2JqZWN0JywgJ3MzOkxpc3RCdWNrZXQnXSxcbiAgICAgIHJlc291cmNlczogW2Ake2J1Y2tldEFwcHMuYnVja2V0QXJufS8qYCwgYnVja2V0QXBwcy5idWNrZXRBcm5dLFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5UmVhZFdyaXRlTGlzdFRhcmdldCk7XG5cbiAgICAvLyBBbGxvdyB0aGUgZGVwbG95ZXIgdG8gZ2V0IGEgdGVtcG9yYXJ5IFNUUyB0b2tlblxuICAgIGNvbnN0IHBvbGljeUdldFNUU1Rva2VuID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydzdHM6R2V0RmVkZXJhdGlvblRva2VuJ10sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5R2V0U1RTVG9rZW4pO1xuXG4gICAgLy8gQWxsb3cgdGhlIGRlcGxveWVyIHRvIGFzc3VtZSB0aGUgdXBsb2FkIHJvbGVcbiAgICBjb25zdCBwb2xpY3lBc3N1bWVVcGxvYWQgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3N0czpBc3N1bWVSb2xlJ10sXG4gICAgICByZXNvdXJjZXM6IFtpYW1Sb2xlVXBsb2FkLnJvbGVBcm5dLFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5QXNzdW1lVXBsb2FkKTtcblxuICAgIC8vXG4gICAgLy8gR2l2ZSBEZXBsb3llciBwZXJtaXNzaW9ucyB0byBjcmVhdGUgcm91dGVzIGFuZCBpbnRlZ3JhdGlvbnNcbiAgICAvLyBvbiB0aGUgQVBJIEdhdGV3YXkgQVBJLlxuICAgIC8vXG5cbiAgICAvLyBHcmFudCB0aGUgYWJpbGl0eSB0byBMaXN0IGFsbCBBUElzICh3ZSBoYXZlIHRvIGZpbmQgaXQpXG4gICAgY29uc3QgcG9saWN5QVBJTGlzdCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnYXBpZ2F0ZXdheTpHRVQnXSxcbiAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOmFwaWdhdGV3YXk6JHtyZWdpb259OjovYXBpc2BdLFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5QVBJTGlzdCk7XG4gICAgLy8gR3JhbnQgZnVsbCBjb250cm9sIG92ZXIgdGhlIEFQSSB3ZSBjcmVhdGVkXG4gICAgY29uc3QgcG9saWN5QVBJTWFuYWdlID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydhcGlnYXRld2F5OionXSxcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICBgYXJuOmF3czphcGlnYXRld2F5OiR7cmVnaW9ufToke2FjY291bnR9OiR7aHR0cEFwaS5odHRwQXBpSWR9LypgLFxuICAgICAgICBgYXJuOmF3czphcGlnYXRld2F5OiR7cmVnaW9ufTo6L2FwaXMvJHtodHRwQXBpLmh0dHBBcGlJZH0vaW50ZWdyYXRpb25zYCxcbiAgICAgICAgYGFybjphd3M6YXBpZ2F0ZXdheToke3JlZ2lvbn06Oi9hcGlzLyR7aHR0cEFwaS5odHRwQXBpSWR9L3JvdXRlc2AsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5QVBJTWFuYWdlKTtcbiAgICAvLyBHcmFudCBmdWxsIGNvbnRyb2wgb3ZlciBsYW1iZGFzIHRoYXQgaW5kaWNhdGUgdGhleSBhcmUgbWljcm9hcHBzXG4gICAgY29uc3QgcG9saWN5QVBJTWFuYWdlTGFtYmRhcyA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnbGFtYmRhOionXSxcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICBgYXJuOmF3czpsYW1iZGE6JHtyZWdpb259OiR7YWNjb3VudH06ZnVuY3Rpb246KmAsXG4gICAgICAgIGBhcm46YXdzOmxhbWJkYToke3JlZ2lvbn06JHthY2NvdW50fTpmdW5jdGlvbjoqOipgLFxuICAgICAgXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzSWZFeGlzdHM6IHsgJ2F3czpSZXNvdXJjZVRhZy9taWNyb2FwcC1tYW5hZ2VkJzogJ3RydWUnIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5QVBJTWFuYWdlTGFtYmRhcyk7XG5cbiAgICAvL1xuICAgIC8vIENyZWF0ZSB0aGUgb3JpZ2luIG5hbWUgZm9yIEFQSSBHYXRld2F5XG4gICAgLy9cblxuICAgIGNvbnN0IHpvbmUgPSByNTMuSG9zdGVkWm9uZS5mcm9tSG9zdGVkWm9uZUF0dHJpYnV0ZXModGhpcywgJ21pY3JvYXBwcy16b25lJywge1xuICAgICAgem9uZU5hbWU6IHI1M1pvbmVOYW1lLFxuICAgICAgaG9zdGVkWm9uZUlkOiByNTNab25lSUQsXG4gICAgfSk7XG5cbiAgICBjb25zdCByckFwcHNPcmlnaW4gPSBuZXcgcjUzLkFSZWNvcmQodGhpcywgJ21pY3JvYXBwcy1vcmlnaW4tYXJlY29yZCcsIHtcbiAgICAgIHpvbmU6IHpvbmUsXG4gICAgICByZWNvcmROYW1lOiBkb21haW5OYW1lT3JpZ2luLFxuICAgICAgdGFyZ2V0OiByNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgbmV3IHI1M3RhcmdldHMuQXBpR2F0ZXdheXYyRG9tYWluUHJvcGVydGllcyhcbiAgICAgICAgICB0aGlzLl9kbkFwcHNPcmlnaW4ucmVnaW9uYWxEb21haW5OYW1lLFxuICAgICAgICAgIHRoaXMuX2RuQXBwc09yaWdpbi5yZWdpb25hbEhvc3RlZFpvbmVJZCxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICByckFwcHNPcmlnaW4uYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
406
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
407
|
+
MicroAppsSvcs[_a] = { fqn: "@pwrdrvr/microapps-cdk.MicroAppsSvcs", version: "0.0.29" };
|
|
408
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzU3Zjcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9NaWNyb0FwcHNTdmNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsMkJBQWdDO0FBQ2hDLDZCQUE2QjtBQUM3QixvREFBb0Q7QUFDcEQsb0VBQW9FO0FBRXBFLGtEQUFrRDtBQUNsRCx3Q0FBd0M7QUFDeEMsOENBQThDO0FBQzlDLDJEQUEyRDtBQUMzRCwwQ0FBMEM7QUFDMUMsc0NBQXNDO0FBQ3RDLHFDQUFxQzs7OztBQTBDckMsTUFBYSxhQUFjLFNBQVEsR0FBRyxDQUFDLFNBQVM7Ozs7OztJQVk5QyxZQUFZLEtBQW9CLEVBQUUsRUFBVSxFQUFFLEtBQTBCOztRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDOUM7UUFFRCxNQUFNLEVBQ0osVUFBVSxFQUNWLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsbUJBQW1CLEdBQUcsRUFBRSxFQUN4QiwyQkFBMkIsR0FBRyxFQUFFLEVBQ2hDLG9CQUFvQixHQUFHLEtBQUssRUFDNUIsTUFBTSxFQUNOLE9BQU8sRUFDUCxhQUFhLEVBQ2IsYUFBYSxFQUNiLGVBQWUsRUFDZixjQUFjLEdBQUcsRUFBRSxHQUNwQixHQUFHLEtBQUssQ0FBQztRQUVWLElBQUksb0JBQW9CLEtBQUssSUFBSSxFQUFFO1lBQ2pDLElBQUksbUJBQW1CLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSwyQkFBMkIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNoRixNQUFNLElBQUksS0FBSyxDQUNiLHdIQUF3SCxDQUN6SCxDQUFDO2FBQ0g7U0FDRjtRQUVELEVBQUU7UUFDRixpQkFBaUI7UUFDakIsRUFBRTtRQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDOUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLEdBQUcsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDM0UsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsZUFBZTtZQUNqRCxZQUFZLEVBQUU7Z0JBQ1osSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTTthQUNwQztZQUNELE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNO2FBQ3BDO1lBQ0QsYUFBYTtTQUNkLENBQUMsQ0FBQztRQUVILEVBQUU7UUFDRix5QkFBeUI7UUFDekIsRUFBRTtRQUVGLGdDQUFnQztRQUNoQyxJQUFJLFVBQTJCLENBQUM7UUFDaEMsTUFBTSxlQUFlLEdBQW1EO1lBQ3RFLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxVQUFVLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3JGLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFlBQVksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVM7WUFDMUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFdBQVcsRUFBRTtnQkFDWCxRQUFRLEVBQUUsTUFBTTtnQkFDaEIsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO2dCQUMxQyxtQ0FBbUMsRUFBRSxHQUFHO2dCQUN4QyxnQkFBZ0IsRUFBRSxjQUFjO2FBQ2pDO1NBQ0YsQ0FBQztRQUNGLElBQ0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssTUFBTTtZQUMvQixlQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFDcEY7WUFDQSx3QkFBd0I7WUFDeEIsVUFBVSxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO2dCQUNwRCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDekYsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLEdBQUcsZUFBZTthQUNuQixDQUFDLENBQUM7U0FDSjthQUFNLElBQUksZUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUU7WUFDM0UseURBQXlEO1lBQ3pELFVBQVUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtnQkFDcEQsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3JFLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixHQUFHLGVBQWU7YUFDbkIsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLDZCQUE2QjtZQUM3QixNQUFNLGVBQWUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO2dCQUN4RSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLENBQ2xFO2dCQUNELGFBQWE7YUFDZCxDQUFDLENBQUM7WUFFSCxVQUFVLEdBQUcsSUFBSSxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7Z0JBQ2hFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxVQUFVLENBQUM7Z0JBQzlFLE9BQU8sRUFBRSxTQUFTO2dCQUNsQixRQUFRLEVBQUU7b0JBQ1IsTUFBTSxFQUFFLElBQUk7b0JBQ1osU0FBUyxFQUFFLElBQUk7aUJBQ2hCO2dCQUNELE1BQU0sRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDekIsR0FBRyxlQUFlO2FBQ25CLENBQUMsQ0FBQztTQUNKO1FBQ0QsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQy9CLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM5QztRQUNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO1lBQy9DLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7WUFDeEIsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQ3pCLFNBQVMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLFNBQVMsSUFBSSxDQUFDO1NBQ3pDLENBQUMsQ0FBQztRQUNILEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNqQyxNQUFNLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDekMsMkNBQTJDO1lBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsRUFBRTtRQUNGLDJCQUEyQjtRQUMzQixFQUFFO1FBRUYsa0NBQWtDO1FBQ2xDLE1BQU0saUJBQWlCLEdBQUcsYUFBYTtZQUNyQyxDQUFDLENBQUMsR0FBRyxhQUFhLG1CQUFtQixlQUFlLEVBQUU7WUFDdEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYTtZQUNwQyxDQUFDLENBQUMsR0FBRyxhQUFhLFlBQVksZUFBZSxFQUFFO1lBQy9DLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxNQUFNLGlCQUFpQixHQUFtRDtZQUN4RSxZQUFZLEVBQUUsZ0JBQWdCO1lBQzlCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFlBQVksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVM7WUFDMUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFdBQVcsRUFBRTtnQkFDWCxRQUFRLEVBQUUsTUFBTTtnQkFDaEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2dCQUM1QixtQkFBbUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVM7Z0JBQzFDLHdCQUF3QixFQUFFLGlCQUFpQixDQUFDLFVBQVU7Z0JBQ3RELHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxVQUFVO2dCQUM1QyxtQ0FBbUMsRUFBRSxHQUFHO2dCQUN4QyxnQkFBZ0IsRUFBRSxjQUFjO2FBQ2pDO1NBQ0YsQ0FBQztRQUNGLElBQ0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssTUFBTTtZQUMvQixlQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFDdEY7WUFDQSx3QkFBd0I7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRTtnQkFDOUQsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzNGLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixHQUFHLGlCQUFpQjthQUNyQixDQUFDLENBQUM7U0FDSjthQUFNLElBQUksZUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUU7WUFDN0UseURBQXlEO1lBQ3pELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7Z0JBQzlELElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO2dCQUN2RSxPQUFPLEVBQUUsZUFBZTtnQkFDeEIsR0FBRyxpQkFBaUI7YUFDckIsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7Z0JBQzFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxVQUFVLENBQUM7Z0JBQ2hGLE9BQU8sRUFBRSxTQUFTO2dCQUNsQixRQUFRLEVBQUU7b0JBQ1IsTUFBTSxFQUFFLElBQUk7b0JBQ1osU0FBUyxFQUFFLElBQUk7aUJBQ2hCO2dCQUNELEdBQUcsaUJBQWlCO2FBQ3JCLENBQUMsQ0FBQztTQUNKO1FBQ0QsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDdEQ7UUFDRCw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBRWhFLEVBQUU7UUFDRiwyQkFBMkI7UUFDM0IsK0RBQStEO1FBQy9ELG1FQUFtRTtRQUNuRSxFQUFFO1FBQ0YsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtZQUMvRCxRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLGNBQWMsRUFBRTtnQkFDZCxZQUFZLEVBQUUsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDO29CQUNuQyxVQUFVLEVBQUU7d0JBQ1YsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDOzRCQUN0QixPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUM7NEJBQzFCLFNBQVMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQzt5QkFDekMsQ0FBQzt3QkFDRixJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7NEJBQ3RCLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUseUJBQXlCLENBQUM7NEJBQ3BFLFNBQVMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxJQUFJLENBQUM7eUJBQ2hELENBQUM7cUJBQ0g7aUJBQ0YsQ0FBQzthQUNIO1lBQ0QsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYztTQUM3QyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFOUUsRUFBRTtRQUNGLHdCQUF3QjtRQUN4QixFQUFFO1FBQ0YsMkJBQTJCO1FBQzNCLE1BQU0sMkJBQTJCLEdBQXVCLEVBQUUsQ0FBQztRQUMzRCxLQUFLLE1BQU0sWUFBWSxJQUFJLDJCQUEyQixFQUFFO1lBQ3RELDJCQUEyQixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUN0RTtRQUNELGlEQUFpRDtRQUNqRCxNQUFNLHlCQUF5QixHQUFhLEVBQUUsQ0FBQztRQUMvQyxLQUFLLE1BQU0sSUFBSSxJQUFJLG1CQUFtQixFQUFFO1lBQ3RDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7U0FDN0M7UUFDRCwwQkFBMEI7UUFDMUIsOENBQThDO1FBQzlDLHdFQUF3RTtRQUN4RSxNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN6RCxHQUFHLEVBQUUsdUNBQXVDO1lBQzVDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUk7WUFDdkIsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pCLGFBQWEsRUFBRTtnQkFDYixJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsQ0FDNUIsYUFBYSxDQUFDLCtDQUErQyxDQUM5RDtnQkFDRCxJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRTtnQkFDOUIsR0FBRywyQkFBMkI7Z0JBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYzthQUNsQztZQUNELFlBQVksRUFBRTtnQkFDWixHQUFHLFVBQVUsQ0FBQyxTQUFTLHVDQUF1QztnQkFDOUQsVUFBVSxDQUFDLFNBQVM7YUFDckI7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLEVBQUUsZ0NBQWdDLEVBQUUsT0FBTyxFQUFFO2FBRXBEO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQy9CLDBCQUEwQixDQUFDLFlBQVk7WUFDckMsbUVBQW1FO1lBQ25FLGVBQWUsRUFDZixFQUFFLDhCQUE4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxRQUFRLEVBQUUsQ0FDNUUsQ0FBQztTQUNIO1FBQ0QsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDbkQsR0FBRyxFQUFFLGdDQUFnQztZQUNyQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQ3ZCLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixhQUFhLEVBQUU7Z0JBQ2IsSUFBSSxHQUFHLENBQUMsc0JBQXNCLENBQzVCLGFBQWEsQ0FBQywrQ0FBK0MsQ0FDOUQ7Z0JBQ0QsSUFBSSxHQUFHLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzlCLHlDQUF5QztnQkFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjO2dCQUNqQyw2REFBNkQ7Z0JBQzdELHVEQUF1RDtnQkFDdkQsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUNsQixnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLGlCQUFpQixNQUFBLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSwwQ0FBRSxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FDMUg7Z0JBQ0QsR0FBRywyQkFBMkI7YUFDL0I7WUFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLElBQUksRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDO1lBQzlELFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLEVBQUU7Z0JBQ2xELHdFQUF3RTtnQkFDeEUsMERBQTBEO2dCQUMxRCw2RUFBNkU7Z0JBQzdFLDJFQUEyRTtnQkFDM0UsMkRBQTJEO2dCQUMzRCxzRUFBc0U7Z0JBQ3RFLHFHQUFxRztnQkFDckcsOENBQThDO2dCQUM5Qyw2REFBNkQ7Z0JBQzdELGdEQUFnRDtnQkFDaEQsNENBQTRDO2dCQUM1QyxvR0FBb0c7Z0JBQ3BHLDZEQUE2RDtnQkFDN0QsMkRBQTJEO2dCQUMzRCxvRUFBb0U7Z0JBQ3BFLEVBQUU7Z0JBQ0Ysb0NBQW9DO2dCQUNwQywyQ0FBMkM7Z0JBQzNDLDJDQUEyQztnQkFDM0MsYUFBYSxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyx5QkFBeUIsQ0FBQyxFQUFFO2FBQ3BGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQy9CLG9CQUFvQixDQUFDLFlBQVk7WUFDL0IsbUVBQW1FO1lBQ25FLGVBQWUsRUFDZixFQUFFLDhCQUE4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxRQUFRLEVBQUUsQ0FDNUUsQ0FBQztTQUNIO1FBQ0QsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDckQsR0FBRyxFQUFFLHVCQUF1QjtZQUM1QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ3hCLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUM7WUFDMUMsVUFBVSxFQUFFO2dCQUNWLElBQUksR0FBRyxDQUFDLHNCQUFzQixDQUM1QixhQUFhLENBQUMsK0NBQStDLENBQzlEO2FBQ0Y7WUFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLElBQUksRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDO1NBQy9ELENBQUMsQ0FBQztRQUVILElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ3RELE1BQU0sRUFBRSxVQUFVO2FBQ25CLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDWixRQUFRLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFFL0MsSUFBSSxvQkFBb0IsRUFBRTtnQkFDeEIsUUFBUSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO2dCQUNuRCxRQUFRLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDOUM7U0FDRjthQUFNO1lBQ0wsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFFakUsSUFBSSxvQkFBb0IsRUFBRTtnQkFDeEIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLENBQUM7Z0JBQ3JFLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2FBQ2hFO1NBQ0Y7UUFFRCxtREFBbUQ7UUFDbkQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDcEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUN4QixzREFBc0Q7WUFDdEQsT0FBTyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGVBQWUsQ0FBQztZQUM3RCxTQUFTLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztTQUM3RSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRTFELDREQUE0RDtRQUM1RCxNQUFNLHlCQUF5QixHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN4RCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ3hCLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDO1lBQzdFLFNBQVMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLFNBQVMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUM7U0FDL0QsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUU5RCxrREFBa0Q7UUFDbEQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDaEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUN4QixPQUFPLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztZQUNuQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7U0FDakIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUV0RCwrQ0FBK0M7UUFDL0MsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDakQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUN4QixPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMzQixTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO1NBQ25DLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFdkQsRUFBRTtRQUNGLDhEQUE4RDtRQUM5RCwwQkFBMEI7UUFDMUIsRUFBRTtRQUVGLDBEQUEwRDtRQUMxRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDNUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUN4QixPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMzQixTQUFTLEVBQUUsQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQztTQUMzRCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCw2Q0FBNkM7UUFDN0MsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO1lBQzlDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7WUFDeEIsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQ3pCLFNBQVMsRUFBRTtnQkFDVCxzQkFBc0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSTtnQkFDbkYsc0JBQXNCLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxXQUFXLE9BQU8sQ0FBQyxTQUFTLGlCQUFpQjtnQkFDakYsc0JBQXNCLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxXQUFXLE9BQU8sQ0FBQyxTQUFTLGVBQWU7Z0JBQy9FLHNCQUFzQixHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sV0FBVyxPQUFPLENBQUMsU0FBUyxTQUFTO2dCQUN6RSxzQkFBc0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLFdBQVcsT0FBTyxDQUFDLFNBQVMsV0FBVzthQUM1RTtTQUNGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BELG1FQUFtRTtRQUNuRSxNQUFNLHNCQUFzQixHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUNyRCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ3hCLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQztZQUNyQixTQUFTLEVBQUU7Z0JBQ1Qsa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxhQUFhO2dCQUNuRSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLGVBQWU7YUFDdEU7WUFDRCxVQUFVLEVBQUU7Z0JBQ1Ysb0JBQW9CLEVBQUUsRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLEVBQUU7YUFDckU7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTNELHVDQUF1QztRQUN2Qyx1REFBdUQ7UUFDdkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEYsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7WUFDMUMsT0FBTztZQUNQLFFBQVEsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU87WUFDckMsV0FBVyxFQUFFLFNBQVM7U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7O0lBcGFELElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOzs7Ozs7SUFHRCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7O0FBVEgsc0NBdWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBhcGlnd3kgZnJvbSAnQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mic7XG5pbXBvcnQgKiBhcyBhcGlnd3lpbnQgZnJvbSAnQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1pbnRlZ3JhdGlvbnMnO1xuaW1wb3J0ICogYXMgY2YgZnJvbSAnQGF3cy1jZGsvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgZHluYW1vZGIgZnJvbSAnQGF3cy1jZGsvYXdzLWR5bmFtb2RiJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdAYXdzLWNkay9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdAYXdzLWNkay9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGxhbWJkYU5vZGVqcyBmcm9tICdAYXdzLWNkay9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ0Bhd3MtY2RrL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ0Bhd3MtY2RrL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnQGF3cy1jZGsvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWljcm9BcHBzU3Zjc1Byb3BzIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IGNkay5SZW1vdmFsUG9saWN5O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGJ1Y2tldEFwcHM6IHMzLklCdWNrZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBidWNrZXRBcHBzT0FJOiBjZi5PcmlnaW5BY2Nlc3NJZGVudGl0eTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYnVja2V0QXBwc1N0YWdpbmc6IHMzLklCdWNrZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgaHR0cEFwaTogYXBpZ3d5Lkh0dHBBcGk7XG5cbiAgcmVhZG9ubHkgYXBwRW52OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYXNzZXROYW1lUm9vdD86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYXNzZXROYW1lU3VmZml4Pzogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHMzU3RyaWN0QnVja2V0UG9saWN5PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgczNQb2xpY3lCeXBhc3NBUk9Bcz86IHN0cmluZ1tdO1xuICByZWFkb25seSBzM1BvbGljeUJ5cGFzc1ByaW5jaXBhbEFSTnM/OiBzdHJpbmdbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgcm9vdFBhdGhQcmVmaXg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1pY3JvQXBwc1N2Y3Mge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHRhYmxlOiBkeW5hbW9kYi5JVGFibGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZGVwbG95ZXJGdW5jOiBsYW1iZGEuSUZ1bmN0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgTWljcm9BcHBzU3ZjcyBleHRlbmRzIGNkay5Db25zdHJ1Y3QgaW1wbGVtZW50cyBJTWljcm9BcHBzU3ZjcyB7XG4gIHByaXZhdGUgX3RhYmxlOiBkeW5hbW9kYi5UYWJsZTtcbiAgcHVibGljIGdldCB0YWJsZSgpOiBkeW5hbW9kYi5JVGFibGUge1xuICAgIHJldHVybiB0aGlzLl90YWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgX2RlcGxveWVyRnVuYzogbGFtYmRhLkZ1bmN0aW9uO1xuICBwdWJsaWMgZ2V0IGRlcGxveWVyRnVuYygpOiBsYW1iZGEuSUZ1bmN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fZGVwbG95ZXJGdW5jO1xuICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNkay5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogTWljcm9BcHBzU3Zjc1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChwcm9wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BzIGNhbm5vdCBiZSB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBidWNrZXRBcHBzLFxuICAgICAgYnVja2V0QXBwc09BSSxcbiAgICAgIGJ1Y2tldEFwcHNTdGFnaW5nLFxuICAgICAgczNQb2xpY3lCeXBhc3NBUk9BcyA9IFtdLFxuICAgICAgczNQb2xpY3lCeXBhc3NQcmluY2lwYWxBUk5zID0gW10sXG4gICAgICBzM1N0cmljdEJ1Y2tldFBvbGljeSA9IGZhbHNlLFxuICAgICAgYXBwRW52LFxuICAgICAgaHR0cEFwaSxcbiAgICAgIHJlbW92YWxQb2xpY3ksXG4gICAgICBhc3NldE5hbWVSb290LFxuICAgICAgYXNzZXROYW1lU3VmZml4LFxuICAgICAgcm9vdFBhdGhQcmVmaXggPSAnJyxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBpZiAoczNTdHJpY3RCdWNrZXRQb2xpY3kgPT09IHRydWUpIHtcbiAgICAgIGlmIChzM1BvbGljeUJ5cGFzc0FST0FzLmxlbmd0aCA9PT0gMCAmJiBzM1BvbGljeUJ5cGFzc1ByaW5jaXBhbEFSTnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnczNTdHJpY3RCdWNrZXRQb2xpY3kgY2Fubm90IGJlIHRydWUgd2l0aG91dCBzcGVjaWZ5aW5nIGF0IGxlYXN0IG9uZSBzM1BvbGljeUJ5cGFzc0FST0FzIG9yIHMzUG9saWN5QnlwYXNzUHJpbmNpcGFsQVJOcycsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBEeW5hbW9EQiBUYWJsZVxuICAgIC8vXG4gICAgdGhpcy5fdGFibGUgPSBuZXcgZHluYW1vZGIuVGFibGUodGhpcywgJ3RhYmxlJywge1xuICAgICAgdGFibGVOYW1lOiBhc3NldE5hbWVSb290ID8gYCR7YXNzZXROYW1lUm9vdH0ke2Fzc2V0TmFtZVN1ZmZpeH1gIDogdW5kZWZpbmVkLFxuICAgICAgYmlsbGluZ01vZGU6IGR5bmFtb2RiLkJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCxcbiAgICAgIHBhcnRpdGlvbktleToge1xuICAgICAgICBuYW1lOiAnUEsnLFxuICAgICAgICB0eXBlOiBkeW5hbW9kYi5BdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgIH0sXG4gICAgICBzb3J0S2V5OiB7XG4gICAgICAgIG5hbWU6ICdTSycsXG4gICAgICAgIHR5cGU6IGR5bmFtb2RiLkF0dHJpYnV0ZVR5cGUuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHJlbW92YWxQb2xpY3ksXG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIFJvdXRlciBMYW1iZGEgRnVuY3Rpb25cbiAgICAvL1xuXG4gICAgLy8gQ3JlYXRlIFJvdXRlciBMYW1iZGEgRnVuY3Rpb25cbiAgICBsZXQgcm91dGVyRnVuYzogbGFtYmRhLkZ1bmN0aW9uO1xuICAgIGNvbnN0IHJvdXRlckZ1bmNQcm9wczogT21pdDxsYW1iZGEuRnVuY3Rpb25Qcm9wcywgJ2hhbmRsZXInIHwgJ2NvZGUnPiA9IHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYXNzZXROYW1lUm9vdCA/IGAke2Fzc2V0TmFtZVJvb3R9LXJvdXRlciR7YXNzZXROYW1lU3VmZml4fWAgOiB1bmRlZmluZWQsXG4gICAgICBtZW1vcnlTaXplOiAxNzY5LFxuICAgICAgbG9nUmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygxNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBOT0RFX0VOVjogYXBwRW52LFxuICAgICAgICBEQVRBQkFTRV9UQUJMRV9OQU1FOiB0aGlzLl90YWJsZS50YWJsZU5hbWUsXG4gICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICAgIFJPT1RfUEFUSF9QUkVGSVg6IHJvb3RQYXRoUHJlZml4LFxuICAgICAgfSxcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcgJiZcbiAgICAgIGV4aXN0c1N5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ21pY3JvYXBwcy1yb3V0ZXInLCAnZGlzdCcsICdpbmRleC5qcycpKVxuICAgICkge1xuICAgICAgLy8gVGhpcyBpcyBmb3IgbG9jYWwgZGV2XG4gICAgICByb3V0ZXJGdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAncm91dGVyLWZ1bmMnLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnbWljcm9hcHBzLXJvdXRlcicsICdkaXN0JykpLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIC4uLnJvdXRlckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXhpc3RzU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnbWljcm9hcHBzLXJvdXRlcicsICdpbmRleC5qcycpKSkge1xuICAgICAgLy8gVGhpcyBpcyBmb3IgYnVpbHQgYXBwcyBwYWNrYWdlZCB3aXRoIHRoZSBDREsgY29uc3RydWN0XG4gICAgICByb3V0ZXJGdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAncm91dGVyLWZ1bmMnLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnbWljcm9hcHBzLXJvdXRlcicpKSxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICAuLi5yb3V0ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIFJvdXRlciBMYW1iZGEgTGF5ZXJcbiAgICAgIGNvbnN0IHJvdXRlckRhdGFGaWxlcyA9IG5ldyBsYW1iZGEuTGF5ZXJWZXJzaW9uKHRoaXMsICdyb3V0ZXItdGVtcGxhdGVzJywge1xuICAgICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ21pY3JvYXBwcy1yb3V0ZXInLCAndGVtcGxhdGVzJyksXG4gICAgICAgICksXG4gICAgICAgIHJlbW92YWxQb2xpY3ksXG4gICAgICB9KTtcblxuICAgICAgcm91dGVyRnVuYyA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgJ3JvdXRlci1mdW5jJywge1xuICAgICAgICBlbnRyeTogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ21pY3JvYXBwcy1yb3V0ZXInLCAnc3JjJywgJ2luZGV4LnRzJyksXG4gICAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgICAgc291cmNlTWFwOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBsYXllcnM6IFtyb3V0ZXJEYXRhRmlsZXNdLFxuICAgICAgICAuLi5yb3V0ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHJlbW92YWxQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcm91dGVyRnVuYy5hcHBseVJlbW92YWxQb2xpY3kocmVtb3ZhbFBvbGljeSk7XG4gICAgfVxuICAgIGNvbnN0IHBvbGljeVJlYWRUYXJnZXQgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3MzOkdldE9iamVjdCddLFxuICAgICAgcmVzb3VyY2VzOiBbYCR7YnVja2V0QXBwcy5idWNrZXRBcm59LypgXSxcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJvdXRlciBvZiBbcm91dGVyRnVuY10pIHtcbiAgICAgIHJvdXRlci5hZGRUb1JvbGVQb2xpY3kocG9saWN5UmVhZFRhcmdldCk7XG4gICAgICAvLyBHaXZlIHRoZSBSb3V0ZXIgYWNjZXNzIHRvIER5bmFtb0RCIHRhYmxlXG4gICAgICB0aGlzLl90YWJsZS5ncmFudFJlYWREYXRhKHJvdXRlcik7XG4gICAgICB0aGlzLl90YWJsZS5ncmFudChyb3V0ZXIsICdkeW5hbW9kYjpEZXNjcmliZVRhYmxlJyk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBEZXBsb3llciBMYW1iZGEgRnVuY3Rpb25cbiAgICAvL1xuXG4gICAgLy8gQ3JlYXRlIERlcGxveWVyIExhbWJkYSBGdW5jdGlvblxuICAgIGNvbnN0IGlhbVJvbGVVcGxvYWROYW1lID0gYXNzZXROYW1lUm9vdFxuICAgICAgPyBgJHthc3NldE5hbWVSb290fS1kZXBsb3llci11cGxvYWQke2Fzc2V0TmFtZVN1ZmZpeH1gXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZXBsb3llckZ1bmNOYW1lID0gYXNzZXROYW1lUm9vdFxuICAgICAgPyBgJHthc3NldE5hbWVSb290fS1kZXBsb3llciR7YXNzZXROYW1lU3VmZml4fWBcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlcGxveWVyRnVuY1Byb3BzOiBPbWl0PGxhbWJkYS5GdW5jdGlvblByb3BzLCAnaGFuZGxlcicgfCAnY29kZSc+ID0ge1xuICAgICAgZnVuY3Rpb25OYW1lOiBkZXBsb3llckZ1bmNOYW1lLFxuICAgICAgbWVtb3J5U2l6ZTogMTc2OSxcbiAgICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoMTUpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgTk9ERV9FTlY6IGFwcEVudixcbiAgICAgICAgQVBJR1dZX0lEOiBodHRwQXBpLmh0dHBBcGlJZCxcbiAgICAgICAgREFUQUJBU0VfVEFCTEVfTkFNRTogdGhpcy5fdGFibGUudGFibGVOYW1lLFxuICAgICAgICBGSUxFU1RPUkVfU1RBR0lOR19CVUNLRVQ6IGJ1Y2tldEFwcHNTdGFnaW5nLmJ1Y2tldE5hbWUsXG4gICAgICAgIEZJTEVTVE9SRV9ERVNUX0JVQ0tFVDogYnVja2V0QXBwcy5idWNrZXROYW1lLFxuICAgICAgICBBV1NfTk9ERUpTX0NPTk5FQ1RJT05fUkVVU0VfRU5BQkxFRDogJzEnLFxuICAgICAgICBST09UX1BBVEhfUFJFRklYOiByb290UGF0aFByZWZpeCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnICYmXG4gICAgICBleGlzdHNTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICdtaWNyb2FwcHMtZGVwbG95ZXInLCAnZGlzdCcsICdpbmRleC5qcycpKVxuICAgICkge1xuICAgICAgLy8gVGhpcyBpcyBmb3IgbG9jYWwgZGV2XG4gICAgICB0aGlzLl9kZXBsb3llckZ1bmMgPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdkZXBsb3llci1mdW5jJywge1xuICAgICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ21pY3JvYXBwcy1kZXBsb3llcicsICdkaXN0JykpLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIC4uLmRlcGxveWVyRnVuY1Byb3BzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChleGlzdHNTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICdtaWNyb2FwcHMtZGVwbG95ZXInLCAnaW5kZXguanMnKSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yIGJ1aWx0IGFwcHMgcGFja2FnZWQgd2l0aCB0aGUgQ0RLIGNvbnN0cnVjdFxuICAgICAgdGhpcy5fZGVwbG95ZXJGdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnZGVwbG95ZXItZnVuYycsIHtcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICdtaWNyb2FwcHMtZGVwbG95ZXInKSksXG4gICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgLi4uZGVwbG95ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVwbG95ZXJGdW5jID0gbmV3IGxhbWJkYU5vZGVqcy5Ob2RlanNGdW5jdGlvbih0aGlzLCAnZGVwbG95ZXItZnVuYycsIHtcbiAgICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICdtaWNyb2FwcHMtZGVwbG95ZXInLCAnc3JjJywgJ2luZGV4LnRzJyksXG4gICAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgICAgc291cmNlTWFwOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAuLi5kZXBsb3llckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocmVtb3ZhbFBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9kZXBsb3llckZ1bmMuYXBwbHlSZW1vdmFsUG9saWN5KHJlbW92YWxQb2xpY3kpO1xuICAgIH1cbiAgICAvLyBHaXZlIHRoZSBEZXBsb3llciBhY2Nlc3MgdG8gRHluYW1vREIgdGFibGVcbiAgICB0aGlzLl90YWJsZS5ncmFudFJlYWRXcml0ZURhdGEodGhpcy5fZGVwbG95ZXJGdW5jKTtcbiAgICB0aGlzLl90YWJsZS5ncmFudCh0aGlzLl9kZXBsb3llckZ1bmMsICdkeW5hbW9kYjpEZXNjcmliZVRhYmxlJyk7XG5cbiAgICAvL1xuICAgIC8vIERlbG95ZXIgdXBsb2FkIHRlbXAgcm9sZVxuICAgIC8vIERlcGxveWVyIGFzc3VtZXMgdGhpcyByb2xlIHdpdGggYSBsaW1pdGVkIHBvbGljeSB0byBnZW5lcmF0ZVxuICAgIC8vIGFuIFNUUyB0ZW1wIHRva2VuIHRvIHJldHVybiB0byBtaWNyb2FwcHMtcHVibGlzaCBmb3IgdGhlIHVwbG9hZC5cbiAgICAvL1xuICAgIGNvbnN0IGlhbVJvbGVVcGxvYWQgPSBuZXcgaWFtLlJvbGUodGhpcywgJ2RlcGxveWVyLXVwbG9hZC1yb2xlJywge1xuICAgICAgcm9sZU5hbWU6IGlhbVJvbGVVcGxvYWROYW1lLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgdXBsb2FkUG9saWN5OiBuZXcgaWFtLlBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsnczM6TGlzdEJ1Y2tldCddLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtidWNrZXRBcHBzU3RhZ2luZy5idWNrZXRBcm5dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsnczM6UHV0T2JqZWN0JywgJ3MzOkdldE9iamVjdCcsICdzMzpBYm9ydE11bHRpcGFydFVwbG9hZCddLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzU3RhZ2luZy5idWNrZXRBcm59LypgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIGFzc3VtZWRCeTogdGhpcy5fZGVwbG95ZXJGdW5jLmdyYW50UHJpbmNpcGFsLFxuICAgIH0pO1xuICAgIHRoaXMuX2RlcGxveWVyRnVuYy5hZGRFbnZpcm9ubWVudCgnVVBMT0FEX1JPTEVfTkFNRScsIGlhbVJvbGVVcGxvYWQucm9sZU5hbWUpO1xuXG4gICAgLy9cbiAgICAvLyBVcGRhdGUgUzMgcGVybWlzc2lvbnNcbiAgICAvL1xuICAgIC8vIENyZWF0ZSBQcmluY2lwYWxBUk4gTGlzdFxuICAgIGNvbnN0IHMzUG9saWN5QnlwYXNzQXJuUHJpbmNpcGFsczogaWFtLkFyblByaW5jaXBhbFtdID0gW107XG4gICAgZm9yIChjb25zdCBhcm5QcmluY2lwYWwgb2YgczNQb2xpY3lCeXBhc3NQcmluY2lwYWxBUk5zKSB7XG4gICAgICBzM1BvbGljeUJ5cGFzc0FyblByaW5jaXBhbHMucHVzaChuZXcgaWFtLkFyblByaW5jaXBhbChhcm5QcmluY2lwYWwpKTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIEFST0EgTGlzdCB0aGF0IG1hdGNoZXMgYXNzdW1lZCBzZXNzaW9uc1xuICAgIGNvbnN0IHMzUG9saWN5QnlwYXNzQVJPQU1hdGNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBhcm9hIG9mIHMzUG9saWN5QnlwYXNzQVJPQXMpIHtcbiAgICAgIHMzUG9saWN5QnlwYXNzQVJPQU1hdGNoZXMucHVzaChgJHthcm9hfToqYCk7XG4gICAgfVxuICAgIC8vIERlbnkgYXBwcyBmcm9tIHJlYWRpbmc6XG4gICAgLy8gLSBJZiB0aGV5IGFyZSBtaXNzaW5nIHRoZSBtaWNyb2FwcC1uYW1lIHRhZ1xuICAgIC8vIC0gQW55dGhpbmcgb3V0c2lkZSBvZiB0aGUgZm9sZGVyIHRoYXQgbWF0Y2hlcyB0aGVpciBtaWNyb2FwcC1uYW1lIHRhZ1xuICAgIGNvbnN0IHBvbGljeURlbnlQcmVmaXhPdXRzaWRlVGFnID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnZGVueS1wcmVmaXgtb3V0c2lkZS1taWNyb2FwcC1uYW1lLXRhZycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuREVOWSxcbiAgICAgIGFjdGlvbnM6IFsnczM6KiddLFxuICAgICAgbm90UHJpbmNpcGFsczogW1xuICAgICAgICBuZXcgaWFtLkNhbm9uaWNhbFVzZXJQcmluY2lwYWwoXG4gICAgICAgICAgYnVja2V0QXBwc09BSS5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlTM0Nhbm9uaWNhbFVzZXJJZCxcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IGlhbS5BY2NvdW50Um9vdFByaW5jaXBhbCgpLFxuICAgICAgICAuLi5zM1BvbGljeUJ5cGFzc0FyblByaW5jaXBhbHMsXG4gICAgICAgIHRoaXMuX2RlcGxveWVyRnVuYy5ncmFudFByaW5jaXBhbCxcbiAgICAgIF0sXG4gICAgICBub3RSZXNvdXJjZXM6IFtcbiAgICAgICAgYCR7YnVja2V0QXBwcy5idWNrZXRBcm59L1xcJHthd3M6UHJpbmNpcGFsVGFnL21pY3JvYXBwLW5hbWV9LypgLFxuICAgICAgICBidWNrZXRBcHBzLmJ1Y2tldEFybixcbiAgICAgIF0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIE51bGw6IHsgJ2F3czpQcmluY2lwYWxUYWcvbWljcm9hcHAtbmFtZSc6ICdmYWxzZScgfSxcbiAgICAgICAgLy8gU3RyaW5nTm90TGlrZTogeydhd3M6J31cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKHJlbW92YWxQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcG9saWN5RGVueVByZWZpeE91dHNpZGVUYWcuYWRkQ29uZGl0aW9uKFxuICAgICAgICAvLyBBbGxvd3MgdGhlIERlbGV0YWJsZUJ1Y2tldCBMYW1iZGEgdG8gZGVsZXRlIGl0ZW1zIGluIHRoZSBidWNrZXRzXG4gICAgICAgICdTdHJpbmdOb3RMaWtlJyxcbiAgICAgICAgeyAnYXdzOlByaW5jaXBhbFRhZy9hcHBsaWNhdGlvbic6IGAke2Nkay5TdGFjay5vZih0aGlzKS5zdGFja05hbWV9LWNvcmUqYCB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcG9saWN5RGVueU1pc3NpbmdUYWcgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdkZW55LW1pc3NpbmctbWljcm9hcHAtbmFtZS10YWcnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkRFTlksXG4gICAgICBhY3Rpb25zOiBbJ3MzOionXSxcbiAgICAgIG5vdFByaW5jaXBhbHM6IFtcbiAgICAgICAgbmV3IGlhbS5DYW5vbmljYWxVc2VyUHJpbmNpcGFsKFxuICAgICAgICAgIGJ1Y2tldEFwcHNPQUkuY2xvdWRGcm9udE9yaWdpbkFjY2Vzc0lkZW50aXR5UzNDYW5vbmljYWxVc2VySWQsXG4gICAgICAgICksXG4gICAgICAgIG5ldyBpYW0uQWNjb3VudFJvb3RQcmluY2lwYWwoKSxcbiAgICAgICAgLy8gRXhjbHVkZSB0aGUgRGVwbG95ZXIgRnVuY3Rpb24gZGlyZWN0bHlcbiAgICAgICAgdGhpcy5fZGVwbG95ZXJGdW5jLmdyYW50UHJpbmNpcGFsLFxuICAgICAgICAvLyAyMDIxLTEyLTA0IC0gTm90IDEwMCUgc3VyZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgbmVlZGVkLi4uXG4gICAgICAgIC8vIExldCdzIHRlc3QgdGhpcyBhbmQgcmVtb3ZlIGlmIGFjdHVhbGx5IG5vdCBuZWNlc3NhcnlcbiAgICAgICAgbmV3IGlhbS5Bcm5QcmluY2lwYWwoXG4gICAgICAgICAgYGFybjphd3M6c3RzOjoke2Nkay5Bd3MuQUNDT1VOVF9JRH06YXNzdW1lZC1yb2xlLyR7dGhpcy5fZGVwbG95ZXJGdW5jLnJvbGU/LnJvbGVOYW1lfS8ke3RoaXMuX2RlcGxveWVyRnVuYy5mdW5jdGlvbk5hbWV9YCxcbiAgICAgICAgKSxcbiAgICAgICAgLi4uczNQb2xpY3lCeXBhc3NBcm5QcmluY2lwYWxzLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogW2Ake2J1Y2tldEFwcHMuYnVja2V0QXJufS8qYCwgYnVja2V0QXBwcy5idWNrZXRBcm5dLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBOdWxsOiB7ICdhd3M6UHJpbmNpcGFsVGFnL21pY3JvYXBwLW5hbWUnOiAndHJ1ZScgfSxcbiAgICAgICAgLy8gTm90ZTogVGhpcyBBUk9BIG11c3QgYmUgc3BlY2lmaWVkIHRvIHByZXZlbnQgdGhpcyBwb2xpY3kgZnJvbSBsb2NraW5nXG4gICAgICAgIC8vIG91dCBub24tcm9vdCBzZXNzaW9ucyB0aGF0IGhhdmUgYXNzdW1lZCB0aGUgYWRtaW4gcm9sZS5cbiAgICAgICAgLy8gVGhlIG5vdFByaW5jaXBhbHMgd2lsbCBvbmx5IG1hdGNoIHRoZSByb2xlIG5hbWUgZXhhY3RseSBhbmQgd2lsbCBub3QgbWF0Y2hcbiAgICAgICAgLy8gYW55IHNlc3Npb24gdGhhdCBoYXMgYXNzdW1lZCB0aGUgcm9sZSBzaW5jZSBub3RQcmluY2lwYWxzIGRvZXMgbm90IGFsbG93XG4gICAgICAgIC8vIHdpbGRjYXJkIG1hdGNoZXMgYW5kIGRvZXMgbm90IGRvIHRoZW0gaW1wbGljaXRseSBlaXRoZXIuXG4gICAgICAgIC8vIFRoZSBBUk9BIG11c3QgYmUgdXNlZCBiZWNhdXNlIHRoZXJlIGFyZSBvbmx5IDMgUHJpbmNpcGFsIHZhcmlhYmxlczpcbiAgICAgICAgLy8gIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfdmFyaWFibGVzLmh0bWwjcHJpbmNpcGFsdGFibGVcbiAgICAgICAgLy8gIGF3czp1c2VybmFtZSwgYXdzOnVzZXJpZCwgYXdzOlByaW5jaXBhbFRhZ1xuICAgICAgICAvLyBGb3IgYW4gYXNzdW1lZCByb2xlLCBhd3M6dXNlcm5hbWUgaXMgYmxhbmssIGF3czp1c2VyaWQgaXM6XG4gICAgICAgIC8vICBbdW5pcXVlIGlkIEFLQSBBUk9BIGZvciBSb2xlXTpbc2Vzc2lvbiBuYW1lXVxuICAgICAgICAvLyBUYWJsZSBvZiB1bmlxdWUgSUQgcHJlZml4ZXMgc3VjaCBhcyBBUk9BOlxuICAgICAgICAvLyAgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9pZGVudGlmaWVycy5odG1sI2lkZW50aWZpZXJzLXByZWZpeGVzXG4gICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSByb2xlIGlzIHNpbXBseSBub3QgYXZhaWxhYmxlIGFuZCBpZiBpdCB3YXNcbiAgICAgICAgLy8gd2UnZCBuZWVkIHRvIHdyaXRlIGEgY29tcGxpY2F0ZWQgY29tcGFyaXNvbiB0byBtYWtlIHN1cmVcbiAgICAgICAgLy8gdGhhdCB3ZSBkaWRuJ3QgZXhjbHVkZSB0aGUgRGVueSB0YWcgZnJvbSByb2xlcyBpbiBvdGhlciBhY2NvdW50cy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVG8gZ2V0IHRoZSBBUk9BIHdpdGggdGhlIEFXUyBDTEk6XG4gICAgICAgIC8vICAgYXdzIGlhbSBnZXQtcm9sZSAtLXJvbGUtbmFtZSBST0xFLU5BTUVcbiAgICAgICAgLy8gICBhd3MgaWFtIGdldC11c2VyIC3igJN1c2VyLW5hbWUgVVNFUi1OQU1FXG4gICAgICAgIFN0cmluZ05vdExpa2U6IHsgJ2F3czp1c2VyaWQnOiBbY2RrLkF3cy5BQ0NPVU5UX0lELCAuLi5zM1BvbGljeUJ5cGFzc0FST0FNYXRjaGVzXSB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAocmVtb3ZhbFBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwb2xpY3lEZW55TWlzc2luZ1RhZy5hZGRDb25kaXRpb24oXG4gICAgICAgIC8vIEFsbG93cyB0aGUgRGVsZXRhYmxlQnVja2V0IExhbWJkYSB0byBkZWxldGUgaXRlbXMgaW4gdGhlIGJ1Y2tldHNcbiAgICAgICAgJ1N0cmluZ05vdExpa2UnLFxuICAgICAgICB7ICdhd3M6UHJpbmNpcGFsVGFnL2FwcGxpY2F0aW9uJzogYCR7Y2RrLlN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX0tY29yZSpgIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwb2xpY3lDbG91ZEZyb250QWNjZXNzID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnY2xvdWRmcm9udC1vYWktYWNjZXNzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0JywgJ3MzOkxpc3RCdWNrZXQnXSxcbiAgICAgIHByaW5jaXBhbHM6IFtcbiAgICAgICAgbmV3IGlhbS5DYW5vbmljYWxVc2VyUHJpbmNpcGFsKFxuICAgICAgICAgIGJ1Y2tldEFwcHNPQUkuY2xvdWRGcm9udE9yaWdpbkFjY2Vzc0lkZW50aXR5UzNDYW5vbmljYWxVc2VySWQsXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbYCR7YnVja2V0QXBwcy5idWNrZXRBcm59LypgLCBidWNrZXRBcHBzLmJ1Y2tldEFybl0sXG4gICAgfSk7XG5cbiAgICBpZiAoYnVja2V0QXBwcy5wb2xpY3kgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZG9jdW1lbnQgPSBuZXcgczMuQnVja2V0UG9saWN5KHRoaXMsICdzMy1wb2xpY3knLCB7XG4gICAgICAgIGJ1Y2tldDogYnVja2V0QXBwcyxcbiAgICAgIH0pLmRvY3VtZW50O1xuICAgICAgZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhwb2xpY3lDbG91ZEZyb250QWNjZXNzKTtcblxuICAgICAgaWYgKHMzU3RyaWN0QnVja2V0UG9saWN5KSB7XG4gICAgICAgIGRvY3VtZW50LmFkZFN0YXRlbWVudHMocG9saWN5RGVueVByZWZpeE91dHNpZGVUYWcpO1xuICAgICAgICBkb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeURlbnlNaXNzaW5nVGFnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYnVja2V0QXBwcy5wb2xpY3kuZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhwb2xpY3lDbG91ZEZyb250QWNjZXNzKTtcblxuICAgICAgaWYgKHMzU3RyaWN0QnVja2V0UG9saWN5KSB7XG4gICAgICAgIGJ1Y2tldEFwcHMucG9saWN5LmRvY3VtZW50LmFkZFN0YXRlbWVudHMocG9saWN5RGVueVByZWZpeE91dHNpZGVUYWcpO1xuICAgICAgICBidWNrZXRBcHBzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeURlbnlNaXNzaW5nVGFnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbGxvdyB0aGUgTGFtYmRhIHRvIHJlYWQgZnJvbSB0aGUgc3RhZ2luZyBidWNrZXRcbiAgICBjb25zdCBwb2xpY3lSZWFkTGlzdFN0YWdpbmcgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAvLyBGSVhNRTogQWxsb3cgRGVwbG95ZXIgdG8gZGVsZXRlIGZyb20gU3RhZ2luZyBidWNrZXRcbiAgICAgIGFjdGlvbnM6IFsnczM6RGVsZXRlT2JqZWN0JywgJ3MzOkdldE9iamVjdCcsICdzMzpMaXN0QnVja2V0J10sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzU3RhZ2luZy5idWNrZXRBcm59LypgLCBidWNrZXRBcHBzU3RhZ2luZy5idWNrZXRBcm5dLFxuICAgIH0pO1xuICAgIHRoaXMuX2RlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5UmVhZExpc3RTdGFnaW5nKTtcblxuICAgIC8vIEFsbG93IHRoZSBMYW1iZGEgdG8gd3JpdGUgdG8gdGhlIHRhcmdldCBidWNrZXQgYW5kIGRlbGV0ZVxuICAgIGNvbnN0IHBvbGljeVJlYWRXcml0ZUxpc3RUYXJnZXQgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3MzOkRlbGV0ZU9iamVjdCcsICdzMzpHZXRPYmplY3QnLCAnczM6UHV0T2JqZWN0JywgJ3MzOkxpc3RCdWNrZXQnXSxcbiAgICAgIHJlc291cmNlczogW2Ake2J1Y2tldEFwcHMuYnVja2V0QXJufS8qYCwgYnVja2V0QXBwcy5idWNrZXRBcm5dLFxuICAgIH0pO1xuICAgIHRoaXMuX2RlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5UmVhZFdyaXRlTGlzdFRhcmdldCk7XG5cbiAgICAvLyBBbGxvdyB0aGUgZGVwbG95ZXIgdG8gZ2V0IGEgdGVtcG9yYXJ5IFNUUyB0b2tlblxuICAgIGNvbnN0IHBvbGljeUdldFNUU1Rva2VuID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydzdHM6R2V0RmVkZXJhdGlvblRva2VuJ10sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pO1xuICAgIHRoaXMuX2RlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5R2V0U1RTVG9rZW4pO1xuXG4gICAgLy8gQWxsb3cgdGhlIGRlcGxveWVyIHRvIGFzc3VtZSB0aGUgdXBsb2FkIHJvbGVcbiAgICBjb25zdCBwb2xpY3lBc3N1bWVVcGxvYWQgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3N0czpBc3N1bWVSb2xlJ10sXG4gICAgICByZXNvdXJjZXM6IFtpYW1Sb2xlVXBsb2FkLnJvbGVBcm5dLFxuICAgIH0pO1xuICAgIHRoaXMuX2RlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5QXNzdW1lVXBsb2FkKTtcblxuICAgIC8vXG4gICAgLy8gR2l2ZSBEZXBsb3llciBwZXJtaXNzaW9ucyB0byBjcmVhdGUgcm91dGVzIGFuZCBpbnRlZ3JhdGlvbnNcbiAgICAvLyBvbiB0aGUgQVBJIEdhdGV3YXkgQVBJLlxuICAgIC8vXG5cbiAgICAvLyBHcmFudCB0aGUgYWJpbGl0eSB0byBMaXN0IGFsbCBBUElzICh3ZSBoYXZlIHRvIGZpbmQgaXQpXG4gICAgY29uc3QgcG9saWN5QVBJTGlzdCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnYXBpZ2F0ZXdheTpHRVQnXSxcbiAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOmFwaWdhdGV3YXk6JHtjZGsuQXdzLlJFR0lPTn06Oi9hcGlzYF0sXG4gICAgfSk7XG4gICAgdGhpcy5fZGVwbG95ZXJGdW5jLmFkZFRvUm9sZVBvbGljeShwb2xpY3lBUElMaXN0KTtcbiAgICAvLyBHcmFudCBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgQVBJIHdlIGNyZWF0ZWRcbiAgICBjb25zdCBwb2xpY3lBUElNYW5hZ2UgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2FwaWdhdGV3YXk6KiddLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIGBhcm46YXdzOmFwaWdhdGV3YXk6JHtjZGsuQXdzLlJFR0lPTn06JHtjZGsuQXdzLkFDQ09VTlRfSUR9OiR7aHR0cEFwaS5odHRwQXBpSWR9LypgLFxuICAgICAgICBgYXJuOmF3czphcGlnYXRld2F5OiR7Y2RrLkF3cy5SRUdJT059OjovYXBpcy8ke2h0dHBBcGkuaHR0cEFwaUlkfS9pbnRlZ3JhdGlvbnMvKmAsXG4gICAgICAgIGBhcm46YXdzOmFwaWdhdGV3YXk6JHtjZGsuQXdzLlJFR0lPTn06Oi9hcGlzLyR7aHR0cEFwaS5odHRwQXBpSWR9L2ludGVncmF0aW9uc2AsXG4gICAgICAgIGBhcm46YXdzOmFwaWdhdGV3YXk6JHtjZGsuQXdzLlJFR0lPTn06Oi9hcGlzLyR7aHR0cEFwaS5odHRwQXBpSWR9L3JvdXRlc2AsXG4gICAgICAgIGBhcm46YXdzOmFwaWdhdGV3YXk6JHtjZGsuQXdzLlJFR0lPTn06Oi9hcGlzLyR7aHR0cEFwaS5odHRwQXBpSWR9L3JvdXRlcy8qYCxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgdGhpcy5fZGVwbG95ZXJGdW5jLmFkZFRvUm9sZVBvbGljeShwb2xpY3lBUElNYW5hZ2UpO1xuICAgIC8vIEdyYW50IGZ1bGwgY29udHJvbCBvdmVyIGxhbWJkYXMgdGhhdCBpbmRpY2F0ZSB0aGV5IGFyZSBtaWNyb2FwcHNcbiAgICBjb25zdCBwb2xpY3lBUElNYW5hZ2VMYW1iZGFzID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydsYW1iZGE6KiddLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIGBhcm46YXdzOmxhbWJkYToke2Nkay5Bd3MuUkVHSU9OfToke2Nkay5Bd3MuQUNDT1VOVF9JRH06ZnVuY3Rpb246KmAsXG4gICAgICAgIGBhcm46YXdzOmxhbWJkYToke2Nkay5Bd3MuUkVHSU9OfToke2Nkay5Bd3MuQUNDT1VOVF9JRH06ZnVuY3Rpb246KjoqYCxcbiAgICAgIF0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsc0lmRXhpc3RzOiB7ICdhd3M6UmVzb3VyY2VUYWcvbWljcm9hcHAtbWFuYWdlZCc6ICd0cnVlJyB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLl9kZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeUFQSU1hbmFnZUxhbWJkYXMpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludGVncmF0aW9uIGZvciB0aGUgUm91dGVyXG4gICAgLy8gQWxsIHRyYWZmaWMgd2l0aG91dCBhbm90aGVyIHJvdXRlIGdvZXMgdG8gdGhlIFJvdXRlclxuICAgIGNvbnN0IGludFJvdXRlciA9IG5ldyBhcGlnd3lpbnQuSHR0cExhbWJkYUludGVncmF0aW9uKCdyb3V0ZXItaW50ZWdyYXRpb24nLCByb3V0ZXJGdW5jKTtcbiAgICBuZXcgYXBpZ3d5Lkh0dHBSb3V0ZSh0aGlzLCAncm91dGUtZGVmYXVsdCcsIHtcbiAgICAgIGh0dHBBcGksXG4gICAgICByb3V0ZUtleTogYXBpZ3d5Lkh0dHBSb3V0ZUtleS5ERUZBVUxULFxuICAgICAgaW50ZWdyYXRpb246IGludFJvdXRlcixcbiAgICB9KTtcbiAgfVxufVxuIl19
|