strict-env-resolver 0.6.6 → 0.7.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,15 +1,17 @@
1
1
  # Strict Env Resolver
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/strict-env-resolver.svg)](https://www.npmjs.com/package/strict-env-resolver)
4
- [![npm downloads](https://img.shields.io/npm/dm/strict-env-resolver.svg)](https://www.npmjs.com/package/strict-env-resolver)
5
- [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
3
+ [![npm version](https://img.shields.io/npm/v/strict-env-resolver?style=flat-square)](https://www.npmjs.com/package/strict-env-resolver)
4
+ [![license](https://img.shields.io/npm/l/strict-env-resolver?style=flat-square)](https://www.npmjs.com/package/strict-env-resolver)
5
+ [![Node.js](https://img.shields.io/node/v/strict-env-resolver?style=flat-square)](https://www.npmjs.com/package/strict-env-resolver)
6
+ [![build](https://img.shields.io/github/actions/workflow/status/gammarers-labs/strict-env-resolver/build.yml?branch=main&label=build&style=flat-square)](https://github.com/gammarers-labs/strict-env-resolver/actions/workflows/build.yml)
6
7
 
7
8
  Type-safe environment variable resolver for Node.js. Reads and parses `process.env` with specs (`string`, `number`, `boolean`, `enum`), optional defaults, configurable trimming, and structured validation errors when values are missing or invalid.
8
9
 
9
10
  ## Features
10
11
 
11
12
  - **Typed specs**: `string`, `number`, `boolean`, and `enum` with TypeScript inference
12
- - **Finite numbers**: `StrictEnvType.Number` parses any finite numeric value (`Number()`); rejects `NaN` and `Infinity`
13
+ - **Finite numbers**: `StrictEnvType.Number` accepts finite values and rejects `NaN` and `Infinity`
14
+ - **Number presets**: Nested specs such as `Number.Port`, `Number.Integer`, and `Number.PositiveInteger`
13
15
  - **Optional defaults**: Fallback when a variable is unset, empty (`""`), or whitespace-only (when trimming is enabled)
14
16
  - **Configurable trim**: `trim` defaults to `true` for parsed types and `false` for strings; override per variable
15
17
  - **Batch parsing**: `resolveAll()` evaluates every key and throws once with all validation errors
@@ -17,22 +19,48 @@ Type-safe environment variable resolver for Node.js. Reads and parses `process.e
17
19
  - **Boolean parsing**: `1`, `true`, `yes`, `on` (case-insensitive, after trim) → `true`; any other non-empty value → `false`
18
20
  - **Enum constraint**: Values must match one of the allowed choices (compared after trim)
19
21
 
22
+ ## How it works
23
+
24
+ `resolve` reads one `process.env` key, trims it when the spec says so, parses it, and returns a typed value or throws `StrictEnvValidationError`. `resolveAll` does the same for every key in a schema and throws once with every issue collected.
25
+
26
+ Unset, empty, and (when trimming) whitespace-only values use `options.default` when provided; otherwise they fail with `kind: 'missing'`.
27
+
20
28
  ## Installation
21
29
 
22
- **npm**
30
+ ### npm
23
31
 
24
32
  ```bash
25
33
  npm install strict-env-resolver
26
34
  ```
27
35
 
28
- **yarn**
36
+ ### yarn
29
37
 
30
38
  ```bash
31
39
  yarn add strict-env-resolver
32
40
  ```
33
41
 
42
+ ### pnpm
43
+
44
+ ```bash
45
+ pnpm add strict-env-resolver
46
+ ```
47
+
34
48
  ## Usage
35
49
 
50
+ ```ts
51
+ import { StrictEnvResolver, StrictEnvType } from 'strict-env-resolver';
52
+
53
+ const port = StrictEnvResolver.resolve('PORT', StrictEnvType.Number.Port, { default: 3000 });
54
+
55
+ const envs = StrictEnvResolver.resolveAll({
56
+ PORT: [StrictEnvType.Number.Port, { default: 3000 }],
57
+ DEBUG: [StrictEnvType.Boolean, { default: false }],
58
+ MODE: StrictEnvType.Enum(['read', 'write'] as const),
59
+ });
60
+ ```
61
+
62
+ Strings, custom number bounds, enums, and error handling:
63
+
36
64
  ```ts
37
65
  import {
38
66
  StrictEnvResolver,
@@ -53,15 +81,18 @@ const trimmedLogLevel = StrictEnvResolver.resolve('LOG_LEVEL', StrictEnvType.Str
53
81
  default: 'info',
54
82
  });
55
83
 
56
- // Number (e.g. port, ratio, timeout)
57
- const port = StrictEnvResolver.resolve('PORT', StrictEnvType.Number, { default: 3000 });
84
+ // Number (e.g. ratio, timeout)
85
+ const timeoutMs = StrictEnvResolver.resolve('TIMEOUT_MS', StrictEnvType.Number, { default: 5000 });
58
86
  // Valid: "42", "-1", "3.14", "1e5", "+42", "0x10", " 42 " (trimmed)
59
87
  // Missing: "", " " (whitespace-only, trim default true)
60
88
  // Invalid: "Infinity", "NaN", "not-a-number"
61
89
 
90
+ // Number presets
91
+ const retries = StrictEnvResolver.resolve('RETRIES', StrictEnvType.Number.NonNegativeInteger, { default: 0 });
92
+ // Custom bounds: StrictEnvType.Number({ min: 1, max: 1024, integer: true })
93
+
62
94
  // Boolean (1/true/yes/on → true after trim; other non-empty values → false)
63
95
  const debug = StrictEnvResolver.resolve('DEBUG', StrictEnvType.Boolean, { default: false });
64
- // " true " → true
65
96
 
66
97
  // Enum (value must be in choices, compared after trim)
67
98
  const mode = StrictEnvResolver.resolve('MODE', StrictEnvType.Enum(['read', 'write'] as const));
@@ -71,18 +102,9 @@ const modeWithDefault = StrictEnvResolver.resolve(
71
102
  { default: 'read' },
72
103
  );
73
104
 
74
- // Read multiple env vars at once (collects all errors, then throws once)
75
- const envs = StrictEnvResolver.resolveAll({
76
- PORT: [StrictEnvType.Number, { default: 3000 }],
77
- DEBUG: [StrictEnvType.Boolean, { default: false }],
78
- MODE: StrictEnvType.Enum(['read', 'write'] as const),
79
- LOG_LEVEL: [StrictEnvType.String, { trim: true, default: 'info' }],
80
- });
81
-
82
- // Handle structured validation errors
83
105
  try {
84
106
  StrictEnvResolver.resolveAll({
85
- PORT: StrictEnvType.Number,
107
+ PORT: StrictEnvType.Number.Port,
86
108
  MODE: StrictEnvType.Enum(['read', 'write'] as const),
87
109
  });
88
110
  } catch (e) {
@@ -105,15 +127,15 @@ try {
105
127
  | Argument | Required | Description |
106
128
  |----------|----------|-------------|
107
129
  | **key** | Yes | Environment variable name (e.g. `"PORT"`, `"NODE_ENV"`). |
108
- | **spec** | No | Type spec; defaults to `StrictEnvType.String`. Use `StrictEnvType.String`, `StrictEnvType.Number`, `StrictEnvType.Boolean`, or `StrictEnvType.Enum(choices)`. |
130
+ | **spec** | No | Type spec; defaults to `StrictEnvType.String`. Use `StrictEnvType.String`, `StrictEnvType.Number` (or a nested preset such as `Number.Port`), `StrictEnvType.Boolean`, or `StrictEnvType.Enum(choices)`. |
109
131
  | **options** | No | See [`StrictEnvOptions`](#strictenvoptions) below. |
110
132
 
111
133
  ### `StrictEnvResolver.resolveAll(schema)`
112
134
 
113
135
  `schema` is an object where each key is an env var name and each value is either:
114
136
 
115
- - A spec (e.g. `StrictEnvType.Number`)
116
- - A tuple `[spec, options]` (e.g. `[StrictEnvType.Number, { default: 3000, trim: true }]`)
137
+ - A spec (e.g. `StrictEnvType.Number.Port`)
138
+ - A tuple `[spec, options]` (e.g. `[StrictEnvType.Number.Port, { default: 3000, trim: true }]`)
117
139
 
118
140
  Evaluates every entry in `schema`. If any value is missing, empty without a default, whitespace-only without a default (when trimming is enabled), or invalid, throws a single `StrictEnvValidationError` containing all issues.
119
141
 
@@ -129,7 +151,7 @@ Evaluates every entry in `schema`. If any value is missing, empty without a defa
129
151
  | Spec | Constant | Description |
130
152
  |------|----------|-------------|
131
153
  | `string` | `StrictEnvType.String` | Raw string value. Not trimmed by default; set `trim: true` to trim and treat whitespace-only as missing. |
132
- | `number` | `StrictEnvType.Number` | Finite numeric value (see below). Trimmed by default. |
154
+ | `number` | `StrictEnvType.Number` | Finite numeric value (see below). Trimmed by default. Nested presets such as `Number.Port` are still `number` specs. |
133
155
  | `boolean` | `StrictEnvType.Boolean` | `1` / `true` / `yes` / `on` (case-insensitive, trimmed) → `true`; otherwise → `false`. Trimmed by default. |
134
156
  | `enum` | `StrictEnvType.Enum(choices)` | Value must be in `choices` (compared after trim). Trimmed by default. |
135
157
 
@@ -137,10 +159,30 @@ Evaluates every entry in `schema`. If any value is missing, empty without a defa
137
159
 
138
160
  - Trims leading/trailing whitespace before validation (default `trim: true`).
139
161
  - Parsed with `Number()`; the result must be finite (`NaN` and `Infinity` are rejected).
162
+ - Optional constraints via `StrictEnvType.Number({ min, max, exclusiveMin, exclusiveMax, integer })`.
140
163
  - **Accepted examples**: `"3000"`, `"3.14"`, `"1e5"`, `"+42"`, `"0x10"`, `" 42 "`, `"-1"`
141
164
  - **Missing examples**: `""`, `" "` (whitespace-only; `kind: 'missing'` unless a default is set)
142
165
  - **Rejected examples**: `"Infinity"`, `"NaN"`, `"not-a-number"`
143
166
 
167
+ Named presets use those constraints (same parse path and `kind: 'invalid_number'`):
168
+
169
+ | Preset | Constraints | Meaning |
170
+ |--------|-------------|---------|
171
+ | `Number.Integer` | `{ integer: true }` | Any integer |
172
+ | `Number.PositiveInteger` | `{ min: 1, integer: true }` | Integer `>= 1` |
173
+ | `Number.NegativeInteger` | `{ max: -1, integer: true }` | Integer `<= -1` |
174
+ | `Number.NonNegativeInteger` | `{ min: 0, integer: true }` | Integer `>= 0` |
175
+ | `Number.Positive` | `{ exclusiveMin: 0 }` | Finite number `> 0` |
176
+ | `Number.Negative` | `{ exclusiveMax: 0 }` | Finite number `< 0` |
177
+ | `Number.NonNegative` | `{ min: 0 }` | Finite number `>= 0` |
178
+ | `Number.Port` | `{ min: 1, max: 65535, integer: true }` | Integer `1`–`65535` |
179
+
180
+ ```ts
181
+ StrictEnvResolver.resolve('PORT', StrictEnvType.Number.Port);
182
+ StrictEnvResolver.resolve('RATIO', StrictEnvType.Number.Positive);
183
+ StrictEnvResolver.resolve('WORKERS', StrictEnvType.Number({ min: 1, max: 64, integer: true }));
184
+ ```
185
+
144
186
  ### Whitespace and trim
145
187
 
146
188
  | Spec | `trim` default | `""` | `" "` (whitespace-only) | `" true "` |
@@ -165,13 +207,15 @@ StrictEnvResolver.resolve('PADDING', StrictEnvType.String, { trim: false });
165
207
  | `kind` | When |
166
208
  |--------|------|
167
209
  | `missing` | Variable unset, empty (`""`), or whitespace-only when trimming is enabled, without a default. |
168
- | `invalid_number` | Value is not a finite number. |
210
+ | `invalid_number` | Value is not a finite number, not an integer when required, or outside `min` / `max` / `exclusiveMin` / `exclusiveMax`. |
169
211
  | `invalid_enum` | Value is not in `choices`. |
170
212
 
171
213
  **Message formats:**
172
214
 
173
215
  - Missing: `Missing required environment variable: <key>`
174
216
  - Number: `Env <key>: expected number, got "<raw>"`
217
+ - Integer: `Env <key>: expected integer, got "<raw>"`
218
+ - Bounds: `Env <key>: must be >= <min>, got <n>` (also `<=`, `>`, `<`)
175
219
  - Enum: `Env <key>: must be one of [choice1, choice2, ...]`
176
220
 
177
221
  `StrictEnvValidationError` fields:
package/lib/index.d.ts CHANGED
@@ -9,21 +9,26 @@ export type StrictEnvTypeString = {
9
9
  };
10
10
  /**
11
11
  * Optional constraints for a numeric environment variable spec.
12
- * Used by {@link StrictEnvType.Number} when called as a factory, and by sugar specs
13
- * such as {@link StrictEnvType.PositiveInt} / {@link StrictEnvType.NegativeInt}.
12
+ * Used by {@link StrictEnvType.Number} when called as a factory, and by nested presets
13
+ * such as {@link StrictEnvType.Number.Port} / {@link StrictEnvType.Number.PositiveInteger}.
14
14
  */
15
15
  export type StrictEnvNumberConstraints = {
16
- /** Inclusive lower bound. */
16
+ /** Inclusive lower bound (`n >= min`). */
17
17
  min?: number;
18
- /** Inclusive upper bound. */
18
+ /** Inclusive upper bound (`n <= max`). */
19
19
  max?: number;
20
+ /** Exclusive lower bound (`n > exclusiveMin`). */
21
+ exclusiveMin?: number;
22
+ /** Exclusive upper bound (`n < exclusiveMax`). */
23
+ exclusiveMax?: number;
20
24
  /** When `true`, the value must be an integer (`Number.isInteger`). */
21
25
  integer?: boolean;
22
26
  };
23
27
  /**
24
28
  * Spec for a numeric environment variable.
25
29
  * Values are parsed with `Number()`; `NaN`, `Infinity`, and `-Infinity` are rejected.
26
- * Optional {@link StrictEnvNumberConstraints} (`min`, `max`, `integer`) narrow accepted values.
30
+ * Optional {@link StrictEnvNumberConstraints} (`min`, `max`, `exclusiveMin`, `exclusiveMax`, `integer`)
31
+ * narrow accepted values.
27
32
  * Defaults belong in {@link StrictEnvOptions}, not on this spec.
28
33
  */
29
34
  export type StrictEnvTypeNumber = {
@@ -57,8 +62,8 @@ export type StrictEnvSpec = StrictEnvTypeString | StrictEnvTypeNumber | StrictEn
57
62
  * Discriminated union of error kinds emitted during environment variable parsing.
58
63
  *
59
64
  * - `missing` — Variable unset, empty string, or whitespace-only (when trim is enabled) without a default.
60
- * - `invalid_number` — Value is not a finite number, not an integer when required, or outside `min`/`max`
61
- * (see {@link StrictEnvTypeNumber}).
65
+ * - `invalid_number` — Value is not a finite number, not an integer when required, or outside
66
+ * `min` / `max` / `exclusiveMin` / `exclusiveMax` (see {@link StrictEnvTypeNumber}).
62
67
  * - `invalid_enum` — Value is not one of the allowed enum choices.
63
68
  */
64
69
  export type StrictEnvErrorKind = 'missing' | 'invalid_number' | 'invalid_enum';
@@ -130,19 +135,44 @@ export declare class StrictEnvValidationError<K extends string = string> extends
130
135
  */
131
136
  constructor(errors: readonly StrictEnvValidationEntry<K>[]);
132
137
  }
138
+ /**
139
+ * Named number presets nested under {@link StrictEnvType.Number}.
140
+ * Each preset is sugar over {@link StrictEnvNumberConstraints}; parsing stays `type: 'number'`.
141
+ */
142
+ type StrictEnvNumberPresets = {
143
+ /** Any integer. Sugar for `Number({ integer: true })`. */
144
+ Integer: StrictEnvTypeNumber;
145
+ /** Integer `>= 1`. Sugar for `Number({ min: 1, integer: true })`. */
146
+ PositiveInteger: StrictEnvTypeNumber;
147
+ /** Integer `<= -1`. Sugar for `Number({ max: -1, integer: true })`. */
148
+ NegativeInteger: StrictEnvTypeNumber;
149
+ /** Integer `>= 0`. Sugar for `Number({ min: 0, integer: true })`. */
150
+ NonNegativeInteger: StrictEnvTypeNumber;
151
+ /** Finite number `> 0`. Sugar for `Number({ exclusiveMin: 0 })`. */
152
+ Positive: StrictEnvTypeNumber;
153
+ /** Finite number `< 0`. Sugar for `Number({ exclusiveMax: 0 })`. */
154
+ Negative: StrictEnvTypeNumber;
155
+ /** Finite number `>= 0`. Sugar for `Number({ min: 0 })`. */
156
+ NonNegative: StrictEnvTypeNumber;
157
+ /** TCP/UDP port `1`–`65535`. Sugar for `Number({ min: 1, max: 65535, integer: true })`. */
158
+ Port: StrictEnvTypeNumber;
159
+ };
133
160
  /**
134
161
  * Unconstrained finite-number spec, also callable as a factory for constrained specs.
162
+ * Named presets hang off the same object (`Number.Port`, `Number.PositiveInteger`, …).
135
163
  *
136
164
  * @example
137
165
  * ```ts
138
166
  * StrictEnvType.Number
139
167
  * StrictEnvType.Number({ min: 0 })
140
- * StrictEnvType.Number({ min: 1, max: 65535, integer: true })
168
+ * StrictEnvType.Number({ exclusiveMin: 0 })
169
+ * StrictEnvType.Number.Port
170
+ * StrictEnvType.Number.PositiveInteger
141
171
  * ```
142
172
  */
143
173
  type StrictEnvNumberSpecFactory = {
144
174
  (constraints?: StrictEnvNumberConstraints): StrictEnvTypeNumber;
145
- } & StrictEnvTypeNumber;
175
+ } & StrictEnvTypeNumber & StrictEnvNumberPresets;
146
176
  /**
147
177
  * Predefined spec constants for use with `resolve` or as schema values in `resolveAll`.
148
178
  * Specs describe type only; provide `default` / `trim` via {@link StrictEnvOptions}
@@ -155,17 +185,10 @@ export declare const StrictEnvType: {
155
185
  };
156
186
  /**
157
187
  * Spec for a finite numeric value (`Number()` parsing; rejects `NaN` and `Infinity`).
158
- * Use as `StrictEnvType.Number`, or call as `StrictEnvType.Number({ min, max, integer })`.
188
+ * Use as `StrictEnvType.Number`, call as `StrictEnvType.Number({ min, max, exclusiveMin, exclusiveMax, integer })`,
189
+ * or use a nested preset such as `StrictEnvType.Number.Port`.
159
190
  */
160
191
  readonly Number: StrictEnvNumberSpecFactory;
161
- /**
162
- * Spec for a positive integer (`>= 1`). Sugar for `Number({ min: 1, integer: true })`.
163
- */
164
- readonly PositiveInt: StrictEnvTypeNumber;
165
- /**
166
- * Spec for a negative integer (`<= -1`). Sugar for `Number({ max: -1, integer: true })`.
167
- */
168
- readonly NegativeInt: StrictEnvTypeNumber;
169
192
  /** Spec for a boolean value (`1`/`true`/`yes`/`on` → `true`; other non-empty values → `false`). */
170
193
  readonly Boolean: {
171
194
  readonly type: "boolean";
@@ -230,9 +253,9 @@ export type StrictEnvSchemaToType<TSchema extends StrictEnvSchema> = {
230
253
  *
231
254
  * @example
232
255
  * ```ts
233
- * const port = StrictEnvResolver.resolve('PORT', StrictEnvType.PositiveInt);
256
+ * const port = StrictEnvResolver.resolve('PORT', StrictEnvType.Number.Port);
234
257
  * const envs = StrictEnvResolver.resolveAll({
235
- * PORT: StrictEnvType.PositiveInt,
258
+ * PORT: StrictEnvType.Number.Port,
236
259
  * DEBUG: [StrictEnvType.Boolean, { default: false }],
237
260
  * });
238
261
  * ```
package/lib/index.js CHANGED
@@ -85,19 +85,48 @@ class StrictEnvValidationError extends StrictEnvError {
85
85
  }
86
86
  }
87
87
  exports.StrictEnvValidationError = StrictEnvValidationError;
88
+ /** Inclusive lower bound for positive integers (`>= 1`). */
89
+ const MIN_POSITIVE_INTEGER = 1;
90
+ /** Inclusive upper bound for negative integers (`<= -1`). */
91
+ const MAX_NEGATIVE_INTEGER = -1;
92
+ /**
93
+ * Sign boundary for Positive (`> 0`), Negative (`< 0`), and non-negative (`>= 0`) presets.
94
+ */
95
+ const ZERO = 0;
96
+ /**
97
+ * Inclusive lower TCP/UDP port (IANA). Port 0 means "any available" and is rejected.
98
+ */
99
+ const MIN_PORT = MIN_POSITIVE_INTEGER;
100
+ /** Inclusive upper TCP/UDP port (IANA). */
101
+ const MAX_PORT = 65535;
88
102
  /**
89
103
  * Builds a numeric env spec from optional constraints.
90
104
  *
91
- * @param constraints - Optional `min`, `max`, and/or `integer` bounds.
105
+ * @param constraints - Optional `min`, `max`, `exclusiveMin`, `exclusiveMax`, and/or `integer` bounds.
92
106
  * @returns Number spec for use with `resolve` or `resolveAll`.
93
107
  */
94
108
  const createNumberSpec = (constraints) => ({
95
109
  type: 'number',
96
110
  ...(constraints?.min !== undefined ? { min: constraints.min } : {}),
97
111
  ...(constraints?.max !== undefined ? { max: constraints.max } : {}),
112
+ ...(constraints?.exclusiveMin !== undefined ? { exclusiveMin: constraints.exclusiveMin } : {}),
113
+ ...(constraints?.exclusiveMax !== undefined ? { exclusiveMax: constraints.exclusiveMax } : {}),
98
114
  ...(constraints?.integer !== undefined ? { integer: constraints.integer } : {}),
99
115
  });
100
- const NumberSpec = Object.assign((constraints) => createNumberSpec(constraints), { type: 'number' });
116
+ /**
117
+ * Finite-number spec that is also a constraint factory and a holder of named presets.
118
+ * Use as `Number`, `Number({ min, max, exclusiveMin, exclusiveMax, integer })`, or `Number.Port`.
119
+ */
120
+ const NumberSpec = Object.assign((constraints) => createNumberSpec(constraints), { type: 'number' }, {
121
+ Integer: createNumberSpec({ integer: true }),
122
+ PositiveInteger: createNumberSpec({ min: MIN_POSITIVE_INTEGER, integer: true }),
123
+ NegativeInteger: createNumberSpec({ max: MAX_NEGATIVE_INTEGER, integer: true }),
124
+ NonNegativeInteger: createNumberSpec({ min: ZERO, integer: true }),
125
+ Positive: createNumberSpec({ exclusiveMin: ZERO }),
126
+ Negative: createNumberSpec({ exclusiveMax: ZERO }),
127
+ NonNegative: createNumberSpec({ min: ZERO }),
128
+ Port: createNumberSpec({ min: MIN_PORT, max: MAX_PORT, integer: true }),
129
+ });
101
130
  /**
102
131
  * Predefined spec constants for use with `resolve` or as schema values in `resolveAll`.
103
132
  * Specs describe type only; provide `default` / `trim` via {@link StrictEnvOptions}
@@ -108,17 +137,10 @@ exports.StrictEnvType = {
108
137
  String: { type: 'string' },
109
138
  /**
110
139
  * Spec for a finite numeric value (`Number()` parsing; rejects `NaN` and `Infinity`).
111
- * Use as `StrictEnvType.Number`, or call as `StrictEnvType.Number({ min, max, integer })`.
140
+ * Use as `StrictEnvType.Number`, call as `StrictEnvType.Number({ min, max, exclusiveMin, exclusiveMax, integer })`,
141
+ * or use a nested preset such as `StrictEnvType.Number.Port`.
112
142
  */
113
143
  Number: NumberSpec,
114
- /**
115
- * Spec for a positive integer (`>= 1`). Sugar for `Number({ min: 1, integer: true })`.
116
- */
117
- PositiveInt: createNumberSpec({ min: 1, integer: true }),
118
- /**
119
- * Spec for a negative integer (`<= -1`). Sugar for `Number({ max: -1, integer: true })`.
120
- */
121
- NegativeInt: createNumberSpec({ max: -1, integer: true }),
122
144
  /** Spec for a boolean value (`1`/`true`/`yes`/`on` → `true`; other non-empty values → `false`). */
123
145
  Boolean: { type: 'boolean' },
124
146
  /**
@@ -160,10 +182,11 @@ const normalizeEnvRaw = (raw, trim) => {
160
182
  * @param key - Environment variable name.
161
183
  * @param raw - Raw value from `process.env`, if present.
162
184
  * @param n - Parsed finite number.
163
- * @param constraints - Optional `min`, `max`, and/or `integer` constraints.
185
+ * @param constraints - Optional `min`, `max`, `exclusiveMin`, `exclusiveMax`, and/or `integer` constraints.
164
186
  * @returns `undefined` when valid; otherwise a structured validation error.
165
187
  */
166
188
  const validateNumberConstraints = (key, raw, n, constraints) => {
189
+ // Integer first so e.g. Port `80.5` reports "expected integer", not a range error.
167
190
  if (constraints.integer === true && !Number.isInteger(n)) {
168
191
  return { key, message: `Env ${key}: expected integer, got "${raw}"`, raw, kind: 'invalid_number' };
169
192
  }
@@ -175,6 +198,14 @@ const validateNumberConstraints = (key, raw, n, constraints) => {
175
198
  kind: 'invalid_number',
176
199
  };
177
200
  }
201
+ if (constraints.exclusiveMin !== undefined && n <= constraints.exclusiveMin) {
202
+ return {
203
+ key,
204
+ message: `Env ${key}: must be > ${constraints.exclusiveMin}, got ${n}`,
205
+ raw,
206
+ kind: 'invalid_number',
207
+ };
208
+ }
178
209
  if (constraints.max !== undefined && n > constraints.max) {
179
210
  return {
180
211
  key,
@@ -183,6 +214,14 @@ const validateNumberConstraints = (key, raw, n, constraints) => {
183
214
  kind: 'invalid_number',
184
215
  };
185
216
  }
217
+ if (constraints.exclusiveMax !== undefined && n >= constraints.exclusiveMax) {
218
+ return {
219
+ key,
220
+ message: `Env ${key}: must be < ${constraints.exclusiveMax}, got ${n}`,
221
+ raw,
222
+ kind: 'invalid_number',
223
+ };
224
+ }
186
225
  return undefined;
187
226
  };
188
227
  /**
@@ -203,7 +242,8 @@ const resolveSchemaEntry = (entry) => ({
203
242
  *
204
243
  * Missing or empty (`""`) values use `defaultValue` when provided. When `trim` is enabled,
205
244
  * whitespace-only values are treated as empty. Number specs delegate to `parseNumber`, then
206
- * optional `min` / `max` / `integer` constraints (see {@link StrictEnvNumberConstraints}).
245
+ * optional `min` / `max` / `exclusiveMin` / `exclusiveMax` / `integer` constraints
246
+ * (see {@link StrictEnvNumberConstraints}).
207
247
  * Boolean specs treat `1`/`true`/`yes`/`on` (case-insensitive, after normalization) as `true`.
208
248
  * Enum specs require an exact match in `choices` (after normalization).
209
249
  *
@@ -322,9 +362,9 @@ const resolveAll = (schema) => {
322
362
  *
323
363
  * @example
324
364
  * ```ts
325
- * const port = StrictEnvResolver.resolve('PORT', StrictEnvType.PositiveInt);
365
+ * const port = StrictEnvResolver.resolve('PORT', StrictEnvType.Number.Port);
326
366
  * const envs = StrictEnvResolver.resolveAll({
327
- * PORT: StrictEnvType.PositiveInt,
367
+ * PORT: StrictEnvType.Number.Port,
328
368
  * DEBUG: [StrictEnvType.Boolean, { default: false }],
329
369
  * });
330
370
  * ```
@@ -335,4 +375,4 @@ exports.StrictEnvResolver = {
335
375
  /** Reads and parses multiple environment variables in one pass. See {@link resolveAll}. */
336
376
  resolveAll,
337
377
  };
338
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBOEJBOzs7R0FHRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7QUFFbEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQVcsRUFBc0IsRUFBRTtJQUN0RCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxhQUFxQixFQUFXLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFzRDFHOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFzQixjQUFlLFNBQVEsS0FBSztJQUNoRDs7T0FFRztJQUNILFlBQXNCLE9BQWU7UUFDbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFSRCx3Q0FRQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBYSx3QkFBb0QsU0FBUSxjQUFjO0lBQ3JGOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQW1CLE1BQThDO1FBQ25GLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RyxPQUFPLGtDQUFrQyxNQUFNLENBQUMsTUFBTSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNsRixDQUFDO0lBV0Q7Ozs7T0FJRztJQUNILFlBQW1CLE1BQThDO1FBQy9ELE1BQU0sR0FBRyxHQUFHLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLDBCQUEwQixDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRjtBQWxDRCw0REFrQ0M7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxXQUF3QyxFQUF1QixFQUFFLENBQUMsQ0FBQztJQUMzRixJQUFJLEVBQUUsUUFBUTtJQUNkLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbkUsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNuRSxHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ2hGLENBQUMsQ0FBQztBQWdCSCxNQUFNLFVBQVUsR0FBK0IsTUFBTSxDQUFDLE1BQU0sQ0FDMUQsQ0FBQyxXQUF3QyxFQUF1QixFQUFFLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLEVBQ2hHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBeUMsQ0FDMUQsQ0FBQztBQUVGOzs7O0dBSUc7QUFDVSxRQUFBLGFBQWEsR0FBRztJQUMzQixzRkFBc0Y7SUFDdEYsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBeUM7SUFDakU7OztPQUdHO0lBQ0gsTUFBTSxFQUFFLFVBQVU7SUFDbEI7O09BRUc7SUFDSCxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN4RDs7T0FFRztJQUNILFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDekQsbUdBQW1HO0lBQ25HLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQTBDO0lBQ3BFOzs7OztPQUtHO0lBQ0gsSUFBSSxFQUFFLENBQW1CLE9BQXFCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUF5QjtDQUM5RixDQUFDO0FBeUVYOzs7Ozs7R0FNRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxJQUFtQixFQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUVwRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQXVCLEVBQUUsSUFBYSxFQUFzQixFQUFFO0lBQ3JGLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2hCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNwQixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLHlCQUF5QixHQUFHLENBQ2hDLEdBQU0sRUFDTixHQUF1QixFQUN2QixDQUFTLEVBQ1QsV0FBdUMsRUFDRSxFQUFFO0lBQzNDLElBQUksV0FBVyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekQsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxHQUFHLDRCQUE0QixHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDckcsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6RCxPQUFPO1lBQ0wsR0FBRztZQUNILE9BQU8sRUFBRSxPQUFPLEdBQUcsZ0JBQWdCLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFFO1lBQzlELEdBQUc7WUFDSCxJQUFJLEVBQUUsZ0JBQWdCO1NBQ3ZCLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxXQUFXLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pELE9BQU87WUFDTCxHQUFHO1lBQ0gsT0FBTyxFQUFFLE9BQU8sR0FBRyxnQkFBZ0IsV0FBVyxDQUFDLEdBQUcsU0FBUyxDQUFDLEVBQUU7WUFDOUQsR0FBRztZQUNILElBQUksRUFBRSxnQkFBZ0I7U0FDdkIsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFLRjs7Ozs7R0FLRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FDekIsS0FBMkIsRUFDb0QsRUFBRSxDQUFDLENBQUM7SUFDbkYsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQWtCO0lBQ2hFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFnRDtDQUN0RyxDQUFDLENBQUM7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLGFBQWEsR0FBRyxDQUNwQixHQUFNLEVBQ04sSUFBTyxFQUNQLEdBQXVCLEVBQ3ZCLFlBQWdELEVBQ2hELE9BQWlDLEVBQ04sRUFBRTtJQUM3QixNQUFNLElBQUksR0FBRyxPQUFPLEVBQUUsSUFBSSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQsTUFBTSxVQUFVLEdBQUcsWUFBWSxLQUFLLFNBQVMsQ0FBQztJQUU5QyxJQUFJLGFBQWEsSUFBSSxJQUFJLElBQUksYUFBYSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ2xELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsWUFBc0MsRUFBRSxDQUFDO1FBQ3JFLENBQUM7UUFDRCxPQUFPO1lBQ0wsRUFBRSxFQUFFLEtBQUs7WUFDVCxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLDBDQUEwQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtTQUMvRixDQUFDO0lBQ0osQ0FBQztJQUVELFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNkLE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDcEIsT0FBTztvQkFDTCxFQUFFLEVBQUUsS0FBSztvQkFDVCxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sR0FBRywyQkFBMkIsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtpQkFDbEcsQ0FBQztZQUNKLENBQUM7WUFDRCxNQUFNLGVBQWUsR0FBRyx5QkFBeUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNyRSxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDO1lBQy9DLENBQUM7WUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBMkIsRUFBRSxDQUFDO1FBQzFELENBQUM7UUFDRCxLQUFLLFNBQVM7WUFDWixPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsb0JBQW9CLENBQUMsYUFBYSxDQUEyQixFQUFFLENBQUM7UUFDNUYsS0FBSyxNQUFNO1lBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLE9BQU87b0JBQ0wsRUFBRSxFQUFFLEtBQUs7b0JBQ1QsS0FBSyxFQUFFO3dCQUNMLEdBQUc7d0JBQ0gsT0FBTyxFQUFFLE9BQU8sR0FBRyxxQkFBcUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7d0JBQ2xFLEdBQUc7d0JBQ0gsSUFBSSxFQUFFLGNBQWM7cUJBQ3JCO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGFBQXVDLEVBQUUsQ0FBQztRQUN0RTtZQUNFLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxhQUF1QyxFQUFFLENBQUM7SUFDeEUsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxPQUFPLEdBQUcsQ0FDZCxHQUFNLEVBQ04sT0FBVSxxQkFBYSxDQUFDLE1BQVcsRUFDbkMsT0FBNkIsRUFDTCxFQUFFO0lBQzFCLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLHdCQUF3QixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztBQUN0QixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsQ0FBa0MsTUFBZSxFQUFrQyxFQUFFO0lBQ3RHLE1BQU0sSUFBSSxHQUE0QyxFQUFFLENBQUM7SUFDekQsTUFBTSxNQUFNLEdBQStELEVBQUUsQ0FBQztJQUU5RSxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUEwQyxFQUFFLENBQUM7UUFDL0UsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUUxRCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFtRCxDQUFDO0lBQ3pFLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRSxPQUFPLElBQXNDLENBQUM7QUFDaEQsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7O0dBV0c7QUFDVSxRQUFBLGlCQUFpQixHQUFHO0lBQy9CLDJFQUEyRTtJQUMzRSxPQUFPO0lBQ1AsMkZBQTJGO0lBQzNGLFVBQVU7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTcGVjIGZvciBhIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIFZhbHVlcyBhcmUgcmV0dXJuZWQgYXMtaXMgdW5sZXNzIGB0cmltOiB0cnVlYCBpcyBzZXQgaW4ge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9XG4gKiAod2hpdGVzcGFjZS1vbmx5IHZhbHVlcyBhcmUgdGhlbiB0cmVhdGVkIGFzIG1pc3NpbmcpLlxuICogRGVmYXVsdHMgYmVsb25nIGluIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfSwgbm90IG9uIHRoaXMgc3BlYy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52VHlwZVN0cmluZyA9IHsgdHlwZTogJ3N0cmluZycgfTtcblxuLyoqXG4gKiBPcHRpb25hbCBjb25zdHJhaW50cyBmb3IgYSBudW1lcmljIGVudmlyb25tZW50IHZhcmlhYmxlIHNwZWMuXG4gKiBVc2VkIGJ5IHtAbGluayBTdHJpY3RFbnZUeXBlLk51bWJlcn0gd2hlbiBjYWxsZWQgYXMgYSBmYWN0b3J5LCBhbmQgYnkgc3VnYXIgc3BlY3NcbiAqIHN1Y2ggYXMge0BsaW5rIFN0cmljdEVudlR5cGUuUG9zaXRpdmVJbnR9IC8ge0BsaW5rIFN0cmljdEVudlR5cGUuTmVnYXRpdmVJbnR9LlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyA9IHtcbiAgLyoqIEluY2x1c2l2ZSBsb3dlciBib3VuZC4gKi9cbiAgbWluPzogbnVtYmVyO1xuICAvKiogSW5jbHVzaXZlIHVwcGVyIGJvdW5kLiAqL1xuICBtYXg/OiBudW1iZXI7XG4gIC8qKiBXaGVuIGB0cnVlYCwgdGhlIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciAoYE51bWJlci5pc0ludGVnZXJgKS4gKi9cbiAgaW50ZWdlcj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwZWMgZm9yIGEgbnVtZXJpYyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIFZhbHVlcyBhcmUgcGFyc2VkIHdpdGggYE51bWJlcigpYDsgYE5hTmAsIGBJbmZpbml0eWAsIGFuZCBgLUluZmluaXR5YCBhcmUgcmVqZWN0ZWQuXG4gKiBPcHRpb25hbCB7QGxpbmsgU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHN9IChgbWluYCwgYG1heGAsIGBpbnRlZ2VyYCkgbmFycm93IGFjY2VwdGVkIHZhbHVlcy5cbiAqIERlZmF1bHRzIGJlbG9uZyBpbiB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30sIG5vdCBvbiB0aGlzIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlR5cGVOdW1iZXIgPSB7IHR5cGU6ICdudW1iZXInIH0gJiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cztcblxuLyoqXG4gKiBQYXR0ZXJuIGZvciBib29sZWFuIGVudiB2YWx1ZXMgdGhhdCBwYXJzZSBhcyBgdHJ1ZWAuXG4gKiBNYXRjaGVzIGAxYCwgYHRydWVgLCBgeWVzYCwgYW5kIGBvbmAgKGNhc2UtaW5zZW5zaXRpdmUpIG9uIHRoZSBmdWxsIHRyaW1tZWQgc3RyaW5nLlxuICovXG5jb25zdCBUUlVFX0JPT0xFQU5fUEFUVEVSTiA9IC9eKDF8dHJ1ZXx5ZXN8b24pJC9pO1xuXG4vKipcbiAqIFBhcnNlcyBhIHN0cmluZyBhcyBhIGZpbml0ZSBudW1iZXIgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gTm9ybWFsaXplZCBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSAodHJpbW1lZCB3aGVuIGB0cmltYCBpcyBlbmFibGVkKS5cbiAqIEByZXR1cm5zIFBhcnNlZCBudW1iZXIsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHZhbHVlIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIuXG4gKi9cbmNvbnN0IHBhcnNlTnVtYmVyID0gKHJhdzogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgbiA9IE51bWJlcihyYXcpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG47XG59O1xuXG4vKipcbiAqIFBhcnNlcyBhIG5vcm1hbGl6ZWQgc3RyaW5nIGFzIGEgYm9vbGVhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gbm9ybWFsaXplZFJhdyAtIE5vcm1hbGl6ZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgKHRyaW1tZWQgd2hlbiBgdHJpbWAgaXMgZW5hYmxlZCkuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGAxYC9gdHJ1ZWAvYHllc2AvYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSk7IG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5jb25zdCBwYXJzZUJvb2xlYW5FbnZWYWx1ZSA9IChub3JtYWxpemVkUmF3OiBzdHJpbmcpOiBib29sZWFuID0+IFRSVUVfQk9PTEVBTl9QQVRURVJOLnRlc3Qobm9ybWFsaXplZFJhdyk7XG5cbi8qKlxuICogU3BlYyBmb3IgYSBib29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICogUGFyc2VzIGAxYCwgYHRydWVgLCBgeWVzYCwgYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSwgYWZ0ZXIgbm9ybWFsaXphdGlvbikgYXMgYHRydWVgO1xuICogYW55IG90aGVyIG5vbi1lbXB0eSB2YWx1ZSBhcyBgZmFsc2VgLlxuICogVHJpbXMgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGJ5IGRlZmF1bHQgKHNlZSB7QGxpbmsgU3RyaWN0RW52T3B0aW9ucy50cmltfSkuXG4gKiBEZWZhdWx0cyBiZWxvbmcgaW4ge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9LCBub3Qgb24gdGhpcyBzcGVjLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZUeXBlQm9vbGVhbiA9IHsgdHlwZTogJ2Jvb2xlYW4nIH07XG5cbi8qKlxuICogU3BlYyBmb3IgYW4gZW51bSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIGEgZml4ZWQgc2V0IG9mIGNob2ljZXMuXG4gKiBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgYGNob2ljZXNgIChjb21wYXJlZCBhZnRlciBub3JtYWxpemF0aW9uKTsgb3RoZXJ3aXNlIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBUcmltcyBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgYnkgZGVmYXVsdCAoc2VlIHtAbGluayBTdHJpY3RFbnZPcHRpb25zLnRyaW19KS5cbiAqIERlZmF1bHRzIGJlbG9uZyBpbiB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30sIG5vdCBvbiB0aGlzIHNwZWMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBMaXRlcmFsIHN0cmluZyB1bmlvbiBvZiBhbGxvd2VkIHZhbHVlcy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52VHlwZUVudW08VCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7IHR5cGU6ICdlbnVtJzsgY2hvaWNlczogcmVhZG9ubHkgVFtdIH07XG5cbi8qKiBVbmlvbiBvZiBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlcy4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlNwZWMgPVxuICB8IFN0cmljdEVudlR5cGVTdHJpbmdcbiAgfCBTdHJpY3RFbnZUeXBlTnVtYmVyXG4gIHwgU3RyaWN0RW52VHlwZUJvb2xlYW5cbiAgfCBTdHJpY3RFbnZUeXBlRW51bTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIG9mIGVycm9yIGtpbmRzIGVtaXR0ZWQgZHVyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIHBhcnNpbmcuXG4gKlxuICogLSBgbWlzc2luZ2Ag4oCUIFZhcmlhYmxlIHVuc2V0LCBlbXB0eSBzdHJpbmcsIG9yIHdoaXRlc3BhY2Utb25seSAod2hlbiB0cmltIGlzIGVuYWJsZWQpIHdpdGhvdXQgYSBkZWZhdWx0LlxuICogLSBgaW52YWxpZF9udW1iZXJgIOKAlCBWYWx1ZSBpcyBub3QgYSBmaW5pdGUgbnVtYmVyLCBub3QgYW4gaW50ZWdlciB3aGVuIHJlcXVpcmVkLCBvciBvdXRzaWRlIGBtaW5gL2BtYXhgXG4gKiAgIChzZWUge0BsaW5rIFN0cmljdEVudlR5cGVOdW1iZXJ9KS5cbiAqIC0gYGludmFsaWRfZW51bWAg4oCUIFZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgZW51bSBjaG9pY2VzLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZFcnJvcktpbmQgPSAnbWlzc2luZycgfCAnaW52YWxpZF9udW1iZXInIHwgJ2ludmFsaWRfZW51bSc7XG5cbi8qKlxuICogQSBzdHJ1Y3R1cmVkIHZhbGlkYXRpb24gZXJyb3IgZW50cnkgZm9yIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBLIC0gRW52aXJvbm1lbnQgdmFyaWFibGUga2V5IHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IHtcbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUuICovXG4gIGtleTogSztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuICovXG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIFJhdyB2YWx1ZSBmcm9tIGBwcm9jZXNzLmVudmAsIGlmIHByZXNlbnQuICovXG4gIHJhdz86IHN0cmluZztcbiAgLyoqIEVycm9yIGNhdGVnb3J5IGZvciBwcm9ncmFtbWF0aWMgaGFuZGxpbmcuICovXG4gIGtpbmQ6IFN0cmljdEVudkVycm9yS2luZDtcbn07XG5cbi8qKlxuICogQmFzZSBlcnJvciBjbGFzcyBmb3IgdGhpcyBwYWNrYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdHJ5IHtcbiAqICAgU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZSgnUE9SVCcsIFN0cmljdEVudlR5cGUuTnVtYmVyKTtcbiAqIH0gY2F0Y2ggKGUpIHtcbiAqICAgaWYgKGUgaW5zdGFuY2VvZiBTdHJpY3RFbnZFcnJvcikge1xuICogICAgIC8vIEhhbmRsZSBhbGwgc3RyaWN0LWVudi1yZXNvbHZlciBlcnJvcnNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdHJpY3RFbnZFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnU3RyaWN0RW52RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGlvbiBlcnJvciB0aGF0IGNhcnJpZXMgb25lIG9yIG1vcmUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXNzdWVzLlxuICpcbiAqIFRocm93biBieSBgU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZSgpYCAoc2luZ2xlLWVudHJ5IGBlcnJvcnNgKSBhbmRcbiAqIGBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKClgIChtdWx0aS1lbnRyeSBgZXJyb3JzYCkuXG4gKiBJbmRpdmlkdWFsIGVudHJpZXMgYXJlIHByb2R1Y2VkIGJ5IHRoZSBpbnRlcm5hbCBgcGFyc2VFbnZWYWx1ZWAgaGVscGVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLIC0gVW5pb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGUga2V5cyBpbmNsdWRlZCBpbiBgZXJyb3JzYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmljdEVudlZhbGlkYXRpb25FcnJvcjxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiBleHRlbmRzIFN0cmljdEVudkVycm9yIHtcbiAgLyoqXG4gICAqIEZvcm1hdHMgdmFsaWRhdGlvbiBlcnJvcnMgaW50byBhIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBLIC0gRW52aXJvbm1lbnQgdmFyaWFibGUga2V5IHR5cGUuXG4gICAqIEBwYXJhbSBlcnJvcnMgLSBWYWxpZGF0aW9uIGVycm9yIGVudHJpZXMgdG8gZm9ybWF0LlxuICAgKiBAcmV0dXJucyBNdWx0aS1saW5lIHN1bW1hcnkgbGlzdGluZyBlYWNoIGtleSBhbmQgbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZm9ybWF0PEsgZXh0ZW5kcyBzdHJpbmc+KGVycm9yczogcmVhZG9ubHkgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEs+W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzID0gZXJyb3JzLm1hcCgoZSkgPT4gYC0gJHtlLmtleX06ICR7ZS5tZXNzYWdlfSR7ZS5yYXcgPT0gbnVsbCA/ICcnIDogYCAocmF3PVwiJHtlLnJhd31cIilgfWApO1xuICAgIHJldHVybiBgSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKCR7ZXJyb3JzLmxlbmd0aH0pOlxcbiR7bGluZXMuam9pbignXFxuJyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJ1Y3R1cmVkIGxpc3Qgb2YgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JzOiByZWFkb25seSBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnk8Sz5bXTtcbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIGxpc3Qgb2Yga2V5cyBpbmNsdWRlZCBpbiBgZXJyb3JzYC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBrZXlzOiByZWFkb25seSBLW107XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdmFsaWRhdGlvbiBlcnJvciBmcm9tIG9uZSBvciBtb3JlIGBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnlgIGVudHJpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvcnMgLSBPbmUgb3IgbW9yZSBzdHJ1Y3R1cmVkIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVycm9yczogcmVhZG9ubHkgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEs+W10pIHtcbiAgICBjb25zdCBtc2cgPSBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3IuZm9ybWF0KGVycm9ycyk7XG4gICAgc3VwZXIobXNnKTtcbiAgICB0aGlzLm5hbWUgPSAnU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yJztcbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB0aGlzLmtleXMgPSBlcnJvcnMubWFwKChlKSA9PiBlLmtleSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBudW1lcmljIGVudiBzcGVjIGZyb20gb3B0aW9uYWwgY29uc3RyYWludHMuXG4gKlxuICogQHBhcmFtIGNvbnN0cmFpbnRzIC0gT3B0aW9uYWwgYG1pbmAsIGBtYXhgLCBhbmQvb3IgYGludGVnZXJgIGJvdW5kcy5cbiAqIEByZXR1cm5zIE51bWJlciBzcGVjIGZvciB1c2Ugd2l0aCBgcmVzb2x2ZWAgb3IgYHJlc29sdmVBbGxgLlxuICovXG5jb25zdCBjcmVhdGVOdW1iZXJTcGVjID0gKGNvbnN0cmFpbnRzPzogU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHMpOiBTdHJpY3RFbnZUeXBlTnVtYmVyID0+ICh7XG4gIHR5cGU6ICdudW1iZXInLFxuICAuLi4oY29uc3RyYWludHM/Lm1pbiAhPT0gdW5kZWZpbmVkID8geyBtaW46IGNvbnN0cmFpbnRzLm1pbiB9IDoge30pLFxuICAuLi4oY29uc3RyYWludHM/Lm1heCAhPT0gdW5kZWZpbmVkID8geyBtYXg6IGNvbnN0cmFpbnRzLm1heCB9IDoge30pLFxuICAuLi4oY29uc3RyYWludHM/LmludGVnZXIgIT09IHVuZGVmaW5lZCA/IHsgaW50ZWdlcjogY29uc3RyYWludHMuaW50ZWdlciB9IDoge30pLFxufSk7XG5cbi8qKlxuICogVW5jb25zdHJhaW5lZCBmaW5pdGUtbnVtYmVyIHNwZWMsIGFsc28gY2FsbGFibGUgYXMgYSBmYWN0b3J5IGZvciBjb25zdHJhaW5lZCBzcGVjcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIFN0cmljdEVudlR5cGUuTnVtYmVyXG4gKiBTdHJpY3RFbnZUeXBlLk51bWJlcih7IG1pbjogMCB9KVxuICogU3RyaWN0RW52VHlwZS5OdW1iZXIoeyBtaW46IDEsIG1heDogNjU1MzUsIGludGVnZXI6IHRydWUgfSlcbiAqIGBgYFxuICovXG50eXBlIFN0cmljdEVudk51bWJlclNwZWNGYWN0b3J5ID0ge1xuICAoY29uc3RyYWludHM/OiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyk6IFN0cmljdEVudlR5cGVOdW1iZXI7XG59ICYgU3RyaWN0RW52VHlwZU51bWJlcjtcblxuY29uc3QgTnVtYmVyU3BlYzogU3RyaWN0RW52TnVtYmVyU3BlY0ZhY3RvcnkgPSBPYmplY3QuYXNzaWduKFxuICAoY29uc3RyYWludHM/OiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyk6IFN0cmljdEVudlR5cGVOdW1iZXIgPT4gY3JlYXRlTnVtYmVyU3BlYyhjb25zdHJhaW50cyksXG4gIHsgdHlwZTogJ251bWJlcicgfSBhcyBjb25zdCBzYXRpc2ZpZXMgU3RyaWN0RW52VHlwZU51bWJlcixcbik7XG5cbi8qKlxuICogUHJlZGVmaW5lZCBzcGVjIGNvbnN0YW50cyBmb3IgdXNlIHdpdGggYHJlc29sdmVgIG9yIGFzIHNjaGVtYSB2YWx1ZXMgaW4gYHJlc29sdmVBbGxgLlxuICogU3BlY3MgZGVzY3JpYmUgdHlwZSBvbmx5OyBwcm92aWRlIGBkZWZhdWx0YCAvIGB0cmltYCB2aWEge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9XG4gKiAodGhpcmQgYXJndW1lbnQgb2YgYHJlc29sdmVgLCBvciBhIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlIGluIGByZXNvbHZlQWxsYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBTdHJpY3RFbnZUeXBlID0ge1xuICAvKiogU3BlYyBmb3IgYSBzdHJpbmcgdmFsdWUgKHJldHVybmVkIGFzLWlzIHVubGVzcyBgdHJpbTogdHJ1ZWAgaXMgc2V0IGluIG9wdGlvbnMpLiAqL1xuICBTdHJpbmc6IHsgdHlwZTogJ3N0cmluZycgfSBhcyBjb25zdCBzYXRpc2ZpZXMgU3RyaWN0RW52VHlwZVN0cmluZyxcbiAgLyoqXG4gICAqIFNwZWMgZm9yIGEgZmluaXRlIG51bWVyaWMgdmFsdWUgKGBOdW1iZXIoKWAgcGFyc2luZzsgcmVqZWN0cyBgTmFOYCBhbmQgYEluZmluaXR5YCkuXG4gICAqIFVzZSBhcyBgU3RyaWN0RW52VHlwZS5OdW1iZXJgLCBvciBjYWxsIGFzIGBTdHJpY3RFbnZUeXBlLk51bWJlcih7IG1pbiwgbWF4LCBpbnRlZ2VyIH0pYC5cbiAgICovXG4gIE51bWJlcjogTnVtYmVyU3BlYyxcbiAgLyoqXG4gICAqIFNwZWMgZm9yIGEgcG9zaXRpdmUgaW50ZWdlciAoYD49IDFgKS4gU3VnYXIgZm9yIGBOdW1iZXIoeyBtaW46IDEsIGludGVnZXI6IHRydWUgfSlgLlxuICAgKi9cbiAgUG9zaXRpdmVJbnQ6IGNyZWF0ZU51bWJlclNwZWMoeyBtaW46IDEsIGludGVnZXI6IHRydWUgfSksXG4gIC8qKlxuICAgKiBTcGVjIGZvciBhIG5lZ2F0aXZlIGludGVnZXIgKGA8PSAtMWApLiBTdWdhciBmb3IgYE51bWJlcih7IG1heDogLTEsIGludGVnZXI6IHRydWUgfSlgLlxuICAgKi9cbiAgTmVnYXRpdmVJbnQ6IGNyZWF0ZU51bWJlclNwZWMoeyBtYXg6IC0xLCBpbnRlZ2VyOiB0cnVlIH0pLFxuICAvKiogU3BlYyBmb3IgYSBib29sZWFuIHZhbHVlIChgMWAvYHRydWVgL2B5ZXNgL2BvbmAg4oaSIGB0cnVlYDsgb3RoZXIgbm9uLWVtcHR5IHZhbHVlcyDihpIgYGZhbHNlYCkuICovXG4gIEJvb2xlYW46IHsgdHlwZTogJ2Jvb2xlYW4nIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFN0cmljdEVudlR5cGVCb29sZWFuLFxuICAvKipcbiAgICogUmV0dXJucyBhIHNwZWMgdGhhdCByZXN0cmljdHMgdGhlIHZhbHVlIHRvIG9uZSBvZiB0aGUgZ2l2ZW4gY2hvaWNlcy5cbiAgICpcbiAgICogQHBhcmFtIGNob2ljZXMgLSBBbGxvd2VkIHN0cmluZyBsaXRlcmFscy5cbiAgICogQHJldHVybnMgRW51bSBzcGVjIGZvciB1c2Ugd2l0aCBgcmVzb2x2ZWAgb3IgYHJlc29sdmVBbGxgLlxuICAgKi9cbiAgRW51bTogPFQgZXh0ZW5kcyBzdHJpbmc+KGNob2ljZXM6IHJlYWRvbmx5IFRbXSkgPT4gKHsgdHlwZTogJ2VudW0nLCBjaG9pY2VzIH0pIGFzIFN0cmljdEVudlR5cGVFbnVtPFQ+LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBJbmZlcnMgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGdpdmVuIHNwZWMuXG4gKiBAdGVtcGxhdGUgUyAtIEEgYFN0cmljdEVudlNwZWNgIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlNwZWNUb1R5cGU8Uz4gPVxuICBTIGV4dGVuZHMgU3RyaWN0RW52VHlwZVN0cmluZyA/IHN0cmluZ1xuICAgIDogUyBleHRlbmRzIFN0cmljdEVudlR5cGVOdW1iZXIgPyBudW1iZXJcbiAgICAgIDogUyBleHRlbmRzIFN0cmljdEVudlR5cGVCb29sZWFuID8gYm9vbGVhblxuICAgICAgICA6IFMgZXh0ZW5kcyBTdHJpY3RFbnZUeXBlRW51bTxpbmZlciBUPiA/IFRcbiAgICAgICAgICA6IG5ldmVyO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJlYWRpbmcgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBhbiBvcHRpb25hbCBkZWZhdWx0LlxuICogVXNlZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQgdG8gYHJlc29sdmVgIG9yIGFzIHRoZSBzZWNvbmQgZWxlbWVudCBvZiBhIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlIGluIGByZXNvbHZlQWxsYC5cbiAqXG4gKiBgdHJpbWAgZGVmYXVsdHMgdG8gYHRydWVgIGZvciBgbnVtYmVyYCwgYGJvb2xlYW5gLCBhbmQgYGVudW1gIHNwZWNzICh3aGl0ZXNwYWNlLW9ubHkgdmFsdWVzIGFyZVxuICogdHJlYXRlZCBhcyBtaXNzaW5nKS4gRm9yIGBzdHJpbmdgIHNwZWNzIGl0IGRlZmF1bHRzIHRvIGBmYWxzZWAgKHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMtaXMpLlxuICpcbiAqIEB0ZW1wbGF0ZSBTIC0gRW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZPcHRpb25zPFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjPiA9IHtcbiAgLyoqIEZhbGxiYWNrIHdoZW4gdGhlIHZhcmlhYmxlIGlzIHVuc2V0LCBlbXB0eSAoYFwiXCJgKSwgb3Igd2hpdGVzcGFjZS1vbmx5ICh3aGVuIGB0cmltYCBpcyBlbmFibGVkKS4gKi9cbiAgZGVmYXVsdD86IFN0cmljdEVudlNwZWNUb1R5cGU8Uz47XG4gIC8qKiBXaGVuIGB0cnVlYCwgdHJpbXMgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGJlZm9yZSB2YWxpZGF0aW9uLiAqL1xuICB0cmltPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU2NoZW1hIGVudHJ5IGZvciBhIHNpbmdsZSBlbnYgdmFyLlxuICpcbiAqIEVpdGhlciBhIHNwZWMgYWxvbmUsIG9yIGEgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGUgdG8gYXR0YWNoIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfVxuICogKGZvciBleGFtcGxlIGBkZWZhdWx0YCBhbmQvb3IgYHRyaW1gKS5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U2NoZW1hRW50cnk8UyBleHRlbmRzIFN0cmljdEVudlNwZWMgPSBTdHJpY3RFbnZTcGVjPiA9IFMgfCByZWFkb25seSBbUywgU3RyaWN0RW52T3B0aW9uczxTPl07XG5cbi8qKlxuICogU2NoZW1hIG9iamVjdCB1c2VkIGJ5IGByZXNvbHZlQWxsKClgLlxuICpcbiAqIEtleXMgYXJlIGVudiB2YXIgbmFtZXM7IHZhbHVlcyBhcmUgc3BlY3Mgb3IgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGVzLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZTY2hlbWEgPSBSZWNvcmQ8c3RyaW5nLCBTdHJpY3RFbnZTY2hlbWFFbnRyeT47XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHNwZWMgdHlwZSBmcm9tIGEgc2NoZW1hIGVudHJ5IG9yIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBFIC0gU2NoZW1hIGVudHJ5IHR5cGUuXG4gKi9cbnR5cGUgU3RyaWN0RW52U2NoZW1hRW50cnlUb1NwZWM8RT4gPSBFIGV4dGVuZHMgcmVhZG9ubHkgW2luZmVyIFMsIHVua25vd25dID8gUyA6IEU7XG5cbi8qKlxuICogTWFwcyBhIHNjaGVtYSBvYmplY3QgdG8gdGhlIHJlc3VsdGluZyBwYXJzZWQgZW52aXJvbm1lbnQgb2JqZWN0IHR5cGUuXG4gKlxuICogQHRlbXBsYXRlIFRTY2hlbWEgLSBTY2hlbWEgb2JqZWN0IHR5cGUgcGFzc2VkIHRvIGByZXNvbHZlQWxsYC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWEgZXh0ZW5kcyBTdHJpY3RFbnZTY2hlbWE+ID0ge1xuICBbSyBpbiBrZXlvZiBUU2NoZW1hXTogU3RyaWN0RW52U3BlY1RvVHlwZTxTdHJpY3RFbnZTY2hlbWFFbnRyeVRvU3BlYzxUU2NoZW1hW0tdPiAmIFN0cmljdEVudlNwZWM+O1xufTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHJlc3VsdCBvZiBwYXJzaW5nIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIE9uIHN1Y2Nlc3MsIGB2YWx1ZWAgaG9sZHMgdGhlIHBhcnNlZCByZXN1bHQuIE9uIGZhaWx1cmUsIGBlcnJvcmAgaG9sZHMgYSBzdHJ1Y3R1cmVkXG4gKiBgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5YCBlbnRyeSAobmV2ZXIgdGhyb3dzKS5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKi9cbnR5cGUgUGFyc2VFbnZWYWx1ZVJlc3VsdDxLIGV4dGVuZHMgc3RyaW5nLCBTIGV4dGVuZHMgU3RyaWN0RW52U3BlYz4gPVxuICB8IHsgb2s6IHRydWU7IHZhbHVlOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH1cbiAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLPiB9O1xuXG4vKipcbiAqIERlZmF1bHQgdHJpbSBiZWhhdmlvciBwZXIgc3BlYyB0eXBlLlxuICogUGFyc2VkIHR5cGVzIHRyaW0gYnkgZGVmYXVsdDsgc3RyaW5ncyBwcmVzZXJ2ZSB0aGUgcmF3IHZhbHVlIHVubGVzcyBvcHRlZCBpbi5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIEVudmlyb25tZW50IHZhcmlhYmxlIHNwZWMuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBzaG91bGQgYmUgdHJpbW1lZCBiZWZvcmUgdmFsaWRhdGlvbi5cbiAqL1xuY29uc3QgZGVmYXVsdFRyaW1Gb3JTcGVjID0gKHNwZWM6IFN0cmljdEVudlNwZWMpOiBib29sZWFuID0+IHNwZWMudHlwZSAhPT0gJ3N0cmluZyc7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHJhdyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBiZWZvcmUgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gUmF3IHZhbHVlIGZyb20gYHByb2Nlc3MuZW52YCwgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSB0cmltIC0gV2hldGhlciB0byB0cmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgdmFsdWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQuXG4gKi9cbmNvbnN0IG5vcm1hbGl6ZUVudlJhdyA9IChyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCwgdHJpbTogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChyYXcgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKCF0cmltKSB7XG4gICAgcmV0dXJuIHJhdztcbiAgfVxuICByZXR1cm4gcmF3LnRyaW0oKTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgcGFyc2VkIG51bWJlciBhZ2FpbnN0IG9wdGlvbmFsIHtAbGluayBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50c30uXG4gKlxuICogQHRlbXBsYXRlIEsgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgdHlwZS5cbiAqIEBwYXJhbSBrZXkgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lLlxuICogQHBhcmFtIHJhdyAtIFJhdyB2YWx1ZSBmcm9tIGBwcm9jZXNzLmVudmAsIGlmIHByZXNlbnQuXG4gKiBAcGFyYW0gbiAtIFBhcnNlZCBmaW5pdGUgbnVtYmVyLlxuICogQHBhcmFtIGNvbnN0cmFpbnRzIC0gT3B0aW9uYWwgYG1pbmAsIGBtYXhgLCBhbmQvb3IgYGludGVnZXJgIGNvbnN0cmFpbnRzLlxuICogQHJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB2YWxpZDsgb3RoZXJ3aXNlIGEgc3RydWN0dXJlZCB2YWxpZGF0aW9uIGVycm9yLlxuICovXG5jb25zdCB2YWxpZGF0ZU51bWJlckNvbnN0cmFpbnRzID0gPEsgZXh0ZW5kcyBzdHJpbmc+KFxuICBrZXk6IEssXG4gIHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBuOiBudW1iZXIsXG4gIGNvbnN0cmFpbnRzOiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyxcbik6IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLPiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChjb25zdHJhaW50cy5pbnRlZ2VyID09PSB0cnVlICYmICFOdW1iZXIuaXNJbnRlZ2VyKG4pKSB7XG4gICAgcmV0dXJuIHsga2V5LCBtZXNzYWdlOiBgRW52ICR7a2V5fTogZXhwZWN0ZWQgaW50ZWdlciwgZ290IFwiJHtyYXd9XCJgLCByYXcsIGtpbmQ6ICdpbnZhbGlkX251bWJlcicgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMubWluICE9PSB1bmRlZmluZWQgJiYgbiA8IGNvbnN0cmFpbnRzLm1pbikge1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBtZXNzYWdlOiBgRW52ICR7a2V5fTogbXVzdCBiZSA+PSAke2NvbnN0cmFpbnRzLm1pbn0sIGdvdCAke259YCxcbiAgICAgIHJhdyxcbiAgICAgIGtpbmQ6ICdpbnZhbGlkX251bWJlcicsXG4gICAgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMubWF4ICE9PSB1bmRlZmluZWQgJiYgbiA+IGNvbnN0cmFpbnRzLm1heCkge1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBtZXNzYWdlOiBgRW52ICR7a2V5fTogbXVzdCBiZSA8PSAke2NvbnN0cmFpbnRzLm1heH0sIGdvdCAke259YCxcbiAgICAgIHJhdyxcbiAgICAgIGtpbmQ6ICdpbnZhbGlkX251bWJlcicsXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgYHBhcnNlRW52VmFsdWVgIChzdWJzZXQgb2YgYFN0cmljdEVudk9wdGlvbnNgKS4gKi9cbnR5cGUgUGFyc2VFbnZWYWx1ZU9wdGlvbnM8UyBleHRlbmRzIFN0cmljdEVudlNwZWM+ID0gUGljazxTdHJpY3RFbnZPcHRpb25zPFM+LCAndHJpbSc+O1xuXG4vKipcbiAqIFJlc29sdmVzIGEgc2NoZW1hIGVudHJ5IGludG8gaXRzIHNwZWMgYW5kIG9wdGlvbmFsIHBlci1rZXkgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gZW50cnkgLSBTY2hlbWEgZW50cnkgb3IgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGUuXG4gKiBAcmV0dXJucyBQYXJzZWQgc3BlYyBhbmQgb3B0aW9ucyBmb3IgYHJlc29sdmVBbGxgLlxuICovXG5jb25zdCByZXNvbHZlU2NoZW1hRW50cnkgPSAoXG4gIGVudHJ5OiBTdHJpY3RFbnZTY2hlbWFFbnRyeSxcbik6IHsgc3BlYzogU3RyaWN0RW52U3BlYzsgb3B0aW9uczogU3RyaWN0RW52T3B0aW9uczxTdHJpY3RFbnZTcGVjPiB8IHVuZGVmaW5lZCB9ID0+ICh7XG4gIHNwZWM6IChBcnJheS5pc0FycmF5KGVudHJ5KSA/IGVudHJ5WzBdIDogZW50cnkpIGFzIFN0cmljdEVudlNwZWMsXG4gIG9wdGlvbnM6IChBcnJheS5pc0FycmF5KGVudHJ5KSA/IGVudHJ5WzFdIDogdW5kZWZpbmVkKSBhcyBTdHJpY3RFbnZPcHRpb25zPFN0cmljdEVudlNwZWM+IHwgdW5kZWZpbmVkLFxufSk7XG5cbi8qKlxuICogUGFyc2VzIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc3BlYy5cbiAqXG4gKiBDZW50cmFsIHZhbGlkYXRpb24gaGVscGVyIHNoYXJlZCBieSBgcmVzb2x2ZWAgYW5kIGByZXNvbHZlQWxsYC4gRG9lcyBub3QgdGhyb3c7XG4gKiBjYWxsZXJzIGRlY2lkZSB3aGV0aGVyIHRvIHRocm93IGltbWVkaWF0ZWx5IG9yIGNvbGxlY3QgZXJyb3JzLlxuICpcbiAqIE1pc3Npbmcgb3IgZW1wdHkgKGBcIlwiYCkgdmFsdWVzIHVzZSBgZGVmYXVsdFZhbHVlYCB3aGVuIHByb3ZpZGVkLiBXaGVuIGB0cmltYCBpcyBlbmFibGVkLFxuICogd2hpdGVzcGFjZS1vbmx5IHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBlbXB0eS4gTnVtYmVyIHNwZWNzIGRlbGVnYXRlIHRvIGBwYXJzZU51bWJlcmAsIHRoZW5cbiAqIG9wdGlvbmFsIGBtaW5gIC8gYG1heGAgLyBgaW50ZWdlcmAgY29uc3RyYWludHMgKHNlZSB7QGxpbmsgU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHN9KS5cbiAqIEJvb2xlYW4gc3BlY3MgdHJlYXQgYDFgL2B0cnVlYC9geWVzYC9gb25gIChjYXNlLWluc2Vuc2l0aXZlLCBhZnRlciBub3JtYWxpemF0aW9uKSBhcyBgdHJ1ZWAuXG4gKiBFbnVtIHNwZWNzIHJlcXVpcmUgYW4gZXhhY3QgbWF0Y2ggaW4gYGNob2ljZXNgIChhZnRlciBub3JtYWxpemF0aW9uKS5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKiBAcGFyYW0ga2V5IC0gRW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZS5cbiAqIEBwYXJhbSBzcGVjIC0gVHlwZSBzcGVjIGZvciB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gcmF3IC0gUmF3IHZhbHVlIGZyb20gYHByb2Nlc3MuZW52YCwgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgLSBGYWxsYmFjayBmcm9tIHtAbGluayBTdHJpY3RFbnZPcHRpb25zLmRlZmF1bHR9IHdoZW4gYHJhd2AgaXMgbWlzc2luZyBvciBlbXB0eS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgdHJpbSBvdmVycmlkZSAoYHRyaW1gIGRlZmF1bHRzIHBlciBzcGVjIHR5cGUpLlxuICogQHJldHVybnMgUGFyc2VkIHZhbHVlIG9yIGEgc3RydWN0dXJlZCB2YWxpZGF0aW9uIGVycm9yLlxuICovXG5jb25zdCBwYXJzZUVudlZhbHVlID0gPEsgZXh0ZW5kcyBzdHJpbmcsIFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjPihcbiAga2V5OiBLLFxuICBzcGVjOiBTLFxuICByYXc6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGVmYXVsdFZhbHVlOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzogUGFyc2VFbnZWYWx1ZU9wdGlvbnM8Uz4sXG4pOiBQYXJzZUVudlZhbHVlUmVzdWx0PEssIFM+ID0+IHtcbiAgY29uc3QgdHJpbSA9IG9wdGlvbnM/LnRyaW0gPz8gZGVmYXVsdFRyaW1Gb3JTcGVjKHNwZWMpO1xuICBjb25zdCBub3JtYWxpemVkUmF3ID0gbm9ybWFsaXplRW52UmF3KHJhdywgdHJpbSk7XG4gIGNvbnN0IGhhc0RlZmF1bHQgPSBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZDtcblxuICBpZiAobm9ybWFsaXplZFJhdyA9PSBudWxsIHx8IG5vcm1hbGl6ZWRSYXcgPT09ICcnKSB7XG4gICAgaWYgKGhhc0RlZmF1bHQpIHtcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogZGVmYXVsdFZhbHVlIGFzIFN0cmljdEVudlNwZWNUb1R5cGU8Uz4gfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIGVycm9yOiB7IGtleSwgbWVzc2FnZTogYE1pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGU6ICR7a2V5fWAsIHJhdywga2luZDogJ21pc3NpbmcnIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN3aXRjaCAoc3BlYy50eXBlKSB7XG4gICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgY29uc3QgbiA9IHBhcnNlTnVtYmVyKG5vcm1hbGl6ZWRSYXcpO1xuICAgICAgaWYgKG4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogeyBrZXksIG1lc3NhZ2U6IGBFbnYgJHtrZXl9OiBleHBlY3RlZCBudW1iZXIsIGdvdCBcIiR7cmF3fVwiYCwgcmF3LCBraW5kOiAnaW52YWxpZF9udW1iZXInIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBjb25zdHJhaW50RXJyb3IgPSB2YWxpZGF0ZU51bWJlckNvbnN0cmFpbnRzKGtleSwgcmF3LCBuLCBzcGVjKTtcbiAgICAgIGlmIChjb25zdHJhaW50RXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBjb25zdHJhaW50RXJyb3IgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogbiBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gICAgfVxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIHZhbHVlOiBwYXJzZUJvb2xlYW5FbnZWYWx1ZShub3JtYWxpemVkUmF3KSBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gICAgY2FzZSAnZW51bSc6XG4gICAgICBpZiAoIXNwZWMuY2hvaWNlcy5pbmNsdWRlcyhub3JtYWxpemVkUmF3KSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbWVzc2FnZTogYEVudiAke2tleX06IG11c3QgYmUgb25lIG9mIFske3NwZWMuY2hvaWNlcy5qb2luKCcsICcpfV1gLFxuICAgICAgICAgICAgcmF3LFxuICAgICAgICAgICAga2luZDogJ2ludmFsaWRfZW51bScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogbm9ybWFsaXplZFJhdyBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogbm9ybWFsaXplZFJhdyBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gIH1cbn07XG5cbi8qKlxuICogUmVhZHMgYW5kIHBhcnNlcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNwZWMuXG4gKlxuICogRGVsZWdhdGVzIHZhbGlkYXRpb24gdG8gYHBhcnNlRW52VmFsdWVgLiBNaXNzaW5nIG9yIGVtcHR5IChgXCJcImApIHZhbHVlcyB1c2VcbiAqIGBvcHRpb25zLmRlZmF1bHRgIHdoZW4gcHJvdmlkZWQ7IG90aGVyd2lzZSBhIGBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3JgIGlzIHRocm93bi5cbiAqIFdoaXRlc3BhY2Utb25seSB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgbWlzc2luZyB3aGVuIGB0cmltYCBpcyBlbmFibGVkLlxuICogRm9yIGBTdHJpY3RFbnZUeXBlLk51bWJlcmAsIHZhbHVlcyBhcmUgcGFyc2VkIGFzIGZpbml0ZSBudW1iZXJzIChzZWUge0BsaW5rIFN0cmljdEVudlR5cGVOdW1iZXJ9KS5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKiBAcGFyYW0ga2V5IC0gRW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSAoZS5nLiBgXCJQT1JUXCJgLCBgXCJOT0RFX0VOVlwiYCkuXG4gKiBAcGFyYW0gc3BlYyAtIFR5cGUgc3BlYzsgZGVmYXVsdHMgdG8gYFN0cmljdEVudlR5cGUuU3RyaW5nYCB3aGVuIG9taXR0ZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGB7IGRlZmF1bHQsIHRyaW0gfWA7IHNlZSB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30uXG4gKiBAcmV0dXJucyBQYXJzZWQgdmFsdWUgd2l0aCB0eXBlIGluZmVycmVkIGZyb20gYHNwZWNgLlxuICogQHRocm93cyB7U3RyaWN0RW52VmFsaWRhdGlvbkVycm9yfSBXaGVuIHRoZSB2YXJpYWJsZSBpcyBtaXNzaW5nLCBlbXB0eSB3aXRob3V0IGEgZGVmYXVsdCxcbiAqICAgd2hpdGVzcGFjZS1vbmx5IHdpdGhvdXQgYSBkZWZhdWx0ICh3aGVuIHRyaW1taW5nKSwgb3IgaW52YWxpZCBmb3IgdGhlIHNwZWMuXG4gKi9cbmNvbnN0IHJlc29sdmUgPSA8SyBleHRlbmRzIHN0cmluZywgUyBleHRlbmRzIFN0cmljdEVudlNwZWMgPSBTdHJpY3RFbnZUeXBlU3RyaW5nPihcbiAga2V5OiBLLFxuICBzcGVjOiBTID0gU3RyaWN0RW52VHlwZS5TdHJpbmcgYXMgUyxcbiAgb3B0aW9ucz86IFN0cmljdEVudk9wdGlvbnM8Uz4sXG4pOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+ID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gcGFyc2VFbnZWYWx1ZShrZXksIHNwZWMsIHByb2Nlc3MuZW52W2tleV0sIG9wdGlvbnM/LmRlZmF1bHQsIG9wdGlvbnMpO1xuICBpZiAoIXJlc3VsdC5vaykge1xuICAgIHRocm93IG5ldyBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3IoW3Jlc3VsdC5lcnJvcl0pO1xuICB9XG4gIHJldHVybiByZXN1bHQudmFsdWU7XG59O1xuXG4vKipcbiAqIFJlYWRzIGFuZCBwYXJzZXMgbXVsdGlwbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc2NoZW1hLlxuICpcbiAqIEFsd2F5cyBldmFsdWF0ZXMgZXZlcnkga2V5IGluIGBzY2hlbWFgLiBFYWNoIGVudHJ5IGlzIHZhbGlkYXRlZCB2aWEgYHBhcnNlRW52VmFsdWVgO1xuICogYWxsIGVycm9ycyBhcmUgY29sbGVjdGVkIGFuZCB0aHJvd24gb25jZSBpbiBhIHNpbmdsZSBgU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yYC5cbiAqIE51bWJlciBzcGVjcyB1c2UgdGhlIHNhbWUgZmluaXRlLW51bWJlciBydWxlcyBhcyBgcmVzb2x2ZWAuXG4gKlxuICogQHRlbXBsYXRlIFRTY2hlbWEgLSBTY2hlbWEgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gc2NoZW1hIC0gTWFwIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzIHRvIHNwZWNzIG9yIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlc1xuICogICAoc2VlIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfSBmb3IgcGVyLWtleSBgZGVmYXVsdGAgLyBgdHJpbWApLlxuICogQHJldHVybnMgUGFyc2VkIGVudmlyb25tZW50IG9iamVjdCB3aXRoIHR5cGVzIGluZmVycmVkIGZyb20gdGhlIHNjaGVtYS5cbiAqIEB0aHJvd3Mge1N0cmljdEVudlZhbGlkYXRpb25FcnJvcn0gV2hlbiBvbmUgb3IgbW9yZSB2YXJpYWJsZXMgYXJlIG1pc3NpbmcsIGVtcHR5IHdpdGhvdXQgYSBkZWZhdWx0LFxuICogICB3aGl0ZXNwYWNlLW9ubHkgd2l0aG91dCBhIGRlZmF1bHQgKHdoZW4gdHJpbW1pbmcpLCBvciBpbnZhbGlkLlxuICovXG5jb25zdCByZXNvbHZlQWxsID0gPFRTY2hlbWEgZXh0ZW5kcyBTdHJpY3RFbnZTY2hlbWE+KHNjaGVtYTogVFNjaGVtYSk6IFN0cmljdEVudlNjaGVtYVRvVHlwZTxUU2NoZW1hPiA9PiB7XG4gIGNvbnN0IGVudnM6IFBhcnRpYWw8U3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWE+PiA9IHt9O1xuICBjb25zdCBlcnJvcnM6IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxFeHRyYWN0PGtleW9mIFRTY2hlbWEsIHN0cmluZz4+W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpIGFzIEFycmF5PEV4dHJhY3Q8a2V5b2YgVFNjaGVtYSwgc3RyaW5nPj4pIHtcbiAgICBjb25zdCB7IHNwZWMsIG9wdGlvbnMgfSA9IHJlc29sdmVTY2hlbWFFbnRyeShzY2hlbWFba2V5XSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZUVudlZhbHVlKGtleSwgc3BlYywgcHJvY2Vzcy5lbnZba2V5XSwgb3B0aW9ucz8uZGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5lcnJvcik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZW52c1trZXldID0gcmVzdWx0LnZhbHVlIGFzIFN0cmljdEVudlNjaGVtYVRvVHlwZTxUU2NoZW1hPlt0eXBlb2Yga2V5XTtcbiAgfVxuXG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkgdGhyb3cgbmV3IFN0cmljdEVudlZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICByZXR1cm4gZW52cyBhcyBTdHJpY3RFbnZTY2hlbWFUb1R5cGU8VFNjaGVtYT47XG59O1xuXG4vKipcbiAqIFR5cGUtc2FmZSBlbnZpcm9ubWVudCB2YXJpYWJsZSByZXNvbHZlciBmb3IgTm9kZS5qcyBgcHJvY2Vzcy5lbnZgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgcG9ydCA9IFN0cmljdEVudlJlc29sdmVyLnJlc29sdmUoJ1BPUlQnLCBTdHJpY3RFbnZUeXBlLlBvc2l0aXZlSW50KTtcbiAqIGNvbnN0IGVudnMgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKHtcbiAqICAgUE9SVDogU3RyaWN0RW52VHlwZS5Qb3NpdGl2ZUludCxcbiAqICAgREVCVUc6IFtTdHJpY3RFbnZUeXBlLkJvb2xlYW4sIHsgZGVmYXVsdDogZmFsc2UgfV0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgU3RyaWN0RW52UmVzb2x2ZXIgPSB7XG4gIC8qKiBSZWFkcyBhbmQgcGFyc2VzIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLiBTZWUge0BsaW5rIHJlc29sdmV9LiAqL1xuICByZXNvbHZlLFxuICAvKiogUmVhZHMgYW5kIHBhcnNlcyBtdWx0aXBsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gb25lIHBhc3MuIFNlZSB7QGxpbmsgcmVzb2x2ZUFsbH0uICovXG4gIHJlc29sdmVBbGwsXG59IGFzIGNvbnN0O1xuIl19
378
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBbUNBOzs7R0FHRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7QUFFbEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQVcsRUFBc0IsRUFBRTtJQUN0RCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxhQUFxQixFQUFXLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFzRDFHOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFzQixjQUFlLFNBQVEsS0FBSztJQUNoRDs7T0FFRztJQUNILFlBQXNCLE9BQWU7UUFDbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFSRCx3Q0FRQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBYSx3QkFBb0QsU0FBUSxjQUFjO0lBQ3JGOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQW1CLE1BQThDO1FBQ25GLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMs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RztBQUNILE1BQU0sVUFBVSxHQUFHLENBQWtDLE1BQWUsRUFBa0MsRUFBRTtJQUN0RyxNQUFNLElBQUksR0FBNEMsRUFBRSxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUErRCxFQUFFLENBQUM7SUFFOUUsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBMEMsRUFBRSxDQUFDO1FBQy9FLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFMUQsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixTQUFTO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBbUQsQ0FBQztJQUN6RSxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxNQUFNLElBQUksd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEUsT0FBTyxJQUFzQyxDQUFDO0FBQ2hELENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7OztHQVdHO0FBQ1UsUUFBQSxpQkFBaUIsR0FBRztJQUMvQiwyRUFBMkU7SUFDM0UsT0FBTztJQUNQLDJGQUEyRjtJQUMzRixVQUFVO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3BlYyBmb3IgYSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBWYWx1ZXMgYXJlIHJldHVybmVkIGFzLWlzIHVubGVzcyBgdHJpbTogdHJ1ZWAgaXMgc2V0IGluIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfVxuICogKHdoaXRlc3BhY2Utb25seSB2YWx1ZXMgYXJlIHRoZW4gdHJlYXRlZCBhcyBtaXNzaW5nKS5cbiAqIERlZmF1bHRzIGJlbG9uZyBpbiB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30sIG5vdCBvbiB0aGlzIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlR5cGVTdHJpbmcgPSB7IHR5cGU6ICdzdHJpbmcnIH07XG5cbi8qKlxuICogT3B0aW9uYWwgY29uc3RyYWludHMgZm9yIGEgbnVtZXJpYyBlbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjLlxuICogVXNlZCBieSB7QGxpbmsgU3RyaWN0RW52VHlwZS5OdW1iZXJ9IHdoZW4gY2FsbGVkIGFzIGEgZmFjdG9yeSwgYW5kIGJ5IG5lc3RlZCBwcmVzZXRzXG4gKiBzdWNoIGFzIHtAbGluayBTdHJpY3RFbnZUeXBlLk51bWJlci5Qb3J0fSAvIHtAbGluayBTdHJpY3RFbnZUeXBlLk51bWJlci5Qb3NpdGl2ZUludGVnZXJ9LlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyA9IHtcbiAgLyoqIEluY2x1c2l2ZSBsb3dlciBib3VuZCAoYG4gPj0gbWluYCkuICovXG4gIG1pbj86IG51bWJlcjtcbiAgLyoqIEluY2x1c2l2ZSB1cHBlciBib3VuZCAoYG4gPD0gbWF4YCkuICovXG4gIG1heD86IG51bWJlcjtcbiAgLyoqIEV4Y2x1c2l2ZSBsb3dlciBib3VuZCAoYG4gPiBleGNsdXNpdmVNaW5gKS4gKi9cbiAgZXhjbHVzaXZlTWluPzogbnVtYmVyO1xuICAvKiogRXhjbHVzaXZlIHVwcGVyIGJvdW5kIChgbiA8IGV4Y2x1c2l2ZU1heGApLiAqL1xuICBleGNsdXNpdmVNYXg/OiBudW1iZXI7XG4gIC8qKiBXaGVuIGB0cnVlYCwgdGhlIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciAoYE51bWJlci5pc0ludGVnZXJgKS4gKi9cbiAgaW50ZWdlcj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwZWMgZm9yIGEgbnVtZXJpYyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIFZhbHVlcyBhcmUgcGFyc2VkIHdpdGggYE51bWJlcigpYDsgYE5hTmAsIGBJbmZpbml0eWAsIGFuZCBgLUluZmluaXR5YCBhcmUgcmVqZWN0ZWQuXG4gKiBPcHRpb25hbCB7QGxpbmsgU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHN9IChgbWluYCwgYG1heGAsIGBleGNsdXNpdmVNaW5gLCBgZXhjbHVzaXZlTWF4YCwgYGludGVnZXJgKVxuICogbmFycm93IGFjY2VwdGVkIHZhbHVlcy5cbiAqIERlZmF1bHRzIGJlbG9uZyBpbiB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30sIG5vdCBvbiB0aGlzIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlR5cGVOdW1iZXIgPSB7IHR5cGU6ICdudW1iZXInIH0gJiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cztcblxuLyoqXG4gKiBQYXR0ZXJuIGZvciBib29sZWFuIGVudiB2YWx1ZXMgdGhhdCBwYXJzZSBhcyBgdHJ1ZWAuXG4gKiBNYXRjaGVzIGAxYCwgYHRydWVgLCBgeWVzYCwgYW5kIGBvbmAgKGNhc2UtaW5zZW5zaXRpdmUpIG9uIHRoZSBmdWxsIHRyaW1tZWQgc3RyaW5nLlxuICovXG5jb25zdCBUUlVFX0JPT0xFQU5fUEFUVEVSTiA9IC9eKDF8dHJ1ZXx5ZXN8b24pJC9pO1xuXG4vKipcbiAqIFBhcnNlcyBhIHN0cmluZyBhcyBhIGZpbml0ZSBudW1iZXIgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gTm9ybWFsaXplZCBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSAodHJpbW1lZCB3aGVuIGB0cmltYCBpcyBlbmFibGVkKS5cbiAqIEByZXR1cm5zIFBhcnNlZCBudW1iZXIsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHZhbHVlIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIuXG4gKi9cbmNvbnN0IHBhcnNlTnVtYmVyID0gKHJhdzogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgbiA9IE51bWJlcihyYXcpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG47XG59O1xuXG4vKipcbiAqIFBhcnNlcyBhIG5vcm1hbGl6ZWQgc3RyaW5nIGFzIGEgYm9vbGVhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gbm9ybWFsaXplZFJhdyAtIE5vcm1hbGl6ZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgKHRyaW1tZWQgd2hlbiBgdHJpbWAgaXMgZW5hYmxlZCkuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGAxYC9gdHJ1ZWAvYHllc2AvYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSk7IG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5jb25zdCBwYXJzZUJvb2xlYW5FbnZWYWx1ZSA9IChub3JtYWxpemVkUmF3OiBzdHJpbmcpOiBib29sZWFuID0+IFRSVUVfQk9PTEVBTl9QQVRURVJOLnRlc3Qobm9ybWFsaXplZFJhdyk7XG5cbi8qKlxuICogU3BlYyBmb3IgYSBib29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICogUGFyc2VzIGAxYCwgYHRydWVgLCBgeWVzYCwgYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSwgYWZ0ZXIgbm9ybWFsaXphdGlvbikgYXMgYHRydWVgO1xuICogYW55IG90aGVyIG5vbi1lbXB0eSB2YWx1ZSBhcyBgZmFsc2VgLlxuICogVHJpbXMgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGJ5IGRlZmF1bHQgKHNlZSB7QGxpbmsgU3RyaWN0RW52T3B0aW9ucy50cmltfSkuXG4gKiBEZWZhdWx0cyBiZWxvbmcgaW4ge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9LCBub3Qgb24gdGhpcyBzcGVjLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZUeXBlQm9vbGVhbiA9IHsgdHlwZTogJ2Jvb2xlYW4nIH07XG5cbi8qKlxuICogU3BlYyBmb3IgYW4gZW51bSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIGEgZml4ZWQgc2V0IG9mIGNob2ljZXMuXG4gKiBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgYGNob2ljZXNgIChjb21wYXJlZCBhZnRlciBub3JtYWxpemF0aW9uKTsgb3RoZXJ3aXNlIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBUcmltcyBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgYnkgZGVmYXVsdCAoc2VlIHtAbGluayBTdHJpY3RFbnZPcHRpb25zLnRyaW19KS5cbiAqIERlZmF1bHRzIGJlbG9uZyBpbiB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30sIG5vdCBvbiB0aGlzIHNwZWMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBMaXRlcmFsIHN0cmluZyB1bmlvbiBvZiBhbGxvd2VkIHZhbHVlcy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52VHlwZUVudW08VCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7IHR5cGU6ICdlbnVtJzsgY2hvaWNlczogcmVhZG9ubHkgVFtdIH07XG5cbi8qKiBVbmlvbiBvZiBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlcy4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlNwZWMgPVxuICB8IFN0cmljdEVudlR5cGVTdHJpbmdcbiAgfCBTdHJpY3RFbnZUeXBlTnVtYmVyXG4gIHwgU3RyaWN0RW52VHlwZUJvb2xlYW5cbiAgfCBTdHJpY3RFbnZUeXBlRW51bTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIG9mIGVycm9yIGtpbmRzIGVtaXR0ZWQgZHVyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIHBhcnNpbmcuXG4gKlxuICogLSBgbWlzc2luZ2Ag4oCUIFZhcmlhYmxlIHVuc2V0LCBlbXB0eSBzdHJpbmcsIG9yIHdoaXRlc3BhY2Utb25seSAod2hlbiB0cmltIGlzIGVuYWJsZWQpIHdpdGhvdXQgYSBkZWZhdWx0LlxuICogLSBgaW52YWxpZF9udW1iZXJgIOKAlCBWYWx1ZSBpcyBub3QgYSBmaW5pdGUgbnVtYmVyLCBub3QgYW4gaW50ZWdlciB3aGVuIHJlcXVpcmVkLCBvciBvdXRzaWRlXG4gKiAgIGBtaW5gIC8gYG1heGAgLyBgZXhjbHVzaXZlTWluYCAvIGBleGNsdXNpdmVNYXhgIChzZWUge0BsaW5rIFN0cmljdEVudlR5cGVOdW1iZXJ9KS5cbiAqIC0gYGludmFsaWRfZW51bWAg4oCUIFZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgZW51bSBjaG9pY2VzLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZFcnJvcktpbmQgPSAnbWlzc2luZycgfCAnaW52YWxpZF9udW1iZXInIHwgJ2ludmFsaWRfZW51bSc7XG5cbi8qKlxuICogQSBzdHJ1Y3R1cmVkIHZhbGlkYXRpb24gZXJyb3IgZW50cnkgZm9yIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBLIC0gRW52aXJvbm1lbnQgdmFyaWFibGUga2V5IHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IHtcbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUuICovXG4gIGtleTogSztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuICovXG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIFJhdyB2YWx1ZSBmcm9tIGBwcm9jZXNzLmVudmAsIGlmIHByZXNlbnQuICovXG4gIHJhdz86IHN0cmluZztcbiAgLyoqIEVycm9yIGNhdGVnb3J5IGZvciBwcm9ncmFtbWF0aWMgaGFuZGxpbmcuICovXG4gIGtpbmQ6IFN0cmljdEVudkVycm9yS2luZDtcbn07XG5cbi8qKlxuICogQmFzZSBlcnJvciBjbGFzcyBmb3IgdGhpcyBwYWNrYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdHJ5IHtcbiAqICAgU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZSgnUE9SVCcsIFN0cmljdEVudlR5cGUuTnVtYmVyKTtcbiAqIH0gY2F0Y2ggKGUpIHtcbiAqICAgaWYgKGUgaW5zdGFuY2VvZiBTdHJpY3RFbnZFcnJvcikge1xuICogICAgIC8vIEhhbmRsZSBhbGwgc3RyaWN0LWVudi1yZXNvbHZlciBlcnJvcnNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdHJpY3RFbnZFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnU3RyaWN0RW52RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGlvbiBlcnJvciB0aGF0IGNhcnJpZXMgb25lIG9yIG1vcmUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXNzdWVzLlxuICpcbiAqIFRocm93biBieSBgU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZSgpYCAoc2luZ2xlLWVudHJ5IGBlcnJvcnNgKSBhbmRcbiAqIGBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKClgIChtdWx0aS1lbnRyeSBgZXJyb3JzYCkuXG4gKiBJbmRpdmlkdWFsIGVudHJpZXMgYXJlIHByb2R1Y2VkIGJ5IHRoZSBpbnRlcm5hbCBgcGFyc2VFbnZWYWx1ZWAgaGVscGVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLIC0gVW5pb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGUga2V5cyBpbmNsdWRlZCBpbiBgZXJyb3JzYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmljdEVudlZhbGlkYXRpb25FcnJvcjxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiBleHRlbmRzIFN0cmljdEVudkVycm9yIHtcbiAgLyoqXG4gICAqIEZvcm1hdHMgdmFsaWRhdGlvbiBlcnJvcnMgaW50byBhIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBLIC0gRW52aXJvbm1lbnQgdmFyaWFibGUga2V5IHR5cGUuXG4gICAqIEBwYXJhbSBlcnJvcnMgLSBWYWxpZGF0aW9uIGVycm9yIGVudHJpZXMgdG8gZm9ybWF0LlxuICAgKiBAcmV0dXJucyBNdWx0aS1saW5lIHN1bW1hcnkgbGlzdGluZyBlYWNoIGtleSBhbmQgbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZm9ybWF0PEsgZXh0ZW5kcyBzdHJpbmc+KGVycm9yczogcmVhZG9ubHkgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEs+W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzID0gZXJyb3JzLm1hcCgoZSkgPT4gYC0gJHtlLmtleX06ICR7ZS5tZXNzYWdlfSR7ZS5yYXcgPT0gbnVsbCA/ICcnIDogYCAocmF3PVwiJHtlLnJhd31cIilgfWApO1xuICAgIHJldHVybiBgSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKCR7ZXJyb3JzLmxlbmd0aH0pOlxcbiR7bGluZXMuam9pbignXFxuJyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJ1Y3R1cmVkIGxpc3Qgb2YgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JzOiByZWFkb25seSBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnk8Sz5bXTtcbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIGxpc3Qgb2Yga2V5cyBpbmNsdWRlZCBpbiBgZXJyb3JzYC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBrZXlzOiByZWFkb25seSBLW107XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdmFsaWRhdGlvbiBlcnJvciBmcm9tIG9uZSBvciBtb3JlIGBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnlgIGVudHJpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvcnMgLSBPbmUgb3IgbW9yZSBzdHJ1Y3R1cmVkIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVycm9yczogcmVhZG9ubHkgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEs+W10pIHtcbiAgICBjb25zdCBtc2cgPSBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3IuZm9ybWF0KGVycm9ycyk7XG4gICAgc3VwZXIobXNnKTtcbiAgICB0aGlzLm5hbWUgPSAnU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yJztcbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB0aGlzLmtleXMgPSBlcnJvcnMubWFwKChlKSA9PiBlLmtleSk7XG4gIH1cbn1cblxuLyoqIEluY2x1c2l2ZSBsb3dlciBib3VuZCBmb3IgcG9zaXRpdmUgaW50ZWdlcnMgKGA+PSAxYCkuICovXG5jb25zdCBNSU5fUE9TSVRJVkVfSU5URUdFUiA9IDE7XG5cbi8qKiBJbmNsdXNpdmUgdXBwZXIgYm91bmQgZm9yIG5lZ2F0aXZlIGludGVnZXJzIChgPD0gLTFgKS4gKi9cbmNvbnN0IE1BWF9ORUdBVElWRV9JTlRFR0VSID0gLTE7XG5cbi8qKlxuICogU2lnbiBib3VuZGFyeSBmb3IgUG9zaXRpdmUgKGA+IDBgKSwgTmVnYXRpdmUgKGA8IDBgKSwgYW5kIG5vbi1uZWdhdGl2ZSAoYD49IDBgKSBwcmVzZXRzLlxuICovXG5jb25zdCBaRVJPID0gMDtcblxuLyoqXG4gKiBJbmNsdXNpdmUgbG93ZXIgVENQL1VEUCBwb3J0IChJQU5BKS4gUG9ydCAwIG1lYW5zIFwiYW55IGF2YWlsYWJsZVwiIGFuZCBpcyByZWplY3RlZC5cbiAqL1xuY29uc3QgTUlOX1BPUlQgPSBNSU5fUE9TSVRJVkVfSU5URUdFUjtcblxuLyoqIEluY2x1c2l2ZSB1cHBlciBUQ1AvVURQIHBvcnQgKElBTkEpLiAqL1xuY29uc3QgTUFYX1BPUlQgPSA2NTUzNTtcblxuLyoqXG4gKiBCdWlsZHMgYSBudW1lcmljIGVudiBzcGVjIGZyb20gb3B0aW9uYWwgY29uc3RyYWludHMuXG4gKlxuICogQHBhcmFtIGNvbnN0cmFpbnRzIC0gT3B0aW9uYWwgYG1pbmAsIGBtYXhgLCBgZXhjbHVzaXZlTWluYCwgYGV4Y2x1c2l2ZU1heGAsIGFuZC9vciBgaW50ZWdlcmAgYm91bmRzLlxuICogQHJldHVybnMgTnVtYmVyIHNwZWMgZm9yIHVzZSB3aXRoIGByZXNvbHZlYCBvciBgcmVzb2x2ZUFsbGAuXG4gKi9cbmNvbnN0IGNyZWF0ZU51bWJlclNwZWMgPSAoY29uc3RyYWludHM/OiBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50cyk6IFN0cmljdEVudlR5cGVOdW1iZXIgPT4gKHtcbiAgdHlwZTogJ251bWJlcicsXG4gIC4uLihjb25zdHJhaW50cz8ubWluICE9PSB1bmRlZmluZWQgPyB7IG1pbjogY29uc3RyYWludHMubWluIH0gOiB7fSksXG4gIC4uLihjb25zdHJhaW50cz8ubWF4ICE9PSB1bmRlZmluZWQgPyB7IG1heDogY29uc3RyYWludHMubWF4IH0gOiB7fSksXG4gIC4uLihjb25zdHJhaW50cz8uZXhjbHVzaXZlTWluICE9PSB1bmRlZmluZWQgPyB7IGV4Y2x1c2l2ZU1pbjogY29uc3RyYWludHMuZXhjbHVzaXZlTWluIH0gOiB7fSksXG4gIC4uLihjb25zdHJhaW50cz8uZXhjbHVzaXZlTWF4ICE9PSB1bmRlZmluZWQgPyB7IGV4Y2x1c2l2ZU1heDogY29uc3RyYWludHMuZXhjbHVzaXZlTWF4IH0gOiB7fSksXG4gIC4uLihjb25zdHJhaW50cz8uaW50ZWdlciAhPT0gdW5kZWZpbmVkID8geyBpbnRlZ2VyOiBjb25zdHJhaW50cy5pbnRlZ2VyIH0gOiB7fSksXG59KTtcblxuLyoqXG4gKiBOYW1lZCBudW1iZXIgcHJlc2V0cyBuZXN0ZWQgdW5kZXIge0BsaW5rIFN0cmljdEVudlR5cGUuTnVtYmVyfS5cbiAqIEVhY2ggcHJlc2V0IGlzIHN1Z2FyIG92ZXIge0BsaW5rIFN0cmljdEVudk51bWJlckNvbnN0cmFpbnRzfTsgcGFyc2luZyBzdGF5cyBgdHlwZTogJ251bWJlcidgLlxuICovXG50eXBlIFN0cmljdEVudk51bWJlclByZXNldHMgPSB7XG4gIC8qKiBBbnkgaW50ZWdlci4gU3VnYXIgZm9yIGBOdW1iZXIoeyBpbnRlZ2VyOiB0cnVlIH0pYC4gKi9cbiAgSW50ZWdlcjogU3RyaWN0RW52VHlwZU51bWJlcjtcbiAgLyoqIEludGVnZXIgYD49IDFgLiBTdWdhciBmb3IgYE51bWJlcih7IG1pbjogMSwgaW50ZWdlcjogdHJ1ZSB9KWAuICovXG4gIFBvc2l0aXZlSW50ZWdlcjogU3RyaWN0RW52VHlwZU51bWJlcjtcbiAgLyoqIEludGVnZXIgYDw9IC0xYC4gU3VnYXIgZm9yIGBOdW1iZXIoeyBtYXg6IC0xLCBpbnRlZ2VyOiB0cnVlIH0pYC4gKi9cbiAgTmVnYXRpdmVJbnRlZ2VyOiBTdHJpY3RFbnZUeXBlTnVtYmVyO1xuICAvKiogSW50ZWdlciBgPj0gMGAuIFN1Z2FyIGZvciBgTnVtYmVyKHsgbWluOiAwLCBpbnRlZ2VyOiB0cnVlIH0pYC4gKi9cbiAgTm9uTmVnYXRpdmVJbnRlZ2VyOiBTdHJpY3RFbnZUeXBlTnVtYmVyO1xuICAvKiogRmluaXRlIG51bWJlciBgPiAwYC4gU3VnYXIgZm9yIGBOdW1iZXIoeyBleGNsdXNpdmVNaW46IDAgfSlgLiAqL1xuICBQb3NpdGl2ZTogU3RyaWN0RW52VHlwZU51bWJlcjtcbiAgLyoqIEZpbml0ZSBudW1iZXIgYDwgMGAuIFN1Z2FyIGZvciBgTnVtYmVyKHsgZXhjbHVzaXZlTWF4OiAwIH0pYC4gKi9cbiAgTmVnYXRpdmU6IFN0cmljdEVudlR5cGVOdW1iZXI7XG4gIC8qKiBGaW5pdGUgbnVtYmVyIGA+PSAwYC4gU3VnYXIgZm9yIGBOdW1iZXIoeyBtaW46IDAgfSlgLiAqL1xuICBOb25OZWdhdGl2ZTogU3RyaWN0RW52VHlwZU51bWJlcjtcbiAgLyoqIFRDUC9VRFAgcG9ydCBgMWDigJNgNjU1MzVgLiBTdWdhciBmb3IgYE51bWJlcih7IG1pbjogMSwgbWF4OiA2NTUzNSwgaW50ZWdlcjogdHJ1ZSB9KWAuICovXG4gIFBvcnQ6IFN0cmljdEVudlR5cGVOdW1iZXI7XG59O1xuXG4vKipcbiAqIFVuY29uc3RyYWluZWQgZmluaXRlLW51bWJlciBzcGVjLCBhbHNvIGNhbGxhYmxlIGFzIGEgZmFjdG9yeSBmb3IgY29uc3RyYWluZWQgc3BlY3MuXG4gKiBOYW1lZCBwcmVzZXRzIGhhbmcgb2ZmIHRoZSBzYW1lIG9iamVjdCAoYE51bWJlci5Qb3J0YCwgYE51bWJlci5Qb3NpdGl2ZUludGVnZXJgLCDigKYpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogU3RyaWN0RW52VHlwZS5OdW1iZXJcbiAqIFN0cmljdEVudlR5cGUuTnVtYmVyKHsgbWluOiAwIH0pXG4gKiBTdHJpY3RFbnZUeXBlLk51bWJlcih7IGV4Y2x1c2l2ZU1pbjogMCB9KVxuICogU3RyaWN0RW52VHlwZS5OdW1iZXIuUG9ydFxuICogU3RyaWN0RW52VHlwZS5OdW1iZXIuUG9zaXRpdmVJbnRlZ2VyXG4gKiBgYGBcbiAqL1xudHlwZSBTdHJpY3RFbnZOdW1iZXJTcGVjRmFjdG9yeSA9IHtcbiAgKGNvbnN0cmFpbnRzPzogU3RyaWN0RW52TnVtYmVyQ29uc3RyYWludHMpOiBTdHJpY3RFbnZUeXBlTnVtYmVyO1xufSAmIFN0cmljdEVudlR5cGVOdW1iZXIgJiBTdHJpY3RFbnZOdW1iZXJQcmVzZXRzO1xuXG4vKipcbiAqIEZpbml0ZS1udW1iZXIgc3BlYyB0aGF0IGlzIGFsc28gYSBjb25zdHJhaW50IGZhY3RvcnkgYW5kIGEgaG9sZGVyIG9mIG5hbWVkIHByZXNldHMuXG4gKiBVc2UgYXMgYE51bWJlcmAsIGBOdW1iZXIoeyBtaW4sIG1heCwgZXhjbHVzaXZlTWluLCBleGNsdXNpdmVNYXgsIGludGVnZXIgfSlgLCBvciBgTnVtYmVyLlBvcnRgLlxuICovXG5jb25zdCBOdW1iZXJTcGVjOiBTdHJpY3RFbnZOdW1iZXJTcGVjRmFjdG9yeSA9IE9iamVjdC5hc3NpZ24oXG4gIChjb25zdHJhaW50cz86IFN0cmljdEVudk51bWJlckNvbnN0cmFpbnRzKTogU3RyaWN0RW52VHlwZU51bWJlciA9PiBjcmVhdGVOdW1iZXJTcGVjKGNvbnN0cmFpbnRzKSxcbiAgeyB0eXBlOiAnbnVtYmVyJyB9IGFzIGNvbnN0IHNhdGlzZmllcyBTdHJpY3RFbnZUeXBlTnVtYmVyLFxuICB7XG4gICAgSW50ZWdlcjogY3JlYXRlTnVtYmVyU3BlYyh7IGludGVnZXI6IHRydWUgfSksXG4gICAgUG9zaXRpdmVJbnRlZ2VyOiBjcmVhdGVOdW1iZXJTcGVjKHsgbWluOiBNSU5fUE9TSVRJVkVfSU5URUdFUiwgaW50ZWdlcjogdHJ1ZSB9KSxcbiAgICBOZWdhdGl2ZUludGVnZXI6IGNyZWF0ZU51bWJlclNwZWMoeyBtYXg6IE1BWF9ORUdBVElWRV9JTlRFR0VSLCBpbnRlZ2VyOiB0cnVlIH0pLFxuICAgIE5vbk5lZ2F0aXZlSW50ZWdlcjogY3JlYXRlTnVtYmVyU3BlYyh7IG1pbjogWkVSTywgaW50ZWdlcjogdHJ1ZSB9KSxcblxuICAgIFBvc2l0aXZlOiBjcmVhdGVOdW1iZXJTcGVjKHsgZXhjbHVzaXZlTWluOiBaRVJPIH0pLFxuICAgIE5lZ2F0aXZlOiBjcmVhdGVOdW1iZXJTcGVjKHsgZXhjbHVzaXZlTWF4OiBaRVJPIH0pLFxuICAgIE5vbk5lZ2F0aXZlOiBjcmVhdGVOdW1iZXJTcGVjKHsgbWluOiBaRVJPIH0pLFxuXG4gICAgUG9ydDogY3JlYXRlTnVtYmVyU3BlYyh7IG1pbjogTUlOX1BPUlQsIG1heDogTUFYX1BPUlQsIGludGVnZXI6IHRydWUgfSksXG4gIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFN0cmljdEVudk51bWJlclByZXNldHMsXG4pO1xuXG4vKipcbiAqIFByZWRlZmluZWQgc3BlYyBjb25zdGFudHMgZm9yIHVzZSB3aXRoIGByZXNvbHZlYCBvciBhcyBzY2hlbWEgdmFsdWVzIGluIGByZXNvbHZlQWxsYC5cbiAqIFNwZWNzIGRlc2NyaWJlIHR5cGUgb25seTsgcHJvdmlkZSBgZGVmYXVsdGAgLyBgdHJpbWAgdmlhIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfVxuICogKHRoaXJkIGFyZ3VtZW50IG9mIGByZXNvbHZlYCwgb3IgYSBgW3NwZWMsIG9wdGlvbnNdYCB0dXBsZSBpbiBgcmVzb2x2ZUFsbGApLlxuICovXG5leHBvcnQgY29uc3QgU3RyaWN0RW52VHlwZSA9IHtcbiAgLyoqIFNwZWMgZm9yIGEgc3RyaW5nIHZhbHVlIChyZXR1cm5lZCBhcy1pcyB1bmxlc3MgYHRyaW06IHRydWVgIGlzIHNldCBpbiBvcHRpb25zKS4gKi9cbiAgU3RyaW5nOiB7IHR5cGU6ICdzdHJpbmcnIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFN0cmljdEVudlR5cGVTdHJpbmcsXG4gIC8qKlxuICAgKiBTcGVjIGZvciBhIGZpbml0ZSBudW1lcmljIHZhbHVlIChgTnVtYmVyKClgIHBhcnNpbmc7IHJlamVjdHMgYE5hTmAgYW5kIGBJbmZpbml0eWApLlxuICAgKiBVc2UgYXMgYFN0cmljdEVudlR5cGUuTnVtYmVyYCwgY2FsbCBhcyBgU3RyaWN0RW52VHlwZS5OdW1iZXIoeyBtaW4sIG1heCwgZXhjbHVzaXZlTWluLCBleGNsdXNpdmVNYXgsIGludGVnZXIgfSlgLFxuICAgKiBvciB1c2UgYSBuZXN0ZWQgcHJlc2V0IHN1Y2ggYXMgYFN0cmljdEVudlR5cGUuTnVtYmVyLlBvcnRgLlxuICAgKi9cbiAgTnVtYmVyOiBOdW1iZXJTcGVjLFxuICAvKiogU3BlYyBmb3IgYSBib29sZWFuIHZhbHVlIChgMWAvYHRydWVgL2B5ZXNgL2BvbmAg4oaSIGB0cnVlYDsgb3RoZXIgbm9uLWVtcHR5IHZhbHVlcyDihpIgYGZhbHNlYCkuICovXG4gIEJvb2xlYW46IHsgdHlwZTogJ2Jvb2xlYW4nIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFN0cmljdEVudlR5cGVCb29sZWFuLFxuICAvKipcbiAgICogUmV0dXJucyBhIHNwZWMgdGhhdCByZXN0cmljdHMgdGhlIHZhbHVlIHRvIG9uZSBvZiB0aGUgZ2l2ZW4gY2hvaWNlcy5cbiAgICpcbiAgICogQHBhcmFtIGNob2ljZXMgLSBBbGxvd2VkIHN0cmluZyBsaXRlcmFscy5cbiAgICogQHJldHVybnMgRW51bSBzcGVjIGZvciB1c2Ugd2l0aCBgcmVzb2x2ZWAgb3IgYHJlc29sdmVBbGxgLlxuICAgKi9cbiAgRW51bTogPFQgZXh0ZW5kcyBzdHJpbmc+KGNob2ljZXM6IHJlYWRvbmx5IFRbXSkgPT4gKHsgdHlwZTogJ2VudW0nLCBjaG9pY2VzIH0pIGFzIFN0cmljdEVudlR5cGVFbnVtPFQ+LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBJbmZlcnMgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIGdpdmVuIHNwZWMuXG4gKiBAdGVtcGxhdGUgUyAtIEEgYFN0cmljdEVudlNwZWNgIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdEVudlNwZWNUb1R5cGU8Uz4gPVxuICBTIGV4dGVuZHMgU3RyaWN0RW52VHlwZVN0cmluZyA/IHN0cmluZ1xuICAgIDogUyBleHRlbmRzIFN0cmljdEVudlR5cGVOdW1iZXIgPyBudW1iZXJcbiAgICAgIDogUyBleHRlbmRzIFN0cmljdEVudlR5cGVCb29sZWFuID8gYm9vbGVhblxuICAgICAgICA6IFMgZXh0ZW5kcyBTdHJpY3RFbnZUeXBlRW51bTxpbmZlciBUPiA/IFRcbiAgICAgICAgICA6IG5ldmVyO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJlYWRpbmcgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBhbiBvcHRpb25hbCBkZWZhdWx0LlxuICogVXNlZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQgdG8gYHJlc29sdmVgIG9yIGFzIHRoZSBzZWNvbmQgZWxlbWVudCBvZiBhIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlIGluIGByZXNvbHZlQWxsYC5cbiAqXG4gKiBgdHJpbWAgZGVmYXVsdHMgdG8gYHRydWVgIGZvciBgbnVtYmVyYCwgYGJvb2xlYW5gLCBhbmQgYGVudW1gIHNwZWNzICh3aGl0ZXNwYWNlLW9ubHkgdmFsdWVzIGFyZVxuICogdHJlYXRlZCBhcyBtaXNzaW5nKS4gRm9yIGBzdHJpbmdgIHNwZWNzIGl0IGRlZmF1bHRzIHRvIGBmYWxzZWAgKHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMtaXMpLlxuICpcbiAqIEB0ZW1wbGF0ZSBTIC0gRW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZPcHRpb25zPFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjPiA9IHtcbiAgLyoqIEZhbGxiYWNrIHdoZW4gdGhlIHZhcmlhYmxlIGlzIHVuc2V0LCBlbXB0eSAoYFwiXCJgKSwgb3Igd2hpdGVzcGFjZS1vbmx5ICh3aGVuIGB0cmltYCBpcyBlbmFibGVkKS4gKi9cbiAgZGVmYXVsdD86IFN0cmljdEVudlNwZWNUb1R5cGU8Uz47XG4gIC8qKiBXaGVuIGB0cnVlYCwgdHJpbXMgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGJlZm9yZSB2YWxpZGF0aW9uLiAqL1xuICB0cmltPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU2NoZW1hIGVudHJ5IGZvciBhIHNpbmdsZSBlbnYgdmFyLlxuICpcbiAqIEVpdGhlciBhIHNwZWMgYWxvbmUsIG9yIGEgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGUgdG8gYXR0YWNoIHtAbGluayBTdHJpY3RFbnZPcHRpb25zfVxuICogKGZvciBleGFtcGxlIGBkZWZhdWx0YCBhbmQvb3IgYHRyaW1gKS5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U2NoZW1hRW50cnk8UyBleHRlbmRzIFN0cmljdEVudlNwZWMgPSBTdHJpY3RFbnZTcGVjPiA9IFMgfCByZWFkb25seSBbUywgU3RyaWN0RW52T3B0aW9uczxTPl07XG5cbi8qKlxuICogU2NoZW1hIG9iamVjdCB1c2VkIGJ5IGByZXNvbHZlQWxsKClgLlxuICpcbiAqIEtleXMgYXJlIGVudiB2YXIgbmFtZXM7IHZhbHVlcyBhcmUgc3BlY3Mgb3IgYFtzcGVjLCBvcHRpb25zXWAgdHVwbGVzLlxuICovXG5leHBvcnQgdHlwZSBTdHJpY3RFbnZTY2hlbWEgPSBSZWNvcmQ8c3RyaW5nLCBTdHJpY3RFbnZTY2hlbWFFbnRyeT47XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHNwZWMgdHlwZSBmcm9tIGEgc2NoZW1hIGVudHJ5IG9yIGBbc3BlYywgb3B0aW9uc11gIHR1cGxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBFIC0gU2NoZW1hIGVudHJ5IHR5cGUuXG4gKi9cbnR5cGUgU3RyaWN0RW52U2NoZW1hRW50cnlUb1NwZWM8RT4gPSBFIGV4dGVuZHMgcmVhZG9ubHkgW2luZmVyIFMsIHVua25vd25dID8gUyA6IEU7XG5cbi8qKlxuICogTWFwcyBhIHNjaGVtYSBvYmplY3QgdG8gdGhlIHJlc3VsdGluZyBwYXJzZWQgZW52aXJvbm1lbnQgb2JqZWN0IHR5cGUuXG4gKlxuICogQHRlbXBsYXRlIFRTY2hlbWEgLSBTY2hlbWEgb2JqZWN0IHR5cGUgcGFzc2VkIHRvIGByZXNvbHZlQWxsYC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWEgZXh0ZW5kcyBTdHJpY3RFbnZTY2hlbWE+ID0ge1xuICBbSyBpbiBrZXlvZiBUU2NoZW1hXTogU3RyaWN0RW52U3BlY1RvVHlwZTxTdHJpY3RFbnZTY2hlbWFFbnRyeVRvU3BlYzxUU2NoZW1hW0tdPiAmIFN0cmljdEVudlNwZWM+O1xufTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHJlc3VsdCBvZiBwYXJzaW5nIGEgc2luZ2xlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIE9uIHN1Y2Nlc3MsIGB2YWx1ZWAgaG9sZHMgdGhlIHBhcnNlZCByZXN1bHQuIE9uIGZhaWx1cmUsIGBlcnJvcmAgaG9sZHMgYSBzdHJ1Y3R1cmVkXG4gKiBgU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5YCBlbnRyeSAobmV2ZXIgdGhyb3dzKS5cbiAqXG4gKiBAdGVtcGxhdGUgSyAtIEVudmlyb25tZW50IHZhcmlhYmxlIGtleSB0eXBlLlxuICogQHRlbXBsYXRlIFMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjIHR5cGUuXG4gKi9cbnR5cGUgUGFyc2VFbnZWYWx1ZVJlc3VsdDxLIGV4dGVuZHMgc3RyaW5nLCBTIGV4dGVuZHMgU3RyaWN0RW52U3BlYz4gPVxuICB8IHsgb2s6IHRydWU7IHZhbHVlOiBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH1cbiAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IFN0cmljdEVudlZhbGlkYXRpb25FbnRyeTxLPiB9O1xuXG4vKipcbiAqIERlZmF1bHQgdHJpbSBiZWhhdmlvciBwZXIgc3BlYyB0eXBlLlxuICogUGFyc2VkIHR5cGVzIHRyaW0gYnkgZGVmYXVsdDsgc3RyaW5ncyBwcmVzZXJ2ZSB0aGUgcmF3IHZhbHVlIHVubGVzcyBvcHRlZCBpbi5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIEVudmlyb25tZW50IHZhcmlhYmxlIHNwZWMuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBzaG91bGQgYmUgdHJpbW1lZCBiZWZvcmUgdmFsaWRhdGlvbi5cbiAqL1xuY29uc3QgZGVmYXVsdFRyaW1Gb3JTcGVjID0gKHNwZWM6IFN0cmljdEVudlNwZWMpOiBib29sZWFuID0+IHNwZWMudHlwZSAhPT0gJ3N0cmluZyc7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHJhdyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBiZWZvcmUgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gUmF3IHZhbHVlIGZyb20gYHByb2Nlc3MuZW52YCwgaWYgcHJlc2VudC5cbiAqIEBwYXJhbSB0cmltIC0gV2hldGhlciB0byB0cmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgdmFsdWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQuXG4gKi9cbmNvbnN0IG5vcm1hbGl6ZUVudlJhdyA9IChyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCwgdHJpbTogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChyYXcgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKCF0cmltKSB7XG4gICAgcmV0dXJuIHJhdztcbiAgfVxuICByZXR1cm4gcmF3LnRyaW0oKTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgcGFyc2VkIG51bWJlciBhZ2FpbnN0IG9wdGlvbmFsIHtAbGluayBTdHJpY3RFbnZOdW1iZXJDb25zdHJhaW50c30uXG4gKlxuICogQHRlbXBsYXRlIEsgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgdHlwZS5cbiAqIEBwYXJhbSBrZXkgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lLlxuICogQHBhcmFtIHJhdyAtIFJhdyB2YWx1ZSBmcm9tIGBwcm9jZXNzLmVudmAsIGlmIHByZXNlbnQuXG4gKiBAcGFyYW0gbiAtIFBhcnNlZCBmaW5pdGUgbnVtYmVyLlxuICogQHBhcmFtIGNvbnN0cmFpbnRzIC0gT3B0aW9uYWwgYG1pbmAsIGBtYXhgLCBgZXhjbHVzaXZlTWluYCwgYGV4Y2x1c2l2ZU1heGAsIGFuZC9vciBgaW50ZWdlcmAgY29uc3RyYWludHMuXG4gKiBAcmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHZhbGlkOyBvdGhlcndpc2UgYSBzdHJ1Y3R1cmVkIHZhbGlkYXRpb24gZXJyb3IuXG4gKi9cbmNvbnN0IHZhbGlkYXRlTnVtYmVyQ29uc3RyYWludHMgPSA8SyBleHRlbmRzIHN0cmluZz4oXG4gIGtleTogSyxcbiAgcmF3OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG46IG51bWJlcixcbiAgY29uc3RyYWludHM6IFN0cmljdEVudk51bWJlckNvbnN0cmFpbnRzLFxuKTogU3RyaWN0RW52VmFsaWRhdGlvbkVudHJ5PEs+IHwgdW5kZWZpbmVkID0+IHtcbiAgLy8gSW50ZWdlciBmaXJzdCBzbyBlLmcuIFBvcnQgYDgwLjVgIHJlcG9ydHMgXCJleHBlY3RlZCBpbnRlZ2VyXCIsIG5vdCBhIHJhbmdlIGVycm9yLlxuICBpZiAoY29uc3RyYWludHMuaW50ZWdlciA9PT0gdHJ1ZSAmJiAhTnVtYmVyLmlzSW50ZWdlcihuKSkge1xuICAgIHJldHVybiB7IGtleSwgbWVzc2FnZTogYEVudiAke2tleX06IGV4cGVjdGVkIGludGVnZXIsIGdvdCBcIiR7cmF3fVwiYCwgcmF3LCBraW5kOiAnaW52YWxpZF9udW1iZXInIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMubWluICE9PSB1bmRlZmluZWQgJiYgbiA8IGNvbnN0cmFpbnRzLm1pbikge1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBtZXNzYWdlOiBgRW52ICR7a2V5fTogbXVzdCBiZSA+PSAke2NvbnN0cmFpbnRzLm1pbn0sIGdvdCAke259YCxcbiAgICAgIHJhdyxcbiAgICAgIGtpbmQ6ICdpbnZhbGlkX251bWJlcicsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChjb25zdHJhaW50cy5leGNsdXNpdmVNaW4gIT09IHVuZGVmaW5lZCAmJiBuIDw9IGNvbnN0cmFpbnRzLmV4Y2x1c2l2ZU1pbikge1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBtZXNzYWdlOiBgRW52ICR7a2V5fTogbXVzdCBiZSA+ICR7Y29uc3RyYWludHMuZXhjbHVzaXZlTWlufSwgZ290ICR7bn1gLFxuICAgICAgcmF3LFxuICAgICAga2luZDogJ2ludmFsaWRfbnVtYmVyJyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzLm1heCAhPT0gdW5kZWZpbmVkICYmIG4gPiBjb25zdHJhaW50cy5tYXgpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5LFxuICAgICAgbWVzc2FnZTogYEVudiAke2tleX06IG11c3QgYmUgPD0gJHtjb25zdHJhaW50cy5tYXh9LCBnb3QgJHtufWAsXG4gICAgICByYXcsXG4gICAgICBraW5kOiAnaW52YWxpZF9udW1iZXInLFxuICAgIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMuZXhjbHVzaXZlTWF4ICE9PSB1bmRlZmluZWQgJiYgbiA+PSBjb25zdHJhaW50cy5leGNsdXNpdmVNYXgpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5LFxuICAgICAgbWVzc2FnZTogYEVudiAke2tleX06IG11c3QgYmUgPCAke2NvbnN0cmFpbnRzLmV4Y2x1c2l2ZU1heH0sIGdvdCAke259YCxcbiAgICAgIHJhdyxcbiAgICAgIGtpbmQ6ICdpbnZhbGlkX251bWJlcicsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKiogT3B0aW9ucyBhY2NlcHRlZCBieSBgcGFyc2VFbnZWYWx1ZWAgKHN1YnNldCBvZiBgU3RyaWN0RW52T3B0aW9uc2ApLiAqL1xudHlwZSBQYXJzZUVudlZhbHVlT3B0aW9uczxTIGV4dGVuZHMgU3RyaWN0RW52U3BlYz4gPSBQaWNrPFN0cmljdEVudk9wdGlvbnM8Uz4sICd0cmltJz47XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBzY2hlbWEgZW50cnkgaW50byBpdHMgc3BlYyBhbmQgb3B0aW9uYWwgcGVyLWtleSBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBlbnRyeSAtIFNjaGVtYSBlbnRyeSBvciBgW3NwZWMsIG9wdGlvbnNdYCB0dXBsZS5cbiAqIEByZXR1cm5zIFBhcnNlZCBzcGVjIGFuZCBvcHRpb25zIGZvciBgcmVzb2x2ZUFsbGAuXG4gKi9cbmNvbnN0IHJlc29sdmVTY2hlbWFFbnRyeSA9IChcbiAgZW50cnk6IFN0cmljdEVudlNjaGVtYUVudHJ5LFxuKTogeyBzcGVjOiBTdHJpY3RFbnZTcGVjOyBvcHRpb25zOiBTdHJpY3RFbnZPcHRpb25zPFN0cmljdEVudlNwZWM+IHwgdW5kZWZpbmVkIH0gPT4gKHtcbiAgc3BlYzogKEFycmF5LmlzQXJyYXkoZW50cnkpID8gZW50cnlbMF0gOiBlbnRyeSkgYXMgU3RyaWN0RW52U3BlYyxcbiAgb3B0aW9uczogKEFycmF5LmlzQXJyYXkoZW50cnkpID8gZW50cnlbMV0gOiB1bmRlZmluZWQpIGFzIFN0cmljdEVudk9wdGlvbnM8U3RyaWN0RW52U3BlYz4gfCB1bmRlZmluZWQsXG59KTtcblxuLyoqXG4gKiBQYXJzZXMgYSBzaW5nbGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzcGVjLlxuICpcbiAqIENlbnRyYWwgdmFsaWRhdGlvbiBoZWxwZXIgc2hhcmVkIGJ5IGByZXNvbHZlYCBhbmQgYHJlc29sdmVBbGxgLiBEb2VzIG5vdCB0aHJvdztcbiAqIGNhbGxlcnMgZGVjaWRlIHdoZXRoZXIgdG8gdGhyb3cgaW1tZWRpYXRlbHkgb3IgY29sbGVjdCBlcnJvcnMuXG4gKlxuICogTWlzc2luZyBvciBlbXB0eSAoYFwiXCJgKSB2YWx1ZXMgdXNlIGBkZWZhdWx0VmFsdWVgIHdoZW4gcHJvdmlkZWQuIFdoZW4gYHRyaW1gIGlzIGVuYWJsZWQsXG4gKiB3aGl0ZXNwYWNlLW9ubHkgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGVtcHR5LiBOdW1iZXIgc3BlY3MgZGVsZWdhdGUgdG8gYHBhcnNlTnVtYmVyYCwgdGhlblxuICogb3B0aW9uYWwgYG1pbmAgLyBgbWF4YCAvIGBleGNsdXNpdmVNaW5gIC8gYGV4Y2x1c2l2ZU1heGAgLyBgaW50ZWdlcmAgY29uc3RyYWludHNcbiAqIChzZWUge0BsaW5rIFN0cmljdEVudk51bWJlckNvbnN0cmFpbnRzfSkuXG4gKiBCb29sZWFuIHNwZWNzIHRyZWF0IGAxYC9gdHJ1ZWAvYHllc2AvYG9uYCAoY2FzZS1pbnNlbnNpdGl2ZSwgYWZ0ZXIgbm9ybWFsaXphdGlvbikgYXMgYHRydWVgLlxuICogRW51bSBzcGVjcyByZXF1aXJlIGFuIGV4YWN0IG1hdGNoIGluIGBjaG9pY2VzYCAoYWZ0ZXIgbm9ybWFsaXphdGlvbikuXG4gKlxuICogQHRlbXBsYXRlIEsgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBTIC0gRW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlLlxuICogQHBhcmFtIGtleSAtIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUuXG4gKiBAcGFyYW0gc3BlYyAtIFR5cGUgc3BlYyBmb3IgdGhlIHZhbHVlLlxuICogQHBhcmFtIHJhdyAtIFJhdyB2YWx1ZSBmcm9tIGBwcm9jZXNzLmVudmAsIGlmIHByZXNlbnQuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIC0gRmFsbGJhY2sgZnJvbSB7QGxpbmsgU3RyaWN0RW52T3B0aW9ucy5kZWZhdWx0fSB3aGVuIGByYXdgIGlzIG1pc3Npbmcgb3IgZW1wdHkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHRyaW0gb3ZlcnJpZGUgKGB0cmltYCBkZWZhdWx0cyBwZXIgc3BlYyB0eXBlKS5cbiAqIEByZXR1cm5zIFBhcnNlZCB2YWx1ZSBvciBhIHN0cnVjdHVyZWQgdmFsaWRhdGlvbiBlcnJvci5cbiAqL1xuY29uc3QgcGFyc2VFbnZWYWx1ZSA9IDxLIGV4dGVuZHMgc3RyaW5nLCBTIGV4dGVuZHMgU3RyaWN0RW52U3BlYz4oXG4gIGtleTogSyxcbiAgc3BlYzogUyxcbiAgcmF3OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGRlZmF1bHRWYWx1ZTogU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IFBhcnNlRW52VmFsdWVPcHRpb25zPFM+LFxuKTogUGFyc2VFbnZWYWx1ZVJlc3VsdDxLLCBTPiA9PiB7XG4gIGNvbnN0IHRyaW0gPSBvcHRpb25zPy50cmltID8/IGRlZmF1bHRUcmltRm9yU3BlYyhzcGVjKTtcbiAgY29uc3Qgbm9ybWFsaXplZFJhdyA9IG5vcm1hbGl6ZUVudlJhdyhyYXcsIHRyaW0pO1xuICBjb25zdCBoYXNEZWZhdWx0ID0gZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQ7XG5cbiAgaWYgKG5vcm1hbGl6ZWRSYXcgPT0gbnVsbCB8fCBub3JtYWxpemVkUmF3ID09PSAnJykge1xuICAgIGlmIChoYXNEZWZhdWx0KSB7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IGRlZmF1bHRWYWx1ZSBhcyBTdHJpY3RFbnZTcGVjVG9UeXBlPFM+IH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBvazogZmFsc2UsXG4gICAgICBlcnJvcjogeyBrZXksIG1lc3NhZ2U6IGBNaXNzaW5nIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlOiAke2tleX1gLCByYXcsIGtpbmQ6ICdtaXNzaW5nJyB9LFxuICAgIH07XG4gIH1cblxuICBzd2l0Y2ggKHNwZWMudHlwZSkge1xuICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgIGNvbnN0IG4gPSBwYXJzZU51bWJlcihub3JtYWxpemVkUmF3KTtcbiAgICAgIGlmIChuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHsga2V5LCBtZXNzYWdlOiBgRW52ICR7a2V5fTogZXhwZWN0ZWQgbnVtYmVyLCBnb3QgXCIke3Jhd31cImAsIHJhdywga2luZDogJ2ludmFsaWRfbnVtYmVyJyB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgY29uc3RyYWludEVycm9yID0gdmFsaWRhdGVOdW1iZXJDb25zdHJhaW50cyhrZXksIHJhdywgbiwgc3BlYyk7XG4gICAgICBpZiAoY29uc3RyYWludEVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogY29uc3RyYWludEVycm9yIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IG4gYXMgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB9O1xuICAgIH1cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogcGFyc2VCb29sZWFuRW52VmFsdWUobm9ybWFsaXplZFJhdykgYXMgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB9O1xuICAgIGNhc2UgJ2VudW0nOlxuICAgICAgaWYgKCFzcGVjLmNob2ljZXMuaW5jbHVkZXMobm9ybWFsaXplZFJhdykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBFbnYgJHtrZXl9OiBtdXN0IGJlIG9uZSBvZiBbJHtzcGVjLmNob2ljZXMuam9pbignLCAnKX1dYCxcbiAgICAgICAgICAgIHJhdyxcbiAgICAgICAgICAgIGtpbmQ6ICdpbnZhbGlkX2VudW0nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IG5vcm1hbGl6ZWRSYXcgYXMgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IG5vcm1hbGl6ZWRSYXcgYXMgU3RyaWN0RW52U3BlY1RvVHlwZTxTPiB9O1xuICB9XG59O1xuXG4vKipcbiAqIFJlYWRzIGFuZCBwYXJzZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzcGVjLlxuICpcbiAqIERlbGVnYXRlcyB2YWxpZGF0aW9uIHRvIGBwYXJzZUVudlZhbHVlYC4gTWlzc2luZyBvciBlbXB0eSAoYFwiXCJgKSB2YWx1ZXMgdXNlXG4gKiBgb3B0aW9ucy5kZWZhdWx0YCB3aGVuIHByb3ZpZGVkOyBvdGhlcndpc2UgYSBgU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yYCBpcyB0aHJvd24uXG4gKiBXaGl0ZXNwYWNlLW9ubHkgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIG1pc3Npbmcgd2hlbiBgdHJpbWAgaXMgZW5hYmxlZC5cbiAqIEZvciBgU3RyaWN0RW52VHlwZS5OdW1iZXJgLCB2YWx1ZXMgYXJlIHBhcnNlZCBhcyBmaW5pdGUgbnVtYmVycyAoc2VlIHtAbGluayBTdHJpY3RFbnZUeXBlTnVtYmVyfSkuXG4gKlxuICogQHRlbXBsYXRlIEsgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBTIC0gRW52aXJvbm1lbnQgdmFyaWFibGUgc3BlYyB0eXBlLlxuICogQHBhcmFtIGtleSAtIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgKGUuZy4gYFwiUE9SVFwiYCwgYFwiTk9ERV9FTlZcImApLlxuICogQHBhcmFtIHNwZWMgLSBUeXBlIHNwZWM7IGRlZmF1bHRzIHRvIGBTdHJpY3RFbnZUeXBlLlN0cmluZ2Agd2hlbiBvbWl0dGVkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBgeyBkZWZhdWx0LCB0cmltIH1gOyBzZWUge0BsaW5rIFN0cmljdEVudk9wdGlvbnN9LlxuICogQHJldHVybnMgUGFyc2VkIHZhbHVlIHdpdGggdHlwZSBpbmZlcnJlZCBmcm9tIGBzcGVjYC5cbiAqIEB0aHJvd3Mge1N0cmljdEVudlZhbGlkYXRpb25FcnJvcn0gV2hlbiB0aGUgdmFyaWFibGUgaXMgbWlzc2luZywgZW1wdHkgd2l0aG91dCBhIGRlZmF1bHQsXG4gKiAgIHdoaXRlc3BhY2Utb25seSB3aXRob3V0IGEgZGVmYXVsdCAod2hlbiB0cmltbWluZyksIG9yIGludmFsaWQgZm9yIHRoZSBzcGVjLlxuICovXG5jb25zdCByZXNvbHZlID0gPEsgZXh0ZW5kcyBzdHJpbmcsIFMgZXh0ZW5kcyBTdHJpY3RFbnZTcGVjID0gU3RyaWN0RW52VHlwZVN0cmluZz4oXG4gIGtleTogSyxcbiAgc3BlYzogUyA9IFN0cmljdEVudlR5cGUuU3RyaW5nIGFzIFMsXG4gIG9wdGlvbnM/OiBTdHJpY3RFbnZPcHRpb25zPFM+LFxuKTogU3RyaWN0RW52U3BlY1RvVHlwZTxTPiA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcnNlRW52VmFsdWUoa2V5LCBzcGVjLCBwcm9jZXNzLmVudltrZXldLCBvcHRpb25zPy5kZWZhdWx0LCBvcHRpb25zKTtcbiAgaWYgKCFyZXN1bHQub2spIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yKFtyZXN1bHQuZXJyb3JdKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LnZhbHVlO1xufTtcblxuLyoqXG4gKiBSZWFkcyBhbmQgcGFyc2VzIG11bHRpcGxlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNjaGVtYS5cbiAqXG4gKiBBbHdheXMgZXZhbHVhdGVzIGV2ZXJ5IGtleSBpbiBgc2NoZW1hYC4gRWFjaCBlbnRyeSBpcyB2YWxpZGF0ZWQgdmlhIGBwYXJzZUVudlZhbHVlYDtcbiAqIGFsbCBlcnJvcnMgYXJlIGNvbGxlY3RlZCBhbmQgdGhyb3duIG9uY2UgaW4gYSBzaW5nbGUgYFN0cmljdEVudlZhbGlkYXRpb25FcnJvcmAuXG4gKiBOdW1iZXIgc3BlY3MgdXNlIHRoZSBzYW1lIGZpbml0ZS1udW1iZXIgcnVsZXMgYXMgYHJlc29sdmVgLlxuICpcbiAqIEB0ZW1wbGF0ZSBUU2NoZW1hIC0gU2NoZW1hIG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHNjaGVtYSAtIE1hcCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcyB0byBzcGVjcyBvciBgW3NwZWMsIG9wdGlvbnNdYCB0dXBsZXNcbiAqICAgKHNlZSB7QGxpbmsgU3RyaWN0RW52T3B0aW9uc30gZm9yIHBlci1rZXkgYGRlZmF1bHRgIC8gYHRyaW1gKS5cbiAqIEByZXR1cm5zIFBhcnNlZCBlbnZpcm9ubWVudCBvYmplY3Qgd2l0aCB0eXBlcyBpbmZlcnJlZCBmcm9tIHRoZSBzY2hlbWEuXG4gKiBAdGhyb3dzIHtTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3J9IFdoZW4gb25lIG9yIG1vcmUgdmFyaWFibGVzIGFyZSBtaXNzaW5nLCBlbXB0eSB3aXRob3V0IGEgZGVmYXVsdCxcbiAqICAgd2hpdGVzcGFjZS1vbmx5IHdpdGhvdXQgYSBkZWZhdWx0ICh3aGVuIHRyaW1taW5nKSwgb3IgaW52YWxpZC5cbiAqL1xuY29uc3QgcmVzb2x2ZUFsbCA9IDxUU2NoZW1hIGV4dGVuZHMgU3RyaWN0RW52U2NoZW1hPihzY2hlbWE6IFRTY2hlbWEpOiBTdHJpY3RFbnZTY2hlbWFUb1R5cGU8VFNjaGVtYT4gPT4ge1xuICBjb25zdCBlbnZzOiBQYXJ0aWFsPFN0cmljdEVudlNjaGVtYVRvVHlwZTxUU2NoZW1hPj4gPSB7fTtcbiAgY29uc3QgZXJyb3JzOiBTdHJpY3RFbnZWYWxpZGF0aW9uRW50cnk8RXh0cmFjdDxrZXlvZiBUU2NoZW1hLCBzdHJpbmc+PltdID0gW107XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hKSBhcyBBcnJheTxFeHRyYWN0PGtleW9mIFRTY2hlbWEsIHN0cmluZz4+KSB7XG4gICAgY29uc3QgeyBzcGVjLCBvcHRpb25zIH0gPSByZXNvbHZlU2NoZW1hRW50cnkoc2NoZW1hW2tleV0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VFbnZWYWx1ZShrZXksIHNwZWMsIHByb2Nlc3MuZW52W2tleV0sIG9wdGlvbnM/LmRlZmF1bHQsIG9wdGlvbnMpO1xuICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICBlcnJvcnMucHVzaChyZXN1bHQuZXJyb3IpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVudnNba2V5XSA9IHJlc3VsdC52YWx1ZSBhcyBTdHJpY3RFbnZTY2hlbWFUb1R5cGU8VFNjaGVtYT5bdHlwZW9mIGtleV07XG4gIH1cblxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHRocm93IG5ldyBTdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKTtcbiAgcmV0dXJuIGVudnMgYXMgU3RyaWN0RW52U2NoZW1hVG9UeXBlPFRTY2hlbWE+O1xufTtcblxuLyoqXG4gKiBUeXBlLXNhZmUgZW52aXJvbm1lbnQgdmFyaWFibGUgcmVzb2x2ZXIgZm9yIE5vZGUuanMgYHByb2Nlc3MuZW52YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHBvcnQgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlKCdQT1JUJywgU3RyaWN0RW52VHlwZS5OdW1iZXIuUG9ydCk7XG4gKiBjb25zdCBlbnZzID0gU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZUFsbCh7XG4gKiAgIFBPUlQ6IFN0cmljdEVudlR5cGUuTnVtYmVyLlBvcnQsXG4gKiAgIERFQlVHOiBbU3RyaWN0RW52VHlwZS5Cb29sZWFuLCB7IGRlZmF1bHQ6IGZhbHNlIH1dLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IFN0cmljdEVudlJlc29sdmVyID0ge1xuICAvKiogUmVhZHMgYW5kIHBhcnNlcyBhIHNpbmdsZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gU2VlIHtAbGluayByZXNvbHZlfS4gKi9cbiAgcmVzb2x2ZSxcbiAgLyoqIFJlYWRzIGFuZCBwYXJzZXMgbXVsdGlwbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIG9uZSBwYXNzLiBTZWUge0BsaW5rIHJlc29sdmVBbGx9LiAqL1xuICByZXNvbHZlQWxsLFxufSBhcyBjb25zdDtcbiJdfQ==
package/package.json CHANGED
@@ -70,7 +70,7 @@
70
70
  "publishConfig": {
71
71
  "access": "public"
72
72
  },
73
- "version": "0.6.6",
73
+ "version": "0.7.0",
74
74
  "jest": {
75
75
  "coverageProvider": "v8",
76
76
  "testMatch": [