@dbx-tools/appkit-mastra 0.9.132 → 0.9.138
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 +46 -18
- package/index.ts +3 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.js +3 -2
- package/lib/src/config.d.ts +12 -17
- package/lib/src/config.js +5 -4
- package/lib/src/feedback-mode.d.ts +15 -0
- package/lib/src/feedback-mode.js +23 -0
- package/lib/src/genie-chat.d.ts +20 -13
- package/lib/src/genie-chat.js +202 -28
- package/lib/src/memory.js +4 -2
- package/lib/src/mlflow.d.ts +1 -14
- package/lib/src/mlflow.js +1 -25
- package/lib/src/model.d.ts +5 -3
- package/lib/src/model.js +7 -4
- package/lib/src/observability.js +6 -7
- package/lib/src/plugin.d.ts +16 -9
- package/lib/src/plugin.js +92 -28
- package/lib/src/server.d.ts +2 -3
- package/lib/src/server.js +5 -7
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +24 -16
- package/src/config.ts +16 -20
- package/src/feedback-mode.ts +35 -0
- package/src/genie-chat.ts +227 -31
- package/src/memory.ts +3 -1
- package/src/mlflow.ts +1 -27
- package/src/model.ts +12 -5
- package/src/observability.ts +5 -6
- package/src/plugin.ts +104 -30
- package/src/server.ts +4 -6
package/lib/src/plugin.js
CHANGED
|
@@ -45,11 +45,14 @@
|
|
|
45
45
|
*/
|
|
46
46
|
import { ExecutionError, genie, getExecutionContext, lakebase, Plugin, toPlugin, } from "@databricks/appkit";
|
|
47
47
|
import { lakebaseResolver, pluginRegistry, telemetry as appkitTelemetry } from "@dbx-tools/appkit";
|
|
48
|
+
import { sendGenieMessageFeedback } from "@dbx-tools/genie/feedback";
|
|
48
49
|
import { modelCatalog } from "@dbx-tools/model";
|
|
49
50
|
import { asyncUtils, errorUtils, log, object, stringUtils } from "@dbx-tools/shared-core";
|
|
50
51
|
import { feedback, routes, wire, } from "@dbx-tools/shared-mastra";
|
|
51
52
|
import { display } from "@dbx-tools/shared-model";
|
|
53
|
+
import { workflowRoute } from "@mastra/ai-sdk";
|
|
52
54
|
import { Mastra } from "@mastra/core/mastra";
|
|
55
|
+
import { RequestContext } from "@mastra/core/request-context";
|
|
53
56
|
import { pipeUIMessageStreamToResponse } from "ai";
|
|
54
57
|
import express from "express";
|
|
55
58
|
import { buildAgents, FALLBACK_AGENT_ID, } from "./agents.js";
|
|
@@ -57,16 +60,17 @@ import { fetchChart } from "./chart.js";
|
|
|
57
60
|
import { agentChatRoutes } from "./chat.js";
|
|
58
61
|
import { attributedUserId, executionContextUserId, MASTRA_CONFIG_SCHEMA, } from "./config.js";
|
|
59
62
|
import { chartFetchDefaults, feedbackWriteDefaults, genieConversationReadDefaults, genieConversationWriteDefaults, genieSuggestionDefaults, modelCatalogueDefaults, statementDataDefaults, } from "./defaults.js";
|
|
63
|
+
import { resolveFeedbackMode } from "./feedback-mode.js";
|
|
60
64
|
import { deleteGenieThread, deleteGenieThreadMessage, genieChatStream, listGenieThreadMessages, listGenieThreads, } from "./genie-chat.js";
|
|
61
65
|
import { collectSpaceSuggestions, resolveGenieSpaces } from "./genie.js";
|
|
62
66
|
import { requestUserId, resolveIdentityMode, useServicePrincipal, } from "./identity.js";
|
|
63
67
|
import { buildMcpServer } from "./mcp.js";
|
|
64
68
|
import { createMemoryBuilder, needsLakebase } from "./memory.js";
|
|
65
|
-
import { flushDirectMlflowTracing, logFeedback,
|
|
69
|
+
import { flushDirectMlflowTracing, logFeedback, mlflowEnabled, mlflowExperimentManagerUrl, } from "./mlflow.js";
|
|
66
70
|
import { resolveDefaultModelId } from "./model.js";
|
|
67
71
|
import { buildObservability, configureOtelPropagation } from "./observability.js";
|
|
68
72
|
import { provisionRemoteSkills } from "./remote-skills.js";
|
|
69
|
-
import { attachRoutePatchMiddleware, attachStaleResumeRecovery, createRequestContext, isMastraRequestAllowed, MastraServer, } from "./server.js";
|
|
73
|
+
import { attachRoutePatchMiddleware, attachStaleResumeRecovery, clearTrustedRequestContext, createRequestContext, isMastraRequestAllowed, MastraServer, stampRequestContextUser, } from "./server.js";
|
|
70
74
|
import { resolveServingConfig } from "./serving.js";
|
|
71
75
|
import { fetchStatementEmbedData, STATEMENT_ROW_CAP } from "./statement.js";
|
|
72
76
|
import { attachChatTurnTelemetry, registerAppMlflowTraceInfoProcessor } from "./telemetry.js";
|
|
@@ -167,12 +171,18 @@ export class MastraPlugin extends Plugin {
|
|
|
167
171
|
mastraApp = null;
|
|
168
172
|
mastraServer = null;
|
|
169
173
|
outputProcessorFactories = [];
|
|
174
|
+
/** Code-defined workflows registered before the Mastra instance is built. */
|
|
175
|
+
workflows = {
|
|
176
|
+
...(this.config.workflows ?? {}),
|
|
177
|
+
};
|
|
170
178
|
/**
|
|
171
179
|
* The optional MCP server exposing this plugin's agents / tools, or
|
|
172
180
|
* `null` when `config.mcp` is disabled (the default). Built in
|
|
173
181
|
* {@link buildAgentAndServer} and registered on the Mastra instance.
|
|
174
182
|
*/
|
|
175
183
|
mcp = null;
|
|
184
|
+
/** Resolved feedback destination published to server and browser clients. */
|
|
185
|
+
resolvedFeedbackMode = "none";
|
|
176
186
|
/**
|
|
177
187
|
* Resolved {@link MastraIdentityMode}: the identity the chat path's Databricks
|
|
178
188
|
* calls run as. Read once at setup so an invalid `genieIdentity` fails the app
|
|
@@ -183,7 +193,12 @@ export class MastraPlugin extends Plugin {
|
|
|
183
193
|
// Resolve the identity mode up front so an invalid `genieIdentity` fails the
|
|
184
194
|
// app boot with a clear message rather than 500-ing the first chat request.
|
|
185
195
|
this.identityMode = resolveIdentityMode(this.config.genieIdentity);
|
|
186
|
-
|
|
196
|
+
const spaces = resolveGenieSpaces(this.config, this.context);
|
|
197
|
+
this.resolvedFeedbackMode = resolveFeedbackMode(this.config.feedbackMode, {
|
|
198
|
+
genie: this.config.genieAgentMode !== false && Object.keys(spaces).length > 0,
|
|
199
|
+
mlflow: mlflowEnabled(),
|
|
200
|
+
});
|
|
201
|
+
this.config.feedbackMode = this.resolvedFeedbackMode;
|
|
187
202
|
if (this.config.observability !== false) {
|
|
188
203
|
await registerAppMlflowTraceInfoProcessor();
|
|
189
204
|
}
|
|
@@ -279,6 +294,18 @@ export class MastraPlugin extends Plugin {
|
|
|
279
294
|
}
|
|
280
295
|
this.outputProcessorFactories.push(factory);
|
|
281
296
|
},
|
|
297
|
+
/** Register a workflow before the hosted Mastra instance is built. */
|
|
298
|
+
registerWorkflow: (key, workflow) => {
|
|
299
|
+
if (this.mastra) {
|
|
300
|
+
throw new Error("Mastra workflows must be registered before the instance is built");
|
|
301
|
+
}
|
|
302
|
+
if (this.workflows[key]) {
|
|
303
|
+
throw new Error(`Mastra workflow key "${key}" is already registered`);
|
|
304
|
+
}
|
|
305
|
+
this.workflows[key] = workflow;
|
|
306
|
+
},
|
|
307
|
+
/** Registered workflow keys in insertion order. */
|
|
308
|
+
listWorkflows: () => Object.keys(this.workflows),
|
|
282
309
|
/** Underlying Mastra instance for advanced use (custom routes etc.). */
|
|
283
310
|
getMastra: () => this.mastra,
|
|
284
311
|
/**
|
|
@@ -359,7 +386,7 @@ export class MastraPlugin extends Plugin {
|
|
|
359
386
|
basePath: this.basePath,
|
|
360
387
|
defaultAgent: this.built?.defaultAgentId ?? FALLBACK_AGENT_ID,
|
|
361
388
|
agents: Object.keys(this.built?.agents ?? {}),
|
|
362
|
-
|
|
389
|
+
feedbackMode: this.feedbackMode(),
|
|
363
390
|
backgroundTurns: this.config.backgroundTurns !== false,
|
|
364
391
|
// In `service-principal` mode the chat works for any caller who can open
|
|
365
392
|
// the app, so a UI that hides chat behind an OBO-token probe should show
|
|
@@ -368,13 +395,9 @@ export class MastraPlugin extends Plugin {
|
|
|
368
395
|
};
|
|
369
396
|
return config;
|
|
370
397
|
}
|
|
371
|
-
/**
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
* feedback route share the same gate as the server's trace-id header.
|
|
375
|
-
*/
|
|
376
|
-
feedbackEnabled() {
|
|
377
|
-
return resolveFeedbackEnabled(this.config.feedback);
|
|
398
|
+
/** Resolve the only feedback destination exposed for this plugin mode. */
|
|
399
|
+
feedbackMode() {
|
|
400
|
+
return this.resolvedFeedbackMode;
|
|
378
401
|
}
|
|
379
402
|
injectRoutes(router) {
|
|
380
403
|
this.registerMcpRoutes(router);
|
|
@@ -774,12 +797,27 @@ export class MastraPlugin extends Plugin {
|
|
|
774
797
|
async streamGenieChat(res, space, request, signal) {
|
|
775
798
|
const context = getExecutionContext();
|
|
776
799
|
const client = context.client;
|
|
800
|
+
const requestContext = new RequestContext(Object.entries(request.requestContext ?? {}));
|
|
801
|
+
clearTrustedRequestContext(requestContext);
|
|
802
|
+
const applicationContext = requestContext.toJSON();
|
|
803
|
+
await stampRequestContextUser(requestContext);
|
|
804
|
+
const memory = await this.built?.agents[this.built.defaultAgentId]?.getMemory({
|
|
805
|
+
requestContext,
|
|
806
|
+
});
|
|
777
807
|
await pipeUIMessageStreamToResponse({
|
|
778
808
|
response: res,
|
|
779
809
|
stream: genieChatStream({
|
|
780
810
|
client,
|
|
781
811
|
space,
|
|
782
|
-
request
|
|
812
|
+
request: {
|
|
813
|
+
question: request.question,
|
|
814
|
+
...(request.conversationId ? { conversationId: request.conversationId } : {}),
|
|
815
|
+
...(Object.keys(applicationContext).length > 0
|
|
816
|
+
? { requestContext: applicationContext }
|
|
817
|
+
: {}),
|
|
818
|
+
},
|
|
819
|
+
...(memory ? { memory } : {}),
|
|
820
|
+
requestContext,
|
|
783
821
|
signal,
|
|
784
822
|
}),
|
|
785
823
|
});
|
|
@@ -794,24 +832,15 @@ export class MastraPlugin extends Plugin {
|
|
|
794
832
|
const client = getExecutionContext().client;
|
|
795
833
|
return this.execute(() => write(client), genieConversationWriteDefaults);
|
|
796
834
|
}
|
|
797
|
-
/** Register
|
|
835
|
+
/** Register the single feedback destination selected by plugin mode. */
|
|
798
836
|
registerFeedbackRoutes(router) {
|
|
799
|
-
// `POST /route/feedback` logs a thumbs / comment assessment against
|
|
800
|
-
// a turn's MLflow trace (the `traceId` the client captured from the
|
|
801
|
-
// stream response's trace-id header). Registered on the AppKit
|
|
802
|
-
// router (like `/models`) rather than the Mastra subapp so it runs
|
|
803
|
-
// under the same OBO scope - the feedback is attributed to the
|
|
804
|
-
// signed-in user. Returns 404 when feedback is disabled so the
|
|
805
|
-
// client treats the capability as absent; 400 on a malformed body.
|
|
806
|
-
// A recorded assessment yields `{ ok: true }`; a soft failure (most
|
|
807
|
-
// often the trace hasn't finished exporting to MLflow yet) yields
|
|
808
|
-
// `{ ok: false }` without a 5xx so the UI can prompt a retry.
|
|
809
837
|
this.route(router, {
|
|
810
838
|
name: "feedback",
|
|
811
839
|
method: "post",
|
|
812
840
|
path: routes.MASTRA_ROUTES.feedback,
|
|
813
841
|
handler: async (req, res) => {
|
|
814
|
-
|
|
842
|
+
const mode = this.feedbackMode();
|
|
843
|
+
if (mode === "none") {
|
|
815
844
|
res.status(404).json({ ok: false });
|
|
816
845
|
return;
|
|
817
846
|
}
|
|
@@ -827,6 +856,19 @@ export class MastraPlugin extends Plugin {
|
|
|
827
856
|
});
|
|
828
857
|
return;
|
|
829
858
|
}
|
|
859
|
+
if (parsed.data.mode !== mode) {
|
|
860
|
+
res.status(400).json({ ok: false, error: INVALID_FEEDBACK_MESSAGE });
|
|
861
|
+
return;
|
|
862
|
+
}
|
|
863
|
+
if (parsed.data.mode === "genie") {
|
|
864
|
+
const result = await this.scopedSelf(req).sendGenieFeedback(parsed.data);
|
|
865
|
+
if (!result.ok) {
|
|
866
|
+
this.sendFailure(res, result, "genie-feedback", "Feedback could not be recorded");
|
|
867
|
+
return;
|
|
868
|
+
}
|
|
869
|
+
res.json({ ok: true });
|
|
870
|
+
return;
|
|
871
|
+
}
|
|
830
872
|
const result = await this.scopedSelf(req).logFeedback(parsed.data);
|
|
831
873
|
if (!result.ok) {
|
|
832
874
|
this.sendFailure(res, result, "feedback", "Feedback could not be recorded");
|
|
@@ -847,7 +889,7 @@ export class MastraPlugin extends Plugin {
|
|
|
847
889
|
method: "get",
|
|
848
890
|
path: routes.MASTRA_ROUTES.mlflowExperiment,
|
|
849
891
|
handler: async (req, res) => {
|
|
850
|
-
if (
|
|
892
|
+
if (this.feedbackMode() !== "mlflow") {
|
|
851
893
|
res.json({ url: null });
|
|
852
894
|
return;
|
|
853
895
|
}
|
|
@@ -986,6 +1028,20 @@ export class MastraPlugin extends Plugin {
|
|
|
986
1028
|
...(sourceId ? { sourceId } : {}),
|
|
987
1029
|
}), feedbackWriteDefaults);
|
|
988
1030
|
}
|
|
1031
|
+
/** Send Agent Mode rating and comment directly to the originating Genie message. */
|
|
1032
|
+
sendGenieFeedback(input) {
|
|
1033
|
+
const client = getExecutionContext().client;
|
|
1034
|
+
return this.execute((signal) => sendGenieMessageFeedback({
|
|
1035
|
+
space_id: input.spaceId,
|
|
1036
|
+
conversation_id: input.conversationId,
|
|
1037
|
+
message_id: input.messageId,
|
|
1038
|
+
rating: input.rating,
|
|
1039
|
+
...(input.comment ? { comment: input.comment } : {}),
|
|
1040
|
+
}, {
|
|
1041
|
+
workspaceClient: client,
|
|
1042
|
+
...(signal ? { context: signal } : {}),
|
|
1043
|
+
}), feedbackWriteDefaults);
|
|
1044
|
+
}
|
|
989
1045
|
/**
|
|
990
1046
|
* Resolve an experiment link under the active request identity. The helper
|
|
991
1047
|
* returns no URL unless the viewer has effective `CAN_MANAGE` permission.
|
|
@@ -1179,6 +1235,7 @@ export class MastraPlugin extends Plugin {
|
|
|
1179
1235
|
});
|
|
1180
1236
|
this.mastra = new Mastra({
|
|
1181
1237
|
agents: this.built.agents,
|
|
1238
|
+
...(Object.keys(this.workflows).length > 0 ? { workflows: this.workflows } : {}),
|
|
1182
1239
|
...(instanceStorage ? { storage: instanceStorage } : {}),
|
|
1183
1240
|
...(observability ? { observability } : {}),
|
|
1184
1241
|
...(this.mcp ? { mcpServers: { [this.mcp.serverId]: this.mcp.server } } : {}),
|
|
@@ -1197,18 +1254,25 @@ export class MastraPlugin extends Plugin {
|
|
|
1197
1254
|
app: this.mastraApp,
|
|
1198
1255
|
mastra: this.mastra,
|
|
1199
1256
|
prefix: "",
|
|
1200
|
-
customApiRoutes:
|
|
1257
|
+
customApiRoutes: [
|
|
1258
|
+
...agentChatRoutes(),
|
|
1259
|
+
workflowRoute({
|
|
1260
|
+
path: "/route/workflows/:workflowId/stream",
|
|
1261
|
+
version: "v7",
|
|
1262
|
+
}),
|
|
1263
|
+
],
|
|
1201
1264
|
});
|
|
1202
1265
|
await this.mastraServer.init();
|
|
1203
1266
|
attachStaleResumeRecovery(this.mastraApp);
|
|
1204
1267
|
this.logger.info("ready", {
|
|
1205
1268
|
agents: Object.keys(this.built.agents),
|
|
1269
|
+
workflows: Object.keys(this.workflows),
|
|
1206
1270
|
defaultAgent: this.built.defaultAgentId,
|
|
1207
1271
|
backgroundTurns: this.config.backgroundTurns !== false,
|
|
1208
1272
|
apiAccess: this.config.apiAccess ?? "scoped",
|
|
1209
1273
|
mcp: this.mcp ? `${this.basePath}${this.mcp.httpPath}` : "off",
|
|
1210
1274
|
lakebase: memoryPool !== undefined,
|
|
1211
|
-
feedback: this.
|
|
1275
|
+
feedback: this.feedbackMode(),
|
|
1212
1276
|
observability: observability !== undefined ? "mlflow" : "off",
|
|
1213
1277
|
});
|
|
1214
1278
|
}
|
|
@@ -1288,4 +1352,4 @@ function parseStatementLimit(raw) {
|
|
|
1288
1352
|
* ```
|
|
1289
1353
|
*/
|
|
1290
1354
|
export const mastra = toPlugin(MastraPlugin);
|
|
1291
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQ0wsY0FBYyxFQUNkLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEdBS1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFNBQVMsSUFBSSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRixPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEdBTUwsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBRS9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDbkQsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBRzlCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsaUJBQWlCLEdBR2xCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0QixvQkFBb0IsR0FFckIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNM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QW1CLENBQUMsR0FBWTtJQUN2QyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUM1QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQy9DLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcGx1Z2luIHRoYXQgYnVpbGRzIG9uZSBvciBtb3JlIE1hc3RyYSBgQWdlbnRgIGluc3RhbmNlcyBhbmRcbiAqIG1vdW50cyB0aGUgYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVyLiBDbGllbnRzIGRyaXZlIHRoZSBjb252ZXJzYXRpb25cbiAqIG92ZXIgdGhlIHN0YW5kYXJkIE1hc3RyYSBhZ2VudCBzdHJlYW0gKGBAbWFzdHJhL2NsaWVudC1qc2Anc1xuICogYGdldEFnZW50KGlkKS5zdHJlYW0oKWApLCBzbyB0aGVyZSdzIG5vIGJlc3Bva2UgY2hhdCB0cmFuc3BvcnQgdG9cbiAqIGtlZXAgaW4gc3luYy5cbiAqXG4gKiAtIEFnZW50czogcmVnaXN0ZXJlZCB0aHJvdWdoIGBjb25maWcuYWdlbnRzYCBhdCBwbHVnaW4gY3JlYXRpb25cbiAqICAgKHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb259KS4gRWFjaCBlbnRyeSdzIGB0b29sc2AgZmllbGQgYWNjZXB0c1xuICogICBlaXRoZXIgYSBwbGFpbiByZWNvcmQgb3IgYSBgKHBsdWdpbnMpID0+IHRvb2xzYCBjYWxsYmFjayB0aGF0IGdldHNcbiAqICAgYSB0eXBlZCBzaWJsaW5nLXBsdWdpbiBpbmRleCAoe0BsaW5rIE1hc3RyYVBsdWdpbnN9KS4gT21pdFxuICogICBgY29uZmlnLmFnZW50c2AgdG8gZ2V0IGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0LlxuICogLSBNb2RlbDogZWFjaCBhZ2VudCBjYWxsIHJlc29sdmVzIGEgYE1hc3RyYU1vZGVsQ29uZmlnYCB2aWFcbiAqICAge0BsaW5rIGJ1aWxkTW9kZWx9IGZyb20gYC4vbW9kZWwuanNgLiBQZXItYWdlbnQgYG1vZGVsYCBvdmVycmlkZXNcbiAqICAgKGBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdYCBvciBhIGBtb2RlbElkYCBzdHJpbmcpIGZsb3cgdGhyb3VnaFxuICogICB7QGxpbmsgYnVpbGRBZ2VudHN9LlxuICogLSBNZW1vcnkgLyBzdG9yYWdlOiBwZXItYWdlbnQsIGJ1aWx0IGJ5IHtAbGluayBjcmVhdGVNZW1vcnlCdWlsZGVyfVxuICogICBmcm9tIGAuL21lbW9yeS5qc2AuIEJvdGggYXV0by1kZWZhdWx0IHRvIGB0cnVlYCB3aGVuIHRoZVxuICogICBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkICh1bmxlc3MgdGhlIGNhbGxlciBwYXNzZWRcbiAqICAgYGZhbHNlYCBvciBhIGN1c3RvbSBjb25maWcpLiBTdG9yYWdlIG5hbWVzcGFjZXMgcGVyIGFnZW50IHZpYVxuICogICB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gcGVyIGFnZW50OyB0aGUgdmVjdG9yIHN0b3JlIGlzIGEgc2luZ2xlXG4gKiAgIHNoYXJlZCBzaW5nbGV0b24gYWNyb3NzIGV2ZXJ5IGFnZW50LlxuICogLSBTZXJ2ZXI6IHRoZSBFeHByZXNzIHN1YmFwcCB3aXJpbmcgbGl2ZXMgaW4gYC4vc2VydmVyLmpzYC5cbiAqIC0gSFRUUDogQXBwS2l0IG1vdW50cyB0aGlzIHBsdWdpbiB1bmRlciBgL2FwaS9tYXN0cmFgLiBBbG9uZ3NpZGUgdGhlXG4gKiAgIE1hc3RyYSBhZ2VudCByb3V0ZXMsIHRoZSBwbHVnaW4gcmVnaXN0ZXJzIGAvcm91dGUvaGlzdG9yeWBcbiAqICAgKGxvYWQgKyBjbGVhciBhIHRocmVhZCdzIG1lc3NhZ2VzKSwgYC9yb3V0ZS90aHJlYWRzYCAobGlzdCB0aGVcbiAqICAgY2FsbGVyJ3MgY29udmVyc2F0aW9ucyArIGRlbGV0ZSBvbmUpLCBgL21vZGVsc2AsIGAvZGVmYXVsdC1tb2RlbGAsXG4gKiAgIGAvc3VnZ2VzdGlvbnNgLCBgL3JvdXRlL2ZlZWRiYWNrYCAobG9nIGEgdGh1bWJzIC8gY29tbWVudCB0byBNTGZsb3dcbiAqICAgd2hlbiBmZWVkYmFjayBpcyBlbmFibGVkKSwgYW5kIHRoZSBnZW5lcmljIGAvZW1iZWQvOnR5cGUvOmlkYFxuICogICByZXNvbHZlciBmb3IgaW5saW5lIGNoYXJ0IC8gZGF0YSBtYXJrZXJzLiBFYWNoIGlzIHJlZ2lzdGVyZWQgdGhyb3VnaFxuICogICBBcHBLaXQncyBgcm91dGUoKWAgc28gaXQgbGFuZHMgaW4gdGhlIHBsdWdpbidzIGVuZHBvaW50IG1hcCwgYW5kXG4gKiAgIGV2ZXJ5IG91dGJvdW5kIGNhbGwgb25lIG1ha2VzIHJ1bnMgdGhyb3VnaCBgZXhlY3V0ZSgpYCAoc2VlXG4gKiAgIGAuL2RlZmF1bHRzLmpzYCkuIFRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBzdXJmYWNlIGlzIGdhdGVkXG4gKiAgIGJ5IGBjb25maWcuYXBpQWNjZXNzYCAoZGVmYXVsdCBgXCJzY29wZWRcImApOiBvbmx5IGFnZW50IGluZmVyZW5jZSxcbiAqICAgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCB0aGUgYC9yb3V0ZS8qYCByb3V0ZXMsIGFuZCAod2hlbiBlbmFibGVkKVxuICogICBNQ1AgYXJlIGRpc3BhdGNoZWQgdG8gTWFzdHJhOyBhZG1pbiAvIG11dGF0aW5nIC8gYnVsay1leHBvcnQgcm91dGVzXG4gKiAgIGFyZSByZWZ1c2VkIHdpdGggYDQwM2AuIFNlZSB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uXG4gKiAtIE1DUDogb3B0IGluIHdpdGggYGNvbmZpZy5tY3BgIHRvIGV4cG9zZSB0aGUgYWdlbnRzIChhbmQgb3B0aW9uYWxseVxuICogICB0b29scykgYXMgYSBNYXN0cmEgYE1DUFNlcnZlcmAuIEl0IGlzIHJlZ2lzdGVyZWQgb24gdGhlIGBNYXN0cmFgXG4gKiAgIGluc3RhbmNlIHZpYSBgbWNwU2VydmVyc2AsIHNvIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlcyB0aGUgc3RvY2tcbiAqICAgTUNQIHRyYW5zcG9ydCByb3V0ZXMgKGAvbWNwLzxzZXJ2ZXJJZD4vLi4uYCkgdW5kZXIgdGhlIG1vdW50LiBTZWVcbiAqICAgYC4vbWNwLmpzYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdlbmllLFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICBsYWtlYmFzZSxcbiAgUGx1Z2luLFxuICB0b1BsdWdpbixcbiAgdHlwZSBFeGVjdXRpb25SZXN1bHQsXG4gIHR5cGUgSUFwcFJvdXRlcixcbiAgdHlwZSBQbHVnaW5NYW5pZmVzdCxcbiAgdHlwZSBSZXNvdXJjZVJlcXVpcmVtZW50LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBsYWtlYmFzZVJlc29sdmVyLCBwbHVnaW5SZWdpc3RyeSwgdGVsZW1ldHJ5IGFzIGFwcGtpdFRlbGVtZXRyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbW9kZWxDYXRhbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGFzeW5jVXRpbHMsIGVycm9yVXRpbHMsIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBmZWVkYmFjayxcbiAgcm91dGVzLFxuICB3aXJlLFxuICB0eXBlIENoYXJ0LFxuICB0eXBlIEdlbmllQ2hhdFJlcXVlc3QsXG4gIHR5cGUgTWFzdHJhQ2xpZW50Q29uZmlnLFxuICB0eXBlIE1hc3RyYUZlZWRiYWNrUmVxdWVzdCxcbiAgdHlwZSBTdGF0ZW1lbnREYXRhLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgeyBkaXNwbGF5LCB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgeyBNYXN0cmEgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL21hc3RyYVwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBwaXBlVUlNZXNzYWdlU3RyZWFtVG9SZXNwb25zZSB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgUG9vbCB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQge1xuICBidWlsZEFnZW50cyxcbiAgRkFMTEJBQ0tfQUdFTlRfSUQsXG4gIHR5cGUgQnVpbHRBZ2VudHMsXG4gIHR5cGUgTWFzdHJhT3V0cHV0UHJvY2Vzc29yRmFjdG9yeSxcbn0gZnJvbSBcIi4vYWdlbnRzLnRzXCI7XG5pbXBvcnQgeyBmZXRjaENoYXJ0IH0gZnJvbSBcIi4vY2hhcnQudHNcIjtcbmltcG9ydCB7IGFnZW50Q2hhdFJvdXRlcyB9IGZyb20gXCIuL2NoYXQudHNcIjtcbmltcG9ydCB7XG4gIGF0dHJpYnV0ZWRVc2VySWQsXG4gIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQsXG4gIE1BU1RSQV9DT05GSUdfU0NIRU1BLFxuICB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQge1xuICBjaGFydEZldGNoRGVmYXVsdHMsXG4gIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyxcbiAgZ2VuaWVDb252ZXJzYXRpb25SZWFkRGVmYXVsdHMsXG4gIGdlbmllQ29udmVyc2F0aW9uV3JpdGVEZWZhdWx0cyxcbiAgZ2VuaWVTdWdnZXN0aW9uRGVmYXVsdHMsXG4gIG1vZGVsQ2F0YWxvZ3VlRGVmYXVsdHMsXG4gIHN0YXRlbWVudERhdGFEZWZhdWx0cyxcbn0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7XG4gIGRlbGV0ZUdlbmllVGhyZWFkLFxuICBkZWxldGVHZW5pZVRocmVhZE1lc3NhZ2UsXG4gIGdlbmllQ2hhdFN0cmVhbSxcbiAgbGlzdEdlbmllVGhyZWFkTWVzc2FnZXMsXG4gIGxpc3RHZW5pZVRocmVhZHMsXG4gIHR5cGUgR2VuaWVDaGF0U3BhY2UsXG59IGZyb20gXCIuL2dlbmllLWNoYXQudHNcIjtcbmltcG9ydCB7IGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zLCByZXNvbHZlR2VuaWVTcGFjZXMsIHR5cGUgR2VuaWVTcGFjZUNvbmZpZyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQge1xuICByZXF1ZXN0VXNlcklkLFxuICByZXNvbHZlSWRlbnRpdHlNb2RlLFxuICB1c2VTZXJ2aWNlUHJpbmNpcGFsLFxuICB0eXBlIE1hc3RyYUlkZW50aXR5TW9kZSxcbn0gZnJvbSBcIi4vaWRlbnRpdHkudHNcIjtcbmltcG9ydCB7IGJ1aWxkTWNwU2VydmVyLCB0eXBlIFJlc29sdmVkTWNwIH0gZnJvbSBcIi4vbWNwLnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVNZW1vcnlCdWlsZGVyLCBuZWVkc0xha2ViYXNlIH0gZnJvbSBcIi4vbWVtb3J5LnRzXCI7XG5pbXBvcnQge1xuICBmbHVzaERpcmVjdE1sZmxvd1RyYWNpbmcsXG4gIGxvZ0ZlZWRiYWNrLFxuICBtbGZsb3dFeHBlcmltZW50TWFuYWdlclVybCxcbiAgcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZCxcbiAgdmFsaWRhdGVGZWVkYmFja0NvbmZpZyxcbn0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRGVmYXVsdE1vZGVsSWQgfSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuaW1wb3J0IHsgYnVpbGRPYnNlcnZhYmlsaXR5LCBjb25maWd1cmVPdGVsUHJvcGFnYXRpb24gfSBmcm9tIFwiLi9vYnNlcnZhYmlsaXR5LnRzXCI7XG5pbXBvcnQgeyBwcm92aXNpb25SZW1vdGVTa2lsbHMgfSBmcm9tIFwiLi9yZW1vdGUtc2tpbGxzLnRzXCI7XG5pbXBvcnQge1xuICBhdHRhY2hSb3V0ZVBhdGNoTWlkZGxld2FyZSxcbiAgYXR0YWNoU3RhbGVSZXN1bWVSZWNvdmVyeSxcbiAgY3JlYXRlUmVxdWVzdENvbnRleHQsXG4gIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQsXG4gIE1hc3RyYVNlcnZlcixcbn0gZnJvbSBcIi4vc2VydmVyLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlU2VydmluZ0NvbmZpZyB9IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcbmltcG9ydCB7IGZldGNoU3RhdGVtZW50RW1iZWREYXRhLCBTVEFURU1FTlRfUk9XX0NBUCB9IGZyb20gXCIuL3N0YXRlbWVudC50c1wiO1xuaW1wb3J0IHsgYXR0YWNoQ2hhdFR1cm5UZWxlbWV0cnksIHJlZ2lzdGVyQXBwTWxmbG93VHJhY2VJbmZvUHJvY2Vzc29yIH0gZnJvbSBcIi4vdGVsZW1ldHJ5LnRzXCI7XG5pbXBvcnQgeyBpbnZhbGlkRmllbGRzIH0gZnJvbSBcIi4vdmFsaWRhdGlvbi50c1wiO1xuaW1wb3J0IHsgaW5saW5lU2tpbGxzRnJvbUxvY2FsTW91bnRzIH0gZnJvbSBcIi4vd29ya3NwYWNlcy50c1wiO1xuXG5jb25zdCBHRU5JRV9NQU5JRkVTVCA9IHBsdWdpblJlZ2lzdHJ5LmRhdGEoZ2VuaWUpLnBsdWdpbi5tYW5pZmVzdDtcbmNvbnN0IExBS0VCQVNFX01BTklGRVNUID0gcGx1Z2luUmVnaXN0cnkuZGF0YShsYWtlYmFzZSkucGx1Z2luLm1hbmlmZXN0O1xuXG4vKiogQ2VpbGluZyBvbiB0aGUgYD90aW1lb3V0TXM9YCBsb25nLXBvbGwgYnVkZ2V0IGEgY2xpZW50IG1heSByZXF1ZXN0LiAqL1xuY29uc3QgTUFYX0VNQkVEX1BPTExfVElNRU9VVF9NUyA9IDUgKiA2MF8wMDA7XG5cbi8qKiBTdGFibGUgY2xpZW50IG1lc3NhZ2Ugd2hlbiB0aGUgd29ya3NwYWNlJ3MgbW9kZWwgY2F0YWxvZ3VlIGNhbid0IGJlIHJlYWQuICovXG5jb25zdCBNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UgPSBcIkNvdWxkIG5vdCByZWFkIHRoZSB3b3Jrc3BhY2UncyBtb2RlbCBjYXRhbG9ndWVcIjtcblxuLyoqIFN0YWJsZSBjbGllbnQgbWVzc2FnZSBmb3IgYSBmZWVkYmFjayBib2R5IHRoYXQgZmFpbHMgc2NoZW1hIHZhbGlkYXRpb24uICovXG5jb25zdCBJTlZBTElEX0ZFRURCQUNLX01FU1NBR0UgPSBcIkludmFsaWQgZmVlZGJhY2sgcmVxdWVzdFwiO1xuXG4vKiogQ2FjaGUgbmFtZXNwYWNlIGZvciBzdGF0ZW1lbnQgcmVzdWx0IHNldHMsIG1hdGNoaW5nIHRoZSBjaGFydCBjYWNoZSdzIGZvcm0uICovXG5jb25zdCBTVEFURU1FTlRfQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6c3RhdGVtZW50XCI7XG5cbi8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgbWFzdHJhYCkgdGhhdCBob3N0cyBNYXN0cmEgYWdlbnRzXG4gKiB3aXRoIG9wdGlvbmFsIExha2ViYXNlLWJhY2tlZCBtZW1vcnkgYW5kIEFJIFNESyBjaGF0IHJvdXRlcyB1bmRlclxuICogdGhlIHBsdWdpbiBtb3VudCAodHlwaWNhbGx5IGAvYXBpL21hc3RyYWApLlxuICpcbiAqIEBleGFtcGxlIFJlZ2lzdGVyIHRoZSBwbHVnaW5cbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIGxha2ViYXNlIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgY3JlYXRlQWdlbnQsIG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiAvLyBgbGFrZWJhc2VgIGZpcnN0OiByZWdpc3RlcmluZyBpdCBhdXRvLWVuYWJsZXMgTWFzdHJhIHN0b3JhZ2UgKyBtZW1vcnkuXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgbGFrZWJhc2UoKSxcbiAqICAgICBtYXN0cmEoe1xuICogICAgICAgZ2VuaWVTcGFjZXM6IHsgZGVmYXVsdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCEgfSxcbiAqICAgICAgIGFnZW50czogY3JlYXRlQWdlbnQoe1xuICogICAgICAgICBuYW1lOiBcImFuYWx5c3RcIixcbiAqICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBcIllvdSBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IHJldmVudWUgYW5kIHJldHVybnMuXCIsXG4gKiAgICAgICAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICAgICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpKSB9O1xuICogICAgICAgICB9LFxuICogICAgICAgfSksXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFJlYWQgdGhlIGFnZW50cyBiYWNrIG9mZiB0aGUgQXBwS2l0IGluc3RhbmNlXG4gKiBgYGB0c1xuICogY29uc3QgYWdlbnRJZHMgPSBhcHAubWFzdHJhLmxpc3QoKTtcbiAqIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGFwcC5tYXN0cmEubGlzdE1vZGVscygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXN0cmFQbHVnaW4gZXh0ZW5kcyBQbHVnaW48TWFzdHJhUGx1Z2luQ29uZmlnPiB7XG4gIC8vIEFubm90YXRlZCByYXRoZXIgdGhhbiBsZWZ0IHRvIGBzYXRpc2ZpZXNgOiB0aGUgY29uZmlnIHNjaGVtYSdzIHR5cGUgY29tZXNcbiAgLy8gZnJvbSBgQHR5cGVzL2pzb24tc2NoZW1hYCwgd2hpY2ggdGhpcyBwYWNrYWdlIGRvZXMgbm90IGRlcGVuZCBvbiwgc28gYW5cbiAgLy8gaW5mZXJyZWQgbWFuaWZlc3QgdHlwZSBjYW5ub3QgYmUgbmFtZWQgaW4gdGhlIGVtaXR0ZWQgZGVjbGFyYXRpb24uIFRoZVxuICAvLyBgUGx1Z2luTWFuaWZlc3Q8XCJtYXN0cmFcIj5gIHBhcmFtZXRlciBzdGlsbCBjYXJyaWVzIHRoZSBsaXRlcmFsIG5hbWUgaW50b1xuICAvLyBgdG9QbHVnaW4oKWAncyBmYWN0b3J5IHR5cGUuXG4gIHN0YXRpYyBtYW5pZmVzdDogUGx1Z2luTWFuaWZlc3Q8XCJtYXN0cmFcIj4gPSB7XG4gICAgbmFtZTogXCJtYXN0cmFcIixcbiAgICBkaXNwbGF5TmFtZTogXCJNYXN0cmFcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQnVpbGRzIGEgTWFzdHJhIEFnZW50IHdpdGggdXNlci1zY29wZWQgd29ya3NwYWNlIGF1dGggKGFzVXNlcikgXCIgK1xuICAgICAgXCJhbmQgb3B0aW9uYWwgUG9zdGdyZXMtYmFja2VkIE1hc3RyYSBNZW1vcnkgdmlhIHRoZSBgbGFrZWJhc2VgIHBsdWdpbi5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczoge1xuICAgICAgcmVxdWlyZWQ6IFtdLFxuICAgICAgb3B0aW9uYWw6IFtcbiAgICAgICAgLy8gUmV1c2UgdGhlIEdlbmllIHNwYWNlLWlkIGJpbmRpbmcgZGVjbGFyZWQgYnkgQXBwS2l0J3MgYGdlbmllYFxuICAgICAgICAvLyBtYW5pZmVzdCBzbyB0aGUgcmVzb3VyY2UtYmluZGluZyBzaGFwZSBpcyBpZGVudGljYWwgdG8gQXBwS2l0J3MgYW5kXG4gICAgICAgIC8vIGFuIGV4aXN0aW5nIGBhcHAueWFtbGAgLyBgZ2VuaWUoeyBzcGFjZXMgfSlgIHdpcmluZyBrZWVwcyB3b3JraW5nLlxuICAgICAgICAvLyBUaGUgYnVpbHQtaW4gR2VuaWUgdG9vbHMgdGFsayB0byBHZW5pZSBkaXJlY3RseSB0aHJvdWdoXG4gICAgICAgIC8vIGBAZGJ4LXRvb2xzL2dlbmllYCwgc28gb25seSB0aGUgYmluZGluZyBpcyBzaGFyZWQsIG5vdCB0aGUgcGx1Z2luJ3NcbiAgICAgICAgLy8gdG9vbHMuXG4gICAgICAgIC4uLkdFTklFX01BTklGRVNULnJlc291cmNlcy5yZXF1aXJlZCxcbiAgICAgICAgLi4uTEFLRUJBU0VfTUFOSUZFU1QucmVzb3VyY2VzLnJlcXVpcmVkLFxuICAgICAgXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IE1BU1RSQV9DT05GSUdfU0NIRU1BIH0sXG4gIH07XG5cbiAgLyoqXG4gICAqIFRpZ2h0ZW4gcmVzb3VyY2UgcmVxdWlyZW1lbnRzIGJhc2VkIG9uIHdoaWNoIGZlYXR1cmVzIGFyZSBlbmFibGVkLlxuICAgKiBBcHBLaXQgY2FsbHMgdGhpcyBhdCByZWdpc3RyYXRpb24gdGltZSAoY29uZmlnLWF3YXJlKSBzbyBkaXNhYmxlZFxuICAgKiBmZWF0dXJlcyBkb24ndCBzdXJmYWNlIHRoZWlyIHJlc291cmNlIGFza3MgdG8gdGhlIGhvc3QgYXBwLlxuICAgKi9cbiAgc3RhdGljIGdldFJlc291cmNlUmVxdWlyZW1lbnRzKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogUmVzb3VyY2VSZXF1aXJlbWVudFtdIHtcbiAgICBjb25zdCByZXNvdXJjZXM6IFJlc291cmNlUmVxdWlyZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IGVuYWJsZWRNYW5pZmVzdHM6IFBsdWdpbk1hbmlmZXN0PHN0cmluZz5bXSA9IFtdO1xuXG4gICAgaWYgKG5lZWRzTGFrZWJhc2UoY29uZmlnKSkge1xuICAgICAgZW5hYmxlZE1hbmlmZXN0cy5wdXNoKExBS0VCQVNFX01BTklGRVNUKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtIG9mIGVuYWJsZWRNYW5pZmVzdHMpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgbS5yZXNvdXJjZXMucmVxdWlyZWQpIHtcbiAgICAgICAgcmVzb3VyY2VzLnB1c2goeyAuLi5yZXNvdXJjZSwgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNvdXJjZXM7XG4gIH1cblxuICBwcml2YXRlIGxvZ2dlciA9IGxvZy5sb2dnZXIodGhpcyk7XG4gIHByaXZhdGUgYnVpbHQ6IEJ1aWx0QWdlbnRzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWFzdHJhOiBNYXN0cmEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYXN0cmFBcHA6IGV4cHJlc3MuRXhwcmVzcyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1hc3RyYVNlcnZlcjogTWFzdHJhU2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0UHJvY2Vzc29yRmFjdG9yaWVzOiBNYXN0cmFPdXRwdXRQcm9jZXNzb3JGYWN0b3J5W10gPSBbXTtcbiAgLyoqXG4gICAqIFRoZSBvcHRpb25hbCBNQ1Agc2VydmVyIGV4cG9zaW5nIHRoaXMgcGx1Z2luJ3MgYWdlbnRzIC8gdG9vbHMsIG9yXG4gICAqIGBudWxsYCB3aGVuIGBjb25maWcubWNwYCBpcyBkaXNhYmxlZCAodGhlIGRlZmF1bHQpLiBCdWlsdCBpblxuICAgKiB7QGxpbmsgYnVpbGRBZ2VudEFuZFNlcnZlcn0gYW5kIHJlZ2lzdGVyZWQgb24gdGhlIE1hc3RyYSBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgbWNwOiBSZXNvbHZlZE1jcCB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogUmVzb2x2ZWQge0BsaW5rIE1hc3RyYUlkZW50aXR5TW9kZX06IHRoZSBpZGVudGl0eSB0aGUgY2hhdCBwYXRoJ3MgRGF0YWJyaWNrc1xuICAgKiBjYWxscyBydW4gYXMuIFJlYWQgb25jZSBhdCBzZXR1cCBzbyBhbiBpbnZhbGlkIGBnZW5pZUlkZW50aXR5YCBmYWlscyB0aGUgYXBwXG4gICAqIGJvb3QgcmF0aGVyIHRoYW4gdGhlIGZpcnN0IHJlcXVlc3QsIGFuZCBzbyBldmVyeSByZXF1ZXN0IGFncmVlcy5cbiAgICovXG4gIHByaXZhdGUgaWRlbnRpdHlNb2RlOiBNYXN0cmFJZGVudGl0eU1vZGUgPSBcInVzZXJcIjtcbiAgb3ZlcnJpZGUgYXN5bmMgc2V0dXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgaWRlbnRpdHkgbW9kZSB1cCBmcm9udCBzbyBhbiBpbnZhbGlkIGBnZW5pZUlkZW50aXR5YCBmYWlscyB0aGVcbiAgICAvLyBhcHAgYm9vdCB3aXRoIGEgY2xlYXIgbWVzc2FnZSByYXRoZXIgdGhhbiA1MDAtaW5nIHRoZSBmaXJzdCBjaGF0IHJlcXVlc3QuXG4gICAgdGhpcy5pZGVudGl0eU1vZGUgPSByZXNvbHZlSWRlbnRpdHlNb2RlKHRoaXMuY29uZmlnLmdlbmllSWRlbnRpdHkpO1xuICAgIHZhbGlkYXRlRmVlZGJhY2tDb25maWcodGhpcy5jb25maWcuZmVlZGJhY2spO1xuICAgIGlmICh0aGlzLmNvbmZpZy5vYnNlcnZhYmlsaXR5ICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgcmVnaXN0ZXJBcHBNbGZsb3dUcmFjZUluZm9Qcm9jZXNzb3IoKTtcbiAgICB9XG4gICAgLy8gV2FpdCB1bnRpbCBzaWJsaW5nIHBsdWdpbnMgKGUuZy4gYGxha2ViYXNlYCkgZmluaXNoIGBzZXR1cCgpYCBzb1xuICAgIC8vIHRoZSBsYWtlYmFzZSBwb29sIGlzIHZhbGlkIHdoZW4gc3RvcmFnZS9tZW1vcnkgYXJlIGVuYWJsZWQuXG4gICAgdGhpcy5jb250ZXh0Py5vbkxpZmVjeWNsZShcInNldHVwOmNvbXBsZXRlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbmZpZ3VyZU90ZWxQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5hcHBseUxha2ViYXNlQXV0b0RlZmF1bHRzKCk7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkQWdlbnRBbmRTZXJ2ZXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGluc3RhbmNlIGFnZW50LWJhY2tlZCBEYXRhYnJpY2tzIGNhbGxzIHNob3VsZCBydW4gdGhyb3VnaCBmb3JcbiAgICogYHJlcWAsIGhvbm9yaW5nIHtAbGluayBpZGVudGl0eU1vZGV9LiBEaXJlY3QgR2VuaWUgY29udmVyc2F0aW9uIHJvdXRlcyB1c2VcbiAgICogQXBwS2l0IE9CTyB0aHJvdWdoIGBhc1VzZXIocmVxKWAgaW5zdGVhZC5cbiAgICpcbiAgICogSW4gYFwidXNlclwiYCBtb2RlICh0aGUgZGVmYXVsdCkgdGhpcyBpcyBgdGhpcy5hc1VzZXIocmVxKWAgLSBBcHBLaXQncyBvd25cbiAgICogcHJveHkgdGhhdCBydW5zIGV2ZXJ5IGNhbGwgaW5zaWRlIGBydW5JblVzZXJDb250ZXh0YCwgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWBcbiAgICogcmV0dXJucyB0aGUgY2FsbGVyJ3MgT0JPIGNsaWVudC4gSW4gYFwic2VydmljZS1wcmluY2lwYWxcImAgbW9kZSBpdCBpcyBgdGhpc2BcbiAgICogdW53cmFwcGVkLCBzbyB0aGUgc2FtZSBtZXRob2RzIHJ1biBpbiB0aGUgYW1iaWVudCBzZXJ2aWNlIGNvbnRleHQgYW5kXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCdzIGNsaWVudCAtIHRoZSBzYW1lXG4gICAqIFwianVzdCBkb24ndCBlbnRlciBgYXNVc2VyYFwiIHBhdHRlcm4gQXBwS2l0J3Mgb3duIHNlcnZpY2UtY29udGV4dCBjYWxscyB1c2UuIE9uZVxuICAgKiBoZWxwZXIgY292ZXJzIHRoZSBhZ2VudC1iYWNrZWQgd29ya3NwYWNlIGNhbGxzIChzZXJ2aW5nIGNhdGFsb2d1ZSwgZ2VuZXJhbFxuICAgKiBzdWdnZXN0aW9ucywgZGlzcGF0Y2hlZCBgYXNrX2dlbmllYCwgc3RhdGVtZW50IGZldGNoLCBmZWVkYmFjayksIHNvIHRoZVxuICAgKiBpZGVudGl0eSBkZWNpc2lvbiBsaXZlcyBpbiBvbmUgcGxhY2UuXG4gICAqL1xuICBwcml2YXRlIHNjb3BlZFNlbGYocmVxOiBleHByZXNzLlJlcXVlc3QpOiB0aGlzIHtcbiAgICByZXR1cm4gdXNlU2VydmljZVByaW5jaXBhbCh0aGlzLmlkZW50aXR5TW9kZSwgcmVxKSA/IHRoaXMgOiB0aGlzLmFzVXNlcihyZXEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIGBsYWtlYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQsIGF1dG8tZW5hYmxlIGBzdG9yYWdlYFxuICAgKiBhbmQgYG1lbW9yeWAgdW5sZXNzIHRoZSBjYWxsZXIgb3B0ZWQgb3V0IGV4cGxpY2l0bHkgKGBmYWxzZWAgb3IgYVxuICAgKiBjdXN0b20gY29uZmlnIG9iamVjdCkuIFJ1biBhZnRlciBgc2V0dXA6Y29tcGxldGVgIHNvIHRoZSBsb29rdXBcbiAgICogaXMgcmVsaWFibGU6IGFueSBwbHVnaW4gdGhhdCByZWdpc3RlcnMgaXRzZWxmIHN5bmNocm9ub3VzbHkgaXNcbiAgICogYWxyZWFkeSBpbiB0aGUgcmVnaXN0cnkgYnkgdGhlIHRpbWUgdGhpcyBmaXJlcy5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlMYWtlYmFzZUF1dG9EZWZhdWx0cygpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNMYWtlYmFzZSA9IHBsdWdpblJlZ2lzdHJ5Lmluc3RhbmNlKHRoaXMuY29udGV4dCwgbGFrZWJhc2UpICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKCFoYXNMYWtlYmFzZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmNvbmZpZy5zdG9yYWdlID09PSB1bmRlZmluZWQpIHRoaXMuY29uZmlnLnN0b3JhZ2UgPSB0cnVlO1xuICAgIGlmICh0aGlzLmNvbmZpZy5tZW1vcnkgPT09IHVuZGVmaW5lZCkgdGhpcy5jb25maWcubWVtb3J5ID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBGbHVzaCBwZW5kaW5nIGRpcmVjdCBNTGZsb3cgdHJhY2VzIGR1cmluZyBncmFjZWZ1bCBzaHV0ZG93bi4gKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZsdXNoRGlyZWN0TWxmbG93VHJhY2luZygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcImVycm9yIGZsdXNoaW5nIGRpcmVjdCBNTGZsb3cgdHJhY2VzXCIsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0IGluLWZsaWdodCB3b3JrIGFuZCBzdGFydCB0aGUgYXN5bmNocm9ub3VzIHRyYWNlIGZsdXNoLlxuICAgKi9cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHZvaWQgdGhpcy5zaHV0ZG93bigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZXhwb3J0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBJZHMgb2YgZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCBpbiByZWdpc3RyYXRpb24gb3JkZXIuIE1hdGNoZXNcbiAgICAgICAqIEFwcEtpdCBgYWdlbnRzLmxpc3QoKWAgc28gY2FsbGVycyBjYW4gaXRlcmF0ZSB0aGUgcmVnaXN0cnkgdGhlXG4gICAgICAgKiBzYW1lIHdheSB1bmRlciBib3RoIHBsdWdpbnMuXG4gICAgICAgKi9cbiAgICAgIGxpc3Q6ICgpOiBzdHJpbmdbXSA9PiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pLFxuICAgICAgLyoqXG4gICAgICAgKiBMb29rIHVwIGEgcmVnaXN0ZXJlZCBhZ2VudCBieSBpZC4gUmV0dXJucyBgbnVsbGAgKG5vdFxuICAgICAgICogdW5kZWZpbmVkKSB3aGVuIHVua25vd24gc28gY2FsbCBzaXRlcyBjYW4gZWFybHktcmV0dXJuIHdpdGhvdXRcbiAgICAgICAqIGEgc2VwYXJhdGUgYGluYCBjaGVjay5cbiAgICAgICAqL1xuICAgICAgZ2V0OiAoaWQ6IHN0cmluZyk6IEFnZW50IHwgbnVsbCA9PiB0aGlzLmJ1aWx0Py5hZ2VudHNbaWRdID8/IG51bGwsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhZ2VudCB0aGUgY2xpZW50IGNvbnZlcnNlcyB3aXRoIHdoZW4gaXQgZG9lc24ndCBuYW1lIG9uZS5cbiAgICAgICAqIFJlc29sdmVzIHRvIGBjb25maWcuZGVmYXVsdEFnZW50YCwgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgaWQsIG9yXG4gICAgICAgKiB0aGUgYnVpbHQtaW4gYGRlZmF1bHRgIGZhbGxiYWNrLlxuICAgICAgICovXG4gICAgICBnZXREZWZhdWx0OiAoKTogQWdlbnQgfCBudWxsID0+XG4gICAgICAgICh0aGlzLmJ1aWx0ICYmIHRoaXMuYnVpbHQuYWdlbnRzW3RoaXMuYnVpbHQuZGVmYXVsdEFnZW50SWRdKSA/PyBudWxsLFxuICAgICAgLyoqXG4gICAgICAgKiBSZWdpc3RlciBhbiBvdXRwdXQtcHJvY2Vzc29yIGZhY3RvcnkgYmVmb3JlIGFnZW50cyBhcmUgYnVpbHQuXG4gICAgICAgKlxuICAgICAgICogRGVmZXJyZWQgc2libGluZyBwbHVnaW5zIHVzZSB0aGlzIGdlbmVyaWMgZXh0ZW5zaW9uIHBvaW50IHdpdGhvdXRcbiAgICAgICAqIGFkZGluZyBwcm92aWRlci1zcGVjaWZpYyBiZWhhdmlvciB0byB0aGUgTWFzdHJhIHBsdWdpbi5cbiAgICAgICAqL1xuICAgICAgcmVnaXN0ZXJPdXRwdXRQcm9jZXNzb3I6IChmYWN0b3J5OiBNYXN0cmFPdXRwdXRQcm9jZXNzb3JGYWN0b3J5KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmJ1aWx0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWFzdHJhIG91dHB1dCBwcm9jZXNzb3JzIG11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgYWdlbnRzIGFyZSBidWlsdFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dFByb2Nlc3NvckZhY3Rvcmllcy5wdXNoKGZhY3RvcnkpO1xuICAgICAgfSxcbiAgICAgIC8qKiBVbmRlcmx5aW5nIE1hc3RyYSBpbnN0YW5jZSBmb3IgYWR2YW5jZWQgdXNlIChjdXN0b20gcm91dGVzIGV0Yy4pLiAqL1xuICAgICAgZ2V0TWFzdHJhOiAoKSA9PiB0aGlzLm1hc3RyYSxcbiAgICAgIC8qKlxuICAgICAgICogQnVpbGQgdGhlIGBSZXF1ZXN0Q29udGV4dGAgYW4gYWdlbnQgdHVybiBkcml2ZW4gZnJvbSBPVVRTSURFIHRoaXNcbiAgICAgICAqIHBsdWdpbidzIHJvdXRlcyBuZWVkcyAoYSBUZWFtcyBhY3Rpdml0eSBvbiBhbm90aGVyIHBsdWdpbidzIGVuZHBvaW50LCBhXG4gICAgICAgKiBzY2hlZHVsZWQgam9iKS5cbiAgICAgICAqXG4gICAgICAgKiBNYXN0cmEncyB1c2VyLXNjb3BlZCB0b29scyAtIGBhc2tfZ2VuaWVgIG1vc3QgdmlzaWJseSAtIHJlYWQgdGhlIEFwcEtpdFxuICAgICAgICogdXNlciBvZmYgdGhlIHJlcXVlc3QgY29udGV4dCwgd2hpY2ggb25seSB0aGUgSFRUUCBtaWRkbGV3YXJlIHN0YW1wcy5cbiAgICAgICAqIENhbGxpbmcgYGFnZW50LmdlbmVyYXRlYCB3aXRoIGEgcmF3IHByb21wdCB0aGVyZWZvcmUgYW5zd2VycyBcInRoZSBkYXRhXG4gICAgICAgKiBzb3VyY2UgaXMgdW5yZWFjaGFibGVcIiB3aGVyZSB0aGUgY2hhdCByb3V0ZXMgYW5zd2VyIHdpdGggcmVhbCBkYXRhLlxuICAgICAgICogUGFzc2luZyB0aGlzIGFzIGByZXF1ZXN0Q29udGV4dGAgY2xvc2VzIHRoYXQgZ2FwLCBzbyBhbiBvdXQtb2YtYmFuZCB0dXJuXG4gICAgICAgKiBoYXMgZXhhY3RseSB0aGUgY2FwYWJpbGl0aWVzIGEgY2hhdCB0dXJuIGhhcy5cbiAgICAgICAqXG4gICAgICAgKiBNdXN0IGJlIGNhbGxlZCBJTlNJREUgYW4gYGFzVXNlcihyZXEpYCBzY29wZSB0byBpbmhlcml0IHRoZSBjYWxsZXInc1xuICAgICAgICogT0JPIGlkZW50aXR5OyBvdXRzaWRlIG9uZSBpdCByZXNvbHZlcyB0byB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZVJlcXVlc3RDb250ZXh0OiAoXG4gICAgICAgIG9wdGlvbnM6IHsgdGhyZWFkSWQ/OiBzdHJpbmc7IHJlc291cmNlSWQ/OiBzdHJpbmc7IHJlcXVlc3RJZD86IHN0cmluZyB9ID0ge30sXG4gICAgICApOiBQcm9taXNlPFJlcXVlc3RDb250ZXh0PiA9PiBjcmVhdGVSZXF1ZXN0Q29udGV4dChvcHRpb25zKSxcbiAgICAgIC8qKlxuICAgICAgICogTUNQIGVuZHBvaW50IGluZm8gd2hlbiBgY29uZmlnLm1jcGAgaXMgZW5hYmxlZCwgZWxzZSBgbnVsbGAuXG4gICAgICAgKiBTdHJlYW1hYmxlIEhUVFAgaXMgYGh0dHBgOyB0aGUgU1NFIHBhaXIgaXMgdGhlIGxlZ2FjeSB0cmFuc3BvcnQuXG4gICAgICAgKlxuICAgICAgICogRWFjaCBwYXRoIGlzIGdpdmVuIHR3aWNlOiBtb3VudC1yZWxhdGl2ZSAoYGh0dHBQYXRoYCwgYHNzZVBhdGhgLFxuICAgICAgICogYG1lc3NhZ2VQYXRoYCkgZm9yIGFueXRoaW5nIHRoYXQgYWxyZWFkeSBrbm93cyB3aGVyZSB0aGUgcGx1Z2luIGlzXG4gICAgICAgKiBtb3VudGVkLCBhbmQgYWJzb2x1dGUgKGBodHRwYCwgYHNzZWAsIGBtZXNzYWdlc2ApIGZvciBNQ1AgY2xpZW50cyxcbiAgICAgICAqIHdoaWNoIHRha2UgYSBzaW5nbGUgVVJMIGFuZCBjYW5ub3QgY29tcG9zZSBvbmUuIFRoZSBhYnNvbHV0ZSBmb3JtIGlzXG4gICAgICAgKiBidWlsdCBmcm9tIHtAbGluayBiYXNlUGF0aH0sIHNvIGl0IGhvbm9ycyBhIGBjb25maWcubmFtZWAgb3ZlcnJpZGUgYnV0XG4gICAgICAgKiBzdGlsbCBhc3N1bWVzIEFwcEtpdCdzIGRlZmF1bHQgYC9hcGkvPG5hbWU+YCBtb3VudC5cbiAgICAgICAqL1xuICAgICAgZ2V0TWNwOiAoKToge1xuICAgICAgICBzZXJ2ZXJJZDogc3RyaW5nO1xuICAgICAgICBodHRwUGF0aDogc3RyaW5nO1xuICAgICAgICBzc2VQYXRoOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VQYXRoOiBzdHJpbmc7XG4gICAgICAgIGh0dHA6IHN0cmluZztcbiAgICAgICAgc3NlOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VzOiBzdHJpbmc7XG4gICAgICB9IHwgbnVsbCA9PlxuICAgICAgICB0aGlzLm1jcFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzZXJ2ZXJJZDogdGhpcy5tY3Auc2VydmVySWQsXG4gICAgICAgICAgICAgIGh0dHBQYXRoOiB0aGlzLm1jcC5odHRwUGF0aCxcbiAgICAgICAgICAgICAgc3NlUGF0aDogdGhpcy5tY3Auc3NlUGF0aCxcbiAgICAgICAgICAgICAgbWVzc2FnZVBhdGg6IHRoaXMubWNwLm1lc3NhZ2VQYXRoLFxuICAgICAgICAgICAgICBodHRwOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3AuaHR0cFBhdGh9YCxcbiAgICAgICAgICAgICAgc3NlOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3Auc3NlUGF0aH1gLFxuICAgICAgICAgICAgICBtZXNzYWdlczogYCR7dGhpcy5iYXNlUGF0aH0ke3RoaXMubWNwLm1lc3NhZ2VQYXRofWAsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBudWxsLFxuICAgICAgLyoqIEV4cHJlc3Mgc3ViYXBwIE1hc3RyYSBpcyBtb3VudGVkIG9uOyBtb3N0bHkgZm9yIHRlc3RzLiAqL1xuICAgICAgZ2V0TWFzdHJhU2VydmVyOiAoKSA9PiB0aGlzLm1hc3RyYVNlcnZlcixcbiAgICAgIC8qKlxuICAgICAgICogRmV0Y2ggdGhlIHdvcmtzcGFjZSdzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzIChjYWNoZWQpLiBTYW1lXG4gICAgICAgKiBwYXlsb2FkIHRoZSBgR0VUIC9tb2RlbHNgIHJvdXRlIHJldHVybnM7IHN1cmZhY2VkIGhlcmUgc29cbiAgICAgICAqIG90aGVyIHBsdWdpbnMgLyBzY3JpcHRzIGNhbiBpbnRyb3NwZWN0IHRoZSBjYXRhbG9ndWUgd2l0aG91dFxuICAgICAgICogYW4gSFRUUCByb3VuZC10cmlwLiBBcHBLaXQgd3JhcHMgdGhpcyB3aXRoIGBhc1VzZXIocmVxKWAgZm9yXG4gICAgICAgKiBPQk8gc2NvcGluZyBhdXRvbWF0aWNhbGx5LiBUaHJvd3Mgd2hlbiB0aGUgbGlzdGluZyBmYWlscywgc2luY2VcbiAgICAgICAqIHRoZXJlIGlzIG5vIHN0YXR1cyBjb2RlIHRvIGhhbmQgYmFjayBvbiB0aGlzIHN1cmZhY2UuXG4gICAgICAgKi9cbiAgICAgIGxpc3RNb2RlbHM6ICgpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4gPT4gdGhpcy5saXN0TW9kZWxzKCksXG4gICAgICAvKipcbiAgICAgICAqIEZvcmNlLWV2aWN0IGNhY2hlZCBlbmRwb2ludCBsaXN0aW5ncyB2aWEgQXBwS2l0J3NcbiAgICAgICAqIGBDYWNoZU1hbmFnZXJgLiBVc2VmdWwgaW4gdGVzdHMgb3IgcmlnaHQgYWZ0ZXIgYW4gYWRtaW5cbiAgICAgICAqIGRlcGxveXMgYSBuZXcgZW5kcG9pbnQgYW5kIGRvZXNuJ3Qgd2FudCB0byB3YWl0IGZvciB0aGUgVFRMLlxuICAgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBgQ2FjaGVNYW5hZ2VyLmRlbGV0ZWAvYGNsZWFyYCBwcm9taXNlLlxuICAgICAgICovXG4gICAgICBjbGVhck1vZGVsc0NhY2hlOiAoaG9zdD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT5cbiAgICAgICAgbW9kZWxDYXRhbG9nLmNsZWFyU2VydmluZ0VuZHBvaW50c0NhY2hlKGhvc3QpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWJzb2x1dGUgbW91bnQgdGhpcyBwbHVnaW4ncyByb3V0ZXMgYW5zd2VyIG9uLiBBcHBLaXQgbW91bnRzIGV2ZXJ5IHBsdWdpblxuICAgKiBhdCBgL2FwaS88cGx1Z2luLm5hbWU+YCBhbmQgYHRoaXMubmFtZWAgaG9ub3JzIGEgYGNvbmZpZy5uYW1lYCBvdmVycmlkZSxcbiAgICogc28gdGhlIHBlci1yb3V0ZSBzZWdtZW50cyAoYHJvdXRlcy5NQVNUUkFfUk9VVEVTYCkgaGFuZyBvZmYgdGhpcy5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGJhc2VQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvYXBpLyR7dGhpcy5uYW1lfWA7XG4gIH1cblxuICBvdmVycmlkZSBjbGllbnRDb25maWcoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIC8vIFB1Ymxpc2hpbmcgYGJhc2VQYXRoYCBpcyBlbm91Z2ggZm9yIHRoZSBjbGllbnQgdG8gc3RheSBjb3JyZWN0IHVuZGVyIGFcbiAgICAvLyBjdXN0b20gbW91bnQgaWQ6IHRoZSBwZXItcm91dGUgc2VnbWVudHMgYXJlIGZpeGVkXG4gICAgLy8gKGByb3V0ZXMuTUFTVFJBX1JPVVRFU2ApIGFuZCB0aGUgY2xpZW50IChgTWFzdHJhUGx1Z2luQ2xpZW50YCkgZGVyaXZlc1xuICAgIC8vIGV2ZXJ5IGVuZHBvaW50IGZyb20gYGJhc2VQYXRoYC5cbiAgICAvLyBSZXR1cm4gd2lkZW5zIHRvIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAgdG8gc2F0aXNmeSB0aGVcbiAgICAvLyBiYXNlLWNsYXNzIHNpZ25hdHVyZTsgY29uc3VtZXJzIHJlYWQgaXQgdGhyb3VnaCB0aGUgdHlwZWRcbiAgICAvLyBgTWFzdHJhQ2xpZW50Q29uZmlnYCBzaGFwZSB2aWEgYHVzZVBsdWdpbkNsaWVudENvbmZpZzwuLi4+KC4uLilgLlxuICAgIGNvbnN0IGNvbmZpZzogTWFzdHJhQ2xpZW50Q29uZmlnID0ge1xuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBkZWZhdWx0QWdlbnQ6IHRoaXMuYnVpbHQ/LmRlZmF1bHRBZ2VudElkID8/IEZBTExCQUNLX0FHRU5UX0lELFxuICAgICAgYWdlbnRzOiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pLFxuICAgICAgZmVlZGJhY2tFbmFibGVkOiB0aGlzLmZlZWRiYWNrRW5hYmxlZCgpLFxuICAgICAgYmFja2dyb3VuZFR1cm5zOiB0aGlzLmNvbmZpZy5iYWNrZ3JvdW5kVHVybnMgIT09IGZhbHNlLFxuICAgICAgLy8gSW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHRoZSBjaGF0IHdvcmtzIGZvciBhbnkgY2FsbGVyIHdobyBjYW4gb3BlblxuICAgICAgLy8gdGhlIGFwcCwgc28gYSBVSSB0aGF0IGhpZGVzIGNoYXQgYmVoaW5kIGFuIE9CTy10b2tlbiBwcm9iZSBzaG91bGQgc2hvd1xuICAgICAgLy8gaXQgcmVnYXJkbGVzcy4gYFwidXNlclwiYCBtb2RlIGtlZXBzIHRoZSBPQk8tZ2F0ZWQgYmVoYXZpb3IuXG4gICAgICBjaGF0QWx3YXlzQXZhaWxhYmxlOiB0aGlzLmlkZW50aXR5TW9kZSA9PT0gXCJzZXJ2aWNlLXByaW5jaXBhbFwiLFxuICAgIH07XG4gICAgcmV0dXJuIGNvbmZpZyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdXNlciBmZWVkYmFjayBjYW4gYmUgbG9nZ2VkIHRvIE1MZmxvdy4gRGVsZWdhdGVzIHRvXG4gICAqIHtAbGluayByZXNvbHZlRmVlZGJhY2tFbmFibGVkfSBzbyB0aGUgY2xpZW50LWNvbmZpZyBmbGFnIGFuZCB0aGVcbiAgICogZmVlZGJhY2sgcm91dGUgc2hhcmUgdGhlIHNhbWUgZ2F0ZSBhcyB0aGUgc2VydmVyJ3MgdHJhY2UtaWQgaGVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBmZWVkYmFja0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc29sdmVGZWVkYmFja0VuYWJsZWQodGhpcy5jb25maWcuZmVlZGJhY2spO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5qZWN0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNY3BSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW9kZWxSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyRW1iZWRSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyU3VnZ2VzdGlvblJvdXRlcyhyb3V0ZXIpO1xuICAgIHRoaXMucmVnaXN0ZXJHZW5pZUNoYXRSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyRmVlZGJhY2tSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyTWxmbG93RXhwZXJpbWVudFJvdXRlKHJvdXRlcik7XG4gICAgdGhpcy5yZWdpc3RlckFnZW50Um91dGVzKHJvdXRlcik7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgVVJMIGFsaWFzZXMgZm9yIE1hc3RyYSdzIE1DUCB0cmFuc3BvcnRzLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyTWNwUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIEV4cG9zZSB0aGUgTUNQIHRyYW5zcG9ydCBhdCB0aGUgY2xlYW4gYC9tY3BgIChwbHVzIHRoZSBsZWdhY3lcbiAgICAvLyBgL3NzZWAgKyBgL21lc3NhZ2VzYCkgdW5kZXIgdGhlIHBsdWdpbiBtb3VudC4gYEBtYXN0cmEvZXhwcmVzc2BcbiAgICAvLyBtb3VudHMgTUNQIHVuZGVyIGAvbWNwLzxzZXJ2ZXJJZD4vPHRyYW5zcG9ydD5gLCBhbmQgdGhlIHNlcnZlcklkXG4gICAgLy8gZGVmYXVsdHMgdG8gdGhlIHBsdWdpbiBuYW1lLCBzbyB0aGUgcmF3IHJvdXRlIHJlYWRzXG4gICAgLy8gYC9hcGkvbWFzdHJhL21jcC9tYXN0cmEvbWNwYCAoZG91YmxlZCBzZWdtZW50KS4gVGhpcyBydW5zIGJlZm9yZVxuICAgIC8vIHRoZSBjYXRjaC1hbGwgYW5kIHJld3JpdGVzIHRoZSBhbGlhcyB0byB0aGUgdW5kZXJseWluZyByb3V0ZSwgc29cbiAgICAvLyB0aGUgcHVibGljIHBhdGggaXMganVzdCBgL2FwaS88cGx1Z2luPi9tY3BgOyB0aGUgcXVlcnkgc3RyaW5nXG4gICAgLy8gKGUuZy4gdGhlIFNTRSBgc2Vzc2lvbklkYCkgaXMgcHJlc2VydmVkLlxuICAgIC8vXG4gICAgLy8gTWlkZGxld2FyZSByYXRoZXIgdGhhbiBgdGhpcy5yb3V0ZWA6IGl0IHJld3JpdGVzIHRoZSBVUkwgZm9yIHJvdXRlc1xuICAgIC8vIGBAbWFzdHJhL2V4cHJlc3NgIG93bnMgZnVydGhlciBkb3duIHRoZSBjaGFpbiBpbnN0ZWFkIG9mIGFuc3dlcmluZyB0aGVcbiAgICAvLyByZXF1ZXN0LCB3aGljaCBgUm91dGVDb25maWdgIGhhcyBubyBzaGFwZSBmb3IuXG4gICAgcm91dGVyLnVzZSgocmVxLCBfcmVzLCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLm1jcFJvdXRlQWxpYXMocmVxLnBhdGgpO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBjb25zdCBxID0gcmVxLnVybC5pbmRleE9mKFwiP1wiKTtcbiAgICAgICAgcmVxLnVybCA9IHEgPj0gMCA/IHRhcmdldCArIHJlcS51cmwuc2xpY2UocSkgOiB0YXJnZXQ7XG4gICAgICB9XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgbW9kZWwgY2F0YWxvZ3VlIGFuZCBwZXItYWdlbnQgZGVmYXVsdC1tb2RlbCByb3V0ZXMuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJNb2RlbFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBgR0VUIC9tb2RlbHNgIGV4cG9zZXMgdGhlIGNhY2hlZCBlbmRwb2ludCBsaXN0IHNvIGNsaWVudHMgY2FuXG4gICAgLy8gcG9wdWxhdGUgbW9kZWwgcGlja2VycywgdmFsaWRhdGUgYD9tb2RlbD1gIGNob2ljZXMsIGV0Yy4gTXVzdFxuICAgIC8vIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjYXRjaC1hbGwgdGhhdCBmb3J3YXJkcyBldmVyeXRoaW5nIHRvXG4gICAgLy8gdGhlIE1hc3RyYSBzdWJhcHAuXG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwibW9kZWxzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiByb3V0ZXMuTUFTVFJBX1JPVVRFUy5tb2RlbHMsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY29wZWRTZWxmKHJlcSkubGlzdE1vZGVsc1Jlc3VsdCgpO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUocmVzLCByZXN1bHQsIFwibW9kZWxzXCIsIE1PREVMX0NBVEFMT0dVRV9GQUlMRURfTUVTU0FHRSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5qc29uKHsgZW5kcG9pbnRzOiByZXN1bHQuZGF0YSB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBgR0VUIC9kZWZhdWx0LW1vZGVsYCAoYW5kIGAvZGVmYXVsdC1tb2RlbC86YWdlbnRJZGApIHJlcG9ydHMgd2hhdCBhblxuICAgIC8vIHVucGlubmVkIHR1cm4gd2lsbCB1c2UuIEEgY29uZmlndXJlZCBzdHJpbmcgaXMgcmV0dXJuZWQgZGlyZWN0bHk7IGFuXG4gICAgLy8gYXV0b21hdGljIGRlZmF1bHQgcmVzb2x2ZXMgdGhlIGhpZ2hlc3QtcmFua2VkIGN1cnJlbnRseSBhdmFpbGFibGUgR1BUXG4gICAgLy8gKG9yIGdlbmVyYWwgY2hhdCBmYWxsYmFjaykgZnJvbSB0aGUgc2FtZSBPQk8tc2NvcGVkIGxpdmUgY2F0YWxvZ3VlIGFzXG4gICAgLy8gYC9tb2RlbHNgOyBhIGN1c3RvbSBkeW5hbWljIHJlc29sdmVyIHJlbWFpbnMgbnVsbCBiZWNhdXNlIGl0IGlzIGNhbGwtdGltZVxuICAgIC8vIGFwcGxpY2F0aW9uIGNvZGUuXG4gICAgY29uc3QgaGFuZGxlRGVmYXVsdE1vZGVsID0gYXN5bmMgKFxuICAgICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ZWQgPSBzdHJpbmdVdGlscy5maXJzdE5vbkVtcHR5KHJlcS5wYXJhbXMuYWdlbnRJZCk7XG4gICAgICBpZiAocmVxdWVzdGVkICE9PSBudWxsICYmICF0aGlzLmJ1aWx0Py5hZ2VudHNbcmVxdWVzdGVkXSkge1xuICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiB0aGlzLnVua25vd25BZ2VudE1lc3NhZ2UocmVxdWVzdGVkKSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYWdlbnRJZCA9IHJlcXVlc3RlZCA/PyB0aGlzLmJ1aWx0Py5kZWZhdWx0QWdlbnRJZCA/PyBGQUxMQkFDS19BR0VOVF9JRDtcbiAgICAgIGNvbnN0IGludGVudCA9IHRoaXMuYnVpbHQ/LmRlZmF1bHRNb2RlbHNbYWdlbnRJZF07XG4gICAgICBsZXQgbW9kZWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKGludGVudD8ua2luZCA9PT0gXCJjb25maWd1cmVkXCIpIHtcbiAgICAgICAgbW9kZWwgPSBpbnRlbnQubW9kZWw7XG4gICAgICB9IGVsc2UgaWYgKGludGVudD8ua2luZCA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY29wZWRTZWxmKHJlcSkubGlzdE1vZGVsc1Jlc3VsdCgpO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUocmVzLCByZXN1bHQsIFwiZGVmYXVsdC1tb2RlbFwiLCBNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG1vZGVsID0gcmVzb2x2ZURlZmF1bHRNb2RlbElkKHRoaXMuY29uZmlnLCByZXN1bHQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlcy5qc29uKHtcbiAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBtb2RlbCA/IGRpc3BsYXkudG9Nb2RlbERpc3BsYXlOYW1lKG1vZGVsKSA6IG51bGwsXG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRlZmF1bHRNb2RlbFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMuZGVmYXVsdE1vZGVsLFxuICAgICAgaGFuZGxlcjogaGFuZGxlRGVmYXVsdE1vZGVsLFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRlZmF1bHRNb2RlbEJ5QWdlbnRcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IGAke3JvdXRlcy5NQVNUUkFfUk9VVEVTLmRlZmF1bHRNb2RlbH0vOmFnZW50SWRgLFxuICAgICAgaGFuZGxlcjogaGFuZGxlRGVmYXVsdE1vZGVsLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIHRoZSBnZW5lcmljIGNoYXJ0IGFuZCBzdGF0ZW1lbnQgZW1iZWQgcmVzb2x2ZXIuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJFbWJlZFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBgR0VUIC9lbWJlZC86dHlwZS86aWRgIGlzIHRoZSBzaW5nbGUgcmVzb2x2ZXIgZm9yIGV2ZXJ5IGVtYmVkXG4gICAgLy8gbWFya2VyIHRoZSBhZ2VudCBlbWl0cyBpbiBwcm9zZSAoYFtjaGFydDo8aWQ+XWAsXG4gICAgLy8gYFtkYXRhOjxpZD5dYCwgLi4uKS4gYDp0eXBlYCBzZWxlY3RzIGEgcmVzb2x2ZXIgZnJvbSB0aGVcbiAgICAvLyByZWdpc3RyeSBiZWxvdzsgYDppZGAgaXMgdGhhdCByZXNvbHZlcidzIGxvb2t1cCBrZXkuIFRoZSBtYXJrZXIgZ3JhbW1hclxuICAgIC8vIGlzIHR5cGUtYWdub3N0aWM7IHRoZSBjbGllbnQgc3RpbGwgY2hvb3NlcyBob3cgZWFjaCByZWdpc3RlcmVkIHR5cGVcbiAgICAvLyByZW5kZXJzLlxuICAgIC8vXG4gICAgLy8gU3RhdHVzIGNvZGVzOlxuICAgIC8vICAgLSAyMDAgd2l0aCB0aGUgcmVzb2x2ZXIncyBKU09OIGJvZHkgd2hlbiB0aGUgaWQgcmVzb2x2ZXMuXG4gICAgLy8gICAtIDQwNCB3aGVuIGA6dHlwZWAgaXNuJ3QgcmVnaXN0ZXJlZCAodW5zdXBwb3J0ZWQgZW1iZWRcbiAgICAvLyAgICAgdHlwZSkgT1IgYSByZWdpc3RlcmVkIHJlc29sdmVyIGNhbid0IGZpbmQgYDppZGAgKHVua25vd25cbiAgICAvLyAgICAgLyBleHBpcmVkIC0gZS5nLiBhIGNoYXJ0IHBhc3QgaXRzIDFoIFRUTCBvciBhIGZhYnJpY2F0ZWRcbiAgICAvLyAgICAgaWQgdGhlIG1vZGVsIG5ldmVyIG1pbnRlZCkuXG4gICAgLy8gICAtIDQwMCB3aGVuIGA6aWRgIGlzIGVtcHR5LlxuICAgIC8vXG4gICAgLy8gUGVyLXR5cGUgcXVlcnkga25vYnMgYW5kIGJlaGF2aW9yOlxuICAgIC8vICAgLSBgY2hhcnRgOiBsb25nLXBvbGxzIHRoZSBjaGFydCBjYWNoZSB1bnRpbCB0aGUgZW50cnlcbiAgICAvLyAgICAgc2V0dGxlcyAoYHJlc3VsdGAgLyBgZXJyb3JgKSBvciB0aGUgYnVkZ2V0IGVsYXBzZXMgKHRoZW5cbiAgICAvLyAgICAgcmV0dXJucyB0aGUgc3RpbGwtcHJvY2Vzc2luZyBlbnRyeSB0byBwb2xsIGFnYWluKS5cbiAgICAvLyAgICAgYD90aW1lb3V0TXM9PG4+YCAoZGVmYXVsdCA2MHMsIGNhcHBlZCA1bWluKSB0dW5lcyBpdC5cbiAgICAvLyAgIC0gYGRhdGFgOiBvbmUgU3RhdGVtZW50IEV4ZWN1dGlvbiBmZXRjaCB1bmRlciBgZ2VuaWVJZGVudGl0eWAuXG4gICAgLy8gICAtIGB2aXN1YWxpemF0aW9uYDogdGhlIHNhbWUgcGF5bG9hZCB1bmRlciBtYW5kYXRvcnkgT0JPIGlkZW50aXR5IGZvclxuICAgIC8vICAgICBkaXJlY3QgR2VuaWUgY2hhdCwgd2hvc2UgY29udmVyc2F0aW9ucyBiZWxvbmcgdG8gdGhlIHNpZ25lZC1pbiB1c2VyLlxuICAgIC8vICAgICBgP2xpbWl0PTxuPmAgY2FwcyByb3dzIChjbGFtcGVkIHRvIFNUQVRFTUVOVF9ST1dfQ0FQKS5cbiAgICAvL1xuICAgIC8vIEJ1aWx0IG9uY2UgKHRoaXMgaGFuZGxlciBpcyByZWdpc3RlcmVkIG9uY2UpIGFuZCBrZXllZCBieSB0aGVcbiAgICAvLyByYXcgYDp0eXBlYCB0b2tlbi4gRWFjaCByZXNvbHZlciBnZXRzIHRoZSByZXF1ZXN0IChmb3IgcXVlcnlcbiAgICAvLyBwYXJzaW5nICsgT0JPIHNjb3BpbmcpIGFuZCBhbiBgQWJvcnRTaWduYWxgIGJyaWRnZWQgb2ZmIHRoZVxuICAgIC8vIGNvbm5lY3Rpb24gYGNsb3NlYCBldmVudCBzbyBhIGxvbmctcG9sbCB1bmJsb2NrcyB0aGUgaW5zdGFudFxuICAgIC8vIHRoZSBjbGllbnQgZGlzY29ubmVjdHMuIGB1bmRlZmluZWRgIGZyb20gYSByZXNvbHZlciBtYXBzIHRvIGFcbiAgICAvLyBjbGVhbiA0MDQ7IHRocm93biBlcnJvcnMgYnViYmxlIHRocm91Z2ggYG5leHQoZXJyKWAuXG4gICAgY29uc3QgZW1iZWRSZXNvbHZlcnM6IFJlY29yZDxzdHJpbmcsIEVtYmVkUmVzb2x2ZXI+ID0ge1xuICAgICAgY2hhcnQ6IChyZXEsIGlkLCBzaWduYWwpID0+IHtcbiAgICAgICAgY29uc3QgdGltZW91dE1zID0gcGFyc2VUaW1lb3V0TXMocmVxLnF1ZXJ5LnRpbWVvdXRNcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5mZXRjaENoYXJ0RW50cnkocmVxLCBpZCwge1xuICAgICAgICAgIC4uLih0aW1lb3V0TXMgIT09IHVuZGVmaW5lZCA/IHsgdGltZW91dE1zIH0gOiB7fSksXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBkYXRhOiAocmVxLCBpZCwgc2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcGFyc2VTdGF0ZW1lbnRMaW1pdChyZXEucXVlcnkubGltaXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZWRTZWxmKHJlcSkuZmV0Y2hTdGF0ZW1lbnQoaWQsIHtcbiAgICAgICAgICAuLi4obGltaXQgIT09IHVuZGVmaW5lZCA/IHsgbGltaXQgfSA6IHt9KSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHZpc3VhbGl6YXRpb246IChyZXEsIGlkLCBzaWduYWwpID0+IHtcbiAgICAgICAgY29uc3QgbGltaXQgPSBwYXJzZVN0YXRlbWVudExpbWl0KHJlcS5xdWVyeS5saW1pdCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFzVXNlcihyZXEpLmZldGNoU3RhdGVtZW50KGlkLCB7XG4gICAgICAgICAgLi4uKGxpbWl0ICE9PSB1bmRlZmluZWQgPyB7IGxpbWl0IH0gOiB7fSksXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImVtYmVkXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5lbWJlZH0vOnR5cGUvOmlkYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLnR5cGUpID8/IFwiXCI7XG4gICAgICAgIGNvbnN0IGlkID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLmlkKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZSA9IGVtYmVkUmVzb2x2ZXJzW3R5cGVdO1xuICAgICAgICBpZiAoIXJlc29sdmUpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZW1iZWQ6dW5zdXBwb3J0ZWRcIiwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgdW5zdXBwb3J0ZWQgZW1iZWQgdHlwZTogJHt0eXBlfWAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZW1iZWQ6aW52YWxpZFwiLCB7XG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBcImlkIGlzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogXCJpZCBpcyByZXF1aXJlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBCcmlkZ2UgcmVzcG9uc2UgY2xvc2Ugb250byBhbiBBYm9ydFNpZ25hbCBzbyBhIGNsaWVudCBkaXNjb25uZWN0XG4gICAgICAgIC8vIHJlbGVhc2VzIGxvbmctcG9sbCBhbmQgd29ya3NwYWNlIGNhbGxzIGltbWVkaWF0ZWx5LlxuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICByZXMub24oXCJjbG9zZVwiLCAoKSA9PiBjb250cm9sbGVyLmFib3J0KCkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlKHJlcSwgaWQsIGNvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBgZW1iZWQ6JHt0eXBlfWAsIGBDb3VsZCBub3QgcmVzb2x2ZSB0aGUgJHt0eXBlfSBlbWJlZGApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEEgY2FjaGUgbWlzcyBpcyBzZWN1cml0eS1kZWxpYmVyYXRlbHkgYW1iaWd1b3VzOiB1bmtub3duLCBleHBpcmVkLFxuICAgICAgICAgIC8vIG9yIG93bmVkIGJ5IGFub3RoZXIgaWRlbnRpdHkgYWxsIG1hcCB0byB0aGUgc2FtZSA0MDQuIExvZyB0aGVcbiAgICAgICAgICAvLyBvcGFxdWUgaWQgYW5kIHRob3NlIHBvc3NpYmxlIGNhdXNlcyBzbyBhIGZhYnJpY2F0ZWQgbWFya2VyIGlzXG4gICAgICAgICAgLy8gZGlhZ25vc2FibGUgZnJvbSB0aGUgc2VydmVyIHdpdGhvdXQgZGlzY2xvc2luZyB3aGljaCBjYXVzZSBhcHBsaWVkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGVtYmVkOiR7dHlwZX06bm90LWZvdW5kYCwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICAgIHJlYXNvbjogXCJ1bmtub3duLCBleHBpcmVkLCBvciBvd25lZCBieSBhbm90aGVyIGlkZW50aXR5XCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYCR7dHlwZX0gbm90IGZvdW5kYCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24ocmVzdWx0LmRhdGEpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBkZWZhdWx0IGFuZCBhZ2VudC1xdWFsaWZpZWQgc3VnZ2VzdGlvbiByb3V0ZXMuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJTdWdnZXN0aW9uUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIGBHRVQgL3N1Z2dlc3Rpb25zYCAoYW5kIGAvc3VnZ2VzdGlvbnMvOmFnZW50SWRgKSByZXR1cm5zIHRoZVxuICAgIC8vIGN1cmF0ZWQgc3RhcnRlciBxdWVzdGlvbnMgZm9yIHRoZSBhZ2VudCdzIEdlbmllIHNwYWNlKHMpIC0gdGhlXG4gICAgLy8gYXV0aG9yLWNvbmZpZ3VyZWQgYHNhbXBsZV9xdWVzdGlvbnNgLCBzdXJmYWNlZCBhcyBvbmUtdGFwXG4gICAgLy8gcHJvbXB0cyBvbiB0aGUgY2hhdCBlbXB0eSBzdGF0ZS4gUmV0dXJucyBgeyBxdWVzdGlvbnM6IFtdIH1gXG4gICAgLy8gd2hlbiBubyBHZW5pZSBzcGFjZSBpcyB3aXJlZCBzbyB0aGUgY2xpZW50IHJlbmRlcnMgYSBiYXJlXG4gICAgLy8gZW1wdHkgc3RhdGUgKG5vIGJ1aWx0LWluIGV4YW1wbGUgcHJvbXB0cykuIFRoZSBgOmFnZW50SWRgXG4gICAgLy8gc2VnbWVudCBpcyBhY2NlcHRlZCBmb3IgVVJMIHN5bW1ldHJ5IHdpdGggdGhlIGNoYXQgLyBoaXN0b3J5XG4gICAgLy8gcm91dGVzOyBHZW5pZSBzcGFjZXMgYXJlIHJlc29sdmVkIHBlci1wbHVnaW4sIG5vdCBwZXItYWdlbnQsXG4gICAgLy8gc28gaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHJlc3VsdC4gVGhlIHNwYWNlIGxvb2t1cCB1c2VzIHRoZSBjb25maWd1cmVkXG4gICAgLy8gYWdlbnQtYmFja2VkIGlkZW50aXR5LlxuICAgIGNvbnN0IGhhbmRsZVN1Z2dlc3Rpb25zID0gYXN5bmMgKFxuICAgICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgcmVzLm9uKFwiY2xvc2VcIiwgKCkgPT4gY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoU3VnZ2VzdGlvbnMoY29udHJvbGxlci5zaWduYWwpO1xuICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIC8vIFN1Z2dlc3Rpb25zIGFyZSBhIG5vbi1jcml0aWNhbCBlbmhhbmNlbWVudDsgYSBsb29rdXAgZmFpbHVyZSBzaG91bGRcbiAgICAgICAgLy8gbGVhdmUgdGhlIGNoYXQgdXNhYmxlIHdpdGggYSBiYXJlIGVtcHR5IHN0YXRlIHJhdGhlciB0aGFuIHN1cmZhY2luZ1xuICAgICAgICAvLyB0aGUgdXBzdHJlYW0gc3RhdHVzLiBMb2cgYW5kIGRlZ3JhZGUuXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJzdWdnZXN0aW9uczplcnJvclwiLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IocmVzdWx0Lm1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzLmpzb24oeyBxdWVzdGlvbnM6IFtdIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXMuanNvbih7IHF1ZXN0aW9uczogcmVzdWx0LmRhdGEgfSk7XG4gICAgfTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzdWdnZXN0aW9uc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMuc3VnZ2VzdGlvbnMsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVTdWdnZXN0aW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzdWdnZXN0aW9uc0J5QWdlbnRcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IGAke3JvdXRlcy5NQVNUUkFfUk9VVEVTLnN1Z2dlc3Rpb25zfS86YWdlbnRJZGAsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVTdWdnZXN0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGUgZGlyZWN0IEdlbmllIGNoYXQgcm91dGVzLiBFYWNoIHJvdXRlIGlzIHNjb3BlZCB0byBvbmUgR2VuaWVcbiAgICogc3BhY2UgYWxpYXMgYW5kIHNpdHMgZGlyZWN0bHkgb24gdGhlIEdlbmllIEFQSXMgdW5kZXIgQXBwS2l0J3MgT0JPIHVzZXJcbiAgICogY29udGV4dDogY29udmVyc2F0aW9ucyBhcmUgdGhyZWFkcywgR2VuaWUgbWVzc2FnZXMgYXJlIGhpc3RvcnksIGFuZCBhIHR1cm5cbiAgICogc3RyZWFtcyB0aGUgc2FtZSBBSSBTREsgY2h1bmtzIGFzIGFuIGFnZW50J3MgYGFza19nZW5pZWAgY2FsbC4gTm90aGluZyBpc1xuICAgKiB3cml0dGVuIHRvIE1hc3RyYSBNZW1vcnkuXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyR2VuaWVDaGF0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSAoLi4ucGFydHM6IHN0cmluZ1tdKSA9PiByb3V0ZXMuZ2VuaWVSb3V0ZVBhdGgoXCI6YWxpYXNcIiwgLi4ucGFydHMpO1xuICAgIGNvbnN0IHsgY2hhdDogY2hhdFNlZ21lbnQsIG1lc3NhZ2VzLCBzdWdnZXN0aW9ucywgdGhyZWFkcyB9ID0gcm91dGVzLk1BU1RSQV9ST1VURVM7XG4gICAgLyoqIFJlc29sdmUgdGhlIHJvdXRlJ3MgYWxpYXMsIGFuc3dlcmluZyA0MDQgd2hlbiBubyBzdWNoIHNwYWNlIGlzIGNvbmZpZ3VyZWQuICovXG4gICAgY29uc3Qgc3BhY2VGb3IgPSAocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlczogZXhwcmVzcy5SZXNwb25zZSk6IEdlbmllQ2hhdFNwYWNlIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGNvbnN0IGFsaWFzID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLmFsaWFzKSA/PyBcIlwiO1xuICAgICAgY29uc3QgY29uZmlndXJlZCA9IHJlc29sdmVHZW5pZVNwYWNlcyh0aGlzLmNvbmZpZywgdGhpcy5jb250ZXh0KVthbGlhc107XG4gICAgICBpZiAoY29uZmlndXJlZCkgcmV0dXJuIHsgYWxpYXMsIHNwYWNlSWQ6IGNvbmZpZ3VyZWQuc3BhY2VJZCB9O1xuICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYFVua25vd24gR2VuaWUgc3BhY2UgYWxpYXMgXCIke2FsaWFzfVwiYCB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKiogQnJpZGdlIHRoZSBjb25uZWN0aW9uIGBjbG9zZWAgZXZlbnQgb250byBhbiBhYm9ydCBzaWduYWwuICovXG4gICAgY29uc3QgY2xvc2VTaWduYWwgPSAocmVzOiBleHByZXNzLlJlc3BvbnNlKTogQWJvcnRTaWduYWwgPT4ge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJlcy5vbihcImNsb3NlXCIsICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gICAgfTtcblxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImdlbmllQ2hhdFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IHBhdGgoY2hhdFNlZ21lbnQpLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VGb3IocmVxLCByZXMpO1xuICAgICAgICBpZiAoIXNwYWNlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHdpcmUuR2VuaWVDaGF0UmVxdWVzdFNjaGVtYS5zYWZlUGFyc2UocmVxLmJvZHkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzXG4gICAgICAgICAgICAuc3RhdHVzKDQwMClcbiAgICAgICAgICAgIC5qc29uKHsgZXJyb3I6IFwicXVlc3Rpb24gaXMgcmVxdWlyZWRcIiwgZmllbGRzOiBpbnZhbGlkRmllbGRzKHBhcnNlZC5lcnJvcikgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuYXNVc2VyKHJlcSkuc3RyZWFtR2VuaWVDaGF0KHJlcywgc3BhY2UsIHBhcnNlZC5kYXRhLCBjbG9zZVNpZ25hbChyZXMpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZ2VuaWVUaHJlYWRzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBwYXRoKHRocmVhZHMpLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VGb3IocmVxLCByZXMpO1xuICAgICAgICBpZiAoIXNwYWNlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXNVc2VyKHJlcSkuZ2VuaWVDb252ZXJzYXRpb25SZWFkKChjbGllbnQpID0+XG4gICAgICAgICAgbGlzdEdlbmllVGhyZWFkcyhjbGllbnQsIHNwYWNlKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImdlbmllLXRocmVhZHNcIiwgXCJDb3VsZCBub3QgbGlzdCBHZW5pZSBjb252ZXJzYXRpb25zXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuanNvbih7IHRocmVhZHM6IHJlc3VsdC5kYXRhIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJnZW5pZVRocmVhZE1lc3NhZ2VzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBwYXRoKHRocmVhZHMsIFwiOnRocmVhZElkXCIsIG1lc3NhZ2VzKSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCBzcGFjZSA9IHNwYWNlRm9yKHJlcSwgcmVzKTtcbiAgICAgICAgaWYgKCFzcGFjZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aHJlYWRJZCA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy50aHJlYWRJZCkgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hc1VzZXIocmVxKS5nZW5pZUNvbnZlcnNhdGlvblJlYWQoKGNsaWVudCkgPT5cbiAgICAgICAgICBsaXN0R2VuaWVUaHJlYWRNZXNzYWdlcyh7XG4gICAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aHJlYWRJZCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImdlbmllLW1lc3NhZ2VzXCIsIFwiQ291bGQgbm90IGxvYWQgdGhlIEdlbmllIGNvbnZlcnNhdGlvblwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24oeyBtZXNzYWdlczogcmVzdWx0LmRhdGEgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImdlbmllVGhyZWFkRGVsZXRlXCIsXG4gICAgICBtZXRob2Q6IFwiZGVsZXRlXCIsXG4gICAgICBwYXRoOiBwYXRoKHRocmVhZHMsIFwiOnRocmVhZElkXCIpLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VGb3IocmVxLCByZXMpO1xuICAgICAgICBpZiAoIXNwYWNlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLnRocmVhZElkKSA/PyBcIlwiO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFzVXNlcihyZXEpLmdlbmllQ29udmVyc2F0aW9uV3JpdGUoKGNsaWVudCkgPT5cbiAgICAgICAgICBkZWxldGVHZW5pZVRocmVhZChjbGllbnQsIHNwYWNlLCB0aHJlYWRJZCksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShcbiAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIFwiZ2VuaWUtdGhyZWFkLWRlbGV0ZVwiLFxuICAgICAgICAgICAgXCJDb3VsZCBub3QgZGVsZXRlIHRoZSBHZW5pZSBjb252ZXJzYXRpb25cIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuc3RhdHVzKDIwNCkuZW5kKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImdlbmllVGhyZWFkTWVzc2FnZURlbGV0ZVwiLFxuICAgICAgbWV0aG9kOiBcImRlbGV0ZVwiLFxuICAgICAgcGF0aDogcGF0aCh0aHJlYWRzLCBcIjp0aHJlYWRJZFwiLCBtZXNzYWdlcywgXCI6bWVzc2FnZUlkXCIpLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VGb3IocmVxLCByZXMpO1xuICAgICAgICBpZiAoIXNwYWNlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLnRocmVhZElkKSA/PyBcIlwiO1xuICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBzdHJpbmdVdGlscy5maXJzdE5vbkVtcHR5KHJlcS5wYXJhbXMubWVzc2FnZUlkKSA/PyBcIlwiO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFzVXNlcihyZXEpLmdlbmllQ29udmVyc2F0aW9uV3JpdGUoKGNsaWVudCkgPT5cbiAgICAgICAgICBkZWxldGVHZW5pZVRocmVhZE1lc3NhZ2UoY2xpZW50LCBzcGFjZSwgdGhyZWFkSWQsIG1lc3NhZ2VJZCksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShcbiAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIFwiZ2VuaWUtbWVzc2FnZS1kZWxldGVcIixcbiAgICAgICAgICAgIFwiQ291bGQgbm90IGRlbGV0ZSB0aGUgR2VuaWUgbWVzc2FnZVwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5zdGF0dXMoMjA0KS5lbmQoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZ2VuaWVTdWdnZXN0aW9uc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcGF0aChzdWdnZXN0aW9ucyksXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3Qgc3BhY2UgPSBzcGFjZUZvcihyZXEsIHJlcyk7XG4gICAgICAgIGlmICghc3BhY2UpIHJldHVybjtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hc1VzZXIocmVxKS5mZXRjaFN1Z2dlc3Rpb25zKHVuZGVmaW5lZCwge1xuICAgICAgICAgIFtzcGFjZS5hbGlhc106IHsgc3BhY2VJZDogc3BhY2Uuc3BhY2VJZCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzLmpzb24oeyBxdWVzdGlvbnM6IHJlc3VsdC5vayA/IHJlc3VsdC5kYXRhIDogW10gfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBvbmUgZGlyZWN0IEdlbmllIHR1cm4gdG8gYHJlc2AgdW5kZXIgQXBwS2l0J3MgT0JPIHVzZXIgY29udGV4dC5cbiAgICogRGlyZWN0IGNvbnZlcnNhdGlvbnMgY2Fubm90IHVzZSB0aGUgc2hhcmVkIHNlcnZpY2UgcHJpbmNpcGFsIGJlY2F1c2UgR2VuaWVcbiAgICogb3ducyB0aGVtIHVuZGVyIHRoZSBEYXRhYnJpY2tzIGNhbGxlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3RyZWFtR2VuaWVDaGF0KFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICBzcGFjZTogR2VuaWVDaGF0U3BhY2UsXG4gICAgcmVxdWVzdDogR2VuaWVDaGF0UmVxdWVzdCxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgIGNvbnN0IGNsaWVudCA9IGNvbnRleHQuY2xpZW50O1xuICAgIGF3YWl0IHBpcGVVSU1lc3NhZ2VTdHJlYW1Ub1Jlc3BvbnNlKHtcbiAgICAgIHJlc3BvbnNlOiByZXMsXG4gICAgICBzdHJlYW06IGdlbmllQ2hhdFN0cmVhbSh7XG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgc3BhY2UsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHNpZ25hbCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJ1biBvbmUgR2VuaWUgY29udmVyc2F0aW9uIHJlYWQgdW5kZXIgdGhlIGFjdGl2ZSByZXF1ZXN0IGlkZW50aXR5LiAqL1xuICBwcml2YXRlIGdlbmllQ29udmVyc2F0aW9uUmVhZDxUPihcbiAgICByZWFkOiAoY2xpZW50OiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRFeGVjdXRpb25Db250ZXh0PltcImNsaWVudFwiXSkgPT4gUHJvbWlzZTxUPixcbiAgKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKCkgPT4gcmVhZChjbGllbnQpLCBnZW5pZUNvbnZlcnNhdGlvblJlYWREZWZhdWx0cyk7XG4gIH1cblxuICAvKiogUnVuIG9uZSBHZW5pZSBjb252ZXJzYXRpb24gd3JpdGUgdW5kZXIgdGhlIGFjdGl2ZSByZXF1ZXN0IGlkZW50aXR5LiAqL1xuICBwcml2YXRlIGdlbmllQ29udmVyc2F0aW9uV3JpdGUoXG4gICAgd3JpdGU6IChjbGllbnQ6IFJldHVyblR5cGU8dHlwZW9mIGdldEV4ZWN1dGlvbkNvbnRleHQ+W1wiY2xpZW50XCJdKSA9PiBQcm9taXNlPHZvaWQ+LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDx2b2lkPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSgoKSA9PiB3cml0ZShjbGllbnQpLCBnZW5pZUNvbnZlcnNhdGlvbldyaXRlRGVmYXVsdHMpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIE1MZmxvdyBmZWVkYmFjayBzdWJtaXNzaW9uIHdoZW4gY29uZmlndXJlZC4gKi9cbiAgcHJpdmF0ZSByZWdpc3RlckZlZWRiYWNrUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIGBQT1NUIC9yb3V0ZS9mZWVkYmFja2AgbG9ncyBhIHRodW1icyAvIGNvbW1lbnQgYXNzZXNzbWVudCBhZ2FpbnN0XG4gICAgLy8gYSB0dXJuJ3MgTUxmbG93IHRyYWNlICh0aGUgYHRyYWNlSWRgIHRoZSBjbGllbnQgY2FwdHVyZWQgZnJvbSB0aGVcbiAgICAvLyBzdHJlYW0gcmVzcG9uc2UncyB0cmFjZS1pZCBoZWFkZXIpLiBSZWdpc3RlcmVkIG9uIHRoZSBBcHBLaXRcbiAgICAvLyByb3V0ZXIgKGxpa2UgYC9tb2RlbHNgKSByYXRoZXIgdGhhbiB0aGUgTWFzdHJhIHN1YmFwcCBzbyBpdCBydW5zXG4gICAgLy8gdW5kZXIgdGhlIHNhbWUgT0JPIHNjb3BlIC0gdGhlIGZlZWRiYWNrIGlzIGF0dHJpYnV0ZWQgdG8gdGhlXG4gICAgLy8gc2lnbmVkLWluIHVzZXIuIFJldHVybnMgNDA0IHdoZW4gZmVlZGJhY2sgaXMgZGlzYWJsZWQgc28gdGhlXG4gICAgLy8gY2xpZW50IHRyZWF0cyB0aGUgY2FwYWJpbGl0eSBhcyBhYnNlbnQ7IDQwMCBvbiBhIG1hbGZvcm1lZCBib2R5LlxuICAgIC8vIEEgcmVjb3JkZWQgYXNzZXNzbWVudCB5aWVsZHMgYHsgb2s6IHRydWUgfWA7IGEgc29mdCBmYWlsdXJlIChtb3N0XG4gICAgLy8gb2Z0ZW4gdGhlIHRyYWNlIGhhc24ndCBmaW5pc2hlZCBleHBvcnRpbmcgdG8gTUxmbG93IHlldCkgeWllbGRzXG4gICAgLy8gYHsgb2s6IGZhbHNlIH1gIHdpdGhvdXQgYSA1eHggc28gdGhlIFVJIGNhbiBwcm9tcHQgYSByZXRyeS5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJmZWVkYmFja1wiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLmZlZWRiYWNrLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5mZWVkYmFja0VuYWJsZWQoKSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgb2s6IGZhbHNlIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWQgPSBmZWVkYmFjay5NYXN0cmFGZWVkYmFja1JlcXVlc3RTY2hlbWEuc2FmZVBhcnNlKHJlcS5ib2R5KTtcbiAgICAgICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgICAgIC8vIEEgWm9kIGlzc3VlIHN0cmluZyBxdW90ZXMgdGhlIHJlY2VpdmVkIGJvZHkgYmFjaywgc28gb25seSB0aGVcbiAgICAgICAgICAvLyBvZmZlbmRpbmcgZmllbGQgbmFtZXMgdHJhdmVsOyB0aGUgZnVsbCBpc3N1ZSBsaXN0IGlzIGxvZ2dlZC5cbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZmVlZGJhY2s6aW52YWxpZFwiLCB7IGVycm9yOiBwYXJzZWQuZXJyb3IgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IElOVkFMSURfRkVFREJBQ0tfTUVTU0FHRSxcbiAgICAgICAgICAgIGZpZWxkczogaW52YWxpZEZpZWxkcyhwYXJzZWQuZXJyb3IpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5sb2dGZWVkYmFjayhwYXJzZWQuZGF0YSk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgXCJmZWVkYmFja1wiLCBcIkZlZWRiYWNrIGNvdWxkIG5vdCBiZSByZWNvcmRlZFwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXNzZXNzbWVudElkID0gcmVzdWx0LmRhdGE7XG4gICAgICAgIHJlcy5qc29uKHtcbiAgICAgICAgICBvazogYXNzZXNzbWVudElkICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgLi4uKGFzc2Vzc21lbnRJZCA/IHsgYXNzZXNzbWVudElkIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciB0aGUgYmVzdC1lZmZvcnQgcGVyLXZpZXdlciBNTGZsb3cgZXhwZXJpbWVudCBkZWJ1ZyBsaW5rLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyTWxmbG93RXhwZXJpbWVudFJvdXRlKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcIm1sZmxvd0V4cGVyaW1lbnRcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLm1sZmxvd0V4cGVyaW1lbnQsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmZlZWRiYWNrRW5hYmxlZCgpKSB7XG4gICAgICAgICAgcmVzLmpzb24oeyB1cmw6IG51bGwgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoTWxmbG93RXhwZXJpbWVudFVybCgpO1xuICAgICAgICByZXMuanNvbih7IHVybDogcmVzdWx0Lm9rID8gKHJlc3VsdC5kYXRhID8/IG51bGwpIDogbnVsbCB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgdGhlIGdhdGVkIE1hc3RyYSBjYXRjaC1hbGwgYWZ0ZXIgZXZlcnkgZXhwbGljaXQgcm91dGUuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJBZ2VudFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBNaWRkbGV3YXJlIHJhdGhlciB0aGFuIGB0aGlzLnJvdXRlYDogdGhpcyBpcyB0aGUgY2F0Y2gtYWxsIHRoYXQgaGFuZHNcbiAgICAvLyBldmVyeSByZW1haW5pbmcgbWV0aG9kIC8gcGF0aCBwYWlyIHRvIHRoZSBNYXN0cmEgc3ViLWFwcCwgc28gaXQgaGFzIG5vXG4gICAgLy8gc2luZ2xlIG1ldGhvZCBvciBwYXRoIHRvIHJlZ2lzdGVyIHVuZGVyLlxuICAgIHJvdXRlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMubWFzdHJhQXBwKSByZXR1cm4gcmVzLnN0YXR1cyg1MDMpLmVuZCgpO1xuICAgICAgLy8gR2F0ZSB0aGUgc3RvY2sgTWFzdHJhIHN1cmZhY2UgYmVmb3JlIGRpc3BhdGNoLiBJbiB0aGUgZGVmYXVsdFxuICAgICAgLy8gXCJzY29wZWRcIiBtb2RlIG9ubHkgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHRoaXNcbiAgICAgIC8vIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUCByZWFjaCBNYXN0cmE7XG4gICAgICAvLyBhZG1pbiAvIG11dGF0aW5nIC8gYnVsay1leHBvcnQgcm91dGVzIGFyZSByZWZ1c2VkIGhlcmUuIGByZXEucGF0aGBcbiAgICAgIC8vIGlzIG1vdW50LXJlbGF0aXZlIHVuZGVyIHRoZSBwbHVnaW4gbW91bnQuIFNlZSBgc2VydmVyLnRzYC5cbiAgICAgIGlmIChcbiAgICAgICAgIWlzTWFzdHJhUmVxdWVzdEFsbG93ZWQocmVxLm1ldGhvZCwgcmVxLnBhdGgsIHtcbiAgICAgICAgICBhY2Nlc3M6IHRoaXMuY29uZmlnLmFwaUFjY2VzcyA/PyBcInNjb3BlZFwiLFxuICAgICAgICAgIC8vIFJlZmxlY3QgdGhlICpyZXNvbHZlZCogTUNQIHN0YXRlLCBub3QgcmF3IGBjb25maWcubWNwYDogTUNQIGlzXG4gICAgICAgICAgLy8gb24gYnkgZGVmYXVsdCAoYGNvbmZpZy5tY3BgIHVuZGVmaW5lZCksIHNvIGdhdGUgb24gd2hldGhlciB0aGVcbiAgICAgICAgICAvLyBzZXJ2ZXIgd2FzIGFjdHVhbGx5IGJ1aWx0IGFuZCBtb3VudGVkLlxuICAgICAgICAgIG1jcEVuYWJsZWQ6IHRoaXMubWNwICE9PSBudWxsLFxuICAgICAgICB9KVxuICAgICAgKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwiRW5kcG9pbnQgbm90IGV4cG9zZWQgdG8gdGhlIGNsaWVudCAoYXBpQWNjZXNzPXNjb3BlZClcIiB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gRGlzcGF0Y2ggdGhyb3VnaCBhIHJlYWwgbWV0aG9kLCBOT1QgdGhlIGBtYXN0cmFBcHBgIHByb3BlcnR5LiBUaGVcbiAgICAgIC8vIEFwcEtpdCBgYXNVc2VyKHJlcSlgIHByb3h5IHdyYXBzIGZ1bmN0aW9uLXZhbHVlZCBwcm9wcyB3aXRoXG4gICAgICAvLyBgdmFsdWUuYmluZCh0YXJnZXQpYC4gYG1hc3RyYUFwcGAgaXMgYW4gZXhwcmVzcyBhcHAgd2hvc2UgYC5iaW5kYCBpc1xuICAgICAgLy8gdGhlIEhUVFAgQklORCByb3V0ZSByZWdpc3RyYXIgKGV4cHJlc3MgZGVmaW5lcyBhIG1ldGhvZCBwZXIgSFRUUCB2ZXJiLFxuICAgICAgLy8gYW5kIEJJTkQgaXMgb25lKSwgbm90IGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgLSBzbyBiaW5kaW5nIGl0IHRocm91Z2hcbiAgICAgIC8vIHRoZSBwcm94eSByZWdpc3RlcnMgYSBib2d1cyByb3V0ZSBhbmQgY3Jhc2hlcyBgcGF0aFRvUmVnZXhwYFxuICAgICAgLy8gKFwicGF0aCBtdXN0IGJlIGEgc3RyaW5nIC4uLlwiKS4gVGhpcyBvbmx5IG1hbmlmZXN0cyBpbiBwcm9kdWN0aW9uIHdoZXJlXG4gICAgICAvLyBhbiBPQk8gdG9rZW4gbWFrZXMgYHNjb3BlZFNlbGZgIHJldHVybiB0aGUgcHJveHkuIGBkaXNwYXRjaE1hc3RyYWBcbiAgICAgIC8vIGlzIGEgcGxhaW4gbWV0aG9kIChpdHMgYC5iaW5kYCBpcyB0aGUgbm9ybWFsIG9uZSkgYW5kIGludm9rZXNcbiAgICAgIC8vIGB0aGlzLm1hc3RyYUFwcGAgb2ZmIHRoZSByZWFsIHRhcmdldCwga2VlcGluZyB0aGUgT0JPIHNjb3BlIGFjdGl2ZS5cbiAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5kaXNwYXRjaE1hc3RyYShyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwIGEgZmFpbGVkIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IG9udG8gdGhlIHJlc3BvbnNlOiB0aGUgc3RhdHVzIHRoZVxuICAgKiBleGVjdXRpb24gcGlwZWxpbmUgcmVzb2x2ZWQsIHBhaXJlZCB3aXRoIGBjbGllbnRNZXNzYWdlYCByYXRoZXIgdGhhbiB0aGVcbiAgICogcmVzdWx0J3Mgb3duIHRleHQsIHdoaWNoIGNhbiBjYXJyeSB1cHN0cmVhbSBkZXRhaWwuIFRoZSBmdWxsIG1lc3NhZ2UgaXNcbiAgICogbG9nZ2VkIHVuZGVyIGA8b3BlcmF0aW9uPjplcnJvcmAuXG4gICAqL1xuICBwcml2YXRlIHNlbmRGYWlsdXJlKFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXN1bHQ6IHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9LFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGNsaWVudE1lc3NhZ2U6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIud2FybihgJHtvcGVyYXRpb259OmVycm9yYCwge1xuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihyZXN1bHQubWVzc2FnZSksXG4gICAgfSk7XG4gICAgaWYgKHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xuICAgIHJlcy5zdGF0dXMocmVzdWx0LnN0YXR1cykuanNvbih7IGVycm9yOiBjbGllbnRNZXNzYWdlIH0pO1xuICB9XG5cbiAgLyoqIDQwNCBib2R5IGZvciBhIHJlcXVlc3QgbmFtaW5nIGFuIGFnZW50IHRoYXQgaXNuJ3QgcmVnaXN0ZXJlZC4gKi9cbiAgcHJpdmF0ZSB1bmtub3duQWdlbnRNZXNzYWdlKGFnZW50SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZCA9IE9iamVjdC5rZXlzKHRoaXMuYnVpbHQ/LmFnZW50cyA/PyB7fSk7XG4gICAgcmV0dXJuIGBVbmtub3duIGFnZW50IFwiJHthZ2VudElkfVwiLiBSZWdpc3RlcmVkIGFnZW50czogJHtyZWdpc3RlcmVkLmpvaW4oXCIsIFwiKSB8fCBcIm5vbmVcIn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSB0aGUgTWFzdHJhIGV4cHJlc3Mgc3ViLWFwcC4gRXhpc3RzIGFzIGEgbWV0aG9kIChpbnN0ZWFkIG9mIHJlYWRpbmdcbiAgICogYHRoaXMubWFzdHJhQXBwYCB0aHJvdWdoIHRoZSBgYXNVc2VyKHJlcSlgIHByb3h5IGF0IHRoZSBjYWxsIHNpdGUpIHNvIHRoZVxuICAgKiBwcm94eSBiaW5kcyB0aGlzIHBsYWluIG1ldGhvZCAtIHdob3NlIGAuYmluZGAgaXMgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYFxuICAgKiAtIHJhdGhlciB0aGFuIHRoZSBleHByZXNzIGFwcCwgd2hvc2UgYC5iaW5kYCBpcyB0aGUgSFRUUCBCSU5EIHJvdXRlXG4gICAqIHJlZ2lzdHJhciAoc2VlIHRoZSBub3RlIGluIGBpbmplY3RSb3V0ZXNgKS4gUnVucyBpbnNpZGUgdGhlIHVzZXIgc2NvcGUgc29cbiAgICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGUgT0JPIGNsaWVudCBmb3IgdGhlIGFnZW50L21vZGVsXG4gICAqIHJlc29sdmVycy5cbiAgICovXG4gIHByaXZhdGUgZGlzcGF0Y2hNYXN0cmEoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIG5leHQ6IGV4cHJlc3MuTmV4dEZ1bmN0aW9uLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLm1hc3RyYUFwcCEocmVxLCByZXMsIG5leHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcCBhIGNsZWFuLCBtb3VudC1yZWxhdGl2ZSBNQ1AgYWxpYXMgcGF0aCB0byB0aGUgdW5kZXJseWluZ1xuICAgKiBgQG1hc3RyYS9leHByZXNzYCByb3V0ZS4gUmV0dXJucyBgbnVsbGAgd2hlbiBNQ1AgaXMgb2ZmIG9yIHRoZSBwYXRoXG4gICAqIGlzbid0IGFuIGFsaWFzLiBDb2xsYXBzZXMgdGhlIHN0b2NrIGAvbWNwLzxzZXJ2ZXJJZD4vPHRyYW5zcG9ydD5gXG4gICAqIGxheW91dCAoc2VydmVySWQgZGVmYXVsdHMgdG8gdGhlIHBsdWdpbiBuYW1lKSBkb3duIHRvIGAvbWNwYCxcbiAgICogYC9zc2VgLCBhbmQgYC9tZXNzYWdlc2AuXG4gICAqL1xuICBwcml2YXRlIG1jcFJvdXRlQWxpYXMocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm1jcCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaWQgPSB0aGlzLm1jcC5zZXJ2ZXJJZDtcbiAgICBpZiAocGF0aCA9PT0gXCIvbWNwXCIpIHJldHVybiBgL21jcC8ke2lkfS9tY3BgO1xuICAgIGlmIChwYXRoID09PSBcIi9zc2VcIikgcmV0dXJuIGAvbWNwLyR7aWR9L3NzZWA7XG4gICAgaWYgKHBhdGggPT09IFwiL21lc3NhZ2VzXCIpIHJldHVybiBgL21jcC8ke2lkfS9tZXNzYWdlc2A7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYC9zdWdnZXN0aW9uc2Agcm91dGUuIFJ1bnMgaW5zaWRlIHRoZVxuICAgKiBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlXG4gICAqIE9CTy1zY29wZWQgY2xpZW50LiBSZXNvbHZlcyB0aGUgcGx1Z2luJ3MgR2VuaWUgc3BhY2VzIGFuZCBtZXJnZXNcbiAgICogdGhlaXIgY3VyYXRlZCBgc2FtcGxlX3F1ZXN0aW9uc2AgKHNlZSB7QGxpbmsgY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnN9KS5cbiAgICogYG9ubHlgIG5hcnJvd3MgdGhlIGxvb2t1cCB0byB0aGUgZ2l2ZW4gc3BhY2VzICh0aGUgZGlyZWN0IEdlbmllIGNoYXRcbiAgICogcGFzc2VzIGl0cyBvd24pLiBSZXR1cm5zIGBbXWAgd2hlbiBubyBHZW5pZSBzcGFjZSBpcyBjb25maWd1cmVkIHNvIHRoZVxuICAgKiBjbGllbnQgc2hvd3MgYSBiYXJlIGVtcHR5IHN0YXRlIGluc3RlYWQgb2YgYnVpbHQtaW4gZXhhbXBsZSBwcm9tcHRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFN1Z2dlc3Rpb25zKFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgIG9ubHk/OiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPixcbiAgKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8c3RyaW5nW10+PiB7XG4gICAgY29uc3Qgc3BhY2VzID0gb25seSA/PyByZXNvbHZlR2VuaWVTcGFjZXModGhpcy5jb25maWcsIHRoaXMuY29udGV4dCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNwYWNlcykubGVuZ3RoID09PSAwKSByZXR1cm4geyBvazogdHJ1ZSwgZGF0YTogW10gfTtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKGV4ZWN1dGVTaWduYWwpID0+IHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkID0gYXN5bmNVdGlscy5jb21iaW5lQWJvcnRTaWduYWxzKHNpZ25hbCwgZXhlY3V0ZVNpZ25hbCk7XG4gICAgICByZXR1cm4gY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnMoe1xuICAgICAgICBzcGFjZXMsXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgLi4uKGNvbWJpbmVkID8geyBzaWduYWw6IGNvbWJpbmVkIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9LCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYC9yb3V0ZS9mZWVkYmFja2Agcm91dGUuIFJ1bnMgaW5zaWRlIHRoZVxuICAgKiBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlXG4gICAqIE9CTy1zY29wZWQgY2xpZW50IGFuZCB0aGUgYXNzZXNzbWVudCBpcyBhdHRyaWJ1dGVkIHRvIHRoZSBzaWduZWQtaW5cbiAgICogdXNlciAodGhlaXIgZW1haWwgLyBpZCBhcyB0aGUgYXNzZXNzbWVudCBzb3VyY2UpLiBSZXR1cm5zIHRoZVxuICAgKiBjcmVhdGVkIGFzc2Vzc21lbnQgaWQgb24gc3VjY2Vzcywgb3IgYHVuZGVmaW5lZGAgb24gYSBzb2Z0IGZhaWx1cmVcbiAgICogKHNlZSB7QGxpbmsgbG9nRmVlZGJhY2t9IGluIGAuL21sZmxvdy5qc2ApLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2dGZWVkYmFjayhcbiAgICBmZWVkYmFjazogTWFzdHJhRmVlZGJhY2tSZXF1ZXN0LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxzdHJpbmcgfCB1bmRlZmluZWQ+PiB7XG4gICAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgIGNvbnN0IHNvdXJjZUlkID1cbiAgICAgIFwidXNlckVtYWlsXCIgaW4gY3R4ICYmIGN0eC51c2VyRW1haWxcbiAgICAgICAgPyBjdHgudXNlckVtYWlsXG4gICAgICAgIDogXCJ1c2VySWRcIiBpbiBjdHhcbiAgICAgICAgICA/IGN0eC51c2VySWRcbiAgICAgICAgICA6IGN0eC5zZXJ2aWNlVXNlcklkO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICAoKSA9PlxuICAgICAgICBsb2dGZWVkYmFjayhjdHguY2xpZW50LCB7XG4gICAgICAgICAgLi4uZmVlZGJhY2ssXG4gICAgICAgICAgLi4uKHNvdXJjZUlkID8geyBzb3VyY2VJZCB9IDoge30pLFxuICAgICAgICB9KSxcbiAgICAgIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gZXhwZXJpbWVudCBsaW5rIHVuZGVyIHRoZSBhY3RpdmUgcmVxdWVzdCBpZGVudGl0eS4gVGhlIGhlbHBlclxuICAgKiByZXR1cm5zIG5vIFVSTCB1bmxlc3MgdGhlIHZpZXdlciBoYXMgZWZmZWN0aXZlIGBDQU5fTUFOQUdFYCBwZXJtaXNzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE1sZmxvd0V4cGVyaW1lbnRVcmwoKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8c3RyaW5nIHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSgoKSA9PiBtbGZsb3dFeHBlcmltZW50TWFuYWdlclVybChjbGllbnQpLCBmZWVkYmFja1dyaXRlRGVmYXVsdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGBkYXRhYCBlbWJlZCByZXNvbHZlclxuICAgKiAoYEdFVCAvZW1iZWQvZGF0YS86aWRgKS4gUnVucyBpbnNpZGUgdGhlIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc29cbiAgICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2VcbiAgICogY2xpZW50LCB0aGVuIHJldXNlcyB0aGUgc2FtZSBgZmV0Y2hTdGF0ZW1lbnREYXRhYCBwaXBlbGluZVxuICAgKiB0aGUgYGdldF9zdGF0ZW1lbnRgIHRvb2wgcnVucyBzbyB0aGUgTExNIGFuZCB0aGUgVUkgc2VlIHRoZVxuICAgKiBleGFjdCBzYW1lIHNoYXBlIGZvciB0aGUgc2FtZSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIFJlc29sdmVzIHRvIGB1bmRlZmluZWRgIGRhdGEgZm9yIHVwc3RyZWFtIDQwNHMgc28gdGhlIHJvdXRlIGNhbiBtYXAgdGhlbVxuICAgKiB0byBhIGNsZWFuIEhUVFAgNDA0OyBhbnkgb3RoZXIgZmFpbHVyZSBjb21lcyBiYWNrIGFzIGEgbm9uLWBva2AgcmVzdWx0XG4gICAqIGNhcnJ5aW5nIHRoZSBzdGF0dXMgdG8gYW5zd2VyIHdpdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU3RhdGVtZW50KFxuICAgIHN0YXRlbWVudElkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBsaW1pdD86IG51bWJlcjsgc2lnbmFsPzogQWJvcnRTaWduYWwgfSA9IHt9LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxTdGF0ZW1lbnREYXRhIHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihvcHRpb25zLmxpbWl0ID8/IFNUQVRFTUVOVF9ST1dfQ0FQLCBTVEFURU1FTlRfUk9XX0NBUCk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgIGFzeW5jIChleGVjdXRlU2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gYXN5bmNVdGlscy5jb21iaW5lQWJvcnRTaWduYWxzKG9wdGlvbnMuc2lnbmFsLCBleGVjdXRlU2lnbmFsKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGRhdGEsIHZpc3VhbGl6YXRpb24gfSA9IGF3YWl0IGZldGNoU3RhdGVtZW50RW1iZWREYXRhKGNsaWVudCwgc3RhdGVtZW50SWQsIHtcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgLi4uKGNvbWJpbmVkID8geyBzaWduYWw6IGNvbWJpbmVkIH0gOiB7fSksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbHVtbnM6IGRhdGEuY29sdW1ucyxcbiAgICAgICAgICAgIHJvd3M6IGRhdGEucm93cyxcbiAgICAgICAgICAgIHJvd0NvdW50OiBkYXRhLnJvd0NvdW50LFxuICAgICAgICAgICAgdHJ1bmNhdGVkOiBkYXRhLnJvd3MubGVuZ3RoIDwgZGF0YS5yb3dDb3VudCxcbiAgICAgICAgICAgIHZpc3VhbGl6YXRpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gVGhlIERhdGFicmlja3MgU0RLIHRocm93cyBvbiA0MDQ7IHN1cmZhY2UgYXMgYHVuZGVmaW5lZGBcbiAgICAgICAgICAvLyBzbyB0aGUgcm91dGUgbWFwcyB0byBhIGNsZWFuIEhUVFAgNDA0IGluc3RlYWQgb2YgYSA1MDAuXG4gICAgICAgICAgaWYgKGVycm9yVXRpbHMuZXJyb3JDb250ZXh0KGVycikubm90QWNjZXNzaWJsZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAuLi5zdGF0ZW1lbnREYXRhRGVmYXVsdHMuZGVmYXVsdCxcbiAgICAgICAgICAvLyBOYW1lc3BhY2VkIHNvIHRoZSBrZXkgY2FuJ3QgY29sbGlkZSB3aXRoIGFub3RoZXIgY2FjaGUgc2hhcmluZyB0aGVcbiAgICAgICAgICAvLyBtYW5hZ2VyLCBhbmQga2V5ZWQgb24gYGxpbWl0YCBiZWNhdXNlIHRoZSBzbGljZSBpcyBwYXJ0IG9mIHRoZVxuICAgICAgICAgIC8vIHBheWxvYWQuXG4gICAgICAgICAgY2FjaGU6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlbWVudERhdGFEZWZhdWx0cy5kZWZhdWx0LmNhY2hlLFxuICAgICAgICAgICAgY2FjaGVLZXk6IFtTVEFURU1FTlRfQ0FDSEVfTkFNRVNQQUNFLCBzdGF0ZW1lbnRJZCwgbGltaXRdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYGNoYXJ0YCBlbWJlZCByZXNvbHZlclxuICAgKiAoYEdFVCAvZW1iZWQvY2hhcnQvOmlkYCkuIFJ1bnMgaW5zaWRlIHRoZSBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvIHRoZVxuICAgKiBsb29rdXAgaXMgbmFtZXNwYWNlZCB0byB0aGUgY2FsbGluZyBpZGVudGl0eTogYSBjaGFydCBtaW50ZWQgZm9yIGFub3RoZXJcbiAgICogdXNlciBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIHVua25vd24gaWQsIGFuZCB0aGUgcm91dGUgYW5zd2VycyA0MDQuXG4gICAqXG4gICAqIFRoZSBrZXkgaXMgYnVpbHQgZnJvbSB7QGxpbmsgYXR0cmlidXRlZFVzZXJJZH0gLSB0aGUgc2FtZSBydWxlIHRoYXQgbmFtZWRcbiAgICogdGhlIGlkZW50aXR5IHRoZSBjaGFydCB3YXMgd3JpdHRlbiB1bmRlciAtIHJhdGhlciB0aGFuIGZyb20gdGhlIGFtYmllbnRcbiAgICogZXhlY3V0aW9uIGNvbnRleHQgYWxvbmUuIEluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSB0aGUgYW1iaWVudCBjb250ZXh0IGlzXG4gICAqIHRoZSBTUCBmb3IgZXZlcnkgY2FsbGVyLCBzbyBrZXlpbmcgb2ZmIGl0IGFsb25lIG1pc3NlZCBldmVyeSBjaGFydCB0aGVcbiAgICogdHVybiBoYWQgd3JpdHRlbiB1bmRlciB0aGUgZm9yd2FyZGVkIHVzZXIgYW5kIHRoZSBVSSBzaG93ZWQgZWFjaCBvbmUgYXNcbiAgICogZXhwaXJlZC4gYHJlcWAgaXMgcmVhZCBpbnNpZGUgdGhlIG1ldGhvZCwgbm90IGF0IHRoZSBjYWxsIHNpdGUsIHNvIHRoZVxuICAgKiBleGVjdXRpb24gY29udGV4dCBpcyB0aGUgc2NvcGVkIG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDaGFydEVudHJ5KFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIGNoYXJ0SWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IHRpbWVvdXRNcz86IG51bWJlcjsgc2lnbmFsOiBBYm9ydFNpZ25hbCB9LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxDaGFydCB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCB1c2VyS2V5ID0gYXR0cmlidXRlZFVzZXJJZChnZXRFeGVjdXRpb25Db250ZXh0KCksIHJlcXVlc3RVc2VySWQocmVxKSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgIChleGVjdXRlU2lnbmFsKSA9PlxuICAgICAgICBmZXRjaENoYXJ0KGNoYXJ0SWQsIHtcbiAgICAgICAgICB1c2VyS2V5LFxuICAgICAgICAgIC4uLihvcHRpb25zLnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zIH0gOiB7fSksXG4gICAgICAgICAgc2lnbmFsOiBhc3luY1V0aWxzLmNvbWJpbmVBYm9ydFNpZ25hbHMob3B0aW9ucy5zaWduYWwsIGV4ZWN1dGVTaWduYWwpID8/IG9wdGlvbnMuc2lnbmFsLFxuICAgICAgICB9KSxcbiAgICAgIGNoYXJ0RmV0Y2hEZWZhdWx0cyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGAvbW9kZWxzYCByb3V0ZS4gUnVucyBpbnNpZGUgdGhlIEFwcEtpdFxuICAgKiB1c2VyLWNvbnRleHQgcHJveHkgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGUgT0JPLXNjb3BlZFxuICAgKiBjbGllbnQgYW5kIHRoZSBjYXRhbG9ndWUgcmVmbGVjdHMgd2hhdCB0aGUgY2FsbGVyIGNhbiBpbnZva2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxpc3RNb2RlbHNSZXN1bHQoKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPj4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGNvbnRleHQuY2xpZW50O1xuICAgICAgY29uc3QgY2FjaGVJZGVudGl0eSA9IGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoY29udGV4dCk7XG4gICAgICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICAgICAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICAgIHJldHVybiBtb2RlbENhdGFsb2cubGlzdFNlcnZpbmdFbmRwb2ludHMoY2xpZW50LCBob3N0LCB7XG4gICAgICAgIHR0bE1zOiBzZXJ2aW5nLnR0bE1zLFxuICAgICAgICBjYWNoZUlkZW50aXR5LFxuICAgICAgfSk7XG4gICAgfSwgbW9kZWxDYXRhbG9ndWVEZWZhdWx0cyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYGxpc3RNb2RlbHNgIGV4cG9ydC4gVGhlIHByb2dyYW1tYXRpYyBzdXJmYWNlXG4gICAqIGNhcnJpZXMgbm8gc3RhdHVzIGNvZGUsIHNvIGEgZmFpbGVkIGV4ZWN1dGlvbiBiZWNvbWVzIGEgdGhyb3cgd2l0aCBhXG4gICAqIHN0YWJsZSBtZXNzYWdlOyB0aGUgcm91dGVzIGJyYW5jaCBvbiB0aGUge0BsaW5rIEV4ZWN1dGlvblJlc3VsdH0gaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbGlzdE1vZGVscygpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubGlzdE1vZGVsc1Jlc3VsdCgpO1xuICAgIGlmIChyZXN1bHQub2spIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICB0aGlzLmxvZ2dlci53YXJuKFwibGlzdE1vZGVsczplcnJvclwiLCB7XG4gICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKHJlc3VsdC5tZXNzYWdlKSxcbiAgICB9KTtcbiAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRBZ2VudEFuZFNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZW1vcnlQb29sID0gbmVlZHNMYWtlYmFzZSh0aGlzLmNvbmZpZylcbiAgICAgID8gKGxha2ViYXNlUmVzb2x2ZXIuY2FwdHVyZVNlcnZpY2VQcmluY2lwYWxQb29sKFxuICAgICAgICAgIHBsdWdpblJlZ2lzdHJ5LnJlcXVpcmUodGhpcy5jb250ZXh0LCBsYWtlYmFzZSwgdGhpcy5jb25maWcpLmV4cG9ydHMoKS5wb29sLFxuICAgICAgICApIGFzIFBvb2wpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZW1vcnlCdWlsZGVyID0gY3JlYXRlTWVtb3J5QnVpbGRlcih0aGlzLmNvbmZpZywgbWVtb3J5UG9vbCk7XG5cbiAgICAvLyBCdWlsZCBldmVyeSBhZ2VudCBkZWNsYXJlZCBpbiBgY29uZmlnLmFnZW50c2AgKG9yIHRoZSBidWlsdC1pblxuICAgIC8vIGZhbGxiYWNrIHdoZW4gbm9uZSBhcmUgZGVjbGFyZWQpLiBFYWNoIGFnZW50J3MgYG1vZGVsYCByZXNvbHZlc1xuICAgIC8vIHdvcmtzcGFjZSBVUkwgKyBiZWFyZXIgYXQgY2FsbCB0aW1lIHNvIGNvbmN1cnJlbnQgcmVxdWVzdHMgZ2V0XG4gICAgLy8gZGlzdGluY3QgdXNlciBpZGVudGl0aWVzOyB0aGUgYGFzVXNlcihyZXEpYCBzY29wZSBhcm91bmRcbiAgICAvLyBgaGFuZGxlQ2hhdGAgaXMgd2hhdCBsZXRzIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybiB0aGVcbiAgICAvLyByaWdodCB1c2VyIGluc2lkZSB0aGUgcmVzb2x2ZXIuXG4gICAgLy8gTWF0ZXJpYWxpemUgYW55IHJlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIE9OQ0UgYXQgc3RhcnR1cC4gUnVuc1xuICAgIC8vIG91dHNpZGUgYSByZXF1ZXN0IHNjb3BlLCBzbyBpdCB1c2VzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWwncyBjbGllbnRcbiAgICAvLyBhbmQgZGVmYXVsdHMgdG8gdGhlIHNoYXJlZCB3b3Jrc3BhY2UgQXNzaXN0YW50IHNraWxscyB0cmVlOyBhIHNvdXJjZVxuICAgIC8vIGJhY2tlZCBieSBsb2NhbCBvciBtZW1vcnkgc3RvcmFnZSBpcyBjb252ZXJ0ZWQgaW50byBuYXRpdmUgYWdlbnQtbGV2ZWxcbiAgICAvLyBza2lsbHM7IERhdGFicmlja3Mgd29ya3NwYWNlIGRpcmVjdG9yaWVzIHJlbWFpbiBzZWFyY2gtZGlzY292ZXJlZC5cbiAgICBjb25zdCBwcm92aXNpb25lZCA9IGF3YWl0IHByb3Zpc2lvblJlbW90ZVNraWxscyh0aGlzLmNvbmZpZy5yZW1vdGVTa2lsbHMpO1xuICAgIGlmIChwcm92aXNpb25lZC5za2lsbE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJyZW1vdGUgc2tpbGxzIGNvbmZpZ3VyZWRcIiwge1xuICAgICAgICBza2lsbHM6IHByb3Zpc2lvbmVkLnNraWxsTmFtZXMsXG4gICAgICAgIGRhdGFicmlja3NCYXNlUGF0aDogcHJvdmlzaW9uZWQuZGF0YWJyaWNrc0Jhc2VQYXRoLFxuICAgICAgICBsb2NhbFNraWxsTW91bnRzOiBwcm92aXNpb25lZC5sb2NhbFNraWxsTW91bnRzLmxlbmd0aCxcbiAgICAgICAgc3RhbmRhcmRTa2lsbE1vdW50czogcHJvdmlzaW9uZWQuc3RhbmRhcmRTa2lsbE1vdW50cy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhbFNraWxsTW91bnRzID0gW1xuICAgICAgLi4uKHRoaXMuY29uZmlnLmxvY2FsU2tpbGxNb3VudHMgPz8gW10pLFxuICAgICAgLi4ucHJvdmlzaW9uZWQubG9jYWxTa2lsbE1vdW50cyxcbiAgICBdO1xuICAgIGNvbnN0IHN0YW5kYXJkU2tpbGxzID0gYXdhaXQgaW5saW5lU2tpbGxzRnJvbUxvY2FsTW91bnRzKFtcbiAgICAgIC4uLih0aGlzLmNvbmZpZy5sb2NhbFNraWxsTW91bnRzID8/IFtdKSxcbiAgICAgIC4uLnByb3Zpc2lvbmVkLnN0YW5kYXJkU2tpbGxNb3VudHMsXG4gICAgXSk7XG4gICAgdGhpcy5idWlsdCA9IGF3YWl0IGJ1aWxkQWdlbnRzKHtcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsXG4gICAgICBtZW1vcnlCdWlsZGVyLFxuICAgICAgb3V0cHV0UHJvY2Vzc29yRmFjdG9yaWVzOiB0aGlzLm91dHB1dFByb2Nlc3NvckZhY3RvcmllcyxcbiAgICAgIGxvZzogdGhpcy5sb2dnZXIsXG4gICAgICBleHRyYVNraWxsTW91bnRzOiBsb2NhbFNraWxsTW91bnRzLFxuICAgICAgc3RhbmRhcmRTa2lsbHMsXG4gICAgICBleGNsdWRlZFdvcmtzcGFjZVNraWxsTmFtZXM6IHByb3Zpc2lvbmVkLnNraWxsTmFtZXMsXG4gICAgfSk7XG5cbiAgICAvLyBgbWFzdHJhLnNlcnZlci5hcGlSb3V0ZXNgIGlzIG9ubHkgaG9ub3JlZCBieSBNYXN0cmEncyBzdGFuZGFsb25lXG4gICAgLy8gZGV2IHNlcnZlci4gU2luY2Ugd2UncmUgaG9zdGluZyBNYXN0cmEgaW5zaWRlIG91ciBvd24gRXhwcmVzc1xuICAgIC8vIHN1YmFwcCB2aWEgYEBtYXN0cmEvZXhwcmVzc2AsIGN1c3RvbSByb3V0ZXMgbXVzdCBiZSBwYXNzZWQgdG9cbiAgICAvLyB0aGUgYE1hc3RyYVNlcnZlcmAgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgLy9cbiAgICAvLyBgc3RvcmFnZWAgaGVyZSBpcyAqTWFzdHJhLWluc3RhbmNlLWxldmVsKiBhbmQgcGVyc2lzdHMgd29ya2Zsb3dcbiAgICAvLyBzbmFwc2hvdHMgKHdoZXJlIHN1c3BlbmRlZCBgcmVxdWlyZUFwcHJvdmFsYCB0b29sIGNhbGxzIGxpdmUpLlxuICAgIC8vIEl0J3Mgc2VwYXJhdGUgZnJvbSBlYWNoIGFnZW50J3MgYE1lbW9yeS5zdG9yYWdlYCwgd2hpY2ggb25seVxuICAgIC8vIGNvdmVycyB0aHJlYWQgLyBtZXNzYWdlIGhpc3RvcnkuIFdpdGhvdXQgaXQsXG4gICAgLy8gYGFnZW50LnJlc3VtZVN0cmVhbSgpYCBlcnJvcnMgd2l0aCBcImNvdWxkIG5vdCBmaW5kIGEgc3VzcGVuZGVkXG4gICAgLy8gcnVuXCIgYW5kIHRoZSBhcHByb3ZhbCBVSSBoYW5ncyBhZnRlciB0aGUgdXNlciBjbGlja3MgQXBwcm92ZS5cbiAgICBjb25zdCBpbnN0YW5jZVN0b3JhZ2UgPSBtZW1vcnlCdWlsZGVyPy5pbnN0YW5jZVN0b3JhZ2UoKTtcbiAgICAvLyBXaXJlIE1hc3RyYSdzIHRyYWNlciBpbnRvIEFwcEtpdCdzIGdsb2JhbCBPVGVsIHBpcGVsaW5lIHZpYVxuICAgIC8vIGBAbWFzdHJhL290ZWwtYnJpZGdlYC4gTWFzdHJhIHNwYW5zIGJlY29tZSBuYXRpdmUgT1RlbCBzcGFucyBvblxuICAgIC8vIHdoYXRldmVyIHRyYWNlciBwcm92aWRlciBgVGVsZW1ldHJ5TWFuYWdlcmAgcmVnaXN0ZXJlZCBkdXJpbmdcbiAgICAvLyBgY3JlYXRlQXBwYCwgc28gdGhlIE9UTFAgZW5kcG9pbnQgLyBoZWFkZXJzIC8gc2FtcGxpbmcgYXJlXG4gICAgLy8gZW52LWRyaXZlbiBhbmQgc2hhcmVkIHdpdGggZXZlcnkgb3RoZXIgQXBwS2l0IHBsdWdpbi5cbiAgICBjb25zdCBvYnNlcnZhYmlsaXR5ID0gYXdhaXQgYnVpbGRPYnNlcnZhYmlsaXR5KHtcbiAgICAgIHNlcnZpY2VOYW1lOiB0aGlzLm5hbWUsXG4gICAgICBlbmFibGVkOiB0aGlzLmNvbmZpZy5vYnNlcnZhYmlsaXR5LFxuICAgICAgdHJhY2VyUHJvdmlkZXI6IGF3YWl0IGFwcGtpdFRlbGVtZXRyeS5kZWZlcnJlZE5hdGl2ZVRyYWNlclByb3ZpZGVyKCksXG4gICAgfSk7XG4gICAgLy8gT3B0aW9uYWwgTUNQIGV4cG9zdXJlOiBidWlsZCBhIE1hc3RyYSBNQ1Agc2VydmVyIGZyb20gdGhlXG4gICAgLy8gcmVnaXN0ZXJlZCBhZ2VudHMgKGFuZCwgb3B0LWluLCB0aGUgYW1iaWVudCB0b29scykgYW5kIHJlZ2lzdGVyXG4gICAgLy8gaXQgb24gdGhlIE1hc3RyYSBpbnN0YW5jZS4gYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVzIHRoZSBzdG9jayBNQ1BcbiAgICAvLyB0cmFuc3BvcnQgcm91dGVzIChgL21jcC88c2VydmVySWQ+Ly4uLmApIG9mZiBgbWNwU2VydmVyc2AsIHNvIHRoZVxuICAgIC8vIGNhdGNoLWFsbCBkaXNwYXRjaCBiZWxvdyBhbHJlYWR5IHJvdXRlcyBNQ1AgcmVxdWVzdHMgdW5kZXIgT0JPIC1cbiAgICAvLyBubyBiZXNwb2tlIHJvdXRlIG5lZWRlZC4gU2VlIGAuL21jcC5qc2AuXG4gICAgdGhpcy5tY3AgPSBidWlsZE1jcFNlcnZlcih7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgcGx1Z2luTmFtZTogdGhpcy5uYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IE1hc3RyYVBsdWdpbi5tYW5pZmVzdC5kaXNwbGF5TmFtZSxcbiAgICAgIGFnZW50czogdGhpcy5idWlsdC5hZ2VudHMsXG4gICAgICBhbWJpZW50VG9vbHM6IHRoaXMuYnVpbHQuYW1iaWVudFRvb2xzLFxuICAgIH0pO1xuICAgIHRoaXMubWFzdHJhID0gbmV3IE1hc3RyYSh7XG4gICAgICBhZ2VudHM6IHRoaXMuYnVpbHQuYWdlbnRzLFxuICAgICAgLi4uKGluc3RhbmNlU3RvcmFnZSA/IHsgc3RvcmFnZTogaW5zdGFuY2VTdG9yYWdlIH0gOiB7fSksXG4gICAgICAuLi4ob2JzZXJ2YWJpbGl0eSA/IHsgb2JzZXJ2YWJpbGl0eSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMubWNwID8geyBtY3BTZXJ2ZXJzOiB7IFt0aGlzLm1jcC5zZXJ2ZXJJZF06IHRoaXMubWNwLnNlcnZlciB9IH0gOiB7fSksXG4gICAgfSk7XG4gICAgdGhpcy5tYXN0cmFBcHAgPSBleHByZXNzKCk7XG4gICAgYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUodGhpcy5tYXN0cmFBcHApO1xuICAgIC8vIFN0YW1wIGNoYXQgcmVxdWVzdC9yZXNwb25zZSBvbnRvIHRoZSBIVFRQIHJvb3Qgc3BhbiBzbyBNTGZsb3cnc1xuICAgIC8vIFVDIGAqX3RyYWNlX3VuaWZpZWRgIHZpZXcgY2FuIHN1cmZhY2UgdGhlbSAoTWFzdHJhJ3Mgb3duXG4gICAgLy8gYG1hc3RyYS5hZ2VudF9ydW4uKmAgYXR0cmlidXRlcyBzaXQgb24gYSBjaGlsZCBzcGFuIHRoZSB2aWV3XG4gICAgLy8gbmV2ZXIgcmVhZHMpLiBNdXN0IHJ1biBiZWZvcmUgYE1hc3RyYVNlcnZlci5pbml0YCBzbyB0aGUgbGF5ZXJcbiAgICAvLyBzaXRzIGFoZWFkIG9mIHRoZSBhZ2VudCByb3V0ZXMuXG4gICAgYXR0YWNoQ2hhdFR1cm5UZWxlbWV0cnkodGhpcy5tYXN0cmFBcHAsIHtcbiAgICAgIGlkZW50aXR5OiAocmVxdWVzdCkgPT5cbiAgICAgICAgdXNlU2VydmljZVByaW5jaXBhbCh0aGlzLmlkZW50aXR5TW9kZSwgcmVxdWVzdCkgPyBcInNlcnZpY2UtcHJpbmNpcGFsXCIgOiBcIm9ib1wiLFxuICAgIH0pO1xuICAgIHRoaXMubWFzdHJhU2VydmVyID0gbmV3IE1hc3RyYVNlcnZlcih0aGlzLmNvbmZpZywge1xuICAgICAgYXBwOiB0aGlzLm1hc3RyYUFwcCxcbiAgICAgIG1hc3RyYTogdGhpcy5tYXN0cmEsXG4gICAgICBwcmVmaXg6IFwiXCIsXG4gICAgICBjdXN0b21BcGlSb3V0ZXM6IGFnZW50Q2hhdFJvdXRlcygpLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMubWFzdHJhU2VydmVyLmluaXQoKTtcbiAgICBhdHRhY2hTdGFsZVJlc3VtZVJlY292ZXJ5KHRoaXMubWFzdHJhQXBwKTtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgYWdlbnRzOiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0LmFnZW50cyksXG4gICAgICBkZWZhdWx0QWdlbnQ6IHRoaXMuYnVpbHQuZGVmYXVsdEFnZW50SWQsXG4gICAgICBiYWNrZ3JvdW5kVHVybnM6IHRoaXMuY29uZmlnLmJhY2tncm91bmRUdXJucyAhPT0gZmFsc2UsXG4gICAgICBhcGlBY2Nlc3M6IHRoaXMuY29uZmlnLmFwaUFjY2VzcyA/PyBcInNjb3BlZFwiLFxuICAgICAgbWNwOiB0aGlzLm1jcCA/IGAke3RoaXMuYmFzZVBhdGh9JHt0aGlzLm1jcC5odHRwUGF0aH1gIDogXCJvZmZcIixcbiAgICAgIGxha2ViYXNlOiBtZW1vcnlQb29sICE9PSB1bmRlZmluZWQsXG4gICAgICBmZWVkYmFjazogdGhpcy5mZWVkYmFja0VuYWJsZWQoKSxcbiAgICAgIG9ic2VydmFiaWxpdHk6IG9ic2VydmFiaWxpdHkgIT09IHVuZGVmaW5lZCA/IFwibWxmbG93XCIgOiBcIm9mZlwiLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXIgZm9yIG9uZSBlbWJlZCBgPHR5cGU+YCBiZWhpbmQgdGhlIGdlbmVyaWNcbiAqIGBHRVQgL2VtYmVkLzp0eXBlLzppZGAgcm91dGUuIFJldHVybnMgdGhlIEpTT04gYm9keSB0byBzZW5kIG9uXG4gKiBzdWNjZXNzLCBvciBgdW5kZWZpbmVkYCB0byBzaWduYWwgYSA0MDQgKHVua25vd24gLyBleHBpcmVkIGlkKS5cbiAqIGBzaWduYWxgIGFib3J0cyB3aGVuIHRoZSBjbGllbnQgZGlzY29ubmVjdHMgc28gbG9uZy1wb2xsaW5nXG4gKiByZXNvbHZlcnMgKGUuZy4gYGNoYXJ0YCkgdW5ibG9jayBpbW1lZGlhdGVseS5cbiAqL1xudHlwZSBFbWJlZFJlc29sdmVyID0gKFxuICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgaWQ6IHN0cmluZyxcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbikgPT4gUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8dW5rbm93bj4+O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBvcHRpb25hbCBgP3RpbWVvdXRNcz08bj5gIHF1ZXJ5IHBhcmFtZXRlciBmcm9tIGFcbiAqIGBHRVQgL2VtYmVkL2NoYXJ0LzppZGAgcmVxdWVzdC4gQWNjZXB0cyBhIHBvc2l0aXZlIGludGVnZXIgdXBcbiAqIHRvIHtAbGluayBNQVhfRU1CRURfUE9MTF9USU1FT1VUX01TfSAoY2xhbXBlZCkgYW5kIHJlamVjdHMgZXZlcnl0aGluZyBlbHNlXG4gKiBhcyBgdW5kZWZpbmVkYCBzbyB7QGxpbmsgZmV0Y2hDaGFydH0gZmFsbHMgYmFjayB0byBpdHMgZGVmYXVsdC5cbiAqIEV4cHJlc3MgcHJvZHVjZXMgYHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkYDsgd2Ugbm9ybWFsaXplXG4gKiB0byB0aGUgZmlyc3Qgc2NhbGFyIGJlZm9yZSBwYXJzaW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZVRpbWVvdXRNcyhyYXc6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB2ID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICBpZiAodHlwZW9mIHYgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG4gPSBvYmplY3QudG9OdW1iZXIodik7XG4gIGlmIChuID09PSB1bmRlZmluZWQgfHwgbiA8PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5mbG9vcihuKSwgTUFYX0VNQkVEX1BPTExfVElNRU9VVF9NUyk7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIG9wdGlvbmFsIGA/bGltaXQ9PG4+YCBxdWVyeSBwYXJhbWV0ZXIgZnJvbSBhXG4gKiBgR0VUIC9lbWJlZC9kYXRhLzppZGAgcmVxdWVzdC4gQWNjZXB0cyBhIG5vbi1uZWdhdGl2ZVxuICogaW50ZWdlciBhbmQgbGV0cyB0aGUgcm91dGUgY2xhbXAgdG8gYFNUQVRFTUVOVF9ST1dfQ0FQYDtcbiAqIHJlamVjdHMgYW55dGhpbmcgZWxzZSBhcyBgdW5kZWZpbmVkYCBzbyB0aGUgcm91dGUgZmFsbHMgYmFja1xuICogdG8gdGhlIHNlcnZlci1zaWRlIGNhcC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnRMaW1pdChyYXc6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB2ID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICBpZiAodHlwZW9mIHYgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG4gPSBvYmplY3QudG9OdW1iZXIodik7XG4gIGlmIChuID09PSB1bmRlZmluZWQgfHwgbiA8IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBNYXRoLmZsb29yKG4pO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBNYXN0cmEgcGx1Z2luIG9uIGFuIEFwcEtpdCBhcHAuIE1vdW50cyB0aGUgYWdlbnRzLCB0aGVcbiAqIGAvcm91dGUvKmAgY2hhdCBzdXJmYWNlLCBhbmQgKHVubGVzcyBkaXNhYmxlZCkgdGhlIE1DUCB0cmFuc3BvcnQgdW5kZXJcbiAqIGAvYXBpL21hc3RyYWAuXG4gKlxuICogQGV4YW1wbGUgTWluaW1hbCBhcHBcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBtYXN0cmEgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogLy8gTm8gYGFnZW50c2A6IGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IGlzIHJlZ2lzdGVyZWQsIHNvIHRoZVxuICogLy8gY2hhdCBlbmRwb2ludCB3b3JrcyBvdXQgb2YgdGhlIGJveC5cbiAqIGNvbnN0IGFwcCA9IGF3YWl0IGNyZWF0ZUFwcCh7IHBsdWdpbnM6IFttYXN0cmEoKV0gfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBUd28gYWdlbnRzLCBhIHBpbm5lZCBtb2RlbCwgYW5kIEdlbmllXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBsYWtlYmFzZSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGNyZWF0ZUFnZW50LCBtYXN0cmEgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIGxha2ViYXNlKCksXG4gKiAgICAgbWFzdHJhKHtcbiAqICAgICAgIGRlZmF1bHRNb2RlbDogXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCIsXG4gKiAgICAgICBkZWZhdWx0QWdlbnQ6IFwiYW5hbHlzdFwiLFxuICogICAgICAgZ2VuaWVTcGFjZXM6IHsgc2FsZXM6IHsgc3BhY2VJZDogXCIwMWVmLi4uXCIsIGhpbnQ6IFwib3JkZXJzLCByZXR1cm5zXCIgfSB9LFxuICogICAgICAgYWdlbnRzOiB7XG4gKiAgICAgICAgIGFuYWx5c3Q6IGNyZWF0ZUFnZW50KHtcbiAqICAgICAgICAgICBpbnN0cnVjdGlvbnM6IFwiWW91IGFuc3dlciBxdWVzdGlvbnMgYWJvdXQgc2FsZXMuXCIsXG4gKiAgICAgICAgICAgYXN5bmMgdG9vbHMocGx1Z2lucykge1xuICogICAgICAgICAgICAgcmV0dXJuIHsgLi4uKGF3YWl0IHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKSkgfTtcbiAqICAgICAgICAgICB9LFxuICogICAgICAgICB9KSxcbiAqICAgICAgICAgaGVscGVyOiBjcmVhdGVBZ2VudCh7IGluc3RydWN0aW9uczogXCJZb3UgZXhwbGFpbiB0aGUgYW5hbHlzdCdzIGFuc3dlcnMuXCIgfSksXG4gKiAgICAgICB9LFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IG1hc3RyYSA9IHRvUGx1Z2luKE1hc3RyYVBsdWdpbik7XG4iXX0=
|
|
1355
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQ0wsY0FBYyxFQUNkLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEdBS1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFNBQVMsSUFBSSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRixPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEdBS0wsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTlELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNuRCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFHOUIsT0FBTyxFQUNMLFdBQVcsRUFDWCxpQkFBaUIsR0FHbEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVks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Q0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDNUMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDNUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEdBQVk7SUFDdkMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDNUMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDNUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHBsdWdpbiB0aGF0IGJ1aWxkcyBvbmUgb3IgbW9yZSBNYXN0cmEgYEFnZW50YCBpbnN0YW5jZXMgYW5kXG4gKiBtb3VudHMgdGhlIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlci4gQ2xpZW50cyBkcml2ZSB0aGUgY29udmVyc2F0aW9uXG4gKiBvdmVyIHRoZSBzdGFuZGFyZCBNYXN0cmEgYWdlbnQgc3RyZWFtIChgQG1hc3RyYS9jbGllbnQtanNgJ3NcbiAqIGBnZXRBZ2VudChpZCkuc3RyZWFtKClgKSwgc28gdGhlcmUncyBubyBiZXNwb2tlIGNoYXQgdHJhbnNwb3J0IHRvXG4gKiBrZWVwIGluIHN5bmMuXG4gKlxuICogLSBBZ2VudHM6IHJlZ2lzdGVyZWQgdGhyb3VnaCBgY29uZmlnLmFnZW50c2AgYXQgcGx1Z2luIGNyZWF0aW9uXG4gKiAgICh7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufSkuIEVhY2ggZW50cnkncyBgdG9vbHNgIGZpZWxkIGFjY2VwdHNcbiAqICAgZWl0aGVyIGEgcGxhaW4gcmVjb3JkIG9yIGEgYChwbHVnaW5zKSA9PiB0b29sc2AgY2FsbGJhY2sgdGhhdCBnZXRzXG4gKiAgIGEgdHlwZWQgc2libGluZy1wbHVnaW4gaW5kZXggKHtAbGluayBNYXN0cmFQbHVnaW5zfSkuIE9taXRcbiAqICAgYGNvbmZpZy5hZ2VudHNgIHRvIGdldCBhIHNpbmdsZSBidWlsdC1pbiBgZGVmYXVsdGAgYW5hbHlzdC5cbiAqIC0gTW9kZWw6IGVhY2ggYWdlbnQgY2FsbCByZXNvbHZlcyBhIGBNYXN0cmFNb2RlbENvbmZpZ2AgdmlhXG4gKiAgIHtAbGluayBidWlsZE1vZGVsfSBmcm9tIGAuL21vZGVsLmpzYC4gUGVyLWFnZW50IGBtb2RlbGAgb3ZlcnJpZGVzXG4gKiAgIChgQWdlbnRDb25maWdbXCJtb2RlbFwiXWAgb3IgYSBgbW9kZWxJZGAgc3RyaW5nKSBmbG93IHRocm91Z2hcbiAqICAge0BsaW5rIGJ1aWxkQWdlbnRzfS5cbiAqIC0gTWVtb3J5IC8gc3RvcmFnZTogcGVyLWFnZW50LCBidWlsdCBieSB7QGxpbmsgY3JlYXRlTWVtb3J5QnVpbGRlcn1cbiAqICAgZnJvbSBgLi9tZW1vcnkuanNgLiBCb3RoIGF1dG8tZGVmYXVsdCB0byBgdHJ1ZWAgd2hlbiB0aGVcbiAqICAgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZCAodW5sZXNzIHRoZSBjYWxsZXIgcGFzc2VkXG4gKiAgIGBmYWxzZWAgb3IgYSBjdXN0b20gY29uZmlnKS4gU3RvcmFnZSBuYW1lc3BhY2VzIHBlciBhZ2VudCB2aWFcbiAqICAge0BsaW5rIGFnZW50U3RvcmFnZVNjaGVtYU5hbWV9IHBlciBhZ2VudDsgdGhlIHZlY3RvciBzdG9yZSBpcyBhIHNpbmdsZVxuICogICBzaGFyZWQgc2luZ2xldG9uIGFjcm9zcyBldmVyeSBhZ2VudC5cbiAqIC0gU2VydmVyOiB0aGUgRXhwcmVzcyBzdWJhcHAgd2lyaW5nIGxpdmVzIGluIGAuL3NlcnZlci5qc2AuXG4gKiAtIEhUVFA6IEFwcEtpdCBtb3VudHMgdGhpcyBwbHVnaW4gdW5kZXIgYC9hcGkvbWFzdHJhYC4gQWxvbmdzaWRlIHRoZVxuICogICBNYXN0cmEgYWdlbnQgcm91dGVzLCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBgL3JvdXRlL2hpc3RvcnlgXG4gKiAgIChsb2FkICsgY2xlYXIgYSB0aHJlYWQncyBtZXNzYWdlcyksIGAvcm91dGUvdGhyZWFkc2AgKGxpc3QgdGhlXG4gKiAgIGNhbGxlcidzIGNvbnZlcnNhdGlvbnMgKyBkZWxldGUgb25lKSwgYC9tb2RlbHNgLCBgL2RlZmF1bHQtbW9kZWxgLFxuICogICBgL3N1Z2dlc3Rpb25zYCwgYC9yb3V0ZS9mZWVkYmFja2AgKGxvZyBhIHRodW1icyAvIGNvbW1lbnQgdG8gTUxmbG93XG4gKiAgIHdoZW4gZmVlZGJhY2sgaXMgZW5hYmxlZCksIGFuZCB0aGUgZ2VuZXJpYyBgL2VtYmVkLzp0eXBlLzppZGBcbiAqICAgcmVzb2x2ZXIgZm9yIGlubGluZSBjaGFydCAvIGRhdGEgbWFya2Vycy4gRWFjaCBpcyByZWdpc3RlcmVkIHRocm91Z2hcbiAqICAgQXBwS2l0J3MgYHJvdXRlKClgIHNvIGl0IGxhbmRzIGluIHRoZSBwbHVnaW4ncyBlbmRwb2ludCBtYXAsIGFuZFxuICogICBldmVyeSBvdXRib3VuZCBjYWxsIG9uZSBtYWtlcyBydW5zIHRocm91Z2ggYGV4ZWN1dGUoKWAgKHNlZVxuICogICBgLi9kZWZhdWx0cy5qc2ApLiBUaGUgc3RvY2sgYEBtYXN0cmEvZXhwcmVzc2Agc3VyZmFjZSBpcyBnYXRlZFxuICogICBieSBgY29uZmlnLmFwaUFjY2Vzc2AgKGRlZmF1bHQgYFwic2NvcGVkXCJgKTogb25seSBhZ2VudCBpbmZlcmVuY2UsXG4gKiAgIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhlIGAvcm91dGUvKmAgcm91dGVzLCBhbmQgKHdoZW4gZW5hYmxlZClcbiAqICAgTUNQIGFyZSBkaXNwYXRjaGVkIHRvIE1hc3RyYTsgYWRtaW4gLyBtdXRhdGluZyAvIGJ1bGstZXhwb3J0IHJvdXRlc1xuICogICBhcmUgcmVmdXNlZCB3aXRoIGA0MDNgLiBTZWUge0BsaW5rIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWR9LlxuICogLSBNQ1A6IG9wdCBpbiB3aXRoIGBjb25maWcubWNwYCB0byBleHBvc2UgdGhlIGFnZW50cyAoYW5kIG9wdGlvbmFsbHlcbiAqICAgdG9vbHMpIGFzIGEgTWFzdHJhIGBNQ1BTZXJ2ZXJgLiBJdCBpcyByZWdpc3RlcmVkIG9uIHRoZSBgTWFzdHJhYFxuICogICBpbnN0YW5jZSB2aWEgYG1jcFNlcnZlcnNgLCBzbyBgQG1hc3RyYS9leHByZXNzYCBzZXJ2ZXMgdGhlIHN0b2NrXG4gKiAgIE1DUCB0cmFuc3BvcnQgcm91dGVzIChgL21jcC88c2VydmVySWQ+Ly4uLmApIHVuZGVyIHRoZSBtb3VudC4gU2VlXG4gKiAgIGAuL21jcC5qc2AuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIEV4ZWN1dGlvbkVycm9yLFxuICBnZW5pZSxcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbiAgbGFrZWJhc2UsXG4gIFBsdWdpbixcbiAgdG9QbHVnaW4sXG4gIHR5cGUgRXhlY3V0aW9uUmVzdWx0LFxuICB0eXBlIElBcHBSb3V0ZXIsXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG4gIHR5cGUgUmVzb3VyY2VSZXF1aXJlbWVudCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbGFrZWJhc2VSZXNvbHZlciwgcGx1Z2luUmVnaXN0cnksIHRlbGVtZXRyeSBhcyBhcHBraXRUZWxlbWV0cnkgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IHNlbmRHZW5pZU1lc3NhZ2VGZWVkYmFjayB9IGZyb20gXCJAZGJ4LXRvb2xzL2dlbmllL2ZlZWRiYWNrXCI7XG5pbXBvcnQgeyBtb2RlbENhdGFsb2cgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgYXN5bmNVdGlscywgZXJyb3JVdGlscywgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIGZlZWRiYWNrLFxuICByb3V0ZXMsXG4gIHdpcmUsXG4gIHR5cGUgQ2hhcnQsXG4gIHR5cGUgR2VuaWVDaGF0UmVxdWVzdCxcbiAgdHlwZSBNYXN0cmFDbGllbnRDb25maWcsXG4gIHR5cGUgU3RhdGVtZW50RGF0YSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgZGlzcGxheSwgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyB3b3JrZmxvd1JvdXRlIH0gZnJvbSBcIkBtYXN0cmEvYWktc2RrXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgTWFzdHJhIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9tYXN0cmFcIjtcbmltcG9ydCB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgQW55V29ya2Zsb3cgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtmbG93c1wiO1xuaW1wb3J0IHsgcGlwZVVJTWVzc2FnZVN0cmVhbVRvUmVzcG9uc2UgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgdHlwZSB7IFBvb2wgfSBmcm9tIFwicGdcIjtcblxuaW1wb3J0IHtcbiAgYnVpbGRBZ2VudHMsXG4gIEZBTExCQUNLX0FHRU5UX0lELFxuICB0eXBlIEJ1aWx0QWdlbnRzLFxuICB0eXBlIE1hc3RyYU91dHB1dFByb2Nlc3NvckZhY3RvcnksXG59IGZyb20gXCIuL2FnZW50cy50c1wiO1xuaW1wb3J0IHsgZmV0Y2hDaGFydCB9IGZyb20gXCIuL2NoYXJ0LnRzXCI7XG5pbXBvcnQgeyBhZ2VudENoYXRSb3V0ZXMgfSBmcm9tIFwiLi9jaGF0LnRzXCI7XG5pbXBvcnQge1xuICBhdHRyaWJ1dGVkVXNlcklkLFxuICBleGVjdXRpb25Db250ZXh0VXNlcklkLFxuICBNQVNUUkFfQ09ORklHX1NDSEVNQSxcbiAgdHlwZSBNYXN0cmFQbHVnaW5Db25maWcsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgY2hhcnRGZXRjaERlZmF1bHRzLFxuICBmZWVkYmFja1dyaXRlRGVmYXVsdHMsXG4gIGdlbmllQ29udmVyc2F0aW9uUmVhZERlZmF1bHRzLFxuICBnZW5pZUNvbnZlcnNhdGlvbldyaXRlRGVmYXVsdHMsXG4gIGdlbmllU3VnZ2VzdGlvbkRlZmF1bHRzLFxuICBtb2RlbENhdGFsb2d1ZURlZmF1bHRzLFxuICBzdGF0ZW1lbnREYXRhRGVmYXVsdHMsXG59IGZyb20gXCIuL2RlZmF1bHRzLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRmVlZGJhY2tNb2RlIH0gZnJvbSBcIi4vZmVlZGJhY2stbW9kZS50c1wiO1xuaW1wb3J0IHtcbiAgZGVsZXRlR2VuaWVUaHJlYWQsXG4gIGRlbGV0ZUdlbmllVGhyZWFkTWVzc2FnZSxcbiAgZ2VuaWVDaGF0U3RyZWFtLFxuICBsaXN0R2VuaWVUaHJlYWRNZXNzYWdlcyxcbiAgbGlzdEdlbmllVGhyZWFkcyxcbiAgdHlwZSBHZW5pZUNoYXRTcGFjZSxcbn0gZnJvbSBcIi4vZ2VuaWUtY2hhdC50c1wiO1xuaW1wb3J0IHsgY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnMsIHJlc29sdmVHZW5pZVNwYWNlcywgdHlwZSBHZW5pZVNwYWNlQ29uZmlnIH0gZnJvbSBcIi4vZ2VuaWUudHNcIjtcbmltcG9ydCB7XG4gIHJlcXVlc3RVc2VySWQsXG4gIHJlc29sdmVJZGVudGl0eU1vZGUsXG4gIHVzZVNlcnZpY2VQcmluY2lwYWwsXG4gIHR5cGUgTWFzdHJhSWRlbnRpdHlNb2RlLFxufSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHsgYnVpbGRNY3BTZXJ2ZXIsIHR5cGUgUmVzb2x2ZWRNY3AgfSBmcm9tIFwiLi9tY3AudHNcIjtcbmltcG9ydCB7IGNyZWF0ZU1lbW9yeUJ1aWxkZXIsIG5lZWRzTGFrZWJhc2UgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcbmltcG9ydCB7XG4gIGZsdXNoRGlyZWN0TWxmbG93VHJhY2luZyxcbiAgbG9nRmVlZGJhY2ssXG4gIG1sZmxvd0VuYWJsZWQsXG4gIG1sZmxvd0V4cGVyaW1lbnRNYW5hZ2VyVXJsLFxufSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcbmltcG9ydCB7IHJlc29sdmVEZWZhdWx0TW9kZWxJZCB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5pbXBvcnQgeyBidWlsZE9ic2VydmFiaWxpdHksIGNvbmZpZ3VyZU90ZWxQcm9wYWdhdGlvbiB9IGZyb20gXCIuL29ic2VydmFiaWxpdHkudHNcIjtcbmltcG9ydCB7IHByb3Zpc2lvblJlbW90ZVNraWxscyB9IGZyb20gXCIuL3JlbW90ZS1za2lsbHMudHNcIjtcbmltcG9ydCB7XG4gIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlLFxuICBhdHRhY2hTdGFsZVJlc3VtZVJlY292ZXJ5LFxuICBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dCxcbiAgY3JlYXRlUmVxdWVzdENvbnRleHQsXG4gIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQsXG4gIE1hc3RyYVNlcnZlcixcbiAgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIsXG59IGZyb20gXCIuL3NlcnZlci50c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZVNlcnZpbmdDb25maWcgfSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyBmZXRjaFN0YXRlbWVudEVtYmVkRGF0YSwgU1RBVEVNRU5UX1JPV19DQVAgfSBmcm9tIFwiLi9zdGF0ZW1lbnQudHNcIjtcbmltcG9ydCB7IGF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5LCByZWdpc3RlckFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvciB9IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuaW1wb3J0IHsgaW52YWxpZEZpZWxkcyB9IGZyb20gXCIuL3ZhbGlkYXRpb24udHNcIjtcbmltcG9ydCB7IGlubGluZVNraWxsc0Zyb21Mb2NhbE1vdW50cyB9IGZyb20gXCIuL3dvcmtzcGFjZXMudHNcIjtcblxuY29uc3QgR0VOSUVfTUFOSUZFU1QgPSBwbHVnaW5SZWdpc3RyeS5kYXRhKGdlbmllKS5wbHVnaW4ubWFuaWZlc3Q7XG5jb25zdCBMQUtFQkFTRV9NQU5JRkVTVCA9IHBsdWdpblJlZ2lzdHJ5LmRhdGEobGFrZWJhc2UpLnBsdWdpbi5tYW5pZmVzdDtcblxuLyoqIENlaWxpbmcgb24gdGhlIGA/dGltZW91dE1zPWAgbG9uZy1wb2xsIGJ1ZGdldCBhIGNsaWVudCBtYXkgcmVxdWVzdC4gKi9cbmNvbnN0IE1BWF9FTUJFRF9QT0xMX1RJTUVPVVRfTVMgPSA1ICogNjBfMDAwO1xuXG4vKiogU3RhYmxlIGNsaWVudCBtZXNzYWdlIHdoZW4gdGhlIHdvcmtzcGFjZSdzIG1vZGVsIGNhdGFsb2d1ZSBjYW4ndCBiZSByZWFkLiAqL1xuY29uc3QgTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFID0gXCJDb3VsZCBub3QgcmVhZCB0aGUgd29ya3NwYWNlJ3MgbW9kZWwgY2F0YWxvZ3VlXCI7XG5cbi8qKiBTdGFibGUgY2xpZW50IG1lc3NhZ2UgZm9yIGEgZmVlZGJhY2sgYm9keSB0aGF0IGZhaWxzIHNjaGVtYSB2YWxpZGF0aW9uLiAqL1xuY29uc3QgSU5WQUxJRF9GRUVEQkFDS19NRVNTQUdFID0gXCJJbnZhbGlkIGZlZWRiYWNrIHJlcXVlc3RcIjtcblxuLyoqIENhY2hlIG5hbWVzcGFjZSBmb3Igc3RhdGVtZW50IHJlc3VsdCBzZXRzLCBtYXRjaGluZyB0aGUgY2hhcnQgY2FjaGUncyBmb3JtLiAqL1xuY29uc3QgU1RBVEVNRU5UX0NBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOnN0YXRlbWVudFwiO1xuXG4vKipcbiAqIEFwcEtpdCBwbHVnaW4gKHJlZ2lzdGVyZWQgbmFtZTogYG1hc3RyYWApIHRoYXQgaG9zdHMgTWFzdHJhIGFnZW50c1xuICogd2l0aCBvcHRpb25hbCBMYWtlYmFzZS1iYWNrZWQgbWVtb3J5IGFuZCBBSSBTREsgY2hhdCByb3V0ZXMgdW5kZXJcbiAqIHRoZSBwbHVnaW4gbW91bnQgKHR5cGljYWxseSBgL2FwaS9tYXN0cmFgKS5cbiAqXG4gKiBAZXhhbXBsZSBSZWdpc3RlciB0aGUgcGx1Z2luXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBsYWtlYmFzZSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGNyZWF0ZUFnZW50LCBtYXN0cmEgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogLy8gYGxha2ViYXNlYCBmaXJzdDogcmVnaXN0ZXJpbmcgaXQgYXV0by1lbmFibGVzIE1hc3RyYSBzdG9yYWdlICsgbWVtb3J5LlxuICogY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIGxha2ViYXNlKCksXG4gKiAgICAgbWFzdHJhKHtcbiAqICAgICAgIGdlbmllU3BhY2VzOiB7IGRlZmF1bHQ6IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQhIH0sXG4gKiAgICAgICBhZ2VudHM6IGNyZWF0ZUFnZW50KHtcbiAqICAgICAgICAgbmFtZTogXCJhbmFseXN0XCIsXG4gKiAgICAgICAgIGluc3RydWN0aW9uczogXCJZb3UgYW5zd2VyIHF1ZXN0aW9ucyBhYm91dCByZXZlbnVlIGFuZCByZXR1cm5zLlwiLFxuICogICAgICAgICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgICAgICAgcmV0dXJuIHsgLi4uKGF3YWl0IHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKSkgfTtcbiAqICAgICAgICAgfSxcbiAqICAgICAgIH0pLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBSZWFkIHRoZSBhZ2VudHMgYmFjayBvZmYgdGhlIEFwcEtpdCBpbnN0YW5jZVxuICogYGBgdHNcbiAqIGNvbnN0IGFnZW50SWRzID0gYXBwLm1hc3RyYS5saXN0KCk7XG4gKiBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBhcHAubWFzdHJhLmxpc3RNb2RlbHMoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTWFzdHJhUGx1Z2luIGV4dGVuZHMgUGx1Z2luPE1hc3RyYVBsdWdpbkNvbmZpZz4ge1xuICAvLyBBbm5vdGF0ZWQgcmF0aGVyIHRoYW4gbGVmdCB0byBgc2F0aXNmaWVzYDogdGhlIGNvbmZpZyBzY2hlbWEncyB0eXBlIGNvbWVzXG4gIC8vIGZyb20gYEB0eXBlcy9qc29uLXNjaGVtYWAsIHdoaWNoIHRoaXMgcGFja2FnZSBkb2VzIG5vdCBkZXBlbmQgb24sIHNvIGFuXG4gIC8vIGluZmVycmVkIG1hbmlmZXN0IHR5cGUgY2Fubm90IGJlIG5hbWVkIGluIHRoZSBlbWl0dGVkIGRlY2xhcmF0aW9uLiBUaGVcbiAgLy8gYFBsdWdpbk1hbmlmZXN0PFwibWFzdHJhXCI+YCBwYXJhbWV0ZXIgc3RpbGwgY2FycmllcyB0aGUgbGl0ZXJhbCBuYW1lIGludG9cbiAgLy8gYHRvUGx1Z2luKClgJ3MgZmFjdG9yeSB0eXBlLlxuICBzdGF0aWMgbWFuaWZlc3Q6IFBsdWdpbk1hbmlmZXN0PFwibWFzdHJhXCI+ID0ge1xuICAgIG5hbWU6IFwibWFzdHJhXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiTWFzdHJhXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkJ1aWxkcyBhIE1hc3RyYSBBZ2VudCB3aXRoIHVzZXItc2NvcGVkIHdvcmtzcGFjZSBhdXRoIChhc1VzZXIpIFwiICtcbiAgICAgIFwiYW5kIG9wdGlvbmFsIFBvc3RncmVzLWJhY2tlZCBNYXN0cmEgTWVtb3J5IHZpYSB0aGUgYGxha2ViYXNlYCBwbHVnaW4uXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHJlcXVpcmVkOiBbXSxcbiAgICAgIG9wdGlvbmFsOiBbXG4gICAgICAgIC8vIFJldXNlIHRoZSBHZW5pZSBzcGFjZS1pZCBiaW5kaW5nIGRlY2xhcmVkIGJ5IEFwcEtpdCdzIGBnZW5pZWBcbiAgICAgICAgLy8gbWFuaWZlc3Qgc28gdGhlIHJlc291cmNlLWJpbmRpbmcgc2hhcGUgaXMgaWRlbnRpY2FsIHRvIEFwcEtpdCdzIGFuZFxuICAgICAgICAvLyBhbiBleGlzdGluZyBgYXBwLnlhbWxgIC8gYGdlbmllKHsgc3BhY2VzIH0pYCB3aXJpbmcga2VlcHMgd29ya2luZy5cbiAgICAgICAgLy8gVGhlIGJ1aWx0LWluIEdlbmllIHRvb2xzIHRhbGsgdG8gR2VuaWUgZGlyZWN0bHkgdGhyb3VnaFxuICAgICAgICAvLyBgQGRieC10b29scy9nZW5pZWAsIHNvIG9ubHkgdGhlIGJpbmRpbmcgaXMgc2hhcmVkLCBub3QgdGhlIHBsdWdpbidzXG4gICAgICAgIC8vIHRvb2xzLlxuICAgICAgICAuLi5HRU5JRV9NQU5JRkVTVC5yZXNvdXJjZXMucmVxdWlyZWQsXG4gICAgICAgIC4uLkxBS0VCQVNFX01BTklGRVNULnJlc291cmNlcy5yZXF1aXJlZCxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBNQVNUUkFfQ09ORklHX1NDSEVNQSB9LFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaWdodGVuIHJlc291cmNlIHJlcXVpcmVtZW50cyBiYXNlZCBvbiB3aGljaCBmZWF0dXJlcyBhcmUgZW5hYmxlZC5cbiAgICogQXBwS2l0IGNhbGxzIHRoaXMgYXQgcmVnaXN0cmF0aW9uIHRpbWUgKGNvbmZpZy1hd2FyZSkgc28gZGlzYWJsZWRcbiAgICogZmVhdHVyZXMgZG9uJ3Qgc3VyZmFjZSB0aGVpciByZXNvdXJjZSBhc2tzIHRvIHRoZSBob3N0IGFwcC5cbiAgICovXG4gIHN0YXRpYyBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IFJlc291cmNlUmVxdWlyZW1lbnRbXSB7XG4gICAgY29uc3QgcmVzb3VyY2VzOiBSZXNvdXJjZVJlcXVpcmVtZW50W10gPSBbXTtcbiAgICBjb25zdCBlbmFibGVkTWFuaWZlc3RzOiBQbHVnaW5NYW5pZmVzdDxzdHJpbmc+W10gPSBbXTtcblxuICAgIGlmIChuZWVkc0xha2ViYXNlKGNvbmZpZykpIHtcbiAgICAgIGVuYWJsZWRNYW5pZmVzdHMucHVzaChMQUtFQkFTRV9NQU5JRkVTVCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbSBvZiBlbmFibGVkTWFuaWZlc3RzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIG0ucmVzb3VyY2VzLnJlcXVpcmVkKSB7XG4gICAgICAgIHJlc291cmNlcy5wdXNoKHsgLi4ucmVzb3VyY2UsIHJlcXVpcmVkOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzb3VyY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dnZXIgPSBsb2cubG9nZ2VyKHRoaXMpO1xuICBwcml2YXRlIGJ1aWx0OiBCdWlsdEFnZW50cyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1hc3RyYTogTWFzdHJhIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWFzdHJhQXBwOiBleHByZXNzLkV4cHJlc3MgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYXN0cmFTZXJ2ZXI6IE1hc3RyYVNlcnZlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG91dHB1dFByb2Nlc3NvckZhY3RvcmllczogTWFzdHJhT3V0cHV0UHJvY2Vzc29yRmFjdG9yeVtdID0gW107XG4gIC8qKiBDb2RlLWRlZmluZWQgd29ya2Zsb3dzIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBNYXN0cmEgaW5zdGFuY2UgaXMgYnVpbHQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2Zsb3dzOiBSZWNvcmQ8c3RyaW5nLCBBbnlXb3JrZmxvdz4gPSB7XG4gICAgLi4uKHRoaXMuY29uZmlnLndvcmtmbG93cyA/PyB7fSksXG4gIH07XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwgTUNQIHNlcnZlciBleHBvc2luZyB0aGlzIHBsdWdpbidzIGFnZW50cyAvIHRvb2xzLCBvclxuICAgKiBgbnVsbGAgd2hlbiBgY29uZmlnLm1jcGAgaXMgZGlzYWJsZWQgKHRoZSBkZWZhdWx0KS4gQnVpbHQgaW5cbiAgICoge0BsaW5rIGJ1aWxkQWdlbnRBbmRTZXJ2ZXJ9IGFuZCByZWdpc3RlcmVkIG9uIHRoZSBNYXN0cmEgaW5zdGFuY2UuXG4gICAqL1xuICBwcml2YXRlIG1jcDogUmVzb2x2ZWRNY3AgfCBudWxsID0gbnVsbDtcbiAgLyoqIFJlc29sdmVkIGZlZWRiYWNrIGRlc3RpbmF0aW9uIHB1Ymxpc2hlZCB0byBzZXJ2ZXIgYW5kIGJyb3dzZXIgY2xpZW50cy4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlZEZlZWRiYWNrTW9kZTogZmVlZGJhY2suRmVlZGJhY2tNb2RlID0gXCJub25lXCI7XG4gIC8qKlxuICAgKiBSZXNvbHZlZCB7QGxpbmsgTWFzdHJhSWRlbnRpdHlNb2RlfTogdGhlIGlkZW50aXR5IHRoZSBjaGF0IHBhdGgncyBEYXRhYnJpY2tzXG4gICAqIGNhbGxzIHJ1biBhcy4gUmVhZCBvbmNlIGF0IHNldHVwIHNvIGFuIGludmFsaWQgYGdlbmllSWRlbnRpdHlgIGZhaWxzIHRoZSBhcHBcbiAgICogYm9vdCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgcmVxdWVzdCwgYW5kIHNvIGV2ZXJ5IHJlcXVlc3QgYWdyZWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBpZGVudGl0eU1vZGU6IE1hc3RyYUlkZW50aXR5TW9kZSA9IFwidXNlclwiO1xuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBSZXNvbHZlIHRoZSBpZGVudGl0eSBtb2RlIHVwIGZyb250IHNvIGFuIGludmFsaWQgYGdlbmllSWRlbnRpdHlgIGZhaWxzIHRoZVxuICAgIC8vIGFwcCBib290IHdpdGggYSBjbGVhciBtZXNzYWdlIHJhdGhlciB0aGFuIDUwMC1pbmcgdGhlIGZpcnN0IGNoYXQgcmVxdWVzdC5cbiAgICB0aGlzLmlkZW50aXR5TW9kZSA9IHJlc29sdmVJZGVudGl0eU1vZGUodGhpcy5jb25maWcuZ2VuaWVJZGVudGl0eSk7XG4gICAgY29uc3Qgc3BhY2VzID0gcmVzb2x2ZUdlbmllU3BhY2VzKHRoaXMuY29uZmlnLCB0aGlzLmNvbnRleHQpO1xuICAgIHRoaXMucmVzb2x2ZWRGZWVkYmFja01vZGUgPSByZXNvbHZlRmVlZGJhY2tNb2RlKHRoaXMuY29uZmlnLmZlZWRiYWNrTW9kZSwge1xuICAgICAgZ2VuaWU6IHRoaXMuY29uZmlnLmdlbmllQWdlbnRNb2RlICE9PSBmYWxzZSAmJiBPYmplY3Qua2V5cyhzcGFjZXMpLmxlbmd0aCA+IDAsXG4gICAgICBtbGZsb3c6IG1sZmxvd0VuYWJsZWQoKSxcbiAgICB9KTtcbiAgICB0aGlzLmNvbmZpZy5mZWVkYmFja01vZGUgPSB0aGlzLnJlc29sdmVkRmVlZGJhY2tNb2RlO1xuICAgIGlmICh0aGlzLmNvbmZpZy5vYnNlcnZhYmlsaXR5ICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgcmVnaXN0ZXJBcHBNbGZsb3dUcmFjZUluZm9Qcm9jZXNzb3IoKTtcbiAgICB9XG4gICAgLy8gV2FpdCB1bnRpbCBzaWJsaW5nIHBsdWdpbnMgKGUuZy4gYGxha2ViYXNlYCkgZmluaXNoIGBzZXR1cCgpYCBzb1xuICAgIC8vIHRoZSBsYWtlYmFzZSBwb29sIGlzIHZhbGlkIHdoZW4gc3RvcmFnZS9tZW1vcnkgYXJlIGVuYWJsZWQuXG4gICAgdGhpcy5jb250ZXh0Py5vbkxpZmVjeWNsZShcInNldHVwOmNvbXBsZXRlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbmZpZ3VyZU90ZWxQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5hcHBseUxha2ViYXNlQXV0b0RlZmF1bHRzKCk7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkQWdlbnRBbmRTZXJ2ZXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGluc3RhbmNlIGFnZW50LWJhY2tlZCBEYXRhYnJpY2tzIGNhbGxzIHNob3VsZCBydW4gdGhyb3VnaCBmb3JcbiAgICogYHJlcWAsIGhvbm9yaW5nIHtAbGluayBpZGVudGl0eU1vZGV9LiBEaXJlY3QgR2VuaWUgY29udmVyc2F0aW9uIHJvdXRlcyB1c2VcbiAgICogQXBwS2l0IE9CTyB0aHJvdWdoIGBhc1VzZXIocmVxKWAgaW5zdGVhZC5cbiAgICpcbiAgICogSW4gYFwidXNlclwiYCBtb2RlICh0aGUgZGVmYXVsdCkgdGhpcyBpcyBgdGhpcy5hc1VzZXIocmVxKWAgLSBBcHBLaXQncyBvd25cbiAgICogcHJveHkgdGhhdCBydW5zIGV2ZXJ5IGNhbGwgaW5zaWRlIGBydW5JblVzZXJDb250ZXh0YCwgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWBcbiAgICogcmV0dXJucyB0aGUgY2FsbGVyJ3MgT0JPIGNsaWVudC4gSW4gYFwic2VydmljZS1wcmluY2lwYWxcImAgbW9kZSBpdCBpcyBgdGhpc2BcbiAgICogdW53cmFwcGVkLCBzbyB0aGUgc2FtZSBtZXRob2RzIHJ1biBpbiB0aGUgYW1iaWVudCBzZXJ2aWNlIGNvbnRleHQgYW5kXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCdzIGNsaWVudCAtIHRoZSBzYW1lXG4gICAqIFwianVzdCBkb24ndCBlbnRlciBgYXNVc2VyYFwiIHBhdHRlcm4gQXBwS2l0J3Mgb3duIHNlcnZpY2UtY29udGV4dCBjYWxscyB1c2UuIE9uZVxuICAgKiBoZWxwZXIgY292ZXJzIHRoZSBhZ2VudC1iYWNrZWQgd29ya3NwYWNlIGNhbGxzIChzZXJ2aW5nIGNhdGFsb2d1ZSwgZ2VuZXJhbFxuICAgKiBzdWdnZXN0aW9ucywgZGlzcGF0Y2hlZCBgYXNrX2dlbmllYCwgc3RhdGVtZW50IGZldGNoLCBmZWVkYmFjayksIHNvIHRoZVxuICAgKiBpZGVudGl0eSBkZWNpc2lvbiBsaXZlcyBpbiBvbmUgcGxhY2UuXG4gICAqL1xuICBwcml2YXRlIHNjb3BlZFNlbGYocmVxOiBleHByZXNzLlJlcXVlc3QpOiB0aGlzIHtcbiAgICByZXR1cm4gdXNlU2VydmljZVByaW5jaXBhbCh0aGlzLmlkZW50aXR5TW9kZSwgcmVxKSA/IHRoaXMgOiB0aGlzLmFzVXNlcihyZXEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIGBsYWtlYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQsIGF1dG8tZW5hYmxlIGBzdG9yYWdlYFxuICAgKiBhbmQgYG1lbW9yeWAgdW5sZXNzIHRoZSBjYWxsZXIgb3B0ZWQgb3V0IGV4cGxpY2l0bHkgKGBmYWxzZWAgb3IgYVxuICAgKiBjdXN0b20gY29uZmlnIG9iamVjdCkuIFJ1biBhZnRlciBgc2V0dXA6Y29tcGxldGVgIHNvIHRoZSBsb29rdXBcbiAgICogaXMgcmVsaWFibGU6IGFueSBwbHVnaW4gdGhhdCByZWdpc3RlcnMgaXRzZWxmIHN5bmNocm9ub3VzbHkgaXNcbiAgICogYWxyZWFkeSBpbiB0aGUgcmVnaXN0cnkgYnkgdGhlIHRpbWUgdGhpcyBmaXJlcy5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlMYWtlYmFzZUF1dG9EZWZhdWx0cygpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNMYWtlYmFzZSA9IHBsdWdpblJlZ2lzdHJ5Lmluc3RhbmNlKHRoaXMuY29udGV4dCwgbGFrZWJhc2UpICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKCFoYXNMYWtlYmFzZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmNvbmZpZy5zdG9yYWdlID09PSB1bmRlZmluZWQpIHRoaXMuY29uZmlnLnN0b3JhZ2UgPSB0cnVlO1xuICAgIGlmICh0aGlzLmNvbmZpZy5tZW1vcnkgPT09IHVuZGVmaW5lZCkgdGhpcy5jb25maWcubWVtb3J5ID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBGbHVzaCBwZW5kaW5nIGRpcmVjdCBNTGZsb3cgdHJhY2VzIGR1cmluZyBncmFjZWZ1bCBzaHV0ZG93bi4gKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZsdXNoRGlyZWN0TWxmbG93VHJhY2luZygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcImVycm9yIGZsdXNoaW5nIGRpcmVjdCBNTGZsb3cgdHJhY2VzXCIsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0IGluLWZsaWdodCB3b3JrIGFuZCBzdGFydCB0aGUgYXN5bmNocm9ub3VzIHRyYWNlIGZsdXNoLlxuICAgKi9cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHZvaWQgdGhpcy5zaHV0ZG93bigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZXhwb3J0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBJZHMgb2YgZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCBpbiByZWdpc3RyYXRpb24gb3JkZXIuIE1hdGNoZXNcbiAgICAgICAqIEFwcEtpdCBgYWdlbnRzLmxpc3QoKWAgc28gY2FsbGVycyBjYW4gaXRlcmF0ZSB0aGUgcmVnaXN0cnkgdGhlXG4gICAgICAgKiBzYW1lIHdheSB1bmRlciBib3RoIHBsdWdpbnMuXG4gICAgICAgKi9cbiAgICAgIGxpc3Q6ICgpOiBzdHJpbmdbXSA9PiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pLFxuICAgICAgLyoqXG4gICAgICAgKiBMb29rIHVwIGEgcmVnaXN0ZXJlZCBhZ2VudCBieSBpZC4gUmV0dXJucyBgbnVsbGAgKG5vdFxuICAgICAgICogdW5kZWZpbmVkKSB3aGVuIHVua25vd24gc28gY2FsbCBzaXRlcyBjYW4gZWFybHktcmV0dXJuIHdpdGhvdXRcbiAgICAgICAqIGEgc2VwYXJhdGUgYGluYCBjaGVjay5cbiAgICAgICAqL1xuICAgICAgZ2V0OiAoaWQ6IHN0cmluZyk6IEFnZW50IHwgbnVsbCA9PiB0aGlzLmJ1aWx0Py5hZ2VudHNbaWRdID8/IG51bGwsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhZ2VudCB0aGUgY2xpZW50IGNvbnZlcnNlcyB3aXRoIHdoZW4gaXQgZG9lc24ndCBuYW1lIG9uZS5cbiAgICAgICAqIFJlc29sdmVzIHRvIGBjb25maWcuZGVmYXVsdEFnZW50YCwgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgaWQsIG9yXG4gICAgICAgKiB0aGUgYnVpbHQtaW4gYGRlZmF1bHRgIGZhbGxiYWNrLlxuICAgICAgICovXG4gICAgICBnZXREZWZhdWx0OiAoKTogQWdlbnQgfCBudWxsID0+XG4gICAgICAgICh0aGlzLmJ1aWx0ICYmIHRoaXMuYnVpbHQuYWdlbnRzW3RoaXMuYnVpbHQuZGVmYXVsdEFnZW50SWRdKSA/PyBudWxsLFxuICAgICAgLyoqXG4gICAgICAgKiBSZWdpc3RlciBhbiBvdXRwdXQtcHJvY2Vzc29yIGZhY3RvcnkgYmVmb3JlIGFnZW50cyBhcmUgYnVpbHQuXG4gICAgICAgKlxuICAgICAgICogRGVmZXJyZWQgc2libGluZyBwbHVnaW5zIHVzZSB0aGlzIGdlbmVyaWMgZXh0ZW5zaW9uIHBvaW50IHdpdGhvdXRcbiAgICAgICAqIGFkZGluZyBwcm92aWRlci1zcGVjaWZpYyBiZWhhdmlvciB0byB0aGUgTWFzdHJhIHBsdWdpbi5cbiAgICAgICAqL1xuICAgICAgcmVnaXN0ZXJPdXRwdXRQcm9jZXNzb3I6IChmYWN0b3J5OiBNYXN0cmFPdXRwdXRQcm9jZXNzb3JGYWN0b3J5KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmJ1aWx0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWFzdHJhIG91dHB1dCBwcm9jZXNzb3JzIG11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgYWdlbnRzIGFyZSBidWlsdFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dFByb2Nlc3NvckZhY3Rvcmllcy5wdXNoKGZhY3RvcnkpO1xuICAgICAgfSxcbiAgICAgIC8qKiBSZWdpc3RlciBhIHdvcmtmbG93IGJlZm9yZSB0aGUgaG9zdGVkIE1hc3RyYSBpbnN0YW5jZSBpcyBidWlsdC4gKi9cbiAgICAgIHJlZ2lzdGVyV29ya2Zsb3c6IChrZXk6IHN0cmluZywgd29ya2Zsb3c6IEFueVdvcmtmbG93KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLm1hc3RyYSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1hc3RyYSB3b3JrZmxvd3MgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSB0aGUgaW5zdGFuY2UgaXMgYnVpbHRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMud29ya2Zsb3dzW2tleV0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hc3RyYSB3b3JrZmxvdyBrZXkgXCIke2tleX1cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndvcmtmbG93c1trZXldID0gd29ya2Zsb3c7XG4gICAgICB9LFxuICAgICAgLyoqIFJlZ2lzdGVyZWQgd29ya2Zsb3cga2V5cyBpbiBpbnNlcnRpb24gb3JkZXIuICovXG4gICAgICBsaXN0V29ya2Zsb3dzOiAoKTogc3RyaW5nW10gPT4gT2JqZWN0LmtleXModGhpcy53b3JrZmxvd3MpLFxuICAgICAgLyoqIFVuZGVybHlpbmcgTWFzdHJhIGluc3RhbmNlIGZvciBhZHZhbmNlZCB1c2UgKGN1c3RvbSByb3V0ZXMgZXRjLikuICovXG4gICAgICBnZXRNYXN0cmE6ICgpID0+IHRoaXMubWFzdHJhLFxuICAgICAgLyoqXG4gICAgICAgKiBCdWlsZCB0aGUgYFJlcXVlc3RDb250ZXh0YCBhbiBhZ2VudCB0dXJuIGRyaXZlbiBmcm9tIE9VVFNJREUgdGhpc1xuICAgICAgICogcGx1Z2luJ3Mgcm91dGVzIG5lZWRzIChhIFRlYW1zIGFjdGl2aXR5IG9uIGFub3RoZXIgcGx1Z2luJ3MgZW5kcG9pbnQsIGFcbiAgICAgICAqIHNjaGVkdWxlZCBqb2IpLlxuICAgICAgICpcbiAgICAgICAqIE1hc3RyYSdzIHVzZXItc2NvcGVkIHRvb2xzIC0gYGFza19nZW5pZWAgbW9zdCB2aXNpYmx5IC0gcmVhZCB0aGUgQXBwS2l0XG4gICAgICAgKiB1c2VyIG9mZiB0aGUgcmVxdWVzdCBjb250ZXh0LCB3aGljaCBvbmx5IHRoZSBIVFRQIG1pZGRsZXdhcmUgc3RhbXBzLlxuICAgICAgICogQ2FsbGluZyBgYWdlbnQuZ2VuZXJhdGVgIHdpdGggYSByYXcgcHJvbXB0IHRoZXJlZm9yZSBhbnN3ZXJzIFwidGhlIGRhdGFcbiAgICAgICAqIHNvdXJjZSBpcyB1bnJlYWNoYWJsZVwiIHdoZXJlIHRoZSBjaGF0IHJvdXRlcyBhbnN3ZXIgd2l0aCByZWFsIGRhdGEuXG4gICAgICAgKiBQYXNzaW5nIHRoaXMgYXMgYHJlcXVlc3RDb250ZXh0YCBjbG9zZXMgdGhhdCBnYXAsIHNvIGFuIG91dC1vZi1iYW5kIHR1cm5cbiAgICAgICAqIGhhcyBleGFjdGx5IHRoZSBjYXBhYmlsaXRpZXMgYSBjaGF0IHR1cm4gaGFzLlxuICAgICAgICpcbiAgICAgICAqIE11c3QgYmUgY2FsbGVkIElOU0lERSBhbiBgYXNVc2VyKHJlcSlgIHNjb3BlIHRvIGluaGVyaXQgdGhlIGNhbGxlcidzXG4gICAgICAgKiBPQk8gaWRlbnRpdHk7IG91dHNpZGUgb25lIGl0IHJlc29sdmVzIHRvIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC5cbiAgICAgICAqL1xuICAgICAgY3JlYXRlUmVxdWVzdENvbnRleHQ6IChcbiAgICAgICAgb3B0aW9uczogeyB0aHJlYWRJZD86IHN0cmluZzsgcmVzb3VyY2VJZD86IHN0cmluZzsgcmVxdWVzdElkPzogc3RyaW5nIH0gPSB7fSxcbiAgICAgICk6IFByb21pc2U8UmVxdWVzdENvbnRleHQ+ID0+IGNyZWF0ZVJlcXVlc3RDb250ZXh0KG9wdGlvbnMpLFxuICAgICAgLyoqXG4gICAgICAgKiBNQ1AgZW5kcG9pbnQgaW5mbyB3aGVuIGBjb25maWcubWNwYCBpcyBlbmFibGVkLCBlbHNlIGBudWxsYC5cbiAgICAgICAqIFN0cmVhbWFibGUgSFRUUCBpcyBgaHR0cGA7IHRoZSBTU0UgcGFpciBpcyB0aGUgbGVnYWN5IHRyYW5zcG9ydC5cbiAgICAgICAqXG4gICAgICAgKiBFYWNoIHBhdGggaXMgZ2l2ZW4gdHdpY2U6IG1vdW50LXJlbGF0aXZlIChgaHR0cFBhdGhgLCBgc3NlUGF0aGAsXG4gICAgICAgKiBgbWVzc2FnZVBhdGhgKSBmb3IgYW55dGhpbmcgdGhhdCBhbHJlYWR5IGtub3dzIHdoZXJlIHRoZSBwbHVnaW4gaXNcbiAgICAgICAqIG1vdW50ZWQsIGFuZCBhYnNvbHV0ZSAoYGh0dHBgLCBgc3NlYCwgYG1lc3NhZ2VzYCkgZm9yIE1DUCBjbGllbnRzLFxuICAgICAgICogd2hpY2ggdGFrZSBhIHNpbmdsZSBVUkwgYW5kIGNhbm5vdCBjb21wb3NlIG9uZS4gVGhlIGFic29sdXRlIGZvcm0gaXNcbiAgICAgICAqIGJ1aWx0IGZyb20ge0BsaW5rIGJhc2VQYXRofSwgc28gaXQgaG9ub3JzIGEgYGNvbmZpZy5uYW1lYCBvdmVycmlkZSBidXRcbiAgICAgICAqIHN0aWxsIGFzc3VtZXMgQXBwS2l0J3MgZGVmYXVsdCBgL2FwaS88bmFtZT5gIG1vdW50LlxuICAgICAgICovXG4gICAgICBnZXRNY3A6ICgpOiB7XG4gICAgICAgIHNlcnZlcklkOiBzdHJpbmc7XG4gICAgICAgIGh0dHBQYXRoOiBzdHJpbmc7XG4gICAgICAgIHNzZVBhdGg6IHN0cmluZztcbiAgICAgICAgbWVzc2FnZVBhdGg6IHN0cmluZztcbiAgICAgICAgaHR0cDogc3RyaW5nO1xuICAgICAgICBzc2U6IHN0cmluZztcbiAgICAgICAgbWVzc2FnZXM6IHN0cmluZztcbiAgICAgIH0gfCBudWxsID0+XG4gICAgICAgIHRoaXMubWNwXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHNlcnZlcklkOiB0aGlzLm1jcC5zZXJ2ZXJJZCxcbiAgICAgICAgICAgICAgaHR0cFBhdGg6IHRoaXMubWNwLmh0dHBQYXRoLFxuICAgICAgICAgICAgICBzc2VQYXRoOiB0aGlzLm1jcC5zc2VQYXRoLFxuICAgICAgICAgICAgICBtZXNzYWdlUGF0aDogdGhpcy5tY3AubWVzc2FnZVBhdGgsXG4gICAgICAgICAgICAgIGh0dHA6IGAke3RoaXMuYmFzZVBhdGh9JHt0aGlzLm1jcC5odHRwUGF0aH1gLFxuICAgICAgICAgICAgICBzc2U6IGAke3RoaXMuYmFzZVBhdGh9JHt0aGlzLm1jcC5zc2VQYXRofWAsXG4gICAgICAgICAgICAgIG1lc3NhZ2VzOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3AubWVzc2FnZVBhdGh9YCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IG51bGwsXG4gICAgICAvKiogRXhwcmVzcyBzdWJhcHAgTWFzdHJhIGlzIG1vdW50ZWQgb247IG1vc3RseSBmb3IgdGVzdHMuICovXG4gICAgICBnZXRNYXN0cmFTZXJ2ZXI6ICgpID0+IHRoaXMubWFzdHJhU2VydmVyLFxuICAgICAgLyoqXG4gICAgICAgKiBGZXRjaCB0aGUgd29ya3NwYWNlJ3MgTW9kZWwgU2VydmluZyBlbmRwb2ludHMgKGNhY2hlZCkuIFNhbWVcbiAgICAgICAqIHBheWxvYWQgdGhlIGBHRVQgL21vZGVsc2Agcm91dGUgcmV0dXJuczsgc3VyZmFjZWQgaGVyZSBzb1xuICAgICAgICogb3RoZXIgcGx1Z2lucyAvIHNjcmlwdHMgY2FuIGludHJvc3BlY3QgdGhlIGNhdGFsb2d1ZSB3aXRob3V0XG4gICAgICAgKiBhbiBIVFRQIHJvdW5kLXRyaXAuIEFwcEtpdCB3cmFwcyB0aGlzIHdpdGggYGFzVXNlcihyZXEpYCBmb3JcbiAgICAgICAqIE9CTyBzY29waW5nIGF1dG9tYXRpY2FsbHkuIFRocm93cyB3aGVuIHRoZSBsaXN0aW5nIGZhaWxzLCBzaW5jZVxuICAgICAgICogdGhlcmUgaXMgbm8gc3RhdHVzIGNvZGUgdG8gaGFuZCBiYWNrIG9uIHRoaXMgc3VyZmFjZS5cbiAgICAgICAqL1xuICAgICAgbGlzdE1vZGVsczogKCk6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiA9PiB0aGlzLmxpc3RNb2RlbHMoKSxcbiAgICAgIC8qKlxuICAgICAgICogRm9yY2UtZXZpY3QgY2FjaGVkIGVuZHBvaW50IGxpc3RpbmdzIHZpYSBBcHBLaXQnc1xuICAgICAgICogYENhY2hlTWFuYWdlcmAuIFVzZWZ1bCBpbiB0ZXN0cyBvciByaWdodCBhZnRlciBhbiBhZG1pblxuICAgICAgICogZGVwbG95cyBhIG5ldyBlbmRwb2ludCBhbmQgZG9lc24ndCB3YW50IHRvIHdhaXQgZm9yIHRoZSBUVEwuXG4gICAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGBDYWNoZU1hbmFnZXIuZGVsZXRlYC9gY2xlYXJgIHByb21pc2UuXG4gICAgICAgKi9cbiAgICAgIGNsZWFyTW9kZWxzQ2FjaGU6IChob3N0Pzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgICAgICBtb2RlbENhdGFsb2cuY2xlYXJTZXJ2aW5nRW5kcG9pbnRzQ2FjaGUoaG9zdCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBtb3VudCB0aGlzIHBsdWdpbidzIHJvdXRlcyBhbnN3ZXIgb24uIEFwcEtpdCBtb3VudHMgZXZlcnkgcGx1Z2luXG4gICAqIGF0IGAvYXBpLzxwbHVnaW4ubmFtZT5gIGFuZCBgdGhpcy5uYW1lYCBob25vcnMgYSBgY29uZmlnLm5hbWVgIG92ZXJyaWRlLFxuICAgKiBzbyB0aGUgcGVyLXJvdXRlIHNlZ21lbnRzIChgcm91dGVzLk1BU1RSQV9ST1VURVNgKSBoYW5nIG9mZiB0aGlzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgYmFzZVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC9hcGkvJHt0aGlzLm5hbWV9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsaWVudENvbmZpZygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgLy8gUHVibGlzaGluZyBgYmFzZVBhdGhgIGlzIGVub3VnaCBmb3IgdGhlIGNsaWVudCB0byBzdGF5IGNvcnJlY3QgdW5kZXIgYVxuICAgIC8vIGN1c3RvbSBtb3VudCBpZDogdGhlIHBlci1yb3V0ZSBzZWdtZW50cyBhcmUgZml4ZWRcbiAgICAvLyAoYHJvdXRlcy5NQVNUUkFfUk9VVEVTYCkgYW5kIHRoZSBjbGllbnQgKGBNYXN0cmFQbHVnaW5DbGllbnRgKSBkZXJpdmVzXG4gICAgLy8gZXZlcnkgZW5kcG9pbnQgZnJvbSBgYmFzZVBhdGhgLlxuICAgIC8vIFJldHVybiB3aWRlbnMgdG8gYFJlY29yZDxzdHJpbmcsIHVua25vd24+YCB0byBzYXRpc2Z5IHRoZVxuICAgIC8vIGJhc2UtY2xhc3Mgc2lnbmF0dXJlOyBjb25zdW1lcnMgcmVhZCBpdCB0aHJvdWdoIHRoZSB0eXBlZFxuICAgIC8vIGBNYXN0cmFDbGllbnRDb25maWdgIHNoYXBlIHZpYSBgdXNlUGx1Z2luQ2xpZW50Q29uZmlnPC4uLj4oLi4uKWAuXG4gICAgY29uc3QgY29uZmlnOiBNYXN0cmFDbGllbnRDb25maWcgPSB7XG4gICAgICBiYXNlUGF0aDogdGhpcy5iYXNlUGF0aCxcbiAgICAgIGRlZmF1bHRBZ2VudDogdGhpcy5idWlsdD8uZGVmYXVsdEFnZW50SWQgPz8gRkFMTEJBQ0tfQUdFTlRfSUQsXG4gICAgICBhZ2VudHM6IE9iamVjdC5rZXlzKHRoaXMuYnVpbHQ/LmFnZW50cyA/PyB7fSksXG4gICAgICBmZWVkYmFja01vZGU6IHRoaXMuZmVlZGJhY2tNb2RlKCksXG4gICAgICBiYWNrZ3JvdW5kVHVybnM6IHRoaXMuY29uZmlnLmJhY2tncm91bmRUdXJucyAhPT0gZmFsc2UsXG4gICAgICAvLyBJbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgdGhlIGNoYXQgd29ya3MgZm9yIGFueSBjYWxsZXIgd2hvIGNhbiBvcGVuXG4gICAgICAvLyB0aGUgYXBwLCBzbyBhIFVJIHRoYXQgaGlkZXMgY2hhdCBiZWhpbmQgYW4gT0JPLXRva2VuIHByb2JlIHNob3VsZCBzaG93XG4gICAgICAvLyBpdCByZWdhcmRsZXNzLiBgXCJ1c2VyXCJgIG1vZGUga2VlcHMgdGhlIE9CTy1nYXRlZCBiZWhhdmlvci5cbiAgICAgIGNoYXRBbHdheXNBdmFpbGFibGU6IHRoaXMuaWRlbnRpdHlNb2RlID09PSBcInNlcnZpY2UtcHJpbmNpcGFsXCIsXG4gICAgfTtcbiAgICByZXR1cm4gY29uZmlnIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICAvKiogUmVzb2x2ZSB0aGUgb25seSBmZWVkYmFjayBkZXN0aW5hdGlvbiBleHBvc2VkIGZvciB0aGlzIHBsdWdpbiBtb2RlLiAqL1xuICBwcml2YXRlIGZlZWRiYWNrTW9kZSgpOiBmZWVkYmFjay5GZWVkYmFja01vZGUge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkRmVlZGJhY2tNb2RlO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5qZWN0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNY3BSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW9kZWxSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyRW1iZWRSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyU3VnZ2VzdGlvblJvdXRlcyhyb3V0ZXIpO1xuICAgIHRoaXMucmVnaXN0ZXJHZW5pZUNoYXRSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyRmVlZGJhY2tSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyTWxmbG93RXhwZXJpbWVudFJvdXRlKHJvdXRlcik7XG4gICAgdGhpcy5yZWdpc3RlckFnZW50Um91dGVzKHJvdXRlcik7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgVVJMIGFsaWFzZXMgZm9yIE1hc3RyYSdzIE1DUCB0cmFuc3BvcnRzLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyTWNwUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIEV4cG9zZSB0aGUgTUNQIHRyYW5zcG9ydCBhdCB0aGUgY2xlYW4gYC9tY3BgIChwbHVzIHRoZSBsZWdhY3lcbiAgICAvLyBgL3NzZWAgKyBgL21lc3NhZ2VzYCkgdW5kZXIgdGhlIHBsdWdpbiBtb3VudC4gYEBtYXN0cmEvZXhwcmVzc2BcbiAgICAvLyBtb3VudHMgTUNQIHVuZGVyIGAvbWNwLzxzZXJ2ZXJJZD4vPHRyYW5zcG9ydD5gLCBhbmQgdGhlIHNlcnZlcklkXG4gICAgLy8gZGVmYXVsdHMgdG8gdGhlIHBsdWdpbiBuYW1lLCBzbyB0aGUgcmF3IHJvdXRlIHJlYWRzXG4gICAgLy8gYC9hcGkvbWFzdHJhL21jcC9tYXN0cmEvbWNwYCAoZG91YmxlZCBzZWdtZW50KS4gVGhpcyBydW5zIGJlZm9yZVxuICAgIC8vIHRoZSBjYXRjaC1hbGwgYW5kIHJld3JpdGVzIHRoZSBhbGlhcyB0byB0aGUgdW5kZXJseWluZyByb3V0ZSwgc29cbiAgICAvLyB0aGUgcHVibGljIHBhdGggaXMganVzdCBgL2FwaS88cGx1Z2luPi9tY3BgOyB0aGUgcXVlcnkgc3RyaW5nXG4gICAgLy8gKGUuZy4gdGhlIFNTRSBgc2Vzc2lvbklkYCkgaXMgcHJlc2VydmVkLlxuICAgIC8vXG4gICAgLy8gTWlkZGxld2FyZSByYXRoZXIgdGhhbiBgdGhpcy5yb3V0ZWA6IGl0IHJld3JpdGVzIHRoZSBVUkwgZm9yIHJvdXRlc1xuICAgIC8vIGBAbWFzdHJhL2V4cHJlc3NgIG93bnMgZnVydGhlciBkb3duIHRoZSBjaGFpbiBpbnN0ZWFkIG9mIGFuc3dlcmluZyB0aGVcbiAgICAvLyByZXF1ZXN0LCB3aGljaCBgUm91dGVDb25maWdgIGhhcyBubyBzaGFwZSBmb3IuXG4gICAgcm91dGVyLnVzZSgocmVxLCBfcmVzLCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLm1jcFJvdXRlQWxpYXMocmVxLnBhdGgpO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBjb25zdCBxID0gcmVxLnVybC5pbmRleE9mKFwiP1wiKTtcbiAgICAgICAgcmVxLnVybCA9IHEgPj0gMCA/IHRhcmdldCArIHJlcS51cmwuc2xpY2UocSkgOiB0YXJnZXQ7XG4gICAgICB9XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgbW9kZWwgY2F0YWxvZ3VlIGFuZCBwZXItYWdlbnQgZGVmYXVsdC1tb2RlbCByb3V0ZXMuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJNb2RlbFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBgR0VUIC9tb2RlbHNgIGV4cG9zZXMgdGhlIGNhY2hlZCBlbmRwb2ludCBsaXN0IHNvIGNsaWVudHMgY2FuXG4gICAgLy8gcG9wdWxhdGUgbW9kZWwgcGlja2VycywgdmFsaWRhdGUgYD9tb2RlbD1gIGNob2ljZXMsIGV0Yy4gTXVzdFxuICAgIC8vIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjYXRjaC1hbGwgdGhhdCBmb3J3YXJkcyBldmVyeXRoaW5nIHRvXG4gICAgLy8gdGhlIE1hc3RyYSBzdWJhcHAuXG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwibW9kZWxzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiByb3V0ZXMuTUFTVFJBX1JPVVRFUy5tb2RlbHMsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY29wZWRTZWxmKHJlcSkubGlzdE1vZGVsc1Jlc3VsdCgpO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUocmVzLCByZXN1bHQsIFwibW9kZWxzXCIsIE1PREVMX0NBVEFMT0dVRV9GQUlMRURfTUVTU0FHRSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5qc29uKHsgZW5kcG9pbnRzOiByZXN1bHQuZGF0YSB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBgR0VUIC9kZWZhdWx0LW1vZGVsYCAoYW5kIGAvZGVmYXVsdC1tb2RlbC86YWdlbnRJZGApIHJlcG9ydHMgd2hhdCBhblxuICAgIC8vIHVucGlubmVkIHR1cm4gd2lsbCB1c2UuIEEgY29uZmlndXJlZCBzdHJpbmcgaXMgcmV0dXJuZWQgZGlyZWN0bHk7IGFuXG4gICAgLy8gYXV0b21hdGljIGRlZmF1bHQgcmVzb2x2ZXMgdGhlIGhpZ2hlc3QtcmFua2VkIGN1cnJlbnRseSBhdmFpbGFibGUgR1BUXG4gICAgLy8gKG9yIGdlbmVyYWwgY2hhdCBmYWxsYmFjaykgZnJvbSB0aGUgc2FtZSBPQk8tc2NvcGVkIGxpdmUgY2F0YWxvZ3VlIGFzXG4gICAgLy8gYC9tb2RlbHNgOyBhIGN1c3RvbSBkeW5hbWljIHJlc29sdmVyIHJlbWFpbnMgbnVsbCBiZWNhdXNlIGl0IGlzIGNhbGwtdGltZVxuICAgIC8vIGFwcGxpY2F0aW9uIGNvZGUuXG4gICAgY29uc3QgaGFuZGxlRGVmYXVsdE1vZGVsID0gYXN5bmMgKFxuICAgICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ZWQgPSBzdHJpbmdVdGlscy5maXJzdE5vbkVtcHR5KHJlcS5wYXJhbXMuYWdlbnRJZCk7XG4gICAgICBpZiAocmVxdWVzdGVkICE9PSBudWxsICYmICF0aGlzLmJ1aWx0Py5hZ2VudHNbcmVxdWVzdGVkXSkge1xuICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiB0aGlzLnVua25vd25BZ2VudE1lc3NhZ2UocmVxdWVzdGVkKSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYWdlbnRJZCA9IHJlcXVlc3RlZCA/PyB0aGlzLmJ1aWx0Py5kZWZhdWx0QWdlbnRJZCA/PyBGQUxMQkFDS19BR0VOVF9JRDtcbiAgICAgIGNvbnN0IGludGVudCA9IHRoaXMuYnVpbHQ/LmRlZmF1bHRNb2RlbHNbYWdlbnRJZF07XG4gICAgICBsZXQgbW9kZWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKGludGVudD8ua2luZCA9PT0gXCJjb25maWd1cmVkXCIpIHtcbiAgICAgICAgbW9kZWwgPSBpbnRlbnQubW9kZWw7XG4gICAgICB9IGVsc2UgaWYgKGludGVudD8ua2luZCA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY29wZWRTZWxmKHJlcSkubGlzdE1vZGVsc1Jlc3VsdCgpO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUocmVzLCByZXN1bHQsIFwiZGVmYXVsdC1tb2RlbFwiLCBNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG1vZGVsID0gcmVzb2x2ZURlZmF1bHRNb2RlbElkKHRoaXMuY29uZmlnLCByZXN1bHQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlcy5qc29uKHtcbiAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBtb2RlbCA/IGRpc3BsYXkudG9Nb2RlbERpc3BsYXlOYW1lKG1vZGVsKSA6IG51bGwsXG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRlZmF1bHRNb2RlbFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMuZGVmYXVsdE1vZGVsLFxuICAgICAgaGFuZGxlcjogaGFuZGxlRGVmYXVsdE1vZGVsLFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRlZmF1bHRNb2RlbEJ5QWdlbnRcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IGAke3JvdXRlcy5NQVNUUkFfUk9VVEVTLmRlZmF1bHRNb2RlbH0vOmFnZW50SWRgLFxuICAgICAgaGFuZGxlcjogaGFuZGxlRGVmYXVsdE1vZGVsLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIHRoZSBnZW5lcmljIGNoYXJ0IGFuZCBzdGF0ZW1lbnQgZW1iZWQgcmVzb2x2ZXIuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJFbWJlZFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBgR0VUIC9lbWJlZC86dHlwZS86aWRgIGlzIHRoZSBzaW5nbGUgcmVzb2x2ZXIgZm9yIGV2ZXJ5IGVtYmVkXG4gICAgLy8gbWFya2VyIHRoZSBhZ2VudCBlbWl0cyBpbiBwcm9zZSAoYFtjaGFydDo8aWQ+XWAsXG4gICAgLy8gYFtkYXRhOjxpZD5dYCwgLi4uKS4gYDp0eXBlYCBzZWxlY3RzIGEgcmVzb2x2ZXIgZnJvbSB0aGVcbiAgICAvLyByZWdpc3RyeSBiZWxvdzsgYDppZGAgaXMgdGhhdCByZXNvbHZlcidzIGxvb2t1cCBrZXkuIFRoZSBtYXJrZXIgZ3JhbW1hclxuICAgIC8vIGlzIHR5cGUtYWdub3N0aWM7IHRoZSBjbGllbnQgc3RpbGwgY2hvb3NlcyBob3cgZWFjaCByZWdpc3RlcmVkIHR5cGVcbiAgICAvLyByZW5kZXJzLlxuICAgIC8vXG4gICAgLy8gU3RhdHVzIGNvZGVzOlxuICAgIC8vICAgLSAyMDAgd2l0aCB0aGUgcmVzb2x2ZXIncyBKU09OIGJvZHkgd2hlbiB0aGUgaWQgcmVzb2x2ZXMuXG4gICAgLy8gICAtIDQwNCB3aGVuIGA6dHlwZWAgaXNuJ3QgcmVnaXN0ZXJlZCAodW5zdXBwb3J0ZWQgZW1iZWRcbiAgICAvLyAgICAgdHlwZSkgT1IgYSByZWdpc3RlcmVkIHJlc29sdmVyIGNhbid0IGZpbmQgYDppZGAgKHVua25vd25cbiAgICAvLyAgICAgLyBleHBpcmVkIC0gZS5nLiBhIGNoYXJ0IHBhc3QgaXRzIDFoIFRUTCBvciBhIGZhYnJpY2F0ZWRcbiAgICAvLyAgICAgaWQgdGhlIG1vZGVsIG5ldmVyIG1pbnRlZCkuXG4gICAgLy8gICAtIDQwMCB3aGVuIGA6aWRgIGlzIGVtcHR5LlxuICAgIC8vXG4gICAgLy8gUGVyLXR5cGUgcXVlcnkga25vYnMgYW5kIGJlaGF2aW9yOlxuICAgIC8vICAgLSBgY2hhcnRgOiBsb25nLXBvbGxzIHRoZSBjaGFydCBjYWNoZSB1bnRpbCB0aGUgZW50cnlcbiAgICAvLyAgICAgc2V0dGxlcyAoYHJlc3VsdGAgLyBgZXJyb3JgKSBvciB0aGUgYnVkZ2V0IGVsYXBzZXMgKHRoZW5cbiAgICAvLyAgICAgcmV0dXJucyB0aGUgc3RpbGwtcHJvY2Vzc2luZyBlbnRyeSB0byBwb2xsIGFnYWluKS5cbiAgICAvLyAgICAgYD90aW1lb3V0TXM9PG4+YCAoZGVmYXVsdCA2MHMsIGNhcHBlZCA1bWluKSB0dW5lcyBpdC5cbiAgICAvLyAgIC0gYGRhdGFgOiBvbmUgU3RhdGVtZW50IEV4ZWN1dGlvbiBmZXRjaCB1bmRlciBgZ2VuaWVJZGVudGl0eWAuXG4gICAgLy8gICAtIGB2aXN1YWxpemF0aW9uYDogdGhlIHNhbWUgcGF5bG9hZCB1bmRlciBtYW5kYXRvcnkgT0JPIGlkZW50aXR5IGZvclxuICAgIC8vICAgICBkaXJlY3QgR2VuaWUgY2hhdCwgd2hvc2UgY29udmVyc2F0aW9ucyBiZWxvbmcgdG8gdGhlIHNpZ25lZC1pbiB1c2VyLlxuICAgIC8vICAgICBgP2xpbWl0PTxuPmAgY2FwcyByb3dzIChjbGFtcGVkIHRvIFNUQVRFTUVOVF9ST1dfQ0FQKS5cbiAgICAvL1xuICAgIC8vIEJ1aWx0IG9uY2UgKHRoaXMgaGFuZGxlciBpcyByZWdpc3RlcmVkIG9uY2UpIGFuZCBrZXllZCBieSB0aGVcbiAgICAvLyByYXcgYDp0eXBlYCB0b2tlbi4gRWFjaCByZXNvbHZlciBnZXRzIHRoZSByZXF1ZXN0IChmb3IgcXVlcnlcbiAgICAvLyBwYXJzaW5nICsgT0JPIHNjb3BpbmcpIGFuZCBhbiBgQWJvcnRTaWduYWxgIGJyaWRnZWQgb2ZmIHRoZVxuICAgIC8vIGNvbm5lY3Rpb24gYGNsb3NlYCBldmVudCBzbyBhIGxvbmctcG9sbCB1bmJsb2NrcyB0aGUgaW5zdGFudFxuICAgIC8vIHRoZSBjbGllbnQgZGlzY29ubmVjdHMuIGB1bmRlZmluZWRgIGZyb20gYSByZXNvbHZlciBtYXBzIHRvIGFcbiAgICAvLyBjbGVhbiA0MDQ7IHRocm93biBlcnJvcnMgYnViYmxlIHRocm91Z2ggYG5leHQoZXJyKWAuXG4gICAgY29uc3QgZW1iZWRSZXNvbHZlcnM6IFJlY29yZDxzdHJpbmcsIEVtYmVkUmVzb2x2ZXI+ID0ge1xuICAgICAgY2hhcnQ6IChyZXEsIGlkLCBzaWduYWwpID0+IHtcbiAgICAgICAgY29uc3QgdGltZW91dE1zID0gcGFyc2VUaW1lb3V0TXMocmVxLnF1ZXJ5LnRpbWVvdXRNcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5mZXRjaENoYXJ0RW50cnkocmVxLCBpZCwge1xuICAgICAgICAgIC4uLih0aW1lb3V0TXMgIT09IHVuZGVmaW5lZCA/IHsgdGltZW91dE1zIH0gOiB7fSksXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBkYXRhOiAocmVxLCBpZCwgc2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcGFyc2VTdGF0ZW1lbnRMaW1pdChyZXEucXVlcnkubGltaXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZWRTZWxmKHJlcSkuZmV0Y2hTdGF0ZW1lbnQoaWQsIHtcbiAgICAgICAgICAuLi4obGltaXQgIT09IHVuZGVmaW5lZCA/IHsgbGltaXQgfSA6IHt9KSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHZpc3VhbGl6YXRpb246IChyZXEsIGlkLCBzaWduYWwpID0+IHtcbiAgICAgICAgY29uc3QgbGltaXQgPSBwYXJzZVN0YXRlbWVudExpbWl0KHJlcS5xdWVyeS5saW1pdCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFzVXNlcihyZXEpLmZldGNoU3RhdGVtZW50KGlkLCB7XG4gICAgICAgICAgLi4uKGxpbWl0ICE9PSB1bmRlZmluZWQgPyB7IGxpbWl0IH0gOiB7fSksXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImVtYmVkXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5lbWJlZH0vOnR5cGUvOmlkYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLnR5cGUpID8/IFwiXCI7XG4gICAgICAgIGNvbnN0IGlkID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLmlkKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZSA9IGVtYmVkUmVzb2x2ZXJzW3R5cGVdO1xuICAgICAgICBpZiAoIXJlc29sdmUpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZW1iZWQ6dW5zdXBwb3J0ZWRcIiwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgdW5zdXBwb3J0ZWQgZW1iZWQgdHlwZTogJHt0eXBlfWAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZW1iZWQ6aW52YWxpZFwiLCB7XG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBcImlkIGlzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogXCJpZCBpcyByZXF1aXJlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBCcmlkZ2UgcmVzcG9uc2UgY2xvc2Ugb250byBhbiBBYm9ydFNpZ25hbCBzbyBhIGNsaWVudCBkaXNjb25uZWN0XG4gICAgICAgIC8vIHJlbGVhc2VzIGxvbmctcG9sbCBhbmQgd29ya3NwYWNlIGNhbGxzIGltbWVkaWF0ZWx5LlxuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICByZXMub24oXCJjbG9zZVwiLCAoKSA9PiBjb250cm9sbGVyLmFib3J0KCkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlKHJlcSwgaWQsIGNvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBgZW1iZWQ6JHt0eXBlfWAsIGBDb3VsZCBub3QgcmVzb2x2ZSB0aGUgJHt0eXBlfSBlbWJlZGApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEEgY2FjaGUgbWlzcyBpcyBzZWN1cml0eS1kZWxpYmVyYXRlbHkgYW1iaWd1b3VzOiB1bmtub3duLCBleHBpcmVkLFxuICAgICAgICAgIC8vIG9yIG93bmVkIGJ5IGFub3RoZXIgaWRlbnRpdHkgYWxsIG1hcCB0byB0aGUgc2FtZSA0MDQuIExvZyB0aGVcbiAgICAgICAgICAvLyBvcGFxdWUgaWQgYW5kIHRob3NlIHBvc3NpYmxlIGNhdXNlcyBzbyBhIGZhYnJpY2F0ZWQgbWFya2VyIGlzXG4gICAgICAgICAgLy8gZGlhZ25vc2FibGUgZnJvbSB0aGUgc2VydmVyIHdpdGhvdXQgZGlzY2xvc2luZyB3aGljaCBjYXVzZSBhcHBsaWVkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGVtYmVkOiR7dHlwZX06bm90LWZvdW5kYCwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICAgIHJlYXNvbjogXCJ1bmtub3duLCBleHBpcmVkLCBvciBvd25lZCBieSBhbm90aGVyIGlkZW50aXR5XCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYCR7dHlwZX0gbm90IGZvdW5kYCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24ocmVzdWx0LmRhdGEpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBkZWZhdWx0IGFuZCBhZ2VudC1xdWFsaWZpZWQgc3VnZ2VzdGlvbiByb3V0ZXMuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJTdWdnZXN0aW9uUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIGBHRVQgL3N1Z2dlc3Rpb25zYCAoYW5kIGAvc3VnZ2VzdGlvbnMvOmFnZW50SWRgKSByZXR1cm5zIHRoZVxuICAgIC8vIGN1cmF0ZWQgc3RhcnRlciBxdWVzdGlvbnMgZm9yIHRoZSBhZ2VudCdzIEdlbmllIHNwYWNlKHMpIC0gdGhlXG4gICAgLy8gYXV0aG9yLWNvbmZpZ3VyZWQgYHNhbXBsZV9xdWVzdGlvbnNgLCBzdXJmYWNlZCBhcyBvbmUtdGFwXG4gICAgLy8gcHJvbXB0cyBvbiB0aGUgY2hhdCBlbXB0eSBzdGF0ZS4gUmV0dXJucyBgeyBxdWVzdGlvbnM6IFtdIH1gXG4gICAgLy8gd2hlbiBubyBHZW5pZSBzcGFjZSBpcyB3aXJlZCBzbyB0aGUgY2xpZW50IHJlbmRlcnMgYSBiYXJlXG4gICAgLy8gZW1wdHkgc3RhdGUgKG5vIGJ1aWx0LWluIGV4YW1wbGUgcHJvbXB0cykuIFRoZSBgOmFnZW50SWRgXG4gICAgLy8gc2VnbWVudCBpcyBhY2NlcHRlZCBmb3IgVVJMIHN5bW1ldHJ5IHdpdGggdGhlIGNoYXQgLyBoaXN0b3J5XG4gICAgLy8gcm91dGVzOyBHZW5pZSBzcGFjZXMgYXJlIHJlc29sdmVkIHBlci1wbHVnaW4sIG5vdCBwZXItYWdlbnQsXG4gICAgLy8gc28gaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHJlc3VsdC4gVGhlIHNwYWNlIGxvb2t1cCB1c2VzIHRoZSBjb25maWd1cmVkXG4gICAgLy8gYWdlbnQtYmFja2VkIGlkZW50aXR5LlxuICAgIGNvbnN0IGhhbmRsZVN1Z2dlc3Rpb25zID0gYXN5bmMgKFxuICAgICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgcmVzLm9uKFwiY2xvc2VcIiwgKCkgPT4gY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoU3VnZ2VzdGlvbnMoY29udHJvbGxlci5zaWduYWwpO1xuICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIC8vIFN1Z2dlc3Rpb25zIGFyZSBhIG5vbi1jcml0aWNhbCBlbmhhbmNlbWVudDsgYSBsb29rdXAgZmFpbHVyZSBzaG91bGRcbiAgICAgICAgLy8gbGVhdmUgdGhlIGNoYXQgdXNhYmxlIHdpdGggYSBiYXJlIGVtcHR5IHN0YXRlIHJhdGhlciB0aGFuIHN1cmZhY2luZ1xuICAgICAgICAvLyB0aGUgdXBzdHJlYW0gc3RhdHVzLiBMb2cgYW5kIGRlZ3JhZGUuXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJzdWdnZXN0aW9uczplcnJvclwiLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IocmVzdWx0Lm1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzLmpzb24oeyBxdWVzdGlvbnM6IFtdIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXMuanNvbih7IHF1ZXN0aW9uczogcmVzdWx0LmRhdGEgfSk7XG4gICAgfTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzdWdnZXN0aW9uc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMuc3VnZ2VzdGlvbnMsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVTdWdnZXN0aW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzdWdnZXN0aW9uc0J5QWdlbnRcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IGAke3JvdXRlcy5NQVNUUkFfUk9VVEVTLnN1Z2dlc3Rpb25zfS86YWdlbnRJZGAsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVTdWdnZXN0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGUgZGlyZWN0IEdlbmllIGNoYXQgcm91dGVzLiBFYWNoIHJvdXRlIGlzIHNjb3BlZCB0byBvbmUgR2VuaWVcbiAgICogc3BhY2UgYWxpYXMgYW5kIHNpdHMgZGlyZWN0bHkgb24gdGhlIEdlbmllIEFQSXMgdW5kZXIgQXBwS2l0J3MgT0JPIHVzZXJcbiAgICogY29udGV4dDogY29udmVyc2F0aW9ucyBhcmUgdGhyZWFkcywgR2VuaWUgbWVzc2FnZXMgYXJlIGhpc3RvcnksIGFuZCBhIHR1cm5cbiAgICogc3RyZWFtcyB0aGUgc2FtZSBBSSBTREsgY2h1bmtzIGFzIGFuIGFnZW50J3MgYGFza19nZW5pZWAgY2FsbC4gTm90aGluZyBpc1xuICAgKiB3cml0dGVuIHRvIE1hc3RyYSBNZW1vcnkuXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyR2VuaWVDaGF0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSAoLi4ucGFydHM6IHN0cmluZ1tdKSA9PiByb3V0ZXMuZ2VuaWVSb3V0ZVBhdGgoXCI6YWxpYXNcIiwgLi4ucGFydHMpO1xuICAgIGNvbnN0IHsgY2hhdDogY2hhdFNlZ21lbnQsIG1lc3NhZ2VzLCBzdWdnZXN0aW9ucywgdGhyZWFkcyB9ID0gcm91dGVzLk1BU1RSQV9ST1VURVM7XG4gICAgLyoqIFJlc29sdmUgdGhlIHJvdXRlJ3MgYWxpYXMsIGFuc3dlcmluZyA0MDQgd2hlbiBubyBzdWNoIHNwYWNlIGlzIGNvbmZpZ3VyZWQuICovXG4gICAgY29uc3Qgc3BhY2VGb3IgPSAocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlczogZXhwcmVzcy5SZXNwb25zZSk6IEdlbmllQ2hhdFNwYWNlIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGNvbnN0IGFsaWFzID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLmFsaWFzKSA/PyBcIlwiO1xuICAgICAgY29uc3QgY29uZmlndXJlZCA9IHJlc29sdmVHZW5pZVNwYWNlcyh0aGlzLmNvbmZpZywgdGhpcy5jb250ZXh0KVthbGlhc107XG4gICAgICBpZiAoY29uZmlndXJlZCkgcmV0dXJuIHsgYWxpYXMsIHNwYWNlSWQ6IGNvbmZpZ3VyZWQuc3BhY2VJZCB9O1xuICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYFVua25vd24gR2VuaWUgc3BhY2UgYWxpYXMgXCIke2FsaWFzfVwiYCB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKiogQnJpZGdlIHRoZSBjb25uZWN0aW9uIGBjbG9zZWAgZXZlbnQgb250byBhbiBhYm9ydCBzaWduYWwuICovXG4gICAgY29uc3QgY2xvc2VTaWduYWwgPSAocmVzOiBleHByZXNzLlJlc3BvbnNlKTogQWJvcnRTaWduYWwgPT4ge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJlcy5vbihcImNsb3NlXCIsICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gICAgfTtcblxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImdlbmllQ2hhdFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IHBhdGgoY2hhdFNlZ21lbnQpLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VGb3IocmVxLCByZXMpO1xuICAgICAgICBpZiAoIXNwYWNlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHdpcmUuR2VuaWVDaGF0UmVxdWVzdFNjaGVtYS5zYWZlUGFyc2UocmVxLmJvZHkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzXG4gICAgICAgICAgICAuc3RhdHVzKDQwMClcbiAgICAgICAgICAgIC5qc29uKHsgZXJyb3I6IFwicXVlc3Rpb24gaXMgcmVxdWlyZWRcIiwgZmllbGRzOiBpbnZhbGlkRmllbGRzKHBhcnNlZC5lcnJvcikgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuYXNVc2VyKHJlcSkuc3RyZWFtR2VuaWVDaGF0KHJlcywgc3BhY2UsIHBhcnNlZC5kYXRhLCBjbG9zZVNpZ25hbChyZXMpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZ2VuaWVUaHJlYWRzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBwYXRoKHRocmVhZHMpLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VGb3IocmVxLCByZXMpO1xuICAgICAgICBpZiAoIXNwYWNlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXNVc2VyKHJlcSkuZ2VuaWVDb252ZXJzYXRpb25SZWFkKChjbGllbnQpID0+XG4gICAgICAgICAgbGlzdEdlbmllVGhyZWFkcyhjbGllbnQsIHNwYWNlKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImdlbmllLXRocmVhZHNcIiwgXCJDb3VsZCBub3QgbGlzdCBHZW5pZSBjb252ZXJzYXRpb25zXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuanNvbih7IHRocmVhZHM6IHJlc3VsdC5kYXRhIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJnZW5pZVRocmVhZE1lc3NhZ2VzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBwYXRoKHRocmVhZHMsIFwiOnRocmVhZElkXCIsIG1lc3NhZ2VzKSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCBzcGFjZSA9IHNwYWNlRm9yKHJlcSwgcmVzKTtcbiAgICAgICAgaWYgKCFzcGFjZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aHJlYWRJZCA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy50aHJlYWRJZCkgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hc1VzZXIocmVxKS5nZW5pZUNvbnZlcnNhdGlvblJlYWQoKGNsaWVudCkgPT5cbiAgICAgICAgICBsaXN0R2VuaWVUaHJlYWRNZXNzYWdlcyh7XG4gICAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aHJlYWRJZCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImdlbmllLW1lc3NhZ2VzXCIsIFwiQ291bGQgbm90IGxvYWQgdGhlIEdlbmllIGNvbnZlcnNhdGlvblwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24oeyBtZXNzYWdlczogcmVzdWx0LmRhdGEgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImdlbmllVGhyZWFkRGVsZXRlXCIsXG4gICAgICBtZXRob2Q6IFwiZGVsZXRlXCIsXG4gICAgICBwYXRoOiBwYXRoKHRocmVhZHMsIFwiOnRocmVhZElkXCIpLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VGb3IocmVxLCByZXMpO1xuICAgICAgICBpZiAoIXNwYWNlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLnRocmVhZElkKSA/PyBcIlwiO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFzVXNlcihyZXEpLmdlbmllQ29udmVyc2F0aW9uV3JpdGUoKGNsaWVudCkgPT5cbiAgICAgICAgICBkZWxldGVHZW5pZVRocmVhZChjbGllbnQsIHNwYWNlLCB0aHJlYWRJZCksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShcbiAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIFwiZ2VuaWUtdGhyZWFkLWRlbGV0ZVwiLFxuICAgICAgICAgICAgXCJDb3VsZCBub3QgZGVsZXRlIHRoZSBHZW5pZSBjb252ZXJzYXRpb25cIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuc3RhdHVzKDIwNCkuZW5kKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImdlbmllVGhyZWFkTWVzc2FnZURlbGV0ZVwiLFxuICAgICAgbWV0aG9kOiBcImRlbGV0ZVwiLFxuICAgICAgcGF0aDogcGF0aCh0aHJlYWRzLCBcIjp0aHJlYWRJZFwiLCBtZXNzYWdlcywgXCI6bWVzc2FnZUlkXCIpLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VGb3IocmVxLCByZXMpO1xuICAgICAgICBpZiAoIXNwYWNlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLnRocmVhZElkKSA/PyBcIlwiO1xuICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBzdHJpbmdVdGlscy5maXJzdE5vbkVtcHR5KHJlcS5wYXJhbXMubWVzc2FnZUlkKSA/PyBcIlwiO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFzVXNlcihyZXEpLmdlbmllQ29udmVyc2F0aW9uV3JpdGUoKGNsaWVudCkgPT5cbiAgICAgICAgICBkZWxldGVHZW5pZVRocmVhZE1lc3NhZ2UoY2xpZW50LCBzcGFjZSwgdGhyZWFkSWQsIG1lc3NhZ2VJZCksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShcbiAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIFwiZ2VuaWUtbWVzc2FnZS1kZWxldGVcIixcbiAgICAgICAgICAgIFwiQ291bGQgbm90IGRlbGV0ZSB0aGUgR2VuaWUgbWVzc2FnZVwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5zdGF0dXMoMjA0KS5lbmQoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZ2VuaWVTdWdnZXN0aW9uc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcGF0aChzdWdnZXN0aW9ucyksXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3Qgc3BhY2UgPSBzcGFjZUZvcihyZXEsIHJlcyk7XG4gICAgICAgIGlmICghc3BhY2UpIHJldHVybjtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hc1VzZXIocmVxKS5mZXRjaFN1Z2dlc3Rpb25zKHVuZGVmaW5lZCwge1xuICAgICAgICAgIFtzcGFjZS5hbGlhc106IHsgc3BhY2VJZDogc3BhY2Uuc3BhY2VJZCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzLmpzb24oeyBxdWVzdGlvbnM6IHJlc3VsdC5vayA/IHJlc3VsdC5kYXRhIDogW10gfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBvbmUgZGlyZWN0IEdlbmllIHR1cm4gdG8gYHJlc2AgdW5kZXIgQXBwS2l0J3MgT0JPIHVzZXIgY29udGV4dC5cbiAgICogRGlyZWN0IGNvbnZlcnNhdGlvbnMgY2Fubm90IHVzZSB0aGUgc2hhcmVkIHNlcnZpY2UgcHJpbmNpcGFsIGJlY2F1c2UgR2VuaWVcbiAgICogb3ducyB0aGVtIHVuZGVyIHRoZSBEYXRhYnJpY2tzIGNhbGxlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3RyZWFtR2VuaWVDaGF0KFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICBzcGFjZTogR2VuaWVDaGF0U3BhY2UsXG4gICAgcmVxdWVzdDogR2VuaWVDaGF0UmVxdWVzdCxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgIGNvbnN0IGNsaWVudCA9IGNvbnRleHQuY2xpZW50O1xuICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gbmV3IFJlcXVlc3RDb250ZXh0PHVua25vd24+KFxuICAgICAgT2JqZWN0LmVudHJpZXMocmVxdWVzdC5yZXF1ZXN0Q29udGV4dCA/PyB7fSksXG4gICAgKTtcbiAgICBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dCk7XG4gICAgY29uc3QgYXBwbGljYXRpb25Db250ZXh0ID0gcmVxdWVzdENvbnRleHQudG9KU09OKCk7XG4gICAgYXdhaXQgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIocmVxdWVzdENvbnRleHQpO1xuICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IHRoaXMuYnVpbHQ/LmFnZW50c1t0aGlzLmJ1aWx0LmRlZmF1bHRBZ2VudElkXT8uZ2V0TWVtb3J5KHtcbiAgICAgIHJlcXVlc3RDb250ZXh0LFxuICAgIH0pO1xuICAgIGF3YWl0IHBpcGVVSU1lc3NhZ2VTdHJlYW1Ub1Jlc3BvbnNlKHtcbiAgICAgIHJlc3BvbnNlOiByZXMsXG4gICAgICBzdHJlYW06IGdlbmllQ2hhdFN0cmVhbSh7XG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgc3BhY2UsXG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBxdWVzdGlvbjogcmVxdWVzdC5xdWVzdGlvbixcbiAgICAgICAgICAuLi4ocmVxdWVzdC5jb252ZXJzYXRpb25JZCA/IHsgY29udmVyc2F0aW9uSWQ6IHJlcXVlc3QuY29udmVyc2F0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oT2JqZWN0LmtleXMoYXBwbGljYXRpb25Db250ZXh0KS5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IHsgcmVxdWVzdENvbnRleHQ6IGFwcGxpY2F0aW9uQ29udGV4dCB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKG1lbW9yeSA/IHsgbWVtb3J5IH0gOiB7fSksXG4gICAgICAgIHJlcXVlc3RDb250ZXh0LFxuICAgICAgICBzaWduYWwsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSdW4gb25lIEdlbmllIGNvbnZlcnNhdGlvbiByZWFkIHVuZGVyIHRoZSBhY3RpdmUgcmVxdWVzdCBpZGVudGl0eS4gKi9cbiAgcHJpdmF0ZSBnZW5pZUNvbnZlcnNhdGlvblJlYWQ8VD4oXG4gICAgcmVhZDogKGNsaWVudDogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RXhlY3V0aW9uQ29udGV4dD5bXCJjbGllbnRcIl0pID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKCgpID0+IHJlYWQoY2xpZW50KSwgZ2VuaWVDb252ZXJzYXRpb25SZWFkRGVmYXVsdHMpO1xuICB9XG5cbiAgLyoqIFJ1biBvbmUgR2VuaWUgY29udmVyc2F0aW9uIHdyaXRlIHVuZGVyIHRoZSBhY3RpdmUgcmVxdWVzdCBpZGVudGl0eS4gKi9cbiAgcHJpdmF0ZSBnZW5pZUNvbnZlcnNhdGlvbldyaXRlKFxuICAgIHdyaXRlOiAoY2xpZW50OiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRFeGVjdXRpb25Db250ZXh0PltcImNsaWVudFwiXSkgPT4gUHJvbWlzZTx2b2lkPixcbiAgKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8dm9pZD4+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKCkgPT4gd3JpdGUoY2xpZW50KSwgZ2VuaWVDb252ZXJzYXRpb25Xcml0ZURlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciB0aGUgc2luZ2xlIGZlZWRiYWNrIGRlc3RpbmF0aW9uIHNlbGVjdGVkIGJ5IHBsdWdpbiBtb2RlLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRmVlZGJhY2tSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZmVlZGJhY2tcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiByb3V0ZXMuTUFTVFJBX1JPVVRFUy5mZWVkYmFjayxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5mZWVkYmFja01vZGUoKTtcbiAgICAgICAgaWYgKG1vZGUgPT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBvazogZmFsc2UgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGZlZWRiYWNrLk1hc3RyYUZlZWRiYWNrUmVxdWVzdFNjaGVtYS5zYWZlUGFyc2UocmVxLmJvZHkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgLy8gQSBab2QgaXNzdWUgc3RyaW5nIHF1b3RlcyB0aGUgcmVjZWl2ZWQgYm9keSBiYWNrLCBzbyBvbmx5IHRoZVxuICAgICAgICAgIC8vIG9mZmVuZGluZyBmaWVsZCBuYW1lcyB0cmF2ZWw7IHRoZSBmdWxsIGlzc3VlIGxpc3QgaXMgbG9nZ2VkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJmZWVkYmFjazppbnZhbGlkXCIsIHsgZXJyb3I6IHBhcnNlZC5lcnJvciB9KTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogSU5WQUxJRF9GRUVEQkFDS19NRVNTQUdFLFxuICAgICAgICAgICAgZmllbGRzOiBpbnZhbGlkRmllbGRzKHBhcnNlZC5lcnJvciksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWQuZGF0YS5tb2RlICE9PSBtb2RlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBvazogZmFsc2UsIGVycm9yOiBJTlZBTElEX0ZFRURCQUNLX01FU1NBR0UgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWQuZGF0YS5tb2RlID09PSBcImdlbmllXCIpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5zZW5kR2VuaWVGZWVkYmFjayhwYXJzZWQuZGF0YSk7XG4gICAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUocmVzLCByZXN1bHQsIFwiZ2VuaWUtZmVlZGJhY2tcIiwgXCJGZWVkYmFjayBjb3VsZCBub3QgYmUgcmVjb3JkZWRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlcy5qc29uKHsgb2s6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxvZ0ZlZWRiYWNrKHBhcnNlZC5kYXRhKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImZlZWRiYWNrXCIsIFwiRmVlZGJhY2sgY291bGQgbm90IGJlIHJlY29yZGVkXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc3Nlc3NtZW50SWQgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgcmVzLmpzb24oe1xuICAgICAgICAgIG9rOiBhc3Nlc3NtZW50SWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAuLi4oYXNzZXNzbWVudElkID8geyBhc3Nlc3NtZW50SWQgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIHRoZSBiZXN0LWVmZm9ydCBwZXItdmlld2VyIE1MZmxvdyBleHBlcmltZW50IGRlYnVnIGxpbmsuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJNbGZsb3dFeHBlcmltZW50Um91dGUocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwibWxmbG93RXhwZXJpbWVudFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMubWxmbG93RXhwZXJpbWVudCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBpZiAodGhpcy5mZWVkYmFja01vZGUoKSAhPT0gXCJtbGZsb3dcIikge1xuICAgICAgICAgIHJlcy5qc29uKHsgdXJsOiBudWxsIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5mZXRjaE1sZmxvd0V4cGVyaW1lbnRVcmwoKTtcbiAgICAgICAgcmVzLmpzb24oeyB1cmw6IHJlc3VsdC5vayA/IChyZXN1bHQuZGF0YSA/PyBudWxsKSA6IG51bGwgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIHRoZSBnYXRlZCBNYXN0cmEgY2F0Y2gtYWxsIGFmdGVyIGV2ZXJ5IGV4cGxpY2l0IHJvdXRlLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyQWdlbnRSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gTWlkZGxld2FyZSByYXRoZXIgdGhhbiBgdGhpcy5yb3V0ZWA6IHRoaXMgaXMgdGhlIGNhdGNoLWFsbCB0aGF0IGhhbmRzXG4gICAgLy8gZXZlcnkgcmVtYWluaW5nIG1ldGhvZCAvIHBhdGggcGFpciB0byB0aGUgTWFzdHJhIHN1Yi1hcHAsIHNvIGl0IGhhcyBub1xuICAgIC8vIHNpbmdsZSBtZXRob2Qgb3IgcGF0aCB0byByZWdpc3RlciB1bmRlci5cbiAgICByb3V0ZXIudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm1hc3RyYUFwcCkgcmV0dXJuIHJlcy5zdGF0dXMoNTAzKS5lbmQoKTtcbiAgICAgIC8vIEdhdGUgdGhlIHN0b2NrIE1hc3RyYSBzdXJmYWNlIGJlZm9yZSBkaXNwYXRjaC4gSW4gdGhlIGRlZmF1bHRcbiAgICAgIC8vIFwic2NvcGVkXCIgbW9kZSBvbmx5IGFnZW50IGluZmVyZW5jZSwgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCB0aGlzXG4gICAgICAvLyBwbHVnaW4ncyBvd24gYC9yb3V0ZS8qYCByb3V0ZXMsIGFuZCAod2hlbiBlbmFibGVkKSBNQ1AgcmVhY2ggTWFzdHJhO1xuICAgICAgLy8gYWRtaW4gLyBtdXRhdGluZyAvIGJ1bGstZXhwb3J0IHJvdXRlcyBhcmUgcmVmdXNlZCBoZXJlLiBgcmVxLnBhdGhgXG4gICAgICAvLyBpcyBtb3VudC1yZWxhdGl2ZSB1bmRlciB0aGUgcGx1Z2luIG1vdW50LiBTZWUgYHNlcnZlci50c2AuXG4gICAgICBpZiAoXG4gICAgICAgICFpc01hc3RyYVJlcXVlc3RBbGxvd2VkKHJlcS5tZXRob2QsIHJlcS5wYXRoLCB7XG4gICAgICAgICAgYWNjZXNzOiB0aGlzLmNvbmZpZy5hcGlBY2Nlc3MgPz8gXCJzY29wZWRcIixcbiAgICAgICAgICAvLyBSZWZsZWN0IHRoZSAqcmVzb2x2ZWQqIE1DUCBzdGF0ZSwgbm90IHJhdyBgY29uZmlnLm1jcGA6IE1DUCBpc1xuICAgICAgICAgIC8vIG9uIGJ5IGRlZmF1bHQgKGBjb25maWcubWNwYCB1bmRlZmluZWQpLCBzbyBnYXRlIG9uIHdoZXRoZXIgdGhlXG4gICAgICAgICAgLy8gc2VydmVyIHdhcyBhY3R1YWxseSBidWlsdCBhbmQgbW91bnRlZC5cbiAgICAgICAgICBtY3BFbmFibGVkOiB0aGlzLm1jcCAhPT0gbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICkge1xuICAgICAgICByZXMuc3RhdHVzKDQwMykuanNvbih7IGVycm9yOiBcIkVuZHBvaW50IG5vdCBleHBvc2VkIHRvIHRoZSBjbGllbnQgKGFwaUFjY2Vzcz1zY29wZWQpXCIgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIERpc3BhdGNoIHRocm91Z2ggYSByZWFsIG1ldGhvZCwgTk9UIHRoZSBgbWFzdHJhQXBwYCBwcm9wZXJ0eS4gVGhlXG4gICAgICAvLyBBcHBLaXQgYGFzVXNlcihyZXEpYCBwcm94eSB3cmFwcyBmdW5jdGlvbi12YWx1ZWQgcHJvcHMgd2l0aFxuICAgICAgLy8gYHZhbHVlLmJpbmQodGFyZ2V0KWAuIGBtYXN0cmFBcHBgIGlzIGFuIGV4cHJlc3MgYXBwIHdob3NlIGAuYmluZGAgaXNcbiAgICAgIC8vIHRoZSBIVFRQIEJJTkQgcm91dGUgcmVnaXN0cmFyIChleHByZXNzIGRlZmluZXMgYSBtZXRob2QgcGVyIEhUVFAgdmVyYixcbiAgICAgIC8vIGFuZCBCSU5EIGlzIG9uZSksIG5vdCBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgIC0gc28gYmluZGluZyBpdCB0aHJvdWdoXG4gICAgICAvLyB0aGUgcHJveHkgcmVnaXN0ZXJzIGEgYm9ndXMgcm91dGUgYW5kIGNyYXNoZXMgYHBhdGhUb1JlZ2V4cGBcbiAgICAgIC8vIChcInBhdGggbXVzdCBiZSBhIHN0cmluZyAuLi5cIikuIFRoaXMgb25seSBtYW5pZmVzdHMgaW4gcHJvZHVjdGlvbiB3aGVyZVxuICAgICAgLy8gYW4gT0JPIHRva2VuIG1ha2VzIGBzY29wZWRTZWxmYCByZXR1cm4gdGhlIHByb3h5LiBgZGlzcGF0Y2hNYXN0cmFgXG4gICAgICAvLyBpcyBhIHBsYWluIG1ldGhvZCAoaXRzIGAuYmluZGAgaXMgdGhlIG5vcm1hbCBvbmUpIGFuZCBpbnZva2VzXG4gICAgICAvLyBgdGhpcy5tYXN0cmFBcHBgIG9mZiB0aGUgcmVhbCB0YXJnZXQsIGtlZXBpbmcgdGhlIE9CTyBzY29wZSBhY3RpdmUuXG4gICAgICByZXR1cm4gdGhpcy5zY29wZWRTZWxmKHJlcSkuZGlzcGF0Y2hNYXN0cmEocmVxLCByZXMsIG5leHQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcCBhIGZhaWxlZCB7QGxpbmsgRXhlY3V0aW9uUmVzdWx0fSBvbnRvIHRoZSByZXNwb25zZTogdGhlIHN0YXR1cyB0aGVcbiAgICogZXhlY3V0aW9uIHBpcGVsaW5lIHJlc29sdmVkLCBwYWlyZWQgd2l0aCBgY2xpZW50TWVzc2FnZWAgcmF0aGVyIHRoYW4gdGhlXG4gICAqIHJlc3VsdCdzIG93biB0ZXh0LCB3aGljaCBjYW4gY2FycnkgdXBzdHJlYW0gZGV0YWlsLiBUaGUgZnVsbCBtZXNzYWdlIGlzXG4gICAqIGxvZ2dlZCB1bmRlciBgPG9wZXJhdGlvbj46ZXJyb3JgLlxuICAgKi9cbiAgcHJpdmF0ZSBzZW5kRmFpbHVyZShcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgcmVzdWx0OiB7IHN0YXR1czogbnVtYmVyOyBtZXNzYWdlOiBzdHJpbmcgfSxcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBjbGllbnRNZXNzYWdlOiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLndhcm4oYCR7b3BlcmF0aW9ufTplcnJvcmAsIHtcbiAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IocmVzdWx0Lm1lc3NhZ2UpLFxuICAgIH0pO1xuICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXMpLmpzb24oeyBlcnJvcjogY2xpZW50TWVzc2FnZSB9KTtcbiAgfVxuXG4gIC8qKiA0MDQgYm9keSBmb3IgYSByZXF1ZXN0IG5hbWluZyBhbiBhZ2VudCB0aGF0IGlzbid0IHJlZ2lzdGVyZWQuICovXG4gIHByaXZhdGUgdW5rbm93bkFnZW50TWVzc2FnZShhZ2VudElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pO1xuICAgIHJldHVybiBgVW5rbm93biBhZ2VudCBcIiR7YWdlbnRJZH1cIi4gUmVnaXN0ZXJlZCBhZ2VudHM6ICR7cmVnaXN0ZXJlZC5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIE1hc3RyYSBleHByZXNzIHN1Yi1hcHAuIEV4aXN0cyBhcyBhIG1ldGhvZCAoaW5zdGVhZCBvZiByZWFkaW5nXG4gICAqIGB0aGlzLm1hc3RyYUFwcGAgdGhyb3VnaCB0aGUgYGFzVXNlcihyZXEpYCBwcm94eSBhdCB0aGUgY2FsbCBzaXRlKSBzbyB0aGVcbiAgICogcHJveHkgYmluZHMgdGhpcyBwbGFpbiBtZXRob2QgLSB3aG9zZSBgLmJpbmRgIGlzIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGBcbiAgICogLSByYXRoZXIgdGhhbiB0aGUgZXhwcmVzcyBhcHAsIHdob3NlIGAuYmluZGAgaXMgdGhlIEhUVFAgQklORCByb3V0ZVxuICAgKiByZWdpc3RyYXIgKHNlZSB0aGUgbm90ZSBpbiBgaW5qZWN0Um91dGVzYCkuIFJ1bnMgaW5zaWRlIHRoZSB1c2VyIHNjb3BlIHNvXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTyBjbGllbnQgZm9yIHRoZSBhZ2VudC9tb2RlbFxuICAgKiByZXNvbHZlcnMuXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoTWFzdHJhKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5tYXN0cmFBcHAhKHJlcSwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgYSBjbGVhbiwgbW91bnQtcmVsYXRpdmUgTUNQIGFsaWFzIHBhdGggdG8gdGhlIHVuZGVybHlpbmdcbiAgICogYEBtYXN0cmEvZXhwcmVzc2Agcm91dGUuIFJldHVybnMgYG51bGxgIHdoZW4gTUNQIGlzIG9mZiBvciB0aGUgcGF0aFxuICAgKiBpc24ndCBhbiBhbGlhcy4gQ29sbGFwc2VzIHRoZSBzdG9jayBgL21jcC88c2VydmVySWQ+Lzx0cmFuc3BvcnQ+YFxuICAgKiBsYXlvdXQgKHNlcnZlcklkIGRlZmF1bHRzIHRvIHRoZSBwbHVnaW4gbmFtZSkgZG93biB0byBgL21jcGAsXG4gICAqIGAvc3NlYCwgYW5kIGAvbWVzc2FnZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBtY3BSb3V0ZUFsaWFzKHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5tY3ApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGlkID0gdGhpcy5tY3Auc2VydmVySWQ7XG4gICAgaWYgKHBhdGggPT09IFwiL21jcFwiKSByZXR1cm4gYC9tY3AvJHtpZH0vbWNwYDtcbiAgICBpZiAocGF0aCA9PT0gXCIvc3NlXCIpIHJldHVybiBgL21jcC8ke2lkfS9zc2VgO1xuICAgIGlmIChwYXRoID09PSBcIi9tZXNzYWdlc1wiKSByZXR1cm4gYC9tY3AvJHtpZH0vbWVzc2FnZXNgO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGAvc3VnZ2VzdGlvbnNgIHJvdXRlLiBSdW5zIGluc2lkZSB0aGVcbiAgICogQXBwS2l0IHVzZXItY29udGV4dCBwcm94eSBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZVxuICAgKiBPQk8tc2NvcGVkIGNsaWVudC4gUmVzb2x2ZXMgdGhlIHBsdWdpbidzIEdlbmllIHNwYWNlcyBhbmQgbWVyZ2VzXG4gICAqIHRoZWlyIGN1cmF0ZWQgYHNhbXBsZV9xdWVzdGlvbnNgIChzZWUge0BsaW5rIGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zfSkuXG4gICAqIGBvbmx5YCBuYXJyb3dzIHRoZSBsb29rdXAgdG8gdGhlIGdpdmVuIHNwYWNlcyAodGhlIGRpcmVjdCBHZW5pZSBjaGF0XG4gICAqIHBhc3NlcyBpdHMgb3duKS4gUmV0dXJucyBgW11gIHdoZW4gbm8gR2VuaWUgc3BhY2UgaXMgY29uZmlndXJlZCBzbyB0aGVcbiAgICogY2xpZW50IHNob3dzIGEgYmFyZSBlbXB0eSBzdGF0ZSBpbnN0ZWFkIG9mIGJ1aWx0LWluIGV4YW1wbGUgcHJvbXB0cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTdWdnZXN0aW9ucyhcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICBvbmx5PzogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4sXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHN0cmluZ1tdPj4ge1xuICAgIGNvbnN0IHNwYWNlcyA9IG9ubHkgPz8gcmVzb2x2ZUdlbmllU3BhY2VzKHRoaXMuY29uZmlnLCB0aGlzLmNvbnRleHQpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzcGFjZXMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgb2s6IHRydWUsIGRhdGE6IFtdIH07XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKChleGVjdXRlU2lnbmFsKSA9PiB7XG4gICAgICBjb25zdCBjb21iaW5lZCA9IGFzeW5jVXRpbHMuY29tYmluZUFib3J0U2lnbmFscyhzaWduYWwsIGV4ZWN1dGVTaWduYWwpO1xuICAgICAgcmV0dXJuIGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zKHtcbiAgICAgICAgc3BhY2VzLFxuICAgICAgICBjbGllbnQsXG4gICAgICAgIC4uLihjb21iaW5lZCA/IHsgc2lnbmFsOiBjb21iaW5lZCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSwgZ2VuaWVTdWdnZXN0aW9uRGVmYXVsdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGAvcm91dGUvZmVlZGJhY2tgIHJvdXRlLiBSdW5zIGluc2lkZSB0aGVcbiAgICogQXBwS2l0IHVzZXItY29udGV4dCBwcm94eSBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZVxuICAgKiBPQk8tc2NvcGVkIGNsaWVudCBhbmQgdGhlIGFzc2Vzc21lbnQgaXMgYXR0cmlidXRlZCB0byB0aGUgc2lnbmVkLWluXG4gICAqIHVzZXIgKHRoZWlyIGVtYWlsIC8gaWQgYXMgdGhlIGFzc2Vzc21lbnQgc291cmNlKS4gUmV0dXJucyB0aGVcbiAgICogY3JlYXRlZCBhc3Nlc3NtZW50IGlkIG9uIHN1Y2Nlc3MsIG9yIGB1bmRlZmluZWRgIG9uIGEgc29mdCBmYWlsdXJlXG4gICAqIChzZWUge0BsaW5rIGxvZ0ZlZWRiYWNrfSBpbiBgLi9tbGZsb3cuanNgKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9nRmVlZGJhY2soXG4gICAgZmVlZGJhY2s6IGZlZWRiYWNrLk1sZmxvd0ZlZWRiYWNrUmVxdWVzdCxcbiAgKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8c3RyaW5nIHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IGN0eCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgICBjb25zdCBzb3VyY2VJZCA9XG4gICAgICBcInVzZXJFbWFpbFwiIGluIGN0eCAmJiBjdHgudXNlckVtYWlsXG4gICAgICAgID8gY3R4LnVzZXJFbWFpbFxuICAgICAgICA6IFwidXNlcklkXCIgaW4gY3R4XG4gICAgICAgICAgPyBjdHgudXNlcklkXG4gICAgICAgICAgOiBjdHguc2VydmljZVVzZXJJZDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFxuICAgICAgKCkgPT5cbiAgICAgICAgbG9nRmVlZGJhY2soY3R4LmNsaWVudCwge1xuICAgICAgICAgIC4uLmZlZWRiYWNrLFxuICAgICAgICAgIC4uLihzb3VyY2VJZCA/IHsgc291cmNlSWQgfSA6IHt9KSxcbiAgICAgICAgfSksXG4gICAgICBmZWVkYmFja1dyaXRlRGVmYXVsdHMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBTZW5kIEFnZW50IE1vZGUgcmF0aW5nIGFuZCBjb21tZW50IGRpcmVjdGx5IHRvIHRoZSBvcmlnaW5hdGluZyBHZW5pZSBtZXNzYWdlLiAqL1xuICBwcml2YXRlIHNlbmRHZW5pZUZlZWRiYWNrKGlucHV0OiBmZWVkYmFjay5HZW5pZUZlZWRiYWNrUmVxdWVzdCk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHZvaWQ+PiB7XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFxuICAgICAgKHNpZ25hbCkgPT5cbiAgICAgICAgc2VuZEdlbmllTWVzc2FnZUZlZWRiYWNrKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNwYWNlX2lkOiBpbnB1dC5zcGFjZUlkLFxuICAgICAgICAgICAgY29udmVyc2F0aW9uX2lkOiBpbnB1dC5jb252ZXJzYXRpb25JZCxcbiAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlucHV0Lm1lc3NhZ2VJZCxcbiAgICAgICAgICAgIHJhdGluZzogaW5wdXQucmF0aW5nLFxuICAgICAgICAgICAgLi4uKGlucHV0LmNvbW1lbnQgPyB7IGNvbW1lbnQ6IGlucHV0LmNvbW1lbnQgfSA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICAgICAgLi4uKHNpZ25hbCA/IHsgY29udGV4dDogc2lnbmFsIH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gZXhwZXJpbWVudCBsaW5rIHVuZGVyIHRoZSBhY3RpdmUgcmVxdWVzdCBpZGVudGl0eS4gVGhlIGhlbHBlclxuICAgKiByZXR1cm5zIG5vIFVSTCB1bmxlc3MgdGhlIHZpZXdlciBoYXMgZWZmZWN0aXZlIGBDQU5fTUFOQUdFYCBwZXJtaXNzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE1sZmxvd0V4cGVyaW1lbnRVcmwoKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8c3RyaW5nIHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSgoKSA9PiBtbGZsb3dFeHBlcmltZW50TWFuYWdlclVybChjbGllbnQpLCBmZWVkYmFja1dyaXRlRGVmYXVsdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGBkYXRhYCBlbWJlZCByZXNvbHZlclxuICAgKiAoYEdFVCAvZW1iZWQvZGF0YS86aWRgKS4gUnVucyBpbnNpZGUgdGhlIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc29cbiAgICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2VcbiAgICogY2xpZW50LCB0aGVuIHJldXNlcyB0aGUgc2FtZSBgZmV0Y2hTdGF0ZW1lbnREYXRhYCBwaXBlbGluZVxuICAgKiB0aGUgYGdldF9zdGF0ZW1lbnRgIHRvb2wgcnVucyBzbyB0aGUgTExNIGFuZCB0aGUgVUkgc2VlIHRoZVxuICAgKiBleGFjdCBzYW1lIHNoYXBlIGZvciB0aGUgc2FtZSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIFJlc29sdmVzIHRvIGB1bmRlZmluZWRgIGRhdGEgZm9yIHVwc3RyZWFtIDQwNHMgc28gdGhlIHJvdXRlIGNhbiBtYXAgdGhlbVxuICAgKiB0byBhIGNsZWFuIEhUVFAgNDA0OyBhbnkgb3RoZXIgZmFpbHVyZSBjb21lcyBiYWNrIGFzIGEgbm9uLWBva2AgcmVzdWx0XG4gICAqIGNhcnJ5aW5nIHRoZSBzdGF0dXMgdG8gYW5zd2VyIHdpdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU3RhdGVtZW50KFxuICAgIHN0YXRlbWVudElkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBsaW1pdD86IG51bWJlcjsgc2lnbmFsPzogQWJvcnRTaWduYWwgfSA9IHt9LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxTdGF0ZW1lbnREYXRhIHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihvcHRpb25zLmxpbWl0ID8/IFNUQVRFTUVOVF9ST1dfQ0FQLCBTVEFURU1FTlRfUk9XX0NBUCk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgIGFzeW5jIChleGVjdXRlU2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gYXN5bmNVdGlscy5jb21iaW5lQWJvcnRTaWduYWxzKG9wdGlvbnMuc2lnbmFsLCBleGVjdXRlU2lnbmFsKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGRhdGEsIHZpc3VhbGl6YXRpb24gfSA9IGF3YWl0IGZldGNoU3RhdGVtZW50RW1iZWREYXRhKGNsaWVudCwgc3RhdGVtZW50SWQsIHtcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgLi4uKGNvbWJpbmVkID8geyBzaWduYWw6IGNvbWJpbmVkIH0gOiB7fSksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbHVtbnM6IGRhdGEuY29sdW1ucyxcbiAgICAgICAgICAgIHJvd3M6IGRhdGEucm93cyxcbiAgICAgICAgICAgIHJvd0NvdW50OiBkYXRhLnJvd0NvdW50LFxuICAgICAgICAgICAgdHJ1bmNhdGVkOiBkYXRhLnJvd3MubGVuZ3RoIDwgZGF0YS5yb3dDb3VudCxcbiAgICAgICAgICAgIHZpc3VhbGl6YXRpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gVGhlIERhdGFicmlja3MgU0RLIHRocm93cyBvbiA0MDQ7IHN1cmZhY2UgYXMgYHVuZGVmaW5lZGBcbiAgICAgICAgICAvLyBzbyB0aGUgcm91dGUgbWFwcyB0byBhIGNsZWFuIEhUVFAgNDA0IGluc3RlYWQgb2YgYSA1MDAuXG4gICAgICAgICAgaWYgKGVycm9yVXRpbHMuZXJyb3JDb250ZXh0KGVycikubm90QWNjZXNzaWJsZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAuLi5zdGF0ZW1lbnREYXRhRGVmYXVsdHMuZGVmYXVsdCxcbiAgICAgICAgICAvLyBOYW1lc3BhY2VkIHNvIHRoZSBrZXkgY2FuJ3QgY29sbGlkZSB3aXRoIGFub3RoZXIgY2FjaGUgc2hhcmluZyB0aGVcbiAgICAgICAgICAvLyBtYW5hZ2VyLCBhbmQga2V5ZWQgb24gYGxpbWl0YCBiZWNhdXNlIHRoZSBzbGljZSBpcyBwYXJ0IG9mIHRoZVxuICAgICAgICAgIC8vIHBheWxvYWQuXG4gICAgICAgICAgY2FjaGU6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlbWVudERhdGFEZWZhdWx0cy5kZWZhdWx0LmNhY2hlLFxuICAgICAgICAgICAgY2FjaGVLZXk6IFtTVEFURU1FTlRfQ0FDSEVfTkFNRVNQQUNFLCBzdGF0ZW1lbnRJZCwgbGltaXRdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYGNoYXJ0YCBlbWJlZCByZXNvbHZlclxuICAgKiAoYEdFVCAvZW1iZWQvY2hhcnQvOmlkYCkuIFJ1bnMgaW5zaWRlIHRoZSBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvIHRoZVxuICAgKiBsb29rdXAgaXMgbmFtZXNwYWNlZCB0byB0aGUgY2FsbGluZyBpZGVudGl0eTogYSBjaGFydCBtaW50ZWQgZm9yIGFub3RoZXJcbiAgICogdXNlciBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIHVua25vd24gaWQsIGFuZCB0aGUgcm91dGUgYW5zd2VycyA0MDQuXG4gICAqXG4gICAqIFRoZSBrZXkgaXMgYnVpbHQgZnJvbSB7QGxpbmsgYXR0cmlidXRlZFVzZXJJZH0gLSB0aGUgc2FtZSBydWxlIHRoYXQgbmFtZWRcbiAgICogdGhlIGlkZW50aXR5IHRoZSBjaGFydCB3YXMgd3JpdHRlbiB1bmRlciAtIHJhdGhlciB0aGFuIGZyb20gdGhlIGFtYmllbnRcbiAgICogZXhlY3V0aW9uIGNvbnRleHQgYWxvbmUuIEluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSB0aGUgYW1iaWVudCBjb250ZXh0IGlzXG4gICAqIHRoZSBTUCBmb3IgZXZlcnkgY2FsbGVyLCBzbyBrZXlpbmcgb2ZmIGl0IGFsb25lIG1pc3NlZCBldmVyeSBjaGFydCB0aGVcbiAgICogdHVybiBoYWQgd3JpdHRlbiB1bmRlciB0aGUgZm9yd2FyZGVkIHVzZXIgYW5kIHRoZSBVSSBzaG93ZWQgZWFjaCBvbmUgYXNcbiAgICogZXhwaXJlZC4gYHJlcWAgaXMgcmVhZCBpbnNpZGUgdGhlIG1ldGhvZCwgbm90IGF0IHRoZSBjYWxsIHNpdGUsIHNvIHRoZVxuICAgKiBleGVjdXRpb24gY29udGV4dCBpcyB0aGUgc2NvcGVkIG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDaGFydEVudHJ5KFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIGNoYXJ0SWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IHRpbWVvdXRNcz86IG51bWJlcjsgc2lnbmFsOiBBYm9ydFNpZ25hbCB9LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxDaGFydCB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCB1c2VyS2V5ID0gYXR0cmlidXRlZFVzZXJJZChnZXRFeGVjdXRpb25Db250ZXh0KCksIHJlcXVlc3RVc2VySWQocmVxKSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgIChleGVjdXRlU2lnbmFsKSA9PlxuICAgICAgICBmZXRjaENoYXJ0KGNoYXJ0SWQsIHtcbiAgICAgICAgICB1c2VyS2V5LFxuICAgICAgICAgIC4uLihvcHRpb25zLnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zIH0gOiB7fSksXG4gICAgICAgICAgc2lnbmFsOiBhc3luY1V0aWxzLmNvbWJpbmVBYm9ydFNpZ25hbHMob3B0aW9ucy5zaWduYWwsIGV4ZWN1dGVTaWduYWwpID8/IG9wdGlvbnMuc2lnbmFsLFxuICAgICAgICB9KSxcbiAgICAgIGNoYXJ0RmV0Y2hEZWZhdWx0cyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGAvbW9kZWxzYCByb3V0ZS4gUnVucyBpbnNpZGUgdGhlIEFwcEtpdFxuICAgKiB1c2VyLWNvbnRleHQgcHJveHkgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGUgT0JPLXNjb3BlZFxuICAgKiBjbGllbnQgYW5kIHRoZSBjYXRhbG9ndWUgcmVmbGVjdHMgd2hhdCB0aGUgY2FsbGVyIGNhbiBpbnZva2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxpc3RNb2RlbHNSZXN1bHQoKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPj4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGNvbnRleHQuY2xpZW50O1xuICAgICAgY29uc3QgY2FjaGVJZGVudGl0eSA9IGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoY29udGV4dCk7XG4gICAgICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICAgICAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICAgIHJldHVybiBtb2RlbENhdGFsb2cubGlzdFNlcnZpbmdFbmRwb2ludHMoY2xpZW50LCBob3N0LCB7XG4gICAgICAgIHR0bE1zOiBzZXJ2aW5nLnR0bE1zLFxuICAgICAgICBjYWNoZUlkZW50aXR5LFxuICAgICAgfSk7XG4gICAgfSwgbW9kZWxDYXRhbG9ndWVEZWZhdWx0cyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYGxpc3RNb2RlbHNgIGV4cG9ydC4gVGhlIHByb2dyYW1tYXRpYyBzdXJmYWNlXG4gICAqIGNhcnJpZXMgbm8gc3RhdHVzIGNvZGUsIHNvIGEgZmFpbGVkIGV4ZWN1dGlvbiBiZWNvbWVzIGEgdGhyb3cgd2l0aCBhXG4gICAqIHN0YWJsZSBtZXNzYWdlOyB0aGUgcm91dGVzIGJyYW5jaCBvbiB0aGUge0BsaW5rIEV4ZWN1dGlvblJlc3VsdH0gaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbGlzdE1vZGVscygpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubGlzdE1vZGVsc1Jlc3VsdCgpO1xuICAgIGlmIChyZXN1bHQub2spIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICB0aGlzLmxvZ2dlci53YXJuKFwibGlzdE1vZGVsczplcnJvclwiLCB7XG4gICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKHJlc3VsdC5tZXNzYWdlKSxcbiAgICB9KTtcbiAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRBZ2VudEFuZFNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZW1vcnlQb29sID0gbmVlZHNMYWtlYmFzZSh0aGlzLmNvbmZpZylcbiAgICAgID8gKGxha2ViYXNlUmVzb2x2ZXIuY2FwdHVyZVNlcnZpY2VQcmluY2lwYWxQb29sKFxuICAgICAgICAgIHBsdWdpblJlZ2lzdHJ5LnJlcXVpcmUodGhpcy5jb250ZXh0LCBsYWtlYmFzZSwgdGhpcy5jb25maWcpLmV4cG9ydHMoKS5wb29sLFxuICAgICAgICApIGFzIFBvb2wpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZW1vcnlCdWlsZGVyID0gY3JlYXRlTWVtb3J5QnVpbGRlcih0aGlzLmNvbmZpZywgbWVtb3J5UG9vbCk7XG5cbiAgICAvLyBCdWlsZCBldmVyeSBhZ2VudCBkZWNsYXJlZCBpbiBgY29uZmlnLmFnZW50c2AgKG9yIHRoZSBidWlsdC1pblxuICAgIC8vIGZhbGxiYWNrIHdoZW4gbm9uZSBhcmUgZGVjbGFyZWQpLiBFYWNoIGFnZW50J3MgYG1vZGVsYCByZXNvbHZlc1xuICAgIC8vIHdvcmtzcGFjZSBVUkwgKyBiZWFyZXIgYXQgY2FsbCB0aW1lIHNvIGNvbmN1cnJlbnQgcmVxdWVzdHMgZ2V0XG4gICAgLy8gZGlzdGluY3QgdXNlciBpZGVudGl0aWVzOyB0aGUgYGFzVXNlcihyZXEpYCBzY29wZSBhcm91bmRcbiAgICAvLyBgaGFuZGxlQ2hhdGAgaXMgd2hhdCBsZXRzIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybiB0aGVcbiAgICAvLyByaWdodCB1c2VyIGluc2lkZSB0aGUgcmVzb2x2ZXIuXG4gICAgLy8gTWF0ZXJpYWxpemUgYW55IHJlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIE9OQ0UgYXQgc3RhcnR1cC4gUnVuc1xuICAgIC8vIG91dHNpZGUgYSByZXF1ZXN0IHNjb3BlLCBzbyBpdCB1c2VzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWwncyBjbGllbnRcbiAgICAvLyBhbmQgZGVmYXVsdHMgdG8gdGhlIHNoYXJlZCB3b3Jrc3BhY2UgQXNzaXN0YW50IHNraWxscyB0cmVlOyBhIHNvdXJjZVxuICAgIC8vIGJhY2tlZCBieSBsb2NhbCBvciBtZW1vcnkgc3RvcmFnZSBpcyBjb252ZXJ0ZWQgaW50byBuYXRpdmUgYWdlbnQtbGV2ZWxcbiAgICAvLyBza2lsbHM7IERhdGFicmlja3Mgd29ya3NwYWNlIGRpcmVjdG9yaWVzIHJlbWFpbiBzZWFyY2gtZGlzY292ZXJlZC5cbiAgICBjb25zdCBwcm92aXNpb25lZCA9IGF3YWl0IHByb3Zpc2lvblJlbW90ZVNraWxscyh0aGlzLmNvbmZpZy5yZW1vdGVTa2lsbHMpO1xuICAgIGlmIChwcm92aXNpb25lZC5za2lsbE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJyZW1vdGUgc2tpbGxzIGNvbmZpZ3VyZWRcIiwge1xuICAgICAgICBza2lsbHM6IHByb3Zpc2lvbmVkLnNraWxsTmFtZXMsXG4gICAgICAgIGRhdGFicmlja3NCYXNlUGF0aDogcHJvdmlzaW9uZWQuZGF0YWJyaWNrc0Jhc2VQYXRoLFxuICAgICAgICBsb2NhbFNraWxsTW91bnRzOiBwcm92aXNpb25lZC5sb2NhbFNraWxsTW91bnRzLmxlbmd0aCxcbiAgICAgICAgc3RhbmRhcmRTa2lsbE1vdW50czogcHJvdmlzaW9uZWQuc3RhbmRhcmRTa2lsbE1vdW50cy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhbFNraWxsTW91bnRzID0gW1xuICAgICAgLi4uKHRoaXMuY29uZmlnLmxvY2FsU2tpbGxNb3VudHMgPz8gW10pLFxuICAgICAgLi4ucHJvdmlzaW9uZWQubG9jYWxTa2lsbE1vdW50cyxcbiAgICBdO1xuICAgIGNvbnN0IHN0YW5kYXJkU2tpbGxzID0gYXdhaXQgaW5saW5lU2tpbGxzRnJvbUxvY2FsTW91bnRzKFtcbiAgICAgIC4uLih0aGlzLmNvbmZpZy5sb2NhbFNraWxsTW91bnRzID8/IFtdKSxcbiAgICAgIC4uLnByb3Zpc2lvbmVkLnN0YW5kYXJkU2tpbGxNb3VudHMsXG4gICAgXSk7XG4gICAgdGhpcy5idWlsdCA9IGF3YWl0IGJ1aWxkQWdlbnRzKHtcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsXG4gICAgICBtZW1vcnlCdWlsZGVyLFxuICAgICAgb3V0cHV0UHJvY2Vzc29yRmFjdG9yaWVzOiB0aGlzLm91dHB1dFByb2Nlc3NvckZhY3RvcmllcyxcbiAgICAgIGxvZzogdGhpcy5sb2dnZXIsXG4gICAgICBleHRyYVNraWxsTW91bnRzOiBsb2NhbFNraWxsTW91bnRzLFxuICAgICAgc3RhbmRhcmRTa2lsbHMsXG4gICAgICBleGNsdWRlZFdvcmtzcGFjZVNraWxsTmFtZXM6IHByb3Zpc2lvbmVkLnNraWxsTmFtZXMsXG4gICAgfSk7XG5cbiAgICAvLyBgbWFzdHJhLnNlcnZlci5hcGlSb3V0ZXNgIGlzIG9ubHkgaG9ub3JlZCBieSBNYXN0cmEncyBzdGFuZGFsb25lXG4gICAgLy8gZGV2IHNlcnZlci4gU2luY2Ugd2UncmUgaG9zdGluZyBNYXN0cmEgaW5zaWRlIG91ciBvd24gRXhwcmVzc1xuICAgIC8vIHN1YmFwcCB2aWEgYEBtYXN0cmEvZXhwcmVzc2AsIGN1c3RvbSByb3V0ZXMgbXVzdCBiZSBwYXNzZWQgdG9cbiAgICAvLyB0aGUgYE1hc3RyYVNlcnZlcmAgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgLy9cbiAgICAvLyBgc3RvcmFnZWAgaGVyZSBpcyAqTWFzdHJhLWluc3RhbmNlLWxldmVsKiBhbmQgcGVyc2lzdHMgd29ya2Zsb3dcbiAgICAvLyBzbmFwc2hvdHMgKHdoZXJlIHN1c3BlbmRlZCBgcmVxdWlyZUFwcHJvdmFsYCB0b29sIGNhbGxzIGxpdmUpLlxuICAgIC8vIEl0J3Mgc2VwYXJhdGUgZnJvbSBlYWNoIGFnZW50J3MgYE1lbW9yeS5zdG9yYWdlYCwgd2hpY2ggb25seVxuICAgIC8vIGNvdmVycyB0aHJlYWQgLyBtZXNzYWdlIGhpc3RvcnkuIFdpdGhvdXQgaXQsXG4gICAgLy8gYGFnZW50LnJlc3VtZVN0cmVhbSgpYCBlcnJvcnMgd2l0aCBcImNvdWxkIG5vdCBmaW5kIGEgc3VzcGVuZGVkXG4gICAgLy8gcnVuXCIgYW5kIHRoZSBhcHByb3ZhbCBVSSBoYW5ncyBhZnRlciB0aGUgdXNlciBjbGlja3MgQXBwcm92ZS5cbiAgICBjb25zdCBpbnN0YW5jZVN0b3JhZ2UgPSBtZW1vcnlCdWlsZGVyPy5pbnN0YW5jZVN0b3JhZ2UoKTtcbiAgICAvLyBXaXJlIE1hc3RyYSdzIHRyYWNlciBpbnRvIEFwcEtpdCdzIGdsb2JhbCBPVGVsIHBpcGVsaW5lIHZpYVxuICAgIC8vIGBAbWFzdHJhL290ZWwtYnJpZGdlYC4gTWFzdHJhIHNwYW5zIGJlY29tZSBuYXRpdmUgT1RlbCBzcGFucyBvblxuICAgIC8vIHdoYXRldmVyIHRyYWNlciBwcm92aWRlciBgVGVsZW1ldHJ5TWFuYWdlcmAgcmVnaXN0ZXJlZCBkdXJpbmdcbiAgICAvLyBgY3JlYXRlQXBwYCwgc28gdGhlIE9UTFAgZW5kcG9pbnQgLyBoZWFkZXJzIC8gc2FtcGxpbmcgYXJlXG4gICAgLy8gZW52LWRyaXZlbiBhbmQgc2hhcmVkIHdpdGggZXZlcnkgb3RoZXIgQXBwS2l0IHBsdWdpbi5cbiAgICBjb25zdCBvYnNlcnZhYmlsaXR5ID0gYXdhaXQgYnVpbGRPYnNlcnZhYmlsaXR5KHtcbiAgICAgIHNlcnZpY2VOYW1lOiB0aGlzLm5hbWUsXG4gICAgICBlbmFibGVkOiB0aGlzLmNvbmZpZy5vYnNlcnZhYmlsaXR5LFxuICAgICAgdHJhY2VyUHJvdmlkZXI6IGF3YWl0IGFwcGtpdFRlbGVtZXRyeS5kZWZlcnJlZE5hdGl2ZVRyYWNlclByb3ZpZGVyKCksXG4gICAgfSk7XG4gICAgLy8gT3B0aW9uYWwgTUNQIGV4cG9zdXJlOiBidWlsZCBhIE1hc3RyYSBNQ1Agc2VydmVyIGZyb20gdGhlXG4gICAgLy8gcmVnaXN0ZXJlZCBhZ2VudHMgKGFuZCwgb3B0LWluLCB0aGUgYW1iaWVudCB0b29scykgYW5kIHJlZ2lzdGVyXG4gICAgLy8gaXQgb24gdGhlIE1hc3RyYSBpbnN0YW5jZS4gYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVzIHRoZSBzdG9jayBNQ1BcbiAgICAvLyB0cmFuc3BvcnQgcm91dGVzIChgL21jcC88c2VydmVySWQ+Ly4uLmApIG9mZiBgbWNwU2VydmVyc2AsIHNvIHRoZVxuICAgIC8vIGNhdGNoLWFsbCBkaXNwYXRjaCBiZWxvdyBhbHJlYWR5IHJvdXRlcyBNQ1AgcmVxdWVzdHMgdW5kZXIgT0JPIC1cbiAgICAvLyBubyBiZXNwb2tlIHJvdXRlIG5lZWRlZC4gU2VlIGAuL21jcC5qc2AuXG4gICAgdGhpcy5tY3AgPSBidWlsZE1jcFNlcnZlcih7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgcGx1Z2luTmFtZTogdGhpcy5uYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IE1hc3RyYVBsdWdpbi5tYW5pZmVzdC5kaXNwbGF5TmFtZSxcbiAgICAgIGFnZW50czogdGhpcy5idWlsdC5hZ2VudHMsXG4gICAgICBhbWJpZW50VG9vbHM6IHRoaXMuYnVpbHQuYW1iaWVudFRvb2xzLFxuICAgIH0pO1xuICAgIHRoaXMubWFzdHJhID0gbmV3IE1hc3RyYSh7XG4gICAgICBhZ2VudHM6IHRoaXMuYnVpbHQuYWdlbnRzLFxuICAgICAgLi4uKE9iamVjdC5rZXlzKHRoaXMud29ya2Zsb3dzKS5sZW5ndGggPiAwID8geyB3b3JrZmxvd3M6IHRoaXMud29ya2Zsb3dzIH0gOiB7fSksXG4gICAgICAuLi4oaW5zdGFuY2VTdG9yYWdlID8geyBzdG9yYWdlOiBpbnN0YW5jZVN0b3JhZ2UgfSA6IHt9KSxcbiAgICAgIC4uLihvYnNlcnZhYmlsaXR5ID8geyBvYnNlcnZhYmlsaXR5IH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5tY3AgPyB7IG1jcFNlcnZlcnM6IHsgW3RoaXMubWNwLnNlcnZlcklkXTogdGhpcy5tY3Auc2VydmVyIH0gfSA6IHt9KSxcbiAgICB9KTtcbiAgICB0aGlzLm1hc3RyYUFwcCA9IGV4cHJlc3MoKTtcbiAgICBhdHRhY2hSb3V0ZVBhdGNoTWlkZGxld2FyZSh0aGlzLm1hc3RyYUFwcCk7XG4gICAgLy8gU3RhbXAgY2hhdCByZXF1ZXN0L3Jlc3BvbnNlIG9udG8gdGhlIEhUVFAgcm9vdCBzcGFuIHNvIE1MZmxvdydzXG4gICAgLy8gVUMgYCpfdHJhY2VfdW5pZmllZGAgdmlldyBjYW4gc3VyZmFjZSB0aGVtIChNYXN0cmEncyBvd25cbiAgICAvLyBgbWFzdHJhLmFnZW50X3J1bi4qYCBhdHRyaWJ1dGVzIHNpdCBvbiBhIGNoaWxkIHNwYW4gdGhlIHZpZXdcbiAgICAvLyBuZXZlciByZWFkcykuIE11c3QgcnVuIGJlZm9yZSBgTWFzdHJhU2VydmVyLmluaXRgIHNvIHRoZSBsYXllclxuICAgIC8vIHNpdHMgYWhlYWQgb2YgdGhlIGFnZW50IHJvdXRlcy5cbiAgICBhdHRhY2hDaGF0VHVyblRlbGVtZXRyeSh0aGlzLm1hc3RyYUFwcCwge1xuICAgICAgaWRlbnRpdHk6IChyZXF1ZXN0KSA9PlxuICAgICAgICB1c2VTZXJ2aWNlUHJpbmNpcGFsKHRoaXMuaWRlbnRpdHlNb2RlLCByZXF1ZXN0KSA/IFwic2VydmljZS1wcmluY2lwYWxcIiA6IFwib2JvXCIsXG4gICAgfSk7XG4gICAgdGhpcy5tYXN0cmFTZXJ2ZXIgPSBuZXcgTWFzdHJhU2VydmVyKHRoaXMuY29uZmlnLCB7XG4gICAgICBhcHA6IHRoaXMubWFzdHJhQXBwLFxuICAgICAgbWFzdHJhOiB0aGlzLm1hc3RyYSxcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICAgIGN1c3RvbUFwaVJvdXRlczogW1xuICAgICAgICAuLi5hZ2VudENoYXRSb3V0ZXMoKSxcbiAgICAgICAgd29ya2Zsb3dSb3V0ZSh7XG4gICAgICAgICAgcGF0aDogXCIvcm91dGUvd29ya2Zsb3dzLzp3b3JrZmxvd0lkL3N0cmVhbVwiLFxuICAgICAgICAgIHZlcnNpb246IFwidjdcIixcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMubWFzdHJhU2VydmVyLmluaXQoKTtcbiAgICBhdHRhY2hTdGFsZVJlc3VtZVJlY292ZXJ5KHRoaXMubWFzdHJhQXBwKTtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgYWdlbnRzOiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0LmFnZW50cyksXG4gICAgICB3b3JrZmxvd3M6IE9iamVjdC5rZXlzKHRoaXMud29ya2Zsb3dzKSxcbiAgICAgIGRlZmF1bHRBZ2VudDogdGhpcy5idWlsdC5kZWZhdWx0QWdlbnRJZCxcbiAgICAgIGJhY2tncm91bmRUdXJuczogdGhpcy5jb25maWcuYmFja2dyb3VuZFR1cm5zICE9PSBmYWxzZSxcbiAgICAgIGFwaUFjY2VzczogdGhpcy5jb25maWcuYXBpQWNjZXNzID8/IFwic2NvcGVkXCIsXG4gICAgICBtY3A6IHRoaXMubWNwID8gYCR7dGhpcy5iYXNlUGF0aH0ke3RoaXMubWNwLmh0dHBQYXRofWAgOiBcIm9mZlwiLFxuICAgICAgbGFrZWJhc2U6IG1lbW9yeVBvb2wgIT09IHVuZGVmaW5lZCxcbiAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrTW9kZSgpLFxuICAgICAgb2JzZXJ2YWJpbGl0eTogb2JzZXJ2YWJpbGl0eSAhPT0gdW5kZWZpbmVkID8gXCJtbGZsb3dcIiA6IFwib2ZmXCIsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlciBmb3Igb25lIGVtYmVkIGA8dHlwZT5gIGJlaGluZCB0aGUgZ2VuZXJpY1xuICogYEdFVCAvZW1iZWQvOnR5cGUvOmlkYCByb3V0ZS4gUmV0dXJucyB0aGUgSlNPTiBib2R5IHRvIHNlbmQgb25cbiAqIHN1Y2Nlc3MsIG9yIGB1bmRlZmluZWRgIHRvIHNpZ25hbCBhIDQwNCAodW5rbm93biAvIGV4cGlyZWQgaWQpLlxuICogYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cyBzbyBsb25nLXBvbGxpbmdcbiAqIHJlc29sdmVycyAoZS5nLiBgY2hhcnRgKSB1bmJsb2NrIGltbWVkaWF0ZWx5LlxuICovXG50eXBlIEVtYmVkUmVzb2x2ZXIgPSAoXG4gIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICBpZDogc3RyaW5nLFxuICBzaWduYWw6IEFib3J0U2lnbmFsLFxuKSA9PiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDx1bmtub3duPj47XG5cbi8qKlxuICogUGFyc2UgdGhlIG9wdGlvbmFsIGA/dGltZW91dE1zPTxuPmAgcXVlcnkgcGFyYW1ldGVyIGZyb20gYVxuICogYEdFVCAvZW1iZWQvY2hhcnQvOmlkYCByZXF1ZXN0LiBBY2NlcHRzIGEgcG9zaXRpdmUgaW50ZWdlciB1cFxuICogdG8ge0BsaW5rIE1BWF9FTUJFRF9QT0xMX1RJTUVPVVRfTVN9IChjbGFtcGVkKSBhbmQgcmVqZWN0cyBldmVyeXRoaW5nIGVsc2VcbiAqIGFzIGB1bmRlZmluZWRgIHNvIHtAbGluayBmZXRjaENoYXJ0fSBmYWxscyBiYWNrIHRvIGl0cyBkZWZhdWx0LlxuICogRXhwcmVzcyBwcm9kdWNlcyBgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWRgOyB3ZSBub3JtYWxpemVcbiAqIHRvIHRoZSBmaXJzdCBzY2FsYXIgYmVmb3JlIHBhcnNpbmcuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVGltZW91dE1zKHJhdzogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHYgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIGlmICh0eXBlb2YgdiAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IG9iamVjdC50b051bWJlcih2KTtcbiAgaWYgKG4gPT09IHVuZGVmaW5lZCB8fCBuIDw9IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLmZsb29yKG4pLCBNQVhfRU1CRURfUE9MTF9USU1FT1VUX01TKTtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgb3B0aW9uYWwgYD9saW1pdD08bj5gIHF1ZXJ5IHBhcmFtZXRlciBmcm9tIGFcbiAqIGBHRVQgL2VtYmVkL2RhdGEvOmlkYCByZXF1ZXN0LiBBY2NlcHRzIGEgbm9uLW5lZ2F0aXZlXG4gKiBpbnRlZ2VyIGFuZCBsZXRzIHRoZSByb3V0ZSBjbGFtcCB0byBgU1RBVEVNRU5UX1JPV19DQVBgO1xuICogcmVqZWN0cyBhbnl0aGluZyBlbHNlIGFzIGB1bmRlZmluZWRgIHNvIHRoZSByb3V0ZSBmYWxscyBiYWNrXG4gKiB0byB0aGUgc2VydmVyLXNpZGUgY2FwLlxuICovXG5mdW5jdGlvbiBwYXJzZVN0YXRlbWVudExpbWl0KHJhdzogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHYgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIGlmICh0eXBlb2YgdiAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IG9iamVjdC50b051bWJlcih2KTtcbiAgaWYgKG4gPT09IHVuZGVmaW5lZCB8fCBuIDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGguZmxvb3Iobik7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIE1hc3RyYSBwbHVnaW4gb24gYW4gQXBwS2l0IGFwcC4gTW91bnRzIHRoZSBhZ2VudHMsIHRoZVxuICogYC9yb3V0ZS8qYCBjaGF0IHN1cmZhY2UsIGFuZCAodW5sZXNzIGRpc2FibGVkKSB0aGUgTUNQIHRyYW5zcG9ydCB1bmRlclxuICogYC9hcGkvbWFzdHJhYC5cbiAqXG4gKiBAZXhhbXBsZSBNaW5pbWFsIGFwcFxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiAvLyBObyBgYWdlbnRzYDogYSBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3QgaXMgcmVnaXN0ZXJlZCwgc28gdGhlXG4gKiAvLyBjaGF0IGVuZHBvaW50IHdvcmtzIG91dCBvZiB0aGUgYm94LlxuICogY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwKHsgcGx1Z2luczogW21hc3RyYSgpXSB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFR3byBhZ2VudHMsIGEgcGlubmVkIG1vZGVsLCBhbmQgR2VuaWVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIGxha2ViYXNlIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgY3JlYXRlQWdlbnQsIG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgbGFrZWJhc2UoKSxcbiAqICAgICBtYXN0cmEoe1xuICogICAgICAgZGVmYXVsdE1vZGVsOiBcImRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZcIixcbiAqICAgICAgIGRlZmF1bHRBZ2VudDogXCJhbmFseXN0XCIsXG4gKiAgICAgICBnZW5pZVNwYWNlczogeyBzYWxlczogeyBzcGFjZUlkOiBcIjAxZWYuLi5cIiwgaGludDogXCJvcmRlcnMsIHJldHVybnNcIiB9IH0sXG4gKiAgICAgICBhZ2VudHM6IHtcbiAqICAgICAgICAgYW5hbHlzdDogY3JlYXRlQWdlbnQoe1xuICogICAgICAgICAgIGluc3RydWN0aW9uczogXCJZb3UgYW5zd2VyIHF1ZXN0aW9ucyBhYm91dCBzYWxlcy5cIixcbiAqICAgICAgICAgICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgICAgICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpKSB9O1xuICogICAgICAgICAgIH0sXG4gKiAgICAgICAgIH0pLFxuICogICAgICAgICBoZWxwZXI6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIllvdSBleHBsYWluIHRoZSBhbmFseXN0J3MgYW5zd2Vycy5cIiB9KSxcbiAqICAgICAgIH0sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgbWFzdHJhID0gdG9QbHVnaW4oTWFzdHJhUGx1Z2luKTtcbiJdfQ==
|