athena-query-execution-waiter 0.3.13 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -33
- package/lib/index.d.ts +24 -4
- package/lib/index.js +22 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
# Athena Query Execution Waiter
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/athena-query-execution-waiter)
|
|
4
|
+
[](https://github.com/gammarers-aws-sdk-extensions/athena-query-execution-waiter/blob/main/LICENSE)
|
|
5
|
+
|
|
3
6
|
A small library that waits for an AWS Athena query execution to complete. It polls the Athena API until the execution reaches a terminal state: **SUCCEEDED**, **FAILED**, or **CANCELLED**.
|
|
4
7
|
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
- Polls `GetQueryExecution` until the run finishes or an **overall wall-clock timeout** is exceeded (separate from **polling interval**).
|
|
11
|
+
- Configurable **overall timeout** and **poll spacing** via `wait()` options; default overall cap is **`DEFAULT_TIMEOUT_MS`** (2 minutes).
|
|
12
|
+
- Typed errors: **`AthenaQueryExecutionWaiterTimeoutError`**, **`AthenaQueryExecutionWaiterStateError`** (failed or cancelled runs).
|
|
13
|
+
- Built for **AWS SDK for JavaScript v3** (`@aws-sdk/client-athena`).
|
|
14
|
+
|
|
5
15
|
## Installation
|
|
6
16
|
|
|
7
17
|
**@aws-sdk/client-athena** is a normal **dependency** of this package: installing `athena-query-execution-waiter` pulls in a compatible AWS SDK v3 Athena client. If your app also depends on `@aws-sdk/client-athena`, npm/yarn will dedupe when versions are compatible; otherwise you may have two copies under different semver ranges.
|
|
@@ -29,6 +39,7 @@ npm install athena-query-execution-waiter
|
|
|
29
39
|
import { AthenaClient } from '@aws-sdk/client-athena';
|
|
30
40
|
import {
|
|
31
41
|
AthenaQueryExecutionWaiter,
|
|
42
|
+
DEFAULT_TIMEOUT_MS,
|
|
32
43
|
AthenaQueryExecutionWaiterTimeoutError,
|
|
33
44
|
AthenaQueryExecutionWaiterStateError,
|
|
34
45
|
} from 'athena-query-execution-waiter';
|
|
@@ -36,7 +47,7 @@ import {
|
|
|
36
47
|
const client = new AthenaClient({ region: 'us-east-1' });
|
|
37
48
|
const waiter = new AthenaQueryExecutionWaiter(client);
|
|
38
49
|
|
|
39
|
-
//
|
|
50
|
+
// After StartQueryExecution, wait until the execution completes
|
|
40
51
|
const queryExecutionId = 'your-query-execution-id';
|
|
41
52
|
|
|
42
53
|
try {
|
|
@@ -53,59 +64,70 @@ try {
|
|
|
53
64
|
}
|
|
54
65
|
```
|
|
55
66
|
|
|
56
|
-
###
|
|
67
|
+
### Overall timeout vs polling interval
|
|
68
|
+
|
|
69
|
+
| | Meaning |
|
|
70
|
+
|---|--------|
|
|
71
|
+
| **`waitOptions.timeoutMs` / `DEFAULT_TIMEOUT_MS`** | **Overall** wall-clock limit from when `wait()` starts until **SUCCEEDED**, **FAILED**, or **CANCELLED** (or this cap is exceeded). Omit `timeoutMs` to use `DEFAULT_TIMEOUT_MS`. This is **not** how often Athena is polled. |
|
|
72
|
+
| **`pollIntervalMs`** | Delay **between** `GetQueryExecution` calls. Independent of the overall timeout; a long poll interval still respects `waitOptions.timeoutMs` / `DEFAULT_TIMEOUT_MS`. |
|
|
57
73
|
|
|
58
|
-
|
|
74
|
+
Long-running jobs should pass a higher `timeoutMs` when needed:
|
|
59
75
|
|
|
60
76
|
```typescript
|
|
61
|
-
const state = await waiter.wait(queryExecutionId,
|
|
77
|
+
const state = await waiter.wait(queryExecutionId, {
|
|
78
|
+
timeoutMs: 15 * 60_000, // 15 minutes overall
|
|
79
|
+
});
|
|
62
80
|
```
|
|
63
81
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
The default polling interval is 1 second. For long-running queries, you can increase it to reduce API calls. Set it at construction time or per `wait()` call:
|
|
82
|
+
Default polling interval is **1 second**. Increase it to reduce API calls (constructor or per `wait()`):
|
|
67
83
|
|
|
68
84
|
```typescript
|
|
69
|
-
// Waiter-wide: poll every 5 seconds
|
|
70
85
|
const waiter = new AthenaQueryExecutionWaiter(client, { pollIntervalMs: 5000 });
|
|
71
86
|
|
|
72
|
-
|
|
73
|
-
|
|
87
|
+
const state = await waiter.wait(queryExecutionId, {
|
|
88
|
+
timeoutMs: 60_000,
|
|
89
|
+
pollIntervalMs: 3000,
|
|
90
|
+
});
|
|
74
91
|
```
|
|
75
92
|
|
|
76
|
-
##
|
|
93
|
+
## Options
|
|
94
|
+
|
|
95
|
+
### `AthenaQueryExecutionWaiterOptions` (constructor)
|
|
96
|
+
|
|
97
|
+
Passed to `new AthenaQueryExecutionWaiter(client, options?)`.
|
|
98
|
+
|
|
99
|
+
| Option | Type | Description |
|
|
100
|
+
|--------|------|-------------|
|
|
101
|
+
| `pollIntervalMs` | `number` (optional) | Default milliseconds **between** `GetQueryExecution` calls when `wait()` omits `pollIntervalMs`. Default: `1000`. |
|
|
102
|
+
|
|
103
|
+
### `AthenaQueryExecutionWaitOptions` (`wait()`)
|
|
104
|
+
|
|
105
|
+
Passed to `wait(queryExecutionId, waitOptions?)`.
|
|
106
|
+
|
|
107
|
+
| Option | Type | Description |
|
|
108
|
+
|--------|------|-------------|
|
|
109
|
+
| `timeoutMs` | `number` (optional) | **Overall** wall-clock timeout in ms from the start of `wait()` until a terminal state. Default: `DEFAULT_TIMEOUT_MS` (**2 minutes**). |
|
|
110
|
+
| `pollIntervalMs` | `number` (optional) | Milliseconds **between** polls for this call. Default: constructor’s `pollIntervalMs` or `1000`. |
|
|
111
|
+
|
|
112
|
+
## API reference
|
|
77
113
|
|
|
78
114
|
### `AthenaQueryExecutionWaiter`
|
|
79
115
|
|
|
80
116
|
- **Constructor:** `new AthenaQueryExecutionWaiter(client: AthenaClient, options?: AthenaQueryExecutionWaiterOptions)`
|
|
81
|
-
|
|
82
|
-
- `
|
|
83
|
-
|
|
84
|
-
- **`wait(queryExecutionId: string, timeoutMs?: number, waitOptions?: AthenaQueryExecutionWaitOptions): Promise<QueryExecutionState>`**
|
|
85
|
-
- Polls the query execution status until it completes.
|
|
86
|
-
- **Returns** the execution state (`SUCCEEDED`) on success.
|
|
87
|
-
- **Throws** `AthenaQueryExecutionWaiterTimeoutError` if the timeout is exceeded.
|
|
117
|
+
- **`wait(queryExecutionId: string, waitOptions?: AthenaQueryExecutionWaitOptions): Promise<QueryExecutionState>`**
|
|
118
|
+
- **Returns** `SUCCEEDED` on success.
|
|
119
|
+
- **Throws** `AthenaQueryExecutionWaiterTimeoutError` if overall wait exceeds the effective timeout.
|
|
88
120
|
- **Throws** `AthenaQueryExecutionWaiterStateError` when the state is `FAILED` or `CANCELLED`.
|
|
89
|
-
- `timeoutMs` defaults to 10,000 ms when omitted.
|
|
90
|
-
- `waitOptions.pollIntervalMs` – Optional. Overrides the polling interval for this call (default: use constructor value or 1000).
|
|
91
121
|
|
|
92
|
-
###
|
|
122
|
+
### Constants
|
|
93
123
|
|
|
94
|
-
- **`
|
|
95
|
-
- **`AthenaQueryExecutionWaitOptions`** – `{ pollIntervalMs?: number }` (options for `wait()`).
|
|
124
|
+
- **`DEFAULT_TIMEOUT_MS`** — Default overall wait cap in milliseconds (2 minutes) when `waitOptions.timeoutMs` is omitted. Safe to import for your own guards or logging.
|
|
96
125
|
|
|
97
126
|
### Errors
|
|
98
127
|
|
|
99
|
-
- **`AthenaQueryExecutionWaiterError`**
|
|
100
|
-
|
|
101
|
-
- **`
|
|
102
|
-
- Extends `AthenaQueryExecutionWaiterError`.
|
|
103
|
-
- Constructor: `(elapsedTime: number)`.
|
|
104
|
-
|
|
105
|
-
- **`AthenaQueryExecutionWaiterStateError`** – Thrown when the query ends in `FAILED` or `CANCELLED`.
|
|
106
|
-
- Extends `AthenaQueryExecutionWaiterError`.
|
|
107
|
-
- Properties: `state` (`QueryExecutionState`), `reason` (string).
|
|
108
|
-
- Constructor: `(state: QueryExecutionState, reason?: string)`.
|
|
128
|
+
- **`AthenaQueryExecutionWaiterError`** — Base class for waiter errors.
|
|
129
|
+
- **`AthenaQueryExecutionWaiterTimeoutError`** — Overall elapsed time since `wait()` started exceeded `waitOptions.timeoutMs` or `DEFAULT_TIMEOUT_MS`. Constructor: `(elapsedTime: number)`.
|
|
130
|
+
- **`AthenaQueryExecutionWaiterStateError`** — Query ended in `FAILED` or `CANCELLED`. Properties: `state`, `reason`. Constructor: `(state: QueryExecutionState, reason?: string)`.
|
|
109
131
|
|
|
110
132
|
## License
|
|
111
133
|
|
package/lib/index.d.ts
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import { QueryExecutionState, AthenaClient } from '@aws-sdk/client-athena';
|
|
2
|
+
/**
|
|
3
|
+
* Default overall wait timeout (milliseconds) when `wait()` is called without
|
|
4
|
+
* `waitOptions.timeoutMs`.
|
|
5
|
+
* This caps total wall-clock time from the start of `wait()` until a terminal state
|
|
6
|
+
* (or error)—it is not the delay between polls (`pollIntervalMs`).
|
|
7
|
+
*
|
|
8
|
+
* **Why 2 minutes:** Athena often exceeds a few seconds (queueing, cold start, moderate
|
|
9
|
+
* scans). Ten seconds fails too often as a library default; unbounded or very large
|
|
10
|
+
* defaults risk hanging callers. Two minutes is a practical middle ground—tight enough
|
|
11
|
+
* to surface stuck work, long enough for many interactive workloads. Use a larger
|
|
12
|
+
* `wait(..., { timeoutMs })` for heavy analytics or ETL.
|
|
13
|
+
*/
|
|
14
|
+
export declare const DEFAULT_TIMEOUT_MS: number;
|
|
2
15
|
/** Options for AthenaQueryExecutionWaiter constructor. */
|
|
3
16
|
export interface AthenaQueryExecutionWaiterOptions {
|
|
4
17
|
/**
|
|
@@ -10,6 +23,12 @@ export interface AthenaQueryExecutionWaiterOptions {
|
|
|
10
23
|
}
|
|
11
24
|
/** Options for wait(). */
|
|
12
25
|
export interface AthenaQueryExecutionWaitOptions {
|
|
26
|
+
/**
|
|
27
|
+
* Overall wall-clock timeout in milliseconds for this wait (from the start of `wait()`
|
|
28
|
+
* until a terminal state). Not the delay between polls.
|
|
29
|
+
* Defaults to {@link DEFAULT_TIMEOUT_MS} when omitted.
|
|
30
|
+
*/
|
|
31
|
+
timeoutMs?: number;
|
|
13
32
|
/**
|
|
14
33
|
* Polling interval in milliseconds for this wait.
|
|
15
34
|
* Overrides the waiter's default poll interval when specified.
|
|
@@ -19,26 +38,27 @@ export interface AthenaQueryExecutionWaitOptions {
|
|
|
19
38
|
/**
|
|
20
39
|
* Waits for Athena query execution to complete.
|
|
21
40
|
* Polls execution status until it becomes SUCCEEDED, FAILED, or CANCELLED.
|
|
41
|
+
* Overall time is bounded by `waitOptions.timeoutMs` (or {@link DEFAULT_TIMEOUT_MS});
|
|
42
|
+
* spacing between polls is controlled separately by `pollIntervalMs`.
|
|
22
43
|
*/
|
|
23
44
|
export declare class AthenaQueryExecutionWaiter {
|
|
24
45
|
private readonly client;
|
|
25
46
|
private readonly defaultPollIntervalMs;
|
|
26
47
|
/**
|
|
27
48
|
* @param client Athena API client
|
|
28
|
-
* @param options Optional settings (e.g. pollIntervalMs
|
|
49
|
+
* @param options Optional settings (e.g. pollIntervalMs)
|
|
29
50
|
*/
|
|
30
51
|
constructor(client: AthenaClient, options?: AthenaQueryExecutionWaiterOptions);
|
|
31
52
|
/**
|
|
32
53
|
* Waits until the given query execution completes (or fails/cancels).
|
|
33
54
|
*
|
|
34
55
|
* @param queryExecutionId Query execution ID to wait for
|
|
35
|
-
* @param
|
|
36
|
-
* @param waitOptions Optional per-call options (e.g. pollIntervalMs overrides default)
|
|
56
|
+
* @param waitOptions Optional per-call settings (`timeoutMs`, `pollIntervalMs`)
|
|
37
57
|
* @returns Execution state on success (SUCCEEDED)
|
|
38
58
|
* @throws AthenaQueryExecutionWaiterTimeoutError On timeout
|
|
39
59
|
* @throws AthenaQueryExecutionWaiterStateError When state is FAILED or CANCELLED
|
|
40
60
|
*/
|
|
41
|
-
wait(queryExecutionId: string,
|
|
61
|
+
wait(queryExecutionId: string, waitOptions?: AthenaQueryExecutionWaitOptions): Promise<QueryExecutionState>;
|
|
42
62
|
}
|
|
43
63
|
/**
|
|
44
64
|
* Base error for Athena query execution waiter.
|
package/lib/index.js
CHANGED
|
@@ -1,19 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AthenaQueryExecutionWaiterStateError = exports.AthenaQueryExecutionWaiterTimeoutError = exports.AthenaQueryExecutionWaiterError = exports.AthenaQueryExecutionWaiter = void 0;
|
|
3
|
+
exports.AthenaQueryExecutionWaiterStateError = exports.AthenaQueryExecutionWaiterTimeoutError = exports.AthenaQueryExecutionWaiterError = exports.AthenaQueryExecutionWaiter = exports.DEFAULT_TIMEOUT_MS = void 0;
|
|
4
4
|
const client_athena_1 = require("@aws-sdk/client-athena");
|
|
5
5
|
/** Default polling interval (milliseconds) for query execution status. */
|
|
6
6
|
const DEFAULT_POLL_INTERVAL_MS = 1000;
|
|
7
|
-
/**
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Default overall wait timeout (milliseconds) when `wait()` is called without
|
|
9
|
+
* `waitOptions.timeoutMs`.
|
|
10
|
+
* This caps total wall-clock time from the start of `wait()` until a terminal state
|
|
11
|
+
* (or error)—it is not the delay between polls (`pollIntervalMs`).
|
|
12
|
+
*
|
|
13
|
+
* **Why 2 minutes:** Athena often exceeds a few seconds (queueing, cold start, moderate
|
|
14
|
+
* scans). Ten seconds fails too often as a library default; unbounded or very large
|
|
15
|
+
* defaults risk hanging callers. Two minutes is a practical middle ground—tight enough
|
|
16
|
+
* to surface stuck work, long enough for many interactive workloads. Use a larger
|
|
17
|
+
* `wait(..., { timeoutMs })` for heavy analytics or ETL.
|
|
18
|
+
*/
|
|
19
|
+
exports.DEFAULT_TIMEOUT_MS = 2 * 60 * 1000;
|
|
9
20
|
/**
|
|
10
21
|
* Waits for Athena query execution to complete.
|
|
11
22
|
* Polls execution status until it becomes SUCCEEDED, FAILED, or CANCELLED.
|
|
23
|
+
* Overall time is bounded by `waitOptions.timeoutMs` (or {@link DEFAULT_TIMEOUT_MS});
|
|
24
|
+
* spacing between polls is controlled separately by `pollIntervalMs`.
|
|
12
25
|
*/
|
|
13
26
|
class AthenaQueryExecutionWaiter {
|
|
14
27
|
/**
|
|
15
28
|
* @param client Athena API client
|
|
16
|
-
* @param options Optional settings (e.g. pollIntervalMs
|
|
29
|
+
* @param options Optional settings (e.g. pollIntervalMs)
|
|
17
30
|
*/
|
|
18
31
|
constructor(client, options) {
|
|
19
32
|
this.client = client;
|
|
@@ -23,18 +36,18 @@ class AthenaQueryExecutionWaiter {
|
|
|
23
36
|
* Waits until the given query execution completes (or fails/cancels).
|
|
24
37
|
*
|
|
25
38
|
* @param queryExecutionId Query execution ID to wait for
|
|
26
|
-
* @param
|
|
27
|
-
* @param waitOptions Optional per-call options (e.g. pollIntervalMs overrides default)
|
|
39
|
+
* @param waitOptions Optional per-call settings (`timeoutMs`, `pollIntervalMs`)
|
|
28
40
|
* @returns Execution state on success (SUCCEEDED)
|
|
29
41
|
* @throws AthenaQueryExecutionWaiterTimeoutError On timeout
|
|
30
42
|
* @throws AthenaQueryExecutionWaiterStateError When state is FAILED or CANCELLED
|
|
31
43
|
*/
|
|
32
|
-
async wait(queryExecutionId,
|
|
44
|
+
async wait(queryExecutionId, waitOptions) {
|
|
45
|
+
const effectiveTimeoutMs = waitOptions?.timeoutMs ?? exports.DEFAULT_TIMEOUT_MS;
|
|
33
46
|
const pollIntervalMs = waitOptions?.pollIntervalMs ?? this.defaultPollIntervalMs;
|
|
34
47
|
const startTime = Date.now();
|
|
35
48
|
do {
|
|
36
49
|
const elapsedTime = Date.now() - startTime;
|
|
37
|
-
if (elapsedTime >
|
|
50
|
+
if (elapsedTime > effectiveTimeoutMs) {
|
|
38
51
|
throw new AthenaQueryExecutionWaiterTimeoutError(elapsedTime);
|
|
39
52
|
}
|
|
40
53
|
const res = await this.client.send(new client_athena_1.GetQueryExecutionCommand({
|
|
@@ -96,4 +109,4 @@ class AthenaQueryExecutionWaiterStateError extends AthenaQueryExecutionWaiterErr
|
|
|
96
109
|
}
|
|
97
110
|
}
|
|
98
111
|
exports.AthenaQueryExecutionWaiterStateError = AthenaQueryExecutionWaiterStateError;
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQXFHO0FBRXJHLDBFQUEwRTtBQUMxRSxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQztBQUV0QyxrRkFBa0Y7QUFDbEYsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBcUJyQzs7O0dBR0c7QUFDSCxNQUFhLDBCQUEwQjtJQUlyQzs7O09BR0c7SUFDSCxZQUNtQixNQUFvQixFQUNyQyxPQUEyQztRQUQxQixXQUFNLEdBQU4sTUFBTSxDQUFjO1FBR3JDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxPQUFPLEVBQUUsY0FBYyxJQUFJLHdCQUF3QixDQUFDO0lBQ25GLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUNSLGdCQUF3QixFQUN4QixZQUFvQixrQkFBa0IsRUFDdEMsV0FBNkM7UUFFN0MsTUFBTSxjQUFjLEdBQUcsV0FBVyxFQUFFLGNBQWMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDakYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLEdBQUcsQ0FBQztZQUNGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7WUFDM0MsSUFBSSxXQUFXLEdBQUcsU0FBUyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxzQ0FBc0MsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBRUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLHdDQUF3QixDQUFDO2dCQUM5RCxnQkFBZ0IsRUFBRSxnQkFBZ0I7YUFDbkMsQ0FBQyxDQUFDLENBQUM7WUFDSixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQztZQUN0QyxNQUFNLEtBQUssR0FBRyxFQUFFLEVBQUUsS0FBd0MsQ0FBQztZQUMzRCxNQUFNLE1BQU0sR0FBRyxFQUFFLEVBQUUsaUJBQWlCLENBQUM7WUFFckMsSUFBSSxLQUFLLEtBQUssbUNBQW1CLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzVDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELElBQUksS0FBSyxLQUFLLG1DQUFtQixDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssbUNBQW1CLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3BGLE1BQU0sSUFBSSxvQ0FBb0MsQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFDRCxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxRQUFRLElBQUksRUFBRTtJQUNqQixDQUFDO0NBQ0Y7QUF0REQsZ0VBc0RDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLCtCQUFnQyxTQUFRLEtBQUs7SUFFeEQ7O09BRUc7SUFDSCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxpQ0FBaUMsQ0FBQztJQUNoRCxDQUFDO0NBQ0Y7QUFURCwwRUFTQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxzQ0FBdUMsU0FBUSwrQkFBK0I7SUFFekY7O09BRUc7SUFDSCxZQUFZLFdBQW1CO1FBQzdCLEtBQUssQ0FBQyxnQ0FBZ0MsV0FBVyxJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxHQUFHLHdDQUF3QyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQVRELHdGQVNDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLG9DQUFxQyxTQUFRLCtCQUErQjtJQUV2Rjs7O09BR0c7SUFDSCxZQUE0QixLQUEwQixFQUFrQixTQUFpQixTQUFTO1FBQ2hHLEtBQUssQ0FBQyw0Q0FBNEMsS0FBSyxLQUFLLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFENUMsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFBa0IsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFFaEcsSUFBSSxDQUFDLElBQUksR0FBRyxzQ0FBc0MsQ0FBQztJQUNyRCxDQUFDO0NBQ0Y7QUFWRCxvRkFVQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdldFF1ZXJ5RXhlY3V0aW9uQ29tbWFuZCwgUXVlcnlFeGVjdXRpb25TdGF0ZSwgQXRoZW5hQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWF0aGVuYSc7XG5cbi8qKiBEZWZhdWx0IHBvbGxpbmcgaW50ZXJ2YWwgKG1pbGxpc2Vjb25kcykgZm9yIHF1ZXJ5IGV4ZWN1dGlvbiBzdGF0dXMuICovXG5jb25zdCBERUZBVUxUX1BPTExfSU5URVJWQUxfTVMgPSAxMDAwO1xuXG4vKiogRGVmYXVsdCB0aW1lb3V0IChtaWxsaXNlY29uZHMpIGZvciB3YWl0aW5nIGZvciBxdWVyeSBleGVjdXRpb24gdG8gY29tcGxldGUuICovXG5jb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSAxMDAwICogMTA7XG5cbi8qKiBPcHRpb25zIGZvciBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlciBjb25zdHJ1Y3Rvci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBvbGxpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBJbmNyZWFzZSBmb3IgbG9uZy1ydW5uaW5nIHF1ZXJpZXMgdG8gcmVkdWNlIEFQSSBjYWxscy5cbiAgICogRGVmYXVsdHMgdG8gREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TICgxMDAwKSB3aGVuIG9taXR0ZWQuXG4gICAqL1xuICBwb2xsSW50ZXJ2YWxNcz86IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHdhaXQoKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQb2xsaW5nIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhpcyB3YWl0LlxuICAgKiBPdmVycmlkZXMgdGhlIHdhaXRlcidzIGRlZmF1bHQgcG9sbCBpbnRlcnZhbCB3aGVuIHNwZWNpZmllZC5cbiAgICovXG4gIHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdhaXRzIGZvciBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIHRvIGNvbXBsZXRlLlxuICogUG9sbHMgZXhlY3V0aW9uIHN0YXR1cyB1bnRpbCBpdCBiZWNvbWVzIFNVQ0NFRURFRCwgRkFJTEVELCBvciBDQU5DRUxMRUQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlciB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UG9sbEludGVydmFsTXM6IG51bWJlcjtcblxuICAvKipcbiAgICogQHBhcmFtIGNsaWVudCBBdGhlbmEgQVBJIGNsaWVudFxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBzZXR0aW5ncyAoZS5nLiBwb2xsSW50ZXJ2YWxNcyBmb3IgcG9sbGluZyBpbnRlcnZhbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBBdGhlbmFDbGllbnQsXG4gICAgb3B0aW9ucz86IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5kZWZhdWx0UG9sbEludGVydmFsTXMgPSBvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcyA/PyBERUZBVUxUX1BPTExfSU5URVJWQUxfTVM7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGdpdmVuIHF1ZXJ5IGV4ZWN1dGlvbiBjb21wbGV0ZXMgKG9yIGZhaWxzL2NhbmNlbHMpLlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCBRdWVyeSBleGVjdXRpb24gSUQgdG8gd2FpdCBmb3JcbiAgICogQHBhcmFtIHRpbWVvdXRNcyBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gREVGQVVMVF9USU1FT1VUX01TIHdoZW4gb21pdHRlZFxuICAgKiBAcGFyYW0gd2FpdE9wdGlvbnMgT3B0aW9uYWwgcGVyLWNhbGwgb3B0aW9ucyAoZS5nLiBwb2xsSW50ZXJ2YWxNcyBvdmVycmlkZXMgZGVmYXVsdClcbiAgICogQHJldHVybnMgRXhlY3V0aW9uIHN0YXRlIG9uIHN1Y2Nlc3MgKFNVQ0NFRURFRClcbiAgICogQHRocm93cyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclRpbWVvdXRFcnJvciBPbiB0aW1lb3V0XG4gICAqIEB0aHJvd3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJTdGF0ZUVycm9yIFdoZW4gc3RhdGUgaXMgRkFJTEVEIG9yIENBTkNFTExFRFxuICAgKi9cbiAgYXN5bmMgd2FpdChcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgdGltZW91dE1zOiBudW1iZXIgPSBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgd2FpdE9wdGlvbnM/OiBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRPcHRpb25zLFxuICApOiBQcm9taXNlPFF1ZXJ5RXhlY3V0aW9uU3RhdGU+IHtcbiAgICBjb25zdCBwb2xsSW50ZXJ2YWxNcyA9IHdhaXRPcHRpb25zPy5wb2xsSW50ZXJ2YWxNcyA/PyB0aGlzLmRlZmF1bHRQb2xsSW50ZXJ2YWxNcztcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGlmIChlbGFwc2VkVGltZSA+IHRpbWVvdXRNcykge1xuICAgICAgICB0aHJvdyBuZXcgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJUaW1lb3V0RXJyb3IoZWxhcHNlZFRpbWUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBHZXRRdWVyeUV4ZWN1dGlvbkNvbW1hbmQoe1xuICAgICAgICBRdWVyeUV4ZWN1dGlvbklkOiBxdWVyeUV4ZWN1dGlvbklkLFxuICAgICAgfSkpO1xuICAgICAgY29uc3Qgc3QgPSByZXMuUXVlcnlFeGVjdXRpb24/LlN0YXR1cztcbiAgICAgIGNvbnN0IHN0YXRlID0gc3Q/LlN0YXRlIGFzIFF1ZXJ5RXhlY3V0aW9uU3RhdGUgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZWFzb24gPSBzdD8uU3RhdGVDaGFuZ2VSZWFzb247XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gUXVlcnlFeGVjdXRpb25TdGF0ZS5TVUNDRUVERUQpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlID09PSBRdWVyeUV4ZWN1dGlvblN0YXRlLkZBSUxFRCB8fCBzdGF0ZSA9PT0gUXVlcnlFeGVjdXRpb25TdGF0ZS5DQU5DRUxMRUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyU3RhdGVFcnJvcihzdGF0ZSwgcmVhc29uID8/ICd1bmtub3duJyk7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBwb2xsSW50ZXJ2YWxNcykpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBlcnJvciBmb3IgQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiB3YWl0ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSBFcnJvciBtZXNzYWdlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB3YWl0aW5nIGZvciBxdWVyeSBleGVjdXRpb24gdGltZXMgb3V0LlxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJUaW1lb3V0RXJyb3IgZXh0ZW5kcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckVycm9yIHtcblxuICAvKipcbiAgICogQHBhcmFtIGVsYXBzZWRUaW1lIEVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMgdW50aWwgdGltZW91dFxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxhcHNlZFRpbWU6IG51bWJlcikge1xuICAgIHN1cGVyKGBBdGhlbmEgcXVlcnkgdGltZWQgb3V0IGFmdGVyICR7ZWxhcHNlZFRpbWV9bXNgKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJUaW1lb3V0RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHF1ZXJ5IGVuZHMgaW4gRkFJTEVEIG9yIENBTkNFTExFRCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyU3RhdGVFcnJvciBleHRlbmRzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc3RhdGUgRmluYWwgZXhlY3V0aW9uIHN0YXRlIChGQUlMRUQgb3IgQ0FOQ0VMTEVEKVxuICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZSAoZS5nLiBlcnJvciBkZXRhaWxzKS4gRGVmYXVsdHMgdG8gJ3Vua25vd24nIHdoZW4gb21pdHRlZFxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHN0YXRlOiBRdWVyeUV4ZWN1dGlvblN0YXRlLCBwdWJsaWMgcmVhZG9ubHkgcmVhc29uOiBzdHJpbmcgPSAndW5rbm93bicpIHtcbiAgICBzdXBlcihgQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBmYWlsZWQgd2l0aCBzdGF0ZSAke3N0YXRlfTogJHtyZWFzb259YCk7XG4gICAgdGhpcy5uYW1lID0gJ0F0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyU3RhdGVFcnJvcic7XG4gIH1cbn1cbiJdfQ==
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQXFHO0FBRXJHLDBFQUEwRTtBQUMxRSxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQztBQUV0Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNVLFFBQUEsa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUEyQmhEOzs7OztHQUtHO0FBQ0gsTUFBYSwwQkFBMEI7SUFJckM7OztPQUdHO0lBQ0gsWUFDbUIsTUFBb0IsRUFDckMsT0FBMkM7UUFEMUIsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUdyQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsT0FBTyxFQUFFLGNBQWMsSUFBSSx3QkFBd0IsQ0FBQztJQUNuRixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUNSLGdCQUF3QixFQUN4QixXQUE2QztRQUU3QyxNQUFNLGtCQUFrQixHQUFHLFdBQVcsRUFBRSxTQUFTLElBQUksMEJBQWtCLENBQUM7UUFDeEUsTUFBTSxjQUFjLEdBQUcsV0FBVyxFQUFFLGNBQWMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDakYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLEdBQUcsQ0FBQztZQUNGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7WUFDM0MsSUFBSSxXQUFXLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxJQUFJLHNDQUFzQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7WUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksd0NBQXdCLENBQUM7Z0JBQzlELGdCQUFnQixFQUFFLGdCQUFnQjthQUNuQyxDQUFDLENBQUMsQ0FBQztZQUNKLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO1lBQ3RDLE1BQU0sS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUF3QyxDQUFDO1lBQzNELE1BQU0sTUFBTSxHQUFHLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQztZQUVyQyxJQUFJLEtBQUssS0FBSyxtQ0FBbUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsSUFBSSxLQUFLLEtBQUssbUNBQW1CLENBQUMsTUFBTSxJQUFJLEtBQUssS0FBSyxtQ0FBbUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDcEYsTUFBTSxJQUFJLG9DQUFvQyxDQUFDLEtBQUssRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLENBQUM7WUFDN0UsQ0FBQztZQUNELE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDLFFBQVEsSUFBSSxFQUFFO0lBQ2pCLENBQUM7Q0FDRjtBQXJERCxnRUFxREM7QUFFRDs7R0FFRztBQUNILE1BQWEsK0JBQWdDLFNBQVEsS0FBSztJQUV4RDs7T0FFRztJQUNILFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLGlDQUFpQyxDQUFDO0lBQ2hELENBQUM7Q0FDRjtBQVRELDBFQVNDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLHNDQUF1QyxTQUFRLCtCQUErQjtJQUV6Rjs7T0FFRztJQUNILFlBQVksV0FBbUI7UUFDN0IsS0FBSyxDQUFDLGdDQUFnQyxXQUFXLElBQUksQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxJQUFJLEdBQUcsd0NBQXdDLENBQUM7SUFDdkQsQ0FBQztDQUNGO0FBVEQsd0ZBU0M7QUFFRDs7R0FFRztBQUNILE1BQWEsb0NBQXFDLFNBQVEsK0JBQStCO0lBRXZGOzs7T0FHRztJQUNILFlBQTRCLEtBQTBCLEVBQWtCLFNBQWlCLFNBQVM7UUFDaEcsS0FBSyxDQUFDLDRDQUE0QyxLQUFLLEtBQUssTUFBTSxFQUFFLENBQUMsQ0FBQztRQUQ1QyxVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUFrQixXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUVoRyxJQUFJLENBQUMsSUFBSSxHQUFHLHNDQUFzQyxDQUFDO0lBQ3JELENBQUM7Q0FDRjtBQVZELG9GQVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2V0UXVlcnlFeGVjdXRpb25Db21tYW5kLCBRdWVyeUV4ZWN1dGlvblN0YXRlLCBBdGhlbmFDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtYXRoZW5hJztcblxuLyoqIERlZmF1bHQgcG9sbGluZyBpbnRlcnZhbCAobWlsbGlzZWNvbmRzKSBmb3IgcXVlcnkgZXhlY3V0aW9uIHN0YXR1cy4gKi9cbmNvbnN0IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUyA9IDEwMDA7XG5cbi8qKlxuICogRGVmYXVsdCBvdmVyYWxsIHdhaXQgdGltZW91dCAobWlsbGlzZWNvbmRzKSB3aGVuIGB3YWl0KClgIGlzIGNhbGxlZCB3aXRob3V0XG4gKiBgd2FpdE9wdGlvbnMudGltZW91dE1zYC5cbiAqIFRoaXMgY2FwcyB0b3RhbCB3YWxsLWNsb2NrIHRpbWUgZnJvbSB0aGUgc3RhcnQgb2YgYHdhaXQoKWAgdW50aWwgYSB0ZXJtaW5hbCBzdGF0ZVxuICogKG9yIGVycm9yKeKAlGl0IGlzIG5vdCB0aGUgZGVsYXkgYmV0d2VlbiBwb2xscyAoYHBvbGxJbnRlcnZhbE1zYCkuXG4gKlxuICogKipXaHkgMiBtaW51dGVzOioqIEF0aGVuYSBvZnRlbiBleGNlZWRzIGEgZmV3IHNlY29uZHMgKHF1ZXVlaW5nLCBjb2xkIHN0YXJ0LCBtb2RlcmF0ZVxuICogc2NhbnMpLiBUZW4gc2Vjb25kcyBmYWlscyB0b28gb2Z0ZW4gYXMgYSBsaWJyYXJ5IGRlZmF1bHQ7IHVuYm91bmRlZCBvciB2ZXJ5IGxhcmdlXG4gKiBkZWZhdWx0cyByaXNrIGhhbmdpbmcgY2FsbGVycy4gVHdvIG1pbnV0ZXMgaXMgYSBwcmFjdGljYWwgbWlkZGxlIGdyb3VuZOKAlHRpZ2h0IGVub3VnaFxuICogdG8gc3VyZmFjZSBzdHVjayB3b3JrLCBsb25nIGVub3VnaCBmb3IgbWFueSBpbnRlcmFjdGl2ZSB3b3JrbG9hZHMuIFVzZSBhIGxhcmdlclxuICogYHdhaXQoLi4uLCB7IHRpbWVvdXRNcyB9KWAgZm9yIGhlYXZ5IGFuYWx5dGljcyBvciBFVEwuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSAyICogNjAgKiAxMDAwO1xuXG4vKiogT3B0aW9ucyBmb3IgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXIgY29uc3RydWN0b3IuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQb2xsaW5nIGludGVydmFsIGluIG1pbGxpc2Vjb25kcy5cbiAgICogSW5jcmVhc2UgZm9yIGxvbmctcnVubmluZyBxdWVyaWVzIHRvIHJlZHVjZSBBUEkgY2FsbHMuXG4gICAqIERlZmF1bHRzIHRvIERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUyAoMTAwMCkgd2hlbiBvbWl0dGVkLlxuICAgKi9cbiAgcG9sbEludGVydmFsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBPcHRpb25zIGZvciB3YWl0KCkuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdE9wdGlvbnMge1xuICAvKipcbiAgICogT3ZlcmFsbCB3YWxsLWNsb2NrIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGlzIHdhaXQgKGZyb20gdGhlIHN0YXJ0IG9mIGB3YWl0KClgXG4gICAqIHVudGlsIGEgdGVybWluYWwgc3RhdGUpLiBOb3QgdGhlIGRlbGF5IGJldHdlZW4gcG9sbHMuXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1RJTUVPVVRfTVN9IHdoZW4gb21pdHRlZC5cbiAgICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBvbGxpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGlzIHdhaXQuXG4gICAqIE92ZXJyaWRlcyB0aGUgd2FpdGVyJ3MgZGVmYXVsdCBwb2xsIGludGVydmFsIHdoZW4gc3BlY2lmaWVkLlxuICAgKi9cbiAgcG9sbEludGVydmFsTXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogV2FpdHMgZm9yIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gdG8gY29tcGxldGUuXG4gKiBQb2xscyBleGVjdXRpb24gc3RhdHVzIHVudGlsIGl0IGJlY29tZXMgU1VDQ0VFREVELCBGQUlMRUQsIG9yIENBTkNFTExFRC5cbiAqIE92ZXJhbGwgdGltZSBpcyBib3VuZGVkIGJ5IGB3YWl0T3B0aW9ucy50aW1lb3V0TXNgIChvciB7QGxpbmsgREVGQVVMVF9USU1FT1VUX01TfSk7XG4gKiBzcGFjaW5nIGJldHdlZW4gcG9sbHMgaXMgY29udHJvbGxlZCBzZXBhcmF0ZWx5IGJ5IGBwb2xsSW50ZXJ2YWxNc2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlciB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UG9sbEludGVydmFsTXM6IG51bWJlcjtcblxuICAvKipcbiAgICogQHBhcmFtIGNsaWVudCBBdGhlbmEgQVBJIGNsaWVudFxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBzZXR0aW5ncyAoZS5nLiBwb2xsSW50ZXJ2YWxNcylcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBBdGhlbmFDbGllbnQsXG4gICAgb3B0aW9ucz86IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5kZWZhdWx0UG9sbEludGVydmFsTXMgPSBvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcyA/PyBERUZBVUxUX1BPTExfSU5URVJWQUxfTVM7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGdpdmVuIHF1ZXJ5IGV4ZWN1dGlvbiBjb21wbGV0ZXMgKG9yIGZhaWxzL2NhbmNlbHMpLlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCBRdWVyeSBleGVjdXRpb24gSUQgdG8gd2FpdCBmb3JcbiAgICogQHBhcmFtIHdhaXRPcHRpb25zIE9wdGlvbmFsIHBlci1jYWxsIHNldHRpbmdzIChgdGltZW91dE1zYCwgYHBvbGxJbnRlcnZhbE1zYClcbiAgICogQHJldHVybnMgRXhlY3V0aW9uIHN0YXRlIG9uIHN1Y2Nlc3MgKFNVQ0NFRURFRClcbiAgICogQHRocm93cyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclRpbWVvdXRFcnJvciBPbiB0aW1lb3V0XG4gICAqIEB0aHJvd3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJTdGF0ZUVycm9yIFdoZW4gc3RhdGUgaXMgRkFJTEVEIG9yIENBTkNFTExFRFxuICAgKi9cbiAgYXN5bmMgd2FpdChcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgd2FpdE9wdGlvbnM/OiBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRPcHRpb25zLFxuICApOiBQcm9taXNlPFF1ZXJ5RXhlY3V0aW9uU3RhdGU+IHtcbiAgICBjb25zdCBlZmZlY3RpdmVUaW1lb3V0TXMgPSB3YWl0T3B0aW9ucz8udGltZW91dE1zID8/IERFRkFVTFRfVElNRU9VVF9NUztcbiAgICBjb25zdCBwb2xsSW50ZXJ2YWxNcyA9IHdhaXRPcHRpb25zPy5wb2xsSW50ZXJ2YWxNcyA/PyB0aGlzLmRlZmF1bHRQb2xsSW50ZXJ2YWxNcztcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGlmIChlbGFwc2VkVGltZSA+IGVmZmVjdGl2ZVRpbWVvdXRNcykge1xuICAgICAgICB0aHJvdyBuZXcgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJUaW1lb3V0RXJyb3IoZWxhcHNlZFRpbWUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBHZXRRdWVyeUV4ZWN1dGlvbkNvbW1hbmQoe1xuICAgICAgICBRdWVyeUV4ZWN1dGlvbklkOiBxdWVyeUV4ZWN1dGlvbklkLFxuICAgICAgfSkpO1xuICAgICAgY29uc3Qgc3QgPSByZXMuUXVlcnlFeGVjdXRpb24/LlN0YXR1cztcbiAgICAgIGNvbnN0IHN0YXRlID0gc3Q/LlN0YXRlIGFzIFF1ZXJ5RXhlY3V0aW9uU3RhdGUgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZWFzb24gPSBzdD8uU3RhdGVDaGFuZ2VSZWFzb247XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gUXVlcnlFeGVjdXRpb25TdGF0ZS5TVUNDRUVERUQpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlID09PSBRdWVyeUV4ZWN1dGlvblN0YXRlLkZBSUxFRCB8fCBzdGF0ZSA9PT0gUXVlcnlFeGVjdXRpb25TdGF0ZS5DQU5DRUxMRUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyU3RhdGVFcnJvcihzdGF0ZSwgcmVhc29uID8/ICd1bmtub3duJyk7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBwb2xsSW50ZXJ2YWxNcykpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBlcnJvciBmb3IgQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiB3YWl0ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSBFcnJvciBtZXNzYWdlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB3YWl0aW5nIGZvciBxdWVyeSBleGVjdXRpb24gdGltZXMgb3V0LlxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJUaW1lb3V0RXJyb3IgZXh0ZW5kcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckVycm9yIHtcblxuICAvKipcbiAgICogQHBhcmFtIGVsYXBzZWRUaW1lIEVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMgdW50aWwgdGltZW91dFxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxhcHNlZFRpbWU6IG51bWJlcikge1xuICAgIHN1cGVyKGBBdGhlbmEgcXVlcnkgdGltZWQgb3V0IGFmdGVyICR7ZWxhcHNlZFRpbWV9bXNgKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJUaW1lb3V0RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHF1ZXJ5IGVuZHMgaW4gRkFJTEVEIG9yIENBTkNFTExFRCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyU3RhdGVFcnJvciBleHRlbmRzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc3RhdGUgRmluYWwgZXhlY3V0aW9uIHN0YXRlIChGQUlMRUQgb3IgQ0FOQ0VMTEVEKVxuICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZSAoZS5nLiBlcnJvciBkZXRhaWxzKS4gRGVmYXVsdHMgdG8gJ3Vua25vd24nIHdoZW4gb21pdHRlZFxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHN0YXRlOiBRdWVyeUV4ZWN1dGlvblN0YXRlLCBwdWJsaWMgcmVhZG9ubHkgcmVhc29uOiBzdHJpbmcgPSAndW5rbm93bicpIHtcbiAgICBzdXBlcihgQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBmYWlsZWQgd2l0aCBzdGF0ZSAke3N0YXRlfTogJHtyZWFzb259YCk7XG4gICAgdGhpcy5uYW1lID0gJ0F0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyU3RhdGVFcnJvcic7XG4gIH1cbn1cbiJdfQ==
|