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 CHANGED
@@ -1,7 +1,17 @@
1
1
  # Athena Query Execution Waiter
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/athena-query-execution-waiter.svg)](https://www.npmjs.com/package/athena-query-execution-waiter)
4
+ [![License](https://img.shields.io/npm/l/athena-query-execution-waiter.svg)](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
- // Start a query with StartQueryExecution, then wait for it to complete
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
- ### Custom timeout
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
- The default timeout is 10 seconds. You can pass a custom timeout in milliseconds:
74
+ Long-running jobs should pass a higher `timeoutMs` when needed:
59
75
 
60
76
  ```typescript
61
- const state = await waiter.wait(queryExecutionId, 60_000); // 60 seconds
77
+ const state = await waiter.wait(queryExecutionId, {
78
+ timeoutMs: 15 * 60_000, // 15 minutes overall
79
+ });
62
80
  ```
63
81
 
64
- ### Polling interval
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
- // Or per call (overrides the waiter default)
73
- const state = await waiter.wait(queryExecutionId, 60_000, { pollIntervalMs: 3000 });
87
+ const state = await waiter.wait(queryExecutionId, {
88
+ timeoutMs: 60_000,
89
+ pollIntervalMs: 3000,
90
+ });
74
91
  ```
75
92
 
76
- ## API
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
- - `client` An AWS SDK v3 `AthenaClient` instance.
82
- - `options.pollIntervalMs` Optional. Polling interval in ms (default: 1000).
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
- ### Types
122
+ ### Constants
93
123
 
94
- - **`AthenaQueryExecutionWaiterOptions`** `{ pollIntervalMs?: number }` (constructor options).
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`** Base class for all waiter errors.
100
-
101
- - **`AthenaQueryExecutionWaiterTimeoutError`** Thrown when the wait duration exceeds `timeoutMs`.
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 for polling interval)
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 timeoutMs Timeout in milliseconds. Defaults to DEFAULT_TIMEOUT_MS when omitted
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, timeoutMs?: number, waitOptions?: AthenaQueryExecutionWaitOptions): Promise<QueryExecutionState>;
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
- /** Default timeout (milliseconds) for waiting for query execution to complete. */
8
- const DEFAULT_TIMEOUT_MS = 1000 * 10;
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 for polling interval)
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 timeoutMs Timeout in milliseconds. Defaults to DEFAULT_TIMEOUT_MS when omitted
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, timeoutMs = DEFAULT_TIMEOUT_MS, waitOptions) {
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 > timeoutMs) {
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==
package/package.json CHANGED
@@ -65,7 +65,7 @@
65
65
  "publishConfig": {
66
66
  "access": "public"
67
67
  },
68
- "version": "0.3.13",
68
+ "version": "0.4.0",
69
69
  "jest": {
70
70
  "coverageProvider": "v8",
71
71
  "testMatch": [