@inizioevoke/evosynth 1.7.1 → 1.8.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/dist/stacks/web-static-serverless/web-global-stack.d.ts +3 -2
- package/dist/stacks/web-static-serverless/web-global-stack.js +60 -15
- package/dist/types.d.ts +5 -1
- package/package.json +1 -1
- package/samples/app.ts +15 -0
- package/samples/csp.ts +9 -0
- package/src/stacks/web-static-serverless/web-global-stack.ts +63 -17
- package/src/types.d.ts +5 -1
|
@@ -7,7 +7,7 @@ import { Bucket } from "aws-cdk-lib/aws-s3";
|
|
|
7
7
|
import { CfnWebACL } from 'aws-cdk-lib/aws-wafv2';
|
|
8
8
|
import { CloudFrontFunctionRedirects } from '../../constructs/cloudfront.js';
|
|
9
9
|
import type { SsmStringParameter } from '../../constructs/ssm.ts';
|
|
10
|
-
import type { BasicAuthCredentials } from '../../types.d.ts';
|
|
10
|
+
import type { BasicAuthCredentials, CspHeaders } from '../../types.d.ts';
|
|
11
11
|
type AWSManagedResponseHeadersPolicy = 'CORS_ALLOW_ALL_ORIGINS' | 'CORS_ALLOW_ALL_ORIGINS_AND_SECURITY_HEADERS' | 'CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT' | 'CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT_AND_SECURITY_HEADERS' | 'SECURITY_HEADERS';
|
|
12
12
|
type UUID = `${string}-${string}-${string}-${string}-${string}`;
|
|
13
13
|
type CloudFrontFunctionEventType = keyof typeof FunctionEventType;
|
|
@@ -25,8 +25,9 @@ export interface WebGlobalStackProps {
|
|
|
25
25
|
redirects?: CloudFrontFunctionRedirects;
|
|
26
26
|
redirectsCsvPath?: string;
|
|
27
27
|
webAcl?: boolean | string | SsmStringParameter;
|
|
28
|
-
responseHeadersPolicy?: false | AWSManagedResponseHeadersPolicy | UUID | SsmStringParameter;
|
|
28
|
+
responseHeadersPolicy?: false | AWSManagedResponseHeadersPolicy | 'NONE' | UUID | SsmStringParameter;
|
|
29
29
|
responseHeadersPolicyProps?: ResponseHeadersPolicyProps;
|
|
30
|
+
responseCspHeaders?: CspHeaders;
|
|
30
31
|
destroy?: boolean;
|
|
31
32
|
tags?: Record<string, string>;
|
|
32
33
|
}
|
|
@@ -34,24 +34,69 @@ export class WebGlobalStack extends Stack {
|
|
|
34
34
|
});
|
|
35
35
|
this.s3Bucket = _s3Bucket.bucket;
|
|
36
36
|
let responseHeadersPolicy = undefined;
|
|
37
|
-
if (props.responseHeadersPolicy) {
|
|
38
|
-
if (
|
|
39
|
-
if (
|
|
40
|
-
|
|
37
|
+
if (props.responseHeadersPolicy !== 'NONE') { // I don't know why you would want to not have the policy but just in case
|
|
38
|
+
if (props.responseHeadersPolicy) {
|
|
39
|
+
if (typeof props.responseHeadersPolicy == 'string') {
|
|
40
|
+
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(props.responseHeadersPolicy)) {
|
|
41
|
+
responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', props.responseHeadersPolicy);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
responseHeadersPolicy = ResponseHeadersPolicy[props.responseHeadersPolicy] ?? ResponseHeadersPolicy.SECURITY_HEADERS;
|
|
45
|
+
}
|
|
41
46
|
}
|
|
42
|
-
else {
|
|
43
|
-
responseHeadersPolicy = ResponseHeadersPolicy
|
|
47
|
+
else if (props.responseHeadersPolicy.path) {
|
|
48
|
+
responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', StringParameter.valueForStringParameter(this, props.responseHeadersPolicy.path, props.responseHeadersPolicy.version));
|
|
44
49
|
}
|
|
45
50
|
}
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
if (!responseHeadersPolicy) {
|
|
52
|
+
// const baseHeadersBehavior: ResponseSecurityHeadersBehavior = {
|
|
53
|
+
// strictTransportSecurity: {
|
|
54
|
+
// override: true,
|
|
55
|
+
// accessControlMaxAge: Duration.seconds(31536000)
|
|
56
|
+
// },
|
|
57
|
+
// contentTypeOptions: {
|
|
58
|
+
// override: true
|
|
59
|
+
// },
|
|
60
|
+
// frameOptions: {
|
|
61
|
+
// override: true,
|
|
62
|
+
// frameOption: HeadersFrameOption.SAMEORIGIN,
|
|
63
|
+
// },
|
|
64
|
+
// referrerPolicy: {
|
|
65
|
+
// override: true,
|
|
66
|
+
// referrerPolicy: HeadersReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN
|
|
67
|
+
// },
|
|
68
|
+
// xssProtection: {
|
|
69
|
+
// override: true,
|
|
70
|
+
// protection: true,
|
|
71
|
+
// modeBlock: true
|
|
72
|
+
// }
|
|
73
|
+
// };
|
|
74
|
+
const responseHeadersPolicyName = `${domainAsId(props.domainName)}-response-headers-policy`;
|
|
75
|
+
if (props.responseHeadersPolicyProps) {
|
|
76
|
+
responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
|
|
77
|
+
...ResponseHeadersPolicy.SECURITY_HEADERS,
|
|
78
|
+
...props.responseHeadersPolicyProps,
|
|
79
|
+
responseHeadersPolicyName: props.responseHeadersPolicyProps.responseHeadersPolicyName || responseHeadersPolicyName
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
else if (props.responseCspHeaders) {
|
|
83
|
+
responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
|
|
84
|
+
securityHeadersBehavior: {
|
|
85
|
+
...ResponseHeadersPolicy.SECURITY_HEADERS,
|
|
86
|
+
contentSecurityPolicy: {
|
|
87
|
+
override: true,
|
|
88
|
+
contentSecurityPolicy: Object.entries(props.responseCspHeaders).map(([directive, values]) => {
|
|
89
|
+
return `${directive} ${values.join(' ')};`;
|
|
90
|
+
}).join(' ')
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
responseHeadersPolicyName
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
responseHeadersPolicy = ResponseHeadersPolicy.SECURITY_HEADERS;
|
|
98
|
+
}
|
|
48
99
|
}
|
|
49
|
-
}
|
|
50
|
-
if (!responseHeadersPolicy && props.responseHeadersPolicyProps) {
|
|
51
|
-
responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
|
|
52
|
-
...props.responseHeadersPolicyProps,
|
|
53
|
-
responseHeadersPolicyName: props.responseHeadersPolicyProps.responseHeadersPolicyName || `${domainAsId(props.domainName)}-response-headers-policy`
|
|
54
|
-
});
|
|
55
100
|
this.responseHeadersPolicy = responseHeadersPolicy;
|
|
56
101
|
}
|
|
57
102
|
const defaultBehavior = {
|
|
@@ -151,4 +196,4 @@ export class WebGlobalStack extends Stack {
|
|
|
151
196
|
this.aaaaRecord = cfAlias.aaaaRecord;
|
|
152
197
|
}
|
|
153
198
|
}
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWdsb2JhbC1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdGFja3Mvd2ViLXN0YXRpYy1zZXJ2ZXJsZXNzL3dlYi1nbG9iYWwtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBYyxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUluRSxPQUFPLEVBQTBCLGlCQUFpQixFQUF1RSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR25MLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDeEUsT0FBTyxFQUErQixrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pILE9BQU8sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWxELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBbUNwRSxNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFDdkIsY0FBYyxDQUFjO0lBQzVCLFFBQVEsQ0FBUztJQUNqQixrQkFBa0IsQ0FBVztJQUM3QixzQkFBc0IsQ0FBZTtJQUNyQyxNQUFNLENBQXdCO0lBQzlCLHFCQUFxQixDQUFxQztJQUMxRCxPQUFPLENBQVU7SUFDakIsVUFBVSxDQUFhO0lBRXZDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUM7UUFDL0UsS0FBSyxD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QUcsQ0FBQyxPQUFPLENBQUM7UUFDN0IsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksc0JBQXNCLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFO1lBQ2hGLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsVUFBVTtZQUNsRCxVQUFVLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDekIsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ2hDLGVBQWU7WUFDZixRQUFRO1NBQ1QsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7UUFFMUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1lBQzNELFlBQVksRUFBRSxjQUFjLENBQUMsWUFBWTtZQUN6QyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUN2QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgU3RhY2tQcm9wcywgUGh5c2ljYWxOYW1lIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuaW1wb3J0IHsgQ2VydGlmaWNhdGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHsgRGlzdHJpYnV0aW9uLCBGdW5jdGlvbiwgRnVuY3Rpb25FdmVudFR5cGUsIElSZXNwb25zZUhlYWRlcnNQb2xpY3ksIFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLCBCZWhhdmlvck9wdGlvbnMsIFJlc3BvbnNlSGVhZGVyc1BvbGljeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbmltcG9ydCB7IEFSZWNvcmQsIEFhYWFSZWNvcmQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IFN0cmluZ1BhcmFtZXRlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xuaW1wb3J0IHsgQ2ZuV2ViQUNMIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXdhZnYyJztcblxuaW1wb3J0IHsgU1NMQ2VydGlmaWNhdGUgfSBmcm9tICcuLi8uLi9jb25zdHJ1Y3RzL2NlcnRpZmljYXRlbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdHMsIENsb3VkRnJvbnRGdW5jdGlvbiwgQ2xvdWRGcm9udERpc3RyaWJ1dGlvbiB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvY2xvdWRmcm9udC5qcyc7XG5pbXBvcnQgeyBnZXRIb3N0ZWRab25lLCBDbG91ZEZyb250QWxpYXMgfSBmcm9tICcuLi8uLi9jb25zdHJ1Y3RzL3JvdXRlNTMuanMnO1xuaW1wb3J0IHsgUzNCdWNrZXQgfSBmcm9tICcuLi8uLi9jb25zdHJ1Y3RzL3MzLmpzJztcbmltcG9ydCB0eXBlIHsgU3NtU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vY29uc3RydWN0cy9zc20udHMnO1xuaW1wb3J0IHsgQ2xvdWRGcm9udFdlYkFjbCB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvd2FmLmpzJztcbmltcG9ydCB7IGRvbWFpbkFzSWQgfSBmcm9tICcuLi8uLi9saWIvdXRpbHMuanMnO1xuaW1wb3J0IHsgYWRkRXZvU3RhY2tUYWdzIH0gZnJvbSAnLi4vLi4vbGliL3RhZ3MudHMnO1xuaW1wb3J0IHsgUzNCdWNrZXRPcmlnaW4gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zJztcbmltcG9ydCB0eXBlIHsgQmFzaWNBdXRoQ3JlZGVudGlhbHMgfSBmcm9tICcuLi8uLi90eXBlcy5kLnRzJztcblxuXG50eXBlIEFXU01hbmFnZWRSZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBcbiAgJ0NPUlNfQUxMT1dfQUxMX09SSUdJTlMnIHxcbiAgJ0NPUlNfQUxMT1dfQUxMX09SSUdJTlNfQU5EX1NFQ1VSSVRZX0hFQURFUlMnIHxcbiAgJ0NPUlNfQUxMT1dfQUxMX09SSUdJTlNfV0lUSF9QUkVGTElHSFQnIHxcbiAgJ0NPUlNfQUxMT1dfQUxMX09SSUdJTlNfV0lUSF9QUkVGTElHSFRfQU5EX1NFQ1VSSVRZX0hFQURFUlMnIHxcbiAgJ1NFQ1VSSVRZX0hFQURFUlMnO1xuXG50eXBlIFVVSUQgPSBgJHtzdHJpbmd9LSR7c3RyaW5nfS0ke3N0cmluZ30tJHtzdHJpbmd9LSR7c3RyaW5nfWA7XG50eXBlIENsb3VkRnJvbnRGdW5jdGlvbkV2ZW50VHlwZSA9IGtleW9mIHR5cGVvZiBGdW5jdGlvbkV2ZW50VHlwZTtcblxuZXhwb3J0IGludGVyZmFjZSBXZWJHbG9iYWxTdGFja1Byb3BzIHtcbiAgZW52VHlwZTogJ05PVF9QUk9EJyB8ICdQUk9EJztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGJ1Y2tldE5hbWU/OiBzdHJpbmc7XG4gIGhvc3RlZFpvbmU6IHN0cmluZztcbiAgZG9tYWluTmFtZTogc3RyaW5nO1xuICBiYXNpY0F1dGg/OiBzdHJpbmcgfCBCYXNpY0F1dGhDcmVkZW50aWFscyB8IFNzbVN0cmluZ1BhcmFtZXRlcjtcbiAgY2xvdWRmcm9udEZ1bmN0aW9uPzoge1xuICAgIGV2ZW50VHlwZTogQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlW107XG4gICAgY29kZTogc3RyaW5nO1xuICB9XG4gIHJlZGlyZWN0cz86IENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cztcbiAgcmVkaXJlY3RzQ3N2UGF0aD86IHN0cmluZztcbiAgLy8gYXR0YWNoV2ViQWNsPzogYm9vbGVhbiB8IHN0cmluZztcbiAgd2ViQWNsPzogYm9vbGVhbiB8IHN0cmluZyB8IFNzbVN0cmluZ1BhcmFtZXRlcjtcbiAgcmVzcG9uc2VIZWFkZXJzUG9saWN5PzogZmFsc2UgfCBBV1NNYW5hZ2VkUmVzcG9uc2VIZWFkZXJzUG9saWN5IHwgVVVJRCB8IFNzbVN0cmluZ1BhcmFtZXRlcjtcbiAgcmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM/OiBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcztcbiAgZGVzdHJveT86IGJvb2xlYW47XG4gIHRhZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5leHBvcnQgY2xhc3MgV2ViR2xvYmFsU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG4gIHB1YmxpYyByZWFkb25seSBzc2xDZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGU7XG4gIHB1YmxpYyByZWFkb25seSBzM0J1Y2tldDogQnVja2V0O1xuICBwdWJsaWMgcmVhZG9ubHkgY2xvdWRGcm9udEZ1bmN0aW9uOiBGdW5jdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IGNsb3VkRnJvbnREaXN0cmlidXRpb246IERpc3RyaWJ1dGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IHdlYkFjbDogQ2ZuV2ViQUNMIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VIZWFkZXJzUG9saWN5OiBJUmVzcG9uc2VIZWFkZXJzUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgcmVhZG9ubHkgYVJlY29yZDogQVJlY29yZDtcbiAgcHVibGljIHJlYWRvbmx5IGFhYWFSZWNvcmQ6IEFhYWFSZWNvcmQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYkdsb2JhbFN0YWNrUHJvcHMgJiBTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgYWRkRXZvU3RhY2tUYWdzKHRoaXMsICdXZWJHbG9iYWxTdGFjaycpO1xuXG4gICAgY29uc3QgaG9zdGVkWm9uZSA9IGdldEhvc3RlZFpvbmUodGhpcywgJ2dldEhvc3RlZFpvbmUnLCBwcm9wcy5ob3N0ZWRab25lKTtcblxuICAgIGNvbnN0IF9zc2xDZXJ0ID0gbmV3IFNTTENlcnRpZmljYXRlKHRoaXMsICdTU0xDZXJ0aWZpY2F0ZScsIHtcbiAgICAgIGhvc3RlZFpvbmU6IGhvc3RlZFpvbmUsXG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW5OYW1lLFxuICAgICAgZGVzdHJveTogcHJvcHMuZGVzdHJveVxuICAgIH0pO1xuICAgIHRoaXMuc3NsQ2VydGlmaWNhdGUgPSBfc3NsQ2VydC5jZXJ0aWZpY2F0ZTtcblxuICAgIGNvbnN0IF9zM0J1Y2tldCA9IG5ldyBTM0J1Y2tldCh0aGlzLCAnUzNCdWNrZXQnLCB7XG4gICAgICBidWNrZXROYW1lOiBwcm9wcy5idWNrZXROYW1lID8/IFBoeXNpY2FsTmFtZS5HRU5FUkFURV9JRl9ORUVERUQsXG4gICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgfSk7XG4gICAgdGhpcy5zM0J1Y2tldCA9IF9zM0J1Y2tldC5idWNrZXQ7XG5cbiAgICBsZXQgcmVzcG9uc2VIZWFkZXJzUG9saWN5OiBJUmVzcG9uc2VIZWFkZXJzUG9saWN5IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5ID09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICgvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaS50ZXN0KHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSkpIHtcbiAgICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBSZXNwb25zZUhlYWRlcnNQb2xpY3kuZnJvbVJlc3BvbnNlSGVhZGVyc1BvbGljeUlkKHRoaXMsICdyZXNwb25zZS1oZWFkZXJzLXBvbGljeS1ieS1pZCcsIHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gUmVzcG9uc2VIZWFkZXJzUG9saWN5W3Byb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSBhcyBrZXlvZiB0eXBlb2YgUmVzcG9uc2VIZWFkZXJzUG9saWN5XSBhcyBJUmVzcG9uc2VIZWFkZXJzUG9saWN5ID8/IFJlc3BvbnNlSGVhZGVyc1BvbGljeS5TRUNVUklUWV9IRUFERVJTO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeS5wYXRoKSB7XG4gICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IFJlc3BvbnNlSGVhZGVyc1BvbGljeS5mcm9tUmVzcG9uc2VIZWFkZXJzUG9saWN5SWQodGhpcywgJ3Jlc3BvbnNlLWhlYWRlcnMtcG9saWN5LWJ5LWlkJywgU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKHRoaXMsIHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeS5wYXRoLCBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kudmVyc2lvbikpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlSGVhZGVyc1BvbGljeSAmJiBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcykge1xuICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gbmV3IFJlc3BvbnNlSGVhZGVyc1BvbGljeSh0aGlzLCAncmVzcG9uc2UtaGVhZGVycy1wb2xpY3knLCB7XG4gICAgICAgIC4uLnByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lOiBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lIHx8IGAke2RvbWFpbkFzSWQocHJvcHMuZG9tYWluTmFtZSl9LXJlc3BvbnNlLWhlYWRlcnMtcG9saWN5YFxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IHJlc3BvbnNlSGVhZGVyc1BvbGljeTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0QmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2wodGhpcy5zM0J1Y2tldCksXG4gICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogW10sXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3k6IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA/PyBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgIT09IGZhbHNlID8gUmVzcG9uc2VIZWFkZXJzUG9saWN5LlNFQ1VSSVRZX0hFQURFUlMgOiB1bmRlZmluZWRcbiAgICB9O1xuXG4gICAgbGV0IGNmZm46IENsb3VkRnJvbnRGdW5jdGlvbjtcbiAgICBpZiAocHJvcHMuYmFzaWNBdXRoKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLmJhc2ljQXV0aCAhPSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoKHByb3BzLmJhc2ljQXV0aCBhcyBCYXNpY0F1dGhDcmVkZW50aWFscykudXNlciAmJiAocHJvcHMuYmFzaWNBdXRoIGFzIEJhc2ljQXV0aENyZWRlbnRpYWxzKS5wYXNzd29yZCkge1xuICAgICAgICAgIHByb3BzLmJhc2ljQXV0aCA9IEJ1ZmZlci5mcm9tKGAkeyhwcm9wcy5iYXNpY0F1dGggYXMgQmFzaWNBdXRoQ3JlZGVudGlhbHMpLnVzZXJ9OiR7KHByb3BzLmJhc2ljQXV0aCBhcyBCYXNpY0F1dGhDcmVkZW50aWFscykucGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICB9IGVsc2UgaWYgKChwcm9wcy5iYXNpY0F1dGggYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoKSB7XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoID0gU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKHRoaXMsIChwcm9wcy5iYXNpY0F1dGggYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoLCAocHJvcHMuYmFzaWNBdXRoIGFzIFNzbVN0cmluZ1BhcmFtZXRlcikudmVyc2lvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24pIHtcbiAgICAgIGNmZm4gPSBDbG91ZEZyb250RnVuY3Rpb24uY3JlYXRlRnVuY3Rpb24odGhpcywgbnVsbCwge1xuICAgICAgICBjcmVkZW50aWFsczogcHJvcHMuYmFzaWNBdXRoLFxuICAgICAgICByZWRpcmVjdHM6IHByb3BzLnJlZGlyZWN0cyxcbiAgICAgICAgcmVkaXJlY3RzQ3N2UGF0aDogcHJvcHMucmVkaXJlY3RzQ3N2UGF0aCxcbiAgICAgICAgY29kZTogcHJvcHMuY2xvdWRmcm9udEZ1bmN0aW9uLmNvZGUsXG4gICAgICAgIGRlc3Ryb3k6IHByb3BzLmRlc3Ryb3lcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuYmFzaWNBdXRoKSB7XG4gICAgICBjZmZuID0gQ2xvdWRGcm9udEZ1bmN0aW9uLmNyZWF0ZUJhc2ljQXV0aERlZmF1bHREb2ModGhpcywge1xuICAgICAgICBjcmVkZW50aWFsczogcHJvcHMuYmFzaWNBdXRoLFxuICAgICAgICByZWRpcmVjdHM6IHByb3BzLnJlZGlyZWN0cyxcbiAgICAgICAgcmVkaXJlY3RzQ3N2UGF0aDogcHJvcHMucmVkaXJlY3RzQ3N2UGF0aCxcbiAgICAgICAgZGVzdHJveTogcHJvcHMuZGVzdHJveVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNmZm4gPSBDbG91ZEZyb250RnVuY3Rpb24uY3JlYXRlRGVmYXVsdERvYyh0aGlzLCB7XG4gICAgICAgIHJlZGlyZWN0czogcHJvcHMucmVkaXJlY3RzLFxuICAgICAgICByZWRpcmVjdHNDc3ZQYXRoOiBwcm9wcy5yZWRpcmVjdHNDc3ZQYXRoLFxuICAgICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jbG91ZEZyb250RnVuY3Rpb24gPSBjZmZuLmZuO1xuXG4gICAgLy8gY29uc3QgZXZlbnRUeXBlczogQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlW10gPSBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24/LmV2ZW50VHlwZSAmJiBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24uZXZlbnRUeXBlLmxlbmd0aCA+IDAgPyBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24uZXZlbnRUeXBlIDogWydWSUVXRVJfUkVRVUVTVCcsICdWSUVXRVJfUkVTUE9OU0UnXTtcblxuICAgIGxldCBldmVudFR5cGVzOiBDbG91ZEZyb250RnVuY3Rpb25FdmVudFR5cGVbXSA9IFsnVklFV0VSX1JFUVVFU1QnLCAnVklFV0VSX1JFU1BPTlNFJ107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMuY2xvdWRmcm9udEZ1bmN0aW9uPy5ldmVudFR5cGUpICYmIHByb3BzLmNsb3VkZnJvbnRGdW5jdGlvbi5ldmVudFR5cGUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXRzID0gcHJvcHMuY2xvdWRmcm9udEZ1bmN0aW9uLmV2ZW50VHlwZVxuICAgICAgICAuZmlsdGVyKCh2LCBpLCBhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVvZiB2ID09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAodiA9PT0gJ1ZJRVdFUl9SRVFVRVNUJyB8fCB2ID09PSAnVklFV0VSX1JFU1BPTlNFJykgJiZcbiAgICAgICAgICAgIGEuaW5kZXhPZih2KSA9PT0gaSAvLyBkZWR1cFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgaWYgKGV0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV2ZW50VHlwZXMgPSBldHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBldmVudFR5cGUgb2YgZXZlbnRUeXBlcykge1xuICAgICAgZGVmYXVsdEJlaGF2aW9yLmZ1bmN0aW9uQXNzb2NpYXRpb25zIS5wdXNoKHtcbiAgICAgICAgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZVtldmVudFR5cGVdLFxuICAgICAgICBmdW5jdGlvbjogdGhpcy5jbG91ZEZyb250RnVuY3Rpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBsZXQgd2ViQWNsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHByb3BzLndlYkFjbCA9PSAnc3RyaW5nJyAmJiBwcm9wcy53ZWJBY2wuc3RhcnRzV2l0aCgnYXJuOmF3cycpKSB7XG4gICAgICB3ZWJBY2xJZCA9IHByb3BzLndlYkFjbDtcbiAgICB9IGVsc2UgaWYgKChwcm9wcy53ZWJBY2wgYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoKSB7XG4gICAgICB3ZWJBY2xJZCA9IFN0cmluZ1BhcmFtZXRlci52YWx1ZUZvclN0cmluZ1BhcmFtZXRlcih0aGlzLCAocHJvcHMud2ViQWNsIGFzIFNzbVN0cmluZ1BhcmFtZXRlcikucGF0aCwgKHByb3BzLndlYkFjbCBhcyBTc21TdHJpbmdQYXJhbWV0ZXIpLnZlcnNpb24pO1xuICAgIH0gZWxzZSBpZiAocHJvcHMud2ViQWNsID09PSB0cnVlKSB7XG4gICAgICBjb25zdCB3YWYgPSBuZXcgQ2xvdWRGcm9udFdlYkFjbCh0aGlzLCAnQ2xvdWRGcm9udFdlYkFjbCcsIHtcbiAgICAgICAgbmFtZTogYCR7ZG9tYWluQXNJZChwcm9wcy5kb21haW5OYW1lKX1gLFxuICAgICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgICB9KTtcbiAgICAgIHRoaXMud2ViQWNsID0gd2FmLmFjbDtcbiAgICAgIHdlYkFjbElkID0gd2FmLmFjbC5hdHRyQXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNmRGlzdHJpYnV0aW9uID0gbmV3IENsb3VkRnJvbnREaXN0cmlidXRpb24odGhpcywgJ0Nsb3VkRnJvbnREaXN0cmlidXRpb24nLCB7XG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW5OYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uID8/IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICBwcmljZUNsYXNzOiBwcm9wcy5lbnZUeXBlLFxuICAgICAgY2VydGlmaWNhdGU6IHRoaXMuc3NsQ2VydGlmaWNhdGUsXG4gICAgICBkZWZhdWx0QmVoYXZpb3IsXG4gICAgICB3ZWJBY2xJZFxuICAgIH0pO1xuICAgIHRoaXMuY2xvdWRGcm9udERpc3RyaWJ1dGlvbiA9IGNmRGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbjtcblxuICAgIGNvbnN0IGNmQWxpYXMgPSBuZXcgQ2xvdWRGcm9udEFsaWFzKHRoaXMsICdDbG91ZEZyb250QWxpYXMnLCB7XG4gICAgICBkaXN0cmlidXRpb246IGNmRGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbixcbiAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICBob3N0ZWRab25lOiBob3N0ZWRab25lXG4gICAgfSk7XG4gICAgdGhpcy5hUmVjb3JkID0gY2ZBbGlhcy5hUmVjb3JkO1xuICAgIHRoaXMuYWFhYVJlY29yZCA9IGNmQWxpYXMuYWFhYVJlY29yZDtcbiAgfVxufSJdfQ==
|
|
199
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWdsb2JhbC1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdGFja3Mvd2ViLXN0YXRpYy1zZXJ2ZXJsZXNzL3dlYi1nbG9iYWwtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBYyxZQUFZLEVBQVksTUFBTSxrQkFBa0IsQ0FBQztBQUk3RSxPQUFPLEVBQTBCLGlCQUFpQixFQUF3RyxxQkFBcUIsRUFBNkMsTUFBTSw0QkFBNEIsQ0FBQztBQUcvUCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3hFLE9BQU8sRUFBK0Isa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6SCxPQUFPLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQW9DcEUsTUFBTSxPQUFPLGNBQWUsU0FBUSxLQUFLO0lBQ3ZCLGNBQWMsQ0FBYztJQUM1QixRQUFRLENBQVM7SUFDakIsa0JBQWtCLENBQVc7SUFDN0Isc0JBQXNCLENBQWU7SUFDckMsTUFBTSxDQUF3QjtJQUM5QixxQkFBcUIsQ0FBcUM7SUFDMUQsT0FBTyxDQUFVO0lBQ2pCLFVBQVUsQ0FBYTtJQUV2QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVDO1FBQy9FLEtBQUss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O2FBQ3ZCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUN0QixRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDN0IsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksc0JBQXNCLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFO1lBQ2hGLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsVUFBVTtZQUNsRCxVQUFVLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDekIsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ2hDLGVBQWU7WUFDZixRQUFRO1NBQ1QsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7UUFFMUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1lBQzNELFlBQVksRUFBRSxjQUFjLENBQUMsWUFBWTtZQUN6QyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUN2QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgU3RhY2tQcm9wcywgUGh5c2ljYWxOYW1lLCBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmltcG9ydCB7IENlcnRpZmljYXRlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7IERpc3RyaWJ1dGlvbiwgRnVuY3Rpb24sIEZ1bmN0aW9uRXZlbnRUeXBlLCBJUmVzcG9uc2VIZWFkZXJzUG9saWN5LCBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcywgUmVzcG9uc2VTZWN1cml0eUhlYWRlcnNCZWhhdmlvciwgQmVoYXZpb3JPcHRpb25zLCBSZXNwb25zZUhlYWRlcnNQb2xpY3ksIEhlYWRlcnNGcmFtZU9wdGlvbiwgSGVhZGVyc1JlZmVycmVyUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0IHsgQVJlY29yZCwgQWFhYVJlY29yZCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBDZm5XZWJBQ0wgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtd2FmdjInO1xuXG5pbXBvcnQgeyBTU0xDZXJ0aWZpY2F0ZSB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvY2VydGlmaWNhdGVtYW5hZ2VyLmpzJztcbmltcG9ydCB7IENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cywgQ2xvdWRGcm9udEZ1bmN0aW9uLCBDbG91ZEZyb250RGlzdHJpYnV0aW9uIH0gZnJvbSAnLi4vLi4vY29uc3RydWN0cy9jbG91ZGZyb250LmpzJztcbmltcG9ydCB7IGdldEhvc3RlZFpvbmUsIENsb3VkRnJvbnRBbGlhcyB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvcm91dGU1My5qcyc7XG5pbXBvcnQgeyBTM0J1Y2tldCB9IGZyb20gJy4uLy4uL2NvbnN0cnVjdHMvczMuanMnO1xuaW1wb3J0IHR5cGUgeyBTc21TdHJpbmdQYXJhbWV0ZXIgfSBmcm9tICcuLi8uLi9jb25zdHJ1Y3RzL3NzbS50cyc7XG5pbXBvcnQgeyBDbG91ZEZyb250V2ViQWNsIH0gZnJvbSAnLi4vLi4vY29uc3RydWN0cy93YWYuanMnO1xuaW1wb3J0IHsgZG9tYWluQXNJZCB9IGZyb20gJy4uLy4uL2xpYi91dGlscy5qcyc7XG5pbXBvcnQgeyBhZGRFdm9TdGFja1RhZ3MgfSBmcm9tICcuLi8uLi9saWIvdGFncy50cyc7XG5pbXBvcnQgeyBTM0J1Y2tldE9yaWdpbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnMnO1xuaW1wb3J0IHR5cGUgeyBCYXNpY0F1dGhDcmVkZW50aWFscywgQ3NwSGVhZGVycyB9IGZyb20gJy4uLy4uL3R5cGVzLmQudHMnO1xuXG5cbnR5cGUgQVdTTWFuYWdlZFJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IFxuICAnQ09SU19BTExPV19BTExfT1JJR0lOUycgfFxuICAnQ09SU19BTExPV19BTExfT1JJR0lOU19BTkRfU0VDVVJJVFlfSEVBREVSUycgfFxuICAnQ09SU19BTExPV19BTExfT1JJR0lOU19XSVRIX1BSRUZMSUdIVCcgfFxuICAnQ09SU19BTExPV19BTExfT1JJR0lOU19XSVRIX1BSRUZMSUdIVF9BTkRfU0VDVVJJVFlfSEVBREVSUycgfFxuICAnU0VDVVJJVFlfSEVBREVSUyc7XG5cbnR5cGUgVVVJRCA9IGAke3N0cmluZ30tJHtzdHJpbmd9LSR7c3RyaW5nfS0ke3N0cmluZ30tJHtzdHJpbmd9YDtcbnR5cGUgQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlID0ga2V5b2YgdHlwZW9mIEZ1bmN0aW9uRXZlbnRUeXBlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYkdsb2JhbFN0YWNrUHJvcHMge1xuICBlbnZUeXBlOiAnTk9UX1BST0QnIHwgJ1BST0QnO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgYnVja2V0TmFtZT86IHN0cmluZztcbiAgaG9zdGVkWm9uZTogc3RyaW5nO1xuICBkb21haW5OYW1lOiBzdHJpbmc7XG4gIGJhc2ljQXV0aD86IHN0cmluZyB8IEJhc2ljQXV0aENyZWRlbnRpYWxzIHwgU3NtU3RyaW5nUGFyYW1ldGVyO1xuICBjbG91ZGZyb250RnVuY3Rpb24/OiB7XG4gICAgZXZlbnRUeXBlOiBDbG91ZEZyb250RnVuY3Rpb25FdmVudFR5cGVbXTtcbiAgICBjb2RlOiBzdHJpbmc7XG4gIH1cbiAgcmVkaXJlY3RzPzogQ2xvdWRGcm9udEZ1bmN0aW9uUmVkaXJlY3RzO1xuICByZWRpcmVjdHNDc3ZQYXRoPzogc3RyaW5nO1xuICAvLyBhdHRhY2hXZWJBY2w/OiBib29sZWFuIHwgc3RyaW5nO1xuICB3ZWJBY2w/OiBib29sZWFuIHwgc3RyaW5nIHwgU3NtU3RyaW5nUGFyYW1ldGVyO1xuICByZXNwb25zZUhlYWRlcnNQb2xpY3k/OiBmYWxzZSB8IEFXU01hbmFnZWRSZXNwb25zZUhlYWRlcnNQb2xpY3kgfCAnTk9ORScgfCBVVUlEIHwgU3NtU3RyaW5nUGFyYW1ldGVyO1xuICByZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZXNwb25zZUNzcEhlYWRlcnM/OiBDc3BIZWFkZXJzO1xuICBkZXN0cm95PzogYm9vbGVhbjtcbiAgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBjbGFzcyBXZWJHbG9iYWxTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgcHVibGljIHJlYWRvbmx5IHNzbENlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHMzQnVja2V0OiBCdWNrZXQ7XG4gIHB1YmxpYyByZWFkb25seSBjbG91ZEZyb250RnVuY3Rpb246IEZ1bmN0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgY2xvdWRGcm9udERpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViQWNsOiBDZm5XZWJBQ0wgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSByZXNwb25zZUhlYWRlcnNQb2xpY3k6IElSZXNwb25zZUhlYWRlcnNQb2xpY3kgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBhUmVjb3JkOiBBUmVjb3JkO1xuICBwdWJsaWMgcmVhZG9ubHkgYWFhYVJlY29yZDogQWFhYVJlY29yZDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2ViR2xvYmFsU3RhY2tQcm9wcyAmIFN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICBhZGRFdm9TdGFja1RhZ3ModGhpcywgJ1dlYkdsb2JhbFN0YWNrJyk7XG5cbiAgICBjb25zdCBob3N0ZWRab25lID0gZ2V0SG9zdGVkWm9uZSh0aGlzLCAnZ2V0SG9zdGVkWm9uZScsIHByb3BzLmhvc3RlZFpvbmUpO1xuXG4gICAgY29uc3QgX3NzbENlcnQgPSBuZXcgU1NMQ2VydGlmaWNhdGUodGhpcywgJ1NTTENlcnRpZmljYXRlJywge1xuICAgICAgaG9zdGVkWm9uZTogaG9zdGVkWm9uZSxcbiAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgfSk7XG4gICAgdGhpcy5zc2xDZXJ0aWZpY2F0ZSA9IF9zc2xDZXJ0LmNlcnRpZmljYXRlO1xuXG4gICAgY29uc3QgX3MzQnVja2V0ID0gbmV3IFMzQnVja2V0KHRoaXMsICdTM0J1Y2tldCcsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHByb3BzLmJ1Y2tldE5hbWUgPz8gUGh5c2ljYWxOYW1lLkdFTkVSQVRFX0lGX05FRURFRCxcbiAgICAgIGRlc3Ryb3k6IHByb3BzLmRlc3Ryb3lcbiAgICB9KTtcbiAgICB0aGlzLnMzQnVja2V0ID0gX3MzQnVja2V0LmJ1Y2tldDtcblxuICAgIGxldCByZXNwb25zZUhlYWRlcnNQb2xpY3k6IElSZXNwb25zZUhlYWRlcnNQb2xpY3kgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSAhPT0gJ05PTkUnKSB7IC8vIEkgZG9uJ3Qga25vdyB3aHkgeW91IHdvdWxkIHdhbnQgdG8gbm90IGhhdmUgdGhlIHBvbGljeSBidXQganVzdCBpbiBjYXNlXG4gICAgICBpZiAocHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5ID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JC9pLnRlc3QocHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5KSkge1xuICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gUmVzcG9uc2VIZWFkZXJzUG9saWN5LmZyb21SZXNwb25zZUhlYWRlcnNQb2xpY3lJZCh0aGlzLCAncmVzcG9uc2UtaGVhZGVycy1wb2xpY3ktYnktaWQnLCBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBSZXNwb25zZUhlYWRlcnNQb2xpY3lbcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5IGFzIGtleW9mIHR5cGVvZiBSZXNwb25zZUhlYWRlcnNQb2xpY3ldIGFzIElSZXNwb25zZUhlYWRlcnNQb2xpY3kgPz8gUmVzcG9uc2VIZWFkZXJzUG9saWN5LlNFQ1VSSVRZX0hFQURFUlM7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeS5wYXRoKSB7XG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gUmVzcG9uc2VIZWFkZXJzUG9saWN5LmZyb21SZXNwb25zZUhlYWRlcnNQb2xpY3lJZCh0aGlzLCAncmVzcG9uc2UtaGVhZGVycy1wb2xpY3ktYnktaWQnLCBTdHJpbmdQYXJhbWV0ZXIudmFsdWVGb3JTdHJpbmdQYXJhbWV0ZXIodGhpcywgcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5LnBhdGgsIHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeS52ZXJzaW9uKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghcmVzcG9uc2VIZWFkZXJzUG9saWN5KSB7XG4gICAgICAgIC8vIGNvbnN0IGJhc2VIZWFkZXJzQmVoYXZpb3I6IFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IgPSB7XG4gICAgICAgIC8vICAgc3RyaWN0VHJhbnNwb3J0U2VjdXJpdHk6IHtcbiAgICAgICAgLy8gICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgICAvLyAgICAgYWNjZXNzQ29udHJvbE1heEFnZTogRHVyYXRpb24uc2Vjb25kcygzMTUzNjAwMClcbiAgICAgICAgLy8gICB9LFxuICAgICAgICAvLyAgIGNvbnRlbnRUeXBlT3B0aW9uczoge1xuICAgICAgICAvLyAgICAgb3ZlcnJpZGU6IHRydWVcbiAgICAgICAgLy8gICB9LFxuICAgICAgICAvLyAgIGZyYW1lT3B0aW9uczoge1xuICAgICAgICAvLyAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICAgIC8vICAgICBmcmFtZU9wdGlvbjogSGVhZGVyc0ZyYW1lT3B0aW9uLlNBTUVPUklHSU4sXG4gICAgICAgIC8vICAgfSxcbiAgICAgICAgLy8gICByZWZlcnJlclBvbGljeToge1xuICAgICAgICAvLyAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICAgIC8vICAgICByZWZlcnJlclBvbGljeTogSGVhZGVyc1JlZmVycmVyUG9saWN5LlNUUklDVF9PUklHSU5fV0hFTl9DUk9TU19PUklHSU5cbiAgICAgICAgLy8gICB9LFxuICAgICAgICAvLyAgIHhzc1Byb3RlY3Rpb246IHtcbiAgICAgICAgLy8gICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgICAvLyAgICAgcHJvdGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgLy8gICAgIG1vZGVCbG9jazogdHJ1ZVxuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gfTtcblxuICAgICAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lID0gYCR7ZG9tYWluQXNJZChwcm9wcy5kb21haW5OYW1lKX0tcmVzcG9uc2UtaGVhZGVycy1wb2xpY3lgO1xuICAgICAgICBcbiAgICAgICAgaWYgKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzKSB7XG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gbmV3IFJlc3BvbnNlSGVhZGVyc1BvbGljeSh0aGlzLCAncmVzcG9uc2UtaGVhZGVycy1wb2xpY3knLCB7XG4gICAgICAgICAgICAuLi5SZXNwb25zZUhlYWRlcnNQb2xpY3kuU0VDVVJJVFlfSEVBREVSUyxcbiAgICAgICAgICAgIC4uLnByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZTogcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZSB8fCByZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcHMucmVzcG9uc2VDc3BIZWFkZXJzKSB7XG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gbmV3IFJlc3BvbnNlSGVhZGVyc1BvbGljeSh0aGlzLCAncmVzcG9uc2UtaGVhZGVycy1wb2xpY3knLCB7XG4gICAgICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjoge1xuICAgICAgICAgICAgICAuLi5SZXNwb25zZUhlYWRlcnNQb2xpY3kuU0VDVVJJVFlfSEVBREVSUyxcbiAgICAgICAgICAgICAgY29udGVudFNlY3VyaXR5UG9saWN5OiB7XG4gICAgICAgICAgICAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29udGVudFNlY3VyaXR5UG9saWN5OiBPYmplY3QuZW50cmllcyhwcm9wcy5yZXNwb25zZUNzcEhlYWRlcnMpLm1hcCgoW2RpcmVjdGl2ZSwgdmFsdWVzXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2RpcmVjdGl2ZX0gJHt2YWx1ZXMuam9pbignICcpfTtgXG4gICAgICAgICAgICAgICAgfSkuam9pbignICcpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IFJlc3BvbnNlSGVhZGVyc1BvbGljeS5TRUNVUklUWV9IRUFERVJTO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IHJlc3BvbnNlSGVhZGVyc1BvbGljeTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0QmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2wodGhpcy5zM0J1Y2tldCksXG4gICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogW10sXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3k6IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA/PyBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgIT09IGZhbHNlID8gUmVzcG9uc2VIZWFkZXJzUG9saWN5LlNFQ1VSSVRZX0hFQURFUlMgOiB1bmRlZmluZWRcbiAgICB9O1xuXG4gICAgbGV0IGNmZm46IENsb3VkRnJvbnRGdW5jdGlvbjtcbiAgICBpZiAocHJvcHMuYmFzaWNBdXRoKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLmJhc2ljQXV0aCAhPSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoKHByb3BzLmJhc2ljQXV0aCBhcyBCYXNpY0F1dGhDcmVkZW50aWFscykudXNlciAmJiAocHJvcHMuYmFzaWNBdXRoIGFzIEJhc2ljQXV0aENyZWRlbnRpYWxzKS5wYXNzd29yZCkge1xuICAgICAgICAgIHByb3BzLmJhc2ljQXV0aCA9IEJ1ZmZlci5mcm9tKGAkeyhwcm9wcy5iYXNpY0F1dGggYXMgQmFzaWNBdXRoQ3JlZGVudGlhbHMpLnVzZXJ9OiR7KHByb3BzLmJhc2ljQXV0aCBhcyBCYXNpY0F1dGhDcmVkZW50aWFscykucGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICB9IGVsc2UgaWYgKChwcm9wcy5iYXNpY0F1dGggYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoKSB7XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoID0gU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKHRoaXMsIChwcm9wcy5iYXNpY0F1dGggYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoLCAocHJvcHMuYmFzaWNBdXRoIGFzIFNzbVN0cmluZ1BhcmFtZXRlcikudmVyc2lvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24pIHtcbiAgICAgIGNmZm4gPSBDbG91ZEZyb250RnVuY3Rpb24uY3JlYXRlRnVuY3Rpb24odGhpcywgbnVsbCwge1xuICAgICAgICBjcmVkZW50aWFsczogcHJvcHMuYmFzaWNBdXRoLFxuICAgICAgICByZWRpcmVjdHM6IHByb3BzLnJlZGlyZWN0cyxcbiAgICAgICAgcmVkaXJlY3RzQ3N2UGF0aDogcHJvcHMucmVkaXJlY3RzQ3N2UGF0aCxcbiAgICAgICAgY29kZTogcHJvcHMuY2xvdWRmcm9udEZ1bmN0aW9uLmNvZGUsXG4gICAgICAgIGRlc3Ryb3k6IHByb3BzLmRlc3Ryb3lcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuYmFzaWNBdXRoKSB7XG4gICAgICBjZmZuID0gQ2xvdWRGcm9udEZ1bmN0aW9uLmNyZWF0ZUJhc2ljQXV0aERlZmF1bHREb2ModGhpcywge1xuICAgICAgICBjcmVkZW50aWFsczogcHJvcHMuYmFzaWNBdXRoLFxuICAgICAgICByZWRpcmVjdHM6IHByb3BzLnJlZGlyZWN0cyxcbiAgICAgICAgcmVkaXJlY3RzQ3N2UGF0aDogcHJvcHMucmVkaXJlY3RzQ3N2UGF0aCxcbiAgICAgICAgZGVzdHJveTogcHJvcHMuZGVzdHJveVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNmZm4gPSBDbG91ZEZyb250RnVuY3Rpb24uY3JlYXRlRGVmYXVsdERvYyh0aGlzLCB7XG4gICAgICAgIHJlZGlyZWN0czogcHJvcHMucmVkaXJlY3RzLFxuICAgICAgICByZWRpcmVjdHNDc3ZQYXRoOiBwcm9wcy5yZWRpcmVjdHNDc3ZQYXRoLFxuICAgICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jbG91ZEZyb250RnVuY3Rpb24gPSBjZmZuLmZuO1xuXG4gICAgLy8gY29uc3QgZXZlbnRUeXBlczogQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlW10gPSBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24/LmV2ZW50VHlwZSAmJiBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24uZXZlbnRUeXBlLmxlbmd0aCA+IDAgPyBwcm9wcy5jbG91ZGZyb250RnVuY3Rpb24uZXZlbnRUeXBlIDogWydWSUVXRVJfUkVRVUVTVCcsICdWSUVXRVJfUkVTUE9OU0UnXTtcblxuICAgIGxldCBldmVudFR5cGVzOiBDbG91ZEZyb250RnVuY3Rpb25FdmVudFR5cGVbXSA9IFsnVklFV0VSX1JFUVVFU1QnLCAnVklFV0VSX1JFU1BPTlNFJ107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMuY2xvdWRmcm9udEZ1bmN0aW9uPy5ldmVudFR5cGUpICYmIHByb3BzLmNsb3VkZnJvbnRGdW5jdGlvbi5ldmVudFR5cGUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXRzID0gcHJvcHMuY2xvdWRmcm9udEZ1bmN0aW9uLmV2ZW50VHlwZVxuICAgICAgICAuZmlsdGVyKCh2LCBpLCBhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVvZiB2ID09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAodiA9PT0gJ1ZJRVdFUl9SRVFVRVNUJyB8fCB2ID09PSAnVklFV0VSX1JFU1BPTlNFJykgJiZcbiAgICAgICAgICAgIGEuaW5kZXhPZih2KSA9PT0gaSAvLyBkZWR1cFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgaWYgKGV0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV2ZW50VHlwZXMgPSBldHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBldmVudFR5cGUgb2YgZXZlbnRUeXBlcykge1xuICAgICAgZGVmYXVsdEJlaGF2aW9yLmZ1bmN0aW9uQXNzb2NpYXRpb25zIS5wdXNoKHtcbiAgICAgICAgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZVtldmVudFR5cGVdLFxuICAgICAgICBmdW5jdGlvbjogdGhpcy5jbG91ZEZyb250RnVuY3Rpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBsZXQgd2ViQWNsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHByb3BzLndlYkFjbCA9PSAnc3RyaW5nJyAmJiBwcm9wcy53ZWJBY2wuc3RhcnRzV2l0aCgnYXJuOmF3cycpKSB7XG4gICAgICB3ZWJBY2xJZCA9IHByb3BzLndlYkFjbDtcbiAgICB9IGVsc2UgaWYgKChwcm9wcy53ZWJBY2wgYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoKSB7XG4gICAgICB3ZWJBY2xJZCA9IFN0cmluZ1BhcmFtZXRlci52YWx1ZUZvclN0cmluZ1BhcmFtZXRlcih0aGlzLCAocHJvcHMud2ViQWNsIGFzIFNzbVN0cmluZ1BhcmFtZXRlcikucGF0aCwgKHByb3BzLndlYkFjbCBhcyBTc21TdHJpbmdQYXJhbWV0ZXIpLnZlcnNpb24pO1xuICAgIH0gZWxzZSBpZiAocHJvcHMud2ViQWNsID09PSB0cnVlKSB7XG4gICAgICBjb25zdCB3YWYgPSBuZXcgQ2xvdWRGcm9udFdlYkFjbCh0aGlzLCAnQ2xvdWRGcm9udFdlYkFjbCcsIHtcbiAgICAgICAgbmFtZTogYCR7ZG9tYWluQXNJZChwcm9wcy5kb21haW5OYW1lKX1gLFxuICAgICAgICBkZXN0cm95OiBwcm9wcy5kZXN0cm95XG4gICAgICB9KTtcbiAgICAgIHRoaXMud2ViQWNsID0gd2FmLmFjbDtcbiAgICAgIHdlYkFjbElkID0gd2FmLmFjbC5hdHRyQXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNmRGlzdHJpYnV0aW9uID0gbmV3IENsb3VkRnJvbnREaXN0cmlidXRpb24odGhpcywgJ0Nsb3VkRnJvbnREaXN0cmlidXRpb24nLCB7XG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW5OYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uID8/IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICBwcmljZUNsYXNzOiBwcm9wcy5lbnZUeXBlLFxuICAgICAgY2VydGlmaWNhdGU6IHRoaXMuc3NsQ2VydGlmaWNhdGUsXG4gICAgICBkZWZhdWx0QmVoYXZpb3IsXG4gICAgICB3ZWJBY2xJZFxuICAgIH0pO1xuICAgIHRoaXMuY2xvdWRGcm9udERpc3RyaWJ1dGlvbiA9IGNmRGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbjtcblxuICAgIGNvbnN0IGNmQWxpYXMgPSBuZXcgQ2xvdWRGcm9udEFsaWFzKHRoaXMsICdDbG91ZEZyb250QWxpYXMnLCB7XG4gICAgICBkaXN0cmlidXRpb246IGNmRGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbixcbiAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICBob3N0ZWRab25lOiBob3N0ZWRab25lXG4gICAgfSk7XG4gICAgdGhpcy5hUmVjb3JkID0gY2ZBbGlhcy5hUmVjb3JkO1xuICAgIHRoaXMuYWFhYVJlY29yZCA9IGNmQWxpYXMuYWFhYVJlY29yZDtcbiAgfVxufSJdfQ==
|
package/dist/types.d.ts
CHANGED
|
@@ -14,4 +14,8 @@ export interface ResourceProps {
|
|
|
14
14
|
export interface BasicAuthCredentials {
|
|
15
15
|
user: string;
|
|
16
16
|
password: string;
|
|
17
|
-
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type CspDirective = 'connect-src' | 'default-src' | 'font-src' | 'frame-src' | 'img-src' | 'media-src' | 'object-src' | 'script-src' | 'style-src';
|
|
20
|
+
export type CspDirectiveValue = "'self'" | "'none'" | "'unsafe-inline'" | "https:";
|
|
21
|
+
export type CspHeaders = Partial<Record<CspDirective, CspDirectiveValue[] | string[]>>;
|
package/package.json
CHANGED
package/samples/app.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { WebStaticServerlessStage } from '@inizioevoke/evosynth/stages/web-stati
|
|
|
6
6
|
import { AddSourceStageParams } from '@inizioevoke/evosynth/constructs/codepipeline';
|
|
7
7
|
import type { SsmStringParameter } from '@inizioevoke/evosynth/constructs/ssm';
|
|
8
8
|
// import { BasicAuthCredentials } from '@inizioevoke/evosynth/types';
|
|
9
|
+
// import cspHeaders from './csp';
|
|
9
10
|
|
|
10
11
|
const app = new cdk.App();
|
|
11
12
|
|
|
@@ -55,6 +56,20 @@ new WebStaticServerlessStage(app, 'dev', {
|
|
|
55
56
|
domainName: `${appName}.evodev.net`,
|
|
56
57
|
basicAuth,
|
|
57
58
|
webAcl,
|
|
59
|
+
|
|
60
|
+
// responseHeadersPolicyProps: { /* full CDK policy */},
|
|
61
|
+
// responseHeadersPolicy: 'SECURITY_HEADERS', // AWS managed policy
|
|
62
|
+
// responseHeadersPolicy: 'NONE', // Not recommended
|
|
63
|
+
// responseHeadersPolicy: '[UUID from CloudFront > Policies > Response headers]',
|
|
64
|
+
// responseHeadersPolicy: { path: '/evosynth/web/security/response-headers' }, // UUID from Parameter Store
|
|
65
|
+
// responseCspHeaders: { // just CSP headers, extends ResponseHeadersPolicy.SECURITY_HEADERS
|
|
66
|
+
// 'default-src': [
|
|
67
|
+
// "'self'"
|
|
68
|
+
// ]
|
|
69
|
+
// },
|
|
70
|
+
// responseCspHeaders: cspHeaders // imported from another file
|
|
71
|
+
// If no response header policy is specified, default will be the AWS managed ResponseHeadersPolicy.SECURITY_HEADERS
|
|
72
|
+
|
|
58
73
|
// Use a custom CloudFront Viewer Request/Response function
|
|
59
74
|
// viewerRequestResponseFn: 'function handler(event) { /* do something */ }',
|
|
60
75
|
|
package/samples/csp.ts
ADDED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Stack, StackProps, PhysicalName } from 'aws-cdk-lib/core';
|
|
1
|
+
import { Stack, StackProps, PhysicalName, Duration } from 'aws-cdk-lib/core';
|
|
2
2
|
import { Construct } from 'constructs';
|
|
3
3
|
|
|
4
4
|
import { Certificate } from "aws-cdk-lib/aws-certificatemanager";
|
|
5
|
-
import { Distribution, Function, FunctionEventType, IResponseHeadersPolicy, ResponseHeadersPolicyProps, BehaviorOptions, ResponseHeadersPolicy } from 'aws-cdk-lib/aws-cloudfront';
|
|
5
|
+
import { Distribution, Function, FunctionEventType, IResponseHeadersPolicy, ResponseHeadersPolicyProps, ResponseSecurityHeadersBehavior, BehaviorOptions, ResponseHeadersPolicy, HeadersFrameOption, HeadersReferrerPolicy } from 'aws-cdk-lib/aws-cloudfront';
|
|
6
6
|
import { ARecord, AaaaRecord } from "aws-cdk-lib/aws-route53";
|
|
7
7
|
import { Bucket } from "aws-cdk-lib/aws-s3";
|
|
8
8
|
import { StringParameter } from 'aws-cdk-lib/aws-ssm';
|
|
@@ -17,7 +17,7 @@ import { CloudFrontWebAcl } from '../../constructs/waf.js';
|
|
|
17
17
|
import { domainAsId } from '../../lib/utils.js';
|
|
18
18
|
import { addEvoStackTags } from '../../lib/tags.ts';
|
|
19
19
|
import { S3BucketOrigin } from 'aws-cdk-lib/aws-cloudfront-origins';
|
|
20
|
-
import type { BasicAuthCredentials } from '../../types.d.ts';
|
|
20
|
+
import type { BasicAuthCredentials, CspHeaders } from '../../types.d.ts';
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
type AWSManagedResponseHeadersPolicy =
|
|
@@ -45,8 +45,9 @@ export interface WebGlobalStackProps {
|
|
|
45
45
|
redirectsCsvPath?: string;
|
|
46
46
|
// attachWebAcl?: boolean | string;
|
|
47
47
|
webAcl?: boolean | string | SsmStringParameter;
|
|
48
|
-
responseHeadersPolicy?: false | AWSManagedResponseHeadersPolicy | UUID | SsmStringParameter;
|
|
48
|
+
responseHeadersPolicy?: false | AWSManagedResponseHeadersPolicy | 'NONE' | UUID | SsmStringParameter;
|
|
49
49
|
responseHeadersPolicyProps?: ResponseHeadersPolicyProps;
|
|
50
|
+
responseCspHeaders?: CspHeaders;
|
|
50
51
|
destroy?: boolean;
|
|
51
52
|
tags?: Record<string, string>;
|
|
52
53
|
}
|
|
@@ -81,22 +82,67 @@ export class WebGlobalStack extends Stack {
|
|
|
81
82
|
this.s3Bucket = _s3Bucket.bucket;
|
|
82
83
|
|
|
83
84
|
let responseHeadersPolicy: IResponseHeadersPolicy | undefined = undefined;
|
|
84
|
-
if (props.responseHeadersPolicy) {
|
|
85
|
-
if (
|
|
86
|
-
if (
|
|
87
|
-
|
|
85
|
+
if (props.responseHeadersPolicy !== 'NONE') { // I don't know why you would want to not have the policy but just in case
|
|
86
|
+
if (props.responseHeadersPolicy) {
|
|
87
|
+
if (typeof props.responseHeadersPolicy == 'string') {
|
|
88
|
+
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(props.responseHeadersPolicy)) {
|
|
89
|
+
responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', props.responseHeadersPolicy);
|
|
90
|
+
} else {
|
|
91
|
+
responseHeadersPolicy = ResponseHeadersPolicy[props.responseHeadersPolicy as keyof typeof ResponseHeadersPolicy] as IResponseHeadersPolicy ?? ResponseHeadersPolicy.SECURITY_HEADERS;
|
|
92
|
+
}
|
|
93
|
+
} else if (props.responseHeadersPolicy.path) {
|
|
94
|
+
responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', StringParameter.valueForStringParameter(this, props.responseHeadersPolicy.path, props.responseHeadersPolicy.version));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (!responseHeadersPolicy) {
|
|
98
|
+
// const baseHeadersBehavior: ResponseSecurityHeadersBehavior = {
|
|
99
|
+
// strictTransportSecurity: {
|
|
100
|
+
// override: true,
|
|
101
|
+
// accessControlMaxAge: Duration.seconds(31536000)
|
|
102
|
+
// },
|
|
103
|
+
// contentTypeOptions: {
|
|
104
|
+
// override: true
|
|
105
|
+
// },
|
|
106
|
+
// frameOptions: {
|
|
107
|
+
// override: true,
|
|
108
|
+
// frameOption: HeadersFrameOption.SAMEORIGIN,
|
|
109
|
+
// },
|
|
110
|
+
// referrerPolicy: {
|
|
111
|
+
// override: true,
|
|
112
|
+
// referrerPolicy: HeadersReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN
|
|
113
|
+
// },
|
|
114
|
+
// xssProtection: {
|
|
115
|
+
// override: true,
|
|
116
|
+
// protection: true,
|
|
117
|
+
// modeBlock: true
|
|
118
|
+
// }
|
|
119
|
+
// };
|
|
120
|
+
|
|
121
|
+
const responseHeadersPolicyName = `${domainAsId(props.domainName)}-response-headers-policy`;
|
|
122
|
+
|
|
123
|
+
if (props.responseHeadersPolicyProps) {
|
|
124
|
+
responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
|
|
125
|
+
...ResponseHeadersPolicy.SECURITY_HEADERS,
|
|
126
|
+
...props.responseHeadersPolicyProps,
|
|
127
|
+
responseHeadersPolicyName: props.responseHeadersPolicyProps.responseHeadersPolicyName || responseHeadersPolicyName
|
|
128
|
+
});
|
|
129
|
+
} else if (props.responseCspHeaders) {
|
|
130
|
+
responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
|
|
131
|
+
securityHeadersBehavior: {
|
|
132
|
+
...ResponseHeadersPolicy.SECURITY_HEADERS,
|
|
133
|
+
contentSecurityPolicy: {
|
|
134
|
+
override: true,
|
|
135
|
+
contentSecurityPolicy: Object.entries(props.responseCspHeaders).map(([directive, values]) => {
|
|
136
|
+
return `${directive} ${values.join(' ')};`
|
|
137
|
+
}).join(' ')
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
responseHeadersPolicyName
|
|
141
|
+
});
|
|
88
142
|
} else {
|
|
89
|
-
responseHeadersPolicy = ResponseHeadersPolicy
|
|
143
|
+
responseHeadersPolicy = ResponseHeadersPolicy.SECURITY_HEADERS;
|
|
90
144
|
}
|
|
91
|
-
} else if (props.responseHeadersPolicy.path) {
|
|
92
|
-
responseHeadersPolicy = ResponseHeadersPolicy.fromResponseHeadersPolicyId(this, 'response-headers-policy-by-id', StringParameter.valueForStringParameter(this, props.responseHeadersPolicy.path, props.responseHeadersPolicy.version));
|
|
93
145
|
}
|
|
94
|
-
}
|
|
95
|
-
if (!responseHeadersPolicy && props.responseHeadersPolicyProps) {
|
|
96
|
-
responseHeadersPolicy = new ResponseHeadersPolicy(this, 'response-headers-policy', {
|
|
97
|
-
...props.responseHeadersPolicyProps,
|
|
98
|
-
responseHeadersPolicyName: props.responseHeadersPolicyProps.responseHeadersPolicyName || `${domainAsId(props.domainName)}-response-headers-policy`
|
|
99
|
-
});
|
|
100
146
|
this.responseHeadersPolicy = responseHeadersPolicy;
|
|
101
147
|
}
|
|
102
148
|
|
package/src/types.d.ts
CHANGED
|
@@ -14,4 +14,8 @@ export interface ResourceProps {
|
|
|
14
14
|
export interface BasicAuthCredentials {
|
|
15
15
|
user: string;
|
|
16
16
|
password: string;
|
|
17
|
-
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type CspDirective = 'connect-src' | 'default-src' | 'font-src' | 'frame-src' | 'img-src' | 'media-src' | 'object-src' | 'script-src' | 'style-src';
|
|
20
|
+
export type CspDirectiveValue = "'self'" | "'none'" | "'unsafe-inline'" | "https:";
|
|
21
|
+
export type CspHeaders = Partial<Record<CspDirective, CspDirectiveValue[] | string[]>>;
|