@aws-cdk/aws-glue-alpha 2.266.0-alpha.0 → 2.267.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +487 -349
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +0 -58
- package/README.md +47 -29
- package/awslint.json +4 -0
- package/lib/catalog.js +3 -3
- package/lib/code.js +3 -3
- package/lib/connection.d.ts +41 -1
- package/lib/connection.js +48 -9
- package/lib/data-format.js +5 -5
- package/lib/data-quality-ruleset.js +3 -3
- package/lib/database.js +1 -1
- package/lib/external-table.js +1 -1
- package/lib/index.d.ts +0 -1
- package/lib/index.js +1 -2
- package/lib/jobs/job.js +2 -2
- package/lib/jobs/pyspark-etl-job.js +1 -1
- package/lib/jobs/pyspark-flex-etl-job.js +1 -1
- package/lib/jobs/pyspark-streaming-job.js +1 -1
- package/lib/jobs/python-shell-job.js +1 -1
- package/lib/jobs/ray-job.js +1 -1
- package/lib/jobs/scala-spark-etl-job.js +1 -1
- package/lib/jobs/scala-spark-flex-etl-job.js +1 -1
- package/lib/jobs/scala-spark-streaming-job.js +1 -1
- package/lib/jobs/spark-job.js +1 -1
- package/lib/partition-projection.d.ts +8 -8
- package/lib/partition-projection.js +49 -2
- package/lib/s3-table.d.ts +83 -40
- package/lib/s3-table.js +133 -85
- package/lib/schema.d.ts +26 -6
- package/lib/schema.js +74 -77
- package/lib/security-configuration.js +4 -4
- package/lib/storage-parameter.d.ts +14 -3
- package/lib/storage-parameter.js +16 -6
- package/lib/table-base.d.ts +1 -1
- package/lib/table-base.js +2 -2
- package/lib/triggers/trigger-options.js +1 -1
- package/lib/triggers/workflow.js +2 -2
- package/package.json +7 -7
- package/lib/table-deprecated.d.ts +0 -13
- package/lib/table-deprecated.js +0 -70
package/lib/s3-table.d.ts
CHANGED
|
@@ -6,41 +6,95 @@ import type { Construct } from 'constructs';
|
|
|
6
6
|
import type { PartitionIndex, TableBaseProps } from './table-base';
|
|
7
7
|
import { TableBase } from './table-base';
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* Server-side encryption for the S3 bucket that a managed `S3Table` creates.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* Applies only when the table manages its own bucket (via
|
|
12
|
+
* `S3TableStorage.managedBucket`). An existing bucket keeps whatever encryption
|
|
13
|
+
* it was created with.
|
|
12
14
|
*/
|
|
13
|
-
export declare
|
|
15
|
+
export declare class S3TableEncryption {
|
|
14
16
|
/**
|
|
15
|
-
* Server
|
|
16
|
-
*
|
|
17
|
-
* @see https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html
|
|
17
|
+
* Server-side encryption (SSE-S3) with an Amazon S3-managed key.
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
static s3Managed(): S3TableEncryption;
|
|
20
20
|
/**
|
|
21
|
-
* Server-side encryption (SSE) with an AWS KMS key managed by the account owner.
|
|
21
|
+
* Server-side encryption (SSE-KMS) with an AWS KMS key managed by the account owner.
|
|
22
22
|
*
|
|
23
|
-
* @
|
|
23
|
+
* @param key the KMS key used to encrypt the data. A key is created if one is not provided.
|
|
24
24
|
*/
|
|
25
|
-
|
|
25
|
+
static kms(key?: kms.IKey): S3TableEncryption;
|
|
26
26
|
/**
|
|
27
|
-
* Server-side encryption (SSE) with an AWS KMS key managed by the KMS service.
|
|
27
|
+
* Server-side encryption (SSE-KMS) with an AWS KMS key managed by the KMS service.
|
|
28
28
|
*/
|
|
29
|
-
|
|
29
|
+
static kmsManaged(): S3TableEncryption;
|
|
30
|
+
/** @internal */
|
|
31
|
+
readonly _bucketEncryption: s3.BucketEncryption;
|
|
32
|
+
/** @internal */
|
|
33
|
+
readonly _kmsKey?: kms.IKey;
|
|
34
|
+
private constructor();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Where an `S3Table` stores its data.
|
|
38
|
+
*
|
|
39
|
+
* The two paths are mutually exclusive: a managed bucket may specify its
|
|
40
|
+
* server-side encryption, while an existing bucket keeps its own encryption — so
|
|
41
|
+
* an encryption choice can never be paired with a bring-your-own bucket.
|
|
42
|
+
*/
|
|
43
|
+
export declare class S3TableStorage {
|
|
30
44
|
/**
|
|
31
|
-
*
|
|
45
|
+
* Store the table's data in a bucket created and managed by the table.
|
|
32
46
|
*
|
|
33
|
-
* @
|
|
47
|
+
* @param encryption the server-side encryption for the created bucket.
|
|
48
|
+
* @default - S3-managed (SSE-S3) encryption
|
|
34
49
|
*/
|
|
35
|
-
|
|
50
|
+
static managedBucket(encryption?: S3TableEncryption): S3TableStorage;
|
|
51
|
+
/**
|
|
52
|
+
* Store the table's data in an existing bucket. CDK does not manage the
|
|
53
|
+
* bucket's encryption.
|
|
54
|
+
*
|
|
55
|
+
* The bucket can be one you don't own, imported with
|
|
56
|
+
* `Bucket.fromBucketArn()` or `Bucket.fromBucketAttributes()`. If that bucket
|
|
57
|
+
* is KMS-encrypted, import it with `Bucket.fromBucketAttributes()` and supply
|
|
58
|
+
* the `encryptionKey` attribute. Otherwise, CDK has no reference to the key,
|
|
59
|
+
* which means that `S3Table.grantRead()`/`grantWrite()` will correctly grant
|
|
60
|
+
* S3 access but silently skip the KMS permissions on the key. As a consequence,
|
|
61
|
+
* at runtime, reads and writes will fail with access denied on the key.
|
|
62
|
+
*
|
|
63
|
+
* @param bucket the bucket that holds the table's data.
|
|
64
|
+
*/
|
|
65
|
+
static fromBucket(bucket: s3.IBucket): S3TableStorage;
|
|
66
|
+
/** @internal */
|
|
67
|
+
readonly _bucket?: s3.IBucket;
|
|
68
|
+
/** @internal */
|
|
69
|
+
readonly _encryption?: S3TableEncryption;
|
|
70
|
+
private constructor();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Client-side encryption for an `S3Table`'s data.
|
|
74
|
+
*
|
|
75
|
+
* Independent of the bucket's server-side encryption and of who owns the bucket:
|
|
76
|
+
* the data is encrypted by the client before it is written to S3. When set, the
|
|
77
|
+
* `grant*` methods also grant the relevant KMS permissions on the key.
|
|
78
|
+
*/
|
|
79
|
+
export declare class TableClientSideEncryption {
|
|
80
|
+
/**
|
|
81
|
+
* Client-side encryption (CSE-KMS) with an AWS KMS key managed by the account owner.
|
|
82
|
+
*
|
|
83
|
+
* @param key the KMS key used to encrypt the data. A key is created if one is not provided.
|
|
84
|
+
*/
|
|
85
|
+
static kms(key?: kms.IKey): TableClientSideEncryption;
|
|
86
|
+
/** @internal */
|
|
87
|
+
readonly _kmsKey?: kms.IKey;
|
|
88
|
+
private constructor();
|
|
36
89
|
}
|
|
37
90
|
export interface S3TableProps extends TableBaseProps {
|
|
38
91
|
/**
|
|
39
|
-
*
|
|
92
|
+
* Where the table's data is stored: a bucket created and managed by the table,
|
|
93
|
+
* or an existing bucket you provide.
|
|
40
94
|
*
|
|
41
|
-
* @default
|
|
95
|
+
* @default - a managed bucket with S3-managed (SSE-S3) encryption
|
|
42
96
|
*/
|
|
43
|
-
readonly
|
|
97
|
+
readonly storage?: S3TableStorage;
|
|
44
98
|
/**
|
|
45
99
|
* S3 prefix under which table objects are stored.
|
|
46
100
|
*
|
|
@@ -52,25 +106,14 @@ export interface S3TableProps extends TableBaseProps {
|
|
|
52
106
|
*/
|
|
53
107
|
readonly s3Prefix?: string;
|
|
54
108
|
/**
|
|
55
|
-
*
|
|
109
|
+
* Client-side encryption (CSE-KMS) for the table's data.
|
|
56
110
|
*
|
|
57
|
-
*
|
|
111
|
+
* Independent of the bucket's server-side encryption, and valid whether the
|
|
112
|
+
* bucket is managed or provided.
|
|
58
113
|
*
|
|
59
|
-
*
|
|
60
|
-
* If you choose `CSE-KMS`, you *may* provide an un-managed KMS key with `encryptionKey`;
|
|
61
|
-
* one is created automatically if omitted.
|
|
62
|
-
*
|
|
63
|
-
* @default BucketEncryption.S3_MANAGED
|
|
114
|
+
* @default - no client-side encryption
|
|
64
115
|
*/
|
|
65
|
-
readonly
|
|
66
|
-
/**
|
|
67
|
-
* External KMS key to use for bucket encryption.
|
|
68
|
-
*
|
|
69
|
-
* The `encryption` property must be `SSE-KMS` or `CSE-KMS`.
|
|
70
|
-
*
|
|
71
|
-
* @default key is managed by KMS.
|
|
72
|
-
*/
|
|
73
|
-
readonly encryptionKey?: kms.IKey;
|
|
116
|
+
readonly clientSideEncryption?: TableClientSideEncryption;
|
|
74
117
|
}
|
|
75
118
|
/**
|
|
76
119
|
* A Glue table that targets a S3 dataset.
|
|
@@ -89,13 +132,12 @@ export declare class S3Table extends TableBase {
|
|
|
89
132
|
*/
|
|
90
133
|
readonly s3Prefix: string;
|
|
91
134
|
/**
|
|
92
|
-
* The
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
* The KMS key used to secure the data if `encryption` is set to `CSE-KMS` or `SSE-KMS`. Otherwise, `undefined`.
|
|
135
|
+
* The KMS key used for client-side encryption of the table's data, if
|
|
136
|
+
* `clientSideEncryption` was configured. Otherwise, `undefined`.
|
|
137
|
+
*
|
|
138
|
+
* For server-side (bucket) encryption, read `bucket.encryptionKey` instead.
|
|
97
139
|
*/
|
|
98
|
-
readonly
|
|
140
|
+
readonly clientSideEncryptionKey?: kms.IKey;
|
|
99
141
|
/**
|
|
100
142
|
* This table's partition indexes.
|
|
101
143
|
*/
|
|
@@ -138,4 +180,5 @@ export declare class S3Table extends TableBase {
|
|
|
138
180
|
*/
|
|
139
181
|
grantReadWrite(grantee: iam.IGrantable): iam.Grant;
|
|
140
182
|
protected generateS3PrefixForGrant(): string;
|
|
183
|
+
private createManagedBucket;
|
|
141
184
|
}
|
package/lib/s3-table.js
CHANGED
|
@@ -67,7 +67,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
67
67
|
};
|
|
68
68
|
})();
|
|
69
69
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
70
|
-
exports.S3Table = exports.
|
|
70
|
+
exports.S3Table = exports.TableClientSideEncryption = exports.S3TableStorage = exports.S3TableEncryption = void 0;
|
|
71
71
|
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
72
72
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
73
73
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
@@ -79,35 +79,122 @@ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
|
79
79
|
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
80
80
|
const table_base_1 = require("./table-base");
|
|
81
81
|
/**
|
|
82
|
-
*
|
|
82
|
+
* Server-side encryption for the S3 bucket that a managed `S3Table` creates.
|
|
83
83
|
*
|
|
84
|
-
*
|
|
84
|
+
* Applies only when the table manages its own bucket (via
|
|
85
|
+
* `S3TableStorage.managedBucket`). An existing bucket keeps whatever encryption
|
|
86
|
+
* it was created with.
|
|
85
87
|
*/
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
class S3TableEncryption {
|
|
89
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.S3TableEncryption", version: "2.267.0-alpha.0" };
|
|
88
90
|
/**
|
|
89
|
-
* Server
|
|
91
|
+
* Server-side encryption (SSE-S3) with an Amazon S3-managed key.
|
|
92
|
+
*/
|
|
93
|
+
static s3Managed() {
|
|
94
|
+
return new S3TableEncryption(s3.BucketEncryption.S3_MANAGED);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Server-side encryption (SSE-KMS) with an AWS KMS key managed by the account owner.
|
|
90
98
|
*
|
|
91
|
-
* @
|
|
99
|
+
* @param key the KMS key used to encrypt the data. A key is created if one is not provided.
|
|
100
|
+
*/
|
|
101
|
+
static kms(key) {
|
|
102
|
+
return new S3TableEncryption(s3.BucketEncryption.KMS, key);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Server-side encryption (SSE-KMS) with an AWS KMS key managed by the KMS service.
|
|
92
106
|
*/
|
|
93
|
-
|
|
107
|
+
static kmsManaged() {
|
|
108
|
+
return new S3TableEncryption(s3.BucketEncryption.KMS_MANAGED);
|
|
109
|
+
}
|
|
110
|
+
/** @internal */
|
|
111
|
+
_bucketEncryption;
|
|
112
|
+
/** @internal */
|
|
113
|
+
_kmsKey;
|
|
114
|
+
constructor(bucketEncryption, kmsKey) {
|
|
115
|
+
this._bucketEncryption = bucketEncryption;
|
|
116
|
+
this._kmsKey = kmsKey;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.S3TableEncryption = S3TableEncryption;
|
|
120
|
+
/**
|
|
121
|
+
* Where an `S3Table` stores its data.
|
|
122
|
+
*
|
|
123
|
+
* The two paths are mutually exclusive: a managed bucket may specify its
|
|
124
|
+
* server-side encryption, while an existing bucket keeps its own encryption — so
|
|
125
|
+
* an encryption choice can never be paired with a bring-your-own bucket.
|
|
126
|
+
*/
|
|
127
|
+
class S3TableStorage {
|
|
128
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.S3TableStorage", version: "2.267.0-alpha.0" };
|
|
94
129
|
/**
|
|
95
|
-
*
|
|
130
|
+
* Store the table's data in a bucket created and managed by the table.
|
|
96
131
|
*
|
|
97
|
-
* @
|
|
132
|
+
* @param encryption the server-side encryption for the created bucket.
|
|
133
|
+
* @default - S3-managed (SSE-S3) encryption
|
|
98
134
|
*/
|
|
99
|
-
|
|
135
|
+
static managedBucket(encryption) {
|
|
136
|
+
try {
|
|
137
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_S3TableEncryption(encryption);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
141
|
+
Error.captureStackTrace(error, this.managedBucket);
|
|
142
|
+
}
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
return new S3TableStorage(undefined, encryption);
|
|
146
|
+
}
|
|
100
147
|
/**
|
|
101
|
-
*
|
|
148
|
+
* Store the table's data in an existing bucket. CDK does not manage the
|
|
149
|
+
* bucket's encryption.
|
|
150
|
+
*
|
|
151
|
+
* The bucket can be one you don't own, imported with
|
|
152
|
+
* `Bucket.fromBucketArn()` or `Bucket.fromBucketAttributes()`. If that bucket
|
|
153
|
+
* is KMS-encrypted, import it with `Bucket.fromBucketAttributes()` and supply
|
|
154
|
+
* the `encryptionKey` attribute. Otherwise, CDK has no reference to the key,
|
|
155
|
+
* which means that `S3Table.grantRead()`/`grantWrite()` will correctly grant
|
|
156
|
+
* S3 access but silently skip the KMS permissions on the key. As a consequence,
|
|
157
|
+
* at runtime, reads and writes will fail with access denied on the key.
|
|
158
|
+
*
|
|
159
|
+
* @param bucket the bucket that holds the table's data.
|
|
102
160
|
*/
|
|
103
|
-
|
|
161
|
+
static fromBucket(bucket) {
|
|
162
|
+
return new S3TableStorage(bucket, undefined);
|
|
163
|
+
}
|
|
164
|
+
/** @internal */
|
|
165
|
+
_bucket;
|
|
166
|
+
/** @internal */
|
|
167
|
+
_encryption;
|
|
168
|
+
constructor(bucket, encryption) {
|
|
169
|
+
this._bucket = bucket;
|
|
170
|
+
this._encryption = encryption;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
exports.S3TableStorage = S3TableStorage;
|
|
174
|
+
/**
|
|
175
|
+
* Client-side encryption for an `S3Table`'s data.
|
|
176
|
+
*
|
|
177
|
+
* Independent of the bucket's server-side encryption and of who owns the bucket:
|
|
178
|
+
* the data is encrypted by the client before it is written to S3. When set, the
|
|
179
|
+
* `grant*` methods also grant the relevant KMS permissions on the key.
|
|
180
|
+
*/
|
|
181
|
+
class TableClientSideEncryption {
|
|
182
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.TableClientSideEncryption", version: "2.267.0-alpha.0" };
|
|
104
183
|
/**
|
|
105
|
-
* Client-side encryption (CSE) with an AWS KMS key managed by the account owner.
|
|
184
|
+
* Client-side encryption (CSE-KMS) with an AWS KMS key managed by the account owner.
|
|
106
185
|
*
|
|
107
|
-
* @
|
|
186
|
+
* @param key the KMS key used to encrypt the data. A key is created if one is not provided.
|
|
108
187
|
*/
|
|
109
|
-
|
|
110
|
-
|
|
188
|
+
static kms(key) {
|
|
189
|
+
return new TableClientSideEncryption(key);
|
|
190
|
+
}
|
|
191
|
+
/** @internal */
|
|
192
|
+
_kmsKey;
|
|
193
|
+
constructor(kmsKey) {
|
|
194
|
+
this._kmsKey = kmsKey;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.TableClientSideEncryption = TableClientSideEncryption;
|
|
111
198
|
/**
|
|
112
199
|
* A Glue table that targets a S3 dataset.
|
|
113
200
|
* @resource AWS::Glue::Table
|
|
@@ -142,7 +229,7 @@ let S3Table = (() => {
|
|
|
142
229
|
S3Table = _classThis = _classDescriptor.value;
|
|
143
230
|
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
144
231
|
}
|
|
145
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.S3Table", version: "2.
|
|
232
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.S3Table", version: "2.267.0-alpha.0" };
|
|
146
233
|
/** Uniquely identifies this class. */
|
|
147
234
|
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.S3Table';
|
|
148
235
|
resource = __runInitializers(this, _instanceExtraInitializers);
|
|
@@ -155,13 +242,12 @@ let S3Table = (() => {
|
|
|
155
242
|
*/
|
|
156
243
|
s3Prefix;
|
|
157
244
|
/**
|
|
158
|
-
* The
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
* The KMS key used to secure the data if `encryption` is set to `CSE-KMS` or `SSE-KMS`. Otherwise, `undefined`.
|
|
245
|
+
* The KMS key used for client-side encryption of the table's data, if
|
|
246
|
+
* `clientSideEncryption` was configured. Otherwise, `undefined`.
|
|
247
|
+
*
|
|
248
|
+
* For server-side (bucket) encryption, read `bucket.encryptionKey` instead.
|
|
163
249
|
*/
|
|
164
|
-
|
|
250
|
+
clientSideEncryptionKey;
|
|
165
251
|
/**
|
|
166
252
|
* This table's partition indexes.
|
|
167
253
|
*/
|
|
@@ -187,11 +273,14 @@ let S3Table = (() => {
|
|
|
187
273
|
// Enhanced CDK Analytics Telemetry
|
|
188
274
|
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
189
275
|
this.s3Prefix = props.s3Prefix ?? '';
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
this.bucket =
|
|
193
|
-
|
|
194
|
-
|
|
276
|
+
const storage = props.storage ?? S3TableStorage.managedBucket();
|
|
277
|
+
this.userProvidedBucket = storage._bucket !== undefined;
|
|
278
|
+
this.bucket = storage._bucket ?? this.createManagedBucket(storage._encryption);
|
|
279
|
+
if (props.clientSideEncryption) {
|
|
280
|
+
// CSE-KMS: use the provided key or create one automatically. The bucket's
|
|
281
|
+
// own server-side encryption is independent and comes from `storage`.
|
|
282
|
+
this.clientSideEncryptionKey = props.clientSideEncryption._kmsKey ?? new kms.Key(this, 'Key');
|
|
283
|
+
}
|
|
195
284
|
this.resource = new aws_glue_1.CfnTable(this, 'Table', {
|
|
196
285
|
catalogId: props.database.catalog.catalogId,
|
|
197
286
|
databaseName: props.database.databaseName,
|
|
@@ -261,8 +350,8 @@ let S3Table = (() => {
|
|
|
261
350
|
*/
|
|
262
351
|
grantRead(grantee) {
|
|
263
352
|
const ret = this.grant(grantee, readPermissions);
|
|
264
|
-
if (this.
|
|
265
|
-
this.
|
|
353
|
+
if (this.clientSideEncryptionKey) {
|
|
354
|
+
this.clientSideEncryptionKey.grantDecrypt(grantee);
|
|
266
355
|
}
|
|
267
356
|
this.bucket.grantRead(grantee, this.generateS3PrefixForGrant());
|
|
268
357
|
return ret;
|
|
@@ -275,8 +364,8 @@ let S3Table = (() => {
|
|
|
275
364
|
*/
|
|
276
365
|
grantWrite(grantee) {
|
|
277
366
|
const ret = this.grant(grantee, writePermissions);
|
|
278
|
-
if (this.
|
|
279
|
-
this.
|
|
367
|
+
if (this.clientSideEncryptionKey) {
|
|
368
|
+
this.clientSideEncryptionKey.grantEncrypt(grantee);
|
|
280
369
|
}
|
|
281
370
|
this.bucket.grantWrite(grantee, this.generateS3PrefixForGrant());
|
|
282
371
|
return ret;
|
|
@@ -289,8 +378,8 @@ let S3Table = (() => {
|
|
|
289
378
|
*/
|
|
290
379
|
grantReadWrite(grantee) {
|
|
291
380
|
const ret = this.grant(grantee, [...readPermissions, ...writePermissions]);
|
|
292
|
-
if (this.
|
|
293
|
-
this.
|
|
381
|
+
if (this.clientSideEncryptionKey) {
|
|
382
|
+
this.clientSideEncryptionKey.grantEncryptDecrypt(grantee);
|
|
294
383
|
}
|
|
295
384
|
this.bucket.grantReadWrite(grantee, this.generateS3PrefixForGrant());
|
|
296
385
|
return ret;
|
|
@@ -306,6 +395,14 @@ let S3Table = (() => {
|
|
|
306
395
|
}
|
|
307
396
|
return this.s3Prefix + '*';
|
|
308
397
|
}
|
|
398
|
+
createManagedBucket(encryption) {
|
|
399
|
+
const enc = encryption ?? S3TableEncryption.s3Managed();
|
|
400
|
+
return new s3.Bucket(this, 'Bucket', {
|
|
401
|
+
encryption: enc._bucketEncryption,
|
|
402
|
+
encryptionKey: enc._kmsKey,
|
|
403
|
+
enforceSSL: true,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
309
406
|
static {
|
|
310
407
|
__runInitializers(_classThis, _classExtraInitializers);
|
|
311
408
|
}
|
|
@@ -329,55 +426,6 @@ const writePermissions = [
|
|
|
329
426
|
'glue:DeletePartition',
|
|
330
427
|
'glue:UpdatePartition',
|
|
331
428
|
];
|
|
332
|
-
// map TableEncryption to bucket's SSE configuration (s3.BucketEncryption)
|
|
333
|
-
const encryptionMappings = {
|
|
334
|
-
[TableEncryption.S3_MANAGED]: s3.BucketEncryption.S3_MANAGED,
|
|
335
|
-
[TableEncryption.KMS_MANAGED]: s3.BucketEncryption.KMS_MANAGED,
|
|
336
|
-
[TableEncryption.KMS]: s3.BucketEncryption.KMS,
|
|
337
|
-
[TableEncryption.CLIENT_SIDE_KMS]: s3.BucketEncryption.S3_MANAGED,
|
|
338
|
-
};
|
|
339
|
-
// create the bucket to store a table's data depending on the `encryption` and `encryptionKey` properties.
|
|
340
|
-
function createBucket(table, props) {
|
|
341
|
-
let bucket = props.bucket;
|
|
342
|
-
if (bucket && (props.encryption !== undefined && props.encryption !== TableEncryption.CLIENT_SIDE_KMS)) {
|
|
343
|
-
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `EncryptionWithProvidedBucket`, 'you can not specify encryption settings if you also provide a bucket');
|
|
344
|
-
}
|
|
345
|
-
const encryption = props.encryption || TableEncryption.S3_MANAGED;
|
|
346
|
-
let encryptionKey;
|
|
347
|
-
if (encryption === TableEncryption.CLIENT_SIDE_KMS && props.encryptionKey === undefined) {
|
|
348
|
-
// CSE-KMS should behave the same as SSE-KMS - use the provided key or create one automatically
|
|
349
|
-
// Since Bucket only knows about SSE, we repeat the logic for CSE-KMS at the Table level.
|
|
350
|
-
encryptionKey = new kms.Key(table, 'Key');
|
|
351
|
-
}
|
|
352
|
-
else {
|
|
353
|
-
encryptionKey = props.encryptionKey;
|
|
354
|
-
}
|
|
355
|
-
// create the bucket if none was provided
|
|
356
|
-
if (!bucket) {
|
|
357
|
-
if (encryption === TableEncryption.CLIENT_SIDE_KMS) {
|
|
358
|
-
// The `encryptionKey` here is used for client-side encryption (granted to
|
|
359
|
-
// principals via the grant* methods), not for the bucket's SSE. The bucket
|
|
360
|
-
// still gets server-side encryption at rest as defense in depth.
|
|
361
|
-
bucket = new s3.Bucket(table, 'Bucket', {
|
|
362
|
-
encryption: encryptionMappings[encryption],
|
|
363
|
-
enforceSSL: true,
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
|
-
else {
|
|
367
|
-
bucket = new s3.Bucket(table, 'Bucket', {
|
|
368
|
-
encryption: encryptionMappings[encryption],
|
|
369
|
-
encryptionKey,
|
|
370
|
-
enforceSSL: true,
|
|
371
|
-
});
|
|
372
|
-
encryptionKey = bucket.encryptionKey;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
return {
|
|
376
|
-
bucket,
|
|
377
|
-
encryption,
|
|
378
|
-
encryptionKey,
|
|
379
|
-
};
|
|
380
|
-
}
|
|
381
429
|
function renderColumns(columns) {
|
|
382
430
|
if (columns === undefined) {
|
|
383
431
|
return undefined;
|
|
@@ -390,4 +438,4 @@ function renderColumns(columns) {
|
|
|
390
438
|
};
|
|
391
439
|
});
|
|
392
440
|
}
|
|
393
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMtdGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzMy10YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBb0Y7QUFDcEYsbURBQWdEO0FBRWhELHlEQUEyQztBQUMzQyx1REFBeUM7QUFDekMsNEVBQTRFO0FBQzVFLDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFJMUUsNkNBQXlDO0FBRXpDOzs7O0dBSUc7QUFDSCxJQUFZLGVBMEJYO0FBMUJELFdBQVksZUFBZTtJQUN6Qjs7OztPQUlHO0lBQ0gsd0NBQXFCLENBQUE7SUFFckI7Ozs7T0FJRztJQUNILGtDQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILGtEQUErQixDQUFBO0lBRS9COzs7O09BSUc7SUFDSCw4Q0FBMkIsQ0FBQTtBQUM3QixDQUFDLEVBMUJXLGVBQWUsK0JBQWYsZUFBZSxRQTBCMUI7QUE0Q0Q7OztHQUdHO0lBRVUsT0FBTzs0QkFEbkIsb0NBQWtCOzs7O3NCQUNVLHNCQUFTOzs7Ozs7O3VCQUFqQixTQUFRLFdBQVM7Ozs7eUNBMkduQyxpQ0FBYzt3Q0FRZCxpQ0FBYztxQ0FlZCxJQUFBLGtDQUFjLEdBQUU7c0NBY2hCLElBQUEsa0NBQWMsR0FBRTswQ0FjaEIsSUFBQSxrQ0FBYyxHQUFFO1lBbERqQixrTEFBVyxTQUFTLDZEQUVuQjtZQU1ELCtLQUFXLFFBQVEsNkRBTWxCO1lBU0QsOEtBQU8sU0FBUyw2REFLZjtZQVNELGlMQUFPLFVBQVUsNkRBS2hCO1lBU0QsNkxBQU8sY0FBYyw2REFLcEI7WUFwS0gsNktBb0xDOzs7OztRQW5MQyxzQ0FBc0M7UUFDL0IsTUFBTSxDQUFVLHFCQUFxQixHQUFXLGlDQUFpQyxDQUFDO1FBRWpGLFFBQVEsR0FKTCxtREFBTyxDQUlTO1FBRTNCOztXQUVHO1FBQ2EsTUFBTSxDQUFhO1FBRW5DOztX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QUk7YUFDakIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUU7Z0JBQ3RDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxVQUFVLENBQUM7Z0JBQzFDLGFBQWE7Z0JBQ2IsVUFBVSxFQUFFLElBQUk7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsTUFBTTtRQUNOLFVBQVU7UUFDVixhQUFhO0tBQ2QsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxPQUFrQjtJQUN2QyxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzFCLE9BQU87WUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVztZQUM3QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87U0FDeEIsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ2ZuVGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgdHlwZSAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBtZW1vaXplZEdldHRlciwgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSwgTWV0aG9kTWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgQ29sdW1uIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHR5cGUgeyBQYXJ0aXRpb25JbmRleCwgVGFibGVCYXNlUHJvcHMgfSBmcm9tICcuL3RhYmxlLWJhc2UnO1xuaW1wb3J0IHsgVGFibGVCYXNlIH0gZnJvbSAnLi90YWJsZS1iYXNlJztcblxuLyoqXG4gKiBFbmNyeXB0aW9uIG9wdGlvbnMgZm9yIGEgVGFibGUuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9lbmNyeXB0aW9uLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gVGFibGVFbmNyeXB0aW9uIHtcbiAgLyoqXG4gICAqIFNlcnZlciBzaWRlIGVuY3J5cHRpb24gKFNTRSkgd2l0aCBhbiBBbWF6b24gUzMtbWFuYWdlZCBrZXkuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvVXNpbmdTZXJ2ZXJTaWRlRW5jcnlwdGlvbi5odG1sXG4gICAqL1xuICBTM19NQU5BR0VEID0gJ1NTRS1TMycsXG5cbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIGVuY3J5cHRpb24gKFNTRSkgd2l0aCBhbiBBV1MgS01TIGtleSBtYW5hZ2VkIGJ5IHRoZSBhY2NvdW50IG93bmVyLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L1VzaW5nS01TRW5jcnlwdGlvbi5odG1sXG4gICAqL1xuICBLTVMgPSAnU1NFLUtNUycsXG5cbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIGVuY3J5cHRpb24gKFNTRSkgd2l0aCBhbiBBV1MgS01TIGtleSBtYW5hZ2VkIGJ5IHRoZSBLTVMgc2VydmljZS5cbiAgICovXG4gIEtNU19NQU5BR0VEID0gJ1NTRS1LTVMtTUFOQUdFRCcsXG5cbiAgLyoqXG4gICAqIENsaWVudC1zaWRlIGVuY3J5cHRpb24gKENTRSkgd2l0aCBhbiBBV1MgS01TIGtleSBtYW5hZ2VkIGJ5IHRoZSBhY2NvdW50IG93bmVyLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L1VzaW5nQ2xpZW50U2lkZUVuY3J5cHRpb24uaHRtbFxuICAgKi9cbiAgQ0xJRU5UX1NJREVfS01TID0gJ0NTRS1LTVMnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFMzVGFibGVQcm9wcyBleHRlbmRzIFRhYmxlQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIFMzIGJ1Y2tldCBpbiB3aGljaCB0byBzdG9yZSBkYXRhLlxuICAgKlxuICAgKiBAZGVmYXVsdCBvbmUgaXMgY3JlYXRlZCBmb3IgeW91XG4gICAqL1xuICByZWFkb25seSBidWNrZXQ/OiBzMy5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBTMyBwcmVmaXggdW5kZXIgd2hpY2ggdGFibGUgb2JqZWN0cyBhcmUgc3RvcmVkLlxuICAgKlxuICAgKiBXaGVuIHRoZSB0YWJsZSBzaGFyZXMgYSBidWNrZXQgd2l0aCBvdGhlciB0YWJsZXMgb3IgY29uc3VtZXJzLCBzZXQgdGhpcyBzb1xuICAgKiB0aGF0IHRoZSBgZ3JhbnQqYCBtZXRob2RzIHNjb3BlIFMzIGFjY2VzcyB0byB0aGlzIHRhYmxlJ3MgZGF0YS4gV2l0aG91dCBhXG4gICAqIHByZWZpeCwgdGhvc2UgZ3JhbnRzIGNvdmVyIHRoZSBlbnRpcmUgYnVja2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHByZWZpeC4gVGhlIGRhdGEgd2lsbCBiZSBzdG9yZWQgdW5kZXIgdGhlIHJvb3Qgb2YgdGhlIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IHMzUHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiBlbmNyeXB0aW9uIHRvIHNlY3VyZSB0aGUgZGF0YSB3aXRoLlxuICAgKlxuICAgKiBZb3UgY2FuIG9ubHkgcHJvdmlkZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIG5vdCBleHBsaWNpdGx5IHBhc3NpbmcgaW4gYSBidWNrZXQuXG4gICAqXG4gICAqIElmIHlvdSBjaG9vc2UgYFNTRS1LTVNgLCB5b3UgKmNhbiogcHJvdmlkZSBhbiB1bi1tYW5hZ2VkIEtNUyBrZXkgd2l0aCBgZW5jcnlwdGlvbktleWAuXG4gICAqIElmIHlvdSBjaG9vc2UgYENTRS1LTVNgLCB5b3UgKm1heSogcHJvdmlkZSBhbiB1bi1tYW5hZ2VkIEtNUyBrZXkgd2l0aCBgZW5jcnlwdGlvbktleWA7XG4gICAqIG9uZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgaWYgb21pdHRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogVGFibGVFbmNyeXB0aW9uO1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBLTVMga2V5IHRvIHVzZSBmb3IgYnVja2V0IGVuY3J5cHRpb24uXG4gICAqXG4gICAqIFRoZSBgZW5jcnlwdGlvbmAgcHJvcGVydHkgbXVzdCBiZSBgU1NFLUtNU2Agb3IgYENTRS1LTVNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBrZXkgaXMgbWFuYWdlZCBieSBLTVMuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG59XG5cbi8qKlxuICogQSBHbHVlIHRhYmxlIHRoYXQgdGFyZ2V0cyBhIFMzIGRhdGFzZXQuXG4gKiBAcmVzb3VyY2UgQVdTOjpHbHVlOjpUYWJsZVxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgUzNUYWJsZSBleHRlbmRzIFRhYmxlQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWdsdWUtYWxwaGEuUzNUYWJsZSc7XG5cbiAgcHJpdmF0ZSByZXNvdXJjZTogQ2ZuVGFibGU7XG5cbiAgLyoqXG4gICAqIFMzIGJ1Y2tldCBpbiB3aGljaCB0aGUgdGFibGUncyBkYXRhIHJlc2lkZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0OiBzMy5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBTMyBLZXkgUHJlZml4IHVuZGVyIHdoaWNoIHRoaXMgdGFibGUncyBmaWxlcyBhcmUgc3RvcmVkIGluIFMzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHMzUHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGVuY3J5cHRpb24gZW5hYmxlZCBmb3IgdGhlIHRhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb246IFRhYmxlRW5jcnlwdGlvbjtcblxuICAvKipcbiAgICogVGhlIEtNUyBrZXkgdXNlZCB0byBzZWN1cmUgdGhlIGRhdGEgaWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgQ1NFLUtNU2Agb3IgYFNTRS1LTVNgLiBPdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogVGhpcyB0YWJsZSdzIHBhcnRpdGlvbiBpbmRleGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcnRpdGlvbkluZGV4ZXM/OiBQYXJ0aXRpb25JbmRleFtdO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0YWJsZVJlc291cmNlOiBDZm5UYWJsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZGF0YSBidWNrZXQgd2FzIHN1cHBsaWVkIGJ5IHRoZSB1c2VyIChhcyBvcHBvc2VkIHRvIGNyZWF0ZWQgYnlcbiAgICogdGhpcyBjb25zdHJ1Y3QpLiBBIHVzZXItc3VwcGxpZWQgYnVja2V0IG1heSBob2xkIGRhdGEgZm9yIG90aGVyIHRhYmxlcywgc29cbiAgICogZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSB3aG9sZSBidWNrZXQgY2FuIG92ZXItZ3JhbnQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJQcm92aWRlZEJ1Y2tldDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUzNUYWJsZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5zM1ByZWZpeCA9IHByb3BzLnMzUHJlZml4ID8/ICcnO1xuICAgIHRoaXMudXNlclByb3ZpZGVkQnVja2V0ID0gcHJvcHMuYnVja2V0ICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgeyBidWNrZXQsIGVuY3J5cHRpb24sIGVuY3J5cHRpb25LZXkgfSA9IGNyZWF0ZUJ1Y2tldCh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5idWNrZXQgPSBidWNrZXQ7XG4gICAgdGhpcy5lbmNyeXB0aW9uID0gZW5jcnlwdGlvbjtcbiAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5O1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBDZm5UYWJsZSh0aGlzLCAnVGFibGUnLCB7XG4gICAgICBjYXRhbG9nSWQ6IHByb3BzLmRhdGFiYXNlLmNhdGFsb2cuY2F0YWxvZ0lkLFxuXG4gICAgICBkYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlLmRhdGFiYXNlTmFtZSxcblxuICAgICAgdGFibGVJbnB1dDoge1xuICAgICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uIHx8IGAke3RoaXMucGh5c2ljYWxOYW1lfSBnZW5lcmF0ZWQgYnkgQ0RLYCxcblxuICAgICAgICBwYXJ0aXRpb25LZXlzOiByZW5kZXJDb2x1bW5zKHByb3BzLnBhcnRpdGlvbktleXMpLFxuXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAnY2xhc3NpZmljYXRpb24nOiBwcm9wcy5kYXRhRm9ybWF0LmNsYXNzaWZpY2F0aW9uU3RyaW5nPy52YWx1ZSxcbiAgICAgICAgICAncGFydGl0aW9uX2ZpbHRlcmluZy5lbmFibGVkJzogcHJvcHMuZW5hYmxlUGFydGl0aW9uRmlsdGVyaW5nLFxuICAgICAgICAgIC4uLnRoaXMucGFyYW1ldGVycyxcbiAgICAgICAgICAvLyBNYW5hZ2VkIGtleXMgYXJlIGVtaXR0ZWQgbGFzdCBzbyBmcmVlLWZvcm0gYHBhcmFtZXRlcnNgIGNhbm5vdFxuICAgICAgICAgIC8vIHNpbGVudGx5IG92ZXJyaWRlIHRoZW0uIENvbmZsaWN0cyBhcmUgcmVqZWN0ZWQgaW4gYFRhYmxlQmFzZWAuXG4gICAgICAgICAgJ2hhc19lbmNyeXB0ZWRfZGF0YSc6IHRoaXMuaGFzRW5jcnlwdGVkRGF0YSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RvcmFnZURlc2NyaXB0b3I6IHtcbiAgICAgICAgICBsb2NhdGlvbjogYHMzOi8vJHt0aGlzLmJ1Y2tldC5idWNrZXROYW1lfS8ke3RoaXMuczNQcmVmaXh9YCxcbiAgICAgICAgICBjb21wcmVzc2VkOiB0aGlzLmNvbXByZXNzZWQsXG4gICAgICAgICAgc3RvcmVkQXNTdWJEaXJlY3RvcmllczogcHJvcHMuc3RvcmVkQXNTdWJEaXJlY3RvcmllcyA/PyBmYWxzZSxcbiAgICAgICAgICBjb2x1bW5zOiByZW5kZXJDb2x1bW5zKHByb3BzLmNvbHVtbnMpLFxuICAgICAgICAgIGlucHV0Rm9ybWF0OiBwcm9wcy5kYXRhRm9ybWF0LmlucHV0Rm9ybWF0LmNsYXNzTmFtZSxcbiAgICAgICAgICBvdXRwdXRGb3JtYXQ6IHByb3BzLmRhdGFGb3JtYXQub3V0cHV0Rm9ybWF0LmNsYXNzTmFtZSxcbiAgICAgICAgICBzZXJkZUluZm86IHtcbiAgICAgICAgICAgIHNlcmlhbGl6YXRpb25MaWJyYXJ5OiBwcm9wcy5kYXRhRm9ybWF0LnNlcmlhbGl6YXRpb25MaWJyYXJ5LmNsYXNzTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHByb3BzLnN0b3JhZ2VQYXJhbWV0ZXJzID8gcHJvcHMuc3RvcmFnZVBhcmFtZXRlcnMucmVkdWNlKChhY2MsIHBhcmFtKSA9PiB7XG4gICAgICAgICAgICBpZiAocGFyYW0ua2V5IGluIGFjYykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBEdXBsaWNhdGVTdG9yYWdlUGFyYW1ldGVyS2V5YCwgYER1cGxpY2F0ZSBzdG9yYWdlIHBhcmFtZXRlciBrZXk6ICR7cGFyYW0ua2V5fWAsIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qga2V5ID0gcGFyYW0ua2V5O1xuICAgICAgICAgICAgYWNjW2tleV0gPSBwYXJhbS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwge30gYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG5cbiAgICAgICAgdGFibGVUeXBlOiAnRVhURVJOQUxfVEFCTEUnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMudGFibGVSZXNvdXJjZSA9IHRoaXMucmVzb3VyY2U7XG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG5cbiAgICAvLyBQYXJ0aXRpb24gaW5kZXggY3JlYXRpb24gcmVsaWVzIG9uIGNyZWF0ZWQgdGFibGUuXG4gICAgaWYgKHByb3BzLnBhcnRpdGlvbkluZGV4ZXMpIHtcbiAgICAgIHRoaXMucGFydGl0aW9uSW5kZXhlcyA9IHByb3BzLnBhcnRpdGlvbkluZGV4ZXM7XG4gICAgICB0aGlzLnBhcnRpdGlvbkluZGV4ZXMuZm9yRWFjaCgoaW5kZXgpID0+IHRoaXMuYWRkUGFydGl0aW9uSW5kZXgoaW5kZXgpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTmFtZSBvZiB0aGlzIHRhYmxlLlxuICAgKi9cbiAgQG1lbW9pemVkR2V0dGVyXG4gIHB1YmxpYyBnZXQgdGFibGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VOYW1lQXR0cmlidXRlKHRoaXMucmVzb3VyY2UucmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBUk4gb2YgdGhpcyB0YWJsZS5cbiAgICovXG4gIEBtZW1vaXplZEdldHRlclxuICBwdWJsaWMgZ2V0IHRhYmxlQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdnbHVlJyxcbiAgICAgIHJlc291cmNlOiAndGFibGUnLFxuICAgICAgcmVzb3VyY2VOYW1lOiBgJHt0aGlzLmRhdGFiYXNlLmRhdGFiYXNlTmFtZX0vJHt0aGlzLnRhYmxlTmFtZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIHRhYmxlIGFuZCB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlZCBpbiBTMyB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgdGhlIHByaW5jaXBhbFxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgcmV0ID0gdGhpcy5ncmFudChncmFudGVlLCByZWFkUGVybWlzc2lvbnMpO1xuICAgIGlmICh0aGlzLmVuY3J5cHRpb25LZXkgJiYgdGhpcy5lbmNyeXB0aW9uID09PSBUYWJsZUVuY3J5cHRpb24uQ0xJRU5UX1NJREVfS01TKSB7IHRoaXMuZW5jcnlwdGlvbktleS5ncmFudERlY3J5cHQoZ3JhbnRlZSk7IH1cbiAgICB0aGlzLmJ1Y2tldC5ncmFudFJlYWQoZ3JhbnRlZSwgdGhpcy5nZW5lcmF0ZVMzUHJlZml4Rm9yR3JhbnQoKSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGUgdGFibGUgYW5kIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmVkIGluIFMzIHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSB0aGUgcHJpbmNpcGFsXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgZ3JhbnRXcml0ZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgcmV0ID0gdGhpcy5ncmFudChncmFudGVlLCB3cml0ZVBlcm1pc3Npb25zKTtcbiAgICBpZiAodGhpcy5lbmNyeXB0aW9uS2V5ICYmIHRoaXMuZW5jcnlwdGlvbiA9PT0gVGFibGVFbmNyeXB0aW9uLkNMSUVOVF9TSURFX0tNUykgeyB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0KGdyYW50ZWUpOyB9XG4gICAgdGhpcy5idWNrZXQuZ3JhbnRXcml0ZShncmFudGVlLCB0aGlzLmdlbmVyYXRlUzNQcmVmaXhGb3JHcmFudCgpKTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgYW5kIHdyaXRlIHBlcm1pc3Npb25zIHRvIHRoZSB0YWJsZSBhbmQgdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZWQgaW4gUzMgdG8gYW4gSUFNIHByaW5jaXBhbC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIHRoZSBwcmluY2lwYWxcbiAgICovXG4gIEBNZXRob2RNZXRhZGF0YSgpXG4gIHB1YmxpYyBncmFudFJlYWRXcml0ZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgcmV0ID0gdGhpcy5ncmFudChncmFudGVlLCBbLi4ucmVhZFBlcm1pc3Npb25zLCAuLi53cml0ZVBlcm1pc3Npb25zXSk7XG4gICAgaWYgKHRoaXMuZW5jcnlwdGlvbktleSAmJiB0aGlzLmVuY3J5cHRpb24gPT09IFRhYmxlRW5jcnlwdGlvbi5DTElFTlRfU0lERV9LTVMpIHsgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQoZ3JhbnRlZSk7IH1cbiAgICB0aGlzLmJ1Y2tldC5ncmFudFJlYWRXcml0ZShncmFudGVlLCB0aGlzLmdlbmVyYXRlUzNQcmVmaXhGb3JHcmFudCgpKTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdlbmVyYXRlUzNQcmVmaXhGb3JHcmFudCgpIHtcbiAgICAvLyBXaGVuIHRoZSB1c2VyIHN1cHBsaWVkIHRoZWlyIG93biBidWNrZXQgYW5kIGRpZCBub3Qgc2NvcGUgdGhlIHRhYmxlIHRvIGFcbiAgICAvLyBwcmVmaXgsIHRoZSBncmFudCBjb3ZlcnMgZXZlcnkgb2JqZWN0IGluIHRoZSBidWNrZXQgLSB3aGljaCBtYXkgaW5jbHVkZVxuICAgIC8vIGRhdGEgb3duZWQgYnkgb3RoZXIgdGFibGVzIG9yIGNvbnN1bWVycyBzaGFyaW5nIHRoYXQgYnVja2V0LiBXYXJuIHNvIHRoZVxuICAgIC8vIG92ZXItZ3JhbnQgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSByYXRoZXIgdGhhbiBhIHNpbGVudCBzdXJwcmlzZS5cbiAgICBpZiAodGhpcy51c2VyUHJvdmlkZWRCdWNrZXQgJiYgdGhpcy5zM1ByZWZpeCA9PT0gJycpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgICAgICAgJ0Bhd3MtY2RrL2F3cy1nbHVlLWFscGhhOmdyYW50U2NvcGVkVG9XaG9sZUJ1Y2tldCcsXG4gICAgICAgICdncmFudGluZyBhY2Nlc3MgdG8gdGhlIGVudGlyZSBkYXRhIGJ1Y2tldCBiZWNhdXNlIGBzM1ByZWZpeGAgaXMgZW1wdHkgYW5kIGEgc2hhcmVkIGJ1Y2tldCB3YXMgcHJvdmlkZWQ7ICcgK1xuICAgICAgICAgICdzZXQgYHMzUHJlZml4YCB0byBzY29wZSBncmFudHMgdG8gdGhpcyB0YWJsZVxcJ3MgZGF0YSBhbmQgYXZvaWQgZ3JhbnRpbmcgYWNjZXNzIHRvIG90aGVyIHRhYmxlcyBzaGFyaW5nIHRoZSBidWNrZXQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnMzUHJlZml4ICsgJyonO1xuICB9XG59XG5cbmNvbnN0IHJlYWRQZXJtaXNzaW9ucyA9IFtcbiAgJ2dsdWU6QmF0Y2hHZXRQYXJ0aXRpb24nLFxuICAnZ2x1ZTpHZXRQYXJ0aXRpb24nLFxuICAnZ2x1ZTpHZXRQYXJ0aXRpb25zJyxcbiAgJ2dsdWU6R2V0VGFibGUnLFxuICAnZ2x1ZTpHZXRUYWJsZXMnLFxuICAnZ2x1ZTpHZXRUYWJsZVZlcnNpb24nLFxuICAnZ2x1ZTpHZXRUYWJsZVZlcnNpb25zJyxcbl07XG5cbmNvbnN0IHdyaXRlUGVybWlzc2lvbnMgPSBbXG4gICdnbHVlOkJhdGNoQ3JlYXRlUGFydGl0aW9uJyxcbiAgJ2dsdWU6QmF0Y2hEZWxldGVQYXJ0aXRpb24nLFxuICAnZ2x1ZTpDcmVhdGVQYXJ0aXRpb24nLFxuICAnZ2x1ZTpEZWxldGVQYXJ0aXRpb24nLFxuICAnZ2x1ZTpVcGRhdGVQYXJ0aXRpb24nLFxuXTtcblxuLy8gbWFwIFRhYmxlRW5jcnlwdGlvbiB0byBidWNrZXQncyBTU0UgY29uZmlndXJhdGlvbiAoczMuQnVja2V0RW5jcnlwdGlvbilcbmNvbnN0IGVuY3J5cHRpb25NYXBwaW5ncyA9IHtcbiAgW1RhYmxlRW5jcnlwdGlvbi5TM19NQU5BR0VEXTogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICBbVGFibGVFbmNyeXB0aW9uLktNU19NQU5BR0VEXTogczMuQnVja2V0RW5jcnlwdGlvbi5LTVNfTUFOQUdFRCxcbiAgW1RhYmxlRW5jcnlwdGlvbi5LTVNdOiBzMy5CdWNrZXRFbmNyeXB0aW9uLktNUyxcbiAgW1RhYmxlRW5jcnlwdGlvbi5DTElFTlRfU0lERV9LTVNdOiBzMy5CdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG59O1xuXG4vLyBjcmVhdGUgdGhlIGJ1Y2tldCB0byBzdG9yZSBhIHRhYmxlJ3MgZGF0YSBkZXBlbmRpbmcgb24gdGhlIGBlbmNyeXB0aW9uYCBhbmQgYGVuY3J5cHRpb25LZXlgIHByb3BlcnRpZXMuXG5mdW5jdGlvbiBjcmVhdGVCdWNrZXQodGFibGU6IFMzVGFibGUsIHByb3BzOiBTM1RhYmxlUHJvcHMpIHtcbiAgbGV0IGJ1Y2tldCA9IHByb3BzLmJ1Y2tldDtcblxuICBpZiAoYnVja2V0ICYmIChwcm9wcy5lbmNyeXB0aW9uICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZW5jcnlwdGlvbiAhPT0gVGFibGVFbmNyeXB0aW9uLkNMSUVOVF9TSURFX0tNUykpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEVuY3J5cHRpb25XaXRoUHJvdmlkZWRCdWNrZXRgLCAneW91IGNhbiBub3Qgc3BlY2lmeSBlbmNyeXB0aW9uIHNldHRpbmdzIGlmIHlvdSBhbHNvIHByb3ZpZGUgYSBidWNrZXQnKTtcbiAgfVxuXG4gIGNvbnN0IGVuY3J5cHRpb24gPSBwcm9wcy5lbmNyeXB0aW9uIHx8IFRhYmxlRW5jcnlwdGlvbi5TM19NQU5BR0VEO1xuXG4gIGxldCBlbmNyeXB0aW9uS2V5OiBrbXMuSUtleSB8IHVuZGVmaW5lZDtcbiAgaWYgKGVuY3J5cHRpb24gPT09IFRhYmxlRW5jcnlwdGlvbi5DTElFTlRfU0lERV9LTVMgJiYgcHJvcHMuZW5jcnlwdGlvbktleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gQ1NFLUtNUyBzaG91bGQgYmVoYXZlIHRoZSBzYW1lIGFzIFNTRS1LTVMgLSB1c2UgdGhlIHByb3ZpZGVkIGtleSBvciBjcmVhdGUgb25lIGF1dG9tYXRpY2FsbHlcbiAgICAvLyBTaW5jZSBCdWNrZXQgb25seSBrbm93cyBhYm91dCBTU0UsIHdlIHJlcGVhdCB0aGUgbG9naWMgZm9yIENTRS1LTVMgYXQgdGhlIFRhYmxlIGxldmVsLlxuICAgIGVuY3J5cHRpb25LZXkgPSBuZXcga21zLktleSh0YWJsZSwgJ0tleScpO1xuICB9IGVsc2Uge1xuICAgIGVuY3J5cHRpb25LZXkgPSBwcm9wcy5lbmNyeXB0aW9uS2V5O1xuICB9XG5cbiAgLy8gY3JlYXRlIHRoZSBidWNrZXQgaWYgbm9uZSB3YXMgcHJvdmlkZWRcbiAgaWYgKCFidWNrZXQpIHtcbiAgICBpZiAoZW5jcnlwdGlvbiA9PT0gVGFibGVFbmNyeXB0aW9uLkNMSUVOVF9TSURFX0tNUykge1xuICAgICAgLy8gVGhlIGBlbmNyeXB0aW9uS2V5YCBoZXJlIGlzIHVzZWQgZm9yIGNsaWVudC1zaWRlIGVuY3J5cHRpb24gKGdyYW50ZWQgdG9cbiAgICAgIC8vIHByaW5jaXBhbHMgdmlhIHRoZSBncmFudCogbWV0aG9kcyksIG5vdCBmb3IgdGhlIGJ1Y2tldCdzIFNTRS4gVGhlIGJ1Y2tldFxuICAgICAgLy8gc3RpbGwgZ2V0cyBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIGF0IHJlc3QgYXMgZGVmZW5zZSBpbiBkZXB0aC5cbiAgICAgIGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGFibGUsICdCdWNrZXQnLCB7XG4gICAgICAgIGVuY3J5cHRpb246IGVuY3J5cHRpb25NYXBwaW5nc1tlbmNyeXB0aW9uXSxcbiAgICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWNrZXQgPSBuZXcgczMuQnVja2V0KHRhYmxlLCAnQnVja2V0Jywge1xuICAgICAgICBlbmNyeXB0aW9uOiBlbmNyeXB0aW9uTWFwcGluZ3NbZW5jcnlwdGlvbl0sXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGVuY3J5cHRpb25LZXkgPSBidWNrZXQuZW5jcnlwdGlvbktleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJ1Y2tldCxcbiAgICBlbmNyeXB0aW9uLFxuICAgIGVuY3J5cHRpb25LZXksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbmRlckNvbHVtbnMoY29sdW1ucz86IENvbHVtbltdKSB7XG4gIGlmIChjb2x1bW5zID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBjb2x1bW5zLm1hcChjb2x1bW4gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgIHR5cGU6IGNvbHVtbi50eXBlLmlucHV0U3RyaW5nLFxuICAgICAgY29tbWVudDogY29sdW1uLmNvbW1lbnQsXG4gICAgfTtcbiAgfSk7XG59XG4iXX0=
|
|
441
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMtdGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzMy10YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBMkQ7QUFDM0QsbURBQWdEO0FBRWhELHlEQUEyQztBQUMzQyx1REFBeUM7QUFDekMsNEVBQTRFO0FBQzVFLDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFJMUUsNkNBQXlDO0FBRXpDOzs7Ozs7R0FNRztBQUNILE1BQWEsaUJBQWlCOztJQUM1Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxTQUFTO1FBQ3JCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDOUQ7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFjO1FBQzlCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQzVEO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsVUFBVTtRQUN0QixPQUFPLElBQUksaUJBQWlCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQy9EO0lBRUQsZ0JBQWdCO0lBQ0EsaUJBQWlCLENBQXNCO0lBRXZELGdCQUFnQjtJQUNBLE9BQU8sQ0FBWTtJQUVuQyxZQUFvQixnQkFBcUMsRUFBRSxNQUFpQjtRQUMxRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7S0FDdkI7O0FBakNILDhDQWtDQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQWEsY0FBYzs7SUFDekI7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQThCOzs7Ozs7Ozs7O1FBQ3hELE9BQU8sSUFBSSxjQUFjLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0tBQ2xEO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBa0I7UUFDekMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDOUM7SUFFRCxnQkFBZ0I7SUFDQSxPQUFPLENBQWM7SUFFckMsZ0JBQWdCO0lBQ0EsV0FBVyxDQUFxQjtJQUVoRCxZQUFvQixNQUFtQixFQUFFLFVBQThCO1FBQ3JFLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO0tBQy9COztBQXRDSCx3Q0F1Q0M7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFhLHlCQUF5Qjs7SUFDcEM7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBYztRQUM5QixPQUFPLElBQUkseUJBQXlCLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDM0M7SUFFRCxnQkFBZ0I7SUFDQSxPQUFPLENBQVk7SUFFbkMsWUFBb0IsTUFBaUI7UUFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7S0FDdkI7O0FBZkgsOERBZ0JDO0FBaUNEOzs7R0FHRztJQUVVLE9BQU87NEJBRG5CLG9DQUFrQjs7OztzQkFDVSxzQkFBUzs7Ozs7Ozt1QkFBakIsU0FBUSxXQUFTOzs7O3lDQTRHbkMsaUNBQWM7d0NBUWQsaUNBQWM7cUNBZWQsSUFBQSxrQ0FBYyxHQUFFO3NDQWNoQixJQUFBLGtDQUFjLEdBQUU7MENBY2hCLElBQUEsa0NBQWMsR0FBRTtZQWxEakIsa0xBQVcsU0FBUyw2REFFbkI7WUFNRCwrS0FBVyxRQUFRLDZEQU1sQjtZQVNELDhLQUFPLFNBQVMsNkRBS2Y7WUFTRCxpTEFBTyxVQUFVLDZEQUtoQjtZQVNELDZMQUFPLGNBQWMsNkRBS3BCO1lBcktILDZLQThMQzs7Ozs7UUE3TEMsc0NBQXNDO1FBQy9CLE1BQU0sQ0FBVSxxQkFBcUIsR0FBVyxpQ0FBaUMsQ0FBQztRQUVqRixRQUFRLEdBSkwsbURBQU8sQ0FJUztRQUUzQjs7V0FFRztRQUNhLE1BQU0sQ0FBYTtRQUVuQzs7V0FFRztRQUNhLFFBQVEsQ0FBUztRQUVqQzs7Ozs7V0FLRztRQUNhLHVCQUF1QixDQUFZO1FBRW5EOztXQUVHO1FBQ2EsZ0JBQWdCLENBQW9CO1FBRWpDLGFBQWEsQ0FBVztRQUUzQzs7OztXQUlHO1FBQ2Msa0JBQWtCLENBQVU7UUFFN0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFtQjtZQUMzRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQzs7Ozs7O21EQXZDZixPQUFPOzs7O1lBd0NoQixtQ0FBbUM7WUFDbkMsSUFBQSx3Q0FBb0IsRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNyQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNoRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUM7WUFDeEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0UsSUFBSSxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDL0IsMEVBQTBFO2dCQUMxRSxzRUFBc0U7Z0JBQ3RFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBTyxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEcsQ0FBQztZQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxtQkFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7Z0JBQzFDLFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTO2dCQUUzQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO2dCQUV6QyxVQUFVLEVBQUU7b0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZO29CQUN2QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLG1CQUFtQjtvQkFFekUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO29CQUVqRCxVQUFVLEVBQUU7d0JBQ1YsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLO3dCQUM5RCw2QkFBNkIsRUFBRSxLQUFLLENBQUMsd0JBQXdCO3dCQUM3RCxHQUFHLElBQUksQ0FBQyxVQUFVO3dCQUNsQixpRUFBaUU7d0JBQ2pFLGlFQUFpRTt3QkFDakUsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtxQkFDNUM7b0JBQ0QsaUJBQWlCLEVBQUU7d0JBQ2pCLFFBQVEsRUFBRSxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQzNELFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTt3QkFDM0Isc0JBQXNCLEVBQUUsS0FBSyxDQUFDLHNCQUFzQixJQUFJLEtBQUs7d0JBQzdELE9BQU8sRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQzt3QkFDckMsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVM7d0JBQ25ELFlBQVksRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxTQUFTO3dCQUNyRCxTQUFTLEVBQUU7NEJBQ1Qsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTO3lCQUN0RTt3QkFDRCxVQUFVLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFOzRCQUNsRixJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7Z0NBQ3JCLE1BQU0sSUFBSSw2QkFBZSxDQUFDLElBQUEsc0JBQUcsRUFBQSw4QkFBOEIsRUFBRSxvQ0FBb0MsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDOzRCQUN0SCxDQUFDOzRCQUNELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7NEJBQ3RCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOzRCQUN2QixPQUFPLEdBQUcsQ0FBQzt3QkFDYixDQUFDLEVBQUUsRUFBK0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO3FCQUNoRDtvQkFFRCxTQUFTLEVBQUUsZ0JBQWdCO2lCQUM1QjthQUNGLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBRXZDLG9EQUFvRDtZQUNwRCxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMxRSxDQUFDO1NBQ0Y7UUFFRDs7V0FFRztRQUVILElBQVcsU0FBUztZQUNsQixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pEO1FBRUQ7O1dBRUc7UUFFSCxJQUFXLFFBQVE7WUFDakIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztnQkFDMUIsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7YUFDaEUsQ0FBQyxDQUFDO1NBQ0o7UUFFRDs7Ozs7V0FLRztRQUVJLFNBQVMsQ0FBQyxPQUF1QjtZQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNqRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQ3pGLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFFRDs7Ozs7V0FLRztRQUVJLFVBQVUsQ0FBQyxPQUF1QjtZQUN2QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2xELElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0JBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUFDLENBQUM7WUFDekYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7WUFDakUsT0FBTyxHQUFHLENBQUM7U0FDWjtRQUVEOzs7OztXQUtHO1FBRUksY0FBYyxDQUFDLE9BQXVCO1lBQzNDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxlQUFlLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDM0UsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQ2hHLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFFUyx3QkFBd0I7WUFDaEMsMkVBQTJFO1lBQzNFLDBFQUEwRTtZQUMxRSwyRUFBMkU7WUFDM0UsbUVBQW1FO1lBQ25FLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ3BELHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FDL0Isa0RBQWtELEVBQ2xELDBHQUEwRztvQkFDeEcsb0hBQW9ILENBQ3ZILENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztTQUM1QjtRQUVPLG1CQUFtQixDQUFDLFVBQThCO1lBQ3hELE1BQU0sR0FBRyxHQUFHLFVBQVUsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN4RCxPQUFPLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUNuQyxVQUFVLEVBQUUsR0FBRyxDQUFDLGlCQUFpQjtnQkFDakMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxPQUFPO2dCQUMxQixVQUFVLEVBQUUsSUFBSTthQUNqQixDQUFDLENBQUM7U0FDSjs7WUE3TFUsdURBQU87Ozs7O0FBQVAsMEJBQU87QUFnTXBCLE1BQU0sZUFBZSxHQUFHO0lBQ3RCLHdCQUF3QjtJQUN4QixtQkFBbUI7SUFDbkIsb0JBQW9CO0lBQ3BCLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsc0JBQXNCO0lBQ3RCLHVCQUF1QjtDQUN4QixDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBRztJQUN2QiwyQkFBMkI7SUFDM0IsMkJBQTJCO0lBQzNCLHNCQUFzQjtJQUN0QixzQkFBc0I7SUFDdEIsc0JBQXNCO0NBQ3ZCLENBQUM7QUFFRixTQUFTLGFBQWEsQ0FBQyxPQUFrQjtJQUN2QyxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzFCLE9BQU87WUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVztZQUM3QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87U0FDeEIsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDZm5UYWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1nbHVlJztcbmltcG9ydCB0eXBlICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMga21zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IG1lbW9pemVkR2V0dGVyLCBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhLCBNZXRob2RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW4gfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IFBhcnRpdGlvbkluZGV4LCBUYWJsZUJhc2VQcm9wcyB9IGZyb20gJy4vdGFibGUtYmFzZSc7XG5pbXBvcnQgeyBUYWJsZUJhc2UgfSBmcm9tICcuL3RhYmxlLWJhc2UnO1xuXG4vKipcbiAqIFNlcnZlci1zaWRlIGVuY3J5cHRpb24gZm9yIHRoZSBTMyBidWNrZXQgdGhhdCBhIG1hbmFnZWQgYFMzVGFibGVgIGNyZWF0ZXMuXG4gKlxuICogQXBwbGllcyBvbmx5IHdoZW4gdGhlIHRhYmxlIG1hbmFnZXMgaXRzIG93biBidWNrZXQgKHZpYVxuICogYFMzVGFibGVTdG9yYWdlLm1hbmFnZWRCdWNrZXRgKS4gQW4gZXhpc3RpbmcgYnVja2V0IGtlZXBzIHdoYXRldmVyIGVuY3J5cHRpb25cbiAqIGl0IHdhcyBjcmVhdGVkIHdpdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBTM1RhYmxlRW5jcnlwdGlvbiB7XG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIChTU0UtUzMpIHdpdGggYW4gQW1hem9uIFMzLW1hbmFnZWQga2V5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzM01hbmFnZWQoKTogUzNUYWJsZUVuY3J5cHRpb24ge1xuICAgIHJldHVybiBuZXcgUzNUYWJsZUVuY3J5cHRpb24oczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIChTU0UtS01TKSB3aXRoIGFuIEFXUyBLTVMga2V5IG1hbmFnZWQgYnkgdGhlIGFjY291bnQgb3duZXIuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgdGhlIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBkYXRhLiBBIGtleSBpcyBjcmVhdGVkIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGttcyhrZXk/OiBrbXMuSUtleSk6IFMzVGFibGVFbmNyeXB0aW9uIHtcbiAgICByZXR1cm4gbmV3IFMzVGFibGVFbmNyeXB0aW9uKHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TLCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIGVuY3J5cHRpb24gKFNTRS1LTVMpIHdpdGggYW4gQVdTIEtNUyBrZXkgbWFuYWdlZCBieSB0aGUgS01TIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGttc01hbmFnZWQoKTogUzNUYWJsZUVuY3J5cHRpb24ge1xuICAgIHJldHVybiBuZXcgUzNUYWJsZUVuY3J5cHRpb24oczMuQnVja2V0RW5jcnlwdGlvbi5LTVNfTUFOQUdFRCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyByZWFkb25seSBfYnVja2V0RW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbjtcblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyByZWFkb25seSBfa21zS2V5Pzoga21zLklLZXk7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihidWNrZXRFbmNyeXB0aW9uOiBzMy5CdWNrZXRFbmNyeXB0aW9uLCBrbXNLZXk/OiBrbXMuSUtleSkge1xuICAgIHRoaXMuX2J1Y2tldEVuY3J5cHRpb24gPSBidWNrZXRFbmNyeXB0aW9uO1xuICAgIHRoaXMuX2ttc0tleSA9IGttc0tleTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXJlIGFuIGBTM1RhYmxlYCBzdG9yZXMgaXRzIGRhdGEuXG4gKlxuICogVGhlIHR3byBwYXRocyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlOiBhIG1hbmFnZWQgYnVja2V0IG1heSBzcGVjaWZ5IGl0c1xuICogc2VydmVyLXNpZGUgZW5jcnlwdGlvbiwgd2hpbGUgYW4gZXhpc3RpbmcgYnVja2V0IGtlZXBzIGl0cyBvd24gZW5jcnlwdGlvbiDigJQgc29cbiAqIGFuIGVuY3J5cHRpb24gY2hvaWNlIGNhbiBuZXZlciBiZSBwYWlyZWQgd2l0aCBhIGJyaW5nLXlvdXItb3duIGJ1Y2tldC5cbiAqL1xuZXhwb3J0IGNsYXNzIFMzVGFibGVTdG9yYWdlIHtcbiAgLyoqXG4gICAqIFN0b3JlIHRoZSB0YWJsZSdzIGRhdGEgaW4gYSBidWNrZXQgY3JlYXRlZCBhbmQgbWFuYWdlZCBieSB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBlbmNyeXB0aW9uIHRoZSBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIGZvciB0aGUgY3JlYXRlZCBidWNrZXQuXG4gICAqIEBkZWZhdWx0IC0gUzMtbWFuYWdlZCAoU1NFLVMzKSBlbmNyeXB0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1hbmFnZWRCdWNrZXQoZW5jcnlwdGlvbj86IFMzVGFibGVFbmNyeXB0aW9uKTogUzNUYWJsZVN0b3JhZ2Uge1xuICAgIHJldHVybiBuZXcgUzNUYWJsZVN0b3JhZ2UodW5kZWZpbmVkLCBlbmNyeXB0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSB0aGUgdGFibGUncyBkYXRhIGluIGFuIGV4aXN0aW5nIGJ1Y2tldC4gQ0RLIGRvZXMgbm90IG1hbmFnZSB0aGVcbiAgICogYnVja2V0J3MgZW5jcnlwdGlvbi5cbiAgICpcbiAgICogVGhlIGJ1Y2tldCBjYW4gYmUgb25lIHlvdSBkb24ndCBvd24sIGltcG9ydGVkIHdpdGhcbiAgICogYEJ1Y2tldC5mcm9tQnVja2V0QXJuKClgIG9yIGBCdWNrZXQuZnJvbUJ1Y2tldEF0dHJpYnV0ZXMoKWAuIElmIHRoYXQgYnVja2V0XG4gICAqIGlzIEtNUy1lbmNyeXB0ZWQsIGltcG9ydCBpdCB3aXRoIGBCdWNrZXQuZnJvbUJ1Y2tldEF0dHJpYnV0ZXMoKWAgYW5kIHN1cHBseVxuICAgKiB0aGUgYGVuY3J5cHRpb25LZXlgIGF0dHJpYnV0ZS4gT3RoZXJ3aXNlLCBDREsgaGFzIG5vIHJlZmVyZW5jZSB0byB0aGUga2V5LFxuICAgKiB3aGljaCBtZWFucyB0aGF0IGBTM1RhYmxlLmdyYW50UmVhZCgpYC9gZ3JhbnRXcml0ZSgpYCB3aWxsIGNvcnJlY3RseSBncmFudFxuICAgKiBTMyBhY2Nlc3MgYnV0IHNpbGVudGx5IHNraXAgdGhlIEtNUyBwZXJtaXNzaW9ucyBvbiB0aGUga2V5LiBBcyBhIGNvbnNlcXVlbmNlLFxuICAgKiBhdCBydW50aW1lLCByZWFkcyBhbmQgd3JpdGVzIHdpbGwgZmFpbCB3aXRoIGFjY2VzcyBkZW5pZWQgb24gdGhlIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGJ1Y2tldCB0aGUgYnVja2V0IHRoYXQgaG9sZHMgdGhlIHRhYmxlJ3MgZGF0YS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUJ1Y2tldChidWNrZXQ6IHMzLklCdWNrZXQpOiBTM1RhYmxlU3RvcmFnZSB7XG4gICAgcmV0dXJuIG5ldyBTM1RhYmxlU3RvcmFnZShidWNrZXQsIHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyByZWFkb25seSBfYnVja2V0PzogczMuSUJ1Y2tldDtcblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyByZWFkb25seSBfZW5jcnlwdGlvbj86IFMzVGFibGVFbmNyeXB0aW9uO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoYnVja2V0PzogczMuSUJ1Y2tldCwgZW5jcnlwdGlvbj86IFMzVGFibGVFbmNyeXB0aW9uKSB7XG4gICAgdGhpcy5fYnVja2V0ID0gYnVja2V0O1xuICAgIHRoaXMuX2VuY3J5cHRpb24gPSBlbmNyeXB0aW9uO1xuICB9XG59XG5cbi8qKlxuICogQ2xpZW50LXNpZGUgZW5jcnlwdGlvbiBmb3IgYW4gYFMzVGFibGVgJ3MgZGF0YS5cbiAqXG4gKiBJbmRlcGVuZGVudCBvZiB0aGUgYnVja2V0J3Mgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiBhbmQgb2Ygd2hvIG93bnMgdGhlIGJ1Y2tldDpcbiAqIHRoZSBkYXRhIGlzIGVuY3J5cHRlZCBieSB0aGUgY2xpZW50IGJlZm9yZSBpdCBpcyB3cml0dGVuIHRvIFMzLiBXaGVuIHNldCwgdGhlXG4gKiBgZ3JhbnQqYCBtZXRob2RzIGFsc28gZ3JhbnQgdGhlIHJlbGV2YW50IEtNUyBwZXJtaXNzaW9ucyBvbiB0aGUga2V5LlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVDbGllbnRTaWRlRW5jcnlwdGlvbiB7XG4gIC8qKlxuICAgKiBDbGllbnQtc2lkZSBlbmNyeXB0aW9uIChDU0UtS01TKSB3aXRoIGFuIEFXUyBLTVMga2V5IG1hbmFnZWQgYnkgdGhlIGFjY291bnQgb3duZXIuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgdGhlIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBkYXRhLiBBIGtleSBpcyBjcmVhdGVkIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGttcyhrZXk/OiBrbXMuSUtleSk6IFRhYmxlQ2xpZW50U2lkZUVuY3J5cHRpb24ge1xuICAgIHJldHVybiBuZXcgVGFibGVDbGllbnRTaWRlRW5jcnlwdGlvbihrZXkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgX2ttc0tleT86IGttcy5JS2V5O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioa21zS2V5Pzoga21zLklLZXkpIHtcbiAgICB0aGlzLl9rbXNLZXkgPSBrbXNLZXk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTM1RhYmxlUHJvcHMgZXh0ZW5kcyBUYWJsZUJhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgdGFibGUncyBkYXRhIGlzIHN0b3JlZDogYSBidWNrZXQgY3JlYXRlZCBhbmQgbWFuYWdlZCBieSB0aGUgdGFibGUsXG4gICAqIG9yIGFuIGV4aXN0aW5nIGJ1Y2tldCB5b3UgcHJvdmlkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG1hbmFnZWQgYnVja2V0IHdpdGggUzMtbWFuYWdlZCAoU1NFLVMzKSBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlPzogUzNUYWJsZVN0b3JhZ2U7XG5cbiAgLyoqXG4gICAqIFMzIHByZWZpeCB1bmRlciB3aGljaCB0YWJsZSBvYmplY3RzIGFyZSBzdG9yZWQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhYmxlIHNoYXJlcyBhIGJ1Y2tldCB3aXRoIG90aGVyIHRhYmxlcyBvciBjb25zdW1lcnMsIHNldCB0aGlzIHNvXG4gICAqIHRoYXQgdGhlIGBncmFudCpgIG1ldGhvZHMgc2NvcGUgUzMgYWNjZXNzIHRvIHRoaXMgdGFibGUncyBkYXRhLiBXaXRob3V0IGFcbiAgICogcHJlZml4LCB0aG9zZSBncmFudHMgY292ZXIgdGhlIGVudGlyZSBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcHJlZml4LiBUaGUgZGF0YSB3aWxsIGJlIHN0b3JlZCB1bmRlciB0aGUgcm9vdCBvZiB0aGUgYnVja2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgczNQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENsaWVudC1zaWRlIGVuY3J5cHRpb24gKENTRS1LTVMpIGZvciB0aGUgdGFibGUncyBkYXRhLlxuICAgKlxuICAgKiBJbmRlcGVuZGVudCBvZiB0aGUgYnVja2V0J3Mgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiwgYW5kIHZhbGlkIHdoZXRoZXIgdGhlXG4gICAqIGJ1Y2tldCBpcyBtYW5hZ2VkIG9yIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNsaWVudC1zaWRlIGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNsaWVudFNpZGVFbmNyeXB0aW9uPzogVGFibGVDbGllbnRTaWRlRW5jcnlwdGlvbjtcbn1cblxuLyoqXG4gKiBBIEdsdWUgdGFibGUgdGhhdCB0YXJnZXRzIGEgUzMgZGF0YXNldC5cbiAqIEByZXNvdXJjZSBBV1M6OkdsdWU6OlRhYmxlXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBTM1RhYmxlIGV4dGVuZHMgVGFibGVCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZ2x1ZS1hbHBoYS5TM1RhYmxlJztcblxuICBwcml2YXRlIHJlc291cmNlOiBDZm5UYWJsZTtcblxuICAvKipcbiAgICogUzMgYnVja2V0IGluIHdoaWNoIHRoZSB0YWJsZSdzIGRhdGEgcmVzaWRlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBidWNrZXQ6IHMzLklCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFMzIEtleSBQcmVmaXggdW5kZXIgd2hpY2ggdGhpcyB0YWJsZSdzIGZpbGVzIGFyZSBzdG9yZWQgaW4gUzMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgczNQcmVmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEtNUyBrZXkgdXNlZCBmb3IgY2xpZW50LXNpZGUgZW5jcnlwdGlvbiBvZiB0aGUgdGFibGUncyBkYXRhLCBpZlxuICAgKiBgY2xpZW50U2lkZUVuY3J5cHRpb25gIHdhcyBjb25maWd1cmVkLiBPdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiBGb3Igc2VydmVyLXNpZGUgKGJ1Y2tldCkgZW5jcnlwdGlvbiwgcmVhZCBgYnVja2V0LmVuY3J5cHRpb25LZXlgIGluc3RlYWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50U2lkZUVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogVGhpcyB0YWJsZSdzIHBhcnRpdGlvbiBpbmRleGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcnRpdGlvbkluZGV4ZXM/OiBQYXJ0aXRpb25JbmRleFtdO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0YWJsZVJlc291cmNlOiBDZm5UYWJsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZGF0YSBidWNrZXQgd2FzIHN1cHBsaWVkIGJ5IHRoZSB1c2VyIChhcyBvcHBvc2VkIHRvIGNyZWF0ZWQgYnlcbiAgICogdGhpcyBjb25zdHJ1Y3QpLiBBIHVzZXItc3VwcGxpZWQgYnVja2V0IG1heSBob2xkIGRhdGEgZm9yIG90aGVyIHRhYmxlcywgc29cbiAgICogZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSB3aG9sZSBidWNrZXQgY2FuIG92ZXItZ3JhbnQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJQcm92aWRlZEJ1Y2tldDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUzNUYWJsZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5zM1ByZWZpeCA9IHByb3BzLnMzUHJlZml4ID8/ICcnO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSBwcm9wcy5zdG9yYWdlID8/IFMzVGFibGVTdG9yYWdlLm1hbmFnZWRCdWNrZXQoKTtcbiAgICB0aGlzLnVzZXJQcm92aWRlZEJ1Y2tldCA9IHN0b3JhZ2UuX2J1Y2tldCAhPT0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYnVja2V0ID0gc3RvcmFnZS5fYnVja2V0ID8/IHRoaXMuY3JlYXRlTWFuYWdlZEJ1Y2tldChzdG9yYWdlLl9lbmNyeXB0aW9uKTtcbiAgICBpZiAocHJvcHMuY2xpZW50U2lkZUVuY3J5cHRpb24pIHtcbiAgICAgIC8vIENTRS1LTVM6IHVzZSB0aGUgcHJvdmlkZWQga2V5IG9yIGNyZWF0ZSBvbmUgYXV0b21hdGljYWxseS4gVGhlIGJ1Y2tldCdzXG4gICAgICAvLyBvd24gc2VydmVyLXNpZGUgZW5jcnlwdGlvbiBpcyBpbmRlcGVuZGVudCBhbmQgY29tZXMgZnJvbSBgc3RvcmFnZWAuXG4gICAgICB0aGlzLmNsaWVudFNpZGVFbmNyeXB0aW9uS2V5ID0gcHJvcHMuY2xpZW50U2lkZUVuY3J5cHRpb24uX2ttc0tleSA/PyBuZXcga21zLktleSh0aGlzLCAnS2V5Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBDZm5UYWJsZSh0aGlzLCAnVGFibGUnLCB7XG4gICAgICBjYXRhbG9nSWQ6IHByb3BzLmRhdGFiYXNlLmNhdGFsb2cuY2F0YWxvZ0lkLFxuXG4gICAgICBkYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlLmRhdGFiYXNlTmFtZSxcblxuICAgICAgdGFibGVJbnB1dDoge1xuICAgICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uIHx8IGAke3RoaXMucGh5c2ljYWxOYW1lfSBnZW5lcmF0ZWQgYnkgQ0RLYCxcblxuICAgICAgICBwYXJ0aXRpb25LZXlzOiByZW5kZXJDb2x1bW5zKHByb3BzLnBhcnRpdGlvbktleXMpLFxuXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAnY2xhc3NpZmljYXRpb24nOiBwcm9wcy5kYXRhRm9ybWF0LmNsYXNzaWZpY2F0aW9uU3RyaW5nPy52YWx1ZSxcbiAgICAgICAgICAncGFydGl0aW9uX2ZpbHRlcmluZy5lbmFibGVkJzogcHJvcHMuZW5hYmxlUGFydGl0aW9uRmlsdGVyaW5nLFxuICAgICAgICAgIC4uLnRoaXMucGFyYW1ldGVycyxcbiAgICAgICAgICAvLyBNYW5hZ2VkIGtleXMgYXJlIGVtaXR0ZWQgbGFzdCBzbyBmcmVlLWZvcm0gYHBhcmFtZXRlcnNgIGNhbm5vdFxuICAgICAgICAgIC8vIHNpbGVudGx5IG92ZXJyaWRlIHRoZW0uIENvbmZsaWN0cyBhcmUgcmVqZWN0ZWQgaW4gYFRhYmxlQmFzZWAuXG4gICAgICAgICAgJ2hhc19lbmNyeXB0ZWRfZGF0YSc6IHRoaXMuaGFzRW5jcnlwdGVkRGF0YSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RvcmFnZURlc2NyaXB0b3I6IHtcbiAgICAgICAgICBsb2NhdGlvbjogYHMzOi8vJHt0aGlzLmJ1Y2tldC5idWNrZXROYW1lfS8ke3RoaXMuczNQcmVmaXh9YCxcbiAgICAgICAgICBjb21wcmVzc2VkOiB0aGlzLmNvbXByZXNzZWQsXG4gICAgICAgICAgc3RvcmVkQXNTdWJEaXJlY3RvcmllczogcHJvcHMuc3RvcmVkQXNTdWJEaXJlY3RvcmllcyA/PyBmYWxzZSxcbiAgICAgICAgICBjb2x1bW5zOiByZW5kZXJDb2x1bW5zKHByb3BzLmNvbHVtbnMpLFxuICAgICAgICAgIGlucHV0Rm9ybWF0OiBwcm9wcy5kYXRhRm9ybWF0LmlucHV0Rm9ybWF0LmNsYXNzTmFtZSxcbiAgICAgICAgICBvdXRwdXRGb3JtYXQ6IHByb3BzLmRhdGFGb3JtYXQub3V0cHV0Rm9ybWF0LmNsYXNzTmFtZSxcbiAgICAgICAgICBzZXJkZUluZm86IHtcbiAgICAgICAgICAgIHNlcmlhbGl6YXRpb25MaWJyYXJ5OiBwcm9wcy5kYXRhRm9ybWF0LnNlcmlhbGl6YXRpb25MaWJyYXJ5LmNsYXNzTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHByb3BzLnN0b3JhZ2VQYXJhbWV0ZXJzID8gcHJvcHMuc3RvcmFnZVBhcmFtZXRlcnMucmVkdWNlKChhY2MsIHBhcmFtKSA9PiB7XG4gICAgICAgICAgICBpZiAocGFyYW0ua2V5IGluIGFjYykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBEdXBsaWNhdGVTdG9yYWdlUGFyYW1ldGVyS2V5YCwgYER1cGxpY2F0ZSBzdG9yYWdlIHBhcmFtZXRlciBrZXk6ICR7cGFyYW0ua2V5fWAsIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qga2V5ID0gcGFyYW0ua2V5O1xuICAgICAgICAgICAgYWNjW2tleV0gPSBwYXJhbS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwge30gYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG5cbiAgICAgICAgdGFibGVUeXBlOiAnRVhURVJOQUxfVEFCTEUnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMudGFibGVSZXNvdXJjZSA9IHRoaXMucmVzb3VyY2U7XG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG5cbiAgICAvLyBQYXJ0aXRpb24gaW5kZXggY3JlYXRpb24gcmVsaWVzIG9uIGNyZWF0ZWQgdGFibGUuXG4gICAgaWYgKHByb3BzLnBhcnRpdGlvbkluZGV4ZXMpIHtcbiAgICAgIHRoaXMucGFydGl0aW9uSW5kZXhlcyA9IHByb3BzLnBhcnRpdGlvbkluZGV4ZXM7XG4gICAgICB0aGlzLnBhcnRpdGlvbkluZGV4ZXMuZm9yRWFjaCgoaW5kZXgpID0+IHRoaXMuYWRkUGFydGl0aW9uSW5kZXgoaW5kZXgpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTmFtZSBvZiB0aGlzIHRhYmxlLlxuICAgKi9cbiAgQG1lbW9pemVkR2V0dGVyXG4gIHB1YmxpYyBnZXQgdGFibGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VOYW1lQXR0cmlidXRlKHRoaXMucmVzb3VyY2UucmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBUk4gb2YgdGhpcyB0YWJsZS5cbiAgICovXG4gIEBtZW1vaXplZEdldHRlclxuICBwdWJsaWMgZ2V0IHRhYmxlQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdnbHVlJyxcbiAgICAgIHJlc291cmNlOiAndGFibGUnLFxuICAgICAgcmVzb3VyY2VOYW1lOiBgJHt0aGlzLmRhdGFiYXNlLmRhdGFiYXNlTmFtZX0vJHt0aGlzLnRhYmxlTmFtZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIHRhYmxlIGFuZCB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlZCBpbiBTMyB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgdGhlIHByaW5jaXBhbFxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgcmV0ID0gdGhpcy5ncmFudChncmFudGVlLCByZWFkUGVybWlzc2lvbnMpO1xuICAgIGlmICh0aGlzLmNsaWVudFNpZGVFbmNyeXB0aW9uS2V5KSB7IHRoaXMuY2xpZW50U2lkZUVuY3J5cHRpb25LZXkuZ3JhbnREZWNyeXB0KGdyYW50ZWUpOyB9XG4gICAgdGhpcy5idWNrZXQuZ3JhbnRSZWFkKGdyYW50ZWUsIHRoaXMuZ2VuZXJhdGVTM1ByZWZpeEZvckdyYW50KCkpO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhlIHRhYmxlIGFuZCB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlZCBpbiBTMyB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgdGhlIHByaW5jaXBhbFxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGdyYW50V3JpdGUoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIGNvbnN0IHJldCA9IHRoaXMuZ3JhbnQoZ3JhbnRlZSwgd3JpdGVQZXJtaXNzaW9ucyk7XG4gICAgaWYgKHRoaXMuY2xpZW50U2lkZUVuY3J5cHRpb25LZXkpIHsgdGhpcy5jbGllbnRTaWRlRW5jcnlwdGlvbktleS5ncmFudEVuY3J5cHQoZ3JhbnRlZSk7IH1cbiAgICB0aGlzLmJ1Y2tldC5ncmFudFdyaXRlKGdyYW50ZWUsIHRoaXMuZ2VuZXJhdGVTM1ByZWZpeEZvckdyYW50KCkpO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBhbmQgd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhlIHRhYmxlIGFuZCB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlZCBpbiBTMyB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgdGhlIHByaW5jaXBhbFxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICBjb25zdCByZXQgPSB0aGlzLmdyYW50KGdyYW50ZWUsIFsuLi5yZWFkUGVybWlzc2lvbnMsIC4uLndyaXRlUGVybWlzc2lvbnNdKTtcbiAgICBpZiAodGhpcy5jbGllbnRTaWRlRW5jcnlwdGlvbktleSkgeyB0aGlzLmNsaWVudFNpZGVFbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQoZ3JhbnRlZSk7IH1cbiAgICB0aGlzLmJ1Y2tldC5ncmFudFJlYWRXcml0ZShncmFudGVlLCB0aGlzLmdlbmVyYXRlUzNQcmVmaXhGb3JHcmFudCgpKTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdlbmVyYXRlUzNQcmVmaXhGb3JHcmFudCgpIHtcbiAgICAvLyBXaGVuIHRoZSB1c2VyIHN1cHBsaWVkIHRoZWlyIG93biBidWNrZXQgYW5kIGRpZCBub3Qgc2NvcGUgdGhlIHRhYmxlIHRvIGFcbiAgICAvLyBwcmVmaXgsIHRoZSBncmFudCBjb3ZlcnMgZXZlcnkgb2JqZWN0IGluIHRoZSBidWNrZXQgLSB3aGljaCBtYXkgaW5jbHVkZVxuICAgIC8vIGRhdGEgb3duZWQgYnkgb3RoZXIgdGFibGVzIG9yIGNvbnN1bWVycyBzaGFyaW5nIHRoYXQgYnVja2V0LiBXYXJuIHNvIHRoZVxuICAgIC8vIG92ZXItZ3JhbnQgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSByYXRoZXIgdGhhbiBhIHNpbGVudCBzdXJwcmlzZS5cbiAgICBpZiAodGhpcy51c2VyUHJvdmlkZWRCdWNrZXQgJiYgdGhpcy5zM1ByZWZpeCA9PT0gJycpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgICAgICAgJ0Bhd3MtY2RrL2F3cy1nbHVlLWFscGhhOmdyYW50U2NvcGVkVG9XaG9sZUJ1Y2tldCcsXG4gICAgICAgICdncmFudGluZyBhY2Nlc3MgdG8gdGhlIGVudGlyZSBkYXRhIGJ1Y2tldCBiZWNhdXNlIGBzM1ByZWZpeGAgaXMgZW1wdHkgYW5kIGEgc2hhcmVkIGJ1Y2tldCB3YXMgcHJvdmlkZWQ7ICcgK1xuICAgICAgICAgICdzZXQgYHMzUHJlZml4YCB0byBzY29wZSBncmFudHMgdG8gdGhpcyB0YWJsZVxcJ3MgZGF0YSBhbmQgYXZvaWQgZ3JhbnRpbmcgYWNjZXNzIHRvIG90aGVyIHRhYmxlcyBzaGFyaW5nIHRoZSBidWNrZXQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnMzUHJlZml4ICsgJyonO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNYW5hZ2VkQnVja2V0KGVuY3J5cHRpb24/OiBTM1RhYmxlRW5jcnlwdGlvbik6IHMzLkJ1Y2tldCB7XG4gICAgY29uc3QgZW5jID0gZW5jcnlwdGlvbiA/PyBTM1RhYmxlRW5jcnlwdGlvbi5zM01hbmFnZWQoKTtcbiAgICByZXR1cm4gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnQnVja2V0Jywge1xuICAgICAgZW5jcnlwdGlvbjogZW5jLl9idWNrZXRFbmNyeXB0aW9uLFxuICAgICAgZW5jcnlwdGlvbktleTogZW5jLl9rbXNLZXksXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IHJlYWRQZXJtaXNzaW9ucyA9IFtcbiAgJ2dsdWU6QmF0Y2hHZXRQYXJ0aXRpb24nLFxuICAnZ2x1ZTpHZXRQYXJ0aXRpb24nLFxuICAnZ2x1ZTpHZXRQYXJ0aXRpb25zJyxcbiAgJ2dsdWU6R2V0VGFibGUnLFxuICAnZ2x1ZTpHZXRUYWJsZXMnLFxuICAnZ2x1ZTpHZXRUYWJsZVZlcnNpb24nLFxuICAnZ2x1ZTpHZXRUYWJsZVZlcnNpb25zJyxcbl07XG5cbmNvbnN0IHdyaXRlUGVybWlzc2lvbnMgPSBbXG4gICdnbHVlOkJhdGNoQ3JlYXRlUGFydGl0aW9uJyxcbiAgJ2dsdWU6QmF0Y2hEZWxldGVQYXJ0aXRpb24nLFxuICAnZ2x1ZTpDcmVhdGVQYXJ0aXRpb24nLFxuICAnZ2x1ZTpEZWxldGVQYXJ0aXRpb24nLFxuICAnZ2x1ZTpVcGRhdGVQYXJ0aXRpb24nLFxuXTtcblxuZnVuY3Rpb24gcmVuZGVyQ29sdW1ucyhjb2x1bW5zPzogQ29sdW1uW10pIHtcbiAgaWYgKGNvbHVtbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgdHlwZTogY29sdW1uLnR5cGUuaW5wdXRTdHJpbmcsXG4gICAgICBjb21tZW50OiBjb2x1bW4uY29tbWVudCxcbiAgICB9O1xuICB9KTtcbn1cbiJdfQ==
|
package/lib/schema.d.ts
CHANGED
|
@@ -18,9 +18,19 @@ export interface Column {
|
|
|
18
18
|
readonly comment?: string;
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
21
|
+
* The type of a column in a table schema.
|
|
22
|
+
*
|
|
23
|
+
* Instances are opaque: obtain one from a `Schema` factory (for example
|
|
24
|
+
* `Schema.STRING`, `Schema.decimal(...)`, `Schema.array(...)`) or, for a type the
|
|
25
|
+
* `Schema` factories don't model, from `Schema.custom(...)`.
|
|
22
26
|
*/
|
|
23
|
-
export
|
|
27
|
+
export declare class Type {
|
|
28
|
+
/**
|
|
29
|
+
* Create a `Type` from its parts.
|
|
30
|
+
*
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
static _of(inputString: string, isPrimitive: boolean): Type;
|
|
24
34
|
/**
|
|
25
35
|
* Indicates whether this type is a primitive data type.
|
|
26
36
|
*/
|
|
@@ -29,6 +39,7 @@ export interface Type {
|
|
|
29
39
|
* Glue InputString for this type.
|
|
30
40
|
*/
|
|
31
41
|
readonly inputString: string;
|
|
42
|
+
private constructor();
|
|
32
43
|
}
|
|
33
44
|
/**
|
|
34
45
|
* @see https://docs.aws.amazon.com/athena/latest/ug/data-types.html
|
|
@@ -69,10 +80,9 @@ export declare class Schema {
|
|
|
69
80
|
/**
|
|
70
81
|
* Creates a decimal type.
|
|
71
82
|
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* @
|
|
75
|
-
* @param scale the number of digits in fractional part, the default is 0
|
|
83
|
+
* @param precision the total number of digits, between 1 and 38
|
|
84
|
+
* @param scale the number of digits in the fractional part, between 0 and 38; the default is 0
|
|
85
|
+
* @see https://docs.aws.amazon.com/athena/latest/ug/data-types.html
|
|
76
86
|
*/
|
|
77
87
|
static decimal(precision: number, scale?: number): Type;
|
|
78
88
|
/**
|
|
@@ -106,4 +116,14 @@ export declare class Schema {
|
|
|
106
116
|
* @param columns the columns of the structure.
|
|
107
117
|
*/
|
|
108
118
|
static struct(columns: Column[]): Type;
|
|
119
|
+
/**
|
|
120
|
+
* Creates a custom type from a raw Glue input string.
|
|
121
|
+
*
|
|
122
|
+
* Escape hatch for column types the other `Schema` factories don't model. The
|
|
123
|
+
* `inputString` is emitted verbatim and is not validated.
|
|
124
|
+
*
|
|
125
|
+
* @param inputString the Glue input string for the type (for example `interval_day_to_second`).
|
|
126
|
+
* @param isPrimitive whether the type is a primitive (non-nested) data type. Defaults to true.
|
|
127
|
+
*/
|
|
128
|
+
static custom(inputString: string, isPrimitive?: boolean): Type;
|
|
109
129
|
}
|