flexdataset 0.21.1 → 0.22.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.
@@ -0,0 +1,469 @@
1
+ "use strict";
2
+ /**
3
+ * Iceberg (parquet) format-version-2 table type.
4
+ *
5
+ * Iceberg partitions are transforms applied to a data column, so duplicate
6
+ * detection keys on the (source column, normalized transform) pair — `year(ts)`
7
+ * and `month(ts)` are distinct, while `day` and `DAY` collapse.
8
+ *
9
+ * The format version is encoded in the `tableType` discriminator: this engine is
10
+ * inherently v2, so a present `formatVersion` must equal `EXPECTED_FORMAT_VERSION`.
11
+ * A future `iceberg_parquet_v3` sibling subclass overrides that one constant.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.IcebergParquetV2Table = void 0;
15
+ const table_type_1 = require("../table-type");
16
+ const iceberg_1 = require("../iceberg");
17
+ /**
18
+ * Whether a string is a positive integer (digits only, value > 0). Iceberg
19
+ * table-property values are strings, so numeric checks parse the string.
20
+ *
21
+ * @param value Property value string.
22
+ * @returns True when `value` is a positive integer.
23
+ */
24
+ function isPositiveInteger(value) {
25
+ return /^\d+$/.test(value) && Number(value) > 0;
26
+ }
27
+ /**
28
+ * Whether a string is a non-negative integer (digits only, value >= 0).
29
+ *
30
+ * @param value Property value string.
31
+ * @returns True when `value` is a non-negative integer.
32
+ */
33
+ function isNonNegativeInteger(value) {
34
+ return /^\d+$/.test(value);
35
+ }
36
+ /**
37
+ * Whether a string is an integer within an inclusive range.
38
+ *
39
+ * @param value Property value string.
40
+ * @param min Inclusive lower bound.
41
+ * @param max Inclusive upper bound.
42
+ * @returns True when `value` is an integer in `[min, max]`.
43
+ */
44
+ function isIntegerInRange(value, min, max) {
45
+ if (!/^\d+$/.test(value)) {
46
+ return false;
47
+ }
48
+ const parsed = Number(value);
49
+ return parsed >= min && parsed <= max;
50
+ }
51
+ /** Iceberg (parquet) format-version-2 table. */
52
+ class IcebergParquetV2Table extends table_type_1.TableTypeBase {
53
+ /**
54
+ * The Iceberg format version this engine pins to. A present `formatVersion`
55
+ * must equal this. A future v3 sibling subclass overrides this single value.
56
+ */
57
+ static EXPECTED_FORMAT_VERSION = 2;
58
+ /**
59
+ * Validate a column type against the Iceberg v0 type registry.
60
+ *
61
+ * @param type Type string from a column definition.
62
+ * @returns True when the type is a valid Iceberg type.
63
+ */
64
+ isValidColumnType(type) {
65
+ return (0, iceberg_1.isValidIcebergType)(type);
66
+ }
67
+ /**
68
+ * Iceberg partition rules.
69
+ *
70
+ * Emits: `NO_DUPLICATE_PARTITIONS` (keyed by `${name} ${transformKind}:${param}`,
71
+ * falling back to a lowercased trim of the raw transform when it doesn't
72
+ * parse, so whitespace / case variants of the same transform collapse),
73
+ * `ICEBERG_TRANSFORM_SOURCE_EXISTS`, `ICEBERG_TRANSFORM_VALID`, and
74
+ * `ICEBERG_TRANSFORM_SOURCE_TYPE_LEGAL`.
75
+ *
76
+ * @returns Every partition-related violation.
77
+ */
78
+ partitionViolations() {
79
+ const violations = [];
80
+ const { partitions, } = this.definition;
81
+ const seen = new Set();
82
+ partitions.forEach((partition, index) => {
83
+ const key = this.partitionKey(partition);
84
+ if (seen.has(key)) {
85
+ violations.push(this.violation({
86
+ level: 'error',
87
+ code: 'NO_DUPLICATE_PARTITIONS',
88
+ field: `partitions[${index}]`,
89
+ message: `duplicate partition: "${partition.name}" with transform "${partition.type}"`,
90
+ }));
91
+ }
92
+ seen.add(key);
93
+ });
94
+ partitions.forEach((partition, index) => {
95
+ const sourceColumn = this.definition.columns.find((column) => column.name === partition.name);
96
+ if (sourceColumn === undefined) {
97
+ violations.push(this.violation({
98
+ level: 'error',
99
+ code: 'ICEBERG_TRANSFORM_SOURCE_EXISTS',
100
+ field: `partitions[${index}].name`,
101
+ message: `Iceberg partition source column "${partition.name}" is not defined in columns`,
102
+ }));
103
+ return;
104
+ }
105
+ const transform = (0, iceberg_1.parseIcebergTransform)(partition.type);
106
+ if (transform === null) {
107
+ violations.push(this.violation({
108
+ level: 'error',
109
+ code: 'ICEBERG_TRANSFORM_VALID',
110
+ field: `partitions[${index}].type`,
111
+ message: `"${partition.type}" is not a valid Iceberg partition transform`,
112
+ }));
113
+ return;
114
+ }
115
+ const sourceType = (0, iceberg_1.parseIcebergType)(sourceColumn.type);
116
+ if (sourceType !== null && !(0, iceberg_1.transformLegalOnType)(transform, sourceType)) {
117
+ violations.push(this.violation({
118
+ level: 'error',
119
+ code: 'ICEBERG_TRANSFORM_SOURCE_TYPE_LEGAL',
120
+ field: `partitions[${index}].type`,
121
+ message: `transform "${partition.type}" is not legal on `
122
+ + `column "${partition.name}" of type "${sourceColumn.type}"`,
123
+ }));
124
+ }
125
+ });
126
+ return violations;
127
+ }
128
+ /// Table-property keys whose value must come from a closed set.
129
+ static ENUM_PROPERTIES = {
130
+ 'write.format.default': [
131
+ 'parquet',
132
+ 'avro',
133
+ 'orc',
134
+ ],
135
+ 'write.parquet.compression-codec': [
136
+ 'zstd',
137
+ 'gzip',
138
+ 'snappy',
139
+ 'lz4',
140
+ 'none',
141
+ ],
142
+ 'write.avro.compression-codec': [
143
+ 'gzip',
144
+ 'zstd',
145
+ 'snappy',
146
+ 'uncompressed',
147
+ ],
148
+ 'write.orc.compression-codec': [
149
+ 'zstd',
150
+ 'lz4',
151
+ 'lzo',
152
+ 'zlib',
153
+ 'snappy',
154
+ 'none',
155
+ ],
156
+ 'write.distribution-mode': [
157
+ 'none',
158
+ 'hash',
159
+ 'range',
160
+ ],
161
+ 'write.metadata.compression-codec': [
162
+ 'none',
163
+ 'gzip',
164
+ ],
165
+ };
166
+ /// Table-property keys whose value must be a positive integer.
167
+ static POSITIVE_INT_PROPERTIES = [
168
+ 'write.target-file-size-bytes',
169
+ 'history.expire.max-snapshot-age-ms',
170
+ 'history.expire.min-snapshots-to-keep',
171
+ 'history.expire.max-ref-age-ms',
172
+ 'write.metadata.previous-versions-max',
173
+ 'commit.retry.min-wait-ms',
174
+ 'commit.retry.max-wait-ms',
175
+ 'commit.retry.total-timeout-ms',
176
+ ];
177
+ /// Table-property keys whose value must be a non-negative integer.
178
+ static NON_NEGATIVE_INT_PROPERTIES = [
179
+ 'commit.retry.num-retries',
180
+ ];
181
+ /// Table-property keys whose value must be an integer within an inclusive range.
182
+ static INT_RANGE_PROPERTIES = {
183
+ 'write.parquet.compression-level': {
184
+ min: 1,
185
+ max: 22,
186
+ },
187
+ };
188
+ /// Legal sort directions and null orderings.
189
+ static SORT_DIRECTIONS = new Set([
190
+ 'asc',
191
+ 'desc',
192
+ ]);
193
+ static SORT_NULL_ORDERS = new Set([
194
+ 'nulls-first',
195
+ 'nulls-last',
196
+ ]);
197
+ /**
198
+ * Iceberg engine-specific rules: format version, table properties, and sort
199
+ * order.
200
+ *
201
+ * @returns Every engine-specific violation.
202
+ */
203
+ engineSpecificViolations() {
204
+ return [
205
+ ...this.formatVersionViolations(),
206
+ ...this.tablePropertyViolations(),
207
+ ...this.sortOrderViolations(),
208
+ ...this.identifierFieldViolations(),
209
+ ];
210
+ }
211
+ /**
212
+ * Validate the Iceberg sort order.
213
+ *
214
+ * Emits `NO_DUPLICATE_SORT_FIELDS` (keyed by source column + normalized
215
+ * transform), `ICEBERG_SORT_COLUMN_EXISTS`, `ICEBERG_SORT_DIRECTION_VALID`,
216
+ * `ICEBERG_SORT_NULL_ORDER_VALID`, `ICEBERG_SORT_TRANSFORM_VALID`, and
217
+ * `ICEBERG_SORT_TRANSFORM_TYPE_LEGAL`.
218
+ *
219
+ * @returns Every sort-order violation.
220
+ */
221
+ sortOrderViolations() {
222
+ const violations = [];
223
+ const { sortOrder, } = this.definition;
224
+ const seen = new Set();
225
+ sortOrder.forEach((field, index) => {
226
+ const key = this.sortFieldKey(field);
227
+ if (seen.has(key)) {
228
+ violations.push(this.violation({
229
+ level: 'error',
230
+ code: 'NO_DUPLICATE_SORT_FIELDS',
231
+ field: `sortOrder[${index}]`,
232
+ message: `duplicate sort field: "${field.column}"`
233
+ + `${field.transform ? ` with transform "${field.transform}"` : ''}`,
234
+ }));
235
+ }
236
+ seen.add(key);
237
+ });
238
+ sortOrder.forEach((field, index) => {
239
+ if (!IcebergParquetV2Table.SORT_DIRECTIONS.has(field.direction)) {
240
+ violations.push(this.violation({
241
+ level: 'error',
242
+ code: 'ICEBERG_SORT_DIRECTION_VALID',
243
+ field: `sortOrder[${index}].direction`,
244
+ message: `sort direction "${field.direction}" must be "asc" or "desc"`,
245
+ }));
246
+ }
247
+ if (!IcebergParquetV2Table.SORT_NULL_ORDERS.has(field.nullOrder)) {
248
+ violations.push(this.violation({
249
+ level: 'error',
250
+ code: 'ICEBERG_SORT_NULL_ORDER_VALID',
251
+ field: `sortOrder[${index}].nullOrder`,
252
+ message: `sort null order "${field.nullOrder}" must be "nulls-first" or "nulls-last"`,
253
+ }));
254
+ }
255
+ const sourceColumn = this.definition.columns.find((column) => column.name === field.column);
256
+ if (sourceColumn === undefined) {
257
+ violations.push(this.violation({
258
+ level: 'error',
259
+ code: 'ICEBERG_SORT_COLUMN_EXISTS',
260
+ field: `sortOrder[${index}].column`,
261
+ message: `sort column "${field.column}" is not defined in columns`,
262
+ }));
263
+ return;
264
+ }
265
+ if (field.transform === undefined) {
266
+ return;
267
+ }
268
+ const transform = (0, iceberg_1.parseIcebergTransform)(field.transform);
269
+ if (transform === null) {
270
+ violations.push(this.violation({
271
+ level: 'error',
272
+ code: 'ICEBERG_SORT_TRANSFORM_VALID',
273
+ field: `sortOrder[${index}].transform`,
274
+ message: `"${field.transform}" is not a valid Iceberg transform`,
275
+ }));
276
+ return;
277
+ }
278
+ const sourceType = (0, iceberg_1.parseIcebergType)(sourceColumn.type);
279
+ if (sourceType !== null && !(0, iceberg_1.transformLegalOnType)(transform, sourceType)) {
280
+ violations.push(this.violation({
281
+ level: 'error',
282
+ code: 'ICEBERG_SORT_TRANSFORM_TYPE_LEGAL',
283
+ field: `sortOrder[${index}].transform`,
284
+ message: `transform "${field.transform}" is not legal on `
285
+ + `column "${field.column}" of type "${sourceColumn.type}"`,
286
+ }));
287
+ }
288
+ });
289
+ return violations;
290
+ }
291
+ /**
292
+ * Normalize a sort field into its identity key. An omitted transform and an
293
+ * explicit `identity` collapse to the same key so they count as duplicates.
294
+ *
295
+ * @param field Sort field to key.
296
+ * @returns The identity string for duplicate detection.
297
+ */
298
+ sortFieldKey(field) {
299
+ if (field.transform === undefined) {
300
+ return `${field.column} identity:`;
301
+ }
302
+ const transform = (0, iceberg_1.parseIcebergTransform)(field.transform);
303
+ const normalizedTransform = transform
304
+ ? `${transform.kind}:${transform.param ?? ''}`
305
+ : field.transform.trim().toLowerCase();
306
+ return `${field.column} ${normalizedTransform}`;
307
+ }
308
+ /// ICEBERG_FORMAT_VERSION_VALID — `formatVersion`, when set, equals the
309
+ /// version this engine pins to (2 for `iceberg_parquet_v2`).
310
+ formatVersionViolations() {
311
+ const { formatVersion, } = this.definition;
312
+ const expected = this.constructor.EXPECTED_FORMAT_VERSION;
313
+ if (formatVersion === undefined || formatVersion === expected) {
314
+ return [];
315
+ }
316
+ return [
317
+ this.violation({
318
+ level: 'error',
319
+ code: 'ICEBERG_FORMAT_VERSION_VALID',
320
+ field: 'formatVersion',
321
+ message: `Iceberg formatVersion "${formatVersion}" must be ${expected}`,
322
+ }),
323
+ ];
324
+ }
325
+ /**
326
+ * Validate the closed-domain Iceberg table properties. Keys outside the
327
+ * known set pass through unvalidated.
328
+ *
329
+ * Emits `ICEBERG_PROPERTY_ENUM_VALID`, `ICEBERG_PROPERTY_POSITIVE_INT`,
330
+ * `ICEBERG_PROPERTY_NON_NEGATIVE_INT`, `ICEBERG_PROPERTY_INT_RANGE`, and
331
+ * `ICEBERG_COMMIT_RETRY_ORDERING`.
332
+ *
333
+ * @returns Every table-property violation.
334
+ */
335
+ tablePropertyViolations() {
336
+ const violations = [];
337
+ const properties = this.definition.tableProperties;
338
+ for (const [key, value,] of Object.entries(properties)) {
339
+ const allowed = IcebergParquetV2Table.ENUM_PROPERTIES[key];
340
+ if (allowed !== undefined && !allowed.includes(value)) {
341
+ violations.push(this.violation({
342
+ level: 'error',
343
+ code: 'ICEBERG_PROPERTY_ENUM_VALID',
344
+ field: `tableProperties["${key}"]`,
345
+ message: `table property "${key}" value "${value}" must be one of: ${allowed.join(', ')}`,
346
+ }));
347
+ }
348
+ if (IcebergParquetV2Table.POSITIVE_INT_PROPERTIES.includes(key) && !isPositiveInteger(value)) {
349
+ violations.push(this.violation({
350
+ level: 'error',
351
+ code: 'ICEBERG_PROPERTY_POSITIVE_INT',
352
+ field: `tableProperties["${key}"]`,
353
+ message: `table property "${key}" value "${value}" must be a positive integer`,
354
+ }));
355
+ }
356
+ if (IcebergParquetV2Table.NON_NEGATIVE_INT_PROPERTIES.includes(key) && !isNonNegativeInteger(value)) {
357
+ violations.push(this.violation({
358
+ level: 'error',
359
+ code: 'ICEBERG_PROPERTY_NON_NEGATIVE_INT',
360
+ field: `tableProperties["${key}"]`,
361
+ message: `table property "${key}" value "${value}" must be a non-negative integer`,
362
+ }));
363
+ }
364
+ const range = IcebergParquetV2Table.INT_RANGE_PROPERTIES[key];
365
+ if (range !== undefined && !isIntegerInRange(value, range.min, range.max)) {
366
+ violations.push(this.violation({
367
+ level: 'error',
368
+ code: 'ICEBERG_PROPERTY_INT_RANGE',
369
+ field: `tableProperties["${key}"]`,
370
+ message: `table property "${key}" value "${value}" must be an integer between `
371
+ + `${range.min} and ${range.max}`,
372
+ }));
373
+ }
374
+ }
375
+ violations.push(...this.commitRetryOrderingViolations(properties));
376
+ return violations;
377
+ }
378
+ /// ICEBERG_COMMIT_RETRY_ORDERING — commit.retry waits obey
379
+ /// min-wait-ms <= max-wait-ms <= total-timeout-ms when all are positive ints.
380
+ commitRetryOrderingViolations(properties) {
381
+ const values = [
382
+ properties['commit.retry.min-wait-ms'],
383
+ properties['commit.retry.max-wait-ms'],
384
+ properties['commit.retry.total-timeout-ms'],
385
+ ];
386
+ if (!values.every((value) => value !== undefined && isPositiveInteger(value))) {
387
+ return [];
388
+ }
389
+ const [min, max, total,] = values.map(Number);
390
+ if (min <= max && max <= total) {
391
+ return [];
392
+ }
393
+ return [
394
+ this.violation({
395
+ level: 'error',
396
+ code: 'ICEBERG_COMMIT_RETRY_ORDERING',
397
+ field: 'tableProperties["commit.retry.min-wait-ms"]',
398
+ message: 'commit.retry waits must satisfy min-wait-ms <= max-wait-ms <= total-timeout-ms',
399
+ }),
400
+ ];
401
+ }
402
+ /**
403
+ * Validate Iceberg identifier fields (the row-identity / equality-delete
404
+ * key). Equality deletes are a v2 feature, which this engine inherently is;
405
+ * identifier fields must be required primitive columns that are not
406
+ * float/double.
407
+ *
408
+ * Emits `ICEBERG_IDENTIFIER_COLUMN_EXISTS`, `ICEBERG_IDENTIFIER_REQUIRED`,
409
+ * and `ICEBERG_IDENTIFIER_TYPE_PRIMITIVE`.
410
+ *
411
+ * @returns Every identifier-field violation.
412
+ */
413
+ identifierFieldViolations() {
414
+ const violations = [];
415
+ const { identifierFields, } = this.definition;
416
+ if (identifierFields.length === 0) {
417
+ return [];
418
+ }
419
+ identifierFields.forEach((name, index) => {
420
+ const field = `identifierFields[${index}]`;
421
+ const column = this.definition.columns.find((candidate) => candidate.name === name);
422
+ if (column === undefined) {
423
+ violations.push(this.violation({
424
+ level: 'error',
425
+ code: 'ICEBERG_IDENTIFIER_COLUMN_EXISTS',
426
+ field,
427
+ message: `identifier field "${name}" is not defined in columns`,
428
+ }));
429
+ return;
430
+ }
431
+ if (column.nullable === true) {
432
+ violations.push(this.violation({
433
+ level: 'error',
434
+ code: 'ICEBERG_IDENTIFIER_REQUIRED',
435
+ field,
436
+ message: `identifier field "${name}" must be required (nullable: false)`,
437
+ }));
438
+ }
439
+ const type = (0, iceberg_1.parseIcebergType)(column.type);
440
+ if (type === null || type.kind === iceberg_1.IcebergTypeKind.FLOAT || type.kind === iceberg_1.IcebergTypeKind.DOUBLE) {
441
+ violations.push(this.violation({
442
+ level: 'error',
443
+ code: 'ICEBERG_IDENTIFIER_TYPE_PRIMITIVE',
444
+ field,
445
+ message: `identifier field "${name}" must be a primitive type other than float or double`,
446
+ }));
447
+ }
448
+ });
449
+ return violations;
450
+ }
451
+ /**
452
+ * Normalize a partition into its identity key. When the transform parses,
453
+ * collapse on `${kind}:${param}` so `day` and `DAY`, `bucket[16]` and
454
+ * `bucket[ 16 ]` are the same. When the transform doesn't parse, the
455
+ * lowercased trim of the raw string is the best identity we have.
456
+ *
457
+ * @param partition Partition to key.
458
+ * @returns The identity string for duplicate detection.
459
+ */
460
+ partitionKey(partition) {
461
+ const transform = (0, iceberg_1.parseIcebergTransform)(partition.type);
462
+ const normalizedTransform = transform
463
+ ? `${transform.kind}:${transform.param ?? ''}`
464
+ : partition.type.trim().toLowerCase();
465
+ return `${partition.name} ${normalizedTransform}`;
466
+ }
467
+ }
468
+ exports.IcebergParquetV2Table = IcebergParquetV2Table;
469
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNlYmVyZy1wYXJxdWV0LXYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RhYmxlLXR5cGVzL2ljZWJlcmctcGFycXVldC12Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7O0FBT0gsOENBRXVCO0FBQ3ZCLHdDQU1vQjtBQUVwQjs7Ozs7O0dBTUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQWE7SUFDcEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxLQUFhO0lBQ3ZDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFXO0lBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixPQUFPLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUMxQyxDQUFDO0FBRUQsZ0RBQWdEO0FBQ2hELE1BQWEscUJBQXNCLFNBQVEsMEJBQWE7SUFDcEQ7OztPQUdHO0lBQ08sTUFBTSxDQUFVLHVCQUF1QixHQUFHLENBQUMsQ0FBQztJQUV0RDs7Ozs7T0FLRztJQUNJLGlCQUFpQixDQUFDLElBQVk7UUFDakMsT0FBTyxJQUFBLDRCQUFrQixFQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksbUJBQW1CO1FBQ3RC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RCxNQUFNLG1CQUFtQixHQUFHLFNBQVM7WUFDakMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRTtZQUM5QyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQ3RELENBQUM7O0FBOWNMLHNEQStjQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSWNlYmVyZyAocGFycXVldCkgZm9ybWF0LXZlcnNpb24tMiB0YWJsZSB0eXBlLlxuICpcbiAqIEljZWJlcmcgcGFydGl0aW9ucyBhcmUgdHJhbnNmb3JtcyBhcHBsaWVkIHRvIGEgZGF0YSBjb2x1bW4sIHNvIGR1cGxpY2F0ZVxuICogZGV0ZWN0aW9uIGtleXMgb24gdGhlIChzb3VyY2UgY29sdW1uLCBub3JtYWxpemVkIHRyYW5zZm9ybSkgcGFpciDigJQgYHllYXIodHMpYFxuICogYW5kIGBtb250aCh0cylgIGFyZSBkaXN0aW5jdCwgd2hpbGUgYGRheWAgYW5kIGBEQVlgIGNvbGxhcHNlLlxuICpcbiAqIFRoZSBmb3JtYXQgdmVyc2lvbiBpcyBlbmNvZGVkIGluIHRoZSBgdGFibGVUeXBlYCBkaXNjcmltaW5hdG9yOiB0aGlzIGVuZ2luZSBpc1xuICogaW5oZXJlbnRseSB2Miwgc28gYSBwcmVzZW50IGBmb3JtYXRWZXJzaW9uYCBtdXN0IGVxdWFsIGBFWFBFQ1RFRF9GT1JNQVRfVkVSU0lPTmAuXG4gKiBBIGZ1dHVyZSBgaWNlYmVyZ19wYXJxdWV0X3YzYCBzaWJsaW5nIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGF0IG9uZSBjb25zdGFudC5cbiAqL1xuXG5pbXBvcnQge1xuICAgIFBhcnRpdGlvbixcbiAgICBTb3J0RmllbGQsXG4gICAgVmlvbGF0aW9uLFxufSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge1xuICAgIFRhYmxlVHlwZUJhc2UsXG59IGZyb20gJy4uL3RhYmxlLXR5cGUnO1xuaW1wb3J0IHtcbiAgICBJY2ViZXJnVHlwZUtpbmQsXG4gICAgaXNWYWxpZEljZWJlcmdUeXBlLFxuICAgIHBhcnNlSWNlYmVyZ1RyYW5zZm9ybSxcbiAgICBwYXJzZUljZWJlcmdUeXBlLFxuICAgIHRyYW5zZm9ybUxlZ2FsT25UeXBlLFxufSBmcm9tICcuLi9pY2ViZXJnJztcblxuLyoqXG4gKiBXaGV0aGVyIGEgc3RyaW5nIGlzIGEgcG9zaXRpdmUgaW50ZWdlciAoZGlnaXRzIG9ubHksIHZhbHVlID4gMCkuIEljZWJlcmdcbiAqIHRhYmxlLXByb3BlcnR5IHZhbHVlcyBhcmUgc3RyaW5ncywgc28gbnVtZXJpYyBjaGVja3MgcGFyc2UgdGhlIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgUHJvcGVydHkgdmFsdWUgc3RyaW5nLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIGB2YWx1ZWAgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuICovXG5mdW5jdGlvbiBpc1Bvc2l0aXZlSW50ZWdlcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eXFxkKyQvLnRlc3QodmFsdWUpICYmIE51bWJlcih2YWx1ZSkgPiAwO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBzdHJpbmcgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciAoZGlnaXRzIG9ubHksIHZhbHVlID49IDApLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSBzdHJpbmcuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gYHZhbHVlYCBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICovXG5mdW5jdGlvbiBpc05vbk5lZ2F0aXZlSW50ZWdlcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eXFxkKyQvLnRlc3QodmFsdWUpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBzdHJpbmcgaXMgYW4gaW50ZWdlciB3aXRoaW4gYW4gaW5jbHVzaXZlIHJhbmdlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSBzdHJpbmcuXG4gKiBAcGFyYW0gbWluIEluY2x1c2l2ZSBsb3dlciBib3VuZC5cbiAqIEBwYXJhbSBtYXggSW5jbHVzaXZlIHVwcGVyIGJvdW5kLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciBpbiBgW21pbiwgbWF4XWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW50ZWdlckluUmFuZ2UodmFsdWU6IHN0cmluZywgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCEvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gICAgcmV0dXJuIHBhcnNlZCA+PSBtaW4gJiYgcGFyc2VkIDw9IG1heDtcbn1cblxuLyoqIEljZWJlcmcgKHBhcnF1ZXQpIGZvcm1hdC12ZXJzaW9uLTIgdGFibGUuICovXG5leHBvcnQgY2xhc3MgSWNlYmVyZ1BhcnF1ZXRWMlRhYmxlIGV4dGVuZHMgVGFibGVUeXBlQmFzZSB7XG4gICAgLyoqXG4gICAgICogVGhlIEljZWJlcmcgZm9ybWF0IHZlcnNpb24gdGhpcyBlbmdpbmUgcGlucyB0by4gQSBwcmVzZW50IGBmb3JtYXRWZXJzaW9uYFxuICAgICAqIG11c3QgZXF1YWwgdGhpcy4gQSBmdXR1cmUgdjMgc2libGluZyBzdWJjbGFzcyBvdmVycmlkZXMgdGhpcyBzaW5nbGUgdmFsdWUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBFWFBFQ1RFRF9GT1JNQVRfVkVSU0lPTiA9IDI7XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBhIGNvbHVtbiB0eXBlIGFnYWluc3QgdGhlIEljZWJlcmcgdjAgdHlwZSByZWdpc3RyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIFR5cGUgc3RyaW5nIGZyb20gYSBjb2x1bW4gZGVmaW5pdGlvbi5cbiAgICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIHR5cGUgaXMgYSB2YWxpZCBJY2ViZXJnIHR5cGUuXG4gICAgICovXG4gICAgcHVibGljIGlzVmFsaWRDb2x1bW5UeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNWYWxpZEljZWJlcmdUeXBlKHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEljZWJlcmcgcGFydGl0aW9uIHJ1bGVzLlxuICAgICAqXG4gICAgICogRW1pdHM6IGBOT19EVVBMSUNBVEVfUEFSVElUSU9OU2AgKGtleWVkIGJ5IGAke25hbWV9ICR7dHJhbnNmb3JtS2luZH06JHtwYXJhbX1gLFxuICAgICAqIGZhbGxpbmcgYmFjayB0byBhIGxvd2VyY2FzZWQgdHJpbSBvZiB0aGUgcmF3IHRyYW5zZm9ybSB3aGVuIGl0IGRvZXNuJ3RcbiAgICAgKiBwYXJzZSwgc28gd2hpdGVzcGFjZSAvIGNhc2UgdmFyaWFudHMgb2YgdGhlIHNhbWUgdHJhbnNmb3JtIGNvbGxhcHNlKSxcbiAgICAgKiBgSUNFQkVSR19UUkFOU0ZPUk1fU09VUkNFX0VYSVNUU2AsIGBJQ0VCRVJHX1RSQU5TRk9STV9WQUxJRGAsIGFuZFxuICAgICAqIGBJQ0VCRVJHX1RSQU5TRk9STV9TT1VSQ0VfVFlQRV9MRUdBTGAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBwYXJ0aXRpb24tcmVsYXRlZCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHBhcnRpdGlvblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwYXJ0aXRpb25zLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgcGFydGl0aW9ucy5mb3JFYWNoKChwYXJ0aXRpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnBhcnRpdGlvbktleShwYXJ0aXRpb24pO1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ05PX0RVUExJQ0FURV9QQVJUSVRJT05TJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkdXBsaWNhdGUgcGFydGl0aW9uOiBcIiR7cGFydGl0aW9uLm5hbWV9XCIgd2l0aCB0cmFuc2Zvcm0gXCIke3BhcnRpdGlvbi50eXBlfVwiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBwYXJ0aXRpb25zLmZvckVhY2goKHBhcnRpdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IHBhcnRpdGlvbi5uYW1lKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19UUkFOU0ZPUk1fU09VUkNFX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgcGFydGl0aW9uc1ske2luZGV4fV0ubmFtZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBJY2ViZXJnIHBhcnRpdGlvbiBzb3VyY2UgY29sdW1uIFwiJHtwYXJ0aXRpb24ubmFtZX1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gcGFyc2VJY2ViZXJnVHJhbnNmb3JtKHBhcnRpdGlvbi50eXBlKTtcbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm0gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfVFJBTlNGT1JNX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XS50eXBlYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYFwiJHtwYXJ0aXRpb24udHlwZX1cIiBpcyBub3QgYSB2YWxpZCBJY2ViZXJnIHBhcnRpdGlvbiB0cmFuc2Zvcm1gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gcGFyc2VJY2ViZXJnVHlwZShzb3VyY2VDb2x1bW4udHlwZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlVHlwZSAhPT0gbnVsbCAmJiAhdHJhbnNmb3JtTGVnYWxPblR5cGUodHJhbnNmb3JtLCBzb3VyY2VUeXBlKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19UUkFOU0ZPUk1fU09VUkNFX1RZUEVfTEVHQUwnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHBhcnRpdGlvbnNbJHtpbmRleH1dLnR5cGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdHJhbnNmb3JtIFwiJHtwYXJ0aXRpb24udHlwZX1cIiBpcyBub3QgbGVnYWwgb24gYFxuICAgICAgICAgICAgICAgICAgICAgICAgKyBgY29sdW1uIFwiJHtwYXJ0aXRpb24ubmFtZX1cIiBvZiB0eXBlIFwiJHtzb3VyY2VDb2x1bW4udHlwZX1cImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvLy8gVGFibGUtcHJvcGVydHkga2V5cyB3aG9zZSB2YWx1ZSBtdXN0IGNvbWUgZnJvbSBhIGNsb3NlZCBzZXQuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRU5VTV9QUk9QRVJUSUVTOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4gPSB7XG4gICAgICAgICd3cml0ZS5mb3JtYXQuZGVmYXVsdCc6IFtcbiAgICAgICAgICAgICdwYXJxdWV0JyxcbiAgICAgICAgICAgICdhdnJvJyxcbiAgICAgICAgICAgICdvcmMnLFxuICAgICAgICBdLFxuICAgICAgICAnd3JpdGUucGFycXVldC5jb21wcmVzc2lvbi1jb2RlYyc6IFtcbiAgICAgICAgICAgICd6c3RkJyxcbiAgICAgICAgICAgICdnemlwJyxcbiAgICAgICAgICAgICdzbmFwcHknLFxuICAgICAgICAgICAgJ2x6NCcsXG4gICAgICAgICAgICAnbm9uZScsXG4gICAgICAgIF0sXG4gICAgICAgICd3cml0ZS5hdnJvLmNvbXByZXNzaW9uLWNvZGVjJzogW1xuICAgICAgICAgICAgJ2d6aXAnLFxuICAgICAgICAgICAgJ3pzdGQnLFxuICAgICAgICAgICAgJ3NuYXBweScsXG4gICAgICAgICAgICAndW5jb21wcmVzc2VkJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLm9yYy5jb21wcmVzc2lvbi1jb2RlYyc6IFtcbiAgICAgICAgICAgICd6c3RkJyxcbiAgICAgICAgICAgICdsejQnLFxuICAgICAgICAgICAgJ2x6bycsXG4gICAgICAgICAgICAnemxpYicsXG4gICAgICAgICAgICAnc25hcHB5JyxcbiAgICAgICAgICAgICdub25lJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLmRpc3RyaWJ1dGlvbi1tb2RlJzogW1xuICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgJ2hhc2gnLFxuICAgICAgICAgICAgJ3JhbmdlJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLm1ldGFkYXRhLmNvbXByZXNzaW9uLWNvZGVjJzogW1xuICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgJ2d6aXAnLFxuICAgICAgICBdLFxuICAgIH07XG5cbiAgICAvLy8gVGFibGUtcHJvcGVydHkga2V5cyB3aG9zZSB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQT1NJVElWRV9JTlRfUFJPUEVSVElFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICAgICAgICd3cml0ZS50YXJnZXQtZmlsZS1zaXplLWJ5dGVzJyxcbiAgICAgICAgJ2hpc3RvcnkuZXhwaXJlLm1heC1zbmFwc2hvdC1hZ2UtbXMnLFxuICAgICAgICAnaGlzdG9yeS5leHBpcmUubWluLXNuYXBzaG90cy10by1rZWVwJyxcbiAgICAgICAgJ2hpc3RvcnkuZXhwaXJlLm1heC1yZWYtYWdlLW1zJyxcbiAgICAgICAgJ3dyaXRlLm1ldGFkYXRhLnByZXZpb3VzLXZlcnNpb25zLW1heCcsXG4gICAgICAgICdjb21taXQucmV0cnkubWluLXdhaXQtbXMnLFxuICAgICAgICAnY29tbWl0LnJldHJ5Lm1heC13YWl0LW1zJyxcbiAgICAgICAgJ2NvbW1pdC5yZXRyeS50b3RhbC10aW1lb3V0LW1zJyxcbiAgICBdO1xuXG4gICAgLy8vIFRhYmxlLXByb3BlcnR5IGtleXMgd2hvc2UgdmFsdWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE5PTl9ORUdBVElWRV9JTlRfUFJPUEVSVElFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICAgICAgICdjb21taXQucmV0cnkubnVtLXJldHJpZXMnLFxuICAgIF07XG5cbiAgICAvLy8gVGFibGUtcHJvcGVydHkga2V5cyB3aG9zZSB2YWx1ZSBtdXN0IGJlIGFuIGludGVnZXIgd2l0aGluIGFuIGluY2x1c2l2ZSByYW5nZS5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTlRfUkFOR0VfUFJPUEVSVElFUzogUmVjb3JkPHN0cmluZywgeyBtaW46IG51bWJlcjsgbWF4OiBudW1iZXIgfT4gPSB7XG4gICAgICAgICd3cml0ZS5wYXJxdWV0LmNvbXByZXNzaW9uLWxldmVsJzoge1xuICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgbWF4OiAyMixcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8vIExlZ2FsIHNvcnQgZGlyZWN0aW9ucyBhbmQgbnVsbCBvcmRlcmluZ3MuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU09SVF9ESVJFQ1RJT05TID0gbmV3IFNldChbXG4gICAgICAgICdhc2MnLFxuICAgICAgICAnZGVzYycsXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTT1JUX05VTExfT1JERVJTID0gbmV3IFNldChbXG4gICAgICAgICdudWxscy1maXJzdCcsXG4gICAgICAgICdudWxscy1sYXN0JyxcbiAgICBdKTtcblxuICAgIC8qKlxuICAgICAqIEljZWJlcmcgZW5naW5lLXNwZWNpZmljIHJ1bGVzOiBmb3JtYXQgdmVyc2lvbiwgdGFibGUgcHJvcGVydGllcywgYW5kIHNvcnRcbiAgICAgKiBvcmRlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGVuZ2luZS1zcGVjaWZpYyB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGVuZ2luZVNwZWNpZmljVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi50aGlzLmZvcm1hdFZlcnNpb25WaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLnRhYmxlUHJvcGVydHlWaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLnNvcnRPcmRlclZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuaWRlbnRpZmllckZpZWxkVmlvbGF0aW9ucygpLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIHRoZSBJY2ViZXJnIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgTk9fRFVQTElDQVRFX1NPUlRfRklFTERTYCAoa2V5ZWQgYnkgc291cmNlIGNvbHVtbiArIG5vcm1hbGl6ZWRcbiAgICAgKiB0cmFuc2Zvcm0pLCBgSUNFQkVSR19TT1JUX0NPTFVNTl9FWElTVFNgLCBgSUNFQkVSR19TT1JUX0RJUkVDVElPTl9WQUxJRGAsXG4gICAgICogYElDRUJFUkdfU09SVF9OVUxMX09SREVSX1ZBTElEYCwgYElDRUJFUkdfU09SVF9UUkFOU0ZPUk1fVkFMSURgLCBhbmRcbiAgICAgKiBgSUNFQkVSR19TT1JUX1RSQU5TRk9STV9UWVBFX0xFR0FMYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IHNvcnQtb3JkZXIgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgc29ydE9yZGVyVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcixcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcblxuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIHNvcnRPcmRlci5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuc29ydEZpZWxkS2V5KGZpZWxkKTtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdOT19EVVBMSUNBVEVfU09SVF9GSUVMRFMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHNvcnRPcmRlclske2luZGV4fV1gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZHVwbGljYXRlIHNvcnQgZmllbGQ6IFwiJHtmaWVsZC5jb2x1bW59XCJgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGAke2ZpZWxkLnRyYW5zZm9ybSA/IGAgd2l0aCB0cmFuc2Zvcm0gXCIke2ZpZWxkLnRyYW5zZm9ybX1cImAgOiAnJ31gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNvcnRPcmRlci5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghSWNlYmVyZ1BhcnF1ZXRWMlRhYmxlLlNPUlRfRElSRUNUSU9OUy5oYXMoZmllbGQuZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19TT1JUX0RJUkVDVElPTl9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgc29ydE9yZGVyWyR7aW5kZXh9XS5kaXJlY3Rpb25gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgc29ydCBkaXJlY3Rpb24gXCIke2ZpZWxkLmRpcmVjdGlvbn1cIiBtdXN0IGJlIFwiYXNjXCIgb3IgXCJkZXNjXCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghSWNlYmVyZ1BhcnF1ZXRWMlRhYmxlLlNPUlRfTlVMTF9PUkRFUlMuaGFzKGZpZWxkLm51bGxPcmRlcikpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfU09SVF9OVUxMX09SREVSX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBzb3J0T3JkZXJbJHtpbmRleH1dLm51bGxPcmRlcmAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBzb3J0IG51bGwgb3JkZXIgXCIke2ZpZWxkLm51bGxPcmRlcn1cIiBtdXN0IGJlIFwibnVsbHMtZmlyc3RcIiBvciBcIm51bGxzLWxhc3RcImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBmaWVsZC5jb2x1bW4pO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1NPUlRfQ09MVU1OX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgc29ydE9yZGVyWyR7aW5kZXh9XS5jb2x1bW5gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgc29ydCBjb2x1bW4gXCIke2ZpZWxkLmNvbHVtbn1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmllbGQudHJhbnNmb3JtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYXJzZUljZWJlcmdUcmFuc2Zvcm0oZmllbGQudHJhbnNmb3JtKTtcbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm0gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfU09SVF9UUkFOU0ZPUk1fVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHNvcnRPcmRlclske2luZGV4fV0udHJhbnNmb3JtYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYFwiJHtmaWVsZC50cmFuc2Zvcm19XCIgaXMgbm90IGEgdmFsaWQgSWNlYmVyZyB0cmFuc2Zvcm1gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gcGFyc2VJY2ViZXJnVHlwZShzb3VyY2VDb2x1bW4udHlwZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlVHlwZSAhPT0gbnVsbCAmJiAhdHJhbnNmb3JtTGVnYWxPblR5cGUodHJhbnNmb3JtLCBzb3VyY2VUeXBlKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19TT1JUX1RSQU5TRk9STV9UWVBFX0xFR0FMJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBzb3J0T3JkZXJbJHtpbmRleH1dLnRyYW5zZm9ybWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB0cmFuc2Zvcm0gXCIke2ZpZWxkLnRyYW5zZm9ybX1cIiBpcyBub3QgbGVnYWwgb24gYFxuICAgICAgICAgICAgICAgICAgICAgICAgKyBgY29sdW1uIFwiJHtmaWVsZC5jb2x1bW59XCIgb2YgdHlwZSBcIiR7c291cmNlQ29sdW1uLnR5cGV9XCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIGEgc29ydCBmaWVsZCBpbnRvIGl0cyBpZGVudGl0eSBrZXkuIEFuIG9taXR0ZWQgdHJhbnNmb3JtIGFuZCBhblxuICAgICAqIGV4cGxpY2l0IGBpZGVudGl0eWAgY29sbGFwc2UgdG8gdGhlIHNhbWUga2V5IHNvIHRoZXkgY291bnQgYXMgZHVwbGljYXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZCBTb3J0IGZpZWxkIHRvIGtleS5cbiAgICAgKiBAcmV0dXJucyBUaGUgaWRlbnRpdHkgc3RyaW5nIGZvciBkdXBsaWNhdGUgZGV0ZWN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgc29ydEZpZWxkS2V5KGZpZWxkOiBTb3J0RmllbGQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoZmllbGQudHJhbnNmb3JtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtmaWVsZC5jb2x1bW59IGlkZW50aXR5OmA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gcGFyc2VJY2ViZXJnVHJhbnNmb3JtKGZpZWxkLnRyYW5zZm9ybSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1cbiAgICAgICAgICAgID8gYCR7dHJhbnNmb3JtLmtpbmR9OiR7dHJhbnNmb3JtLnBhcmFtID8/ICcnfWBcbiAgICAgICAgICAgIDogZmllbGQudHJhbnNmb3JtLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gYCR7ZmllbGQuY29sdW1ufSAke25vcm1hbGl6ZWRUcmFuc2Zvcm19YDtcbiAgICB9XG5cbiAgICAvLy8gSUNFQkVSR19GT1JNQVRfVkVSU0lPTl9WQUxJRCDigJQgYGZvcm1hdFZlcnNpb25gLCB3aGVuIHNldCwgZXF1YWxzIHRoZVxuICAgIC8vLyB2ZXJzaW9uIHRoaXMgZW5naW5lIHBpbnMgdG8gKDIgZm9yIGBpY2ViZXJnX3BhcnF1ZXRfdjJgKS5cbiAgICBwcml2YXRlIGZvcm1hdFZlcnNpb25WaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZm9ybWF0VmVyc2lvbixcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgSWNlYmVyZ1BhcnF1ZXRWMlRhYmxlKS5FWFBFQ1RFRF9GT1JNQVRfVkVSU0lPTjtcbiAgICAgICAgaWYgKGZvcm1hdFZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBmb3JtYXRWZXJzaW9uID09PSBleHBlY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfRk9STUFUX1ZFUlNJT05fVkFMSUQnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZm9ybWF0VmVyc2lvbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYEljZWJlcmcgZm9ybWF0VmVyc2lvbiBcIiR7Zm9ybWF0VmVyc2lvbn1cIiBtdXN0IGJlICR7ZXhwZWN0ZWR9YCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIHRoZSBjbG9zZWQtZG9tYWluIEljZWJlcmcgdGFibGUgcHJvcGVydGllcy4gS2V5cyBvdXRzaWRlIHRoZVxuICAgICAqIGtub3duIHNldCBwYXNzIHRocm91Z2ggdW52YWxpZGF0ZWQuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgSUNFQkVSR19QUk9QRVJUWV9FTlVNX1ZBTElEYCwgYElDRUJFUkdfUFJPUEVSVFlfUE9TSVRJVkVfSU5UYCxcbiAgICAgKiBgSUNFQkVSR19QUk9QRVJUWV9OT05fTkVHQVRJVkVfSU5UYCwgYElDRUJFUkdfUFJPUEVSVFlfSU5UX1JBTkdFYCwgYW5kXG4gICAgICogYElDRUJFUkdfQ09NTUlUX1JFVFJZX09SREVSSU5HYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IHRhYmxlLXByb3BlcnR5IHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHRhYmxlUHJvcGVydHlWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuZGVmaW5pdGlvbi50YWJsZVByb3BlcnRpZXM7XG5cbiAgICAgICAgZm9yIChjb25zdCBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgXSBvZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKSkge1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IEljZWJlcmdQYXJxdWV0VjJUYWJsZS5FTlVNX1BST1BFUlRJRVNba2V5XTtcbiAgICAgICAgICAgIGlmIChhbGxvd2VkICE9PSB1bmRlZmluZWQgJiYgIWFsbG93ZWQuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1BST1BFUlRZX0VOVU1fVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHRhYmxlUHJvcGVydGllc1tcIiR7a2V5fVwiXWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB0YWJsZSBwcm9wZXJ0eSBcIiR7a2V5fVwiIHZhbHVlIFwiJHt2YWx1ZX1cIiBtdXN0IGJlIG9uZSBvZjogJHthbGxvd2VkLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChJY2ViZXJnUGFycXVldFYyVGFibGUuUE9TSVRJVkVfSU5UX1BST1BFUlRJRVMuaW5jbHVkZXMoa2V5KSAmJiAhaXNQb3NpdGl2ZUludGVnZXIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1BST1BFUlRZX1BPU0lUSVZFX0lOVCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgdGFibGVQcm9wZXJ0aWVzW1wiJHtrZXl9XCJdYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHRhYmxlIHByb3BlcnR5IFwiJHtrZXl9XCIgdmFsdWUgXCIke3ZhbHVlfVwiIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChJY2ViZXJnUGFycXVldFYyVGFibGUuTk9OX05FR0FUSVZFX0lOVF9QUk9QRVJUSUVTLmluY2x1ZGVzKGtleSkgJiYgIWlzTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19QUk9QRVJUWV9OT05fTkVHQVRJVkVfSU5UJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGB0YWJsZVByb3BlcnRpZXNbXCIke2tleX1cIl1gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdGFibGUgcHJvcGVydHkgXCIke2tleX1cIiB2YWx1ZSBcIiR7dmFsdWV9XCIgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gSWNlYmVyZ1BhcnF1ZXRWMlRhYmxlLklOVF9SQU5HRV9QUk9QRVJUSUVTW2tleV07XG4gICAgICAgICAgICBpZiAocmFuZ2UgIT09IHVuZGVmaW5lZCAmJiAhaXNJbnRlZ2VySW5SYW5nZSh2YWx1ZSwgcmFuZ2UubWluLCByYW5nZS5tYXgpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1BST1BFUlRZX0lOVF9SQU5HRScsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgdGFibGVQcm9wZXJ0aWVzW1wiJHtrZXl9XCJdYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHRhYmxlIHByb3BlcnR5IFwiJHtrZXl9XCIgdmFsdWUgXCIke3ZhbHVlfVwiIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICsgYCR7cmFuZ2UubWlufSBhbmQgJHtyYW5nZS5tYXh9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2aW9sYXRpb25zLnB1c2goLi4udGhpcy5jb21taXRSZXRyeU9yZGVyaW5nVmlvbGF0aW9ucyhwcm9wZXJ0aWVzKSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8vIElDRUJFUkdfQ09NTUlUX1JFVFJZX09SREVSSU5HIOKAlCBjb21taXQucmV0cnkgd2FpdHMgb2JleVxuICAgIC8vLyBtaW4td2FpdC1tcyA8PSBtYXgtd2FpdC1tcyA8PSB0b3RhbC10aW1lb3V0LW1zIHdoZW4gYWxsIGFyZSBwb3NpdGl2ZSBpbnRzLlxuICAgIHByaXZhdGUgY29tbWl0UmV0cnlPcmRlcmluZ1Zpb2xhdGlvbnMocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgICAgICAgcHJvcGVydGllc1snY29tbWl0LnJldHJ5Lm1pbi13YWl0LW1zJ10sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzWydjb21taXQucmV0cnkubWF4LXdhaXQtbXMnXSxcbiAgICAgICAgICAgIHByb3BlcnRpZXNbJ2NvbW1pdC5yZXRyeS50b3RhbC10aW1lb3V0LW1zJ10sXG4gICAgICAgIF07XG4gICAgICAgIGlmICghdmFsdWVzLmV2ZXJ5KCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiBpc1Bvc2l0aXZlSW50ZWdlcih2YWx1ZSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW1xuICAgICAgICAgICAgbWluLFxuICAgICAgICAgICAgbWF4LFxuICAgICAgICAgICAgdG90YWwsXG4gICAgICAgIF0gPSB2YWx1ZXMubWFwKE51bWJlcik7XG4gICAgICAgIGlmIChtaW4gPD0gbWF4ICYmIG1heCA8PSB0b3RhbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfQ09NTUlUX1JFVFJZX09SREVSSU5HJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ3RhYmxlUHJvcGVydGllc1tcImNvbW1pdC5yZXRyeS5taW4td2FpdC1tc1wiXScsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2NvbW1pdC5yZXRyeSB3YWl0cyBtdXN0IHNhdGlzZnkgbWluLXdhaXQtbXMgPD0gbWF4LXdhaXQtbXMgPD0gdG90YWwtdGltZW91dC1tcycsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBJY2ViZXJnIGlkZW50aWZpZXIgZmllbGRzICh0aGUgcm93LWlkZW50aXR5IC8gZXF1YWxpdHktZGVsZXRlXG4gICAgICoga2V5KS4gRXF1YWxpdHkgZGVsZXRlcyBhcmUgYSB2MiBmZWF0dXJlLCB3aGljaCB0aGlzIGVuZ2luZSBpbmhlcmVudGx5IGlzO1xuICAgICAqIGlkZW50aWZpZXIgZmllbGRzIG11c3QgYmUgcmVxdWlyZWQgcHJpbWl0aXZlIGNvbHVtbnMgdGhhdCBhcmUgbm90XG4gICAgICogZmxvYXQvZG91YmxlLlxuICAgICAqXG4gICAgICogRW1pdHMgYElDRUJFUkdfSURFTlRJRklFUl9DT0xVTU5fRVhJU1RTYCwgYElDRUJFUkdfSURFTlRJRklFUl9SRVFVSVJFRGAsXG4gICAgICogYW5kIGBJQ0VCRVJHX0lERU5USUZJRVJfVFlQRV9QUklNSVRJVkVgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgaWRlbnRpZmllci1maWVsZCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBpZGVudGlmaWVyRmllbGRWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgaWRlbnRpZmllckZpZWxkcyxcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcblxuICAgICAgICBpZiAoaWRlbnRpZmllckZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlkZW50aWZpZXJGaWVsZHMuZm9yRWFjaCgobmFtZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gYGlkZW50aWZpZXJGaWVsZHNbJHtpbmRleH1dYDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgICAgaWYgKGNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX0lERU5USUZJRVJfQ09MVU1OX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaWRlbnRpZmllciBmaWVsZCBcIiR7bmFtZX1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbHVtbi5udWxsYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19JREVOVElGSUVSX1JFUVVJUkVEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpZGVudGlmaWVyIGZpZWxkIFwiJHtuYW1lfVwiIG11c3QgYmUgcmVxdWlyZWQgKG51bGxhYmxlOiBmYWxzZSlgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBwYXJzZUljZWJlcmdUeXBlKGNvbHVtbi50eXBlKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBudWxsIHx8IHR5cGUua2luZCA9PT0gSWNlYmVyZ1R5cGVLaW5kLkZMT0FUIHx8IHR5cGUua2luZCA9PT0gSWNlYmVyZ1R5cGVLaW5kLkRPVUJMRSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19JREVOVElGSUVSX1RZUEVfUFJJTUlUSVZFJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpZGVudGlmaWVyIGZpZWxkIFwiJHtuYW1lfVwiIG11c3QgYmUgYSBwcmltaXRpdmUgdHlwZSBvdGhlciB0aGFuIGZsb2F0IG9yIGRvdWJsZWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgYSBwYXJ0aXRpb24gaW50byBpdHMgaWRlbnRpdHkga2V5LiBXaGVuIHRoZSB0cmFuc2Zvcm0gcGFyc2VzLFxuICAgICAqIGNvbGxhcHNlIG9uIGAke2tpbmR9OiR7cGFyYW19YCBzbyBgZGF5YCBhbmQgYERBWWAsIGBidWNrZXRbMTZdYCBhbmRcbiAgICAgKiBgYnVja2V0WyAxNiBdYCBhcmUgdGhlIHNhbWUuIFdoZW4gdGhlIHRyYW5zZm9ybSBkb2Vzbid0IHBhcnNlLCB0aGVcbiAgICAgKiBsb3dlcmNhc2VkIHRyaW0gb2YgdGhlIHJhdyBzdHJpbmcgaXMgdGhlIGJlc3QgaWRlbnRpdHkgd2UgaGF2ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJ0aXRpb24gUGFydGl0aW9uIHRvIGtleS5cbiAgICAgKiBAcmV0dXJucyBUaGUgaWRlbnRpdHkgc3RyaW5nIGZvciBkdXBsaWNhdGUgZGV0ZWN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgcGFydGl0aW9uS2V5KHBhcnRpdGlvbjogUGFydGl0aW9uKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gcGFyc2VJY2ViZXJnVHJhbnNmb3JtKHBhcnRpdGlvbi50eXBlKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRyYW5zZm9ybSA9IHRyYW5zZm9ybVxuICAgICAgICAgICAgPyBgJHt0cmFuc2Zvcm0ua2luZH06JHt0cmFuc2Zvcm0ucGFyYW0gPz8gJyd9YFxuICAgICAgICAgICAgOiBwYXJ0aXRpb24udHlwZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGAke3BhcnRpdGlvbi5uYW1lfSAke25vcm1hbGl6ZWRUcmFuc2Zvcm19YDtcbiAgICB9XG59XG4iXX0=
@@ -8,12 +8,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.createTableType = createTableType;
9
9
  const model_1 = require("../model");
