cdk-nuxt 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -0
- package/lib/stack/nuxt-app-stack-props.d.ts +0 -9
- package/lib/stack/nuxt-app-stack-props.js +1 -1
- package/lib/stack/nuxt-app-stack-props.ts +0 -11
- package/lib/stack/server/nuxt-server-app-stack.d.ts +41 -0
- package/lib/stack/server/nuxt-server-app-stack.js +10 -17
- package/lib/stack/server/nuxt-server-app-stack.ts +56 -18
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -55,6 +55,87 @@ yarn add aws-cdk@2.88.0 --dev # CDK cli with this exact version for the deployme
|
|
|
55
55
|
|
|
56
56
|
> :warning: It's recommended using a `.env` file or another secrets file to import the sensitive secrets into the `stack/index.ts` file.
|
|
57
57
|
|
|
58
|
+
## Configuration
|
|
59
|
+
|
|
60
|
+
The `NuxtServerAppStack` construct can be configured via the following props:
|
|
61
|
+
|
|
62
|
+
### project: string
|
|
63
|
+
A string identifier for the project the Nuxt app is part of.
|
|
64
|
+
A project might have multiple different services.
|
|
65
|
+
|
|
66
|
+
### service: string
|
|
67
|
+
A string identifier for the project's service the Nuxt app is created for.
|
|
68
|
+
This can be seen as the name of the Nuxt app.
|
|
69
|
+
|
|
70
|
+
### environment: string
|
|
71
|
+
A string to identify the environment of the Nuxt app. This enables us
|
|
72
|
+
to deploy multiple different environments of the same Nuxt app, e.g., production and development.
|
|
73
|
+
|
|
74
|
+
### domain: string
|
|
75
|
+
The domain (without the protocol) at which the Nuxt app shall be publicly available.
|
|
76
|
+
A DNS record will be automatically created in Route53 for the domain.
|
|
77
|
+
This also supports subdomains.
|
|
78
|
+
Examples: "example.com", "sub.example.com"
|
|
79
|
+
|
|
80
|
+
### hostedZoneId: string
|
|
81
|
+
The id of the hosted zone to create a DNS record for the specified domain.
|
|
82
|
+
|
|
83
|
+
### globalTlsCertificateArn: string
|
|
84
|
+
The ARN of the certificate to use on CloudFront for the Nuxt app to make it accessible via HTTPS.
|
|
85
|
+
The certificate must be issued for the specified domain in us-east-1 (global) regardless of the
|
|
86
|
+
region specified via 'env.region' as CloudFront only works globally.
|
|
87
|
+
|
|
88
|
+
### regionalTlsCertificateArn: string
|
|
89
|
+
The ARN of the certificate to use at the ApiGateway for the Nuxt app to make it accessible via the custom domain
|
|
90
|
+
and to provide the custom domain to the Nuxt app via the 'Host' header for server side rendering use cases.
|
|
91
|
+
The certificate must be issued in the same region as specified via 'env.region' as ApiGateway works regionally.
|
|
92
|
+
|
|
93
|
+
### entrypoint?: string
|
|
94
|
+
The file name (without extension) of the Lambda entrypoint within the 'server' directory exporting a handler.
|
|
95
|
+
Defaults to "index".
|
|
96
|
+
|
|
97
|
+
### entrypointEnv?: string
|
|
98
|
+
A JSON serialized string of environment variables to pass to the Lambda function.
|
|
99
|
+
|
|
100
|
+
### memorySize?: number
|
|
101
|
+
The memory size to apply to the Nuxt app's Lambda.
|
|
102
|
+
Defaults to 1792MB (optimized for costs and performance for standard Nuxt apps).
|
|
103
|
+
|
|
104
|
+
### enableTracing?: boolean
|
|
105
|
+
Whether to enable AWS X-Ray for the Nuxt Lambda function.
|
|
106
|
+
|
|
107
|
+
### enableSitemap?: boolean
|
|
108
|
+
Whether to enable a global Sitemap bucket which is permanently accessible through multiple deployments.
|
|
109
|
+
|
|
110
|
+
### allowHeaders?: string[]
|
|
111
|
+
An array of headers to pass to the Nuxt app on SSR requests.
|
|
112
|
+
The more headers are passed, the weaker the cache performance will be, as the cache key
|
|
113
|
+
is based on the headers.
|
|
114
|
+
No headers are passed by default.
|
|
115
|
+
|
|
116
|
+
### allowCookies?: string[]
|
|
117
|
+
An array of cookies to pass to the Nuxt app on SSR requests.
|
|
118
|
+
The more cookies are passed, the weaker the cache performance will be, as the cache key
|
|
119
|
+
is based on the cookies.
|
|
120
|
+
No cookies are passed by default.
|
|
121
|
+
|
|
122
|
+
### allowQueryParams?: string[]
|
|
123
|
+
An array of query param keys to pass to the Nuxt app on SSR requests.
|
|
124
|
+
The more query params are passed, the weaker the cache performance will be, as the cache key
|
|
125
|
+
is based on the query params.
|
|
126
|
+
Note that this config can not be combined with {@see denyQueryParams}.
|
|
127
|
+
If both are specified, the {@see denyQueryParams} will be ignored.
|
|
128
|
+
All query params are passed by default.
|
|
129
|
+
|
|
130
|
+
### denyQueryParams?: string[]
|
|
131
|
+
An array of query param keys to deny passing to the Nuxt app on SSR requests.
|
|
132
|
+
It might be useful to prevent specific external query params, e.g., fbclid, utm_campaign, ...,
|
|
133
|
+
to improve cache performance, as the cache key is based on the specified query params.
|
|
134
|
+
Note that this config can not be combined with {@see allowQueryParams}.
|
|
135
|
+
If both are specified, the {@see denyQueryParams} will be ignored.
|
|
136
|
+
All query params are passed by default.
|
|
137
|
+
|
|
138
|
+
|
|
58
139
|
## Build and Deploy
|
|
59
140
|
|
|
60
141
|
After the installation and the setup you are already good to go to build the Nuxt app and to deploy it to AWS with this package.
|
|
@@ -35,13 +35,4 @@ export interface NuxtAppStackProps extends StackProps {
|
|
|
35
35
|
* region specified via 'env.region' as CloudFront only works globally.
|
|
36
36
|
*/
|
|
37
37
|
readonly globalTlsCertificateArn: string;
|
|
38
|
-
/**
|
|
39
|
-
* The file name (without extension) of the Lambda entrypoint within the 'server' directory exporting a handler.
|
|
40
|
-
* Defaults to "index".
|
|
41
|
-
*/
|
|
42
|
-
readonly entrypoint?: string;
|
|
43
|
-
/**
|
|
44
|
-
* A JSON serialized string of environment variables to pass to the Lambda function.
|
|
45
|
-
*/
|
|
46
|
-
readonly entrypointEnv?: string;
|
|
47
38
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnV4dC1hcHAtc3RhY2stcHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudXh0LWFwcC1zdGFjay1wcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTdGFja1Byb3BzfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBjb21tb24gcHJvcHMgcmVxdWlyZWQgdG8gZGVwbG95IE51eHQgYXBwcyBvbiBBV1MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnV4dEFwcFN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcblxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9qZWN0IHRoZSBOdXh0IGFwcCBpcyBwYXJ0IG9mLlxuICAgICAqIEEgcHJvamVjdCBtaWdodCBoYXZlIG11bHRpcGxlIGRpZmZlcmVudCBzZXJ2aWNlcy5cbiAgICAgKi9cbiAgICByZWFkb25seSBwcm9qZWN0OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgcHJvamVjdCdzIHNlcnZpY2UgdGhlIE51eHQgYXBwIGlzIGNyZWF0ZWQgZm9yLlxuICAgICAqIFRoaXMgY2FuIGJlIHNlZW4gYXMgdGhlIG5hbWUgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHRvIGlkZW50aWZ5IHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgTnV4dCBhcHAuIFRoaXMgZW5hYmxlcyB1c1xuICAgICAqIHRvIGRlcGxveSBtdWx0aXBsZSBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIG9mIHRoZSBzYW1lIE51eHQgYXBwLCBlLmcuLCBwcm9kdWN0aW9uIGFuZCBkZXZlbG9wbWVudC5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbnZpcm9ubWVudDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRvbWFpbiAod2l0aG91dCB0aGUgcHJvdG9jb2wpIGF0IHdoaWNoIHRoZSBOdXh0IGFwcCBzaGFsbCBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICogQSBETlMgcmVjb3JkIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGluIFJvdXRlNTMgZm9yIHRoZSBkb21haW4uXG4gICAgICogVGhpcyBhbHNvIHN1cHBvcnRzIHN1YmRvbWFpbnMuXG4gICAgICogRXhhbXBsZXM6IFwiZXhhbXBsZS5jb21cIiwgXCJzdWIuZXhhbXBsZS5jb21cIlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBob3N0ZWQgem9uZSB0byBjcmVhdGUgYSBETlMgcmVjb3JkIGZvciB0aGUgc3BlY2lmaWVkIGRvbWFpbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBob3N0ZWRab25lSWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBBUk4gb2YgdGhlIGNlcnRpZmljYXRlIHRvIHVzZSBvbiBDbG91ZEZyb250IGZvciB0aGUgTnV4dCBhcHAgdG8gbWFrZSBpdCBhY2Nlc3NpYmxlIHZpYSBIVFRQUy5cbiAgICAgKiBUaGUgY2VydGlmaWNhdGUgbXVzdCBiZSBpc3N1ZWQgZm9yIHRoZSBzcGVjaWZpZWQgZG9tYWluIGluIHVzLWVhc3QtMSAoZ2xvYmFsKSByZWdhcmRsZXNzIG9mIHRoZVxuICAgICAqIHJlZ2lvbiBzcGVjaWZpZWQgdmlhICdlbnYucmVnaW9uJyBhcyBDbG91ZEZyb250IG9ubHkgd29ya3MgZ2xvYmFsbHkuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZ2xvYmFsVGxzQ2VydGlmaWNhdGVBcm46IHN0cmluZztcblxufSJdfQ==
|
|
@@ -43,15 +43,4 @@ export interface NuxtAppStackProps extends StackProps {
|
|
|
43
43
|
*/
|
|
44
44
|
readonly globalTlsCertificateArn: string;
|
|
45
45
|
|
|
46
|
-
/**
|
|
47
|
-
* The file name (without extension) of the Lambda entrypoint within the 'server' directory exporting a handler.
|
|
48
|
-
* Defaults to "index".
|
|
49
|
-
*/
|
|
50
|
-
readonly entrypoint?: string;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* A JSON serialized string of environment variables to pass to the Lambda function.
|
|
54
|
-
*/
|
|
55
|
-
readonly entrypointEnv?: string;
|
|
56
|
-
|
|
57
46
|
}
|
|
@@ -12,6 +12,15 @@ export interface NuxtServerAppStackProps extends NuxtAppStackProps {
|
|
|
12
12
|
* The certificate must be issued in the same region as specified via 'env.region' as ApiGateway works regionally.
|
|
13
13
|
*/
|
|
14
14
|
readonly regionalTlsCertificateArn: string;
|
|
15
|
+
/**
|
|
16
|
+
* The file name (without extension) of the Lambda entrypoint within the 'server' directory exporting a handler.
|
|
17
|
+
* Defaults to "index".
|
|
18
|
+
*/
|
|
19
|
+
readonly entrypoint?: string;
|
|
20
|
+
/**
|
|
21
|
+
* A JSON serialized string of environment variables to pass to the Lambda function.
|
|
22
|
+
*/
|
|
23
|
+
readonly entrypointEnv?: string;
|
|
15
24
|
/**
|
|
16
25
|
* The memory size to apply to the Nuxt app's Lambda.
|
|
17
26
|
* Defaults to 1792MB (optimized for costs and performance for standard Nuxt apps).
|
|
@@ -25,6 +34,38 @@ export interface NuxtServerAppStackProps extends NuxtAppStackProps {
|
|
|
25
34
|
* Whether to enable a global Sitemap bucket which is permanently accessible through multiple deployments.
|
|
26
35
|
*/
|
|
27
36
|
readonly enableSitemap?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* An array of headers to pass to the Nuxt app on SSR requests.
|
|
39
|
+
* The more headers are passed, the weaker the cache performance will be, as the cache key
|
|
40
|
+
* is based on the headers.
|
|
41
|
+
* No headers are passed by default.
|
|
42
|
+
*/
|
|
43
|
+
readonly allowHeaders?: string[];
|
|
44
|
+
/**
|
|
45
|
+
* An array of cookies to pass to the Nuxt app on SSR requests.
|
|
46
|
+
* The more cookies are passed, the weaker the cache performance will be, as the cache key
|
|
47
|
+
* is based on the cookies.
|
|
48
|
+
* No cookies are passed by default.
|
|
49
|
+
*/
|
|
50
|
+
readonly allowCookies?: string[];
|
|
51
|
+
/**
|
|
52
|
+
* An array of query param keys to pass to the Nuxt app on SSR requests.
|
|
53
|
+
* The more query params are passed, the weaker the cache performance will be, as the cache key
|
|
54
|
+
* is based on the query params.
|
|
55
|
+
* Note that this config can not be combined with {@see denyQueryParams}.
|
|
56
|
+
* If both are specified, the {@see denyQueryParams} will be ignored.
|
|
57
|
+
* All query params are passed by default.
|
|
58
|
+
*/
|
|
59
|
+
readonly allowQueryParams?: string[];
|
|
60
|
+
/**
|
|
61
|
+
* An array of query param keys to deny passing to the Nuxt app on SSR requests.
|
|
62
|
+
* It might be useful to prevent specific external query params, e.g., fbclid, utm_campaign, ...,
|
|
63
|
+
* to improve cache performance, as the cache key is based on the specified query params.
|
|
64
|
+
* Note that this config can not be combined with {@see allowQueryParams}.
|
|
65
|
+
* If both are specified, the {@see denyQueryParams} will be ignored.
|
|
66
|
+
* All query params are passed by default.
|
|
67
|
+
*/
|
|
68
|
+
readonly denyQueryParams?: string[];
|
|
28
69
|
}
|
|
29
70
|
/**
|
|
30
71
|
* CDK stack to deploy a dynamic Nuxt app (target=server) on AWS with Lambda, ApiGateway, S3 and CloudFront.
|
|
@@ -204,7 +204,7 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
|
|
|
204
204
|
minimumProtocolVersion: aws_cloudfront_1.SecurityPolicyProtocol.TLS_V1_2_2018,
|
|
205
205
|
certificate: aws_certificatemanager_1.Certificate.fromCertificateArn(this, `${this.resourceIdPrefix}-global-certificate`, props.globalTlsCertificateArn),
|
|
206
206
|
httpVersion: aws_cloudfront_1.HttpVersion.HTTP2_AND_3,
|
|
207
|
-
defaultBehavior: this.createNuxtAppRouteBehavior(),
|
|
207
|
+
defaultBehavior: this.createNuxtAppRouteBehavior(props),
|
|
208
208
|
additionalBehaviors: this.setupCloudFrontRouting(props),
|
|
209
209
|
priceClass: aws_cloudfront_1.PriceClass.PRICE_CLASS_100, // Use only North America and Europe
|
|
210
210
|
});
|
|
@@ -215,7 +215,7 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
|
|
|
215
215
|
*
|
|
216
216
|
* @private
|
|
217
217
|
*/
|
|
218
|
-
createNuxtAppRouteBehavior() {
|
|
218
|
+
createNuxtAppRouteBehavior(props) {
|
|
219
219
|
return {
|
|
220
220
|
origin: new aws_cloudfront_origins_1.HttpOrigin(`${this.apiGateway.httpApiId}.execute-api.${this.region}.amazonaws.com`, {
|
|
221
221
|
connectionAttempts: 2,
|
|
@@ -227,7 +227,7 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
|
|
|
227
227
|
compress: true,
|
|
228
228
|
viewerProtocolPolicy: aws_cloudfront_1.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
|
|
229
229
|
originRequestPolicy: undefined,
|
|
230
|
-
cachePolicy: this.createSsrCachePolicy(),
|
|
230
|
+
cachePolicy: this.createSsrCachePolicy(props),
|
|
231
231
|
};
|
|
232
232
|
}
|
|
233
233
|
setupCloudFrontRouting(props) {
|
|
@@ -245,23 +245,16 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
|
|
|
245
245
|
* forward required cookies, query params and headers. This doesn't make any sense, because if nothing
|
|
246
246
|
* is cached, one would expect, that anything would/could be forwarded, but anyway...
|
|
247
247
|
*/
|
|
248
|
-
createSsrCachePolicy() {
|
|
249
|
-
// The headers to make accessible in the Nuxt app code.
|
|
250
|
-
// There is no 'CacheHeaderBehavior.all()' option, so we have to explicitly define them.
|
|
251
|
-
const headers = [
|
|
252
|
-
'User-Agent',
|
|
253
|
-
'Authorization',
|
|
254
|
-
'Host' // To access the domain name on SSR requests
|
|
255
|
-
];
|
|
248
|
+
createSsrCachePolicy(props) {
|
|
256
249
|
return new aws_cloudfront_1.CachePolicy(this, `${this.resourceIdPrefix}-cache-policy`, {
|
|
257
250
|
cachePolicyName: `${this.resourceIdPrefix}-cdn-cache-policy`,
|
|
258
|
-
comment: `
|
|
251
|
+
comment: `Defines which request data to pass to the ${this.resourceIdPrefix} origin and how the cache key is calculated.`,
|
|
259
252
|
defaultTtl: aws_cdk_lib_1.Duration.seconds(0),
|
|
260
253
|
minTtl: aws_cdk_lib_1.Duration.seconds(0),
|
|
261
|
-
maxTtl: aws_cdk_lib_1.Duration.
|
|
262
|
-
queryStringBehavior: aws_cloudfront_1.CacheQueryStringBehavior.all(),
|
|
263
|
-
headerBehavior: aws_cloudfront_1.CacheHeaderBehavior.allowList(...
|
|
264
|
-
cookieBehavior: aws_cloudfront_1.CacheCookieBehavior.
|
|
254
|
+
maxTtl: aws_cdk_lib_1.Duration.days(365),
|
|
255
|
+
queryStringBehavior: props.allowQueryParams ? aws_cloudfront_1.CacheQueryStringBehavior.allowList(...props.allowQueryParams) : (props.denyQueryParams ? aws_cloudfront_1.CacheQueryStringBehavior.denyList(...props.denyQueryParams) : aws_cloudfront_1.CacheQueryStringBehavior.all()),
|
|
256
|
+
headerBehavior: props.allowHeaders ? aws_cloudfront_1.CacheHeaderBehavior.allowList(...props.allowHeaders) : aws_cloudfront_1.CacheHeaderBehavior.none(),
|
|
257
|
+
cookieBehavior: props.allowCookies ? aws_cloudfront_1.CacheCookieBehavior.allowList(...props.allowCookies) : aws_cloudfront_1.CacheCookieBehavior.none(),
|
|
265
258
|
enableAcceptEncodingBrotli: true,
|
|
266
259
|
enableAcceptEncodingGzip: true,
|
|
267
260
|
});
|
|
@@ -436,4 +429,4 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
|
|
|
436
429
|
}
|
|
437
430
|
}
|
|
438
431
|
exports.NuxtServerAppStack = NuxtServerAppStack;
|
|
439
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnV4dC1zZXJ2ZXItYXBwLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibnV4dC1zZXJ2ZXItYXBwLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyRDtBQUUzRCwrRUFBK0Q7QUFDL0QsK0RBZ0JvQztBQUNwQyx1REFBb0c7QUFDcEcsK0NBTzRCO0FBQzVCLHlEQUFtRztBQUNuRyxxRUFBbUc7QUFDbkcsK0VBQXdFO0FBQ3hFLHlFQUFpRTtBQUNqRSxpRkFBK0Q7QUFDL0QsbURBQW1EO0FBQ25ELHNHQUFtRjtBQUNuRiw0RUFBa0c7QUFDbEcsc0VBQTBGO0FBQzFGLHlCQUF5QjtBQUN6Qix1REFBdUU7QUFDdkUsdUVBQThEO0FBRTlELDZCQUE2QjtBQStCN0I7O0dBRUc7QUFDSCxNQUFhLGtCQUFtQixTQUFRLG1CQUFLO0lBc0V6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3BFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakYscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFBLHFEQUE0QixHQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3hELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUUxRCxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUNuRDtRQUVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5QixrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHVCQUF1QjtRQUMzQixNQUFNLHdCQUF3QixHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixnQkFBZ0IsQ0FBQztRQUMxRSxPQUFPLElBQUkscUNBQW9CLENBQUMsSUFBSSxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyx3QkFBd0I7UUFDNUIsTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLFNBQVMsQ0FBQztRQUNyRCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3hDLGlCQUFpQixFQUFFLDBCQUFpQixDQUFDLFNBQVM7WUFDOUMsVUFBVTtZQUNWLHVHQUF1RztZQUN2RyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1lBQ3BDLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsZUFBZSxFQUFFLHdCQUFlLENBQUMscUJBQXFCO1NBQ3pELENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFOUMsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxtQkFBbUI7UUFDdkIsTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLFVBQVUsQ0FBQztRQUN0RCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3hDLFVBQVU7WUFDVixhQUFhLEVBQUUsNEJBQW1CLENBQUMsT0FBTztZQUMxQyxpQkFBaUIsRUFBRSwwQkFBaUIsQ0FBQyxTQUFTO1lBQzlDLFVBQVUsRUFBRSx5QkFBZ0IsQ0FBQyxVQUFVO1lBQ3ZDLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHVHQUF1RztZQUN2RyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1lBQ3BDLGlCQUFpQixFQUFFLElBQUk7U0FDMUIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU5QyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHVCQUF1QixDQUFDLEtBQThCOztRQUMxRCxNQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsZUFBZSxDQUFDO1FBRXpELE9BQU8sSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDaEMsWUFBWSxFQUFFLFFBQVE7WUFDdEIsV0FBVyxFQUFFLGVBQWUsSUFBSSxDQUFDLGdCQUFnQixZQUFZO1lBQzdELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsWUFBWSxFQUFFLHlCQUFZLENBQUMsTUFBTTtZQUNqQyxPQUFPLEVBQUUsR0FBRyxNQUFBLEtBQUssQ0FBQyxVQUFVLG1DQUFJLE9BQU8sVUFBVTtZQUNqRCxJQUFJLEVBQUUsaUJBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ25DLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUM7YUFDakUsQ0FBQztZQUNGLE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDN0IsVUFBVSxFQUFFLE1BQUEsS0FBSyxDQUFDLFVBQVUsbUNBQUksSUFBSTtZQUNwQyxZQUFZLEVBQUUsd0JBQWEsQ0FBQyxTQUFTO1lBQ3JDLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLG9CQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxvQkFBTyxDQUFDLFFBQVE7WUFDaEUsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxzQkFBc0I7Z0JBQ3BDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFBLEtBQUssQ0FBQyxhQUFhLG1DQUFJLElBQUksQ0FBQzthQUM3QztTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLDJCQUEyQixDQUFDLEtBQThCO1FBQzlELE1BQU0sWUFBWSxHQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixtQkFBbUIsQ0FBQztRQUV6RSxNQUFNLE1BQU0sR0FBYSxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUN0RCxZQUFZLEVBQUUsWUFBWTtZQUMxQixXQUFXLEVBQUUsa0RBQWtELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLGFBQWE7WUFDOUcsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixZQUFZLEVBQUUseUJBQVksQ0FBQyxNQUFNO1lBQ2pDLE1BQU0sRUFBRSxDQUFDLElBQUkseUJBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLFFBQVEsRUFBRTtvQkFDOUQsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLFFBQVE7b0JBQ2xELElBQUksRUFBRSxpQkFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSw0Q0FBNEMsQ0FBQyxDQUFDO29CQUN4RixrQkFBa0IsRUFBRSxDQUFDLG9CQUFPLENBQUMsV0FBVyxDQUFDO29CQUN6QyxXQUFXLEVBQUUsOENBQThDLElBQUksQ0FBQyxnQkFBZ0IsbUJBQW1CO2lCQUN0RyxDQUFDLENBQUM7WUFDSCxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsMENBQTBDLENBQUMsQ0FBQztZQUN0RixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzVCLFVBQVUsRUFBRSxHQUFHO1lBQ2YsWUFBWSxFQUFFLHdCQUFhLENBQUMsU0FBUztZQUNyQyxXQUFXLEVBQUU7Z0JBQ1Qsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVU7Z0JBQ3hELFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsbUNBQW1DLEVBQUUsR0FBRztnQkFDeEMsWUFBWSxFQUFFLHNCQUFzQjthQUN2QztTQUNKLENBQUMsQ0FBQztRQUVILHFDQUFxQztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUMsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxnQkFBZ0IsQ0FBQyxLQUE4QjtRQUNuRCxNQUFNLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsTUFBTSxDQUFDO1FBQy9DLE1BQU0saUJBQWlCLEdBQUcsSUFBSSwyREFBcUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFM0gsc0VBQXNFO1FBQ3RFLHdHQUF3RztRQUN4RywyRkFBMkY7UUFDM0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxtQ0FBVSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsYUFBYSxFQUFFO1lBQzNFLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTTtZQUN4QixXQUFXLEVBQUUsb0NBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHVCQUF1QixFQUFFLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQztZQUNuSSxZQUFZLEVBQUUscUNBQVksQ0FBQyxRQUFRO1lBQ25DLGNBQWMsRUFBRSx1Q0FBYyxDQUFDLE9BQU87U0FDekMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsSUFBSSxnQ0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDMUMsT0FBTztZQUNQLFdBQVcsRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLGdCQUFnQixxQ0FBcUMsSUFBSSxDQUFDLGdCQUFnQixpREFBaUQ7WUFDN0osdUdBQXVHO1lBQ3ZHLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLGtCQUFrQixFQUFFLGlCQUFpQjtZQUNyQyxvQkFBb0IsRUFBRTtnQkFDbEIsVUFBVSxFQUFFLFVBQVU7YUFDekI7U0FDSixDQUFDLENBQUM7UUFFSCxVQUFVLENBQUMsU0FBUyxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxpQkFBaUI7WUFDOUIsSUFBSSxFQUFFLFdBQVc7WUFDakIsT0FBTyxFQUFFLENBQUMsb0NBQVUsQ0FBQyxHQUFHLEVBQUUsb0NBQVUsQ0FBQyxJQUFJLENBQUM7U0FDN0MsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLDRCQUE0QixDQUFDLEtBQThCO1FBQy9ELE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixNQUFNLENBQUM7UUFFL0MsT0FBTyxJQUFJLDZCQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtZQUNuQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzNCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLHNCQUFzQixFQUFFLHVDQUFzQixDQUFDLGFBQWE7WUFDNUQsV0FBVyxFQUFFLG9DQUFXLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixxQkFBcUIsRUFBRSxLQUFLLENBQUMsdUJBQXVCLENBQUM7WUFDL0gsV0FBVyxFQUFFLDRCQUFXLENBQUMsV0FBVztZQUNwQyxlQUFlLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixFQUFFO1lBQ2xELG1CQUFtQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7WUFDdkQsVUFBVSxFQUFFLDJCQUFVLENBQUMsZUFBZSxFQUFFLG9DQUFvQztTQUMvRSxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSywwQkFBMEI7UUFDOUIsT0FBTztZQUNILE1BQU0sRUFBRSxJQUFJLG1DQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsZ0JBQWdCLElBQUksQ0FBQyxNQUFNLGdCQUFnQixFQUFFO2dCQUM1RixrQkFBa0IsRUFBRSxDQUFDO2dCQUNyQixpQkFBaUIsRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLFdBQVcsRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLGNBQWMsRUFBRSxxQ0FBb0IsQ0FBQyxVQUFVO2FBQ2xELENBQUM7WUFDRixjQUFjLEVBQUUsK0JBQWMsQ0FBQyxjQUFjO1lBQzdDLFFBQVEsRUFBRSxJQUFJO1lBQ2Qsb0JBQW9CLEVBQUUscUNBQW9CLENBQUMsaUJBQWlCO1lBQzVELG1CQUFtQixFQUFFLFNBQVM7WUFDOUIsV0FBVyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtTQUMzQyxDQUFDO0lBQ04sQ0FBQztJQUVPLHNCQUFzQixDQUFDLEtBQThCO1FBQ3pELElBQUksaUJBQWlCLEdBQW9DLEVBQUUsQ0FBQztRQUU1RCxzQkFBc0I7UUFDdEIsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQ3JCLGlCQUFpQixHQUFHLEVBQUMsR0FBRyxpQkFBaUIsRUFBRSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFDLENBQUM7U0FDcEY7UUFFRCxpQkFBaUIsR0FBRyxFQUFDLEdBQUcsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLENBQUMsK0JBQStCLEVBQUUsRUFBQyxDQUFDO1FBRXRGLE9BQU8saUJBQWlCLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssb0JBQW9CO1FBRXhCLHVEQUF1RDtRQUN2RCx3RkFBd0Y7UUFDeEYsTUFBTSxPQUFPLEdBQUc7WUFDWixZQUFZO1lBQ1osZUFBZTtZQUNmLE1BQU0sQ0FBQyw0Q0FBNEM7U0FDdEQsQ0FBQztRQUVGLE9BQU8sSUFBSSw0QkFBVyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsZUFBZSxFQUFFO1lBQ2xFLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsbUJBQW1CO1lBQzVELE9BQU8sRUFBRSwyQ0FBMkMsSUFBSSxDQUFDLGdCQUFnQixVQUFVO1lBQ25GLFVBQVUsRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzNCLG1CQUFtQixFQUFFLHlDQUF3QixDQUFDLEdBQUcsRUFBRTtZQUNuRCxjQUFjLEVBQUUsb0NBQW1CLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3pELGNBQWMsRUFBRSxvQ0FBbUIsQ0FBQyxHQUFHLEVBQUU7WUFDekMsMEJBQTBCLEVBQUUsSUFBSTtZQUNoQyx3QkFBd0IsRUFBRSxJQUFJO1NBQ2pDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLCtCQUErQjtRQUNuQyxNQUFNLHVCQUF1QixHQUFvQjtZQUM3QyxNQUFNLEVBQUUsSUFBSSxpQ0FBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDMUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDckIsaUJBQWlCLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsaUJBQWlCO2dCQUM1QyxVQUFVLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjthQUN0QyxDQUFDO1lBQ0YsUUFBUSxFQUFFLElBQUk7WUFDZCxjQUFjLEVBQUUsK0JBQWMsQ0FBQyxzQkFBc0I7WUFDckQsYUFBYSxFQUFFLDhCQUFhLENBQUMsc0JBQXNCO1lBQ25ELFdBQVcsRUFBRSw0QkFBVyxDQUFDLGlCQUFpQjtZQUMxQyxvQkFBb0IsRUFBRSxxQ0FBb0IsQ0FBQyxpQkFBaUI7U0FDL0QsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFvQyxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNwQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLHVCQUF1QixDQUFBO1FBQ3RFLENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxLQUFLLENBQUE7SUFDaEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssMEJBQTBCO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUVBQW1FLENBQUMsQ0FBQztTQUN4RjtRQUVELE1BQU0sa0JBQWtCLEdBQW9CO1lBQ3hDLE1BQU0sRUFBRSxJQUFJLGlDQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDckMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDckIsaUJBQWlCLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsaUJBQWlCO2FBQy9DLENBQUM7WUFDRixRQUFRLEVBQUUsSUFBSTtZQUNkLGNBQWMsRUFBRSwrQkFBYyxDQUFDLHNCQUFzQjtZQUNyRCxhQUFhLEVBQUUsOEJBQWEsQ0FBQyxzQkFBc0I7WUFDbkQsV0FBVyxFQUFFLDRCQUFXLENBQUMsaUJBQWlCO1lBQzFDLG9CQUFvQixFQUFFLHFDQUFvQixDQUFDLGlCQUFpQjtTQUMvRCxDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQW9DLEVBQUUsQ0FBQztRQUNsRCxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsa0JBQWtCLENBQUM7UUFDM0MsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsa0JBQWtCLENBQUM7UUFDaEQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLGtCQUFrQixDQUFDO1FBRTFDLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLG9CQUFvQjtRQUN4QixNQUFNLGtCQUFrQixHQUFHO1lBQ3ZCLGdDQUFZLENBQUMsU0FBUyxFQUFFO1lBQ3hCLGdDQUFZLENBQUMsTUFBTSxDQUFDLHNCQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLGdDQUFZLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztTQUN2QyxDQUFDO1FBRUYsc0dBQXNHO1FBQ3RHLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFOztZQUNsRyxPQUFPLElBQUksb0NBQWdCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixzQkFBc0IsVUFBVSxFQUFFLEVBQUU7Z0JBQzFGLE9BQU8sRUFBRSxDQUFDLDBCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtnQkFDMUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxNQUFNO2dCQUM1RCxLQUFLLEVBQUUsS0FBSztnQkFDWixZQUFZLEVBQUUsZ0NBQVksQ0FBQyxRQUFRO2dCQUNuQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDeEIsWUFBWSxFQUFFLE1BQUEsS0FBSyxDQUFDLFlBQVksbUNBQUksa0JBQWtCO2dCQUN0RCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7Z0JBQzlCLFlBQVksRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0JBQzdELGlCQUFpQixFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUMvRSxZQUFZLEVBQUUsd0JBQWEsQ0FBQyxPQUFPO2dCQUNuQyxXQUFXLEVBQUUsR0FBRyxDQUFDLHFHQUFxRzthQUN6SCxDQUFDLENBQUE7UUFDTixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGNBQWMsQ0FBQyxLQUE4QjtRQUNqRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU1QyxPQUFPLHdCQUFVLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixjQUFjLEVBQUU7WUFDckYsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFFBQVEsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxxQkFBcUI7U0FDdkUsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZ0JBQWdCLENBQUMsS0FBOEI7UUFDbkQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxNQUFNLFNBQVMsR0FBRywwQkFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLHNDQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXpFLDJCQUEyQjtRQUMzQixJQUFJLHFCQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixjQUFjLEVBQUU7WUFDdEQsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3hCLElBQUksRUFBRSxVQUFVO1lBQ2hCLE1BQU0sRUFBRSxTQUFTO1NBQ3BCLENBQUMsQ0FBQztRQUVILDJCQUEyQjtRQUMzQixJQUFJLHdCQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixjQUFjLEVBQUU7WUFDekQsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3hCLElBQUksRUFBRSxVQUFVO1lBQ2hCLE1BQU0sRUFBRSxTQUFTO1NBQ3BCLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGlCQUFpQixDQUFDLEtBQThCO1FBQ3BELE1BQU0sdUJBQXVCLEdBQUc7WUFDNUIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsVUFBVSxFQUFFLGVBQWU7WUFDM0IsU0FBUyxFQUFFLEdBQUc7WUFDZCxnQkFBZ0IsRUFBRSxFQUFFO1lBQ3BCLFNBQVMsRUFBRSxFQUFFO1lBQ2IsZ0JBQWdCLEVBQUU7Z0JBQ2QsWUFBWSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUMxQixNQUFNLEVBQUU7b0JBQ0osUUFBUSxFQUFFLEtBQUs7b0JBQ2YsTUFBTSxFQUFFLEdBQUc7b0JBQ1gsVUFBVSxFQUFFLFVBQVU7aUJBQ3pCO2FBQ0o7U0FDSixDQUFDO1FBRUYsSUFBSSxpQkFBSSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsY0FBYyxFQUFFO1lBQ25ELFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsU0FBUztZQUMzQyxXQUFXLEVBQUUsb0NBQW9DLElBQUksQ0FBQyxnQkFBZ0IsdUNBQXVDO1lBQzdHLE9BQU8sRUFBRSxJQUFJO1lBQ2IsUUFBUSxFQUFFLHFCQUFRLENBQUMsSUFBSSxDQUFDLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sRUFBRSxDQUFDLElBQUksbUNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7b0JBQ2pELEtBQUssRUFBRSw0QkFBZSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQztpQkFDN0QsQ0FBQyxDQUFDO1NBQ04sQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUdEOzs7OztPQUtHO0lBQ0ssd0JBQXdCO1FBQzVCLElBQUksaUJBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGlCQUFpQixFQUFFO1lBQ3RELFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsWUFBWTtZQUM5QyxXQUFXLEVBQUUsMkRBQTJELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLGFBQWE7WUFDdkgsT0FBTyxFQUFFLElBQUk7WUFDYixRQUFRLEVBQUUscUJBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDO1lBQ2hFLE9BQU8sRUFBRSxDQUFDLElBQUksbUNBQWMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUM1RCxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFsaEJELGdEQWtoQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0R1cmF0aW9uLCBSZW1vdmFsUG9saWN5LCBTdGFja30gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtDb25zdHJ1Y3R9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtDZXJ0aWZpY2F0ZX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gICAgQWxsb3dlZE1ldGhvZHMsXG4gICAgQmVoYXZpb3JPcHRpb25zLFxuICAgIENhY2hlQ29va2llQmVoYXZpb3IsXG4gICAgQ2FjaGVkTWV0aG9kcyxcbiAgICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICAgIENhY2hlUG9saWN5LFxuICAgIENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvcixcbiAgICBEaXN0cmlidXRpb24sIEh0dHBWZXJzaW9uLFxuICAgIElDYWNoZVBvbGljeSxcbiAgICBJT3JpZ2luQWNjZXNzSWRlbnRpdHksXG4gICAgT3JpZ2luQWNjZXNzSWRlbnRpdHksXG4gICAgT3JpZ2luUHJvdG9jb2xQb2xpY3ksXG4gICAgUHJpY2VDbGFzcyxcbiAgICBTZWN1cml0eVBvbGljeVByb3RvY29sLFxuICAgIFZpZXdlclByb3RvY29sUG9saWN5XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHtBcmNoaXRlY3R1cmUsIENvZGUsIEZ1bmN0aW9uLCBMYXllclZlcnNpb24sIFJ1bnRpbWUsIFRyYWNpbmd9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICAgIEJsb2NrUHVibGljQWNjZXNzLFxuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRBY2Nlc3NDb250cm9sLFxuICAgIEJ1Y2tldEVuY3J5cHRpb24sXG4gICAgSUJ1Y2tldCxcbiAgICBPYmplY3RPd25lcnNoaXBcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHtBYWFhUmVjb3JkLCBBUmVjb3JkLCBIb3N0ZWRab25lLCBJSG9zdGVkWm9uZSwgUmVjb3JkVGFyZ2V0fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7QnVja2V0RGVwbG95bWVudCwgQ2FjaGVDb250cm9sLCBTb3VyY2UsIFN0b3JhZ2VDbGFzc30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zMy1kZXBsb3ltZW50XCI7XG5pbXBvcnQge0h0dHBPcmlnaW4sIFMzT3JpZ2lufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQtb3JpZ2luc1wiO1xuaW1wb3J0IHtDbG91ZEZyb250VGFyZ2V0fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0c1wiO1xuaW1wb3J0IHtIdHRwTWV0aG9kfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3NcIjtcbmltcG9ydCB7UmV0ZW50aW9uRGF5c30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQge0h0dHBMYW1iZGFJbnRlZ3JhdGlvbn0gZnJvbSAnQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1pbnRlZ3JhdGlvbnMtYWxwaGEnO1xuaW1wb3J0IHtEb21haW5OYW1lLCBFbmRwb2ludFR5cGUsIEh0dHBBcGksIFNlY3VyaXR5UG9saWN5fSBmcm9tIFwiQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1hbHBoYVwiO1xuaW1wb3J0IHtnZXROdXh0QXBwU3RhdGljQXNzZXRDb25maWdzLCBTdGF0aWNBc3NldENvbmZpZ30gZnJvbSBcIi4uL251eHQtYXBwLXN0YXRpYy1hc3NldHNcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHtSdWxlLCBSdWxlVGFyZ2V0SW5wdXQsIFNjaGVkdWxlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHtMYW1iZGFGdW5jdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xuaW1wb3J0IHtOdXh0QXBwU3RhY2tQcm9wc30gZnJvbSBcIi4uL251eHQtYXBwLXN0YWNrLXByb3BzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcHJvcHMgcmVxdWlyZWQgZm9yIHRoZSB7QHNlZSBOdXh0U2VydmVyQXBwU3RhY2t9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzIGV4dGVuZHMgTnV4dEFwcFN0YWNrUHJvcHMge1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFSTiBvZiB0aGUgY2VydGlmaWNhdGUgdG8gdXNlIGF0IHRoZSBBcGlHYXRld2F5IGZvciB0aGUgTnV4dCBhcHAgdG8gbWFrZSBpdCBhY2Nlc3NpYmxlIHZpYSB0aGUgY3VzdG9tIGRvbWFpblxuICAgICAqIGFuZCB0byBwcm92aWRlIHRoZSBjdXN0b20gZG9tYWluIHRvIHRoZSBOdXh0IGFwcCB2aWEgdGhlICdIb3N0JyBoZWFkZXIgZm9yIHNlcnZlciBzaWRlIHJlbmRlcmluZyB1c2UgY2FzZXMuXG4gICAgICogVGhlIGNlcnRpZmljYXRlIG11c3QgYmUgaXNzdWVkIGluIHRoZSBzYW1lIHJlZ2lvbiBhcyBzcGVjaWZpZWQgdmlhICdlbnYucmVnaW9uJyBhcyBBcGlHYXRld2F5IHdvcmtzIHJlZ2lvbmFsbHkuXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmVnaW9uYWxUbHNDZXJ0aWZpY2F0ZUFybjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1lbW9yeSBzaXplIHRvIGFwcGx5IHRvIHRoZSBOdXh0IGFwcCdzIExhbWJkYS5cbiAgICAgKiBEZWZhdWx0cyB0byAxNzkyTUIgKG9wdGltaXplZCBmb3IgY29zdHMgYW5kIHBlcmZvcm1hbmNlIGZvciBzdGFuZGFyZCBOdXh0IGFwcHMpLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBBV1MgWC1SYXkgZm9yIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVUcmFjaW5nPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIGEgZ2xvYmFsIFNpdGVtYXAgYnVja2V0IHdoaWNoIGlzIHBlcm1hbmVudGx5IGFjY2Vzc2libGUgdGhyb3VnaCBtdWx0aXBsZSBkZXBsb3ltZW50cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVTaXRlbWFwPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDREsgc3RhY2sgdG8gZGVwbG95IGEgZHluYW1pYyBOdXh0IGFwcCAodGFyZ2V0PXNlcnZlcikgb24gQVdTIHdpdGggTGFtYmRhLCBBcGlHYXRld2F5LCBTMyBhbmQgQ2xvdWRGcm9udC5cbiAqL1xuZXhwb3J0IGNsYXNzIE51eHRTZXJ2ZXJBcHBTdGFjayBleHRlbmRzIFN0YWNrIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIHByZWZpeCBvZiB0aGUgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlSWRQcmVmaXg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCBkZXBsb3ltZW50IHRoYXQgaXMgdXNlZCBhcyBTMyBmb2xkZXIgbmFtZVxuICAgICAqIHRvIHN0b3JlIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXBsb3ltZW50UmV2aXNpb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGl0eSB0byB1c2UgZm9yIGFjY2Vzc2luZyB0aGUgZGVwbG95bWVudCBhc3NldHMgb24gUzMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RuQWNjZXNzSWRlbnRpdHk6IElPcmlnaW5BY2Nlc3NJZGVudGl0eTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBTMyBidWNrZXQgd2hlcmUgdGhlIGRlcGxveW1lbnQgYXNzZXRzIGdldHMgc3RvcmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWNBc3NldHNCdWNrZXQ6IElCdWNrZXQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBzaXRlbWFwIGFzc2V0cyBnZXRzIHN0b3JlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2l0ZW1hcEJ1Y2tldDogSUJ1Y2tldHx1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgTnV4dCBhcHAgb24gdGhlIHNlcnZlciBzaWRlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcExhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBjbGVhbnVwcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xlYW51cExhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBUEkgZ2F0ZXdheSB0byBtYWtlIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcCBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgYXBpR2F0ZXdheTogSHR0cEFwaTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25maWdzIGZvciB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAgdGhhdCBzaGFsbCBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljQXNzZXRDb25maWdzOiBTdGF0aWNBc3NldENvbmZpZ1tdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbiAodmlhIHRoZSBBUEkgZ2F0ZXdheSlcbiAgICAgKiBvciB0aGUgUzMgYXNzZXRzIGZvbGRlciAod2l0aCBjYWNoaW5nKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZG46IERpc3RyaWJ1dGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcykge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgICAgICB0aGlzLnJlc291cmNlSWRQcmVmaXggPSBgJHtwcm9wcy5wcm9qZWN0fS0ke3Byb3BzLnNlcnZpY2V9LSR7cHJvcHMuZW52aXJvbm1lbnR9YDtcblxuICAgICAgICAvLyBOdXh0IGFwcCByZXNvdXJjZXNcbiAgICAgICAgdGhpcy5kZXBsb3ltZW50UmV2aXNpb24gPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRDb25maWdzID0gZ2V0TnV4dEFwcFN0YXRpY0Fzc2V0Q29uZmlncygpO1xuICAgICAgICB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5ID0gdGhpcy5jcmVhdGVDZG5BY2Nlc3NJZGVudGl0eSgpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCA9IHRoaXMuY3JlYXRlU3RhdGljQXNzZXRzQnVja2V0KCk7XG5cbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZVNpdGVtYXApIHtcbiAgICAgICAgICAgIHRoaXMuc2l0ZW1hcEJ1Y2tldCA9IHRoaXMuY3JlYXRlU2l0ZW1hcEJ1Y2tldCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBMYW1iZGFGdW5jdGlvbiA9IHRoaXMuY3JlYXRlQXBwTGFtYmRhRnVuY3Rpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLmFwaUdhdGV3YXkgPSB0aGlzLmNyZWF0ZUFwaUdhdGV3YXkocHJvcHMpO1xuICAgICAgICB0aGlzLmNkbiA9IHRoaXMuY3JlYXRlQ2xvdWRGcm9udERpc3RyaWJ1dGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJlRGVwbG95bWVudHMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVEbnNSZWNvcmRzKHByb3BzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVBcHBQaW5nUnVsZShwcm9wcyk7XG5cbiAgICAgICAgLy8gU3RhdGljIGFzc2V0cyBjbGVhbnVwIHJlc291cmNlc1xuICAgICAgICB0aGlzLmNsZWFudXBMYW1iZGFGdW5jdGlvbiA9IHRoaXMuY3JlYXRlQ2xlYW51cExhbWJkYUZ1bmN0aW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVDbGVhbnVwVHJpZ2dlclJ1bGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBpZGVudGl0eSB0byBhY2Nlc3MgdGhlIFMzIGRlcGxveW1lbnQgYXNzZXQgZmlsZXMgdmlhIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDZG5BY2Nlc3NJZGVudGl0eSgpOiBJT3JpZ2luQWNjZXNzSWRlbnRpdHkge1xuICAgICAgICBjb25zdCBvcmlnaW5BY2Nlc3NJZGVudGl0eU5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbi1zMy1hY2Nlc3NgO1xuICAgICAgICByZXR1cm4gbmV3IE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMsIG9yaWdpbkFjY2Vzc0lkZW50aXR5TmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgYnVja2V0IHRvIHN0b3JlIHRoZSBzdGF0aWMgZGVwbG95bWVudCBhc3NldCBmaWxlcyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU3RhdGljQXNzZXRzQnVja2V0KCk6IElCdWNrZXQge1xuICAgICAgICBjb25zdCBidWNrZXROYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHNgO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsIGJ1Y2tldE5hbWUsIHtcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICAgICAgICBidWNrZXROYW1lLFxuICAgICAgICAgICAgLy8gVGhlIGJ1Y2tldCBhbmQgYWxsIG9mIGl0cyBvYmplY3RzIGNhbiBiZSBkZWxldGVkLCBiZWNhdXNlIGFsbCB0aGUgY29udGVudCBpcyBtYW5hZ2VkIGluIHRoaXMgcHJvamVjdFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICAgICAgICBvYmplY3RPd25lcnNoaXA6IE9iamVjdE93bmVyc2hpcC5CVUNLRVRfT1dORVJfRU5GT1JDRUQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmNkbkFjY2Vzc0lkZW50aXR5KTtcblxuICAgICAgICByZXR1cm4gYnVja2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGJ1Y2tldCB0byBzdG9yZSB0aGUgc2l0ZW1hcCBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVNpdGVtYXBCdWNrZXQoKTogQnVja2V0IHtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2l0ZW1hcGA7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgYnVja2V0TmFtZSwge1xuICAgICAgICAgICAgYnVja2V0TmFtZSxcbiAgICAgICAgICAgIGFjY2Vzc0NvbnRyb2w6IEJ1Y2tldEFjY2Vzc0NvbnRyb2wuUFJJVkFURSxcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICAgICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgICAgICAgLy8gVGhlIGJ1Y2tldCBhbmQgYWxsIG9mIGl0cyBvYmplY3RzIGNhbiBiZSBkZWxldGVkLCBiZWNhdXNlIGFsbCB0aGUgY29udGVudCBpcyBtYW5hZ2VkIGluIHRoaXMgcHJvamVjdFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmNkbkFjY2Vzc0lkZW50aXR5KTtcblxuICAgICAgICByZXR1cm4gYnVja2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIExhbWJkYSBmdW5jdGlvbiB0byByZW5kZXIgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFwcExhbWJkYUZ1bmN0aW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IEZ1bmN0aW9uIHtcbiAgICAgICAgY29uc3QgZnVuY05hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFwcC1mdW5jdGlvbmA7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUmVuZGVycyB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IE51eHQgYXBwLmAsXG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgaGFuZGxlcjogYCR7cHJvcHMuZW50cnlwb2ludCA/PyAnaW5kZXgnfS5oYW5kbGVyYCxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KCcub3V0cHV0L3NlcnZlcicsIHtcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyoqLnN2ZycsICcqKi5pY28nLCAnKioucG5nJywgJyoqLmpwZycsICcqKi5qcy5tYXAnXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplID8/IDE3OTIsXG4gICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgICAgICAgYWxsb3dQdWJsaWNTdWJuZXQ6IGZhbHNlLFxuICAgICAgICAgICAgdHJhY2luZzogcHJvcHMuZW5hYmxlVHJhY2luZyA/IFRyYWNpbmcuQUNUSVZFIDogVHJhY2luZy5ESVNBQkxFRCxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgICAgIC4uLkpTT04ucGFyc2UocHJvcHMuZW50cnlwb2ludEVudiA/PyAne30nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IGNsZWFudXBzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDbGVhbnVwTGFtYmRhRnVuY3Rpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRnVuY3Rpb24ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWU6IHN0cmluZyA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2xlYW51cC1mdW5jdGlvbmA7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0OiBGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBBdXRvLWRlbGV0ZXMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgaW4gdGhlICR7dGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZX0gUzMgYnVja2V0LmAsXG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgbGF5ZXJzOiBbbmV3IExheWVyVmVyc2lvbih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWxheWVyYCwge1xuICAgICAgICAgICAgICAgIGxheWVyVmVyc2lvbk5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbGF5ZXJgLFxuICAgICAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYXNzZXRzLWNsZWFudXAvYnVpbGQvbGF5ZXInKSksXG4gICAgICAgICAgICAgICAgY29tcGF0aWJsZVJ1bnRpbWVzOiBbUnVudGltZS5OT0RFSlNfMTZfWF0sXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBQcm92aWRlcyB0aGUgbm9kZV9tb2R1bGVzIHJlcXVpcmVkIGZvciB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IGxhbWJkYSBmdW5jdGlvbi5gXG4gICAgICAgICAgICB9KV0sXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2Fzc2V0cy1jbGVhbnVwL2J1aWxkL2FwcCcpKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuVFdPX1dFRUtTLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBTVEFUSUNfQVNTRVRTX0JVQ0tFVDogdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICBFTlZJUk9OTUVOVDogcHJvcHMuZW52aXJvbm1lbnQsXG4gICAgICAgICAgICAgICAgQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQ6ICcxJyxcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBncmFudCBmdW5jdGlvbiBhY2Nlc3MgdG8gUzMgYnVja2V0XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50UmVhZChyZXN1bHQpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudERlbGV0ZShyZXN1bHQpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQVBJIGdhdGV3YXkgdG8gbWFrZSB0aGUgTnV4dCBhcHAgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBpR2F0ZXdheShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBIdHRwQXBpIHtcbiAgICAgICAgY29uc3QgYXBpTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXBpYDtcbiAgICAgICAgY29uc3QgbGFtYmRhSW50ZWdyYXRpb24gPSBuZXcgSHR0cExhbWJkYUludGVncmF0aW9uKGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbGFtYmRhLWludGVncmF0aW9uYCwgdGhpcy5hcHBMYW1iZGFGdW5jdGlvbik7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0aGUgQVBJIGdhdGV3YXkgdG8gYmUgYWNjZXNzaWJsZSBieSB0aGUgY3VzdG9tIGRvbWFpbiBuYW1lLlxuICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSBhY2Nlc3MgdGhlIGdhdGV3YXkgdmlhIENsb3VkRnJvbnQgKGZvciBhdXRvIGh0dHAgdG8gaHR0cHMgcmVkaXJlY3RzKSwgdGhpcyBpcyByZXF1aXJlZFxuICAgICAgICAvLyB0byBiZSBhYmxlIHRvIHJlZGlyZWN0IHRoZSBvcmlnaW5hbCAnSG9zdCcgaGVhZGVyIHRvIHRoZSBOdXh0IGFwcGxpY2F0aW9uLCBpZiByZXF1ZXN0ZWQuXG4gICAgICAgIGNvbnN0IGRvbWFpbk5hbWUgPSBuZXcgRG9tYWluTmFtZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFwaS1kb21haW5gLCB7XG4gICAgICAgICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGUuZnJvbUNlcnRpZmljYXRlQXJuKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcmVnaW9uYWwtY2VydGlmaWNhdGVgLCBwcm9wcy5yZWdpb25hbFRsc0NlcnRpZmljYXRlQXJuKSxcbiAgICAgICAgICAgIGVuZHBvaW50VHlwZTogRW5kcG9pbnRUeXBlLlJFR0lPTkFMLFxuICAgICAgICAgICAgc2VjdXJpdHlQb2xpY3k6IFNlY3VyaXR5UG9saWN5LlRMU18xXzJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYXBpR2F0ZXdheSA9IG5ldyBIdHRwQXBpKHRoaXMsIGFwaU5hbWUsIHtcbiAgICAgICAgICAgIGFwaU5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYENvbm5lY3RzIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gd2l0aCB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IExhbWJkYSBmdW5jdGlvbiB0byBtYWtlIGl0IHB1YmxpY2x5IGF2YWlsYWJsZS5gLFxuICAgICAgICAgICAgLy8gVGhlIGFwcCBkb2VzIG5vdCBhbGxvdyBhbnkgY3Jvc3Mtb3JpZ2luIGFjY2VzcyBieSBwdXJwb3NlOiB0aGUgYXBwIHNob3VsZCBub3QgYmUgZW1iZWRkYWJsZSBhbnl3aGVyZVxuICAgICAgICAgICAgY29yc1ByZWZsaWdodDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdEludGVncmF0aW9uOiBsYW1iZGFJbnRlZ3JhdGlvbixcbiAgICAgICAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiB7XG4gICAgICAgICAgICAgICAgZG9tYWluTmFtZTogZG9tYWluTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhcGlHYXRld2F5LmFkZFJvdXRlcyh7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbjogbGFtYmRhSW50ZWdyYXRpb24sXG4gICAgICAgICAgICBwYXRoOiAnL3twcm94eSt9JyxcbiAgICAgICAgICAgIG1ldGhvZHM6IFtIdHRwTWV0aG9kLkdFVCwgSHR0cE1ldGhvZC5IRUFEXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFwaUdhdGV3YXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdGhhdCByb3V0ZXMgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uICh2aWEgdGhlIEFQSSBnYXRld2F5KVxuICAgICAqIG9yIHRoZSBTMyBhc3NldHMgZm9sZGVyICh3aXRoIGNhY2hpbmcpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsb3VkRnJvbnREaXN0cmlidXRpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRGlzdHJpYnV0aW9uIHtcbiAgICAgICAgY29uc3QgY2RuTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuYDtcblxuICAgICAgICByZXR1cm4gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBjZG5OYW1lLCB7XG4gICAgICAgICAgICBkb21haW5OYW1lczogW3Byb3BzLmRvbWFpbl0sXG4gICAgICAgICAgICBjb21tZW50OiBjZG5OYW1lLFxuICAgICAgICAgICAgbWluaW11bVByb3RvY29sVmVyc2lvbjogU2VjdXJpdHlQb2xpY3lQcm90b2NvbC5UTFNfVjFfMl8yMDE4LFxuICAgICAgICAgICAgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWdsb2JhbC1jZXJ0aWZpY2F0ZWAsIHByb3BzLmdsb2JhbFRsc0NlcnRpZmljYXRlQXJuKSxcbiAgICAgICAgICAgIGh0dHBWZXJzaW9uOiBIdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgICAgICAgIGRlZmF1bHRCZWhhdmlvcjogdGhpcy5jcmVhdGVOdXh0QXBwUm91dGVCZWhhdmlvcigpLFxuICAgICAgICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczogdGhpcy5zZXR1cENsb3VkRnJvbnRSb3V0aW5nKHByb3BzKSxcbiAgICAgICAgICAgIHByaWNlQ2xhc3M6IFByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfMTAwLCAvLyBVc2Ugb25seSBOb3J0aCBBbWVyaWNhIGFuZCBFdXJvcGVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiAodmlhIEFQSSBnYXRld2F5KS5cbiAgICAgKiBBZGRpdGlvbmFsbHksIHRoaXMgYXV0b21hdGljYWxseSByZWRpcmVjdHMgSFRUUCByZXF1ZXN0cyB0byBIVFRQUy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwUm91dGVCZWhhdmlvcigpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3JpZ2luOiBuZXcgSHR0cE9yaWdpbihgJHt0aGlzLmFwaUdhdGV3YXkuaHR0cEFwaUlkfS5leGVjdXRlLWFwaS4ke3RoaXMucmVnaW9ufS5hbWF6b25hd3MuY29tYCwge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygyKSxcbiAgICAgICAgICAgICAgICByZWFkVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICAgICAgcHJvdG9jb2xQb2xpY3k6IE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBTX09OTFksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRCxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IHRoaXMuY3JlYXRlU3NyQ2FjaGVQb2xpY3koKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwQ2xvdWRGcm9udFJvdXRpbmcocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGxldCByb3V0aW5nQmVoYXZpb3VyczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuXG4gICAgICAgIC8vIFNwZWNpZmljIG9uZXMgZmlyc3RcbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZVNpdGVtYXApIHtcbiAgICAgICAgICAgIHJvdXRpbmdCZWhhdmlvdXJzID0gey4uLnJvdXRpbmdCZWhhdmlvdXJzLCAuLi50aGlzLmNyZWF0ZVNpdGVtYXBSb3V0ZUJlaGF2aW9yKCl9O1xuICAgICAgICB9XG5cbiAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlU3RhdGljQXNzZXRzUm91dGVCZWhhdmlvcigpfTtcblxuICAgICAgICByZXR1cm4gcm91dGluZ0JlaGF2aW91cnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNhY2hlIHBvbGljeSBmb3IgdGhlIE51eHQgYXBwIHJvdXRlIGJlaGF2aW9yIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBFdmVuIHRob3VnaCB3ZSBkb24ndCB3YW50IHRvIGNhY2hlIFNTUiByZXF1ZXN0cywgd2Ugc3RpbGwgaGF2ZSB0byBjcmVhdGUgdGhpcyBjYWNoZSBwb2xpY3kgaW4gb3JkZXIgdG9cbiAgICAgKiBmb3J3YXJkIHJlcXVpcmVkIGNvb2tpZXMsIHF1ZXJ5IHBhcmFtcyBhbmQgaGVhZGVycy4gVGhpcyBkb2Vzbid0IG1ha2UgYW55IHNlbnNlLCBiZWNhdXNlIGlmIG5vdGhpbmdcbiAgICAgKiBpcyBjYWNoZWQsIG9uZSB3b3VsZCBleHBlY3QsIHRoYXQgYW55dGhpbmcgd291bGQvY291bGQgYmUgZm9yd2FyZGVkLCBidXQgYW55d2F5Li4uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTc3JDYWNoZVBvbGljeSgpOiBJQ2FjaGVQb2xpY3kge1xuXG4gICAgICAgIC8vIFRoZSBoZWFkZXJzIHRvIG1ha2UgYWNjZXNzaWJsZSBpbiB0aGUgTnV4dCBhcHAgY29kZS5cbiAgICAgICAgLy8gVGhlcmUgaXMgbm8gJ0NhY2hlSGVhZGVyQmVoYXZpb3IuYWxsKCknIG9wdGlvbiwgc28gd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlZmluZSB0aGVtLlxuICAgICAgICBjb25zdCBoZWFkZXJzID0gW1xuICAgICAgICAgICAgJ1VzZXItQWdlbnQnLCAvLyBSZXF1aXJlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG1vYmlsZSBhbmQgZGVza3RvcCB0ZW1wbGF0ZVxuICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nLCAvLyBGb3IgYXV0aG9yaXphdGlvblxuICAgICAgICAgICAgJ0hvc3QnIC8vIFRvIGFjY2VzcyB0aGUgZG9tYWluIG5hbWUgb24gU1NSIHJlcXVlc3RzXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNhY2hlLXBvbGljeWAsIHtcbiAgICAgICAgICAgIGNhY2hlUG9saWN5TmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG4tY2FjaGUtcG9saWN5YCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGBQYXNzZXMgYWxsIHJlcXVpcmVkIHJlcXVlc3QgZGF0YSB0byB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IG9yaWdpbi5gLFxuICAgICAgICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgICAgICAgIG1pblR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgICAgICAgIG1heFR0bDogRHVyYXRpb24uc2Vjb25kcygxKSwgLy8gVGhlIG1heCBUVEwgbXVzdCBub3QgYmUgMCBmb3IgYSBjYWNoZSBwb2xpY3lcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSxcbiAgICAgICAgICAgIGhlYWRlckJlaGF2aW9yOiBDYWNoZUhlYWRlckJlaGF2aW9yLmFsbG93TGlzdCguLi5oZWFkZXJzKSxcbiAgICAgICAgICAgIGNvb2tpZUJlaGF2aW9yOiBDYWNoZUNvb2tpZUJlaGF2aW9yLmFsbCgpLFxuICAgICAgICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IHRydWUsXG4gICAgICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIGluY29taW5nIHJlcXVlc3RzIGZvciB0aGUgc3RhdGljIGFzc2V0c1xuICAgICAqIHRvIHRoZSBTMyBidWNrZXQgdGhhdCBob2xkcyB0aGVzZSBzdGF0aWMgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVN0YXRpY0Fzc2V0c1JvdXRlQmVoYXZpb3IoKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0c0NhY2hlQ29uZmlnOiBCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmlnaW46IG5ldyBTM09yaWdpbih0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCwge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzKSxcbiAgICAgICAgICAgICAgICBvcmlnaW5BY2Nlc3NJZGVudGl0eTogdGhpcy5jZG5BY2Nlc3NJZGVudGl0eSxcbiAgICAgICAgICAgICAgICBvcmlnaW5QYXRoOiB0aGlzLmRlcGxveW1lbnRSZXZpc2lvbixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlUG9saWN5OiBDYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRCxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncy5mb3JFYWNoKGFzc2V0ID0+IHtcbiAgICAgICAgICAgIHJ1bGVzW2Ake2Fzc2V0LnRhcmdldH0ke2Fzc2V0LnBhdHRlcm59YF0gPSBzdGF0aWNBc3NldHNDYWNoZUNvbmZpZ1xuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBydWxlc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIGluY29taW5nIHJlcXVlc3RzIGZvciB0aGUgc2l0ZW1hcCBhc3NldHNcbiAgICAgKiB0byB0aGUgUzMgYnVja2V0IHRoYXQgaG9sZHMgdGhlc2Ugc2l0ZW1hcCBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU2l0ZW1hcFJvdXRlQmVoYXZpb3IoKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGlmICghdGhpcy5zaXRlbWFwQnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTaXRlbWFwIGJ1Y2tldCBtdXN0IGV4aXN0IGJlZm9yZSBjcmVhdGluZyBzaXRlbWFwIHJvdXRlIGJlaGF2aW9yLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpdGVtYXBDYWNoZUNvbmZpZzogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiBuZXcgUzNPcmlnaW4odGhpcy5zaXRlbWFwQnVja2V0LCB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMpLFxuICAgICAgICAgICAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OiB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgcnVsZXNbJypzaXRlbWFwLnhtbCddID0gc2l0ZW1hcENhY2hlQ29uZmlnO1xuICAgICAgICBydWxlc1snKnNpdGVtYXAtZ29uZS54bWwnXSA9IHNpdGVtYXBDYWNoZUNvbmZpZztcbiAgICAgICAgcnVsZXNbJy9zaXRlbWFwcy8qJ10gPSBzaXRlbWFwQ2FjaGVDb25maWc7XG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwbG9hZHMgdGhlIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwIGFzIGRlZmluZWQgaW4ge0BzZWUgZ2V0TnV4dEFwcFN0YXRpY0Fzc2V0Q29uZmlnc30gdG8gdGhlIHN0YXRpYyBhc3NldHMgUzMgYnVja2V0LlxuICAgICAqIEluIG9yZGVyIHRvIGVuYWJsZSBhIHplcm8tZG93bnRpbWUgZGVwbG95bWVudCwgd2UgdXNlIGEgbmV3IHN1YmRpcmVjdG9yeSAocmV2aXNpb24pIGZvciBldmVyeSBkZXBsb3ltZW50LlxuICAgICAqIFRoZSBwcmV2aW91cyB2ZXJzaW9ucyBhcmUgcmV0YWluZWQgdG8gYWxsb3cgY2xpZW50cyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggYW4gb2xkZXIgcmV2aXNpb24gYnV0IGdldHMgY2xlYW5lZCB1cFxuICAgICAqIGFmdGVyIGEgc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lIHZpYSB0aGUgTGFtYmRhIGZ1bmN0aW9uIGluIHRoZSB7QHNlZSBOdXh0QXBwQXNzZXRzQ2xlYW51cFN0YWNrfS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbmZpZ3VyZURlcGxveW1lbnRzKCk6IEJ1Y2tldERlcGxveW1lbnRbXSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRDYWNoZUNvbmZpZyA9IFtcbiAgICAgICAgICAgIENhY2hlQ29udHJvbC5zZXRQdWJsaWMoKSxcbiAgICAgICAgICAgIENhY2hlQ29udHJvbC5tYXhBZ2UoRHVyYXRpb24uZGF5cygzNjUpKSxcbiAgICAgICAgICAgIENhY2hlQ29udHJvbC5mcm9tU3RyaW5nKCdpbW11dGFibGUnKSxcbiAgICAgICAgXTtcblxuICAgICAgICAvLyBSZXR1cm5zIGEgZGVwbG95bWVudCBmb3IgZXZlcnkgY29uZmlndXJlZCBzdGF0aWMgYXNzZXQgdHlwZSB0byByZXNwZWN0IHRoZSBkaWZmZXJlbnQgY2FjaGUgc2V0dGluZ3NcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQXNzZXRDb25maWdzLmZpbHRlcihhc3NldCA9PiBmcy5leGlzdHNTeW5jKGFzc2V0LnNvdXJjZSkpLm1hcCgoYXNzZXQsIGFzc2V0SW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0cy1kZXBsb3ltZW50LSR7YXNzZXRJbmRleH1gLCB7XG4gICAgICAgICAgICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChhc3NldC5zb3VyY2UpXSxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQsXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IHRoaXMuZGVwbG95bWVudFJldmlzaW9uICsgYXNzZXQudGFyZ2V0LFxuICAgICAgICAgICAgICAgIHBydW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3M6IFN0b3JhZ2VDbGFzcy5TVEFOREFSRCxcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyonXSxcbiAgICAgICAgICAgICAgICBpbmNsdWRlOiBbYXNzZXQucGF0dGVybl0sXG4gICAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiBhc3NldC5jYWNoZUNvbnRyb2wgPz8gZGVmYXVsdENhY2hlQ29uZmlnLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBhc3NldC5jb250ZW50VHlwZSxcbiAgICAgICAgICAgICAgICBkaXN0cmlidXRpb246IGFzc2V0LmludmFsaWRhdGVPbkNoYW5nZSA/IHRoaXMuY2RuIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvblBhdGhzOiBhc3NldC5pbnZhbGlkYXRlT25DaGFuZ2UgPyBbYC8ke2Fzc2V0LnBhdHRlcm59YF0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLk9ORV9EQVksXG4gICAgICAgICAgICAgICAgbWVtb3J5TGltaXQ6IDI1NiAvLyBTb21lIE51eHQgYXBwbGljYXRpb25zIGhhdmUgYSBsb3Qgb2YgYXNzZXRzIHRvIGRlcGxveSB3aGVyZWJ5IHRoZSBmdW5jdGlvbiBtaWdodCBydW4gb3V0IG9mIG1lbW9yeVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdGhlIGhvc3RlZCB6b25lIGF0IHdoaWNoIHRoZSBETlMgcmVjb3JkcyBzaGFsbCBiZSBjcmVhdGVkIHRvIGFjY2VzcyB0aGUgTnV4dCBhcHAgb24gdGhlIGludGVybmV0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRIb3N0ZWRab25lKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IElIb3N0ZWRab25lIHtcbiAgICAgICAgY29uc3QgZG9tYWluUGFydHMgPSBwcm9wcy5kb21haW4uc3BsaXQoJy4nKTtcblxuICAgICAgICByZXR1cm4gSG9zdGVkWm9uZS5mcm9tSG9zdGVkWm9uZUF0dHJpYnV0ZXModGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1ob3N0ZWQtem9uZWAsIHtcbiAgICAgICAgICAgIGhvc3RlZFpvbmVJZDogcHJvcHMuaG9zdGVkWm9uZUlkLFxuICAgICAgICAgICAgem9uZU5hbWU6IGRvbWFpblBhcnRzW2RvbWFpblBhcnRzLmxlbmd0aCAtIDFdLCAvLyBTdXBwb3J0IHN1YmRvbWFpbnNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgRE5TIHJlY29yZHMgdG8gYWNjZXNzIHRoZSBOdXh0IGFwcCBvbiB0aGUgaW50ZXJuZXQgdmlhIHRoZSBjdXN0b20gZG9tYWluLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURuc1JlY29yZHMocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhvc3RlZFpvbmUgPSB0aGlzLmZpbmRIb3N0ZWRab25lKHByb3BzKTtcbiAgICAgICAgY29uc3QgZG5zVGFyZ2V0ID0gUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgQ2xvdWRGcm9udFRhcmdldCh0aGlzLmNkbikpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHJlY29yZCBmb3IgSVB2NFxuICAgICAgICBuZXcgQVJlY29yZCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWlwdjQtcmVjb3JkYCwge1xuICAgICAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgem9uZTogaG9zdGVkWm9uZSxcbiAgICAgICAgICAgIHRhcmdldDogZG5zVGFyZ2V0LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgYSByZWNvcmQgZm9yIElQdjZcbiAgICAgICAgbmV3IEFhYWFSZWNvcmQodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1pcHY2LXJlY29yZGAsIHtcbiAgICAgICAgICAgIHJlY29yZE5hbWU6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgIHpvbmU6IGhvc3RlZFpvbmUsXG4gICAgICAgICAgICB0YXJnZXQ6IGRuc1RhcmdldCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBydWxlIHRvIHBpbmcgdGhlIE51eHQgYXBwIExhbWJkYSBmdW5jdGlvbiBldmVyeSA1IG1pbnV0ZXMgaW4gb3JkZXIgdG8ga2VlcCBpdCB3YXJtXG4gICAgICogYW5kIHNwZWVkIHVwIGluaXRpYWwgU1NSIHJlcXVlc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFwcFBpbmdSdWxlKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBmYWtlQXBpR2F0ZXdheUV2ZW50RGF0YSA9IHtcbiAgICAgICAgICAgIFwidmVyc2lvblwiOiBcIjIuMFwiLFxuICAgICAgICAgICAgXCJyb3V0ZUtleVwiOiBcIkdFVCAve3Byb3h5K31cIixcbiAgICAgICAgICAgIFwicmF3UGF0aFwiOiBcIi9cIixcbiAgICAgICAgICAgIFwicmF3UXVlcnlTdHJpbmdcIjogXCJcIixcbiAgICAgICAgICAgIFwiaGVhZGVyc1wiOiB7fSxcbiAgICAgICAgICAgIFwicmVxdWVzdENvbnRleHRcIjoge1xuICAgICAgICAgICAgICAgIFwiZG9tYWluTmFtZVwiOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICAgICAgXCJodHRwXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJtZXRob2RcIjogXCJHRVRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXRoXCI6IFwiL1wiLFxuICAgICAgICAgICAgICAgICAgICBcInByb3RvY29sXCI6IFwiSFRUUC8xLjFcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBuZXcgUnVsZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXBpbmdlci1ydWxlYCwge1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcGluZ2VyYCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUGluZ3MgdGhlIExhbWJkYSBmdW5jdGlvbiBvZiB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IGFwcCBldmVyeSA1IG1pbnV0ZXMgdG8ga2VlcCBpdCB3YXJtLmAsXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLnJhdGUoRHVyYXRpb24ubWludXRlcyg1KSksXG4gICAgICAgICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMuYXBwTGFtYmRhRnVuY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBldmVudDogUnVsZVRhcmdldElucHV0LmZyb21PYmplY3QoZmFrZUFwaUdhdGV3YXlFdmVudERhdGEpXG4gICAgICAgICAgICB9KV0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBydWxlIHRoYXQgcnVucyBldmVyeSB0dWVzZGF5IGF0IDAzOjMwIEFNIEdNVCB0byB0cmlnZ2VyXG4gICAgICogb3VyIGNsZWFudXAgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsZWFudXBUcmlnZ2VyUnVsZSgpOiB2b2lkIHtcbiAgICAgICAgbmV3IFJ1bGUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zY2hlZHVsZXItcnVsZWAsIHtcbiAgICAgICAgICAgIHJ1bGVOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNjaGVkdWxlcmAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFRyaWdnZXJzIGEgY2xlYW51cCBvZiB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBhdCB0aGUgJHt0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfSBTMyBidWNrZXQuYCxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUuY3Jvbih7d2Vla0RheTogJzMnLCBob3VyOiAnMycsIG1pbnV0ZTogJzMwJ30pLFxuICAgICAgICAgICAgdGFyZ2V0czogW25ldyBMYW1iZGFGdW5jdGlvbih0aGlzLmNsZWFudXBMYW1iZGFGdW5jdGlvbildLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|
|
432
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnV4dC1zZXJ2ZXItYXBwLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibnV4dC1zZXJ2ZXItYXBwLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyRDtBQUUzRCwrRUFBK0Q7QUFDL0QsK0RBZ0JvQztBQUNwQyx1REFBb0c7QUFDcEcsK0NBTzRCO0FBQzVCLHlEQUFtRztBQUNuRyxxRUFBbUc7QUFDbkcsK0VBQXdFO0FBQ3hFLHlFQUFpRTtBQUNqRSxpRkFBK0Q7QUFDL0QsbURBQW1EO0FBQ25ELHNHQUFtRjtBQUNuRiw0RUFBa0c7QUFDbEcsc0VBQTBGO0FBQzFGLHlCQUF5QjtBQUN6Qix1REFBdUU7QUFDdkUsdUVBQThEO0FBRTlELDZCQUE2QjtBQThFN0I7O0dBRUc7QUFDSCxNQUFhLGtCQUFtQixTQUFRLG1CQUFLO0lBc0V6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3BFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakYscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFBLHFEQUE0QixHQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3hELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUUxRCxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1C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RUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDO1lBQ2hFLE9BQU8sRUFBRSxDQUFDLElBQUksbUNBQWMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUM1RCxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUF6Z0JELGdEQXlnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0R1cmF0aW9uLCBSZW1vdmFsUG9saWN5LCBTdGFja30gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtDb25zdHJ1Y3R9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtDZXJ0aWZpY2F0ZX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gICAgQWxsb3dlZE1ldGhvZHMsXG4gICAgQmVoYXZpb3JPcHRpb25zLFxuICAgIENhY2hlQ29va2llQmVoYXZpb3IsXG4gICAgQ2FjaGVkTWV0aG9kcyxcbiAgICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICAgIENhY2hlUG9saWN5LFxuICAgIENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvcixcbiAgICBEaXN0cmlidXRpb24sIEh0dHBWZXJzaW9uLFxuICAgIElDYWNoZVBvbGljeSxcbiAgICBJT3JpZ2luQWNjZXNzSWRlbnRpdHksXG4gICAgT3JpZ2luQWNjZXNzSWRlbnRpdHksXG4gICAgT3JpZ2luUHJvdG9jb2xQb2xpY3ksXG4gICAgUHJpY2VDbGFzcyxcbiAgICBTZWN1cml0eVBvbGljeVByb3RvY29sLFxuICAgIFZpZXdlclByb3RvY29sUG9saWN5XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHtBcmNoaXRlY3R1cmUsIENvZGUsIEZ1bmN0aW9uLCBMYXllclZlcnNpb24sIFJ1bnRpbWUsIFRyYWNpbmd9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICAgIEJsb2NrUHVibGljQWNjZXNzLFxuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRBY2Nlc3NDb250cm9sLFxuICAgIEJ1Y2tldEVuY3J5cHRpb24sXG4gICAgSUJ1Y2tldCxcbiAgICBPYmplY3RPd25lcnNoaXBcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHtBYWFhUmVjb3JkLCBBUmVjb3JkLCBIb3N0ZWRab25lLCBJSG9zdGVkWm9uZSwgUmVjb3JkVGFyZ2V0fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7QnVja2V0RGVwbG95bWVudCwgQ2FjaGVDb250cm9sLCBTb3VyY2UsIFN0b3JhZ2VDbGFzc30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zMy1kZXBsb3ltZW50XCI7XG5pbXBvcnQge0h0dHBPcmlnaW4sIFMzT3JpZ2lufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQtb3JpZ2luc1wiO1xuaW1wb3J0IHtDbG91ZEZyb250VGFyZ2V0fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0c1wiO1xuaW1wb3J0IHtIdHRwTWV0aG9kfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3NcIjtcbmltcG9ydCB7UmV0ZW50aW9uRGF5c30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQge0h0dHBMYW1iZGFJbnRlZ3JhdGlvbn0gZnJvbSAnQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1pbnRlZ3JhdGlvbnMtYWxwaGEnO1xuaW1wb3J0IHtEb21haW5OYW1lLCBFbmRwb2ludFR5cGUsIEh0dHBBcGksIFNlY3VyaXR5UG9saWN5fSBmcm9tIFwiQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1hbHBoYVwiO1xuaW1wb3J0IHtnZXROdXh0QXBwU3RhdGljQXNzZXRDb25maWdzLCBTdGF0aWNBc3NldENvbmZpZ30gZnJvbSBcIi4uL251eHQtYXBwLXN0YXRpYy1hc3NldHNcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHtSdWxlLCBSdWxlVGFyZ2V0SW5wdXQsIFNjaGVkdWxlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHtMYW1iZGFGdW5jdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xuaW1wb3J0IHtOdXh0QXBwU3RhY2tQcm9wc30gZnJvbSBcIi4uL251eHQtYXBwLXN0YWNrLXByb3BzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcHJvcHMgcmVxdWlyZWQgZm9yIHRoZSB7QHNlZSBOdXh0U2VydmVyQXBwU3RhY2t9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzIGV4dGVuZHMgTnV4dEFwcFN0YWNrUHJvcHMge1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFSTiBvZiB0aGUgY2VydGlmaWNhdGUgdG8gdXNlIGF0IHRoZSBBcGlHYXRld2F5IGZvciB0aGUgTnV4dCBhcHAgdG8gbWFrZSBpdCBhY2Nlc3NpYmxlIHZpYSB0aGUgY3VzdG9tIGRvbWFpblxuICAgICAqIGFuZCB0byBwcm92aWRlIHRoZSBjdXN0b20gZG9tYWluIHRvIHRoZSBOdXh0IGFwcCB2aWEgdGhlICdIb3N0JyBoZWFkZXIgZm9yIHNlcnZlciBzaWRlIHJlbmRlcmluZyB1c2UgY2FzZXMuXG4gICAgICogVGhlIGNlcnRpZmljYXRlIG11c3QgYmUgaXNzdWVkIGluIHRoZSBzYW1lIHJlZ2lvbiBhcyBzcGVjaWZpZWQgdmlhICdlbnYucmVnaW9uJyBhcyBBcGlHYXRld2F5IHdvcmtzIHJlZ2lvbmFsbHkuXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmVnaW9uYWxUbHNDZXJ0aWZpY2F0ZUFybjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZpbGUgbmFtZSAod2l0aG91dCBleHRlbnNpb24pIG9mIHRoZSBMYW1iZGEgZW50cnlwb2ludCB3aXRoaW4gdGhlICdzZXJ2ZXInIGRpcmVjdG9yeSBleHBvcnRpbmcgYSBoYW5kbGVyLlxuICAgICAqIERlZmF1bHRzIHRvIFwiaW5kZXhcIi5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbnRyeXBvaW50Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQSBKU09OIHNlcmlhbGl6ZWQgc3RyaW5nIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW50cnlwb2ludEVudj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBtZW1vcnkgc2l6ZSB0byBhcHBseSB0byB0aGUgTnV4dCBhcHAncyBMYW1iZGEuXG4gICAgICogRGVmYXVsdHMgdG8gMTc5Mk1CIChvcHRpbWl6ZWQgZm9yIGNvc3RzIGFuZCBwZXJmb3JtYW5jZSBmb3Igc3RhbmRhcmQgTnV4dCBhcHBzKS5cbiAgICAgKi9cbiAgICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgQVdTIFgtUmF5IGZvciB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW5hYmxlVHJhY2luZz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBhIGdsb2JhbCBTaXRlbWFwIGJ1Y2tldCB3aGljaCBpcyBwZXJtYW5lbnRseSBhY2Nlc3NpYmxlIHRocm91Z2ggbXVsdGlwbGUgZGVwbG95bWVudHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW5hYmxlU2l0ZW1hcD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBoZWFkZXJzIHRvIHBhc3MgdG8gdGhlIE51eHQgYXBwIG9uIFNTUiByZXF1ZXN0cy5cbiAgICAgKiBUaGUgbW9yZSBoZWFkZXJzIGFyZSBwYXNzZWQsIHRoZSB3ZWFrZXIgdGhlIGNhY2hlIHBlcmZvcm1hbmNlIHdpbGwgYmUsIGFzIHRoZSBjYWNoZSBrZXlcbiAgICAgKiBpcyBiYXNlZCBvbiB0aGUgaGVhZGVycy5cbiAgICAgKiBObyBoZWFkZXJzIGFyZSBwYXNzZWQgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGxvd0hlYWRlcnM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGNvb2tpZXMgdG8gcGFzcyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIFRoZSBtb3JlIGNvb2tpZXMgYXJlIHBhc3NlZCwgdGhlIHdlYWtlciB0aGUgY2FjaGUgcGVyZm9ybWFuY2Ugd2lsbCBiZSwgYXMgdGhlIGNhY2hlIGtleVxuICAgICAqIGlzIGJhc2VkIG9uIHRoZSBjb29raWVzLlxuICAgICAqIE5vIGNvb2tpZXMgYXJlIHBhc3NlZCBieSBkZWZhdWx0LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFsbG93Q29va2llcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcXVlcnkgcGFyYW0ga2V5cyB0byBwYXNzIHRvIHRoZSBOdXh0IGFwcCBvbiBTU1IgcmVxdWVzdHMuXG4gICAgICogVGhlIG1vcmUgcXVlcnkgcGFyYW1zIGFyZSBwYXNzZWQsIHRoZSB3ZWFrZXIgdGhlIGNhY2hlIHBlcmZvcm1hbmNlIHdpbGwgYmUsIGFzIHRoZSBjYWNoZSBrZXlcbiAgICAgKiBpcyBiYXNlZCBvbiB0aGUgcXVlcnkgcGFyYW1zLlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvbmZpZyBjYW4gbm90IGJlIGNvbWJpbmVkIHdpdGgge0BzZWUgZGVueVF1ZXJ5UGFyYW1zfS5cbiAgICAgKiBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB7QHNlZSBkZW55UXVlcnlQYXJhbXN9IHdpbGwgYmUgaWdub3JlZC5cbiAgICAgKiBBbGwgcXVlcnkgcGFyYW1zIGFyZSBwYXNzZWQgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGxvd1F1ZXJ5UGFyYW1zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBxdWVyeSBwYXJhbSBrZXlzIHRvIGRlbnkgcGFzc2luZyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIEl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBwcmV2ZW50IHNwZWNpZmljIGV4dGVybmFsIHF1ZXJ5IHBhcmFtcywgZS5nLiwgZmJjbGlkLCB1dG1fY2FtcGFpZ24sIC4uLixcbiAgICAgKiB0byBpbXByb3ZlIGNhY2hlIHBlcmZvcm1hbmNlLCBhcyB0aGUgY2FjaGUga2V5IGlzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1zLlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvbmZpZyBjYW4gbm90IGJlIGNvbWJpbmVkIHdpdGgge0BzZWUgYWxsb3dRdWVyeVBhcmFtc30uXG4gICAgICogSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUge0BzZWUgZGVueVF1ZXJ5UGFyYW1zfSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICogQWxsIHF1ZXJ5IHBhcmFtcyBhcmUgcGFzc2VkIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVueVF1ZXJ5UGFyYW1zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ0RLIHN0YWNrIHRvIGRlcGxveSBhIGR5bmFtaWMgTnV4dCBhcHAgKHRhcmdldD1zZXJ2ZXIpIG9uIEFXUyB3aXRoIExhbWJkYSwgQXBpR2F0ZXdheSwgUzMgYW5kIENsb3VkRnJvbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBOdXh0U2VydmVyQXBwU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBwcmVmaXggb2YgdGhlIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZUlkUHJlZml4OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgZGVwbG95bWVudCB0aGF0IGlzIHVzZWQgYXMgUzMgZm9sZGVyIG5hbWVcbiAgICAgKiB0byBzdG9yZSB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95bWVudFJldmlzaW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpdHkgdG8gdXNlIGZvciBhY2Nlc3NpbmcgdGhlIGRlcGxveW1lbnQgYXNzZXRzIG9uIFMzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkbkFjY2Vzc0lkZW50aXR5OiBJT3JpZ2luQWNjZXNzSWRlbnRpdHk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBkZXBsb3ltZW50IGFzc2V0cyBnZXRzIHN0b3JlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljQXNzZXRzQnVja2V0OiBJQnVja2V0O1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgc2l0ZW1hcCBhc3NldHMgZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIHNpdGVtYXBCdWNrZXQ6IElCdWNrZXR8dW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogVGhlIExhbWJkYSBmdW5jdGlvbiB0byByZW5kZXIgdGhlIE51eHQgYXBwIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHBMYW1iZGFGdW5jdGlvbjogRnVuY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsZWFudXBMYW1iZGFGdW5jdGlvbjogRnVuY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQVBJIGdhdGV3YXkgdG8gbWFrZSB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgTnV4dCBhcHAgcHVibGljbHkgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGFwaUdhdGV3YXk6IEh0dHBBcGk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29uZmlncyBmb3IgdGhlIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwIHRoYXQgc2hhbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpY0Fzc2V0Q29uZmlnczogU3RhdGljQXNzZXRDb25maWdbXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24gKHZpYSB0aGUgQVBJIGdhdGV3YXkpXG4gICAgICogb3IgdGhlIFMzIGFzc2V0cyBmb2xkZXIgKHdpdGggY2FjaGluZykuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RuOiBEaXN0cmlidXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5yZXNvdXJjZUlkUHJlZml4ID0gYCR7cHJvcHMucHJvamVjdH0tJHtwcm9wcy5zZXJ2aWNlfS0ke3Byb3BzLmVudmlyb25tZW50fWA7XG5cbiAgICAgICAgLy8gTnV4dCBhcHAgcmVzb3VyY2VzXG4gICAgICAgIHRoaXMuZGVwbG95bWVudFJldmlzaW9uID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncyA9IGdldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3MoKTtcbiAgICAgICAgdGhpcy5jZG5BY2Nlc3NJZGVudGl0eSA9IHRoaXMuY3JlYXRlQ2RuQWNjZXNzSWRlbnRpdHkoKTtcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQgPSB0aGlzLmNyZWF0ZVN0YXRpY0Fzc2V0c0J1Y2tldCgpO1xuXG4gICAgICAgIGlmIChwcm9wcy5lbmFibGVTaXRlbWFwKSB7XG4gICAgICAgICAgICB0aGlzLnNpdGVtYXBCdWNrZXQgPSB0aGlzLmNyZWF0ZVNpdGVtYXBCdWNrZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwTGFtYmRhRnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUFwcExhbWJkYUZ1bmN0aW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5hcGlHYXRld2F5ID0gdGhpcy5jcmVhdGVBcGlHYXRld2F5KHByb3BzKTtcbiAgICAgICAgdGhpcy5jZG4gPSB0aGlzLmNyZWF0ZUNsb3VkRnJvbnREaXN0cmlidXRpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZURlcGxveW1lbnRzKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlRG5zUmVjb3Jkcyhwcm9wcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlQXBwUGluZ1J1bGUocHJvcHMpO1xuXG4gICAgICAgIC8vIFN0YXRpYyBhc3NldHMgY2xlYW51cCByZXNvdXJjZXNcbiAgICAgICAgdGhpcy5jbGVhbnVwTGFtYmRhRnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUNsZWFudXBMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2xlYW51cFRyaWdnZXJSdWxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgaWRlbnRpdHkgdG8gYWNjZXNzIHRoZSBTMyBkZXBsb3ltZW50IGFzc2V0IGZpbGVzIHZpYSB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2RuQWNjZXNzSWRlbnRpdHkoKTogSU9yaWdpbkFjY2Vzc0lkZW50aXR5IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luQWNjZXNzSWRlbnRpdHlOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG4tczMtYWNjZXNzYDtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmlnaW5BY2Nlc3NJZGVudGl0eSh0aGlzLCBvcmlnaW5BY2Nlc3NJZGVudGl0eU5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGJ1Y2tldCB0byBzdG9yZSB0aGUgc3RhdGljIGRlcGxveW1lbnQgYXNzZXQgZmlsZXMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVN0YXRpY0Fzc2V0c0J1Y2tldCgpOiBJQnVja2V0IHtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXNzZXRzYDtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgYnVja2V0TmFtZSxcbiAgICAgICAgICAgIC8vIFRoZSBidWNrZXQgYW5kIGFsbCBvZiBpdHMgb2JqZWN0cyBjYW4gYmUgZGVsZXRlZCwgYmVjYXVzZSBhbGwgdGhlIGNvbnRlbnQgaXMgbWFuYWdlZCBpbiB0aGlzIHByb2plY3RcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICAgICAgb2JqZWN0T3duZXJzaGlwOiBPYmplY3RPd25lcnNoaXAuQlVDS0VUX09XTkVSX0VORk9SQ0VELFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBidWNrZXQgdG8gc3RvcmUgdGhlIHNpdGVtYXAgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTaXRlbWFwQnVja2V0KCk6IEJ1Y2tldCB7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNpdGVtYXBgO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsIGJ1Y2tldE5hbWUsIHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBhY2Nlc3NDb250cm9sOiBCdWNrZXRBY2Nlc3NDb250cm9sLlBSSVZBVEUsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgICAgICAgIC8vIFRoZSBidWNrZXQgYW5kIGFsbCBvZiBpdHMgb2JqZWN0cyBjYW4gYmUgZGVsZXRlZCwgYmVjYXVzZSBhbGwgdGhlIGNvbnRlbnQgaXMgbWFuYWdlZCBpbiB0aGlzIHByb2plY3RcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcHBMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmNOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hcHAtZnVuY3Rpb25gO1xuXG4gICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24odGhpcywgZnVuY05hbWUsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogZnVuY05hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFJlbmRlcnMgdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBOdXh0IGFwcC5gLFxuICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgICAgICAgIGhhbmRsZXI6IGAke3Byb3BzLmVudHJ5cG9pbnQgPz8gJ2luZGV4J30uaGFuZGxlcmAsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldCgnLm91dHB1dC9zZXJ2ZXInLCB7XG4gICAgICAgICAgICAgICAgZXhjbHVkZTogWycqKi5zdmcnLCAnKiouaWNvJywgJyoqLnBuZycsICcqKi5qcGcnLCAnKiouanMubWFwJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSA/PyAxNzkyLFxuICAgICAgICAgICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgICAgICAgIGFsbG93UHVibGljU3VibmV0OiBmYWxzZSxcbiAgICAgICAgICAgIHRyYWNpbmc6IHByb3BzLmVuYWJsZVRyYWNpbmcgPyBUcmFjaW5nLkFDVElWRSA6IFRyYWNpbmcuRElTQUJMRUQsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICAgIE5PREVfT1BUSU9OUzogJy0tZW5hYmxlLXNvdXJjZS1tYXBzJyxcbiAgICAgICAgICAgICAgICAuLi5KU09OLnBhcnNlKHByb3BzLmVudHJ5cG9pbnRFbnYgPz8gJ3t9JyksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBjbGVhbnVwcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2xlYW51cExhbWJkYUZ1bmN0aW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IEZ1bmN0aW9uIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lOiBzdHJpbmcgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNsZWFudXAtZnVuY3Rpb25gO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdDogRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24odGhpcywgZnVuY3Rpb25OYW1lLCB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQXV0by1kZWxldGVzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIGluIHRoZSAke3RoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9IFMzIGJ1Y2tldC5gLFxuICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgICAgICAgIGxheWVyczogW25ldyBMYXllclZlcnNpb24odGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1sYXllcmAsIHtcbiAgICAgICAgICAgICAgICBsYXllclZlcnNpb25OYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWxheWVyYCxcbiAgICAgICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2Fzc2V0cy1jbGVhbnVwL2J1aWxkL2xheWVyJykpLFxuICAgICAgICAgICAgICAgIGNvbXBhdGlibGVSdW50aW1lczogW1J1bnRpbWUuTk9ERUpTXzE2X1hdLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUHJvdmlkZXMgdGhlIG5vZGVfbW9kdWxlcyByZXF1aXJlZCBmb3IgdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBsYW1iZGEgZnVuY3Rpb24uYFxuICAgICAgICAgICAgfSldLFxuICAgICAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hc3NldHMtY2xlYW51cC9idWlsZC9hcHAnKSksXG4gICAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgICAgICAgbWVtb3J5U2l6ZTogMTI4LFxuICAgICAgICAgICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgICAgU1RBVElDX0FTU0VUU19CVUNLRVQ6IHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgRU5WSVJPTk1FTlQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgICAgICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZ3JhbnQgZnVuY3Rpb24gYWNjZXNzIHRvIFMzIGJ1Y2tldFxuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudFJlYWQocmVzdWx0KTtcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnREZWxldGUocmVzdWx0KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIEFQSSBnYXRld2F5IHRvIG1ha2UgdGhlIE51eHQgYXBwIHJlbmRlciBMYW1iZGEgZnVuY3Rpb24gcHVibGljbHkgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFwaUdhdGV3YXkocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogSHR0cEFwaSB7XG4gICAgICAgIGNvbnN0IGFwaU5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFwaWA7XG4gICAgICAgIGNvbnN0IGxhbWJkYUludGVncmF0aW9uID0gbmV3IEh0dHBMYW1iZGFJbnRlZ3JhdGlvbihgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWxhbWJkYS1pbnRlZ3JhdGlvbmAsIHRoaXMuYXBwTGFtYmRhRnVuY3Rpb24pO1xuXG4gICAgICAgIC8vIFdlIHdhbnQgdGhlIEFQSSBnYXRld2F5IHRvIGJlIGFjY2Vzc2libGUgYnkgdGhlIGN1c3RvbSBkb21haW4gbmFtZS5cbiAgICAgICAgLy8gRXZlbiB0aG91Z2ggd2UgYWNjZXNzIHRoZSBnYXRld2F5IHZpYSBDbG91ZEZyb250IChmb3IgYXV0byBodHRwIHRvIGh0dHBzIHJlZGlyZWN0cyksIHRoaXMgaXMgcmVxdWlyZWRcbiAgICAgICAgLy8gdG8gYmUgYWJsZSB0byByZWRpcmVjdCB0aGUgb3JpZ2luYWwgJ0hvc3QnIGhlYWRlciB0byB0aGUgTnV4dCBhcHBsaWNhdGlvbiwgaWYgcmVxdWVzdGVkLlxuICAgICAgICBjb25zdCBkb21haW5OYW1lID0gbmV3IERvbWFpbk5hbWUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hcGktZG9tYWluYCwge1xuICAgICAgICAgICAgZG9tYWluTmFtZTogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXJlZ2lvbmFsLWNlcnRpZmljYXRlYCwgcHJvcHMucmVnaW9uYWxUbHNDZXJ0aWZpY2F0ZUFybiksXG4gICAgICAgICAgICBlbmRwb2ludFR5cGU6IEVuZHBvaW50VHlwZS5SRUdJT05BTCxcbiAgICAgICAgICAgIHNlY3VyaXR5UG9saWN5OiBTZWN1cml0eVBvbGljeS5UTFNfMV8yXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGFwaUdhdGV3YXkgPSBuZXcgSHR0cEFwaSh0aGlzLCBhcGlOYW1lLCB7XG4gICAgICAgICAgICBhcGlOYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBDb25uZWN0cyB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHdpdGggdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBMYW1iZGEgZnVuY3Rpb24gdG8gbWFrZSBpdCBwdWJsaWNseSBhdmFpbGFibGUuYCxcbiAgICAgICAgICAgIC8vIFRoZSBhcHAgZG9lcyBub3QgYWxsb3cgYW55IGNyb3NzLW9yaWdpbiBhY2Nlc3MgYnkgcHVycG9zZTogdGhlIGFwcCBzaG91bGQgbm90IGJlIGVtYmVkZGFibGUgYW55d2hlcmVcbiAgICAgICAgICAgIGNvcnNQcmVmbGlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlZmF1bHRJbnRlZ3JhdGlvbjogbGFtYmRhSW50ZWdyYXRpb24sXG4gICAgICAgICAgICBkZWZhdWx0RG9tYWluTWFwcGluZzoge1xuICAgICAgICAgICAgICAgIGRvbWFpbk5hbWU6IGRvbWFpbk5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXBpR2F0ZXdheS5hZGRSb3V0ZXMoe1xuICAgICAgICAgICAgaW50ZWdyYXRpb246IGxhbWJkYUludGVncmF0aW9uLFxuICAgICAgICAgICAgcGF0aDogJy97cHJveHkrfScsXG4gICAgICAgICAgICBtZXRob2RzOiBbSHR0cE1ldGhvZC5HRVQsIEh0dHBNZXRob2QuSEVBRF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhcGlHYXRld2F5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRoYXQgcm91dGVzIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbiAodmlhIHRoZSBBUEkgZ2F0ZXdheSlcbiAgICAgKiBvciB0aGUgUzMgYXNzZXRzIGZvbGRlciAod2l0aCBjYWNoaW5nKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDbG91ZEZyb250RGlzdHJpYnV0aW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IERpc3RyaWJ1dGlvbiB7XG4gICAgICAgIGNvbnN0IGNkbk5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbmA7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEaXN0cmlidXRpb24odGhpcywgY2RuTmFtZSwge1xuICAgICAgICAgICAgZG9tYWluTmFtZXM6IFtwcm9wcy5kb21haW5dLFxuICAgICAgICAgICAgY29tbWVudDogY2RuTmFtZSxcbiAgICAgICAgICAgIG1pbmltdW1Qcm90b2NvbFZlcnNpb246IFNlY3VyaXR5UG9saWN5UHJvdG9jb2wuVExTX1YxXzJfMjAxOCxcbiAgICAgICAgICAgIGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4odGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1nbG9iYWwtY2VydGlmaWNhdGVgLCBwcm9wcy5nbG9iYWxUbHNDZXJ0aWZpY2F0ZUFybiksXG4gICAgICAgICAgICBodHRwVmVyc2lvbjogSHR0cFZlcnNpb24uSFRUUDJfQU5EXzMsXG4gICAgICAgICAgICBkZWZhdWx0QmVoYXZpb3I6IHRoaXMuY3JlYXRlTnV4dEFwcFJvdXRlQmVoYXZpb3IocHJvcHMpLFxuICAgICAgICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczogdGhpcy5zZXR1cENsb3VkRnJvbnRSb3V0aW5nKHByb3BzKSxcbiAgICAgICAgICAgIHByaWNlQ2xhc3M6IFByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfMTAwLCAvLyBVc2Ugb25seSBOb3J0aCBBbWVyaWNhIGFuZCBFdXJvcGVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiAodmlhIEFQSSBnYXRld2F5KS5cbiAgICAgKiBBZGRpdGlvbmFsbHksIHRoaXMgYXV0b21hdGljYWxseSByZWRpcmVjdHMgSFRUUCByZXF1ZXN0cyB0byBIVFRQUy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwUm91dGVCZWhhdmlvcihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3JpZ2luOiBuZXcgSHR0cE9yaWdpbihgJHt0aGlzLmFwaUdhdGV3YXkuaHR0cEFwaUlkfS5leGVjdXRlLWFwaS4ke3RoaXMucmVnaW9ufS5hbWF6b25hd3MuY29tYCwge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygyKSxcbiAgICAgICAgICAgICAgICByZWFkVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICAgICAgcHJvdG9jb2xQb2xpY3k6IE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBTX09OTFksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRCxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IHRoaXMuY3JlYXRlU3NyQ2FjaGVQb2xpY3kocHJvcHMpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBDbG91ZEZyb250Um91dGluZyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgbGV0IHJvdXRpbmdCZWhhdmlvdXJzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG5cbiAgICAgICAgLy8gU3BlY2lmaWMgb25lcyBmaXJzdFxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlU2l0ZW1hcCkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlU2l0ZW1hcFJvdXRlQmVoYXZpb3IoKX07XG4gICAgICAgIH1cblxuICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVTdGF0aWNBc3NldHNSb3V0ZUJlaGF2aW9yKCl9O1xuXG4gICAgICAgIHJldHVybiByb3V0aW5nQmVoYXZpb3VycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2FjaGUgcG9saWN5IGZvciB0aGUgTnV4dCBhcHAgcm91dGUgYmVoYXZpb3Igb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqIEV2ZW4gdGhvdWdoIHdlIGRvbid0IHdhbnQgdG8gY2FjaGUgU1NSIHJlcXVlc3RzLCB3ZSBzdGlsbCBoYXZlIHRvIGNyZWF0ZSB0aGlzIGNhY2hlIHBvbGljeSBpbiBvcmRlciB0b1xuICAgICAqIGZvcndhcmQgcmVxdWlyZWQgY29va2llcywgcXVlcnkgcGFyYW1zIGFuZCBoZWFkZXJzLiBUaGlzIGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UsIGJlY2F1c2UgaWYgbm90aGluZ1xuICAgICAqIGlzIGNhY2hlZCwgb25lIHdvdWxkIGV4cGVjdCwgdGhhdCBhbnl0aGluZyB3b3VsZC9jb3VsZCBiZSBmb3J3YXJkZWQsIGJ1dCBhbnl3YXkuLi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVNzckNhY2hlUG9saWN5KHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IElDYWNoZVBvbGljeSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FjaGVQb2xpY3kodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jYWNoZS1wb2xpY3lgLCB7XG4gICAgICAgICAgICBjYWNoZVBvbGljeU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuLWNhY2hlLXBvbGljeWAsXG4gICAgICAgICAgICBjb21tZW50OiBgRGVmaW5lcyB3aGljaCByZXF1ZXN0IGRhdGEgdG8gcGFzcyB0byB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IG9yaWdpbiBhbmQgaG93IHRoZSBjYWNoZSBrZXkgaXMgY2FsY3VsYXRlZC5gLFxuICAgICAgICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgICAgICAgIG1pblR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgICAgICAgIG1heFR0bDogRHVyYXRpb24uZGF5cygzNjUpLFxuICAgICAgICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogcHJvcHMuYWxsb3dRdWVyeVBhcmFtcyA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dRdWVyeVBhcmFtcykgOiAocHJvcHMuZGVueVF1ZXJ5UGFyYW1zID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmRlbnlMaXN0KC4uLnByb3BzLmRlbnlRdWVyeVBhcmFtcykgOiBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCkpLFxuICAgICAgICAgICAgaGVhZGVyQmVoYXZpb3I6IHByb3BzLmFsbG93SGVhZGVycyA/IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmFsbG93SGVhZGVycykgOiBDYWNoZUhlYWRlckJlaGF2aW9yLm5vbmUoKSxcbiAgICAgICAgICAgIGNvb2tpZUJlaGF2aW9yOiBwcm9wcy5hbGxvd0Nvb2tpZXMgPyBDYWNoZUNvb2tpZUJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5hbGxvd0Nvb2tpZXMpIDogQ2FjaGVDb29raWVCZWhhdmlvci5ub25lKCksXG4gICAgICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0Jyb3RsaTogdHJ1ZSxcbiAgICAgICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nR3ppcDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgbWF0Y2hpbmcgaW5jb21pbmcgcmVxdWVzdHMgZm9yIHRoZSBzdGF0aWMgYXNzZXRzXG4gICAgICogdG8gdGhlIFMzIGJ1Y2tldCB0aGF0IGhvbGRzIHRoZXNlIHN0YXRpYyBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU3RhdGljQXNzZXRzUm91dGVCZWhhdmlvcigpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgY29uc3Qgc3RhdGljQXNzZXRzQ2FjaGVDb25maWc6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWdpbjogbmV3IFMzT3JpZ2luKHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LCB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMpLFxuICAgICAgICAgICAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OiB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5LFxuICAgICAgICAgICAgICAgIG9yaWdpblBhdGg6IHRoaXMuZGVwbG95bWVudFJldmlzaW9uLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRDb25maWdzLmZvckVhY2goYXNzZXQgPT4ge1xuICAgICAgICAgICAgcnVsZXNbYCR7YXNzZXQudGFyZ2V0fSR7YXNzZXQucGF0dGVybn1gXSA9IHN0YXRpY0Fzc2V0c0NhY2hlQ29uZmlnXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgbWF0Y2hpbmcgaW5jb21pbmcgcmVxdWVzdHMgZm9yIHRoZSBzaXRlbWFwIGFzc2V0c1xuICAgICAqIHRvIHRoZSBTMyBidWNrZXQgdGhhdCBob2xkcyB0aGVzZSBzaXRlbWFwIGFzc2V0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTaXRlbWFwUm91dGVCZWhhdmlvcigpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNpdGVtYXBCdWNrZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNpdGVtYXAgYnVja2V0IG11c3QgZXhpc3QgYmVmb3JlIGNyZWF0aW5nIHNpdGVtYXAgcm91dGUgYmVoYXZpb3IuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2l0ZW1hcENhY2hlQ29uZmlnOiBCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmlnaW46IG5ldyBTM09yaWdpbih0aGlzLnNpdGVtYXBCdWNrZXQsIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHM6IDIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMyksXG4gICAgICAgICAgICAgICAgb3JpZ2luQWNjZXNzSWRlbnRpdHk6IHRoaXMuY2RuQWNjZXNzSWRlbnRpdHksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRUQsXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFNcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgICAgICBydWxlc1snKnNpdGVtYXAueG1sJ10gPSBzaXRlbWFwQ2FjaGVDb25maWc7XG4gICAgICAgIHJ1bGVzWycqc2l0ZW1hcC1nb25lLnhtbCddID0gc2l0ZW1hcENhY2hlQ29uZmlnO1xuICAgICAgICBydWxlc1snL3NpdGVtYXBzLyonXSA9IHNpdGVtYXBDYWNoZUNvbmZpZztcblxuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBsb2FkcyB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAgYXMgZGVmaW5lZCBpbiB7QHNlZSBnZXROdXh0QXBwU3RhdGljQXNzZXRDb25maWdzfSB0byB0aGUgc3RhdGljIGFzc2V0cyBTMyBidWNrZXQuXG4gICAgICogSW4gb3JkZXIgdG8gZW5hYmxlIGEgemVyby1kb3dudGltZSBkZXBsb3ltZW50LCB3ZSB1c2UgYSBuZXcgc3ViZGlyZWN0b3J5IChyZXZpc2lvbikgZm9yIGV2ZXJ5IGRlcGxveW1lbnQuXG4gICAgICogVGhlIHByZXZpb3VzIHZlcnNpb25zIGFyZSByZXRhaW5lZCB0byBhbGxvdyBjbGllbnRzIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBhbiBvbGRlciByZXZpc2lvbiBidXQgZ2V0cyBjbGVhbmVkIHVwXG4gICAgICogYWZ0ZXIgYSBzcGVjaWZpZWQgcGVyaW9kIG9mIHRpbWUgdmlhIHRoZSBMYW1iZGEgZnVuY3Rpb24gaW4gdGhlIHtAc2VlIE51eHRBcHBBc3NldHNDbGVhbnVwU3RhY2t9LlxuICAgICAqL1xuICAgIHByaXZhdGUgY29uZmlndXJlRGVwbG95bWVudHMoKTogQnVja2V0RGVwbG95bWVudFtdIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdENhY2hlQ29uZmlnID0gW1xuICAgICAgICAgICAgQ2FjaGVDb250cm9sLnNldFB1YmxpYygpLFxuICAgICAgICAgICAgQ2FjaGVDb250cm9sLm1heEFnZShEdXJhdGlvbi5kYXlzKDM2NSkpLFxuICAgICAgICAgICAgQ2FjaGVDb250cm9sLmZyb21TdHJpbmcoJ2ltbXV0YWJsZScpLFxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFJldHVybnMgYSBkZXBsb3ltZW50IGZvciBldmVyeSBjb25maWd1cmVkIHN0YXRpYyBhc3NldCB0eXBlIHRvIHJlc3BlY3QgdGhlIGRpZmZlcmVudCBjYWNoZSBzZXR0aW5nc1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNBc3NldENvbmZpZ3MuZmlsdGVyKGFzc2V0ID0+IGZzLmV4aXN0c1N5bmMoYXNzZXQuc291cmNlKSkubWFwKChhc3NldCwgYXNzZXRJbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXNzZXRzLWRlcGxveW1lbnQtJHthc3NldEluZGV4fWAsIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VzOiBbU291cmNlLmFzc2V0KGFzc2V0LnNvdXJjZSldLFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogdGhpcy5kZXBsb3ltZW50UmV2aXNpb24gKyBhc3NldC50YXJnZXQsXG4gICAgICAgICAgICAgICAgcHJ1bmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHN0b3JhZ2VDbGFzczogU3RvcmFnZUNsYXNzLlNUQU5EQVJELFxuICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IFsnKiddLFxuICAgICAgICAgICAgICAgIGluY2x1ZGU6IFthc3NldC5wYXR0ZXJuXSxcbiAgICAgICAgICAgICAgICBjYWNoZUNvbnRyb2w6IGFzc2V0LmNhY2hlQ29udHJvbCA/PyBkZWZhdWx0Q2FjaGVDb25maWcsXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IGFzc2V0LmNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbjogYXNzZXQuaW52YWxpZGF0ZU9uQ2hhbmdlID8gdGhpcy5jZG4gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uUGF0aHM6IGFzc2V0LmludmFsaWRhdGVPbkNoYW5nZSA/IFtgLyR7YXNzZXQucGF0dGVybn1gXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX0RBWSxcbiAgICAgICAgICAgICAgICBtZW1vcnlMaW1pdDogMjU2IC8vIFNvbWUgTnV4dCBhcHBsaWNhdGlvbnMgaGF2ZSBhIGxvdCBvZiBhc3NldHMgdG8gZGVwbG95IHdoZXJlYnkgdGhlIGZ1bmN0aW9uIG1pZ2h0IHJ1biBvdXQgb2YgbWVtb3J5XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgaG9zdGVkIHpvbmUgYXQgd2hpY2ggdGhlIEROUyByZWNvcmRzIHNoYWxsIGJlIGNyZWF0ZWQgdG8gYWNjZXNzIHRoZSBOdXh0IGFwcCBvbiB0aGUgaW50ZXJuZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEhvc3RlZFpvbmUocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogSUhvc3RlZFpvbmUge1xuICAgICAgICBjb25zdCBkb21haW5QYXJ0cyA9IHByb3BzLmRvbWFpbi5zcGxpdCgnLicpO1xuXG4gICAgICAgIHJldHVybiBIb3N0ZWRab25lLmZyb21Ib3N0ZWRab25lQXR0cmlidXRlcyh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWhvc3RlZC16b25lYCwge1xuICAgICAgICAgICAgaG9zdGVkWm9uZUlkOiBwcm9wcy5ob3N0ZWRab25lSWQsXG4gICAgICAgICAgICB6b25lTmFtZTogZG9tYWluUGFydHNbZG9tYWluUGFydHMubGVuZ3RoIC0gMV0sIC8vIFN1cHBvcnQgc3ViZG9tYWluc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBETlMgcmVjb3JkcyB0byBhY2Nlc3MgdGhlIE51eHQgYXBwIG9uIHRoZSBpbnRlcm5ldCB2aWEgdGhlIGN1c3RvbSBkb21haW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRG5zUmVjb3Jkcyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaG9zdGVkWm9uZSA9IHRoaXMuZmluZEhvc3RlZFpvbmUocHJvcHMpO1xuICAgICAgICBjb25zdCBkbnNUYXJnZXQgPSBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHRoaXMuY2RuKSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgcmVjb3JkIGZvciBJUHY0XG4gICAgICAgIG5ldyBBUmVjb3JkKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taXB2NC1yZWNvcmRgLCB7XG4gICAgICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICB6b25lOiBob3N0ZWRab25lLFxuICAgICAgICAgICAgdGFyZ2V0OiBkbnNUYXJnZXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHJlY29yZCBmb3IgSVB2NlxuICAgICAgICBuZXcgQWFhYVJlY29yZCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWlwdjYtcmVjb3JkYCwge1xuICAgICAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgem9uZTogaG9zdGVkWm9uZSxcbiAgICAgICAgICAgIHRhcmdldDogZG5zVGFyZ2V0LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIHJ1bGUgdG8gcGluZyB0aGUgTnV4dCBhcHAgTGFtYmRhIGZ1bmN0aW9uIGV2ZXJ5IDUgbWludXRlcyBpbiBvcmRlciB0byBrZWVwIGl0IHdhcm1cbiAgICAgKiBhbmQgc3BlZWQgdXAgaW5pdGlhbCBTU1IgcmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBwUGluZ1J1bGUocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZha2VBcGlHYXRld2F5RXZlbnREYXRhID0ge1xuICAgICAgICAgICAgXCJ2ZXJzaW9uXCI6IFwiMi4wXCIsXG4gICAgICAgICAgICBcInJvdXRlS2V5XCI6IFwiR0VUIC97cHJveHkrfVwiLFxuICAgICAgICAgICAgXCJyYXdQYXRoXCI6IFwiL1wiLFxuICAgICAgICAgICAgXCJyYXdRdWVyeVN0cmluZ1wiOiBcIlwiLFxuICAgICAgICAgICAgXCJoZWFkZXJzXCI6IHt9LFxuICAgICAgICAgICAgXCJyZXF1ZXN0Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgICAgXCJkb21haW5OYW1lXCI6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgICAgICBcImh0dHBcIjoge1xuICAgICAgICAgICAgICAgICAgICBcIm1ldGhvZFwiOiBcIkdFVFwiLFxuICAgICAgICAgICAgICAgICAgICBcInBhdGhcIjogXCIvXCIsXG4gICAgICAgICAgICAgICAgICAgIFwicHJvdG9jb2xcIjogXCJIVFRQLzEuMVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIG5ldyBSdWxlKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcGluZ2VyLXJ1bGVgLCB7XG4gICAgICAgICAgICBydWxlTmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1waW5nZXJgLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBQaW5ncyB0aGUgTGFtYmRhIGZ1bmN0aW9uIG9mIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gYXBwIGV2ZXJ5IDUgbWludXRlcyB0byBrZWVwIGl0IHdhcm0uYCxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUucmF0ZShEdXJhdGlvbi5taW51dGVzKDUpKSxcbiAgICAgICAgICAgIHRhcmdldHM6IFtuZXcgTGFtYmRhRnVuY3Rpb24odGhpcy5hcHBMYW1iZGFGdW5jdGlvbiwge1xuICAgICAgICAgICAgICAgIGV2ZW50OiBSdWxlVGFyZ2V0SW5wdXQuZnJvbU9iamVjdChmYWtlQXBpR2F0ZXdheUV2ZW50RGF0YSlcbiAgICAgICAgICAgIH0pXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIHJ1bGUgdGhhdCBydW5zIGV2ZXJ5IHR1ZXNkYXkgYXQgMDM6MzAgQU0gR01UIHRvIHRyaWdnZXJcbiAgICAgKiBvdXIgY2xlYW51cCBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2xlYW51cFRyaWdnZXJSdWxlKCk6IHZvaWQge1xuICAgICAgICBuZXcgUnVsZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNjaGVkdWxlci1ydWxlYCwge1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2NoZWR1bGVyYCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgVHJpZ2dlcnMgYSBjbGVhbnVwIG9mIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIGF0IHRoZSAke3RoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9IFMzIGJ1Y2tldC5gLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5jcm9uKHt3ZWVrRGF5OiAnMycsIGhvdXI6ICczJywgbWludXRlOiAnMzAnfSksXG4gICAgICAgICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMuY2xlYW51cExhbWJkYUZ1bmN0aW9uKV0sXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -54,6 +54,17 @@ export interface NuxtServerAppStackProps extends NuxtAppStackProps {
|
|
|
54
54
|
*/
|
|
55
55
|
readonly regionalTlsCertificateArn: string;
|
|
56
56
|
|
|
57
|
+
/**
|
|
58
|
+
* The file name (without extension) of the Lambda entrypoint within the 'server' directory exporting a handler.
|
|
59
|
+
* Defaults to "index".
|
|
60
|
+
*/
|
|
61
|
+
readonly entrypoint?: string;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* A JSON serialized string of environment variables to pass to the Lambda function.
|
|
65
|
+
*/
|
|
66
|
+
readonly entrypointEnv?: string;
|
|
67
|
+
|
|
57
68
|
/**
|
|
58
69
|
* The memory size to apply to the Nuxt app's Lambda.
|
|
59
70
|
* Defaults to 1792MB (optimized for costs and performance for standard Nuxt apps).
|
|
@@ -69,6 +80,42 @@ export interface NuxtServerAppStackProps extends NuxtAppStackProps {
|
|
|
69
80
|
* Whether to enable a global Sitemap bucket which is permanently accessible through multiple deployments.
|
|
70
81
|
*/
|
|
71
82
|
readonly enableSitemap?: boolean;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* An array of headers to pass to the Nuxt app on SSR requests.
|
|
86
|
+
* The more headers are passed, the weaker the cache performance will be, as the cache key
|
|
87
|
+
* is based on the headers.
|
|
88
|
+
* No headers are passed by default.
|
|
89
|
+
*/
|
|
90
|
+
readonly allowHeaders?: string[];
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* An array of cookies to pass to the Nuxt app on SSR requests.
|
|
94
|
+
* The more cookies are passed, the weaker the cache performance will be, as the cache key
|
|
95
|
+
* is based on the cookies.
|
|
96
|
+
* No cookies are passed by default.
|
|
97
|
+
*/
|
|
98
|
+
readonly allowCookies?: string[];
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* An array of query param keys to pass to the Nuxt app on SSR requests.
|
|
102
|
+
* The more query params are passed, the weaker the cache performance will be, as the cache key
|
|
103
|
+
* is based on the query params.
|
|
104
|
+
* Note that this config can not be combined with {@see denyQueryParams}.
|
|
105
|
+
* If both are specified, the {@see denyQueryParams} will be ignored.
|
|
106
|
+
* All query params are passed by default.
|
|
107
|
+
*/
|
|
108
|
+
readonly allowQueryParams?: string[];
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* An array of query param keys to deny passing to the Nuxt app on SSR requests.
|
|
112
|
+
* It might be useful to prevent specific external query params, e.g., fbclid, utm_campaign, ...,
|
|
113
|
+
* to improve cache performance, as the cache key is based on the specified query params.
|
|
114
|
+
* Note that this config can not be combined with {@see allowQueryParams}.
|
|
115
|
+
* If both are specified, the {@see denyQueryParams} will be ignored.
|
|
116
|
+
* All query params are passed by default.
|
|
117
|
+
*/
|
|
118
|
+
readonly denyQueryParams?: string[];
|
|
72
119
|
}
|
|
73
120
|
|
|
74
121
|
/**
|
|
@@ -349,7 +396,7 @@ export class NuxtServerAppStack extends Stack {
|
|
|
349
396
|
minimumProtocolVersion: SecurityPolicyProtocol.TLS_V1_2_2018,
|
|
350
397
|
certificate: Certificate.fromCertificateArn(this, `${this.resourceIdPrefix}-global-certificate`, props.globalTlsCertificateArn),
|
|
351
398
|
httpVersion: HttpVersion.HTTP2_AND_3,
|
|
352
|
-
defaultBehavior: this.createNuxtAppRouteBehavior(),
|
|
399
|
+
defaultBehavior: this.createNuxtAppRouteBehavior(props),
|
|
353
400
|
additionalBehaviors: this.setupCloudFrontRouting(props),
|
|
354
401
|
priceClass: PriceClass.PRICE_CLASS_100, // Use only North America and Europe
|
|
355
402
|
});
|
|
@@ -361,7 +408,7 @@ export class NuxtServerAppStack extends Stack {
|
|
|
361
408
|
*
|
|
362
409
|
* @private
|
|
363
410
|
*/
|
|
364
|
-
private createNuxtAppRouteBehavior(): BehaviorOptions {
|
|
411
|
+
private createNuxtAppRouteBehavior(props: NuxtServerAppStackProps): BehaviorOptions {
|
|
365
412
|
return {
|
|
366
413
|
origin: new HttpOrigin(`${this.apiGateway.httpApiId}.execute-api.${this.region}.amazonaws.com`, {
|
|
367
414
|
connectionAttempts: 2,
|
|
@@ -373,7 +420,7 @@ export class NuxtServerAppStack extends Stack {
|
|
|
373
420
|
compress: true,
|
|
374
421
|
viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
|
|
375
422
|
originRequestPolicy: undefined,
|
|
376
|
-
cachePolicy: this.createSsrCachePolicy(),
|
|
423
|
+
cachePolicy: this.createSsrCachePolicy(props),
|
|
377
424
|
};
|
|
378
425
|
}
|
|
379
426
|
|
|
@@ -396,25 +443,16 @@ export class NuxtServerAppStack extends Stack {
|
|
|
396
443
|
* forward required cookies, query params and headers. This doesn't make any sense, because if nothing
|
|
397
444
|
* is cached, one would expect, that anything would/could be forwarded, but anyway...
|
|
398
445
|
*/
|
|
399
|
-
private createSsrCachePolicy(): ICachePolicy {
|
|
400
|
-
|
|
401
|
-
// The headers to make accessible in the Nuxt app code.
|
|
402
|
-
// There is no 'CacheHeaderBehavior.all()' option, so we have to explicitly define them.
|
|
403
|
-
const headers = [
|
|
404
|
-
'User-Agent', // Required to distinguish between mobile and desktop template
|
|
405
|
-
'Authorization', // For authorization
|
|
406
|
-
'Host' // To access the domain name on SSR requests
|
|
407
|
-
];
|
|
408
|
-
|
|
446
|
+
private createSsrCachePolicy(props: NuxtServerAppStackProps): ICachePolicy {
|
|
409
447
|
return new CachePolicy(this, `${this.resourceIdPrefix}-cache-policy`, {
|
|
410
448
|
cachePolicyName: `${this.resourceIdPrefix}-cdn-cache-policy`,
|
|
411
|
-
comment: `
|
|
449
|
+
comment: `Defines which request data to pass to the ${this.resourceIdPrefix} origin and how the cache key is calculated.`,
|
|
412
450
|
defaultTtl: Duration.seconds(0),
|
|
413
451
|
minTtl: Duration.seconds(0),
|
|
414
|
-
maxTtl: Duration.
|
|
415
|
-
queryStringBehavior: CacheQueryStringBehavior.all(),
|
|
416
|
-
headerBehavior: CacheHeaderBehavior.allowList(...
|
|
417
|
-
cookieBehavior: CacheCookieBehavior.
|
|
452
|
+
maxTtl: Duration.days(365),
|
|
453
|
+
queryStringBehavior: props.allowQueryParams ? CacheQueryStringBehavior.allowList(...props.allowQueryParams) : (props.denyQueryParams ? CacheQueryStringBehavior.denyList(...props.denyQueryParams) : CacheQueryStringBehavior.all()),
|
|
454
|
+
headerBehavior: props.allowHeaders ? CacheHeaderBehavior.allowList(...props.allowHeaders) : CacheHeaderBehavior.none(),
|
|
455
|
+
cookieBehavior: props.allowCookies ? CacheCookieBehavior.allowList(...props.allowCookies) : CacheCookieBehavior.none(),
|
|
418
456
|
enableAcceptEncodingBrotli: true,
|
|
419
457
|
enableAcceptEncodingGzip: true,
|
|
420
458
|
});
|