@dbx-tools/appkit-mastra 0.9.95 → 0.9.105
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 +238 -285
- package/index.ts +4 -5
- package/lib/index.d.ts +4 -5
- package/lib/index.js +4 -5
- package/lib/src/agents.d.ts +5 -3
- package/lib/src/agents.js +70 -19
- package/lib/src/chat.d.ts +3 -1
- package/lib/src/chat.js +98 -12
- package/lib/src/config.d.ts +7 -1
- package/lib/src/config.js +6 -2
- package/lib/src/model.d.ts +3 -6
- package/lib/src/model.js +11 -94
- package/lib/src/monty-sandbox.d.ts +3 -7
- package/lib/src/monty-sandbox.js +17 -28
- package/lib/src/openapi-tool.js +3 -12
- package/lib/src/plugin.js +3 -1
- package/lib/src/server.js +1 -1
- package/lib/src/skill-paths.d.ts +1 -1
- package/lib/src/skill-paths.js +2 -2
- package/lib/src/workspaces.d.ts +53 -92
- package/lib/src/workspaces.js +319 -192
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -22
- package/src/agents.ts +69 -18
- package/src/chat.ts +103 -11
- package/src/config.ts +13 -2
- package/src/model.ts +10 -108
- package/src/monty-sandbox.ts +23 -33
- package/src/openapi-tool.ts +2 -11
- package/src/plugin.ts +2 -0
- package/src/server.ts +22 -20
- package/src/skill-paths.ts +1 -1
- package/src/workspaces.ts +485 -266
- package/lib/src/serving-sanitize.d.ts +0 -6
- package/lib/src/serving-sanitize.js +0 -7
- package/src/serving-sanitize.ts +0 -19
package/lib/src/workspaces.js
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Mastra workspace factory for Databricks Apps.
|
|
3
3
|
*
|
|
4
|
-
* Builds
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* readable / writable policy: a Databricks path mounted through the OBO client
|
|
9
|
-
* on {@link MASTRA_USER_KEY}, or any {@link WorkspaceFilesystem} a consuming
|
|
10
|
-
* library already owns. {@link DEFAULT_SKILL_FOLDERS} supplies the Assistant
|
|
11
|
-
* trees, and `skillFolders` merges over it - same name overrides, `false`
|
|
12
|
-
* disables, a new name adds. Optional mount resolvers contribute further
|
|
13
|
-
* filesystems and skill scan roots on top.
|
|
4
|
+
* Builds native Mastra workspace configuration from Databricks paths. Paths
|
|
5
|
+
* mount at the same path by default, `~` resolves to the current user's
|
|
6
|
+
* Databricks workspace home, and `/tmp[/subpath]` resolves to stable
|
|
7
|
+
* user-scoped storage under the host's ephemeral temp directory.
|
|
14
8
|
*
|
|
15
9
|
* Databricks mounts use `@dbx-tools/databricks` {@link DatabricksFileSystem}
|
|
16
10
|
* wrapped by {@link filesystems}; inaccessible roots are skipped independently.
|
|
@@ -18,16 +12,19 @@
|
|
|
18
12
|
* @module
|
|
19
13
|
*/
|
|
20
14
|
import { createHash } from "node:crypto";
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
15
|
+
import { tmpdir } from "node:os";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { ConfigurationError, createWorkspaceClient } from "@databricks/appkit";
|
|
18
|
+
import { appkit, pluginRegistry } from "@dbx-tools/appkit";
|
|
23
19
|
import { filesCache as filesCachePlugin, } from "@dbx-tools/appkit/files-cache";
|
|
24
20
|
import { DatabricksFileSystem, workspaceClient } from "@dbx-tools/databricks";
|
|
25
21
|
import { LocalFileSystem } from "@dbx-tools/fs";
|
|
22
|
+
import { match } from "@dbx-tools/path";
|
|
26
23
|
import { errorUtils, log, object, stringUtils, token } from "@dbx-tools/shared-core";
|
|
27
|
-
import { fs as sharedFS, posixPath } from "@dbx-tools/shared-fs";
|
|
28
|
-
import {
|
|
24
|
+
import { fs as sharedFS, posixPath, MemoryFileSystem, } from "@dbx-tools/shared-fs";
|
|
25
|
+
import { Workspace, } from "@mastra/core/workspace";
|
|
29
26
|
import { MASTRA_SCOPES_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_USER_KEY, resolveUserKey, } from "./config.js";
|
|
30
|
-
import { filesystems, MountedCompositeFilesystem,
|
|
27
|
+
import { filesystems, MountedCompositeFilesystem, } from "./filesystems.js";
|
|
31
28
|
import { MontySandbox } from "./monty-sandbox.js";
|
|
32
29
|
import { DatabricksSandbox } from "./sandbox.js";
|
|
33
30
|
import { ORGANIZATION_ASSISTANT_PATH, personalWorkspacePath } from "./skill-paths.js";
|
|
@@ -35,87 +32,74 @@ import { ORGANIZATION_ASSISTANT_PATH, personalWorkspacePath } from "./skill-path
|
|
|
35
32
|
/** OAuth scopes that gate Databricks workspace file mounts. */
|
|
36
33
|
const WORKSPACE_FILE_SCOPES = ["workspace", "workspace.workspace", "all-apis"];
|
|
37
34
|
const SCRATCH_MOUNT = "/tmp";
|
|
35
|
+
const CACHEABLE_FILESYSTEM_OPERATIONS = [
|
|
36
|
+
"exists",
|
|
37
|
+
"readFile",
|
|
38
|
+
"readdir",
|
|
39
|
+
"stat",
|
|
40
|
+
];
|
|
38
41
|
const logger = log.logger("mastra/workspaces");
|
|
42
|
+
let workspaceSourceSequence = 0;
|
|
43
|
+
const databricksWorkspaceOptions = new WeakMap();
|
|
39
44
|
/* ------------------------------- defaults ------------------------------- */
|
|
40
45
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* - `organization-skills` - `/Workspace/.assistant` with `skills`; write
|
|
44
|
-
* attempts require approval and remain subject to Databricks permissions.
|
|
45
|
-
* - `personal-skills` - the requesting user's `/Workspace/Users/<email>` root
|
|
46
|
-
* with `.assistant/skills`, writable and skipped without an email.
|
|
46
|
+
* Default Databricks paths for shared and current-user Agent Skills.
|
|
47
47
|
*/
|
|
48
|
-
export const
|
|
49
|
-
|
|
50
|
-
description: "Organization skills shared with everyone in this Databricks workspace.",
|
|
51
|
-
displayName: "Organization Skills",
|
|
48
|
+
export const DEFAULT_DATABRICKS_WORKSPACE_PATHS = [
|
|
49
|
+
{
|
|
52
50
|
path: ORGANIZATION_ASSISTANT_PATH,
|
|
53
51
|
readable: true,
|
|
54
52
|
skills: ["skills"],
|
|
55
53
|
writable: true,
|
|
56
54
|
createRoot: false,
|
|
57
55
|
},
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
displayName: "Home",
|
|
61
|
-
path: ({ requestContext }) => {
|
|
62
|
-
const email = resolveScopedEmail(requestContext);
|
|
63
|
-
return email ? personalWorkspacePath(email) : undefined;
|
|
64
|
-
},
|
|
56
|
+
{
|
|
57
|
+
path: "~",
|
|
65
58
|
readable: true,
|
|
66
59
|
skills: [".assistant/skills"],
|
|
67
60
|
writable: true,
|
|
68
61
|
createRoot: false,
|
|
69
62
|
},
|
|
70
|
-
|
|
63
|
+
];
|
|
71
64
|
/**
|
|
72
65
|
* Create a Mastra {@link Workspace} with per-request Databricks mounts.
|
|
73
66
|
*
|
|
74
|
-
* @example Default
|
|
67
|
+
* @example Default Databricks paths
|
|
75
68
|
* ```ts
|
|
76
|
-
*
|
|
69
|
+
* databricksWorkspace()
|
|
77
70
|
* ```
|
|
78
71
|
*
|
|
79
|
-
* @example
|
|
72
|
+
* @example Use only explicit paths
|
|
80
73
|
* ```ts
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* path: "/Workspace/Shared/.assistant",
|
|
85
|
-
* skills: ["skills"],
|
|
86
|
-
* },
|
|
87
|
-
* "personal-skills": false,
|
|
88
|
-
* runbooks: { path: "/Workspace/Shared/runbooks/skills", writable: true },
|
|
89
|
-
* volume: { filesystem: myVolumeFilesystem },
|
|
90
|
-
* },
|
|
74
|
+
* databricksWorkspace({
|
|
75
|
+
* assistantPaths: false,
|
|
76
|
+
* paths: ["~/project", "/tmp/project", "/Volumes/main/default/data"],
|
|
91
77
|
* })
|
|
92
78
|
* ```
|
|
93
79
|
*
|
|
94
|
-
* @example
|
|
80
|
+
* @example Build a standard Mastra workspace yourself
|
|
95
81
|
* ```ts
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* mounts: { "/data": myFilesystem },
|
|
100
|
-
* skillPaths: [],
|
|
101
|
-
* }),
|
|
102
|
-
* ],
|
|
82
|
+
* new Workspace({
|
|
83
|
+
* ...databricksWorkspaceConfig({ paths: ["~/project"] }),
|
|
84
|
+
* sandbox: mySandbox,
|
|
103
85
|
* })
|
|
104
86
|
* ```
|
|
105
87
|
*/
|
|
106
|
-
export function
|
|
88
|
+
export function databricksWorkspaceConfig(options = {}) {
|
|
107
89
|
const { id, name } = resolveWorkspaceIdentity(options);
|
|
108
|
-
const
|
|
109
|
-
const
|
|
90
|
+
const filesystemSourceKey = `${id}:${++workspaceSourceSequence}`;
|
|
91
|
+
const paths = resolveDatabricksWorkspacePaths(options);
|
|
92
|
+
const configuredPaths = paths.length;
|
|
110
93
|
const extraSkillPaths = options.extraSkillPaths ?? [];
|
|
111
94
|
const filesCache = pluginRegistry.instance(options.pluginContext, filesCachePlugin)?.exports();
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
95
|
+
const configuredCache = options.cache;
|
|
96
|
+
const mountFilesCache = configuredCache === false ? undefined : filesCache;
|
|
97
|
+
const retainFilesystemSource = mountFilesCache !== undefined &&
|
|
98
|
+
typeof configuredCache !== "function" &&
|
|
99
|
+
paths.every((path) => typeof path !== "function");
|
|
100
|
+
const resolvers = buildMountResolvers(paths, options.mounts, localSkillMountResolvers(extraSkillPaths), mountFilesCache, configuredCache);
|
|
117
101
|
const resolveContribution = contributionResolver(resolvers);
|
|
118
|
-
const resolveFilesystem = (context) => resolveWorkspaceFilesystem(resolveContribution, context, retainFilesystemSource ?
|
|
102
|
+
const resolveFilesystem = (context) => resolveWorkspaceFilesystem(resolveContribution, context, retainFilesystemSource ? mountFilesCache : undefined, filesystemSourceKey);
|
|
119
103
|
const skills = options.skills ??
|
|
120
104
|
(async ({ requestContext }) => {
|
|
121
105
|
const context = { requestContext };
|
|
@@ -123,22 +107,24 @@ export function createWorkspace(options = {}) {
|
|
|
123
107
|
return resolveDistinctSkillPaths(await resolveFilesystem(context), contribution.skillPaths ?? []);
|
|
124
108
|
});
|
|
125
109
|
const checkSkillFileMtime = options.checkSkillFileMtime ?? false;
|
|
126
|
-
const bm25 = options.bm25
|
|
110
|
+
const bm25 = options.bm25 ?? true;
|
|
127
111
|
const sandbox = resolveWorkspaceSandbox(options.sandbox, id, name);
|
|
128
112
|
const tools = workspaceTools(options.tools);
|
|
129
113
|
logger.debug("workspace:create", {
|
|
130
114
|
id,
|
|
131
115
|
name,
|
|
132
116
|
resolverCount: resolvers.length,
|
|
133
|
-
|
|
134
|
-
|
|
117
|
+
configuredPaths,
|
|
118
|
+
customMounts: Object.keys(options.mounts ?? {}).length,
|
|
135
119
|
customSkillsResolver: Boolean(options.skills),
|
|
136
120
|
checkSkillFileMtime,
|
|
137
121
|
bm25,
|
|
138
122
|
extraSkillPaths: extraSkillPaths.length,
|
|
139
123
|
sandbox: sandbox ? sandboxName(options.sandbox) : "disabled",
|
|
140
124
|
});
|
|
141
|
-
const
|
|
125
|
+
const { assistantPaths: _assistantPaths, paths: _paths, mounts: _mounts, skills: _skills, cache: _cache, pluginContext: _pluginContext, sandbox: _sandbox, extraSkillPaths: _extraSkillPaths, ...workspaceOptions } = options;
|
|
126
|
+
return {
|
|
127
|
+
...workspaceOptions,
|
|
142
128
|
id,
|
|
143
129
|
name,
|
|
144
130
|
filesystem: resolveFilesystem,
|
|
@@ -156,64 +142,37 @@ export function createWorkspace(options = {}) {
|
|
|
156
142
|
: {}),
|
|
157
143
|
bm25,
|
|
158
144
|
tools,
|
|
159
|
-
}
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/** Create a native Mastra {@link Workspace} from {@link databricksWorkspaceConfig}. */
|
|
148
|
+
export function databricksWorkspace(options = {}) {
|
|
149
|
+
const workspace = new Workspace(databricksWorkspaceConfig(options));
|
|
150
|
+
databricksWorkspaceOptions.set(workspace, options);
|
|
160
151
|
return workspace;
|
|
161
152
|
}
|
|
153
|
+
/** @internal Bind a caller-created Databricks workspace to its AppKit plugin context. */
|
|
154
|
+
export function bindDatabricksWorkspaceContext(workspace, pluginContext) {
|
|
155
|
+
const options = databricksWorkspaceOptions.get(workspace);
|
|
156
|
+
if (!options || options.pluginContext !== undefined || pluginContext === undefined) {
|
|
157
|
+
return workspace;
|
|
158
|
+
}
|
|
159
|
+
return databricksWorkspace({ ...options, pluginContext });
|
|
160
|
+
}
|
|
162
161
|
/**
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* `assistantSkills: false` drops the defaults, and a `false` value removes one
|
|
166
|
-
* entry by name.
|
|
162
|
+
* Resolve default and caller-provided Databricks paths in priority order.
|
|
167
163
|
*/
|
|
168
|
-
export function
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
merged[name] = folder;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return merged;
|
|
164
|
+
export function resolveDatabricksWorkspacePaths(options = {}) {
|
|
165
|
+
return [
|
|
166
|
+
...(options.assistantPaths === false ? [] : DEFAULT_DATABRICKS_WORKSPACE_PATHS),
|
|
167
|
+
...(options.paths ?? []),
|
|
168
|
+
];
|
|
179
169
|
}
|
|
180
170
|
/* ---------------------------- private helpers ---------------------------- */
|
|
181
|
-
/** Require approval unless a filesystem mutation stays inside a user-owned writable root. */
|
|
182
|
-
function requireApprovalOutsideWritableRoots({ args, requestContext, }) {
|
|
183
|
-
const inputPath = args.path;
|
|
184
|
-
if (typeof inputPath !== "string" || !posixPath.isAbsolute(inputPath))
|
|
185
|
-
return true;
|
|
186
|
-
const normalized = posixPath.normalize(inputPath);
|
|
187
|
-
if (!normalized.ok)
|
|
188
|
-
return true;
|
|
189
|
-
if (posixPath.isWithinRoot(SCRATCH_MOUNT, normalized.path))
|
|
190
|
-
return false;
|
|
191
|
-
const emailValue = requestContext[MASTRA_USER_EMAIL_KEY];
|
|
192
|
-
const email = typeof emailValue === "string" ? stringUtils.trimToNull(emailValue) : undefined;
|
|
193
|
-
if (!email)
|
|
194
|
-
return true;
|
|
195
|
-
return !posixPath.isWithinRoot(personalWorkspacePath(email), normalized.path);
|
|
196
|
-
}
|
|
197
171
|
function workspaceTools(configured) {
|
|
198
|
-
const requireApproval = configured?.requireApproval === undefined
|
|
199
|
-
? { requireApproval: requireApprovalOutsideWritableRoots }
|
|
200
|
-
: {};
|
|
201
|
-
const defaults = {
|
|
202
|
-
[WORKSPACE_TOOLS.FILESYSTEM.WRITE_FILE]: requireApproval,
|
|
203
|
-
[WORKSPACE_TOOLS.FILESYSTEM.EDIT_FILE]: requireApproval,
|
|
204
|
-
[WORKSPACE_TOOLS.FILESYSTEM.AST_EDIT]: requireApproval,
|
|
205
|
-
[WORKSPACE_TOOLS.FILESYSTEM.DELETE]: requireApproval,
|
|
206
|
-
[WORKSPACE_TOOLS.FILESYSTEM.MKDIR]: requireApproval,
|
|
207
|
-
};
|
|
208
|
-
const configuredTools = configured;
|
|
209
|
-
const mergedTools = Object.fromEntries(Object.entries(defaults).map(([name, defaultConfig]) => [
|
|
210
|
-
name,
|
|
211
|
-
{ ...defaultConfig, ...configuredTools?.[name] },
|
|
212
|
-
]));
|
|
213
172
|
return {
|
|
214
|
-
|
|
173
|
+
enabled: true,
|
|
174
|
+
requireApproval: false,
|
|
215
175
|
...configured,
|
|
216
|
-
...mergedTools,
|
|
217
176
|
};
|
|
218
177
|
}
|
|
219
178
|
function resolveWorkspaceSandbox(selection, workspaceId, workspaceName) {
|
|
@@ -314,32 +273,47 @@ function isWorkspaceRoot(root) {
|
|
|
314
273
|
* Gates on workspace file scope (or development mode), then mounts every
|
|
315
274
|
* folder whose location resolves for this request.
|
|
316
275
|
*/
|
|
317
|
-
async function resolveSkillFolderMounts(
|
|
276
|
+
async function resolveSkillFolderMounts(paths, context, filesCache, cacheConfig) {
|
|
318
277
|
const mounts = {};
|
|
319
278
|
const skillPaths = [];
|
|
320
279
|
const requestContext = context.requestContext;
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
reason: !requestContext ? "no-request-context" : "missing-workspace-scope",
|
|
324
|
-
nodeEnv: process.env.NODE_ENV,
|
|
325
|
-
scopes: requestContext?.get(MASTRA_SCOPES_KEY),
|
|
326
|
-
});
|
|
327
|
-
return { mounts, skillPaths };
|
|
328
|
-
}
|
|
329
|
-
const scoped = await resolveFilesCacheScope(context);
|
|
280
|
+
const canMountDatabricks = Boolean(requestContext && shouldMountSkillFolders(requestContext));
|
|
281
|
+
const scoped = canMountDatabricks ? await resolveFilesCacheScope(context) : undefined;
|
|
330
282
|
const client = scoped?.client;
|
|
331
283
|
const fileSystemCache = filesCache && scoped ? await filesCache.forScope(scoped.scope) : undefined;
|
|
332
|
-
for (const [
|
|
333
|
-
const
|
|
284
|
+
for (const [index, path] of paths.entries()) {
|
|
285
|
+
const configured = await resolveDatabricksWorkspacePath(path, context);
|
|
286
|
+
if (!configured)
|
|
287
|
+
continue;
|
|
288
|
+
if (posixPath.isWithinRoot(SCRATCH_MOUNT, configured.path)) {
|
|
289
|
+
const mount = configured.mount ?? configured.path;
|
|
290
|
+
mounts[mount] = userTempFilesystem(context, configured.path);
|
|
291
|
+
if (configured.readable !== false) {
|
|
292
|
+
skillPaths.push(...(configured.skills ?? []).map((path) => mountedSkillPath(mount, path)));
|
|
293
|
+
}
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
if (!canMountDatabricks) {
|
|
297
|
+
logger.debug("workspace-path:skipped", {
|
|
298
|
+
path: configured.path,
|
|
299
|
+
reason: !requestContext ? "no-request-context" : "missing-workspace-scope",
|
|
300
|
+
});
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
const resolved = await resolveSkillFolderFilesystem(configured, context, cacheConfig, {
|
|
334
304
|
client,
|
|
335
305
|
fileSystemCache,
|
|
336
306
|
});
|
|
337
307
|
if (!resolved)
|
|
338
308
|
continue;
|
|
339
|
-
const mount =
|
|
309
|
+
const mount = configured.mount ?? resolved.root;
|
|
310
|
+
if (!mount) {
|
|
311
|
+
logger.debug("workspace-path:skipped", { index, reason: "missing-mount" });
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
340
314
|
mounts[mount] = resolved.filesystem;
|
|
341
|
-
if (
|
|
342
|
-
skillPaths.push(...(
|
|
315
|
+
if (configured.readable !== false) {
|
|
316
|
+
skillPaths.push(...(configured.skills ?? ["."]).map((path) => mountedSkillPath(mount, path)));
|
|
343
317
|
}
|
|
344
318
|
}
|
|
345
319
|
logger.debug("skill-folders:mounted", {
|
|
@@ -351,45 +325,117 @@ async function resolveSkillFolderMounts(skillFolders, context, filesCache) {
|
|
|
351
325
|
skillPaths,
|
|
352
326
|
};
|
|
353
327
|
}
|
|
328
|
+
async function resolveDatabricksWorkspacePath(value, context) {
|
|
329
|
+
const selected = typeof value === "function" ? await value(context) : value;
|
|
330
|
+
if (selected === false || selected === undefined)
|
|
331
|
+
return undefined;
|
|
332
|
+
const configured = typeof selected === "string" ? { path: selected } : selected;
|
|
333
|
+
const requestContext = requestContextValues(context.requestContext);
|
|
334
|
+
const resolvedPath = resolveHomePath(configured.path, requestContext);
|
|
335
|
+
if (!resolvedPath)
|
|
336
|
+
return undefined;
|
|
337
|
+
const resolvedMount = resolveHomePath(configured.mount, requestContext);
|
|
338
|
+
return {
|
|
339
|
+
...configured,
|
|
340
|
+
path: resolvedPath,
|
|
341
|
+
...(resolvedMount ? { mount: resolvedMount } : {}),
|
|
342
|
+
};
|
|
343
|
+
}
|
|
354
344
|
/**
|
|
355
345
|
* Resolve one skill folder to a Mastra filesystem, or `undefined` to skip it
|
|
356
346
|
* for this request.
|
|
357
347
|
*/
|
|
358
|
-
async function resolveSkillFolderFilesystem(
|
|
359
|
-
if (folder.filesystem !== undefined) {
|
|
360
|
-
const filesystem = await resolveSkillFolderValue(folder.filesystem, context);
|
|
361
|
-
return filesystem
|
|
362
|
-
? {
|
|
363
|
-
filesystem,
|
|
364
|
-
}
|
|
365
|
-
: undefined;
|
|
366
|
-
}
|
|
348
|
+
async function resolveSkillFolderFilesystem(folder, context, cacheConfig, cache) {
|
|
367
349
|
// A path mount needs the request's OBO client to reach the workspace.
|
|
368
|
-
if (
|
|
350
|
+
if (!cache.client) {
|
|
369
351
|
logger.debug("skill-folder:skipped", {
|
|
370
|
-
|
|
371
|
-
reason:
|
|
352
|
+
path: folder.path,
|
|
353
|
+
reason: "missing-obo-client",
|
|
372
354
|
});
|
|
373
355
|
return undefined;
|
|
374
356
|
}
|
|
375
|
-
const root = stringUtils.trimToNull(
|
|
357
|
+
const root = stringUtils.trimToNull(folder.path);
|
|
376
358
|
if (!root)
|
|
377
359
|
return undefined;
|
|
378
360
|
const writable = folder.writable ?? isWorkspaceRoot(root);
|
|
379
|
-
const
|
|
361
|
+
const cacheOptions = cache.fileSystemCache
|
|
362
|
+
? await resolveFileCacheOptions(cacheConfig, context, root, folder.readable === false ? [] : (folder.skills ?? ["."]))
|
|
363
|
+
: undefined;
|
|
364
|
+
const resolved = await databricksFilesystem(cache.client, root, !writable, folder.createRoot ?? folder.writable === true, cache.fileSystemCache, cacheOptions, {
|
|
380
365
|
...(folder.description ? { description: folder.description } : {}),
|
|
381
366
|
...(folder.displayName ? { displayName: folder.displayName } : {}),
|
|
382
367
|
});
|
|
383
368
|
return resolved ? { ...resolved, root } : undefined;
|
|
384
369
|
}
|
|
385
|
-
|
|
386
|
-
function
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
370
|
+
async function resolveCacheConfig(value, context) {
|
|
371
|
+
return typeof value === "function" ? value(context) : value;
|
|
372
|
+
}
|
|
373
|
+
function requestContextValues(requestContext) {
|
|
374
|
+
return requestContext?.toJSON() ?? {};
|
|
375
|
+
}
|
|
376
|
+
function resolveHomePath(input, requestContext) {
|
|
377
|
+
const value = stringUtils.trimToNull(input);
|
|
378
|
+
if (!value || (value !== "~" && !value.startsWith("~/")))
|
|
379
|
+
return value ?? undefined;
|
|
380
|
+
const emailValue = requestContext[MASTRA_USER_EMAIL_KEY];
|
|
381
|
+
const email = typeof emailValue === "string" ? stringUtils.trimToNull(emailValue) : undefined;
|
|
382
|
+
if (!email)
|
|
383
|
+
return undefined;
|
|
384
|
+
const home = personalWorkspacePath(email);
|
|
385
|
+
return value === "~" ? home : `${home}/${value.slice(2)}`;
|
|
386
|
+
}
|
|
387
|
+
function toPolicyArray(value) {
|
|
388
|
+
if (value === undefined)
|
|
389
|
+
return [];
|
|
390
|
+
return Array.isArray(value) ? value : [value];
|
|
391
|
+
}
|
|
392
|
+
function cacheFilterMatches(policy, operation, path, requestContext, root) {
|
|
393
|
+
const operations = toPolicyArray(policy.operations ?? CACHEABLE_FILESYSTEM_OPERATIONS);
|
|
394
|
+
if (!operations.includes(operation))
|
|
395
|
+
return false;
|
|
396
|
+
if (policy.paths === undefined)
|
|
397
|
+
return true;
|
|
398
|
+
const inputs = [];
|
|
399
|
+
for (const input of toPolicyArray(policy.paths)) {
|
|
400
|
+
if (typeof input !== "string") {
|
|
401
|
+
inputs.push(input);
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
const expanded = resolveHomePath(input, requestContext);
|
|
405
|
+
if (!expanded)
|
|
406
|
+
continue;
|
|
407
|
+
inputs.push(!root || posixPath.isAbsolute(expanded) || expanded.startsWith("**")
|
|
408
|
+
? expanded
|
|
409
|
+
: `${posixPath.normalizeRoot(root)}/${expanded.replace(/^\.\//, "")}`);
|
|
410
|
+
}
|
|
411
|
+
return inputs.length > 0 && match.toPathMatcher(...inputs)(path);
|
|
412
|
+
}
|
|
413
|
+
async function resolveFileCacheOptions(configured, context, root, skillPaths) {
|
|
414
|
+
const requestContext = requestContextValues(context.requestContext);
|
|
415
|
+
const resolved = await resolveCacheConfig(configured, context);
|
|
416
|
+
if (resolved === false)
|
|
417
|
+
return undefined;
|
|
418
|
+
if (resolved === undefined || resolved === true) {
|
|
419
|
+
const roots = skillPaths.map((path) => mountedSkillPath(root, path));
|
|
420
|
+
return {
|
|
421
|
+
operations: CACHEABLE_FILESYSTEM_OPERATIONS,
|
|
422
|
+
filter: (operation, path) => operation !== "readFile" ||
|
|
423
|
+
roots.some((skillRoot) => posixPath.isWithinRoot(skillRoot, path)),
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
const policies = toPolicyArray(resolved);
|
|
427
|
+
if (policies.length === 0)
|
|
428
|
+
return undefined;
|
|
429
|
+
const operations = [
|
|
430
|
+
...new Set(policies.flatMap((policy) => toPolicyArray(policy.operations ?? CACHEABLE_FILESYSTEM_OPERATIONS))),
|
|
431
|
+
];
|
|
432
|
+
return {
|
|
433
|
+
operations,
|
|
434
|
+
filter: (operation, path) => policies.some((policy) => cacheFilterMatches(policy, operation, path, requestContext, root)),
|
|
435
|
+
};
|
|
390
436
|
}
|
|
391
437
|
/**
|
|
392
|
-
* Fill in `id` and `name` when either is omitted on {@link
|
|
438
|
+
* Fill in `id` and `name` when either is omitted on {@link DatabricksWorkspaceOptions}.
|
|
393
439
|
* Slugifies `name` into `id`; tokenizes `id` into a display `name`.
|
|
394
440
|
*/
|
|
395
441
|
function resolveWorkspaceIdentity(options) {
|
|
@@ -404,26 +450,40 @@ function resolveWorkspaceIdentity(options) {
|
|
|
404
450
|
return { id, name };
|
|
405
451
|
}
|
|
406
452
|
/** Collect the skill-folder resolver and any caller-supplied ones. */
|
|
407
|
-
function buildMountResolvers(
|
|
408
|
-
const resolvers = [
|
|
409
|
-
const
|
|
410
|
-
if (
|
|
411
|
-
resolvers.push((context) => resolveSkillFolderMounts(
|
|
412
|
-
}
|
|
413
|
-
if (mounts?.length) {
|
|
414
|
-
resolvers.push(...mounts);
|
|
453
|
+
function buildMountResolvers(paths, mounts, localMounts, filesCache, cacheConfig) {
|
|
454
|
+
const resolvers = [];
|
|
455
|
+
const pathCount = paths.length;
|
|
456
|
+
if (pathCount > 0) {
|
|
457
|
+
resolvers.push((context) => resolveSkillFolderMounts(paths, context, filesCache, cacheConfig));
|
|
415
458
|
}
|
|
459
|
+
if (mounts && Object.keys(mounts).length > 0)
|
|
460
|
+
resolvers.push(() => ({ mounts }));
|
|
461
|
+
resolvers.push(...localMounts);
|
|
416
462
|
logger.debug("mounts:resolvers", {
|
|
417
|
-
|
|
418
|
-
|
|
463
|
+
pathCount,
|
|
464
|
+
customMountCount: Object.keys(mounts ?? {}).length,
|
|
465
|
+
localMountCount: localMounts.length,
|
|
419
466
|
totalResolverCount: resolvers.length,
|
|
420
467
|
});
|
|
421
468
|
return resolvers;
|
|
422
469
|
}
|
|
423
|
-
/**
|
|
424
|
-
function
|
|
425
|
-
|
|
426
|
-
|
|
470
|
+
/** Stable user-scoped local storage under the host operating system's temp directory. */
|
|
471
|
+
function userTempFilesystem(context, workspacePath) {
|
|
472
|
+
const userKey = resolveUserKey(context.requestContext);
|
|
473
|
+
const digest = createHash("sha256")
|
|
474
|
+
.update(object.toStableKey({ package: "@dbx-tools/appkit-mastra", userKey }))
|
|
475
|
+
.digest("hex")
|
|
476
|
+
.slice(0, 16);
|
|
477
|
+
const normalized = posixPath.normalizeRoot(workspacePath);
|
|
478
|
+
const relative = normalized === SCRATCH_MOUNT ? "" : normalized.slice(`${SCRATCH_MOUNT}/`.length);
|
|
479
|
+
const source = new LocalFileSystem({
|
|
480
|
+
root: join(tmpdir(), "dbx-tools", "mastra", digest, relative),
|
|
481
|
+
readOnly: false,
|
|
482
|
+
createRoot: true,
|
|
483
|
+
});
|
|
484
|
+
return filesystems(source, {
|
|
485
|
+
displayName: "Temporary Files",
|
|
486
|
+
description: "User-scoped temporary files retained while the host keeps its ephemeral temp storage.",
|
|
427
487
|
});
|
|
428
488
|
}
|
|
429
489
|
/** Mount startup-provisioned local skill roots into Mastra's workspace filesystem. */
|
|
@@ -453,33 +513,20 @@ function shouldMountSkillFolders(requestContext) {
|
|
|
453
513
|
return true;
|
|
454
514
|
return hasWorkspaceFileScope(requestContext);
|
|
455
515
|
}
|
|
456
|
-
/** Read the trimmed OBO user email stamped on {@link MASTRA_USER_EMAIL_KEY}. */
|
|
457
|
-
function resolveScopedEmail(requestContext) {
|
|
458
|
-
return stringUtils.trimToNull(requestContext?.get(MASTRA_USER_EMAIL_KEY)) ?? undefined;
|
|
459
|
-
}
|
|
460
516
|
/**
|
|
461
517
|
* Wrap a {@link DatabricksFileSystem} as a Mastra filesystem. Missing or
|
|
462
|
-
* inaccessible roots return `undefined` so
|
|
463
|
-
*
|
|
518
|
+
* inaccessible roots return `undefined` so other accessible roots remain
|
|
519
|
+
* usable.
|
|
464
520
|
*/
|
|
465
|
-
async function databricksFilesystem(client, root, readOnly = true, createRoot = !readOnly, fileSystemCache,
|
|
466
|
-
const initialClient = workspaceClient.toLegacyWorkspaceClient(client);
|
|
521
|
+
async function databricksFilesystem(client, root, readOnly = true, createRoot = !readOnly, fileSystemCache, cacheOptions, adapterOptions = {}) {
|
|
467
522
|
const fs = new DatabricksFileSystem({
|
|
468
|
-
client: () =>
|
|
469
|
-
try {
|
|
470
|
-
return workspaceClient.toLegacyWorkspaceClient(getExecutionContext().client);
|
|
471
|
-
}
|
|
472
|
-
catch {
|
|
473
|
-
return initialClient;
|
|
474
|
-
}
|
|
475
|
-
},
|
|
523
|
+
client: () => workspaceClient.toLegacyWorkspaceClient(requestWorkspaceClient(client)),
|
|
476
524
|
root,
|
|
477
525
|
readOnly,
|
|
478
526
|
createRoot,
|
|
479
527
|
});
|
|
480
|
-
const
|
|
481
|
-
|
|
482
|
-
: fs;
|
|
528
|
+
const cached = fileSystemCache && cacheOptions ? sharedFS.cache(fs, fileSystemCache, cacheOptions) : fs;
|
|
529
|
+
const source = verifyFirstFileSystemAccess(cached, () => fs.stat("."), root);
|
|
483
530
|
const filesystem = filesystems(source, { ...adapterOptions, readOnly });
|
|
484
531
|
try {
|
|
485
532
|
await filesystem.init();
|
|
@@ -496,6 +543,84 @@ async function databricksFilesystem(client, root, readOnly = true, createRoot =
|
|
|
496
543
|
}
|
|
497
544
|
return undefined;
|
|
498
545
|
}
|
|
546
|
+
/** @internal Keep service context from replacing the request-scoped workspace client. */
|
|
547
|
+
export function requestWorkspaceClient(initialClient, executionContext = appkit.tryGetExecutionContext()) {
|
|
548
|
+
if (executionContext &&
|
|
549
|
+
"isUserContext" in executionContext &&
|
|
550
|
+
executionContext.isUserContext === true) {
|
|
551
|
+
return executionContext.client;
|
|
552
|
+
}
|
|
553
|
+
return initialClient;
|
|
554
|
+
}
|
|
555
|
+
function verifyFirstFileSystemAccess(filesystem, readProbe, root) {
|
|
556
|
+
let readCheck;
|
|
557
|
+
let writeVerified = false;
|
|
558
|
+
const boundMethods = new Map();
|
|
559
|
+
const readOperations = new Set(["exists", "readFile", "readdir", "stat"]);
|
|
560
|
+
const writeOperations = new Set([
|
|
561
|
+
"appendFile",
|
|
562
|
+
"copyFile",
|
|
563
|
+
"deleteFile",
|
|
564
|
+
"mkdir",
|
|
565
|
+
"moveFile",
|
|
566
|
+
"rmdir",
|
|
567
|
+
"writeFile",
|
|
568
|
+
]);
|
|
569
|
+
const verifyRead = async () => {
|
|
570
|
+
readCheck ??= Promise.resolve(readProbe()).then(() => undefined);
|
|
571
|
+
try {
|
|
572
|
+
await readCheck;
|
|
573
|
+
}
|
|
574
|
+
catch (error) {
|
|
575
|
+
readCheck = undefined;
|
|
576
|
+
logger.debug("databricks-mount:read-check-failed", {
|
|
577
|
+
root,
|
|
578
|
+
error: errorUtils.errorMessage(error),
|
|
579
|
+
});
|
|
580
|
+
throw error;
|
|
581
|
+
}
|
|
582
|
+
};
|
|
583
|
+
return new Proxy(filesystem, {
|
|
584
|
+
get(target, property) {
|
|
585
|
+
const value = Reflect.get(target, property, target);
|
|
586
|
+
if (typeof value !== "function")
|
|
587
|
+
return value;
|
|
588
|
+
if (boundMethods.has(property))
|
|
589
|
+
return boundMethods.get(property);
|
|
590
|
+
const delegated = value.bind(target);
|
|
591
|
+
let method = delegated;
|
|
592
|
+
if (readOperations.has(property)) {
|
|
593
|
+
method = async (...args) => {
|
|
594
|
+
await verifyRead();
|
|
595
|
+
return delegated(...args);
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
else if (writeOperations.has(property)) {
|
|
599
|
+
method = async (...args) => {
|
|
600
|
+
try {
|
|
601
|
+
const result = await delegated(...args);
|
|
602
|
+
if (!writeVerified) {
|
|
603
|
+
writeVerified = true;
|
|
604
|
+
logger.debug("databricks-mount:write-check-passed", { root });
|
|
605
|
+
}
|
|
606
|
+
return result;
|
|
607
|
+
}
|
|
608
|
+
catch (error) {
|
|
609
|
+
if (!writeVerified) {
|
|
610
|
+
logger.debug("databricks-mount:write-check-failed", {
|
|
611
|
+
root,
|
|
612
|
+
error: errorUtils.errorMessage(error),
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
throw error;
|
|
616
|
+
}
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
boundMethods.set(property, method);
|
|
620
|
+
return method;
|
|
621
|
+
},
|
|
622
|
+
});
|
|
623
|
+
}
|
|
499
624
|
/**
|
|
500
625
|
* Run every mount resolver for one request and merge mounts plus skill paths.
|
|
501
626
|
* Later resolvers overwrite mount keys from earlier ones.
|
|
@@ -527,17 +652,19 @@ async function resolveWorkspaceContribution(resolvers, context) {
|
|
|
527
652
|
/**
|
|
528
653
|
* Dynamic filesystem resolver passed to Mastra {@link Workspace}.
|
|
529
654
|
*
|
|
530
|
-
* Returns a {@link CompositeFilesystem}
|
|
531
|
-
*
|
|
655
|
+
* Returns a {@link CompositeFilesystem} over every path that resolved for the
|
|
656
|
+
* request. An empty composite exposes no implicit local storage.
|
|
532
657
|
*/
|
|
533
|
-
async function resolveWorkspaceFilesystem(resolveContribution, context, filesCache) {
|
|
658
|
+
async function resolveWorkspaceFilesystem(resolveContribution, context, filesCache, sourceKey) {
|
|
534
659
|
const { mounts } = await resolveContribution(context);
|
|
535
660
|
const mountKeys = Object.keys(mounts);
|
|
536
661
|
if (mountKeys.length === 0) {
|
|
537
|
-
logger.debug("filesystem:
|
|
662
|
+
logger.debug("filesystem:empty", {
|
|
538
663
|
hasRequestContext: Boolean(context.requestContext),
|
|
539
664
|
});
|
|
540
|
-
return
|
|
665
|
+
return filesystems(new MemoryFileSystem({ root: "/", readOnly: true }), {
|
|
666
|
+
readOnly: true,
|
|
667
|
+
});
|
|
541
668
|
}
|
|
542
669
|
logger.debug("filesystem:composite", { mountKeys });
|
|
543
670
|
const load = () => new MountedCompositeFilesystem({ mounts });
|
|
@@ -546,12 +673,12 @@ async function resolveWorkspaceFilesystem(resolveContribution, context, filesCac
|
|
|
546
673
|
const scoped = await resolveFilesCacheScope(context);
|
|
547
674
|
if (!scoped)
|
|
548
675
|
return load();
|
|
549
|
-
return filesCache.forFileSystem(scoped.scope, { paths: mountKeys }, load);
|
|
676
|
+
return filesCache.forFileSystem(scoped.scope, { paths: mountKeys, key: sourceKey }, load);
|
|
550
677
|
}
|
|
551
678
|
/**
|
|
552
679
|
* Expand skill roots into concrete skill directories and keep the first
|
|
553
680
|
* same-named directory. Mastra still owns parsing, indexing, and refreshes,
|
|
554
|
-
* while
|
|
681
|
+
* while earlier configured roots retain precedence over later roots.
|
|
555
682
|
*/
|
|
556
683
|
async function resolveDistinctSkillPaths(filesystem, roots) {
|
|
557
684
|
const selected = new Map();
|
|
@@ -596,4 +723,4 @@ function contributionResolver(resolvers) {
|
|
|
596
723
|
return pending;
|
|
597
724
|
};
|
|
598
725
|
}
|
|
599
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsVUFBVSxJQUFJLGdCQUFnQixHQUcvQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckYsT0FBTyxFQUFFLEVBQUUsSUFBSSxRQUFRLEVBQUUsU0FBUyxFQUF3QixNQUFNLHNCQUFzQixDQUFDO0FBRXZGLE9BQU8sRUFDTCxlQUFlLEVBQ2YsU0FBUyxHQVFWLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsZUFBZSxFQUNmLGNBQWMsR0FFZixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsV0FBVyxFQUNYLDBCQUEwQixFQUMxQixpQkFBaUIsR0FFbEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUEwQyxNQUFNLGNBQWMsQ0FBQztBQUN6RixPQUFPLEVBQUUsMkJBQTJC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SSxRQUF5RCxDQUFDO0lBQzlELE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzVCLFFBQVEsS0FBSyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUQsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELElBQUksUUFBUTtZQUFFLE9BQU8sUUFBUSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFzdHJhIHdvcmtzcGFjZSBmYWN0b3J5IGZvciBEYXRhYnJpY2tzIEFwcHMuXG4gKlxuICogQnVpbGRzIGEge0BsaW5rIFdvcmtzcGFjZX0gd2l0aCBEYXRhYnJpY2tzIFNhbmRib3ggY29tbWFuZCBleGVjdXRpb24sIGFuXG4gKiBpc29sYXRlZCBgL3RtcGAgc2NyYXRjaCBtb3VudCwgYW5kIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IG92ZXIgdGhlXG4gKiBuYW1lZCBza2lsbCBmb2xkZXJzXG4gKiByZXNvbHZlZCBmb3IgdGhhdCByZXF1ZXN0LiBBIHNraWxsIGZvbGRlciBtYXBzIGEgbmFtZSB0byBhIGxvY2F0aW9uIHBsdXMgaXRzXG4gKiByZWFkYWJsZSAvIHdyaXRhYmxlIHBvbGljeTogYSBEYXRhYnJpY2tzIHBhdGggbW91bnRlZCB0aHJvdWdoIHRoZSBPQk8gY2xpZW50XG4gKiBvbiB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfSwgb3IgYW55IHtAbGluayBXb3Jrc3BhY2VGaWxlc3lzdGVtfSBhIGNvbnN1bWluZ1xuICogbGlicmFyeSBhbHJlYWR5IG93bnMuIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9IHN1cHBsaWVzIHRoZSBBc3Npc3RhbnRcbiAqIHRyZWVzLCBhbmQgYHNraWxsRm9sZGVyc2AgbWVyZ2VzIG92ZXIgaXQgLSBzYW1lIG5hbWUgb3ZlcnJpZGVzLCBgZmFsc2VgXG4gKiBkaXNhYmxlcywgYSBuZXcgbmFtZSBhZGRzLiBPcHRpb25hbCBtb3VudCByZXNvbHZlcnMgY29udHJpYnV0ZSBmdXJ0aGVyXG4gKiBmaWxlc3lzdGVtcyBhbmQgc2tpbGwgc2NhbiByb290cyBvbiB0b3AuXG4gKlxuICogRGF0YWJyaWNrcyBtb3VudHMgdXNlIGBAZGJ4LXRvb2xzL2RhdGFicmlja3NgIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbX1cbiAqIHdyYXBwZWQgYnkge0BsaW5rIGZpbGVzeXN0ZW1zfTsgaW5hY2Nlc3NpYmxlIHJvb3RzIGFyZSBza2lwcGVkIGluZGVwZW5kZW50bHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgY3JlYXRlV29ya3NwYWNlQ2xpZW50LCBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW5SZWdpc3RyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgZmlsZXNDYWNoZSBhcyBmaWxlc0NhY2hlUGx1Z2luLFxuICB0eXBlIEZpbGVzQ2FjaGVFeHBvcnRzLFxuICB0eXBlIEZpbGVzQ2FjaGVTY29wZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L2ZpbGVzLWNhY2hlXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSwgd29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscywgdG9rZW4gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZnMgYXMgc2hhcmVkRlMsIHBvc2l4UGF0aCwgdHlwZSBGaWxlU3lzdGVtQ2FjaGUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZnNcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgV09SS1NQQUNFX1RPT0xTLFxuICBXb3Jrc3BhY2UsXG4gIHR5cGUgU2tpbGxzUmVzb2x2ZXIsXG4gIHR5cGUgV29ya3NwYWNlRmlsZXN5c3RlbSxcbiAgdHlwZSBXb3Jrc3BhY2VTYW5kYm94LFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcixcbiAgdHlwZSBUb29sQ29uZmlnV2l0aEFyZ3NDb250ZXh0LFxuICB0eXBlIFdvcmtzcGFjZVRvb2xDb25maWcsXG4gIHR5cGUgV29ya3NwYWNlVG9vbHNDb25maWcsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvd29ya3NwYWNlXCI7XG5cbmltcG9ydCB7XG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgcmVzb2x2ZVVzZXJLZXksXG4gIHR5cGUgVXNlcixcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQge1xuICBmaWxlc3lzdGVtcyxcbiAgTW91bnRlZENvbXBvc2l0ZUZpbGVzeXN0ZW0sXG4gIHNjcmF0Y2hGaWxlc3lzdGVtLFxuICB0eXBlIE1hc3RyYUZpbGVTeXN0ZW1BZGFwdGVyT3B0aW9ucyxcbn0gZnJvbSBcIi4vZmlsZXN5c3RlbXMudHNcIjtcbmltcG9ydCB7IE1vbnR5U2FuZGJveCB9IGZyb20gXCIuL21vbnR5LXNhbmRib3gudHNcIjtcbmltcG9ydCB7IERhdGFicmlja3NTYW5kYm94LCB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NhbmRib3gudHNcIjtcbmltcG9ydCB7IE9SR0FOSVpBVElPTl9BU1NJU1RBTlRfUEFUSCwgcGVyc29uYWxXb3Jrc3BhY2VQYXRoIH0gZnJvbSBcIi4vc2tpbGwtcGF0aHMudHNcIjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIE9BdXRoIHNjb3BlcyB0aGF0IGdhdGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgZmlsZSBtb3VudHMuICovXG5jb25zdCBXT1JLU1BBQ0VfRklMRV9TQ09QRVMgPSBbXCJ3b3Jrc3BhY2VcIiwgXCJ3b3Jrc3BhY2Uud29ya3NwYWNlXCIsIFwiYWxsLWFwaXNcIl0gYXMgY29uc3Q7XG5jb25zdCBTQ1JBVENIX01PVU5UID0gXCIvdG1wXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvd29ya3NwYWNlc1wiKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIFBlci1yZXF1ZXN0IGNvbnRleHQgZm9yIG1vdW50IGFuZCBza2lsbC1mb2xkZXIgcmVzb2x2ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3Jrc3BhY2VNb3VudENvbnRleHQge1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xufVxuXG4vKipcbiAqIEEgc2tpbGwtZm9sZGVyIGZpZWxkIGdpdmVuIGVpdGhlciBkaXJlY3RseSBvciBhcyBhIHBlci1yZXF1ZXN0IHJlc29sdmVyLlxuICogQSByZXNvbHZlciByZXR1cm5pbmcgYHVuZGVmaW5lZGAgc2tpcHMgdGhlIGZvbGRlciBmb3IgdGhhdCByZXF1ZXN0LlxuICovXG5leHBvcnQgdHlwZSBTa2lsbEZvbGRlclZhbHVlPFQ+ID1cbiAgVCB8ICgoY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0KSA9PiBUIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxUIHwgdW5kZWZpbmVkPik7XG5cbi8qKlxuICogT25lIG5hbWVkIHNraWxsLWZvbGRlciBsb2NhdGlvbiBhbmQgaXRzIHJlYWQgLyB3cml0ZSBwb2xpY3kuXG4gKlxuICogR2l2ZSB7QGxpbmsgcGF0aH0gZm9yIGEgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgdHJlZSAobW91bnRlZCB0aHJvdWdoIHRoZVxuICogcmVxdWVzdCdzIE9CTyBjbGllbnQpLCBvciB7QGxpbmsgZmlsZXN5c3RlbX0gZm9yIGEgbW91bnQgdGhlIGNvbnN1bWVyIGJ1aWxkc1xuICogaXRzZWxmLiB7QGxpbmsgZmlsZXN5c3RlbX0gd2lucyB3aGVuIGJvdGggYXJlIHNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTa2lsbEZvbGRlck9wdGlvbnMge1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2Ugcm9vdCBtb3VudGVkIGF0IGl0cyBhY3R1YWwgcGF0aC4gKi9cbiAgcGF0aD86IFNraWxsRm9sZGVyVmFsdWU8c3RyaW5nPjtcbiAgLyoqIFJlYWR5LW1hZGUgbW91bnQsIGZvciBsb2NhdGlvbnMgdGhlIE9CTyBjbGllbnQgY2Fubm90IHJlYWNoLiAqL1xuICBmaWxlc3lzdGVtPzogU2tpbGxGb2xkZXJWYWx1ZTxXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIEh1bWFuLWZyaWVuZGx5IG1vdW50IG5hbWUgc2hvd24gaW4gZmlsZXN5c3RlbSBsaXN0aW5ncy4gKi9cbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBNb3VudCBkZXNjcmlwdGlvbiBzaG93biBpbiBmaWxlc3lzdGVtIGxpc3RpbmdzIGFuZCB3b3Jrc3BhY2UgaW5zdHJ1Y3Rpb25zLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFNjYW4gdGhpcyBtb3VudCBmb3IgYFNLSUxMLm1kYCBmaWxlcy4gRGVmYXVsdHMgdG8gYHRydWVgOyBgZmFsc2VgIG1vdW50c1xuICAgKiB0aGUgbG9jYXRpb24gZm9yIGZpbGUgdG9vbHMgd2l0aG91dCBhZGRpbmcgaXQgdG8gc2tpbGwgZGlzY292ZXJ5LlxuICAgKi9cbiAgcmVhZGFibGU/OiBib29sZWFuO1xuICAvKipcbiAgICogU2tpbGwgcm9vdHMgcmVsYXRpdmUgdG8gdGhpcyBmaWxlc3lzdGVtIHJvb3QuIERlZmF1bHRzIHRvIGBbXCIuXCJdYC5cbiAgICogRWFjaCBwYXRoIGlzIGpvaW5lZCB0byB0aGUgYWN0dWFsIG1vdW50IHBhdGggYmVmb3JlIE1hc3RyYSBzY2FucyBpdC5cbiAgICovXG4gIHNraWxscz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogQWxsb3cgd3JpdGUgYXR0ZW1wdHMgdG8gYSB7QGxpbmsgcGF0aH0gbW91bnQuIERlZmF1bHRzIHRvIGB0cnVlYCBmb3JcbiAgICogYC9Xb3Jrc3BhY2VgIHJvb3RzIGFuZCBgZmFsc2VgIGVsc2V3aGVyZS4gRGF0YWJyaWNrcyBwZXJtaXNzaW9ucyBzdGlsbFxuICAgKiBkZXRlcm1pbmUgd2hldGhlciBlYWNoIG11dGF0aW9uIHN1Y2NlZWRzLlxuICAgKi9cbiAgd3JpdGFibGU/OiBib29sZWFuO1xuICAvKipcbiAgICogQ3JlYXRlIGEgd3JpdGFibGUge0BsaW5rIHBhdGh9IHJvb3Qgd2hlbiBtaXNzaW5nLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgd3JpdGFibGV9OyBzZXQgYGZhbHNlYCBmb3IgcHJlLWV4aXN0aW5nIHJvb3RzIHdpdGggY29uZGl0aW9uYWwgYWNjZXNzLlxuICAgKi9cbiAgY3JlYXRlUm9vdD86IGJvb2xlYW47XG4gIC8qKiBNb3VudCBwb2ludCBpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZS4gRGF0YWJyaWNrcyBwYXRocyBkZWZhdWx0IHRvIHRoZWlyIGFjdHVhbCByb290LiAqL1xuICBtb3VudD86IHN0cmluZztcbn1cblxuLyoqIE1vdW50IG1hcCBwbHVzIG9wdGlvbmFsIE1hc3RyYSBza2lsbCBzY2FuIHJvb3RzIGZvciBvbmUgcmVzb2x2ZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHtcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIFBhdGhzIHdpdGhpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZSB3aGVyZSBgU0tJTEwubWRgIGZpbGVzIGFyZSBzY2FubmVkLiAqL1xuICBza2lsbFBhdGhzPzogc3RyaW5nW107XG59XG5cbi8qKiBDb250cmlidXRlcyBmaWxlc3lzdGVtIG1vdW50cyAoYW5kIG9wdGlvbmFsIHNraWxsIHBhdGhzKSBmb3Igb25lIHJlcXVlc3QuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VNb3VudFJlc29sdmVyID0gKFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pID0+IFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj47XG5cbi8qKiBOYW1lcyBjYXJyaWVkIGJ5IHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9LiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFNraWxsRm9sZGVyTmFtZSA9IFwib3JnYW5pemF0aW9uLXNraWxsc1wiIHwgXCJwZXJzb25hbC1za2lsbHNcIjtcblxuLyoqXG4gKiBTYW5kYm94IHNlbGVjdGlvbiBmb3Ige0BsaW5rIGNyZWF0ZVdvcmtzcGFjZX0uIERhdGFicmlja3MgaXMgdGhlIGRlZmF1bHQ7XG4gKiBgZmFsc2VgIGRpc2FibGVzIGNvbW1hbmQgZXhlY3V0aW9uLCBhbmQgYSBNYXN0cmEgcHJvdmlkZXIgb3IgcmVzb2x2ZXIgaXMgYW5cbiAqIGV4cGxpY2l0IHJlcGxhY2VtZW50LlxuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uID1cbiAgfCBmYWxzZVxuICB8IFwiZGF0YWJyaWNrc1wiXG4gIHwgXCJtb250eVwiXG4gIHwgRGF0YWJyaWNrc1dvcmtzcGFjZVNhbmRib3hPcHRpb25zXG4gIHwgV29ya3NwYWNlU2FuZGJveFxuICB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zIHtcbiAgLyoqIFdvcmtzcGFjZSBpZDsgZGVyaXZlZCBmcm9tIGBuYW1lYCBvciBgXCJ3b3Jrc3BhY2VcImAgd2hlbiBvbWl0dGVkLiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIERpc3BsYXkgbmFtZTsgZGVyaXZlZCBmcm9tIGBpZGAgd2hlbiBvbWl0dGVkLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogU3RhcnQgZnJvbSB7QGxpbmsgREVGQVVMVF9TS0lMTF9GT0xERVJTfS4gRGVmYXVsdHMgdG8gYHRydWVgOyBgZmFsc2VgXG4gICAqIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IG1hcCwgbGVhdmluZyBvbmx5IHRoZSB7QGxpbmsgc2tpbGxGb2xkZXJzfSBnaXZlbiBoZXJlLlxuICAgKi9cbiAgYXNzaXN0YW50U2tpbGxzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE5hbWVkIHNraWxsIGZvbGRlcnMgbWVyZ2VkIG92ZXIge0BsaW5rIERFRkFVTFRfU0tJTExfRk9MREVSU306IGEgbWF0Y2hpbmdcbiAgICogbmFtZSBvdmVycmlkZXMgdGhhdCBkZWZhdWx0LCBgZmFsc2VgIGRpc2FibGVzIGl0LCBhbmQgYW55IG90aGVyIG5hbWUgYWRkc1xuICAgKiBhIGZvbGRlci5cbiAgICovXG4gIHNraWxsRm9sZGVycz86IFJlY29yZDxzdHJpbmcsIFNraWxsRm9sZGVyT3B0aW9ucyB8IGZhbHNlPjtcbiAgLyoqIEV4dHJhIHBlci1yZXF1ZXN0IG1vdW50IHJlc29sdmVycyAocnVuIGFmdGVyIHRoZSBza2lsbC1mb2xkZXIgbW91bnRzKS4gKi9cbiAgbW91bnRzPzogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdO1xuICAvKiogUmVwbGFjZSB0aGUgYXV0by1idWlsdCBkeW5hbWljIHNraWxscyByZXNvbHZlci4gKi9cbiAgc2tpbGxzPzogU2tpbGxzUmVzb2x2ZXI7XG4gIC8qKiBGb3J3YXJkZWQgdG8gTWFzdHJhIHdoZW4gc2tpbGwgZGlzY292ZXJ5IGlzIGVuYWJsZWQuICovXG4gIGNoZWNrU2tpbGxGaWxlTXRpbWU/OiBib29sZWFuO1xuICAvKiogQWRkaXRpb25hbCBuYXRpdmUgTWFzdHJhIHdvcmtzcGFjZSB0b29sIGNvbmZpZ3VyYXRpb24gYW5kIG92ZXJyaWRlcy4gKi9cbiAgdG9vbHM/OiBXb3Jrc3BhY2VUb29sc0NvbmZpZztcbiAgLyoqIEFwcEtpdCBwbHVnaW4gY29udGV4dCB1c2VkIHRvIGRpc2NvdmVyIG9wdGlvbmFsIHNpYmxpbmcgY2FwYWJpbGl0aWVzLiAqL1xuICBwbHVnaW5Db250ZXh0PzogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2U7XG4gIC8qKiBFbmFibGUgQk0yNSBrZXl3b3JkIHNlYXJjaCBvdmVyIGluZGV4ZWQgd29ya3NwYWNlIGNvbnRlbnQuICovXG4gIGJtMjU/OiBib29sZWFuO1xuICAvKipcbiAgICogQ29tbWFuZCBzYW5kYm94LiBEZWZhdWx0cyB0byBNb250eS4gUGFzcyBgXCJkYXRhYnJpY2tzXCJgIG9yIGFuIG9wdGlvbnNcbiAgICogb2JqZWN0IGZvciBEYXRhYnJpY2tzIFNhbmRib3gsIGBmYWxzZWAgdG8gZGlzYWJsZSBjb21tYW5kIGV4ZWN1dGlvbiwgb3IgYW5cbiAgICogZXhwbGljaXQgTWFzdHJhIHNhbmRib3gvcHJvdmlkZXIgcmVzb2x2ZXIuXG4gICAqL1xuICBzYW5kYm94PzogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbjtcbiAgLyoqXG4gICAqIEV4dHJhIExPQ0FMIHNraWxsIHJvb3RzIG1vdW50ZWQgcmVhZC1vbmx5IGZvciBldmVyeSByZXF1ZXN0J3Mgc2tpbGwgZGlzY292ZXJ5LlxuICAgKiBVc2VkIGJ5IHRoZSBwbHVnaW4gdG8gc3VyZmFjZSByZW1vdGUgc2tpbGxzIHByb3Zpc2lvbmVkIHRvIGEgbG9jYWwgdGVtcFxuICAgKiBkaXIgYXQgc3RhcnR1cCAoc2VlIGByZW1vdGUtc2tpbGxzLnRzYCkuIERhdGFicmlja3MtaG9zdGVkIHJlbW90ZSBza2lsbHNcbiAgICogbmVlZCBubyBlbnRyeSBoZXJlIC0gdGhleSBsYW5kIGluIHRoZSBBc3Npc3RhbnQgdHJlZSB0aGUgYnVpbHQtaW4gbW91bnRcbiAgICogYWxyZWFkeSBzY2Fucy5cbiAgICovXG4gIGV4dHJhU2tpbGxQYXRocz86IHN0cmluZ1tdO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlZmF1bHRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUaGUgc2tpbGwgZm9sZGVycyBldmVyeSB3b3Jrc3BhY2Ugc3RhcnRzIHdpdGguXG4gKlxuICogLSBgb3JnYW5pemF0aW9uLXNraWxsc2AgLSBgL1dvcmtzcGFjZS8uYXNzaXN0YW50YCB3aXRoIGBza2lsbHNgOyB3cml0ZVxuICogICBhdHRlbXB0cyByZXF1aXJlIGFwcHJvdmFsIGFuZCByZW1haW4gc3ViamVjdCB0byBEYXRhYnJpY2tzIHBlcm1pc3Npb25zLlxuICogLSBgcGVyc29uYWwtc2tpbGxzYCAtIHRoZSByZXF1ZXN0aW5nIHVzZXIncyBgL1dvcmtzcGFjZS9Vc2Vycy88ZW1haWw+YCByb290XG4gKiAgIHdpdGggYC5hc3Npc3RhbnQvc2tpbGxzYCwgd3JpdGFibGUgYW5kIHNraXBwZWQgd2l0aG91dCBhbiBlbWFpbC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0tJTExfRk9MREVSUzogUmVhZG9ubHk8UmVjb3JkPERlZmF1bHRTa2lsbEZvbGRlck5hbWUsIFNraWxsRm9sZGVyT3B0aW9ucz4+ID0ge1xuICBcIm9yZ2FuaXphdGlvbi1za2lsbHNcIjoge1xuICAgIGRlc2NyaXB0aW9uOiBcIk9yZ2FuaXphdGlvbiBza2lsbHMgc2hhcmVkIHdpdGggZXZlcnlvbmUgaW4gdGhpcyBEYXRhYnJpY2tzIHdvcmtzcGFjZS5cIixcbiAgICBkaXNwbGF5TmFtZTogXCJPcmdhbml6YXRpb24gU2tpbGxzXCIsXG4gICAgcGF0aDogT1JHQU5JWkFUSU9OX0FTU0lTVEFOVF9QQVRILFxuICAgIHJlYWRhYmxlOiB0cnVlLFxuICAgIHNraWxsczogW1wic2tpbGxzXCJdLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNyZWF0ZVJvb3Q6IGZhbHNlLFxuICB9LFxuICBcInBlcnNvbmFsLXNraWxsc1wiOiB7XG4gICAgZGVzY3JpcHRpb246IFwiWW91ciBEYXRhYnJpY2tzIHdvcmtzcGFjZSBob21lIGRpcmVjdG9yeSBmb3IgcGVyc29uYWwgZmlsZXMgYW5kIHNraWxscy5cIixcbiAgICBkaXNwbGF5TmFtZTogXCJIb21lXCIsXG4gICAgcGF0aDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT4ge1xuICAgICAgY29uc3QgZW1haWwgPSByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQpO1xuICAgICAgcmV0dXJuIGVtYWlsID8gcGVyc29uYWxXb3Jrc3BhY2VQYXRoKGVtYWlsKSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIHJlYWRhYmxlOiB0cnVlLFxuICAgIHNraWxsczogW1wiLmFzc2lzdGFudC9za2lsbHNcIl0sXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY3JlYXRlUm9vdDogZmFsc2UsXG4gIH0sXG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIHBlci1yZXF1ZXN0IERhdGFicmlja3MgbW91bnRzLlxuICpcbiAqIEBleGFtcGxlIERlZmF1bHQgc2tpbGwgZm9sZGVycyBvbmx5XG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKClcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIE92ZXJyaWRlIGEgZGVmYXVsdCwgZHJvcCBhbm90aGVyLCBhbmQgYWRkIGEgbG9jYXRpb24gb2YgeW91ciBvd25cbiAqIGBgYHRzXG4gKiBjcmVhdGVXb3Jrc3BhY2Uoe1xuICogICBza2lsbEZvbGRlcnM6IHtcbiAqICAgICBcIm9yZ2FuaXphdGlvbi1za2lsbHNcIjoge1xuICogICAgICAgcGF0aDogXCIvV29ya3NwYWNlL1NoYXJlZC8uYXNzaXN0YW50XCIsXG4gKiAgICAgICBza2lsbHM6IFtcInNraWxsc1wiXSxcbiAqICAgICB9LFxuICogICAgIFwicGVyc29uYWwtc2tpbGxzXCI6IGZhbHNlLFxuICogICAgIHJ1bmJvb2tzOiB7IHBhdGg6IFwiL1dvcmtzcGFjZS9TaGFyZWQvcnVuYm9va3Mvc2tpbGxzXCIsIHdyaXRhYmxlOiB0cnVlIH0sXG4gKiAgICAgdm9sdW1lOiB7IGZpbGVzeXN0ZW06IG15Vm9sdW1lRmlsZXN5c3RlbSB9LFxuICogICB9LFxuICogfSlcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFNraWxsIGZvbGRlcnMgcGx1cyBhIGN1c3RvbSBtb3VudCByZXNvbHZlclxuICogYGBgdHNcbiAqIGNyZWF0ZVdvcmtzcGFjZSh7XG4gKiAgIG1vdW50czogW1xuICogICAgIGFzeW5jICh7IHJlcXVlc3RDb250ZXh0IH0pID0+ICh7XG4gKiAgICAgICBtb3VudHM6IHsgXCIvZGF0YVwiOiBteUZpbGVzeXN0ZW0gfSxcbiAqICAgICAgIHNraWxsUGF0aHM6IFtdLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV29ya3NwYWNlKG9wdGlvbnM6IENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMgPSB7fSk6IFdvcmtzcGFjZSB7XG4gIGNvbnN0IHsgaWQsIG5hbWUgfSA9IHJlc29sdmVXb3Jrc3BhY2VJZGVudGl0eShvcHRpb25zKTtcbiAgY29uc3Qgc2tpbGxGb2xkZXJzID0gcmVzb2x2ZVNraWxsRm9sZGVycyhvcHRpb25zKTtcbiAgY29uc3QgZm9sZGVyTmFtZXMgPSBPYmplY3Qua2V5cyhza2lsbEZvbGRlcnMpO1xuICBjb25zdCBleHRyYVNraWxsUGF0aHMgPSBvcHRpb25zLmV4dHJhU2tpbGxQYXRocyA/PyBbXTtcbiAgY29uc3QgZmlsZXNDYWNoZSA9IHBsdWdpblJlZ2lzdHJ5Lmluc3RhbmNlKG9wdGlvbnMucGx1Z2luQ29udGV4dCwgZmlsZXNDYWNoZVBsdWdpbik/LmV4cG9ydHMoKTtcbiAgY29uc3QgcmV0YWluRmlsZXN5c3RlbVNvdXJjZSA9XG4gICAgZmlsZXNDYWNoZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgKG9wdGlvbnMubW91bnRzPy5sZW5ndGggPz8gMCkgPT09IDAgJiZcbiAgICBPYmplY3QudmFsdWVzKHNraWxsRm9sZGVycykuZXZlcnkoXG4gICAgICAoZm9sZGVyKSA9PlxuICAgICAgICB0eXBlb2YgZm9sZGVyLmZpbGVzeXN0ZW0gIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAhKHR5cGVvZiBmb2xkZXIucGF0aCA9PT0gXCJmdW5jdGlvblwiICYmIGZvbGRlci5tb3VudCAhPT0gdW5kZWZpbmVkKSxcbiAgICApO1xuICBjb25zdCByZXNvbHZlcnMgPSBidWlsZE1vdW50UmVzb2x2ZXJzKFxuICAgIHNraWxsRm9sZGVycyxcbiAgICBbLi4uKG9wdGlvbnMubW91bnRzID8/IFtdKSwgLi4ubG9jYWxTa2lsbE1vdW50UmVzb2x2ZXJzKGV4dHJhU2tpbGxQYXRocyldLFxuICAgIGZpbGVzQ2FjaGUsXG4gICk7XG4gIGNvbnN0IHJlc29sdmVDb250cmlidXRpb24gPSBjb250cmlidXRpb25SZXNvbHZlcihyZXNvbHZlcnMpO1xuICBjb25zdCByZXNvbHZlRmlsZXN5c3RlbSA9IChjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQpID0+XG4gICAgcmVzb2x2ZVdvcmtzcGFjZUZpbGVzeXN0ZW0oXG4gICAgICByZXNvbHZlQ29udHJpYnV0aW9uLFxuICAgICAgY29udGV4dCxcbiAgICAgIHJldGFpbkZpbGVzeXN0ZW1Tb3VyY2UgPyBmaWxlc0NhY2hlIDogdW5kZWZpbmVkLFxuICAgICk7XG4gIGNvbnN0IHNraWxsczogU2tpbGxzUmVzb2x2ZXIgPVxuICAgIG9wdGlvbnMuc2tpbGxzID8/XG4gICAgKGFzeW5jICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IHJlcXVlc3RDb250ZXh0IH07XG4gICAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlQ29udHJpYnV0aW9uKGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gICAgICAgIGF3YWl0IHJlc29sdmVGaWxlc3lzdGVtKGNvbnRleHQpLFxuICAgICAgICBjb250cmlidXRpb24uc2tpbGxQYXRocyA/PyBbXSxcbiAgICAgICk7XG4gICAgfSk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gZmFsc2U7XG4gIGNvbnN0IGJtMjUgPSBvcHRpb25zLmJtMjUgIT09IGZhbHNlO1xuICBjb25zdCBzYW5kYm94ID0gcmVzb2x2ZVdvcmtzcGFjZVNhbmRib3gob3B0aW9ucy5zYW5kYm94LCBpZCwgbmFtZSk7XG4gIGNvbnN0IHRvb2xzID0gd29ya3NwYWNlVG9vbHMob3B0aW9ucy50b29scyk7XG4gIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZTpjcmVhdGVcIiwge1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgcmVzb2x2ZXJDb3VudDogcmVzb2x2ZXJzLmxlbmd0aCxcbiAgICBza2lsbEZvbGRlcnM6IGZvbGRlck5hbWVzLFxuICAgIGN1c3RvbU1vdW50UmVzb2x2ZXJzOiBvcHRpb25zLm1vdW50cz8ubGVuZ3RoID8/IDAsXG4gICAgY3VzdG9tU2tpbGxzUmVzb2x2ZXI6IEJvb2xlYW4ob3B0aW9ucy5za2lsbHMpLFxuICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgYm0yNSxcbiAgICBleHRyYVNraWxsUGF0aHM6IGV4dHJhU2tpbGxQYXRocy5sZW5ndGgsXG4gICAgc2FuZGJveDogc2FuZGJveCA/IHNhbmRib3hOYW1lKG9wdGlvbnMuc2FuZGJveCkgOiBcImRpc2FibGVkXCIsXG4gIH0pO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IG5ldyBXb3Jrc3BhY2Uoe1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZmlsZXN5c3RlbTogcmVzb2x2ZUZpbGVzeXN0ZW0sXG4gICAgLi4uKHJlc29sdmVycy5sZW5ndGggPiAwIHx8IG9wdGlvbnMuc2tpbGxzXG4gICAgICA/IHtcbiAgICAgICAgICBza2lsbHMsXG4gICAgICAgICAgY2hlY2tTa2lsbEZpbGVNdGltZSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHNhbmRib3hcbiAgICAgID8ge1xuICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiB7IGR5bmFtaWNTYW5kYm94OiBcInJlc29sdmVcIiBhcyBjb25zdCB9LFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICBibTI1LFxuICAgIHRvb2xzLFxuICB9KTtcbiAgcmV0dXJuIHdvcmtzcGFjZTtcbn1cblxuLyoqXG4gKiBNZXJnZSB0aGUgY29uZmlndXJlZCBza2lsbCBmb2xkZXJzIG92ZXIge0BsaW5rIERFRkFVTFRfU0tJTExfRk9MREVSU30uXG4gKlxuICogYGFzc2lzdGFudFNraWxsczogZmFsc2VgIGRyb3BzIHRoZSBkZWZhdWx0cywgYW5kIGEgYGZhbHNlYCB2YWx1ZSByZW1vdmVzIG9uZVxuICogZW50cnkgYnkgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTa2lsbEZvbGRlcnMoXG4gIG9wdGlvbnM6IFBpY2s8Q3JlYXRlV29ya3NwYWNlT3B0aW9ucywgXCJhc3Npc3RhbnRTa2lsbHNcIiB8IFwic2tpbGxGb2xkZXJzXCI+ID0ge30sXG4pOiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnM+IHtcbiAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnM+ID1cbiAgICBvcHRpb25zLmFzc2lzdGFudFNraWxscyA9PT0gZmFsc2UgPyB7fSA6IHsgLi4uREVGQVVMVF9TS0lMTF9GT0xERVJTIH07XG4gIGZvciAoY29uc3QgW25hbWUsIGZvbGRlcl0gb2YgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5za2lsbEZvbGRlcnMgPz8ge30pKSB7XG4gICAgaWYgKGZvbGRlciA9PT0gZmFsc2UpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWRbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlZFtuYW1lXSA9IGZvbGRlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcml2YXRlIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogUmVxdWlyZSBhcHByb3ZhbCB1bmxlc3MgYSBmaWxlc3lzdGVtIG11dGF0aW9uIHN0YXlzIGluc2lkZSBhIHVzZXItb3duZWQgd3JpdGFibGUgcm9vdC4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVBcHByb3ZhbE91dHNpZGVXcml0YWJsZVJvb3RzKHtcbiAgYXJncyxcbiAgcmVxdWVzdENvbnRleHQsXG59OiBUb29sQ29uZmlnV2l0aEFyZ3NDb250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGlucHV0UGF0aCA9IGFyZ3MucGF0aDtcbiAgaWYgKHR5cGVvZiBpbnB1dFBhdGggIT09IFwic3RyaW5nXCIgfHwgIXBvc2l4UGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aCkpIHJldHVybiB0cnVlO1xuICBjb25zdCBub3JtYWxpemVkID0gcG9zaXhQYXRoLm5vcm1hbGl6ZShpbnB1dFBhdGgpO1xuICBpZiAoIW5vcm1hbGl6ZWQub2spIHJldHVybiB0cnVlO1xuICBpZiAocG9zaXhQYXRoLmlzV2l0aGluUm9vdChTQ1JBVENIX01PVU5ULCBub3JtYWxpemVkLnBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGVtYWlsVmFsdWUgPSByZXF1ZXN0Q29udGV4dFtNQVNUUkFfVVNFUl9FTUFJTF9LRVldO1xuICBjb25zdCBlbWFpbCA9IHR5cGVvZiBlbWFpbFZhbHVlID09PSBcInN0cmluZ1wiID8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChlbWFpbFZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFlbWFpbCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhcG9zaXhQYXRoLmlzV2l0aGluUm9vdChwZXJzb25hbFdvcmtzcGFjZVBhdGgoZW1haWwpLCBub3JtYWxpemVkLnBhdGgpO1xufVxuXG5mdW5jdGlvbiB3b3Jrc3BhY2VUb29scyhjb25maWd1cmVkOiBXb3Jrc3BhY2VUb29sc0NvbmZpZyB8IHVuZGVmaW5lZCk6IFdvcmtzcGFjZVRvb2xzQ29uZmlnIHtcbiAgY29uc3QgcmVxdWlyZUFwcHJvdmFsOiBXb3Jrc3BhY2VUb29sQ29uZmlnID1cbiAgICBjb25maWd1cmVkPy5yZXF1aXJlQXBwcm92YWwgPT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHJlcXVpcmVBcHByb3ZhbDogcmVxdWlyZUFwcHJvdmFsT3V0c2lkZVdyaXRhYmxlUm9vdHMgfVxuICAgICAgOiB7fTtcbiAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgW1dPUktTUEFDRV9UT09MUy5GSUxFU1lTVEVNLldSSVRFX0ZJTEVdOiByZXF1aXJlQXBwcm92YWwsXG4gICAgW1dPUktTUEFDRV9UT09MUy5GSUxFU1lTVEVNLkVESVRfRklMRV06IHJlcXVpcmVBcHByb3ZhbCxcbiAgICBbV09SS1NQQUNFX1RPT0xTLkZJTEVTWVNURU0uQVNUX0VESVRdOiByZXF1aXJlQXBwcm92YWwsXG4gICAgW1dPUktTUEFDRV9UT09MUy5GSUxFU1lTVEVNLkRFTEVURV06IHJlcXVpcmVBcHByb3ZhbCxcbiAgICBbV09SS1NQQUNFX1RPT0xTLkZJTEVTWVNURU0uTUtESVJdOiByZXF1aXJlQXBwcm92YWwsXG4gIH0gc2F0aXNmaWVzIFdvcmtzcGFjZVRvb2xzQ29uZmlnO1xuICBjb25zdCBjb25maWd1cmVkVG9vbHMgPSBjb25maWd1cmVkIGFzXG4gICAgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgV29ya3NwYWNlVG9vbENvbmZpZyB8IHVuZGVmaW5lZD4+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBtZXJnZWRUb29scyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhkZWZhdWx0cykubWFwKChbbmFtZSwgZGVmYXVsdENvbmZpZ10pID0+IFtcbiAgICAgIG5hbWUsXG4gICAgICB7IC4uLmRlZmF1bHRDb25maWcsIC4uLmNvbmZpZ3VyZWRUb29scz8uW25hbWVdIH0sXG4gICAgXSksXG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4uZGVmYXVsdHMsXG4gICAgLi4uY29uZmlndXJlZCxcbiAgICAuLi5tZXJnZWRUb29scyxcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VTYW5kYm94KFxuICBzZWxlY3Rpb246IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gfCB1bmRlZmluZWQsXG4gIHdvcmtzcGFjZUlkOiBzdHJpbmcsXG4gIHdvcmtzcGFjZU5hbWU6IHN0cmluZyxcbik6IFdvcmtzcGFjZVNhbmRib3ggfCBXb3Jrc3BhY2VTYW5kYm94UmVzb2x2ZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWd1cmVkID0gc2VsZWN0aW9uID8/IFwibW9udHlcIjtcbiAgaWYgKGNvbmZpZ3VyZWQgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoY29uZmlndXJlZCA9PT0gXCJtb250eVwiKSByZXR1cm4gbmV3IE1vbnR5U2FuZGJveCgpO1xuICBpZiAodHlwZW9mIGNvbmZpZ3VyZWQgPT09IFwiZnVuY3Rpb25cIiB8fCBpc1NhbmRib3goY29uZmlndXJlZCkpIHJldHVybiBjb25maWd1cmVkO1xuXG4gIGNvbnN0IG9wdGlvbnM6IERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyA9XG4gICAgY29uZmlndXJlZCA9PT0gXCJkYXRhYnJpY2tzXCIgPyB7IHByb3ZpZGVyOiBcImRhdGFicmlja3NcIiB9IDogY29uZmlndXJlZDtcbiAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IHtcbiAgICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgICBcIkRhdGFicmlja3Mgc2FuZGJveCB1c2VyIGNvbnRleHRcIixcbiAgICAgICAgXCJJbnZva2UgY29tbWFuZCB0b29scyBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBNYXN0cmEgcGx1Z2luLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlndXJlZElkID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLnNhbmRib3hJZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gb3B0aW9ucy5zYW5kYm94SWQoeyByZXF1ZXN0Q29udGV4dCB9KVxuICAgICAgICA6IG9wdGlvbnMuc2FuZGJveElkO1xuICAgIGNvbnN0IHNhbmRib3hJZCA9IGNvbmZpZ3VyZWRJZCA/PyBkZWZhdWx0U2FuZGJveElkKHdvcmtzcGFjZUlkLCB1c2VyLmlkKTtcbiAgICBjb25zdCBjbGllbnQgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMuY2xpZW50ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBvcHRpb25zLmNsaWVudCh7IHJlcXVlc3RDb250ZXh0IH0pXG4gICAgICAgIDogKG9wdGlvbnMuY2xpZW50ID8/IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpKTtcbiAgICBjb25zdCB7XG4gICAgICBwcm92aWRlcjogX3Byb3ZpZGVyLFxuICAgICAgc2FuZGJveElkOiBfc2FuZGJveElkLFxuICAgICAgY2xpZW50OiBfY2xpZW50LFxuICAgICAgLi4uc2FuZGJveE9wdGlvbnNcbiAgICB9ID0gb3B0aW9ucztcbiAgICByZXR1cm4gbmV3IERhdGFicmlja3NTYW5kYm94KHtcbiAgICAgIC4uLnNhbmRib3hPcHRpb25zLFxuICAgICAgY2xpZW50LFxuICAgICAgc2FuZGJveElkLFxuICAgICAgZGlzcGxheU5hbWU6IG9wdGlvbnMuZGlzcGxheU5hbWUgPz8gYE1hc3RyYSAke3dvcmtzcGFjZU5hbWV9YCxcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFNhbmRib3hJZCh3b3Jrc3BhY2VJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKG9iamVjdC50b1N0YWJsZUtleSh7IHdvcmtzcGFjZUlkLCB1c2VySWQgfSkpXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zbGljZSgwLCAzMik7XG4gIHJldHVybiBgbWFzdHJhLSR7ZGlnZXN0fWA7XG59XG5cbmZ1bmN0aW9uIGlzU2FuZGJveCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtzcGFjZVNhbmRib3gge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJpZFwiIGluIHZhbHVlICYmIFwicHJvdmlkZXJcIiBpbiB2YWx1ZSAmJiBcInN0YXR1c1wiIGluIHZhbHVlLFxuICApO1xufVxuXG5mdW5jdGlvbiBzYW5kYm94TmFtZShzZWxlY3Rpb246IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoc2VsZWN0aW9uID09PSB1bmRlZmluZWQgfHwgc2VsZWN0aW9uID09PSBcIm1vbnR5XCIpIHJldHVybiBcIm1vbnR5XCI7XG4gIGlmIChzZWxlY3Rpb24gPT09IFwiZGF0YWJyaWNrc1wiKSByZXR1cm4gXCJkYXRhYnJpY2tzXCI7XG4gIGlmIChzZWxlY3Rpb24gPT09IGZhbHNlKSByZXR1cm4gXCJkaXNhYmxlZFwiO1xuICBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gXCJyZXNvbHZlclwiO1xuICByZXR1cm4gaXNTYW5kYm94KHNlbGVjdGlvbikgPyBzZWxlY3Rpb24ucHJvdmlkZXIgOiAoc2VsZWN0aW9uLnByb3ZpZGVyID8/IFwiZGF0YWJyaWNrc1wiKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciB0aGUgcmVxdWVzdCB0b2tlbiBjYXJyaWVzIGEgc2NvcGUgdGhhdCBhbGxvd3Mgd29ya3NwYWNlXG4gKiBmaWxlIEFQSSBhY2Nlc3MgKGB3b3Jrc3BhY2VgIG9yIGBhbGwtYXBpc2Agb24ge0BsaW5rIE1BU1RSQV9TQ09QRVNfS0VZfSkuXG4gKi9cbmZ1bmN0aW9uIGhhc1dvcmtzcGFjZUZpbGVTY29wZShyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuLmluY2x1ZGVzQWNjZXNzVG9rZW5TY29wZShcbiAgICByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9TQ09QRVNfS0VZKSxcbiAgICBXT1JLU1BBQ0VfRklMRV9TQ09QRVMsXG4gICk7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSByZXF1ZXN0IGNsaWVudCBhbmQgYXV0aG9yaXphdGlvbi1zYWZlIGZpbGVzLWNhY2hlIHNjb3BlLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUZpbGVzQ2FjaGVTY29wZShjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQpOiBQcm9taXNlPFxuICB8IHtcbiAgICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICAgICAgc2NvcGU6IEZpbGVzQ2FjaGVTY29wZTtcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBjb250ZXh0LnJlcXVlc3RDb250ZXh0O1xuICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IHVzZXI/LmV4ZWN1dGlvbkNvbnRleHQuY2xpZW50IGFzIFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgaWYgKCFyZXF1ZXN0Q29udGV4dCB8fCAhdXNlciB8fCAhY2xpZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGNsaWVudCxcbiAgICBzY29wZToge1xuICAgICAgaG9zdDogKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpLFxuICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpLFxuICAgICAgLi4uKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfV09SS1NQQUNFX0lEPy50cmltKClcbiAgICAgICAgPyB7IHdvcmtzcGFjZUlkOiBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1dPUktTUEFDRV9JRC50cmltKCkgfVxuICAgICAgICA6IHt9KSxcbiAgICB9LFxuICB9O1xufVxuXG4vKiogSm9pbiBvbmUgcmVsYXRpdmUgc2tpbGwgcm9vdCB0byBpdHMgYWN0dWFsIGNvbXBvc2l0ZSBtb3VudCBwYXRoLiAqL1xuZnVuY3Rpb24gbW91bnRlZFNraWxsUGF0aChtb3VudDogc3RyaW5nLCBza2lsbFJvb3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwb3NpeFBhdGguaXNBYnNvbHV0ZShza2lsbFJvb3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgU2tpbGwgcGF0aCBtdXN0IGJlIHJlbGF0aXZlIHRvIGl0cyBtb3VudDogJHtza2lsbFJvb3R9YCk7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBvc2l4UGF0aC5ub3JtYWxpemUoc2tpbGxSb290KTtcbiAgaWYgKCFub3JtYWxpemVkLm9rKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgU2tpbGwgcGF0aCBlc2NhcGVzIGl0cyBtb3VudDogJHtza2lsbFJvb3R9YCk7XG4gIH1cbiAgcmV0dXJuIHBvc2l4UGF0aC5qb2luKHBvc2l4UGF0aC5ub3JtYWxpemVSb290KG1vdW50KSwgbm9ybWFsaXplZC5wYXRoLnNsaWNlKDEpKTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGEgRGF0YWJyaWNrcyBwYXRoIGJlbG9uZ3MgdG8gdGhlIHdyaXRhYmxlIFdvcmtzcGFjZSBuYW1lc3BhY2UuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVJvb3Qocm9vdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChyb290KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPT09IFwiL1dvcmtzcGFjZVwiIHx8IG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcIi9Xb3Jrc3BhY2UvXCIpO1xufVxuXG4vKipcbiAqIE1vdW50IHJlc29sdmVyIGZvciB0aGUgbmFtZWQgc2tpbGwgZm9sZGVycy5cbiAqXG4gKiBHYXRlcyBvbiB3b3Jrc3BhY2UgZmlsZSBzY29wZSAob3IgZGV2ZWxvcG1lbnQgbW9kZSksIHRoZW4gbW91bnRzIGV2ZXJ5XG4gKiBmb2xkZXIgd2hvc2UgbG9jYXRpb24gcmVzb2x2ZXMgZm9yIHRoaXMgcmVxdWVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNraWxsRm9sZGVyTW91bnRzKFxuICBza2lsbEZvbGRlcnM6IFJlY29yZDxzdHJpbmcsIFNraWxsRm9sZGVyT3B0aW9ucz4sXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbiAgZmlsZXNDYWNoZTogRmlsZXNDYWNoZUV4cG9ydHMgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3Qgc2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBjb250ZXh0LnJlcXVlc3RDb250ZXh0O1xuXG4gIGlmICghcmVxdWVzdENvbnRleHQgfHwgIXNob3VsZE1vdW50U2tpbGxGb2xkZXJzKHJlcXVlc3RDb250ZXh0KSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6c2tpcHBlZFwiLCB7XG4gICAgICByZWFzb246ICFyZXF1ZXN0Q29udGV4dCA/IFwibm8tcmVxdWVzdC1jb250ZXh0XCIgOiBcIm1pc3Npbmctd29ya3NwYWNlLXNjb3BlXCIsXG4gICAgICBub2RlRW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcbiAgICAgIHNjb3BlczogcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfU0NPUEVTX0tFWSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgbW91bnRzLCBza2lsbFBhdGhzIH07XG4gIH1cblxuICBjb25zdCBzY29wZWQgPSBhd2FpdCByZXNvbHZlRmlsZXNDYWNoZVNjb3BlKGNvbnRleHQpO1xuICBjb25zdCBjbGllbnQgPSBzY29wZWQ/LmNsaWVudDtcbiAgY29uc3QgZmlsZVN5c3RlbUNhY2hlID1cbiAgICBmaWxlc0NhY2hlICYmIHNjb3BlZCA/IGF3YWl0IGZpbGVzQ2FjaGUuZm9yU2NvcGUoc2NvcGVkLnNjb3BlKSA6IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBmb2xkZXJdIG9mIE9iamVjdC5lbnRyaWVzKHNraWxsRm9sZGVycykpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlckZpbGVzeXN0ZW0obmFtZSwgZm9sZGVyLCBjb250ZXh0LCB7XG4gICAgICBjbGllbnQsXG4gICAgICBmaWxlU3lzdGVtQ2FjaGUsXG4gICAgfSk7XG4gICAgaWYgKCFyZXNvbHZlZCkgY29udGludWU7XG4gICAgY29uc3QgbW91bnQgPSBmb2xkZXIubW91bnQgPz8gcmVzb2x2ZWQucm9vdCA/PyBgLyR7bmFtZX1gO1xuICAgIG1vdW50c1ttb3VudF0gPSByZXNvbHZlZC5maWxlc3lzdGVtO1xuICAgIGlmIChmb2xkZXIucmVhZGFibGUgIT09IGZhbHNlKSB7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uKGZvbGRlci5za2lsbHMgPz8gW1wiLlwiXSkubWFwKChwYXRoKSA9PiBtb3VudGVkU2tpbGxQYXRoKG1vdW50LCBwYXRoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6bW91bnRlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgbW91bnRzLFxuICAgIHNraWxsUGF0aHMsXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvbmUgc2tpbGwgZm9sZGVyIHRvIGEgTWFzdHJhIGZpbGVzeXN0ZW0sIG9yIGB1bmRlZmluZWRgIHRvIHNraXAgaXRcbiAqIGZvciB0aGlzIHJlcXVlc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTa2lsbEZvbGRlckZpbGVzeXN0ZW0oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm9sZGVyOiBTa2lsbEZvbGRlck9wdGlvbnMsXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbiAgY2FjaGU6IHtcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgICBmaWxlU3lzdGVtQ2FjaGU6IEZpbGVTeXN0ZW1DYWNoZSB8IHVuZGVmaW5lZDtcbiAgfSxcbik6IFByb21pc2U8XG4gIHwge1xuICAgICAgZmlsZXN5c3RlbTogV29ya3NwYWNlRmlsZXN5c3RlbTtcbiAgICAgIHJvb3Q/OiBzdHJpbmc7XG4gICAgfVxuICB8IHVuZGVmaW5lZFxuPiB7XG4gIGlmIChmb2xkZXIuZmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZmlsZXN5c3RlbSA9IGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlclZhbHVlKGZvbGRlci5maWxlc3lzdGVtLCBjb250ZXh0KTtcbiAgICByZXR1cm4gZmlsZXN5c3RlbVxuICAgICAgPyB7XG4gICAgICAgICAgZmlsZXN5c3RlbSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gQSBwYXRoIG1vdW50IG5lZWRzIHRoZSByZXF1ZXN0J3MgT0JPIGNsaWVudCB0byByZWFjaCB0aGUgd29ya3NwYWNlLlxuICBpZiAoZm9sZGVyLnBhdGggPT09IHVuZGVmaW5lZCB8fCAhY2FjaGUuY2xpZW50KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2tpbGwtZm9sZGVyOnNraXBwZWRcIiwge1xuICAgICAgbmFtZSxcbiAgICAgIHJlYXNvbjogZm9sZGVyLnBhdGggPT09IHVuZGVmaW5lZCA/IFwibm8tbG9jYXRpb25cIiA6IFwibWlzc2luZy1vYm8tY2xpZW50XCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByb290ID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChhd2FpdCByZXNvbHZlU2tpbGxGb2xkZXJWYWx1ZShmb2xkZXIucGF0aCwgY29udGV4dCkpO1xuICBpZiAoIXJvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdyaXRhYmxlID0gZm9sZGVyLndyaXRhYmxlID8/IGlzV29ya3NwYWNlUm9vdChyb290KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBkYXRhYnJpY2tzRmlsZXN5c3RlbShcbiAgICBjYWNoZS5jbGllbnQsXG4gICAgcm9vdCxcbiAgICAhd3JpdGFibGUsXG4gICAgZm9sZGVyLmNyZWF0ZVJvb3QgPz8gZm9sZGVyLndyaXRhYmxlID09PSB0cnVlLFxuICAgIGNhY2hlLmZpbGVTeXN0ZW1DYWNoZSxcbiAgICBmb2xkZXIucmVhZGFibGUgPT09IGZhbHNlID8gW10gOiAoZm9sZGVyLnNraWxscyA/PyBbXCIuXCJdKSxcbiAgICB7XG4gICAgICAuLi4oZm9sZGVyLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZm9sZGVyLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAuLi4oZm9sZGVyLmRpc3BsYXlOYW1lID8geyBkaXNwbGF5TmFtZTogZm9sZGVyLmRpc3BsYXlOYW1lIH0gOiB7fSksXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIHJlc29sdmVkID8geyAuLi5yZXNvbHZlZCwgcm9vdCB9IDogdW5kZWZpbmVkO1xufVxuXG4vKiogUmVhZCBhIHtAbGluayBTa2lsbEZvbGRlclZhbHVlfSwgY2FsbGluZyBpdCB3aGVuIGl0IGlzIGEgcGVyLXJlcXVlc3QgcmVzb2x2ZXIuICovXG5mdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJWYWx1ZTxUPihcbiAgdmFsdWU6IFNraWxsRm9sZGVyVmFsdWU8VD4sXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbik6IFQgfCB1bmRlZmluZWQgfCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyAodmFsdWUgYXMgKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD4pKGNvbnRleHQpXG4gICAgOiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBGaWxsIGluIGBpZGAgYW5kIGBuYW1lYCB3aGVuIGVpdGhlciBpcyBvbWl0dGVkIG9uIHtAbGluayBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zfS5cbiAqIFNsdWdpZmllcyBgbmFtZWAgaW50byBgaWRgOyB0b2tlbml6ZXMgYGlkYCBpbnRvIGEgZGlzcGxheSBgbmFtZWAuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VJZGVudGl0eShvcHRpb25zOiBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zKToge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59IHtcbiAgbGV0IGlkID0gb3B0aW9ucy5pZDtcbiAgbGV0IG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIGlmICghaWQpIHtcbiAgICBpZCA9IG5hbWUgPyBzdHJpbmdVdGlscy50b1NsdWcobmFtZSkgOiBcIndvcmtzcGFjZVwiO1xuICB9XG4gIGlmICghbmFtZSkge1xuICAgIG5hbWUgPSBBcnJheS5mcm9tKHN0cmluZ1V0aWxzLnRva2VuaXplKGlkKSkuam9pbihcIiBcIik7XG4gIH1cbiAgcmV0dXJuIHsgaWQsIG5hbWUgfTtcbn1cblxuLyoqIENvbGxlY3QgdGhlIHNraWxsLWZvbGRlciByZXNvbHZlciBhbmQgYW55IGNhbGxlci1zdXBwbGllZCBvbmVzLiAqL1xuZnVuY3Rpb24gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgc2tpbGxGb2xkZXJzOiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnM+LFxuICBtb3VudHM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSB8IHVuZGVmaW5lZCxcbiAgZmlsZXNDYWNoZTogRmlsZXNDYWNoZUV4cG9ydHMgfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtzY3JhdGNoTW91bnRSZXNvbHZlcigpXTtcbiAgY29uc3QgZm9sZGVyQ291bnQgPSBPYmplY3Qua2V5cyhza2lsbEZvbGRlcnMpLmxlbmd0aDtcbiAgaWYgKGZvbGRlckNvdW50ID4gMCkge1xuICAgIHJlc29sdmVycy5wdXNoKChjb250ZXh0KSA9PiByZXNvbHZlU2tpbGxGb2xkZXJNb3VudHMoc2tpbGxGb2xkZXJzLCBjb250ZXh0LCBmaWxlc0NhY2hlKSk7XG4gIH1cbiAgaWYgKG1vdW50cz8ubGVuZ3RoKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2goLi4ubW91bnRzKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJzXCIsIHtcbiAgICBza2lsbEZvbGRlckNvdW50OiBmb2xkZXJDb3VudCxcbiAgICBjdXN0b21SZXNvbHZlckNvdW50OiBtb3VudHM/Lmxlbmd0aCA/PyAwLFxuICAgIHRvdGFsUmVzb2x2ZXJDb3VudDogcmVzb2x2ZXJzLmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiByZXNvbHZlcnM7XG59XG5cbi8qKiBDb250cmlidXRlIG9uZSBpc29sYXRlZCBsb2NhbCBzY3JhdGNoIGZpbGVzeXN0ZW0gYXQgYC90bXBgLiAqL1xuZnVuY3Rpb24gc2NyYXRjaE1vdW50UmVzb2x2ZXIoKTogV29ya3NwYWNlTW91bnRSZXNvbHZlciB7XG4gIHJldHVybiAoKSA9PiAoe1xuICAgIG1vdW50czogeyBbU0NSQVRDSF9NT1VOVF06IHNjcmF0Y2hGaWxlc3lzdGVtKCkgfSxcbiAgfSk7XG59XG5cbi8qKiBNb3VudCBzdGFydHVwLXByb3Zpc2lvbmVkIGxvY2FsIHNraWxsIHJvb3RzIGludG8gTWFzdHJhJ3Mgd29ya3NwYWNlIGZpbGVzeXN0ZW0uICovXG5mdW5jdGlvbiBsb2NhbFNraWxsTW91bnRSZXNvbHZlcnMocGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KHBhdGhzLm1hcCgocGF0aCkgPT4gcGF0aC50cmltKCkpLmZpbHRlcihCb29sZWFuKSldLm1hcCgocm9vdCkgPT4ge1xuICAgIGNvbnN0IG1vdW50ID0gcG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3Qocm9vdCk7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IExvY2FsRmlsZVN5c3RlbSh7XG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICBjcmVhdGVSb290OiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCBmaWxlc3lzdGVtID0gZmlsZXN5c3RlbXMoc291cmNlLCB7IHJlYWRPbmx5OiB0cnVlIH0pO1xuICAgIHJldHVybiAoKSA9PiAoe1xuICAgICAgbW91bnRzOiB7IFttb3VudF06IGZpbGVzeXN0ZW0gfSxcbiAgICAgIHNraWxsUGF0aHM6IFttb3VudF0sXG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdhdGUgc2tpbGwtZm9sZGVyIG1vdW50cyBvbiB0aGUgcmVxdWVzdCdzIHRva2VuLlxuICpcbiAqIEFsd2F5cyBhbGxvd3MgbW91bnRzIGluIGRldmVsb3BtZW50OyBpbiBvdGhlciBlbnZpcm9ubWVudHMgcmVxdWlyZXNcbiAqIHtAbGluayBoYXNXb3Jrc3BhY2VGaWxlU2NvcGV9LlxuICovXG5mdW5jdGlvbiBzaG91bGRNb3VudFNraWxsRm9sZGVycyhyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiBib29sZWFuIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gaGFzV29ya3NwYWNlRmlsZVNjb3BlKHJlcXVlc3RDb250ZXh0KTtcbn1cblxuLyoqIFJlYWQgdGhlIHRyaW1tZWQgT0JPIHVzZXIgZW1haWwgc3RhbXBlZCBvbiB7QGxpbmsgTUFTVFJBX1VTRVJfRU1BSUxfS0VZfS4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRFbWFpbChyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSkpID8/IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcmFwIGEge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfSBhcyBhIE1hc3RyYSBmaWxlc3lzdGVtLiBNaXNzaW5nIG9yXG4gKiBpbmFjY2Vzc2libGUgcm9vdHMgcmV0dXJuIGB1bmRlZmluZWRgIHNvIHRoZSBpbmRlcGVuZGVudCBgL3RtcGAgbW91bnQgYW5kXG4gKiBhbnkgb3RoZXIgYWNjZXNzaWJsZSByb290cyByZW1haW4gdXNhYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBkYXRhYnJpY2tzRmlsZXN5c3RlbShcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHJvb3Q6IHN0cmluZyxcbiAgcmVhZE9ubHk6IGJvb2xlYW4gPSB0cnVlLFxuICBjcmVhdGVSb290OiBib29sZWFuID0gIXJlYWRPbmx5LFxuICBmaWxlU3lzdGVtQ2FjaGU/OiBGaWxlU3lzdGVtQ2FjaGUsXG4gIHNraWxsUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gIGFkYXB0ZXJPcHRpb25zOiBQaWNrPE1hc3RyYUZpbGVTeXN0ZW1BZGFwdGVyT3B0aW9ucywgXCJkZXNjcmlwdGlvblwiIHwgXCJkaXNwbGF5TmFtZVwiPiA9IHt9LFxuKTogUHJvbWlzZTxcbiAgfCB7XG4gICAgICBmaWxlc3lzdGVtOiBXb3Jrc3BhY2VGaWxlc3lzdGVtO1xuICAgIH1cbiAgfCB1bmRlZmluZWRcbj4ge1xuICBjb25zdCBpbml0aWFsQ2xpZW50ID0gd29ya3NwYWNlQ2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KGNsaWVudCk7XG4gIGNvbnN0IGZzID0gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHtcbiAgICBjbGllbnQ6ICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3b3Jrc3BhY2VDbGllbnQudG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQoZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGluaXRpYWxDbGllbnQ7XG4gICAgICB9XG4gICAgfSxcbiAgICByb290LFxuICAgIHJlYWRPbmx5LFxuICAgIGNyZWF0ZVJvb3QsXG4gIH0pO1xuICBjb25zdCBzb3VyY2UgPSBmaWxlU3lzdGVtQ2FjaGVcbiAgICA/IHNoYXJlZEZTLmNhY2hlKGZzLCBmaWxlU3lzdGVtQ2FjaGUsIHsgcmVhZEZpbGVQYXRoczogc2tpbGxQYXRocyB9KVxuICAgIDogZnM7XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtcyhzb3VyY2UsIHsgLi4uYWRhcHRlck9wdGlvbnMsIHJlYWRPbmx5IH0pO1xuICB0cnkge1xuICAgIGF3YWl0IGZpbGVzeXN0ZW0uaW5pdCgpO1xuICAgIGlmIChhd2FpdCBmaWxlc3lzdGVtLmV4aXN0cyhcIi5cIikpIHtcbiAgICAgIHJldHVybiB7IGZpbGVzeXN0ZW0gfTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6c2tpcHBlZFwiLCB7XG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHksXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJ1biBldmVyeSBtb3VudCByZXNvbHZlciBmb3Igb25lIHJlcXVlc3QgYW5kIG1lcmdlIG1vdW50cyBwbHVzIHNraWxsIHBhdGhzLlxuICogTGF0ZXIgcmVzb2x2ZXJzIG92ZXJ3cml0ZSBtb3VudCBrZXlzIGZyb20gZWFybGllciBvbmVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+ID0ge307XG4gIGNvbnN0IHNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIHJlc29sdmVyXSBvZiByZXNvbHZlcnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgY29udHJpYnV0aW9uID0gYXdhaXQgcmVzb2x2ZXIoY29udGV4dCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibW91bnRzOnJlc29sdmVyXCIsIHtcbiAgICAgIGluZGV4LFxuICAgICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhjb250cmlidXRpb24ubW91bnRzKSxcbiAgICAgIHNraWxsUGF0aHM6IGNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzID8/IFtdLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24obW91bnRzLCBjb250cmlidXRpb24ubW91bnRzKTtcbiAgICBpZiAoY29udHJpYnV0aW9uLnNraWxsUGF0aHM/Lmxlbmd0aCkge1xuICAgICAgc2tpbGxQYXRocy5wdXNoKC4uLmNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6bWVyZ2VkXCIsIHtcbiAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKG1vdW50cyksXG4gICAgc2tpbGxQYXRocyxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudHMsXG4gICAgc2tpbGxQYXRocyxcbiAgfTtcbn1cblxuLyoqXG4gKiBEeW5hbWljIGZpbGVzeXN0ZW0gcmVzb2x2ZXIgcGFzc2VkIHRvIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfS5cbiAqXG4gKiBSZXR1cm5zIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IHdoZW4gYW55IG1vdW50IHJlc29sdmVkOyBvdGhlcndpc2UgYVxuICogZnJlc2gge0BsaW5rIHNjcmF0Y2hGaWxlc3lzdGVtfSBzbyBNYXN0cmEgYWx3YXlzIGhhcyBhIHdyaXRhYmxlIGxvY2FsIHJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKFxuICByZXNvbHZlQ29udHJpYnV0aW9uOiAoY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0KSA9PiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPixcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuICBmaWxlc0NhY2hlPzogRmlsZXNDYWNoZUV4cG9ydHMsXG4pOiBQcm9taXNlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+IHtcbiAgY29uc3QgeyBtb3VudHMgfSA9IGF3YWl0IHJlc29sdmVDb250cmlidXRpb24oY29udGV4dCk7XG4gIGNvbnN0IG1vdW50S2V5cyA9IE9iamVjdC5rZXlzKG1vdW50cyk7XG4gIGlmIChtb3VudEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTpzY3JhdGNoXCIsIHtcbiAgICAgIGhhc1JlcXVlc3RDb250ZXh0OiBCb29sZWFuKGNvbnRleHQucmVxdWVzdENvbnRleHQpLFxuICAgIH0pO1xuICAgIHJldHVybiBzY3JhdGNoRmlsZXN5c3RlbSgpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImZpbGVzeXN0ZW06Y29tcG9zaXRlXCIsIHsgbW91bnRLZXlzIH0pO1xuICBjb25zdCBsb2FkID0gKCkgPT4gbmV3IE1vdW50ZWRDb21wb3NpdGVGaWxlc3lzdGVtKHsgbW91bnRzIH0pO1xuICBpZiAoIWZpbGVzQ2FjaGUpIHJldHVybiBsb2FkKCk7XG4gIGNvbnN0IHNjb3BlZCA9IGF3YWl0IHJlc29sdmVGaWxlc0NhY2hlU2NvcGUoY29udGV4dCk7XG4gIGlmICghc2NvcGVkKSByZXR1cm4gbG9hZCgpO1xuICByZXR1cm4gZmlsZXNDYWNoZS5mb3JGaWxlU3lzdGVtKHNjb3BlZC5zY29wZSwgeyBwYXRoczogbW91bnRLZXlzIH0sIGxvYWQpO1xufVxuXG4vKipcbiAqIEV4cGFuZCBza2lsbCByb290cyBpbnRvIGNvbmNyZXRlIHNraWxsIGRpcmVjdG9yaWVzIGFuZCBrZWVwIHRoZSBmaXJzdFxuICogc2FtZS1uYW1lZCBkaXJlY3RvcnkuIE1hc3RyYSBzdGlsbCBvd25zIHBhcnNpbmcsIGluZGV4aW5nLCBhbmQgcmVmcmVzaGVzLFxuICogd2hpbGUgb3JnYW5pemF0aW9uIHJvb3RzIHJldGFpbiBwcmVjZWRlbmNlIG92ZXIgcGVyc29uYWwgcm9vdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gIGZpbGVzeXN0ZW06IFdvcmtzcGFjZUZpbGVzeXN0ZW0sXG4gIHJvb3RzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZGRpcihyb290KTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSBcImZpbGVcIiAmJiBlbnRyeS5uYW1lID09PSBcIlNLSUxMLm1kXCIpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwb3NpeFBhdGguYmFzZW5hbWUocm9vdCk7XG4gICAgICAgIGlmICghc2VsZWN0ZWQuaGFzKG5hbWUpKSBzZWxlY3RlZC5zZXQobmFtZSwgcm9vdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS50eXBlICE9PSBcImRpcmVjdG9yeVwiIHx8IHNlbGVjdGVkLmhhcyhlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICAgIHNlbGVjdGVkLnNldChlbnRyeS5uYW1lLCBwb3NpeFBhdGguam9pbihyb290LCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLXJvb3Q6c2tpcHBlZFwiLCB7XG4gICAgICAgIHJvb3QsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5zZWxlY3RlZC52YWx1ZXMoKV07XG59XG5cbi8qKiBNZW1vaXplIG9uZSBjb21wbGV0ZSBtb3VudCBjb250cmlidXRpb24gZm9yIGVhY2ggcmVxdWVzdCBjb250ZXh0LiAqL1xuZnVuY3Rpb24gY29udHJpYnV0aW9uUmVzb2x2ZXIoXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuKTogKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBzY29wZWQgPSBuZXcgV2Vha01hcDxSZXF1ZXN0Q29udGV4dCwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4+KCk7XG4gIGxldCB1bnNjb3BlZDogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiAoY29udGV4dCkgPT4ge1xuICAgIGlmICghY29udGV4dC5yZXF1ZXN0Q29udGV4dCkge1xuICAgICAgdW5zY29wZWQgPz89IHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24ocmVzb2x2ZXJzLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiB1bnNjb3BlZDtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBzY29wZWQuZ2V0KGNvbnRleHQucmVxdWVzdENvbnRleHQpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGNvbnN0IHBlbmRpbmcgPSByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKHJlc29sdmVycywgY29udGV4dCk7XG4gICAgc2NvcGVkLnNldChjb250ZXh0LnJlcXVlc3RDb250ZXh0LCBwZW5kaW5nKTtcbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn1cbiJdfQ==
|
|
726
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsSUFBSSxnQkFBZ0IsR0FHL0IsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUF1QixNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckYsT0FBTyxFQUNMLEVBQUUsSUFBSSxRQUFRLEVBQ2QsU0FBUyxFQUtULGdCQUFnQixHQUNqQixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFDTCxTQUFTLEdBT1YsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsY0FBYyxHQUVmLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsMEJBQTBCLEdBRTNCLE1BQU0sa0JBQWtCLENBQUM7QUFD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T0FBTyxRQUFRLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsNEJBQTRCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXN0cmEgd29ya3NwYWNlIGZhY3RvcnkgZm9yIERhdGFicmlja3MgQXBwcy5cbiAqXG4gKiBCdWlsZHMgbmF0aXZlIE1hc3RyYSB3b3Jrc3BhY2UgY29uZmlndXJhdGlvbiBmcm9tIERhdGFicmlja3MgcGF0aHMuIFBhdGhzXG4gKiBtb3VudCBhdCB0aGUgc2FtZSBwYXRoIGJ5IGRlZmF1bHQsIGB+YCByZXNvbHZlcyB0byB0aGUgY3VycmVudCB1c2VyJ3NcbiAqIERhdGFicmlja3Mgd29ya3NwYWNlIGhvbWUsIGFuZCBgL3RtcFsvc3VicGF0aF1gIHJlc29sdmVzIHRvIHN0YWJsZVxuICogdXNlci1zY29wZWQgc3RvcmFnZSB1bmRlciB0aGUgaG9zdCdzIGVwaGVtZXJhbCB0ZW1wIGRpcmVjdG9yeS5cbiAqXG4gKiBEYXRhYnJpY2tzIG1vdW50cyB1c2UgYEBkYngtdG9vbHMvZGF0YWJyaWNrc2Age0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfVxuICogd3JhcHBlZCBieSB7QGxpbmsgZmlsZXN5c3RlbXN9OyBpbmFjY2Vzc2libGUgcm9vdHMgYXJlIHNraXBwZWQgaW5kZXBlbmRlbnRseS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IsIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0LCBwbHVnaW5SZWdpc3RyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgZmlsZXNDYWNoZSBhcyBmaWxlc0NhY2hlUGx1Z2luLFxuICB0eXBlIEZpbGVzQ2FjaGVFeHBvcnRzLFxuICB0eXBlIEZpbGVzQ2FjaGVTY29wZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L2ZpbGVzLWNhY2hlXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSwgd29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IG1hdGNoLCB0eXBlIFBhdGhNYXRjaElucHV0IH0gZnJvbSBcIkBkYngtdG9vbHMvcGF0aFwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzLCB0b2tlbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBmcyBhcyBzaGFyZWRGUyxcbiAgcG9zaXhQYXRoLFxuICB0eXBlIENhY2hlYWJsZUZpbGVTeXN0ZW1PcGVyYXRpb24sXG4gIHR5cGUgRmlsZVN5c3RlbSxcbiAgdHlwZSBGaWxlU3lzdGVtQ2FjaGUsXG4gIHR5cGUgRmlsZVN5c3RlbUNhY2hlT3B0aW9ucyxcbiAgTWVtb3J5RmlsZVN5c3RlbSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWZzXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7XG4gIFdvcmtzcGFjZSxcbiAgdHlwZSBTa2lsbHNSZXNvbHZlcixcbiAgdHlwZSBXb3Jrc3BhY2VDb25maWcsXG4gIHR5cGUgV29ya3NwYWNlRmlsZXN5c3RlbSxcbiAgdHlwZSBXb3Jrc3BhY2VTYW5kYm94LFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcixcbiAgdHlwZSBXb3Jrc3BhY2VUb29sc0NvbmZpZyxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcblxuaW1wb3J0IHtcbiAgTUFTVFJBX1NDT1BFU19LRVksXG4gIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSxcbiAgTUFTVFJBX1VTRVJfS0VZLFxuICByZXNvbHZlVXNlcktleSxcbiAgdHlwZSBVc2VyLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIGZpbGVzeXN0ZW1zLFxuICBNb3VudGVkQ29tcG9zaXRlRmlsZXN5c3RlbSxcbiAgdHlwZSBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlck9wdGlvbnMsXG59IGZyb20gXCIuL2ZpbGVzeXN0ZW1zLnRzXCI7XG5pbXBvcnQgeyBNb250eVNhbmRib3ggfSBmcm9tIFwiLi9tb250eS1zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzU2FuZGJveCwgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBPUkdBTklaQVRJT05fQVNTSVNUQU5UX1BBVEgsIHBlcnNvbmFsV29ya3NwYWNlUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBPQXV0aCBzY29wZXMgdGhhdCBnYXRlIERhdGFicmlja3Mgd29ya3NwYWNlIGZpbGUgbW91bnRzLiAqL1xuY29uc3QgV09SS1NQQUNFX0ZJTEVfU0NPUEVTID0gW1wid29ya3NwYWNlXCIsIFwid29ya3NwYWNlLndvcmtzcGFjZVwiLCBcImFsbC1hcGlzXCJdIGFzIGNvbnN0O1xuY29uc3QgU0NSQVRDSF9NT1VOVCA9IFwiL3RtcFwiO1xuY29uc3QgQ0FDSEVBQkxFX0ZJTEVTWVNURU1fT1BFUkFUSU9OUyA9IFtcbiAgXCJleGlzdHNcIixcbiAgXCJyZWFkRmlsZVwiLFxuICBcInJlYWRkaXJcIixcbiAgXCJzdGF0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uW107XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvd29ya3NwYWNlc1wiKTtcbmxldCB3b3Jrc3BhY2VTb3VyY2VTZXF1ZW5jZSA9IDA7XG5jb25zdCBkYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IG5ldyBXZWFrTWFwPFdvcmtzcGFjZSwgRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnM+KCk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBQZXItcmVxdWVzdCBjb250ZXh0IGZvciBtb3VudCBhbmQgc2tpbGwtZm9sZGVyIHJlc29sdmVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQge1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xufVxuXG4vKipcbiAqIE9uZSBEYXRhYnJpY2tzIHBhdGggbW91bnRlZCBpbnRvIGEgTWFzdHJhIHdvcmtzcGFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnMge1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyBwYXRoIG9yIGB+YCBzaG9ydGN1dCBmb3IgdGhlIGN1cnJlbnQgdXNlcidzIHdvcmtzcGFjZSBob21lLiAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1mcmllbmRseSBtb3VudCBuYW1lIHNob3duIGluIGZpbGVzeXN0ZW0gbGlzdGluZ3MuICovXG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAvKiogTW91bnQgZGVzY3JpcHRpb24gc2hvd24gaW4gZmlsZXN5c3RlbSBsaXN0aW5ncyBhbmQgd29ya3NwYWNlIGluc3RydWN0aW9ucy4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTY2FuIHRoaXMgbW91bnQgZm9yIGBTS0lMTC5tZGAgZmlsZXMuIERlZmF1bHRzIHRvIGB0cnVlYDsgYGZhbHNlYCBtb3VudHNcbiAgICogdGhlIGxvY2F0aW9uIGZvciBmaWxlIHRvb2xzIHdpdGhvdXQgYWRkaW5nIGl0IHRvIHNraWxsIGRpc2NvdmVyeS5cbiAgICovXG4gIHJlYWRhYmxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNraWxsIHJvb3RzIHJlbGF0aXZlIHRvIHRoaXMgZmlsZXN5c3RlbSByb290LiBEZWZhdWx0cyB0byBgW1wiLlwiXWAuXG4gICAqIEVhY2ggcGF0aCBpcyBqb2luZWQgdG8gdGhlIGFjdHVhbCBtb3VudCBwYXRoIGJlZm9yZSBNYXN0cmEgc2NhbnMgaXQuXG4gICAqL1xuICBza2lsbHM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEFsbG93IHdyaXRlIGF0dGVtcHRzIHRvIGEge0BsaW5rIHBhdGh9IG1vdW50LiBEZWZhdWx0cyB0byBgdHJ1ZWAgZm9yXG4gICAqIGAvV29ya3NwYWNlYCByb290cyBhbmQgYGZhbHNlYCBlbHNld2hlcmUuIERhdGFicmlja3MgcGVybWlzc2lvbnMgc3RpbGxcbiAgICogZGV0ZXJtaW5lIHdoZXRoZXIgZWFjaCBtdXRhdGlvbiBzdWNjZWVkcy5cbiAgICovXG4gIHdyaXRhYmxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHdyaXRhYmxlIHtAbGluayBwYXRofSByb290IHdoZW4gbWlzc2luZy4gRGVmYXVsdHMgdG9cbiAgICoge0BsaW5rIHdyaXRhYmxlfTsgc2V0IGBmYWxzZWAgZm9yIHByZS1leGlzdGluZyByb290cyB3aXRoIGNvbmRpdGlvbmFsIGFjY2Vzcy5cbiAgICovXG4gIGNyZWF0ZVJvb3Q/OiBib29sZWFuO1xuICAvKiogTW91bnQgcG9pbnQgaW4gdGhlIGNvbXBvc2l0ZSBuYW1lc3BhY2UuIERhdGFicmlja3MgcGF0aHMgZGVmYXVsdCB0byB0aGVpciBhY3R1YWwgcm9vdC4gKi9cbiAgbW91bnQ/OiBzdHJpbmc7XG59XG5cbi8qKiBTdHJpbmcgc2hvcnRoYW5kIG9yIGZ1bGwgb3B0aW9ucyBmb3Igb25lIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGguICovXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aCA9IHN0cmluZyB8IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoT3B0aW9ucztcblxuLyoqIEZpeGVkIG9yIHJlcXVlc3QtZGVwZW5kZW50IERhdGFicmlja3MgcGF0aCBlbnRyeS4gKi9cbmV4cG9ydCB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWUgPVxuICB8IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoXG4gIHwgZmFsc2VcbiAgfCAoKFxuICAgICAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gICAgKSA9PlxuICAgICAgfCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFxuICAgICAgfCBmYWxzZVxuICAgICAgfCB1bmRlZmluZWRcbiAgICAgIHwgUHJvbWlzZTxEYXRhYnJpY2tzV29ya3NwYWNlUGF0aCB8IGZhbHNlIHwgdW5kZWZpbmVkPik7XG5cbi8qKiBPcGVyYXRpb25zIGFuZCBwYXRoIGdsb2JzIGNhY2hlZCBieSB0aGUgRGF0YWJyaWNrcyBmaWxlc3lzdGVtIHNob3J0Y3V0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXIge1xuICAvKiogQ2FjaGVkIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucy4gT21pdCBmb3IgYGV4aXN0c2AsIGByZWFkRmlsZWAsIGByZWFkZGlyYCwgYW5kIGBzdGF0YC4gKi9cbiAgb3BlcmF0aW9ucz86IENhY2hlYWJsZUZpbGVTeXN0ZW1PcGVyYXRpb24gfCByZWFkb25seSBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uW107XG4gIC8qKiBBYnNvbHV0ZSBvciByb290LXJlbGF0aXZlIGdsb2JzIGFuZCBwcmVkaWNhdGVzLiBgfmAgZXhwYW5kcyBwZXIgcmVxdWVzdC4gKi9cbiAgcGF0aHM/OiBQYXRoTWF0Y2hJbnB1dCB8IHJlYWRvbmx5IFBhdGhNYXRjaElucHV0W107XG59XG5cbi8qKiBGaXhlZCBvciByZXF1ZXN0LWRlcGVuZGVudCBmaWxlc3lzdGVtIGNhY2hlIHNlbGVjdGlvbi4gKi9cbmV4cG9ydCB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZSA9XG4gIHwgYm9vbGVhblxuICB8IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlclxuICB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdXG4gIHwgKChcbiAgICAgIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICAgICkgPT5cbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJcbiAgICAgIHwgcmVhZG9ubHkgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyW11cbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgICB8IFByb21pc2U8XG4gICAgICAgICAgfCBib29sZWFuXG4gICAgICAgICAgfCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJcbiAgICAgICAgICB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdXG4gICAgICAgICAgfCB1bmRlZmluZWRcbiAgICAgICAgPik7XG5cbi8qKiBNb3VudCBtYXAgcGx1cyBvcHRpb25hbCBNYXN0cmEgc2tpbGwgc2NhbiByb290cyByZXNvbHZlZCBmb3Igb25lIHJlcXVlc3QuICovXG5pbnRlcmZhY2UgV29ya3NwYWNlTW91bnRDb250cmlidXRpb24ge1xuICBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKiogUGF0aHMgd2l0aGluIHRoZSBjb21wb3NpdGUgbmFtZXNwYWNlIHdoZXJlIGBTS0lMTC5tZGAgZmlsZXMgYXJlIHNjYW5uZWQuICovXG4gIHNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqIEludGVybmFsIGZpbGVzeXN0ZW0gY29udHJpYnV0aW9uIHJlc29sdmVyLiAqL1xudHlwZSBXb3Jrc3BhY2VNb3VudFJlc29sdmVyID0gKFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbikgPT4gV29ya3NwYWNlTW91bnRDb250cmlidXRpb24gfCBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPjtcblxuLyoqXG4gKiBTYW5kYm94IHNlbGVjdGlvbiBmb3Ige0BsaW5rIGRhdGFicmlja3NXb3Jrc3BhY2V9LiBNb250eSBpcyB0aGUgZGVmYXVsdDtcbiAqIGBmYWxzZWAgZGlzYWJsZXMgY29tbWFuZCBleGVjdXRpb24sIGFuZCBhIE1hc3RyYSBwcm92aWRlciBvciByZXNvbHZlciBpcyBhblxuICogZXhwbGljaXQgcmVwbGFjZW1lbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gPVxuICB8IGZhbHNlXG4gIHwgXCJkYXRhYnJpY2tzXCJcbiAgfCBcIm1vbnR5XCJcbiAgfCBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnNcbiAgfCBXb3Jrc3BhY2VTYW5kYm94XG4gIHwgV29ya3NwYWNlU2FuZGJveFJlc29sdmVyO1xuXG4vKiogTmF0aXZlIE1hc3RyYSB3b3Jrc3BhY2Ugb3B0aW9ucyBwbHVzIERhdGFicmlja3MgcGF0aCBzaG9ydGN1dHMuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zIGV4dGVuZHMgT21pdDxcbiAgV29ya3NwYWNlQ29uZmlnLFxuICBcImZpbGVzeXN0ZW1cIiB8IFwibW91bnRzXCIgfCBcInNhbmRib3hcIiB8IFwic2tpbGxzXCJcbj4ge1xuICAvKipcbiAgICogU3RhcnQgZnJvbSB7QGxpbmsgREVGQVVMVF9EQVRBQlJJQ0tTX1dPUktTUEFDRV9QQVRIU30uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIGFzc2lzdGFudFBhdGhzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERhdGFicmlja3MgcGF0aHMgYXBwZW5kZWQgYWZ0ZXIgdGhlIGRlZmF1bHRzLiBBIHN0cmluZyBpcyBzaG9ydGhhbmQgZm9yXG4gICAqIGB7IHBhdGggfWA7IGEgcmVzb2x2ZXIgbWF5IHJldHVybiBlaXRoZXIgZm9ybSBwZXIgcmVxdWVzdC5cbiAgICovXG4gIHBhdGhzPzogcmVhZG9ubHkgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZVtdO1xuICAvKiogTmF0aXZlIE1hc3RyYSBmaWxlc3lzdGVtcyBjb21wb3NlZCBiZXNpZGUgdGhlIERhdGFicmlja3MgcGF0aHMuICovXG4gIG1vdW50cz86IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKiogUmVwbGFjZSB0aGUgYXV0by1idWlsdCBkeW5hbWljIHNraWxscyByZXNvbHZlci4gKi9cbiAgc2tpbGxzPzogU2tpbGxzUmVzb2x2ZXI7XG4gIC8qKiBGaWxlc3lzdGVtIGNhY2hlIGZpbHRlcnMuIElnbm9yZWQgd2hlbiB0aGUgQXBwS2l0IGZpbGVzLWNhY2hlIHBsdWdpbiBpcyBhYnNlbnQuICovXG4gIGNhY2hlPzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlO1xuICAvKiogQXBwS2l0IHBsdWdpbiBjb250ZXh0IHVzZWQgdG8gZGlzY292ZXIgb3B0aW9uYWwgc2libGluZyBjYXBhYmlsaXRpZXMuICovXG4gIHBsdWdpbkNvbnRleHQ/OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZTtcbiAgLyoqXG4gICAqIENvbW1hbmQgc2FuZGJveC4gRGVmYXVsdHMgdG8gTW9udHkuIFBhc3MgYFwiZGF0YWJyaWNrc1wiYCBvciBhbiBvcHRpb25zXG4gICAqIG9iamVjdCBmb3IgRGF0YWJyaWNrcyBTYW5kYm94LCBgZmFsc2VgIHRvIGRpc2FibGUgY29tbWFuZCBleGVjdXRpb24sIG9yIGFuXG4gICAqIGV4cGxpY2l0IE1hc3RyYSBzYW5kYm94L3Byb3ZpZGVyIHJlc29sdmVyLlxuICAgKi9cbiAgc2FuZGJveD86IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb247XG4gIC8qKlxuICAgKiBFeHRyYSBMT0NBTCBza2lsbCByb290cyBtb3VudGVkIHJlYWQtb25seSBmb3IgZXZlcnkgcmVxdWVzdCdzIHNraWxsIGRpc2NvdmVyeS5cbiAgICogVXNlZCBieSB0aGUgcGx1Z2luIHRvIHN1cmZhY2UgcmVtb3RlIHNraWxscyBwcm92aXNpb25lZCB0byBhIGxvY2FsIHRlbXBcbiAgICogZGlyIGF0IHN0YXJ0dXAgKHNlZSBgcmVtb3RlLXNraWxscy50c2ApLiBEYXRhYnJpY2tzLWhvc3RlZCByZW1vdGUgc2tpbGxzXG4gICAqIG5lZWQgbm8gZW50cnkgaGVyZSAtIHRoZXkgbGFuZCBpbiB0aGUgQXNzaXN0YW50IHRyZWUgdGhlIGJ1aWx0LWluIG1vdW50XG4gICAqIGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWZhdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRGVmYXVsdCBEYXRhYnJpY2tzIHBhdGhzIGZvciBzaGFyZWQgYW5kIGN1cnJlbnQtdXNlciBBZ2VudCBTa2lsbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RBVEFCUklDS1NfV09SS1NQQUNFX1BBVEhTOiByZWFkb25seSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnNbXSA9IFtcbiAge1xuICAgIHBhdGg6IE9SR0FOSVpBVElPTl9BU1NJU1RBTlRfUEFUSCxcbiAgICByZWFkYWJsZTogdHJ1ZSxcbiAgICBza2lsbHM6IFtcInNraWxsc1wiXSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBjcmVhdGVSb290OiBmYWxzZSxcbiAgfSxcbiAge1xuICAgIHBhdGg6IFwiflwiLFxuICAgIHJlYWRhYmxlOiB0cnVlLFxuICAgIHNraWxsczogW1wiLmFzc2lzdGFudC9za2lsbHNcIl0sXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY3JlYXRlUm9vdDogZmFsc2UsXG4gIH0sXG5dO1xuXG4vKipcbiAqIENyZWF0ZSBhIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIHBlci1yZXF1ZXN0IERhdGFicmlja3MgbW91bnRzLlxuICpcbiAqIEBleGFtcGxlIERlZmF1bHQgRGF0YWJyaWNrcyBwYXRoc1xuICogYGBgdHNcbiAqIGRhdGFicmlja3NXb3Jrc3BhY2UoKVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgVXNlIG9ubHkgZXhwbGljaXQgcGF0aHNcbiAqIGBgYHRzXG4gKiBkYXRhYnJpY2tzV29ya3NwYWNlKHtcbiAqICAgYXNzaXN0YW50UGF0aHM6IGZhbHNlLFxuICogICBwYXRoczogW1wifi9wcm9qZWN0XCIsIFwiL3RtcC9wcm9qZWN0XCIsIFwiL1ZvbHVtZXMvbWFpbi9kZWZhdWx0L2RhdGFcIl0sXG4gKiB9KVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgQnVpbGQgYSBzdGFuZGFyZCBNYXN0cmEgd29ya3NwYWNlIHlvdXJzZWxmXG4gKiBgYGB0c1xuICogbmV3IFdvcmtzcGFjZSh7XG4gKiAgIC4uLmRhdGFicmlja3NXb3Jrc3BhY2VDb25maWcoeyBwYXRoczogW1wifi9wcm9qZWN0XCJdIH0pLFxuICogICBzYW5kYm94OiBteVNhbmRib3gsXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhYnJpY2tzV29ya3NwYWNlQ29uZmlnKFxuICBvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IHt9LFxuKTogV29ya3NwYWNlQ29uZmlnIHtcbiAgY29uc3QgeyBpZCwgbmFtZSB9ID0gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnMpO1xuICBjb25zdCBmaWxlc3lzdGVtU291cmNlS2V5ID0gYCR7aWR9OiR7Kyt3b3Jrc3BhY2VTb3VyY2VTZXF1ZW5jZX1gO1xuICBjb25zdCBwYXRocyA9IHJlc29sdmVEYXRhYnJpY2tzV29ya3NwYWNlUGF0aHMob3B0aW9ucyk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRQYXRocyA9IHBhdGhzLmxlbmd0aDtcbiAgY29uc3QgZXh0cmFTa2lsbFBhdGhzID0gb3B0aW9ucy5leHRyYVNraWxsUGF0aHMgPz8gW107XG4gIGNvbnN0IGZpbGVzQ2FjaGUgPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZShvcHRpb25zLnBsdWdpbkNvbnRleHQsIGZpbGVzQ2FjaGVQbHVnaW4pPy5leHBvcnRzKCk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRDYWNoZSA9IG9wdGlvbnMuY2FjaGU7XG4gIGNvbnN0IG1vdW50RmlsZXNDYWNoZSA9IGNvbmZpZ3VyZWRDYWNoZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBmaWxlc0NhY2hlO1xuICBjb25zdCByZXRhaW5GaWxlc3lzdGVtU291cmNlID1cbiAgICBtb3VudEZpbGVzQ2FjaGUgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR5cGVvZiBjb25maWd1cmVkQ2FjaGUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHBhdGhzLmV2ZXJ5KChwYXRoKSA9PiB0eXBlb2YgcGF0aCAhPT0gXCJmdW5jdGlvblwiKTtcbiAgY29uc3QgcmVzb2x2ZXJzID0gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgICBwYXRocyxcbiAgICBvcHRpb25zLm1vdW50cyxcbiAgICBsb2NhbFNraWxsTW91bnRSZXNvbHZlcnMoZXh0cmFTa2lsbFBhdGhzKSxcbiAgICBtb3VudEZpbGVzQ2FjaGUsXG4gICAgY29uZmlndXJlZENhY2hlLFxuICApO1xuICBjb25zdCByZXNvbHZlQ29udHJpYnV0aW9uID0gY29udHJpYnV0aW9uUmVzb2x2ZXIocmVzb2x2ZXJzKTtcbiAgY29uc3QgcmVzb2x2ZUZpbGVzeXN0ZW0gPSAoY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQpID0+XG4gICAgcmVzb2x2ZVdvcmtzcGFjZUZpbGVzeXN0ZW0oXG4gICAgICByZXNvbHZlQ29udHJpYnV0aW9uLFxuICAgICAgY29udGV4dCxcbiAgICAgIHJldGFpbkZpbGVzeXN0ZW1Tb3VyY2UgPyBtb3VudEZpbGVzQ2FjaGUgOiB1bmRlZmluZWQsXG4gICAgICBmaWxlc3lzdGVtU291cmNlS2V5LFxuICAgICk7XG4gIGNvbnN0IHNraWxsczogU2tpbGxzUmVzb2x2ZXIgPVxuICAgIG9wdGlvbnMuc2tpbGxzID8/XG4gICAgKGFzeW5jICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IHJlcXVlc3RDb250ZXh0IH07XG4gICAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlQ29udHJpYnV0aW9uKGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gICAgICAgIGF3YWl0IHJlc29sdmVGaWxlc3lzdGVtKGNvbnRleHQpLFxuICAgICAgICBjb250cmlidXRpb24uc2tpbGxQYXRocyA/PyBbXSxcbiAgICAgICk7XG4gICAgfSk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gZmFsc2U7XG4gIGNvbnN0IGJtMjUgPSBvcHRpb25zLmJtMjUgPz8gdHJ1ZTtcbiAgY29uc3Qgc2FuZGJveCA9IHJlc29sdmVXb3Jrc3BhY2VTYW5kYm94KG9wdGlvbnMuc2FuZGJveCwgaWQsIG5hbWUpO1xuICBjb25zdCB0b29scyA9IHdvcmtzcGFjZVRvb2xzKG9wdGlvbnMudG9vbHMpO1xuICBsb2dnZXIuZGVidWcoXCJ3b3Jrc3BhY2U6Y3JlYXRlXCIsIHtcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIHJlc29sdmVyQ291bnQ6IHJlc29sdmVycy5sZW5ndGgsXG4gICAgY29uZmlndXJlZFBhdGhzLFxuICAgIGN1c3RvbU1vdW50czogT2JqZWN0LmtleXMob3B0aW9ucy5tb3VudHMgPz8ge30pLmxlbmd0aCxcbiAgICBjdXN0b21Ta2lsbHNSZXNvbHZlcjogQm9vbGVhbihvcHRpb25zLnNraWxscyksXG4gICAgY2hlY2tTa2lsbEZpbGVNdGltZSxcbiAgICBibTI1LFxuICAgIGV4dHJhU2tpbGxQYXRoczogZXh0cmFTa2lsbFBhdGhzLmxlbmd0aCxcbiAgICBzYW5kYm94OiBzYW5kYm94ID8gc2FuZGJveE5hbWUob3B0aW9ucy5zYW5kYm94KSA6IFwiZGlzYWJsZWRcIixcbiAgfSk7XG5cbiAgY29uc3Qge1xuICAgIGFzc2lzdGFudFBhdGhzOiBfYXNzaXN0YW50UGF0aHMsXG4gICAgcGF0aHM6IF9wYXRocyxcbiAgICBtb3VudHM6IF9tb3VudHMsXG4gICAgc2tpbGxzOiBfc2tpbGxzLFxuICAgIGNhY2hlOiBfY2FjaGUsXG4gICAgcGx1Z2luQ29udGV4dDogX3BsdWdpbkNvbnRleHQsXG4gICAgc2FuZGJveDogX3NhbmRib3gsXG4gICAgZXh0cmFTa2lsbFBhdGhzOiBfZXh0cmFTa2lsbFBhdGhzLFxuICAgIC4uLndvcmtzcGFjZU9wdGlvbnNcbiAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiB7XG4gICAgLi4ud29ya3NwYWNlT3B0aW9ucyxcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZpbGVzeXN0ZW06IHJlc29sdmVGaWxlc3lzdGVtLFxuICAgIC4uLihyZXNvbHZlcnMubGVuZ3RoID4gMCB8fCBvcHRpb25zLnNraWxsc1xuICAgICAgPyB7XG4gICAgICAgICAgc2tpbGxzLFxuICAgICAgICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzYW5kYm94XG4gICAgICA/IHtcbiAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIGluc3RydWN0aW9uczogeyBkeW5hbWljU2FuZGJveDogXCJyZXNvbHZlXCIgYXMgY29uc3QgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgYm0yNSxcbiAgICB0b29scyxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZSBhIG5hdGl2ZSBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZnJvbSB7QGxpbmsgZGF0YWJyaWNrc1dvcmtzcGFjZUNvbmZpZ30uICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YWJyaWNrc1dvcmtzcGFjZShvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IHt9KTogV29ya3NwYWNlIHtcbiAgY29uc3Qgd29ya3NwYWNlID0gbmV3IFdvcmtzcGFjZShkYXRhYnJpY2tzV29ya3NwYWNlQ29uZmlnKG9wdGlvbnMpKTtcbiAgZGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMuc2V0KHdvcmtzcGFjZSwgb3B0aW9ucyk7XG4gIHJldHVybiB3b3Jrc3BhY2U7XG59XG5cbi8qKiBAaW50ZXJuYWwgQmluZCBhIGNhbGxlci1jcmVhdGVkIERhdGFicmlja3Mgd29ya3NwYWNlIHRvIGl0cyBBcHBLaXQgcGx1Z2luIGNvbnRleHQuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KFxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZSxcbiAgcGx1Z2luQ29udGV4dDogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2Uge1xuICBjb25zdCBvcHRpb25zID0gZGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMuZ2V0KHdvcmtzcGFjZSk7XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnBsdWdpbkNvbnRleHQgIT09IHVuZGVmaW5lZCB8fCBwbHVnaW5Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd29ya3NwYWNlO1xuICB9XG4gIHJldHVybiBkYXRhYnJpY2tzV29ya3NwYWNlKHsgLi4ub3B0aW9ucywgcGx1Z2luQ29udGV4dCB9KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGRlZmF1bHQgYW5kIGNhbGxlci1wcm92aWRlZCBEYXRhYnJpY2tzIHBhdGhzIGluIHByaW9yaXR5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NXb3Jrc3BhY2VQYXRocyhcbiAgb3B0aW9uczogUGljazxEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucywgXCJhc3Npc3RhbnRQYXRoc1wiIHwgXCJwYXRoc1wiPiA9IHt9LFxuKTogRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZVtdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi4ob3B0aW9ucy5hc3Npc3RhbnRQYXRocyA9PT0gZmFsc2UgPyBbXSA6IERFRkFVTFRfREFUQUJSSUNLU19XT1JLU1BBQ0VfUEFUSFMpLFxuICAgIC4uLihvcHRpb25zLnBhdGhzID8/IFtdKSxcbiAgXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcml2YXRlIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5mdW5jdGlvbiB3b3Jrc3BhY2VUb29scyhjb25maWd1cmVkOiBXb3Jrc3BhY2VUb29sc0NvbmZpZyB8IHVuZGVmaW5lZCk6IFdvcmtzcGFjZVRvb2xzQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIHJlcXVpcmVBcHByb3ZhbDogZmFsc2UsXG4gICAgLi4uY29uZmlndXJlZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZVNhbmRib3goXG4gIHNlbGVjdGlvbjogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiB8IHVuZGVmaW5lZCxcbiAgd29ya3NwYWNlSWQ6IHN0cmluZyxcbiAgd29ya3NwYWNlTmFtZTogc3RyaW5nLFxuKTogV29ya3NwYWNlU2FuZGJveCB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBzZWxlY3Rpb24gPz8gXCJtb250eVwiO1xuICBpZiAoY29uZmlndXJlZCA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChjb25maWd1cmVkID09PSBcIm1vbnR5XCIpIHJldHVybiBuZXcgTW9udHlTYW5kYm94KCk7XG4gIGlmICh0eXBlb2YgY29uZmlndXJlZCA9PT0gXCJmdW5jdGlvblwiIHx8IGlzU2FuZGJveChjb25maWd1cmVkKSkgcmV0dXJuIGNvbmZpZ3VyZWQ7XG5cbiAgY29uc3Qgb3B0aW9uczogRGF0YWJyaWNrc1dvcmtzcGFjZVNhbmRib3hPcHRpb25zID1cbiAgICBjb25maWd1cmVkID09PSBcImRhdGFicmlja3NcIiA/IHsgcHJvdmlkZXI6IFwiZGF0YWJyaWNrc1wiIH0gOiBjb25maWd1cmVkO1xuICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4ge1xuICAgIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICAgIGlmICghdXNlcikge1xuICAgICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICAgIFwiRGF0YWJyaWNrcyBzYW5kYm94IHVzZXIgY29udGV4dFwiLFxuICAgICAgICBcIkludm9rZSBjb21tYW5kIHRvb2xzIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIE1hc3RyYSBwbHVnaW4uXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBjb25maWd1cmVkSWQgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMuc2FuZGJveElkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBvcHRpb25zLnNhbmRib3hJZCh7IHJlcXVlc3RDb250ZXh0IH0pXG4gICAgICAgIDogb3B0aW9ucy5zYW5kYm94SWQ7XG4gICAgY29uc3Qgc2FuZGJveElkID0gY29uZmlndXJlZElkID8/IGRlZmF1bHRTYW5kYm94SWQod29ya3NwYWNlSWQsIHVzZXIuaWQpO1xuICAgIGNvbnN0IGNsaWVudCA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5jbGllbnQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG9wdGlvbnMuY2xpZW50KHsgcmVxdWVzdENvbnRleHQgfSlcbiAgICAgICAgOiAob3B0aW9ucy5jbGllbnQgPz8gY3JlYXRlV29ya3NwYWNlQ2xpZW50KCkpO1xuICAgIGNvbnN0IHtcbiAgICAgIHByb3ZpZGVyOiBfcHJvdmlkZXIsXG4gICAgICBzYW5kYm94SWQ6IF9zYW5kYm94SWQsXG4gICAgICBjbGllbnQ6IF9jbGllbnQsXG4gICAgICAuLi5zYW5kYm94T3B0aW9uc1xuICAgIH0gPSBvcHRpb25zO1xuICAgIHJldHVybiBuZXcgRGF0YWJyaWNrc1NhbmRib3goe1xuICAgICAgLi4uc2FuZGJveE9wdGlvbnMsXG4gICAgICBjbGllbnQsXG4gICAgICBzYW5kYm94SWQsXG4gICAgICBkaXNwbGF5TmFtZTogb3B0aW9ucy5kaXNwbGF5TmFtZSA/PyBgTWFzdHJhICR7d29ya3NwYWNlTmFtZX1gLFxuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0U2FuZGJveElkKHdvcmtzcGFjZUlkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIC51cGRhdGUob2JqZWN0LnRvU3RhYmxlS2V5KHsgd29ya3NwYWNlSWQsIHVzZXJJZCB9KSlcbiAgICAuZGlnZXN0KFwiaGV4XCIpXG4gICAgLnNsaWNlKDAsIDMyKTtcbiAgcmV0dXJuIGBtYXN0cmEtJHtkaWdlc3R9YDtcbn1cblxuZnVuY3Rpb24gaXNTYW5kYm94KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya3NwYWNlU2FuZGJveCB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBcImlkXCIgaW4gdmFsdWUgJiYgXCJwcm92aWRlclwiIGluIHZhbHVlICYmIFwic3RhdHVzXCIgaW4gdmFsdWUsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNhbmRib3hOYW1lKHNlbGVjdGlvbjogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmIChzZWxlY3Rpb24gPT09IHVuZGVmaW5lZCB8fCBzZWxlY3Rpb24gPT09IFwibW9udHlcIikgcmV0dXJuIFwibW9udHlcIjtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gXCJkYXRhYnJpY2tzXCIpIHJldHVybiBcImRhdGFicmlja3NcIjtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gZmFsc2UpIHJldHVybiBcImRpc2FibGVkXCI7XG4gIGlmICh0eXBlb2Ygc2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBcInJlc29sdmVyXCI7XG4gIHJldHVybiBpc1NhbmRib3goc2VsZWN0aW9uKSA/IHNlbGVjdGlvbi5wcm92aWRlciA6IChzZWxlY3Rpb24ucHJvdmlkZXIgPz8gXCJkYXRhYnJpY2tzXCIpO1xufVxuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIHRoZSByZXF1ZXN0IHRva2VuIGNhcnJpZXMgYSBzY29wZSB0aGF0IGFsbG93cyB3b3Jrc3BhY2VcbiAqIGZpbGUgQVBJIGFjY2VzcyAoYHdvcmtzcGFjZWAgb3IgYGFsbC1hcGlzYCBvbiB7QGxpbmsgTUFTVFJBX1NDT1BFU19LRVl9KS5cbiAqL1xuZnVuY3Rpb24gaGFzV29ya3NwYWNlRmlsZVNjb3BlKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4uaW5jbHVkZXNBY2Nlc3NUb2tlblNjb3BlKFxuICAgIHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1NDT1BFU19LRVkpLFxuICAgIFdPUktTUEFDRV9GSUxFX1NDT1BFUyxcbiAgKTtcbn1cblxuLyoqIFJlc29sdmUgdGhlIHJlcXVlc3QgY2xpZW50IGFuZCBhdXRob3JpemF0aW9uLXNhZmUgZmlsZXMtY2FjaGUgc2NvcGUuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRmlsZXNDYWNoZVNjb3BlKGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KTogUHJvbWlzZTxcbiAgfCB7XG4gICAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbiAgICAgIHNjb3BlOiBGaWxlc0NhY2hlU2NvcGU7XG4gICAgfVxuICB8IHVuZGVmaW5lZFxuPiB7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gY29udGV4dC5yZXF1ZXN0Q29udGV4dDtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBjbGllbnQgPSB1c2VyPy5leGVjdXRpb25Db250ZXh0LmNsaWVudCBhcyBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG4gIGlmICghcmVxdWVzdENvbnRleHQgfHwgIXVzZXIgfHwgIWNsaWVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBjbGllbnQsXG4gICAgc2NvcGU6IHtcbiAgICAgIGhvc3Q6IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKSxcbiAgICAgIHVzZXJLZXk6IHJlc29sdmVVc2VyS2V5KHJlcXVlc3RDb250ZXh0KSxcbiAgICAgIC4uLihwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1dPUktTUEFDRV9JRD8udHJpbSgpXG4gICAgICAgID8geyB3b3Jrc3BhY2VJZDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19XT1JLU1BBQ0VfSUQudHJpbSgpIH1cbiAgICAgICAgOiB7fSksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIEpvaW4gb25lIHJlbGF0aXZlIHNraWxsIHJvb3QgdG8gaXRzIGFjdHVhbCBjb21wb3NpdGUgbW91bnQgcGF0aC4gKi9cbmZ1bmN0aW9uIG1vdW50ZWRTa2lsbFBhdGgobW91bnQ6IHN0cmluZywgc2tpbGxSb290OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocG9zaXhQYXRoLmlzQWJzb2x1dGUoc2tpbGxSb290KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFNraWxsIHBhdGggbXVzdCBiZSByZWxhdGl2ZSB0byBpdHMgbW91bnQ6ICR7c2tpbGxSb290fWApO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwb3NpeFBhdGgubm9ybWFsaXplKHNraWxsUm9vdCk7XG4gIGlmICghbm9ybWFsaXplZC5vaykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFNraWxsIHBhdGggZXNjYXBlcyBpdHMgbW91bnQ6ICR7c2tpbGxSb290fWApO1xuICB9XG4gIHJldHVybiBwb3NpeFBhdGguam9pbihwb3NpeFBhdGgubm9ybWFsaXplUm9vdChtb3VudCksIG5vcm1hbGl6ZWQucGF0aC5zbGljZSgxKSk7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBhIERhdGFicmlja3MgcGF0aCBiZWxvbmdzIHRvIHRoZSB3cml0YWJsZSBXb3Jrc3BhY2UgbmFtZXNwYWNlLiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VSb290KHJvb3Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBub3JtYWxpemVkID0gcG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3Qocm9vdCk7XG4gIHJldHVybiBub3JtYWxpemVkID09PSBcIi9Xb3Jrc3BhY2VcIiB8fCBub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCIvV29ya3NwYWNlL1wiKTtcbn1cblxuLyoqXG4gKiBNb3VudCByZXNvbHZlciBmb3IgdGhlIG5hbWVkIHNraWxsIGZvbGRlcnMuXG4gKlxuICogR2F0ZXMgb24gd29ya3NwYWNlIGZpbGUgc2NvcGUgKG9yIGRldmVsb3BtZW50IG1vZGUpLCB0aGVuIG1vdW50cyBldmVyeVxuICogZm9sZGVyIHdob3NlIGxvY2F0aW9uIHJlc29sdmVzIGZvciB0aGlzIHJlcXVlc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTa2lsbEZvbGRlck1vdW50cyhcbiAgcGF0aHM6IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWVbXSxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIGZpbGVzQ2FjaGU6IEZpbGVzQ2FjaGVFeHBvcnRzIHwgdW5kZWZpbmVkLFxuICBjYWNoZUNvbmZpZzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+ID0ge307XG4gIGNvbnN0IHNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gY29udGV4dC5yZXF1ZXN0Q29udGV4dDtcblxuICBjb25zdCBjYW5Nb3VudERhdGFicmlja3MgPSBCb29sZWFuKHJlcXVlc3RDb250ZXh0ICYmIHNob3VsZE1vdW50U2tpbGxGb2xkZXJzKHJlcXVlc3RDb250ZXh0KSk7XG4gIGNvbnN0IHNjb3BlZCA9IGNhbk1vdW50RGF0YWJyaWNrcyA/IGF3YWl0IHJlc29sdmVGaWxlc0NhY2hlU2NvcGUoY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IHNjb3BlZD8uY2xpZW50O1xuICBjb25zdCBmaWxlU3lzdGVtQ2FjaGUgPVxuICAgIGZpbGVzQ2FjaGUgJiYgc2NvcGVkID8gYXdhaXQgZmlsZXNDYWNoZS5mb3JTY29wZShzY29wZWQuc2NvcGUpIDogdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBwYXRoXSBvZiBwYXRocy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb25maWd1cmVkID0gYXdhaXQgcmVzb2x2ZURhdGFicmlja3NXb3Jrc3BhY2VQYXRoKHBhdGgsIGNvbnRleHQpO1xuICAgIGlmICghY29uZmlndXJlZCkgY29udGludWU7XG4gICAgaWYgKHBvc2l4UGF0aC5pc1dpdGhpblJvb3QoU0NSQVRDSF9NT1VOVCwgY29uZmlndXJlZC5wYXRoKSkge1xuICAgICAgY29uc3QgbW91bnQgPSBjb25maWd1cmVkLm1vdW50ID8/IGNvbmZpZ3VyZWQucGF0aDtcbiAgICAgIG1vdW50c1ttb3VudF0gPSB1c2VyVGVtcEZpbGVzeXN0ZW0oY29udGV4dCwgY29uZmlndXJlZC5wYXRoKTtcbiAgICAgIGlmIChjb25maWd1cmVkLnJlYWRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICBza2lsbFBhdGhzLnB1c2goLi4uKGNvbmZpZ3VyZWQuc2tpbGxzID8/IFtdKS5tYXAoKHBhdGgpID0+IG1vdW50ZWRTa2lsbFBhdGgobW91bnQsIHBhdGgpKSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFjYW5Nb3VudERhdGFicmlja3MpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZS1wYXRoOnNraXBwZWRcIiwge1xuICAgICAgICBwYXRoOiBjb25maWd1cmVkLnBhdGgsXG4gICAgICAgIHJlYXNvbjogIXJlcXVlc3RDb250ZXh0ID8gXCJuby1yZXF1ZXN0LWNvbnRleHRcIiA6IFwibWlzc2luZy13b3Jrc3BhY2Utc2NvcGVcIixcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZVNraWxsRm9sZGVyRmlsZXN5c3RlbShjb25maWd1cmVkLCBjb250ZXh0LCBjYWNoZUNvbmZpZywge1xuICAgICAgY2xpZW50LFxuICAgICAgZmlsZVN5c3RlbUNhY2hlLFxuICAgIH0pO1xuICAgIGlmICghcmVzb2x2ZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1vdW50ID0gY29uZmlndXJlZC5tb3VudCA/PyByZXNvbHZlZC5yb290O1xuICAgIGlmICghbW91bnQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZS1wYXRoOnNraXBwZWRcIiwgeyBpbmRleCwgcmVhc29uOiBcIm1pc3NpbmctbW91bnRcIiB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtb3VudHNbbW91bnRdID0gcmVzb2x2ZWQuZmlsZXN5c3RlbTtcbiAgICBpZiAoY29uZmlndXJlZC5yZWFkYWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgIHNraWxsUGF0aHMucHVzaCguLi4oY29uZmlndXJlZC5za2lsbHMgPz8gW1wiLlwiXSkubWFwKChwYXRoKSA9PiBtb3VudGVkU2tpbGxQYXRoKG1vdW50LCBwYXRoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6bW91bnRlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgbW91bnRzLFxuICAgIHNraWxsUGF0aHMsXG4gIH07XG59XG5cbmludGVyZmFjZSBSZXNvbHZlZERhdGFicmlja3NXb3Jrc3BhY2VQYXRoIHtcbiAgcGF0aDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJlYWRhYmxlPzogYm9vbGVhbjtcbiAgc2tpbGxzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHdyaXRhYmxlPzogYm9vbGVhbjtcbiAgY3JlYXRlUm9vdD86IGJvb2xlYW47XG4gIG1vdW50Pzogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGgoXG4gIHZhbHVlOiBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFZhbHVlLFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbik6IFByb21pc2U8UmVzb2x2ZWREYXRhYnJpY2tzV29ya3NwYWNlUGF0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzZWxlY3RlZCA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgdmFsdWUoY29udGV4dCkgOiB2YWx1ZTtcbiAgaWYgKHNlbGVjdGVkID09PSBmYWxzZSB8fCBzZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb25maWd1cmVkID0gdHlwZW9mIHNlbGVjdGVkID09PSBcInN0cmluZ1wiID8geyBwYXRoOiBzZWxlY3RlZCB9IDogc2VsZWN0ZWQ7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gcmVxdWVzdENvbnRleHRWYWx1ZXMoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVIb21lUGF0aChjb25maWd1cmVkLnBhdGgsIHJlcXVlc3RDb250ZXh0KTtcbiAgaWYgKCFyZXNvbHZlZFBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc29sdmVkTW91bnQgPSByZXNvbHZlSG9tZVBhdGgoY29uZmlndXJlZC5tb3VudCwgcmVxdWVzdENvbnRleHQpO1xuICByZXR1cm4ge1xuICAgIC4uLmNvbmZpZ3VyZWQsXG4gICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgIC4uLihyZXNvbHZlZE1vdW50ID8geyBtb3VudDogcmVzb2x2ZWRNb3VudCB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25lIHNraWxsIGZvbGRlciB0byBhIE1hc3RyYSBmaWxlc3lzdGVtLCBvciBgdW5kZWZpbmVkYCB0byBza2lwIGl0XG4gKiBmb3IgdGhpcyByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJGaWxlc3lzdGVtKFxuICBmb2xkZXI6IFJlc29sdmVkRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGgsXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICBjYWNoZUNvbmZpZzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuICBjYWNoZToge1xuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkO1xuICAgIGZpbGVTeXN0ZW1DYWNoZTogRmlsZVN5c3RlbUNhY2hlIHwgdW5kZWZpbmVkO1xuICB9LFxuKTogUHJvbWlzZTxcbiAgfCB7XG4gICAgICBmaWxlc3lzdGVtOiBXb3Jrc3BhY2VGaWxlc3lzdGVtO1xuICAgICAgcm9vdD86IHN0cmluZztcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgLy8gQSBwYXRoIG1vdW50IG5lZWRzIHRoZSByZXF1ZXN0J3MgT0JPIGNsaWVudCB0byByZWFjaCB0aGUgd29ya3NwYWNlLlxuICBpZiAoIWNhY2hlLmNsaWVudCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcjpza2lwcGVkXCIsIHtcbiAgICAgIHBhdGg6IGZvbGRlci5wYXRoLFxuICAgICAgcmVhc29uOiBcIm1pc3Npbmctb2JvLWNsaWVudFwiLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgcm9vdCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoZm9sZGVyLnBhdGgpO1xuICBpZiAoIXJvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdyaXRhYmxlID0gZm9sZGVyLndyaXRhYmxlID8/IGlzV29ya3NwYWNlUm9vdChyb290KTtcbiAgY29uc3QgY2FjaGVPcHRpb25zID0gY2FjaGUuZmlsZVN5c3RlbUNhY2hlXG4gICAgPyBhd2FpdCByZXNvbHZlRmlsZUNhY2hlT3B0aW9ucyhcbiAgICAgICAgY2FjaGVDb25maWcsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHJvb3QsXG4gICAgICAgIGZvbGRlci5yZWFkYWJsZSA9PT0gZmFsc2UgPyBbXSA6IChmb2xkZXIuc2tpbGxzID8/IFtcIi5cIl0pLFxuICAgICAgKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGRhdGFicmlja3NGaWxlc3lzdGVtKFxuICAgIGNhY2hlLmNsaWVudCxcbiAgICByb290LFxuICAgICF3cml0YWJsZSxcbiAgICBmb2xkZXIuY3JlYXRlUm9vdCA/PyBmb2xkZXIud3JpdGFibGUgPT09IHRydWUsXG4gICAgY2FjaGUuZmlsZVN5c3RlbUNhY2hlLFxuICAgIGNhY2hlT3B0aW9ucyxcbiAgICB7XG4gICAgICAuLi4oZm9sZGVyLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZm9sZGVyLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAuLi4oZm9sZGVyLmRpc3BsYXlOYW1lID8geyBkaXNwbGF5TmFtZTogZm9sZGVyLmRpc3BsYXlOYW1lIH0gOiB7fSksXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIHJlc29sdmVkID8geyAuLi5yZXNvbHZlZCwgcm9vdCB9IDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ2FjaGVDb25maWcoXG4gIHZhbHVlOiBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuKTogUHJvbWlzZTxcbiAgYm9vbGVhbiB8IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlciB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdmFsdWUoY29udGV4dCkgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdENvbnRleHRWYWx1ZXMocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gcmVxdWVzdENvbnRleHQ/LnRvSlNPTigpID8/IHt9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlSG9tZVBhdGgoXG4gIGlucHV0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHJlcXVlc3RDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChpbnB1dCk7XG4gIGlmICghdmFsdWUgfHwgKHZhbHVlICE9PSBcIn5cIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIn4vXCIpKSkgcmV0dXJuIHZhbHVlID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgZW1haWxWYWx1ZSA9IHJlcXVlc3RDb250ZXh0W01BU1RSQV9VU0VSX0VNQUlMX0tFWV07XG4gIGNvbnN0IGVtYWlsID0gdHlwZW9mIGVtYWlsVmFsdWUgPT09IFwic3RyaW5nXCIgPyBzdHJpbmdVdGlscy50cmltVG9OdWxsKGVtYWlsVmFsdWUpIDogdW5kZWZpbmVkO1xuICBpZiAoIWVtYWlsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBob21lID0gcGVyc29uYWxXb3Jrc3BhY2VQYXRoKGVtYWlsKTtcbiAgcmV0dXJuIHZhbHVlID09PSBcIn5cIiA/IGhvbWUgOiBgJHtob21lfS8ke3ZhbHVlLnNsaWNlKDIpfWA7XG59XG5cbmZ1bmN0aW9uIHRvUG9saWN5QXJyYXk8VD4odmFsdWU6IFQgfCByZWFkb25seSBUW10gfCB1bmRlZmluZWQpOiByZWFkb25seSBUW10ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAodmFsdWUgYXMgcmVhZG9ubHkgVFtdKSA6IFt2YWx1ZSBhcyBUXTtcbn1cblxuZnVuY3Rpb24gY2FjaGVGaWx0ZXJNYXRjaGVzKFxuICBwb2xpY3k6IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcixcbiAgb3BlcmF0aW9uOiBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uLFxuICBwYXRoOiBzdHJpbmcsXG4gIHJlcXVlc3RDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcm9vdD86IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBvcGVyYXRpb25zID0gdG9Qb2xpY3lBcnJheShwb2xpY3kub3BlcmF0aW9ucyA/PyBDQUNIRUFCTEVfRklMRVNZU1RFTV9PUEVSQVRJT05TKTtcbiAgaWYgKCFvcGVyYXRpb25zLmluY2x1ZGVzKG9wZXJhdGlvbikpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBvbGljeS5wYXRocyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgaW5wdXRzOiBQYXRoTWF0Y2hJbnB1dFtdID0gW107XG4gIGZvciAoY29uc3QgaW5wdXQgb2YgdG9Qb2xpY3lBcnJheTxQYXRoTWF0Y2hJbnB1dD4ocG9saWN5LnBhdGhzKSkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlucHV0cy5wdXNoKGlucHV0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBleHBhbmRlZCA9IHJlc29sdmVIb21lUGF0aChpbnB1dCwgcmVxdWVzdENvbnRleHQpO1xuICAgIGlmICghZXhwYW5kZWQpIGNvbnRpbnVlO1xuICAgIGlucHV0cy5wdXNoKFxuICAgICAgIXJvb3QgfHwgcG9zaXhQYXRoLmlzQWJzb2x1dGUoZXhwYW5kZWQpIHx8IGV4cGFuZGVkLnN0YXJ0c1dpdGgoXCIqKlwiKVxuICAgICAgICA/IGV4cGFuZGVkXG4gICAgICAgIDogYCR7cG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3Qocm9vdCl9LyR7ZXhwYW5kZWQucmVwbGFjZSgvXlxcLlxcLy8sIFwiXCIpfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gaW5wdXRzLmxlbmd0aCA+IDAgJiYgbWF0Y2gudG9QYXRoTWF0Y2hlciguLi5pbnB1dHMpKHBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRmlsZUNhY2hlT3B0aW9ucyhcbiAgY29uZmlndXJlZDogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbiAgcm9vdDogc3RyaW5nLFxuICBza2lsbFBhdGhzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8RmlsZVN5c3RlbUNhY2hlT3B0aW9ucyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IHJlcXVlc3RDb250ZXh0VmFsdWVzKGNvbnRleHQucmVxdWVzdENvbnRleHQpO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVDYWNoZUNvbmZpZyhjb25maWd1cmVkLCBjb250ZXh0KTtcbiAgaWYgKHJlc29sdmVkID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHJlc29sdmVkID09PSB1bmRlZmluZWQgfHwgcmVzb2x2ZWQgPT09IHRydWUpIHtcbiAgICBjb25zdCByb290cyA9IHNraWxsUGF0aHMubWFwKChwYXRoKSA9PiBtb3VudGVkU2tpbGxQYXRoKHJvb3QsIHBhdGgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgb3BlcmF0aW9uczogQ0FDSEVBQkxFX0ZJTEVTWVNURU1fT1BFUkFUSU9OUyxcbiAgICAgIGZpbHRlcjogKG9wZXJhdGlvbiwgcGF0aCkgPT5cbiAgICAgICAgb3BlcmF0aW9uICE9PSBcInJlYWRGaWxlXCIgfHxcbiAgICAgICAgcm9vdHMuc29tZSgoc2tpbGxSb290KSA9PiBwb3NpeFBhdGguaXNXaXRoaW5Sb290KHNraWxsUm9vdCwgcGF0aCkpLFxuICAgIH07XG4gIH1cbiAgY29uc3QgcG9saWNpZXMgPSB0b1BvbGljeUFycmF5KHJlc29sdmVkKTtcbiAgaWYgKHBvbGljaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3BlcmF0aW9ucyA9IFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgcG9saWNpZXMuZmxhdE1hcCgocG9saWN5KSA9PlxuICAgICAgICB0b1BvbGljeUFycmF5KHBvbGljeS5vcGVyYXRpb25zID8/IENBQ0hFQUJMRV9GSUxFU1lTVEVNX09QRVJBVElPTlMpLFxuICAgICAgKSxcbiAgICApLFxuICBdO1xuICByZXR1cm4ge1xuICAgIG9wZXJhdGlvbnMsXG4gICAgZmlsdGVyOiAob3BlcmF0aW9uLCBwYXRoKSA9PlxuICAgICAgcG9saWNpZXMuc29tZSgocG9saWN5KSA9PiBjYWNoZUZpbHRlck1hdGNoZXMocG9saWN5LCBvcGVyYXRpb24sIHBhdGgsIHJlcXVlc3RDb250ZXh0LCByb290KSksXG4gIH07XG59XG5cbi8qKlxuICogRmlsbCBpbiBgaWRgIGFuZCBgbmFtZWAgd2hlbiBlaXRoZXIgaXMgb21pdHRlZCBvbiB7QGxpbmsgRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnN9LlxuICogU2x1Z2lmaWVzIGBuYW1lYCBpbnRvIGBpZGA7IHRva2VuaXplcyBgaWRgIGludG8gYSBkaXNwbGF5IGBuYW1lYC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnM6IERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zKToge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59IHtcbiAgbGV0IGlkID0gb3B0aW9ucy5pZDtcbiAgbGV0IG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIGlmICghaWQpIHtcbiAgICBpZCA9IG5hbWUgPyBzdHJpbmdVdGlscy50b1NsdWcobmFtZSkgOiBcIndvcmtzcGFjZVwiO1xuICB9XG4gIGlmICghbmFtZSkge1xuICAgIG5hbWUgPSBBcnJheS5mcm9tKHN0cmluZ1V0aWxzLnRva2VuaXplKGlkKSkuam9pbihcIiBcIik7XG4gIH1cbiAgcmV0dXJuIHsgaWQsIG5hbWUgfTtcbn1cblxuLyoqIENvbGxlY3QgdGhlIHNraWxsLWZvbGRlciByZXNvbHZlciBhbmQgYW55IGNhbGxlci1zdXBwbGllZCBvbmVzLiAqL1xuZnVuY3Rpb24gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgcGF0aHM6IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWVbXSxcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPiB8IHVuZGVmaW5lZCxcbiAgbG9jYWxNb3VudHM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgZmlsZXNDYWNoZTogRmlsZXNDYWNoZUV4cG9ydHMgfCB1bmRlZmluZWQsXG4gIGNhY2hlQ29uZmlnOiBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUgfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtdO1xuICBjb25zdCBwYXRoQ291bnQgPSBwYXRocy5sZW5ndGg7XG4gIGlmIChwYXRoQ291bnQgPiAwKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2goKGNvbnRleHQpID0+IHJlc29sdmVTa2lsbEZvbGRlck1vdW50cyhwYXRocywgY29udGV4dCwgZmlsZXNDYWNoZSwgY2FjaGVDb25maWcpKTtcbiAgfVxuICBpZiAobW91bnRzICYmIE9iamVjdC5rZXlzKG1vdW50cykubGVuZ3RoID4gMCkgcmVzb2x2ZXJzLnB1c2goKCkgPT4gKHsgbW91bnRzIH0pKTtcbiAgcmVzb2x2ZXJzLnB1c2goLi4ubG9jYWxNb3VudHMpO1xuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJzXCIsIHtcbiAgICBwYXRoQ291bnQsXG4gICAgY3VzdG9tTW91bnRDb3VudDogT2JqZWN0LmtleXMobW91bnRzID8/IHt9KS5sZW5ndGgsXG4gICAgbG9jYWxNb3VudENvdW50OiBsb2NhbE1vdW50cy5sZW5ndGgsXG4gICAgdG90YWxSZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVycztcbn1cblxuLyoqIFN0YWJsZSB1c2VyLXNjb3BlZCBsb2NhbCBzdG9yYWdlIHVuZGVyIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0ncyB0ZW1wIGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIHVzZXJUZW1wRmlsZXN5c3RlbShcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIHdvcmtzcGFjZVBhdGg6IHN0cmluZyxcbik6IFdvcmtzcGFjZUZpbGVzeXN0ZW0ge1xuICBjb25zdCB1c2VyS2V5ID0gcmVzb2x2ZVVzZXJLZXkoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKG9iamVjdC50b1N0YWJsZUtleSh7IHBhY2thZ2U6IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCIsIHVzZXJLZXkgfSkpXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zbGljZSgwLCAxNik7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdCh3b3Jrc3BhY2VQYXRoKTtcbiAgY29uc3QgcmVsYXRpdmUgPSBub3JtYWxpemVkID09PSBTQ1JBVENIX01PVU5UID8gXCJcIiA6IG5vcm1hbGl6ZWQuc2xpY2UoYCR7U0NSQVRDSF9NT1VOVH0vYC5sZW5ndGgpO1xuICBjb25zdCBzb3VyY2UgPSBuZXcgTG9jYWxGaWxlU3lzdGVtKHtcbiAgICByb290OiBqb2luKHRtcGRpcigpLCBcImRieC10b29sc1wiLCBcIm1hc3RyYVwiLCBkaWdlc3QsIHJlbGF0aXZlKSxcbiAgICByZWFkT25seTogZmFsc2UsXG4gICAgY3JlYXRlUm9vdDogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiBmaWxlc3lzdGVtcyhzb3VyY2UsIHtcbiAgICBkaXNwbGF5TmFtZTogXCJUZW1wb3JhcnkgRmlsZXNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiVXNlci1zY29wZWQgdGVtcG9yYXJ5IGZpbGVzIHJldGFpbmVkIHdoaWxlIHRoZSBob3N0IGtlZXBzIGl0cyBlcGhlbWVyYWwgdGVtcCBzdG9yYWdlLlwiLFxuICB9KTtcbn1cblxuLyoqIE1vdW50IHN0YXJ0dXAtcHJvdmlzaW9uZWQgbG9jYWwgc2tpbGwgcm9vdHMgaW50byBNYXN0cmEncyB3b3Jrc3BhY2UgZmlsZXN5c3RlbS4gKi9cbmZ1bmN0aW9uIGxvY2FsU2tpbGxNb3VudFJlc29sdmVycyhwYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQocGF0aHMubWFwKChwYXRoKSA9PiBwYXRoLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pKV0ubWFwKChyb290KSA9PiB7XG4gICAgY29uc3QgbW91bnQgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChyb290KTtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgTG9jYWxGaWxlU3lzdGVtKHtcbiAgICAgIHJvb3QsXG4gICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgIGNyZWF0ZVJvb3Q6IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IGZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtcyhzb3VyY2UsIHsgcmVhZE9ubHk6IHRydWUgfSk7XG4gICAgcmV0dXJuICgpID0+ICh7XG4gICAgICBtb3VudHM6IHsgW21vdW50XTogZmlsZXN5c3RlbSB9LFxuICAgICAgc2tpbGxQYXRoczogW21vdW50XSxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2F0ZSBza2lsbC1mb2xkZXIgbW91bnRzIG9uIHRoZSByZXF1ZXN0J3MgdG9rZW4uXG4gKlxuICogQWx3YXlzIGFsbG93cyBtb3VudHMgaW4gZGV2ZWxvcG1lbnQ7IGluIG90aGVyIGVudmlyb25tZW50cyByZXF1aXJlc1xuICoge0BsaW5rIGhhc1dvcmtzcGFjZUZpbGVTY29wZX0uXG4gKi9cbmZ1bmN0aW9uIHNob3VsZE1vdW50U2tpbGxGb2xkZXJzKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCk6IGJvb2xlYW4ge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBoYXNXb3Jrc3BhY2VGaWxlU2NvcGUocmVxdWVzdENvbnRleHQpO1xufVxuXG4vKipcbiAqIFdyYXAgYSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19IGFzIGEgTWFzdHJhIGZpbGVzeXN0ZW0uIE1pc3Npbmcgb3JcbiAqIGluYWNjZXNzaWJsZSByb290cyByZXR1cm4gYHVuZGVmaW5lZGAgc28gb3RoZXIgYWNjZXNzaWJsZSByb290cyByZW1haW5cbiAqIHVzYWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGF0YWJyaWNrc0ZpbGVzeXN0ZW0oXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICByb290OiBzdHJpbmcsXG4gIHJlYWRPbmx5OiBib29sZWFuID0gdHJ1ZSxcbiAgY3JlYXRlUm9vdDogYm9vbGVhbiA9ICFyZWFkT25seSxcbiAgZmlsZVN5c3RlbUNhY2hlPzogRmlsZVN5c3RlbUNhY2hlLFxuICBjYWNoZU9wdGlvbnM/OiBGaWxlU3lzdGVtQ2FjaGVPcHRpb25zLFxuICBhZGFwdGVyT3B0aW9uczogUGljazxNYXN0cmFGaWxlU3lzdGVtQWRhcHRlck9wdGlvbnMsIFwiZGVzY3JpcHRpb25cIiB8IFwiZGlzcGxheU5hbWVcIj4gPSB7fSxcbik6IFByb21pc2U8XG4gIHwge1xuICAgICAgZmlsZXN5c3RlbTogV29ya3NwYWNlRmlsZXN5c3RlbTtcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgY29uc3QgZnMgPSBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oe1xuICAgIGNsaWVudDogKCkgPT4gd29ya3NwYWNlQ2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KHJlcXVlc3RXb3Jrc3BhY2VDbGllbnQoY2xpZW50KSksXG4gICAgcm9vdCxcbiAgICByZWFkT25seSxcbiAgICBjcmVhdGVSb290LFxuICB9KTtcbiAgY29uc3QgY2FjaGVkID1cbiAgICBmaWxlU3lzdGVtQ2FjaGUgJiYgY2FjaGVPcHRpb25zID8gc2hhcmVkRlMuY2FjaGUoZnMsIGZpbGVTeXN0ZW1DYWNoZSwgY2FjaGVPcHRpb25zKSA6IGZzO1xuICBjb25zdCBzb3VyY2UgPSB2ZXJpZnlGaXJzdEZpbGVTeXN0ZW1BY2Nlc3MoY2FjaGVkLCAoKSA9PiBmcy5zdGF0KFwiLlwiKSwgcm9vdCk7XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtcyhzb3VyY2UsIHsgLi4uYWRhcHRlck9wdGlvbnMsIHJlYWRPbmx5IH0pO1xuICB0cnkge1xuICAgIGF3YWl0IGZpbGVzeXN0ZW0uaW5pdCgpO1xuICAgIGlmIChhd2FpdCBmaWxlc3lzdGVtLmV4aXN0cyhcIi5cIikpIHtcbiAgICAgIHJldHVybiB7IGZpbGVzeXN0ZW0gfTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6c2tpcHBlZFwiLCB7XG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHksXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogQGludGVybmFsIEtlZXAgc2VydmljZSBjb250ZXh0IGZyb20gcmVwbGFjaW5nIHRoZSByZXF1ZXN0LXNjb3BlZCB3b3Jrc3BhY2UgY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RXb3Jrc3BhY2VDbGllbnQoXG4gIGluaXRpYWxDbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2YgYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHRcbiAgPiA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCksXG4pOiBXb3Jrc3BhY2VDbGllbnQge1xuICBpZiAoXG4gICAgZXhlY3V0aW9uQ29udGV4dCAmJlxuICAgIFwiaXNVc2VyQ29udGV4dFwiIGluIGV4ZWN1dGlvbkNvbnRleHQgJiZcbiAgICBleGVjdXRpb25Db250ZXh0LmlzVXNlckNvbnRleHQgPT09IHRydWVcbiAgKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50O1xuICB9XG4gIHJldHVybiBpbml0aWFsQ2xpZW50O1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlGaXJzdEZpbGVTeXN0ZW1BY2Nlc3M8VEZpbGVTeXN0ZW0gZXh0ZW5kcyBGaWxlU3lzdGVtPihcbiAgZmlsZXN5c3RlbTogVEZpbGVTeXN0ZW0sXG4gIHJlYWRQcm9iZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgcm9vdDogc3RyaW5nLFxuKTogVEZpbGVTeXN0ZW0ge1xuICBsZXQgcmVhZENoZWNrOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICBsZXQgd3JpdGVWZXJpZmllZCA9IGZhbHNlO1xuICBjb25zdCBib3VuZE1ldGhvZHMgPSBuZXcgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPigpO1xuICBjb25zdCByZWFkT3BlcmF0aW9ucyA9IG5ldyBTZXQ8UHJvcGVydHlLZXk+KFtcImV4aXN0c1wiLCBcInJlYWRGaWxlXCIsIFwicmVhZGRpclwiLCBcInN0YXRcIl0pO1xuICBjb25zdCB3cml0ZU9wZXJhdGlvbnMgPSBuZXcgU2V0PFByb3BlcnR5S2V5PihbXG4gICAgXCJhcHBlbmRGaWxlXCIsXG4gICAgXCJjb3B5RmlsZVwiLFxuICAgIFwiZGVsZXRlRmlsZVwiLFxuICAgIFwibWtkaXJcIixcbiAgICBcIm1vdmVGaWxlXCIsXG4gICAgXCJybWRpclwiLFxuICAgIFwid3JpdGVGaWxlXCIsXG4gIF0pO1xuICBjb25zdCB2ZXJpZnlSZWFkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHJlYWRDaGVjayA/Pz0gUHJvbWlzZS5yZXNvbHZlKHJlYWRQcm9iZSgpKS50aGVuKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlYWRDaGVjaztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVhZENoZWNrID0gdW5kZWZpbmVkO1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiZGF0YWJyaWNrcy1tb3VudDpyZWFkLWNoZWNrLWZhaWxlZFwiLCB7XG4gICAgICAgIHJvb3QsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbmV3IFByb3h5KGZpbGVzeXN0ZW0sIHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5LCB0YXJnZXQpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsdWU7XG4gICAgICBpZiAoYm91bmRNZXRob2RzLmhhcyhwcm9wZXJ0eSkpIHJldHVybiBib3VuZE1ldGhvZHMuZ2V0KHByb3BlcnR5KTtcbiAgICAgIGNvbnN0IGRlbGVnYXRlZCA9IHZhbHVlLmJpbmQodGFyZ2V0KSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICAgICAgbGV0IG1ldGhvZCA9IGRlbGVnYXRlZDtcbiAgICAgIGlmIChyZWFkT3BlcmF0aW9ucy5oYXMocHJvcGVydHkpKSB7XG4gICAgICAgIG1ldGhvZCA9IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICBhd2FpdCB2ZXJpZnlSZWFkKCk7XG4gICAgICAgICAgcmV0dXJuIGRlbGVnYXRlZCguLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAod3JpdGVPcGVyYXRpb25zLmhhcyhwcm9wZXJ0eSkpIHtcbiAgICAgICAgbWV0aG9kID0gYXN5bmMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWxlZ2F0ZWQoLi4uYXJncyk7XG4gICAgICAgICAgICBpZiAoIXdyaXRlVmVyaWZpZWQpIHtcbiAgICAgICAgICAgICAgd3JpdGVWZXJpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6d3JpdGUtY2hlY2stcGFzc2VkXCIsIHsgcm9vdCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICghd3JpdGVWZXJpZmllZCkge1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJkYXRhYnJpY2tzLW1vdW50OndyaXRlLWNoZWNrLWZhaWxlZFwiLCB7XG4gICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGJvdW5kTWV0aG9kcy5zZXQocHJvcGVydHksIG1ldGhvZCk7XG4gICAgICByZXR1cm4gbWV0aG9kO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFJ1biBldmVyeSBtb3VudCByZXNvbHZlciBmb3Igb25lIHJlcXVlc3QgYW5kIG1lcmdlIG1vdW50cyBwbHVzIHNraWxsIHBhdGhzLlxuICogTGF0ZXIgcmVzb2x2ZXJzIG92ZXJ3cml0ZSBtb3VudCBrZXlzIGZyb20gZWFybGllciBvbmVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3Qgc2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzb2x2ZXJdIG9mIHJlc29sdmVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlcihjb250ZXh0KTtcbiAgICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJcIiwge1xuICAgICAgaW5kZXgsXG4gICAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKGNvbnRyaWJ1dGlvbi5tb3VudHMpLFxuICAgICAgc2tpbGxQYXRoczogY29udHJpYnV0aW9uLnNraWxsUGF0aHMgPz8gW10sXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihtb3VudHMsIGNvbnRyaWJ1dGlvbi5tb3VudHMpO1xuICAgIGlmIChjb250cmlidXRpb24uc2tpbGxQYXRocz8ubGVuZ3RoKSB7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uY29udHJpYnV0aW9uLnNraWxsUGF0aHMpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czptZXJnZWRcIiwge1xuICAgIG1vdW50S2V5czogT2JqZWN0LmtleXMobW91bnRzKSxcbiAgICBza2lsbFBhdGhzLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG1vdW50cyxcbiAgICBza2lsbFBhdGhzLFxuICB9O1xufVxuXG4vKipcbiAqIER5bmFtaWMgZmlsZXN5c3RlbSByZXNvbHZlciBwYXNzZWQgdG8gTWFzdHJhIHtAbGluayBXb3Jrc3BhY2V9LlxuICpcbiAqIFJldHVybnMgYSB7QGxpbmsgQ29tcG9zaXRlRmlsZXN5c3RlbX0gb3ZlciBldmVyeSBwYXRoIHRoYXQgcmVzb2x2ZWQgZm9yIHRoZVxuICogcmVxdWVzdC4gQW4gZW1wdHkgY29tcG9zaXRlIGV4cG9zZXMgbm8gaW1wbGljaXQgbG9jYWwgc3RvcmFnZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZUZpbGVzeXN0ZW0oXG4gIHJlc29sdmVDb250cmlidXRpb246IChjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCkgPT4gUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4sXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICBmaWxlc0NhY2hlPzogRmlsZXNDYWNoZUV4cG9ydHMsXG4gIHNvdXJjZUtleT86IHN0cmluZyxcbik6IFByb21pc2U8V29ya3NwYWNlRmlsZXN5c3RlbT4ge1xuICBjb25zdCB7IG1vdW50cyB9ID0gYXdhaXQgcmVzb2x2ZUNvbnRyaWJ1dGlvbihjb250ZXh0KTtcbiAgY29uc3QgbW91bnRLZXlzID0gT2JqZWN0LmtleXMobW91bnRzKTtcbiAgaWYgKG1vdW50S2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJmaWxlc3lzdGVtOmVtcHR5XCIsIHtcbiAgICAgIGhhc1JlcXVlc3RDb250ZXh0OiBCb29sZWFuKGNvbnRleHQucmVxdWVzdENvbnRleHQpLFxuICAgIH0pO1xuICAgIHJldHVybiBmaWxlc3lzdGVtcyhuZXcgTWVtb3J5RmlsZVN5c3RlbSh7IHJvb3Q6IFwiL1wiLCByZWFkT25seTogdHJ1ZSB9KSwge1xuICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTpjb21wb3NpdGVcIiwgeyBtb3VudEtleXMgfSk7XG4gIGNvbnN0IGxvYWQgPSAoKSA9PiBuZXcgTW91bnRlZENvbXBvc2l0ZUZpbGVzeXN0ZW0oeyBtb3VudHMgfSk7XG4gIGlmICghZmlsZXNDYWNoZSkgcmV0dXJuIGxvYWQoKTtcbiAgY29uc3Qgc2NvcGVkID0gYXdhaXQgcmVzb2x2ZUZpbGVzQ2FjaGVTY29wZShjb250ZXh0KTtcbiAgaWYgKCFzY29wZWQpIHJldHVybiBsb2FkKCk7XG4gIHJldHVybiBmaWxlc0NhY2hlLmZvckZpbGVTeXN0ZW0oc2NvcGVkLnNjb3BlLCB7IHBhdGhzOiBtb3VudEtleXMsIGtleTogc291cmNlS2V5IH0sIGxvYWQpO1xufVxuXG4vKipcbiAqIEV4cGFuZCBza2lsbCByb290cyBpbnRvIGNvbmNyZXRlIHNraWxsIGRpcmVjdG9yaWVzIGFuZCBrZWVwIHRoZSBmaXJzdFxuICogc2FtZS1uYW1lZCBkaXJlY3RvcnkuIE1hc3RyYSBzdGlsbCBvd25zIHBhcnNpbmcsIGluZGV4aW5nLCBhbmQgcmVmcmVzaGVzLFxuICogd2hpbGUgZWFybGllciBjb25maWd1cmVkIHJvb3RzIHJldGFpbiBwcmVjZWRlbmNlIG92ZXIgbGF0ZXIgcm9vdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gIGZpbGVzeXN0ZW06IFdvcmtzcGFjZUZpbGVzeXN0ZW0sXG4gIHJvb3RzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZGRpcihyb290KTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSBcImZpbGVcIiAmJiBlbnRyeS5uYW1lID09PSBcIlNLSUxMLm1kXCIpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwb3NpeFBhdGguYmFzZW5hbWUocm9vdCk7XG4gICAgICAgIGlmICghc2VsZWN0ZWQuaGFzKG5hbWUpKSBzZWxlY3RlZC5zZXQobmFtZSwgcm9vdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS50eXBlICE9PSBcImRpcmVjdG9yeVwiIHx8IHNlbGVjdGVkLmhhcyhlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICAgIHNlbGVjdGVkLnNldChlbnRyeS5uYW1lLCBwb3NpeFBhdGguam9pbihyb290LCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLXJvb3Q6c2tpcHBlZFwiLCB7XG4gICAgICAgIHJvb3QsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5zZWxlY3RlZC52YWx1ZXMoKV07XG59XG5cbi8qKiBNZW1vaXplIG9uZSBjb21wbGV0ZSBtb3VudCBjb250cmlidXRpb24gZm9yIGVhY2ggcmVxdWVzdCBjb250ZXh0LiAqL1xuZnVuY3Rpb24gY29udHJpYnV0aW9uUmVzb2x2ZXIoXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuKTogKGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KSA9PiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IHNjb3BlZCA9IG5ldyBXZWFrTWFwPFJlcXVlc3RDb250ZXh0LCBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPj4oKTtcbiAgbGV0IHVuc2NvcGVkOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIChjb250ZXh0KSA9PiB7XG4gICAgaWYgKCFjb250ZXh0LnJlcXVlc3RDb250ZXh0KSB7XG4gICAgICB1bnNjb3BlZCA/Pz0gcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihyZXNvbHZlcnMsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHVuc2NvcGVkO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZyA9IHNjb3BlZC5nZXQoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgY29uc3QgcGVuZGluZyA9IHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24ocmVzb2x2ZXJzLCBjb250ZXh0KTtcbiAgICBzY29wZWQuc2V0KGNvbnRleHQucmVxdWVzdENvbnRleHQsIHBlbmRpbmcpO1xuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufVxuIl19
|