@dbx-tools/core 0.6.87 → 0.6.89
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 +9 -14
- package/index.ts +1 -2
- package/lib/index.d.ts +1 -2
- package/lib/index.js +2 -2
- package/lib/src/config.d.ts +26 -51
- package/lib/src/config.js +123 -274
- package/lib/src/project.d.ts +1 -1
- package/lib/src/project.js +8 -8
- package/package.json +2 -11
- package/src/config.ts +149 -279
- package/src/project.ts +8 -8
package/lib/src/config.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Every package resolves settings the same way: take the caller's value, else
|
|
5
5
|
* an environment variable, else a default. Local development adds two fallback
|
|
6
|
-
* locations: `.env` files and `resources.apps.<app>.config.env`
|
|
7
|
-
* `
|
|
6
|
+
* locations: `.env` files and one App's `resources.apps.<app>.config.env` in
|
|
7
|
+
* `databricks.yml`.
|
|
8
8
|
*
|
|
9
9
|
* Two things make it cheap to call from a hot path:
|
|
10
10
|
*
|
|
@@ -20,24 +20,6 @@
|
|
|
20
20
|
* CLI is not on the image. Boolean environment overrides can force either file
|
|
21
21
|
* source on or off when a tool needs different behavior.
|
|
22
22
|
*
|
|
23
|
-
* The bundle is gated on this being an AppKit project at all. `databricks bundle
|
|
24
|
-
* validate` is a process spawn measured in seconds, and a plain library or CLI
|
|
25
|
-
* consumer has no bundle to find, so the gate runs in three steps before the
|
|
26
|
-
* spawn is allowed - see {@link bundleFile}:
|
|
27
|
-
*
|
|
28
|
-
* 1. `@databricks/appkit` is resolved WITHOUT evaluating it. It is an optional
|
|
29
|
-
* peer, so a consumer that never installed it is not an AppKit project and
|
|
30
|
-
* the bundle is never loaded. The probe is cached, so this costs one
|
|
31
|
-
* resolution for the life of the process.
|
|
32
|
-
* 2. The bundle is read (once per context) and must describe EXACTLY ONE app
|
|
33
|
-
* with `config.env`. Nothing here says which of several apps this process
|
|
34
|
-
* is, so an ambiguous bundle contributes nothing rather than a guess.
|
|
35
|
-
* 3. AppKit's execution context confirms this process really is that app. The
|
|
36
|
-
* context does not exist until AppKit boots and `getExecutionContext()`
|
|
37
|
-
* THROWS until then, so the probe is caught and only the affirmative is
|
|
38
|
-
* remembered - a lookup before boot still resolves, and re-confirms later
|
|
39
|
-
* once the context is available.
|
|
40
|
-
*
|
|
41
23
|
* Only the single app's `config.env` is consulted. Root bundle `variables` are
|
|
42
24
|
* not: they are authoring inputs for the bundle itself (interpolated into
|
|
43
25
|
* targets, resources, and paths), so treating one as a process setting resolves
|
|
@@ -47,20 +29,11 @@
|
|
|
47
29
|
*
|
|
48
30
|
* @module
|
|
49
31
|
*/
|
|
50
|
-
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
51
|
-
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
52
|
-
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
53
|
-
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
return path;
|
|
57
|
-
};
|
|
58
32
|
import { spawnSync } from "node:child_process";
|
|
59
33
|
import { readFileSync } from "node:fs";
|
|
60
|
-
import { createRequire } from "node:module";
|
|
61
34
|
import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
62
35
|
import { parseEnv } from "node:util";
|
|
63
|
-
import { context,
|
|
36
|
+
import { context, json, log, object, string as sharedString, } from "@dbx-tools/shared-core";
|
|
64
37
|
import { z } from "zod";
|
|
65
38
|
import { statSync } from "./file.js";
|
|
66
39
|
import { root as resolveProjectRoot } from "./project.js";
|
|
@@ -76,34 +49,36 @@ const NODE_ENV_ALTERNATIVES = {
|
|
|
76
49
|
/** Highest valid TCP port number. */
|
|
77
50
|
export const MAX_TCP_PORT = 65_535;
|
|
78
51
|
/** Boolean environment override for {@link isDatabricksAppEnv}. */
|
|
79
|
-
|
|
52
|
+
const DATABRICKS_APP_ENV_KEY = "DBX_TOOLS_DATABRICKS_APP_ENV";
|
|
80
53
|
/** Boolean environment override for project `.env` reads. */
|
|
81
|
-
|
|
54
|
+
const CONFIG_DOTENV_KEY = "DBX_TOOLS_CONFIG_DOTENV";
|
|
82
55
|
/** Boolean environment override for Databricks bundle reads. */
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* The OPTIONAL AppKit peer whose presence marks this as a Databricks App
|
|
86
|
-
* project. Held as a constant so the resolve probe and the lazy import name it
|
|
87
|
-
* once, and so neither site carries a literal a bundler would try to follow.
|
|
88
|
-
*/
|
|
89
|
-
const APPKIT_MODULE = "@databricks/appkit";
|
|
90
|
-
/**
|
|
91
|
-
* Whether AppKit's execution context has EVER been observed. Latching is the
|
|
92
|
-
* point: a context confirms this process is the bundle's app, and that fact does
|
|
93
|
-
* not stop being true when a later lookup happens outside a request scope.
|
|
94
|
-
*/
|
|
95
|
-
let appKitContext = false;
|
|
96
|
-
/** Flattened App `config.env` per parsed bundle - see {@link bundleApp}. */
|
|
97
|
-
const BUNDLE_APP_CACHE = new WeakMap();
|
|
56
|
+
const CONFIG_BUNDLE_KEY = "DBX_TOOLS_CONFIG_BUNDLE";
|
|
98
57
|
/** Exact process-environment lookup for callers that do not read local config files. */
|
|
99
58
|
export const ENV_ONLY = { scope: [], sources: "env" };
|
|
100
|
-
export const
|
|
59
|
+
export const valueSchema = z
|
|
101
60
|
.string()
|
|
102
|
-
.
|
|
103
|
-
.
|
|
61
|
+
.trim()
|
|
62
|
+
.min(1)
|
|
104
63
|
.refine((value) => !/\$\{[^}]+\}/.test(value), {
|
|
105
64
|
message: "Interpolated values are not allowed",
|
|
106
65
|
});
|
|
66
|
+
const portValueSchema = z.preprocess((input) => object.toNumber(input), z.number().int().min(1).max(MAX_TCP_PORT));
|
|
67
|
+
const positiveNumberValue = z.preprocess((input) => object.toNumber(input), z.number().positive());
|
|
68
|
+
const positiveIntValue = positiveNumberValue.transform(Math.floor);
|
|
69
|
+
const workspaceHostSchema = valueSchema.refine((host) => {
|
|
70
|
+
try {
|
|
71
|
+
return ["http:", "https:"].includes(new URL(host).protocol);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}, { message: "Must be an HTTP(S) URL" });
|
|
77
|
+
const databricksAppEnvSchema = z.object({
|
|
78
|
+
DATABRICKS_APP_NAME: valueSchema,
|
|
79
|
+
DATABRICKS_HOST: workspaceHostSchema,
|
|
80
|
+
DATABRICKS_APP_PORT: portValueSchema,
|
|
81
|
+
});
|
|
107
82
|
/**
|
|
108
83
|
* The GENERIC shape of a bundle resource: a name, and whatever else the resource
|
|
109
84
|
* type carries. Deliberately unopinionated and `passthrough()` - the concrete
|
|
@@ -111,20 +86,31 @@ export const bundleValue = z
|
|
|
111
86
|
* Databricks-App concepts that belong to the package that resolves them, so
|
|
112
87
|
* node-appkit `.extend()`s this rather than this module knowing about them.
|
|
113
88
|
*/
|
|
114
|
-
export const bundleResourceSchema = z.object({ name:
|
|
89
|
+
export const bundleResourceSchema = z.object({ name: valueSchema.optional() }).passthrough();
|
|
115
90
|
export const bundleEnvEntrySchema = z.object({
|
|
116
|
-
name:
|
|
91
|
+
name: valueSchema.optional(),
|
|
117
92
|
value: z.string().optional(),
|
|
118
|
-
value_from:
|
|
93
|
+
value_from: valueSchema.optional(),
|
|
119
94
|
});
|
|
120
95
|
export const bundleAppSchema = z.object({
|
|
121
|
-
name:
|
|
122
|
-
source_code_path: z.string().optional(),
|
|
96
|
+
name: valueSchema.optional(),
|
|
123
97
|
config: z.object({ env: z.array(bundleEnvEntrySchema).optional() }).optional(),
|
|
124
98
|
resources: z.array(bundleResourceSchema).optional(),
|
|
125
99
|
});
|
|
126
|
-
const
|
|
100
|
+
const bundleAppConfigEnvSchema = z
|
|
101
|
+
.object({
|
|
127
102
|
resources: z.object({ apps: z.record(z.string(), bundleAppSchema).optional() }).optional(),
|
|
103
|
+
})
|
|
104
|
+
.transform((bundle) => {
|
|
105
|
+
const apps = Object.values(bundle.resources?.apps ?? {});
|
|
106
|
+
if (apps.length !== 1)
|
|
107
|
+
return {};
|
|
108
|
+
return Object.fromEntries((apps[0]?.config?.env ?? []).flatMap((entry) => {
|
|
109
|
+
if (!entry.name)
|
|
110
|
+
return [];
|
|
111
|
+
const parsed = valueSchema.safeParse(entry.value);
|
|
112
|
+
return parsed.success ? [[entry.name, parsed.data]] : [];
|
|
113
|
+
}));
|
|
128
114
|
});
|
|
129
115
|
/**
|
|
130
116
|
* Detect a Databricks App runtime from its required name, host, and port.
|
|
@@ -138,47 +124,45 @@ export function isDatabricksAppEnv(source = process.env) {
|
|
|
138
124
|
const override = object.toBoolean(source[DATABRICKS_APP_ENV_KEY]);
|
|
139
125
|
if (override !== undefined)
|
|
140
126
|
return override;
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
const port = source.DATABRICKS_APP_PORT?.trim();
|
|
144
|
-
if (!appName || !host || !port)
|
|
145
|
-
return false;
|
|
146
|
-
try {
|
|
147
|
-
if (!["http:", "https:"].includes(new URL(host).protocol))
|
|
148
|
-
return false;
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
return false;
|
|
152
|
-
}
|
|
153
|
-
const portNumber = object.toNumber(port);
|
|
154
|
-
return (portNumber !== undefined &&
|
|
155
|
-
Number.isInteger(portNumber) &&
|
|
156
|
-
portNumber >= 1 &&
|
|
157
|
-
portNumber <= MAX_TCP_PORT);
|
|
127
|
+
const parsed = databricksAppEnvSchema.safeParse(source);
|
|
128
|
+
return parsed.success;
|
|
158
129
|
}
|
|
159
130
|
/** Candidate names in scope, prefix, and input precedence order. */
|
|
160
131
|
function keys(input, options = {}) {
|
|
161
|
-
const scopes = object
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
.
|
|
175
|
-
|
|
176
|
-
|
|
132
|
+
const scopes = object
|
|
133
|
+
.sequence(options.scope ?? DEFAULT_SCOPE)
|
|
134
|
+
.map(sharedString.trimToEmpty)
|
|
135
|
+
.filter(Boolean)
|
|
136
|
+
.distinct()
|
|
137
|
+
.toArray();
|
|
138
|
+
const prefixes = options.prefix === undefined
|
|
139
|
+
? []
|
|
140
|
+
: object
|
|
141
|
+
.sequence(options.prefix)
|
|
142
|
+
.map(sharedString.trimToEmpty)
|
|
143
|
+
.filter(Boolean)
|
|
144
|
+
.distinct()
|
|
145
|
+
.toArray();
|
|
146
|
+
return object
|
|
147
|
+
.sequence(input)
|
|
148
|
+
.map(sharedString.trimToEmpty)
|
|
149
|
+
.filter(Boolean)
|
|
150
|
+
.distinct()
|
|
151
|
+
.flatMap((key) => {
|
|
152
|
+
const prefixed = prefixes.length > 0 ? prefixes.map((prefix) => `${prefix}_${key}`) : [key];
|
|
153
|
+
return [
|
|
154
|
+
...scopes.flatMap((scope) => prefixed.map((name) => `${scope}_${name}`)),
|
|
155
|
+
...prefixed,
|
|
156
|
+
key,
|
|
157
|
+
];
|
|
158
|
+
})
|
|
159
|
+
.distinct()
|
|
160
|
+
.toArray();
|
|
177
161
|
}
|
|
178
162
|
/**
|
|
179
163
|
* Every value that resolves for `input`, in source-then-key precedence order,
|
|
180
164
|
* as a LAZY sequence: nothing past the first consumed element is read, so
|
|
181
|
-
* `values(key).
|
|
165
|
+
* `values(key).at(0)` never spawns the Databricks CLI when the environment
|
|
182
166
|
* already answered.
|
|
183
167
|
*
|
|
184
168
|
*/
|
|
@@ -190,7 +174,7 @@ function values(input, options = {}) {
|
|
|
190
174
|
for (const source of sources) {
|
|
191
175
|
for (const map of read(source, options.cwd)) {
|
|
192
176
|
for (const key of candidates) {
|
|
193
|
-
const value =
|
|
177
|
+
const value = sharedString.trimToNull(map[key]);
|
|
194
178
|
if (value !== null)
|
|
195
179
|
yield { key, source, value };
|
|
196
180
|
}
|
|
@@ -224,7 +208,7 @@ export function name(input, options = {}) {
|
|
|
224
208
|
* Known long and short names are interchangeable; unknown names pass through.
|
|
225
209
|
*/
|
|
226
210
|
function nodeEnvNames(nodeEnv) {
|
|
227
|
-
const name =
|
|
211
|
+
const name = sharedString.trimToNull(nodeEnv)?.toLowerCase();
|
|
228
212
|
if (!name || !/^[a-z0-9_-]+$/.test(name))
|
|
229
213
|
return [];
|
|
230
214
|
for (const [canonical, alternatives] of Object.entries(NODE_ENV_ALTERNATIVES)) {
|
|
@@ -235,12 +219,6 @@ function nodeEnvNames(nodeEnv) {
|
|
|
235
219
|
}
|
|
236
220
|
return [name];
|
|
237
221
|
}
|
|
238
|
-
function join(...parts) {
|
|
239
|
-
return parts
|
|
240
|
-
.map((part) => part.trim())
|
|
241
|
-
.filter(Boolean)
|
|
242
|
-
.join("_");
|
|
243
|
-
}
|
|
244
222
|
/**
|
|
245
223
|
* Resolve a string: `configured` when non-empty, else {@link text}, else `undefined`.
|
|
246
224
|
*
|
|
@@ -251,7 +229,7 @@ function join(...parts) {
|
|
|
251
229
|
* config.string(options.host, "SMTP_HOST");
|
|
252
230
|
*/
|
|
253
231
|
export function string(configured, input, options) {
|
|
254
|
-
return
|
|
232
|
+
return sharedString.trimToNull(configured) ?? text(input, options);
|
|
255
233
|
}
|
|
256
234
|
/**
|
|
257
235
|
* Resolve a boolean through `object.toBoolean`. `undefined` when neither source
|
|
@@ -265,7 +243,11 @@ export function boolean(configured, input, options) {
|
|
|
265
243
|
* Use {@link positiveInt} for a count, port, or timeout.
|
|
266
244
|
*/
|
|
267
245
|
export function positiveNumber(configured, input, fallback, options) {
|
|
268
|
-
|
|
246
|
+
const fromConfig = positiveNumberValue.safeParse(configured);
|
|
247
|
+
if (fromConfig.success)
|
|
248
|
+
return fromConfig.data;
|
|
249
|
+
const fromSources = positiveNumberValue.safeParse(text(input, options));
|
|
250
|
+
return fromSources.success ? fromSources.data : fallback;
|
|
269
251
|
}
|
|
270
252
|
/**
|
|
271
253
|
* Resolve a positive integer (a port, a timeout, a page size), floored. A
|
|
@@ -273,37 +255,41 @@ export function positiveNumber(configured, input, fallback, options) {
|
|
|
273
255
|
* these are ceilings where a sane default beats a boot failure.
|
|
274
256
|
*/
|
|
275
257
|
export function positiveInt(configured, input, fallback, options) {
|
|
276
|
-
const
|
|
277
|
-
|
|
258
|
+
const fromConfig = positiveIntValue.safeParse(configured);
|
|
259
|
+
if (fromConfig.success)
|
|
260
|
+
return fromConfig.data;
|
|
261
|
+
const fromSources = positiveIntValue.safeParse(text(input, options));
|
|
262
|
+
return fromSources.success ? fromSources.data : Math.floor(fallback);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Resolve a TCP port between 1 and {@link MAX_TCP_PORT}. Invalid configured or
|
|
266
|
+
* sourced values fall back to the caller's default, which may be a sentinel
|
|
267
|
+
* such as `0` when the caller uses one.
|
|
268
|
+
*/
|
|
269
|
+
export function port(configured, input, fallback, options) {
|
|
270
|
+
const fromConfig = portValueSchema.safeParse(configured);
|
|
271
|
+
if (fromConfig.success)
|
|
272
|
+
return fromConfig.data;
|
|
273
|
+
const fromSources = portValueSchema.safeParse(text(input, options));
|
|
274
|
+
return fromSources.success ? fromSources.data : fallback;
|
|
278
275
|
}
|
|
279
276
|
/**
|
|
280
277
|
* Resolve a list through `string.parseList`, so an array from typed config and a
|
|
281
278
|
* `"a, b c"` string normalize identically. `[]` when neither source has entries.
|
|
282
279
|
*/
|
|
283
280
|
export function list(configured, input, transform, options) {
|
|
284
|
-
const fromConfig =
|
|
281
|
+
const fromConfig = sharedString.parseList(configured, transform);
|
|
285
282
|
return fromConfig.length > 0
|
|
286
283
|
? fromConfig
|
|
287
|
-
:
|
|
288
|
-
}
|
|
289
|
-
function toPositiveNumber(value) {
|
|
290
|
-
const parsed = object.toNumber(value);
|
|
291
|
-
return parsed !== undefined && parsed > 0 ? parsed : undefined;
|
|
284
|
+
: sharedString.parseList(text(input, options), transform);
|
|
292
285
|
}
|
|
293
286
|
/**
|
|
294
287
|
* The Databricks bundle output for `cwd` - `databricks bundle validate --output
|
|
295
288
|
* json` run from the directory holding `databricks.yml`, with the config file's
|
|
296
289
|
* path. A non-zero validation may still return partial JSON with usable App
|
|
297
|
-
* config. `undefined` when bundle reads are disabled,
|
|
298
|
-
*
|
|
299
|
-
*
|
|
300
|
-
*
|
|
301
|
-
* The spawn is guarded because it is expensive and usually pointless. In order:
|
|
302
|
-
* `@databricks/appkit` must be RESOLVABLE (no AppKit, no bundle - and the probe
|
|
303
|
-
* never evaluates the module); the bundle must describe exactly ONE app carrying
|
|
304
|
-
* `config.env`; and AppKit's execution context must confirm this process is that
|
|
305
|
-
* app. Only the confirmation is remembered, so a lookup during boot - before any
|
|
306
|
-
* context exists - still resolves from the bundle and re-confirms later.
|
|
290
|
+
* config. `undefined` when bundle reads are disabled, the process is production
|
|
291
|
+
* or a deployed App without an explicit override, there is no bundle, or the
|
|
292
|
+
* CLI produces no JSON.
|
|
307
293
|
*
|
|
308
294
|
* Cached once per resolved working-directory context and
|
|
309
295
|
* `DATABRICKS_CONFIG_PROFILE` through {@link context.cached}, so repeated
|
|
@@ -311,157 +297,28 @@ function toPositiveNumber(value) {
|
|
|
311
297
|
* context's bundle.
|
|
312
298
|
*/
|
|
313
299
|
export function bundleFile(cwd) {
|
|
314
|
-
const production = process.env.NODE_ENV?.trim().toLowerCase() === "production";
|
|
315
300
|
const override = object.toBoolean(process.env[CONFIG_BUNDLE_KEY]);
|
|
316
301
|
if (override === false)
|
|
317
302
|
return undefined;
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
// entirely - but not the App/production defaults, which it also overrides.
|
|
321
|
-
if (override === undefined) {
|
|
322
|
-
if (production || isDatabricksAppEnv())
|
|
323
|
-
return undefined;
|
|
324
|
-
if (!appKitInstalled())
|
|
325
|
-
return undefined;
|
|
326
|
-
}
|
|
327
|
-
const profile = stringModule.trimToNull(process.env.DATABRICKS_CONFIG_PROFILE);
|
|
328
|
-
const file = cachedConfig(["bundle", profile ?? ""], cwd, (resolved) => loadBundleFile(resolved, profile));
|
|
329
|
-
if (override !== undefined || file === undefined)
|
|
330
|
-
return file;
|
|
331
|
-
// Already confirmed: this process is the app, and that does not stop being
|
|
332
|
-
// true, so skip re-deriving the gate on every lookup.
|
|
333
|
-
if (appKitContext)
|
|
334
|
-
return file;
|
|
335
|
-
// The app must be unambiguous. `bundleApp` is what decides "exactly one app
|
|
336
|
-
// with `config.env`", so an empty map IS the ambiguous or app-less bundle and
|
|
337
|
-
// needs no separate check.
|
|
338
|
-
if (Object.keys(bundleApp(file.data)).length === 0)
|
|
303
|
+
if (override === undefined &&
|
|
304
|
+
(process.env.NODE_ENV?.trim().toLowerCase() === "production" || isDatabricksAppEnv())) {
|
|
339
305
|
return undefined;
|
|
340
|
-
confirmAppKitContext();
|
|
341
|
-
return file;
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* The single App's literal `config.env` entries, flattened to `name -> value`.
|
|
345
|
-
*
|
|
346
|
-
* A `value_from` entry names a bundle resource whose id is known after
|
|
347
|
-
* deployment, and reading it needs the resource vocabulary this module
|
|
348
|
-
* deliberately does not have - node-appkit resolves those against its extended
|
|
349
|
-
* {@link bundleResourceSchema}. An `apps` block with more than one app is
|
|
350
|
-
* ambiguous (nothing here says which app this process is), so it yields nothing
|
|
351
|
-
* rather than a guess.
|
|
352
|
-
*
|
|
353
|
-
* Memoized against the parsed bundle it came from, because both the gate in
|
|
354
|
-
* {@link bundleFile} and the lookup in {@link read} ask the same question of the
|
|
355
|
-
* same cached object - validating that payload twice per lookup would be pure
|
|
356
|
-
* waste. A `WeakMap` keeps the entry alive exactly as long as the bundle is.
|
|
357
|
-
*/
|
|
358
|
-
function bundleApp(input) {
|
|
359
|
-
if (!object.isRecord(input))
|
|
360
|
-
return bundleAppEntries(input);
|
|
361
|
-
const cached = BUNDLE_APP_CACHE.get(input);
|
|
362
|
-
if (cached)
|
|
363
|
-
return cached;
|
|
364
|
-
const result = bundleAppEntries(input);
|
|
365
|
-
BUNDLE_APP_CACHE.set(input, result);
|
|
366
|
-
return result;
|
|
367
|
-
}
|
|
368
|
-
/** {@link bundleApp} without the memoization, so the cache has one filler. */
|
|
369
|
-
function bundleAppEntries(input) {
|
|
370
|
-
const parsed = bundleAppsSchema.safeParse(input);
|
|
371
|
-
if (!parsed.success)
|
|
372
|
-
return {};
|
|
373
|
-
const apps = parsed.data.resources?.apps;
|
|
374
|
-
if (!apps)
|
|
375
|
-
return {};
|
|
376
|
-
const names = Object.keys(apps);
|
|
377
|
-
if (names.length !== 1)
|
|
378
|
-
return {};
|
|
379
|
-
const entries = apps[names[0]]?.config?.env ?? [];
|
|
380
|
-
const result = {};
|
|
381
|
-
for (const entry of entries) {
|
|
382
|
-
if (!entry.name)
|
|
383
|
-
continue;
|
|
384
|
-
const value = resolvedString(entry.value);
|
|
385
|
-
if (value !== null)
|
|
386
|
-
result[entry.name] = value;
|
|
387
306
|
}
|
|
388
|
-
|
|
307
|
+
const profile = sharedString.trimToNull(process.env.DATABRICKS_CONFIG_PROFILE);
|
|
308
|
+
return cachedConfig(["bundle", profile ?? ""], cwd, (resolved) => loadBundleFile(resolved, profile));
|
|
389
309
|
}
|
|
390
|
-
/**
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
* Resolution, not import: this answers "is this an AppKit project" without
|
|
395
|
-
* evaluating the module, so the cheap negative (a plain library or CLI consumer
|
|
396
|
-
* that never installed the optional peer) costs one path lookup and never boots
|
|
397
|
-
* AppKit as a side effect of reading config. A runtime with no `createRequire`
|
|
398
|
-
* (a browser bundle that reached this Node-only module anyway) reports absent.
|
|
399
|
-
*/
|
|
400
|
-
const appKitInstalled = functionModule.memoize(() => {
|
|
401
|
-
try {
|
|
402
|
-
// Indirect specifier: a bundler must not try to follow an OPTIONAL peer that
|
|
403
|
-
// a browser build has no way to resolve.
|
|
404
|
-
const specifier = APPKIT_MODULE;
|
|
405
|
-
createRequire(import.meta.url).resolve(specifier);
|
|
406
|
-
return true;
|
|
407
|
-
}
|
|
408
|
-
catch {
|
|
409
|
-
return false;
|
|
410
|
-
}
|
|
411
|
-
});
|
|
412
|
-
/**
|
|
413
|
-
* AppKit's execution context once it exists, or `undefined`.
|
|
414
|
-
*
|
|
415
|
-
* Lazily imported (and `@vite-ignore`d) because `@databricks/appkit` is an
|
|
416
|
-
* OPTIONAL peer this module must never make required. The import is only
|
|
417
|
-
* attempted once {@link appKitInstalled} says there is something to import, and a
|
|
418
|
-
* failure resolves to `undefined` rather than rejecting - a missing peer is the
|
|
419
|
-
* expected path, not an error.
|
|
420
|
-
*
|
|
421
|
-
* `getExecutionContext()` THROWS until AppKit has booted, so the call is caught
|
|
422
|
-
* and only a real context is reported. The module handle is memoized; the
|
|
423
|
-
* context lookup is not, so a call before boot answers "not yet" and a later one
|
|
424
|
-
* still sees the context.
|
|
425
|
-
*/
|
|
426
|
-
const appKitModule = functionModule.memoize(async () => {
|
|
427
|
-
if (!appKitInstalled())
|
|
310
|
+
/** The single bundle App's resolved literal environment, when available. */
|
|
311
|
+
function bundleEnvironment(cwd) {
|
|
312
|
+
const file = bundleFile(cwd);
|
|
313
|
+
if (!file)
|
|
428
314
|
return undefined;
|
|
429
|
-
const
|
|
430
|
-
return
|
|
431
|
-
});
|
|
432
|
-
/**
|
|
433
|
-
* Latch {@link appKitContext} once AppKit's execution context exists.
|
|
434
|
-
*
|
|
435
|
-
* Fire-and-forget, because the caller is a SYNCHRONOUS lookup and the check
|
|
436
|
-
* needs a lazy import. The affirmative is all that is stored: AppKit's context
|
|
437
|
-
* does not exist until it boots, and `getExecutionContext()` throws until then,
|
|
438
|
-
* so remembering a negative would permanently disable the bundle for a process
|
|
439
|
-
* that is seconds away from having one. Every call before the latch closes
|
|
440
|
-
* re-attempts, which is what makes "not available yet" retry rather than stick.
|
|
441
|
-
*/
|
|
442
|
-
function confirmAppKitContext() {
|
|
443
|
-
void appKitModule()
|
|
444
|
-
.then((appkit) => {
|
|
445
|
-
if (!appkit)
|
|
446
|
-
return;
|
|
447
|
-
try {
|
|
448
|
-
if (appkit.getExecutionContext()?.client)
|
|
449
|
-
appKitContext = true;
|
|
450
|
-
}
|
|
451
|
-
catch {
|
|
452
|
-
// AppKit has not booted yet; a later call re-checks.
|
|
453
|
-
}
|
|
454
|
-
})
|
|
455
|
-
.catch(() => undefined);
|
|
456
|
-
}
|
|
457
|
-
/** A non-empty bundle value with every `${...}` interpolation resolved. */
|
|
458
|
-
function resolvedString(value) {
|
|
459
|
-
const parsed = bundleValue.safeParse(value);
|
|
460
|
-
return parsed.success ? parsed.data : null;
|
|
315
|
+
const parsed = bundleAppConfigEnvSchema.safeParse(file.data);
|
|
316
|
+
return parsed.success ? parsed.data : undefined;
|
|
461
317
|
}
|
|
462
318
|
/** Parsed `.env` for `cwd`, or `{}`. Read once per resolved context. */
|
|
463
319
|
function dotenv(cwd) {
|
|
464
|
-
|
|
320
|
+
const enabled = object.toBoolean(process.env[CONFIG_DOTENV_KEY]) ?? !isDatabricksAppEnv();
|
|
321
|
+
if (!enabled)
|
|
465
322
|
return {};
|
|
466
323
|
const environments = nodeEnvNames(process.env.NODE_ENV);
|
|
467
324
|
return cachedConfig(["dotenv", ...environments], cwd, (resolved) => loadDotenv(resolved, environments));
|
|
@@ -472,11 +329,7 @@ function cachedConfig(name, cwd, loader) {
|
|
|
472
329
|
const resolved = resolve(cwd ?? ".");
|
|
473
330
|
return context.cached(["config", active, resolved, ...name], () => loader(resolved));
|
|
474
331
|
}
|
|
475
|
-
/**
|
|
476
|
-
* Maps for one source in precedence order. Bundle App config and root variables
|
|
477
|
-
* stay separate so a first-match lookup does not parse variables after an App
|
|
478
|
-
* value resolves.
|
|
479
|
-
*/
|
|
332
|
+
/** Maps for one source in precedence order. */
|
|
480
333
|
function read(source, cwd) {
|
|
481
334
|
return object.sequence({
|
|
482
335
|
*[Symbol.iterator]() {
|
|
@@ -488,9 +341,9 @@ function read(source, cwd) {
|
|
|
488
341
|
yield dotenv(cwd);
|
|
489
342
|
break;
|
|
490
343
|
case "bundle": {
|
|
491
|
-
const
|
|
492
|
-
if (
|
|
493
|
-
yield
|
|
344
|
+
const environment = bundleEnvironment(cwd);
|
|
345
|
+
if (environment)
|
|
346
|
+
yield environment;
|
|
494
347
|
break;
|
|
495
348
|
}
|
|
496
349
|
}
|
|
@@ -523,10 +376,6 @@ function findConfigFile(cwd, names) {
|
|
|
523
376
|
}
|
|
524
377
|
return undefined;
|
|
525
378
|
}
|
|
526
|
-
/** A recognized source override, else the caller's automatic default. */
|
|
527
|
-
function fileSourceEnabled(key, fallback = !isDatabricksAppEnv()) {
|
|
528
|
-
return object.toBoolean(process.env[key]) ?? fallback;
|
|
529
|
-
}
|
|
530
379
|
function loadDotenv(cwd, environments) {
|
|
531
380
|
const names = [...environments.map((name) => `${DOTENV_FILE_NAME}.${name}`), DOTENV_FILE_NAME];
|
|
532
381
|
const path = findConfigFile(cwd, names);
|
|
@@ -556,8 +405,8 @@ function loadBundleFile(cwd, profile) {
|
|
|
556
405
|
encoding: "utf8",
|
|
557
406
|
stdio: ["ignore", "pipe", "pipe"],
|
|
558
407
|
});
|
|
559
|
-
const output =
|
|
560
|
-
const error =
|
|
408
|
+
const output = sharedString.trimToNull(result.stdout);
|
|
409
|
+
const error = sharedString.trimToNull(result.stderr);
|
|
561
410
|
if (output === null) {
|
|
562
411
|
logger.debug("bundle validate produced no JSON", { path, status: result.status, error });
|
|
563
412
|
return undefined;
|
|
@@ -572,4 +421,4 @@ function loadBundleFile(cwd, profile) {
|
|
|
572
421
|
}
|
|
573
422
|
return { path, data };
|
|
574
423
|
}
|
|
575
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0RHOzs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUNMLE9BQU8sRUFDUCxjQUFjLEVBQ2QsSUFBSSxFQUNKLEdBQUcsRUFDSCxNQUFNLEVBQ04sTUFBTSxJQUFJLFlBQVksR0FDdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUFFLElBQUksSUFBSSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUUxRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBaUNwQyxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7QUFDbEMsTUFBTSxlQUFlLEdBQTRCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM3RSxNQUFNLGlCQUFpQixHQUFHLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQVUsQ0FBQztBQUN6RSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQztBQUNo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LENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN2RixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYXllcmVkIGNvbmZpZ3VyYXRpb24gbG9va3VwOiBlbnZpcm9ubWVudCwgYC5lbnZgLCBEYXRhYnJpY2tzIGJ1bmRsZS5cbiAqXG4gKiBFdmVyeSBwYWNrYWdlIHJlc29sdmVzIHNldHRpbmdzIHRoZSBzYW1lIHdheTogdGFrZSB0aGUgY2FsbGVyJ3MgdmFsdWUsIGVsc2VcbiAqIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLCBlbHNlIGEgZGVmYXVsdC4gTG9jYWwgZGV2ZWxvcG1lbnQgYWRkcyB0d28gZmFsbGJhY2tcbiAqIGxvY2F0aW9uczogYC5lbnZgIGZpbGVzIGFuZCBgcmVzb3VyY2VzLmFwcHMuPGFwcD4uY29uZmlnLmVudmAgb3Igcm9vdFxuICogYHZhcmlhYmxlc2AgaW4gYGRhdGFicmlja3MueW1sYC5cbiAqXG4gKiBUd28gdGhpbmdzIG1ha2UgaXQgY2hlYXAgdG8gY2FsbCBmcm9tIGEgaG90IHBhdGg6XG4gKlxuICogICAtIHtAbGluayB2YWx1ZXN9IGlzIExBWlkgKGFuIGBvYmplY3QuU2VxdWVuY2VgKSwgc28gYGRhdGFicmlja3MgYnVuZGxlXG4gKiAgICAgdmFsaWRhdGVgIGlzIG9ubHkgc3Bhd25lZCB3aGVuIHRoZSBlbnZpcm9ubWVudCBhbmQgYC5lbnZgIGJvdGggbWlzc2VkLlxuICogICAtIHRoZSBwYXJzZWQgYC5lbnZgIGFuZCBidW5kbGUgYXJlIGNhY2hlZCB0aHJvdWdoIHtAbGluayBjb250ZXh0LmNhY2hlZH0sIHNvXG4gKiAgICAgdGhlIHNwYXduIGhhcHBlbnMgb25jZSBwZXIgd29ya2luZyBkaXJlY3RvcnkgYW5kIGEgYGN3ZGAgY2hhbmdlIG1pc3Nlc1xuICogICAgIHJhdGhlciB0aGFuIHJldHVybmluZyBhbm90aGVyIHByb2plY3QncyBjb25maWcuXG4gKlxuICogSW5zaWRlIGEgZGVwbG95ZWQgRGF0YWJyaWNrcyBBcHAgYm90aCBmaWxlIHNvdXJjZXMgYXJlIHNraXBwZWQgYnkgZGVmYXVsdFxuICogKHtAbGluayBpc0RhdGFicmlja3NBcHBFbnZ9KTogdGhlIHBsYXRmb3JtIGhhcyBhbHJlYWR5IHR1cm5lZCB0aGVtIGludG8gcmVhbFxuICogZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0aGVyZSBpcyBubyBidW5kbGUgdG8gdmFsaWRhdGUsIGFuZCB0aGUgYGRhdGFicmlja3NgXG4gKiBDTEkgaXMgbm90IG9uIHRoZSBpbWFnZS4gQm9vbGVhbiBlbnZpcm9ubWVudCBvdmVycmlkZXMgY2FuIGZvcmNlIGVpdGhlciBmaWxlXG4gKiBzb3VyY2Ugb24gb3Igb2ZmIHdoZW4gYSB0b29sIG5lZWRzIGRpZmZlcmVudCBiZWhhdmlvci5cbiAqXG4gKiBUaGUgYnVuZGxlIGlzIGdhdGVkIG9uIHRoaXMgYmVpbmcgYW4gQXBwS2l0IHByb2plY3QgYXQgYWxsLiBgZGF0YWJyaWNrcyBidW5kbGVcbiAqIHZhbGlkYXRlYCBpcyBhIHByb2Nlc3Mgc3Bhd24gbWVhc3VyZWQgaW4gc2Vjb25kcywgYW5kIGEgcGxhaW4gbGlicmFyeSBvciBDTElcbiAqIGNvbnN1bWVyIGhhcyBubyBidW5kbGUgdG8gZmluZCwgc28gdGhlIGdhdGUgcnVucyBpbiB0aHJlZSBzdGVwcyBiZWZvcmUgdGhlXG4gKiBzcGF3biBpcyBhbGxvd2VkIC0gc2VlIHtAbGluayBidW5kbGVGaWxlfTpcbiAqXG4gKiAgIDEuIGBAZGF0YWJyaWNrcy9hcHBraXRgIGlzIHJlc29sdmVkIFdJVEhPVVQgZXZhbHVhdGluZyBpdC4gSXQgaXMgYW4gb3B0aW9uYWxcbiAqICAgICAgcGVlciwgc28gYSBjb25zdW1lciB0aGF0IG5ldmVyIGluc3RhbGxlZCBpdCBpcyBub3QgYW4gQXBwS2l0IHByb2plY3QgYW5kXG4gKiAgICAgIHRoZSBidW5kbGUgaXMgbmV2ZXIgbG9hZGVkLiBUaGUgcHJvYmUgaXMgY2FjaGVkLCBzbyB0aGlzIGNvc3RzIG9uZVxuICogICAgICByZXNvbHV0aW9uIGZvciB0aGUgbGlmZSBvZiB0aGUgcHJvY2Vzcy5cbiAqICAgMi4gVGhlIGJ1bmRsZSBpcyByZWFkIChvbmNlIHBlciBjb250ZXh0KSBhbmQgbXVzdCBkZXNjcmliZSBFWEFDVExZIE9ORSBhcHBcbiAqICAgICAgd2l0aCBgY29uZmlnLmVudmAuIE5vdGhpbmcgaGVyZSBzYXlzIHdoaWNoIG9mIHNldmVyYWwgYXBwcyB0aGlzIHByb2Nlc3NcbiAqICAgICAgaXMsIHNvIGFuIGFtYmlndW91cyBidW5kbGUgY29udHJpYnV0ZXMgbm90aGluZyByYXRoZXIgdGhhbiBhIGd1ZXNzLlxuICogICAzLiBBcHBLaXQncyBleGVjdXRpb24gY29udGV4dCBjb25maXJtcyB0aGlzIHByb2Nlc3MgcmVhbGx5IGlzIHRoYXQgYXBwLiBUaGVcbiAqICAgICAgY29udGV4dCBkb2VzIG5vdCBleGlzdCB1bnRpbCBBcHBLaXQgYm9vdHMgYW5kIGBnZXRFeGVjdXRpb25Db250ZXh0KClgXG4gKiAgICAgIFRIUk9XUyB1bnRpbCB0aGVuLCBzbyB0aGUgcHJvYmUgaXMgY2F1Z2h0IGFuZCBvbmx5IHRoZSBhZmZpcm1hdGl2ZSBpc1xuICogICAgICByZW1lbWJlcmVkIC0gYSBsb29rdXAgYmVmb3JlIGJvb3Qgc3RpbGwgcmVzb2x2ZXMsIGFuZCByZS1jb25maXJtcyBsYXRlclxuICogICAgICBvbmNlIHRoZSBjb250ZXh0IGlzIGF2YWlsYWJsZS5cbiAqXG4gKiBPbmx5IHRoZSBzaW5nbGUgYXBwJ3MgYGNvbmZpZy5lbnZgIGlzIGNvbnN1bHRlZC4gUm9vdCBidW5kbGUgYHZhcmlhYmxlc2AgYXJlXG4gKiBub3Q6IHRoZXkgYXJlIGF1dGhvcmluZyBpbnB1dHMgZm9yIHRoZSBidW5kbGUgaXRzZWxmIChpbnRlcnBvbGF0ZWQgaW50b1xuICogdGFyZ2V0cywgcmVzb3VyY2VzLCBhbmQgcGF0aHMpLCBzbyB0cmVhdGluZyBvbmUgYXMgYSBwcm9jZXNzIHNldHRpbmcgcmVzb2x2ZXNcbiAqIG5hbWVzIHRoZSBkZXBsb3llZCBhcHAgbmV2ZXIgc2Vlcy5cbiAqXG4gKiBOb2RlLW9ubHkgKGBjaGlsZF9wcm9jZXNzYCwgYGZzYCwgYHByb2Nlc3NgKS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGlzQWJzb2x1dGUsIHJlbGF0aXZlLCByZXNvbHZlLCBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwYXJzZUVudiB9IGZyb20gXCJub2RlOnV0aWxcIjtcbmltcG9ydCB7XG4gIGNvbnRleHQsXG4gIGZ1bmN0aW9uTW9kdWxlLFxuICBqc29uLFxuICBsb2csXG4gIG9iamVjdCxcbiAgc3RyaW5nIGFzIHN0cmluZ01vZHVsZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBzdGF0U3luYyB9IGZyb20gXCIuL2ZpbGUudHNcIjtcbmltcG9ydCB7IHJvb3QgYXMgcmVzb2x2ZVByb2plY3RSb290IH0gZnJvbSBcIi4vcHJvamVjdC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiY29uZmlnXCIpO1xuXG5leHBvcnQgdHlwZSBDb25maWdLZXkgPSBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXTtcblxuLyoqIFdoZXJlIGEgdmFsdWUgbWF5IGNvbWUgZnJvbSwgY29uc3VsdGVkIGluIHRoZSBvcmRlciBnaXZlbi4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZ1NvdXJjZSA9IFwiZW52XCIgfCBcImRvdGVudlwiIHwgXCJidW5kbGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb25maWdPcHRpb25zIHtcbiAgLyoqXG4gICAqIE91dGVybW9zdCBuYW1lc3BhY2VzIHRyaWVkIGJlZm9yZSBlYWNoIGtleS4gRGVmYXVsdHMgdG8gYERCWF9UT09MU2AuXG4gICAqL1xuICBzY29wZT86IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogQ2FwYWJpbGl0eSBuYW1lc3BhY2VzIGluc2VydGVkIGFmdGVyIHRoZSBzY29wZSBhbmQgYmVmb3JlIGVhY2gga2V5LiAqL1xuICBwcmVmaXg/OiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIERpcmVjdG9yeSB0byByZXNvbHZlIGAuZW52YCBhbmQgdGhlIGJ1bmRsZSBmcm9tLiBEZWZhdWx0OiBgcHJvY2Vzcy5jd2QoKWAuICovXG4gIGN3ZD86IHN0cmluZztcbiAgLyoqIFNvdXJjZXMgaW4gcHJlY2VkZW5jZSBvcmRlci4gRGVmYXVsdDogYGVudmAsIGBkb3RlbnZgLCBgYnVuZGxlYC4gKi9cbiAgc291cmNlcz86IENvbmZpZ1NvdXJjZSB8IHJlYWRvbmx5IENvbmZpZ1NvdXJjZVtdO1xufVxuXG4vKiogT25lIHJlc29sdmVkIHZhbHVlLCB0YWdnZWQgd2l0aCB0aGUga2V5IGFuZCBzb3VyY2UgaXQgY2FtZSBmcm9tLiAqL1xuaW50ZXJmYWNlIENvbmZpZ1ZhbHVlIHtcbiAga2V5OiBzdHJpbmc7XG4gIHNvdXJjZTogQ29uZmlnU291cmNlO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKiogQSBjb25maWcgZmlsZSBmb3VuZCBvbiBkaXNrLCB3aXRoIGl0cyBwYXJzZWQgY29udGVudHMuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ0ZpbGUge1xuICBwYXRoOiBzdHJpbmc7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5jb25zdCBERUZBVUxUX1NDT1BFID0gXCJEQlhfVE9PTFNcIjtcbmNvbnN0IERFRkFVTFRfU09VUkNFUzogcmVhZG9ubHkgQ29uZmlnU291cmNlW10gPSBbXCJlbnZcIiwgXCJkb3RlbnZcIiwgXCJidW5kbGVcIl07XG5jb25zdCBCVU5ETEVfRklMRV9OQU1FUyA9IFtcImRhdGFicmlja3MueW1sXCIsIFwiZGF0YWJyaWNrcy55YW1sXCJdIGFzIGNvbnN0O1xuY29uc3QgRE9URU5WX0ZJTEVfTkFNRSA9IFwiLmVudlwiO1xuY29uc3QgTk9ERV9FTlZfQUxURVJOQVRJVkVTID0ge1xuICBwcm9kdWN0aW9uOiBbXCJwcm9kXCJdLFxuICBkZXZlbG9wbWVudDogW1wiZGV2XCJdLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+O1xuXG4vKiogSGlnaGVzdCB2YWxpZCBUQ1AgcG9ydCBudW1iZXIuICovXG5leHBvcnQgY29uc3QgTUFYX1RDUF9QT1JUID0gNjVfNTM1O1xuXG4vKiogQm9vbGVhbiBlbnZpcm9ubWVudCBvdmVycmlkZSBmb3Ige0BsaW5rIGlzRGF0YWJyaWNrc0FwcEVudn0uICovXG5leHBvcnQgY29uc3QgREFUQUJSSUNLU19BUFBfRU5WX0tFWSA9IFwiREJYX1RPT0xTX0RBVEFCUklDS1NfQVBQX0VOVlwiO1xuXG4vKiogQm9vbGVhbiBlbnZpcm9ubWVudCBvdmVycmlkZSBmb3IgcHJvamVjdCBgLmVudmAgcmVhZHMuICovXG5leHBvcnQgY29uc3QgQ09ORklHX0RPVEVOVl9LRVkgPSBcIkRCWF9UT09MU19DT05GSUdfRE9URU5WXCI7XG5cbi8qKiBCb29sZWFuIGVudmlyb25tZW50IG92ZXJyaWRlIGZvciBEYXRhYnJpY2tzIGJ1bmRsZSByZWFkcy4gKi9cbmV4cG9ydCBjb25zdCBDT05GSUdfQlVORExFX0tFWSA9IFwiREJYX1RPT0xTX0NPTkZJR19CVU5ETEVcIjtcblxuLyoqXG4gKiBUaGUgT1BUSU9OQUwgQXBwS2l0IHBlZXIgd2hvc2UgcHJlc2VuY2UgbWFya3MgdGhpcyBhcyBhIERhdGFicmlja3MgQXBwXG4gKiBwcm9qZWN0LiBIZWxkIGFzIGEgY29uc3RhbnQgc28gdGhlIHJlc29sdmUgcHJvYmUgYW5kIHRoZSBsYXp5IGltcG9ydCBuYW1lIGl0XG4gKiBvbmNlLCBhbmQgc28gbmVpdGhlciBzaXRlIGNhcnJpZXMgYSBsaXRlcmFsIGEgYnVuZGxlciB3b3VsZCB0cnkgdG8gZm9sbG93LlxuICovXG5jb25zdCBBUFBLSVRfTU9EVUxFID0gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcblxuLyoqXG4gKiBUaGUgb25lIHRoaW5nIHRoaXMgbW9kdWxlIG5lZWRzIGZyb20gQXBwS2l0OiB3aGV0aGVyIGEgcmVhbCBleGVjdXRpb24gY29udGV4dFxuICogaXMgYWN0aXZlLiBUeXBlZCBzdHJ1Y3R1cmFsbHkgc28gYW4gT1BUSU9OQUwgcGVlciBuZXZlciBiZWNvbWVzIGEgdHlwZVxuICogZGVwZW5kZW5jeSwgYW5kIGBjbGllbnRgIGlzIGB1bmtub3duYCBiZWNhdXNlIGl0cyBwcmVzZW5jZSBpcyBhbGwgdGhhdCBpcyByZWFkLlxuICovXG50eXBlIEFwcEtpdE1vZHVsZSA9IHtcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCgpOiB7IGNsaWVudD86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogV2hldGhlciBBcHBLaXQncyBleGVjdXRpb24gY29udGV4dCBoYXMgRVZFUiBiZWVuIG9ic2VydmVkLiBMYXRjaGluZyBpcyB0aGVcbiAqIHBvaW50OiBhIGNvbnRleHQgY29uZmlybXMgdGhpcyBwcm9jZXNzIGlzIHRoZSBidW5kbGUncyBhcHAsIGFuZCB0aGF0IGZhY3QgZG9lc1xuICogbm90IHN0b3AgYmVpbmcgdHJ1ZSB3aGVuIGEgbGF0ZXIgbG9va3VwIGhhcHBlbnMgb3V0c2lkZSBhIHJlcXVlc3Qgc2NvcGUuXG4gKi9cbmxldCBhcHBLaXRDb250ZXh0ID0gZmFsc2U7XG5cbi8qKiBGbGF0dGVuZWQgQXBwIGBjb25maWcuZW52YCBwZXIgcGFyc2VkIGJ1bmRsZSAtIHNlZSB7QGxpbmsgYnVuZGxlQXBwfS4gKi9cbmNvbnN0IEJVTkRMRV9BUFBfQ0FDSEUgPSBuZXcgV2Vha01hcDxvYmplY3QsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbi8qKiBFeGFjdCBwcm9jZXNzLWVudmlyb25tZW50IGxvb2t1cCBmb3IgY2FsbGVycyB0aGF0IGRvIG5vdCByZWFkIGxvY2FsIGNvbmZpZyBmaWxlcy4gKi9cbmV4cG9ydCBjb25zdCBFTlZfT05MWSA9IHsgc2NvcGU6IFtdIGFzIGNvbnN0LCBzb3VyY2VzOiBcImVudlwiIGFzIGNvbnN0IH07XG5cbmV4cG9ydCBjb25zdCBidW5kbGVWYWx1ZSA9IHpcbiAgLnN0cmluZygpXG4gIC50cmFuc2Zvcm0oKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlLnRyaW0oKSlcbiAgLnJlZmluZSgodmFsdWU6IHN0cmluZykgPT4gdmFsdWUubGVuZ3RoID4gMClcbiAgLnJlZmluZSgodmFsdWU6IHN0cmluZykgPT4gIS9cXCRcXHtbXn1dK1xcfS8udGVzdCh2YWx1ZSksIHtcbiAgICBtZXNzYWdlOiBcIkludGVycG9sYXRlZCB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkXCIsXG4gIH0pO1xuXG4vKipcbiAqIFRoZSBHRU5FUklDIHNoYXBlIG9mIGEgYnVuZGxlIHJlc291cmNlOiBhIG5hbWUsIGFuZCB3aGF0ZXZlciBlbHNlIHRoZSByZXNvdXJjZVxuICogdHlwZSBjYXJyaWVzLiBEZWxpYmVyYXRlbHkgdW5vcGluaW9uYXRlZCBhbmQgYHBhc3N0aHJvdWdoKClgIC0gdGhlIGNvbmNyZXRlXG4gKiByZXNvdXJjZSBraW5kcyAoYHNxbF93YXJlaG91c2VgLCBgZ2VuaWVfc3BhY2VgLCBgcG9zdGdyZXNgLCAuLi4pIGFyZVxuICogRGF0YWJyaWNrcy1BcHAgY29uY2VwdHMgdGhhdCBiZWxvbmcgdG8gdGhlIHBhY2thZ2UgdGhhdCByZXNvbHZlcyB0aGVtLCBzb1xuICogbm9kZS1hcHBraXQgYC5leHRlbmQoKWBzIHRoaXMgcmF0aGVyIHRoYW4gdGhpcyBtb2R1bGUga25vd2luZyBhYm91dCB0aGVtLlxuICovXG5leHBvcnQgY29uc3QgYnVuZGxlUmVzb3VyY2VTY2hlbWEgPSB6Lm9iamVjdCh7IG5hbWU6IGJ1bmRsZVZhbHVlLm9wdGlvbmFsKCkgfSkucGFzc3Rocm91Z2goKTtcblxuZXhwb3J0IGNvbnN0IGJ1bmRsZUVudkVudHJ5U2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiBidW5kbGVWYWx1ZS5vcHRpb25hbCgpLFxuICB2YWx1ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB2YWx1ZV9mcm9tOiBidW5kbGVWYWx1ZS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBidW5kbGVBcHBTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IGJ1bmRsZVZhbHVlLm9wdGlvbmFsKCksXG4gIHNvdXJjZV9jb2RlX3BhdGg6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgY29uZmlnOiB6Lm9iamVjdCh7IGVudjogei5hcnJheShidW5kbGVFbnZFbnRyeVNjaGVtYSkub3B0aW9uYWwoKSB9KS5vcHRpb25hbCgpLFxuICByZXNvdXJjZXM6IHouYXJyYXkoYnVuZGxlUmVzb3VyY2VTY2hlbWEpLm9wdGlvbmFsKCksXG59KTtcblxuY29uc3QgYnVuZGxlQXBwc1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgcmVzb3VyY2VzOiB6Lm9iamVjdCh7IGFwcHM6IHoucmVjb3JkKHouc3RyaW5nKCksIGJ1bmRsZUFwcFNjaGVtYSkub3B0aW9uYWwoKSB9KS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogRGV0ZWN0IGEgRGF0YWJyaWNrcyBBcHAgcnVudGltZSBmcm9tIGl0cyByZXF1aXJlZCBuYW1lLCBob3N0LCBhbmQgcG9ydC5cbiAqXG4gKiBgREJYX1RPT0xTX0RBVEFCUklDS1NfQVBQX0VOVmAgdGFrZXMgcHJlY2VkZW5jZSB3aGVuIGl0IGNvbnRhaW5zIGEgcmVjb2duaXplZFxuICogYm9vbGVhbiB2YWx1ZS4gVGhpcyBsZXRzIGxvY2FsIHRvb2xzIGVtdWxhdGUgdGhlIGRlcGxveWVkIHJ1bnRpbWUgKGB0cnVlYCkgb3JcbiAqIGxldHMgdW51c3VhbCBkZXBsb3llZCBwcm9jZXNzZXMgcmV0YWluIGxvY2FsIGNvbmZpZyBsb29rdXAgKGBmYWxzZWApLiBBblxuICogYWJzZW50IG9yIHVucmVjb2duaXplZCBvdmVycmlkZSBmYWxscyBiYWNrIHRvIHN0cnVjdHVyYWwgZGV0ZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhYnJpY2tzQXBwRW52KFxuICBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gPSBwcm9jZXNzLmVudixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBvdmVycmlkZSA9IG9iamVjdC50b0Jvb2xlYW4oc291cmNlW0RBVEFCUklDS1NfQVBQX0VOVl9LRVldKTtcbiAgaWYgKG92ZXJyaWRlICE9PSB1bmRlZmluZWQpIHJldHVybiBvdmVycmlkZTtcbiAgY29uc3QgYXBwTmFtZSA9IHNvdXJjZS5EQVRBQlJJQ0tTX0FQUF9OQU1FPy50cmltKCk7XG4gIGNvbnN0IGhvc3QgPSBzb3VyY2UuREFUQUJSSUNLU19IT1NUPy50cmltKCk7XG4gIGNvbnN0IHBvcnQgPSBzb3VyY2UuREFUQUJSSUNLU19BUFBfUE9SVD8udHJpbSgpO1xuICBpZiAoIWFwcE5hbWUgfHwgIWhvc3QgfHwgIXBvcnQpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBpZiAoIVtcImh0dHA6XCIsIFwiaHR0cHM6XCJdLmluY2x1ZGVzKG5ldyBVUkwoaG9zdCkucHJvdG9jb2wpKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwb3J0TnVtYmVyID0gb2JqZWN0LnRvTnVtYmVyKHBvcnQpO1xuICByZXR1cm4gKFxuICAgIHBvcnROdW1iZXIgIT09IHVuZGVmaW5lZCAmJlxuICAgIE51bWJlci5pc0ludGVnZXIocG9ydE51bWJlcikgJiZcbiAgICBwb3J0TnVtYmVyID49IDEgJiZcbiAgICBwb3J0TnVtYmVyIDw9IE1BWF9UQ1BfUE9SVFxuICApO1xufVxuXG4vKiogQ2FuZGlkYXRlIG5hbWVzIGluIHNjb3BlLCBwcmVmaXgsIGFuZCBpbnB1dCBwcmVjZWRlbmNlIG9yZGVyLiAqL1xuZnVuY3Rpb24ga2V5cyhpbnB1dDogQ29uZmlnS2V5LCBvcHRpb25zOiBQaWNrPENvbmZpZ09wdGlvbnMsIFwic2NvcGVcIiB8IFwicHJlZml4XCI+ID0ge30pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNjb3BlcyA9IG9iamVjdC5zZXF1ZW5jZShvcHRpb25zLnNjb3BlID8/IERFRkFVTFRfU0NPUEUpLnRvQXJyYXkoKTtcbiAgY29uc3QgcHJlZml4ZXMgPSBvcHRpb25zLnByZWZpeCA9PT0gdW5kZWZpbmVkID8gW10gOiBvYmplY3Quc2VxdWVuY2Uob3B0aW9ucy5wcmVmaXgpLnRvQXJyYXkoKTtcbiAgcmV0dXJuIFtcbiAgICAuLi5vYmplY3RcbiAgICAgIC5zZXF1ZW5jZShpbnB1dClcbiAgICAgIC5mbGF0TWFwKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgcHJlZml4ZWQgPSBwcmVmaXhlcy5sZW5ndGggPiAwID8gcHJlZml4ZXMubWFwKChwcmVmaXgpID0+IGpvaW4ocHJlZml4LCBrZXkpKSA6IFtrZXldO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIC4uLnNjb3Blcy5mbGF0TWFwKChzY29wZSkgPT4gcHJlZml4ZWQubWFwKChrZXkpID0+IGpvaW4oc2NvcGUsIGtleSkpKSxcbiAgICAgICAgICAuLi5wcmVmaXhlZCxcbiAgICAgICAgICBrZXksXG4gICAgICAgIF07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkubGVuZ3RoID4gMClcbiAgICAgIC5kaXN0aW5jdCgpLFxuICBdO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHZhbHVlIHRoYXQgcmVzb2x2ZXMgZm9yIGBpbnB1dGAsIGluIHNvdXJjZS10aGVuLWtleSBwcmVjZWRlbmNlIG9yZGVyLFxuICogYXMgYSBMQVpZIHNlcXVlbmNlOiBub3RoaW5nIHBhc3QgdGhlIGZpcnN0IGNvbnN1bWVkIGVsZW1lbnQgaXMgcmVhZCwgc29cbiAqIGB2YWx1ZXMoa2V5KS5maXJzdCgpYCBuZXZlciBzcGF3bnMgdGhlIERhdGFicmlja3MgQ0xJIHdoZW4gdGhlIGVudmlyb25tZW50XG4gKiBhbHJlYWR5IGFuc3dlcmVkLlxuICpcbiAqL1xuZnVuY3Rpb24gdmFsdWVzKGlucHV0OiBDb25maWdLZXksIG9wdGlvbnM6IENvbmZpZ09wdGlvbnMgPSB7fSk6IG9iamVjdC5TZXF1ZW5jZTxDb25maWdWYWx1ZT4ge1xuICBjb25zdCBjYW5kaWRhdGVzID0ga2V5cyhpbnB1dCwgb3B0aW9ucyk7XG4gIGNvbnN0IHNvdXJjZXMgPSBvYmplY3Quc2VxdWVuY2U8Q29uZmlnU291cmNlPihvcHRpb25zLnNvdXJjZXMgPz8gREVGQVVMVF9TT1VSQ0VTKTtcbiAgcmV0dXJuIG9iamVjdC5zZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEdlbmVyYXRvcjxDb25maWdWYWx1ZT4ge1xuICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICBmb3IgKGNvbnN0IG1hcCBvZiByZWFkKHNvdXJjZSwgb3B0aW9ucy5jd2QpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBzdHJpbmdNb2R1bGUudHJpbVRvTnVsbChtYXBba2V5XSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHlpZWxkIHsga2V5LCBzb3VyY2UsIHZhbHVlIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIGZpcnN0IHZhbHVlIHRoYXQgcmVzb2x2ZXMgZm9yIGBpbnB1dGAsIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBkb21haW4gPSBjb25maWcudGV4dChbXCJUVU5ORUxfUFVCTElDX0RPTUFJTlwiLCBcIlBVQkxJQ19ET01BSU5cIl0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGV4dChpbnB1dDogQ29uZmlnS2V5LCBvcHRpb25zOiBDb25maWdPcHRpb25zID0ge30pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWVzKGlucHV0LCBvcHRpb25zKS5hdCgwKT8udmFsdWU7XG59XG5cbi8qKlxuICogVGhlIFBSSU1BUlkgKGZ1bGx5LXNjb3BlZCkgbmFtZSBmb3IgYGlucHV0YCAtIHdoYXQgdG8gcHJpbnQgaW4gYSBsb2cgbGluZSBvciBhblxuICogZXJyb3IsIHNvIHRoZSBtZXNzYWdlIG5hbWVzIHRoZSB2YXJpYWJsZSBhIHJlYWRlciBzaG91bGQgc2V0LiBEbyBub3QgaW5kZXhcbiAqIGBrZXlzKC4uLilbMF1gIGZvciB0aGlzIGlmIGBpbnB1dGAgbWF5IGJlIGEgYmFyZSBzdHJpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxvZ2dlci53YXJuKGAke2NvbmZpZy5uYW1lKEpXVF9TRUNSRVRfRU5WKX0gaXMgbm90IHNldGApO1xuICovXG5leHBvcnQgZnVuY3Rpb24gbmFtZShcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgb3B0aW9uczogUGljazxDb25maWdPcHRpb25zLCBcInNjb3BlXCIgfCBcInByZWZpeFwiPiA9IHt9LFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGtleXMoaW5wdXQsIG9wdGlvbnMpWzBdID8/IFwiXCI7XG59XG5cbi8qKlxuICogU2FmZSBgLmVudi48bmFtZT5gIHN1ZmZpeGVzIGZvciBhIE5vZGUgZW52aXJvbm1lbnQsIGV4YWN0IHNwZWxsaW5nIGZpcnN0LlxuICogS25vd24gbG9uZyBhbmQgc2hvcnQgbmFtZXMgYXJlIGludGVyY2hhbmdlYWJsZTsgdW5rbm93biBuYW1lcyBwYXNzIHRocm91Z2guXG4gKi9cbmZ1bmN0aW9uIG5vZGVFbnZOYW1lcyhub2RlRW52OiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBuYW1lID0gc3RyaW5nTW9kdWxlLnRyaW1Ub051bGwobm9kZUVudik/LnRvTG93ZXJDYXNlKCk7XG4gIGlmICghbmFtZSB8fCAhL15bYS16MC05Xy1dKyQvLnRlc3QobmFtZSkpIHJldHVybiBbXTtcbiAgZm9yIChjb25zdCBbY2Fub25pY2FsLCBhbHRlcm5hdGl2ZXNdIG9mIE9iamVjdC5lbnRyaWVzKE5PREVfRU5WX0FMVEVSTkFUSVZFUykpIHtcbiAgICBjb25zdCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10gPSBhbHRlcm5hdGl2ZXM7XG4gICAgaWYgKG5hbWUgPT09IGNhbm9uaWNhbCB8fCBuYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIFsuLi5vYmplY3Quc2VxdWVuY2UobmFtZSwgY2Fub25pY2FsLCBhbHRlcm5hdGl2ZXMpLmRpc3RpbmN0KCldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW25hbWVdO1xufVxuXG5mdW5jdGlvbiBqb2luKC4uLnBhcnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwYXJ0c1xuICAgIC5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuam9pbihcIl9cIik7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHN0cmluZzogYGNvbmZpZ3VyZWRgIHdoZW4gbm9uLWVtcHR5LCBlbHNlIHtAbGluayB0ZXh0fSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqXG4gKiBUaGUgY29lcmNpb24gcnVsZXMgYXJlIGRlbGliZXJhdGVseSBsb29zZSAoYG9uYCAvIGB5ZXNgIC8gYDFgIGFyZSBhbGxcbiAqIGB0cnVlYCkgYmVjYXVzZSB2YWx1ZXMgbWF5IGNvbWUgZnJvbSBhIGZpbGUgYSBodW1hbiB0eXBlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uZmlnLnN0cmluZyhvcHRpb25zLmhvc3QsIFwiU01UUF9IT1NUXCIpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nKFxuICBjb25maWd1cmVkOiB1bmtub3duLFxuICBpbnB1dDogQ29uZmlnS2V5LFxuICBvcHRpb25zPzogQ29uZmlnT3B0aW9ucyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzdHJpbmdNb2R1bGUudHJpbVRvTnVsbChjb25maWd1cmVkKSA/PyB0ZXh0KGlucHV0LCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgYm9vbGVhbiB0aHJvdWdoIGBvYmplY3QudG9Cb29sZWFuYC4gYHVuZGVmaW5lZGAgd2hlbiBuZWl0aGVyIHNvdXJjZVxuICogaXMgaW50ZXJwcmV0YWJsZSwgc28gdGhlIGNhbGxlciBwaWNrcyBhIGRlZmF1bHQgd2l0aCBgPz9gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhbihcbiAgY29uZmlndXJlZDogdW5rbm93bixcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgb3B0aW9ucz86IENvbmZpZ09wdGlvbnMsXG4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIG9iamVjdC50b0Jvb2xlYW4oY29uZmlndXJlZCkgPz8gb2JqZWN0LnRvQm9vbGVhbih0ZXh0KGlucHV0LCBvcHRpb25zKSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHBvc2l0aXZlIG51bWJlciB0aGF0IG1heSBiZSBmcmFjdGlvbmFsIChhIHNjb3JlIHRocmVzaG9sZCwgYSByYXRpbykuXG4gKiBVc2Uge0BsaW5rIHBvc2l0aXZlSW50fSBmb3IgYSBjb3VudCwgcG9ydCwgb3IgdGltZW91dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aXZlTnVtYmVyKFxuICBjb25maWd1cmVkOiB1bmtub3duLFxuICBpbnB1dDogQ29uZmlnS2V5LFxuICBmYWxsYmFjazogbnVtYmVyLFxuICBvcHRpb25zPzogQ29uZmlnT3B0aW9ucyxcbik6IG51bWJlciB7XG4gIHJldHVybiB0b1Bvc2l0aXZlTnVtYmVyKGNvbmZpZ3VyZWQpID8/IHRvUG9zaXRpdmVOdW1iZXIodGV4dChpbnB1dCwgb3B0aW9ucykpID8/IGZhbGxiYWNrO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIChhIHBvcnQsIGEgdGltZW91dCwgYSBwYWdlIHNpemUpLCBmbG9vcmVkLiBBXG4gKiBub24tbnVtZXJpYyBvciBub24tcG9zaXRpdmUgdmFsdWUgaXMgdHJlYXRlZCBhcyBBQlNFTlQgcmF0aGVyIHRoYW4gZmF0YWwgLVxuICogdGhlc2UgYXJlIGNlaWxpbmdzIHdoZXJlIGEgc2FuZSBkZWZhdWx0IGJlYXRzIGEgYm9vdCBmYWlsdXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpdmVJbnQoXG4gIGNvbmZpZ3VyZWQ6IHVua25vd24sXG4gIGlucHV0OiBDb25maWdLZXksXG4gIGZhbGxiYWNrOiBudW1iZXIsXG4gIG9wdGlvbnM/OiBDb25maWdPcHRpb25zLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwb3NpdGl2ZU51bWJlcihjb25maWd1cmVkLCBpbnB1dCwgZmFsbGJhY2ssIG9wdGlvbnMpO1xuICByZXR1cm4gTWF0aC5mbG9vcihyZXNvbHZlZCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGxpc3QgdGhyb3VnaCBgc3RyaW5nLnBhcnNlTGlzdGAsIHNvIGFuIGFycmF5IGZyb20gdHlwZWQgY29uZmlnIGFuZCBhXG4gKiBgXCJhLCBiIGNcImAgc3RyaW5nIG5vcm1hbGl6ZSBpZGVudGljYWxseS4gYFtdYCB3aGVuIG5laXRoZXIgc291cmNlIGhhcyBlbnRyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdChcbiAgY29uZmlndXJlZDogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBudWxsLFxuICBpbnB1dDogQ29uZmlnS2V5LFxuICB0cmFuc2Zvcm0/OiAoZW50cnk6IHN0cmluZykgPT4gc3RyaW5nLFxuICBvcHRpb25zPzogQ29uZmlnT3B0aW9ucyxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZnJvbUNvbmZpZyA9IHN0cmluZ01vZHVsZS5wYXJzZUxpc3QoY29uZmlndXJlZCwgdHJhbnNmb3JtKTtcbiAgcmV0dXJuIGZyb21Db25maWcubGVuZ3RoID4gMFxuICAgID8gZnJvbUNvbmZpZ1xuICAgIDogc3RyaW5nTW9kdWxlLnBhcnNlTGlzdCh0ZXh0KGlucHV0LCBvcHRpb25zKSwgdHJhbnNmb3JtKTtcbn1cblxuZnVuY3Rpb24gdG9Qb3NpdGl2ZU51bWJlcih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZCA9IG9iamVjdC50b051bWJlcih2YWx1ZSk7XG4gIHJldHVybiBwYXJzZWQgIT09IHVuZGVmaW5lZCAmJiBwYXJzZWQgPiAwID8gcGFyc2VkIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBEYXRhYnJpY2tzIGJ1bmRsZSBvdXRwdXQgZm9yIGBjd2RgIC0gYGRhdGFicmlja3MgYnVuZGxlIHZhbGlkYXRlIC0tb3V0cHV0XG4gKiBqc29uYCBydW4gZnJvbSB0aGUgZGlyZWN0b3J5IGhvbGRpbmcgYGRhdGFicmlja3MueW1sYCwgd2l0aCB0aGUgY29uZmlnIGZpbGUnc1xuICogcGF0aC4gQSBub24temVybyB2YWxpZGF0aW9uIG1heSBzdGlsbCByZXR1cm4gcGFydGlhbCBKU09OIHdpdGggdXNhYmxlIEFwcFxuICogY29uZmlnLiBgdW5kZWZpbmVkYCB3aGVuIGJ1bmRsZSByZWFkcyBhcmUgZGlzYWJsZWQsIHRoaXMgaXMgbm90IGFuIEFwcEtpdFxuICogcHJvamVjdCwgdGhlIGJ1bmRsZSBkb2VzIG5vdCBkZXNjcmliZSBleGFjdGx5IG9uZSBhcHAgd2l0aCBgY29uZmlnLmVudmAsIHRoZXJlXG4gKiBpcyBubyBidW5kbGUsIG9yIHRoZSBDTEkgcHJvZHVjZXMgbm8gSlNPTi5cbiAqXG4gKiBUaGUgc3Bhd24gaXMgZ3VhcmRlZCBiZWNhdXNlIGl0IGlzIGV4cGVuc2l2ZSBhbmQgdXN1YWxseSBwb2ludGxlc3MuIEluIG9yZGVyOlxuICogYEBkYXRhYnJpY2tzL2FwcGtpdGAgbXVzdCBiZSBSRVNPTFZBQkxFIChubyBBcHBLaXQsIG5vIGJ1bmRsZSAtIGFuZCB0aGUgcHJvYmVcbiAqIG5ldmVyIGV2YWx1YXRlcyB0aGUgbW9kdWxlKTsgdGhlIGJ1bmRsZSBtdXN0IGRlc2NyaWJlIGV4YWN0bHkgT05FIGFwcCBjYXJyeWluZ1xuICogYGNvbmZpZy5lbnZgOyBhbmQgQXBwS2l0J3MgZXhlY3V0aW9uIGNvbnRleHQgbXVzdCBjb25maXJtIHRoaXMgcHJvY2VzcyBpcyB0aGF0XG4gKiBhcHAuIE9ubHkgdGhlIGNvbmZpcm1hdGlvbiBpcyByZW1lbWJlcmVkLCBzbyBhIGxvb2t1cCBkdXJpbmcgYm9vdCAtIGJlZm9yZSBhbnlcbiAqIGNvbnRleHQgZXhpc3RzIC0gc3RpbGwgcmVzb2x2ZXMgZnJvbSB0aGUgYnVuZGxlIGFuZCByZS1jb25maXJtcyBsYXRlci5cbiAqXG4gKiBDYWNoZWQgb25jZSBwZXIgcmVzb2x2ZWQgd29ya2luZy1kaXJlY3RvcnkgY29udGV4dCBhbmRcbiAqIGBEQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFYCB0aHJvdWdoIHtAbGluayBjb250ZXh0LmNhY2hlZH0sIHNvIHJlcGVhdGVkXG4gKiBsb29rdXBzIGRvIG5vdCByZXJ1biB2YWxpZGF0aW9uIGFuZCBjaGFuZ2luZyBlaXRoZXIgY2Fubm90IHJldHVybiBhbm90aGVyXG4gKiBjb250ZXh0J3MgYnVuZGxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVuZGxlRmlsZShjd2Q/OiBzdHJpbmcgfCBudWxsKTogQ29uZmlnRmlsZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2R1Y3Rpb24gPSBwcm9jZXNzLmVudi5OT0RFX0VOVj8udHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvZHVjdGlvblwiO1xuICBjb25zdCBvdmVycmlkZSA9IG9iamVjdC50b0Jvb2xlYW4ocHJvY2Vzcy5lbnZbQ09ORklHX0JVTkRMRV9LRVldKTtcbiAgaWYgKG92ZXJyaWRlID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gQW4gZXhwbGljaXQgYHRydWVgIGlzIHRoZSBlc2NhcGUgaGF0Y2ggZm9yIGEgdG9vbCB0aGF0IHdhbnRzIHRoZSBidW5kbGVcbiAgLy8gd2l0aG91dCBiZWluZyB0aGUgYXBwIChgZGJ4YCBjb21tYW5kcywgdGVzdHMpLCBzbyBpdCBza2lwcyB0aGUgQXBwS2l0IGdhdGVcbiAgLy8gZW50aXJlbHkgLSBidXQgbm90IHRoZSBBcHAvcHJvZHVjdGlvbiBkZWZhdWx0cywgd2hpY2ggaXQgYWxzbyBvdmVycmlkZXMuXG4gIGlmIChvdmVycmlkZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHByb2R1Y3Rpb24gfHwgaXNEYXRhYnJpY2tzQXBwRW52KCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcHBLaXRJbnN0YWxsZWQoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBwcm9maWxlID0gc3RyaW5nTW9kdWxlLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19DT05GSUdfUFJPRklMRSk7XG4gIGNvbnN0IGZpbGUgPSBjYWNoZWRDb25maWcoW1wiYnVuZGxlXCIsIHByb2ZpbGUgPz8gXCJcIl0sIGN3ZCwgKHJlc29sdmVkKSA9PlxuICAgIGxvYWRCdW5kbGVGaWxlKHJlc29sdmVkLCBwcm9maWxlKSxcbiAgKTtcbiAgaWYgKG92ZXJyaWRlICE9PSB1bmRlZmluZWQgfHwgZmlsZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmlsZTtcbiAgLy8gQWxyZWFkeSBjb25maXJtZWQ6IHRoaXMgcHJvY2VzcyBpcyB0aGUgYXBwLCBhbmQgdGhhdCBkb2VzIG5vdCBzdG9wIGJlaW5nXG4gIC8vIHRydWUsIHNvIHNraXAgcmUtZGVyaXZpbmcgdGhlIGdhdGUgb24gZXZlcnkgbG9va3VwLlxuICBpZiAoYXBwS2l0Q29udGV4dCkgcmV0dXJuIGZpbGU7XG4gIC8vIFRoZSBhcHAgbXVzdCBiZSB1bmFtYmlndW91cy4gYGJ1bmRsZUFwcGAgaXMgd2hhdCBkZWNpZGVzIFwiZXhhY3RseSBvbmUgYXBwXG4gIC8vIHdpdGggYGNvbmZpZy5lbnZgXCIsIHNvIGFuIGVtcHR5IG1hcCBJUyB0aGUgYW1iaWd1b3VzIG9yIGFwcC1sZXNzIGJ1bmRsZSBhbmRcbiAgLy8gbmVlZHMgbm8gc2VwYXJhdGUgY2hlY2suXG4gIGlmIChPYmplY3Qua2V5cyhidW5kbGVBcHAoZmlsZS5kYXRhKSkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25maXJtQXBwS2l0Q29udGV4dCgpO1xuICByZXR1cm4gZmlsZTtcbn1cblxuLyoqXG4gKiBUaGUgc2luZ2xlIEFwcCdzIGxpdGVyYWwgYGNvbmZpZy5lbnZgIGVudHJpZXMsIGZsYXR0ZW5lZCB0byBgbmFtZSAtPiB2YWx1ZWAuXG4gKlxuICogQSBgdmFsdWVfZnJvbWAgZW50cnkgbmFtZXMgYSBidW5kbGUgcmVzb3VyY2Ugd2hvc2UgaWQgaXMga25vd24gYWZ0ZXJcbiAqIGRlcGxveW1lbnQsIGFuZCByZWFkaW5nIGl0IG5lZWRzIHRoZSByZXNvdXJjZSB2b2NhYnVsYXJ5IHRoaXMgbW9kdWxlXG4gKiBkZWxpYmVyYXRlbHkgZG9lcyBub3QgaGF2ZSAtIG5vZGUtYXBwa2l0IHJlc29sdmVzIHRob3NlIGFnYWluc3QgaXRzIGV4dGVuZGVkXG4gKiB7QGxpbmsgYnVuZGxlUmVzb3VyY2VTY2hlbWF9LiBBbiBgYXBwc2AgYmxvY2sgd2l0aCBtb3JlIHRoYW4gb25lIGFwcCBpc1xuICogYW1iaWd1b3VzIChub3RoaW5nIGhlcmUgc2F5cyB3aGljaCBhcHAgdGhpcyBwcm9jZXNzIGlzKSwgc28gaXQgeWllbGRzIG5vdGhpbmdcbiAqIHJhdGhlciB0aGFuIGEgZ3Vlc3MuXG4gKlxuICogTWVtb2l6ZWQgYWdhaW5zdCB0aGUgcGFyc2VkIGJ1bmRsZSBpdCBjYW1lIGZyb20sIGJlY2F1c2UgYm90aCB0aGUgZ2F0ZSBpblxuICoge0BsaW5rIGJ1bmRsZUZpbGV9IGFuZCB0aGUgbG9va3VwIGluIHtAbGluayByZWFkfSBhc2sgdGhlIHNhbWUgcXVlc3Rpb24gb2YgdGhlXG4gKiBzYW1lIGNhY2hlZCBvYmplY3QgLSB2YWxpZGF0aW5nIHRoYXQgcGF5bG9hZCB0d2ljZSBwZXIgbG9va3VwIHdvdWxkIGJlIHB1cmVcbiAqIHdhc3RlLiBBIGBXZWFrTWFwYCBrZWVwcyB0aGUgZW50cnkgYWxpdmUgZXhhY3RseSBhcyBsb25nIGFzIHRoZSBidW5kbGUgaXMuXG4gKi9cbmZ1bmN0aW9uIGJ1bmRsZUFwcChpbnB1dDogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChpbnB1dCkpIHJldHVybiBidW5kbGVBcHBFbnRyaWVzKGlucHV0KTtcbiAgY29uc3QgY2FjaGVkID0gQlVORExFX0FQUF9DQUNIRS5nZXQoaW5wdXQpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICBjb25zdCByZXN1bHQgPSBidW5kbGVBcHBFbnRyaWVzKGlucHV0KTtcbiAgQlVORExFX0FQUF9DQUNIRS5zZXQoaW5wdXQsIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiB7QGxpbmsgYnVuZGxlQXBwfSB3aXRob3V0IHRoZSBtZW1vaXphdGlvbiwgc28gdGhlIGNhY2hlIGhhcyBvbmUgZmlsbGVyLiAqL1xuZnVuY3Rpb24gYnVuZGxlQXBwRW50cmllcyhpbnB1dDogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBwYXJzZWQgPSBidW5kbGVBcHBzU2NoZW1hLnNhZmVQYXJzZShpbnB1dCk7XG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHJldHVybiB7fTtcbiAgY29uc3QgYXBwcyA9IHBhcnNlZC5kYXRhLnJlc291cmNlcz8uYXBwcztcbiAgaWYgKCFhcHBzKSByZXR1cm4ge307XG4gIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoYXBwcyk7XG4gIGlmIChuYW1lcy5sZW5ndGggIT09IDEpIHJldHVybiB7fTtcbiAgY29uc3QgZW50cmllcyA9IGFwcHNbbmFtZXNbMF0hXT8uY29uZmlnPy5lbnYgPz8gW107XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBpZiAoIWVudHJ5Lm5hbWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZhbHVlID0gcmVzb2x2ZWRTdHJpbmcoZW50cnkudmFsdWUpO1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkgcmVzdWx0W2VudHJ5Lm5hbWVdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBAZGF0YWJyaWNrcy9hcHBraXRgIGNhbiBiZSBSRVNPTFZFRCBmcm9tIHRoaXMgcHJvY2VzcywgY2FjaGVkIGZvciBpdHNcbiAqIGxpZmV0aW1lLlxuICpcbiAqIFJlc29sdXRpb24sIG5vdCBpbXBvcnQ6IHRoaXMgYW5zd2VycyBcImlzIHRoaXMgYW4gQXBwS2l0IHByb2plY3RcIiB3aXRob3V0XG4gKiBldmFsdWF0aW5nIHRoZSBtb2R1bGUsIHNvIHRoZSBjaGVhcCBuZWdhdGl2ZSAoYSBwbGFpbiBsaWJyYXJ5IG9yIENMSSBjb25zdW1lclxuICogdGhhdCBuZXZlciBpbnN0YWxsZWQgdGhlIG9wdGlvbmFsIHBlZXIpIGNvc3RzIG9uZSBwYXRoIGxvb2t1cCBhbmQgbmV2ZXIgYm9vdHNcbiAqIEFwcEtpdCBhcyBhIHNpZGUgZWZmZWN0IG9mIHJlYWRpbmcgY29uZmlnLiBBIHJ1bnRpbWUgd2l0aCBubyBgY3JlYXRlUmVxdWlyZWBcbiAqIChhIGJyb3dzZXIgYnVuZGxlIHRoYXQgcmVhY2hlZCB0aGlzIE5vZGUtb25seSBtb2R1bGUgYW55d2F5KSByZXBvcnRzIGFic2VudC5cbiAqL1xuY29uc3QgYXBwS2l0SW5zdGFsbGVkID0gZnVuY3Rpb25Nb2R1bGUubWVtb2l6ZSgoKTogYm9vbGVhbiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gSW5kaXJlY3Qgc3BlY2lmaWVyOiBhIGJ1bmRsZXIgbXVzdCBub3QgdHJ5IHRvIGZvbGxvdyBhbiBPUFRJT05BTCBwZWVyIHRoYXRcbiAgICAvLyBhIGJyb3dzZXIgYnVpbGQgaGFzIG5vIHdheSB0byByZXNvbHZlLlxuICAgIGNvbnN0IHNwZWNpZmllciA9IEFQUEtJVF9NT0RVTEU7XG4gICAgY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpLnJlc29sdmUoc3BlY2lmaWVyKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59KTtcblxuLyoqXG4gKiBBcHBLaXQncyBleGVjdXRpb24gY29udGV4dCBvbmNlIGl0IGV4aXN0cywgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogTGF6aWx5IGltcG9ydGVkIChhbmQgYEB2aXRlLWlnbm9yZWBkKSBiZWNhdXNlIGBAZGF0YWJyaWNrcy9hcHBraXRgIGlzIGFuXG4gKiBPUFRJT05BTCBwZWVyIHRoaXMgbW9kdWxlIG11c3QgbmV2ZXIgbWFrZSByZXF1aXJlZC4gVGhlIGltcG9ydCBpcyBvbmx5XG4gKiBhdHRlbXB0ZWQgb25jZSB7QGxpbmsgYXBwS2l0SW5zdGFsbGVkfSBzYXlzIHRoZXJlIGlzIHNvbWV0aGluZyB0byBpbXBvcnQsIGFuZCBhXG4gKiBmYWlsdXJlIHJlc29sdmVzIHRvIGB1bmRlZmluZWRgIHJhdGhlciB0aGFuIHJlamVjdGluZyAtIGEgbWlzc2luZyBwZWVyIGlzIHRoZVxuICogZXhwZWN0ZWQgcGF0aCwgbm90IGFuIGVycm9yLlxuICpcbiAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIFRIUk9XUyB1bnRpbCBBcHBLaXQgaGFzIGJvb3RlZCwgc28gdGhlIGNhbGwgaXMgY2F1Z2h0XG4gKiBhbmQgb25seSBhIHJlYWwgY29udGV4dCBpcyByZXBvcnRlZC4gVGhlIG1vZHVsZSBoYW5kbGUgaXMgbWVtb2l6ZWQ7IHRoZVxuICogY29udGV4dCBsb29rdXAgaXMgbm90LCBzbyBhIGNhbGwgYmVmb3JlIGJvb3QgYW5zd2VycyBcIm5vdCB5ZXRcIiBhbmQgYSBsYXRlciBvbmVcbiAqIHN0aWxsIHNlZXMgdGhlIGNvbnRleHQuXG4gKi9cbmNvbnN0IGFwcEtpdE1vZHVsZSA9IGZ1bmN0aW9uTW9kdWxlLm1lbW9pemUoYXN5bmMgKCk6IFByb21pc2U8QXBwS2l0TW9kdWxlIHwgdW5kZWZpbmVkPiA9PiB7XG4gIGlmICghYXBwS2l0SW5zdGFsbGVkKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNwZWNpZmllciA9IEFQUEtJVF9NT0RVTEU7XG4gIHJldHVybiAoYXdhaXQgaW1wb3J0KC8qIEB2aXRlLWlnbm9yZSAqLyBzcGVjaWZpZXIpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpIGFzXG4gICAgQXBwS2l0TW9kdWxlIHwgdW5kZWZpbmVkO1xufSk7XG5cbi8qKlxuICogTGF0Y2gge0BsaW5rIGFwcEtpdENvbnRleHR9IG9uY2UgQXBwS2l0J3MgZXhlY3V0aW9uIGNvbnRleHQgZXhpc3RzLlxuICpcbiAqIEZpcmUtYW5kLWZvcmdldCwgYmVjYXVzZSB0aGUgY2FsbGVyIGlzIGEgU1lOQ0hST05PVVMgbG9va3VwIGFuZCB0aGUgY2hlY2tcbiAqIG5lZWRzIGEgbGF6eSBpbXBvcnQuIFRoZSBhZmZpcm1hdGl2ZSBpcyBhbGwgdGhhdCBpcyBzdG9yZWQ6IEFwcEtpdCdzIGNvbnRleHRcbiAqIGRvZXMgbm90IGV4aXN0IHVudGlsIGl0IGJvb3RzLCBhbmQgYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgdGhyb3dzIHVudGlsIHRoZW4sXG4gKiBzbyByZW1lbWJlcmluZyBhIG5lZ2F0aXZlIHdvdWxkIHBlcm1hbmVudGx5IGRpc2FibGUgdGhlIGJ1bmRsZSBmb3IgYSBwcm9jZXNzXG4gKiB0aGF0IGlzIHNlY29uZHMgYXdheSBmcm9tIGhhdmluZyBvbmUuIEV2ZXJ5IGNhbGwgYmVmb3JlIHRoZSBsYXRjaCBjbG9zZXNcbiAqIHJlLWF0dGVtcHRzLCB3aGljaCBpcyB3aGF0IG1ha2VzIFwibm90IGF2YWlsYWJsZSB5ZXRcIiByZXRyeSByYXRoZXIgdGhhbiBzdGljay5cbiAqL1xuZnVuY3Rpb24gY29uZmlybUFwcEtpdENvbnRleHQoKTogdm9pZCB7XG4gIHZvaWQgYXBwS2l0TW9kdWxlKClcbiAgICAudGhlbigoYXBwa2l0KSA9PiB7XG4gICAgICBpZiAoIWFwcGtpdCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGFwcGtpdC5nZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudCkgYXBwS2l0Q29udGV4dCA9IHRydWU7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQXBwS2l0IGhhcyBub3QgYm9vdGVkIHlldDsgYSBsYXRlciBjYWxsIHJlLWNoZWNrcy5cbiAgICAgIH1cbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xufVxuXG4vKiogQSBub24tZW1wdHkgYnVuZGxlIHZhbHVlIHdpdGggZXZlcnkgYCR7Li4ufWAgaW50ZXJwb2xhdGlvbiByZXNvbHZlZC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVkU3RyaW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHBhcnNlZCA9IGJ1bmRsZVZhbHVlLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIHJldHVybiBwYXJzZWQuc3VjY2VzcyA/IHBhcnNlZC5kYXRhIDogbnVsbDtcbn1cblxuLyoqIFBhcnNlZCBgLmVudmAgZm9yIGBjd2RgLCBvciBge31gLiBSZWFkIG9uY2UgcGVyIHJlc29sdmVkIGNvbnRleHQuICovXG5mdW5jdGlvbiBkb3RlbnYoY3dkPzogc3RyaW5nIHwgbnVsbCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoIWZpbGVTb3VyY2VFbmFibGVkKENPTkZJR19ET1RFTlZfS0VZKSkgcmV0dXJuIHt9O1xuICBjb25zdCBlbnZpcm9ubWVudHMgPSBub2RlRW52TmFtZXMocHJvY2Vzcy5lbnYuTk9ERV9FTlYpO1xuICByZXR1cm4gY2FjaGVkQ29uZmlnKFtcImRvdGVudlwiLCAuLi5lbnZpcm9ubWVudHNdLCBjd2QsIChyZXNvbHZlZCkgPT5cbiAgICBsb2FkRG90ZW52KHJlc29sdmVkLCBlbnZpcm9ubWVudHMpLFxuICApO1xufVxuXG4vKiogQ2FjaGUgZXZlcnkgdGFyZ2V0IGRpcmVjdG9yeSBzZXBhcmF0ZWx5IHdpdGhpbiB0aGUgYWN0aXZlIHByb2Nlc3MgY29udGV4dC4gKi9cbmZ1bmN0aW9uIGNhY2hlZENvbmZpZzxUPihcbiAgbmFtZTogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGN3ZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbG9hZGVyOiAocmVzb2x2ZWQ6IHN0cmluZykgPT4gVCxcbik6IFQge1xuICBjb25zdCBhY3RpdmUgPSBjb250ZXh0LmdldENvbnRleHQoKSA/PyBcIlwiO1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmUoY3dkID8/IFwiLlwiKTtcbiAgcmV0dXJuIGNvbnRleHQuY2FjaGVkKFtcImNvbmZpZ1wiLCBhY3RpdmUsIHJlc29sdmVkLCAuLi5uYW1lXSwgKCkgPT4gbG9hZGVyKHJlc29sdmVkKSk7XG59XG5cbi8qKlxuICogTWFwcyBmb3Igb25lIHNvdXJjZSBpbiBwcmVjZWRlbmNlIG9yZGVyLiBCdW5kbGUgQXBwIGNvbmZpZyBhbmQgcm9vdCB2YXJpYWJsZXNcbiAqIHN0YXkgc2VwYXJhdGUgc28gYSBmaXJzdC1tYXRjaCBsb29rdXAgZG9lcyBub3QgcGFyc2UgdmFyaWFibGVzIGFmdGVyIGFuIEFwcFxuICogdmFsdWUgcmVzb2x2ZXMuXG4gKi9cbmZ1bmN0aW9uIHJlYWQoXG4gIHNvdXJjZTogQ29uZmlnU291cmNlLFxuICBjd2Q/OiBzdHJpbmcsXG4pOiBvYmplY3QuU2VxdWVuY2U8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj4ge1xuICByZXR1cm4gb2JqZWN0LnNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogR2VuZXJhdG9yPFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+IHtcbiAgICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgIGNhc2UgXCJlbnZcIjpcbiAgICAgICAgICB5aWVsZCBwcm9jZXNzLmVudjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRvdGVudlwiOlxuICAgICAgICAgIHlpZWxkIGRvdGVudihjd2QpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYnVuZGxlXCI6IHtcbiAgICAgICAgICBjb25zdCBidW5kbGUgPSBidW5kbGVGaWxlKGN3ZCk7XG4gICAgICAgICAgaWYgKGJ1bmRsZSkgeWllbGQgYnVuZGxlQXBwKGJ1bmRsZS5kYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIExvY2F0ZSBgbmFtZXNgIGZyb20gYGN3ZGAgb3V0d2FyZC4gYGN3ZGAgaXRzZWxmIGlzIGNoZWNrZWQgYmVmb3JlIHRoZVxuICogZGlzY292ZXJlZCBwcm9qZWN0IHJvb3RzIHNvIGEgcGFja2FnZS1sb2NhbCBmaWxlIHdpbnMgb3ZlciB0aGUgd29ya3NwYWNlJ3MuXG4gKi9cbmZ1bmN0aW9uIGZpbmRDb25maWdGaWxlKGN3ZDogc3RyaW5nLCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzdGFydCA9IHJlc29sdmUoY3dkKTtcbiAgY29uc3Qgcm9vdCA9IHJlc29sdmVQcm9qZWN0Um9vdChzdGFydCk7XG4gIGNvbnN0IHBhdGhGcm9tUm9vdCA9IHJvb3QgPyByZWxhdGl2ZShyb290LCBzdGFydCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJvdW5kYXJ5ID1cbiAgICByb290ICYmXG4gICAgcGF0aEZyb21Sb290ICE9PSB1bmRlZmluZWQgJiZcbiAgICAhaXNBYnNvbHV0ZShwYXRoRnJvbVJvb3QpICYmXG4gICAgcGF0aEZyb21Sb290ICE9PSBcIi4uXCIgJiZcbiAgICAhcGF0aEZyb21Sb290LnN0YXJ0c1dpdGgoYC4uJHtzZXB9YClcbiAgICAgID8gcm9vdFxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGRpciA9IHN0YXJ0OyA7IGRpciA9IGRpcm5hbWUoZGlyKSkge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUoZGlyLCBuYW1lKTtcbiAgICAgIGlmIChzdGF0U3luYyhwYXRoKT8uaXNGaWxlKCkpIHJldHVybiBwYXRoO1xuICAgIH1cbiAgICBpZiAoYm91bmRhcnkgPT09IHVuZGVmaW5lZCB8fCBkaXIgPT09IGJvdW5kYXJ5KSBicmVhaztcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogQSByZWNvZ25pemVkIHNvdXJjZSBvdmVycmlkZSwgZWxzZSB0aGUgY2FsbGVyJ3MgYXV0b21hdGljIGRlZmF1bHQuICovXG5mdW5jdGlvbiBmaWxlU291cmNlRW5hYmxlZChrZXk6IHN0cmluZywgZmFsbGJhY2s6IGJvb2xlYW4gPSAhaXNEYXRhYnJpY2tzQXBwRW52KCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iamVjdC50b0Jvb2xlYW4ocHJvY2Vzcy5lbnZba2V5XSkgPz8gZmFsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGxvYWREb3RlbnYoXG4gIGN3ZDogc3RyaW5nLFxuICBlbnZpcm9ubWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5hbWVzID0gWy4uLmVudmlyb25tZW50cy5tYXAoKG5hbWUpID0+IGAke0RPVEVOVl9GSUxFX05BTUV9LiR7bmFtZX1gKSwgRE9URU5WX0ZJTEVfTkFNRV07XG4gIGNvbnN0IHBhdGggPSBmaW5kQ29uZmlnRmlsZShjd2QsIG5hbWVzKTtcbiAgaWYgKCFwYXRoKSByZXR1cm4ge307XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlRW52KHJlYWRGaWxlU3luYyhwYXRoLCBcInV0ZjhcIikpO1xuICB9IGNhdGNoIHtcbiAgICBsb2dnZXIud2FybihcImZhaWxlZCB0byByZWFkIGRvdGVudiBmaWxlXCIsIHsgcGF0aCB9KTtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9hZEJ1bmRsZUZpbGUoY3dkOiBzdHJpbmcsIHByb2ZpbGU6IHN0cmluZyB8IG51bGwpOiBDb25maWdGaWxlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGF0aCA9IGZpbmRDb25maWdGaWxlKGN3ZCwgQlVORExFX0ZJTEVfTkFNRVMpO1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgXCJidW5kbGVcIixcbiAgICBcInZhbGlkYXRlXCIsXG4gICAgXCItLW91dHB1dFwiLFxuICAgIFwianNvblwiLFxuICAgIC4uLihwcm9maWxlID09PSBudWxsID8gW10gOiBbXCItLXByb2ZpbGVcIiwgcHJvZmlsZV0pLFxuICBdO1xuICBjb25zdCByZXN1bHQgPSBzcGF3blN5bmMoXCJkYXRhYnJpY2tzXCIsIGFyZ3MsIHtcbiAgICBjd2Q6IHJlc29sdmUocGF0aCwgXCIuLlwiKSxcbiAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICB9KTtcbiAgY29uc3Qgb3V0cHV0ID0gc3RyaW5nTW9kdWxlLnRyaW1Ub051bGwocmVzdWx0LnN0ZG91dCk7XG4gIGNvbnN0IGVycm9yID0gc3RyaW5nTW9kdWxlLnRyaW1Ub051bGwocmVzdWx0LnN0ZGVycik7XG4gIGlmIChvdXRwdXQgPT09IG51bGwpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJidW5kbGUgdmFsaWRhdGUgcHJvZHVjZWQgbm8gSlNPTlwiLCB7IHBhdGgsIHN0YXR1czogcmVzdWx0LnN0YXR1cywgZXJyb3IgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBkYXRhID0ganNvbi5wYXJzZVJlY29yZChvdXRwdXQpO1xuICBpZiAoIWRhdGEpIHtcbiAgICBsb2dnZXIud2FybihcImZhaWxlZCB0byBwYXJzZSBidW5kbGUgdmFsaWRhdGUgb3V0cHV0XCIsIHsgcGF0aCwgc3RhdHVzOiByZXN1bHQuc3RhdHVzIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJ1c2luZyBwYXJ0aWFsIGJ1bmRsZSBvdXRwdXRcIiwgeyBwYXRoLCBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsIGVycm9yIH0pO1xuICB9XG4gIHJldHVybiB7IHBhdGgsIGRhdGEgfTtcbn1cbiJdfQ==
|
|
424
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDeEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsT0FBTyxFQUNQLElBQUksRUFDSixHQUFHLEVBQ0gsTUFBTSxFQUNOLE1BQU0sSUFBSSxZQUFZLEdBQ3ZCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxJQUFJLElBQUksa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFMUQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQWlDcEMsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDO0FBQ2xDLE1BQU0sZUFBZSxHQUE0QixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDN0UsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFVLENBQUM7QUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7QUFDaEMsTUFBTSxxQkFBcUIsR0FBRztJQUM1QixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDcEIsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDO0NBQ2dDLENBQUM7QUFFdkQscUNBQXFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUM7QUFFbkMsbUVBQW1FO0FBQ25FLE1BQU0sc0JBQXNCLEdBQUcsOEJBQThCLENBQUM7QUFFOUQsNkRBQTZEO0FBQzdELE1BQU0saUJBQWlCLEdBQUcseUJBQXlCLENBQUM7QUFFcEQsZ0VBQWdFO0FBQ2hFLE1BQU0saUJBQWlCLEdBQUcseUJBQXlCLENBQUM7QUFFcEQsd0ZBQXdGO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFXLEVBQUUsT0FBTyxFQUFFLEtBQWMsRUFBRSxDQUFDO0FBRXhFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDO0tBQ3pCLE1BQU0sRUFBRTtLQUNSLElBQUksRUFBRTtLQUNOLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDTixNQUFNLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtJQUNyRCxPQUFPLEVBQUUscUNBQXFDO0NBQy9DLENBQUMsQ0FBQztBQUVMLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQ2xDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUNqQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FDMUMsQ0FBQztBQUVGLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUNuRyxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFbkUsTUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUM1QyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ1AsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMsRUFDRCxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxDQUN0QyxDQUFDO0FBRUYsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3RDLG1CQUFtQixFQUFFLFdBQVc7SUFDaEMsZUFBZSxFQUFFLG1CQUFtQjtJQUNwQyxtQkFBbUIsRUFBRSxlQUFlO0NBQ3JDLENBQUMsQ0FBQztBQUVIOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUU3RixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLElBQUksRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFO0lBQzVCLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzVCLFVBQVUsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFO0NBQ25DLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3RDLElBQUksRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFO0lBQzVCLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzlFLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsUUFBUSxFQUFFO0NBQ3BELENBQUMsQ0FBQztBQUVILE1BQU0sd0JBQXdCLEdBQUcsQ0FBQztLQUMvQixNQUFNLENBQUM7SUFDTixTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO0NBQzNGLENBQUM7S0FDRCxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQTBCLEVBQUU7SUFDNUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ2pDLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdEUsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDO0FBRUw7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsU0FBNkMsT0FBTyxDQUFDLEdBQUc7SUFFeEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLElBQUksUUFBUSxLQUFLLFNBQVM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxvRUFBb0U7QUFDcEUsU0FBUyxJQUFJLENBQ1gsS0FBZ0IsRUFDaEIsVUFBbUQsRUFBRTtJQUVyRCxNQUFNLE1BQU0sR0FBRyxNQUFNO1NBQ2xCLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLGFBQWEsQ0FBQztTQUN4QyxHQUFHLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQztTQUM3QixNQUFNLENBQUMsT0FBTyxDQUFDO1NBQ2YsUUFBUSxFQUFFO1NBQ1YsT0FBTyxFQUFFLENBQUM7SUFDYixNQUFNLFFBQVEsR0FDWixPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVM7UUFDMUIsQ0FBQyxDQUFDLEVBQUU7UUFDSixDQUFDLENBQUMsTUFBTTthQUNILFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2FBQ3hCLEdBQUcsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO2FBQzdCLE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDZixRQUFRLEVBQUU7YUFDVixPQUFPLEVBQUUsQ0FBQztJQUNuQixPQUFPLE1BQU07U0FDVixRQUFRLENBQUMsS0FBSyxDQUFDO1NBQ2YsR0FBRyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7U0FDN0IsTUFBTSxDQUFDLE9BQU8sQ0FBQztTQUNmLFFBQVEsRUFBRTtTQUNWLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ2YsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUYsT0FBTztZQUNMLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN4RSxHQUFHLFFBQVE7WUFDWCxHQUFHO1NBQ0osQ0FBQztJQUNKLENBQUMsQ0FBQztTQUNELFFBQVEsRUFBRTtTQUNWLE9BQU8sRUFBRSxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsTUFBTSxDQUFDLEtBQWdCLEVBQUUsVUFBeUIsRUFBRTtJQUMzRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQWUsT0FBTyxDQUFDLE9BQU8sSUFBSSxlQUFlLENBQUMsQ0FBQztJQUNsRixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDaEIsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUM1QyxLQUFLLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO3dCQUM3QixNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNoRCxJQUFJLEtBQUssS0FBSyxJQUFJOzRCQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO29CQUNuRCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQUMsS0FBZ0IsRUFBRSxVQUF5QixFQUFFO0lBQ2hFLE9BQU8sTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO0FBQzdDLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FDbEIsS0FBZ0IsRUFDaEIsVUFBbUQsRUFBRTtJQUVyRCxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3ZDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxPQUFnQjtJQUNwQyxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQzdELElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3BELEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztRQUM5RSxNQUFNLEtBQUssR0FBc0IsWUFBWSxDQUFDO1FBQzlDLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0MsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEUsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FDcEIsVUFBbUIsRUFDbkIsS0FBZ0IsRUFDaEIsT0FBdUI7SUFFdkIsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQ3JCLFVBQW1CLEVBQ25CLEtBQWdCLEVBQ2hCLE9BQXVCO0lBRXZCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsVUFBbUIsRUFDbkIsS0FBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsT0FBdUI7SUFFdkIsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdELElBQUksVUFBVSxDQUFDLE9BQU87UUFBRSxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDL0MsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RSxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUMzRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLFVBQW1CLEVBQ25CLEtBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLE9BQXVCO0lBRXZCLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxRCxJQUFJLFVBQVUsQ0FBQyxPQUFPO1FBQUUsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQy9DLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDckUsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FDbEIsVUFBbUIsRUFDbkIsS0FBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsT0FBdUI7SUFFdkIsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6RCxJQUFJLFVBQVUsQ0FBQyxPQUFPO1FBQUUsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQy9DLE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQzNELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUNsQixVQUF5RCxFQUN6RCxLQUFnQixFQUNoQixTQUFxQyxFQUNyQyxPQUF1QjtJQUV2QixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNqRSxPQUFPLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUMxQixDQUFDLENBQUMsVUFBVTtRQUNaLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsR0FBbUI7SUFDNUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUNsRSxJQUFJLFFBQVEsS0FBSyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDekMsSUFDRSxRQUFRLEtBQUssU0FBUztRQUN0QixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLFlBQVksSUFBSSxrQkFBa0IsRUFBRSxDQUFDLEVBQ3JGLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDL0UsT0FBTyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQy9ELGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQ2xDLENBQUM7QUFDSixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLFNBQVMsaUJBQWlCLENBQUMsR0FBWTtJQUNyQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2xELENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsU0FBUyxNQUFNLENBQUMsR0FBbUI7SUFDakMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDMUYsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN4QixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RCxPQUFPLFlBQVksQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQ2pFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQ25DLENBQUM7QUFDSixDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLFNBQVMsWUFBWSxDQUNuQixJQUF1QixFQUN2QixHQUE4QixFQUM5QixNQUErQjtJQUUvQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7SUFDckMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQsK0NBQStDO0FBQy9DLFNBQVMsSUFBSSxDQUNYLE1BQW9CLEVBQ3BCLEdBQVk7SUFFWixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDaEIsUUFBUSxNQUFNLEVBQUUsQ0FBQztnQkFDZixLQUFLLEtBQUs7b0JBQ1IsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO29CQUNsQixNQUFNO2dCQUNSLEtBQUssUUFBUTtvQkFDWCxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbEIsTUFBTTtnQkFDUixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQ2QsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzNDLElBQUksV0FBVzt3QkFBRSxNQUFNLFdBQVcsQ0FBQztvQkFDbkMsTUFBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxjQUFjLENBQUMsR0FBVyxFQUFFLEtBQXdCO0lBQzNELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM5RCxNQUFNLFFBQVEsR0FDWixJQUFJO1FBQ0osWUFBWSxLQUFLLFNBQVM7UUFDMUIsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQ3pCLFlBQVksS0FBSyxJQUFJO1FBQ3JCLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxJQUFJO1FBQ04sQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixLQUFLLElBQUksR0FBRyxHQUFHLEtBQUssR0FBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0MsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRTtnQkFBRSxPQUFPLElBQUksQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxRQUFRO1lBQUUsTUFBTTtJQUN4RCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUNqQixHQUFXLEVBQ1gsWUFBK0I7SUFFL0IsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQy9GLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyQixJQUFJLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxHQUFXLEVBQUUsT0FBc0I7SUFDekQsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDNUIsTUFBTSxJQUFJLEdBQUc7UUFDWCxRQUFRO1FBQ1IsVUFBVTtRQUNWLFVBQVU7UUFDVixNQUFNO1FBQ04sR0FBRyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDcEQsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFO1FBQzNDLEdBQUcsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztRQUN4QixRQUFRLEVBQUUsTUFBTTtRQUNoQixLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztLQUNsQyxDQUFDLENBQUM7SUFDSCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyRCxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDekYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdkYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGF5ZXJlZCBjb25maWd1cmF0aW9uIGxvb2t1cDogZW52aXJvbm1lbnQsIGAuZW52YCwgRGF0YWJyaWNrcyBidW5kbGUuXG4gKlxuICogRXZlcnkgcGFja2FnZSByZXNvbHZlcyBzZXR0aW5ncyB0aGUgc2FtZSB3YXk6IHRha2UgdGhlIGNhbGxlcidzIHZhbHVlLCBlbHNlXG4gKiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgZWxzZSBhIGRlZmF1bHQuIExvY2FsIGRldmVsb3BtZW50IGFkZHMgdHdvIGZhbGxiYWNrXG4gKiBsb2NhdGlvbnM6IGAuZW52YCBmaWxlcyBhbmQgb25lIEFwcCdzIGByZXNvdXJjZXMuYXBwcy48YXBwPi5jb25maWcuZW52YCBpblxuICogYGRhdGFicmlja3MueW1sYC5cbiAqXG4gKiBUd28gdGhpbmdzIG1ha2UgaXQgY2hlYXAgdG8gY2FsbCBmcm9tIGEgaG90IHBhdGg6XG4gKlxuICogICAtIHtAbGluayB2YWx1ZXN9IGlzIExBWlkgKGFuIGBvYmplY3QuU2VxdWVuY2VgKSwgc28gYGRhdGFicmlja3MgYnVuZGxlXG4gKiAgICAgdmFsaWRhdGVgIGlzIG9ubHkgc3Bhd25lZCB3aGVuIHRoZSBlbnZpcm9ubWVudCBhbmQgYC5lbnZgIGJvdGggbWlzc2VkLlxuICogICAtIHRoZSBwYXJzZWQgYC5lbnZgIGFuZCBidW5kbGUgYXJlIGNhY2hlZCB0aHJvdWdoIHtAbGluayBjb250ZXh0LmNhY2hlZH0sIHNvXG4gKiAgICAgdGhlIHNwYXduIGhhcHBlbnMgb25jZSBwZXIgd29ya2luZyBkaXJlY3RvcnkgYW5kIGEgYGN3ZGAgY2hhbmdlIG1pc3Nlc1xuICogICAgIHJhdGhlciB0aGFuIHJldHVybmluZyBhbm90aGVyIHByb2plY3QncyBjb25maWcuXG4gKlxuICogSW5zaWRlIGEgZGVwbG95ZWQgRGF0YWJyaWNrcyBBcHAgYm90aCBmaWxlIHNvdXJjZXMgYXJlIHNraXBwZWQgYnkgZGVmYXVsdFxuICogKHtAbGluayBpc0RhdGFicmlja3NBcHBFbnZ9KTogdGhlIHBsYXRmb3JtIGhhcyBhbHJlYWR5IHR1cm5lZCB0aGVtIGludG8gcmVhbFxuICogZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0aGVyZSBpcyBubyBidW5kbGUgdG8gdmFsaWRhdGUsIGFuZCB0aGUgYGRhdGFicmlja3NgXG4gKiBDTEkgaXMgbm90IG9uIHRoZSBpbWFnZS4gQm9vbGVhbiBlbnZpcm9ubWVudCBvdmVycmlkZXMgY2FuIGZvcmNlIGVpdGhlciBmaWxlXG4gKiBzb3VyY2Ugb24gb3Igb2ZmIHdoZW4gYSB0b29sIG5lZWRzIGRpZmZlcmVudCBiZWhhdmlvci5cbiAqXG4gKiBPbmx5IHRoZSBzaW5nbGUgYXBwJ3MgYGNvbmZpZy5lbnZgIGlzIGNvbnN1bHRlZC4gUm9vdCBidW5kbGUgYHZhcmlhYmxlc2AgYXJlXG4gKiBub3Q6IHRoZXkgYXJlIGF1dGhvcmluZyBpbnB1dHMgZm9yIHRoZSBidW5kbGUgaXRzZWxmIChpbnRlcnBvbGF0ZWQgaW50b1xuICogdGFyZ2V0cywgcmVzb3VyY2VzLCBhbmQgcGF0aHMpLCBzbyB0cmVhdGluZyBvbmUgYXMgYSBwcm9jZXNzIHNldHRpbmcgcmVzb2x2ZXNcbiAqIG5hbWVzIHRoZSBkZXBsb3llZCBhcHAgbmV2ZXIgc2Vlcy5cbiAqXG4gKiBOb2RlLW9ubHkgKGBjaGlsZF9wcm9jZXNzYCwgYGZzYCwgYHByb2Nlc3NgKS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGlzQWJzb2x1dGUsIHJlbGF0aXZlLCByZXNvbHZlLCBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwYXJzZUVudiB9IGZyb20gXCJub2RlOnV0aWxcIjtcbmltcG9ydCB7XG4gIGNvbnRleHQsXG4gIGpzb24sXG4gIGxvZyxcbiAgb2JqZWN0LFxuICBzdHJpbmcgYXMgc2hhcmVkU3RyaW5nLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHN0YXRTeW5jIH0gZnJvbSBcIi4vZmlsZS50c1wiO1xuaW1wb3J0IHsgcm9vdCBhcyByZXNvbHZlUHJvamVjdFJvb3QgfSBmcm9tIFwiLi9wcm9qZWN0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJjb25maWdcIik7XG5cbnR5cGUgQ29uZmlnS2V5ID0gc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW107XG5cbi8qKiBXaGVyZSBhIHZhbHVlIG1heSBjb21lIGZyb20sIGNvbnN1bHRlZCBpbiB0aGUgb3JkZXIgZ2l2ZW4uICovXG50eXBlIENvbmZpZ1NvdXJjZSA9IFwiZW52XCIgfCBcImRvdGVudlwiIHwgXCJidW5kbGVcIjtcblxuaW50ZXJmYWNlIENvbmZpZ09wdGlvbnMge1xuICAvKipcbiAgICogT3V0ZXJtb3N0IG5hbWVzcGFjZXMgdHJpZWQgYmVmb3JlIGVhY2gga2V5LiBEZWZhdWx0cyB0byBgREJYX1RPT0xTYC5cbiAgICovXG4gIHNjb3BlPzogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBDYXBhYmlsaXR5IG5hbWVzcGFjZXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIHNjb3BlIGFuZCBiZWZvcmUgZWFjaCBrZXkuICovXG4gIHByZWZpeD86IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU291cmNlcyBpbiBwcmVjZWRlbmNlIG9yZGVyLiBEZWZhdWx0OiBgZW52YCwgYGRvdGVudmAsIGBidW5kbGVgLiAqL1xuICBzb3VyY2VzPzogQ29uZmlnU291cmNlIHwgcmVhZG9ubHkgQ29uZmlnU291cmNlW107XG4gIC8qKiBEaXJlY3RvcnkgdG8gcmVzb2x2ZSBgLmVudmAgYW5kIHRoZSBidW5kbGUgZnJvbS4gRGVmYXVsdDogYHByb2Nlc3MuY3dkKClgLiAqL1xuICBjd2Q/OiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgcmVzb2x2ZWQgdmFsdWUsIHRhZ2dlZCB3aXRoIHRoZSBrZXkgYW5kIHNvdXJjZSBpdCBjYW1lIGZyb20uICovXG5pbnRlcmZhY2UgQ29uZmlnVmFsdWUge1xuICBrZXk6IHN0cmluZztcbiAgc291cmNlOiBDb25maWdTb3VyY2U7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBBIGNvbmZpZyBmaWxlIGZvdW5kIG9uIGRpc2ssIHdpdGggaXRzIHBhcnNlZCBjb250ZW50cy4gKi9cbmludGVyZmFjZSBDb25maWdGaWxlIHtcbiAgcGF0aDogc3RyaW5nO1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuY29uc3QgREVGQVVMVF9TQ09QRSA9IFwiREJYX1RPT0xTXCI7XG5jb25zdCBERUZBVUxUX1NPVVJDRVM6IHJlYWRvbmx5IENvbmZpZ1NvdXJjZVtdID0gW1wiZW52XCIsIFwiZG90ZW52XCIsIFwiYnVuZGxlXCJdO1xuY29uc3QgQlVORExFX0ZJTEVfTkFNRVMgPSBbXCJkYXRhYnJpY2tzLnltbFwiLCBcImRhdGFicmlja3MueWFtbFwiXSBhcyBjb25zdDtcbmNvbnN0IERPVEVOVl9GSUxFX05BTUUgPSBcIi5lbnZcIjtcbmNvbnN0IE5PREVfRU5WX0FMVEVSTkFUSVZFUyA9IHtcbiAgcHJvZHVjdGlvbjogW1wicHJvZFwiXSxcbiAgZGV2ZWxvcG1lbnQ6IFtcImRldlwiXSxcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPjtcblxuLyoqIEhpZ2hlc3QgdmFsaWQgVENQIHBvcnQgbnVtYmVyLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9UQ1BfUE9SVCA9IDY1XzUzNTtcblxuLyoqIEJvb2xlYW4gZW52aXJvbm1lbnQgb3ZlcnJpZGUgZm9yIHtAbGluayBpc0RhdGFicmlja3NBcHBFbnZ9LiAqL1xuY29uc3QgREFUQUJSSUNLU19BUFBfRU5WX0tFWSA9IFwiREJYX1RPT0xTX0RBVEFCUklDS1NfQVBQX0VOVlwiO1xuXG4vKiogQm9vbGVhbiBlbnZpcm9ubWVudCBvdmVycmlkZSBmb3IgcHJvamVjdCBgLmVudmAgcmVhZHMuICovXG5jb25zdCBDT05GSUdfRE9URU5WX0tFWSA9IFwiREJYX1RPT0xTX0NPTkZJR19ET1RFTlZcIjtcblxuLyoqIEJvb2xlYW4gZW52aXJvbm1lbnQgb3ZlcnJpZGUgZm9yIERhdGFicmlja3MgYnVuZGxlIHJlYWRzLiAqL1xuY29uc3QgQ09ORklHX0JVTkRMRV9LRVkgPSBcIkRCWF9UT09MU19DT05GSUdfQlVORExFXCI7XG5cbi8qKiBFeGFjdCBwcm9jZXNzLWVudmlyb25tZW50IGxvb2t1cCBmb3IgY2FsbGVycyB0aGF0IGRvIG5vdCByZWFkIGxvY2FsIGNvbmZpZyBmaWxlcy4gKi9cbmV4cG9ydCBjb25zdCBFTlZfT05MWSA9IHsgc2NvcGU6IFtdIGFzIGNvbnN0LCBzb3VyY2VzOiBcImVudlwiIGFzIGNvbnN0IH07XG5cbmV4cG9ydCBjb25zdCB2YWx1ZVNjaGVtYSA9IHpcbiAgLnN0cmluZygpXG4gIC50cmltKClcbiAgLm1pbigxKVxuICAucmVmaW5lKCh2YWx1ZTogc3RyaW5nKSA9PiAhL1xcJFxce1tefV0rXFx9Ly50ZXN0KHZhbHVlKSwge1xuICAgIG1lc3NhZ2U6IFwiSW50ZXJwb2xhdGVkIHZhbHVlcyBhcmUgbm90IGFsbG93ZWRcIixcbiAgfSk7XG5cbmNvbnN0IHBvcnRWYWx1ZVNjaGVtYSA9IHoucHJlcHJvY2VzcyhcbiAgKGlucHV0KSA9PiBvYmplY3QudG9OdW1iZXIoaW5wdXQpLFxuICB6Lm51bWJlcigpLmludCgpLm1pbigxKS5tYXgoTUFYX1RDUF9QT1JUKSxcbik7XG5cbmNvbnN0IHBvc2l0aXZlTnVtYmVyVmFsdWUgPSB6LnByZXByb2Nlc3MoKGlucHV0KSA9PiBvYmplY3QudG9OdW1iZXIoaW5wdXQpLCB6Lm51bWJlcigpLnBvc2l0aXZlKCkpO1xuY29uc3QgcG9zaXRpdmVJbnRWYWx1ZSA9IHBvc2l0aXZlTnVtYmVyVmFsdWUudHJhbnNmb3JtKE1hdGguZmxvb3IpO1xuXG5jb25zdCB3b3Jrc3BhY2VIb3N0U2NoZW1hID0gdmFsdWVTY2hlbWEucmVmaW5lKFxuICAoaG9zdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gW1wiaHR0cDpcIiwgXCJodHRwczpcIl0uaW5jbHVkZXMobmV3IFVSTChob3N0KS5wcm90b2NvbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICB7IG1lc3NhZ2U6IFwiTXVzdCBiZSBhbiBIVFRQKFMpIFVSTFwiIH0sXG4pO1xuXG5jb25zdCBkYXRhYnJpY2tzQXBwRW52U2NoZW1hID0gei5vYmplY3Qoe1xuICBEQVRBQlJJQ0tTX0FQUF9OQU1FOiB2YWx1ZVNjaGVtYSxcbiAgREFUQUJSSUNLU19IT1NUOiB3b3Jrc3BhY2VIb3N0U2NoZW1hLFxuICBEQVRBQlJJQ0tTX0FQUF9QT1JUOiBwb3J0VmFsdWVTY2hlbWEsXG59KTtcblxuLyoqXG4gKiBUaGUgR0VORVJJQyBzaGFwZSBvZiBhIGJ1bmRsZSByZXNvdXJjZTogYSBuYW1lLCBhbmQgd2hhdGV2ZXIgZWxzZSB0aGUgcmVzb3VyY2VcbiAqIHR5cGUgY2Fycmllcy4gRGVsaWJlcmF0ZWx5IHVub3BpbmlvbmF0ZWQgYW5kIGBwYXNzdGhyb3VnaCgpYCAtIHRoZSBjb25jcmV0ZVxuICogcmVzb3VyY2Uga2luZHMgKGBzcWxfd2FyZWhvdXNlYCwgYGdlbmllX3NwYWNlYCwgYHBvc3RncmVzYCwgLi4uKSBhcmVcbiAqIERhdGFicmlja3MtQXBwIGNvbmNlcHRzIHRoYXQgYmVsb25nIHRvIHRoZSBwYWNrYWdlIHRoYXQgcmVzb2x2ZXMgdGhlbSwgc29cbiAqIG5vZGUtYXBwa2l0IGAuZXh0ZW5kKClgcyB0aGlzIHJhdGhlciB0aGFuIHRoaXMgbW9kdWxlIGtub3dpbmcgYWJvdXQgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IGJ1bmRsZVJlc291cmNlU2NoZW1hID0gei5vYmplY3QoeyBuYW1lOiB2YWx1ZVNjaGVtYS5vcHRpb25hbCgpIH0pLnBhc3N0aHJvdWdoKCk7XG5cbmV4cG9ydCBjb25zdCBidW5kbGVFbnZFbnRyeVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogdmFsdWVTY2hlbWEub3B0aW9uYWwoKSxcbiAgdmFsdWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdmFsdWVfZnJvbTogdmFsdWVTY2hlbWEub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYnVuZGxlQXBwU2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB2YWx1ZVNjaGVtYS5vcHRpb25hbCgpLFxuICBjb25maWc6IHoub2JqZWN0KHsgZW52OiB6LmFycmF5KGJ1bmRsZUVudkVudHJ5U2NoZW1hKS5vcHRpb25hbCgpIH0pLm9wdGlvbmFsKCksXG4gIHJlc291cmNlczogei5hcnJheShidW5kbGVSZXNvdXJjZVNjaGVtYSkub3B0aW9uYWwoKSxcbn0pO1xuXG5jb25zdCBidW5kbGVBcHBDb25maWdFbnZTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHJlc291cmNlczogei5vYmplY3QoeyBhcHBzOiB6LnJlY29yZCh6LnN0cmluZygpLCBidW5kbGVBcHBTY2hlbWEpLm9wdGlvbmFsKCkgfSkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnRyYW5zZm9ybSgoYnVuZGxlKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gICAgY29uc3QgYXBwcyA9IE9iamVjdC52YWx1ZXMoYnVuZGxlLnJlc291cmNlcz8uYXBwcyA/PyB7fSk7XG4gICAgaWYgKGFwcHMubGVuZ3RoICE9PSAxKSByZXR1cm4ge307XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIChhcHBzWzBdPy5jb25maWc/LmVudiA/PyBbXSkuZmxhdE1hcCgoZW50cnkpID0+IHtcbiAgICAgICAgaWYgKCFlbnRyeS5uYW1lKSByZXR1cm4gW107XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHZhbHVlU2NoZW1hLnNhZmVQYXJzZShlbnRyeS52YWx1ZSk7XG4gICAgICAgIHJldHVybiBwYXJzZWQuc3VjY2VzcyA/IChbW2VudHJ5Lm5hbWUsIHBhcnNlZC5kYXRhXV0gYXMgY29uc3QpIDogW107XG4gICAgICB9KSxcbiAgICApO1xuICB9KTtcblxuLyoqXG4gKiBEZXRlY3QgYSBEYXRhYnJpY2tzIEFwcCBydW50aW1lIGZyb20gaXRzIHJlcXVpcmVkIG5hbWUsIGhvc3QsIGFuZCBwb3J0LlxuICpcbiAqIGBEQlhfVE9PTFNfREFUQUJSSUNLU19BUFBfRU5WYCB0YWtlcyBwcmVjZWRlbmNlIHdoZW4gaXQgY29udGFpbnMgYSByZWNvZ25pemVkXG4gKiBib29sZWFuIHZhbHVlLiBUaGlzIGxldHMgbG9jYWwgdG9vbHMgZW11bGF0ZSB0aGUgZGVwbG95ZWQgcnVudGltZSAoYHRydWVgKSBvclxuICogbGV0cyB1bnVzdWFsIGRlcGxveWVkIHByb2Nlc3NlcyByZXRhaW4gbG9jYWwgY29uZmlnIGxvb2t1cCAoYGZhbHNlYCkuIEFuXG4gKiBhYnNlbnQgb3IgdW5yZWNvZ25pemVkIG92ZXJyaWRlIGZhbGxzIGJhY2sgdG8gc3RydWN0dXJhbCBkZXRlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFicmlja3NBcHBFbnYoXG4gIHNvdXJjZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHByb2Nlc3MuZW52LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG92ZXJyaWRlID0gb2JqZWN0LnRvQm9vbGVhbihzb3VyY2VbREFUQUJSSUNLU19BUFBfRU5WX0tFWV0pO1xuICBpZiAob3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG92ZXJyaWRlO1xuICBjb25zdCBwYXJzZWQgPSBkYXRhYnJpY2tzQXBwRW52U2NoZW1hLnNhZmVQYXJzZShzb3VyY2UpO1xuICByZXR1cm4gcGFyc2VkLnN1Y2Nlc3M7XG59XG5cbi8qKiBDYW5kaWRhdGUgbmFtZXMgaW4gc2NvcGUsIHByZWZpeCwgYW5kIGlucHV0IHByZWNlZGVuY2Ugb3JkZXIuICovXG5mdW5jdGlvbiBrZXlzKFxuICBpbnB1dDogQ29uZmlnS2V5LFxuICBvcHRpb25zOiBQaWNrPENvbmZpZ09wdGlvbnMsIFwic2NvcGVcIiB8IFwicHJlZml4XCI+ID0ge30sXG4pOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIGNvbnN0IHNjb3BlcyA9IG9iamVjdFxuICAgIC5zZXF1ZW5jZShvcHRpb25zLnNjb3BlID8/IERFRkFVTFRfU0NPUEUpXG4gICAgLm1hcChzaGFyZWRTdHJpbmcudHJpbVRvRW1wdHkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5kaXN0aW5jdCgpXG4gICAgLnRvQXJyYXkoKTtcbiAgY29uc3QgcHJlZml4ZXMgPVxuICAgIG9wdGlvbnMucHJlZml4ID09PSB1bmRlZmluZWRcbiAgICAgID8gW11cbiAgICAgIDogb2JqZWN0XG4gICAgICAgICAgLnNlcXVlbmNlKG9wdGlvbnMucHJlZml4KVxuICAgICAgICAgIC5tYXAoc2hhcmVkU3RyaW5nLnRyaW1Ub0VtcHR5KVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAuZGlzdGluY3QoKVxuICAgICAgICAgIC50b0FycmF5KCk7XG4gIHJldHVybiBvYmplY3RcbiAgICAuc2VxdWVuY2UoaW5wdXQpXG4gICAgLm1hcChzaGFyZWRTdHJpbmcudHJpbVRvRW1wdHkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5kaXN0aW5jdCgpXG4gICAgLmZsYXRNYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgcHJlZml4ZWQgPSBwcmVmaXhlcy5sZW5ndGggPiAwID8gcHJlZml4ZXMubWFwKChwcmVmaXgpID0+IGAke3ByZWZpeH1fJHtrZXl9YCkgOiBba2V5XTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIC4uLnNjb3Blcy5mbGF0TWFwKChzY29wZSkgPT4gcHJlZml4ZWQubWFwKChuYW1lKSA9PiBgJHtzY29wZX1fJHtuYW1lfWApKSxcbiAgICAgICAgLi4ucHJlZml4ZWQsXG4gICAgICAgIGtleSxcbiAgICAgIF07XG4gICAgfSlcbiAgICAuZGlzdGluY3QoKVxuICAgIC50b0FycmF5KCk7XG59XG5cbi8qKlxuICogRXZlcnkgdmFsdWUgdGhhdCByZXNvbHZlcyBmb3IgYGlucHV0YCwgaW4gc291cmNlLXRoZW4ta2V5IHByZWNlZGVuY2Ugb3JkZXIsXG4gKiBhcyBhIExBWlkgc2VxdWVuY2U6IG5vdGhpbmcgcGFzdCB0aGUgZmlyc3QgY29uc3VtZWQgZWxlbWVudCBpcyByZWFkLCBzb1xuICogYHZhbHVlcyhrZXkpLmF0KDApYCBuZXZlciBzcGF3bnMgdGhlIERhdGFicmlja3MgQ0xJIHdoZW4gdGhlIGVudmlyb25tZW50XG4gKiBhbHJlYWR5IGFuc3dlcmVkLlxuICpcbiAqL1xuZnVuY3Rpb24gdmFsdWVzKGlucHV0OiBDb25maWdLZXksIG9wdGlvbnM6IENvbmZpZ09wdGlvbnMgPSB7fSk6IG9iamVjdC5TZXF1ZW5jZTxDb25maWdWYWx1ZT4ge1xuICBjb25zdCBjYW5kaWRhdGVzID0ga2V5cyhpbnB1dCwgb3B0aW9ucyk7XG4gIGNvbnN0IHNvdXJjZXMgPSBvYmplY3Quc2VxdWVuY2U8Q29uZmlnU291cmNlPihvcHRpb25zLnNvdXJjZXMgPz8gREVGQVVMVF9TT1VSQ0VTKTtcbiAgcmV0dXJuIG9iamVjdC5zZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEdlbmVyYXRvcjxDb25maWdWYWx1ZT4ge1xuICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICBmb3IgKGNvbnN0IG1hcCBvZiByZWFkKHNvdXJjZSwgb3B0aW9ucy5jd2QpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBzaGFyZWRTdHJpbmcudHJpbVRvTnVsbChtYXBba2V5XSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHlpZWxkIHsga2V5LCBzb3VyY2UsIHZhbHVlIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIGZpcnN0IHZhbHVlIHRoYXQgcmVzb2x2ZXMgZm9yIGBpbnB1dGAsIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBkb21haW4gPSBjb25maWcudGV4dChbXCJUVU5ORUxfUFVCTElDX0RPTUFJTlwiLCBcIlBVQkxJQ19ET01BSU5cIl0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGV4dChpbnB1dDogQ29uZmlnS2V5LCBvcHRpb25zOiBDb25maWdPcHRpb25zID0ge30pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWVzKGlucHV0LCBvcHRpb25zKS5hdCgwKT8udmFsdWU7XG59XG5cbi8qKlxuICogVGhlIFBSSU1BUlkgKGZ1bGx5LXNjb3BlZCkgbmFtZSBmb3IgYGlucHV0YCAtIHdoYXQgdG8gcHJpbnQgaW4gYSBsb2cgbGluZSBvciBhblxuICogZXJyb3IsIHNvIHRoZSBtZXNzYWdlIG5hbWVzIHRoZSB2YXJpYWJsZSBhIHJlYWRlciBzaG91bGQgc2V0LiBEbyBub3QgaW5kZXhcbiAqIGBrZXlzKC4uLilbMF1gIGZvciB0aGlzIGlmIGBpbnB1dGAgbWF5IGJlIGEgYmFyZSBzdHJpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxvZ2dlci53YXJuKGAke2NvbmZpZy5uYW1lKEpXVF9TRUNSRVRfRU5WKX0gaXMgbm90IHNldGApO1xuICovXG5leHBvcnQgZnVuY3Rpb24gbmFtZShcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgb3B0aW9uczogUGljazxDb25maWdPcHRpb25zLCBcInNjb3BlXCIgfCBcInByZWZpeFwiPiA9IHt9LFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGtleXMoaW5wdXQsIG9wdGlvbnMpWzBdID8/IFwiXCI7XG59XG5cbi8qKlxuICogU2FmZSBgLmVudi48bmFtZT5gIHN1ZmZpeGVzIGZvciBhIE5vZGUgZW52aXJvbm1lbnQsIGV4YWN0IHNwZWxsaW5nIGZpcnN0LlxuICogS25vd24gbG9uZyBhbmQgc2hvcnQgbmFtZXMgYXJlIGludGVyY2hhbmdlYWJsZTsgdW5rbm93biBuYW1lcyBwYXNzIHRocm91Z2guXG4gKi9cbmZ1bmN0aW9uIG5vZGVFbnZOYW1lcyhub2RlRW52OiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBuYW1lID0gc2hhcmVkU3RyaW5nLnRyaW1Ub051bGwobm9kZUVudik/LnRvTG93ZXJDYXNlKCk7XG4gIGlmICghbmFtZSB8fCAhL15bYS16MC05Xy1dKyQvLnRlc3QobmFtZSkpIHJldHVybiBbXTtcbiAgZm9yIChjb25zdCBbY2Fub25pY2FsLCBhbHRlcm5hdGl2ZXNdIG9mIE9iamVjdC5lbnRyaWVzKE5PREVfRU5WX0FMVEVSTkFUSVZFUykpIHtcbiAgICBjb25zdCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10gPSBhbHRlcm5hdGl2ZXM7XG4gICAgaWYgKG5hbWUgPT09IGNhbm9uaWNhbCB8fCBuYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIFsuLi5vYmplY3Quc2VxdWVuY2UobmFtZSwgY2Fub25pY2FsLCBhbHRlcm5hdGl2ZXMpLmRpc3RpbmN0KCldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW25hbWVdO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBzdHJpbmc6IGBjb25maWd1cmVkYCB3aGVuIG5vbi1lbXB0eSwgZWxzZSB7QGxpbmsgdGV4dH0sIGVsc2UgYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIGNvZXJjaW9uIHJ1bGVzIGFyZSBkZWxpYmVyYXRlbHkgbG9vc2UgKGBvbmAgLyBgeWVzYCAvIGAxYCBhcmUgYWxsXG4gKiBgdHJ1ZWApIGJlY2F1c2UgdmFsdWVzIG1heSBjb21lIGZyb20gYSBmaWxlIGEgaHVtYW4gdHlwZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbmZpZy5zdHJpbmcob3B0aW9ucy5ob3N0LCBcIlNNVFBfSE9TVFwiKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZyhcbiAgY29uZmlndXJlZDogdW5rbm93bixcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgb3B0aW9ucz86IENvbmZpZ09wdGlvbnMsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc2hhcmVkU3RyaW5nLnRyaW1Ub051bGwoY29uZmlndXJlZCkgPz8gdGV4dChpbnB1dCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGJvb2xlYW4gdGhyb3VnaCBgb2JqZWN0LnRvQm9vbGVhbmAuIGB1bmRlZmluZWRgIHdoZW4gbmVpdGhlciBzb3VyY2VcbiAqIGlzIGludGVycHJldGFibGUsIHNvIHRoZSBjYWxsZXIgcGlja3MgYSBkZWZhdWx0IHdpdGggYD8/YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJvb2xlYW4oXG4gIGNvbmZpZ3VyZWQ6IHVua25vd24sXG4gIGlucHV0OiBDb25maWdLZXksXG4gIG9wdGlvbnM/OiBDb25maWdPcHRpb25zLFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBvYmplY3QudG9Cb29sZWFuKGNvbmZpZ3VyZWQpID8/IG9iamVjdC50b0Jvb2xlYW4odGV4dChpbnB1dCwgb3B0aW9ucykpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBwb3NpdGl2ZSBudW1iZXIgdGhhdCBtYXkgYmUgZnJhY3Rpb25hbCAoYSBzY29yZSB0aHJlc2hvbGQsIGEgcmF0aW8pLlxuICogVXNlIHtAbGluayBwb3NpdGl2ZUludH0gZm9yIGEgY291bnQsIHBvcnQsIG9yIHRpbWVvdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3NpdGl2ZU51bWJlcihcbiAgY29uZmlndXJlZDogdW5rbm93bixcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgZmFsbGJhY2s6IG51bWJlcixcbiAgb3B0aW9ucz86IENvbmZpZ09wdGlvbnMsXG4pOiBudW1iZXIge1xuICBjb25zdCBmcm9tQ29uZmlnID0gcG9zaXRpdmVOdW1iZXJWYWx1ZS5zYWZlUGFyc2UoY29uZmlndXJlZCk7XG4gIGlmIChmcm9tQ29uZmlnLnN1Y2Nlc3MpIHJldHVybiBmcm9tQ29uZmlnLmRhdGE7XG4gIGNvbnN0IGZyb21Tb3VyY2VzID0gcG9zaXRpdmVOdW1iZXJWYWx1ZS5zYWZlUGFyc2UodGV4dChpbnB1dCwgb3B0aW9ucykpO1xuICByZXR1cm4gZnJvbVNvdXJjZXMuc3VjY2VzcyA/IGZyb21Tb3VyY2VzLmRhdGEgOiBmYWxsYmFjaztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgcG9zaXRpdmUgaW50ZWdlciAoYSBwb3J0LCBhIHRpbWVvdXQsIGEgcGFnZSBzaXplKSwgZmxvb3JlZC4gQVxuICogbm9uLW51bWVyaWMgb3Igbm9uLXBvc2l0aXZlIHZhbHVlIGlzIHRyZWF0ZWQgYXMgQUJTRU5UIHJhdGhlciB0aGFuIGZhdGFsIC1cbiAqIHRoZXNlIGFyZSBjZWlsaW5ncyB3aGVyZSBhIHNhbmUgZGVmYXVsdCBiZWF0cyBhIGJvb3QgZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aXZlSW50KFxuICBjb25maWd1cmVkOiB1bmtub3duLFxuICBpbnB1dDogQ29uZmlnS2V5LFxuICBmYWxsYmFjazogbnVtYmVyLFxuICBvcHRpb25zPzogQ29uZmlnT3B0aW9ucyxcbik6IG51bWJlciB7XG4gIGNvbnN0IGZyb21Db25maWcgPSBwb3NpdGl2ZUludFZhbHVlLnNhZmVQYXJzZShjb25maWd1cmVkKTtcbiAgaWYgKGZyb21Db25maWcuc3VjY2VzcykgcmV0dXJuIGZyb21Db25maWcuZGF0YTtcbiAgY29uc3QgZnJvbVNvdXJjZXMgPSBwb3NpdGl2ZUludFZhbHVlLnNhZmVQYXJzZSh0ZXh0KGlucHV0LCBvcHRpb25zKSk7XG4gIHJldHVybiBmcm9tU291cmNlcy5zdWNjZXNzID8gZnJvbVNvdXJjZXMuZGF0YSA6IE1hdGguZmxvb3IoZmFsbGJhY2spO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBUQ1AgcG9ydCBiZXR3ZWVuIDEgYW5kIHtAbGluayBNQVhfVENQX1BPUlR9LiBJbnZhbGlkIGNvbmZpZ3VyZWQgb3JcbiAqIHNvdXJjZWQgdmFsdWVzIGZhbGwgYmFjayB0byB0aGUgY2FsbGVyJ3MgZGVmYXVsdCwgd2hpY2ggbWF5IGJlIGEgc2VudGluZWxcbiAqIHN1Y2ggYXMgYDBgIHdoZW4gdGhlIGNhbGxlciB1c2VzIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvcnQoXG4gIGNvbmZpZ3VyZWQ6IHVua25vd24sXG4gIGlucHV0OiBDb25maWdLZXksXG4gIGZhbGxiYWNrOiBudW1iZXIsXG4gIG9wdGlvbnM/OiBDb25maWdPcHRpb25zLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgZnJvbUNvbmZpZyA9IHBvcnRWYWx1ZVNjaGVtYS5zYWZlUGFyc2UoY29uZmlndXJlZCk7XG4gIGlmIChmcm9tQ29uZmlnLnN1Y2Nlc3MpIHJldHVybiBmcm9tQ29uZmlnLmRhdGE7XG4gIGNvbnN0IGZyb21Tb3VyY2VzID0gcG9ydFZhbHVlU2NoZW1hLnNhZmVQYXJzZSh0ZXh0KGlucHV0LCBvcHRpb25zKSk7XG4gIHJldHVybiBmcm9tU291cmNlcy5zdWNjZXNzID8gZnJvbVNvdXJjZXMuZGF0YSA6IGZhbGxiYWNrO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBsaXN0IHRocm91Z2ggYHN0cmluZy5wYXJzZUxpc3RgLCBzbyBhbiBhcnJheSBmcm9tIHR5cGVkIGNvbmZpZyBhbmQgYVxuICogYFwiYSwgYiBjXCJgIHN0cmluZyBub3JtYWxpemUgaWRlbnRpY2FsbHkuIGBbXWAgd2hlbiBuZWl0aGVyIHNvdXJjZSBoYXMgZW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3QoXG4gIGNvbmZpZ3VyZWQ6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgdHJhbnNmb3JtPzogKGVudHJ5OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgb3B0aW9ucz86IENvbmZpZ09wdGlvbnMsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGZyb21Db25maWcgPSBzaGFyZWRTdHJpbmcucGFyc2VMaXN0KGNvbmZpZ3VyZWQsIHRyYW5zZm9ybSk7XG4gIHJldHVybiBmcm9tQ29uZmlnLmxlbmd0aCA+IDBcbiAgICA/IGZyb21Db25maWdcbiAgICA6IHNoYXJlZFN0cmluZy5wYXJzZUxpc3QodGV4dChpbnB1dCwgb3B0aW9ucyksIHRyYW5zZm9ybSk7XG59XG5cbi8qKlxuICogVGhlIERhdGFicmlja3MgYnVuZGxlIG91dHB1dCBmb3IgYGN3ZGAgLSBgZGF0YWJyaWNrcyBidW5kbGUgdmFsaWRhdGUgLS1vdXRwdXRcbiAqIGpzb25gIHJ1biBmcm9tIHRoZSBkaXJlY3RvcnkgaG9sZGluZyBgZGF0YWJyaWNrcy55bWxgLCB3aXRoIHRoZSBjb25maWcgZmlsZSdzXG4gKiBwYXRoLiBBIG5vbi16ZXJvIHZhbGlkYXRpb24gbWF5IHN0aWxsIHJldHVybiBwYXJ0aWFsIEpTT04gd2l0aCB1c2FibGUgQXBwXG4gKiBjb25maWcuIGB1bmRlZmluZWRgIHdoZW4gYnVuZGxlIHJlYWRzIGFyZSBkaXNhYmxlZCwgdGhlIHByb2Nlc3MgaXMgcHJvZHVjdGlvblxuICogb3IgYSBkZXBsb3llZCBBcHAgd2l0aG91dCBhbiBleHBsaWNpdCBvdmVycmlkZSwgdGhlcmUgaXMgbm8gYnVuZGxlLCBvciB0aGVcbiAqIENMSSBwcm9kdWNlcyBubyBKU09OLlxuICpcbiAqIENhY2hlZCBvbmNlIHBlciByZXNvbHZlZCB3b3JraW5nLWRpcmVjdG9yeSBjb250ZXh0IGFuZFxuICogYERBVEFCUklDS1NfQ09ORklHX1BST0ZJTEVgIHRocm91Z2gge0BsaW5rIGNvbnRleHQuY2FjaGVkfSwgc28gcmVwZWF0ZWRcbiAqIGxvb2t1cHMgZG8gbm90IHJlcnVuIHZhbGlkYXRpb24gYW5kIGNoYW5naW5nIGVpdGhlciBjYW5ub3QgcmV0dXJuIGFub3RoZXJcbiAqIGNvbnRleHQncyBidW5kbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidW5kbGVGaWxlKGN3ZD86IHN0cmluZyB8IG51bGwpOiBDb25maWdGaWxlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3ZlcnJpZGUgPSBvYmplY3QudG9Cb29sZWFuKHByb2Nlc3MuZW52W0NPTkZJR19CVU5ETEVfS0VZXSk7XG4gIGlmIChvdmVycmlkZSA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChcbiAgICBvdmVycmlkZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgKHByb2Nlc3MuZW52Lk5PREVfRU5WPy50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9kdWN0aW9uXCIgfHwgaXNEYXRhYnJpY2tzQXBwRW52KCkpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgcHJvZmlsZSA9IHNoYXJlZFN0cmluZy50cmltVG9OdWxsKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQ09ORklHX1BST0ZJTEUpO1xuICByZXR1cm4gY2FjaGVkQ29uZmlnKFtcImJ1bmRsZVwiLCBwcm9maWxlID8/IFwiXCJdLCBjd2QsIChyZXNvbHZlZCkgPT5cbiAgICBsb2FkQnVuZGxlRmlsZShyZXNvbHZlZCwgcHJvZmlsZSksXG4gICk7XG59XG5cbi8qKiBUaGUgc2luZ2xlIGJ1bmRsZSBBcHAncyByZXNvbHZlZCBsaXRlcmFsIGVudmlyb25tZW50LCB3aGVuIGF2YWlsYWJsZS4gKi9cbmZ1bmN0aW9uIGJ1bmRsZUVudmlyb25tZW50KGN3ZD86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBmaWxlID0gYnVuZGxlRmlsZShjd2QpO1xuICBpZiAoIWZpbGUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IGJ1bmRsZUFwcENvbmZpZ0VudlNjaGVtYS5zYWZlUGFyc2UoZmlsZS5kYXRhKTtcbiAgcmV0dXJuIHBhcnNlZC5zdWNjZXNzID8gcGFyc2VkLmRhdGEgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBQYXJzZWQgYC5lbnZgIGZvciBgY3dkYCwgb3IgYHt9YC4gUmVhZCBvbmNlIHBlciByZXNvbHZlZCBjb250ZXh0LiAqL1xuZnVuY3Rpb24gZG90ZW52KGN3ZD86IHN0cmluZyB8IG51bGwpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZW5hYmxlZCA9IG9iamVjdC50b0Jvb2xlYW4ocHJvY2Vzcy5lbnZbQ09ORklHX0RPVEVOVl9LRVldKSA/PyAhaXNEYXRhYnJpY2tzQXBwRW52KCk7XG4gIGlmICghZW5hYmxlZCkgcmV0dXJuIHt9O1xuICBjb25zdCBlbnZpcm9ubWVudHMgPSBub2RlRW52TmFtZXMocHJvY2Vzcy5lbnYuTk9ERV9FTlYpO1xuICByZXR1cm4gY2FjaGVkQ29uZmlnKFtcImRvdGVudlwiLCAuLi5lbnZpcm9ubWVudHNdLCBjd2QsIChyZXNvbHZlZCkgPT5cbiAgICBsb2FkRG90ZW52KHJlc29sdmVkLCBlbnZpcm9ubWVudHMpLFxuICApO1xufVxuXG4vKiogQ2FjaGUgZXZlcnkgdGFyZ2V0IGRpcmVjdG9yeSBzZXBhcmF0ZWx5IHdpdGhpbiB0aGUgYWN0aXZlIHByb2Nlc3MgY29udGV4dC4gKi9cbmZ1bmN0aW9uIGNhY2hlZENvbmZpZzxUPihcbiAgbmFtZTogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGN3ZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbG9hZGVyOiAocmVzb2x2ZWQ6IHN0cmluZykgPT4gVCxcbik6IFQge1xuICBjb25zdCBhY3RpdmUgPSBjb250ZXh0LmdldENvbnRleHQoKSA/PyBcIlwiO1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmUoY3dkID8/IFwiLlwiKTtcbiAgcmV0dXJuIGNvbnRleHQuY2FjaGVkKFtcImNvbmZpZ1wiLCBhY3RpdmUsIHJlc29sdmVkLCAuLi5uYW1lXSwgKCkgPT4gbG9hZGVyKHJlc29sdmVkKSk7XG59XG5cbi8qKiBNYXBzIGZvciBvbmUgc291cmNlIGluIHByZWNlZGVuY2Ugb3JkZXIuICovXG5mdW5jdGlvbiByZWFkKFxuICBzb3VyY2U6IENvbmZpZ1NvdXJjZSxcbiAgY3dkPzogc3RyaW5nLFxuKTogb2JqZWN0LlNlcXVlbmNlPFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+IHtcbiAgcmV0dXJuIG9iamVjdC5zZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEdlbmVyYXRvcjxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PiB7XG4gICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICBjYXNlIFwiZW52XCI6XG4gICAgICAgICAgeWllbGQgcHJvY2Vzcy5lbnY7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJkb3RlbnZcIjpcbiAgICAgICAgICB5aWVsZCBkb3RlbnYoY3dkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImJ1bmRsZVwiOiB7XG4gICAgICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSBidW5kbGVFbnZpcm9ubWVudChjd2QpO1xuICAgICAgICAgIGlmIChlbnZpcm9ubWVudCkgeWllbGQgZW52aXJvbm1lbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBMb2NhdGUgYG5hbWVzYCBmcm9tIGBjd2RgIG91dHdhcmQuIGBjd2RgIGl0c2VsZiBpcyBjaGVja2VkIGJlZm9yZSB0aGVcbiAqIGRpc2NvdmVyZWQgcHJvamVjdCByb290cyBzbyBhIHBhY2thZ2UtbG9jYWwgZmlsZSB3aW5zIG92ZXIgdGhlIHdvcmtzcGFjZSdzLlxuICovXG5mdW5jdGlvbiBmaW5kQ29uZmlnRmlsZShjd2Q6IHN0cmluZywgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhcnQgPSByZXNvbHZlKGN3ZCk7XG4gIGNvbnN0IHJvb3QgPSByZXNvbHZlUHJvamVjdFJvb3Qoc3RhcnQpO1xuICBjb25zdCBwYXRoRnJvbVJvb3QgPSByb290ID8gcmVsYXRpdmUocm9vdCwgc3RhcnQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBib3VuZGFyeSA9XG4gICAgcm9vdCAmJlxuICAgIHBhdGhGcm9tUm9vdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgIWlzQWJzb2x1dGUocGF0aEZyb21Sb290KSAmJlxuICAgIHBhdGhGcm9tUm9vdCAhPT0gXCIuLlwiICYmXG4gICAgIXBhdGhGcm9tUm9vdC5zdGFydHNXaXRoKGAuLiR7c2VwfWApXG4gICAgICA/IHJvb3RcbiAgICAgIDogdW5kZWZpbmVkO1xuICBmb3IgKGxldCBkaXIgPSBzdGFydDsgOyBkaXIgPSBkaXJuYW1lKGRpcikpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKGRpciwgbmFtZSk7XG4gICAgICBpZiAoc3RhdFN5bmMocGF0aCk/LmlzRmlsZSgpKSByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgaWYgKGJvdW5kYXJ5ID09PSB1bmRlZmluZWQgfHwgZGlyID09PSBib3VuZGFyeSkgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbG9hZERvdGVudihcbiAgY3dkOiBzdHJpbmcsXG4gIGVudmlyb25tZW50czogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmFtZXMgPSBbLi4uZW52aXJvbm1lbnRzLm1hcCgobmFtZSkgPT4gYCR7RE9URU5WX0ZJTEVfTkFNRX0uJHtuYW1lfWApLCBET1RFTlZfRklMRV9OQU1FXTtcbiAgY29uc3QgcGF0aCA9IGZpbmRDb25maWdGaWxlKGN3ZCwgbmFtZXMpO1xuICBpZiAoIXBhdGgpIHJldHVybiB7fTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VFbnYocmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmOFwiKSk7XG4gIH0gY2F0Y2gge1xuICAgIGxvZ2dlci53YXJuKFwiZmFpbGVkIHRvIHJlYWQgZG90ZW52IGZpbGVcIiwgeyBwYXRoIH0pO1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkQnVuZGxlRmlsZShjd2Q6IHN0cmluZywgcHJvZmlsZTogc3RyaW5nIHwgbnVsbCk6IENvbmZpZ0ZpbGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXRoID0gZmluZENvbmZpZ0ZpbGUoY3dkLCBCVU5ETEVfRklMRV9OQU1FUyk7XG4gIGlmICghcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgYXJncyA9IFtcbiAgICBcImJ1bmRsZVwiLFxuICAgIFwidmFsaWRhdGVcIixcbiAgICBcIi0tb3V0cHV0XCIsXG4gICAgXCJqc29uXCIsXG4gICAgLi4uKHByb2ZpbGUgPT09IG51bGwgPyBbXSA6IFtcIi0tcHJvZmlsZVwiLCBwcm9maWxlXSksXG4gIF07XG4gIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhcImRhdGFicmlja3NcIiwgYXJncywge1xuICAgIGN3ZDogcmVzb2x2ZShwYXRoLCBcIi4uXCIpLFxuICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gIH0pO1xuICBjb25zdCBvdXRwdXQgPSBzaGFyZWRTdHJpbmcudHJpbVRvTnVsbChyZXN1bHQuc3Rkb3V0KTtcbiAgY29uc3QgZXJyb3IgPSBzaGFyZWRTdHJpbmcudHJpbVRvTnVsbChyZXN1bHQuc3RkZXJyKTtcbiAgaWYgKG91dHB1dCA9PT0gbnVsbCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImJ1bmRsZSB2YWxpZGF0ZSBwcm9kdWNlZCBubyBKU09OXCIsIHsgcGF0aCwgc3RhdHVzOiByZXN1bHQuc3RhdHVzLCBlcnJvciB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGRhdGEgPSBqc29uLnBhcnNlUmVjb3JkKG91dHB1dCk7XG4gIGlmICghZGF0YSkge1xuICAgIGxvZ2dlci53YXJuKFwiZmFpbGVkIHRvIHBhcnNlIGJ1bmRsZSB2YWxpZGF0ZSBvdXRwdXRcIiwgeyBwYXRoLCBzdGF0dXM6IHJlc3VsdC5zdGF0dXMgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInVzaW5nIHBhcnRpYWwgYnVuZGxlIG91dHB1dFwiLCB7IHBhdGgsIHN0YXR1czogcmVzdWx0LnN0YXR1cywgZXJyb3IgfSk7XG4gIH1cbiAgcmV0dXJuIHsgcGF0aCwgZGF0YSB9O1xufVxuIl19
|