10
10
  const hive_parquet_1 = require("./hive-parquet");
11
- const iceberg_parquet_1 = require("./iceberg-parquet");
11
+ const iceberg_parquet_v2_1 = require("./iceberg-parquet-v2");
12
12
  const postgres_18_1 = require("./postgres-18");
13
13
  /// Exhaustive map: every value of the `TableType` enum has a concrete subclass.
14
14
  const REGISTRY = {
15
15
  [model_1.TableType.HIVE_PARQUET]: hive_parquet_1.HiveParquetTable,
16
- [model_1.TableType.ICEBERG_PARQUET]: iceberg_parquet_1.IcebergParquetTable,
16
+ [model_1.TableType.ICEBERG_PARQUET_V2]: iceberg_parquet_v2_1.IcebergParquetV2Table,
17
17
  [model_1.TableType.POSTGRES_18]: postgres_18_1.Postgres18Table,
18
18
  };
19
19
  /**
@@ -33,4 +33,4 @@ function createTableType(fields) {
33
33
  const Constructor = REGISTRY[tableType] ?? hive_parquet_1.HiveParquetTable;
34
34
  return new Constructor(fields);
35
35
  }
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFibGUtdHlwZXMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7O0FBbUNILDBDQVVDO0FBM0NELG9DQUVrQjtBQUtsQixpREFFd0I7QUFDeEIsdURBRTJCO0FBQzNCLCtDQUV1QjtBQUt2QixnRkFBZ0Y7QUFDaEYsTUFBTSxRQUFRLEdBQTRDO0lBQ3RELENBQUMsaUJBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSwrQkFBZ0I7SUFDMUMsQ0FBQyxpQkFBUyxDQUFDLGVBQWUsQ0FBQyxFQUFFLHFDQUFtQjtJQUNoRCxDQUFDLGlCQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsNkJBQWU7Q0FDM0MsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLE1BQXVCO0lBQ25ELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBc0IsQ0FBQztJQUMzRCw0RUFBNEU7SUFDNUUsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLDZCQUE2QjtJQUM3QixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksK0JBQWdCLENBQUM7SUFDNUQsT0FBTyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZWdpc3RyeSBtYXBwaW5nIHRoZSBgdGFibGVUeXBlYCBzdHJpbmcgdG8gdGhlIGNvbmNyZXRlIGBUYWJsZVR5cGVCYXNlYFxuICogc3ViY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGl0LiBBZGRpbmcgYSBuZXcgZW5naW5lIGlzIGEgbWF0dGVyIG9mIHdyaXRpbmcgYVxuICogc3ViY2xhc3MgYW5kIGFkZGluZyBvbmUgZW50cnkgaGVyZS5cbiAqL1xuXG5pbXBvcnQge1xuICAgIFRhYmxlVHlwZSxcbn0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtcbiAgICBUYWJsZVR5cGVCYXNlLFxuICAgIFRhYmxlVHlwZUZpZWxkcyxcbn0gZnJvbSAnLi4vdGFibGUtdHlwZSc7XG5pbXBvcnQge1xuICAgIEhpdmVQYXJxdWV0VGFibGUsXG59IGZyb20gJy4vaGl2ZS1wYXJxdWV0JztcbmltcG9ydCB7XG4gICAgSWNlYmVyZ1BhcnF1ZXRUYWJsZSxcbn0gZnJvbSAnLi9pY2ViZXJnLXBhcnF1ZXQnO1xuaW1wb3J0IHtcbiAgICBQb3N0Z3JlczE4VGFibGUsXG59IGZyb20gJy4vcG9zdGdyZXMtMTgnO1xuXG4vKiogQ29uc3RydWN0b3Igc2lnbmF0dXJlIHNoYXJlZCBieSBldmVyeSBjb25jcmV0ZSB0YWJsZSBzdWJjbGFzcy4gKi9cbnR5cGUgVGFibGVUeXBlQ29uc3RydWN0b3IgPSBuZXcgKGZpZWxkczogVGFibGVUeXBlRmllbGRzKSA9PiBUYWJsZVR5cGVCYXNlO1xuXG4vLy8gRXhoYXVzdGl2ZSBtYXA6IGV2ZXJ5IHZhbHVlIG9mIHRoZSBgVGFibGVUeXBlYCBlbnVtIGhhcyBhIGNvbmNyZXRlIHN1YmNsYXNzLlxuY29uc3QgUkVHSVNUUlk6IFJlY29yZDxUYWJsZVR5cGUsIFRhYmxlVHlwZUNvbnN0cnVjdG9yPiA9IHtcbiAgICBbVGFibGVUeXBlLkhJVkVfUEFSUVVFVF06IEhpdmVQYXJxdWV0VGFibGUsXG4gICAgW1RhYmxlVHlwZS5JQ0VCRVJHX1BBUlFVRVRdOiBJY2ViZXJnUGFycXVldFRhYmxlLFxuICAgIFtUYWJsZVR5cGUuUE9TVEdSRVNfMThdOiBQb3N0Z3JlczE4VGFibGUsXG59O1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBjb25jcmV0ZSBgVGFibGVUeXBlQmFzZWAgc3ViY2xhc3MgZm9yIHRoZSBnaXZlbiBmaWVsZHMuXG4gKlxuICogQHBhcmFtIGZpZWxkcyBUaGUgbm9ybWFsaXplZCB0YWJsZSBmaWVsZHMuXG4gKiBAcmV0dXJucyBBIGNvbmNyZXRlIHRhYmxlIGluc3RhbmNlIGZvciB0aGUgZW5naW5lIG5hbWVkIGJ5IGBmaWVsZHMuZGVmaW5pdGlvbi50YWJsZVR5cGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFibGVUeXBlKGZpZWxkczogVGFibGVUeXBlRmllbGRzKTogVGFibGVUeXBlQmFzZSB7XG4gICAgY29uc3QgdGFibGVUeXBlID0gZmllbGRzLmRlZmluaXRpb24udGFibGVUeXBlIGFzIFRhYmxlVHlwZTtcbiAgICAvLy8gQW4gdW5yZWNvZ25pemVkIGB0YWJsZVR5cGVgIG9ubHkgb2NjdXJzIHdoZW4gTGF5ZXIgMSBhbHJlYWR5IGZsYWdnZWQgdGhlXG4gICAgLy8vIGZpbGU6IHN1Y2ggdGFibGVzIGFyZSBza2lwcGVkIGJ5IGludHJhLXRhYmxlIHJ1bGVzIGFuZCBza2lwcGVkIGFzIEZLXG4gICAgLy8vIHRhcmdldHMsIHNvIHRoZSBjaG9pY2UgaGVyZSBpcyBwdXJlbHkgZm9yIGNyb3NzLWZpbGUgKnJlc29sdXRpb24qICh0aGVcbiAgICAvLy8gaW5zdGFuY2Ugc3RpbGwgbmVlZHMgdG8gbGFuZCBpbiBgd29ybGQudGFibGVzYCBzbyBkZXBlbmRzT24gLyBGSyBzb3VyY2VcbiAgICAvLy8gbG9va3VwcyBkb24ndCBwcmV0ZW5kIHRoZSBmaWxlIGlzIG1pc3NpbmcpLiBgSGl2ZVBhcnF1ZXRUYWJsZWAgaXMgdGhlXG4gICAgLy8vIHJlc29sdXRpb24tb25seSBmYWxsYmFjay5cbiAgICBjb25zdCBDb25zdHJ1Y3RvciA9IFJFR0lTVFJZW3RhYmxlVHlwZV0gPz8gSGl2ZVBhcnF1ZXRUYWJsZTtcbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZpZWxkcyk7XG59XG4iXX0=
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFibGUtdHlwZXMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7O0FBbUNILDBDQVVDO0FBM0NELG9DQUVrQjtBQUtsQixpREFFd0I7QUFDeEIsNkRBRThCO0FBQzlCLCtDQUV1QjtBQUt2QixnRkFBZ0Y7QUFDaEYsTUFBTSxRQUFRLEdBQTRDO0lBQ3RELENBQUMsaUJBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSwrQkFBZ0I7SUFDMUMsQ0FBQyxpQkFBUyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsMENBQXFCO0lBQ3JELENBQUMsaUJBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSw2QkFBZTtDQUMzQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxTQUFnQixlQUFlLENBQUMsTUFBdUI7SUFDbkQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFzQixDQUFDO0lBQzNELDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEUsMEVBQTBFO0lBQzFFLDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDekUsNkJBQTZCO0lBQzdCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSwrQkFBZ0IsQ0FBQztJQUM1RCxPQUFPLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlZ2lzdHJ5IG1hcHBpbmcgdGhlIGB0YWJsZVR5cGVgIHN0cmluZyB0byB0aGUgY29uY3JldGUgYFRhYmxlVHlwZUJhc2VgXG4gKiBzdWJjbGFzcyB0aGF0IGltcGxlbWVudHMgaXQuIEFkZGluZyBhIG5ldyBlbmdpbmUgaXMgYSBtYXR0ZXIgb2Ygd3JpdGluZyBhXG4gKiBzdWJjbGFzcyBhbmQgYWRkaW5nIG9uZSBlbnRyeSBoZXJlLlxuICovXG5cbmltcG9ydCB7XG4gICAgVGFibGVUeXBlLFxufSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge1xuICAgIFRhYmxlVHlwZUJhc2UsXG4gICAgVGFibGVUeXBlRmllbGRzLFxufSBmcm9tICcuLi90YWJsZS10eXBlJztcbmltcG9ydCB7XG4gICAgSGl2ZVBhcnF1ZXRUYWJsZSxcbn0gZnJvbSAnLi9oaXZlLXBhcnF1ZXQnO1xuaW1wb3J0IHtcbiAgICBJY2ViZXJnUGFycXVldFYyVGFibGUsXG59IGZyb20gJy4vaWNlYmVyZy1wYXJxdWV0LXYyJztcbmltcG9ydCB7XG4gICAgUG9zdGdyZXMxOFRhYmxlLFxufSBmcm9tICcuL3Bvc3RncmVzLTE4JztcblxuLyoqIENvbnN0cnVjdG9yIHNpZ25hdHVyZSBzaGFyZWQgYnkgZXZlcnkgY29uY3JldGUgdGFibGUgc3ViY2xhc3MuICovXG50eXBlIFRhYmxlVHlwZUNvbnN0cnVjdG9yID0gbmV3IChmaWVsZHM6IFRhYmxlVHlwZUZpZWxkcykgPT4gVGFibGVUeXBlQmFzZTtcblxuLy8vIEV4aGF1c3RpdmUgbWFwOiBldmVyeSB2YWx1ZSBvZiB0aGUgYFRhYmxlVHlwZWAgZW51bSBoYXMgYSBjb25jcmV0ZSBzdWJjbGFzcy5cbmNvbnN0IFJFR0lTVFJZOiBSZWNvcmQ8VGFibGVUeXBlLCBUYWJsZVR5cGVDb25zdHJ1Y3Rvcj4gPSB7XG4gICAgW1RhYmxlVHlwZS5ISVZFX1BBUlFVRVRdOiBIaXZlUGFycXVldFRhYmxlLFxuICAgIFtUYWJsZVR5cGUuSUNFQkVSR19QQVJRVUVUX1YyXTogSWNlYmVyZ1BhcnF1ZXRWMlRhYmxlLFxuICAgIFtUYWJsZVR5cGUuUE9TVEdSRVNfMThdOiBQb3N0Z3JlczE4VGFibGUsXG59O1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBjb25jcmV0ZSBgVGFibGVUeXBlQmFzZWAgc3ViY2xhc3MgZm9yIHRoZSBnaXZlbiBmaWVsZHMuXG4gKlxuICogQHBhcmFtIGZpZWxkcyBUaGUgbm9ybWFsaXplZCB0YWJsZSBmaWVsZHMuXG4gKiBAcmV0dXJucyBBIGNvbmNyZXRlIHRhYmxlIGluc3RhbmNlIGZvciB0aGUgZW5naW5lIG5hbWVkIGJ5IGBmaWVsZHMuZGVmaW5pdGlvbi50YWJsZVR5cGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFibGVUeXBlKGZpZWxkczogVGFibGVUeXBlRmllbGRzKTogVGFibGVUeXBlQmFzZSB7XG4gICAgY29uc3QgdGFibGVUeXBlID0gZmllbGRzLmRlZmluaXRpb24udGFibGVUeXBlIGFzIFRhYmxlVHlwZTtcbiAgICAvLy8gQW4gdW5yZWNvZ25pemVkIGB0YWJsZVR5cGVgIG9ubHkgb2NjdXJzIHdoZW4gTGF5ZXIgMSBhbHJlYWR5IGZsYWdnZWQgdGhlXG4gICAgLy8vIGZpbGU6IHN1Y2ggdGFibGVzIGFyZSBza2lwcGVkIGJ5IGludHJhLXRhYmxlIHJ1bGVzIGFuZCBza2lwcGVkIGFzIEZLXG4gICAgLy8vIHRhcmdldHMsIHNvIHRoZSBjaG9pY2UgaGVyZSBpcyBwdXJlbHkgZm9yIGNyb3NzLWZpbGUgKnJlc29sdXRpb24qICh0aGVcbiAgICAvLy8gaW5zdGFuY2Ugc3RpbGwgbmVlZHMgdG8gbGFuZCBpbiBgd29ybGQudGFibGVzYCBzbyBkZXBlbmRzT24gLyBGSyBzb3VyY2VcbiAgICAvLy8gbG9va3VwcyBkb24ndCBwcmV0ZW5kIHRoZSBmaWxlIGlzIG1pc3NpbmcpLiBgSGl2ZVBhcnF1ZXRUYWJsZWAgaXMgdGhlXG4gICAgLy8vIHJlc29sdXRpb24tb25seSBmYWxsYmFjay5cbiAgICBjb25zdCBDb25zdHJ1Y3RvciA9IFJFR0lTVFJZW3RhYmxlVHlwZV0gPz8gSGl2ZVBhcnF1ZXRUYWJsZTtcbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZpZWxkcyk7XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flexdataset",
3
- "version": "0.21.1",
3
+ "version": "0.22.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Flexible Dataset Definition (FDD) — validator and tooling for the FDD dataset standard.",
6
6
  "author": "Rodrigo Carvajal",
@@ -53,7 +53,7 @@
53
53
  "devDependencies": {
54
54
  "@eslint/js": "^9.27.0",
55
55
  "@types/jest": "^29.5.14",
56
- "@types/node": "22.7.9",
56
+ "@types/node": "^24.13.2",
57
57
  "@typescript-eslint/eslint-plugin": "^8.0.0",
58
58
  "@typescript-eslint/parser": "^8.0.0",
59
59
  "eslint": "^9.27.0",
@@ -63,6 +63,9 @@
63
63
  "ts-jest": "^29.2.5",
64
64
  "typescript": "~5.6.3"
65
65
  },
66
+ "engines": {
67
+ "node": ">=22.14"
68
+ },
66
69
  "publishConfig": {
67
70
  "access": "public"
68
71
  }