velocious 1.0.564 → 1.0.566
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 +4 -2
- package/build/configuration-types.js +1 -0
- package/build/configuration.js +20 -0
- package/build/database/record/acts-as-list.js +37 -10
- package/build/environment-handlers/node/cli/commands/generate/base-models.js +4 -12
- package/build/http-server/client/websocket-session.js +455 -69
- package/build/src/configuration-types.d.ts +8 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -1
- package/build/src/configuration.d.ts +12 -0
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +19 -1
- package/build/src/database/record/acts-as-list.d.ts.map +1 -1
- package/build/src/database/record/acts-as-list.js +34 -12
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +5 -13
- package/build/src/http-server/client/websocket-session.d.ts +102 -4
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +404 -67
- package/package.json +1 -1
- package/src/configuration-types.js +1 -0
- package/src/configuration.js +20 -0
- package/src/database/record/acts-as-list.js +37 -10
- package/src/environment-handlers/node/cli/commands/generate/base-models.js +4 -12
- package/src/http-server/client/websocket-session.js +455 -69
|
@@ -1,15 +1,30 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
|
-
import
|
|
3
|
+
import { ensureError } from "typanic";
|
|
4
|
+
import { ValidationError } from "../../database/record/index.js";
|
|
4
5
|
import Logger from "../../logger.js";
|
|
5
|
-
import
|
|
6
|
-
import
|
|
6
|
+
import EventEmitter from "../../utils/event-emitter.js";
|
|
7
|
+
import isPlainObject from "../../utils/plain-object.js";
|
|
8
|
+
import VelociousError from "../../velocious-error.js";
|
|
7
9
|
import WebsocketChannel from "../websocket-channel.js";
|
|
8
10
|
import { websocketEventLogStoreForConfiguration } from "../websocket-event-log-store.js";
|
|
11
|
+
import RequestRunner from "./request-runner.js";
|
|
12
|
+
import WebsocketRequest from "./websocket-request.js";
|
|
9
13
|
/**
|
|
10
14
|
* Defines this typedef.
|
|
11
15
|
* @typedef {{type: "subscribe", channel: string, lastEventId?: string, params?: Record<string, ?>} | {type: "metadata", data?: Record<string, ?>} | {type?: "request", body?: ?, headers?: Record<string, ?>, id?: string | number | null, method: string, path: string} | Record<string, ?>} WebsocketSessionMessage
|
|
12
16
|
*/
|
|
17
|
+
/**
|
|
18
|
+
* @typedef {object} InboundMessageAdmission
|
|
19
|
+
* @property {number} byteLength - Exact raw text payload bytes charged to this admission.
|
|
20
|
+
* @property {number} generation - Accounting generation active when admitted.
|
|
21
|
+
* @property {boolean} released - Whether this admission has already been released.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* @typedef {object} InboundMessageWork
|
|
25
|
+
* @property {InboundMessageAdmission} admission - Admission ownership.
|
|
26
|
+
* @property {WebsocketSessionMessage} message - Decoded client message.
|
|
27
|
+
*/
|
|
13
28
|
const WEBSOCKET_FINAL_FRAME = 0x80;
|
|
14
29
|
const WEBSOCKET_OPCODE_CONTINUATION = 0x0;
|
|
15
30
|
const WEBSOCKET_OPCODE_TEXT = 0x1;
|
|
@@ -17,6 +32,9 @@ const WEBSOCKET_OPCODE_BINARY = 0x2;
|
|
|
17
32
|
const WEBSOCKET_OPCODE_CLOSE = 0x8;
|
|
18
33
|
const WEBSOCKET_OPCODE_PING = 0x9;
|
|
19
34
|
const WEBSOCKET_OPCODE_PONG = 0xA;
|
|
35
|
+
const WEBSOCKET_CLOSE_POLICY_VIOLATION = 1008;
|
|
36
|
+
const WEBSOCKET_INBOUND_BACKLOG_CLOSE_REASON = "Inbound message backlog exceeded";
|
|
37
|
+
const WEBSOCKET_MAX_CLOSE_REASON_BYTES = 123;
|
|
20
38
|
/** Cap on the paused outbound queue; oldest frames drop on overflow. */
|
|
21
39
|
const WEBSOCKET_PAUSED_QUEUE_CAP = 1000;
|
|
22
40
|
/** Cap on total bytes buffered for a single fragmented message. */
|
|
@@ -79,7 +97,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
79
97
|
channelReplayStates = new Map();
|
|
80
98
|
/**
|
|
81
99
|
* Message queue.
|
|
82
|
-
* @type {
|
|
100
|
+
* @type {InboundMessageWork[]} */
|
|
83
101
|
messageQueue = [];
|
|
84
102
|
/**
|
|
85
103
|
* Runs constructor.
|
|
@@ -104,6 +122,14 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
104
122
|
this.messageHandlerPromise = messageHandlerPromise;
|
|
105
123
|
this.pendingMessageHandler = Boolean(messageHandlerPromise);
|
|
106
124
|
this.logger = new Logger(this);
|
|
125
|
+
const inboundQueueLimits = this.configuration.getWebsocketInboundQueueLimits();
|
|
126
|
+
this._inboundMaxPendingBytes = inboundQueueLimits.maxBytes;
|
|
127
|
+
this._inboundMaxPendingMessages = inboundQueueLimits.maxMessages;
|
|
128
|
+
this._inboundPendingBytes = 0;
|
|
129
|
+
this._inboundPendingMessages = 0;
|
|
130
|
+
this._inboundAccountingGeneration = 0;
|
|
131
|
+
this._inboundClosed = false;
|
|
132
|
+
this._inboundBacklogOverloaded = false;
|
|
107
133
|
/**
|
|
108
134
|
* Narrows the runtime value to the documented type.
|
|
109
135
|
* @type {Record<string, ?>} */
|
|
@@ -249,6 +275,9 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
249
275
|
}
|
|
250
276
|
destroy() {
|
|
251
277
|
this._stopHeartbeat();
|
|
278
|
+
this._resetFragmentBuffer();
|
|
279
|
+
this._clearBufferedFrameChunks();
|
|
280
|
+
this._abandonInboundMessages();
|
|
252
281
|
this.configuration._websocketSessions.delete(this);
|
|
253
282
|
this._paused = false;
|
|
254
283
|
void this._teardownChannel();
|
|
@@ -275,7 +304,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
275
304
|
// socket is alive. Mark it here, before `_processBuffer` may return
|
|
276
305
|
// early waiting for the rest of an incomplete frame.
|
|
277
306
|
this._heartbeatAlive = true;
|
|
278
|
-
if (data.length === 0)
|
|
307
|
+
if (this._inboundClosed || data.length === 0)
|
|
279
308
|
return;
|
|
280
309
|
this._bufferChunks.push(data);
|
|
281
310
|
this._bufferedBytes += data.length;
|
|
@@ -363,34 +392,121 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
363
392
|
}
|
|
364
393
|
await this._registerChannel(channel, tenant);
|
|
365
394
|
}
|
|
366
|
-
catch (
|
|
395
|
+
catch (caughtError) {
|
|
396
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
397
|
+
stage: "websocket-channel-initialize"
|
|
398
|
+
});
|
|
367
399
|
this.logger.error(() => ["Failed to initialize websocket channel", error]);
|
|
368
400
|
}
|
|
369
401
|
}
|
|
370
402
|
/**
|
|
371
403
|
* Runs send goodbye.
|
|
372
404
|
* @param {import("./index.js").default} client - Client instance.
|
|
405
|
+
* @param {{code?: number, reason?: string}} [options] - Optional close status.
|
|
373
406
|
* @returns {void} - No return value.
|
|
374
407
|
*/
|
|
375
|
-
sendGoodbye(client) {
|
|
376
|
-
|
|
408
|
+
sendGoodbye(client, { code, reason = "" } = {}) {
|
|
409
|
+
let payload;
|
|
410
|
+
if (code === undefined) {
|
|
411
|
+
payload = Buffer.alloc(0);
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
const reasonBytes = Buffer.from(reason, "utf-8");
|
|
415
|
+
if (reasonBytes.length > WEBSOCKET_MAX_CLOSE_REASON_BYTES) {
|
|
416
|
+
throw new RangeError("WebSocket close reason must not exceed 123 UTF-8 bytes");
|
|
417
|
+
}
|
|
418
|
+
payload = Buffer.allocUnsafe(2 + reasonBytes.length);
|
|
419
|
+
payload.writeUInt16BE(code, 0);
|
|
420
|
+
reasonBytes.copy(payload, 2);
|
|
421
|
+
}
|
|
422
|
+
const frame = Buffer.concat([
|
|
423
|
+
Buffer.from([WEBSOCKET_FINAL_FRAME | WEBSOCKET_OPCODE_CLOSE, payload.length]),
|
|
424
|
+
payload
|
|
425
|
+
]);
|
|
377
426
|
client.events.emit("output", frame, { websocketFrame: true });
|
|
378
427
|
}
|
|
428
|
+
/**
|
|
429
|
+
* Whether a caught dispatch error is an expected client-flow failure.
|
|
430
|
+
* @param {Error} error - Normalized dispatch error.
|
|
431
|
+
* @returns {boolean} - Whether framework error reporters should ignore it.
|
|
432
|
+
*/
|
|
433
|
+
_expectedClientError(error) {
|
|
434
|
+
if (error instanceof ValidationError)
|
|
435
|
+
return true;
|
|
436
|
+
if (error instanceof VelociousError && error.safeToExpose)
|
|
437
|
+
return true;
|
|
438
|
+
const annotatedError = /** @type {Error & {errorType?: string, velocious?: Record<string, ?>}} */ (error);
|
|
439
|
+
if (isPlainObject(annotatedError.velocious))
|
|
440
|
+
return true;
|
|
441
|
+
return typeof annotatedError.errorType === "string" && annotatedError.errorType.length > 0;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Reports one unexpected WebSocket dispatch failure and returns its normalized Error.
|
|
445
|
+
* @param {?} caughtError - Caught dispatch failure.
|
|
446
|
+
* @param {Record<string, ?>} context - Structured dispatch context.
|
|
447
|
+
* @returns {Error} - Normalized error for existing logs and client responses.
|
|
448
|
+
*/
|
|
449
|
+
_reportUnexpectedDispatchError(caughtError, context) {
|
|
450
|
+
const error = ensureError(caughtError);
|
|
451
|
+
if (this._expectedClientError(error))
|
|
452
|
+
return error;
|
|
453
|
+
const errorPayload = {
|
|
454
|
+
context,
|
|
455
|
+
error,
|
|
456
|
+
request: this.upgradeRequest
|
|
457
|
+
};
|
|
458
|
+
const errorEvents = this.configuration.getErrorEvents();
|
|
459
|
+
errorEvents.emit("framework-error", errorPayload);
|
|
460
|
+
errorEvents.emit("all-error", { ...errorPayload, errorType: "framework-error" });
|
|
461
|
+
return error;
|
|
462
|
+
}
|
|
379
463
|
/**
|
|
380
464
|
* Runs handle message.
|
|
381
465
|
* @param {WebsocketSessionMessage} message - Message text.
|
|
382
466
|
* @returns {Promise<void>} - Resolves when complete.
|
|
383
467
|
*/
|
|
384
468
|
async _handleMessage(message) {
|
|
469
|
+
const admission = this._admitInboundMessage(0);
|
|
470
|
+
if (!admission)
|
|
471
|
+
return;
|
|
472
|
+
await this._handleMessageWork({ admission, message });
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Appends an admitted message to the per-session FIFO chain.
|
|
476
|
+
* @param {InboundMessageWork} work - Admitted decoded message.
|
|
477
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
478
|
+
*/
|
|
479
|
+
async _handleMessageWork(work) {
|
|
385
480
|
// Serialize per-session: chain onto `_messageChain` so messages
|
|
386
481
|
// are processed one at a time. Without this, fire-and-forget
|
|
387
482
|
// dispatch from `_processBuffer` lets message B read
|
|
388
483
|
// `session.data` before A has finished writing it.
|
|
389
484
|
const previous = this._messageChain;
|
|
390
|
-
const next = previous.then(() => this.
|
|
485
|
+
const next = previous.then(() => this._runMessageWork(work));
|
|
391
486
|
this._messageChain = next.catch(() => { });
|
|
392
487
|
await next;
|
|
393
488
|
}
|
|
489
|
+
/**
|
|
490
|
+
* Dispatches or transfers one admitted message while retaining its accounting.
|
|
491
|
+
* @param {InboundMessageWork} work - Admitted decoded message.
|
|
492
|
+
* @returns {Promise<void>} - Resolves after dispatch or resolver-queue transfer.
|
|
493
|
+
*/
|
|
494
|
+
async _runMessageWork(work) {
|
|
495
|
+
if (this._inboundClosed) {
|
|
496
|
+
this._releaseInboundAdmission(work.admission);
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
if (this.pendingMessageHandler) {
|
|
500
|
+
this.messageQueue.push(work);
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
try {
|
|
504
|
+
await this._dispatchMessage(work.message);
|
|
505
|
+
}
|
|
506
|
+
finally {
|
|
507
|
+
this._releaseInboundAdmission(work.admission);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
394
510
|
/**
|
|
395
511
|
* Runs dispatch message.
|
|
396
512
|
* @param {WebsocketSessionMessage} message - Message text.
|
|
@@ -412,10 +528,6 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
412
528
|
* @returns {Promise<void>}
|
|
413
529
|
*/
|
|
414
530
|
async _handleMessageInner(message) {
|
|
415
|
-
if (this.pendingMessageHandler) {
|
|
416
|
-
this.messageQueue.push(message);
|
|
417
|
-
return;
|
|
418
|
-
}
|
|
419
531
|
// The messageHandler short-circuits default routing only when the
|
|
420
532
|
// app actually declared an `onMessage` hook. Apps that only want
|
|
421
533
|
// session-lifecycle tracking (`onOpen`/`onClose`) still need the
|
|
@@ -429,7 +541,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
429
541
|
if (subscribePayload) {
|
|
430
542
|
const { channel, lastEventId, params } = subscribePayload;
|
|
431
543
|
if (!channel)
|
|
432
|
-
throw
|
|
544
|
+
throw VelociousError.safe("channel is required for subscribe");
|
|
433
545
|
const resolver = this.configuration.getWebsocketChannelResolver?.();
|
|
434
546
|
if (resolver) {
|
|
435
547
|
await this._handleChannelSubscription({ channel, lastEventId, params });
|
|
@@ -486,9 +598,9 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
486
598
|
}
|
|
487
599
|
const { body, headers, id, method, path } = requestPayload;
|
|
488
600
|
if (!method)
|
|
489
|
-
throw
|
|
601
|
+
throw VelociousError.safe("method is required");
|
|
490
602
|
if (!path)
|
|
491
|
-
throw
|
|
603
|
+
throw VelociousError.safe("path is required");
|
|
492
604
|
const request = new WebsocketRequest({
|
|
493
605
|
body,
|
|
494
606
|
headers,
|
|
@@ -648,14 +760,25 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
648
760
|
this.logger.warn(`Unsupported websocket data opcode after reassembly: ${finalOpcode}`);
|
|
649
761
|
continue;
|
|
650
762
|
}
|
|
763
|
+
const admission = this._admitInboundMessage(finalPayload.length);
|
|
764
|
+
if (!admission)
|
|
765
|
+
return;
|
|
651
766
|
try {
|
|
652
767
|
const message = JSON.parse(finalPayload.toString("utf-8"));
|
|
653
|
-
this.
|
|
768
|
+
this._handleMessageWork({ admission, message }).catch((caughtError) => {
|
|
769
|
+
const clientErrorMessage = caughtError instanceof Error ? caughtError.message : String(caughtError);
|
|
770
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
771
|
+
stage: "websocket-message-dispatch"
|
|
772
|
+
});
|
|
654
773
|
this.logger.error(() => ["Websocket message handler failed", error]);
|
|
655
|
-
this.sendJson({
|
|
774
|
+
this.sendJson({
|
|
775
|
+
error: clientErrorMessage,
|
|
776
|
+
type: "error"
|
|
777
|
+
});
|
|
656
778
|
});
|
|
657
779
|
}
|
|
658
780
|
catch (error) {
|
|
781
|
+
this._releaseInboundAdmission(admission);
|
|
659
782
|
this.logger.error(() => ["Failed to parse websocket message", error]);
|
|
660
783
|
this.sendJson({ error: "Invalid websocket message", type: "error" });
|
|
661
784
|
}
|
|
@@ -724,6 +847,77 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
724
847
|
this._bufferChunkOffset = 0;
|
|
725
848
|
this._bufferedBytes = 0;
|
|
726
849
|
}
|
|
850
|
+
/**
|
|
851
|
+
* Tentatively admits one complete text message before decoding it.
|
|
852
|
+
* @param {number} byteLength - Exact complete raw text payload bytes.
|
|
853
|
+
* @returns {InboundMessageAdmission | null} - Admission ownership, or null after overload/close.
|
|
854
|
+
*/
|
|
855
|
+
_admitInboundMessage(byteLength) {
|
|
856
|
+
if (this._inboundClosed)
|
|
857
|
+
return null;
|
|
858
|
+
if (this._inboundPendingMessages + 1 > this._inboundMaxPendingMessages ||
|
|
859
|
+
this._inboundPendingBytes + byteLength > this._inboundMaxPendingBytes) {
|
|
860
|
+
this._closeForInboundBacklog(byteLength);
|
|
861
|
+
return null;
|
|
862
|
+
}
|
|
863
|
+
this._inboundPendingMessages += 1;
|
|
864
|
+
this._inboundPendingBytes += byteLength;
|
|
865
|
+
return {
|
|
866
|
+
byteLength,
|
|
867
|
+
generation: this._inboundAccountingGeneration,
|
|
868
|
+
released: false
|
|
869
|
+
};
|
|
870
|
+
}
|
|
871
|
+
/**
|
|
872
|
+
* Releases one admission exactly once.
|
|
873
|
+
* @param {InboundMessageAdmission} admission - Admission ownership.
|
|
874
|
+
* @returns {void}
|
|
875
|
+
*/
|
|
876
|
+
_releaseInboundAdmission(admission) {
|
|
877
|
+
if (admission.released)
|
|
878
|
+
return;
|
|
879
|
+
admission.released = true;
|
|
880
|
+
if (admission.generation !== this._inboundAccountingGeneration)
|
|
881
|
+
return;
|
|
882
|
+
this._inboundPendingMessages -= 1;
|
|
883
|
+
this._inboundPendingBytes -= admission.byteLength;
|
|
884
|
+
}
|
|
885
|
+
/**
|
|
886
|
+
* Abandons all admitted input and invalidates late settlements.
|
|
887
|
+
* @returns {void}
|
|
888
|
+
*/
|
|
889
|
+
_abandonInboundMessages() {
|
|
890
|
+
this._inboundClosed = true;
|
|
891
|
+
this._inboundAccountingGeneration += 1;
|
|
892
|
+
this._inboundPendingBytes = 0;
|
|
893
|
+
this._inboundPendingMessages = 0;
|
|
894
|
+
this.messageQueue = [];
|
|
895
|
+
}
|
|
896
|
+
/**
|
|
897
|
+
* Permanently closes a session whose next message exceeded its backlog budget.
|
|
898
|
+
* @param {number} rejectedBytes - Raw payload bytes rejected at admission.
|
|
899
|
+
* @returns {void}
|
|
900
|
+
*/
|
|
901
|
+
_closeForInboundBacklog(rejectedBytes) {
|
|
902
|
+
if (this._inboundBacklogOverloaded || this._inboundClosed)
|
|
903
|
+
return;
|
|
904
|
+
this._inboundBacklogOverloaded = true;
|
|
905
|
+
this.logger.warn(() => [
|
|
906
|
+
"Inbound websocket message backlog exceeded; closing connection",
|
|
907
|
+
{
|
|
908
|
+
maxBytes: this._inboundMaxPendingBytes,
|
|
909
|
+
maxMessages: this._inboundMaxPendingMessages,
|
|
910
|
+
pendingBytes: this._inboundPendingBytes,
|
|
911
|
+
pendingMessages: this._inboundPendingMessages,
|
|
912
|
+
rejectedBytes
|
|
913
|
+
}
|
|
914
|
+
]);
|
|
915
|
+
this.sendGoodbye(this.client, {
|
|
916
|
+
code: WEBSOCKET_CLOSE_POLICY_VIOLATION,
|
|
917
|
+
reason: WEBSOCKET_INBOUND_BACKLOG_CLOSE_REASON
|
|
918
|
+
});
|
|
919
|
+
this._handleClose({ allowResume: false });
|
|
920
|
+
}
|
|
727
921
|
/**
|
|
728
922
|
* Closes after an inbound buffering limit and releases all parser-owned input.
|
|
729
923
|
* @returns {void}
|
|
@@ -943,13 +1137,21 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
943
1137
|
}
|
|
944
1138
|
return true;
|
|
945
1139
|
}
|
|
946
|
-
|
|
1140
|
+
/**
|
|
1141
|
+
* Handles socket closure and optionally retains resumable state.
|
|
1142
|
+
* @param {{allowResume?: boolean}} [options] - Closure behavior.
|
|
1143
|
+
* @returns {void}
|
|
1144
|
+
*/
|
|
1145
|
+
_handleClose({ allowResume = true } = {}) {
|
|
1146
|
+
this._resetFragmentBuffer();
|
|
1147
|
+
this._clearBufferedFrameChunks();
|
|
1148
|
+
this._abandonInboundMessages();
|
|
947
1149
|
// If the session has resumable state (live Connection or
|
|
948
1150
|
// ChannelV2 subscription), move it into the paused registry
|
|
949
1151
|
// instead of tearing down; a new socket presenting the sessionId
|
|
950
1152
|
// via `session-resume` within the grace window will reattach.
|
|
951
1153
|
const hasResumableState = this._connections.size > 0 || this._channelSubscriptions.size > 0;
|
|
952
|
-
if (hasResumableState && !this._paused) {
|
|
1154
|
+
if (allowResume && hasResumableState && !this._paused) {
|
|
953
1155
|
// Paused sessions have no live socket to ping; the grace timer
|
|
954
1156
|
// owns their eventual teardown from here.
|
|
955
1157
|
this._stopHeartbeat();
|
|
@@ -982,6 +1184,9 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
982
1184
|
*/
|
|
983
1185
|
_finalizeGraceExpiry() {
|
|
984
1186
|
this._stopHeartbeat();
|
|
1187
|
+
this._resetFragmentBuffer();
|
|
1188
|
+
this._clearBufferedFrameChunks();
|
|
1189
|
+
this._abandonInboundMessages();
|
|
985
1190
|
this.configuration._websocketSessions.delete(this);
|
|
986
1191
|
void this._runMessageHandlerClose();
|
|
987
1192
|
void this._teardownChannel();
|
|
@@ -1003,7 +1208,10 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1003
1208
|
try {
|
|
1004
1209
|
return await resolver(this);
|
|
1005
1210
|
}
|
|
1006
|
-
catch (
|
|
1211
|
+
catch (caughtError) {
|
|
1212
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1213
|
+
stage: "websocket-session-identity-pause"
|
|
1214
|
+
});
|
|
1007
1215
|
this.logger.error(() => ["Websocket session identity resolver failed at pause", error]);
|
|
1008
1216
|
return undefined;
|
|
1009
1217
|
}
|
|
@@ -1036,7 +1244,12 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1036
1244
|
try {
|
|
1037
1245
|
await connection[callbackName]?.();
|
|
1038
1246
|
}
|
|
1039
|
-
catch (
|
|
1247
|
+
catch (caughtError) {
|
|
1248
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1249
|
+
callbackName,
|
|
1250
|
+
connectionId: connection.connectionId,
|
|
1251
|
+
stage: "websocket-connection-lifecycle"
|
|
1252
|
+
});
|
|
1040
1253
|
this.logger.error(() => [`${callbackName} failed for ${connection.connectionId}`, error]);
|
|
1041
1254
|
}
|
|
1042
1255
|
}
|
|
@@ -1044,7 +1257,12 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1044
1257
|
try {
|
|
1045
1258
|
await subscription[callbackName]?.();
|
|
1046
1259
|
}
|
|
1047
|
-
catch (
|
|
1260
|
+
catch (caughtError) {
|
|
1261
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1262
|
+
callbackName,
|
|
1263
|
+
stage: "websocket-channel-lifecycle",
|
|
1264
|
+
subscriptionId: subscription.subscriptionId
|
|
1265
|
+
});
|
|
1048
1266
|
this.logger.error(() => [`${callbackName} failed for channel sub ${subscription.subscriptionId}`, error]);
|
|
1049
1267
|
}
|
|
1050
1268
|
}
|
|
@@ -1079,7 +1297,10 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1079
1297
|
try {
|
|
1080
1298
|
freshIdentity = await resolver(this);
|
|
1081
1299
|
}
|
|
1082
|
-
catch (
|
|
1300
|
+
catch (caughtError) {
|
|
1301
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1302
|
+
stage: "websocket-session-identity-resume"
|
|
1303
|
+
});
|
|
1083
1304
|
this.logger.error(() => ["Websocket session identity resolver failed at resume", error]);
|
|
1084
1305
|
freshIdentity = undefined;
|
|
1085
1306
|
}
|
|
@@ -1135,7 +1356,12 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1135
1356
|
await connection.onClose(reason);
|
|
1136
1357
|
});
|
|
1137
1358
|
}
|
|
1138
|
-
catch (
|
|
1359
|
+
catch (caughtError) {
|
|
1360
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1361
|
+
connectionId: connection.connectionId,
|
|
1362
|
+
reason,
|
|
1363
|
+
stage: "websocket-connection-teardown"
|
|
1364
|
+
});
|
|
1139
1365
|
this.logger.error(() => [`Failed to tear down connection ${connection.connectionId}`, error]);
|
|
1140
1366
|
}
|
|
1141
1367
|
}
|
|
@@ -1179,9 +1405,15 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1179
1405
|
this._connections.set(connectionId, connection);
|
|
1180
1406
|
this.sendJson({ type: "connection-opened", connectionId });
|
|
1181
1407
|
}
|
|
1182
|
-
catch (
|
|
1408
|
+
catch (caughtError) {
|
|
1409
|
+
const clientErrorMessage = caughtError instanceof Error ? caughtError.message : "";
|
|
1410
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1411
|
+
connectionId,
|
|
1412
|
+
connectionType,
|
|
1413
|
+
stage: "websocket-connection-open"
|
|
1414
|
+
});
|
|
1183
1415
|
this.logger.error(() => [`Failed to open connection ${connectionType}:${connectionId}`, error]);
|
|
1184
|
-
this.sendJson({ type: "connection-error", connectionId, message:
|
|
1416
|
+
this.sendJson({ type: "connection-error", connectionId, message: clientErrorMessage || "Failed to open connection" });
|
|
1185
1417
|
}
|
|
1186
1418
|
}
|
|
1187
1419
|
/**
|
|
@@ -1201,9 +1433,14 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1201
1433
|
await connection.onMessage(message.body);
|
|
1202
1434
|
});
|
|
1203
1435
|
}
|
|
1204
|
-
catch (
|
|
1436
|
+
catch (caughtError) {
|
|
1437
|
+
const clientErrorMessage = caughtError instanceof Error ? caughtError.message : "";
|
|
1438
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1439
|
+
connectionId,
|
|
1440
|
+
stage: "websocket-connection-message"
|
|
1441
|
+
});
|
|
1205
1442
|
this.logger.error(() => [`Failed to handle connection-message for ${connectionId}`, error]);
|
|
1206
|
-
this.sendJson({ type: "connection-error", connectionId, message:
|
|
1443
|
+
this.sendJson({ type: "connection-error", connectionId, message: clientErrorMessage || "Failed to handle message" });
|
|
1207
1444
|
}
|
|
1208
1445
|
}
|
|
1209
1446
|
/**
|
|
@@ -1226,7 +1463,11 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1226
1463
|
await connection.onClose("client_close");
|
|
1227
1464
|
});
|
|
1228
1465
|
}
|
|
1229
|
-
catch (
|
|
1466
|
+
catch (caughtError) {
|
|
1467
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1468
|
+
connectionId,
|
|
1469
|
+
stage: "websocket-connection-close"
|
|
1470
|
+
});
|
|
1230
1471
|
this.logger.error(() => [`Failed to tear down connection ${connectionId}`, error]);
|
|
1231
1472
|
}
|
|
1232
1473
|
this.sendJson({ type: "connection-closed", connectionId, reason: "client_close" });
|
|
@@ -1293,11 +1534,17 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1293
1534
|
this.sendJson({ type: "channel-subscribed", subscriptionId });
|
|
1294
1535
|
});
|
|
1295
1536
|
}
|
|
1296
|
-
catch (
|
|
1537
|
+
catch (caughtError) {
|
|
1538
|
+
const clientErrorMessage = caughtError instanceof Error ? caughtError.message : "";
|
|
1297
1539
|
this._channelSubscriptions.delete(subscriptionId);
|
|
1298
1540
|
this.configuration._unregisterWebsocketChannelSubscription(channelType, subscription);
|
|
1541
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1542
|
+
channelType,
|
|
1543
|
+
stage: "websocket-channel-subscribe",
|
|
1544
|
+
subscriptionId
|
|
1545
|
+
});
|
|
1299
1546
|
this.logger.error(() => [`Failed to subscribe channel ${channelType}:${subscriptionId}`, error]);
|
|
1300
|
-
this.sendJson({ type: "channel-error", subscriptionId, message:
|
|
1547
|
+
this.sendJson({ type: "channel-error", subscriptionId, message: clientErrorMessage || "Failed to subscribe" });
|
|
1301
1548
|
}
|
|
1302
1549
|
}
|
|
1303
1550
|
/**
|
|
@@ -1355,7 +1602,12 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1355
1602
|
try {
|
|
1356
1603
|
await this._withConnections(async () => await entry.subscription.unsubscribed());
|
|
1357
1604
|
}
|
|
1358
|
-
catch (
|
|
1605
|
+
catch (caughtError) {
|
|
1606
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1607
|
+
channelType: entry.channelType,
|
|
1608
|
+
stage: "websocket-channel-unsubscribe",
|
|
1609
|
+
subscriptionId
|
|
1610
|
+
});
|
|
1359
1611
|
this.logger.error(() => [`Failed to unsubscribe channel ${entry.channelType}:${subscriptionId}`, error]);
|
|
1360
1612
|
}
|
|
1361
1613
|
this.sendJson({ type: "channel-unsubscribed", subscriptionId });
|
|
@@ -1376,7 +1628,12 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1376
1628
|
try {
|
|
1377
1629
|
await this._withConnections(async () => await subscription.unsubscribed());
|
|
1378
1630
|
}
|
|
1379
|
-
catch (
|
|
1631
|
+
catch (caughtError) {
|
|
1632
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1633
|
+
channelType,
|
|
1634
|
+
stage: "websocket-channel-teardown",
|
|
1635
|
+
subscriptionId: subscription.subscriptionId
|
|
1636
|
+
});
|
|
1380
1637
|
this.logger.error(() => [`Failed to tear down channel-v2 ${channelType}:${subscription.subscriptionId}`, error]);
|
|
1381
1638
|
}
|
|
1382
1639
|
}
|
|
@@ -1402,7 +1659,10 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1402
1659
|
});
|
|
1403
1660
|
});
|
|
1404
1661
|
}
|
|
1405
|
-
catch (
|
|
1662
|
+
catch (caughtError) {
|
|
1663
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1664
|
+
stage: "websocket-channel-teardown"
|
|
1665
|
+
});
|
|
1406
1666
|
this.logger.error(() => ["Failed to teardown websocket channel", error]);
|
|
1407
1667
|
}
|
|
1408
1668
|
const subscriptions = this.handlerSubscriptions.get(channel);
|
|
@@ -1489,7 +1749,11 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1489
1749
|
}
|
|
1490
1750
|
await this._registerChannel(channelInstance, tenant);
|
|
1491
1751
|
}
|
|
1492
|
-
catch (
|
|
1752
|
+
catch (caughtError) {
|
|
1753
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1754
|
+
channel,
|
|
1755
|
+
stage: "websocket-channel-subscription"
|
|
1756
|
+
});
|
|
1493
1757
|
this.logger.warn(() => ["Websocket channel subscription failed", error]);
|
|
1494
1758
|
this.sendJson({ channel, error: "Subscription rejected", type: "error" });
|
|
1495
1759
|
}
|
|
@@ -1603,7 +1867,10 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1603
1867
|
await onOpen({ session: this });
|
|
1604
1868
|
}
|
|
1605
1869
|
}
|
|
1606
|
-
catch (
|
|
1870
|
+
catch (caughtError) {
|
|
1871
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1872
|
+
stage: "websocket-message-handler-open"
|
|
1873
|
+
});
|
|
1607
1874
|
this.logger.error(() => ["Websocket open handler failed", error]);
|
|
1608
1875
|
}
|
|
1609
1876
|
}
|
|
@@ -1620,12 +1887,30 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1620
1887
|
await onMessage({ message, session: this });
|
|
1621
1888
|
}
|
|
1622
1889
|
}
|
|
1623
|
-
catch (
|
|
1624
|
-
this.logger.error(() => ["Websocket message handler failed", error]);
|
|
1890
|
+
catch (caughtError) {
|
|
1625
1891
|
const handler = this.messageHandler;
|
|
1626
1892
|
const onError = handler ? handler.onError : null;
|
|
1627
|
-
|
|
1628
|
-
|
|
1893
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1894
|
+
stage: "websocket-message-handler"
|
|
1895
|
+
});
|
|
1896
|
+
this.logger.error(() => ["Websocket message handler failed", error]);
|
|
1897
|
+
if (!onError)
|
|
1898
|
+
return;
|
|
1899
|
+
try {
|
|
1900
|
+
await onError({ error, session: this });
|
|
1901
|
+
}
|
|
1902
|
+
catch (onErrorCaughtError) {
|
|
1903
|
+
const clientErrorMessage = onErrorCaughtError instanceof Error
|
|
1904
|
+
? onErrorCaughtError.message
|
|
1905
|
+
: String(onErrorCaughtError);
|
|
1906
|
+
const onErrorError = this._reportUnexpectedDispatchError(onErrorCaughtError, {
|
|
1907
|
+
stage: "websocket-message-handler-error"
|
|
1908
|
+
});
|
|
1909
|
+
this.logger.error(() => ["Websocket message error handler failed", onErrorError]);
|
|
1910
|
+
this.sendJson({
|
|
1911
|
+
error: clientErrorMessage,
|
|
1912
|
+
type: "error"
|
|
1913
|
+
});
|
|
1629
1914
|
}
|
|
1630
1915
|
}
|
|
1631
1916
|
}
|
|
@@ -1637,7 +1922,10 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1637
1922
|
await onClose({ session: this });
|
|
1638
1923
|
}
|
|
1639
1924
|
}
|
|
1640
|
-
catch (
|
|
1925
|
+
catch (caughtError) {
|
|
1926
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1927
|
+
stage: "websocket-message-handler-close"
|
|
1928
|
+
});
|
|
1641
1929
|
this.logger.error(() => ["Websocket close handler failed", error]);
|
|
1642
1930
|
}
|
|
1643
1931
|
}
|
|
@@ -1660,29 +1948,58 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1660
1948
|
async _resolveMessageHandlerPromise() {
|
|
1661
1949
|
if (!this.messageHandlerPromise)
|
|
1662
1950
|
return;
|
|
1951
|
+
/** @type {import("../../configuration-types.js").WebsocketMessageHandler | void} */
|
|
1952
|
+
let handler;
|
|
1663
1953
|
try {
|
|
1664
|
-
|
|
1665
|
-
if (handler) {
|
|
1666
|
-
this.pendingMessageHandler = false;
|
|
1667
|
-
this.messageHandlerPromise = undefined;
|
|
1668
|
-
// Install handler and drain onOpen before replaying queued
|
|
1669
|
-
// messages. setMessageHandler() fires onOpen as fire-and-forget;
|
|
1670
|
-
// awaiting _runMessageHandlerOpen() directly here closes the
|
|
1671
|
-
// race where queued subscribe/connection-* frames would
|
|
1672
|
-
// dispatch while an async onOpen is still setting up session
|
|
1673
|
-
// state.
|
|
1674
|
-
this.messageHandler = handler;
|
|
1675
|
-
await this._runMessageHandlerOpen();
|
|
1676
|
-
await this._flushQueuedMessages({ useHandler: typeof handler.onMessage === "function" });
|
|
1677
|
-
return;
|
|
1678
|
-
}
|
|
1954
|
+
handler = await this.messageHandlerPromise;
|
|
1679
1955
|
}
|
|
1680
|
-
catch (
|
|
1956
|
+
catch (caughtError) {
|
|
1957
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
1958
|
+
stage: "websocket-message-handler-resolver"
|
|
1959
|
+
});
|
|
1681
1960
|
this.logger.error(() => ["Websocket message handler resolver failed", error]);
|
|
1961
|
+
this.messageHandlerPromise = undefined;
|
|
1962
|
+
await this._finishMessageHandlerResolution({ useHandler: false });
|
|
1963
|
+
return;
|
|
1682
1964
|
}
|
|
1683
|
-
this.pendingMessageHandler = false;
|
|
1684
1965
|
this.messageHandlerPromise = undefined;
|
|
1685
|
-
|
|
1966
|
+
if (!handler) {
|
|
1967
|
+
await this._finishMessageHandlerResolution({ useHandler: false });
|
|
1968
|
+
return;
|
|
1969
|
+
}
|
|
1970
|
+
if (this._inboundClosed) {
|
|
1971
|
+
this.pendingMessageHandler = false;
|
|
1972
|
+
return;
|
|
1973
|
+
}
|
|
1974
|
+
// Install handler and drain onOpen before replaying queued
|
|
1975
|
+
// messages. setMessageHandler() fires onOpen as fire-and-forget;
|
|
1976
|
+
// awaiting _runMessageHandlerOpen() directly here closes the
|
|
1977
|
+
// race where queued subscribe/connection-* frames would
|
|
1978
|
+
// dispatch while an async onOpen is still setting up session
|
|
1979
|
+
// state.
|
|
1980
|
+
this.messageHandler = handler;
|
|
1981
|
+
await this._runMessageHandlerOpen();
|
|
1982
|
+
await this._finishMessageHandlerResolution({
|
|
1983
|
+
useHandler: typeof handler.onMessage === "function"
|
|
1984
|
+
});
|
|
1985
|
+
}
|
|
1986
|
+
/**
|
|
1987
|
+
* Inserts resolver completion into the FIFO chain before allowing new dispatch.
|
|
1988
|
+
* @param {{useHandler: boolean}} args - Resolver result.
|
|
1989
|
+
* @returns {Promise<void>} - Resolves after queued messages drain.
|
|
1990
|
+
*/
|
|
1991
|
+
async _finishMessageHandlerResolution({ useHandler }) {
|
|
1992
|
+
const previous = this._messageChain;
|
|
1993
|
+
const drain = previous.then(async () => {
|
|
1994
|
+
this.pendingMessageHandler = false;
|
|
1995
|
+
if (this._inboundClosed) {
|
|
1996
|
+
this.messageQueue = [];
|
|
1997
|
+
return;
|
|
1998
|
+
}
|
|
1999
|
+
await this._flushQueuedMessages({ useHandler });
|
|
2000
|
+
});
|
|
2001
|
+
this._messageChain = drain.catch(() => { });
|
|
2002
|
+
await drain;
|
|
1686
2003
|
}
|
|
1687
2004
|
/**
|
|
1688
2005
|
* Runs flush queued messages.
|
|
@@ -1692,16 +2009,36 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1692
2009
|
async _flushQueuedMessages({ useHandler }) {
|
|
1693
2010
|
if (this.messageQueue.length === 0)
|
|
1694
2011
|
return;
|
|
1695
|
-
const queued = this.messageQueue
|
|
2012
|
+
const queued = this.messageQueue;
|
|
1696
2013
|
this.messageQueue = [];
|
|
1697
|
-
for (const
|
|
1698
|
-
if (
|
|
1699
|
-
|
|
2014
|
+
for (const work of queued) {
|
|
2015
|
+
if (this._inboundClosed) {
|
|
2016
|
+
this._releaseInboundAdmission(work.admission);
|
|
2017
|
+
continue;
|
|
1700
2018
|
}
|
|
1701
|
-
|
|
1702
|
-
|
|
2019
|
+
try {
|
|
2020
|
+
if (useHandler && this.messageHandler) {
|
|
2021
|
+
await this._runMessageHandlerMessage(work.message);
|
|
2022
|
+
}
|
|
2023
|
+
else {
|
|
2024
|
+
await this._dispatchMessage(work.message);
|
|
2025
|
+
}
|
|
2026
|
+
}
|
|
2027
|
+
catch (caughtError) {
|
|
2028
|
+
const clientErrorMessage = caughtError instanceof Error ? caughtError.message : String(caughtError);
|
|
2029
|
+
const error = this._reportUnexpectedDispatchError(caughtError, {
|
|
2030
|
+
stage: "websocket-message-dispatch"
|
|
2031
|
+
});
|
|
2032
|
+
this.logger.error(() => ["Websocket message handler failed", error]);
|
|
2033
|
+
this.sendJson({
|
|
2034
|
+
error: clientErrorMessage,
|
|
2035
|
+
type: "error"
|
|
2036
|
+
});
|
|
2037
|
+
}
|
|
2038
|
+
finally {
|
|
2039
|
+
this._releaseInboundAdmission(work.admission);
|
|
1703
2040
|
}
|
|
1704
2041
|
}
|
|
1705
2042
|
}
|
|
1706
2043
|
}
|
|
1707
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRXRDLE9BQU8sWUFBWSxNQUFNLDhCQUE4QixDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFDckQsT0FBTyxnQkFBZ0IsTUFBTSx5QkFBeUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsc0NBQXNDLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV0Rjs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUNsQyxNQUFNLDZCQUE2QixHQUFHLEdBQUcsQ0FBQTtBQUN6QyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQTtBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTtBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUVqQyx3RUFBd0U7QUFDeEUsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUE7QUFFdkMsbUVBQW1FO0FBQ25FLE1BQU0sc0NBQXNDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7QUFFL0QsbUVBQW1FO0FBQ25FLE1BQU0sK0JBQStCLEdBQUcsc0NBQXNDLENBQUE7QUFFOUUsTUFBTSx3Q0FBd0MsR0FBRyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQTtBQUV4Riw2REFBNkQ7QUFDN0QsTUFBTSwwQ0FBMEMs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SSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUE7UUFFdEIsS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUM3QixJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQy9DLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDcEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtyYW5kb21VVUlEfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi8uLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgUmVxdWVzdFJ1bm5lciBmcm9tIFwiLi9yZXF1ZXN0LXJ1bm5lci5qc1wiXG5pbXBvcnQgV2Vic29ja2V0UmVxdWVzdCBmcm9tIFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiXG5pbXBvcnQgV2Vic29ja2V0Q2hhbm5lbCBmcm9tIFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIlxuaW1wb3J0IHt3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbn0gZnJvbSBcIi4uL3dlYnNvY2tldC1ldmVudC1sb2ctc3RvcmUuanNcIlxuXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICogQHR5cGVkZWYge3t0eXBlOiBcInN1YnNjcmliZVwiLCBjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn0gfCB7dHlwZTogXCJtZXRhZGF0YVwiLCBkYXRhPzogUmVjb3JkPHN0cmluZywgPz59IHwge3R5cGU/OiBcInJlcXVlc3RcIiwgYm9keT86ID8sIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCA/PiwgaWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsLCBtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nfSB8IFJlY29yZDxzdHJpbmcsID8+fSBXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZVxuICovXG5jb25zdCBXRUJTT0NLRVRfRklOQUxfRlJBTUUgPSAweDgwXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0NPTlRJTlVBVElPTiA9IDB4MFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9URVhUID0gMHgxXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0JJTkFSWSA9IDB4MlxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9DTE9TRSA9IDB4OFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9QSU5HID0gMHg5XG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1BPTkcgPSAweEFcblxuLyoqIENhcCBvbiB0aGUgcGF1c2VkIG91dGJvdW5kIHF1ZXVlOyBvbGRlc3QgZnJhbWVzIGRyb3Agb24gb3ZlcmZsb3cuICovXG5jb25zdCBXRUJTT0NLRVRfUEFVU0VEX1FVRVVFX0NBUCA9IDEwMDBcblxuLyoqIENhcCBvbiB0b3RhbCBieXRlcyBidWZmZXJlZCBmb3IgYSBzaW5nbGUgZnJhZ21lbnRlZCBtZXNzYWdlLiAqL1xuY29uc3QgV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVMgPSAxNiAqIDEwMjQgKiAxMDI0XG5cbi8qKiBDYXAgb24gcGF5bG9hZCBieXRlcyBidWZmZXJlZCBmb3IgYSBzaW5nbGUgZmluYWwgZGF0YSBmcmFtZS4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfRklOQUxfRlJBTUVfQllURVMgPSBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU1xuXG5jb25zdCBXRUJTT0NLRVRfTUFYX0lOQk9VTkRfRlJBTUVfQllURVNfQklHSU5UID0gQmlnSW50KFdFQlNPQ0tFVF9NQVhfRklOQUxfRlJBTUVfQllURVMpXG5cbi8qKiBDYXAgb24gZnJhZ21lbnQgY291bnQgZm9yIGEgc2luZ2xlIGZyYWdtZW50ZWQgbWVzc2FnZS4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0ZSQUdNRU5UUyA9IDEwMjRcblxuLyoqXG4gKiBSdW5zIHN1YnNjcmliZSBtZXNzYWdlLlxuICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIFJhdyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt7dHlwZTogXCJzdWJzY3JpYmVcIiwgY2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz59IHwgbnVsbH0gLSBTdWJzY3JpYmUgbWVzc2FnZSB3aGVuIG1hdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZU1lc3NhZ2UobWVzc2FnZSkge1xuICByZXR1cm4gbWVzc2FnZS50eXBlID09PSBcInN1YnNjcmliZVwiXG4gICAgPyAvKiogQHR5cGUge3t0eXBlOiBcInN1YnNjcmliZVwiLCBjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19ICovIChtZXNzYWdlKVxuICAgIDogbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgcmVxdWVzdCBtZXNzYWdlLlxuICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIFJhdyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9IHwgbnVsbH0gLSBSZXF1ZXN0IG1lc3NhZ2Ugd2hlbiBtYXRjaGVkLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0TWVzc2FnZShtZXNzYWdlKSB7XG4gIGlmIChtZXNzYWdlLnR5cGUgJiYgbWVzc2FnZS50eXBlICE9PSBcInJlcXVlc3RcIikgcmV0dXJuIG51bGxcblxuICByZXR1cm4gLyoqIEB0eXBlIHt7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9fSAqLyAobWVzc2FnZSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gaWRlbnRpdHkgdmFsdWVzIGZyb20gYGdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyYC5cbiAqIE51bGxpc2ggdmFsdWVzIGNvbXBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciBidXQgbm90IHRvIGEgcmVhbCBpZGVudGl0eS5cbiAqIFBsYWluIG9iamVjdHMgYXJlIGNvbXBhcmVkIHZpYSBKU09OIHJvdW5kLXRyaXAgc28gYXBwcyBjYW4gcmV0dXJuIGFcbiAqIGB7dXNlcklkLCB0ZW5hbnRJZH1gLXN0eWxlIG9iamVjdCB3aXRob3V0IGJ1aWxkaW5nIHRoZWlyIG93biBlcXVhbGl0eS5cbiAqIEBwYXJhbSB7P30gYSAtIFBhdXNlZC10aW1lIGlkZW50aXR5LlxuICogQHBhcmFtIHs/fSBiIC0gUmVzdW1lLXRpbWUgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIHdoZW4gdGhlIHR3byBpZGVudGl0aWVzIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIGNhbGxlci5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdGllc01hdGNoKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgaWYgKHR5cGVvZiBhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhKSA9PT0gSlNPTi5zdHJpbmdpZnkoYilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudFdlYnNvY2tldFNlc3Npb24ge1xuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgc3Vic2NyaXB0aW9ucyA9IG5ldyBTZXQoKVxuICBjaGFubmVscyA9IG5ldyBTZXQoKVxuICBzdWJzY3JpcHRpb25IYW5kbGVycyA9IG5ldyBNYXAoKVxuICBoYW5kbGVyU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuICBjaGFubmVsVGVuYW50cyA9IG5ldyBNYXAoKVxuICBjaGFubmVsUmVwbGF5U3RhdGVzID0gbmV3IE1hcCgpXG4gIC8qKlxuICAgKiBNZXNzYWdlIHF1ZXVlLlxuICAgKiBAdHlwZSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2VbXX0gKi9cbiAgbWVzc2FnZVF1ZXVlID0gW11cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLmNsaWVudCAtIENsaWVudCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdH0gW2FyZ3MudXBncmFkZVJlcXVlc3RdIC0gSW5pdGlhbCB3ZWJzb2NrZXQgdXBncmFkZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuV2Vic29ja2V0TWVzc2FnZUhhbmRsZXJ9IFthcmdzLm1lc3NhZ2VIYW5kbGVyXSAtIE9wdGlvbmFsIHJhdyBtZXNzYWdlIGhhbmRsZXIuXG4gICAqIEBwYXJhbSB7UHJvbWlzZTxpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLldlYnNvY2tldE1lc3NhZ2VIYW5kbGVyIHwgdm9pZD59IFthcmdzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZV0gLSBPcHRpb25hbCByYXcgbWVzc2FnZSBoYW5kbGVyIHByb21pc2UuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50LCBjb25maWd1cmF0aW9uLCB1cGdyYWRlUmVxdWVzdCwgbWVzc2FnZUhhbmRsZXIsIG1lc3NhZ2VIYW5kbGVyUHJvbWlzZX0pIHtcbiAgICAvKiogQHR5cGUge0J1ZmZlcltdfSAqL1xuICAgIHRoaXMuX2J1ZmZlckNodW5rcyA9IFtdXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCA9IDBcbiAgICB0aGlzLl9idWZmZXJDaHVua09mZnNldCA9IDBcbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzID0gMFxuICAgIHRoaXMuX2J1ZmZlcmVkRnJhbWVDb3B5Qnl0ZXMgPSAwXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy51cGdyYWRlUmVxdWVzdCA9IHVwZ3JhZGVSZXF1ZXN0XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyXG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UgPSBtZXNzYWdlSGFuZGxlclByb21pc2VcbiAgICB0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlciA9IEJvb2xlYW4obWVzc2FnZUhhbmRsZXJQcm9taXNlKVxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICB0aGlzLl9tZXRhZGF0YSA9IHt9XG5cbiAgICAvKipcbiAgICAgKiBMb25nLWxpdmVkIHBlci1zZXNzaW9uIHN0YXRlIGJhZy4gU3RhYmxlIGFjcm9zcyByZWNvbm5lY3RzIG9uY2VcbiAgICAgKiBncmFjZS1wZXJpb2QgcmVzdW1wdGlvbiBsYW5kcyBpbiBQaGFzZSAyOyB0b2RheSBpdCBqdXN0IGxpdmVzXG4gICAgICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fVxuICAgICAqL1xuICAgIHRoaXMuZGF0YSA9IHt9XG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3dlYnNvY2tldC1jb25uZWN0aW9uLmpzXCIpLmRlZmF1bHQ+fSAqL1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gbmV3IE1hcCgpXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIHtjaGFubmVsVHlwZTogc3RyaW5nLCBzdWJzY3JpcHRpb246IGltcG9ydChcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHR9Pn0gKi9cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkIGFzc2lnbmVkIHRvIHRoaXMgc2Vzc2lvbiBvbiBmaXJzdCBjb25uZWN0LiBTZW50IHRvIHRoZVxuICAgICAqIGNsaWVudCB2aWEgYHNlc3Npb24tZXN0YWJsaXNoZWRgOyB0aGUgY2xpZW50IGVjaG9lcyBpdCBiYWNrIHZpYVxuICAgICAqIGBzZXNzaW9uLXJlc3VtZWAgYWZ0ZXIgYSBXUyBkcm9wIHRvIHJlYXR0YWNoIHRvIHRoaXMgc2Vzc2lvblxuICAgICAqIHdpdGhpbiB0aGUgZ3JhY2UgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5zZXNzaW9uSWQgPSByYW5kb21VVUlEKClcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gLSB0cnVlIGFmdGVyIGBfaGFuZGxlQ2xvc2VgIHBhdXNlcyBpbnN0ZWFkIG9mIHRlYXJpbmcgZG93bi5cbiAgICAgKi9cbiAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTw/Pn0gLSBmcmFtZXMgcHJvZHVjZWQgd2hpbGUgcGF1c2VkOyBmbHVzaGVkIG9uIHJlc3VtZS5cbiAgICAgKi9cbiAgICB0aGlzLl9vdXRib3VuZFF1ZXVlID0gW11cblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgICB0aGlzLnNvY2tldCA9IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRhaWwgb2YgYSBwZXItc2Vzc2lvbiBwcm9taXNlIGNoYWluIHRoYXQgc2VyaWFsaXplcyBtZXNzYWdlXG4gICAgICogaGFuZGxpbmcuIFByZXZlbnRzIHJhY2VzIHdoZXJlIG1lc3NhZ2UgQiByZWFkcyBgc2Vzc2lvbi5kYXRhYFxuICAgICAqIGJlZm9yZSBtZXNzYWdlIEEncyBoYW5kbGVyIGZpbmlzaGVzIHdyaXRpbmcgaXQgKGUuZy4gYVxuICAgICAqIGNvbm5lY3Rpb24tbWVzc2FnZSBzZXR0aW5nIHRoZSBsb2NhbGUgdnMuIGEgc3Vic2VxdWVudCByZXF1ZXN0XG4gICAgICogd2hvc2UgYXJvdW5kUmVxdWVzdCB3cmFwcGVyIHJlYWRzIGl0KS5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICB0aGlzLl9tZXNzYWdlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKVxuXG4gICAgLyoqXG4gICAgICogUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhdXRoIGlkZW50aXR5IGNhcHR1cmVkIGF0IHBhdXNlXG4gICAgICogdGltZSBieSBgZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXJgLiBBd2FpdGVkIGF0IHJlc3VtZVxuICAgICAqIHRpbWUgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBmcmVzaCBjYWxsZXIncyBpZGVudGl0eS4gVW5kZWZpbmVkXG4gICAgICogb24gYSBsaXZlIChub24tcGF1c2VkKSBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtQcm9taXNlPD8+IHwgdW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHRoaXMuX3Jlc3VtZUlkZW50aXR5UHJvbWlzZSA9IHVuZGVmaW5lZFxuXG4gICAgLyoqXG4gICAgICogQWNjdW11bGF0ZXMgcGF5bG9hZHMgZm9yIGEgZnJhZ21lbnRlZCB3ZWJzb2NrZXQgbWVzc2FnZSBwZXJcbiAgICAgKiBSRkMgNjQ1NS4gTm9uLW51bGwgd2hpbGUgbWlkLWZyYWdtZW50OyBjbGVhcmVkIHdoZW4gdGhlIGZyYW1lXG4gICAgICogd2l0aCBGSU49MSBjb21wbGV0ZXMgYW5kIHRoZSBtZXNzYWdlIGlzIGRpc3BhdGNoZWQuXG4gICAgICogQHR5cGUge0J1ZmZlcltdIHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBPcGNvZGUgKFRFWFQvQklOQVJZKSBjYXB0dXJlZCBmcm9tIHRoZSBmaXJzdCBmcmFtZSBvZiBhXG4gICAgICogZnJhZ21lbnRlZCBtZXNzYWdlLiBDb250aW51YXRpb24gZnJhbWVzIChvcGNvZGUgMCkgaW5oZXJpdCBpdFxuICAgICAqIGF0IHJlYXNzZW1ibHkgdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyIHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID0gbnVsbFxuXG4gICAgLyoqXG4gICAgICogUnVubmluZyBieXRlIHRvdGFsIGZvciBgX2ZyYWdtZW50ZWRQYXlsb2Fkc2AuIFVzZWQgdG8gZW5mb3JjZVxuICAgICAqIGBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU2Agc28gYSBwZWVyIGNhbm5vdFxuICAgICAqIGV4aGF1c3QgbWVtb3J5IGJ5IHN0cmVhbWluZyBub24tZmluYWwgZnJhZ21lbnRzIGluZGVmaW5pdGVseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IDBcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fd2Vic29ja2V0U2Vzc2lvbnMuYWRkKHRoaXMpXG5cbiAgICAvKipcbiAgICAgKiBIZWFydGJlYXQgbGl2ZW5lc3MgZmxhZy4gU2V0IHRydWUgb24gZXZlcnkgaW5ib3VuZCBmcmFtZVxuICAgICAqIChpbmNsdWRpbmcgdGhlIGNsaWVudCdzIGF1dG8tcG9uZykgYW5kIGNsZWFyZWQgZWFjaCB0aW1lIGEgcGluZ1xuICAgICAqIGlzIHNlbnQ7IGEgc3RpbGwtZmFsc2UgZmxhZyBhdCB0aGUgbmV4dCB0aWNrIG1lYW5zIHRoZSBzb2NrZXRcbiAgICAgKiBoYXMgZ29uZSBzaWxlbnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5faGVhcnRiZWF0QWxpdmUgPSB0cnVlXG5cbiAgICAvKipcbiAgICAgKiBQZXItc2Vzc2lvbiBoZWFydGJlYXQgaW50ZXJ2YWwgaGFuZGxlLiBTdGFydGVkIGZyb21cbiAgICAgKiBgc2VuZFNlc3Npb25Fc3RhYmxpc2hlZGAgb25jZSB0aGUgc29ja2V0IGlzIGxpdmUsIG5vdCBhdFxuICAgICAqIGNvbnN0cnVjdGlvbiwgc28gZGlyZWN0bHktY29uc3RydWN0ZWQgc2Vzc2lvbnMgaW4gdGVzdHMgZG9uJ3RcbiAgICAgKiBzcGluIHVwIGEgYmFja2dyb3VuZCB0aW1lci5cbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9oZWFydGJlYXRUaW1lciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgY2xpZW50IGl0cyBzZXNzaW9uSWQgKyBncmFjZSB3aW5kb3cuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudGAgYWZ0ZXIgdGhlIFdTIHVwZ3JhZGUgY29tcGxldGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNlbmRTZXNzaW9uRXN0YWJsaXNoZWQoKSB7XG4gICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICB0eXBlOiBcInNlc3Npb24tZXN0YWJsaXNoZWRcIixcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICBncmFjZVNlY29uZHM6IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uR3JhY2VTZWNvbmRzPy4oKSB8fCAzMDBcbiAgICB9KVxuXG4gICAgLy8gVGhlIHNvY2tldCBpcyBsaXZlIG5vdywgc28gYmVnaW4gcmVhcGluZyBpdCBpZiBpdCBnb2VzIHNpbGVudC5cbiAgICB0aGlzLl9zdGFydEhlYXJ0YmVhdCgpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsb3NlZCBjb25uZWN0aW9uIGZyb20gdGhlIHNlc3Npb24gcmVnaXN0cnkuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzV2Vic29ja2V0Q29ubmVjdGlvbi5jbG9zZSgpYCBhZnRlciBpdCBzZW5kcyB0aGUgZmluYWxcbiAgICogYGNvbm5lY3Rpb24tY2xvc2VkYCBmcmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbm5lY3Rpb25JZCAtIENsb3NlZCBjb25uZWN0aW9uIGlkZW50aWZpZXIgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkge1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gLSBDbGllbnQtcHJvdmlkZWQgbWV0YWRhdGEgKGRlZmVuc2l2ZSBjb3B5KS5cbiAgICovXG4gIGdldE1ldGFkYXRhKCkge1xuICAgIHJldHVybiB7Li4udGhpcy5fbWV0YWRhdGF9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBwYXVzZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRydWUgd2hpbGUgdGhlIHNlc3Npb24gaXMgaW4gdGhlIHBhdXNlZC9ncmFjZSByZWdpc3RyeS5cbiAgICovXG4gIGlzUGF1c2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXVzZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRTdWJzY3JpcHRpb24oY2hhbm5lbCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoY2hhbm5lbClcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3RvcEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl93ZWJzb2NrZXRTZXNzaW9ucy5kZWxldGUodGhpcylcbiAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25DaGFubmVsKClcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ29ubmVjdGlvbnMoXCJzZXNzaW9uX2Rlc3Ryb3llZFwiKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25DaGFubmVsU3Vic2NyaXB0aW9ucygpXG4gICAgdGhpcy5ldmVudHMucmVtb3ZlQWxsTGlzdGVuZXJzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhcyBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGl0IGhhcyBzdWJzY3JpcHRpb24uXG4gICAqL1xuICBoYXNTdWJzY3JpcHRpb24oY2hhbm5lbCkge1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvbnMuaGFzKGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBvbiBkYXRhLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25EYXRhKGRhdGEpIHtcbiAgICAvLyBBbnkgaW5ib3VuZCBieXRlcyDigJQgYSBkYXRhIGZyYW1lLCB0aGUgYXV0by1wb25nIGFuc3dlcmluZyBvdXJcbiAgICAvLyBoZWFydGJlYXQsIG9yIGEgcGFydGlhbCBmcmFtZSBzdGlsbCBiZWluZyB1cGxvYWRlZCDigJQgcHJvdmUgdGhlXG4gICAgLy8gc29ja2V0IGlzIGFsaXZlLiBNYXJrIGl0IGhlcmUsIGJlZm9yZSBgX3Byb2Nlc3NCdWZmZXJgIG1heSByZXR1cm5cbiAgICAvLyBlYXJseSB3YWl0aW5nIGZvciB0aGUgcmVzdCBvZiBhbiBpbmNvbXBsZXRlIGZyYW1lLlxuICAgIHRoaXMuX2hlYXJ0YmVhdEFsaXZlID0gdHJ1ZVxuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICB0aGlzLl9idWZmZXJDaHVua3MucHVzaChkYXRhKVxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gZGF0YS5sZW5ndGhcbiAgICB0aGlzLl9wcm9jZXNzQnVmZmVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlbmQgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0gez99IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEBwYXJhbSB7e2NyZWF0ZWRBdD86IHN0cmluZywgZXZlbnRJZD86IHN0cmluZywgcmVwbGF5ZWQ/OiBib29sZWFuLCBzZXF1ZW5jZT86IG51bWJlcn19IFtvcHRpb25zXSAtIEV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgc2VuZEV2ZW50KGNoYW5uZWwsIHBheWxvYWQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGNoYW5uZWxIYW5kbGVycyA9IHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KGNoYW5uZWwpXG4gICAgY29uc3QgaGFzQ2hhbm5lbEhhbmRsZXJzID0gQm9vbGVhbihjaGFubmVsSGFuZGxlcnMgJiYgY2hhbm5lbEhhbmRsZXJzLnNpemUgPiAwKVxuICAgIGNvbnN0IHJlcGxheVN0YXRlID0gdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmdldChjaGFubmVsKVxuXG4gICAgaWYgKHJlcGxheVN0YXRlPy5yZXBsYXlpbmcgJiYgIW9wdGlvbnMucmVwbGF5ZWQpIHtcbiAgICAgIHJlcGxheVN0YXRlLmJ1ZmZlcmVkID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSAmJiAhaGFzQ2hhbm5lbEhhbmRsZXJzKSByZXR1cm5cblxuICAgIGlmIChoYXNDaGFubmVsSGFuZGxlcnMpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oY2hhbm5lbEhhbmRsZXJzKS5tYXAoYXN5bmMgKGhhbmRsZXIpID0+IHtcbiAgICAgICAgY29uc3QgdGVuYW50ID0gdGhpcy5jaGFubmVsVGVuYW50cy5nZXQoaGFuZGxlcilcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlci5yZWNlaXZlZEJyb2FkY2FzdCh7XG4gICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogb3B0aW9ucy5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgIGV2ZW50SWQ6IG9wdGlvbnMuZXZlbnRJZCxcbiAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgcmVwbGF5ZWQ6IG9wdGlvbnMucmVwbGF5ZWQsXG4gICAgICAgICAgICAgIHNlcXVlbmNlOiBvcHRpb25zLnNlcXVlbmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIGNyZWF0ZWRBdDogb3B0aW9ucy5jcmVhdGVkQXQsXG4gICAgICBldmVudElkOiBvcHRpb25zLmV2ZW50SWQsXG4gICAgICBwYXlsb2FkLFxuICAgICAgcmVwbGF5ZWQ6IG9wdGlvbnMucmVwbGF5ZWQsXG4gICAgICBzZXF1ZW5jZTogb3B0aW9ucy5zZXF1ZW5jZSxcbiAgICAgIHR5cGU6IFwiZXZlbnRcIlxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbml0aWFsaXplIGNoYW5uZWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplQ2hhbm5lbCgpIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3Jlc29sdmVNZXNzYWdlSGFuZGxlclByb21pc2UoKVxuXG4gICAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXI/LigpXG5cbiAgICBpZiAoIXJlc29sdmVyKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCB0aGlzLl9yZXNvbHZlVGVuYW50KHt9KVxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVyKHtcbiAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgICAgIHdlYnNvY2tldFNlc3Npb246IHRoaXNcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmVzb2x2ZWQpIHJldHVyblxuXG4gICAgICBjb25zdCBjaGFubmVsID0gdHlwZW9mIHJlc29sdmVkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBuZXcgcmVzb2x2ZWQoe2NsaWVudDogdGhpcy5jbGllbnQsIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbiwgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCwgd2Vic29ja2V0U2Vzc2lvbjogdGhpc30pXG4gICAgICAgIDogcmVzb2x2ZWRcblxuICAgICAgaWYgKGNoYW5uZWwgJiYgIShjaGFubmVsIGluc3RhbmNlb2YgV2Vic29ja2V0Q2hhbm5lbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb2x2ZWQgd2Vic29ja2V0IGNoYW5uZWwgbXVzdCBleHRlbmQgV2Vic29ja2V0Q2hhbm5lbFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLl9yZWdpc3RlckNoYW5uZWwoY2hhbm5lbCwgdGVuYW50KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3ZWJzb2NrZXQgY2hhbm5lbFwiLCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBnb29kYnllLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZW5kR29vZGJ5ZShjbGllbnQpIHtcbiAgICBjb25zdCBmcmFtZSA9IEJ1ZmZlci5mcm9tKFtXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBXRUJTT0NLRVRfT1BDT0RFX0NMT1NFLCAweDAwXSlcblxuICAgIGNsaWVudC5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBmcmFtZSwge3dlYnNvY2tldEZyYW1lOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhbmRsZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gTWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIC8vIFNlcmlhbGl6ZSBwZXItc2Vzc2lvbjogY2hhaW4gb250byBgX21lc3NhZ2VDaGFpbmAgc28gbWVzc2FnZXNcbiAgICAvLyBhcmUgcHJvY2Vzc2VkIG9uZSBhdCBhIHRpbWUuIFdpdGhvdXQgdGhpcywgZmlyZS1hbmQtZm9yZ2V0XG4gICAgLy8gZGlzcGF0Y2ggZnJvbSBgX3Byb2Nlc3NCdWZmZXJgIGxldHMgbWVzc2FnZSBCIHJlYWRcbiAgICAvLyBgc2Vzc2lvbi5kYXRhYCBiZWZvcmUgQSBoYXMgZmluaXNoZWQgd3JpdGluZyBpdC5cbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX21lc3NhZ2VDaGFpblxuICAgIGNvbnN0IG5leHQgPSBwcmV2aW91cy50aGVuKCgpID0+IHRoaXMuX2Rpc3BhdGNoTWVzc2FnZShtZXNzYWdlKSlcblxuICAgIHRoaXMuX21lc3NhZ2VDaGFpbiA9IG5leHQuY2F0Y2goKCkgPT4ge30pXG4gICAgYXdhaXQgbmV4dFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGlzcGF0Y2ggbWVzc2FnZS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIE1lc3NhZ2UgdGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9kaXNwYXRjaE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0QXJvdW5kUmVxdWVzdD8uKClcblxuICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICBhd2FpdCB3cmFwcGVyKHRoaXMsICgpID0+IHRoaXMuX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhY3R1YWwgbWVzc2FnZSBkaXNwYXRjaCwgZXh0cmFjdGVkIHNvXG4gICAqIGBjb25maWd1cmF0aW9uLmdldFdlYnNvY2tldEFyb3VuZFJlcXVlc3QoKWAgY2FuIHdyYXAgaXQgaW4gYW55XG4gICAqIHBlci1yZXF1ZXN0IGNvbnRleHQgKEFzeW5jTG9jYWxTdG9yYWdlLCB0cmFjaW5nLCBldGMuKS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIERlY29kZWQgY2xpZW50IGZyYW1lIHRvIGRpc3BhdGNoIGJ5IG1lc3NhZ2UgdHlwZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlTWVzc2FnZUlubmVyKG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnB1c2gobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRoZSBtZXNzYWdlSGFuZGxlciBzaG9ydC1jaXJjdWl0cyBkZWZhdWx0IHJvdXRpbmcgb25seSB3aGVuIHRoZVxuICAgIC8vIGFwcCBhY3R1YWxseSBkZWNsYXJlZCBhbiBgb25NZXNzYWdlYCBob29rLiBBcHBzIHRoYXQgb25seSB3YW50XG4gICAgLy8gc2Vzc2lvbi1saWZlY3ljbGUgdHJhY2tpbmcgKGBvbk9wZW5gL2BvbkNsb3NlYCkgc3RpbGwgbmVlZCB0aGVcbiAgICAvLyBidWlsdC1pbiBzdWJzY3JpYmUvY29ubmVjdGlvbi9jaGFubmVsLXN1YnNjcmliZSByb3V0aW5nIGJlbG93LFxuICAgIC8vIG90aGVyd2lzZSBldmVyeSBpbmNvbWluZyBtZXNzYWdlIGlzIHNpbGVudGx5IGRyb3BwZWQuXG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIgJiYgdHlwZW9mIHRoaXMubWVzc2FnZUhhbmRsZXIub25NZXNzYWdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyTWVzc2FnZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaWJlUGF5bG9hZCA9IHN1YnNjcmliZU1lc3NhZ2UobWVzc2FnZSlcblxuICAgIGlmIChzdWJzY3JpYmVQYXlsb2FkKSB7XG4gICAgICBjb25zdCB7Y2hhbm5lbCwgbGFzdEV2ZW50SWQsIHBhcmFtc30gPSBzdWJzY3JpYmVQYXlsb2FkXG5cbiAgICAgIGlmICghY2hhbm5lbCkgdGhyb3cgbmV3IEVycm9yKFwiY2hhbm5lbCBpcyByZXF1aXJlZCBmb3Igc3Vic2NyaWJlXCIpXG4gICAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXI/LigpXG5cbiAgICAgIGlmIChyZXNvbHZlcikge1xuICAgICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDaGFubmVsU3Vic2NyaXB0aW9uKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3Vic2NyaWJlVG9DaGFubmVsKGNoYW5uZWwsIHthY2tub3dsZWRnZTogdHJ1ZSwgbGFzdEV2ZW50SWQsIHBhcmFtc30pXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwibWV0YWRhdGFcIikge1xuICAgICAgY29uc3QgbWV0YWRhdGFQYXlsb2FkID0gLyoqIEB0eXBlIHt7ZGF0YT86IFJlY29yZDxzdHJpbmcsID8+fX0gKi8gKG1lc3NhZ2UpXG5cbiAgICAgIHRoaXMuX21ldGFkYXRhID0gbWV0YWRhdGFQYXlsb2FkLmRhdGEgJiYgdHlwZW9mIG1ldGFkYXRhUGF5bG9hZC5kYXRhID09PSBcIm9iamVjdFwiID8gey4uLm1ldGFkYXRhUGF5bG9hZC5kYXRhfSA6IHt9XG5cbiAgICAgIGZvciAoY29uc3Qge3N1YnNjcmlwdGlvbn0gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpcHRpb24ub25NZXRhZGF0YUNoYW5nZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBzdWJzY3JpcHRpb24ub25NZXRhZGF0YUNoYW5nZWQodGhpcy5fbWV0YWRhdGEpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcInNlc3Npb24tcmVzdW1lXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZVNlc3Npb25SZXN1bWUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY29ubmVjdGlvbi1vcGVuXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25PcGVuKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNvbm5lY3Rpb24tbWVzc2FnZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDb25uZWN0aW9uTWVzc2FnZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjb25uZWN0aW9uLWNsb3NlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25DbG9zZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjaGFubmVsLXN1YnNjcmliZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDaGFubmVsU3Vic2NyaWJlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNoYW5uZWwtdW5zdWJzY3JpYmVcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ2hhbm5lbFVuc3Vic2NyaWJlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlICYmIG1lc3NhZ2UudHlwZSAhPT0gXCJyZXF1ZXN0XCIpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7bWVzc2FnZS50eXBlfWAsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IHJlcXVlc3RNZXNzYWdlKG1lc3NhZ2UpXG5cbiAgICBpZiAoIXJlcXVlc3RQYXlsb2FkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtlcnJvcjogYFVua25vd24gbWVzc2FnZSB0eXBlOiAke21lc3NhZ2UudHlwZX1gLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qge2JvZHksIGhlYWRlcnMsIGlkLCBtZXRob2QsIHBhdGh9ID0gcmVxdWVzdFBheWxvYWRcblxuICAgIGlmICghbWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoXCJtZXRob2QgaXMgcmVxdWlyZWRcIilcbiAgICBpZiAoIXBhdGgpIHRocm93IG5ldyBFcnJvcihcInBhdGggaXMgcmVxdWlyZWRcIilcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgV2Vic29ja2V0UmVxdWVzdCh7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLmdldE1ldGFkYXRhKCksXG4gICAgICBtZXRob2QsXG4gICAgICBwYXRoLFxuICAgICAgcmVtb3RlQWRkcmVzczogdGhpcy5yZW1vdGVBZGRyZXNzKClcbiAgICB9KVxuICAgIGNvbnN0IHJlcXVlc3RSdW5uZXIgPSBuZXcgUmVxdWVzdFJ1bm5lcih7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICByZXF1ZXN0XG4gICAgfSlcblxuICAgIHJlcXVlc3RSdW5uZXIuZXZlbnRzLm9uKFwiZG9uZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHJlcXVlc3RSdW5uZXIucmVzcG9uc2VcbiAgICAgIGNvbnN0IGJvZHkgPSByZXNwb25zZS5nZXRCb2R5KClcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzXG5cbiAgICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBpZCxcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLFxuICAgICAgICBzdGF0dXNNZXNzYWdlOiByZXNwb25zZS5nZXRTdGF0dXNNZXNzYWdlKCksXG4gICAgICAgIHR5cGU6IFwicmVzcG9uc2VcIlxuICAgICAgfSlcbiAgICAgIHZvaWQgcmVxdWVzdFJ1bm5lci5sb2dDb21wbGV0ZWRSZXF1ZXN0KCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJGYWlsZWQgdG8gbG9nIGNvbXBsZXRlZCByZXF1ZXN0XCIsIGVycm9yKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgYXdhaXQgcmVxdWVzdFJ1bm5lci5ydW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcHJvY2VzcyBidWZmZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9wcm9jZXNzQnVmZmVyKCkge1xuICAgIHdoaWxlICh0aGlzLl9idWZmZXJlZEJ5dGVzID49IDIpIHtcbiAgICAgIGNvbnN0IGluaXRpYWxIZWFkZXIgPSB0aGlzLl9wZWVrQnVmZmVyZWRCeXRlcygyKVxuICAgICAgY29uc3QgZmlyc3RCeXRlID0gaW5pdGlhbEhlYWRlclswXVxuICAgICAgY29uc3Qgc2Vjb25kQnl0ZSA9IGluaXRpYWxIZWFkZXJbMV1cbiAgICAgIGNvbnN0IGlzRmluYWwgPSAoZmlyc3RCeXRlICYgV0VCU09DS0VUX0ZJTkFMX0ZSQU1FKSA9PT0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FXG4gICAgICBjb25zdCBvcGNvZGUgPSBmaXJzdEJ5dGUgJiAweDBGXG4gICAgICBjb25zdCBpc01hc2tlZCA9IChzZWNvbmRCeXRlICYgMHg4MCkgPT09IDB4ODBcbiAgICAgIGxldCBwYXlsb2FkTGVuZ3RoID0gc2Vjb25kQnl0ZSAmIDB4N0ZcbiAgICAgIGxldCBvZmZzZXQgPSAyXG5cbiAgICAgIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcbiAgICAgICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCBvZmZzZXQgKyAyKSByZXR1cm5cbiAgICAgICAgcGF5bG9hZExlbmd0aCA9IHRoaXMuX3BlZWtCdWZmZXJlZEJ5dGVzKG9mZnNldCArIDIpLnJlYWRVSW50MTZCRShvZmZzZXQpXG4gICAgICAgIG9mZnNldCArPSAyXG4gICAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xuICAgICAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IG9mZnNldCArIDgpIHJldHVyblxuICAgICAgICBjb25zdCBiaWdMZW5ndGggPSB0aGlzLl9wZWVrQnVmZmVyZWRCeXRlcyhvZmZzZXQgKyA4KS5yZWFkQmlnVUludDY0QkUob2Zmc2V0KVxuXG4gICAgICAgIGlmIChiaWdMZW5ndGggPiBXRUJTT0NLRVRfTUFYX0lOQk9VTkRfRlJBTUVfQllURVNfQklHSU5UKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXG4gICAgICAgICAgICBcIldlYnNvY2tldCBmcmFtZSBleGNlZWRlZCBieXRlIGNhcDsgY2xvc2luZyBjb25uZWN0aW9uXCIsXG4gICAgICAgICAgICB7ZnJhbWVCeXRlczogYmlnTGVuZ3RoLnRvU3RyaW5nKCksIG1heEJ5dGVzOiBXRUJTT0NLRVRfTUFYX0ZJTkFMX0ZSQU1FX0JZVEVTfVxuICAgICAgICAgIF0pXG4gICAgICAgICAgdGhpcy5fY2xvc2VGb3JJbmJvdW5kTGltaXQoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZExlbmd0aCA9IE51bWJlcihiaWdMZW5ndGgpXG4gICAgICAgIG9mZnNldCArPSA4XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hc2tMZW5ndGggPSBpc01hc2tlZCA/IDQgOiAwXG5cbiAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gb2Zmc2V0ICsgbWFza0xlbmd0aCArIHBheWxvYWRMZW5ndGhcblxuICAgICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCBmcmFtZUxlbmd0aCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5fY29uc3VtZUJ1ZmZlcmVkQnl0ZXMoZnJhbWVMZW5ndGgpXG5cbiAgICAgIC8qKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgICAgbGV0IHBheWxvYWQgPSBmcmFtZS5zdWJhcnJheShvZmZzZXQgKyBtYXNrTGVuZ3RoLCBmcmFtZUxlbmd0aClcblxuICAgICAgaWYgKGlzTWFza2VkKSB7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBmcmFtZS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIG1hc2tMZW5ndGgpXG4gICAgICAgIHRoaXMuX3VubWFza1BheWxvYWQocGF5bG9hZCwgbWFzaylcbiAgICAgIH1cblxuICAgICAgLy8gQ29udHJvbCBmcmFtZXMgKG9wY29kZSA+PSAweDgpIG11c3Qgbm90IGJlIGZyYWdtZW50ZWQgcGVyXG4gICAgICAvLyBSRkMgNjQ1NSBhbmQgY2FuIGFycml2ZSBpbnRlcmxlYXZlZCB3aXRoIGEgZnJhZ21lbnRlZCBkYXRhXG4gICAgICAvLyBtZXNzYWdlLiBIYW5kbGUgdGhlbSBmaXJzdCB3aXRob3V0IHRvdWNoaW5nIHRoZSBmcmFnbWVudFxuICAgICAgLy8gYWNjdW11bGF0b3IuXG4gICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX1BJTkcpIHtcbiAgICAgICAgdGhpcy5fc2VuZENvbnRyb2xGcmFtZShXRUJTT0NLRVRfT1BDT0RFX1BPTkcsIHBheWxvYWQpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQ0xPU0UpIHtcbiAgICAgICAgdGhpcy5zZW5kR29vZGJ5ZSh0aGlzLmNsaWVudClcbiAgICAgICAgdGhpcy5faGFuZGxlQ2xvc2UoKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX1BPTkcpIHtcbiAgICAgICAgLy8gQW5zd2VyIHRvIGEgaGVhcnRiZWF0IHBpbmc7IGxpdmVuZXNzIGlzIHJlY29yZGVkIGluIG9uRGF0YS5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9wY29kZSA+PSAweDgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVW5zdXBwb3J0ZWQgd2Vic29ja2V0IGNvbnRyb2wgb3Bjb2RlOiAke29wY29kZX1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBEYXRhIGZyYW1lIChURVhUL0JJTkFSWS9DT05USU5VQVRJT04pLiBSZWFzc2VtYmxlIGZyYWdtZW50c1xuICAgICAgLy8gYmVmb3JlIGRpc3BhdGNoaW5nLiBCcm93c2VycyAoQ2hyb21lKSBsZWdpdGltYXRlbHkgZnJhZ21lbnRcbiAgICAgIC8vIGxvbmdlciBjbGllbnTihpJzZXJ2ZXIgdGV4dCBmcmFtZXM7IGEgcHJpb3IgdmVyc2lvbiBkcm9wcGVkXG4gICAgICAvLyBldmVyeSBmcmFnbWVudGVkIG1lc3NhZ2Ugc2lsZW50bHksIHNvIGFueSBwYXlsb2FkIGxhcmdlXG4gICAgICAvLyBlbm91Z2ggdG8gaGl0IHRoZSBicm93c2VyJ3MgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGRcbiAgICAgIC8vIChlLmcuIGEgY2hhbm5lbC1zdWJzY3JpYmUgd2l0aCBhbiBhdXRoIHRva2VuKSBuZXZlciByZWFjaGVkXG4gICAgICAvLyB0aGUgaGFuZGxlci5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQ09OVElOVUFUSU9OKSB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiUmVjZWl2ZWQgY29udGludWF0aW9uIGZyYW1lIHdpdGggbm8gZnJhZ21lbnRlZCBtZXNzYWdlIGluIHByb2dyZXNzXCIpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fYXBwZW5kRnJhZ21lbnQocGF5bG9hZCkpIHJldHVyblxuXG4gICAgICAgIGlmICghaXNGaW5hbCkgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX1RFWFQgfHwgb3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0JJTkFSWSkge1xuICAgICAgICBpZiAodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlJlY2VpdmVkIG5ldyBkYXRhIGZyYW1lIHdoaWxlIGEgZnJhZ21lbnRlZCBtZXNzYWdlIHdhcyBpbiBwcm9ncmVzczsgZGlzY2FyZGluZyBwcmlvciBmcmFnbWVudHNcIilcbiAgICAgICAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNGaW5hbCkge1xuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9IFtwYXlsb2FkXVxuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPSBvcGNvZGVcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgPSBwYXlsb2FkLmxlbmd0aFxuXG4gICAgICAgICAgaWYgKCF0aGlzLl9lbmZvcmNlRnJhZ21lbnRMaW1pdHMoKSkgcmV0dXJuXG5cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbnN1cHBvcnRlZCB3ZWJzb2NrZXQgZGF0YSBvcGNvZGU6ICR7b3Bjb2RlfWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogRGVmaW5lcyBmaW5hbFBheWxvYWQuXG4gICAgICAgKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgICAgbGV0IGZpbmFsUGF5bG9hZFxuICAgICAgLyoqXG4gICAgICAgKiBEZWZpbmVzIGZpbmFsT3Bjb2RlLlxuICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgIGxldCBmaW5hbE9wY29kZVxuXG4gICAgICBpZiAodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQ09OVElOVUFUSU9OKSB7XG4gICAgICAgICAgZmluYWxQYXlsb2FkID0gQnVmZmVyLmNvbmNhdCh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMpXG4gICAgICAgICAgZmluYWxPcGNvZGUgPSB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID8/IFdFQlNPQ0tFVF9PUENPREVfVEVYVFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF5bG9hZCA9IHBheWxvYWRcbiAgICAgICAgICBmaW5hbE9wY29kZSA9IG9wY29kZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluYWxQYXlsb2FkID0gcGF5bG9hZFxuICAgICAgICBmaW5hbE9wY29kZSA9IG9wY29kZVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxPcGNvZGUgIT09IFdFQlNPQ0tFVF9PUENPREVfVEVYVCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbnN1cHBvcnRlZCB3ZWJzb2NrZXQgZGF0YSBvcGNvZGUgYWZ0ZXIgcmVhc3NlbWJseTogJHtmaW5hbE9wY29kZX1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShmaW5hbFBheWxvYWQudG9TdHJpbmcoXCJ1dGYtOFwiKSlcblxuICAgICAgICB0aGlzLl9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgICAgICB0aGlzLnNlbmRKc29uKHtlcnJvcjogZXJyb3IubWVzc2FnZSwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBwYXJzZSB3ZWJzb2NrZXQgbWVzc2FnZVwiLCBlcnJvcl0pXG4gICAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBcIkludmFsaWQgd2Vic29ja2V0IG1lc3NhZ2VcIiwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29waWVzIHRoZSBsZWFkaW5nIGJ1ZmZlcmVkIGJ5dGVzIHdpdGhvdXQgY29uc3VtaW5nIHRoZW0uIEhlYWRlclxuICAgKiBpbnNwZWN0aW9uIGlzIGJvdW5kZWQgdG8gdGhlIHdlYnNvY2tldCBoZWFkZXIgc2l6ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGJ5dGVDb3VudCAtIE51bWJlciBvZiBsZWFkaW5nIGJ5dGVzIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gQ29waWVkIHByZWZpeC5cbiAgICovXG4gIF9wZWVrQnVmZmVyZWRCeXRlcyhieXRlQ291bnQpIHtcbiAgICBjb25zdCBwcmVmaXggPSBCdWZmZXIuYWxsb2NVbnNhZmUoYnl0ZUNvdW50KVxuICAgIGxldCBjb3BpZWRCeXRlcyA9IDBcbiAgICBsZXQgY2h1bmtPZmZzZXQgPSB0aGlzLl9idWZmZXJDaHVua09mZnNldFxuXG4gICAgZm9yIChsZXQgY2h1bmtJbmRleCA9IHRoaXMuX2J1ZmZlckNodW5rSW5kZXg7IGNodW5rSW5kZXggPCB0aGlzLl9idWZmZXJDaHVua3MubGVuZ3RoOyBjaHVua0luZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fYnVmZmVyQ2h1bmtzW2NodW5rSW5kZXhdXG4gICAgICBjb25zdCBieXRlc0Zyb21DaHVuayA9IE1hdGgubWluKGNodW5rLmxlbmd0aCAtIGNodW5rT2Zmc2V0LCBieXRlQ291bnQgLSBjb3BpZWRCeXRlcylcblxuICAgICAgY2h1bmsuY29weShwcmVmaXgsIGNvcGllZEJ5dGVzLCBjaHVua09mZnNldCwgY2h1bmtPZmZzZXQgKyBieXRlc0Zyb21DaHVuaylcbiAgICAgIGNvcGllZEJ5dGVzICs9IGJ5dGVzRnJvbUNodW5rXG4gICAgICBjaHVua09mZnNldCA9IDBcbiAgICAgIGlmIChjb3BpZWRCeXRlcyA9PT0gYnl0ZUNvdW50KSBicmVha1xuICAgIH1cblxuICAgIHJldHVybiBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdW1lcyBhIGNvbXBsZXRlIGZyYW1lIGZyb20gdGhlIGNodW5rIHF1ZXVlIHdpdGggb25lIGJvdW5kZWQgY29weS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGJ5dGVDb3VudCAtIENvbXBsZXRlIGZyYW1lIGJ5dGUgY291bnQuXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gQ29udGlndW91cyBmcmFtZSBieXRlcy5cbiAgICovXG4gIF9jb25zdW1lQnVmZmVyZWRCeXRlcyhieXRlQ291bnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSBCdWZmZXIuYWxsb2NVbnNhZmUoYnl0ZUNvdW50KVxuICAgIGxldCBjb3BpZWRCeXRlcyA9IDBcblxuICAgIHdoaWxlIChjb3BpZWRCeXRlcyA8IGJ5dGVDb3VudCkge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9idWZmZXJDaHVua3NbdGhpcy5fYnVmZmVyQ2h1bmtJbmRleF1cbiAgICAgIGNvbnN0IGJ5dGVzRnJvbUNodW5rID0gTWF0aC5taW4oY2h1bmsubGVuZ3RoIC0gdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQsIGJ5dGVDb3VudCAtIGNvcGllZEJ5dGVzKVxuXG4gICAgICBjaHVuay5jb3B5KFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIGNvcGllZEJ5dGVzLFxuICAgICAgICB0aGlzLl9idWZmZXJDaHVua09mZnNldCxcbiAgICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQgKyBieXRlc0Zyb21DaHVua1xuICAgICAgKVxuICAgICAgY29waWVkQnl0ZXMgKz0gYnl0ZXNGcm9tQ2h1bmtcbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ICs9IGJ5dGVzRnJvbUNodW5rXG5cbiAgICAgIGlmICh0aGlzLl9idWZmZXJDaHVua09mZnNldCA9PT0gY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggKz0gMVxuICAgICAgICB0aGlzLl9idWZmZXJDaHVua09mZnNldCA9IDBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYnVmZmVyQ2h1bmtJbmRleCA9PT0gdGhpcy5fYnVmZmVyQ2h1bmtzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtzID0gW11cbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggPSAwXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggPj0gNjQgJiZcbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggKiAyID49IHRoaXMuX2J1ZmZlckNodW5rcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rcyA9IHRoaXMuX2J1ZmZlckNodW5rcy5zbGljZSh0aGlzLl9idWZmZXJDaHVua0luZGV4KVxuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCA9IDBcbiAgICB9XG5cbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IGJ5dGVDb3VudFxuICAgIHRoaXMuX2J1ZmZlcmVkRnJhbWVDb3B5Qnl0ZXMgKz0gYnl0ZUNvdW50XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRHJvcHMgYWxsIGluY29tcGxldGUgZnJhbWUgY2h1bmtzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9jbGVhckJ1ZmZlcmVkRnJhbWVDaHVua3MoKSB7XG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtzID0gW11cbiAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ID0gMFxuICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ID0gMFxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPSAwXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFmdGVyIGFuIGluYm91bmQgYnVmZmVyaW5nIGxpbWl0IGFuZCByZWxlYXNlcyBhbGwgcGFyc2VyLW93bmVkIGlucHV0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9jbG9zZUZvckluYm91bmRMaW1pdCgpIHtcbiAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICB0aGlzLl9jbGVhckJ1ZmZlcmVkRnJhbWVDaHVua3MoKVxuICAgIHRoaXMuc2VuZEdvb2RieWUodGhpcy5jbGllbnQpXG4gICAgdGhpcy5faGFuZGxlQ2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjb250aW51YXRpb24tZnJhbWUgcGF5bG9hZCB0byB0aGUgaW4tcHJvZ3Jlc3NcbiAgICogZnJhZ21lbnRlZCBtZXNzYWdlLiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZnJhZ21lbnQgd2FzIGFjY2VwdGVkXG4gICAqIGFuZCBmYWxzZSB3aGVuIHRoZSBwZXItbWVzc2FnZSBjYXAgd2FzIGhpdCBhbmQgdGhlIHNvY2tldCBoYXNcbiAgICogYmVlbiBjbG9zZWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBwYXlsb2FkIC0gQ29udGludWF0aW9uLWZyYW1lIGJ5dGVzIHRvIGFwcGVuZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgZnJhZ21lbnQgd2FzIGFjY2VwdGVkLlxuICAgKi9cbiAgX2FwcGVuZEZyYWdtZW50KHBheWxvYWQpIHtcbiAgICAvLyBHdWFyZCBwdXNoaW5nIGZpcnN0IHNvIGBfZW5mb3JjZUZyYWdtZW50TGltaXRzYCBzZWVzIHRoZSBmaW5hbFxuICAgIC8vIHN0YXRlOyBvbiBvdmVyZmxvdyB0aGUgcmVzZXQgaW5zaWRlIHRoZSBlbmZvcmNlciBkcm9wcyB0aGVcbiAgICAvLyBidWZmZXJlZCBmcmFnbWVudHMuXG4gICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzPy5wdXNoKHBheWxvYWQpXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzICs9IHBheWxvYWQubGVuZ3RoXG5cbiAgICByZXR1cm4gdGhpcy5fZW5mb3JjZUZyYWdtZW50TGltaXRzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZnJhZ21lbnRlZCBtZXNzYWdlIGhhcyBub3QgZXhjZWVkZWQgdGhlIGJ5dGUgb3JcbiAgICogZnJhZ21lbnQtY291bnQgY2Fwcy4gT24gb3ZlcmZsb3csIGNsZWFycyB0aGUgYnVmZmVyLCBzZW5kcyBhXG4gICAqIGNsb3NlIGZyYW1lLCBhbmQgdGVhcnMgdGhlIHNlc3Npb24gZG93bi4gUmV0dXJucyB0cnVlIHdoZW4gdGhlXG4gICAqIGNhbGxlciBjYW4gY29udGludWUgcHJvY2Vzc2luZywgZmFsc2Ugd2hlbiB0aGUgc2Vzc2lvbiBpcyBiZWluZ1xuICAgKiBjbG9zZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgZnJhZ21lbnQgcHJvY2Vzc2luZyBtYXkgY29udGludWUuXG4gICAqL1xuICBfZW5mb3JjZUZyYWdtZW50TGltaXRzKCkge1xuICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPT09IG51bGwpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBmcmFnbWVudENvdW50ID0gdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzLmxlbmd0aFxuICAgIGNvbnN0IG92ZXJCeXRlcyA9IHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA+IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTXG4gICAgY29uc3Qgb3ZlckZyYWdtZW50cyA9IGZyYWdtZW50Q291bnQgPiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9GUkFHTUVOVFNcblxuICAgIGlmICghb3ZlckJ5dGVzICYmICFvdmVyRnJhZ21lbnRzKSByZXR1cm4gdHJ1ZVxuXG4gICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXG4gICAgICBcIkZyYWdtZW50ZWQgd2Vic29ja2V0IG1lc3NhZ2UgZXhjZWVkZWQgY2FwczsgY2xvc2luZyBjb25uZWN0aW9uXCIsXG4gICAgICB7XG4gICAgICAgIGZyYWdtZW50Qnl0ZXM6IHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyxcbiAgICAgICAgZnJhZ21lbnRDb3VudCxcbiAgICAgICAgbWF4Qnl0ZXM6IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTLFxuICAgICAgICBtYXhGcmFnbWVudHM6IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0ZSQUdNRU5UU1xuICAgICAgfVxuICAgIF0pXG5cbiAgICB0aGlzLl9jbG9zZUZvckluYm91bmRMaW1pdCgpXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc2V0IGZyYWdtZW50IGJ1ZmZlci5cbiAgICogQHJldHVybnMge3ZvaWR9ICovXG4gIF9yZXNldEZyYWdtZW50QnVmZmVyKCkge1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9IG51bGxcbiAgICB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID0gbnVsbFxuICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBlci1zZXNzaW9uIGhlYXJ0YmVhdC4gRWFjaCB0aWNrIHBpbmdzIHRoZSBjbGllbnQgYW5kXG4gICAqIHJlYXBzIHRoZSBzZXNzaW9uIGlmIHRoZSBwcmV2aW91cyBwaW5nIHdlbnQgdW5hbnN3ZXJlZCwgc28gYVxuICAgKiBoYWxmLW9wZW4gc29ja2V0IChjbGllbnQgZ29uZSB3aXRob3V0IGEgVENQIEZJTiAvIGNsb3NlIGZyYW1lKVxuICAgKiBjYW5ub3QgbGluZ2VyIGZvcmV2ZXIgaG9sZGluZyBjaGFubmVsIHN1YnNjcmlwdGlvbnMuIERpc2FibGVkIHdoZW5cbiAgICogdGhlIGNvbmZpZ3VyZWQgaW50ZXJ2YWwgaXMgMC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc3RhcnRIZWFydGJlYXQoKSB7XG4gICAgY29uc3QgaW50ZXJ2YWxTZWNvbmRzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldFNlc3Npb25IZWFydGJlYXRTZWNvbmRzKClcblxuICAgIGlmICghaW50ZXJ2YWxTZWNvbmRzIHx8IGludGVydmFsU2Vjb25kcyA8PSAwKSByZXR1cm5cblxuICAgIHRoaXMuX2hlYXJ0YmVhdFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5faGVhcnRiZWF0VGljaygpLCBpbnRlcnZhbFNlY29uZHMgKiAxMDAwKVxuXG4gICAgLy8gRG9uJ3QgbGV0IHRoZSBoZWFydGJlYXQgdGltZXIga2VlcCB0aGUgcHJvY2VzcyBhbGl2ZS5cbiAgICBpZiAodHlwZW9mIHRoaXMuX2hlYXJ0YmVhdFRpbWVyLnVucmVmID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuX2hlYXJ0YmVhdFRpbWVyLnVucmVmKClcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgaGVhcnRiZWF0IGN5Y2xlLiBSZWFwcyB0aGUgc2Vzc2lvbiB2aWEgdGhlIG5vcm1hbCBjbG9zZSBwYXRoXG4gICAqIHdoZW4gdGhlIHByZXZpb3VzIHBpbmcgd2FzIG5vdCBhbnN3ZXJlZDsgb3RoZXJ3aXNlIG1hcmtzIGl0XG4gICAqIHBlbmRpbmcgYW5kIHBpbmdzIGFnYWluLiBCcm93c2VycyBhbmQgUmVhY3QgTmF0aXZlIHNvY2tldHMgYW5zd2VyXG4gICAqIHNlcnZlciBwaW5ncyB3aXRoIGFuIGF1dG9tYXRpYyBwb25nLCB3aGljaCBsYW5kcyBpbiBgX3Byb2Nlc3NCdWZmZXJgXG4gICAqIGFuZCByZS1tYXJrcyB0aGUgc2Vzc2lvbiBhbGl2ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfaGVhcnRiZWF0VGljaygpIHtcbiAgICBpZiAodGhpcy5fcGF1c2VkIHx8ICF0aGlzLmNsaWVudD8uZXZlbnRzKSByZXR1cm5cblxuICAgIGlmICghdGhpcy5faGVhcnRiZWF0QWxpdmUpIHtcbiAgICAgIC8vIE5vIGZyYW1lIGFycml2ZWQgc2luY2UgdGhlIGxhc3QgcGluZyDigJQgdGhlIHNvY2tldCBpcyBkZWFkLlxuICAgICAgLy8gUm91dGUgdGhyb3VnaCBgX2hhbmRsZUNsb3NlYCBzbyByZXN1bWFibGUgc3RhdGUgc3RpbGwgcGF1c2VzXG4gICAgICAvLyBmb3IgdGhlIGdyYWNlIHdpbmRvdyBhbmQgZXZlcnl0aGluZyBlbHNlIGlzIHRvcm4gZG93bi5cbiAgICAgIHRoaXMuX3N0b3BIZWFydGJlYXQoKVxuICAgICAgdGhpcy5faGFuZGxlQ2xvc2UoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faGVhcnRiZWF0QWxpdmUgPSBmYWxzZVxuICAgIHRoaXMuX3NlbmRDb250cm9sRnJhbWUoV0VCU09DS0VUX09QQ09ERV9QSU5HLCBCdWZmZXIuYWxsb2MoMCkpXG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBlci1zZXNzaW9uIGhlYXJ0YmVhdCB0aW1lciwgaWYgYW55LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zdG9wSGVhcnRiZWF0KCkge1xuICAgIGlmICh0aGlzLl9oZWFydGJlYXRUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9oZWFydGJlYXRUaW1lcilcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdFRpbWVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlbmQgY29udHJvbCBmcmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9wY29kZSAtIE9wY29kZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9zZW5kQ29udHJvbEZyYW1lKG9wY29kZSwgcGF5bG9hZCkge1xuICAgIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyKVxuXG4gICAgaGVhZGVyWzBdID0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgb3Bjb2RlXG4gICAgaGVhZGVyWzFdID0gcGF5bG9hZC5sZW5ndGhcblxuICAgIHRoaXMuY2xpZW50LmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIEJ1ZmZlci5jb25jYXQoW2hlYWRlciwgcGF5bG9hZF0pLCB7d2Vic29ja2V0RnJhbWU6IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBqc29uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSAtIFJlcXVlc3QgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2VuZEpzb24oYm9keSkge1xuICAgIC8vIFdoaWxlIHBhdXNlZCAod2FpdGluZyBmb3IgYSByZXN1bWUpLCBzdGFzaCBmcmFtZXMgaW4gYW5cbiAgICAvLyBvdXRib3VuZCBxdWV1ZSBhbmQgZmx1c2ggdGhlbSBpbiBvcmRlciBvbiByZXN1bWUuIENhcHBlZCB0b1xuICAgIC8vIHByZXZlbnQgcnVuYXdheSBtZW1vcnkgdXNlIHdoaWxlIHRoZSBjbGllbnQgaXMgb2ZmbGluZS5cbiAgICBpZiAodGhpcy5fcGF1c2VkKSB7XG4gICAgICB0aGlzLl9vdXRib3VuZFF1ZXVlIHx8PSBbXVxuXG4gICAgICBpZiAodGhpcy5fb3V0Ym91bmRRdWV1ZS5sZW5ndGggPj0gV0VCU09DS0VUX1BBVVNFRF9RVUVVRV9DQVApIHtcbiAgICAgICAgLy8gRHJvcCBvbGRlc3Qgc28gdGhlIG1vc3QgcmVjZW50IGFjdGl2aXR5IHdpbnMgb24gcmVzdW1lLlxuICAgICAgICB0aGlzLl9vdXRib3VuZFF1ZXVlLnNoaWZ0KClcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb3V0Ym91bmRRdWV1ZS5wdXNoKGJvZHkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2xpZW50Py5ldmVudHMpIHJldHVyblxuXG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5mcm9tKGpzb24sIFwidXRmLThcIilcbiAgICBsZXQgaGVhZGVyXG5cbiAgICBpZiAocGF5bG9hZC5sZW5ndGggPCAxMjYpIHtcbiAgICAgIGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyKVxuICAgICAgaGVhZGVyWzFdID0gcGF5bG9hZC5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHBheWxvYWQubGVuZ3RoIDwgNjU1MzYpIHtcbiAgICAgIGhlYWRlciA9IEJ1ZmZlci5hbGxvYyg0KVxuICAgICAgaGVhZGVyWzFdID0gMTI2XG4gICAgICBoZWFkZXIud3JpdGVVSW50MTZCRShwYXlsb2FkLmxlbmd0aCwgMilcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDEwKVxuICAgICAgaGVhZGVyWzFdID0gMTI3XG4gICAgICBoZWFkZXIud3JpdGVCaWdVSW50NjRCRShCaWdJbnQocGF5bG9hZC5sZW5ndGgpLCAyKVxuICAgIH1cblxuICAgIGhlYWRlclswXSA9IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSB8IFdFQlNPQ0tFVF9PUENPREVfVEVYVFxuXG4gICAgdGhpcy5jbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBwYXlsb2FkXSksIHt3ZWJzb2NrZXRGcmFtZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogRmx1c2hlcyB0aGUgcGF1c2VkIG91dGJvdW5kIHF1ZXVlIG92ZXIgdGhlIGN1cnJlbnQgc29ja2V0LlxuICAgKiBDYWxsZWQgZHVyaW5nIHJlc3VtZSBhZnRlciBgc2Vzc2lvbi1yZXN1bWVkYCBoYXMgYmVlbiBzZW50IG9uXG4gICAqIHRoZSBORVcgc2Vzc2lvbidzIHNvY2tldCAobm90IHRoaXMgc2Vzc2lvbidzKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZmx1c2hPdXRib3VuZFF1ZXVlKCkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5fb3V0Ym91bmRRdWV1ZSB8fCBbXVxuXG4gICAgdGhpcy5fb3V0Ym91bmRRdWV1ZSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGJvZHkgb2YgcXVldWUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oYm9keSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdWJzY3JpYmUgdG8gY2hhbm5lbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2Fja25vd2xlZGdlPzogYm9vbGVhbiwgY2hhbm5lbEhhbmRsZXI/OiBpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0LCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz4sIHN1YnNjcmlwdGlvbkNoYW5uZWw/OiBzdHJpbmd9fSBbb3B0aW9uc10gLSBTdWJzY3JpYmUgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIHdhcyBhZGRlZC5cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZVRvQ2hhbm5lbChjaGFubmVsLCB7YWNrbm93bGVkZ2UgPSB0cnVlLCBjaGFubmVsSGFuZGxlciwgbGFzdEV2ZW50SWQsIHBhcmFtcywgc3Vic2NyaXB0aW9uQ2hhbm5lbH0gPSB7fSkge1xuICAgIGF3YWl0IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbikubWFya0NoYW5uZWxJbnRlcmVzdGVkKGNoYW5uZWwpXG5cbiAgICBjb25zdCByZXBsYXlTdGF0ZSA9IGF3YWl0IHRoaXMuX3ByZXBhcmVSZXBsYXlTdGF0ZSh7XG4gICAgICBjaGFubmVsLFxuICAgICAgbGFzdEV2ZW50SWQsXG4gICAgICBzdWJzY3JpcHRpb25DaGFubmVsOiBzdWJzY3JpcHRpb25DaGFubmVsIHx8IGNoYW5uZWwsXG4gICAgICBzdWJzY3JpcHRpb25QYXJhbXM6IHBhcmFtc1xuICAgIH0pXG5cbiAgICBpZiAocmVwbGF5U3RhdGUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2VcbiAgICBpZiAocmVwbGF5U3RhdGUpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5zZXQoY2hhbm5lbCwgcmVwbGF5U3RhdGUpXG4gICAgfVxuXG4gICAgdGhpcy5hZGRTdWJzY3JpcHRpb24oY2hhbm5lbClcblxuICAgIGlmIChjaGFubmVsSGFuZGxlcikge1xuICAgICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmhhcyhjaGFubmVsKSkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLnNldChjaGFubmVsLCBuZXcgU2V0KCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KGNoYW5uZWwpPy5hZGQoY2hhbm5lbEhhbmRsZXIpXG5cbiAgICAgIGlmICghdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbEhhbmRsZXIpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuc2V0KGNoYW5uZWxIYW5kbGVyLCBuZXcgU2V0KCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZ2V0KGNoYW5uZWxIYW5kbGVyKT8uYWRkKGNoYW5uZWwpXG4gICAgfVxuXG4gICAgaWYgKHJlcGxheVN0YXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZXBsYXlDaGFubmVsRXZlbnRzKHtjaGFubmVsLCByZXBsYXlTdGF0ZX0pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0aGlzLl9maW5pc2hSZXBsYXlTdGF0ZShjaGFubmVsLCByZXBsYXlTdGF0ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWNrbm93bGVkZ2UpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWwsIHR5cGU6IFwic3Vic2NyaWJlZFwifSlcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIF9oYW5kbGVDbG9zZSgpIHtcbiAgICAvLyBJZiB0aGUgc2Vzc2lvbiBoYXMgcmVzdW1hYmxlIHN0YXRlIChsaXZlIENvbm5lY3Rpb24gb3JcbiAgICAvLyBDaGFubmVsVjIgc3Vic2NyaXB0aW9uKSwgbW92ZSBpdCBpbnRvIHRoZSBwYXVzZWQgcmVnaXN0cnlcbiAgICAvLyBpbnN0ZWFkIG9mIHRlYXJpbmcgZG93bjsgYSBuZXcgc29ja2V0IHByZXNlbnRpbmcgdGhlIHNlc3Npb25JZFxuICAgIC8vIHZpYSBgc2Vzc2lvbi1yZXN1bWVgIHdpdGhpbiB0aGUgZ3JhY2Ugd2luZG93IHdpbGwgcmVhdHRhY2guXG4gICAgY29uc3QgaGFzUmVzdW1hYmxlU3RhdGUgPSB0aGlzLl9jb25uZWN0aW9ucy5zaXplID4gMCB8fCB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5zaXplID4gMFxuXG4gICAgaWYgKGhhc1Jlc3VtYWJsZVN0YXRlICYmICF0aGlzLl9wYXVzZWQpIHtcbiAgICAgIC8vIFBhdXNlZCBzZXNzaW9ucyBoYXZlIG5vIGxpdmUgc29ja2V0IHRvIHBpbmc7IHRoZSBncmFjZSB0aW1lclxuICAgICAgLy8gb3ducyB0aGVpciBldmVudHVhbCB0ZWFyZG93biBmcm9tIGhlcmUuXG4gICAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICAgIHRoaXMuX3BhdXNlZCA9IHRydWVcbiAgICAgIHRoaXMuc29ja2V0ID0gbnVsbFxuICAgICAgLy8gS2ljayBvZmYgYXV0aC1pZGVudGl0eSBjYXB0dXJlIGZvciByZXN1bWUgdmVyaWZpY2F0aW9uLiBSdW5zXG4gICAgICAvLyBpbiB0aGUgYmFja2dyb3VuZCDigJQgYF9oYW5kbGVTZXNzaW9uUmVzdW1lYCBhd2FpdHNcbiAgICAgIC8vIGBfcmVzdW1lSWRlbnRpdHlQcm9taXNlYCBiZWZvcmUgY29tcGFyaW5nLiBQYXVzZSByZWdpc3RyYXRpb25cbiAgICAgIC8vIGlzIHN5bmNocm9ub3VzIHNvIGEgcmVzdW1lIGFycml2aW5nIGltbWVkaWF0ZWx5IHN0aWxsIGZpbmRzXG4gICAgICAvLyB0aGUgc2Vzc2lvbi5cbiAgICAgIHRoaXMuX3Jlc3VtZUlkZW50aXR5UHJvbWlzZSA9IHRoaXMuX2NhcHR1cmVSZXN1bWVJZGVudGl0eSgpXG4gICAgICB2b2lkIHRoaXMuX2ZpcmVPbkRpc2Nvbm5lY3QoKVxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl9wYXVzZVdlYnNvY2tldFNlc3Npb24odGhpcylcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl93ZWJzb2NrZXRTZXNzaW9ucy5kZWxldGUodGhpcylcbiAgICB2b2lkIHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyQ2xvc2UoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25DaGFubmVsKClcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ29ubmVjdGlvbnMoXCJzZXNzaW9uX2Rlc3Ryb3llZFwiKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25DaGFubmVsU3Vic2NyaXB0aW9ucygpXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGJ5IHRoZSBncmFjZSB0aW1lciB3aGVuIHRoZSBwYXVzZWQgcGVyaW9kIGV4cGlyZXMgd2l0aG91dFxuICAgKiBhIHJlc3VtZS4gVGVhcnMgZG93biBhbGwgbGl2ZSBDb25uZWN0aW9ucyArIENoYW5uZWwgc3VicyBhbmRcbiAgICogZHJvcHMgdGhlIHNlc3Npb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2ZpbmFsaXplR3JhY2VFeHBpcnkoKSB7XG4gICAgdGhpcy5fc3RvcEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl93ZWJzb2NrZXRTZXNzaW9ucy5kZWxldGUodGhpcylcbiAgICB2b2lkIHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyQ2xvc2UoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25DaGFubmVsKClcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ29ubmVjdGlvbnMoXCJncmFjZV9leHBpcmVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBjb25maWd1cmVkIGlkZW50aXR5IHJlc29sdmVyIGFnYWluc3QgdGhpcyBzZXNzaW9uLlxuICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBzdG9yZWQgYXQgcGF1c2UgdGltZSBhbmQgYXdhaXRlZCBhdFxuICAgKiByZXN1bWUgdGltZSBzbyB3ZSBjYW4gcmVqZWN0IHJlc3VtZSBhdHRlbXB0cyBmcm9tIGEgZGlmZmVyZW50XG4gICAqIGF1dGhlbnRpY2F0ZWQgY2FsbGVyIChzaWduZWQgb3V0LCBzd2FwcGVkIHVzZXIsIGV4cGlyZWQgY29va2llKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IC0gQ2FwdHVyZWQgYXV0aGVudGljYXRlZCBpZGVudGl0eSBmb3IgcmVzdW1lIHZhbGlkYXRpb24uXG4gICAqL1xuICBhc3luYyBfY2FwdHVyZVJlc3VtZUlkZW50aXR5KCkge1xuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyPy4oKVxuXG4gICAgaWYgKHR5cGVvZiByZXNvbHZlciAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVyKHRoaXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBzZXNzaW9uIGlkZW50aXR5IHJlc29sdmVyIGZhaWxlZCBhdCBwYXVzZVwiLCBlcnJvcl0pXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGBvbkRpc2Nvbm5lY3RgIG9uIGV2ZXJ5IGxpdmUgQ29ubmVjdGlvbiBhbmQgQ2hhbm5lbCBzdWIgc29cbiAgICogYXBwcyBjYW4gcGF1c2UgcGVyLWluc3RhbmNlIHdvcmsgd2hpbGUgdGhlIHNlc3Npb24gaXMgcGF1c2VkLlxuICAgKiBFcnJvcnMgYXJlIGxvZ2dlZCwgbm90IHJldGhyb3duIOKAlCBvbmUgYnJva2VuIGhhbmRsZXIgbXVzdCBub3RcbiAgICogYmxvY2sgdGhlIHJlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2ZpcmVPbkRpc2Nvbm5lY3QoKSB7XG4gICAgYXdhaXQgdGhpcy5fZmlyZUxpZmVjeWNsZUNhbGxiYWNrKFwib25EaXNjb25uZWN0XCIpXG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYG9uUmVzdW1lYCBvbiBldmVyeSBsaXZlIENvbm5lY3Rpb24gYW5kIENoYW5uZWwgc3ViIGFmdGVyXG4gICAqIGEgc3VjY2Vzc2Z1bCBgc2Vzc2lvbi1yZXN1bWVgIGhhbmRvZmYuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2ZpcmVPblJlc3VtZSgpIHtcbiAgICBhd2FpdCB0aGlzLl9maXJlTGlmZWN5Y2xlQ2FsbGJhY2soXCJvblJlc3VtZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmlyZSBsaWZlY3ljbGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7XCJvbkRpc2Nvbm5lY3RcIiB8IFwib25SZXN1bWVcIn0gY2FsbGJhY2tOYW1lIExpZmVjeWNsZSBjYWxsYmFjayB0byBmaXJlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiBldmVyeSBsaXZlIGhhbmRsZXIgaGFzIGJlZW4gYXR0ZW1wdGVkLlxuICAgKi9cbiAgYXN5bmMgX2ZpcmVMaWZlY3ljbGVDYWxsYmFjayhjYWxsYmFja05hbWUpIHtcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb25bY2FsbGJhY2tOYW1lXT8uKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgJHtjYWxsYmFja05hbWV9IGZhaWxlZCBmb3IgJHtjb25uZWN0aW9uLmNvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7c3Vic2NyaXB0aW9ufSBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3Vic2NyaXB0aW9uW2NhbGxiYWNrTmFtZV0/LigpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYCR7Y2FsbGJhY2tOYW1lfSBmYWlsZWQgZm9yIGNoYW5uZWwgc3ViICR7c3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBge3R5cGU6IFwic2Vzc2lvbi1yZXN1bWVcIn1gLiBUaGlzIHNlc3Npb24gKHRoZSBuZXdseS1cbiAgICogY3JlYXRlZCBvbmUgd2hvc2Ugc29ja2V0IGp1c3QgY29ubmVjdGVkKSB0cmFuc2ZlcnMgc3RhdGUgZnJvbVxuICAgKiB0aGUgcGF1c2VkIHNlc3Npb24gYW5kIGluc3RydWN0cyB0aGUgY2xpZW50IHZpYVxuICAgKiBgc2Vzc2lvbi1yZXN1bWVkYCBvciBgc2Vzc2lvbi1nb25lYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZSAtIFNlc3Npb24tcmVzdW1lIGZyYW1lIGNvbnRhaW5pbmcgdGhlIHBhdXNlZCBzZXNzaW9uIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZVNlc3Npb25SZXN1bWUobWVzc2FnZSkge1xuICAgIGNvbnN0IHJlc3VtZVNlc3Npb25JZCA9IG1lc3NhZ2Uuc2Vzc2lvbklkXG5cbiAgICBpZiAodHlwZW9mIHJlc3VtZVNlc3Npb25JZCAhPT0gXCJzdHJpbmdcIiB8fCAhcmVzdW1lU2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcInNlc3Npb24tZ29uZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBhdXNlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5fZmluZFBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuXG4gICAgaWYgKCFwYXVzZWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQXV0aCByZS12ZXJpZnk6IGNvbXBhcmUgdGhlIGZyZXNoIGNhbGxlcidzIGlkZW50aXR5IGFnYWluc3QgdGhlXG4gICAgLy8gb25lIGNhcHR1cmVkIGF0IHBhdXNlLiBNaXNtYXRjaCBtZWFucyBhIGRpZmZlcmVudCB1c2VyIChvciBhXG4gICAgLy8gc2lnbmVkLW91dCBzZXNzaW9uKSBpcyB0cnlpbmcgdG8gcmVjbGFpbSBzdGF0ZSB0aGF0IGlzbid0XG4gICAgLy8gdGhlaXJzIOKAlCBkZXN0cm95IHRoZSBwYXVzZWQgc2Vzc2lvbiBvdXRyaWdodC5cbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uSWRlbnRpdHlSZXNvbHZlcj8uKClcblxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgcGF1c2VkSWRlbnRpdHkgPSBhd2FpdCBwYXVzZWQuX3Jlc3VtZUlkZW50aXR5UHJvbWlzZVxuICAgICAgbGV0IGZyZXNoSWRlbnRpdHlcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZnJlc2hJZGVudGl0eSA9IGF3YWl0IHJlc29sdmVyKHRoaXMpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgc2Vzc2lvbiBpZGVudGl0eSByZXNvbHZlciBmYWlsZWQgYXQgcmVzdW1lXCIsIGVycm9yXSlcbiAgICAgICAgZnJlc2hJZGVudGl0eSA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBpZiAoIWlkZW50aXRpZXNNYXRjaChwYXVzZWRJZGVudGl0eSwgZnJlc2hJZGVudGl0eSkpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl9jbGVhclBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuICAgICAgICBwYXVzZWQuX2ZpbmFsaXplR3JhY2VFeHBpcnkoKVxuICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcInNlc3Npb24tZ29uZVwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl9jbGVhclBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuXG4gICAgLy8gVHJhbnNmZXIgcmVzdW1hYmxlIHN0YXRlIG9udG8gdGhpcyAobGl2ZSkgc2Vzc2lvbi4gVGhlIHBhdXNlZFxuICAgIC8vIHNlc3Npb24gc2hlbGwgaXMgZGlzY2FyZGVkIGFmdGVyIHRoZSB0cmFuc2Zlci5cbiAgICBmb3IgKGNvbnN0IFtjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb25dIG9mIHBhdXNlZC5fY29ubmVjdGlvbnMpIHtcbiAgICAgIGNvbm5lY3Rpb24uc2Vzc2lvbiA9IHRoaXNcbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb24pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3ViSWQsIGVudHJ5XSBvZiBwYXVzZWQuX2NoYW5uZWxTdWJzY3JpcHRpb25zKSB7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24uc2Vzc2lvbiA9IHRoaXNcbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNldChzdWJJZCwgZW50cnkpXG4gICAgfVxuXG4gICAgdGhpcy5fbWV0YWRhdGEgPSB7Li4ucGF1c2VkLl9tZXRhZGF0YX1cbiAgICB0aGlzLmRhdGEgPSBwYXVzZWQuZGF0YVxuICAgIHRoaXMuc2Vzc2lvbklkID0gcmVzdW1lU2Vzc2lvbklkXG5cbiAgICAvLyBUcmFuc2ZlciBhbnkgZnJhbWVzIHF1ZXVlZCB3aGlsZSB0aGUgcGF1c2VkIHNlc3Npb24gaGFkIG5vXG4gICAgLy8gc29ja2V0LiBUaGV5IGZsdXNoIEFGVEVSIHNlc3Npb24tcmVzdW1lZCBzbyB0aGUgY2xpZW50IGtub3dzXG4gICAgLy8gd2hpY2ggc2Vzc2lvbiB0aGV5IGJlbG9uZyB0by5cbiAgICBjb25zdCBxdWV1ZWQgPSBwYXVzZWQuX291dGJvdW5kUXVldWUgfHwgW11cblxuICAgIHBhdXNlZC5fb3V0Ym91bmRRdWV1ZSA9IFtdXG4gICAgcGF1c2VkLl9jb25uZWN0aW9ucy5jbGVhcigpXG4gICAgcGF1c2VkLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5jbGVhcigpXG4gICAgcGF1c2VkLl9wYXVzZWQgPSBmYWxzZVxuICAgIHBhdXNlZC5kZXN0cm95KClcblxuICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1yZXN1bWVkXCIsIHNlc3Npb25JZDogcmVzdW1lU2Vzc2lvbklkfSlcbiAgICBmb3IgKGNvbnN0IGJvZHkgb2YgcXVldWVkKSB0aGlzLnNlbmRKc29uKGJvZHkpXG4gICAgYXdhaXQgdGhpcy5fZmlyZU9uUmVzdW1lKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgb25DbG9zZShyZWFzb24pYCBvbiBldmVyeSBsaXZlIGFwcC1kZWZpbmVkIGNvbm5lY3Rpb24sIHRoZW5cbiAgICogZHJvcHMgdGhlbSBmcm9tIHRoZSByZWdpc3RyeS4gTm8gbmV0d29yayBmcmFtZSBpcyBzZW50IOKAlCB0aGVcbiAgICogc29ja2V0IGlzIGFscmVhZHkgZ29pbmcgYXdheS5cbiAgICogQHBhcmFtIHtcInNlc3Npb25fZGVzdHJveWVkXCIgfCBcImdyYWNlX2V4cGlyZWRcIiB8IFwiZXJyb3JcIn0gcmVhc29uIC0gUGVybWFuZW50IHRlYXJkb3duIHJlYXNvbiBwYXNzZWQgdG8gZWFjaCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF90ZWFyZG93bkNvbm5lY3Rpb25zKHJlYXNvbikge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gWy4uLnRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpXVxuXG4gICAgdGhpcy5fY29ubmVjdGlvbnMuY2xlYXIoKVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICBjb25uZWN0aW9uLl9jbG9zZWQgPSB0cnVlXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5vbkNsb3NlKHJlYXNvbilcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHRlYXIgZG93biBjb25uZWN0aW9uICR7Y29ubmVjdGlvbi5jb25uZWN0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgYHt0eXBlOiBcImNvbm5lY3Rpb24tb3BlblwifWAgbWVzc2FnZSDigJQgaW5zdGFudGlhdGVzIHRoZVxuICAgKiByZWdpc3RlcmVkIGNvbm5lY3Rpb24gY2xhc3MsIHN0b3JlcyBpdCBvbiBgX2Nvbm5lY3Rpb25zYCwgYW5kXG4gICAqIGZpcmVzIGBvbkNvbm5lY3QoKWAuIFNlbmRzIGBjb25uZWN0aW9uLW9wZW5lZGAgb24gc3VjY2VzcyBvclxuICAgKiBgY29ubmVjdGlvbi1lcnJvcmAgb24gZmFpbHVyZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZSAtIENvbm5lY3Rpb24tb3BlbiBmcmFtZSBuYW1pbmcgdGhlIGNvbm5lY3Rpb24gdHlwZSBhbmQgaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ29ubmVjdGlvbk9wZW4obWVzc2FnZSkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25JZCA9IG1lc3NhZ2UuY29ubmVjdGlvbklkXG4gICAgY29uc3QgY29ubmVjdGlvblR5cGUgPSBtZXNzYWdlLmNvbm5lY3Rpb25UeXBlXG4gICAgY29uc3QgcGFyYW1zID0gbWVzc2FnZS5wYXJhbXMgfHwge31cblxuICAgIGlmICh0eXBlb2YgY29ubmVjdGlvbklkICE9PSBcInN0cmluZ1wiIHx8ICFjb25uZWN0aW9uSWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiZXJyb3JcIiwgZXJyb3I6IFwiY29ubmVjdGlvbi1vcGVuIHJlcXVpcmVzIGNvbm5lY3Rpb25JZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29ubmVjdGlvblR5cGUgIT09IFwic3RyaW5nXCIgfHwgIWNvbm5lY3Rpb25UeXBlKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBcImNvbm5lY3Rpb25UeXBlIGlzIHJlcXVpcmVkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2Nvbm5lY3Rpb25zLmhhcyhjb25uZWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBcIkNvbm5lY3Rpb24gaWQgYWxyZWFkeSBpbiB1c2VcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBDb25uZWN0aW9uQ2xhc3MgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q29ubmVjdGlvbkNsYXNzPy4oY29ubmVjdGlvblR5cGUpXG5cbiAgICBpZiAoIUNvbm5lY3Rpb25DbGFzcykge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjb25uZWN0aW9uLWVycm9yXCIsIGNvbm5lY3Rpb25JZCwgbWVzc2FnZTogYFVua25vd24gY29ubmVjdGlvbiB0eXBlOiAke2Nvbm5lY3Rpb25UeXBlfWB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uQ2xhc3Moe2Nvbm5lY3Rpb25JZCwgcGFyYW1zLCBzZXNzaW9uOiB0aGlzfSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uQ29ubmVjdCgpXG4gICAgICB9KVxuICAgICAgLy8gUmVnaXN0ZXIgb25seSBhZnRlciBvbkNvbm5lY3QgcmVzb2x2ZXMgc28gYSBjb25uZWN0aW9uLW1lc3NhZ2VcbiAgICAgIC8vIGNhbiBuZXZlciBiZSByb3V0ZWQgdG8gYSBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgY29ubmVjdGlvbi5cbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb24pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tb3BlbmVkXCIsIGNvbm5lY3Rpb25JZH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiAke2Nvbm5lY3Rpb25UeXBlfToke2Nvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiAvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpLm1lc3NhZ2UgfHwgXCJGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgYHt0eXBlOiBcImNvbm5lY3Rpb24tbWVzc2FnZVwifWAgZnJvbSB0aGUgY2xpZW50LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ29ubmVjdGlvbi1tZXNzYWdlIGZyYW1lIGNvbnRhaW5pbmcgdGhlIHRhcmdldCBpZGVudGlmaWVyIGFuZCBib2R5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdHlwZW9mIGNvbm5lY3Rpb25JZCA9PT0gXCJzdHJpbmdcIiA/IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpIDogbnVsbFxuXG4gICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBcIlVua25vd24gY29ubmVjdGlvbiBpZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uTWVzc2FnZShtZXNzYWdlLmJvZHkpXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byBoYW5kbGUgY29ubmVjdGlvbi1tZXNzYWdlIGZvciAke2Nvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiAvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpLm1lc3NhZ2UgfHwgXCJGYWlsZWQgdG8gaGFuZGxlIG1lc3NhZ2VcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1jbG9zZVwifWAgZnJvbSB0aGUgY2xpZW50IOKAlCBmaXJlc1xuICAgKiBgb25DbG9zZShcImNsaWVudF9jbG9zZVwiKWAgYW5kIGNvbmZpcm1zIHdpdGggYGNvbm5lY3Rpb24tY2xvc2VkYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZSAtIENvbm5lY3Rpb24tY2xvc2UgZnJhbWUgY29udGFpbmluZyB0aGUgdGFyZ2V0IGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNvbm5lY3Rpb25DbG9zZShtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdHlwZW9mIGNvbm5lY3Rpb25JZCA9PT0gXCJzdHJpbmdcIiA/IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpIDogbnVsbFxuXG4gICAgaWYgKCFjb25uZWN0aW9uKSByZXR1cm5cblxuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uSWQpXG4gICAgLy8gTWFyayBjbG9zZWQgYmVmb3JlIGZpcmluZyBvbkNsb3NlIHNvIGFwcCBjb2RlIGhvbGRpbmcgdGhlXG4gICAgLy8gaGFuZGxlIHNlZXMgYGlzQ2xvc2VkKCkgPT09IHRydWVgIGFuZCBjYW4ndCByZS1lbnRlciBzZW5kTWVzc2FnZS5cbiAgICBjb25uZWN0aW9uLl9jbG9zZWQgPSB0cnVlXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5vbkNsb3NlKFwiY2xpZW50X2Nsb3NlXCIpXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byB0ZWFyIGRvd24gY29ubmVjdGlvbiAke2Nvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjb25uZWN0aW9uLWNsb3NlZFwiLCBjb25uZWN0aW9uSWQsIHJlYXNvbjogXCJjbGllbnRfY2xvc2VcIn0pXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBge3R5cGU6IFwiY2hhbm5lbC1zdWJzY3JpYmVcIn1gIOKAlCBydW5zIGBjYW5TdWJzY3JpYmUoKWAsXG4gICAqIHJlZ2lzdGVycyB3aXRoIHRoZSBDb25maWd1cmF0aW9uJ3MgZ2xvYmFsIHJvdXRpbmcgcmVnaXN0cnkgb25cbiAgICogc3VjY2VzcywgYW5kIHNlbmRzIGBjaGFubmVsLXN1YnNjcmliZWRgIG9yIGBjaGFubmVsLWVycm9yYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZSAtIENoYW5uZWwtc3Vic2NyaWJlIGZyYW1lIGRlc2NyaWJpbmcgdGhlIHJlcXVlc3RlZCBzdWJzY3JpcHRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNoYW5uZWxTdWJzY3JpYmUobWVzc2FnZSkge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbklkID0gbWVzc2FnZS5zdWJzY3JpcHRpb25JZFxuICAgIGNvbnN0IGNoYW5uZWxUeXBlID0gbWVzc2FnZS5jaGFubmVsVHlwZVxuICAgIGNvbnN0IHBhcmFtcyA9IG1lc3NhZ2UucGFyYW1zIHx8IHt9XG4gICAgY29uc3QgbGFzdEV2ZW50SWQgPSBtZXNzYWdlLmxhc3RFdmVudElkXG5cbiAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbklkICE9PSBcInN0cmluZ1wiIHx8ICFzdWJzY3JpcHRpb25JZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJlcnJvclwiLCBlcnJvcjogXCJjaGFubmVsLXN1YnNjcmliZSByZXF1aXJlcyBzdWJzY3JpcHRpb25JZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2hhbm5lbFR5cGUgIT09IFwic3RyaW5nXCIgfHwgIWNoYW5uZWxUeXBlKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiY2hhbm5lbFR5cGUgaXMgcmVxdWlyZWRcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuaGFzKHN1YnNjcmlwdGlvbklkKSkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLWVycm9yXCIsIHN1YnNjcmlwdGlvbklkLCBtZXNzYWdlOiBcIlN1YnNjcmlwdGlvbiBpZCBhbHJlYWR5IGluIHVzZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IENoYW5uZWxDbGFzcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDaGFubmVsQ2xhc3M/LihjaGFubmVsVHlwZSlcblxuICAgIGlmICghQ2hhbm5lbENsYXNzKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IGBVbmtub3duIGNoYW5uZWwgdHlwZTogJHtjaGFubmVsVHlwZX1gfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG5ldyBDaGFubmVsQ2xhc3Moe3N1YnNjcmlwdGlvbklkLCBwYXJhbXMsIHNlc3Npb246IHRoaXN9KVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlc29sdmluZyB0aGUgdGVuYW50IGNhbiBydW4gZGF0YWJhc2UgcXVlcmllcyAoZS5nLiBsb29raW5nIHVwIHRoZVxuICAgICAgLy8gcmVjb3JkJ3MgcHJvamVjdCBhbmQgdGhlIGNhbGxlcidzIGFjY2VzcyksIHNvIGl0IG11c3QgaGFwcGVuIGluc2lkZSBhXG4gICAgICAvLyBjb25uZWN0aW9uIHNjb3BlLiBXaXRob3V0IHRoaXMgdGhlIHJlc29sdmVyIGJvcnJvd3MgYSBjb25uZWN0aW9uIHRoYXRcbiAgICAgIC8vIGlzIGNoZWNrZWQgYmFjayBpbiBiZWZvcmUvd2hpbGUgaXQgcXVlcmllcywgaW50ZXJtaXR0ZW50bHkgc3VyZmFjaW5nIGFzXG4gICAgICAvLyBcIkNvbm5lY3Rpb24g4oCmIGRvZXNuJ3QgZXhpc3QgYW55IG1vcmVcIiBvciBhIGZhbHNlbHkgdW5hdXRob3JpemVkXG4gICAgICAvLyBzdWJzY3JpcHRpb24uXG4gICAgICBsZXQgdGVuYW50XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0ZW5hbnQgPSBhd2FpdCB0aGlzLl9yZXNvbHZlVGVuYW50KHtjaGFubmVsOiBjaGFubmVsVHlwZSwgcGFyYW1zfSlcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgYWxsb3dlZCA9IGZhbHNlXG5cbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhbGxvd2VkID0gQm9vbGVhbihhd2FpdCBzdWJzY3JpcHRpb24uY2FuU3Vic2NyaWJlKCkpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFhbGxvd2VkKSB7XG4gICAgICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLWVycm9yXCIsIHN1YnNjcmlwdGlvbklkLCBtZXNzYWdlOiBcIlN1YnNjcmlwdGlvbiBub3QgYXV0aG9yaXplZFwifSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNldChzdWJzY3JpcHRpb25JZCwge2NoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb259KVxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3JlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9uKVxuXG4gICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiBhd2FpdCBzdWJzY3JpcHRpb24uc3Vic2NyaWJlZCgpKVxuXG4gICAgICAgIC8vIFJlcGxheSBtaXNzZWQgZXZlbnRzIEJFRk9SRSBzZW5kaW5nIGNoYW5uZWwtc3Vic2NyaWJlZCBzb1xuICAgICAgICAvLyB0aGUgY2xpZW50IGtub3dzOiBldmVyeXRoaW5nIGJlZm9yZSB0aGUgY29uZmlybWF0aW9uIGlzXG4gICAgICAgIC8vIHJlcGxheWVkLCBldmVyeXRoaW5nIGFmdGVyIGlzIGxpdmUuXG4gICAgICAgIGlmICh0eXBlb2YgbGFzdEV2ZW50SWQgPT09IFwic3RyaW5nXCIgJiYgbGFzdEV2ZW50SWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3JlcGxheUNoYW5uZWxFdmVudHNGb3JTdWJzY3JpcHRpb24oe2NoYW5uZWxUeXBlLCBsYXN0RXZlbnRJZCwgc3Vic2NyaXB0aW9ufSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1zdWJzY3JpYmVkXCIsIHN1YnNjcmlwdGlvbklkfSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25JZClcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fdW5yZWdpc3RlcldlYnNvY2tldENoYW5uZWxTdWJzY3JpcHRpb24oY2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbilcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHN1YnNjcmliZSBjaGFubmVsICR7Y2hhbm5lbFR5cGV9OiR7c3Vic2NyaXB0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLWVycm9yXCIsIHN1YnNjcmlwdGlvbklkLCBtZXNzYWdlOiAvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpLm1lc3NhZ2UgfHwgXCJGYWlsZWQgdG8gc3Vic2NyaWJlXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYXlzIG1pc3NlZCBldmVudHMgZnJvbSB0aGUgcGVyc2lzdGVudCBldmVudC1sb2cgc3RvcmUgZm9yIGFcbiAgICogY2hhbm5lbCBzdWJzY3JpcHRpb24gdGhhdCBwcm92aWRlZCBgbGFzdEV2ZW50SWRgLiBTZW5kcyBlYWNoXG4gICAqIG1pc3NlZCBldmVudCBhcyBhIGBjaGFubmVsLW1lc3NhZ2VgIHdpdGggYHJlcGxheWVkOiB0cnVlYC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsVHlwZSAtIENoYW5uZWwgdHlwZSBuYW1lIChldmVudC1sb2cga2V5KS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubGFzdEV2ZW50SWQgLSBDbGllbnQncyBsYXN0LXNlZW4gZXZlbnQgaWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIikuZGVmYXVsdH0gYXJncy5zdWJzY3JpcHRpb24gLSBMaXZlIHN1YnNjcmlwdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfcmVwbGF5Q2hhbm5lbEV2ZW50c0ZvclN1YnNjcmlwdGlvbih7Y2hhbm5lbFR5cGUsIGxhc3RFdmVudElkLCBzdWJzY3JpcHRpb259KSB7XG4gICAgY29uc3Qgc3RvcmUgPSB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pXG5cbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uYXdhaXRQZW5kaW5nQnJvYWRjYXN0cygpXG5cbiAgICBjb25zdCBjaGVja3BvaW50ID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRCeUlkKHtjaGFubmVsOiBjaGFubmVsVHlwZSwgaWQ6IGxhc3RFdmVudElkfSlcblxuICAgIGlmICghY2hlY2twb2ludCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICAgIHR5cGU6IFwiY2hhbm5lbC1yZXBsYXktZ2FwXCIsXG4gICAgICAgIHN1YnNjcmlwdGlvbklkOiBzdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgIGxhc3RFdmVudElkXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2VpbGluZyA9IGF3YWl0IHN0b3JlLmxhdGVzdFNlcXVlbmNlKGNoYW5uZWxUeXBlKVxuXG4gICAgaWYgKCFjZWlsaW5nIHx8IGNlaWxpbmcgPD0gY2hlY2twb2ludC5zZXF1ZW5jZSkgcmV0dXJuXG5cbiAgICBjb25zdCBldmVudHMgPSBhd2FpdCBzdG9yZS5nZXRFdmVudHNBZnRlcih7XG4gICAgICBjaGFubmVsOiBjaGFubmVsVHlwZSxcbiAgICAgIHNlcXVlbmNlOiBjaGVja3BvaW50LnNlcXVlbmNlLFxuICAgICAgdXBUb1NlcXVlbmNlOiBjZWlsaW5nXG4gICAgfSlcblxuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICBpZiAoc3Vic2NyaXB0aW9uLmlzQ2xvc2VkKCkpIGJyZWFrXG5cbiAgICAgIHN1YnNjcmlwdGlvbi5zZW5kTWVzc2FnZSgvKiogQHR5cGUge2ltcG9ydChcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLldlYnNvY2tldEpzb25WYWx1ZX0gKi8gKGV2ZW50LnBheWxvYWQpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGB7dHlwZTogXCJjaGFubmVsLXVuc3Vic2NyaWJlXCJ9YCBmcm9tIHRoZSBjbGllbnQg4oCUIGNhbGxzXG4gICAqIGB1bnN1YnNjcmliZWQoKWAgYW5kIHNlbmRzIGBjaGFubmVsLXVuc3Vic2NyaWJlZGAuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG1lc3NhZ2UgLSBDaGFubmVsLXVuc3Vic2NyaWJlIGZyYW1lIGNvbnRhaW5pbmcgdGhlIHN1YnNjcmlwdGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDaGFubmVsVW5zdWJzY3JpYmUobWVzc2FnZSkge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbklkID0gbWVzc2FnZS5zdWJzY3JpcHRpb25JZFxuXG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpcHRpb25JZCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuXG5cbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmdldChzdWJzY3JpcHRpb25JZClcblxuICAgIGlmICghZW50cnkpIHJldHVyblxuXG4gICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbklkKVxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fdW5yZWdpc3RlcldlYnNvY2tldENoYW5uZWxTdWJzY3JpcHRpb24oZW50cnkuY2hhbm5lbFR5cGUsIGVudHJ5LnN1YnNjcmlwdGlvbilcbiAgICBlbnRyeS5zdWJzY3JpcHRpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4gYXdhaXQgZW50cnkuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlZCgpKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byB1bnN1YnNjcmliZSBjaGFubmVsICR7ZW50cnkuY2hhbm5lbFR5cGV9OiR7c3Vic2NyaXB0aW9uSWR9YCwgZXJyb3JdKVxuICAgIH1cblxuICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC11bnN1YnNjcmliZWRcIiwgc3Vic2NyaXB0aW9uSWR9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGB1bnN1YnNjcmliZWQoKWAgb24gZXZlcnkgbGl2ZSBjaGFubmVsLXYyIHN1YnNjcmlwdGlvbixcbiAgICogcmVtb3ZlcyB0aGVtIGZyb20gdGhlIENvbmZpZ3VyYXRpb24ncyBnbG9iYWwgcmVnaXN0cnksIGFuZFxuICAgKiBkcm9wcyB0aGUgc2Vzc2lvbidzIG93biBtYXAuIE5vIG5ldHdvcmsgZnJhbWVzIOKAlCB0aGUgc29ja2V0XG4gICAqIGlzIGFscmVhZHkgZ29pbmcgYXdheS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfdGVhcmRvd25DaGFubmVsU3Vic2NyaXB0aW9ucygpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gWy4uLnRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpXVxuXG4gICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuY2xlYXIoKVxuXG4gICAgZm9yIChjb25zdCB7Y2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbn0gb2YgZW50cmllcykge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9uKVxuICAgICAgc3Vic2NyaXB0aW9uLl9jbG9zZWQgPSB0cnVlXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiBhd2FpdCBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmVkKCkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byB0ZWFyIGRvd24gY2hhbm5lbC12MiAke2NoYW5uZWxUeXBlfToke3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3RlYXJkb3duQ2hhbm5lbCgpIHtcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgdGhpcy5jaGFubmVscykge1xuICAgICAgYXdhaXQgdGhpcy5fdGVhcmRvd25TaW5nbGVDaGFubmVsKGNoYW5uZWwpXG4gICAgfVxuICAgIHRoaXMuY2hhbm5lbHMuY2xlYXIoKVxuICAgIHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5jbGVhcigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0ZWFyZG93biBzaW5nbGUgY2hhbm5lbC5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRDaGFubmVsfSBjaGFubmVsIC0gQ2hhbm5lbCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF90ZWFyZG93blNpbmdsZUNoYW5uZWwoY2hhbm5lbCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSB0aGlzLmNoYW5uZWxUZW5hbnRzLmdldChjaGFubmVsKVxuXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBjaGFubmVsPy51bnN1YnNjcmliZWQ/LigpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gdGVhcmRvd24gd2Vic29ja2V0IGNoYW5uZWxcIiwgZXJyb3JdKVxuICAgIH1cblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSB0aGlzLmhhbmRsZXJTdWJzY3JpcHRpb25zLmdldChjaGFubmVsKVxuXG4gICAgaWYgKHN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uQ2hhbm5lbCBvZiBzdWJzY3JpcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KHN1YnNjcmlwdGlvbkNoYW5uZWwpPy5kZWxldGUoY2hhbm5lbClcblxuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoc3Vic2NyaXB0aW9uQ2hhbm5lbCk/LnNpemUgPT09IDApIHtcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmRlbGV0ZShzdWJzY3JpcHRpb25DaGFubmVsKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZGVsZXRlKGNoYW5uZWwpXG4gICAgfVxuXG4gICAgdGhpcy5jaGFubmVsVGVuYW50cy5kZWxldGUoY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlZ2lzdGVyIGNoYW5uZWwuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0Q2hhbm5lbCB8IHVuZGVmaW5lZH0gY2hhbm5lbCAtIENoYW5uZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gdGVuYW50IC0gVGVuYW50IGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9yZWdpc3RlckNoYW5uZWwoY2hhbm5lbCwgdGVuYW50KSB7XG4gICAgaWYgKCFjaGFubmVsKSByZXR1cm5cblxuICAgIHRoaXMuY2hhbm5lbHMuYWRkKGNoYW5uZWwpXG4gICAgdGhpcy5jaGFubmVsVGVuYW50cy5zZXQoY2hhbm5lbCwgdGVuYW50KVxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY2hhbm5lbD8uc3Vic2NyaWJlZD8uKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGggY29ubmVjdGlvbnMuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF93aXRoQ29ubmVjdGlvbnMoY2FsbGJhY2spIHtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiV2Vic29ja2V0IHNlc3Npb25cIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFuZGxlIGNoYW5uZWwgc3Vic2NyaXB0aW9uLlxuICAgKiBAcGFyYW0ge3tjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19IGFyZ3MgLSBTdWJzY3JpcHRpb24gYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDaGFubmVsU3Vic2NyaXB0aW9uKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSkge1xuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgIGlmICghcmVzb2x2ZXIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRlbmFudCByZXNvbHV0aW9uIGNhbiBydW4gZGF0YWJhc2UgcXVlcmllcywgc28gaXQgbXVzdCBoYXBwZW4gaW5zaWRlIGFcbiAgICAgIC8vIGNvbm5lY3Rpb24gc2NvcGUgKHNlZSBfaGFuZGxlQ2hhbm5lbFN1YnNjcmliZSkuXG4gICAgICBsZXQgdGVuYW50XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0ZW5hbnQgPSBhd2FpdCB0aGlzLl9yZXNvbHZlVGVuYW50KHtjaGFubmVsLCBwYXJhbXN9KVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlcih7XG4gICAgICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgICAgICBzdWJzY3JpcHRpb246IHtjaGFubmVsLCBwYXJhbXN9LFxuICAgICAgICAgIHdlYnNvY2tldFNlc3Npb246IHRoaXNcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmVzb2x2ZWQpIHtcbiAgICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbCwgZXJyb3I6IFwiU3Vic2NyaXB0aW9uIHJlamVjdGVkXCIsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGFubmVsSW5zdGFuY2UgPSB0eXBlb2YgcmVzb2x2ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG5ldyByZXNvbHZlZCh7XG4gICAgICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgbGFzdEV2ZW50SWQsXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgICAgICBzdWJzY3JpcHRpb25DaGFubmVsOiBjaGFubmVsLFxuICAgICAgICAgIHN1YnNjcmlwdGlvblBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIHdlYnNvY2tldFNlc3Npb246IHRoaXNcbiAgICAgICAgfSlcbiAgICAgICAgOiByZXNvbHZlZFxuXG4gICAgICBpZiAoY2hhbm5lbEluc3RhbmNlICYmICEoY2hhbm5lbEluc3RhbmNlIGluc3RhbmNlb2YgV2Vic29ja2V0Q2hhbm5lbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb2x2ZWQgd2Vic29ja2V0IGNoYW5uZWwgbXVzdCBleHRlbmQgV2Vic29ja2V0Q2hhbm5lbFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLl9yZWdpc3RlckNoYW5uZWwoY2hhbm5lbEluc3RhbmNlLCB0ZW5hbnQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW1wiV2Vic29ja2V0IGNoYW5uZWwgc3Vic2NyaXB0aW9uIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsLCBlcnJvcjogXCJTdWJzY3JpcHRpb24gcmVqZWN0ZWRcIiwgdHlwZTogXCJlcnJvclwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBwcmVwYXJlIHJlcGxheSBzdGF0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gSW50ZXJuYWwgY2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gYXJncy5sYXN0RXZlbnRJZCAtIExhc3QgcmVjZWl2ZWQgZXZlbnQgaWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN1YnNjcmlwdGlvbkNoYW5uZWwgLSBDbGllbnQtZmFjaW5nIGNoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/PiB8IHVuZGVmaW5lZH0gYXJncy5zdWJzY3JpcHRpb25QYXJhbXMgLSBDbGllbnQtZmFjaW5nIHBhcmFtcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8ZmFsc2UgfCB7YnVmZmVyZWQ6IGJvb2xlYW4sIGNlaWxpbmdTZXF1ZW5jZTogbnVtYmVyLCBjaGVja3BvaW50U2VxdWVuY2U6IG51bWJlciwgcmVwbGF5aW5nOiBib29sZWFufSB8IG51bGw+fSAtIFJlcGxheSBzdGF0ZS5cbiAgICovXG4gIGFzeW5jIF9wcmVwYXJlUmVwbGF5U3RhdGUoe2NoYW5uZWwsIGxhc3RFdmVudElkLCBzdWJzY3JpcHRpb25DaGFubmVsLCBzdWJzY3JpcHRpb25QYXJhbXN9KSB7XG4gICAgaWYgKCFsYXN0RXZlbnRJZCkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHN0b3JlID0gd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSBhd2FpdCBzdG9yZS5nZXRFdmVudEJ5SWQoe2NoYW5uZWwsIGlkOiBsYXN0RXZlbnRJZH0pXG5cbiAgICBpZiAoIWNoZWNrcG9pbnQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWw6IHN1YnNjcmlwdGlvbkNoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXM6IHN1YnNjcmlwdGlvblBhcmFtcywgdHlwZTogXCJyZXBsYXktZ2FwXCJ9KVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1ZmZlcmVkOiBmYWxzZSxcbiAgICAgIGNlaWxpbmdTZXF1ZW5jZTogKGF3YWl0IHN0b3JlLmxhdGVzdFNlcXVlbmNlKGNoYW5uZWwpKSB8fCBjaGVja3BvaW50LnNlcXVlbmNlLFxuICAgICAgY2hlY2twb2ludFNlcXVlbmNlOiBjaGVja3BvaW50LnNlcXVlbmNlLFxuICAgICAgcmVwbGF5aW5nOiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVwbGF5IGNoYW5uZWwgZXZlbnRzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2J1ZmZlcmVkOiBib29sZWFuLCBjZWlsaW5nU2VxdWVuY2U6IG51bWJlciwgY2hlY2twb2ludFNlcXVlbmNlOiBudW1iZXIsIHJlcGxheWluZzogYm9vbGVhbn19IGFyZ3MucmVwbGF5U3RhdGUgLSBSZXBsYXkgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcmVwbGF5IGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIF9yZXBsYXlDaGFubmVsRXZlbnRzKHtjaGFubmVsLCByZXBsYXlTdGF0ZX0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcbiAgICBjb25zdCBldmVudHMgPSBhd2FpdCBzdG9yZS5nZXRFdmVudHNBZnRlcih7XG4gICAgICBjaGFubmVsLFxuICAgICAgc2VxdWVuY2U6IHJlcGxheVN0YXRlLmNoZWNrcG9pbnRTZXF1ZW5jZSxcbiAgICAgIHVwVG9TZXF1ZW5jZTogcmVwbGF5U3RhdGUuY2VpbGluZ1NlcXVlbmNlXG4gICAgfSlcblxuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRFdmVudChjaGFubmVsLCBldmVudC5wYXlsb2FkLCB7XG4gICAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICBldmVudElkOiBldmVudC5pZCxcbiAgICAgICAgcmVwbGF5ZWQ6IHRydWUsXG4gICAgICAgIHNlcXVlbmNlOiBldmVudC5zZXF1ZW5jZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5pc2ggcmVwbGF5IHN0YXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7YnVmZmVyZWQ6IGJvb2xlYW4sIGNlaWxpbmdTZXF1ZW5jZTogbnVtYmVyLCBjaGVja3BvaW50U2VxdWVuY2U6IG51bWJlciwgcmVwbGF5aW5nOiBib29sZWFufX0gcmVwbGF5U3RhdGUgLSBSZXBsYXkgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gYnVmZmVyZWQgZXZlbnRzIGFyZSBmbHVzaGVkLlxuICAgKi9cbiAgYXN5bmMgX2ZpbmlzaFJlcGxheVN0YXRlKGNoYW5uZWwsIHJlcGxheVN0YXRlKSB7XG4gICAgY29uc3Qgc3RvcmUgPSB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pXG5cbiAgICByZXBsYXlTdGF0ZS5yZXBsYXlpbmcgPSBmYWxzZVxuICAgIHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5kZWxldGUoY2hhbm5lbClcblxuICAgIGlmICghcmVwbGF5U3RhdGUuYnVmZmVyZWQpIHJldHVyblxuXG4gICAgY29uc3QgbGl2ZUV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWwsXG4gICAgICBzZXF1ZW5jZTogcmVwbGF5U3RhdGUuY2VpbGluZ1NlcXVlbmNlXG4gICAgfSlcblxuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgbGl2ZUV2ZW50cykge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kRXZlbnQoY2hhbm5lbCwgZXZlbnQucGF5bG9hZCwge1xuICAgICAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgZXZlbnRJZDogZXZlbnQuaWQsXG4gICAgICAgIHNlcXVlbmNlOiBldmVudC5zZXF1ZW5jZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvbHZlIHRlbmFudC5cbiAgICogQHBhcmFtIHt7Y2hhbm5lbD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz59fSBhcmdzIC0gVGVuYW50IHJlc29sdXRpb24gYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD59IC0gUmVzb2x2ZWQgdGVuYW50LlxuICAgKi9cbiAgYXN5bmMgX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWwsIHBhcmFtc30pIHtcbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0gdGhpcy51cGdyYWRlUmVxdWVzdD8ucGFyYW1zPy4oKVxuICAgIGNvbnN0IG1lcmdlZFBhcmFtcyA9IHtcbiAgICAgIC4uLihyZXF1ZXN0UGFyYW1zICYmIHR5cGVvZiByZXF1ZXN0UGFyYW1zID09PSBcIm9iamVjdFwiID8gcmVxdWVzdFBhcmFtcyA6IHt9KSxcbiAgICAgIC4uLihwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiA/IHBhcmFtcyA6IHt9KVxuICAgIH1cblxuICAgIHJldHVybiAvKiogQHR5cGUge1Byb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD59ICovICh0aGlzLmNvbmZpZ3VyYXRpb24ucmVzb2x2ZVRlbmFudCh7XG4gICAgICBwYXJhbXM6IG1lcmdlZFBhcmFtcyxcbiAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsXG4gICAgICByZXNwb25zZTogdW5kZWZpbmVkLFxuICAgICAgc3Vic2NyaXB0aW9uOiBjaGFubmVsID8ge2NoYW5uZWwsIHBhcmFtc30gOiB1bmRlZmluZWRcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHVubWFzayBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IG1hc2sgLSBNYXNrLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfdW5tYXNrUGF5bG9hZChwYXlsb2FkLCBtYXNrKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYXlsb2FkW2ldIF49IG1hc2tbaSAlIDRdXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIGNvbnN0IG9uT3BlbiA9IGhhbmRsZXIgPyBoYW5kbGVyLm9uT3BlbiA6IG51bGxcblxuICAgICAgaWYgKG9uT3Blbikge1xuICAgICAgICBhd2FpdCBvbk9wZW4oe3Nlc3Npb246IHRoaXN9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgb3BlbiBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcnVuIG1lc3NhZ2UgaGFuZGxlciBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gSW5jb21pbmcgd2Vic29ja2V0IG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfcnVuTWVzc2FnZUhhbmRsZXJNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIGNvbnN0IG9uTWVzc2FnZSA9IGhhbmRsZXIgPyBoYW5kbGVyLm9uTWVzc2FnZSA6IG51bGxcblxuICAgICAgaWYgKG9uTWVzc2FnZSkge1xuICAgICAgICBhd2FpdCBvbk1lc3NhZ2Uoe21lc3NhZ2UsIHNlc3Npb246IHRoaXN9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgbWVzc2FnZSBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25FcnJvciA9IGhhbmRsZXIgPyBoYW5kbGVyLm9uRXJyb3IgOiBudWxsXG5cbiAgICAgIGlmIChvbkVycm9yKSB7XG4gICAgICAgIGF3YWl0IG9uRXJyb3Ioe2Vycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksIHNlc3Npb246IHRoaXN9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9ydW5NZXNzYWdlSGFuZGxlckNsb3NlKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25DbG9zZSA9IGhhbmRsZXIgPyBoYW5kbGVyLm9uQ2xvc2UgOiBudWxsXG5cbiAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgIGF3YWl0IG9uQ2xvc2Uoe3Nlc3Npb246IHRoaXN9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgY2xvc2UgaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW90ZSBhZGRyZXNzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFJlbW90ZSBhZGRyZXNzIHJlc29sdmVkIGZyb20gdGhlIHdlYnNvY2tldCB1cGdyYWRlIHJlcXVlc3QuXG4gICAqL1xuICByZW1vdGVBZGRyZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnVwZ3JhZGVSZXF1ZXN0Py5yZW1vdGVBZGRyZXNzKCkgfHwgdGhpcy5jbGllbnQucmVtb3RlQWRkcmVzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IG1lc3NhZ2UgaGFuZGxlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLldlYnNvY2tldE1lc3NhZ2VIYW5kbGVyfSBoYW5kbGVyIC0gSGFuZGxlciBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRNZXNzYWdlSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IGhhbmRsZXJcbiAgICB2b2lkIHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpXG4gIH1cblxuICBhc3luYyBfcmVzb2x2ZU1lc3NhZ2VIYW5kbGVyUHJvbWlzZSgpIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2VcblxuICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nTWVzc2FnZUhhbmRsZXIgPSBmYWxzZVxuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgICAvLyBJbnN0YWxsIGhhbmRsZXIgYW5kIGRyYWluIG9uT3BlbiBiZWZvcmUgcmVwbGF5aW5nIHF1ZXVlZFxuICAgICAgICAvLyBtZXNzYWdlcy4gc2V0TWVzc2FnZUhhbmRsZXIoKSBmaXJlcyBvbk9wZW4gYXMgZmlyZS1hbmQtZm9yZ2V0O1xuICAgICAgICAvLyBhd2FpdGluZyBfcnVuTWVzc2FnZUhhbmRsZXJPcGVuKCkgZGlyZWN0bHkgaGVyZSBjbG9zZXMgdGhlXG4gICAgICAgIC8vIHJhY2Ugd2hlcmUgcXVldWVkIHN1YnNjcmliZS9jb25uZWN0aW9uLSogZnJhbWVzIHdvdWxkXG4gICAgICAgIC8vIGRpc3BhdGNoIHdoaWxlIGFuIGFzeW5jIG9uT3BlbiBpcyBzdGlsbCBzZXR0aW5nIHVwIHNlc3Npb25cbiAgICAgICAgLy8gc3RhdGUuXG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyXG4gICAgICAgIGF3YWl0IHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpXG4gICAgICAgIGF3YWl0IHRoaXMuX2ZsdXNoUXVldWVkTWVzc2FnZXMoe3VzZUhhbmRsZXI6IHR5cGVvZiBoYW5kbGVyLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgcmVzb2x2ZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlciA9IGZhbHNlXG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2UgPSB1bmRlZmluZWRcbiAgICBhd2FpdCB0aGlzLl9mbHVzaFF1ZXVlZE1lc3NhZ2VzKHt1c2VIYW5kbGVyOiBmYWxzZX0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmbHVzaCBxdWV1ZWQgbWVzc2FnZXMuXG4gICAqIEBwYXJhbSB7e3VzZUhhbmRsZXI6IGJvb2xlYW59fSBhcmdzIC0gQXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9mbHVzaFF1ZXVlZE1lc3NhZ2VzKHt1c2VIYW5kbGVyfSkge1xuICAgIGlmICh0aGlzLm1lc3NhZ2VRdWV1ZS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgY29uc3QgcXVldWVkID0gdGhpcy5tZXNzYWdlUXVldWUuc2xpY2UoKVxuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW11cblxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBxdWV1ZWQpIHtcbiAgICAgIGlmICh1c2VIYW5kbGVyICYmIHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLl9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
2044
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQ2hFLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sWUFBWSxNQUFNLDhCQUE4QixDQUFBO0FBQ3ZELE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBQ3ZELE9BQU8sY0FBYyxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sZ0JBQWdCLE1BQU0seUJBQXlCLENBQUE7QUFDdEQsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFDeEYsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQTtBQUVyRDs7O0dBR0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7O0dBSUc7QUFFSCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUNsQyxNQUFNLDZCQUE2QixHQUFHLEdBQUcsQ0FBQTtBQUN6QyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQTtBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTtBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUVqQyxNQUFNLGdDQUFnQyxHQUFHLElBQUksQ0FBQTtBQUM3QyxNQUFNLHNDQUFzQyxHQUFHLGtDQUFrQyxD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QUksVUFBVSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUNwRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUMzQyxDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFBO2dCQUNuRyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFO29CQUM3RCxLQUFLLEVBQUUsNEJBQTRCO2lCQUNwQyxDQUFDLENBQUE7Z0JBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO2dCQUNwRSxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUNaLEtBQUssRUFBRSxrQkFBa0I7b0JBQ3pCLElBQUksRUFBRSxPQUFPO2lCQUNkLENBQUMsQ0FBQTtZQUNKLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQy9DLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHsgZW5zdXJlRXJyb3IgfSBmcm9tIFwidHlwYW5pY1wiXG5cbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uLy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSBcIi4uLy4uL3V0aWxzL3BsYWluLW9iamVjdC5qc1wiXG5pbXBvcnQgVmVsb2Npb3VzRXJyb3IgZnJvbSBcIi4uLy4uL3ZlbG9jaW91cy1lcnJvci5qc1wiXG5pbXBvcnQgV2Vic29ja2V0Q2hhbm5lbCBmcm9tIFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIlxuaW1wb3J0IHsgd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vd2Vic29ja2V0LWV2ZW50LWxvZy1zdG9yZS5qc1wiXG5pbXBvcnQgUmVxdWVzdFJ1bm5lciBmcm9tIFwiLi9yZXF1ZXN0LXJ1bm5lci5qc1wiXG5pbXBvcnQgV2Vic29ja2V0UmVxdWVzdCBmcm9tIFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiXG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwic3Vic2NyaWJlXCIsIGNoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fSB8IHt0eXBlOiBcIm1ldGFkYXRhXCIsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCA/Pn0gfCB7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9IHwgUmVjb3JkPHN0cmluZywgPz59IFdlYnNvY2tldFNlc3Npb25NZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbmJvdW5kTWVzc2FnZUFkbWlzc2lvblxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJ5dGVMZW5ndGggLSBFeGFjdCByYXcgdGV4dCBwYXlsb2FkIGJ5dGVzIGNoYXJnZWQgdG8gdGhpcyBhZG1pc3Npb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gZ2VuZXJhdGlvbiAtIEFjY291bnRpbmcgZ2VuZXJhdGlvbiBhY3RpdmUgd2hlbiBhZG1pdHRlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVsZWFzZWQgLSBXaGV0aGVyIHRoaXMgYWRtaXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVsZWFzZWQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbmJvdW5kTWVzc2FnZVdvcmtcbiAqIEBwcm9wZXJ0eSB7SW5ib3VuZE1lc3NhZ2VBZG1pc3Npb259IGFkbWlzc2lvbiAtIEFkbWlzc2lvbiBvd25lcnNoaXAuXG4gKiBAcHJvcGVydHkge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gRGVjb2RlZCBjbGllbnQgbWVzc2FnZS5cbiAqL1xuXG5jb25zdCBXRUJTT0NLRVRfRklOQUxfRlJBTUUgPSAweDgwXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0NPTlRJTlVBVElPTiA9IDB4MFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9URVhUID0gMHgxXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0JJTkFSWSA9IDB4MlxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9DTE9TRSA9IDB4OFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9QSU5HID0gMHg5XG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1BPTkcgPSAweEFcblxuY29uc3QgV0VCU09DS0VUX0NMT1NFX1BPTElDWV9WSU9MQVRJT04gPSAxMDA4XG5jb25zdCBXRUJTT0NLRVRfSU5CT1VORF9CQUNLTE9HX0NMT1NFX1JFQVNPTiA9IFwiSW5ib3VuZCBtZXNzYWdlIGJhY2tsb2cgZXhjZWVkZWRcIlxuY29uc3QgV0VCU09DS0VUX01BWF9DTE9TRV9SRUFTT05fQllURVMgPSAxMjNcblxuLyoqIENhcCBvbiB0aGUgcGF1c2VkIG91dGJvdW5kIHF1ZXVlOyBvbGRlc3QgZnJhbWVzIGRyb3Agb24gb3ZlcmZsb3cuICovXG5jb25zdCBXRUJTT0NLRVRfUEFVU0VEX1FVRVVFX0NBUCA9IDEwMDBcblxuLyoqIENhcCBvbiB0b3RhbCBieXRlcyBidWZmZXJlZCBmb3IgYSBzaW5nbGUgZnJhZ21lbnRlZCBtZXNzYWdlLiAqL1xuY29uc3QgV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVMgPSAxNiAqIDEwMjQgKiAxMDI0XG5cbi8qKiBDYXAgb24gcGF5bG9hZCBieXRlcyBidWZmZXJlZCBmb3IgYSBzaW5nbGUgZmluYWwgZGF0YSBmcmFtZS4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfRklOQUxfRlJBTUVfQllURVMgPSBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU1xuXG5jb25zdCBXRUJTT0NLRVRfTUFYX0lOQk9VTkRfRlJBTUVfQllURVNfQklHSU5UID0gQmlnSW50KFdFQlNPQ0tFVF9NQVhfRklOQUxfRlJBTUVfQllURVMpXG5cbi8qKiBDYXAgb24gZnJhZ21lbnQgY291bnQgZm9yIGEgc2luZ2xlIGZyYWdtZW50ZWQgbWVzc2FnZS4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0ZSQUdNRU5UUyA9IDEwMjRcblxuLyoqXG4gKiBSdW5zIHN1YnNjcmliZSBtZXNzYWdlLlxuICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIFJhdyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt7dHlwZTogXCJzdWJzY3JpYmVcIiwgY2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz59IHwgbnVsbH0gLSBTdWJzY3JpYmUgbWVzc2FnZSB3aGVuIG1hdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZU1lc3NhZ2UobWVzc2FnZSkge1xuICByZXR1cm4gbWVzc2FnZS50eXBlID09PSBcInN1YnNjcmliZVwiXG4gICAgPyAvKiogQHR5cGUge3t0eXBlOiBcInN1YnNjcmliZVwiLCBjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19ICovIChtZXNzYWdlKVxuICAgIDogbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgcmVxdWVzdCBtZXNzYWdlLlxuICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIFJhdyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9IHwgbnVsbH0gLSBSZXF1ZXN0IG1lc3NhZ2Ugd2hlbiBtYXRjaGVkLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0TWVzc2FnZShtZXNzYWdlKSB7XG4gIGlmIChtZXNzYWdlLnR5cGUgJiYgbWVzc2FnZS50eXBlICE9PSBcInJlcXVlc3RcIikgcmV0dXJuIG51bGxcblxuICByZXR1cm4gLyoqIEB0eXBlIHt7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9fSAqLyAobWVzc2FnZSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gaWRlbnRpdHkgdmFsdWVzIGZyb20gYGdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyYC5cbiAqIE51bGxpc2ggdmFsdWVzIGNvbXBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciBidXQgbm90IHRvIGEgcmVhbCBpZGVudGl0eS5cbiAqIFBsYWluIG9iamVjdHMgYXJlIGNvbXBhcmVkIHZpYSBKU09OIHJvdW5kLXRyaXAgc28gYXBwcyBjYW4gcmV0dXJuIGFcbiAqIGB7dXNlcklkLCB0ZW5hbnRJZH1gLXN0eWxlIG9iamVjdCB3aXRob3V0IGJ1aWxkaW5nIHRoZWlyIG93biBlcXVhbGl0eS5cbiAqIEBwYXJhbSB7P30gYSAtIFBhdXNlZC10aW1lIGlkZW50aXR5LlxuICogQHBhcmFtIHs/fSBiIC0gUmVzdW1lLXRpbWUgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIHdoZW4gdGhlIHR3byBpZGVudGl0aWVzIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIGNhbGxlci5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdGllc01hdGNoKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgaWYgKHR5cGVvZiBhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhKSA9PT0gSlNPTi5zdHJpbmdpZnkoYilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudFdlYnNvY2tldFNlc3Npb24ge1xuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgc3Vic2NyaXB0aW9ucyA9IG5ldyBTZXQoKVxuICBjaGFubmVscyA9IG5ldyBTZXQoKVxuICBzdWJzY3JpcHRpb25IYW5kbGVycyA9IG5ldyBNYXAoKVxuICBoYW5kbGVyU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuICBjaGFubmVsVGVuYW50cyA9IG5ldyBNYXAoKVxuICBjaGFubmVsUmVwbGF5U3RhdGVzID0gbmV3IE1hcCgpXG4gIC8qKlxuICAgKiBNZXNzYWdlIHF1ZXVlLlxuICAgKiBAdHlwZSB7SW5ib3VuZE1lc3NhZ2VXb3JrW119ICovXG4gIG1lc3NhZ2VRdWV1ZSA9IFtdXG5cbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5jbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IFthcmdzLnVwZ3JhZGVSZXF1ZXN0XSAtIEluaXRpYWwgd2Vic29ja2V0IHVwZ3JhZGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLldlYnNvY2tldE1lc3NhZ2VIYW5kbGVyfSBbYXJncy5tZXNzYWdlSGFuZGxlcl0gLSBPcHRpb25hbCByYXcgbWVzc2FnZSBoYW5kbGVyLlxuICAgKiBAcGFyYW0ge1Byb21pc2U8aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlciB8IHZvaWQ+fSBbYXJncy5tZXNzYWdlSGFuZGxlclByb21pc2VdIC0gT3B0aW9uYWwgcmF3IG1lc3NhZ2UgaGFuZGxlciBwcm9taXNlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NsaWVudCwgY29uZmlndXJhdGlvbiwgdXBncmFkZVJlcXVlc3QsIG1lc3NhZ2VIYW5kbGVyLCBtZXNzYWdlSGFuZGxlclByb21pc2V9KSB7XG4gICAgLyoqIEB0eXBlIHtCdWZmZXJbXX0gKi9cbiAgICB0aGlzLl9idWZmZXJDaHVua3MgPSBbXVxuICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggPSAwXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQgPSAwXG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyA9IDBcbiAgICB0aGlzLl9idWZmZXJlZEZyYW1lQ29weUJ5dGVzID0gMFxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMudXBncmFkZVJlcXVlc3QgPSB1cGdyYWRlUmVxdWVzdFxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlclxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlID0gbWVzc2FnZUhhbmRsZXJQcm9taXNlXG4gICAgdGhpcy5wZW5kaW5nTWVzc2FnZUhhbmRsZXIgPSBCb29sZWFuKG1lc3NhZ2VIYW5kbGVyUHJvbWlzZSlcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICBjb25zdCBpbmJvdW5kUXVldWVMaW1pdHMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0SW5ib3VuZFF1ZXVlTGltaXRzKClcblxuICAgIHRoaXMuX2luYm91bmRNYXhQZW5kaW5nQnl0ZXMgPSBpbmJvdW5kUXVldWVMaW1pdHMubWF4Qnl0ZXNcbiAgICB0aGlzLl9pbmJvdW5kTWF4UGVuZGluZ01lc3NhZ2VzID0gaW5ib3VuZFF1ZXVlTGltaXRzLm1heE1lc3NhZ2VzXG4gICAgdGhpcy5faW5ib3VuZFBlbmRpbmdCeXRlcyA9IDBcbiAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ01lc3NhZ2VzID0gMFxuICAgIHRoaXMuX2luYm91bmRBY2NvdW50aW5nR2VuZXJhdGlvbiA9IDBcbiAgICB0aGlzLl9pbmJvdW5kQ2xvc2VkID0gZmFsc2VcbiAgICB0aGlzLl9pbmJvdW5kQmFja2xvZ092ZXJsb2FkZWQgPSBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICB0aGlzLl9tZXRhZGF0YSA9IHt9XG5cbiAgICAvKipcbiAgICAgKiBMb25nLWxpdmVkIHBlci1zZXNzaW9uIHN0YXRlIGJhZy4gU3RhYmxlIGFjcm9zcyByZWNvbm5lY3RzIG9uY2VcbiAgICAgKiBncmFjZS1wZXJpb2QgcmVzdW1wdGlvbiBsYW5kcyBpbiBQaGFzZSAyOyB0b2RheSBpdCBqdXN0IGxpdmVzXG4gICAgICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fVxuICAgICAqL1xuICAgIHRoaXMuZGF0YSA9IHt9XG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3dlYnNvY2tldC1jb25uZWN0aW9uLmpzXCIpLmRlZmF1bHQ+fSAqL1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gbmV3IE1hcCgpXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIHtjaGFubmVsVHlwZTogc3RyaW5nLCBzdWJzY3JpcHRpb246IGltcG9ydChcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHR9Pn0gKi9cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkIGFzc2lnbmVkIHRvIHRoaXMgc2Vzc2lvbiBvbiBmaXJzdCBjb25uZWN0LiBTZW50IHRvIHRoZVxuICAgICAqIGNsaWVudCB2aWEgYHNlc3Npb24tZXN0YWJsaXNoZWRgOyB0aGUgY2xpZW50IGVjaG9lcyBpdCBiYWNrIHZpYVxuICAgICAqIGBzZXNzaW9uLXJlc3VtZWAgYWZ0ZXIgYSBXUyBkcm9wIHRvIHJlYXR0YWNoIHRvIHRoaXMgc2Vzc2lvblxuICAgICAqIHdpdGhpbiB0aGUgZ3JhY2UgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5zZXNzaW9uSWQgPSByYW5kb21VVUlEKClcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gLSB0cnVlIGFmdGVyIGBfaGFuZGxlQ2xvc2VgIHBhdXNlcyBpbnN0ZWFkIG9mIHRlYXJpbmcgZG93bi5cbiAgICAgKi9cbiAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTw/Pn0gLSBmcmFtZXMgcHJvZHVjZWQgd2hpbGUgcGF1c2VkOyBmbHVzaGVkIG9uIHJlc3VtZS5cbiAgICAgKi9cbiAgICB0aGlzLl9vdXRib3VuZFF1ZXVlID0gW11cblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgICB0aGlzLnNvY2tldCA9IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRhaWwgb2YgYSBwZXItc2Vzc2lvbiBwcm9taXNlIGNoYWluIHRoYXQgc2VyaWFsaXplcyBtZXNzYWdlXG4gICAgICogaGFuZGxpbmcuIFByZXZlbnRzIHJhY2VzIHdoZXJlIG1lc3NhZ2UgQiByZWFkcyBgc2Vzc2lvbi5kYXRhYFxuICAgICAqIGJlZm9yZSBtZXNzYWdlIEEncyBoYW5kbGVyIGZpbmlzaGVzIHdyaXRpbmcgaXQgKGUuZy4gYVxuICAgICAqIGNvbm5lY3Rpb24tbWVzc2FnZSBzZXR0aW5nIHRoZSBsb2NhbGUgdnMuIGEgc3Vic2VxdWVudCByZXF1ZXN0XG4gICAgICogd2hvc2UgYXJvdW5kUmVxdWVzdCB3cmFwcGVyIHJlYWRzIGl0KS5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICB0aGlzLl9tZXNzYWdlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKVxuXG4gICAgLyoqXG4gICAgICogUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhdXRoIGlkZW50aXR5IGNhcHR1cmVkIGF0IHBhdXNlXG4gICAgICogdGltZSBieSBgZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXJgLiBBd2FpdGVkIGF0IHJlc3VtZVxuICAgICAqIHRpbWUgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBmcmVzaCBjYWxsZXIncyBpZGVudGl0eS4gVW5kZWZpbmVkXG4gICAgICogb24gYSBsaXZlIChub24tcGF1c2VkKSBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtQcm9taXNlPD8+IHwgdW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHRoaXMuX3Jlc3VtZUlkZW50aXR5UHJvbWlzZSA9IHVuZGVmaW5lZFxuXG4gICAgLyoqXG4gICAgICogQWNjdW11bGF0ZXMgcGF5bG9hZHMgZm9yIGEgZnJhZ21lbnRlZCB3ZWJzb2NrZXQgbWVzc2FnZSBwZXJcbiAgICAgKiBSRkMgNjQ1NS4gTm9uLW51bGwgd2hpbGUgbWlkLWZyYWdtZW50OyBjbGVhcmVkIHdoZW4gdGhlIGZyYW1lXG4gICAgICogd2l0aCBGSU49MSBjb21wbGV0ZXMgYW5kIHRoZSBtZXNzYWdlIGlzIGRpc3BhdGNoZWQuXG4gICAgICogQHR5cGUge0J1ZmZlcltdIHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBPcGNvZGUgKFRFWFQvQklOQVJZKSBjYXB0dXJlZCBmcm9tIHRoZSBmaXJzdCBmcmFtZSBvZiBhXG4gICAgICogZnJhZ21lbnRlZCBtZXNzYWdlLiBDb250aW51YXRpb24gZnJhbWVzIChvcGNvZGUgMCkgaW5oZXJpdCBpdFxuICAgICAqIGF0IHJlYXNzZW1ibHkgdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyIHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID0gbnVsbFxuXG4gICAgLyoqXG4gICAgICogUnVubmluZyBieXRlIHRvdGFsIGZvciBgX2ZyYWdtZW50ZWRQYXlsb2Fkc2AuIFVzZWQgdG8gZW5mb3JjZVxuICAgICAqIGBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU2Agc28gYSBwZWVyIGNhbm5vdFxuICAgICAqIGV4aGF1c3QgbWVtb3J5IGJ5IHN0cmVhbWluZyBub24tZmluYWwgZnJhZ21lbnRzIGluZGVmaW5pdGVseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IDBcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fd2Vic29ja2V0U2Vzc2lvbnMuYWRkKHRoaXMpXG5cbiAgICAvKipcbiAgICAgKiBIZWFydGJlYXQgbGl2ZW5lc3MgZmxhZy4gU2V0IHRydWUgb24gZXZlcnkgaW5ib3VuZCBmcmFtZVxuICAgICAqIChpbmNsdWRpbmcgdGhlIGNsaWVudCdzIGF1dG8tcG9uZykgYW5kIGNsZWFyZWQgZWFjaCB0aW1lIGEgcGluZ1xuICAgICAqIGlzIHNlbnQ7IGEgc3RpbGwtZmFsc2UgZmxhZyBhdCB0aGUgbmV4dCB0aWNrIG1lYW5zIHRoZSBzb2NrZXRcbiAgICAgKiBoYXMgZ29uZSBzaWxlbnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5faGVhcnRiZWF0QWxpdmUgPSB0cnVlXG5cbiAgICAvKipcbiAgICAgKiBQZXItc2Vzc2lvbiBoZWFydGJlYXQgaW50ZXJ2YWwgaGFuZGxlLiBTdGFydGVkIGZyb21cbiAgICAgKiBgc2VuZFNlc3Npb25Fc3RhYmxpc2hlZGAgb25jZSB0aGUgc29ja2V0IGlzIGxpdmUsIG5vdCBhdFxuICAgICAqIGNvbnN0cnVjdGlvbiwgc28gZGlyZWN0bHktY29uc3RydWN0ZWQgc2Vzc2lvbnMgaW4gdGVzdHMgZG9uJ3RcbiAgICAgKiBzcGluIHVwIGEgYmFja2dyb3VuZCB0aW1lci5cbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9oZWFydGJlYXRUaW1lciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgY2xpZW50IGl0cyBzZXNzaW9uSWQgKyBncmFjZSB3aW5kb3cuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudGAgYWZ0ZXIgdGhlIFdTIHVwZ3JhZGUgY29tcGxldGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNlbmRTZXNzaW9uRXN0YWJsaXNoZWQoKSB7XG4gICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICB0eXBlOiBcInNlc3Npb24tZXN0YWJsaXNoZWRcIixcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICBncmFjZVNlY29uZHM6IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uR3JhY2VTZWNvbmRzPy4oKSB8fCAzMDBcbiAgICB9KVxuXG4gICAgLy8gVGhlIHNvY2tldCBpcyBsaXZlIG5vdywgc28gYmVnaW4gcmVhcGluZyBpdCBpZiBpdCBnb2VzIHNpbGVudC5cbiAgICB0aGlzLl9zdGFydEhlYXJ0YmVhdCgpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsb3NlZCBjb25uZWN0aW9uIGZyb20gdGhlIHNlc3Npb24gcmVnaXN0cnkuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzV2Vic29ja2V0Q29ubmVjdGlvbi5jbG9zZSgpYCBhZnRlciBpdCBzZW5kcyB0aGUgZmluYWxcbiAgICogYGNvbm5lY3Rpb24tY2xvc2VkYCBmcmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbm5lY3Rpb25JZCAtIENsb3NlZCBjb25uZWN0aW9uIGlkZW50aWZpZXIgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkge1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gLSBDbGllbnQtcHJvdmlkZWQgbWV0YWRhdGEgKGRlZmVuc2l2ZSBjb3B5KS5cbiAgICovXG4gIGdldE1ldGFkYXRhKCkge1xuICAgIHJldHVybiB7Li4udGhpcy5fbWV0YWRhdGF9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBwYXVzZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRydWUgd2hpbGUgdGhlIHNlc3Npb24gaXMgaW4gdGhlIHBhdXNlZC9ncmFjZSByZWdpc3RyeS5cbiAgICovXG4gIGlzUGF1c2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXVzZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRTdWJzY3JpcHRpb24oY2hhbm5lbCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoY2hhbm5lbClcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3RvcEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgdGhpcy5fY2xlYXJCdWZmZXJlZEZyYW1lQ2h1bmtzKClcbiAgICB0aGlzLl9hYmFuZG9uSW5ib3VuZE1lc3NhZ2VzKClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgaXQgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9uIGRhdGEuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvbkRhdGEoZGF0YSkge1xuICAgIC8vIEFueSBpbmJvdW5kIGJ5dGVzIOKAlCBhIGRhdGEgZnJhbWUsIHRoZSBhdXRvLXBvbmcgYW5zd2VyaW5nIG91clxuICAgIC8vIGhlYXJ0YmVhdCwgb3IgYSBwYXJ0aWFsIGZyYW1lIHN0aWxsIGJlaW5nIHVwbG9hZGVkIOKAlCBwcm92ZSB0aGVcbiAgICAvLyBzb2NrZXQgaXMgYWxpdmUuIE1hcmsgaXQgaGVyZSwgYmVmb3JlIGBfcHJvY2Vzc0J1ZmZlcmAgbWF5IHJldHVyblxuICAgIC8vIGVhcmx5IHdhaXRpbmcgZm9yIHRoZSByZXN0IG9mIGFuIGluY29tcGxldGUgZnJhbWUuXG4gICAgdGhpcy5faGVhcnRiZWF0QWxpdmUgPSB0cnVlXG4gICAgaWYgKHRoaXMuX2luYm91bmRDbG9zZWQgfHwgZGF0YS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtzLnB1c2goZGF0YSlcbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzICs9IGRhdGEubGVuZ3RoXG4gICAgdGhpcy5fcHJvY2Vzc0J1ZmZlcigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHs/fSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcGFyYW0ge3tjcmVhdGVkQXQ/OiBzdHJpbmcsIGV2ZW50SWQ/OiBzdHJpbmcsIHJlcGxheWVkPzogYm9vbGVhbiwgc2VxdWVuY2U/OiBudW1iZXJ9fSBbb3B0aW9uc10gLSBFdmVudCBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHNlbmRFdmVudChjaGFubmVsLCBwYXlsb2FkLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBjaGFubmVsSGFuZGxlcnMgPSB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmdldChjaGFubmVsKVxuICAgIGNvbnN0IGhhc0NoYW5uZWxIYW5kbGVycyA9IEJvb2xlYW4oY2hhbm5lbEhhbmRsZXJzICYmIGNoYW5uZWxIYW5kbGVycy5zaXplID4gMClcbiAgICBjb25zdCByZXBsYXlTdGF0ZSA9IHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5nZXQoY2hhbm5lbClcblxuICAgIGlmIChyZXBsYXlTdGF0ZT8ucmVwbGF5aW5nICYmICFvcHRpb25zLnJlcGxheWVkKSB7XG4gICAgICByZXBsYXlTdGF0ZS5idWZmZXJlZCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5oYXNTdWJzY3JpcHRpb24oY2hhbm5lbCkgJiYgIWhhc0NoYW5uZWxIYW5kbGVycykgcmV0dXJuXG5cbiAgICBpZiAoaGFzQ2hhbm5lbEhhbmRsZXJzKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKGNoYW5uZWxIYW5kbGVycykubWFwKGFzeW5jIChoYW5kbGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlbmFudCA9IHRoaXMuY2hhbm5lbFRlbmFudHMuZ2V0KGhhbmRsZXIpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIucmVjZWl2ZWRCcm9hZGNhc3Qoe1xuICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG9wdGlvbnMuY3JlYXRlZEF0LFxuICAgICAgICAgICAgICBldmVudElkOiBvcHRpb25zLmV2ZW50SWQsXG4gICAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICAgIHJlcGxheWVkOiBvcHRpb25zLnJlcGxheWVkLFxuICAgICAgICAgICAgICBzZXF1ZW5jZTogb3B0aW9ucy5zZXF1ZW5jZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgIGNoYW5uZWwsXG4gICAgICBjcmVhdGVkQXQ6IG9wdGlvbnMuY3JlYXRlZEF0LFxuICAgICAgZXZlbnRJZDogb3B0aW9ucy5ldmVudElkLFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHJlcGxheWVkOiBvcHRpb25zLnJlcGxheWVkLFxuICAgICAgc2VxdWVuY2U6IG9wdGlvbnMuc2VxdWVuY2UsXG4gICAgICB0eXBlOiBcImV2ZW50XCJcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW5pdGlhbGl6ZSBjaGFubmVsLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZUNoYW5uZWwoKSB7XG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlKSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZXNvbHZlTWVzc2FnZUhhbmRsZXJQcm9taXNlKClcblxuICAgICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyPy4oKVxuXG4gICAgaWYgKCFyZXNvbHZlcikgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGVuYW50ID0gYXdhaXQgdGhpcy5fcmVzb2x2ZVRlbmFudCh7fSlcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlcih7XG4gICAgICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgICAgICB3ZWJzb2NrZXRTZXNzaW9uOiB0aGlzXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXJlc29sdmVkKSByZXR1cm5cblxuICAgICAgY29uc3QgY2hhbm5lbCA9IHR5cGVvZiByZXNvbHZlZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gbmV3IHJlc29sdmVkKHtjbGllbnQ6IHRoaXMuY2xpZW50LCBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsIHdlYnNvY2tldFNlc3Npb246IHRoaXN9KVxuICAgICAgICA6IHJlc29sdmVkXG5cbiAgICAgIGlmIChjaGFubmVsICYmICEoY2hhbm5lbCBpbnN0YW5jZW9mIFdlYnNvY2tldENoYW5uZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlc29sdmVkIHdlYnNvY2tldCBjaGFubmVsIG11c3QgZXh0ZW5kIFdlYnNvY2tldENoYW5uZWxcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5fcmVnaXN0ZXJDaGFubmVsKGNoYW5uZWwsIHRlbmFudClcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtY2hhbm5lbC1pbml0aWFsaXplXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBpbml0aWFsaXplIHdlYnNvY2tldCBjaGFubmVsXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGdvb2RieWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7e2NvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZ319IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNsb3NlIHN0YXR1cy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2VuZEdvb2RieWUoY2xpZW50LCB7Y29kZSwgcmVhc29uID0gXCJcIn0gPSB7fSkge1xuICAgIGxldCBwYXlsb2FkXG5cbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKDApXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlYXNvbkJ5dGVzID0gQnVmZmVyLmZyb20ocmVhc29uLCBcInV0Zi04XCIpXG5cbiAgICAgIGlmIChyZWFzb25CeXRlcy5sZW5ndGggPiBXRUJTT0NLRVRfTUFYX0NMT1NFX1JFQVNPTl9CWVRFUykge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIldlYlNvY2tldCBjbG9zZSByZWFzb24gbXVzdCBub3QgZXhjZWVkIDEyMyBVVEYtOCBieXRlc1wiKVxuICAgICAgfVxuXG4gICAgICBwYXlsb2FkID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIgKyByZWFzb25CeXRlcy5sZW5ndGgpXG4gICAgICBwYXlsb2FkLndyaXRlVUludDE2QkUoY29kZSwgMClcbiAgICAgIHJlYXNvbkJ5dGVzLmNvcHkocGF5bG9hZCwgMilcbiAgICB9XG5cbiAgICBjb25zdCBmcmFtZSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgQnVmZmVyLmZyb20oW1dFQlNPQ0tFVF9GSU5BTF9GUkFNRSB8IFdFQlNPQ0tFVF9PUENPREVfQ0xPU0UsIHBheWxvYWQubGVuZ3RoXSksXG4gICAgICBwYXlsb2FkXG4gICAgXSlcblxuICAgIGNsaWVudC5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBmcmFtZSwge3dlYnNvY2tldEZyYW1lOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgY2F1Z2h0IGRpc3BhdGNoIGVycm9yIGlzIGFuIGV4cGVjdGVkIGNsaWVudC1mbG93IGZhaWx1cmUuXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gTm9ybWFsaXplZCBkaXNwYXRjaCBlcnJvci5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBmcmFtZXdvcmsgZXJyb3IgcmVwb3J0ZXJzIHNob3VsZCBpZ25vcmUgaXQuXG4gICAqL1xuICBfZXhwZWN0ZWRDbGllbnRFcnJvcihlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikgcmV0dXJuIHRydWVcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWZWxvY2lvdXNFcnJvciAmJiBlcnJvci5zYWZlVG9FeHBvc2UpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBhbm5vdGF0ZWRFcnJvciA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7ZXJyb3JUeXBlPzogc3RyaW5nLCB2ZWxvY2lvdXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19ICovIChlcnJvcilcblxuICAgIGlmIChpc1BsYWluT2JqZWN0KGFubm90YXRlZEVycm9yLnZlbG9jaW91cykpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gdHlwZW9mIGFubm90YXRlZEVycm9yLmVycm9yVHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBhbm5vdGF0ZWRFcnJvci5lcnJvclR5cGUubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgb25lIHVuZXhwZWN0ZWQgV2ViU29ja2V0IGRpc3BhdGNoIGZhaWx1cmUgYW5kIHJldHVybnMgaXRzIG5vcm1hbGl6ZWQgRXJyb3IuXG4gICAqIEBwYXJhbSB7P30gY2F1Z2h0RXJyb3IgLSBDYXVnaHQgZGlzcGF0Y2ggZmFpbHVyZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gY29udGV4dCAtIFN0cnVjdHVyZWQgZGlzcGF0Y2ggY29udGV4dC5cbiAgICogQHJldHVybnMge0Vycm9yfSAtIE5vcm1hbGl6ZWQgZXJyb3IgZm9yIGV4aXN0aW5nIGxvZ3MgYW5kIGNsaWVudCByZXNwb25zZXMuXG4gICAqL1xuICBfcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIGNvbnRleHQpIHtcbiAgICBjb25zdCBlcnJvciA9IGVuc3VyZUVycm9yKGNhdWdodEVycm9yKVxuXG4gICAgaWYgKHRoaXMuX2V4cGVjdGVkQ2xpZW50RXJyb3IoZXJyb3IpKSByZXR1cm4gZXJyb3JcblxuICAgIGNvbnN0IGVycm9yUGF5bG9hZCA9IHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBlcnJvcixcbiAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3RcbiAgICB9XG4gICAgY29uc3QgZXJyb3JFdmVudHMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKVxuXG4gICAgZXJyb3JFdmVudHMuZW1pdChcImZyYW1ld29yay1lcnJvclwiLCBlcnJvclBheWxvYWQpXG4gICAgZXJyb3JFdmVudHMuZW1pdChcImFsbC1lcnJvclwiLCB7Li4uZXJyb3JQYXlsb2FkLCBlcnJvclR5cGU6IFwiZnJhbWV3b3JrLWVycm9yXCJ9KVxuXG4gICAgcmV0dXJuIGVycm9yXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIE1lc3NhZ2UgdGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBhZG1pc3Npb24gPSB0aGlzLl9hZG1pdEluYm91bmRNZXNzYWdlKDApXG5cbiAgICBpZiAoIWFkbWlzc2lvbikgcmV0dXJuXG4gICAgYXdhaXQgdGhpcy5faGFuZGxlTWVzc2FnZVdvcmsoe2FkbWlzc2lvbiwgbWVzc2FnZX0pXG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhbiBhZG1pdHRlZCBtZXNzYWdlIHRvIHRoZSBwZXItc2Vzc2lvbiBGSUZPIGNoYWluLlxuICAgKiBAcGFyYW0ge0luYm91bmRNZXNzYWdlV29ya30gd29yayAtIEFkbWl0dGVkIGRlY29kZWQgbWVzc2FnZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVNZXNzYWdlV29yayh3b3JrKSB7XG4gICAgLy8gU2VyaWFsaXplIHBlci1zZXNzaW9uOiBjaGFpbiBvbnRvIGBfbWVzc2FnZUNoYWluYCBzbyBtZXNzYWdlc1xuICAgIC8vIGFyZSBwcm9jZXNzZWQgb25lIGF0IGEgdGltZS4gV2l0aG91dCB0aGlzLCBmaXJlLWFuZC1mb3JnZXRcbiAgICAvLyBkaXNwYXRjaCBmcm9tIGBfcHJvY2Vzc0J1ZmZlcmAgbGV0cyBtZXNzYWdlIEIgcmVhZFxuICAgIC8vIGBzZXNzaW9uLmRhdGFgIGJlZm9yZSBBIGhhcyBmaW5pc2hlZCB3cml0aW5nIGl0LlxuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5fbWVzc2FnZUNoYWluXG4gICAgY29uc3QgbmV4dCA9IHByZXZpb3VzLnRoZW4oKCkgPT4gdGhpcy5fcnVuTWVzc2FnZVdvcmsod29yaykpXG5cbiAgICB0aGlzLl9tZXNzYWdlQ2hhaW4gPSBuZXh0LmNhdGNoKCgpID0+IHt9KVxuICAgIGF3YWl0IG5leHRcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIG9yIHRyYW5zZmVycyBvbmUgYWRtaXR0ZWQgbWVzc2FnZSB3aGlsZSByZXRhaW5pbmcgaXRzIGFjY291bnRpbmcuXG4gICAqIEBwYXJhbSB7SW5ib3VuZE1lc3NhZ2VXb3JrfSB3b3JrIC0gQWRtaXR0ZWQgZGVjb2RlZCBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBkaXNwYXRjaCBvciByZXNvbHZlci1xdWV1ZSB0cmFuc2Zlci5cbiAgICovXG4gIGFzeW5jIF9ydW5NZXNzYWdlV29yayh3b3JrKSB7XG4gICAgaWYgKHRoaXMuX2luYm91bmRDbG9zZWQpIHtcbiAgICAgIHRoaXMuX3JlbGVhc2VJbmJvdW5kQWRtaXNzaW9uKHdvcmsuYWRtaXNzaW9uKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5wdXNoKHdvcmspXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZGlzcGF0Y2hNZXNzYWdlKHdvcmsubWVzc2FnZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fcmVsZWFzZUluYm91bmRBZG1pc3Npb24od29yay5hZG1pc3Npb24pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGlzcGF0Y2ggbWVzc2FnZS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIE1lc3NhZ2UgdGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9kaXNwYXRjaE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0QXJvdW5kUmVxdWVzdD8uKClcblxuICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICBhd2FpdCB3cmFwcGVyKHRoaXMsICgpID0+IHRoaXMuX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhY3R1YWwgbWVzc2FnZSBkaXNwYXRjaCwgZXh0cmFjdGVkIHNvXG4gICAqIGBjb25maWd1cmF0aW9uLmdldFdlYnNvY2tldEFyb3VuZFJlcXVlc3QoKWAgY2FuIHdyYXAgaXQgaW4gYW55XG4gICAqIHBlci1yZXF1ZXN0IGNvbnRleHQgKEFzeW5jTG9jYWxTdG9yYWdlLCB0cmFjaW5nLCBldGMuKS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIERlY29kZWQgY2xpZW50IGZyYW1lIHRvIGRpc3BhdGNoIGJ5IG1lc3NhZ2UgdHlwZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlTWVzc2FnZUlubmVyKG1lc3NhZ2UpIHtcbiAgICAvLyBUaGUgbWVzc2FnZUhhbmRsZXIgc2hvcnQtY2lyY3VpdHMgZGVmYXVsdCByb3V0aW5nIG9ubHkgd2hlbiB0aGVcbiAgICAvLyBhcHAgYWN0dWFsbHkgZGVjbGFyZWQgYW4gYG9uTWVzc2FnZWAgaG9vay4gQXBwcyB0aGF0IG9ubHkgd2FudFxuICAgIC8vIHNlc3Npb24tbGlmZWN5Y2xlIHRyYWNraW5nIChgb25PcGVuYC9gb25DbG9zZWApIHN0aWxsIG5lZWQgdGhlXG4gICAgLy8gYnVpbHQtaW4gc3Vic2NyaWJlL2Nvbm5lY3Rpb24vY2hhbm5lbC1zdWJzY3JpYmUgcm91dGluZyBiZWxvdyxcbiAgICAvLyBvdGhlcndpc2UgZXZlcnkgaW5jb21pbmcgbWVzc2FnZSBpcyBzaWxlbnRseSBkcm9wcGVkLlxuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyICYmIHR5cGVvZiB0aGlzLm1lc3NhZ2VIYW5kbGVyLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2UobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN1YnNjcmliZVBheWxvYWQgPSBzdWJzY3JpYmVNZXNzYWdlKG1lc3NhZ2UpXG5cbiAgICBpZiAoc3Vic2NyaWJlUGF5bG9hZCkge1xuICAgICAgY29uc3Qge2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9ID0gc3Vic2NyaWJlUGF5bG9hZFxuXG4gICAgICBpZiAoIWNoYW5uZWwpIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJjaGFubmVsIGlzIHJlcXVpcmVkIGZvciBzdWJzY3JpYmVcIilcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgICAgaWYgKHJlc29sdmVyKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNoYW5uZWxTdWJzY3JpcHRpb24oe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVUb0NoYW5uZWwoY2hhbm5lbCwge2Fja25vd2xlZGdlOiB0cnVlLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJtZXRhZGF0YVwiKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YVBheWxvYWQgPSAvKiogQHR5cGUge3tkYXRhPzogUmVjb3JkPHN0cmluZywgPz59fSAqLyAobWVzc2FnZSlcblxuICAgICAgdGhpcy5fbWV0YWRhdGEgPSBtZXRhZGF0YVBheWxvYWQuZGF0YSAmJiB0eXBlb2YgbWV0YWRhdGFQYXlsb2FkLmRhdGEgPT09IFwib2JqZWN0XCIgPyB7Li4ubWV0YWRhdGFQYXlsb2FkLmRhdGF9IDoge31cblxuICAgICAgZm9yIChjb25zdCB7c3Vic2NyaXB0aW9ufSBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbi5vbk1ldGFkYXRhQ2hhbmdlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHN1YnNjcmlwdGlvbi5vbk1ldGFkYXRhQ2hhbmdlZCh0aGlzLl9tZXRhZGF0YSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwic2Vzc2lvbi1yZXN1bWVcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlU2Vzc2lvblJlc3VtZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjb25uZWN0aW9uLW9wZW5cIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ29ubmVjdGlvbk9wZW4obWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY29ubmVjdGlvbi1tZXNzYWdlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25NZXNzYWdlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNvbm5lY3Rpb24tY2xvc2VcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ29ubmVjdGlvbkNsb3NlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNoYW5uZWwtc3Vic2NyaWJlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNoYW5uZWxTdWJzY3JpYmUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY2hhbm5lbC11bnN1YnNjcmliZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDaGFubmVsVW5zdWJzY3JpYmUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgJiYgbWVzc2FnZS50eXBlICE9PSBcInJlcXVlc3RcIikge1xuICAgICAgdGhpcy5zZW5kSnNvbih7ZXJyb3I6IGBVbmtub3duIG1lc3NhZ2UgdHlwZTogJHttZXNzYWdlLnR5cGV9YCwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0gcmVxdWVzdE1lc3NhZ2UobWVzc2FnZSlcblxuICAgIGlmICghcmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7bWVzc2FnZS50eXBlfWAsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7Ym9keSwgaGVhZGVycywgaWQsIG1ldGhvZCwgcGF0aH0gPSByZXF1ZXN0UGF5bG9hZFxuXG4gICAgaWYgKCFtZXRob2QpIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJtZXRob2QgaXMgcmVxdWlyZWRcIilcbiAgICBpZiAoIXBhdGgpIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJwYXRoIGlzIHJlcXVpcmVkXCIpXG5cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFdlYnNvY2tldFJlcXVlc3Qoe1xuICAgICAgYm9keSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRhZGF0YTogdGhpcy5nZXRNZXRhZGF0YSgpLFxuICAgICAgbWV0aG9kLFxuICAgICAgcGF0aCxcbiAgICAgIHJlbW90ZUFkZHJlc3M6IHRoaXMucmVtb3RlQWRkcmVzcygpXG4gICAgfSlcbiAgICBjb25zdCByZXF1ZXN0UnVubmVyID0gbmV3IFJlcXVlc3RSdW5uZXIoe1xuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgcmVxdWVzdFxuICAgIH0pXG5cbiAgICByZXF1ZXN0UnVubmVyLmV2ZW50cy5vbihcImRvbmVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXF1ZXN0UnVubmVyLnJlc3BvbnNlXG4gICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2UuZ2V0Qm9keSgpXG4gICAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVyc1xuXG4gICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgaWQsXG4gICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKSxcbiAgICAgICAgc3RhdHVzTWVzc2FnZTogcmVzcG9uc2UuZ2V0U3RhdHVzTWVzc2FnZSgpLFxuICAgICAgICB0eXBlOiBcInJlc3BvbnNlXCJcbiAgICAgIH0pXG4gICAgICB2b2lkIHJlcXVlc3RSdW5uZXIubG9nQ29tcGxldGVkUmVxdWVzdCgpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGxvZyBjb21wbGV0ZWQgcmVxdWVzdFwiLCBlcnJvcilcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGF3YWl0IHJlcXVlc3RSdW5uZXIucnVuKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHByb2Nlc3MgYnVmZmVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfcHJvY2Vzc0J1ZmZlcigpIHtcbiAgICB3aGlsZSAodGhpcy5fYnVmZmVyZWRCeXRlcyA+PSAyKSB7XG4gICAgICBjb25zdCBpbml0aWFsSGVhZGVyID0gdGhpcy5fcGVla0J1ZmZlcmVkQnl0ZXMoMilcbiAgICAgIGNvbnN0IGZpcnN0Qnl0ZSA9IGluaXRpYWxIZWFkZXJbMF1cbiAgICAgIGNvbnN0IHNlY29uZEJ5dGUgPSBpbml0aWFsSGVhZGVyWzFdXG4gICAgICBjb25zdCBpc0ZpbmFsID0gKGZpcnN0Qnl0ZSAmIFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSkgPT09IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRVxuICAgICAgY29uc3Qgb3Bjb2RlID0gZmlyc3RCeXRlICYgMHgwRlxuICAgICAgY29uc3QgaXNNYXNrZWQgPSAoc2Vjb25kQnl0ZSAmIDB4ODApID09PSAweDgwXG4gICAgICBsZXQgcGF5bG9hZExlbmd0aCA9IHNlY29uZEJ5dGUgJiAweDdGXG4gICAgICBsZXQgb2Zmc2V0ID0gMlxuXG4gICAgICBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICAgIGlmICh0aGlzLl9idWZmZXJlZEJ5dGVzIDwgb2Zmc2V0ICsgMikgcmV0dXJuXG4gICAgICAgIHBheWxvYWRMZW5ndGggPSB0aGlzLl9wZWVrQnVmZmVyZWRCeXRlcyhvZmZzZXQgKyAyKS5yZWFkVUludDE2QkUob2Zmc2V0KVxuICAgICAgICBvZmZzZXQgKz0gMlxuICAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCBvZmZzZXQgKyA4KSByZXR1cm5cbiAgICAgICAgY29uc3QgYmlnTGVuZ3RoID0gdGhpcy5fcGVla0J1ZmZlcmVkQnl0ZXMob2Zmc2V0ICsgOCkucmVhZEJpZ1VJbnQ2NEJFKG9mZnNldClcblxuICAgICAgICBpZiAoYmlnTGVuZ3RoID4gV0VCU09DS0VUX01BWF9JTkJPVU5EX0ZSQU1FX0JZVEVTX0JJR0lOVCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW1xuICAgICAgICAgICAgXCJXZWJzb2NrZXQgZnJhbWUgZXhjZWVkZWQgYnl0ZSBjYXA7IGNsb3NpbmcgY29ubmVjdGlvblwiLFxuICAgICAgICAgICAge2ZyYW1lQnl0ZXM6IGJpZ0xlbmd0aC50b1N0cmluZygpLCBtYXhCeXRlczogV0VCU09DS0VUX01BWF9GSU5BTF9GUkFNRV9CWVRFU31cbiAgICAgICAgICBdKVxuICAgICAgICAgIHRoaXMuX2Nsb3NlRm9ySW5ib3VuZExpbWl0KClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWRMZW5ndGggPSBOdW1iZXIoYmlnTGVuZ3RoKVxuICAgICAgICBvZmZzZXQgKz0gOFxuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXNrTGVuZ3RoID0gaXNNYXNrZWQgPyA0IDogMFxuXG4gICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG9mZnNldCArIG1hc2tMZW5ndGggKyBwYXlsb2FkTGVuZ3RoXG5cbiAgICAgIGlmICh0aGlzLl9idWZmZXJlZEJ5dGVzIDwgZnJhbWVMZW5ndGgpIHJldHVyblxuXG4gICAgICBjb25zdCBmcmFtZSA9IHRoaXMuX2NvbnN1bWVCdWZmZXJlZEJ5dGVzKGZyYW1lTGVuZ3RoKVxuXG4gICAgICAvKiogQHR5cGUge0J1ZmZlcn0gKi9cbiAgICAgIGxldCBwYXlsb2FkID0gZnJhbWUuc3ViYXJyYXkob2Zmc2V0ICsgbWFza0xlbmd0aCwgZnJhbWVMZW5ndGgpXG5cbiAgICAgIGlmIChpc01hc2tlZCkge1xuICAgICAgICBjb25zdCBtYXNrID0gZnJhbWUuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBtYXNrTGVuZ3RoKVxuICAgICAgICB0aGlzLl91bm1hc2tQYXlsb2FkKHBheWxvYWQsIG1hc2spXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRyb2wgZnJhbWVzIChvcGNvZGUgPj0gMHg4KSBtdXN0IG5vdCBiZSBmcmFnbWVudGVkIHBlclxuICAgICAgLy8gUkZDIDY0NTUgYW5kIGNhbiBhcnJpdmUgaW50ZXJsZWF2ZWQgd2l0aCBhIGZyYWdtZW50ZWQgZGF0YVxuICAgICAgLy8gbWVzc2FnZS4gSGFuZGxlIHRoZW0gZmlyc3Qgd2l0aG91dCB0b3VjaGluZyB0aGUgZnJhZ21lbnRcbiAgICAgIC8vIGFjY3VtdWxhdG9yLlxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9QSU5HKSB7XG4gICAgICAgIHRoaXMuX3NlbmRDb250cm9sRnJhbWUoV0VCU09DS0VUX09QQ09ERV9QT05HLCBwYXlsb2FkKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0NMT1NFKSB7XG4gICAgICAgIHRoaXMuc2VuZEdvb2RieWUodGhpcy5jbGllbnQpXG4gICAgICAgIHRoaXMuX2hhbmRsZUNsb3NlKClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9QT05HKSB7XG4gICAgICAgIC8vIEFuc3dlciB0byBhIGhlYXJ0YmVhdCBwaW5nOyBsaXZlbmVzcyBpcyByZWNvcmRlZCBpbiBvbkRhdGEuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGNvZGUgPj0gMHg4KSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHdlYnNvY2tldCBjb250cm9sIG9wY29kZTogJHtvcGNvZGV9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gRGF0YSBmcmFtZSAoVEVYVC9CSU5BUlkvQ09OVElOVUFUSU9OKS4gUmVhc3NlbWJsZSBmcmFnbWVudHNcbiAgICAgIC8vIGJlZm9yZSBkaXNwYXRjaGluZy4gQnJvd3NlcnMgKENocm9tZSkgbGVnaXRpbWF0ZWx5IGZyYWdtZW50XG4gICAgICAvLyBsb25nZXIgY2xpZW504oaSc2VydmVyIHRleHQgZnJhbWVzOyBhIHByaW9yIHZlcnNpb24gZHJvcHBlZFxuICAgICAgLy8gZXZlcnkgZnJhZ21lbnRlZCBtZXNzYWdlIHNpbGVudGx5LCBzbyBhbnkgcGF5bG9hZCBsYXJnZVxuICAgICAgLy8gZW5vdWdoIHRvIGhpdCB0aGUgYnJvd3NlcidzIGZyYWdtZW50YXRpb24gdGhyZXNob2xkXG4gICAgICAvLyAoZS5nLiBhIGNoYW5uZWwtc3Vic2NyaWJlIHdpdGggYW4gYXV0aCB0b2tlbikgbmV2ZXIgcmVhY2hlZFxuICAgICAgLy8gdGhlIGhhbmRsZXIuXG4gICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0NPTlRJTlVBVElPTikge1xuICAgICAgICBpZiAodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID09PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlJlY2VpdmVkIGNvbnRpbnVhdGlvbiBmcmFtZSB3aXRoIG5vIGZyYWdtZW50ZWQgbWVzc2FnZSBpbiBwcm9ncmVzc1wiKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2FwcGVuZEZyYWdtZW50KHBheWxvYWQpKSByZXR1cm5cblxuICAgICAgICBpZiAoIWlzRmluYWwpIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9URVhUIHx8IG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9CSU5BUlkpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJSZWNlaXZlZCBuZXcgZGF0YSBmcmFtZSB3aGlsZSBhIGZyYWdtZW50ZWQgbWVzc2FnZSB3YXMgaW4gcHJvZ3Jlc3M7IGRpc2NhcmRpbmcgcHJpb3IgZnJhZ21lbnRzXCIpXG4gICAgICAgICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRmluYWwpIHtcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPSBbcGF5bG9hZF1cbiAgICAgICAgICB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID0gb3Bjb2RlXG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID0gcGF5bG9hZC5sZW5ndGhcblxuICAgICAgICAgIGlmICghdGhpcy5fZW5mb3JjZUZyYWdtZW50TGltaXRzKCkpIHJldHVyblxuXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVW5zdXBwb3J0ZWQgd2Vic29ja2V0IGRhdGEgb3Bjb2RlOiAke29wY29kZX1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIERlZmluZXMgZmluYWxQYXlsb2FkLlxuICAgICAgICogQHR5cGUge0J1ZmZlcn0gKi9cbiAgICAgIGxldCBmaW5hbFBheWxvYWRcbiAgICAgIC8qKlxuICAgICAgICogRGVmaW5lcyBmaW5hbE9wY29kZS5cbiAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICBsZXQgZmluYWxPcGNvZGVcblxuICAgICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyAhPT0gbnVsbCkge1xuICAgICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0NPTlRJTlVBVElPTikge1xuICAgICAgICAgIGZpbmFsUGF5bG9hZCA9IEJ1ZmZlci5jb25jYXQodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzKVxuICAgICAgICAgIGZpbmFsT3Bjb2RlID0gdGhpcy5fZnJhZ21lbnRlZE9wY29kZSA/PyBXRUJTT0NLRVRfT1BDT0RFX1RFWFRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBheWxvYWQgPSBwYXlsb2FkXG4gICAgICAgICAgZmluYWxPcGNvZGUgPSBvcGNvZGVcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmFsUGF5bG9hZCA9IHBheWxvYWRcbiAgICAgICAgZmluYWxPcGNvZGUgPSBvcGNvZGVcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsT3Bjb2RlICE9PSBXRUJTT0NLRVRfT1BDT0RFX1RFWFQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVW5zdXBwb3J0ZWQgd2Vic29ja2V0IGRhdGEgb3Bjb2RlIGFmdGVyIHJlYXNzZW1ibHk6ICR7ZmluYWxPcGNvZGV9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWRtaXNzaW9uID0gdGhpcy5fYWRtaXRJbmJvdW5kTWVzc2FnZShmaW5hbFBheWxvYWQubGVuZ3RoKVxuXG4gICAgICBpZiAoIWFkbWlzc2lvbikgcmV0dXJuXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKGZpbmFsUGF5bG9hZC50b1N0cmluZyhcInV0Zi04XCIpKVxuXG4gICAgICAgIHRoaXMuX2hhbmRsZU1lc3NhZ2VXb3JrKHthZG1pc3Npb24sIG1lc3NhZ2V9KS5jYXRjaCgoY2F1Z2h0RXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zdCBjbGllbnRFcnJvck1lc3NhZ2UgPSBjYXVnaHRFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0RXJyb3IubWVzc2FnZSA6IFN0cmluZyhjYXVnaHRFcnJvcilcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtbWVzc2FnZS1kaXNwYXRjaFwiXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgICAgIGVycm9yOiBjbGllbnRFcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fcmVsZWFzZUluYm91bmRBZG1pc3Npb24oYWRtaXNzaW9uKVxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gcGFyc2Ugd2Vic29ja2V0IG1lc3NhZ2VcIiwgZXJyb3JdKVxuICAgICAgICB0aGlzLnNlbmRKc29uKHtlcnJvcjogXCJJbnZhbGlkIHdlYnNvY2tldCBtZXNzYWdlXCIsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvcGllcyB0aGUgbGVhZGluZyBidWZmZXJlZCBieXRlcyB3aXRob3V0IGNvbnN1bWluZyB0aGVtLiBIZWFkZXJcbiAgICogaW5zcGVjdGlvbiBpcyBib3VuZGVkIHRvIHRoZSB3ZWJzb2NrZXQgaGVhZGVyIHNpemUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBieXRlQ291bnQgLSBOdW1iZXIgb2YgbGVhZGluZyBieXRlcyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIENvcGllZCBwcmVmaXguXG4gICAqL1xuICBfcGVla0J1ZmZlcmVkQnl0ZXMoYnl0ZUNvdW50KSB7XG4gICAgY29uc3QgcHJlZml4ID0gQnVmZmVyLmFsbG9jVW5zYWZlKGJ5dGVDb3VudClcbiAgICBsZXQgY29waWVkQnl0ZXMgPSAwXG4gICAgbGV0IGNodW5rT2Zmc2V0ID0gdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXRcblxuICAgIGZvciAobGV0IGNodW5rSW5kZXggPSB0aGlzLl9idWZmZXJDaHVua0luZGV4OyBjaHVua0luZGV4IDwgdGhpcy5fYnVmZmVyQ2h1bmtzLmxlbmd0aDsgY2h1bmtJbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2J1ZmZlckNodW5rc1tjaHVua0luZGV4XVxuICAgICAgY29uc3QgYnl0ZXNGcm9tQ2h1bmsgPSBNYXRoLm1pbihjaHVuay5sZW5ndGggLSBjaHVua09mZnNldCwgYnl0ZUNvdW50IC0gY29waWVkQnl0ZXMpXG5cbiAgICAgIGNodW5rLmNvcHkocHJlZml4LCBjb3BpZWRCeXRlcywgY2h1bmtPZmZzZXQsIGNodW5rT2Zmc2V0ICsgYnl0ZXNGcm9tQ2h1bmspXG4gICAgICBjb3BpZWRCeXRlcyArPSBieXRlc0Zyb21DaHVua1xuICAgICAgY2h1bmtPZmZzZXQgPSAwXG4gICAgICBpZiAoY29waWVkQnl0ZXMgPT09IGJ5dGVDb3VudCkgYnJlYWtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQ29uc3VtZXMgYSBjb21wbGV0ZSBmcmFtZSBmcm9tIHRoZSBjaHVuayBxdWV1ZSB3aXRoIG9uZSBib3VuZGVkIGNvcHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBieXRlQ291bnQgLSBDb21wbGV0ZSBmcmFtZSBieXRlIGNvdW50LlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIENvbnRpZ3VvdXMgZnJhbWUgYnl0ZXMuXG4gICAqL1xuICBfY29uc3VtZUJ1ZmZlcmVkQnl0ZXMoYnl0ZUNvdW50KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKGJ5dGVDb3VudClcbiAgICBsZXQgY29waWVkQnl0ZXMgPSAwXG5cbiAgICB3aGlsZSAoY29waWVkQnl0ZXMgPCBieXRlQ291bnQpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fYnVmZmVyQ2h1bmtzW3RoaXMuX2J1ZmZlckNodW5rSW5kZXhdXG4gICAgICBjb25zdCBieXRlc0Zyb21DaHVuayA9IE1hdGgubWluKGNodW5rLmxlbmd0aCAtIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0LCBieXRlQ291bnQgLSBjb3BpZWRCeXRlcylcblxuICAgICAgY2h1bmsuY29weShcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBjb3BpZWRCeXRlcyxcbiAgICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQsXG4gICAgICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ICsgYnl0ZXNGcm9tQ2h1bmtcbiAgICAgIClcbiAgICAgIGNvcGllZEJ5dGVzICs9IGJ5dGVzRnJvbUNodW5rXG4gICAgICB0aGlzLl9idWZmZXJDaHVua09mZnNldCArPSBieXRlc0Zyb21DaHVua1xuXG4gICAgICBpZiAodGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQgPT09IGNodW5rLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ICs9IDFcbiAgICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQgPSAwXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2J1ZmZlckNodW5rSW5kZXggPT09IHRoaXMuX2J1ZmZlckNodW5rcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rcyA9IFtdXG4gICAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ID0gMFxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ID49IDY0ICYmXG4gICAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ICogMiA+PSB0aGlzLl9idWZmZXJDaHVua3MubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aGlzLl9idWZmZXJDaHVua3MgPSB0aGlzLl9idWZmZXJDaHVua3Muc2xpY2UodGhpcy5fYnVmZmVyQ2h1bmtJbmRleClcbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggPSAwXG4gICAgfVxuXG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyAtPSBieXRlQ291bnRcbiAgICB0aGlzLl9idWZmZXJlZEZyYW1lQ29weUJ5dGVzICs9IGJ5dGVDb3VudFxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIGFsbCBpbmNvbXBsZXRlIGZyYW1lIGNodW5rcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfY2xlYXJCdWZmZXJlZEZyYW1lQ2h1bmtzKCkge1xuICAgIHRoaXMuX2J1ZmZlckNodW5rcyA9IFtdXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCA9IDBcbiAgICB0aGlzLl9idWZmZXJDaHVua09mZnNldCA9IDBcbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzID0gMFxuICB9XG5cbiAgLyoqXG4gICAqIFRlbnRhdGl2ZWx5IGFkbWl0cyBvbmUgY29tcGxldGUgdGV4dCBtZXNzYWdlIGJlZm9yZSBkZWNvZGluZyBpdC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGJ5dGVMZW5ndGggLSBFeGFjdCBjb21wbGV0ZSByYXcgdGV4dCBwYXlsb2FkIGJ5dGVzLlxuICAgKiBAcmV0dXJucyB7SW5ib3VuZE1lc3NhZ2VBZG1pc3Npb24gfCBudWxsfSAtIEFkbWlzc2lvbiBvd25lcnNoaXAsIG9yIG51bGwgYWZ0ZXIgb3ZlcmxvYWQvY2xvc2UuXG4gICAqL1xuICBfYWRtaXRJbmJvdW5kTWVzc2FnZShieXRlTGVuZ3RoKSB7XG4gICAgaWYgKHRoaXMuX2luYm91bmRDbG9zZWQpIHJldHVybiBudWxsXG5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ01lc3NhZ2VzICsgMSA+IHRoaXMuX2luYm91bmRNYXhQZW5kaW5nTWVzc2FnZXMgfHxcbiAgICAgIHRoaXMuX2luYm91bmRQZW5kaW5nQnl0ZXMgKyBieXRlTGVuZ3RoID4gdGhpcy5faW5ib3VuZE1heFBlbmRpbmdCeXRlc1xuICAgICkge1xuICAgICAgdGhpcy5fY2xvc2VGb3JJbmJvdW5kQmFja2xvZyhieXRlTGVuZ3RoKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ01lc3NhZ2VzICs9IDFcbiAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ0J5dGVzICs9IGJ5dGVMZW5ndGhcblxuICAgIHJldHVybiB7XG4gICAgICBieXRlTGVuZ3RoLFxuICAgICAgZ2VuZXJhdGlvbjogdGhpcy5faW5ib3VuZEFjY291bnRpbmdHZW5lcmF0aW9uLFxuICAgICAgcmVsZWFzZWQ6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIG9uZSBhZG1pc3Npb24gZXhhY3RseSBvbmNlLlxuICAgKiBAcGFyYW0ge0luYm91bmRNZXNzYWdlQWRtaXNzaW9ufSBhZG1pc3Npb24gLSBBZG1pc3Npb24gb3duZXJzaGlwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZWxlYXNlSW5ib3VuZEFkbWlzc2lvbihhZG1pc3Npb24pIHtcbiAgICBpZiAoYWRtaXNzaW9uLnJlbGVhc2VkKSByZXR1cm5cblxuICAgIGFkbWlzc2lvbi5yZWxlYXNlZCA9IHRydWVcbiAgICBpZiAoYWRtaXNzaW9uLmdlbmVyYXRpb24gIT09IHRoaXMuX2luYm91bmRBY2NvdW50aW5nR2VuZXJhdGlvbikgcmV0dXJuXG5cbiAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ01lc3NhZ2VzIC09IDFcbiAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ0J5dGVzIC09IGFkbWlzc2lvbi5ieXRlTGVuZ3RoXG4gIH1cblxuICAvKipcbiAgICogQWJhbmRvbnMgYWxsIGFkbWl0dGVkIGlucHV0IGFuZCBpbnZhbGlkYXRlcyBsYXRlIHNldHRsZW1lbnRzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9hYmFuZG9uSW5ib3VuZE1lc3NhZ2VzKCkge1xuICAgIHRoaXMuX2luYm91bmRDbG9zZWQgPSB0cnVlXG4gICAgdGhpcy5faW5ib3VuZEFjY291bnRpbmdHZW5lcmF0aW9uICs9IDFcbiAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ0J5dGVzID0gMFxuICAgIHRoaXMuX2luYm91bmRQZW5kaW5nTWVzc2FnZXMgPSAwXG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1hbmVudGx5IGNsb3NlcyBhIHNlc3Npb24gd2hvc2UgbmV4dCBtZXNzYWdlIGV4Y2VlZGVkIGl0cyBiYWNrbG9nIGJ1ZGdldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlamVjdGVkQnl0ZXMgLSBSYXcgcGF5bG9hZCBieXRlcyByZWplY3RlZCBhdCBhZG1pc3Npb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2Nsb3NlRm9ySW5ib3VuZEJhY2tsb2cocmVqZWN0ZWRCeXRlcykge1xuICAgIGlmICh0aGlzLl9pbmJvdW5kQmFja2xvZ092ZXJsb2FkZWQgfHwgdGhpcy5faW5ib3VuZENsb3NlZCkgcmV0dXJuXG5cbiAgICB0aGlzLl9pbmJvdW5kQmFja2xvZ092ZXJsb2FkZWQgPSB0cnVlXG4gICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXG4gICAgICBcIkluYm91bmQgd2Vic29ja2V0IG1lc3NhZ2UgYmFja2xvZyBleGNlZWRlZDsgY2xvc2luZyBjb25uZWN0aW9uXCIsXG4gICAgICB7XG4gICAgICAgIG1heEJ5dGVzOiB0aGlzLl9pbmJvdW5kTWF4UGVuZGluZ0J5dGVzLFxuICAgICAgICBtYXhNZXNzYWdlczogdGhpcy5faW5ib3VuZE1heFBlbmRpbmdNZXNzYWdlcyxcbiAgICAgICAgcGVuZGluZ0J5dGVzOiB0aGlzLl9pbmJvdW5kUGVuZGluZ0J5dGVzLFxuICAgICAgICBwZW5kaW5nTWVzc2FnZXM6IHRoaXMuX2luYm91bmRQZW5kaW5nTWVzc2FnZXMsXG4gICAgICAgIHJlamVjdGVkQnl0ZXNcbiAgICAgIH1cbiAgICBdKVxuICAgIHRoaXMuc2VuZEdvb2RieWUodGhpcy5jbGllbnQsIHtcbiAgICAgIGNvZGU6IFdFQlNPQ0tFVF9DTE9TRV9QT0xJQ1lfVklPTEFUSU9OLFxuICAgICAgcmVhc29uOiBXRUJTT0NLRVRfSU5CT1VORF9CQUNLTE9HX0NMT1NFX1JFQVNPTlxuICAgIH0pXG4gICAgdGhpcy5faGFuZGxlQ2xvc2Uoe2FsbG93UmVzdW1lOiBmYWxzZX0pXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFmdGVyIGFuIGluYm91bmQgYnVmZmVyaW5nIGxpbWl0IGFuZCByZWxlYXNlcyBhbGwgcGFyc2VyLW93bmVkIGlucHV0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9jbG9zZUZvckluYm91bmRMaW1pdCgpIHtcbiAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICB0aGlzLl9jbGVhckJ1ZmZlcmVkRnJhbWVDaHVua3MoKVxuICAgIHRoaXMuc2VuZEdvb2RieWUodGhpcy5jbGllbnQpXG4gICAgdGhpcy5faGFuZGxlQ2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjb250aW51YXRpb24tZnJhbWUgcGF5bG9hZCB0byB0aGUgaW4tcHJvZ3Jlc3NcbiAgICogZnJhZ21lbnRlZCBtZXNzYWdlLiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZnJhZ21lbnQgd2FzIGFjY2VwdGVkXG4gICAqIGFuZCBmYWxzZSB3aGVuIHRoZSBwZXItbWVzc2FnZSBjYXAgd2FzIGhpdCBhbmQgdGhlIHNvY2tldCBoYXNcbiAgICogYmVlbiBjbG9zZWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBwYXlsb2FkIC0gQ29udGludWF0aW9uLWZyYW1lIGJ5dGVzIHRvIGFwcGVuZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgZnJhZ21lbnQgd2FzIGFjY2VwdGVkLlxuICAgKi9cbiAgX2FwcGVuZEZyYWdtZW50KHBheWxvYWQpIHtcbiAgICAvLyBHdWFyZCBwdXNoaW5nIGZpcnN0IHNvIGBfZW5mb3JjZUZyYWdtZW50TGltaXRzYCBzZWVzIHRoZSBmaW5hbFxuICAgIC8vIHN0YXRlOyBvbiBvdmVyZmxvdyB0aGUgcmVzZXQgaW5zaWRlIHRoZSBlbmZvcmNlciBkcm9wcyB0aGVcbiAgICAvLyBidWZmZXJlZCBmcmFnbWVudHMuXG4gICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzPy5wdXNoKHBheWxvYWQpXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzICs9IHBheWxvYWQubGVuZ3RoXG5cbiAgICByZXR1cm4gdGhpcy5fZW5mb3JjZUZyYWdtZW50TGltaXRzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZnJhZ21lbnRlZCBtZXNzYWdlIGhhcyBub3QgZXhjZWVkZWQgdGhlIGJ5dGUgb3JcbiAgICogZnJhZ21lbnQtY291bnQgY2Fwcy4gT24gb3ZlcmZsb3csIGNsZWFycyB0aGUgYnVmZmVyLCBzZW5kcyBhXG4gICAqIGNsb3NlIGZyYW1lLCBhbmQgdGVhcnMgdGhlIHNlc3Npb24gZG93bi4gUmV0dXJucyB0cnVlIHdoZW4gdGhlXG4gICAqIGNhbGxlciBjYW4gY29udGludWUgcHJvY2Vzc2luZywgZmFsc2Ugd2hlbiB0aGUgc2Vzc2lvbiBpcyBiZWluZ1xuICAgKiBjbG9zZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgZnJhZ21lbnQgcHJvY2Vzc2luZyBtYXkgY29udGludWUuXG4gICAqL1xuICBfZW5mb3JjZUZyYWdtZW50TGltaXRzKCkge1xuICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPT09IG51bGwpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBmcmFnbWVudENvdW50ID0gdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzLmxlbmd0aFxuICAgIGNvbnN0IG92ZXJCeXRlcyA9IHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA+IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTXG4gICAgY29uc3Qgb3ZlckZyYWdtZW50cyA9IGZyYWdtZW50Q291bnQgPiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9GUkFHTUVOVFNcblxuICAgIGlmICghb3ZlckJ5dGVzICYmICFvdmVyRnJhZ21lbnRzKSByZXR1cm4gdHJ1ZVxuXG4gICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXG4gICAgICBcIkZyYWdtZW50ZWQgd2Vic29ja2V0IG1lc3NhZ2UgZXhjZWVkZWQgY2FwczsgY2xvc2luZyBjb25uZWN0aW9uXCIsXG4gICAgICB7XG4gICAgICAgIGZyYWdtZW50Qnl0ZXM6IHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyxcbiAgICAgICAgZnJhZ21lbnRDb3VudCxcbiAgICAgICAgbWF4Qnl0ZXM6IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTLFxuICAgICAgICBtYXhGcmFnbWVudHM6IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0ZSQUdNRU5UU1xuICAgICAgfVxuICAgIF0pXG5cbiAgICB0aGlzLl9jbG9zZUZvckluYm91bmRMaW1pdCgpXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc2V0IGZyYWdtZW50IGJ1ZmZlci5cbiAgICogQHJldHVybnMge3ZvaWR9ICovXG4gIF9yZXNldEZyYWdtZW50QnVmZmVyKCkge1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9IG51bGxcbiAgICB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID0gbnVsbFxuICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBlci1zZXNzaW9uIGhlYXJ0YmVhdC4gRWFjaCB0aWNrIHBpbmdzIHRoZSBjbGllbnQgYW5kXG4gICAqIHJlYXBzIHRoZSBzZXNzaW9uIGlmIHRoZSBwcmV2aW91cyBwaW5nIHdlbnQgdW5hbnN3ZXJlZCwgc28gYVxuICAgKiBoYWxmLW9wZW4gc29ja2V0IChjbGllbnQgZ29uZSB3aXRob3V0IGEgVENQIEZJTiAvIGNsb3NlIGZyYW1lKVxuICAgKiBjYW5ub3QgbGluZ2VyIGZvcmV2ZXIgaG9sZGluZyBjaGFubmVsIHN1YnNjcmlwdGlvbnMuIERpc2FibGVkIHdoZW5cbiAgICogdGhlIGNvbmZpZ3VyZWQgaW50ZXJ2YWwgaXMgMC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc3RhcnRIZWFydGJlYXQoKSB7XG4gICAgY29uc3QgaW50ZXJ2YWxTZWNvbmRzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldFNlc3Npb25IZWFydGJlYXRTZWNvbmRzKClcblxuICAgIGlmICghaW50ZXJ2YWxTZWNvbmRzIHx8IGludGVydmFsU2Vjb25kcyA8PSAwKSByZXR1cm5cblxuICAgIHRoaXMuX2hlYXJ0YmVhdFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5faGVhcnRiZWF0VGljaygpLCBpbnRlcnZhbFNlY29uZHMgKiAxMDAwKVxuXG4gICAgLy8gRG9uJ3QgbGV0IHRoZSBoZWFydGJlYXQgdGltZXIga2VlcCB0aGUgcHJvY2VzcyBhbGl2ZS5cbiAgICBpZiAodHlwZW9mIHRoaXMuX2hlYXJ0YmVhdFRpbWVyLnVucmVmID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuX2hlYXJ0YmVhdFRpbWVyLnVucmVmKClcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgaGVhcnRiZWF0IGN5Y2xlLiBSZWFwcyB0aGUgc2Vzc2lvbiB2aWEgdGhlIG5vcm1hbCBjbG9zZSBwYXRoXG4gICAqIHdoZW4gdGhlIHByZXZpb3VzIHBpbmcgd2FzIG5vdCBhbnN3ZXJlZDsgb3RoZXJ3aXNlIG1hcmtzIGl0XG4gICAqIHBlbmRpbmcgYW5kIHBpbmdzIGFnYWluLiBCcm93c2VycyBhbmQgUmVhY3QgTmF0aXZlIHNvY2tldHMgYW5zd2VyXG4gICAqIHNlcnZlciBwaW5ncyB3aXRoIGFuIGF1dG9tYXRpYyBwb25nLCB3aGljaCBsYW5kcyBpbiBgX3Byb2Nlc3NCdWZmZXJgXG4gICAqIGFuZCByZS1tYXJrcyB0aGUgc2Vzc2lvbiBhbGl2ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfaGVhcnRiZWF0VGljaygpIHtcbiAgICBpZiAodGhpcy5fcGF1c2VkIHx8ICF0aGlzLmNsaWVudD8uZXZlbnRzKSByZXR1cm5cblxuICAgIGlmICghdGhpcy5faGVhcnRiZWF0QWxpdmUpIHtcbiAgICAgIC8vIE5vIGZyYW1lIGFycml2ZWQgc2luY2UgdGhlIGxhc3QgcGluZyDigJQgdGhlIHNvY2tldCBpcyBkZWFkLlxuICAgICAgLy8gUm91dGUgdGhyb3VnaCBgX2hhbmRsZUNsb3NlYCBzbyByZXN1bWFibGUgc3RhdGUgc3RpbGwgcGF1c2VzXG4gICAgICAvLyBmb3IgdGhlIGdyYWNlIHdpbmRvdyBhbmQgZXZlcnl0aGluZyBlbHNlIGlzIHRvcm4gZG93bi5cbiAgICAgIHRoaXMuX3N0b3BIZWFydGJlYXQoKVxuICAgICAgdGhpcy5faGFuZGxlQ2xvc2UoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faGVhcnRiZWF0QWxpdmUgPSBmYWxzZVxuICAgIHRoaXMuX3NlbmRDb250cm9sRnJhbWUoV0VCU09DS0VUX09QQ09ERV9QSU5HLCBCdWZmZXIuYWxsb2MoMCkpXG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBlci1zZXNzaW9uIGhlYXJ0YmVhdCB0aW1lciwgaWYgYW55LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zdG9wSGVhcnRiZWF0KCkge1xuICAgIGlmICh0aGlzLl9oZWFydGJlYXRUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9oZWFydGJlYXRUaW1lcilcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdFRpbWVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlbmQgY29udHJvbCBmcmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9wY29kZSAtIE9wY29kZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9zZW5kQ29udHJvbEZyYW1lKG9wY29kZSwgcGF5bG9hZCkge1xuICAgIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyKVxuXG4gICAgaGVhZGVyWzBdID0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgb3Bjb2RlXG4gICAgaGVhZGVyWzFdID0gcGF5bG9hZC5sZW5ndGhcblxuICAgIHRoaXMuY2xpZW50LmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIEJ1ZmZlci5jb25jYXQoW2hlYWRlciwgcGF5bG9hZF0pLCB7d2Vic29ja2V0RnJhbWU6IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBqc29uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSAtIFJlcXVlc3QgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2VuZEpzb24oYm9keSkge1xuICAgIC8vIFdoaWxlIHBhdXNlZCAod2FpdGluZyBmb3IgYSByZXN1bWUpLCBzdGFzaCBmcmFtZXMgaW4gYW5cbiAgICAvLyBvdXRib3VuZCBxdWV1ZSBhbmQgZmx1c2ggdGhlbSBpbiBvcmRlciBvbiByZXN1bWUuIENhcHBlZCB0b1xuICAgIC8vIHByZXZlbnQgcnVuYXdheSBtZW1vcnkgdXNlIHdoaWxlIHRoZSBjbGllbnQgaXMgb2ZmbGluZS5cbiAgICBpZiAodGhpcy5fcGF1c2VkKSB7XG4gICAgICB0aGlzLl9vdXRib3VuZFF1ZXVlIHx8PSBbXVxuXG4gICAgICBpZiAodGhpcy5fb3V0Ym91bmRRdWV1ZS5sZW5ndGggPj0gV0VCU09DS0VUX1BBVVNFRF9RVUVVRV9DQVApIHtcbiAgICAgICAgLy8gRHJvcCBvbGRlc3Qgc28gdGhlIG1vc3QgcmVjZW50IGFjdGl2aXR5IHdpbnMgb24gcmVzdW1lLlxuICAgICAgICB0aGlzLl9vdXRib3VuZFF1ZXVlLnNoaWZ0KClcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb3V0Ym91bmRRdWV1ZS5wdXNoKGJvZHkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2xpZW50Py5ldmVudHMpIHJldHVyblxuXG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5mcm9tKGpzb24sIFwidXRmLThcIilcbiAgICBsZXQgaGVhZGVyXG5cbiAgICBpZiAocGF5bG9hZC5sZW5ndGggPCAxMjYpIHtcbiAgICAgIGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyKVxuICAgICAgaGVhZGVyWzFdID0gcGF5bG9hZC5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHBheWxvYWQubGVuZ3RoIDwgNjU1MzYpIHtcbiAgICAgIGhlYWRlciA9IEJ1ZmZlci5hbGxvYyg0KVxuICAgICAgaGVhZGVyWzFdID0gMTI2XG4gICAgICBoZWFkZXIud3JpdGVVSW50MTZCRShwYXlsb2FkLmxlbmd0aCwgMilcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDEwKVxuICAgICAgaGVhZGVyWzFdID0gMTI3XG4gICAgICBoZWFkZXIud3JpdGVCaWdVSW50NjRCRShCaWdJbnQocGF5bG9hZC5sZW5ndGgpLCAyKVxuICAgIH1cblxuICAgIGhlYWRlclswXSA9IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSB8IFdFQlNPQ0tFVF9PUENPREVfVEVYVFxuXG4gICAgdGhpcy5jbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBwYXlsb2FkXSksIHt3ZWJzb2NrZXRGcmFtZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogRmx1c2hlcyB0aGUgcGF1c2VkIG91dGJvdW5kIHF1ZXVlIG92ZXIgdGhlIGN1cnJlbnQgc29ja2V0LlxuICAgKiBDYWxsZWQgZHVyaW5nIHJlc3VtZSBhZnRlciBgc2Vzc2lvbi1yZXN1bWVkYCBoYXMgYmVlbiBzZW50IG9uXG4gICAqIHRoZSBORVcgc2Vzc2lvbidzIHNvY2tldCAobm90IHRoaXMgc2Vzc2lvbidzKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZmx1c2hPdXRib3VuZFF1ZXVlKCkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5fb3V0Ym91bmRRdWV1ZSB8fCBbXVxuXG4gICAgdGhpcy5fb3V0Ym91bmRRdWV1ZSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGJvZHkgb2YgcXVldWUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oYm9keSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdWJzY3JpYmUgdG8gY2hhbm5lbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2Fja25vd2xlZGdlPzogYm9vbGVhbiwgY2hhbm5lbEhhbmRsZXI/OiBpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0LCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz4sIHN1YnNjcmlwdGlvbkNoYW5uZWw/OiBzdHJpbmd9fSBbb3B0aW9uc10gLSBTdWJzY3JpYmUgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIHdhcyBhZGRlZC5cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZVRvQ2hhbm5lbChjaGFubmVsLCB7YWNrbm93bGVkZ2UgPSB0cnVlLCBjaGFubmVsSGFuZGxlciwgbGFzdEV2ZW50SWQsIHBhcmFtcywgc3Vic2NyaXB0aW9uQ2hhbm5lbH0gPSB7fSkge1xuICAgIGF3YWl0IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbikubWFya0NoYW5uZWxJbnRlcmVzdGVkKGNoYW5uZWwpXG5cbiAgICBjb25zdCByZXBsYXlTdGF0ZSA9IGF3YWl0IHRoaXMuX3ByZXBhcmVSZXBsYXlTdGF0ZSh7XG4gICAgICBjaGFubmVsLFxuICAgICAgbGFzdEV2ZW50SWQsXG4gICAgICBzdWJzY3JpcHRpb25DaGFubmVsOiBzdWJzY3JpcHRpb25DaGFubmVsIHx8IGNoYW5uZWwsXG4gICAgICBzdWJzY3JpcHRpb25QYXJhbXM6IHBhcmFtc1xuICAgIH0pXG5cbiAgICBpZiAocmVwbGF5U3RhdGUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2VcbiAgICBpZiAocmVwbGF5U3RhdGUpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5zZXQoY2hhbm5lbCwgcmVwbGF5U3RhdGUpXG4gICAgfVxuXG4gICAgdGhpcy5hZGRTdWJzY3JpcHRpb24oY2hhbm5lbClcblxuICAgIGlmIChjaGFubmVsSGFuZGxlcikge1xuICAgICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmhhcyhjaGFubmVsKSkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLnNldChjaGFubmVsLCBuZXcgU2V0KCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KGNoYW5uZWwpPy5hZGQoY2hhbm5lbEhhbmRsZXIpXG5cbiAgICAgIGlmICghdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbEhhbmRsZXIpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuc2V0KGNoYW5uZWxIYW5kbGVyLCBuZXcgU2V0KCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZ2V0KGNoYW5uZWxIYW5kbGVyKT8uYWRkKGNoYW5uZWwpXG4gICAgfVxuXG4gICAgaWYgKHJlcGxheVN0YXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZXBsYXlDaGFubmVsRXZlbnRzKHtjaGFubmVsLCByZXBsYXlTdGF0ZX0pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0aGlzLl9maW5pc2hSZXBsYXlTdGF0ZShjaGFubmVsLCByZXBsYXlTdGF0ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWNrbm93bGVkZ2UpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWwsIHR5cGU6IFwic3Vic2NyaWJlZFwifSlcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHNvY2tldCBjbG9zdXJlIGFuZCBvcHRpb25hbGx5IHJldGFpbnMgcmVzdW1hYmxlIHN0YXRlLlxuICAgKiBAcGFyYW0ge3thbGxvd1Jlc3VtZT86IGJvb2xlYW59fSBbb3B0aW9uc10gLSBDbG9zdXJlIGJlaGF2aW9yLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9oYW5kbGVDbG9zZSh7YWxsb3dSZXN1bWUgPSB0cnVlfSA9IHt9KSB7XG4gICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgdGhpcy5fY2xlYXJCdWZmZXJlZEZyYW1lQ2h1bmtzKClcbiAgICB0aGlzLl9hYmFuZG9uSW5ib3VuZE1lc3NhZ2VzKClcblxuICAgIC8vIElmIHRoZSBzZXNzaW9uIGhhcyByZXN1bWFibGUgc3RhdGUgKGxpdmUgQ29ubmVjdGlvbiBvclxuICAgIC8vIENoYW5uZWxWMiBzdWJzY3JpcHRpb24pLCBtb3ZlIGl0IGludG8gdGhlIHBhdXNlZCByZWdpc3RyeVxuICAgIC8vIGluc3RlYWQgb2YgdGVhcmluZyBkb3duOyBhIG5ldyBzb2NrZXQgcHJlc2VudGluZyB0aGUgc2Vzc2lvbklkXG4gICAgLy8gdmlhIGBzZXNzaW9uLXJlc3VtZWAgd2l0aGluIHRoZSBncmFjZSB3aW5kb3cgd2lsbCByZWF0dGFjaC5cbiAgICBjb25zdCBoYXNSZXN1bWFibGVTdGF0ZSA9IHRoaXMuX2Nvbm5lY3Rpb25zLnNpemUgPiAwIHx8IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNpemUgPiAwXG5cbiAgICBpZiAoYWxsb3dSZXN1bWUgJiYgaGFzUmVzdW1hYmxlU3RhdGUgJiYgIXRoaXMuX3BhdXNlZCkge1xuICAgICAgLy8gUGF1c2VkIHNlc3Npb25zIGhhdmUgbm8gbGl2ZSBzb2NrZXQgdG8gcGluZzsgdGhlIGdyYWNlIHRpbWVyXG4gICAgICAvLyBvd25zIHRoZWlyIGV2ZW50dWFsIHRlYXJkb3duIGZyb20gaGVyZS5cbiAgICAgIHRoaXMuX3N0b3BIZWFydGJlYXQoKVxuICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZVxuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsXG4gICAgICAvLyBLaWNrIG9mZiBhdXRoLWlkZW50aXR5IGNhcHR1cmUgZm9yIHJlc3VtZSB2ZXJpZmljYXRpb24uIFJ1bnNcbiAgICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kIOKAlCBgX2hhbmRsZVNlc3Npb25SZXN1bWVgIGF3YWl0c1xuICAgICAgLy8gYF9yZXN1bWVJZGVudGl0eVByb21pc2VgIGJlZm9yZSBjb21wYXJpbmcuIFBhdXNlIHJlZ2lzdHJhdGlvblxuICAgICAgLy8gaXMgc3luY2hyb25vdXMgc28gYSByZXN1bWUgYXJyaXZpbmcgaW1tZWRpYXRlbHkgc3RpbGwgZmluZHNcbiAgICAgIC8vIHRoZSBzZXNzaW9uLlxuICAgICAgdGhpcy5fcmVzdW1lSWRlbnRpdHlQcm9taXNlID0gdGhpcy5fY2FwdHVyZVJlc3VtZUlkZW50aXR5KClcbiAgICAgIHZvaWQgdGhpcy5fZmlyZU9uRGlzY29ubmVjdCgpXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3BhdXNlV2Vic29ja2V0U2Vzc2lvbih0aGlzKVxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIGdyYWNlIHRpbWVyIHdoZW4gdGhlIHBhdXNlZCBwZXJpb2QgZXhwaXJlcyB3aXRob3V0XG4gICAqIGEgcmVzdW1lLiBUZWFycyBkb3duIGFsbCBsaXZlIENvbm5lY3Rpb25zICsgQ2hhbm5lbCBzdWJzIGFuZFxuICAgKiBkcm9wcyB0aGUgc2Vzc2lvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZmluYWxpemVHcmFjZUV4cGlyeSgpIHtcbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICB0aGlzLl9jbGVhckJ1ZmZlcmVkRnJhbWVDaHVua3MoKVxuICAgIHRoaXMuX2FiYW5kb25JbmJvdW5kTWVzc2FnZXMoKVxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fd2Vic29ja2V0U2Vzc2lvbnMuZGVsZXRlKHRoaXMpXG4gICAgdm9pZCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlckNsb3NlKClcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbCgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNvbm5lY3Rpb25zKFwiZ3JhY2VfZXhwaXJlZFwiKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25DaGFubmVsU3Vic2NyaXB0aW9ucygpXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgY29uZmlndXJlZCBpZGVudGl0eSByZXNvbHZlciBhZ2FpbnN0IHRoaXMgc2Vzc2lvbi5cbiAgICogVGhlIHJldHVybmVkIHByb21pc2UgaXMgc3RvcmVkIGF0IHBhdXNlIHRpbWUgYW5kIGF3YWl0ZWQgYXRcbiAgICogcmVzdW1lIHRpbWUgc28gd2UgY2FuIHJlamVjdCByZXN1bWUgYXR0ZW1wdHMgZnJvbSBhIGRpZmZlcmVudFxuICAgKiBhdXRoZW50aWNhdGVkIGNhbGxlciAoc2lnbmVkIG91dCwgc3dhcHBlZCB1c2VyLCBleHBpcmVkIGNvb2tpZSkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSAtIENhcHR1cmVkIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkgZm9yIHJlc3VtZSB2YWxpZGF0aW9uLlxuICAgKi9cbiAgYXN5bmMgX2NhcHR1cmVSZXN1bWVJZGVudGl0eSgpIHtcbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uSWRlbnRpdHlSZXNvbHZlcj8uKClcblxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZXIgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlcih0aGlzKVxuICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1zZXNzaW9uLWlkZW50aXR5LXBhdXNlXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBzZXNzaW9uIGlkZW50aXR5IHJlc29sdmVyIGZhaWxlZCBhdCBwYXVzZVwiLCBlcnJvcl0pXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGBvbkRpc2Nvbm5lY3RgIG9uIGV2ZXJ5IGxpdmUgQ29ubmVjdGlvbiBhbmQgQ2hhbm5lbCBzdWIgc29cbiAgICogYXBwcyBjYW4gcGF1c2UgcGVyLWluc3RhbmNlIHdvcmsgd2hpbGUgdGhlIHNlc3Npb24gaXMgcGF1c2VkLlxuICAgKiBFcnJvcnMgYXJlIGxvZ2dlZCwgbm90IHJldGhyb3duIOKAlCBvbmUgYnJva2VuIGhhbmRsZXIgbXVzdCBub3RcbiAgICogYmxvY2sgdGhlIHJlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2ZpcmVPbkRpc2Nvbm5lY3QoKSB7XG4gICAgYXdhaXQgdGhpcy5fZmlyZUxpZmVjeWNsZUNhbGxiYWNrKFwib25EaXNjb25uZWN0XCIpXG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYG9uUmVzdW1lYCBvbiBldmVyeSBsaXZlIENvbm5lY3Rpb24gYW5kIENoYW5uZWwgc3ViIGFmdGVyXG4gICAqIGEgc3VjY2Vzc2Z1bCBgc2Vzc2lvbi1yZXN1bWVgIGhhbmRvZmYuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2ZpcmVPblJlc3VtZSgpIHtcbiAgICBhd2FpdCB0aGlzLl9maXJlTGlmZWN5Y2xlQ2FsbGJhY2soXCJvblJlc3VtZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmlyZSBsaWZlY3ljbGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7XCJvbkRpc2Nvbm5lY3RcIiB8IFwib25SZXN1bWVcIn0gY2FsbGJhY2tOYW1lIExpZmVjeWNsZSBjYWxsYmFjayB0byBmaXJlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiBldmVyeSBsaXZlIGhhbmRsZXIgaGFzIGJlZW4gYXR0ZW1wdGVkLlxuICAgKi9cbiAgYXN5bmMgX2ZpcmVMaWZlY3ljbGVDYWxsYmFjayhjYWxsYmFja05hbWUpIHtcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb25bY2FsbGJhY2tOYW1lXT8uKClcbiAgICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgICBjYWxsYmFja05hbWUsXG4gICAgICAgICAgY29ubmVjdGlvbklkOiBjb25uZWN0aW9uLmNvbm5lY3Rpb25JZCxcbiAgICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtY29ubmVjdGlvbi1saWZlY3ljbGVcIlxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgJHtjYWxsYmFja05hbWV9IGZhaWxlZCBmb3IgJHtjb25uZWN0aW9uLmNvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7c3Vic2NyaXB0aW9ufSBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3Vic2NyaXB0aW9uW2NhbGxiYWNrTmFtZV0/LigpXG4gICAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgICAgY2FsbGJhY2tOYW1lLFxuICAgICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jaGFubmVsLWxpZmVjeWNsZVwiLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiBzdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uSWRcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYCR7Y2FsbGJhY2tOYW1lfSBmYWlsZWQgZm9yIGNoYW5uZWwgc3ViICR7c3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBge3R5cGU6IFwic2Vzc2lvbi1yZXN1bWVcIn1gLiBUaGlzIHNlc3Npb24gKHRoZSBuZXdseS1cbiAgICogY3JlYXRlZCBvbmUgd2hvc2Ugc29ja2V0IGp1c3QgY29ubmVjdGVkKSB0cmFuc2ZlcnMgc3RhdGUgZnJvbVxuICAgKiB0aGUgcGF1c2VkIHNlc3Npb24gYW5kIGluc3RydWN0cyB0aGUgY2xpZW50IHZpYVxuICAgKiBgc2Vzc2lvbi1yZXN1bWVkYCBvciBgc2Vzc2lvbi1nb25lYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZSAtIFNlc3Npb24tcmVzdW1lIGZyYW1lIGNvbnRhaW5pbmcgdGhlIHBhdXNlZCBzZXNzaW9uIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZVNlc3Npb25SZXN1bWUobWVzc2FnZSkge1xuICAgIGNvbnN0IHJlc3VtZVNlc3Npb25JZCA9IG1lc3NhZ2Uuc2Vzc2lvbklkXG5cbiAgICBpZiAodHlwZW9mIHJlc3VtZVNlc3Npb25JZCAhPT0gXCJzdHJpbmdcIiB8fCAhcmVzdW1lU2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcInNlc3Npb24tZ29uZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBhdXNlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5fZmluZFBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuXG4gICAgaWYgKCFwYXVzZWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQXV0aCByZS12ZXJpZnk6IGNvbXBhcmUgdGhlIGZyZXNoIGNhbGxlcidzIGlkZW50aXR5IGFnYWluc3QgdGhlXG4gICAgLy8gb25lIGNhcHR1cmVkIGF0IHBhdXNlLiBNaXNtYXRjaCBtZWFucyBhIGRpZmZlcmVudCB1c2VyIChvciBhXG4gICAgLy8gc2lnbmVkLW91dCBzZXNzaW9uKSBpcyB0cnlpbmcgdG8gcmVjbGFpbSBzdGF0ZSB0aGF0IGlzbid0XG4gICAgLy8gdGhlaXJzIOKAlCBkZXN0cm95IHRoZSBwYXVzZWQgc2Vzc2lvbiBvdXRyaWdodC5cbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uSWRlbnRpdHlSZXNvbHZlcj8uKClcblxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgcGF1c2VkSWRlbnRpdHkgPSBhd2FpdCBwYXVzZWQuX3Jlc3VtZUlkZW50aXR5UHJvbWlzZVxuICAgICAgbGV0IGZyZXNoSWRlbnRpdHlcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZnJlc2hJZGVudGl0eSA9IGF3YWl0IHJlc29sdmVyKHRoaXMpXG4gICAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LXNlc3Npb24taWRlbnRpdHktcmVzdW1lXCJcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgc2Vzc2lvbiBpZGVudGl0eSByZXNvbHZlciBmYWlsZWQgYXQgcmVzdW1lXCIsIGVycm9yXSlcbiAgICAgICAgZnJlc2hJZGVudGl0eSA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBpZiAoIWlkZW50aXRpZXNNYXRjaChwYXVzZWRJZGVudGl0eSwgZnJlc2hJZGVudGl0eSkpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl9jbGVhclBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuICAgICAgICBwYXVzZWQuX2ZpbmFsaXplR3JhY2VFeHBpcnkoKVxuICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcInNlc3Npb24tZ29uZVwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl9jbGVhclBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuXG4gICAgLy8gVHJhbnNmZXIgcmVzdW1hYmxlIHN0YXRlIG9udG8gdGhpcyAobGl2ZSkgc2Vzc2lvbi4gVGhlIHBhdXNlZFxuICAgIC8vIHNlc3Npb24gc2hlbGwgaXMgZGlzY2FyZGVkIGFmdGVyIHRoZSB0cmFuc2Zlci5cbiAgICBmb3IgKGNvbnN0IFtjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb25dIG9mIHBhdXNlZC5fY29ubmVjdGlvbnMpIHtcbiAgICAgIGNvbm5lY3Rpb24uc2Vzc2lvbiA9IHRoaXNcbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb24pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3ViSWQsIGVudHJ5XSBvZiBwYXVzZWQuX2NoYW5uZWxTdWJzY3JpcHRpb25zKSB7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24uc2Vzc2lvbiA9IHRoaXNcbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNldChzdWJJZCwgZW50cnkpXG4gICAgfVxuXG4gICAgdGhpcy5fbWV0YWRhdGEgPSB7Li4ucGF1c2VkLl9tZXRhZGF0YX1cbiAgICB0aGlzLmRhdGEgPSBwYXVzZWQuZGF0YVxuICAgIHRoaXMuc2Vzc2lvbklkID0gcmVzdW1lU2Vzc2lvbklkXG5cbiAgICAvLyBUcmFuc2ZlciBhbnkgZnJhbWVzIHF1ZXVlZCB3aGlsZSB0aGUgcGF1c2VkIHNlc3Npb24gaGFkIG5vXG4gICAgLy8gc29ja2V0LiBUaGV5IGZsdXNoIEFGVEVSIHNlc3Npb24tcmVzdW1lZCBzbyB0aGUgY2xpZW50IGtub3dzXG4gICAgLy8gd2hpY2ggc2Vzc2lvbiB0aGV5IGJlbG9uZyB0by5cbiAgICBjb25zdCBxdWV1ZWQgPSBwYXVzZWQuX291dGJvdW5kUXVldWUgfHwgW11cblxuICAgIHBhdXNlZC5fb3V0Ym91bmRRdWV1ZSA9IFtdXG4gICAgcGF1c2VkLl9jb25uZWN0aW9ucy5jbGVhcigpXG4gICAgcGF1c2VkLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5jbGVhcigpXG4gICAgcGF1c2VkLl9wYXVzZWQgPSBmYWxzZVxuICAgIHBhdXNlZC5kZXN0cm95KClcblxuICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1yZXN1bWVkXCIsIHNlc3Npb25JZDogcmVzdW1lU2Vzc2lvbklkfSlcbiAgICBmb3IgKGNvbnN0IGJvZHkgb2YgcXVldWVkKSB0aGlzLnNlbmRKc29uKGJvZHkpXG4gICAgYXdhaXQgdGhpcy5fZmlyZU9uUmVzdW1lKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgb25DbG9zZShyZWFzb24pYCBvbiBldmVyeSBsaXZlIGFwcC1kZWZpbmVkIGNvbm5lY3Rpb24sIHRoZW5cbiAgICogZHJvcHMgdGhlbSBmcm9tIHRoZSByZWdpc3RyeS4gTm8gbmV0d29yayBmcmFtZSBpcyBzZW50IOKAlCB0aGVcbiAgICogc29ja2V0IGlzIGFscmVhZHkgZ29pbmcgYXdheS5cbiAgICogQHBhcmFtIHtcInNlc3Npb25fZGVzdHJveWVkXCIgfCBcImdyYWNlX2V4cGlyZWRcIiB8IFwiZXJyb3JcIn0gcmVhc29uIC0gUGVybWFuZW50IHRlYXJkb3duIHJlYXNvbiBwYXNzZWQgdG8gZWFjaCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF90ZWFyZG93bkNvbm5lY3Rpb25zKHJlYXNvbikge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gWy4uLnRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpXVxuXG4gICAgdGhpcy5fY29ubmVjdGlvbnMuY2xlYXIoKVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICBjb25uZWN0aW9uLl9jbG9zZWQgPSB0cnVlXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5vbkNsb3NlKHJlYXNvbilcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgICBjb25uZWN0aW9uSWQ6IGNvbm5lY3Rpb24uY29ubmVjdGlvbklkLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtY29ubmVjdGlvbi10ZWFyZG93blwiXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdGVhciBkb3duIGNvbm5lY3Rpb24gJHtjb25uZWN0aW9uLmNvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuXCJ9YCBtZXNzYWdlIOKAlCBpbnN0YW50aWF0ZXMgdGhlXG4gICAqIHJlZ2lzdGVyZWQgY29ubmVjdGlvbiBjbGFzcywgc3RvcmVzIGl0IG9uIGBfY29ubmVjdGlvbnNgLCBhbmRcbiAgICogZmlyZXMgYG9uQ29ubmVjdCgpYC4gU2VuZHMgYGNvbm5lY3Rpb24tb3BlbmVkYCBvbiBzdWNjZXNzIG9yXG4gICAqIGBjb25uZWN0aW9uLWVycm9yYCBvbiBmYWlsdXJlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ29ubmVjdGlvbi1vcGVuIGZyYW1lIG5hbWluZyB0aGUgY29ubmVjdGlvbiB0eXBlIGFuZCBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uT3BlbihtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uVHlwZSA9IG1lc3NhZ2UuY29ubmVjdGlvblR5cGVcbiAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcyB8fCB7fVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIWNvbm5lY3Rpb25JZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJlcnJvclwiLCBlcnJvcjogXCJjb25uZWN0aW9uLW9wZW4gcmVxdWlyZXMgY29ubmVjdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY29ubmVjdGlvblR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiY29ubmVjdGlvblR5cGUgaXMgcmVxdWlyZWRcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb25JZCkpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiQ29ubmVjdGlvbiBpZCBhbHJlYWR5IGluIHVzZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IENvbm5lY3Rpb25DbGFzcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDb25uZWN0aW9uQ2xhc3M/Lihjb25uZWN0aW9uVHlwZSlcblxuICAgIGlmICghQ29ubmVjdGlvbkNsYXNzKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBgVW5rbm93biBjb25uZWN0aW9uIHR5cGU6ICR7Y29ubmVjdGlvblR5cGV9YH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb25DbGFzcyh7Y29ubmVjdGlvbklkLCBwYXJhbXMsIHNlc3Npb246IHRoaXN9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25Db25uZWN0KClcbiAgICAgIH0pXG4gICAgICAvLyBSZWdpc3RlciBvbmx5IGFmdGVyIG9uQ29ubmVjdCByZXNvbHZlcyBzbyBhIGNvbm5lY3Rpb24tbWVzc2FnZVxuICAgICAgLy8gY2FuIG5ldmVyIGJlIHJvdXRlZCB0byBhIHBhcnRpYWxseSBpbml0aWFsaXplZCBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb25JZCwgY29ubmVjdGlvbilcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuZWRcIiwgY29ubmVjdGlvbklkfSlcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgY2xpZW50RXJyb3JNZXNzYWdlID0gY2F1Z2h0RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodEVycm9yLm1lc3NhZ2UgOiBcIlwiXG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgICAgY29ubmVjdGlvblR5cGUsXG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jb25uZWN0aW9uLW9wZW5cIlxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uICR7Y29ubmVjdGlvblR5cGV9OiR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IGNsaWVudEVycm9yTWVzc2FnZSB8fCBcIkZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb25cIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1tZXNzYWdlXCJ9YCBmcm9tIHRoZSBjbGllbnQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG1lc3NhZ2UgLSBDb25uZWN0aW9uLW1lc3NhZ2UgZnJhbWUgY29udGFpbmluZyB0aGUgdGFyZ2V0IGlkZW50aWZpZXIgYW5kIGJvZHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNvbm5lY3Rpb25NZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uSWQgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0eXBlb2YgY29ubmVjdGlvbklkID09PSBcInN0cmluZ1wiID8gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb25JZCkgOiBudWxsXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiVW5rbm93biBjb25uZWN0aW9uIGlkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25NZXNzYWdlKG1lc3NhZ2UuYm9keSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGNsaWVudEVycm9yTWVzc2FnZSA9IGNhdWdodEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHRFcnJvci5tZXNzYWdlIDogXCJcIlxuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBjb25uZWN0aW9uSWQsXG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jb25uZWN0aW9uLW1lc3NhZ2VcIlxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gaGFuZGxlIGNvbm5lY3Rpb24tbWVzc2FnZSBmb3IgJHtjb25uZWN0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjb25uZWN0aW9uLWVycm9yXCIsIGNvbm5lY3Rpb25JZCwgbWVzc2FnZTogY2xpZW50RXJyb3JNZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGhhbmRsZSBtZXNzYWdlXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgYHt0eXBlOiBcImNvbm5lY3Rpb24tY2xvc2VcIn1gIGZyb20gdGhlIGNsaWVudCDigJQgZmlyZXNcbiAgICogYG9uQ2xvc2UoXCJjbGllbnRfY2xvc2VcIilgIGFuZCBjb25maXJtcyB3aXRoIGBjb25uZWN0aW9uLWNsb3NlZGAuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG1lc3NhZ2UgLSBDb25uZWN0aW9uLWNsb3NlIGZyYW1lIGNvbnRhaW5pbmcgdGhlIHRhcmdldCBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uQ2xvc2UobWVzc2FnZSkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25JZCA9IG1lc3NhZ2UuY29ubmVjdGlvbklkXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHR5cGVvZiBjb25uZWN0aW9uSWQgPT09IFwic3RyaW5nXCIgPyB0aGlzLl9jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbklkKSA6IG51bGxcblxuICAgIGlmICghY29ubmVjdGlvbikgcmV0dXJuXG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUoY29ubmVjdGlvbklkKVxuICAgIC8vIE1hcmsgY2xvc2VkIGJlZm9yZSBmaXJpbmcgb25DbG9zZSBzbyBhcHAgY29kZSBob2xkaW5nIHRoZVxuICAgIC8vIGhhbmRsZSBzZWVzIGBpc0Nsb3NlZCgpID09PSB0cnVlYCBhbmQgY2FuJ3QgcmUtZW50ZXIgc2VuZE1lc3NhZ2UuXG4gICAgY29ubmVjdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25DbG9zZShcImNsaWVudF9jbG9zZVwiKVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBjb25uZWN0aW9uSWQsXG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jb25uZWN0aW9uLWNsb3NlXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHRlYXIgZG93biBjb25uZWN0aW9uICR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tY2xvc2VkXCIsIGNvbm5lY3Rpb25JZCwgcmVhc29uOiBcImNsaWVudF9jbG9zZVwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGB7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZVwifWAg4oCUIHJ1bnMgYGNhblN1YnNjcmliZSgpYCxcbiAgICogcmVnaXN0ZXJzIHdpdGggdGhlIENvbmZpZ3VyYXRpb24ncyBnbG9iYWwgcm91dGluZyByZWdpc3RyeSBvblxuICAgKiBzdWNjZXNzLCBhbmQgc2VuZHMgYGNoYW5uZWwtc3Vic2NyaWJlZGAgb3IgYGNoYW5uZWwtZXJyb3JgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ2hhbm5lbC1zdWJzY3JpYmUgZnJhbWUgZGVzY3JpYmluZyB0aGUgcmVxdWVzdGVkIHN1YnNjcmlwdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ2hhbm5lbFN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG4gICAgY29uc3QgY2hhbm5lbFR5cGUgPSBtZXNzYWdlLmNoYW5uZWxUeXBlXG4gICAgY29uc3QgcGFyYW1zID0gbWVzc2FnZS5wYXJhbXMgfHwge31cbiAgICBjb25zdCBsYXN0RXZlbnRJZCA9IG1lc3NhZ2UubGFzdEV2ZW50SWRcblxuICAgIGlmICh0eXBlb2Ygc3Vic2NyaXB0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIXN1YnNjcmlwdGlvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImVycm9yXCIsIGVycm9yOiBcImNoYW5uZWwtc3Vic2NyaWJlIHJlcXVpcmVzIHN1YnNjcmlwdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGFubmVsVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY2hhbm5lbFR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogXCJjaGFubmVsVHlwZSBpcyByZXF1aXJlZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5oYXMoc3Vic2NyaXB0aW9uSWQpKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIGlkIGFscmVhZHkgaW4gdXNlXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgQ2hhbm5lbENsYXNzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxDbGFzcz8uKGNoYW5uZWxUeXBlKVxuXG4gICAgaWYgKCFDaGFubmVsQ2xhc3MpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogYFVua25vd24gY2hhbm5lbCB0eXBlOiAke2NoYW5uZWxUeXBlfWB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV3IENoYW5uZWxDbGFzcyh7c3Vic2NyaXB0aW9uSWQsIHBhcmFtcywgc2Vzc2lvbjogdGhpc30pXG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzb2x2aW5nIHRoZSB0ZW5hbnQgY2FuIHJ1biBkYXRhYmFzZSBxdWVyaWVzIChlLmcuIGxvb2tpbmcgdXAgdGhlXG4gICAgICAvLyByZWNvcmQncyBwcm9qZWN0IGFuZCB0aGUgY2FsbGVyJ3MgYWNjZXNzKSwgc28gaXQgbXVzdCBoYXBwZW4gaW5zaWRlIGFcbiAgICAgIC8vIGNvbm5lY3Rpb24gc2NvcGUuIFdpdGhvdXQgdGhpcyB0aGUgcmVzb2x2ZXIgYm9ycm93cyBhIGNvbm5lY3Rpb24gdGhhdFxuICAgICAgLy8gaXMgY2hlY2tlZCBiYWNrIGluIGJlZm9yZS93aGlsZSBpdCBxdWVyaWVzLCBpbnRlcm1pdHRlbnRseSBzdXJmYWNpbmcgYXNcbiAgICAgIC8vIFwiQ29ubmVjdGlvbiDigKYgZG9lc24ndCBleGlzdCBhbnkgbW9yZVwiIG9yIGEgZmFsc2VseSB1bmF1dGhvcml6ZWRcbiAgICAgIC8vIHN1YnNjcmlwdGlvbi5cbiAgICAgIGxldCB0ZW5hbnRcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBwYXJhbXN9KVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhbGxvd2VkID0gZmFsc2VcblxuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGFsbG93ZWQgPSBCb29sZWFuKGF3YWl0IHN1YnNjcmlwdGlvbi5jYW5TdWJzY3JpYmUoKSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIG5vdCBhdXRob3JpemVkXCJ9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YnNjcmlwdGlvbklkLCB7Y2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbn0pXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fcmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG5cbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkKCkpXG5cbiAgICAgICAgLy8gUmVwbGF5IG1pc3NlZCBldmVudHMgQkVGT1JFIHNlbmRpbmcgY2hhbm5lbC1zdWJzY3JpYmVkIHNvXG4gICAgICAgIC8vIHRoZSBjbGllbnQga25vd3M6IGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBjb25maXJtYXRpb24gaXNcbiAgICAgICAgLy8gcmVwbGF5ZWQsIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXMgbGl2ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0RXZlbnRJZCA9PT0gXCJzdHJpbmdcIiAmJiBsYXN0RXZlbnRJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVwbGF5Q2hhbm5lbEV2ZW50c0ZvclN1YnNjcmlwdGlvbih7Y2hhbm5lbFR5cGUsIGxhc3RFdmVudElkLCBzdWJzY3JpcHRpb259KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZWRcIiwgc3Vic2NyaXB0aW9uSWR9KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgY2xpZW50RXJyb3JNZXNzYWdlID0gY2F1Z2h0RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodEVycm9yLm1lc3NhZ2UgOiBcIlwiXG5cbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25JZClcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fdW5yZWdpc3RlcldlYnNvY2tldENoYW5uZWxTdWJzY3JpcHRpb24oY2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbilcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgY2hhbm5lbFR5cGUsXG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jaGFubmVsLXN1YnNjcmliZVwiLFxuICAgICAgICBzdWJzY3JpcHRpb25JZFxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gc3Vic2NyaWJlIGNoYW5uZWwgJHtjaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IGNsaWVudEVycm9yTWVzc2FnZSB8fCBcIkZhaWxlZCB0byBzdWJzY3JpYmVcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgbWlzc2VkIGV2ZW50cyBmcm9tIHRoZSBwZXJzaXN0ZW50IGV2ZW50LWxvZyBzdG9yZSBmb3IgYVxuICAgKiBjaGFubmVsIHN1YnNjcmlwdGlvbiB0aGF0IHByb3ZpZGVkIGBsYXN0RXZlbnRJZGAuIFNlbmRzIGVhY2hcbiAgICogbWlzc2VkIGV2ZW50IGFzIGEgYGNoYW5uZWwtbWVzc2FnZWAgd2l0aCBgcmVwbGF5ZWQ6IHRydWVgLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWxUeXBlIC0gQ2hhbm5lbCB0eXBlIG5hbWUgKGV2ZW50LWxvZyBrZXkpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYXN0RXZlbnRJZCAtIENsaWVudCdzIGxhc3Qtc2VlbiBldmVudCBpZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0fSBhcmdzLnN1YnNjcmlwdGlvbiAtIExpdmUgc3Vic2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9yZXBsYXlDaGFubmVsRXZlbnRzRm9yU3Vic2NyaXB0aW9uKHtjaGFubmVsVHlwZSwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbn0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5hd2FpdFBlbmRpbmdCcm9hZGNhc3RzKClcblxuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSBhd2FpdCBzdG9yZS5nZXRFdmVudEJ5SWQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBpZDogbGFzdEV2ZW50SWR9KVxuXG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgdHlwZTogXCJjaGFubmVsLXJlcGxheS1nYXBcIixcbiAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgbGFzdEV2ZW50SWRcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjZWlsaW5nID0gYXdhaXQgc3RvcmUubGF0ZXN0U2VxdWVuY2UoY2hhbm5lbFR5cGUpXG5cbiAgICBpZiAoIWNlaWxpbmcgfHwgY2VpbGluZyA8PSBjaGVja3BvaW50LnNlcXVlbmNlKSByZXR1cm5cblxuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWw6IGNoYW5uZWxUeXBlLFxuICAgICAgc2VxdWVuY2U6IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICB1cFRvU2VxdWVuY2U6IGNlaWxpbmdcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24uaXNDbG9zZWQoKSkgYnJlYWtcblxuICAgICAgc3Vic2NyaXB0aW9uLnNlbmRNZXNzYWdlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSAqLyAoZXZlbnQucGF5bG9hZCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcImNoYW5uZWwtdW5zdWJzY3JpYmVcIn1gIGZyb20gdGhlIGNsaWVudCDigJQgY2FsbHNcbiAgICogYHVuc3Vic2NyaWJlZCgpYCBhbmQgc2VuZHMgYGNoYW5uZWwtdW5zdWJzY3JpYmVkYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZSAtIENoYW5uZWwtdW5zdWJzY3JpYmUgZnJhbWUgY29udGFpbmluZyB0aGUgc3Vic2NyaXB0aW9uIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNoYW5uZWxVbnN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG5cbiAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbklkICE9PSBcInN0cmluZ1wiKSByZXR1cm5cblxuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbklkKVxuXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uSWQpXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihlbnRyeS5jaGFubmVsVHlwZSwgZW50cnkuc3Vic2NyaXB0aW9uKVxuICAgIGVudHJ5LnN1YnNjcmlwdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiBhd2FpdCBlbnRyeS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmVkKCkpXG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgY2hhbm5lbFR5cGU6IGVudHJ5LmNoYW5uZWxUeXBlLFxuICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtY2hhbm5lbC11bnN1YnNjcmliZVwiLFxuICAgICAgICBzdWJzY3JpcHRpb25JZFxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdW5zdWJzY3JpYmUgY2hhbm5lbCAke2VudHJ5LmNoYW5uZWxUeXBlfToke3N1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtdW5zdWJzY3JpYmVkXCIsIHN1YnNjcmlwdGlvbklkfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgdW5zdWJzY3JpYmVkKClgIG9uIGV2ZXJ5IGxpdmUgY2hhbm5lbC12MiBzdWJzY3JpcHRpb24sXG4gICAqIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBDb25maWd1cmF0aW9uJ3MgZ2xvYmFsIHJlZ2lzdHJ5LCBhbmRcbiAgICogZHJvcHMgdGhlIHNlc3Npb24ncyBvd24gbWFwLiBObyBuZXR3b3JrIGZyYW1lcyDigJQgdGhlIHNvY2tldFxuICAgKiBpcyBhbHJlYWR5IGdvaW5nIGF3YXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKSB7XG4gICAgY29uc3QgZW50cmllcyA9IFsuLi50aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKV1cblxuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmNsZWFyKClcblxuICAgIGZvciAoY29uc3Qge2NoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb259IG9mIGVudHJpZXMpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fdW5yZWdpc3RlcldlYnNvY2tldENoYW5uZWxTdWJzY3JpcHRpb24oY2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbilcbiAgICAgIHN1YnNjcmlwdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4gYXdhaXQgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlZCgpKVxuICAgICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICAgIGNoYW5uZWxUeXBlLFxuICAgICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jaGFubmVsLXRlYXJkb3duXCIsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZFxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHRlYXIgZG93biBjaGFubmVsLXYyICR7Y2hhbm5lbFR5cGV9OiR7c3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBfdGVhcmRvd25DaGFubmVsKCkge1xuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiB0aGlzLmNoYW5uZWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZWFyZG93blNpbmdsZUNoYW5uZWwoY2hhbm5lbClcbiAgICB9XG4gICAgdGhpcy5jaGFubmVscy5jbGVhcigpXG4gICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRlYXJkb3duIHNpbmdsZSBjaGFubmVsLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldENoYW5uZWx9IGNoYW5uZWwgLSBDaGFubmVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duU2luZ2xlQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IHRoaXMuY2hhbm5lbFRlbmFudHMuZ2V0KGNoYW5uZWwpXG5cbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGNoYW5uZWw/LnVuc3Vic2NyaWJlZD8uKClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LWNoYW5uZWwtdGVhcmRvd25cIlxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiRmFpbGVkIHRvIHRlYXJkb3duIHdlYnNvY2tldCBjaGFubmVsXCIsIGVycm9yXSlcbiAgICB9XG5cbiAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5nZXQoY2hhbm5lbClcblxuICAgIGlmIChzdWJzY3JpcHRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbkNoYW5uZWwgb2Ygc3Vic2NyaXB0aW9ucykge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmdldChzdWJzY3JpcHRpb25DaGFubmVsKT8uZGVsZXRlKGNoYW5uZWwpXG5cbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KHN1YnNjcmlwdGlvbkNoYW5uZWwpPy5zaXplID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5kZWxldGUoc3Vic2NyaXB0aW9uQ2hhbm5lbClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmhhbmRsZXJTdWJzY3JpcHRpb25zLmRlbGV0ZShjaGFubmVsKVxuICAgIH1cblxuICAgIHRoaXMuY2hhbm5lbFRlbmFudHMuZGVsZXRlKGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWdpc3RlciBjaGFubmVsLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldENoYW5uZWwgfCB1bmRlZmluZWR9IGNoYW5uZWwgLSBDaGFubmVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHRlbmFudCAtIFRlbmFudCBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfcmVnaXN0ZXJDaGFubmVsKGNoYW5uZWwsIHRlbmFudCkge1xuICAgIGlmICghY2hhbm5lbCkgcmV0dXJuXG5cbiAgICB0aGlzLmNoYW5uZWxzLmFkZChjaGFubmVsKVxuICAgIHRoaXMuY2hhbm5lbFRlbmFudHMuc2V0KGNoYW5uZWwsIHRlbmFudClcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNoYW5uZWw/LnN1YnNjcmliZWQ/LigpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aXRoIGNvbm5lY3Rpb25zLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8dm9pZD59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfd2l0aENvbm5lY3Rpb25zKGNhbGxiYWNrKSB7XG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBcIldlYnNvY2tldCBzZXNzaW9uXCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBjYWxsYmFjaygpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhbmRsZSBjaGFubmVsIHN1YnNjcmlwdGlvbi5cbiAgICogQHBhcmFtIHt7Y2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz59fSBhcmdzIC0gU3Vic2NyaXB0aW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ2hhbm5lbFN1YnNjcmlwdGlvbih7Y2hhbm5lbCwgbGFzdEV2ZW50SWQsIHBhcmFtc30pIHtcbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXI/LigpXG5cbiAgICBpZiAoIXJlc29sdmVyKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICAvLyBUZW5hbnQgcmVzb2x1dGlvbiBjYW4gcnVuIGRhdGFiYXNlIHF1ZXJpZXMsIHNvIGl0IG11c3QgaGFwcGVuIGluc2lkZSBhXG4gICAgICAvLyBjb25uZWN0aW9uIHNjb3BlIChzZWUgX2hhbmRsZUNoYW5uZWxTdWJzY3JpYmUpLlxuICAgICAgbGV0IHRlbmFudFxuICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGVuYW50ID0gYXdhaXQgdGhpcy5fcmVzb2x2ZVRlbmFudCh7Y2hhbm5lbCwgcGFyYW1zfSlcbiAgICAgIH0pXG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIoe1xuICAgICAgICAgIGNsaWVudDogdGhpcy5jbGllbnQsXG4gICAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiB7Y2hhbm5lbCwgcGFyYW1zfSxcbiAgICAgICAgICB3ZWJzb2NrZXRTZXNzaW9uOiB0aGlzXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXJlc29sdmVkKSB7XG4gICAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWwsIGVycm9yOiBcIlN1YnNjcmlwdGlvbiByZWplY3RlZFwiLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhbm5lbEluc3RhbmNlID0gdHlwZW9mIHJlc29sdmVkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBuZXcgcmVzb2x2ZWQoe1xuICAgICAgICAgIGNsaWVudDogdGhpcy5jbGllbnQsXG4gICAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgIGxhc3RFdmVudElkLFxuICAgICAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uQ2hhbm5lbDogY2hhbm5lbCxcbiAgICAgICAgICBzdWJzY3JpcHRpb25QYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICB3ZWJzb2NrZXRTZXNzaW9uOiB0aGlzXG4gICAgICAgIH0pXG4gICAgICAgIDogcmVzb2x2ZWRcblxuICAgICAgaWYgKGNoYW5uZWxJbnN0YW5jZSAmJiAhKGNoYW5uZWxJbnN0YW5jZSBpbnN0YW5jZW9mIFdlYnNvY2tldENoYW5uZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlc29sdmVkIHdlYnNvY2tldCBjaGFubmVsIG11c3QgZXh0ZW5kIFdlYnNvY2tldENoYW5uZWxcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5fcmVnaXN0ZXJDaGFubmVsKGNoYW5uZWxJbnN0YW5jZSwgdGVuYW50KVxuICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jaGFubmVsLXN1YnNjcmlwdGlvblwiXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCgpID0+IFtcIldlYnNvY2tldCBjaGFubmVsIHN1YnNjcmlwdGlvbiBmYWlsZWRcIiwgZXJyb3JdKVxuICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbCwgZXJyb3I6IFwiU3Vic2NyaXB0aW9uIHJlamVjdGVkXCIsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcHJlcGFyZSByZXBsYXkgc3RhdGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIEludGVybmFsIGNoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGFyZ3MubGFzdEV2ZW50SWQgLSBMYXN0IHJlY2VpdmVkIGV2ZW50IGlkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdWJzY3JpcHRpb25DaGFubmVsIC0gQ2xpZW50LWZhY2luZyBjaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz4gfCB1bmRlZmluZWR9IGFyZ3Muc3Vic2NyaXB0aW9uUGFyYW1zIC0gQ2xpZW50LWZhY2luZyBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGZhbHNlIHwge2J1ZmZlcmVkOiBib29sZWFuLCBjZWlsaW5nU2VxdWVuY2U6IG51bWJlciwgY2hlY2twb2ludFNlcXVlbmNlOiBudW1iZXIsIHJlcGxheWluZzogYm9vbGVhbn0gfCBudWxsPn0gLSBSZXBsYXkgc3RhdGUuXG4gICAqL1xuICBhc3luYyBfcHJlcGFyZVJlcGxheVN0YXRlKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgc3Vic2NyaXB0aW9uQ2hhbm5lbCwgc3Vic2NyaXB0aW9uUGFyYW1zfSkge1xuICAgIGlmICghbGFzdEV2ZW50SWQpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcbiAgICBjb25zdCBjaGVja3BvaW50ID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRCeUlkKHtjaGFubmVsLCBpZDogbGFzdEV2ZW50SWR9KVxuXG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsOiBzdWJzY3JpcHRpb25DaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zOiBzdWJzY3JpcHRpb25QYXJhbXMsIHR5cGU6IFwicmVwbGF5LWdhcFwifSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBidWZmZXJlZDogZmFsc2UsXG4gICAgICBjZWlsaW5nU2VxdWVuY2U6IChhd2FpdCBzdG9yZS5sYXRlc3RTZXF1ZW5jZShjaGFubmVsKSkgfHwgY2hlY2twb2ludC5zZXF1ZW5jZSxcbiAgICAgIGNoZWNrcG9pbnRTZXF1ZW5jZTogY2hlY2twb2ludC5zZXF1ZW5jZSxcbiAgICAgIHJlcGxheWluZzogdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlcGxheSBjaGFubmVsIGV2ZW50cy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tidWZmZXJlZDogYm9vbGVhbiwgY2VpbGluZ1NlcXVlbmNlOiBudW1iZXIsIGNoZWNrcG9pbnRTZXF1ZW5jZTogbnVtYmVyLCByZXBsYXlpbmc6IGJvb2xlYW59fSBhcmdzLnJlcGxheVN0YXRlIC0gUmVwbGF5IHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHJlcGxheSBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBfcmVwbGF5Q2hhbm5lbEV2ZW50cyh7Y2hhbm5lbCwgcmVwbGF5U3RhdGV9KSB7XG4gICAgY29uc3Qgc3RvcmUgPSB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgZXZlbnRzID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRzQWZ0ZXIoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIHNlcXVlbmNlOiByZXBsYXlTdGF0ZS5jaGVja3BvaW50U2VxdWVuY2UsXG4gICAgICB1cFRvU2VxdWVuY2U6IHJlcGxheVN0YXRlLmNlaWxpbmdTZXF1ZW5jZVxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kRXZlbnQoY2hhbm5lbCwgZXZlbnQucGF5bG9hZCwge1xuICAgICAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgZXZlbnRJZDogZXZlbnQuaWQsXG4gICAgICAgIHJlcGxheWVkOiB0cnVlLFxuICAgICAgICBzZXF1ZW5jZTogZXZlbnQuc2VxdWVuY2VcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluaXNoIHJlcGxheSBzdGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2J1ZmZlcmVkOiBib29sZWFuLCBjZWlsaW5nU2VxdWVuY2U6IG51bWJlciwgY2hlY2twb2ludFNlcXVlbmNlOiBudW1iZXIsIHJlcGxheWluZzogYm9vbGVhbn19IHJlcGxheVN0YXRlIC0gUmVwbGF5IHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGJ1ZmZlcmVkIGV2ZW50cyBhcmUgZmx1c2hlZC5cbiAgICovXG4gIGFzeW5jIF9maW5pc2hSZXBsYXlTdGF0ZShjaGFubmVsLCByZXBsYXlTdGF0ZSkge1xuICAgIGNvbnN0IHN0b3JlID0gd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKVxuXG4gICAgcmVwbGF5U3RhdGUucmVwbGF5aW5nID0gZmFsc2VcbiAgICB0aGlzLmNoYW5uZWxSZXBsYXlTdGF0ZXMuZGVsZXRlKGNoYW5uZWwpXG5cbiAgICBpZiAoIXJlcGxheVN0YXRlLmJ1ZmZlcmVkKSByZXR1cm5cblxuICAgIGNvbnN0IGxpdmVFdmVudHMgPSBhd2FpdCBzdG9yZS5nZXRFdmVudHNBZnRlcih7XG4gICAgICBjaGFubmVsLFxuICAgICAgc2VxdWVuY2U6IHJlcGxheVN0YXRlLmNlaWxpbmdTZXF1ZW5jZVxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGxpdmVFdmVudHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEV2ZW50KGNoYW5uZWwsIGV2ZW50LnBheWxvYWQsIHtcbiAgICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmlkLFxuICAgICAgICBzZXF1ZW5jZTogZXZlbnQuc2VxdWVuY2VcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb2x2ZSB0ZW5hbnQuXG4gICAqIEBwYXJhbSB7e2NoYW5uZWw/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fX0gYXJncyAtIFRlbmFudCByZXNvbHV0aW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+fSAtIFJlc29sdmVkIHRlbmFudC5cbiAgICovXG4gIGFzeW5jIF9yZXNvbHZlVGVuYW50KHtjaGFubmVsLCBwYXJhbXN9KSB7XG4gICAgY29uc3QgcmVxdWVzdFBhcmFtcyA9IHRoaXMudXBncmFkZVJlcXVlc3Q/LnBhcmFtcz8uKClcbiAgICBjb25zdCBtZXJnZWRQYXJhbXMgPSB7XG4gICAgICAuLi4ocmVxdWVzdFBhcmFtcyAmJiB0eXBlb2YgcmVxdWVzdFBhcmFtcyA9PT0gXCJvYmplY3RcIiA/IHJlcXVlc3RQYXJhbXMgOiB7fSksXG4gICAgICAuLi4ocGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgPyBwYXJhbXMgOiB7fSlcbiAgICB9XG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtQcm9taXNlPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+fSAqLyAodGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVUZW5hbnQoe1xuICAgICAgcGFyYW1zOiBtZXJnZWRQYXJhbXMsXG4gICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgcmVzcG9uc2U6IHVuZGVmaW5lZCxcbiAgICAgIHN1YnNjcmlwdGlvbjogY2hhbm5lbCA/IHtjaGFubmVsLCBwYXJhbXN9IDogdW5kZWZpbmVkXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1bm1hc2sgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIC0gTWFzay5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3VubWFza1BheWxvYWQocGF5bG9hZCwgbWFzaykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkrKykge1xuICAgICAgcGF5bG9hZFtpXSBePSBtYXNrW2kgJSA0XVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbk9wZW4gPSBoYW5kbGVyID8gaGFuZGxlci5vbk9wZW4gOiBudWxsXG5cbiAgICAgIGlmIChvbk9wZW4pIHtcbiAgICAgICAgYXdhaXQgb25PcGVuKHtzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtbWVzc2FnZS1oYW5kbGVyLW9wZW5cIlxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IG9wZW4gaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJ1biBtZXNzYWdlIGhhbmRsZXIgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIEluY29taW5nIHdlYnNvY2tldCBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3J1bk1lc3NhZ2VIYW5kbGVyTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbk1lc3NhZ2UgPSBoYW5kbGVyID8gaGFuZGxlci5vbk1lc3NhZ2UgOiBudWxsXG5cbiAgICAgIGlmIChvbk1lc3NhZ2UpIHtcbiAgICAgICAgYXdhaXQgb25NZXNzYWdlKHttZXNzYWdlLCBzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIGNvbnN0IG9uRXJyb3IgPSBoYW5kbGVyID8gaGFuZGxlci5vbkVycm9yIDogbnVsbFxuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtbWVzc2FnZS1oYW5kbGVyXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgIGlmICghb25FcnJvcikgcmV0dXJuXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9uRXJyb3Ioe2Vycm9yLCBzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH0gY2F0Y2ggKG9uRXJyb3JDYXVnaHRFcnJvcikge1xuICAgICAgICBjb25zdCBjbGllbnRFcnJvck1lc3NhZ2UgPSBvbkVycm9yQ2F1Z2h0RXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgID8gb25FcnJvckNhdWdodEVycm9yLm1lc3NhZ2VcbiAgICAgICAgICA6IFN0cmluZyhvbkVycm9yQ2F1Z2h0RXJyb3IpXG4gICAgICAgIGNvbnN0IG9uRXJyb3JFcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKG9uRXJyb3JDYXVnaHRFcnJvciwge1xuICAgICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1tZXNzYWdlLWhhbmRsZXItZXJyb3JcIlxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGVycm9yIGhhbmRsZXIgZmFpbGVkXCIsIG9uRXJyb3JFcnJvcl0pXG4gICAgICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgICAgIGVycm9yOiBjbGllbnRFcnJvck1lc3NhZ2UsXG4gICAgICAgICAgdHlwZTogXCJlcnJvclwiXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3J1bk1lc3NhZ2VIYW5kbGVyQ2xvc2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbkNsb3NlID0gaGFuZGxlciA/IGhhbmRsZXIub25DbG9zZSA6IG51bGxcblxuICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgYXdhaXQgb25DbG9zZSh7c2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LW1lc3NhZ2UtaGFuZGxlci1jbG9zZVwiXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgY2xvc2UgaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW90ZSBhZGRyZXNzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFJlbW90ZSBhZGRyZXNzIHJlc29sdmVkIGZyb20gdGhlIHdlYnNvY2tldCB1cGdyYWRlIHJlcXVlc3QuXG4gICAqL1xuICByZW1vdGVBZGRyZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnVwZ3JhZGVSZXF1ZXN0Py5yZW1vdGVBZGRyZXNzKCkgfHwgdGhpcy5jbGllbnQucmVtb3RlQWRkcmVzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IG1lc3NhZ2UgaGFuZGxlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLldlYnNvY2tldE1lc3NhZ2VIYW5kbGVyfSBoYW5kbGVyIC0gSGFuZGxlciBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRNZXNzYWdlSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IGhhbmRsZXJcbiAgICB2b2lkIHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpXG4gIH1cblxuICBhc3luYyBfcmVzb2x2ZU1lc3NhZ2VIYW5kbGVyUHJvbWlzZSgpIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlKSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlciB8IHZvaWR9ICovXG4gICAgbGV0IGhhbmRsZXJcblxuICAgIHRyeSB7XG4gICAgICBoYW5kbGVyID0gYXdhaXQgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2VcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtbWVzc2FnZS1oYW5kbGVyLXJlc29sdmVyXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgcmVzb2x2ZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICBhd2FpdCB0aGlzLl9maW5pc2hNZXNzYWdlSGFuZGxlclJlc29sdXRpb24oe3VzZUhhbmRsZXI6IGZhbHNlfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLl9maW5pc2hNZXNzYWdlSGFuZGxlclJlc29sdXRpb24oe3VzZUhhbmRsZXI6IGZhbHNlfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pbmJvdW5kQ2xvc2VkKSB7XG4gICAgICB0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlciA9IGZhbHNlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIGhhbmRsZXIgYW5kIGRyYWluIG9uT3BlbiBiZWZvcmUgcmVwbGF5aW5nIHF1ZXVlZFxuICAgIC8vIG1lc3NhZ2VzLiBzZXRNZXNzYWdlSGFuZGxlcigpIGZpcmVzIG9uT3BlbiBhcyBmaXJlLWFuZC1mb3JnZXQ7XG4gICAgLy8gYXdhaXRpbmcgX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpIGRpcmVjdGx5IGhlcmUgY2xvc2VzIHRoZVxuICAgIC8vIHJhY2Ugd2hlcmUgcXVldWVkIHN1YnNjcmliZS9jb25uZWN0aW9uLSogZnJhbWVzIHdvdWxkXG4gICAgLy8gZGlzcGF0Y2ggd2hpbGUgYW4gYXN5bmMgb25PcGVuIGlzIHN0aWxsIHNldHRpbmcgdXAgc2Vzc2lvblxuICAgIC8vIHN0YXRlLlxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyXG4gICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJPcGVuKClcbiAgICBhd2FpdCB0aGlzLl9maW5pc2hNZXNzYWdlSGFuZGxlclJlc29sdXRpb24oe1xuICAgICAgdXNlSGFuZGxlcjogdHlwZW9mIGhhbmRsZXIub25NZXNzYWdlID09PSBcImZ1bmN0aW9uXCJcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgcmVzb2x2ZXIgY29tcGxldGlvbiBpbnRvIHRoZSBGSUZPIGNoYWluIGJlZm9yZSBhbGxvd2luZyBuZXcgZGlzcGF0Y2guXG4gICAqIEBwYXJhbSB7e3VzZUhhbmRsZXI6IGJvb2xlYW59fSBhcmdzIC0gUmVzb2x2ZXIgcmVzdWx0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBxdWV1ZWQgbWVzc2FnZXMgZHJhaW4uXG4gICAqL1xuICBhc3luYyBfZmluaXNoTWVzc2FnZUhhbmRsZXJSZXNvbHV0aW9uKHt1c2VIYW5kbGVyfSkge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5fbWVzc2FnZUNoYWluXG4gICAgY29uc3QgZHJhaW4gPSBwcmV2aW91cy50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyID0gZmFsc2VcbiAgICAgIGlmICh0aGlzLl9pbmJvdW5kQ2xvc2VkKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW11cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuX2ZsdXNoUXVldWVkTWVzc2FnZXMoe3VzZUhhbmRsZXJ9KVxuICAgIH0pXG5cbiAgICB0aGlzLl9tZXNzYWdlQ2hhaW4gPSBkcmFpbi5jYXRjaCgoKSA9PiB7fSlcbiAgICBhd2FpdCBkcmFpblxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmx1c2ggcXVldWVkIG1lc3NhZ2VzLlxuICAgKiBAcGFyYW0ge3t1c2VIYW5kbGVyOiBib29sZWFufX0gYXJncyAtIEFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfZmx1c2hRdWV1ZWRNZXNzYWdlcyh7dXNlSGFuZGxlcn0pIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlUXVldWUubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHF1ZXVlZCA9IHRoaXMubWVzc2FnZVF1ZXVlXG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXVxuXG4gICAgZm9yIChjb25zdCB3b3JrIG9mIHF1ZXVlZCkge1xuICAgICAgaWYgKHRoaXMuX2luYm91bmRDbG9zZWQpIHtcbiAgICAgICAgdGhpcy5fcmVsZWFzZUluYm91bmRBZG1pc3Npb24od29yay5hZG1pc3Npb24pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh1c2VIYW5kbGVyICYmIHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2Uod29yay5tZXNzYWdlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3BhdGNoTWVzc2FnZSh3b3JrLm1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudEVycm9yTWVzc2FnZSA9IGNhdWdodEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHRFcnJvci5tZXNzYWdlIDogU3RyaW5nKGNhdWdodEVycm9yKVxuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LW1lc3NhZ2UtZGlzcGF0Y2hcIlxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICAgICAgZXJyb3I6IGNsaWVudEVycm9yTWVzc2FnZSxcbiAgICAgICAgICB0eXBlOiBcImVycm9yXCJcbiAgICAgICAgfSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuX3JlbGVhc2VJbmJvdW5kQWRtaXNzaW9uKHdvcmsuYWRtaXNzaW9uKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|