athena-query-result-pager 0.4.6 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -13
- package/lib/index.d.ts +27 -7
- package/lib/index.js +36 -6
- package/package.json +4 -5
package/README.md
CHANGED
|
@@ -3,22 +3,40 @@
|
|
|
3
3
|

|
|
4
4
|

|
|
5
5
|
|
|
6
|
-
Paginate [AWS Athena](https://docs.aws.amazon.com/athena/latest/ug/v3-sdk.html) **`GetQueryResults`** calls with AWS SDK v3. This library walks **`NextToken`**, parses tabular rows with [athena-query-result-parser](https://www.npmjs.com/package/athena-query-result-parser) (0.
|
|
6
|
+
Paginate [AWS Athena](https://docs.aws.amazon.com/athena/latest/ug/v3-sdk.html) **`GetQueryResults`** calls with AWS SDK v3. This library walks **`NextToken`**, parses tabular rows with [athena-query-result-parser](https://www.npmjs.com/package/athena-query-result-parser) (0.5+), and forwards **`MaxResults`**, **`QueryResultType`**, and optional **`ParseResultSetOptions`** from **[PagerOptions](#options)** on every page fetch.
|
|
7
7
|
|
|
8
8
|
Page-level and row-level APIs are symmetric: use the base method for raw **`ParsedRow`** values, or the `*With` / `rowParser` variant for custom types.
|
|
9
9
|
|
|
10
|
+
## Compared to the AWS SDK paginator
|
|
11
|
+
|
|
12
|
+
`@aws-sdk/client-athena` already ships [`paginateGetQueryResults`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-athena/Function/paginateGetQueryResults/). It walks **`NextToken`** and yields raw **`GetQueryResultsCommandOutput`** pages — fine if you only need SDK-shaped pages and will parse rows yourself.
|
|
13
|
+
|
|
14
|
+
**This package is the easier path when you want rows, not raw Athena pages:** header skipping, dictionary / typed rows, and page- or row-level async iteration are built in, so you skip the usual glue code around the official paginator.
|
|
15
|
+
|
|
16
|
+
| | SDK `paginateGetQueryResults` | This package |
|
|
17
|
+
| --- | --- | --- |
|
|
18
|
+
| Page walking (`NextToken`) | Yes | Yes |
|
|
19
|
+
| Output | Raw Athena / SDK page objects | Parsed **`ParsedRow`** (or custom `T` via **`RowParser`**) |
|
|
20
|
+
| Header-row handling & parse options | You implement | Via [athena-query-result-parser](https://www.npmjs.com/package/athena-query-result-parser) (`skipHeaderRow`, mismatch behavior, …) |
|
|
21
|
+
| Row-level async iteration | You flatten pages | **`iterateRows`** (one page buffered at a time) |
|
|
22
|
+
| Defaults for **`MaxResults`** / **`QueryResultType`** | Per request input | Constructor **`PagerOptions`**, applied every fetch |
|
|
23
|
+
| Input checks | SDK only | Fail-fast for empty **`queryExecutionId`** and invalid **`maxResults`** |
|
|
24
|
+
|
|
25
|
+
Both still require a finished query execution and rely on your **`AthenaClient`** for retries — see **[Caller responsibilities](#caller-responsibilities)**.
|
|
26
|
+
|
|
10
27
|
## Features
|
|
11
28
|
|
|
12
29
|
- Sends paginated Athena **`GetQueryResults`** requests (`NextToken` / **`MaxResults`**).
|
|
13
30
|
- Forwards **`QueryResultType`** from the pager constructor on each request — accepts the full AWS SDK enum (**`QueryResultType.DATA_ROWS`**, **`QueryResultType.DATA_MANIFEST`**, …). Use **`QueryResultType.DATA_MANIFEST`** for CTAS / UNLOAD / INSERT manifest workflows when Athena allows it.
|
|
14
|
-
- Forwards **`parseResultSetOptions`** to every parser invocation — **`columnCountMismatchBehavior`**, **`skipHeaderRow`**, **`headerRowDetectionStrategy`**, and other [parser 0.
|
|
31
|
+
- Forwards **`parseResultSetOptions`** to every parser invocation — **`columnCountMismatchBehavior`**, **`skipHeaderRow`**, **`headerRowDetectionStrategy`**, **`unavailableResultBehavior`**, **`maxRows`**, and other [parser 0.5+ options](https://www.npmjs.com/package/athena-query-result-parser).
|
|
15
32
|
- **Paired APIs** for raw **`ParsedRow`** dictionaries versus typed rows via **`RowParser<T>`**:
|
|
16
33
|
- Page level: **`fetchPage`** / **`fetchPageWith`**, **`iteratePages`** / **`iteratePagesWith`**
|
|
17
34
|
- Row level: **`iterateRows`** (no parser) / **`iterateRows`** (with **`rowParser`**)
|
|
18
35
|
- Async generators iterate **page-by-page** or **row-by-row** without holding full result sets in memory (only one page of rows is buffered at a time for row iterators).
|
|
19
36
|
- Fail-fast validation: **`maxResults`** must be an integer in **`1..1000`**; **`queryExecutionId`** must be non-empty (**`fetchPage`**, **`fetchPageWith`**).
|
|
20
|
-
- Re-exports **`QueryResultType`**, parser types (**`ParseResultSetOptions`**, **`ParsedRow`**, **`RowParser<T>`**, …), and parser utilities (**`rowToTypedObject`**, **`EXTRA_COLUMNS_KEY`**, …) from the package entry point.
|
|
21
|
-
- Helpers: **`AthenaQueryResultPager.hasNextPage`**, **`getLastHeaderRowDecision()`**, **`reset()`**
|
|
37
|
+
- Re-exports **`QueryResultType`**, parser types (**`ParseResultSetOptions`**, **`ParsedRow`**, **`RowParser<T>`**, …), and parser utilities (**`rowToTypedObject`**, **`parseResultSetOnce`**, **`EXTRA_COLUMNS_KEY`**, …) from the package entry point.
|
|
38
|
+
- Helpers: **`AthenaQueryResultPager.hasNextPage`**, **`getLastHeaderRowDecision()`**, and **`reset()`** (usually optional — parser state resets automatically when **`queryExecutionId`** changes).
|
|
39
|
+
- Does **not** wait for query completion or add Athena-specific retry beyond the AWS SDK client — see **[Caller responsibilities](#caller-responsibilities)**.
|
|
22
40
|
|
|
23
41
|
## Installation
|
|
24
42
|
|
|
@@ -34,7 +52,7 @@ yarn add athena-query-result-pager
|
|
|
34
52
|
pnpm add athena-query-result-pager
|
|
35
53
|
```
|
|
36
54
|
|
|
37
|
-
Runtime dependencies: `@aws-sdk/client-athena`, `athena-query-result-parser` **`^0.
|
|
55
|
+
Runtime dependencies: `@aws-sdk/client-athena`, `athena-query-result-parser` **`^0.5.0`**. Your application typically already instantiates **`AthenaClient`** with credentials and Region.
|
|
38
56
|
|
|
39
57
|
## Usage
|
|
40
58
|
|
|
@@ -57,11 +75,12 @@ const manifestPager = new AthenaQueryResultPager(client, {
|
|
|
57
75
|
queryResultType: QueryResultType.DATA_MANIFEST,
|
|
58
76
|
});
|
|
59
77
|
|
|
60
|
-
// Parser options (athena-query-result-parser 0.
|
|
78
|
+
// Parser options (athena-query-result-parser 0.5+), applied on every page parse:
|
|
61
79
|
const strictPager = new AthenaQueryResultPager(client, {
|
|
62
80
|
parseResultSetOptions: {
|
|
63
81
|
columnCountMismatchBehavior: 'throw',
|
|
64
82
|
headerRowDetectionStrategy: 'safe',
|
|
83
|
+
unavailableResultBehavior: 'throw',
|
|
65
84
|
},
|
|
66
85
|
});
|
|
67
86
|
```
|
|
@@ -134,14 +153,24 @@ const decision = pager.getLastHeaderRowDecision();
|
|
|
134
153
|
console.log(decision?.skipped, decision?.reason);
|
|
135
154
|
```
|
|
136
155
|
|
|
137
|
-
###
|
|
156
|
+
### Reusing a pager across executions
|
|
138
157
|
|
|
139
|
-
|
|
158
|
+
Switching to a different **`queryExecutionId`** on **`fetchPage`** / **`fetchPageWith`** (and iterators that call them) **automatically resets** the bundled parser so header-row handling does not leak between queries. Call **`reset()`** only when you need to clear parser state without starting a new fetch:
|
|
140
159
|
|
|
141
160
|
```ts
|
|
142
161
|
pager.reset();
|
|
143
162
|
```
|
|
144
163
|
|
|
164
|
+
## Caller responsibilities
|
|
165
|
+
|
|
166
|
+
This library only paginates and parses **`GetQueryResults`**. It does **not** start queries, wait for execution to finish, or wrap Athena errors with custom retry policies. Failures surface as thrown AWS SDK errors (or parser errors) from **`fetchPage`** / **`fetchPageWith`**.
|
|
167
|
+
|
|
168
|
+
Handle the following in the calling application (or via **`AthenaClient`** configuration):
|
|
169
|
+
|
|
170
|
+
- **Query not finished yet** — Before paging, wait until **`GetQueryExecution`** reports a terminal state such as **`SUCCEEDED`**. Calling this pager while the query is still **`QUEUED`** / **`RUNNING`** will fail with the usual Athena / SDK error for that situation.
|
|
171
|
+
- **Throttling and transient API errors** — Configure retry on the **`AthenaClient`** (AWS SDK v3 retry middleware / client `maxAttempts`, etc.) or retry at the call site around **`fetchPage`** / iterators. This package does not implement Athena-specific backoff for **`ThrottlingException`** or similar.
|
|
172
|
+
- **Failed / cancelled queries** — Check execution state (and Athena’s error reason) before or when catching failures; the pager assumes a completed execution that can return result pages.
|
|
173
|
+
|
|
145
174
|
## Options
|
|
146
175
|
|
|
147
176
|
### `PagerOptions`
|
|
@@ -157,7 +186,7 @@ pager.reset();
|
|
|
157
186
|
- When set (**including default**), the value appears on **`fetchPage`**, **`fetchPageWith`**, and iterator-driven calls alongside **`MaxResults`**.
|
|
158
187
|
- **`parseResultSetOptions?: ParseResultSetOptions`**
|
|
159
188
|
- Forwarded to every **`AthenaQueryResultParser.parseResultSet`** / **`parseResultSetWith`** call on this pager.
|
|
160
|
-
- Use for **`columnCountMismatchBehavior`** (`'silent' | 'throw' | 'warn' | 'extra'`), **`skipHeaderRow`**, **`headerRowDetectionStrategy`**, **`duplicateColumnNames`**, and other options documented in **`athena-query-result-parser`**.
|
|
189
|
+
- Use for **`columnCountMismatchBehavior`** (`'silent' | 'throw' | 'warn' | 'extra'`), **`skipHeaderRow`**, **`headerRowDetectionStrategy`**, **`duplicateColumnNames`**, **`unavailableResultBehavior`**, **`maxRows`** / **`maxRowsExceededBehavior`**, and other options documented in **`athena-query-result-parser`**.
|
|
161
190
|
- Import **`ParseResultSetOptions`** from **`athena-query-result-pager`** (re-exported).
|
|
162
191
|
- Inspect header skipping via **`pager.getLastHeaderRowDecision()`** after a fetch.
|
|
163
192
|
|
|
@@ -180,7 +209,7 @@ Both throw if **`queryExecutionId`** is empty or whitespace-only (before invokin
|
|
|
180
209
|
- **`iterateRows(queryExecutionId)`** → **`AsyncGenerator<ParsedRow>`**
|
|
181
210
|
- **`iterateRows<T>(queryExecutionId, rowParser)`** → **`AsyncGenerator<T>`**
|
|
182
211
|
- **`getLastHeaderRowDecision()`** → **`HeaderRowDecision | null`**
|
|
183
|
-
- **`reset()`** — clears bundled parser state (**header row bookkeeping**
|
|
212
|
+
- **`reset()`** — clears bundled parser state (**header row bookkeeping**). Usually unnecessary: **`fetchPage`** / **`fetchPageWith`** reset automatically when **`queryExecutionId`** changes.
|
|
184
213
|
- **`static hasNextPage<T>(pageResult: PageResult<T>)`** → **`boolean`**
|
|
185
214
|
|
|
186
215
|
### Types and re-exports
|
|
@@ -188,14 +217,14 @@ Both throw if **`queryExecutionId`** is empty or whitespace-only (before invokin
|
|
|
188
217
|
- **`PageResult<T>`** — **`{ rows: T[]; nextToken?: string; rowCount: number }`**
|
|
189
218
|
- **`PagerOptions`** — **`{ maxResults?: number; queryResultType?: QueryResultType; parseResultSetOptions?: ParseResultSetOptions }`**
|
|
190
219
|
- **`QueryResultType`** — enum re-exported from **`@aws-sdk/client-athena`** (**`DATA_ROWS`**, **`DATA_MANIFEST`**, …)
|
|
191
|
-
- **`ParseResultSetOptions`**, **`ColumnCountMismatchBehavior`**, **`HeaderRowDecision`**, **`ParsedRow`**, **`RowParser<T>`**, **`TypedParsedRow`**, **`AthenaTypedValue`** — re-exported from **`athena-query-result-parser`**
|
|
192
|
-
- **`EXTRA_COLUMNS_KEY`**, **`toNumber`**, **`toBoolean`**, **`toDate`**, **`headersFromMeta`**, **`rowToObject`**, **`rowToTypedObject`**, **`isHeaderRow`** — re-exported parser utilities
|
|
220
|
+
- **`ParseResultSetOptions`**, **`ColumnCountMismatchBehavior`**, **`HeaderRowDecision`**, **`ParsedRow`**, **`RowParser<T>`**, **`TypedParsedRow`**, **`AthenaTypedValue`**, **`UnavailableResultBehavior`**, **`MaxRowsExceededBehavior`**, **`ParseResultSetUnavailableReason`**, **`ParseResultSetDiagnostics`**, **`ParseResultSetDetailedResult`**, **`ParserReusePolicy`**, **`AthenaQueryResultParserOptions`** — re-exported from **`athena-query-result-parser`**
|
|
221
|
+
- **`EXTRA_COLUMNS_KEY`**, **`toNumber`**, **`toBoolean`**, **`toDate`**, **`headersFromMeta`**, **`rowToObject`**, **`rowToTypedObject`**, **`isHeaderRow`**, **`parseResultSetOnce`**, **`parseResultSetDetailedOnce`**, **`parseResultSetIterOnce`**, **`parseResultSetWithOnce`** — re-exported parser utilities
|
|
193
222
|
|
|
194
223
|
## Requirements
|
|
195
224
|
|
|
196
225
|
- Node.js **`>= 20.0.0`**
|
|
197
226
|
- **`@aws-sdk/client-athena`** — provide **`AthenaClient`**; **`QueryResultType`** is also re-exported by this package
|
|
198
|
-
- **`athena-query-result-parser`** **`^0.
|
|
227
|
+
- **`athena-query-result-parser`** **`^0.5.0`**
|
|
199
228
|
|
|
200
229
|
## License
|
|
201
230
|
|
package/lib/index.d.ts
CHANGED
|
@@ -32,7 +32,8 @@ export interface PagerOptions {
|
|
|
32
32
|
/**
|
|
33
33
|
* Options forwarded to every {@link AthenaQueryResultParser.parseResultSet} /
|
|
34
34
|
* {@link AthenaQueryResultParser.parseResultSetWith} call (for example
|
|
35
|
-
* `columnCountMismatchBehavior`, `skipHeaderRow`, `headerRowDetectionStrategy
|
|
35
|
+
* `columnCountMismatchBehavior`, `skipHeaderRow`, `headerRowDetectionStrategy`,
|
|
36
|
+
* `unavailableResultBehavior`, `maxRows`).
|
|
36
37
|
*
|
|
37
38
|
* @see ParseResultSetOptions
|
|
38
39
|
*/
|
|
@@ -48,6 +49,11 @@ export interface PagerOptions {
|
|
|
48
49
|
*
|
|
49
50
|
* Constructor `maxResults`, `queryResultType`, and optional `parseResultSetOptions` are applied on every
|
|
50
51
|
* `GetQueryResults` request and {@link AthenaQueryResultParser} invocation respectively.
|
|
52
|
+
* When `queryExecutionId` changes between fetches, the bundled parser is reset automatically.
|
|
53
|
+
*
|
|
54
|
+
* Does not wait for query completion or add Athena-specific retry: callers should wait until the execution
|
|
55
|
+
* succeeds (for example via `GetQueryExecution`) and configure SDK / application-level retry for throttling.
|
|
56
|
+
* AWS SDK errors from `GetQueryResults` are propagated as thrown.
|
|
51
57
|
*
|
|
52
58
|
* @see {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/athena/command/GetQueryResultsCommand/ | GetQueryResultsCommand (AWS SDK)}
|
|
53
59
|
*/
|
|
@@ -66,8 +72,10 @@ export declare class AthenaQueryResultPager {
|
|
|
66
72
|
private readonly options;
|
|
67
73
|
/** Parser options applied on every page parse (undefined uses parser defaults). */
|
|
68
74
|
private readonly parseResultSetOptions?;
|
|
69
|
-
/** Stateful parser reused across
|
|
75
|
+
/** Stateful parser reused across pages of the same execution; reset on execution change or {@link AthenaQueryResultPager.reset}. */
|
|
70
76
|
private parser;
|
|
77
|
+
/** Last `queryExecutionId` passed to `fetchPage` / `fetchPageWith`; used to auto-reset the parser. */
|
|
78
|
+
private activeQueryExecutionId;
|
|
71
79
|
/**
|
|
72
80
|
* Creates a pager bound to `client` with optional per-request defaults.
|
|
73
81
|
*
|
|
@@ -76,10 +84,19 @@ export declare class AthenaQueryResultPager {
|
|
|
76
84
|
* @throws {RangeError} When `maxResults` is not an integer in `1..1000` inclusive.
|
|
77
85
|
*/
|
|
78
86
|
constructor(client: AthenaClient, options?: PagerOptions);
|
|
87
|
+
/**
|
|
88
|
+
* Resets the bundled parser when `queryExecutionId` differs from the previous fetch sequence.
|
|
89
|
+
*
|
|
90
|
+
* Same-execution pagination (with `nextToken`) keeps parser state so header-row handling stays correct.
|
|
91
|
+
*
|
|
92
|
+
* @param queryExecutionId - Athena query execution identifier for the upcoming fetch.
|
|
93
|
+
*/
|
|
94
|
+
private readonly ensureParserForExecution;
|
|
79
95
|
/**
|
|
80
96
|
* Retrieves a single results page as dictionary-shaped {@link ParsedRow} values.
|
|
81
97
|
*
|
|
82
98
|
* Uses {@link AthenaQueryResultParser.parseResultSet} on the AWS response.
|
|
99
|
+
* When `queryExecutionId` differs from the previous fetch sequence, the bundled parser is reset first.
|
|
83
100
|
*
|
|
84
101
|
* @param queryExecutionId - Athena query execution identifier.
|
|
85
102
|
* @param nextToken - Pass `undefined` first; subsequent calls use {@link PageResult.nextToken}.
|
|
@@ -91,6 +108,7 @@ export declare class AthenaQueryResultPager {
|
|
|
91
108
|
* Retrieves one page and maps each {@link ParsedRow} through `rowParser`.
|
|
92
109
|
*
|
|
93
110
|
* Uses {@link AthenaQueryResultParser.parseResultSetWith} on the AWS response.
|
|
111
|
+
* When `queryExecutionId` differs from the previous fetch sequence, the bundled parser is reset first.
|
|
94
112
|
*
|
|
95
113
|
* @typeParam T - Output type produced by `rowParser`.
|
|
96
114
|
* @param queryExecutionId - Athena query execution identifier.
|
|
@@ -141,17 +159,19 @@ export declare class AthenaQueryResultPager {
|
|
|
141
159
|
*
|
|
142
160
|
* Useful when {@link PagerOptions.parseResultSetOptions} uses `skipHeaderRow: 'auto'`.
|
|
143
161
|
*
|
|
144
|
-
* @returns The last {@link HeaderRowDecision}, or `null` before any parse
|
|
162
|
+
* @returns The last {@link HeaderRowDecision}, or `null` before any parse / after {@link AthenaQueryResultPager.reset}.
|
|
145
163
|
*/
|
|
146
164
|
getLastHeaderRowDecision(): HeaderRowDecision | null;
|
|
147
165
|
/**
|
|
148
|
-
* Clears the bundled {@link AthenaQueryResultParser} state
|
|
166
|
+
* Clears the bundled {@link AthenaQueryResultParser} state and the tracked active execution id.
|
|
149
167
|
*
|
|
150
|
-
*
|
|
168
|
+
* Usually unnecessary: {@link AthenaQueryResultPager.fetchPage} and {@link AthenaQueryResultPager.fetchPageWith}
|
|
169
|
+
* reset automatically when `queryExecutionId` changes. Call explicitly to clear state without starting a new fetch
|
|
170
|
+
* (for example so {@link AthenaQueryResultPager.getLastHeaderRowDecision} returns `null`).
|
|
151
171
|
*/
|
|
152
172
|
reset(): void;
|
|
153
173
|
}
|
|
154
174
|
/** Re-exports {@link QueryResultType} from `@aws-sdk/client-athena`. */
|
|
155
175
|
export { QueryResultType } from '@aws-sdk/client-athena';
|
|
156
|
-
export { EXTRA_COLUMNS_KEY, headersFromMeta, isHeaderRow, rowToObject, rowToTypedObject, toBoolean, toDate, toNumber, } from 'athena-query-result-parser';
|
|
157
|
-
export type { AthenaTypedValue, ColumnCountMismatchBehavior, HeaderRowDecision, ParseResultSetOptions, ParsedRow, RowParser, TypedParsedRow, } from 'athena-query-result-parser';
|
|
176
|
+
export { EXTRA_COLUMNS_KEY, headersFromMeta, isHeaderRow, parseResultSetDetailedOnce, parseResultSetIterOnce, parseResultSetOnce, parseResultSetWithOnce, rowToObject, rowToTypedObject, toBoolean, toDate, toNumber, } from 'athena-query-result-parser';
|
|
177
|
+
export type { AthenaQueryResultParserOptions, AthenaTypedValue, ColumnCountMismatchBehavior, HeaderRowDecision, MaxRowsExceededBehavior, ParseResultSetDiagnostics, ParseResultSetDetailedResult, ParseResultSetOptions, ParseResultSetUnavailableReason, ParsedRow, ParserReusePolicy, RowParser, TypedParsedRow, UnavailableResultBehavior, } from 'athena-query-result-parser';
|
package/lib/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toNumber = exports.toDate = exports.toBoolean = exports.rowToTypedObject = exports.rowToObject = exports.isHeaderRow = exports.headersFromMeta = exports.EXTRA_COLUMNS_KEY = exports.QueryResultType = exports.AthenaQueryResultPager = void 0;
|
|
3
|
+
exports.toNumber = exports.toDate = exports.toBoolean = exports.rowToTypedObject = exports.rowToObject = exports.parseResultSetWithOnce = exports.parseResultSetOnce = exports.parseResultSetIterOnce = exports.parseResultSetDetailedOnce = exports.isHeaderRow = exports.headersFromMeta = exports.EXTRA_COLUMNS_KEY = exports.QueryResultType = exports.AthenaQueryResultPager = void 0;
|
|
4
4
|
const client_athena_1 = require("@aws-sdk/client-athena");
|
|
5
5
|
const athena_query_result_parser_1 = require("athena-query-result-parser");
|
|
6
6
|
/** Default maximum number of result rows requested per {@link AthenaQueryResultPager} API call (`MaxResults`). */
|
|
@@ -21,6 +21,11 @@ const DEFAULT_QUERY_RESULT_TYPE = client_athena_1.QueryResultType.DATA_ROWS;
|
|
|
21
21
|
*
|
|
22
22
|
* Constructor `maxResults`, `queryResultType`, and optional `parseResultSetOptions` are applied on every
|
|
23
23
|
* `GetQueryResults` request and {@link AthenaQueryResultParser} invocation respectively.
|
|
24
|
+
* When `queryExecutionId` changes between fetches, the bundled parser is reset automatically.
|
|
25
|
+
*
|
|
26
|
+
* Does not wait for query completion or add Athena-specific retry: callers should wait until the execution
|
|
27
|
+
* succeeds (for example via `GetQueryExecution`) and configure SDK / application-level retry for throttling.
|
|
28
|
+
* AWS SDK errors from `GetQueryResults` are propagated as thrown.
|
|
24
29
|
*
|
|
25
30
|
* @see {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/athena/command/GetQueryResultsCommand/ | GetQueryResultsCommand (AWS SDK)}
|
|
26
31
|
*/
|
|
@@ -43,6 +48,19 @@ class AthenaQueryResultPager {
|
|
|
43
48
|
* @throws {RangeError} When `maxResults` is not an integer in `1..1000` inclusive.
|
|
44
49
|
*/
|
|
45
50
|
constructor(client, options = {}) {
|
|
51
|
+
/**
|
|
52
|
+
* Resets the bundled parser when `queryExecutionId` differs from the previous fetch sequence.
|
|
53
|
+
*
|
|
54
|
+
* Same-execution pagination (with `nextToken`) keeps parser state so header-row handling stays correct.
|
|
55
|
+
*
|
|
56
|
+
* @param queryExecutionId - Athena query execution identifier for the upcoming fetch.
|
|
57
|
+
*/
|
|
58
|
+
this.ensureParserForExecution = (queryExecutionId) => {
|
|
59
|
+
if (this.activeQueryExecutionId !== undefined && this.activeQueryExecutionId !== queryExecutionId) {
|
|
60
|
+
this.parser.reset();
|
|
61
|
+
}
|
|
62
|
+
this.activeQueryExecutionId = queryExecutionId;
|
|
63
|
+
};
|
|
46
64
|
const maxResults = options.maxResults ?? DEFAULT_MAX_RESULTS;
|
|
47
65
|
if (!Number.isInteger(maxResults) || maxResults < MIN_MAX_RESULTS || maxResults > MAX_MAX_RESULTS) {
|
|
48
66
|
throw new RangeError(`options.maxResults must be an integer between ${MIN_MAX_RESULTS} and ${MAX_MAX_RESULTS}, got ${String(maxResults)}`);
|
|
@@ -53,12 +71,14 @@ class AthenaQueryResultPager {
|
|
|
53
71
|
queryResultType: options.queryResultType ?? DEFAULT_QUERY_RESULT_TYPE,
|
|
54
72
|
};
|
|
55
73
|
this.parseResultSetOptions = options.parseResultSetOptions;
|
|
56
|
-
|
|
74
|
+
// Default reusePolicy is 'paginate': retain headers / header-row-dropped across pages of one query.
|
|
75
|
+
this.parser = athena_query_result_parser_1.AthenaQueryResultParser.create();
|
|
57
76
|
}
|
|
58
77
|
/**
|
|
59
78
|
* Retrieves a single results page as dictionary-shaped {@link ParsedRow} values.
|
|
60
79
|
*
|
|
61
80
|
* Uses {@link AthenaQueryResultParser.parseResultSet} on the AWS response.
|
|
81
|
+
* When `queryExecutionId` differs from the previous fetch sequence, the bundled parser is reset first.
|
|
62
82
|
*
|
|
63
83
|
* @param queryExecutionId - Athena query execution identifier.
|
|
64
84
|
* @param nextToken - Pass `undefined` first; subsequent calls use {@link PageResult.nextToken}.
|
|
@@ -69,6 +89,7 @@ class AthenaQueryResultPager {
|
|
|
69
89
|
if (queryExecutionId.trim() === '') {
|
|
70
90
|
throw new Error('queryExecutionId must be a non-empty string');
|
|
71
91
|
}
|
|
92
|
+
this.ensureParserForExecution(queryExecutionId);
|
|
72
93
|
const input = {
|
|
73
94
|
QueryExecutionId: queryExecutionId,
|
|
74
95
|
NextToken: nextToken,
|
|
@@ -87,6 +108,7 @@ class AthenaQueryResultPager {
|
|
|
87
108
|
* Retrieves one page and maps each {@link ParsedRow} through `rowParser`.
|
|
88
109
|
*
|
|
89
110
|
* Uses {@link AthenaQueryResultParser.parseResultSetWith} on the AWS response.
|
|
111
|
+
* When `queryExecutionId` differs from the previous fetch sequence, the bundled parser is reset first.
|
|
90
112
|
*
|
|
91
113
|
* @typeParam T - Output type produced by `rowParser`.
|
|
92
114
|
* @param queryExecutionId - Athena query execution identifier.
|
|
@@ -99,6 +121,7 @@ class AthenaQueryResultPager {
|
|
|
99
121
|
if (queryExecutionId.trim() === '') {
|
|
100
122
|
throw new Error('queryExecutionId must be a non-empty string');
|
|
101
123
|
}
|
|
124
|
+
this.ensureParserForExecution(queryExecutionId);
|
|
102
125
|
const input = {
|
|
103
126
|
QueryExecutionId: queryExecutionId,
|
|
104
127
|
NextToken: nextToken,
|
|
@@ -164,18 +187,21 @@ class AthenaQueryResultPager {
|
|
|
164
187
|
*
|
|
165
188
|
* Useful when {@link PagerOptions.parseResultSetOptions} uses `skipHeaderRow: 'auto'`.
|
|
166
189
|
*
|
|
167
|
-
* @returns The last {@link HeaderRowDecision}, or `null` before any parse
|
|
190
|
+
* @returns The last {@link HeaderRowDecision}, or `null` before any parse / after {@link AthenaQueryResultPager.reset}.
|
|
168
191
|
*/
|
|
169
192
|
getLastHeaderRowDecision() {
|
|
170
193
|
return this.parser.getLastHeaderRowDecision();
|
|
171
194
|
}
|
|
172
195
|
/**
|
|
173
|
-
* Clears the bundled {@link AthenaQueryResultParser} state
|
|
196
|
+
* Clears the bundled {@link AthenaQueryResultParser} state and the tracked active execution id.
|
|
174
197
|
*
|
|
175
|
-
*
|
|
198
|
+
* Usually unnecessary: {@link AthenaQueryResultPager.fetchPage} and {@link AthenaQueryResultPager.fetchPageWith}
|
|
199
|
+
* reset automatically when `queryExecutionId` changes. Call explicitly to clear state without starting a new fetch
|
|
200
|
+
* (for example so {@link AthenaQueryResultPager.getLastHeaderRowDecision} returns `null`).
|
|
176
201
|
*/
|
|
177
202
|
reset() {
|
|
178
203
|
this.parser.reset();
|
|
204
|
+
this.activeQueryExecutionId = undefined;
|
|
179
205
|
}
|
|
180
206
|
}
|
|
181
207
|
exports.AthenaQueryResultPager = AthenaQueryResultPager;
|
|
@@ -186,9 +212,13 @@ var athena_query_result_parser_2 = require("athena-query-result-parser");
|
|
|
186
212
|
Object.defineProperty(exports, "EXTRA_COLUMNS_KEY", { enumerable: true, get: function () { return athena_query_result_parser_2.EXTRA_COLUMNS_KEY; } });
|
|
187
213
|
Object.defineProperty(exports, "headersFromMeta", { enumerable: true, get: function () { return athena_query_result_parser_2.headersFromMeta; } });
|
|
188
214
|
Object.defineProperty(exports, "isHeaderRow", { enumerable: true, get: function () { return athena_query_result_parser_2.isHeaderRow; } });
|
|
215
|
+
Object.defineProperty(exports, "parseResultSetDetailedOnce", { enumerable: true, get: function () { return athena_query_result_parser_2.parseResultSetDetailedOnce; } });
|
|
216
|
+
Object.defineProperty(exports, "parseResultSetIterOnce", { enumerable: true, get: function () { return athena_query_result_parser_2.parseResultSetIterOnce; } });
|
|
217
|
+
Object.defineProperty(exports, "parseResultSetOnce", { enumerable: true, get: function () { return athena_query_result_parser_2.parseResultSetOnce; } });
|
|
218
|
+
Object.defineProperty(exports, "parseResultSetWithOnce", { enumerable: true, get: function () { return athena_query_result_parser_2.parseResultSetWithOnce; } });
|
|
189
219
|
Object.defineProperty(exports, "rowToObject", { enumerable: true, get: function () { return athena_query_result_parser_2.rowToObject; } });
|
|
190
220
|
Object.defineProperty(exports, "rowToTypedObject", { enumerable: true, get: function () { return athena_query_result_parser_2.rowToTypedObject; } });
|
|
191
221
|
Object.defineProperty(exports, "toBoolean", { enumerable: true, get: function () { return athena_query_result_parser_2.toBoolean; } });
|
|
192
222
|
Object.defineProperty(exports, "toDate", { enumerable: true, get: function () { return athena_query_result_parser_2.toDate; } });
|
|
193
223
|
Object.defineProperty(exports, "toNumber", { enumerable: true, get: function () { return athena_query_result_parser_2.toNumber; } });
|
|
194
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWlJO0FBQ2pJLDJFQU1vQztBQUVwQyxrSEFBa0g7QUFDbEgsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsc0VBQXNFO0FBQ3RFLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixzRUFBc0U7QUFDdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBRTdCLHVFQUF1RTtBQUN2RSxNQUFNLHlCQUF5QixHQUFHLCtCQUFlLENBQUMsU0FBUyxDQUFDO0FBMEM1RDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLHNCQUFzQjtJQUVqQzs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFJLFVBQXlCO1FBQzdDLE9BQU8sVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7SUFDNUMsQ0FBQztJQVdEOzs7Ozs7T0FNRztJQUNILFlBQVksTUFBb0IsRUFBRSxVQUF3QixFQUFFO1FBQzFELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxHQUFHLGVBQWUsSUFBSSxVQUFVLEdBQUcsZUFBZSxFQUFFLENBQUM7WUFDbEcsTUFBTSxJQUFJLFVBQVUsQ0FDbEIsaURBQWlELGVBQWUsUUFBUSxlQUFlLFNBQVMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQ3JILENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFVBQVU7WUFDVixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWUsSUFBSSx5QkFBeUI7U0FDdEUsQ0FBQztRQUNGLElBQUksQ0FBQyxxQkFBcUIs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YUNsaWVudCwgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZCwgUXVlcnlSZXN1bHRUeXBlLCB0eXBlIEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmRJbnB1dCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hdGhlbmEnO1xuaW1wb3J0IHtcbiAgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXIsXG4gIHR5cGUgSGVhZGVyUm93RGVjaXNpb24sXG4gIHR5cGUgUGFyc2VSZXN1bHRTZXRPcHRpb25zLFxuICB0eXBlIFBhcnNlZFJvdyxcbiAgdHlwZSBSb3dQYXJzZXIsXG59IGZyb20gJ2F0aGVuYS1xdWVyeS1yZXN1bHQtcGFyc2VyJztcblxuLyoqIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0IHJvd3MgcmVxdWVzdGVkIHBlciB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlcn0gQVBJIGNhbGwgKGBNYXhSZXN1bHRzYCkuICovXG5jb25zdCBERUZBVUxUX01BWF9SRVNVTFRTID0gMTAwMDtcbi8qKiBNaW5pbXVtIGBNYXhSZXN1bHRzYCB2YWx1ZSBhbGxvd2VkIGJ5IEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYC4gKi9cbmNvbnN0IE1JTl9NQVhfUkVTVUxUUyA9IDE7XG4vKiogTWF4aW11bSBgTWF4UmVzdWx0c2AgdmFsdWUgYWxsb3dlZCBieSBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2AuICovXG5jb25zdCBNQVhfTUFYX1JFU1VMVFMgPSAxMDAwO1xuXG4vKiogRGVmYXVsdCBgUXVlcnlSZXN1bHRUeXBlYCBmb3J3YXJkZWQgdG8gQXRoZW5hIGBHZXRRdWVyeVJlc3VsdHNgLiAqL1xuY29uc3QgREVGQVVMVF9RVUVSWV9SRVNVTFRfVFlQRSA9IFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX1JPV1M7XG5cbi8qKlxuICogT25lIHBhZ2Ugb2YgQXRoZW5hIHF1ZXJ5IHJlc3VsdHMgcmV0dXJuZWQgYnkge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXJ9IGFmdGVyIGEgZmV0Y2ggb3IgZ2VuZXJhdG9yIHN0ZXAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gUm93IHJlcHJlc2VudGF0aW9uOyB1c2Uge0BsaW5rIFBhcnNlZFJvd30gb3IgYSB0eXBlIHByb2R1Y2VkIGJ5IHtAbGluayBSb3dQYXJzZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VSZXN1bHQ8VD4ge1xuICAvKiogUGFyc2VkIHJvd3MgZm9yIHRoaXMgcGFnZSBvbmx5LiAqL1xuICByb3dzOiBUW107XG4gIC8qKiBDb250aW51YXRpb24gdG9rZW4gZm9yIHRoZSBmb2xsb3dpbmcgcGFnZSAoYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlzIHRoZSBsYXN0IHBhZ2UpLiAqL1xuICBuZXh0VG9rZW4/OiBzdHJpbmc7XG4gIC8qKiBTYW1lIGFzIGByb3dzLmxlbmd0aGAgZm9yIGNvbnZlbmllbmNlLiAqL1xuICByb3dDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGFwcGxpZWQgdG8gZXZlcnkgYEdldFF1ZXJ5UmVzdWx0c2AgaW52b2NhdGlvbiBtYWRlIGJ5IHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlck9wdGlvbnMge1xuICAvKipcbiAgICogYE1heFJlc3VsdHNgIHBlciByZXF1ZXN0IOKAlCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRocm91Z2ggMTAwMCAoQXRoZW5hIGxpbWl0cykuXG4gICAqIEBkZWZhdWx0VmFsdWUgMTAwMFxuICAgKi9cbiAgbWF4UmVzdWx0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYCB7QGxpbmsgUXVlcnlSZXN1bHRUeXBlfSDigJQgYW55IG1lbWJlciBvZiB0aGUgQVdTIFNESyBlbnVtXG4gICAqIChmb3IgZXhhbXBsZSB7QGxpbmsgUXVlcnlSZXN1bHRUeXBlLkRBVEFfUk9XU30gZm9yIHRhYnVsYXIgcm93cyBvciB7QGxpbmsgUXVlcnlSZXN1bHRUeXBlLkRBVEFfTUFOSUZFU1R9XG4gICAqIGZvciBDVEFTIC8gVU5MT0FEIC8gSU5TRVJUIG1hbmlmZXN0IG91dHB1dHMgd2hlbiBBdGhlbmEgc3VwcG9ydHMgdGhlbSkuXG4gICAqIEBkZWZhdWx0VmFsdWUge0BsaW5rIFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX1JPV1N9XG4gICAqL1xuICBxdWVyeVJlc3VsdFR5cGU/OiBRdWVyeVJlc3VsdFR5cGU7XG4gIC8qKlxuICAgKiBPcHRpb25zIGZvcndhcmRlZCB0byBldmVyeSB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXIucGFyc2VSZXN1bHRTZXR9IC9cbiAgICoge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLnBhcnNlUmVzdWx0U2V0V2l0aH0gY2FsbCAoZm9yIGV4YW1wbGVcbiAgICogYGNvbHVtbkNvdW50TWlzbWF0Y2hCZWhhdmlvcmAsIGBza2lwSGVhZGVyUm93YCwgYGhlYWRlclJvd0RldGVjdGlvblN0cmF0ZWd5YCkuXG4gICAqXG4gICAqIEBzZWUgUGFyc2VSZXN1bHRTZXRPcHRpb25zXG4gICAqL1xuICBwYXJzZVJlc3VsdFNldE9wdGlvbnM/OiBQYXJzZVJlc3VsdFNldE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFnaW5hdGVzIEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYCAoQVdTIFNESyBmb3IgSmF2YVNjcmlwdCB2Myk6IHdhbGtzIGBOZXh0VG9rZW5gIGFuZCBwYXJzZXMgdGFidWxhciByb3dzIHdpdGhcbiAqIGBhdGhlbmEtcXVlcnktcmVzdWx0LXBhcnNlcmAgd2hlbiBuZWVkZWQuXG4gKlxuICogUHJvdmlkZXMgcGFpcmVkIEFQSXMgZm9yIHJhdyB7QGxpbmsgUGFyc2VkUm93fSBhY2Nlc3MgdmVyc3VzIGN1c3RvbSB7QGxpbmsgUm93UGFyc2VyfSBtYXBwaW5nIGF0IHRoZSBwYWdlIGxldmVsXG4gKiAoYGZldGNoUGFnZWAgLyBgZmV0Y2hQYWdlV2l0aGAsIGBpdGVyYXRlUGFnZXNgIC8gYGl0ZXJhdGVQYWdlc1dpdGhgKSBhbmQgYXQgdGhlIHJvdyBsZXZlbFxuICogKGBpdGVyYXRlUm93c2Agd2l0aCBvciB3aXRob3V0IGByb3dQYXJzZXJgKS5cbiAqXG4gKiBDb25zdHJ1Y3RvciBgbWF4UmVzdWx0c2AsIGBxdWVyeVJlc3VsdFR5cGVgLCBhbmQgb3B0aW9uYWwgYHBhcnNlUmVzdWx0U2V0T3B0aW9uc2AgYXJlIGFwcGxpZWQgb24gZXZlcnlcbiAqIGBHZXRRdWVyeVJlc3VsdHNgIHJlcXVlc3QgYW5kIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlcn0gaW52b2NhdGlvbiByZXNwZWN0aXZlbHkuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvdjMvbGF0ZXN0L2NsaWVudC9hdGhlbmEvY29tbWFuZC9HZXRRdWVyeVJlc3VsdHNDb21tYW5kLyB8IEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmQgKEFXUyBTREspfVxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlSZXN1bHRQYWdlciB7XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhbm90aGVyIHJlc3VsdHMgcGFnZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBzYW1lIHF1ZXJ5IGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gUm93IHR5cGUgaGVsZCBpbiB7QGxpbmsgUGFnZVJlc3VsdC5yb3dzfS5cbiAgICogQHBhcmFtIHBhZ2VSZXN1bHQgLSBUaGUgbW9zdCByZWNlbnRseSByZXRyaWV2ZWQgcGFnZSBmcm9tIGBmZXRjaFBhZ2VgLCBgZmV0Y2hQYWdlV2l0aGAsIG9yIGEgcGFnZSBpdGVyYXRvci5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4ge0BsaW5rIFBhZ2VSZXN1bHQubmV4dFRva2VufSBpcyBkZWZpbmVkIGFuZCBhbm90aGVyIHBhZ2Ugc2hvdWxkIGJlIGZldGNoZWQuXG4gICAqL1xuICBzdGF0aWMgaGFzTmV4dFBhZ2U8VD4ocGFnZVJlc3VsdDogUGFnZVJlc3VsdDxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYWdlUmVzdWx0Lm5leHRUb2tlbiAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFNESyB2MyBjbGllbnQgdXNlZCBmb3IgZXZlcnkgYEdldFF1ZXJ5UmVzdWx0c2AgY2FsbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IEF0aGVuYUNsaWVudDtcbiAgLyoqIE5vcm1hbGl6ZWQgcGFnZXIgc2V0dGluZ3MgKGV2ZXJ5IGZpZWxkIHNldCBhZnRlciBtZXJnaW5nIGRlZmF1bHRzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxQaWNrPFBhZ2VyT3B0aW9ucywgJ21heFJlc3VsdHMnIHwgJ3F1ZXJ5UmVzdWx0VHlwZSc+PjtcbiAgLyoqIFBhcnNlciBvcHRpb25zIGFwcGxpZWQgb24gZXZlcnkgcGFnZSBwYXJzZSAodW5kZWZpbmVkIHVzZXMgcGFyc2VyIGRlZmF1bHRzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJzZVJlc3VsdFNldE9wdGlvbnM/OiBQYXJzZVJlc3VsdFNldE9wdGlvbnM7XG4gIC8qKiBTdGF0ZWZ1bCBwYXJzZXIgcmV1c2VkIGFjcm9zcyBjYWxsczsgcmVjcmVhdGVkIGJ5IHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLnJlc2V0fS4gKi9cbiAgcHJpdmF0ZSBwYXJzZXI6IEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGFnZXIgYm91bmQgdG8gYGNsaWVudGAgd2l0aCBvcHRpb25hbCBwZXItcmVxdWVzdCBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIGNsaWVudCAtIFNESyB2MyBgQXRoZW5hQ2xpZW50YCB1c2VkIHRvIGNhbGwgYEdldFF1ZXJ5UmVzdWx0c2AuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYE1heFJlc3VsdHNgLCBgUXVlcnlSZXN1bHRUeXBlYCwgYW5kIGBQYXJzZVJlc3VsdFNldE9wdGlvbnNgOyBkZWZhdWx0cyBhcHBseSB3aGVuIG9taXR0ZWQuXG4gICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IFdoZW4gYG1heFJlc3VsdHNgIGlzIG5vdCBhbiBpbnRlZ2VyIGluIGAxLi4xMDAwYCBpbmNsdXNpdmUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbGllbnQ6IEF0aGVuYUNsaWVudCwgb3B0aW9uczogUGFnZXJPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBtYXhSZXN1bHRzID0gb3B0aW9ucy5tYXhSZXN1bHRzID8/IERFRkFVTFRfTUFYX1JFU1VMVFM7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlc3VsdHMpIHx8IG1heFJlc3VsdHMgPCBNSU5fTUFYX1JFU1VMVFMgfHwgbWF4UmVzdWx0cyA+IE1BWF9NQVhfUkVTVUxUUykge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgIGBvcHRpb25zLm1heFJlc3VsdHMgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gJHtNSU5fTUFYX1JFU1VMVFN9IGFuZCAke01BWF9NQVhfUkVTVUxUU30sIGdvdCAke1N0cmluZyhtYXhSZXN1bHRzKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBtYXhSZXN1bHRzLFxuICAgICAgcXVlcnlSZXN1bHRUeXBlOiBvcHRpb25zLnF1ZXJ5UmVzdWx0VHlwZSA/PyBERUZBVUxUX1FVRVJZX1JFU1VMVF9UWVBFLFxuICAgIH07XG4gICAgdGhpcy5wYXJzZVJlc3VsdFNldE9wdGlvbnMgPSBvcHRpb25zLnBhcnNlUmVzdWx0U2V0T3B0aW9ucztcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHNpbmdsZSByZXN1bHRzIHBhZ2UgYXMgZGljdGlvbmFyeS1zaGFwZWQge0BsaW5rIFBhcnNlZFJvd30gdmFsdWVzLlxuICAgKlxuICAgKiBVc2VzIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlci5wYXJzZVJlc3VsdFNldH0gb24gdGhlIEFXUyByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSBuZXh0VG9rZW4gLSBQYXNzIGB1bmRlZmluZWRgIGZpcnN0OyBzdWJzZXF1ZW50IGNhbGxzIHVzZSB7QGxpbmsgUGFnZVJlc3VsdC5uZXh0VG9rZW59LlxuICAgKiBAcmV0dXJucyBQYXJzZWQgcm93cyBwbHVzIHBhZ2luYXRpb24gbWV0YWRhdGEgZnJvbSB0aGlzIHJlc3BvbnNlIG9ubHkuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGBxdWVyeUV4ZWN1dGlvbklkYCBpcyBlbXB0eSBvciB3aGl0ZXNwYWNlIG9ubHkuXG4gICAqL1xuICBhc3luYyBmZXRjaFBhZ2UoXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICAgIG5leHRUb2tlbj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQYWdlUmVzdWx0PFBhcnNlZFJvdz4+IHtcbiAgICBpZiAocXVlcnlFeGVjdXRpb25JZC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5RXhlY3V0aW9uSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dDogR2V0UXVlcnlSZXN1bHRzQ29tbWFuZElucHV0ID0ge1xuICAgICAgUXVlcnlFeGVjdXRpb25JZDogcXVlcnlFeGVjdXRpb25JZCxcbiAgICAgIE5leHRUb2tlbjogbmV4dFRva2VuLFxuICAgICAgTWF4UmVzdWx0czogdGhpcy5vcHRpb25zLm1heFJlc3VsdHMsXG4gICAgICBRdWVyeVJlc3VsdFR5cGU6IHRoaXMub3B0aW9ucy5xdWVyeVJlc3VsdFR5cGUsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZChpbnB1dCkpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMucGFyc2VyLnBhcnNlUmVzdWx0U2V0KHJlc3BvbnNlLlJlc3VsdFNldCwgdGhpcy5wYXJzZVJlc3VsdFNldE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvd3MsXG4gICAgICBuZXh0VG9rZW46IHJlc3BvbnNlLk5leHRUb2tlbixcbiAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBvbmUgcGFnZSBhbmQgbWFwcyBlYWNoIHtAbGluayBQYXJzZWRSb3d9IHRocm91Z2ggYHJvd1BhcnNlcmAuXG4gICAqXG4gICAqIFVzZXMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLnBhcnNlUmVzdWx0U2V0V2l0aH0gb24gdGhlIEFXUyByZXNwb25zZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gT3V0cHV0IHR5cGUgcHJvZHVjZWQgYnkgYHJvd1BhcnNlcmAuXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcm93UGFyc2VyIC0gQ29udmVydHMgZWFjaCBkaWN0aW9uYXJ5IHJvdyBpbnRvIGBUYC5cbiAgICogQHBhcmFtIG5leHRUb2tlbiAtIFBhc3MgYHVuZGVmaW5lZGAgZmlyc3Q7IHN1YnNlcXVlbnQgY2FsbHMgdXNlIHtAbGluayBQYWdlUmVzdWx0Lm5leHRUb2tlbn0uXG4gICAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIHJvd3MgcGx1cyBwYWdpbmF0aW9uIG1ldGFkYXRhIGZyb20gdGhpcyByZXNwb25zZSBvbmx5LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgaXMgZW1wdHkgb3Igd2hpdGVzcGFjZSBvbmx5LlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hQYWdlV2l0aDxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyOiBSb3dQYXJzZXI8VD4sXG4gICAgbmV4dFRva2VuPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFBhZ2VSZXN1bHQ8VD4+IHtcbiAgICBpZiAocXVlcnlFeGVjdXRpb25JZC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5RXhlY3V0aW9uSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dDogR2V0UXVlcnlSZXN1bHRzQ29tbWFuZElucHV0ID0ge1xuICAgICAgUXVlcnlFeGVjdXRpb25JZDogcXVlcnlFeGVjdXRpb25JZCxcbiAgICAgIE5leHRUb2tlbjogbmV4dFRva2VuLFxuICAgICAgTWF4UmVzdWx0czogdGhpcy5vcHRpb25zLm1heFJlc3VsdHMsXG4gICAgICBRdWVyeVJlc3VsdFR5cGU6IHRoaXMub3B0aW9ucy5xdWVyeVJlc3VsdFR5cGUsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZChpbnB1dCkpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMucGFyc2VyLnBhcnNlUmVzdWx0U2V0V2l0aChcbiAgICAgIHJlc3BvbnNlLlJlc3VsdFNldCxcbiAgICAgIHJvd1BhcnNlcixcbiAgICAgIHRoaXMucGFyc2VSZXN1bHRTZXRPcHRpb25zLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm93cyxcbiAgICAgIG5leHRUb2tlbjogcmVzcG9uc2UuTmV4dFRva2VuLFxuICAgICAgcm93Q291bnQ6IHJvd3MubGVuZ3RoLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTGF6aWx5IHdhbGtzIGFsbCBwYWdlcyBmb3IgYW4gZXhlY3V0aW9uLCB5aWVsZGluZyBvbmUge0BsaW5rIFBhZ2VSZXN1bHR9IG9mIHtAbGluayBQYXJzZWRSb3d9IHBlciBzdGVwLlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHlpZWxkcyBPbmUgcGFnZSBhdCBhIHRpbWUgdW50aWwgQVdTIHJldHVybnMgbm8gYE5leHRUb2tlbmAuXG4gICAqL1xuICBhc3luYyAqaXRlcmF0ZVBhZ2VzKFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgKTogQXN5bmNHZW5lcmF0b3I8UGFnZVJlc3VsdDxQYXJzZWRSb3c+PiB7XG4gICAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMuZmV0Y2hQYWdlKHF1ZXJ5RXhlY3V0aW9uSWQsIG5leHRUb2tlbik7XG4gICAgICB5aWVsZCBwYWdlO1xuICAgICAgbmV4dFRva2VuID0gcGFnZS5uZXh0VG9rZW47XG4gICAgfSB3aGlsZSAobmV4dFRva2VuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1lIGFzIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc30gYnV0IG1hcHMgZWFjaCByb3cgdGhyb3VnaCBgcm93UGFyc2VyYCBvbiBldmVyeSBwYWdlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBPdXRwdXQgdHlwZSBlbWl0dGVkIGluIHtAbGluayBQYWdlUmVzdWx0LnJvd3N9LlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHJvd1BhcnNlciAtIENvbnZlcnRzIGVhY2ggcGFyc2VkIHJvdyBpbnRvIGBUYC5cbiAgICogQHlpZWxkcyBTdWNjZXNzaXZlIHtAbGluayBQYWdlUmVzdWx0fSB2YWx1ZXMgd2hvc2UgYHJvd3NgIGFyZSB0eXBlZCBhcyBgVGAuXG4gICAqL1xuICBhc3luYyAqaXRlcmF0ZVBhZ2VzV2l0aDxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyOiBSb3dQYXJzZXI8VD4sXG4gICk6IEFzeW5jR2VuZXJhdG9yPFBhZ2VSZXN1bHQ8VD4+IHtcbiAgICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5mZXRjaFBhZ2VXaXRoKHF1ZXJ5RXhlY3V0aW9uSWQsIHJvd1BhcnNlciwgbmV4dFRva2VuKTtcbiAgICAgIHlpZWxkIHBhZ2U7XG4gICAgICBuZXh0VG9rZW4gPSBwYWdlLm5leHRUb2tlbjtcbiAgICB9IHdoaWxlIChuZXh0VG9rZW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc30gaW50byBpbmRpdmlkdWFsIHtAbGluayBQYXJzZWRSb3d9IHZhbHVlcyAob25lIHJvdyBwZXIgYG5leHQoKWApLlxuICAgKlxuICAgKiBPbmx5IG9uZSBwYWdlIG9mIHJvd3MgaXMgaGVsZCBpbiBtZW1vcnkgYXQgYSB0aW1lLlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHlpZWxkcyBFYWNoIGRpY3Rpb25hcnktc2hhcGVkIHJvdyBpbiBleGVjdXRpb24gb3JkZXIuXG4gICAqL1xuICBpdGVyYXRlUm93cyhcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICk6IEFzeW5jR2VuZXJhdG9yPFBhcnNlZFJvdz47XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc1dpdGh9IGludG8gaW5kaXZpZHVhbCBgVGAgdmFsdWVzIChvbmUgcm93IHBlciBgbmV4dCgpYCkuXG4gICAqXG4gICAqIE9ubHkgb25lIHBhZ2Ugb2Ygcm93cyBpcyBoZWxkIGluIG1lbW9yeSBhdCBhIHRpbWUuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIE91dHB1dCB0eXBlIHByb2R1Y2VkIGJ5IGByb3dQYXJzZXJgLlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHJvd1BhcnNlciAtIENvbnZlcnRzIGVhY2ggcGFyc2VkIHJvdyBpbnRvIGBUYC5cbiAgICogQHlpZWxkcyBFYWNoIHRyYW5zZm9ybWVkIHJvdyBpbiBleGVjdXRpb24gb3JkZXIuXG4gICAqL1xuICBpdGVyYXRlUm93czxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyOiBSb3dQYXJzZXI8VD4sXG4gICk6IEFzeW5jR2VuZXJhdG9yPFQ+O1xuXG4gIC8qKlxuICAgKiBTaGFyZWQgaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVSb3dzfSBvdmVybG9hZHMuXG4gICAqXG4gICAqIERlbGVnYXRlcyB0byB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5pdGVyYXRlUGFnZXN9IHdoZW4gYHJvd1BhcnNlcmAgaXMgb21pdHRlZDsgb3RoZXJ3aXNlIHRvXG4gICAqIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc1dpdGh9LlxuICAgKi9cbiAgYXN5bmMgKml0ZXJhdGVSb3dzPFQ+KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICByb3dQYXJzZXI/OiBSb3dQYXJzZXI8VD4sXG4gICk6IEFzeW5jR2VuZXJhdG9yPFBhcnNlZFJvdyB8IFQ+IHtcbiAgICBjb25zdCBwYWdlcyA9IHJvd1BhcnNlclxuICAgICAgPyB0aGlzLml0ZXJhdGVQYWdlc1dpdGgocXVlcnlFeGVjdXRpb25JZCwgcm93UGFyc2VyKVxuICAgICAgOiB0aGlzLml0ZXJhdGVQYWdlcyhxdWVyeUV4ZWN1dGlvbklkKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgcGFnZSBvZiBwYWdlcykge1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGFnZS5yb3dzKSB7XG4gICAgICAgIHlpZWxkIHJvdztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYnVuZGxlZCBwYXJzZXIncyBtb3N0IHJlY2VudCBoZWFkZXItcm93IGRlY2lzaW9uLlxuICAgKlxuICAgKiBVc2VmdWwgd2hlbiB7QGxpbmsgUGFnZXJPcHRpb25zLnBhcnNlUmVzdWx0U2V0T3B0aW9uc30gdXNlcyBgc2tpcEhlYWRlclJvdzogJ2F1dG8nYC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxhc3Qge0BsaW5rIEhlYWRlclJvd0RlY2lzaW9ufSwgb3IgYG51bGxgIGJlZm9yZSBhbnkgcGFyc2Ugb24gdGhpcyBwYWdlci5cbiAgICovXG4gIGdldExhc3RIZWFkZXJSb3dEZWNpc2lvbigpOiBIZWFkZXJSb3dEZWNpc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5nZXRMYXN0SGVhZGVyUm93RGVjaXNpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGJ1bmRsZWQge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyfSBzdGF0ZSBzbyBoZWFkZXItcm93IGhhbmRsaW5nIGRvZXMgbm90IGxlYWsgYmV0d2VlbiBxdWVyaWVzLlxuICAgKlxuICAgKiBDYWxsIHdoZW4gcmV1c2luZyB0aGlzIHBhZ2VyIGZvciBhIGRpZmZlcmVudCBgcXVlcnlFeGVjdXRpb25JZGAgdGhhbiB0aGUgcHJldmlvdXMgcGFyc2Ugc2VxdWVuY2UuXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhcnNlci5yZXNldCgpO1xuICB9XG59XG5cbi8qKiBSZS1leHBvcnRzIHtAbGluayBRdWVyeVJlc3VsdFR5cGV9IGZyb20gYEBhd3Mtc2RrL2NsaWVudC1hdGhlbmFgLiAqL1xuZXhwb3J0IHsgUXVlcnlSZXN1bHRUeXBlIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWF0aGVuYSc7XG5leHBvcnQge1xuICBFWFRSQV9DT0xVTU5TX0tFWSxcbiAgaGVhZGVyc0Zyb21NZXRhLFxuICBpc0hlYWRlclJvdyxcbiAgcm93VG9PYmplY3QsXG4gIHJvd1RvVHlwZWRPYmplY3QsXG4gIHRvQm9vbGVhbixcbiAgdG9EYXRlLFxuICB0b051bWJlcixcbn0gZnJvbSAnYXRoZW5hLXF1ZXJ5LXJlc3VsdC1wYXJzZXInO1xuZXhwb3J0IHR5cGUge1xuICBBdGhlbmFUeXBlZFZhbHVlLFxuICBDb2x1bW5Db3VudE1pc21hdGNoQmVoYXZpb3IsXG4gIEhlYWRlclJvd0RlY2lzaW9uLFxuICBQYXJzZVJlc3VsdFNldE9wdGlvbnMsXG4gIFBhcnNlZFJvdyxcbiAgUm93UGFyc2VyLFxuICBUeXBlZFBhcnNlZFJvdyxcbn0gZnJvbSAnYXRoZW5hLXF1ZXJ5LXJlc3VsdC1wYXJzZXInOyJdfQ==
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWlJO0FBQ2pJLDJFQU1vQztBQUVwQyxrSEFBa0g7QUFDbEgsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsc0VBQXNFO0FBQ3RFLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixzRUFBc0U7QUFDdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBRTdCLHVFQUF1RTtBQUN2RSxNQUFNLHlCQUF5QixHQUFHLCtCQUFlLENBQUMsU0FBUyxDQUFDO0FBMkM1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFhLHNCQUFzQjtJQUVqQzs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFJLFVBQXlCO1FBQzdDLE9BQU8sVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7SUFDNUMsQ0FBQztJQWFEOzs7Ozs7T0FNRztJQUNILFlBQVksTUFBb0IsRUFBRSxVQUF3QixFQUFFO1FBa0I1RDs7Ozs7O1dBTUc7UUFDYyw2QkFBd0IsR0FBRyxDQUFDLGdCQUF3QixFQUFRLEVBQUU7WUFDN0UsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNsRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLENBQUM7WUFDRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUM7UUFDakQsQ0FBQyxDQUFDO1FBN0JBLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxHQUFHLGVBQWUsSUFBSSxVQUFVLEdBQUcsZUFBZSxFQUFF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QztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBalFELHdEQWlRQztBQUVELHdFQUF3RTtBQUN4RSx3REFBeUQ7QUFBaEQsZ0hBQUEsZUFBZSxPQUFBO0FBQ3hCLHlFQWFvQztBQVpsQywrSEFBQSxpQkFBaUIsT0FBQTtBQUNqQiw2SEFBQSxlQUFlLE9BQUE7QUFDZix5SEFBQSxXQUFXLE9BQUE7QUFDWCx3SUFBQSwwQkFBMEIsT0FBQTtBQUMxQixvSUFBQSxzQkFBc0IsT0FBQTtBQUN0QixnSUFBQSxrQkFBa0IsT0FBQTtBQUNsQixvSUFBQSxzQkFBc0IsT0FBQTtBQUN0Qix5SEFBQSxXQUFXLE9BQUE7QUFDWCw4SEFBQSxnQkFBZ0IsT0FBQTtBQUNoQix1SEFBQSxTQUFTLE9BQUE7QUFDVCxvSEFBQSxNQUFNLE9BQUE7QUFDTixzSEFBQSxRQUFRLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdGhlbmFDbGllbnQsIEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmQsIFF1ZXJ5UmVzdWx0VHlwZSwgdHlwZSBHZXRRdWVyeVJlc3VsdHNDb21tYW5kSW5wdXQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtYXRoZW5hJztcbmltcG9ydCB7XG4gIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLFxuICB0eXBlIEhlYWRlclJvd0RlY2lzaW9uLFxuICB0eXBlIFBhcnNlUmVzdWx0U2V0T3B0aW9ucyxcbiAgdHlwZSBQYXJzZWRSb3csXG4gIHR5cGUgUm93UGFyc2VyLFxufSBmcm9tICdhdGhlbmEtcXVlcnktcmVzdWx0LXBhcnNlcic7XG5cbi8qKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdCByb3dzIHJlcXVlc3RlZCBwZXIge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXJ9IEFQSSBjYWxsIChgTWF4UmVzdWx0c2ApLiAqL1xuY29uc3QgREVGQVVMVF9NQVhfUkVTVUxUUyA9IDEwMDA7XG4vKiogTWluaW11bSBgTWF4UmVzdWx0c2AgdmFsdWUgYWxsb3dlZCBieSBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2AuICovXG5jb25zdCBNSU5fTUFYX1JFU1VMVFMgPSAxO1xuLyoqIE1heGltdW0gYE1heFJlc3VsdHNgIHZhbHVlIGFsbG93ZWQgYnkgQXRoZW5hIGBHZXRRdWVyeVJlc3VsdHNgLiAqL1xuY29uc3QgTUFYX01BWF9SRVNVTFRTID0gMTAwMDtcblxuLyoqIERlZmF1bHQgYFF1ZXJ5UmVzdWx0VHlwZWAgZm9yd2FyZGVkIHRvIEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYC4gKi9cbmNvbnN0IERFRkFVTFRfUVVFUllfUkVTVUxUX1RZUEUgPSBRdWVyeVJlc3VsdFR5cGUuREFUQV9ST1dTO1xuXG4vKipcbiAqIE9uZSBwYWdlIG9mIEF0aGVuYSBxdWVyeSByZXN1bHRzIHJldHVybmVkIGJ5IHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyfSBhZnRlciBhIGZldGNoIG9yIGdlbmVyYXRvciBzdGVwLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFJvdyByZXByZXNlbnRhdGlvbjsgdXNlIHtAbGluayBQYXJzZWRSb3d9IG9yIGEgdHlwZSBwcm9kdWNlZCBieSB7QGxpbmsgUm93UGFyc2VyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlUmVzdWx0PFQ+IHtcbiAgLyoqIFBhcnNlZCByb3dzIGZvciB0aGlzIHBhZ2Ugb25seS4gKi9cbiAgcm93czogVFtdO1xuICAvKiogQ29udGludWF0aW9uIHRva2VuIGZvciB0aGUgZm9sbG93aW5nIHBhZ2UgKGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyB0aGUgbGFzdCBwYWdlKS4gKi9cbiAgbmV4dFRva2VuPzogc3RyaW5nO1xuICAvKiogU2FtZSBhcyBgcm93cy5sZW5ndGhgIGZvciBjb252ZW5pZW5jZS4gKi9cbiAgcm93Q291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTZXR0aW5ncyBhcHBsaWVkIHRvIGV2ZXJ5IGBHZXRRdWVyeVJlc3VsdHNgIGludm9jYXRpb24gbWFkZSBieSB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIGBNYXhSZXN1bHRzYCBwZXIgcmVxdWVzdCDigJQgbXVzdCBiZSBhbiBpbnRlZ2VyIGZyb20gMSB0aHJvdWdoIDEwMDAgKEF0aGVuYSBsaW1pdHMpLlxuICAgKiBAZGVmYXVsdFZhbHVlIDEwMDBcbiAgICovXG4gIG1heFJlc3VsdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2Age0BsaW5rIFF1ZXJ5UmVzdWx0VHlwZX0g4oCUIGFueSBtZW1iZXIgb2YgdGhlIEFXUyBTREsgZW51bVxuICAgKiAoZm9yIGV4YW1wbGUge0BsaW5rIFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX1JPV1N9IGZvciB0YWJ1bGFyIHJvd3Mgb3Ige0BsaW5rIFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX01BTklGRVNUfVxuICAgKiBmb3IgQ1RBUyAvIFVOTE9BRCAvIElOU0VSVCBtYW5pZmVzdCBvdXRwdXRzIHdoZW4gQXRoZW5hIHN1cHBvcnRzIHRoZW0pLlxuICAgKiBAZGVmYXVsdFZhbHVlIHtAbGluayBRdWVyeVJlc3VsdFR5cGUuREFUQV9ST1dTfVxuICAgKi9cbiAgcXVlcnlSZXN1bHRUeXBlPzogUXVlcnlSZXN1bHRUeXBlO1xuICAvKipcbiAgICogT3B0aW9ucyBmb3J3YXJkZWQgdG8gZXZlcnkge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLnBhcnNlUmVzdWx0U2V0fSAvXG4gICAqIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlci5wYXJzZVJlc3VsdFNldFdpdGh9IGNhbGwgKGZvciBleGFtcGxlXG4gICAqIGBjb2x1bW5Db3VudE1pc21hdGNoQmVoYXZpb3JgLCBgc2tpcEhlYWRlclJvd2AsIGBoZWFkZXJSb3dEZXRlY3Rpb25TdHJhdGVneWAsXG4gICAqIGB1bmF2YWlsYWJsZVJlc3VsdEJlaGF2aW9yYCwgYG1heFJvd3NgKS5cbiAgICpcbiAgICogQHNlZSBQYXJzZVJlc3VsdFNldE9wdGlvbnNcbiAgICovXG4gIHBhcnNlUmVzdWx0U2V0T3B0aW9ucz86IFBhcnNlUmVzdWx0U2V0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYWdpbmF0ZXMgQXRoZW5hIGBHZXRRdWVyeVJlc3VsdHNgIChBV1MgU0RLIGZvciBKYXZhU2NyaXB0IHYzKTogd2Fsa3MgYE5leHRUb2tlbmAgYW5kIHBhcnNlcyB0YWJ1bGFyIHJvd3Mgd2l0aFxuICogYGF0aGVuYS1xdWVyeS1yZXN1bHQtcGFyc2VyYCB3aGVuIG5lZWRlZC5cbiAqXG4gKiBQcm92aWRlcyBwYWlyZWQgQVBJcyBmb3IgcmF3IHtAbGluayBQYXJzZWRSb3d9IGFjY2VzcyB2ZXJzdXMgY3VzdG9tIHtAbGluayBSb3dQYXJzZXJ9IG1hcHBpbmcgYXQgdGhlIHBhZ2UgbGV2ZWxcbiAqIChgZmV0Y2hQYWdlYCAvIGBmZXRjaFBhZ2VXaXRoYCwgYGl0ZXJhdGVQYWdlc2AgLyBgaXRlcmF0ZVBhZ2VzV2l0aGApIGFuZCBhdCB0aGUgcm93IGxldmVsXG4gKiAoYGl0ZXJhdGVSb3dzYCB3aXRoIG9yIHdpdGhvdXQgYHJvd1BhcnNlcmApLlxuICpcbiAqIENvbnN0cnVjdG9yIGBtYXhSZXN1bHRzYCwgYHF1ZXJ5UmVzdWx0VHlwZWAsIGFuZCBvcHRpb25hbCBgcGFyc2VSZXN1bHRTZXRPcHRpb25zYCBhcmUgYXBwbGllZCBvbiBldmVyeVxuICogYEdldFF1ZXJ5UmVzdWx0c2AgcmVxdWVzdCBhbmQge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyfSBpbnZvY2F0aW9uIHJlc3BlY3RpdmVseS5cbiAqIFdoZW4gYHF1ZXJ5RXhlY3V0aW9uSWRgIGNoYW5nZXMgYmV0d2VlbiBmZXRjaGVzLCB0aGUgYnVuZGxlZCBwYXJzZXIgaXMgcmVzZXQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBEb2VzIG5vdCB3YWl0IGZvciBxdWVyeSBjb21wbGV0aW9uIG9yIGFkZCBBdGhlbmEtc3BlY2lmaWMgcmV0cnk6IGNhbGxlcnMgc2hvdWxkIHdhaXQgdW50aWwgdGhlIGV4ZWN1dGlvblxuICogc3VjY2VlZHMgKGZvciBleGFtcGxlIHZpYSBgR2V0UXVlcnlFeGVjdXRpb25gKSBhbmQgY29uZmlndXJlIFNESyAvIGFwcGxpY2F0aW9uLWxldmVsIHJldHJ5IGZvciB0aHJvdHRsaW5nLlxuICogQVdTIFNESyBlcnJvcnMgZnJvbSBgR2V0UXVlcnlSZXN1bHRzYCBhcmUgcHJvcGFnYXRlZCBhcyB0aHJvd24uXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvdjMvbGF0ZXN0L2NsaWVudC9hdGhlbmEvY29tbWFuZC9HZXRRdWVyeVJlc3VsdHNDb21tYW5kLyB8IEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmQgKEFXUyBTREspfVxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlSZXN1bHRQYWdlciB7XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhbm90aGVyIHJlc3VsdHMgcGFnZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBzYW1lIHF1ZXJ5IGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gUm93IHR5cGUgaGVsZCBpbiB7QGxpbmsgUGFnZVJlc3VsdC5yb3dzfS5cbiAgICogQHBhcmFtIHBhZ2VSZXN1bHQgLSBUaGUgbW9zdCByZWNlbnRseSByZXRyaWV2ZWQgcGFnZSBmcm9tIGBmZXRjaFBhZ2VgLCBgZmV0Y2hQYWdlV2l0aGAsIG9yIGEgcGFnZSBpdGVyYXRvci5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4ge0BsaW5rIFBhZ2VSZXN1bHQubmV4dFRva2VufSBpcyBkZWZpbmVkIGFuZCBhbm90aGVyIHBhZ2Ugc2hvdWxkIGJlIGZldGNoZWQuXG4gICAqL1xuICBzdGF0aWMgaGFzTmV4dFBhZ2U8VD4ocGFnZVJlc3VsdDogUGFnZVJlc3VsdDxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYWdlUmVzdWx0Lm5leHRUb2tlbiAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFNESyB2MyBjbGllbnQgdXNlZCBmb3IgZXZlcnkgYEdldFF1ZXJ5UmVzdWx0c2AgY2FsbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IEF0aGVuYUNsaWVudDtcbiAgLyoqIE5vcm1hbGl6ZWQgcGFnZXIgc2V0dGluZ3MgKGV2ZXJ5IGZpZWxkIHNldCBhZnRlciBtZXJnaW5nIGRlZmF1bHRzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxQaWNrPFBhZ2VyT3B0aW9ucywgJ21heFJlc3VsdHMnIHwgJ3F1ZXJ5UmVzdWx0VHlwZSc+PjtcbiAgLyoqIFBhcnNlciBvcHRpb25zIGFwcGxpZWQgb24gZXZlcnkgcGFnZSBwYXJzZSAodW5kZWZpbmVkIHVzZXMgcGFyc2VyIGRlZmF1bHRzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJzZVJlc3VsdFNldE9wdGlvbnM/OiBQYXJzZVJlc3VsdFNldE9wdGlvbnM7XG4gIC8qKiBTdGF0ZWZ1bCBwYXJzZXIgcmV1c2VkIGFjcm9zcyBwYWdlcyBvZiB0aGUgc2FtZSBleGVjdXRpb247IHJlc2V0IG9uIGV4ZWN1dGlvbiBjaGFuZ2Ugb3Ige0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIucmVzZXR9LiAqL1xuICBwcml2YXRlIHBhcnNlcjogQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXI7XG4gIC8qKiBMYXN0IGBxdWVyeUV4ZWN1dGlvbklkYCBwYXNzZWQgdG8gYGZldGNoUGFnZWAgLyBgZmV0Y2hQYWdlV2l0aGA7IHVzZWQgdG8gYXV0by1yZXNldCB0aGUgcGFyc2VyLiAqL1xuICBwcml2YXRlIGFjdGl2ZVF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBhZ2VyIGJvdW5kIHRvIGBjbGllbnRgIHdpdGggb3B0aW9uYWwgcGVyLXJlcXVlc3QgZGVmYXVsdHMuXG4gICAqXG4gICAqIEBwYXJhbSBjbGllbnQgLSBTREsgdjMgYEF0aGVuYUNsaWVudGAgdXNlZCB0byBjYWxsIGBHZXRRdWVyeVJlc3VsdHNgLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGBNYXhSZXN1bHRzYCwgYFF1ZXJ5UmVzdWx0VHlwZWAsIGFuZCBgUGFyc2VSZXN1bHRTZXRPcHRpb25zYDsgZGVmYXVsdHMgYXBwbHkgd2hlbiBvbWl0dGVkLlxuICAgKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBXaGVuIGBtYXhSZXN1bHRzYCBpcyBub3QgYW4gaW50ZWdlciBpbiBgMS4uMTAwMGAgaW5jbHVzaXZlLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY2xpZW50OiBBdGhlbmFDbGllbnQsIG9wdGlvbnM6IFBhZ2VyT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgbWF4UmVzdWx0cyA9IG9wdGlvbnMubWF4UmVzdWx0cyA/PyBERUZBVUxUX01BWF9SRVNVTFRTO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihtYXhSZXN1bHRzKSB8fCBtYXhSZXN1bHRzIDwgTUlOX01BWF9SRVNVTFRTIHx8IG1heFJlc3VsdHMgPiBNQVhfTUFYX1JFU1VMVFMpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICBgb3B0aW9ucy5tYXhSZXN1bHRzIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuICR7TUlOX01BWF9SRVNVTFRTfSBhbmQgJHtNQVhfTUFYX1JFU1VMVFN9LCBnb3QgJHtTdHJpbmcobWF4UmVzdWx0cyl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgbWF4UmVzdWx0cyxcbiAgICAgIHF1ZXJ5UmVzdWx0VHlwZTogb3B0aW9ucy5xdWVyeVJlc3VsdFR5cGUgPz8gREVGQVVMVF9RVUVSWV9SRVNVTFRfVFlQRSxcbiAgICB9O1xuICAgIHRoaXMucGFyc2VSZXN1bHRTZXRPcHRpb25zID0gb3B0aW9ucy5wYXJzZVJlc3VsdFNldE9wdGlvbnM7XG4gICAgLy8gRGVmYXVsdCByZXVzZVBvbGljeSBpcyAncGFnaW5hdGUnOiByZXRhaW4gaGVhZGVycyAvIGhlYWRlci1yb3ctZHJvcHBlZCBhY3Jvc3MgcGFnZXMgb2Ygb25lIHF1ZXJ5LlxuICAgIHRoaXMucGFyc2VyID0gQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXIuY3JlYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBidW5kbGVkIHBhcnNlciB3aGVuIGBxdWVyeUV4ZWN1dGlvbklkYCBkaWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIGZldGNoIHNlcXVlbmNlLlxuICAgKlxuICAgKiBTYW1lLWV4ZWN1dGlvbiBwYWdpbmF0aW9uICh3aXRoIGBuZXh0VG9rZW5gKSBrZWVwcyBwYXJzZXIgc3RhdGUgc28gaGVhZGVyLXJvdyBoYW5kbGluZyBzdGF5cyBjb3JyZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHVwY29taW5nIGZldGNoLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBlbnN1cmVQYXJzZXJGb3JFeGVjdXRpb24gPSAocXVlcnlFeGVjdXRpb25JZDogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuYWN0aXZlUXVlcnlFeGVjdXRpb25JZCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYWN0aXZlUXVlcnlFeGVjdXRpb25JZCAhPT0gcXVlcnlFeGVjdXRpb25JZCkge1xuICAgICAgdGhpcy5wYXJzZXIucmVzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVRdWVyeUV4ZWN1dGlvbklkID0gcXVlcnlFeGVjdXRpb25JZDtcbiAgfTtcblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgc2luZ2xlIHJlc3VsdHMgcGFnZSBhcyBkaWN0aW9uYXJ5LXNoYXBlZCB7QGxpbmsgUGFyc2VkUm93fSB2YWx1ZXMuXG4gICAqXG4gICAqIFVzZXMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLnBhcnNlUmVzdWx0U2V0fSBvbiB0aGUgQVdTIHJlc3BvbnNlLlxuICAgKiBXaGVuIGBxdWVyeUV4ZWN1dGlvbklkYCBkaWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIGZldGNoIHNlcXVlbmNlLCB0aGUgYnVuZGxlZCBwYXJzZXIgaXMgcmVzZXQgZmlyc3QuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gbmV4dFRva2VuIC0gUGFzcyBgdW5kZWZpbmVkYCBmaXJzdDsgc3Vic2VxdWVudCBjYWxscyB1c2Uge0BsaW5rIFBhZ2VSZXN1bHQubmV4dFRva2VufS5cbiAgICogQHJldHVybnMgUGFyc2VkIHJvd3MgcGx1cyBwYWdpbmF0aW9uIG1ldGFkYXRhIGZyb20gdGhpcyByZXNwb25zZSBvbmx5LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgaXMgZW1wdHkgb3Igd2hpdGVzcGFjZSBvbmx5LlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hQYWdlKFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICBuZXh0VG9rZW4/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8UGFnZVJlc3VsdDxQYXJzZWRSb3c+PiB7XG4gICAgaWYgKHF1ZXJ5RXhlY3V0aW9uSWQudHJpbSgpID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdxdWVyeUV4ZWN1dGlvbklkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgdGhpcy5lbnN1cmVQYXJzZXJGb3JFeGVjdXRpb24ocXVlcnlFeGVjdXRpb25JZCk7XG5cbiAgICBjb25zdCBpbnB1dDogR2V0UXVlcnlSZXN1bHRzQ29tbWFuZElucHV0ID0ge1xuICAgICAgUXVlcnlFeGVjdXRpb25JZDogcXVlcnlFeGVjdXRpb25JZCxcbiAgICAgIE5leHRUb2tlbjogbmV4dFRva2VuLFxuICAgICAgTWF4UmVzdWx0czogdGhpcy5vcHRpb25zLm1heFJlc3VsdHMsXG4gICAgICBRdWVyeVJlc3VsdFR5cGU6IHRoaXMub3B0aW9ucy5xdWVyeVJlc3VsdFR5cGUsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZChpbnB1dCkpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMucGFyc2VyLnBhcnNlUmVzdWx0U2V0KHJlc3BvbnNlLlJlc3VsdFNldCwgdGhpcy5wYXJzZVJlc3VsdFNldE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvd3MsXG4gICAgICBuZXh0VG9rZW46IHJlc3BvbnNlLk5leHRUb2tlbixcbiAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBvbmUgcGFnZSBhbmQgbWFwcyBlYWNoIHtAbGluayBQYXJzZWRSb3d9IHRocm91Z2ggYHJvd1BhcnNlcmAuXG4gICAqXG4gICAqIFVzZXMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLnBhcnNlUmVzdWx0U2V0V2l0aH0gb24gdGhlIEFXUyByZXNwb25zZS5cbiAgICogV2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgZGlmZmVycyBmcm9tIHRoZSBwcmV2aW91cyBmZXRjaCBzZXF1ZW5jZSwgdGhlIGJ1bmRsZWQgcGFyc2VyIGlzIHJlc2V0IGZpcnN0LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBPdXRwdXQgdHlwZSBwcm9kdWNlZCBieSBgcm93UGFyc2VyYC5cbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSByb3dQYXJzZXIgLSBDb252ZXJ0cyBlYWNoIGRpY3Rpb25hcnkgcm93IGludG8gYFRgLlxuICAgKiBAcGFyYW0gbmV4dFRva2VuIC0gUGFzcyBgdW5kZWZpbmVkYCBmaXJzdDsgc3Vic2VxdWVudCBjYWxscyB1c2Uge0BsaW5rIFBhZ2VSZXN1bHQubmV4dFRva2VufS5cbiAgICogQHJldHVybnMgVHJhbnNmb3JtZWQgcm93cyBwbHVzIHBhZ2luYXRpb24gbWV0YWRhdGEgZnJvbSB0aGlzIHJlc3BvbnNlIG9ubHkuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGBxdWVyeUV4ZWN1dGlvbklkYCBpcyBlbXB0eSBvciB3aGl0ZXNwYWNlIG9ubHkuXG4gICAqL1xuICBhc3luYyBmZXRjaFBhZ2VXaXRoPFQ+KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICByb3dQYXJzZXI6IFJvd1BhcnNlcjxUPixcbiAgICBuZXh0VG9rZW4/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8UGFnZVJlc3VsdDxUPj4ge1xuICAgIGlmIChxdWVyeUV4ZWN1dGlvbklkLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncXVlcnlFeGVjdXRpb25JZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cblxuICAgIHRoaXMuZW5zdXJlUGFyc2VyRm9yRXhlY3V0aW9uKHF1ZXJ5RXhlY3V0aW9uSWQpO1xuXG4gICAgY29uc3QgaW5wdXQ6IEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmRJbnB1dCA9IHtcbiAgICAgIFF1ZXJ5RXhlY3V0aW9uSWQ6IHF1ZXJ5RXhlY3V0aW9uSWQsXG4gICAgICBOZXh0VG9rZW46IG5leHRUb2tlbixcbiAgICAgIE1heFJlc3VsdHM6IHRoaXMub3B0aW9ucy5tYXhSZXN1bHRzLFxuICAgICAgUXVlcnlSZXN1bHRUeXBlOiB0aGlzLm9wdGlvbnMucXVlcnlSZXN1bHRUeXBlLFxuICAgIH07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQobmV3IEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmQoaW5wdXQpKTtcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnBhcnNlci5wYXJzZVJlc3VsdFNldFdpdGgoXG4gICAgICByZXNwb25zZS5SZXN1bHRTZXQsXG4gICAgICByb3dQYXJzZXIsXG4gICAgICB0aGlzLnBhcnNlUmVzdWx0U2V0T3B0aW9ucyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvd3MsXG4gICAgICBuZXh0VG9rZW46IHJlc3BvbnNlLk5leHRUb2tlbixcbiAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExhemlseSB3YWxrcyBhbGwgcGFnZXMgZm9yIGFuIGV4ZWN1dGlvbiwgeWllbGRpbmcgb25lIHtAbGluayBQYWdlUmVzdWx0fSBvZiB7QGxpbmsgUGFyc2VkUm93fSBwZXIgc3RlcC5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGlkZW50aWZpZXIuXG4gICAqIEB5aWVsZHMgT25lIHBhZ2UgYXQgYSB0aW1lIHVudGlsIEFXUyByZXR1cm5zIG5vIGBOZXh0VG9rZW5gLlxuICAgKi9cbiAgYXN5bmMgKml0ZXJhdGVQYWdlcyhcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICk6IEFzeW5jR2VuZXJhdG9yPFBhZ2VSZXN1bHQ8UGFyc2VkUm93Pj4ge1xuICAgIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLmZldGNoUGFnZShxdWVyeUV4ZWN1dGlvbklkLCBuZXh0VG9rZW4pO1xuICAgICAgeWllbGQgcGFnZTtcbiAgICAgIG5leHRUb2tlbiA9IHBhZ2UubmV4dFRva2VuO1xuICAgIH0gd2hpbGUgKG5leHRUb2tlbik7XG4gIH1cblxuICAvKipcbiAgICogU2FtZSBhcyB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5pdGVyYXRlUGFnZXN9IGJ1dCBtYXBzIGVhY2ggcm93IHRocm91Z2ggYHJvd1BhcnNlcmAgb24gZXZlcnkgcGFnZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gT3V0cHV0IHR5cGUgZW1pdHRlZCBpbiB7QGxpbmsgUGFnZVJlc3VsdC5yb3dzfS5cbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSByb3dQYXJzZXIgLSBDb252ZXJ0cyBlYWNoIHBhcnNlZCByb3cgaW50byBgVGAuXG4gICAqIEB5aWVsZHMgU3VjY2Vzc2l2ZSB7QGxpbmsgUGFnZVJlc3VsdH0gdmFsdWVzIHdob3NlIGByb3dzYCBhcmUgdHlwZWQgYXMgYFRgLlxuICAgKi9cbiAgYXN5bmMgKml0ZXJhdGVQYWdlc1dpdGg8VD4oXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICAgIHJvd1BhcnNlcjogUm93UGFyc2VyPFQ+LFxuICApOiBBc3luY0dlbmVyYXRvcjxQYWdlUmVzdWx0PFQ+PiB7XG4gICAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMuZmV0Y2hQYWdlV2l0aChxdWVyeUV4ZWN1dGlvbklkLCByb3dQYXJzZXIsIG5leHRUb2tlbik7XG4gICAgICB5aWVsZCBwYWdlO1xuICAgICAgbmV4dFRva2VuID0gcGFnZS5uZXh0VG9rZW47XG4gICAgfSB3aGlsZSAobmV4dFRva2VuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0dGVucyB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5pdGVyYXRlUGFnZXN9IGludG8gaW5kaXZpZHVhbCB7QGxpbmsgUGFyc2VkUm93fSB2YWx1ZXMgKG9uZSByb3cgcGVyIGBuZXh0KClgKS5cbiAgICpcbiAgICogT25seSBvbmUgcGFnZSBvZiByb3dzIGlzIGhlbGQgaW4gbWVtb3J5IGF0IGEgdGltZS5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGlkZW50aWZpZXIuXG4gICAqIEB5aWVsZHMgRWFjaCBkaWN0aW9uYXJ5LXNoYXBlZCByb3cgaW4gZXhlY3V0aW9uIG9yZGVyLlxuICAgKi9cbiAgaXRlcmF0ZVJvd3MoXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICApOiBBc3luY0dlbmVyYXRvcjxQYXJzZWRSb3c+O1xuXG4gIC8qKlxuICAgKiBGbGF0dGVucyB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5pdGVyYXRlUGFnZXNXaXRofSBpbnRvIGluZGl2aWR1YWwgYFRgIHZhbHVlcyAob25lIHJvdyBwZXIgYG5leHQoKWApLlxuICAgKlxuICAgKiBPbmx5IG9uZSBwYWdlIG9mIHJvd3MgaXMgaGVsZCBpbiBtZW1vcnkgYXQgYSB0aW1lLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBPdXRwdXQgdHlwZSBwcm9kdWNlZCBieSBgcm93UGFyc2VyYC5cbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSByb3dQYXJzZXIgLSBDb252ZXJ0cyBlYWNoIHBhcnNlZCByb3cgaW50byBgVGAuXG4gICAqIEB5aWVsZHMgRWFjaCB0cmFuc2Zvcm1lZCByb3cgaW4gZXhlY3V0aW9uIG9yZGVyLlxuICAgKi9cbiAgaXRlcmF0ZVJvd3M8VD4oXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICAgIHJvd1BhcnNlcjogUm93UGFyc2VyPFQ+LFxuICApOiBBc3luY0dlbmVyYXRvcjxUPjtcblxuICAvKipcbiAgICogU2hhcmVkIGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5pdGVyYXRlUm93c30gb3ZlcmxvYWRzLlxuICAgKlxuICAgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVBhZ2VzfSB3aGVuIGByb3dQYXJzZXJgIGlzIG9taXR0ZWQ7IG90aGVyd2lzZSB0b1xuICAgKiB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5pdGVyYXRlUGFnZXNXaXRofS5cbiAgICovXG4gIGFzeW5jICppdGVyYXRlUm93czxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyPzogUm93UGFyc2VyPFQ+LFxuICApOiBBc3luY0dlbmVyYXRvcjxQYXJzZWRSb3cgfCBUPiB7XG4gICAgY29uc3QgcGFnZXMgPSByb3dQYXJzZXJcbiAgICAgID8gdGhpcy5pdGVyYXRlUGFnZXNXaXRoKHF1ZXJ5RXhlY3V0aW9uSWQsIHJvd1BhcnNlcilcbiAgICAgIDogdGhpcy5pdGVyYXRlUGFnZXMocXVlcnlFeGVjdXRpb25JZCk7XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHBhZ2Uucm93cykge1xuICAgICAgICB5aWVsZCByb3c7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGJ1bmRsZWQgcGFyc2VyJ3MgbW9zdCByZWNlbnQgaGVhZGVyLXJvdyBkZWNpc2lvbi5cbiAgICpcbiAgICogVXNlZnVsIHdoZW4ge0BsaW5rIFBhZ2VyT3B0aW9ucy5wYXJzZVJlc3VsdFNldE9wdGlvbnN9IHVzZXMgYHNraXBIZWFkZXJSb3c6ICdhdXRvJ2AuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsYXN0IHtAbGluayBIZWFkZXJSb3dEZWNpc2lvbn0sIG9yIGBudWxsYCBiZWZvcmUgYW55IHBhcnNlIC8gYWZ0ZXIge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIucmVzZXR9LlxuICAgKi9cbiAgZ2V0TGFzdEhlYWRlclJvd0RlY2lzaW9uKCk6IEhlYWRlclJvd0RlY2lzaW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmdldExhc3RIZWFkZXJSb3dEZWNpc2lvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgYnVuZGxlZCB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXJ9IHN0YXRlIGFuZCB0aGUgdHJhY2tlZCBhY3RpdmUgZXhlY3V0aW9uIGlkLlxuICAgKlxuICAgKiBVc3VhbGx5IHVubmVjZXNzYXJ5OiB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5mZXRjaFBhZ2V9IGFuZCB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5mZXRjaFBhZ2VXaXRofVxuICAgKiByZXNldCBhdXRvbWF0aWNhbGx5IHdoZW4gYHF1ZXJ5RXhlY3V0aW9uSWRgIGNoYW5nZXMuIENhbGwgZXhwbGljaXRseSB0byBjbGVhciBzdGF0ZSB3aXRob3V0IHN0YXJ0aW5nIGEgbmV3IGZldGNoXG4gICAqIChmb3IgZXhhbXBsZSBzbyB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5nZXRMYXN0SGVhZGVyUm93RGVjaXNpb259IHJldHVybnMgYG51bGxgKS5cbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMucGFyc2VyLnJlc2V0KCk7XG4gICAgdGhpcy5hY3RpdmVRdWVyeUV4ZWN1dGlvbklkID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBSZS1leHBvcnRzIHtAbGluayBRdWVyeVJlc3VsdFR5cGV9IGZyb20gYEBhd3Mtc2RrL2NsaWVudC1hdGhlbmFgLiAqL1xuZXhwb3J0IHsgUXVlcnlSZXN1bHRUeXBlIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWF0aGVuYSc7XG5leHBvcnQge1xuICBFWFRSQV9DT0xVTU5TX0tFWSxcbiAgaGVhZGVyc0Zyb21NZXRhLFxuICBpc0hlYWRlclJvdyxcbiAgcGFyc2VSZXN1bHRTZXREZXRhaWxlZE9uY2UsXG4gIHBhcnNlUmVzdWx0U2V0SXRlck9uY2UsXG4gIHBhcnNlUmVzdWx0U2V0T25jZSxcbiAgcGFyc2VSZXN1bHRTZXRXaXRoT25jZSxcbiAgcm93VG9PYmplY3QsXG4gIHJvd1RvVHlwZWRPYmplY3QsXG4gIHRvQm9vbGVhbixcbiAgdG9EYXRlLFxuICB0b051bWJlcixcbn0gZnJvbSAnYXRoZW5hLXF1ZXJ5LXJlc3VsdC1wYXJzZXInO1xuZXhwb3J0IHR5cGUge1xuICBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlck9wdGlvbnMsXG4gIEF0aGVuYVR5cGVkVmFsdWUsXG4gIENvbHVtbkNvdW50TWlzbWF0Y2hCZWhhdmlvcixcbiAgSGVhZGVyUm93RGVjaXNpb24sXG4gIE1heFJvd3NFeGNlZWRlZEJlaGF2aW9yLFxuICBQYXJzZVJlc3VsdFNldERpYWdub3N0aWNzLFxuICBQYXJzZVJlc3VsdFNldERldGFpbGVkUmVzdWx0LFxuICBQYXJzZVJlc3VsdFNldE9wdGlvbnMsXG4gIFBhcnNlUmVzdWx0U2V0VW5hdmFpbGFibGVSZWFzb24sXG4gIFBhcnNlZFJvdyxcbiAgUGFyc2VyUmV1c2VQb2xpY3ksXG4gIFJvd1BhcnNlcixcbiAgVHlwZWRQYXJzZWRSb3csXG4gIFVuYXZhaWxhYmxlUmVzdWx0QmVoYXZpb3IsXG59IGZyb20gJ2F0aGVuYS1xdWVyeS1yZXN1bHQtcGFyc2VyJzsiXX0=
|
package/package.json
CHANGED
|
@@ -47,11 +47,11 @@
|
|
|
47
47
|
"projen": "^0.101.20",
|
|
48
48
|
"ts-jest": "^29.4.12",
|
|
49
49
|
"ts-node": "^10.9.2",
|
|
50
|
-
"typescript": "
|
|
50
|
+
"typescript": "6.0.x"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"@aws-sdk/client-athena": "^3.983.0",
|
|
54
|
-
"athena-query-result-parser": "^0.
|
|
54
|
+
"athena-query-result-parser": "^0.5.0"
|
|
55
55
|
},
|
|
56
56
|
"keywords": [
|
|
57
57
|
"athena",
|
|
@@ -66,8 +66,7 @@
|
|
|
66
66
|
},
|
|
67
67
|
"devEngines": {
|
|
68
68
|
"packageManager": {
|
|
69
|
-
"name": "
|
|
70
|
-
"version": "1.22.22",
|
|
69
|
+
"name": "npm",
|
|
71
70
|
"onFail": "ignore"
|
|
72
71
|
}
|
|
73
72
|
},
|
|
@@ -76,7 +75,7 @@
|
|
|
76
75
|
"publishConfig": {
|
|
77
76
|
"access": "public"
|
|
78
77
|
},
|
|
79
|
-
"version": "0.
|
|
78
|
+
"version": "0.5.1",
|
|
80
79
|
"jest": {
|
|
81
80
|
"coverageProvider": "v8",
|
|
82
81
|
"testMatch": [
|