@dbx-tools/appkit-mastra 0.9.128 → 0.9.131
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 +90 -31
- package/index.ts +10 -8
- package/lib/index.d.ts +10 -8
- package/lib/index.js +8 -7
- package/lib/src/agents.d.ts +4 -0
- package/lib/src/agents.js +12 -3
- package/lib/src/config.d.ts +7 -2
- package/lib/src/config.js +6 -3
- package/lib/src/defaults.d.ts +9 -0
- package/lib/src/defaults.js +29 -1
- package/lib/src/genie-chat.d.ts +71 -0
- package/lib/src/genie-chat.js +272 -0
- package/lib/src/genie.d.ts +2 -0
- package/lib/src/genie.js +11 -8
- package/lib/src/memory.d.ts +5 -5
- package/lib/src/memory.js +10 -3
- package/lib/src/observability.d.ts +3 -0
- package/lib/src/observability.js +2 -2
- package/lib/src/plugin.d.ts +36 -7
- package/lib/src/plugin.js +220 -33
- package/lib/src/request-context.d.ts +2 -0
- package/lib/src/request-context.js +3 -0
- package/lib/src/server.d.ts +4 -0
- package/lib/src/server.js +40 -2
- package/lib/src/statement.d.ts +16 -1
- package/lib/src/statement.js +50 -18
- package/lib/src/telemetry.d.ts +22 -1
- package/lib/src/telemetry.js +174 -18
- package/lib/src/workspaces.d.ts +2 -2
- package/lib/src/workspaces.js +3 -2
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +32 -25
- package/src/agents.ts +15 -1
- package/src/config.ts +10 -4
- package/src/defaults.ts +30 -0
- package/src/genie-chat.ts +341 -0
- package/src/genie.ts +11 -7
- package/src/memory.ts +9 -4
- package/src/observability.ts +6 -2
- package/src/plugin.ts +262 -31
- package/src/request-context.ts +2 -0
- package/src/server.ts +35 -0
- package/src/statement.ts +71 -19
- package/src/telemetry.ts +206 -16
- package/src/workspaces.ts +4 -3
- package/exports.ts +0 -7
- package/lib/exports.d.ts +0 -1
- package/lib/exports.js +0 -2
- package/lib/src/openapi-tool.d.ts +0 -29
- package/lib/src/openapi-tool.js +0 -175
- package/src/openapi-tool.ts +0 -245
package/lib/src/telemetry.js
CHANGED
|
@@ -18,13 +18,16 @@
|
|
|
18
18
|
* @module
|
|
19
19
|
*/
|
|
20
20
|
import { StringDecoder } from "node:string_decoder";
|
|
21
|
+
import { telemetry as appkitTelemetry } from "@dbx-tools/appkit";
|
|
21
22
|
import { getRequestTags } from "@dbx-tools/appkit/request-tags";
|
|
22
23
|
import { environmentUtils, json, log, object, stringUtils } from "@dbx-tools/shared-core";
|
|
23
24
|
import { feedback, thread } from "@dbx-tools/shared-mastra";
|
|
24
|
-
import {
|
|
25
|
+
import { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY } from "@mastra/core/request-context";
|
|
26
|
+
import { context, createContextKey, SpanKind, SpanStatusCode, trace, } from "@opentelemetry/api";
|
|
25
27
|
import { getRPCMetadata, RPCType } from "@opentelemetry/core";
|
|
28
|
+
import { MASTRA_AUTH_MODE_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_USER_NAME_KEY } from "./config.js";
|
|
26
29
|
import { USER_EMAIL_HEADER, USER_ID_HEADER } from "./identity.js";
|
|
27
|
-
import { directMlflowTracingActive, persistAppMlflowTraceInfo, updateActiveMlflowTrace, updateActiveMlflowTraceTags, } from "./mlflow.js";
|
|
30
|
+
import { directMlflowTracingActive, initializeAppMlflowTraceInfo, persistAppMlflowTraceInfo, updateActiveMlflowTrace, updateActiveMlflowTraceTags, } from "./mlflow.js";
|
|
28
31
|
import { APPKIT_AGENT_TRACE_ROOT_ATTR, MLFLOW_AGENT_TAG, MLFLOW_AGENT_TAG_ATTR, MLFLOW_GENIE_TAG, MLFLOW_GENIE_TAG_ATTR, MLFLOW_LOCAL_TAG, MLFLOW_OBO_AUTH_TAG, MLFLOW_SP_AUTH_TAG, MLFLOW_TRACE_TAG_PREFIX, } from "./trace-attributes.js";
|
|
29
32
|
export { MLFLOW_AGENT_TAG, MLFLOW_AGENT_TAG_ATTR, APPKIT_AGENT_TRACE_ROOT_ATTR, MLFLOW_GENIE_TAG, MLFLOW_GENIE_TAG_ATTR, MLFLOW_LOCAL_TAG, MLFLOW_LOCAL_TAG_ATTR, MLFLOW_OBO_AUTH_TAG, MLFLOW_OBO_AUTH_TAG_ATTR, MLFLOW_SP_AUTH_TAG, MLFLOW_SP_AUTH_TAG_ATTR, MLFLOW_TRACE_TAG_PREFIX, } from "./trace-attributes.js";
|
|
30
33
|
const logger = log.logger("mastra/telemetry");
|
|
@@ -40,7 +43,7 @@ const CHAT_TURN_TRACER = "@dbx-tools/appkit-mastra/telemetry";
|
|
|
40
43
|
* are intentionally excluded: their bodies are tool decisions, not the
|
|
41
44
|
* user prompt, and they rarely produce a fresh answer worth surfacing.
|
|
42
45
|
*/
|
|
43
|
-
const AGENT_TURN_ROUTE =
|
|
46
|
+
const AGENT_TURN_ROUTE = /(?:^|\/)(?:agents\/[^/]+\/(?:stream|generate)|chat\/[^/]+)\/?$/i;
|
|
44
47
|
/** Attribute keys the MLflow UC `*_trace_unified` view reads from the root span. */
|
|
45
48
|
export const MLFLOW_SPAN_INPUTS_ATTR = "mlflow.spanInputs";
|
|
46
49
|
/** Root-span attribute consumed as chat output by MLflow unified trace views. */
|
|
@@ -115,6 +118,24 @@ function traceId(span = trace.getActiveSpan()) {
|
|
|
115
118
|
function activeChatTraceState() {
|
|
116
119
|
return context.active().getValue(CHAT_TRACE_STATE_KEY);
|
|
117
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Bind a Mastra agent run to the trace selected by chat telemetry.
|
|
123
|
+
*
|
|
124
|
+
* Databricks Apps uses a dedicated agent trace because evented agents finish
|
|
125
|
+
* before the HTTP server span. Promoting MLflow trace info after the agent root
|
|
126
|
+
* closes avoids the sidecar replacing clean previews and tags with empty HTTP
|
|
127
|
+
* trace metadata. Other runtimes retain the existing HTTP/local parentage.
|
|
128
|
+
*/
|
|
129
|
+
export function activeChatTracingOptions(options) {
|
|
130
|
+
const state = activeChatTraceState();
|
|
131
|
+
if (!state)
|
|
132
|
+
return options;
|
|
133
|
+
return {
|
|
134
|
+
...options,
|
|
135
|
+
traceId: state.traceId,
|
|
136
|
+
...(state.parentSpanId ? { parentSpanId: state.parentSpanId } : { parentSpanId: undefined }),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
118
139
|
function setChatTraceTag(state, name, value) {
|
|
119
140
|
const tag = stringUtils.trimToNull(name);
|
|
120
141
|
if (!tag)
|
|
@@ -166,10 +187,9 @@ export function recordActiveTraceAuth(auth) {
|
|
|
166
187
|
recordActiveTraceTag(auth === "obo" ? MLFLOW_OBO_AUTH_TAG : MLFLOW_SP_AUTH_TAG);
|
|
167
188
|
}
|
|
168
189
|
/** Publish the turn's MLflow trace id before the handler writes the body. */
|
|
169
|
-
function stampMlflowTraceId(res,
|
|
190
|
+
function stampMlflowTraceId(res, traceId) {
|
|
170
191
|
if (res.headersSent)
|
|
171
192
|
return;
|
|
172
|
-
const traceId = span.spanContext().traceId;
|
|
173
193
|
if (!traceId || traceId === INVALID_TRACE_ID)
|
|
174
194
|
return;
|
|
175
195
|
res.setHeader(feedback.MLFLOW_TRACE_ID_HEADER, `tr-${traceId}`);
|
|
@@ -261,6 +281,136 @@ export function assistantTextFromJson(body) {
|
|
|
261
281
|
return "";
|
|
262
282
|
return body.text.slice(0, TRACE_IO_LIMIT);
|
|
263
283
|
}
|
|
284
|
+
const MASTRA_AGENT_INPUT_ATTR = "mastra.agent_run.input";
|
|
285
|
+
const MASTRA_AGENT_OUTPUT_ATTR = "mastra.agent_run.output";
|
|
286
|
+
const GEN_AI_REQUEST_MODEL_ATTR = "gen_ai.request.model";
|
|
287
|
+
const GEN_AI_AGENT_ID_ATTR = "gen_ai.agent.id";
|
|
288
|
+
const GEN_AI_AGENT_NAME_ATTR = "gen_ai.agent.name";
|
|
289
|
+
const MASTRA_MODEL_METADATA_ATTR = "mastra.metadata.modelMetadata";
|
|
290
|
+
const MASTRA_METADATA_PREFIX = "mastra.metadata.";
|
|
291
|
+
function attributeString(span, name) {
|
|
292
|
+
const value = span.attributes[name];
|
|
293
|
+
return typeof value === "string" ? (stringUtils.trimToNull(value) ?? undefined) : undefined;
|
|
294
|
+
}
|
|
295
|
+
function metadataAttribute(key) {
|
|
296
|
+
return `${MASTRA_METADATA_PREFIX}${key}`;
|
|
297
|
+
}
|
|
298
|
+
function modelFromSpan(span) {
|
|
299
|
+
const direct = attributeString(span, GEN_AI_REQUEST_MODEL_ATTR);
|
|
300
|
+
if (direct)
|
|
301
|
+
return direct;
|
|
302
|
+
const metadata = json.parse(attributeString(span, MASTRA_MODEL_METADATA_ATTR));
|
|
303
|
+
return object.isRecord(metadata) && typeof metadata.modelId === "string"
|
|
304
|
+
? (stringUtils.trimToNull(metadata.modelId) ?? undefined)
|
|
305
|
+
: undefined;
|
|
306
|
+
}
|
|
307
|
+
function spanUsesGenie(span) {
|
|
308
|
+
if (span.attributes[MLFLOW_GENIE_TAG_ATTR] === "true")
|
|
309
|
+
return true;
|
|
310
|
+
if (/\bask_genie(?:_|\b)/i.test(span.name))
|
|
311
|
+
return true;
|
|
312
|
+
return ["gen_ai.tool.name", "mastra.tool_call.name"].some((name) => /^ask_genie(?:_|$)/i.test(attributeString(span, name) ?? ""));
|
|
313
|
+
}
|
|
314
|
+
function collectTraceTags(span, state) {
|
|
315
|
+
for (const [name, value] of Object.entries(span.attributes)) {
|
|
316
|
+
if (!name.startsWith(MLFLOW_TRACE_TAG_PREFIX))
|
|
317
|
+
continue;
|
|
318
|
+
const tag = name.slice(MLFLOW_TRACE_TAG_PREFIX.length);
|
|
319
|
+
if (tag &&
|
|
320
|
+
(typeof value === "string" || typeof value === "number" || typeof value === "boolean")) {
|
|
321
|
+
state.tags.set(tag, String(value));
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
function hrTimeMilliseconds(value) {
|
|
326
|
+
return value[0] * 1_000 + value[1] / 1_000_000;
|
|
327
|
+
}
|
|
328
|
+
function previewInput(span) {
|
|
329
|
+
const raw = attributeString(span, MASTRA_AGENT_INPUT_ATTR);
|
|
330
|
+
if (!raw)
|
|
331
|
+
return undefined;
|
|
332
|
+
return (textOnlyChatInput(json.parse(raw)) ?? raw).slice(0, TRACE_IO_LIMIT);
|
|
333
|
+
}
|
|
334
|
+
function previewOutput(span) {
|
|
335
|
+
const raw = attributeString(span, MASTRA_AGENT_OUTPUT_ATTR);
|
|
336
|
+
if (!raw)
|
|
337
|
+
return undefined;
|
|
338
|
+
const parsed = json.parse(raw);
|
|
339
|
+
const text = assistantTextFromJson(parsed) || (typeof parsed === "string" ? parsed : raw);
|
|
340
|
+
return text.slice(0, TRACE_IO_LIMIT);
|
|
341
|
+
}
|
|
342
|
+
/** Promote the actual Mastra `invoke_agent` trace exported by AppKit's provider. */
|
|
343
|
+
export class AppMlflowTraceInfoSpanProcessor {
|
|
344
|
+
traces = new Map();
|
|
345
|
+
onStart(span, _parentContext) {
|
|
346
|
+
const traceId = span.spanContext().traceId;
|
|
347
|
+
if (!this.traces.has(traceId)) {
|
|
348
|
+
this.traces.set(traceId, { tags: new Map(), genie: false });
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
onEnd(span) {
|
|
352
|
+
const traceId = span.spanContext().traceId;
|
|
353
|
+
const state = this.traces.get(traceId) ?? {
|
|
354
|
+
tags: new Map(),
|
|
355
|
+
genie: false,
|
|
356
|
+
};
|
|
357
|
+
this.traces.set(traceId, state);
|
|
358
|
+
collectTraceTags(span, state);
|
|
359
|
+
state.model ??= modelFromSpan(span);
|
|
360
|
+
state.genie ||= spanUsesGenie(span);
|
|
361
|
+
if (attributeString(span, GEN_AI_OPERATION_NAME_ATTR) !== "invoke_agent") {
|
|
362
|
+
if (!span.parentSpanContext?.spanId)
|
|
363
|
+
this.traces.delete(traceId);
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
const agent = state.model ??
|
|
367
|
+
attributeString(span, GEN_AI_AGENT_ID_ATTR) ??
|
|
368
|
+
attributeString(span, GEN_AI_AGENT_NAME_ATTR);
|
|
369
|
+
if (agent)
|
|
370
|
+
state.tags.set(MLFLOW_AGENT_TAG, agent);
|
|
371
|
+
if (state.genie)
|
|
372
|
+
state.tags.set(MLFLOW_GENIE_TAG, "true");
|
|
373
|
+
const auth = attributeString(span, metadataAttribute(MASTRA_AUTH_MODE_KEY));
|
|
374
|
+
if (auth === "obo")
|
|
375
|
+
state.tags.set(MLFLOW_OBO_AUTH_TAG, "true");
|
|
376
|
+
else if (auth === "service-principal")
|
|
377
|
+
state.tags.set(MLFLOW_SP_AUTH_TAG, "true");
|
|
378
|
+
const user = attributeString(span, metadataAttribute(MASTRA_USER_EMAIL_KEY)) ??
|
|
379
|
+
attributeString(span, metadataAttribute(MASTRA_USER_NAME_KEY)) ??
|
|
380
|
+
attributeString(span, metadataAttribute(MASTRA_RESOURCE_ID_KEY));
|
|
381
|
+
const sessionId = attributeString(span, metadataAttribute(MASTRA_THREAD_ID_KEY)) ??
|
|
382
|
+
attributeString(span, "gen_ai.conversation.id");
|
|
383
|
+
const requestPreview = previewInput(span);
|
|
384
|
+
const responsePreview = previewOutput(span);
|
|
385
|
+
persistAppMlflowTraceInfo({
|
|
386
|
+
traceId,
|
|
387
|
+
requestTime: hrTimeMilliseconds(span.startTime),
|
|
388
|
+
executionDuration: hrTimeMilliseconds(span.duration),
|
|
389
|
+
error: span.status.code === SpanStatusCode.ERROR,
|
|
390
|
+
tags: Object.fromEntries(state.tags),
|
|
391
|
+
...(user ? { user } : {}),
|
|
392
|
+
...(sessionId ? { sessionId } : {}),
|
|
393
|
+
...(requestPreview ? { requestPreview } : {}),
|
|
394
|
+
...(responsePreview ? { responsePreview } : {}),
|
|
395
|
+
});
|
|
396
|
+
this.traces.delete(traceId);
|
|
397
|
+
}
|
|
398
|
+
async forceFlush() { }
|
|
399
|
+
async shutdown() {
|
|
400
|
+
this.traces.clear();
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
let appMlflowTraceInfoProcessorRegistered = false;
|
|
404
|
+
/** Register trace enrichment before AppKit constructs its native provider. */
|
|
405
|
+
export async function registerAppMlflowTraceInfoProcessor() {
|
|
406
|
+
if (appMlflowTraceInfoProcessorRegistered)
|
|
407
|
+
return true;
|
|
408
|
+
if (!(await initializeAppMlflowTraceInfo()))
|
|
409
|
+
return false;
|
|
410
|
+
await appkitTelemetry.registerNativeSpanProcessor(new AppMlflowTraceInfoSpanProcessor());
|
|
411
|
+
appMlflowTraceInfoProcessorRegistered = true;
|
|
412
|
+
return true;
|
|
413
|
+
}
|
|
264
414
|
/** Incrementally assemble UTF-8 SSE text while retaining a bounded JSON fallback. */
|
|
265
415
|
class AssistantResponseCollector {
|
|
266
416
|
decoder = new StringDecoder("utf8");
|
|
@@ -396,7 +546,11 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
|
|
|
396
546
|
next();
|
|
397
547
|
return;
|
|
398
548
|
}
|
|
399
|
-
const traceState = {
|
|
549
|
+
const traceState = {
|
|
550
|
+
tags: new Map(),
|
|
551
|
+
traceId: targetTraceId,
|
|
552
|
+
parentSpanId: target.span.spanContext().spanId,
|
|
553
|
+
};
|
|
400
554
|
const traceRequestTime = Date.now();
|
|
401
555
|
if (!environmentUtils.isDatabricksAppEnv()) {
|
|
402
556
|
setChatTraceTag(traceState, MLFLOW_LOCAL_TAG, true);
|
|
@@ -411,7 +565,7 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
|
|
|
411
565
|
setChatTraceTag(traceState, name, value);
|
|
412
566
|
}
|
|
413
567
|
}
|
|
414
|
-
stampMlflowTraceId(res,
|
|
568
|
+
stampMlflowTraceId(res, traceState.traceId);
|
|
415
569
|
traceState.user = stampMlflowActor(target.span, req);
|
|
416
570
|
target.span.setAttribute(MLFLOW_SPAN_TYPE_ATTR, MLFLOW_SPAN_TYPE_AGENT);
|
|
417
571
|
target.span.setAttribute(GEN_AI_OPERATION_NAME_ATTR, "invoke_agent");
|
|
@@ -479,16 +633,18 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
|
|
|
479
633
|
...(traceState.user ? { user: traceState.user } : {}),
|
|
480
634
|
});
|
|
481
635
|
});
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
636
|
+
if (!environmentUtils.isDatabricksAppEnv()) {
|
|
637
|
+
persistAppMlflowTraceInfo({
|
|
638
|
+
traceId: traceState.traceId,
|
|
639
|
+
requestTime: traceRequestTime,
|
|
640
|
+
executionDuration: Date.now() - traceRequestTime,
|
|
641
|
+
error: res.statusCode >= 500,
|
|
642
|
+
tags,
|
|
643
|
+
...(traceState.user ? { user: traceState.user } : {}),
|
|
644
|
+
...(requestPreview ? { requestPreview } : {}),
|
|
645
|
+
...(responsePreview ? { responsePreview } : {}),
|
|
646
|
+
});
|
|
647
|
+
}
|
|
492
648
|
};
|
|
493
649
|
const endOwnedSpan = () => {
|
|
494
650
|
if (!target.owned || ownedSpanEnded)
|
|
@@ -544,4 +700,4 @@ export function attachChatTurnTelemetry(app, options = {}) {
|
|
|
544
700
|
app.use((req, res, next) => chatTurnTelemetryMiddleware(req, res, next, options));
|
|
545
701
|
logger.info("chat turn telemetry middleware attached", options);
|
|
546
702
|
}
|
|
547
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUNMLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLDJCQUEyQixHQUM1QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQix1QkFBdUIsR0FDeEIsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQiw0QkFBNEIsRUFDNUIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQix3QkFB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UUFDN0IsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLEdBQW9CLEVBQ3BCLFVBQW9DLEVBQUU7SUFFdEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sQ0FBQyxJQUFJLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weSBlYWNoIE1hc3RyYSBjaGF0IHR1cm4ncyByZXF1ZXN0L3Jlc3BvbnNlIG9udG8gaXRzIE9UZWwgcm9vdCBzcGFuXG4gKiBzbyBEYXRhYnJpY2tzLW1hbmFnZWQgTUxmbG93IGNhbiBkaXNwbGF5IHRoZW0uXG4gKlxuICogV2h5IHRoaXMgZXhpc3RzOiBNTGZsb3cncyBVQyBgPHRhcmdldD5fdHJhY2VfdW5pZmllZGAgdmlldyBwaWNrcyB0aGVcbiAqIG9uZSBzcGFuIHdob3NlIGBwYXJlbnRfc3Bhbl9pZGAgaXMgZW1wdHkgYW5kIHJlYWRzIHJlcXVlc3QvcmVzcG9uc2VcbiAqIGZyb20gYG1sZmxvdy5zcGFuSW5wdXRzYCAvIGBtbGZsb3cuc3Bhbk91dHB1dHNgIChvciB0aGUgYGdlbl9haS4qYFxuICogZXF1aXZhbGVudHMpIG9uIFRIQVQgc3BhbiBvbmx5LiBNYXN0cmEgcmVjb3JkcyB0aGUgdHVybiBvbiBpdHNcbiAqIGBpbnZva2VfYWdlbnRgIGNoaWxkIHVuZGVyIGBtYXN0cmEuYWdlbnRfcnVuLmlucHV0YCAvIGAub3V0cHV0YCwga2V5c1xuICogdGhlIHZpZXcgbmV2ZXIgcmVhZHMsIHNvIGNoYXQgdHJhY2VzIGFycml2ZSB3aXRoIGJvdGggY29sdW1ucyBudWxsXG4gKiBldmVuIHdoZW4gdGhlIHNwYW5zIHRoZW1zZWx2ZXMgbG9vayBoZWFsdGh5LlxuICpcbiAqIEFwcEtpdCdzIEhUVFAgaW5zdHJ1bWVudGF0aW9uIHJlY29yZHMgdGhlIHNlcnZlciBzcGFuIGluIE9UZWwgUlBDIG1ldGFkYXRhLFxuICogd2hpY2ggcmVtYWlucyBhdmFpbGFibGUgZXZlbiB3aGVuIEV4cHJlc3MgbWFrZXMgYSBtaWRkbGV3YXJlLWxheWVyIGNoaWxkXG4gKiBhY3RpdmUuIFdoZW4gaW5zdHJ1bWVudGF0aW9uIGlzIHVuYXZhaWxhYmxlLCB0aGlzIG1vZHVsZSBjcmVhdGVzIG9uZVxuICogcmVxdWVzdC1saWZldGltZSBzZXJ2ZXIgc3BhbiBhbmQgcnVucyBNYXN0cmEgdW5kZXIgaXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tIFwibm9kZTpzdHJpbmdfZGVjb2RlclwiO1xuXG5pbXBvcnQgeyBnZXRSZXF1ZXN0VGFncyB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC9yZXF1ZXN0LXRhZ3NcIjtcbmltcG9ydCB7IGVudmlyb25tZW50VXRpbHMsIGpzb24sIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjaywgdGhyZWFkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgY29udGV4dCwgY3JlYXRlQ29udGV4dEtleSwgU3BhbktpbmQsIHRyYWNlLCB0eXBlIFNwYW4gfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgeyBnZXRSUENNZXRhZGF0YSwgUlBDVHlwZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9jb3JlXCI7XG5pbXBvcnQgdHlwZSBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5cbmltcG9ydCB7IFVTRVJfRU1BSUxfSEVBREVSLCBVU0VSX0lEX0hFQURFUiB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQge1xuICBkaXJlY3RNbGZsb3dUcmFjaW5nQWN0aXZlLFxuICBwZXJzaXN0QXBwTWxmbG93VHJhY2VJbmZvLFxuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSxcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzLFxufSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcbmltcG9ydCB7XG4gIEFQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFIsXG4gIE1MRkxPV19BR0VOVF9UQUcsXG4gIE1MRkxPV19BR0VOVF9UQUdfQVRUUixcbiAgTUxGTE9XX0dFTklFX1RBRyxcbiAgTUxGTE9XX0dFTklFX1RBR19BVFRSLFxuICBNTEZMT1dfTE9DQUxfVEFHLFxuICBNTEZMT1dfT0JPX0FVVEhfVEFHLFxuICBNTEZMT1dfU1BfQVVUSF9UQUcsXG4gIE1MRkxPV19UUkFDRV9UQUdfUFJFRklYLFxufSBmcm9tIFwiLi90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5cbmV4cG9ydCB7XG4gIE1MRkxPV19BR0VOVF9UQUcsXG4gIE1MRkxPV19BR0VOVF9UQUdfQVRUUixcbiAgQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUixcbiAgTUxGTE9XX0dFTklFX1RBRyxcbiAgTUxGTE9XX0dFTklFX1RBR19BVFRSLFxuICBNTEZMT1dfTE9DQUxfVEFHLFxuICBNTEZMT1dfTE9DQUxfVEFHX0FUVFIsXG4gIE1MRkxPV19PQk9fQVVUSF9UQUcsXG4gIE1MRkxPV19PQk9fQVVUSF9UQUdfQVRUUixcbiAgTUxGTE9XX1NQX0FVVEhfVEFHLFxuICBNTEZMT1dfU1BfQVVUSF9UQUdfQVRUUixcbiAgTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgsXG59IGZyb20gXCIuL3RyYWNlLWF0dHJpYnV0ZXMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS90ZWxlbWV0cnlcIik7XG5cbi8qKiBDYXAgb24gZWFjaCBwYXlsb2FkIGNvcGllZCBvbnRvIGEgc3Bhbiwgc28gb25lIHR1cm4gY2Fubm90IGJsb2F0IHRoZSBleHBvcnQuICovXG5leHBvcnQgY29uc3QgVFJBQ0VfSU9fTElNSVQgPSA4XzAwMDtcblxuLyoqIEJvdW5kIGZvciBhIG5vbi1zdHJlYW1pbmcgYm9keSBjYXB0dXJlZCB0aHJvdWdoIGByZXMuZW5kYCBpbnN0ZWFkIG9mIGByZXMuanNvbmAuICovXG5jb25zdCBSRVNQT05TRV9CT0RZX0xJTUlUID0gVFJBQ0VfSU9fTElNSVQgKiA0O1xuXG4vKiogVHJhY2VyIHNjb3BlIHVzZWQgb25seSB3aGVuIEFwcEtpdCBkaWQgbm90IGNyZWF0ZSBhIHJlY29yZGluZyBIVFRQIHNwYW4uICovXG5jb25zdCBDSEFUX1RVUk5fVFJBQ0VSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEvdGVsZW1ldHJ5XCI7XG5cbi8qKlxuICogTW91bnQtcmVsYXRpdmUgTWFzdHJhIGFnZW50IGludm9rZSBwYXRocyB0aGF0IGNhcnJ5IGEgY2hhdCB0dXJuIGJvZHlcbiAqIChgbWVzc2FnZXNgKSBhbmQgc3RyZWFtIGFuIGFzc2lzdGFudCBhbnN3ZXIuIFJlc3VtZSAvIGFwcHJvdmUgdmVyYnNcbiAqIGFyZSBpbnRlbnRpb25hbGx5IGV4Y2x1ZGVkOiB0aGVpciBib2RpZXMgYXJlIHRvb2wgZGVjaXNpb25zLCBub3QgdGhlXG4gKiB1c2VyIHByb21wdCwgYW5kIHRoZXkgcmFyZWx5IHByb2R1Y2UgYSBmcmVzaCBhbnN3ZXIgd29ydGggc3VyZmFjaW5nLlxuICovXG5jb25zdCBBR0VOVF9UVVJOX1JPVVRFID0gL14oPzpcXC9hZ2VudHNcXC9bXi9dK1xcLyg/OnN0cmVhbXxnZW5lcmF0ZSkoPzpcXC98JCl8XFwvY2hhdFxcL1teL10rJCkvaTtcblxuLyoqIEF0dHJpYnV0ZSBrZXlzIHRoZSBNTGZsb3cgVUMgYCpfdHJhY2VfdW5pZmllZGAgdmlldyByZWFkcyBmcm9tIHRoZSByb290IHNwYW4uICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fSU5QVVRTX0FUVFIgPSBcIm1sZmxvdy5zcGFuSW5wdXRzXCI7XG4vKiogUm9vdC1zcGFuIGF0dHJpYnV0ZSBjb25zdW1lZCBhcyBjaGF0IG91dHB1dCBieSBNTGZsb3cgdW5pZmllZCB0cmFjZSB2aWV3cy4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIgPSBcIm1sZmxvdy5zcGFuT3V0cHV0c1wiO1xuLyoqIEZ1bGwgc2VyaWFsaXplZCByZXF1ZXN0IG1lc3NhZ2VzIHJldGFpbmVkIHdoZW4gdGhlIE1MZmxvdyBwcmV2aWV3IGlzIHBsYWluIHRleHQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9NRVNTQUdFU19BVFRSID0gXCJhcHBraXQubWFzdHJhLmNoYXQubWVzc2FnZXNcIjtcbi8qKiBGdWxsIHNlcmlhbGl6ZWQgcmVzcG9uc2UgcmV0YWluZWQgd2hlbiB0aGUgTUxmbG93IHByZXZpZXcgaXMgcGxhaW4gdGV4dC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX1JFU1BPTlNFX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuY2hhdC5yZXNwb25zZVwiO1xuLyoqIENyZWRlbnRpYWwgbW9kZSB1c2VkIGJ5IERhdGFicmlja3MgY2FsbHMgaW4gdGhpcyBjaGF0IHR1cm4uICovXG5leHBvcnQgY29uc3QgQ0hBVF9JREVOVElUWV9BVFRSID0gXCJhcHBraXQubWFzdHJhLmlkZW50aXR5Lm1vZGVcIjtcbi8qKiBXaGV0aGVyIHRoZSBzdHJlYW1lZCB0dXJuIGVtaXR0ZWQgYSBHZW5pZSB0b29sIG9yIHByb2dyZXNzIGV2ZW50LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfR0VOSUVfVVNFRF9BVFRSID0gXCJhcHBraXQubWFzdHJhLmdlbmllLnVzZWRcIjtcbi8qKlxuICogTUxmbG93IHNwYW4tdHlwZSBhdHRyaWJ1dGUuIERhdGFicmlja3MgbWFwcyB0aGlzIChvciBgZ2VuX2FpLm9wZXJhdGlvbi5uYW1lYClcbiAqIG9udG8gdGhlIHR5cGUgY2hpcCBpbiB0aGUgZXhwZXJpbWVudCBVSS4gQ3VzdG9tIHZhbHVlcyBzdWNoIGFzIGBHRU5JRWAgYXJlXG4gKiBhbGxvd2VkLlxuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9BVFRSID0gXCJtbGZsb3cuc3BhblR5cGVcIjtcbi8qKiBHZW5BSSBzZW1hbnRpYy1jb252ZW50aW9uIG9wZXJhdGlvbiBuYW1lLCBhbiBhbHRlcm5hdGUgc3Bhbi10eXBlIHNvdXJjZS4gKi9cbmV4cG9ydCBjb25zdCBHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUiA9IFwiZ2VuX2FpLm9wZXJhdGlvbi5uYW1lXCI7XG4vKipcbiAqIFJvb3Qtc3BhbiB1c2VyIGlkIHRoZSBNTGZsb3cgZXhwZXJpbWVudCBVSSdzIFVzZXIgY29sdW1uIHJlYWRzIGZyb20gT1RlbFxuICogdHJhY2VzLiBQcmVmZXIgdGhlIGZvcndhcmRlZCBlbWFpbCB3aGVuIHByZXNlbnQgc28gdGhlIGNvbHVtbiBpcyBodW1hbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19VU0VSX0FUVFIgPSBcInVzZXIuaWRcIjtcbi8qKiBSb290LXNwYW4gc2Vzc2lvbiBpZCB0aGF0IGVuYWJsZXMgdGhlIE1MZmxvdyBTZXNzaW9ucyB0YWIuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NFU1NJT05fQVRUUiA9IFwic2Vzc2lvbi5pZFwiO1xuLyoqIFJvb3Qtc3BhbiB0eXBlIGZvciBhIE1hc3RyYSBhZ2VudCB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQgPSBcIkFHRU5UXCI7XG4vKiogU3BhbiB0eXBlIGZvciBhbiBgYXNrX2dlbmllYCB0b29sIGNhbGwuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9HRU5JRSA9IFwiR0VOSUVcIjtcblxuLyoqIFJvb3Qtc3BhbiBtZXRhZGF0YSBrbm93biBiZWZvcmUgYSBjaGF0IHJlcXVlc3QgaXMgZGlzcGF0Y2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zIHtcbiAgcmVhZG9ubHkgaWRlbnRpdHk/OlxuICAgIFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIgfCAoKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCkgPT4gXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIik7XG4gIC8qKiBJbml0aWFsIHRyYWNlIHRhZ3MgZGVyaXZlZCBmcm9tIHRoZSBpbmJvdW5kIHJlcXVlc3QuICovXG4gIHJlYWRvbmx5IHRhZ3M/OlxuICAgIHwgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+PlxuICAgIHwgKChyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QpID0+IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYXRUcmFjZVRhZ1ZhbHVlIHwgdW5kZWZpbmVkPj4pO1xufVxuXG5pbnRlcmZhY2UgVHJhY2VUYXJnZXQge1xuICBzcGFuOiBTcGFuO1xuICBvd25lZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENoYXRUcmFjZVN0YXRlIHtcbiAgcmVhZG9ubHkgdGFnczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgZmlyc3RNb2RlbD86IHN0cmluZztcbiAgdXNlcj86IHN0cmluZztcbn1cblxuLyoqIFZhbHVlcyBhY2NlcHRlZCBieSByZXF1ZXN0LXNjb3BlZCB0cmFjZS10YWcgaW5qZWN0aW9uIGhlbHBlcnMuICovXG5leHBvcnQgdHlwZSBDaGF0VHJhY2VUYWdWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbmNvbnN0IENIQVRfVFJBQ0VfU1RBVEVfS0VZID0gY3JlYXRlQ29udGV4dEtleShcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS9jaGF0LXRyYWNlLXN0YXRlXCIpO1xuXG4vKiogT3BlblRlbGVtZXRyeSdzIHNlbnRpbmVsIGZvciBcIm5vIHZhbGlkIHRyYWNlXCIgLSAzMiB6ZXJvIGhleCBjaGFycy4gKi9cbmNvbnN0IElOVkFMSURfVFJBQ0VfSUQgPSBcIjBcIi5yZXBlYXQoMzIpO1xuXG4vKipcbiAqIE1hcmsgdGhlIGFjdGl2ZSBzcGFuIGFzIGEgR2VuaWUgY2FsbCBzbyB0aGUgZXhwZXJpbWVudCBVSSB0eXBlcyBpdCBgR0VOSUVgXG4gKiBhbmQgdGFncyB0aGUgdHJhY2UgYGdlbmllPXRydWVgLiBTYWZlIG5vLW9wIHdoZW4gbm8gcmVjb3JkaW5nIHNwYW4gaXMgYWN0aXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbXBHZW5pZVRvb2xTcGFuKHNwYW46IFNwYW4gfCB1bmRlZmluZWQgPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCkpOiB2b2lkIHtcbiAgaWYgKCFzcGFuPy5pc1JlY29yZGluZygpKSByZXR1cm47XG4gIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TUEFOX1RZUEVfQVRUUiwgTUxGTE9XX1NQQU5fVFlQRV9HRU5JRSk7XG4gIHNwYW4uc2V0QXR0cmlidXRlKEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSLCBcImV4ZWN1dGVfdG9vbFwiKTtcbiAgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX0dFTklFX1RBR19BVFRSLCBcInRydWVcIik7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIZWFkZXIocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZyb21NZXRob2QgPVxuICAgIHR5cGVvZiByZXEuaGVhZGVyID09PSBcImZ1bmN0aW9uXCIgPyBzdHJpbmdVdGlscy50cmltVG9OdWxsKHJlcS5oZWFkZXIobmFtZSkpIDogdW5kZWZpbmVkO1xuICBpZiAoZnJvbU1ldGhvZCkgcmV0dXJuIGZyb21NZXRob2Q7XG4gIGNvbnN0IHJhdyA9IHJlcS5oZWFkZXJzPy5bbmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgY29uc3QgdmFsdWUgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdW5kZWZpbmVkKSA/PyB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RRdWVyeShyZXE6IGV4cHJlc3MuUmVxdWVzdCwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gcmVxLnF1ZXJ5Py5bbmFtZV07XG4gIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzdGFtcE1sZmxvd0FjdG9yKHNwYW46IFNwYW4sIHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RIZWFkZXIocmVxLCBVU0VSX0VNQUlMX0hFQURFUikgPz8gcmVxdWVzdEhlYWRlcihyZXEsIFVTRVJfSURfSEVBREVSKTtcbiAgaWYgKHVzZXIpIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHVzZXIpO1xuICBjb25zdCBzZXNzaW9uID1cbiAgICByZXF1ZXN0SGVhZGVyKHJlcSwgdGhyZWFkLlRIUkVBRF9JRF9IRUFERVIpID8/IHJlcXVlc3RRdWVyeShyZXEsIHRocmVhZC5USFJFQURfSURfUVVFUlkpO1xuICBpZiAoc2Vzc2lvbikgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NFU1NJT05fQVRUUiwgc2Vzc2lvbik7XG4gIHJldHVybiB1c2VyO1xufVxuXG5mdW5jdGlvbiB0cmFjZUlkKHNwYW46IFNwYW4gfCB1bmRlZmluZWQgPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZSA9IHNwYW4/LnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgcmV0dXJuIHZhbHVlICYmIHZhbHVlICE9PSBJTlZBTElEX1RSQUNFX0lEID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk6IENoYXRUcmFjZVN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRleHQuYWN0aXZlKCkuZ2V0VmFsdWUoQ0hBVF9UUkFDRV9TVEFURV9LRVkpIGFzIENoYXRUcmFjZVN0YXRlIHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzZXRDaGF0VHJhY2VUYWcoc3RhdGU6IENoYXRUcmFjZVN0YXRlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBDaGF0VHJhY2VUYWdWYWx1ZSk6IHZvaWQge1xuICBjb25zdCB0YWcgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG5hbWUpO1xuICBpZiAoIXRhZykgcmV0dXJuO1xuICBzdGF0ZS50YWdzLnNldCh0YWcsIFN0cmluZyh2YWx1ZSkpO1xufVxuXG4vKiogSW5qZWN0IG9uZSBNTGZsb3cgdHJhY2UgdGFnIGludG8gdGhlIGFjdGl2ZSBjaGF0IHJlcXVlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VUYWcobmFtZTogc3RyaW5nLCB2YWx1ZTogQ2hhdFRyYWNlVGFnVmFsdWUgPSB0cnVlKTogdm9pZCB7XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKHN0YXRlKSBzZXRDaGF0VHJhY2VUYWcoc3RhdGUsIG5hbWUsIHZhbHVlKTtcbn1cblxuLyoqIEluamVjdCBtdWx0aXBsZSBNTGZsb3cgdHJhY2UgdGFncyBpbnRvIHRoZSBhY3RpdmUgY2hhdCByZXF1ZXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlVGFncyhcbiAgdGFnczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+Pixcbik6IHZvaWQge1xuICBjb25zdCBzdGF0ZSA9IGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk7XG4gIGlmICghc3RhdGUpIHJldHVybjtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ3MpKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHNldENoYXRUcmFjZVRhZyhzdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKiBSZWNvcmQgdGhlIGZpcnN0IHNlbGVjdGVkIG1vZGVsIGFzIHRoZSBhY3RpdmUgY2hhdCB0cmFjZSdzIGBhZ2VudGAgdGFnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlTW9kZWwobW9kZWxJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChtb2RlbElkKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICBjb25zdCBzdGF0ZSA9IGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk7XG4gIGlmICghc3RhdGUgfHwgc3RhdGUuZmlyc3RNb2RlbCkgcmV0dXJuO1xuICBzdGF0ZS5maXJzdE1vZGVsID0gdmFsdWU7XG4gIHNldENoYXRUcmFjZVRhZyhzdGF0ZSwgTUxGTE9XX0FHRU5UX1RBRywgdmFsdWUpO1xuICBjb25zdCBzcGFuID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpO1xuICBpZiAoc3Bhbj8uaXNSZWNvcmRpbmcoKSkgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX0FHRU5UX1RBR19BVFRSLCB2YWx1ZSk7XG4gIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfQUdFTlRfVEFHXTogdmFsdWUgfSk7XG59XG5cbi8qKiBSZWNvcmQgdGhlIGJlc3QgcmVzb2x2ZWQgdXNlciBpZGVudGlmaWVyIG9uIHRoZSBhY3RpdmUgY2hhdCB0cmFjZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVVzZXIodXNlcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh1c2VyKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICBjb25zdCBzdGF0ZSA9IGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk7XG4gIGlmIChzdGF0ZSkgc3RhdGUudXNlciA9IHZhbHVlO1xufVxuXG4vKiogUmVjb3JkIG9uZSBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIG1vZGUgdXNlZCBkdXJpbmcgdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlQXV0aChhdXRoOiBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTogdm9pZCB7XG4gIHJlY29yZEFjdGl2ZVRyYWNlVGFnKGF1dGggPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHKTtcbn1cblxuLyoqIFB1Ymxpc2ggdGhlIHR1cm4ncyBNTGZsb3cgdHJhY2UgaWQgYmVmb3JlIHRoZSBoYW5kbGVyIHdyaXRlcyB0aGUgYm9keS4gKi9cbmZ1bmN0aW9uIHN0YW1wTWxmbG93VHJhY2VJZChyZXM6IGV4cHJlc3MuUmVzcG9uc2UsIHNwYW46IFNwYW4pOiB2b2lkIHtcbiAgaWYgKHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xuICBjb25zdCB0cmFjZUlkID0gc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gIGlmICghdHJhY2VJZCB8fCB0cmFjZUlkID09PSBJTlZBTElEX1RSQUNFX0lEKSByZXR1cm47XG4gIHJlcy5zZXRIZWFkZXIoZmVlZGJhY2suTUxGTE9XX1RSQUNFX0lEX0hFQURFUiwgYHRyLSR7dHJhY2VJZH1gKTtcbn1cblxuLyoqIFJldHVybiBvbmUgcmF3IHByb21wdCB3aGVuIHRoZSByZXF1ZXN0IGlzIGV4YWN0bHkgb25lIHRleHQtb25seSB1c2VyIG1lc3NhZ2UuICovXG5leHBvcnQgZnVuY3Rpb24gdGV4dE9ubHlDaGF0SW5wdXQobWVzc2FnZXM6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIG1lc3NhZ2VzID09PSBcInN0cmluZ1wiKSByZXR1cm4gbWVzc2FnZXMgfHwgdW5kZWZpbmVkO1xuICBpZiAoIUFycmF5LmlzQXJyYXkobWVzc2FnZXMpIHx8IG1lc3NhZ2VzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzWzBdO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChtZXNzYWdlKSB8fCBtZXNzYWdlLnJvbGUgIT09IFwidXNlclwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG1lc3NhZ2UuY29udGVudCB8fCB1bmRlZmluZWQ7XG4gIHJldHVybiB0ZXh0RnJvbVBhcnRzKG1lc3NhZ2UucGFydHMpID8/IHRleHRGcm9tUGFydHMobWVzc2FnZS5jb250ZW50KTtcbn1cblxuZnVuY3Rpb24gdGV4dEZyb21QYXJ0cyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB0ZXh0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgdmFsdWUpIHtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChwYXJ0KSB8fCBwYXJ0LnR5cGUgIT09IFwidGV4dFwiIHx8IHR5cGVvZiBwYXJ0LnRleHQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRleHQucHVzaChwYXJ0LnRleHQpO1xuICB9XG4gIGNvbnN0IGpvaW5lZCA9IHRleHQuam9pbihcIlwiKTtcbiAgcmV0dXJuIGpvaW5lZCB8fCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZWQodmFsdWU6IHVua25vd24sIGxpbWl0ID0gVFJBQ0VfSU9fTElNSVQpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpPy5zbGljZSgwLCBsaW1pdCkgPz8gU3RyaW5nKHZhbHVlKS5zbGljZSgwLCBsaW1pdCk7XG59XG5cbmZ1bmN0aW9uIHNzZUZyYW1lKGxpbmU6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIWxpbmUuc3RhcnRzV2l0aChcImRhdGE6XCIpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ganNvbi5wYXJzZShsaW5lLnNsaWNlKDUpKTtcbn1cblxuZnVuY3Rpb24gdmFsdWVVc2VzR2VuaWUodmFsdWU6IHVua25vd24sIGRlcHRoID0gMCk6IGJvb2xlYW4ge1xuICBpZiAoZGVwdGggPiAzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLnNvbWUoKGl0ZW0pID0+IHZhbHVlVXNlc0dlbmllKGl0ZW0sIGRlcHRoICsgMSkpO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHZhbHVlLnR5cGUgPT09IFwiZGF0YS1nZW5pZS1wcm9ncmVzc1wiIHx8XG4gICAgdmFsdWUudHlwZSA9PT0gXCJhc2tfZ2VuaWVfZG9uZVwiIHx8XG4gICAgdmFsdWUudG9vbE5hbWUgPT09IFwiYXNrX2dlbmllXCIgfHxcbiAgICB2YWx1ZS50b29sX25hbWUgPT09IFwiYXNrX2dlbmllXCIgfHxcbiAgICB2YWx1ZS5uYW1lID09PSBcImFza19nZW5pZVwiXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBbXCJkYXRhXCIsIFwiZXZlbnRcIiwgXCJwYXlsb2FkXCJdLnNvbWUoKGtleSkgPT4gdmFsdWVVc2VzR2VuaWUodmFsdWVba2V5XSwgZGVwdGggKyAxKSk7XG59XG5cbi8qKiBSZXR1cm4gdGhlIGFzc2lzdGFudCB0ZXh0IGZyb20gb25lIFNTRSBsaW5lLCBvciBhbiBlbXB0eSBzdHJpbmcuICovXG5mdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZUxpbmUobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoc3NlRnJhbWUobGluZSkpO1xufVxuXG5mdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKGZyYW1lOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQoZnJhbWUpIHx8IGZyYW1lLnR5cGUgIT09IFwidGV4dC1kZWx0YVwiKSByZXR1cm4gXCJcIjtcbiAgY29uc3QgdGV4dCA9XG4gICAgdHlwZW9mIGZyYW1lLmRlbHRhID09PSBcInN0cmluZ1wiXG4gICAgICA/IGZyYW1lLmRlbHRhXG4gICAgICA6IG9iamVjdC5pc1JlY29yZChmcmFtZS5wYXlsb2FkKVxuICAgICAgICA/IGZyYW1lLnBheWxvYWQudGV4dFxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiID8gdGV4dCA6IFwiXCI7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGUgdGhlIGFzc2lzdGFudCdzIGFuc3dlciBvdXQgb2YgYW4gQUkgU0RLIFNTRSB0cmFuc2NyaXB0LlxuICpcbiAqIFRoZSBhZ2VudCBzdHJlYW1zIGl0cyByZXBseSBhcyBgdGV4dC1kZWx0YWAgZnJhbWVzXG4gKiAoYGRhdGE6IHtcInR5cGVcIjpcInRleHQtZGVsdGFcIixcInBheWxvYWRcIjp7XCJ0ZXh0XCI6XCIuLi5cIn19YCksIHNvIHRoZSBmdWxsXG4gKiBhbnN3ZXIgb25seSBldmVyIGV4aXN0cyBhcyBkZWx0YXMgb24gdGhlIHdpcmUgYW5kIGhhcyB0byBiZVxuICogcmVhc3NlbWJsZWQgaGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlKGJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgYm9keS5zcGxpdChcIlxcblwiKSkge1xuICAgIGNvbnN0IHRleHQgPSBhc3Npc3RhbnRUZXh0RnJvbVNzZUxpbmUobGluZSk7XG4gICAgaWYgKHRleHQpIHBhcnRzLnB1c2godGV4dCk7XG4gIH1cbiAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcIikuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogUmVhZCB0aGUgZmluYWwgYXNzaXN0YW50IHRleHQgZnJvbSBhIG5vbi1zdHJlYW1pbmcgTWFzdHJhIHJlc3BvbnNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tSnNvbihib2R5OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQoYm9keSkgfHwgdHlwZW9mIGJvZHkudGV4dCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBib2R5LnRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogSW5jcmVtZW50YWxseSBhc3NlbWJsZSBVVEYtOCBTU0UgdGV4dCB3aGlsZSByZXRhaW5pbmcgYSBib3VuZGVkIEpTT04gZmFsbGJhY2suICovXG5jbGFzcyBBc3Npc3RhbnRSZXNwb25zZUNvbGxlY3RvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKTtcbiAgcHJpdmF0ZSBhbnN3ZXIgPSBcIlwiO1xuICBwcml2YXRlIGJvZHkgPSBcIlwiO1xuICBwcml2YXRlIHBlbmRpbmdMaW5lID0gXCJcIjtcbiAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuICBwcml2YXRlIGdlbmllID0gZmFsc2U7XG5cbiAgd3JpdGUoY2h1bms6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maW5pc2hlZCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuY29uc3VtZShjaHVuayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY2h1bmspKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoXG4gICAgICAgIHRoaXMuZGVjb2Rlci53cml0ZShCdWZmZXIuZnJvbShjaHVuay5idWZmZXIsIGNodW5rLmJ5dGVPZmZzZXQsIGNodW5rLmJ5dGVMZW5ndGgpKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZmluaXNoKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybiB0aGlzLmFuc3dlciB8fCB0aGlzLmpzb25BbnN3ZXIoKTtcbiAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnN1bWUodGhpcy5kZWNvZGVyLmVuZCgpKTtcbiAgICB0aGlzLmNvbnN1bWVTc2VMaW5lKHRoaXMucGVuZGluZ0xpbmUpO1xuICAgIHRoaXMucGVuZGluZ0xpbmUgPSBcIlwiO1xuICAgIHJldHVybiB0aGlzLmFuc3dlciB8fCB0aGlzLmpzb25BbnN3ZXIoKTtcbiAgfVxuXG4gIHJhd0JvZHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ib2R5LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbiAgfVxuXG4gIHVzZWRHZW5pZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZW5pZTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRleHQpIHJldHVybjtcbiAgICBpZiAodGhpcy5ib2R5Lmxlbmd0aCA8IFJFU1BPTlNFX0JPRFlfTElNSVQpIHtcbiAgICAgIHRoaXMuYm9keSArPSB0ZXh0LnNsaWNlKDAsIFJFU1BPTlNFX0JPRFlfTElNSVQgLSB0aGlzLmJvZHkubGVuZ3RoKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nTGluZSArPSB0ZXh0O1xuICAgIGxldCBuZXdsaW5lID0gdGhpcy5wZW5kaW5nTGluZS5pbmRleE9mKFwiXFxuXCIpO1xuICAgIHdoaWxlIChuZXdsaW5lID49IDApIHtcbiAgICAgIHRoaXMuY29uc3VtZVNzZUxpbmUodGhpcy5wZW5kaW5nTGluZS5zbGljZSgwLCBuZXdsaW5lKS5yZXBsYWNlKC9cXHIkLywgXCJcIikpO1xuICAgICAgdGhpcy5wZW5kaW5nTGluZSA9IHRoaXMucGVuZGluZ0xpbmUuc2xpY2UobmV3bGluZSArIDEpO1xuICAgICAgbmV3bGluZSA9IHRoaXMucGVuZGluZ0xpbmUuaW5kZXhPZihcIlxcblwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGVuZGluZ0xpbmUubGVuZ3RoID4gUkVTUE9OU0VfQk9EWV9MSU1JVCkge1xuICAgICAgdGhpcy5wZW5kaW5nTGluZSA9IHRoaXMucGVuZGluZ0xpbmUuc2xpY2UoLVJFU1BPTlNFX0JPRFlfTElNSVQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVNzZUxpbmUobGluZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZnJhbWUgPSBzc2VGcmFtZShsaW5lKTtcbiAgICB0aGlzLmdlbmllIHx8PSB2YWx1ZVVzZXNHZW5pZShmcmFtZSk7XG4gICAgaWYgKHRoaXMuYW5zd2VyLmxlbmd0aCA+PSBUUkFDRV9JT19MSU1JVCkgcmV0dXJuO1xuICAgIGNvbnN0IHRleHQgPSBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKGZyYW1lKTtcbiAgICB0aGlzLmFuc3dlciArPSB0ZXh0LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUIC0gdGhpcy5hbnN3ZXIubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUganNvbkFuc3dlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBhc3Npc3RhbnRUZXh0RnJvbUpzb24oanNvbi5wYXJzZSh0aGlzLmJvZHkpKTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbGVjdCB0aGUgc3BhbiBNTGZsb3cgdHJlYXRzIGFzIHRoZSByZXF1ZXN0IHJvb3QuXG4gKlxuICogT1RlbCBIVFRQIGluc3RydW1lbnRhdGlvbiBzdG9yZXMgaXRzIHNlcnZlciBzcGFuIGluIFJQQyBtZXRhZGF0YS4gVGhhdCBzcGFuXG4gKiB3aW5zIG92ZXIgYW4gYWN0aXZlIEV4cHJlc3MgY2hpbGQuIElmIG5vIHJlY29yZGluZyBsb2NhbCBzcGFuIGV4aXN0cywgY3JlYXRlXG4gKiBvbmUgdW5kZXIgdGhlIGN1cnJlbnQgY29udGV4dCBzbyBlbmFibGVkIFczQyBwcm9wYWdhdGlvbiByZW1haW5zIGludGFjdC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRyYWNlVGFyZ2V0KCk6IFRyYWNlVGFyZ2V0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYWN0aXZlQ29udGV4dCA9IGNvbnRleHQuYWN0aXZlKCk7XG4gIGlmIChkaXJlY3RNbGZsb3dUcmFjaW5nQWN0aXZlKCkpIHtcbiAgICBjb25zdCBzcGFuID0gdHJhY2UuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpLnN0YXJ0U3BhbihcbiAgICAgIFwibWFzdHJhLmNoYXRfdHVyblwiLFxuICAgICAge1xuICAgICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBbQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUl06IHRydWUsXG4gICAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgICAgW0dFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSXTogXCJpbnZva2VfYWdlbnRcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0cmFjZS5kZWxldGVTcGFuKGFjdGl2ZUNvbnRleHQpLFxuICAgICk7XG4gICAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICAgIHNwYW4uZW5kKCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4geyBzcGFuLCBvd25lZDogdHJ1ZSB9O1xuICB9XG5cbiAgY29uc3QgcnBjID0gZ2V0UlBDTWV0YWRhdGEoYWN0aXZlQ29udGV4dCk7XG4gIGlmIChycGM/LnR5cGUgPT09IFJQQ1R5cGUuSFRUUCAmJiBycGMuc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgcmV0dXJuIHsgc3BhbjogcnBjLnNwYW4sIG93bmVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgYWN0aXZlID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpO1xuICBpZiAoYWN0aXZlPy5pc1JlY29yZGluZygpKSByZXR1cm4geyBzcGFuOiBhY3RpdmUsIG93bmVkOiBmYWxzZSB9O1xuXG4gIGNvbnN0IHNwYW4gPSB0cmFjZS5nZXRUcmFjZXIoQ0hBVF9UVVJOX1RSQUNFUikuc3RhcnRTcGFuKFxuICAgIFwibWFzdHJhLmNoYXRfdHVyblwiLFxuICAgIHtcbiAgICAgIGtpbmQ6IFNwYW5LaW5kLlNFUlZFUixcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgW0FQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFJdOiB0cnVlLFxuICAgICAgICBbTUxGTE9XX1NQQU5fVFlQRV9BVFRSXTogTUxGTE9XX1NQQU5fVFlQRV9BR0VOVCxcbiAgICAgICAgW0dFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSXTogXCJpbnZva2VfYWdlbnRcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhY3RpdmVDb250ZXh0LFxuICApO1xuICBpZiAoIXNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHNwYW4uZW5kKCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyBzcGFuLCBvd25lZDogdHJ1ZSB9O1xufVxuXG4vKipcbiAqIEV4cHJlc3MgbWlkZGxld2FyZSB0aGF0IHN0YW1wcyBjaGF0IHR1cm4gSS9PIG9udG8gdGhlIGV4cG9ydGVkIE9UZWwgcm9vdC5cbiAqXG4gKiBUZWUgYHJlcy53cml0ZWAsIGByZXMuanNvbmAsIGFuZCBgcmVzLmVuZGAgaW5zdGVhZCBvZiBsaXN0ZW5pbmcgZm9yIGBmaW5pc2hgOlxuICogSFRUUCBpbnN0cnVtZW50YXRpb24gZW5kcyBpdHMgc2VydmVyIHNwYW4gb24gZmluaXNoLCBhbmQgYXR0cmlidXRlcyBzZXRcbiAqIGFmdGVyIGEgc3BhbiBlbmRzIG5ldmVyIHJlYWNoIHRoZSBleHBvcnRlci5cbiAqXG4gKiBgcGF0aGAgaXMgbW91bnQtcmVsYXRpdmUgKHdoYXQgdGhlIE1hc3RyYSBzdWItYXBwIHNlZXMpLCBlLmcuXG4gKiBgL2FnZW50cy9zdXBwb3J0L3N0cmVhbWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmUoXG4gIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gIG5leHQ6IGV4cHJlc3MuTmV4dEZ1bmN0aW9uLFxuICBvcHRpb25zOiBDaGF0VHVyblRlbGVtZXRyeU9wdGlvbnMgPSB7fSxcbik6IHZvaWQge1xuICBpZiAocmVxLm1ldGhvZCAhPT0gXCJQT1NUXCIgfHwgIUFHRU5UX1RVUk5fUk9VVEUudGVzdChyZXEucGF0aCkpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhcmdldCA9IHJlc29sdmVUcmFjZVRhcmdldCgpO1xuICBpZiAoIXRhcmdldCkge1xuICAgIG5leHQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdGFyZ2V0VHJhY2VJZCA9IHRyYWNlSWQodGFyZ2V0LnNwYW4pO1xuICBpZiAoIXRhcmdldFRyYWNlSWQpIHtcbiAgICBpZiAodGFyZ2V0Lm93bmVkKSB0YXJnZXQuc3Bhbi5lbmQoKTtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRyYWNlU3RhdGU6IENoYXRUcmFjZVN0YXRlID0geyB0YWdzOiBuZXcgTWFwKCkgfTtcbiAgY29uc3QgdHJhY2VSZXF1ZXN0VGltZSA9IERhdGUubm93KCk7XG4gIGlmICghZW52aXJvbm1lbnRVdGlscy5pc0RhdGFicmlja3NBcHBFbnYoKSkge1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfTE9DQUxfVEFHLCB0cnVlKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0UmVxdWVzdFRhZ3MocmVxKSkpIHtcbiAgICBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICB9XG4gIGNvbnN0IGluaXRpYWxUYWdzID0gdHlwZW9mIG9wdGlvbnMudGFncyA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy50YWdzKHJlcSkgOiBvcHRpb25zLnRhZ3M7XG4gIGlmIChpbml0aWFsVGFncykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsVGFncykpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBzdGFtcE1sZmxvd1RyYWNlSWQocmVzLCB0YXJnZXQuc3Bhbik7XG4gIHRyYWNlU3RhdGUudXNlciA9IHN0YW1wTWxmbG93QWN0b3IodGFyZ2V0LnNwYW4sIHJlcSk7XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIFwiaW52b2tlX2FnZW50XCIpO1xuICBjb25zdCBpZGVudGl0eSA9XG4gICAgdHlwZW9mIG9wdGlvbnMuaWRlbnRpdHkgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaWRlbnRpdHkocmVxKSA6IG9wdGlvbnMuaWRlbnRpdHk7XG4gIGlmIChpZGVudGl0eSkge1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0lERU5USVRZX0FUVFIsIGlkZW50aXR5KTtcbiAgICBzZXRDaGF0VHJhY2VUYWcoXG4gICAgICB0cmFjZVN0YXRlLFxuICAgICAgaWRlbnRpdHkgPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgZmFsc2UpO1xuXG4gIGNvbnN0IG1lc3NhZ2VzID0gKHJlcS5ib2R5IGFzIHsgbWVzc2FnZXM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5tZXNzYWdlcztcbiAgbGV0IHJlcXVlc3RQcmV2aWV3OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChtZXNzYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZnVsbElucHV0ID0gc2VyaWFsaXplZChtZXNzYWdlcyk7XG4gICAgcmVxdWVzdFByZXZpZXcgPSB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlcykgPz8gZnVsbElucHV0O1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX01FU1NBR0VTX0FUVFIsIGZ1bGxJbnB1dCk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TUEFOX0lOUFVUU19BVFRSLCByZXF1ZXN0UHJldmlldy5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdG9yID0gbmV3IEFzc2lzdGFudFJlc3BvbnNlQ29sbGVjdG9yKCk7XG4gIGxldCByZXNwb25zZVByZXZpZXc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBmdWxsT3V0cHV0UmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IGdlbmllUmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IG93bmVkU3BhbkVuZGVkID0gZmFsc2U7XG4gIGxldCB0cmFjZUZpbmFsaXplZCA9IGZhbHNlO1xuICBjb25zdCBwYXNzVGhyb3VnaFdyaXRlID0gcmVzLndyaXRlLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBib29sZWFuO1xuICBjb25zdCBwYXNzVGhyb3VnaEVuZCA9IHJlcy5lbmQuYmluZChyZXMpIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gIGNvbnN0IHBhc3NUaHJvdWdoSnNvbiA9IHJlcy5qc29uLmJpbmQocmVzKSBhcyAoYm9keT86IHVua25vd24pID0+IGV4cHJlc3MuUmVzcG9uc2U7XG4gIGNvbnN0IHJlY29yZE91dHB1dCA9IChhbnN3ZXI6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChvdXRwdXRSZWNvcmRlZCB8fCAhYW5zd2VyKSByZXR1cm47XG4gICAgcmVzcG9uc2VQcmV2aWV3ID0gYW5zd2VyO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIGFuc3dlci5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIG91dHB1dFJlY29yZGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgcmVjb3JkRnVsbE91dHB1dCA9IChyZXNwb25zZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKGZ1bGxPdXRwdXRSZWNvcmRlZCB8fCAhcmVzcG9uc2UpIHJldHVybjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9SRVNQT05TRV9BVFRSLCByZXNwb25zZS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIGZ1bGxPdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEdlbmllID0gKHVzZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICBpZiAoIXVzZWQgfHwgZ2VuaWVSZWNvcmRlZCkgcmV0dXJuO1xuICAgIGdlbmllUmVjb3JkZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgdHJ1ZSk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfR0VOSUVfVEFHLCB0cnVlKTtcbiAgICBjb250ZXh0LndpdGgodHJhY2Uuc2V0U3Bhbihjb250ZXh0LmFjdGl2ZSgpLCB0YXJnZXQuc3BhbiksICgpID0+IHtcbiAgICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfR0VOSUVfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGZpbmFsaXplVHJhY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRyYWNlRmluYWxpemVkKSByZXR1cm47XG4gICAgdHJhY2VGaW5hbGl6ZWQgPSB0cnVlO1xuICAgIGNvbnN0IHRhZ3MgPSBPYmplY3QuZnJvbUVudHJpZXModHJhY2VTdGF0ZS50YWdzKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdHJhY2VTdGF0ZS50YWdzKSB7XG4gICAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoYCR7TUxGTE9XX1RSQUNFX1RBR19QUkVGSVh9JHtuYW1lfWAsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRyYWNlU3RhdGUudXNlcikgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHRyYWNlU3RhdGUudXNlcik7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICB0cmFjZUlkOiB0YXJnZXRUcmFjZUlkLFxuICAgICAgcmVxdWVzdFRpbWU6IHRyYWNlUmVxdWVzdFRpbWUsXG4gICAgICBleGVjdXRpb25EdXJhdGlvbjogRGF0ZS5ub3coKSAtIHRyYWNlUmVxdWVzdFRpbWUsXG4gICAgICBlcnJvcjogcmVzLnN0YXR1c0NvZGUgPj0gNTAwLFxuICAgICAgdGFncyxcbiAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGVuZE93bmVkU3BhbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRhcmdldC5vd25lZCB8fCBvd25lZFNwYW5FbmRlZCkgcmV0dXJuO1xuICAgIG93bmVkU3BhbkVuZGVkID0gdHJ1ZTtcbiAgICB0YXJnZXQuc3Bhbi5lbmQoKTtcbiAgfTtcblxuICByZXMud3JpdGUgPSAoKGNodW5rOiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaFdyaXRlKGNodW5rLCAuLi5yZXN0KTtcbiAgfSkgYXMgdHlwZW9mIHJlcy53cml0ZTtcblxuICByZXMuanNvbiA9ICgoYm9keT86IHVua25vd24pID0+IHtcbiAgICByZWNvcmRGdWxsT3V0cHV0KHNlcmlhbGl6ZWQoYm9keSkpO1xuICAgIHJlY29yZEdlbmllKHZhbHVlVXNlc0dlbmllKGJvZHkpKTtcbiAgICByZWNvcmRPdXRwdXQoYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHkpKTtcbiAgICByZXR1cm4gcGFzc1Rocm91Z2hKc29uKGJvZHkpO1xuICB9KSBhcyB0eXBlb2YgcmVzLmpzb247XG5cbiAgcmVzLmVuZCA9ICgoY2h1bms/OiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJlY29yZE91dHB1dChjb2xsZWN0b3IuZmluaXNoKCkpO1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoY29sbGVjdG9yLnJhd0JvZHkoKSk7XG4gICAgcmVjb3JkR2VuaWUoY29sbGVjdG9yLnVzZWRHZW5pZSgpKTtcbiAgICBmaW5hbGl6ZVRyYWNlKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXNzVGhyb3VnaEVuZChjaHVuaywgLi4ucmVzdCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuZE93bmVkU3BhbigpO1xuICAgIH1cbiAgfSkgYXMgdHlwZW9mIHJlcy5lbmQ7XG5cbiAgcmVzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICBlbmRPd25lZFNwYW4oKTtcbiAgfSk7XG5cbiAgY29uc3QgY2hhdENvbnRleHQgPSB0cmFjZVxuICAgIC5zZXRTcGFuKGNvbnRleHQuYWN0aXZlKCksIHRhcmdldC5zcGFuKVxuICAgIC5zZXRWYWx1ZShDSEFUX1RSQUNFX1NUQVRFX0tFWSwgdHJhY2VTdGF0ZSk7XG4gIGNvbnRleHQud2l0aChjaGF0Q29udGV4dCwgKCkgPT4ge1xuICAgIG5leHQoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zdGFsbCB7QGxpbmsgY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlfSBvbiBhIE1hc3RyYSBFeHByZXNzIHN1Yi1hcHAuXG4gKlxuICogQ2FsbCBiZWZvcmUgYE1hc3RyYVNlcnZlci5pbml0KClgIHNvIHRoZSBsYXllciBzaXRzIGFoZWFkIG9mIHRoZSBhZ2VudFxuICogcm91dGVzLiBTYWZlIHRvIGNhbGwgdW5jb25kaXRpb25hbGx5OiB3aGVuIG5vIHJlY29yZGluZyB0cmFjZXIgaXMgcmVnaXN0ZXJlZCxcbiAqIHRoZSBtaWRkbGV3YXJlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hDaGF0VHVyblRlbGVtZXRyeShcbiAgYXBwOiBleHByZXNzLkV4cHJlc3MsXG4gIG9wdGlvbnM6IENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogdm9pZCB7XG4gIGFwcC51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmUocmVxLCByZXMsIG5leHQsIG9wdGlvbnMpKTtcbiAgbG9nZ2VyLmluZm8oXCJjaGF0IHR1cm4gdGVsZW1ldHJ5IG1pZGRsZXdhcmUgYXR0YWNoZWRcIiwgb3B0aW9ucyk7XG59XG4iXX0=
|
|
703
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVGLE9BQU8sRUFDTCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixjQUFjLEVBQ2QsS0FBSyxHQUdOLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUk5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDRCQUE0QixFQUM1Qix5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLDJCQUEyQixHQUM1QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLHFCQUFx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Q0FBQyxJQUFJLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weSBlYWNoIE1hc3RyYSBjaGF0IHR1cm4ncyByZXF1ZXN0L3Jlc3BvbnNlIG9udG8gaXRzIE9UZWwgcm9vdCBzcGFuXG4gKiBzbyBEYXRhYnJpY2tzLW1hbmFnZWQgTUxmbG93IGNhbiBkaXNwbGF5IHRoZW0uXG4gKlxuICogV2h5IHRoaXMgZXhpc3RzOiBNTGZsb3cncyBVQyBgPHRhcmdldD5fdHJhY2VfdW5pZmllZGAgdmlldyBwaWNrcyB0aGVcbiAqIG9uZSBzcGFuIHdob3NlIGBwYXJlbnRfc3Bhbl9pZGAgaXMgZW1wdHkgYW5kIHJlYWRzIHJlcXVlc3QvcmVzcG9uc2VcbiAqIGZyb20gYG1sZmxvdy5zcGFuSW5wdXRzYCAvIGBtbGZsb3cuc3Bhbk91dHB1dHNgIChvciB0aGUgYGdlbl9haS4qYFxuICogZXF1aXZhbGVudHMpIG9uIFRIQVQgc3BhbiBvbmx5LiBNYXN0cmEgcmVjb3JkcyB0aGUgdHVybiBvbiBpdHNcbiAqIGBpbnZva2VfYWdlbnRgIGNoaWxkIHVuZGVyIGBtYXN0cmEuYWdlbnRfcnVuLmlucHV0YCAvIGAub3V0cHV0YCwga2V5c1xuICogdGhlIHZpZXcgbmV2ZXIgcmVhZHMsIHNvIGNoYXQgdHJhY2VzIGFycml2ZSB3aXRoIGJvdGggY29sdW1ucyBudWxsXG4gKiBldmVuIHdoZW4gdGhlIHNwYW5zIHRoZW1zZWx2ZXMgbG9vayBoZWFsdGh5LlxuICpcbiAqIEFwcEtpdCdzIEhUVFAgaW5zdHJ1bWVudGF0aW9uIHJlY29yZHMgdGhlIHNlcnZlciBzcGFuIGluIE9UZWwgUlBDIG1ldGFkYXRhLFxuICogd2hpY2ggcmVtYWlucyBhdmFpbGFibGUgZXZlbiB3aGVuIEV4cHJlc3MgbWFrZXMgYSBtaWRkbGV3YXJlLWxheWVyIGNoaWxkXG4gKiBhY3RpdmUuIFdoZW4gaW5zdHJ1bWVudGF0aW9uIGlzIHVuYXZhaWxhYmxlLCB0aGlzIG1vZHVsZSBjcmVhdGVzIG9uZVxuICogcmVxdWVzdC1saWZldGltZSBzZXJ2ZXIgc3BhbiBhbmQgcnVucyBNYXN0cmEgdW5kZXIgaXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tIFwibm9kZTpzdHJpbmdfZGVjb2RlclwiO1xuXG5pbXBvcnQgeyB0ZWxlbWV0cnkgYXMgYXBwa2l0VGVsZW1ldHJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBnZXRSZXF1ZXN0VGFncyB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC9yZXF1ZXN0LXRhZ3NcIjtcbmltcG9ydCB7IGVudmlyb25tZW50VXRpbHMsIGpzb24sIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjaywgdGhyZWFkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHR5cGUgeyBUcmFjaW5nT3B0aW9ucyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvb2JzZXJ2YWJpbGl0eVwiO1xuaW1wb3J0IHsgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgTUFTVFJBX1RIUkVBRF9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgY29udGV4dCxcbiAgY3JlYXRlQ29udGV4dEtleSxcbiAgU3BhbktpbmQsXG4gIFNwYW5TdGF0dXNDb2RlLFxuICB0cmFjZSxcbiAgdHlwZSBDb250ZXh0LFxuICB0eXBlIFNwYW4sXG59IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB7IGdldFJQQ01ldGFkYXRhLCBSUENUeXBlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgUmVhZGFibGVTcGFuLCBTcGFuIGFzIFNka1NwYW4sIFNwYW5Qcm9jZXNzb3IgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2VcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHsgTUFTVFJBX0FVVEhfTU9ERV9LRVksIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgTUFTVFJBX1VTRVJfTkFNRV9LRVkgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IFVTRVJfRU1BSUxfSEVBREVSLCBVU0VSX0lEX0hFQURFUiB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQge1xuICBkaXJlY3RNbGZsb3dUcmFjaW5nQWN0aXZlLFxuICBpbml0aWFsaXplQXBwTWxmbG93VHJhY2VJbmZvLFxuICBwZXJzaXN0QXBwTWxmbG93VHJhY2VJbmZvLFxuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSxcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzLFxufSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcbmltcG9ydCB7XG4gIEFQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFIsXG4gIE1MRkxPV19BR0VOVF9UQUcsXG4gIE1MRkxPV19BR0VOVF9UQUdfQVRUUixcbiAgTUxGTE9XX0dFTklFX1RBRyxcbiAgTUxGTE9XX0dFTklFX1RBR19BVFRSLFxuICBNTEZMT1dfTE9DQUxfVEFHLFxuICBNTEZMT1dfT0JPX0FVVEhfVEFHLFxuICBNTEZMT1dfU1BfQVVUSF9UQUcsXG4gIE1MRkxPV19UUkFDRV9UQUdfUFJFRklYLFxufSBmcm9tIFwiLi90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5cbmV4cG9ydCB7XG4gIE1MRkxPV19BR0VOVF9UQUcsXG4gIE1MRkxPV19BR0VOVF9UQUdfQVRUUixcbiAgQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUixcbiAgTUxGTE9XX0dFTklFX1RBRyxcbiAgTUxGTE9XX0dFTklFX1RBR19BVFRSLFxuICBNTEZMT1dfTE9DQUxfVEFHLFxuICBNTEZMT1dfTE9DQUxfVEFHX0FUVFIsXG4gIE1MRkxPV19PQk9fQVVUSF9UQUcsXG4gIE1MRkxPV19PQk9fQVVUSF9UQUdfQVRUUixcbiAgTUxGTE9XX1NQX0FVVEhfVEFHLFxuICBNTEZMT1dfU1BfQVVUSF9UQUdfQVRUUixcbiAgTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgsXG59IGZyb20gXCIuL3RyYWNlLWF0dHJpYnV0ZXMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS90ZWxlbWV0cnlcIik7XG5cbi8qKiBDYXAgb24gZWFjaCBwYXlsb2FkIGNvcGllZCBvbnRvIGEgc3Bhbiwgc28gb25lIHR1cm4gY2Fubm90IGJsb2F0IHRoZSBleHBvcnQuICovXG5leHBvcnQgY29uc3QgVFJBQ0VfSU9fTElNSVQgPSA4XzAwMDtcblxuLyoqIEJvdW5kIGZvciBhIG5vbi1zdHJlYW1pbmcgYm9keSBjYXB0dXJlZCB0aHJvdWdoIGByZXMuZW5kYCBpbnN0ZWFkIG9mIGByZXMuanNvbmAuICovXG5jb25zdCBSRVNQT05TRV9CT0RZX0xJTUlUID0gVFJBQ0VfSU9fTElNSVQgKiA0O1xuXG4vKiogVHJhY2VyIHNjb3BlIHVzZWQgb25seSB3aGVuIEFwcEtpdCBkaWQgbm90IGNyZWF0ZSBhIHJlY29yZGluZyBIVFRQIHNwYW4uICovXG5jb25zdCBDSEFUX1RVUk5fVFJBQ0VSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEvdGVsZW1ldHJ5XCI7XG5cbi8qKlxuICogTW91bnQtcmVsYXRpdmUgTWFzdHJhIGFnZW50IGludm9rZSBwYXRocyB0aGF0IGNhcnJ5IGEgY2hhdCB0dXJuIGJvZHlcbiAqIChgbWVzc2FnZXNgKSBhbmQgc3RyZWFtIGFuIGFzc2lzdGFudCBhbnN3ZXIuIFJlc3VtZSAvIGFwcHJvdmUgdmVyYnNcbiAqIGFyZSBpbnRlbnRpb25hbGx5IGV4Y2x1ZGVkOiB0aGVpciBib2RpZXMgYXJlIHRvb2wgZGVjaXNpb25zLCBub3QgdGhlXG4gKiB1c2VyIHByb21wdCwgYW5kIHRoZXkgcmFyZWx5IHByb2R1Y2UgYSBmcmVzaCBhbnN3ZXIgd29ydGggc3VyZmFjaW5nLlxuICovXG5jb25zdCBBR0VOVF9UVVJOX1JPVVRFID0gLyg/Ol58XFwvKSg/OmFnZW50c1xcL1teL10rXFwvKD86c3RyZWFtfGdlbmVyYXRlKXxjaGF0XFwvW14vXSspXFwvPyQvaTtcblxuLyoqIEF0dHJpYnV0ZSBrZXlzIHRoZSBNTGZsb3cgVUMgYCpfdHJhY2VfdW5pZmllZGAgdmlldyByZWFkcyBmcm9tIHRoZSByb290IHNwYW4uICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fSU5QVVRTX0FUVFIgPSBcIm1sZmxvdy5zcGFuSW5wdXRzXCI7XG4vKiogUm9vdC1zcGFuIGF0dHJpYnV0ZSBjb25zdW1lZCBhcyBjaGF0IG91dHB1dCBieSBNTGZsb3cgdW5pZmllZCB0cmFjZSB2aWV3cy4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIgPSBcIm1sZmxvdy5zcGFuT3V0cHV0c1wiO1xuLyoqIEZ1bGwgc2VyaWFsaXplZCByZXF1ZXN0IG1lc3NhZ2VzIHJldGFpbmVkIHdoZW4gdGhlIE1MZmxvdyBwcmV2aWV3IGlzIHBsYWluIHRleHQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9NRVNTQUdFU19BVFRSID0gXCJhcHBraXQubWFzdHJhLmNoYXQubWVzc2FnZXNcIjtcbi8qKiBGdWxsIHNlcmlhbGl6ZWQgcmVzcG9uc2UgcmV0YWluZWQgd2hlbiB0aGUgTUxmbG93IHByZXZpZXcgaXMgcGxhaW4gdGV4dC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX1JFU1BPTlNFX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuY2hhdC5yZXNwb25zZVwiO1xuLyoqIENyZWRlbnRpYWwgbW9kZSB1c2VkIGJ5IERhdGFicmlja3MgY2FsbHMgaW4gdGhpcyBjaGF0IHR1cm4uICovXG5leHBvcnQgY29uc3QgQ0hBVF9JREVOVElUWV9BVFRSID0gXCJhcHBraXQubWFzdHJhLmlkZW50aXR5Lm1vZGVcIjtcbi8qKiBXaGV0aGVyIHRoZSBzdHJlYW1lZCB0dXJuIGVtaXR0ZWQgYSBHZW5pZSB0b29sIG9yIHByb2dyZXNzIGV2ZW50LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfR0VOSUVfVVNFRF9BVFRSID0gXCJhcHBraXQubWFzdHJhLmdlbmllLnVzZWRcIjtcbi8qKlxuICogTUxmbG93IHNwYW4tdHlwZSBhdHRyaWJ1dGUuIERhdGFicmlja3MgbWFwcyB0aGlzIChvciBgZ2VuX2FpLm9wZXJhdGlvbi5uYW1lYClcbiAqIG9udG8gdGhlIHR5cGUgY2hpcCBpbiB0aGUgZXhwZXJpbWVudCBVSS4gQ3VzdG9tIHZhbHVlcyBzdWNoIGFzIGBHRU5JRWAgYXJlXG4gKiBhbGxvd2VkLlxuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9BVFRSID0gXCJtbGZsb3cuc3BhblR5cGVcIjtcbi8qKiBHZW5BSSBzZW1hbnRpYy1jb252ZW50aW9uIG9wZXJhdGlvbiBuYW1lLCBhbiBhbHRlcm5hdGUgc3Bhbi10eXBlIHNvdXJjZS4gKi9cbmV4cG9ydCBjb25zdCBHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUiA9IFwiZ2VuX2FpLm9wZXJhdGlvbi5uYW1lXCI7XG4vKipcbiAqIFJvb3Qtc3BhbiB1c2VyIGlkIHRoZSBNTGZsb3cgZXhwZXJpbWVudCBVSSdzIFVzZXIgY29sdW1uIHJlYWRzIGZyb20gT1RlbFxuICogdHJhY2VzLiBQcmVmZXIgdGhlIGZvcndhcmRlZCBlbWFpbCB3aGVuIHByZXNlbnQgc28gdGhlIGNvbHVtbiBpcyBodW1hbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19VU0VSX0FUVFIgPSBcInVzZXIuaWRcIjtcbi8qKiBSb290LXNwYW4gc2Vzc2lvbiBpZCB0aGF0IGVuYWJsZXMgdGhlIE1MZmxvdyBTZXNzaW9ucyB0YWIuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NFU1NJT05fQVRUUiA9IFwic2Vzc2lvbi5pZFwiO1xuLyoqIFJvb3Qtc3BhbiB0eXBlIGZvciBhIE1hc3RyYSBhZ2VudCB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQgPSBcIkFHRU5UXCI7XG4vKiogU3BhbiB0eXBlIGZvciBhbiBgYXNrX2dlbmllYCB0b29sIGNhbGwuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9HRU5JRSA9IFwiR0VOSUVcIjtcblxuLyoqIFJvb3Qtc3BhbiBtZXRhZGF0YSBrbm93biBiZWZvcmUgYSBjaGF0IHJlcXVlc3QgaXMgZGlzcGF0Y2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zIHtcbiAgcmVhZG9ubHkgaWRlbnRpdHk/OlxuICAgIFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIgfCAoKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCkgPT4gXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIik7XG4gIC8qKiBJbml0aWFsIHRyYWNlIHRhZ3MgZGVyaXZlZCBmcm9tIHRoZSBpbmJvdW5kIHJlcXVlc3QuICovXG4gIHJlYWRvbmx5IHRhZ3M/OlxuICAgIHwgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+PlxuICAgIHwgKChyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QpID0+IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYXRUcmFjZVRhZ1ZhbHVlIHwgdW5kZWZpbmVkPj4pO1xufVxuXG5pbnRlcmZhY2UgVHJhY2VUYXJnZXQge1xuICBzcGFuOiBTcGFuO1xuICBvd25lZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENoYXRUcmFjZVN0YXRlIHtcbiAgcmVhZG9ubHkgdGFnczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcmVhZG9ubHkgdHJhY2VJZDogc3RyaW5nO1xuICByZWFkb25seSBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIGZpcnN0TW9kZWw/OiBzdHJpbmc7XG4gIHVzZXI/OiBzdHJpbmc7XG59XG5cbi8qKiBWYWx1ZXMgYWNjZXB0ZWQgYnkgcmVxdWVzdC1zY29wZWQgdHJhY2UtdGFnIGluamVjdGlvbiBoZWxwZXJzLiAqL1xuZXhwb3J0IHR5cGUgQ2hhdFRyYWNlVGFnVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG5jb25zdCBDSEFUX1RSQUNFX1NUQVRFX0tFWSA9IGNyZWF0ZUNvbnRleHRLZXkoXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEvY2hhdC10cmFjZS1zdGF0ZVwiKTtcblxuLyoqIE9wZW5UZWxlbWV0cnkncyBzZW50aW5lbCBmb3IgXCJubyB2YWxpZCB0cmFjZVwiIC0gMzIgemVybyBoZXggY2hhcnMuICovXG5jb25zdCBJTlZBTElEX1RSQUNFX0lEID0gXCIwXCIucmVwZWF0KDMyKTtcblxuLyoqXG4gKiBNYXJrIHRoZSBhY3RpdmUgc3BhbiBhcyBhIEdlbmllIGNhbGwgc28gdGhlIGV4cGVyaW1lbnQgVUkgdHlwZXMgaXQgYEdFTklFYFxuICogYW5kIHRhZ3MgdGhlIHRyYWNlIGBnZW5pZT10cnVlYC4gU2FmZSBuby1vcCB3aGVuIG5vIHJlY29yZGluZyBzcGFuIGlzIGFjdGl2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YW1wR2VuaWVUb29sU3BhbihzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogdm9pZCB7XG4gIGlmICghc3Bhbj8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuO1xuICBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfR0VOSUUpO1xuICBzcGFuLnNldEF0dHJpYnV0ZShHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUiwgXCJleGVjdXRlX3Rvb2xcIik7XG4gIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0SGVhZGVyKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBmcm9tTWV0aG9kID1cbiAgICB0eXBlb2YgcmVxLmhlYWRlciA9PT0gXCJmdW5jdGlvblwiID8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXEuaGVhZGVyKG5hbWUpKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGZyb21NZXRob2QpIHJldHVybiBmcm9tTWV0aG9kO1xuICBjb25zdCByYXcgPSByZXEuaGVhZGVycz8uW25hbWUudG9Mb3dlckNhc2UoKV07XG4gIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UXVlcnkocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHJlcS5xdWVyeT8uW25hbWVdO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RhbXBNbGZsb3dBY3RvcihzcGFuOiBTcGFuLCByZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0SGVhZGVyKHJlcSwgVVNFUl9FTUFJTF9IRUFERVIpID8/IHJlcXVlc3RIZWFkZXIocmVxLCBVU0VSX0lEX0hFQURFUik7XG4gIGlmICh1c2VyKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfVVNFUl9BVFRSLCB1c2VyKTtcbiAgY29uc3Qgc2Vzc2lvbiA9XG4gICAgcmVxdWVzdEhlYWRlcihyZXEsIHRocmVhZC5USFJFQURfSURfSEVBREVSKSA/PyByZXF1ZXN0UXVlcnkocmVxLCB0aHJlYWQuVEhSRUFEX0lEX1FVRVJZKTtcbiAgaWYgKHNlc3Npb24pIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TRVNTSU9OX0FUVFIsIHNlc3Npb24pO1xuICByZXR1cm4gdXNlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2VJZChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuPy5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gIHJldHVybiB2YWx1ZSAmJiB2YWx1ZSAhPT0gSU5WQUxJRF9UUkFDRV9JRCA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpOiBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmFjdGl2ZSgpLmdldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZKSBhcyBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCaW5kIGEgTWFzdHJhIGFnZW50IHJ1biB0byB0aGUgdHJhY2Ugc2VsZWN0ZWQgYnkgY2hhdCB0ZWxlbWV0cnkuXG4gKlxuICogRGF0YWJyaWNrcyBBcHBzIHVzZXMgYSBkZWRpY2F0ZWQgYWdlbnQgdHJhY2UgYmVjYXVzZSBldmVudGVkIGFnZW50cyBmaW5pc2hcbiAqIGJlZm9yZSB0aGUgSFRUUCBzZXJ2ZXIgc3Bhbi4gUHJvbW90aW5nIE1MZmxvdyB0cmFjZSBpbmZvIGFmdGVyIHRoZSBhZ2VudCByb290XG4gKiBjbG9zZXMgYXZvaWRzIHRoZSBzaWRlY2FyIHJlcGxhY2luZyBjbGVhbiBwcmV2aWV3cyBhbmQgdGFncyB3aXRoIGVtcHR5IEhUVFBcbiAqIHRyYWNlIG1ldGFkYXRhLiBPdGhlciBydW50aW1lcyByZXRhaW4gdGhlIGV4aXN0aW5nIEhUVFAvbG9jYWwgcGFyZW50YWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZlQ2hhdFRyYWNpbmdPcHRpb25zKFxuICBvcHRpb25zOiBUcmFjaW5nT3B0aW9ucyB8IHVuZGVmaW5lZCxcbik6IFRyYWNpbmdPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoIXN0YXRlKSByZXR1cm4gb3B0aW9ucztcbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHRyYWNlSWQ6IHN0YXRlLnRyYWNlSWQsXG4gICAgLi4uKHN0YXRlLnBhcmVudFNwYW5JZCA/IHsgcGFyZW50U3BhbklkOiBzdGF0ZS5wYXJlbnRTcGFuSWQgfSA6IHsgcGFyZW50U3BhbklkOiB1bmRlZmluZWQgfSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNldENoYXRUcmFjZVRhZyhzdGF0ZTogQ2hhdFRyYWNlU3RhdGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IENoYXRUcmFjZVRhZ1ZhbHVlKTogdm9pZCB7XG4gIGNvbnN0IHRhZyA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobmFtZSk7XG4gIGlmICghdGFnKSByZXR1cm47XG4gIHN0YXRlLnRhZ3Muc2V0KHRhZywgU3RyaW5nKHZhbHVlKSk7XG59XG5cbi8qKiBJbmplY3Qgb25lIE1MZmxvdyB0cmFjZSB0YWcgaW50byB0aGUgYWN0aXZlIGNoYXQgcmVxdWVzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVRhZyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBDaGF0VHJhY2VUYWdWYWx1ZSA9IHRydWUpOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoc3RhdGUpIHNldENoYXRUcmFjZVRhZyhzdGF0ZSwgbmFtZSwgdmFsdWUpO1xufVxuXG4vKiogSW5qZWN0IG11bHRpcGxlIE1MZmxvdyB0cmFjZSB0YWdzIGludG8gdGhlIGFjdGl2ZSBjaGF0IHJlcXVlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VUYWdzKFxuICB0YWdzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+LFxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSkgcmV0dXJuO1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncykpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqIFJlY29yZCB0aGUgZmlyc3Qgc2VsZWN0ZWQgbW9kZWwgYXMgdGhlIGFjdGl2ZSBjaGF0IHRyYWNlJ3MgYGFnZW50YCB0YWcuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VNb2RlbChtb2RlbElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG1vZGVsSWQpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSB8fCBzdGF0ZS5maXJzdE1vZGVsKSByZXR1cm47XG4gIHN0YXRlLmZpcnN0TW9kZWwgPSB2YWx1ZTtcbiAgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBNTEZMT1dfQUdFTlRfVEFHLCB2YWx1ZSk7XG4gIGNvbnN0IHNwYW4gPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCk7XG4gIGlmIChzcGFuPy5pc1JlY29yZGluZygpKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfQUdFTlRfVEFHX0FUVFIsIHZhbHVlKTtcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzKHsgW01MRkxPV19BR0VOVF9UQUddOiB2YWx1ZSB9KTtcbn1cblxuLyoqIFJlY29yZCB0aGUgYmVzdCByZXNvbHZlZCB1c2VyIGlkZW50aWZpZXIgb24gdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlVXNlcih1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHVzZXIpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKHN0YXRlKSBzdGF0ZS51c2VyID0gdmFsdWU7XG59XG5cbi8qKiBSZWNvcmQgb25lIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gbW9kZSB1c2VkIGR1cmluZyB0aGUgYWN0aXZlIGNoYXQgdHJhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VBdXRoKGF1dGg6IFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIpOiB2b2lkIHtcbiAgcmVjb3JkQWN0aXZlVHJhY2VUYWcoYXV0aCA9PT0gXCJvYm9cIiA/IE1MRkxPV19PQk9fQVVUSF9UQUcgOiBNTEZMT1dfU1BfQVVUSF9UQUcpO1xufVxuXG4vKiogUHVibGlzaCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBiZWZvcmUgdGhlIGhhbmRsZXIgd3JpdGVzIHRoZSBib2R5LiAqL1xuZnVuY3Rpb24gc3RhbXBNbGZsb3dUcmFjZUlkKHJlczogZXhwcmVzcy5SZXNwb25zZSwgdHJhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgaWYgKCF0cmFjZUlkIHx8IHRyYWNlSWQgPT09IElOVkFMSURfVFJBQ0VfSUQpIHJldHVybjtcbiAgcmVzLnNldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xufVxuXG4vKiogUmV0dXJuIG9uZSByYXcgcHJvbXB0IHdoZW4gdGhlIHJlcXVlc3QgaXMgZXhhY3RseSBvbmUgdGV4dC1vbmx5IHVzZXIgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlczogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZXMgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlcyB8fCB1bmRlZmluZWQ7XG4gIGlmICghQXJyYXkuaXNBcnJheShtZXNzYWdlcykgfHwgbWVzc2FnZXMubGVuZ3RoICE9PSAxKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKG1lc3NhZ2UpIHx8IG1lc3NhZ2Uucm9sZSAhPT0gXCJ1c2VyXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiKSByZXR1cm4gbWVzc2FnZS5jb250ZW50IHx8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRleHRGcm9tUGFydHMobWVzc2FnZS5wYXJ0cykgPz8gdGV4dEZyb21QYXJ0cyhtZXNzYWdlLmNvbnRlbnQpO1xufVxuXG5mdW5jdGlvbiB0ZXh0RnJvbVBhcnRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRleHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcGFydCBvZiB2YWx1ZSkge1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnQpIHx8IHBhcnQudHlwZSAhPT0gXCJ0ZXh0XCIgfHwgdHlwZW9mIHBhcnQudGV4dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGV4dC5wdXNoKHBhcnQudGV4dCk7XG4gIH1cbiAgY29uc3Qgam9pbmVkID0gdGV4dC5qb2luKFwiXCIpO1xuICByZXR1cm4gam9pbmVkIHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplZCh2YWx1ZTogdW5rbm93biwgbGltaXQgPSBUUkFDRV9JT19MSU1JVCk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk/LnNsaWNlKDAsIGxpbWl0KSA/PyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIGxpbWl0KTtcbn1cblxuZnVuY3Rpb24gc3NlRnJhbWUobGluZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICghbGluZS5zdGFydHNXaXRoKFwiZGF0YTpcIikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBqc29uLnBhcnNlKGxpbmUuc2xpY2UoNSkpO1xufVxuXG5mdW5jdGlvbiB2YWx1ZVVzZXNHZW5pZSh2YWx1ZTogdW5rbm93biwgZGVwdGggPSAwKTogYm9vbGVhbiB7XG4gIGlmIChkZXB0aCA+IDMpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuc29tZSgoaXRlbSkgPT4gdmFsdWVVc2VzR2VuaWUoaXRlbSwgZGVwdGggKyAxKSk7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoXG4gICAgdmFsdWUudHlwZSA9PT0gXCJkYXRhLWdlbmllLXByb2dyZXNzXCIgfHxcbiAgICB2YWx1ZS50eXBlID09PSBcImFza19nZW5pZV9kb25lXCIgfHxcbiAgICB2YWx1ZS50b29sTmFtZSA9PT0gXCJhc2tfZ2VuaWVcIiB8fFxuICAgIHZhbHVlLnRvb2xfbmFtZSA9PT0gXCJhc2tfZ2VuaWVcIiB8fFxuICAgIHZhbHVlLm5hbWUgPT09IFwiYXNrX2dlbmllXCJcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIFtcImRhdGFcIiwgXCJldmVudFwiLCBcInBheWxvYWRcIl0uc29tZSgoa2V5KSA9PiB2YWx1ZVVzZXNHZW5pZSh2YWx1ZVtrZXldLCBkZXB0aCArIDEpKTtcbn1cblxuLyoqIFJldHVybiB0aGUgYXNzaXN0YW50IHRleHQgZnJvbSBvbmUgU1NFIGxpbmUsIG9yIGFuIGVtcHR5IHN0cmluZy4gKi9cbmZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlTGluZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShzc2VGcmFtZShsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoZnJhbWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChmcmFtZSkgfHwgZnJhbWUudHlwZSAhPT0gXCJ0ZXh0LWRlbHRhXCIpIHJldHVybiBcIlwiO1xuICBjb25zdCB0ZXh0ID1cbiAgICB0eXBlb2YgZnJhbWUuZGVsdGEgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZnJhbWUuZGVsdGFcbiAgICAgIDogb2JqZWN0LmlzUmVjb3JkKGZyYW1lLnBheWxvYWQpXG4gICAgICAgID8gZnJhbWUucGF5bG9hZC50ZXh0XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHRleHQgPT09IFwic3RyaW5nXCIgPyB0ZXh0IDogXCJcIjtcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZSB0aGUgYXNzaXN0YW50J3MgYW5zd2VyIG91dCBvZiBhbiBBSSBTREsgU1NFIHRyYW5zY3JpcHQuXG4gKlxuICogVGhlIGFnZW50IHN0cmVhbXMgaXRzIHJlcGx5IGFzIGB0ZXh0LWRlbHRhYCBmcmFtZXNcbiAqIChgZGF0YToge1widHlwZVwiOlwidGV4dC1kZWx0YVwiLFwicGF5bG9hZFwiOntcInRleHRcIjpcIi4uLlwifX1gKSwgc28gdGhlIGZ1bGxcbiAqIGFuc3dlciBvbmx5IGV2ZXIgZXhpc3RzIGFzIGRlbHRhcyBvbiB0aGUgd2lyZSBhbmQgaGFzIHRvIGJlXG4gKiByZWFzc2VtYmxlZCBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Tc2UoYm9keTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBib2R5LnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tU3NlTGluZShsaW5lKTtcbiAgICBpZiAodGV4dCkgcGFydHMucHVzaCh0ZXh0KTtcbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihcIlwiKS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG59XG5cbi8qKiBSZWFkIHRoZSBmaW5hbCBhc3Npc3RhbnQgdGV4dCBmcm9tIGEgbm9uLXN0cmVhbWluZyBNYXN0cmEgcmVzcG9uc2UuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHk6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChib2R5KSB8fCB0eXBlb2YgYm9keS50ZXh0ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGJvZHkudGV4dC5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG59XG5cbmNvbnN0IE1BU1RSQV9BR0VOVF9JTlBVVF9BVFRSID0gXCJtYXN0cmEuYWdlbnRfcnVuLmlucHV0XCI7XG5jb25zdCBNQVNUUkFfQUdFTlRfT1VUUFVUX0FUVFIgPSBcIm1hc3RyYS5hZ2VudF9ydW4ub3V0cHV0XCI7XG5jb25zdCBHRU5fQUlfUkVRVUVTVF9NT0RFTF9BVFRSID0gXCJnZW5fYWkucmVxdWVzdC5tb2RlbFwiO1xuY29uc3QgR0VOX0FJX0FHRU5UX0lEX0FUVFIgPSBcImdlbl9haS5hZ2VudC5pZFwiO1xuY29uc3QgR0VOX0FJX0FHRU5UX05BTUVfQVRUUiA9IFwiZ2VuX2FpLmFnZW50Lm5hbWVcIjtcbmNvbnN0IE1BU1RSQV9NT0RFTF9NRVRBREFUQV9BVFRSID0gXCJtYXN0cmEubWV0YWRhdGEubW9kZWxNZXRhZGF0YVwiO1xuY29uc3QgTUFTVFJBX01FVEFEQVRBX1BSRUZJWCA9IFwibWFzdHJhLm1ldGFkYXRhLlwiO1xuXG5pbnRlcmZhY2UgQXBwTWxmbG93VHJhY2VTdGF0ZSB7XG4gIHJlYWRvbmx5IHRhZ3M6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIGdlbmllOiBib29sZWFuO1xuICBtb2RlbD86IHN0cmluZztcbn1cblxuZnVuY3Rpb24gYXR0cmlidXRlU3RyaW5nKHNwYW46IFJlYWRhYmxlU3BhbiwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuLmF0dHJpYnV0ZXNbbmFtZV07XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyAoc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh2YWx1ZSkgPz8gdW5kZWZpbmVkKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbWV0YWRhdGFBdHRyaWJ1dGUoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7TUFTVFJBX01FVEFEQVRBX1BSRUZJWH0ke2tleX1gO1xufVxuXG5mdW5jdGlvbiBtb2RlbEZyb21TcGFuKHNwYW46IFJlYWRhYmxlU3Bhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRpcmVjdCA9IGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBHRU5fQUlfUkVRVUVTVF9NT0RFTF9BVFRSKTtcbiAgaWYgKGRpcmVjdCkgcmV0dXJuIGRpcmVjdDtcbiAgY29uc3QgbWV0YWRhdGEgPSBqc29uLnBhcnNlKGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBNQVNUUkFfTU9ERUxfTUVUQURBVEFfQVRUUikpO1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKG1ldGFkYXRhKSAmJiB0eXBlb2YgbWV0YWRhdGEubW9kZWxJZCA9PT0gXCJzdHJpbmdcIlxuICAgID8gKHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobWV0YWRhdGEubW9kZWxJZCkgPz8gdW5kZWZpbmVkKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzcGFuVXNlc0dlbmllKHNwYW46IFJlYWRhYmxlU3Bhbik6IGJvb2xlYW4ge1xuICBpZiAoc3Bhbi5hdHRyaWJ1dGVzW01MRkxPV19HRU5JRV9UQUdfQVRUUl0gPT09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKC9cXGJhc2tfZ2VuaWUoPzpffFxcYikvaS50ZXN0KHNwYW4ubmFtZSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gW1wiZ2VuX2FpLnRvb2wubmFtZVwiLCBcIm1hc3RyYS50b29sX2NhbGwubmFtZVwiXS5zb21lKChuYW1lKSA9PlxuICAgIC9eYXNrX2dlbmllKD86X3wkKS9pLnRlc3QoYXR0cmlidXRlU3RyaW5nKHNwYW4sIG5hbWUpID8/IFwiXCIpLFxuICApO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0VHJhY2VUYWdzKHNwYW46IFJlYWRhYmxlU3Bhbiwgc3RhdGU6IEFwcE1sZmxvd1RyYWNlU3RhdGUpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNwYW4uYXR0cmlidXRlcykpIHtcbiAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aChNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHRhZyA9IG5hbWUuc2xpY2UoTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgubGVuZ3RoKTtcbiAgICBpZiAoXG4gICAgICB0YWcgJiZcbiAgICAgICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpXG4gICAgKSB7XG4gICAgICBzdGF0ZS50YWdzLnNldCh0YWcsIFN0cmluZyh2YWx1ZSkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoclRpbWVNaWxsaXNlY29uZHModmFsdWU6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0pOiBudW1iZXIge1xuICByZXR1cm4gdmFsdWVbMF0gKiAxXzAwMCArIHZhbHVlWzFdIC8gMV8wMDBfMDAwO1xufVxuXG5mdW5jdGlvbiBwcmV2aWV3SW5wdXQoc3BhbjogUmVhZGFibGVTcGFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gYXR0cmlidXRlU3RyaW5nKHNwYW4sIE1BU1RSQV9BR0VOVF9JTlBVVF9BVFRSKTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAodGV4dE9ubHlDaGF0SW5wdXQoanNvbi5wYXJzZShyYXcpKSA/PyByYXcpLnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbn1cblxuZnVuY3Rpb24gcHJldmlld091dHB1dChzcGFuOiBSZWFkYWJsZVNwYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgTUFTVFJBX0FHRU5UX09VVFBVVF9BVFRSKTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2UocmF3KTtcbiAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tSnNvbihwYXJzZWQpIHx8ICh0eXBlb2YgcGFyc2VkID09PSBcInN0cmluZ1wiID8gcGFyc2VkIDogcmF3KTtcbiAgcmV0dXJuIHRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogUHJvbW90ZSB0aGUgYWN0dWFsIE1hc3RyYSBgaW52b2tlX2FnZW50YCB0cmFjZSBleHBvcnRlZCBieSBBcHBLaXQncyBwcm92aWRlci4gKi9cbmV4cG9ydCBjbGFzcyBBcHBNbGZsb3dUcmFjZUluZm9TcGFuUHJvY2Vzc29yIGltcGxlbWVudHMgU3BhblByb2Nlc3NvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhY2VzID0gbmV3IE1hcDxzdHJpbmcsIEFwcE1sZmxvd1RyYWNlU3RhdGU+KCk7XG5cbiAgb25TdGFydChzcGFuOiBTZGtTcGFuLCBfcGFyZW50Q29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBpZiAoIXRoaXMudHJhY2VzLmhhcyh0cmFjZUlkKSkge1xuICAgICAgdGhpcy50cmFjZXMuc2V0KHRyYWNlSWQsIHsgdGFnczogbmV3IE1hcCgpLCBnZW5pZTogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgb25FbmQoc3BhbjogUmVhZGFibGVTcGFuKTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGNvbnN0IHN0YXRlOiBBcHBNbGZsb3dUcmFjZVN0YXRlID0gdGhpcy50cmFjZXMuZ2V0KHRyYWNlSWQpID8/IHtcbiAgICAgIHRhZ3M6IG5ldyBNYXAoKSxcbiAgICAgIGdlbmllOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMudHJhY2VzLnNldCh0cmFjZUlkLCBzdGF0ZSk7XG4gICAgY29sbGVjdFRyYWNlVGFncyhzcGFuLCBzdGF0ZSk7XG4gICAgc3RhdGUubW9kZWwgPz89IG1vZGVsRnJvbVNwYW4oc3Bhbik7XG4gICAgc3RhdGUuZ2VuaWUgfHw9IHNwYW5Vc2VzR2VuaWUoc3Bhbik7XG5cbiAgICBpZiAoYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSKSAhPT0gXCJpbnZva2VfYWdlbnRcIikge1xuICAgICAgaWYgKCFzcGFuLnBhcmVudFNwYW5Db250ZXh0Py5zcGFuSWQpIHRoaXMudHJhY2VzLmRlbGV0ZSh0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2VudCA9XG4gICAgICBzdGF0ZS5tb2RlbCA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9JRF9BVFRSKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9OQU1FX0FUVFIpO1xuICAgIGlmIChhZ2VudCkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0FHRU5UX1RBRywgYWdlbnQpO1xuICAgIGlmIChzdGF0ZS5nZW5pZSkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0dFTklFX1RBRywgXCJ0cnVlXCIpO1xuICAgIGNvbnN0IGF1dGggPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgbWV0YWRhdGFBdHRyaWJ1dGUoTUFTVFJBX0FVVEhfTU9ERV9LRVkpKTtcbiAgICBpZiAoYXV0aCA9PT0gXCJvYm9cIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX09CT19BVVRIX1RBRywgXCJ0cnVlXCIpO1xuICAgIGVsc2UgaWYgKGF1dGggPT09IFwic2VydmljZS1wcmluY2lwYWxcIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX1NQX0FVVEhfVEFHLCBcInRydWVcIik7XG5cbiAgICBjb25zdCB1c2VyID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVVNFUl9FTUFJTF9LRVkpKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIG1ldGFkYXRhQXR0cmlidXRlKE1BU1RSQV9VU0VSX05BTUVfS0VZKSkgPz9cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSk7XG4gICAgY29uc3Qgc2Vzc2lvbklkID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVEhSRUFEX0lEX0tFWSkpID8/XG4gICAgICBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgXCJnZW5fYWkuY29udmVyc2F0aW9uLmlkXCIpO1xuICAgIGNvbnN0IHJlcXVlc3RQcmV2aWV3ID0gcHJldmlld0lucHV0KHNwYW4pO1xuICAgIGNvbnN0IHJlc3BvbnNlUHJldmlldyA9IHByZXZpZXdPdXRwdXQoc3Bhbik7XG4gICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICB0cmFjZUlkLFxuICAgICAgcmVxdWVzdFRpbWU6IGhyVGltZU1pbGxpc2Vjb25kcyhzcGFuLnN0YXJ0VGltZSksXG4gICAgICBleGVjdXRpb25EdXJhdGlvbjogaHJUaW1lTWlsbGlzZWNvbmRzKHNwYW4uZHVyYXRpb24pLFxuICAgICAgZXJyb3I6IHNwYW4uc3RhdHVzLmNvZGUgPT09IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgdGFnczogT2JqZWN0LmZyb21FbnRyaWVzKHN0YXRlLnRhZ3MpLFxuICAgICAgLi4uKHVzZXIgPyB7IHVzZXIgfSA6IHt9KSxcbiAgICAgIC4uLihzZXNzaW9uSWQgPyB7IHNlc3Npb25JZCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgfSk7XG4gICAgdGhpcy50cmFjZXMuZGVsZXRlKHRyYWNlSWQpO1xuICB9XG5cbiAgYXN5bmMgZm9yY2VGbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy50cmFjZXMuY2xlYXIoKTtcbiAgfVxufVxuXG5sZXQgYXBwTWxmbG93VHJhY2VJbmZvUHJvY2Vzc29yUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogUmVnaXN0ZXIgdHJhY2UgZW5yaWNobWVudCBiZWZvcmUgQXBwS2l0IGNvbnN0cnVjdHMgaXRzIG5hdGl2ZSBwcm92aWRlci4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvcigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvclJlZ2lzdGVyZWQpIHJldHVybiB0cnVlO1xuICBpZiAoIShhd2FpdCBpbml0aWFsaXplQXBwTWxmbG93VHJhY2VJbmZvKCkpKSByZXR1cm4gZmFsc2U7XG4gIGF3YWl0IGFwcGtpdFRlbGVtZXRyeS5yZWdpc3Rlck5hdGl2ZVNwYW5Qcm9jZXNzb3IobmV3IEFwcE1sZmxvd1RyYWNlSW5mb1NwYW5Qcm9jZXNzb3IoKSk7XG4gIGFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvclJlZ2lzdGVyZWQgPSB0cnVlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIEluY3JlbWVudGFsbHkgYXNzZW1ibGUgVVRGLTggU1NFIHRleHQgd2hpbGUgcmV0YWluaW5nIGEgYm91bmRlZCBKU09OIGZhbGxiYWNrLiAqL1xuY2xhc3MgQXNzaXN0YW50UmVzcG9uc2VDb2xsZWN0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihcInV0ZjhcIik7XG4gIHByaXZhdGUgYW5zd2VyID0gXCJcIjtcbiAgcHJpdmF0ZSBib2R5ID0gXCJcIjtcbiAgcHJpdmF0ZSBwZW5kaW5nTGluZSA9IFwiXCI7XG4gIHByaXZhdGUgZmluaXNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBnZW5pZSA9IGZhbHNlO1xuXG4gIHdyaXRlKGNodW5rOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoY2h1bmspO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSkge1xuICAgICAgdGhpcy5jb25zdW1lKFxuICAgICAgICB0aGlzLmRlY29kZXIud3JpdGUoQnVmZmVyLmZyb20oY2h1bmsuYnVmZmVyLCBjaHVuay5ieXRlT2Zmc2V0LCBjaHVuay5ieXRlTGVuZ3RoKSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZpbmlzaCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbmlzaGVkKSByZXR1cm4gdGhpcy5hbnN3ZXIgfHwgdGhpcy5qc29uQW5zd2VyKCk7XG4gICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgdGhpcy5jb25zdW1lKHRoaXMuZGVjb2Rlci5lbmQoKSk7XG4gICAgdGhpcy5jb25zdW1lU3NlTGluZSh0aGlzLnBlbmRpbmdMaW5lKTtcbiAgICB0aGlzLnBlbmRpbmdMaW5lID0gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5hbnN3ZXIgfHwgdGhpcy5qc29uQW5zd2VyKCk7XG4gIH1cblxuICByYXdCb2R5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYm9keS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG4gIH1cblxuICB1c2VkR2VuaWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuaWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWUodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgaWYgKHRoaXMuYm9keS5sZW5ndGggPCBSRVNQT05TRV9CT0RZX0xJTUlUKSB7XG4gICAgICB0aGlzLmJvZHkgKz0gdGV4dC5zbGljZSgwLCBSRVNQT05TRV9CT0RZX0xJTUlUIC0gdGhpcy5ib2R5Lmxlbmd0aCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0xpbmUgKz0gdGV4dDtcbiAgICBsZXQgbmV3bGluZSA9IHRoaXMucGVuZGluZ0xpbmUuaW5kZXhPZihcIlxcblwiKTtcbiAgICB3aGlsZSAobmV3bGluZSA+PSAwKSB7XG4gICAgICB0aGlzLmNvbnN1bWVTc2VMaW5lKHRoaXMucGVuZGluZ0xpbmUuc2xpY2UoMCwgbmV3bGluZSkucmVwbGFjZSgvXFxyJC8sIFwiXCIpKTtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKG5ld2xpbmUgKyAxKTtcbiAgICAgIG5ld2xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLmluZGV4T2YoXCJcXG5cIik7XG4gICAgfVxuICAgIGlmICh0aGlzLnBlbmRpbmdMaW5lLmxlbmd0aCA+IFJFU1BPTlNFX0JPRFlfTElNSVQpIHtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKC1SRVNQT05TRV9CT0RZX0xJTUlUKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTc2VMaW5lKGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZyYW1lID0gc3NlRnJhbWUobGluZSk7XG4gICAgdGhpcy5nZW5pZSB8fD0gdmFsdWVVc2VzR2VuaWUoZnJhbWUpO1xuICAgIGlmICh0aGlzLmFuc3dlci5sZW5ndGggPj0gVFJBQ0VfSU9fTElNSVQpIHJldHVybjtcbiAgICBjb25zdCB0ZXh0ID0gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShmcmFtZSk7XG4gICAgdGhpcy5hbnN3ZXIgKz0gdGV4dC5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCAtIHRoaXMuYW5zd2VyLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGpzb25BbnN3ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYXNzaXN0YW50VGV4dEZyb21Kc29uKGpzb24ucGFyc2UodGhpcy5ib2R5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNwYW4gTUxmbG93IHRyZWF0cyBhcyB0aGUgcmVxdWVzdCByb290LlxuICpcbiAqIE9UZWwgSFRUUCBpbnN0cnVtZW50YXRpb24gc3RvcmVzIGl0cyBzZXJ2ZXIgc3BhbiBpbiBSUEMgbWV0YWRhdGEuIFRoYXQgc3BhblxuICogd2lucyBvdmVyIGFuIGFjdGl2ZSBFeHByZXNzIGNoaWxkLiBJZiBubyByZWNvcmRpbmcgbG9jYWwgc3BhbiBleGlzdHMsIGNyZWF0ZVxuICogb25lIHVuZGVyIHRoZSBjdXJyZW50IGNvbnRleHQgc28gZW5hYmxlZCBXM0MgcHJvcGFnYXRpb24gcmVtYWlucyBpbnRhY3QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUcmFjZVRhcmdldCgpOiBUcmFjZVRhcmdldCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjdGl2ZUNvbnRleHQgPSBjb250ZXh0LmFjdGl2ZSgpO1xuICBpZiAoZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSgpKSB7XG4gICAgY29uc3Qgc3BhbiA9IHRyYWNlLmdldFRyYWNlcihDSEFUX1RVUk5fVFJBQ0VSKS5zdGFydFNwYW4oXG4gICAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICAgIHtcbiAgICAgICAga2luZDogU3BhbktpbmQuU0VSVkVSLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgW0FQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFJdOiB0cnVlLFxuICAgICAgICAgIFtNTEZMT1dfU1BBTl9UWVBFX0FUVFJdOiBNTEZMT1dfU1BBTl9UWVBFX0FHRU5ULFxuICAgICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJhY2UuZGVsZXRlU3BhbihhY3RpdmVDb250ZXh0KSxcbiAgICApO1xuICAgIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IHJwYyA9IGdldFJQQ01ldGFkYXRhKGFjdGl2ZUNvbnRleHQpO1xuICBpZiAocnBjPy50eXBlID09PSBSUENUeXBlLkhUVFAgJiYgcnBjLnNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHJldHVybiB7IHNwYW46IHJwYy5zcGFuLCBvd25lZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZSA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKTtcbiAgaWYgKGFjdGl2ZT8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuIHsgc3BhbjogYWN0aXZlLCBvd25lZDogZmFsc2UgfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2UuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpLnN0YXJ0U3BhbihcbiAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICB7XG4gICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIFtBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSXTogdHJ1ZSxcbiAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgYWN0aXZlQ29udGV4dCxcbiAgKTtcbiAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICBzcGFuLmVuZCgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCBzdGFtcHMgY2hhdCB0dXJuIEkvTyBvbnRvIHRoZSBleHBvcnRlZCBPVGVsIHJvb3QuXG4gKlxuICogVGVlIGByZXMud3JpdGVgLCBgcmVzLmpzb25gLCBhbmQgYHJlcy5lbmRgIGluc3RlYWQgb2YgbGlzdGVuaW5nIGZvciBgZmluaXNoYDpcbiAqIEhUVFAgaW5zdHJ1bWVudGF0aW9uIGVuZHMgaXRzIHNlcnZlciBzcGFuIG9uIGZpbmlzaCwgYW5kIGF0dHJpYnV0ZXMgc2V0XG4gKiBhZnRlciBhIHNwYW4gZW5kcyBuZXZlciByZWFjaCB0aGUgZXhwb3J0ZXIuXG4gKlxuICogYHBhdGhgIGlzIG1vdW50LXJlbGF0aXZlICh3aGF0IHRoZSBNYXN0cmEgc3ViLWFwcCBzZWVzKSwgZS5nLlxuICogYC9hZ2VudHMvc3VwcG9ydC9zdHJlYW1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlKFxuICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgaWYgKHJlcS5tZXRob2QgIT09IFwiUE9TVFwiIHx8ICFBR0VOVF9UVVJOX1JPVVRFLnRlc3QocmVxLnBhdGgpKSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSByZXNvbHZlVHJhY2VUYXJnZXQoKTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhcmdldFRyYWNlSWQgPSB0cmFjZUlkKHRhcmdldC5zcGFuKTtcbiAgaWYgKCF0YXJnZXRUcmFjZUlkKSB7XG4gICAgaWYgKHRhcmdldC5vd25lZCkgdGFyZ2V0LnNwYW4uZW5kKCk7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0cmFjZVN0YXRlOiBDaGF0VHJhY2VTdGF0ZSA9IHtcbiAgICB0YWdzOiBuZXcgTWFwKCksXG4gICAgdHJhY2VJZDogdGFyZ2V0VHJhY2VJZCxcbiAgICBwYXJlbnRTcGFuSWQ6IHRhcmdldC5zcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkLFxuICB9O1xuICBjb25zdCB0cmFjZVJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgaWYgKCFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgc2V0Q2hhdFRyYWNlVGFnKHRyYWNlU3RhdGUsIE1MRkxPV19MT0NBTF9UQUcsIHRydWUpO1xuICB9XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRSZXF1ZXN0VGFncyhyZXEpKSkge1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgY29uc3QgaW5pdGlhbFRhZ3MgPSB0eXBlb2Ygb3B0aW9ucy50YWdzID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLnRhZ3MocmVxKSA6IG9wdGlvbnMudGFncztcbiAgaWYgKGluaXRpYWxUYWdzKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWxUYWdzKSkge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHN0YW1wTWxmbG93VHJhY2VJZChyZXMsIHRyYWNlU3RhdGUudHJhY2VJZCk7XG4gIHRyYWNlU3RhdGUudXNlciA9IHN0YW1wTWxmbG93QWN0b3IodGFyZ2V0LnNwYW4sIHJlcSk7XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIFwiaW52b2tlX2FnZW50XCIpO1xuICBjb25zdCBpZGVudGl0eSA9XG4gICAgdHlwZW9mIG9wdGlvbnMuaWRlbnRpdHkgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaWRlbnRpdHkocmVxKSA6IG9wdGlvbnMuaWRlbnRpdHk7XG4gIGlmIChpZGVudGl0eSkge1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0lERU5USVRZX0FUVFIsIGlkZW50aXR5KTtcbiAgICBzZXRDaGF0VHJhY2VUYWcoXG4gICAgICB0cmFjZVN0YXRlLFxuICAgICAgaWRlbnRpdHkgPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgZmFsc2UpO1xuXG4gIGNvbnN0IG1lc3NhZ2VzID0gKHJlcS5ib2R5IGFzIHsgbWVzc2FnZXM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5tZXNzYWdlcztcbiAgbGV0IHJlcXVlc3RQcmV2aWV3OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChtZXNzYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZnVsbElucHV0ID0gc2VyaWFsaXplZChtZXNzYWdlcyk7XG4gICAgcmVxdWVzdFByZXZpZXcgPSB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlcykgPz8gZnVsbElucHV0O1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX01FU1NBR0VTX0FUVFIsIGZ1bGxJbnB1dCk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TUEFOX0lOUFVUU19BVFRSLCByZXF1ZXN0UHJldmlldy5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdG9yID0gbmV3IEFzc2lzdGFudFJlc3BvbnNlQ29sbGVjdG9yKCk7XG4gIGxldCByZXNwb25zZVByZXZpZXc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBmdWxsT3V0cHV0UmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IGdlbmllUmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IG93bmVkU3BhbkVuZGVkID0gZmFsc2U7XG4gIGxldCB0cmFjZUZpbmFsaXplZCA9IGZhbHNlO1xuICBjb25zdCBwYXNzVGhyb3VnaFdyaXRlID0gcmVzLndyaXRlLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBib29sZWFuO1xuICBjb25zdCBwYXNzVGhyb3VnaEVuZCA9IHJlcy5lbmQuYmluZChyZXMpIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gIGNvbnN0IHBhc3NUaHJvdWdoSnNvbiA9IHJlcy5qc29uLmJpbmQocmVzKSBhcyAoYm9keT86IHVua25vd24pID0+IGV4cHJlc3MuUmVzcG9uc2U7XG4gIGNvbnN0IHJlY29yZE91dHB1dCA9IChhbnN3ZXI6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChvdXRwdXRSZWNvcmRlZCB8fCAhYW5zd2VyKSByZXR1cm47XG4gICAgcmVzcG9uc2VQcmV2aWV3ID0gYW5zd2VyO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIGFuc3dlci5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIG91dHB1dFJlY29yZGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgcmVjb3JkRnVsbE91dHB1dCA9IChyZXNwb25zZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKGZ1bGxPdXRwdXRSZWNvcmRlZCB8fCAhcmVzcG9uc2UpIHJldHVybjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9SRVNQT05TRV9BVFRSLCByZXNwb25zZS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIGZ1bGxPdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEdlbmllID0gKHVzZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICBpZiAoIXVzZWQgfHwgZ2VuaWVSZWNvcmRlZCkgcmV0dXJuO1xuICAgIGdlbmllUmVjb3JkZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgdHJ1ZSk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfR0VOSUVfVEFHLCB0cnVlKTtcbiAgICBjb250ZXh0LndpdGgodHJhY2Uuc2V0U3Bhbihjb250ZXh0LmFjdGl2ZSgpLCB0YXJnZXQuc3BhbiksICgpID0+IHtcbiAgICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfR0VOSUVfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGZpbmFsaXplVHJhY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRyYWNlRmluYWxpemVkKSByZXR1cm47XG4gICAgdHJhY2VGaW5hbGl6ZWQgPSB0cnVlO1xuICAgIGNvbnN0IHRhZ3MgPSBPYmplY3QuZnJvbUVudHJpZXModHJhY2VTdGF0ZS50YWdzKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdHJhY2VTdGF0ZS50YWdzKSB7XG4gICAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoYCR7TUxGTE9XX1RSQUNFX1RBR19QUkVGSVh9JHtuYW1lfWAsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRyYWNlU3RhdGUudXNlcikgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHRyYWNlU3RhdGUudXNlcik7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKCFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgICBwZXJzaXN0QXBwTWxmbG93VHJhY2VJbmZvKHtcbiAgICAgICAgdHJhY2VJZDogdHJhY2VTdGF0ZS50cmFjZUlkLFxuICAgICAgICByZXF1ZXN0VGltZTogdHJhY2VSZXF1ZXN0VGltZSxcbiAgICAgICAgZXhlY3V0aW9uRHVyYXRpb246IERhdGUubm93KCkgLSB0cmFjZVJlcXVlc3RUaW1lLFxuICAgICAgICBlcnJvcjogcmVzLnN0YXR1c0NvZGUgPj0gNTAwLFxuICAgICAgICB0YWdzLFxuICAgICAgICAuLi4odHJhY2VTdGF0ZS51c2VyID8geyB1c2VyOiB0cmFjZVN0YXRlLnVzZXIgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgICAuLi4ocmVzcG9uc2VQcmV2aWV3ID8geyByZXNwb25zZVByZXZpZXcgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZW5kT3duZWRTcGFuID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGFyZ2V0Lm93bmVkIHx8IG93bmVkU3BhbkVuZGVkKSByZXR1cm47XG4gICAgb3duZWRTcGFuRW5kZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLmVuZCgpO1xuICB9O1xuXG4gIHJlcy53cml0ZSA9ICgoY2h1bms6IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbGxlY3Rvci53cml0ZShjaHVuayk7XG4gICAgcmV0dXJuIHBhc3NUaHJvdWdoV3JpdGUoY2h1bmssIC4uLnJlc3QpO1xuICB9KSBhcyB0eXBlb2YgcmVzLndyaXRlO1xuXG4gIHJlcy5qc29uID0gKChib2R5PzogdW5rbm93bikgPT4ge1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoc2VyaWFsaXplZChib2R5KSk7XG4gICAgcmVjb3JkR2VuaWUodmFsdWVVc2VzR2VuaWUoYm9keSkpO1xuICAgIHJlY29yZE91dHB1dChhc3Npc3RhbnRUZXh0RnJvbUpzb24oYm9keSkpO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaEpzb24oYm9keSk7XG4gIH0pIGFzIHR5cGVvZiByZXMuanNvbjtcblxuICByZXMuZW5kID0gKChjaHVuaz86IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbGxlY3Rvci53cml0ZShjaHVuayk7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoRW5kKGNodW5rLCAuLi5yZXN0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW5kT3duZWRTcGFuKCk7XG4gICAgfVxuICB9KSBhcyB0eXBlb2YgcmVzLmVuZDtcblxuICByZXMub25jZShcImNsb3NlXCIsICgpID0+IHtcbiAgICByZWNvcmRPdXRwdXQoY29sbGVjdG9yLmZpbmlzaCgpKTtcbiAgICByZWNvcmRGdWxsT3V0cHV0KGNvbGxlY3Rvci5yYXdCb2R5KCkpO1xuICAgIHJlY29yZEdlbmllKGNvbGxlY3Rvci51c2VkR2VuaWUoKSk7XG4gICAgZmluYWxpemVUcmFjZSgpO1xuICAgIGVuZE93bmVkU3BhbigpO1xuICB9KTtcblxuICBjb25zdCBjaGF0Q29udGV4dCA9IHRyYWNlXG4gICAgLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pXG4gICAgLnNldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZLCB0cmFjZVN0YXRlKTtcbiAgY29udGV4dC53aXRoKGNoYXRDb250ZXh0LCAoKSA9PiB7XG4gICAgbmV4dCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHtAbGluayBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmV9IG9uIGEgTWFzdHJhIEV4cHJlc3Mgc3ViLWFwcC5cbiAqXG4gKiBDYWxsIGJlZm9yZSBgTWFzdHJhU2VydmVyLmluaXQoKWAgc28gdGhlIGxheWVyIHNpdHMgYWhlYWQgb2YgdGhlIGFnZW50XG4gKiByb3V0ZXMuIFNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHk6IHdoZW4gbm8gcmVjb3JkaW5nIHRyYWNlciBpcyByZWdpc3RlcmVkLFxuICogdGhlIG1pZGRsZXdhcmUgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5KFxuICBhcHA6IGV4cHJlc3MuRXhwcmVzcyxcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCwgb3B0aW9ucykpO1xuICBsb2dnZXIuaW5mbyhcImNoYXQgdHVybiB0ZWxlbWV0cnkgbWlkZGxld2FyZSBhdHRhY2hlZFwiLCBvcHRpb25zKTtcbn1cbiJdfQ==
|
package/lib/src/workspaces.d.ts
CHANGED
|
@@ -97,8 +97,8 @@ export interface DatabricksWorkspaceOptions extends Omit<WorkspaceConfig, "files
|
|
|
97
97
|
/** Add user-scoped `/tmp` only when no configured Databricks path mounts writable. */
|
|
98
98
|
fallbackToTmp?: boolean;
|
|
99
99
|
/**
|
|
100
|
-
* Extra local skill trees mounted read-only for file access
|
|
101
|
-
* converts them to native agent-level skills
|
|
100
|
+
* Extra local skill trees mounted read-only for file access and workspace
|
|
101
|
+
* skill search. The plugin also converts them to native agent-level skills.
|
|
102
102
|
*/
|
|
103
103
|
extraSkillMounts?: LocalSkillMount[];
|
|
104
104
|
/** Skill names provided directly to agents and excluded from workspace search. */
|